aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorGlenn Elliott <gelliott@cs.unc.edu>2012-03-04 19:47:13 -0500
committerGlenn Elliott <gelliott@cs.unc.edu>2012-03-04 19:47:13 -0500
commitc71c03bda1e86c9d5198c5d83f712e695c4f2a1e (patch)
treeecb166cb3e2b7e2adb3b5e292245fefd23381ac8 /drivers/gpu
parentea53c912f8a86a8567697115b6a0d8152beee5c8 (diff)
parent6a00f206debf8a5c8899055726ad127dbeeed098 (diff)
Merge branch 'mpi-master' into wip-k-fmlpwip-k-fmlp
Conflicts: litmus/sched_cedf.c
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/Makefile2
-rw-r--r--drivers/gpu/drm/Kconfig52
-rw-r--r--drivers/gpu/drm/Makefile5
-rw-r--r--drivers/gpu/drm/drm_agpsupport.c46
-rw-r--r--drivers/gpu/drm/drm_bufs.c17
-rw-r--r--drivers/gpu/drm/drm_context.c8
-rw-r--r--drivers/gpu/drm/drm_crtc.c126
-rw-r--r--drivers/gpu/drm/drm_crtc_helper.c58
-rw-r--r--drivers/gpu/drm/drm_debugfs.c1
-rw-r--r--drivers/gpu/drm/drm_drawable.c198
-rw-r--r--drivers/gpu/drm/drm_drv.c62
-rw-r--r--drivers/gpu/drm/drm_edid.c257
-rw-r--r--drivers/gpu/drm/drm_edid_modes.h4
-rw-r--r--drivers/gpu/drm/drm_fb_helper.c321
-rw-r--r--drivers/gpu/drm/drm_fops.c3
-rw-r--r--drivers/gpu/drm/drm_gem.c25
-rw-r--r--drivers/gpu/drm/drm_hashtab.c27
-rw-r--r--drivers/gpu/drm/drm_info.c50
-rw-r--r--drivers/gpu/drm/drm_ioc32.c9
-rw-r--r--drivers/gpu/drm/drm_ioctl.c137
-rw-r--r--drivers/gpu/drm/drm_irq.c644
-rw-r--r--drivers/gpu/drm/drm_lock.c30
-rw-r--r--drivers/gpu/drm/drm_memory.c14
-rw-r--r--drivers/gpu/drm/drm_mm.c600
-rw-r--r--drivers/gpu/drm/drm_modes.c164
-rw-r--r--drivers/gpu/drm/drm_pci.c206
-rw-r--r--drivers/gpu/drm/drm_platform.c75
-rw-r--r--drivers/gpu/drm/drm_proc.c14
-rw-r--r--drivers/gpu/drm/drm_scatter.c2
-rw-r--r--drivers/gpu/drm/drm_sman.c4
-rw-r--r--drivers/gpu/drm/drm_stub.c56
-rw-r--r--drivers/gpu/drm/drm_sysfs.c7
-rw-r--r--drivers/gpu/drm/drm_usb.c117
-rw-r--r--drivers/gpu/drm/drm_vm.c15
-rw-r--r--drivers/gpu/drm/i810/i810_dma.c19
-rw-r--r--drivers/gpu/drm/i810/i810_drv.c23
-rw-r--r--drivers/gpu/drm/i830/Makefile8
-rw-r--r--drivers/gpu/drm/i830/i830_dma.c1559
-rw-r--r--drivers/gpu/drm/i830/i830_drv.c108
-rw-r--r--drivers/gpu/drm/i830/i830_drv.h295
-rw-r--r--drivers/gpu/drm/i830/i830_irq.c186
-rw-r--r--drivers/gpu/drm/i915/Makefile6
-rw-r--r--drivers/gpu/drm/i915/dvo_ch7017.c68
-rw-r--r--drivers/gpu/drm/i915/dvo_ch7xxx.c10
-rw-r--r--drivers/gpu/drm/i915/dvo_ivch.c10
-rw-r--r--drivers/gpu/drm/i915/dvo_sil164.c10
-rw-r--r--drivers/gpu/drm/i915/dvo_tfp410.c10
-rw-r--r--drivers/gpu/drm/i915/i915_debugfs.c1000
-rw-r--r--drivers/gpu/drm/i915/i915_dma.c1238
-rw-r--r--drivers/gpu/drm/i915/i915_drv.c434
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h861
-rw-r--r--drivers/gpu/drm/i915/i915_gem.c4788
-rw-r--r--drivers/gpu/drm/i915/i915_gem_debug.c194
-rw-r--r--drivers/gpu/drm/i915/i915_gem_evict.c197
-rw-r--r--drivers/gpu/drm/i915/i915_gem_execbuffer.c1342
-rw-r--r--drivers/gpu/drm/i915/i915_gem_gtt.c122
-rw-r--r--drivers/gpu/drm/i915/i915_gem_tiling.c184
-rw-r--r--drivers/gpu/drm/i915/i915_irq.c1504
-rw-r--r--drivers/gpu/drm/i915/i915_reg.h1046
-rw-r--r--drivers/gpu/drm/i915/i915_suspend.c592
-rw-r--r--drivers/gpu/drm/i915/i915_trace.h328
-rw-r--r--drivers/gpu/drm/i915/intel_acpi.c252
-rw-r--r--drivers/gpu/drm/i915/intel_bios.c290
-rw-r--r--drivers/gpu/drm/i915/intel_bios.h6
-rw-r--r--drivers/gpu/drm/i915/intel_crt.c307
-rw-r--r--drivers/gpu/drm/i915/intel_display.c6805
-rw-r--r--drivers/gpu/drm/i915/intel_dp.c890
-rw-r--r--drivers/gpu/drm/i915/intel_drv.h211
-rw-r--r--drivers/gpu/drm/i915/intel_dvo.c71
-rw-r--r--drivers/gpu/drm/i915/intel_fb.c82
-rw-r--r--drivers/gpu/drm/i915/intel_hdmi.c225
-rw-r--r--drivers/gpu/drm/i915/intel_i2c.c503
-rw-r--r--drivers/gpu/drm/i915/intel_lvds.c555
-rw-r--r--drivers/gpu/drm/i915/intel_modes.c76
-rw-r--r--drivers/gpu/drm/i915/intel_opregion.c (renamed from drivers/gpu/drm/i915/i915_opregion.c)196
-rw-r--r--drivers/gpu/drm/i915/intel_overlay.c1066
-rw-r--r--drivers/gpu/drm/i915/intel_panel.c196
-rw-r--r--drivers/gpu/drm/i915/intel_ringbuffer.c1560
-rw-r--r--drivers/gpu/drm/i915/intel_ringbuffer.h236
-rw-r--r--drivers/gpu/drm/i915/intel_sdvo.c1193
-rw-r--r--drivers/gpu/drm/i915/intel_sdvo_regs.h2
-rw-r--r--drivers/gpu/drm/i915/intel_tv.c232
-rw-r--r--drivers/gpu/drm/mga/mga_dma.c4
-rw-r--r--drivers/gpu/drm/mga/mga_drv.c16
-rw-r--r--drivers/gpu/drm/mga/mga_drv.h19
-rw-r--r--drivers/gpu/drm/nouveau/Kconfig5
-rw-r--r--drivers/gpu/drm/nouveau/Makefile23
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_acpi.c120
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_backlight.c39
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_bios.c600
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_bios.h46
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_bo.c713
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_calc.c10
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_channel.c415
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_connector.c199
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_connector.h4
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_debugfs.c16
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_display.c272
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_dma.c65
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_dma.h15
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_dp.c18
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_drv.c134
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_drv.h864
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_encoder.h1
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_fb.h3
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_fbcon.c198
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_fbcon.h18
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_fence.c442
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_gem.c219
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_grctx.h12
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_hw.c62
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_hw.h19
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_i2c.c10
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_i2c.h6
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_irq.c1201
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_mem.c775
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_mm.c171
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_mm.h65
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_notifier.c78
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_object.c1308
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_perf.c296
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_pm.c557
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_pm.h74
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_ramht.c309
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_ramht.h55
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_reg.h98
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_sgdma.c502
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_state.c560
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_temp.c307
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_util.c78
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_util.h49
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_vm.c432
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_vm.h113
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_volt.c220
-rw-r--r--drivers/gpu/drm/nouveau/nv04_crtc.c94
-rw-r--r--drivers/gpu/drm/nouveau/nv04_dac.c23
-rw-r--r--drivers/gpu/drm/nouveau/nv04_dfp.c77
-rw-r--r--drivers/gpu/drm/nouveau/nv04_display.c21
-rw-r--r--drivers/gpu/drm/nouveau/nv04_fbcon.c103
-rw-r--r--drivers/gpu/drm/nouveau/nv04_fifo.c319
-rw-r--r--drivers/gpu/drm/nouveau/nv04_graph.c780
-rw-r--r--drivers/gpu/drm/nouveau/nv04_instmem.c185
-rw-r--r--drivers/gpu/drm/nouveau/nv04_pm.c90
-rw-r--r--drivers/gpu/drm/nouveau/nv04_tv.c10
-rw-r--r--drivers/gpu/drm/nouveau/nv10_fb.c124
-rw-r--r--drivers/gpu/drm/nouveau/nv10_fifo.c36
-rw-r--r--drivers/gpu/drm/nouveau/nv10_graph.c277
-rw-r--r--drivers/gpu/drm/nouveau/nv17_tv.c110
-rw-r--r--drivers/gpu/drm/nouveau/nv17_tv.h17
-rw-r--r--drivers/gpu/drm/nouveau/nv17_tv_modes.c50
-rw-r--r--drivers/gpu/drm/nouveau/nv20_graph.c1004
-rw-r--r--drivers/gpu/drm/nouveau/nv30_fb.c23
-rw-r--r--drivers/gpu/drm/nouveau/nv40_fb.c81
-rw-r--r--drivers/gpu/drm/nouveau/nv40_fifo.c38
-rw-r--r--drivers/gpu/drm/nouveau/nv40_graph.c401
-rw-r--r--drivers/gpu/drm/nouveau/nv40_grctx.c27
-rw-r--r--drivers/gpu/drm/nouveau/nv40_mc.c14
-rw-r--r--drivers/gpu/drm/nouveau/nv40_mpeg.c311
-rw-r--r--drivers/gpu/drm/nouveau/nv50_calc.c62
-rw-r--r--drivers/gpu/drm/nouveau/nv50_crtc.c258
-rw-r--r--drivers/gpu/drm/nouveau/nv50_cursor.c10
-rw-r--r--drivers/gpu/drm/nouveau/nv50_dac.c10
-rw-r--r--drivers/gpu/drm/nouveau/nv50_display.c635
-rw-r--r--drivers/gpu/drm/nouveau/nv50_display.h44
-rw-r--r--drivers/gpu/drm/nouveau/nv50_evo.c425
-rw-r--r--drivers/gpu/drm/nouveau/nv50_evo.h6
-rw-r--r--drivers/gpu/drm/nouveau/nv50_fb.c264
-rw-r--r--drivers/gpu/drm/nouveau/nv50_fbcon.c114
-rw-r--r--drivers/gpu/drm/nouveau/nv50_fifo.c330
-rw-r--r--drivers/gpu/drm/nouveau/nv50_gpio.c201
-rw-r--r--drivers/gpu/drm/nouveau/nv50_graph.c1068
-rw-r--r--drivers/gpu/drm/nouveau/nv50_grctx.c3309
-rw-r--r--drivers/gpu/drm/nouveau/nv50_instmem.c589
-rw-r--r--drivers/gpu/drm/nouveau/nv50_mpeg.c256
-rw-r--r--drivers/gpu/drm/nouveau/nv50_pm.c146
-rw-r--r--drivers/gpu/drm/nouveau/nv50_sor.c10
-rw-r--r--drivers/gpu/drm/nouveau/nv50_vm.c182
-rw-r--r--drivers/gpu/drm/nouveau/nv50_vram.c211
-rw-r--r--drivers/gpu/drm/nouveau/nv84_crypt.c193
-rw-r--r--drivers/gpu/drm/nouveau/nva3_copy.c226
-rw-r--r--drivers/gpu/drm/nouveau/nva3_copy.fuc870
-rw-r--r--drivers/gpu/drm/nouveau/nva3_copy.fuc.h534
-rw-r--r--drivers/gpu/drm/nouveau/nva3_pm.c204
-rw-r--r--drivers/gpu/drm/nouveau/nvc0_copy.c243
-rw-r--r--drivers/gpu/drm/nouveau/nvc0_copy.fuc.h527
-rw-r--r--drivers/gpu/drm/nouveau/nvc0_fbcon.c269
-rw-r--r--drivers/gpu/drm/nouveau/nvc0_fifo.c424
-rw-r--r--drivers/gpu/drm/nouveau/nvc0_graph.c755
-rw-r--r--drivers/gpu/drm/nouveau/nvc0_graph.h75
-rw-r--r--drivers/gpu/drm/nouveau/nvc0_grctx.c2874
-rw-r--r--drivers/gpu/drm/nouveau/nvc0_instmem.c322
-rw-r--r--drivers/gpu/drm/nouveau/nvc0_vm.c130
-rw-r--r--drivers/gpu/drm/nouveau/nvc0_vram.c113
-rw-r--r--drivers/gpu/drm/nouveau/nvreg.h6
-rw-r--r--drivers/gpu/drm/r128/r128_drv.c17
-rw-r--r--drivers/gpu/drm/radeon/Kconfig10
-rw-r--r--drivers/gpu/drm/radeon/Makefile10
-rw-r--r--drivers/gpu/drm/radeon/ObjectID.h48
-rw-r--r--drivers/gpu/drm/radeon/atom.c29
-rw-r--r--drivers/gpu/drm/radeon/atombios.h1040
-rw-r--r--drivers/gpu/drm/radeon/atombios_crtc.c636
-rw-r--r--drivers/gpu/drm/radeon/atombios_dp.c1046
-rw-r--r--drivers/gpu/drm/radeon/cayman_blit_shaders.c373
-rw-r--r--drivers/gpu/drm/radeon/cayman_blit_shaders.h35
-rw-r--r--drivers/gpu/drm/radeon/evergreen.c1723
-rw-r--r--drivers/gpu/drm/radeon/evergreen_blit_kms.c988
-rw-r--r--drivers/gpu/drm/radeon/evergreen_blit_shaders.c356
-rw-r--r--drivers/gpu/drm/radeon/evergreen_blit_shaders.h35
-rw-r--r--drivers/gpu/drm/radeon/evergreen_cs.c132
-rw-r--r--drivers/gpu/drm/radeon/evergreen_reg.h6
-rw-r--r--drivers/gpu/drm/radeon/evergreend.h114
-rw-r--r--drivers/gpu/drm/radeon/mkregtable.c5
-rw-r--r--drivers/gpu/drm/radeon/ni.c1594
-rw-r--r--drivers/gpu/drm/radeon/ni_reg.h86
-rw-r--r--drivers/gpu/drm/radeon/nid.h538
-rw-r--r--drivers/gpu/drm/radeon/r100.c287
-rw-r--r--drivers/gpu/drm/radeon/r100_track.h22
-rw-r--r--drivers/gpu/drm/radeon/r100d.h2
-rw-r--r--drivers/gpu/drm/radeon/r200.c20
-rw-r--r--drivers/gpu/drm/radeon/r300.c106
-rw-r--r--drivers/gpu/drm/radeon/r300_reg.h6
-rw-r--r--drivers/gpu/drm/radeon/r300d.h1
-rw-r--r--drivers/gpu/drm/radeon/r420.c22
-rw-r--r--drivers/gpu/drm/radeon/r500_reg.h4
-rw-r--r--drivers/gpu/drm/radeon/r520.c19
-rw-r--r--drivers/gpu/drm/radeon/r600.c685
-rw-r--r--drivers/gpu/drm/radeon/r600_audio.c1
-rw-r--r--drivers/gpu/drm/radeon/r600_blit.c11
-rw-r--r--drivers/gpu/drm/radeon/r600_blit_kms.c86
-rw-r--r--drivers/gpu/drm/radeon/r600_blit_shaders.c4
-rw-r--r--drivers/gpu/drm/radeon/r600_cp.c31
-rw-r--r--drivers/gpu/drm/radeon/r600_cs.c747
-rw-r--r--drivers/gpu/drm/radeon/r600_hdmi.c3
-rw-r--r--drivers/gpu/drm/radeon/r600_reg.h7
-rw-r--r--drivers/gpu/drm/radeon/r600d.h94
-rw-r--r--drivers/gpu/drm/radeon/radeon.h321
-rw-r--r--drivers/gpu/drm/radeon/radeon_asic.c244
-rw-r--r--drivers/gpu/drm/radeon/radeon_asic.h160
-rw-r--r--drivers/gpu/drm/radeon/radeon_atombios.c1571
-rw-r--r--drivers/gpu/drm/radeon/radeon_atpx_handler.c29
-rw-r--r--drivers/gpu/drm/radeon/radeon_benchmark.c4
-rw-r--r--drivers/gpu/drm/radeon/radeon_bios.c77
-rw-r--r--drivers/gpu/drm/radeon/radeon_clocks.c8
-rw-r--r--drivers/gpu/drm/radeon/radeon_combios.c234
-rw-r--r--drivers/gpu/drm/radeon/radeon_connectors.c797
-rw-r--r--drivers/gpu/drm/radeon/radeon_cp.c6
-rw-r--r--drivers/gpu/drm/radeon/radeon_cs.c22
-rw-r--r--drivers/gpu/drm/radeon/radeon_cursor.c23
-rw-r--r--drivers/gpu/drm/radeon/radeon_device.c158
-rw-r--r--drivers/gpu/drm/radeon/radeon_display.c909
-rw-r--r--drivers/gpu/drm/radeon/radeon_drv.c99
-rw-r--r--drivers/gpu/drm/radeon/radeon_drv.h3
-rw-r--r--drivers/gpu/drm/radeon/radeon_encoders.c915
-rw-r--r--drivers/gpu/drm/radeon/radeon_family.h7
-rw-r--r--drivers/gpu/drm/radeon/radeon_fb.c23
-rw-r--r--drivers/gpu/drm/radeon/radeon_fence.c58
-rw-r--r--drivers/gpu/drm/radeon/radeon_gart.c44
-rw-r--r--drivers/gpu/drm/radeon/radeon_gem.c103
-rw-r--r--drivers/gpu/drm/radeon/radeon_i2c.c61
-rw-r--r--drivers/gpu/drm/radeon/radeon_irq.c4
-rw-r--r--drivers/gpu/drm/radeon/radeon_irq_kms.c49
-rw-r--r--drivers/gpu/drm/radeon/radeon_kms.c108
-rw-r--r--drivers/gpu/drm/radeon/radeon_legacy_crtc.c64
-rw-r--r--drivers/gpu/drm/radeon/radeon_legacy_encoders.c259
-rw-r--r--drivers/gpu/drm/radeon/radeon_mode.h133
-rw-r--r--drivers/gpu/drm/radeon/radeon_object.c115
-rw-r--r--drivers/gpu/drm/radeon/radeon_object.h11
-rw-r--r--drivers/gpu/drm/radeon/radeon_pm.c179
-rw-r--r--drivers/gpu/drm/radeon/radeon_reg.h18
-rw-r--r--drivers/gpu/drm/radeon/radeon_ring.c24
-rw-r--r--drivers/gpu/drm/radeon/radeon_state.c2
-rw-r--r--drivers/gpu/drm/radeon/radeon_test.c4
-rw-r--r--drivers/gpu/drm/radeon/radeon_trace.h82
-rw-r--r--drivers/gpu/drm/radeon/radeon_trace_points.c9
-rw-r--r--drivers/gpu/drm/radeon/radeon_ttm.c63
-rw-r--r--drivers/gpu/drm/radeon/reg_srcs/cayman620
-rw-r--r--drivers/gpu/drm/radeon/reg_srcs/evergreen13
-rw-r--r--drivers/gpu/drm/radeon/reg_srcs/r3006
-rw-r--r--drivers/gpu/drm/radeon/reg_srcs/r4207
-rw-r--r--drivers/gpu/drm/radeon/reg_srcs/r6002
-rw-r--r--drivers/gpu/drm/radeon/reg_srcs/rs6006
-rw-r--r--drivers/gpu/drm/radeon/reg_srcs/rv51523
-rw-r--r--drivers/gpu/drm/radeon/rs400.c36
-rw-r--r--drivers/gpu/drm/radeon/rs600.c155
-rw-r--r--drivers/gpu/drm/radeon/rs690.c32
-rw-r--r--drivers/gpu/drm/radeon/rv515.c29
-rw-r--r--drivers/gpu/drm/radeon/rv770.c295
-rw-r--r--drivers/gpu/drm/radeon/rv770d.h55
-rw-r--r--drivers/gpu/drm/savage/savage_bci.c3
-rw-r--r--drivers/gpu/drm/savage/savage_drv.c17
-rw-r--r--drivers/gpu/drm/sis/sis_drv.c17
-rw-r--r--drivers/gpu/drm/tdfx/tdfx_drv.c16
-rw-r--r--drivers/gpu/drm/ttm/Makefile3
-rw-r--r--drivers/gpu/drm/ttm/ttm_agp_backend.c6
-rw-r--r--drivers/gpu/drm/ttm/ttm_bo.c550
-rw-r--r--drivers/gpu/drm/ttm/ttm_bo_manager.c157
-rw-r--r--drivers/gpu/drm/ttm/ttm_bo_util.c158
-rw-r--r--drivers/gpu/drm/ttm/ttm_bo_vm.c29
-rw-r--r--drivers/gpu/drm/ttm/ttm_execbuf_util.c169
-rw-r--r--drivers/gpu/drm/ttm/ttm_object.c2
-rw-r--r--drivers/gpu/drm/ttm/ttm_page_alloc.c12
-rw-r--r--drivers/gpu/drm/ttm/ttm_tt.c37
-rw-r--r--drivers/gpu/drm/via/via_dmablit.c4
-rw-r--r--drivers/gpu/drm/via/via_drv.c16
-rw-r--r--drivers/gpu/drm/vmwgfx/Makefile2
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c87
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_drv.c138
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_drv.h41
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c33
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_fb.c18
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c2
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_gmr.c38
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c137
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c3
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_kms.c207
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c33
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_overlay.c2
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_resource.c89
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c2
-rw-r--r--drivers/gpu/stub/Kconfig18
-rw-r--r--drivers/gpu/stub/Makefile1
-rw-r--r--drivers/gpu/stub/poulsbo.c64
-rw-r--r--drivers/gpu/vga/Kconfig2
-rw-r--r--drivers/gpu/vga/vga_switcheroo.c90
-rw-r--r--drivers/gpu/vga/vgaarb.c120
325 files changed, 60756 insertions, 27222 deletions
diff --git a/drivers/gpu/Makefile b/drivers/gpu/Makefile
index 30879df3daea..cc9277885dd0 100644
--- a/drivers/gpu/Makefile
+++ b/drivers/gpu/Makefile
@@ -1 +1 @@
obj-y += drm/ vga/ obj-y += drm/ vga/ stub/
diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig
index 4cab0c6397e3..b493663c7ba7 100644
--- a/drivers/gpu/drm/Kconfig
+++ b/drivers/gpu/drm/Kconfig
@@ -23,7 +23,8 @@ config DRM_KMS_HELPER
23 tristate 23 tristate
24 depends on DRM 24 depends on DRM
25 select FB 25 select FB
26 select FRAMEBUFFER_CONSOLE if !EMBEDDED 26 select FRAMEBUFFER_CONSOLE if !EXPERT
27 select FRAMEBUFFER_CONSOLE_DETECT_PRIMARY if FRAMEBUFFER_CONSOLE
27 help 28 help
28 FB and CRTC helpers for KMS drivers. 29 FB and CRTC helpers for KMS drivers.
29 30
@@ -73,49 +74,48 @@ source "drivers/gpu/drm/radeon/Kconfig"
73 74
74config DRM_I810 75config DRM_I810
75 tristate "Intel I810" 76 tristate "Intel I810"
76 depends on DRM && AGP && AGP_INTEL 77 # !PREEMPT because of missing ioctl locking
78 depends on DRM && AGP && AGP_INTEL && (!PREEMPT || BROKEN)
77 help 79 help
78 Choose this option if you have an Intel I810 graphics card. If M is 80 Choose this option if you have an Intel I810 graphics card. If M is
79 selected, the module will be called i810. AGP support is required 81 selected, the module will be called i810. AGP support is required
80 for this driver to work. 82 for this driver to work.
81 83
82choice
83 prompt "Intel 830M, 845G, 852GM, 855GM, 865G"
84 depends on DRM && AGP && AGP_INTEL
85 optional
86
87config DRM_I830
88 tristate "i830 driver"
89 help
90 Choose this option if you have a system that has Intel 830M, 845G,
91 852GM, 855GM or 865G integrated graphics. If M is selected, the
92 module will be called i830. AGP support is required for this driver
93 to work. This driver is used by the older X releases X.org 6.7 and
94 XFree86 4.3. If unsure, build this and i915 as modules and the X server
95 will load the correct one.
96
97config DRM_I915 84config DRM_I915
98 tristate "i915 driver" 85 tristate "Intel 8xx/9xx/G3x/G4x/HD Graphics"
86 depends on DRM
87 depends on AGP
99 depends on AGP_INTEL 88 depends on AGP_INTEL
89 # we need shmfs for the swappable backing store, and in particular
90 # the shmem_readpage() which depends upon tmpfs
100 select SHMEM 91 select SHMEM
92 select TMPFS
101 select DRM_KMS_HELPER 93 select DRM_KMS_HELPER
102 select FB_CFB_FILLRECT 94 select FB_CFB_FILLRECT
103 select FB_CFB_COPYAREA 95 select FB_CFB_COPYAREA
104 select FB_CFB_IMAGEBLIT 96 select FB_CFB_IMAGEBLIT
105 # i915 depends on ACPI_VIDEO when ACPI is enabled 97 # i915 depends on ACPI_VIDEO when ACPI is enabled
106 # but for select to work, need to select ACPI_VIDEO's dependencies, ick 98 # but for select to work, need to select ACPI_VIDEO's dependencies, ick
107 select VIDEO_OUTPUT_CONTROL if ACPI
108 select BACKLIGHT_CLASS_DEVICE if ACPI 99 select BACKLIGHT_CLASS_DEVICE if ACPI
100 select VIDEO_OUTPUT_CONTROL if ACPI
109 select INPUT if ACPI 101 select INPUT if ACPI
110 select ACPI_VIDEO if ACPI 102 select ACPI_VIDEO if ACPI
111 select ACPI_BUTTON if ACPI 103 select ACPI_BUTTON if ACPI
112 help 104 help
113 Choose this option if you have a system that has Intel 830M, 845G, 105 Choose this option if you have a system that has "Intel Graphics
114 852GM, 855GM 865G or 915G integrated graphics. If M is selected, the 106 Media Accelerator" or "HD Graphics" integrated graphics,
115 module will be called i915. AGP support is required for this driver 107 including 830M, 845G, 852GM, 855GM, 865G, 915G, 945G, 965G,
116 to work. This driver is used by the Intel driver in X.org 6.8 and 108 G35, G41, G43, G45 chipsets and Celeron, Pentium, Core i3,
117 XFree86 4.4 and above. If unsure, build this and i830 as modules and 109 Core i5, Core i7 as well as Atom CPUs with integrated graphics.
118 the X server will load the correct one. 110 If M is selected, the module will be called i915. AGP support
111 is required for this driver to work. This driver is used by
112 the Intel driver in X.org 6.8 and XFree86 4.4 and above. It
113 replaces the older i830 module that supported a subset of the
114 hardware in older X.org releases.
115
116 Note that the older i810/i815 chipsets require the use of the
117 i810 driver instead, and the Atom z5xx series has an entirely
118 different implementation.
119 119
120config DRM_I915_KMS 120config DRM_I915_KMS
121 bool "Enable modesetting on intel by default" 121 bool "Enable modesetting on intel by default"
@@ -127,8 +127,6 @@ config DRM_I915_KMS
127 the driver to bind to PCI devices, which precludes loading things 127 the driver to bind to PCI devices, which precludes loading things
128 like intelfb. 128 like intelfb.
129 129
130endchoice
131
132config DRM_MGA 130config DRM_MGA
133 tristate "Matrox g200/g400" 131 tristate "Matrox g200/g400"
134 depends on DRM && PCI 132 depends on DRM && PCI
diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile
index f3a23a329f4e..89cf05a72d1c 100644
--- a/drivers/gpu/drm/Makefile
+++ b/drivers/gpu/drm/Makefile
@@ -5,14 +5,14 @@
5ccflags-y := -Iinclude/drm 5ccflags-y := -Iinclude/drm
6 6
7drm-y := drm_auth.o drm_buffer.o drm_bufs.o drm_cache.o \ 7drm-y := drm_auth.o drm_buffer.o drm_bufs.o drm_cache.o \
8 drm_context.o drm_dma.o drm_drawable.o \ 8 drm_context.o drm_dma.o \
9 drm_drv.o drm_fops.o drm_gem.o drm_ioctl.o drm_irq.o \ 9 drm_drv.o drm_fops.o drm_gem.o drm_ioctl.o drm_irq.o \
10 drm_lock.o drm_memory.o drm_proc.o drm_stub.o drm_vm.o \ 10 drm_lock.o drm_memory.o drm_proc.o drm_stub.o drm_vm.o \
11 drm_agpsupport.o drm_scatter.o ati_pcigart.o drm_pci.o \ 11 drm_agpsupport.o drm_scatter.o ati_pcigart.o drm_pci.o \
12 drm_platform.o drm_sysfs.o drm_hashtab.o drm_sman.o drm_mm.o \ 12 drm_platform.o drm_sysfs.o drm_hashtab.o drm_sman.o drm_mm.o \
13 drm_crtc.o drm_modes.o drm_edid.o \ 13 drm_crtc.o drm_modes.o drm_edid.o \
14 drm_info.o drm_debugfs.o drm_encoder_slave.o \ 14 drm_info.o drm_debugfs.o drm_encoder_slave.o \
15 drm_trace_points.o drm_global.o 15 drm_trace_points.o drm_global.o drm_usb.o
16 16
17drm-$(CONFIG_COMPAT) += drm_ioc32.o 17drm-$(CONFIG_COMPAT) += drm_ioc32.o
18 18
@@ -29,7 +29,6 @@ obj-$(CONFIG_DRM_R128) += r128/
29obj-$(CONFIG_DRM_RADEON)+= radeon/ 29obj-$(CONFIG_DRM_RADEON)+= radeon/
30obj-$(CONFIG_DRM_MGA) += mga/ 30obj-$(CONFIG_DRM_MGA) += mga/
31obj-$(CONFIG_DRM_I810) += i810/ 31obj-$(CONFIG_DRM_I810) += i810/
32obj-$(CONFIG_DRM_I830) += i830/
33obj-$(CONFIG_DRM_I915) += i915/ 32obj-$(CONFIG_DRM_I915) += i915/
34obj-$(CONFIG_DRM_SIS) += sis/ 33obj-$(CONFIG_DRM_SIS) += sis/
35obj-$(CONFIG_DRM_SAVAGE)+= savage/ 34obj-$(CONFIG_DRM_SAVAGE)+= savage/
diff --git a/drivers/gpu/drm/drm_agpsupport.c b/drivers/gpu/drm/drm_agpsupport.c
index ba38e0147220..0cb2ba50af53 100644
--- a/drivers/gpu/drm/drm_agpsupport.c
+++ b/drivers/gpu/drm/drm_agpsupport.c
@@ -193,7 +193,7 @@ int drm_agp_enable_ioctl(struct drm_device *dev, void *data,
193 * \return zero on success or a negative number on failure. 193 * \return zero on success or a negative number on failure.
194 * 194 *
195 * Verifies the AGP device is present and has been acquired, allocates the 195 * Verifies the AGP device is present and has been acquired, allocates the
196 * memory via alloc_agp() and creates a drm_agp_mem entry for it. 196 * memory via agp_allocate_memory() and creates a drm_agp_mem entry for it.
197 */ 197 */
198int drm_agp_alloc(struct drm_device *dev, struct drm_agp_buffer *request) 198int drm_agp_alloc(struct drm_device *dev, struct drm_agp_buffer *request)
199{ 199{
@@ -211,7 +211,7 @@ int drm_agp_alloc(struct drm_device *dev, struct drm_agp_buffer *request)
211 211
212 pages = (request->size + PAGE_SIZE - 1) / PAGE_SIZE; 212 pages = (request->size + PAGE_SIZE - 1) / PAGE_SIZE;
213 type = (u32) request->type; 213 type = (u32) request->type;
214 if (!(memory = drm_alloc_agp(dev, pages, type))) { 214 if (!(memory = agp_allocate_memory(dev->agp->bridge, pages, type))) {
215 kfree(entry); 215 kfree(entry);
216 return -ENOMEM; 216 return -ENOMEM;
217 } 217 }
@@ -423,38 +423,6 @@ struct drm_agp_head *drm_agp_init(struct drm_device *dev)
423 return head; 423 return head;
424} 424}
425 425
426/** Calls agp_allocate_memory() */
427DRM_AGP_MEM *drm_agp_allocate_memory(struct agp_bridge_data * bridge,
428 size_t pages, u32 type)
429{
430 return agp_allocate_memory(bridge, pages, type);
431}
432
433/** Calls agp_free_memory() */
434int drm_agp_free_memory(DRM_AGP_MEM * handle)
435{
436 if (!handle)
437 return 0;
438 agp_free_memory(handle);
439 return 1;
440}
441
442/** Calls agp_bind_memory() */
443int drm_agp_bind_memory(DRM_AGP_MEM * handle, off_t start)
444{
445 if (!handle)
446 return -EINVAL;
447 return agp_bind_memory(handle, start);
448}
449
450/** Calls agp_unbind_memory() */
451int drm_agp_unbind_memory(DRM_AGP_MEM * handle)
452{
453 if (!handle)
454 return -EINVAL;
455 return agp_unbind_memory(handle);
456}
457
458/** 426/**
459 * Binds a collection of pages into AGP memory at the given offset, returning 427 * Binds a collection of pages into AGP memory at the given offset, returning
460 * the AGP memory structure containing them. 428 * the AGP memory structure containing them.
@@ -474,7 +442,7 @@ drm_agp_bind_pages(struct drm_device *dev,
474 442
475 DRM_DEBUG("\n"); 443 DRM_DEBUG("\n");
476 444
477 mem = drm_agp_allocate_memory(dev->agp->bridge, num_pages, 445 mem = agp_allocate_memory(dev->agp->bridge, num_pages,
478 type); 446 type);
479 if (mem == NULL) { 447 if (mem == NULL) {
480 DRM_ERROR("Failed to allocate memory for %ld pages\n", 448 DRM_ERROR("Failed to allocate memory for %ld pages\n",
@@ -487,7 +455,7 @@ drm_agp_bind_pages(struct drm_device *dev,
487 mem->page_count = num_pages; 455 mem->page_count = num_pages;
488 456
489 mem->is_flushed = true; 457 mem->is_flushed = true;
490 ret = drm_agp_bind_memory(mem, gtt_offset / PAGE_SIZE); 458 ret = agp_bind_memory(mem, gtt_offset / PAGE_SIZE);
491 if (ret != 0) { 459 if (ret != 0) {
492 DRM_ERROR("Failed to bind AGP memory: %d\n", ret); 460 DRM_ERROR("Failed to bind AGP memory: %d\n", ret);
493 agp_free_memory(mem); 461 agp_free_memory(mem);
@@ -498,10 +466,4 @@ drm_agp_bind_pages(struct drm_device *dev,
498} 466}
499EXPORT_SYMBOL(drm_agp_bind_pages); 467EXPORT_SYMBOL(drm_agp_bind_pages);
500 468
501void drm_agp_chipset_flush(struct drm_device *dev)
502{
503 agp_flush_chipset(dev->agp->bridge);
504}
505EXPORT_SYMBOL(drm_agp_chipset_flush);
506
507#endif /* __OS_HAS_AGP */ 469#endif /* __OS_HAS_AGP */
diff --git a/drivers/gpu/drm/drm_bufs.c b/drivers/gpu/drm/drm_bufs.c
index 3e257a50bf56..61e1ef90d4e5 100644
--- a/drivers/gpu/drm/drm_bufs.c
+++ b/drivers/gpu/drm/drm_bufs.c
@@ -46,10 +46,11 @@ static struct drm_map_list *drm_find_matching_map(struct drm_device *dev,
46 list_for_each_entry(entry, &dev->maplist, head) { 46 list_for_each_entry(entry, &dev->maplist, head) {
47 /* 47 /*
48 * Because the kernel-userspace ABI is fixed at a 32-bit offset 48 * Because the kernel-userspace ABI is fixed at a 32-bit offset
49 * while PCI resources may live above that, we ignore the map 49 * while PCI resources may live above that, we only compare the
50 * offset for maps of type _DRM_FRAMEBUFFER or _DRM_REGISTERS. 50 * lower 32 bits of the map offset for maps of type
51 * It is assumed that each driver will have only one resource of 51 * _DRM_FRAMEBUFFER or _DRM_REGISTERS.
52 * each type. 52 * It is assumed that if a driver have more than one resource
53 * of each type, the lower 32 bits are different.
53 */ 54 */
54 if (!entry->map || 55 if (!entry->map ||
55 map->type != entry->map->type || 56 map->type != entry->map->type ||
@@ -59,9 +60,12 @@ static struct drm_map_list *drm_find_matching_map(struct drm_device *dev,
59 case _DRM_SHM: 60 case _DRM_SHM:
60 if (map->flags != _DRM_CONTAINS_LOCK) 61 if (map->flags != _DRM_CONTAINS_LOCK)
61 break; 62 break;
63 return entry;
62 case _DRM_REGISTERS: 64 case _DRM_REGISTERS:
63 case _DRM_FRAME_BUFFER: 65 case _DRM_FRAME_BUFFER:
64 return entry; 66 if ((entry->map->offset & 0xffffffff) ==
67 (map->offset & 0xffffffff))
68 return entry;
65 default: /* Make gcc happy */ 69 default: /* Make gcc happy */
66 ; 70 ;
67 } 71 }
@@ -183,9 +187,6 @@ static int drm_addmap_core(struct drm_device * dev, resource_size_t offset,
183 return -EINVAL; 187 return -EINVAL;
184 } 188 }
185#endif 189#endif
186#ifdef __alpha__
187 map->offset += dev->hose->mem_space->start;
188#endif
189 /* Some drivers preinitialize some maps, without the X Server 190 /* Some drivers preinitialize some maps, without the X Server
190 * needing to be aware of it. Therefore, we just return success 191 * needing to be aware of it. Therefore, we just return success
191 * when the server tries to create a duplicate map. 192 * when the server tries to create a duplicate map.
diff --git a/drivers/gpu/drm/drm_context.c b/drivers/gpu/drm/drm_context.c
index 2607753a320b..6d440fb894cf 100644
--- a/drivers/gpu/drm/drm_context.c
+++ b/drivers/gpu/drm/drm_context.c
@@ -333,14 +333,6 @@ int drm_addctx(struct drm_device *dev, void *data,
333 return -ENOMEM; 333 return -ENOMEM;
334 } 334 }
335 335
336 if (ctx->handle != DRM_KERNEL_CONTEXT) {
337 if (dev->driver->context_ctor)
338 if (!dev->driver->context_ctor(dev, ctx->handle)) {
339 DRM_DEBUG("Running out of ctxs or memory.\n");
340 return -ENOMEM;
341 }
342 }
343
344 ctx_entry = kmalloc(sizeof(*ctx_entry), GFP_KERNEL); 336 ctx_entry = kmalloc(sizeof(*ctx_entry), GFP_KERNEL);
345 if (!ctx_entry) { 337 if (!ctx_entry) {
346 DRM_DEBUG("out of memory\n"); 338 DRM_DEBUG("out of memory\n");
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
index 37e0b4fa482a..82db18506662 100644
--- a/drivers/gpu/drm/drm_crtc.c
+++ b/drivers/gpu/drm/drm_crtc.c
@@ -156,12 +156,12 @@ static struct drm_conn_prop_enum_list drm_connector_enum_list[] =
156 { DRM_MODE_CONNECTOR_SVIDEO, "SVIDEO", 0 }, 156 { DRM_MODE_CONNECTOR_SVIDEO, "SVIDEO", 0 },
157 { DRM_MODE_CONNECTOR_LVDS, "LVDS", 0 }, 157 { DRM_MODE_CONNECTOR_LVDS, "LVDS", 0 },
158 { DRM_MODE_CONNECTOR_Component, "Component", 0 }, 158 { DRM_MODE_CONNECTOR_Component, "Component", 0 },
159 { DRM_MODE_CONNECTOR_9PinDIN, "9-pin DIN", 0 }, 159 { DRM_MODE_CONNECTOR_9PinDIN, "DIN", 0 },
160 { DRM_MODE_CONNECTOR_DisplayPort, "DisplayPort", 0 }, 160 { DRM_MODE_CONNECTOR_DisplayPort, "DP", 0 },
161 { DRM_MODE_CONNECTOR_HDMIA, "HDMI Type A", 0 }, 161 { DRM_MODE_CONNECTOR_HDMIA, "HDMI-A", 0 },
162 { DRM_MODE_CONNECTOR_HDMIB, "HDMI Type B", 0 }, 162 { DRM_MODE_CONNECTOR_HDMIB, "HDMI-B", 0 },
163 { DRM_MODE_CONNECTOR_TV, "TV", 0 }, 163 { DRM_MODE_CONNECTOR_TV, "TV", 0 },
164 { DRM_MODE_CONNECTOR_eDP, "Embedded DisplayPort", 0 }, 164 { DRM_MODE_CONNECTOR_eDP, "eDP", 0 },
165}; 165};
166 166
167static struct drm_prop_enum_list drm_encoder_enum_list[] = 167static struct drm_prop_enum_list drm_encoder_enum_list[] =
@@ -886,9 +886,6 @@ int drm_mode_group_init(struct drm_device *dev, struct drm_mode_group *group)
886 total_objects += dev->mode_config.num_connector; 886 total_objects += dev->mode_config.num_connector;
887 total_objects += dev->mode_config.num_encoder; 887 total_objects += dev->mode_config.num_encoder;
888 888
889 if (total_objects == 0)
890 return -EINVAL;
891
892 group->id_list = kzalloc(total_objects * sizeof(uint32_t), GFP_KERNEL); 889 group->id_list = kzalloc(total_objects * sizeof(uint32_t), GFP_KERNEL);
893 if (!group->id_list) 890 if (!group->id_list)
894 return -ENOMEM; 891 return -ENOMEM;
@@ -1073,6 +1070,9 @@ int drm_mode_getresources(struct drm_device *dev, void *data,
1073 uint32_t __user *encoder_id; 1070 uint32_t __user *encoder_id;
1074 struct drm_mode_group *mode_group; 1071 struct drm_mode_group *mode_group;
1075 1072
1073 if (!drm_core_check_feature(dev, DRIVER_MODESET))
1074 return -EINVAL;
1075
1076 mutex_lock(&dev->mode_config.mutex); 1076 mutex_lock(&dev->mode_config.mutex);
1077 1077
1078 /* 1078 /*
@@ -1110,7 +1110,7 @@ int drm_mode_getresources(struct drm_device *dev, void *data,
1110 if (card_res->count_fbs >= fb_count) { 1110 if (card_res->count_fbs >= fb_count) {
1111 copied = 0; 1111 copied = 0;
1112 fb_id = (uint32_t __user *)(unsigned long)card_res->fb_id_ptr; 1112 fb_id = (uint32_t __user *)(unsigned long)card_res->fb_id_ptr;
1113 list_for_each_entry(fb, &file_priv->fbs, head) { 1113 list_for_each_entry(fb, &file_priv->fbs, filp_head) {
1114 if (put_user(fb->base.id, fb_id + copied)) { 1114 if (put_user(fb->base.id, fb_id + copied)) {
1115 ret = -EFAULT; 1115 ret = -EFAULT;
1116 goto out; 1116 goto out;
@@ -1244,6 +1244,9 @@ int drm_mode_getcrtc(struct drm_device *dev,
1244 struct drm_mode_object *obj; 1244 struct drm_mode_object *obj;
1245 int ret = 0; 1245 int ret = 0;
1246 1246
1247 if (!drm_core_check_feature(dev, DRIVER_MODESET))
1248 return -EINVAL;
1249
1247 mutex_lock(&dev->mode_config.mutex); 1250 mutex_lock(&dev->mode_config.mutex);
1248 1251
1249 obj = drm_mode_object_find(dev, crtc_resp->crtc_id, 1252 obj = drm_mode_object_find(dev, crtc_resp->crtc_id,
@@ -1312,6 +1315,9 @@ int drm_mode_getconnector(struct drm_device *dev, void *data,
1312 uint64_t __user *prop_values; 1315 uint64_t __user *prop_values;
1313 uint32_t __user *encoder_ptr; 1316 uint32_t __user *encoder_ptr;
1314 1317
1318 if (!drm_core_check_feature(dev, DRIVER_MODESET))
1319 return -EINVAL;
1320
1315 memset(&u_mode, 0, sizeof(struct drm_mode_modeinfo)); 1321 memset(&u_mode, 0, sizeof(struct drm_mode_modeinfo));
1316 1322
1317 DRM_DEBUG_KMS("[CONNECTOR:%d:?]\n", out_resp->connector_id); 1323 DRM_DEBUG_KMS("[CONNECTOR:%d:?]\n", out_resp->connector_id);
@@ -1431,6 +1437,9 @@ int drm_mode_getencoder(struct drm_device *dev, void *data,
1431 struct drm_encoder *encoder; 1437 struct drm_encoder *encoder;
1432 int ret = 0; 1438 int ret = 0;
1433 1439
1440 if (!drm_core_check_feature(dev, DRIVER_MODESET))
1441 return -EINVAL;
1442
1434 mutex_lock(&dev->mode_config.mutex); 1443 mutex_lock(&dev->mode_config.mutex);
1435 obj = drm_mode_object_find(dev, enc_resp->encoder_id, 1444 obj = drm_mode_object_find(dev, enc_resp->encoder_id,
1436 DRM_MODE_OBJECT_ENCODER); 1445 DRM_MODE_OBJECT_ENCODER);
@@ -1486,6 +1495,9 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data,
1486 int ret = 0; 1495 int ret = 0;
1487 int i; 1496 int i;
1488 1497
1498 if (!drm_core_check_feature(dev, DRIVER_MODESET))
1499 return -EINVAL;
1500
1489 mutex_lock(&dev->mode_config.mutex); 1501 mutex_lock(&dev->mode_config.mutex);
1490 obj = drm_mode_object_find(dev, crtc_req->crtc_id, 1502 obj = drm_mode_object_find(dev, crtc_req->crtc_id,
1491 DRM_MODE_OBJECT_CRTC); 1503 DRM_MODE_OBJECT_CRTC);
@@ -1603,6 +1615,9 @@ int drm_mode_cursor_ioctl(struct drm_device *dev,
1603 struct drm_crtc *crtc; 1615 struct drm_crtc *crtc;
1604 int ret = 0; 1616 int ret = 0;
1605 1617
1618 if (!drm_core_check_feature(dev, DRIVER_MODESET))
1619 return -EINVAL;
1620
1606 if (!req->flags) { 1621 if (!req->flags) {
1607 DRM_ERROR("no operation set\n"); 1622 DRM_ERROR("no operation set\n");
1608 return -EINVAL; 1623 return -EINVAL;
@@ -1667,6 +1682,9 @@ int drm_mode_addfb(struct drm_device *dev,
1667 struct drm_framebuffer *fb; 1682 struct drm_framebuffer *fb;
1668 int ret = 0; 1683 int ret = 0;
1669 1684
1685 if (!drm_core_check_feature(dev, DRIVER_MODESET))
1686 return -EINVAL;
1687
1670 if ((config->min_width > r->width) || (r->width > config->max_width)) { 1688 if ((config->min_width > r->width) || (r->width > config->max_width)) {
1671 DRM_ERROR("mode new framebuffer width not within limits\n"); 1689 DRM_ERROR("mode new framebuffer width not within limits\n");
1672 return -EINVAL; 1690 return -EINVAL;
@@ -1678,7 +1696,7 @@ int drm_mode_addfb(struct drm_device *dev,
1678 1696
1679 mutex_lock(&dev->mode_config.mutex); 1697 mutex_lock(&dev->mode_config.mutex);
1680 1698
1681 /* TODO check buffer is sufficently large */ 1699 /* TODO check buffer is sufficiently large */
1682 /* TODO setup destructor callback */ 1700 /* TODO setup destructor callback */
1683 1701
1684 fb = dev->mode_config.funcs->fb_create(dev, file_priv, r); 1702 fb = dev->mode_config.funcs->fb_create(dev, file_priv, r);
@@ -1724,9 +1742,12 @@ int drm_mode_rmfb(struct drm_device *dev,
1724 int ret = 0; 1742 int ret = 0;
1725 int found = 0; 1743 int found = 0;
1726 1744
1745 if (!drm_core_check_feature(dev, DRIVER_MODESET))
1746 return -EINVAL;
1747
1727 mutex_lock(&dev->mode_config.mutex); 1748 mutex_lock(&dev->mode_config.mutex);
1728 obj = drm_mode_object_find(dev, *id, DRM_MODE_OBJECT_FB); 1749 obj = drm_mode_object_find(dev, *id, DRM_MODE_OBJECT_FB);
1729 /* TODO check that we realy get a framebuffer back. */ 1750 /* TODO check that we really get a framebuffer back. */
1730 if (!obj) { 1751 if (!obj) {
1731 DRM_ERROR("mode invalid framebuffer id\n"); 1752 DRM_ERROR("mode invalid framebuffer id\n");
1732 ret = -EINVAL; 1753 ret = -EINVAL;
@@ -1780,6 +1801,9 @@ int drm_mode_getfb(struct drm_device *dev,
1780 struct drm_framebuffer *fb; 1801 struct drm_framebuffer *fb;
1781 int ret = 0; 1802 int ret = 0;
1782 1803
1804 if (!drm_core_check_feature(dev, DRIVER_MODESET))
1805 return -EINVAL;
1806
1783 mutex_lock(&dev->mode_config.mutex); 1807 mutex_lock(&dev->mode_config.mutex);
1784 obj = drm_mode_object_find(dev, r->fb_id, DRM_MODE_OBJECT_FB); 1808 obj = drm_mode_object_find(dev, r->fb_id, DRM_MODE_OBJECT_FB);
1785 if (!obj) { 1809 if (!obj) {
@@ -1813,6 +1837,9 @@ int drm_mode_dirtyfb_ioctl(struct drm_device *dev,
1813 int num_clips; 1837 int num_clips;
1814 int ret = 0; 1838 int ret = 0;
1815 1839
1840 if (!drm_core_check_feature(dev, DRIVER_MODESET))
1841 return -EINVAL;
1842
1816 mutex_lock(&dev->mode_config.mutex); 1843 mutex_lock(&dev->mode_config.mutex);
1817 obj = drm_mode_object_find(dev, r->fb_id, DRM_MODE_OBJECT_FB); 1844 obj = drm_mode_object_find(dev, r->fb_id, DRM_MODE_OBJECT_FB);
1818 if (!obj) { 1845 if (!obj) {
@@ -1854,7 +1881,8 @@ int drm_mode_dirtyfb_ioctl(struct drm_device *dev,
1854 } 1881 }
1855 1882
1856 if (fb->funcs->dirty) { 1883 if (fb->funcs->dirty) {
1857 ret = fb->funcs->dirty(fb, flags, r->color, clips, num_clips); 1884 ret = fb->funcs->dirty(fb, file_priv, flags, r->color,
1885 clips, num_clips);
1858 } else { 1886 } else {
1859 ret = -ENOSYS; 1887 ret = -ENOSYS;
1860 goto out_err2; 1888 goto out_err2;
@@ -1995,6 +2023,9 @@ int drm_mode_attachmode_ioctl(struct drm_device *dev,
1995 struct drm_mode_modeinfo *umode = &mode_cmd->mode; 2023 struct drm_mode_modeinfo *umode = &mode_cmd->mode;
1996 int ret = 0; 2024 int ret = 0;
1997 2025
2026 if (!drm_core_check_feature(dev, DRIVER_MODESET))
2027 return -EINVAL;
2028
1998 mutex_lock(&dev->mode_config.mutex); 2029 mutex_lock(&dev->mode_config.mutex);
1999 2030
2000 obj = drm_mode_object_find(dev, mode_cmd->connector_id, DRM_MODE_OBJECT_CONNECTOR); 2031 obj = drm_mode_object_find(dev, mode_cmd->connector_id, DRM_MODE_OBJECT_CONNECTOR);
@@ -2041,6 +2072,9 @@ int drm_mode_detachmode_ioctl(struct drm_device *dev,
2041 struct drm_mode_modeinfo *umode = &mode_cmd->mode; 2072 struct drm_mode_modeinfo *umode = &mode_cmd->mode;
2042 int ret = 0; 2073 int ret = 0;
2043 2074
2075 if (!drm_core_check_feature(dev, DRIVER_MODESET))
2076 return -EINVAL;
2077
2044 mutex_lock(&dev->mode_config.mutex); 2078 mutex_lock(&dev->mode_config.mutex);
2045 2079
2046 obj = drm_mode_object_find(dev, mode_cmd->connector_id, DRM_MODE_OBJECT_CONNECTOR); 2080 obj = drm_mode_object_find(dev, mode_cmd->connector_id, DRM_MODE_OBJECT_CONNECTOR);
@@ -2210,6 +2244,9 @@ int drm_mode_getproperty_ioctl(struct drm_device *dev,
2210 uint64_t __user *values_ptr; 2244 uint64_t __user *values_ptr;
2211 uint32_t __user *blob_length_ptr; 2245 uint32_t __user *blob_length_ptr;
2212 2246
2247 if (!drm_core_check_feature(dev, DRIVER_MODESET))
2248 return -EINVAL;
2249
2213 mutex_lock(&dev->mode_config.mutex); 2250 mutex_lock(&dev->mode_config.mutex);
2214 obj = drm_mode_object_find(dev, out_resp->prop_id, DRM_MODE_OBJECT_PROPERTY); 2251 obj = drm_mode_object_find(dev, out_resp->prop_id, DRM_MODE_OBJECT_PROPERTY);
2215 if (!obj) { 2252 if (!obj) {
@@ -2332,6 +2369,9 @@ int drm_mode_getblob_ioctl(struct drm_device *dev,
2332 int ret = 0; 2369 int ret = 0;
2333 void *blob_ptr; 2370 void *blob_ptr;
2334 2371
2372 if (!drm_core_check_feature(dev, DRIVER_MODESET))
2373 return -EINVAL;
2374
2335 mutex_lock(&dev->mode_config.mutex); 2375 mutex_lock(&dev->mode_config.mutex);
2336 obj = drm_mode_object_find(dev, out_resp->blob_id, DRM_MODE_OBJECT_BLOB); 2376 obj = drm_mode_object_find(dev, out_resp->blob_id, DRM_MODE_OBJECT_BLOB);
2337 if (!obj) { 2377 if (!obj) {
@@ -2392,6 +2432,9 @@ int drm_mode_connector_property_set_ioctl(struct drm_device *dev,
2392 int ret = -EINVAL; 2432 int ret = -EINVAL;
2393 int i; 2433 int i;
2394 2434
2435 if (!drm_core_check_feature(dev, DRIVER_MODESET))
2436 return -EINVAL;
2437
2395 mutex_lock(&dev->mode_config.mutex); 2438 mutex_lock(&dev->mode_config.mutex);
2396 2439
2397 obj = drm_mode_object_find(dev, out_resp->connector_id, DRM_MODE_OBJECT_CONNECTOR); 2440 obj = drm_mode_object_find(dev, out_resp->connector_id, DRM_MODE_OBJECT_CONNECTOR);
@@ -2508,6 +2551,9 @@ int drm_mode_gamma_set_ioctl(struct drm_device *dev,
2508 int size; 2551 int size;
2509 int ret = 0; 2552 int ret = 0;
2510 2553
2554 if (!drm_core_check_feature(dev, DRIVER_MODESET))
2555 return -EINVAL;
2556
2511 mutex_lock(&dev->mode_config.mutex); 2557 mutex_lock(&dev->mode_config.mutex);
2512 obj = drm_mode_object_find(dev, crtc_lut->crtc_id, DRM_MODE_OBJECT_CRTC); 2558 obj = drm_mode_object_find(dev, crtc_lut->crtc_id, DRM_MODE_OBJECT_CRTC);
2513 if (!obj) { 2559 if (!obj) {
@@ -2559,6 +2605,9 @@ int drm_mode_gamma_get_ioctl(struct drm_device *dev,
2559 int size; 2605 int size;
2560 int ret = 0; 2606 int ret = 0;
2561 2607
2608 if (!drm_core_check_feature(dev, DRIVER_MODESET))
2609 return -EINVAL;
2610
2562 mutex_lock(&dev->mode_config.mutex); 2611 mutex_lock(&dev->mode_config.mutex);
2563 obj = drm_mode_object_find(dev, crtc_lut->crtc_id, DRM_MODE_OBJECT_CRTC); 2612 obj = drm_mode_object_find(dev, crtc_lut->crtc_id, DRM_MODE_OBJECT_CRTC);
2564 if (!obj) { 2613 if (!obj) {
@@ -2673,3 +2722,56 @@ out:
2673 mutex_unlock(&dev->mode_config.mutex); 2722 mutex_unlock(&dev->mode_config.mutex);
2674 return ret; 2723 return ret;
2675} 2724}
2725
2726void drm_mode_config_reset(struct drm_device *dev)
2727{
2728 struct drm_crtc *crtc;
2729 struct drm_encoder *encoder;
2730 struct drm_connector *connector;
2731
2732 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head)
2733 if (crtc->funcs->reset)
2734 crtc->funcs->reset(crtc);
2735
2736 list_for_each_entry(encoder, &dev->mode_config.encoder_list, head)
2737 if (encoder->funcs->reset)
2738 encoder->funcs->reset(encoder);
2739
2740 list_for_each_entry(connector, &dev->mode_config.connector_list, head)
2741 if (connector->funcs->reset)
2742 connector->funcs->reset(connector);
2743}
2744EXPORT_SYMBOL(drm_mode_config_reset);
2745
2746int drm_mode_create_dumb_ioctl(struct drm_device *dev,
2747 void *data, struct drm_file *file_priv)
2748{
2749 struct drm_mode_create_dumb *args = data;
2750
2751 if (!dev->driver->dumb_create)
2752 return -ENOSYS;
2753 return dev->driver->dumb_create(file_priv, dev, args);
2754}
2755
2756int drm_mode_mmap_dumb_ioctl(struct drm_device *dev,
2757 void *data, struct drm_file *file_priv)
2758{
2759 struct drm_mode_map_dumb *args = data;
2760
2761 /* call driver ioctl to get mmap offset */
2762 if (!dev->driver->dumb_map_offset)
2763 return -ENOSYS;
2764
2765 return dev->driver->dumb_map_offset(file_priv, dev, args->handle, &args->offset);
2766}
2767
2768int drm_mode_destroy_dumb_ioctl(struct drm_device *dev,
2769 void *data, struct drm_file *file_priv)
2770{
2771 struct drm_mode_destroy_dumb *args = data;
2772
2773 if (!dev->driver->dumb_destroy)
2774 return -ENOSYS;
2775
2776 return dev->driver->dumb_destroy(file_priv, dev, args->handle);
2777}
diff --git a/drivers/gpu/drm/drm_crtc_helper.c b/drivers/gpu/drm/drm_crtc_helper.c
index dcbeb98f195a..92369655dca3 100644
--- a/drivers/gpu/drm/drm_crtc_helper.c
+++ b/drivers/gpu/drm/drm_crtc_helper.c
@@ -276,7 +276,7 @@ static bool drm_encoder_crtc_ok(struct drm_encoder *encoder,
276 struct drm_crtc *tmp; 276 struct drm_crtc *tmp;
277 int crtc_mask = 1; 277 int crtc_mask = 1;
278 278
279 WARN(!crtc, "checking null crtc?"); 279 WARN(!crtc, "checking null crtc?\n");
280 280
281 dev = crtc->dev; 281 dev = crtc->dev;
282 282
@@ -336,20 +336,20 @@ bool drm_crtc_helper_set_mode(struct drm_crtc *crtc,
336 struct drm_framebuffer *old_fb) 336 struct drm_framebuffer *old_fb)
337{ 337{
338 struct drm_device *dev = crtc->dev; 338 struct drm_device *dev = crtc->dev;
339 struct drm_display_mode *adjusted_mode, saved_mode; 339 struct drm_display_mode *adjusted_mode, saved_mode, saved_hwmode;
340 struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; 340 struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private;
341 struct drm_encoder_helper_funcs *encoder_funcs; 341 struct drm_encoder_helper_funcs *encoder_funcs;
342 int saved_x, saved_y; 342 int saved_x, saved_y;
343 struct drm_encoder *encoder; 343 struct drm_encoder *encoder;
344 bool ret = true; 344 bool ret = true;
345 345
346 adjusted_mode = drm_mode_duplicate(dev, mode);
347
348 crtc->enabled = drm_helper_crtc_in_use(crtc); 346 crtc->enabled = drm_helper_crtc_in_use(crtc);
349
350 if (!crtc->enabled) 347 if (!crtc->enabled)
351 return true; 348 return true;
352 349
350 adjusted_mode = drm_mode_duplicate(dev, mode);
351
352 saved_hwmode = crtc->hwmode;
353 saved_mode = crtc->mode; 353 saved_mode = crtc->mode;
354 saved_x = crtc->x; 354 saved_x = crtc->x;
355 saved_y = crtc->y; 355 saved_y = crtc->y;
@@ -427,11 +427,20 @@ bool drm_crtc_helper_set_mode(struct drm_crtc *crtc,
427 427
428 } 428 }
429 429
430 /* XXX free adjustedmode */ 430 /* Store real post-adjustment hardware mode. */
431 drm_mode_destroy(dev, adjusted_mode); 431 crtc->hwmode = *adjusted_mode;
432
433 /* Calculate and store various constants which
434 * are later needed by vblank and swap-completion
435 * timestamping. They are derived from true hwmode.
436 */
437 drm_calc_timestamping_constants(crtc);
438
432 /* FIXME: add subpixel order */ 439 /* FIXME: add subpixel order */
433done: 440done:
441 drm_mode_destroy(dev, adjusted_mode);
434 if (!ret) { 442 if (!ret) {
443 crtc->hwmode = saved_hwmode;
435 crtc->mode = saved_mode; 444 crtc->mode = saved_mode;
436 crtc->x = saved_x; 445 crtc->x = saved_x;
437 crtc->y = saved_y; 446 crtc->y = saved_y;
@@ -471,6 +480,7 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set)
471 int count = 0, ro, fail = 0; 480 int count = 0, ro, fail = 0;
472 struct drm_crtc_helper_funcs *crtc_funcs; 481 struct drm_crtc_helper_funcs *crtc_funcs;
473 int ret = 0; 482 int ret = 0;
483 int i;
474 484
475 DRM_DEBUG_KMS("\n"); 485 DRM_DEBUG_KMS("\n");
476 486
@@ -485,14 +495,17 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set)
485 495
486 crtc_funcs = set->crtc->helper_private; 496 crtc_funcs = set->crtc->helper_private;
487 497
498 if (!set->mode)
499 set->fb = NULL;
500
488 if (set->fb) { 501 if (set->fb) {
489 DRM_DEBUG_KMS("[CRTC:%d] [FB:%d] #connectors=%d (x y) (%i %i)\n", 502 DRM_DEBUG_KMS("[CRTC:%d] [FB:%d] #connectors=%d (x y) (%i %i)\n",
490 set->crtc->base.id, set->fb->base.id, 503 set->crtc->base.id, set->fb->base.id,
491 (int)set->num_connectors, set->x, set->y); 504 (int)set->num_connectors, set->x, set->y);
492 } else { 505 } else {
493 DRM_DEBUG_KMS("[CRTC:%d] [NOFB] #connectors=%d (x y) (%i %i)\n", 506 DRM_DEBUG_KMS("[CRTC:%d] [NOFB]\n", set->crtc->base.id);
494 set->crtc->base.id, (int)set->num_connectors, 507 set->mode = NULL;
495 set->x, set->y); 508 set->num_connectors = 0;
496 } 509 }
497 510
498 dev = set->crtc->dev; 511 dev = set->crtc->dev;
@@ -637,8 +650,8 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set)
637 mode_changed = true; 650 mode_changed = true;
638 651
639 if (mode_changed) { 652 if (mode_changed) {
640 set->crtc->enabled = (set->mode != NULL); 653 set->crtc->enabled = drm_helper_crtc_in_use(set->crtc);
641 if (set->mode != NULL) { 654 if (set->crtc->enabled) {
642 DRM_DEBUG_KMS("attempting to set mode from" 655 DRM_DEBUG_KMS("attempting to set mode from"
643 " userspace\n"); 656 " userspace\n");
644 drm_mode_debug_printmodeline(set->mode); 657 drm_mode_debug_printmodeline(set->mode);
@@ -649,9 +662,16 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set)
649 old_fb)) { 662 old_fb)) {
650 DRM_ERROR("failed to set mode on [CRTC:%d]\n", 663 DRM_ERROR("failed to set mode on [CRTC:%d]\n",
651 set->crtc->base.id); 664 set->crtc->base.id);
665 set->crtc->fb = old_fb;
652 ret = -EINVAL; 666 ret = -EINVAL;
653 goto fail; 667 goto fail;
654 } 668 }
669 DRM_DEBUG_KMS("Setting connector DPMS state to on\n");
670 for (i = 0; i < set->num_connectors; i++) {
671 DRM_DEBUG_KMS("\t[CONNECTOR:%d:%s] set DPMS on\n", set->connectors[i]->base.id,
672 drm_get_connector_name(set->connectors[i]));
673 set->connectors[i]->dpms = DRM_MODE_DPMS_ON;
674 }
655 } 675 }
656 drm_helper_disable_unused_functions(dev); 676 drm_helper_disable_unused_functions(dev);
657 } else if (fb_changed) { 677 } else if (fb_changed) {
@@ -663,8 +683,10 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set)
663 set->crtc->fb = set->fb; 683 set->crtc->fb = set->fb;
664 ret = crtc_funcs->mode_set_base(set->crtc, 684 ret = crtc_funcs->mode_set_base(set->crtc,
665 set->x, set->y, old_fb); 685 set->x, set->y, old_fb);
666 if (ret != 0) 686 if (ret != 0) {
687 set->crtc->fb = old_fb;
667 goto fail; 688 goto fail;
689 }
668 } 690 }
669 691
670 kfree(save_connectors); 692 kfree(save_connectors);
@@ -841,7 +863,7 @@ static void output_poll_execute(struct work_struct *work)
841 struct delayed_work *delayed_work = to_delayed_work(work); 863 struct delayed_work *delayed_work = to_delayed_work(work);
842 struct drm_device *dev = container_of(delayed_work, struct drm_device, mode_config.output_poll_work); 864 struct drm_device *dev = container_of(delayed_work, struct drm_device, mode_config.output_poll_work);
843 struct drm_connector *connector; 865 struct drm_connector *connector;
844 enum drm_connector_status old_status, status; 866 enum drm_connector_status old_status;
845 bool repoll = false, changed = false; 867 bool repoll = false, changed = false;
846 868
847 if (!drm_kms_helper_poll) 869 if (!drm_kms_helper_poll)
@@ -866,8 +888,12 @@ static void output_poll_execute(struct work_struct *work)
866 !(connector->polled & DRM_CONNECTOR_POLL_HPD)) 888 !(connector->polled & DRM_CONNECTOR_POLL_HPD))
867 continue; 889 continue;
868 890
869 status = connector->funcs->detect(connector, false); 891 connector->status = connector->funcs->detect(connector, false);
870 if (old_status != status) 892 DRM_DEBUG_KMS("[CONNECTOR:%d:%s] status updated from %d to %d\n",
893 connector->base.id,
894 drm_get_connector_name(connector),
895 old_status, connector->status);
896 if (old_status != connector->status)
871 changed = true; 897 changed = true;
872 } 898 }
873 899
diff --git a/drivers/gpu/drm/drm_debugfs.c b/drivers/gpu/drm/drm_debugfs.c
index 677b275fa721..9d8c892d07c9 100644
--- a/drivers/gpu/drm/drm_debugfs.c
+++ b/drivers/gpu/drm/drm_debugfs.c
@@ -48,7 +48,6 @@ static struct drm_info_list drm_debugfs_list[] = {
48 {"queues", drm_queues_info, 0}, 48 {"queues", drm_queues_info, 0},
49 {"bufs", drm_bufs_info, 0}, 49 {"bufs", drm_bufs_info, 0},
50 {"gem_names", drm_gem_name_info, DRIVER_GEM}, 50 {"gem_names", drm_gem_name_info, DRIVER_GEM},
51 {"gem_objects", drm_gem_object_info, DRIVER_GEM},
52#if DRM_DEBUG_CODE 51#if DRM_DEBUG_CODE
53 {"vma", drm_vma_info, 0}, 52 {"vma", drm_vma_info, 0},
54#endif 53#endif
diff --git a/drivers/gpu/drm/drm_drawable.c b/drivers/gpu/drm/drm_drawable.c
deleted file mode 100644
index c53c9768cc11..000000000000
--- a/drivers/gpu/drm/drm_drawable.c
+++ /dev/null
@@ -1,198 +0,0 @@
1/**
2 * \file drm_drawable.c
3 * IOCTLs for drawables
4 *
5 * \author Rickard E. (Rik) Faith <faith@valinux.com>
6 * \author Gareth Hughes <gareth@valinux.com>
7 * \author Michel Dänzer <michel@tungstengraphics.com>
8 */
9
10/*
11 * Created: Tue Feb 2 08:37:54 1999 by faith@valinux.com
12 *
13 * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
14 * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
15 * Copyright 2006 Tungsten Graphics, Inc., Bismarck, North Dakota.
16 * All Rights Reserved.
17 *
18 * Permission is hereby granted, free of charge, to any person obtaining a
19 * copy of this software and associated documentation files (the "Software"),
20 * to deal in the Software without restriction, including without limitation
21 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
22 * and/or sell copies of the Software, and to permit persons to whom the
23 * Software is furnished to do so, subject to the following conditions:
24 *
25 * The above copyright notice and this permission notice (including the next
26 * paragraph) shall be included in all copies or substantial portions of the
27 * Software.
28 *
29 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
30 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
31 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
32 * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
33 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
34 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
35 * OTHER DEALINGS IN THE SOFTWARE.
36 */
37
38#include "drmP.h"
39
40/**
41 * Allocate drawable ID and memory to store information about it.
42 */
43int drm_adddraw(struct drm_device *dev, void *data, struct drm_file *file_priv)
44{
45 unsigned long irqflags;
46 struct drm_draw *draw = data;
47 int new_id = 0;
48 int ret;
49
50again:
51 if (idr_pre_get(&dev->drw_idr, GFP_KERNEL) == 0) {
52 DRM_ERROR("Out of memory expanding drawable idr\n");
53 return -ENOMEM;
54 }
55
56 spin_lock_irqsave(&dev->drw_lock, irqflags);
57 ret = idr_get_new_above(&dev->drw_idr, NULL, 1, &new_id);
58 if (ret == -EAGAIN) {
59 spin_unlock_irqrestore(&dev->drw_lock, irqflags);
60 goto again;
61 }
62
63 spin_unlock_irqrestore(&dev->drw_lock, irqflags);
64
65 draw->handle = new_id;
66
67 DRM_DEBUG("%d\n", draw->handle);
68
69 return 0;
70}
71
72/**
73 * Free drawable ID and memory to store information about it.
74 */
75int drm_rmdraw(struct drm_device *dev, void *data, struct drm_file *file_priv)
76{
77 struct drm_draw *draw = data;
78 unsigned long irqflags;
79 struct drm_drawable_info *info;
80
81 spin_lock_irqsave(&dev->drw_lock, irqflags);
82
83 info = drm_get_drawable_info(dev, draw->handle);
84 if (info == NULL) {
85 spin_unlock_irqrestore(&dev->drw_lock, irqflags);
86 return -EINVAL;
87 }
88 kfree(info->rects);
89 kfree(info);
90
91 idr_remove(&dev->drw_idr, draw->handle);
92
93 spin_unlock_irqrestore(&dev->drw_lock, irqflags);
94 DRM_DEBUG("%d\n", draw->handle);
95 return 0;
96}
97
98int drm_update_drawable_info(struct drm_device *dev, void *data, struct drm_file *file_priv)
99{
100 struct drm_update_draw *update = data;
101 unsigned long irqflags;
102 struct drm_clip_rect *rects;
103 struct drm_drawable_info *info;
104 int err;
105
106 info = idr_find(&dev->drw_idr, update->handle);
107 if (!info) {
108 info = kzalloc(sizeof(*info), GFP_KERNEL);
109 if (!info)
110 return -ENOMEM;
111 if (IS_ERR(idr_replace(&dev->drw_idr, info, update->handle))) {
112 DRM_ERROR("No such drawable %d\n", update->handle);
113 kfree(info);
114 return -EINVAL;
115 }
116 }
117
118 switch (update->type) {
119 case DRM_DRAWABLE_CLIPRECTS:
120 if (update->num == 0)
121 rects = NULL;
122 else if (update->num != info->num_rects) {
123 rects = kmalloc(update->num *
124 sizeof(struct drm_clip_rect),
125 GFP_KERNEL);
126 } else
127 rects = info->rects;
128
129 if (update->num && !rects) {
130 DRM_ERROR("Failed to allocate cliprect memory\n");
131 err = -ENOMEM;
132 goto error;
133 }
134
135 if (update->num && DRM_COPY_FROM_USER(rects,
136 (struct drm_clip_rect __user *)
137 (unsigned long)update->data,
138 update->num *
139 sizeof(*rects))) {
140 DRM_ERROR("Failed to copy cliprects from userspace\n");
141 err = -EFAULT;
142 goto error;
143 }
144
145 spin_lock_irqsave(&dev->drw_lock, irqflags);
146
147 if (rects != info->rects) {
148 kfree(info->rects);
149 }
150
151 info->rects = rects;
152 info->num_rects = update->num;
153
154 spin_unlock_irqrestore(&dev->drw_lock, irqflags);
155
156 DRM_DEBUG("Updated %d cliprects for drawable %d\n",
157 info->num_rects, update->handle);
158 break;
159 default:
160 DRM_ERROR("Invalid update type %d\n", update->type);
161 return -EINVAL;
162 }
163
164 return 0;
165
166error:
167 if (rects != info->rects)
168 kfree(rects);
169
170 return err;
171}
172
173/**
174 * Caller must hold the drawable spinlock!
175 */
176struct drm_drawable_info *drm_get_drawable_info(struct drm_device *dev, drm_drawable_t id)
177{
178 return idr_find(&dev->drw_idr, id);
179}
180EXPORT_SYMBOL(drm_get_drawable_info);
181
182static int drm_drawable_free(int idr, void *p, void *data)
183{
184 struct drm_drawable_info *info = p;
185
186 if (info) {
187 kfree(info->rects);
188 kfree(info);
189 }
190
191 return 0;
192}
193
194void drm_drawable_free_all(struct drm_device *dev)
195{
196 idr_for_each(&dev->drw_idr, drm_drawable_free, NULL);
197 idr_remove_all(&dev->drw_idr);
198}
diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c
index 84da748555bc..93a112d45c1a 100644
--- a/drivers/gpu/drm/drm_drv.c
+++ b/drivers/gpu/drm/drm_drv.c
@@ -67,6 +67,7 @@ static struct drm_ioctl_desc drm_ioctls[] = {
67 DRM_IOCTL_DEF(DRM_IOCTL_GET_MAP, drm_getmap, 0), 67 DRM_IOCTL_DEF(DRM_IOCTL_GET_MAP, drm_getmap, 0),
68 DRM_IOCTL_DEF(DRM_IOCTL_GET_CLIENT, drm_getclient, 0), 68 DRM_IOCTL_DEF(DRM_IOCTL_GET_CLIENT, drm_getclient, 0),
69 DRM_IOCTL_DEF(DRM_IOCTL_GET_STATS, drm_getstats, 0), 69 DRM_IOCTL_DEF(DRM_IOCTL_GET_STATS, drm_getstats, 0),
70 DRM_IOCTL_DEF(DRM_IOCTL_GET_CAP, drm_getcap, 0),
70 DRM_IOCTL_DEF(DRM_IOCTL_SET_VERSION, drm_setversion, DRM_MASTER), 71 DRM_IOCTL_DEF(DRM_IOCTL_SET_VERSION, drm_setversion, DRM_MASTER),
71 72
72 DRM_IOCTL_DEF(DRM_IOCTL_SET_UNIQUE, drm_setunique, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), 73 DRM_IOCTL_DEF(DRM_IOCTL_SET_UNIQUE, drm_setunique, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
@@ -91,8 +92,8 @@ static struct drm_ioctl_desc drm_ioctls[] = {
91 DRM_IOCTL_DEF(DRM_IOCTL_NEW_CTX, drm_newctx, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), 92 DRM_IOCTL_DEF(DRM_IOCTL_NEW_CTX, drm_newctx, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
92 DRM_IOCTL_DEF(DRM_IOCTL_RES_CTX, drm_resctx, DRM_AUTH), 93 DRM_IOCTL_DEF(DRM_IOCTL_RES_CTX, drm_resctx, DRM_AUTH),
93 94
94 DRM_IOCTL_DEF(DRM_IOCTL_ADD_DRAW, drm_adddraw, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), 95 DRM_IOCTL_DEF(DRM_IOCTL_ADD_DRAW, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
95 DRM_IOCTL_DEF(DRM_IOCTL_RM_DRAW, drm_rmdraw, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), 96 DRM_IOCTL_DEF(DRM_IOCTL_RM_DRAW, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
96 97
97 DRM_IOCTL_DEF(DRM_IOCTL_LOCK, drm_lock, DRM_AUTH), 98 DRM_IOCTL_DEF(DRM_IOCTL_LOCK, drm_lock, DRM_AUTH),
98 DRM_IOCTL_DEF(DRM_IOCTL_UNLOCK, drm_unlock, DRM_AUTH), 99 DRM_IOCTL_DEF(DRM_IOCTL_UNLOCK, drm_unlock, DRM_AUTH),
@@ -127,7 +128,7 @@ static struct drm_ioctl_desc drm_ioctls[] = {
127 128
128 DRM_IOCTL_DEF(DRM_IOCTL_MODESET_CTL, drm_modeset_ctl, 0), 129 DRM_IOCTL_DEF(DRM_IOCTL_MODESET_CTL, drm_modeset_ctl, 0),
129 130
130 DRM_IOCTL_DEF(DRM_IOCTL_UPDATE_DRAW, drm_update_drawable_info, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), 131 DRM_IOCTL_DEF(DRM_IOCTL_UPDATE_DRAW, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
131 132
132 DRM_IOCTL_DEF(DRM_IOCTL_GEM_CLOSE, drm_gem_close_ioctl, DRM_UNLOCKED), 133 DRM_IOCTL_DEF(DRM_IOCTL_GEM_CLOSE, drm_gem_close_ioctl, DRM_UNLOCKED),
133 DRM_IOCTL_DEF(DRM_IOCTL_GEM_FLINK, drm_gem_flink_ioctl, DRM_AUTH|DRM_UNLOCKED), 134 DRM_IOCTL_DEF(DRM_IOCTL_GEM_FLINK, drm_gem_flink_ioctl, DRM_AUTH|DRM_UNLOCKED),
@@ -150,7 +151,10 @@ static struct drm_ioctl_desc drm_ioctls[] = {
150 DRM_IOCTL_DEF(DRM_IOCTL_MODE_ADDFB, drm_mode_addfb, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED), 151 DRM_IOCTL_DEF(DRM_IOCTL_MODE_ADDFB, drm_mode_addfb, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
151 DRM_IOCTL_DEF(DRM_IOCTL_MODE_RMFB, drm_mode_rmfb, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED), 152 DRM_IOCTL_DEF(DRM_IOCTL_MODE_RMFB, drm_mode_rmfb, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
152 DRM_IOCTL_DEF(DRM_IOCTL_MODE_PAGE_FLIP, drm_mode_page_flip_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED), 153 DRM_IOCTL_DEF(DRM_IOCTL_MODE_PAGE_FLIP, drm_mode_page_flip_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
153 DRM_IOCTL_DEF(DRM_IOCTL_MODE_DIRTYFB, drm_mode_dirtyfb_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED) 154 DRM_IOCTL_DEF(DRM_IOCTL_MODE_DIRTYFB, drm_mode_dirtyfb_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
155 DRM_IOCTL_DEF(DRM_IOCTL_MODE_CREATE_DUMB, drm_mode_create_dumb_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
156 DRM_IOCTL_DEF(DRM_IOCTL_MODE_MAP_DUMB, drm_mode_mmap_dumb_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
157 DRM_IOCTL_DEF(DRM_IOCTL_MODE_DESTROY_DUMB, drm_mode_destroy_dumb_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED)
154}; 158};
155 159
156#define DRM_CORE_IOCTL_COUNT ARRAY_SIZE( drm_ioctls ) 160#define DRM_CORE_IOCTL_COUNT ARRAY_SIZE( drm_ioctls )
@@ -180,10 +184,6 @@ int drm_lastclose(struct drm_device * dev)
180 184
181 mutex_lock(&dev->struct_mutex); 185 mutex_lock(&dev->struct_mutex);
182 186
183 /* Free drawable information memory */
184 drm_drawable_free_all(dev);
185 del_timer(&dev->timer);
186
187 /* Clear AGP information */ 187 /* Clear AGP information */
188 if (drm_core_has_AGP(dev) && dev->agp && 188 if (drm_core_has_AGP(dev) && dev->agp &&
189 !drm_core_check_feature(dev, DRIVER_MODESET)) { 189 !drm_core_check_feature(dev, DRIVER_MODESET)) {
@@ -238,53 +238,11 @@ int drm_lastclose(struct drm_device * dev)
238 return 0; 238 return 0;
239} 239}
240 240
241/**
242 * Module initialization. Called via init_module at module load time, or via
243 * linux/init/main.c (this is not currently supported).
244 *
245 * \return zero on success or a negative number on failure.
246 *
247 * Initializes an array of drm_device structures, and attempts to
248 * initialize all available devices, using consecutive minors, registering the
249 * stubs and initializing the device.
250 *
251 * Expands the \c DRIVER_PREINIT and \c DRIVER_POST_INIT macros before and
252 * after the initialization for driver customization.
253 */
254int drm_init(struct drm_driver *driver)
255{
256 DRM_DEBUG("\n");
257 INIT_LIST_HEAD(&driver->device_list);
258
259 if (driver->driver_features & DRIVER_USE_PLATFORM_DEVICE)
260 return drm_platform_init(driver);
261 else
262 return drm_pci_init(driver);
263}
264
265EXPORT_SYMBOL(drm_init);
266
267void drm_exit(struct drm_driver *driver)
268{
269 struct drm_device *dev, *tmp;
270 DRM_DEBUG("\n");
271
272 if (driver->driver_features & DRIVER_MODESET) {
273 pci_unregister_driver(&driver->pci_driver);
274 } else {
275 list_for_each_entry_safe(dev, tmp, &driver->device_list, driver_item)
276 drm_put_dev(dev);
277 }
278
279 DRM_INFO("Module unloaded\n");
280}
281
282EXPORT_SYMBOL(drm_exit);
283
284/** File operations structure */ 241/** File operations structure */
285static const struct file_operations drm_stub_fops = { 242static const struct file_operations drm_stub_fops = {
286 .owner = THIS_MODULE, 243 .owner = THIS_MODULE,
287 .open = drm_stub_open 244 .open = drm_stub_open,
245 .llseek = noop_llseek,
288}; 246};
289 247
290static int __init drm_core_init(void) 248static int __init drm_core_init(void)
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 96e963108225..09292193dafe 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -30,7 +30,6 @@
30#include <linux/kernel.h> 30#include <linux/kernel.h>
31#include <linux/slab.h> 31#include <linux/slab.h>
32#include <linux/i2c.h> 32#include <linux/i2c.h>
33#include <linux/i2c-algo-bit.h>
34#include "drmP.h" 33#include "drmP.h"
35#include "drm_edid.h" 34#include "drm_edid.h"
36#include "drm_edid_modes.h" 35#include "drm_edid_modes.h"
@@ -185,9 +184,9 @@ drm_edid_block_valid(u8 *raw_edid)
185 184
186bad: 185bad:
187 if (raw_edid) { 186 if (raw_edid) {
188 DRM_ERROR("Raw EDID:\n"); 187 printk(KERN_ERR "Raw EDID:\n");
189 print_hex_dump_bytes(KERN_ERR, DUMP_PREFIX_NONE, raw_edid, EDID_LENGTH); 188 print_hex_dump_bytes(KERN_ERR, DUMP_PREFIX_NONE, raw_edid, EDID_LENGTH);
190 printk("\n"); 189 printk(KERN_ERR "\n");
191 } 190 }
192 return 0; 191 return 0;
193} 192}
@@ -231,30 +230,49 @@ drm_do_probe_ddc_edid(struct i2c_adapter *adapter, unsigned char *buf,
231 int block, int len) 230 int block, int len)
232{ 231{
233 unsigned char start = block * EDID_LENGTH; 232 unsigned char start = block * EDID_LENGTH;
234 struct i2c_msg msgs[] = { 233 int ret, retries = 5;
235 {
236 .addr = DDC_ADDR,
237 .flags = 0,
238 .len = 1,
239 .buf = &start,
240 }, {
241 .addr = DDC_ADDR,
242 .flags = I2C_M_RD,
243 .len = len,
244 .buf = buf + start,
245 }
246 };
247 234
248 if (i2c_transfer(adapter, msgs, 2) == 2) 235 /* The core i2c driver will automatically retry the transfer if the
249 return 0; 236 * adapter reports EAGAIN. However, we find that bit-banging transfers
237 * are susceptible to errors under a heavily loaded machine and
238 * generate spurious NAKs and timeouts. Retrying the transfer
239 * of the individual block a few times seems to overcome this.
240 */
241 do {
242 struct i2c_msg msgs[] = {
243 {
244 .addr = DDC_ADDR,
245 .flags = 0,
246 .len = 1,
247 .buf = &start,
248 }, {
249 .addr = DDC_ADDR,
250 .flags = I2C_M_RD,
251 .len = len,
252 .buf = buf,
253 }
254 };
255 ret = i2c_transfer(adapter, msgs, 2);
256 } while (ret != 2 && --retries);
257
258 return ret == 2 ? 0 : -1;
259}
260
261static bool drm_edid_is_zero(u8 *in_edid, int length)
262{
263 int i;
264 u32 *raw_edid = (u32 *)in_edid;
250 265
251 return -1; 266 for (i = 0; i < length / 4; i++)
267 if (*(raw_edid + i) != 0)
268 return false;
269 return true;
252} 270}
253 271
254static u8 * 272static u8 *
255drm_do_get_edid(struct drm_connector *connector, struct i2c_adapter *adapter) 273drm_do_get_edid(struct drm_connector *connector, struct i2c_adapter *adapter)
256{ 274{
257 int i, j = 0; 275 int i, j = 0, valid_extensions = 0;
258 u8 *block, *new; 276 u8 *block, *new;
259 277
260 if ((block = kmalloc(EDID_LENGTH, GFP_KERNEL)) == NULL) 278 if ((block = kmalloc(EDID_LENGTH, GFP_KERNEL)) == NULL)
@@ -266,6 +284,10 @@ drm_do_get_edid(struct drm_connector *connector, struct i2c_adapter *adapter)
266 goto out; 284 goto out;
267 if (drm_edid_block_valid(block)) 285 if (drm_edid_block_valid(block))
268 break; 286 break;
287 if (i == 0 && drm_edid_is_zero(block, EDID_LENGTH)) {
288 connector->null_edid_counter++;
289 goto carp;
290 }
269 } 291 }
270 if (i == 4) 292 if (i == 4)
271 goto carp; 293 goto carp;
@@ -281,14 +303,28 @@ drm_do_get_edid(struct drm_connector *connector, struct i2c_adapter *adapter)
281 303
282 for (j = 1; j <= block[0x7e]; j++) { 304 for (j = 1; j <= block[0x7e]; j++) {
283 for (i = 0; i < 4; i++) { 305 for (i = 0; i < 4; i++) {
284 if (drm_do_probe_ddc_edid(adapter, block, j, 306 if (drm_do_probe_ddc_edid(adapter,
285 EDID_LENGTH)) 307 block + (valid_extensions + 1) * EDID_LENGTH,
308 j, EDID_LENGTH))
286 goto out; 309 goto out;
287 if (drm_edid_block_valid(block + j * EDID_LENGTH)) 310 if (drm_edid_block_valid(block + (valid_extensions + 1) * EDID_LENGTH)) {
311 valid_extensions++;
288 break; 312 break;
313 }
289 } 314 }
290 if (i == 4) 315 if (i == 4)
291 goto carp; 316 dev_warn(connector->dev->dev,
317 "%s: Ignoring invalid EDID block %d.\n",
318 drm_get_connector_name(connector), j);
319 }
320
321 if (valid_extensions != block[0x7e]) {
322 block[EDID_LENGTH-1] += block[0x7e] - valid_extensions;
323 block[0x7e] = valid_extensions;
324 new = krealloc(block, (valid_extensions + 1) * EDID_LENGTH, GFP_KERNEL);
325 if (!new)
326 goto out;
327 block = new;
292 } 328 }
293 329
294 return block; 330 return block;
@@ -436,12 +472,11 @@ static void edid_fixup_preferred(struct drm_connector *connector,
436struct drm_display_mode *drm_mode_find_dmt(struct drm_device *dev, 472struct drm_display_mode *drm_mode_find_dmt(struct drm_device *dev,
437 int hsize, int vsize, int fresh) 473 int hsize, int vsize, int fresh)
438{ 474{
475 struct drm_display_mode *mode = NULL;
439 int i; 476 int i;
440 struct drm_display_mode *ptr, *mode;
441 477
442 mode = NULL;
443 for (i = 0; i < drm_num_dmt_modes; i++) { 478 for (i = 0; i < drm_num_dmt_modes; i++) {
444 ptr = &drm_dmt_modes[i]; 479 const struct drm_display_mode *ptr = &drm_dmt_modes[i];
445 if (hsize == ptr->hdisplay && 480 if (hsize == ptr->hdisplay &&
446 vsize == ptr->vdisplay && 481 vsize == ptr->vdisplay &&
447 fresh == drm_mode_vrefresh(ptr)) { 482 fresh == drm_mode_vrefresh(ptr)) {
@@ -872,7 +907,7 @@ static struct drm_display_mode *drm_mode_detailed(struct drm_device *dev,
872} 907}
873 908
874static bool 909static bool
875mode_is_rb(struct drm_display_mode *mode) 910mode_is_rb(const struct drm_display_mode *mode)
876{ 911{
877 return (mode->htotal - mode->hdisplay == 160) && 912 return (mode->htotal - mode->hdisplay == 160) &&
878 (mode->hsync_end - mode->hdisplay == 80) && 913 (mode->hsync_end - mode->hdisplay == 80) &&
@@ -881,7 +916,8 @@ mode_is_rb(struct drm_display_mode *mode)
881} 916}
882 917
883static bool 918static bool
884mode_in_hsync_range(struct drm_display_mode *mode, struct edid *edid, u8 *t) 919mode_in_hsync_range(const struct drm_display_mode *mode,
920 struct edid *edid, u8 *t)
885{ 921{
886 int hsync, hmin, hmax; 922 int hsync, hmin, hmax;
887 923
@@ -897,7 +933,8 @@ mode_in_hsync_range(struct drm_display_mode *mode, struct edid *edid, u8 *t)
897} 933}
898 934
899static bool 935static bool
900mode_in_vsync_range(struct drm_display_mode *mode, struct edid *edid, u8 *t) 936mode_in_vsync_range(const struct drm_display_mode *mode,
937 struct edid *edid, u8 *t)
901{ 938{
902 int vsync, vmin, vmax; 939 int vsync, vmin, vmax;
903 940
@@ -928,7 +965,7 @@ range_pixel_clock(struct edid *edid, u8 *t)
928} 965}
929 966
930static bool 967static bool
931mode_in_range(struct drm_display_mode *mode, struct edid *edid, 968mode_in_range(const struct drm_display_mode *mode, struct edid *edid,
932 struct detailed_timing *timing) 969 struct detailed_timing *timing)
933{ 970{
934 u32 max_clock; 971 u32 max_clock;
@@ -1268,34 +1305,52 @@ add_detailed_modes(struct drm_connector *connector, struct edid *edid,
1268} 1305}
1269 1306
1270#define HDMI_IDENTIFIER 0x000C03 1307#define HDMI_IDENTIFIER 0x000C03
1308#define AUDIO_BLOCK 0x01
1271#define VENDOR_BLOCK 0x03 1309#define VENDOR_BLOCK 0x03
1310#define EDID_BASIC_AUDIO (1 << 6)
1311
1272/** 1312/**
1273 * drm_detect_hdmi_monitor - detect whether monitor is hdmi. 1313 * Search EDID for CEA extension block.
1274 * @edid: monitor EDID information
1275 *
1276 * Parse the CEA extension according to CEA-861-B.
1277 * Return true if HDMI, false if not or unknown.
1278 */ 1314 */
1279bool drm_detect_hdmi_monitor(struct edid *edid) 1315u8 *drm_find_cea_extension(struct edid *edid)
1280{ 1316{
1281 char *edid_ext = NULL; 1317 u8 *edid_ext = NULL;
1282 int i, hdmi_id; 1318 int i;
1283 int start_offset, end_offset;
1284 bool is_hdmi = false;
1285 1319
1286 /* No EDID or EDID extensions */ 1320 /* No EDID or EDID extensions */
1287 if (edid == NULL || edid->extensions == 0) 1321 if (edid == NULL || edid->extensions == 0)
1288 goto end; 1322 return NULL;
1289 1323
1290 /* Find CEA extension */ 1324 /* Find CEA extension */
1291 for (i = 0; i < edid->extensions; i++) { 1325 for (i = 0; i < edid->extensions; i++) {
1292 edid_ext = (char *)edid + EDID_LENGTH * (i + 1); 1326 edid_ext = (u8 *)edid + EDID_LENGTH * (i + 1);
1293 /* This block is CEA extension */ 1327 if (edid_ext[0] == CEA_EXT)
1294 if (edid_ext[0] == 0x02)
1295 break; 1328 break;
1296 } 1329 }
1297 1330
1298 if (i == edid->extensions) 1331 if (i == edid->extensions)
1332 return NULL;
1333
1334 return edid_ext;
1335}
1336EXPORT_SYMBOL(drm_find_cea_extension);
1337
1338/**
1339 * drm_detect_hdmi_monitor - detect whether monitor is hdmi.
1340 * @edid: monitor EDID information
1341 *
1342 * Parse the CEA extension according to CEA-861-B.
1343 * Return true if HDMI, false if not or unknown.
1344 */
1345bool drm_detect_hdmi_monitor(struct edid *edid)
1346{
1347 u8 *edid_ext;
1348 int i, hdmi_id;
1349 int start_offset, end_offset;
1350 bool is_hdmi = false;
1351
1352 edid_ext = drm_find_cea_extension(edid);
1353 if (!edid_ext)
1299 goto end; 1354 goto end;
1300 1355
1301 /* Data block offset in CEA extension block */ 1356 /* Data block offset in CEA extension block */
@@ -1326,6 +1381,111 @@ end:
1326EXPORT_SYMBOL(drm_detect_hdmi_monitor); 1381EXPORT_SYMBOL(drm_detect_hdmi_monitor);
1327 1382
1328/** 1383/**
1384 * drm_detect_monitor_audio - check monitor audio capability
1385 *
1386 * Monitor should have CEA extension block.
1387 * If monitor has 'basic audio', but no CEA audio blocks, it's 'basic
1388 * audio' only. If there is any audio extension block and supported
1389 * audio format, assume at least 'basic audio' support, even if 'basic
1390 * audio' is not defined in EDID.
1391 *
1392 */
1393bool drm_detect_monitor_audio(struct edid *edid)
1394{
1395 u8 *edid_ext;
1396 int i, j;
1397 bool has_audio = false;
1398 int start_offset, end_offset;
1399
1400 edid_ext = drm_find_cea_extension(edid);
1401 if (!edid_ext)
1402 goto end;
1403
1404 has_audio = ((edid_ext[3] & EDID_BASIC_AUDIO) != 0);
1405
1406 if (has_audio) {
1407 DRM_DEBUG_KMS("Monitor has basic audio support\n");
1408 goto end;
1409 }
1410
1411 /* Data block offset in CEA extension block */
1412 start_offset = 4;
1413 end_offset = edid_ext[2];
1414
1415 for (i = start_offset; i < end_offset;
1416 i += ((edid_ext[i] & 0x1f) + 1)) {
1417 if ((edid_ext[i] >> 5) == AUDIO_BLOCK) {
1418 has_audio = true;
1419 for (j = 1; j < (edid_ext[i] & 0x1f); j += 3)
1420 DRM_DEBUG_KMS("CEA audio format %d\n",
1421 (edid_ext[i + j] >> 3) & 0xf);
1422 goto end;
1423 }
1424 }
1425end:
1426 return has_audio;
1427}
1428EXPORT_SYMBOL(drm_detect_monitor_audio);
1429
1430/**
1431 * drm_add_display_info - pull display info out if present
1432 * @edid: EDID data
1433 * @info: display info (attached to connector)
1434 *
1435 * Grab any available display info and stuff it into the drm_display_info
1436 * structure that's part of the connector. Useful for tracking bpp and
1437 * color spaces.
1438 */
1439static void drm_add_display_info(struct edid *edid,
1440 struct drm_display_info *info)
1441{
1442 info->width_mm = edid->width_cm * 10;
1443 info->height_mm = edid->height_cm * 10;
1444
1445 /* driver figures it out in this case */
1446 info->bpc = 0;
1447 info->color_formats = 0;
1448
1449 /* Only defined for 1.4 with digital displays */
1450 if (edid->revision < 4)
1451 return;
1452
1453 if (!(edid->input & DRM_EDID_INPUT_DIGITAL))
1454 return;
1455
1456 switch (edid->input & DRM_EDID_DIGITAL_DEPTH_MASK) {
1457 case DRM_EDID_DIGITAL_DEPTH_6:
1458 info->bpc = 6;
1459 break;
1460 case DRM_EDID_DIGITAL_DEPTH_8:
1461 info->bpc = 8;
1462 break;
1463 case DRM_EDID_DIGITAL_DEPTH_10:
1464 info->bpc = 10;
1465 break;
1466 case DRM_EDID_DIGITAL_DEPTH_12:
1467 info->bpc = 12;
1468 break;
1469 case DRM_EDID_DIGITAL_DEPTH_14:
1470 info->bpc = 14;
1471 break;
1472 case DRM_EDID_DIGITAL_DEPTH_16:
1473 info->bpc = 16;
1474 break;
1475 case DRM_EDID_DIGITAL_DEPTH_UNDEF:
1476 default:
1477 info->bpc = 0;
1478 break;
1479 }
1480
1481 info->color_formats = DRM_COLOR_FORMAT_RGB444;
1482 if (info->color_formats & DRM_EDID_FEATURE_RGB_YCRCB444)
1483 info->color_formats = DRM_COLOR_FORMAT_YCRCB444;
1484 if (info->color_formats & DRM_EDID_FEATURE_RGB_YCRCB422)
1485 info->color_formats = DRM_COLOR_FORMAT_YCRCB422;
1486}
1487
1488/**
1329 * drm_add_edid_modes - add modes from EDID data, if available 1489 * drm_add_edid_modes - add modes from EDID data, if available
1330 * @connector: connector we're probing 1490 * @connector: connector we're probing
1331 * @edid: edid data 1491 * @edid: edid data
@@ -1373,8 +1533,7 @@ int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid)
1373 if (quirks & (EDID_QUIRK_PREFER_LARGE_60 | EDID_QUIRK_PREFER_LARGE_75)) 1533 if (quirks & (EDID_QUIRK_PREFER_LARGE_60 | EDID_QUIRK_PREFER_LARGE_75))
1374 edid_fixup_preferred(connector, quirks); 1534 edid_fixup_preferred(connector, quirks);
1375 1535
1376 connector->display_info.width_mm = edid->width_cm * 10; 1536 drm_add_display_info(edid, &connector->display_info);
1377 connector->display_info.height_mm = edid->height_cm * 10;
1378 1537
1379 return num_modes; 1538 return num_modes;
1380} 1539}
@@ -1395,7 +1554,7 @@ int drm_add_modes_noedid(struct drm_connector *connector,
1395 int hdisplay, int vdisplay) 1554 int hdisplay, int vdisplay)
1396{ 1555{
1397 int i, count, num_modes = 0; 1556 int i, count, num_modes = 0;
1398 struct drm_display_mode *mode, *ptr; 1557 struct drm_display_mode *mode;
1399 struct drm_device *dev = connector->dev; 1558 struct drm_device *dev = connector->dev;
1400 1559
1401 count = sizeof(drm_dmt_modes) / sizeof(struct drm_display_mode); 1560 count = sizeof(drm_dmt_modes) / sizeof(struct drm_display_mode);
@@ -1405,7 +1564,7 @@ int drm_add_modes_noedid(struct drm_connector *connector,
1405 vdisplay = 0; 1564 vdisplay = 0;
1406 1565
1407 for (i = 0; i < count; i++) { 1566 for (i = 0; i < count; i++) {
1408 ptr = &drm_dmt_modes[i]; 1567 const struct drm_display_mode *ptr = &drm_dmt_modes[i];
1409 if (hdisplay && vdisplay) { 1568 if (hdisplay && vdisplay) {
1410 /* 1569 /*
1411 * Only when two are valid, they will be used to check 1570 * Only when two are valid, they will be used to check
diff --git a/drivers/gpu/drm/drm_edid_modes.h b/drivers/gpu/drm/drm_edid_modes.h
index 6eb7592e152f..5f2064489fd5 100644
--- a/drivers/gpu/drm/drm_edid_modes.h
+++ b/drivers/gpu/drm/drm_edid_modes.h
@@ -32,7 +32,7 @@
32 * This table is copied from xfree86/modes/xf86EdidModes.c. 32 * This table is copied from xfree86/modes/xf86EdidModes.c.
33 * But the mode with Reduced blank feature is deleted. 33 * But the mode with Reduced blank feature is deleted.
34 */ 34 */
35static struct drm_display_mode drm_dmt_modes[] = { 35static const struct drm_display_mode drm_dmt_modes[] = {
36 /* 640x350@85Hz */ 36 /* 640x350@85Hz */
37 { DRM_MODE("640x350", DRM_MODE_TYPE_DRIVER, 31500, 640, 672, 37 { DRM_MODE("640x350", DRM_MODE_TYPE_DRIVER, 31500, 640, 672,
38 736, 832, 0, 350, 382, 385, 445, 0, 38 736, 832, 0, 350, 382, 385, 445, 0,
@@ -266,7 +266,7 @@ static struct drm_display_mode drm_dmt_modes[] = {
266static const int drm_num_dmt_modes = 266static const int drm_num_dmt_modes =
267 sizeof(drm_dmt_modes) / sizeof(struct drm_display_mode); 267 sizeof(drm_dmt_modes) / sizeof(struct drm_display_mode);
268 268
269static struct drm_display_mode edid_est_modes[] = { 269static const struct drm_display_mode edid_est_modes[] = {
270 { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 40000, 800, 840, 270 { DRM_MODE("800x600", DRM_MODE_TYPE_DRIVER, 40000, 800, 840,
271 968, 1056, 0, 600, 601, 605, 628, 0, 271 968, 1056, 0, 600, 601, 605, 628, 0,
272 DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 800x600@60Hz */ 272 DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 800x600@60Hz */
diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
index 6a5e403f9aa1..802b61ac3139 100644
--- a/drivers/gpu/drm/drm_fb_helper.c
+++ b/drivers/gpu/drm/drm_fb_helper.c
@@ -70,176 +70,76 @@ fail:
70} 70}
71EXPORT_SYMBOL(drm_fb_helper_single_add_all_connectors); 71EXPORT_SYMBOL(drm_fb_helper_single_add_all_connectors);
72 72
73/** 73static int drm_fb_helper_parse_command_line(struct drm_fb_helper *fb_helper)
74 * drm_fb_helper_connector_parse_command_line - parse command line for connector
75 * @connector - connector to parse line for
76 * @mode_option - per connector mode option
77 *
78 * This parses the connector specific then generic command lines for
79 * modes and options to configure the connector.
80 *
81 * This uses the same parameters as the fb modedb.c, except for extra
82 * <xres>x<yres>[M][R][-<bpp>][@<refresh>][i][m][eDd]
83 *
84 * enable/enable Digital/disable bit at the end
85 */
86static bool drm_fb_helper_connector_parse_command_line(struct drm_fb_helper_connector *fb_helper_conn,
87 const char *mode_option)
88{ 74{
89 const char *name; 75 struct drm_fb_helper_connector *fb_helper_conn;
90 unsigned int namelen;
91 int res_specified = 0, bpp_specified = 0, refresh_specified = 0;
92 unsigned int xres = 0, yres = 0, bpp = 32, refresh = 0;
93 int yres_specified = 0, cvt = 0, rb = 0, interlace = 0, margins = 0;
94 int i; 76 int i;
95 enum drm_connector_force force = DRM_FORCE_UNSPECIFIED;
96 struct drm_fb_helper_cmdline_mode *cmdline_mode;
97 struct drm_connector *connector;
98
99 if (!fb_helper_conn)
100 return false;
101 connector = fb_helper_conn->connector;
102 77
103 cmdline_mode = &fb_helper_conn->cmdline_mode; 78 for (i = 0; i < fb_helper->connector_count; i++) {
104 if (!mode_option) 79 struct drm_cmdline_mode *mode;
105 mode_option = fb_mode_option; 80 struct drm_connector *connector;
106 81 char *option = NULL;
107 if (!mode_option) {
108 cmdline_mode->specified = false;
109 return false;
110 }
111 82
112 name = mode_option; 83 fb_helper_conn = fb_helper->connector_info[i];
113 namelen = strlen(name); 84 connector = fb_helper_conn->connector;
114 for (i = namelen-1; i >= 0; i--) { 85 mode = &fb_helper_conn->cmdline_mode;
115 switch (name[i]) {
116 case '@':
117 namelen = i;
118 if (!refresh_specified && !bpp_specified &&
119 !yres_specified) {
120 refresh = simple_strtol(&name[i+1], NULL, 10);
121 refresh_specified = 1;
122 if (cvt || rb)
123 cvt = 0;
124 } else
125 goto done;
126 break;
127 case '-':
128 namelen = i;
129 if (!bpp_specified && !yres_specified) {
130 bpp = simple_strtol(&name[i+1], NULL, 10);
131 bpp_specified = 1;
132 if (cvt || rb)
133 cvt = 0;
134 } else
135 goto done;
136 break;
137 case 'x':
138 if (!yres_specified) {
139 yres = simple_strtol(&name[i+1], NULL, 10);
140 yres_specified = 1;
141 } else
142 goto done;
143 case '0' ... '9':
144 break;
145 case 'M':
146 if (!yres_specified)
147 cvt = 1;
148 break;
149 case 'R':
150 if (cvt)
151 rb = 1;
152 break;
153 case 'm':
154 if (!cvt)
155 margins = 1;
156 break;
157 case 'i':
158 if (!cvt)
159 interlace = 1;
160 break;
161 case 'e':
162 force = DRM_FORCE_ON;
163 break;
164 case 'D':
165 if ((connector->connector_type != DRM_MODE_CONNECTOR_DVII) &&
166 (connector->connector_type != DRM_MODE_CONNECTOR_HDMIB))
167 force = DRM_FORCE_ON;
168 else
169 force = DRM_FORCE_ON_DIGITAL;
170 break;
171 case 'd':
172 force = DRM_FORCE_OFF;
173 break;
174 default:
175 goto done;
176 }
177 }
178 if (i < 0 && yres_specified) {
179 xres = simple_strtol(name, NULL, 10);
180 res_specified = 1;
181 }
182done:
183
184 DRM_DEBUG_KMS("cmdline mode for connector %s %dx%d@%dHz%s%s%s\n",
185 drm_get_connector_name(connector), xres, yres,
186 (refresh) ? refresh : 60, (rb) ? " reduced blanking" :
187 "", (margins) ? " with margins" : "", (interlace) ?
188 " interlaced" : "");
189
190 if (force) {
191 const char *s;
192 switch (force) {
193 case DRM_FORCE_OFF: s = "OFF"; break;
194 case DRM_FORCE_ON_DIGITAL: s = "ON - dig"; break;
195 default:
196 case DRM_FORCE_ON: s = "ON"; break;
197 }
198 86
199 DRM_INFO("forcing %s connector %s\n", 87 /* do something on return - turn off connector maybe */
200 drm_get_connector_name(connector), s); 88 if (fb_get_options(drm_get_connector_name(connector), &option))
201 connector->force = force; 89 continue;
202 }
203 90
204 if (res_specified) { 91 if (drm_mode_parse_command_line_for_connector(option,
205 cmdline_mode->specified = true; 92 connector,
206 cmdline_mode->xres = xres; 93 mode)) {
207 cmdline_mode->yres = yres; 94 if (mode->force) {
208 } 95 const char *s;
96 switch (mode->force) {
97 case DRM_FORCE_OFF: s = "OFF"; break;
98 case DRM_FORCE_ON_DIGITAL: s = "ON - dig"; break;
99 default:
100 case DRM_FORCE_ON: s = "ON"; break;
101 }
102
103 DRM_INFO("forcing %s connector %s\n",
104 drm_get_connector_name(connector), s);
105 connector->force = mode->force;
106 }
209 107
210 if (refresh_specified) { 108 DRM_DEBUG_KMS("cmdline mode for connector %s %dx%d@%dHz%s%s%s\n",
211 cmdline_mode->refresh_specified = true; 109 drm_get_connector_name(connector),
212 cmdline_mode->refresh = refresh; 110 mode->xres, mode->yres,
213 } 111 mode->refresh_specified ? mode->refresh : 60,
112 mode->rb ? " reduced blanking" : "",
113 mode->margins ? " with margins" : "",
114 mode->interlace ? " interlaced" : "");
115 }
214 116
215 if (bpp_specified) {
216 cmdline_mode->bpp_specified = true;
217 cmdline_mode->bpp = bpp;
218 } 117 }
219 cmdline_mode->rb = rb ? true : false; 118 return 0;
220 cmdline_mode->cvt = cvt ? true : false;
221 cmdline_mode->interlace = interlace ? true : false;
222
223 return true;
224} 119}
225 120
226static int drm_fb_helper_parse_command_line(struct drm_fb_helper *fb_helper) 121static void drm_fb_helper_save_lut_atomic(struct drm_crtc *crtc, struct drm_fb_helper *helper)
227{ 122{
228 struct drm_fb_helper_connector *fb_helper_conn; 123 uint16_t *r_base, *g_base, *b_base;
229 int i; 124 int i;
230 125
231 for (i = 0; i < fb_helper->connector_count; i++) { 126 r_base = crtc->gamma_store;
232 char *option = NULL; 127 g_base = r_base + crtc->gamma_size;
128 b_base = g_base + crtc->gamma_size;
233 129
234 fb_helper_conn = fb_helper->connector_info[i]; 130 for (i = 0; i < crtc->gamma_size; i++)
131 helper->funcs->gamma_get(crtc, &r_base[i], &g_base[i], &b_base[i], i);
132}
235 133
236 /* do something on return - turn off connector maybe */ 134static void drm_fb_helper_restore_lut_atomic(struct drm_crtc *crtc)
237 if (fb_get_options(drm_get_connector_name(fb_helper_conn->connector), &option)) 135{
238 continue; 136 uint16_t *r_base, *g_base, *b_base;
239 137
240 drm_fb_helper_connector_parse_command_line(fb_helper_conn, option); 138 r_base = crtc->gamma_store;
241 } 139 g_base = r_base + crtc->gamma_size;
242 return 0; 140 b_base = g_base + crtc->gamma_size;
141
142 crtc->funcs->gamma_set(crtc, r_base, g_base, b_base, 0, crtc->gamma_size);
243} 143}
244 144
245int drm_fb_helper_debug_enter(struct fb_info *info) 145int drm_fb_helper_debug_enter(struct fb_info *info)
@@ -260,11 +160,12 @@ int drm_fb_helper_debug_enter(struct fb_info *info)
260 continue; 160 continue;
261 161
262 funcs = mode_set->crtc->helper_private; 162 funcs = mode_set->crtc->helper_private;
163 drm_fb_helper_save_lut_atomic(mode_set->crtc, helper);
263 funcs->mode_set_base_atomic(mode_set->crtc, 164 funcs->mode_set_base_atomic(mode_set->crtc,
264 mode_set->fb, 165 mode_set->fb,
265 mode_set->x, 166 mode_set->x,
266 mode_set->y); 167 mode_set->y,
267 168 ENTER_ATOMIC_MODE_SET);
268 } 169 }
269 } 170 }
270 171
@@ -308,17 +209,31 @@ int drm_fb_helper_debug_leave(struct fb_info *info)
308 continue; 209 continue;
309 } 210 }
310 211
212 drm_fb_helper_restore_lut_atomic(mode_set->crtc);
311 funcs->mode_set_base_atomic(mode_set->crtc, fb, crtc->x, 213 funcs->mode_set_base_atomic(mode_set->crtc, fb, crtc->x,
312 crtc->y); 214 crtc->y, LEAVE_ATOMIC_MODE_SET);
313 } 215 }
314 216
315 return 0; 217 return 0;
316} 218}
317EXPORT_SYMBOL(drm_fb_helper_debug_leave); 219EXPORT_SYMBOL(drm_fb_helper_debug_leave);
318 220
221bool drm_fb_helper_restore_fbdev_mode(struct drm_fb_helper *fb_helper)
222{
223 bool error = false;
224 int i, ret;
225 for (i = 0; i < fb_helper->crtc_count; i++) {
226 struct drm_mode_set *mode_set = &fb_helper->crtc_info[i].mode_set;
227 ret = drm_crtc_helper_set_config(mode_set);
228 if (ret)
229 error = true;
230 }
231 return error;
232}
233EXPORT_SYMBOL(drm_fb_helper_restore_fbdev_mode);
234
319bool drm_fb_helper_force_kernel_mode(void) 235bool drm_fb_helper_force_kernel_mode(void)
320{ 236{
321 int i = 0;
322 bool ret, error = false; 237 bool ret, error = false;
323 struct drm_fb_helper *helper; 238 struct drm_fb_helper *helper;
324 239
@@ -326,12 +241,12 @@ bool drm_fb_helper_force_kernel_mode(void)
326 return false; 241 return false;
327 242
328 list_for_each_entry(helper, &kernel_fb_helper_list, kernel_fb_list) { 243 list_for_each_entry(helper, &kernel_fb_helper_list, kernel_fb_list) {
329 for (i = 0; i < helper->crtc_count; i++) { 244 if (helper->dev->switch_power_state == DRM_SWITCH_POWER_OFF)
330 struct drm_mode_set *mode_set = &helper->crtc_info[i].mode_set; 245 continue;
331 ret = drm_crtc_helper_set_config(mode_set); 246
332 if (ret) 247 ret = drm_fb_helper_restore_fbdev_mode(helper);
333 error = true; 248 if (ret)
334 } 249 error = true;
335 } 250 }
336 return error; 251 return error;
337} 252}
@@ -601,6 +516,11 @@ static int setcolreg(struct drm_crtc *crtc, u16 red, u16 green,
601 value = (red << info->var.red.offset) | 516 value = (red << info->var.red.offset) |
602 (green << info->var.green.offset) | 517 (green << info->var.green.offset) |
603 (blue << info->var.blue.offset); 518 (blue << info->var.blue.offset);
519 if (info->var.transp.length > 0) {
520 u32 mask = (1 << info->var.transp.length) - 1;
521 mask <<= info->var.transp.offset;
522 value |= mask;
523 }
604 palette[regno] = value; 524 palette[regno] = value;
605 return 0; 525 return 0;
606 } 526 }
@@ -646,7 +566,7 @@ int drm_fb_helper_setcmap(struct fb_cmap *cmap, struct fb_info *info)
646 struct drm_crtc_helper_funcs *crtc_funcs; 566 struct drm_crtc_helper_funcs *crtc_funcs;
647 u16 *red, *green, *blue, *transp; 567 u16 *red, *green, *blue, *transp;
648 struct drm_crtc *crtc; 568 struct drm_crtc *crtc;
649 int i, rc = 0; 569 int i, j, rc = 0;
650 int start; 570 int start;
651 571
652 for (i = 0; i < fb_helper->crtc_count; i++) { 572 for (i = 0; i < fb_helper->crtc_count; i++) {
@@ -659,7 +579,7 @@ int drm_fb_helper_setcmap(struct fb_cmap *cmap, struct fb_info *info)
659 transp = cmap->transp; 579 transp = cmap->transp;
660 start = cmap->start; 580 start = cmap->start;
661 581
662 for (i = 0; i < cmap->len; i++) { 582 for (j = 0; j < cmap->len; j++) {
663 u16 hred, hgreen, hblue, htransp = 0xffff; 583 u16 hred, hgreen, hblue, htransp = 0xffff;
664 584
665 hred = *red++; 585 hred = *red++;
@@ -857,7 +777,7 @@ int drm_fb_helper_single_fb_probe(struct drm_fb_helper *fb_helper,
857 /* first up get a count of crtcs now in use and new min/maxes width/heights */ 777 /* first up get a count of crtcs now in use and new min/maxes width/heights */
858 for (i = 0; i < fb_helper->connector_count; i++) { 778 for (i = 0; i < fb_helper->connector_count; i++) {
859 struct drm_fb_helper_connector *fb_helper_conn = fb_helper->connector_info[i]; 779 struct drm_fb_helper_connector *fb_helper_conn = fb_helper->connector_info[i];
860 struct drm_fb_helper_cmdline_mode *cmdline_mode; 780 struct drm_cmdline_mode *cmdline_mode;
861 781
862 cmdline_mode = &fb_helper_conn->cmdline_mode; 782 cmdline_mode = &fb_helper_conn->cmdline_mode;
863 783
@@ -959,6 +879,8 @@ void drm_fb_helper_fill_fix(struct fb_info *info, uint32_t pitch,
959 info->fix.type = FB_TYPE_PACKED_PIXELS; 879 info->fix.type = FB_TYPE_PACKED_PIXELS;
960 info->fix.visual = depth == 8 ? FB_VISUAL_PSEUDOCOLOR : 880 info->fix.visual = depth == 8 ? FB_VISUAL_PSEUDOCOLOR :
961 FB_VISUAL_TRUECOLOR; 881 FB_VISUAL_TRUECOLOR;
882 info->fix.mmio_start = 0;
883 info->fix.mmio_len = 0;
962 info->fix.type_aux = 0; 884 info->fix.type_aux = 0;
963 info->fix.xpanstep = 1; /* doing it in hw */ 885 info->fix.xpanstep = 1; /* doing it in hw */
964 info->fix.ypanstep = 1; /* doing it in hw */ 886 info->fix.ypanstep = 1; /* doing it in hw */
@@ -979,6 +901,7 @@ void drm_fb_helper_fill_var(struct fb_info *info, struct drm_fb_helper *fb_helpe
979 info->var.xres_virtual = fb->width; 901 info->var.xres_virtual = fb->width;
980 info->var.yres_virtual = fb->height; 902 info->var.yres_virtual = fb->height;
981 info->var.bits_per_pixel = fb->bits_per_pixel; 903 info->var.bits_per_pixel = fb->bits_per_pixel;
904 info->var.accel_flags = FB_ACCELF_TEXT;
982 info->var.xoffset = 0; 905 info->var.xoffset = 0;
983 info->var.yoffset = 0; 906 info->var.yoffset = 0;
984 info->var.activate = FB_ACTIVATE_NOW; 907 info->var.activate = FB_ACTIVATE_NOW;
@@ -1076,7 +999,7 @@ static struct drm_display_mode *drm_has_preferred_mode(struct drm_fb_helper_conn
1076 999
1077static bool drm_has_cmdline_mode(struct drm_fb_helper_connector *fb_connector) 1000static bool drm_has_cmdline_mode(struct drm_fb_helper_connector *fb_connector)
1078{ 1001{
1079 struct drm_fb_helper_cmdline_mode *cmdline_mode; 1002 struct drm_cmdline_mode *cmdline_mode;
1080 cmdline_mode = &fb_connector->cmdline_mode; 1003 cmdline_mode = &fb_connector->cmdline_mode;
1081 return cmdline_mode->specified; 1004 return cmdline_mode->specified;
1082} 1005}
@@ -1084,7 +1007,7 @@ static bool drm_has_cmdline_mode(struct drm_fb_helper_connector *fb_connector)
1084static struct drm_display_mode *drm_pick_cmdline_mode(struct drm_fb_helper_connector *fb_helper_conn, 1007static struct drm_display_mode *drm_pick_cmdline_mode(struct drm_fb_helper_connector *fb_helper_conn,
1085 int width, int height) 1008 int width, int height)
1086{ 1009{
1087 struct drm_fb_helper_cmdline_mode *cmdline_mode; 1010 struct drm_cmdline_mode *cmdline_mode;
1088 struct drm_display_mode *mode = NULL; 1011 struct drm_display_mode *mode = NULL;
1089 1012
1090 cmdline_mode = &fb_helper_conn->cmdline_mode; 1013 cmdline_mode = &fb_helper_conn->cmdline_mode;
@@ -1116,19 +1039,8 @@ static struct drm_display_mode *drm_pick_cmdline_mode(struct drm_fb_helper_conne
1116 } 1039 }
1117 1040
1118create_mode: 1041create_mode:
1119 if (cmdline_mode->cvt) 1042 mode = drm_mode_create_from_cmdline_mode(fb_helper_conn->connector->dev,
1120 mode = drm_cvt_mode(fb_helper_conn->connector->dev, 1043 cmdline_mode);
1121 cmdline_mode->xres, cmdline_mode->yres,
1122 cmdline_mode->refresh_specified ? cmdline_mode->refresh : 60,
1123 cmdline_mode->rb, cmdline_mode->interlace,
1124 cmdline_mode->margins);
1125 else
1126 mode = drm_gtf_mode(fb_helper_conn->connector->dev,
1127 cmdline_mode->xres, cmdline_mode->yres,
1128 cmdline_mode->refresh_specified ? cmdline_mode->refresh : 60,
1129 cmdline_mode->interlace,
1130 cmdline_mode->margins);
1131 drm_mode_set_crtcinfo(mode, CRTC_INTERLACE_HALVE_V);
1132 list_add(&mode->head, &fb_helper_conn->connector->modes); 1044 list_add(&mode->head, &fb_helper_conn->connector->modes);
1133 return mode; 1045 return mode;
1134} 1046}
@@ -1469,17 +1381,33 @@ bool drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper, int bpp_sel)
1469} 1381}
1470EXPORT_SYMBOL(drm_fb_helper_initial_config); 1382EXPORT_SYMBOL(drm_fb_helper_initial_config);
1471 1383
1472bool drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper) 1384/**
1385 * drm_fb_helper_hotplug_event - respond to a hotplug notification by
1386 * probing all the outputs attached to the fb.
1387 * @fb_helper: the drm_fb_helper
1388 *
1389 * LOCKING:
1390 * Called at runtime, must take mode config lock.
1391 *
1392 * Scan the connectors attached to the fb_helper and try to put together a
1393 * setup after *notification of a change in output configuration.
1394 *
1395 * RETURNS:
1396 * 0 on success and a non-zero error code otherwise.
1397 */
1398int drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper)
1473{ 1399{
1400 struct drm_device *dev = fb_helper->dev;
1474 int count = 0; 1401 int count = 0;
1475 u32 max_width, max_height, bpp_sel; 1402 u32 max_width, max_height, bpp_sel;
1476 bool bound = false, crtcs_bound = false; 1403 bool bound = false, crtcs_bound = false;
1477 struct drm_crtc *crtc; 1404 struct drm_crtc *crtc;
1478 1405
1479 if (!fb_helper->fb) 1406 if (!fb_helper->fb)
1480 return false; 1407 return 0;
1481 1408
1482 list_for_each_entry(crtc, &fb_helper->dev->mode_config.crtc_list, head) { 1409 mutex_lock(&dev->mode_config.mutex);
1410 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
1483 if (crtc->fb) 1411 if (crtc->fb)
1484 crtcs_bound = true; 1412 crtcs_bound = true;
1485 if (crtc->fb == fb_helper->fb) 1413 if (crtc->fb == fb_helper->fb)
@@ -1488,7 +1416,8 @@ bool drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper)
1488 1416
1489 if (!bound && crtcs_bound) { 1417 if (!bound && crtcs_bound) {
1490 fb_helper->delayed_hotplug = true; 1418 fb_helper->delayed_hotplug = true;
1491 return false; 1419 mutex_unlock(&dev->mode_config.mutex);
1420 return 0;
1492 } 1421 }
1493 DRM_DEBUG_KMS("\n"); 1422 DRM_DEBUG_KMS("\n");
1494 1423
@@ -1499,8 +1428,30 @@ bool drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper)
1499 count = drm_fb_helper_probe_connector_modes(fb_helper, max_width, 1428 count = drm_fb_helper_probe_connector_modes(fb_helper, max_width,
1500 max_height); 1429 max_height);
1501 drm_setup_crtcs(fb_helper); 1430 drm_setup_crtcs(fb_helper);
1431 mutex_unlock(&dev->mode_config.mutex);
1502 1432
1503 return drm_fb_helper_single_fb_probe(fb_helper, bpp_sel); 1433 return drm_fb_helper_single_fb_probe(fb_helper, bpp_sel);
1504} 1434}
1505EXPORT_SYMBOL(drm_fb_helper_hotplug_event); 1435EXPORT_SYMBOL(drm_fb_helper_hotplug_event);
1506 1436
1437/* The Kconfig DRM_KMS_HELPER selects FRAMEBUFFER_CONSOLE (if !EXPERT)
1438 * but the module doesn't depend on any fb console symbols. At least
1439 * attempt to load fbcon to avoid leaving the system without a usable console.
1440 */
1441#if defined(CONFIG_FRAMEBUFFER_CONSOLE_MODULE) && !defined(CONFIG_EXPERT)
1442static int __init drm_fb_helper_modinit(void)
1443{
1444 const char *name = "fbcon";
1445 struct module *fbcon;
1446
1447 mutex_lock(&module_mutex);
1448 fbcon = find_module(name);
1449 mutex_unlock(&module_mutex);
1450
1451 if (!fbcon)
1452 request_module_nowait(name);
1453 return 0;
1454}
1455
1456module_init(drm_fb_helper_modinit);
1457#endif
diff --git a/drivers/gpu/drm/drm_fops.c b/drivers/gpu/drm/drm_fops.c
index b744dad5c237..2ec7d48fc4a8 100644
--- a/drivers/gpu/drm/drm_fops.c
+++ b/drivers/gpu/drm/drm_fops.c
@@ -37,7 +37,6 @@
37#include "drmP.h" 37#include "drmP.h"
38#include <linux/poll.h> 38#include <linux/poll.h>
39#include <linux/slab.h> 39#include <linux/slab.h>
40#include <linux/smp_lock.h>
41 40
42/* from BKL pushdown: note that nothing else serializes idr_find() */ 41/* from BKL pushdown: note that nothing else serializes idr_find() */
43DEFINE_MUTEX(drm_global_mutex); 42DEFINE_MUTEX(drm_global_mutex);
@@ -237,6 +236,8 @@ static int drm_open_helper(struct inode *inode, struct file *filp,
237 return -EBUSY; /* No exclusive opens */ 236 return -EBUSY; /* No exclusive opens */
238 if (!drm_cpu_valid()) 237 if (!drm_cpu_valid())
239 return -EINVAL; 238 return -EINVAL;
239 if (dev->switch_power_state != DRM_SWITCH_POWER_ON)
240 return -EINVAL;
240 241
241 DRM_DEBUG("pid = %d, minor = %d\n", task_pid_nr(current), minor_id); 242 DRM_DEBUG("pid = %d, minor = %d\n", task_pid_nr(current), minor_id);
242 243
diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c
index 5663d2719063..4012fe423460 100644
--- a/drivers/gpu/drm/drm_gem.c
+++ b/drivers/gpu/drm/drm_gem.c
@@ -34,6 +34,7 @@
34#include <linux/module.h> 34#include <linux/module.h>
35#include <linux/mman.h> 35#include <linux/mman.h>
36#include <linux/pagemap.h> 36#include <linux/pagemap.h>
37#include <linux/shmem_fs.h>
37#include "drmP.h" 38#include "drmP.h"
38 39
39/** @file drm_gem.c 40/** @file drm_gem.c
@@ -92,12 +93,6 @@ drm_gem_init(struct drm_device *dev)
92 93
93 spin_lock_init(&dev->object_name_lock); 94 spin_lock_init(&dev->object_name_lock);
94 idr_init(&dev->object_name_idr); 95 idr_init(&dev->object_name_idr);
95 atomic_set(&dev->object_count, 0);
96 atomic_set(&dev->object_memory, 0);
97 atomic_set(&dev->pin_count, 0);
98 atomic_set(&dev->pin_memory, 0);
99 atomic_set(&dev->gtt_count, 0);
100 atomic_set(&dev->gtt_memory, 0);
101 96
102 mm = kzalloc(sizeof(struct drm_gem_mm), GFP_KERNEL); 97 mm = kzalloc(sizeof(struct drm_gem_mm), GFP_KERNEL);
103 if (!mm) { 98 if (!mm) {
@@ -107,7 +102,7 @@ drm_gem_init(struct drm_device *dev)
107 102
108 dev->mm_private = mm; 103 dev->mm_private = mm;
109 104
110 if (drm_ht_create(&mm->offset_hash, 19)) { 105 if (drm_ht_create(&mm->offset_hash, 12)) {
111 kfree(mm); 106 kfree(mm);
112 return -ENOMEM; 107 return -ENOMEM;
113 } 108 }
@@ -151,9 +146,6 @@ int drm_gem_object_init(struct drm_device *dev,
151 atomic_set(&obj->handle_count, 0); 146 atomic_set(&obj->handle_count, 0);
152 obj->size = size; 147 obj->size = size;
153 148
154 atomic_inc(&dev->object_count);
155 atomic_add(obj->size, &dev->object_memory);
156
157 return 0; 149 return 0;
158} 150}
159EXPORT_SYMBOL(drm_gem_object_init); 151EXPORT_SYMBOL(drm_gem_object_init);
@@ -180,8 +172,6 @@ drm_gem_object_alloc(struct drm_device *dev, size_t size)
180 return obj; 172 return obj;
181fput: 173fput:
182 /* Object_init mangles the global counters - readjust them. */ 174 /* Object_init mangles the global counters - readjust them. */
183 atomic_dec(&dev->object_count);
184 atomic_sub(obj->size, &dev->object_memory);
185 fput(obj->filp); 175 fput(obj->filp);
186free: 176free:
187 kfree(obj); 177 kfree(obj);
@@ -192,7 +182,7 @@ EXPORT_SYMBOL(drm_gem_object_alloc);
192/** 182/**
193 * Removes the mapping from handle to filp for this object. 183 * Removes the mapping from handle to filp for this object.
194 */ 184 */
195static int 185int
196drm_gem_handle_delete(struct drm_file *filp, u32 handle) 186drm_gem_handle_delete(struct drm_file *filp, u32 handle)
197{ 187{
198 struct drm_device *dev; 188 struct drm_device *dev;
@@ -225,6 +215,7 @@ drm_gem_handle_delete(struct drm_file *filp, u32 handle)
225 215
226 return 0; 216 return 0;
227} 217}
218EXPORT_SYMBOL(drm_gem_handle_delete);
228 219
229/** 220/**
230 * Create a handle for this object. This adds a handle reference 221 * Create a handle for this object. This adds a handle reference
@@ -436,10 +427,7 @@ drm_gem_release(struct drm_device *dev, struct drm_file *file_private)
436void 427void
437drm_gem_object_release(struct drm_gem_object *obj) 428drm_gem_object_release(struct drm_gem_object *obj)
438{ 429{
439 struct drm_device *dev = obj->dev;
440 fput(obj->filp); 430 fput(obj->filp);
441 atomic_dec(&dev->object_count);
442 atomic_sub(obj->size, &dev->object_memory);
443} 431}
444EXPORT_SYMBOL(drm_gem_object_release); 432EXPORT_SYMBOL(drm_gem_object_release);
445 433
@@ -512,11 +500,12 @@ EXPORT_SYMBOL(drm_gem_vm_open);
512void drm_gem_vm_close(struct vm_area_struct *vma) 500void drm_gem_vm_close(struct vm_area_struct *vma)
513{ 501{
514 struct drm_gem_object *obj = vma->vm_private_data; 502 struct drm_gem_object *obj = vma->vm_private_data;
503 struct drm_device *dev = obj->dev;
515 504
516 mutex_lock(&obj->dev->struct_mutex); 505 mutex_lock(&dev->struct_mutex);
517 drm_vm_close_locked(vma); 506 drm_vm_close_locked(vma);
518 drm_gem_object_unreference(obj); 507 drm_gem_object_unreference(obj);
519 mutex_unlock(&obj->dev->struct_mutex); 508 mutex_unlock(&dev->struct_mutex);
520} 509}
521EXPORT_SYMBOL(drm_gem_vm_close); 510EXPORT_SYMBOL(drm_gem_vm_close);
522 511
diff --git a/drivers/gpu/drm/drm_hashtab.c b/drivers/gpu/drm/drm_hashtab.c
index a93d7b4ddaa6..e3a75688f3cd 100644
--- a/drivers/gpu/drm/drm_hashtab.c
+++ b/drivers/gpu/drm/drm_hashtab.c
@@ -39,27 +39,18 @@
39 39
40int drm_ht_create(struct drm_open_hash *ht, unsigned int order) 40int drm_ht_create(struct drm_open_hash *ht, unsigned int order)
41{ 41{
42 unsigned int i; 42 unsigned int size = 1 << order;
43 43
44 ht->size = 1 << order;
45 ht->order = order; 44 ht->order = order;
46 ht->fill = 0;
47 ht->table = NULL; 45 ht->table = NULL;
48 ht->use_vmalloc = ((ht->size * sizeof(*ht->table)) > PAGE_SIZE); 46 if (size <= PAGE_SIZE / sizeof(*ht->table))
49 if (!ht->use_vmalloc) { 47 ht->table = kcalloc(size, sizeof(*ht->table), GFP_KERNEL);
50 ht->table = kcalloc(ht->size, sizeof(*ht->table), GFP_KERNEL); 48 else
51 } 49 ht->table = vzalloc(size*sizeof(*ht->table));
52 if (!ht->table) {
53 ht->use_vmalloc = 1;
54 ht->table = vmalloc(ht->size*sizeof(*ht->table));
55 }
56 if (!ht->table) { 50 if (!ht->table) {
57 DRM_ERROR("Out of memory for hash table\n"); 51 DRM_ERROR("Out of memory for hash table\n");
58 return -ENOMEM; 52 return -ENOMEM;
59 } 53 }
60 for (i=0; i< ht->size; ++i) {
61 INIT_HLIST_HEAD(&ht->table[i]);
62 }
63 return 0; 54 return 0;
64} 55}
65EXPORT_SYMBOL(drm_ht_create); 56EXPORT_SYMBOL(drm_ht_create);
@@ -180,7 +171,6 @@ int drm_ht_remove_key(struct drm_open_hash *ht, unsigned long key)
180 list = drm_ht_find_key(ht, key); 171 list = drm_ht_find_key(ht, key);
181 if (list) { 172 if (list) {
182 hlist_del_init(list); 173 hlist_del_init(list);
183 ht->fill--;
184 return 0; 174 return 0;
185 } 175 }
186 return -EINVAL; 176 return -EINVAL;
@@ -189,7 +179,6 @@ int drm_ht_remove_key(struct drm_open_hash *ht, unsigned long key)
189int drm_ht_remove_item(struct drm_open_hash *ht, struct drm_hash_item *item) 179int drm_ht_remove_item(struct drm_open_hash *ht, struct drm_hash_item *item)
190{ 180{
191 hlist_del_init(&item->head); 181 hlist_del_init(&item->head);
192 ht->fill--;
193 return 0; 182 return 0;
194} 183}
195EXPORT_SYMBOL(drm_ht_remove_item); 184EXPORT_SYMBOL(drm_ht_remove_item);
@@ -197,10 +186,10 @@ EXPORT_SYMBOL(drm_ht_remove_item);
197void drm_ht_remove(struct drm_open_hash *ht) 186void drm_ht_remove(struct drm_open_hash *ht)
198{ 187{
199 if (ht->table) { 188 if (ht->table) {
200 if (ht->use_vmalloc) 189 if ((PAGE_SIZE / sizeof(*ht->table)) >> ht->order)
201 vfree(ht->table);
202 else
203 kfree(ht->table); 190 kfree(ht->table);
191 else
192 vfree(ht->table);
204 ht->table = NULL; 193 ht->table = NULL;
205 } 194 }
206} 195}
diff --git a/drivers/gpu/drm/drm_info.c b/drivers/gpu/drm/drm_info.c
index 974e970ce3f8..ab1162da70f8 100644
--- a/drivers/gpu/drm/drm_info.c
+++ b/drivers/gpu/drm/drm_info.c
@@ -47,30 +47,19 @@ int drm_name_info(struct seq_file *m, void *data)
47 struct drm_minor *minor = node->minor; 47 struct drm_minor *minor = node->minor;
48 struct drm_device *dev = minor->dev; 48 struct drm_device *dev = minor->dev;
49 struct drm_master *master = minor->master; 49 struct drm_master *master = minor->master;
50 50 const char *bus_name;
51 if (!master) 51 if (!master)
52 return 0; 52 return 0;
53 53
54 if (drm_core_check_feature(dev, DRIVER_USE_PLATFORM_DEVICE)) { 54 bus_name = dev->driver->bus->get_name(dev);
55 if (master->unique) { 55 if (master->unique) {
56 seq_printf(m, "%s %s %s\n", 56 seq_printf(m, "%s %s %s\n",
57 dev->driver->platform_device->name, 57 bus_name,
58 dev_name(dev->dev), master->unique); 58 dev_name(dev->dev), master->unique);
59 } else {
60 seq_printf(m, "%s\n",
61 dev->driver->platform_device->name);
62 }
63 } else { 59 } else {
64 if (master->unique) { 60 seq_printf(m, "%s %s\n",
65 seq_printf(m, "%s %s %s\n", 61 bus_name, dev_name(dev->dev));
66 dev->driver->pci_driver.name,
67 dev_name(dev->dev), master->unique);
68 } else {
69 seq_printf(m, "%s %s\n", dev->driver->pci_driver.name,
70 dev_name(dev->dev));
71 }
72 } 62 }
73
74 return 0; 63 return 0;
75} 64}
76 65
@@ -270,20 +259,6 @@ int drm_gem_name_info(struct seq_file *m, void *data)
270 return 0; 259 return 0;
271} 260}
272 261
273int drm_gem_object_info(struct seq_file *m, void* data)
274{
275 struct drm_info_node *node = (struct drm_info_node *) m->private;
276 struct drm_device *dev = node->minor->dev;
277
278 seq_printf(m, "%d objects\n", atomic_read(&dev->object_count));
279 seq_printf(m, "%d object bytes\n", atomic_read(&dev->object_memory));
280 seq_printf(m, "%d pinned\n", atomic_read(&dev->pin_count));
281 seq_printf(m, "%d pin bytes\n", atomic_read(&dev->pin_memory));
282 seq_printf(m, "%d gtt bytes\n", atomic_read(&dev->gtt_memory));
283 seq_printf(m, "%d gtt total\n", dev->gtt_total);
284 return 0;
285}
286
287#if DRM_DEBUG_CODE 262#if DRM_DEBUG_CODE
288 263
289int drm_vma_info(struct seq_file *m, void *data) 264int drm_vma_info(struct seq_file *m, void *data)
@@ -297,17 +272,18 @@ int drm_vma_info(struct seq_file *m, void *data)
297#endif 272#endif
298 273
299 mutex_lock(&dev->struct_mutex); 274 mutex_lock(&dev->struct_mutex);
300 seq_printf(m, "vma use count: %d, high_memory = %p, 0x%08llx\n", 275 seq_printf(m, "vma use count: %d, high_memory = %pK, 0x%pK\n",
301 atomic_read(&dev->vma_count), 276 atomic_read(&dev->vma_count),
302 high_memory, (u64)virt_to_phys(high_memory)); 277 high_memory, (void *)virt_to_phys(high_memory));
303 278
304 list_for_each_entry(pt, &dev->vmalist, head) { 279 list_for_each_entry(pt, &dev->vmalist, head) {
305 vma = pt->vma; 280 vma = pt->vma;
306 if (!vma) 281 if (!vma)
307 continue; 282 continue;
308 seq_printf(m, 283 seq_printf(m,
309 "\n%5d 0x%08lx-0x%08lx %c%c%c%c%c%c 0x%08lx000", 284 "\n%5d 0x%pK-0x%pK %c%c%c%c%c%c 0x%08lx000",
310 pt->pid, vma->vm_start, vma->vm_end, 285 pt->pid,
286 (void *)vma->vm_start, (void *)vma->vm_end,
311 vma->vm_flags & VM_READ ? 'r' : '-', 287 vma->vm_flags & VM_READ ? 'r' : '-',
312 vma->vm_flags & VM_WRITE ? 'w' : '-', 288 vma->vm_flags & VM_WRITE ? 'w' : '-',
313 vma->vm_flags & VM_EXEC ? 'x' : '-', 289 vma->vm_flags & VM_EXEC ? 'x' : '-',
diff --git a/drivers/gpu/drm/drm_ioc32.c b/drivers/gpu/drm/drm_ioc32.c
index d61d185cf040..4a058c7af6c0 100644
--- a/drivers/gpu/drm/drm_ioc32.c
+++ b/drivers/gpu/drm/drm_ioc32.c
@@ -28,6 +28,7 @@
28 * IN THE SOFTWARE. 28 * IN THE SOFTWARE.
29 */ 29 */
30#include <linux/compat.h> 30#include <linux/compat.h>
31#include <linux/ratelimit.h>
31 32
32#include "drmP.h" 33#include "drmP.h"
33#include "drm_core.h" 34#include "drm_core.h"
@@ -253,10 +254,10 @@ static int compat_drm_addmap(struct file *file, unsigned int cmd,
253 return -EFAULT; 254 return -EFAULT;
254 255
255 m32.handle = (unsigned long)handle; 256 m32.handle = (unsigned long)handle;
256 if (m32.handle != (unsigned long)handle && printk_ratelimit()) 257 if (m32.handle != (unsigned long)handle)
257 printk(KERN_ERR "compat_drm_addmap truncated handle" 258 printk_ratelimited(KERN_ERR "compat_drm_addmap truncated handle"
258 " %p for type %d offset %x\n", 259 " %p for type %d offset %x\n",
259 handle, m32.type, m32.offset); 260 handle, m32.type, m32.offset);
260 261
261 if (copy_to_user(argp, &m32, sizeof(m32))) 262 if (copy_to_user(argp, &m32, sizeof(m32)))
262 return -EFAULT; 263 return -EFAULT;
diff --git a/drivers/gpu/drm/drm_ioctl.c b/drivers/gpu/drm/drm_ioctl.c
index 47db4df37a69..904d7e9c8e47 100644
--- a/drivers/gpu/drm/drm_ioctl.c
+++ b/drivers/gpu/drm/drm_ioctl.c
@@ -96,7 +96,7 @@ int drm_setunique(struct drm_device *dev, void *data,
96{ 96{
97 struct drm_unique *u = data; 97 struct drm_unique *u = data;
98 struct drm_master *master = file_priv->master; 98 struct drm_master *master = file_priv->master;
99 int domain, bus, slot, func, ret; 99 int ret;
100 100
101 if (master->unique_len || master->unique) 101 if (master->unique_len || master->unique)
102 return -EBUSY; 102 return -EBUSY;
@@ -104,50 +104,12 @@ int drm_setunique(struct drm_device *dev, void *data,
104 if (!u->unique_len || u->unique_len > 1024) 104 if (!u->unique_len || u->unique_len > 1024)
105 return -EINVAL; 105 return -EINVAL;
106 106
107 master->unique_len = u->unique_len; 107 if (!dev->driver->bus->set_unique)
108 master->unique_size = u->unique_len + 1; 108 return -EINVAL;
109 master->unique = kmalloc(master->unique_size, GFP_KERNEL);
110 if (!master->unique) {
111 ret = -ENOMEM;
112 goto err;
113 }
114
115 if (copy_from_user(master->unique, u->unique, master->unique_len)) {
116 ret = -EFAULT;
117 goto err;
118 }
119
120 master->unique[master->unique_len] = '\0';
121
122 dev->devname = kmalloc(strlen(dev->driver->pci_driver.name) +
123 strlen(master->unique) + 2, GFP_KERNEL);
124 if (!dev->devname) {
125 ret = -ENOMEM;
126 goto err;
127 }
128
129 sprintf(dev->devname, "%s@%s", dev->driver->pci_driver.name,
130 master->unique);
131 109
132 /* Return error if the busid submitted doesn't match the device's actual 110 ret = dev->driver->bus->set_unique(dev, master, u);
133 * busid. 111 if (ret)
134 */
135 ret = sscanf(master->unique, "PCI:%d:%d:%d", &bus, &slot, &func);
136 if (ret != 3) {
137 ret = -EINVAL;
138 goto err; 112 goto err;
139 }
140
141 domain = bus >> 8;
142 bus &= 0xff;
143
144 if ((domain != drm_get_pci_domain(dev)) ||
145 (bus != dev->pdev->bus->number) ||
146 (slot != PCI_SLOT(dev->pdev->devfn)) ||
147 (func != PCI_FUNC(dev->pdev->devfn))) {
148 ret = -EINVAL;
149 goto err;
150 }
151 113
152 return 0; 114 return 0;
153 115
@@ -159,74 +121,15 @@ err:
159static int drm_set_busid(struct drm_device *dev, struct drm_file *file_priv) 121static int drm_set_busid(struct drm_device *dev, struct drm_file *file_priv)
160{ 122{
161 struct drm_master *master = file_priv->master; 123 struct drm_master *master = file_priv->master;
162 int len, ret; 124 int ret;
163 125
164 if (master->unique != NULL) 126 if (master->unique != NULL)
165 drm_unset_busid(dev, master); 127 drm_unset_busid(dev, master);
166 128
167 if (drm_core_check_feature(dev, DRIVER_USE_PLATFORM_DEVICE)) { 129 ret = dev->driver->bus->set_busid(dev, master);
168 master->unique_len = 10 + strlen(dev->platformdev->name); 130 if (ret)
169 master->unique = kmalloc(master->unique_len + 1, GFP_KERNEL); 131 goto err;
170
171 if (master->unique == NULL)
172 return -ENOMEM;
173
174 len = snprintf(master->unique, master->unique_len,
175 "platform:%s", dev->platformdev->name);
176
177 if (len > master->unique_len) {
178 DRM_ERROR("Unique buffer overflowed\n");
179 ret = -EINVAL;
180 goto err;
181 }
182
183 dev->devname =
184 kmalloc(strlen(dev->platformdev->name) +
185 master->unique_len + 2, GFP_KERNEL);
186
187 if (dev->devname == NULL) {
188 ret = -ENOMEM;
189 goto err;
190 }
191
192 sprintf(dev->devname, "%s@%s", dev->platformdev->name,
193 master->unique);
194
195 } else {
196 master->unique_len = 40;
197 master->unique_size = master->unique_len;
198 master->unique = kmalloc(master->unique_size, GFP_KERNEL);
199 if (master->unique == NULL)
200 return -ENOMEM;
201
202 len = snprintf(master->unique, master->unique_len,
203 "pci:%04x:%02x:%02x.%d",
204 drm_get_pci_domain(dev),
205 dev->pdev->bus->number,
206 PCI_SLOT(dev->pdev->devfn),
207 PCI_FUNC(dev->pdev->devfn));
208 if (len >= master->unique_len) {
209 DRM_ERROR("buffer overflow");
210 ret = -EINVAL;
211 goto err;
212 } else
213 master->unique_len = len;
214
215 dev->devname =
216 kmalloc(strlen(dev->driver->pci_driver.name) +
217 master->unique_len + 2, GFP_KERNEL);
218
219 if (dev->devname == NULL) {
220 ret = -ENOMEM;
221 goto err;
222 }
223
224 sprintf(dev->devname, "%s@%s", dev->driver->pci_driver.name,
225 master->unique);
226 }
227
228 return 0; 132 return 0;
229
230err: 133err:
231 drm_unset_busid(dev, master); 134 drm_unset_busid(dev, master);
232 return ret; 135 return ret;
@@ -365,6 +268,28 @@ int drm_getstats(struct drm_device *dev, void *data,
365} 268}
366 269
367/** 270/**
271 * Get device/driver capabilities
272 */
273int drm_getcap(struct drm_device *dev, void *data, struct drm_file *file_priv)
274{
275 struct drm_get_cap *req = data;
276
277 req->value = 0;
278 switch (req->capability) {
279 case DRM_CAP_DUMB_BUFFER:
280 if (dev->driver->dumb_create)
281 req->value = 1;
282 break;
283 case DRM_CAP_VBLANK_HIGH_CRTC:
284 req->value = 1;
285 break;
286 default:
287 return -EINVAL;
288 }
289 return 0;
290}
291
292/**
368 * Setversion ioctl. 293 * Setversion ioctl.
369 * 294 *
370 * \param inode device inode. 295 * \param inode device inode.
diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c
index 9d3a5030b6e1..2022a5c966bb 100644
--- a/drivers/gpu/drm/drm_irq.c
+++ b/drivers/gpu/drm/drm_irq.c
@@ -40,6 +40,22 @@
40#include <linux/slab.h> 40#include <linux/slab.h>
41 41
42#include <linux/vgaarb.h> 42#include <linux/vgaarb.h>
43
44/* Access macro for slots in vblank timestamp ringbuffer. */
45#define vblanktimestamp(dev, crtc, count) ( \
46 (dev)->_vblank_time[(crtc) * DRM_VBLANKTIME_RBSIZE + \
47 ((count) % DRM_VBLANKTIME_RBSIZE)])
48
49/* Retry timestamp calculation up to 3 times to satisfy
50 * drm_timestamp_precision before giving up.
51 */
52#define DRM_TIMESTAMP_MAXRETRIES 3
53
54/* Threshold in nanoseconds for detection of redundant
55 * vblank irq in drm_handle_vblank(). 1 msec should be ok.
56 */
57#define DRM_REDUNDANT_VBLIRQ_THRESH_NS 1000000
58
43/** 59/**
44 * Get interrupt from bus id. 60 * Get interrupt from bus id.
45 * 61 *
@@ -58,23 +74,96 @@ int drm_irq_by_busid(struct drm_device *dev, void *data,
58{ 74{
59 struct drm_irq_busid *p = data; 75 struct drm_irq_busid *p = data;
60 76
61 if (drm_core_check_feature(dev, DRIVER_USE_PLATFORM_DEVICE)) 77 if (!dev->driver->bus->irq_by_busid)
62 return -EINVAL; 78 return -EINVAL;
63 79
64 if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ)) 80 if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ))
65 return -EINVAL; 81 return -EINVAL;
66 82
67 if ((p->busnum >> 8) != drm_get_pci_domain(dev) || 83 return dev->driver->bus->irq_by_busid(dev, p);
68 (p->busnum & 0xff) != dev->pdev->bus->number || 84}
69 p->devnum != PCI_SLOT(dev->pdev->devfn) || p->funcnum != PCI_FUNC(dev->pdev->devfn))
70 return -EINVAL;
71 85
72 p->irq = dev->pdev->irq; 86/*
87 * Clear vblank timestamp buffer for a crtc.
88 */
89static void clear_vblank_timestamps(struct drm_device *dev, int crtc)
90{
91 memset(&dev->_vblank_time[crtc * DRM_VBLANKTIME_RBSIZE], 0,
92 DRM_VBLANKTIME_RBSIZE * sizeof(struct timeval));
93}
73 94
74 DRM_DEBUG("%d:%d:%d => IRQ %d\n", p->busnum, p->devnum, p->funcnum, 95/*
75 p->irq); 96 * Disable vblank irq's on crtc, make sure that last vblank count
97 * of hardware and corresponding consistent software vblank counter
98 * are preserved, even if there are any spurious vblank irq's after
99 * disable.
100 */
101static void vblank_disable_and_save(struct drm_device *dev, int crtc)
102{
103 unsigned long irqflags;
104 u32 vblcount;
105 s64 diff_ns;
106 int vblrc;
107 struct timeval tvblank;
108
109 /* Prevent vblank irq processing while disabling vblank irqs,
110 * so no updates of timestamps or count can happen after we've
111 * disabled. Needed to prevent races in case of delayed irq's.
112 * Disable preemption, so vblank_time_lock is held as short as
113 * possible, even under a kernel with PREEMPT_RT patches.
114 */
115 preempt_disable();
116 spin_lock_irqsave(&dev->vblank_time_lock, irqflags);
76 117
77 return 0; 118 dev->driver->disable_vblank(dev, crtc);
119 dev->vblank_enabled[crtc] = 0;
120
121 /* No further vblank irq's will be processed after
122 * this point. Get current hardware vblank count and
123 * vblank timestamp, repeat until they are consistent.
124 *
125 * FIXME: There is still a race condition here and in
126 * drm_update_vblank_count() which can cause off-by-one
127 * reinitialization of software vblank counter. If gpu
128 * vblank counter doesn't increment exactly at the leading
129 * edge of a vblank interval, then we can lose 1 count if
130 * we happen to execute between start of vblank and the
131 * delayed gpu counter increment.
132 */
133 do {
134 dev->last_vblank[crtc] = dev->driver->get_vblank_counter(dev, crtc);
135 vblrc = drm_get_last_vbltimestamp(dev, crtc, &tvblank, 0);
136 } while (dev->last_vblank[crtc] != dev->driver->get_vblank_counter(dev, crtc));
137
138 /* Compute time difference to stored timestamp of last vblank
139 * as updated by last invocation of drm_handle_vblank() in vblank irq.
140 */
141 vblcount = atomic_read(&dev->_vblank_count[crtc]);
142 diff_ns = timeval_to_ns(&tvblank) -
143 timeval_to_ns(&vblanktimestamp(dev, crtc, vblcount));
144
145 /* If there is at least 1 msec difference between the last stored
146 * timestamp and tvblank, then we are currently executing our
147 * disable inside a new vblank interval, the tvblank timestamp
148 * corresponds to this new vblank interval and the irq handler
149 * for this vblank didn't run yet and won't run due to our disable.
150 * Therefore we need to do the job of drm_handle_vblank() and
151 * increment the vblank counter by one to account for this vblank.
152 *
153 * Skip this step if there isn't any high precision timestamp
154 * available. In that case we can't account for this and just
155 * hope for the best.
156 */
157 if ((vblrc > 0) && (abs64(diff_ns) > 1000000)) {
158 atomic_inc(&dev->_vblank_count[crtc]);
159 smp_mb__after_atomic_inc();
160 }
161
162 /* Invalidate all timestamps while vblank irq's are off. */
163 clear_vblank_timestamps(dev, crtc);
164
165 spin_unlock_irqrestore(&dev->vblank_time_lock, irqflags);
166 preempt_enable();
78} 167}
79 168
80static void vblank_disable_fn(unsigned long arg) 169static void vblank_disable_fn(unsigned long arg)
@@ -91,10 +180,7 @@ static void vblank_disable_fn(unsigned long arg)
91 if (atomic_read(&dev->vblank_refcount[i]) == 0 && 180 if (atomic_read(&dev->vblank_refcount[i]) == 0 &&
92 dev->vblank_enabled[i]) { 181 dev->vblank_enabled[i]) {
93 DRM_DEBUG("disabling vblank on crtc %d\n", i); 182 DRM_DEBUG("disabling vblank on crtc %d\n", i);
94 dev->last_vblank[i] = 183 vblank_disable_and_save(dev, i);
95 dev->driver->get_vblank_counter(dev, i);
96 dev->driver->disable_vblank(dev, i);
97 dev->vblank_enabled[i] = 0;
98 } 184 }
99 spin_unlock_irqrestore(&dev->vbl_lock, irqflags); 185 spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
100 } 186 }
@@ -117,6 +203,7 @@ void drm_vblank_cleanup(struct drm_device *dev)
117 kfree(dev->last_vblank); 203 kfree(dev->last_vblank);
118 kfree(dev->last_vblank_wait); 204 kfree(dev->last_vblank_wait);
119 kfree(dev->vblank_inmodeset); 205 kfree(dev->vblank_inmodeset);
206 kfree(dev->_vblank_time);
120 207
121 dev->num_crtcs = 0; 208 dev->num_crtcs = 0;
122} 209}
@@ -129,6 +216,8 @@ int drm_vblank_init(struct drm_device *dev, int num_crtcs)
129 setup_timer(&dev->vblank_disable_timer, vblank_disable_fn, 216 setup_timer(&dev->vblank_disable_timer, vblank_disable_fn,
130 (unsigned long)dev); 217 (unsigned long)dev);
131 spin_lock_init(&dev->vbl_lock); 218 spin_lock_init(&dev->vbl_lock);
219 spin_lock_init(&dev->vblank_time_lock);
220
132 dev->num_crtcs = num_crtcs; 221 dev->num_crtcs = num_crtcs;
133 222
134 dev->vbl_queue = kmalloc(sizeof(wait_queue_head_t) * num_crtcs, 223 dev->vbl_queue = kmalloc(sizeof(wait_queue_head_t) * num_crtcs,
@@ -161,6 +250,19 @@ int drm_vblank_init(struct drm_device *dev, int num_crtcs)
161 if (!dev->vblank_inmodeset) 250 if (!dev->vblank_inmodeset)
162 goto err; 251 goto err;
163 252
253 dev->_vblank_time = kcalloc(num_crtcs * DRM_VBLANKTIME_RBSIZE,
254 sizeof(struct timeval), GFP_KERNEL);
255 if (!dev->_vblank_time)
256 goto err;
257
258 DRM_INFO("Supports vblank timestamp caching Rev 1 (10.10.2010).\n");
259
260 /* Driver specific high-precision vblank timestamping supported? */
261 if (dev->driver->get_vblank_timestamp)
262 DRM_INFO("Driver supports precise vblank timestamp query.\n");
263 else
264 DRM_INFO("No driver support for vblank timestamp query.\n");
265
164 /* Zero per-crtc vblank stuff */ 266 /* Zero per-crtc vblank stuff */
165 for (i = 0; i < num_crtcs; i++) { 267 for (i = 0; i < num_crtcs; i++) {
166 init_waitqueue_head(&dev->vbl_queue[i]); 268 init_waitqueue_head(&dev->vbl_queue[i]);
@@ -279,7 +381,7 @@ EXPORT_SYMBOL(drm_irq_install);
279 * 381 *
280 * Calls the driver's \c drm_driver_irq_uninstall() function, and stops the irq. 382 * Calls the driver's \c drm_driver_irq_uninstall() function, and stops the irq.
281 */ 383 */
282int drm_irq_uninstall(struct drm_device * dev) 384int drm_irq_uninstall(struct drm_device *dev)
283{ 385{
284 unsigned long irqflags; 386 unsigned long irqflags;
285 int irq_enabled, i; 387 int irq_enabled, i;
@@ -335,7 +437,9 @@ int drm_control(struct drm_device *dev, void *data,
335{ 437{
336 struct drm_control *ctl = data; 438 struct drm_control *ctl = data;
337 439
338 /* if we haven't irq we fallback for compatibility reasons - this used to be a separate function in drm_dma.h */ 440 /* if we haven't irq we fallback for compatibility reasons -
441 * this used to be a separate function in drm_dma.h
442 */
339 443
340 444
341 switch (ctl->func) { 445 switch (ctl->func) {
@@ -360,6 +464,286 @@ int drm_control(struct drm_device *dev, void *data,
360} 464}
361 465
362/** 466/**
467 * drm_calc_timestamping_constants - Calculate and
468 * store various constants which are later needed by
469 * vblank and swap-completion timestamping, e.g, by
470 * drm_calc_vbltimestamp_from_scanoutpos().
471 * They are derived from crtc's true scanout timing,
472 * so they take things like panel scaling or other
473 * adjustments into account.
474 *
475 * @crtc drm_crtc whose timestamp constants should be updated.
476 *
477 */
478void drm_calc_timestamping_constants(struct drm_crtc *crtc)
479{
480 s64 linedur_ns = 0, pixeldur_ns = 0, framedur_ns = 0;
481 u64 dotclock;
482
483 /* Dot clock in Hz: */
484 dotclock = (u64) crtc->hwmode.clock * 1000;
485
486 /* Fields of interlaced scanout modes are only halve a frame duration.
487 * Double the dotclock to get halve the frame-/line-/pixelduration.
488 */
489 if (crtc->hwmode.flags & DRM_MODE_FLAG_INTERLACE)
490 dotclock *= 2;
491
492 /* Valid dotclock? */
493 if (dotclock > 0) {
494 /* Convert scanline length in pixels and video dot clock to
495 * line duration, frame duration and pixel duration in
496 * nanoseconds:
497 */
498 pixeldur_ns = (s64) div64_u64(1000000000, dotclock);
499 linedur_ns = (s64) div64_u64(((u64) crtc->hwmode.crtc_htotal *
500 1000000000), dotclock);
501 framedur_ns = (s64) crtc->hwmode.crtc_vtotal * linedur_ns;
502 } else
503 DRM_ERROR("crtc %d: Can't calculate constants, dotclock = 0!\n",
504 crtc->base.id);
505
506 crtc->pixeldur_ns = pixeldur_ns;
507 crtc->linedur_ns = linedur_ns;
508 crtc->framedur_ns = framedur_ns;
509
510 DRM_DEBUG("crtc %d: hwmode: htotal %d, vtotal %d, vdisplay %d\n",
511 crtc->base.id, crtc->hwmode.crtc_htotal,
512 crtc->hwmode.crtc_vtotal, crtc->hwmode.crtc_vdisplay);
513 DRM_DEBUG("crtc %d: clock %d kHz framedur %d linedur %d, pixeldur %d\n",
514 crtc->base.id, (int) dotclock/1000, (int) framedur_ns,
515 (int) linedur_ns, (int) pixeldur_ns);
516}
517EXPORT_SYMBOL(drm_calc_timestamping_constants);
518
519/**
520 * drm_calc_vbltimestamp_from_scanoutpos - helper routine for kms
521 * drivers. Implements calculation of exact vblank timestamps from
522 * given drm_display_mode timings and current video scanout position
523 * of a crtc. This can be called from within get_vblank_timestamp()
524 * implementation of a kms driver to implement the actual timestamping.
525 *
526 * Should return timestamps conforming to the OML_sync_control OpenML
527 * extension specification. The timestamp corresponds to the end of
528 * the vblank interval, aka start of scanout of topmost-leftmost display
529 * pixel in the following video frame.
530 *
531 * Requires support for optional dev->driver->get_scanout_position()
532 * in kms driver, plus a bit of setup code to provide a drm_display_mode
533 * that corresponds to the true scanout timing.
534 *
535 * The current implementation only handles standard video modes. It
536 * returns as no operation if a doublescan or interlaced video mode is
537 * active. Higher level code is expected to handle this.
538 *
539 * @dev: DRM device.
540 * @crtc: Which crtc's vblank timestamp to retrieve.
541 * @max_error: Desired maximum allowable error in timestamps (nanosecs).
542 * On return contains true maximum error of timestamp.
543 * @vblank_time: Pointer to struct timeval which should receive the timestamp.
544 * @flags: Flags to pass to driver:
545 * 0 = Default.
546 * DRM_CALLED_FROM_VBLIRQ = If function is called from vbl irq handler.
547 * @refcrtc: drm_crtc* of crtc which defines scanout timing.
548 *
549 * Returns negative value on error, failure or if not supported in current
550 * video mode:
551 *
552 * -EINVAL - Invalid crtc.
553 * -EAGAIN - Temporary unavailable, e.g., called before initial modeset.
554 * -ENOTSUPP - Function not supported in current display mode.
555 * -EIO - Failed, e.g., due to failed scanout position query.
556 *
557 * Returns or'ed positive status flags on success:
558 *
559 * DRM_VBLANKTIME_SCANOUTPOS_METHOD - Signal this method used for timestamping.
560 * DRM_VBLANKTIME_INVBL - Timestamp taken while scanout was in vblank interval.
561 *
562 */
563int drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev, int crtc,
564 int *max_error,
565 struct timeval *vblank_time,
566 unsigned flags,
567 struct drm_crtc *refcrtc)
568{
569 struct timeval stime, raw_time;
570 struct drm_display_mode *mode;
571 int vbl_status, vtotal, vdisplay;
572 int vpos, hpos, i;
573 s64 framedur_ns, linedur_ns, pixeldur_ns, delta_ns, duration_ns;
574 bool invbl;
575
576 if (crtc < 0 || crtc >= dev->num_crtcs) {
577 DRM_ERROR("Invalid crtc %d\n", crtc);
578 return -EINVAL;
579 }
580
581 /* Scanout position query not supported? Should not happen. */
582 if (!dev->driver->get_scanout_position) {
583 DRM_ERROR("Called from driver w/o get_scanout_position()!?\n");
584 return -EIO;
585 }
586
587 mode = &refcrtc->hwmode;
588 vtotal = mode->crtc_vtotal;
589 vdisplay = mode->crtc_vdisplay;
590
591 /* Durations of frames, lines, pixels in nanoseconds. */
592 framedur_ns = refcrtc->framedur_ns;
593 linedur_ns = refcrtc->linedur_ns;
594 pixeldur_ns = refcrtc->pixeldur_ns;
595
596 /* If mode timing undefined, just return as no-op:
597 * Happens during initial modesetting of a crtc.
598 */
599 if (vtotal <= 0 || vdisplay <= 0 || framedur_ns == 0) {
600 DRM_DEBUG("crtc %d: Noop due to uninitialized mode.\n", crtc);
601 return -EAGAIN;
602 }
603
604 /* Get current scanout position with system timestamp.
605 * Repeat query up to DRM_TIMESTAMP_MAXRETRIES times
606 * if single query takes longer than max_error nanoseconds.
607 *
608 * This guarantees a tight bound on maximum error if
609 * code gets preempted or delayed for some reason.
610 */
611 for (i = 0; i < DRM_TIMESTAMP_MAXRETRIES; i++) {
612 /* Disable preemption to make it very likely to
613 * succeed in the first iteration even on PREEMPT_RT kernel.
614 */
615 preempt_disable();
616
617 /* Get system timestamp before query. */
618 do_gettimeofday(&stime);
619
620 /* Get vertical and horizontal scanout pos. vpos, hpos. */
621 vbl_status = dev->driver->get_scanout_position(dev, crtc, &vpos, &hpos);
622
623 /* Get system timestamp after query. */
624 do_gettimeofday(&raw_time);
625
626 preempt_enable();
627
628 /* Return as no-op if scanout query unsupported or failed. */
629 if (!(vbl_status & DRM_SCANOUTPOS_VALID)) {
630 DRM_DEBUG("crtc %d : scanoutpos query failed [%d].\n",
631 crtc, vbl_status);
632 return -EIO;
633 }
634
635 duration_ns = timeval_to_ns(&raw_time) - timeval_to_ns(&stime);
636
637 /* Accept result with < max_error nsecs timing uncertainty. */
638 if (duration_ns <= (s64) *max_error)
639 break;
640 }
641
642 /* Noisy system timing? */
643 if (i == DRM_TIMESTAMP_MAXRETRIES) {
644 DRM_DEBUG("crtc %d: Noisy timestamp %d us > %d us [%d reps].\n",
645 crtc, (int) duration_ns/1000, *max_error/1000, i);
646 }
647
648 /* Return upper bound of timestamp precision error. */
649 *max_error = (int) duration_ns;
650
651 /* Check if in vblank area:
652 * vpos is >=0 in video scanout area, but negative
653 * within vblank area, counting down the number of lines until
654 * start of scanout.
655 */
656 invbl = vbl_status & DRM_SCANOUTPOS_INVBL;
657
658 /* Convert scanout position into elapsed time at raw_time query
659 * since start of scanout at first display scanline. delta_ns
660 * can be negative if start of scanout hasn't happened yet.
661 */
662 delta_ns = (s64) vpos * linedur_ns + (s64) hpos * pixeldur_ns;
663
664 /* Is vpos outside nominal vblank area, but less than
665 * 1/100 of a frame height away from start of vblank?
666 * If so, assume this isn't a massively delayed vblank
667 * interrupt, but a vblank interrupt that fired a few
668 * microseconds before true start of vblank. Compensate
669 * by adding a full frame duration to the final timestamp.
670 * Happens, e.g., on ATI R500, R600.
671 *
672 * We only do this if DRM_CALLED_FROM_VBLIRQ.
673 */
674 if ((flags & DRM_CALLED_FROM_VBLIRQ) && !invbl &&
675 ((vdisplay - vpos) < vtotal / 100)) {
676 delta_ns = delta_ns - framedur_ns;
677
678 /* Signal this correction as "applied". */
679 vbl_status |= 0x8;
680 }
681
682 /* Subtract time delta from raw timestamp to get final
683 * vblank_time timestamp for end of vblank.
684 */
685 *vblank_time = ns_to_timeval(timeval_to_ns(&raw_time) - delta_ns);
686
687 DRM_DEBUG("crtc %d : v %d p(%d,%d)@ %ld.%ld -> %ld.%ld [e %d us, %d rep]\n",
688 crtc, (int)vbl_status, hpos, vpos,
689 (long)raw_time.tv_sec, (long)raw_time.tv_usec,
690 (long)vblank_time->tv_sec, (long)vblank_time->tv_usec,
691 (int)duration_ns/1000, i);
692
693 vbl_status = DRM_VBLANKTIME_SCANOUTPOS_METHOD;
694 if (invbl)
695 vbl_status |= DRM_VBLANKTIME_INVBL;
696
697 return vbl_status;
698}
699EXPORT_SYMBOL(drm_calc_vbltimestamp_from_scanoutpos);
700
701/**
702 * drm_get_last_vbltimestamp - retrieve raw timestamp for the most recent
703 * vblank interval.
704 *
705 * @dev: DRM device
706 * @crtc: which crtc's vblank timestamp to retrieve
707 * @tvblank: Pointer to target struct timeval which should receive the timestamp
708 * @flags: Flags to pass to driver:
709 * 0 = Default.
710 * DRM_CALLED_FROM_VBLIRQ = If function is called from vbl irq handler.
711 *
712 * Fetches the system timestamp corresponding to the time of the most recent
713 * vblank interval on specified crtc. May call into kms-driver to
714 * compute the timestamp with a high-precision GPU specific method.
715 *
716 * Returns zero if timestamp originates from uncorrected do_gettimeofday()
717 * call, i.e., it isn't very precisely locked to the true vblank.
718 *
719 * Returns non-zero if timestamp is considered to be very precise.
720 */
721u32 drm_get_last_vbltimestamp(struct drm_device *dev, int crtc,
722 struct timeval *tvblank, unsigned flags)
723{
724 int ret = 0;
725
726 /* Define requested maximum error on timestamps (nanoseconds). */
727 int max_error = (int) drm_timestamp_precision * 1000;
728
729 /* Query driver if possible and precision timestamping enabled. */
730 if (dev->driver->get_vblank_timestamp && (max_error > 0)) {
731 ret = dev->driver->get_vblank_timestamp(dev, crtc, &max_error,
732 tvblank, flags);
733 if (ret > 0)
734 return (u32) ret;
735 }
736
737 /* GPU high precision timestamp query unsupported or failed.
738 * Return gettimeofday timestamp as best estimate.
739 */
740 do_gettimeofday(tvblank);
741
742 return 0;
743}
744EXPORT_SYMBOL(drm_get_last_vbltimestamp);
745
746/**
363 * drm_vblank_count - retrieve "cooked" vblank counter value 747 * drm_vblank_count - retrieve "cooked" vblank counter value
364 * @dev: DRM device 748 * @dev: DRM device
365 * @crtc: which counter to retrieve 749 * @crtc: which counter to retrieve
@@ -375,6 +759,40 @@ u32 drm_vblank_count(struct drm_device *dev, int crtc)
375EXPORT_SYMBOL(drm_vblank_count); 759EXPORT_SYMBOL(drm_vblank_count);
376 760
377/** 761/**
762 * drm_vblank_count_and_time - retrieve "cooked" vblank counter value
763 * and the system timestamp corresponding to that vblank counter value.
764 *
765 * @dev: DRM device
766 * @crtc: which counter to retrieve
767 * @vblanktime: Pointer to struct timeval to receive the vblank timestamp.
768 *
769 * Fetches the "cooked" vblank count value that represents the number of
770 * vblank events since the system was booted, including lost events due to
771 * modesetting activity. Returns corresponding system timestamp of the time
772 * of the vblank interval that corresponds to the current value vblank counter
773 * value.
774 */
775u32 drm_vblank_count_and_time(struct drm_device *dev, int crtc,
776 struct timeval *vblanktime)
777{
778 u32 cur_vblank;
779
780 /* Read timestamp from slot of _vblank_time ringbuffer
781 * that corresponds to current vblank count. Retry if
782 * count has incremented during readout. This works like
783 * a seqlock.
784 */
785 do {
786 cur_vblank = atomic_read(&dev->_vblank_count[crtc]);
787 *vblanktime = vblanktimestamp(dev, crtc, cur_vblank);
788 smp_rmb();
789 } while (cur_vblank != atomic_read(&dev->_vblank_count[crtc]));
790
791 return cur_vblank;
792}
793EXPORT_SYMBOL(drm_vblank_count_and_time);
794
795/**
378 * drm_update_vblank_count - update the master vblank counter 796 * drm_update_vblank_count - update the master vblank counter
379 * @dev: DRM device 797 * @dev: DRM device
380 * @crtc: counter to update 798 * @crtc: counter to update
@@ -392,7 +810,8 @@ EXPORT_SYMBOL(drm_vblank_count);
392 */ 810 */
393static void drm_update_vblank_count(struct drm_device *dev, int crtc) 811static void drm_update_vblank_count(struct drm_device *dev, int crtc)
394{ 812{
395 u32 cur_vblank, diff; 813 u32 cur_vblank, diff, tslot, rc;
814 struct timeval t_vblank;
396 815
397 /* 816 /*
398 * Interrupts were disabled prior to this call, so deal with counter 817 * Interrupts were disabled prior to this call, so deal with counter
@@ -400,8 +819,18 @@ static void drm_update_vblank_count(struct drm_device *dev, int crtc)
400 * NOTE! It's possible we lost a full dev->max_vblank_count events 819 * NOTE! It's possible we lost a full dev->max_vblank_count events
401 * here if the register is small or we had vblank interrupts off for 820 * here if the register is small or we had vblank interrupts off for
402 * a long time. 821 * a long time.
822 *
823 * We repeat the hardware vblank counter & timestamp query until
824 * we get consistent results. This to prevent races between gpu
825 * updating its hardware counter while we are retrieving the
826 * corresponding vblank timestamp.
403 */ 827 */
404 cur_vblank = dev->driver->get_vblank_counter(dev, crtc); 828 do {
829 cur_vblank = dev->driver->get_vblank_counter(dev, crtc);
830 rc = drm_get_last_vbltimestamp(dev, crtc, &t_vblank, 0);
831 } while (cur_vblank != dev->driver->get_vblank_counter(dev, crtc));
832
833 /* Deal with counter wrap */
405 diff = cur_vblank - dev->last_vblank[crtc]; 834 diff = cur_vblank - dev->last_vblank[crtc];
406 if (cur_vblank < dev->last_vblank[crtc]) { 835 if (cur_vblank < dev->last_vblank[crtc]) {
407 diff += dev->max_vblank_count; 836 diff += dev->max_vblank_count;
@@ -413,7 +842,18 @@ static void drm_update_vblank_count(struct drm_device *dev, int crtc)
413 DRM_DEBUG("enabling vblank interrupts on crtc %d, missed %d\n", 842 DRM_DEBUG("enabling vblank interrupts on crtc %d, missed %d\n",
414 crtc, diff); 843 crtc, diff);
415 844
845 /* Reinitialize corresponding vblank timestamp if high-precision query
846 * available. Skip this step if query unsupported or failed. Will
847 * reinitialize delayed at next vblank interrupt in that case.
848 */
849 if (rc) {
850 tslot = atomic_read(&dev->_vblank_count[crtc]) + diff;
851 vblanktimestamp(dev, crtc, tslot) = t_vblank;
852 }
853
854 smp_mb__before_atomic_inc();
416 atomic_add(diff, &dev->_vblank_count[crtc]); 855 atomic_add(diff, &dev->_vblank_count[crtc]);
856 smp_mb__after_atomic_inc();
417} 857}
418 858
419/** 859/**
@@ -429,15 +869,27 @@ static void drm_update_vblank_count(struct drm_device *dev, int crtc)
429 */ 869 */
430int drm_vblank_get(struct drm_device *dev, int crtc) 870int drm_vblank_get(struct drm_device *dev, int crtc)
431{ 871{
432 unsigned long irqflags; 872 unsigned long irqflags, irqflags2;
433 int ret = 0; 873 int ret = 0;
434 874
435 spin_lock_irqsave(&dev->vbl_lock, irqflags); 875 spin_lock_irqsave(&dev->vbl_lock, irqflags);
436 /* Going from 0->1 means we have to enable interrupts again */ 876 /* Going from 0->1 means we have to enable interrupts again */
437 if (atomic_add_return(1, &dev->vblank_refcount[crtc]) == 1) { 877 if (atomic_add_return(1, &dev->vblank_refcount[crtc]) == 1) {
878 /* Disable preemption while holding vblank_time_lock. Do
879 * it explicitely to guard against PREEMPT_RT kernel.
880 */
881 preempt_disable();
882 spin_lock_irqsave(&dev->vblank_time_lock, irqflags2);
438 if (!dev->vblank_enabled[crtc]) { 883 if (!dev->vblank_enabled[crtc]) {
884 /* Enable vblank irqs under vblank_time_lock protection.
885 * All vblank count & timestamp updates are held off
886 * until we are done reinitializing master counter and
887 * timestamps. Filtercode in drm_handle_vblank() will
888 * prevent double-accounting of same vblank interval.
889 */
439 ret = dev->driver->enable_vblank(dev, crtc); 890 ret = dev->driver->enable_vblank(dev, crtc);
440 DRM_DEBUG("enabling vblank on crtc %d, ret: %d\n", crtc, ret); 891 DRM_DEBUG("enabling vblank on crtc %d, ret: %d\n",
892 crtc, ret);
441 if (ret) 893 if (ret)
442 atomic_dec(&dev->vblank_refcount[crtc]); 894 atomic_dec(&dev->vblank_refcount[crtc]);
443 else { 895 else {
@@ -445,6 +897,8 @@ int drm_vblank_get(struct drm_device *dev, int crtc)
445 drm_update_vblank_count(dev, crtc); 897 drm_update_vblank_count(dev, crtc);
446 } 898 }
447 } 899 }
900 spin_unlock_irqrestore(&dev->vblank_time_lock, irqflags2);
901 preempt_enable();
448 } else { 902 } else {
449 if (!dev->vblank_enabled[crtc]) { 903 if (!dev->vblank_enabled[crtc]) {
450 atomic_dec(&dev->vblank_refcount[crtc]); 904 atomic_dec(&dev->vblank_refcount[crtc]);
@@ -463,27 +917,50 @@ EXPORT_SYMBOL(drm_vblank_get);
463 * @crtc: which counter to give up 917 * @crtc: which counter to give up
464 * 918 *
465 * Release ownership of a given vblank counter, turning off interrupts 919 * Release ownership of a given vblank counter, turning off interrupts
466 * if possible. 920 * if possible. Disable interrupts after drm_vblank_offdelay milliseconds.
467 */ 921 */
468void drm_vblank_put(struct drm_device *dev, int crtc) 922void drm_vblank_put(struct drm_device *dev, int crtc)
469{ 923{
470 BUG_ON (atomic_read (&dev->vblank_refcount[crtc]) == 0); 924 BUG_ON(atomic_read(&dev->vblank_refcount[crtc]) == 0);
471 925
472 /* Last user schedules interrupt disable */ 926 /* Last user schedules interrupt disable */
473 if (atomic_dec_and_test(&dev->vblank_refcount[crtc])) 927 if (atomic_dec_and_test(&dev->vblank_refcount[crtc]) &&
474 mod_timer(&dev->vblank_disable_timer, jiffies + 5*DRM_HZ); 928 (drm_vblank_offdelay > 0))
929 mod_timer(&dev->vblank_disable_timer,
930 jiffies + ((drm_vblank_offdelay * DRM_HZ)/1000));
475} 931}
476EXPORT_SYMBOL(drm_vblank_put); 932EXPORT_SYMBOL(drm_vblank_put);
477 933
478void drm_vblank_off(struct drm_device *dev, int crtc) 934void drm_vblank_off(struct drm_device *dev, int crtc)
479{ 935{
936 struct drm_pending_vblank_event *e, *t;
937 struct timeval now;
480 unsigned long irqflags; 938 unsigned long irqflags;
939 unsigned int seq;
481 940
482 spin_lock_irqsave(&dev->vbl_lock, irqflags); 941 spin_lock_irqsave(&dev->vbl_lock, irqflags);
483 dev->driver->disable_vblank(dev, crtc); 942 vblank_disable_and_save(dev, crtc);
484 DRM_WAKEUP(&dev->vbl_queue[crtc]); 943 DRM_WAKEUP(&dev->vbl_queue[crtc]);
485 dev->vblank_enabled[crtc] = 0; 944
486 dev->last_vblank[crtc] = dev->driver->get_vblank_counter(dev, crtc); 945 /* Send any queued vblank events, lest the natives grow disquiet */
946 seq = drm_vblank_count_and_time(dev, crtc, &now);
947 list_for_each_entry_safe(e, t, &dev->vblank_event_list, base.link) {
948 if (e->pipe != crtc)
949 continue;
950 DRM_DEBUG("Sending premature vblank event on disable: \
951 wanted %d, current %d\n",
952 e->event.sequence, seq);
953
954 e->event.sequence = seq;
955 e->event.tv_sec = now.tv_sec;
956 e->event.tv_usec = now.tv_usec;
957 drm_vblank_put(dev, e->pipe);
958 list_move_tail(&e->base.link, &e->base.file_priv->event_list);
959 wake_up_interruptible(&e->base.file_priv->event_wait);
960 trace_drm_vblank_event_delivered(e->base.pid, e->pipe,
961 e->event.sequence);
962 }
963
487 spin_unlock_irqrestore(&dev->vbl_lock, irqflags); 964 spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
488} 965}
489EXPORT_SYMBOL(drm_vblank_off); 966EXPORT_SYMBOL(drm_vblank_off);
@@ -549,7 +1026,8 @@ int drm_modeset_ctl(struct drm_device *dev, void *data,
549 struct drm_file *file_priv) 1026 struct drm_file *file_priv)
550{ 1027{
551 struct drm_modeset_ctl *modeset = data; 1028 struct drm_modeset_ctl *modeset = data;
552 int crtc, ret = 0; 1029 int ret = 0;
1030 unsigned int crtc;
553 1031
554 /* If drm_vblank_init() hasn't been called yet, just no-op */ 1032 /* If drm_vblank_init() hasn't been called yet, just no-op */
555 if (!dev->num_crtcs) 1033 if (!dev->num_crtcs)
@@ -585,10 +1063,13 @@ static int drm_queue_vblank_event(struct drm_device *dev, int pipe,
585 struct timeval now; 1063 struct timeval now;
586 unsigned long flags; 1064 unsigned long flags;
587 unsigned int seq; 1065 unsigned int seq;
1066 int ret;
588 1067
589 e = kzalloc(sizeof *e, GFP_KERNEL); 1068 e = kzalloc(sizeof *e, GFP_KERNEL);
590 if (e == NULL) 1069 if (e == NULL) {
591 return -ENOMEM; 1070 ret = -ENOMEM;
1071 goto err_put;
1072 }
592 1073
593 e->pipe = pipe; 1074 e->pipe = pipe;
594 e->base.pid = current->pid; 1075 e->base.pid = current->pid;
@@ -599,17 +1080,16 @@ static int drm_queue_vblank_event(struct drm_device *dev, int pipe,
599 e->base.file_priv = file_priv; 1080 e->base.file_priv = file_priv;
600 e->base.destroy = (void (*) (struct drm_pending_event *)) kfree; 1081 e->base.destroy = (void (*) (struct drm_pending_event *)) kfree;
601 1082
602 do_gettimeofday(&now);
603 spin_lock_irqsave(&dev->event_lock, flags); 1083 spin_lock_irqsave(&dev->event_lock, flags);
604 1084
605 if (file_priv->event_space < sizeof e->event) { 1085 if (file_priv->event_space < sizeof e->event) {
606 spin_unlock_irqrestore(&dev->event_lock, flags); 1086 ret = -EBUSY;
607 kfree(e); 1087 goto err_unlock;
608 return -ENOMEM;
609 } 1088 }
610 1089
611 file_priv->event_space -= sizeof e->event; 1090 file_priv->event_space -= sizeof e->event;
612 seq = drm_vblank_count(dev, pipe); 1091 seq = drm_vblank_count_and_time(dev, pipe, &now);
1092
613 if ((vblwait->request.type & _DRM_VBLANK_NEXTONMISS) && 1093 if ((vblwait->request.type & _DRM_VBLANK_NEXTONMISS) &&
614 (seq - vblwait->request.sequence) <= (1 << 23)) { 1094 (seq - vblwait->request.sequence) <= (1 << 23)) {
615 vblwait->request.sequence = seq + 1; 1095 vblwait->request.sequence = seq + 1;
@@ -624,20 +1104,30 @@ static int drm_queue_vblank_event(struct drm_device *dev, int pipe,
624 1104
625 e->event.sequence = vblwait->request.sequence; 1105 e->event.sequence = vblwait->request.sequence;
626 if ((seq - vblwait->request.sequence) <= (1 << 23)) { 1106 if ((seq - vblwait->request.sequence) <= (1 << 23)) {
1107 e->event.sequence = seq;
627 e->event.tv_sec = now.tv_sec; 1108 e->event.tv_sec = now.tv_sec;
628 e->event.tv_usec = now.tv_usec; 1109 e->event.tv_usec = now.tv_usec;
629 drm_vblank_put(dev, e->pipe); 1110 drm_vblank_put(dev, pipe);
630 list_add_tail(&e->base.link, &e->base.file_priv->event_list); 1111 list_add_tail(&e->base.link, &e->base.file_priv->event_list);
631 wake_up_interruptible(&e->base.file_priv->event_wait); 1112 wake_up_interruptible(&e->base.file_priv->event_wait);
1113 vblwait->reply.sequence = seq;
632 trace_drm_vblank_event_delivered(current->pid, pipe, 1114 trace_drm_vblank_event_delivered(current->pid, pipe,
633 vblwait->request.sequence); 1115 vblwait->request.sequence);
634 } else { 1116 } else {
635 list_add_tail(&e->base.link, &dev->vblank_event_list); 1117 list_add_tail(&e->base.link, &dev->vblank_event_list);
1118 vblwait->reply.sequence = vblwait->request.sequence;
636 } 1119 }
637 1120
638 spin_unlock_irqrestore(&dev->event_lock, flags); 1121 spin_unlock_irqrestore(&dev->event_lock, flags);
639 1122
640 return 0; 1123 return 0;
1124
1125err_unlock:
1126 spin_unlock_irqrestore(&dev->event_lock, flags);
1127 kfree(e);
1128err_put:
1129 drm_vblank_put(dev, pipe);
1130 return ret;
641} 1131}
642 1132
643/** 1133/**
@@ -659,7 +1149,7 @@ int drm_wait_vblank(struct drm_device *dev, void *data,
659{ 1149{
660 union drm_wait_vblank *vblwait = data; 1150 union drm_wait_vblank *vblwait = data;
661 int ret = 0; 1151 int ret = 0;
662 unsigned int flags, seq, crtc; 1152 unsigned int flags, seq, crtc, high_crtc;
663 1153
664 if ((!drm_dev_to_irq(dev)) || (!dev->irq_enabled)) 1154 if ((!drm_dev_to_irq(dev)) || (!dev->irq_enabled))
665 return -EINVAL; 1155 return -EINVAL;
@@ -668,16 +1158,21 @@ int drm_wait_vblank(struct drm_device *dev, void *data,
668 return -EINVAL; 1158 return -EINVAL;
669 1159
670 if (vblwait->request.type & 1160 if (vblwait->request.type &
671 ~(_DRM_VBLANK_TYPES_MASK | _DRM_VBLANK_FLAGS_MASK)) { 1161 ~(_DRM_VBLANK_TYPES_MASK | _DRM_VBLANK_FLAGS_MASK |
1162 _DRM_VBLANK_HIGH_CRTC_MASK)) {
672 DRM_ERROR("Unsupported type value 0x%x, supported mask 0x%x\n", 1163 DRM_ERROR("Unsupported type value 0x%x, supported mask 0x%x\n",
673 vblwait->request.type, 1164 vblwait->request.type,
674 (_DRM_VBLANK_TYPES_MASK | _DRM_VBLANK_FLAGS_MASK)); 1165 (_DRM_VBLANK_TYPES_MASK | _DRM_VBLANK_FLAGS_MASK |
1166 _DRM_VBLANK_HIGH_CRTC_MASK));
675 return -EINVAL; 1167 return -EINVAL;
676 } 1168 }
677 1169
678 flags = vblwait->request.type & _DRM_VBLANK_FLAGS_MASK; 1170 flags = vblwait->request.type & _DRM_VBLANK_FLAGS_MASK;
679 crtc = flags & _DRM_VBLANK_SECONDARY ? 1 : 0; 1171 high_crtc = (vblwait->request.type & _DRM_VBLANK_HIGH_CRTC_MASK);
680 1172 if (high_crtc)
1173 crtc = high_crtc >> _DRM_VBLANK_HIGH_CRTC_SHIFT;
1174 else
1175 crtc = flags & _DRM_VBLANK_SECONDARY ? 1 : 0;
681 if (crtc >= dev->num_crtcs) 1176 if (crtc >= dev->num_crtcs)
682 return -EINVAL; 1177 return -EINVAL;
683 1178
@@ -718,11 +1213,10 @@ int drm_wait_vblank(struct drm_device *dev, void *data,
718 if (ret != -EINTR) { 1213 if (ret != -EINTR) {
719 struct timeval now; 1214 struct timeval now;
720 1215
721 do_gettimeofday(&now); 1216 vblwait->reply.sequence = drm_vblank_count_and_time(dev, crtc, &now);
722
723 vblwait->reply.tval_sec = now.tv_sec; 1217 vblwait->reply.tval_sec = now.tv_sec;
724 vblwait->reply.tval_usec = now.tv_usec; 1218 vblwait->reply.tval_usec = now.tv_usec;
725 vblwait->reply.sequence = drm_vblank_count(dev, crtc); 1219
726 DRM_DEBUG("returning %d to client\n", 1220 DRM_DEBUG("returning %d to client\n",
727 vblwait->reply.sequence); 1221 vblwait->reply.sequence);
728 } else { 1222 } else {
@@ -741,8 +1235,7 @@ void drm_handle_vblank_events(struct drm_device *dev, int crtc)
741 unsigned long flags; 1235 unsigned long flags;
742 unsigned int seq; 1236 unsigned int seq;
743 1237
744 do_gettimeofday(&now); 1238 seq = drm_vblank_count_and_time(dev, crtc, &now);
745 seq = drm_vblank_count(dev, crtc);
746 1239
747 spin_lock_irqsave(&dev->event_lock, flags); 1240 spin_lock_irqsave(&dev->event_lock, flags);
748 1241
@@ -778,13 +1271,68 @@ void drm_handle_vblank_events(struct drm_device *dev, int crtc)
778 * Drivers should call this routine in their vblank interrupt handlers to 1271 * Drivers should call this routine in their vblank interrupt handlers to
779 * update the vblank counter and send any signals that may be pending. 1272 * update the vblank counter and send any signals that may be pending.
780 */ 1273 */
781void drm_handle_vblank(struct drm_device *dev, int crtc) 1274bool drm_handle_vblank(struct drm_device *dev, int crtc)
782{ 1275{
1276 u32 vblcount;
1277 s64 diff_ns;
1278 struct timeval tvblank;
1279 unsigned long irqflags;
1280
783 if (!dev->num_crtcs) 1281 if (!dev->num_crtcs)
784 return; 1282 return false;
1283
1284 /* Need timestamp lock to prevent concurrent execution with
1285 * vblank enable/disable, as this would cause inconsistent
1286 * or corrupted timestamps and vblank counts.
1287 */
1288 spin_lock_irqsave(&dev->vblank_time_lock, irqflags);
1289
1290 /* Vblank irq handling disabled. Nothing to do. */
1291 if (!dev->vblank_enabled[crtc]) {
1292 spin_unlock_irqrestore(&dev->vblank_time_lock, irqflags);
1293 return false;
1294 }
1295
1296 /* Fetch corresponding timestamp for this vblank interval from
1297 * driver and store it in proper slot of timestamp ringbuffer.
1298 */
1299
1300 /* Get current timestamp and count. */
1301 vblcount = atomic_read(&dev->_vblank_count[crtc]);
1302 drm_get_last_vbltimestamp(dev, crtc, &tvblank, DRM_CALLED_FROM_VBLIRQ);
1303
1304 /* Compute time difference to timestamp of last vblank */
1305 diff_ns = timeval_to_ns(&tvblank) -
1306 timeval_to_ns(&vblanktimestamp(dev, crtc, vblcount));
1307
1308 /* Update vblank timestamp and count if at least
1309 * DRM_REDUNDANT_VBLIRQ_THRESH_NS nanoseconds
1310 * difference between last stored timestamp and current
1311 * timestamp. A smaller difference means basically
1312 * identical timestamps. Happens if this vblank has
1313 * been already processed and this is a redundant call,
1314 * e.g., due to spurious vblank interrupts. We need to
1315 * ignore those for accounting.
1316 */
1317 if (abs64(diff_ns) > DRM_REDUNDANT_VBLIRQ_THRESH_NS) {
1318 /* Store new timestamp in ringbuffer. */
1319 vblanktimestamp(dev, crtc, vblcount + 1) = tvblank;
1320
1321 /* Increment cooked vblank count. This also atomically commits
1322 * the timestamp computed above.
1323 */
1324 smp_mb__before_atomic_inc();
1325 atomic_inc(&dev->_vblank_count[crtc]);
1326 smp_mb__after_atomic_inc();
1327 } else {
1328 DRM_DEBUG("crtc %d: Redundant vblirq ignored. diff_ns = %d\n",
1329 crtc, (int) diff_ns);
1330 }
785 1331
786 atomic_inc(&dev->_vblank_count[crtc]);
787 DRM_WAKEUP(&dev->vbl_queue[crtc]); 1332 DRM_WAKEUP(&dev->vbl_queue[crtc]);
788 drm_handle_vblank_events(dev, crtc); 1333 drm_handle_vblank_events(dev, crtc);
1334
1335 spin_unlock_irqrestore(&dev->vblank_time_lock, irqflags);
1336 return true;
789} 1337}
790EXPORT_SYMBOL(drm_handle_vblank); 1338EXPORT_SYMBOL(drm_handle_vblank);
diff --git a/drivers/gpu/drm/drm_lock.c b/drivers/gpu/drm/drm_lock.c
index 9bf93bc9a32c..632ae243ede0 100644
--- a/drivers/gpu/drm/drm_lock.c
+++ b/drivers/gpu/drm/drm_lock.c
@@ -37,6 +37,8 @@
37 37
38static int drm_notifier(void *priv); 38static int drm_notifier(void *priv);
39 39
40static int drm_lock_take(struct drm_lock_data *lock_data, unsigned int context);
41
40/** 42/**
41 * Lock ioctl. 43 * Lock ioctl.
42 * 44 *
@@ -124,9 +126,6 @@ int drm_lock(struct drm_device *dev, void *data, struct drm_file *file_priv)
124 block_all_signals(drm_notifier, &dev->sigdata, &dev->sigmask); 126 block_all_signals(drm_notifier, &dev->sigdata, &dev->sigmask);
125 } 127 }
126 128
127 if (dev->driver->dma_ready && (lock->flags & _DRM_LOCK_READY))
128 dev->driver->dma_ready(dev);
129
130 if (dev->driver->dma_quiescent && (lock->flags & _DRM_LOCK_QUIESCENT)) 129 if (dev->driver->dma_quiescent && (lock->flags & _DRM_LOCK_QUIESCENT))
131 { 130 {
132 if (dev->driver->dma_quiescent(dev)) { 131 if (dev->driver->dma_quiescent(dev)) {
@@ -136,12 +135,6 @@ int drm_lock(struct drm_device *dev, void *data, struct drm_file *file_priv)
136 } 135 }
137 } 136 }
138 137
139 if (dev->driver->kernel_context_switch &&
140 dev->last_context != lock->context) {
141 dev->driver->kernel_context_switch(dev, dev->last_context,
142 lock->context);
143 }
144
145 return 0; 138 return 0;
146} 139}
147 140
@@ -169,15 +162,8 @@ int drm_unlock(struct drm_device *dev, void *data, struct drm_file *file_priv)
169 162
170 atomic_inc(&dev->counts[_DRM_STAT_UNLOCKS]); 163 atomic_inc(&dev->counts[_DRM_STAT_UNLOCKS]);
171 164
172 /* kernel_context_switch isn't used by any of the x86 drm 165 if (drm_lock_free(&master->lock, lock->context)) {
173 * modules but is required by the Sparc driver. 166 /* FIXME: Should really bail out here. */
174 */
175 if (dev->driver->kernel_context_switch_unlock)
176 dev->driver->kernel_context_switch_unlock(dev);
177 else {
178 if (drm_lock_free(&master->lock, lock->context)) {
179 /* FIXME: Should really bail out here. */
180 }
181 } 167 }
182 168
183 unblock_all_signals(); 169 unblock_all_signals();
@@ -193,6 +179,7 @@ int drm_unlock(struct drm_device *dev, void *data, struct drm_file *file_priv)
193 * 179 *
194 * Attempt to mark the lock as held by the given context, via the \p cmpxchg instruction. 180 * Attempt to mark the lock as held by the given context, via the \p cmpxchg instruction.
195 */ 181 */
182static
196int drm_lock_take(struct drm_lock_data *lock_data, 183int drm_lock_take(struct drm_lock_data *lock_data,
197 unsigned int context) 184 unsigned int context)
198{ 185{
@@ -229,7 +216,6 @@ int drm_lock_take(struct drm_lock_data *lock_data,
229 } 216 }
230 return 0; 217 return 0;
231} 218}
232EXPORT_SYMBOL(drm_lock_take);
233 219
234/** 220/**
235 * This takes a lock forcibly and hands it to context. Should ONLY be used 221 * This takes a lock forcibly and hands it to context. Should ONLY be used
@@ -297,7 +283,6 @@ int drm_lock_free(struct drm_lock_data *lock_data, unsigned int context)
297 wake_up_interruptible(&lock_data->lock_queue); 283 wake_up_interruptible(&lock_data->lock_queue);
298 return 0; 284 return 0;
299} 285}
300EXPORT_SYMBOL(drm_lock_free);
301 286
302/** 287/**
303 * If we get here, it means that the process has called DRM_IOCTL_LOCK 288 * If we get here, it means that the process has called DRM_IOCTL_LOCK
@@ -360,7 +345,6 @@ void drm_idlelock_take(struct drm_lock_data *lock_data)
360 } 345 }
361 spin_unlock_bh(&lock_data->spinlock); 346 spin_unlock_bh(&lock_data->spinlock);
362} 347}
363EXPORT_SYMBOL(drm_idlelock_take);
364 348
365void drm_idlelock_release(struct drm_lock_data *lock_data) 349void drm_idlelock_release(struct drm_lock_data *lock_data)
366{ 350{
@@ -380,8 +364,6 @@ void drm_idlelock_release(struct drm_lock_data *lock_data)
380 } 364 }
381 spin_unlock_bh(&lock_data->spinlock); 365 spin_unlock_bh(&lock_data->spinlock);
382} 366}
383EXPORT_SYMBOL(drm_idlelock_release);
384
385 367
386int drm_i_have_hw_lock(struct drm_device *dev, struct drm_file *file_priv) 368int drm_i_have_hw_lock(struct drm_device *dev, struct drm_file *file_priv)
387{ 369{
@@ -390,5 +372,3 @@ int drm_i_have_hw_lock(struct drm_device *dev, struct drm_file *file_priv)
390 _DRM_LOCK_IS_HELD(master->lock.hw_lock->lock) && 372 _DRM_LOCK_IS_HELD(master->lock.hw_lock->lock) &&
391 master->lock.file_priv == file_priv); 373 master->lock.file_priv == file_priv);
392} 374}
393
394EXPORT_SYMBOL(drm_i_have_hw_lock);
diff --git a/drivers/gpu/drm/drm_memory.c b/drivers/gpu/drm/drm_memory.c
index 7732268eced2..c9b805000a11 100644
--- a/drivers/gpu/drm/drm_memory.c
+++ b/drivers/gpu/drm/drm_memory.c
@@ -99,29 +99,23 @@ static void *agp_remap(unsigned long offset, unsigned long size,
99 return addr; 99 return addr;
100} 100}
101 101
102/** Wrapper around agp_allocate_memory() */
103DRM_AGP_MEM *drm_alloc_agp(struct drm_device * dev, int pages, u32 type)
104{
105 return drm_agp_allocate_memory(dev->agp->bridge, pages, type);
106}
107
108/** Wrapper around agp_free_memory() */ 102/** Wrapper around agp_free_memory() */
109int drm_free_agp(DRM_AGP_MEM * handle, int pages) 103void drm_free_agp(DRM_AGP_MEM * handle, int pages)
110{ 104{
111 return drm_agp_free_memory(handle) ? 0 : -EINVAL; 105 agp_free_memory(handle);
112} 106}
113EXPORT_SYMBOL(drm_free_agp); 107EXPORT_SYMBOL(drm_free_agp);
114 108
115/** Wrapper around agp_bind_memory() */ 109/** Wrapper around agp_bind_memory() */
116int drm_bind_agp(DRM_AGP_MEM * handle, unsigned int start) 110int drm_bind_agp(DRM_AGP_MEM * handle, unsigned int start)
117{ 111{
118 return drm_agp_bind_memory(handle, start); 112 return agp_bind_memory(handle, start);
119} 113}
120 114
121/** Wrapper around agp_unbind_memory() */ 115/** Wrapper around agp_unbind_memory() */
122int drm_unbind_agp(DRM_AGP_MEM * handle) 116int drm_unbind_agp(DRM_AGP_MEM * handle)
123{ 117{
124 return drm_agp_unbind_memory(handle); 118 return agp_unbind_memory(handle);
125} 119}
126EXPORT_SYMBOL(drm_unbind_agp); 120EXPORT_SYMBOL(drm_unbind_agp);
127 121
diff --git a/drivers/gpu/drm/drm_mm.c b/drivers/gpu/drm/drm_mm.c
index a6bfc302ed90..959186cbf328 100644
--- a/drivers/gpu/drm/drm_mm.c
+++ b/drivers/gpu/drm/drm_mm.c
@@ -64,8 +64,8 @@ static struct drm_mm_node *drm_mm_kmalloc(struct drm_mm *mm, int atomic)
64 else { 64 else {
65 child = 65 child =
66 list_entry(mm->unused_nodes.next, 66 list_entry(mm->unused_nodes.next,
67 struct drm_mm_node, free_stack); 67 struct drm_mm_node, node_list);
68 list_del(&child->free_stack); 68 list_del(&child->node_list);
69 --mm->num_unused; 69 --mm->num_unused;
70 } 70 }
71 spin_unlock(&mm->unused_lock); 71 spin_unlock(&mm->unused_lock);
@@ -94,195 +94,242 @@ int drm_mm_pre_get(struct drm_mm *mm)
94 return ret; 94 return ret;
95 } 95 }
96 ++mm->num_unused; 96 ++mm->num_unused;
97 list_add_tail(&node->free_stack, &mm->unused_nodes); 97 list_add_tail(&node->node_list, &mm->unused_nodes);
98 } 98 }
99 spin_unlock(&mm->unused_lock); 99 spin_unlock(&mm->unused_lock);
100 return 0; 100 return 0;
101} 101}
102EXPORT_SYMBOL(drm_mm_pre_get); 102EXPORT_SYMBOL(drm_mm_pre_get);
103 103
104static int drm_mm_create_tail_node(struct drm_mm *mm, 104static inline unsigned long drm_mm_hole_node_start(struct drm_mm_node *hole_node)
105 unsigned long start,
106 unsigned long size, int atomic)
107{ 105{
108 struct drm_mm_node *child; 106 return hole_node->start + hole_node->size;
109 107}
110 child = drm_mm_kmalloc(mm, atomic);
111 if (unlikely(child == NULL))
112 return -ENOMEM;
113
114 child->free = 1;
115 child->size = size;
116 child->start = start;
117 child->mm = mm;
118 108
119 list_add_tail(&child->node_list, &mm->node_list); 109static inline unsigned long drm_mm_hole_node_end(struct drm_mm_node *hole_node)
120 list_add_tail(&child->free_stack, &mm->free_stack); 110{
111 struct drm_mm_node *next_node =
112 list_entry(hole_node->node_list.next, struct drm_mm_node,
113 node_list);
121 114
122 return 0; 115 return next_node->start;
123} 116}
124 117
125static struct drm_mm_node *drm_mm_split_at_start(struct drm_mm_node *parent, 118static void drm_mm_insert_helper(struct drm_mm_node *hole_node,
126 unsigned long size, 119 struct drm_mm_node *node,
127 int atomic) 120 unsigned long size, unsigned alignment)
128{ 121{
129 struct drm_mm_node *child; 122 struct drm_mm *mm = hole_node->mm;
123 unsigned long tmp = 0, wasted = 0;
124 unsigned long hole_start = drm_mm_hole_node_start(hole_node);
125 unsigned long hole_end = drm_mm_hole_node_end(hole_node);
130 126
131 child = drm_mm_kmalloc(parent->mm, atomic); 127 BUG_ON(!hole_node->hole_follows || node->allocated);
132 if (unlikely(child == NULL))
133 return NULL;
134 128
135 INIT_LIST_HEAD(&child->free_stack); 129 if (alignment)
130 tmp = hole_start % alignment;
136 131
137 child->size = size; 132 if (!tmp) {
138 child->start = parent->start; 133 hole_node->hole_follows = 0;
139 child->mm = parent->mm; 134 list_del_init(&hole_node->hole_stack);
135 } else
136 wasted = alignment - tmp;
140 137
141 list_add_tail(&child->node_list, &parent->node_list); 138 node->start = hole_start + wasted;
142 INIT_LIST_HEAD(&child->free_stack); 139 node->size = size;
140 node->mm = mm;
141 node->allocated = 1;
143 142
144 parent->size -= size; 143 INIT_LIST_HEAD(&node->hole_stack);
145 parent->start += size; 144 list_add(&node->node_list, &hole_node->node_list);
146 return child;
147}
148 145
146 BUG_ON(node->start + node->size > hole_end);
147
148 if (node->start + node->size < hole_end) {
149 list_add(&node->hole_stack, &mm->hole_stack);
150 node->hole_follows = 1;
151 } else {
152 node->hole_follows = 0;
153 }
154}
149 155
150struct drm_mm_node *drm_mm_get_block_generic(struct drm_mm_node *node, 156struct drm_mm_node *drm_mm_get_block_generic(struct drm_mm_node *hole_node,
151 unsigned long size, 157 unsigned long size,
152 unsigned alignment, 158 unsigned alignment,
153 int atomic) 159 int atomic)
154{ 160{
161 struct drm_mm_node *node;
162
163 node = drm_mm_kmalloc(hole_node->mm, atomic);
164 if (unlikely(node == NULL))
165 return NULL;
155 166
156 struct drm_mm_node *align_splitoff = NULL; 167 drm_mm_insert_helper(hole_node, node, size, alignment);
157 unsigned tmp = 0;
158 168
159 if (alignment) 169 return node;
160 tmp = node->start % alignment; 170}
171EXPORT_SYMBOL(drm_mm_get_block_generic);
161 172
162 if (tmp) { 173/**
163 align_splitoff = 174 * Search for free space and insert a preallocated memory node. Returns
164 drm_mm_split_at_start(node, alignment - tmp, atomic); 175 * -ENOSPC if no suitable free area is available. The preallocated memory node
165 if (unlikely(align_splitoff == NULL)) 176 * must be cleared.
166 return NULL; 177 */
167 } 178int drm_mm_insert_node(struct drm_mm *mm, struct drm_mm_node *node,
179 unsigned long size, unsigned alignment)
180{
181 struct drm_mm_node *hole_node;
168 182
169 if (node->size == size) { 183 hole_node = drm_mm_search_free(mm, size, alignment, 0);
170 list_del_init(&node->free_stack); 184 if (!hole_node)
171 node->free = 0; 185 return -ENOSPC;
172 } else {
173 node = drm_mm_split_at_start(node, size, atomic);
174 }
175 186
176 if (align_splitoff) 187 drm_mm_insert_helper(hole_node, node, size, alignment);
177 drm_mm_put_block(align_splitoff);
178 188
179 return node; 189 return 0;
180} 190}
181EXPORT_SYMBOL(drm_mm_get_block_generic); 191EXPORT_SYMBOL(drm_mm_insert_node);
182 192
183struct drm_mm_node *drm_mm_get_block_range_generic(struct drm_mm_node *node, 193static void drm_mm_insert_helper_range(struct drm_mm_node *hole_node,
184 unsigned long size, 194 struct drm_mm_node *node,
185 unsigned alignment, 195 unsigned long size, unsigned alignment,
186 unsigned long start, 196 unsigned long start, unsigned long end)
187 unsigned long end,
188 int atomic)
189{ 197{
190 struct drm_mm_node *align_splitoff = NULL; 198 struct drm_mm *mm = hole_node->mm;
191 unsigned tmp = 0; 199 unsigned long tmp = 0, wasted = 0;
192 unsigned wasted = 0; 200 unsigned long hole_start = drm_mm_hole_node_start(hole_node);
201 unsigned long hole_end = drm_mm_hole_node_end(hole_node);
193 202
194 if (node->start < start) 203 BUG_ON(!hole_node->hole_follows || node->allocated);
195 wasted += start - node->start; 204
205 if (hole_start < start)
206 wasted += start - hole_start;
196 if (alignment) 207 if (alignment)
197 tmp = ((node->start + wasted) % alignment); 208 tmp = (hole_start + wasted) % alignment;
198 209
199 if (tmp) 210 if (tmp)
200 wasted += alignment - tmp; 211 wasted += alignment - tmp;
201 if (wasted) { 212
202 align_splitoff = drm_mm_split_at_start(node, wasted, atomic); 213 if (!wasted) {
203 if (unlikely(align_splitoff == NULL)) 214 hole_node->hole_follows = 0;
204 return NULL; 215 list_del_init(&hole_node->hole_stack);
205 } 216 }
206 217
207 if (node->size == size) { 218 node->start = hole_start + wasted;
208 list_del_init(&node->free_stack); 219 node->size = size;
209 node->free = 0; 220 node->mm = mm;
221 node->allocated = 1;
222
223 INIT_LIST_HEAD(&node->hole_stack);
224 list_add(&node->node_list, &hole_node->node_list);
225
226 BUG_ON(node->start + node->size > hole_end);
227 BUG_ON(node->start + node->size > end);
228
229 if (node->start + node->size < hole_end) {
230 list_add(&node->hole_stack, &mm->hole_stack);
231 node->hole_follows = 1;
210 } else { 232 } else {
211 node = drm_mm_split_at_start(node, size, atomic); 233 node->hole_follows = 0;
212 } 234 }
235}
236
237struct drm_mm_node *drm_mm_get_block_range_generic(struct drm_mm_node *hole_node,
238 unsigned long size,
239 unsigned alignment,
240 unsigned long start,
241 unsigned long end,
242 int atomic)
243{
244 struct drm_mm_node *node;
213 245
214 if (align_splitoff) 246 node = drm_mm_kmalloc(hole_node->mm, atomic);
215 drm_mm_put_block(align_splitoff); 247 if (unlikely(node == NULL))
248 return NULL;
249
250 drm_mm_insert_helper_range(hole_node, node, size, alignment,
251 start, end);
216 252
217 return node; 253 return node;
218} 254}
219EXPORT_SYMBOL(drm_mm_get_block_range_generic); 255EXPORT_SYMBOL(drm_mm_get_block_range_generic);
220 256
221/* 257/**
222 * Put a block. Merge with the previous and / or next block if they are free. 258 * Search for free space and insert a preallocated memory node. Returns
223 * Otherwise add to the free stack. 259 * -ENOSPC if no suitable free area is available. This is for range
260 * restricted allocations. The preallocated memory node must be cleared.
224 */ 261 */
225 262int drm_mm_insert_node_in_range(struct drm_mm *mm, struct drm_mm_node *node,
226void drm_mm_put_block(struct drm_mm_node *cur) 263 unsigned long size, unsigned alignment,
264 unsigned long start, unsigned long end)
227{ 265{
266 struct drm_mm_node *hole_node;
228 267
229 struct drm_mm *mm = cur->mm; 268 hole_node = drm_mm_search_free_in_range(mm, size, alignment,
230 struct list_head *cur_head = &cur->node_list; 269 start, end, 0);
231 struct list_head *root_head = &mm->node_list; 270 if (!hole_node)
232 struct drm_mm_node *prev_node = NULL; 271 return -ENOSPC;
233 struct drm_mm_node *next_node;
234 272
235 int merged = 0; 273 drm_mm_insert_helper_range(hole_node, node, size, alignment,
274 start, end);
236 275
237 BUG_ON(cur->scanned_block || cur->scanned_prev_free 276 return 0;
238 || cur->scanned_next_free); 277}
278EXPORT_SYMBOL(drm_mm_insert_node_in_range);
239 279
240 if (cur_head->prev != root_head) { 280/**
241 prev_node = 281 * Remove a memory node from the allocator.
242 list_entry(cur_head->prev, struct drm_mm_node, node_list); 282 */
243 if (prev_node->free) { 283void drm_mm_remove_node(struct drm_mm_node *node)
244 prev_node->size += cur->size; 284{
245 merged = 1; 285 struct drm_mm *mm = node->mm;
246 } 286 struct drm_mm_node *prev_node;
247 } 287
248 if (cur_head->next != root_head) { 288 BUG_ON(node->scanned_block || node->scanned_prev_free
249 next_node = 289 || node->scanned_next_free);
250 list_entry(cur_head->next, struct drm_mm_node, node_list); 290
251 if (next_node->free) { 291 prev_node =
252 if (merged) { 292 list_entry(node->node_list.prev, struct drm_mm_node, node_list);
253 prev_node->size += next_node->size; 293
254 list_del(&next_node->node_list); 294 if (node->hole_follows) {
255 list_del(&next_node->free_stack); 295 BUG_ON(drm_mm_hole_node_start(node)
256 spin_lock(&mm->unused_lock); 296 == drm_mm_hole_node_end(node));
257 if (mm->num_unused < MM_UNUSED_TARGET) { 297 list_del(&node->hole_stack);
258 list_add(&next_node->free_stack, 298 } else
259 &mm->unused_nodes); 299 BUG_ON(drm_mm_hole_node_start(node)
260 ++mm->num_unused; 300 != drm_mm_hole_node_end(node));
261 } else 301
262 kfree(next_node); 302 if (!prev_node->hole_follows) {
263 spin_unlock(&mm->unused_lock); 303 prev_node->hole_follows = 1;
264 } else { 304 list_add(&prev_node->hole_stack, &mm->hole_stack);
265 next_node->size += cur->size; 305 } else
266 next_node->start = cur->start; 306 list_move(&prev_node->hole_stack, &mm->hole_stack);
267 merged = 1; 307
268 } 308 list_del(&node->node_list);
269 } 309 node->allocated = 0;
270 }
271 if (!merged) {
272 cur->free = 1;
273 list_add(&cur->free_stack, &mm->free_stack);
274 } else {
275 list_del(&cur->node_list);
276 spin_lock(&mm->unused_lock);
277 if (mm->num_unused < MM_UNUSED_TARGET) {
278 list_add(&cur->free_stack, &mm->unused_nodes);
279 ++mm->num_unused;
280 } else
281 kfree(cur);
282 spin_unlock(&mm->unused_lock);
283 }
284} 310}
311EXPORT_SYMBOL(drm_mm_remove_node);
312
313/*
314 * Remove a memory node from the allocator and free the allocated struct
315 * drm_mm_node. Only to be used on a struct drm_mm_node obtained by one of the
316 * drm_mm_get_block functions.
317 */
318void drm_mm_put_block(struct drm_mm_node *node)
319{
320
321 struct drm_mm *mm = node->mm;
322
323 drm_mm_remove_node(node);
285 324
325 spin_lock(&mm->unused_lock);
326 if (mm->num_unused < MM_UNUSED_TARGET) {
327 list_add(&node->node_list, &mm->unused_nodes);
328 ++mm->num_unused;
329 } else
330 kfree(node);
331 spin_unlock(&mm->unused_lock);
332}
286EXPORT_SYMBOL(drm_mm_put_block); 333EXPORT_SYMBOL(drm_mm_put_block);
287 334
288static int check_free_hole(unsigned long start, unsigned long end, 335static int check_free_hole(unsigned long start, unsigned long end,
@@ -319,8 +366,10 @@ struct drm_mm_node *drm_mm_search_free(const struct drm_mm *mm,
319 best = NULL; 366 best = NULL;
320 best_size = ~0UL; 367 best_size = ~0UL;
321 368
322 list_for_each_entry(entry, &mm->free_stack, free_stack) { 369 list_for_each_entry(entry, &mm->hole_stack, hole_stack) {
323 if (!check_free_hole(entry->start, entry->start + entry->size, 370 BUG_ON(!entry->hole_follows);
371 if (!check_free_hole(drm_mm_hole_node_start(entry),
372 drm_mm_hole_node_end(entry),
324 size, alignment)) 373 size, alignment))
325 continue; 374 continue;
326 375
@@ -353,12 +402,13 @@ struct drm_mm_node *drm_mm_search_free_in_range(const struct drm_mm *mm,
353 best = NULL; 402 best = NULL;
354 best_size = ~0UL; 403 best_size = ~0UL;
355 404
356 list_for_each_entry(entry, &mm->free_stack, free_stack) { 405 list_for_each_entry(entry, &mm->hole_stack, hole_stack) {
357 unsigned long adj_start = entry->start < start ? 406 unsigned long adj_start = drm_mm_hole_node_start(entry) < start ?
358 start : entry->start; 407 start : drm_mm_hole_node_start(entry);
359 unsigned long adj_end = entry->start + entry->size > end ? 408 unsigned long adj_end = drm_mm_hole_node_end(entry) > end ?
360 end : entry->start + entry->size; 409 end : drm_mm_hole_node_end(entry);
361 410
411 BUG_ON(!entry->hole_follows);
362 if (!check_free_hole(adj_start, adj_end, size, alignment)) 412 if (!check_free_hole(adj_start, adj_end, size, alignment))
363 continue; 413 continue;
364 414
@@ -376,6 +426,23 @@ struct drm_mm_node *drm_mm_search_free_in_range(const struct drm_mm *mm,
376EXPORT_SYMBOL(drm_mm_search_free_in_range); 426EXPORT_SYMBOL(drm_mm_search_free_in_range);
377 427
378/** 428/**
429 * Moves an allocation. To be used with embedded struct drm_mm_node.
430 */
431void drm_mm_replace_node(struct drm_mm_node *old, struct drm_mm_node *new)
432{
433 list_replace(&old->node_list, &new->node_list);
434 list_replace(&old->hole_stack, &new->hole_stack);
435 new->hole_follows = old->hole_follows;
436 new->mm = old->mm;
437 new->start = old->start;
438 new->size = old->size;
439
440 old->allocated = 0;
441 new->allocated = 1;
442}
443EXPORT_SYMBOL(drm_mm_replace_node);
444
445/**
379 * Initializa lru scanning. 446 * Initializa lru scanning.
380 * 447 *
381 * This simply sets up the scanning routines with the parameters for the desired 448 * This simply sets up the scanning routines with the parameters for the desired
@@ -392,10 +459,38 @@ void drm_mm_init_scan(struct drm_mm *mm, unsigned long size,
392 mm->scanned_blocks = 0; 459 mm->scanned_blocks = 0;
393 mm->scan_hit_start = 0; 460 mm->scan_hit_start = 0;
394 mm->scan_hit_size = 0; 461 mm->scan_hit_size = 0;
462 mm->scan_check_range = 0;
463 mm->prev_scanned_node = NULL;
395} 464}
396EXPORT_SYMBOL(drm_mm_init_scan); 465EXPORT_SYMBOL(drm_mm_init_scan);
397 466
398/** 467/**
468 * Initializa lru scanning.
469 *
470 * This simply sets up the scanning routines with the parameters for the desired
471 * hole. This version is for range-restricted scans.
472 *
473 * Warning: As long as the scan list is non-empty, no other operations than
474 * adding/removing nodes to/from the scan list are allowed.
475 */
476void drm_mm_init_scan_with_range(struct drm_mm *mm, unsigned long size,
477 unsigned alignment,
478 unsigned long start,
479 unsigned long end)
480{
481 mm->scan_alignment = alignment;
482 mm->scan_size = size;
483 mm->scanned_blocks = 0;
484 mm->scan_hit_start = 0;
485 mm->scan_hit_size = 0;
486 mm->scan_start = start;
487 mm->scan_end = end;
488 mm->scan_check_range = 1;
489 mm->prev_scanned_node = NULL;
490}
491EXPORT_SYMBOL(drm_mm_init_scan_with_range);
492
493/**
399 * Add a node to the scan list that might be freed to make space for the desired 494 * Add a node to the scan list that might be freed to make space for the desired
400 * hole. 495 * hole.
401 * 496 *
@@ -404,58 +499,42 @@ EXPORT_SYMBOL(drm_mm_init_scan);
404int drm_mm_scan_add_block(struct drm_mm_node *node) 499int drm_mm_scan_add_block(struct drm_mm_node *node)
405{ 500{
406 struct drm_mm *mm = node->mm; 501 struct drm_mm *mm = node->mm;
407 struct list_head *prev_free, *next_free; 502 struct drm_mm_node *prev_node;
408 struct drm_mm_node *prev_node, *next_node; 503 unsigned long hole_start, hole_end;
504 unsigned long adj_start;
505 unsigned long adj_end;
409 506
410 mm->scanned_blocks++; 507 mm->scanned_blocks++;
411 508
412 prev_free = next_free = NULL; 509 BUG_ON(node->scanned_block);
413
414 BUG_ON(node->free);
415 node->scanned_block = 1; 510 node->scanned_block = 1;
416 node->free = 1;
417
418 if (node->node_list.prev != &mm->node_list) {
419 prev_node = list_entry(node->node_list.prev, struct drm_mm_node,
420 node_list);
421
422 if (prev_node->free) {
423 list_del(&prev_node->node_list);
424
425 node->start = prev_node->start;
426 node->size += prev_node->size;
427
428 prev_node->scanned_prev_free = 1;
429
430 prev_free = &prev_node->free_stack;
431 }
432 }
433
434 if (node->node_list.next != &mm->node_list) {
435 next_node = list_entry(node->node_list.next, struct drm_mm_node,
436 node_list);
437 511
438 if (next_node->free) { 512 prev_node = list_entry(node->node_list.prev, struct drm_mm_node,
439 list_del(&next_node->node_list); 513 node_list);
440 514
441 node->size += next_node->size; 515 node->scanned_preceeds_hole = prev_node->hole_follows;
442 516 prev_node->hole_follows = 1;
443 next_node->scanned_next_free = 1; 517 list_del(&node->node_list);
444 518 node->node_list.prev = &prev_node->node_list;
445 next_free = &next_node->free_stack; 519 node->node_list.next = &mm->prev_scanned_node->node_list;
446 } 520 mm->prev_scanned_node = node;
521
522 hole_start = drm_mm_hole_node_start(prev_node);
523 hole_end = drm_mm_hole_node_end(prev_node);
524 if (mm->scan_check_range) {
525 adj_start = hole_start < mm->scan_start ?
526 mm->scan_start : hole_start;
527 adj_end = hole_end > mm->scan_end ?
528 mm->scan_end : hole_end;
529 } else {
530 adj_start = hole_start;
531 adj_end = hole_end;
447 } 532 }
448 533
449 /* The free_stack list is not used for allocated objects, so these two 534 if (check_free_hole(adj_start , adj_end,
450 * pointers can be abused (as long as no allocations in this memory
451 * manager happens). */
452 node->free_stack.prev = prev_free;
453 node->free_stack.next = next_free;
454
455 if (check_free_hole(node->start, node->start + node->size,
456 mm->scan_size, mm->scan_alignment)) { 535 mm->scan_size, mm->scan_alignment)) {
457 mm->scan_hit_start = node->start; 536 mm->scan_hit_start = hole_start;
458 mm->scan_hit_size = node->size; 537 mm->scan_hit_size = hole_end;
459 538
460 return 1; 539 return 1;
461 } 540 }
@@ -472,7 +551,7 @@ EXPORT_SYMBOL(drm_mm_scan_add_block);
472 * corrupted. 551 * corrupted.
473 * 552 *
474 * When the scan list is empty, the selected memory nodes can be freed. An 553 * When the scan list is empty, the selected memory nodes can be freed. An
475 * immediatly following drm_mm_search_free with best_match = 0 will then return 554 * immediately following drm_mm_search_free with best_match = 0 will then return
476 * the just freed block (because its at the top of the free_stack list). 555 * the just freed block (because its at the top of the free_stack list).
477 * 556 *
478 * Returns one if this block should be evicted, zero otherwise. Will always 557 * Returns one if this block should be evicted, zero otherwise. Will always
@@ -481,39 +560,19 @@ EXPORT_SYMBOL(drm_mm_scan_add_block);
481int drm_mm_scan_remove_block(struct drm_mm_node *node) 560int drm_mm_scan_remove_block(struct drm_mm_node *node)
482{ 561{
483 struct drm_mm *mm = node->mm; 562 struct drm_mm *mm = node->mm;
484 struct drm_mm_node *prev_node, *next_node; 563 struct drm_mm_node *prev_node;
485 564
486 mm->scanned_blocks--; 565 mm->scanned_blocks--;
487 566
488 BUG_ON(!node->scanned_block); 567 BUG_ON(!node->scanned_block);
489 node->scanned_block = 0; 568 node->scanned_block = 0;
490 node->free = 0;
491 569
492 prev_node = list_entry(node->free_stack.prev, struct drm_mm_node, 570 prev_node = list_entry(node->node_list.prev, struct drm_mm_node,
493 free_stack); 571 node_list);
494 next_node = list_entry(node->free_stack.next, struct drm_mm_node,
495 free_stack);
496 572
497 if (prev_node) { 573 prev_node->hole_follows = node->scanned_preceeds_hole;
498 BUG_ON(!prev_node->scanned_prev_free); 574 INIT_LIST_HEAD(&node->node_list);
499 prev_node->scanned_prev_free = 0; 575 list_add(&node->node_list, &prev_node->node_list);
500
501 list_add_tail(&prev_node->node_list, &node->node_list);
502
503 node->start = prev_node->start + prev_node->size;
504 node->size -= prev_node->size;
505 }
506
507 if (next_node) {
508 BUG_ON(!next_node->scanned_next_free);
509 next_node->scanned_next_free = 0;
510
511 list_add(&next_node->node_list, &node->node_list);
512
513 node->size -= next_node->size;
514 }
515
516 INIT_LIST_HEAD(&node->free_stack);
517 576
518 /* Only need to check for containement because start&size for the 577 /* Only need to check for containement because start&size for the
519 * complete resulting free block (not just the desired part) is 578 * complete resulting free block (not just the desired part) is
@@ -530,7 +589,7 @@ EXPORT_SYMBOL(drm_mm_scan_remove_block);
530 589
531int drm_mm_clean(struct drm_mm * mm) 590int drm_mm_clean(struct drm_mm * mm)
532{ 591{
533 struct list_head *head = &mm->node_list; 592 struct list_head *head = &mm->head_node.node_list;
534 593
535 return (head->next->next == head); 594 return (head->next->next == head);
536} 595}
@@ -538,38 +597,40 @@ EXPORT_SYMBOL(drm_mm_clean);
538 597
539int drm_mm_init(struct drm_mm * mm, unsigned long start, unsigned long size) 598int drm_mm_init(struct drm_mm * mm, unsigned long start, unsigned long size)
540{ 599{
541 INIT_LIST_HEAD(&mm->node_list); 600 INIT_LIST_HEAD(&mm->hole_stack);
542 INIT_LIST_HEAD(&mm->free_stack);
543 INIT_LIST_HEAD(&mm->unused_nodes); 601 INIT_LIST_HEAD(&mm->unused_nodes);
544 mm->num_unused = 0; 602 mm->num_unused = 0;
545 mm->scanned_blocks = 0; 603 mm->scanned_blocks = 0;
546 spin_lock_init(&mm->unused_lock); 604 spin_lock_init(&mm->unused_lock);
547 605
548 return drm_mm_create_tail_node(mm, start, size, 0); 606 /* Clever trick to avoid a special case in the free hole tracking. */
607 INIT_LIST_HEAD(&mm->head_node.node_list);
608 INIT_LIST_HEAD(&mm->head_node.hole_stack);
609 mm->head_node.hole_follows = 1;
610 mm->head_node.scanned_block = 0;
611 mm->head_node.scanned_prev_free = 0;
612 mm->head_node.scanned_next_free = 0;
613 mm->head_node.mm = mm;
614 mm->head_node.start = start + size;
615 mm->head_node.size = start - mm->head_node.start;
616 list_add_tail(&mm->head_node.hole_stack, &mm->hole_stack);
617
618 return 0;
549} 619}
550EXPORT_SYMBOL(drm_mm_init); 620EXPORT_SYMBOL(drm_mm_init);
551 621
552void drm_mm_takedown(struct drm_mm * mm) 622void drm_mm_takedown(struct drm_mm * mm)
553{ 623{
554 struct list_head *bnode = mm->free_stack.next; 624 struct drm_mm_node *entry, *next;
555 struct drm_mm_node *entry;
556 struct drm_mm_node *next;
557
558 entry = list_entry(bnode, struct drm_mm_node, free_stack);
559 625
560 if (entry->node_list.next != &mm->node_list || 626 if (!list_empty(&mm->head_node.node_list)) {
561 entry->free_stack.next != &mm->free_stack) {
562 DRM_ERROR("Memory manager not clean. Delaying takedown\n"); 627 DRM_ERROR("Memory manager not clean. Delaying takedown\n");
563 return; 628 return;
564 } 629 }
565 630
566 list_del(&entry->free_stack);
567 list_del(&entry->node_list);
568 kfree(entry);
569
570 spin_lock(&mm->unused_lock); 631 spin_lock(&mm->unused_lock);
571 list_for_each_entry_safe(entry, next, &mm->unused_nodes, free_stack) { 632 list_for_each_entry_safe(entry, next, &mm->unused_nodes, node_list) {
572 list_del(&entry->free_stack); 633 list_del(&entry->node_list);
573 kfree(entry); 634 kfree(entry);
574 --mm->num_unused; 635 --mm->num_unused;
575 } 636 }
@@ -582,19 +643,37 @@ EXPORT_SYMBOL(drm_mm_takedown);
582void drm_mm_debug_table(struct drm_mm *mm, const char *prefix) 643void drm_mm_debug_table(struct drm_mm *mm, const char *prefix)
583{ 644{
584 struct drm_mm_node *entry; 645 struct drm_mm_node *entry;
585 int total_used = 0, total_free = 0, total = 0; 646 unsigned long total_used = 0, total_free = 0, total = 0;
586 647 unsigned long hole_start, hole_end, hole_size;
587 list_for_each_entry(entry, &mm->node_list, node_list) { 648
588 printk(KERN_DEBUG "%s 0x%08lx-0x%08lx: %8ld: %s\n", 649 hole_start = drm_mm_hole_node_start(&mm->head_node);
650 hole_end = drm_mm_hole_node_end(&mm->head_node);
651 hole_size = hole_end - hole_start;
652 if (hole_size)
653 printk(KERN_DEBUG "%s 0x%08lx-0x%08lx: %8lu: free\n",
654 prefix, hole_start, hole_end,
655 hole_size);
656 total_free += hole_size;
657
658 drm_mm_for_each_node(entry, mm) {
659 printk(KERN_DEBUG "%s 0x%08lx-0x%08lx: %8lu: used\n",
589 prefix, entry->start, entry->start + entry->size, 660 prefix, entry->start, entry->start + entry->size,
590 entry->size, entry->free ? "free" : "used"); 661 entry->size);
591 total += entry->size; 662 total_used += entry->size;
592 if (entry->free) 663
593 total_free += entry->size; 664 if (entry->hole_follows) {
594 else 665 hole_start = drm_mm_hole_node_start(entry);
595 total_used += entry->size; 666 hole_end = drm_mm_hole_node_end(entry);
667 hole_size = hole_end - hole_start;
668 printk(KERN_DEBUG "%s 0x%08lx-0x%08lx: %8lu: free\n",
669 prefix, hole_start, hole_end,
670 hole_size);
671 total_free += hole_size;
672 }
596 } 673 }
597 printk(KERN_DEBUG "%s total: %d, used %d free %d\n", prefix, total, 674 total = total_free + total_used;
675
676 printk(KERN_DEBUG "%s total: %lu, used %lu free %lu\n", prefix, total,
598 total_used, total_free); 677 total_used, total_free);
599} 678}
600EXPORT_SYMBOL(drm_mm_debug_table); 679EXPORT_SYMBOL(drm_mm_debug_table);
@@ -603,17 +682,34 @@ EXPORT_SYMBOL(drm_mm_debug_table);
603int drm_mm_dump_table(struct seq_file *m, struct drm_mm *mm) 682int drm_mm_dump_table(struct seq_file *m, struct drm_mm *mm)
604{ 683{
605 struct drm_mm_node *entry; 684 struct drm_mm_node *entry;
606 int total_used = 0, total_free = 0, total = 0; 685 unsigned long total_used = 0, total_free = 0, total = 0;
607 686 unsigned long hole_start, hole_end, hole_size;
608 list_for_each_entry(entry, &mm->node_list, node_list) { 687
609 seq_printf(m, "0x%08lx-0x%08lx: 0x%08lx: %s\n", entry->start, entry->start + entry->size, entry->size, entry->free ? "free" : "used"); 688 hole_start = drm_mm_hole_node_start(&mm->head_node);
610 total += entry->size; 689 hole_end = drm_mm_hole_node_end(&mm->head_node);
611 if (entry->free) 690 hole_size = hole_end - hole_start;
612 total_free += entry->size; 691 if (hole_size)
613 else 692 seq_printf(m, "0x%08lx-0x%08lx: 0x%08lx: free\n",
614 total_used += entry->size; 693 hole_start, hole_end, hole_size);
694 total_free += hole_size;
695
696 drm_mm_for_each_node(entry, mm) {
697 seq_printf(m, "0x%08lx-0x%08lx: 0x%08lx: used\n",
698 entry->start, entry->start + entry->size,
699 entry->size);
700 total_used += entry->size;
701 if (entry->hole_follows) {
702 hole_start = drm_mm_hole_node_start(entry);
703 hole_end = drm_mm_hole_node_end(entry);
704 hole_size = hole_end - hole_start;
705 seq_printf(m, "0x%08lx-0x%08lx: 0x%08lx: free\n",
706 hole_start, hole_end, hole_size);
707 total_free += hole_size;
708 }
615 } 709 }
616 seq_printf(m, "total: %d, used %d free %d\n", total, total_used, total_free); 710 total = total_free + total_used;
711
712 seq_printf(m, "total: %lu, used %lu free %lu\n", total, total_used, total_free);
617 return 0; 713 return 0;
618} 714}
619EXPORT_SYMBOL(drm_mm_dump_table); 715EXPORT_SYMBOL(drm_mm_dump_table);
diff --git a/drivers/gpu/drm/drm_modes.c b/drivers/gpu/drm/drm_modes.c
index 949326d2a8e5..c2d32f20e2fb 100644
--- a/drivers/gpu/drm/drm_modes.c
+++ b/drivers/gpu/drm/drm_modes.c
@@ -76,7 +76,7 @@ EXPORT_SYMBOL(drm_mode_debug_printmodeline);
76 * according to the hdisplay, vdisplay, vrefresh. 76 * according to the hdisplay, vdisplay, vrefresh.
77 * It is based from the VESA(TM) Coordinated Video Timing Generator by 77 * It is based from the VESA(TM) Coordinated Video Timing Generator by
78 * Graham Loveridge April 9, 2003 available at 78 * Graham Loveridge April 9, 2003 available at
79 * http://www.vesa.org/public/CVT/CVTd6r1.xls 79 * http://www.elo.utfsm.cl/~elo212/docs/CVTd6r1.xls
80 * 80 *
81 * And it is copied from xf86CVTmode in xserver/hw/xfree86/modes/xf86cvt.c. 81 * And it is copied from xf86CVTmode in xserver/hw/xfree86/modes/xf86cvt.c.
82 * What I have done is to translate it by using integer calculation. 82 * What I have done is to translate it by using integer calculation.
@@ -593,7 +593,7 @@ EXPORT_SYMBOL(drm_mode_height);
593 * 593 *
594 * Return @modes's hsync rate in kHz, rounded to the nearest int. 594 * Return @modes's hsync rate in kHz, rounded to the nearest int.
595 */ 595 */
596int drm_mode_hsync(struct drm_display_mode *mode) 596int drm_mode_hsync(const struct drm_display_mode *mode)
597{ 597{
598 unsigned int calc_val; 598 unsigned int calc_val;
599 599
@@ -627,7 +627,7 @@ EXPORT_SYMBOL(drm_mode_hsync);
627 * If it is 70.288, it will return 70Hz. 627 * If it is 70.288, it will return 70Hz.
628 * If it is 59.6, it will return 60Hz. 628 * If it is 59.6, it will return 60Hz.
629 */ 629 */
630int drm_mode_vrefresh(struct drm_display_mode *mode) 630int drm_mode_vrefresh(const struct drm_display_mode *mode)
631{ 631{
632 int refresh = 0; 632 int refresh = 0;
633 unsigned int calc_val; 633 unsigned int calc_val;
@@ -725,7 +725,7 @@ EXPORT_SYMBOL(drm_mode_set_crtcinfo);
725 * a pointer to it. Used to create new instances of established modes. 725 * a pointer to it. Used to create new instances of established modes.
726 */ 726 */
727struct drm_display_mode *drm_mode_duplicate(struct drm_device *dev, 727struct drm_display_mode *drm_mode_duplicate(struct drm_device *dev,
728 struct drm_display_mode *mode) 728 const struct drm_display_mode *mode)
729{ 729{
730 struct drm_display_mode *nmode; 730 struct drm_display_mode *nmode;
731 int new_id; 731 int new_id;
@@ -974,3 +974,159 @@ void drm_mode_connector_list_update(struct drm_connector *connector)
974 } 974 }
975} 975}
976EXPORT_SYMBOL(drm_mode_connector_list_update); 976EXPORT_SYMBOL(drm_mode_connector_list_update);
977
978/**
979 * drm_mode_parse_command_line_for_connector - parse command line for connector
980 * @mode_option - per connector mode option
981 * @connector - connector to parse line for
982 *
983 * This parses the connector specific then generic command lines for
984 * modes and options to configure the connector.
985 *
986 * This uses the same parameters as the fb modedb.c, except for extra
987 * <xres>x<yres>[M][R][-<bpp>][@<refresh>][i][m][eDd]
988 *
989 * enable/enable Digital/disable bit at the end
990 */
991bool drm_mode_parse_command_line_for_connector(const char *mode_option,
992 struct drm_connector *connector,
993 struct drm_cmdline_mode *mode)
994{
995 const char *name;
996 unsigned int namelen;
997 int res_specified = 0, bpp_specified = 0, refresh_specified = 0;
998 unsigned int xres = 0, yres = 0, bpp = 32, refresh = 0;
999 int yres_specified = 0, cvt = 0, rb = 0, interlace = 0, margins = 0;
1000 int i;
1001 enum drm_connector_force force = DRM_FORCE_UNSPECIFIED;
1002
1003#ifdef CONFIG_FB
1004 if (!mode_option)
1005 mode_option = fb_mode_option;
1006#endif
1007
1008 if (!mode_option) {
1009 mode->specified = false;
1010 return false;
1011 }
1012
1013 name = mode_option;
1014 namelen = strlen(name);
1015 for (i = namelen-1; i >= 0; i--) {
1016 switch (name[i]) {
1017 case '@':
1018 namelen = i;
1019 if (!refresh_specified && !bpp_specified &&
1020 !yres_specified) {
1021 refresh = simple_strtol(&name[i+1], NULL, 10);
1022 refresh_specified = 1;
1023 if (cvt || rb)
1024 cvt = 0;
1025 } else
1026 goto done;
1027 break;
1028 case '-':
1029 namelen = i;
1030 if (!bpp_specified && !yres_specified) {
1031 bpp = simple_strtol(&name[i+1], NULL, 10);
1032 bpp_specified = 1;
1033 if (cvt || rb)
1034 cvt = 0;
1035 } else
1036 goto done;
1037 break;
1038 case 'x':
1039 if (!yres_specified) {
1040 yres = simple_strtol(&name[i+1], NULL, 10);
1041 yres_specified = 1;
1042 } else
1043 goto done;
1044 case '0' ... '9':
1045 break;
1046 case 'M':
1047 if (!yres_specified)
1048 cvt = 1;
1049 break;
1050 case 'R':
1051 if (cvt)
1052 rb = 1;
1053 break;
1054 case 'm':
1055 if (!cvt)
1056 margins = 1;
1057 break;
1058 case 'i':
1059 if (!cvt)
1060 interlace = 1;
1061 break;
1062 case 'e':
1063 force = DRM_FORCE_ON;
1064 break;
1065 case 'D':
1066 if ((connector->connector_type != DRM_MODE_CONNECTOR_DVII) &&
1067 (connector->connector_type != DRM_MODE_CONNECTOR_HDMIB))
1068 force = DRM_FORCE_ON;
1069 else
1070 force = DRM_FORCE_ON_DIGITAL;
1071 break;
1072 case 'd':
1073 force = DRM_FORCE_OFF;
1074 break;
1075 default:
1076 goto done;
1077 }
1078 }
1079 if (i < 0 && yres_specified) {
1080 xres = simple_strtol(name, NULL, 10);
1081 res_specified = 1;
1082 }
1083done:
1084 if (res_specified) {
1085 mode->specified = true;
1086 mode->xres = xres;
1087 mode->yres = yres;
1088 }
1089
1090 if (refresh_specified) {
1091 mode->refresh_specified = true;
1092 mode->refresh = refresh;
1093 }
1094
1095 if (bpp_specified) {
1096 mode->bpp_specified = true;
1097 mode->bpp = bpp;
1098 }
1099 mode->rb = rb ? true : false;
1100 mode->cvt = cvt ? true : false;
1101 mode->interlace = interlace ? true : false;
1102 mode->force = force;
1103
1104 return true;
1105}
1106EXPORT_SYMBOL(drm_mode_parse_command_line_for_connector);
1107
1108struct drm_display_mode *
1109drm_mode_create_from_cmdline_mode(struct drm_device *dev,
1110 struct drm_cmdline_mode *cmd)
1111{
1112 struct drm_display_mode *mode;
1113
1114 if (cmd->cvt)
1115 mode = drm_cvt_mode(dev,
1116 cmd->xres, cmd->yres,
1117 cmd->refresh_specified ? cmd->refresh : 60,
1118 cmd->rb, cmd->interlace,
1119 cmd->margins);
1120 else
1121 mode = drm_gtf_mode(dev,
1122 cmd->xres, cmd->yres,
1123 cmd->refresh_specified ? cmd->refresh : 60,
1124 cmd->interlace,
1125 cmd->margins);
1126 if (!mode)
1127 return NULL;
1128
1129 drm_mode_set_crtcinfo(mode, CRTC_INTERLACE_HALVE_V);
1130 return mode;
1131}
1132EXPORT_SYMBOL(drm_mode_create_from_cmdline_mode);
diff --git a/drivers/gpu/drm/drm_pci.c b/drivers/gpu/drm/drm_pci.c
index f5bd9e590c80..b6a19cb07caf 100644
--- a/drivers/gpu/drm/drm_pci.c
+++ b/drivers/gpu/drm/drm_pci.c
@@ -125,6 +125,177 @@ void drm_pci_free(struct drm_device * dev, drm_dma_handle_t * dmah)
125EXPORT_SYMBOL(drm_pci_free); 125EXPORT_SYMBOL(drm_pci_free);
126 126
127#ifdef CONFIG_PCI 127#ifdef CONFIG_PCI
128
129static int drm_get_pci_domain(struct drm_device *dev)
130{
131#ifndef __alpha__
132 /* For historical reasons, drm_get_pci_domain() is busticated
133 * on most archs and has to remain so for userspace interface
134 * < 1.4, except on alpha which was right from the beginning
135 */
136 if (dev->if_version < 0x10004)
137 return 0;
138#endif /* __alpha__ */
139
140 return pci_domain_nr(dev->pdev->bus);
141}
142
143static int drm_pci_get_irq(struct drm_device *dev)
144{
145 return dev->pdev->irq;
146}
147
148static const char *drm_pci_get_name(struct drm_device *dev)
149{
150 struct pci_driver *pdriver = dev->driver->kdriver.pci;
151 return pdriver->name;
152}
153
154int drm_pci_set_busid(struct drm_device *dev, struct drm_master *master)
155{
156 int len, ret;
157 struct pci_driver *pdriver = dev->driver->kdriver.pci;
158 master->unique_len = 40;
159 master->unique_size = master->unique_len;
160 master->unique = kmalloc(master->unique_size, GFP_KERNEL);
161 if (master->unique == NULL)
162 return -ENOMEM;
163
164
165 len = snprintf(master->unique, master->unique_len,
166 "pci:%04x:%02x:%02x.%d",
167 drm_get_pci_domain(dev),
168 dev->pdev->bus->number,
169 PCI_SLOT(dev->pdev->devfn),
170 PCI_FUNC(dev->pdev->devfn));
171
172 if (len >= master->unique_len) {
173 DRM_ERROR("buffer overflow");
174 ret = -EINVAL;
175 goto err;
176 } else
177 master->unique_len = len;
178
179 dev->devname =
180 kmalloc(strlen(pdriver->name) +
181 master->unique_len + 2, GFP_KERNEL);
182
183 if (dev->devname == NULL) {
184 ret = -ENOMEM;
185 goto err;
186 }
187
188 sprintf(dev->devname, "%s@%s", pdriver->name,
189 master->unique);
190
191 return 0;
192err:
193 return ret;
194}
195
196int drm_pci_set_unique(struct drm_device *dev,
197 struct drm_master *master,
198 struct drm_unique *u)
199{
200 int domain, bus, slot, func, ret;
201 const char *bus_name;
202
203 master->unique_len = u->unique_len;
204 master->unique_size = u->unique_len + 1;
205 master->unique = kmalloc(master->unique_size, GFP_KERNEL);
206 if (!master->unique) {
207 ret = -ENOMEM;
208 goto err;
209 }
210
211 if (copy_from_user(master->unique, u->unique, master->unique_len)) {
212 ret = -EFAULT;
213 goto err;
214 }
215
216 master->unique[master->unique_len] = '\0';
217
218 bus_name = dev->driver->bus->get_name(dev);
219 dev->devname = kmalloc(strlen(bus_name) +
220 strlen(master->unique) + 2, GFP_KERNEL);
221 if (!dev->devname) {
222 ret = -ENOMEM;
223 goto err;
224 }
225
226 sprintf(dev->devname, "%s@%s", bus_name,
227 master->unique);
228
229 /* Return error if the busid submitted doesn't match the device's actual
230 * busid.
231 */
232 ret = sscanf(master->unique, "PCI:%d:%d:%d", &bus, &slot, &func);
233 if (ret != 3) {
234 ret = -EINVAL;
235 goto err;
236 }
237
238 domain = bus >> 8;
239 bus &= 0xff;
240
241 if ((domain != drm_get_pci_domain(dev)) ||
242 (bus != dev->pdev->bus->number) ||
243 (slot != PCI_SLOT(dev->pdev->devfn)) ||
244 (func != PCI_FUNC(dev->pdev->devfn))) {
245 ret = -EINVAL;
246 goto err;
247 }
248 return 0;
249err:
250 return ret;
251}
252
253
254static int drm_pci_irq_by_busid(struct drm_device *dev, struct drm_irq_busid *p)
255{
256 if ((p->busnum >> 8) != drm_get_pci_domain(dev) ||
257 (p->busnum & 0xff) != dev->pdev->bus->number ||
258 p->devnum != PCI_SLOT(dev->pdev->devfn) || p->funcnum != PCI_FUNC(dev->pdev->devfn))
259 return -EINVAL;
260
261 p->irq = dev->pdev->irq;
262
263 DRM_DEBUG("%d:%d:%d => IRQ %d\n", p->busnum, p->devnum, p->funcnum,
264 p->irq);
265 return 0;
266}
267
268int drm_pci_agp_init(struct drm_device *dev)
269{
270 if (drm_core_has_AGP(dev)) {
271 if (drm_pci_device_is_agp(dev))
272 dev->agp = drm_agp_init(dev);
273 if (drm_core_check_feature(dev, DRIVER_REQUIRE_AGP)
274 && (dev->agp == NULL)) {
275 DRM_ERROR("Cannot initialize the agpgart module.\n");
276 return -EINVAL;
277 }
278 if (drm_core_has_MTRR(dev)) {
279 if (dev->agp)
280 dev->agp->agp_mtrr =
281 mtrr_add(dev->agp->agp_info.aper_base,
282 dev->agp->agp_info.aper_size *
283 1024 * 1024, MTRR_TYPE_WRCOMB, 1);
284 }
285 }
286 return 0;
287}
288
289static struct drm_bus drm_pci_bus = {
290 .bus_type = DRIVER_BUS_PCI,
291 .get_irq = drm_pci_get_irq,
292 .get_name = drm_pci_get_name,
293 .set_busid = drm_pci_set_busid,
294 .set_unique = drm_pci_set_unique,
295 .irq_by_busid = drm_pci_irq_by_busid,
296 .agp_init = drm_pci_agp_init,
297};
298
128/** 299/**
129 * Register. 300 * Register.
130 * 301 *
@@ -219,7 +390,7 @@ err_g1:
219EXPORT_SYMBOL(drm_get_pci_dev); 390EXPORT_SYMBOL(drm_get_pci_dev);
220 391
221/** 392/**
222 * PCI device initialization. Called via drm_init at module load time, 393 * PCI device initialization. Called direct from modules at load time.
223 * 394 *
224 * \return zero on success or a negative number on failure. 395 * \return zero on success or a negative number on failure.
225 * 396 *
@@ -229,18 +400,24 @@ EXPORT_SYMBOL(drm_get_pci_dev);
229 * Expands the \c DRIVER_PREINIT and \c DRIVER_POST_INIT macros before and 400 * Expands the \c DRIVER_PREINIT and \c DRIVER_POST_INIT macros before and
230 * after the initialization for driver customization. 401 * after the initialization for driver customization.
231 */ 402 */
232int drm_pci_init(struct drm_driver *driver) 403int drm_pci_init(struct drm_driver *driver, struct pci_driver *pdriver)
233{ 404{
234 struct pci_dev *pdev = NULL; 405 struct pci_dev *pdev = NULL;
235 const struct pci_device_id *pid; 406 const struct pci_device_id *pid;
236 int i; 407 int i;
237 408
409 DRM_DEBUG("\n");
410
411 INIT_LIST_HEAD(&driver->device_list);
412 driver->kdriver.pci = pdriver;
413 driver->bus = &drm_pci_bus;
414
238 if (driver->driver_features & DRIVER_MODESET) 415 if (driver->driver_features & DRIVER_MODESET)
239 return pci_register_driver(&driver->pci_driver); 416 return pci_register_driver(pdriver);
240 417
241 /* If not using KMS, fall back to stealth mode manual scanning. */ 418 /* If not using KMS, fall back to stealth mode manual scanning. */
242 for (i = 0; driver->pci_driver.id_table[i].vendor != 0; i++) { 419 for (i = 0; pdriver->id_table[i].vendor != 0; i++) {
243 pid = &driver->pci_driver.id_table[i]; 420 pid = &pdriver->id_table[i];
244 421
245 /* Loop around setting up a DRM device for each PCI device 422 /* Loop around setting up a DRM device for each PCI device
246 * matching our ID and device class. If we had the internal 423 * matching our ID and device class. If we had the internal
@@ -265,10 +442,27 @@ int drm_pci_init(struct drm_driver *driver)
265 442
266#else 443#else
267 444
268int drm_pci_init(struct drm_driver *driver) 445int drm_pci_init(struct drm_driver *driver, struct pci_driver *pdriver)
269{ 446{
270 return -1; 447 return -1;
271} 448}
272 449
273#endif 450#endif
451
452EXPORT_SYMBOL(drm_pci_init);
453
274/*@}*/ 454/*@}*/
455void drm_pci_exit(struct drm_driver *driver, struct pci_driver *pdriver)
456{
457 struct drm_device *dev, *tmp;
458 DRM_DEBUG("\n");
459
460 if (driver->driver_features & DRIVER_MODESET) {
461 pci_unregister_driver(pdriver);
462 } else {
463 list_for_each_entry_safe(dev, tmp, &driver->device_list, driver_item)
464 drm_put_dev(dev);
465 }
466 DRM_INFO("Module unloaded\n");
467}
468EXPORT_SYMBOL(drm_pci_exit);
diff --git a/drivers/gpu/drm/drm_platform.c b/drivers/gpu/drm/drm_platform.c
index 92d1d0fb7b75..7223f06d8e58 100644
--- a/drivers/gpu/drm/drm_platform.c
+++ b/drivers/gpu/drm/drm_platform.c
@@ -109,8 +109,60 @@ err_g1:
109} 109}
110EXPORT_SYMBOL(drm_get_platform_dev); 110EXPORT_SYMBOL(drm_get_platform_dev);
111 111
112static int drm_platform_get_irq(struct drm_device *dev)
113{
114 return platform_get_irq(dev->platformdev, 0);
115}
116
117static const char *drm_platform_get_name(struct drm_device *dev)
118{
119 return dev->platformdev->name;
120}
121
122static int drm_platform_set_busid(struct drm_device *dev, struct drm_master *master)
123{
124 int len, ret;
125
126 master->unique_len = 10 + strlen(dev->platformdev->name);
127 master->unique = kmalloc(master->unique_len + 1, GFP_KERNEL);
128
129 if (master->unique == NULL)
130 return -ENOMEM;
131
132 len = snprintf(master->unique, master->unique_len,
133 "platform:%s", dev->platformdev->name);
134
135 if (len > master->unique_len) {
136 DRM_ERROR("Unique buffer overflowed\n");
137 ret = -EINVAL;
138 goto err;
139 }
140
141 dev->devname =
142 kmalloc(strlen(dev->platformdev->name) +
143 master->unique_len + 2, GFP_KERNEL);
144
145 if (dev->devname == NULL) {
146 ret = -ENOMEM;
147 goto err;
148 }
149
150 sprintf(dev->devname, "%s@%s", dev->platformdev->name,
151 master->unique);
152 return 0;
153err:
154 return ret;
155}
156
157static struct drm_bus drm_platform_bus = {
158 .bus_type = DRIVER_BUS_PLATFORM,
159 .get_irq = drm_platform_get_irq,
160 .get_name = drm_platform_get_name,
161 .set_busid = drm_platform_set_busid,
162};
163
112/** 164/**
113 * Platform device initialization. Called via drm_init at module load time, 165 * Platform device initialization. Called direct from modules.
114 * 166 *
115 * \return zero on success or a negative number on failure. 167 * \return zero on success or a negative number on failure.
116 * 168 *
@@ -121,7 +173,24 @@ EXPORT_SYMBOL(drm_get_platform_dev);
121 * after the initialization for driver customization. 173 * after the initialization for driver customization.
122 */ 174 */
123 175
124int drm_platform_init(struct drm_driver *driver) 176int drm_platform_init(struct drm_driver *driver, struct platform_device *platform_device)
125{ 177{
126 return drm_get_platform_dev(driver->platform_device, driver); 178 DRM_DEBUG("\n");
179
180 driver->kdriver.platform_device = platform_device;
181 driver->bus = &drm_platform_bus;
182 INIT_LIST_HEAD(&driver->device_list);
183 return drm_get_platform_dev(platform_device, driver);
184}
185EXPORT_SYMBOL(drm_platform_init);
186
187void drm_platform_exit(struct drm_driver *driver, struct platform_device *platform_device)
188{
189 struct drm_device *dev, *tmp;
190 DRM_DEBUG("\n");
191
192 list_for_each_entry_safe(dev, tmp, &driver->device_list, driver_item)
193 drm_put_dev(dev);
194 DRM_INFO("Module unloaded\n");
127} 195}
196EXPORT_SYMBOL(drm_platform_exit);
diff --git a/drivers/gpu/drm/drm_proc.c b/drivers/gpu/drm/drm_proc.c
index a9ba6b69ad35..9e5b07efebb7 100644
--- a/drivers/gpu/drm/drm_proc.c
+++ b/drivers/gpu/drm/drm_proc.c
@@ -55,7 +55,6 @@ static struct drm_info_list drm_proc_list[] = {
55 {"queues", drm_queues_info, 0}, 55 {"queues", drm_queues_info, 0},
56 {"bufs", drm_bufs_info, 0}, 56 {"bufs", drm_bufs_info, 0},
57 {"gem_names", drm_gem_name_info, DRIVER_GEM}, 57 {"gem_names", drm_gem_name_info, DRIVER_GEM},
58 {"gem_objects", drm_gem_object_info, DRIVER_GEM},
59#if DRM_DEBUG_CODE 58#if DRM_DEBUG_CODE
60 {"vma", drm_vma_info, 0}, 59 {"vma", drm_vma_info, 0},
61#endif 60#endif
@@ -151,7 +150,6 @@ fail:
151int drm_proc_init(struct drm_minor *minor, int minor_id, 150int drm_proc_init(struct drm_minor *minor, int minor_id,
152 struct proc_dir_entry *root) 151 struct proc_dir_entry *root)
153{ 152{
154 struct drm_device *dev = minor->dev;
155 char name[64]; 153 char name[64];
156 int ret; 154 int ret;
157 155
@@ -172,14 +170,6 @@ int drm_proc_init(struct drm_minor *minor, int minor_id,
172 return ret; 170 return ret;
173 } 171 }
174 172
175 if (dev->driver->proc_init) {
176 ret = dev->driver->proc_init(minor);
177 if (ret) {
178 DRM_ERROR("DRM: Driver failed to initialize "
179 "/proc/dri.\n");
180 return ret;
181 }
182 }
183 return 0; 173 return 0;
184} 174}
185 175
@@ -216,15 +206,11 @@ int drm_proc_remove_files(struct drm_info_list *files, int count,
216 */ 206 */
217int drm_proc_cleanup(struct drm_minor *minor, struct proc_dir_entry *root) 207int drm_proc_cleanup(struct drm_minor *minor, struct proc_dir_entry *root)
218{ 208{
219 struct drm_device *dev = minor->dev;
220 char name[64]; 209 char name[64];
221 210
222 if (!root || !minor->proc_root) 211 if (!root || !minor->proc_root)
223 return 0; 212 return 0;
224 213
225 if (dev->driver->proc_cleanup)
226 dev->driver->proc_cleanup(minor);
227
228 drm_proc_remove_files(drm_proc_list, DRM_PROC_ENTRIES, minor); 214 drm_proc_remove_files(drm_proc_list, DRM_PROC_ENTRIES, minor);
229 215
230 sprintf(name, "%d", minor->index); 216 sprintf(name, "%d", minor->index);
diff --git a/drivers/gpu/drm/drm_scatter.c b/drivers/gpu/drm/drm_scatter.c
index 9034c4c6100d..d15e09b0ae0b 100644
--- a/drivers/gpu/drm/drm_scatter.c
+++ b/drivers/gpu/drm/drm_scatter.c
@@ -184,8 +184,6 @@ int drm_sg_alloc(struct drm_device *dev, struct drm_scatter_gather * request)
184 drm_sg_cleanup(entry); 184 drm_sg_cleanup(entry);
185 return -ENOMEM; 185 return -ENOMEM;
186} 186}
187EXPORT_SYMBOL(drm_sg_alloc);
188
189 187
190int drm_sg_alloc_ioctl(struct drm_device *dev, void *data, 188int drm_sg_alloc_ioctl(struct drm_device *dev, void *data,
191 struct drm_file *file_priv) 189 struct drm_file *file_priv)
diff --git a/drivers/gpu/drm/drm_sman.c b/drivers/gpu/drm/drm_sman.c
index 463aed9403db..34664587a74e 100644
--- a/drivers/gpu/drm/drm_sman.c
+++ b/drivers/gpu/drm/drm_sman.c
@@ -59,9 +59,7 @@ drm_sman_init(struct drm_sman * sman, unsigned int num_managers,
59{ 59{
60 int ret = 0; 60 int ret = 0;
61 61
62 sman->mm = (struct drm_sman_mm *) kcalloc(num_managers, 62 sman->mm = kcalloc(num_managers, sizeof(*sman->mm), GFP_KERNEL);
63 sizeof(*sman->mm),
64 GFP_KERNEL);
65 if (!sman->mm) { 63 if (!sman->mm) {
66 ret = -ENOMEM; 64 ret = -ENOMEM;
67 goto out; 65 goto out;
diff --git a/drivers/gpu/drm/drm_stub.c b/drivers/gpu/drm/drm_stub.c
index d1ad57450df1..6d7b083c5b77 100644
--- a/drivers/gpu/drm/drm_stub.c
+++ b/drivers/gpu/drm/drm_stub.c
@@ -40,18 +40,48 @@
40unsigned int drm_debug = 0; /* 1 to enable debug output */ 40unsigned int drm_debug = 0; /* 1 to enable debug output */
41EXPORT_SYMBOL(drm_debug); 41EXPORT_SYMBOL(drm_debug);
42 42
43unsigned int drm_vblank_offdelay = 5000; /* Default to 5000 msecs. */
44EXPORT_SYMBOL(drm_vblank_offdelay);
45
46unsigned int drm_timestamp_precision = 20; /* Default to 20 usecs. */
47EXPORT_SYMBOL(drm_timestamp_precision);
48
43MODULE_AUTHOR(CORE_AUTHOR); 49MODULE_AUTHOR(CORE_AUTHOR);
44MODULE_DESCRIPTION(CORE_DESC); 50MODULE_DESCRIPTION(CORE_DESC);
45MODULE_LICENSE("GPL and additional rights"); 51MODULE_LICENSE("GPL and additional rights");
46MODULE_PARM_DESC(debug, "Enable debug output"); 52MODULE_PARM_DESC(debug, "Enable debug output");
53MODULE_PARM_DESC(vblankoffdelay, "Delay until vblank irq auto-disable [msecs]");
54MODULE_PARM_DESC(timestamp_precision_usec, "Max. error on timestamps [usecs]");
47 55
48module_param_named(debug, drm_debug, int, 0600); 56module_param_named(debug, drm_debug, int, 0600);
57module_param_named(vblankoffdelay, drm_vblank_offdelay, int, 0600);
58module_param_named(timestamp_precision_usec, drm_timestamp_precision, int, 0600);
49 59
50struct idr drm_minors_idr; 60struct idr drm_minors_idr;
51 61
52struct class *drm_class; 62struct class *drm_class;
53struct proc_dir_entry *drm_proc_root; 63struct proc_dir_entry *drm_proc_root;
54struct dentry *drm_debugfs_root; 64struct dentry *drm_debugfs_root;
65
66int drm_err(const char *func, const char *format, ...)
67{
68 struct va_format vaf;
69 va_list args;
70 int r;
71
72 va_start(args, format);
73
74 vaf.fmt = format;
75 vaf.va = &args;
76
77 r = printk(KERN_ERR "[" DRM_NAME ":%s] *ERROR* %pV", func, &vaf);
78
79 va_end(args);
80
81 return r;
82}
83EXPORT_SYMBOL(drm_err);
84
55void drm_ut_debug_printk(unsigned int request_level, 85void drm_ut_debug_printk(unsigned int request_level,
56 const char *prefix, 86 const char *prefix,
57 const char *function_name, 87 const char *function_name,
@@ -68,6 +98,7 @@ void drm_ut_debug_printk(unsigned int request_level,
68 } 98 }
69} 99}
70EXPORT_SYMBOL(drm_ut_debug_printk); 100EXPORT_SYMBOL(drm_ut_debug_printk);
101
71static int drm_minor_get_id(struct drm_device *dev, int type) 102static int drm_minor_get_id(struct drm_device *dev, int type)
72{ 103{
73 int new_id; 104 int new_id;
@@ -240,14 +271,10 @@ int drm_fill_in_dev(struct drm_device *dev,
240 INIT_LIST_HEAD(&dev->vblank_event_list); 271 INIT_LIST_HEAD(&dev->vblank_event_list);
241 272
242 spin_lock_init(&dev->count_lock); 273 spin_lock_init(&dev->count_lock);
243 spin_lock_init(&dev->drw_lock);
244 spin_lock_init(&dev->event_lock); 274 spin_lock_init(&dev->event_lock);
245 init_timer(&dev->timer);
246 mutex_init(&dev->struct_mutex); 275 mutex_init(&dev->struct_mutex);
247 mutex_init(&dev->ctxlist_mutex); 276 mutex_init(&dev->ctxlist_mutex);
248 277
249 idr_init(&dev->drw_idr);
250
251 if (drm_ht_create(&dev->map_hash, 12)) { 278 if (drm_ht_create(&dev->map_hash, 12)) {
252 return -ENOMEM; 279 return -ENOMEM;
253 } 280 }
@@ -263,25 +290,14 @@ int drm_fill_in_dev(struct drm_device *dev,
263 290
264 dev->driver = driver; 291 dev->driver = driver;
265 292
266 if (drm_core_has_AGP(dev)) { 293 if (dev->driver->bus->agp_init) {
267 if (drm_device_is_agp(dev)) 294 retcode = dev->driver->bus->agp_init(dev);
268 dev->agp = drm_agp_init(dev); 295 if (retcode)
269 if (drm_core_check_feature(dev, DRIVER_REQUIRE_AGP)
270 && (dev->agp == NULL)) {
271 DRM_ERROR("Cannot initialize the agpgart module.\n");
272 retcode = -EINVAL;
273 goto error_out_unreg; 296 goto error_out_unreg;
274 }
275 if (drm_core_has_MTRR(dev)) {
276 if (dev->agp)
277 dev->agp->agp_mtrr =
278 mtrr_add(dev->agp->agp_info.aper_base,
279 dev->agp->agp_info.aper_size *
280 1024 * 1024, MTRR_TYPE_WRCOMB, 1);
281 }
282 } 297 }
283 298
284 299
300
285 retcode = drm_ctxbitmap_init(dev); 301 retcode = drm_ctxbitmap_init(dev);
286 if (retcode) { 302 if (retcode) {
287 DRM_ERROR("Cannot allocate memory for context bitmap.\n"); 303 DRM_ERROR("Cannot allocate memory for context bitmap.\n");
@@ -419,7 +435,6 @@ int drm_put_minor(struct drm_minor **minor_p)
419 * 435 *
420 * Cleans up all DRM device, calling drm_lastclose(). 436 * Cleans up all DRM device, calling drm_lastclose().
421 * 437 *
422 * \sa drm_init
423 */ 438 */
424void drm_put_dev(struct drm_device *dev) 439void drm_put_dev(struct drm_device *dev)
425{ 440{
@@ -469,6 +484,7 @@ void drm_put_dev(struct drm_device *dev)
469 484
470 drm_put_minor(&dev->primary); 485 drm_put_minor(&dev->primary);
471 486
487 list_del(&dev->driver_item);
472 if (dev->devname) { 488 if (dev->devname) {
473 kfree(dev->devname); 489 kfree(dev->devname);
474 dev->devname = NULL; 490 dev->devname = NULL;
diff --git a/drivers/gpu/drm/drm_sysfs.c b/drivers/gpu/drm/drm_sysfs.c
index 85da4c40694c..2eee8e016b38 100644
--- a/drivers/gpu/drm/drm_sysfs.c
+++ b/drivers/gpu/drm/drm_sysfs.c
@@ -158,8 +158,15 @@ static ssize_t status_show(struct device *device,
158{ 158{
159 struct drm_connector *connector = to_drm_connector(device); 159 struct drm_connector *connector = to_drm_connector(device);
160 enum drm_connector_status status; 160 enum drm_connector_status status;
161 int ret;
162
163 ret = mutex_lock_interruptible(&connector->dev->mode_config.mutex);
164 if (ret)
165 return ret;
161 166
162 status = connector->funcs->detect(connector, true); 167 status = connector->funcs->detect(connector, true);
168 mutex_unlock(&connector->dev->mode_config.mutex);
169
163 return snprintf(buf, PAGE_SIZE, "%s\n", 170 return snprintf(buf, PAGE_SIZE, "%s\n",
164 drm_get_connector_status_name(status)); 171 drm_get_connector_status_name(status));
165} 172}
diff --git a/drivers/gpu/drm/drm_usb.c b/drivers/gpu/drm/drm_usb.c
new file mode 100644
index 000000000000..206d2300d873
--- /dev/null
+++ b/drivers/gpu/drm/drm_usb.c
@@ -0,0 +1,117 @@
1#include "drmP.h"
2#include <linux/usb.h>
3
4#ifdef CONFIG_USB
5int drm_get_usb_dev(struct usb_interface *interface,
6 const struct usb_device_id *id,
7 struct drm_driver *driver)
8{
9 struct drm_device *dev;
10 struct usb_device *usbdev;
11 int ret;
12
13 DRM_DEBUG("\n");
14
15 dev = kzalloc(sizeof(*dev), GFP_KERNEL);
16 if (!dev)
17 return -ENOMEM;
18
19 usbdev = interface_to_usbdev(interface);
20 dev->usbdev = usbdev;
21 dev->dev = &usbdev->dev;
22
23 mutex_lock(&drm_global_mutex);
24
25 ret = drm_fill_in_dev(dev, NULL, driver);
26 if (ret) {
27 printk(KERN_ERR "DRM: Fill_in_dev failed.\n");
28 goto err_g1;
29 }
30
31 usb_set_intfdata(interface, dev);
32 ret = drm_get_minor(dev, &dev->control, DRM_MINOR_CONTROL);
33 if (ret)
34 goto err_g1;
35
36 ret = drm_get_minor(dev, &dev->primary, DRM_MINOR_LEGACY);
37 if (ret)
38 goto err_g2;
39
40 if (dev->driver->load) {
41 ret = dev->driver->load(dev, 0);
42 if (ret)
43 goto err_g3;
44 }
45
46 /* setup the grouping for the legacy output */
47 ret = drm_mode_group_init_legacy_group(dev,
48 &dev->primary->mode_group);
49 if (ret)
50 goto err_g3;
51
52 list_add_tail(&dev->driver_item, &driver->device_list);
53
54 mutex_unlock(&drm_global_mutex);
55
56 DRM_INFO("Initialized %s %d.%d.%d %s on minor %d\n",
57 driver->name, driver->major, driver->minor, driver->patchlevel,
58 driver->date, dev->primary->index);
59
60 return 0;
61
62err_g3:
63 drm_put_minor(&dev->primary);
64err_g2:
65 drm_put_minor(&dev->control);
66err_g1:
67 kfree(dev);
68 mutex_unlock(&drm_global_mutex);
69 return ret;
70
71}
72EXPORT_SYMBOL(drm_get_usb_dev);
73
74static int drm_usb_get_irq(struct drm_device *dev)
75{
76 return 0;
77}
78
79static const char *drm_usb_get_name(struct drm_device *dev)
80{
81 return "USB";
82}
83
84static int drm_usb_set_busid(struct drm_device *dev,
85 struct drm_master *master)
86{
87 return 0;
88}
89
90static struct drm_bus drm_usb_bus = {
91 .bus_type = DRIVER_BUS_USB,
92 .get_irq = drm_usb_get_irq,
93 .get_name = drm_usb_get_name,
94 .set_busid = drm_usb_set_busid,
95};
96
97int drm_usb_init(struct drm_driver *driver, struct usb_driver *udriver)
98{
99 int res;
100 DRM_DEBUG("\n");
101
102 INIT_LIST_HEAD(&driver->device_list);
103 driver->kdriver.usb = udriver;
104 driver->bus = &drm_usb_bus;
105
106 res = usb_register(udriver);
107 return res;
108}
109EXPORT_SYMBOL(drm_usb_init);
110
111void drm_usb_exit(struct drm_driver *driver,
112 struct usb_driver *udriver)
113{
114 usb_deregister(udriver);
115}
116EXPORT_SYMBOL(drm_usb_exit);
117#endif
diff --git a/drivers/gpu/drm/drm_vm.c b/drivers/gpu/drm/drm_vm.c
index 5df450683aab..5db96d45fc71 100644
--- a/drivers/gpu/drm/drm_vm.c
+++ b/drivers/gpu/drm/drm_vm.c
@@ -523,24 +523,15 @@ static int drm_mmap_dma(struct file *filp, struct vm_area_struct *vma)
523 return 0; 523 return 0;
524} 524}
525 525
526resource_size_t drm_core_get_map_ofs(struct drm_local_map * map) 526static resource_size_t drm_core_get_reg_ofs(struct drm_device *dev)
527{
528 return map->offset;
529}
530
531EXPORT_SYMBOL(drm_core_get_map_ofs);
532
533resource_size_t drm_core_get_reg_ofs(struct drm_device *dev)
534{ 527{
535#ifdef __alpha__ 528#ifdef __alpha__
536 return dev->hose->dense_mem_base - dev->hose->mem_space->start; 529 return dev->hose->dense_mem_base;
537#else 530#else
538 return 0; 531 return 0;
539#endif 532#endif
540} 533}
541 534
542EXPORT_SYMBOL(drm_core_get_reg_ofs);
543
544/** 535/**
545 * mmap DMA memory. 536 * mmap DMA memory.
546 * 537 *
@@ -627,7 +618,7 @@ int drm_mmap_locked(struct file *filp, struct vm_area_struct *vma)
627#endif 618#endif
628 case _DRM_FRAME_BUFFER: 619 case _DRM_FRAME_BUFFER:
629 case _DRM_REGISTERS: 620 case _DRM_REGISTERS:
630 offset = dev->driver->get_reg_ofs(dev); 621 offset = drm_core_get_reg_ofs(dev);
631 vma->vm_flags |= VM_IO; /* not in core dump */ 622 vma->vm_flags |= VM_IO; /* not in core dump */
632 vma->vm_page_prot = drm_io_prot(map->type, vma); 623 vma->vm_page_prot = drm_io_prot(map->type, vma);
633#if !defined(__arm__) 624#if !defined(__arm__)
diff --git a/drivers/gpu/drm/i810/i810_dma.c b/drivers/gpu/drm/i810/i810_dma.c
index fb07e73581e8..8f371e8d630f 100644
--- a/drivers/gpu/drm/i810/i810_dma.c
+++ b/drivers/gpu/drm/i810/i810_dma.c
@@ -37,7 +37,6 @@
37#include <linux/interrupt.h> /* For task queue support */ 37#include <linux/interrupt.h> /* For task queue support */
38#include <linux/delay.h> 38#include <linux/delay.h>
39#include <linux/slab.h> 39#include <linux/slab.h>
40#include <linux/smp_lock.h>
41#include <linux/pagemap.h> 40#include <linux/pagemap.h>
42 41
43#define I810_BUF_FREE 2 42#define I810_BUF_FREE 2
@@ -94,7 +93,6 @@ static int i810_mmap_buffers(struct file *filp, struct vm_area_struct *vma)
94 struct drm_buf *buf; 93 struct drm_buf *buf;
95 drm_i810_buf_priv_t *buf_priv; 94 drm_i810_buf_priv_t *buf_priv;
96 95
97 lock_kernel();
98 dev = priv->minor->dev; 96 dev = priv->minor->dev;
99 dev_priv = dev->dev_private; 97 dev_priv = dev->dev_private;
100 buf = dev_priv->mmap_buffer; 98 buf = dev_priv->mmap_buffer;
@@ -104,7 +102,6 @@ static int i810_mmap_buffers(struct file *filp, struct vm_area_struct *vma)
104 vma->vm_file = filp; 102 vma->vm_file = filp;
105 103
106 buf_priv->currently_mapped = I810_BUF_MAPPED; 104 buf_priv->currently_mapped = I810_BUF_MAPPED;
107 unlock_kernel();
108 105
109 if (io_remap_pfn_range(vma, vma->vm_start, 106 if (io_remap_pfn_range(vma, vma->vm_start,
110 vma->vm_pgoff, 107 vma->vm_pgoff,
@@ -116,9 +113,10 @@ static int i810_mmap_buffers(struct file *filp, struct vm_area_struct *vma)
116static const struct file_operations i810_buffer_fops = { 113static const struct file_operations i810_buffer_fops = {
117 .open = drm_open, 114 .open = drm_open,
118 .release = drm_release, 115 .release = drm_release,
119 .unlocked_ioctl = i810_ioctl, 116 .unlocked_ioctl = drm_ioctl,
120 .mmap = i810_mmap_buffers, 117 .mmap = i810_mmap_buffers,
121 .fasync = drm_fasync, 118 .fasync = drm_fasync,
119 .llseek = noop_llseek,
122}; 120};
123 121
124static int i810_map_buffer(struct drm_buf *buf, struct drm_file *file_priv) 122static int i810_map_buffer(struct drm_buf *buf, struct drm_file *file_priv)
@@ -1241,19 +1239,6 @@ int i810_driver_dma_quiescent(struct drm_device *dev)
1241 return 0; 1239 return 0;
1242} 1240}
1243 1241
1244/*
1245 * call the drm_ioctl under the big kernel lock because
1246 * to lock against the i810_mmap_buffers function.
1247 */
1248long i810_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
1249{
1250 int ret;
1251 lock_kernel();
1252 ret = drm_ioctl(file, cmd, arg);
1253 unlock_kernel();
1254 return ret;
1255}
1256
1257struct drm_ioctl_desc i810_ioctls[] = { 1242struct drm_ioctl_desc i810_ioctls[] = {
1258 DRM_IOCTL_DEF_DRV(I810_INIT, i810_dma_init, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY|DRM_UNLOCKED), 1243 DRM_IOCTL_DEF_DRV(I810_INIT, i810_dma_init, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY|DRM_UNLOCKED),
1259 DRM_IOCTL_DEF_DRV(I810_VERTEX, i810_dma_vertex, DRM_AUTH|DRM_UNLOCKED), 1244 DRM_IOCTL_DEF_DRV(I810_VERTEX, i810_dma_vertex, DRM_AUTH|DRM_UNLOCKED),
diff --git a/drivers/gpu/drm/i810/i810_drv.c b/drivers/gpu/drm/i810/i810_drv.c
index b4250b2cac1f..6f98d059f68a 100644
--- a/drivers/gpu/drm/i810/i810_drv.c
+++ b/drivers/gpu/drm/i810/i810_drv.c
@@ -52,22 +52,16 @@ static struct drm_driver driver = {
52 .device_is_agp = i810_driver_device_is_agp, 52 .device_is_agp = i810_driver_device_is_agp,
53 .reclaim_buffers_locked = i810_driver_reclaim_buffers_locked, 53 .reclaim_buffers_locked = i810_driver_reclaim_buffers_locked,
54 .dma_quiescent = i810_driver_dma_quiescent, 54 .dma_quiescent = i810_driver_dma_quiescent,
55 .get_map_ofs = drm_core_get_map_ofs,
56 .get_reg_ofs = drm_core_get_reg_ofs,
57 .ioctls = i810_ioctls, 55 .ioctls = i810_ioctls,
58 .fops = { 56 .fops = {
59 .owner = THIS_MODULE, 57 .owner = THIS_MODULE,
60 .open = drm_open, 58 .open = drm_open,
61 .release = drm_release, 59 .release = drm_release,
62 .unlocked_ioctl = i810_ioctl, 60 .unlocked_ioctl = drm_ioctl,
63 .mmap = drm_mmap, 61 .mmap = drm_mmap,
64 .poll = drm_poll, 62 .poll = drm_poll,
65 .fasync = drm_fasync, 63 .fasync = drm_fasync,
66 }, 64 .llseek = noop_llseek,
67
68 .pci_driver = {
69 .name = DRIVER_NAME,
70 .id_table = pciidlist,
71 }, 65 },
72 66
73 .name = DRIVER_NAME, 67 .name = DRIVER_NAME,
@@ -78,15 +72,24 @@ static struct drm_driver driver = {
78 .patchlevel = DRIVER_PATCHLEVEL, 72 .patchlevel = DRIVER_PATCHLEVEL,
79}; 73};
80 74
75static struct pci_driver i810_pci_driver = {
76 .name = DRIVER_NAME,
77 .id_table = pciidlist,
78};
79
81static int __init i810_init(void) 80static int __init i810_init(void)
82{ 81{
82 if (num_possible_cpus() > 1) {
83 pr_err("drm/i810 does not support SMP\n");
84 return -EINVAL;
85 }
83 driver.num_ioctls = i810_max_ioctl; 86 driver.num_ioctls = i810_max_ioctl;
84 return drm_init(&driver); 87 return drm_pci_init(&driver, &i810_pci_driver);
85} 88}
86 89
87static void __exit i810_exit(void) 90static void __exit i810_exit(void)
88{ 91{
89 drm_exit(&driver); 92 drm_pci_exit(&driver, &i810_pci_driver);
90} 93}
91 94
92module_init(i810_init); 95module_init(i810_init);
diff --git a/drivers/gpu/drm/i830/Makefile b/drivers/gpu/drm/i830/Makefile
deleted file mode 100644
index c642ee0b238c..000000000000
--- a/drivers/gpu/drm/i830/Makefile
+++ /dev/null
@@ -1,8 +0,0 @@
1#
2# Makefile for the drm device driver. This driver provides support for the
3# Direct Rendering Infrastructure (DRI) in XFree86 4.1.0 and higher.
4
5ccflags-y := -Iinclude/drm
6i830-y := i830_drv.o i830_dma.o i830_irq.o
7
8obj-$(CONFIG_DRM_I830) += i830.o
diff --git a/drivers/gpu/drm/i830/i830_dma.c b/drivers/gpu/drm/i830/i830_dma.c
deleted file mode 100644
index cc92c7e6236f..000000000000
--- a/drivers/gpu/drm/i830/i830_dma.c
+++ /dev/null
@@ -1,1559 +0,0 @@
1/* i830_dma.c -- DMA support for the I830 -*- linux-c -*-
2 * Created: Mon Dec 13 01:50:01 1999 by jhartmann@precisioninsight.com
3 *
4 * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
5 * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
6 * All Rights Reserved.
7 *
8 * Permission is hereby granted, free of charge, to any person obtaining a
9 * copy of this software and associated documentation files (the "Software"),
10 * to deal in the Software without restriction, including without limitation
11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 * and/or sell copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following conditions:
14 *
15 * The above copyright notice and this permission notice (including the next
16 * paragraph) shall be included in all copies or substantial portions of the
17 * Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
23 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
24 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
25 * DEALINGS IN THE SOFTWARE.
26 *
27 * Authors: Rickard E. (Rik) Faith <faith@valinux.com>
28 * Jeff Hartmann <jhartmann@valinux.com>
29 * Keith Whitwell <keith@tungstengraphics.com>
30 * Abraham vd Merwe <abraham@2d3d.co.za>
31 *
32 */
33
34#include "drmP.h"
35#include "drm.h"
36#include "i830_drm.h"
37#include "i830_drv.h"
38#include <linux/interrupt.h> /* For task queue support */
39#include <linux/smp_lock.h>
40#include <linux/pagemap.h>
41#include <linux/delay.h>
42#include <linux/slab.h>
43#include <asm/uaccess.h>
44
45#define I830_BUF_FREE 2
46#define I830_BUF_CLIENT 1
47#define I830_BUF_HARDWARE 0
48
49#define I830_BUF_UNMAPPED 0
50#define I830_BUF_MAPPED 1
51
52static struct drm_buf *i830_freelist_get(struct drm_device * dev)
53{
54 struct drm_device_dma *dma = dev->dma;
55 int i;
56 int used;
57
58 /* Linear search might not be the best solution */
59
60 for (i = 0; i < dma->buf_count; i++) {
61 struct drm_buf *buf = dma->buflist[i];
62 drm_i830_buf_priv_t *buf_priv = buf->dev_private;
63 /* In use is already a pointer */
64 used = cmpxchg(buf_priv->in_use, I830_BUF_FREE,
65 I830_BUF_CLIENT);
66 if (used == I830_BUF_FREE)
67 return buf;
68 }
69 return NULL;
70}
71
72/* This should only be called if the buffer is not sent to the hardware
73 * yet, the hardware updates in use for us once its on the ring buffer.
74 */
75
76static int i830_freelist_put(struct drm_device *dev, struct drm_buf *buf)
77{
78 drm_i830_buf_priv_t *buf_priv = buf->dev_private;
79 int used;
80
81 /* In use is already a pointer */
82 used = cmpxchg(buf_priv->in_use, I830_BUF_CLIENT, I830_BUF_FREE);
83 if (used != I830_BUF_CLIENT) {
84 DRM_ERROR("Freeing buffer thats not in use : %d\n", buf->idx);
85 return -EINVAL;
86 }
87
88 return 0;
89}
90
91static int i830_mmap_buffers(struct file *filp, struct vm_area_struct *vma)
92{
93 struct drm_file *priv = filp->private_data;
94 struct drm_device *dev;
95 drm_i830_private_t *dev_priv;
96 struct drm_buf *buf;
97 drm_i830_buf_priv_t *buf_priv;
98
99 lock_kernel();
100 dev = priv->minor->dev;
101 dev_priv = dev->dev_private;
102 buf = dev_priv->mmap_buffer;
103 buf_priv = buf->dev_private;
104
105 vma->vm_flags |= (VM_IO | VM_DONTCOPY);
106 vma->vm_file = filp;
107
108 buf_priv->currently_mapped = I830_BUF_MAPPED;
109 unlock_kernel();
110
111 if (io_remap_pfn_range(vma, vma->vm_start,
112 vma->vm_pgoff,
113 vma->vm_end - vma->vm_start, vma->vm_page_prot))
114 return -EAGAIN;
115 return 0;
116}
117
118static const struct file_operations i830_buffer_fops = {
119 .open = drm_open,
120 .release = drm_release,
121 .unlocked_ioctl = i830_ioctl,
122 .mmap = i830_mmap_buffers,
123 .fasync = drm_fasync,
124};
125
126static int i830_map_buffer(struct drm_buf *buf, struct drm_file *file_priv)
127{
128 struct drm_device *dev = file_priv->minor->dev;
129 drm_i830_buf_priv_t *buf_priv = buf->dev_private;
130 drm_i830_private_t *dev_priv = dev->dev_private;
131 const struct file_operations *old_fops;
132 unsigned long virtual;
133 int retcode = 0;
134
135 if (buf_priv->currently_mapped == I830_BUF_MAPPED)
136 return -EINVAL;
137
138 down_write(&current->mm->mmap_sem);
139 old_fops = file_priv->filp->f_op;
140 file_priv->filp->f_op = &i830_buffer_fops;
141 dev_priv->mmap_buffer = buf;
142 virtual = do_mmap(file_priv->filp, 0, buf->total, PROT_READ | PROT_WRITE,
143 MAP_SHARED, buf->bus_address);
144 dev_priv->mmap_buffer = NULL;
145 file_priv->filp->f_op = old_fops;
146 if (IS_ERR((void *)virtual)) { /* ugh */
147 /* Real error */
148 DRM_ERROR("mmap error\n");
149 retcode = PTR_ERR((void *)virtual);
150 buf_priv->virtual = NULL;
151 } else {
152 buf_priv->virtual = (void __user *)virtual;
153 }
154 up_write(&current->mm->mmap_sem);
155
156 return retcode;
157}
158
159static int i830_unmap_buffer(struct drm_buf *buf)
160{
161 drm_i830_buf_priv_t *buf_priv = buf->dev_private;
162 int retcode = 0;
163
164 if (buf_priv->currently_mapped != I830_BUF_MAPPED)
165 return -EINVAL;
166
167 down_write(&current->mm->mmap_sem);
168 retcode = do_munmap(current->mm,
169 (unsigned long)buf_priv->virtual,
170 (size_t) buf->total);
171 up_write(&current->mm->mmap_sem);
172
173 buf_priv->currently_mapped = I830_BUF_UNMAPPED;
174 buf_priv->virtual = NULL;
175
176 return retcode;
177}
178
179static int i830_dma_get_buffer(struct drm_device *dev, drm_i830_dma_t *d,
180 struct drm_file *file_priv)
181{
182 struct drm_buf *buf;
183 drm_i830_buf_priv_t *buf_priv;
184 int retcode = 0;
185
186 buf = i830_freelist_get(dev);
187 if (!buf) {
188 retcode = -ENOMEM;
189 DRM_DEBUG("retcode=%d\n", retcode);
190 return retcode;
191 }
192
193 retcode = i830_map_buffer(buf, file_priv);
194 if (retcode) {
195 i830_freelist_put(dev, buf);
196 DRM_ERROR("mapbuf failed, retcode %d\n", retcode);
197 return retcode;
198 }
199 buf->file_priv = file_priv;
200 buf_priv = buf->dev_private;
201 d->granted = 1;
202 d->request_idx = buf->idx;
203 d->request_size = buf->total;
204 d->virtual = buf_priv->virtual;
205
206 return retcode;
207}
208
209static int i830_dma_cleanup(struct drm_device *dev)
210{
211 struct drm_device_dma *dma = dev->dma;
212
213 /* Make sure interrupts are disabled here because the uninstall ioctl
214 * may not have been called from userspace and after dev_private
215 * is freed, it's too late.
216 */
217 if (dev->irq_enabled)
218 drm_irq_uninstall(dev);
219
220 if (dev->dev_private) {
221 int i;
222 drm_i830_private_t *dev_priv =
223 (drm_i830_private_t *) dev->dev_private;
224
225 if (dev_priv->ring.virtual_start)
226 drm_core_ioremapfree(&dev_priv->ring.map, dev);
227 if (dev_priv->hw_status_page) {
228 pci_free_consistent(dev->pdev, PAGE_SIZE,
229 dev_priv->hw_status_page,
230 dev_priv->dma_status_page);
231 /* Need to rewrite hardware status page */
232 I830_WRITE(0x02080, 0x1ffff000);
233 }
234
235 kfree(dev->dev_private);
236 dev->dev_private = NULL;
237
238 for (i = 0; i < dma->buf_count; i++) {
239 struct drm_buf *buf = dma->buflist[i];
240 drm_i830_buf_priv_t *buf_priv = buf->dev_private;
241 if (buf_priv->kernel_virtual && buf->total)
242 drm_core_ioremapfree(&buf_priv->map, dev);
243 }
244 }
245 return 0;
246}
247
248int i830_wait_ring(struct drm_device *dev, int n, const char *caller)
249{
250 drm_i830_private_t *dev_priv = dev->dev_private;
251 drm_i830_ring_buffer_t *ring = &(dev_priv->ring);
252 int iters = 0;
253 unsigned long end;
254 unsigned int last_head = I830_READ(LP_RING + RING_HEAD) & HEAD_ADDR;
255
256 end = jiffies + (HZ * 3);
257 while (ring->space < n) {
258 ring->head = I830_READ(LP_RING + RING_HEAD) & HEAD_ADDR;
259 ring->space = ring->head - (ring->tail + 8);
260 if (ring->space < 0)
261 ring->space += ring->Size;
262
263 if (ring->head != last_head) {
264 end = jiffies + (HZ * 3);
265 last_head = ring->head;
266 }
267
268 iters++;
269 if (time_before(end, jiffies)) {
270 DRM_ERROR("space: %d wanted %d\n", ring->space, n);
271 DRM_ERROR("lockup\n");
272 goto out_wait_ring;
273 }
274 udelay(1);
275 dev_priv->sarea_priv->perf_boxes |= I830_BOX_WAIT;
276 }
277
278out_wait_ring:
279 return iters;
280}
281
282static void i830_kernel_lost_context(struct drm_device *dev)
283{
284 drm_i830_private_t *dev_priv = dev->dev_private;
285 drm_i830_ring_buffer_t *ring = &(dev_priv->ring);
286
287 ring->head = I830_READ(LP_RING + RING_HEAD) & HEAD_ADDR;
288 ring->tail = I830_READ(LP_RING + RING_TAIL) & TAIL_ADDR;
289 ring->space = ring->head - (ring->tail + 8);
290 if (ring->space < 0)
291 ring->space += ring->Size;
292
293 if (ring->head == ring->tail)
294 dev_priv->sarea_priv->perf_boxes |= I830_BOX_RING_EMPTY;
295}
296
297static int i830_freelist_init(struct drm_device *dev, drm_i830_private_t *dev_priv)
298{
299 struct drm_device_dma *dma = dev->dma;
300 int my_idx = 36;
301 u32 *hw_status = (u32 *) (dev_priv->hw_status_page + my_idx);
302 int i;
303
304 if (dma->buf_count > 1019) {
305 /* Not enough space in the status page for the freelist */
306 return -EINVAL;
307 }
308
309 for (i = 0; i < dma->buf_count; i++) {
310 struct drm_buf *buf = dma->buflist[i];
311 drm_i830_buf_priv_t *buf_priv = buf->dev_private;
312
313 buf_priv->in_use = hw_status++;
314 buf_priv->my_use_idx = my_idx;
315 my_idx += 4;
316
317 *buf_priv->in_use = I830_BUF_FREE;
318
319 buf_priv->map.offset = buf->bus_address;
320 buf_priv->map.size = buf->total;
321 buf_priv->map.type = _DRM_AGP;
322 buf_priv->map.flags = 0;
323 buf_priv->map.mtrr = 0;
324
325 drm_core_ioremap(&buf_priv->map, dev);
326 buf_priv->kernel_virtual = buf_priv->map.handle;
327 }
328 return 0;
329}
330
331static int i830_dma_initialize(struct drm_device *dev,
332 drm_i830_private_t *dev_priv,
333 drm_i830_init_t *init)
334{
335 struct drm_map_list *r_list;
336
337 memset(dev_priv, 0, sizeof(drm_i830_private_t));
338
339 list_for_each_entry(r_list, &dev->maplist, head) {
340 if (r_list->map &&
341 r_list->map->type == _DRM_SHM &&
342 r_list->map->flags & _DRM_CONTAINS_LOCK) {
343 dev_priv->sarea_map = r_list->map;
344 break;
345 }
346 }
347
348 if (!dev_priv->sarea_map) {
349 dev->dev_private = (void *)dev_priv;
350 i830_dma_cleanup(dev);
351 DRM_ERROR("can not find sarea!\n");
352 return -EINVAL;
353 }
354 dev_priv->mmio_map = drm_core_findmap(dev, init->mmio_offset);
355 if (!dev_priv->mmio_map) {
356 dev->dev_private = (void *)dev_priv;
357 i830_dma_cleanup(dev);
358 DRM_ERROR("can not find mmio map!\n");
359 return -EINVAL;
360 }
361 dev->agp_buffer_token = init->buffers_offset;
362 dev->agp_buffer_map = drm_core_findmap(dev, init->buffers_offset);
363 if (!dev->agp_buffer_map) {
364 dev->dev_private = (void *)dev_priv;
365 i830_dma_cleanup(dev);
366 DRM_ERROR("can not find dma buffer map!\n");
367 return -EINVAL;
368 }
369
370 dev_priv->sarea_priv = (drm_i830_sarea_t *)
371 ((u8 *) dev_priv->sarea_map->handle + init->sarea_priv_offset);
372
373 dev_priv->ring.Start = init->ring_start;
374 dev_priv->ring.End = init->ring_end;
375 dev_priv->ring.Size = init->ring_size;
376
377 dev_priv->ring.map.offset = dev->agp->base + init->ring_start;
378 dev_priv->ring.map.size = init->ring_size;
379 dev_priv->ring.map.type = _DRM_AGP;
380 dev_priv->ring.map.flags = 0;
381 dev_priv->ring.map.mtrr = 0;
382
383 drm_core_ioremap(&dev_priv->ring.map, dev);
384
385 if (dev_priv->ring.map.handle == NULL) {
386 dev->dev_private = (void *)dev_priv;
387 i830_dma_cleanup(dev);
388 DRM_ERROR("can not ioremap virtual address for"
389 " ring buffer\n");
390 return -ENOMEM;
391 }
392
393 dev_priv->ring.virtual_start = dev_priv->ring.map.handle;
394
395 dev_priv->ring.tail_mask = dev_priv->ring.Size - 1;
396
397 dev_priv->w = init->w;
398 dev_priv->h = init->h;
399 dev_priv->pitch = init->pitch;
400 dev_priv->back_offset = init->back_offset;
401 dev_priv->depth_offset = init->depth_offset;
402 dev_priv->front_offset = init->front_offset;
403
404 dev_priv->front_di1 = init->front_offset | init->pitch_bits;
405 dev_priv->back_di1 = init->back_offset | init->pitch_bits;
406 dev_priv->zi1 = init->depth_offset | init->pitch_bits;
407
408 DRM_DEBUG("front_di1 %x\n", dev_priv->front_di1);
409 DRM_DEBUG("back_offset %x\n", dev_priv->back_offset);
410 DRM_DEBUG("back_di1 %x\n", dev_priv->back_di1);
411 DRM_DEBUG("pitch_bits %x\n", init->pitch_bits);
412
413 dev_priv->cpp = init->cpp;
414 /* We are using separate values as placeholders for mechanisms for
415 * private backbuffer/depthbuffer usage.
416 */
417
418 dev_priv->back_pitch = init->back_pitch;
419 dev_priv->depth_pitch = init->depth_pitch;
420 dev_priv->do_boxes = 0;
421 dev_priv->use_mi_batchbuffer_start = 0;
422
423 /* Program Hardware Status Page */
424 dev_priv->hw_status_page =
425 pci_alloc_consistent(dev->pdev, PAGE_SIZE,
426 &dev_priv->dma_status_page);
427 if (!dev_priv->hw_status_page) {
428 dev->dev_private = (void *)dev_priv;
429 i830_dma_cleanup(dev);
430 DRM_ERROR("Can not allocate hardware status page\n");
431 return -ENOMEM;
432 }
433 memset(dev_priv->hw_status_page, 0, PAGE_SIZE);
434 DRM_DEBUG("hw status page @ %p\n", dev_priv->hw_status_page);
435
436 I830_WRITE(0x02080, dev_priv->dma_status_page);
437 DRM_DEBUG("Enabled hardware status page\n");
438
439 /* Now we need to init our freelist */
440 if (i830_freelist_init(dev, dev_priv) != 0) {
441 dev->dev_private = (void *)dev_priv;
442 i830_dma_cleanup(dev);
443 DRM_ERROR("Not enough space in the status page for"
444 " the freelist\n");
445 return -ENOMEM;
446 }
447 dev->dev_private = (void *)dev_priv;
448
449 return 0;
450}
451
452static int i830_dma_init(struct drm_device *dev, void *data,
453 struct drm_file *file_priv)
454{
455 drm_i830_private_t *dev_priv;
456 drm_i830_init_t *init = data;
457 int retcode = 0;
458
459 switch (init->func) {
460 case I830_INIT_DMA:
461 dev_priv = kmalloc(sizeof(drm_i830_private_t), GFP_KERNEL);
462 if (dev_priv == NULL)
463 return -ENOMEM;
464 retcode = i830_dma_initialize(dev, dev_priv, init);
465 break;
466 case I830_CLEANUP_DMA:
467 retcode = i830_dma_cleanup(dev);
468 break;
469 default:
470 retcode = -EINVAL;
471 break;
472 }
473
474 return retcode;
475}
476
477#define GFX_OP_STIPPLE ((0x3<<29)|(0x1d<<24)|(0x83<<16))
478#define ST1_ENABLE (1<<16)
479#define ST1_MASK (0xffff)
480
481/* Most efficient way to verify state for the i830 is as it is
482 * emitted. Non-conformant state is silently dropped.
483 */
484static void i830EmitContextVerified(struct drm_device *dev, unsigned int *code)
485{
486 drm_i830_private_t *dev_priv = dev->dev_private;
487 int i, j = 0;
488 unsigned int tmp;
489 RING_LOCALS;
490
491 BEGIN_LP_RING(I830_CTX_SETUP_SIZE + 4);
492
493 for (i = 0; i < I830_CTXREG_BLENDCOLR0; i++) {
494 tmp = code[i];
495 if ((tmp & (7 << 29)) == CMD_3D &&
496 (tmp & (0x1f << 24)) < (0x1d << 24)) {
497 OUT_RING(tmp);
498 j++;
499 } else {
500 DRM_ERROR("Skipping %d\n", i);
501 }
502 }
503
504 OUT_RING(STATE3D_CONST_BLEND_COLOR_CMD);
505 OUT_RING(code[I830_CTXREG_BLENDCOLR]);
506 j += 2;
507
508 for (i = I830_CTXREG_VF; i < I830_CTXREG_MCSB0; i++) {
509 tmp = code[i];
510 if ((tmp & (7 << 29)) == CMD_3D &&
511 (tmp & (0x1f << 24)) < (0x1d << 24)) {
512 OUT_RING(tmp);
513 j++;
514 } else {
515 DRM_ERROR("Skipping %d\n", i);
516 }
517 }
518
519 OUT_RING(STATE3D_MAP_COORD_SETBIND_CMD);
520 OUT_RING(code[I830_CTXREG_MCSB1]);
521 j += 2;
522
523 if (j & 1)
524 OUT_RING(0);
525
526 ADVANCE_LP_RING();
527}
528
529static void i830EmitTexVerified(struct drm_device *dev, unsigned int *code)
530{
531 drm_i830_private_t *dev_priv = dev->dev_private;
532 int i, j = 0;
533 unsigned int tmp;
534 RING_LOCALS;
535
536 if (code[I830_TEXREG_MI0] == GFX_OP_MAP_INFO ||
537 (code[I830_TEXREG_MI0] & ~(0xf * LOAD_TEXTURE_MAP0)) ==
538 (STATE3D_LOAD_STATE_IMMEDIATE_2 | 4)) {
539
540 BEGIN_LP_RING(I830_TEX_SETUP_SIZE);
541
542 OUT_RING(code[I830_TEXREG_MI0]); /* TM0LI */
543 OUT_RING(code[I830_TEXREG_MI1]); /* TM0S0 */
544 OUT_RING(code[I830_TEXREG_MI2]); /* TM0S1 */
545 OUT_RING(code[I830_TEXREG_MI3]); /* TM0S2 */
546 OUT_RING(code[I830_TEXREG_MI4]); /* TM0S3 */
547 OUT_RING(code[I830_TEXREG_MI5]); /* TM0S4 */
548
549 for (i = 6; i < I830_TEX_SETUP_SIZE; i++) {
550 tmp = code[i];
551 OUT_RING(tmp);
552 j++;
553 }
554
555 if (j & 1)
556 OUT_RING(0);
557
558 ADVANCE_LP_RING();
559 } else
560 printk("rejected packet %x\n", code[0]);
561}
562
563static void i830EmitTexBlendVerified(struct drm_device *dev,
564 unsigned int *code, unsigned int num)
565{
566 drm_i830_private_t *dev_priv = dev->dev_private;
567 int i, j = 0;
568 unsigned int tmp;
569 RING_LOCALS;
570
571 if (!num)
572 return;
573
574 BEGIN_LP_RING(num + 1);
575
576 for (i = 0; i < num; i++) {
577 tmp = code[i];
578 OUT_RING(tmp);
579 j++;
580 }
581
582 if (j & 1)
583 OUT_RING(0);
584
585 ADVANCE_LP_RING();
586}
587
588static void i830EmitTexPalette(struct drm_device *dev,
589 unsigned int *palette, int number, int is_shared)
590{
591 drm_i830_private_t *dev_priv = dev->dev_private;
592 int i;
593 RING_LOCALS;
594
595 return;
596
597 BEGIN_LP_RING(258);
598
599 if (is_shared == 1) {
600 OUT_RING(CMD_OP_MAP_PALETTE_LOAD |
601 MAP_PALETTE_NUM(0) | MAP_PALETTE_BOTH);
602 } else {
603 OUT_RING(CMD_OP_MAP_PALETTE_LOAD | MAP_PALETTE_NUM(number));
604 }
605 for (i = 0; i < 256; i++)
606 OUT_RING(palette[i]);
607 OUT_RING(0);
608 /* KW: WHERE IS THE ADVANCE_LP_RING? This is effectively a noop!
609 */
610}
611
612/* Need to do some additional checking when setting the dest buffer.
613 */
614static void i830EmitDestVerified(struct drm_device *dev, unsigned int *code)
615{
616 drm_i830_private_t *dev_priv = dev->dev_private;
617 unsigned int tmp;
618 RING_LOCALS;
619
620 BEGIN_LP_RING(I830_DEST_SETUP_SIZE + 10);
621
622 tmp = code[I830_DESTREG_CBUFADDR];
623 if (tmp == dev_priv->front_di1 || tmp == dev_priv->back_di1) {
624 if (((int)outring) & 8) {
625 OUT_RING(0);
626 OUT_RING(0);
627 }
628
629 OUT_RING(CMD_OP_DESTBUFFER_INFO);
630 OUT_RING(BUF_3D_ID_COLOR_BACK |
631 BUF_3D_PITCH(dev_priv->back_pitch * dev_priv->cpp) |
632 BUF_3D_USE_FENCE);
633 OUT_RING(tmp);
634 OUT_RING(0);
635
636 OUT_RING(CMD_OP_DESTBUFFER_INFO);
637 OUT_RING(BUF_3D_ID_DEPTH | BUF_3D_USE_FENCE |
638 BUF_3D_PITCH(dev_priv->depth_pitch * dev_priv->cpp));
639 OUT_RING(dev_priv->zi1);
640 OUT_RING(0);
641 } else {
642 DRM_ERROR("bad di1 %x (allow %x or %x)\n",
643 tmp, dev_priv->front_di1, dev_priv->back_di1);
644 }
645
646 /* invarient:
647 */
648
649 OUT_RING(GFX_OP_DESTBUFFER_VARS);
650 OUT_RING(code[I830_DESTREG_DV1]);
651
652 OUT_RING(GFX_OP_DRAWRECT_INFO);
653 OUT_RING(code[I830_DESTREG_DR1]);
654 OUT_RING(code[I830_DESTREG_DR2]);
655 OUT_RING(code[I830_DESTREG_DR3]);
656 OUT_RING(code[I830_DESTREG_DR4]);
657
658 /* Need to verify this */
659 tmp = code[I830_DESTREG_SENABLE];
660 if ((tmp & ~0x3) == GFX_OP_SCISSOR_ENABLE) {
661 OUT_RING(tmp);
662 } else {
663 DRM_ERROR("bad scissor enable\n");
664 OUT_RING(0);
665 }
666
667 OUT_RING(GFX_OP_SCISSOR_RECT);
668 OUT_RING(code[I830_DESTREG_SR1]);
669 OUT_RING(code[I830_DESTREG_SR2]);
670 OUT_RING(0);
671
672 ADVANCE_LP_RING();
673}
674
675static void i830EmitStippleVerified(struct drm_device *dev, unsigned int *code)
676{
677 drm_i830_private_t *dev_priv = dev->dev_private;
678 RING_LOCALS;
679
680 BEGIN_LP_RING(2);
681 OUT_RING(GFX_OP_STIPPLE);
682 OUT_RING(code[1]);
683 ADVANCE_LP_RING();
684}
685
686static void i830EmitState(struct drm_device *dev)
687{
688 drm_i830_private_t *dev_priv = dev->dev_private;
689 drm_i830_sarea_t *sarea_priv = dev_priv->sarea_priv;
690 unsigned int dirty = sarea_priv->dirty;
691
692 DRM_DEBUG("%s %x\n", __func__, dirty);
693
694 if (dirty & I830_UPLOAD_BUFFERS) {
695 i830EmitDestVerified(dev, sarea_priv->BufferState);
696 sarea_priv->dirty &= ~I830_UPLOAD_BUFFERS;
697 }
698
699 if (dirty & I830_UPLOAD_CTX) {
700 i830EmitContextVerified(dev, sarea_priv->ContextState);
701 sarea_priv->dirty &= ~I830_UPLOAD_CTX;
702 }
703
704 if (dirty & I830_UPLOAD_TEX0) {
705 i830EmitTexVerified(dev, sarea_priv->TexState[0]);
706 sarea_priv->dirty &= ~I830_UPLOAD_TEX0;
707 }
708
709 if (dirty & I830_UPLOAD_TEX1) {
710 i830EmitTexVerified(dev, sarea_priv->TexState[1]);
711 sarea_priv->dirty &= ~I830_UPLOAD_TEX1;
712 }
713
714 if (dirty & I830_UPLOAD_TEXBLEND0) {
715 i830EmitTexBlendVerified(dev, sarea_priv->TexBlendState[0],
716 sarea_priv->TexBlendStateWordsUsed[0]);
717 sarea_priv->dirty &= ~I830_UPLOAD_TEXBLEND0;
718 }
719
720 if (dirty & I830_UPLOAD_TEXBLEND1) {
721 i830EmitTexBlendVerified(dev, sarea_priv->TexBlendState[1],
722 sarea_priv->TexBlendStateWordsUsed[1]);
723 sarea_priv->dirty &= ~I830_UPLOAD_TEXBLEND1;
724 }
725
726 if (dirty & I830_UPLOAD_TEX_PALETTE_SHARED) {
727 i830EmitTexPalette(dev, sarea_priv->Palette[0], 0, 1);
728 } else {
729 if (dirty & I830_UPLOAD_TEX_PALETTE_N(0)) {
730 i830EmitTexPalette(dev, sarea_priv->Palette[0], 0, 0);
731 sarea_priv->dirty &= ~I830_UPLOAD_TEX_PALETTE_N(0);
732 }
733 if (dirty & I830_UPLOAD_TEX_PALETTE_N(1)) {
734 i830EmitTexPalette(dev, sarea_priv->Palette[1], 1, 0);
735 sarea_priv->dirty &= ~I830_UPLOAD_TEX_PALETTE_N(1);
736 }
737
738 /* 1.3:
739 */
740#if 0
741 if (dirty & I830_UPLOAD_TEX_PALETTE_N(2)) {
742 i830EmitTexPalette(dev, sarea_priv->Palette2[0], 0, 0);
743 sarea_priv->dirty &= ~I830_UPLOAD_TEX_PALETTE_N(2);
744 }
745 if (dirty & I830_UPLOAD_TEX_PALETTE_N(3)) {
746 i830EmitTexPalette(dev, sarea_priv->Palette2[1], 1, 0);
747 sarea_priv->dirty &= ~I830_UPLOAD_TEX_PALETTE_N(2);
748 }
749#endif
750 }
751
752 /* 1.3:
753 */
754 if (dirty & I830_UPLOAD_STIPPLE) {
755 i830EmitStippleVerified(dev, sarea_priv->StippleState);
756 sarea_priv->dirty &= ~I830_UPLOAD_STIPPLE;
757 }
758
759 if (dirty & I830_UPLOAD_TEX2) {
760 i830EmitTexVerified(dev, sarea_priv->TexState2);
761 sarea_priv->dirty &= ~I830_UPLOAD_TEX2;
762 }
763
764 if (dirty & I830_UPLOAD_TEX3) {
765 i830EmitTexVerified(dev, sarea_priv->TexState3);
766 sarea_priv->dirty &= ~I830_UPLOAD_TEX3;
767 }
768
769 if (dirty & I830_UPLOAD_TEXBLEND2) {
770 i830EmitTexBlendVerified(dev,
771 sarea_priv->TexBlendState2,
772 sarea_priv->TexBlendStateWordsUsed2);
773
774 sarea_priv->dirty &= ~I830_UPLOAD_TEXBLEND2;
775 }
776
777 if (dirty & I830_UPLOAD_TEXBLEND3) {
778 i830EmitTexBlendVerified(dev,
779 sarea_priv->TexBlendState3,
780 sarea_priv->TexBlendStateWordsUsed3);
781 sarea_priv->dirty &= ~I830_UPLOAD_TEXBLEND3;
782 }
783}
784
785/* ================================================================
786 * Performance monitoring functions
787 */
788
789static void i830_fill_box(struct drm_device *dev,
790 int x, int y, int w, int h, int r, int g, int b)
791{
792 drm_i830_private_t *dev_priv = dev->dev_private;
793 u32 color;
794 unsigned int BR13, CMD;
795 RING_LOCALS;
796
797 BR13 = (0xF0 << 16) | (dev_priv->pitch * dev_priv->cpp) | (1 << 24);
798 CMD = XY_COLOR_BLT_CMD;
799 x += dev_priv->sarea_priv->boxes[0].x1;
800 y += dev_priv->sarea_priv->boxes[0].y1;
801
802 if (dev_priv->cpp == 4) {
803 BR13 |= (1 << 25);
804 CMD |= (XY_COLOR_BLT_WRITE_ALPHA | XY_COLOR_BLT_WRITE_RGB);
805 color = (((0xff) << 24) | (r << 16) | (g << 8) | b);
806 } else {
807 color = (((r & 0xf8) << 8) |
808 ((g & 0xfc) << 3) | ((b & 0xf8) >> 3));
809 }
810
811 BEGIN_LP_RING(6);
812 OUT_RING(CMD);
813 OUT_RING(BR13);
814 OUT_RING((y << 16) | x);
815 OUT_RING(((y + h) << 16) | (x + w));
816
817 if (dev_priv->current_page == 1)
818 OUT_RING(dev_priv->front_offset);
819 else
820 OUT_RING(dev_priv->back_offset);
821
822 OUT_RING(color);
823 ADVANCE_LP_RING();
824}
825
826static void i830_cp_performance_boxes(struct drm_device *dev)
827{
828 drm_i830_private_t *dev_priv = dev->dev_private;
829
830 /* Purple box for page flipping
831 */
832 if (dev_priv->sarea_priv->perf_boxes & I830_BOX_FLIP)
833 i830_fill_box(dev, 4, 4, 8, 8, 255, 0, 255);
834
835 /* Red box if we have to wait for idle at any point
836 */
837 if (dev_priv->sarea_priv->perf_boxes & I830_BOX_WAIT)
838 i830_fill_box(dev, 16, 4, 8, 8, 255, 0, 0);
839
840 /* Blue box: lost context?
841 */
842 if (dev_priv->sarea_priv->perf_boxes & I830_BOX_LOST_CONTEXT)
843 i830_fill_box(dev, 28, 4, 8, 8, 0, 0, 255);
844
845 /* Yellow box for texture swaps
846 */
847 if (dev_priv->sarea_priv->perf_boxes & I830_BOX_TEXTURE_LOAD)
848 i830_fill_box(dev, 40, 4, 8, 8, 255, 255, 0);
849
850 /* Green box if hardware never idles (as far as we can tell)
851 */
852 if (!(dev_priv->sarea_priv->perf_boxes & I830_BOX_RING_EMPTY))
853 i830_fill_box(dev, 64, 4, 8, 8, 0, 255, 0);
854
855 /* Draw bars indicating number of buffers allocated
856 * (not a great measure, easily confused)
857 */
858 if (dev_priv->dma_used) {
859 int bar = dev_priv->dma_used / 10240;
860 if (bar > 100)
861 bar = 100;
862 if (bar < 1)
863 bar = 1;
864 i830_fill_box(dev, 4, 16, bar, 4, 196, 128, 128);
865 dev_priv->dma_used = 0;
866 }
867
868 dev_priv->sarea_priv->perf_boxes = 0;
869}
870
871static void i830_dma_dispatch_clear(struct drm_device *dev, int flags,
872 unsigned int clear_color,
873 unsigned int clear_zval,
874 unsigned int clear_depthmask)
875{
876 drm_i830_private_t *dev_priv = dev->dev_private;
877 drm_i830_sarea_t *sarea_priv = dev_priv->sarea_priv;
878 int nbox = sarea_priv->nbox;
879 struct drm_clip_rect *pbox = sarea_priv->boxes;
880 int pitch = dev_priv->pitch;
881 int cpp = dev_priv->cpp;
882 int i;
883 unsigned int BR13, CMD, D_CMD;
884 RING_LOCALS;
885
886 if (dev_priv->current_page == 1) {
887 unsigned int tmp = flags;
888
889 flags &= ~(I830_FRONT | I830_BACK);
890 if (tmp & I830_FRONT)
891 flags |= I830_BACK;
892 if (tmp & I830_BACK)
893 flags |= I830_FRONT;
894 }
895
896 i830_kernel_lost_context(dev);
897
898 switch (cpp) {
899 case 2:
900 BR13 = (0xF0 << 16) | (pitch * cpp) | (1 << 24);
901 D_CMD = CMD = XY_COLOR_BLT_CMD;
902 break;
903 case 4:
904 BR13 = (0xF0 << 16) | (pitch * cpp) | (1 << 24) | (1 << 25);
905 CMD = (XY_COLOR_BLT_CMD | XY_COLOR_BLT_WRITE_ALPHA |
906 XY_COLOR_BLT_WRITE_RGB);
907 D_CMD = XY_COLOR_BLT_CMD;
908 if (clear_depthmask & 0x00ffffff)
909 D_CMD |= XY_COLOR_BLT_WRITE_RGB;
910 if (clear_depthmask & 0xff000000)
911 D_CMD |= XY_COLOR_BLT_WRITE_ALPHA;
912 break;
913 default:
914 BR13 = (0xF0 << 16) | (pitch * cpp) | (1 << 24);
915 D_CMD = CMD = XY_COLOR_BLT_CMD;
916 break;
917 }
918
919 if (nbox > I830_NR_SAREA_CLIPRECTS)
920 nbox = I830_NR_SAREA_CLIPRECTS;
921
922 for (i = 0; i < nbox; i++, pbox++) {
923 if (pbox->x1 > pbox->x2 ||
924 pbox->y1 > pbox->y2 ||
925 pbox->x2 > dev_priv->w || pbox->y2 > dev_priv->h)
926 continue;
927
928 if (flags & I830_FRONT) {
929 DRM_DEBUG("clear front\n");
930 BEGIN_LP_RING(6);
931 OUT_RING(CMD);
932 OUT_RING(BR13);
933 OUT_RING((pbox->y1 << 16) | pbox->x1);
934 OUT_RING((pbox->y2 << 16) | pbox->x2);
935 OUT_RING(dev_priv->front_offset);
936 OUT_RING(clear_color);
937 ADVANCE_LP_RING();
938 }
939
940 if (flags & I830_BACK) {
941 DRM_DEBUG("clear back\n");
942 BEGIN_LP_RING(6);
943 OUT_RING(CMD);
944 OUT_RING(BR13);
945 OUT_RING((pbox->y1 << 16) | pbox->x1);
946 OUT_RING((pbox->y2 << 16) | pbox->x2);
947 OUT_RING(dev_priv->back_offset);
948 OUT_RING(clear_color);
949 ADVANCE_LP_RING();
950 }
951
952 if (flags & I830_DEPTH) {
953 DRM_DEBUG("clear depth\n");
954 BEGIN_LP_RING(6);
955 OUT_RING(D_CMD);
956 OUT_RING(BR13);
957 OUT_RING((pbox->y1 << 16) | pbox->x1);
958 OUT_RING((pbox->y2 << 16) | pbox->x2);
959 OUT_RING(dev_priv->depth_offset);
960 OUT_RING(clear_zval);
961 ADVANCE_LP_RING();
962 }
963 }
964}
965
966static void i830_dma_dispatch_swap(struct drm_device *dev)
967{
968 drm_i830_private_t *dev_priv = dev->dev_private;
969 drm_i830_sarea_t *sarea_priv = dev_priv->sarea_priv;
970 int nbox = sarea_priv->nbox;
971 struct drm_clip_rect *pbox = sarea_priv->boxes;
972 int pitch = dev_priv->pitch;
973 int cpp = dev_priv->cpp;
974 int i;
975 unsigned int CMD, BR13;
976 RING_LOCALS;
977
978 DRM_DEBUG("swapbuffers\n");
979
980 i830_kernel_lost_context(dev);
981
982 if (dev_priv->do_boxes)
983 i830_cp_performance_boxes(dev);
984
985 switch (cpp) {
986 case 2:
987 BR13 = (pitch * cpp) | (0xCC << 16) | (1 << 24);
988 CMD = XY_SRC_COPY_BLT_CMD;
989 break;
990 case 4:
991 BR13 = (pitch * cpp) | (0xCC << 16) | (1 << 24) | (1 << 25);
992 CMD = (XY_SRC_COPY_BLT_CMD | XY_SRC_COPY_BLT_WRITE_ALPHA |
993 XY_SRC_COPY_BLT_WRITE_RGB);
994 break;
995 default:
996 BR13 = (pitch * cpp) | (0xCC << 16) | (1 << 24);
997 CMD = XY_SRC_COPY_BLT_CMD;
998 break;
999 }
1000
1001 if (nbox > I830_NR_SAREA_CLIPRECTS)
1002 nbox = I830_NR_SAREA_CLIPRECTS;
1003
1004 for (i = 0; i < nbox; i++, pbox++) {
1005 if (pbox->x1 > pbox->x2 ||
1006 pbox->y1 > pbox->y2 ||
1007 pbox->x2 > dev_priv->w || pbox->y2 > dev_priv->h)
1008 continue;
1009
1010 DRM_DEBUG("dispatch swap %d,%d-%d,%d!\n",
1011 pbox->x1, pbox->y1, pbox->x2, pbox->y2);
1012
1013 BEGIN_LP_RING(8);
1014 OUT_RING(CMD);
1015 OUT_RING(BR13);
1016 OUT_RING((pbox->y1 << 16) | pbox->x1);
1017 OUT_RING((pbox->y2 << 16) | pbox->x2);
1018
1019 if (dev_priv->current_page == 0)
1020 OUT_RING(dev_priv->front_offset);
1021 else
1022 OUT_RING(dev_priv->back_offset);
1023
1024 OUT_RING((pbox->y1 << 16) | pbox->x1);
1025 OUT_RING(BR13 & 0xffff);
1026
1027 if (dev_priv->current_page == 0)
1028 OUT_RING(dev_priv->back_offset);
1029 else
1030 OUT_RING(dev_priv->front_offset);
1031
1032 ADVANCE_LP_RING();
1033 }
1034}
1035
1036static void i830_dma_dispatch_flip(struct drm_device *dev)
1037{
1038 drm_i830_private_t *dev_priv = dev->dev_private;
1039 RING_LOCALS;
1040
1041 DRM_DEBUG("%s: page=%d pfCurrentPage=%d\n",
1042 __func__,
1043 dev_priv->current_page,
1044 dev_priv->sarea_priv->pf_current_page);
1045
1046 i830_kernel_lost_context(dev);
1047
1048 if (dev_priv->do_boxes) {
1049 dev_priv->sarea_priv->perf_boxes |= I830_BOX_FLIP;
1050 i830_cp_performance_boxes(dev);
1051 }
1052
1053 BEGIN_LP_RING(2);
1054 OUT_RING(INST_PARSER_CLIENT | INST_OP_FLUSH | INST_FLUSH_MAP_CACHE);
1055 OUT_RING(0);
1056 ADVANCE_LP_RING();
1057
1058 BEGIN_LP_RING(6);
1059 OUT_RING(CMD_OP_DISPLAYBUFFER_INFO | ASYNC_FLIP);
1060 OUT_RING(0);
1061 if (dev_priv->current_page == 0) {
1062 OUT_RING(dev_priv->back_offset);
1063 dev_priv->current_page = 1;
1064 } else {
1065 OUT_RING(dev_priv->front_offset);
1066 dev_priv->current_page = 0;
1067 }
1068 OUT_RING(0);
1069 ADVANCE_LP_RING();
1070
1071 BEGIN_LP_RING(2);
1072 OUT_RING(MI_WAIT_FOR_EVENT | MI_WAIT_FOR_PLANE_A_FLIP);
1073 OUT_RING(0);
1074 ADVANCE_LP_RING();
1075
1076 dev_priv->sarea_priv->pf_current_page = dev_priv->current_page;
1077}
1078
1079static void i830_dma_dispatch_vertex(struct drm_device *dev,
1080 struct drm_buf *buf, int discard, int used)
1081{
1082 drm_i830_private_t *dev_priv = dev->dev_private;
1083 drm_i830_buf_priv_t *buf_priv = buf->dev_private;
1084 drm_i830_sarea_t *sarea_priv = dev_priv->sarea_priv;
1085 struct drm_clip_rect *box = sarea_priv->boxes;
1086 int nbox = sarea_priv->nbox;
1087 unsigned long address = (unsigned long)buf->bus_address;
1088 unsigned long start = address - dev->agp->base;
1089 int i = 0, u;
1090 RING_LOCALS;
1091
1092 i830_kernel_lost_context(dev);
1093
1094 if (nbox > I830_NR_SAREA_CLIPRECTS)
1095 nbox = I830_NR_SAREA_CLIPRECTS;
1096
1097 if (discard) {
1098 u = cmpxchg(buf_priv->in_use, I830_BUF_CLIENT,
1099 I830_BUF_HARDWARE);
1100 if (u != I830_BUF_CLIENT)
1101 DRM_DEBUG("xxxx 2\n");
1102 }
1103
1104 if (used > 4 * 1023)
1105 used = 0;
1106
1107 if (sarea_priv->dirty)
1108 i830EmitState(dev);
1109
1110 DRM_DEBUG("dispatch vertex addr 0x%lx, used 0x%x nbox %d\n",
1111 address, used, nbox);
1112
1113 dev_priv->counter++;
1114 DRM_DEBUG("dispatch counter : %ld\n", dev_priv->counter);
1115 DRM_DEBUG("i830_dma_dispatch\n");
1116 DRM_DEBUG("start : %lx\n", start);
1117 DRM_DEBUG("used : %d\n", used);
1118 DRM_DEBUG("start + used - 4 : %ld\n", start + used - 4);
1119
1120 if (buf_priv->currently_mapped == I830_BUF_MAPPED) {
1121 u32 *vp = buf_priv->kernel_virtual;
1122
1123 vp[0] = (GFX_OP_PRIMITIVE |
1124 sarea_priv->vertex_prim | ((used / 4) - 2));
1125
1126 if (dev_priv->use_mi_batchbuffer_start) {
1127 vp[used / 4] = MI_BATCH_BUFFER_END;
1128 used += 4;
1129 }
1130
1131 if (used & 4) {
1132 vp[used / 4] = 0;
1133 used += 4;
1134 }
1135
1136 i830_unmap_buffer(buf);
1137 }
1138
1139 if (used) {
1140 do {
1141 if (i < nbox) {
1142 BEGIN_LP_RING(6);
1143 OUT_RING(GFX_OP_DRAWRECT_INFO);
1144 OUT_RING(sarea_priv->
1145 BufferState[I830_DESTREG_DR1]);
1146 OUT_RING(box[i].x1 | (box[i].y1 << 16));
1147 OUT_RING(box[i].x2 | (box[i].y2 << 16));
1148 OUT_RING(sarea_priv->
1149 BufferState[I830_DESTREG_DR4]);
1150 OUT_RING(0);
1151 ADVANCE_LP_RING();
1152 }
1153
1154 if (dev_priv->use_mi_batchbuffer_start) {
1155 BEGIN_LP_RING(2);
1156 OUT_RING(MI_BATCH_BUFFER_START | (2 << 6));
1157 OUT_RING(start | MI_BATCH_NON_SECURE);
1158 ADVANCE_LP_RING();
1159 } else {
1160 BEGIN_LP_RING(4);
1161 OUT_RING(MI_BATCH_BUFFER);
1162 OUT_RING(start | MI_BATCH_NON_SECURE);
1163 OUT_RING(start + used - 4);
1164 OUT_RING(0);
1165 ADVANCE_LP_RING();
1166 }
1167
1168 } while (++i < nbox);
1169 }
1170
1171 if (discard) {
1172 dev_priv->counter++;
1173
1174 (void)cmpxchg(buf_priv->in_use, I830_BUF_CLIENT,
1175 I830_BUF_HARDWARE);
1176
1177 BEGIN_LP_RING(8);
1178 OUT_RING(CMD_STORE_DWORD_IDX);
1179 OUT_RING(20);
1180 OUT_RING(dev_priv->counter);
1181 OUT_RING(CMD_STORE_DWORD_IDX);
1182 OUT_RING(buf_priv->my_use_idx);
1183 OUT_RING(I830_BUF_FREE);
1184 OUT_RING(CMD_REPORT_HEAD);
1185 OUT_RING(0);
1186 ADVANCE_LP_RING();
1187 }
1188}
1189
1190static void i830_dma_quiescent(struct drm_device *dev)
1191{
1192 drm_i830_private_t *dev_priv = dev->dev_private;
1193 RING_LOCALS;
1194
1195 i830_kernel_lost_context(dev);
1196
1197 BEGIN_LP_RING(4);
1198 OUT_RING(INST_PARSER_CLIENT | INST_OP_FLUSH | INST_FLUSH_MAP_CACHE);
1199 OUT_RING(CMD_REPORT_HEAD);
1200 OUT_RING(0);
1201 OUT_RING(0);
1202 ADVANCE_LP_RING();
1203
1204 i830_wait_ring(dev, dev_priv->ring.Size - 8, __func__);
1205}
1206
1207static int i830_flush_queue(struct drm_device *dev)
1208{
1209 drm_i830_private_t *dev_priv = dev->dev_private;
1210 struct drm_device_dma *dma = dev->dma;
1211 int i, ret = 0;
1212 RING_LOCALS;
1213
1214 i830_kernel_lost_context(dev);
1215
1216 BEGIN_LP_RING(2);
1217 OUT_RING(CMD_REPORT_HEAD);
1218 OUT_RING(0);
1219 ADVANCE_LP_RING();
1220
1221 i830_wait_ring(dev, dev_priv->ring.Size - 8, __func__);
1222
1223 for (i = 0; i < dma->buf_count; i++) {
1224 struct drm_buf *buf = dma->buflist[i];
1225 drm_i830_buf_priv_t *buf_priv = buf->dev_private;
1226
1227 int used = cmpxchg(buf_priv->in_use, I830_BUF_HARDWARE,
1228 I830_BUF_FREE);
1229
1230 if (used == I830_BUF_HARDWARE)
1231 DRM_DEBUG("reclaimed from HARDWARE\n");
1232 if (used == I830_BUF_CLIENT)
1233 DRM_DEBUG("still on client\n");
1234 }
1235
1236 return ret;
1237}
1238
1239/* Must be called with the lock held */
1240static void i830_reclaim_buffers(struct drm_device *dev, struct drm_file *file_priv)
1241{
1242 struct drm_device_dma *dma = dev->dma;
1243 int i;
1244
1245 if (!dma)
1246 return;
1247 if (!dev->dev_private)
1248 return;
1249 if (!dma->buflist)
1250 return;
1251
1252 i830_flush_queue(dev);
1253
1254 for (i = 0; i < dma->buf_count; i++) {
1255 struct drm_buf *buf = dma->buflist[i];
1256 drm_i830_buf_priv_t *buf_priv = buf->dev_private;
1257
1258 if (buf->file_priv == file_priv && buf_priv) {
1259 int used = cmpxchg(buf_priv->in_use, I830_BUF_CLIENT,
1260 I830_BUF_FREE);
1261
1262 if (used == I830_BUF_CLIENT)
1263 DRM_DEBUG("reclaimed from client\n");
1264 if (buf_priv->currently_mapped == I830_BUF_MAPPED)
1265 buf_priv->currently_mapped = I830_BUF_UNMAPPED;
1266 }
1267 }
1268}
1269
1270static int i830_flush_ioctl(struct drm_device *dev, void *data,
1271 struct drm_file *file_priv)
1272{
1273 LOCK_TEST_WITH_RETURN(dev, file_priv);
1274
1275 i830_flush_queue(dev);
1276 return 0;
1277}
1278
1279static int i830_dma_vertex(struct drm_device *dev, void *data,
1280 struct drm_file *file_priv)
1281{
1282 struct drm_device_dma *dma = dev->dma;
1283 drm_i830_private_t *dev_priv = (drm_i830_private_t *) dev->dev_private;
1284 u32 *hw_status = dev_priv->hw_status_page;
1285 drm_i830_sarea_t *sarea_priv = (drm_i830_sarea_t *)
1286 dev_priv->sarea_priv;
1287 drm_i830_vertex_t *vertex = data;
1288
1289 LOCK_TEST_WITH_RETURN(dev, file_priv);
1290
1291 DRM_DEBUG("i830 dma vertex, idx %d used %d discard %d\n",
1292 vertex->idx, vertex->used, vertex->discard);
1293
1294 if (vertex->idx < 0 || vertex->idx > dma->buf_count)
1295 return -EINVAL;
1296
1297 i830_dma_dispatch_vertex(dev,
1298 dma->buflist[vertex->idx],
1299 vertex->discard, vertex->used);
1300
1301 sarea_priv->last_enqueue = dev_priv->counter - 1;
1302 sarea_priv->last_dispatch = (int)hw_status[5];
1303
1304 return 0;
1305}
1306
1307static int i830_clear_bufs(struct drm_device *dev, void *data,
1308 struct drm_file *file_priv)
1309{
1310 drm_i830_clear_t *clear = data;
1311
1312 LOCK_TEST_WITH_RETURN(dev, file_priv);
1313
1314 /* GH: Someone's doing nasty things... */
1315 if (!dev->dev_private)
1316 return -EINVAL;
1317
1318 i830_dma_dispatch_clear(dev, clear->flags,
1319 clear->clear_color,
1320 clear->clear_depth, clear->clear_depthmask);
1321 return 0;
1322}
1323
1324static int i830_swap_bufs(struct drm_device *dev, void *data,
1325 struct drm_file *file_priv)
1326{
1327 DRM_DEBUG("i830_swap_bufs\n");
1328
1329 LOCK_TEST_WITH_RETURN(dev, file_priv);
1330
1331 i830_dma_dispatch_swap(dev);
1332 return 0;
1333}
1334
1335/* Not sure why this isn't set all the time:
1336 */
1337static void i830_do_init_pageflip(struct drm_device *dev)
1338{
1339 drm_i830_private_t *dev_priv = dev->dev_private;
1340
1341 DRM_DEBUG("%s\n", __func__);
1342 dev_priv->page_flipping = 1;
1343 dev_priv->current_page = 0;
1344 dev_priv->sarea_priv->pf_current_page = dev_priv->current_page;
1345}
1346
1347static int i830_do_cleanup_pageflip(struct drm_device *dev)
1348{
1349 drm_i830_private_t *dev_priv = dev->dev_private;
1350
1351 DRM_DEBUG("%s\n", __func__);
1352 if (dev_priv->current_page != 0)
1353 i830_dma_dispatch_flip(dev);
1354
1355 dev_priv->page_flipping = 0;
1356 return 0;
1357}
1358
1359static int i830_flip_bufs(struct drm_device *dev, void *data,
1360 struct drm_file *file_priv)
1361{
1362 drm_i830_private_t *dev_priv = dev->dev_private;
1363
1364 DRM_DEBUG("%s\n", __func__);
1365
1366 LOCK_TEST_WITH_RETURN(dev, file_priv);
1367
1368 if (!dev_priv->page_flipping)
1369 i830_do_init_pageflip(dev);
1370
1371 i830_dma_dispatch_flip(dev);
1372 return 0;
1373}
1374
1375static int i830_getage(struct drm_device *dev, void *data,
1376 struct drm_file *file_priv)
1377{
1378 drm_i830_private_t *dev_priv = (drm_i830_private_t *) dev->dev_private;
1379 u32 *hw_status = dev_priv->hw_status_page;
1380 drm_i830_sarea_t *sarea_priv = (drm_i830_sarea_t *)
1381 dev_priv->sarea_priv;
1382
1383 sarea_priv->last_dispatch = (int)hw_status[5];
1384 return 0;
1385}
1386
1387static int i830_getbuf(struct drm_device *dev, void *data,
1388 struct drm_file *file_priv)
1389{
1390 int retcode = 0;
1391 drm_i830_dma_t *d = data;
1392 drm_i830_private_t *dev_priv = (drm_i830_private_t *) dev->dev_private;
1393 u32 *hw_status = dev_priv->hw_status_page;
1394 drm_i830_sarea_t *sarea_priv = (drm_i830_sarea_t *)
1395 dev_priv->sarea_priv;
1396
1397 DRM_DEBUG("getbuf\n");
1398
1399 LOCK_TEST_WITH_RETURN(dev, file_priv);
1400
1401 d->granted = 0;
1402
1403 retcode = i830_dma_get_buffer(dev, d, file_priv);
1404
1405 DRM_DEBUG("i830_dma: %d returning %d, granted = %d\n",
1406 task_pid_nr(current), retcode, d->granted);
1407
1408 sarea_priv->last_dispatch = (int)hw_status[5];
1409
1410 return retcode;
1411}
1412
1413static int i830_copybuf(struct drm_device *dev, void *data,
1414 struct drm_file *file_priv)
1415{
1416 /* Never copy - 2.4.x doesn't need it */
1417 return 0;
1418}
1419
1420static int i830_docopy(struct drm_device *dev, void *data,
1421 struct drm_file *file_priv)
1422{
1423 return 0;
1424}
1425
1426static int i830_getparam(struct drm_device *dev, void *data,
1427 struct drm_file *file_priv)
1428{
1429 drm_i830_private_t *dev_priv = dev->dev_private;
1430 drm_i830_getparam_t *param = data;
1431 int value;
1432
1433 if (!dev_priv) {
1434 DRM_ERROR("%s called with no initialization\n", __func__);
1435 return -EINVAL;
1436 }
1437
1438 switch (param->param) {
1439 case I830_PARAM_IRQ_ACTIVE:
1440 value = dev->irq_enabled;
1441 break;
1442 default:
1443 return -EINVAL;
1444 }
1445
1446 if (copy_to_user(param->value, &value, sizeof(int))) {
1447 DRM_ERROR("copy_to_user\n");
1448 return -EFAULT;
1449 }
1450
1451 return 0;
1452}
1453
1454static int i830_setparam(struct drm_device *dev, void *data,
1455 struct drm_file *file_priv)
1456{
1457 drm_i830_private_t *dev_priv = dev->dev_private;
1458 drm_i830_setparam_t *param = data;
1459
1460 if (!dev_priv) {
1461 DRM_ERROR("%s called with no initialization\n", __func__);
1462 return -EINVAL;
1463 }
1464
1465 switch (param->param) {
1466 case I830_SETPARAM_USE_MI_BATCHBUFFER_START:
1467 dev_priv->use_mi_batchbuffer_start = param->value;
1468 break;
1469 default:
1470 return -EINVAL;
1471 }
1472
1473 return 0;
1474}
1475
1476int i830_driver_load(struct drm_device *dev, unsigned long flags)
1477{
1478 /* i830 has 4 more counters */
1479 dev->counters += 4;
1480 dev->types[6] = _DRM_STAT_IRQ;
1481 dev->types[7] = _DRM_STAT_PRIMARY;
1482 dev->types[8] = _DRM_STAT_SECONDARY;
1483 dev->types[9] = _DRM_STAT_DMA;
1484
1485 return 0;
1486}
1487
1488void i830_driver_lastclose(struct drm_device *dev)
1489{
1490 i830_dma_cleanup(dev);
1491}
1492
1493void i830_driver_preclose(struct drm_device *dev, struct drm_file *file_priv)
1494{
1495 if (dev->dev_private) {
1496 drm_i830_private_t *dev_priv = dev->dev_private;
1497 if (dev_priv->page_flipping)
1498 i830_do_cleanup_pageflip(dev);
1499 }
1500}
1501
1502void i830_driver_reclaim_buffers_locked(struct drm_device *dev, struct drm_file *file_priv)
1503{
1504 i830_reclaim_buffers(dev, file_priv);
1505}
1506
1507int i830_driver_dma_quiescent(struct drm_device *dev)
1508{
1509 i830_dma_quiescent(dev);
1510 return 0;
1511}
1512
1513/*
1514 * call the drm_ioctl under the big kernel lock because
1515 * to lock against the i830_mmap_buffers function.
1516 */
1517long i830_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
1518{
1519 int ret;
1520 lock_kernel();
1521 ret = drm_ioctl(file, cmd, arg);
1522 unlock_kernel();
1523 return ret;
1524}
1525
1526struct drm_ioctl_desc i830_ioctls[] = {
1527 DRM_IOCTL_DEF_DRV(I830_INIT, i830_dma_init, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY|DRM_UNLOCKED),
1528 DRM_IOCTL_DEF_DRV(I830_VERTEX, i830_dma_vertex, DRM_AUTH|DRM_UNLOCKED),
1529 DRM_IOCTL_DEF_DRV(I830_CLEAR, i830_clear_bufs, DRM_AUTH|DRM_UNLOCKED),
1530 DRM_IOCTL_DEF_DRV(I830_FLUSH, i830_flush_ioctl, DRM_AUTH|DRM_UNLOCKED),
1531 DRM_IOCTL_DEF_DRV(I830_GETAGE, i830_getage, DRM_AUTH|DRM_UNLOCKED),
1532 DRM_IOCTL_DEF_DRV(I830_GETBUF, i830_getbuf, DRM_AUTH|DRM_UNLOCKED),
1533 DRM_IOCTL_DEF_DRV(I830_SWAP, i830_swap_bufs, DRM_AUTH|DRM_UNLOCKED),
1534 DRM_IOCTL_DEF_DRV(I830_COPY, i830_copybuf, DRM_AUTH|DRM_UNLOCKED),
1535 DRM_IOCTL_DEF_DRV(I830_DOCOPY, i830_docopy, DRM_AUTH|DRM_UNLOCKED),
1536 DRM_IOCTL_DEF_DRV(I830_FLIP, i830_flip_bufs, DRM_AUTH|DRM_UNLOCKED),
1537 DRM_IOCTL_DEF_DRV(I830_IRQ_EMIT, i830_irq_emit, DRM_AUTH|DRM_UNLOCKED),
1538 DRM_IOCTL_DEF_DRV(I830_IRQ_WAIT, i830_irq_wait, DRM_AUTH|DRM_UNLOCKED),
1539 DRM_IOCTL_DEF_DRV(I830_GETPARAM, i830_getparam, DRM_AUTH|DRM_UNLOCKED),
1540 DRM_IOCTL_DEF_DRV(I830_SETPARAM, i830_setparam, DRM_AUTH|DRM_UNLOCKED),
1541};
1542
1543int i830_max_ioctl = DRM_ARRAY_SIZE(i830_ioctls);
1544
1545/**
1546 * Determine if the device really is AGP or not.
1547 *
1548 * All Intel graphics chipsets are treated as AGP, even if they are really
1549 * PCI-e.
1550 *
1551 * \param dev The device to be tested.
1552 *
1553 * \returns
1554 * A value of 1 is always retured to indictate every i8xx is AGP.
1555 */
1556int i830_driver_device_is_agp(struct drm_device *dev)
1557{
1558 return 1;
1559}
diff --git a/drivers/gpu/drm/i830/i830_drv.c b/drivers/gpu/drm/i830/i830_drv.c
deleted file mode 100644
index a5c66aa82f0c..000000000000
--- a/drivers/gpu/drm/i830/i830_drv.c
+++ /dev/null
@@ -1,108 +0,0 @@
1/* i830_drv.c -- I810 driver -*- linux-c -*-
2 * Created: Mon Dec 13 01:56:22 1999 by jhartmann@precisioninsight.com
3 *
4 * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
5 * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
6 * All Rights Reserved.
7 *
8 * Permission is hereby granted, free of charge, to any person obtaining a
9 * copy of this software and associated documentation files (the "Software"),
10 * to deal in the Software without restriction, including without limitation
11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 * and/or sell copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following conditions:
14 *
15 * The above copyright notice and this permission notice (including the next
16 * paragraph) shall be included in all copies or substantial portions of the
17 * Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
23 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
24 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
25 * OTHER DEALINGS IN THE SOFTWARE.
26 *
27 * Authors:
28 * Rickard E. (Rik) Faith <faith@valinux.com>
29 * Jeff Hartmann <jhartmann@valinux.com>
30 * Gareth Hughes <gareth@valinux.com>
31 * Abraham vd Merwe <abraham@2d3d.co.za>
32 * Keith Whitwell <keith@tungstengraphics.com>
33 */
34
35#include "drmP.h"
36#include "drm.h"
37#include "i830_drm.h"
38#include "i830_drv.h"
39
40#include "drm_pciids.h"
41
42static struct pci_device_id pciidlist[] = {
43 i830_PCI_IDS
44};
45
46static struct drm_driver driver = {
47 .driver_features =
48 DRIVER_USE_AGP | DRIVER_REQUIRE_AGP | DRIVER_USE_MTRR |
49 DRIVER_HAVE_DMA | DRIVER_DMA_QUEUE,
50#if USE_IRQS
51 .driver_features |= DRIVER_HAVE_IRQ | DRIVER_SHARED_IRQ,
52#endif
53 .dev_priv_size = sizeof(drm_i830_buf_priv_t),
54 .load = i830_driver_load,
55 .lastclose = i830_driver_lastclose,
56 .preclose = i830_driver_preclose,
57 .device_is_agp = i830_driver_device_is_agp,
58 .reclaim_buffers_locked = i830_driver_reclaim_buffers_locked,
59 .dma_quiescent = i830_driver_dma_quiescent,
60 .get_map_ofs = drm_core_get_map_ofs,
61 .get_reg_ofs = drm_core_get_reg_ofs,
62#if USE_IRQS
63 .irq_preinstall = i830_driver_irq_preinstall,
64 .irq_postinstall = i830_driver_irq_postinstall,
65 .irq_uninstall = i830_driver_irq_uninstall,
66 .irq_handler = i830_driver_irq_handler,
67#endif
68 .ioctls = i830_ioctls,
69 .fops = {
70 .owner = THIS_MODULE,
71 .open = drm_open,
72 .release = drm_release,
73 .unlocked_ioctl = i830_ioctl,
74 .mmap = drm_mmap,
75 .poll = drm_poll,
76 .fasync = drm_fasync,
77 },
78
79 .pci_driver = {
80 .name = DRIVER_NAME,
81 .id_table = pciidlist,
82 },
83
84 .name = DRIVER_NAME,
85 .desc = DRIVER_DESC,
86 .date = DRIVER_DATE,
87 .major = DRIVER_MAJOR,
88 .minor = DRIVER_MINOR,
89 .patchlevel = DRIVER_PATCHLEVEL,
90};
91
92static int __init i830_init(void)
93{
94 driver.num_ioctls = i830_max_ioctl;
95 return drm_init(&driver);
96}
97
98static void __exit i830_exit(void)
99{
100 drm_exit(&driver);
101}
102
103module_init(i830_init);
104module_exit(i830_exit);
105
106MODULE_AUTHOR(DRIVER_AUTHOR);
107MODULE_DESCRIPTION(DRIVER_DESC);
108MODULE_LICENSE("GPL and additional rights");
diff --git a/drivers/gpu/drm/i830/i830_drv.h b/drivers/gpu/drm/i830/i830_drv.h
deleted file mode 100644
index 0df1c720560b..000000000000
--- a/drivers/gpu/drm/i830/i830_drv.h
+++ /dev/null
@@ -1,295 +0,0 @@
1/* i830_drv.h -- Private header for the I830 driver -*- linux-c -*-
2 * Created: Mon Dec 13 01:50:01 1999 by jhartmann@precisioninsight.com
3 *
4 * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
5 * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
6 * All rights reserved.
7 *
8 * Permission is hereby granted, free of charge, to any person obtaining a
9 * copy of this software and associated documentation files (the "Software"),
10 * to deal in the Software without restriction, including without limitation
11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 * and/or sell copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following conditions:
14 *
15 * The above copyright notice and this permission notice (including the next
16 * paragraph) shall be included in all copies or substantial portions of the
17 * Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
23 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
24 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
25 * DEALINGS IN THE SOFTWARE.
26 *
27 * Authors: Rickard E. (Rik) Faith <faith@valinux.com>
28 * Jeff Hartmann <jhartmann@valinux.com>
29 *
30 */
31
32#ifndef _I830_DRV_H_
33#define _I830_DRV_H_
34
35/* General customization:
36 */
37
38#define DRIVER_AUTHOR "VA Linux Systems Inc."
39
40#define DRIVER_NAME "i830"
41#define DRIVER_DESC "Intel 830M"
42#define DRIVER_DATE "20021108"
43
44/* Interface history:
45 *
46 * 1.1: Original.
47 * 1.2: ?
48 * 1.3: New irq emit/wait ioctls.
49 * New pageflip ioctl.
50 * New getparam ioctl.
51 * State for texunits 3&4 in sarea.
52 * New (alternative) layout for texture state.
53 */
54#define DRIVER_MAJOR 1
55#define DRIVER_MINOR 3
56#define DRIVER_PATCHLEVEL 2
57
58/* Driver will work either way: IRQ's save cpu time when waiting for
59 * the card, but are subject to subtle interactions between bios,
60 * hardware and the driver.
61 */
62/* XXX: Add vblank support? */
63#define USE_IRQS 0
64
65typedef struct drm_i830_buf_priv {
66 u32 *in_use;
67 int my_use_idx;
68 int currently_mapped;
69 void __user *virtual;
70 void *kernel_virtual;
71 drm_local_map_t map;
72} drm_i830_buf_priv_t;
73
74typedef struct _drm_i830_ring_buffer {
75 int tail_mask;
76 unsigned long Start;
77 unsigned long End;
78 unsigned long Size;
79 u8 *virtual_start;
80 int head;
81 int tail;
82 int space;
83 drm_local_map_t map;
84} drm_i830_ring_buffer_t;
85
86typedef struct drm_i830_private {
87 struct drm_local_map *sarea_map;
88 struct drm_local_map *mmio_map;
89
90 drm_i830_sarea_t *sarea_priv;
91 drm_i830_ring_buffer_t ring;
92
93 void *hw_status_page;
94 unsigned long counter;
95
96 dma_addr_t dma_status_page;
97
98 struct drm_buf *mmap_buffer;
99
100 u32 front_di1, back_di1, zi1;
101
102 int back_offset;
103 int depth_offset;
104 int front_offset;
105 int w, h;
106 int pitch;
107 int back_pitch;
108 int depth_pitch;
109 unsigned int cpp;
110
111 int do_boxes;
112 int dma_used;
113
114 int current_page;
115 int page_flipping;
116
117 wait_queue_head_t irq_queue;
118 atomic_t irq_received;
119 atomic_t irq_emitted;
120
121 int use_mi_batchbuffer_start;
122
123} drm_i830_private_t;
124
125long i830_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
126extern struct drm_ioctl_desc i830_ioctls[];
127extern int i830_max_ioctl;
128
129/* i830_irq.c */
130extern int i830_irq_emit(struct drm_device *dev, void *data,
131 struct drm_file *file_priv);
132extern int i830_irq_wait(struct drm_device *dev, void *data,
133 struct drm_file *file_priv);
134
135extern irqreturn_t i830_driver_irq_handler(DRM_IRQ_ARGS);
136extern void i830_driver_irq_preinstall(struct drm_device *dev);
137extern void i830_driver_irq_postinstall(struct drm_device *dev);
138extern void i830_driver_irq_uninstall(struct drm_device *dev);
139extern int i830_driver_load(struct drm_device *, unsigned long flags);
140extern void i830_driver_preclose(struct drm_device *dev,
141 struct drm_file *file_priv);
142extern void i830_driver_lastclose(struct drm_device *dev);
143extern void i830_driver_reclaim_buffers_locked(struct drm_device *dev,
144 struct drm_file *file_priv);
145extern int i830_driver_dma_quiescent(struct drm_device *dev);
146extern int i830_driver_device_is_agp(struct drm_device *dev);
147
148#define I830_READ(reg) DRM_READ32(dev_priv->mmio_map, reg)
149#define I830_WRITE(reg, val) DRM_WRITE32(dev_priv->mmio_map, reg, val)
150#define I830_READ16(reg) DRM_READ16(dev_priv->mmio_map, reg)
151#define I830_WRITE16(reg, val) DRM_WRITE16(dev_priv->mmio_map, reg, val)
152
153#define I830_VERBOSE 0
154
155#define RING_LOCALS unsigned int outring, ringmask, outcount; \
156 volatile char *virt;
157
158#define BEGIN_LP_RING(n) do { \
159 if (I830_VERBOSE) \
160 printk("BEGIN_LP_RING(%d)\n", (n)); \
161 if (dev_priv->ring.space < n*4) \
162 i830_wait_ring(dev, n*4, __func__); \
163 outcount = 0; \
164 outring = dev_priv->ring.tail; \
165 ringmask = dev_priv->ring.tail_mask; \
166 virt = dev_priv->ring.virtual_start; \
167} while (0)
168
169#define OUT_RING(n) do { \
170 if (I830_VERBOSE) \
171 printk(" OUT_RING %x\n", (int)(n)); \
172 *(volatile unsigned int *)(virt + outring) = n; \
173 outcount++; \
174 outring += 4; \
175 outring &= ringmask; \
176} while (0)
177
178#define ADVANCE_LP_RING() do { \
179 if (I830_VERBOSE) \
180 printk("ADVANCE_LP_RING %x\n", outring); \
181 dev_priv->ring.tail = outring; \
182 dev_priv->ring.space -= outcount * 4; \
183 I830_WRITE(LP_RING + RING_TAIL, outring); \
184} while (0)
185
186extern int i830_wait_ring(struct drm_device *dev, int n, const char *caller);
187
188#define GFX_OP_USER_INTERRUPT ((0<<29)|(2<<23))
189#define GFX_OP_BREAKPOINT_INTERRUPT ((0<<29)|(1<<23))
190#define CMD_REPORT_HEAD (7<<23)
191#define CMD_STORE_DWORD_IDX ((0x21<<23) | 0x1)
192#define CMD_OP_BATCH_BUFFER ((0x0<<29)|(0x30<<23)|0x1)
193
194#define STATE3D_LOAD_STATE_IMMEDIATE_2 ((0x3<<29)|(0x1d<<24)|(0x03<<16))
195#define LOAD_TEXTURE_MAP0 (1<<11)
196
197#define INST_PARSER_CLIENT 0x00000000
198#define INST_OP_FLUSH 0x02000000
199#define INST_FLUSH_MAP_CACHE 0x00000001
200
201#define BB1_START_ADDR_MASK (~0x7)
202#define BB1_PROTECTED (1<<0)
203#define BB1_UNPROTECTED (0<<0)
204#define BB2_END_ADDR_MASK (~0x7)
205
206#define I830REG_HWSTAM 0x02098
207#define I830REG_INT_IDENTITY_R 0x020a4
208#define I830REG_INT_MASK_R 0x020a8
209#define I830REG_INT_ENABLE_R 0x020a0
210
211#define I830_IRQ_RESERVED ((1<<13)|(3<<2))
212
213#define LP_RING 0x2030
214#define HP_RING 0x2040
215#define RING_TAIL 0x00
216#define TAIL_ADDR 0x001FFFF8
217#define RING_HEAD 0x04
218#define HEAD_WRAP_COUNT 0xFFE00000
219#define HEAD_WRAP_ONE 0x00200000
220#define HEAD_ADDR 0x001FFFFC
221#define RING_START 0x08
222#define START_ADDR 0x0xFFFFF000
223#define RING_LEN 0x0C
224#define RING_NR_PAGES 0x001FF000
225#define RING_REPORT_MASK 0x00000006
226#define RING_REPORT_64K 0x00000002
227#define RING_REPORT_128K 0x00000004
228#define RING_NO_REPORT 0x00000000
229#define RING_VALID_MASK 0x00000001
230#define RING_VALID 0x00000001
231#define RING_INVALID 0x00000000
232
233#define GFX_OP_SCISSOR ((0x3<<29)|(0x1c<<24)|(0x10<<19))
234#define SC_UPDATE_SCISSOR (0x1<<1)
235#define SC_ENABLE_MASK (0x1<<0)
236#define SC_ENABLE (0x1<<0)
237
238#define GFX_OP_SCISSOR_INFO ((0x3<<29)|(0x1d<<24)|(0x81<<16)|(0x1))
239#define SCI_YMIN_MASK (0xffff<<16)
240#define SCI_XMIN_MASK (0xffff<<0)
241#define SCI_YMAX_MASK (0xffff<<16)
242#define SCI_XMAX_MASK (0xffff<<0)
243
244#define GFX_OP_SCISSOR_ENABLE ((0x3<<29)|(0x1c<<24)|(0x10<<19))
245#define GFX_OP_SCISSOR_RECT ((0x3<<29)|(0x1d<<24)|(0x81<<16)|1)
246#define GFX_OP_COLOR_FACTOR ((0x3<<29)|(0x1d<<24)|(0x1<<16)|0x0)
247#define GFX_OP_STIPPLE ((0x3<<29)|(0x1d<<24)|(0x83<<16))
248#define GFX_OP_MAP_INFO ((0x3<<29)|(0x1d<<24)|0x4)
249#define GFX_OP_DESTBUFFER_VARS ((0x3<<29)|(0x1d<<24)|(0x85<<16)|0x0)
250#define GFX_OP_DRAWRECT_INFO ((0x3<<29)|(0x1d<<24)|(0x80<<16)|(0x3))
251#define GFX_OP_PRIMITIVE ((0x3<<29)|(0x1f<<24))
252
253#define CMD_OP_DESTBUFFER_INFO ((0x3<<29)|(0x1d<<24)|(0x8e<<16)|1)
254
255#define CMD_OP_DISPLAYBUFFER_INFO ((0x0<<29)|(0x14<<23)|2)
256#define ASYNC_FLIP (1<<22)
257
258#define CMD_3D (0x3<<29)
259#define STATE3D_CONST_BLEND_COLOR_CMD (CMD_3D|(0x1d<<24)|(0x88<<16))
260#define STATE3D_MAP_COORD_SETBIND_CMD (CMD_3D|(0x1d<<24)|(0x02<<16))
261
262#define BR00_BITBLT_CLIENT 0x40000000
263#define BR00_OP_COLOR_BLT 0x10000000
264#define BR00_OP_SRC_COPY_BLT 0x10C00000
265#define BR13_SOLID_PATTERN 0x80000000
266
267#define BUF_3D_ID_COLOR_BACK (0x3<<24)
268#define BUF_3D_ID_DEPTH (0x7<<24)
269#define BUF_3D_USE_FENCE (1<<23)
270#define BUF_3D_PITCH(x) (((x)/4)<<2)
271
272#define CMD_OP_MAP_PALETTE_LOAD ((3<<29)|(0x1d<<24)|(0x82<<16)|255)
273#define MAP_PALETTE_NUM(x) ((x<<8) & (1<<8))
274#define MAP_PALETTE_BOTH (1<<11)
275
276#define XY_COLOR_BLT_CMD ((2<<29)|(0x50<<22)|0x4)
277#define XY_COLOR_BLT_WRITE_ALPHA (1<<21)
278#define XY_COLOR_BLT_WRITE_RGB (1<<20)
279
280#define XY_SRC_COPY_BLT_CMD ((2<<29)|(0x53<<22)|6)
281#define XY_SRC_COPY_BLT_WRITE_ALPHA (1<<21)
282#define XY_SRC_COPY_BLT_WRITE_RGB (1<<20)
283
284#define MI_BATCH_BUFFER ((0x30<<23)|1)
285#define MI_BATCH_BUFFER_START (0x31<<23)
286#define MI_BATCH_BUFFER_END (0xA<<23)
287#define MI_BATCH_NON_SECURE (1)
288
289#define MI_WAIT_FOR_EVENT ((0x3<<23))
290#define MI_WAIT_FOR_PLANE_A_FLIP (1<<2)
291#define MI_WAIT_FOR_PLANE_A_SCANLINES (1<<1)
292
293#define MI_LOAD_SCAN_LINES_INCL ((0x12<<23))
294
295#endif
diff --git a/drivers/gpu/drm/i830/i830_irq.c b/drivers/gpu/drm/i830/i830_irq.c
deleted file mode 100644
index d1a6b95d631d..000000000000
--- a/drivers/gpu/drm/i830/i830_irq.c
+++ /dev/null
@@ -1,186 +0,0 @@
1/* i830_dma.c -- DMA support for the I830 -*- linux-c -*-
2 *
3 * Copyright 2002 Tungsten Graphics, Inc.
4 * All Rights Reserved.
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 * TUNGSTEN GRAPHICS 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 * Authors: Keith Whitwell <keith@tungstengraphics.com>
26 *
27 */
28
29#include "drmP.h"
30#include "drm.h"
31#include "i830_drm.h"
32#include "i830_drv.h"
33#include <linux/interrupt.h> /* For task queue support */
34#include <linux/delay.h>
35
36irqreturn_t i830_driver_irq_handler(DRM_IRQ_ARGS)
37{
38 struct drm_device *dev = (struct drm_device *) arg;
39 drm_i830_private_t *dev_priv = (drm_i830_private_t *) dev->dev_private;
40 u16 temp;
41
42 temp = I830_READ16(I830REG_INT_IDENTITY_R);
43 DRM_DEBUG("%x\n", temp);
44
45 if (!(temp & 2))
46 return IRQ_NONE;
47
48 I830_WRITE16(I830REG_INT_IDENTITY_R, temp);
49
50 atomic_inc(&dev_priv->irq_received);
51 wake_up_interruptible(&dev_priv->irq_queue);
52
53 return IRQ_HANDLED;
54}
55
56static int i830_emit_irq(struct drm_device *dev)
57{
58 drm_i830_private_t *dev_priv = dev->dev_private;
59 RING_LOCALS;
60
61 DRM_DEBUG("%s\n", __func__);
62
63 atomic_inc(&dev_priv->irq_emitted);
64
65 BEGIN_LP_RING(2);
66 OUT_RING(0);
67 OUT_RING(GFX_OP_USER_INTERRUPT);
68 ADVANCE_LP_RING();
69
70 return atomic_read(&dev_priv->irq_emitted);
71}
72
73static int i830_wait_irq(struct drm_device *dev, int irq_nr)
74{
75 drm_i830_private_t *dev_priv = (drm_i830_private_t *) dev->dev_private;
76 DECLARE_WAITQUEUE(entry, current);
77 unsigned long end = jiffies + HZ * 3;
78 int ret = 0;
79
80 DRM_DEBUG("%s\n", __func__);
81
82 if (atomic_read(&dev_priv->irq_received) >= irq_nr)
83 return 0;
84
85 dev_priv->sarea_priv->perf_boxes |= I830_BOX_WAIT;
86
87 add_wait_queue(&dev_priv->irq_queue, &entry);
88
89 for (;;) {
90 __set_current_state(TASK_INTERRUPTIBLE);
91 if (atomic_read(&dev_priv->irq_received) >= irq_nr)
92 break;
93 if ((signed)(end - jiffies) <= 0) {
94 DRM_ERROR("timeout iir %x imr %x ier %x hwstam %x\n",
95 I830_READ16(I830REG_INT_IDENTITY_R),
96 I830_READ16(I830REG_INT_MASK_R),
97 I830_READ16(I830REG_INT_ENABLE_R),
98 I830_READ16(I830REG_HWSTAM));
99
100 ret = -EBUSY; /* Lockup? Missed irq? */
101 break;
102 }
103 schedule_timeout(HZ * 3);
104 if (signal_pending(current)) {
105 ret = -EINTR;
106 break;
107 }
108 }
109
110 __set_current_state(TASK_RUNNING);
111 remove_wait_queue(&dev_priv->irq_queue, &entry);
112 return ret;
113}
114
115/* Needs the lock as it touches the ring.
116 */
117int i830_irq_emit(struct drm_device *dev, void *data,
118 struct drm_file *file_priv)
119{
120 drm_i830_private_t *dev_priv = dev->dev_private;
121 drm_i830_irq_emit_t *emit = data;
122 int result;
123
124 LOCK_TEST_WITH_RETURN(dev, file_priv);
125
126 if (!dev_priv) {
127 DRM_ERROR("%s called with no initialization\n", __func__);
128 return -EINVAL;
129 }
130
131 result = i830_emit_irq(dev);
132
133 if (copy_to_user(emit->irq_seq, &result, sizeof(int))) {
134 DRM_ERROR("copy_to_user\n");
135 return -EFAULT;
136 }
137
138 return 0;
139}
140
141/* Doesn't need the hardware lock.
142 */
143int i830_irq_wait(struct drm_device *dev, void *data,
144 struct drm_file *file_priv)
145{
146 drm_i830_private_t *dev_priv = dev->dev_private;
147 drm_i830_irq_wait_t *irqwait = data;
148
149 if (!dev_priv) {
150 DRM_ERROR("%s called with no initialization\n", __func__);
151 return -EINVAL;
152 }
153
154 return i830_wait_irq(dev, irqwait->irq_seq);
155}
156
157/* drm_dma.h hooks
158*/
159void i830_driver_irq_preinstall(struct drm_device *dev)
160{
161 drm_i830_private_t *dev_priv = (drm_i830_private_t *) dev->dev_private;
162
163 I830_WRITE16(I830REG_HWSTAM, 0xffff);
164 I830_WRITE16(I830REG_INT_MASK_R, 0x0);
165 I830_WRITE16(I830REG_INT_ENABLE_R, 0x0);
166 atomic_set(&dev_priv->irq_received, 0);
167 atomic_set(&dev_priv->irq_emitted, 0);
168 init_waitqueue_head(&dev_priv->irq_queue);
169}
170
171void i830_driver_irq_postinstall(struct drm_device *dev)
172{
173 drm_i830_private_t *dev_priv = (drm_i830_private_t *) dev->dev_private;
174
175 I830_WRITE16(I830REG_INT_ENABLE_R, 0x2);
176}
177
178void i830_driver_irq_uninstall(struct drm_device *dev)
179{
180 drm_i830_private_t *dev_priv = (drm_i830_private_t *) dev->dev_private;
181 if (!dev_priv)
182 return;
183
184 I830_WRITE16(I830REG_INT_MASK_R, 0xffff);
185 I830_WRITE16(I830REG_INT_ENABLE_R, 0x0);
186}
diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile
index 5c8e53458edb..0ae6a7c5020f 100644
--- a/drivers/gpu/drm/i915/Makefile
+++ b/drivers/gpu/drm/i915/Makefile
@@ -9,6 +9,8 @@ i915-y := i915_drv.o i915_dma.o i915_irq.o i915_mem.o \
9 i915_gem.o \ 9 i915_gem.o \
10 i915_gem_debug.o \ 10 i915_gem_debug.o \
11 i915_gem_evict.o \ 11 i915_gem_evict.o \
12 i915_gem_execbuffer.o \
13 i915_gem_gtt.o \
12 i915_gem_tiling.o \ 14 i915_gem_tiling.o \
13 i915_trace_points.o \ 15 i915_trace_points.o \
14 intel_display.o \ 16 intel_display.o \
@@ -26,15 +28,17 @@ i915-y := i915_drv.o i915_dma.o i915_irq.o i915_mem.o \
26 intel_dvo.o \ 28 intel_dvo.o \
27 intel_ringbuffer.o \ 29 intel_ringbuffer.o \
28 intel_overlay.o \ 30 intel_overlay.o \
31 intel_opregion.o \
29 dvo_ch7xxx.o \ 32 dvo_ch7xxx.o \
30 dvo_ch7017.o \ 33 dvo_ch7017.o \
31 dvo_ivch.o \ 34 dvo_ivch.o \
32 dvo_tfp410.o \ 35 dvo_tfp410.o \
33 dvo_sil164.o 36 dvo_sil164.o
34 37
35i915-$(CONFIG_ACPI) += i915_opregion.o
36i915-$(CONFIG_COMPAT) += i915_ioc32.o 38i915-$(CONFIG_COMPAT) += i915_ioc32.o
37 39
40i915-$(CONFIG_ACPI) += intel_acpi.o
41
38obj-$(CONFIG_DRM_I915) += i915.o 42obj-$(CONFIG_DRM_I915) += i915.o
39 43
40CFLAGS_i915_trace_points.o := -I$(src) 44CFLAGS_i915_trace_points.o := -I$(src)
diff --git a/drivers/gpu/drm/i915/dvo_ch7017.c b/drivers/gpu/drm/i915/dvo_ch7017.c
index 14d59804acd7..d3e8c540f778 100644
--- a/drivers/gpu/drm/i915/dvo_ch7017.c
+++ b/drivers/gpu/drm/i915/dvo_ch7017.c
@@ -165,67 +165,44 @@ struct ch7017_priv {
165static void ch7017_dump_regs(struct intel_dvo_device *dvo); 165static void ch7017_dump_regs(struct intel_dvo_device *dvo);
166static void ch7017_dpms(struct intel_dvo_device *dvo, int mode); 166static void ch7017_dpms(struct intel_dvo_device *dvo, int mode);
167 167
168static bool ch7017_read(struct intel_dvo_device *dvo, int addr, uint8_t *val) 168static bool ch7017_read(struct intel_dvo_device *dvo, u8 addr, u8 *val)
169{ 169{
170 struct i2c_adapter *adapter = dvo->i2c_bus;
171 struct intel_i2c_chan *i2cbus = container_of(adapter, struct intel_i2c_chan, adapter);
172 u8 out_buf[2];
173 u8 in_buf[2];
174
175 struct i2c_msg msgs[] = { 170 struct i2c_msg msgs[] = {
176 { 171 {
177 .addr = dvo->slave_addr, 172 .addr = dvo->slave_addr,
178 .flags = 0, 173 .flags = 0,
179 .len = 1, 174 .len = 1,
180 .buf = out_buf, 175 .buf = &addr,
181 }, 176 },
182 { 177 {
183 .addr = dvo->slave_addr, 178 .addr = dvo->slave_addr,
184 .flags = I2C_M_RD, 179 .flags = I2C_M_RD,
185 .len = 1, 180 .len = 1,
186 .buf = in_buf, 181 .buf = val,
187 } 182 }
188 }; 183 };
189 184 return i2c_transfer(dvo->i2c_bus, msgs, 2) == 2;
190 out_buf[0] = addr;
191 out_buf[1] = 0;
192
193 if (i2c_transfer(&i2cbus->adapter, msgs, 2) == 2) {
194 *val= in_buf[0];
195 return true;
196 };
197
198 return false;
199} 185}
200 186
201static bool ch7017_write(struct intel_dvo_device *dvo, int addr, uint8_t val) 187static bool ch7017_write(struct intel_dvo_device *dvo, u8 addr, u8 val)
202{ 188{
203 struct i2c_adapter *adapter = dvo->i2c_bus; 189 uint8_t buf[2] = { addr, val };
204 struct intel_i2c_chan *i2cbus = container_of(adapter, struct intel_i2c_chan, adapter);
205 uint8_t out_buf[2];
206 struct i2c_msg msg = { 190 struct i2c_msg msg = {
207 .addr = dvo->slave_addr, 191 .addr = dvo->slave_addr,
208 .flags = 0, 192 .flags = 0,
209 .len = 2, 193 .len = 2,
210 .buf = out_buf, 194 .buf = buf,
211 }; 195 };
212 196 return i2c_transfer(dvo->i2c_bus, &msg, 1) == 1;
213 out_buf[0] = addr;
214 out_buf[1] = val;
215
216 if (i2c_transfer(&i2cbus->adapter, &msg, 1) == 1)
217 return true;
218
219 return false;
220} 197}
221 198
222/** Probes for a CH7017 on the given bus and slave address. */ 199/** Probes for a CH7017 on the given bus and slave address. */
223static bool ch7017_init(struct intel_dvo_device *dvo, 200static bool ch7017_init(struct intel_dvo_device *dvo,
224 struct i2c_adapter *adapter) 201 struct i2c_adapter *adapter)
225{ 202{
226 struct intel_i2c_chan *i2cbus = container_of(adapter, struct intel_i2c_chan, adapter);
227 struct ch7017_priv *priv; 203 struct ch7017_priv *priv;
228 uint8_t val; 204 const char *str;
205 u8 val;
229 206
230 priv = kzalloc(sizeof(struct ch7017_priv), GFP_KERNEL); 207 priv = kzalloc(sizeof(struct ch7017_priv), GFP_KERNEL);
231 if (priv == NULL) 208 if (priv == NULL)
@@ -237,16 +214,27 @@ static bool ch7017_init(struct intel_dvo_device *dvo,
237 if (!ch7017_read(dvo, CH7017_DEVICE_ID, &val)) 214 if (!ch7017_read(dvo, CH7017_DEVICE_ID, &val))
238 goto fail; 215 goto fail;
239 216
240 if (val != CH7017_DEVICE_ID_VALUE && 217 switch (val) {
241 val != CH7018_DEVICE_ID_VALUE && 218 case CH7017_DEVICE_ID_VALUE:
242 val != CH7019_DEVICE_ID_VALUE) { 219 str = "ch7017";
220 break;
221 case CH7018_DEVICE_ID_VALUE:
222 str = "ch7018";
223 break;
224 case CH7019_DEVICE_ID_VALUE:
225 str = "ch7019";
226 break;
227 default:
243 DRM_DEBUG_KMS("ch701x not detected, got %d: from %s " 228 DRM_DEBUG_KMS("ch701x not detected, got %d: from %s "
244 "Slave %d.\n", 229 "slave %d.\n",
245 val, i2cbus->adapter.name,dvo->slave_addr); 230 val, adapter->name,dvo->slave_addr);
246 goto fail; 231 goto fail;
247 } 232 }
248 233
234 DRM_DEBUG_KMS("%s detected on %s, addr %d\n",
235 str, adapter->name, dvo->slave_addr);
249 return true; 236 return true;
237
250fail: 238fail:
251 kfree(priv); 239 kfree(priv);
252 return false; 240 return false;
@@ -254,7 +242,7 @@ fail:
254 242
255static enum drm_connector_status ch7017_detect(struct intel_dvo_device *dvo) 243static enum drm_connector_status ch7017_detect(struct intel_dvo_device *dvo)
256{ 244{
257 return connector_status_unknown; 245 return connector_status_connected;
258} 246}
259 247
260static enum drm_mode_status ch7017_mode_valid(struct intel_dvo_device *dvo, 248static enum drm_mode_status ch7017_mode_valid(struct intel_dvo_device *dvo,
@@ -368,7 +356,7 @@ static void ch7017_dpms(struct intel_dvo_device *dvo, int mode)
368 } 356 }
369 357
370 /* XXX: Should actually wait for update power status somehow */ 358 /* XXX: Should actually wait for update power status somehow */
371 udelay(20000); 359 msleep(20);
372} 360}
373 361
374static void ch7017_dump_regs(struct intel_dvo_device *dvo) 362static void ch7017_dump_regs(struct intel_dvo_device *dvo)
diff --git a/drivers/gpu/drm/i915/dvo_ch7xxx.c b/drivers/gpu/drm/i915/dvo_ch7xxx.c
index 6f1944b24441..7eaa94e4ff06 100644
--- a/drivers/gpu/drm/i915/dvo_ch7xxx.c
+++ b/drivers/gpu/drm/i915/dvo_ch7xxx.c
@@ -113,7 +113,6 @@ static bool ch7xxx_readb(struct intel_dvo_device *dvo, int addr, uint8_t *ch)
113{ 113{
114 struct ch7xxx_priv *ch7xxx= dvo->dev_priv; 114 struct ch7xxx_priv *ch7xxx= dvo->dev_priv;
115 struct i2c_adapter *adapter = dvo->i2c_bus; 115 struct i2c_adapter *adapter = dvo->i2c_bus;
116 struct intel_i2c_chan *i2cbus = container_of(adapter, struct intel_i2c_chan, adapter);
117 u8 out_buf[2]; 116 u8 out_buf[2];
118 u8 in_buf[2]; 117 u8 in_buf[2];
119 118
@@ -135,14 +134,14 @@ static bool ch7xxx_readb(struct intel_dvo_device *dvo, int addr, uint8_t *ch)
135 out_buf[0] = addr; 134 out_buf[0] = addr;
136 out_buf[1] = 0; 135 out_buf[1] = 0;
137 136
138 if (i2c_transfer(&i2cbus->adapter, msgs, 2) == 2) { 137 if (i2c_transfer(adapter, msgs, 2) == 2) {
139 *ch = in_buf[0]; 138 *ch = in_buf[0];
140 return true; 139 return true;
141 }; 140 };
142 141
143 if (!ch7xxx->quiet) { 142 if (!ch7xxx->quiet) {
144 DRM_DEBUG_KMS("Unable to read register 0x%02x from %s:%02x.\n", 143 DRM_DEBUG_KMS("Unable to read register 0x%02x from %s:%02x.\n",
145 addr, i2cbus->adapter.name, dvo->slave_addr); 144 addr, adapter->name, dvo->slave_addr);
146 } 145 }
147 return false; 146 return false;
148} 147}
@@ -152,7 +151,6 @@ static bool ch7xxx_writeb(struct intel_dvo_device *dvo, int addr, uint8_t ch)
152{ 151{
153 struct ch7xxx_priv *ch7xxx = dvo->dev_priv; 152 struct ch7xxx_priv *ch7xxx = dvo->dev_priv;
154 struct i2c_adapter *adapter = dvo->i2c_bus; 153 struct i2c_adapter *adapter = dvo->i2c_bus;
155 struct intel_i2c_chan *i2cbus = container_of(adapter, struct intel_i2c_chan, adapter);
156 uint8_t out_buf[2]; 154 uint8_t out_buf[2];
157 struct i2c_msg msg = { 155 struct i2c_msg msg = {
158 .addr = dvo->slave_addr, 156 .addr = dvo->slave_addr,
@@ -164,12 +162,12 @@ static bool ch7xxx_writeb(struct intel_dvo_device *dvo, int addr, uint8_t ch)
164 out_buf[0] = addr; 162 out_buf[0] = addr;
165 out_buf[1] = ch; 163 out_buf[1] = ch;
166 164
167 if (i2c_transfer(&i2cbus->adapter, &msg, 1) == 1) 165 if (i2c_transfer(adapter, &msg, 1) == 1)
168 return true; 166 return true;
169 167
170 if (!ch7xxx->quiet) { 168 if (!ch7xxx->quiet) {
171 DRM_DEBUG_KMS("Unable to write register 0x%02x to %s:%d.\n", 169 DRM_DEBUG_KMS("Unable to write register 0x%02x to %s:%d.\n",
172 addr, i2cbus->adapter.name, dvo->slave_addr); 170 addr, adapter->name, dvo->slave_addr);
173 } 171 }
174 172
175 return false; 173 return false;
diff --git a/drivers/gpu/drm/i915/dvo_ivch.c b/drivers/gpu/drm/i915/dvo_ivch.c
index a2ec3f487202..a12ed9414cc7 100644
--- a/drivers/gpu/drm/i915/dvo_ivch.c
+++ b/drivers/gpu/drm/i915/dvo_ivch.c
@@ -167,7 +167,6 @@ static bool ivch_read(struct intel_dvo_device *dvo, int addr, uint16_t *data)
167{ 167{
168 struct ivch_priv *priv = dvo->dev_priv; 168 struct ivch_priv *priv = dvo->dev_priv;
169 struct i2c_adapter *adapter = dvo->i2c_bus; 169 struct i2c_adapter *adapter = dvo->i2c_bus;
170 struct intel_i2c_chan *i2cbus = container_of(adapter, struct intel_i2c_chan, adapter);
171 u8 out_buf[1]; 170 u8 out_buf[1];
172 u8 in_buf[2]; 171 u8 in_buf[2];
173 172
@@ -193,7 +192,7 @@ static bool ivch_read(struct intel_dvo_device *dvo, int addr, uint16_t *data)
193 192
194 out_buf[0] = addr; 193 out_buf[0] = addr;
195 194
196 if (i2c_transfer(&i2cbus->adapter, msgs, 3) == 3) { 195 if (i2c_transfer(adapter, msgs, 3) == 3) {
197 *data = (in_buf[1] << 8) | in_buf[0]; 196 *data = (in_buf[1] << 8) | in_buf[0];
198 return true; 197 return true;
199 }; 198 };
@@ -201,7 +200,7 @@ static bool ivch_read(struct intel_dvo_device *dvo, int addr, uint16_t *data)
201 if (!priv->quiet) { 200 if (!priv->quiet) {
202 DRM_DEBUG_KMS("Unable to read register 0x%02x from " 201 DRM_DEBUG_KMS("Unable to read register 0x%02x from "
203 "%s:%02x.\n", 202 "%s:%02x.\n",
204 addr, i2cbus->adapter.name, dvo->slave_addr); 203 addr, adapter->name, dvo->slave_addr);
205 } 204 }
206 return false; 205 return false;
207} 206}
@@ -211,7 +210,6 @@ static bool ivch_write(struct intel_dvo_device *dvo, int addr, uint16_t data)
211{ 210{
212 struct ivch_priv *priv = dvo->dev_priv; 211 struct ivch_priv *priv = dvo->dev_priv;
213 struct i2c_adapter *adapter = dvo->i2c_bus; 212 struct i2c_adapter *adapter = dvo->i2c_bus;
214 struct intel_i2c_chan *i2cbus = container_of(adapter, struct intel_i2c_chan, adapter);
215 u8 out_buf[3]; 213 u8 out_buf[3];
216 struct i2c_msg msg = { 214 struct i2c_msg msg = {
217 .addr = dvo->slave_addr, 215 .addr = dvo->slave_addr,
@@ -224,12 +222,12 @@ static bool ivch_write(struct intel_dvo_device *dvo, int addr, uint16_t data)
224 out_buf[1] = data & 0xff; 222 out_buf[1] = data & 0xff;
225 out_buf[2] = data >> 8; 223 out_buf[2] = data >> 8;
226 224
227 if (i2c_transfer(&i2cbus->adapter, &msg, 1) == 1) 225 if (i2c_transfer(adapter, &msg, 1) == 1)
228 return true; 226 return true;
229 227
230 if (!priv->quiet) { 228 if (!priv->quiet) {
231 DRM_DEBUG_KMS("Unable to write register 0x%02x to %s:%d.\n", 229 DRM_DEBUG_KMS("Unable to write register 0x%02x to %s:%d.\n",
232 addr, i2cbus->adapter.name, dvo->slave_addr); 230 addr, adapter->name, dvo->slave_addr);
233 } 231 }
234 232
235 return false; 233 return false;
diff --git a/drivers/gpu/drm/i915/dvo_sil164.c b/drivers/gpu/drm/i915/dvo_sil164.c
index 9b8e6765cf26..e4b4091df942 100644
--- a/drivers/gpu/drm/i915/dvo_sil164.c
+++ b/drivers/gpu/drm/i915/dvo_sil164.c
@@ -69,7 +69,6 @@ static bool sil164_readb(struct intel_dvo_device *dvo, int addr, uint8_t *ch)
69{ 69{
70 struct sil164_priv *sil = dvo->dev_priv; 70 struct sil164_priv *sil = dvo->dev_priv;
71 struct i2c_adapter *adapter = dvo->i2c_bus; 71 struct i2c_adapter *adapter = dvo->i2c_bus;
72 struct intel_i2c_chan *i2cbus = container_of(adapter, struct intel_i2c_chan, adapter);
73 u8 out_buf[2]; 72 u8 out_buf[2];
74 u8 in_buf[2]; 73 u8 in_buf[2];
75 74
@@ -91,14 +90,14 @@ static bool sil164_readb(struct intel_dvo_device *dvo, int addr, uint8_t *ch)
91 out_buf[0] = addr; 90 out_buf[0] = addr;
92 out_buf[1] = 0; 91 out_buf[1] = 0;
93 92
94 if (i2c_transfer(&i2cbus->adapter, msgs, 2) == 2) { 93 if (i2c_transfer(adapter, msgs, 2) == 2) {
95 *ch = in_buf[0]; 94 *ch = in_buf[0];
96 return true; 95 return true;
97 }; 96 };
98 97
99 if (!sil->quiet) { 98 if (!sil->quiet) {
100 DRM_DEBUG_KMS("Unable to read register 0x%02x from %s:%02x.\n", 99 DRM_DEBUG_KMS("Unable to read register 0x%02x from %s:%02x.\n",
101 addr, i2cbus->adapter.name, dvo->slave_addr); 100 addr, adapter->name, dvo->slave_addr);
102 } 101 }
103 return false; 102 return false;
104} 103}
@@ -107,7 +106,6 @@ static bool sil164_writeb(struct intel_dvo_device *dvo, int addr, uint8_t ch)
107{ 106{
108 struct sil164_priv *sil= dvo->dev_priv; 107 struct sil164_priv *sil= dvo->dev_priv;
109 struct i2c_adapter *adapter = dvo->i2c_bus; 108 struct i2c_adapter *adapter = dvo->i2c_bus;
110 struct intel_i2c_chan *i2cbus = container_of(adapter, struct intel_i2c_chan, adapter);
111 uint8_t out_buf[2]; 109 uint8_t out_buf[2];
112 struct i2c_msg msg = { 110 struct i2c_msg msg = {
113 .addr = dvo->slave_addr, 111 .addr = dvo->slave_addr,
@@ -119,12 +117,12 @@ static bool sil164_writeb(struct intel_dvo_device *dvo, int addr, uint8_t ch)
119 out_buf[0] = addr; 117 out_buf[0] = addr;
120 out_buf[1] = ch; 118 out_buf[1] = ch;
121 119
122 if (i2c_transfer(&i2cbus->adapter, &msg, 1) == 1) 120 if (i2c_transfer(adapter, &msg, 1) == 1)
123 return true; 121 return true;
124 122
125 if (!sil->quiet) { 123 if (!sil->quiet) {
126 DRM_DEBUG_KMS("Unable to write register 0x%02x to %s:%d.\n", 124 DRM_DEBUG_KMS("Unable to write register 0x%02x to %s:%d.\n",
127 addr, i2cbus->adapter.name, dvo->slave_addr); 125 addr, adapter->name, dvo->slave_addr);
128 } 126 }
129 127
130 return false; 128 return false;
diff --git a/drivers/gpu/drm/i915/dvo_tfp410.c b/drivers/gpu/drm/i915/dvo_tfp410.c
index 56f66426207f..8ab2855bb544 100644
--- a/drivers/gpu/drm/i915/dvo_tfp410.c
+++ b/drivers/gpu/drm/i915/dvo_tfp410.c
@@ -94,7 +94,6 @@ static bool tfp410_readb(struct intel_dvo_device *dvo, int addr, uint8_t *ch)
94{ 94{
95 struct tfp410_priv *tfp = dvo->dev_priv; 95 struct tfp410_priv *tfp = dvo->dev_priv;
96 struct i2c_adapter *adapter = dvo->i2c_bus; 96 struct i2c_adapter *adapter = dvo->i2c_bus;
97 struct intel_i2c_chan *i2cbus = container_of(adapter, struct intel_i2c_chan, adapter);
98 u8 out_buf[2]; 97 u8 out_buf[2];
99 u8 in_buf[2]; 98 u8 in_buf[2];
100 99
@@ -116,14 +115,14 @@ static bool tfp410_readb(struct intel_dvo_device *dvo, int addr, uint8_t *ch)
116 out_buf[0] = addr; 115 out_buf[0] = addr;
117 out_buf[1] = 0; 116 out_buf[1] = 0;
118 117
119 if (i2c_transfer(&i2cbus->adapter, msgs, 2) == 2) { 118 if (i2c_transfer(adapter, msgs, 2) == 2) {
120 *ch = in_buf[0]; 119 *ch = in_buf[0];
121 return true; 120 return true;
122 }; 121 };
123 122
124 if (!tfp->quiet) { 123 if (!tfp->quiet) {
125 DRM_DEBUG_KMS("Unable to read register 0x%02x from %s:%02x.\n", 124 DRM_DEBUG_KMS("Unable to read register 0x%02x from %s:%02x.\n",
126 addr, i2cbus->adapter.name, dvo->slave_addr); 125 addr, adapter->name, dvo->slave_addr);
127 } 126 }
128 return false; 127 return false;
129} 128}
@@ -132,7 +131,6 @@ static bool tfp410_writeb(struct intel_dvo_device *dvo, int addr, uint8_t ch)
132{ 131{
133 struct tfp410_priv *tfp = dvo->dev_priv; 132 struct tfp410_priv *tfp = dvo->dev_priv;
134 struct i2c_adapter *adapter = dvo->i2c_bus; 133 struct i2c_adapter *adapter = dvo->i2c_bus;
135 struct intel_i2c_chan *i2cbus = container_of(adapter, struct intel_i2c_chan, adapter);
136 uint8_t out_buf[2]; 134 uint8_t out_buf[2];
137 struct i2c_msg msg = { 135 struct i2c_msg msg = {
138 .addr = dvo->slave_addr, 136 .addr = dvo->slave_addr,
@@ -144,12 +142,12 @@ static bool tfp410_writeb(struct intel_dvo_device *dvo, int addr, uint8_t ch)
144 out_buf[0] = addr; 142 out_buf[0] = addr;
145 out_buf[1] = ch; 143 out_buf[1] = ch;
146 144
147 if (i2c_transfer(&i2cbus->adapter, &msg, 1) == 1) 145 if (i2c_transfer(adapter, &msg, 1) == 1)
148 return true; 146 return true;
149 147
150 if (!tfp->quiet) { 148 if (!tfp->quiet) {
151 DRM_DEBUG_KMS("Unable to write register 0x%02x to %s:%d.\n", 149 DRM_DEBUG_KMS("Unable to write register 0x%02x to %s:%d.\n",
152 addr, i2cbus->adapter.name, dvo->slave_addr); 150 addr, adapter->name, dvo->slave_addr);
153 } 151 }
154 152
155 return false; 153 return false;
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
index 5e43d7076789..0a893f7400fa 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -32,6 +32,7 @@
32#include "drmP.h" 32#include "drmP.h"
33#include "drm.h" 33#include "drm.h"
34#include "intel_drv.h" 34#include "intel_drv.h"
35#include "intel_ringbuffer.h"
35#include "i915_drm.h" 36#include "i915_drm.h"
36#include "i915_drv.h" 37#include "i915_drv.h"
37 38
@@ -40,23 +41,64 @@
40 41
41#if defined(CONFIG_DEBUG_FS) 42#if defined(CONFIG_DEBUG_FS)
42 43
43#define ACTIVE_LIST 1 44enum {
44#define FLUSHING_LIST 2 45 ACTIVE_LIST,
45#define INACTIVE_LIST 3 46 FLUSHING_LIST,
47 INACTIVE_LIST,
48 PINNED_LIST,
49 DEFERRED_FREE_LIST,
50};
51
52static const char *yesno(int v)
53{
54 return v ? "yes" : "no";
55}
56
57static int i915_capabilities(struct seq_file *m, void *data)
58{
59 struct drm_info_node *node = (struct drm_info_node *) m->private;
60 struct drm_device *dev = node->minor->dev;
61 const struct intel_device_info *info = INTEL_INFO(dev);
62
63 seq_printf(m, "gen: %d\n", info->gen);
64#define B(x) seq_printf(m, #x ": %s\n", yesno(info->x))
65 B(is_mobile);
66 B(is_i85x);
67 B(is_i915g);
68 B(is_i945gm);
69 B(is_g33);
70 B(need_gfx_hws);
71 B(is_g4x);
72 B(is_pineview);
73 B(is_broadwater);
74 B(is_crestline);
75 B(has_fbc);
76 B(has_pipe_cxsr);
77 B(has_hotplug);
78 B(cursor_needs_physical);
79 B(has_overlay);
80 B(overlay_needs_physical);
81 B(supports_tv);
82 B(has_bsd_ring);
83 B(has_blt_ring);
84#undef B
46 85
47static const char *get_pin_flag(struct drm_i915_gem_object *obj_priv) 86 return 0;
87}
88
89static const char *get_pin_flag(struct drm_i915_gem_object *obj)
48{ 90{
49 if (obj_priv->user_pin_count > 0) 91 if (obj->user_pin_count > 0)
50 return "P"; 92 return "P";
51 else if (obj_priv->pin_count > 0) 93 else if (obj->pin_count > 0)
52 return "p"; 94 return "p";
53 else 95 else
54 return " "; 96 return " ";
55} 97}
56 98
57static const char *get_tiling_flag(struct drm_i915_gem_object *obj_priv) 99static const char *get_tiling_flag(struct drm_i915_gem_object *obj)
58{ 100{
59 switch (obj_priv->tiling_mode) { 101 switch (obj->tiling_mode) {
60 default: 102 default:
61 case I915_TILING_NONE: return " "; 103 case I915_TILING_NONE: return " ";
62 case I915_TILING_X: return "X"; 104 case I915_TILING_X: return "X";
@@ -64,6 +106,51 @@ static const char *get_tiling_flag(struct drm_i915_gem_object *obj_priv)
64 } 106 }
65} 107}
66 108
109static const char *cache_level_str(int type)
110{
111 switch (type) {
112 case I915_CACHE_NONE: return " uncached";
113 case I915_CACHE_LLC: return " snooped (LLC)";
114 case I915_CACHE_LLC_MLC: return " snooped (LLC+MLC)";
115 default: return "";
116 }
117}
118
119static void
120describe_obj(struct seq_file *m, struct drm_i915_gem_object *obj)
121{
122 seq_printf(m, "%p: %s%s %8zd %04x %04x %d %d%s%s%s",
123 &obj->base,
124 get_pin_flag(obj),
125 get_tiling_flag(obj),
126 obj->base.size,
127 obj->base.read_domains,
128 obj->base.write_domain,
129 obj->last_rendering_seqno,
130 obj->last_fenced_seqno,
131 cache_level_str(obj->cache_level),
132 obj->dirty ? " dirty" : "",
133 obj->madv == I915_MADV_DONTNEED ? " purgeable" : "");
134 if (obj->base.name)
135 seq_printf(m, " (name: %d)", obj->base.name);
136 if (obj->fence_reg != I915_FENCE_REG_NONE)
137 seq_printf(m, " (fence: %d)", obj->fence_reg);
138 if (obj->gtt_space != NULL)
139 seq_printf(m, " (gtt offset: %08x, size: %08x)",
140 obj->gtt_offset, (unsigned int)obj->gtt_space->size);
141 if (obj->pin_mappable || obj->fault_mappable) {
142 char s[3], *t = s;
143 if (obj->pin_mappable)
144 *t++ = 'p';
145 if (obj->fault_mappable)
146 *t++ = 'f';
147 *t = '\0';
148 seq_printf(m, " (%s mappable)", s);
149 }
150 if (obj->ring != NULL)
151 seq_printf(m, " (%s)", obj->ring->name);
152}
153
67static int i915_gem_object_list_info(struct seq_file *m, void *data) 154static int i915_gem_object_list_info(struct seq_file *m, void *data)
68{ 155{
69 struct drm_info_node *node = (struct drm_info_node *) m->private; 156 struct drm_info_node *node = (struct drm_info_node *) m->private;
@@ -71,57 +158,167 @@ static int i915_gem_object_list_info(struct seq_file *m, void *data)
71 struct list_head *head; 158 struct list_head *head;
72 struct drm_device *dev = node->minor->dev; 159 struct drm_device *dev = node->minor->dev;
73 drm_i915_private_t *dev_priv = dev->dev_private; 160 drm_i915_private_t *dev_priv = dev->dev_private;
74 struct drm_i915_gem_object *obj_priv; 161 struct drm_i915_gem_object *obj;
75 spinlock_t *lock = NULL; 162 size_t total_obj_size, total_gtt_size;
163 int count, ret;
164
165 ret = mutex_lock_interruptible(&dev->struct_mutex);
166 if (ret)
167 return ret;
76 168
77 switch (list) { 169 switch (list) {
78 case ACTIVE_LIST: 170 case ACTIVE_LIST:
79 seq_printf(m, "Active:\n"); 171 seq_printf(m, "Active:\n");
80 lock = &dev_priv->mm.active_list_lock; 172 head = &dev_priv->mm.active_list;
81 head = &dev_priv->render_ring.active_list;
82 break; 173 break;
83 case INACTIVE_LIST: 174 case INACTIVE_LIST:
84 seq_printf(m, "Inactive:\n"); 175 seq_printf(m, "Inactive:\n");
85 head = &dev_priv->mm.inactive_list; 176 head = &dev_priv->mm.inactive_list;
86 break; 177 break;
178 case PINNED_LIST:
179 seq_printf(m, "Pinned:\n");
180 head = &dev_priv->mm.pinned_list;
181 break;
87 case FLUSHING_LIST: 182 case FLUSHING_LIST:
88 seq_printf(m, "Flushing:\n"); 183 seq_printf(m, "Flushing:\n");
89 head = &dev_priv->mm.flushing_list; 184 head = &dev_priv->mm.flushing_list;
90 break; 185 break;
186 case DEFERRED_FREE_LIST:
187 seq_printf(m, "Deferred free:\n");
188 head = &dev_priv->mm.deferred_free_list;
189 break;
91 default: 190 default:
92 DRM_INFO("Ooops, unexpected list\n"); 191 mutex_unlock(&dev->struct_mutex);
93 return 0; 192 return -EINVAL;
193 }
194
195 total_obj_size = total_gtt_size = count = 0;
196 list_for_each_entry(obj, head, mm_list) {
197 seq_printf(m, " ");
198 describe_obj(m, obj);
199 seq_printf(m, "\n");
200 total_obj_size += obj->base.size;
201 total_gtt_size += obj->gtt_space->size;
202 count++;
94 } 203 }
204 mutex_unlock(&dev->struct_mutex);
95 205
96 if (lock) 206 seq_printf(m, "Total %d objects, %zu bytes, %zu GTT size\n",
97 spin_lock(lock); 207 count, total_obj_size, total_gtt_size);
98 list_for_each_entry(obj_priv, head, list) 208 return 0;
99 { 209}
100 seq_printf(m, " %p: %s %8zd %08x %08x %d%s%s",
101 &obj_priv->base,
102 get_pin_flag(obj_priv),
103 obj_priv->base.size,
104 obj_priv->base.read_domains,
105 obj_priv->base.write_domain,
106 obj_priv->last_rendering_seqno,
107 obj_priv->dirty ? " dirty" : "",
108 obj_priv->madv == I915_MADV_DONTNEED ? " purgeable" : "");
109
110 if (obj_priv->base.name)
111 seq_printf(m, " (name: %d)", obj_priv->base.name);
112 if (obj_priv->fence_reg != I915_FENCE_REG_NONE)
113 seq_printf(m, " (fence: %d)", obj_priv->fence_reg);
114 if (obj_priv->gtt_space != NULL)
115 seq_printf(m, " (gtt_offset: %08x)", obj_priv->gtt_offset);
116 210
211#define count_objects(list, member) do { \
212 list_for_each_entry(obj, list, member) { \
213 size += obj->gtt_space->size; \
214 ++count; \
215 if (obj->map_and_fenceable) { \
216 mappable_size += obj->gtt_space->size; \
217 ++mappable_count; \
218 } \
219 } \
220} while(0)
221
222static int i915_gem_object_info(struct seq_file *m, void* data)
223{
224 struct drm_info_node *node = (struct drm_info_node *) m->private;
225 struct drm_device *dev = node->minor->dev;
226 struct drm_i915_private *dev_priv = dev->dev_private;
227 u32 count, mappable_count;
228 size_t size, mappable_size;
229 struct drm_i915_gem_object *obj;
230 int ret;
231
232 ret = mutex_lock_interruptible(&dev->struct_mutex);
233 if (ret)
234 return ret;
235
236 seq_printf(m, "%u objects, %zu bytes\n",
237 dev_priv->mm.object_count,
238 dev_priv->mm.object_memory);
239
240 size = count = mappable_size = mappable_count = 0;
241 count_objects(&dev_priv->mm.gtt_list, gtt_list);
242 seq_printf(m, "%u [%u] objects, %zu [%zu] bytes in gtt\n",
243 count, mappable_count, size, mappable_size);
244
245 size = count = mappable_size = mappable_count = 0;
246 count_objects(&dev_priv->mm.active_list, mm_list);
247 count_objects(&dev_priv->mm.flushing_list, mm_list);
248 seq_printf(m, " %u [%u] active objects, %zu [%zu] bytes\n",
249 count, mappable_count, size, mappable_size);
250
251 size = count = mappable_size = mappable_count = 0;
252 count_objects(&dev_priv->mm.pinned_list, mm_list);
253 seq_printf(m, " %u [%u] pinned objects, %zu [%zu] bytes\n",
254 count, mappable_count, size, mappable_size);
255
256 size = count = mappable_size = mappable_count = 0;
257 count_objects(&dev_priv->mm.inactive_list, mm_list);
258 seq_printf(m, " %u [%u] inactive objects, %zu [%zu] bytes\n",
259 count, mappable_count, size, mappable_size);
260
261 size = count = mappable_size = mappable_count = 0;
262 count_objects(&dev_priv->mm.deferred_free_list, mm_list);
263 seq_printf(m, " %u [%u] freed objects, %zu [%zu] bytes\n",
264 count, mappable_count, size, mappable_size);
265
266 size = count = mappable_size = mappable_count = 0;
267 list_for_each_entry(obj, &dev_priv->mm.gtt_list, gtt_list) {
268 if (obj->fault_mappable) {
269 size += obj->gtt_space->size;
270 ++count;
271 }
272 if (obj->pin_mappable) {
273 mappable_size += obj->gtt_space->size;
274 ++mappable_count;
275 }
276 }
277 seq_printf(m, "%u pinned mappable objects, %zu bytes\n",
278 mappable_count, mappable_size);
279 seq_printf(m, "%u fault mappable objects, %zu bytes\n",
280 count, size);
281
282 seq_printf(m, "%zu [%zu] gtt total\n",
283 dev_priv->mm.gtt_total, dev_priv->mm.mappable_gtt_total);
284
285 mutex_unlock(&dev->struct_mutex);
286
287 return 0;
288}
289
290static int i915_gem_gtt_info(struct seq_file *m, void* data)
291{
292 struct drm_info_node *node = (struct drm_info_node *) m->private;
293 struct drm_device *dev = node->minor->dev;
294 struct drm_i915_private *dev_priv = dev->dev_private;
295 struct drm_i915_gem_object *obj;
296 size_t total_obj_size, total_gtt_size;
297 int count, ret;
298
299 ret = mutex_lock_interruptible(&dev->struct_mutex);
300 if (ret)
301 return ret;
302
303 total_obj_size = total_gtt_size = count = 0;
304 list_for_each_entry(obj, &dev_priv->mm.gtt_list, gtt_list) {
305 seq_printf(m, " ");
306 describe_obj(m, obj);
117 seq_printf(m, "\n"); 307 seq_printf(m, "\n");
308 total_obj_size += obj->base.size;
309 total_gtt_size += obj->gtt_space->size;
310 count++;
118 } 311 }
119 312
120 if (lock) 313 mutex_unlock(&dev->struct_mutex);
121 spin_unlock(lock); 314
315 seq_printf(m, "Total %d objects, %zu bytes, %zu GTT size\n",
316 count, total_obj_size, total_gtt_size);
317
122 return 0; 318 return 0;
123} 319}
124 320
321
125static int i915_gem_pageflip_info(struct seq_file *m, void *data) 322static int i915_gem_pageflip_info(struct seq_file *m, void *data)
126{ 323{
127 struct drm_info_node *node = (struct drm_info_node *) m->private; 324 struct drm_info_node *node = (struct drm_info_node *) m->private;
@@ -130,21 +327,21 @@ static int i915_gem_pageflip_info(struct seq_file *m, void *data)
130 struct intel_crtc *crtc; 327 struct intel_crtc *crtc;
131 328
132 list_for_each_entry(crtc, &dev->mode_config.crtc_list, base.head) { 329 list_for_each_entry(crtc, &dev->mode_config.crtc_list, base.head) {
133 const char *pipe = crtc->pipe ? "B" : "A"; 330 const char pipe = pipe_name(crtc->pipe);
134 const char *plane = crtc->plane ? "B" : "A"; 331 const char plane = plane_name(crtc->plane);
135 struct intel_unpin_work *work; 332 struct intel_unpin_work *work;
136 333
137 spin_lock_irqsave(&dev->event_lock, flags); 334 spin_lock_irqsave(&dev->event_lock, flags);
138 work = crtc->unpin_work; 335 work = crtc->unpin_work;
139 if (work == NULL) { 336 if (work == NULL) {
140 seq_printf(m, "No flip due on pipe %s (plane %s)\n", 337 seq_printf(m, "No flip due on pipe %c (plane %c)\n",
141 pipe, plane); 338 pipe, plane);
142 } else { 339 } else {
143 if (!work->pending) { 340 if (!work->pending) {
144 seq_printf(m, "Flip queued on pipe %s (plane %s)\n", 341 seq_printf(m, "Flip queued on pipe %c (plane %c)\n",
145 pipe, plane); 342 pipe, plane);
146 } else { 343 } else {
147 seq_printf(m, "Flip pending (waiting for vsync) on pipe %s (plane %s)\n", 344 seq_printf(m, "Flip pending (waiting for vsync) on pipe %c (plane %c)\n",
148 pipe, plane); 345 pipe, plane);
149 } 346 }
150 if (work->enable_stall_check) 347 if (work->enable_stall_check)
@@ -154,14 +351,14 @@ static int i915_gem_pageflip_info(struct seq_file *m, void *data)
154 seq_printf(m, "%d prepares\n", work->pending); 351 seq_printf(m, "%d prepares\n", work->pending);
155 352
156 if (work->old_fb_obj) { 353 if (work->old_fb_obj) {
157 struct drm_i915_gem_object *obj_priv = to_intel_bo(work->old_fb_obj); 354 struct drm_i915_gem_object *obj = work->old_fb_obj;
158 if(obj_priv) 355 if (obj)
159 seq_printf(m, "Old framebuffer gtt_offset 0x%08x\n", obj_priv->gtt_offset ); 356 seq_printf(m, "Old framebuffer gtt_offset 0x%08x\n", obj->gtt_offset);
160 } 357 }
161 if (work->pending_flip_obj) { 358 if (work->pending_flip_obj) {
162 struct drm_i915_gem_object *obj_priv = to_intel_bo(work->pending_flip_obj); 359 struct drm_i915_gem_object *obj = work->pending_flip_obj;
163 if(obj_priv) 360 if (obj)
164 seq_printf(m, "New framebuffer gtt_offset 0x%08x\n", obj_priv->gtt_offset ); 361 seq_printf(m, "New framebuffer gtt_offset 0x%08x\n", obj->gtt_offset);
165 } 362 }
166 } 363 }
167 spin_unlock_irqrestore(&dev->event_lock, flags); 364 spin_unlock_irqrestore(&dev->event_lock, flags);
@@ -176,32 +373,83 @@ static int i915_gem_request_info(struct seq_file *m, void *data)
176 struct drm_device *dev = node->minor->dev; 373 struct drm_device *dev = node->minor->dev;
177 drm_i915_private_t *dev_priv = dev->dev_private; 374 drm_i915_private_t *dev_priv = dev->dev_private;
178 struct drm_i915_gem_request *gem_request; 375 struct drm_i915_gem_request *gem_request;
376 int ret, count;
377
378 ret = mutex_lock_interruptible(&dev->struct_mutex);
379 if (ret)
380 return ret;
179 381
180 seq_printf(m, "Request:\n"); 382 count = 0;
181 list_for_each_entry(gem_request, &dev_priv->render_ring.request_list, 383 if (!list_empty(&dev_priv->ring[RCS].request_list)) {
182 list) { 384 seq_printf(m, "Render requests:\n");
183 seq_printf(m, " %d @ %d\n", 385 list_for_each_entry(gem_request,
184 gem_request->seqno, 386 &dev_priv->ring[RCS].request_list,
185 (int) (jiffies - gem_request->emitted_jiffies)); 387 list) {
388 seq_printf(m, " %d @ %d\n",
389 gem_request->seqno,
390 (int) (jiffies - gem_request->emitted_jiffies));
391 }
392 count++;
393 }
394 if (!list_empty(&dev_priv->ring[VCS].request_list)) {
395 seq_printf(m, "BSD requests:\n");
396 list_for_each_entry(gem_request,
397 &dev_priv->ring[VCS].request_list,
398 list) {
399 seq_printf(m, " %d @ %d\n",
400 gem_request->seqno,
401 (int) (jiffies - gem_request->emitted_jiffies));
402 }
403 count++;
186 } 404 }
405 if (!list_empty(&dev_priv->ring[BCS].request_list)) {
406 seq_printf(m, "BLT requests:\n");
407 list_for_each_entry(gem_request,
408 &dev_priv->ring[BCS].request_list,
409 list) {
410 seq_printf(m, " %d @ %d\n",
411 gem_request->seqno,
412 (int) (jiffies - gem_request->emitted_jiffies));
413 }
414 count++;
415 }
416 mutex_unlock(&dev->struct_mutex);
417
418 if (count == 0)
419 seq_printf(m, "No requests\n");
420
187 return 0; 421 return 0;
188} 422}
189 423
424static void i915_ring_seqno_info(struct seq_file *m,
425 struct intel_ring_buffer *ring)
426{
427 if (ring->get_seqno) {
428 seq_printf(m, "Current sequence (%s): %d\n",
429 ring->name, ring->get_seqno(ring));
430 seq_printf(m, "Waiter sequence (%s): %d\n",
431 ring->name, ring->waiting_seqno);
432 seq_printf(m, "IRQ sequence (%s): %d\n",
433 ring->name, ring->irq_seqno);
434 }
435}
436
190static int i915_gem_seqno_info(struct seq_file *m, void *data) 437static int i915_gem_seqno_info(struct seq_file *m, void *data)
191{ 438{
192 struct drm_info_node *node = (struct drm_info_node *) m->private; 439 struct drm_info_node *node = (struct drm_info_node *) m->private;
193 struct drm_device *dev = node->minor->dev; 440 struct drm_device *dev = node->minor->dev;
194 drm_i915_private_t *dev_priv = dev->dev_private; 441 drm_i915_private_t *dev_priv = dev->dev_private;
442 int ret, i;
443
444 ret = mutex_lock_interruptible(&dev->struct_mutex);
445 if (ret)
446 return ret;
447
448 for (i = 0; i < I915_NUM_RINGS; i++)
449 i915_ring_seqno_info(m, &dev_priv->ring[i]);
450
451 mutex_unlock(&dev->struct_mutex);
195 452
196 if (dev_priv->render_ring.status_page.page_addr != NULL) {
197 seq_printf(m, "Current sequence: %d\n",
198 i915_get_gem_seqno(dev, &dev_priv->render_ring));
199 } else {
200 seq_printf(m, "Current sequence: hws uninitialized\n");
201 }
202 seq_printf(m, "Waiter sequence: %d\n",
203 dev_priv->mm.waiting_gem_seqno);
204 seq_printf(m, "IRQ sequence: %d\n", dev_priv->mm.irq_gem_seqno);
205 return 0; 453 return 0;
206} 454}
207 455
@@ -211,6 +459,11 @@ static int i915_interrupt_info(struct seq_file *m, void *data)
211 struct drm_info_node *node = (struct drm_info_node *) m->private; 459 struct drm_info_node *node = (struct drm_info_node *) m->private;
212 struct drm_device *dev = node->minor->dev; 460 struct drm_device *dev = node->minor->dev;
213 drm_i915_private_t *dev_priv = dev->dev_private; 461 drm_i915_private_t *dev_priv = dev->dev_private;
462 int ret, i, pipe;
463
464 ret = mutex_lock_interruptible(&dev->struct_mutex);
465 if (ret)
466 return ret;
214 467
215 if (!HAS_PCH_SPLIT(dev)) { 468 if (!HAS_PCH_SPLIT(dev)) {
216 seq_printf(m, "Interrupt enable: %08x\n", 469 seq_printf(m, "Interrupt enable: %08x\n",
@@ -219,10 +472,10 @@ static int i915_interrupt_info(struct seq_file *m, void *data)
219 I915_READ(IIR)); 472 I915_READ(IIR));
220 seq_printf(m, "Interrupt mask: %08x\n", 473 seq_printf(m, "Interrupt mask: %08x\n",
221 I915_READ(IMR)); 474 I915_READ(IMR));
222 seq_printf(m, "Pipe A stat: %08x\n", 475 for_each_pipe(pipe)
223 I915_READ(PIPEASTAT)); 476 seq_printf(m, "Pipe %c stat: %08x\n",
224 seq_printf(m, "Pipe B stat: %08x\n", 477 pipe_name(pipe),
225 I915_READ(PIPEBSTAT)); 478 I915_READ(PIPESTAT(pipe)));
226 } else { 479 } else {
227 seq_printf(m, "North Display Interrupt enable: %08x\n", 480 seq_printf(m, "North Display Interrupt enable: %08x\n",
228 I915_READ(DEIER)); 481 I915_READ(DEIER));
@@ -245,16 +498,16 @@ static int i915_interrupt_info(struct seq_file *m, void *data)
245 } 498 }
246 seq_printf(m, "Interrupts received: %d\n", 499 seq_printf(m, "Interrupts received: %d\n",
247 atomic_read(&dev_priv->irq_received)); 500 atomic_read(&dev_priv->irq_received));
248 if (dev_priv->render_ring.status_page.page_addr != NULL) { 501 for (i = 0; i < I915_NUM_RINGS; i++) {
249 seq_printf(m, "Current sequence: %d\n", 502 if (IS_GEN6(dev)) {
250 i915_get_gem_seqno(dev, &dev_priv->render_ring)); 503 seq_printf(m, "Graphics Interrupt mask (%s): %08x\n",
251 } else { 504 dev_priv->ring[i].name,
252 seq_printf(m, "Current sequence: hws uninitialized\n"); 505 I915_READ_IMR(&dev_priv->ring[i]));
506 }
507 i915_ring_seqno_info(m, &dev_priv->ring[i]);
253 } 508 }
254 seq_printf(m, "Waiter sequence: %d\n", 509 mutex_unlock(&dev->struct_mutex);
255 dev_priv->mm.waiting_gem_seqno); 510
256 seq_printf(m, "IRQ sequence: %d\n",
257 dev_priv->mm.irq_gem_seqno);
258 return 0; 511 return 0;
259} 512}
260 513
@@ -263,33 +516,26 @@ static int i915_gem_fence_regs_info(struct seq_file *m, void *data)
263 struct drm_info_node *node = (struct drm_info_node *) m->private; 516 struct drm_info_node *node = (struct drm_info_node *) m->private;
264 struct drm_device *dev = node->minor->dev; 517 struct drm_device *dev = node->minor->dev;
265 drm_i915_private_t *dev_priv = dev->dev_private; 518 drm_i915_private_t *dev_priv = dev->dev_private;
266 int i; 519 int i, ret;
520
521 ret = mutex_lock_interruptible(&dev->struct_mutex);
522 if (ret)
523 return ret;
267 524
268 seq_printf(m, "Reserved fences = %d\n", dev_priv->fence_reg_start); 525 seq_printf(m, "Reserved fences = %d\n", dev_priv->fence_reg_start);
269 seq_printf(m, "Total fences = %d\n", dev_priv->num_fence_regs); 526 seq_printf(m, "Total fences = %d\n", dev_priv->num_fence_regs);
270 for (i = 0; i < dev_priv->num_fence_regs; i++) { 527 for (i = 0; i < dev_priv->num_fence_regs; i++) {
271 struct drm_gem_object *obj = dev_priv->fence_regs[i].obj; 528 struct drm_i915_gem_object *obj = dev_priv->fence_regs[i].obj;
272 529
273 if (obj == NULL) { 530 seq_printf(m, "Fenced object[%2d] = ", i);
274 seq_printf(m, "Fenced object[%2d] = unused\n", i); 531 if (obj == NULL)
275 } else { 532 seq_printf(m, "unused");
276 struct drm_i915_gem_object *obj_priv; 533 else
277 534 describe_obj(m, obj);
278 obj_priv = to_intel_bo(obj); 535 seq_printf(m, "\n");
279 seq_printf(m, "Fenced object[%2d] = %p: %s "
280 "%08x %08zx %08x %s %08x %08x %d",
281 i, obj, get_pin_flag(obj_priv),
282 obj_priv->gtt_offset,
283 obj->size, obj_priv->stride,
284 get_tiling_flag(obj_priv),
285 obj->read_domains, obj->write_domain,
286 obj_priv->last_rendering_seqno);
287 if (obj->name)
288 seq_printf(m, " (name: %d)", obj->name);
289 seq_printf(m, "\n");
290 }
291 } 536 }
292 537
538 mutex_unlock(&dev->struct_mutex);
293 return 0; 539 return 0;
294} 540}
295 541
@@ -298,10 +544,12 @@ static int i915_hws_info(struct seq_file *m, void *data)
298 struct drm_info_node *node = (struct drm_info_node *) m->private; 544 struct drm_info_node *node = (struct drm_info_node *) m->private;
299 struct drm_device *dev = node->minor->dev; 545 struct drm_device *dev = node->minor->dev;
300 drm_i915_private_t *dev_priv = dev->dev_private; 546 drm_i915_private_t *dev_priv = dev->dev_private;
547 struct intel_ring_buffer *ring;
548 const volatile u32 __iomem *hws;
301 int i; 549 int i;
302 volatile u32 *hws;
303 550
304 hws = (volatile u32 *)dev_priv->render_ring.status_page.page_addr; 551 ring = &dev_priv->ring[(uintptr_t)node->info_ent->data];
552 hws = (volatile u32 __iomem *)ring->status_page.page_addr;
305 if (hws == NULL) 553 if (hws == NULL)
306 return 0; 554 return 0;
307 555
@@ -313,16 +561,19 @@ static int i915_hws_info(struct seq_file *m, void *data)
313 return 0; 561 return 0;
314} 562}
315 563
316static void i915_dump_pages(struct seq_file *m, struct page **pages, int page_count) 564static void i915_dump_object(struct seq_file *m,
565 struct io_mapping *mapping,
566 struct drm_i915_gem_object *obj)
317{ 567{
318 int page, i; 568 int page, page_count, i;
319 uint32_t *mem;
320 569
570 page_count = obj->base.size / PAGE_SIZE;
321 for (page = 0; page < page_count; page++) { 571 for (page = 0; page < page_count; page++) {
322 mem = kmap_atomic(pages[page], KM_USER0); 572 u32 *mem = io_mapping_map_wc(mapping,
573 obj->gtt_offset + page * PAGE_SIZE);
323 for (i = 0; i < PAGE_SIZE; i += 4) 574 for (i = 0; i < PAGE_SIZE; i += 4)
324 seq_printf(m, "%08x : %08x\n", i, mem[i / 4]); 575 seq_printf(m, "%08x : %08x\n", i, mem[i / 4]);
325 kunmap_atomic(mem, KM_USER0); 576 io_mapping_unmap(mem);
326 } 577 }
327} 578}
328 579
@@ -331,32 +582,21 @@ static int i915_batchbuffer_info(struct seq_file *m, void *data)
331 struct drm_info_node *node = (struct drm_info_node *) m->private; 582 struct drm_info_node *node = (struct drm_info_node *) m->private;
332 struct drm_device *dev = node->minor->dev; 583 struct drm_device *dev = node->minor->dev;
333 drm_i915_private_t *dev_priv = dev->dev_private; 584 drm_i915_private_t *dev_priv = dev->dev_private;
334 struct drm_gem_object *obj; 585 struct drm_i915_gem_object *obj;
335 struct drm_i915_gem_object *obj_priv;
336 int ret; 586 int ret;
337 587
338 spin_lock(&dev_priv->mm.active_list_lock); 588 ret = mutex_lock_interruptible(&dev->struct_mutex);
339 589 if (ret)
340 list_for_each_entry(obj_priv, &dev_priv->render_ring.active_list, 590 return ret;
341 list) {
342 obj = &obj_priv->base;
343 if (obj->read_domains & I915_GEM_DOMAIN_COMMAND) {
344 ret = i915_gem_object_get_pages(obj, 0);
345 if (ret) {
346 DRM_ERROR("Failed to get pages: %d\n", ret);
347 spin_unlock(&dev_priv->mm.active_list_lock);
348 return ret;
349 }
350
351 seq_printf(m, "--- gtt_offset = 0x%08x\n", obj_priv->gtt_offset);
352 i915_dump_pages(m, obj_priv->pages, obj->size / PAGE_SIZE);
353 591
354 i915_gem_object_put_pages(obj); 592 list_for_each_entry(obj, &dev_priv->mm.active_list, mm_list) {
593 if (obj->base.read_domains & I915_GEM_DOMAIN_COMMAND) {
594 seq_printf(m, "--- gtt_offset = 0x%08x\n", obj->gtt_offset);
595 i915_dump_object(m, dev_priv->mm.gtt_mapping, obj);
355 } 596 }
356 } 597 }
357 598
358 spin_unlock(&dev_priv->mm.active_list_lock); 599 mutex_unlock(&dev->struct_mutex);
359
360 return 0; 600 return 0;
361} 601}
362 602
@@ -365,20 +605,26 @@ static int i915_ringbuffer_data(struct seq_file *m, void *data)
365 struct drm_info_node *node = (struct drm_info_node *) m->private; 605 struct drm_info_node *node = (struct drm_info_node *) m->private;
366 struct drm_device *dev = node->minor->dev; 606 struct drm_device *dev = node->minor->dev;
367 drm_i915_private_t *dev_priv = dev->dev_private; 607 drm_i915_private_t *dev_priv = dev->dev_private;
368 u8 *virt; 608 struct intel_ring_buffer *ring;
369 uint32_t *ptr, off; 609 int ret;
370 610
371 if (!dev_priv->render_ring.gem_object) { 611 ret = mutex_lock_interruptible(&dev->struct_mutex);
372 seq_printf(m, "No ringbuffer setup\n"); 612 if (ret)
373 return 0; 613 return ret;
374 }
375 614
376 virt = dev_priv->render_ring.virtual_start; 615 ring = &dev_priv->ring[(uintptr_t)node->info_ent->data];
616 if (!ring->obj) {
617 seq_printf(m, "No ringbuffer setup\n");
618 } else {
619 const u8 __iomem *virt = ring->virtual_start;
620 uint32_t off;
377 621
378 for (off = 0; off < dev_priv->render_ring.size; off += 4) { 622 for (off = 0; off < ring->size; off += 4) {
379 ptr = (uint32_t *)(virt + off); 623 uint32_t *ptr = (uint32_t *)(virt + off);
380 seq_printf(m, "%08x : %08x\n", off, *ptr); 624 seq_printf(m, "%08x : %08x\n", off, *ptr);
625 }
381 } 626 }
627 mutex_unlock(&dev->struct_mutex);
382 628
383 return 0; 629 return 0;
384} 630}
@@ -388,19 +634,38 @@ static int i915_ringbuffer_info(struct seq_file *m, void *data)
388 struct drm_info_node *node = (struct drm_info_node *) m->private; 634 struct drm_info_node *node = (struct drm_info_node *) m->private;
389 struct drm_device *dev = node->minor->dev; 635 struct drm_device *dev = node->minor->dev;
390 drm_i915_private_t *dev_priv = dev->dev_private; 636 drm_i915_private_t *dev_priv = dev->dev_private;
391 unsigned int head, tail; 637 struct intel_ring_buffer *ring;
392 638
393 head = I915_READ(PRB0_HEAD) & HEAD_ADDR; 639 ring = &dev_priv->ring[(uintptr_t)node->info_ent->data];
394 tail = I915_READ(PRB0_TAIL) & TAIL_ADDR; 640 if (ring->size == 0)
641 return 0;
395 642
396 seq_printf(m, "RingHead : %08x\n", head); 643 seq_printf(m, "Ring %s:\n", ring->name);
397 seq_printf(m, "RingTail : %08x\n", tail); 644 seq_printf(m, " Head : %08x\n", I915_READ_HEAD(ring) & HEAD_ADDR);
398 seq_printf(m, "RingSize : %08lx\n", dev_priv->render_ring.size); 645 seq_printf(m, " Tail : %08x\n", I915_READ_TAIL(ring) & TAIL_ADDR);
399 seq_printf(m, "Acthd : %08x\n", I915_READ(IS_I965G(dev) ? ACTHD_I965 : ACTHD)); 646 seq_printf(m, " Size : %08x\n", ring->size);
647 seq_printf(m, " Active : %08x\n", intel_ring_get_active_head(ring));
648 seq_printf(m, " NOPID : %08x\n", I915_READ_NOPID(ring));
649 if (IS_GEN6(dev)) {
650 seq_printf(m, " Sync 0 : %08x\n", I915_READ_SYNC_0(ring));
651 seq_printf(m, " Sync 1 : %08x\n", I915_READ_SYNC_1(ring));
652 }
653 seq_printf(m, " Control : %08x\n", I915_READ_CTL(ring));
654 seq_printf(m, " Start : %08x\n", I915_READ_START(ring));
400 655
401 return 0; 656 return 0;
402} 657}
403 658
659static const char *ring_str(int ring)
660{
661 switch (ring) {
662 case RING_RENDER: return " render";
663 case RING_BSD: return " bsd";
664 case RING_BLT: return " blt";
665 default: return "";
666 }
667}
668
404static const char *pin_flag(int pinned) 669static const char *pin_flag(int pinned)
405{ 670{
406 if (pinned > 0) 671 if (pinned > 0)
@@ -431,6 +696,37 @@ static const char *purgeable_flag(int purgeable)
431 return purgeable ? " purgeable" : ""; 696 return purgeable ? " purgeable" : "";
432} 697}
433 698
699static void print_error_buffers(struct seq_file *m,
700 const char *name,
701 struct drm_i915_error_buffer *err,
702 int count)
703{
704 seq_printf(m, "%s [%d]:\n", name, count);
705
706 while (count--) {
707 seq_printf(m, " %08x %8u %04x %04x %08x%s%s%s%s%s%s",
708 err->gtt_offset,
709 err->size,
710 err->read_domains,
711 err->write_domain,
712 err->seqno,
713 pin_flag(err->pinned),
714 tiling_flag(err->tiling),
715 dirty_flag(err->dirty),
716 purgeable_flag(err->purgeable),
717 ring_str(err->ring),
718 cache_level_str(err->cache_level));
719
720 if (err->name)
721 seq_printf(m, " (name: %d)", err->name);
722 if (err->fence_reg != I915_FENCE_REG_NONE)
723 seq_printf(m, " (fence: %d)", err->fence_reg);
724
725 seq_printf(m, "\n");
726 err++;
727 }
728}
729
434static int i915_error_state(struct seq_file *m, void *unused) 730static int i915_error_state(struct seq_file *m, void *unused)
435{ 731{
436 struct drm_info_node *node = (struct drm_info_node *) m->private; 732 struct drm_info_node *node = (struct drm_info_node *) m->private;
@@ -452,47 +748,54 @@ static int i915_error_state(struct seq_file *m, void *unused)
452 error->time.tv_usec); 748 error->time.tv_usec);
453 seq_printf(m, "PCI ID: 0x%04x\n", dev->pci_device); 749 seq_printf(m, "PCI ID: 0x%04x\n", dev->pci_device);
454 seq_printf(m, "EIR: 0x%08x\n", error->eir); 750 seq_printf(m, "EIR: 0x%08x\n", error->eir);
455 seq_printf(m, " PGTBL_ER: 0x%08x\n", error->pgtbl_er); 751 seq_printf(m, "PGTBL_ER: 0x%08x\n", error->pgtbl_er);
456 seq_printf(m, " INSTPM: 0x%08x\n", error->instpm); 752 if (INTEL_INFO(dev)->gen >= 6) {
753 seq_printf(m, "ERROR: 0x%08x\n", error->error);
754 seq_printf(m, "Blitter command stream:\n");
755 seq_printf(m, " ACTHD: 0x%08x\n", error->bcs_acthd);
756 seq_printf(m, " IPEIR: 0x%08x\n", error->bcs_ipeir);
757 seq_printf(m, " IPEHR: 0x%08x\n", error->bcs_ipehr);
758 seq_printf(m, " INSTDONE: 0x%08x\n", error->bcs_instdone);
759 seq_printf(m, " seqno: 0x%08x\n", error->bcs_seqno);
760 seq_printf(m, "Video (BSD) command stream:\n");
761 seq_printf(m, " ACTHD: 0x%08x\n", error->vcs_acthd);
762 seq_printf(m, " IPEIR: 0x%08x\n", error->vcs_ipeir);
763 seq_printf(m, " IPEHR: 0x%08x\n", error->vcs_ipehr);
764 seq_printf(m, " INSTDONE: 0x%08x\n", error->vcs_instdone);
765 seq_printf(m, " seqno: 0x%08x\n", error->vcs_seqno);
766 }
767 seq_printf(m, "Render command stream:\n");
768 seq_printf(m, " ACTHD: 0x%08x\n", error->acthd);
457 seq_printf(m, " IPEIR: 0x%08x\n", error->ipeir); 769 seq_printf(m, " IPEIR: 0x%08x\n", error->ipeir);
458 seq_printf(m, " IPEHR: 0x%08x\n", error->ipehr); 770 seq_printf(m, " IPEHR: 0x%08x\n", error->ipehr);
459 seq_printf(m, " INSTDONE: 0x%08x\n", error->instdone); 771 seq_printf(m, " INSTDONE: 0x%08x\n", error->instdone);
460 seq_printf(m, " ACTHD: 0x%08x\n", error->acthd); 772 if (INTEL_INFO(dev)->gen >= 4) {
461 if (IS_I965G(dev)) {
462 seq_printf(m, " INSTPS: 0x%08x\n", error->instps);
463 seq_printf(m, " INSTDONE1: 0x%08x\n", error->instdone1); 773 seq_printf(m, " INSTDONE1: 0x%08x\n", error->instdone1);
774 seq_printf(m, " INSTPS: 0x%08x\n", error->instps);
464 } 775 }
465 seq_printf(m, "seqno: 0x%08x\n", error->seqno); 776 seq_printf(m, " INSTPM: 0x%08x\n", error->instpm);
466 777 seq_printf(m, " seqno: 0x%08x\n", error->seqno);
467 if (error->active_bo_count) { 778
468 seq_printf(m, "Buffers [%d]:\n", error->active_bo_count); 779 for (i = 0; i < dev_priv->num_fence_regs; i++)
469 780 seq_printf(m, " fence[%d] = %08llx\n", i, error->fence[i]);
470 for (i = 0; i < error->active_bo_count; i++) { 781
471 seq_printf(m, " %08x %8zd %08x %08x %08x%s%s%s%s", 782 if (error->active_bo)
472 error->active_bo[i].gtt_offset, 783 print_error_buffers(m, "Active",
473 error->active_bo[i].size, 784 error->active_bo,
474 error->active_bo[i].read_domains, 785 error->active_bo_count);
475 error->active_bo[i].write_domain, 786
476 error->active_bo[i].seqno, 787 if (error->pinned_bo)
477 pin_flag(error->active_bo[i].pinned), 788 print_error_buffers(m, "Pinned",
478 tiling_flag(error->active_bo[i].tiling), 789 error->pinned_bo,
479 dirty_flag(error->active_bo[i].dirty), 790 error->pinned_bo_count);
480 purgeable_flag(error->active_bo[i].purgeable));
481
482 if (error->active_bo[i].name)
483 seq_printf(m, " (name: %d)", error->active_bo[i].name);
484 if (error->active_bo[i].fence_reg != I915_FENCE_REG_NONE)
485 seq_printf(m, " (fence: %d)", error->active_bo[i].fence_reg);
486
487 seq_printf(m, "\n");
488 }
489 }
490 791
491 for (i = 0; i < ARRAY_SIZE(error->batchbuffer); i++) { 792 for (i = 0; i < ARRAY_SIZE(error->batchbuffer); i++) {
492 if (error->batchbuffer[i]) { 793 if (error->batchbuffer[i]) {
493 struct drm_i915_error_object *obj = error->batchbuffer[i]; 794 struct drm_i915_error_object *obj = error->batchbuffer[i];
494 795
495 seq_printf(m, "--- gtt_offset = 0x%08x\n", obj->gtt_offset); 796 seq_printf(m, "%s --- gtt_offset = 0x%08x\n",
797 dev_priv->ring[i].name,
798 obj->gtt_offset);
496 offset = 0; 799 offset = 0;
497 for (page = 0; page < obj->page_count; page++) { 800 for (page = 0; page < obj->page_count; page++) {
498 for (elt = 0; elt < PAGE_SIZE/4; elt++) { 801 for (elt = 0; elt < PAGE_SIZE/4; elt++) {
@@ -503,15 +806,20 @@ static int i915_error_state(struct seq_file *m, void *unused)
503 } 806 }
504 } 807 }
505 808
506 if (error->ringbuffer) { 809 for (i = 0; i < ARRAY_SIZE(error->ringbuffer); i++) {
507 struct drm_i915_error_object *obj = error->ringbuffer; 810 if (error->ringbuffer[i]) {
508 811 struct drm_i915_error_object *obj = error->ringbuffer[i];
509 seq_printf(m, "--- ringbuffer = 0x%08x\n", obj->gtt_offset); 812 seq_printf(m, "%s --- ringbuffer = 0x%08x\n",
510 offset = 0; 813 dev_priv->ring[i].name,
511 for (page = 0; page < obj->page_count; page++) { 814 obj->gtt_offset);
512 for (elt = 0; elt < PAGE_SIZE/4; elt++) { 815 offset = 0;
513 seq_printf(m, "%08x : %08x\n", offset, obj->pages[page][elt]); 816 for (page = 0; page < obj->page_count; page++) {
514 offset += 4; 817 for (elt = 0; elt < PAGE_SIZE/4; elt++) {
818 seq_printf(m, "%08x : %08x\n",
819 offset,
820 obj->pages[page][elt]);
821 offset += 4;
822 }
515 } 823 }
516 } 824 }
517 } 825 }
@@ -519,6 +827,9 @@ static int i915_error_state(struct seq_file *m, void *unused)
519 if (error->overlay) 827 if (error->overlay)
520 intel_overlay_print_error_state(m, error->overlay); 828 intel_overlay_print_error_state(m, error->overlay);
521 829
830 if (error->display)
831 intel_display_print_error_state(m, dev, error->display);
832
522out: 833out:
523 spin_unlock_irqrestore(&dev_priv->error_lock, flags); 834 spin_unlock_irqrestore(&dev_priv->error_lock, flags);
524 835
@@ -542,15 +853,82 @@ static int i915_cur_delayinfo(struct seq_file *m, void *unused)
542 struct drm_info_node *node = (struct drm_info_node *) m->private; 853 struct drm_info_node *node = (struct drm_info_node *) m->private;
543 struct drm_device *dev = node->minor->dev; 854 struct drm_device *dev = node->minor->dev;
544 drm_i915_private_t *dev_priv = dev->dev_private; 855 drm_i915_private_t *dev_priv = dev->dev_private;
545 u16 rgvswctl = I915_READ16(MEMSWCTL); 856 int ret;
546 u16 rgvstat = I915_READ16(MEMSTAT_ILK);
547 857
548 seq_printf(m, "Requested P-state: %d\n", (rgvswctl >> 8) & 0xf); 858 if (IS_GEN5(dev)) {
549 seq_printf(m, "Requested VID: %d\n", rgvswctl & 0x3f); 859 u16 rgvswctl = I915_READ16(MEMSWCTL);
550 seq_printf(m, "Current VID: %d\n", (rgvstat & MEMSTAT_VID_MASK) >> 860 u16 rgvstat = I915_READ16(MEMSTAT_ILK);
551 MEMSTAT_VID_SHIFT); 861
552 seq_printf(m, "Current P-state: %d\n", 862 seq_printf(m, "Requested P-state: %d\n", (rgvswctl >> 8) & 0xf);
553 (rgvstat & MEMSTAT_PSTATE_MASK) >> MEMSTAT_PSTATE_SHIFT); 863 seq_printf(m, "Requested VID: %d\n", rgvswctl & 0x3f);
864 seq_printf(m, "Current VID: %d\n", (rgvstat & MEMSTAT_VID_MASK) >>
865 MEMSTAT_VID_SHIFT);
866 seq_printf(m, "Current P-state: %d\n",
867 (rgvstat & MEMSTAT_PSTATE_MASK) >> MEMSTAT_PSTATE_SHIFT);
868 } else if (IS_GEN6(dev)) {
869 u32 gt_perf_status = I915_READ(GEN6_GT_PERF_STATUS);
870 u32 rp_state_limits = I915_READ(GEN6_RP_STATE_LIMITS);
871 u32 rp_state_cap = I915_READ(GEN6_RP_STATE_CAP);
872 u32 rpstat;
873 u32 rpupei, rpcurup, rpprevup;
874 u32 rpdownei, rpcurdown, rpprevdown;
875 int max_freq;
876
877 /* RPSTAT1 is in the GT power well */
878 ret = mutex_lock_interruptible(&dev->struct_mutex);
879 if (ret)
880 return ret;
881
882 gen6_gt_force_wake_get(dev_priv);
883
884 rpstat = I915_READ(GEN6_RPSTAT1);
885 rpupei = I915_READ(GEN6_RP_CUR_UP_EI);
886 rpcurup = I915_READ(GEN6_RP_CUR_UP);
887 rpprevup = I915_READ(GEN6_RP_PREV_UP);
888 rpdownei = I915_READ(GEN6_RP_CUR_DOWN_EI);
889 rpcurdown = I915_READ(GEN6_RP_CUR_DOWN);
890 rpprevdown = I915_READ(GEN6_RP_PREV_DOWN);
891
892 gen6_gt_force_wake_put(dev_priv);
893 mutex_unlock(&dev->struct_mutex);
894
895 seq_printf(m, "GT_PERF_STATUS: 0x%08x\n", gt_perf_status);
896 seq_printf(m, "RPSTAT1: 0x%08x\n", rpstat);
897 seq_printf(m, "Render p-state ratio: %d\n",
898 (gt_perf_status & 0xff00) >> 8);
899 seq_printf(m, "Render p-state VID: %d\n",
900 gt_perf_status & 0xff);
901 seq_printf(m, "Render p-state limit: %d\n",
902 rp_state_limits & 0xff);
903 seq_printf(m, "CAGF: %dMHz\n", ((rpstat & GEN6_CAGF_MASK) >>
904 GEN6_CAGF_SHIFT) * 50);
905 seq_printf(m, "RP CUR UP EI: %dus\n", rpupei &
906 GEN6_CURICONT_MASK);
907 seq_printf(m, "RP CUR UP: %dus\n", rpcurup &
908 GEN6_CURBSYTAVG_MASK);
909 seq_printf(m, "RP PREV UP: %dus\n", rpprevup &
910 GEN6_CURBSYTAVG_MASK);
911 seq_printf(m, "RP CUR DOWN EI: %dus\n", rpdownei &
912 GEN6_CURIAVG_MASK);
913 seq_printf(m, "RP CUR DOWN: %dus\n", rpcurdown &
914 GEN6_CURBSYTAVG_MASK);
915 seq_printf(m, "RP PREV DOWN: %dus\n", rpprevdown &
916 GEN6_CURBSYTAVG_MASK);
917
918 max_freq = (rp_state_cap & 0xff0000) >> 16;
919 seq_printf(m, "Lowest (RPN) frequency: %dMHz\n",
920 max_freq * 50);
921
922 max_freq = (rp_state_cap & 0xff00) >> 8;
923 seq_printf(m, "Nominal (RP1) frequency: %dMHz\n",
924 max_freq * 50);
925
926 max_freq = rp_state_cap & 0xff;
927 seq_printf(m, "Max non-overclocked (RP0) frequency: %dMHz\n",
928 max_freq * 50);
929 } else {
930 seq_printf(m, "no P-state info available\n");
931 }
554 932
555 return 0; 933 return 0;
556} 934}
@@ -599,7 +977,7 @@ static int i915_drpc_info(struct seq_file *m, void *unused)
599 struct drm_device *dev = node->minor->dev; 977 struct drm_device *dev = node->minor->dev;
600 drm_i915_private_t *dev_priv = dev->dev_private; 978 drm_i915_private_t *dev_priv = dev->dev_private;
601 u32 rgvmodectl = I915_READ(MEMMODECTL); 979 u32 rgvmodectl = I915_READ(MEMMODECTL);
602 u32 rstdbyctl = I915_READ(MCHBAR_RENDER_STANDBY); 980 u32 rstdbyctl = I915_READ(RSTDBYCTL);
603 u16 crstandvid = I915_READ16(CRSTANDVID); 981 u16 crstandvid = I915_READ16(CRSTANDVID);
604 982
605 seq_printf(m, "HD boost: %s\n", (rgvmodectl & MEMMODE_BOOST_EN) ? 983 seq_printf(m, "HD boost: %s\n", (rgvmodectl & MEMMODE_BOOST_EN) ?
@@ -622,6 +1000,30 @@ static int i915_drpc_info(struct seq_file *m, void *unused)
622 seq_printf(m, "RS2 VID: %d\n", ((crstandvid >> 8) & 0x3f)); 1000 seq_printf(m, "RS2 VID: %d\n", ((crstandvid >> 8) & 0x3f));
623 seq_printf(m, "Render standby enabled: %s\n", 1001 seq_printf(m, "Render standby enabled: %s\n",
624 (rstdbyctl & RCX_SW_EXIT) ? "no" : "yes"); 1002 (rstdbyctl & RCX_SW_EXIT) ? "no" : "yes");
1003 seq_printf(m, "Current RS state: ");
1004 switch (rstdbyctl & RSX_STATUS_MASK) {
1005 case RSX_STATUS_ON:
1006 seq_printf(m, "on\n");
1007 break;
1008 case RSX_STATUS_RC1:
1009 seq_printf(m, "RC1\n");
1010 break;
1011 case RSX_STATUS_RC1E:
1012 seq_printf(m, "RC1E\n");
1013 break;
1014 case RSX_STATUS_RS1:
1015 seq_printf(m, "RS1\n");
1016 break;
1017 case RSX_STATUS_RS2:
1018 seq_printf(m, "RS2 (RC6)\n");
1019 break;
1020 case RSX_STATUS_RS3:
1021 seq_printf(m, "RC3 (RC6+)\n");
1022 break;
1023 default:
1024 seq_printf(m, "unknown\n");
1025 break;
1026 }
625 1027
626 return 0; 1028 return 0;
627} 1029}
@@ -642,6 +1044,9 @@ static int i915_fbc_status(struct seq_file *m, void *unused)
642 } else { 1044 } else {
643 seq_printf(m, "FBC disabled: "); 1045 seq_printf(m, "FBC disabled: ");
644 switch (dev_priv->no_fbc_reason) { 1046 switch (dev_priv->no_fbc_reason) {
1047 case FBC_NO_OUTPUT:
1048 seq_printf(m, "no outputs");
1049 break;
645 case FBC_STOLEN_TOO_SMALL: 1050 case FBC_STOLEN_TOO_SMALL:
646 seq_printf(m, "not enough stolen memory"); 1051 seq_printf(m, "not enough stolen memory");
647 break; 1052 break;
@@ -660,6 +1065,9 @@ static int i915_fbc_status(struct seq_file *m, void *unused)
660 case FBC_MULTIPLE_PIPES: 1065 case FBC_MULTIPLE_PIPES:
661 seq_printf(m, "multiple pipes are enabled"); 1066 seq_printf(m, "multiple pipes are enabled");
662 break; 1067 break;
1068 case FBC_MODULE_PARAM:
1069 seq_printf(m, "disabled per module param (default off)");
1070 break;
663 default: 1071 default:
664 seq_printf(m, "unknown reason"); 1072 seq_printf(m, "unknown reason");
665 } 1073 }
@@ -675,15 +1083,17 @@ static int i915_sr_status(struct seq_file *m, void *unused)
675 drm_i915_private_t *dev_priv = dev->dev_private; 1083 drm_i915_private_t *dev_priv = dev->dev_private;
676 bool sr_enabled = false; 1084 bool sr_enabled = false;
677 1085
678 if (IS_I965GM(dev) || IS_I945G(dev) || IS_I945GM(dev)) 1086 if (HAS_PCH_SPLIT(dev))
1087 sr_enabled = I915_READ(WM1_LP_ILK) & WM1_LP_SR_EN;
1088 else if (IS_CRESTLINE(dev) || IS_I945G(dev) || IS_I945GM(dev))
679 sr_enabled = I915_READ(FW_BLC_SELF) & FW_BLC_SELF_EN; 1089 sr_enabled = I915_READ(FW_BLC_SELF) & FW_BLC_SELF_EN;
680 else if (IS_I915GM(dev)) 1090 else if (IS_I915GM(dev))
681 sr_enabled = I915_READ(INSTPM) & INSTPM_SELF_EN; 1091 sr_enabled = I915_READ(INSTPM) & INSTPM_SELF_EN;
682 else if (IS_PINEVIEW(dev)) 1092 else if (IS_PINEVIEW(dev))
683 sr_enabled = I915_READ(DSPFW3) & PINEVIEW_SELF_REFRESH_EN; 1093 sr_enabled = I915_READ(DSPFW3) & PINEVIEW_SELF_REFRESH_EN;
684 1094
685 seq_printf(m, "self-refresh: %s\n", sr_enabled ? "enabled" : 1095 seq_printf(m, "self-refresh: %s\n",
686 "disabled"); 1096 sr_enabled ? "enabled" : "disabled");
687 1097
688 return 0; 1098 return 0;
689} 1099}
@@ -694,10 +1104,16 @@ static int i915_emon_status(struct seq_file *m, void *unused)
694 struct drm_device *dev = node->minor->dev; 1104 struct drm_device *dev = node->minor->dev;
695 drm_i915_private_t *dev_priv = dev->dev_private; 1105 drm_i915_private_t *dev_priv = dev->dev_private;
696 unsigned long temp, chipset, gfx; 1106 unsigned long temp, chipset, gfx;
1107 int ret;
1108
1109 ret = mutex_lock_interruptible(&dev->struct_mutex);
1110 if (ret)
1111 return ret;
697 1112
698 temp = i915_mch_val(dev_priv); 1113 temp = i915_mch_val(dev_priv);
699 chipset = i915_chipset_val(dev_priv); 1114 chipset = i915_chipset_val(dev_priv);
700 gfx = i915_gfx_val(dev_priv); 1115 gfx = i915_gfx_val(dev_priv);
1116 mutex_unlock(&dev->struct_mutex);
701 1117
702 seq_printf(m, "GMCH temp: %ld\n", temp); 1118 seq_printf(m, "GMCH temp: %ld\n", temp);
703 seq_printf(m, "Chipset power: %ld\n", chipset); 1119 seq_printf(m, "Chipset power: %ld\n", chipset);
@@ -718,6 +1134,108 @@ static int i915_gfxec(struct seq_file *m, void *unused)
718 return 0; 1134 return 0;
719} 1135}
720 1136
1137static int i915_opregion(struct seq_file *m, void *unused)
1138{
1139 struct drm_info_node *node = (struct drm_info_node *) m->private;
1140 struct drm_device *dev = node->minor->dev;
1141 drm_i915_private_t *dev_priv = dev->dev_private;
1142 struct intel_opregion *opregion = &dev_priv->opregion;
1143 int ret;
1144
1145 ret = mutex_lock_interruptible(&dev->struct_mutex);
1146 if (ret)
1147 return ret;
1148
1149 if (opregion->header)
1150 seq_write(m, opregion->header, OPREGION_SIZE);
1151
1152 mutex_unlock(&dev->struct_mutex);
1153
1154 return 0;
1155}
1156
1157static int i915_gem_framebuffer_info(struct seq_file *m, void *data)
1158{
1159 struct drm_info_node *node = (struct drm_info_node *) m->private;
1160 struct drm_device *dev = node->minor->dev;
1161 drm_i915_private_t *dev_priv = dev->dev_private;
1162 struct intel_fbdev *ifbdev;
1163 struct intel_framebuffer *fb;
1164 int ret;
1165
1166 ret = mutex_lock_interruptible(&dev->mode_config.mutex);
1167 if (ret)
1168 return ret;
1169
1170 ifbdev = dev_priv->fbdev;
1171 fb = to_intel_framebuffer(ifbdev->helper.fb);
1172
1173 seq_printf(m, "fbcon size: %d x %d, depth %d, %d bpp, obj ",
1174 fb->base.width,
1175 fb->base.height,
1176 fb->base.depth,
1177 fb->base.bits_per_pixel);
1178 describe_obj(m, fb->obj);
1179 seq_printf(m, "\n");
1180
1181 list_for_each_entry(fb, &dev->mode_config.fb_list, base.head) {
1182 if (&fb->base == ifbdev->helper.fb)
1183 continue;
1184
1185 seq_printf(m, "user size: %d x %d, depth %d, %d bpp, obj ",
1186 fb->base.width,
1187 fb->base.height,
1188 fb->base.depth,
1189 fb->base.bits_per_pixel);
1190 describe_obj(m, fb->obj);
1191 seq_printf(m, "\n");
1192 }
1193
1194 mutex_unlock(&dev->mode_config.mutex);
1195
1196 return 0;
1197}
1198
1199static int i915_context_status(struct seq_file *m, void *unused)
1200{
1201 struct drm_info_node *node = (struct drm_info_node *) m->private;
1202 struct drm_device *dev = node->minor->dev;
1203 drm_i915_private_t *dev_priv = dev->dev_private;
1204 int ret;
1205
1206 ret = mutex_lock_interruptible(&dev->mode_config.mutex);
1207 if (ret)
1208 return ret;
1209
1210 if (dev_priv->pwrctx) {
1211 seq_printf(m, "power context ");
1212 describe_obj(m, dev_priv->pwrctx);
1213 seq_printf(m, "\n");
1214 }
1215
1216 if (dev_priv->renderctx) {
1217 seq_printf(m, "render context ");
1218 describe_obj(m, dev_priv->renderctx);
1219 seq_printf(m, "\n");
1220 }
1221
1222 mutex_unlock(&dev->mode_config.mutex);
1223
1224 return 0;
1225}
1226
1227static int i915_gen6_forcewake_count_info(struct seq_file *m, void *data)
1228{
1229 struct drm_info_node *node = (struct drm_info_node *) m->private;
1230 struct drm_device *dev = node->minor->dev;
1231 struct drm_i915_private *dev_priv = dev->dev_private;
1232
1233 seq_printf(m, "forcewake count = %d\n",
1234 atomic_read(&dev_priv->forcewake_count));
1235
1236 return 0;
1237}
1238
721static int 1239static int
722i915_wedged_open(struct inode *inode, 1240i915_wedged_open(struct inode *inode,
723 struct file *filp) 1241 struct file *filp)
@@ -741,6 +1259,9 @@ i915_wedged_read(struct file *filp,
741 "wedged : %d\n", 1259 "wedged : %d\n",
742 atomic_read(&dev_priv->mm.wedged)); 1260 atomic_read(&dev_priv->mm.wedged));
743 1261
1262 if (len > sizeof (buf))
1263 len = sizeof (buf);
1264
744 return simple_read_from_buffer(ubuf, max, ppos, buf, len); 1265 return simple_read_from_buffer(ubuf, max, ppos, buf, len);
745} 1266}
746 1267
@@ -751,7 +1272,6 @@ i915_wedged_write(struct file *filp,
751 loff_t *ppos) 1272 loff_t *ppos)
752{ 1273{
753 struct drm_device *dev = filp->private_data; 1274 struct drm_device *dev = filp->private_data;
754 drm_i915_private_t *dev_priv = dev->dev_private;
755 char buf[20]; 1275 char buf[20];
756 int val = 1; 1276 int val = 1;
757 1277
@@ -767,12 +1287,7 @@ i915_wedged_write(struct file *filp,
767 } 1287 }
768 1288
769 DRM_INFO("Manually setting wedged to %d\n", val); 1289 DRM_INFO("Manually setting wedged to %d\n", val);
770 1290 i915_handle_error(dev, val);
771 atomic_set(&dev_priv->mm.wedged, val);
772 if (val) {
773 DRM_WAKEUP(&dev_priv->irq_queue);
774 queue_work(dev_priv->wq, &dev_priv->error_work);
775 }
776 1291
777 return cnt; 1292 return cnt;
778} 1293}
@@ -782,6 +1297,7 @@ static const struct file_operations i915_wedged_fops = {
782 .open = i915_wedged_open, 1297 .open = i915_wedged_open,
783 .read = i915_wedged_read, 1298 .read = i915_wedged_read,
784 .write = i915_wedged_write, 1299 .write = i915_wedged_write,
1300 .llseek = default_llseek,
785}; 1301};
786 1302
787/* As the drm_debugfs_init() routines are called before dev->dev_private is 1303/* As the drm_debugfs_init() routines are called before dev->dev_private is
@@ -822,18 +1338,90 @@ static int i915_wedged_create(struct dentry *root, struct drm_minor *minor)
822 return drm_add_fake_info_node(minor, ent, &i915_wedged_fops); 1338 return drm_add_fake_info_node(minor, ent, &i915_wedged_fops);
823} 1339}
824 1340
1341static int i915_forcewake_open(struct inode *inode, struct file *file)
1342{
1343 struct drm_device *dev = inode->i_private;
1344 struct drm_i915_private *dev_priv = dev->dev_private;
1345 int ret;
1346
1347 if (!IS_GEN6(dev))
1348 return 0;
1349
1350 ret = mutex_lock_interruptible(&dev->struct_mutex);
1351 if (ret)
1352 return ret;
1353 gen6_gt_force_wake_get(dev_priv);
1354 mutex_unlock(&dev->struct_mutex);
1355
1356 return 0;
1357}
1358
1359int i915_forcewake_release(struct inode *inode, struct file *file)
1360{
1361 struct drm_device *dev = inode->i_private;
1362 struct drm_i915_private *dev_priv = dev->dev_private;
1363
1364 if (!IS_GEN6(dev))
1365 return 0;
1366
1367 /*
1368 * It's bad that we can potentially hang userspace if struct_mutex gets
1369 * forever stuck. However, if we cannot acquire this lock it means that
1370 * almost certainly the driver has hung, is not unload-able. Therefore
1371 * hanging here is probably a minor inconvenience not to be seen my
1372 * almost every user.
1373 */
1374 mutex_lock(&dev->struct_mutex);
1375 gen6_gt_force_wake_put(dev_priv);
1376 mutex_unlock(&dev->struct_mutex);
1377
1378 return 0;
1379}
1380
1381static const struct file_operations i915_forcewake_fops = {
1382 .owner = THIS_MODULE,
1383 .open = i915_forcewake_open,
1384 .release = i915_forcewake_release,
1385};
1386
1387static int i915_forcewake_create(struct dentry *root, struct drm_minor *minor)
1388{
1389 struct drm_device *dev = minor->dev;
1390 struct dentry *ent;
1391
1392 ent = debugfs_create_file("i915_forcewake_user",
1393 S_IRUSR,
1394 root, dev,
1395 &i915_forcewake_fops);
1396 if (IS_ERR(ent))
1397 return PTR_ERR(ent);
1398
1399 return drm_add_fake_info_node(minor, ent, &i915_forcewake_fops);
1400}
1401
825static struct drm_info_list i915_debugfs_list[] = { 1402static struct drm_info_list i915_debugfs_list[] = {
1403 {"i915_capabilities", i915_capabilities, 0},
1404 {"i915_gem_objects", i915_gem_object_info, 0},
1405 {"i915_gem_gtt", i915_gem_gtt_info, 0},
826 {"i915_gem_active", i915_gem_object_list_info, 0, (void *) ACTIVE_LIST}, 1406 {"i915_gem_active", i915_gem_object_list_info, 0, (void *) ACTIVE_LIST},
827 {"i915_gem_flushing", i915_gem_object_list_info, 0, (void *) FLUSHING_LIST}, 1407 {"i915_gem_flushing", i915_gem_object_list_info, 0, (void *) FLUSHING_LIST},
828 {"i915_gem_inactive", i915_gem_object_list_info, 0, (void *) INACTIVE_LIST}, 1408 {"i915_gem_inactive", i915_gem_object_list_info, 0, (void *) INACTIVE_LIST},
1409 {"i915_gem_pinned", i915_gem_object_list_info, 0, (void *) PINNED_LIST},
1410 {"i915_gem_deferred_free", i915_gem_object_list_info, 0, (void *) DEFERRED_FREE_LIST},
829 {"i915_gem_pageflip", i915_gem_pageflip_info, 0}, 1411 {"i915_gem_pageflip", i915_gem_pageflip_info, 0},
830 {"i915_gem_request", i915_gem_request_info, 0}, 1412 {"i915_gem_request", i915_gem_request_info, 0},
831 {"i915_gem_seqno", i915_gem_seqno_info, 0}, 1413 {"i915_gem_seqno", i915_gem_seqno_info, 0},
832 {"i915_gem_fence_regs", i915_gem_fence_regs_info, 0}, 1414 {"i915_gem_fence_regs", i915_gem_fence_regs_info, 0},
833 {"i915_gem_interrupt", i915_interrupt_info, 0}, 1415 {"i915_gem_interrupt", i915_interrupt_info, 0},
834 {"i915_gem_hws", i915_hws_info, 0}, 1416 {"i915_gem_hws", i915_hws_info, 0, (void *)RCS},
835 {"i915_ringbuffer_data", i915_ringbuffer_data, 0}, 1417 {"i915_gem_hws_blt", i915_hws_info, 0, (void *)BCS},
836 {"i915_ringbuffer_info", i915_ringbuffer_info, 0}, 1418 {"i915_gem_hws_bsd", i915_hws_info, 0, (void *)VCS},
1419 {"i915_ringbuffer_data", i915_ringbuffer_data, 0, (void *)RCS},
1420 {"i915_ringbuffer_info", i915_ringbuffer_info, 0, (void *)RCS},
1421 {"i915_bsd_ringbuffer_data", i915_ringbuffer_data, 0, (void *)VCS},
1422 {"i915_bsd_ringbuffer_info", i915_ringbuffer_info, 0, (void *)VCS},
1423 {"i915_blt_ringbuffer_data", i915_ringbuffer_data, 0, (void *)BCS},
1424 {"i915_blt_ringbuffer_info", i915_ringbuffer_info, 0, (void *)BCS},
837 {"i915_batchbuffers", i915_batchbuffer_info, 0}, 1425 {"i915_batchbuffers", i915_batchbuffer_info, 0},
838 {"i915_error_state", i915_error_state, 0}, 1426 {"i915_error_state", i915_error_state, 0},
839 {"i915_rstdby_delays", i915_rstdby_delays, 0}, 1427 {"i915_rstdby_delays", i915_rstdby_delays, 0},
@@ -845,6 +1433,10 @@ static struct drm_info_list i915_debugfs_list[] = {
845 {"i915_gfxec", i915_gfxec, 0}, 1433 {"i915_gfxec", i915_gfxec, 0},
846 {"i915_fbc_status", i915_fbc_status, 0}, 1434 {"i915_fbc_status", i915_fbc_status, 0},
847 {"i915_sr_status", i915_sr_status, 0}, 1435 {"i915_sr_status", i915_sr_status, 0},
1436 {"i915_opregion", i915_opregion, 0},
1437 {"i915_gem_framebuffer", i915_gem_framebuffer_info, 0},
1438 {"i915_context_status", i915_context_status, 0},
1439 {"i915_gen6_forcewake_count", i915_gen6_forcewake_count_info, 0},
848}; 1440};
849#define I915_DEBUGFS_ENTRIES ARRAY_SIZE(i915_debugfs_list) 1441#define I915_DEBUGFS_ENTRIES ARRAY_SIZE(i915_debugfs_list)
850 1442
@@ -856,6 +1448,10 @@ int i915_debugfs_init(struct drm_minor *minor)
856 if (ret) 1448 if (ret)
857 return ret; 1449 return ret;
858 1450
1451 ret = i915_forcewake_create(minor->debugfs_root, minor);
1452 if (ret)
1453 return ret;
1454
859 return drm_debugfs_create_files(i915_debugfs_list, 1455 return drm_debugfs_create_files(i915_debugfs_list,
860 I915_DEBUGFS_ENTRIES, 1456 I915_DEBUGFS_ENTRIES,
861 minor->debugfs_root, minor); 1457 minor->debugfs_root, minor);
@@ -865,6 +1461,8 @@ void i915_debugfs_cleanup(struct drm_minor *minor)
865{ 1461{
866 drm_debugfs_remove_files(i915_debugfs_list, 1462 drm_debugfs_remove_files(i915_debugfs_list,
867 I915_DEBUGFS_ENTRIES, minor); 1463 I915_DEBUGFS_ENTRIES, minor);
1464 drm_debugfs_remove_files((struct drm_info_list *) &i915_forcewake_fops,
1465 1, minor);
868 drm_debugfs_remove_files((struct drm_info_list *) &i915_wedged_fops, 1466 drm_debugfs_remove_files((struct drm_info_list *) &i915_wedged_fops,
869 1, minor); 1467 1, minor);
870} 1468}
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c
index 2dd2c93ebfa3..296fbd66f0e1 100644
--- a/drivers/gpu/drm/i915/i915_dma.c
+++ b/drivers/gpu/drm/i915/i915_dma.c
@@ -34,14 +34,25 @@
34#include "i915_drm.h" 34#include "i915_drm.h"
35#include "i915_drv.h" 35#include "i915_drv.h"
36#include "i915_trace.h" 36#include "i915_trace.h"
37#include "../../../platform/x86/intel_ips.h"
37#include <linux/pci.h> 38#include <linux/pci.h>
38#include <linux/vgaarb.h> 39#include <linux/vgaarb.h>
39#include <linux/acpi.h> 40#include <linux/acpi.h>
40#include <linux/pnp.h> 41#include <linux/pnp.h>
41#include <linux/vga_switcheroo.h> 42#include <linux/vga_switcheroo.h>
42#include <linux/slab.h> 43#include <linux/slab.h>
44#include <acpi/video.h>
43 45
44extern int intel_max_stolen; /* from AGP driver */ 46static void i915_write_hws_pga(struct drm_device *dev)
47{
48 drm_i915_private_t *dev_priv = dev->dev_private;
49 u32 addr;
50
51 addr = dev_priv->status_page_dmah->busaddr;
52 if (INTEL_INFO(dev)->gen >= 4)
53 addr |= (dev_priv->status_page_dmah->busaddr >> 28) & 0xf0;
54 I915_WRITE(HWS_PGA, addr);
55}
45 56
46/** 57/**
47 * Sets up the hardware status page for devices that need a physical address 58 * Sets up the hardware status page for devices that need a physical address
@@ -50,6 +61,8 @@ extern int intel_max_stolen; /* from AGP driver */
50static int i915_init_phys_hws(struct drm_device *dev) 61static int i915_init_phys_hws(struct drm_device *dev)
51{ 62{
52 drm_i915_private_t *dev_priv = dev->dev_private; 63 drm_i915_private_t *dev_priv = dev->dev_private;
64 struct intel_ring_buffer *ring = LP_RING(dev_priv);
65
53 /* Program Hardware Status Page */ 66 /* Program Hardware Status Page */
54 dev_priv->status_page_dmah = 67 dev_priv->status_page_dmah =
55 drm_pci_alloc(dev, PAGE_SIZE, PAGE_SIZE); 68 drm_pci_alloc(dev, PAGE_SIZE, PAGE_SIZE);
@@ -58,17 +71,13 @@ static int i915_init_phys_hws(struct drm_device *dev)
58 DRM_ERROR("Can not allocate hardware status page\n"); 71 DRM_ERROR("Can not allocate hardware status page\n");
59 return -ENOMEM; 72 return -ENOMEM;
60 } 73 }
61 dev_priv->render_ring.status_page.page_addr 74 ring->status_page.page_addr =
62 = dev_priv->status_page_dmah->vaddr; 75 (void __force __iomem *)dev_priv->status_page_dmah->vaddr;
63 dev_priv->dma_status_page = dev_priv->status_page_dmah->busaddr;
64 76
65 memset(dev_priv->render_ring.status_page.page_addr, 0, PAGE_SIZE); 77 memset_io(ring->status_page.page_addr, 0, PAGE_SIZE);
66 78
67 if (IS_I965G(dev)) 79 i915_write_hws_pga(dev);
68 dev_priv->dma_status_page |= (dev_priv->dma_status_page >> 28) &
69 0xf0;
70 80
71 I915_WRITE(HWS_PGA, dev_priv->dma_status_page);
72 DRM_DEBUG_DRIVER("Enabled hardware status page\n"); 81 DRM_DEBUG_DRIVER("Enabled hardware status page\n");
73 return 0; 82 return 0;
74} 83}
@@ -80,13 +89,15 @@ static int i915_init_phys_hws(struct drm_device *dev)
80static void i915_free_hws(struct drm_device *dev) 89static void i915_free_hws(struct drm_device *dev)
81{ 90{
82 drm_i915_private_t *dev_priv = dev->dev_private; 91 drm_i915_private_t *dev_priv = dev->dev_private;
92 struct intel_ring_buffer *ring = LP_RING(dev_priv);
93
83 if (dev_priv->status_page_dmah) { 94 if (dev_priv->status_page_dmah) {
84 drm_pci_free(dev, dev_priv->status_page_dmah); 95 drm_pci_free(dev, dev_priv->status_page_dmah);
85 dev_priv->status_page_dmah = NULL; 96 dev_priv->status_page_dmah = NULL;
86 } 97 }
87 98
88 if (dev_priv->render_ring.status_page.gfx_addr) { 99 if (ring->status_page.gfx_addr) {
89 dev_priv->render_ring.status_page.gfx_addr = 0; 100 ring->status_page.gfx_addr = 0;
90 drm_core_ioremapfree(&dev_priv->hws_map, dev); 101 drm_core_ioremapfree(&dev_priv->hws_map, dev);
91 } 102 }
92 103
@@ -98,7 +109,7 @@ void i915_kernel_lost_context(struct drm_device * dev)
98{ 109{
99 drm_i915_private_t *dev_priv = dev->dev_private; 110 drm_i915_private_t *dev_priv = dev->dev_private;
100 struct drm_i915_master_private *master_priv; 111 struct drm_i915_master_private *master_priv;
101 struct intel_ring_buffer *ring = &dev_priv->render_ring; 112 struct intel_ring_buffer *ring = LP_RING(dev_priv);
102 113
103 /* 114 /*
104 * We should never lose context on the ring with modesetting 115 * We should never lose context on the ring with modesetting
@@ -107,8 +118,8 @@ void i915_kernel_lost_context(struct drm_device * dev)
107 if (drm_core_check_feature(dev, DRIVER_MODESET)) 118 if (drm_core_check_feature(dev, DRIVER_MODESET))
108 return; 119 return;
109 120
110 ring->head = I915_READ(PRB0_HEAD) & HEAD_ADDR; 121 ring->head = I915_READ_HEAD(ring) & HEAD_ADDR;
111 ring->tail = I915_READ(PRB0_TAIL) & TAIL_ADDR; 122 ring->tail = I915_READ_TAIL(ring) & TAIL_ADDR;
112 ring->space = ring->head - (ring->tail + 8); 123 ring->space = ring->head - (ring->tail + 8);
113 if (ring->space < 0) 124 if (ring->space < 0)
114 ring->space += ring->size; 125 ring->space += ring->size;
@@ -124,6 +135,8 @@ void i915_kernel_lost_context(struct drm_device * dev)
124static int i915_dma_cleanup(struct drm_device * dev) 135static int i915_dma_cleanup(struct drm_device * dev)
125{ 136{
126 drm_i915_private_t *dev_priv = dev->dev_private; 137 drm_i915_private_t *dev_priv = dev->dev_private;
138 int i;
139
127 /* Make sure interrupts are disabled here because the uninstall ioctl 140 /* Make sure interrupts are disabled here because the uninstall ioctl
128 * may not have been called from userspace and after dev_private 141 * may not have been called from userspace and after dev_private
129 * is freed, it's too late. 142 * is freed, it's too late.
@@ -132,9 +145,8 @@ static int i915_dma_cleanup(struct drm_device * dev)
132 drm_irq_uninstall(dev); 145 drm_irq_uninstall(dev);
133 146
134 mutex_lock(&dev->struct_mutex); 147 mutex_lock(&dev->struct_mutex);
135 intel_cleanup_ring_buffer(dev, &dev_priv->render_ring); 148 for (i = 0; i < I915_NUM_RINGS; i++)
136 if (HAS_BSD(dev)) 149 intel_cleanup_ring_buffer(&dev_priv->ring[i]);
137 intel_cleanup_ring_buffer(dev, &dev_priv->bsd_ring);
138 mutex_unlock(&dev->struct_mutex); 150 mutex_unlock(&dev->struct_mutex);
139 151
140 /* Clear the HWS virtual address at teardown */ 152 /* Clear the HWS virtual address at teardown */
@@ -148,6 +160,7 @@ static int i915_initialize(struct drm_device * dev, drm_i915_init_t * init)
148{ 160{
149 drm_i915_private_t *dev_priv = dev->dev_private; 161 drm_i915_private_t *dev_priv = dev->dev_private;
150 struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv; 162 struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv;
163 int ret;
151 164
152 master_priv->sarea = drm_getsarea(dev); 165 master_priv->sarea = drm_getsarea(dev);
153 if (master_priv->sarea) { 166 if (master_priv->sarea) {
@@ -158,33 +171,22 @@ static int i915_initialize(struct drm_device * dev, drm_i915_init_t * init)
158 } 171 }
159 172
160 if (init->ring_size != 0) { 173 if (init->ring_size != 0) {
161 if (dev_priv->render_ring.gem_object != NULL) { 174 if (LP_RING(dev_priv)->obj != NULL) {
162 i915_dma_cleanup(dev); 175 i915_dma_cleanup(dev);
163 DRM_ERROR("Client tried to initialize ringbuffer in " 176 DRM_ERROR("Client tried to initialize ringbuffer in "
164 "GEM mode\n"); 177 "GEM mode\n");
165 return -EINVAL; 178 return -EINVAL;
166 } 179 }
167 180
168 dev_priv->render_ring.size = init->ring_size; 181 ret = intel_render_ring_init_dri(dev,
169 182 init->ring_start,
170 dev_priv->render_ring.map.offset = init->ring_start; 183 init->ring_size);
171 dev_priv->render_ring.map.size = init->ring_size; 184 if (ret) {
172 dev_priv->render_ring.map.type = 0;
173 dev_priv->render_ring.map.flags = 0;
174 dev_priv->render_ring.map.mtrr = 0;
175
176 drm_core_ioremap_wc(&dev_priv->render_ring.map, dev);
177
178 if (dev_priv->render_ring.map.handle == NULL) {
179 i915_dma_cleanup(dev); 185 i915_dma_cleanup(dev);
180 DRM_ERROR("can not ioremap virtual address for" 186 return ret;
181 " ring buffer\n");
182 return -ENOMEM;
183 } 187 }
184 } 188 }
185 189
186 dev_priv->render_ring.virtual_start = dev_priv->render_ring.map.handle;
187
188 dev_priv->cpp = init->cpp; 190 dev_priv->cpp = init->cpp;
189 dev_priv->back_offset = init->back_offset; 191 dev_priv->back_offset = init->back_offset;
190 dev_priv->front_offset = init->front_offset; 192 dev_priv->front_offset = init->front_offset;
@@ -202,12 +204,10 @@ static int i915_initialize(struct drm_device * dev, drm_i915_init_t * init)
202static int i915_dma_resume(struct drm_device * dev) 204static int i915_dma_resume(struct drm_device * dev)
203{ 205{
204 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 206 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
207 struct intel_ring_buffer *ring = LP_RING(dev_priv);
205 208
206 struct intel_ring_buffer *ring;
207 DRM_DEBUG_DRIVER("%s\n", __func__); 209 DRM_DEBUG_DRIVER("%s\n", __func__);
208 210
209 ring = &dev_priv->render_ring;
210
211 if (ring->map.handle == NULL) { 211 if (ring->map.handle == NULL) {
212 DRM_ERROR("can not ioremap virtual address for" 212 DRM_ERROR("can not ioremap virtual address for"
213 " ring buffer\n"); 213 " ring buffer\n");
@@ -222,9 +222,9 @@ static int i915_dma_resume(struct drm_device * dev)
222 DRM_DEBUG_DRIVER("hw status page @ %p\n", 222 DRM_DEBUG_DRIVER("hw status page @ %p\n",
223 ring->status_page.page_addr); 223 ring->status_page.page_addr);
224 if (ring->status_page.gfx_addr != 0) 224 if (ring->status_page.gfx_addr != 0)
225 ring->setup_status_page(dev, ring); 225 intel_ring_setup_status_page(ring);
226 else 226 else
227 I915_WRITE(HWS_PGA, dev_priv->dma_status_page); 227 i915_write_hws_pga(dev);
228 228
229 DRM_DEBUG_DRIVER("Enabled hardware status page\n"); 229 DRM_DEBUG_DRIVER("Enabled hardware status page\n");
230 230
@@ -264,7 +264,7 @@ static int i915_dma_init(struct drm_device *dev, void *data,
264 * instruction detected will be given a size of zero, which is a 264 * instruction detected will be given a size of zero, which is a
265 * signal to abort the rest of the buffer. 265 * signal to abort the rest of the buffer.
266 */ 266 */
267static int do_validate_cmd(int cmd) 267static int validate_cmd(int cmd)
268{ 268{
269 switch (((cmd >> 29) & 0x7)) { 269 switch (((cmd >> 29) & 0x7)) {
270 case 0x0: 270 case 0x0:
@@ -322,40 +322,27 @@ static int do_validate_cmd(int cmd)
322 return 0; 322 return 0;
323} 323}
324 324
325static int validate_cmd(int cmd)
326{
327 int ret = do_validate_cmd(cmd);
328
329/* printk("validate_cmd( %x ): %d\n", cmd, ret); */
330
331 return ret;
332}
333
334static int i915_emit_cmds(struct drm_device * dev, int *buffer, int dwords) 325static int i915_emit_cmds(struct drm_device * dev, int *buffer, int dwords)
335{ 326{
336 drm_i915_private_t *dev_priv = dev->dev_private; 327 drm_i915_private_t *dev_priv = dev->dev_private;
337 int i; 328 int i, ret;
338 329
339 if ((dwords+1) * sizeof(int) >= dev_priv->render_ring.size - 8) 330 if ((dwords+1) * sizeof(int) >= LP_RING(dev_priv)->size - 8)
340 return -EINVAL; 331 return -EINVAL;
341 332
342 BEGIN_LP_RING((dwords+1)&~1);
343
344 for (i = 0; i < dwords;) { 333 for (i = 0; i < dwords;) {
345 int cmd, sz; 334 int sz = validate_cmd(buffer[i]);
346 335 if (sz == 0 || i + sz > dwords)
347 cmd = buffer[i];
348
349 if ((sz = validate_cmd(cmd)) == 0 || i + sz > dwords)
350 return -EINVAL; 336 return -EINVAL;
351 337 i += sz;
352 OUT_RING(cmd);
353
354 while (++i, --sz) {
355 OUT_RING(buffer[i]);
356 }
357 } 338 }
358 339
340 ret = BEGIN_LP_RING((dwords+1)&~1);
341 if (ret)
342 return ret;
343
344 for (i = 0; i < dwords; i++)
345 OUT_RING(buffer[i]);
359 if (dwords & 1) 346 if (dwords & 1)
360 OUT_RING(0); 347 OUT_RING(0);
361 348
@@ -366,34 +353,41 @@ static int i915_emit_cmds(struct drm_device * dev, int *buffer, int dwords)
366 353
367int 354int
368i915_emit_box(struct drm_device *dev, 355i915_emit_box(struct drm_device *dev,
369 struct drm_clip_rect *boxes, 356 struct drm_clip_rect *box,
370 int i, int DR1, int DR4) 357 int DR1, int DR4)
371{ 358{
372 struct drm_clip_rect box = boxes[i]; 359 struct drm_i915_private *dev_priv = dev->dev_private;
360 int ret;
373 361
374 if (box.y2 <= box.y1 || box.x2 <= box.x1 || box.y2 <= 0 || box.x2 <= 0) { 362 if (box->y2 <= box->y1 || box->x2 <= box->x1 ||
363 box->y2 <= 0 || box->x2 <= 0) {
375 DRM_ERROR("Bad box %d,%d..%d,%d\n", 364 DRM_ERROR("Bad box %d,%d..%d,%d\n",
376 box.x1, box.y1, box.x2, box.y2); 365 box->x1, box->y1, box->x2, box->y2);
377 return -EINVAL; 366 return -EINVAL;
378 } 367 }
379 368
380 if (IS_I965G(dev)) { 369 if (INTEL_INFO(dev)->gen >= 4) {
381 BEGIN_LP_RING(4); 370 ret = BEGIN_LP_RING(4);
371 if (ret)
372 return ret;
373
382 OUT_RING(GFX_OP_DRAWRECT_INFO_I965); 374 OUT_RING(GFX_OP_DRAWRECT_INFO_I965);
383 OUT_RING((box.x1 & 0xffff) | (box.y1 << 16)); 375 OUT_RING((box->x1 & 0xffff) | (box->y1 << 16));
384 OUT_RING(((box.x2 - 1) & 0xffff) | ((box.y2 - 1) << 16)); 376 OUT_RING(((box->x2 - 1) & 0xffff) | ((box->y2 - 1) << 16));
385 OUT_RING(DR4); 377 OUT_RING(DR4);
386 ADVANCE_LP_RING();
387 } else { 378 } else {
388 BEGIN_LP_RING(6); 379 ret = BEGIN_LP_RING(6);
380 if (ret)
381 return ret;
382
389 OUT_RING(GFX_OP_DRAWRECT_INFO); 383 OUT_RING(GFX_OP_DRAWRECT_INFO);
390 OUT_RING(DR1); 384 OUT_RING(DR1);
391 OUT_RING((box.x1 & 0xffff) | (box.y1 << 16)); 385 OUT_RING((box->x1 & 0xffff) | (box->y1 << 16));
392 OUT_RING(((box.x2 - 1) & 0xffff) | ((box.y2 - 1) << 16)); 386 OUT_RING(((box->x2 - 1) & 0xffff) | ((box->y2 - 1) << 16));
393 OUT_RING(DR4); 387 OUT_RING(DR4);
394 OUT_RING(0); 388 OUT_RING(0);
395 ADVANCE_LP_RING();
396 } 389 }
390 ADVANCE_LP_RING();
397 391
398 return 0; 392 return 0;
399} 393}
@@ -413,12 +407,13 @@ static void i915_emit_breadcrumb(struct drm_device *dev)
413 if (master_priv->sarea_priv) 407 if (master_priv->sarea_priv)
414 master_priv->sarea_priv->last_enqueue = dev_priv->counter; 408 master_priv->sarea_priv->last_enqueue = dev_priv->counter;
415 409
416 BEGIN_LP_RING(4); 410 if (BEGIN_LP_RING(4) == 0) {
417 OUT_RING(MI_STORE_DWORD_INDEX); 411 OUT_RING(MI_STORE_DWORD_INDEX);
418 OUT_RING(I915_BREADCRUMB_INDEX << MI_STORE_DWORD_INDEX_SHIFT); 412 OUT_RING(I915_BREADCRUMB_INDEX << MI_STORE_DWORD_INDEX_SHIFT);
419 OUT_RING(dev_priv->counter); 413 OUT_RING(dev_priv->counter);
420 OUT_RING(0); 414 OUT_RING(0);
421 ADVANCE_LP_RING(); 415 ADVANCE_LP_RING();
416 }
422} 417}
423 418
424static int i915_dispatch_cmdbuffer(struct drm_device * dev, 419static int i915_dispatch_cmdbuffer(struct drm_device * dev,
@@ -440,7 +435,7 @@ static int i915_dispatch_cmdbuffer(struct drm_device * dev,
440 435
441 for (i = 0; i < count; i++) { 436 for (i = 0; i < count; i++) {
442 if (i < nbox) { 437 if (i < nbox) {
443 ret = i915_emit_box(dev, cliprects, i, 438 ret = i915_emit_box(dev, &cliprects[i],
444 cmd->DR1, cmd->DR4); 439 cmd->DR1, cmd->DR4);
445 if (ret) 440 if (ret)
446 return ret; 441 return ret;
@@ -459,8 +454,9 @@ static int i915_dispatch_batchbuffer(struct drm_device * dev,
459 drm_i915_batchbuffer_t * batch, 454 drm_i915_batchbuffer_t * batch,
460 struct drm_clip_rect *cliprects) 455 struct drm_clip_rect *cliprects)
461{ 456{
457 struct drm_i915_private *dev_priv = dev->dev_private;
462 int nbox = batch->num_cliprects; 458 int nbox = batch->num_cliprects;
463 int i = 0, count; 459 int i, count, ret;
464 460
465 if ((batch->start | batch->used) & 0x7) { 461 if ((batch->start | batch->used) & 0x7) {
466 DRM_ERROR("alignment"); 462 DRM_ERROR("alignment");
@@ -470,44 +466,49 @@ static int i915_dispatch_batchbuffer(struct drm_device * dev,
470 i915_kernel_lost_context(dev); 466 i915_kernel_lost_context(dev);
471 467
472 count = nbox ? nbox : 1; 468 count = nbox ? nbox : 1;
473
474 for (i = 0; i < count; i++) { 469 for (i = 0; i < count; i++) {
475 if (i < nbox) { 470 if (i < nbox) {
476 int ret = i915_emit_box(dev, cliprects, i, 471 ret = i915_emit_box(dev, &cliprects[i],
477 batch->DR1, batch->DR4); 472 batch->DR1, batch->DR4);
478 if (ret) 473 if (ret)
479 return ret; 474 return ret;
480 } 475 }
481 476
482 if (!IS_I830(dev) && !IS_845G(dev)) { 477 if (!IS_I830(dev) && !IS_845G(dev)) {
483 BEGIN_LP_RING(2); 478 ret = BEGIN_LP_RING(2);
484 if (IS_I965G(dev)) { 479 if (ret)
480 return ret;
481
482 if (INTEL_INFO(dev)->gen >= 4) {
485 OUT_RING(MI_BATCH_BUFFER_START | (2 << 6) | MI_BATCH_NON_SECURE_I965); 483 OUT_RING(MI_BATCH_BUFFER_START | (2 << 6) | MI_BATCH_NON_SECURE_I965);
486 OUT_RING(batch->start); 484 OUT_RING(batch->start);
487 } else { 485 } else {
488 OUT_RING(MI_BATCH_BUFFER_START | (2 << 6)); 486 OUT_RING(MI_BATCH_BUFFER_START | (2 << 6));
489 OUT_RING(batch->start | MI_BATCH_NON_SECURE); 487 OUT_RING(batch->start | MI_BATCH_NON_SECURE);
490 } 488 }
491 ADVANCE_LP_RING();
492 } else { 489 } else {
493 BEGIN_LP_RING(4); 490 ret = BEGIN_LP_RING(4);
491 if (ret)
492 return ret;
493
494 OUT_RING(MI_BATCH_BUFFER); 494 OUT_RING(MI_BATCH_BUFFER);
495 OUT_RING(batch->start | MI_BATCH_NON_SECURE); 495 OUT_RING(batch->start | MI_BATCH_NON_SECURE);
496 OUT_RING(batch->start + batch->used - 4); 496 OUT_RING(batch->start + batch->used - 4);
497 OUT_RING(0); 497 OUT_RING(0);
498 ADVANCE_LP_RING();
499 } 498 }
499 ADVANCE_LP_RING();
500 } 500 }
501 501
502 502
503 if (IS_G4X(dev) || IS_IRONLAKE(dev)) { 503 if (IS_G4X(dev) || IS_GEN5(dev)) {
504 BEGIN_LP_RING(2); 504 if (BEGIN_LP_RING(2) == 0) {
505 OUT_RING(MI_FLUSH | MI_NO_WRITE_FLUSH | MI_INVALIDATE_ISP); 505 OUT_RING(MI_FLUSH | MI_NO_WRITE_FLUSH | MI_INVALIDATE_ISP);
506 OUT_RING(MI_NOOP); 506 OUT_RING(MI_NOOP);
507 ADVANCE_LP_RING(); 507 ADVANCE_LP_RING();
508 }
508 } 509 }
509 i915_emit_breadcrumb(dev);
510 510
511 i915_emit_breadcrumb(dev);
511 return 0; 512 return 0;
512} 513}
513 514
@@ -516,6 +517,7 @@ static int i915_dispatch_flip(struct drm_device * dev)
516 drm_i915_private_t *dev_priv = dev->dev_private; 517 drm_i915_private_t *dev_priv = dev->dev_private;
517 struct drm_i915_master_private *master_priv = 518 struct drm_i915_master_private *master_priv =
518 dev->primary->master->driver_priv; 519 dev->primary->master->driver_priv;
520 int ret;
519 521
520 if (!master_priv->sarea_priv) 522 if (!master_priv->sarea_priv)
521 return -EINVAL; 523 return -EINVAL;
@@ -527,12 +529,13 @@ static int i915_dispatch_flip(struct drm_device * dev)
527 529
528 i915_kernel_lost_context(dev); 530 i915_kernel_lost_context(dev);
529 531
530 BEGIN_LP_RING(2); 532 ret = BEGIN_LP_RING(10);
533 if (ret)
534 return ret;
535
531 OUT_RING(MI_FLUSH | MI_READ_FLUSH); 536 OUT_RING(MI_FLUSH | MI_READ_FLUSH);
532 OUT_RING(0); 537 OUT_RING(0);
533 ADVANCE_LP_RING();
534 538
535 BEGIN_LP_RING(6);
536 OUT_RING(CMD_OP_DISPLAYBUFFER_INFO | ASYNC_FLIP); 539 OUT_RING(CMD_OP_DISPLAYBUFFER_INFO | ASYNC_FLIP);
537 OUT_RING(0); 540 OUT_RING(0);
538 if (dev_priv->current_page == 0) { 541 if (dev_priv->current_page == 0) {
@@ -543,33 +546,32 @@ static int i915_dispatch_flip(struct drm_device * dev)
543 dev_priv->current_page = 0; 546 dev_priv->current_page = 0;
544 } 547 }
545 OUT_RING(0); 548 OUT_RING(0);
546 ADVANCE_LP_RING();
547 549
548 BEGIN_LP_RING(2);
549 OUT_RING(MI_WAIT_FOR_EVENT | MI_WAIT_FOR_PLANE_A_FLIP); 550 OUT_RING(MI_WAIT_FOR_EVENT | MI_WAIT_FOR_PLANE_A_FLIP);
550 OUT_RING(0); 551 OUT_RING(0);
552
551 ADVANCE_LP_RING(); 553 ADVANCE_LP_RING();
552 554
553 master_priv->sarea_priv->last_enqueue = dev_priv->counter++; 555 master_priv->sarea_priv->last_enqueue = dev_priv->counter++;
554 556
555 BEGIN_LP_RING(4); 557 if (BEGIN_LP_RING(4) == 0) {
556 OUT_RING(MI_STORE_DWORD_INDEX); 558 OUT_RING(MI_STORE_DWORD_INDEX);
557 OUT_RING(I915_BREADCRUMB_INDEX << MI_STORE_DWORD_INDEX_SHIFT); 559 OUT_RING(I915_BREADCRUMB_INDEX << MI_STORE_DWORD_INDEX_SHIFT);
558 OUT_RING(dev_priv->counter); 560 OUT_RING(dev_priv->counter);
559 OUT_RING(0); 561 OUT_RING(0);
560 ADVANCE_LP_RING(); 562 ADVANCE_LP_RING();
563 }
561 564
562 master_priv->sarea_priv->pf_current_page = dev_priv->current_page; 565 master_priv->sarea_priv->pf_current_page = dev_priv->current_page;
563 return 0; 566 return 0;
564} 567}
565 568
566static int i915_quiescent(struct drm_device * dev) 569static int i915_quiescent(struct drm_device *dev)
567{ 570{
568 drm_i915_private_t *dev_priv = dev->dev_private; 571 struct intel_ring_buffer *ring = LP_RING(dev->dev_private);
569 572
570 i915_kernel_lost_context(dev); 573 i915_kernel_lost_context(dev);
571 return intel_wait_ring_buffer(dev, &dev_priv->render_ring, 574 return intel_wait_ring_idle(ring);
572 dev_priv->render_ring.size - 8);
573} 575}
574 576
575static int i915_flush_ioctl(struct drm_device *dev, void *data, 577static int i915_flush_ioctl(struct drm_device *dev, void *data,
@@ -765,6 +767,21 @@ static int i915_getparam(struct drm_device *dev, void *data,
765 case I915_PARAM_HAS_BSD: 767 case I915_PARAM_HAS_BSD:
766 value = HAS_BSD(dev); 768 value = HAS_BSD(dev);
767 break; 769 break;
770 case I915_PARAM_HAS_BLT:
771 value = HAS_BLT(dev);
772 break;
773 case I915_PARAM_HAS_RELAXED_FENCING:
774 value = 1;
775 break;
776 case I915_PARAM_HAS_COHERENT_RINGS:
777 value = 1;
778 break;
779 case I915_PARAM_HAS_EXEC_CONSTANTS:
780 value = INTEL_INFO(dev)->gen >= 4;
781 break;
782 case I915_PARAM_HAS_RELAXED_DELTA:
783 value = 1;
784 break;
768 default: 785 default:
769 DRM_DEBUG_DRIVER("Unknown parameter %d\n", 786 DRM_DEBUG_DRIVER("Unknown parameter %d\n",
770 param->param); 787 param->param);
@@ -820,7 +837,7 @@ static int i915_set_status_page(struct drm_device *dev, void *data,
820{ 837{
821 drm_i915_private_t *dev_priv = dev->dev_private; 838 drm_i915_private_t *dev_priv = dev->dev_private;
822 drm_i915_hws_addr_t *hws = data; 839 drm_i915_hws_addr_t *hws = data;
823 struct intel_ring_buffer *ring = &dev_priv->render_ring; 840 struct intel_ring_buffer *ring = LP_RING(dev_priv);
824 841
825 if (!I915_NEED_GFX_HWS(dev)) 842 if (!I915_NEED_GFX_HWS(dev))
826 return -EINVAL; 843 return -EINVAL;
@@ -853,8 +870,9 @@ static int i915_set_status_page(struct drm_device *dev, void *data,
853 " G33 hw status page\n"); 870 " G33 hw status page\n");
854 return -ENOMEM; 871 return -ENOMEM;
855 } 872 }
856 ring->status_page.page_addr = dev_priv->hws_map.handle; 873 ring->status_page.page_addr =
857 memset(ring->status_page.page_addr, 0, PAGE_SIZE); 874 (void __force __iomem *)dev_priv->hws_map.handle;
875 memset_io(ring->status_page.page_addr, 0, PAGE_SIZE);
858 I915_WRITE(HWS_PGA, ring->status_page.gfx_addr); 876 I915_WRITE(HWS_PGA, ring->status_page.gfx_addr);
859 877
860 DRM_DEBUG_DRIVER("load hws HWS_PGA with gfx mem 0x%x\n", 878 DRM_DEBUG_DRIVER("load hws HWS_PGA with gfx mem 0x%x\n",
@@ -888,12 +906,12 @@ static int
888intel_alloc_mchbar_resource(struct drm_device *dev) 906intel_alloc_mchbar_resource(struct drm_device *dev)
889{ 907{
890 drm_i915_private_t *dev_priv = dev->dev_private; 908 drm_i915_private_t *dev_priv = dev->dev_private;
891 int reg = IS_I965G(dev) ? MCHBAR_I965 : MCHBAR_I915; 909 int reg = INTEL_INFO(dev)->gen >= 4 ? MCHBAR_I965 : MCHBAR_I915;
892 u32 temp_lo, temp_hi = 0; 910 u32 temp_lo, temp_hi = 0;
893 u64 mchbar_addr; 911 u64 mchbar_addr;
894 int ret; 912 int ret;
895 913
896 if (IS_I965G(dev)) 914 if (INTEL_INFO(dev)->gen >= 4)
897 pci_read_config_dword(dev_priv->bridge_dev, reg + 4, &temp_hi); 915 pci_read_config_dword(dev_priv->bridge_dev, reg + 4, &temp_hi);
898 pci_read_config_dword(dev_priv->bridge_dev, reg, &temp_lo); 916 pci_read_config_dword(dev_priv->bridge_dev, reg, &temp_lo);
899 mchbar_addr = ((u64)temp_hi << 32) | temp_lo; 917 mchbar_addr = ((u64)temp_hi << 32) | temp_lo;
@@ -920,7 +938,7 @@ intel_alloc_mchbar_resource(struct drm_device *dev)
920 return ret; 938 return ret;
921 } 939 }
922 940
923 if (IS_I965G(dev)) 941 if (INTEL_INFO(dev)->gen >= 4)
924 pci_write_config_dword(dev_priv->bridge_dev, reg + 4, 942 pci_write_config_dword(dev_priv->bridge_dev, reg + 4,
925 upper_32_bits(dev_priv->mch_res.start)); 943 upper_32_bits(dev_priv->mch_res.start));
926 944
@@ -934,7 +952,7 @@ static void
934intel_setup_mchbar(struct drm_device *dev) 952intel_setup_mchbar(struct drm_device *dev)
935{ 953{
936 drm_i915_private_t *dev_priv = dev->dev_private; 954 drm_i915_private_t *dev_priv = dev->dev_private;
937 int mchbar_reg = IS_I965G(dev) ? MCHBAR_I965 : MCHBAR_I915; 955 int mchbar_reg = INTEL_INFO(dev)->gen >= 4 ? MCHBAR_I965 : MCHBAR_I915;
938 u32 temp; 956 u32 temp;
939 bool enabled; 957 bool enabled;
940 958
@@ -971,7 +989,7 @@ static void
971intel_teardown_mchbar(struct drm_device *dev) 989intel_teardown_mchbar(struct drm_device *dev)
972{ 990{
973 drm_i915_private_t *dev_priv = dev->dev_private; 991 drm_i915_private_t *dev_priv = dev->dev_private;
974 int mchbar_reg = IS_I965G(dev) ? MCHBAR_I965 : MCHBAR_I915; 992 int mchbar_reg = INTEL_INFO(dev)->gen >= 4 ? MCHBAR_I965 : MCHBAR_I915;
975 u32 temp; 993 u32 temp;
976 994
977 if (dev_priv->mchbar_need_disable) { 995 if (dev_priv->mchbar_need_disable) {
@@ -990,174 +1008,6 @@ intel_teardown_mchbar(struct drm_device *dev)
990 release_resource(&dev_priv->mch_res); 1008 release_resource(&dev_priv->mch_res);
991} 1009}
992 1010
993/**
994 * i915_probe_agp - get AGP bootup configuration
995 * @pdev: PCI device
996 * @aperture_size: returns AGP aperture configured size
997 * @preallocated_size: returns size of BIOS preallocated AGP space
998 *
999 * Since Intel integrated graphics are UMA, the BIOS has to set aside
1000 * some RAM for the framebuffer at early boot. This code figures out
1001 * how much was set aside so we can use it for our own purposes.
1002 */
1003static int i915_probe_agp(struct drm_device *dev, uint32_t *aperture_size,
1004 uint32_t *preallocated_size,
1005 uint32_t *start)
1006{
1007 struct drm_i915_private *dev_priv = dev->dev_private;
1008 u16 tmp = 0;
1009 unsigned long overhead;
1010 unsigned long stolen;
1011
1012 /* Get the fb aperture size and "stolen" memory amount. */
1013 pci_read_config_word(dev_priv->bridge_dev, INTEL_GMCH_CTRL, &tmp);
1014
1015 *aperture_size = 1024 * 1024;
1016 *preallocated_size = 1024 * 1024;
1017
1018 switch (dev->pdev->device) {
1019 case PCI_DEVICE_ID_INTEL_82830_CGC:
1020 case PCI_DEVICE_ID_INTEL_82845G_IG:
1021 case PCI_DEVICE_ID_INTEL_82855GM_IG:
1022 case PCI_DEVICE_ID_INTEL_82865_IG:
1023 if ((tmp & INTEL_GMCH_MEM_MASK) == INTEL_GMCH_MEM_64M)
1024 *aperture_size *= 64;
1025 else
1026 *aperture_size *= 128;
1027 break;
1028 default:
1029 /* 9xx supports large sizes, just look at the length */
1030 *aperture_size = pci_resource_len(dev->pdev, 2);
1031 break;
1032 }
1033
1034 /*
1035 * Some of the preallocated space is taken by the GTT
1036 * and popup. GTT is 1K per MB of aperture size, and popup is 4K.
1037 */
1038 if (IS_G4X(dev) || IS_PINEVIEW(dev) || IS_IRONLAKE(dev) || IS_GEN6(dev))
1039 overhead = 4096;
1040 else
1041 overhead = (*aperture_size / 1024) + 4096;
1042
1043 if (IS_GEN6(dev)) {
1044 /* SNB has memory control reg at 0x50.w */
1045 pci_read_config_word(dev->pdev, SNB_GMCH_CTRL, &tmp);
1046
1047 switch (tmp & SNB_GMCH_GMS_STOLEN_MASK) {
1048 case INTEL_855_GMCH_GMS_DISABLED:
1049 DRM_ERROR("video memory is disabled\n");
1050 return -1;
1051 case SNB_GMCH_GMS_STOLEN_32M:
1052 stolen = 32 * 1024 * 1024;
1053 break;
1054 case SNB_GMCH_GMS_STOLEN_64M:
1055 stolen = 64 * 1024 * 1024;
1056 break;
1057 case SNB_GMCH_GMS_STOLEN_96M:
1058 stolen = 96 * 1024 * 1024;
1059 break;
1060 case SNB_GMCH_GMS_STOLEN_128M:
1061 stolen = 128 * 1024 * 1024;
1062 break;
1063 case SNB_GMCH_GMS_STOLEN_160M:
1064 stolen = 160 * 1024 * 1024;
1065 break;
1066 case SNB_GMCH_GMS_STOLEN_192M:
1067 stolen = 192 * 1024 * 1024;
1068 break;
1069 case SNB_GMCH_GMS_STOLEN_224M:
1070 stolen = 224 * 1024 * 1024;
1071 break;
1072 case SNB_GMCH_GMS_STOLEN_256M:
1073 stolen = 256 * 1024 * 1024;
1074 break;
1075 case SNB_GMCH_GMS_STOLEN_288M:
1076 stolen = 288 * 1024 * 1024;
1077 break;
1078 case SNB_GMCH_GMS_STOLEN_320M:
1079 stolen = 320 * 1024 * 1024;
1080 break;
1081 case SNB_GMCH_GMS_STOLEN_352M:
1082 stolen = 352 * 1024 * 1024;
1083 break;
1084 case SNB_GMCH_GMS_STOLEN_384M:
1085 stolen = 384 * 1024 * 1024;
1086 break;
1087 case SNB_GMCH_GMS_STOLEN_416M:
1088 stolen = 416 * 1024 * 1024;
1089 break;
1090 case SNB_GMCH_GMS_STOLEN_448M:
1091 stolen = 448 * 1024 * 1024;
1092 break;
1093 case SNB_GMCH_GMS_STOLEN_480M:
1094 stolen = 480 * 1024 * 1024;
1095 break;
1096 case SNB_GMCH_GMS_STOLEN_512M:
1097 stolen = 512 * 1024 * 1024;
1098 break;
1099 default:
1100 DRM_ERROR("unexpected GMCH_GMS value: 0x%02x\n",
1101 tmp & SNB_GMCH_GMS_STOLEN_MASK);
1102 return -1;
1103 }
1104 } else {
1105 switch (tmp & INTEL_GMCH_GMS_MASK) {
1106 case INTEL_855_GMCH_GMS_DISABLED:
1107 DRM_ERROR("video memory is disabled\n");
1108 return -1;
1109 case INTEL_855_GMCH_GMS_STOLEN_1M:
1110 stolen = 1 * 1024 * 1024;
1111 break;
1112 case INTEL_855_GMCH_GMS_STOLEN_4M:
1113 stolen = 4 * 1024 * 1024;
1114 break;
1115 case INTEL_855_GMCH_GMS_STOLEN_8M:
1116 stolen = 8 * 1024 * 1024;
1117 break;
1118 case INTEL_855_GMCH_GMS_STOLEN_16M:
1119 stolen = 16 * 1024 * 1024;
1120 break;
1121 case INTEL_855_GMCH_GMS_STOLEN_32M:
1122 stolen = 32 * 1024 * 1024;
1123 break;
1124 case INTEL_915G_GMCH_GMS_STOLEN_48M:
1125 stolen = 48 * 1024 * 1024;
1126 break;
1127 case INTEL_915G_GMCH_GMS_STOLEN_64M:
1128 stolen = 64 * 1024 * 1024;
1129 break;
1130 case INTEL_GMCH_GMS_STOLEN_128M:
1131 stolen = 128 * 1024 * 1024;
1132 break;
1133 case INTEL_GMCH_GMS_STOLEN_256M:
1134 stolen = 256 * 1024 * 1024;
1135 break;
1136 case INTEL_GMCH_GMS_STOLEN_96M:
1137 stolen = 96 * 1024 * 1024;
1138 break;
1139 case INTEL_GMCH_GMS_STOLEN_160M:
1140 stolen = 160 * 1024 * 1024;
1141 break;
1142 case INTEL_GMCH_GMS_STOLEN_224M:
1143 stolen = 224 * 1024 * 1024;
1144 break;
1145 case INTEL_GMCH_GMS_STOLEN_352M:
1146 stolen = 352 * 1024 * 1024;
1147 break;
1148 default:
1149 DRM_ERROR("unexpected GMCH_GMS value: 0x%02x\n",
1150 tmp & INTEL_GMCH_GMS_MASK);
1151 return -1;
1152 }
1153 }
1154
1155 *preallocated_size = stolen - overhead;
1156 *start = overhead;
1157
1158 return 0;
1159}
1160
1161#define PTE_ADDRESS_MASK 0xfffff000 1011#define PTE_ADDRESS_MASK 0xfffff000
1162#define PTE_ADDRESS_MASK_HIGH 0x000000f0 /* i915+ */ 1012#define PTE_ADDRESS_MASK_HIGH 0x000000f0 /* i915+ */
1163#define PTE_MAPPING_TYPE_UNCACHED (0 << 1) 1013#define PTE_MAPPING_TYPE_UNCACHED (0 << 1)
@@ -1167,75 +1017,47 @@ static int i915_probe_agp(struct drm_device *dev, uint32_t *aperture_size,
1167#define PTE_VALID (1 << 0) 1017#define PTE_VALID (1 << 0)
1168 1018
1169/** 1019/**
1170 * i915_gtt_to_phys - take a GTT address and turn it into a physical one 1020 * i915_stolen_to_phys - take an offset into stolen memory and turn it into
1021 * a physical one
1171 * @dev: drm device 1022 * @dev: drm device
1172 * @gtt_addr: address to translate 1023 * @offset: address to translate
1173 * 1024 *
1174 * Some chip functions require allocations from stolen space but need the 1025 * Some chip functions require allocations from stolen space and need the
1175 * physical address of the memory in question. We use this routine 1026 * physical address of the memory in question.
1176 * to get a physical address suitable for register programming from a given
1177 * GTT address.
1178 */ 1027 */
1179static unsigned long i915_gtt_to_phys(struct drm_device *dev, 1028static unsigned long i915_stolen_to_phys(struct drm_device *dev, u32 offset)
1180 unsigned long gtt_addr)
1181{ 1029{
1182 unsigned long *gtt; 1030 struct drm_i915_private *dev_priv = dev->dev_private;
1183 unsigned long entry, phys; 1031 struct pci_dev *pdev = dev_priv->bridge_dev;
1184 int gtt_bar = IS_I9XX(dev) ? 0 : 1; 1032 u32 base;
1185 int gtt_offset, gtt_size; 1033
1186 1034#if 0
1187 if (IS_I965G(dev)) { 1035 /* On the machines I have tested the Graphics Base of Stolen Memory
1188 if (IS_G4X(dev) || IS_IRONLAKE(dev) || IS_GEN6(dev)) { 1036 * is unreliable, so compute the base by subtracting the stolen memory
1189 gtt_offset = 2*1024*1024; 1037 * from the Top of Low Usable DRAM which is where the BIOS places
1190 gtt_size = 2*1024*1024; 1038 * the graphics stolen memory.
1191 } else { 1039 */
1192 gtt_offset = 512*1024; 1040 if (INTEL_INFO(dev)->gen > 3 || IS_G33(dev)) {
1193 gtt_size = 512*1024; 1041 /* top 32bits are reserved = 0 */
1194 } 1042 pci_read_config_dword(pdev, 0xA4, &base);
1195 } else { 1043 } else {
1196 gtt_bar = 3; 1044 /* XXX presume 8xx is the same as i915 */
1197 gtt_offset = 0; 1045 pci_bus_read_config_dword(pdev->bus, 2, 0x5C, &base);
1198 gtt_size = pci_resource_len(dev->pdev, gtt_bar); 1046 }
1199 } 1047#else
1200 1048 if (INTEL_INFO(dev)->gen > 3 || IS_G33(dev)) {
1201 gtt = ioremap_wc(pci_resource_start(dev->pdev, gtt_bar) + gtt_offset, 1049 u16 val;
1202 gtt_size); 1050 pci_read_config_word(pdev, 0xb0, &val);
1203 if (!gtt) { 1051 base = val >> 4 << 20;
1204 DRM_ERROR("ioremap of GTT failed\n"); 1052 } else {
1205 return 0; 1053 u8 val;
1206 } 1054 pci_read_config_byte(pdev, 0x9c, &val);
1207 1055 base = val >> 3 << 27;
1208 entry = *(volatile u32 *)(gtt + (gtt_addr / 1024));
1209
1210 DRM_DEBUG_DRIVER("GTT addr: 0x%08lx, PTE: 0x%08lx\n", gtt_addr, entry);
1211
1212 /* Mask out these reserved bits on this hardware. */
1213 if (!IS_I9XX(dev) || IS_I915G(dev) || IS_I915GM(dev) ||
1214 IS_I945G(dev) || IS_I945GM(dev)) {
1215 entry &= ~PTE_ADDRESS_MASK_HIGH;
1216 }
1217
1218 /* If it's not a mapping type we know, then bail. */
1219 if ((entry & PTE_MAPPING_TYPE_MASK) != PTE_MAPPING_TYPE_UNCACHED &&
1220 (entry & PTE_MAPPING_TYPE_MASK) != PTE_MAPPING_TYPE_CACHED) {
1221 iounmap(gtt);
1222 return 0;
1223 }
1224
1225 if (!(entry & PTE_VALID)) {
1226 DRM_ERROR("bad GTT entry in stolen space\n");
1227 iounmap(gtt);
1228 return 0;
1229 } 1056 }
1057 base -= dev_priv->mm.gtt->stolen_size;
1058#endif
1230 1059
1231 iounmap(gtt); 1060 return base + offset;
1232
1233 phys =(entry & PTE_ADDRESS_MASK) |
1234 ((uint64_t)(entry & PTE_ADDRESS_MASK_HIGH) << (32 - 4));
1235
1236 DRM_DEBUG_DRIVER("GTT addr: 0x%08lx, phys addr: 0x%08lx\n", gtt_addr, phys);
1237
1238 return phys;
1239} 1061}
1240 1062
1241static void i915_warn_stolen(struct drm_device *dev) 1063static void i915_warn_stolen(struct drm_device *dev)
@@ -1251,54 +1073,35 @@ static void i915_setup_compression(struct drm_device *dev, int size)
1251 unsigned long cfb_base; 1073 unsigned long cfb_base;
1252 unsigned long ll_base = 0; 1074 unsigned long ll_base = 0;
1253 1075
1254 /* Leave 1M for line length buffer & misc. */ 1076 compressed_fb = drm_mm_search_free(&dev_priv->mm.stolen, size, 4096, 0);
1255 compressed_fb = drm_mm_search_free(&dev_priv->vram, size, 4096, 0); 1077 if (compressed_fb)
1256 if (!compressed_fb) { 1078 compressed_fb = drm_mm_get_block(compressed_fb, size, 4096);
1257 dev_priv->no_fbc_reason = FBC_STOLEN_TOO_SMALL; 1079 if (!compressed_fb)
1258 i915_warn_stolen(dev); 1080 goto err;
1259 return;
1260 }
1261
1262 compressed_fb = drm_mm_get_block(compressed_fb, size, 4096);
1263 if (!compressed_fb) {
1264 i915_warn_stolen(dev);
1265 dev_priv->no_fbc_reason = FBC_STOLEN_TOO_SMALL;
1266 return;
1267 }
1268
1269 cfb_base = i915_gtt_to_phys(dev, compressed_fb->start);
1270 if (!cfb_base) {
1271 DRM_ERROR("failed to get stolen phys addr, disabling FBC\n");
1272 drm_mm_put_block(compressed_fb);
1273 }
1274 1081
1275 if (!(IS_GM45(dev) || IS_IRONLAKE_M(dev))) { 1082 cfb_base = i915_stolen_to_phys(dev, compressed_fb->start);
1276 compressed_llb = drm_mm_search_free(&dev_priv->vram, 4096, 1083 if (!cfb_base)
1277 4096, 0); 1084 goto err_fb;
1278 if (!compressed_llb) {
1279 i915_warn_stolen(dev);
1280 return;
1281 }
1282 1085
1283 compressed_llb = drm_mm_get_block(compressed_llb, 4096, 4096); 1086 if (!(IS_GM45(dev) || HAS_PCH_SPLIT(dev))) {
1284 if (!compressed_llb) { 1087 compressed_llb = drm_mm_search_free(&dev_priv->mm.stolen,
1285 i915_warn_stolen(dev); 1088 4096, 4096, 0);
1286 return; 1089 if (compressed_llb)
1287 } 1090 compressed_llb = drm_mm_get_block(compressed_llb,
1091 4096, 4096);
1092 if (!compressed_llb)
1093 goto err_fb;
1288 1094
1289 ll_base = i915_gtt_to_phys(dev, compressed_llb->start); 1095 ll_base = i915_stolen_to_phys(dev, compressed_llb->start);
1290 if (!ll_base) { 1096 if (!ll_base)
1291 DRM_ERROR("failed to get stolen phys addr, disabling FBC\n"); 1097 goto err_llb;
1292 drm_mm_put_block(compressed_fb);
1293 drm_mm_put_block(compressed_llb);
1294 }
1295 } 1098 }
1296 1099
1297 dev_priv->cfb_size = size; 1100 dev_priv->cfb_size = size;
1298 1101
1299 intel_disable_fbc(dev); 1102 intel_disable_fbc(dev);
1300 dev_priv->compressed_fb = compressed_fb; 1103 dev_priv->compressed_fb = compressed_fb;
1301 if (IS_IRONLAKE_M(dev)) 1104 if (HAS_PCH_SPLIT(dev))
1302 I915_WRITE(ILK_DPFC_CB_BASE, compressed_fb->start); 1105 I915_WRITE(ILK_DPFC_CB_BASE, compressed_fb->start);
1303 else if (IS_GM45(dev)) { 1106 else if (IS_GM45(dev)) {
1304 I915_WRITE(DPFC_CB_BASE, compressed_fb->start); 1107 I915_WRITE(DPFC_CB_BASE, compressed_fb->start);
@@ -1308,8 +1111,17 @@ static void i915_setup_compression(struct drm_device *dev, int size)
1308 dev_priv->compressed_llb = compressed_llb; 1111 dev_priv->compressed_llb = compressed_llb;
1309 } 1112 }
1310 1113
1311 DRM_DEBUG_KMS("FBC base 0x%08lx, ll base 0x%08lx, size %dM\n", cfb_base, 1114 DRM_DEBUG_KMS("FBC base 0x%08lx, ll base 0x%08lx, size %dM\n",
1312 ll_base, size >> 20); 1115 cfb_base, ll_base, size >> 20);
1116 return;
1117
1118err_llb:
1119 drm_mm_put_block(compressed_llb);
1120err_fb:
1121 drm_mm_put_block(compressed_fb);
1122err:
1123 dev_priv->no_fbc_reason = FBC_STOLEN_TOO_SMALL;
1124 i915_warn_stolen(dev);
1313} 1125}
1314 1126
1315static void i915_cleanup_compression(struct drm_device *dev) 1127static void i915_cleanup_compression(struct drm_device *dev)
@@ -1340,14 +1152,16 @@ static void i915_switcheroo_set_state(struct pci_dev *pdev, enum vga_switcheroo_
1340 pm_message_t pmm = { .event = PM_EVENT_SUSPEND }; 1152 pm_message_t pmm = { .event = PM_EVENT_SUSPEND };
1341 if (state == VGA_SWITCHEROO_ON) { 1153 if (state == VGA_SWITCHEROO_ON) {
1342 printk(KERN_INFO "i915: switched on\n"); 1154 printk(KERN_INFO "i915: switched on\n");
1155 dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;
1343 /* i915 resume handler doesn't set to D0 */ 1156 /* i915 resume handler doesn't set to D0 */
1344 pci_set_power_state(dev->pdev, PCI_D0); 1157 pci_set_power_state(dev->pdev, PCI_D0);
1345 i915_resume(dev); 1158 i915_resume(dev);
1346 drm_kms_helper_poll_enable(dev); 1159 dev->switch_power_state = DRM_SWITCH_POWER_ON;
1347 } else { 1160 } else {
1348 printk(KERN_ERR "i915: switched off\n"); 1161 printk(KERN_ERR "i915: switched off\n");
1349 drm_kms_helper_poll_disable(dev); 1162 dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;
1350 i915_suspend(dev, pmm); 1163 i915_suspend(dev, pmm);
1164 dev->switch_power_state = DRM_SWITCH_POWER_OFF;
1351 } 1165 }
1352} 1166}
1353 1167
@@ -1362,26 +1176,20 @@ static bool i915_switcheroo_can_switch(struct pci_dev *pdev)
1362 return can_switch; 1176 return can_switch;
1363} 1177}
1364 1178
1365static int i915_load_modeset_init(struct drm_device *dev, 1179static int i915_load_gem_init(struct drm_device *dev)
1366 unsigned long prealloc_start,
1367 unsigned long prealloc_size,
1368 unsigned long agp_size)
1369{ 1180{
1370 struct drm_i915_private *dev_priv = dev->dev_private; 1181 struct drm_i915_private *dev_priv = dev->dev_private;
1371 int fb_bar = IS_I9XX(dev) ? 2 : 0; 1182 unsigned long prealloc_size, gtt_size, mappable_size;
1372 int ret = 0; 1183 int ret;
1373
1374 dev->mode_config.fb_base = pci_resource_start(dev->pdev, fb_bar) &
1375 0xff000000;
1376 1184
1377 /* Basic memrange allocator for stolen space (aka vram) */ 1185 prealloc_size = dev_priv->mm.gtt->stolen_size;
1378 drm_mm_init(&dev_priv->vram, 0, prealloc_size); 1186 gtt_size = dev_priv->mm.gtt->gtt_total_entries << PAGE_SHIFT;
1379 DRM_INFO("set up %ldM of stolen space\n", prealloc_size / (1024*1024)); 1187 mappable_size = dev_priv->mm.gtt->gtt_mappable_entries << PAGE_SHIFT;
1380 1188
1381 /* We're off and running w/KMS */ 1189 /* Basic memrange allocator for stolen space */
1382 dev_priv->mm.suspended = 0; 1190 drm_mm_init(&dev_priv->mm.stolen, 0, prealloc_size);
1383 1191
1384 /* Let GEM Manage from end of prealloc space to end of aperture. 1192 /* Let GEM Manage all of the aperture.
1385 * 1193 *
1386 * However, leave one page at the end still bound to the scratch page. 1194 * However, leave one page at the end still bound to the scratch page.
1387 * There are a number of places where the hardware apparently 1195 * There are a number of places where the hardware apparently
@@ -1390,41 +1198,58 @@ static int i915_load_modeset_init(struct drm_device *dev,
1390 * at the last page of the aperture. One page should be enough to 1198 * at the last page of the aperture. One page should be enough to
1391 * keep any prefetching inside of the aperture. 1199 * keep any prefetching inside of the aperture.
1392 */ 1200 */
1393 i915_gem_do_init(dev, prealloc_size, agp_size - 4096); 1201 i915_gem_do_init(dev, 0, mappable_size, gtt_size - PAGE_SIZE);
1394 1202
1395 mutex_lock(&dev->struct_mutex); 1203 mutex_lock(&dev->struct_mutex);
1396 ret = i915_gem_init_ringbuffer(dev); 1204 ret = i915_gem_init_ringbuffer(dev);
1397 mutex_unlock(&dev->struct_mutex); 1205 mutex_unlock(&dev->struct_mutex);
1398 if (ret) 1206 if (ret)
1399 goto out; 1207 return ret;
1400 1208
1401 /* Try to set up FBC with a reasonable compressed buffer size */ 1209 /* Try to set up FBC with a reasonable compressed buffer size */
1402 if (I915_HAS_FBC(dev) && i915_powersave) { 1210 if (I915_HAS_FBC(dev) && i915_powersave) {
1403 int cfb_size; 1211 int cfb_size;
1404 1212
1405 /* Try to get an 8M buffer... */ 1213 /* Leave 1M for line length buffer & misc. */
1406 if (prealloc_size > (9*1024*1024)) 1214
1407 cfb_size = 8*1024*1024; 1215 /* Try to get a 32M buffer... */
1216 if (prealloc_size > (36*1024*1024))
1217 cfb_size = 32*1024*1024;
1408 else /* fall back to 7/8 of the stolen space */ 1218 else /* fall back to 7/8 of the stolen space */
1409 cfb_size = prealloc_size * 7 / 8; 1219 cfb_size = prealloc_size * 7 / 8;
1410 i915_setup_compression(dev, cfb_size); 1220 i915_setup_compression(dev, cfb_size);
1411 } 1221 }
1412 1222
1413 /* Allow hardware batchbuffers unless told otherwise. 1223 /* Allow hardware batchbuffers unless told otherwise. */
1414 */
1415 dev_priv->allow_batchbuffer = 1; 1224 dev_priv->allow_batchbuffer = 1;
1225 return 0;
1226}
1227
1228static int i915_load_modeset_init(struct drm_device *dev)
1229{
1230 struct drm_i915_private *dev_priv = dev->dev_private;
1231 int ret;
1416 1232
1417 ret = intel_init_bios(dev); 1233 ret = intel_parse_bios(dev);
1418 if (ret) 1234 if (ret)
1419 DRM_INFO("failed to find VBIOS tables\n"); 1235 DRM_INFO("failed to find VBIOS tables\n");
1420 1236
1421 /* if we have > 1 VGA cards, then disable the radeon VGA resources */ 1237 /* If we have > 1 VGA cards, then we need to arbitrate access
1238 * to the common VGA resources.
1239 *
1240 * If we are a secondary display controller (!PCI_DISPLAY_CLASS_VGA),
1241 * then we do not take part in VGA arbitration and the
1242 * vga_client_register() fails with -ENODEV.
1243 */
1422 ret = vga_client_register(dev->pdev, dev, NULL, i915_vga_set_decode); 1244 ret = vga_client_register(dev->pdev, dev, NULL, i915_vga_set_decode);
1423 if (ret) 1245 if (ret && ret != -ENODEV)
1424 goto cleanup_ringbuffer; 1246 goto out;
1247
1248 intel_register_dsm_handler();
1425 1249
1426 ret = vga_switcheroo_register_client(dev->pdev, 1250 ret = vga_switcheroo_register_client(dev->pdev,
1427 i915_switcheroo_set_state, 1251 i915_switcheroo_set_state,
1252 NULL,
1428 i915_switcheroo_can_switch); 1253 i915_switcheroo_can_switch);
1429 if (ret) 1254 if (ret)
1430 goto cleanup_vga_client; 1255 goto cleanup_vga_client;
@@ -1435,37 +1260,41 @@ static int i915_load_modeset_init(struct drm_device *dev,
1435 1260
1436 intel_modeset_init(dev); 1261 intel_modeset_init(dev);
1437 1262
1438 ret = drm_irq_install(dev); 1263 ret = i915_load_gem_init(dev);
1439 if (ret) 1264 if (ret)
1440 goto cleanup_vga_switcheroo; 1265 goto cleanup_vga_switcheroo;
1441 1266
1267 intel_modeset_gem_init(dev);
1268
1269 ret = drm_irq_install(dev);
1270 if (ret)
1271 goto cleanup_gem;
1272
1442 /* Always safe in the mode setting case. */ 1273 /* Always safe in the mode setting case. */
1443 /* FIXME: do pre/post-mode set stuff in core KMS code */ 1274 /* FIXME: do pre/post-mode set stuff in core KMS code */
1444 dev->vblank_disable_allowed = 1; 1275 dev->vblank_disable_allowed = 1;
1445 1276
1446 /*
1447 * Initialize the hardware status page IRQ location.
1448 */
1449
1450 I915_WRITE(INSTPM, (1 << 5) | (1 << 21));
1451
1452 ret = intel_fbdev_init(dev); 1277 ret = intel_fbdev_init(dev);
1453 if (ret) 1278 if (ret)
1454 goto cleanup_irq; 1279 goto cleanup_irq;
1455 1280
1456 drm_kms_helper_poll_init(dev); 1281 drm_kms_helper_poll_init(dev);
1282
1283 /* We're off and running w/KMS */
1284 dev_priv->mm.suspended = 0;
1285
1457 return 0; 1286 return 0;
1458 1287
1459cleanup_irq: 1288cleanup_irq:
1460 drm_irq_uninstall(dev); 1289 drm_irq_uninstall(dev);
1290cleanup_gem:
1291 mutex_lock(&dev->struct_mutex);
1292 i915_gem_cleanup_ringbuffer(dev);
1293 mutex_unlock(&dev->struct_mutex);
1461cleanup_vga_switcheroo: 1294cleanup_vga_switcheroo:
1462 vga_switcheroo_unregister_client(dev->pdev); 1295 vga_switcheroo_unregister_client(dev->pdev);
1463cleanup_vga_client: 1296cleanup_vga_client:
1464 vga_client_register(dev->pdev, NULL, NULL, NULL); 1297 vga_client_register(dev->pdev, NULL, NULL, NULL);
1465cleanup_ringbuffer:
1466 mutex_lock(&dev->struct_mutex);
1467 i915_gem_cleanup_ringbuffer(dev);
1468 mutex_unlock(&dev->struct_mutex);
1469out: 1298out:
1470 return ret; 1299 return ret;
1471} 1300}
@@ -1601,152 +1430,12 @@ static void i915_ironlake_get_mem_freq(struct drm_device *dev)
1601 } 1430 }
1602} 1431}
1603 1432
1604struct v_table { 1433static const struct cparams {
1605 u8 vid; 1434 u16 i;
1606 unsigned long vd; /* in .1 mil */ 1435 u16 t;
1607 unsigned long vm; /* in .1 mil */ 1436 u16 m;
1608 u8 pvid; 1437 u16 c;
1609}; 1438} cparams[] = {
1610
1611static struct v_table v_table[] = {
1612 { 0, 16125, 15000, 0x7f, },
1613 { 1, 16000, 14875, 0x7e, },
1614 { 2, 15875, 14750, 0x7d, },
1615 { 3, 15750, 14625, 0x7c, },
1616 { 4, 15625, 14500, 0x7b, },
1617 { 5, 15500, 14375, 0x7a, },
1618 { 6, 15375, 14250, 0x79, },
1619 { 7, 15250, 14125, 0x78, },
1620 { 8, 15125, 14000, 0x77, },
1621 { 9, 15000, 13875, 0x76, },
1622 { 10, 14875, 13750, 0x75, },
1623 { 11, 14750, 13625, 0x74, },
1624 { 12, 14625, 13500, 0x73, },
1625 { 13, 14500, 13375, 0x72, },
1626 { 14, 14375, 13250, 0x71, },
1627 { 15, 14250, 13125, 0x70, },
1628 { 16, 14125, 13000, 0x6f, },
1629 { 17, 14000, 12875, 0x6e, },
1630 { 18, 13875, 12750, 0x6d, },
1631 { 19, 13750, 12625, 0x6c, },
1632 { 20, 13625, 12500, 0x6b, },
1633 { 21, 13500, 12375, 0x6a, },
1634 { 22, 13375, 12250, 0x69, },
1635 { 23, 13250, 12125, 0x68, },
1636 { 24, 13125, 12000, 0x67, },
1637 { 25, 13000, 11875, 0x66, },
1638 { 26, 12875, 11750, 0x65, },
1639 { 27, 12750, 11625, 0x64, },
1640 { 28, 12625, 11500, 0x63, },
1641 { 29, 12500, 11375, 0x62, },
1642 { 30, 12375, 11250, 0x61, },
1643 { 31, 12250, 11125, 0x60, },
1644 { 32, 12125, 11000, 0x5f, },
1645 { 33, 12000, 10875, 0x5e, },
1646 { 34, 11875, 10750, 0x5d, },
1647 { 35, 11750, 10625, 0x5c, },
1648 { 36, 11625, 10500, 0x5b, },
1649 { 37, 11500, 10375, 0x5a, },
1650 { 38, 11375, 10250, 0x59, },
1651 { 39, 11250, 10125, 0x58, },
1652 { 40, 11125, 10000, 0x57, },
1653 { 41, 11000, 9875, 0x56, },
1654 { 42, 10875, 9750, 0x55, },
1655 { 43, 10750, 9625, 0x54, },
1656 { 44, 10625, 9500, 0x53, },
1657 { 45, 10500, 9375, 0x52, },
1658 { 46, 10375, 9250, 0x51, },
1659 { 47, 10250, 9125, 0x50, },
1660 { 48, 10125, 9000, 0x4f, },
1661 { 49, 10000, 8875, 0x4e, },
1662 { 50, 9875, 8750, 0x4d, },
1663 { 51, 9750, 8625, 0x4c, },
1664 { 52, 9625, 8500, 0x4b, },
1665 { 53, 9500, 8375, 0x4a, },
1666 { 54, 9375, 8250, 0x49, },
1667 { 55, 9250, 8125, 0x48, },
1668 { 56, 9125, 8000, 0x47, },
1669 { 57, 9000, 7875, 0x46, },
1670 { 58, 8875, 7750, 0x45, },
1671 { 59, 8750, 7625, 0x44, },
1672 { 60, 8625, 7500, 0x43, },
1673 { 61, 8500, 7375, 0x42, },
1674 { 62, 8375, 7250, 0x41, },
1675 { 63, 8250, 7125, 0x40, },
1676 { 64, 8125, 7000, 0x3f, },
1677 { 65, 8000, 6875, 0x3e, },
1678 { 66, 7875, 6750, 0x3d, },
1679 { 67, 7750, 6625, 0x3c, },
1680 { 68, 7625, 6500, 0x3b, },
1681 { 69, 7500, 6375, 0x3a, },
1682 { 70, 7375, 6250, 0x39, },
1683 { 71, 7250, 6125, 0x38, },
1684 { 72, 7125, 6000, 0x37, },
1685 { 73, 7000, 5875, 0x36, },
1686 { 74, 6875, 5750, 0x35, },
1687 { 75, 6750, 5625, 0x34, },
1688 { 76, 6625, 5500, 0x33, },
1689 { 77, 6500, 5375, 0x32, },
1690 { 78, 6375, 5250, 0x31, },
1691 { 79, 6250, 5125, 0x30, },
1692 { 80, 6125, 5000, 0x2f, },
1693 { 81, 6000, 4875, 0x2e, },
1694 { 82, 5875, 4750, 0x2d, },
1695 { 83, 5750, 4625, 0x2c, },
1696 { 84, 5625, 4500, 0x2b, },
1697 { 85, 5500, 4375, 0x2a, },
1698 { 86, 5375, 4250, 0x29, },
1699 { 87, 5250, 4125, 0x28, },
1700 { 88, 5125, 4000, 0x27, },
1701 { 89, 5000, 3875, 0x26, },
1702 { 90, 4875, 3750, 0x25, },
1703 { 91, 4750, 3625, 0x24, },
1704 { 92, 4625, 3500, 0x23, },
1705 { 93, 4500, 3375, 0x22, },
1706 { 94, 4375, 3250, 0x21, },
1707 { 95, 4250, 3125, 0x20, },
1708 { 96, 4125, 3000, 0x1f, },
1709 { 97, 4125, 3000, 0x1e, },
1710 { 98, 4125, 3000, 0x1d, },
1711 { 99, 4125, 3000, 0x1c, },
1712 { 100, 4125, 3000, 0x1b, },
1713 { 101, 4125, 3000, 0x1a, },
1714 { 102, 4125, 3000, 0x19, },
1715 { 103, 4125, 3000, 0x18, },
1716 { 104, 4125, 3000, 0x17, },
1717 { 105, 4125, 3000, 0x16, },
1718 { 106, 4125, 3000, 0x15, },
1719 { 107, 4125, 3000, 0x14, },
1720 { 108, 4125, 3000, 0x13, },
1721 { 109, 4125, 3000, 0x12, },
1722 { 110, 4125, 3000, 0x11, },
1723 { 111, 4125, 3000, 0x10, },
1724 { 112, 4125, 3000, 0x0f, },
1725 { 113, 4125, 3000, 0x0e, },
1726 { 114, 4125, 3000, 0x0d, },
1727 { 115, 4125, 3000, 0x0c, },
1728 { 116, 4125, 3000, 0x0b, },
1729 { 117, 4125, 3000, 0x0a, },
1730 { 118, 4125, 3000, 0x09, },
1731 { 119, 4125, 3000, 0x08, },
1732 { 120, 1125, 0, 0x07, },
1733 { 121, 1000, 0, 0x06, },
1734 { 122, 875, 0, 0x05, },
1735 { 123, 750, 0, 0x04, },
1736 { 124, 625, 0, 0x03, },
1737 { 125, 500, 0, 0x02, },
1738 { 126, 375, 0, 0x01, },
1739 { 127, 0, 0, 0x00, },
1740};
1741
1742struct cparams {
1743 int i;
1744 int t;
1745 int m;
1746 int c;
1747};
1748
1749static struct cparams cparams[] = {
1750 { 1, 1333, 301, 28664 }, 1439 { 1, 1333, 301, 28664 },
1751 { 1, 1066, 294, 24460 }, 1440 { 1, 1066, 294, 24460 },
1752 { 1, 800, 294, 25192 }, 1441 { 1, 800, 294, 25192 },
@@ -1812,21 +1501,145 @@ unsigned long i915_mch_val(struct drm_i915_private *dev_priv)
1812 return ((m * x) / 127) - b; 1501 return ((m * x) / 127) - b;
1813} 1502}
1814 1503
1815static unsigned long pvid_to_extvid(struct drm_i915_private *dev_priv, u8 pxvid) 1504static u16 pvid_to_extvid(struct drm_i915_private *dev_priv, u8 pxvid)
1816{ 1505{
1817 unsigned long val = 0; 1506 static const struct v_table {
1818 int i; 1507 u16 vd; /* in .1 mil */
1819 1508 u16 vm; /* in .1 mil */
1820 for (i = 0; i < ARRAY_SIZE(v_table); i++) { 1509 } v_table[] = {
1821 if (v_table[i].pvid == pxvid) { 1510 { 0, 0, },
1822 if (IS_MOBILE(dev_priv->dev)) 1511 { 375, 0, },
1823 val = v_table[i].vm; 1512 { 500, 0, },
1824 else 1513 { 625, 0, },
1825 val = v_table[i].vd; 1514 { 750, 0, },
1826 } 1515 { 875, 0, },
1827 } 1516 { 1000, 0, },
1828 1517 { 1125, 0, },
1829 return val; 1518 { 4125, 3000, },
1519 { 4125, 3000, },
1520 { 4125, 3000, },
1521 { 4125, 3000, },
1522 { 4125, 3000, },
1523 { 4125, 3000, },
1524 { 4125, 3000, },
1525 { 4125, 3000, },
1526 { 4125, 3000, },
1527 { 4125, 3000, },
1528 { 4125, 3000, },
1529 { 4125, 3000, },
1530 { 4125, 3000, },
1531 { 4125, 3000, },
1532 { 4125, 3000, },
1533 { 4125, 3000, },
1534 { 4125, 3000, },
1535 { 4125, 3000, },
1536 { 4125, 3000, },
1537 { 4125, 3000, },
1538 { 4125, 3000, },
1539 { 4125, 3000, },
1540 { 4125, 3000, },
1541 { 4125, 3000, },
1542 { 4250, 3125, },
1543 { 4375, 3250, },
1544 { 4500, 3375, },
1545 { 4625, 3500, },
1546 { 4750, 3625, },
1547 { 4875, 3750, },
1548 { 5000, 3875, },
1549 { 5125, 4000, },
1550 { 5250, 4125, },
1551 { 5375, 4250, },
1552 { 5500, 4375, },
1553 { 5625, 4500, },
1554 { 5750, 4625, },
1555 { 5875, 4750, },
1556 { 6000, 4875, },
1557 { 6125, 5000, },
1558 { 6250, 5125, },
1559 { 6375, 5250, },
1560 { 6500, 5375, },
1561 { 6625, 5500, },
1562 { 6750, 5625, },
1563 { 6875, 5750, },
1564 { 7000, 5875, },
1565 { 7125, 6000, },
1566 { 7250, 6125, },
1567 { 7375, 6250, },
1568 { 7500, 6375, },
1569 { 7625, 6500, },
1570 { 7750, 6625, },
1571 { 7875, 6750, },
1572 { 8000, 6875, },
1573 { 8125, 7000, },
1574 { 8250, 7125, },
1575 { 8375, 7250, },
1576 { 8500, 7375, },
1577 { 8625, 7500, },
1578 { 8750, 7625, },
1579 { 8875, 7750, },
1580 { 9000, 7875, },
1581 { 9125, 8000, },
1582 { 9250, 8125, },
1583 { 9375, 8250, },
1584 { 9500, 8375, },
1585 { 9625, 8500, },
1586 { 9750, 8625, },
1587 { 9875, 8750, },
1588 { 10000, 8875, },
1589 { 10125, 9000, },
1590 { 10250, 9125, },
1591 { 10375, 9250, },
1592 { 10500, 9375, },
1593 { 10625, 9500, },
1594 { 10750, 9625, },
1595 { 10875, 9750, },
1596 { 11000, 9875, },
1597 { 11125, 10000, },
1598 { 11250, 10125, },
1599 { 11375, 10250, },
1600 { 11500, 10375, },
1601 { 11625, 10500, },
1602 { 11750, 10625, },
1603 { 11875, 10750, },
1604 { 12000, 10875, },
1605 { 12125, 11000, },
1606 { 12250, 11125, },
1607 { 12375, 11250, },
1608 { 12500, 11375, },
1609 { 12625, 11500, },
1610 { 12750, 11625, },
1611 { 12875, 11750, },
1612 { 13000, 11875, },
1613 { 13125, 12000, },
1614 { 13250, 12125, },
1615 { 13375, 12250, },
1616 { 13500, 12375, },
1617 { 13625, 12500, },
1618 { 13750, 12625, },
1619 { 13875, 12750, },
1620 { 14000, 12875, },
1621 { 14125, 13000, },
1622 { 14250, 13125, },
1623 { 14375, 13250, },
1624 { 14500, 13375, },
1625 { 14625, 13500, },
1626 { 14750, 13625, },
1627 { 14875, 13750, },
1628 { 15000, 13875, },
1629 { 15125, 14000, },
1630 { 15250, 14125, },
1631 { 15375, 14250, },
1632 { 15500, 14375, },
1633 { 15625, 14500, },
1634 { 15750, 14625, },
1635 { 15875, 14750, },
1636 { 16000, 14875, },
1637 { 16125, 15000, },
1638 };
1639 if (dev_priv->info->is_mobile)
1640 return v_table[pxvid].vm;
1641 else
1642 return v_table[pxvid].vd;
1830} 1643}
1831 1644
1832void i915_update_gfx_val(struct drm_i915_private *dev_priv) 1645void i915_update_gfx_val(struct drm_i915_private *dev_priv)
@@ -1907,7 +1720,7 @@ static struct drm_i915_private *i915_mch_dev;
1907 * - dev_priv->fmax 1720 * - dev_priv->fmax
1908 * - dev_priv->gpu_busy 1721 * - dev_priv->gpu_busy
1909 */ 1722 */
1910DEFINE_SPINLOCK(mchdev_lock); 1723static DEFINE_SPINLOCK(mchdev_lock);
1911 1724
1912/** 1725/**
1913 * i915_read_mch_val - return value for IPS use 1726 * i915_read_mch_val - return value for IPS use
@@ -2047,6 +1860,26 @@ out_unlock:
2047EXPORT_SYMBOL_GPL(i915_gpu_turbo_disable); 1860EXPORT_SYMBOL_GPL(i915_gpu_turbo_disable);
2048 1861
2049/** 1862/**
1863 * Tells the intel_ips driver that the i915 driver is now loaded, if
1864 * IPS got loaded first.
1865 *
1866 * This awkward dance is so that neither module has to depend on the
1867 * other in order for IPS to do the appropriate communication of
1868 * GPU turbo limits to i915.
1869 */
1870static void
1871ips_ping_for_i915_load(void)
1872{
1873 void (*link)(void);
1874
1875 link = symbol_get(ips_link_to_i915_driver);
1876 if (link) {
1877 link();
1878 symbol_put(ips_link_to_i915_driver);
1879 }
1880}
1881
1882/**
2050 * i915_driver_load - setup chip and create an initial config 1883 * i915_driver_load - setup chip and create an initial config
2051 * @dev: DRM device 1884 * @dev: DRM device
2052 * @flags: startup flags 1885 * @flags: startup flags
@@ -2060,9 +1893,9 @@ EXPORT_SYMBOL_GPL(i915_gpu_turbo_disable);
2060int i915_driver_load(struct drm_device *dev, unsigned long flags) 1893int i915_driver_load(struct drm_device *dev, unsigned long flags)
2061{ 1894{
2062 struct drm_i915_private *dev_priv; 1895 struct drm_i915_private *dev_priv;
2063 resource_size_t base, size;
2064 int ret = 0, mmio_bar; 1896 int ret = 0, mmio_bar;
2065 uint32_t agp_size, prealloc_size, prealloc_start; 1897 uint32_t agp_size;
1898
2066 /* i915 has 4 more counters */ 1899 /* i915 has 4 more counters */
2067 dev->counters += 4; 1900 dev->counters += 4;
2068 dev->types[6] = _DRM_STAT_IRQ; 1901 dev->types[6] = _DRM_STAT_IRQ;
@@ -2078,11 +1911,6 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
2078 dev_priv->dev = dev; 1911 dev_priv->dev = dev;
2079 dev_priv->info = (struct intel_device_info *) flags; 1912 dev_priv->info = (struct intel_device_info *) flags;
2080 1913
2081 /* Add register map (needed for suspend/resume) */
2082 mmio_bar = IS_I9XX(dev) ? 0 : 1;
2083 base = pci_resource_start(dev->pdev, mmio_bar);
2084 size = pci_resource_len(dev->pdev, mmio_bar);
2085
2086 if (i915_get_bridge_dev(dev)) { 1914 if (i915_get_bridge_dev(dev)) {
2087 ret = -EIO; 1915 ret = -EIO;
2088 goto free_priv; 1916 goto free_priv;
@@ -2092,16 +1920,36 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
2092 if (IS_GEN2(dev)) 1920 if (IS_GEN2(dev))
2093 dma_set_coherent_mask(&dev->pdev->dev, DMA_BIT_MASK(30)); 1921 dma_set_coherent_mask(&dev->pdev->dev, DMA_BIT_MASK(30));
2094 1922
2095 dev_priv->regs = ioremap(base, size); 1923 /* 965GM sometimes incorrectly writes to hardware status page (HWS)
1924 * using 32bit addressing, overwriting memory if HWS is located
1925 * above 4GB.
1926 *
1927 * The documentation also mentions an issue with undefined
1928 * behaviour if any general state is accessed within a page above 4GB,
1929 * which also needs to be handled carefully.
1930 */
1931 if (IS_BROADWATER(dev) || IS_CRESTLINE(dev))
1932 dma_set_coherent_mask(&dev->pdev->dev, DMA_BIT_MASK(32));
1933
1934 mmio_bar = IS_GEN2(dev) ? 1 : 0;
1935 dev_priv->regs = pci_iomap(dev->pdev, mmio_bar, 0);
2096 if (!dev_priv->regs) { 1936 if (!dev_priv->regs) {
2097 DRM_ERROR("failed to map registers\n"); 1937 DRM_ERROR("failed to map registers\n");
2098 ret = -EIO; 1938 ret = -EIO;
2099 goto put_bridge; 1939 goto put_bridge;
2100 } 1940 }
2101 1941
1942 dev_priv->mm.gtt = intel_gtt_get();
1943 if (!dev_priv->mm.gtt) {
1944 DRM_ERROR("Failed to initialize GTT\n");
1945 ret = -ENODEV;
1946 goto out_rmmap;
1947 }
1948
1949 agp_size = dev_priv->mm.gtt->gtt_mappable_entries << PAGE_SHIFT;
1950
2102 dev_priv->mm.gtt_mapping = 1951 dev_priv->mm.gtt_mapping =
2103 io_mapping_create_wc(dev->agp->base, 1952 io_mapping_create_wc(dev->agp->base, agp_size);
2104 dev->agp->agp_info.aper_size * 1024*1024);
2105 if (dev_priv->mm.gtt_mapping == NULL) { 1953 if (dev_priv->mm.gtt_mapping == NULL) {
2106 ret = -EIO; 1954 ret = -EIO;
2107 goto out_rmmap; 1955 goto out_rmmap;
@@ -2113,72 +1961,60 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
2113 * MTRR if present. Even if a UC MTRR isn't present. 1961 * MTRR if present. Even if a UC MTRR isn't present.
2114 */ 1962 */
2115 dev_priv->mm.gtt_mtrr = mtrr_add(dev->agp->base, 1963 dev_priv->mm.gtt_mtrr = mtrr_add(dev->agp->base,
2116 dev->agp->agp_info.aper_size * 1964 agp_size,
2117 1024 * 1024,
2118 MTRR_TYPE_WRCOMB, 1); 1965 MTRR_TYPE_WRCOMB, 1);
2119 if (dev_priv->mm.gtt_mtrr < 0) { 1966 if (dev_priv->mm.gtt_mtrr < 0) {
2120 DRM_INFO("MTRR allocation failed. Graphics " 1967 DRM_INFO("MTRR allocation failed. Graphics "
2121 "performance may suffer.\n"); 1968 "performance may suffer.\n");
2122 } 1969 }
2123 1970
2124 ret = i915_probe_agp(dev, &agp_size, &prealloc_size, &prealloc_start); 1971 /* The i915 workqueue is primarily used for batched retirement of
2125 if (ret) 1972 * requests (and thus managing bo) once the task has been completed
2126 goto out_iomapfree; 1973 * by the GPU. i915_gem_retire_requests() is called directly when we
2127 1974 * need high-priority retirement, such as waiting for an explicit
2128 if (prealloc_size > intel_max_stolen) { 1975 * bo.
2129 DRM_INFO("detected %dM stolen memory, trimming to %dM\n", 1976 *
2130 prealloc_size >> 20, intel_max_stolen >> 20); 1977 * It is also used for periodic low-priority events, such as
2131 prealloc_size = intel_max_stolen; 1978 * idle-timers and recording error state.
2132 } 1979 *
2133 1980 * All tasks on the workqueue are expected to acquire the dev mutex
2134 dev_priv->wq = create_singlethread_workqueue("i915"); 1981 * so there is no point in running more than one instance of the
1982 * workqueue at any time: max_active = 1 and NON_REENTRANT.
1983 */
1984 dev_priv->wq = alloc_workqueue("i915",
1985 WQ_UNBOUND | WQ_NON_REENTRANT,
1986 1);
2135 if (dev_priv->wq == NULL) { 1987 if (dev_priv->wq == NULL) {
2136 DRM_ERROR("Failed to create our workqueue.\n"); 1988 DRM_ERROR("Failed to create our workqueue.\n");
2137 ret = -ENOMEM; 1989 ret = -ENOMEM;
2138 goto out_iomapfree; 1990 goto out_mtrrfree;
2139 } 1991 }
2140 1992
2141 /* enable GEM by default */ 1993 /* enable GEM by default */
2142 dev_priv->has_gem = 1; 1994 dev_priv->has_gem = 1;
2143 1995
2144 if (prealloc_size > agp_size * 3 / 4) { 1996 intel_irq_init(dev);
2145 DRM_ERROR("Detected broken video BIOS with %d/%dkB of video "
2146 "memory stolen.\n",
2147 prealloc_size / 1024, agp_size / 1024);
2148 DRM_ERROR("Disabling GEM. (try reducing stolen memory or "
2149 "updating the BIOS to fix).\n");
2150 dev_priv->has_gem = 0;
2151 }
2152
2153 if (dev_priv->has_gem == 0 &&
2154 drm_core_check_feature(dev, DRIVER_MODESET)) {
2155 DRM_ERROR("kernel modesetting requires GEM, disabling driver.\n");
2156 ret = -ENODEV;
2157 goto out_iomapfree;
2158 }
2159
2160 dev->driver->get_vblank_counter = i915_get_vblank_counter;
2161 dev->max_vblank_count = 0xffffff; /* only 24 bits of frame count */
2162 if (IS_G4X(dev) || IS_IRONLAKE(dev) || IS_GEN6(dev)) {
2163 dev->max_vblank_count = 0xffffffff; /* full 32 bit counter */
2164 dev->driver->get_vblank_counter = gm45_get_vblank_counter;
2165 }
2166 1997
2167 /* Try to make sure MCHBAR is enabled before poking at it */ 1998 /* Try to make sure MCHBAR is enabled before poking at it */
2168 intel_setup_mchbar(dev); 1999 intel_setup_mchbar(dev);
2000 intel_setup_gmbus(dev);
2001 intel_opregion_setup(dev);
2002
2003 /* Make sure the bios did its job and set up vital registers */
2004 intel_setup_bios(dev);
2169 2005
2170 i915_gem_load(dev); 2006 i915_gem_load(dev);
2171 2007
2172 /* Init HWS */ 2008 /* Init HWS */
2173 if (!I915_NEED_GFX_HWS(dev)) { 2009 if (!I915_NEED_GFX_HWS(dev)) {
2174 ret = i915_init_phys_hws(dev); 2010 ret = i915_init_phys_hws(dev);
2175 if (ret != 0) 2011 if (ret)
2176 goto out_workqueue_free; 2012 goto out_gem_unload;
2177 } 2013 }
2178 2014
2179 if (IS_PINEVIEW(dev)) 2015 if (IS_PINEVIEW(dev))
2180 i915_pineview_get_mem_freq(dev); 2016 i915_pineview_get_mem_freq(dev);
2181 else if (IS_IRONLAKE(dev)) 2017 else if (IS_GEN5(dev))
2182 i915_ironlake_get_mem_freq(dev); 2018 i915_ironlake_get_mem_freq(dev);
2183 2019
2184 /* On the 945G/GM, the chipset reports the MSI capability on the 2020 /* On the 945G/GM, the chipset reports the MSI capability on the
@@ -2195,16 +2031,18 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
2195 if (!IS_I945G(dev) && !IS_I945GM(dev)) 2031 if (!IS_I945G(dev) && !IS_I945GM(dev))
2196 pci_enable_msi(dev->pdev); 2032 pci_enable_msi(dev->pdev);
2197 2033
2198 spin_lock_init(&dev_priv->user_irq_lock); 2034 spin_lock_init(&dev_priv->irq_lock);
2199 spin_lock_init(&dev_priv->error_lock); 2035 spin_lock_init(&dev_priv->error_lock);
2200 dev_priv->trace_irq_seqno = 0; 2036 spin_lock_init(&dev_priv->rps_lock);
2201 2037
2202 ret = drm_vblank_init(dev, I915_NUM_PIPE); 2038 if (IS_MOBILE(dev) || !IS_GEN2(dev))
2039 dev_priv->num_pipe = 2;
2040 else
2041 dev_priv->num_pipe = 1;
2203 2042
2204 if (ret) { 2043 ret = drm_vblank_init(dev, dev_priv->num_pipe);
2205 (void) i915_driver_unload(dev); 2044 if (ret)
2206 return ret; 2045 goto out_gem_unload;
2207 }
2208 2046
2209 /* Start out suspended */ 2047 /* Start out suspended */
2210 dev_priv->mm.suspended = 1; 2048 dev_priv->mm.suspended = 1;
@@ -2212,16 +2050,16 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
2212 intel_detect_pch(dev); 2050 intel_detect_pch(dev);
2213 2051
2214 if (drm_core_check_feature(dev, DRIVER_MODESET)) { 2052 if (drm_core_check_feature(dev, DRIVER_MODESET)) {
2215 ret = i915_load_modeset_init(dev, prealloc_start, 2053 ret = i915_load_modeset_init(dev);
2216 prealloc_size, agp_size);
2217 if (ret < 0) { 2054 if (ret < 0) {
2218 DRM_ERROR("failed to init modeset\n"); 2055 DRM_ERROR("failed to init modeset\n");
2219 goto out_workqueue_free; 2056 goto out_gem_unload;
2220 } 2057 }
2221 } 2058 }
2222 2059
2223 /* Must be done after probing outputs */ 2060 /* Must be done after probing outputs */
2224 intel_opregion_init(dev, 0); 2061 intel_opregion_init(dev);
2062 acpi_video_register();
2225 2063
2226 setup_timer(&dev_priv->hangcheck_timer, i915_hangcheck_elapsed, 2064 setup_timer(&dev_priv->hangcheck_timer, i915_hangcheck_elapsed,
2227 (unsigned long) dev); 2065 (unsigned long) dev);
@@ -2231,17 +2069,29 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
2231 dev_priv->mchdev_lock = &mchdev_lock; 2069 dev_priv->mchdev_lock = &mchdev_lock;
2232 spin_unlock(&mchdev_lock); 2070 spin_unlock(&mchdev_lock);
2233 2071
2234 /* XXX Prevent module unload due to memory corruption bugs. */ 2072 ips_ping_for_i915_load();
2235 __module_get(THIS_MODULE);
2236 2073
2237 return 0; 2074 return 0;
2238 2075
2239out_workqueue_free: 2076out_gem_unload:
2077 if (dev_priv->mm.inactive_shrinker.shrink)
2078 unregister_shrinker(&dev_priv->mm.inactive_shrinker);
2079
2080 if (dev->pdev->msi_enabled)
2081 pci_disable_msi(dev->pdev);
2082
2083 intel_teardown_gmbus(dev);
2084 intel_teardown_mchbar(dev);
2240 destroy_workqueue(dev_priv->wq); 2085 destroy_workqueue(dev_priv->wq);
2241out_iomapfree: 2086out_mtrrfree:
2087 if (dev_priv->mm.gtt_mtrr >= 0) {
2088 mtrr_del(dev_priv->mm.gtt_mtrr, dev->agp->base,
2089 dev->agp->agp_info.aper_size * 1024 * 1024);
2090 dev_priv->mm.gtt_mtrr = -1;
2091 }
2242 io_mapping_free(dev_priv->mm.gtt_mapping); 2092 io_mapping_free(dev_priv->mm.gtt_mapping);
2243out_rmmap: 2093out_rmmap:
2244 iounmap(dev_priv->regs); 2094 pci_iounmap(dev->pdev, dev_priv->regs);
2245put_bridge: 2095put_bridge:
2246 pci_dev_put(dev_priv->bridge_dev); 2096 pci_dev_put(dev_priv->bridge_dev);
2247free_priv: 2097free_priv:
@@ -2252,15 +2102,23 @@ free_priv:
2252int i915_driver_unload(struct drm_device *dev) 2102int i915_driver_unload(struct drm_device *dev)
2253{ 2103{
2254 struct drm_i915_private *dev_priv = dev->dev_private; 2104 struct drm_i915_private *dev_priv = dev->dev_private;
2255 2105 int ret;
2256 i915_destroy_error_state(dev);
2257 2106
2258 spin_lock(&mchdev_lock); 2107 spin_lock(&mchdev_lock);
2259 i915_mch_dev = NULL; 2108 i915_mch_dev = NULL;
2260 spin_unlock(&mchdev_lock); 2109 spin_unlock(&mchdev_lock);
2261 2110
2262 destroy_workqueue(dev_priv->wq); 2111 if (dev_priv->mm.inactive_shrinker.shrink)
2263 del_timer_sync(&dev_priv->hangcheck_timer); 2112 unregister_shrinker(&dev_priv->mm.inactive_shrinker);
2113
2114 mutex_lock(&dev->struct_mutex);
2115 ret = i915_gpu_idle(dev);
2116 if (ret)
2117 DRM_ERROR("failed to idle hardware: %d\n", ret);
2118 mutex_unlock(&dev->struct_mutex);
2119
2120 /* Cancel the retire work handler, which should be idle now. */
2121 cancel_delayed_work_sync(&dev_priv->mm.retire_work);
2264 2122
2265 io_mapping_free(dev_priv->mm.gtt_mapping); 2123 io_mapping_free(dev_priv->mm.gtt_mapping);
2266 if (dev_priv->mm.gtt_mtrr >= 0) { 2124 if (dev_priv->mm.gtt_mtrr >= 0) {
@@ -2269,7 +2127,10 @@ int i915_driver_unload(struct drm_device *dev)
2269 dev_priv->mm.gtt_mtrr = -1; 2127 dev_priv->mm.gtt_mtrr = -1;
2270 } 2128 }
2271 2129
2130 acpi_video_unregister();
2131
2272 if (drm_core_check_feature(dev, DRIVER_MODESET)) { 2132 if (drm_core_check_feature(dev, DRIVER_MODESET)) {
2133 intel_fbdev_fini(dev);
2273 intel_modeset_cleanup(dev); 2134 intel_modeset_cleanup(dev);
2274 2135
2275 /* 2136 /*
@@ -2281,55 +2142,66 @@ int i915_driver_unload(struct drm_device *dev)
2281 dev_priv->child_dev = NULL; 2142 dev_priv->child_dev = NULL;
2282 dev_priv->child_dev_num = 0; 2143 dev_priv->child_dev_num = 0;
2283 } 2144 }
2284 drm_irq_uninstall(dev); 2145
2285 vga_switcheroo_unregister_client(dev->pdev); 2146 vga_switcheroo_unregister_client(dev->pdev);
2286 vga_client_register(dev->pdev, NULL, NULL, NULL); 2147 vga_client_register(dev->pdev, NULL, NULL, NULL);
2287 } 2148 }
2288 2149
2150 /* Free error state after interrupts are fully disabled. */
2151 del_timer_sync(&dev_priv->hangcheck_timer);
2152 cancel_work_sync(&dev_priv->error_work);
2153 i915_destroy_error_state(dev);
2154
2289 if (dev->pdev->msi_enabled) 2155 if (dev->pdev->msi_enabled)
2290 pci_disable_msi(dev->pdev); 2156 pci_disable_msi(dev->pdev);
2291 2157
2292 if (dev_priv->regs != NULL) 2158 intel_opregion_fini(dev);
2293 iounmap(dev_priv->regs);
2294
2295 intel_opregion_free(dev, 0);
2296 2159
2297 if (drm_core_check_feature(dev, DRIVER_MODESET)) { 2160 if (drm_core_check_feature(dev, DRIVER_MODESET)) {
2298 i915_gem_free_all_phys_object(dev); 2161 /* Flush any outstanding unpin_work. */
2162 flush_workqueue(dev_priv->wq);
2299 2163
2300 mutex_lock(&dev->struct_mutex); 2164 mutex_lock(&dev->struct_mutex);
2165 i915_gem_free_all_phys_object(dev);
2301 i915_gem_cleanup_ringbuffer(dev); 2166 i915_gem_cleanup_ringbuffer(dev);
2302 mutex_unlock(&dev->struct_mutex); 2167 mutex_unlock(&dev->struct_mutex);
2303 if (I915_HAS_FBC(dev) && i915_powersave) 2168 if (I915_HAS_FBC(dev) && i915_powersave)
2304 i915_cleanup_compression(dev); 2169 i915_cleanup_compression(dev);
2305 drm_mm_takedown(&dev_priv->vram); 2170 drm_mm_takedown(&dev_priv->mm.stolen);
2306 i915_gem_lastclose(dev);
2307 2171
2308 intel_cleanup_overlay(dev); 2172 intel_cleanup_overlay(dev);
2173
2174 if (!I915_NEED_GFX_HWS(dev))
2175 i915_free_hws(dev);
2309 } 2176 }
2310 2177
2178 if (dev_priv->regs != NULL)
2179 pci_iounmap(dev->pdev, dev_priv->regs);
2180
2181 intel_teardown_gmbus(dev);
2311 intel_teardown_mchbar(dev); 2182 intel_teardown_mchbar(dev);
2312 2183
2184 destroy_workqueue(dev_priv->wq);
2185
2313 pci_dev_put(dev_priv->bridge_dev); 2186 pci_dev_put(dev_priv->bridge_dev);
2314 kfree(dev->dev_private); 2187 kfree(dev->dev_private);
2315 2188
2316 return 0; 2189 return 0;
2317} 2190}
2318 2191
2319int i915_driver_open(struct drm_device *dev, struct drm_file *file_priv) 2192int i915_driver_open(struct drm_device *dev, struct drm_file *file)
2320{ 2193{
2321 struct drm_i915_file_private *i915_file_priv; 2194 struct drm_i915_file_private *file_priv;
2322 2195
2323 DRM_DEBUG_DRIVER("\n"); 2196 DRM_DEBUG_DRIVER("\n");
2324 i915_file_priv = (struct drm_i915_file_private *) 2197 file_priv = kmalloc(sizeof(*file_priv), GFP_KERNEL);
2325 kmalloc(sizeof(*i915_file_priv), GFP_KERNEL); 2198 if (!file_priv)
2326
2327 if (!i915_file_priv)
2328 return -ENOMEM; 2199 return -ENOMEM;
2329 2200
2330 file_priv->driver_priv = i915_file_priv; 2201 file->driver_priv = file_priv;
2331 2202
2332 INIT_LIST_HEAD(&i915_file_priv->mm.request_list); 2203 spin_lock_init(&file_priv->mm.lock);
2204 INIT_LIST_HEAD(&file_priv->mm.request_list);
2333 2205
2334 return 0; 2206 return 0;
2335} 2207}
@@ -2351,7 +2223,7 @@ void i915_driver_lastclose(struct drm_device * dev)
2351 drm_i915_private_t *dev_priv = dev->dev_private; 2223 drm_i915_private_t *dev_priv = dev->dev_private;
2352 2224
2353 if (!dev_priv || drm_core_check_feature(dev, DRIVER_MODESET)) { 2225 if (!dev_priv || drm_core_check_feature(dev, DRIVER_MODESET)) {
2354 drm_fb_helper_restore(); 2226 intel_fb_restore_mode(dev);
2355 vga_switcheroo_process_delayed_switch(); 2227 vga_switcheroo_process_delayed_switch();
2356 return; 2228 return;
2357 } 2229 }
@@ -2372,11 +2244,11 @@ void i915_driver_preclose(struct drm_device * dev, struct drm_file *file_priv)
2372 i915_mem_release(dev, file_priv, dev_priv->agp_heap); 2244 i915_mem_release(dev, file_priv, dev_priv->agp_heap);
2373} 2245}
2374 2246
2375void i915_driver_postclose(struct drm_device *dev, struct drm_file *file_priv) 2247void i915_driver_postclose(struct drm_device *dev, struct drm_file *file)
2376{ 2248{
2377 struct drm_i915_file_private *i915_file_priv = file_priv->driver_priv; 2249 struct drm_i915_file_private *file_priv = file->driver_priv;
2378 2250
2379 kfree(i915_file_priv); 2251 kfree(file_priv);
2380} 2252}
2381 2253
2382struct drm_ioctl_desc i915_ioctls[] = { 2254struct drm_ioctl_desc i915_ioctls[] = {
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
index 6dbe14cc4f74..eb91e2dd7914 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -32,6 +32,7 @@
32#include "drm.h" 32#include "drm.h"
33#include "i915_drm.h" 33#include "i915_drm.h"
34#include "i915_drv.h" 34#include "i915_drv.h"
35#include "intel_drv.h"
35 36
36#include <linux/console.h> 37#include <linux/console.h>
37#include "drm_crtc_helper.h" 38#include "drm_crtc_helper.h"
@@ -42,18 +43,39 @@ module_param_named(modeset, i915_modeset, int, 0400);
42unsigned int i915_fbpercrtc = 0; 43unsigned int i915_fbpercrtc = 0;
43module_param_named(fbpercrtc, i915_fbpercrtc, int, 0400); 44module_param_named(fbpercrtc, i915_fbpercrtc, int, 0400);
44 45
46int i915_panel_ignore_lid = 0;
47module_param_named(panel_ignore_lid, i915_panel_ignore_lid, int, 0600);
48
45unsigned int i915_powersave = 1; 49unsigned int i915_powersave = 1;
46module_param_named(powersave, i915_powersave, int, 0400); 50module_param_named(powersave, i915_powersave, int, 0600);
51
52unsigned int i915_semaphores = 0;
53module_param_named(semaphores, i915_semaphores, int, 0600);
54
55unsigned int i915_enable_rc6 = 0;
56module_param_named(i915_enable_rc6, i915_enable_rc6, int, 0600);
57
58unsigned int i915_enable_fbc = 0;
59module_param_named(i915_enable_fbc, i915_enable_fbc, int, 0600);
47 60
48unsigned int i915_lvds_downclock = 0; 61unsigned int i915_lvds_downclock = 0;
49module_param_named(lvds_downclock, i915_lvds_downclock, int, 0400); 62module_param_named(lvds_downclock, i915_lvds_downclock, int, 0400);
50 63
64unsigned int i915_panel_use_ssc = 1;
65module_param_named(lvds_use_ssc, i915_panel_use_ssc, int, 0600);
66
67int i915_vbt_sdvo_panel_type = -1;
68module_param_named(vbt_sdvo_panel_type, i915_vbt_sdvo_panel_type, int, 0600);
69
70static bool i915_try_reset = true;
71module_param_named(reset, i915_try_reset, bool, 0600);
72
51static struct drm_driver driver; 73static struct drm_driver driver;
52extern int intel_agp_enabled; 74extern int intel_agp_enabled;
53 75
54#define INTEL_VGA_DEVICE(id, info) { \ 76#define INTEL_VGA_DEVICE(id, info) { \
55 .class = PCI_CLASS_DISPLAY_VGA << 8, \ 77 .class = PCI_CLASS_DISPLAY_VGA << 8, \
56 .class_mask = 0xffff00, \ 78 .class_mask = 0xff0000, \
57 .vendor = 0x8086, \ 79 .vendor = 0x8086, \
58 .device = id, \ 80 .device = id, \
59 .subvendor = PCI_ANY_ID, \ 81 .subvendor = PCI_ANY_ID, \
@@ -61,86 +83,127 @@ extern int intel_agp_enabled;
61 .driver_data = (unsigned long) info } 83 .driver_data = (unsigned long) info }
62 84
63static const struct intel_device_info intel_i830_info = { 85static const struct intel_device_info intel_i830_info = {
64 .gen = 2, .is_i8xx = 1, .is_mobile = 1, .cursor_needs_physical = 1, 86 .gen = 2, .is_mobile = 1, .cursor_needs_physical = 1,
87 .has_overlay = 1, .overlay_needs_physical = 1,
65}; 88};
66 89
67static const struct intel_device_info intel_845g_info = { 90static const struct intel_device_info intel_845g_info = {
68 .gen = 2, .is_i8xx = 1, 91 .gen = 2,
92 .has_overlay = 1, .overlay_needs_physical = 1,
69}; 93};
70 94
71static const struct intel_device_info intel_i85x_info = { 95static const struct intel_device_info intel_i85x_info = {
72 .gen = 2, .is_i8xx = 1, .is_i85x = 1, .is_mobile = 1, 96 .gen = 2, .is_i85x = 1, .is_mobile = 1,
73 .cursor_needs_physical = 1, 97 .cursor_needs_physical = 1,
98 .has_overlay = 1, .overlay_needs_physical = 1,
74}; 99};
75 100
76static const struct intel_device_info intel_i865g_info = { 101static const struct intel_device_info intel_i865g_info = {
77 .gen = 2, .is_i8xx = 1, 102 .gen = 2,
103 .has_overlay = 1, .overlay_needs_physical = 1,
78}; 104};
79 105
80static const struct intel_device_info intel_i915g_info = { 106static const struct intel_device_info intel_i915g_info = {
81 .gen = 3, .is_i915g = 1, .is_i9xx = 1, .cursor_needs_physical = 1, 107 .gen = 3, .is_i915g = 1, .cursor_needs_physical = 1,
108 .has_overlay = 1, .overlay_needs_physical = 1,
82}; 109};
83static const struct intel_device_info intel_i915gm_info = { 110static const struct intel_device_info intel_i915gm_info = {
84 .gen = 3, .is_i9xx = 1, .is_mobile = 1, 111 .gen = 3, .is_mobile = 1,
85 .cursor_needs_physical = 1, 112 .cursor_needs_physical = 1,
113 .has_overlay = 1, .overlay_needs_physical = 1,
114 .supports_tv = 1,
86}; 115};
87static const struct intel_device_info intel_i945g_info = { 116static const struct intel_device_info intel_i945g_info = {
88 .gen = 3, .is_i9xx = 1, .has_hotplug = 1, .cursor_needs_physical = 1, 117 .gen = 3, .has_hotplug = 1, .cursor_needs_physical = 1,
118 .has_overlay = 1, .overlay_needs_physical = 1,
89}; 119};
90static const struct intel_device_info intel_i945gm_info = { 120static const struct intel_device_info intel_i945gm_info = {
91 .gen = 3, .is_i945gm = 1, .is_i9xx = 1, .is_mobile = 1, 121 .gen = 3, .is_i945gm = 1, .is_mobile = 1,
92 .has_hotplug = 1, .cursor_needs_physical = 1, 122 .has_hotplug = 1, .cursor_needs_physical = 1,
123 .has_overlay = 1, .overlay_needs_physical = 1,
124 .supports_tv = 1,
93}; 125};
94 126
95static const struct intel_device_info intel_i965g_info = { 127static const struct intel_device_info intel_i965g_info = {
96 .gen = 4, .is_broadwater = 1, .is_i965g = 1, .is_i9xx = 1, 128 .gen = 4, .is_broadwater = 1,
97 .has_hotplug = 1, 129 .has_hotplug = 1,
130 .has_overlay = 1,
98}; 131};
99 132
100static const struct intel_device_info intel_i965gm_info = { 133static const struct intel_device_info intel_i965gm_info = {
101 .gen = 4, .is_crestline = 1, .is_i965g = 1, .is_i965gm = 1, .is_i9xx = 1, 134 .gen = 4, .is_crestline = 1,
102 .is_mobile = 1, .has_fbc = 1, .has_rc6 = 1, .has_hotplug = 1, 135 .is_mobile = 1, .has_fbc = 1, .has_hotplug = 1,
136 .has_overlay = 1,
137 .supports_tv = 1,
103}; 138};
104 139
105static const struct intel_device_info intel_g33_info = { 140static const struct intel_device_info intel_g33_info = {
106 .gen = 3, .is_g33 = 1, .is_i9xx = 1, 141 .gen = 3, .is_g33 = 1,
107 .need_gfx_hws = 1, .has_hotplug = 1, 142 .need_gfx_hws = 1, .has_hotplug = 1,
143 .has_overlay = 1,
108}; 144};
109 145
110static const struct intel_device_info intel_g45_info = { 146static const struct intel_device_info intel_g45_info = {
111 .gen = 4, .is_i965g = 1, .is_g4x = 1, .is_i9xx = 1, .need_gfx_hws = 1, 147 .gen = 4, .is_g4x = 1, .need_gfx_hws = 1,
112 .has_pipe_cxsr = 1, .has_hotplug = 1, 148 .has_pipe_cxsr = 1, .has_hotplug = 1,
149 .has_bsd_ring = 1,
113}; 150};
114 151
115static const struct intel_device_info intel_gm45_info = { 152static const struct intel_device_info intel_gm45_info = {
116 .gen = 4, .is_i965g = 1, .is_g4x = 1, .is_i9xx = 1, 153 .gen = 4, .is_g4x = 1,
117 .is_mobile = 1, .need_gfx_hws = 1, .has_fbc = 1, .has_rc6 = 1, 154 .is_mobile = 1, .need_gfx_hws = 1, .has_fbc = 1,
118 .has_pipe_cxsr = 1, .has_hotplug = 1, 155 .has_pipe_cxsr = 1, .has_hotplug = 1,
156 .supports_tv = 1,
157 .has_bsd_ring = 1,
119}; 158};
120 159
121static const struct intel_device_info intel_pineview_info = { 160static const struct intel_device_info intel_pineview_info = {
122 .gen = 3, .is_g33 = 1, .is_pineview = 1, .is_mobile = 1, .is_i9xx = 1, 161 .gen = 3, .is_g33 = 1, .is_pineview = 1, .is_mobile = 1,
123 .need_gfx_hws = 1, .has_hotplug = 1, 162 .need_gfx_hws = 1, .has_hotplug = 1,
163 .has_overlay = 1,
124}; 164};
125 165
126static const struct intel_device_info intel_ironlake_d_info = { 166static const struct intel_device_info intel_ironlake_d_info = {
127 .gen = 5, .is_ironlake = 1, .is_i965g = 1, .is_i9xx = 1, 167 .gen = 5,
128 .need_gfx_hws = 1, .has_pipe_cxsr = 1, .has_hotplug = 1, 168 .need_gfx_hws = 1, .has_pipe_cxsr = 1, .has_hotplug = 1,
169 .has_bsd_ring = 1,
129}; 170};
130 171
131static const struct intel_device_info intel_ironlake_m_info = { 172static const struct intel_device_info intel_ironlake_m_info = {
132 .gen = 5, .is_ironlake = 1, .is_mobile = 1, .is_i965g = 1, .is_i9xx = 1, 173 .gen = 5, .is_mobile = 1,
133 .need_gfx_hws = 1, .has_fbc = 1, .has_rc6 = 1, .has_hotplug = 1, 174 .need_gfx_hws = 1, .has_hotplug = 1,
175 .has_fbc = 1,
176 .has_bsd_ring = 1,
134}; 177};
135 178
136static const struct intel_device_info intel_sandybridge_d_info = { 179static const struct intel_device_info intel_sandybridge_d_info = {
137 .gen = 6, .is_i965g = 1, .is_i9xx = 1, 180 .gen = 6,
138 .need_gfx_hws = 1, .has_hotplug = 1, 181 .need_gfx_hws = 1, .has_hotplug = 1,
182 .has_bsd_ring = 1,
183 .has_blt_ring = 1,
139}; 184};
140 185
141static const struct intel_device_info intel_sandybridge_m_info = { 186static const struct intel_device_info intel_sandybridge_m_info = {
142 .gen = 6, .is_i965g = 1, .is_mobile = 1, .is_i9xx = 1, 187 .gen = 6, .is_mobile = 1,
143 .need_gfx_hws = 1, .has_hotplug = 1, 188 .need_gfx_hws = 1, .has_hotplug = 1,
189 .has_fbc = 1,
190 .has_bsd_ring = 1,
191 .has_blt_ring = 1,
192};
193
194static const struct intel_device_info intel_ivybridge_d_info = {
195 .is_ivybridge = 1, .gen = 7,
196 .need_gfx_hws = 1, .has_hotplug = 1,
197 .has_bsd_ring = 1,
198 .has_blt_ring = 1,
199};
200
201static const struct intel_device_info intel_ivybridge_m_info = {
202 .is_ivybridge = 1, .gen = 7, .is_mobile = 1,
203 .need_gfx_hws = 1, .has_hotplug = 1,
204 .has_fbc = 0, /* FBC is not enabled on Ivybridge mobile yet */
205 .has_bsd_ring = 1,
206 .has_blt_ring = 1,
144}; 207};
145 208
146static const struct pci_device_id pciidlist[] = { /* aka */ 209static const struct pci_device_id pciidlist[] = { /* aka */
@@ -182,6 +245,11 @@ static const struct pci_device_id pciidlist[] = { /* aka */
182 INTEL_VGA_DEVICE(0x0116, &intel_sandybridge_m_info), 245 INTEL_VGA_DEVICE(0x0116, &intel_sandybridge_m_info),
183 INTEL_VGA_DEVICE(0x0126, &intel_sandybridge_m_info), 246 INTEL_VGA_DEVICE(0x0126, &intel_sandybridge_m_info),
184 INTEL_VGA_DEVICE(0x010A, &intel_sandybridge_d_info), 247 INTEL_VGA_DEVICE(0x010A, &intel_sandybridge_d_info),
248 INTEL_VGA_DEVICE(0x0156, &intel_ivybridge_m_info), /* GT1 mobile */
249 INTEL_VGA_DEVICE(0x0166, &intel_ivybridge_m_info), /* GT2 mobile */
250 INTEL_VGA_DEVICE(0x0152, &intel_ivybridge_d_info), /* GT1 desktop */
251 INTEL_VGA_DEVICE(0x0162, &intel_ivybridge_d_info), /* GT2 desktop */
252 INTEL_VGA_DEVICE(0x015a, &intel_ivybridge_d_info), /* GT1 server */
185 {0, 0, 0} 253 {0, 0, 0}
186}; 254};
187 255
@@ -190,7 +258,9 @@ MODULE_DEVICE_TABLE(pci, pciidlist);
190#endif 258#endif
191 259
192#define INTEL_PCH_DEVICE_ID_MASK 0xff00 260#define INTEL_PCH_DEVICE_ID_MASK 0xff00
261#define INTEL_PCH_IBX_DEVICE_ID_TYPE 0x3b00
193#define INTEL_PCH_CPT_DEVICE_ID_TYPE 0x1c00 262#define INTEL_PCH_CPT_DEVICE_ID_TYPE 0x1c00
263#define INTEL_PCH_PPT_DEVICE_ID_TYPE 0x1e00
194 264
195void intel_detect_pch (struct drm_device *dev) 265void intel_detect_pch (struct drm_device *dev)
196{ 266{
@@ -209,19 +279,86 @@ void intel_detect_pch (struct drm_device *dev)
209 int id; 279 int id;
210 id = pch->device & INTEL_PCH_DEVICE_ID_MASK; 280 id = pch->device & INTEL_PCH_DEVICE_ID_MASK;
211 281
212 if (id == INTEL_PCH_CPT_DEVICE_ID_TYPE) { 282 if (id == INTEL_PCH_IBX_DEVICE_ID_TYPE) {
283 dev_priv->pch_type = PCH_IBX;
284 DRM_DEBUG_KMS("Found Ibex Peak PCH\n");
285 } else if (id == INTEL_PCH_CPT_DEVICE_ID_TYPE) {
213 dev_priv->pch_type = PCH_CPT; 286 dev_priv->pch_type = PCH_CPT;
214 DRM_DEBUG_KMS("Found CougarPoint PCH\n"); 287 DRM_DEBUG_KMS("Found CougarPoint PCH\n");
288 } else if (id == INTEL_PCH_PPT_DEVICE_ID_TYPE) {
289 /* PantherPoint is CPT compatible */
290 dev_priv->pch_type = PCH_CPT;
291 DRM_DEBUG_KMS("Found PatherPoint PCH\n");
215 } 292 }
216 } 293 }
217 pci_dev_put(pch); 294 pci_dev_put(pch);
218 } 295 }
219} 296}
220 297
298static void __gen6_gt_force_wake_get(struct drm_i915_private *dev_priv)
299{
300 int count;
301
302 count = 0;
303 while (count++ < 50 && (I915_READ_NOTRACE(FORCEWAKE_ACK) & 1))
304 udelay(10);
305
306 I915_WRITE_NOTRACE(FORCEWAKE, 1);
307 POSTING_READ(FORCEWAKE);
308
309 count = 0;
310 while (count++ < 50 && (I915_READ_NOTRACE(FORCEWAKE_ACK) & 1) == 0)
311 udelay(10);
312}
313
314/*
315 * Generally this is called implicitly by the register read function. However,
316 * if some sequence requires the GT to not power down then this function should
317 * be called at the beginning of the sequence followed by a call to
318 * gen6_gt_force_wake_put() at the end of the sequence.
319 */
320void gen6_gt_force_wake_get(struct drm_i915_private *dev_priv)
321{
322 WARN_ON(!mutex_is_locked(&dev_priv->dev->struct_mutex));
323
324 /* Forcewake is atomic in case we get in here without the lock */
325 if (atomic_add_return(1, &dev_priv->forcewake_count) == 1)
326 __gen6_gt_force_wake_get(dev_priv);
327}
328
329static void __gen6_gt_force_wake_put(struct drm_i915_private *dev_priv)
330{
331 I915_WRITE_NOTRACE(FORCEWAKE, 0);
332 POSTING_READ(FORCEWAKE);
333}
334
335/*
336 * see gen6_gt_force_wake_get()
337 */
338void gen6_gt_force_wake_put(struct drm_i915_private *dev_priv)
339{
340 WARN_ON(!mutex_is_locked(&dev_priv->dev->struct_mutex));
341
342 if (atomic_dec_and_test(&dev_priv->forcewake_count))
343 __gen6_gt_force_wake_put(dev_priv);
344}
345
346void __gen6_gt_wait_for_fifo(struct drm_i915_private *dev_priv)
347{
348 int loop = 500;
349 u32 fifo = I915_READ_NOTRACE(GT_FIFO_FREE_ENTRIES);
350 while (fifo < 20 && loop--) {
351 udelay(10);
352 fifo = I915_READ_NOTRACE(GT_FIFO_FREE_ENTRIES);
353 }
354}
355
221static int i915_drm_freeze(struct drm_device *dev) 356static int i915_drm_freeze(struct drm_device *dev)
222{ 357{
223 struct drm_i915_private *dev_priv = dev->dev_private; 358 struct drm_i915_private *dev_priv = dev->dev_private;
224 359
360 drm_kms_helper_poll_disable(dev);
361
225 pci_save_state(dev->pdev); 362 pci_save_state(dev->pdev);
226 363
227 /* If KMS is active, we do the leavevt stuff here */ 364 /* If KMS is active, we do the leavevt stuff here */
@@ -237,7 +374,7 @@ static int i915_drm_freeze(struct drm_device *dev)
237 374
238 i915_save_state(dev); 375 i915_save_state(dev);
239 376
240 intel_opregion_free(dev, 1); 377 intel_opregion_fini(dev);
241 378
242 /* Modeset on resume, not lid events */ 379 /* Modeset on resume, not lid events */
243 dev_priv->modeset_on_lid = 0; 380 dev_priv->modeset_on_lid = 0;
@@ -258,6 +395,10 @@ int i915_suspend(struct drm_device *dev, pm_message_t state)
258 if (state.event == PM_EVENT_PRETHAW) 395 if (state.event == PM_EVENT_PRETHAW)
259 return 0; 396 return 0;
260 397
398
399 if (dev->switch_power_state == DRM_SWITCH_POWER_OFF)
400 return 0;
401
261 error = i915_drm_freeze(dev); 402 error = i915_drm_freeze(dev);
262 if (error) 403 if (error)
263 return error; 404 return error;
@@ -276,9 +417,14 @@ static int i915_drm_thaw(struct drm_device *dev)
276 struct drm_i915_private *dev_priv = dev->dev_private; 417 struct drm_i915_private *dev_priv = dev->dev_private;
277 int error = 0; 418 int error = 0;
278 419
279 i915_restore_state(dev); 420 if (drm_core_check_feature(dev, DRIVER_MODESET)) {
421 mutex_lock(&dev->struct_mutex);
422 i915_gem_restore_gtt_mappings(dev);
423 mutex_unlock(&dev->struct_mutex);
424 }
280 425
281 intel_opregion_init(dev, 1); 426 i915_restore_state(dev);
427 intel_opregion_setup(dev);
282 428
283 /* KMS EnterVT equivalent */ 429 /* KMS EnterVT equivalent */
284 if (drm_core_check_feature(dev, DRIVER_MODESET)) { 430 if (drm_core_check_feature(dev, DRIVER_MODESET)) {
@@ -288,12 +434,18 @@ static int i915_drm_thaw(struct drm_device *dev)
288 error = i915_gem_init_ringbuffer(dev); 434 error = i915_gem_init_ringbuffer(dev);
289 mutex_unlock(&dev->struct_mutex); 435 mutex_unlock(&dev->struct_mutex);
290 436
437 drm_mode_config_reset(dev);
291 drm_irq_install(dev); 438 drm_irq_install(dev);
292 439
293 /* Resume the modeset for every activated CRTC */ 440 /* Resume the modeset for every activated CRTC */
294 drm_helper_resume_force_mode(dev); 441 drm_helper_resume_force_mode(dev);
442
443 if (IS_IRONLAKE_M(dev))
444 ironlake_enable_rc6(dev);
295 } 445 }
296 446
447 intel_opregion_init(dev);
448
297 dev_priv->modeset_on_lid = 0; 449 dev_priv->modeset_on_lid = 0;
298 450
299 return error; 451 return error;
@@ -301,12 +453,90 @@ static int i915_drm_thaw(struct drm_device *dev)
301 453
302int i915_resume(struct drm_device *dev) 454int i915_resume(struct drm_device *dev)
303{ 455{
456 int ret;
457
458 if (dev->switch_power_state == DRM_SWITCH_POWER_OFF)
459 return 0;
460
304 if (pci_enable_device(dev->pdev)) 461 if (pci_enable_device(dev->pdev))
305 return -EIO; 462 return -EIO;
306 463
307 pci_set_master(dev->pdev); 464 pci_set_master(dev->pdev);
308 465
309 return i915_drm_thaw(dev); 466 ret = i915_drm_thaw(dev);
467 if (ret)
468 return ret;
469
470 drm_kms_helper_poll_enable(dev);
471 return 0;
472}
473
474static int i8xx_do_reset(struct drm_device *dev, u8 flags)
475{
476 struct drm_i915_private *dev_priv = dev->dev_private;
477
478 if (IS_I85X(dev))
479 return -ENODEV;
480
481 I915_WRITE(D_STATE, I915_READ(D_STATE) | DSTATE_GFX_RESET_I830);
482 POSTING_READ(D_STATE);
483
484 if (IS_I830(dev) || IS_845G(dev)) {
485 I915_WRITE(DEBUG_RESET_I830,
486 DEBUG_RESET_DISPLAY |
487 DEBUG_RESET_RENDER |
488 DEBUG_RESET_FULL);
489 POSTING_READ(DEBUG_RESET_I830);
490 msleep(1);
491
492 I915_WRITE(DEBUG_RESET_I830, 0);
493 POSTING_READ(DEBUG_RESET_I830);
494 }
495
496 msleep(1);
497
498 I915_WRITE(D_STATE, I915_READ(D_STATE) & ~DSTATE_GFX_RESET_I830);
499 POSTING_READ(D_STATE);
500
501 return 0;
502}
503
504static int i965_reset_complete(struct drm_device *dev)
505{
506 u8 gdrst;
507 pci_read_config_byte(dev->pdev, I965_GDRST, &gdrst);
508 return gdrst & 0x1;
509}
510
511static int i965_do_reset(struct drm_device *dev, u8 flags)
512{
513 u8 gdrst;
514
515 /*
516 * Set the domains we want to reset (GRDOM/bits 2 and 3) as
517 * well as the reset bit (GR/bit 0). Setting the GR bit
518 * triggers the reset; when done, the hardware will clear it.
519 */
520 pci_read_config_byte(dev->pdev, I965_GDRST, &gdrst);
521 pci_write_config_byte(dev->pdev, I965_GDRST, gdrst | flags | 0x1);
522
523 return wait_for(i965_reset_complete(dev), 500);
524}
525
526static int ironlake_do_reset(struct drm_device *dev, u8 flags)
527{
528 struct drm_i915_private *dev_priv = dev->dev_private;
529 u32 gdrst = I915_READ(MCHBAR_MIRROR_BASE + ILK_GDSR);
530 I915_WRITE(MCHBAR_MIRROR_BASE + ILK_GDSR, gdrst | flags | 0x1);
531 return wait_for(I915_READ(MCHBAR_MIRROR_BASE + ILK_GDSR) & 0x1, 500);
532}
533
534static int gen6_do_reset(struct drm_device *dev, u8 flags)
535{
536 struct drm_i915_private *dev_priv = dev->dev_private;
537
538 I915_WRITE(GEN6_GDRST, GEN6_GRDOM_FULL);
539 return wait_for((I915_READ(GEN6_GDRST) & GEN6_GRDOM_FULL) == 0, 500);
310} 540}
311 541
312/** 542/**
@@ -325,54 +555,50 @@ int i915_resume(struct drm_device *dev)
325 * - re-init interrupt state 555 * - re-init interrupt state
326 * - re-init display 556 * - re-init display
327 */ 557 */
328int i965_reset(struct drm_device *dev, u8 flags) 558int i915_reset(struct drm_device *dev, u8 flags)
329{ 559{
330 drm_i915_private_t *dev_priv = dev->dev_private; 560 drm_i915_private_t *dev_priv = dev->dev_private;
331 unsigned long timeout;
332 u8 gdrst;
333 /* 561 /*
334 * We really should only reset the display subsystem if we actually 562 * We really should only reset the display subsystem if we actually
335 * need to 563 * need to
336 */ 564 */
337 bool need_display = true; 565 bool need_display = true;
566 int ret;
338 567
339 mutex_lock(&dev->struct_mutex); 568 if (!i915_try_reset)
569 return 0;
340 570
341 /* 571 if (!mutex_trylock(&dev->struct_mutex))
342 * Clear request list 572 return -EBUSY;
343 */ 573
344 i915_gem_retire_requests(dev); 574 i915_gem_reset(dev);
345 575
346 if (need_display) 576 ret = -ENODEV;
347 i915_save_display(dev); 577 if (get_seconds() - dev_priv->last_gpu_reset < 5) {
348 578 DRM_ERROR("GPU hanging too fast, declaring wedged!\n");
349 if (IS_I965G(dev) || IS_G4X(dev)) { 579 } else switch (INTEL_INFO(dev)->gen) {
350 /* 580 case 7:
351 * Set the domains we want to reset, then the reset bit (bit 0). 581 case 6:
352 * Clear the reset bit after a while and wait for hardware status 582 ret = gen6_do_reset(dev, flags);
353 * bit (bit 1) to be set 583 /* If reset with a user forcewake, try to restore */
354 */ 584 if (atomic_read(&dev_priv->forcewake_count))
355 pci_read_config_byte(dev->pdev, GDRST, &gdrst); 585 __gen6_gt_force_wake_get(dev_priv);
356 pci_write_config_byte(dev->pdev, GDRST, gdrst | flags | ((flags == GDRST_FULL) ? 0x1 : 0x0)); 586 break;
357 udelay(50); 587 case 5:
358 pci_write_config_byte(dev->pdev, GDRST, gdrst & 0xfe); 588 ret = ironlake_do_reset(dev, flags);
359 589 break;
360 /* ...we don't want to loop forever though, 500ms should be plenty */ 590 case 4:
361 timeout = jiffies + msecs_to_jiffies(500); 591 ret = i965_do_reset(dev, flags);
362 do { 592 break;
363 udelay(100); 593 case 2:
364 pci_read_config_byte(dev->pdev, GDRST, &gdrst); 594 ret = i8xx_do_reset(dev, flags);
365 } while ((gdrst & 0x1) && time_after(timeout, jiffies)); 595 break;
366 596 }
367 if (gdrst & 0x1) { 597 dev_priv->last_gpu_reset = get_seconds();
368 WARN(true, "i915: Failed to reset chip\n"); 598 if (ret) {
369 mutex_unlock(&dev->struct_mutex); 599 DRM_ERROR("Failed to reset chip.\n");
370 return -EIO;
371 }
372 } else {
373 DRM_ERROR("Error occurred. Don't know how to reset this chip.\n");
374 mutex_unlock(&dev->struct_mutex); 600 mutex_unlock(&dev->struct_mutex);
375 return -ENODEV; 601 return ret;
376 } 602 }
377 603
378 /* Ok, now get things going again... */ 604 /* Ok, now get things going again... */
@@ -391,22 +617,34 @@ int i965_reset(struct drm_device *dev, u8 flags)
391 */ 617 */
392 if (drm_core_check_feature(dev, DRIVER_MODESET) || 618 if (drm_core_check_feature(dev, DRIVER_MODESET) ||
393 !dev_priv->mm.suspended) { 619 !dev_priv->mm.suspended) {
394 struct intel_ring_buffer *ring = &dev_priv->render_ring;
395 dev_priv->mm.suspended = 0; 620 dev_priv->mm.suspended = 0;
396 ring->init(dev, ring); 621
622 dev_priv->ring[RCS].init(&dev_priv->ring[RCS]);
623 if (HAS_BSD(dev))
624 dev_priv->ring[VCS].init(&dev_priv->ring[VCS]);
625 if (HAS_BLT(dev))
626 dev_priv->ring[BCS].init(&dev_priv->ring[BCS]);
627
397 mutex_unlock(&dev->struct_mutex); 628 mutex_unlock(&dev->struct_mutex);
398 drm_irq_uninstall(dev); 629 drm_irq_uninstall(dev);
630 drm_mode_config_reset(dev);
399 drm_irq_install(dev); 631 drm_irq_install(dev);
400 mutex_lock(&dev->struct_mutex); 632 mutex_lock(&dev->struct_mutex);
401 } 633 }
402 634
635 mutex_unlock(&dev->struct_mutex);
636
403 /* 637 /*
404 * Display needs restore too... 638 * Perform a full modeset as on later generations, e.g. Ironlake, we may
639 * need to retrain the display link and cannot just restore the register
640 * values.
405 */ 641 */
406 if (need_display) 642 if (need_display) {
407 i915_restore_display(dev); 643 mutex_lock(&dev->mode_config.mutex);
644 drm_helper_resume_force_mode(dev);
645 mutex_unlock(&dev->mode_config.mutex);
646 }
408 647
409 mutex_unlock(&dev->struct_mutex);
410 return 0; 648 return 0;
411} 649}
412 650
@@ -414,6 +652,14 @@ int i965_reset(struct drm_device *dev, u8 flags)
414static int __devinit 652static int __devinit
415i915_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) 653i915_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
416{ 654{
655 /* Only bind to function 0 of the device. Early generations
656 * used function 1 as a placeholder for multi-head. This causes
657 * us confusion instead, especially on the systems where both
658 * functions have the same PCI-ID!
659 */
660 if (PCI_FUNC(pdev->devfn))
661 return -ENODEV;
662
417 return drm_get_pci_dev(pdev, ent, &driver); 663 return drm_get_pci_dev(pdev, ent, &driver);
418} 664}
419 665
@@ -436,6 +682,9 @@ static int i915_pm_suspend(struct device *dev)
436 return -ENODEV; 682 return -ENODEV;
437 } 683 }
438 684
685 if (drm_dev->switch_power_state == DRM_SWITCH_POWER_OFF)
686 return 0;
687
439 error = i915_drm_freeze(drm_dev); 688 error = i915_drm_freeze(drm_dev);
440 if (error) 689 if (error)
441 return error; 690 return error;
@@ -517,15 +766,7 @@ static struct drm_driver driver = {
517 .resume = i915_resume, 766 .resume = i915_resume,
518 767
519 .device_is_agp = i915_driver_device_is_agp, 768 .device_is_agp = i915_driver_device_is_agp,
520 .enable_vblank = i915_enable_vblank,
521 .disable_vblank = i915_disable_vblank,
522 .irq_preinstall = i915_driver_irq_preinstall,
523 .irq_postinstall = i915_driver_irq_postinstall,
524 .irq_uninstall = i915_driver_irq_uninstall,
525 .irq_handler = i915_driver_irq_handler,
526 .reclaim_buffers = drm_core_reclaim_buffers, 769 .reclaim_buffers = drm_core_reclaim_buffers,
527 .get_map_ofs = drm_core_get_map_ofs,
528 .get_reg_ofs = drm_core_get_reg_ofs,
529 .master_create = i915_master_create, 770 .master_create = i915_master_create,
530 .master_destroy = i915_master_destroy, 771 .master_destroy = i915_master_destroy,
531#if defined(CONFIG_DEBUG_FS) 772#if defined(CONFIG_DEBUG_FS)
@@ -535,6 +776,9 @@ static struct drm_driver driver = {
535 .gem_init_object = i915_gem_init_object, 776 .gem_init_object = i915_gem_init_object,
536 .gem_free_object = i915_gem_free_object, 777 .gem_free_object = i915_gem_free_object,
537 .gem_vm_ops = &i915_gem_vm_ops, 778 .gem_vm_ops = &i915_gem_vm_ops,
779 .dumb_create = i915_gem_dumb_create,
780 .dumb_map_offset = i915_gem_mmap_gtt,
781 .dumb_destroy = i915_gem_dumb_destroy,
538 .ioctls = i915_ioctls, 782 .ioctls = i915_ioctls,
539 .fops = { 783 .fops = {
540 .owner = THIS_MODULE, 784 .owner = THIS_MODULE,
@@ -548,14 +792,7 @@ static struct drm_driver driver = {
548#ifdef CONFIG_COMPAT 792#ifdef CONFIG_COMPAT
549 .compat_ioctl = i915_compat_ioctl, 793 .compat_ioctl = i915_compat_ioctl,
550#endif 794#endif
551 }, 795 .llseek = noop_llseek,
552
553 .pci_driver = {
554 .name = DRIVER_NAME,
555 .id_table = pciidlist,
556 .probe = i915_pci_probe,
557 .remove = i915_pci_remove,
558 .driver.pm = &i915_pm_ops,
559 }, 796 },
560 797
561 .name = DRIVER_NAME, 798 .name = DRIVER_NAME,
@@ -566,6 +803,14 @@ static struct drm_driver driver = {
566 .patchlevel = DRIVER_PATCHLEVEL, 803 .patchlevel = DRIVER_PATCHLEVEL,
567}; 804};
568 805
806static struct pci_driver i915_pci_driver = {
807 .name = DRIVER_NAME,
808 .id_table = pciidlist,
809 .probe = i915_pci_probe,
810 .remove = i915_pci_remove,
811 .driver.pm = &i915_pm_ops,
812};
813
569static int __init i915_init(void) 814static int __init i915_init(void)
570{ 815{
571 if (!intel_agp_enabled) { 816 if (!intel_agp_enabled) {
@@ -575,8 +820,6 @@ static int __init i915_init(void)
575 820
576 driver.num_ioctls = i915_max_ioctl; 821 driver.num_ioctls = i915_max_ioctl;
577 822
578 i915_gem_shrinker_init();
579
580 /* 823 /*
581 * If CONFIG_DRM_I915_KMS is set, default to KMS unless 824 * If CONFIG_DRM_I915_KMS is set, default to KMS unless
582 * explicitly disabled with the module pararmeter. 825 * explicitly disabled with the module pararmeter.
@@ -598,18 +841,15 @@ static int __init i915_init(void)
598 driver.driver_features &= ~DRIVER_MODESET; 841 driver.driver_features &= ~DRIVER_MODESET;
599#endif 842#endif
600 843
601 if (!(driver.driver_features & DRIVER_MODESET)) { 844 if (!(driver.driver_features & DRIVER_MODESET))
602 driver.suspend = i915_suspend; 845 driver.get_vblank_timestamp = NULL;
603 driver.resume = i915_resume;
604 }
605 846
606 return drm_init(&driver); 847 return drm_pci_init(&driver, &i915_pci_driver);
607} 848}
608 849
609static void __exit i915_exit(void) 850static void __exit i915_exit(void)
610{ 851{
611 i915_gem_shrinker_exit(); 852 drm_pci_exit(&driver, &i915_pci_driver);
612 drm_exit(&driver);
613} 853}
614 854
615module_init(i915_init); 855module_init(i915_init);
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index af4a263cf257..ce7914c4c044 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -34,6 +34,8 @@
34#include "intel_bios.h" 34#include "intel_bios.h"
35#include "intel_ringbuffer.h" 35#include "intel_ringbuffer.h"
36#include <linux/io-mapping.h> 36#include <linux/io-mapping.h>
37#include <linux/i2c.h>
38#include <drm/intel-gtt.h>
37 39
38/* General customization: 40/* General customization:
39 */ 41 */
@@ -47,17 +49,22 @@
47enum pipe { 49enum pipe {
48 PIPE_A = 0, 50 PIPE_A = 0,
49 PIPE_B, 51 PIPE_B,
52 PIPE_C,
53 I915_MAX_PIPES
50}; 54};
55#define pipe_name(p) ((p) + 'A')
51 56
52enum plane { 57enum plane {
53 PLANE_A = 0, 58 PLANE_A = 0,
54 PLANE_B, 59 PLANE_B,
60 PLANE_C,
55}; 61};
56 62#define plane_name(p) ((p) + 'A')
57#define I915_NUM_PIPE 2
58 63
59#define I915_GEM_GPU_DOMAINS (~(I915_GEM_DOMAIN_CPU | I915_GEM_DOMAIN_GTT)) 64#define I915_GEM_GPU_DOMAINS (~(I915_GEM_DOMAIN_CPU | I915_GEM_DOMAIN_GTT))
60 65
66#define for_each_pipe(p) for ((p) = 0; (p) < dev_priv->num_pipe; (p)++)
67
61/* Interface history: 68/* Interface history:
62 * 69 *
63 * 1.1: Original. 70 * 1.1: Original.
@@ -73,12 +80,7 @@ enum plane {
73#define DRIVER_PATCHLEVEL 0 80#define DRIVER_PATCHLEVEL 0
74 81
75#define WATCH_COHERENCY 0 82#define WATCH_COHERENCY 0
76#define WATCH_BUF 0 83#define WATCH_LISTS 0
77#define WATCH_EXEC 0
78#define WATCH_LRU 0
79#define WATCH_RELOC 0
80#define WATCH_INACTIVE 0
81#define WATCH_PWRITE 0
82 84
83#define I915_GEM_PHYS_CURSOR_0 1 85#define I915_GEM_PHYS_CURSOR_0 1
84#define I915_GEM_PHYS_CURSOR_1 2 86#define I915_GEM_PHYS_CURSOR_1 2
@@ -89,7 +91,7 @@ struct drm_i915_gem_phys_object {
89 int id; 91 int id;
90 struct page **page_list; 92 struct page **page_list;
91 drm_dma_handle_t *handle; 93 drm_dma_handle_t *handle;
92 struct drm_gem_object *cur_obj; 94 struct drm_i915_gem_object *cur_obj;
93}; 95};
94 96
95struct mem_block { 97struct mem_block {
@@ -110,8 +112,10 @@ struct intel_opregion {
110 struct opregion_acpi *acpi; 112 struct opregion_acpi *acpi;
111 struct opregion_swsci *swsci; 113 struct opregion_swsci *swsci;
112 struct opregion_asle *asle; 114 struct opregion_asle *asle;
113 int enabled; 115 void *vbt;
116 u32 __iomem *lid_state;
114}; 117};
118#define OPREGION_SIZE (8*1024)
115 119
116struct intel_overlay; 120struct intel_overlay;
117struct intel_overlay_error_state; 121struct intel_overlay_error_state;
@@ -123,53 +127,72 @@ struct drm_i915_master_private {
123#define I915_FENCE_REG_NONE -1 127#define I915_FENCE_REG_NONE -1
124 128
125struct drm_i915_fence_reg { 129struct drm_i915_fence_reg {
126 struct drm_gem_object *obj;
127 struct list_head lru_list; 130 struct list_head lru_list;
131 struct drm_i915_gem_object *obj;
132 uint32_t setup_seqno;
128}; 133};
129 134
130struct sdvo_device_mapping { 135struct sdvo_device_mapping {
136 u8 initialized;
131 u8 dvo_port; 137 u8 dvo_port;
132 u8 slave_addr; 138 u8 slave_addr;
133 u8 dvo_wiring; 139 u8 dvo_wiring;
134 u8 initialized; 140 u8 i2c_pin;
141 u8 i2c_speed;
135 u8 ddc_pin; 142 u8 ddc_pin;
136}; 143};
137 144
145struct intel_display_error_state;
146
138struct drm_i915_error_state { 147struct drm_i915_error_state {
139 u32 eir; 148 u32 eir;
140 u32 pgtbl_er; 149 u32 pgtbl_er;
141 u32 pipeastat; 150 u32 pipestat[I915_MAX_PIPES];
142 u32 pipebstat;
143 u32 ipeir; 151 u32 ipeir;
144 u32 ipehr; 152 u32 ipehr;
145 u32 instdone; 153 u32 instdone;
146 u32 acthd; 154 u32 acthd;
155 u32 error; /* gen6+ */
156 u32 bcs_acthd; /* gen6+ blt engine */
157 u32 bcs_ipehr;
158 u32 bcs_ipeir;
159 u32 bcs_instdone;
160 u32 bcs_seqno;
161 u32 vcs_acthd; /* gen6+ bsd engine */
162 u32 vcs_ipehr;
163 u32 vcs_ipeir;
164 u32 vcs_instdone;
165 u32 vcs_seqno;
147 u32 instpm; 166 u32 instpm;
148 u32 instps; 167 u32 instps;
149 u32 instdone1; 168 u32 instdone1;
150 u32 seqno; 169 u32 seqno;
151 u64 bbaddr; 170 u64 bbaddr;
171 u64 fence[16];
152 struct timeval time; 172 struct timeval time;
153 struct drm_i915_error_object { 173 struct drm_i915_error_object {
154 int page_count; 174 int page_count;
155 u32 gtt_offset; 175 u32 gtt_offset;
156 u32 *pages[0]; 176 u32 *pages[0];
157 } *ringbuffer, *batchbuffer[2]; 177 } *ringbuffer[I915_NUM_RINGS], *batchbuffer[I915_NUM_RINGS];
158 struct drm_i915_error_buffer { 178 struct drm_i915_error_buffer {
159 size_t size; 179 u32 size;
160 u32 name; 180 u32 name;
161 u32 seqno; 181 u32 seqno;
162 u32 gtt_offset; 182 u32 gtt_offset;
163 u32 read_domains; 183 u32 read_domains;
164 u32 write_domain; 184 u32 write_domain;
165 u32 fence_reg; 185 s32 fence_reg:5;
166 s32 pinned:2; 186 s32 pinned:2;
167 u32 tiling:2; 187 u32 tiling:2;
168 u32 dirty:1; 188 u32 dirty:1;
169 u32 purgeable:1; 189 u32 purgeable:1;
170 } *active_bo; 190 u32 ring:4;
171 u32 active_bo_count; 191 u32 cache_level:2;
192 } *active_bo, *pinned_bo;
193 u32 active_bo_count, pinned_bo_count;
172 struct intel_overlay_error_state *overlay; 194 struct intel_overlay_error_state *overlay;
195 struct intel_display_error_state *display;
173}; 196};
174 197
175struct drm_i915_display_funcs { 198struct drm_i915_display_funcs {
@@ -179,48 +202,58 @@ struct drm_i915_display_funcs {
179 void (*disable_fbc)(struct drm_device *dev); 202 void (*disable_fbc)(struct drm_device *dev);
180 int (*get_display_clock_speed)(struct drm_device *dev); 203 int (*get_display_clock_speed)(struct drm_device *dev);
181 int (*get_fifo_size)(struct drm_device *dev, int plane); 204 int (*get_fifo_size)(struct drm_device *dev, int plane);
182 void (*update_wm)(struct drm_device *dev, int planea_clock, 205 void (*update_wm)(struct drm_device *dev);
183 int planeb_clock, int sr_hdisplay, int sr_htotal, 206 int (*crtc_mode_set)(struct drm_crtc *crtc,
184 int pixel_size); 207 struct drm_display_mode *mode,
208 struct drm_display_mode *adjusted_mode,
209 int x, int y,
210 struct drm_framebuffer *old_fb);
211 void (*fdi_link_train)(struct drm_crtc *crtc);
212 void (*init_clock_gating)(struct drm_device *dev);
213 void (*init_pch_clock_gating)(struct drm_device *dev);
214 int (*queue_flip)(struct drm_device *dev, struct drm_crtc *crtc,
215 struct drm_framebuffer *fb,
216 struct drm_i915_gem_object *obj);
185 /* clock updates for mode set */ 217 /* clock updates for mode set */
186 /* cursor updates */ 218 /* cursor updates */
187 /* render clock increase/decrease */ 219 /* render clock increase/decrease */
188 /* display clock increase/decrease */ 220 /* display clock increase/decrease */
189 /* pll clock increase/decrease */ 221 /* pll clock increase/decrease */
190 /* clock gating init */
191}; 222};
192 223
193struct intel_device_info { 224struct intel_device_info {
194 u8 gen; 225 u8 gen;
195 u8 is_mobile : 1; 226 u8 is_mobile : 1;
196 u8 is_i8xx : 1;
197 u8 is_i85x : 1; 227 u8 is_i85x : 1;
198 u8 is_i915g : 1; 228 u8 is_i915g : 1;
199 u8 is_i9xx : 1;
200 u8 is_i945gm : 1; 229 u8 is_i945gm : 1;
201 u8 is_i965g : 1;
202 u8 is_i965gm : 1;
203 u8 is_g33 : 1; 230 u8 is_g33 : 1;
204 u8 need_gfx_hws : 1; 231 u8 need_gfx_hws : 1;
205 u8 is_g4x : 1; 232 u8 is_g4x : 1;
206 u8 is_pineview : 1; 233 u8 is_pineview : 1;
207 u8 is_broadwater : 1; 234 u8 is_broadwater : 1;
208 u8 is_crestline : 1; 235 u8 is_crestline : 1;
209 u8 is_ironlake : 1; 236 u8 is_ivybridge : 1;
210 u8 has_fbc : 1; 237 u8 has_fbc : 1;
211 u8 has_rc6 : 1;
212 u8 has_pipe_cxsr : 1; 238 u8 has_pipe_cxsr : 1;
213 u8 has_hotplug : 1; 239 u8 has_hotplug : 1;
214 u8 cursor_needs_physical : 1; 240 u8 cursor_needs_physical : 1;
241 u8 has_overlay : 1;
242 u8 overlay_needs_physical : 1;
243 u8 supports_tv : 1;
244 u8 has_bsd_ring : 1;
245 u8 has_blt_ring : 1;
215}; 246};
216 247
217enum no_fbc_reason { 248enum no_fbc_reason {
249 FBC_NO_OUTPUT, /* no outputs enabled to compress */
218 FBC_STOLEN_TOO_SMALL, /* not enough space to hold compressed buffers */ 250 FBC_STOLEN_TOO_SMALL, /* not enough space to hold compressed buffers */
219 FBC_UNSUPPORTED_MODE, /* interlace or doublescanned mode */ 251 FBC_UNSUPPORTED_MODE, /* interlace or doublescanned mode */
220 FBC_MODE_TOO_LARGE, /* mode too large for compression */ 252 FBC_MODE_TOO_LARGE, /* mode too large for compression */
221 FBC_BAD_PLANE, /* fbc not supported on plane */ 253 FBC_BAD_PLANE, /* fbc not supported on plane */
222 FBC_NOT_TILED, /* buffer not tiled */ 254 FBC_NOT_TILED, /* buffer not tiled */
223 FBC_MULTIPLE_PIPES, /* more than one pipe active */ 255 FBC_MULTIPLE_PIPES, /* more than one pipe active */
256 FBC_MODULE_PARAM,
224}; 257};
225 258
226enum intel_pch { 259enum intel_pch {
@@ -229,6 +262,7 @@ enum intel_pch {
229}; 262};
230 263
231#define QUIRK_PIPEA_FORCE (1<<0) 264#define QUIRK_PIPEA_FORCE (1<<0)
265#define QUIRK_LVDS_SSC_DISABLE (1<<1)
232 266
233struct intel_fbdev; 267struct intel_fbdev;
234 268
@@ -238,23 +272,25 @@ typedef struct drm_i915_private {
238 const struct intel_device_info *info; 272 const struct intel_device_info *info;
239 273
240 int has_gem; 274 int has_gem;
275 int relative_constants_mode;
241 276
242 void __iomem *regs; 277 void __iomem *regs;
243 278
279 struct intel_gmbus {
280 struct i2c_adapter adapter;
281 struct i2c_adapter *force_bit;
282 u32 reg0;
283 } *gmbus;
284
244 struct pci_dev *bridge_dev; 285 struct pci_dev *bridge_dev;
245 struct intel_ring_buffer render_ring; 286 struct intel_ring_buffer ring[I915_NUM_RINGS];
246 struct intel_ring_buffer bsd_ring;
247 uint32_t next_seqno; 287 uint32_t next_seqno;
248 288
249 drm_dma_handle_t *status_page_dmah; 289 drm_dma_handle_t *status_page_dmah;
250 void *seqno_page;
251 dma_addr_t dma_status_page;
252 uint32_t counter; 290 uint32_t counter;
253 unsigned int seqno_gfx_addr;
254 drm_local_map_t hws_map; 291 drm_local_map_t hws_map;
255 struct drm_gem_object *seqno_obj; 292 struct drm_i915_gem_object *pwrctx;
256 struct drm_gem_object *pwrctx; 293 struct drm_i915_gem_object *renderctx;
257 struct drm_gem_object *renderctx;
258 294
259 struct resource mch_res; 295 struct resource mch_res;
260 296
@@ -264,21 +300,15 @@ typedef struct drm_i915_private {
264 int current_page; 300 int current_page;
265 int page_flipping; 301 int page_flipping;
266 302
267 wait_queue_head_t irq_queue;
268 atomic_t irq_received; 303 atomic_t irq_received;
269 /** Protects user_irq_refcount and irq_mask_reg */ 304
270 spinlock_t user_irq_lock; 305 /* protects the irq masks */
271 u32 trace_irq_seqno; 306 spinlock_t irq_lock;
272 /** Cached value of IMR to avoid reads in updating the bitfield */ 307 /** Cached value of IMR to avoid reads in updating the bitfield */
273 u32 irq_mask_reg;
274 u32 pipestat[2]; 308 u32 pipestat[2];
275 /** splitted irq regs for graphics and display engine on Ironlake, 309 u32 irq_mask;
276 irq_mask_reg is still used for display irq. */ 310 u32 gt_irq_mask;
277 u32 gt_irq_mask_reg; 311 u32 pch_irq_mask;
278 u32 gt_irq_enable_reg;
279 u32 de_irq_enable_reg;
280 u32 pch_irq_mask_reg;
281 u32 pch_irq_enable_reg;
282 312
283 u32 hotplug_supported_mask; 313 u32 hotplug_supported_mask;
284 struct work_struct hotplug_work; 314 struct work_struct hotplug_work;
@@ -289,26 +319,21 @@ typedef struct drm_i915_private {
289 unsigned int sr01, adpa, ppcr, dvob, dvoc, lvds; 319 unsigned int sr01, adpa, ppcr, dvob, dvoc, lvds;
290 int vblank_pipe; 320 int vblank_pipe;
291 int num_pipe; 321 int num_pipe;
292 u32 flush_rings;
293#define FLUSH_RENDER_RING 0x1
294#define FLUSH_BSD_RING 0x2
295 322
296 /* For hangcheck timer */ 323 /* For hangcheck timer */
297#define DRM_I915_HANGCHECK_PERIOD 75 /* in jiffies */ 324#define DRM_I915_HANGCHECK_PERIOD 1500 /* in ms */
298 struct timer_list hangcheck_timer; 325 struct timer_list hangcheck_timer;
299 int hangcheck_count; 326 int hangcheck_count;
300 uint32_t last_acthd; 327 uint32_t last_acthd;
301 uint32_t last_instdone; 328 uint32_t last_instdone;
302 uint32_t last_instdone1; 329 uint32_t last_instdone1;
303 330
304 struct drm_mm vram;
305
306 unsigned long cfb_size; 331 unsigned long cfb_size;
307 unsigned long cfb_pitch; 332 unsigned long cfb_pitch;
333 unsigned long cfb_offset;
308 int cfb_fence; 334 int cfb_fence;
309 int cfb_plane; 335 int cfb_plane;
310 336 int cfb_y;
311 int irq_enabled;
312 337
313 struct intel_opregion opregion; 338 struct intel_opregion opregion;
314 339
@@ -316,8 +341,8 @@ typedef struct drm_i915_private {
316 struct intel_overlay *overlay; 341 struct intel_overlay *overlay;
317 342
318 /* LVDS info */ 343 /* LVDS info */
319 int backlight_duty_cycle; /* restore backlight to this value */ 344 int backlight_level; /* restore backlight to this value */
320 bool panel_wants_dither; 345 bool backlight_enabled;
321 struct drm_display_mode *panel_fixed_mode; 346 struct drm_display_mode *panel_fixed_mode;
322 struct drm_display_mode *lfp_lvds_vbt_mode; /* if any */ 347 struct drm_display_mode *lfp_lvds_vbt_mode; /* if any */
323 struct drm_display_mode *sdvo_lvds_vbt_mode; /* if any */ 348 struct drm_display_mode *sdvo_lvds_vbt_mode; /* if any */
@@ -328,13 +353,23 @@ typedef struct drm_i915_private {
328 unsigned int lvds_vbt:1; 353 unsigned int lvds_vbt:1;
329 unsigned int int_crt_support:1; 354 unsigned int int_crt_support:1;
330 unsigned int lvds_use_ssc:1; 355 unsigned int lvds_use_ssc:1;
331 unsigned int edp_support:1;
332 int lvds_ssc_freq; 356 int lvds_ssc_freq;
333 int edp_bpp; 357 struct {
358 int rate;
359 int lanes;
360 int preemphasis;
361 int vswing;
362
363 bool initialized;
364 bool support;
365 int bpp;
366 struct edp_power_seq pps;
367 } edp;
368 bool no_aux_handshake;
334 369
335 struct notifier_block lid_notifier; 370 struct notifier_block lid_notifier;
336 371
337 int crt_ddc_bus; /* 0 = unknown, else GPIO to use for CRT DDC */ 372 int crt_ddc_pin;
338 struct drm_i915_fence_reg fence_regs[16]; /* assume 965 */ 373 struct drm_i915_fence_reg fence_regs[16]; /* assume 965 */
339 int fence_reg_start; /* 4 if userland hasn't ioctl'd us yet */ 374 int fence_reg_start; /* 4 if userland hasn't ioctl'd us yet */
340 int num_fence_regs; /* 8 on pre-965, 16 otherwise */ 375 int num_fence_regs; /* 8 on pre-965, 16 otherwise */
@@ -344,6 +379,7 @@ typedef struct drm_i915_private {
344 spinlock_t error_lock; 379 spinlock_t error_lock;
345 struct drm_i915_error_state *first_error; 380 struct drm_i915_error_state *first_error;
346 struct work_struct error_work; 381 struct work_struct error_work;
382 struct completion error_completion;
347 struct workqueue_struct *wq; 383 struct workqueue_struct *wq;
348 384
349 /* Display functions */ 385 /* Display functions */
@@ -507,21 +543,36 @@ typedef struct drm_i915_private {
507 u32 saveMCHBAR_RENDER_STANDBY; 543 u32 saveMCHBAR_RENDER_STANDBY;
508 544
509 struct { 545 struct {
546 /** Bridge to intel-gtt-ko */
547 const struct intel_gtt *gtt;
548 /** Memory allocator for GTT stolen memory */
549 struct drm_mm stolen;
550 /** Memory allocator for GTT */
510 struct drm_mm gtt_space; 551 struct drm_mm gtt_space;
552 /** List of all objects in gtt_space. Used to restore gtt
553 * mappings on resume */
554 struct list_head gtt_list;
555
556 /** Usable portion of the GTT for GEM */
557 unsigned long gtt_start;
558 unsigned long gtt_mappable_end;
559 unsigned long gtt_end;
511 560
512 struct io_mapping *gtt_mapping; 561 struct io_mapping *gtt_mapping;
513 int gtt_mtrr; 562 int gtt_mtrr;
514 563
564 struct shrinker inactive_shrinker;
565
515 /** 566 /**
516 * Membership on list of all loaded devices, used to evict 567 * List of objects currently involved in rendering.
517 * inactive buffers under memory pressure.
518 * 568 *
519 * Modifications should only be done whilst holding the 569 * Includes buffers having the contents of their GPU caches
520 * shrink_list_lock spinlock. 570 * flushed, not necessarily primitives. last_rendering_seqno
571 * represents when the rendering involved will be completed.
572 *
573 * A reference is held on the buffer while on this list.
521 */ 574 */
522 struct list_head shrink_list; 575 struct list_head active_list;
523
524 spinlock_t active_list_lock;
525 576
526 /** 577 /**
527 * List of objects which are not in the ringbuffer but which 578 * List of objects which are not in the ringbuffer but which
@@ -535,15 +586,6 @@ typedef struct drm_i915_private {
535 struct list_head flushing_list; 586 struct list_head flushing_list;
536 587
537 /** 588 /**
538 * List of objects currently pending a GPU write flush.
539 *
540 * All elements on this list will belong to either the
541 * active_list or flushing_list, last_rendering_seqno can
542 * be used to differentiate between the two elements.
543 */
544 struct list_head gpu_write_list;
545
546 /**
547 * LRU list of objects which are not in the ringbuffer and 589 * LRU list of objects which are not in the ringbuffer and
548 * are ready to unbind, but are still in the GTT. 590 * are ready to unbind, but are still in the GTT.
549 * 591 *
@@ -555,6 +597,12 @@ typedef struct drm_i915_private {
555 */ 597 */
556 struct list_head inactive_list; 598 struct list_head inactive_list;
557 599
600 /**
601 * LRU list of objects which are not in the ringbuffer but
602 * are still pinned in the GTT.
603 */
604 struct list_head pinned_list;
605
558 /** LRU list of objects with fence regs on them. */ 606 /** LRU list of objects with fence regs on them. */
559 struct list_head fence_list; 607 struct list_head fence_list;
560 608
@@ -576,14 +624,10 @@ typedef struct drm_i915_private {
576 struct delayed_work retire_work; 624 struct delayed_work retire_work;
577 625
578 /** 626 /**
579 * Waiting sequence number, if any 627 * Are we in a non-interruptible section of code like
580 */ 628 * modesetting?
581 uint32_t waiting_gem_seqno;
582
583 /**
584 * Last seq seen at irq time
585 */ 629 */
586 uint32_t irq_gem_seqno; 630 bool interruptible;
587 631
588 /** 632 /**
589 * Flag if the X Server, and thus DRM, is not currently in 633 * Flag if the X Server, and thus DRM, is not currently in
@@ -599,7 +643,7 @@ typedef struct drm_i915_private {
599 * Flag if the hardware appears to be wedged. 643 * Flag if the hardware appears to be wedged.
600 * 644 *
601 * This is set when attempts to idle the device timeout. 645 * This is set when attempts to idle the device timeout.
602 * It prevents command submission from occuring and makes 646 * It prevents command submission from occurring and makes
603 * every pending request fail 647 * every pending request fail
604 */ 648 */
605 atomic_t wedged; 649 atomic_t wedged;
@@ -611,12 +655,19 @@ typedef struct drm_i915_private {
611 655
612 /* storage for physical objects */ 656 /* storage for physical objects */
613 struct drm_i915_gem_phys_object *phys_objs[I915_MAX_PHYS_OBJECT]; 657 struct drm_i915_gem_phys_object *phys_objs[I915_MAX_PHYS_OBJECT];
658
659 /* accounting, useful for userland debugging */
660 size_t gtt_total;
661 size_t mappable_gtt_total;
662 size_t object_memory;
663 u32 object_count;
614 } mm; 664 } mm;
615 struct sdvo_device_mapping sdvo_mappings[2]; 665 struct sdvo_device_mapping sdvo_mappings[2];
616 /* indicate whether the LVDS_BORDER should be enabled or not */ 666 /* indicate whether the LVDS_BORDER should be enabled or not */
617 unsigned int lvds_border_bits; 667 unsigned int lvds_border_bits;
618 /* Panel fitter placement and size for Ironlake+ */ 668 /* Panel fitter placement and size for Ironlake+ */
619 u32 pch_pf_pos, pch_pf_size; 669 u32 pch_pf_pos, pch_pf_size;
670 int panel_t3, panel_t12;
620 671
621 struct drm_crtc *plane_to_crtc_mapping[2]; 672 struct drm_crtc *plane_to_crtc_mapping[2];
622 struct drm_crtc *pipe_to_crtc_mapping[2]; 673 struct drm_crtc *pipe_to_crtc_mapping[2];
@@ -626,8 +677,6 @@ typedef struct drm_i915_private {
626 /* Reclocking support */ 677 /* Reclocking support */
627 bool render_reclock_avail; 678 bool render_reclock_avail;
628 bool lvds_downclock_avail; 679 bool lvds_downclock_avail;
629 /* indicate whether the LVDS EDID is OK */
630 bool lvds_edid_good;
631 /* indicates the reduced downclock for LVDS*/ 680 /* indicates the reduced downclock for LVDS*/
632 int lvds_downclock; 681 int lvds_downclock;
633 struct work_struct idle_work; 682 struct work_struct idle_work;
@@ -640,20 +689,24 @@ typedef struct drm_i915_private {
640 689
641 bool mchbar_need_disable; 690 bool mchbar_need_disable;
642 691
692 struct work_struct rps_work;
693 spinlock_t rps_lock;
694 u32 pm_iir;
695
643 u8 cur_delay; 696 u8 cur_delay;
644 u8 min_delay; 697 u8 min_delay;
645 u8 max_delay; 698 u8 max_delay;
646 u8 fmax; 699 u8 fmax;
647 u8 fstart; 700 u8 fstart;
648 701
649 u64 last_count1; 702 u64 last_count1;
650 unsigned long last_time1; 703 unsigned long last_time1;
651 u64 last_count2; 704 u64 last_count2;
652 struct timespec last_time2; 705 struct timespec last_time2;
653 unsigned long gfx_power; 706 unsigned long gfx_power;
654 int c_m; 707 int c_m;
655 int r_t; 708 int r_t;
656 u8 corr; 709 u8 corr;
657 spinlock_t *mchdev_lock; 710 spinlock_t *mchdev_lock;
658 711
659 enum no_fbc_reason no_fbc_reason; 712 enum no_fbc_reason no_fbc_reason;
@@ -661,23 +714,37 @@ typedef struct drm_i915_private {
661 struct drm_mm_node *compressed_fb; 714 struct drm_mm_node *compressed_fb;
662 struct drm_mm_node *compressed_llb; 715 struct drm_mm_node *compressed_llb;
663 716
717 unsigned long last_gpu_reset;
718
664 /* list of fbdev register on this device */ 719 /* list of fbdev register on this device */
665 struct intel_fbdev *fbdev; 720 struct intel_fbdev *fbdev;
721
722 struct drm_property *broadcast_rgb_property;
723 struct drm_property *force_audio_property;
724
725 atomic_t forcewake_count;
666} drm_i915_private_t; 726} drm_i915_private_t;
667 727
668/** driver private structure attached to each drm_gem_object */ 728enum i915_cache_level {
729 I915_CACHE_NONE,
730 I915_CACHE_LLC,
731 I915_CACHE_LLC_MLC, /* gen6+ */
732};
733
669struct drm_i915_gem_object { 734struct drm_i915_gem_object {
670 struct drm_gem_object base; 735 struct drm_gem_object base;
671 736
672 /** Current space allocated to this object in the GTT, if any. */ 737 /** Current space allocated to this object in the GTT, if any. */
673 struct drm_mm_node *gtt_space; 738 struct drm_mm_node *gtt_space;
739 struct list_head gtt_list;
674 740
675 /** This object's place on the active/flushing/inactive lists */ 741 /** This object's place on the active/flushing/inactive lists */
676 struct list_head list; 742 struct list_head ring_list;
743 struct list_head mm_list;
677 /** This object's place on GPU write list */ 744 /** This object's place on GPU write list */
678 struct list_head gpu_write_list; 745 struct list_head gpu_write_list;
679 /** This object's place on eviction list */ 746 /** This object's place in the batchbuffer or on the eviction list */
680 struct list_head evict_list; 747 struct list_head exec_list;
681 748
682 /** 749 /**
683 * This is set if the object is on the active or flushing lists 750 * This is set if the object is on the active or flushing lists
@@ -693,6 +760,12 @@ struct drm_i915_gem_object {
693 unsigned int dirty : 1; 760 unsigned int dirty : 1;
694 761
695 /** 762 /**
763 * This is set if the object has been written to since the last
764 * GPU flush.
765 */
766 unsigned int pending_gpu_write : 1;
767
768 /**
696 * Fence register bits (if any) for this object. Will be set 769 * Fence register bits (if any) for this object. Will be set
697 * as needed when mapped into the GTT. 770 * as needed when mapped into the GTT.
698 * Protected by dev->struct_mutex. 771 * Protected by dev->struct_mutex.
@@ -702,29 +775,15 @@ struct drm_i915_gem_object {
702 signed int fence_reg : 5; 775 signed int fence_reg : 5;
703 776
704 /** 777 /**
705 * Used for checking the object doesn't appear more than once
706 * in an execbuffer object list.
707 */
708 unsigned int in_execbuffer : 1;
709
710 /**
711 * Advice: are the backing pages purgeable? 778 * Advice: are the backing pages purgeable?
712 */ 779 */
713 unsigned int madv : 2; 780 unsigned int madv : 2;
714 781
715 /** 782 /**
716 * Refcount for the pages array. With the current locking scheme, there
717 * are at most two concurrent users: Binding a bo to the gtt and
718 * pwrite/pread using physical addresses. So two bits for a maximum
719 * of two users are enough.
720 */
721 unsigned int pages_refcount : 2;
722#define DRM_I915_GEM_OBJECT_MAX_PAGES_REFCOUNT 0x3
723
724 /**
725 * Current tiling mode for the object. 783 * Current tiling mode for the object.
726 */ 784 */
727 unsigned int tiling_mode : 2; 785 unsigned int tiling_mode : 2;
786 unsigned int tiling_changed : 1;
728 787
729 /** How many users have pinned this object in GTT space. The following 788 /** How many users have pinned this object in GTT space. The following
730 * users can each hold at most one reference: pwrite/pread, pin_ioctl 789 * users can each hold at most one reference: pwrite/pread, pin_ioctl
@@ -738,28 +797,57 @@ struct drm_i915_gem_object {
738 unsigned int pin_count : 4; 797 unsigned int pin_count : 4;
739#define DRM_I915_GEM_OBJECT_MAX_PIN_COUNT 0xf 798#define DRM_I915_GEM_OBJECT_MAX_PIN_COUNT 0xf
740 799
741 /** AGP memory structure for our GTT binding. */ 800 /**
742 DRM_AGP_MEM *agp_mem; 801 * Is the object at the current location in the gtt mappable and
802 * fenceable? Used to avoid costly recalculations.
803 */
804 unsigned int map_and_fenceable : 1;
805
806 /**
807 * Whether the current gtt mapping needs to be mappable (and isn't just
808 * mappable by accident). Track pin and fault separate for a more
809 * accurate mappable working set.
810 */
811 unsigned int fault_mappable : 1;
812 unsigned int pin_mappable : 1;
813
814 /*
815 * Is the GPU currently using a fence to access this buffer,
816 */
817 unsigned int pending_fenced_gpu_access:1;
818 unsigned int fenced_gpu_access:1;
819
820 unsigned int cache_level:2;
743 821
744 struct page **pages; 822 struct page **pages;
745 823
746 /** 824 /**
747 * Current offset of the object in GTT space. 825 * DMAR support
748 *
749 * This is the same as gtt_space->start
750 */ 826 */
751 uint32_t gtt_offset; 827 struct scatterlist *sg_list;
828 int num_sg;
752 829
753 /* Which ring is refering to is this object */ 830 /**
754 struct intel_ring_buffer *ring; 831 * Used for performing relocations during execbuffer insertion.
832 */
833 struct hlist_node exec_node;
834 unsigned long exec_handle;
835 struct drm_i915_gem_exec_object2 *exec_entry;
755 836
756 /** 837 /**
757 * Fake offset for use by mmap(2) 838 * Current offset of the object in GTT space.
839 *
840 * This is the same as gtt_space->start
758 */ 841 */
759 uint64_t mmap_offset; 842 uint32_t gtt_offset;
760 843
761 /** Breadcrumb of last rendering to the buffer. */ 844 /** Breadcrumb of last rendering to the buffer. */
762 uint32_t last_rendering_seqno; 845 uint32_t last_rendering_seqno;
846 struct intel_ring_buffer *ring;
847
848 /** Breadcrumb of last fenced GPU access to the buffer. */
849 uint32_t last_fenced_seqno;
850 struct intel_ring_buffer *last_fenced_ring;
763 851
764 /** Current tiling stride for the object, if it's tiled. */ 852 /** Current tiling stride for the object, if it's tiled. */
765 uint32_t stride; 853 uint32_t stride;
@@ -767,8 +855,6 @@ struct drm_i915_gem_object {
767 /** Record of address bit 17 of each page at last unbind. */ 855 /** Record of address bit 17 of each page at last unbind. */
768 unsigned long *bit_17; 856 unsigned long *bit_17;
769 857
770 /** AGP mapping type (AGP_USER_MEMORY or AGP_USER_CACHED_MEMORY */
771 uint32_t agp_type;
772 858
773 /** 859 /**
774 * If present, while GEM_DOMAIN_CPU is in the read domain this array 860 * If present, while GEM_DOMAIN_CPU is in the read domain this array
@@ -816,33 +902,102 @@ struct drm_i915_gem_request {
816 /** global list entry for this request */ 902 /** global list entry for this request */
817 struct list_head list; 903 struct list_head list;
818 904
905 struct drm_i915_file_private *file_priv;
819 /** file_priv list entry for this request */ 906 /** file_priv list entry for this request */
820 struct list_head client_list; 907 struct list_head client_list;
821}; 908};
822 909
823struct drm_i915_file_private { 910struct drm_i915_file_private {
824 struct { 911 struct {
912 struct spinlock lock;
825 struct list_head request_list; 913 struct list_head request_list;
826 } mm; 914 } mm;
827}; 915};
828 916
829enum intel_chip_family { 917#define INTEL_INFO(dev) (((struct drm_i915_private *) (dev)->dev_private)->info)
830 CHIP_I8XX = 0x01, 918
831 CHIP_I9XX = 0x02, 919#define IS_I830(dev) ((dev)->pci_device == 0x3577)
832 CHIP_I915 = 0x04, 920#define IS_845G(dev) ((dev)->pci_device == 0x2562)
833 CHIP_I965 = 0x08, 921#define IS_I85X(dev) (INTEL_INFO(dev)->is_i85x)
834}; 922#define IS_I865G(dev) ((dev)->pci_device == 0x2572)
923#define IS_I915G(dev) (INTEL_INFO(dev)->is_i915g)
924#define IS_I915GM(dev) ((dev)->pci_device == 0x2592)
925#define IS_I945G(dev) ((dev)->pci_device == 0x2772)
926#define IS_I945GM(dev) (INTEL_INFO(dev)->is_i945gm)
927#define IS_BROADWATER(dev) (INTEL_INFO(dev)->is_broadwater)
928#define IS_CRESTLINE(dev) (INTEL_INFO(dev)->is_crestline)
929#define IS_GM45(dev) ((dev)->pci_device == 0x2A42)
930#define IS_G4X(dev) (INTEL_INFO(dev)->is_g4x)
931#define IS_PINEVIEW_G(dev) ((dev)->pci_device == 0xa001)
932#define IS_PINEVIEW_M(dev) ((dev)->pci_device == 0xa011)
933#define IS_PINEVIEW(dev) (INTEL_INFO(dev)->is_pineview)
934#define IS_G33(dev) (INTEL_INFO(dev)->is_g33)
935#define IS_IRONLAKE_D(dev) ((dev)->pci_device == 0x0042)
936#define IS_IRONLAKE_M(dev) ((dev)->pci_device == 0x0046)
937#define IS_IVYBRIDGE(dev) (INTEL_INFO(dev)->is_ivybridge)
938#define IS_MOBILE(dev) (INTEL_INFO(dev)->is_mobile)
939
940/*
941 * The genX designation typically refers to the render engine, so render
942 * capability related checks should use IS_GEN, while display and other checks
943 * have their own (e.g. HAS_PCH_SPLIT for ILK+ display, IS_foo for particular
944 * chips, etc.).
945 */
946#define IS_GEN2(dev) (INTEL_INFO(dev)->gen == 2)
947#define IS_GEN3(dev) (INTEL_INFO(dev)->gen == 3)
948#define IS_GEN4(dev) (INTEL_INFO(dev)->gen == 4)
949#define IS_GEN5(dev) (INTEL_INFO(dev)->gen == 5)
950#define IS_GEN6(dev) (INTEL_INFO(dev)->gen == 6)
951#define IS_GEN7(dev) (INTEL_INFO(dev)->gen == 7)
952
953#define HAS_BSD(dev) (INTEL_INFO(dev)->has_bsd_ring)
954#define HAS_BLT(dev) (INTEL_INFO(dev)->has_blt_ring)
955#define I915_NEED_GFX_HWS(dev) (INTEL_INFO(dev)->need_gfx_hws)
956
957#define HAS_OVERLAY(dev) (INTEL_INFO(dev)->has_overlay)
958#define OVERLAY_NEEDS_PHYSICAL(dev) (INTEL_INFO(dev)->overlay_needs_physical)
959
960/* With the 945 and later, Y tiling got adjusted so that it was 32 128-byte
961 * rows, which changed the alignment requirements and fence programming.
962 */
963#define HAS_128_BYTE_Y_TILING(dev) (!IS_GEN2(dev) && !(IS_I915G(dev) || \
964 IS_I915GM(dev)))
965#define SUPPORTS_DIGITAL_OUTPUTS(dev) (!IS_GEN2(dev) && !IS_PINEVIEW(dev))
966#define SUPPORTS_INTEGRATED_HDMI(dev) (IS_G4X(dev) || IS_GEN5(dev))
967#define SUPPORTS_INTEGRATED_DP(dev) (IS_G4X(dev) || IS_GEN5(dev))
968#define SUPPORTS_EDP(dev) (IS_IRONLAKE_M(dev))
969#define SUPPORTS_TV(dev) (INTEL_INFO(dev)->supports_tv)
970#define I915_HAS_HOTPLUG(dev) (INTEL_INFO(dev)->has_hotplug)
971/* dsparb controlled by hw only */
972#define DSPARB_HWCONTROL(dev) (IS_G4X(dev) || IS_IRONLAKE(dev))
973
974#define HAS_FW_BLC(dev) (INTEL_INFO(dev)->gen > 2)
975#define HAS_PIPE_CXSR(dev) (INTEL_INFO(dev)->has_pipe_cxsr)
976#define I915_HAS_FBC(dev) (INTEL_INFO(dev)->has_fbc)
977
978#define HAS_PCH_SPLIT(dev) (IS_GEN5(dev) || IS_GEN6(dev) || IS_IVYBRIDGE(dev))
979#define HAS_PIPE_CONTROL(dev) (INTEL_INFO(dev)->gen >= 5)
980
981#define INTEL_PCH_TYPE(dev) (((struct drm_i915_private *)(dev)->dev_private)->pch_type)
982#define HAS_PCH_CPT(dev) (INTEL_PCH_TYPE(dev) == PCH_CPT)
983#define HAS_PCH_IBX(dev) (INTEL_PCH_TYPE(dev) == PCH_IBX)
984
985#include "i915_trace.h"
835 986
836extern struct drm_ioctl_desc i915_ioctls[]; 987extern struct drm_ioctl_desc i915_ioctls[];
837extern int i915_max_ioctl; 988extern int i915_max_ioctl;
838extern unsigned int i915_fbpercrtc; 989extern unsigned int i915_fbpercrtc;
990extern int i915_panel_ignore_lid;
839extern unsigned int i915_powersave; 991extern unsigned int i915_powersave;
992extern unsigned int i915_semaphores;
840extern unsigned int i915_lvds_downclock; 993extern unsigned int i915_lvds_downclock;
994extern unsigned int i915_panel_use_ssc;
995extern int i915_vbt_sdvo_panel_type;
996extern unsigned int i915_enable_rc6;
997extern unsigned int i915_enable_fbc;
841 998
842extern int i915_suspend(struct drm_device *dev, pm_message_t state); 999extern int i915_suspend(struct drm_device *dev, pm_message_t state);
843extern int i915_resume(struct drm_device *dev); 1000extern int i915_resume(struct drm_device *dev);
844extern void i915_save_display(struct drm_device *dev);
845extern void i915_restore_display(struct drm_device *dev);
846extern int i915_master_create(struct drm_device *dev, struct drm_master *master); 1001extern int i915_master_create(struct drm_device *dev, struct drm_master *master);
847extern void i915_master_destroy(struct drm_device *dev, struct drm_master *master); 1002extern void i915_master_destroy(struct drm_device *dev, struct drm_master *master);
848 1003
@@ -860,9 +1015,9 @@ extern int i915_driver_device_is_agp(struct drm_device * dev);
860extern long i915_compat_ioctl(struct file *filp, unsigned int cmd, 1015extern long i915_compat_ioctl(struct file *filp, unsigned int cmd,
861 unsigned long arg); 1016 unsigned long arg);
862extern int i915_emit_box(struct drm_device *dev, 1017extern int i915_emit_box(struct drm_device *dev,
863 struct drm_clip_rect *boxes, 1018 struct drm_clip_rect *box,
864 int i, int DR1, int DR4); 1019 int DR1, int DR4);
865extern int i965_reset(struct drm_device *dev, u8 flags); 1020extern int i915_reset(struct drm_device *dev, u8 flags);
866extern unsigned long i915_chipset_val(struct drm_i915_private *dev_priv); 1021extern unsigned long i915_chipset_val(struct drm_i915_private *dev_priv);
867extern unsigned long i915_mch_val(struct drm_i915_private *dev_priv); 1022extern unsigned long i915_mch_val(struct drm_i915_private *dev_priv);
868extern unsigned long i915_gfx_val(struct drm_i915_private *dev_priv); 1023extern unsigned long i915_gfx_val(struct drm_i915_private *dev_priv);
@@ -871,34 +1026,20 @@ extern void i915_update_gfx_val(struct drm_i915_private *dev_priv);
871 1026
872/* i915_irq.c */ 1027/* i915_irq.c */
873void i915_hangcheck_elapsed(unsigned long data); 1028void i915_hangcheck_elapsed(unsigned long data);
874void i915_destroy_error_state(struct drm_device *dev); 1029void i915_handle_error(struct drm_device *dev, bool wedged);
875extern int i915_irq_emit(struct drm_device *dev, void *data, 1030extern int i915_irq_emit(struct drm_device *dev, void *data,
876 struct drm_file *file_priv); 1031 struct drm_file *file_priv);
877extern int i915_irq_wait(struct drm_device *dev, void *data, 1032extern int i915_irq_wait(struct drm_device *dev, void *data,
878 struct drm_file *file_priv); 1033 struct drm_file *file_priv);
879void i915_trace_irq_get(struct drm_device *dev, u32 seqno);
880extern void i915_enable_interrupt (struct drm_device *dev);
881 1034
882extern irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS); 1035extern void intel_irq_init(struct drm_device *dev);
883extern void i915_driver_irq_preinstall(struct drm_device * dev); 1036
884extern int i915_driver_irq_postinstall(struct drm_device *dev);
885extern void i915_driver_irq_uninstall(struct drm_device * dev);
886extern int i915_vblank_pipe_set(struct drm_device *dev, void *data, 1037extern int i915_vblank_pipe_set(struct drm_device *dev, void *data,
887 struct drm_file *file_priv); 1038 struct drm_file *file_priv);
888extern int i915_vblank_pipe_get(struct drm_device *dev, void *data, 1039extern int i915_vblank_pipe_get(struct drm_device *dev, void *data,
889 struct drm_file *file_priv); 1040 struct drm_file *file_priv);
890extern int i915_enable_vblank(struct drm_device *dev, int crtc);
891extern void i915_disable_vblank(struct drm_device *dev, int crtc);
892extern u32 i915_get_vblank_counter(struct drm_device *dev, int crtc);
893extern u32 gm45_get_vblank_counter(struct drm_device *dev, int crtc);
894extern int i915_vblank_swap(struct drm_device *dev, void *data, 1041extern int i915_vblank_swap(struct drm_device *dev, void *data,
895 struct drm_file *file_priv); 1042 struct drm_file *file_priv);
896extern void i915_enable_irq(drm_i915_private_t *dev_priv, u32 mask);
897extern void i915_disable_irq(drm_i915_private_t *dev_priv, u32 mask);
898extern void ironlake_enable_graphics_irq(drm_i915_private_t *dev_priv,
899 u32 mask);
900extern void ironlake_disable_graphics_irq(drm_i915_private_t *dev_priv,
901 u32 mask);
902 1043
903void 1044void
904i915_enable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask); 1045i915_enable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask);
@@ -908,6 +1049,12 @@ i915_disable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask);
908 1049
909void intel_enable_asle (struct drm_device *dev); 1050void intel_enable_asle (struct drm_device *dev);
910 1051
1052#ifdef CONFIG_DEBUG_FS
1053extern void i915_destroy_error_state(struct drm_device *dev);
1054#else
1055#define i915_destroy_error_state(x)
1056#endif
1057
911 1058
912/* i915_mem.c */ 1059/* i915_mem.c */
913extern int i915_mem_alloc(struct drm_device *dev, void *data, 1060extern int i915_mem_alloc(struct drm_device *dev, void *data,
@@ -964,83 +1111,124 @@ int i915_gem_get_aperture_ioctl(struct drm_device *dev, void *data,
964 struct drm_file *file_priv); 1111 struct drm_file *file_priv);
965void i915_gem_load(struct drm_device *dev); 1112void i915_gem_load(struct drm_device *dev);
966int i915_gem_init_object(struct drm_gem_object *obj); 1113int i915_gem_init_object(struct drm_gem_object *obj);
967struct drm_gem_object * i915_gem_alloc_object(struct drm_device *dev, 1114int __must_check i915_gem_flush_ring(struct intel_ring_buffer *ring,
968 size_t size); 1115 uint32_t invalidate_domains,
1116 uint32_t flush_domains);
1117struct drm_i915_gem_object *i915_gem_alloc_object(struct drm_device *dev,
1118 size_t size);
969void i915_gem_free_object(struct drm_gem_object *obj); 1119void i915_gem_free_object(struct drm_gem_object *obj);
970int i915_gem_object_pin(struct drm_gem_object *obj, uint32_t alignment); 1120int __must_check i915_gem_object_pin(struct drm_i915_gem_object *obj,
971void i915_gem_object_unpin(struct drm_gem_object *obj); 1121 uint32_t alignment,
972int i915_gem_object_unbind(struct drm_gem_object *obj); 1122 bool map_and_fenceable);
973void i915_gem_release_mmap(struct drm_gem_object *obj); 1123void i915_gem_object_unpin(struct drm_i915_gem_object *obj);
1124int __must_check i915_gem_object_unbind(struct drm_i915_gem_object *obj);
1125void i915_gem_release_mmap(struct drm_i915_gem_object *obj);
974void i915_gem_lastclose(struct drm_device *dev); 1126void i915_gem_lastclose(struct drm_device *dev);
975uint32_t i915_get_gem_seqno(struct drm_device *dev, 1127
976 struct intel_ring_buffer *ring); 1128int __must_check i915_mutex_lock_interruptible(struct drm_device *dev);
977bool i915_seqno_passed(uint32_t seq1, uint32_t seq2); 1129int __must_check i915_gem_object_wait_rendering(struct drm_i915_gem_object *obj);
978int i915_gem_object_get_fence_reg(struct drm_gem_object *obj); 1130void i915_gem_object_move_to_active(struct drm_i915_gem_object *obj,
979int i915_gem_object_put_fence_reg(struct drm_gem_object *obj); 1131 struct intel_ring_buffer *ring,
1132 u32 seqno);
1133
1134int i915_gem_dumb_create(struct drm_file *file_priv,
1135 struct drm_device *dev,
1136 struct drm_mode_create_dumb *args);
1137int i915_gem_mmap_gtt(struct drm_file *file_priv, struct drm_device *dev,
1138 uint32_t handle, uint64_t *offset);
1139int i915_gem_dumb_destroy(struct drm_file *file_priv, struct drm_device *dev,
1140 uint32_t handle);
1141/**
1142 * Returns true if seq1 is later than seq2.
1143 */
1144static inline bool
1145i915_seqno_passed(uint32_t seq1, uint32_t seq2)
1146{
1147 return (int32_t)(seq1 - seq2) >= 0;
1148}
1149
1150static inline u32
1151i915_gem_next_request_seqno(struct intel_ring_buffer *ring)
1152{
1153 drm_i915_private_t *dev_priv = ring->dev->dev_private;
1154 return ring->outstanding_lazy_request = dev_priv->next_seqno;
1155}
1156
1157int __must_check i915_gem_object_get_fence(struct drm_i915_gem_object *obj,
1158 struct intel_ring_buffer *pipelined);
1159int __must_check i915_gem_object_put_fence(struct drm_i915_gem_object *obj);
1160
980void i915_gem_retire_requests(struct drm_device *dev); 1161void i915_gem_retire_requests(struct drm_device *dev);
981void i915_gem_retire_work_handler(struct work_struct *work); 1162void i915_gem_reset(struct drm_device *dev);
982void i915_gem_clflush_object(struct drm_gem_object *obj); 1163void i915_gem_clflush_object(struct drm_i915_gem_object *obj);
983int i915_gem_object_set_domain(struct drm_gem_object *obj, 1164int __must_check i915_gem_object_set_domain(struct drm_i915_gem_object *obj,
984 uint32_t read_domains, 1165 uint32_t read_domains,
985 uint32_t write_domain); 1166 uint32_t write_domain);
986int i915_gem_init_ringbuffer(struct drm_device *dev); 1167int __must_check i915_gem_object_flush_gpu(struct drm_i915_gem_object *obj);
1168int __must_check i915_gem_init_ringbuffer(struct drm_device *dev);
987void i915_gem_cleanup_ringbuffer(struct drm_device *dev); 1169void i915_gem_cleanup_ringbuffer(struct drm_device *dev);
988int i915_gem_do_init(struct drm_device *dev, unsigned long start, 1170void i915_gem_do_init(struct drm_device *dev,
989 unsigned long end); 1171 unsigned long start,
990int i915_gpu_idle(struct drm_device *dev); 1172 unsigned long mappable_end,
991int i915_gem_idle(struct drm_device *dev); 1173 unsigned long end);
992uint32_t i915_add_request(struct drm_device *dev, 1174int __must_check i915_gpu_idle(struct drm_device *dev);
993 struct drm_file *file_priv, 1175int __must_check i915_gem_idle(struct drm_device *dev);
994 uint32_t flush_domains, 1176int __must_check i915_add_request(struct intel_ring_buffer *ring,
995 struct intel_ring_buffer *ring); 1177 struct drm_file *file,
996int i915_do_wait_request(struct drm_device *dev, 1178 struct drm_i915_gem_request *request);
997 uint32_t seqno, int interruptible, 1179int __must_check i915_wait_request(struct intel_ring_buffer *ring,
998 struct intel_ring_buffer *ring); 1180 uint32_t seqno);
999int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf); 1181int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf);
1000int i915_gem_object_set_to_gtt_domain(struct drm_gem_object *obj, 1182int __must_check
1001 int write); 1183i915_gem_object_set_to_gtt_domain(struct drm_i915_gem_object *obj,
1002int i915_gem_object_set_to_display_plane(struct drm_gem_object *obj); 1184 bool write);
1185int __must_check
1186i915_gem_object_set_to_display_plane(struct drm_i915_gem_object *obj,
1187 struct intel_ring_buffer *pipelined);
1003int i915_gem_attach_phys_object(struct drm_device *dev, 1188int i915_gem_attach_phys_object(struct drm_device *dev,
1004 struct drm_gem_object *obj, 1189 struct drm_i915_gem_object *obj,
1005 int id, 1190 int id,
1006 int align); 1191 int align);
1007void i915_gem_detach_phys_object(struct drm_device *dev, 1192void i915_gem_detach_phys_object(struct drm_device *dev,
1008 struct drm_gem_object *obj); 1193 struct drm_i915_gem_object *obj);
1009void i915_gem_free_all_phys_object(struct drm_device *dev); 1194void i915_gem_free_all_phys_object(struct drm_device *dev);
1010int i915_gem_object_get_pages(struct drm_gem_object *obj, gfp_t gfpmask); 1195void i915_gem_release(struct drm_device *dev, struct drm_file *file);
1011void i915_gem_object_put_pages(struct drm_gem_object *obj);
1012void i915_gem_release(struct drm_device * dev, struct drm_file *file_priv);
1013int i915_gem_object_flush_write_domain(struct drm_gem_object *obj);
1014 1196
1015void i915_gem_shrinker_init(void); 1197uint32_t
1016void i915_gem_shrinker_exit(void); 1198i915_gem_get_unfenced_gtt_alignment(struct drm_device *dev,
1199 uint32_t size,
1200 int tiling_mode);
1201
1202/* i915_gem_gtt.c */
1203void i915_gem_restore_gtt_mappings(struct drm_device *dev);
1204int __must_check i915_gem_gtt_bind_object(struct drm_i915_gem_object *obj);
1205void i915_gem_gtt_unbind_object(struct drm_i915_gem_object *obj);
1017 1206
1018/* i915_gem_evict.c */ 1207/* i915_gem_evict.c */
1019int i915_gem_evict_something(struct drm_device *dev, int min_size, unsigned alignment); 1208int __must_check i915_gem_evict_something(struct drm_device *dev, int min_size,
1020int i915_gem_evict_everything(struct drm_device *dev); 1209 unsigned alignment, bool mappable);
1021int i915_gem_evict_inactive(struct drm_device *dev); 1210int __must_check i915_gem_evict_everything(struct drm_device *dev,
1211 bool purgeable_only);
1212int __must_check i915_gem_evict_inactive(struct drm_device *dev,
1213 bool purgeable_only);
1022 1214
1023/* i915_gem_tiling.c */ 1215/* i915_gem_tiling.c */
1024void i915_gem_detect_bit_6_swizzle(struct drm_device *dev); 1216void i915_gem_detect_bit_6_swizzle(struct drm_device *dev);
1025void i915_gem_object_do_bit_17_swizzle(struct drm_gem_object *obj); 1217void i915_gem_object_do_bit_17_swizzle(struct drm_i915_gem_object *obj);
1026void i915_gem_object_save_bit_17_swizzle(struct drm_gem_object *obj); 1218void i915_gem_object_save_bit_17_swizzle(struct drm_i915_gem_object *obj);
1027bool i915_tiling_ok(struct drm_device *dev, int stride, int size,
1028 int tiling_mode);
1029bool i915_gem_object_fence_offset_ok(struct drm_gem_object *obj,
1030 int tiling_mode);
1031 1219
1032/* i915_gem_debug.c */ 1220/* i915_gem_debug.c */
1033void i915_gem_dump_object(struct drm_gem_object *obj, int len, 1221void i915_gem_dump_object(struct drm_i915_gem_object *obj, int len,
1034 const char *where, uint32_t mark); 1222 const char *where, uint32_t mark);
1035#if WATCH_INACTIVE 1223#if WATCH_LISTS
1036void i915_verify_inactive(struct drm_device *dev, char *file, int line); 1224int i915_verify_lists(struct drm_device *dev);
1037#else 1225#else
1038#define i915_verify_inactive(dev, file, line) 1226#define i915_verify_lists(dev) 0
1039#endif 1227#endif
1040void i915_gem_object_check_coherency(struct drm_gem_object *obj, int handle); 1228void i915_gem_object_check_coherency(struct drm_i915_gem_object *obj,
1041void i915_gem_dump_object(struct drm_gem_object *obj, int len, 1229 int handle);
1230void i915_gem_dump_object(struct drm_i915_gem_object *obj, int len,
1042 const char *where, uint32_t mark); 1231 const char *where, uint32_t mark);
1043void i915_dump_lru(struct drm_device *dev, const char *where);
1044 1232
1045/* i915_debugfs.c */ 1233/* i915_debugfs.c */
1046int i915_debugfs_init(struct drm_minor *minor); 1234int i915_debugfs_init(struct drm_minor *minor);
@@ -1054,23 +1242,45 @@ extern int i915_restore_state(struct drm_device *dev);
1054extern int i915_save_state(struct drm_device *dev); 1242extern int i915_save_state(struct drm_device *dev);
1055extern int i915_restore_state(struct drm_device *dev); 1243extern int i915_restore_state(struct drm_device *dev);
1056 1244
1245/* intel_i2c.c */
1246extern int intel_setup_gmbus(struct drm_device *dev);
1247extern void intel_teardown_gmbus(struct drm_device *dev);
1248extern void intel_gmbus_set_speed(struct i2c_adapter *adapter, int speed);
1249extern void intel_gmbus_force_bit(struct i2c_adapter *adapter, bool force_bit);
1250extern inline bool intel_gmbus_is_forced_bit(struct i2c_adapter *adapter)
1251{
1252 return container_of(adapter, struct intel_gmbus, adapter)->force_bit;
1253}
1254extern void intel_i2c_reset(struct drm_device *dev);
1255
1256/* intel_opregion.c */
1257extern int intel_opregion_setup(struct drm_device *dev);
1057#ifdef CONFIG_ACPI 1258#ifdef CONFIG_ACPI
1058/* i915_opregion.c */ 1259extern void intel_opregion_init(struct drm_device *dev);
1059extern int intel_opregion_init(struct drm_device *dev, int resume); 1260extern void intel_opregion_fini(struct drm_device *dev);
1060extern void intel_opregion_free(struct drm_device *dev, int suspend); 1261extern void intel_opregion_asle_intr(struct drm_device *dev);
1061extern void opregion_asle_intr(struct drm_device *dev); 1262extern void intel_opregion_gse_intr(struct drm_device *dev);
1062extern void ironlake_opregion_gse_intr(struct drm_device *dev); 1263extern void intel_opregion_enable_asle(struct drm_device *dev);
1063extern void opregion_enable_asle(struct drm_device *dev);
1064#else 1264#else
1065static inline int intel_opregion_init(struct drm_device *dev, int resume) { return 0; } 1265static inline void intel_opregion_init(struct drm_device *dev) { return; }
1066static inline void intel_opregion_free(struct drm_device *dev, int suspend) { return; } 1266static inline void intel_opregion_fini(struct drm_device *dev) { return; }
1067static inline void opregion_asle_intr(struct drm_device *dev) { return; } 1267static inline void intel_opregion_asle_intr(struct drm_device *dev) { return; }
1068static inline void ironlake_opregion_gse_intr(struct drm_device *dev) { return; } 1268static inline void intel_opregion_gse_intr(struct drm_device *dev) { return; }
1069static inline void opregion_enable_asle(struct drm_device *dev) { return; } 1269static inline void intel_opregion_enable_asle(struct drm_device *dev) { return; }
1070#endif 1270#endif
1071 1271
1272/* intel_acpi.c */
1273#ifdef CONFIG_ACPI
1274extern void intel_register_dsm_handler(void);
1275extern void intel_unregister_dsm_handler(void);
1276#else
1277static inline void intel_register_dsm_handler(void) { return; }
1278static inline void intel_unregister_dsm_handler(void) { return; }
1279#endif /* CONFIG_ACPI */
1280
1072/* modesetting */ 1281/* modesetting */
1073extern void intel_modeset_init(struct drm_device *dev); 1282extern void intel_modeset_init(struct drm_device *dev);
1283extern void intel_modeset_gem_init(struct drm_device *dev);
1074extern void intel_modeset_cleanup(struct drm_device *dev); 1284extern void intel_modeset_cleanup(struct drm_device *dev);
1075extern int intel_modeset_vga_set_state(struct drm_device *dev, bool state); 1285extern int intel_modeset_vga_set_state(struct drm_device *dev, bool state);
1076extern void i8xx_disable_fbc(struct drm_device *dev); 1286extern void i8xx_disable_fbc(struct drm_device *dev);
@@ -1080,145 +1290,110 @@ extern void intel_disable_fbc(struct drm_device *dev);
1080extern void intel_enable_fbc(struct drm_crtc *crtc, unsigned long interval); 1290extern void intel_enable_fbc(struct drm_crtc *crtc, unsigned long interval);
1081extern bool intel_fbc_enabled(struct drm_device *dev); 1291extern bool intel_fbc_enabled(struct drm_device *dev);
1082extern bool ironlake_set_drps(struct drm_device *dev, u8 val); 1292extern bool ironlake_set_drps(struct drm_device *dev, u8 val);
1293extern void ironlake_enable_rc6(struct drm_device *dev);
1294extern void gen6_set_rps(struct drm_device *dev, u8 val);
1083extern void intel_detect_pch (struct drm_device *dev); 1295extern void intel_detect_pch (struct drm_device *dev);
1084extern int intel_trans_dp_port_sel (struct drm_crtc *crtc); 1296extern int intel_trans_dp_port_sel (struct drm_crtc *crtc);
1085 1297
1086/* overlay */ 1298/* overlay */
1299#ifdef CONFIG_DEBUG_FS
1087extern struct intel_overlay_error_state *intel_overlay_capture_error_state(struct drm_device *dev); 1300extern struct intel_overlay_error_state *intel_overlay_capture_error_state(struct drm_device *dev);
1088extern void intel_overlay_print_error_state(struct seq_file *m, struct intel_overlay_error_state *error); 1301extern void intel_overlay_print_error_state(struct seq_file *m, struct intel_overlay_error_state *error);
1089 1302
1090/** 1303extern struct intel_display_error_state *intel_display_capture_error_state(struct drm_device *dev);
1091 * Lock test for when it's just for synchronization of ring access. 1304extern void intel_display_print_error_state(struct seq_file *m,
1092 * 1305 struct drm_device *dev,
1093 * In that case, we don't need to do it when GEM is initialized as nobody else 1306 struct intel_display_error_state *error);
1094 * has access to the ring. 1307#endif
1095 */
1096#define RING_LOCK_TEST_WITH_RETURN(dev, file_priv) do { \
1097 if (((drm_i915_private_t *)dev->dev_private)->render_ring.gem_object \
1098 == NULL) \
1099 LOCK_TEST_WITH_RETURN(dev, file_priv); \
1100} while (0)
1101 1308
1102#define I915_READ(reg) readl(dev_priv->regs + (reg)) 1309#define LP_RING(d) (&((struct drm_i915_private *)(d))->ring[RCS])
1103#define I915_WRITE(reg, val) writel(val, dev_priv->regs + (reg))
1104#define I915_READ16(reg) readw(dev_priv->regs + (reg))
1105#define I915_WRITE16(reg, val) writel(val, dev_priv->regs + (reg))
1106#define I915_READ8(reg) readb(dev_priv->regs + (reg))
1107#define I915_WRITE8(reg, val) writeb(val, dev_priv->regs + (reg))
1108#define I915_WRITE64(reg, val) writeq(val, dev_priv->regs + (reg))
1109#define I915_READ64(reg) readq(dev_priv->regs + (reg))
1110#define POSTING_READ(reg) (void)I915_READ(reg)
1111#define POSTING_READ16(reg) (void)I915_READ16(reg)
1112
1113#define I915_VERBOSE 0
1114
1115#define BEGIN_LP_RING(n) do { \
1116 drm_i915_private_t *dev_priv__ = dev->dev_private; \
1117 if (I915_VERBOSE) \
1118 DRM_DEBUG(" BEGIN_LP_RING %x\n", (int)(n)); \
1119 intel_ring_begin(dev, &dev_priv__->render_ring, (n)); \
1120} while (0)
1121 1310
1311#define BEGIN_LP_RING(n) \
1312 intel_ring_begin(LP_RING(dev_priv), (n))
1122 1313
1123#define OUT_RING(x) do { \ 1314#define OUT_RING(x) \
1124 drm_i915_private_t *dev_priv__ = dev->dev_private; \ 1315 intel_ring_emit(LP_RING(dev_priv), x)
1125 if (I915_VERBOSE) \
1126 DRM_DEBUG(" OUT_RING %x\n", (int)(x)); \
1127 intel_ring_emit(dev, &dev_priv__->render_ring, x); \
1128} while (0)
1129 1316
1130#define ADVANCE_LP_RING() do { \ 1317#define ADVANCE_LP_RING() \
1131 drm_i915_private_t *dev_priv__ = dev->dev_private; \ 1318 intel_ring_advance(LP_RING(dev_priv))
1132 if (I915_VERBOSE) \
1133 DRM_DEBUG("ADVANCE_LP_RING %x\n", \
1134 dev_priv__->render_ring.tail); \
1135 intel_ring_advance(dev, &dev_priv__->render_ring); \
1136} while(0)
1137 1319
1138/** 1320/**
1139 * Reads a dword out of the status page, which is written to from the command 1321 * Lock test for when it's just for synchronization of ring access.
1140 * queue by automatic updates, MI_REPORT_HEAD, MI_STORE_DATA_INDEX, or
1141 * MI_STORE_DATA_IMM.
1142 *
1143 * The following dwords have a reserved meaning:
1144 * 0x00: ISR copy, updated when an ISR bit not set in the HWSTAM changes.
1145 * 0x04: ring 0 head pointer
1146 * 0x05: ring 1 head pointer (915-class)
1147 * 0x06: ring 2 head pointer (915-class)
1148 * 0x10-0x1b: Context status DWords (GM45)
1149 * 0x1f: Last written status offset. (GM45)
1150 * 1322 *
1151 * The area from dword 0x20 to 0x3ff is available for driver usage. 1323 * In that case, we don't need to do it when GEM is initialized as nobody else
1324 * has access to the ring.
1152 */ 1325 */
1153#define READ_HWSP(dev_priv, reg) (((volatile u32 *)\ 1326#define RING_LOCK_TEST_WITH_RETURN(dev, file) do { \
1154 (dev_priv->render_ring.status_page.page_addr))[reg]) 1327 if (LP_RING(dev->dev_private)->obj == NULL) \
1155#define READ_BREADCRUMB(dev_priv) READ_HWSP(dev_priv, I915_BREADCRUMB_INDEX) 1328 LOCK_TEST_WITH_RETURN(dev, file); \
1156#define I915_GEM_HWS_INDEX 0x20 1329} while (0)
1157#define I915_BREADCRUMB_INDEX 0x21
1158
1159#define INTEL_INFO(dev) (((struct drm_i915_private *) (dev)->dev_private)->info)
1160
1161#define IS_I830(dev) ((dev)->pci_device == 0x3577)
1162#define IS_845G(dev) ((dev)->pci_device == 0x2562)
1163#define IS_I85X(dev) (INTEL_INFO(dev)->is_i85x)
1164#define IS_I865G(dev) ((dev)->pci_device == 0x2572)
1165#define IS_I915G(dev) (INTEL_INFO(dev)->is_i915g)
1166#define IS_I915GM(dev) ((dev)->pci_device == 0x2592)
1167#define IS_I945G(dev) ((dev)->pci_device == 0x2772)
1168#define IS_I945GM(dev) (INTEL_INFO(dev)->is_i945gm)
1169#define IS_I965G(dev) (INTEL_INFO(dev)->is_i965g)
1170#define IS_I965GM(dev) (INTEL_INFO(dev)->is_i965gm)
1171#define IS_BROADWATER(dev) (INTEL_INFO(dev)->is_broadwater)
1172#define IS_CRESTLINE(dev) (INTEL_INFO(dev)->is_crestline)
1173#define IS_GM45(dev) ((dev)->pci_device == 0x2A42)
1174#define IS_G4X(dev) (INTEL_INFO(dev)->is_g4x)
1175#define IS_PINEVIEW_G(dev) ((dev)->pci_device == 0xa001)
1176#define IS_PINEVIEW_M(dev) ((dev)->pci_device == 0xa011)
1177#define IS_PINEVIEW(dev) (INTEL_INFO(dev)->is_pineview)
1178#define IS_G33(dev) (INTEL_INFO(dev)->is_g33)
1179#define IS_IRONLAKE_D(dev) ((dev)->pci_device == 0x0042)
1180#define IS_IRONLAKE_M(dev) ((dev)->pci_device == 0x0046)
1181#define IS_IRONLAKE(dev) (INTEL_INFO(dev)->is_ironlake)
1182#define IS_I9XX(dev) (INTEL_INFO(dev)->is_i9xx)
1183#define IS_MOBILE(dev) (INTEL_INFO(dev)->is_mobile)
1184
1185#define IS_GEN2(dev) (INTEL_INFO(dev)->gen == 2)
1186#define IS_GEN3(dev) (INTEL_INFO(dev)->gen == 3)
1187#define IS_GEN4(dev) (INTEL_INFO(dev)->gen == 4)
1188#define IS_GEN5(dev) (INTEL_INFO(dev)->gen == 5)
1189#define IS_GEN6(dev) (INTEL_INFO(dev)->gen == 6)
1190
1191#define HAS_BSD(dev) (IS_IRONLAKE(dev) || IS_G4X(dev))
1192#define I915_NEED_GFX_HWS(dev) (INTEL_INFO(dev)->need_gfx_hws)
1193 1330
1194/* With the 945 and later, Y tiling got adjusted so that it was 32 128-byte 1331/* On SNB platform, before reading ring registers forcewake bit
1195 * rows, which changed the alignment requirements and fence programming. 1332 * must be set to prevent GT core from power down and stale values being
1333 * returned.
1196 */ 1334 */
1197#define HAS_128_BYTE_Y_TILING(dev) (IS_I9XX(dev) && !(IS_I915G(dev) || \ 1335void gen6_gt_force_wake_get(struct drm_i915_private *dev_priv);
1198 IS_I915GM(dev))) 1336void gen6_gt_force_wake_put(struct drm_i915_private *dev_priv);
1199#define SUPPORTS_DIGITAL_OUTPUTS(dev) (IS_I9XX(dev) && !IS_PINEVIEW(dev)) 1337void __gen6_gt_wait_for_fifo(struct drm_i915_private *dev_priv);
1200#define SUPPORTS_INTEGRATED_HDMI(dev) (IS_G4X(dev) || IS_IRONLAKE(dev)) 1338
1201#define SUPPORTS_INTEGRATED_DP(dev) (IS_G4X(dev) || IS_IRONLAKE(dev)) 1339/* We give fast paths for the really cool registers */
1202#define SUPPORTS_EDP(dev) (IS_IRONLAKE_M(dev)) 1340#define NEEDS_FORCE_WAKE(dev_priv, reg) \
1203#define SUPPORTS_TV(dev) (IS_I9XX(dev) && IS_MOBILE(dev) && \ 1341 (((dev_priv)->info->gen >= 6) && \
1204 !IS_IRONLAKE(dev) && !IS_PINEVIEW(dev) && \ 1342 ((reg) < 0x40000) && \
1205 !IS_GEN6(dev)) 1343 ((reg) != FORCEWAKE))
1206#define I915_HAS_HOTPLUG(dev) (INTEL_INFO(dev)->has_hotplug) 1344
1207/* dsparb controlled by hw only */ 1345#define __i915_read(x, y) \
1208#define DSPARB_HWCONTROL(dev) (IS_G4X(dev) || IS_IRONLAKE(dev)) 1346static inline u##x i915_read##x(struct drm_i915_private *dev_priv, u32 reg) { \
1209 1347 u##x val = 0; \
1210#define HAS_FW_BLC(dev) (IS_I9XX(dev) || IS_G4X(dev) || IS_IRONLAKE(dev)) 1348 if (NEEDS_FORCE_WAKE((dev_priv), (reg))) { \
1211#define HAS_PIPE_CXSR(dev) (INTEL_INFO(dev)->has_pipe_cxsr) 1349 gen6_gt_force_wake_get(dev_priv); \
1212#define I915_HAS_FBC(dev) (INTEL_INFO(dev)->has_fbc) 1350 val = read##y(dev_priv->regs + reg); \
1213#define I915_HAS_RC6(dev) (INTEL_INFO(dev)->has_rc6) 1351 gen6_gt_force_wake_put(dev_priv); \
1214 1352 } else { \
1215#define HAS_PCH_SPLIT(dev) (IS_IRONLAKE(dev) || \ 1353 val = read##y(dev_priv->regs + reg); \
1216 IS_GEN6(dev)) 1354 } \
1217#define HAS_PIPE_CONTROL(dev) (IS_IRONLAKE(dev) || IS_GEN6(dev)) 1355 trace_i915_reg_rw(false, reg, val, sizeof(val)); \
1218 1356 return val; \
1219#define INTEL_PCH_TYPE(dev) (((struct drm_i915_private *)(dev)->dev_private)->pch_type) 1357}
1220#define HAS_PCH_CPT(dev) (INTEL_PCH_TYPE(dev) == PCH_CPT) 1358
1359__i915_read(8, b)
1360__i915_read(16, w)
1361__i915_read(32, l)
1362__i915_read(64, q)
1363#undef __i915_read
1364
1365#define __i915_write(x, y) \
1366static inline void i915_write##x(struct drm_i915_private *dev_priv, u32 reg, u##x val) { \
1367 trace_i915_reg_rw(true, reg, val, sizeof(val)); \
1368 if (NEEDS_FORCE_WAKE((dev_priv), (reg))) { \
1369 __gen6_gt_wait_for_fifo(dev_priv); \
1370 } \
1371 write##y(val, dev_priv->regs + reg); \
1372}
1373__i915_write(8, b)
1374__i915_write(16, w)
1375__i915_write(32, l)
1376__i915_write(64, q)
1377#undef __i915_write
1378
1379#define I915_READ8(reg) i915_read8(dev_priv, (reg))
1380#define I915_WRITE8(reg, val) i915_write8(dev_priv, (reg), (val))
1381
1382#define I915_READ16(reg) i915_read16(dev_priv, (reg))
1383#define I915_WRITE16(reg, val) i915_write16(dev_priv, (reg), (val))
1384#define I915_READ16_NOTRACE(reg) readw(dev_priv->regs + (reg))
1385#define I915_WRITE16_NOTRACE(reg, val) writew(val, dev_priv->regs + (reg))
1386
1387#define I915_READ(reg) i915_read32(dev_priv, (reg))
1388#define I915_WRITE(reg, val) i915_write32(dev_priv, (reg), (val))
1389#define I915_READ_NOTRACE(reg) readl(dev_priv->regs + (reg))
1390#define I915_WRITE_NOTRACE(reg, val) writel(val, dev_priv->regs + (reg))
1391
1392#define I915_WRITE64(reg, val) i915_write64(dev_priv, (reg), (val))
1393#define I915_READ64(reg) i915_read64(dev_priv, (reg))
1394
1395#define POSTING_READ(reg) (void)I915_READ_NOTRACE(reg)
1396#define POSTING_READ16(reg) (void)I915_READ16_NOTRACE(reg)
1221 1397
1222#define PRIMARY_RINGBUFFER_SIZE (128*1024)
1223 1398
1224#endif 1399#endif
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 90b1d6753b9d..a087e1bf0c2f 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -31,149 +31,229 @@
31#include "i915_drv.h" 31#include "i915_drv.h"
32#include "i915_trace.h" 32#include "i915_trace.h"
33#include "intel_drv.h" 33#include "intel_drv.h"
34#include <linux/shmem_fs.h>
34#include <linux/slab.h> 35#include <linux/slab.h>
35#include <linux/swap.h> 36#include <linux/swap.h>
36#include <linux/pci.h> 37#include <linux/pci.h>
37#include <linux/intel-gtt.h> 38
38 39static __must_check int i915_gem_object_flush_gpu_write_domain(struct drm_i915_gem_object *obj);
39static uint32_t i915_gem_get_gtt_alignment(struct drm_gem_object *obj); 40static void i915_gem_object_flush_gtt_write_domain(struct drm_i915_gem_object *obj);
40static int i915_gem_object_flush_gpu_write_domain(struct drm_gem_object *obj); 41static void i915_gem_object_flush_cpu_write_domain(struct drm_i915_gem_object *obj);
41static void i915_gem_object_flush_gtt_write_domain(struct drm_gem_object *obj); 42static __must_check int i915_gem_object_set_to_cpu_domain(struct drm_i915_gem_object *obj,
42static void i915_gem_object_flush_cpu_write_domain(struct drm_gem_object *obj); 43 bool write);
43static int i915_gem_object_set_to_cpu_domain(struct drm_gem_object *obj, 44static __must_check int i915_gem_object_set_cpu_read_domain_range(struct drm_i915_gem_object *obj,
44 int write); 45 uint64_t offset,
45static int i915_gem_object_set_cpu_read_domain_range(struct drm_gem_object *obj, 46 uint64_t size);
46 uint64_t offset, 47static void i915_gem_object_set_to_full_cpu_read_domain(struct drm_i915_gem_object *obj);
47 uint64_t size); 48static __must_check int i915_gem_object_bind_to_gtt(struct drm_i915_gem_object *obj,
48static void i915_gem_object_set_to_full_cpu_read_domain(struct drm_gem_object *obj); 49 unsigned alignment,
49static int i915_gem_object_wait_rendering(struct drm_gem_object *obj); 50 bool map_and_fenceable);
50static int i915_gem_object_bind_to_gtt(struct drm_gem_object *obj, 51static void i915_gem_clear_fence_reg(struct drm_device *dev,
51 unsigned alignment); 52 struct drm_i915_fence_reg *reg);
52static void i915_gem_clear_fence_reg(struct drm_gem_object *obj); 53static int i915_gem_phys_pwrite(struct drm_device *dev,
53static int i915_gem_phys_pwrite(struct drm_device *dev, struct drm_gem_object *obj, 54 struct drm_i915_gem_object *obj,
54 struct drm_i915_gem_pwrite *args, 55 struct drm_i915_gem_pwrite *args,
55 struct drm_file *file_priv); 56 struct drm_file *file);
56static void i915_gem_free_object_tail(struct drm_gem_object *obj); 57static void i915_gem_free_object_tail(struct drm_i915_gem_object *obj);
57 58
58static LIST_HEAD(shrink_list); 59static int i915_gem_inactive_shrink(struct shrinker *shrinker,
59static DEFINE_SPINLOCK(shrink_list_lock); 60 struct shrink_control *sc);
60 61
61static inline bool 62/* some bookkeeping */
62i915_gem_object_is_inactive(struct drm_i915_gem_object *obj_priv) 63static void i915_gem_info_add_obj(struct drm_i915_private *dev_priv,
64 size_t size)
63{ 65{
64 return obj_priv->gtt_space && 66 dev_priv->mm.object_count++;
65 !obj_priv->active && 67 dev_priv->mm.object_memory += size;
66 obj_priv->pin_count == 0;
67} 68}
68 69
69int i915_gem_do_init(struct drm_device *dev, unsigned long start, 70static void i915_gem_info_remove_obj(struct drm_i915_private *dev_priv,
70 unsigned long end) 71 size_t size)
71{ 72{
72 drm_i915_private_t *dev_priv = dev->dev_private; 73 dev_priv->mm.object_count--;
74 dev_priv->mm.object_memory -= size;
75}
73 76
74 if (start >= end || 77static int
75 (start & (PAGE_SIZE - 1)) != 0 || 78i915_gem_wait_for_error(struct drm_device *dev)
76 (end & (PAGE_SIZE - 1)) != 0) { 79{
77 return -EINVAL; 80 struct drm_i915_private *dev_priv = dev->dev_private;
81 struct completion *x = &dev_priv->error_completion;
82 unsigned long flags;
83 int ret;
84
85 if (!atomic_read(&dev_priv->mm.wedged))
86 return 0;
87
88 ret = wait_for_completion_interruptible(x);
89 if (ret)
90 return ret;
91
92 if (atomic_read(&dev_priv->mm.wedged)) {
93 /* GPU is hung, bump the completion count to account for
94 * the token we just consumed so that we never hit zero and
95 * end up waiting upon a subsequent completion event that
96 * will never happen.
97 */
98 spin_lock_irqsave(&x->wait.lock, flags);
99 x->done++;
100 spin_unlock_irqrestore(&x->wait.lock, flags);
78 } 101 }
102 return 0;
103}
79 104
80 drm_mm_init(&dev_priv->mm.gtt_space, start, 105int i915_mutex_lock_interruptible(struct drm_device *dev)
81 end - start); 106{
107 int ret;
82 108
83 dev->gtt_total = (uint32_t) (end - start); 109 ret = i915_gem_wait_for_error(dev);
110 if (ret)
111 return ret;
84 112
113 ret = mutex_lock_interruptible(&dev->struct_mutex);
114 if (ret)
115 return ret;
116
117 WARN_ON(i915_verify_lists(dev));
85 return 0; 118 return 0;
86} 119}
87 120
121static inline bool
122i915_gem_object_is_inactive(struct drm_i915_gem_object *obj)
123{
124 return obj->gtt_space && !obj->active && obj->pin_count == 0;
125}
126
127void i915_gem_do_init(struct drm_device *dev,
128 unsigned long start,
129 unsigned long mappable_end,
130 unsigned long end)
131{
132 drm_i915_private_t *dev_priv = dev->dev_private;
133
134 drm_mm_init(&dev_priv->mm.gtt_space, start, end - start);
135
136 dev_priv->mm.gtt_start = start;
137 dev_priv->mm.gtt_mappable_end = mappable_end;
138 dev_priv->mm.gtt_end = end;
139 dev_priv->mm.gtt_total = end - start;
140 dev_priv->mm.mappable_gtt_total = min(end, mappable_end) - start;
141
142 /* Take over this portion of the GTT */
143 intel_gtt_clear_range(start / PAGE_SIZE, (end-start) / PAGE_SIZE);
144}
145
88int 146int
89i915_gem_init_ioctl(struct drm_device *dev, void *data, 147i915_gem_init_ioctl(struct drm_device *dev, void *data,
90 struct drm_file *file_priv) 148 struct drm_file *file)
91{ 149{
92 struct drm_i915_gem_init *args = data; 150 struct drm_i915_gem_init *args = data;
93 int ret; 151
152 if (args->gtt_start >= args->gtt_end ||
153 (args->gtt_end | args->gtt_start) & (PAGE_SIZE - 1))
154 return -EINVAL;
94 155
95 mutex_lock(&dev->struct_mutex); 156 mutex_lock(&dev->struct_mutex);
96 ret = i915_gem_do_init(dev, args->gtt_start, args->gtt_end); 157 i915_gem_do_init(dev, args->gtt_start, args->gtt_end, args->gtt_end);
97 mutex_unlock(&dev->struct_mutex); 158 mutex_unlock(&dev->struct_mutex);
98 159
99 return ret; 160 return 0;
100} 161}
101 162
102int 163int
103i915_gem_get_aperture_ioctl(struct drm_device *dev, void *data, 164i915_gem_get_aperture_ioctl(struct drm_device *dev, void *data,
104 struct drm_file *file_priv) 165 struct drm_file *file)
105{ 166{
167 struct drm_i915_private *dev_priv = dev->dev_private;
106 struct drm_i915_gem_get_aperture *args = data; 168 struct drm_i915_gem_get_aperture *args = data;
169 struct drm_i915_gem_object *obj;
170 size_t pinned;
107 171
108 if (!(dev->driver->driver_features & DRIVER_GEM)) 172 if (!(dev->driver->driver_features & DRIVER_GEM))
109 return -ENODEV; 173 return -ENODEV;
110 174
111 args->aper_size = dev->gtt_total; 175 pinned = 0;
112 args->aper_available_size = (args->aper_size - 176 mutex_lock(&dev->struct_mutex);
113 atomic_read(&dev->pin_memory)); 177 list_for_each_entry(obj, &dev_priv->mm.pinned_list, mm_list)
178 pinned += obj->gtt_space->size;
179 mutex_unlock(&dev->struct_mutex);
180
181 args->aper_size = dev_priv->mm.gtt_total;
182 args->aper_available_size = args->aper_size -pinned;
114 183
115 return 0; 184 return 0;
116} 185}
117 186
118 187static int
119/** 188i915_gem_create(struct drm_file *file,
120 * Creates a new mm object and returns a handle to it. 189 struct drm_device *dev,
121 */ 190 uint64_t size,
122int 191 uint32_t *handle_p)
123i915_gem_create_ioctl(struct drm_device *dev, void *data,
124 struct drm_file *file_priv)
125{ 192{
126 struct drm_i915_gem_create *args = data; 193 struct drm_i915_gem_object *obj;
127 struct drm_gem_object *obj;
128 int ret; 194 int ret;
129 u32 handle; 195 u32 handle;
130 196
131 args->size = roundup(args->size, PAGE_SIZE); 197 size = roundup(size, PAGE_SIZE);
132 198
133 /* Allocate the new object */ 199 /* Allocate the new object */
134 obj = i915_gem_alloc_object(dev, args->size); 200 obj = i915_gem_alloc_object(dev, size);
135 if (obj == NULL) 201 if (obj == NULL)
136 return -ENOMEM; 202 return -ENOMEM;
137 203
138 ret = drm_gem_handle_create(file_priv, obj, &handle); 204 ret = drm_gem_handle_create(file, &obj->base, &handle);
139 /* drop reference from allocate - handle holds it now */
140 drm_gem_object_unreference_unlocked(obj);
141 if (ret) { 205 if (ret) {
206 drm_gem_object_release(&obj->base);
207 i915_gem_info_remove_obj(dev->dev_private, obj->base.size);
208 kfree(obj);
142 return ret; 209 return ret;
143 } 210 }
144 211
145 args->handle = handle; 212 /* drop reference from allocate - handle holds it now */
213 drm_gem_object_unreference(&obj->base);
214 trace_i915_gem_object_create(obj);
215
216 *handle_p = handle;
146 return 0; 217 return 0;
147} 218}
148 219
149static inline int 220int
150fast_shmem_read(struct page **pages, 221i915_gem_dumb_create(struct drm_file *file,
151 loff_t page_base, int page_offset, 222 struct drm_device *dev,
152 char __user *data, 223 struct drm_mode_create_dumb *args)
153 int length)
154{ 224{
155 char __iomem *vaddr; 225 /* have to work out size/pitch and return them */
156 int unwritten; 226 args->pitch = ALIGN(args->width * ((args->bpp + 7) / 8), 64);
157 227 args->size = args->pitch * args->height;
158 vaddr = kmap_atomic(pages[page_base >> PAGE_SHIFT], KM_USER0); 228 return i915_gem_create(file, dev,
159 if (vaddr == NULL) 229 args->size, &args->handle);
160 return -ENOMEM; 230}
161 unwritten = __copy_to_user_inatomic(data, vaddr + page_offset, length);
162 kunmap_atomic(vaddr, KM_USER0);
163 231
164 if (unwritten) 232int i915_gem_dumb_destroy(struct drm_file *file,
165 return -EFAULT; 233 struct drm_device *dev,
234 uint32_t handle)
235{
236 return drm_gem_handle_delete(file, handle);
237}
166 238
167 return 0; 239/**
240 * Creates a new mm object and returns a handle to it.
241 */
242int
243i915_gem_create_ioctl(struct drm_device *dev, void *data,
244 struct drm_file *file)
245{
246 struct drm_i915_gem_create *args = data;
247 return i915_gem_create(file, dev,
248 args->size, &args->handle);
168} 249}
169 250
170static int i915_gem_object_needs_bit17_swizzle(struct drm_gem_object *obj) 251static int i915_gem_object_needs_bit17_swizzle(struct drm_i915_gem_object *obj)
171{ 252{
172 drm_i915_private_t *dev_priv = obj->dev->dev_private; 253 drm_i915_private_t *dev_priv = obj->base.dev->dev_private;
173 struct drm_i915_gem_object *obj_priv = to_intel_bo(obj);
174 254
175 return dev_priv->mm.bit_6_swizzle_x == I915_BIT_6_SWIZZLE_9_10_17 && 255 return dev_priv->mm.bit_6_swizzle_x == I915_BIT_6_SWIZZLE_9_10_17 &&
176 obj_priv->tiling_mode != I915_TILING_NONE; 256 obj->tiling_mode != I915_TILING_NONE;
177} 257}
178 258
179static inline void 259static inline void
@@ -249,88 +329,58 @@ slow_shmem_bit17_copy(struct page *gpu_page,
249 * fault, it fails so we can fall back to i915_gem_shmem_pwrite_slow(). 329 * fault, it fails so we can fall back to i915_gem_shmem_pwrite_slow().
250 */ 330 */
251static int 331static int
252i915_gem_shmem_pread_fast(struct drm_device *dev, struct drm_gem_object *obj, 332i915_gem_shmem_pread_fast(struct drm_device *dev,
333 struct drm_i915_gem_object *obj,
253 struct drm_i915_gem_pread *args, 334 struct drm_i915_gem_pread *args,
254 struct drm_file *file_priv) 335 struct drm_file *file)
255{ 336{
256 struct drm_i915_gem_object *obj_priv = to_intel_bo(obj); 337 struct address_space *mapping = obj->base.filp->f_path.dentry->d_inode->i_mapping;
257 ssize_t remain; 338 ssize_t remain;
258 loff_t offset, page_base; 339 loff_t offset;
259 char __user *user_data; 340 char __user *user_data;
260 int page_offset, page_length; 341 int page_offset, page_length;
261 int ret;
262 342
263 user_data = (char __user *) (uintptr_t) args->data_ptr; 343 user_data = (char __user *) (uintptr_t) args->data_ptr;
264 remain = args->size; 344 remain = args->size;
265 345
266 mutex_lock(&dev->struct_mutex);
267
268 ret = i915_gem_object_get_pages(obj, 0);
269 if (ret != 0)
270 goto fail_unlock;
271
272 ret = i915_gem_object_set_cpu_read_domain_range(obj, args->offset,
273 args->size);
274 if (ret != 0)
275 goto fail_put_pages;
276
277 obj_priv = to_intel_bo(obj);
278 offset = args->offset; 346 offset = args->offset;
279 347
280 while (remain > 0) { 348 while (remain > 0) {
349 struct page *page;
350 char *vaddr;
351 int ret;
352
281 /* Operation in this page 353 /* Operation in this page
282 * 354 *
283 * page_base = page offset within aperture
284 * page_offset = offset within page 355 * page_offset = offset within page
285 * page_length = bytes to copy for this page 356 * page_length = bytes to copy for this page
286 */ 357 */
287 page_base = (offset & ~(PAGE_SIZE-1)); 358 page_offset = offset_in_page(offset);
288 page_offset = offset & (PAGE_SIZE-1);
289 page_length = remain; 359 page_length = remain;
290 if ((page_offset + remain) > PAGE_SIZE) 360 if ((page_offset + remain) > PAGE_SIZE)
291 page_length = PAGE_SIZE - page_offset; 361 page_length = PAGE_SIZE - page_offset;
292 362
293 ret = fast_shmem_read(obj_priv->pages, 363 page = shmem_read_mapping_page(mapping, offset >> PAGE_SHIFT);
294 page_base, page_offset, 364 if (IS_ERR(page))
295 user_data, page_length); 365 return PTR_ERR(page);
366
367 vaddr = kmap_atomic(page);
368 ret = __copy_to_user_inatomic(user_data,
369 vaddr + page_offset,
370 page_length);
371 kunmap_atomic(vaddr);
372
373 mark_page_accessed(page);
374 page_cache_release(page);
296 if (ret) 375 if (ret)
297 goto fail_put_pages; 376 return -EFAULT;
298 377
299 remain -= page_length; 378 remain -= page_length;
300 user_data += page_length; 379 user_data += page_length;
301 offset += page_length; 380 offset += page_length;
302 } 381 }
303 382
304fail_put_pages: 383 return 0;
305 i915_gem_object_put_pages(obj);
306fail_unlock:
307 mutex_unlock(&dev->struct_mutex);
308
309 return ret;
310}
311
312static int
313i915_gem_object_get_pages_or_evict(struct drm_gem_object *obj)
314{
315 int ret;
316
317 ret = i915_gem_object_get_pages(obj, __GFP_NORETRY | __GFP_NOWARN);
318
319 /* If we've insufficient memory to map in the pages, attempt
320 * to make some space by throwing out some old buffers.
321 */
322 if (ret == -ENOMEM) {
323 struct drm_device *dev = obj->dev;
324
325 ret = i915_gem_evict_something(dev, obj->size,
326 i915_gem_get_gtt_alignment(obj));
327 if (ret)
328 return ret;
329
330 ret = i915_gem_object_get_pages(obj, 0);
331 }
332
333 return ret;
334} 384}
335 385
336/** 386/**
@@ -340,18 +390,19 @@ i915_gem_object_get_pages_or_evict(struct drm_gem_object *obj)
340 * and not take page faults. 390 * and not take page faults.
341 */ 391 */
342static int 392static int
343i915_gem_shmem_pread_slow(struct drm_device *dev, struct drm_gem_object *obj, 393i915_gem_shmem_pread_slow(struct drm_device *dev,
394 struct drm_i915_gem_object *obj,
344 struct drm_i915_gem_pread *args, 395 struct drm_i915_gem_pread *args,
345 struct drm_file *file_priv) 396 struct drm_file *file)
346{ 397{
347 struct drm_i915_gem_object *obj_priv = to_intel_bo(obj); 398 struct address_space *mapping = obj->base.filp->f_path.dentry->d_inode->i_mapping;
348 struct mm_struct *mm = current->mm; 399 struct mm_struct *mm = current->mm;
349 struct page **user_pages; 400 struct page **user_pages;
350 ssize_t remain; 401 ssize_t remain;
351 loff_t offset, pinned_pages, i; 402 loff_t offset, pinned_pages, i;
352 loff_t first_data_page, last_data_page, num_pages; 403 loff_t first_data_page, last_data_page, num_pages;
353 int shmem_page_index, shmem_page_offset; 404 int shmem_page_offset;
354 int data_page_index, data_page_offset; 405 int data_page_index, data_page_offset;
355 int page_length; 406 int page_length;
356 int ret; 407 int ret;
357 uint64_t data_ptr = args->data_ptr; 408 uint64_t data_ptr = args->data_ptr;
@@ -367,48 +418,44 @@ i915_gem_shmem_pread_slow(struct drm_device *dev, struct drm_gem_object *obj,
367 last_data_page = (data_ptr + args->size - 1) / PAGE_SIZE; 418 last_data_page = (data_ptr + args->size - 1) / PAGE_SIZE;
368 num_pages = last_data_page - first_data_page + 1; 419 num_pages = last_data_page - first_data_page + 1;
369 420
370 user_pages = drm_calloc_large(num_pages, sizeof(struct page *)); 421 user_pages = drm_malloc_ab(num_pages, sizeof(struct page *));
371 if (user_pages == NULL) 422 if (user_pages == NULL)
372 return -ENOMEM; 423 return -ENOMEM;
373 424
425 mutex_unlock(&dev->struct_mutex);
374 down_read(&mm->mmap_sem); 426 down_read(&mm->mmap_sem);
375 pinned_pages = get_user_pages(current, mm, (uintptr_t)args->data_ptr, 427 pinned_pages = get_user_pages(current, mm, (uintptr_t)args->data_ptr,
376 num_pages, 1, 0, user_pages, NULL); 428 num_pages, 1, 0, user_pages, NULL);
377 up_read(&mm->mmap_sem); 429 up_read(&mm->mmap_sem);
430 mutex_lock(&dev->struct_mutex);
378 if (pinned_pages < num_pages) { 431 if (pinned_pages < num_pages) {
379 ret = -EFAULT; 432 ret = -EFAULT;
380 goto fail_put_user_pages; 433 goto out;
381 } 434 }
382 435
383 do_bit17_swizzling = i915_gem_object_needs_bit17_swizzle(obj); 436 ret = i915_gem_object_set_cpu_read_domain_range(obj,
384 437 args->offset,
385 mutex_lock(&dev->struct_mutex); 438 args->size);
386
387 ret = i915_gem_object_get_pages_or_evict(obj);
388 if (ret) 439 if (ret)
389 goto fail_unlock; 440 goto out;
390 441
391 ret = i915_gem_object_set_cpu_read_domain_range(obj, args->offset, 442 do_bit17_swizzling = i915_gem_object_needs_bit17_swizzle(obj);
392 args->size);
393 if (ret != 0)
394 goto fail_put_pages;
395 443
396 obj_priv = to_intel_bo(obj);
397 offset = args->offset; 444 offset = args->offset;
398 445
399 while (remain > 0) { 446 while (remain > 0) {
447 struct page *page;
448
400 /* Operation in this page 449 /* Operation in this page
401 * 450 *
402 * shmem_page_index = page number within shmem file
403 * shmem_page_offset = offset within page in shmem file 451 * shmem_page_offset = offset within page in shmem file
404 * data_page_index = page number in get_user_pages return 452 * data_page_index = page number in get_user_pages return
405 * data_page_offset = offset with data_page_index page. 453 * data_page_offset = offset with data_page_index page.
406 * page_length = bytes to copy for this page 454 * page_length = bytes to copy for this page
407 */ 455 */
408 shmem_page_index = offset / PAGE_SIZE; 456 shmem_page_offset = offset_in_page(offset);
409 shmem_page_offset = offset & ~PAGE_MASK;
410 data_page_index = data_ptr / PAGE_SIZE - first_data_page; 457 data_page_index = data_ptr / PAGE_SIZE - first_data_page;
411 data_page_offset = data_ptr & ~PAGE_MASK; 458 data_page_offset = offset_in_page(data_ptr);
412 459
413 page_length = remain; 460 page_length = remain;
414 if ((shmem_page_offset + page_length) > PAGE_SIZE) 461 if ((shmem_page_offset + page_length) > PAGE_SIZE)
@@ -416,8 +463,14 @@ i915_gem_shmem_pread_slow(struct drm_device *dev, struct drm_gem_object *obj,
416 if ((data_page_offset + page_length) > PAGE_SIZE) 463 if ((data_page_offset + page_length) > PAGE_SIZE)
417 page_length = PAGE_SIZE - data_page_offset; 464 page_length = PAGE_SIZE - data_page_offset;
418 465
466 page = shmem_read_mapping_page(mapping, offset >> PAGE_SHIFT);
467 if (IS_ERR(page)) {
468 ret = PTR_ERR(page);
469 goto out;
470 }
471
419 if (do_bit17_swizzling) { 472 if (do_bit17_swizzling) {
420 slow_shmem_bit17_copy(obj_priv->pages[shmem_page_index], 473 slow_shmem_bit17_copy(page,
421 shmem_page_offset, 474 shmem_page_offset,
422 user_pages[data_page_index], 475 user_pages[data_page_index],
423 data_page_offset, 476 data_page_offset,
@@ -426,23 +479,23 @@ i915_gem_shmem_pread_slow(struct drm_device *dev, struct drm_gem_object *obj,
426 } else { 479 } else {
427 slow_shmem_copy(user_pages[data_page_index], 480 slow_shmem_copy(user_pages[data_page_index],
428 data_page_offset, 481 data_page_offset,
429 obj_priv->pages[shmem_page_index], 482 page,
430 shmem_page_offset, 483 shmem_page_offset,
431 page_length); 484 page_length);
432 } 485 }
433 486
487 mark_page_accessed(page);
488 page_cache_release(page);
489
434 remain -= page_length; 490 remain -= page_length;
435 data_ptr += page_length; 491 data_ptr += page_length;
436 offset += page_length; 492 offset += page_length;
437 } 493 }
438 494
439fail_put_pages: 495out:
440 i915_gem_object_put_pages(obj);
441fail_unlock:
442 mutex_unlock(&dev->struct_mutex);
443fail_put_user_pages:
444 for (i = 0; i < pinned_pages; i++) { 496 for (i = 0; i < pinned_pages; i++) {
445 SetPageDirty(user_pages[i]); 497 SetPageDirty(user_pages[i]);
498 mark_page_accessed(user_pages[i]);
446 page_cache_release(user_pages[i]); 499 page_cache_release(user_pages[i]);
447 } 500 }
448 drm_free_large(user_pages); 501 drm_free_large(user_pages);
@@ -457,42 +510,60 @@ fail_put_user_pages:
457 */ 510 */
458int 511int
459i915_gem_pread_ioctl(struct drm_device *dev, void *data, 512i915_gem_pread_ioctl(struct drm_device *dev, void *data,
460 struct drm_file *file_priv) 513 struct drm_file *file)
461{ 514{
462 struct drm_i915_gem_pread *args = data; 515 struct drm_i915_gem_pread *args = data;
463 struct drm_gem_object *obj; 516 struct drm_i915_gem_object *obj;
464 struct drm_i915_gem_object *obj_priv; 517 int ret = 0;
465 int ret;
466
467 obj = drm_gem_object_lookup(dev, file_priv, args->handle);
468 if (obj == NULL)
469 return -ENOENT;
470 obj_priv = to_intel_bo(obj);
471 518
472 /* Bounds check source. */ 519 if (args->size == 0)
473 if (args->offset > obj->size || args->size > obj->size - args->offset) { 520 return 0;
474 ret = -EINVAL;
475 goto err;
476 }
477 521
478 if (!access_ok(VERIFY_WRITE, 522 if (!access_ok(VERIFY_WRITE,
479 (char __user *)(uintptr_t)args->data_ptr, 523 (char __user *)(uintptr_t)args->data_ptr,
480 args->size)) { 524 args->size))
481 ret = -EFAULT; 525 return -EFAULT;
482 goto err; 526
527 ret = fault_in_pages_writeable((char __user *)(uintptr_t)args->data_ptr,
528 args->size);
529 if (ret)
530 return -EFAULT;
531
532 ret = i915_mutex_lock_interruptible(dev);
533 if (ret)
534 return ret;
535
536 obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
537 if (&obj->base == NULL) {
538 ret = -ENOENT;
539 goto unlock;
483 } 540 }
484 541
485 if (i915_gem_object_needs_bit17_swizzle(obj)) { 542 /* Bounds check source. */
486 ret = i915_gem_shmem_pread_slow(dev, obj, args, file_priv); 543 if (args->offset > obj->base.size ||
487 } else { 544 args->size > obj->base.size - args->offset) {
488 ret = i915_gem_shmem_pread_fast(dev, obj, args, file_priv); 545 ret = -EINVAL;
489 if (ret != 0) 546 goto out;
490 ret = i915_gem_shmem_pread_slow(dev, obj, args,
491 file_priv);
492 } 547 }
493 548
494err: 549 trace_i915_gem_object_pread(obj, args->offset, args->size);
495 drm_gem_object_unreference_unlocked(obj); 550
551 ret = i915_gem_object_set_cpu_read_domain_range(obj,
552 args->offset,
553 args->size);
554 if (ret)
555 goto out;
556
557 ret = -EFAULT;
558 if (!i915_gem_object_needs_bit17_swizzle(obj))
559 ret = i915_gem_shmem_pread_fast(dev, obj, args, file);
560 if (ret == -EFAULT)
561 ret = i915_gem_shmem_pread_slow(dev, obj, args, file);
562
563out:
564 drm_gem_object_unreference(&obj->base);
565unlock:
566 mutex_unlock(&dev->struct_mutex);
496 return ret; 567 return ret;
497} 568}
498 569
@@ -509,13 +580,11 @@ fast_user_write(struct io_mapping *mapping,
509 char *vaddr_atomic; 580 char *vaddr_atomic;
510 unsigned long unwritten; 581 unsigned long unwritten;
511 582
512 vaddr_atomic = io_mapping_map_atomic_wc(mapping, page_base, KM_USER0); 583 vaddr_atomic = io_mapping_map_atomic_wc(mapping, page_base);
513 unwritten = __copy_from_user_inatomic_nocache(vaddr_atomic + page_offset, 584 unwritten = __copy_from_user_inatomic_nocache(vaddr_atomic + page_offset,
514 user_data, length); 585 user_data, length);
515 io_mapping_unmap_atomic(vaddr_atomic, KM_USER0); 586 io_mapping_unmap_atomic(vaddr_atomic);
516 if (unwritten) 587 return unwritten;
517 return -EFAULT;
518 return 0;
519} 588}
520 589
521/* Here's the write path which can sleep for 590/* Here's the write path which can sleep for
@@ -542,59 +611,26 @@ slow_kernel_write(struct io_mapping *mapping,
542 io_mapping_unmap(dst_vaddr); 611 io_mapping_unmap(dst_vaddr);
543} 612}
544 613
545static inline int
546fast_shmem_write(struct page **pages,
547 loff_t page_base, int page_offset,
548 char __user *data,
549 int length)
550{
551 char __iomem *vaddr;
552 unsigned long unwritten;
553
554 vaddr = kmap_atomic(pages[page_base >> PAGE_SHIFT], KM_USER0);
555 if (vaddr == NULL)
556 return -ENOMEM;
557 unwritten = __copy_from_user_inatomic(vaddr + page_offset, data, length);
558 kunmap_atomic(vaddr, KM_USER0);
559
560 if (unwritten)
561 return -EFAULT;
562 return 0;
563}
564
565/** 614/**
566 * This is the fast pwrite path, where we copy the data directly from the 615 * This is the fast pwrite path, where we copy the data directly from the
567 * user into the GTT, uncached. 616 * user into the GTT, uncached.
568 */ 617 */
569static int 618static int
570i915_gem_gtt_pwrite_fast(struct drm_device *dev, struct drm_gem_object *obj, 619i915_gem_gtt_pwrite_fast(struct drm_device *dev,
620 struct drm_i915_gem_object *obj,
571 struct drm_i915_gem_pwrite *args, 621 struct drm_i915_gem_pwrite *args,
572 struct drm_file *file_priv) 622 struct drm_file *file)
573{ 623{
574 struct drm_i915_gem_object *obj_priv = to_intel_bo(obj);
575 drm_i915_private_t *dev_priv = dev->dev_private; 624 drm_i915_private_t *dev_priv = dev->dev_private;
576 ssize_t remain; 625 ssize_t remain;
577 loff_t offset, page_base; 626 loff_t offset, page_base;
578 char __user *user_data; 627 char __user *user_data;
579 int page_offset, page_length; 628 int page_offset, page_length;
580 int ret;
581 629
582 user_data = (char __user *) (uintptr_t) args->data_ptr; 630 user_data = (char __user *) (uintptr_t) args->data_ptr;
583 remain = args->size; 631 remain = args->size;
584 632
585 633 offset = obj->gtt_offset + args->offset;
586 mutex_lock(&dev->struct_mutex);
587 ret = i915_gem_object_pin(obj, 0);
588 if (ret) {
589 mutex_unlock(&dev->struct_mutex);
590 return ret;
591 }
592 ret = i915_gem_object_set_to_gtt_domain(obj, 1);
593 if (ret)
594 goto fail;
595
596 obj_priv = to_intel_bo(obj);
597 offset = obj_priv->gtt_offset + args->offset;
598 634
599 while (remain > 0) { 635 while (remain > 0) {
600 /* Operation in this page 636 /* Operation in this page
@@ -603,32 +639,26 @@ i915_gem_gtt_pwrite_fast(struct drm_device *dev, struct drm_gem_object *obj,
603 * page_offset = offset within page 639 * page_offset = offset within page
604 * page_length = bytes to copy for this page 640 * page_length = bytes to copy for this page
605 */ 641 */
606 page_base = (offset & ~(PAGE_SIZE-1)); 642 page_base = offset & PAGE_MASK;
607 page_offset = offset & (PAGE_SIZE-1); 643 page_offset = offset_in_page(offset);
608 page_length = remain; 644 page_length = remain;
609 if ((page_offset + remain) > PAGE_SIZE) 645 if ((page_offset + remain) > PAGE_SIZE)
610 page_length = PAGE_SIZE - page_offset; 646 page_length = PAGE_SIZE - page_offset;
611 647
612 ret = fast_user_write (dev_priv->mm.gtt_mapping, page_base,
613 page_offset, user_data, page_length);
614
615 /* If we get a fault while copying data, then (presumably) our 648 /* If we get a fault while copying data, then (presumably) our
616 * source page isn't available. Return the error and we'll 649 * source page isn't available. Return the error and we'll
617 * retry in the slow path. 650 * retry in the slow path.
618 */ 651 */
619 if (ret) 652 if (fast_user_write(dev_priv->mm.gtt_mapping, page_base,
620 goto fail; 653 page_offset, user_data, page_length))
654 return -EFAULT;
621 655
622 remain -= page_length; 656 remain -= page_length;
623 user_data += page_length; 657 user_data += page_length;
624 offset += page_length; 658 offset += page_length;
625 } 659 }
626 660
627fail: 661 return 0;
628 i915_gem_object_unpin(obj);
629 mutex_unlock(&dev->struct_mutex);
630
631 return ret;
632} 662}
633 663
634/** 664/**
@@ -639,11 +669,11 @@ fail:
639 * than using i915_gem_gtt_pwrite_fast on a G45 (32-bit). 669 * than using i915_gem_gtt_pwrite_fast on a G45 (32-bit).
640 */ 670 */
641static int 671static int
642i915_gem_gtt_pwrite_slow(struct drm_device *dev, struct drm_gem_object *obj, 672i915_gem_gtt_pwrite_slow(struct drm_device *dev,
673 struct drm_i915_gem_object *obj,
643 struct drm_i915_gem_pwrite *args, 674 struct drm_i915_gem_pwrite *args,
644 struct drm_file *file_priv) 675 struct drm_file *file)
645{ 676{
646 struct drm_i915_gem_object *obj_priv = to_intel_bo(obj);
647 drm_i915_private_t *dev_priv = dev->dev_private; 677 drm_i915_private_t *dev_priv = dev->dev_private;
648 ssize_t remain; 678 ssize_t remain;
649 loff_t gtt_page_base, offset; 679 loff_t gtt_page_base, offset;
@@ -665,30 +695,30 @@ i915_gem_gtt_pwrite_slow(struct drm_device *dev, struct drm_gem_object *obj,
665 last_data_page = (data_ptr + args->size - 1) / PAGE_SIZE; 695 last_data_page = (data_ptr + args->size - 1) / PAGE_SIZE;
666 num_pages = last_data_page - first_data_page + 1; 696 num_pages = last_data_page - first_data_page + 1;
667 697
668 user_pages = drm_calloc_large(num_pages, sizeof(struct page *)); 698 user_pages = drm_malloc_ab(num_pages, sizeof(struct page *));
669 if (user_pages == NULL) 699 if (user_pages == NULL)
670 return -ENOMEM; 700 return -ENOMEM;
671 701
702 mutex_unlock(&dev->struct_mutex);
672 down_read(&mm->mmap_sem); 703 down_read(&mm->mmap_sem);
673 pinned_pages = get_user_pages(current, mm, (uintptr_t)args->data_ptr, 704 pinned_pages = get_user_pages(current, mm, (uintptr_t)args->data_ptr,
674 num_pages, 0, 0, user_pages, NULL); 705 num_pages, 0, 0, user_pages, NULL);
675 up_read(&mm->mmap_sem); 706 up_read(&mm->mmap_sem);
707 mutex_lock(&dev->struct_mutex);
676 if (pinned_pages < num_pages) { 708 if (pinned_pages < num_pages) {
677 ret = -EFAULT; 709 ret = -EFAULT;
678 goto out_unpin_pages; 710 goto out_unpin_pages;
679 } 711 }
680 712
681 mutex_lock(&dev->struct_mutex); 713 ret = i915_gem_object_set_to_gtt_domain(obj, true);
682 ret = i915_gem_object_pin(obj, 0);
683 if (ret) 714 if (ret)
684 goto out_unlock; 715 goto out_unpin_pages;
685 716
686 ret = i915_gem_object_set_to_gtt_domain(obj, 1); 717 ret = i915_gem_object_put_fence(obj);
687 if (ret) 718 if (ret)
688 goto out_unpin_object; 719 goto out_unpin_pages;
689 720
690 obj_priv = to_intel_bo(obj); 721 offset = obj->gtt_offset + args->offset;
691 offset = obj_priv->gtt_offset + args->offset;
692 722
693 while (remain > 0) { 723 while (remain > 0) {
694 /* Operation in this page 724 /* Operation in this page
@@ -700,9 +730,9 @@ i915_gem_gtt_pwrite_slow(struct drm_device *dev, struct drm_gem_object *obj,
700 * page_length = bytes to copy for this page 730 * page_length = bytes to copy for this page
701 */ 731 */
702 gtt_page_base = offset & PAGE_MASK; 732 gtt_page_base = offset & PAGE_MASK;
703 gtt_page_offset = offset & ~PAGE_MASK; 733 gtt_page_offset = offset_in_page(offset);
704 data_page_index = data_ptr / PAGE_SIZE - first_data_page; 734 data_page_index = data_ptr / PAGE_SIZE - first_data_page;
705 data_page_offset = data_ptr & ~PAGE_MASK; 735 data_page_offset = offset_in_page(data_ptr);
706 736
707 page_length = remain; 737 page_length = remain;
708 if ((gtt_page_offset + page_length) > PAGE_SIZE) 738 if ((gtt_page_offset + page_length) > PAGE_SIZE)
@@ -721,10 +751,6 @@ i915_gem_gtt_pwrite_slow(struct drm_device *dev, struct drm_gem_object *obj,
721 data_ptr += page_length; 751 data_ptr += page_length;
722 } 752 }
723 753
724out_unpin_object:
725 i915_gem_object_unpin(obj);
726out_unlock:
727 mutex_unlock(&dev->struct_mutex);
728out_unpin_pages: 754out_unpin_pages:
729 for (i = 0; i < pinned_pages; i++) 755 for (i = 0; i < pinned_pages; i++)
730 page_cache_release(user_pages[i]); 756 page_cache_release(user_pages[i]);
@@ -738,64 +764,65 @@ out_unpin_pages:
738 * copy_from_user into the kmapped pages backing the object. 764 * copy_from_user into the kmapped pages backing the object.
739 */ 765 */
740static int 766static int
741i915_gem_shmem_pwrite_fast(struct drm_device *dev, struct drm_gem_object *obj, 767i915_gem_shmem_pwrite_fast(struct drm_device *dev,
768 struct drm_i915_gem_object *obj,
742 struct drm_i915_gem_pwrite *args, 769 struct drm_i915_gem_pwrite *args,
743 struct drm_file *file_priv) 770 struct drm_file *file)
744{ 771{
745 struct drm_i915_gem_object *obj_priv = to_intel_bo(obj); 772 struct address_space *mapping = obj->base.filp->f_path.dentry->d_inode->i_mapping;
746 ssize_t remain; 773 ssize_t remain;
747 loff_t offset, page_base; 774 loff_t offset;
748 char __user *user_data; 775 char __user *user_data;
749 int page_offset, page_length; 776 int page_offset, page_length;
750 int ret;
751 777
752 user_data = (char __user *) (uintptr_t) args->data_ptr; 778 user_data = (char __user *) (uintptr_t) args->data_ptr;
753 remain = args->size; 779 remain = args->size;
754 780
755 mutex_lock(&dev->struct_mutex);
756
757 ret = i915_gem_object_get_pages(obj, 0);
758 if (ret != 0)
759 goto fail_unlock;
760
761 ret = i915_gem_object_set_to_cpu_domain(obj, 1);
762 if (ret != 0)
763 goto fail_put_pages;
764
765 obj_priv = to_intel_bo(obj);
766 offset = args->offset; 781 offset = args->offset;
767 obj_priv->dirty = 1; 782 obj->dirty = 1;
768 783
769 while (remain > 0) { 784 while (remain > 0) {
785 struct page *page;
786 char *vaddr;
787 int ret;
788
770 /* Operation in this page 789 /* Operation in this page
771 * 790 *
772 * page_base = page offset within aperture
773 * page_offset = offset within page 791 * page_offset = offset within page
774 * page_length = bytes to copy for this page 792 * page_length = bytes to copy for this page
775 */ 793 */
776 page_base = (offset & ~(PAGE_SIZE-1)); 794 page_offset = offset_in_page(offset);
777 page_offset = offset & (PAGE_SIZE-1);
778 page_length = remain; 795 page_length = remain;
779 if ((page_offset + remain) > PAGE_SIZE) 796 if ((page_offset + remain) > PAGE_SIZE)
780 page_length = PAGE_SIZE - page_offset; 797 page_length = PAGE_SIZE - page_offset;
781 798
782 ret = fast_shmem_write(obj_priv->pages, 799 page = shmem_read_mapping_page(mapping, offset >> PAGE_SHIFT);
783 page_base, page_offset, 800 if (IS_ERR(page))
784 user_data, page_length); 801 return PTR_ERR(page);
802
803 vaddr = kmap_atomic(page, KM_USER0);
804 ret = __copy_from_user_inatomic(vaddr + page_offset,
805 user_data,
806 page_length);
807 kunmap_atomic(vaddr, KM_USER0);
808
809 set_page_dirty(page);
810 mark_page_accessed(page);
811 page_cache_release(page);
812
813 /* If we get a fault while copying data, then (presumably) our
814 * source page isn't available. Return the error and we'll
815 * retry in the slow path.
816 */
785 if (ret) 817 if (ret)
786 goto fail_put_pages; 818 return -EFAULT;
787 819
788 remain -= page_length; 820 remain -= page_length;
789 user_data += page_length; 821 user_data += page_length;
790 offset += page_length; 822 offset += page_length;
791 } 823 }
792 824
793fail_put_pages: 825 return 0;
794 i915_gem_object_put_pages(obj);
795fail_unlock:
796 mutex_unlock(&dev->struct_mutex);
797
798 return ret;
799} 826}
800 827
801/** 828/**
@@ -806,17 +833,18 @@ fail_unlock:
806 * struct_mutex is held. 833 * struct_mutex is held.
807 */ 834 */
808static int 835static int
809i915_gem_shmem_pwrite_slow(struct drm_device *dev, struct drm_gem_object *obj, 836i915_gem_shmem_pwrite_slow(struct drm_device *dev,
837 struct drm_i915_gem_object *obj,
810 struct drm_i915_gem_pwrite *args, 838 struct drm_i915_gem_pwrite *args,
811 struct drm_file *file_priv) 839 struct drm_file *file)
812{ 840{
813 struct drm_i915_gem_object *obj_priv = to_intel_bo(obj); 841 struct address_space *mapping = obj->base.filp->f_path.dentry->d_inode->i_mapping;
814 struct mm_struct *mm = current->mm; 842 struct mm_struct *mm = current->mm;
815 struct page **user_pages; 843 struct page **user_pages;
816 ssize_t remain; 844 ssize_t remain;
817 loff_t offset, pinned_pages, i; 845 loff_t offset, pinned_pages, i;
818 loff_t first_data_page, last_data_page, num_pages; 846 loff_t first_data_page, last_data_page, num_pages;
819 int shmem_page_index, shmem_page_offset; 847 int shmem_page_offset;
820 int data_page_index, data_page_offset; 848 int data_page_index, data_page_offset;
821 int page_length; 849 int page_length;
822 int ret; 850 int ret;
@@ -833,48 +861,43 @@ i915_gem_shmem_pwrite_slow(struct drm_device *dev, struct drm_gem_object *obj,
833 last_data_page = (data_ptr + args->size - 1) / PAGE_SIZE; 861 last_data_page = (data_ptr + args->size - 1) / PAGE_SIZE;
834 num_pages = last_data_page - first_data_page + 1; 862 num_pages = last_data_page - first_data_page + 1;
835 863
836 user_pages = drm_calloc_large(num_pages, sizeof(struct page *)); 864 user_pages = drm_malloc_ab(num_pages, sizeof(struct page *));
837 if (user_pages == NULL) 865 if (user_pages == NULL)
838 return -ENOMEM; 866 return -ENOMEM;
839 867
868 mutex_unlock(&dev->struct_mutex);
840 down_read(&mm->mmap_sem); 869 down_read(&mm->mmap_sem);
841 pinned_pages = get_user_pages(current, mm, (uintptr_t)args->data_ptr, 870 pinned_pages = get_user_pages(current, mm, (uintptr_t)args->data_ptr,
842 num_pages, 0, 0, user_pages, NULL); 871 num_pages, 0, 0, user_pages, NULL);
843 up_read(&mm->mmap_sem); 872 up_read(&mm->mmap_sem);
873 mutex_lock(&dev->struct_mutex);
844 if (pinned_pages < num_pages) { 874 if (pinned_pages < num_pages) {
845 ret = -EFAULT; 875 ret = -EFAULT;
846 goto fail_put_user_pages; 876 goto out;
847 } 877 }
848 878
849 do_bit17_swizzling = i915_gem_object_needs_bit17_swizzle(obj); 879 ret = i915_gem_object_set_to_cpu_domain(obj, 1);
850
851 mutex_lock(&dev->struct_mutex);
852
853 ret = i915_gem_object_get_pages_or_evict(obj);
854 if (ret) 880 if (ret)
855 goto fail_unlock; 881 goto out;
856 882
857 ret = i915_gem_object_set_to_cpu_domain(obj, 1); 883 do_bit17_swizzling = i915_gem_object_needs_bit17_swizzle(obj);
858 if (ret != 0)
859 goto fail_put_pages;
860 884
861 obj_priv = to_intel_bo(obj);
862 offset = args->offset; 885 offset = args->offset;
863 obj_priv->dirty = 1; 886 obj->dirty = 1;
864 887
865 while (remain > 0) { 888 while (remain > 0) {
889 struct page *page;
890
866 /* Operation in this page 891 /* Operation in this page
867 * 892 *
868 * shmem_page_index = page number within shmem file
869 * shmem_page_offset = offset within page in shmem file 893 * shmem_page_offset = offset within page in shmem file
870 * data_page_index = page number in get_user_pages return 894 * data_page_index = page number in get_user_pages return
871 * data_page_offset = offset with data_page_index page. 895 * data_page_offset = offset with data_page_index page.
872 * page_length = bytes to copy for this page 896 * page_length = bytes to copy for this page
873 */ 897 */
874 shmem_page_index = offset / PAGE_SIZE; 898 shmem_page_offset = offset_in_page(offset);
875 shmem_page_offset = offset & ~PAGE_MASK;
876 data_page_index = data_ptr / PAGE_SIZE - first_data_page; 899 data_page_index = data_ptr / PAGE_SIZE - first_data_page;
877 data_page_offset = data_ptr & ~PAGE_MASK; 900 data_page_offset = offset_in_page(data_ptr);
878 901
879 page_length = remain; 902 page_length = remain;
880 if ((shmem_page_offset + page_length) > PAGE_SIZE) 903 if ((shmem_page_offset + page_length) > PAGE_SIZE)
@@ -882,31 +905,37 @@ i915_gem_shmem_pwrite_slow(struct drm_device *dev, struct drm_gem_object *obj,
882 if ((data_page_offset + page_length) > PAGE_SIZE) 905 if ((data_page_offset + page_length) > PAGE_SIZE)
883 page_length = PAGE_SIZE - data_page_offset; 906 page_length = PAGE_SIZE - data_page_offset;
884 907
908 page = shmem_read_mapping_page(mapping, offset >> PAGE_SHIFT);
909 if (IS_ERR(page)) {
910 ret = PTR_ERR(page);
911 goto out;
912 }
913
885 if (do_bit17_swizzling) { 914 if (do_bit17_swizzling) {
886 slow_shmem_bit17_copy(obj_priv->pages[shmem_page_index], 915 slow_shmem_bit17_copy(page,
887 shmem_page_offset, 916 shmem_page_offset,
888 user_pages[data_page_index], 917 user_pages[data_page_index],
889 data_page_offset, 918 data_page_offset,
890 page_length, 919 page_length,
891 0); 920 0);
892 } else { 921 } else {
893 slow_shmem_copy(obj_priv->pages[shmem_page_index], 922 slow_shmem_copy(page,
894 shmem_page_offset, 923 shmem_page_offset,
895 user_pages[data_page_index], 924 user_pages[data_page_index],
896 data_page_offset, 925 data_page_offset,
897 page_length); 926 page_length);
898 } 927 }
899 928
929 set_page_dirty(page);
930 mark_page_accessed(page);
931 page_cache_release(page);
932
900 remain -= page_length; 933 remain -= page_length;
901 data_ptr += page_length; 934 data_ptr += page_length;
902 offset += page_length; 935 offset += page_length;
903 } 936 }
904 937
905fail_put_pages: 938out:
906 i915_gem_object_put_pages(obj);
907fail_unlock:
908 mutex_unlock(&dev->struct_mutex);
909fail_put_user_pages:
910 for (i = 0; i < pinned_pages; i++) 939 for (i = 0; i < pinned_pages; i++)
911 page_cache_release(user_pages[i]); 940 page_cache_release(user_pages[i]);
912 drm_free_large(user_pages); 941 drm_free_large(user_pages);
@@ -921,30 +950,43 @@ fail_put_user_pages:
921 */ 950 */
922int 951int
923i915_gem_pwrite_ioctl(struct drm_device *dev, void *data, 952i915_gem_pwrite_ioctl(struct drm_device *dev, void *data,
924 struct drm_file *file_priv) 953 struct drm_file *file)
925{ 954{
926 struct drm_i915_gem_pwrite *args = data; 955 struct drm_i915_gem_pwrite *args = data;
927 struct drm_gem_object *obj; 956 struct drm_i915_gem_object *obj;
928 struct drm_i915_gem_object *obj_priv; 957 int ret;
929 int ret = 0;
930 958
931 obj = drm_gem_object_lookup(dev, file_priv, args->handle); 959 if (args->size == 0)
932 if (obj == NULL) 960 return 0;
933 return -ENOENT; 961
934 obj_priv = to_intel_bo(obj); 962 if (!access_ok(VERIFY_READ,
963 (char __user *)(uintptr_t)args->data_ptr,
964 args->size))
965 return -EFAULT;
966
967 ret = fault_in_pages_readable((char __user *)(uintptr_t)args->data_ptr,
968 args->size);
969 if (ret)
970 return -EFAULT;
971
972 ret = i915_mutex_lock_interruptible(dev);
973 if (ret)
974 return ret;
975
976 obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
977 if (&obj->base == NULL) {
978 ret = -ENOENT;
979 goto unlock;
980 }
935 981
936 /* Bounds check destination. */ 982 /* Bounds check destination. */
937 if (args->offset > obj->size || args->size > obj->size - args->offset) { 983 if (args->offset > obj->base.size ||
984 args->size > obj->base.size - args->offset) {
938 ret = -EINVAL; 985 ret = -EINVAL;
939 goto err; 986 goto out;
940 } 987 }
941 988
942 if (!access_ok(VERIFY_READ, 989 trace_i915_gem_object_pwrite(obj, args->offset, args->size);
943 (char __user *)(uintptr_t)args->data_ptr,
944 args->size)) {
945 ret = -EFAULT;
946 goto err;
947 }
948 990
949 /* We can only do the GTT pwrite on untiled buffers, as otherwise 991 /* We can only do the GTT pwrite on untiled buffers, as otherwise
950 * it would end up going through the fenced access, and we'll get 992 * it would end up going through the fenced access, and we'll get
@@ -952,33 +994,44 @@ i915_gem_pwrite_ioctl(struct drm_device *dev, void *data,
952 * pread/pwrite currently are reading and writing from the CPU 994 * pread/pwrite currently are reading and writing from the CPU
953 * perspective, requiring manual detiling by the client. 995 * perspective, requiring manual detiling by the client.
954 */ 996 */
955 if (obj_priv->phys_obj) 997 if (obj->phys_obj)
956 ret = i915_gem_phys_pwrite(dev, obj, args, file_priv); 998 ret = i915_gem_phys_pwrite(dev, obj, args, file);
957 else if (obj_priv->tiling_mode == I915_TILING_NONE && 999 else if (obj->gtt_space &&
958 dev->gtt_total != 0 && 1000 obj->base.write_domain != I915_GEM_DOMAIN_CPU) {
959 obj->write_domain != I915_GEM_DOMAIN_CPU) { 1001 ret = i915_gem_object_pin(obj, 0, true);
960 ret = i915_gem_gtt_pwrite_fast(dev, obj, args, file_priv); 1002 if (ret)
961 if (ret == -EFAULT) { 1003 goto out;
962 ret = i915_gem_gtt_pwrite_slow(dev, obj, args, 1004
963 file_priv); 1005 ret = i915_gem_object_set_to_gtt_domain(obj, true);
964 } 1006 if (ret)
965 } else if (i915_gem_object_needs_bit17_swizzle(obj)) { 1007 goto out_unpin;
966 ret = i915_gem_shmem_pwrite_slow(dev, obj, args, file_priv); 1008
1009 ret = i915_gem_object_put_fence(obj);
1010 if (ret)
1011 goto out_unpin;
1012
1013 ret = i915_gem_gtt_pwrite_fast(dev, obj, args, file);
1014 if (ret == -EFAULT)
1015 ret = i915_gem_gtt_pwrite_slow(dev, obj, args, file);
1016
1017out_unpin:
1018 i915_gem_object_unpin(obj);
967 } else { 1019 } else {
968 ret = i915_gem_shmem_pwrite_fast(dev, obj, args, file_priv); 1020 ret = i915_gem_object_set_to_cpu_domain(obj, 1);
969 if (ret == -EFAULT) { 1021 if (ret)
970 ret = i915_gem_shmem_pwrite_slow(dev, obj, args, 1022 goto out;
971 file_priv);
972 }
973 }
974 1023
975#if WATCH_PWRITE 1024 ret = -EFAULT;
976 if (ret) 1025 if (!i915_gem_object_needs_bit17_swizzle(obj))
977 DRM_INFO("pwrite failed %d\n", ret); 1026 ret = i915_gem_shmem_pwrite_fast(dev, obj, args, file);
978#endif 1027 if (ret == -EFAULT)
1028 ret = i915_gem_shmem_pwrite_slow(dev, obj, args, file);
1029 }
979 1030
980err: 1031out:
981 drm_gem_object_unreference_unlocked(obj); 1032 drm_gem_object_unreference(&obj->base);
1033unlock:
1034 mutex_unlock(&dev->struct_mutex);
982 return ret; 1035 return ret;
983} 1036}
984 1037
@@ -988,12 +1041,10 @@ err:
988 */ 1041 */
989int 1042int
990i915_gem_set_domain_ioctl(struct drm_device *dev, void *data, 1043i915_gem_set_domain_ioctl(struct drm_device *dev, void *data,
991 struct drm_file *file_priv) 1044 struct drm_file *file)
992{ 1045{
993 struct drm_i915_private *dev_priv = dev->dev_private;
994 struct drm_i915_gem_set_domain *args = data; 1046 struct drm_i915_gem_set_domain *args = data;
995 struct drm_gem_object *obj; 1047 struct drm_i915_gem_object *obj;
996 struct drm_i915_gem_object *obj_priv;
997 uint32_t read_domains = args->read_domains; 1048 uint32_t read_domains = args->read_domains;
998 uint32_t write_domain = args->write_domain; 1049 uint32_t write_domain = args->write_domain;
999 int ret; 1050 int ret;
@@ -1014,32 +1065,19 @@ i915_gem_set_domain_ioctl(struct drm_device *dev, void *data,
1014 if (write_domain != 0 && read_domains != write_domain) 1065 if (write_domain != 0 && read_domains != write_domain)
1015 return -EINVAL; 1066 return -EINVAL;
1016 1067
1017 obj = drm_gem_object_lookup(dev, file_priv, args->handle); 1068 ret = i915_mutex_lock_interruptible(dev);
1018 if (obj == NULL) 1069 if (ret)
1019 return -ENOENT; 1070 return ret;
1020 obj_priv = to_intel_bo(obj);
1021
1022 mutex_lock(&dev->struct_mutex);
1023 1071
1024 intel_mark_busy(dev, obj); 1072 obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
1073 if (&obj->base == NULL) {
1074 ret = -ENOENT;
1075 goto unlock;
1076 }
1025 1077
1026#if WATCH_BUF
1027 DRM_INFO("set_domain_ioctl %p(%zd), %08x %08x\n",
1028 obj, obj->size, read_domains, write_domain);
1029#endif
1030 if (read_domains & I915_GEM_DOMAIN_GTT) { 1078 if (read_domains & I915_GEM_DOMAIN_GTT) {
1031 ret = i915_gem_object_set_to_gtt_domain(obj, write_domain != 0); 1079 ret = i915_gem_object_set_to_gtt_domain(obj, write_domain != 0);
1032 1080
1033 /* Update the LRU on the fence for the CPU access that's
1034 * about to occur.
1035 */
1036 if (obj_priv->fence_reg != I915_FENCE_REG_NONE) {
1037 struct drm_i915_fence_reg *reg =
1038 &dev_priv->fence_regs[obj_priv->fence_reg];
1039 list_move_tail(&reg->lru_list,
1040 &dev_priv->mm.fence_list);
1041 }
1042
1043 /* Silently promote "you're not bound, there was nothing to do" 1081 /* Silently promote "you're not bound, there was nothing to do"
1044 * to success, since the client was just asking us to 1082 * to success, since the client was just asking us to
1045 * make sure everything was done. 1083 * make sure everything was done.
@@ -1050,12 +1088,8 @@ i915_gem_set_domain_ioctl(struct drm_device *dev, void *data,
1050 ret = i915_gem_object_set_to_cpu_domain(obj, write_domain != 0); 1088 ret = i915_gem_object_set_to_cpu_domain(obj, write_domain != 0);
1051 } 1089 }
1052 1090
1053 1091 drm_gem_object_unreference(&obj->base);
1054 /* Maintain LRU order of "inactive" objects */ 1092unlock:
1055 if (ret == 0 && i915_gem_object_is_inactive(obj_priv))
1056 list_move_tail(&obj_priv->list, &dev_priv->mm.inactive_list);
1057
1058 drm_gem_object_unreference(obj);
1059 mutex_unlock(&dev->struct_mutex); 1093 mutex_unlock(&dev->struct_mutex);
1060 return ret; 1094 return ret;
1061} 1095}
@@ -1065,34 +1099,31 @@ i915_gem_set_domain_ioctl(struct drm_device *dev, void *data,
1065 */ 1099 */
1066int 1100int
1067i915_gem_sw_finish_ioctl(struct drm_device *dev, void *data, 1101i915_gem_sw_finish_ioctl(struct drm_device *dev, void *data,
1068 struct drm_file *file_priv) 1102 struct drm_file *file)
1069{ 1103{
1070 struct drm_i915_gem_sw_finish *args = data; 1104 struct drm_i915_gem_sw_finish *args = data;
1071 struct drm_gem_object *obj; 1105 struct drm_i915_gem_object *obj;
1072 struct drm_i915_gem_object *obj_priv;
1073 int ret = 0; 1106 int ret = 0;
1074 1107
1075 if (!(dev->driver->driver_features & DRIVER_GEM)) 1108 if (!(dev->driver->driver_features & DRIVER_GEM))
1076 return -ENODEV; 1109 return -ENODEV;
1077 1110
1078 mutex_lock(&dev->struct_mutex); 1111 ret = i915_mutex_lock_interruptible(dev);
1079 obj = drm_gem_object_lookup(dev, file_priv, args->handle); 1112 if (ret)
1080 if (obj == NULL) { 1113 return ret;
1081 mutex_unlock(&dev->struct_mutex);
1082 return -ENOENT;
1083 }
1084 1114
1085#if WATCH_BUF 1115 obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
1086 DRM_INFO("%s: sw_finish %d (%p %zd)\n", 1116 if (&obj->base == NULL) {
1087 __func__, args->handle, obj, obj->size); 1117 ret = -ENOENT;
1088#endif 1118 goto unlock;
1089 obj_priv = to_intel_bo(obj); 1119 }
1090 1120
1091 /* Pinned buffers may be scanout, so flush the cache */ 1121 /* Pinned buffers may be scanout, so flush the cache */
1092 if (obj_priv->pin_count) 1122 if (obj->pin_count)
1093 i915_gem_object_flush_cpu_write_domain(obj); 1123 i915_gem_object_flush_cpu_write_domain(obj);
1094 1124
1095 drm_gem_object_unreference(obj); 1125 drm_gem_object_unreference(&obj->base);
1126unlock:
1096 mutex_unlock(&dev->struct_mutex); 1127 mutex_unlock(&dev->struct_mutex);
1097 return ret; 1128 return ret;
1098} 1129}
@@ -1106,21 +1137,24 @@ i915_gem_sw_finish_ioctl(struct drm_device *dev, void *data,
1106 */ 1137 */
1107int 1138int
1108i915_gem_mmap_ioctl(struct drm_device *dev, void *data, 1139i915_gem_mmap_ioctl(struct drm_device *dev, void *data,
1109 struct drm_file *file_priv) 1140 struct drm_file *file)
1110{ 1141{
1142 struct drm_i915_private *dev_priv = dev->dev_private;
1111 struct drm_i915_gem_mmap *args = data; 1143 struct drm_i915_gem_mmap *args = data;
1112 struct drm_gem_object *obj; 1144 struct drm_gem_object *obj;
1113 loff_t offset;
1114 unsigned long addr; 1145 unsigned long addr;
1115 1146
1116 if (!(dev->driver->driver_features & DRIVER_GEM)) 1147 if (!(dev->driver->driver_features & DRIVER_GEM))
1117 return -ENODEV; 1148 return -ENODEV;
1118 1149
1119 obj = drm_gem_object_lookup(dev, file_priv, args->handle); 1150 obj = drm_gem_object_lookup(dev, file, args->handle);
1120 if (obj == NULL) 1151 if (obj == NULL)
1121 return -ENOENT; 1152 return -ENOENT;
1122 1153
1123 offset = args->offset; 1154 if (obj->size > dev_priv->mm.gtt_mappable_end) {
1155 drm_gem_object_unreference_unlocked(obj);
1156 return -E2BIG;
1157 }
1124 1158
1125 down_write(&current->mm->mmap_sem); 1159 down_write(&current->mm->mmap_sem);
1126 addr = do_mmap(obj->filp, 0, args->size, 1160 addr = do_mmap(obj->filp, 0, args->size,
@@ -1154,10 +1188,9 @@ i915_gem_mmap_ioctl(struct drm_device *dev, void *data,
1154 */ 1188 */
1155int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf) 1189int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
1156{ 1190{
1157 struct drm_gem_object *obj = vma->vm_private_data; 1191 struct drm_i915_gem_object *obj = to_intel_bo(vma->vm_private_data);
1158 struct drm_device *dev = obj->dev; 1192 struct drm_device *dev = obj->base.dev;
1159 drm_i915_private_t *dev_priv = dev->dev_private; 1193 drm_i915_private_t *dev_priv = dev->dev_private;
1160 struct drm_i915_gem_object *obj_priv = to_intel_bo(obj);
1161 pgoff_t page_offset; 1194 pgoff_t page_offset;
1162 unsigned long pfn; 1195 unsigned long pfn;
1163 int ret = 0; 1196 int ret = 0;
@@ -1167,42 +1200,64 @@ int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
1167 page_offset = ((unsigned long)vmf->virtual_address - vma->vm_start) >> 1200 page_offset = ((unsigned long)vmf->virtual_address - vma->vm_start) >>
1168 PAGE_SHIFT; 1201 PAGE_SHIFT;
1169 1202
1203 ret = i915_mutex_lock_interruptible(dev);
1204 if (ret)
1205 goto out;
1206
1207 trace_i915_gem_object_fault(obj, page_offset, true, write);
1208
1170 /* Now bind it into the GTT if needed */ 1209 /* Now bind it into the GTT if needed */
1171 mutex_lock(&dev->struct_mutex); 1210 if (!obj->map_and_fenceable) {
1172 if (!obj_priv->gtt_space) { 1211 ret = i915_gem_object_unbind(obj);
1173 ret = i915_gem_object_bind_to_gtt(obj, 0);
1174 if (ret) 1212 if (ret)
1175 goto unlock; 1213 goto unlock;
1176 1214 }
1177 ret = i915_gem_object_set_to_gtt_domain(obj, write); 1215 if (!obj->gtt_space) {
1216 ret = i915_gem_object_bind_to_gtt(obj, 0, true);
1178 if (ret) 1217 if (ret)
1179 goto unlock; 1218 goto unlock;
1180 }
1181 1219
1182 /* Need a new fence register? */ 1220 ret = i915_gem_object_set_to_gtt_domain(obj, write);
1183 if (obj_priv->tiling_mode != I915_TILING_NONE) {
1184 ret = i915_gem_object_get_fence_reg(obj);
1185 if (ret) 1221 if (ret)
1186 goto unlock; 1222 goto unlock;
1187 } 1223 }
1188 1224
1189 if (i915_gem_object_is_inactive(obj_priv)) 1225 if (obj->tiling_mode == I915_TILING_NONE)
1190 list_move_tail(&obj_priv->list, &dev_priv->mm.inactive_list); 1226 ret = i915_gem_object_put_fence(obj);
1227 else
1228 ret = i915_gem_object_get_fence(obj, NULL);
1229 if (ret)
1230 goto unlock;
1231
1232 if (i915_gem_object_is_inactive(obj))
1233 list_move_tail(&obj->mm_list, &dev_priv->mm.inactive_list);
1234
1235 obj->fault_mappable = true;
1191 1236
1192 pfn = ((dev->agp->base + obj_priv->gtt_offset) >> PAGE_SHIFT) + 1237 pfn = ((dev->agp->base + obj->gtt_offset) >> PAGE_SHIFT) +
1193 page_offset; 1238 page_offset;
1194 1239
1195 /* Finally, remap it using the new GTT offset */ 1240 /* Finally, remap it using the new GTT offset */
1196 ret = vm_insert_pfn(vma, (unsigned long)vmf->virtual_address, pfn); 1241 ret = vm_insert_pfn(vma, (unsigned long)vmf->virtual_address, pfn);
1197unlock: 1242unlock:
1198 mutex_unlock(&dev->struct_mutex); 1243 mutex_unlock(&dev->struct_mutex);
1199 1244out:
1200 switch (ret) { 1245 switch (ret) {
1246 case -EIO:
1247 case -EAGAIN:
1248 /* Give the error handler a chance to run and move the
1249 * objects off the GPU active list. Next time we service the
1250 * fault, we should be able to transition the page into the
1251 * GTT without touching the GPU (and so avoid further
1252 * EIO/EGAIN). If the GPU is wedged, then there is no issue
1253 * with coherency, just lost writes.
1254 */
1255 set_need_resched();
1201 case 0: 1256 case 0:
1202 case -ERESTARTSYS: 1257 case -ERESTARTSYS:
1258 case -EINTR:
1203 return VM_FAULT_NOPAGE; 1259 return VM_FAULT_NOPAGE;
1204 case -ENOMEM: 1260 case -ENOMEM:
1205 case -EAGAIN:
1206 return VM_FAULT_OOM; 1261 return VM_FAULT_OOM;
1207 default: 1262 default:
1208 return VM_FAULT_SIGBUS; 1263 return VM_FAULT_SIGBUS;
@@ -1221,59 +1276,58 @@ unlock:
1221 * This routine allocates and attaches a fake offset for @obj. 1276 * This routine allocates and attaches a fake offset for @obj.
1222 */ 1277 */
1223static int 1278static int
1224i915_gem_create_mmap_offset(struct drm_gem_object *obj) 1279i915_gem_create_mmap_offset(struct drm_i915_gem_object *obj)
1225{ 1280{
1226 struct drm_device *dev = obj->dev; 1281 struct drm_device *dev = obj->base.dev;
1227 struct drm_gem_mm *mm = dev->mm_private; 1282 struct drm_gem_mm *mm = dev->mm_private;
1228 struct drm_i915_gem_object *obj_priv = to_intel_bo(obj);
1229 struct drm_map_list *list; 1283 struct drm_map_list *list;
1230 struct drm_local_map *map; 1284 struct drm_local_map *map;
1231 int ret = 0; 1285 int ret = 0;
1232 1286
1233 /* Set the object up for mmap'ing */ 1287 /* Set the object up for mmap'ing */
1234 list = &obj->map_list; 1288 list = &obj->base.map_list;
1235 list->map = kzalloc(sizeof(struct drm_map_list), GFP_KERNEL); 1289 list->map = kzalloc(sizeof(struct drm_map_list), GFP_KERNEL);
1236 if (!list->map) 1290 if (!list->map)
1237 return -ENOMEM; 1291 return -ENOMEM;
1238 1292
1239 map = list->map; 1293 map = list->map;
1240 map->type = _DRM_GEM; 1294 map->type = _DRM_GEM;
1241 map->size = obj->size; 1295 map->size = obj->base.size;
1242 map->handle = obj; 1296 map->handle = obj;
1243 1297
1244 /* Get a DRM GEM mmap offset allocated... */ 1298 /* Get a DRM GEM mmap offset allocated... */
1245 list->file_offset_node = drm_mm_search_free(&mm->offset_manager, 1299 list->file_offset_node = drm_mm_search_free(&mm->offset_manager,
1246 obj->size / PAGE_SIZE, 0, 0); 1300 obj->base.size / PAGE_SIZE,
1301 0, 0);
1247 if (!list->file_offset_node) { 1302 if (!list->file_offset_node) {
1248 DRM_ERROR("failed to allocate offset for bo %d\n", obj->name); 1303 DRM_ERROR("failed to allocate offset for bo %d\n",
1249 ret = -ENOMEM; 1304 obj->base.name);
1305 ret = -ENOSPC;
1250 goto out_free_list; 1306 goto out_free_list;
1251 } 1307 }
1252 1308
1253 list->file_offset_node = drm_mm_get_block(list->file_offset_node, 1309 list->file_offset_node = drm_mm_get_block(list->file_offset_node,
1254 obj->size / PAGE_SIZE, 0); 1310 obj->base.size / PAGE_SIZE,
1311 0);
1255 if (!list->file_offset_node) { 1312 if (!list->file_offset_node) {
1256 ret = -ENOMEM; 1313 ret = -ENOMEM;
1257 goto out_free_list; 1314 goto out_free_list;
1258 } 1315 }
1259 1316
1260 list->hash.key = list->file_offset_node->start; 1317 list->hash.key = list->file_offset_node->start;
1261 if (drm_ht_insert_item(&mm->offset_hash, &list->hash)) { 1318 ret = drm_ht_insert_item(&mm->offset_hash, &list->hash);
1319 if (ret) {
1262 DRM_ERROR("failed to add to map hash\n"); 1320 DRM_ERROR("failed to add to map hash\n");
1263 ret = -ENOMEM;
1264 goto out_free_mm; 1321 goto out_free_mm;
1265 } 1322 }
1266 1323
1267 /* By now we should be all set, any drm_mmap request on the offset
1268 * below will get to our mmap & fault handler */
1269 obj_priv->mmap_offset = ((uint64_t) list->hash.key) << PAGE_SHIFT;
1270
1271 return 0; 1324 return 0;
1272 1325
1273out_free_mm: 1326out_free_mm:
1274 drm_mm_put_block(list->file_offset_node); 1327 drm_mm_put_block(list->file_offset_node);
1275out_free_list: 1328out_free_list:
1276 kfree(list->map); 1329 kfree(list->map);
1330 list->map = NULL;
1277 1331
1278 return ret; 1332 return ret;
1279} 1333}
@@ -1293,38 +1347,51 @@ out_free_list:
1293 * fixup by i915_gem_fault(). 1347 * fixup by i915_gem_fault().
1294 */ 1348 */
1295void 1349void
1296i915_gem_release_mmap(struct drm_gem_object *obj) 1350i915_gem_release_mmap(struct drm_i915_gem_object *obj)
1297{ 1351{
1298 struct drm_device *dev = obj->dev; 1352 if (!obj->fault_mappable)
1299 struct drm_i915_gem_object *obj_priv = to_intel_bo(obj); 1353 return;
1354
1355 if (obj->base.dev->dev_mapping)
1356 unmap_mapping_range(obj->base.dev->dev_mapping,
1357 (loff_t)obj->base.map_list.hash.key<<PAGE_SHIFT,
1358 obj->base.size, 1);
1300 1359
1301 if (dev->dev_mapping) 1360 obj->fault_mappable = false;
1302 unmap_mapping_range(dev->dev_mapping,
1303 obj_priv->mmap_offset, obj->size, 1);
1304} 1361}
1305 1362
1306static void 1363static void
1307i915_gem_free_mmap_offset(struct drm_gem_object *obj) 1364i915_gem_free_mmap_offset(struct drm_i915_gem_object *obj)
1308{ 1365{
1309 struct drm_device *dev = obj->dev; 1366 struct drm_device *dev = obj->base.dev;
1310 struct drm_i915_gem_object *obj_priv = to_intel_bo(obj);
1311 struct drm_gem_mm *mm = dev->mm_private; 1367 struct drm_gem_mm *mm = dev->mm_private;
1312 struct drm_map_list *list; 1368 struct drm_map_list *list = &obj->base.map_list;
1313 1369
1314 list = &obj->map_list;
1315 drm_ht_remove_item(&mm->offset_hash, &list->hash); 1370 drm_ht_remove_item(&mm->offset_hash, &list->hash);
1371 drm_mm_put_block(list->file_offset_node);
1372 kfree(list->map);
1373 list->map = NULL;
1374}
1316 1375
1317 if (list->file_offset_node) { 1376static uint32_t
1318 drm_mm_put_block(list->file_offset_node); 1377i915_gem_get_gtt_size(struct drm_device *dev, uint32_t size, int tiling_mode)
1319 list->file_offset_node = NULL; 1378{
1320 } 1379 uint32_t gtt_size;
1321 1380
1322 if (list->map) { 1381 if (INTEL_INFO(dev)->gen >= 4 ||
1323 kfree(list->map); 1382 tiling_mode == I915_TILING_NONE)
1324 list->map = NULL; 1383 return size;
1325 } 1384
1385 /* Previous chips need a power-of-two fence region when tiling */
1386 if (INTEL_INFO(dev)->gen == 3)
1387 gtt_size = 1024*1024;
1388 else
1389 gtt_size = 512*1024;
1390
1391 while (gtt_size < size)
1392 gtt_size <<= 1;
1326 1393
1327 obj_priv->mmap_offset = 0; 1394 return gtt_size;
1328} 1395}
1329 1396
1330/** 1397/**
@@ -1332,42 +1399,111 @@ i915_gem_free_mmap_offset(struct drm_gem_object *obj)
1332 * @obj: object to check 1399 * @obj: object to check
1333 * 1400 *
1334 * Return the required GTT alignment for an object, taking into account 1401 * Return the required GTT alignment for an object, taking into account
1335 * potential fence register mapping if needed. 1402 * potential fence register mapping.
1336 */ 1403 */
1337static uint32_t 1404static uint32_t
1338i915_gem_get_gtt_alignment(struct drm_gem_object *obj) 1405i915_gem_get_gtt_alignment(struct drm_device *dev,
1406 uint32_t size,
1407 int tiling_mode)
1339{ 1408{
1340 struct drm_device *dev = obj->dev;
1341 struct drm_i915_gem_object *obj_priv = to_intel_bo(obj);
1342 int start, i;
1343
1344 /* 1409 /*
1345 * Minimum alignment is 4k (GTT page size), but might be greater 1410 * Minimum alignment is 4k (GTT page size), but might be greater
1346 * if a fence register is needed for the object. 1411 * if a fence register is needed for the object.
1347 */ 1412 */
1348 if (IS_I965G(dev) || obj_priv->tiling_mode == I915_TILING_NONE) 1413 if (INTEL_INFO(dev)->gen >= 4 ||
1414 tiling_mode == I915_TILING_NONE)
1349 return 4096; 1415 return 4096;
1350 1416
1351 /* 1417 /*
1352 * Previous chips need to be aligned to the size of the smallest 1418 * Previous chips need to be aligned to the size of the smallest
1353 * fence register that can contain the object. 1419 * fence register that can contain the object.
1354 */ 1420 */
1355 if (IS_I9XX(dev)) 1421 return i915_gem_get_gtt_size(dev, size, tiling_mode);
1356 start = 1024*1024; 1422}
1357 else
1358 start = 512*1024;
1359 1423
1360 for (i = start; i < obj->size; i <<= 1) 1424/**
1361 ; 1425 * i915_gem_get_unfenced_gtt_alignment - return required GTT alignment for an
1426 * unfenced object
1427 * @dev: the device
1428 * @size: size of the object
1429 * @tiling_mode: tiling mode of the object
1430 *
1431 * Return the required GTT alignment for an object, only taking into account
1432 * unfenced tiled surface requirements.
1433 */
1434uint32_t
1435i915_gem_get_unfenced_gtt_alignment(struct drm_device *dev,
1436 uint32_t size,
1437 int tiling_mode)
1438{
1439 /*
1440 * Minimum alignment is 4k (GTT page size) for sane hw.
1441 */
1442 if (INTEL_INFO(dev)->gen >= 4 || IS_G33(dev) ||
1443 tiling_mode == I915_TILING_NONE)
1444 return 4096;
1362 1445
1363 return i; 1446 /* Previous hardware however needs to be aligned to a power-of-two
1447 * tile height. The simplest method for determining this is to reuse
1448 * the power-of-tile object size.
1449 */
1450 return i915_gem_get_gtt_size(dev, size, tiling_mode);
1451}
1452
1453int
1454i915_gem_mmap_gtt(struct drm_file *file,
1455 struct drm_device *dev,
1456 uint32_t handle,
1457 uint64_t *offset)
1458{
1459 struct drm_i915_private *dev_priv = dev->dev_private;
1460 struct drm_i915_gem_object *obj;
1461 int ret;
1462
1463 if (!(dev->driver->driver_features & DRIVER_GEM))
1464 return -ENODEV;
1465
1466 ret = i915_mutex_lock_interruptible(dev);
1467 if (ret)
1468 return ret;
1469
1470 obj = to_intel_bo(drm_gem_object_lookup(dev, file, handle));
1471 if (&obj->base == NULL) {
1472 ret = -ENOENT;
1473 goto unlock;
1474 }
1475
1476 if (obj->base.size > dev_priv->mm.gtt_mappable_end) {
1477 ret = -E2BIG;
1478 goto unlock;
1479 }
1480
1481 if (obj->madv != I915_MADV_WILLNEED) {
1482 DRM_ERROR("Attempting to mmap a purgeable buffer\n");
1483 ret = -EINVAL;
1484 goto out;
1485 }
1486
1487 if (!obj->base.map_list.map) {
1488 ret = i915_gem_create_mmap_offset(obj);
1489 if (ret)
1490 goto out;
1491 }
1492
1493 *offset = (u64)obj->base.map_list.hash.key << PAGE_SHIFT;
1494
1495out:
1496 drm_gem_object_unreference(&obj->base);
1497unlock:
1498 mutex_unlock(&dev->struct_mutex);
1499 return ret;
1364} 1500}
1365 1501
1366/** 1502/**
1367 * i915_gem_mmap_gtt_ioctl - prepare an object for GTT mmap'ing 1503 * i915_gem_mmap_gtt_ioctl - prepare an object for GTT mmap'ing
1368 * @dev: DRM device 1504 * @dev: DRM device
1369 * @data: GTT mapping ioctl data 1505 * @data: GTT mapping ioctl data
1370 * @file_priv: GEM object info 1506 * @file: GEM object info
1371 * 1507 *
1372 * Simply returns the fake offset to userspace so it can mmap it. 1508 * Simply returns the fake offset to userspace so it can mmap it.
1373 * The mmap call will end up in drm_gem_mmap(), which will set things 1509 * The mmap call will end up in drm_gem_mmap(), which will set things
@@ -1380,236 +1516,233 @@ i915_gem_get_gtt_alignment(struct drm_gem_object *obj)
1380 */ 1516 */
1381int 1517int
1382i915_gem_mmap_gtt_ioctl(struct drm_device *dev, void *data, 1518i915_gem_mmap_gtt_ioctl(struct drm_device *dev, void *data,
1383 struct drm_file *file_priv) 1519 struct drm_file *file)
1384{ 1520{
1385 struct drm_i915_gem_mmap_gtt *args = data; 1521 struct drm_i915_gem_mmap_gtt *args = data;
1386 struct drm_gem_object *obj;
1387 struct drm_i915_gem_object *obj_priv;
1388 int ret;
1389 1522
1390 if (!(dev->driver->driver_features & DRIVER_GEM)) 1523 if (!(dev->driver->driver_features & DRIVER_GEM))
1391 return -ENODEV; 1524 return -ENODEV;
1392 1525
1393 obj = drm_gem_object_lookup(dev, file_priv, args->handle); 1526 return i915_gem_mmap_gtt(file, dev, args->handle, &args->offset);
1394 if (obj == NULL) 1527}
1395 return -ENOENT;
1396
1397 mutex_lock(&dev->struct_mutex);
1398 1528
1399 obj_priv = to_intel_bo(obj);
1400 1529
1401 if (obj_priv->madv != I915_MADV_WILLNEED) { 1530static int
1402 DRM_ERROR("Attempting to mmap a purgeable buffer\n"); 1531i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj,
1403 drm_gem_object_unreference(obj); 1532 gfp_t gfpmask)
1404 mutex_unlock(&dev->struct_mutex); 1533{
1405 return -EINVAL; 1534 int page_count, i;
1406 } 1535 struct address_space *mapping;
1536 struct inode *inode;
1537 struct page *page;
1407 1538
1539 /* Get the list of pages out of our struct file. They'll be pinned
1540 * at this point until we release them.
1541 */
1542 page_count = obj->base.size / PAGE_SIZE;
1543 BUG_ON(obj->pages != NULL);
1544 obj->pages = drm_malloc_ab(page_count, sizeof(struct page *));
1545 if (obj->pages == NULL)
1546 return -ENOMEM;
1408 1547
1409 if (!obj_priv->mmap_offset) { 1548 inode = obj->base.filp->f_path.dentry->d_inode;
1410 ret = i915_gem_create_mmap_offset(obj); 1549 mapping = inode->i_mapping;
1411 if (ret) { 1550 gfpmask |= mapping_gfp_mask(mapping);
1412 drm_gem_object_unreference(obj);
1413 mutex_unlock(&dev->struct_mutex);
1414 return ret;
1415 }
1416 }
1417 1551
1418 args->offset = obj_priv->mmap_offset; 1552 for (i = 0; i < page_count; i++) {
1553 page = shmem_read_mapping_page_gfp(mapping, i, gfpmask);
1554 if (IS_ERR(page))
1555 goto err_pages;
1419 1556
1420 /* 1557 obj->pages[i] = page;
1421 * Pull it into the GTT so that we have a page list (makes the
1422 * initial fault faster and any subsequent flushing possible).
1423 */
1424 if (!obj_priv->agp_mem) {
1425 ret = i915_gem_object_bind_to_gtt(obj, 0);
1426 if (ret) {
1427 drm_gem_object_unreference(obj);
1428 mutex_unlock(&dev->struct_mutex);
1429 return ret;
1430 }
1431 } 1558 }
1432 1559
1433 drm_gem_object_unreference(obj); 1560 if (obj->tiling_mode != I915_TILING_NONE)
1434 mutex_unlock(&dev->struct_mutex); 1561 i915_gem_object_do_bit_17_swizzle(obj);
1435 1562
1436 return 0; 1563 return 0;
1564
1565err_pages:
1566 while (i--)
1567 page_cache_release(obj->pages[i]);
1568
1569 drm_free_large(obj->pages);
1570 obj->pages = NULL;
1571 return PTR_ERR(page);
1437} 1572}
1438 1573
1439void 1574static void
1440i915_gem_object_put_pages(struct drm_gem_object *obj) 1575i915_gem_object_put_pages_gtt(struct drm_i915_gem_object *obj)
1441{ 1576{
1442 struct drm_i915_gem_object *obj_priv = to_intel_bo(obj); 1577 int page_count = obj->base.size / PAGE_SIZE;
1443 int page_count = obj->size / PAGE_SIZE;
1444 int i; 1578 int i;
1445 1579
1446 BUG_ON(obj_priv->pages_refcount == 0); 1580 BUG_ON(obj->madv == __I915_MADV_PURGED);
1447 BUG_ON(obj_priv->madv == __I915_MADV_PURGED);
1448 1581
1449 if (--obj_priv->pages_refcount != 0) 1582 if (obj->tiling_mode != I915_TILING_NONE)
1450 return;
1451
1452 if (obj_priv->tiling_mode != I915_TILING_NONE)
1453 i915_gem_object_save_bit_17_swizzle(obj); 1583 i915_gem_object_save_bit_17_swizzle(obj);
1454 1584
1455 if (obj_priv->madv == I915_MADV_DONTNEED) 1585 if (obj->madv == I915_MADV_DONTNEED)
1456 obj_priv->dirty = 0; 1586 obj->dirty = 0;
1457 1587
1458 for (i = 0; i < page_count; i++) { 1588 for (i = 0; i < page_count; i++) {
1459 if (obj_priv->dirty) 1589 if (obj->dirty)
1460 set_page_dirty(obj_priv->pages[i]); 1590 set_page_dirty(obj->pages[i]);
1461 1591
1462 if (obj_priv->madv == I915_MADV_WILLNEED) 1592 if (obj->madv == I915_MADV_WILLNEED)
1463 mark_page_accessed(obj_priv->pages[i]); 1593 mark_page_accessed(obj->pages[i]);
1464 1594
1465 page_cache_release(obj_priv->pages[i]); 1595 page_cache_release(obj->pages[i]);
1466 } 1596 }
1467 obj_priv->dirty = 0; 1597 obj->dirty = 0;
1468 1598
1469 drm_free_large(obj_priv->pages); 1599 drm_free_large(obj->pages);
1470 obj_priv->pages = NULL; 1600 obj->pages = NULL;
1471} 1601}
1472 1602
1473static void 1603void
1474i915_gem_object_move_to_active(struct drm_gem_object *obj, uint32_t seqno, 1604i915_gem_object_move_to_active(struct drm_i915_gem_object *obj,
1475 struct intel_ring_buffer *ring) 1605 struct intel_ring_buffer *ring,
1606 u32 seqno)
1476{ 1607{
1477 struct drm_device *dev = obj->dev; 1608 struct drm_device *dev = obj->base.dev;
1478 drm_i915_private_t *dev_priv = dev->dev_private; 1609 struct drm_i915_private *dev_priv = dev->dev_private;
1479 struct drm_i915_gem_object *obj_priv = to_intel_bo(obj); 1610
1480 BUG_ON(ring == NULL); 1611 BUG_ON(ring == NULL);
1481 obj_priv->ring = ring; 1612 obj->ring = ring;
1482 1613
1483 /* Add a reference if we're newly entering the active list. */ 1614 /* Add a reference if we're newly entering the active list. */
1484 if (!obj_priv->active) { 1615 if (!obj->active) {
1485 drm_gem_object_reference(obj); 1616 drm_gem_object_reference(&obj->base);
1486 obj_priv->active = 1; 1617 obj->active = 1;
1487 } 1618 }
1619
1488 /* Move from whatever list we were on to the tail of execution. */ 1620 /* Move from whatever list we were on to the tail of execution. */
1489 spin_lock(&dev_priv->mm.active_list_lock); 1621 list_move_tail(&obj->mm_list, &dev_priv->mm.active_list);
1490 list_move_tail(&obj_priv->list, &ring->active_list); 1622 list_move_tail(&obj->ring_list, &ring->active_list);
1491 spin_unlock(&dev_priv->mm.active_list_lock); 1623
1492 obj_priv->last_rendering_seqno = seqno; 1624 obj->last_rendering_seqno = seqno;
1625 if (obj->fenced_gpu_access) {
1626 struct drm_i915_fence_reg *reg;
1627
1628 BUG_ON(obj->fence_reg == I915_FENCE_REG_NONE);
1629
1630 obj->last_fenced_seqno = seqno;
1631 obj->last_fenced_ring = ring;
1632
1633 reg = &dev_priv->fence_regs[obj->fence_reg];
1634 list_move_tail(&reg->lru_list, &dev_priv->mm.fence_list);
1635 }
1493} 1636}
1494 1637
1495static void 1638static void
1496i915_gem_object_move_to_flushing(struct drm_gem_object *obj) 1639i915_gem_object_move_off_active(struct drm_i915_gem_object *obj)
1497{ 1640{
1498 struct drm_device *dev = obj->dev; 1641 list_del_init(&obj->ring_list);
1642 obj->last_rendering_seqno = 0;
1643}
1644
1645static void
1646i915_gem_object_move_to_flushing(struct drm_i915_gem_object *obj)
1647{
1648 struct drm_device *dev = obj->base.dev;
1499 drm_i915_private_t *dev_priv = dev->dev_private; 1649 drm_i915_private_t *dev_priv = dev->dev_private;
1500 struct drm_i915_gem_object *obj_priv = to_intel_bo(obj);
1501 1650
1502 BUG_ON(!obj_priv->active); 1651 BUG_ON(!obj->active);
1503 list_move_tail(&obj_priv->list, &dev_priv->mm.flushing_list); 1652 list_move_tail(&obj->mm_list, &dev_priv->mm.flushing_list);
1504 obj_priv->last_rendering_seqno = 0; 1653
1654 i915_gem_object_move_off_active(obj);
1655}
1656
1657static void
1658i915_gem_object_move_to_inactive(struct drm_i915_gem_object *obj)
1659{
1660 struct drm_device *dev = obj->base.dev;
1661 struct drm_i915_private *dev_priv = dev->dev_private;
1662
1663 if (obj->pin_count != 0)
1664 list_move_tail(&obj->mm_list, &dev_priv->mm.pinned_list);
1665 else
1666 list_move_tail(&obj->mm_list, &dev_priv->mm.inactive_list);
1667
1668 BUG_ON(!list_empty(&obj->gpu_write_list));
1669 BUG_ON(!obj->active);
1670 obj->ring = NULL;
1671
1672 i915_gem_object_move_off_active(obj);
1673 obj->fenced_gpu_access = false;
1674
1675 obj->active = 0;
1676 obj->pending_gpu_write = false;
1677 drm_gem_object_unreference(&obj->base);
1678
1679 WARN_ON(i915_verify_lists(dev));
1505} 1680}
1506 1681
1507/* Immediately discard the backing storage */ 1682/* Immediately discard the backing storage */
1508static void 1683static void
1509i915_gem_object_truncate(struct drm_gem_object *obj) 1684i915_gem_object_truncate(struct drm_i915_gem_object *obj)
1510{ 1685{
1511 struct drm_i915_gem_object *obj_priv = to_intel_bo(obj);
1512 struct inode *inode; 1686 struct inode *inode;
1513 1687
1514 /* Our goal here is to return as much of the memory as 1688 /* Our goal here is to return as much of the memory as
1515 * is possible back to the system as we are called from OOM. 1689 * is possible back to the system as we are called from OOM.
1516 * To do this we must instruct the shmfs to drop all of its 1690 * To do this we must instruct the shmfs to drop all of its
1517 * backing pages, *now*. Here we mirror the actions taken 1691 * backing pages, *now*.
1518 * when by shmem_delete_inode() to release the backing store.
1519 */ 1692 */
1520 inode = obj->filp->f_path.dentry->d_inode; 1693 inode = obj->base.filp->f_path.dentry->d_inode;
1521 truncate_inode_pages(inode->i_mapping, 0); 1694 shmem_truncate_range(inode, 0, (loff_t)-1);
1522 if (inode->i_op->truncate_range)
1523 inode->i_op->truncate_range(inode, 0, (loff_t)-1);
1524 1695
1525 obj_priv->madv = __I915_MADV_PURGED; 1696 obj->madv = __I915_MADV_PURGED;
1526} 1697}
1527 1698
1528static inline int 1699static inline int
1529i915_gem_object_is_purgeable(struct drm_i915_gem_object *obj_priv) 1700i915_gem_object_is_purgeable(struct drm_i915_gem_object *obj)
1530{
1531 return obj_priv->madv == I915_MADV_DONTNEED;
1532}
1533
1534static void
1535i915_gem_object_move_to_inactive(struct drm_gem_object *obj)
1536{ 1701{
1537 struct drm_device *dev = obj->dev; 1702 return obj->madv == I915_MADV_DONTNEED;
1538 drm_i915_private_t *dev_priv = dev->dev_private;
1539 struct drm_i915_gem_object *obj_priv = to_intel_bo(obj);
1540
1541 i915_verify_inactive(dev, __FILE__, __LINE__);
1542 if (obj_priv->pin_count != 0)
1543 list_del_init(&obj_priv->list);
1544 else
1545 list_move_tail(&obj_priv->list, &dev_priv->mm.inactive_list);
1546
1547 BUG_ON(!list_empty(&obj_priv->gpu_write_list));
1548
1549 obj_priv->last_rendering_seqno = 0;
1550 obj_priv->ring = NULL;
1551 if (obj_priv->active) {
1552 obj_priv->active = 0;
1553 drm_gem_object_unreference(obj);
1554 }
1555 i915_verify_inactive(dev, __FILE__, __LINE__);
1556} 1703}
1557 1704
1558static void 1705static void
1559i915_gem_process_flushing_list(struct drm_device *dev, 1706i915_gem_process_flushing_list(struct intel_ring_buffer *ring,
1560 uint32_t flush_domains, uint32_t seqno, 1707 uint32_t flush_domains)
1561 struct intel_ring_buffer *ring)
1562{ 1708{
1563 drm_i915_private_t *dev_priv = dev->dev_private; 1709 struct drm_i915_gem_object *obj, *next;
1564 struct drm_i915_gem_object *obj_priv, *next;
1565 1710
1566 list_for_each_entry_safe(obj_priv, next, 1711 list_for_each_entry_safe(obj, next,
1567 &dev_priv->mm.gpu_write_list, 1712 &ring->gpu_write_list,
1568 gpu_write_list) { 1713 gpu_write_list) {
1569 struct drm_gem_object *obj = &obj_priv->base; 1714 if (obj->base.write_domain & flush_domains) {
1570 1715 uint32_t old_write_domain = obj->base.write_domain;
1571 if ((obj->write_domain & flush_domains) == 1716
1572 obj->write_domain && 1717 obj->base.write_domain = 0;
1573 obj_priv->ring->ring_flag == ring->ring_flag) { 1718 list_del_init(&obj->gpu_write_list);
1574 uint32_t old_write_domain = obj->write_domain; 1719 i915_gem_object_move_to_active(obj, ring,
1575 1720 i915_gem_next_request_seqno(ring));
1576 obj->write_domain = 0;
1577 list_del_init(&obj_priv->gpu_write_list);
1578 i915_gem_object_move_to_active(obj, seqno, ring);
1579
1580 /* update the fence lru list */
1581 if (obj_priv->fence_reg != I915_FENCE_REG_NONE) {
1582 struct drm_i915_fence_reg *reg =
1583 &dev_priv->fence_regs[obj_priv->fence_reg];
1584 list_move_tail(&reg->lru_list,
1585 &dev_priv->mm.fence_list);
1586 }
1587 1721
1588 trace_i915_gem_object_change_domain(obj, 1722 trace_i915_gem_object_change_domain(obj,
1589 obj->read_domains, 1723 obj->base.read_domains,
1590 old_write_domain); 1724 old_write_domain);
1591 } 1725 }
1592 } 1726 }
1593} 1727}
1594 1728
1595uint32_t 1729int
1596i915_add_request(struct drm_device *dev, struct drm_file *file_priv, 1730i915_add_request(struct intel_ring_buffer *ring,
1597 uint32_t flush_domains, struct intel_ring_buffer *ring) 1731 struct drm_file *file,
1732 struct drm_i915_gem_request *request)
1598{ 1733{
1599 drm_i915_private_t *dev_priv = dev->dev_private; 1734 drm_i915_private_t *dev_priv = ring->dev->dev_private;
1600 struct drm_i915_file_private *i915_file_priv = NULL;
1601 struct drm_i915_gem_request *request;
1602 uint32_t seqno; 1735 uint32_t seqno;
1603 int was_empty; 1736 int was_empty;
1737 int ret;
1604 1738
1605 if (file_priv != NULL) 1739 BUG_ON(request == NULL);
1606 i915_file_priv = file_priv->driver_priv;
1607 1740
1608 request = kzalloc(sizeof(*request), GFP_KERNEL); 1741 ret = ring->add_request(ring, &seqno);
1609 if (request == NULL) 1742 if (ret)
1610 return 0; 1743 return ret;
1611 1744
1612 seqno = ring->add_request(dev, ring, file_priv, flush_domains); 1745 trace_i915_gem_request_add(ring, seqno);
1613 1746
1614 request->seqno = seqno; 1747 request->seqno = seqno;
1615 request->ring = ring; 1748 request->ring = ring;
@@ -1617,260 +1750,353 @@ i915_add_request(struct drm_device *dev, struct drm_file *file_priv,
1617 was_empty = list_empty(&ring->request_list); 1750 was_empty = list_empty(&ring->request_list);
1618 list_add_tail(&request->list, &ring->request_list); 1751 list_add_tail(&request->list, &ring->request_list);
1619 1752
1620 if (i915_file_priv) { 1753 if (file) {
1754 struct drm_i915_file_private *file_priv = file->driver_priv;
1755
1756 spin_lock(&file_priv->mm.lock);
1757 request->file_priv = file_priv;
1621 list_add_tail(&request->client_list, 1758 list_add_tail(&request->client_list,
1622 &i915_file_priv->mm.request_list); 1759 &file_priv->mm.request_list);
1623 } else { 1760 spin_unlock(&file_priv->mm.lock);
1624 INIT_LIST_HEAD(&request->client_list);
1625 } 1761 }
1626 1762
1627 /* Associate any objects on the flushing list matching the write 1763 ring->outstanding_lazy_request = false;
1628 * domain we're flushing with our flush.
1629 */
1630 if (flush_domains != 0)
1631 i915_gem_process_flushing_list(dev, flush_domains, seqno, ring);
1632 1764
1633 if (!dev_priv->mm.suspended) { 1765 if (!dev_priv->mm.suspended) {
1634 mod_timer(&dev_priv->hangcheck_timer, jiffies + DRM_I915_HANGCHECK_PERIOD); 1766 mod_timer(&dev_priv->hangcheck_timer,
1767 jiffies + msecs_to_jiffies(DRM_I915_HANGCHECK_PERIOD));
1635 if (was_empty) 1768 if (was_empty)
1636 queue_delayed_work(dev_priv->wq, &dev_priv->mm.retire_work, HZ); 1769 queue_delayed_work(dev_priv->wq,
1770 &dev_priv->mm.retire_work, HZ);
1637 } 1771 }
1638 return seqno; 1772 return 0;
1639} 1773}
1640 1774
1641/** 1775static inline void
1642 * Command execution barrier 1776i915_gem_request_remove_from_client(struct drm_i915_gem_request *request)
1643 *
1644 * Ensures that all commands in the ring are finished
1645 * before signalling the CPU
1646 */
1647static uint32_t
1648i915_retire_commands(struct drm_device *dev, struct intel_ring_buffer *ring)
1649{ 1777{
1650 uint32_t flush_domains = 0; 1778 struct drm_i915_file_private *file_priv = request->file_priv;
1651 1779
1652 /* The sampler always gets flushed on i965 (sigh) */ 1780 if (!file_priv)
1653 if (IS_I965G(dev)) 1781 return;
1654 flush_domains |= I915_GEM_DOMAIN_SAMPLER;
1655 1782
1656 ring->flush(dev, ring, 1783 spin_lock(&file_priv->mm.lock);
1657 I915_GEM_DOMAIN_COMMAND, flush_domains); 1784 if (request->file_priv) {
1658 return flush_domains; 1785 list_del(&request->client_list);
1786 request->file_priv = NULL;
1787 }
1788 spin_unlock(&file_priv->mm.lock);
1659} 1789}
1660 1790
1661/** 1791static void i915_gem_reset_ring_lists(struct drm_i915_private *dev_priv,
1662 * Moves buffers associated only with the given active seqno from the active 1792 struct intel_ring_buffer *ring)
1663 * to inactive list, potentially freeing them.
1664 */
1665static void
1666i915_gem_retire_request(struct drm_device *dev,
1667 struct drm_i915_gem_request *request)
1668{ 1793{
1669 drm_i915_private_t *dev_priv = dev->dev_private; 1794 while (!list_empty(&ring->request_list)) {
1795 struct drm_i915_gem_request *request;
1670 1796
1671 trace_i915_gem_request_retire(dev, request->seqno); 1797 request = list_first_entry(&ring->request_list,
1798 struct drm_i915_gem_request,
1799 list);
1672 1800
1673 /* Move any buffers on the active list that are no longer referenced 1801 list_del(&request->list);
1674 * by the ringbuffer to the flushing/inactive lists as appropriate. 1802 i915_gem_request_remove_from_client(request);
1675 */ 1803 kfree(request);
1676 spin_lock(&dev_priv->mm.active_list_lock); 1804 }
1677 while (!list_empty(&request->ring->active_list)) {
1678 struct drm_gem_object *obj;
1679 struct drm_i915_gem_object *obj_priv;
1680
1681 obj_priv = list_first_entry(&request->ring->active_list,
1682 struct drm_i915_gem_object,
1683 list);
1684 obj = &obj_priv->base;
1685
1686 /* If the seqno being retired doesn't match the oldest in the
1687 * list, then the oldest in the list must still be newer than
1688 * this seqno.
1689 */
1690 if (obj_priv->last_rendering_seqno != request->seqno)
1691 goto out;
1692 1805
1693#if WATCH_LRU 1806 while (!list_empty(&ring->active_list)) {
1694 DRM_INFO("%s: retire %d moves to inactive list %p\n", 1807 struct drm_i915_gem_object *obj;
1695 __func__, request->seqno, obj);
1696#endif
1697 1808
1698 if (obj->write_domain != 0) 1809 obj = list_first_entry(&ring->active_list,
1699 i915_gem_object_move_to_flushing(obj); 1810 struct drm_i915_gem_object,
1700 else { 1811 ring_list);
1701 /* Take a reference on the object so it won't be 1812
1702 * freed while the spinlock is held. The list 1813 obj->base.write_domain = 0;
1703 * protection for this spinlock is safe when breaking 1814 list_del_init(&obj->gpu_write_list);
1704 * the lock like this since the next thing we do 1815 i915_gem_object_move_to_inactive(obj);
1705 * is just get the head of the list again.
1706 */
1707 drm_gem_object_reference(obj);
1708 i915_gem_object_move_to_inactive(obj);
1709 spin_unlock(&dev_priv->mm.active_list_lock);
1710 drm_gem_object_unreference(obj);
1711 spin_lock(&dev_priv->mm.active_list_lock);
1712 }
1713 } 1816 }
1714out:
1715 spin_unlock(&dev_priv->mm.active_list_lock);
1716} 1817}
1717 1818
1718/** 1819static void i915_gem_reset_fences(struct drm_device *dev)
1719 * Returns true if seq1 is later than seq2.
1720 */
1721bool
1722i915_seqno_passed(uint32_t seq1, uint32_t seq2)
1723{ 1820{
1724 return (int32_t)(seq1 - seq2) >= 0; 1821 struct drm_i915_private *dev_priv = dev->dev_private;
1822 int i;
1823
1824 for (i = 0; i < 16; i++) {
1825 struct drm_i915_fence_reg *reg = &dev_priv->fence_regs[i];
1826 struct drm_i915_gem_object *obj = reg->obj;
1827
1828 if (!obj)
1829 continue;
1830
1831 if (obj->tiling_mode)
1832 i915_gem_release_mmap(obj);
1833
1834 reg->obj->fence_reg = I915_FENCE_REG_NONE;
1835 reg->obj->fenced_gpu_access = false;
1836 reg->obj->last_fenced_seqno = 0;
1837 reg->obj->last_fenced_ring = NULL;
1838 i915_gem_clear_fence_reg(dev, reg);
1839 }
1725} 1840}
1726 1841
1727uint32_t 1842void i915_gem_reset(struct drm_device *dev)
1728i915_get_gem_seqno(struct drm_device *dev,
1729 struct intel_ring_buffer *ring)
1730{ 1843{
1731 return ring->get_gem_seqno(dev, ring); 1844 struct drm_i915_private *dev_priv = dev->dev_private;
1845 struct drm_i915_gem_object *obj;
1846 int i;
1847
1848 for (i = 0; i < I915_NUM_RINGS; i++)
1849 i915_gem_reset_ring_lists(dev_priv, &dev_priv->ring[i]);
1850
1851 /* Remove anything from the flushing lists. The GPU cache is likely
1852 * to be lost on reset along with the data, so simply move the
1853 * lost bo to the inactive list.
1854 */
1855 while (!list_empty(&dev_priv->mm.flushing_list)) {
1856 obj= list_first_entry(&dev_priv->mm.flushing_list,
1857 struct drm_i915_gem_object,
1858 mm_list);
1859
1860 obj->base.write_domain = 0;
1861 list_del_init(&obj->gpu_write_list);
1862 i915_gem_object_move_to_inactive(obj);
1863 }
1864
1865 /* Move everything out of the GPU domains to ensure we do any
1866 * necessary invalidation upon reuse.
1867 */
1868 list_for_each_entry(obj,
1869 &dev_priv->mm.inactive_list,
1870 mm_list)
1871 {
1872 obj->base.read_domains &= ~I915_GEM_GPU_DOMAINS;
1873 }
1874
1875 /* The fence registers are invalidated so clear them out */
1876 i915_gem_reset_fences(dev);
1732} 1877}
1733 1878
1734/** 1879/**
1735 * This function clears the request list as sequence numbers are passed. 1880 * This function clears the request list as sequence numbers are passed.
1736 */ 1881 */
1737static void 1882static void
1738i915_gem_retire_requests_ring(struct drm_device *dev, 1883i915_gem_retire_requests_ring(struct intel_ring_buffer *ring)
1739 struct intel_ring_buffer *ring)
1740{ 1884{
1741 drm_i915_private_t *dev_priv = dev->dev_private;
1742 uint32_t seqno; 1885 uint32_t seqno;
1886 int i;
1743 1887
1744 if (!ring->status_page.page_addr 1888 if (list_empty(&ring->request_list))
1745 || list_empty(&ring->request_list))
1746 return; 1889 return;
1747 1890
1748 seqno = i915_get_gem_seqno(dev, ring); 1891 WARN_ON(i915_verify_lists(ring->dev));
1892
1893 seqno = ring->get_seqno(ring);
1894
1895 for (i = 0; i < ARRAY_SIZE(ring->sync_seqno); i++)
1896 if (seqno >= ring->sync_seqno[i])
1897 ring->sync_seqno[i] = 0;
1749 1898
1750 while (!list_empty(&ring->request_list)) { 1899 while (!list_empty(&ring->request_list)) {
1751 struct drm_i915_gem_request *request; 1900 struct drm_i915_gem_request *request;
1752 uint32_t retiring_seqno;
1753 1901
1754 request = list_first_entry(&ring->request_list, 1902 request = list_first_entry(&ring->request_list,
1755 struct drm_i915_gem_request, 1903 struct drm_i915_gem_request,
1756 list); 1904 list);
1757 retiring_seqno = request->seqno;
1758 1905
1759 if (i915_seqno_passed(seqno, retiring_seqno) || 1906 if (!i915_seqno_passed(seqno, request->seqno))
1760 atomic_read(&dev_priv->mm.wedged)) {
1761 i915_gem_retire_request(dev, request);
1762
1763 list_del(&request->list);
1764 list_del(&request->client_list);
1765 kfree(request);
1766 } else
1767 break; 1907 break;
1908
1909 trace_i915_gem_request_retire(ring, request->seqno);
1910
1911 list_del(&request->list);
1912 i915_gem_request_remove_from_client(request);
1913 kfree(request);
1768 } 1914 }
1769 1915
1770 if (unlikely (dev_priv->trace_irq_seqno && 1916 /* Move any buffers on the active list that are no longer referenced
1771 i915_seqno_passed(dev_priv->trace_irq_seqno, seqno))) { 1917 * by the ringbuffer to the flushing/inactive lists as appropriate.
1918 */
1919 while (!list_empty(&ring->active_list)) {
1920 struct drm_i915_gem_object *obj;
1921
1922 obj= list_first_entry(&ring->active_list,
1923 struct drm_i915_gem_object,
1924 ring_list);
1925
1926 if (!i915_seqno_passed(seqno, obj->last_rendering_seqno))
1927 break;
1928
1929 if (obj->base.write_domain != 0)
1930 i915_gem_object_move_to_flushing(obj);
1931 else
1932 i915_gem_object_move_to_inactive(obj);
1933 }
1772 1934
1773 ring->user_irq_put(dev, ring); 1935 if (unlikely(ring->trace_irq_seqno &&
1774 dev_priv->trace_irq_seqno = 0; 1936 i915_seqno_passed(seqno, ring->trace_irq_seqno))) {
1937 ring->irq_put(ring);
1938 ring->trace_irq_seqno = 0;
1775 } 1939 }
1940
1941 WARN_ON(i915_verify_lists(ring->dev));
1776} 1942}
1777 1943
1778void 1944void
1779i915_gem_retire_requests(struct drm_device *dev) 1945i915_gem_retire_requests(struct drm_device *dev)
1780{ 1946{
1781 drm_i915_private_t *dev_priv = dev->dev_private; 1947 drm_i915_private_t *dev_priv = dev->dev_private;
1948 int i;
1782 1949
1783 if (!list_empty(&dev_priv->mm.deferred_free_list)) { 1950 if (!list_empty(&dev_priv->mm.deferred_free_list)) {
1784 struct drm_i915_gem_object *obj_priv, *tmp; 1951 struct drm_i915_gem_object *obj, *next;
1785 1952
1786 /* We must be careful that during unbind() we do not 1953 /* We must be careful that during unbind() we do not
1787 * accidentally infinitely recurse into retire requests. 1954 * accidentally infinitely recurse into retire requests.
1788 * Currently: 1955 * Currently:
1789 * retire -> free -> unbind -> wait -> retire_ring 1956 * retire -> free -> unbind -> wait -> retire_ring
1790 */ 1957 */
1791 list_for_each_entry_safe(obj_priv, tmp, 1958 list_for_each_entry_safe(obj, next,
1792 &dev_priv->mm.deferred_free_list, 1959 &dev_priv->mm.deferred_free_list,
1793 list) 1960 mm_list)
1794 i915_gem_free_object_tail(&obj_priv->base); 1961 i915_gem_free_object_tail(obj);
1795 } 1962 }
1796 1963
1797 i915_gem_retire_requests_ring(dev, &dev_priv->render_ring); 1964 for (i = 0; i < I915_NUM_RINGS; i++)
1798 if (HAS_BSD(dev)) 1965 i915_gem_retire_requests_ring(&dev_priv->ring[i]);
1799 i915_gem_retire_requests_ring(dev, &dev_priv->bsd_ring);
1800} 1966}
1801 1967
1802void 1968static void
1803i915_gem_retire_work_handler(struct work_struct *work) 1969i915_gem_retire_work_handler(struct work_struct *work)
1804{ 1970{
1805 drm_i915_private_t *dev_priv; 1971 drm_i915_private_t *dev_priv;
1806 struct drm_device *dev; 1972 struct drm_device *dev;
1973 bool idle;
1974 int i;
1807 1975
1808 dev_priv = container_of(work, drm_i915_private_t, 1976 dev_priv = container_of(work, drm_i915_private_t,
1809 mm.retire_work.work); 1977 mm.retire_work.work);
1810 dev = dev_priv->dev; 1978 dev = dev_priv->dev;
1811 1979
1812 mutex_lock(&dev->struct_mutex); 1980 /* Come back later if the device is busy... */
1981 if (!mutex_trylock(&dev->struct_mutex)) {
1982 queue_delayed_work(dev_priv->wq, &dev_priv->mm.retire_work, HZ);
1983 return;
1984 }
1985
1813 i915_gem_retire_requests(dev); 1986 i915_gem_retire_requests(dev);
1814 1987
1815 if (!dev_priv->mm.suspended && 1988 /* Send a periodic flush down the ring so we don't hold onto GEM
1816 (!list_empty(&dev_priv->render_ring.request_list) || 1989 * objects indefinitely.
1817 (HAS_BSD(dev) && 1990 */
1818 !list_empty(&dev_priv->bsd_ring.request_list)))) 1991 idle = true;
1992 for (i = 0; i < I915_NUM_RINGS; i++) {
1993 struct intel_ring_buffer *ring = &dev_priv->ring[i];
1994
1995 if (!list_empty(&ring->gpu_write_list)) {
1996 struct drm_i915_gem_request *request;
1997 int ret;
1998
1999 ret = i915_gem_flush_ring(ring,
2000 0, I915_GEM_GPU_DOMAINS);
2001 request = kzalloc(sizeof(*request), GFP_KERNEL);
2002 if (ret || request == NULL ||
2003 i915_add_request(ring, NULL, request))
2004 kfree(request);
2005 }
2006
2007 idle &= list_empty(&ring->request_list);
2008 }
2009
2010 if (!dev_priv->mm.suspended && !idle)
1819 queue_delayed_work(dev_priv->wq, &dev_priv->mm.retire_work, HZ); 2011 queue_delayed_work(dev_priv->wq, &dev_priv->mm.retire_work, HZ);
2012
1820 mutex_unlock(&dev->struct_mutex); 2013 mutex_unlock(&dev->struct_mutex);
1821} 2014}
1822 2015
2016/**
2017 * Waits for a sequence number to be signaled, and cleans up the
2018 * request and object lists appropriately for that event.
2019 */
1823int 2020int
1824i915_do_wait_request(struct drm_device *dev, uint32_t seqno, 2021i915_wait_request(struct intel_ring_buffer *ring,
1825 int interruptible, struct intel_ring_buffer *ring) 2022 uint32_t seqno)
1826{ 2023{
1827 drm_i915_private_t *dev_priv = dev->dev_private; 2024 drm_i915_private_t *dev_priv = ring->dev->dev_private;
1828 u32 ier; 2025 u32 ier;
1829 int ret = 0; 2026 int ret = 0;
1830 2027
1831 BUG_ON(seqno == 0); 2028 BUG_ON(seqno == 0);
1832 2029
1833 if (atomic_read(&dev_priv->mm.wedged)) 2030 if (atomic_read(&dev_priv->mm.wedged)) {
1834 return -EIO; 2031 struct completion *x = &dev_priv->error_completion;
2032 bool recovery_complete;
2033 unsigned long flags;
2034
2035 /* Give the error handler a chance to run. */
2036 spin_lock_irqsave(&x->wait.lock, flags);
2037 recovery_complete = x->done > 0;
2038 spin_unlock_irqrestore(&x->wait.lock, flags);
2039
2040 return recovery_complete ? -EIO : -EAGAIN;
2041 }
1835 2042
1836 if (!i915_seqno_passed(ring->get_gem_seqno(dev, ring), seqno)) { 2043 if (seqno == ring->outstanding_lazy_request) {
1837 if (HAS_PCH_SPLIT(dev)) 2044 struct drm_i915_gem_request *request;
2045
2046 request = kzalloc(sizeof(*request), GFP_KERNEL);
2047 if (request == NULL)
2048 return -ENOMEM;
2049
2050 ret = i915_add_request(ring, NULL, request);
2051 if (ret) {
2052 kfree(request);
2053 return ret;
2054 }
2055
2056 seqno = request->seqno;
2057 }
2058
2059 if (!i915_seqno_passed(ring->get_seqno(ring), seqno)) {
2060 if (HAS_PCH_SPLIT(ring->dev))
1838 ier = I915_READ(DEIER) | I915_READ(GTIER); 2061 ier = I915_READ(DEIER) | I915_READ(GTIER);
1839 else 2062 else
1840 ier = I915_READ(IER); 2063 ier = I915_READ(IER);
1841 if (!ier) { 2064 if (!ier) {
1842 DRM_ERROR("something (likely vbetool) disabled " 2065 DRM_ERROR("something (likely vbetool) disabled "
1843 "interrupts, re-enabling\n"); 2066 "interrupts, re-enabling\n");
1844 i915_driver_irq_preinstall(dev); 2067 ring->dev->driver->irq_preinstall(ring->dev);
1845 i915_driver_irq_postinstall(dev); 2068 ring->dev->driver->irq_postinstall(ring->dev);
1846 } 2069 }
1847 2070
1848 trace_i915_gem_request_wait_begin(dev, seqno); 2071 trace_i915_gem_request_wait_begin(ring, seqno);
1849 2072
1850 ring->waiting_gem_seqno = seqno; 2073 ring->waiting_seqno = seqno;
1851 ring->user_irq_get(dev, ring); 2074 if (ring->irq_get(ring)) {
1852 if (interruptible) 2075 if (dev_priv->mm.interruptible)
1853 ret = wait_event_interruptible(ring->irq_queue, 2076 ret = wait_event_interruptible(ring->irq_queue,
1854 i915_seqno_passed( 2077 i915_seqno_passed(ring->get_seqno(ring), seqno)
1855 ring->get_gem_seqno(dev, ring), seqno) 2078 || atomic_read(&dev_priv->mm.wedged));
1856 || atomic_read(&dev_priv->mm.wedged)); 2079 else
1857 else 2080 wait_event(ring->irq_queue,
1858 wait_event(ring->irq_queue, 2081 i915_seqno_passed(ring->get_seqno(ring), seqno)
1859 i915_seqno_passed( 2082 || atomic_read(&dev_priv->mm.wedged));
1860 ring->get_gem_seqno(dev, ring), seqno)
1861 || atomic_read(&dev_priv->mm.wedged));
1862 2083
1863 ring->user_irq_put(dev, ring); 2084 ring->irq_put(ring);
1864 ring->waiting_gem_seqno = 0; 2085 } else if (wait_for(i915_seqno_passed(ring->get_seqno(ring),
2086 seqno) ||
2087 atomic_read(&dev_priv->mm.wedged), 3000))
2088 ret = -EBUSY;
2089 ring->waiting_seqno = 0;
1865 2090
1866 trace_i915_gem_request_wait_end(dev, seqno); 2091 trace_i915_gem_request_wait_end(ring, seqno);
1867 } 2092 }
1868 if (atomic_read(&dev_priv->mm.wedged)) 2093 if (atomic_read(&dev_priv->mm.wedged))
1869 ret = -EIO; 2094 ret = -EAGAIN;
1870 2095
1871 if (ret && ret != -ERESTARTSYS) 2096 if (ret && ret != -ERESTARTSYS)
1872 DRM_ERROR("%s returns %d (awaiting %d at %d)\n", 2097 DRM_ERROR("%s returns %d (awaiting %d at %d, next %d)\n",
1873 __func__, ret, seqno, ring->get_gem_seqno(dev, ring)); 2098 __func__, ret, seqno, ring->get_seqno(ring),
2099 dev_priv->next_seqno);
1874 2100
1875 /* Directly dispatch request retiring. While we have the work queue 2101 /* Directly dispatch request retiring. While we have the work queue
1876 * to handle this, the waiter on a request often wants an associated 2102 * to handle this, the waiter on a request often wants an associated
@@ -1878,67 +2104,31 @@ i915_do_wait_request(struct drm_device *dev, uint32_t seqno,
1878 * a separate wait queue to handle that. 2104 * a separate wait queue to handle that.
1879 */ 2105 */
1880 if (ret == 0) 2106 if (ret == 0)
1881 i915_gem_retire_requests_ring(dev, ring); 2107 i915_gem_retire_requests_ring(ring);
1882 2108
1883 return ret; 2109 return ret;
1884} 2110}
1885 2111
1886/** 2112/**
1887 * Waits for a sequence number to be signaled, and cleans up the
1888 * request and object lists appropriately for that event.
1889 */
1890static int
1891i915_wait_request(struct drm_device *dev, uint32_t seqno,
1892 struct intel_ring_buffer *ring)
1893{
1894 return i915_do_wait_request(dev, seqno, 1, ring);
1895}
1896
1897static void
1898i915_gem_flush(struct drm_device *dev,
1899 uint32_t invalidate_domains,
1900 uint32_t flush_domains)
1901{
1902 drm_i915_private_t *dev_priv = dev->dev_private;
1903 if (flush_domains & I915_GEM_DOMAIN_CPU)
1904 drm_agp_chipset_flush(dev);
1905 dev_priv->render_ring.flush(dev, &dev_priv->render_ring,
1906 invalidate_domains,
1907 flush_domains);
1908
1909 if (HAS_BSD(dev))
1910 dev_priv->bsd_ring.flush(dev, &dev_priv->bsd_ring,
1911 invalidate_domains,
1912 flush_domains);
1913}
1914
1915/**
1916 * Ensures that all rendering to the object has completed and the object is 2113 * Ensures that all rendering to the object has completed and the object is
1917 * safe to unbind from the GTT or access from the CPU. 2114 * safe to unbind from the GTT or access from the CPU.
1918 */ 2115 */
1919static int 2116int
1920i915_gem_object_wait_rendering(struct drm_gem_object *obj) 2117i915_gem_object_wait_rendering(struct drm_i915_gem_object *obj)
1921{ 2118{
1922 struct drm_device *dev = obj->dev;
1923 struct drm_i915_gem_object *obj_priv = to_intel_bo(obj);
1924 int ret; 2119 int ret;
1925 2120
1926 /* This function only exists to support waiting for existing rendering, 2121 /* This function only exists to support waiting for existing rendering,
1927 * not for emitting required flushes. 2122 * not for emitting required flushes.
1928 */ 2123 */
1929 BUG_ON((obj->write_domain & I915_GEM_GPU_DOMAINS) != 0); 2124 BUG_ON((obj->base.write_domain & I915_GEM_GPU_DOMAINS) != 0);
1930 2125
1931 /* If there is rendering queued on the buffer being evicted, wait for 2126 /* If there is rendering queued on the buffer being evicted, wait for
1932 * it. 2127 * it.
1933 */ 2128 */
1934 if (obj_priv->active) { 2129 if (obj->active) {
1935#if WATCH_BUF 2130 ret = i915_wait_request(obj->ring, obj->last_rendering_seqno);
1936 DRM_INFO("%s: object %p wait for seqno %08x\n", 2131 if (ret)
1937 __func__, obj, obj_priv->last_rendering_seqno);
1938#endif
1939 ret = i915_wait_request(dev,
1940 obj_priv->last_rendering_seqno, obj_priv->ring);
1941 if (ret != 0)
1942 return ret; 2132 return ret;
1943 } 2133 }
1944 2134
@@ -1949,21 +2139,14 @@ i915_gem_object_wait_rendering(struct drm_gem_object *obj)
1949 * Unbinds an object from the GTT aperture. 2139 * Unbinds an object from the GTT aperture.
1950 */ 2140 */
1951int 2141int
1952i915_gem_object_unbind(struct drm_gem_object *obj) 2142i915_gem_object_unbind(struct drm_i915_gem_object *obj)
1953{ 2143{
1954 struct drm_device *dev = obj->dev;
1955 drm_i915_private_t *dev_priv = dev->dev_private;
1956 struct drm_i915_gem_object *obj_priv = to_intel_bo(obj);
1957 int ret = 0; 2144 int ret = 0;
1958 2145
1959#if WATCH_BUF 2146 if (obj->gtt_space == NULL)
1960 DRM_INFO("%s:%d %p\n", __func__, __LINE__, obj);
1961 DRM_INFO("gtt_space %p\n", obj_priv->gtt_space);
1962#endif
1963 if (obj_priv->gtt_space == NULL)
1964 return 0; 2147 return 0;
1965 2148
1966 if (obj_priv->pin_count != 0) { 2149 if (obj->pin_count != 0) {
1967 DRM_ERROR("Attempting to unbind pinned buffer\n"); 2150 DRM_ERROR("Attempting to unbind pinned buffer\n");
1968 return -EINVAL; 2151 return -EINVAL;
1969 } 2152 }
@@ -1984,319 +2167,383 @@ i915_gem_object_unbind(struct drm_gem_object *obj)
1984 * should be safe and we need to cleanup or else we might 2167 * should be safe and we need to cleanup or else we might
1985 * cause memory corruption through use-after-free. 2168 * cause memory corruption through use-after-free.
1986 */ 2169 */
2170 if (ret) {
2171 i915_gem_clflush_object(obj);
2172 obj->base.read_domains = obj->base.write_domain = I915_GEM_DOMAIN_CPU;
2173 }
1987 2174
1988 /* release the fence reg _after_ flushing */ 2175 /* release the fence reg _after_ flushing */
1989 if (obj_priv->fence_reg != I915_FENCE_REG_NONE) 2176 ret = i915_gem_object_put_fence(obj);
1990 i915_gem_clear_fence_reg(obj); 2177 if (ret == -ERESTARTSYS)
2178 return ret;
1991 2179
1992 if (obj_priv->agp_mem != NULL) { 2180 trace_i915_gem_object_unbind(obj);
1993 drm_unbind_agp(obj_priv->agp_mem);
1994 drm_free_agp(obj_priv->agp_mem, obj->size / PAGE_SIZE);
1995 obj_priv->agp_mem = NULL;
1996 }
1997 2181
1998 i915_gem_object_put_pages(obj); 2182 i915_gem_gtt_unbind_object(obj);
1999 BUG_ON(obj_priv->pages_refcount); 2183 i915_gem_object_put_pages_gtt(obj);
2000 2184
2001 if (obj_priv->gtt_space) { 2185 list_del_init(&obj->gtt_list);
2002 atomic_dec(&dev->gtt_count); 2186 list_del_init(&obj->mm_list);
2003 atomic_sub(obj->size, &dev->gtt_memory); 2187 /* Avoid an unnecessary call to unbind on rebind. */
2188 obj->map_and_fenceable = true;
2004 2189
2005 drm_mm_put_block(obj_priv->gtt_space); 2190 drm_mm_put_block(obj->gtt_space);
2006 obj_priv->gtt_space = NULL; 2191 obj->gtt_space = NULL;
2007 } 2192 obj->gtt_offset = 0;
2008 2193
2009 /* Remove ourselves from the LRU list if present. */ 2194 if (i915_gem_object_is_purgeable(obj))
2010 spin_lock(&dev_priv->mm.active_list_lock);
2011 if (!list_empty(&obj_priv->list))
2012 list_del_init(&obj_priv->list);
2013 spin_unlock(&dev_priv->mm.active_list_lock);
2014
2015 if (i915_gem_object_is_purgeable(obj_priv))
2016 i915_gem_object_truncate(obj); 2195 i915_gem_object_truncate(obj);
2017 2196
2018 trace_i915_gem_object_unbind(obj);
2019
2020 return ret; 2197 return ret;
2021} 2198}
2022 2199
2023int 2200int
2024i915_gpu_idle(struct drm_device *dev) 2201i915_gem_flush_ring(struct intel_ring_buffer *ring,
2202 uint32_t invalidate_domains,
2203 uint32_t flush_domains)
2025{ 2204{
2026 drm_i915_private_t *dev_priv = dev->dev_private;
2027 bool lists_empty;
2028 uint32_t seqno1, seqno2;
2029 int ret; 2205 int ret;
2030 2206
2031 spin_lock(&dev_priv->mm.active_list_lock); 2207 if (((invalidate_domains | flush_domains) & I915_GEM_GPU_DOMAINS) == 0)
2032 lists_empty = (list_empty(&dev_priv->mm.flushing_list) &&
2033 list_empty(&dev_priv->render_ring.active_list) &&
2034 (!HAS_BSD(dev) ||
2035 list_empty(&dev_priv->bsd_ring.active_list)));
2036 spin_unlock(&dev_priv->mm.active_list_lock);
2037
2038 if (lists_empty)
2039 return 0; 2208 return 0;
2040 2209
2041 /* Flush everything onto the inactive list. */ 2210 trace_i915_gem_ring_flush(ring, invalidate_domains, flush_domains);
2042 i915_gem_flush(dev, I915_GEM_GPU_DOMAINS, I915_GEM_GPU_DOMAINS);
2043 seqno1 = i915_add_request(dev, NULL, I915_GEM_GPU_DOMAINS,
2044 &dev_priv->render_ring);
2045 if (seqno1 == 0)
2046 return -ENOMEM;
2047 ret = i915_wait_request(dev, seqno1, &dev_priv->render_ring);
2048 2211
2049 if (HAS_BSD(dev)) { 2212 ret = ring->flush(ring, invalidate_domains, flush_domains);
2050 seqno2 = i915_add_request(dev, NULL, I915_GEM_GPU_DOMAINS, 2213 if (ret)
2051 &dev_priv->bsd_ring); 2214 return ret;
2052 if (seqno2 == 0) 2215
2053 return -ENOMEM; 2216 if (flush_domains & I915_GEM_GPU_DOMAINS)
2217 i915_gem_process_flushing_list(ring, flush_domains);
2218
2219 return 0;
2220}
2221
2222static int i915_ring_idle(struct intel_ring_buffer *ring)
2223{
2224 int ret;
2225
2226 if (list_empty(&ring->gpu_write_list) && list_empty(&ring->active_list))
2227 return 0;
2054 2228
2055 ret = i915_wait_request(dev, seqno2, &dev_priv->bsd_ring); 2229 if (!list_empty(&ring->gpu_write_list)) {
2230 ret = i915_gem_flush_ring(ring,
2231 I915_GEM_GPU_DOMAINS, I915_GEM_GPU_DOMAINS);
2056 if (ret) 2232 if (ret)
2057 return ret; 2233 return ret;
2058 } 2234 }
2059 2235
2060 2236 return i915_wait_request(ring, i915_gem_next_request_seqno(ring));
2061 return ret;
2062} 2237}
2063 2238
2064int 2239int
2065i915_gem_object_get_pages(struct drm_gem_object *obj, 2240i915_gpu_idle(struct drm_device *dev)
2066 gfp_t gfpmask)
2067{ 2241{
2068 struct drm_i915_gem_object *obj_priv = to_intel_bo(obj); 2242 drm_i915_private_t *dev_priv = dev->dev_private;
2069 int page_count, i; 2243 bool lists_empty;
2070 struct address_space *mapping; 2244 int ret, i;
2071 struct inode *inode;
2072 struct page *page;
2073
2074 BUG_ON(obj_priv->pages_refcount
2075 == DRM_I915_GEM_OBJECT_MAX_PAGES_REFCOUNT);
2076 2245
2077 if (obj_priv->pages_refcount++ != 0) 2246 lists_empty = (list_empty(&dev_priv->mm.flushing_list) &&
2247 list_empty(&dev_priv->mm.active_list));
2248 if (lists_empty)
2078 return 0; 2249 return 0;
2079 2250
2080 /* Get the list of pages out of our struct file. They'll be pinned 2251 /* Flush everything onto the inactive list. */
2081 * at this point until we release them. 2252 for (i = 0; i < I915_NUM_RINGS; i++) {
2082 */ 2253 ret = i915_ring_idle(&dev_priv->ring[i]);
2083 page_count = obj->size / PAGE_SIZE; 2254 if (ret)
2084 BUG_ON(obj_priv->pages != NULL); 2255 return ret;
2085 obj_priv->pages = drm_calloc_large(page_count, sizeof(struct page *));
2086 if (obj_priv->pages == NULL) {
2087 obj_priv->pages_refcount--;
2088 return -ENOMEM;
2089 }
2090
2091 inode = obj->filp->f_path.dentry->d_inode;
2092 mapping = inode->i_mapping;
2093 for (i = 0; i < page_count; i++) {
2094 page = read_cache_page_gfp(mapping, i,
2095 GFP_HIGHUSER |
2096 __GFP_COLD |
2097 __GFP_RECLAIMABLE |
2098 gfpmask);
2099 if (IS_ERR(page))
2100 goto err_pages;
2101
2102 obj_priv->pages[i] = page;
2103 } 2256 }
2104 2257
2105 if (obj_priv->tiling_mode != I915_TILING_NONE)
2106 i915_gem_object_do_bit_17_swizzle(obj);
2107
2108 return 0; 2258 return 0;
2109
2110err_pages:
2111 while (i--)
2112 page_cache_release(obj_priv->pages[i]);
2113
2114 drm_free_large(obj_priv->pages);
2115 obj_priv->pages = NULL;
2116 obj_priv->pages_refcount--;
2117 return PTR_ERR(page);
2118} 2259}
2119 2260
2120static void sandybridge_write_fence_reg(struct drm_i915_fence_reg *reg) 2261static int sandybridge_write_fence_reg(struct drm_i915_gem_object *obj,
2262 struct intel_ring_buffer *pipelined)
2121{ 2263{
2122 struct drm_gem_object *obj = reg->obj; 2264 struct drm_device *dev = obj->base.dev;
2123 struct drm_device *dev = obj->dev;
2124 drm_i915_private_t *dev_priv = dev->dev_private; 2265 drm_i915_private_t *dev_priv = dev->dev_private;
2125 struct drm_i915_gem_object *obj_priv = to_intel_bo(obj); 2266 u32 size = obj->gtt_space->size;
2126 int regnum = obj_priv->fence_reg; 2267 int regnum = obj->fence_reg;
2127 uint64_t val; 2268 uint64_t val;
2128 2269
2129 val = (uint64_t)((obj_priv->gtt_offset + obj->size - 4096) & 2270 val = (uint64_t)((obj->gtt_offset + size - 4096) &
2130 0xfffff000) << 32; 2271 0xfffff000) << 32;
2131 val |= obj_priv->gtt_offset & 0xfffff000; 2272 val |= obj->gtt_offset & 0xfffff000;
2132 val |= (uint64_t)((obj_priv->stride / 128) - 1) << 2273 val |= (uint64_t)((obj->stride / 128) - 1) <<
2133 SANDYBRIDGE_FENCE_PITCH_SHIFT; 2274 SANDYBRIDGE_FENCE_PITCH_SHIFT;
2134 2275
2135 if (obj_priv->tiling_mode == I915_TILING_Y) 2276 if (obj->tiling_mode == I915_TILING_Y)
2136 val |= 1 << I965_FENCE_TILING_Y_SHIFT; 2277 val |= 1 << I965_FENCE_TILING_Y_SHIFT;
2137 val |= I965_FENCE_REG_VALID; 2278 val |= I965_FENCE_REG_VALID;
2138 2279
2139 I915_WRITE64(FENCE_REG_SANDYBRIDGE_0 + (regnum * 8), val); 2280 if (pipelined) {
2281 int ret = intel_ring_begin(pipelined, 6);
2282 if (ret)
2283 return ret;
2284
2285 intel_ring_emit(pipelined, MI_NOOP);
2286 intel_ring_emit(pipelined, MI_LOAD_REGISTER_IMM(2));
2287 intel_ring_emit(pipelined, FENCE_REG_SANDYBRIDGE_0 + regnum*8);
2288 intel_ring_emit(pipelined, (u32)val);
2289 intel_ring_emit(pipelined, FENCE_REG_SANDYBRIDGE_0 + regnum*8 + 4);
2290 intel_ring_emit(pipelined, (u32)(val >> 32));
2291 intel_ring_advance(pipelined);
2292 } else
2293 I915_WRITE64(FENCE_REG_SANDYBRIDGE_0 + regnum * 8, val);
2294
2295 return 0;
2140} 2296}
2141 2297
2142static void i965_write_fence_reg(struct drm_i915_fence_reg *reg) 2298static int i965_write_fence_reg(struct drm_i915_gem_object *obj,
2299 struct intel_ring_buffer *pipelined)
2143{ 2300{
2144 struct drm_gem_object *obj = reg->obj; 2301 struct drm_device *dev = obj->base.dev;
2145 struct drm_device *dev = obj->dev;
2146 drm_i915_private_t *dev_priv = dev->dev_private; 2302 drm_i915_private_t *dev_priv = dev->dev_private;
2147 struct drm_i915_gem_object *obj_priv = to_intel_bo(obj); 2303 u32 size = obj->gtt_space->size;
2148 int regnum = obj_priv->fence_reg; 2304 int regnum = obj->fence_reg;
2149 uint64_t val; 2305 uint64_t val;
2150 2306
2151 val = (uint64_t)((obj_priv->gtt_offset + obj->size - 4096) & 2307 val = (uint64_t)((obj->gtt_offset + size - 4096) &
2152 0xfffff000) << 32; 2308 0xfffff000) << 32;
2153 val |= obj_priv->gtt_offset & 0xfffff000; 2309 val |= obj->gtt_offset & 0xfffff000;
2154 val |= ((obj_priv->stride / 128) - 1) << I965_FENCE_PITCH_SHIFT; 2310 val |= ((obj->stride / 128) - 1) << I965_FENCE_PITCH_SHIFT;
2155 if (obj_priv->tiling_mode == I915_TILING_Y) 2311 if (obj->tiling_mode == I915_TILING_Y)
2156 val |= 1 << I965_FENCE_TILING_Y_SHIFT; 2312 val |= 1 << I965_FENCE_TILING_Y_SHIFT;
2157 val |= I965_FENCE_REG_VALID; 2313 val |= I965_FENCE_REG_VALID;
2158 2314
2159 I915_WRITE64(FENCE_REG_965_0 + (regnum * 8), val); 2315 if (pipelined) {
2316 int ret = intel_ring_begin(pipelined, 6);
2317 if (ret)
2318 return ret;
2319
2320 intel_ring_emit(pipelined, MI_NOOP);
2321 intel_ring_emit(pipelined, MI_LOAD_REGISTER_IMM(2));
2322 intel_ring_emit(pipelined, FENCE_REG_965_0 + regnum*8);
2323 intel_ring_emit(pipelined, (u32)val);
2324 intel_ring_emit(pipelined, FENCE_REG_965_0 + regnum*8 + 4);
2325 intel_ring_emit(pipelined, (u32)(val >> 32));
2326 intel_ring_advance(pipelined);
2327 } else
2328 I915_WRITE64(FENCE_REG_965_0 + regnum * 8, val);
2329
2330 return 0;
2160} 2331}
2161 2332
2162static void i915_write_fence_reg(struct drm_i915_fence_reg *reg) 2333static int i915_write_fence_reg(struct drm_i915_gem_object *obj,
2334 struct intel_ring_buffer *pipelined)
2163{ 2335{
2164 struct drm_gem_object *obj = reg->obj; 2336 struct drm_device *dev = obj->base.dev;
2165 struct drm_device *dev = obj->dev;
2166 drm_i915_private_t *dev_priv = dev->dev_private; 2337 drm_i915_private_t *dev_priv = dev->dev_private;
2167 struct drm_i915_gem_object *obj_priv = to_intel_bo(obj); 2338 u32 size = obj->gtt_space->size;
2168 int regnum = obj_priv->fence_reg; 2339 u32 fence_reg, val, pitch_val;
2169 int tile_width; 2340 int tile_width;
2170 uint32_t fence_reg, val;
2171 uint32_t pitch_val;
2172 2341
2173 if ((obj_priv->gtt_offset & ~I915_FENCE_START_MASK) || 2342 if (WARN((obj->gtt_offset & ~I915_FENCE_START_MASK) ||
2174 (obj_priv->gtt_offset & (obj->size - 1))) { 2343 (size & -size) != size ||
2175 WARN(1, "%s: object 0x%08x not 1M or size (0x%zx) aligned\n", 2344 (obj->gtt_offset & (size - 1)),
2176 __func__, obj_priv->gtt_offset, obj->size); 2345 "object 0x%08x [fenceable? %d] not 1M or pot-size (0x%08x) aligned\n",
2177 return; 2346 obj->gtt_offset, obj->map_and_fenceable, size))
2178 } 2347 return -EINVAL;
2179 2348
2180 if (obj_priv->tiling_mode == I915_TILING_Y && 2349 if (obj->tiling_mode == I915_TILING_Y && HAS_128_BYTE_Y_TILING(dev))
2181 HAS_128_BYTE_Y_TILING(dev))
2182 tile_width = 128; 2350 tile_width = 128;
2183 else 2351 else
2184 tile_width = 512; 2352 tile_width = 512;
2185 2353
2186 /* Note: pitch better be a power of two tile widths */ 2354 /* Note: pitch better be a power of two tile widths */
2187 pitch_val = obj_priv->stride / tile_width; 2355 pitch_val = obj->stride / tile_width;
2188 pitch_val = ffs(pitch_val) - 1; 2356 pitch_val = ffs(pitch_val) - 1;
2189 2357
2190 if (obj_priv->tiling_mode == I915_TILING_Y && 2358 val = obj->gtt_offset;
2191 HAS_128_BYTE_Y_TILING(dev)) 2359 if (obj->tiling_mode == I915_TILING_Y)
2192 WARN_ON(pitch_val > I830_FENCE_MAX_PITCH_VAL);
2193 else
2194 WARN_ON(pitch_val > I915_FENCE_MAX_PITCH_VAL);
2195
2196 val = obj_priv->gtt_offset;
2197 if (obj_priv->tiling_mode == I915_TILING_Y)
2198 val |= 1 << I830_FENCE_TILING_Y_SHIFT; 2360 val |= 1 << I830_FENCE_TILING_Y_SHIFT;
2199 val |= I915_FENCE_SIZE_BITS(obj->size); 2361 val |= I915_FENCE_SIZE_BITS(size);
2200 val |= pitch_val << I830_FENCE_PITCH_SHIFT; 2362 val |= pitch_val << I830_FENCE_PITCH_SHIFT;
2201 val |= I830_FENCE_REG_VALID; 2363 val |= I830_FENCE_REG_VALID;
2202 2364
2203 if (regnum < 8) 2365 fence_reg = obj->fence_reg;
2204 fence_reg = FENCE_REG_830_0 + (regnum * 4); 2366 if (fence_reg < 8)
2367 fence_reg = FENCE_REG_830_0 + fence_reg * 4;
2205 else 2368 else
2206 fence_reg = FENCE_REG_945_8 + ((regnum - 8) * 4); 2369 fence_reg = FENCE_REG_945_8 + (fence_reg - 8) * 4;
2207 I915_WRITE(fence_reg, val); 2370
2371 if (pipelined) {
2372 int ret = intel_ring_begin(pipelined, 4);
2373 if (ret)
2374 return ret;
2375
2376 intel_ring_emit(pipelined, MI_NOOP);
2377 intel_ring_emit(pipelined, MI_LOAD_REGISTER_IMM(1));
2378 intel_ring_emit(pipelined, fence_reg);
2379 intel_ring_emit(pipelined, val);
2380 intel_ring_advance(pipelined);
2381 } else
2382 I915_WRITE(fence_reg, val);
2383
2384 return 0;
2208} 2385}
2209 2386
2210static void i830_write_fence_reg(struct drm_i915_fence_reg *reg) 2387static int i830_write_fence_reg(struct drm_i915_gem_object *obj,
2388 struct intel_ring_buffer *pipelined)
2211{ 2389{
2212 struct drm_gem_object *obj = reg->obj; 2390 struct drm_device *dev = obj->base.dev;
2213 struct drm_device *dev = obj->dev;
2214 drm_i915_private_t *dev_priv = dev->dev_private; 2391 drm_i915_private_t *dev_priv = dev->dev_private;
2215 struct drm_i915_gem_object *obj_priv = to_intel_bo(obj); 2392 u32 size = obj->gtt_space->size;
2216 int regnum = obj_priv->fence_reg; 2393 int regnum = obj->fence_reg;
2217 uint32_t val; 2394 uint32_t val;
2218 uint32_t pitch_val; 2395 uint32_t pitch_val;
2219 uint32_t fence_size_bits;
2220 2396
2221 if ((obj_priv->gtt_offset & ~I830_FENCE_START_MASK) || 2397 if (WARN((obj->gtt_offset & ~I830_FENCE_START_MASK) ||
2222 (obj_priv->gtt_offset & (obj->size - 1))) { 2398 (size & -size) != size ||
2223 WARN(1, "%s: object 0x%08x not 512K or size aligned\n", 2399 (obj->gtt_offset & (size - 1)),
2224 __func__, obj_priv->gtt_offset); 2400 "object 0x%08x not 512K or pot-size 0x%08x aligned\n",
2225 return; 2401 obj->gtt_offset, size))
2226 } 2402 return -EINVAL;
2227 2403
2228 pitch_val = obj_priv->stride / 128; 2404 pitch_val = obj->stride / 128;
2229 pitch_val = ffs(pitch_val) - 1; 2405 pitch_val = ffs(pitch_val) - 1;
2230 WARN_ON(pitch_val > I830_FENCE_MAX_PITCH_VAL);
2231 2406
2232 val = obj_priv->gtt_offset; 2407 val = obj->gtt_offset;
2233 if (obj_priv->tiling_mode == I915_TILING_Y) 2408 if (obj->tiling_mode == I915_TILING_Y)
2234 val |= 1 << I830_FENCE_TILING_Y_SHIFT; 2409 val |= 1 << I830_FENCE_TILING_Y_SHIFT;
2235 fence_size_bits = I830_FENCE_SIZE_BITS(obj->size); 2410 val |= I830_FENCE_SIZE_BITS(size);
2236 WARN_ON(fence_size_bits & ~0x00000f00);
2237 val |= fence_size_bits;
2238 val |= pitch_val << I830_FENCE_PITCH_SHIFT; 2411 val |= pitch_val << I830_FENCE_PITCH_SHIFT;
2239 val |= I830_FENCE_REG_VALID; 2412 val |= I830_FENCE_REG_VALID;
2240 2413
2241 I915_WRITE(FENCE_REG_830_0 + (regnum * 4), val); 2414 if (pipelined) {
2415 int ret = intel_ring_begin(pipelined, 4);
2416 if (ret)
2417 return ret;
2418
2419 intel_ring_emit(pipelined, MI_NOOP);
2420 intel_ring_emit(pipelined, MI_LOAD_REGISTER_IMM(1));
2421 intel_ring_emit(pipelined, FENCE_REG_830_0 + regnum*4);
2422 intel_ring_emit(pipelined, val);
2423 intel_ring_advance(pipelined);
2424 } else
2425 I915_WRITE(FENCE_REG_830_0 + regnum * 4, val);
2426
2427 return 0;
2428}
2429
2430static bool ring_passed_seqno(struct intel_ring_buffer *ring, u32 seqno)
2431{
2432 return i915_seqno_passed(ring->get_seqno(ring), seqno);
2433}
2434
2435static int
2436i915_gem_object_flush_fence(struct drm_i915_gem_object *obj,
2437 struct intel_ring_buffer *pipelined)
2438{
2439 int ret;
2440
2441 if (obj->fenced_gpu_access) {
2442 if (obj->base.write_domain & I915_GEM_GPU_DOMAINS) {
2443 ret = i915_gem_flush_ring(obj->last_fenced_ring,
2444 0, obj->base.write_domain);
2445 if (ret)
2446 return ret;
2447 }
2448
2449 obj->fenced_gpu_access = false;
2450 }
2451
2452 if (obj->last_fenced_seqno && pipelined != obj->last_fenced_ring) {
2453 if (!ring_passed_seqno(obj->last_fenced_ring,
2454 obj->last_fenced_seqno)) {
2455 ret = i915_wait_request(obj->last_fenced_ring,
2456 obj->last_fenced_seqno);
2457 if (ret)
2458 return ret;
2459 }
2460
2461 obj->last_fenced_seqno = 0;
2462 obj->last_fenced_ring = NULL;
2463 }
2464
2465 /* Ensure that all CPU reads are completed before installing a fence
2466 * and all writes before removing the fence.
2467 */
2468 if (obj->base.read_domains & I915_GEM_DOMAIN_GTT)
2469 mb();
2470
2471 return 0;
2472}
2473
2474int
2475i915_gem_object_put_fence(struct drm_i915_gem_object *obj)
2476{
2477 int ret;
2478
2479 if (obj->tiling_mode)
2480 i915_gem_release_mmap(obj);
2481
2482 ret = i915_gem_object_flush_fence(obj, NULL);
2483 if (ret)
2484 return ret;
2485
2486 if (obj->fence_reg != I915_FENCE_REG_NONE) {
2487 struct drm_i915_private *dev_priv = obj->base.dev->dev_private;
2488 i915_gem_clear_fence_reg(obj->base.dev,
2489 &dev_priv->fence_regs[obj->fence_reg]);
2490
2491 obj->fence_reg = I915_FENCE_REG_NONE;
2492 }
2493
2494 return 0;
2242} 2495}
2243 2496
2244static int i915_find_fence_reg(struct drm_device *dev) 2497static struct drm_i915_fence_reg *
2498i915_find_fence_reg(struct drm_device *dev,
2499 struct intel_ring_buffer *pipelined)
2245{ 2500{
2246 struct drm_i915_fence_reg *reg = NULL;
2247 struct drm_i915_gem_object *obj_priv = NULL;
2248 struct drm_i915_private *dev_priv = dev->dev_private; 2501 struct drm_i915_private *dev_priv = dev->dev_private;
2249 struct drm_gem_object *obj = NULL; 2502 struct drm_i915_fence_reg *reg, *first, *avail;
2250 int i, avail, ret; 2503 int i;
2251 2504
2252 /* First try to find a free reg */ 2505 /* First try to find a free reg */
2253 avail = 0; 2506 avail = NULL;
2254 for (i = dev_priv->fence_reg_start; i < dev_priv->num_fence_regs; i++) { 2507 for (i = dev_priv->fence_reg_start; i < dev_priv->num_fence_regs; i++) {
2255 reg = &dev_priv->fence_regs[i]; 2508 reg = &dev_priv->fence_regs[i];
2256 if (!reg->obj) 2509 if (!reg->obj)
2257 return i; 2510 return reg;
2258 2511
2259 obj_priv = to_intel_bo(reg->obj); 2512 if (!reg->obj->pin_count)
2260 if (!obj_priv->pin_count) 2513 avail = reg;
2261 avail++;
2262 } 2514 }
2263 2515
2264 if (avail == 0) 2516 if (avail == NULL)
2265 return -ENOSPC; 2517 return NULL;
2266 2518
2267 /* None available, try to steal one or wait for a user to finish */ 2519 /* None available, try to steal one or wait for a user to finish */
2268 i = I915_FENCE_REG_NONE; 2520 avail = first = NULL;
2269 list_for_each_entry(reg, &dev_priv->mm.fence_list, 2521 list_for_each_entry(reg, &dev_priv->mm.fence_list, lru_list) {
2270 lru_list) { 2522 if (reg->obj->pin_count)
2271 obj = reg->obj;
2272 obj_priv = to_intel_bo(obj);
2273
2274 if (obj_priv->pin_count)
2275 continue; 2523 continue;
2276 2524
2277 /* found one! */ 2525 if (first == NULL)
2278 i = obj_priv->fence_reg; 2526 first = reg;
2279 break;
2280 }
2281 2527
2282 BUG_ON(i == I915_FENCE_REG_NONE); 2528 if (!pipelined ||
2529 !reg->obj->last_fenced_ring ||
2530 reg->obj->last_fenced_ring == pipelined) {
2531 avail = reg;
2532 break;
2533 }
2534 }
2283 2535
2284 /* We only have a reference on obj from the active list. put_fence_reg 2536 if (avail == NULL)
2285 * might drop that one, causing a use-after-free in it. So hold a 2537 avail = first;
2286 * private reference to obj like the other callers of put_fence_reg
2287 * (set_tiling ioctl) do. */
2288 drm_gem_object_reference(obj);
2289 ret = i915_gem_object_put_fence_reg(obj);
2290 drm_gem_object_unreference(obj);
2291 if (ret != 0)
2292 return ret;
2293 2538
2294 return i; 2539 return avail;
2295} 2540}
2296 2541
2297/** 2542/**
2298 * i915_gem_object_get_fence_reg - set up a fence reg for an object 2543 * i915_gem_object_get_fence - set up a fence reg for an object
2299 * @obj: object to map through a fence reg 2544 * @obj: object to map through a fence reg
2545 * @pipelined: ring on which to queue the change, or NULL for CPU access
2546 * @interruptible: must we wait uninterruptibly for the register to retire?
2300 * 2547 *
2301 * When mapping objects through the GTT, userspace wants to be able to write 2548 * When mapping objects through the GTT, userspace wants to be able to write
2302 * to them without having to worry about swizzling if the object is tiled. 2549 * to them without having to worry about swizzling if the object is tiled.
@@ -2308,71 +2555,125 @@ static int i915_find_fence_reg(struct drm_device *dev)
2308 * and tiling format. 2555 * and tiling format.
2309 */ 2556 */
2310int 2557int
2311i915_gem_object_get_fence_reg(struct drm_gem_object *obj) 2558i915_gem_object_get_fence(struct drm_i915_gem_object *obj,
2559 struct intel_ring_buffer *pipelined)
2312{ 2560{
2313 struct drm_device *dev = obj->dev; 2561 struct drm_device *dev = obj->base.dev;
2314 struct drm_i915_private *dev_priv = dev->dev_private; 2562 struct drm_i915_private *dev_priv = dev->dev_private;
2315 struct drm_i915_gem_object *obj_priv = to_intel_bo(obj); 2563 struct drm_i915_fence_reg *reg;
2316 struct drm_i915_fence_reg *reg = NULL;
2317 int ret; 2564 int ret;
2318 2565
2319 /* Just update our place in the LRU if our fence is getting used. */ 2566 /* XXX disable pipelining. There are bugs. Shocking. */
2320 if (obj_priv->fence_reg != I915_FENCE_REG_NONE) { 2567 pipelined = NULL;
2321 reg = &dev_priv->fence_regs[obj_priv->fence_reg]; 2568
2569 /* Just update our place in the LRU if our fence is getting reused. */
2570 if (obj->fence_reg != I915_FENCE_REG_NONE) {
2571 reg = &dev_priv->fence_regs[obj->fence_reg];
2322 list_move_tail(&reg->lru_list, &dev_priv->mm.fence_list); 2572 list_move_tail(&reg->lru_list, &dev_priv->mm.fence_list);
2573
2574 if (obj->tiling_changed) {
2575 ret = i915_gem_object_flush_fence(obj, pipelined);
2576 if (ret)
2577 return ret;
2578
2579 if (!obj->fenced_gpu_access && !obj->last_fenced_seqno)
2580 pipelined = NULL;
2581
2582 if (pipelined) {
2583 reg->setup_seqno =
2584 i915_gem_next_request_seqno(pipelined);
2585 obj->last_fenced_seqno = reg->setup_seqno;
2586 obj->last_fenced_ring = pipelined;
2587 }
2588
2589 goto update;
2590 }
2591
2592 if (!pipelined) {
2593 if (reg->setup_seqno) {
2594 if (!ring_passed_seqno(obj->last_fenced_ring,
2595 reg->setup_seqno)) {
2596 ret = i915_wait_request(obj->last_fenced_ring,
2597 reg->setup_seqno);
2598 if (ret)
2599 return ret;
2600 }
2601
2602 reg->setup_seqno = 0;
2603 }
2604 } else if (obj->last_fenced_ring &&
2605 obj->last_fenced_ring != pipelined) {
2606 ret = i915_gem_object_flush_fence(obj, pipelined);
2607 if (ret)
2608 return ret;
2609 }
2610
2323 return 0; 2611 return 0;
2324 } 2612 }
2325 2613
2326 switch (obj_priv->tiling_mode) { 2614 reg = i915_find_fence_reg(dev, pipelined);
2327 case I915_TILING_NONE: 2615 if (reg == NULL)
2328 WARN(1, "allocating a fence for non-tiled object?\n"); 2616 return -ENOSPC;
2329 break;
2330 case I915_TILING_X:
2331 if (!obj_priv->stride)
2332 return -EINVAL;
2333 WARN((obj_priv->stride & (512 - 1)),
2334 "object 0x%08x is X tiled but has non-512B pitch\n",
2335 obj_priv->gtt_offset);
2336 break;
2337 case I915_TILING_Y:
2338 if (!obj_priv->stride)
2339 return -EINVAL;
2340 WARN((obj_priv->stride & (128 - 1)),
2341 "object 0x%08x is Y tiled but has non-128B pitch\n",
2342 obj_priv->gtt_offset);
2343 break;
2344 }
2345 2617
2346 ret = i915_find_fence_reg(dev); 2618 ret = i915_gem_object_flush_fence(obj, pipelined);
2347 if (ret < 0) 2619 if (ret)
2348 return ret; 2620 return ret;
2349 2621
2350 obj_priv->fence_reg = ret; 2622 if (reg->obj) {
2351 reg = &dev_priv->fence_regs[obj_priv->fence_reg]; 2623 struct drm_i915_gem_object *old = reg->obj;
2352 list_add_tail(&reg->lru_list, &dev_priv->mm.fence_list); 2624
2625 drm_gem_object_reference(&old->base);
2626
2627 if (old->tiling_mode)
2628 i915_gem_release_mmap(old);
2629
2630 ret = i915_gem_object_flush_fence(old, pipelined);
2631 if (ret) {
2632 drm_gem_object_unreference(&old->base);
2633 return ret;
2634 }
2635
2636 if (old->last_fenced_seqno == 0 && obj->last_fenced_seqno == 0)
2637 pipelined = NULL;
2638
2639 old->fence_reg = I915_FENCE_REG_NONE;
2640 old->last_fenced_ring = pipelined;
2641 old->last_fenced_seqno =
2642 pipelined ? i915_gem_next_request_seqno(pipelined) : 0;
2643
2644 drm_gem_object_unreference(&old->base);
2645 } else if (obj->last_fenced_seqno == 0)
2646 pipelined = NULL;
2353 2647
2354 reg->obj = obj; 2648 reg->obj = obj;
2649 list_move_tail(&reg->lru_list, &dev_priv->mm.fence_list);
2650 obj->fence_reg = reg - dev_priv->fence_regs;
2651 obj->last_fenced_ring = pipelined;
2355 2652
2653 reg->setup_seqno =
2654 pipelined ? i915_gem_next_request_seqno(pipelined) : 0;
2655 obj->last_fenced_seqno = reg->setup_seqno;
2656
2657update:
2658 obj->tiling_changed = false;
2356 switch (INTEL_INFO(dev)->gen) { 2659 switch (INTEL_INFO(dev)->gen) {
2660 case 7:
2357 case 6: 2661 case 6:
2358 sandybridge_write_fence_reg(reg); 2662 ret = sandybridge_write_fence_reg(obj, pipelined);
2359 break; 2663 break;
2360 case 5: 2664 case 5:
2361 case 4: 2665 case 4:
2362 i965_write_fence_reg(reg); 2666 ret = i965_write_fence_reg(obj, pipelined);
2363 break; 2667 break;
2364 case 3: 2668 case 3:
2365 i915_write_fence_reg(reg); 2669 ret = i915_write_fence_reg(obj, pipelined);
2366 break; 2670 break;
2367 case 2: 2671 case 2:
2368 i830_write_fence_reg(reg); 2672 ret = i830_write_fence_reg(obj, pipelined);
2369 break; 2673 break;
2370 } 2674 }
2371 2675
2372 trace_i915_gem_object_get_fence(obj, obj_priv->fence_reg, 2676 return ret;
2373 obj_priv->tiling_mode);
2374
2375 return 0;
2376} 2677}
2377 2678
2378/** 2679/**
@@ -2380,157 +2681,133 @@ i915_gem_object_get_fence_reg(struct drm_gem_object *obj)
2380 * @obj: object to clear 2681 * @obj: object to clear
2381 * 2682 *
2382 * Zeroes out the fence register itself and clears out the associated 2683 * Zeroes out the fence register itself and clears out the associated
2383 * data structures in dev_priv and obj_priv. 2684 * data structures in dev_priv and obj.
2384 */ 2685 */
2385static void 2686static void
2386i915_gem_clear_fence_reg(struct drm_gem_object *obj) 2687i915_gem_clear_fence_reg(struct drm_device *dev,
2688 struct drm_i915_fence_reg *reg)
2387{ 2689{
2388 struct drm_device *dev = obj->dev;
2389 drm_i915_private_t *dev_priv = dev->dev_private; 2690 drm_i915_private_t *dev_priv = dev->dev_private;
2390 struct drm_i915_gem_object *obj_priv = to_intel_bo(obj); 2691 uint32_t fence_reg = reg - dev_priv->fence_regs;
2391 struct drm_i915_fence_reg *reg =
2392 &dev_priv->fence_regs[obj_priv->fence_reg];
2393 uint32_t fence_reg;
2394 2692
2395 switch (INTEL_INFO(dev)->gen) { 2693 switch (INTEL_INFO(dev)->gen) {
2694 case 7:
2396 case 6: 2695 case 6:
2397 I915_WRITE64(FENCE_REG_SANDYBRIDGE_0 + 2696 I915_WRITE64(FENCE_REG_SANDYBRIDGE_0 + fence_reg*8, 0);
2398 (obj_priv->fence_reg * 8), 0);
2399 break; 2697 break;
2400 case 5: 2698 case 5:
2401 case 4: 2699 case 4:
2402 I915_WRITE64(FENCE_REG_965_0 + (obj_priv->fence_reg * 8), 0); 2700 I915_WRITE64(FENCE_REG_965_0 + fence_reg*8, 0);
2403 break; 2701 break;
2404 case 3: 2702 case 3:
2405 if (obj_priv->fence_reg >= 8) 2703 if (fence_reg >= 8)
2406 fence_reg = FENCE_REG_945_8 + (obj_priv->fence_reg - 8) * 4; 2704 fence_reg = FENCE_REG_945_8 + (fence_reg - 8) * 4;
2407 else 2705 else
2408 case 2: 2706 case 2:
2409 fence_reg = FENCE_REG_830_0 + obj_priv->fence_reg * 4; 2707 fence_reg = FENCE_REG_830_0 + fence_reg * 4;
2410 2708
2411 I915_WRITE(fence_reg, 0); 2709 I915_WRITE(fence_reg, 0);
2412 break; 2710 break;
2413 } 2711 }
2414 2712
2415 reg->obj = NULL;
2416 obj_priv->fence_reg = I915_FENCE_REG_NONE;
2417 list_del_init(&reg->lru_list); 2713 list_del_init(&reg->lru_list);
2418} 2714 reg->obj = NULL;
2419 2715 reg->setup_seqno = 0;
2420/**
2421 * i915_gem_object_put_fence_reg - waits on outstanding fenced access
2422 * to the buffer to finish, and then resets the fence register.
2423 * @obj: tiled object holding a fence register.
2424 *
2425 * Zeroes out the fence register itself and clears out the associated
2426 * data structures in dev_priv and obj_priv.
2427 */
2428int
2429i915_gem_object_put_fence_reg(struct drm_gem_object *obj)
2430{
2431 struct drm_device *dev = obj->dev;
2432 struct drm_i915_gem_object *obj_priv = to_intel_bo(obj);
2433
2434 if (obj_priv->fence_reg == I915_FENCE_REG_NONE)
2435 return 0;
2436
2437 /* If we've changed tiling, GTT-mappings of the object
2438 * need to re-fault to ensure that the correct fence register
2439 * setup is in place.
2440 */
2441 i915_gem_release_mmap(obj);
2442
2443 /* On the i915, GPU access to tiled buffers is via a fence,
2444 * therefore we must wait for any outstanding access to complete
2445 * before clearing the fence.
2446 */
2447 if (!IS_I965G(dev)) {
2448 int ret;
2449
2450 ret = i915_gem_object_flush_gpu_write_domain(obj);
2451 if (ret != 0)
2452 return ret;
2453
2454 ret = i915_gem_object_wait_rendering(obj);
2455 if (ret != 0)
2456 return ret;
2457 }
2458
2459 i915_gem_object_flush_gtt_write_domain(obj);
2460 i915_gem_clear_fence_reg (obj);
2461
2462 return 0;
2463} 2716}
2464 2717
2465/** 2718/**
2466 * Finds free space in the GTT aperture and binds the object there. 2719 * Finds free space in the GTT aperture and binds the object there.
2467 */ 2720 */
2468static int 2721static int
2469i915_gem_object_bind_to_gtt(struct drm_gem_object *obj, unsigned alignment) 2722i915_gem_object_bind_to_gtt(struct drm_i915_gem_object *obj,
2723 unsigned alignment,
2724 bool map_and_fenceable)
2470{ 2725{
2471 struct drm_device *dev = obj->dev; 2726 struct drm_device *dev = obj->base.dev;
2472 drm_i915_private_t *dev_priv = dev->dev_private; 2727 drm_i915_private_t *dev_priv = dev->dev_private;
2473 struct drm_i915_gem_object *obj_priv = to_intel_bo(obj);
2474 struct drm_mm_node *free_space; 2728 struct drm_mm_node *free_space;
2475 gfp_t gfpmask = __GFP_NORETRY | __GFP_NOWARN; 2729 gfp_t gfpmask = __GFP_NORETRY | __GFP_NOWARN;
2730 u32 size, fence_size, fence_alignment, unfenced_alignment;
2731 bool mappable, fenceable;
2476 int ret; 2732 int ret;
2477 2733
2478 if (obj_priv->madv != I915_MADV_WILLNEED) { 2734 if (obj->madv != I915_MADV_WILLNEED) {
2479 DRM_ERROR("Attempting to bind a purgeable object\n"); 2735 DRM_ERROR("Attempting to bind a purgeable object\n");
2480 return -EINVAL; 2736 return -EINVAL;
2481 } 2737 }
2482 2738
2739 fence_size = i915_gem_get_gtt_size(dev,
2740 obj->base.size,
2741 obj->tiling_mode);
2742 fence_alignment = i915_gem_get_gtt_alignment(dev,
2743 obj->base.size,
2744 obj->tiling_mode);
2745 unfenced_alignment =
2746 i915_gem_get_unfenced_gtt_alignment(dev,
2747 obj->base.size,
2748 obj->tiling_mode);
2749
2483 if (alignment == 0) 2750 if (alignment == 0)
2484 alignment = i915_gem_get_gtt_alignment(obj); 2751 alignment = map_and_fenceable ? fence_alignment :
2485 if (alignment & (i915_gem_get_gtt_alignment(obj) - 1)) { 2752 unfenced_alignment;
2753 if (map_and_fenceable && alignment & (fence_alignment - 1)) {
2486 DRM_ERROR("Invalid object alignment requested %u\n", alignment); 2754 DRM_ERROR("Invalid object alignment requested %u\n", alignment);
2487 return -EINVAL; 2755 return -EINVAL;
2488 } 2756 }
2489 2757
2758 size = map_and_fenceable ? fence_size : obj->base.size;
2759
2490 /* If the object is bigger than the entire aperture, reject it early 2760 /* If the object is bigger than the entire aperture, reject it early
2491 * before evicting everything in a vain attempt to find space. 2761 * before evicting everything in a vain attempt to find space.
2492 */ 2762 */
2493 if (obj->size > dev->gtt_total) { 2763 if (obj->base.size >
2764 (map_and_fenceable ? dev_priv->mm.gtt_mappable_end : dev_priv->mm.gtt_total)) {
2494 DRM_ERROR("Attempting to bind an object larger than the aperture\n"); 2765 DRM_ERROR("Attempting to bind an object larger than the aperture\n");
2495 return -E2BIG; 2766 return -E2BIG;
2496 } 2767 }
2497 2768
2498 search_free: 2769 search_free:
2499 free_space = drm_mm_search_free(&dev_priv->mm.gtt_space, 2770 if (map_and_fenceable)
2500 obj->size, alignment, 0); 2771 free_space =
2772 drm_mm_search_free_in_range(&dev_priv->mm.gtt_space,
2773 size, alignment, 0,
2774 dev_priv->mm.gtt_mappable_end,
2775 0);
2776 else
2777 free_space = drm_mm_search_free(&dev_priv->mm.gtt_space,
2778 size, alignment, 0);
2779
2501 if (free_space != NULL) { 2780 if (free_space != NULL) {
2502 obj_priv->gtt_space = drm_mm_get_block(free_space, obj->size, 2781 if (map_and_fenceable)
2503 alignment); 2782 obj->gtt_space =
2504 if (obj_priv->gtt_space != NULL) 2783 drm_mm_get_block_range_generic(free_space,
2505 obj_priv->gtt_offset = obj_priv->gtt_space->start; 2784 size, alignment, 0,
2785 dev_priv->mm.gtt_mappable_end,
2786 0);
2787 else
2788 obj->gtt_space =
2789 drm_mm_get_block(free_space, size, alignment);
2506 } 2790 }
2507 if (obj_priv->gtt_space == NULL) { 2791 if (obj->gtt_space == NULL) {
2508 /* If the gtt is empty and we're still having trouble 2792 /* If the gtt is empty and we're still having trouble
2509 * fitting our object in, we're out of memory. 2793 * fitting our object in, we're out of memory.
2510 */ 2794 */
2511#if WATCH_LRU 2795 ret = i915_gem_evict_something(dev, size, alignment,
2512 DRM_INFO("%s: GTT full, evicting something\n", __func__); 2796 map_and_fenceable);
2513#endif
2514 ret = i915_gem_evict_something(dev, obj->size, alignment);
2515 if (ret) 2797 if (ret)
2516 return ret; 2798 return ret;
2517 2799
2518 goto search_free; 2800 goto search_free;
2519 } 2801 }
2520 2802
2521#if WATCH_BUF 2803 ret = i915_gem_object_get_pages_gtt(obj, gfpmask);
2522 DRM_INFO("Binding object of size %zd at 0x%08x\n",
2523 obj->size, obj_priv->gtt_offset);
2524#endif
2525 ret = i915_gem_object_get_pages(obj, gfpmask);
2526 if (ret) { 2804 if (ret) {
2527 drm_mm_put_block(obj_priv->gtt_space); 2805 drm_mm_put_block(obj->gtt_space);
2528 obj_priv->gtt_space = NULL; 2806 obj->gtt_space = NULL;
2529 2807
2530 if (ret == -ENOMEM) { 2808 if (ret == -ENOMEM) {
2531 /* first try to clear up some space from the GTT */ 2809 /* first try to reclaim some memory by clearing the GTT */
2532 ret = i915_gem_evict_something(dev, obj->size, 2810 ret = i915_gem_evict_everything(dev, false);
2533 alignment);
2534 if (ret) { 2811 if (ret) {
2535 /* now try to shrink everyone else */ 2812 /* now try to shrink everyone else */
2536 if (gfpmask) { 2813 if (gfpmask) {
@@ -2538,7 +2815,7 @@ i915_gem_object_bind_to_gtt(struct drm_gem_object *obj, unsigned alignment)
2538 goto search_free; 2815 goto search_free;
2539 } 2816 }
2540 2817
2541 return ret; 2818 return -ENOMEM;
2542 } 2819 }
2543 2820
2544 goto search_free; 2821 goto search_free;
@@ -2547,144 +2824,126 @@ i915_gem_object_bind_to_gtt(struct drm_gem_object *obj, unsigned alignment)
2547 return ret; 2824 return ret;
2548 } 2825 }
2549 2826
2550 /* Create an AGP memory structure pointing at our pages, and bind it 2827 ret = i915_gem_gtt_bind_object(obj);
2551 * into the GTT. 2828 if (ret) {
2552 */ 2829 i915_gem_object_put_pages_gtt(obj);
2553 obj_priv->agp_mem = drm_agp_bind_pages(dev, 2830 drm_mm_put_block(obj->gtt_space);
2554 obj_priv->pages, 2831 obj->gtt_space = NULL;
2555 obj->size >> PAGE_SHIFT, 2832
2556 obj_priv->gtt_offset, 2833 if (i915_gem_evict_everything(dev, false))
2557 obj_priv->agp_type);
2558 if (obj_priv->agp_mem == NULL) {
2559 i915_gem_object_put_pages(obj);
2560 drm_mm_put_block(obj_priv->gtt_space);
2561 obj_priv->gtt_space = NULL;
2562
2563 ret = i915_gem_evict_something(dev, obj->size, alignment);
2564 if (ret)
2565 return ret; 2834 return ret;
2566 2835
2567 goto search_free; 2836 goto search_free;
2568 } 2837 }
2569 atomic_inc(&dev->gtt_count);
2570 atomic_add(obj->size, &dev->gtt_memory);
2571 2838
2572 /* keep track of bounds object by adding it to the inactive list */ 2839 list_add_tail(&obj->gtt_list, &dev_priv->mm.gtt_list);
2573 list_add_tail(&obj_priv->list, &dev_priv->mm.inactive_list); 2840 list_add_tail(&obj->mm_list, &dev_priv->mm.inactive_list);
2574 2841
2575 /* Assert that the object is not currently in any GPU domain. As it 2842 /* Assert that the object is not currently in any GPU domain. As it
2576 * wasn't in the GTT, there shouldn't be any way it could have been in 2843 * wasn't in the GTT, there shouldn't be any way it could have been in
2577 * a GPU cache 2844 * a GPU cache
2578 */ 2845 */
2579 BUG_ON(obj->read_domains & I915_GEM_GPU_DOMAINS); 2846 BUG_ON(obj->base.read_domains & I915_GEM_GPU_DOMAINS);
2580 BUG_ON(obj->write_domain & I915_GEM_GPU_DOMAINS); 2847 BUG_ON(obj->base.write_domain & I915_GEM_GPU_DOMAINS);
2848
2849 obj->gtt_offset = obj->gtt_space->start;
2850
2851 fenceable =
2852 obj->gtt_space->size == fence_size &&
2853 (obj->gtt_space->start & (fence_alignment -1)) == 0;
2854
2855 mappable =
2856 obj->gtt_offset + obj->base.size <= dev_priv->mm.gtt_mappable_end;
2581 2857
2582 trace_i915_gem_object_bind(obj, obj_priv->gtt_offset); 2858 obj->map_and_fenceable = mappable && fenceable;
2583 2859
2860 trace_i915_gem_object_bind(obj, map_and_fenceable);
2584 return 0; 2861 return 0;
2585} 2862}
2586 2863
2587void 2864void
2588i915_gem_clflush_object(struct drm_gem_object *obj) 2865i915_gem_clflush_object(struct drm_i915_gem_object *obj)
2589{ 2866{
2590 struct drm_i915_gem_object *obj_priv = to_intel_bo(obj);
2591
2592 /* If we don't have a page list set up, then we're not pinned 2867 /* If we don't have a page list set up, then we're not pinned
2593 * to GPU, and we can ignore the cache flush because it'll happen 2868 * to GPU, and we can ignore the cache flush because it'll happen
2594 * again at bind time. 2869 * again at bind time.
2595 */ 2870 */
2596 if (obj_priv->pages == NULL) 2871 if (obj->pages == NULL)
2872 return;
2873
2874 /* If the GPU is snooping the contents of the CPU cache,
2875 * we do not need to manually clear the CPU cache lines. However,
2876 * the caches are only snooped when the render cache is
2877 * flushed/invalidated. As we always have to emit invalidations
2878 * and flushes when moving into and out of the RENDER domain, correct
2879 * snooping behaviour occurs naturally as the result of our domain
2880 * tracking.
2881 */
2882 if (obj->cache_level != I915_CACHE_NONE)
2597 return; 2883 return;
2598 2884
2599 trace_i915_gem_object_clflush(obj); 2885 trace_i915_gem_object_clflush(obj);
2600 2886
2601 drm_clflush_pages(obj_priv->pages, obj->size / PAGE_SIZE); 2887 drm_clflush_pages(obj->pages, obj->base.size / PAGE_SIZE);
2602} 2888}
2603 2889
2604/** Flushes any GPU write domain for the object if it's dirty. */ 2890/** Flushes any GPU write domain for the object if it's dirty. */
2605static int 2891static int
2606i915_gem_object_flush_gpu_write_domain(struct drm_gem_object *obj) 2892i915_gem_object_flush_gpu_write_domain(struct drm_i915_gem_object *obj)
2607{ 2893{
2608 struct drm_device *dev = obj->dev; 2894 if ((obj->base.write_domain & I915_GEM_GPU_DOMAINS) == 0)
2609 uint32_t old_write_domain;
2610 struct drm_i915_gem_object *obj_priv = to_intel_bo(obj);
2611
2612 if ((obj->write_domain & I915_GEM_GPU_DOMAINS) == 0)
2613 return 0; 2895 return 0;
2614 2896
2615 /* Queue the GPU write cache flushing we need. */ 2897 /* Queue the GPU write cache flushing we need. */
2616 old_write_domain = obj->write_domain; 2898 return i915_gem_flush_ring(obj->ring, 0, obj->base.write_domain);
2617 i915_gem_flush(dev, 0, obj->write_domain);
2618 if (i915_add_request(dev, NULL, obj->write_domain, obj_priv->ring) == 0)
2619 return -ENOMEM;
2620
2621 trace_i915_gem_object_change_domain(obj,
2622 obj->read_domains,
2623 old_write_domain);
2624 return 0;
2625} 2899}
2626 2900
2627/** Flushes the GTT write domain for the object if it's dirty. */ 2901/** Flushes the GTT write domain for the object if it's dirty. */
2628static void 2902static void
2629i915_gem_object_flush_gtt_write_domain(struct drm_gem_object *obj) 2903i915_gem_object_flush_gtt_write_domain(struct drm_i915_gem_object *obj)
2630{ 2904{
2631 uint32_t old_write_domain; 2905 uint32_t old_write_domain;
2632 2906
2633 if (obj->write_domain != I915_GEM_DOMAIN_GTT) 2907 if (obj->base.write_domain != I915_GEM_DOMAIN_GTT)
2634 return; 2908 return;
2635 2909
2636 /* No actual flushing is required for the GTT write domain. Writes 2910 /* No actual flushing is required for the GTT write domain. Writes
2637 * to it immediately go to main memory as far as we know, so there's 2911 * to it immediately go to main memory as far as we know, so there's
2638 * no chipset flush. It also doesn't land in render cache. 2912 * no chipset flush. It also doesn't land in render cache.
2913 *
2914 * However, we do have to enforce the order so that all writes through
2915 * the GTT land before any writes to the device, such as updates to
2916 * the GATT itself.
2639 */ 2917 */
2640 old_write_domain = obj->write_domain; 2918 wmb();
2641 obj->write_domain = 0; 2919
2920 old_write_domain = obj->base.write_domain;
2921 obj->base.write_domain = 0;
2642 2922
2643 trace_i915_gem_object_change_domain(obj, 2923 trace_i915_gem_object_change_domain(obj,
2644 obj->read_domains, 2924 obj->base.read_domains,
2645 old_write_domain); 2925 old_write_domain);
2646} 2926}
2647 2927
2648/** Flushes the CPU write domain for the object if it's dirty. */ 2928/** Flushes the CPU write domain for the object if it's dirty. */
2649static void 2929static void
2650i915_gem_object_flush_cpu_write_domain(struct drm_gem_object *obj) 2930i915_gem_object_flush_cpu_write_domain(struct drm_i915_gem_object *obj)
2651{ 2931{
2652 struct drm_device *dev = obj->dev;
2653 uint32_t old_write_domain; 2932 uint32_t old_write_domain;
2654 2933
2655 if (obj->write_domain != I915_GEM_DOMAIN_CPU) 2934 if (obj->base.write_domain != I915_GEM_DOMAIN_CPU)
2656 return; 2935 return;
2657 2936
2658 i915_gem_clflush_object(obj); 2937 i915_gem_clflush_object(obj);
2659 drm_agp_chipset_flush(dev); 2938 intel_gtt_chipset_flush();
2660 old_write_domain = obj->write_domain; 2939 old_write_domain = obj->base.write_domain;
2661 obj->write_domain = 0; 2940 obj->base.write_domain = 0;
2662 2941
2663 trace_i915_gem_object_change_domain(obj, 2942 trace_i915_gem_object_change_domain(obj,
2664 obj->read_domains, 2943 obj->base.read_domains,
2665 old_write_domain); 2944 old_write_domain);
2666} 2945}
2667 2946
2668int
2669i915_gem_object_flush_write_domain(struct drm_gem_object *obj)
2670{
2671 int ret = 0;
2672
2673 switch (obj->write_domain) {
2674 case I915_GEM_DOMAIN_GTT:
2675 i915_gem_object_flush_gtt_write_domain(obj);
2676 break;
2677 case I915_GEM_DOMAIN_CPU:
2678 i915_gem_object_flush_cpu_write_domain(obj);
2679 break;
2680 default:
2681 ret = i915_gem_object_flush_gpu_write_domain(obj);
2682 break;
2683 }
2684
2685 return ret;
2686}
2687
2688/** 2947/**
2689 * Moves a single object to the GTT read, and possibly write domain. 2948 * Moves a single object to the GTT read, and possibly write domain.
2690 * 2949 *
@@ -2692,44 +2951,42 @@ i915_gem_object_flush_write_domain(struct drm_gem_object *obj)
2692 * flushes to occur. 2951 * flushes to occur.
2693 */ 2952 */
2694int 2953int
2695i915_gem_object_set_to_gtt_domain(struct drm_gem_object *obj, int write) 2954i915_gem_object_set_to_gtt_domain(struct drm_i915_gem_object *obj, bool write)
2696{ 2955{
2697 struct drm_i915_gem_object *obj_priv = to_intel_bo(obj);
2698 uint32_t old_write_domain, old_read_domains; 2956 uint32_t old_write_domain, old_read_domains;
2699 int ret; 2957 int ret;
2700 2958
2701 /* Not valid to be called on unbound objects. */ 2959 /* Not valid to be called on unbound objects. */
2702 if (obj_priv->gtt_space == NULL) 2960 if (obj->gtt_space == NULL)
2703 return -EINVAL; 2961 return -EINVAL;
2704 2962
2705 ret = i915_gem_object_flush_gpu_write_domain(obj); 2963 if (obj->base.write_domain == I915_GEM_DOMAIN_GTT)
2706 if (ret != 0) 2964 return 0;
2707 return ret;
2708 2965
2709 /* Wait on any GPU rendering and flushing to occur. */ 2966 ret = i915_gem_object_flush_gpu_write_domain(obj);
2710 ret = i915_gem_object_wait_rendering(obj); 2967 if (ret)
2711 if (ret != 0)
2712 return ret; 2968 return ret;
2713 2969
2714 old_write_domain = obj->write_domain; 2970 if (obj->pending_gpu_write || write) {
2715 old_read_domains = obj->read_domains; 2971 ret = i915_gem_object_wait_rendering(obj);
2716 2972 if (ret)
2717 /* If we're writing through the GTT domain, then CPU and GPU caches 2973 return ret;
2718 * will need to be invalidated at next use. 2974 }
2719 */
2720 if (write)
2721 obj->read_domains &= I915_GEM_DOMAIN_GTT;
2722 2975
2723 i915_gem_object_flush_cpu_write_domain(obj); 2976 i915_gem_object_flush_cpu_write_domain(obj);
2724 2977
2978 old_write_domain = obj->base.write_domain;
2979 old_read_domains = obj->base.read_domains;
2980
2725 /* It should now be out of any other write domains, and we can update 2981 /* It should now be out of any other write domains, and we can update
2726 * the domain values for our changes. 2982 * the domain values for our changes.
2727 */ 2983 */
2728 BUG_ON((obj->write_domain & ~I915_GEM_DOMAIN_GTT) != 0); 2984 BUG_ON((obj->base.write_domain & ~I915_GEM_DOMAIN_GTT) != 0);
2729 obj->read_domains |= I915_GEM_DOMAIN_GTT; 2985 obj->base.read_domains |= I915_GEM_DOMAIN_GTT;
2730 if (write) { 2986 if (write) {
2731 obj->write_domain = I915_GEM_DOMAIN_GTT; 2987 obj->base.read_domains = I915_GEM_DOMAIN_GTT;
2732 obj_priv->dirty = 1; 2988 obj->base.write_domain = I915_GEM_DOMAIN_GTT;
2989 obj->dirty = 1;
2733 } 2990 }
2734 2991
2735 trace_i915_gem_object_change_domain(obj, 2992 trace_i915_gem_object_change_domain(obj,
@@ -2744,55 +3001,57 @@ i915_gem_object_set_to_gtt_domain(struct drm_gem_object *obj, int write)
2744 * wait, as in modesetting process we're not supposed to be interrupted. 3001 * wait, as in modesetting process we're not supposed to be interrupted.
2745 */ 3002 */
2746int 3003int
2747i915_gem_object_set_to_display_plane(struct drm_gem_object *obj) 3004i915_gem_object_set_to_display_plane(struct drm_i915_gem_object *obj,
3005 struct intel_ring_buffer *pipelined)
2748{ 3006{
2749 struct drm_device *dev = obj->dev; 3007 uint32_t old_read_domains;
2750 struct drm_i915_gem_object *obj_priv = to_intel_bo(obj);
2751 uint32_t old_write_domain, old_read_domains;
2752 int ret; 3008 int ret;
2753 3009
2754 /* Not valid to be called on unbound objects. */ 3010 /* Not valid to be called on unbound objects. */
2755 if (obj_priv->gtt_space == NULL) 3011 if (obj->gtt_space == NULL)
2756 return -EINVAL; 3012 return -EINVAL;
2757 3013
2758 ret = i915_gem_object_flush_gpu_write_domain(obj); 3014 ret = i915_gem_object_flush_gpu_write_domain(obj);
2759 if (ret) 3015 if (ret)
2760 return ret; 3016 return ret;
2761 3017
2762 /* Wait on any GPU rendering and flushing to occur. */ 3018
2763 if (obj_priv->active) { 3019 /* Currently, we are always called from an non-interruptible context. */
2764#if WATCH_BUF 3020 if (pipelined != obj->ring) {
2765 DRM_INFO("%s: object %p wait for seqno %08x\n", 3021 ret = i915_gem_object_wait_rendering(obj);
2766 __func__, obj, obj_priv->last_rendering_seqno); 3022 if (ret)
2767#endif
2768 ret = i915_do_wait_request(dev,
2769 obj_priv->last_rendering_seqno,
2770 0,
2771 obj_priv->ring);
2772 if (ret != 0)
2773 return ret; 3023 return ret;
2774 } 3024 }
2775 3025
2776 i915_gem_object_flush_cpu_write_domain(obj); 3026 i915_gem_object_flush_cpu_write_domain(obj);
2777 3027
2778 old_write_domain = obj->write_domain; 3028 old_read_domains = obj->base.read_domains;
2779 old_read_domains = obj->read_domains; 3029 obj->base.read_domains |= I915_GEM_DOMAIN_GTT;
2780
2781 /* It should now be out of any other write domains, and we can update
2782 * the domain values for our changes.
2783 */
2784 BUG_ON((obj->write_domain & ~I915_GEM_DOMAIN_GTT) != 0);
2785 obj->read_domains = I915_GEM_DOMAIN_GTT;
2786 obj->write_domain = I915_GEM_DOMAIN_GTT;
2787 obj_priv->dirty = 1;
2788 3030
2789 trace_i915_gem_object_change_domain(obj, 3031 trace_i915_gem_object_change_domain(obj,
2790 old_read_domains, 3032 old_read_domains,
2791 old_write_domain); 3033 obj->base.write_domain);
2792 3034
2793 return 0; 3035 return 0;
2794} 3036}
2795 3037
3038int
3039i915_gem_object_flush_gpu(struct drm_i915_gem_object *obj)
3040{
3041 int ret;
3042
3043 if (!obj->active)
3044 return 0;
3045
3046 if (obj->base.write_domain & I915_GEM_GPU_DOMAINS) {
3047 ret = i915_gem_flush_ring(obj->ring, 0, obj->base.write_domain);
3048 if (ret)
3049 return ret;
3050 }
3051
3052 return i915_gem_object_wait_rendering(obj);
3053}
3054
2796/** 3055/**
2797 * Moves a single object to the CPU read, and possibly write domain. 3056 * Moves a single object to the CPU read, and possibly write domain.
2798 * 3057 *
@@ -2800,18 +3059,20 @@ i915_gem_object_set_to_display_plane(struct drm_gem_object *obj)
2800 * flushes to occur. 3059 * flushes to occur.
2801 */ 3060 */
2802static int 3061static int
2803i915_gem_object_set_to_cpu_domain(struct drm_gem_object *obj, int write) 3062i915_gem_object_set_to_cpu_domain(struct drm_i915_gem_object *obj, bool write)
2804{ 3063{
2805 uint32_t old_write_domain, old_read_domains; 3064 uint32_t old_write_domain, old_read_domains;
2806 int ret; 3065 int ret;
2807 3066
3067 if (obj->base.write_domain == I915_GEM_DOMAIN_CPU)
3068 return 0;
3069
2808 ret = i915_gem_object_flush_gpu_write_domain(obj); 3070 ret = i915_gem_object_flush_gpu_write_domain(obj);
2809 if (ret) 3071 if (ret)
2810 return ret; 3072 return ret;
2811 3073
2812 /* Wait on any GPU rendering and flushing to occur. */
2813 ret = i915_gem_object_wait_rendering(obj); 3074 ret = i915_gem_object_wait_rendering(obj);
2814 if (ret != 0) 3075 if (ret)
2815 return ret; 3076 return ret;
2816 3077
2817 i915_gem_object_flush_gtt_write_domain(obj); 3078 i915_gem_object_flush_gtt_write_domain(obj);
@@ -2821,27 +3082,27 @@ i915_gem_object_set_to_cpu_domain(struct drm_gem_object *obj, int write)
2821 */ 3082 */
2822 i915_gem_object_set_to_full_cpu_read_domain(obj); 3083 i915_gem_object_set_to_full_cpu_read_domain(obj);
2823 3084
2824 old_write_domain = obj->write_domain; 3085 old_write_domain = obj->base.write_domain;
2825 old_read_domains = obj->read_domains; 3086 old_read_domains = obj->base.read_domains;
2826 3087
2827 /* Flush the CPU cache if it's still invalid. */ 3088 /* Flush the CPU cache if it's still invalid. */
2828 if ((obj->read_domains & I915_GEM_DOMAIN_CPU) == 0) { 3089 if ((obj->base.read_domains & I915_GEM_DOMAIN_CPU) == 0) {
2829 i915_gem_clflush_object(obj); 3090 i915_gem_clflush_object(obj);
2830 3091
2831 obj->read_domains |= I915_GEM_DOMAIN_CPU; 3092 obj->base.read_domains |= I915_GEM_DOMAIN_CPU;
2832 } 3093 }
2833 3094
2834 /* It should now be out of any other write domains, and we can update 3095 /* It should now be out of any other write domains, and we can update
2835 * the domain values for our changes. 3096 * the domain values for our changes.
2836 */ 3097 */
2837 BUG_ON((obj->write_domain & ~I915_GEM_DOMAIN_CPU) != 0); 3098 BUG_ON((obj->base.write_domain & ~I915_GEM_DOMAIN_CPU) != 0);
2838 3099
2839 /* If we're writing through the CPU, then the GPU read domains will 3100 /* If we're writing through the CPU, then the GPU read domains will
2840 * need to be invalidated at next use. 3101 * need to be invalidated at next use.
2841 */ 3102 */
2842 if (write) { 3103 if (write) {
2843 obj->read_domains &= I915_GEM_DOMAIN_CPU; 3104 obj->base.read_domains = I915_GEM_DOMAIN_CPU;
2844 obj->write_domain = I915_GEM_DOMAIN_CPU; 3105 obj->base.write_domain = I915_GEM_DOMAIN_CPU;
2845 } 3106 }
2846 3107
2847 trace_i915_gem_object_change_domain(obj, 3108 trace_i915_gem_object_change_domain(obj,
@@ -2851,205 +3112,6 @@ i915_gem_object_set_to_cpu_domain(struct drm_gem_object *obj, int write)
2851 return 0; 3112 return 0;
2852} 3113}
2853 3114
2854/*
2855 * Set the next domain for the specified object. This
2856 * may not actually perform the necessary flushing/invaliding though,
2857 * as that may want to be batched with other set_domain operations
2858 *
2859 * This is (we hope) the only really tricky part of gem. The goal
2860 * is fairly simple -- track which caches hold bits of the object
2861 * and make sure they remain coherent. A few concrete examples may
2862 * help to explain how it works. For shorthand, we use the notation
2863 * (read_domains, write_domain), e.g. (CPU, CPU) to indicate the
2864 * a pair of read and write domain masks.
2865 *
2866 * Case 1: the batch buffer
2867 *
2868 * 1. Allocated
2869 * 2. Written by CPU
2870 * 3. Mapped to GTT
2871 * 4. Read by GPU
2872 * 5. Unmapped from GTT
2873 * 6. Freed
2874 *
2875 * Let's take these a step at a time
2876 *
2877 * 1. Allocated
2878 * Pages allocated from the kernel may still have
2879 * cache contents, so we set them to (CPU, CPU) always.
2880 * 2. Written by CPU (using pwrite)
2881 * The pwrite function calls set_domain (CPU, CPU) and
2882 * this function does nothing (as nothing changes)
2883 * 3. Mapped by GTT
2884 * This function asserts that the object is not
2885 * currently in any GPU-based read or write domains
2886 * 4. Read by GPU
2887 * i915_gem_execbuffer calls set_domain (COMMAND, 0).
2888 * As write_domain is zero, this function adds in the
2889 * current read domains (CPU+COMMAND, 0).
2890 * flush_domains is set to CPU.
2891 * invalidate_domains is set to COMMAND
2892 * clflush is run to get data out of the CPU caches
2893 * then i915_dev_set_domain calls i915_gem_flush to
2894 * emit an MI_FLUSH and drm_agp_chipset_flush
2895 * 5. Unmapped from GTT
2896 * i915_gem_object_unbind calls set_domain (CPU, CPU)
2897 * flush_domains and invalidate_domains end up both zero
2898 * so no flushing/invalidating happens
2899 * 6. Freed
2900 * yay, done
2901 *
2902 * Case 2: The shared render buffer
2903 *
2904 * 1. Allocated
2905 * 2. Mapped to GTT
2906 * 3. Read/written by GPU
2907 * 4. set_domain to (CPU,CPU)
2908 * 5. Read/written by CPU
2909 * 6. Read/written by GPU
2910 *
2911 * 1. Allocated
2912 * Same as last example, (CPU, CPU)
2913 * 2. Mapped to GTT
2914 * Nothing changes (assertions find that it is not in the GPU)
2915 * 3. Read/written by GPU
2916 * execbuffer calls set_domain (RENDER, RENDER)
2917 * flush_domains gets CPU
2918 * invalidate_domains gets GPU
2919 * clflush (obj)
2920 * MI_FLUSH and drm_agp_chipset_flush
2921 * 4. set_domain (CPU, CPU)
2922 * flush_domains gets GPU
2923 * invalidate_domains gets CPU
2924 * wait_rendering (obj) to make sure all drawing is complete.
2925 * This will include an MI_FLUSH to get the data from GPU
2926 * to memory
2927 * clflush (obj) to invalidate the CPU cache
2928 * Another MI_FLUSH in i915_gem_flush (eliminate this somehow?)
2929 * 5. Read/written by CPU
2930 * cache lines are loaded and dirtied
2931 * 6. Read written by GPU
2932 * Same as last GPU access
2933 *
2934 * Case 3: The constant buffer
2935 *
2936 * 1. Allocated
2937 * 2. Written by CPU
2938 * 3. Read by GPU
2939 * 4. Updated (written) by CPU again
2940 * 5. Read by GPU
2941 *
2942 * 1. Allocated
2943 * (CPU, CPU)
2944 * 2. Written by CPU
2945 * (CPU, CPU)
2946 * 3. Read by GPU
2947 * (CPU+RENDER, 0)
2948 * flush_domains = CPU
2949 * invalidate_domains = RENDER
2950 * clflush (obj)
2951 * MI_FLUSH
2952 * drm_agp_chipset_flush
2953 * 4. Updated (written) by CPU again
2954 * (CPU, CPU)
2955 * flush_domains = 0 (no previous write domain)
2956 * invalidate_domains = 0 (no new read domains)
2957 * 5. Read by GPU
2958 * (CPU+RENDER, 0)
2959 * flush_domains = CPU
2960 * invalidate_domains = RENDER
2961 * clflush (obj)
2962 * MI_FLUSH
2963 * drm_agp_chipset_flush
2964 */
2965static void
2966i915_gem_object_set_to_gpu_domain(struct drm_gem_object *obj)
2967{
2968 struct drm_device *dev = obj->dev;
2969 drm_i915_private_t *dev_priv = dev->dev_private;
2970 struct drm_i915_gem_object *obj_priv = to_intel_bo(obj);
2971 uint32_t invalidate_domains = 0;
2972 uint32_t flush_domains = 0;
2973 uint32_t old_read_domains;
2974
2975 BUG_ON(obj->pending_read_domains & I915_GEM_DOMAIN_CPU);
2976 BUG_ON(obj->pending_write_domain == I915_GEM_DOMAIN_CPU);
2977
2978 intel_mark_busy(dev, obj);
2979
2980#if WATCH_BUF
2981 DRM_INFO("%s: object %p read %08x -> %08x write %08x -> %08x\n",
2982 __func__, obj,
2983 obj->read_domains, obj->pending_read_domains,
2984 obj->write_domain, obj->pending_write_domain);
2985#endif
2986 /*
2987 * If the object isn't moving to a new write domain,
2988 * let the object stay in multiple read domains
2989 */
2990 if (obj->pending_write_domain == 0)
2991 obj->pending_read_domains |= obj->read_domains;
2992 else
2993 obj_priv->dirty = 1;
2994
2995 /*
2996 * Flush the current write domain if
2997 * the new read domains don't match. Invalidate
2998 * any read domains which differ from the old
2999 * write domain
3000 */
3001 if (obj->write_domain &&
3002 obj->write_domain != obj->pending_read_domains) {
3003 flush_domains |= obj->write_domain;
3004 invalidate_domains |=
3005 obj->pending_read_domains & ~obj->write_domain;
3006 }
3007 /*
3008 * Invalidate any read caches which may have
3009 * stale data. That is, any new read domains.
3010 */
3011 invalidate_domains |= obj->pending_read_domains & ~obj->read_domains;
3012 if ((flush_domains | invalidate_domains) & I915_GEM_DOMAIN_CPU) {
3013#if WATCH_BUF
3014 DRM_INFO("%s: CPU domain flush %08x invalidate %08x\n",
3015 __func__, flush_domains, invalidate_domains);
3016#endif
3017 i915_gem_clflush_object(obj);
3018 }
3019
3020 old_read_domains = obj->read_domains;
3021
3022 /* The actual obj->write_domain will be updated with
3023 * pending_write_domain after we emit the accumulated flush for all
3024 * of our domain changes in execbuffers (which clears objects'
3025 * write_domains). So if we have a current write domain that we
3026 * aren't changing, set pending_write_domain to that.
3027 */
3028 if (flush_domains == 0 && obj->pending_write_domain == 0)
3029 obj->pending_write_domain = obj->write_domain;
3030 obj->read_domains = obj->pending_read_domains;
3031
3032 if (flush_domains & I915_GEM_GPU_DOMAINS) {
3033 if (obj_priv->ring == &dev_priv->render_ring)
3034 dev_priv->flush_rings |= FLUSH_RENDER_RING;
3035 else if (obj_priv->ring == &dev_priv->bsd_ring)
3036 dev_priv->flush_rings |= FLUSH_BSD_RING;
3037 }
3038
3039 dev->invalidate_domains |= invalidate_domains;
3040 dev->flush_domains |= flush_domains;
3041#if WATCH_BUF
3042 DRM_INFO("%s: read %08x write %08x invalidate %08x flush %08x\n",
3043 __func__,
3044 obj->read_domains, obj->write_domain,
3045 dev->invalidate_domains, dev->flush_domains);
3046#endif
3047
3048 trace_i915_gem_object_change_domain(obj,
3049 old_read_domains,
3050 obj->write_domain);
3051}
3052
3053/** 3115/**
3054 * Moves the object from a partially CPU read to a full one. 3116 * Moves the object from a partially CPU read to a full one.
3055 * 3117 *
@@ -3057,30 +3119,28 @@ i915_gem_object_set_to_gpu_domain(struct drm_gem_object *obj)
3057 * and doesn't handle transitioning from !(read_domains & I915_GEM_DOMAIN_CPU). 3119 * and doesn't handle transitioning from !(read_domains & I915_GEM_DOMAIN_CPU).
3058 */ 3120 */
3059static void 3121static void
3060i915_gem_object_set_to_full_cpu_read_domain(struct drm_gem_object *obj) 3122i915_gem_object_set_to_full_cpu_read_domain(struct drm_i915_gem_object *obj)
3061{ 3123{
3062 struct drm_i915_gem_object *obj_priv = to_intel_bo(obj); 3124 if (!obj->page_cpu_valid)
3063
3064 if (!obj_priv->page_cpu_valid)
3065 return; 3125 return;
3066 3126
3067 /* If we're partially in the CPU read domain, finish moving it in. 3127 /* If we're partially in the CPU read domain, finish moving it in.
3068 */ 3128 */
3069 if (obj->read_domains & I915_GEM_DOMAIN_CPU) { 3129 if (obj->base.read_domains & I915_GEM_DOMAIN_CPU) {
3070 int i; 3130 int i;
3071 3131
3072 for (i = 0; i <= (obj->size - 1) / PAGE_SIZE; i++) { 3132 for (i = 0; i <= (obj->base.size - 1) / PAGE_SIZE; i++) {
3073 if (obj_priv->page_cpu_valid[i]) 3133 if (obj->page_cpu_valid[i])
3074 continue; 3134 continue;
3075 drm_clflush_pages(obj_priv->pages + i, 1); 3135 drm_clflush_pages(obj->pages + i, 1);
3076 } 3136 }
3077 } 3137 }
3078 3138
3079 /* Free the page_cpu_valid mappings which are now stale, whether 3139 /* Free the page_cpu_valid mappings which are now stale, whether
3080 * or not we've got I915_GEM_DOMAIN_CPU. 3140 * or not we've got I915_GEM_DOMAIN_CPU.
3081 */ 3141 */
3082 kfree(obj_priv->page_cpu_valid); 3142 kfree(obj->page_cpu_valid);
3083 obj_priv->page_cpu_valid = NULL; 3143 obj->page_cpu_valid = NULL;
3084} 3144}
3085 3145
3086/** 3146/**
@@ -3096,282 +3156,66 @@ i915_gem_object_set_to_full_cpu_read_domain(struct drm_gem_object *obj)
3096 * flushes to occur. 3156 * flushes to occur.
3097 */ 3157 */
3098static int 3158static int
3099i915_gem_object_set_cpu_read_domain_range(struct drm_gem_object *obj, 3159i915_gem_object_set_cpu_read_domain_range(struct drm_i915_gem_object *obj,
3100 uint64_t offset, uint64_t size) 3160 uint64_t offset, uint64_t size)
3101{ 3161{
3102 struct drm_i915_gem_object *obj_priv = to_intel_bo(obj);
3103 uint32_t old_read_domains; 3162 uint32_t old_read_domains;
3104 int i, ret; 3163 int i, ret;
3105 3164
3106 if (offset == 0 && size == obj->size) 3165 if (offset == 0 && size == obj->base.size)
3107 return i915_gem_object_set_to_cpu_domain(obj, 0); 3166 return i915_gem_object_set_to_cpu_domain(obj, 0);
3108 3167
3109 ret = i915_gem_object_flush_gpu_write_domain(obj); 3168 ret = i915_gem_object_flush_gpu_write_domain(obj);
3110 if (ret) 3169 if (ret)
3111 return ret; 3170 return ret;
3112 3171
3113 /* Wait on any GPU rendering and flushing to occur. */
3114 ret = i915_gem_object_wait_rendering(obj); 3172 ret = i915_gem_object_wait_rendering(obj);
3115 if (ret != 0) 3173 if (ret)
3116 return ret; 3174 return ret;
3175
3117 i915_gem_object_flush_gtt_write_domain(obj); 3176 i915_gem_object_flush_gtt_write_domain(obj);
3118 3177
3119 /* If we're already fully in the CPU read domain, we're done. */ 3178 /* If we're already fully in the CPU read domain, we're done. */
3120 if (obj_priv->page_cpu_valid == NULL && 3179 if (obj->page_cpu_valid == NULL &&
3121 (obj->read_domains & I915_GEM_DOMAIN_CPU) != 0) 3180 (obj->base.read_domains & I915_GEM_DOMAIN_CPU) != 0)
3122 return 0; 3181 return 0;
3123 3182
3124 /* Otherwise, create/clear the per-page CPU read domain flag if we're 3183 /* Otherwise, create/clear the per-page CPU read domain flag if we're
3125 * newly adding I915_GEM_DOMAIN_CPU 3184 * newly adding I915_GEM_DOMAIN_CPU
3126 */ 3185 */
3127 if (obj_priv->page_cpu_valid == NULL) { 3186 if (obj->page_cpu_valid == NULL) {
3128 obj_priv->page_cpu_valid = kzalloc(obj->size / PAGE_SIZE, 3187 obj->page_cpu_valid = kzalloc(obj->base.size / PAGE_SIZE,
3129 GFP_KERNEL); 3188 GFP_KERNEL);
3130 if (obj_priv->page_cpu_valid == NULL) 3189 if (obj->page_cpu_valid == NULL)
3131 return -ENOMEM; 3190 return -ENOMEM;
3132 } else if ((obj->read_domains & I915_GEM_DOMAIN_CPU) == 0) 3191 } else if ((obj->base.read_domains & I915_GEM_DOMAIN_CPU) == 0)
3133 memset(obj_priv->page_cpu_valid, 0, obj->size / PAGE_SIZE); 3192 memset(obj->page_cpu_valid, 0, obj->base.size / PAGE_SIZE);
3134 3193
3135 /* Flush the cache on any pages that are still invalid from the CPU's 3194 /* Flush the cache on any pages that are still invalid from the CPU's
3136 * perspective. 3195 * perspective.
3137 */ 3196 */
3138 for (i = offset / PAGE_SIZE; i <= (offset + size - 1) / PAGE_SIZE; 3197 for (i = offset / PAGE_SIZE; i <= (offset + size - 1) / PAGE_SIZE;
3139 i++) { 3198 i++) {
3140 if (obj_priv->page_cpu_valid[i]) 3199 if (obj->page_cpu_valid[i])
3141 continue; 3200 continue;
3142 3201
3143 drm_clflush_pages(obj_priv->pages + i, 1); 3202 drm_clflush_pages(obj->pages + i, 1);
3144 3203
3145 obj_priv->page_cpu_valid[i] = 1; 3204 obj->page_cpu_valid[i] = 1;
3146 } 3205 }
3147 3206
3148 /* It should now be out of any other write domains, and we can update 3207 /* It should now be out of any other write domains, and we can update
3149 * the domain values for our changes. 3208 * the domain values for our changes.
3150 */ 3209 */
3151 BUG_ON((obj->write_domain & ~I915_GEM_DOMAIN_CPU) != 0); 3210 BUG_ON((obj->base.write_domain & ~I915_GEM_DOMAIN_CPU) != 0);
3152 3211
3153 old_read_domains = obj->read_domains; 3212 old_read_domains = obj->base.read_domains;
3154 obj->read_domains |= I915_GEM_DOMAIN_CPU; 3213 obj->base.read_domains |= I915_GEM_DOMAIN_CPU;
3155 3214
3156 trace_i915_gem_object_change_domain(obj, 3215 trace_i915_gem_object_change_domain(obj,
3157 old_read_domains, 3216 old_read_domains,
3158 obj->write_domain); 3217 obj->base.write_domain);
3159
3160 return 0;
3161}
3162
3163/**
3164 * Pin an object to the GTT and evaluate the relocations landing in it.
3165 */
3166static int
3167i915_gem_object_pin_and_relocate(struct drm_gem_object *obj,
3168 struct drm_file *file_priv,
3169 struct drm_i915_gem_exec_object2 *entry,
3170 struct drm_i915_gem_relocation_entry *relocs)
3171{
3172 struct drm_device *dev = obj->dev;
3173 drm_i915_private_t *dev_priv = dev->dev_private;
3174 struct drm_i915_gem_object *obj_priv = to_intel_bo(obj);
3175 int i, ret;
3176 void __iomem *reloc_page;
3177 bool need_fence;
3178
3179 need_fence = entry->flags & EXEC_OBJECT_NEEDS_FENCE &&
3180 obj_priv->tiling_mode != I915_TILING_NONE;
3181
3182 /* Check fence reg constraints and rebind if necessary */
3183 if (need_fence &&
3184 !i915_gem_object_fence_offset_ok(obj,
3185 obj_priv->tiling_mode)) {
3186 ret = i915_gem_object_unbind(obj);
3187 if (ret)
3188 return ret;
3189 }
3190
3191 /* Choose the GTT offset for our buffer and put it there. */
3192 ret = i915_gem_object_pin(obj, (uint32_t) entry->alignment);
3193 if (ret)
3194 return ret;
3195
3196 /*
3197 * Pre-965 chips need a fence register set up in order to
3198 * properly handle blits to/from tiled surfaces.
3199 */
3200 if (need_fence) {
3201 ret = i915_gem_object_get_fence_reg(obj);
3202 if (ret != 0) {
3203 i915_gem_object_unpin(obj);
3204 return ret;
3205 }
3206 }
3207
3208 entry->offset = obj_priv->gtt_offset;
3209
3210 /* Apply the relocations, using the GTT aperture to avoid cache
3211 * flushing requirements.
3212 */
3213 for (i = 0; i < entry->relocation_count; i++) {
3214 struct drm_i915_gem_relocation_entry *reloc= &relocs[i];
3215 struct drm_gem_object *target_obj;
3216 struct drm_i915_gem_object *target_obj_priv;
3217 uint32_t reloc_val, reloc_offset;
3218 uint32_t __iomem *reloc_entry;
3219
3220 target_obj = drm_gem_object_lookup(obj->dev, file_priv,
3221 reloc->target_handle);
3222 if (target_obj == NULL) {
3223 i915_gem_object_unpin(obj);
3224 return -ENOENT;
3225 }
3226 target_obj_priv = to_intel_bo(target_obj);
3227
3228#if WATCH_RELOC
3229 DRM_INFO("%s: obj %p offset %08x target %d "
3230 "read %08x write %08x gtt %08x "
3231 "presumed %08x delta %08x\n",
3232 __func__,
3233 obj,
3234 (int) reloc->offset,
3235 (int) reloc->target_handle,
3236 (int) reloc->read_domains,
3237 (int) reloc->write_domain,
3238 (int) target_obj_priv->gtt_offset,
3239 (int) reloc->presumed_offset,
3240 reloc->delta);
3241#endif
3242
3243 /* The target buffer should have appeared before us in the
3244 * exec_object list, so it should have a GTT space bound by now.
3245 */
3246 if (target_obj_priv->gtt_space == NULL) {
3247 DRM_ERROR("No GTT space found for object %d\n",
3248 reloc->target_handle);
3249 drm_gem_object_unreference(target_obj);
3250 i915_gem_object_unpin(obj);
3251 return -EINVAL;
3252 }
3253 3218
3254 /* Validate that the target is in a valid r/w GPU domain */
3255 if (reloc->write_domain & (reloc->write_domain - 1)) {
3256 DRM_ERROR("reloc with multiple write domains: "
3257 "obj %p target %d offset %d "
3258 "read %08x write %08x",
3259 obj, reloc->target_handle,
3260 (int) reloc->offset,
3261 reloc->read_domains,
3262 reloc->write_domain);
3263 drm_gem_object_unreference(target_obj);
3264 i915_gem_object_unpin(obj);
3265 return -EINVAL;
3266 }
3267 if (reloc->write_domain & I915_GEM_DOMAIN_CPU ||
3268 reloc->read_domains & I915_GEM_DOMAIN_CPU) {
3269 DRM_ERROR("reloc with read/write CPU domains: "
3270 "obj %p target %d offset %d "
3271 "read %08x write %08x",
3272 obj, reloc->target_handle,
3273 (int) reloc->offset,
3274 reloc->read_domains,
3275 reloc->write_domain);
3276 drm_gem_object_unreference(target_obj);
3277 i915_gem_object_unpin(obj);
3278 return -EINVAL;
3279 }
3280 if (reloc->write_domain && target_obj->pending_write_domain &&
3281 reloc->write_domain != target_obj->pending_write_domain) {
3282 DRM_ERROR("Write domain conflict: "
3283 "obj %p target %d offset %d "
3284 "new %08x old %08x\n",
3285 obj, reloc->target_handle,
3286 (int) reloc->offset,
3287 reloc->write_domain,
3288 target_obj->pending_write_domain);
3289 drm_gem_object_unreference(target_obj);
3290 i915_gem_object_unpin(obj);
3291 return -EINVAL;
3292 }
3293
3294 target_obj->pending_read_domains |= reloc->read_domains;
3295 target_obj->pending_write_domain |= reloc->write_domain;
3296
3297 /* If the relocation already has the right value in it, no
3298 * more work needs to be done.
3299 */
3300 if (target_obj_priv->gtt_offset == reloc->presumed_offset) {
3301 drm_gem_object_unreference(target_obj);
3302 continue;
3303 }
3304
3305 /* Check that the relocation address is valid... */
3306 if (reloc->offset > obj->size - 4) {
3307 DRM_ERROR("Relocation beyond object bounds: "
3308 "obj %p target %d offset %d size %d.\n",
3309 obj, reloc->target_handle,
3310 (int) reloc->offset, (int) obj->size);
3311 drm_gem_object_unreference(target_obj);
3312 i915_gem_object_unpin(obj);
3313 return -EINVAL;
3314 }
3315 if (reloc->offset & 3) {
3316 DRM_ERROR("Relocation not 4-byte aligned: "
3317 "obj %p target %d offset %d.\n",
3318 obj, reloc->target_handle,
3319 (int) reloc->offset);
3320 drm_gem_object_unreference(target_obj);
3321 i915_gem_object_unpin(obj);
3322 return -EINVAL;
3323 }
3324
3325 /* and points to somewhere within the target object. */
3326 if (reloc->delta >= target_obj->size) {
3327 DRM_ERROR("Relocation beyond target object bounds: "
3328 "obj %p target %d delta %d size %d.\n",
3329 obj, reloc->target_handle,
3330 (int) reloc->delta, (int) target_obj->size);
3331 drm_gem_object_unreference(target_obj);
3332 i915_gem_object_unpin(obj);
3333 return -EINVAL;
3334 }
3335
3336 ret = i915_gem_object_set_to_gtt_domain(obj, 1);
3337 if (ret != 0) {
3338 drm_gem_object_unreference(target_obj);
3339 i915_gem_object_unpin(obj);
3340 return -EINVAL;
3341 }
3342
3343 /* Map the page containing the relocation we're going to
3344 * perform.
3345 */
3346 reloc_offset = obj_priv->gtt_offset + reloc->offset;
3347 reloc_page = io_mapping_map_atomic_wc(dev_priv->mm.gtt_mapping,
3348 (reloc_offset &
3349 ~(PAGE_SIZE - 1)),
3350 KM_USER0);
3351 reloc_entry = (uint32_t __iomem *)(reloc_page +
3352 (reloc_offset & (PAGE_SIZE - 1)));
3353 reloc_val = target_obj_priv->gtt_offset + reloc->delta;
3354
3355#if WATCH_BUF
3356 DRM_INFO("Applied relocation: %p@0x%08x %08x -> %08x\n",
3357 obj, (unsigned int) reloc->offset,
3358 readl(reloc_entry), reloc_val);
3359#endif
3360 writel(reloc_val, reloc_entry);
3361 io_mapping_unmap_atomic(reloc_page, KM_USER0);
3362
3363 /* The updated presumed offset for this entry will be
3364 * copied back out to the user.
3365 */
3366 reloc->presumed_offset = target_obj_priv->gtt_offset;
3367
3368 drm_gem_object_unreference(target_obj);
3369 }
3370
3371#if WATCH_BUF
3372 if (0)
3373 i915_gem_dump_object(obj, 128, __func__, ~0);
3374#endif
3375 return 0; 3219 return 0;
3376} 3220}
3377 3221
@@ -3386,857 +3230,254 @@ i915_gem_object_pin_and_relocate(struct drm_gem_object *obj,
3386 * relatively low latency when blocking on a particular request to finish. 3230 * relatively low latency when blocking on a particular request to finish.
3387 */ 3231 */
3388static int 3232static int
3389i915_gem_ring_throttle(struct drm_device *dev, struct drm_file *file_priv) 3233i915_gem_ring_throttle(struct drm_device *dev, struct drm_file *file)
3390{ 3234{
3391 struct drm_i915_file_private *i915_file_priv = file_priv->driver_priv; 3235 struct drm_i915_private *dev_priv = dev->dev_private;
3392 int ret = 0; 3236 struct drm_i915_file_private *file_priv = file->driver_priv;
3393 unsigned long recent_enough = jiffies - msecs_to_jiffies(20); 3237 unsigned long recent_enough = jiffies - msecs_to_jiffies(20);
3394 3238 struct drm_i915_gem_request *request;
3395 mutex_lock(&dev->struct_mutex);
3396 while (!list_empty(&i915_file_priv->mm.request_list)) {
3397 struct drm_i915_gem_request *request;
3398
3399 request = list_first_entry(&i915_file_priv->mm.request_list,
3400 struct drm_i915_gem_request,
3401 client_list);
3402
3403 if (time_after_eq(request->emitted_jiffies, recent_enough))
3404 break;
3405
3406 ret = i915_wait_request(dev, request->seqno, request->ring);
3407 if (ret != 0)
3408 break;
3409 }
3410 mutex_unlock(&dev->struct_mutex);
3411
3412 return ret;
3413}
3414
3415static int
3416i915_gem_get_relocs_from_user(struct drm_i915_gem_exec_object2 *exec_list,
3417 uint32_t buffer_count,
3418 struct drm_i915_gem_relocation_entry **relocs)
3419{
3420 uint32_t reloc_count = 0, reloc_index = 0, i;
3421 int ret;
3422
3423 *relocs = NULL;
3424 for (i = 0; i < buffer_count; i++) {
3425 if (reloc_count + exec_list[i].relocation_count < reloc_count)
3426 return -EINVAL;
3427 reloc_count += exec_list[i].relocation_count;
3428 }
3429
3430 *relocs = drm_calloc_large(reloc_count, sizeof(**relocs));
3431 if (*relocs == NULL) {
3432 DRM_ERROR("failed to alloc relocs, count %d\n", reloc_count);
3433 return -ENOMEM;
3434 }
3435
3436 for (i = 0; i < buffer_count; i++) {
3437 struct drm_i915_gem_relocation_entry __user *user_relocs;
3438
3439 user_relocs = (void __user *)(uintptr_t)exec_list[i].relocs_ptr;
3440
3441 ret = copy_from_user(&(*relocs)[reloc_index],
3442 user_relocs,
3443 exec_list[i].relocation_count *
3444 sizeof(**relocs));
3445 if (ret != 0) {
3446 drm_free_large(*relocs);
3447 *relocs = NULL;
3448 return -EFAULT;
3449 }
3450
3451 reloc_index += exec_list[i].relocation_count;
3452 }
3453
3454 return 0;
3455}
3456
3457static int
3458i915_gem_put_relocs_to_user(struct drm_i915_gem_exec_object2 *exec_list,
3459 uint32_t buffer_count,
3460 struct drm_i915_gem_relocation_entry *relocs)
3461{
3462 uint32_t reloc_count = 0, i;
3463 int ret = 0;
3464
3465 if (relocs == NULL)
3466 return 0;
3467
3468 for (i = 0; i < buffer_count; i++) {
3469 struct drm_i915_gem_relocation_entry __user *user_relocs;
3470 int unwritten;
3471
3472 user_relocs = (void __user *)(uintptr_t)exec_list[i].relocs_ptr;
3473
3474 unwritten = copy_to_user(user_relocs,
3475 &relocs[reloc_count],
3476 exec_list[i].relocation_count *
3477 sizeof(*relocs));
3478
3479 if (unwritten) {
3480 ret = -EFAULT;
3481 goto err;
3482 }
3483
3484 reloc_count += exec_list[i].relocation_count;
3485 }
3486
3487err:
3488 drm_free_large(relocs);
3489
3490 return ret;
3491}
3492
3493static int
3494i915_gem_check_execbuffer (struct drm_i915_gem_execbuffer2 *exec,
3495 uint64_t exec_offset)
3496{
3497 uint32_t exec_start, exec_len;
3498
3499 exec_start = (uint32_t) exec_offset + exec->batch_start_offset;
3500 exec_len = (uint32_t) exec->batch_len;
3501
3502 if ((exec_start | exec_len) & 0x7)
3503 return -EINVAL;
3504
3505 if (!exec_start)
3506 return -EINVAL;
3507
3508 return 0;
3509}
3510
3511static int
3512i915_gem_wait_for_pending_flip(struct drm_device *dev,
3513 struct drm_gem_object **object_list,
3514 int count)
3515{
3516 drm_i915_private_t *dev_priv = dev->dev_private;
3517 struct drm_i915_gem_object *obj_priv;
3518 DEFINE_WAIT(wait);
3519 int i, ret = 0;
3520
3521 for (;;) {
3522 prepare_to_wait(&dev_priv->pending_flip_queue,
3523 &wait, TASK_INTERRUPTIBLE);
3524 for (i = 0; i < count; i++) {
3525 obj_priv = to_intel_bo(object_list[i]);
3526 if (atomic_read(&obj_priv->pending_flip) > 0)
3527 break;
3528 }
3529 if (i == count)
3530 break;
3531
3532 if (!signal_pending(current)) {
3533 mutex_unlock(&dev->struct_mutex);
3534 schedule();
3535 mutex_lock(&dev->struct_mutex);
3536 continue;
3537 }
3538 ret = -ERESTARTSYS;
3539 break;
3540 }
3541 finish_wait(&dev_priv->pending_flip_queue, &wait);
3542
3543 return ret;
3544}
3545
3546
3547int
3548i915_gem_do_execbuffer(struct drm_device *dev, void *data,
3549 struct drm_file *file_priv,
3550 struct drm_i915_gem_execbuffer2 *args,
3551 struct drm_i915_gem_exec_object2 *exec_list)
3552{
3553 drm_i915_private_t *dev_priv = dev->dev_private;
3554 struct drm_gem_object **object_list = NULL;
3555 struct drm_gem_object *batch_obj;
3556 struct drm_i915_gem_object *obj_priv;
3557 struct drm_clip_rect *cliprects = NULL;
3558 struct drm_i915_gem_relocation_entry *relocs = NULL;
3559 int ret = 0, ret2, i, pinned = 0;
3560 uint64_t exec_offset;
3561 uint32_t seqno, flush_domains, reloc_index;
3562 int pin_tries, flips;
3563
3564 struct intel_ring_buffer *ring = NULL; 3239 struct intel_ring_buffer *ring = NULL;
3240 u32 seqno = 0;
3241 int ret;
3565 3242
3566#if WATCH_EXEC 3243 if (atomic_read(&dev_priv->mm.wedged))
3567 DRM_INFO("buffers_ptr %d buffer_count %d len %08x\n", 3244 return -EIO;
3568 (int) args->buffers_ptr, args->buffer_count, args->batch_len);
3569#endif
3570 if (args->flags & I915_EXEC_BSD) {
3571 if (!HAS_BSD(dev)) {
3572 DRM_ERROR("execbuf with wrong flag\n");
3573 return -EINVAL;
3574 }
3575 ring = &dev_priv->bsd_ring;
3576 } else {
3577 ring = &dev_priv->render_ring;
3578 }
3579
3580 if (args->buffer_count < 1) {
3581 DRM_ERROR("execbuf with %d buffers\n", args->buffer_count);
3582 return -EINVAL;
3583 }
3584 object_list = drm_malloc_ab(sizeof(*object_list), args->buffer_count);
3585 if (object_list == NULL) {
3586 DRM_ERROR("Failed to allocate object list for %d buffers\n",
3587 args->buffer_count);
3588 ret = -ENOMEM;
3589 goto pre_mutex_err;
3590 }
3591
3592 if (args->num_cliprects != 0) {
3593 cliprects = kcalloc(args->num_cliprects, sizeof(*cliprects),
3594 GFP_KERNEL);
3595 if (cliprects == NULL) {
3596 ret = -ENOMEM;
3597 goto pre_mutex_err;
3598 }
3599
3600 ret = copy_from_user(cliprects,
3601 (struct drm_clip_rect __user *)
3602 (uintptr_t) args->cliprects_ptr,
3603 sizeof(*cliprects) * args->num_cliprects);
3604 if (ret != 0) {
3605 DRM_ERROR("copy %d cliprects failed: %d\n",
3606 args->num_cliprects, ret);
3607 ret = -EFAULT;
3608 goto pre_mutex_err;
3609 }
3610 }
3611
3612 ret = i915_gem_get_relocs_from_user(exec_list, args->buffer_count,
3613 &relocs);
3614 if (ret != 0)
3615 goto pre_mutex_err;
3616
3617 mutex_lock(&dev->struct_mutex);
3618
3619 i915_verify_inactive(dev, __FILE__, __LINE__);
3620
3621 if (atomic_read(&dev_priv->mm.wedged)) {
3622 mutex_unlock(&dev->struct_mutex);
3623 ret = -EIO;
3624 goto pre_mutex_err;
3625 }
3626
3627 if (dev_priv->mm.suspended) {
3628 mutex_unlock(&dev->struct_mutex);
3629 ret = -EBUSY;
3630 goto pre_mutex_err;
3631 }
3632
3633 /* Look up object handles */
3634 flips = 0;
3635 for (i = 0; i < args->buffer_count; i++) {
3636 object_list[i] = drm_gem_object_lookup(dev, file_priv,
3637 exec_list[i].handle);
3638 if (object_list[i] == NULL) {
3639 DRM_ERROR("Invalid object handle %d at index %d\n",
3640 exec_list[i].handle, i);
3641 /* prevent error path from reading uninitialized data */
3642 args->buffer_count = i + 1;
3643 ret = -ENOENT;
3644 goto err;
3645 }
3646
3647 obj_priv = to_intel_bo(object_list[i]);
3648 if (obj_priv->in_execbuffer) {
3649 DRM_ERROR("Object %p appears more than once in object list\n",
3650 object_list[i]);
3651 /* prevent error path from reading uninitialized data */
3652 args->buffer_count = i + 1;
3653 ret = -EINVAL;
3654 goto err;
3655 }
3656 obj_priv->in_execbuffer = true;
3657 flips += atomic_read(&obj_priv->pending_flip);
3658 }
3659
3660 if (flips > 0) {
3661 ret = i915_gem_wait_for_pending_flip(dev, object_list,
3662 args->buffer_count);
3663 if (ret)
3664 goto err;
3665 }
3666 3245
3667 /* Pin and relocate */ 3246 spin_lock(&file_priv->mm.lock);
3668 for (pin_tries = 0; ; pin_tries++) { 3247 list_for_each_entry(request, &file_priv->mm.request_list, client_list) {
3669 ret = 0; 3248 if (time_after_eq(request->emitted_jiffies, recent_enough))
3670 reloc_index = 0;
3671
3672 for (i = 0; i < args->buffer_count; i++) {
3673 object_list[i]->pending_read_domains = 0;
3674 object_list[i]->pending_write_domain = 0;
3675 ret = i915_gem_object_pin_and_relocate(object_list[i],
3676 file_priv,
3677 &exec_list[i],
3678 &relocs[reloc_index]);
3679 if (ret)
3680 break;
3681 pinned = i + 1;
3682 reloc_index += exec_list[i].relocation_count;
3683 }
3684 /* success */
3685 if (ret == 0)
3686 break; 3249 break;
3687 3250
3688 /* error other than GTT full, or we've already tried again */ 3251 ring = request->ring;
3689 if (ret != -ENOSPC || pin_tries >= 1) { 3252 seqno = request->seqno;
3690 if (ret != -ERESTARTSYS) {
3691 unsigned long long total_size = 0;
3692 int num_fences = 0;
3693 for (i = 0; i < args->buffer_count; i++) {
3694 obj_priv = to_intel_bo(object_list[i]);
3695
3696 total_size += object_list[i]->size;
3697 num_fences +=
3698 exec_list[i].flags & EXEC_OBJECT_NEEDS_FENCE &&
3699 obj_priv->tiling_mode != I915_TILING_NONE;
3700 }
3701 DRM_ERROR("Failed to pin buffer %d of %d, total %llu bytes, %d fences: %d\n",
3702 pinned+1, args->buffer_count,
3703 total_size, num_fences,
3704 ret);
3705 DRM_ERROR("%d objects [%d pinned], "
3706 "%d object bytes [%d pinned], "
3707 "%d/%d gtt bytes\n",
3708 atomic_read(&dev->object_count),
3709 atomic_read(&dev->pin_count),
3710 atomic_read(&dev->object_memory),
3711 atomic_read(&dev->pin_memory),
3712 atomic_read(&dev->gtt_memory),
3713 dev->gtt_total);
3714 }
3715 goto err;
3716 }
3717
3718 /* unpin all of our buffers */
3719 for (i = 0; i < pinned; i++)
3720 i915_gem_object_unpin(object_list[i]);
3721 pinned = 0;
3722
3723 /* evict everyone we can from the aperture */
3724 ret = i915_gem_evict_everything(dev);
3725 if (ret && ret != -ENOSPC)
3726 goto err;
3727 }
3728
3729 /* Set the pending read domains for the batch buffer to COMMAND */
3730 batch_obj = object_list[args->buffer_count-1];
3731 if (batch_obj->pending_write_domain) {
3732 DRM_ERROR("Attempting to use self-modifying batch buffer\n");
3733 ret = -EINVAL;
3734 goto err;
3735 }
3736 batch_obj->pending_read_domains |= I915_GEM_DOMAIN_COMMAND;
3737
3738 /* Sanity check the batch buffer, prior to moving objects */
3739 exec_offset = exec_list[args->buffer_count - 1].offset;
3740 ret = i915_gem_check_execbuffer (args, exec_offset);
3741 if (ret != 0) {
3742 DRM_ERROR("execbuf with invalid offset/length\n");
3743 goto err;
3744 }
3745
3746 i915_verify_inactive(dev, __FILE__, __LINE__);
3747
3748 /* Zero the global flush/invalidate flags. These
3749 * will be modified as new domains are computed
3750 * for each object
3751 */
3752 dev->invalidate_domains = 0;
3753 dev->flush_domains = 0;
3754 dev_priv->flush_rings = 0;
3755
3756 for (i = 0; i < args->buffer_count; i++) {
3757 struct drm_gem_object *obj = object_list[i];
3758
3759 /* Compute new gpu domains and update invalidate/flush */
3760 i915_gem_object_set_to_gpu_domain(obj);
3761 } 3253 }
3254 spin_unlock(&file_priv->mm.lock);
3762 3255
3763 i915_verify_inactive(dev, __FILE__, __LINE__); 3256 if (seqno == 0)
3764 3257 return 0;
3765 if (dev->invalidate_domains | dev->flush_domains) {
3766#if WATCH_EXEC
3767 DRM_INFO("%s: invalidate_domains %08x flush_domains %08x\n",
3768 __func__,
3769 dev->invalidate_domains,
3770 dev->flush_domains);
3771#endif
3772 i915_gem_flush(dev,
3773 dev->invalidate_domains,
3774 dev->flush_domains);
3775 if (dev_priv->flush_rings & FLUSH_RENDER_RING)
3776 (void)i915_add_request(dev, file_priv,
3777 dev->flush_domains,
3778 &dev_priv->render_ring);
3779 if (dev_priv->flush_rings & FLUSH_BSD_RING)
3780 (void)i915_add_request(dev, file_priv,
3781 dev->flush_domains,
3782 &dev_priv->bsd_ring);
3783 }
3784
3785 for (i = 0; i < args->buffer_count; i++) {
3786 struct drm_gem_object *obj = object_list[i];
3787 struct drm_i915_gem_object *obj_priv = to_intel_bo(obj);
3788 uint32_t old_write_domain = obj->write_domain;
3789
3790 obj->write_domain = obj->pending_write_domain;
3791 if (obj->write_domain)
3792 list_move_tail(&obj_priv->gpu_write_list,
3793 &dev_priv->mm.gpu_write_list);
3794 else
3795 list_del_init(&obj_priv->gpu_write_list);
3796
3797 trace_i915_gem_object_change_domain(obj,
3798 obj->read_domains,
3799 old_write_domain);
3800 }
3801
3802 i915_verify_inactive(dev, __FILE__, __LINE__);
3803
3804#if WATCH_COHERENCY
3805 for (i = 0; i < args->buffer_count; i++) {
3806 i915_gem_object_check_coherency(object_list[i],
3807 exec_list[i].handle);
3808 }
3809#endif
3810
3811#if WATCH_EXEC
3812 i915_gem_dump_object(batch_obj,
3813 args->batch_len,
3814 __func__,
3815 ~0);
3816#endif
3817
3818 /* Exec the batchbuffer */
3819 ret = ring->dispatch_gem_execbuffer(dev, ring, args,
3820 cliprects, exec_offset);
3821 if (ret) {
3822 DRM_ERROR("dispatch failed %d\n", ret);
3823 goto err;
3824 }
3825
3826 /*
3827 * Ensure that the commands in the batch buffer are
3828 * finished before the interrupt fires
3829 */
3830 flush_domains = i915_retire_commands(dev, ring);
3831
3832 i915_verify_inactive(dev, __FILE__, __LINE__);
3833
3834 /*
3835 * Get a seqno representing the execution of the current buffer,
3836 * which we can wait on. We would like to mitigate these interrupts,
3837 * likely by only creating seqnos occasionally (so that we have
3838 * *some* interrupts representing completion of buffers that we can
3839 * wait on when trying to clear up gtt space).
3840 */
3841 seqno = i915_add_request(dev, file_priv, flush_domains, ring);
3842 BUG_ON(seqno == 0);
3843 for (i = 0; i < args->buffer_count; i++) {
3844 struct drm_gem_object *obj = object_list[i];
3845 obj_priv = to_intel_bo(obj);
3846
3847 i915_gem_object_move_to_active(obj, seqno, ring);
3848#if WATCH_LRU
3849 DRM_INFO("%s: move to exec list %p\n", __func__, obj);
3850#endif
3851 }
3852#if WATCH_LRU
3853 i915_dump_lru(dev, __func__);
3854#endif
3855
3856 i915_verify_inactive(dev, __FILE__, __LINE__);
3857
3858err:
3859 for (i = 0; i < pinned; i++)
3860 i915_gem_object_unpin(object_list[i]);
3861
3862 for (i = 0; i < args->buffer_count; i++) {
3863 if (object_list[i]) {
3864 obj_priv = to_intel_bo(object_list[i]);
3865 obj_priv->in_execbuffer = false;
3866 }
3867 drm_gem_object_unreference(object_list[i]);
3868 }
3869
3870 mutex_unlock(&dev->struct_mutex);
3871
3872pre_mutex_err:
3873 /* Copy the updated relocations out regardless of current error
3874 * state. Failure to update the relocs would mean that the next
3875 * time userland calls execbuf, it would do so with presumed offset
3876 * state that didn't match the actual object state.
3877 */
3878 ret2 = i915_gem_put_relocs_to_user(exec_list, args->buffer_count,
3879 relocs);
3880 if (ret2 != 0) {
3881 DRM_ERROR("Failed to copy relocations back out: %d\n", ret2);
3882
3883 if (ret == 0)
3884 ret = ret2;
3885 }
3886
3887 drm_free_large(object_list);
3888 kfree(cliprects);
3889
3890 return ret;
3891}
3892
3893/*
3894 * Legacy execbuffer just creates an exec2 list from the original exec object
3895 * list array and passes it to the real function.
3896 */
3897int
3898i915_gem_execbuffer(struct drm_device *dev, void *data,
3899 struct drm_file *file_priv)
3900{
3901 struct drm_i915_gem_execbuffer *args = data;
3902 struct drm_i915_gem_execbuffer2 exec2;
3903 struct drm_i915_gem_exec_object *exec_list = NULL;
3904 struct drm_i915_gem_exec_object2 *exec2_list = NULL;
3905 int ret, i;
3906
3907#if WATCH_EXEC
3908 DRM_INFO("buffers_ptr %d buffer_count %d len %08x\n",
3909 (int) args->buffers_ptr, args->buffer_count, args->batch_len);
3910#endif
3911
3912 if (args->buffer_count < 1) {
3913 DRM_ERROR("execbuf with %d buffers\n", args->buffer_count);
3914 return -EINVAL;
3915 }
3916
3917 /* Copy in the exec list from userland */
3918 exec_list = drm_malloc_ab(sizeof(*exec_list), args->buffer_count);
3919 exec2_list = drm_malloc_ab(sizeof(*exec2_list), args->buffer_count);
3920 if (exec_list == NULL || exec2_list == NULL) {
3921 DRM_ERROR("Failed to allocate exec list for %d buffers\n",
3922 args->buffer_count);
3923 drm_free_large(exec_list);
3924 drm_free_large(exec2_list);
3925 return -ENOMEM;
3926 }
3927 ret = copy_from_user(exec_list,
3928 (struct drm_i915_relocation_entry __user *)
3929 (uintptr_t) args->buffers_ptr,
3930 sizeof(*exec_list) * args->buffer_count);
3931 if (ret != 0) {
3932 DRM_ERROR("copy %d exec entries failed %d\n",
3933 args->buffer_count, ret);
3934 drm_free_large(exec_list);
3935 drm_free_large(exec2_list);
3936 return -EFAULT;
3937 }
3938 3258
3939 for (i = 0; i < args->buffer_count; i++) { 3259 ret = 0;
3940 exec2_list[i].handle = exec_list[i].handle; 3260 if (!i915_seqno_passed(ring->get_seqno(ring), seqno)) {
3941 exec2_list[i].relocation_count = exec_list[i].relocation_count; 3261 /* And wait for the seqno passing without holding any locks and
3942 exec2_list[i].relocs_ptr = exec_list[i].relocs_ptr; 3262 * causing extra latency for others. This is safe as the irq
3943 exec2_list[i].alignment = exec_list[i].alignment; 3263 * generation is designed to be run atomically and so is
3944 exec2_list[i].offset = exec_list[i].offset; 3264 * lockless.
3945 if (!IS_I965G(dev)) 3265 */
3946 exec2_list[i].flags = EXEC_OBJECT_NEEDS_FENCE; 3266 if (ring->irq_get(ring)) {
3947 else 3267 ret = wait_event_interruptible(ring->irq_queue,
3948 exec2_list[i].flags = 0; 3268 i915_seqno_passed(ring->get_seqno(ring), seqno)
3949 } 3269 || atomic_read(&dev_priv->mm.wedged));
3270 ring->irq_put(ring);
3950 3271
3951 exec2.buffers_ptr = args->buffers_ptr; 3272 if (ret == 0 && atomic_read(&dev_priv->mm.wedged))
3952 exec2.buffer_count = args->buffer_count; 3273 ret = -EIO;
3953 exec2.batch_start_offset = args->batch_start_offset;
3954 exec2.batch_len = args->batch_len;
3955 exec2.DR1 = args->DR1;
3956 exec2.DR4 = args->DR4;
3957 exec2.num_cliprects = args->num_cliprects;
3958 exec2.cliprects_ptr = args->cliprects_ptr;
3959 exec2.flags = I915_EXEC_RENDER;
3960
3961 ret = i915_gem_do_execbuffer(dev, data, file_priv, &exec2, exec2_list);
3962 if (!ret) {
3963 /* Copy the new buffer offsets back to the user's exec list. */
3964 for (i = 0; i < args->buffer_count; i++)
3965 exec_list[i].offset = exec2_list[i].offset;
3966 /* ... and back out to userspace */
3967 ret = copy_to_user((struct drm_i915_relocation_entry __user *)
3968 (uintptr_t) args->buffers_ptr,
3969 exec_list,
3970 sizeof(*exec_list) * args->buffer_count);
3971 if (ret) {
3972 ret = -EFAULT;
3973 DRM_ERROR("failed to copy %d exec entries "
3974 "back to user (%d)\n",
3975 args->buffer_count, ret);
3976 } 3274 }
3977 } 3275 }
3978 3276
3979 drm_free_large(exec_list); 3277 if (ret == 0)
3980 drm_free_large(exec2_list); 3278 queue_delayed_work(dev_priv->wq, &dev_priv->mm.retire_work, 0);
3981 return ret;
3982}
3983
3984int
3985i915_gem_execbuffer2(struct drm_device *dev, void *data,
3986 struct drm_file *file_priv)
3987{
3988 struct drm_i915_gem_execbuffer2 *args = data;
3989 struct drm_i915_gem_exec_object2 *exec2_list = NULL;
3990 int ret;
3991
3992#if WATCH_EXEC
3993 DRM_INFO("buffers_ptr %d buffer_count %d len %08x\n",
3994 (int) args->buffers_ptr, args->buffer_count, args->batch_len);
3995#endif
3996
3997 if (args->buffer_count < 1) {
3998 DRM_ERROR("execbuf2 with %d buffers\n", args->buffer_count);
3999 return -EINVAL;
4000 }
4001
4002 exec2_list = drm_malloc_ab(sizeof(*exec2_list), args->buffer_count);
4003 if (exec2_list == NULL) {
4004 DRM_ERROR("Failed to allocate exec list for %d buffers\n",
4005 args->buffer_count);
4006 return -ENOMEM;
4007 }
4008 ret = copy_from_user(exec2_list,
4009 (struct drm_i915_relocation_entry __user *)
4010 (uintptr_t) args->buffers_ptr,
4011 sizeof(*exec2_list) * args->buffer_count);
4012 if (ret != 0) {
4013 DRM_ERROR("copy %d exec entries failed %d\n",
4014 args->buffer_count, ret);
4015 drm_free_large(exec2_list);
4016 return -EFAULT;
4017 }
4018
4019 ret = i915_gem_do_execbuffer(dev, data, file_priv, args, exec2_list);
4020 if (!ret) {
4021 /* Copy the new buffer offsets back to the user's exec list. */
4022 ret = copy_to_user((struct drm_i915_relocation_entry __user *)
4023 (uintptr_t) args->buffers_ptr,
4024 exec2_list,
4025 sizeof(*exec2_list) * args->buffer_count);
4026 if (ret) {
4027 ret = -EFAULT;
4028 DRM_ERROR("failed to copy %d exec entries "
4029 "back to user (%d)\n",
4030 args->buffer_count, ret);
4031 }
4032 }
4033 3279
4034 drm_free_large(exec2_list);
4035 return ret; 3280 return ret;
4036} 3281}
4037 3282
4038int 3283int
4039i915_gem_object_pin(struct drm_gem_object *obj, uint32_t alignment) 3284i915_gem_object_pin(struct drm_i915_gem_object *obj,
3285 uint32_t alignment,
3286 bool map_and_fenceable)
4040{ 3287{
4041 struct drm_device *dev = obj->dev; 3288 struct drm_device *dev = obj->base.dev;
4042 struct drm_i915_gem_object *obj_priv = to_intel_bo(obj); 3289 struct drm_i915_private *dev_priv = dev->dev_private;
4043 int ret; 3290 int ret;
4044 3291
4045 BUG_ON(obj_priv->pin_count == DRM_I915_GEM_OBJECT_MAX_PIN_COUNT); 3292 BUG_ON(obj->pin_count == DRM_I915_GEM_OBJECT_MAX_PIN_COUNT);
4046 3293 WARN_ON(i915_verify_lists(dev));
4047 i915_verify_inactive(dev, __FILE__, __LINE__);
4048 3294
4049 if (obj_priv->gtt_space != NULL) { 3295 if (obj->gtt_space != NULL) {
4050 if (alignment == 0) 3296 if ((alignment && obj->gtt_offset & (alignment - 1)) ||
4051 alignment = i915_gem_get_gtt_alignment(obj); 3297 (map_and_fenceable && !obj->map_and_fenceable)) {
4052 if (obj_priv->gtt_offset & (alignment - 1)) { 3298 WARN(obj->pin_count,
4053 WARN(obj_priv->pin_count,
4054 "bo is already pinned with incorrect alignment:" 3299 "bo is already pinned with incorrect alignment:"
4055 " offset=%x, req.alignment=%x\n", 3300 " offset=%x, req.alignment=%x, req.map_and_fenceable=%d,"
4056 obj_priv->gtt_offset, alignment); 3301 " obj->map_and_fenceable=%d\n",
3302 obj->gtt_offset, alignment,
3303 map_and_fenceable,
3304 obj->map_and_fenceable);
4057 ret = i915_gem_object_unbind(obj); 3305 ret = i915_gem_object_unbind(obj);
4058 if (ret) 3306 if (ret)
4059 return ret; 3307 return ret;
4060 } 3308 }
4061 } 3309 }
4062 3310
4063 if (obj_priv->gtt_space == NULL) { 3311 if (obj->gtt_space == NULL) {
4064 ret = i915_gem_object_bind_to_gtt(obj, alignment); 3312 ret = i915_gem_object_bind_to_gtt(obj, alignment,
3313 map_and_fenceable);
4065 if (ret) 3314 if (ret)
4066 return ret; 3315 return ret;
4067 } 3316 }
4068 3317
4069 obj_priv->pin_count++; 3318 if (obj->pin_count++ == 0) {
4070 3319 if (!obj->active)
4071 /* If the object is not active and not pending a flush, 3320 list_move_tail(&obj->mm_list,
4072 * remove it from the inactive list 3321 &dev_priv->mm.pinned_list);
4073 */
4074 if (obj_priv->pin_count == 1) {
4075 atomic_inc(&dev->pin_count);
4076 atomic_add(obj->size, &dev->pin_memory);
4077 if (!obj_priv->active &&
4078 (obj->write_domain & I915_GEM_GPU_DOMAINS) == 0)
4079 list_del_init(&obj_priv->list);
4080 } 3322 }
4081 i915_verify_inactive(dev, __FILE__, __LINE__); 3323 obj->pin_mappable |= map_and_fenceable;
4082 3324
3325 WARN_ON(i915_verify_lists(dev));
4083 return 0; 3326 return 0;
4084} 3327}
4085 3328
4086void 3329void
4087i915_gem_object_unpin(struct drm_gem_object *obj) 3330i915_gem_object_unpin(struct drm_i915_gem_object *obj)
4088{ 3331{
4089 struct drm_device *dev = obj->dev; 3332 struct drm_device *dev = obj->base.dev;
4090 drm_i915_private_t *dev_priv = dev->dev_private; 3333 drm_i915_private_t *dev_priv = dev->dev_private;
4091 struct drm_i915_gem_object *obj_priv = to_intel_bo(obj);
4092 3334
4093 i915_verify_inactive(dev, __FILE__, __LINE__); 3335 WARN_ON(i915_verify_lists(dev));
4094 obj_priv->pin_count--; 3336 BUG_ON(obj->pin_count == 0);
4095 BUG_ON(obj_priv->pin_count < 0); 3337 BUG_ON(obj->gtt_space == NULL);
4096 BUG_ON(obj_priv->gtt_space == NULL);
4097 3338
4098 /* If the object is no longer pinned, and is 3339 if (--obj->pin_count == 0) {
4099 * neither active nor being flushed, then stick it on 3340 if (!obj->active)
4100 * the inactive list 3341 list_move_tail(&obj->mm_list,
4101 */
4102 if (obj_priv->pin_count == 0) {
4103 if (!obj_priv->active &&
4104 (obj->write_domain & I915_GEM_GPU_DOMAINS) == 0)
4105 list_move_tail(&obj_priv->list,
4106 &dev_priv->mm.inactive_list); 3342 &dev_priv->mm.inactive_list);
4107 atomic_dec(&dev->pin_count); 3343 obj->pin_mappable = false;
4108 atomic_sub(obj->size, &dev->pin_memory);
4109 } 3344 }
4110 i915_verify_inactive(dev, __FILE__, __LINE__); 3345 WARN_ON(i915_verify_lists(dev));
4111} 3346}
4112 3347
4113int 3348int
4114i915_gem_pin_ioctl(struct drm_device *dev, void *data, 3349i915_gem_pin_ioctl(struct drm_device *dev, void *data,
4115 struct drm_file *file_priv) 3350 struct drm_file *file)
4116{ 3351{
4117 struct drm_i915_gem_pin *args = data; 3352 struct drm_i915_gem_pin *args = data;
4118 struct drm_gem_object *obj; 3353 struct drm_i915_gem_object *obj;
4119 struct drm_i915_gem_object *obj_priv;
4120 int ret; 3354 int ret;
4121 3355
4122 mutex_lock(&dev->struct_mutex); 3356 ret = i915_mutex_lock_interruptible(dev);
3357 if (ret)
3358 return ret;
4123 3359
4124 obj = drm_gem_object_lookup(dev, file_priv, args->handle); 3360 obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
4125 if (obj == NULL) { 3361 if (&obj->base == NULL) {
4126 DRM_ERROR("Bad handle in i915_gem_pin_ioctl(): %d\n", 3362 ret = -ENOENT;
4127 args->handle); 3363 goto unlock;
4128 mutex_unlock(&dev->struct_mutex);
4129 return -ENOENT;
4130 } 3364 }
4131 obj_priv = to_intel_bo(obj);
4132 3365
4133 if (obj_priv->madv != I915_MADV_WILLNEED) { 3366 if (obj->madv != I915_MADV_WILLNEED) {
4134 DRM_ERROR("Attempting to pin a purgeable buffer\n"); 3367 DRM_ERROR("Attempting to pin a purgeable buffer\n");
4135 drm_gem_object_unreference(obj); 3368 ret = -EINVAL;
4136 mutex_unlock(&dev->struct_mutex); 3369 goto out;
4137 return -EINVAL;
4138 } 3370 }
4139 3371
4140 if (obj_priv->pin_filp != NULL && obj_priv->pin_filp != file_priv) { 3372 if (obj->pin_filp != NULL && obj->pin_filp != file) {
4141 DRM_ERROR("Already pinned in i915_gem_pin_ioctl(): %d\n", 3373 DRM_ERROR("Already pinned in i915_gem_pin_ioctl(): %d\n",
4142 args->handle); 3374 args->handle);
4143 drm_gem_object_unreference(obj); 3375 ret = -EINVAL;
4144 mutex_unlock(&dev->struct_mutex); 3376 goto out;
4145 return -EINVAL;
4146 } 3377 }
4147 3378
4148 obj_priv->user_pin_count++; 3379 obj->user_pin_count++;
4149 obj_priv->pin_filp = file_priv; 3380 obj->pin_filp = file;
4150 if (obj_priv->user_pin_count == 1) { 3381 if (obj->user_pin_count == 1) {
4151 ret = i915_gem_object_pin(obj, args->alignment); 3382 ret = i915_gem_object_pin(obj, args->alignment, true);
4152 if (ret != 0) { 3383 if (ret)
4153 drm_gem_object_unreference(obj); 3384 goto out;
4154 mutex_unlock(&dev->struct_mutex);
4155 return ret;
4156 }
4157 } 3385 }
4158 3386
4159 /* XXX - flush the CPU caches for pinned objects 3387 /* XXX - flush the CPU caches for pinned objects
4160 * as the X server doesn't manage domains yet 3388 * as the X server doesn't manage domains yet
4161 */ 3389 */
4162 i915_gem_object_flush_cpu_write_domain(obj); 3390 i915_gem_object_flush_cpu_write_domain(obj);
4163 args->offset = obj_priv->gtt_offset; 3391 args->offset = obj->gtt_offset;
4164 drm_gem_object_unreference(obj); 3392out:
3393 drm_gem_object_unreference(&obj->base);
3394unlock:
4165 mutex_unlock(&dev->struct_mutex); 3395 mutex_unlock(&dev->struct_mutex);
4166 3396 return ret;
4167 return 0;
4168} 3397}
4169 3398
4170int 3399int
4171i915_gem_unpin_ioctl(struct drm_device *dev, void *data, 3400i915_gem_unpin_ioctl(struct drm_device *dev, void *data,
4172 struct drm_file *file_priv) 3401 struct drm_file *file)
4173{ 3402{
4174 struct drm_i915_gem_pin *args = data; 3403 struct drm_i915_gem_pin *args = data;
4175 struct drm_gem_object *obj; 3404 struct drm_i915_gem_object *obj;
4176 struct drm_i915_gem_object *obj_priv; 3405 int ret;
4177 3406
4178 mutex_lock(&dev->struct_mutex); 3407 ret = i915_mutex_lock_interruptible(dev);
3408 if (ret)
3409 return ret;
4179 3410
4180 obj = drm_gem_object_lookup(dev, file_priv, args->handle); 3411 obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
4181 if (obj == NULL) { 3412 if (&obj->base == NULL) {
4182 DRM_ERROR("Bad handle in i915_gem_unpin_ioctl(): %d\n", 3413 ret = -ENOENT;
4183 args->handle); 3414 goto unlock;
4184 mutex_unlock(&dev->struct_mutex);
4185 return -ENOENT;
4186 } 3415 }
4187 3416
4188 obj_priv = to_intel_bo(obj); 3417 if (obj->pin_filp != file) {
4189 if (obj_priv->pin_filp != file_priv) {
4190 DRM_ERROR("Not pinned by caller in i915_gem_pin_ioctl(): %d\n", 3418 DRM_ERROR("Not pinned by caller in i915_gem_pin_ioctl(): %d\n",
4191 args->handle); 3419 args->handle);
4192 drm_gem_object_unreference(obj); 3420 ret = -EINVAL;
4193 mutex_unlock(&dev->struct_mutex); 3421 goto out;
4194 return -EINVAL;
4195 } 3422 }
4196 obj_priv->user_pin_count--; 3423 obj->user_pin_count--;
4197 if (obj_priv->user_pin_count == 0) { 3424 if (obj->user_pin_count == 0) {
4198 obj_priv->pin_filp = NULL; 3425 obj->pin_filp = NULL;
4199 i915_gem_object_unpin(obj); 3426 i915_gem_object_unpin(obj);
4200 } 3427 }
4201 3428
4202 drm_gem_object_unreference(obj); 3429out:
3430 drm_gem_object_unreference(&obj->base);
3431unlock:
4203 mutex_unlock(&dev->struct_mutex); 3432 mutex_unlock(&dev->struct_mutex);
4204 return 0; 3433 return ret;
4205} 3434}
4206 3435
4207int 3436int
4208i915_gem_busy_ioctl(struct drm_device *dev, void *data, 3437i915_gem_busy_ioctl(struct drm_device *dev, void *data,
4209 struct drm_file *file_priv) 3438 struct drm_file *file)
4210{ 3439{
4211 struct drm_i915_gem_busy *args = data; 3440 struct drm_i915_gem_busy *args = data;
4212 struct drm_gem_object *obj; 3441 struct drm_i915_gem_object *obj;
4213 struct drm_i915_gem_object *obj_priv; 3442 int ret;
4214 3443
4215 obj = drm_gem_object_lookup(dev, file_priv, args->handle); 3444 ret = i915_mutex_lock_interruptible(dev);
4216 if (obj == NULL) { 3445 if (ret)
4217 DRM_ERROR("Bad handle in i915_gem_busy_ioctl(): %d\n", 3446 return ret;
4218 args->handle);
4219 return -ENOENT;
4220 }
4221 3447
4222 mutex_lock(&dev->struct_mutex); 3448 obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
3449 if (&obj->base == NULL) {
3450 ret = -ENOENT;
3451 goto unlock;
3452 }
4223 3453
4224 /* Count all active objects as busy, even if they are currently not used 3454 /* Count all active objects as busy, even if they are currently not used
4225 * by the gpu. Users of this interface expect objects to eventually 3455 * by the gpu. Users of this interface expect objects to eventually
4226 * become non-busy without any further actions, therefore emit any 3456 * become non-busy without any further actions, therefore emit any
4227 * necessary flushes here. 3457 * necessary flushes here.
4228 */ 3458 */
4229 obj_priv = to_intel_bo(obj); 3459 args->busy = obj->active;
4230 args->busy = obj_priv->active;
4231 if (args->busy) { 3460 if (args->busy) {
4232 /* Unconditionally flush objects, even when the gpu still uses this 3461 /* Unconditionally flush objects, even when the gpu still uses this
4233 * object. Userspace calling this function indicates that it wants to 3462 * object. Userspace calling this function indicates that it wants to
4234 * use this buffer rather sooner than later, so issuing the required 3463 * use this buffer rather sooner than later, so issuing the required
4235 * flush earlier is beneficial. 3464 * flush earlier is beneficial.
4236 */ 3465 */
4237 if (obj->write_domain) { 3466 if (obj->base.write_domain & I915_GEM_GPU_DOMAINS) {
4238 i915_gem_flush(dev, 0, obj->write_domain); 3467 ret = i915_gem_flush_ring(obj->ring,
4239 (void)i915_add_request(dev, file_priv, obj->write_domain, obj_priv->ring); 3468 0, obj->base.write_domain);
3469 } else if (obj->ring->outstanding_lazy_request ==
3470 obj->last_rendering_seqno) {
3471 struct drm_i915_gem_request *request;
3472
3473 /* This ring is not being cleared by active usage,
3474 * so emit a request to do so.
3475 */
3476 request = kzalloc(sizeof(*request), GFP_KERNEL);
3477 if (request)
3478 ret = i915_add_request(obj->ring, NULL,request);
3479 else
3480 ret = -ENOMEM;
4240 } 3481 }
4241 3482
4242 /* Update the active list for the hardware's current position. 3483 /* Update the active list for the hardware's current position.
@@ -4244,14 +3485,15 @@ i915_gem_busy_ioctl(struct drm_device *dev, void *data,
4244 * are actually unmasked, and our working set ends up being 3485 * are actually unmasked, and our working set ends up being
4245 * larger than required. 3486 * larger than required.
4246 */ 3487 */
4247 i915_gem_retire_requests_ring(dev, obj_priv->ring); 3488 i915_gem_retire_requests_ring(obj->ring);
4248 3489
4249 args->busy = obj_priv->active; 3490 args->busy = obj->active;
4250 } 3491 }
4251 3492
4252 drm_gem_object_unreference(obj); 3493 drm_gem_object_unreference(&obj->base);
3494unlock:
4253 mutex_unlock(&dev->struct_mutex); 3495 mutex_unlock(&dev->struct_mutex);
4254 return 0; 3496 return ret;
4255} 3497}
4256 3498
4257int 3499int
@@ -4266,8 +3508,8 @@ i915_gem_madvise_ioctl(struct drm_device *dev, void *data,
4266 struct drm_file *file_priv) 3508 struct drm_file *file_priv)
4267{ 3509{
4268 struct drm_i915_gem_madvise *args = data; 3510 struct drm_i915_gem_madvise *args = data;
4269 struct drm_gem_object *obj; 3511 struct drm_i915_gem_object *obj;
4270 struct drm_i915_gem_object *obj_priv; 3512 int ret;
4271 3513
4272 switch (args->madv) { 3514 switch (args->madv) {
4273 case I915_MADV_DONTNEED: 3515 case I915_MADV_DONTNEED:
@@ -4277,44 +3519,44 @@ i915_gem_madvise_ioctl(struct drm_device *dev, void *data,
4277 return -EINVAL; 3519 return -EINVAL;
4278 } 3520 }
4279 3521
4280 obj = drm_gem_object_lookup(dev, file_priv, args->handle); 3522 ret = i915_mutex_lock_interruptible(dev);
4281 if (obj == NULL) { 3523 if (ret)
4282 DRM_ERROR("Bad handle in i915_gem_madvise_ioctl(): %d\n", 3524 return ret;
4283 args->handle);
4284 return -ENOENT;
4285 }
4286
4287 mutex_lock(&dev->struct_mutex);
4288 obj_priv = to_intel_bo(obj);
4289 3525
4290 if (obj_priv->pin_count) { 3526 obj = to_intel_bo(drm_gem_object_lookup(dev, file_priv, args->handle));
4291 drm_gem_object_unreference(obj); 3527 if (&obj->base == NULL) {
4292 mutex_unlock(&dev->struct_mutex); 3528 ret = -ENOENT;
3529 goto unlock;
3530 }
4293 3531
4294 DRM_ERROR("Attempted i915_gem_madvise_ioctl() on a pinned object\n"); 3532 if (obj->pin_count) {
4295 return -EINVAL; 3533 ret = -EINVAL;
3534 goto out;
4296 } 3535 }
4297 3536
4298 if (obj_priv->madv != __I915_MADV_PURGED) 3537 if (obj->madv != __I915_MADV_PURGED)
4299 obj_priv->madv = args->madv; 3538 obj->madv = args->madv;
4300 3539
4301 /* if the object is no longer bound, discard its backing storage */ 3540 /* if the object is no longer bound, discard its backing storage */
4302 if (i915_gem_object_is_purgeable(obj_priv) && 3541 if (i915_gem_object_is_purgeable(obj) &&
4303 obj_priv->gtt_space == NULL) 3542 obj->gtt_space == NULL)
4304 i915_gem_object_truncate(obj); 3543 i915_gem_object_truncate(obj);
4305 3544
4306 args->retained = obj_priv->madv != __I915_MADV_PURGED; 3545 args->retained = obj->madv != __I915_MADV_PURGED;
4307 3546
4308 drm_gem_object_unreference(obj); 3547out:
3548 drm_gem_object_unreference(&obj->base);
3549unlock:
4309 mutex_unlock(&dev->struct_mutex); 3550 mutex_unlock(&dev->struct_mutex);
4310 3551 return ret;
4311 return 0;
4312} 3552}
4313 3553
4314struct drm_gem_object * i915_gem_alloc_object(struct drm_device *dev, 3554struct drm_i915_gem_object *i915_gem_alloc_object(struct drm_device *dev,
4315 size_t size) 3555 size_t size)
4316{ 3556{
3557 struct drm_i915_private *dev_priv = dev->dev_private;
4317 struct drm_i915_gem_object *obj; 3558 struct drm_i915_gem_object *obj;
3559 struct address_space *mapping;
4318 3560
4319 obj = kzalloc(sizeof(*obj), GFP_KERNEL); 3561 obj = kzalloc(sizeof(*obj), GFP_KERNEL);
4320 if (obj == NULL) 3562 if (obj == NULL)
@@ -4325,19 +3567,27 @@ struct drm_gem_object * i915_gem_alloc_object(struct drm_device *dev,
4325 return NULL; 3567 return NULL;
4326 } 3568 }
4327 3569
3570 mapping = obj->base.filp->f_path.dentry->d_inode->i_mapping;
3571 mapping_set_gfp_mask(mapping, GFP_HIGHUSER | __GFP_RECLAIMABLE);
3572
3573 i915_gem_info_add_obj(dev_priv, size);
3574
4328 obj->base.write_domain = I915_GEM_DOMAIN_CPU; 3575 obj->base.write_domain = I915_GEM_DOMAIN_CPU;
4329 obj->base.read_domains = I915_GEM_DOMAIN_CPU; 3576 obj->base.read_domains = I915_GEM_DOMAIN_CPU;
4330 3577
4331 obj->agp_type = AGP_USER_MEMORY; 3578 obj->cache_level = I915_CACHE_NONE;
4332 obj->base.driver_private = NULL; 3579 obj->base.driver_private = NULL;
4333 obj->fence_reg = I915_FENCE_REG_NONE; 3580 obj->fence_reg = I915_FENCE_REG_NONE;
4334 INIT_LIST_HEAD(&obj->list); 3581 INIT_LIST_HEAD(&obj->mm_list);
3582 INIT_LIST_HEAD(&obj->gtt_list);
3583 INIT_LIST_HEAD(&obj->ring_list);
3584 INIT_LIST_HEAD(&obj->exec_list);
4335 INIT_LIST_HEAD(&obj->gpu_write_list); 3585 INIT_LIST_HEAD(&obj->gpu_write_list);
4336 obj->madv = I915_MADV_WILLNEED; 3586 obj->madv = I915_MADV_WILLNEED;
3587 /* Avoid an unnecessary call to unbind on the first bind. */
3588 obj->map_and_fenceable = true;
4337 3589
4338 trace_i915_gem_object_create(&obj->base); 3590 return obj;
4339
4340 return &obj->base;
4341} 3591}
4342 3592
4343int i915_gem_init_object(struct drm_gem_object *obj) 3593int i915_gem_init_object(struct drm_gem_object *obj)
@@ -4347,41 +3597,41 @@ int i915_gem_init_object(struct drm_gem_object *obj)
4347 return 0; 3597 return 0;
4348} 3598}
4349 3599
4350static void i915_gem_free_object_tail(struct drm_gem_object *obj) 3600static void i915_gem_free_object_tail(struct drm_i915_gem_object *obj)
4351{ 3601{
4352 struct drm_device *dev = obj->dev; 3602 struct drm_device *dev = obj->base.dev;
4353 drm_i915_private_t *dev_priv = dev->dev_private; 3603 drm_i915_private_t *dev_priv = dev->dev_private;
4354 struct drm_i915_gem_object *obj_priv = to_intel_bo(obj);
4355 int ret; 3604 int ret;
4356 3605
4357 ret = i915_gem_object_unbind(obj); 3606 ret = i915_gem_object_unbind(obj);
4358 if (ret == -ERESTARTSYS) { 3607 if (ret == -ERESTARTSYS) {
4359 list_move(&obj_priv->list, 3608 list_move(&obj->mm_list,
4360 &dev_priv->mm.deferred_free_list); 3609 &dev_priv->mm.deferred_free_list);
4361 return; 3610 return;
4362 } 3611 }
4363 3612
4364 if (obj_priv->mmap_offset) 3613 trace_i915_gem_object_destroy(obj);
3614
3615 if (obj->base.map_list.map)
4365 i915_gem_free_mmap_offset(obj); 3616 i915_gem_free_mmap_offset(obj);
4366 3617
4367 drm_gem_object_release(obj); 3618 drm_gem_object_release(&obj->base);
3619 i915_gem_info_remove_obj(dev_priv, obj->base.size);
4368 3620
4369 kfree(obj_priv->page_cpu_valid); 3621 kfree(obj->page_cpu_valid);
4370 kfree(obj_priv->bit_17); 3622 kfree(obj->bit_17);
4371 kfree(obj_priv); 3623 kfree(obj);
4372} 3624}
4373 3625
4374void i915_gem_free_object(struct drm_gem_object *obj) 3626void i915_gem_free_object(struct drm_gem_object *gem_obj)
4375{ 3627{
4376 struct drm_device *dev = obj->dev; 3628 struct drm_i915_gem_object *obj = to_intel_bo(gem_obj);
4377 struct drm_i915_gem_object *obj_priv = to_intel_bo(obj); 3629 struct drm_device *dev = obj->base.dev;
4378
4379 trace_i915_gem_object_destroy(obj);
4380 3630
4381 while (obj_priv->pin_count > 0) 3631 while (obj->pin_count > 0)
4382 i915_gem_object_unpin(obj); 3632 i915_gem_object_unpin(obj);
4383 3633
4384 if (obj_priv->phys_obj) 3634 if (obj->phys_obj)
4385 i915_gem_detach_phys_object(dev, obj); 3635 i915_gem_detach_phys_object(dev, obj);
4386 3636
4387 i915_gem_free_object_tail(obj); 3637 i915_gem_free_object_tail(obj);
@@ -4395,10 +3645,7 @@ i915_gem_idle(struct drm_device *dev)
4395 3645
4396 mutex_lock(&dev->struct_mutex); 3646 mutex_lock(&dev->struct_mutex);
4397 3647
4398 if (dev_priv->mm.suspended || 3648 if (dev_priv->mm.suspended) {
4399 (dev_priv->render_ring.gem_object == NULL) ||
4400 (HAS_BSD(dev) &&
4401 dev_priv->bsd_ring.gem_object == NULL)) {
4402 mutex_unlock(&dev->struct_mutex); 3649 mutex_unlock(&dev->struct_mutex);
4403 return 0; 3650 return 0;
4404 } 3651 }
@@ -4411,19 +3658,21 @@ i915_gem_idle(struct drm_device *dev)
4411 3658
4412 /* Under UMS, be paranoid and evict. */ 3659 /* Under UMS, be paranoid and evict. */
4413 if (!drm_core_check_feature(dev, DRIVER_MODESET)) { 3660 if (!drm_core_check_feature(dev, DRIVER_MODESET)) {
4414 ret = i915_gem_evict_inactive(dev); 3661 ret = i915_gem_evict_inactive(dev, false);
4415 if (ret) { 3662 if (ret) {
4416 mutex_unlock(&dev->struct_mutex); 3663 mutex_unlock(&dev->struct_mutex);
4417 return ret; 3664 return ret;
4418 } 3665 }
4419 } 3666 }
4420 3667
3668 i915_gem_reset_fences(dev);
3669
4421 /* Hack! Don't let anybody do execbuf while we don't control the chip. 3670 /* Hack! Don't let anybody do execbuf while we don't control the chip.
4422 * We need to replace this with a semaphore, or something. 3671 * We need to replace this with a semaphore, or something.
4423 * And not confound mm.suspended! 3672 * And not confound mm.suspended!
4424 */ 3673 */
4425 dev_priv->mm.suspended = 1; 3674 dev_priv->mm.suspended = 1;
4426 del_timer(&dev_priv->hangcheck_timer); 3675 del_timer_sync(&dev_priv->hangcheck_timer);
4427 3676
4428 i915_kernel_lost_context(dev); 3677 i915_kernel_lost_context(dev);
4429 i915_gem_cleanup_ringbuffer(dev); 3678 i915_gem_cleanup_ringbuffer(dev);
@@ -4436,108 +3685,36 @@ i915_gem_idle(struct drm_device *dev)
4436 return 0; 3685 return 0;
4437} 3686}
4438 3687
4439/*
4440 * 965+ support PIPE_CONTROL commands, which provide finer grained control
4441 * over cache flushing.
4442 */
4443static int
4444i915_gem_init_pipe_control(struct drm_device *dev)
4445{
4446 drm_i915_private_t *dev_priv = dev->dev_private;
4447 struct drm_gem_object *obj;
4448 struct drm_i915_gem_object *obj_priv;
4449 int ret;
4450
4451 obj = i915_gem_alloc_object(dev, 4096);
4452 if (obj == NULL) {
4453 DRM_ERROR("Failed to allocate seqno page\n");
4454 ret = -ENOMEM;
4455 goto err;
4456 }
4457 obj_priv = to_intel_bo(obj);
4458 obj_priv->agp_type = AGP_USER_CACHED_MEMORY;
4459
4460 ret = i915_gem_object_pin(obj, 4096);
4461 if (ret)
4462 goto err_unref;
4463
4464 dev_priv->seqno_gfx_addr = obj_priv->gtt_offset;
4465 dev_priv->seqno_page = kmap(obj_priv->pages[0]);
4466 if (dev_priv->seqno_page == NULL)
4467 goto err_unpin;
4468
4469 dev_priv->seqno_obj = obj;
4470 memset(dev_priv->seqno_page, 0, PAGE_SIZE);
4471
4472 return 0;
4473
4474err_unpin:
4475 i915_gem_object_unpin(obj);
4476err_unref:
4477 drm_gem_object_unreference(obj);
4478err:
4479 return ret;
4480}
4481
4482
4483static void
4484i915_gem_cleanup_pipe_control(struct drm_device *dev)
4485{
4486 drm_i915_private_t *dev_priv = dev->dev_private;
4487 struct drm_gem_object *obj;
4488 struct drm_i915_gem_object *obj_priv;
4489
4490 obj = dev_priv->seqno_obj;
4491 obj_priv = to_intel_bo(obj);
4492 kunmap(obj_priv->pages[0]);
4493 i915_gem_object_unpin(obj);
4494 drm_gem_object_unreference(obj);
4495 dev_priv->seqno_obj = NULL;
4496
4497 dev_priv->seqno_page = NULL;
4498}
4499
4500int 3688int
4501i915_gem_init_ringbuffer(struct drm_device *dev) 3689i915_gem_init_ringbuffer(struct drm_device *dev)
4502{ 3690{
4503 drm_i915_private_t *dev_priv = dev->dev_private; 3691 drm_i915_private_t *dev_priv = dev->dev_private;
4504 int ret; 3692 int ret;
4505 3693
4506 dev_priv->render_ring = render_ring; 3694 ret = intel_init_render_ring_buffer(dev);
4507
4508 if (!I915_NEED_GFX_HWS(dev)) {
4509 dev_priv->render_ring.status_page.page_addr
4510 = dev_priv->status_page_dmah->vaddr;
4511 memset(dev_priv->render_ring.status_page.page_addr,
4512 0, PAGE_SIZE);
4513 }
4514
4515 if (HAS_PIPE_CONTROL(dev)) {
4516 ret = i915_gem_init_pipe_control(dev);
4517 if (ret)
4518 return ret;
4519 }
4520
4521 ret = intel_init_ring_buffer(dev, &dev_priv->render_ring);
4522 if (ret) 3695 if (ret)
4523 goto cleanup_pipe_control; 3696 return ret;
4524 3697
4525 if (HAS_BSD(dev)) { 3698 if (HAS_BSD(dev)) {
4526 dev_priv->bsd_ring = bsd_ring; 3699 ret = intel_init_bsd_ring_buffer(dev);
4527 ret = intel_init_ring_buffer(dev, &dev_priv->bsd_ring);
4528 if (ret) 3700 if (ret)
4529 goto cleanup_render_ring; 3701 goto cleanup_render_ring;
4530 } 3702 }
4531 3703
3704 if (HAS_BLT(dev)) {
3705 ret = intel_init_blt_ring_buffer(dev);
3706 if (ret)
3707 goto cleanup_bsd_ring;
3708 }
3709
4532 dev_priv->next_seqno = 1; 3710 dev_priv->next_seqno = 1;
4533 3711
4534 return 0; 3712 return 0;
4535 3713
3714cleanup_bsd_ring:
3715 intel_cleanup_ring_buffer(&dev_priv->ring[VCS]);
4536cleanup_render_ring: 3716cleanup_render_ring:
4537 intel_cleanup_ring_buffer(dev, &dev_priv->render_ring); 3717 intel_cleanup_ring_buffer(&dev_priv->ring[RCS]);
4538cleanup_pipe_control:
4539 if (HAS_PIPE_CONTROL(dev))
4540 i915_gem_cleanup_pipe_control(dev);
4541 return ret; 3718 return ret;
4542} 3719}
4543 3720
@@ -4545,12 +3722,10 @@ void
4545i915_gem_cleanup_ringbuffer(struct drm_device *dev) 3722i915_gem_cleanup_ringbuffer(struct drm_device *dev)
4546{ 3723{
4547 drm_i915_private_t *dev_priv = dev->dev_private; 3724 drm_i915_private_t *dev_priv = dev->dev_private;
3725 int i;
4548 3726
4549 intel_cleanup_ring_buffer(dev, &dev_priv->render_ring); 3727 for (i = 0; i < I915_NUM_RINGS; i++)
4550 if (HAS_BSD(dev)) 3728 intel_cleanup_ring_buffer(&dev_priv->ring[i]);
4551 intel_cleanup_ring_buffer(dev, &dev_priv->bsd_ring);
4552 if (HAS_PIPE_CONTROL(dev))
4553 i915_gem_cleanup_pipe_control(dev);
4554} 3729}
4555 3730
4556int 3731int
@@ -4558,7 +3733,7 @@ i915_gem_entervt_ioctl(struct drm_device *dev, void *data,
4558 struct drm_file *file_priv) 3733 struct drm_file *file_priv)
4559{ 3734{
4560 drm_i915_private_t *dev_priv = dev->dev_private; 3735 drm_i915_private_t *dev_priv = dev->dev_private;
4561 int ret; 3736 int ret, i;
4562 3737
4563 if (drm_core_check_feature(dev, DRIVER_MODESET)) 3738 if (drm_core_check_feature(dev, DRIVER_MODESET))
4564 return 0; 3739 return 0;
@@ -4577,15 +3752,13 @@ i915_gem_entervt_ioctl(struct drm_device *dev, void *data,
4577 return ret; 3752 return ret;
4578 } 3753 }
4579 3754
4580 spin_lock(&dev_priv->mm.active_list_lock); 3755 BUG_ON(!list_empty(&dev_priv->mm.active_list));
4581 BUG_ON(!list_empty(&dev_priv->render_ring.active_list));
4582 BUG_ON(HAS_BSD(dev) && !list_empty(&dev_priv->bsd_ring.active_list));
4583 spin_unlock(&dev_priv->mm.active_list_lock);
4584
4585 BUG_ON(!list_empty(&dev_priv->mm.flushing_list)); 3756 BUG_ON(!list_empty(&dev_priv->mm.flushing_list));
4586 BUG_ON(!list_empty(&dev_priv->mm.inactive_list)); 3757 BUG_ON(!list_empty(&dev_priv->mm.inactive_list));
4587 BUG_ON(!list_empty(&dev_priv->render_ring.request_list)); 3758 for (i = 0; i < I915_NUM_RINGS; i++) {
4588 BUG_ON(HAS_BSD(dev) && !list_empty(&dev_priv->bsd_ring.request_list)); 3759 BUG_ON(!list_empty(&dev_priv->ring[i].active_list));
3760 BUG_ON(!list_empty(&dev_priv->ring[i].request_list));
3761 }
4589 mutex_unlock(&dev->struct_mutex); 3762 mutex_unlock(&dev->struct_mutex);
4590 3763
4591 ret = drm_irq_install(dev); 3764 ret = drm_irq_install(dev);
@@ -4627,31 +3800,34 @@ i915_gem_lastclose(struct drm_device *dev)
4627 DRM_ERROR("failed to idle hardware: %d\n", ret); 3800 DRM_ERROR("failed to idle hardware: %d\n", ret);
4628} 3801}
4629 3802
3803static void
3804init_ring_lists(struct intel_ring_buffer *ring)
3805{
3806 INIT_LIST_HEAD(&ring->active_list);
3807 INIT_LIST_HEAD(&ring->request_list);
3808 INIT_LIST_HEAD(&ring->gpu_write_list);
3809}
3810
4630void 3811void
4631i915_gem_load(struct drm_device *dev) 3812i915_gem_load(struct drm_device *dev)
4632{ 3813{
4633 int i; 3814 int i;
4634 drm_i915_private_t *dev_priv = dev->dev_private; 3815 drm_i915_private_t *dev_priv = dev->dev_private;
4635 3816
4636 spin_lock_init(&dev_priv->mm.active_list_lock); 3817 INIT_LIST_HEAD(&dev_priv->mm.active_list);
4637 INIT_LIST_HEAD(&dev_priv->mm.flushing_list); 3818 INIT_LIST_HEAD(&dev_priv->mm.flushing_list);
4638 INIT_LIST_HEAD(&dev_priv->mm.gpu_write_list);
4639 INIT_LIST_HEAD(&dev_priv->mm.inactive_list); 3819 INIT_LIST_HEAD(&dev_priv->mm.inactive_list);
3820 INIT_LIST_HEAD(&dev_priv->mm.pinned_list);
4640 INIT_LIST_HEAD(&dev_priv->mm.fence_list); 3821 INIT_LIST_HEAD(&dev_priv->mm.fence_list);
4641 INIT_LIST_HEAD(&dev_priv->mm.deferred_free_list); 3822 INIT_LIST_HEAD(&dev_priv->mm.deferred_free_list);
4642 INIT_LIST_HEAD(&dev_priv->render_ring.active_list); 3823 INIT_LIST_HEAD(&dev_priv->mm.gtt_list);
4643 INIT_LIST_HEAD(&dev_priv->render_ring.request_list); 3824 for (i = 0; i < I915_NUM_RINGS; i++)
4644 if (HAS_BSD(dev)) { 3825 init_ring_lists(&dev_priv->ring[i]);
4645 INIT_LIST_HEAD(&dev_priv->bsd_ring.active_list);
4646 INIT_LIST_HEAD(&dev_priv->bsd_ring.request_list);
4647 }
4648 for (i = 0; i < 16; i++) 3826 for (i = 0; i < 16; i++)
4649 INIT_LIST_HEAD(&dev_priv->fence_regs[i].lru_list); 3827 INIT_LIST_HEAD(&dev_priv->fence_regs[i].lru_list);
4650 INIT_DELAYED_WORK(&dev_priv->mm.retire_work, 3828 INIT_DELAYED_WORK(&dev_priv->mm.retire_work,
4651 i915_gem_retire_work_handler); 3829 i915_gem_retire_work_handler);
4652 spin_lock(&shrink_list_lock); 3830 init_completion(&dev_priv->error_completion);
4653 list_add(&dev_priv->mm.shrink_list, &shrink_list);
4654 spin_unlock(&shrink_list_lock);
4655 3831
4656 /* On GEN3 we really need to make sure the ARB C3 LP bit is set */ 3832 /* On GEN3 we really need to make sure the ARB C3 LP bit is set */
4657 if (IS_GEN3(dev)) { 3833 if (IS_GEN3(dev)) {
@@ -4663,36 +3839,38 @@ i915_gem_load(struct drm_device *dev)
4663 } 3839 }
4664 } 3840 }
4665 3841
3842 dev_priv->relative_constants_mode = I915_EXEC_CONSTANTS_REL_GENERAL;
3843
4666 /* Old X drivers will take 0-2 for front, back, depth buffers */ 3844 /* Old X drivers will take 0-2 for front, back, depth buffers */
4667 if (!drm_core_check_feature(dev, DRIVER_MODESET)) 3845 if (!drm_core_check_feature(dev, DRIVER_MODESET))
4668 dev_priv->fence_reg_start = 3; 3846 dev_priv->fence_reg_start = 3;
4669 3847
4670 if (IS_I965G(dev) || IS_I945G(dev) || IS_I945GM(dev) || IS_G33(dev)) 3848 if (INTEL_INFO(dev)->gen >= 4 || IS_I945G(dev) || IS_I945GM(dev) || IS_G33(dev))
4671 dev_priv->num_fence_regs = 16; 3849 dev_priv->num_fence_regs = 16;
4672 else 3850 else
4673 dev_priv->num_fence_regs = 8; 3851 dev_priv->num_fence_regs = 8;
4674 3852
4675 /* Initialize fence registers to zero */ 3853 /* Initialize fence registers to zero */
4676 if (IS_I965G(dev)) { 3854 for (i = 0; i < dev_priv->num_fence_regs; i++) {
4677 for (i = 0; i < 16; i++) 3855 i915_gem_clear_fence_reg(dev, &dev_priv->fence_regs[i]);
4678 I915_WRITE64(FENCE_REG_965_0 + (i * 8), 0);
4679 } else {
4680 for (i = 0; i < 8; i++)
4681 I915_WRITE(FENCE_REG_830_0 + (i * 4), 0);
4682 if (IS_I945G(dev) || IS_I945GM(dev) || IS_G33(dev))
4683 for (i = 0; i < 8; i++)
4684 I915_WRITE(FENCE_REG_945_8 + (i * 4), 0);
4685 } 3856 }
3857
4686 i915_gem_detect_bit_6_swizzle(dev); 3858 i915_gem_detect_bit_6_swizzle(dev);
4687 init_waitqueue_head(&dev_priv->pending_flip_queue); 3859 init_waitqueue_head(&dev_priv->pending_flip_queue);
3860
3861 dev_priv->mm.interruptible = true;
3862
3863 dev_priv->mm.inactive_shrinker.shrink = i915_gem_inactive_shrink;
3864 dev_priv->mm.inactive_shrinker.seeks = DEFAULT_SEEKS;
3865 register_shrinker(&dev_priv->mm.inactive_shrinker);
4688} 3866}
4689 3867
4690/* 3868/*
4691 * Create a physically contiguous memory object for this object 3869 * Create a physically contiguous memory object for this object
4692 * e.g. for cursor + overlay regs 3870 * e.g. for cursor + overlay regs
4693 */ 3871 */
4694int i915_gem_init_phys_object(struct drm_device *dev, 3872static int i915_gem_init_phys_object(struct drm_device *dev,
4695 int id, int size, int align) 3873 int id, int size, int align)
4696{ 3874{
4697 drm_i915_private_t *dev_priv = dev->dev_private; 3875 drm_i915_private_t *dev_priv = dev->dev_private;
4698 struct drm_i915_gem_phys_object *phys_obj; 3876 struct drm_i915_gem_phys_object *phys_obj;
@@ -4724,7 +3902,7 @@ kfree_obj:
4724 return ret; 3902 return ret;
4725} 3903}
4726 3904
4727void i915_gem_free_phys_object(struct drm_device *dev, int id) 3905static void i915_gem_free_phys_object(struct drm_device *dev, int id)
4728{ 3906{
4729 drm_i915_private_t *dev_priv = dev->dev_private; 3907 drm_i915_private_t *dev_priv = dev->dev_private;
4730 struct drm_i915_gem_phys_object *phys_obj; 3908 struct drm_i915_gem_phys_object *phys_obj;
@@ -4754,47 +3932,46 @@ void i915_gem_free_all_phys_object(struct drm_device *dev)
4754} 3932}
4755 3933
4756void i915_gem_detach_phys_object(struct drm_device *dev, 3934void i915_gem_detach_phys_object(struct drm_device *dev,
4757 struct drm_gem_object *obj) 3935 struct drm_i915_gem_object *obj)
4758{ 3936{
4759 struct drm_i915_gem_object *obj_priv; 3937 struct address_space *mapping = obj->base.filp->f_path.dentry->d_inode->i_mapping;
3938 char *vaddr;
4760 int i; 3939 int i;
4761 int ret;
4762 int page_count; 3940 int page_count;
4763 3941
4764 obj_priv = to_intel_bo(obj); 3942 if (!obj->phys_obj)
4765 if (!obj_priv->phys_obj)
4766 return; 3943 return;
3944 vaddr = obj->phys_obj->handle->vaddr;
4767 3945
4768 ret = i915_gem_object_get_pages(obj, 0); 3946 page_count = obj->base.size / PAGE_SIZE;
4769 if (ret)
4770 goto out;
4771
4772 page_count = obj->size / PAGE_SIZE;
4773
4774 for (i = 0; i < page_count; i++) { 3947 for (i = 0; i < page_count; i++) {
4775 char *dst = kmap_atomic(obj_priv->pages[i], KM_USER0); 3948 struct page *page = shmem_read_mapping_page(mapping, i);
4776 char *src = obj_priv->phys_obj->handle->vaddr + (i * PAGE_SIZE); 3949 if (!IS_ERR(page)) {
3950 char *dst = kmap_atomic(page);
3951 memcpy(dst, vaddr + i*PAGE_SIZE, PAGE_SIZE);
3952 kunmap_atomic(dst);
4777 3953
4778 memcpy(dst, src, PAGE_SIZE); 3954 drm_clflush_pages(&page, 1);
4779 kunmap_atomic(dst, KM_USER0); 3955
3956 set_page_dirty(page);
3957 mark_page_accessed(page);
3958 page_cache_release(page);
3959 }
4780 } 3960 }
4781 drm_clflush_pages(obj_priv->pages, page_count); 3961 intel_gtt_chipset_flush();
4782 drm_agp_chipset_flush(dev);
4783 3962
4784 i915_gem_object_put_pages(obj); 3963 obj->phys_obj->cur_obj = NULL;
4785out: 3964 obj->phys_obj = NULL;
4786 obj_priv->phys_obj->cur_obj = NULL;
4787 obj_priv->phys_obj = NULL;
4788} 3965}
4789 3966
4790int 3967int
4791i915_gem_attach_phys_object(struct drm_device *dev, 3968i915_gem_attach_phys_object(struct drm_device *dev,
4792 struct drm_gem_object *obj, 3969 struct drm_i915_gem_object *obj,
4793 int id, 3970 int id,
4794 int align) 3971 int align)
4795{ 3972{
3973 struct address_space *mapping = obj->base.filp->f_path.dentry->d_inode->i_mapping;
4796 drm_i915_private_t *dev_priv = dev->dev_private; 3974 drm_i915_private_t *dev_priv = dev->dev_private;
4797 struct drm_i915_gem_object *obj_priv;
4798 int ret = 0; 3975 int ret = 0;
4799 int page_count; 3976 int page_count;
4800 int i; 3977 int i;
@@ -4802,10 +3979,8 @@ i915_gem_attach_phys_object(struct drm_device *dev,
4802 if (id > I915_MAX_PHYS_OBJECT) 3979 if (id > I915_MAX_PHYS_OBJECT)
4803 return -EINVAL; 3980 return -EINVAL;
4804 3981
4805 obj_priv = to_intel_bo(obj); 3982 if (obj->phys_obj) {
4806 3983 if (obj->phys_obj->id == id)
4807 if (obj_priv->phys_obj) {
4808 if (obj_priv->phys_obj->id == id)
4809 return 0; 3984 return 0;
4810 i915_gem_detach_phys_object(dev, obj); 3985 i915_gem_detach_phys_object(dev, obj);
4811 } 3986 }
@@ -4813,74 +3988,86 @@ i915_gem_attach_phys_object(struct drm_device *dev,
4813 /* create a new object */ 3988 /* create a new object */
4814 if (!dev_priv->mm.phys_objs[id - 1]) { 3989 if (!dev_priv->mm.phys_objs[id - 1]) {
4815 ret = i915_gem_init_phys_object(dev, id, 3990 ret = i915_gem_init_phys_object(dev, id,
4816 obj->size, align); 3991 obj->base.size, align);
4817 if (ret) { 3992 if (ret) {
4818 DRM_ERROR("failed to init phys object %d size: %zu\n", id, obj->size); 3993 DRM_ERROR("failed to init phys object %d size: %zu\n",
4819 goto out; 3994 id, obj->base.size);
3995 return ret;
4820 } 3996 }
4821 } 3997 }
4822 3998
4823 /* bind to the object */ 3999 /* bind to the object */
4824 obj_priv->phys_obj = dev_priv->mm.phys_objs[id - 1]; 4000 obj->phys_obj = dev_priv->mm.phys_objs[id - 1];
4825 obj_priv->phys_obj->cur_obj = obj; 4001 obj->phys_obj->cur_obj = obj;
4826
4827 ret = i915_gem_object_get_pages(obj, 0);
4828 if (ret) {
4829 DRM_ERROR("failed to get page list\n");
4830 goto out;
4831 }
4832 4002
4833 page_count = obj->size / PAGE_SIZE; 4003 page_count = obj->base.size / PAGE_SIZE;
4834 4004
4835 for (i = 0; i < page_count; i++) { 4005 for (i = 0; i < page_count; i++) {
4836 char *src = kmap_atomic(obj_priv->pages[i], KM_USER0); 4006 struct page *page;
4837 char *dst = obj_priv->phys_obj->handle->vaddr + (i * PAGE_SIZE); 4007 char *dst, *src;
4838 4008
4009 page = shmem_read_mapping_page(mapping, i);
4010 if (IS_ERR(page))
4011 return PTR_ERR(page);
4012
4013 src = kmap_atomic(page);
4014 dst = obj->phys_obj->handle->vaddr + (i * PAGE_SIZE);
4839 memcpy(dst, src, PAGE_SIZE); 4015 memcpy(dst, src, PAGE_SIZE);
4840 kunmap_atomic(src, KM_USER0); 4016 kunmap_atomic(src);
4841 }
4842 4017
4843 i915_gem_object_put_pages(obj); 4018 mark_page_accessed(page);
4019 page_cache_release(page);
4020 }
4844 4021
4845 return 0; 4022 return 0;
4846out:
4847 return ret;
4848} 4023}
4849 4024
4850static int 4025static int
4851i915_gem_phys_pwrite(struct drm_device *dev, struct drm_gem_object *obj, 4026i915_gem_phys_pwrite(struct drm_device *dev,
4027 struct drm_i915_gem_object *obj,
4852 struct drm_i915_gem_pwrite *args, 4028 struct drm_i915_gem_pwrite *args,
4853 struct drm_file *file_priv) 4029 struct drm_file *file_priv)
4854{ 4030{
4855 struct drm_i915_gem_object *obj_priv = to_intel_bo(obj); 4031 void *vaddr = obj->phys_obj->handle->vaddr + args->offset;
4856 void *obj_addr; 4032 char __user *user_data = (char __user *) (uintptr_t) args->data_ptr;
4857 int ret;
4858 char __user *user_data;
4859 4033
4860 user_data = (char __user *) (uintptr_t) args->data_ptr; 4034 if (__copy_from_user_inatomic_nocache(vaddr, user_data, args->size)) {
4861 obj_addr = obj_priv->phys_obj->handle->vaddr + args->offset; 4035 unsigned long unwritten;
4862 4036
4863 DRM_DEBUG_DRIVER("obj_addr %p, %lld\n", obj_addr, args->size); 4037 /* The physical object once assigned is fixed for the lifetime
4864 ret = copy_from_user(obj_addr, user_data, args->size); 4038 * of the obj, so we can safely drop the lock and continue
4865 if (ret) 4039 * to access vaddr.
4866 return -EFAULT; 4040 */
4041 mutex_unlock(&dev->struct_mutex);
4042 unwritten = copy_from_user(vaddr, user_data, args->size);
4043 mutex_lock(&dev->struct_mutex);
4044 if (unwritten)
4045 return -EFAULT;
4046 }
4867 4047
4868 drm_agp_chipset_flush(dev); 4048 intel_gtt_chipset_flush();
4869 return 0; 4049 return 0;
4870} 4050}
4871 4051
4872void i915_gem_release(struct drm_device * dev, struct drm_file *file_priv) 4052void i915_gem_release(struct drm_device *dev, struct drm_file *file)
4873{ 4053{
4874 struct drm_i915_file_private *i915_file_priv = file_priv->driver_priv; 4054 struct drm_i915_file_private *file_priv = file->driver_priv;
4875 4055
4876 /* Clean up our request list when the client is going away, so that 4056 /* Clean up our request list when the client is going away, so that
4877 * later retire_requests won't dereference our soon-to-be-gone 4057 * later retire_requests won't dereference our soon-to-be-gone
4878 * file_priv. 4058 * file_priv.
4879 */ 4059 */
4880 mutex_lock(&dev->struct_mutex); 4060 spin_lock(&file_priv->mm.lock);
4881 while (!list_empty(&i915_file_priv->mm.request_list)) 4061 while (!list_empty(&file_priv->mm.request_list)) {
4882 list_del_init(i915_file_priv->mm.request_list.next); 4062 struct drm_i915_gem_request *request;
4883 mutex_unlock(&dev->struct_mutex); 4063
4064 request = list_first_entry(&file_priv->mm.request_list,
4065 struct drm_i915_gem_request,
4066 client_list);
4067 list_del(&request->client_list);
4068 request->file_priv = NULL;
4069 }
4070 spin_unlock(&file_priv->mm.lock);
4884} 4071}
4885 4072
4886static int 4073static int
@@ -4889,155 +4076,74 @@ i915_gpu_is_active(struct drm_device *dev)
4889 drm_i915_private_t *dev_priv = dev->dev_private; 4076 drm_i915_private_t *dev_priv = dev->dev_private;
4890 int lists_empty; 4077 int lists_empty;
4891 4078
4892 spin_lock(&dev_priv->mm.active_list_lock);
4893 lists_empty = list_empty(&dev_priv->mm.flushing_list) && 4079 lists_empty = list_empty(&dev_priv->mm.flushing_list) &&
4894 list_empty(&dev_priv->render_ring.active_list); 4080 list_empty(&dev_priv->mm.active_list);
4895 if (HAS_BSD(dev))
4896 lists_empty &= list_empty(&dev_priv->bsd_ring.active_list);
4897 spin_unlock(&dev_priv->mm.active_list_lock);
4898 4081
4899 return !lists_empty; 4082 return !lists_empty;
4900} 4083}
4901 4084
4902static int 4085static int
4903i915_gem_shrink(struct shrinker *shrink, int nr_to_scan, gfp_t gfp_mask) 4086i915_gem_inactive_shrink(struct shrinker *shrinker, struct shrink_control *sc)
4904{ 4087{
4905 drm_i915_private_t *dev_priv, *next_dev; 4088 struct drm_i915_private *dev_priv =
4906 struct drm_i915_gem_object *obj_priv, *next_obj; 4089 container_of(shrinker,
4907 int cnt = 0; 4090 struct drm_i915_private,
4908 int would_deadlock = 1; 4091 mm.inactive_shrinker);
4092 struct drm_device *dev = dev_priv->dev;
4093 struct drm_i915_gem_object *obj, *next;
4094 int nr_to_scan = sc->nr_to_scan;
4095 int cnt;
4096
4097 if (!mutex_trylock(&dev->struct_mutex))
4098 return 0;
4909 4099
4910 /* "fast-path" to count number of available objects */ 4100 /* "fast-path" to count number of available objects */
4911 if (nr_to_scan == 0) { 4101 if (nr_to_scan == 0) {
4912 spin_lock(&shrink_list_lock); 4102 cnt = 0;
4913 list_for_each_entry(dev_priv, &shrink_list, mm.shrink_list) { 4103 list_for_each_entry(obj,
4914 struct drm_device *dev = dev_priv->dev; 4104 &dev_priv->mm.inactive_list,
4915 4105 mm_list)
4916 if (mutex_trylock(&dev->struct_mutex)) { 4106 cnt++;
4917 list_for_each_entry(obj_priv, 4107 mutex_unlock(&dev->struct_mutex);
4918 &dev_priv->mm.inactive_list, 4108 return cnt / 100 * sysctl_vfs_cache_pressure;
4919 list)
4920 cnt++;
4921 mutex_unlock(&dev->struct_mutex);
4922 }
4923 }
4924 spin_unlock(&shrink_list_lock);
4925
4926 return (cnt / 100) * sysctl_vfs_cache_pressure;
4927 } 4109 }
4928 4110
4929 spin_lock(&shrink_list_lock);
4930
4931rescan: 4111rescan:
4932 /* first scan for clean buffers */ 4112 /* first scan for clean buffers */
4933 list_for_each_entry_safe(dev_priv, next_dev, 4113 i915_gem_retire_requests(dev);
4934 &shrink_list, mm.shrink_list) {
4935 struct drm_device *dev = dev_priv->dev;
4936
4937 if (! mutex_trylock(&dev->struct_mutex))
4938 continue;
4939
4940 spin_unlock(&shrink_list_lock);
4941 i915_gem_retire_requests(dev);
4942 4114
4943 list_for_each_entry_safe(obj_priv, next_obj, 4115 list_for_each_entry_safe(obj, next,
4944 &dev_priv->mm.inactive_list, 4116 &dev_priv->mm.inactive_list,
4945 list) { 4117 mm_list) {
4946 if (i915_gem_object_is_purgeable(obj_priv)) { 4118 if (i915_gem_object_is_purgeable(obj)) {
4947 i915_gem_object_unbind(&obj_priv->base); 4119 if (i915_gem_object_unbind(obj) == 0 &&
4948 if (--nr_to_scan <= 0) 4120 --nr_to_scan == 0)
4949 break; 4121 break;
4950 }
4951 } 4122 }
4952
4953 spin_lock(&shrink_list_lock);
4954 mutex_unlock(&dev->struct_mutex);
4955
4956 would_deadlock = 0;
4957
4958 if (nr_to_scan <= 0)
4959 break;
4960 } 4123 }
4961 4124
4962 /* second pass, evict/count anything still on the inactive list */ 4125 /* second pass, evict/count anything still on the inactive list */
4963 list_for_each_entry_safe(dev_priv, next_dev, 4126 cnt = 0;
4964 &shrink_list, mm.shrink_list) { 4127 list_for_each_entry_safe(obj, next,
4965 struct drm_device *dev = dev_priv->dev; 4128 &dev_priv->mm.inactive_list,
4966 4129 mm_list) {
4967 if (! mutex_trylock(&dev->struct_mutex)) 4130 if (nr_to_scan &&
4968 continue; 4131 i915_gem_object_unbind(obj) == 0)
4969 4132 nr_to_scan--;
4970 spin_unlock(&shrink_list_lock); 4133 else
4971 4134 cnt++;
4972 list_for_each_entry_safe(obj_priv, next_obj,
4973 &dev_priv->mm.inactive_list,
4974 list) {
4975 if (nr_to_scan > 0) {
4976 i915_gem_object_unbind(&obj_priv->base);
4977 nr_to_scan--;
4978 } else
4979 cnt++;
4980 }
4981
4982 spin_lock(&shrink_list_lock);
4983 mutex_unlock(&dev->struct_mutex);
4984
4985 would_deadlock = 0;
4986 } 4135 }
4987 4136
4988 if (nr_to_scan) { 4137 if (nr_to_scan && i915_gpu_is_active(dev)) {
4989 int active = 0;
4990
4991 /* 4138 /*
4992 * We are desperate for pages, so as a last resort, wait 4139 * We are desperate for pages, so as a last resort, wait
4993 * for the GPU to finish and discard whatever we can. 4140 * for the GPU to finish and discard whatever we can.
4994 * This has a dramatic impact to reduce the number of 4141 * This has a dramatic impact to reduce the number of
4995 * OOM-killer events whilst running the GPU aggressively. 4142 * OOM-killer events whilst running the GPU aggressively.
4996 */ 4143 */
4997 list_for_each_entry(dev_priv, &shrink_list, mm.shrink_list) { 4144 if (i915_gpu_idle(dev) == 0)
4998 struct drm_device *dev = dev_priv->dev;
4999
5000 if (!mutex_trylock(&dev->struct_mutex))
5001 continue;
5002
5003 spin_unlock(&shrink_list_lock);
5004
5005 if (i915_gpu_is_active(dev)) {
5006 i915_gpu_idle(dev);
5007 active++;
5008 }
5009
5010 spin_lock(&shrink_list_lock);
5011 mutex_unlock(&dev->struct_mutex);
5012 }
5013
5014 if (active)
5015 goto rescan; 4145 goto rescan;
5016 } 4146 }
5017 4147 mutex_unlock(&dev->struct_mutex);
5018 spin_unlock(&shrink_list_lock); 4148 return cnt / 100 * sysctl_vfs_cache_pressure;
5019
5020 if (would_deadlock)
5021 return -1;
5022 else if (cnt > 0)
5023 return (cnt / 100) * sysctl_vfs_cache_pressure;
5024 else
5025 return 0;
5026}
5027
5028static struct shrinker shrinker = {
5029 .shrink = i915_gem_shrink,
5030 .seeks = DEFAULT_SEEKS,
5031};
5032
5033__init void
5034i915_gem_shrinker_init(void)
5035{
5036 register_shrinker(&shrinker);
5037}
5038
5039__exit void
5040i915_gem_shrinker_exit(void)
5041{
5042 unregister_shrinker(&shrinker);
5043} 4149}
diff --git a/drivers/gpu/drm/i915/i915_gem_debug.c b/drivers/gpu/drm/i915/i915_gem_debug.c
index 80f380b1d951..8da1899bd24f 100644
--- a/drivers/gpu/drm/i915/i915_gem_debug.c
+++ b/drivers/gpu/drm/i915/i915_gem_debug.c
@@ -30,125 +30,125 @@
30#include "i915_drm.h" 30#include "i915_drm.h"
31#include "i915_drv.h" 31#include "i915_drv.h"
32 32
33#if WATCH_INACTIVE 33#if WATCH_LISTS
34void 34int
35i915_verify_inactive(struct drm_device *dev, char *file, int line) 35i915_verify_lists(struct drm_device *dev)
36{ 36{
37 static int warned;
37 drm_i915_private_t *dev_priv = dev->dev_private; 38 drm_i915_private_t *dev_priv = dev->dev_private;
38 struct drm_gem_object *obj; 39 struct drm_i915_gem_object *obj;
39 struct drm_i915_gem_object *obj_priv; 40 int err = 0;
40 41
41 list_for_each_entry(obj_priv, &dev_priv->mm.inactive_list, list) { 42 if (warned)
42 obj = &obj_priv->base; 43 return 0;
43 if (obj_priv->pin_count || obj_priv->active || 44
44 (obj->write_domain & ~(I915_GEM_DOMAIN_CPU | 45 list_for_each_entry(obj, &dev_priv->render_ring.active_list, list) {
45 I915_GEM_DOMAIN_GTT))) 46 if (obj->base.dev != dev ||
46 DRM_ERROR("inactive %p (p %d a %d w %x) %s:%d\n", 47 !atomic_read(&obj->base.refcount.refcount)) {
48 DRM_ERROR("freed render active %p\n", obj);
49 err++;
50 break;
51 } else if (!obj->active ||
52 (obj->base.read_domains & I915_GEM_GPU_DOMAINS) == 0) {
53 DRM_ERROR("invalid render active %p (a %d r %x)\n",
54 obj,
55 obj->active,
56 obj->base.read_domains);
57 err++;
58 } else if (obj->base.write_domain && list_empty(&obj->gpu_write_list)) {
59 DRM_ERROR("invalid render active %p (w %x, gwl %d)\n",
47 obj, 60 obj,
48 obj_priv->pin_count, obj_priv->active, 61 obj->base.write_domain,
49 obj->write_domain, file, line); 62 !list_empty(&obj->gpu_write_list));
63 err++;
64 }
50 } 65 }
51}
52#endif /* WATCH_INACTIVE */
53
54
55#if WATCH_BUF | WATCH_EXEC | WATCH_PWRITE
56static void
57i915_gem_dump_page(struct page *page, uint32_t start, uint32_t end,
58 uint32_t bias, uint32_t mark)
59{
60 uint32_t *mem = kmap_atomic(page, KM_USER0);
61 int i;
62 for (i = start; i < end; i += 4)
63 DRM_INFO("%08x: %08x%s\n",
64 (int) (bias + i), mem[i / 4],
65 (bias + i == mark) ? " ********" : "");
66 kunmap_atomic(mem, KM_USER0);
67 /* give syslog time to catch up */
68 msleep(1);
69}
70
71void
72i915_gem_dump_object(struct drm_gem_object *obj, int len,
73 const char *where, uint32_t mark)
74{
75 struct drm_i915_gem_object *obj_priv = to_intel_bo(obj);
76 int page;
77 66
78 DRM_INFO("%s: object at offset %08x\n", where, obj_priv->gtt_offset); 67 list_for_each_entry(obj, &dev_priv->mm.flushing_list, list) {
79 for (page = 0; page < (len + PAGE_SIZE-1) / PAGE_SIZE; page++) { 68 if (obj->base.dev != dev ||
80 int page_len, chunk, chunk_len; 69 !atomic_read(&obj->base.refcount.refcount)) {
81 70 DRM_ERROR("freed flushing %p\n", obj);
82 page_len = len - page * PAGE_SIZE; 71 err++;
83 if (page_len > PAGE_SIZE) 72 break;
84 page_len = PAGE_SIZE; 73 } else if (!obj->active ||
85 74 (obj->base.write_domain & I915_GEM_GPU_DOMAINS) == 0 ||
86 for (chunk = 0; chunk < page_len; chunk += 128) { 75 list_empty(&obj->gpu_write_list)){
87 chunk_len = page_len - chunk; 76 DRM_ERROR("invalid flushing %p (a %d w %x gwl %d)\n",
88 if (chunk_len > 128) 77 obj,
89 chunk_len = 128; 78 obj->active,
90 i915_gem_dump_page(obj_priv->pages[page], 79 obj->base.write_domain,
91 chunk, chunk + chunk_len, 80 !list_empty(&obj->gpu_write_list));
92 obj_priv->gtt_offset + 81 err++;
93 page * PAGE_SIZE,
94 mark);
95 } 82 }
96 } 83 }
97}
98#endif
99 84
100#if WATCH_LRU 85 list_for_each_entry(obj, &dev_priv->mm.gpu_write_list, gpu_write_list) {
101void 86 if (obj->base.dev != dev ||
102i915_dump_lru(struct drm_device *dev, const char *where) 87 !atomic_read(&obj->base.refcount.refcount)) {
103{ 88 DRM_ERROR("freed gpu write %p\n", obj);
104 drm_i915_private_t *dev_priv = dev->dev_private; 89 err++;
105 struct drm_i915_gem_object *obj_priv; 90 break;
106 91 } else if (!obj->active ||
107 DRM_INFO("active list %s {\n", where); 92 (obj->base.write_domain & I915_GEM_GPU_DOMAINS) == 0) {
108 spin_lock(&dev_priv->mm.active_list_lock); 93 DRM_ERROR("invalid gpu write %p (a %d w %x)\n",
109 list_for_each_entry(obj_priv, &dev_priv->mm.active_list, 94 obj,
110 list) 95 obj->active,
111 { 96 obj->base.write_domain);
112 DRM_INFO(" %p: %08x\n", obj_priv, 97 err++;
113 obj_priv->last_rendering_seqno); 98 }
114 } 99 }
115 spin_unlock(&dev_priv->mm.active_list_lock); 100
116 DRM_INFO("}\n"); 101 list_for_each_entry(obj, &dev_priv->mm.inactive_list, list) {
117 DRM_INFO("flushing list %s {\n", where); 102 if (obj->base.dev != dev ||
118 list_for_each_entry(obj_priv, &dev_priv->mm.flushing_list, 103 !atomic_read(&obj->base.refcount.refcount)) {
119 list) 104 DRM_ERROR("freed inactive %p\n", obj);
120 { 105 err++;
121 DRM_INFO(" %p: %08x\n", obj_priv, 106 break;
122 obj_priv->last_rendering_seqno); 107 } else if (obj->pin_count || obj->active ||
108 (obj->base.write_domain & I915_GEM_GPU_DOMAINS)) {
109 DRM_ERROR("invalid inactive %p (p %d a %d w %x)\n",
110 obj,
111 obj->pin_count, obj->active,
112 obj->base.write_domain);
113 err++;
114 }
123 } 115 }
124 DRM_INFO("}\n"); 116
125 DRM_INFO("inactive %s {\n", where); 117 list_for_each_entry(obj, &dev_priv->mm.pinned_list, list) {
126 list_for_each_entry(obj_priv, &dev_priv->mm.inactive_list, list) { 118 if (obj->base.dev != dev ||
127 DRM_INFO(" %p: %08x\n", obj_priv, 119 !atomic_read(&obj->base.refcount.refcount)) {
128 obj_priv->last_rendering_seqno); 120 DRM_ERROR("freed pinned %p\n", obj);
121 err++;
122 break;
123 } else if (!obj->pin_count || obj->active ||
124 (obj->base.write_domain & I915_GEM_GPU_DOMAINS)) {
125 DRM_ERROR("invalid pinned %p (p %d a %d w %x)\n",
126 obj,
127 obj->pin_count, obj->active,
128 obj->base.write_domain);
129 err++;
130 }
129 } 131 }
130 DRM_INFO("}\n");
131}
132#endif
133 132
133 return warned = err;
134}
135#endif /* WATCH_INACTIVE */
134 136
135#if WATCH_COHERENCY 137#if WATCH_COHERENCY
136void 138void
137i915_gem_object_check_coherency(struct drm_gem_object *obj, int handle) 139i915_gem_object_check_coherency(struct drm_i915_gem_object *obj, int handle)
138{ 140{
139 struct drm_device *dev = obj->dev; 141 struct drm_device *dev = obj->base.dev;
140 struct drm_i915_gem_object *obj_priv = to_intel_bo(obj);
141 int page; 142 int page;
142 uint32_t *gtt_mapping; 143 uint32_t *gtt_mapping;
143 uint32_t *backing_map = NULL; 144 uint32_t *backing_map = NULL;
144 int bad_count = 0; 145 int bad_count = 0;
145 146
146 DRM_INFO("%s: checking coherency of object %p@0x%08x (%d, %zdkb):\n", 147 DRM_INFO("%s: checking coherency of object %p@0x%08x (%d, %zdkb):\n",
147 __func__, obj, obj_priv->gtt_offset, handle, 148 __func__, obj, obj->gtt_offset, handle,
148 obj->size / 1024); 149 obj->size / 1024);
149 150
150 gtt_mapping = ioremap(dev->agp->base + obj_priv->gtt_offset, 151 gtt_mapping = ioremap(dev->agp->base + obj->gtt_offset, obj->base.size);
151 obj->size);
152 if (gtt_mapping == NULL) { 152 if (gtt_mapping == NULL) {
153 DRM_ERROR("failed to map GTT space\n"); 153 DRM_ERROR("failed to map GTT space\n");
154 return; 154 return;
@@ -157,7 +157,7 @@ i915_gem_object_check_coherency(struct drm_gem_object *obj, int handle)
157 for (page = 0; page < obj->size / PAGE_SIZE; page++) { 157 for (page = 0; page < obj->size / PAGE_SIZE; page++) {
158 int i; 158 int i;
159 159
160 backing_map = kmap_atomic(obj_priv->pages[page], KM_USER0); 160 backing_map = kmap_atomic(obj->pages[page], KM_USER0);
161 161
162 if (backing_map == NULL) { 162 if (backing_map == NULL) {
163 DRM_ERROR("failed to map backing page\n"); 163 DRM_ERROR("failed to map backing page\n");
@@ -172,7 +172,7 @@ i915_gem_object_check_coherency(struct drm_gem_object *obj, int handle)
172 if (cpuval != gttval) { 172 if (cpuval != gttval) {
173 DRM_INFO("incoherent CPU vs GPU at 0x%08x: " 173 DRM_INFO("incoherent CPU vs GPU at 0x%08x: "
174 "0x%08x vs 0x%08x\n", 174 "0x%08x vs 0x%08x\n",
175 (int)(obj_priv->gtt_offset + 175 (int)(obj->gtt_offset +
176 page * PAGE_SIZE + i * 4), 176 page * PAGE_SIZE + i * 4),
177 cpuval, gttval); 177 cpuval, gttval);
178 if (bad_count++ >= 8) { 178 if (bad_count++ >= 8) {
diff --git a/drivers/gpu/drm/i915/i915_gem_evict.c b/drivers/gpu/drm/i915/i915_gem_evict.c
index 5c428fa3e0b3..da05a2692a75 100644
--- a/drivers/gpu/drm/i915/i915_gem_evict.c
+++ b/drivers/gpu/drm/i915/i915_gem_evict.c
@@ -30,79 +30,41 @@
30#include "drm.h" 30#include "drm.h"
31#include "i915_drv.h" 31#include "i915_drv.h"
32#include "i915_drm.h" 32#include "i915_drm.h"
33 33#include "i915_trace.h"
34static struct drm_i915_gem_object *
35i915_gem_next_active_object(struct drm_device *dev,
36 struct list_head **render_iter,
37 struct list_head **bsd_iter)
38{
39 drm_i915_private_t *dev_priv = dev->dev_private;
40 struct drm_i915_gem_object *render_obj = NULL, *bsd_obj = NULL;
41
42 if (*render_iter != &dev_priv->render_ring.active_list)
43 render_obj = list_entry(*render_iter,
44 struct drm_i915_gem_object,
45 list);
46
47 if (HAS_BSD(dev)) {
48 if (*bsd_iter != &dev_priv->bsd_ring.active_list)
49 bsd_obj = list_entry(*bsd_iter,
50 struct drm_i915_gem_object,
51 list);
52
53 if (render_obj == NULL) {
54 *bsd_iter = (*bsd_iter)->next;
55 return bsd_obj;
56 }
57
58 if (bsd_obj == NULL) {
59 *render_iter = (*render_iter)->next;
60 return render_obj;
61 }
62
63 /* XXX can we handle seqno wrapping? */
64 if (render_obj->last_rendering_seqno < bsd_obj->last_rendering_seqno) {
65 *render_iter = (*render_iter)->next;
66 return render_obj;
67 } else {
68 *bsd_iter = (*bsd_iter)->next;
69 return bsd_obj;
70 }
71 } else {
72 *render_iter = (*render_iter)->next;
73 return render_obj;
74 }
75}
76 34
77static bool 35static bool
78mark_free(struct drm_i915_gem_object *obj_priv, 36mark_free(struct drm_i915_gem_object *obj, struct list_head *unwind)
79 struct list_head *unwind)
80{ 37{
81 list_add(&obj_priv->evict_list, unwind); 38 list_add(&obj->exec_list, unwind);
82 drm_gem_object_reference(&obj_priv->base); 39 drm_gem_object_reference(&obj->base);
83 return drm_mm_scan_add_block(obj_priv->gtt_space); 40 return drm_mm_scan_add_block(obj->gtt_space);
84} 41}
85 42
86#define i915_for_each_active_object(OBJ, R, B) \
87 *(R) = dev_priv->render_ring.active_list.next; \
88 *(B) = dev_priv->bsd_ring.active_list.next; \
89 while (((OBJ) = i915_gem_next_active_object(dev, (R), (B))) != NULL)
90
91int 43int
92i915_gem_evict_something(struct drm_device *dev, int min_size, unsigned alignment) 44i915_gem_evict_something(struct drm_device *dev, int min_size,
45 unsigned alignment, bool mappable)
93{ 46{
94 drm_i915_private_t *dev_priv = dev->dev_private; 47 drm_i915_private_t *dev_priv = dev->dev_private;
95 struct list_head eviction_list, unwind_list; 48 struct list_head eviction_list, unwind_list;
96 struct drm_i915_gem_object *obj_priv; 49 struct drm_i915_gem_object *obj;
97 struct list_head *render_iter, *bsd_iter;
98 int ret = 0; 50 int ret = 0;
99 51
100 i915_gem_retire_requests(dev); 52 i915_gem_retire_requests(dev);
101 53
102 /* Re-check for free space after retiring requests */ 54 /* Re-check for free space after retiring requests */
103 if (drm_mm_search_free(&dev_priv->mm.gtt_space, 55 if (mappable) {
104 min_size, alignment, 0)) 56 if (drm_mm_search_free_in_range(&dev_priv->mm.gtt_space,
105 return 0; 57 min_size, alignment, 0,
58 dev_priv->mm.gtt_mappable_end,
59 0))
60 return 0;
61 } else {
62 if (drm_mm_search_free(&dev_priv->mm.gtt_space,
63 min_size, alignment, 0))
64 return 0;
65 }
66
67 trace_i915_gem_evict(dev, min_size, alignment, mappable);
106 68
107 /* 69 /*
108 * The goal is to evict objects and amalgamate space in LRU order. 70 * The goal is to evict objects and amalgamate space in LRU order.
@@ -128,45 +90,56 @@ i915_gem_evict_something(struct drm_device *dev, int min_size, unsigned alignmen
128 */ 90 */
129 91
130 INIT_LIST_HEAD(&unwind_list); 92 INIT_LIST_HEAD(&unwind_list);
131 drm_mm_init_scan(&dev_priv->mm.gtt_space, min_size, alignment); 93 if (mappable)
94 drm_mm_init_scan_with_range(&dev_priv->mm.gtt_space, min_size,
95 alignment, 0,
96 dev_priv->mm.gtt_mappable_end);
97 else
98 drm_mm_init_scan(&dev_priv->mm.gtt_space, min_size, alignment);
132 99
133 /* First see if there is a large enough contiguous idle region... */ 100 /* First see if there is a large enough contiguous idle region... */
134 list_for_each_entry(obj_priv, &dev_priv->mm.inactive_list, list) { 101 list_for_each_entry(obj, &dev_priv->mm.inactive_list, mm_list) {
135 if (mark_free(obj_priv, &unwind_list)) 102 if (mark_free(obj, &unwind_list))
136 goto found; 103 goto found;
137 } 104 }
138 105
139 /* Now merge in the soon-to-be-expired objects... */ 106 /* Now merge in the soon-to-be-expired objects... */
140 i915_for_each_active_object(obj_priv, &render_iter, &bsd_iter) { 107 list_for_each_entry(obj, &dev_priv->mm.active_list, mm_list) {
141 /* Does the object require an outstanding flush? */ 108 /* Does the object require an outstanding flush? */
142 if (obj_priv->base.write_domain || obj_priv->pin_count) 109 if (obj->base.write_domain || obj->pin_count)
143 continue; 110 continue;
144 111
145 if (mark_free(obj_priv, &unwind_list)) 112 if (mark_free(obj, &unwind_list))
146 goto found; 113 goto found;
147 } 114 }
148 115
149 /* Finally add anything with a pending flush (in order of retirement) */ 116 /* Finally add anything with a pending flush (in order of retirement) */
150 list_for_each_entry(obj_priv, &dev_priv->mm.flushing_list, list) { 117 list_for_each_entry(obj, &dev_priv->mm.flushing_list, mm_list) {
151 if (obj_priv->pin_count) 118 if (obj->pin_count)
152 continue; 119 continue;
153 120
154 if (mark_free(obj_priv, &unwind_list)) 121 if (mark_free(obj, &unwind_list))
155 goto found; 122 goto found;
156 } 123 }
157 i915_for_each_active_object(obj_priv, &render_iter, &bsd_iter) { 124 list_for_each_entry(obj, &dev_priv->mm.active_list, mm_list) {
158 if (! obj_priv->base.write_domain || obj_priv->pin_count) 125 if (! obj->base.write_domain || obj->pin_count)
159 continue; 126 continue;
160 127
161 if (mark_free(obj_priv, &unwind_list)) 128 if (mark_free(obj, &unwind_list))
162 goto found; 129 goto found;
163 } 130 }
164 131
165 /* Nothing found, clean up and bail out! */ 132 /* Nothing found, clean up and bail out! */
166 list_for_each_entry(obj_priv, &unwind_list, evict_list) { 133 while (!list_empty(&unwind_list)) {
167 ret = drm_mm_scan_remove_block(obj_priv->gtt_space); 134 obj = list_first_entry(&unwind_list,
135 struct drm_i915_gem_object,
136 exec_list);
137
138 ret = drm_mm_scan_remove_block(obj->gtt_space);
168 BUG_ON(ret); 139 BUG_ON(ret);
169 drm_gem_object_unreference(&obj_priv->base); 140
141 list_del_init(&obj->exec_list);
142 drm_gem_object_unreference(&obj->base);
170 } 143 }
171 144
172 /* We expect the caller to unpin, evict all and try again, or give up. 145 /* We expect the caller to unpin, evict all and try again, or give up.
@@ -180,49 +153,47 @@ found:
180 * temporary list. */ 153 * temporary list. */
181 INIT_LIST_HEAD(&eviction_list); 154 INIT_LIST_HEAD(&eviction_list);
182 while (!list_empty(&unwind_list)) { 155 while (!list_empty(&unwind_list)) {
183 obj_priv = list_first_entry(&unwind_list, 156 obj = list_first_entry(&unwind_list,
184 struct drm_i915_gem_object, 157 struct drm_i915_gem_object,
185 evict_list); 158 exec_list);
186 if (drm_mm_scan_remove_block(obj_priv->gtt_space)) { 159 if (drm_mm_scan_remove_block(obj->gtt_space)) {
187 list_move(&obj_priv->evict_list, &eviction_list); 160 list_move(&obj->exec_list, &eviction_list);
188 continue; 161 continue;
189 } 162 }
190 list_del(&obj_priv->evict_list); 163 list_del_init(&obj->exec_list);
191 drm_gem_object_unreference(&obj_priv->base); 164 drm_gem_object_unreference(&obj->base);
192 } 165 }
193 166
194 /* Unbinding will emit any required flushes */ 167 /* Unbinding will emit any required flushes */
195 while (!list_empty(&eviction_list)) { 168 while (!list_empty(&eviction_list)) {
196 obj_priv = list_first_entry(&eviction_list, 169 obj = list_first_entry(&eviction_list,
197 struct drm_i915_gem_object, 170 struct drm_i915_gem_object,
198 evict_list); 171 exec_list);
199 if (ret == 0) 172 if (ret == 0)
200 ret = i915_gem_object_unbind(&obj_priv->base); 173 ret = i915_gem_object_unbind(obj);
201 list_del(&obj_priv->evict_list); 174
202 drm_gem_object_unreference(&obj_priv->base); 175 list_del_init(&obj->exec_list);
176 drm_gem_object_unreference(&obj->base);
203 } 177 }
204 178
205 return ret; 179 return ret;
206} 180}
207 181
208int 182int
209i915_gem_evict_everything(struct drm_device *dev) 183i915_gem_evict_everything(struct drm_device *dev, bool purgeable_only)
210{ 184{
211 drm_i915_private_t *dev_priv = dev->dev_private; 185 drm_i915_private_t *dev_priv = dev->dev_private;
212 int ret; 186 int ret;
213 bool lists_empty; 187 bool lists_empty;
214 188
215 spin_lock(&dev_priv->mm.active_list_lock);
216 lists_empty = (list_empty(&dev_priv->mm.inactive_list) && 189 lists_empty = (list_empty(&dev_priv->mm.inactive_list) &&
217 list_empty(&dev_priv->mm.flushing_list) && 190 list_empty(&dev_priv->mm.flushing_list) &&
218 list_empty(&dev_priv->render_ring.active_list) && 191 list_empty(&dev_priv->mm.active_list));
219 (!HAS_BSD(dev)
220 || list_empty(&dev_priv->bsd_ring.active_list)));
221 spin_unlock(&dev_priv->mm.active_list_lock);
222
223 if (lists_empty) 192 if (lists_empty)
224 return -ENOSPC; 193 return -ENOSPC;
225 194
195 trace_i915_gem_evict_everything(dev, purgeable_only);
196
226 /* Flush everything (on to the inactive lists) and evict */ 197 /* Flush everything (on to the inactive lists) and evict */
227 ret = i915_gpu_idle(dev); 198 ret = i915_gpu_idle(dev);
228 if (ret) 199 if (ret)
@@ -230,40 +201,22 @@ i915_gem_evict_everything(struct drm_device *dev)
230 201
231 BUG_ON(!list_empty(&dev_priv->mm.flushing_list)); 202 BUG_ON(!list_empty(&dev_priv->mm.flushing_list));
232 203
233 ret = i915_gem_evict_inactive(dev); 204 return i915_gem_evict_inactive(dev, purgeable_only);
234 if (ret)
235 return ret;
236
237 spin_lock(&dev_priv->mm.active_list_lock);
238 lists_empty = (list_empty(&dev_priv->mm.inactive_list) &&
239 list_empty(&dev_priv->mm.flushing_list) &&
240 list_empty(&dev_priv->render_ring.active_list) &&
241 (!HAS_BSD(dev)
242 || list_empty(&dev_priv->bsd_ring.active_list)));
243 spin_unlock(&dev_priv->mm.active_list_lock);
244 BUG_ON(!lists_empty);
245
246 return 0;
247} 205}
248 206
249/** Unbinds all inactive objects. */ 207/** Unbinds all inactive objects. */
250int 208int
251i915_gem_evict_inactive(struct drm_device *dev) 209i915_gem_evict_inactive(struct drm_device *dev, bool purgeable_only)
252{ 210{
253 drm_i915_private_t *dev_priv = dev->dev_private; 211 drm_i915_private_t *dev_priv = dev->dev_private;
254 212 struct drm_i915_gem_object *obj, *next;
255 while (!list_empty(&dev_priv->mm.inactive_list)) { 213
256 struct drm_gem_object *obj; 214 list_for_each_entry_safe(obj, next,
257 int ret; 215 &dev_priv->mm.inactive_list, mm_list) {
258 216 if (!purgeable_only || obj->madv != I915_MADV_WILLNEED) {
259 obj = &list_first_entry(&dev_priv->mm.inactive_list, 217 int ret = i915_gem_object_unbind(obj);
260 struct drm_i915_gem_object, 218 if (ret)
261 list)->base; 219 return ret;
262
263 ret = i915_gem_object_unbind(obj);
264 if (ret != 0) {
265 DRM_ERROR("Error unbinding object: %d\n", ret);
266 return ret;
267 } 220 }
268 } 221 }
269 222
diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
new file mode 100644
index 000000000000..4934cf84c320
--- /dev/null
+++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
@@ -0,0 +1,1342 @@
1/*
2 * Copyright © 2008,2010 Intel Corporation
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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21 * IN THE SOFTWARE.
22 *
23 * Authors:
24 * Eric Anholt <eric@anholt.net>
25 * Chris Wilson <chris@chris-wilson.co.uk>
26 *
27 */
28
29#include "drmP.h"
30#include "drm.h"
31#include "i915_drm.h"
32#include "i915_drv.h"
33#include "i915_trace.h"
34#include "intel_drv.h"
35
36struct change_domains {
37 uint32_t invalidate_domains;
38 uint32_t flush_domains;
39 uint32_t flush_rings;
40 uint32_t flips;
41};
42
43/*
44 * Set the next domain for the specified object. This
45 * may not actually perform the necessary flushing/invaliding though,
46 * as that may want to be batched with other set_domain operations
47 *
48 * This is (we hope) the only really tricky part of gem. The goal
49 * is fairly simple -- track which caches hold bits of the object
50 * and make sure they remain coherent. A few concrete examples may
51 * help to explain how it works. For shorthand, we use the notation
52 * (read_domains, write_domain), e.g. (CPU, CPU) to indicate the
53 * a pair of read and write domain masks.
54 *
55 * Case 1: the batch buffer
56 *
57 * 1. Allocated
58 * 2. Written by CPU
59 * 3. Mapped to GTT
60 * 4. Read by GPU
61 * 5. Unmapped from GTT
62 * 6. Freed
63 *
64 * Let's take these a step at a time
65 *
66 * 1. Allocated
67 * Pages allocated from the kernel may still have
68 * cache contents, so we set them to (CPU, CPU) always.
69 * 2. Written by CPU (using pwrite)
70 * The pwrite function calls set_domain (CPU, CPU) and
71 * this function does nothing (as nothing changes)
72 * 3. Mapped by GTT
73 * This function asserts that the object is not
74 * currently in any GPU-based read or write domains
75 * 4. Read by GPU
76 * i915_gem_execbuffer calls set_domain (COMMAND, 0).
77 * As write_domain is zero, this function adds in the
78 * current read domains (CPU+COMMAND, 0).
79 * flush_domains is set to CPU.
80 * invalidate_domains is set to COMMAND
81 * clflush is run to get data out of the CPU caches
82 * then i915_dev_set_domain calls i915_gem_flush to
83 * emit an MI_FLUSH and drm_agp_chipset_flush
84 * 5. Unmapped from GTT
85 * i915_gem_object_unbind calls set_domain (CPU, CPU)
86 * flush_domains and invalidate_domains end up both zero
87 * so no flushing/invalidating happens
88 * 6. Freed
89 * yay, done
90 *
91 * Case 2: The shared render buffer
92 *
93 * 1. Allocated
94 * 2. Mapped to GTT
95 * 3. Read/written by GPU
96 * 4. set_domain to (CPU,CPU)
97 * 5. Read/written by CPU
98 * 6. Read/written by GPU
99 *
100 * 1. Allocated
101 * Same as last example, (CPU, CPU)
102 * 2. Mapped to GTT
103 * Nothing changes (assertions find that it is not in the GPU)
104 * 3. Read/written by GPU
105 * execbuffer calls set_domain (RENDER, RENDER)
106 * flush_domains gets CPU
107 * invalidate_domains gets GPU
108 * clflush (obj)
109 * MI_FLUSH and drm_agp_chipset_flush
110 * 4. set_domain (CPU, CPU)
111 * flush_domains gets GPU
112 * invalidate_domains gets CPU
113 * wait_rendering (obj) to make sure all drawing is complete.
114 * This will include an MI_FLUSH to get the data from GPU
115 * to memory
116 * clflush (obj) to invalidate the CPU cache
117 * Another MI_FLUSH in i915_gem_flush (eliminate this somehow?)
118 * 5. Read/written by CPU
119 * cache lines are loaded and dirtied
120 * 6. Read written by GPU
121 * Same as last GPU access
122 *
123 * Case 3: The constant buffer
124 *
125 * 1. Allocated
126 * 2. Written by CPU
127 * 3. Read by GPU
128 * 4. Updated (written) by CPU again
129 * 5. Read by GPU
130 *
131 * 1. Allocated
132 * (CPU, CPU)
133 * 2. Written by CPU
134 * (CPU, CPU)
135 * 3. Read by GPU
136 * (CPU+RENDER, 0)
137 * flush_domains = CPU
138 * invalidate_domains = RENDER
139 * clflush (obj)
140 * MI_FLUSH
141 * drm_agp_chipset_flush
142 * 4. Updated (written) by CPU again
143 * (CPU, CPU)
144 * flush_domains = 0 (no previous write domain)
145 * invalidate_domains = 0 (no new read domains)
146 * 5. Read by GPU
147 * (CPU+RENDER, 0)
148 * flush_domains = CPU
149 * invalidate_domains = RENDER
150 * clflush (obj)
151 * MI_FLUSH
152 * drm_agp_chipset_flush
153 */
154static void
155i915_gem_object_set_to_gpu_domain(struct drm_i915_gem_object *obj,
156 struct intel_ring_buffer *ring,
157 struct change_domains *cd)
158{
159 uint32_t invalidate_domains = 0, flush_domains = 0;
160
161 /*
162 * If the object isn't moving to a new write domain,
163 * let the object stay in multiple read domains
164 */
165 if (obj->base.pending_write_domain == 0)
166 obj->base.pending_read_domains |= obj->base.read_domains;
167
168 /*
169 * Flush the current write domain if
170 * the new read domains don't match. Invalidate
171 * any read domains which differ from the old
172 * write domain
173 */
174 if (obj->base.write_domain &&
175 (((obj->base.write_domain != obj->base.pending_read_domains ||
176 obj->ring != ring)) ||
177 (obj->fenced_gpu_access && !obj->pending_fenced_gpu_access))) {
178 flush_domains |= obj->base.write_domain;
179 invalidate_domains |=
180 obj->base.pending_read_domains & ~obj->base.write_domain;
181 }
182 /*
183 * Invalidate any read caches which may have
184 * stale data. That is, any new read domains.
185 */
186 invalidate_domains |= obj->base.pending_read_domains & ~obj->base.read_domains;
187 if ((flush_domains | invalidate_domains) & I915_GEM_DOMAIN_CPU)
188 i915_gem_clflush_object(obj);
189
190 if (obj->base.pending_write_domain)
191 cd->flips |= atomic_read(&obj->pending_flip);
192
193 /* The actual obj->write_domain will be updated with
194 * pending_write_domain after we emit the accumulated flush for all
195 * of our domain changes in execbuffers (which clears objects'
196 * write_domains). So if we have a current write domain that we
197 * aren't changing, set pending_write_domain to that.
198 */
199 if (flush_domains == 0 && obj->base.pending_write_domain == 0)
200 obj->base.pending_write_domain = obj->base.write_domain;
201
202 cd->invalidate_domains |= invalidate_domains;
203 cd->flush_domains |= flush_domains;
204 if (flush_domains & I915_GEM_GPU_DOMAINS)
205 cd->flush_rings |= obj->ring->id;
206 if (invalidate_domains & I915_GEM_GPU_DOMAINS)
207 cd->flush_rings |= ring->id;
208}
209
210struct eb_objects {
211 int and;
212 struct hlist_head buckets[0];
213};
214
215static struct eb_objects *
216eb_create(int size)
217{
218 struct eb_objects *eb;
219 int count = PAGE_SIZE / sizeof(struct hlist_head) / 2;
220 while (count > size)
221 count >>= 1;
222 eb = kzalloc(count*sizeof(struct hlist_head) +
223 sizeof(struct eb_objects),
224 GFP_KERNEL);
225 if (eb == NULL)
226 return eb;
227
228 eb->and = count - 1;
229 return eb;
230}
231
232static void
233eb_reset(struct eb_objects *eb)
234{
235 memset(eb->buckets, 0, (eb->and+1)*sizeof(struct hlist_head));
236}
237
238static void
239eb_add_object(struct eb_objects *eb, struct drm_i915_gem_object *obj)
240{
241 hlist_add_head(&obj->exec_node,
242 &eb->buckets[obj->exec_handle & eb->and]);
243}
244
245static struct drm_i915_gem_object *
246eb_get_object(struct eb_objects *eb, unsigned long handle)
247{
248 struct hlist_head *head;
249 struct hlist_node *node;
250 struct drm_i915_gem_object *obj;
251
252 head = &eb->buckets[handle & eb->and];
253 hlist_for_each(node, head) {
254 obj = hlist_entry(node, struct drm_i915_gem_object, exec_node);
255 if (obj->exec_handle == handle)
256 return obj;
257 }
258
259 return NULL;
260}
261
262static void
263eb_destroy(struct eb_objects *eb)
264{
265 kfree(eb);
266}
267
268static int
269i915_gem_execbuffer_relocate_entry(struct drm_i915_gem_object *obj,
270 struct eb_objects *eb,
271 struct drm_i915_gem_relocation_entry *reloc)
272{
273 struct drm_device *dev = obj->base.dev;
274 struct drm_gem_object *target_obj;
275 uint32_t target_offset;
276 int ret = -EINVAL;
277
278 /* we've already hold a reference to all valid objects */
279 target_obj = &eb_get_object(eb, reloc->target_handle)->base;
280 if (unlikely(target_obj == NULL))
281 return -ENOENT;
282
283 target_offset = to_intel_bo(target_obj)->gtt_offset;
284
285 /* The target buffer should have appeared before us in the
286 * exec_object list, so it should have a GTT space bound by now.
287 */
288 if (unlikely(target_offset == 0)) {
289 DRM_ERROR("No GTT space found for object %d\n",
290 reloc->target_handle);
291 return ret;
292 }
293
294 /* Validate that the target is in a valid r/w GPU domain */
295 if (unlikely(reloc->write_domain & (reloc->write_domain - 1))) {
296 DRM_ERROR("reloc with multiple write domains: "
297 "obj %p target %d offset %d "
298 "read %08x write %08x",
299 obj, reloc->target_handle,
300 (int) reloc->offset,
301 reloc->read_domains,
302 reloc->write_domain);
303 return ret;
304 }
305 if (unlikely((reloc->write_domain | reloc->read_domains) & I915_GEM_DOMAIN_CPU)) {
306 DRM_ERROR("reloc with read/write CPU domains: "
307 "obj %p target %d offset %d "
308 "read %08x write %08x",
309 obj, reloc->target_handle,
310 (int) reloc->offset,
311 reloc->read_domains,
312 reloc->write_domain);
313 return ret;
314 }
315 if (unlikely(reloc->write_domain && target_obj->pending_write_domain &&
316 reloc->write_domain != target_obj->pending_write_domain)) {
317 DRM_ERROR("Write domain conflict: "
318 "obj %p target %d offset %d "
319 "new %08x old %08x\n",
320 obj, reloc->target_handle,
321 (int) reloc->offset,
322 reloc->write_domain,
323 target_obj->pending_write_domain);
324 return ret;
325 }
326
327 target_obj->pending_read_domains |= reloc->read_domains;
328 target_obj->pending_write_domain |= reloc->write_domain;
329
330 /* If the relocation already has the right value in it, no
331 * more work needs to be done.
332 */
333 if (target_offset == reloc->presumed_offset)
334 return 0;
335
336 /* Check that the relocation address is valid... */
337 if (unlikely(reloc->offset > obj->base.size - 4)) {
338 DRM_ERROR("Relocation beyond object bounds: "
339 "obj %p target %d offset %d size %d.\n",
340 obj, reloc->target_handle,
341 (int) reloc->offset,
342 (int) obj->base.size);
343 return ret;
344 }
345 if (unlikely(reloc->offset & 3)) {
346 DRM_ERROR("Relocation not 4-byte aligned: "
347 "obj %p target %d offset %d.\n",
348 obj, reloc->target_handle,
349 (int) reloc->offset);
350 return ret;
351 }
352
353 reloc->delta += target_offset;
354 if (obj->base.write_domain == I915_GEM_DOMAIN_CPU) {
355 uint32_t page_offset = reloc->offset & ~PAGE_MASK;
356 char *vaddr;
357
358 vaddr = kmap_atomic(obj->pages[reloc->offset >> PAGE_SHIFT]);
359 *(uint32_t *)(vaddr + page_offset) = reloc->delta;
360 kunmap_atomic(vaddr);
361 } else {
362 struct drm_i915_private *dev_priv = dev->dev_private;
363 uint32_t __iomem *reloc_entry;
364 void __iomem *reloc_page;
365
366 /* We can't wait for rendering with pagefaults disabled */
367 if (obj->active && in_atomic())
368 return -EFAULT;
369
370 ret = i915_gem_object_set_to_gtt_domain(obj, 1);
371 if (ret)
372 return ret;
373
374 /* Map the page containing the relocation we're going to perform. */
375 reloc->offset += obj->gtt_offset;
376 reloc_page = io_mapping_map_atomic_wc(dev_priv->mm.gtt_mapping,
377 reloc->offset & PAGE_MASK);
378 reloc_entry = (uint32_t __iomem *)
379 (reloc_page + (reloc->offset & ~PAGE_MASK));
380 iowrite32(reloc->delta, reloc_entry);
381 io_mapping_unmap_atomic(reloc_page);
382 }
383
384 /* and update the user's relocation entry */
385 reloc->presumed_offset = target_offset;
386
387 return 0;
388}
389
390static int
391i915_gem_execbuffer_relocate_object(struct drm_i915_gem_object *obj,
392 struct eb_objects *eb)
393{
394 struct drm_i915_gem_relocation_entry __user *user_relocs;
395 struct drm_i915_gem_exec_object2 *entry = obj->exec_entry;
396 int i, ret;
397
398 user_relocs = (void __user *)(uintptr_t)entry->relocs_ptr;
399 for (i = 0; i < entry->relocation_count; i++) {
400 struct drm_i915_gem_relocation_entry reloc;
401
402 if (__copy_from_user_inatomic(&reloc,
403 user_relocs+i,
404 sizeof(reloc)))
405 return -EFAULT;
406
407 ret = i915_gem_execbuffer_relocate_entry(obj, eb, &reloc);
408 if (ret)
409 return ret;
410
411 if (__copy_to_user_inatomic(&user_relocs[i].presumed_offset,
412 &reloc.presumed_offset,
413 sizeof(reloc.presumed_offset)))
414 return -EFAULT;
415 }
416
417 return 0;
418}
419
420static int
421i915_gem_execbuffer_relocate_object_slow(struct drm_i915_gem_object *obj,
422 struct eb_objects *eb,
423 struct drm_i915_gem_relocation_entry *relocs)
424{
425 const struct drm_i915_gem_exec_object2 *entry = obj->exec_entry;
426 int i, ret;
427
428 for (i = 0; i < entry->relocation_count; i++) {
429 ret = i915_gem_execbuffer_relocate_entry(obj, eb, &relocs[i]);
430 if (ret)
431 return ret;
432 }
433
434 return 0;
435}
436
437static int
438i915_gem_execbuffer_relocate(struct drm_device *dev,
439 struct eb_objects *eb,
440 struct list_head *objects)
441{
442 struct drm_i915_gem_object *obj;
443 int ret = 0;
444
445 /* This is the fast path and we cannot handle a pagefault whilst
446 * holding the struct mutex lest the user pass in the relocations
447 * contained within a mmaped bo. For in such a case we, the page
448 * fault handler would call i915_gem_fault() and we would try to
449 * acquire the struct mutex again. Obviously this is bad and so
450 * lockdep complains vehemently.
451 */
452 pagefault_disable();
453 list_for_each_entry(obj, objects, exec_list) {
454 ret = i915_gem_execbuffer_relocate_object(obj, eb);
455 if (ret)
456 break;
457 }
458 pagefault_enable();
459
460 return ret;
461}
462
463static int
464i915_gem_execbuffer_reserve(struct intel_ring_buffer *ring,
465 struct drm_file *file,
466 struct list_head *objects)
467{
468 struct drm_i915_gem_object *obj;
469 int ret, retry;
470 bool has_fenced_gpu_access = INTEL_INFO(ring->dev)->gen < 4;
471 struct list_head ordered_objects;
472
473 INIT_LIST_HEAD(&ordered_objects);
474 while (!list_empty(objects)) {
475 struct drm_i915_gem_exec_object2 *entry;
476 bool need_fence, need_mappable;
477
478 obj = list_first_entry(objects,
479 struct drm_i915_gem_object,
480 exec_list);
481 entry = obj->exec_entry;
482
483 need_fence =
484 has_fenced_gpu_access &&
485 entry->flags & EXEC_OBJECT_NEEDS_FENCE &&
486 obj->tiling_mode != I915_TILING_NONE;
487 need_mappable =
488 entry->relocation_count ? true : need_fence;
489
490 if (need_mappable)
491 list_move(&obj->exec_list, &ordered_objects);
492 else
493 list_move_tail(&obj->exec_list, &ordered_objects);
494
495 obj->base.pending_read_domains = 0;
496 obj->base.pending_write_domain = 0;
497 }
498 list_splice(&ordered_objects, objects);
499
500 /* Attempt to pin all of the buffers into the GTT.
501 * This is done in 3 phases:
502 *
503 * 1a. Unbind all objects that do not match the GTT constraints for
504 * the execbuffer (fenceable, mappable, alignment etc).
505 * 1b. Increment pin count for already bound objects.
506 * 2. Bind new objects.
507 * 3. Decrement pin count.
508 *
509 * This avoid unnecessary unbinding of later objects in order to makr
510 * room for the earlier objects *unless* we need to defragment.
511 */
512 retry = 0;
513 do {
514 ret = 0;
515
516 /* Unbind any ill-fitting objects or pin. */
517 list_for_each_entry(obj, objects, exec_list) {
518 struct drm_i915_gem_exec_object2 *entry = obj->exec_entry;
519 bool need_fence, need_mappable;
520 if (!obj->gtt_space)
521 continue;
522
523 need_fence =
524 has_fenced_gpu_access &&
525 entry->flags & EXEC_OBJECT_NEEDS_FENCE &&
526 obj->tiling_mode != I915_TILING_NONE;
527 need_mappable =
528 entry->relocation_count ? true : need_fence;
529
530 if ((entry->alignment && obj->gtt_offset & (entry->alignment - 1)) ||
531 (need_mappable && !obj->map_and_fenceable))
532 ret = i915_gem_object_unbind(obj);
533 else
534 ret = i915_gem_object_pin(obj,
535 entry->alignment,
536 need_mappable);
537 if (ret)
538 goto err;
539
540 entry++;
541 }
542
543 /* Bind fresh objects */
544 list_for_each_entry(obj, objects, exec_list) {
545 struct drm_i915_gem_exec_object2 *entry = obj->exec_entry;
546 bool need_fence;
547
548 need_fence =
549 has_fenced_gpu_access &&
550 entry->flags & EXEC_OBJECT_NEEDS_FENCE &&
551 obj->tiling_mode != I915_TILING_NONE;
552
553 if (!obj->gtt_space) {
554 bool need_mappable =
555 entry->relocation_count ? true : need_fence;
556
557 ret = i915_gem_object_pin(obj,
558 entry->alignment,
559 need_mappable);
560 if (ret)
561 break;
562 }
563
564 if (has_fenced_gpu_access) {
565 if (need_fence) {
566 ret = i915_gem_object_get_fence(obj, ring);
567 if (ret)
568 break;
569 } else if (entry->flags & EXEC_OBJECT_NEEDS_FENCE &&
570 obj->tiling_mode == I915_TILING_NONE) {
571 /* XXX pipelined! */
572 ret = i915_gem_object_put_fence(obj);
573 if (ret)
574 break;
575 }
576 obj->pending_fenced_gpu_access = need_fence;
577 }
578
579 entry->offset = obj->gtt_offset;
580 }
581
582 /* Decrement pin count for bound objects */
583 list_for_each_entry(obj, objects, exec_list) {
584 if (obj->gtt_space)
585 i915_gem_object_unpin(obj);
586 }
587
588 if (ret != -ENOSPC || retry > 1)
589 return ret;
590
591 /* First attempt, just clear anything that is purgeable.
592 * Second attempt, clear the entire GTT.
593 */
594 ret = i915_gem_evict_everything(ring->dev, retry == 0);
595 if (ret)
596 return ret;
597
598 retry++;
599 } while (1);
600
601err:
602 obj = list_entry(obj->exec_list.prev,
603 struct drm_i915_gem_object,
604 exec_list);
605 while (objects != &obj->exec_list) {
606 if (obj->gtt_space)
607 i915_gem_object_unpin(obj);
608
609 obj = list_entry(obj->exec_list.prev,
610 struct drm_i915_gem_object,
611 exec_list);
612 }
613
614 return ret;
615}
616
617static int
618i915_gem_execbuffer_relocate_slow(struct drm_device *dev,
619 struct drm_file *file,
620 struct intel_ring_buffer *ring,
621 struct list_head *objects,
622 struct eb_objects *eb,
623 struct drm_i915_gem_exec_object2 *exec,
624 int count)
625{
626 struct drm_i915_gem_relocation_entry *reloc;
627 struct drm_i915_gem_object *obj;
628 int *reloc_offset;
629 int i, total, ret;
630
631 /* We may process another execbuffer during the unlock... */
632 while (!list_empty(objects)) {
633 obj = list_first_entry(objects,
634 struct drm_i915_gem_object,
635 exec_list);
636 list_del_init(&obj->exec_list);
637 drm_gem_object_unreference(&obj->base);
638 }
639
640 mutex_unlock(&dev->struct_mutex);
641
642 total = 0;
643 for (i = 0; i < count; i++)
644 total += exec[i].relocation_count;
645
646 reloc_offset = drm_malloc_ab(count, sizeof(*reloc_offset));
647 reloc = drm_malloc_ab(total, sizeof(*reloc));
648 if (reloc == NULL || reloc_offset == NULL) {
649 drm_free_large(reloc);
650 drm_free_large(reloc_offset);
651 mutex_lock(&dev->struct_mutex);
652 return -ENOMEM;
653 }
654
655 total = 0;
656 for (i = 0; i < count; i++) {
657 struct drm_i915_gem_relocation_entry __user *user_relocs;
658
659 user_relocs = (void __user *)(uintptr_t)exec[i].relocs_ptr;
660
661 if (copy_from_user(reloc+total, user_relocs,
662 exec[i].relocation_count * sizeof(*reloc))) {
663 ret = -EFAULT;
664 mutex_lock(&dev->struct_mutex);
665 goto err;
666 }
667
668 reloc_offset[i] = total;
669 total += exec[i].relocation_count;
670 }
671
672 ret = i915_mutex_lock_interruptible(dev);
673 if (ret) {
674 mutex_lock(&dev->struct_mutex);
675 goto err;
676 }
677
678 /* reacquire the objects */
679 eb_reset(eb);
680 for (i = 0; i < count; i++) {
681 obj = to_intel_bo(drm_gem_object_lookup(dev, file,
682 exec[i].handle));
683 if (&obj->base == NULL) {
684 DRM_ERROR("Invalid object handle %d at index %d\n",
685 exec[i].handle, i);
686 ret = -ENOENT;
687 goto err;
688 }
689
690 list_add_tail(&obj->exec_list, objects);
691 obj->exec_handle = exec[i].handle;
692 obj->exec_entry = &exec[i];
693 eb_add_object(eb, obj);
694 }
695
696 ret = i915_gem_execbuffer_reserve(ring, file, objects);
697 if (ret)
698 goto err;
699
700 list_for_each_entry(obj, objects, exec_list) {
701 int offset = obj->exec_entry - exec;
702 ret = i915_gem_execbuffer_relocate_object_slow(obj, eb,
703 reloc + reloc_offset[offset]);
704 if (ret)
705 goto err;
706 }
707
708 /* Leave the user relocations as are, this is the painfully slow path,
709 * and we want to avoid the complication of dropping the lock whilst
710 * having buffers reserved in the aperture and so causing spurious
711 * ENOSPC for random operations.
712 */
713
714err:
715 drm_free_large(reloc);
716 drm_free_large(reloc_offset);
717 return ret;
718}
719
720static int
721i915_gem_execbuffer_flush(struct drm_device *dev,
722 uint32_t invalidate_domains,
723 uint32_t flush_domains,
724 uint32_t flush_rings)
725{
726 drm_i915_private_t *dev_priv = dev->dev_private;
727 int i, ret;
728
729 if (flush_domains & I915_GEM_DOMAIN_CPU)
730 intel_gtt_chipset_flush();
731
732 if (flush_domains & I915_GEM_DOMAIN_GTT)
733 wmb();
734
735 if ((flush_domains | invalidate_domains) & I915_GEM_GPU_DOMAINS) {
736 for (i = 0; i < I915_NUM_RINGS; i++)
737 if (flush_rings & (1 << i)) {
738 ret = i915_gem_flush_ring(&dev_priv->ring[i],
739 invalidate_domains,
740 flush_domains);
741 if (ret)
742 return ret;
743 }
744 }
745
746 return 0;
747}
748
749static int
750i915_gem_execbuffer_sync_rings(struct drm_i915_gem_object *obj,
751 struct intel_ring_buffer *to)
752{
753 struct intel_ring_buffer *from = obj->ring;
754 u32 seqno;
755 int ret, idx;
756
757 if (from == NULL || to == from)
758 return 0;
759
760 /* XXX gpu semaphores are implicated in various hard hangs on SNB */
761 if (INTEL_INFO(obj->base.dev)->gen < 6 || !i915_semaphores)
762 return i915_gem_object_wait_rendering(obj);
763
764 idx = intel_ring_sync_index(from, to);
765
766 seqno = obj->last_rendering_seqno;
767 if (seqno <= from->sync_seqno[idx])
768 return 0;
769
770 if (seqno == from->outstanding_lazy_request) {
771 struct drm_i915_gem_request *request;
772
773 request = kzalloc(sizeof(*request), GFP_KERNEL);
774 if (request == NULL)
775 return -ENOMEM;
776
777 ret = i915_add_request(from, NULL, request);
778 if (ret) {
779 kfree(request);
780 return ret;
781 }
782
783 seqno = request->seqno;
784 }
785
786 from->sync_seqno[idx] = seqno;
787 return intel_ring_sync(to, from, seqno - 1);
788}
789
790static int
791i915_gem_execbuffer_wait_for_flips(struct intel_ring_buffer *ring, u32 flips)
792{
793 u32 plane, flip_mask;
794 int ret;
795
796 /* Check for any pending flips. As we only maintain a flip queue depth
797 * of 1, we can simply insert a WAIT for the next display flip prior
798 * to executing the batch and avoid stalling the CPU.
799 */
800
801 for (plane = 0; flips >> plane; plane++) {
802 if (((flips >> plane) & 1) == 0)
803 continue;
804
805 if (plane)
806 flip_mask = MI_WAIT_FOR_PLANE_B_FLIP;
807 else
808 flip_mask = MI_WAIT_FOR_PLANE_A_FLIP;
809
810 ret = intel_ring_begin(ring, 2);
811 if (ret)
812 return ret;
813
814 intel_ring_emit(ring, MI_WAIT_FOR_EVENT | flip_mask);
815 intel_ring_emit(ring, MI_NOOP);
816 intel_ring_advance(ring);
817 }
818
819 return 0;
820}
821
822
823static int
824i915_gem_execbuffer_move_to_gpu(struct intel_ring_buffer *ring,
825 struct list_head *objects)
826{
827 struct drm_i915_gem_object *obj;
828 struct change_domains cd;
829 int ret;
830
831 memset(&cd, 0, sizeof(cd));
832 list_for_each_entry(obj, objects, exec_list)
833 i915_gem_object_set_to_gpu_domain(obj, ring, &cd);
834
835 if (cd.invalidate_domains | cd.flush_domains) {
836 ret = i915_gem_execbuffer_flush(ring->dev,
837 cd.invalidate_domains,
838 cd.flush_domains,
839 cd.flush_rings);
840 if (ret)
841 return ret;
842 }
843
844 if (cd.flips) {
845 ret = i915_gem_execbuffer_wait_for_flips(ring, cd.flips);
846 if (ret)
847 return ret;
848 }
849
850 list_for_each_entry(obj, objects, exec_list) {
851 ret = i915_gem_execbuffer_sync_rings(obj, ring);
852 if (ret)
853 return ret;
854 }
855
856 return 0;
857}
858
859static bool
860i915_gem_check_execbuffer(struct drm_i915_gem_execbuffer2 *exec)
861{
862 return ((exec->batch_start_offset | exec->batch_len) & 0x7) == 0;
863}
864
865static int
866validate_exec_list(struct drm_i915_gem_exec_object2 *exec,
867 int count)
868{
869 int i;
870
871 for (i = 0; i < count; i++) {
872 char __user *ptr = (char __user *)(uintptr_t)exec[i].relocs_ptr;
873 int length; /* limited by fault_in_pages_readable() */
874
875 /* First check for malicious input causing overflow */
876 if (exec[i].relocation_count >
877 INT_MAX / sizeof(struct drm_i915_gem_relocation_entry))
878 return -EINVAL;
879
880 length = exec[i].relocation_count *
881 sizeof(struct drm_i915_gem_relocation_entry);
882 if (!access_ok(VERIFY_READ, ptr, length))
883 return -EFAULT;
884
885 /* we may also need to update the presumed offsets */
886 if (!access_ok(VERIFY_WRITE, ptr, length))
887 return -EFAULT;
888
889 if (fault_in_pages_readable(ptr, length))
890 return -EFAULT;
891 }
892
893 return 0;
894}
895
896static void
897i915_gem_execbuffer_move_to_active(struct list_head *objects,
898 struct intel_ring_buffer *ring,
899 u32 seqno)
900{
901 struct drm_i915_gem_object *obj;
902
903 list_for_each_entry(obj, objects, exec_list) {
904 u32 old_read = obj->base.read_domains;
905 u32 old_write = obj->base.write_domain;
906
907
908 obj->base.read_domains = obj->base.pending_read_domains;
909 obj->base.write_domain = obj->base.pending_write_domain;
910 obj->fenced_gpu_access = obj->pending_fenced_gpu_access;
911
912 i915_gem_object_move_to_active(obj, ring, seqno);
913 if (obj->base.write_domain) {
914 obj->dirty = 1;
915 obj->pending_gpu_write = true;
916 list_move_tail(&obj->gpu_write_list,
917 &ring->gpu_write_list);
918 intel_mark_busy(ring->dev, obj);
919 }
920
921 trace_i915_gem_object_change_domain(obj, old_read, old_write);
922 }
923}
924
925static void
926i915_gem_execbuffer_retire_commands(struct drm_device *dev,
927 struct drm_file *file,
928 struct intel_ring_buffer *ring)
929{
930 struct drm_i915_gem_request *request;
931 u32 invalidate;
932
933 /*
934 * Ensure that the commands in the batch buffer are
935 * finished before the interrupt fires.
936 *
937 * The sampler always gets flushed on i965 (sigh).
938 */
939 invalidate = I915_GEM_DOMAIN_COMMAND;
940 if (INTEL_INFO(dev)->gen >= 4)
941 invalidate |= I915_GEM_DOMAIN_SAMPLER;
942 if (ring->flush(ring, invalidate, 0)) {
943 i915_gem_next_request_seqno(ring);
944 return;
945 }
946
947 /* Add a breadcrumb for the completion of the batch buffer */
948 request = kzalloc(sizeof(*request), GFP_KERNEL);
949 if (request == NULL || i915_add_request(ring, file, request)) {
950 i915_gem_next_request_seqno(ring);
951 kfree(request);
952 }
953}
954
955static int
956i915_gem_do_execbuffer(struct drm_device *dev, void *data,
957 struct drm_file *file,
958 struct drm_i915_gem_execbuffer2 *args,
959 struct drm_i915_gem_exec_object2 *exec)
960{
961 drm_i915_private_t *dev_priv = dev->dev_private;
962 struct list_head objects;
963 struct eb_objects *eb;
964 struct drm_i915_gem_object *batch_obj;
965 struct drm_clip_rect *cliprects = NULL;
966 struct intel_ring_buffer *ring;
967 u32 exec_start, exec_len;
968 u32 seqno;
969 int ret, mode, i;
970
971 if (!i915_gem_check_execbuffer(args)) {
972 DRM_ERROR("execbuf with invalid offset/length\n");
973 return -EINVAL;
974 }
975
976 ret = validate_exec_list(exec, args->buffer_count);
977 if (ret)
978 return ret;
979
980 switch (args->flags & I915_EXEC_RING_MASK) {
981 case I915_EXEC_DEFAULT:
982 case I915_EXEC_RENDER:
983 ring = &dev_priv->ring[RCS];
984 break;
985 case I915_EXEC_BSD:
986 if (!HAS_BSD(dev)) {
987 DRM_ERROR("execbuf with invalid ring (BSD)\n");
988 return -EINVAL;
989 }
990 ring = &dev_priv->ring[VCS];
991 break;
992 case I915_EXEC_BLT:
993 if (!HAS_BLT(dev)) {
994 DRM_ERROR("execbuf with invalid ring (BLT)\n");
995 return -EINVAL;
996 }
997 ring = &dev_priv->ring[BCS];
998 break;
999 default:
1000 DRM_ERROR("execbuf with unknown ring: %d\n",
1001 (int)(args->flags & I915_EXEC_RING_MASK));
1002 return -EINVAL;
1003 }
1004
1005 mode = args->flags & I915_EXEC_CONSTANTS_MASK;
1006 switch (mode) {
1007 case I915_EXEC_CONSTANTS_REL_GENERAL:
1008 case I915_EXEC_CONSTANTS_ABSOLUTE:
1009 case I915_EXEC_CONSTANTS_REL_SURFACE:
1010 if (ring == &dev_priv->ring[RCS] &&
1011 mode != dev_priv->relative_constants_mode) {
1012 if (INTEL_INFO(dev)->gen < 4)
1013 return -EINVAL;
1014
1015 if (INTEL_INFO(dev)->gen > 5 &&
1016 mode == I915_EXEC_CONSTANTS_REL_SURFACE)
1017 return -EINVAL;
1018
1019 ret = intel_ring_begin(ring, 4);
1020 if (ret)
1021 return ret;
1022
1023 intel_ring_emit(ring, MI_NOOP);
1024 intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(1));
1025 intel_ring_emit(ring, INSTPM);
1026 intel_ring_emit(ring,
1027 I915_EXEC_CONSTANTS_MASK << 16 | mode);
1028 intel_ring_advance(ring);
1029
1030 dev_priv->relative_constants_mode = mode;
1031 }
1032 break;
1033 default:
1034 DRM_ERROR("execbuf with unknown constants: %d\n", mode);
1035 return -EINVAL;
1036 }
1037
1038 if (args->buffer_count < 1) {
1039 DRM_ERROR("execbuf with %d buffers\n", args->buffer_count);
1040 return -EINVAL;
1041 }
1042
1043 if (args->num_cliprects != 0) {
1044 if (ring != &dev_priv->ring[RCS]) {
1045 DRM_ERROR("clip rectangles are only valid with the render ring\n");
1046 return -EINVAL;
1047 }
1048
1049 cliprects = kmalloc(args->num_cliprects * sizeof(*cliprects),
1050 GFP_KERNEL);
1051 if (cliprects == NULL) {
1052 ret = -ENOMEM;
1053 goto pre_mutex_err;
1054 }
1055
1056 if (copy_from_user(cliprects,
1057 (struct drm_clip_rect __user *)(uintptr_t)
1058 args->cliprects_ptr,
1059 sizeof(*cliprects)*args->num_cliprects)) {
1060 ret = -EFAULT;
1061 goto pre_mutex_err;
1062 }
1063 }
1064
1065 ret = i915_mutex_lock_interruptible(dev);
1066 if (ret)
1067 goto pre_mutex_err;
1068
1069 if (dev_priv->mm.suspended) {
1070 mutex_unlock(&dev->struct_mutex);
1071 ret = -EBUSY;
1072 goto pre_mutex_err;
1073 }
1074
1075 eb = eb_create(args->buffer_count);
1076 if (eb == NULL) {
1077 mutex_unlock(&dev->struct_mutex);
1078 ret = -ENOMEM;
1079 goto pre_mutex_err;
1080 }
1081
1082 /* Look up object handles */
1083 INIT_LIST_HEAD(&objects);
1084 for (i = 0; i < args->buffer_count; i++) {
1085 struct drm_i915_gem_object *obj;
1086
1087 obj = to_intel_bo(drm_gem_object_lookup(dev, file,
1088 exec[i].handle));
1089 if (&obj->base == NULL) {
1090 DRM_ERROR("Invalid object handle %d at index %d\n",
1091 exec[i].handle, i);
1092 /* prevent error path from reading uninitialized data */
1093 ret = -ENOENT;
1094 goto err;
1095 }
1096
1097 if (!list_empty(&obj->exec_list)) {
1098 DRM_ERROR("Object %p [handle %d, index %d] appears more than once in object list\n",
1099 obj, exec[i].handle, i);
1100 ret = -EINVAL;
1101 goto err;
1102 }
1103
1104 list_add_tail(&obj->exec_list, &objects);
1105 obj->exec_handle = exec[i].handle;
1106 obj->exec_entry = &exec[i];
1107 eb_add_object(eb, obj);
1108 }
1109
1110 /* take note of the batch buffer before we might reorder the lists */
1111 batch_obj = list_entry(objects.prev,
1112 struct drm_i915_gem_object,
1113 exec_list);
1114
1115 /* Move the objects en-masse into the GTT, evicting if necessary. */
1116 ret = i915_gem_execbuffer_reserve(ring, file, &objects);
1117 if (ret)
1118 goto err;
1119
1120 /* The objects are in their final locations, apply the relocations. */
1121 ret = i915_gem_execbuffer_relocate(dev, eb, &objects);
1122 if (ret) {
1123 if (ret == -EFAULT) {
1124 ret = i915_gem_execbuffer_relocate_slow(dev, file, ring,
1125 &objects, eb,
1126 exec,
1127 args->buffer_count);
1128 BUG_ON(!mutex_is_locked(&dev->struct_mutex));
1129 }
1130 if (ret)
1131 goto err;
1132 }
1133
1134 /* Set the pending read domains for the batch buffer to COMMAND */
1135 if (batch_obj->base.pending_write_domain) {
1136 DRM_ERROR("Attempting to use self-modifying batch buffer\n");
1137 ret = -EINVAL;
1138 goto err;
1139 }
1140 batch_obj->base.pending_read_domains |= I915_GEM_DOMAIN_COMMAND;
1141
1142 ret = i915_gem_execbuffer_move_to_gpu(ring, &objects);
1143 if (ret)
1144 goto err;
1145
1146 seqno = i915_gem_next_request_seqno(ring);
1147 for (i = 0; i < ARRAY_SIZE(ring->sync_seqno); i++) {
1148 if (seqno < ring->sync_seqno[i]) {
1149 /* The GPU can not handle its semaphore value wrapping,
1150 * so every billion or so execbuffers, we need to stall
1151 * the GPU in order to reset the counters.
1152 */
1153 ret = i915_gpu_idle(dev);
1154 if (ret)
1155 goto err;
1156
1157 BUG_ON(ring->sync_seqno[i]);
1158 }
1159 }
1160
1161 trace_i915_gem_ring_dispatch(ring, seqno);
1162
1163 exec_start = batch_obj->gtt_offset + args->batch_start_offset;
1164 exec_len = args->batch_len;
1165 if (cliprects) {
1166 for (i = 0; i < args->num_cliprects; i++) {
1167 ret = i915_emit_box(dev, &cliprects[i],
1168 args->DR1, args->DR4);
1169 if (ret)
1170 goto err;
1171
1172 ret = ring->dispatch_execbuffer(ring,
1173 exec_start, exec_len);
1174 if (ret)
1175 goto err;
1176 }
1177 } else {
1178 ret = ring->dispatch_execbuffer(ring, exec_start, exec_len);
1179 if (ret)
1180 goto err;
1181 }
1182
1183 i915_gem_execbuffer_move_to_active(&objects, ring, seqno);
1184 i915_gem_execbuffer_retire_commands(dev, file, ring);
1185
1186err:
1187 eb_destroy(eb);
1188 while (!list_empty(&objects)) {
1189 struct drm_i915_gem_object *obj;
1190
1191 obj = list_first_entry(&objects,
1192 struct drm_i915_gem_object,
1193 exec_list);
1194 list_del_init(&obj->exec_list);
1195 drm_gem_object_unreference(&obj->base);
1196 }
1197
1198 mutex_unlock(&dev->struct_mutex);
1199
1200pre_mutex_err:
1201 kfree(cliprects);
1202 return ret;
1203}
1204
1205/*
1206 * Legacy execbuffer just creates an exec2 list from the original exec object
1207 * list array and passes it to the real function.
1208 */
1209int
1210i915_gem_execbuffer(struct drm_device *dev, void *data,
1211 struct drm_file *file)
1212{
1213 struct drm_i915_gem_execbuffer *args = data;
1214 struct drm_i915_gem_execbuffer2 exec2;
1215 struct drm_i915_gem_exec_object *exec_list = NULL;
1216 struct drm_i915_gem_exec_object2 *exec2_list = NULL;
1217 int ret, i;
1218
1219 if (args->buffer_count < 1) {
1220 DRM_ERROR("execbuf with %d buffers\n", args->buffer_count);
1221 return -EINVAL;
1222 }
1223
1224 /* Copy in the exec list from userland */
1225 exec_list = drm_malloc_ab(sizeof(*exec_list), args->buffer_count);
1226 exec2_list = drm_malloc_ab(sizeof(*exec2_list), args->buffer_count);
1227 if (exec_list == NULL || exec2_list == NULL) {
1228 DRM_ERROR("Failed to allocate exec list for %d buffers\n",
1229 args->buffer_count);
1230 drm_free_large(exec_list);
1231 drm_free_large(exec2_list);
1232 return -ENOMEM;
1233 }
1234 ret = copy_from_user(exec_list,
1235 (struct drm_i915_relocation_entry __user *)
1236 (uintptr_t) args->buffers_ptr,
1237 sizeof(*exec_list) * args->buffer_count);
1238 if (ret != 0) {
1239 DRM_ERROR("copy %d exec entries failed %d\n",
1240 args->buffer_count, ret);
1241 drm_free_large(exec_list);
1242 drm_free_large(exec2_list);
1243 return -EFAULT;
1244 }
1245
1246 for (i = 0; i < args->buffer_count; i++) {
1247 exec2_list[i].handle = exec_list[i].handle;
1248 exec2_list[i].relocation_count = exec_list[i].relocation_count;
1249 exec2_list[i].relocs_ptr = exec_list[i].relocs_ptr;
1250 exec2_list[i].alignment = exec_list[i].alignment;
1251 exec2_list[i].offset = exec_list[i].offset;
1252 if (INTEL_INFO(dev)->gen < 4)
1253 exec2_list[i].flags = EXEC_OBJECT_NEEDS_FENCE;
1254 else
1255 exec2_list[i].flags = 0;
1256 }
1257
1258 exec2.buffers_ptr = args->buffers_ptr;
1259 exec2.buffer_count = args->buffer_count;
1260 exec2.batch_start_offset = args->batch_start_offset;
1261 exec2.batch_len = args->batch_len;
1262 exec2.DR1 = args->DR1;
1263 exec2.DR4 = args->DR4;
1264 exec2.num_cliprects = args->num_cliprects;
1265 exec2.cliprects_ptr = args->cliprects_ptr;
1266 exec2.flags = I915_EXEC_RENDER;
1267
1268 ret = i915_gem_do_execbuffer(dev, data, file, &exec2, exec2_list);
1269 if (!ret) {
1270 /* Copy the new buffer offsets back to the user's exec list. */
1271 for (i = 0; i < args->buffer_count; i++)
1272 exec_list[i].offset = exec2_list[i].offset;
1273 /* ... and back out to userspace */
1274 ret = copy_to_user((struct drm_i915_relocation_entry __user *)
1275 (uintptr_t) args->buffers_ptr,
1276 exec_list,
1277 sizeof(*exec_list) * args->buffer_count);
1278 if (ret) {
1279 ret = -EFAULT;
1280 DRM_ERROR("failed to copy %d exec entries "
1281 "back to user (%d)\n",
1282 args->buffer_count, ret);
1283 }
1284 }
1285
1286 drm_free_large(exec_list);
1287 drm_free_large(exec2_list);
1288 return ret;
1289}
1290
1291int
1292i915_gem_execbuffer2(struct drm_device *dev, void *data,
1293 struct drm_file *file)
1294{
1295 struct drm_i915_gem_execbuffer2 *args = data;
1296 struct drm_i915_gem_exec_object2 *exec2_list = NULL;
1297 int ret;
1298
1299 if (args->buffer_count < 1) {
1300 DRM_ERROR("execbuf2 with %d buffers\n", args->buffer_count);
1301 return -EINVAL;
1302 }
1303
1304 exec2_list = kmalloc(sizeof(*exec2_list)*args->buffer_count,
1305 GFP_KERNEL | __GFP_NOWARN | __GFP_NORETRY);
1306 if (exec2_list == NULL)
1307 exec2_list = drm_malloc_ab(sizeof(*exec2_list),
1308 args->buffer_count);
1309 if (exec2_list == NULL) {
1310 DRM_ERROR("Failed to allocate exec list for %d buffers\n",
1311 args->buffer_count);
1312 return -ENOMEM;
1313 }
1314 ret = copy_from_user(exec2_list,
1315 (struct drm_i915_relocation_entry __user *)
1316 (uintptr_t) args->buffers_ptr,
1317 sizeof(*exec2_list) * args->buffer_count);
1318 if (ret != 0) {
1319 DRM_ERROR("copy %d exec entries failed %d\n",
1320 args->buffer_count, ret);
1321 drm_free_large(exec2_list);
1322 return -EFAULT;
1323 }
1324
1325 ret = i915_gem_do_execbuffer(dev, data, file, args, exec2_list);
1326 if (!ret) {
1327 /* Copy the new buffer offsets back to the user's exec list. */
1328 ret = copy_to_user((struct drm_i915_relocation_entry __user *)
1329 (uintptr_t) args->buffers_ptr,
1330 exec2_list,
1331 sizeof(*exec2_list) * args->buffer_count);
1332 if (ret) {
1333 ret = -EFAULT;
1334 DRM_ERROR("failed to copy %d exec entries "
1335 "back to user (%d)\n",
1336 args->buffer_count, ret);
1337 }
1338 }
1339
1340 drm_free_large(exec2_list);
1341 return ret;
1342}
diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c
new file mode 100644
index 000000000000..e46b645773cf
--- /dev/null
+++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
@@ -0,0 +1,122 @@
1/*
2 * Copyright © 2010 Daniel Vetter
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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21 * IN THE SOFTWARE.
22 *
23 */
24
25#include "drmP.h"
26#include "drm.h"
27#include "i915_drm.h"
28#include "i915_drv.h"
29#include "i915_trace.h"
30#include "intel_drv.h"
31
32/* XXX kill agp_type! */
33static unsigned int cache_level_to_agp_type(struct drm_device *dev,
34 enum i915_cache_level cache_level)
35{
36 switch (cache_level) {
37 case I915_CACHE_LLC_MLC:
38 if (INTEL_INFO(dev)->gen >= 6)
39 return AGP_USER_CACHED_MEMORY_LLC_MLC;
40 /* Older chipsets do not have this extra level of CPU
41 * cacheing, so fallthrough and request the PTE simply
42 * as cached.
43 */
44 case I915_CACHE_LLC:
45 return AGP_USER_CACHED_MEMORY;
46 default:
47 case I915_CACHE_NONE:
48 return AGP_USER_MEMORY;
49 }
50}
51
52void i915_gem_restore_gtt_mappings(struct drm_device *dev)
53{
54 struct drm_i915_private *dev_priv = dev->dev_private;
55 struct drm_i915_gem_object *obj;
56
57 /* First fill our portion of the GTT with scratch pages */
58 intel_gtt_clear_range(dev_priv->mm.gtt_start / PAGE_SIZE,
59 (dev_priv->mm.gtt_end - dev_priv->mm.gtt_start) / PAGE_SIZE);
60
61 list_for_each_entry(obj, &dev_priv->mm.gtt_list, gtt_list) {
62 unsigned int agp_type =
63 cache_level_to_agp_type(dev, obj->cache_level);
64
65 i915_gem_clflush_object(obj);
66
67 if (dev_priv->mm.gtt->needs_dmar) {
68 BUG_ON(!obj->sg_list);
69
70 intel_gtt_insert_sg_entries(obj->sg_list,
71 obj->num_sg,
72 obj->gtt_space->start >> PAGE_SHIFT,
73 agp_type);
74 } else
75 intel_gtt_insert_pages(obj->gtt_space->start
76 >> PAGE_SHIFT,
77 obj->base.size >> PAGE_SHIFT,
78 obj->pages,
79 agp_type);
80 }
81
82 intel_gtt_chipset_flush();
83}
84
85int i915_gem_gtt_bind_object(struct drm_i915_gem_object *obj)
86{
87 struct drm_device *dev = obj->base.dev;
88 struct drm_i915_private *dev_priv = dev->dev_private;
89 unsigned int agp_type = cache_level_to_agp_type(dev, obj->cache_level);
90 int ret;
91
92 if (dev_priv->mm.gtt->needs_dmar) {
93 ret = intel_gtt_map_memory(obj->pages,
94 obj->base.size >> PAGE_SHIFT,
95 &obj->sg_list,
96 &obj->num_sg);
97 if (ret != 0)
98 return ret;
99
100 intel_gtt_insert_sg_entries(obj->sg_list,
101 obj->num_sg,
102 obj->gtt_space->start >> PAGE_SHIFT,
103 agp_type);
104 } else
105 intel_gtt_insert_pages(obj->gtt_space->start >> PAGE_SHIFT,
106 obj->base.size >> PAGE_SHIFT,
107 obj->pages,
108 agp_type);
109
110 return 0;
111}
112
113void i915_gem_gtt_unbind_object(struct drm_i915_gem_object *obj)
114{
115 intel_gtt_clear_range(obj->gtt_space->start >> PAGE_SHIFT,
116 obj->base.size >> PAGE_SHIFT);
117
118 if (obj->sg_list) {
119 intel_gtt_unmap_memory(obj->sg_list, obj->num_sg);
120 obj->sg_list = NULL;
121 }
122}
diff --git a/drivers/gpu/drm/i915/i915_gem_tiling.c b/drivers/gpu/drm/i915/i915_gem_tiling.c
index 710eca70b323..99c4faa59d8f 100644
--- a/drivers/gpu/drm/i915/i915_gem_tiling.c
+++ b/drivers/gpu/drm/i915/i915_gem_tiling.c
@@ -92,13 +92,13 @@ i915_gem_detect_bit_6_swizzle(struct drm_device *dev)
92 uint32_t swizzle_x = I915_BIT_6_SWIZZLE_UNKNOWN; 92 uint32_t swizzle_x = I915_BIT_6_SWIZZLE_UNKNOWN;
93 uint32_t swizzle_y = I915_BIT_6_SWIZZLE_UNKNOWN; 93 uint32_t swizzle_y = I915_BIT_6_SWIZZLE_UNKNOWN;
94 94
95 if (IS_IRONLAKE(dev) || IS_GEN6(dev)) { 95 if (INTEL_INFO(dev)->gen >= 5) {
96 /* On Ironlake whatever DRAM config, GPU always do 96 /* On Ironlake whatever DRAM config, GPU always do
97 * same swizzling setup. 97 * same swizzling setup.
98 */ 98 */
99 swizzle_x = I915_BIT_6_SWIZZLE_9_10; 99 swizzle_x = I915_BIT_6_SWIZZLE_9_10;
100 swizzle_y = I915_BIT_6_SWIZZLE_9; 100 swizzle_y = I915_BIT_6_SWIZZLE_9;
101 } else if (!IS_I9XX(dev)) { 101 } else if (IS_GEN2(dev)) {
102 /* As far as we know, the 865 doesn't have these bit 6 102 /* As far as we know, the 865 doesn't have these bit 6
103 * swizzling issues. 103 * swizzling issues.
104 */ 104 */
@@ -181,7 +181,7 @@ i915_gem_detect_bit_6_swizzle(struct drm_device *dev)
181} 181}
182 182
183/* Check pitch constriants for all chips & tiling formats */ 183/* Check pitch constriants for all chips & tiling formats */
184bool 184static bool
185i915_tiling_ok(struct drm_device *dev, int stride, int size, int tiling_mode) 185i915_tiling_ok(struct drm_device *dev, int stride, int size, int tiling_mode)
186{ 186{
187 int tile_width; 187 int tile_width;
@@ -190,19 +190,19 @@ i915_tiling_ok(struct drm_device *dev, int stride, int size, int tiling_mode)
190 if (tiling_mode == I915_TILING_NONE) 190 if (tiling_mode == I915_TILING_NONE)
191 return true; 191 return true;
192 192
193 if (!IS_I9XX(dev) || 193 if (IS_GEN2(dev) ||
194 (tiling_mode == I915_TILING_Y && HAS_128_BYTE_Y_TILING(dev))) 194 (tiling_mode == I915_TILING_Y && HAS_128_BYTE_Y_TILING(dev)))
195 tile_width = 128; 195 tile_width = 128;
196 else 196 else
197 tile_width = 512; 197 tile_width = 512;
198 198
199 /* check maximum stride & object size */ 199 /* check maximum stride & object size */
200 if (IS_I965G(dev)) { 200 if (INTEL_INFO(dev)->gen >= 4) {
201 /* i965 stores the end address of the gtt mapping in the fence 201 /* i965 stores the end address of the gtt mapping in the fence
202 * reg, so dont bother to check the size */ 202 * reg, so dont bother to check the size */
203 if (stride / 128 > I965_FENCE_MAX_PITCH_VAL) 203 if (stride / 128 > I965_FENCE_MAX_PITCH_VAL)
204 return false; 204 return false;
205 } else if (IS_GEN3(dev) || IS_GEN2(dev)) { 205 } else {
206 if (stride > 8192) 206 if (stride > 8192)
207 return false; 207 return false;
208 208
@@ -216,7 +216,7 @@ i915_tiling_ok(struct drm_device *dev, int stride, int size, int tiling_mode)
216 } 216 }
217 217
218 /* 965+ just needs multiples of tile width */ 218 /* 965+ just needs multiples of tile width */
219 if (IS_I965G(dev)) { 219 if (INTEL_INFO(dev)->gen >= 4) {
220 if (stride & (tile_width - 1)) 220 if (stride & (tile_width - 1))
221 return false; 221 return false;
222 return true; 222 return true;
@@ -232,30 +232,44 @@ i915_tiling_ok(struct drm_device *dev, int stride, int size, int tiling_mode)
232 return true; 232 return true;
233} 233}
234 234
235bool 235/* Is the current GTT allocation valid for the change in tiling? */
236i915_gem_object_fence_offset_ok(struct drm_gem_object *obj, int tiling_mode) 236static bool
237i915_gem_object_fence_ok(struct drm_i915_gem_object *obj, int tiling_mode)
237{ 238{
238 struct drm_device *dev = obj->dev; 239 u32 size;
239 struct drm_i915_gem_object *obj_priv = to_intel_bo(obj);
240 240
241 if (obj_priv->gtt_space == NULL) 241 if (tiling_mode == I915_TILING_NONE)
242 return true; 242 return true;
243 243
244 if (tiling_mode == I915_TILING_NONE) 244 if (INTEL_INFO(obj->base.dev)->gen >= 4)
245 return true; 245 return true;
246 246
247 if (!IS_I965G(dev)) { 247 if (INTEL_INFO(obj->base.dev)->gen == 3) {
248 if (obj_priv->gtt_offset & (obj->size - 1)) 248 if (obj->gtt_offset & ~I915_FENCE_START_MASK)
249 return false;
250 } else {
251 if (obj->gtt_offset & ~I830_FENCE_START_MASK)
249 return false; 252 return false;
250 if (IS_I9XX(dev)) {
251 if (obj_priv->gtt_offset & ~I915_FENCE_START_MASK)
252 return false;
253 } else {
254 if (obj_priv->gtt_offset & ~I830_FENCE_START_MASK)
255 return false;
256 }
257 } 253 }
258 254
255 /*
256 * Previous chips need to be aligned to the size of the smallest
257 * fence register that can contain the object.
258 */
259 if (INTEL_INFO(obj->base.dev)->gen == 3)
260 size = 1024*1024;
261 else
262 size = 512*1024;
263
264 while (size < obj->base.size)
265 size <<= 1;
266
267 if (obj->gtt_space->size != size)
268 return false;
269
270 if (obj->gtt_offset & (size - 1))
271 return false;
272
259 return true; 273 return true;
260} 274}
261 275
@@ -265,26 +279,25 @@ i915_gem_object_fence_offset_ok(struct drm_gem_object *obj, int tiling_mode)
265 */ 279 */
266int 280int
267i915_gem_set_tiling(struct drm_device *dev, void *data, 281i915_gem_set_tiling(struct drm_device *dev, void *data,
268 struct drm_file *file_priv) 282 struct drm_file *file)
269{ 283{
270 struct drm_i915_gem_set_tiling *args = data; 284 struct drm_i915_gem_set_tiling *args = data;
271 drm_i915_private_t *dev_priv = dev->dev_private; 285 drm_i915_private_t *dev_priv = dev->dev_private;
272 struct drm_gem_object *obj; 286 struct drm_i915_gem_object *obj;
273 struct drm_i915_gem_object *obj_priv;
274 int ret = 0; 287 int ret = 0;
275 288
276 obj = drm_gem_object_lookup(dev, file_priv, args->handle); 289 obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
277 if (obj == NULL) 290 if (&obj->base == NULL)
278 return -ENOENT; 291 return -ENOENT;
279 obj_priv = to_intel_bo(obj);
280 292
281 if (!i915_tiling_ok(dev, args->stride, obj->size, args->tiling_mode)) { 293 if (!i915_tiling_ok(dev,
282 drm_gem_object_unreference_unlocked(obj); 294 args->stride, obj->base.size, args->tiling_mode)) {
295 drm_gem_object_unreference_unlocked(&obj->base);
283 return -EINVAL; 296 return -EINVAL;
284 } 297 }
285 298
286 if (obj_priv->pin_count) { 299 if (obj->pin_count) {
287 drm_gem_object_unreference_unlocked(obj); 300 drm_gem_object_unreference_unlocked(&obj->base);
288 return -EBUSY; 301 return -EBUSY;
289 } 302 }
290 303
@@ -318,31 +331,40 @@ i915_gem_set_tiling(struct drm_device *dev, void *data,
318 } 331 }
319 332
320 mutex_lock(&dev->struct_mutex); 333 mutex_lock(&dev->struct_mutex);
321 if (args->tiling_mode != obj_priv->tiling_mode || 334 if (args->tiling_mode != obj->tiling_mode ||
322 args->stride != obj_priv->stride) { 335 args->stride != obj->stride) {
323 /* We need to rebind the object if its current allocation 336 /* We need to rebind the object if its current allocation
324 * no longer meets the alignment restrictions for its new 337 * no longer meets the alignment restrictions for its new
325 * tiling mode. Otherwise we can just leave it alone, but 338 * tiling mode. Otherwise we can just leave it alone, but
326 * need to ensure that any fence register is cleared. 339 * need to ensure that any fence register is cleared.
327 */ 340 */
328 if (!i915_gem_object_fence_offset_ok(obj, args->tiling_mode)) 341 i915_gem_release_mmap(obj);
329 ret = i915_gem_object_unbind(obj); 342
330 else if (obj_priv->fence_reg != I915_FENCE_REG_NONE) 343 obj->map_and_fenceable =
331 ret = i915_gem_object_put_fence_reg(obj); 344 obj->gtt_space == NULL ||
332 else 345 (obj->gtt_offset + obj->base.size <= dev_priv->mm.gtt_mappable_end &&
333 i915_gem_release_mmap(obj); 346 i915_gem_object_fence_ok(obj, args->tiling_mode));
334 347
335 if (ret != 0) { 348 /* Rebind if we need a change of alignment */
336 args->tiling_mode = obj_priv->tiling_mode; 349 if (!obj->map_and_fenceable) {
337 args->stride = obj_priv->stride; 350 u32 unfenced_alignment =
338 goto err; 351 i915_gem_get_unfenced_gtt_alignment(dev,
352 obj->base.size,
353 args->tiling_mode);
354 if (obj->gtt_offset & (unfenced_alignment - 1))
355 ret = i915_gem_object_unbind(obj);
339 } 356 }
340 357
341 obj_priv->tiling_mode = args->tiling_mode; 358 if (ret == 0) {
342 obj_priv->stride = args->stride; 359 obj->tiling_changed = true;
360 obj->tiling_mode = args->tiling_mode;
361 obj->stride = args->stride;
362 }
343 } 363 }
344err: 364 /* we have to maintain this existing ABI... */
345 drm_gem_object_unreference(obj); 365 args->stride = obj->stride;
366 args->tiling_mode = obj->tiling_mode;
367 drm_gem_object_unreference(&obj->base);
346 mutex_unlock(&dev->struct_mutex); 368 mutex_unlock(&dev->struct_mutex);
347 369
348 return ret; 370 return ret;
@@ -353,22 +375,20 @@ err:
353 */ 375 */
354int 376int
355i915_gem_get_tiling(struct drm_device *dev, void *data, 377i915_gem_get_tiling(struct drm_device *dev, void *data,
356 struct drm_file *file_priv) 378 struct drm_file *file)
357{ 379{
358 struct drm_i915_gem_get_tiling *args = data; 380 struct drm_i915_gem_get_tiling *args = data;
359 drm_i915_private_t *dev_priv = dev->dev_private; 381 drm_i915_private_t *dev_priv = dev->dev_private;
360 struct drm_gem_object *obj; 382 struct drm_i915_gem_object *obj;
361 struct drm_i915_gem_object *obj_priv;
362 383
363 obj = drm_gem_object_lookup(dev, file_priv, args->handle); 384 obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
364 if (obj == NULL) 385 if (&obj->base == NULL)
365 return -ENOENT; 386 return -ENOENT;
366 obj_priv = to_intel_bo(obj);
367 387
368 mutex_lock(&dev->struct_mutex); 388 mutex_lock(&dev->struct_mutex);
369 389
370 args->tiling_mode = obj_priv->tiling_mode; 390 args->tiling_mode = obj->tiling_mode;
371 switch (obj_priv->tiling_mode) { 391 switch (obj->tiling_mode) {
372 case I915_TILING_X: 392 case I915_TILING_X:
373 args->swizzle_mode = dev_priv->mm.bit_6_swizzle_x; 393 args->swizzle_mode = dev_priv->mm.bit_6_swizzle_x;
374 break; 394 break;
@@ -388,7 +408,7 @@ i915_gem_get_tiling(struct drm_device *dev, void *data,
388 if (args->swizzle_mode == I915_BIT_6_SWIZZLE_9_10_17) 408 if (args->swizzle_mode == I915_BIT_6_SWIZZLE_9_10_17)
389 args->swizzle_mode = I915_BIT_6_SWIZZLE_9_10; 409 args->swizzle_mode = I915_BIT_6_SWIZZLE_9_10;
390 410
391 drm_gem_object_unreference(obj); 411 drm_gem_object_unreference(&obj->base);
392 mutex_unlock(&dev->struct_mutex); 412 mutex_unlock(&dev->struct_mutex);
393 413
394 return 0; 414 return 0;
@@ -399,16 +419,14 @@ i915_gem_get_tiling(struct drm_device *dev, void *data,
399 * bit 17 of its physical address and therefore being interpreted differently 419 * bit 17 of its physical address and therefore being interpreted differently
400 * by the GPU. 420 * by the GPU.
401 */ 421 */
402static int 422static void
403i915_gem_swizzle_page(struct page *page) 423i915_gem_swizzle_page(struct page *page)
404{ 424{
425 char temp[64];
405 char *vaddr; 426 char *vaddr;
406 int i; 427 int i;
407 char temp[64];
408 428
409 vaddr = kmap(page); 429 vaddr = kmap(page);
410 if (vaddr == NULL)
411 return -ENOMEM;
412 430
413 for (i = 0; i < PAGE_SIZE; i += 128) { 431 for (i = 0; i < PAGE_SIZE; i += 128) {
414 memcpy(temp, &vaddr[i], 64); 432 memcpy(temp, &vaddr[i], 64);
@@ -417,55 +435,47 @@ i915_gem_swizzle_page(struct page *page)
417 } 435 }
418 436
419 kunmap(page); 437 kunmap(page);
420
421 return 0;
422} 438}
423 439
424void 440void
425i915_gem_object_do_bit_17_swizzle(struct drm_gem_object *obj) 441i915_gem_object_do_bit_17_swizzle(struct drm_i915_gem_object *obj)
426{ 442{
427 struct drm_device *dev = obj->dev; 443 struct drm_device *dev = obj->base.dev;
428 drm_i915_private_t *dev_priv = dev->dev_private; 444 drm_i915_private_t *dev_priv = dev->dev_private;
429 struct drm_i915_gem_object *obj_priv = to_intel_bo(obj); 445 int page_count = obj->base.size >> PAGE_SHIFT;
430 int page_count = obj->size >> PAGE_SHIFT;
431 int i; 446 int i;
432 447
433 if (dev_priv->mm.bit_6_swizzle_x != I915_BIT_6_SWIZZLE_9_10_17) 448 if (dev_priv->mm.bit_6_swizzle_x != I915_BIT_6_SWIZZLE_9_10_17)
434 return; 449 return;
435 450
436 if (obj_priv->bit_17 == NULL) 451 if (obj->bit_17 == NULL)
437 return; 452 return;
438 453
439 for (i = 0; i < page_count; i++) { 454 for (i = 0; i < page_count; i++) {
440 char new_bit_17 = page_to_phys(obj_priv->pages[i]) >> 17; 455 char new_bit_17 = page_to_phys(obj->pages[i]) >> 17;
441 if ((new_bit_17 & 0x1) != 456 if ((new_bit_17 & 0x1) !=
442 (test_bit(i, obj_priv->bit_17) != 0)) { 457 (test_bit(i, obj->bit_17) != 0)) {
443 int ret = i915_gem_swizzle_page(obj_priv->pages[i]); 458 i915_gem_swizzle_page(obj->pages[i]);
444 if (ret != 0) { 459 set_page_dirty(obj->pages[i]);
445 DRM_ERROR("Failed to swizzle page\n");
446 return;
447 }
448 set_page_dirty(obj_priv->pages[i]);
449 } 460 }
450 } 461 }
451} 462}
452 463
453void 464void
454i915_gem_object_save_bit_17_swizzle(struct drm_gem_object *obj) 465i915_gem_object_save_bit_17_swizzle(struct drm_i915_gem_object *obj)
455{ 466{
456 struct drm_device *dev = obj->dev; 467 struct drm_device *dev = obj->base.dev;
457 drm_i915_private_t *dev_priv = dev->dev_private; 468 drm_i915_private_t *dev_priv = dev->dev_private;
458 struct drm_i915_gem_object *obj_priv = to_intel_bo(obj); 469 int page_count = obj->base.size >> PAGE_SHIFT;
459 int page_count = obj->size >> PAGE_SHIFT;
460 int i; 470 int i;
461 471
462 if (dev_priv->mm.bit_6_swizzle_x != I915_BIT_6_SWIZZLE_9_10_17) 472 if (dev_priv->mm.bit_6_swizzle_x != I915_BIT_6_SWIZZLE_9_10_17)
463 return; 473 return;
464 474
465 if (obj_priv->bit_17 == NULL) { 475 if (obj->bit_17 == NULL) {
466 obj_priv->bit_17 = kmalloc(BITS_TO_LONGS(page_count) * 476 obj->bit_17 = kmalloc(BITS_TO_LONGS(page_count) *
467 sizeof(long), GFP_KERNEL); 477 sizeof(long), GFP_KERNEL);
468 if (obj_priv->bit_17 == NULL) { 478 if (obj->bit_17 == NULL) {
469 DRM_ERROR("Failed to allocate memory for bit 17 " 479 DRM_ERROR("Failed to allocate memory for bit 17 "
470 "record\n"); 480 "record\n");
471 return; 481 return;
@@ -473,9 +483,9 @@ i915_gem_object_save_bit_17_swizzle(struct drm_gem_object *obj)
473 } 483 }
474 484
475 for (i = 0; i < page_count; i++) { 485 for (i = 0; i < page_count; i++) {
476 if (page_to_phys(obj_priv->pages[i]) & (1 << 17)) 486 if (page_to_phys(obj->pages[i]) & (1 << 17))
477 __set_bit(i, obj_priv->bit_17); 487 __set_bit(i, obj->bit_17);
478 else 488 else
479 __clear_bit(i, obj_priv->bit_17); 489 __clear_bit(i, obj->bit_17);
480 } 490 }
481} 491}
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index 744225ebb4b2..3b03f85ea627 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -64,87 +64,37 @@
64#define DRM_I915_VBLANK_PIPE_ALL (DRM_I915_VBLANK_PIPE_A | \ 64#define DRM_I915_VBLANK_PIPE_ALL (DRM_I915_VBLANK_PIPE_A | \
65 DRM_I915_VBLANK_PIPE_B) 65 DRM_I915_VBLANK_PIPE_B)
66 66
67void
68ironlake_enable_graphics_irq(drm_i915_private_t *dev_priv, u32 mask)
69{
70 if ((dev_priv->gt_irq_mask_reg & mask) != 0) {
71 dev_priv->gt_irq_mask_reg &= ~mask;
72 I915_WRITE(GTIMR, dev_priv->gt_irq_mask_reg);
73 (void) I915_READ(GTIMR);
74 }
75}
76
77void
78ironlake_disable_graphics_irq(drm_i915_private_t *dev_priv, u32 mask)
79{
80 if ((dev_priv->gt_irq_mask_reg & mask) != mask) {
81 dev_priv->gt_irq_mask_reg |= mask;
82 I915_WRITE(GTIMR, dev_priv->gt_irq_mask_reg);
83 (void) I915_READ(GTIMR);
84 }
85}
86
87/* For display hotplug interrupt */ 67/* For display hotplug interrupt */
88void 68static void
89ironlake_enable_display_irq(drm_i915_private_t *dev_priv, u32 mask) 69ironlake_enable_display_irq(drm_i915_private_t *dev_priv, u32 mask)
90{ 70{
91 if ((dev_priv->irq_mask_reg & mask) != 0) { 71 if ((dev_priv->irq_mask & mask) != 0) {
92 dev_priv->irq_mask_reg &= ~mask; 72 dev_priv->irq_mask &= ~mask;
93 I915_WRITE(DEIMR, dev_priv->irq_mask_reg); 73 I915_WRITE(DEIMR, dev_priv->irq_mask);
94 (void) I915_READ(DEIMR); 74 POSTING_READ(DEIMR);
95 } 75 }
96} 76}
97 77
98static inline void 78static inline void
99ironlake_disable_display_irq(drm_i915_private_t *dev_priv, u32 mask) 79ironlake_disable_display_irq(drm_i915_private_t *dev_priv, u32 mask)
100{ 80{
101 if ((dev_priv->irq_mask_reg & mask) != mask) { 81 if ((dev_priv->irq_mask & mask) != mask) {
102 dev_priv->irq_mask_reg |= mask; 82 dev_priv->irq_mask |= mask;
103 I915_WRITE(DEIMR, dev_priv->irq_mask_reg); 83 I915_WRITE(DEIMR, dev_priv->irq_mask);
104 (void) I915_READ(DEIMR); 84 POSTING_READ(DEIMR);
105 }
106}
107
108void
109i915_enable_irq(drm_i915_private_t *dev_priv, u32 mask)
110{
111 if ((dev_priv->irq_mask_reg & mask) != 0) {
112 dev_priv->irq_mask_reg &= ~mask;
113 I915_WRITE(IMR, dev_priv->irq_mask_reg);
114 (void) I915_READ(IMR);
115 } 85 }
116} 86}
117 87
118void 88void
119i915_disable_irq(drm_i915_private_t *dev_priv, u32 mask)
120{
121 if ((dev_priv->irq_mask_reg & mask) != mask) {
122 dev_priv->irq_mask_reg |= mask;
123 I915_WRITE(IMR, dev_priv->irq_mask_reg);
124 (void) I915_READ(IMR);
125 }
126}
127
128static inline u32
129i915_pipestat(int pipe)
130{
131 if (pipe == 0)
132 return PIPEASTAT;
133 if (pipe == 1)
134 return PIPEBSTAT;
135 BUG();
136}
137
138void
139i915_enable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask) 89i915_enable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask)
140{ 90{
141 if ((dev_priv->pipestat[pipe] & mask) != mask) { 91 if ((dev_priv->pipestat[pipe] & mask) != mask) {
142 u32 reg = i915_pipestat(pipe); 92 u32 reg = PIPESTAT(pipe);
143 93
144 dev_priv->pipestat[pipe] |= mask; 94 dev_priv->pipestat[pipe] |= mask;
145 /* Enable the interrupt, clear any pending status */ 95 /* Enable the interrupt, clear any pending status */
146 I915_WRITE(reg, dev_priv->pipestat[pipe] | (mask >> 16)); 96 I915_WRITE(reg, dev_priv->pipestat[pipe] | (mask >> 16));
147 (void) I915_READ(reg); 97 POSTING_READ(reg);
148 } 98 }
149} 99}
150 100
@@ -152,30 +102,35 @@ void
152i915_disable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask) 102i915_disable_pipestat(drm_i915_private_t *dev_priv, int pipe, u32 mask)
153{ 103{
154 if ((dev_priv->pipestat[pipe] & mask) != 0) { 104 if ((dev_priv->pipestat[pipe] & mask) != 0) {
155 u32 reg = i915_pipestat(pipe); 105 u32 reg = PIPESTAT(pipe);
156 106
157 dev_priv->pipestat[pipe] &= ~mask; 107 dev_priv->pipestat[pipe] &= ~mask;
158 I915_WRITE(reg, dev_priv->pipestat[pipe]); 108 I915_WRITE(reg, dev_priv->pipestat[pipe]);
159 (void) I915_READ(reg); 109 POSTING_READ(reg);
160 } 110 }
161} 111}
162 112
163/** 113/**
164 * intel_enable_asle - enable ASLE interrupt for OpRegion 114 * intel_enable_asle - enable ASLE interrupt for OpRegion
165 */ 115 */
166void intel_enable_asle (struct drm_device *dev) 116void intel_enable_asle(struct drm_device *dev)
167{ 117{
168 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 118 drm_i915_private_t *dev_priv = dev->dev_private;
119 unsigned long irqflags;
120
121 spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
169 122
170 if (HAS_PCH_SPLIT(dev)) 123 if (HAS_PCH_SPLIT(dev))
171 ironlake_enable_display_irq(dev_priv, DE_GSE); 124 ironlake_enable_display_irq(dev_priv, DE_GSE);
172 else { 125 else {
173 i915_enable_pipestat(dev_priv, 1, 126 i915_enable_pipestat(dev_priv, 1,
174 PIPE_LEGACY_BLC_EVENT_ENABLE); 127 PIPE_LEGACY_BLC_EVENT_ENABLE);
175 if (IS_I965G(dev)) 128 if (INTEL_INFO(dev)->gen >= 4)
176 i915_enable_pipestat(dev_priv, 0, 129 i915_enable_pipestat(dev_priv, 0,
177 PIPE_LEGACY_BLC_EVENT_ENABLE); 130 PIPE_LEGACY_BLC_EVENT_ENABLE);
178 } 131 }
132
133 spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
179} 134}
180 135
181/** 136/**
@@ -191,66 +146,155 @@ static int
191i915_pipe_enabled(struct drm_device *dev, int pipe) 146i915_pipe_enabled(struct drm_device *dev, int pipe)
192{ 147{
193 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 148 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
194 unsigned long pipeconf = pipe ? PIPEBCONF : PIPEACONF; 149 return I915_READ(PIPECONF(pipe)) & PIPECONF_ENABLE;
195
196 if (I915_READ(pipeconf) & PIPEACONF_ENABLE)
197 return 1;
198
199 return 0;
200} 150}
201 151
202/* Called from drm generic code, passed a 'crtc', which 152/* Called from drm generic code, passed a 'crtc', which
203 * we use as a pipe index 153 * we use as a pipe index
204 */ 154 */
205u32 i915_get_vblank_counter(struct drm_device *dev, int pipe) 155static u32 i915_get_vblank_counter(struct drm_device *dev, int pipe)
206{ 156{
207 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 157 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
208 unsigned long high_frame; 158 unsigned long high_frame;
209 unsigned long low_frame; 159 unsigned long low_frame;
210 u32 high1, high2, low, count; 160 u32 high1, high2, low;
211
212 high_frame = pipe ? PIPEBFRAMEHIGH : PIPEAFRAMEHIGH;
213 low_frame = pipe ? PIPEBFRAMEPIXEL : PIPEAFRAMEPIXEL;
214 161
215 if (!i915_pipe_enabled(dev, pipe)) { 162 if (!i915_pipe_enabled(dev, pipe)) {
216 DRM_DEBUG_DRIVER("trying to get vblank count for disabled " 163 DRM_DEBUG_DRIVER("trying to get vblank count for disabled "
217 "pipe %d\n", pipe); 164 "pipe %c\n", pipe_name(pipe));
218 return 0; 165 return 0;
219 } 166 }
220 167
168 high_frame = PIPEFRAME(pipe);
169 low_frame = PIPEFRAMEPIXEL(pipe);
170
221 /* 171 /*
222 * High & low register fields aren't synchronized, so make sure 172 * High & low register fields aren't synchronized, so make sure
223 * we get a low value that's stable across two reads of the high 173 * we get a low value that's stable across two reads of the high
224 * register. 174 * register.
225 */ 175 */
226 do { 176 do {
227 high1 = ((I915_READ(high_frame) & PIPE_FRAME_HIGH_MASK) >> 177 high1 = I915_READ(high_frame) & PIPE_FRAME_HIGH_MASK;
228 PIPE_FRAME_HIGH_SHIFT); 178 low = I915_READ(low_frame) & PIPE_FRAME_LOW_MASK;
229 low = ((I915_READ(low_frame) & PIPE_FRAME_LOW_MASK) >> 179 high2 = I915_READ(high_frame) & PIPE_FRAME_HIGH_MASK;
230 PIPE_FRAME_LOW_SHIFT);
231 high2 = ((I915_READ(high_frame) & PIPE_FRAME_HIGH_MASK) >>
232 PIPE_FRAME_HIGH_SHIFT);
233 } while (high1 != high2); 180 } while (high1 != high2);
234 181
235 count = (high1 << 8) | low; 182 high1 >>= PIPE_FRAME_HIGH_SHIFT;
236 183 low >>= PIPE_FRAME_LOW_SHIFT;
237 return count; 184 return (high1 << 8) | low;
238} 185}
239 186
240u32 gm45_get_vblank_counter(struct drm_device *dev, int pipe) 187static u32 gm45_get_vblank_counter(struct drm_device *dev, int pipe)
241{ 188{
242 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 189 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
243 int reg = pipe ? PIPEB_FRMCOUNT_GM45 : PIPEA_FRMCOUNT_GM45; 190 int reg = PIPE_FRMCOUNT_GM45(pipe);
244 191
245 if (!i915_pipe_enabled(dev, pipe)) { 192 if (!i915_pipe_enabled(dev, pipe)) {
246 DRM_DEBUG_DRIVER("trying to get vblank count for disabled " 193 DRM_DEBUG_DRIVER("trying to get vblank count for disabled "
247 "pipe %d\n", pipe); 194 "pipe %c\n", pipe_name(pipe));
248 return 0; 195 return 0;
249 } 196 }
250 197
251 return I915_READ(reg); 198 return I915_READ(reg);
252} 199}
253 200
201static int i915_get_crtc_scanoutpos(struct drm_device *dev, int pipe,
202 int *vpos, int *hpos)
203{
204 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
205 u32 vbl = 0, position = 0;
206 int vbl_start, vbl_end, htotal, vtotal;
207 bool in_vbl = true;
208 int ret = 0;
209
210 if (!i915_pipe_enabled(dev, pipe)) {
211 DRM_DEBUG_DRIVER("trying to get scanoutpos for disabled "
212 "pipe %c\n", pipe_name(pipe));
213 return 0;
214 }
215
216 /* Get vtotal. */
217 vtotal = 1 + ((I915_READ(VTOTAL(pipe)) >> 16) & 0x1fff);
218
219 if (INTEL_INFO(dev)->gen >= 4) {
220 /* No obvious pixelcount register. Only query vertical
221 * scanout position from Display scan line register.
222 */
223 position = I915_READ(PIPEDSL(pipe));
224
225 /* Decode into vertical scanout position. Don't have
226 * horizontal scanout position.
227 */
228 *vpos = position & 0x1fff;
229 *hpos = 0;
230 } else {
231 /* Have access to pixelcount since start of frame.
232 * We can split this into vertical and horizontal
233 * scanout position.
234 */
235 position = (I915_READ(PIPEFRAMEPIXEL(pipe)) & PIPE_PIXEL_MASK) >> PIPE_PIXEL_SHIFT;
236
237 htotal = 1 + ((I915_READ(HTOTAL(pipe)) >> 16) & 0x1fff);
238 *vpos = position / htotal;
239 *hpos = position - (*vpos * htotal);
240 }
241
242 /* Query vblank area. */
243 vbl = I915_READ(VBLANK(pipe));
244
245 /* Test position against vblank region. */
246 vbl_start = vbl & 0x1fff;
247 vbl_end = (vbl >> 16) & 0x1fff;
248
249 if ((*vpos < vbl_start) || (*vpos > vbl_end))
250 in_vbl = false;
251
252 /* Inside "upper part" of vblank area? Apply corrective offset: */
253 if (in_vbl && (*vpos >= vbl_start))
254 *vpos = *vpos - vtotal;
255
256 /* Readouts valid? */
257 if (vbl > 0)
258 ret |= DRM_SCANOUTPOS_VALID | DRM_SCANOUTPOS_ACCURATE;
259
260 /* In vblank? */
261 if (in_vbl)
262 ret |= DRM_SCANOUTPOS_INVBL;
263
264 return ret;
265}
266
267static int i915_get_vblank_timestamp(struct drm_device *dev, int pipe,
268 int *max_error,
269 struct timeval *vblank_time,
270 unsigned flags)
271{
272 struct drm_i915_private *dev_priv = dev->dev_private;
273 struct drm_crtc *crtc;
274
275 if (pipe < 0 || pipe >= dev_priv->num_pipe) {
276 DRM_ERROR("Invalid crtc %d\n", pipe);
277 return -EINVAL;
278 }
279
280 /* Get drm_crtc to timestamp: */
281 crtc = intel_get_crtc_for_pipe(dev, pipe);
282 if (crtc == NULL) {
283 DRM_ERROR("Invalid crtc %d\n", pipe);
284 return -EINVAL;
285 }
286
287 if (!crtc->enabled) {
288 DRM_DEBUG_KMS("crtc %d is disabled\n", pipe);
289 return -EBUSY;
290 }
291
292 /* Helper routine in DRM core does all the work: */
293 return drm_calc_vbltimestamp_from_scanoutpos(dev, pipe, max_error,
294 vblank_time, flags,
295 crtc);
296}
297
254/* 298/*
255 * Handle hotplug events outside the interrupt handler proper. 299 * Handle hotplug events outside the interrupt handler proper.
256 */ 300 */
@@ -260,16 +304,14 @@ static void i915_hotplug_work_func(struct work_struct *work)
260 hotplug_work); 304 hotplug_work);
261 struct drm_device *dev = dev_priv->dev; 305 struct drm_device *dev = dev_priv->dev;
262 struct drm_mode_config *mode_config = &dev->mode_config; 306 struct drm_mode_config *mode_config = &dev->mode_config;
263 struct drm_encoder *encoder; 307 struct intel_encoder *encoder;
264 308
265 if (mode_config->num_encoder) { 309 DRM_DEBUG_KMS("running encoder hotplug functions\n");
266 list_for_each_entry(encoder, &mode_config->encoder_list, head) { 310
267 struct intel_encoder *intel_encoder = enc_to_intel_encoder(encoder); 311 list_for_each_entry(encoder, &mode_config->encoder_list, base.head)
268 312 if (encoder->hot_plug)
269 if (intel_encoder->hot_plug) 313 encoder->hot_plug(encoder);
270 (*intel_encoder->hot_plug) (intel_encoder); 314
271 }
272 }
273 /* Just fire off a uevent and let userspace tell us what to do */ 315 /* Just fire off a uevent and let userspace tell us what to do */
274 drm_helper_hpd_irq_event(dev); 316 drm_helper_hpd_irq_event(dev);
275} 317}
@@ -305,24 +347,142 @@ static void i915_handle_rps_change(struct drm_device *dev)
305 return; 347 return;
306} 348}
307 349
308irqreturn_t ironlake_irq_handler(struct drm_device *dev) 350static void notify_ring(struct drm_device *dev,
351 struct intel_ring_buffer *ring)
352{
353 struct drm_i915_private *dev_priv = dev->dev_private;
354 u32 seqno;
355
356 if (ring->obj == NULL)
357 return;
358
359 seqno = ring->get_seqno(ring);
360 trace_i915_gem_request_complete(ring, seqno);
361
362 ring->irq_seqno = seqno;
363 wake_up_all(&ring->irq_queue);
364
365 dev_priv->hangcheck_count = 0;
366 mod_timer(&dev_priv->hangcheck_timer,
367 jiffies + msecs_to_jiffies(DRM_I915_HANGCHECK_PERIOD));
368}
369
370static void gen6_pm_rps_work(struct work_struct *work)
371{
372 drm_i915_private_t *dev_priv = container_of(work, drm_i915_private_t,
373 rps_work);
374 u8 new_delay = dev_priv->cur_delay;
375 u32 pm_iir, pm_imr;
376
377 spin_lock_irq(&dev_priv->rps_lock);
378 pm_iir = dev_priv->pm_iir;
379 dev_priv->pm_iir = 0;
380 pm_imr = I915_READ(GEN6_PMIMR);
381 spin_unlock_irq(&dev_priv->rps_lock);
382
383 if (!pm_iir)
384 return;
385
386 mutex_lock(&dev_priv->dev->struct_mutex);
387 if (pm_iir & GEN6_PM_RP_UP_THRESHOLD) {
388 if (dev_priv->cur_delay != dev_priv->max_delay)
389 new_delay = dev_priv->cur_delay + 1;
390 if (new_delay > dev_priv->max_delay)
391 new_delay = dev_priv->max_delay;
392 } else if (pm_iir & (GEN6_PM_RP_DOWN_THRESHOLD | GEN6_PM_RP_DOWN_TIMEOUT)) {
393 gen6_gt_force_wake_get(dev_priv);
394 if (dev_priv->cur_delay != dev_priv->min_delay)
395 new_delay = dev_priv->cur_delay - 1;
396 if (new_delay < dev_priv->min_delay) {
397 new_delay = dev_priv->min_delay;
398 I915_WRITE(GEN6_RP_INTERRUPT_LIMITS,
399 I915_READ(GEN6_RP_INTERRUPT_LIMITS) |
400 ((new_delay << 16) & 0x3f0000));
401 } else {
402 /* Make sure we continue to get down interrupts
403 * until we hit the minimum frequency */
404 I915_WRITE(GEN6_RP_INTERRUPT_LIMITS,
405 I915_READ(GEN6_RP_INTERRUPT_LIMITS) & ~0x3f0000);
406 }
407 gen6_gt_force_wake_put(dev_priv);
408 }
409
410 gen6_set_rps(dev_priv->dev, new_delay);
411 dev_priv->cur_delay = new_delay;
412
413 /*
414 * rps_lock not held here because clearing is non-destructive. There is
415 * an *extremely* unlikely race with gen6_rps_enable() that is prevented
416 * by holding struct_mutex for the duration of the write.
417 */
418 I915_WRITE(GEN6_PMIMR, pm_imr & ~pm_iir);
419 mutex_unlock(&dev_priv->dev->struct_mutex);
420}
421
422static void pch_irq_handler(struct drm_device *dev)
423{
424 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
425 u32 pch_iir;
426 int pipe;
427
428 pch_iir = I915_READ(SDEIIR);
429
430 if (pch_iir & SDE_AUDIO_POWER_MASK)
431 DRM_DEBUG_DRIVER("PCH audio power change on port %d\n",
432 (pch_iir & SDE_AUDIO_POWER_MASK) >>
433 SDE_AUDIO_POWER_SHIFT);
434
435 if (pch_iir & SDE_GMBUS)
436 DRM_DEBUG_DRIVER("PCH GMBUS interrupt\n");
437
438 if (pch_iir & SDE_AUDIO_HDCP_MASK)
439 DRM_DEBUG_DRIVER("PCH HDCP audio interrupt\n");
440
441 if (pch_iir & SDE_AUDIO_TRANS_MASK)
442 DRM_DEBUG_DRIVER("PCH transcoder audio interrupt\n");
443
444 if (pch_iir & SDE_POISON)
445 DRM_ERROR("PCH poison interrupt\n");
446
447 if (pch_iir & SDE_FDI_MASK)
448 for_each_pipe(pipe)
449 DRM_DEBUG_DRIVER(" pipe %c FDI IIR: 0x%08x\n",
450 pipe_name(pipe),
451 I915_READ(FDI_RX_IIR(pipe)));
452
453 if (pch_iir & (SDE_TRANSB_CRC_DONE | SDE_TRANSA_CRC_DONE))
454 DRM_DEBUG_DRIVER("PCH transcoder CRC done interrupt\n");
455
456 if (pch_iir & (SDE_TRANSB_CRC_ERR | SDE_TRANSA_CRC_ERR))
457 DRM_DEBUG_DRIVER("PCH transcoder CRC error interrupt\n");
458
459 if (pch_iir & SDE_TRANSB_FIFO_UNDER)
460 DRM_DEBUG_DRIVER("PCH transcoder B underrun interrupt\n");
461 if (pch_iir & SDE_TRANSA_FIFO_UNDER)
462 DRM_DEBUG_DRIVER("PCH transcoder A underrun interrupt\n");
463}
464
465static irqreturn_t ivybridge_irq_handler(DRM_IRQ_ARGS)
309{ 466{
467 struct drm_device *dev = (struct drm_device *) arg;
310 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 468 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
311 int ret = IRQ_NONE; 469 int ret = IRQ_NONE;
312 u32 de_iir, gt_iir, de_ier, pch_iir; 470 u32 de_iir, gt_iir, de_ier, pch_iir, pm_iir;
313 struct drm_i915_master_private *master_priv; 471 struct drm_i915_master_private *master_priv;
314 struct intel_ring_buffer *render_ring = &dev_priv->render_ring; 472
473 atomic_inc(&dev_priv->irq_received);
315 474
316 /* disable master interrupt before clearing iir */ 475 /* disable master interrupt before clearing iir */
317 de_ier = I915_READ(DEIER); 476 de_ier = I915_READ(DEIER);
318 I915_WRITE(DEIER, de_ier & ~DE_MASTER_IRQ_CONTROL); 477 I915_WRITE(DEIER, de_ier & ~DE_MASTER_IRQ_CONTROL);
319 (void)I915_READ(DEIER); 478 POSTING_READ(DEIER);
320 479
321 de_iir = I915_READ(DEIIR); 480 de_iir = I915_READ(DEIIR);
322 gt_iir = I915_READ(GTIIR); 481 gt_iir = I915_READ(GTIIR);
323 pch_iir = I915_READ(SDEIIR); 482 pch_iir = I915_READ(SDEIIR);
483 pm_iir = I915_READ(GEN6_PMIIR);
324 484
325 if (de_iir == 0 && gt_iir == 0 && pch_iir == 0) 485 if (de_iir == 0 && gt_iir == 0 && pch_iir == 0 && pm_iir == 0)
326 goto done; 486 goto done;
327 487
328 ret = IRQ_HANDLED; 488 ret = IRQ_HANDLED;
@@ -334,29 +494,123 @@ irqreturn_t ironlake_irq_handler(struct drm_device *dev)
334 READ_BREADCRUMB(dev_priv); 494 READ_BREADCRUMB(dev_priv);
335 } 495 }
336 496
337 if (gt_iir & GT_PIPE_NOTIFY) { 497 if (gt_iir & (GT_USER_INTERRUPT | GT_PIPE_NOTIFY))
338 u32 seqno = render_ring->get_gem_seqno(dev, render_ring); 498 notify_ring(dev, &dev_priv->ring[RCS]);
339 render_ring->irq_gem_seqno = seqno; 499 if (gt_iir & GT_GEN6_BSD_USER_INTERRUPT)
340 trace_i915_gem_request_complete(dev, seqno); 500 notify_ring(dev, &dev_priv->ring[VCS]);
341 DRM_WAKEUP(&dev_priv->render_ring.irq_queue); 501 if (gt_iir & GT_BLT_USER_INTERRUPT)
342 dev_priv->hangcheck_count = 0; 502 notify_ring(dev, &dev_priv->ring[BCS]);
343 mod_timer(&dev_priv->hangcheck_timer, jiffies + DRM_I915_HANGCHECK_PERIOD); 503
504 if (de_iir & DE_GSE_IVB)
505 intel_opregion_gse_intr(dev);
506
507 if (de_iir & DE_PLANEA_FLIP_DONE_IVB) {
508 intel_prepare_page_flip(dev, 0);
509 intel_finish_page_flip_plane(dev, 0);
510 }
511
512 if (de_iir & DE_PLANEB_FLIP_DONE_IVB) {
513 intel_prepare_page_flip(dev, 1);
514 intel_finish_page_flip_plane(dev, 1);
515 }
516
517 if (de_iir & DE_PIPEA_VBLANK_IVB)
518 drm_handle_vblank(dev, 0);
519
520 if (de_iir & DE_PIPEB_VBLANK_IVB)
521 drm_handle_vblank(dev, 1);
522
523 /* check event from PCH */
524 if (de_iir & DE_PCH_EVENT_IVB) {
525 if (pch_iir & SDE_HOTPLUG_MASK_CPT)
526 queue_work(dev_priv->wq, &dev_priv->hotplug_work);
527 pch_irq_handler(dev);
344 } 528 }
345 if (gt_iir & GT_BSD_USER_INTERRUPT)
346 DRM_WAKEUP(&dev_priv->bsd_ring.irq_queue);
347 529
530 if (pm_iir & GEN6_PM_DEFERRED_EVENTS) {
531 unsigned long flags;
532 spin_lock_irqsave(&dev_priv->rps_lock, flags);
533 WARN(dev_priv->pm_iir & pm_iir, "Missed a PM interrupt\n");
534 I915_WRITE(GEN6_PMIMR, pm_iir);
535 dev_priv->pm_iir |= pm_iir;
536 spin_unlock_irqrestore(&dev_priv->rps_lock, flags);
537 queue_work(dev_priv->wq, &dev_priv->rps_work);
538 }
539
540 /* should clear PCH hotplug event before clear CPU irq */
541 I915_WRITE(SDEIIR, pch_iir);
542 I915_WRITE(GTIIR, gt_iir);
543 I915_WRITE(DEIIR, de_iir);
544 I915_WRITE(GEN6_PMIIR, pm_iir);
545
546done:
547 I915_WRITE(DEIER, de_ier);
548 POSTING_READ(DEIER);
549
550 return ret;
551}
552
553static irqreturn_t ironlake_irq_handler(DRM_IRQ_ARGS)
554{
555 struct drm_device *dev = (struct drm_device *) arg;
556 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
557 int ret = IRQ_NONE;
558 u32 de_iir, gt_iir, de_ier, pch_iir, pm_iir;
559 u32 hotplug_mask;
560 struct drm_i915_master_private *master_priv;
561 u32 bsd_usr_interrupt = GT_BSD_USER_INTERRUPT;
562
563 atomic_inc(&dev_priv->irq_received);
564
565 if (IS_GEN6(dev))
566 bsd_usr_interrupt = GT_GEN6_BSD_USER_INTERRUPT;
567
568 /* disable master interrupt before clearing iir */
569 de_ier = I915_READ(DEIER);
570 I915_WRITE(DEIER, de_ier & ~DE_MASTER_IRQ_CONTROL);
571 POSTING_READ(DEIER);
572
573 de_iir = I915_READ(DEIIR);
574 gt_iir = I915_READ(GTIIR);
575 pch_iir = I915_READ(SDEIIR);
576 pm_iir = I915_READ(GEN6_PMIIR);
577
578 if (de_iir == 0 && gt_iir == 0 && pch_iir == 0 &&
579 (!IS_GEN6(dev) || pm_iir == 0))
580 goto done;
581
582 if (HAS_PCH_CPT(dev))
583 hotplug_mask = SDE_HOTPLUG_MASK_CPT;
584 else
585 hotplug_mask = SDE_HOTPLUG_MASK;
586
587 ret = IRQ_HANDLED;
588
589 if (dev->primary->master) {
590 master_priv = dev->primary->master->driver_priv;
591 if (master_priv->sarea_priv)
592 master_priv->sarea_priv->last_dispatch =
593 READ_BREADCRUMB(dev_priv);
594 }
595
596 if (gt_iir & (GT_USER_INTERRUPT | GT_PIPE_NOTIFY))
597 notify_ring(dev, &dev_priv->ring[RCS]);
598 if (gt_iir & bsd_usr_interrupt)
599 notify_ring(dev, &dev_priv->ring[VCS]);
600 if (gt_iir & GT_BLT_USER_INTERRUPT)
601 notify_ring(dev, &dev_priv->ring[BCS]);
348 602
349 if (de_iir & DE_GSE) 603 if (de_iir & DE_GSE)
350 ironlake_opregion_gse_intr(dev); 604 intel_opregion_gse_intr(dev);
351 605
352 if (de_iir & DE_PLANEA_FLIP_DONE) { 606 if (de_iir & DE_PLANEA_FLIP_DONE) {
353 intel_prepare_page_flip(dev, 0); 607 intel_prepare_page_flip(dev, 0);
354 intel_finish_page_flip(dev, 0); 608 intel_finish_page_flip_plane(dev, 0);
355 } 609 }
356 610
357 if (de_iir & DE_PLANEB_FLIP_DONE) { 611 if (de_iir & DE_PLANEB_FLIP_DONE) {
358 intel_prepare_page_flip(dev, 1); 612 intel_prepare_page_flip(dev, 1);
359 intel_finish_page_flip(dev, 1); 613 intel_finish_page_flip_plane(dev, 1);
360 } 614 }
361 615
362 if (de_iir & DE_PIPEA_VBLANK) 616 if (de_iir & DE_PIPEA_VBLANK)
@@ -366,9 +620,10 @@ irqreturn_t ironlake_irq_handler(struct drm_device *dev)
366 drm_handle_vblank(dev, 1); 620 drm_handle_vblank(dev, 1);
367 621
368 /* check event from PCH */ 622 /* check event from PCH */
369 if ((de_iir & DE_PCH_EVENT) && 623 if (de_iir & DE_PCH_EVENT) {
370 (pch_iir & SDE_HOTPLUG_MASK)) { 624 if (pch_iir & hotplug_mask)
371 queue_work(dev_priv->wq, &dev_priv->hotplug_work); 625 queue_work(dev_priv->wq, &dev_priv->hotplug_work);
626 pch_irq_handler(dev);
372 } 627 }
373 628
374 if (de_iir & DE_PCU_EVENT) { 629 if (de_iir & DE_PCU_EVENT) {
@@ -376,14 +631,34 @@ irqreturn_t ironlake_irq_handler(struct drm_device *dev)
376 i915_handle_rps_change(dev); 631 i915_handle_rps_change(dev);
377 } 632 }
378 633
634 if (IS_GEN6(dev) && pm_iir & GEN6_PM_DEFERRED_EVENTS) {
635 /*
636 * IIR bits should never already be set because IMR should
637 * prevent an interrupt from being shown in IIR. The warning
638 * displays a case where we've unsafely cleared
639 * dev_priv->pm_iir. Although missing an interrupt of the same
640 * type is not a problem, it displays a problem in the logic.
641 *
642 * The mask bit in IMR is cleared by rps_work.
643 */
644 unsigned long flags;
645 spin_lock_irqsave(&dev_priv->rps_lock, flags);
646 WARN(dev_priv->pm_iir & pm_iir, "Missed a PM interrupt\n");
647 I915_WRITE(GEN6_PMIMR, pm_iir);
648 dev_priv->pm_iir |= pm_iir;
649 spin_unlock_irqrestore(&dev_priv->rps_lock, flags);
650 queue_work(dev_priv->wq, &dev_priv->rps_work);
651 }
652
379 /* should clear PCH hotplug event before clear CPU irq */ 653 /* should clear PCH hotplug event before clear CPU irq */
380 I915_WRITE(SDEIIR, pch_iir); 654 I915_WRITE(SDEIIR, pch_iir);
381 I915_WRITE(GTIIR, gt_iir); 655 I915_WRITE(GTIIR, gt_iir);
382 I915_WRITE(DEIIR, de_iir); 656 I915_WRITE(DEIIR, de_iir);
657 I915_WRITE(GEN6_PMIIR, pm_iir);
383 658
384done: 659done:
385 I915_WRITE(DEIER, de_ier); 660 I915_WRITE(DEIER, de_ier);
386 (void)I915_READ(DEIER); 661 POSTING_READ(DEIER);
387 662
388 return ret; 663 return ret;
389} 664}
@@ -404,47 +679,38 @@ static void i915_error_work_func(struct work_struct *work)
404 char *reset_event[] = { "RESET=1", NULL }; 679 char *reset_event[] = { "RESET=1", NULL };
405 char *reset_done_event[] = { "ERROR=0", NULL }; 680 char *reset_done_event[] = { "ERROR=0", NULL };
406 681
407 DRM_DEBUG_DRIVER("generating error event\n");
408 kobject_uevent_env(&dev->primary->kdev.kobj, KOBJ_CHANGE, error_event); 682 kobject_uevent_env(&dev->primary->kdev.kobj, KOBJ_CHANGE, error_event);
409 683
410 if (atomic_read(&dev_priv->mm.wedged)) { 684 if (atomic_read(&dev_priv->mm.wedged)) {
411 if (IS_I965G(dev)) { 685 DRM_DEBUG_DRIVER("resetting chip\n");
412 DRM_DEBUG_DRIVER("resetting chip\n"); 686 kobject_uevent_env(&dev->primary->kdev.kobj, KOBJ_CHANGE, reset_event);
413 kobject_uevent_env(&dev->primary->kdev.kobj, KOBJ_CHANGE, reset_event); 687 if (!i915_reset(dev, GRDOM_RENDER)) {
414 if (!i965_reset(dev, GDRST_RENDER)) { 688 atomic_set(&dev_priv->mm.wedged, 0);
415 atomic_set(&dev_priv->mm.wedged, 0); 689 kobject_uevent_env(&dev->primary->kdev.kobj, KOBJ_CHANGE, reset_done_event);
416 kobject_uevent_env(&dev->primary->kdev.kobj, KOBJ_CHANGE, reset_done_event);
417 }
418 } else {
419 DRM_DEBUG_DRIVER("reboot required\n");
420 } 690 }
691 complete_all(&dev_priv->error_completion);
421 } 692 }
422} 693}
423 694
695#ifdef CONFIG_DEBUG_FS
424static struct drm_i915_error_object * 696static struct drm_i915_error_object *
425i915_error_object_create(struct drm_device *dev, 697i915_error_object_create(struct drm_i915_private *dev_priv,
426 struct drm_gem_object *src) 698 struct drm_i915_gem_object *src)
427{ 699{
428 drm_i915_private_t *dev_priv = dev->dev_private;
429 struct drm_i915_error_object *dst; 700 struct drm_i915_error_object *dst;
430 struct drm_i915_gem_object *src_priv;
431 int page, page_count; 701 int page, page_count;
432 u32 reloc_offset; 702 u32 reloc_offset;
433 703
434 if (src == NULL) 704 if (src == NULL || src->pages == NULL)
435 return NULL; 705 return NULL;
436 706
437 src_priv = to_intel_bo(src); 707 page_count = src->base.size / PAGE_SIZE;
438 if (src_priv->pages == NULL)
439 return NULL;
440
441 page_count = src->size / PAGE_SIZE;
442 708
443 dst = kmalloc(sizeof(*dst) + page_count * sizeof (u32 *), GFP_ATOMIC); 709 dst = kmalloc(sizeof(*dst) + page_count * sizeof (u32 *), GFP_ATOMIC);
444 if (dst == NULL) 710 if (dst == NULL)
445 return NULL; 711 return NULL;
446 712
447 reloc_offset = src_priv->gtt_offset; 713 reloc_offset = src->gtt_offset;
448 for (page = 0; page < page_count; page++) { 714 for (page = 0; page < page_count; page++) {
449 unsigned long flags; 715 unsigned long flags;
450 void __iomem *s; 716 void __iomem *s;
@@ -456,10 +722,9 @@ i915_error_object_create(struct drm_device *dev,
456 722
457 local_irq_save(flags); 723 local_irq_save(flags);
458 s = io_mapping_map_atomic_wc(dev_priv->mm.gtt_mapping, 724 s = io_mapping_map_atomic_wc(dev_priv->mm.gtt_mapping,
459 reloc_offset, 725 reloc_offset);
460 KM_IRQ0);
461 memcpy_fromio(d, s, PAGE_SIZE); 726 memcpy_fromio(d, s, PAGE_SIZE);
462 io_mapping_unmap_atomic(s, KM_IRQ0); 727 io_mapping_unmap_atomic(s);
463 local_irq_restore(flags); 728 local_irq_restore(flags);
464 729
465 dst->pages[page] = d; 730 dst->pages[page] = d;
@@ -467,7 +732,7 @@ i915_error_object_create(struct drm_device *dev,
467 reloc_offset += PAGE_SIZE; 732 reloc_offset += PAGE_SIZE;
468 } 733 }
469 dst->page_count = page_count; 734 dst->page_count = page_count;
470 dst->gtt_offset = src_priv->gtt_offset; 735 dst->gtt_offset = src->gtt_offset;
471 736
472 return dst; 737 return dst;
473 738
@@ -496,61 +761,111 @@ static void
496i915_error_state_free(struct drm_device *dev, 761i915_error_state_free(struct drm_device *dev,
497 struct drm_i915_error_state *error) 762 struct drm_i915_error_state *error)
498{ 763{
499 i915_error_object_free(error->batchbuffer[0]); 764 int i;
500 i915_error_object_free(error->batchbuffer[1]); 765
501 i915_error_object_free(error->ringbuffer); 766 for (i = 0; i < ARRAY_SIZE(error->batchbuffer); i++)
767 i915_error_object_free(error->batchbuffer[i]);
768
769 for (i = 0; i < ARRAY_SIZE(error->ringbuffer); i++)
770 i915_error_object_free(error->ringbuffer[i]);
771
502 kfree(error->active_bo); 772 kfree(error->active_bo);
503 kfree(error->overlay); 773 kfree(error->overlay);
504 kfree(error); 774 kfree(error);
505} 775}
506 776
507static u32 777static u32 capture_bo_list(struct drm_i915_error_buffer *err,
508i915_get_bbaddr(struct drm_device *dev, u32 *ring) 778 int count,
779 struct list_head *head)
509{ 780{
510 u32 cmd; 781 struct drm_i915_gem_object *obj;
782 int i = 0;
783
784 list_for_each_entry(obj, head, mm_list) {
785 err->size = obj->base.size;
786 err->name = obj->base.name;
787 err->seqno = obj->last_rendering_seqno;
788 err->gtt_offset = obj->gtt_offset;
789 err->read_domains = obj->base.read_domains;
790 err->write_domain = obj->base.write_domain;
791 err->fence_reg = obj->fence_reg;
792 err->pinned = 0;
793 if (obj->pin_count > 0)
794 err->pinned = 1;
795 if (obj->user_pin_count > 0)
796 err->pinned = -1;
797 err->tiling = obj->tiling_mode;
798 err->dirty = obj->dirty;
799 err->purgeable = obj->madv != I915_MADV_WILLNEED;
800 err->ring = obj->ring ? obj->ring->id : 0;
801 err->cache_level = obj->cache_level;
802
803 if (++i == count)
804 break;
511 805
512 if (IS_I830(dev) || IS_845G(dev)) 806 err++;
513 cmd = MI_BATCH_BUFFER; 807 }
514 else if (IS_I965G(dev))
515 cmd = (MI_BATCH_BUFFER_START | (2 << 6) |
516 MI_BATCH_NON_SECURE_I965);
517 else
518 cmd = (MI_BATCH_BUFFER_START | (2 << 6));
519 808
520 return ring[0] == cmd ? ring[1] : 0; 809 return i;
521} 810}
522 811
523static u32 812static void i915_gem_record_fences(struct drm_device *dev,
524i915_ringbuffer_last_batch(struct drm_device *dev) 813 struct drm_i915_error_state *error)
525{ 814{
526 struct drm_i915_private *dev_priv = dev->dev_private; 815 struct drm_i915_private *dev_priv = dev->dev_private;
527 u32 head, bbaddr; 816 int i;
528 u32 *ring; 817
529 818 /* Fences */
530 /* Locate the current position in the ringbuffer and walk back 819 switch (INTEL_INFO(dev)->gen) {
531 * to find the most recently dispatched batch buffer. 820 case 6:
532 */ 821 for (i = 0; i < 16; i++)
533 bbaddr = 0; 822 error->fence[i] = I915_READ64(FENCE_REG_SANDYBRIDGE_0 + (i * 8));
534 head = I915_READ(PRB0_HEAD) & HEAD_ADDR; 823 break;
535 ring = (u32 *)(dev_priv->render_ring.virtual_start + head); 824 case 5:
825 case 4:
826 for (i = 0; i < 16; i++)
827 error->fence[i] = I915_READ64(FENCE_REG_965_0 + (i * 8));
828 break;
829 case 3:
830 if (IS_I945G(dev) || IS_I945GM(dev) || IS_G33(dev))
831 for (i = 0; i < 8; i++)
832 error->fence[i+8] = I915_READ(FENCE_REG_945_8 + (i * 4));
833 case 2:
834 for (i = 0; i < 8; i++)
835 error->fence[i] = I915_READ(FENCE_REG_830_0 + (i * 4));
836 break;
536 837
537 while (--ring >= (u32 *)dev_priv->render_ring.virtual_start) {
538 bbaddr = i915_get_bbaddr(dev, ring);
539 if (bbaddr)
540 break;
541 } 838 }
839}
542 840
543 if (bbaddr == 0) { 841static struct drm_i915_error_object *
544 ring = (u32 *)(dev_priv->render_ring.virtual_start 842i915_error_first_batchbuffer(struct drm_i915_private *dev_priv,
545 + dev_priv->render_ring.size); 843 struct intel_ring_buffer *ring)
546 while (--ring >= (u32 *)dev_priv->render_ring.virtual_start) { 844{
547 bbaddr = i915_get_bbaddr(dev, ring); 845 struct drm_i915_gem_object *obj;
548 if (bbaddr) 846 u32 seqno;
549 break; 847
550 } 848 if (!ring->get_seqno)
849 return NULL;
850
851 seqno = ring->get_seqno(ring);
852 list_for_each_entry(obj, &dev_priv->mm.active_list, mm_list) {
853 if (obj->ring != ring)
854 continue;
855
856 if (i915_seqno_passed(seqno, obj->last_rendering_seqno))
857 continue;
858
859 if ((obj->base.read_domains & I915_GEM_DOMAIN_COMMAND) == 0)
860 continue;
861
862 /* We need to copy these to an anonymous buffer as the simplest
863 * method to avoid being overwritten by userspace.
864 */
865 return i915_error_object_create(dev_priv, obj);
551 } 866 }
552 867
553 return bbaddr; 868 return NULL;
554} 869}
555 870
556/** 871/**
@@ -565,12 +880,10 @@ i915_ringbuffer_last_batch(struct drm_device *dev)
565static void i915_capture_error_state(struct drm_device *dev) 880static void i915_capture_error_state(struct drm_device *dev)
566{ 881{
567 struct drm_i915_private *dev_priv = dev->dev_private; 882 struct drm_i915_private *dev_priv = dev->dev_private;
568 struct drm_i915_gem_object *obj_priv; 883 struct drm_i915_gem_object *obj;
569 struct drm_i915_error_state *error; 884 struct drm_i915_error_state *error;
570 struct drm_gem_object *batchbuffer[2];
571 unsigned long flags; 885 unsigned long flags;
572 u32 bbaddr; 886 int i, pipe;
573 int count;
574 887
575 spin_lock_irqsave(&dev_priv->error_lock, flags); 888 spin_lock_irqsave(&dev_priv->error_lock, flags);
576 error = dev_priv->first_error; 889 error = dev_priv->first_error;
@@ -578,25 +891,43 @@ static void i915_capture_error_state(struct drm_device *dev)
578 if (error) 891 if (error)
579 return; 892 return;
580 893
894 /* Account for pipe specific data like PIPE*STAT */
581 error = kmalloc(sizeof(*error), GFP_ATOMIC); 895 error = kmalloc(sizeof(*error), GFP_ATOMIC);
582 if (!error) { 896 if (!error) {
583 DRM_DEBUG_DRIVER("out of memory, not capturing error state\n"); 897 DRM_DEBUG_DRIVER("out of memory, not capturing error state\n");
584 return; 898 return;
585 } 899 }
586 900
587 error->seqno = i915_get_gem_seqno(dev, &dev_priv->render_ring); 901 DRM_INFO("capturing error event; look for more information in /debug/dri/%d/i915_error_state\n",
902 dev->primary->index);
903
904 error->seqno = dev_priv->ring[RCS].get_seqno(&dev_priv->ring[RCS]);
588 error->eir = I915_READ(EIR); 905 error->eir = I915_READ(EIR);
589 error->pgtbl_er = I915_READ(PGTBL_ER); 906 error->pgtbl_er = I915_READ(PGTBL_ER);
590 error->pipeastat = I915_READ(PIPEASTAT); 907 for_each_pipe(pipe)
591 error->pipebstat = I915_READ(PIPEBSTAT); 908 error->pipestat[pipe] = I915_READ(PIPESTAT(pipe));
592 error->instpm = I915_READ(INSTPM); 909 error->instpm = I915_READ(INSTPM);
593 if (!IS_I965G(dev)) { 910 error->error = 0;
594 error->ipeir = I915_READ(IPEIR); 911 if (INTEL_INFO(dev)->gen >= 6) {
595 error->ipehr = I915_READ(IPEHR); 912 error->error = I915_READ(ERROR_GEN6);
596 error->instdone = I915_READ(INSTDONE); 913
597 error->acthd = I915_READ(ACTHD); 914 error->bcs_acthd = I915_READ(BCS_ACTHD);
598 error->bbaddr = 0; 915 error->bcs_ipehr = I915_READ(BCS_IPEHR);
599 } else { 916 error->bcs_ipeir = I915_READ(BCS_IPEIR);
917 error->bcs_instdone = I915_READ(BCS_INSTDONE);
918 error->bcs_seqno = 0;
919 if (dev_priv->ring[BCS].get_seqno)
920 error->bcs_seqno = dev_priv->ring[BCS].get_seqno(&dev_priv->ring[BCS]);
921
922 error->vcs_acthd = I915_READ(VCS_ACTHD);
923 error->vcs_ipehr = I915_READ(VCS_IPEHR);
924 error->vcs_ipeir = I915_READ(VCS_IPEIR);
925 error->vcs_instdone = I915_READ(VCS_INSTDONE);
926 error->vcs_seqno = 0;
927 if (dev_priv->ring[VCS].get_seqno)
928 error->vcs_seqno = dev_priv->ring[VCS].get_seqno(&dev_priv->ring[VCS]);
929 }
930 if (INTEL_INFO(dev)->gen >= 4) {
600 error->ipeir = I915_READ(IPEIR_I965); 931 error->ipeir = I915_READ(IPEIR_I965);
601 error->ipehr = I915_READ(IPEHR_I965); 932 error->ipehr = I915_READ(IPEHR_I965);
602 error->instdone = I915_READ(INSTDONE_I965); 933 error->instdone = I915_READ(INSTDONE_I965);
@@ -604,121 +935,64 @@ static void i915_capture_error_state(struct drm_device *dev)
604 error->instdone1 = I915_READ(INSTDONE1); 935 error->instdone1 = I915_READ(INSTDONE1);
605 error->acthd = I915_READ(ACTHD_I965); 936 error->acthd = I915_READ(ACTHD_I965);
606 error->bbaddr = I915_READ64(BB_ADDR); 937 error->bbaddr = I915_READ64(BB_ADDR);
938 } else {
939 error->ipeir = I915_READ(IPEIR);
940 error->ipehr = I915_READ(IPEHR);
941 error->instdone = I915_READ(INSTDONE);
942 error->acthd = I915_READ(ACTHD);
943 error->bbaddr = 0;
607 } 944 }
945 i915_gem_record_fences(dev, error);
608 946
609 bbaddr = i915_ringbuffer_last_batch(dev); 947 /* Record the active batch and ring buffers */
610 948 for (i = 0; i < I915_NUM_RINGS; i++) {
611 /* Grab the current batchbuffer, most likely to have crashed. */ 949 error->batchbuffer[i] =
612 batchbuffer[0] = NULL; 950 i915_error_first_batchbuffer(dev_priv,
613 batchbuffer[1] = NULL; 951 &dev_priv->ring[i]);
614 count = 0;
615 list_for_each_entry(obj_priv,
616 &dev_priv->render_ring.active_list, list) {
617
618 struct drm_gem_object *obj = &obj_priv->base;
619
620 if (batchbuffer[0] == NULL &&
621 bbaddr >= obj_priv->gtt_offset &&
622 bbaddr < obj_priv->gtt_offset + obj->size)
623 batchbuffer[0] = obj;
624
625 if (batchbuffer[1] == NULL &&
626 error->acthd >= obj_priv->gtt_offset &&
627 error->acthd < obj_priv->gtt_offset + obj->size)
628 batchbuffer[1] = obj;
629
630 count++;
631 }
632 /* Scan the other lists for completeness for those bizarre errors. */
633 if (batchbuffer[0] == NULL || batchbuffer[1] == NULL) {
634 list_for_each_entry(obj_priv, &dev_priv->mm.flushing_list, list) {
635 struct drm_gem_object *obj = &obj_priv->base;
636
637 if (batchbuffer[0] == NULL &&
638 bbaddr >= obj_priv->gtt_offset &&
639 bbaddr < obj_priv->gtt_offset + obj->size)
640 batchbuffer[0] = obj;
641
642 if (batchbuffer[1] == NULL &&
643 error->acthd >= obj_priv->gtt_offset &&
644 error->acthd < obj_priv->gtt_offset + obj->size)
645 batchbuffer[1] = obj;
646
647 if (batchbuffer[0] && batchbuffer[1])
648 break;
649 }
650 }
651 if (batchbuffer[0] == NULL || batchbuffer[1] == NULL) {
652 list_for_each_entry(obj_priv, &dev_priv->mm.inactive_list, list) {
653 struct drm_gem_object *obj = &obj_priv->base;
654
655 if (batchbuffer[0] == NULL &&
656 bbaddr >= obj_priv->gtt_offset &&
657 bbaddr < obj_priv->gtt_offset + obj->size)
658 batchbuffer[0] = obj;
659
660 if (batchbuffer[1] == NULL &&
661 error->acthd >= obj_priv->gtt_offset &&
662 error->acthd < obj_priv->gtt_offset + obj->size)
663 batchbuffer[1] = obj;
664 952
665 if (batchbuffer[0] && batchbuffer[1]) 953 error->ringbuffer[i] =
666 break; 954 i915_error_object_create(dev_priv,
667 } 955 dev_priv->ring[i].obj);
668 } 956 }
669 957
670 /* We need to copy these to an anonymous buffer as the simplest 958 /* Record buffers on the active and pinned lists. */
671 * method to avoid being overwritten by userpace. 959 error->active_bo = NULL;
672 */ 960 error->pinned_bo = NULL;
673 error->batchbuffer[0] = i915_error_object_create(dev, batchbuffer[0]);
674 if (batchbuffer[1] != batchbuffer[0])
675 error->batchbuffer[1] = i915_error_object_create(dev, batchbuffer[1]);
676 else
677 error->batchbuffer[1] = NULL;
678 961
679 /* Record the ringbuffer */ 962 i = 0;
680 error->ringbuffer = i915_error_object_create(dev, 963 list_for_each_entry(obj, &dev_priv->mm.active_list, mm_list)
681 dev_priv->render_ring.gem_object); 964 i++;
965 error->active_bo_count = i;
966 list_for_each_entry(obj, &dev_priv->mm.pinned_list, mm_list)
967 i++;
968 error->pinned_bo_count = i - error->active_bo_count;
682 969
683 /* Record buffers on the active list. */
684 error->active_bo = NULL; 970 error->active_bo = NULL;
685 error->active_bo_count = 0; 971 error->pinned_bo = NULL;
686 972 if (i) {
687 if (count) 973 error->active_bo = kmalloc(sizeof(*error->active_bo)*i,
688 error->active_bo = kmalloc(sizeof(*error->active_bo)*count,
689 GFP_ATOMIC); 974 GFP_ATOMIC);
690 975 if (error->active_bo)
691 if (error->active_bo) { 976 error->pinned_bo =
692 int i = 0; 977 error->active_bo + error->active_bo_count;
693 list_for_each_entry(obj_priv,
694 &dev_priv->render_ring.active_list, list) {
695 struct drm_gem_object *obj = &obj_priv->base;
696
697 error->active_bo[i].size = obj->size;
698 error->active_bo[i].name = obj->name;
699 error->active_bo[i].seqno = obj_priv->last_rendering_seqno;
700 error->active_bo[i].gtt_offset = obj_priv->gtt_offset;
701 error->active_bo[i].read_domains = obj->read_domains;
702 error->active_bo[i].write_domain = obj->write_domain;
703 error->active_bo[i].fence_reg = obj_priv->fence_reg;
704 error->active_bo[i].pinned = 0;
705 if (obj_priv->pin_count > 0)
706 error->active_bo[i].pinned = 1;
707 if (obj_priv->user_pin_count > 0)
708 error->active_bo[i].pinned = -1;
709 error->active_bo[i].tiling = obj_priv->tiling_mode;
710 error->active_bo[i].dirty = obj_priv->dirty;
711 error->active_bo[i].purgeable = obj_priv->madv != I915_MADV_WILLNEED;
712
713 if (++i == count)
714 break;
715 }
716 error->active_bo_count = i;
717 } 978 }
718 979
980 if (error->active_bo)
981 error->active_bo_count =
982 capture_bo_list(error->active_bo,
983 error->active_bo_count,
984 &dev_priv->mm.active_list);
985
986 if (error->pinned_bo)
987 error->pinned_bo_count =
988 capture_bo_list(error->pinned_bo,
989 error->pinned_bo_count,
990 &dev_priv->mm.pinned_list);
991
719 do_gettimeofday(&error->time); 992 do_gettimeofday(&error->time);
720 993
721 error->overlay = intel_overlay_capture_error_state(dev); 994 error->overlay = intel_overlay_capture_error_state(dev);
995 error->display = intel_display_capture_error_state(dev);
722 996
723 spin_lock_irqsave(&dev_priv->error_lock, flags); 997 spin_lock_irqsave(&dev_priv->error_lock, flags);
724 if (dev_priv->first_error == NULL) { 998 if (dev_priv->first_error == NULL) {
@@ -744,11 +1018,15 @@ void i915_destroy_error_state(struct drm_device *dev)
744 if (error) 1018 if (error)
745 i915_error_state_free(dev, error); 1019 i915_error_state_free(dev, error);
746} 1020}
1021#else
1022#define i915_capture_error_state(x)
1023#endif
747 1024
748static void i915_report_and_clear_eir(struct drm_device *dev) 1025static void i915_report_and_clear_eir(struct drm_device *dev)
749{ 1026{
750 struct drm_i915_private *dev_priv = dev->dev_private; 1027 struct drm_i915_private *dev_priv = dev->dev_private;
751 u32 eir = I915_READ(EIR); 1028 u32 eir = I915_READ(EIR);
1029 int pipe;
752 1030
753 if (!eir) 1031 if (!eir)
754 return; 1032 return;
@@ -773,7 +1051,7 @@ static void i915_report_and_clear_eir(struct drm_device *dev)
773 printk(KERN_ERR " ACTHD: 0x%08x\n", 1051 printk(KERN_ERR " ACTHD: 0x%08x\n",
774 I915_READ(ACTHD_I965)); 1052 I915_READ(ACTHD_I965));
775 I915_WRITE(IPEIR_I965, ipeir); 1053 I915_WRITE(IPEIR_I965, ipeir);
776 (void)I915_READ(IPEIR_I965); 1054 POSTING_READ(IPEIR_I965);
777 } 1055 }
778 if (eir & GM45_ERROR_PAGE_TABLE) { 1056 if (eir & GM45_ERROR_PAGE_TABLE) {
779 u32 pgtbl_err = I915_READ(PGTBL_ER); 1057 u32 pgtbl_err = I915_READ(PGTBL_ER);
@@ -781,37 +1059,33 @@ static void i915_report_and_clear_eir(struct drm_device *dev)
781 printk(KERN_ERR " PGTBL_ER: 0x%08x\n", 1059 printk(KERN_ERR " PGTBL_ER: 0x%08x\n",
782 pgtbl_err); 1060 pgtbl_err);
783 I915_WRITE(PGTBL_ER, pgtbl_err); 1061 I915_WRITE(PGTBL_ER, pgtbl_err);
784 (void)I915_READ(PGTBL_ER); 1062 POSTING_READ(PGTBL_ER);
785 } 1063 }
786 } 1064 }
787 1065
788 if (IS_I9XX(dev)) { 1066 if (!IS_GEN2(dev)) {
789 if (eir & I915_ERROR_PAGE_TABLE) { 1067 if (eir & I915_ERROR_PAGE_TABLE) {
790 u32 pgtbl_err = I915_READ(PGTBL_ER); 1068 u32 pgtbl_err = I915_READ(PGTBL_ER);
791 printk(KERN_ERR "page table error\n"); 1069 printk(KERN_ERR "page table error\n");
792 printk(KERN_ERR " PGTBL_ER: 0x%08x\n", 1070 printk(KERN_ERR " PGTBL_ER: 0x%08x\n",
793 pgtbl_err); 1071 pgtbl_err);
794 I915_WRITE(PGTBL_ER, pgtbl_err); 1072 I915_WRITE(PGTBL_ER, pgtbl_err);
795 (void)I915_READ(PGTBL_ER); 1073 POSTING_READ(PGTBL_ER);
796 } 1074 }
797 } 1075 }
798 1076
799 if (eir & I915_ERROR_MEMORY_REFRESH) { 1077 if (eir & I915_ERROR_MEMORY_REFRESH) {
800 u32 pipea_stats = I915_READ(PIPEASTAT); 1078 printk(KERN_ERR "memory refresh error:\n");
801 u32 pipeb_stats = I915_READ(PIPEBSTAT); 1079 for_each_pipe(pipe)
802 1080 printk(KERN_ERR "pipe %c stat: 0x%08x\n",
803 printk(KERN_ERR "memory refresh error\n"); 1081 pipe_name(pipe), I915_READ(PIPESTAT(pipe)));
804 printk(KERN_ERR "PIPEASTAT: 0x%08x\n",
805 pipea_stats);
806 printk(KERN_ERR "PIPEBSTAT: 0x%08x\n",
807 pipeb_stats);
808 /* pipestat has already been acked */ 1082 /* pipestat has already been acked */
809 } 1083 }
810 if (eir & I915_ERROR_INSTRUCTION) { 1084 if (eir & I915_ERROR_INSTRUCTION) {
811 printk(KERN_ERR "instruction error\n"); 1085 printk(KERN_ERR "instruction error\n");
812 printk(KERN_ERR " INSTPM: 0x%08x\n", 1086 printk(KERN_ERR " INSTPM: 0x%08x\n",
813 I915_READ(INSTPM)); 1087 I915_READ(INSTPM));
814 if (!IS_I965G(dev)) { 1088 if (INTEL_INFO(dev)->gen < 4) {
815 u32 ipeir = I915_READ(IPEIR); 1089 u32 ipeir = I915_READ(IPEIR);
816 1090
817 printk(KERN_ERR " IPEIR: 0x%08x\n", 1091 printk(KERN_ERR " IPEIR: 0x%08x\n",
@@ -823,7 +1097,7 @@ static void i915_report_and_clear_eir(struct drm_device *dev)
823 printk(KERN_ERR " ACTHD: 0x%08x\n", 1097 printk(KERN_ERR " ACTHD: 0x%08x\n",
824 I915_READ(ACTHD)); 1098 I915_READ(ACTHD));
825 I915_WRITE(IPEIR, ipeir); 1099 I915_WRITE(IPEIR, ipeir);
826 (void)I915_READ(IPEIR); 1100 POSTING_READ(IPEIR);
827 } else { 1101 } else {
828 u32 ipeir = I915_READ(IPEIR_I965); 1102 u32 ipeir = I915_READ(IPEIR_I965);
829 1103
@@ -840,12 +1114,12 @@ static void i915_report_and_clear_eir(struct drm_device *dev)
840 printk(KERN_ERR " ACTHD: 0x%08x\n", 1114 printk(KERN_ERR " ACTHD: 0x%08x\n",
841 I915_READ(ACTHD_I965)); 1115 I915_READ(ACTHD_I965));
842 I915_WRITE(IPEIR_I965, ipeir); 1116 I915_WRITE(IPEIR_I965, ipeir);
843 (void)I915_READ(IPEIR_I965); 1117 POSTING_READ(IPEIR_I965);
844 } 1118 }
845 } 1119 }
846 1120
847 I915_WRITE(EIR, eir); 1121 I915_WRITE(EIR, eir);
848 (void)I915_READ(EIR); 1122 POSTING_READ(EIR);
849 eir = I915_READ(EIR); 1123 eir = I915_READ(EIR);
850 if (eir) { 1124 if (eir) {
851 /* 1125 /*
@@ -868,7 +1142,7 @@ static void i915_report_and_clear_eir(struct drm_device *dev)
868 * so userspace knows something bad happened (should trigger collection 1142 * so userspace knows something bad happened (should trigger collection
869 * of a ring dump etc.). 1143 * of a ring dump etc.).
870 */ 1144 */
871static void i915_handle_error(struct drm_device *dev, bool wedged) 1145void i915_handle_error(struct drm_device *dev, bool wedged)
872{ 1146{
873 struct drm_i915_private *dev_priv = dev->dev_private; 1147 struct drm_i915_private *dev_priv = dev->dev_private;
874 1148
@@ -876,12 +1150,17 @@ static void i915_handle_error(struct drm_device *dev, bool wedged)
876 i915_report_and_clear_eir(dev); 1150 i915_report_and_clear_eir(dev);
877 1151
878 if (wedged) { 1152 if (wedged) {
1153 INIT_COMPLETION(dev_priv->error_completion);
879 atomic_set(&dev_priv->mm.wedged, 1); 1154 atomic_set(&dev_priv->mm.wedged, 1);
880 1155
881 /* 1156 /*
882 * Wakeup waiting processes so they don't hang 1157 * Wakeup waiting processes so they don't hang
883 */ 1158 */
884 DRM_WAKEUP(&dev_priv->render_ring.irq_queue); 1159 wake_up_all(&dev_priv->ring[RCS].irq_queue);
1160 if (HAS_BSD(dev))
1161 wake_up_all(&dev_priv->ring[VCS].irq_queue);
1162 if (HAS_BLT(dev))
1163 wake_up_all(&dev_priv->ring[BCS].irq_queue);
885 } 1164 }
886 1165
887 queue_work(dev_priv->wq, &dev_priv->error_work); 1166 queue_work(dev_priv->wq, &dev_priv->error_work);
@@ -892,7 +1171,7 @@ static void i915_pageflip_stall_check(struct drm_device *dev, int pipe)
892 drm_i915_private_t *dev_priv = dev->dev_private; 1171 drm_i915_private_t *dev_priv = dev->dev_private;
893 struct drm_crtc *crtc = dev_priv->pipe_to_crtc_mapping[pipe]; 1172 struct drm_crtc *crtc = dev_priv->pipe_to_crtc_mapping[pipe];
894 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 1173 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
895 struct drm_i915_gem_object *obj_priv; 1174 struct drm_i915_gem_object *obj;
896 struct intel_unpin_work *work; 1175 struct intel_unpin_work *work;
897 unsigned long flags; 1176 unsigned long flags;
898 bool stall_detected; 1177 bool stall_detected;
@@ -911,13 +1190,13 @@ static void i915_pageflip_stall_check(struct drm_device *dev, int pipe)
911 } 1190 }
912 1191
913 /* Potential stall - if we see that the flip has happened, assume a missed interrupt */ 1192 /* Potential stall - if we see that the flip has happened, assume a missed interrupt */
914 obj_priv = to_intel_bo(work->pending_flip_obj); 1193 obj = work->pending_flip_obj;
915 if(IS_I965G(dev)) { 1194 if (INTEL_INFO(dev)->gen >= 4) {
916 int dspsurf = intel_crtc->plane == 0 ? DSPASURF : DSPBSURF; 1195 int dspsurf = DSPSURF(intel_crtc->plane);
917 stall_detected = I915_READ(dspsurf) == obj_priv->gtt_offset; 1196 stall_detected = I915_READ(dspsurf) == obj->gtt_offset;
918 } else { 1197 } else {
919 int dspaddr = intel_crtc->plane == 0 ? DSPAADDR : DSPBADDR; 1198 int dspaddr = DSPADDR(intel_crtc->plane);
920 stall_detected = I915_READ(dspaddr) == (obj_priv->gtt_offset + 1199 stall_detected = I915_READ(dspaddr) == (obj->gtt_offset +
921 crtc->y * crtc->fb->pitch + 1200 crtc->y * crtc->fb->pitch +
922 crtc->x * crtc->fb->bits_per_pixel/8); 1201 crtc->x * crtc->fb->bits_per_pixel/8);
923 } 1202 }
@@ -930,28 +1209,25 @@ static void i915_pageflip_stall_check(struct drm_device *dev, int pipe)
930 } 1209 }
931} 1210}
932 1211
933irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS) 1212static irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS)
934{ 1213{
935 struct drm_device *dev = (struct drm_device *) arg; 1214 struct drm_device *dev = (struct drm_device *) arg;
936 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 1215 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
937 struct drm_i915_master_private *master_priv; 1216 struct drm_i915_master_private *master_priv;
938 u32 iir, new_iir; 1217 u32 iir, new_iir;
939 u32 pipea_stats, pipeb_stats; 1218 u32 pipe_stats[I915_MAX_PIPES];
940 u32 vblank_status; 1219 u32 vblank_status;
941 int vblank = 0; 1220 int vblank = 0;
942 unsigned long irqflags; 1221 unsigned long irqflags;
943 int irq_received; 1222 int irq_received;
944 int ret = IRQ_NONE; 1223 int ret = IRQ_NONE, pipe;
945 struct intel_ring_buffer *render_ring = &dev_priv->render_ring; 1224 bool blc_event = false;
946 1225
947 atomic_inc(&dev_priv->irq_received); 1226 atomic_inc(&dev_priv->irq_received);
948 1227
949 if (HAS_PCH_SPLIT(dev))
950 return ironlake_irq_handler(dev);
951
952 iir = I915_READ(IIR); 1228 iir = I915_READ(IIR);
953 1229
954 if (IS_I965G(dev)) 1230 if (INTEL_INFO(dev)->gen >= 4)
955 vblank_status = PIPE_START_VBLANK_INTERRUPT_STATUS; 1231 vblank_status = PIPE_START_VBLANK_INTERRUPT_STATUS;
956 else 1232 else
957 vblank_status = PIPE_VBLANK_INTERRUPT_STATUS; 1233 vblank_status = PIPE_VBLANK_INTERRUPT_STATUS;
@@ -964,30 +1240,26 @@ irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS)
964 * It doesn't set the bit in iir again, but it still produces 1240 * It doesn't set the bit in iir again, but it still produces
965 * interrupts (for non-MSI). 1241 * interrupts (for non-MSI).
966 */ 1242 */
967 spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags); 1243 spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
968 pipea_stats = I915_READ(PIPEASTAT);
969 pipeb_stats = I915_READ(PIPEBSTAT);
970
971 if (iir & I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT) 1244 if (iir & I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT)
972 i915_handle_error(dev, false); 1245 i915_handle_error(dev, false);
973 1246
974 /* 1247 for_each_pipe(pipe) {
975 * Clear the PIPE(A|B)STAT regs before the IIR 1248 int reg = PIPESTAT(pipe);
976 */ 1249 pipe_stats[pipe] = I915_READ(reg);
977 if (pipea_stats & 0x8000ffff) { 1250
978 if (pipea_stats & PIPE_FIFO_UNDERRUN_STATUS) 1251 /*
979 DRM_DEBUG_DRIVER("pipe a underrun\n"); 1252 * Clear the PIPE*STAT regs before the IIR
980 I915_WRITE(PIPEASTAT, pipea_stats); 1253 */
981 irq_received = 1; 1254 if (pipe_stats[pipe] & 0x8000ffff) {
982 } 1255 if (pipe_stats[pipe] & PIPE_FIFO_UNDERRUN_STATUS)
983 1256 DRM_DEBUG_DRIVER("pipe %c underrun\n",
984 if (pipeb_stats & 0x8000ffff) { 1257 pipe_name(pipe));
985 if (pipeb_stats & PIPE_FIFO_UNDERRUN_STATUS) 1258 I915_WRITE(reg, pipe_stats[pipe]);
986 DRM_DEBUG_DRIVER("pipe b underrun\n"); 1259 irq_received = 1;
987 I915_WRITE(PIPEBSTAT, pipeb_stats); 1260 }
988 irq_received = 1;
989 } 1261 }
990 spin_unlock_irqrestore(&dev_priv->user_irq_lock, irqflags); 1262 spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
991 1263
992 if (!irq_received) 1264 if (!irq_received)
993 break; 1265 break;
@@ -1019,18 +1291,10 @@ irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS)
1019 READ_BREADCRUMB(dev_priv); 1291 READ_BREADCRUMB(dev_priv);
1020 } 1292 }
1021 1293
1022 if (iir & I915_USER_INTERRUPT) { 1294 if (iir & I915_USER_INTERRUPT)
1023 u32 seqno = 1295 notify_ring(dev, &dev_priv->ring[RCS]);
1024 render_ring->get_gem_seqno(dev, render_ring); 1296 if (iir & I915_BSD_USER_INTERRUPT)
1025 render_ring->irq_gem_seqno = seqno; 1297 notify_ring(dev, &dev_priv->ring[VCS]);
1026 trace_i915_gem_request_complete(dev, seqno);
1027 DRM_WAKEUP(&dev_priv->render_ring.irq_queue);
1028 dev_priv->hangcheck_count = 0;
1029 mod_timer(&dev_priv->hangcheck_timer, jiffies + DRM_I915_HANGCHECK_PERIOD);
1030 }
1031
1032 if (HAS_BSD(dev) && (iir & I915_BSD_USER_INTERRUPT))
1033 DRM_WAKEUP(&dev_priv->bsd_ring.irq_queue);
1034 1298
1035 if (iir & I915_DISPLAY_PLANE_A_FLIP_PENDING_INTERRUPT) { 1299 if (iir & I915_DISPLAY_PLANE_A_FLIP_PENDING_INTERRUPT) {
1036 intel_prepare_page_flip(dev, 0); 1300 intel_prepare_page_flip(dev, 0);
@@ -1044,28 +1308,23 @@ irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS)
1044 intel_finish_page_flip_plane(dev, 1); 1308 intel_finish_page_flip_plane(dev, 1);
1045 } 1309 }
1046 1310
1047 if (pipea_stats & vblank_status) { 1311 for_each_pipe(pipe) {
1048 vblank++; 1312 if (pipe_stats[pipe] & vblank_status &&
1049 drm_handle_vblank(dev, 0); 1313 drm_handle_vblank(dev, pipe)) {
1050 if (!dev_priv->flip_pending_is_done) { 1314 vblank++;
1051 i915_pageflip_stall_check(dev, 0); 1315 if (!dev_priv->flip_pending_is_done) {
1052 intel_finish_page_flip(dev, 0); 1316 i915_pageflip_stall_check(dev, pipe);
1317 intel_finish_page_flip(dev, pipe);
1318 }
1053 } 1319 }
1054 }
1055 1320
1056 if (pipeb_stats & vblank_status) { 1321 if (pipe_stats[pipe] & PIPE_LEGACY_BLC_EVENT_STATUS)
1057 vblank++; 1322 blc_event = true;
1058 drm_handle_vblank(dev, 1);
1059 if (!dev_priv->flip_pending_is_done) {
1060 i915_pageflip_stall_check(dev, 1);
1061 intel_finish_page_flip(dev, 1);
1062 }
1063 } 1323 }
1064 1324
1065 if ((pipea_stats & PIPE_LEGACY_BLC_EVENT_STATUS) || 1325
1066 (pipeb_stats & PIPE_LEGACY_BLC_EVENT_STATUS) || 1326 if (blc_event || (iir & I915_ASLE_INTERRUPT))
1067 (iir & I915_ASLE_INTERRUPT)) 1327 intel_opregion_asle_intr(dev);
1068 opregion_asle_intr(dev);
1069 1328
1070 /* With MSI, interrupts are only generated when iir 1329 /* With MSI, interrupts are only generated when iir
1071 * transitions from zero to nonzero. If another bit got 1330 * transitions from zero to nonzero. If another bit got
@@ -1103,33 +1362,23 @@ static int i915_emit_irq(struct drm_device * dev)
1103 if (master_priv->sarea_priv) 1362 if (master_priv->sarea_priv)
1104 master_priv->sarea_priv->last_enqueue = dev_priv->counter; 1363 master_priv->sarea_priv->last_enqueue = dev_priv->counter;
1105 1364
1106 BEGIN_LP_RING(4); 1365 if (BEGIN_LP_RING(4) == 0) {
1107 OUT_RING(MI_STORE_DWORD_INDEX); 1366 OUT_RING(MI_STORE_DWORD_INDEX);
1108 OUT_RING(I915_BREADCRUMB_INDEX << MI_STORE_DWORD_INDEX_SHIFT); 1367 OUT_RING(I915_BREADCRUMB_INDEX << MI_STORE_DWORD_INDEX_SHIFT);
1109 OUT_RING(dev_priv->counter); 1368 OUT_RING(dev_priv->counter);
1110 OUT_RING(MI_USER_INTERRUPT); 1369 OUT_RING(MI_USER_INTERRUPT);
1111 ADVANCE_LP_RING(); 1370 ADVANCE_LP_RING();
1371 }
1112 1372
1113 return dev_priv->counter; 1373 return dev_priv->counter;
1114} 1374}
1115 1375
1116void i915_trace_irq_get(struct drm_device *dev, u32 seqno)
1117{
1118 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
1119 struct intel_ring_buffer *render_ring = &dev_priv->render_ring;
1120
1121 if (dev_priv->trace_irq_seqno == 0)
1122 render_ring->user_irq_get(dev, render_ring);
1123
1124 dev_priv->trace_irq_seqno = seqno;
1125}
1126
1127static int i915_wait_irq(struct drm_device * dev, int irq_nr) 1376static int i915_wait_irq(struct drm_device * dev, int irq_nr)
1128{ 1377{
1129 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 1378 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
1130 struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv; 1379 struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv;
1131 int ret = 0; 1380 int ret = 0;
1132 struct intel_ring_buffer *render_ring = &dev_priv->render_ring; 1381 struct intel_ring_buffer *ring = LP_RING(dev_priv);
1133 1382
1134 DRM_DEBUG_DRIVER("irq_nr=%d breadcrumb=%d\n", irq_nr, 1383 DRM_DEBUG_DRIVER("irq_nr=%d breadcrumb=%d\n", irq_nr,
1135 READ_BREADCRUMB(dev_priv)); 1384 READ_BREADCRUMB(dev_priv));
@@ -1143,10 +1392,12 @@ static int i915_wait_irq(struct drm_device * dev, int irq_nr)
1143 if (master_priv->sarea_priv) 1392 if (master_priv->sarea_priv)
1144 master_priv->sarea_priv->perf_boxes |= I915_BOX_WAIT; 1393 master_priv->sarea_priv->perf_boxes |= I915_BOX_WAIT;
1145 1394
1146 render_ring->user_irq_get(dev, render_ring); 1395 if (ring->irq_get(ring)) {
1147 DRM_WAIT_ON(ret, dev_priv->render_ring.irq_queue, 3 * DRM_HZ, 1396 DRM_WAIT_ON(ret, ring->irq_queue, 3 * DRM_HZ,
1148 READ_BREADCRUMB(dev_priv) >= irq_nr); 1397 READ_BREADCRUMB(dev_priv) >= irq_nr);
1149 render_ring->user_irq_put(dev, render_ring); 1398 ring->irq_put(ring);
1399 } else if (wait_for(READ_BREADCRUMB(dev_priv) >= irq_nr, 3000))
1400 ret = -EBUSY;
1150 1401
1151 if (ret == -EBUSY) { 1402 if (ret == -EBUSY) {
1152 DRM_ERROR("EBUSY -- rec: %d emitted: %d\n", 1403 DRM_ERROR("EBUSY -- rec: %d emitted: %d\n",
@@ -1165,7 +1416,7 @@ int i915_irq_emit(struct drm_device *dev, void *data,
1165 drm_i915_irq_emit_t *emit = data; 1416 drm_i915_irq_emit_t *emit = data;
1166 int result; 1417 int result;
1167 1418
1168 if (!dev_priv || !dev_priv->render_ring.virtual_start) { 1419 if (!dev_priv || !LP_RING(dev_priv)->virtual_start) {
1169 DRM_ERROR("called with no initialization\n"); 1420 DRM_ERROR("called with no initialization\n");
1170 return -EINVAL; 1421 return -EINVAL;
1171 } 1422 }
@@ -1203,59 +1454,102 @@ int i915_irq_wait(struct drm_device *dev, void *data,
1203/* Called from drm generic code, passed 'crtc' which 1454/* Called from drm generic code, passed 'crtc' which
1204 * we use as a pipe index 1455 * we use as a pipe index
1205 */ 1456 */
1206int i915_enable_vblank(struct drm_device *dev, int pipe) 1457static int i915_enable_vblank(struct drm_device *dev, int pipe)
1207{ 1458{
1208 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 1459 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
1209 unsigned long irqflags; 1460 unsigned long irqflags;
1210 int pipeconf_reg = (pipe == 0) ? PIPEACONF : PIPEBCONF;
1211 u32 pipeconf;
1212 1461
1213 pipeconf = I915_READ(pipeconf_reg); 1462 if (!i915_pipe_enabled(dev, pipe))
1214 if (!(pipeconf & PIPEACONF_ENABLE))
1215 return -EINVAL; 1463 return -EINVAL;
1216 1464
1217 spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags); 1465 spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
1218 if (HAS_PCH_SPLIT(dev)) 1466 if (INTEL_INFO(dev)->gen >= 4)
1219 ironlake_enable_display_irq(dev_priv, (pipe == 0) ?
1220 DE_PIPEA_VBLANK: DE_PIPEB_VBLANK);
1221 else if (IS_I965G(dev))
1222 i915_enable_pipestat(dev_priv, pipe, 1467 i915_enable_pipestat(dev_priv, pipe,
1223 PIPE_START_VBLANK_INTERRUPT_ENABLE); 1468 PIPE_START_VBLANK_INTERRUPT_ENABLE);
1224 else 1469 else
1225 i915_enable_pipestat(dev_priv, pipe, 1470 i915_enable_pipestat(dev_priv, pipe,
1226 PIPE_VBLANK_INTERRUPT_ENABLE); 1471 PIPE_VBLANK_INTERRUPT_ENABLE);
1227 spin_unlock_irqrestore(&dev_priv->user_irq_lock, irqflags); 1472
1473 /* maintain vblank delivery even in deep C-states */
1474 if (dev_priv->info->gen == 3)
1475 I915_WRITE(INSTPM, INSTPM_AGPBUSY_DIS << 16);
1476 spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
1477
1478 return 0;
1479}
1480
1481static int ironlake_enable_vblank(struct drm_device *dev, int pipe)
1482{
1483 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
1484 unsigned long irqflags;
1485
1486 if (!i915_pipe_enabled(dev, pipe))
1487 return -EINVAL;
1488
1489 spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
1490 ironlake_enable_display_irq(dev_priv, (pipe == 0) ?
1491 DE_PIPEA_VBLANK: DE_PIPEB_VBLANK);
1492 spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
1493
1494 return 0;
1495}
1496
1497static int ivybridge_enable_vblank(struct drm_device *dev, int pipe)
1498{
1499 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
1500 unsigned long irqflags;
1501
1502 if (!i915_pipe_enabled(dev, pipe))
1503 return -EINVAL;
1504
1505 spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
1506 ironlake_enable_display_irq(dev_priv, (pipe == 0) ?
1507 DE_PIPEA_VBLANK_IVB : DE_PIPEB_VBLANK_IVB);
1508 spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
1509
1228 return 0; 1510 return 0;
1229} 1511}
1230 1512
1231/* Called from drm generic code, passed 'crtc' which 1513/* Called from drm generic code, passed 'crtc' which
1232 * we use as a pipe index 1514 * we use as a pipe index
1233 */ 1515 */
1234void i915_disable_vblank(struct drm_device *dev, int pipe) 1516static void i915_disable_vblank(struct drm_device *dev, int pipe)
1235{ 1517{
1236 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 1518 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
1237 unsigned long irqflags; 1519 unsigned long irqflags;
1238 1520
1239 spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags); 1521 spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
1240 if (HAS_PCH_SPLIT(dev)) 1522 if (dev_priv->info->gen == 3)
1241 ironlake_disable_display_irq(dev_priv, (pipe == 0) ? 1523 I915_WRITE(INSTPM,
1242 DE_PIPEA_VBLANK: DE_PIPEB_VBLANK); 1524 INSTPM_AGPBUSY_DIS << 16 | INSTPM_AGPBUSY_DIS);
1243 else 1525
1244 i915_disable_pipestat(dev_priv, pipe, 1526 i915_disable_pipestat(dev_priv, pipe,
1245 PIPE_VBLANK_INTERRUPT_ENABLE | 1527 PIPE_VBLANK_INTERRUPT_ENABLE |
1246 PIPE_START_VBLANK_INTERRUPT_ENABLE); 1528 PIPE_START_VBLANK_INTERRUPT_ENABLE);
1247 spin_unlock_irqrestore(&dev_priv->user_irq_lock, irqflags); 1529 spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
1248} 1530}
1249 1531
1250void i915_enable_interrupt (struct drm_device *dev) 1532static void ironlake_disable_vblank(struct drm_device *dev, int pipe)
1251{ 1533{
1252 struct drm_i915_private *dev_priv = dev->dev_private; 1534 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
1535 unsigned long irqflags;
1253 1536
1254 if (!HAS_PCH_SPLIT(dev)) 1537 spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
1255 opregion_enable_asle(dev); 1538 ironlake_disable_display_irq(dev_priv, (pipe == 0) ?
1256 dev_priv->irq_enabled = 1; 1539 DE_PIPEA_VBLANK: DE_PIPEB_VBLANK);
1540 spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
1257} 1541}
1258 1542
1543static void ivybridge_disable_vblank(struct drm_device *dev, int pipe)
1544{
1545 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
1546 unsigned long irqflags;
1547
1548 spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
1549 ironlake_disable_display_irq(dev_priv, (pipe == 0) ?
1550 DE_PIPEA_VBLANK_IVB : DE_PIPEB_VBLANK_IVB);
1551 spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
1552}
1259 1553
1260/* Set the vblank monitor pipe 1554/* Set the vblank monitor pipe
1261 */ 1555 */
@@ -1311,12 +1605,50 @@ int i915_vblank_swap(struct drm_device *dev, void *data,
1311 return -EINVAL; 1605 return -EINVAL;
1312} 1606}
1313 1607
1314struct drm_i915_gem_request * 1608static u32
1315i915_get_tail_request(struct drm_device *dev) 1609ring_last_seqno(struct intel_ring_buffer *ring)
1316{ 1610{
1317 drm_i915_private_t *dev_priv = dev->dev_private; 1611 return list_entry(ring->request_list.prev,
1318 return list_entry(dev_priv->render_ring.request_list.prev, 1612 struct drm_i915_gem_request, list)->seqno;
1319 struct drm_i915_gem_request, list); 1613}
1614
1615static bool i915_hangcheck_ring_idle(struct intel_ring_buffer *ring, bool *err)
1616{
1617 if (list_empty(&ring->request_list) ||
1618 i915_seqno_passed(ring->get_seqno(ring), ring_last_seqno(ring))) {
1619 /* Issue a wake-up to catch stuck h/w. */
1620 if (ring->waiting_seqno && waitqueue_active(&ring->irq_queue)) {
1621 DRM_ERROR("Hangcheck timer elapsed... %s idle [waiting on %d, at %d], missed IRQ?\n",
1622 ring->name,
1623 ring->waiting_seqno,
1624 ring->get_seqno(ring));
1625 wake_up_all(&ring->irq_queue);
1626 *err = true;
1627 }
1628 return true;
1629 }
1630 return false;
1631}
1632
1633static bool kick_ring(struct intel_ring_buffer *ring)
1634{
1635 struct drm_device *dev = ring->dev;
1636 struct drm_i915_private *dev_priv = dev->dev_private;
1637 u32 tmp = I915_READ_CTL(ring);
1638 if (tmp & RING_WAIT) {
1639 DRM_ERROR("Kicking stuck wait on %s\n",
1640 ring->name);
1641 I915_WRITE_CTL(ring, tmp);
1642 return true;
1643 }
1644 if (IS_GEN6(dev) &&
1645 (tmp & RING_WAIT_SEMAPHORE)) {
1646 DRM_ERROR("Kicking stuck semaphore on %s\n",
1647 ring->name);
1648 I915_WRITE_CTL(ring, tmp);
1649 return true;
1650 }
1651 return false;
1320} 1652}
1321 1653
1322/** 1654/**
@@ -1330,12 +1662,19 @@ void i915_hangcheck_elapsed(unsigned long data)
1330 struct drm_device *dev = (struct drm_device *)data; 1662 struct drm_device *dev = (struct drm_device *)data;
1331 drm_i915_private_t *dev_priv = dev->dev_private; 1663 drm_i915_private_t *dev_priv = dev->dev_private;
1332 uint32_t acthd, instdone, instdone1; 1664 uint32_t acthd, instdone, instdone1;
1665 bool err = false;
1333 1666
1334 /* No reset support on this chip yet. */ 1667 /* If all work is done then ACTHD clearly hasn't advanced. */
1335 if (IS_GEN6(dev)) 1668 if (i915_hangcheck_ring_idle(&dev_priv->ring[RCS], &err) &&
1669 i915_hangcheck_ring_idle(&dev_priv->ring[VCS], &err) &&
1670 i915_hangcheck_ring_idle(&dev_priv->ring[BCS], &err)) {
1671 dev_priv->hangcheck_count = 0;
1672 if (err)
1673 goto repeat;
1336 return; 1674 return;
1675 }
1337 1676
1338 if (!IS_I965G(dev)) { 1677 if (INTEL_INFO(dev)->gen < 4) {
1339 acthd = I915_READ(ACTHD); 1678 acthd = I915_READ(ACTHD);
1340 instdone = I915_READ(INSTDONE); 1679 instdone = I915_READ(INSTDONE);
1341 instdone1 = 0; 1680 instdone1 = 0;
@@ -1345,38 +1684,31 @@ void i915_hangcheck_elapsed(unsigned long data)
1345 instdone1 = I915_READ(INSTDONE1); 1684 instdone1 = I915_READ(INSTDONE1);
1346 } 1685 }
1347 1686
1348 /* If all work is done then ACTHD clearly hasn't advanced. */
1349 if (list_empty(&dev_priv->render_ring.request_list) ||
1350 i915_seqno_passed(i915_get_gem_seqno(dev,
1351 &dev_priv->render_ring),
1352 i915_get_tail_request(dev)->seqno)) {
1353 bool missed_wakeup = false;
1354
1355 dev_priv->hangcheck_count = 0;
1356
1357 /* Issue a wake-up to catch stuck h/w. */
1358 if (dev_priv->render_ring.waiting_gem_seqno &&
1359 waitqueue_active(&dev_priv->render_ring.irq_queue)) {
1360 DRM_WAKEUP(&dev_priv->render_ring.irq_queue);
1361 missed_wakeup = true;
1362 }
1363
1364 if (dev_priv->bsd_ring.waiting_gem_seqno &&
1365 waitqueue_active(&dev_priv->bsd_ring.irq_queue)) {
1366 DRM_WAKEUP(&dev_priv->bsd_ring.irq_queue);
1367 missed_wakeup = true;
1368 }
1369
1370 if (missed_wakeup)
1371 DRM_ERROR("Hangcheck timer elapsed... GPU idle, missed IRQ.\n");
1372 return;
1373 }
1374
1375 if (dev_priv->last_acthd == acthd && 1687 if (dev_priv->last_acthd == acthd &&
1376 dev_priv->last_instdone == instdone && 1688 dev_priv->last_instdone == instdone &&
1377 dev_priv->last_instdone1 == instdone1) { 1689 dev_priv->last_instdone1 == instdone1) {
1378 if (dev_priv->hangcheck_count++ > 1) { 1690 if (dev_priv->hangcheck_count++ > 1) {
1379 DRM_ERROR("Hangcheck timer elapsed... GPU hung\n"); 1691 DRM_ERROR("Hangcheck timer elapsed... GPU hung\n");
1692
1693 if (!IS_GEN2(dev)) {
1694 /* Is the chip hanging on a WAIT_FOR_EVENT?
1695 * If so we can simply poke the RB_WAIT bit
1696 * and break the hang. This should work on
1697 * all but the second generation chipsets.
1698 */
1699
1700 if (kick_ring(&dev_priv->ring[RCS]))
1701 goto repeat;
1702
1703 if (HAS_BSD(dev) &&
1704 kick_ring(&dev_priv->ring[VCS]))
1705 goto repeat;
1706
1707 if (HAS_BLT(dev) &&
1708 kick_ring(&dev_priv->ring[BCS]))
1709 goto repeat;
1710 }
1711
1380 i915_handle_error(dev, true); 1712 i915_handle_error(dev, true);
1381 return; 1713 return;
1382 } 1714 }
@@ -1388,8 +1720,10 @@ void i915_hangcheck_elapsed(unsigned long data)
1388 dev_priv->last_instdone1 = instdone1; 1720 dev_priv->last_instdone1 = instdone1;
1389 } 1721 }
1390 1722
1723repeat:
1391 /* Reset timer case chip hangs without another request being added */ 1724 /* Reset timer case chip hangs without another request being added */
1392 mod_timer(&dev_priv->hangcheck_timer, jiffies + DRM_I915_HANGCHECK_PERIOD); 1725 mod_timer(&dev_priv->hangcheck_timer,
1726 jiffies + msecs_to_jiffies(DRM_I915_HANGCHECK_PERIOD));
1393} 1727}
1394 1728
1395/* drm_dma.h hooks 1729/* drm_dma.h hooks
@@ -1398,23 +1732,41 @@ static void ironlake_irq_preinstall(struct drm_device *dev)
1398{ 1732{
1399 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 1733 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
1400 1734
1735 atomic_set(&dev_priv->irq_received, 0);
1736
1737 INIT_WORK(&dev_priv->hotplug_work, i915_hotplug_work_func);
1738 INIT_WORK(&dev_priv->error_work, i915_error_work_func);
1739 if (IS_GEN6(dev) || IS_IVYBRIDGE(dev))
1740 INIT_WORK(&dev_priv->rps_work, gen6_pm_rps_work);
1741
1401 I915_WRITE(HWSTAM, 0xeffe); 1742 I915_WRITE(HWSTAM, 0xeffe);
1743 if (IS_GEN6(dev) || IS_GEN7(dev)) {
1744 /* Workaround stalls observed on Sandy Bridge GPUs by
1745 * making the blitter command streamer generate a
1746 * write to the Hardware Status Page for
1747 * MI_USER_INTERRUPT. This appears to serialize the
1748 * previous seqno write out before the interrupt
1749 * happens.
1750 */
1751 I915_WRITE(GEN6_BLITTER_HWSTAM, ~GEN6_BLITTER_USER_INTERRUPT);
1752 I915_WRITE(GEN6_BSD_HWSTAM, ~GEN6_BSD_USER_INTERRUPT);
1753 }
1402 1754
1403 /* XXX hotplug from PCH */ 1755 /* XXX hotplug from PCH */
1404 1756
1405 I915_WRITE(DEIMR, 0xffffffff); 1757 I915_WRITE(DEIMR, 0xffffffff);
1406 I915_WRITE(DEIER, 0x0); 1758 I915_WRITE(DEIER, 0x0);
1407 (void) I915_READ(DEIER); 1759 POSTING_READ(DEIER);
1408 1760
1409 /* and GT */ 1761 /* and GT */
1410 I915_WRITE(GTIMR, 0xffffffff); 1762 I915_WRITE(GTIMR, 0xffffffff);
1411 I915_WRITE(GTIER, 0x0); 1763 I915_WRITE(GTIER, 0x0);
1412 (void) I915_READ(GTIER); 1764 POSTING_READ(GTIER);
1413 1765
1414 /* south display irq */ 1766 /* south display irq */
1415 I915_WRITE(SDEIMR, 0xffffffff); 1767 I915_WRITE(SDEIMR, 0xffffffff);
1416 I915_WRITE(SDEIER, 0x0); 1768 I915_WRITE(SDEIER, 0x0);
1417 (void) I915_READ(SDEIER); 1769 POSTING_READ(SDEIER);
1418} 1770}
1419 1771
1420static int ironlake_irq_postinstall(struct drm_device *dev) 1772static int ironlake_irq_postinstall(struct drm_device *dev)
@@ -1423,40 +1775,61 @@ static int ironlake_irq_postinstall(struct drm_device *dev)
1423 /* enable kind of interrupts always enabled */ 1775 /* enable kind of interrupts always enabled */
1424 u32 display_mask = DE_MASTER_IRQ_CONTROL | DE_GSE | DE_PCH_EVENT | 1776 u32 display_mask = DE_MASTER_IRQ_CONTROL | DE_GSE | DE_PCH_EVENT |
1425 DE_PLANEA_FLIP_DONE | DE_PLANEB_FLIP_DONE; 1777 DE_PLANEA_FLIP_DONE | DE_PLANEB_FLIP_DONE;
1426 u32 render_mask = GT_PIPE_NOTIFY | GT_BSD_USER_INTERRUPT; 1778 u32 render_irqs;
1427 u32 hotplug_mask = SDE_CRT_HOTPLUG | SDE_PORTB_HOTPLUG | 1779 u32 hotplug_mask;
1428 SDE_PORTC_HOTPLUG | SDE_PORTD_HOTPLUG; 1780
1781 DRM_INIT_WAITQUEUE(&dev_priv->ring[RCS].irq_queue);
1782 if (HAS_BSD(dev))
1783 DRM_INIT_WAITQUEUE(&dev_priv->ring[VCS].irq_queue);
1784 if (HAS_BLT(dev))
1785 DRM_INIT_WAITQUEUE(&dev_priv->ring[BCS].irq_queue);
1429 1786
1430 dev_priv->irq_mask_reg = ~display_mask; 1787 dev_priv->vblank_pipe = DRM_I915_VBLANK_PIPE_A | DRM_I915_VBLANK_PIPE_B;
1431 dev_priv->de_irq_enable_reg = display_mask | DE_PIPEA_VBLANK | DE_PIPEB_VBLANK; 1788 dev_priv->irq_mask = ~display_mask;
1432 1789
1433 /* should always can generate irq */ 1790 /* should always can generate irq */
1434 I915_WRITE(DEIIR, I915_READ(DEIIR)); 1791 I915_WRITE(DEIIR, I915_READ(DEIIR));
1435 I915_WRITE(DEIMR, dev_priv->irq_mask_reg); 1792 I915_WRITE(DEIMR, dev_priv->irq_mask);
1436 I915_WRITE(DEIER, dev_priv->de_irq_enable_reg); 1793 I915_WRITE(DEIER, display_mask | DE_PIPEA_VBLANK | DE_PIPEB_VBLANK);
1437 (void) I915_READ(DEIER); 1794 POSTING_READ(DEIER);
1438
1439 /* Gen6 only needs render pipe_control now */
1440 if (IS_GEN6(dev))
1441 render_mask = GT_PIPE_NOTIFY;
1442 1795
1443 dev_priv->gt_irq_mask_reg = ~render_mask; 1796 dev_priv->gt_irq_mask = ~0;
1444 dev_priv->gt_irq_enable_reg = render_mask;
1445 1797
1446 I915_WRITE(GTIIR, I915_READ(GTIIR)); 1798 I915_WRITE(GTIIR, I915_READ(GTIIR));
1447 I915_WRITE(GTIMR, dev_priv->gt_irq_mask_reg); 1799 I915_WRITE(GTIMR, dev_priv->gt_irq_mask);
1800
1448 if (IS_GEN6(dev)) 1801 if (IS_GEN6(dev))
1449 I915_WRITE(GEN6_RENDER_IMR, ~GEN6_RENDER_PIPE_CONTROL_NOTIFY_INTERRUPT); 1802 render_irqs =
1450 I915_WRITE(GTIER, dev_priv->gt_irq_enable_reg); 1803 GT_USER_INTERRUPT |
1451 (void) I915_READ(GTIER); 1804 GT_GEN6_BSD_USER_INTERRUPT |
1805 GT_BLT_USER_INTERRUPT;
1806 else
1807 render_irqs =
1808 GT_USER_INTERRUPT |
1809 GT_PIPE_NOTIFY |
1810 GT_BSD_USER_INTERRUPT;
1811 I915_WRITE(GTIER, render_irqs);
1812 POSTING_READ(GTIER);
1813
1814 if (HAS_PCH_CPT(dev)) {
1815 hotplug_mask = (SDE_CRT_HOTPLUG_CPT |
1816 SDE_PORTB_HOTPLUG_CPT |
1817 SDE_PORTC_HOTPLUG_CPT |
1818 SDE_PORTD_HOTPLUG_CPT);
1819 } else {
1820 hotplug_mask = (SDE_CRT_HOTPLUG |
1821 SDE_PORTB_HOTPLUG |
1822 SDE_PORTC_HOTPLUG |
1823 SDE_PORTD_HOTPLUG |
1824 SDE_AUX_MASK);
1825 }
1452 1826
1453 dev_priv->pch_irq_mask_reg = ~hotplug_mask; 1827 dev_priv->pch_irq_mask = ~hotplug_mask;
1454 dev_priv->pch_irq_enable_reg = hotplug_mask;
1455 1828
1456 I915_WRITE(SDEIIR, I915_READ(SDEIIR)); 1829 I915_WRITE(SDEIIR, I915_READ(SDEIIR));
1457 I915_WRITE(SDEIMR, dev_priv->pch_irq_mask_reg); 1830 I915_WRITE(SDEIMR, dev_priv->pch_irq_mask);
1458 I915_WRITE(SDEIER, dev_priv->pch_irq_enable_reg); 1831 I915_WRITE(SDEIER, hotplug_mask);
1459 (void) I915_READ(SDEIER); 1832 POSTING_READ(SDEIER);
1460 1833
1461 if (IS_IRONLAKE_M(dev)) { 1834 if (IS_IRONLAKE_M(dev)) {
1462 /* Clear & enable PCU event interrupts */ 1835 /* Clear & enable PCU event interrupts */
@@ -1468,55 +1841,93 @@ static int ironlake_irq_postinstall(struct drm_device *dev)
1468 return 0; 1841 return 0;
1469} 1842}
1470 1843
1471void i915_driver_irq_preinstall(struct drm_device * dev) 1844static int ivybridge_irq_postinstall(struct drm_device *dev)
1845{
1846 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
1847 /* enable kind of interrupts always enabled */
1848 u32 display_mask = DE_MASTER_IRQ_CONTROL | DE_GSE_IVB |
1849 DE_PCH_EVENT_IVB | DE_PLANEA_FLIP_DONE_IVB |
1850 DE_PLANEB_FLIP_DONE_IVB;
1851 u32 render_irqs;
1852 u32 hotplug_mask;
1853
1854 DRM_INIT_WAITQUEUE(&dev_priv->ring[RCS].irq_queue);
1855 if (HAS_BSD(dev))
1856 DRM_INIT_WAITQUEUE(&dev_priv->ring[VCS].irq_queue);
1857 if (HAS_BLT(dev))
1858 DRM_INIT_WAITQUEUE(&dev_priv->ring[BCS].irq_queue);
1859
1860 dev_priv->vblank_pipe = DRM_I915_VBLANK_PIPE_A | DRM_I915_VBLANK_PIPE_B;
1861 dev_priv->irq_mask = ~display_mask;
1862
1863 /* should always can generate irq */
1864 I915_WRITE(DEIIR, I915_READ(DEIIR));
1865 I915_WRITE(DEIMR, dev_priv->irq_mask);
1866 I915_WRITE(DEIER, display_mask | DE_PIPEA_VBLANK_IVB |
1867 DE_PIPEB_VBLANK_IVB);
1868 POSTING_READ(DEIER);
1869
1870 dev_priv->gt_irq_mask = ~0;
1871
1872 I915_WRITE(GTIIR, I915_READ(GTIIR));
1873 I915_WRITE(GTIMR, dev_priv->gt_irq_mask);
1874
1875 render_irqs = GT_USER_INTERRUPT | GT_GEN6_BSD_USER_INTERRUPT |
1876 GT_BLT_USER_INTERRUPT;
1877 I915_WRITE(GTIER, render_irqs);
1878 POSTING_READ(GTIER);
1879
1880 hotplug_mask = (SDE_CRT_HOTPLUG_CPT |
1881 SDE_PORTB_HOTPLUG_CPT |
1882 SDE_PORTC_HOTPLUG_CPT |
1883 SDE_PORTD_HOTPLUG_CPT);
1884 dev_priv->pch_irq_mask = ~hotplug_mask;
1885
1886 I915_WRITE(SDEIIR, I915_READ(SDEIIR));
1887 I915_WRITE(SDEIMR, dev_priv->pch_irq_mask);
1888 I915_WRITE(SDEIER, hotplug_mask);
1889 POSTING_READ(SDEIER);
1890
1891 return 0;
1892}
1893
1894static void i915_driver_irq_preinstall(struct drm_device * dev)
1472{ 1895{
1473 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 1896 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
1897 int pipe;
1474 1898
1475 atomic_set(&dev_priv->irq_received, 0); 1899 atomic_set(&dev_priv->irq_received, 0);
1476 1900
1477 INIT_WORK(&dev_priv->hotplug_work, i915_hotplug_work_func); 1901 INIT_WORK(&dev_priv->hotplug_work, i915_hotplug_work_func);
1478 INIT_WORK(&dev_priv->error_work, i915_error_work_func); 1902 INIT_WORK(&dev_priv->error_work, i915_error_work_func);
1479 1903
1480 if (HAS_PCH_SPLIT(dev)) {
1481 ironlake_irq_preinstall(dev);
1482 return;
1483 }
1484
1485 if (I915_HAS_HOTPLUG(dev)) { 1904 if (I915_HAS_HOTPLUG(dev)) {
1486 I915_WRITE(PORT_HOTPLUG_EN, 0); 1905 I915_WRITE(PORT_HOTPLUG_EN, 0);
1487 I915_WRITE(PORT_HOTPLUG_STAT, I915_READ(PORT_HOTPLUG_STAT)); 1906 I915_WRITE(PORT_HOTPLUG_STAT, I915_READ(PORT_HOTPLUG_STAT));
1488 } 1907 }
1489 1908
1490 I915_WRITE(HWSTAM, 0xeffe); 1909 I915_WRITE(HWSTAM, 0xeffe);
1491 I915_WRITE(PIPEASTAT, 0); 1910 for_each_pipe(pipe)
1492 I915_WRITE(PIPEBSTAT, 0); 1911 I915_WRITE(PIPESTAT(pipe), 0);
1493 I915_WRITE(IMR, 0xffffffff); 1912 I915_WRITE(IMR, 0xffffffff);
1494 I915_WRITE(IER, 0x0); 1913 I915_WRITE(IER, 0x0);
1495 (void) I915_READ(IER); 1914 POSTING_READ(IER);
1496} 1915}
1497 1916
1498/* 1917/*
1499 * Must be called after intel_modeset_init or hotplug interrupts won't be 1918 * Must be called after intel_modeset_init or hotplug interrupts won't be
1500 * enabled correctly. 1919 * enabled correctly.
1501 */ 1920 */
1502int i915_driver_irq_postinstall(struct drm_device *dev) 1921static int i915_driver_irq_postinstall(struct drm_device *dev)
1503{ 1922{
1504 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 1923 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
1505 u32 enable_mask = I915_INTERRUPT_ENABLE_FIX | I915_INTERRUPT_ENABLE_VAR; 1924 u32 enable_mask = I915_INTERRUPT_ENABLE_FIX | I915_INTERRUPT_ENABLE_VAR;
1506 u32 error_mask; 1925 u32 error_mask;
1507 1926
1508 DRM_INIT_WAITQUEUE(&dev_priv->render_ring.irq_queue);
1509
1510 if (HAS_BSD(dev))
1511 DRM_INIT_WAITQUEUE(&dev_priv->bsd_ring.irq_queue);
1512
1513 dev_priv->vblank_pipe = DRM_I915_VBLANK_PIPE_A | DRM_I915_VBLANK_PIPE_B; 1927 dev_priv->vblank_pipe = DRM_I915_VBLANK_PIPE_A | DRM_I915_VBLANK_PIPE_B;
1514 1928
1515 if (HAS_PCH_SPLIT(dev))
1516 return ironlake_irq_postinstall(dev);
1517
1518 /* Unmask the interrupts that we always want on. */ 1929 /* Unmask the interrupts that we always want on. */
1519 dev_priv->irq_mask_reg = ~I915_INTERRUPT_ENABLE_FIX; 1930 dev_priv->irq_mask = ~I915_INTERRUPT_ENABLE_FIX;
1520 1931
1521 dev_priv->pipestat[0] = 0; 1932 dev_priv->pipestat[0] = 0;
1522 dev_priv->pipestat[1] = 0; 1933 dev_priv->pipestat[1] = 0;
@@ -1525,7 +1936,7 @@ int i915_driver_irq_postinstall(struct drm_device *dev)
1525 /* Enable in IER... */ 1936 /* Enable in IER... */
1526 enable_mask |= I915_DISPLAY_PORT_INTERRUPT; 1937 enable_mask |= I915_DISPLAY_PORT_INTERRUPT;
1527 /* and unmask in IMR */ 1938 /* and unmask in IMR */
1528 dev_priv->irq_mask_reg &= ~I915_DISPLAY_PORT_INTERRUPT; 1939 dev_priv->irq_mask &= ~I915_DISPLAY_PORT_INTERRUPT;
1529 } 1940 }
1530 1941
1531 /* 1942 /*
@@ -1543,9 +1954,9 @@ int i915_driver_irq_postinstall(struct drm_device *dev)
1543 } 1954 }
1544 I915_WRITE(EMR, error_mask); 1955 I915_WRITE(EMR, error_mask);
1545 1956
1546 I915_WRITE(IMR, dev_priv->irq_mask_reg); 1957 I915_WRITE(IMR, dev_priv->irq_mask);
1547 I915_WRITE(IER, enable_mask); 1958 I915_WRITE(IER, enable_mask);
1548 (void) I915_READ(IER); 1959 POSTING_READ(IER);
1549 1960
1550 if (I915_HAS_HOTPLUG(dev)) { 1961 if (I915_HAS_HOTPLUG(dev)) {
1551 u32 hotplug_en = I915_READ(PORT_HOTPLUG_EN); 1962 u32 hotplug_en = I915_READ(PORT_HOTPLUG_EN);
@@ -1578,7 +1989,7 @@ int i915_driver_irq_postinstall(struct drm_device *dev)
1578 I915_WRITE(PORT_HOTPLUG_EN, hotplug_en); 1989 I915_WRITE(PORT_HOTPLUG_EN, hotplug_en);
1579 } 1990 }
1580 1991
1581 opregion_enable_asle(dev); 1992 intel_opregion_enable_asle(dev);
1582 1993
1583 return 0; 1994 return 0;
1584} 1995}
@@ -1586,6 +1997,12 @@ int i915_driver_irq_postinstall(struct drm_device *dev)
1586static void ironlake_irq_uninstall(struct drm_device *dev) 1997static void ironlake_irq_uninstall(struct drm_device *dev)
1587{ 1998{
1588 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 1999 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
2000
2001 if (!dev_priv)
2002 return;
2003
2004 dev_priv->vblank_pipe = 0;
2005
1589 I915_WRITE(HWSTAM, 0xffffffff); 2006 I915_WRITE(HWSTAM, 0xffffffff);
1590 2007
1591 I915_WRITE(DEIMR, 0xffffffff); 2008 I915_WRITE(DEIMR, 0xffffffff);
@@ -1597,32 +2014,67 @@ static void ironlake_irq_uninstall(struct drm_device *dev)
1597 I915_WRITE(GTIIR, I915_READ(GTIIR)); 2014 I915_WRITE(GTIIR, I915_READ(GTIIR));
1598} 2015}
1599 2016
1600void i915_driver_irq_uninstall(struct drm_device * dev) 2017static void i915_driver_irq_uninstall(struct drm_device * dev)
1601{ 2018{
1602 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 2019 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
2020 int pipe;
1603 2021
1604 if (!dev_priv) 2022 if (!dev_priv)
1605 return; 2023 return;
1606 2024
1607 dev_priv->vblank_pipe = 0; 2025 dev_priv->vblank_pipe = 0;
1608 2026
1609 if (HAS_PCH_SPLIT(dev)) {
1610 ironlake_irq_uninstall(dev);
1611 return;
1612 }
1613
1614 if (I915_HAS_HOTPLUG(dev)) { 2027 if (I915_HAS_HOTPLUG(dev)) {
1615 I915_WRITE(PORT_HOTPLUG_EN, 0); 2028 I915_WRITE(PORT_HOTPLUG_EN, 0);
1616 I915_WRITE(PORT_HOTPLUG_STAT, I915_READ(PORT_HOTPLUG_STAT)); 2029 I915_WRITE(PORT_HOTPLUG_STAT, I915_READ(PORT_HOTPLUG_STAT));
1617 } 2030 }
1618 2031
1619 I915_WRITE(HWSTAM, 0xffffffff); 2032 I915_WRITE(HWSTAM, 0xffffffff);
1620 I915_WRITE(PIPEASTAT, 0); 2033 for_each_pipe(pipe)
1621 I915_WRITE(PIPEBSTAT, 0); 2034 I915_WRITE(PIPESTAT(pipe), 0);
1622 I915_WRITE(IMR, 0xffffffff); 2035 I915_WRITE(IMR, 0xffffffff);
1623 I915_WRITE(IER, 0x0); 2036 I915_WRITE(IER, 0x0);
1624 2037
1625 I915_WRITE(PIPEASTAT, I915_READ(PIPEASTAT) & 0x8000ffff); 2038 for_each_pipe(pipe)
1626 I915_WRITE(PIPEBSTAT, I915_READ(PIPEBSTAT) & 0x8000ffff); 2039 I915_WRITE(PIPESTAT(pipe),
2040 I915_READ(PIPESTAT(pipe)) & 0x8000ffff);
1627 I915_WRITE(IIR, I915_READ(IIR)); 2041 I915_WRITE(IIR, I915_READ(IIR));
1628} 2042}
2043
2044void intel_irq_init(struct drm_device *dev)
2045{
2046 dev->driver->get_vblank_counter = i915_get_vblank_counter;
2047 dev->max_vblank_count = 0xffffff; /* only 24 bits of frame count */
2048 if (IS_G4X(dev) || IS_GEN5(dev) || IS_GEN6(dev) || IS_IVYBRIDGE(dev)) {
2049 dev->max_vblank_count = 0xffffffff; /* full 32 bit counter */
2050 dev->driver->get_vblank_counter = gm45_get_vblank_counter;
2051 }
2052
2053
2054 dev->driver->get_vblank_timestamp = i915_get_vblank_timestamp;
2055 dev->driver->get_scanout_position = i915_get_crtc_scanoutpos;
2056
2057 if (IS_IVYBRIDGE(dev)) {
2058 /* Share pre & uninstall handlers with ILK/SNB */
2059 dev->driver->irq_handler = ivybridge_irq_handler;
2060 dev->driver->irq_preinstall = ironlake_irq_preinstall;
2061 dev->driver->irq_postinstall = ivybridge_irq_postinstall;
2062 dev->driver->irq_uninstall = ironlake_irq_uninstall;
2063 dev->driver->enable_vblank = ivybridge_enable_vblank;
2064 dev->driver->disable_vblank = ivybridge_disable_vblank;
2065 } else if (HAS_PCH_SPLIT(dev)) {
2066 dev->driver->irq_handler = ironlake_irq_handler;
2067 dev->driver->irq_preinstall = ironlake_irq_preinstall;
2068 dev->driver->irq_postinstall = ironlake_irq_postinstall;
2069 dev->driver->irq_uninstall = ironlake_irq_uninstall;
2070 dev->driver->enable_vblank = ironlake_enable_vblank;
2071 dev->driver->disable_vblank = ironlake_disable_vblank;
2072 } else {
2073 dev->driver->irq_preinstall = i915_driver_irq_preinstall;
2074 dev->driver->irq_postinstall = i915_driver_irq_postinstall;
2075 dev->driver->irq_uninstall = i915_driver_irq_uninstall;
2076 dev->driver->irq_handler = i915_driver_irq_handler;
2077 dev->driver->enable_vblank = i915_enable_vblank;
2078 dev->driver->disable_vblank = i915_disable_vblank;
2079 }
2080}
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 4f5e15577e89..5d5def756c9e 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -25,52 +25,16 @@
25#ifndef _I915_REG_H_ 25#ifndef _I915_REG_H_
26#define _I915_REG_H_ 26#define _I915_REG_H_
27 27
28#define _PIPE(pipe, a, b) ((a) + (pipe)*((b)-(a)))
29
28/* 30/*
29 * The Bridge device's PCI config space has information about the 31 * The Bridge device's PCI config space has information about the
30 * fb aperture size and the amount of pre-reserved memory. 32 * fb aperture size and the amount of pre-reserved memory.
33 * This is all handled in the intel-gtt.ko module. i915.ko only
34 * cares about the vga bit for the vga rbiter.
31 */ 35 */
32#define INTEL_GMCH_CTRL 0x52 36#define INTEL_GMCH_CTRL 0x52
33#define INTEL_GMCH_VGA_DISABLE (1 << 1) 37#define INTEL_GMCH_VGA_DISABLE (1 << 1)
34#define INTEL_GMCH_ENABLED 0x4
35#define INTEL_GMCH_MEM_MASK 0x1
36#define INTEL_GMCH_MEM_64M 0x1
37#define INTEL_GMCH_MEM_128M 0
38
39#define INTEL_GMCH_GMS_MASK (0xf << 4)
40#define INTEL_855_GMCH_GMS_DISABLED (0x0 << 4)
41#define INTEL_855_GMCH_GMS_STOLEN_1M (0x1 << 4)
42#define INTEL_855_GMCH_GMS_STOLEN_4M (0x2 << 4)
43#define INTEL_855_GMCH_GMS_STOLEN_8M (0x3 << 4)
44#define INTEL_855_GMCH_GMS_STOLEN_16M (0x4 << 4)
45#define INTEL_855_GMCH_GMS_STOLEN_32M (0x5 << 4)
46
47#define INTEL_915G_GMCH_GMS_STOLEN_48M (0x6 << 4)
48#define INTEL_915G_GMCH_GMS_STOLEN_64M (0x7 << 4)
49#define INTEL_GMCH_GMS_STOLEN_128M (0x8 << 4)
50#define INTEL_GMCH_GMS_STOLEN_256M (0x9 << 4)
51#define INTEL_GMCH_GMS_STOLEN_96M (0xa << 4)
52#define INTEL_GMCH_GMS_STOLEN_160M (0xb << 4)
53#define INTEL_GMCH_GMS_STOLEN_224M (0xc << 4)
54#define INTEL_GMCH_GMS_STOLEN_352M (0xd << 4)
55
56#define SNB_GMCH_CTRL 0x50
57#define SNB_GMCH_GMS_STOLEN_MASK 0xF8
58#define SNB_GMCH_GMS_STOLEN_32M (1 << 3)
59#define SNB_GMCH_GMS_STOLEN_64M (2 << 3)
60#define SNB_GMCH_GMS_STOLEN_96M (3 << 3)
61#define SNB_GMCH_GMS_STOLEN_128M (4 << 3)
62#define SNB_GMCH_GMS_STOLEN_160M (5 << 3)
63#define SNB_GMCH_GMS_STOLEN_192M (6 << 3)
64#define SNB_GMCH_GMS_STOLEN_224M (7 << 3)
65#define SNB_GMCH_GMS_STOLEN_256M (8 << 3)
66#define SNB_GMCH_GMS_STOLEN_288M (9 << 3)
67#define SNB_GMCH_GMS_STOLEN_320M (0xa << 3)
68#define SNB_GMCH_GMS_STOLEN_352M (0xb << 3)
69#define SNB_GMCH_GMS_STOLEN_384M (0xc << 3)
70#define SNB_GMCH_GMS_STOLEN_416M (0xd << 3)
71#define SNB_GMCH_GMS_STOLEN_448M (0xe << 3)
72#define SNB_GMCH_GMS_STOLEN_480M (0xf << 3)
73#define SNB_GMCH_GMS_STOLEN_512M (0x10 << 3)
74 38
75/* PCI config space */ 39/* PCI config space */
76 40
@@ -106,10 +70,19 @@
106#define I915_GC_RENDER_CLOCK_200_MHZ (1 << 0) 70#define I915_GC_RENDER_CLOCK_200_MHZ (1 << 0)
107#define I915_GC_RENDER_CLOCK_333_MHZ (4 << 0) 71#define I915_GC_RENDER_CLOCK_333_MHZ (4 << 0)
108#define LBB 0xf4 72#define LBB 0xf4
109#define GDRST 0xc0 73
110#define GDRST_FULL (0<<2) 74/* Graphics reset regs */
111#define GDRST_RENDER (1<<2) 75#define I965_GDRST 0xc0 /* PCI config register */
112#define GDRST_MEDIA (3<<2) 76#define ILK_GDSR 0x2ca4 /* MCHBAR offset */
77#define GRDOM_FULL (0<<2)
78#define GRDOM_RENDER (1<<2)
79#define GRDOM_MEDIA (3<<2)
80
81#define GEN6_GDRST 0x941c
82#define GEN6_GRDOM_FULL (1 << 0)
83#define GEN6_GRDOM_RENDER (1 << 1)
84#define GEN6_GRDOM_MEDIA (1 << 2)
85#define GEN6_GRDOM_BLT (1 << 3)
113 86
114/* VGA stuff */ 87/* VGA stuff */
115 88
@@ -172,6 +145,8 @@
172#define MI_END_SCENE (1 << 4) /* flush binner and incr scene count */ 145#define MI_END_SCENE (1 << 4) /* flush binner and incr scene count */
173#define MI_INVALIDATE_ISP (1 << 5) /* invalidate indirect state pointers */ 146#define MI_INVALIDATE_ISP (1 << 5) /* invalidate indirect state pointers */
174#define MI_BATCH_BUFFER_END MI_INSTR(0x0a, 0) 147#define MI_BATCH_BUFFER_END MI_INSTR(0x0a, 0)
148#define MI_SUSPEND_FLUSH MI_INSTR(0x0b, 0)
149#define MI_SUSPEND_FLUSH_EN (1<<0)
175#define MI_REPORT_HEAD MI_INSTR(0x07, 0) 150#define MI_REPORT_HEAD MI_INSTR(0x07, 0)
176#define MI_OVERLAY_FLIP MI_INSTR(0x11,0) 151#define MI_OVERLAY_FLIP MI_INSTR(0x11,0)
177#define MI_OVERLAY_CONTINUE (0x0<<21) 152#define MI_OVERLAY_CONTINUE (0x0<<21)
@@ -186,17 +161,31 @@
186#define MI_MM_SPACE_PHYSICAL (0<<8) 161#define MI_MM_SPACE_PHYSICAL (0<<8)
187#define MI_SAVE_EXT_STATE_EN (1<<3) 162#define MI_SAVE_EXT_STATE_EN (1<<3)
188#define MI_RESTORE_EXT_STATE_EN (1<<2) 163#define MI_RESTORE_EXT_STATE_EN (1<<2)
164#define MI_FORCE_RESTORE (1<<1)
189#define MI_RESTORE_INHIBIT (1<<0) 165#define MI_RESTORE_INHIBIT (1<<0)
190#define MI_STORE_DWORD_IMM MI_INSTR(0x20, 1) 166#define MI_STORE_DWORD_IMM MI_INSTR(0x20, 1)
191#define MI_MEM_VIRTUAL (1 << 22) /* 965+ only */ 167#define MI_MEM_VIRTUAL (1 << 22) /* 965+ only */
192#define MI_STORE_DWORD_INDEX MI_INSTR(0x21, 1) 168#define MI_STORE_DWORD_INDEX MI_INSTR(0x21, 1)
193#define MI_STORE_DWORD_INDEX_SHIFT 2 169#define MI_STORE_DWORD_INDEX_SHIFT 2
194#define MI_LOAD_REGISTER_IMM MI_INSTR(0x22, 1) 170/* Official intel docs are somewhat sloppy concerning MI_LOAD_REGISTER_IMM:
171 * - Always issue a MI_NOOP _before_ the MI_LOAD_REGISTER_IMM - otherwise hw
172 * simply ignores the register load under certain conditions.
173 * - One can actually load arbitrary many arbitrary registers: Simply issue x
174 * address/value pairs. Don't overdue it, though, x <= 2^4 must hold!
175 */
176#define MI_LOAD_REGISTER_IMM(x) MI_INSTR(0x22, 2*x-1)
177#define MI_FLUSH_DW MI_INSTR(0x26, 1) /* for GEN6 */
178#define MI_INVALIDATE_TLB (1<<18)
179#define MI_INVALIDATE_BSD (1<<7)
195#define MI_BATCH_BUFFER MI_INSTR(0x30, 1) 180#define MI_BATCH_BUFFER MI_INSTR(0x30, 1)
196#define MI_BATCH_NON_SECURE (1) 181#define MI_BATCH_NON_SECURE (1)
197#define MI_BATCH_NON_SECURE_I965 (1<<8) 182#define MI_BATCH_NON_SECURE_I965 (1<<8)
198#define MI_BATCH_BUFFER_START MI_INSTR(0x31, 0) 183#define MI_BATCH_BUFFER_START MI_INSTR(0x31, 0)
199 184#define MI_SEMAPHORE_MBOX MI_INSTR(0x16, 1) /* gen6+ */
185#define MI_SEMAPHORE_GLOBAL_GTT (1<<22)
186#define MI_SEMAPHORE_UPDATE (1<<21)
187#define MI_SEMAPHORE_COMPARE (1<<20)
188#define MI_SEMAPHORE_REGISTER (1<<18)
200/* 189/*
201 * 3D instructions used by the kernel 190 * 3D instructions used by the kernel
202 */ 191 */
@@ -249,6 +238,16 @@
249#define PIPE_CONTROL_GLOBAL_GTT (1<<2) /* in addr dword */ 238#define PIPE_CONTROL_GLOBAL_GTT (1<<2) /* in addr dword */
250#define PIPE_CONTROL_STALL_EN (1<<1) /* in addr word, Ironlake+ only */ 239#define PIPE_CONTROL_STALL_EN (1<<1) /* in addr word, Ironlake+ only */
251 240
241
242/*
243 * Reset registers
244 */
245#define DEBUG_RESET_I830 0x6070
246#define DEBUG_RESET_FULL (1<<7)
247#define DEBUG_RESET_RENDER (1<<8)
248#define DEBUG_RESET_DISPLAY (1<<9)
249
250
252/* 251/*
253 * Fence registers 252 * Fence registers
254 */ 253 */
@@ -279,10 +278,25 @@
279 * Instruction and interrupt control regs 278 * Instruction and interrupt control regs
280 */ 279 */
281#define PGTBL_ER 0x02024 280#define PGTBL_ER 0x02024
282#define PRB0_TAIL 0x02030 281#define RENDER_RING_BASE 0x02000
283#define PRB0_HEAD 0x02034 282#define BSD_RING_BASE 0x04000
284#define PRB0_START 0x02038 283#define GEN6_BSD_RING_BASE 0x12000
285#define PRB0_CTL 0x0203c 284#define BLT_RING_BASE 0x22000
285#define RING_TAIL(base) ((base)+0x30)
286#define RING_HEAD(base) ((base)+0x34)
287#define RING_START(base) ((base)+0x38)
288#define RING_CTL(base) ((base)+0x3c)
289#define RING_SYNC_0(base) ((base)+0x40)
290#define RING_SYNC_1(base) ((base)+0x44)
291#define RING_MAX_IDLE(base) ((base)+0x54)
292#define RING_HWS_PGA(base) ((base)+0x80)
293#define RING_HWS_PGA_GEN6(base) ((base)+0x2080)
294#define RENDER_HWS_PGA_GEN7 (0x04080)
295#define BSD_HWS_PGA_GEN7 (0x04180)
296#define BLT_HWS_PGA_GEN7 (0x04280)
297#define RING_ACTHD(base) ((base)+0x74)
298#define RING_NOPID(base) ((base)+0x94)
299#define RING_IMR(base) ((base)+0xa8)
286#define TAIL_ADDR 0x001FFFF8 300#define TAIL_ADDR 0x001FFFF8
287#define HEAD_WRAP_COUNT 0xFFE00000 301#define HEAD_WRAP_COUNT 0xFFE00000
288#define HEAD_WRAP_ONE 0x00200000 302#define HEAD_WRAP_ONE 0x00200000
@@ -295,10 +309,19 @@
295#define RING_VALID_MASK 0x00000001 309#define RING_VALID_MASK 0x00000001
296#define RING_VALID 0x00000001 310#define RING_VALID 0x00000001
297#define RING_INVALID 0x00000000 311#define RING_INVALID 0x00000000
312#define RING_WAIT_I8XX (1<<0) /* gen2, PRBx_HEAD */
313#define RING_WAIT (1<<11) /* gen3+, PRBx_CTL */
314#define RING_WAIT_SEMAPHORE (1<<10) /* gen6+ */
315#if 0
316#define PRB0_TAIL 0x02030
317#define PRB0_HEAD 0x02034
318#define PRB0_START 0x02038
319#define PRB0_CTL 0x0203c
298#define PRB1_TAIL 0x02040 /* 915+ only */ 320#define PRB1_TAIL 0x02040 /* 915+ only */
299#define PRB1_HEAD 0x02044 /* 915+ only */ 321#define PRB1_HEAD 0x02044 /* 915+ only */
300#define PRB1_START 0x02048 /* 915+ only */ 322#define PRB1_START 0x02048 /* 915+ only */
301#define PRB1_CTL 0x0204c /* 915+ only */ 323#define PRB1_CTL 0x0204c /* 915+ only */
324#endif
302#define IPEIR_I965 0x02064 325#define IPEIR_I965 0x02064
303#define IPEHR_I965 0x02068 326#define IPEHR_I965 0x02068
304#define INSTDONE_I965 0x0206c 327#define INSTDONE_I965 0x0206c
@@ -306,7 +329,6 @@
306#define INSTDONE1 0x0207c /* 965+ only */ 329#define INSTDONE1 0x0207c /* 965+ only */
307#define ACTHD_I965 0x02074 330#define ACTHD_I965 0x02074
308#define HWS_PGA 0x02080 331#define HWS_PGA 0x02080
309#define HWS_PGA_GEN6 0x04080
310#define HWS_ADDRESS_MASK 0xfffff000 332#define HWS_ADDRESS_MASK 0xfffff000
311#define HWS_START_ADDRESS_SHIFT 4 333#define HWS_START_ADDRESS_SHIFT 4
312#define PWRCTXA 0x2088 /* 965GM+ only */ 334#define PWRCTXA 0x2088 /* 965GM+ only */
@@ -316,11 +338,42 @@
316#define INSTDONE 0x02090 338#define INSTDONE 0x02090
317#define NOPID 0x02094 339#define NOPID 0x02094
318#define HWSTAM 0x02098 340#define HWSTAM 0x02098
341#define VCS_INSTDONE 0x1206C
342#define VCS_IPEIR 0x12064
343#define VCS_IPEHR 0x12068
344#define VCS_ACTHD 0x12074
345#define BCS_INSTDONE 0x2206C
346#define BCS_IPEIR 0x22064
347#define BCS_IPEHR 0x22068
348#define BCS_ACTHD 0x22074
349
350#define ERROR_GEN6 0x040a0
351
352/* GM45+ chicken bits -- debug workaround bits that may be required
353 * for various sorts of correct behavior. The top 16 bits of each are
354 * the enables for writing to the corresponding low bit.
355 */
356#define _3D_CHICKEN 0x02084
357#define _3D_CHICKEN2 0x0208c
358/* Disables pipelining of read flushes past the SF-WIZ interface.
359 * Required on all Ironlake steppings according to the B-Spec, but the
360 * particular danger of not doing so is not specified.
361 */
362# define _3D_CHICKEN2_WM_READ_PIPELINED (1 << 14)
363#define _3D_CHICKEN3 0x02090
319 364
320#define MI_MODE 0x0209c 365#define MI_MODE 0x0209c
321# define VS_TIMER_DISPATCH (1 << 6) 366# define VS_TIMER_DISPATCH (1 << 6)
322# define MI_FLUSH_ENABLE (1 << 11) 367# define MI_FLUSH_ENABLE (1 << 11)
323 368
369#define GFX_MODE 0x02520
370#define GFX_RUN_LIST_ENABLE (1<<15)
371#define GFX_TLB_INVALIDATE_ALWAYS (1<<13)
372#define GFX_SURFACE_FAULT_ENABLE (1<<12)
373#define GFX_REPLAY_MODE (1<<11)
374#define GFX_PSMI_GRANULARITY (1<<10)
375#define GFX_PPGTT_ENABLE (1<<9)
376
324#define SCPD0 0x0209c /* 915+ only */ 377#define SCPD0 0x0209c /* 915+ only */
325#define IER 0x020a0 378#define IER 0x020a0
326#define IIR 0x020a4 379#define IIR 0x020a4
@@ -355,9 +408,12 @@
355#define I915_ERROR_INSTRUCTION (1<<0) 408#define I915_ERROR_INSTRUCTION (1<<0)
356#define INSTPM 0x020c0 409#define INSTPM 0x020c0
357#define INSTPM_SELF_EN (1<<12) /* 915GM only */ 410#define INSTPM_SELF_EN (1<<12) /* 915GM only */
411#define INSTPM_AGPBUSY_DIS (1<<11) /* gen3: when disabled, pending interrupts
412 will not assert AGPBUSY# and will only
413 be delivered when out of C3. */
358#define ACTHD 0x020c8 414#define ACTHD 0x020c8
359#define FW_BLC 0x020d8 415#define FW_BLC 0x020d8
360#define FW_BLC2 0x020dc 416#define FW_BLC2 0x020dc
361#define FW_BLC_SELF 0x020e0 /* 915+ only */ 417#define FW_BLC_SELF 0x020e0 /* 915+ only */
362#define FW_BLC_SELF_EN_MASK (1<<31) 418#define FW_BLC_SELF_EN_MASK (1<<31)
363#define FW_BLC_SELF_FIFO_MASK (1<<16) /* 945 only */ 419#define FW_BLC_SELF_FIFO_MASK (1<<16) /* 945 only */
@@ -464,17 +520,22 @@
464#define GEN6_BLITTER_COMMAND_PARSER_MASTER_ERROR (1 << 25) 520#define GEN6_BLITTER_COMMAND_PARSER_MASTER_ERROR (1 << 25)
465#define GEN6_BLITTER_SYNC_STATUS (1 << 24) 521#define GEN6_BLITTER_SYNC_STATUS (1 << 24)
466#define GEN6_BLITTER_USER_INTERRUPT (1 << 22) 522#define GEN6_BLITTER_USER_INTERRUPT (1 << 22)
467/*
468 * BSD (bit stream decoder instruction and interrupt control register defines
469 * (G4X and Ironlake only)
470 */
471 523
472#define BSD_RING_TAIL 0x04030 524#define GEN6_BLITTER_ECOSKPD 0x221d0
473#define BSD_RING_HEAD 0x04034 525#define GEN6_BLITTER_LOCK_SHIFT 16
474#define BSD_RING_START 0x04038 526#define GEN6_BLITTER_FBC_NOTIFY (1<<3)
475#define BSD_RING_CTL 0x0403c 527
476#define BSD_RING_ACTHD 0x04074 528#define GEN6_BSD_SLEEP_PSMI_CONTROL 0x12050
477#define BSD_HWS_PGA 0x04080 529#define GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_MODIFY_MASK (1 << 16)
530#define GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_DISABLE (1 << 0)
531#define GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_ENABLE 0
532#define GEN6_BSD_SLEEP_PSMI_CONTROL_IDLE_INDICATOR (1 << 3)
533
534#define GEN6_BSD_HWSTAM 0x12098
535#define GEN6_BSD_IMR 0x120a8
536#define GEN6_BSD_USER_INTERRUPT (1 << 12)
537
538#define GEN6_BSD_RNCID 0x12198
478 539
479/* 540/*
480 * Framebuffer compression (915+ only) 541 * Framebuffer compression (915+ only)
@@ -552,6 +613,18 @@
552 613
553#define ILK_DISPLAY_CHICKEN1 0x42000 614#define ILK_DISPLAY_CHICKEN1 0x42000
554#define ILK_FBCQ_DIS (1<<22) 615#define ILK_FBCQ_DIS (1<<22)
616#define ILK_PABSTRETCH_DIS (1<<21)
617
618
619/*
620 * Framebuffer compression for Sandybridge
621 *
622 * The following two registers are of type GTTMMADR
623 */
624#define SNB_DPFC_CTL_SA 0x100100
625#define SNB_CPU_FENCE_ENABLE (1<<29)
626#define DPFC_CPU_FENCE_OFFSET 0x100104
627
555 628
556/* 629/*
557 * GPIO regs 630 * GPIO regs
@@ -579,12 +652,51 @@
579# define GPIO_DATA_VAL_IN (1 << 12) 652# define GPIO_DATA_VAL_IN (1 << 12)
580# define GPIO_DATA_PULLUP_DISABLE (1 << 13) 653# define GPIO_DATA_PULLUP_DISABLE (1 << 13)
581 654
582#define GMBUS0 0x5100 655#define GMBUS0 0x5100 /* clock/port select */
583#define GMBUS1 0x5104 656#define GMBUS_RATE_100KHZ (0<<8)
584#define GMBUS2 0x5108 657#define GMBUS_RATE_50KHZ (1<<8)
585#define GMBUS3 0x510c 658#define GMBUS_RATE_400KHZ (2<<8) /* reserved on Pineview */
586#define GMBUS4 0x5110 659#define GMBUS_RATE_1MHZ (3<<8) /* reserved on Pineview */
587#define GMBUS5 0x5120 660#define GMBUS_HOLD_EXT (1<<7) /* 300ns hold time, rsvd on Pineview */
661#define GMBUS_PORT_DISABLED 0
662#define GMBUS_PORT_SSC 1
663#define GMBUS_PORT_VGADDC 2
664#define GMBUS_PORT_PANEL 3
665#define GMBUS_PORT_DPC 4 /* HDMIC */
666#define GMBUS_PORT_DPB 5 /* SDVO, HDMIB */
667 /* 6 reserved */
668#define GMBUS_PORT_DPD 7 /* HDMID */
669#define GMBUS_NUM_PORTS 8
670#define GMBUS1 0x5104 /* command/status */
671#define GMBUS_SW_CLR_INT (1<<31)
672#define GMBUS_SW_RDY (1<<30)
673#define GMBUS_ENT (1<<29) /* enable timeout */
674#define GMBUS_CYCLE_NONE (0<<25)
675#define GMBUS_CYCLE_WAIT (1<<25)
676#define GMBUS_CYCLE_INDEX (2<<25)
677#define GMBUS_CYCLE_STOP (4<<25)
678#define GMBUS_BYTE_COUNT_SHIFT 16
679#define GMBUS_SLAVE_INDEX_SHIFT 8
680#define GMBUS_SLAVE_ADDR_SHIFT 1
681#define GMBUS_SLAVE_READ (1<<0)
682#define GMBUS_SLAVE_WRITE (0<<0)
683#define GMBUS2 0x5108 /* status */
684#define GMBUS_INUSE (1<<15)
685#define GMBUS_HW_WAIT_PHASE (1<<14)
686#define GMBUS_STALL_TIMEOUT (1<<13)
687#define GMBUS_INT (1<<12)
688#define GMBUS_HW_RDY (1<<11)
689#define GMBUS_SATOER (1<<10)
690#define GMBUS_ACTIVE (1<<9)
691#define GMBUS3 0x510c /* data buffer bytes 3-0 */
692#define GMBUS4 0x5110 /* interrupt mask (Pineview+) */
693#define GMBUS_SLAVE_TIMEOUT_EN (1<<4)
694#define GMBUS_NAK_EN (1<<3)
695#define GMBUS_IDLE_EN (1<<2)
696#define GMBUS_HW_WAIT_EN (1<<1)
697#define GMBUS_HW_RDY_EN (1<<0)
698#define GMBUS5 0x5120 /* byte index */
699#define GMBUS_2BYTE_INDEX_EN (1<<31)
588 700
589/* 701/*
590 * Clock control & power management 702 * Clock control & power management
@@ -601,8 +713,9 @@
601#define VGA1_PD_P1_DIV_2 (1 << 13) 713#define VGA1_PD_P1_DIV_2 (1 << 13)
602#define VGA1_PD_P1_SHIFT 8 714#define VGA1_PD_P1_SHIFT 8
603#define VGA1_PD_P1_MASK (0x1f << 8) 715#define VGA1_PD_P1_MASK (0x1f << 8)
604#define DPLL_A 0x06014 716#define _DPLL_A 0x06014
605#define DPLL_B 0x06018 717#define _DPLL_B 0x06018
718#define DPLL(pipe) _PIPE(pipe, _DPLL_A, _DPLL_B)
606#define DPLL_VCO_ENABLE (1 << 31) 719#define DPLL_VCO_ENABLE (1 << 31)
607#define DPLL_DVO_HIGH_SPEED (1 << 30) 720#define DPLL_DVO_HIGH_SPEED (1 << 30)
608#define DPLL_SYNCLOCK_ENABLE (1 << 29) 721#define DPLL_SYNCLOCK_ENABLE (1 << 29)
@@ -633,31 +746,6 @@
633#define LVDS 0x61180 746#define LVDS 0x61180
634#define LVDS_ON (1<<31) 747#define LVDS_ON (1<<31)
635 748
636#define ADPA 0x61100
637#define ADPA_DPMS_MASK (~(3<<10))
638#define ADPA_DPMS_ON (0<<10)
639#define ADPA_DPMS_SUSPEND (1<<10)
640#define ADPA_DPMS_STANDBY (2<<10)
641#define ADPA_DPMS_OFF (3<<10)
642
643#define RING_TAIL 0x00
644#define TAIL_ADDR 0x001FFFF8
645#define RING_HEAD 0x04
646#define HEAD_WRAP_COUNT 0xFFE00000
647#define HEAD_WRAP_ONE 0x00200000
648#define HEAD_ADDR 0x001FFFFC
649#define RING_START 0x08
650#define START_ADDR 0xFFFFF000
651#define RING_LEN 0x0C
652#define RING_NR_PAGES 0x001FF000
653#define RING_REPORT_MASK 0x00000006
654#define RING_REPORT_64K 0x00000002
655#define RING_REPORT_128K 0x00000004
656#define RING_NO_REPORT 0x00000000
657#define RING_VALID_MASK 0x00000001
658#define RING_VALID 0x00000001
659#define RING_INVALID 0x00000000
660
661/* Scratch pad debug 0 reg: 749/* Scratch pad debug 0 reg:
662 */ 750 */
663#define DPLL_FPA01_P1_POST_DIV_MASK_I830 0x001f0000 751#define DPLL_FPA01_P1_POST_DIV_MASK_I830 0x001f0000
@@ -698,7 +786,7 @@
698#define SDVO_MULTIPLIER_MASK 0x000000ff 786#define SDVO_MULTIPLIER_MASK 0x000000ff
699#define SDVO_MULTIPLIER_SHIFT_HIRES 4 787#define SDVO_MULTIPLIER_SHIFT_HIRES 4
700#define SDVO_MULTIPLIER_SHIFT_VGA 0 788#define SDVO_MULTIPLIER_SHIFT_VGA 0
701#define DPLL_A_MD 0x0601c /* 965+ only */ 789#define _DPLL_A_MD 0x0601c /* 965+ only */
702/* 790/*
703 * UDI pixel divider, controlling how many pixels are stuffed into a packet. 791 * UDI pixel divider, controlling how many pixels are stuffed into a packet.
704 * 792 *
@@ -735,11 +823,14 @@
735 */ 823 */
736#define DPLL_MD_VGA_UDI_MULTIPLIER_MASK 0x0000003f 824#define DPLL_MD_VGA_UDI_MULTIPLIER_MASK 0x0000003f
737#define DPLL_MD_VGA_UDI_MULTIPLIER_SHIFT 0 825#define DPLL_MD_VGA_UDI_MULTIPLIER_SHIFT 0
738#define DPLL_B_MD 0x06020 /* 965+ only */ 826#define _DPLL_B_MD 0x06020 /* 965+ only */
739#define FPA0 0x06040 827#define DPLL_MD(pipe) _PIPE(pipe, _DPLL_A_MD, _DPLL_B_MD)
740#define FPA1 0x06044 828#define _FPA0 0x06040
741#define FPB0 0x06048 829#define _FPA1 0x06044
742#define FPB1 0x0604c 830#define _FPB0 0x06048
831#define _FPB1 0x0604c
832#define FP0(pipe) _PIPE(pipe, _FPA0, _FPB0)
833#define FP1(pipe) _PIPE(pipe, _FPA1, _FPB1)
743#define FP_N_DIV_MASK 0x003f0000 834#define FP_N_DIV_MASK 0x003f0000
744#define FP_N_PINEVIEW_DIV_MASK 0x00ff0000 835#define FP_N_PINEVIEW_DIV_MASK 0x00ff0000
745#define FP_N_DIV_SHIFT 16 836#define FP_N_DIV_SHIFT 16
@@ -760,6 +851,7 @@
760#define DPLLA_TEST_M_BYPASS (1 << 2) 851#define DPLLA_TEST_M_BYPASS (1 << 2)
761#define DPLLA_INPUT_BUFFER_ENABLE (1 << 0) 852#define DPLLA_INPUT_BUFFER_ENABLE (1 << 0)
762#define D_STATE 0x6104 853#define D_STATE 0x6104
854#define DSTATE_GFX_RESET_I830 (1<<6)
763#define DSTATE_PLL_D3_OFF (1<<3) 855#define DSTATE_PLL_D3_OFF (1<<3)
764#define DSTATE_GFX_CLOCK_GATING (1<<1) 856#define DSTATE_GFX_CLOCK_GATING (1<<1)
765#define DSTATE_DOT_CLOCK_GATING (1<<0) 857#define DSTATE_DOT_CLOCK_GATING (1<<0)
@@ -877,8 +969,9 @@
877 * Palette regs 969 * Palette regs
878 */ 970 */
879 971
880#define PALETTE_A 0x0a000 972#define _PALETTE_A 0x0a000
881#define PALETTE_B 0x0a800 973#define _PALETTE_B 0x0a800
974#define PALETTE(pipe) _PIPE(pipe, _PALETTE_A, _PALETTE_B)
882 975
883/* MCH MMIO space */ 976/* MCH MMIO space */
884 977
@@ -892,6 +985,8 @@
892 */ 985 */
893#define MCHBAR_MIRROR_BASE 0x10000 986#define MCHBAR_MIRROR_BASE 0x10000
894 987
988#define MCHBAR_MIRROR_BASE_SNB 0x140000
989
895/** 915-945 and GM965 MCH register controlling DRAM channel access */ 990/** 915-945 and GM965 MCH register controlling DRAM channel access */
896#define DCC 0x10200 991#define DCC 0x10200
897#define DCC_ADDRESSING_MODE_SINGLE_CHANNEL (0 << 0) 992#define DCC_ADDRESSING_MODE_SINGLE_CHANNEL (0 << 0)
@@ -926,6 +1021,8 @@
926#define CLKCFG_MEM_800 (3 << 4) 1021#define CLKCFG_MEM_800 (3 << 4)
927#define CLKCFG_MEM_MASK (7 << 4) 1022#define CLKCFG_MEM_MASK (7 << 4)
928 1023
1024#define TSC1 0x11001
1025#define TSE (1<<0)
929#define TR1 0x11006 1026#define TR1 0x11006
930#define TSFS 0x11020 1027#define TSFS 0x11020
931#define TSFS_SLOPE_MASK 0x0000ff00 1028#define TSFS_SLOPE_MASK 0x0000ff00
@@ -1051,9 +1148,50 @@
1051#define RCBMINAVG 0x111a0 1148#define RCBMINAVG 0x111a0
1052#define RCUPEI 0x111b0 1149#define RCUPEI 0x111b0
1053#define RCDNEI 0x111b4 1150#define RCDNEI 0x111b4
1054#define MCHBAR_RENDER_STANDBY 0x111b8 1151#define RSTDBYCTL 0x111b8
1055#define RCX_SW_EXIT (1<<23) 1152#define RS1EN (1<<31)
1056#define RSX_STATUS_MASK 0x00700000 1153#define RS2EN (1<<30)
1154#define RS3EN (1<<29)
1155#define D3RS3EN (1<<28) /* Display D3 imlies RS3 */
1156#define SWPROMORSX (1<<27) /* RSx promotion timers ignored */
1157#define RCWAKERW (1<<26) /* Resetwarn from PCH causes wakeup */
1158#define DPRSLPVREN (1<<25) /* Fast voltage ramp enable */
1159#define GFXTGHYST (1<<24) /* Hysteresis to allow trunk gating */
1160#define RCX_SW_EXIT (1<<23) /* Leave RSx and prevent re-entry */
1161#define RSX_STATUS_MASK (7<<20)
1162#define RSX_STATUS_ON (0<<20)
1163#define RSX_STATUS_RC1 (1<<20)
1164#define RSX_STATUS_RC1E (2<<20)
1165#define RSX_STATUS_RS1 (3<<20)
1166#define RSX_STATUS_RS2 (4<<20) /* aka rc6 */
1167#define RSX_STATUS_RSVD (5<<20) /* deep rc6 unsupported on ilk */
1168#define RSX_STATUS_RS3 (6<<20) /* rs3 unsupported on ilk */
1169#define RSX_STATUS_RSVD2 (7<<20)
1170#define UWRCRSXE (1<<19) /* wake counter limit prevents rsx */
1171#define RSCRP (1<<18) /* rs requests control on rs1/2 reqs */
1172#define JRSC (1<<17) /* rsx coupled to cpu c-state */
1173#define RS2INC0 (1<<16) /* allow rs2 in cpu c0 */
1174#define RS1CONTSAV_MASK (3<<14)
1175#define RS1CONTSAV_NO_RS1 (0<<14) /* rs1 doesn't save/restore context */
1176#define RS1CONTSAV_RSVD (1<<14)
1177#define RS1CONTSAV_SAVE_RS1 (2<<14) /* rs1 saves context */
1178#define RS1CONTSAV_FULL_RS1 (3<<14) /* rs1 saves and restores context */
1179#define NORMSLEXLAT_MASK (3<<12)
1180#define SLOW_RS123 (0<<12)
1181#define SLOW_RS23 (1<<12)
1182#define SLOW_RS3 (2<<12)
1183#define NORMAL_RS123 (3<<12)
1184#define RCMODE_TIMEOUT (1<<11) /* 0 is eval interval method */
1185#define IMPROMOEN (1<<10) /* promo is immediate or delayed until next idle interval (only for timeout method above) */
1186#define RCENTSYNC (1<<9) /* rs coupled to cpu c-state (3/6/7) */
1187#define STATELOCK (1<<7) /* locked to rs_cstate if 0 */
1188#define RS_CSTATE_MASK (3<<4)
1189#define RS_CSTATE_C367_RS1 (0<<4)
1190#define RS_CSTATE_C36_RS1_C7_RS2 (1<<4)
1191#define RS_CSTATE_RSVD (2<<4)
1192#define RS_CSTATE_C367_RS2 (3<<4)
1193#define REDSAVES (1<<3) /* no context save if was idle during rs0 */
1194#define REDRESTORES (1<<2) /* no restore if was idle during rs0 */
1057#define VIDCTL 0x111c0 1195#define VIDCTL 0x111c0
1058#define VIDSTS 0x111c8 1196#define VIDSTS 0x111c8
1059#define VIDSTART 0x111cc /* 8 bits */ 1197#define VIDSTART 0x111cc /* 8 bits */
@@ -1070,6 +1208,8 @@
1070#define MEMSTAT_SRC_CTL_STDBY 3 1208#define MEMSTAT_SRC_CTL_STDBY 3
1071#define RCPREVBSYTUPAVG 0x113b8 1209#define RCPREVBSYTUPAVG 0x113b8
1072#define RCPREVBSYTDNAVG 0x113bc 1210#define RCPREVBSYTDNAVG 0x113bc
1211#define PMMISC 0x11214
1212#define MCPPCE_EN (1<<0) /* enable PM_MSG from PCH->MPC */
1073#define SDEW 0x1124c 1213#define SDEW 0x1124c
1074#define CSIEW0 0x11250 1214#define CSIEW0 0x11250
1075#define CSIEW1 0x11254 1215#define CSIEW1 0x11254
@@ -1107,6 +1247,10 @@
1107#define DDRMPLL1 0X12c20 1247#define DDRMPLL1 0X12c20
1108#define PEG_BAND_GAP_DATA 0x14d68 1248#define PEG_BAND_GAP_DATA 0x14d68
1109 1249
1250#define GEN6_GT_PERF_STATUS 0x145948
1251#define GEN6_RP_STATE_LIMITS 0x145994
1252#define GEN6_RP_STATE_CAP 0x145998
1253
1110/* 1254/*
1111 * Logical Context regs 1255 * Logical Context regs
1112 */ 1256 */
@@ -1131,24 +1275,32 @@
1131 */ 1275 */
1132 1276
1133/* Pipe A timing regs */ 1277/* Pipe A timing regs */
1134#define HTOTAL_A 0x60000 1278#define _HTOTAL_A 0x60000
1135#define HBLANK_A 0x60004 1279#define _HBLANK_A 0x60004
1136#define HSYNC_A 0x60008 1280#define _HSYNC_A 0x60008
1137#define VTOTAL_A 0x6000c 1281#define _VTOTAL_A 0x6000c
1138#define VBLANK_A 0x60010 1282#define _VBLANK_A 0x60010
1139#define VSYNC_A 0x60014 1283#define _VSYNC_A 0x60014
1140#define PIPEASRC 0x6001c 1284#define _PIPEASRC 0x6001c
1141#define BCLRPAT_A 0x60020 1285#define _BCLRPAT_A 0x60020
1142 1286
1143/* Pipe B timing regs */ 1287/* Pipe B timing regs */
1144#define HTOTAL_B 0x61000 1288#define _HTOTAL_B 0x61000
1145#define HBLANK_B 0x61004 1289#define _HBLANK_B 0x61004
1146#define HSYNC_B 0x61008 1290#define _HSYNC_B 0x61008
1147#define VTOTAL_B 0x6100c 1291#define _VTOTAL_B 0x6100c
1148#define VBLANK_B 0x61010 1292#define _VBLANK_B 0x61010
1149#define VSYNC_B 0x61014 1293#define _VSYNC_B 0x61014
1150#define PIPEBSRC 0x6101c 1294#define _PIPEBSRC 0x6101c
1151#define BCLRPAT_B 0x61020 1295#define _BCLRPAT_B 0x61020
1296
1297#define HTOTAL(pipe) _PIPE(pipe, _HTOTAL_A, _HTOTAL_B)
1298#define HBLANK(pipe) _PIPE(pipe, _HBLANK_A, _HBLANK_B)
1299#define HSYNC(pipe) _PIPE(pipe, _HSYNC_A, _HSYNC_B)
1300#define VTOTAL(pipe) _PIPE(pipe, _VTOTAL_A, _VTOTAL_B)
1301#define VBLANK(pipe) _PIPE(pipe, _VBLANK_A, _VBLANK_B)
1302#define VSYNC(pipe) _PIPE(pipe, _VSYNC_A, _VSYNC_B)
1303#define BCLRPAT(pipe) _PIPE(pipe, _BCLRPAT_A, _BCLRPAT_B)
1152 1304
1153/* VGA port control */ 1305/* VGA port control */
1154#define ADPA 0x61100 1306#define ADPA 0x61100
@@ -1173,6 +1325,7 @@
1173#define ADPA_DPMS_STANDBY (2<<10) 1325#define ADPA_DPMS_STANDBY (2<<10)
1174#define ADPA_DPMS_OFF (3<<10) 1326#define ADPA_DPMS_OFF (3<<10)
1175 1327
1328
1176/* Hotplug control (945+ only) */ 1329/* Hotplug control (945+ only) */
1177#define PORT_HOTPLUG_EN 0x61110 1330#define PORT_HOTPLUG_EN 0x61110
1178#define HDMIB_HOTPLUG_INT_EN (1 << 29) 1331#define HDMIB_HOTPLUG_INT_EN (1 << 29)
@@ -1241,6 +1394,7 @@
1241#define SDVO_ENCODING_HDMI (0x2 << 10) 1394#define SDVO_ENCODING_HDMI (0x2 << 10)
1242/** Requird for HDMI operation */ 1395/** Requird for HDMI operation */
1243#define SDVO_NULL_PACKETS_DURING_VSYNC (1 << 9) 1396#define SDVO_NULL_PACKETS_DURING_VSYNC (1 << 9)
1397#define SDVO_COLOR_RANGE_16_235 (1 << 8)
1244#define SDVO_BORDER_ENABLE (1 << 7) 1398#define SDVO_BORDER_ENABLE (1 << 7)
1245#define SDVO_AUDIO_ENABLE (1 << 6) 1399#define SDVO_AUDIO_ENABLE (1 << 6)
1246/** New with 965, default is to be set */ 1400/** New with 965, default is to be set */
@@ -1296,8 +1450,13 @@
1296#define LVDS_PORT_EN (1 << 31) 1450#define LVDS_PORT_EN (1 << 31)
1297/* Selects pipe B for LVDS data. Must be set on pre-965. */ 1451/* Selects pipe B for LVDS data. Must be set on pre-965. */
1298#define LVDS_PIPEB_SELECT (1 << 30) 1452#define LVDS_PIPEB_SELECT (1 << 30)
1453#define LVDS_PIPE_MASK (1 << 30)
1299/* LVDS dithering flag on 965/g4x platform */ 1454/* LVDS dithering flag on 965/g4x platform */
1300#define LVDS_ENABLE_DITHER (1 << 25) 1455#define LVDS_ENABLE_DITHER (1 << 25)
1456/* LVDS sync polarity flags. Set to invert (i.e. negative) */
1457#define LVDS_VSYNC_POLARITY (1 << 21)
1458#define LVDS_HSYNC_POLARITY (1 << 20)
1459
1301/* Enable border for unscaled (or aspect-scaled) display */ 1460/* Enable border for unscaled (or aspect-scaled) display */
1302#define LVDS_BORDER_ENABLE (1 << 15) 1461#define LVDS_BORDER_ENABLE (1 << 15)
1303/* 1462/*
@@ -1331,6 +1490,25 @@
1331#define LVDS_B0B3_POWER_DOWN (0 << 2) 1490#define LVDS_B0B3_POWER_DOWN (0 << 2)
1332#define LVDS_B0B3_POWER_UP (3 << 2) 1491#define LVDS_B0B3_POWER_UP (3 << 2)
1333 1492
1493#define LVDS_PIPE_ENABLED(V, P) \
1494 (((V) & (LVDS_PIPE_MASK | LVDS_PORT_EN)) == ((P) << 30 | LVDS_PORT_EN))
1495
1496/* Video Data Island Packet control */
1497#define VIDEO_DIP_DATA 0x61178
1498#define VIDEO_DIP_CTL 0x61170
1499#define VIDEO_DIP_ENABLE (1 << 31)
1500#define VIDEO_DIP_PORT_B (1 << 29)
1501#define VIDEO_DIP_PORT_C (2 << 29)
1502#define VIDEO_DIP_ENABLE_AVI (1 << 21)
1503#define VIDEO_DIP_ENABLE_VENDOR (2 << 21)
1504#define VIDEO_DIP_ENABLE_SPD (8 << 21)
1505#define VIDEO_DIP_SELECT_AVI (0 << 19)
1506#define VIDEO_DIP_SELECT_VENDOR (1 << 19)
1507#define VIDEO_DIP_SELECT_SPD (3 << 19)
1508#define VIDEO_DIP_FREQ_ONCE (0 << 16)
1509#define VIDEO_DIP_FREQ_VSYNC (1 << 16)
1510#define VIDEO_DIP_FREQ_2VSYNC (2 << 16)
1511
1334/* Panel power sequencing */ 1512/* Panel power sequencing */
1335#define PP_STATUS 0x61200 1513#define PP_STATUS 0x61200
1336#define PP_ON (1 << 31) 1514#define PP_ON (1 << 31)
@@ -1346,6 +1524,9 @@
1346#define PP_SEQUENCE_ON (1 << 28) 1524#define PP_SEQUENCE_ON (1 << 28)
1347#define PP_SEQUENCE_OFF (2 << 28) 1525#define PP_SEQUENCE_OFF (2 << 28)
1348#define PP_SEQUENCE_MASK 0x30000000 1526#define PP_SEQUENCE_MASK 0x30000000
1527#define PP_CYCLE_DELAY_ACTIVE (1 << 27)
1528#define PP_SEQUENCE_STATE_ON_IDLE (1 << 3)
1529#define PP_SEQUENCE_STATE_MASK 0x0000000f
1349#define PP_CONTROL 0x61204 1530#define PP_CONTROL 0x61204
1350#define POWER_TARGET_ON (1 << 0) 1531#define POWER_TARGET_ON (1 << 0)
1351#define PP_ON_DELAYS 0x61208 1532#define PP_ON_DELAYS 0x61208
@@ -1481,6 +1662,7 @@
1481# define TV_TEST_MODE_MASK (7 << 0) 1662# define TV_TEST_MODE_MASK (7 << 0)
1482 1663
1483#define TV_DAC 0x68004 1664#define TV_DAC 0x68004
1665# define TV_DAC_SAVE 0x00ffff00
1484/** 1666/**
1485 * Reports that DAC state change logic has reported change (RO). 1667 * Reports that DAC state change logic has reported change (RO).
1486 * 1668 *
@@ -1899,6 +2081,10 @@
1899 2081
1900#define DP_PORT_EN (1 << 31) 2082#define DP_PORT_EN (1 << 31)
1901#define DP_PIPEB_SELECT (1 << 30) 2083#define DP_PIPEB_SELECT (1 << 30)
2084#define DP_PIPE_MASK (1 << 30)
2085
2086#define DP_PIPE_ENABLED(V, P) \
2087 (((V) & (DP_PIPE_MASK | DP_PORT_EN)) == ((P) << 30 | DP_PORT_EN))
1902 2088
1903/* Link training mode - select a suitable mode for each stage */ 2089/* Link training mode - select a suitable mode for each stage */
1904#define DP_LINK_TRAIN_PAT_1 (0 << 28) 2090#define DP_LINK_TRAIN_PAT_1 (0 << 28)
@@ -2041,8 +2227,8 @@
2041 * which is after the LUTs, so we want the bytes for our color format. 2227 * which is after the LUTs, so we want the bytes for our color format.
2042 * For our current usage, this is always 3, one byte for R, G and B. 2228 * For our current usage, this is always 3, one byte for R, G and B.
2043 */ 2229 */
2044#define PIPEA_GMCH_DATA_M 0x70050 2230#define _PIPEA_GMCH_DATA_M 0x70050
2045#define PIPEB_GMCH_DATA_M 0x71050 2231#define _PIPEB_GMCH_DATA_M 0x71050
2046 2232
2047/* Transfer unit size for display port - 1, default is 0x3f (for TU size 64) */ 2233/* Transfer unit size for display port - 1, default is 0x3f (for TU size 64) */
2048#define PIPE_GMCH_DATA_M_TU_SIZE_MASK (0x3f << 25) 2234#define PIPE_GMCH_DATA_M_TU_SIZE_MASK (0x3f << 25)
@@ -2050,8 +2236,8 @@
2050 2236
2051#define PIPE_GMCH_DATA_M_MASK (0xffffff) 2237#define PIPE_GMCH_DATA_M_MASK (0xffffff)
2052 2238
2053#define PIPEA_GMCH_DATA_N 0x70054 2239#define _PIPEA_GMCH_DATA_N 0x70054
2054#define PIPEB_GMCH_DATA_N 0x71054 2240#define _PIPEB_GMCH_DATA_N 0x71054
2055#define PIPE_GMCH_DATA_N_MASK (0xffffff) 2241#define PIPE_GMCH_DATA_N_MASK (0xffffff)
2056 2242
2057/* 2243/*
@@ -2065,40 +2251,51 @@
2065 * Attributes and VB-ID. 2251 * Attributes and VB-ID.
2066 */ 2252 */
2067 2253
2068#define PIPEA_DP_LINK_M 0x70060 2254#define _PIPEA_DP_LINK_M 0x70060
2069#define PIPEB_DP_LINK_M 0x71060 2255#define _PIPEB_DP_LINK_M 0x71060
2070#define PIPEA_DP_LINK_M_MASK (0xffffff) 2256#define PIPEA_DP_LINK_M_MASK (0xffffff)
2071 2257
2072#define PIPEA_DP_LINK_N 0x70064 2258#define _PIPEA_DP_LINK_N 0x70064
2073#define PIPEB_DP_LINK_N 0x71064 2259#define _PIPEB_DP_LINK_N 0x71064
2074#define PIPEA_DP_LINK_N_MASK (0xffffff) 2260#define PIPEA_DP_LINK_N_MASK (0xffffff)
2075 2261
2262#define PIPE_GMCH_DATA_M(pipe) _PIPE(pipe, _PIPEA_GMCH_DATA_M, _PIPEB_GMCH_DATA_M)
2263#define PIPE_GMCH_DATA_N(pipe) _PIPE(pipe, _PIPEA_GMCH_DATA_N, _PIPEB_GMCH_DATA_N)
2264#define PIPE_DP_LINK_M(pipe) _PIPE(pipe, _PIPEA_DP_LINK_M, _PIPEB_DP_LINK_M)
2265#define PIPE_DP_LINK_N(pipe) _PIPE(pipe, _PIPEA_DP_LINK_N, _PIPEB_DP_LINK_N)
2266
2076/* Display & cursor control */ 2267/* Display & cursor control */
2077 2268
2078/* dithering flag on Ironlake */
2079#define PIPE_ENABLE_DITHER (1 << 4)
2080#define PIPE_DITHER_TYPE_MASK (3 << 2)
2081#define PIPE_DITHER_TYPE_SPATIAL (0 << 2)
2082#define PIPE_DITHER_TYPE_ST01 (1 << 2)
2083/* Pipe A */ 2269/* Pipe A */
2084#define PIPEADSL 0x70000 2270#define _PIPEADSL 0x70000
2085#define DSL_LINEMASK 0x00000fff 2271#define DSL_LINEMASK 0x00000fff
2086#define PIPEACONF 0x70008 2272#define _PIPEACONF 0x70008
2087#define PIPEACONF_ENABLE (1<<31) 2273#define PIPECONF_ENABLE (1<<31)
2088#define PIPEACONF_DISABLE 0 2274#define PIPECONF_DISABLE 0
2089#define PIPEACONF_DOUBLE_WIDE (1<<30) 2275#define PIPECONF_DOUBLE_WIDE (1<<30)
2090#define I965_PIPECONF_ACTIVE (1<<30) 2276#define I965_PIPECONF_ACTIVE (1<<30)
2091#define PIPEACONF_SINGLE_WIDE 0 2277#define PIPECONF_SINGLE_WIDE 0
2092#define PIPEACONF_PIPE_UNLOCKED 0 2278#define PIPECONF_PIPE_UNLOCKED 0
2093#define PIPEACONF_PIPE_LOCKED (1<<25) 2279#define PIPECONF_PIPE_LOCKED (1<<25)
2094#define PIPEACONF_PALETTE 0 2280#define PIPECONF_PALETTE 0
2095#define PIPEACONF_GAMMA (1<<24) 2281#define PIPECONF_GAMMA (1<<24)
2096#define PIPECONF_FORCE_BORDER (1<<25) 2282#define PIPECONF_FORCE_BORDER (1<<25)
2097#define PIPECONF_PROGRESSIVE (0 << 21) 2283#define PIPECONF_PROGRESSIVE (0 << 21)
2098#define PIPECONF_INTERLACE_W_FIELD_INDICATION (6 << 21) 2284#define PIPECONF_INTERLACE_W_FIELD_INDICATION (6 << 21)
2099#define PIPECONF_INTERLACE_FIELD_0_ONLY (7 << 21) 2285#define PIPECONF_INTERLACE_FIELD_0_ONLY (7 << 21)
2100#define PIPECONF_CXSR_DOWNCLOCK (1<<16) 2286#define PIPECONF_CXSR_DOWNCLOCK (1<<16)
2101#define PIPEASTAT 0x70024 2287#define PIPECONF_BPP_MASK (0x000000e0)
2288#define PIPECONF_BPP_8 (0<<5)
2289#define PIPECONF_BPP_10 (1<<5)
2290#define PIPECONF_BPP_6 (2<<5)
2291#define PIPECONF_BPP_12 (3<<5)
2292#define PIPECONF_DITHER_EN (1<<4)
2293#define PIPECONF_DITHER_TYPE_MASK (0x0000000c)
2294#define PIPECONF_DITHER_TYPE_SP (0<<2)
2295#define PIPECONF_DITHER_TYPE_ST1 (1<<2)
2296#define PIPECONF_DITHER_TYPE_ST2 (2<<2)
2297#define PIPECONF_DITHER_TYPE_TEMP (3<<2)
2298#define _PIPEASTAT 0x70024
2102#define PIPE_FIFO_UNDERRUN_STATUS (1UL<<31) 2299#define PIPE_FIFO_UNDERRUN_STATUS (1UL<<31)
2103#define PIPE_CRC_ERROR_ENABLE (1UL<<29) 2300#define PIPE_CRC_ERROR_ENABLE (1UL<<29)
2104#define PIPE_CRC_DONE_ENABLE (1UL<<28) 2301#define PIPE_CRC_DONE_ENABLE (1UL<<28)
@@ -2128,12 +2325,19 @@
2128#define PIPE_START_VBLANK_INTERRUPT_STATUS (1UL<<2) /* 965 or later */ 2325#define PIPE_START_VBLANK_INTERRUPT_STATUS (1UL<<2) /* 965 or later */
2129#define PIPE_VBLANK_INTERRUPT_STATUS (1UL<<1) 2326#define PIPE_VBLANK_INTERRUPT_STATUS (1UL<<1)
2130#define PIPE_OVERLAY_UPDATED_STATUS (1UL<<0) 2327#define PIPE_OVERLAY_UPDATED_STATUS (1UL<<0)
2131#define PIPE_BPC_MASK (7 << 5) /* Ironlake */ 2328#define PIPE_BPC_MASK (7 << 5) /* Ironlake */
2132#define PIPE_8BPC (0 << 5) 2329#define PIPE_8BPC (0 << 5)
2133#define PIPE_10BPC (1 << 5) 2330#define PIPE_10BPC (1 << 5)
2134#define PIPE_6BPC (2 << 5) 2331#define PIPE_6BPC (2 << 5)
2135#define PIPE_12BPC (3 << 5) 2332#define PIPE_12BPC (3 << 5)
2136 2333
2334#define PIPESRC(pipe) _PIPE(pipe, _PIPEASRC, _PIPEBSRC)
2335#define PIPECONF(pipe) _PIPE(pipe, _PIPEACONF, _PIPEBCONF)
2336#define PIPEDSL(pipe) _PIPE(pipe, _PIPEADSL, _PIPEBDSL)
2337#define PIPEFRAME(pipe) _PIPE(pipe, _PIPEAFRAMEHIGH, _PIPEBFRAMEHIGH)
2338#define PIPEFRAMEPIXEL(pipe) _PIPE(pipe, _PIPEAFRAMEPIXEL, _PIPEBFRAMEPIXEL)
2339#define PIPESTAT(pipe) _PIPE(pipe, _PIPEASTAT, _PIPEBSTAT)
2340
2137#define DSPARB 0x70030 2341#define DSPARB 0x70030
2138#define DSPARB_CSTART_MASK (0x7f << 7) 2342#define DSPARB_CSTART_MASK (0x7f << 7)
2139#define DSPARB_CSTART_SHIFT 7 2343#define DSPARB_CSTART_SHIFT 7
@@ -2206,8 +2410,8 @@
2206#define WM1_LP_SR_EN (1<<31) 2410#define WM1_LP_SR_EN (1<<31)
2207#define WM1_LP_LATENCY_SHIFT 24 2411#define WM1_LP_LATENCY_SHIFT 24
2208#define WM1_LP_LATENCY_MASK (0x7f<<24) 2412#define WM1_LP_LATENCY_MASK (0x7f<<24)
2209#define WM1_LP_FBC_LP1_MASK (0xf<<20) 2413#define WM1_LP_FBC_MASK (0xf<<20)
2210#define WM1_LP_FBC_LP1_SHIFT 20 2414#define WM1_LP_FBC_SHIFT 20
2211#define WM1_LP_SR_MASK (0x1ff<<8) 2415#define WM1_LP_SR_MASK (0x1ff<<8)
2212#define WM1_LP_SR_SHIFT 8 2416#define WM1_LP_SR_SHIFT 8
2213#define WM1_LP_CURSOR_MASK (0x3f) 2417#define WM1_LP_CURSOR_MASK (0x3f)
@@ -2220,8 +2424,13 @@
2220 2424
2221/* Memory latency timer register */ 2425/* Memory latency timer register */
2222#define MLTR_ILK 0x11222 2426#define MLTR_ILK 0x11222
2427#define MLTR_WM1_SHIFT 0
2428#define MLTR_WM2_SHIFT 8
2223/* the unit of memory self-refresh latency time is 0.5us */ 2429/* the unit of memory self-refresh latency time is 0.5us */
2224#define ILK_SRLT_MASK 0x3f 2430#define ILK_SRLT_MASK 0x3f
2431#define ILK_LATENCY(shift) (I915_READ(MLTR_ILK) >> (shift) & ILK_SRLT_MASK)
2432#define ILK_READ_WM1_LATENCY() ILK_LATENCY(MLTR_WM1_SHIFT)
2433#define ILK_READ_WM2_LATENCY() ILK_LATENCY(MLTR_WM2_SHIFT)
2225 2434
2226/* define the fifo size on Ironlake */ 2435/* define the fifo size on Ironlake */
2227#define ILK_DISPLAY_FIFO 128 2436#define ILK_DISPLAY_FIFO 128
@@ -2240,6 +2449,40 @@
2240 2449
2241#define ILK_FIFO_LINE_SIZE 64 2450#define ILK_FIFO_LINE_SIZE 64
2242 2451
2452/* define the WM info on Sandybridge */
2453#define SNB_DISPLAY_FIFO 128
2454#define SNB_DISPLAY_MAXWM 0x7f /* bit 16:22 */
2455#define SNB_DISPLAY_DFTWM 8
2456#define SNB_CURSOR_FIFO 32
2457#define SNB_CURSOR_MAXWM 0x1f /* bit 4:0 */
2458#define SNB_CURSOR_DFTWM 8
2459
2460#define SNB_DISPLAY_SR_FIFO 512
2461#define SNB_DISPLAY_MAX_SRWM 0x1ff /* bit 16:8 */
2462#define SNB_DISPLAY_DFT_SRWM 0x3f
2463#define SNB_CURSOR_SR_FIFO 64
2464#define SNB_CURSOR_MAX_SRWM 0x3f /* bit 5:0 */
2465#define SNB_CURSOR_DFT_SRWM 8
2466
2467#define SNB_FBC_MAX_SRWM 0xf /* bit 23:20 */
2468
2469#define SNB_FIFO_LINE_SIZE 64
2470
2471
2472/* the address where we get all kinds of latency value */
2473#define SSKPD 0x5d10
2474#define SSKPD_WM_MASK 0x3f
2475#define SSKPD_WM0_SHIFT 0
2476#define SSKPD_WM1_SHIFT 8
2477#define SSKPD_WM2_SHIFT 16
2478#define SSKPD_WM3_SHIFT 24
2479
2480#define SNB_LATENCY(shift) (I915_READ(MCHBAR_MIRROR_BASE_SNB + SSKPD) >> (shift) & SSKPD_WM_MASK)
2481#define SNB_READ_WM0_LATENCY() SNB_LATENCY(SSKPD_WM0_SHIFT)
2482#define SNB_READ_WM1_LATENCY() SNB_LATENCY(SSKPD_WM1_SHIFT)
2483#define SNB_READ_WM2_LATENCY() SNB_LATENCY(SSKPD_WM2_SHIFT)
2484#define SNB_READ_WM3_LATENCY() SNB_LATENCY(SSKPD_WM3_SHIFT)
2485
2243/* 2486/*
2244 * The two pipe frame counter registers are not synchronized, so 2487 * The two pipe frame counter registers are not synchronized, so
2245 * reading a stable value is somewhat tricky. The following code 2488 * reading a stable value is somewhat tricky. The following code
@@ -2255,20 +2498,21 @@
2255 * } while (high1 != high2); 2498 * } while (high1 != high2);
2256 * frame = (high1 << 8) | low1; 2499 * frame = (high1 << 8) | low1;
2257 */ 2500 */
2258#define PIPEAFRAMEHIGH 0x70040 2501#define _PIPEAFRAMEHIGH 0x70040
2259#define PIPE_FRAME_HIGH_MASK 0x0000ffff 2502#define PIPE_FRAME_HIGH_MASK 0x0000ffff
2260#define PIPE_FRAME_HIGH_SHIFT 0 2503#define PIPE_FRAME_HIGH_SHIFT 0
2261#define PIPEAFRAMEPIXEL 0x70044 2504#define _PIPEAFRAMEPIXEL 0x70044
2262#define PIPE_FRAME_LOW_MASK 0xff000000 2505#define PIPE_FRAME_LOW_MASK 0xff000000
2263#define PIPE_FRAME_LOW_SHIFT 24 2506#define PIPE_FRAME_LOW_SHIFT 24
2264#define PIPE_PIXEL_MASK 0x00ffffff 2507#define PIPE_PIXEL_MASK 0x00ffffff
2265#define PIPE_PIXEL_SHIFT 0 2508#define PIPE_PIXEL_SHIFT 0
2266/* GM45+ just has to be different */ 2509/* GM45+ just has to be different */
2267#define PIPEA_FRMCOUNT_GM45 0x70040 2510#define _PIPEA_FRMCOUNT_GM45 0x70040
2268#define PIPEA_FLIPCOUNT_GM45 0x70044 2511#define _PIPEA_FLIPCOUNT_GM45 0x70044
2512#define PIPE_FRMCOUNT_GM45(pipe) _PIPE(pipe, _PIPEA_FRMCOUNT_GM45, _PIPEB_FRMCOUNT_GM45)
2269 2513
2270/* Cursor A & B regs */ 2514/* Cursor A & B regs */
2271#define CURACNTR 0x70080 2515#define _CURACNTR 0x70080
2272/* Old style CUR*CNTR flags (desktop 8xx) */ 2516/* Old style CUR*CNTR flags (desktop 8xx) */
2273#define CURSOR_ENABLE 0x80000000 2517#define CURSOR_ENABLE 0x80000000
2274#define CURSOR_GAMMA_ENABLE 0x40000000 2518#define CURSOR_GAMMA_ENABLE 0x40000000
@@ -2289,19 +2533,23 @@
2289#define MCURSOR_PIPE_A 0x00 2533#define MCURSOR_PIPE_A 0x00
2290#define MCURSOR_PIPE_B (1 << 28) 2534#define MCURSOR_PIPE_B (1 << 28)
2291#define MCURSOR_GAMMA_ENABLE (1 << 26) 2535#define MCURSOR_GAMMA_ENABLE (1 << 26)
2292#define CURABASE 0x70084 2536#define _CURABASE 0x70084
2293#define CURAPOS 0x70088 2537#define _CURAPOS 0x70088
2294#define CURSOR_POS_MASK 0x007FF 2538#define CURSOR_POS_MASK 0x007FF
2295#define CURSOR_POS_SIGN 0x8000 2539#define CURSOR_POS_SIGN 0x8000
2296#define CURSOR_X_SHIFT 0 2540#define CURSOR_X_SHIFT 0
2297#define CURSOR_Y_SHIFT 16 2541#define CURSOR_Y_SHIFT 16
2298#define CURSIZE 0x700a0 2542#define CURSIZE 0x700a0
2299#define CURBCNTR 0x700c0 2543#define _CURBCNTR 0x700c0
2300#define CURBBASE 0x700c4 2544#define _CURBBASE 0x700c4
2301#define CURBPOS 0x700c8 2545#define _CURBPOS 0x700c8
2546
2547#define CURCNTR(pipe) _PIPE(pipe, _CURACNTR, _CURBCNTR)
2548#define CURBASE(pipe) _PIPE(pipe, _CURABASE, _CURBBASE)
2549#define CURPOS(pipe) _PIPE(pipe, _CURAPOS, _CURBPOS)
2302 2550
2303/* Display A control */ 2551/* Display A control */
2304#define DSPACNTR 0x70180 2552#define _DSPACNTR 0x70180
2305#define DISPLAY_PLANE_ENABLE (1<<31) 2553#define DISPLAY_PLANE_ENABLE (1<<31)
2306#define DISPLAY_PLANE_DISABLE 0 2554#define DISPLAY_PLANE_DISABLE 0
2307#define DISPPLANE_GAMMA_ENABLE (1<<30) 2555#define DISPPLANE_GAMMA_ENABLE (1<<30)
@@ -2315,9 +2563,10 @@
2315#define DISPPLANE_32BPP_30BIT_NO_ALPHA (0xa<<26) 2563#define DISPPLANE_32BPP_30BIT_NO_ALPHA (0xa<<26)
2316#define DISPPLANE_STEREO_ENABLE (1<<25) 2564#define DISPPLANE_STEREO_ENABLE (1<<25)
2317#define DISPPLANE_STEREO_DISABLE 0 2565#define DISPPLANE_STEREO_DISABLE 0
2318#define DISPPLANE_SEL_PIPE_MASK (1<<24) 2566#define DISPPLANE_SEL_PIPE_SHIFT 24
2567#define DISPPLANE_SEL_PIPE_MASK (3<<DISPPLANE_SEL_PIPE_SHIFT)
2319#define DISPPLANE_SEL_PIPE_A 0 2568#define DISPPLANE_SEL_PIPE_A 0
2320#define DISPPLANE_SEL_PIPE_B (1<<24) 2569#define DISPPLANE_SEL_PIPE_B (1<<DISPPLANE_SEL_PIPE_SHIFT)
2321#define DISPPLANE_SRC_KEY_ENABLE (1<<22) 2570#define DISPPLANE_SRC_KEY_ENABLE (1<<22)
2322#define DISPPLANE_SRC_KEY_DISABLE 0 2571#define DISPPLANE_SRC_KEY_DISABLE 0
2323#define DISPPLANE_LINE_DOUBLE (1<<20) 2572#define DISPPLANE_LINE_DOUBLE (1<<20)
@@ -2326,12 +2575,20 @@
2326#define DISPPLANE_STEREO_POLARITY_SECOND (1<<18) 2575#define DISPPLANE_STEREO_POLARITY_SECOND (1<<18)
2327#define DISPPLANE_TRICKLE_FEED_DISABLE (1<<14) /* Ironlake */ 2576#define DISPPLANE_TRICKLE_FEED_DISABLE (1<<14) /* Ironlake */
2328#define DISPPLANE_TILED (1<<10) 2577#define DISPPLANE_TILED (1<<10)
2329#define DSPAADDR 0x70184 2578#define _DSPAADDR 0x70184
2330#define DSPASTRIDE 0x70188 2579#define _DSPASTRIDE 0x70188
2331#define DSPAPOS 0x7018C /* reserved */ 2580#define _DSPAPOS 0x7018C /* reserved */
2332#define DSPASIZE 0x70190 2581#define _DSPASIZE 0x70190
2333#define DSPASURF 0x7019C /* 965+ only */ 2582#define _DSPASURF 0x7019C /* 965+ only */
2334#define DSPATILEOFF 0x701A4 /* 965+ only */ 2583#define _DSPATILEOFF 0x701A4 /* 965+ only */
2584
2585#define DSPCNTR(plane) _PIPE(plane, _DSPACNTR, _DSPBCNTR)
2586#define DSPADDR(plane) _PIPE(plane, _DSPAADDR, _DSPBADDR)
2587#define DSPSTRIDE(plane) _PIPE(plane, _DSPASTRIDE, _DSPBSTRIDE)
2588#define DSPPOS(plane) _PIPE(plane, _DSPAPOS, _DSPBPOS)
2589#define DSPSIZE(plane) _PIPE(plane, _DSPASIZE, _DSPBSIZE)
2590#define DSPSURF(plane) _PIPE(plane, _DSPASURF, _DSPBSURF)
2591#define DSPTILEOFF(plane) _PIPE(plane, _DSPATILEOFF, _DSPBTILEOFF)
2335 2592
2336/* VBIOS flags */ 2593/* VBIOS flags */
2337#define SWF00 0x71410 2594#define SWF00 0x71410
@@ -2349,27 +2606,27 @@
2349#define SWF32 0x7241c 2606#define SWF32 0x7241c
2350 2607
2351/* Pipe B */ 2608/* Pipe B */
2352#define PIPEBDSL 0x71000 2609#define _PIPEBDSL 0x71000
2353#define PIPEBCONF 0x71008 2610#define _PIPEBCONF 0x71008
2354#define PIPEBSTAT 0x71024 2611#define _PIPEBSTAT 0x71024
2355#define PIPEBFRAMEHIGH 0x71040 2612#define _PIPEBFRAMEHIGH 0x71040
2356#define PIPEBFRAMEPIXEL 0x71044 2613#define _PIPEBFRAMEPIXEL 0x71044
2357#define PIPEB_FRMCOUNT_GM45 0x71040 2614#define _PIPEB_FRMCOUNT_GM45 0x71040
2358#define PIPEB_FLIPCOUNT_GM45 0x71044 2615#define _PIPEB_FLIPCOUNT_GM45 0x71044
2359 2616
2360 2617
2361/* Display B control */ 2618/* Display B control */
2362#define DSPBCNTR 0x71180 2619#define _DSPBCNTR 0x71180
2363#define DISPPLANE_ALPHA_TRANS_ENABLE (1<<15) 2620#define DISPPLANE_ALPHA_TRANS_ENABLE (1<<15)
2364#define DISPPLANE_ALPHA_TRANS_DISABLE 0 2621#define DISPPLANE_ALPHA_TRANS_DISABLE 0
2365#define DISPPLANE_SPRITE_ABOVE_DISPLAY 0 2622#define DISPPLANE_SPRITE_ABOVE_DISPLAY 0
2366#define DISPPLANE_SPRITE_ABOVE_OVERLAY (1) 2623#define DISPPLANE_SPRITE_ABOVE_OVERLAY (1)
2367#define DSPBADDR 0x71184 2624#define _DSPBADDR 0x71184
2368#define DSPBSTRIDE 0x71188 2625#define _DSPBSTRIDE 0x71188
2369#define DSPBPOS 0x7118C 2626#define _DSPBPOS 0x7118C
2370#define DSPBSIZE 0x71190 2627#define _DSPBSIZE 0x71190
2371#define DSPBSURF 0x7119C 2628#define _DSPBSURF 0x7119C
2372#define DSPBTILEOFF 0x711A4 2629#define _DSPBTILEOFF 0x711A4
2373 2630
2374/* VBIOS regs */ 2631/* VBIOS regs */
2375#define VGACNTRL 0x71400 2632#define VGACNTRL 0x71400
@@ -2397,6 +2654,7 @@
2397#define RR_HW_HIGH_POWER_FRAMES_MASK 0xff00 2654#define RR_HW_HIGH_POWER_FRAMES_MASK 0xff00
2398 2655
2399#define FDI_PLL_BIOS_0 0x46000 2656#define FDI_PLL_BIOS_0 0x46000
2657#define FDI_PLL_FB_CLOCK_MASK 0xff
2400#define FDI_PLL_BIOS_1 0x46004 2658#define FDI_PLL_BIOS_1 0x46004
2401#define FDI_PLL_BIOS_2 0x46008 2659#define FDI_PLL_BIOS_2 0x46008
2402#define DISPLAY_PORT_PLL_BIOS_0 0x4600c 2660#define DISPLAY_PORT_PLL_BIOS_0 0x4600c
@@ -2404,6 +2662,8 @@
2404#define DISPLAY_PORT_PLL_BIOS_2 0x46014 2662#define DISPLAY_PORT_PLL_BIOS_2 0x46014
2405 2663
2406#define PCH_DSPCLK_GATE_D 0x42020 2664#define PCH_DSPCLK_GATE_D 0x42020
2665# define DPFCUNIT_CLOCK_GATE_DISABLE (1 << 9)
2666# define DPFCRUNIT_CLOCK_GATE_DISABLE (1 << 8)
2407# define DPFDUNIT_CLOCK_GATE_DISABLE (1 << 7) 2667# define DPFDUNIT_CLOCK_GATE_DISABLE (1 << 7)
2408# define DPARBUNIT_CLOCK_GATE_DISABLE (1 << 5) 2668# define DPARBUNIT_CLOCK_GATE_DISABLE (1 << 5)
2409 2669
@@ -2411,73 +2671,89 @@
2411# define MARIUNIT_CLOCK_GATE_DISABLE (1 << 18) 2671# define MARIUNIT_CLOCK_GATE_DISABLE (1 << 18)
2412# define SVSMUNIT_CLOCK_GATE_DISABLE (1 << 1) 2672# define SVSMUNIT_CLOCK_GATE_DISABLE (1 << 1)
2413 2673
2674#define PCH_3DCGDIS1 0x46024
2675# define VFMUNIT_CLOCK_GATE_DISABLE (1 << 11)
2676
2414#define FDI_PLL_FREQ_CTL 0x46030 2677#define FDI_PLL_FREQ_CTL 0x46030
2415#define FDI_PLL_FREQ_CHANGE_REQUEST (1<<24) 2678#define FDI_PLL_FREQ_CHANGE_REQUEST (1<<24)
2416#define FDI_PLL_FREQ_LOCK_LIMIT_MASK 0xfff00 2679#define FDI_PLL_FREQ_LOCK_LIMIT_MASK 0xfff00
2417#define FDI_PLL_FREQ_DISABLE_COUNT_LIMIT_MASK 0xff 2680#define FDI_PLL_FREQ_DISABLE_COUNT_LIMIT_MASK 0xff
2418 2681
2419 2682
2420#define PIPEA_DATA_M1 0x60030 2683#define _PIPEA_DATA_M1 0x60030
2421#define TU_SIZE(x) (((x)-1) << 25) /* default size 64 */ 2684#define TU_SIZE(x) (((x)-1) << 25) /* default size 64 */
2422#define TU_SIZE_MASK 0x7e000000 2685#define TU_SIZE_MASK 0x7e000000
2423#define PIPEA_DATA_M1_OFFSET 0 2686#define PIPE_DATA_M1_OFFSET 0
2424#define PIPEA_DATA_N1 0x60034 2687#define _PIPEA_DATA_N1 0x60034
2425#define PIPEA_DATA_N1_OFFSET 0 2688#define PIPE_DATA_N1_OFFSET 0
2426 2689
2427#define PIPEA_DATA_M2 0x60038 2690#define _PIPEA_DATA_M2 0x60038
2428#define PIPEA_DATA_M2_OFFSET 0 2691#define PIPE_DATA_M2_OFFSET 0
2429#define PIPEA_DATA_N2 0x6003c 2692#define _PIPEA_DATA_N2 0x6003c
2430#define PIPEA_DATA_N2_OFFSET 0 2693#define PIPE_DATA_N2_OFFSET 0
2431 2694
2432#define PIPEA_LINK_M1 0x60040 2695#define _PIPEA_LINK_M1 0x60040
2433#define PIPEA_LINK_M1_OFFSET 0 2696#define PIPE_LINK_M1_OFFSET 0
2434#define PIPEA_LINK_N1 0x60044 2697#define _PIPEA_LINK_N1 0x60044
2435#define PIPEA_LINK_N1_OFFSET 0 2698#define PIPE_LINK_N1_OFFSET 0
2436 2699
2437#define PIPEA_LINK_M2 0x60048 2700#define _PIPEA_LINK_M2 0x60048
2438#define PIPEA_LINK_M2_OFFSET 0 2701#define PIPE_LINK_M2_OFFSET 0
2439#define PIPEA_LINK_N2 0x6004c 2702#define _PIPEA_LINK_N2 0x6004c
2440#define PIPEA_LINK_N2_OFFSET 0 2703#define PIPE_LINK_N2_OFFSET 0
2441 2704
2442/* PIPEB timing regs are same start from 0x61000 */ 2705/* PIPEB timing regs are same start from 0x61000 */
2443 2706
2444#define PIPEB_DATA_M1 0x61030 2707#define _PIPEB_DATA_M1 0x61030
2445#define PIPEB_DATA_M1_OFFSET 0 2708#define _PIPEB_DATA_N1 0x61034
2446#define PIPEB_DATA_N1 0x61034 2709
2447#define PIPEB_DATA_N1_OFFSET 0 2710#define _PIPEB_DATA_M2 0x61038
2711#define _PIPEB_DATA_N2 0x6103c
2448 2712
2449#define PIPEB_DATA_M2 0x61038 2713#define _PIPEB_LINK_M1 0x61040
2450#define PIPEB_DATA_M2_OFFSET 0 2714#define _PIPEB_LINK_N1 0x61044
2451#define PIPEB_DATA_N2 0x6103c
2452#define PIPEB_DATA_N2_OFFSET 0
2453 2715
2454#define PIPEB_LINK_M1 0x61040 2716#define _PIPEB_LINK_M2 0x61048
2455#define PIPEB_LINK_M1_OFFSET 0 2717#define _PIPEB_LINK_N2 0x6104c
2456#define PIPEB_LINK_N1 0x61044
2457#define PIPEB_LINK_N1_OFFSET 0
2458 2718
2459#define PIPEB_LINK_M2 0x61048 2719#define PIPE_DATA_M1(pipe) _PIPE(pipe, _PIPEA_DATA_M1, _PIPEB_DATA_M1)
2460#define PIPEB_LINK_M2_OFFSET 0 2720#define PIPE_DATA_N1(pipe) _PIPE(pipe, _PIPEA_DATA_N1, _PIPEB_DATA_N1)
2461#define PIPEB_LINK_N2 0x6104c 2721#define PIPE_DATA_M2(pipe) _PIPE(pipe, _PIPEA_DATA_M2, _PIPEB_DATA_M2)
2462#define PIPEB_LINK_N2_OFFSET 0 2722#define PIPE_DATA_N2(pipe) _PIPE(pipe, _PIPEA_DATA_N2, _PIPEB_DATA_N2)
2723#define PIPE_LINK_M1(pipe) _PIPE(pipe, _PIPEA_LINK_M1, _PIPEB_LINK_M1)
2724#define PIPE_LINK_N1(pipe) _PIPE(pipe, _PIPEA_LINK_N1, _PIPEB_LINK_N1)
2725#define PIPE_LINK_M2(pipe) _PIPE(pipe, _PIPEA_LINK_M2, _PIPEB_LINK_M2)
2726#define PIPE_LINK_N2(pipe) _PIPE(pipe, _PIPEA_LINK_N2, _PIPEB_LINK_N2)
2463 2727
2464/* CPU panel fitter */ 2728/* CPU panel fitter */
2465#define PFA_CTL_1 0x68080 2729/* IVB+ has 3 fitters, 0 is 7x5 capable, the other two only 3x3 */
2466#define PFB_CTL_1 0x68880 2730#define _PFA_CTL_1 0x68080
2731#define _PFB_CTL_1 0x68880
2467#define PF_ENABLE (1<<31) 2732#define PF_ENABLE (1<<31)
2468#define PF_FILTER_MASK (3<<23) 2733#define PF_FILTER_MASK (3<<23)
2469#define PF_FILTER_PROGRAMMED (0<<23) 2734#define PF_FILTER_PROGRAMMED (0<<23)
2470#define PF_FILTER_MED_3x3 (1<<23) 2735#define PF_FILTER_MED_3x3 (1<<23)
2471#define PF_FILTER_EDGE_ENHANCE (2<<23) 2736#define PF_FILTER_EDGE_ENHANCE (2<<23)
2472#define PF_FILTER_EDGE_SOFTEN (3<<23) 2737#define PF_FILTER_EDGE_SOFTEN (3<<23)
2473#define PFA_WIN_SZ 0x68074 2738#define _PFA_WIN_SZ 0x68074
2474#define PFB_WIN_SZ 0x68874 2739#define _PFB_WIN_SZ 0x68874
2475#define PFA_WIN_POS 0x68070 2740#define _PFA_WIN_POS 0x68070
2476#define PFB_WIN_POS 0x68870 2741#define _PFB_WIN_POS 0x68870
2742#define _PFA_VSCALE 0x68084
2743#define _PFB_VSCALE 0x68884
2744#define _PFA_HSCALE 0x68090
2745#define _PFB_HSCALE 0x68890
2746
2747#define PF_CTL(pipe) _PIPE(pipe, _PFA_CTL_1, _PFB_CTL_1)
2748#define PF_WIN_SZ(pipe) _PIPE(pipe, _PFA_WIN_SZ, _PFB_WIN_SZ)
2749#define PF_WIN_POS(pipe) _PIPE(pipe, _PFA_WIN_POS, _PFB_WIN_POS)
2750#define PF_VSCALE(pipe) _PIPE(pipe, _PFA_VSCALE, _PFB_VSCALE)
2751#define PF_HSCALE(pipe) _PIPE(pipe, _PFA_HSCALE, _PFB_HSCALE)
2477 2752
2478/* legacy palette */ 2753/* legacy palette */
2479#define LGC_PALETTE_A 0x4a000 2754#define _LGC_PALETTE_A 0x4a000
2480#define LGC_PALETTE_B 0x4a800 2755#define _LGC_PALETTE_B 0x4a800
2756#define LGC_PALETTE(pipe) _PIPE(pipe, _LGC_PALETTE_A, _LGC_PALETTE_B)
2481 2757
2482/* interrupts */ 2758/* interrupts */
2483#define DE_MASTER_IRQ_CONTROL (1 << 31) 2759#define DE_MASTER_IRQ_CONTROL (1 << 31)
@@ -2506,6 +2782,19 @@
2506#define DE_PIPEA_VSYNC (1 << 3) 2782#define DE_PIPEA_VSYNC (1 << 3)
2507#define DE_PIPEA_FIFO_UNDERRUN (1 << 0) 2783#define DE_PIPEA_FIFO_UNDERRUN (1 << 0)
2508 2784
2785/* More Ivybridge lolz */
2786#define DE_ERR_DEBUG_IVB (1<<30)
2787#define DE_GSE_IVB (1<<29)
2788#define DE_PCH_EVENT_IVB (1<<28)
2789#define DE_DP_A_HOTPLUG_IVB (1<<27)
2790#define DE_AUX_CHANNEL_A_IVB (1<<26)
2791#define DE_SPRITEB_FLIP_DONE_IVB (1<<9)
2792#define DE_SPRITEA_FLIP_DONE_IVB (1<<4)
2793#define DE_PLANEB_FLIP_DONE_IVB (1<<8)
2794#define DE_PLANEA_FLIP_DONE_IVB (1<<3)
2795#define DE_PIPEB_VBLANK_IVB (1<<5)
2796#define DE_PIPEA_VBLANK_IVB (1<<0)
2797
2509#define DEISR 0x44000 2798#define DEISR 0x44000
2510#define DEIMR 0x44004 2799#define DEIMR 0x44004
2511#define DEIIR 0x44008 2800#define DEIIR 0x44008
@@ -2516,7 +2805,8 @@
2516#define GT_SYNC_STATUS (1 << 2) 2805#define GT_SYNC_STATUS (1 << 2)
2517#define GT_USER_INTERRUPT (1 << 0) 2806#define GT_USER_INTERRUPT (1 << 0)
2518#define GT_BSD_USER_INTERRUPT (1 << 5) 2807#define GT_BSD_USER_INTERRUPT (1 << 5)
2519 2808#define GT_GEN6_BSD_USER_INTERRUPT (1 << 12)
2809#define GT_BLT_USER_INTERRUPT (1 << 22)
2520 2810
2521#define GTISR 0x44010 2811#define GTISR 0x44010
2522#define GTIMR 0x44014 2812#define GTIMR 0x44014
@@ -2524,10 +2814,22 @@
2524#define GTIER 0x4401c 2814#define GTIER 0x4401c
2525 2815
2526#define ILK_DISPLAY_CHICKEN2 0x42004 2816#define ILK_DISPLAY_CHICKEN2 0x42004
2817/* Required on all Ironlake and Sandybridge according to the B-Spec. */
2818#define ILK_ELPIN_409_SELECT (1 << 25)
2527#define ILK_DPARB_GATE (1<<22) 2819#define ILK_DPARB_GATE (1<<22)
2528#define ILK_VSDPFD_FULL (1<<21) 2820#define ILK_VSDPFD_FULL (1<<21)
2821#define ILK_DISPLAY_CHICKEN_FUSES 0x42014
2822#define ILK_INTERNAL_GRAPHICS_DISABLE (1<<31)
2823#define ILK_INTERNAL_DISPLAY_DISABLE (1<<30)
2824#define ILK_DISPLAY_DEBUG_DISABLE (1<<29)
2825#define ILK_HDCP_DISABLE (1<<25)
2826#define ILK_eDP_A_DISABLE (1<<24)
2827#define ILK_DESKTOP (1<<23)
2529#define ILK_DSPCLK_GATE 0x42020 2828#define ILK_DSPCLK_GATE 0x42020
2829#define IVB_VRHUNIT_CLK_GATE (1<<28)
2530#define ILK_DPARB_CLK_GATE (1<<5) 2830#define ILK_DPARB_CLK_GATE (1<<5)
2831#define ILK_DPFD_CLK_GATE (1<<7)
2832
2531/* According to spec this bit 7/8/9 of 0x42020 should be set to enable FBC */ 2833/* According to spec this bit 7/8/9 of 0x42020 should be set to enable FBC */
2532#define ILK_CLK_FBC (1<<7) 2834#define ILK_CLK_FBC (1<<7)
2533#define ILK_DPFC_DIS1 (1<<8) 2835#define ILK_DPFC_DIS1 (1<<8)
@@ -2540,17 +2842,50 @@
2540/* PCH */ 2842/* PCH */
2541 2843
2542/* south display engine interrupt */ 2844/* south display engine interrupt */
2845#define SDE_AUDIO_POWER_D (1 << 27)
2846#define SDE_AUDIO_POWER_C (1 << 26)
2847#define SDE_AUDIO_POWER_B (1 << 25)
2848#define SDE_AUDIO_POWER_SHIFT (25)
2849#define SDE_AUDIO_POWER_MASK (7 << SDE_AUDIO_POWER_SHIFT)
2850#define SDE_GMBUS (1 << 24)
2851#define SDE_AUDIO_HDCP_TRANSB (1 << 23)
2852#define SDE_AUDIO_HDCP_TRANSA (1 << 22)
2853#define SDE_AUDIO_HDCP_MASK (3 << 22)
2854#define SDE_AUDIO_TRANSB (1 << 21)
2855#define SDE_AUDIO_TRANSA (1 << 20)
2856#define SDE_AUDIO_TRANS_MASK (3 << 20)
2857#define SDE_POISON (1 << 19)
2858/* 18 reserved */
2859#define SDE_FDI_RXB (1 << 17)
2860#define SDE_FDI_RXA (1 << 16)
2861#define SDE_FDI_MASK (3 << 16)
2862#define SDE_AUXD (1 << 15)
2863#define SDE_AUXC (1 << 14)
2864#define SDE_AUXB (1 << 13)
2865#define SDE_AUX_MASK (7 << 13)
2866/* 12 reserved */
2543#define SDE_CRT_HOTPLUG (1 << 11) 2867#define SDE_CRT_HOTPLUG (1 << 11)
2544#define SDE_PORTD_HOTPLUG (1 << 10) 2868#define SDE_PORTD_HOTPLUG (1 << 10)
2545#define SDE_PORTC_HOTPLUG (1 << 9) 2869#define SDE_PORTC_HOTPLUG (1 << 9)
2546#define SDE_PORTB_HOTPLUG (1 << 8) 2870#define SDE_PORTB_HOTPLUG (1 << 8)
2547#define SDE_SDVOB_HOTPLUG (1 << 6) 2871#define SDE_SDVOB_HOTPLUG (1 << 6)
2548#define SDE_HOTPLUG_MASK (0xf << 8) 2872#define SDE_HOTPLUG_MASK (0xf << 8)
2873#define SDE_TRANSB_CRC_DONE (1 << 5)
2874#define SDE_TRANSB_CRC_ERR (1 << 4)
2875#define SDE_TRANSB_FIFO_UNDER (1 << 3)
2876#define SDE_TRANSA_CRC_DONE (1 << 2)
2877#define SDE_TRANSA_CRC_ERR (1 << 1)
2878#define SDE_TRANSA_FIFO_UNDER (1 << 0)
2879#define SDE_TRANS_MASK (0x3f)
2549/* CPT */ 2880/* CPT */
2550#define SDE_CRT_HOTPLUG_CPT (1 << 19) 2881#define SDE_CRT_HOTPLUG_CPT (1 << 19)
2551#define SDE_PORTD_HOTPLUG_CPT (1 << 23) 2882#define SDE_PORTD_HOTPLUG_CPT (1 << 23)
2552#define SDE_PORTC_HOTPLUG_CPT (1 << 22) 2883#define SDE_PORTC_HOTPLUG_CPT (1 << 22)
2553#define SDE_PORTB_HOTPLUG_CPT (1 << 21) 2884#define SDE_PORTB_HOTPLUG_CPT (1 << 21)
2885#define SDE_HOTPLUG_MASK_CPT (SDE_CRT_HOTPLUG_CPT | \
2886 SDE_PORTD_HOTPLUG_CPT | \
2887 SDE_PORTC_HOTPLUG_CPT | \
2888 SDE_PORTB_HOTPLUG_CPT)
2554 2889
2555#define SDEISR 0xc4000 2890#define SDEISR 0xc4000
2556#define SDEIMR 0xc4004 2891#define SDEIMR 0xc4004
@@ -2598,13 +2933,17 @@
2598#define PCH_GMBUS4 0xc5110 2933#define PCH_GMBUS4 0xc5110
2599#define PCH_GMBUS5 0xc5120 2934#define PCH_GMBUS5 0xc5120
2600 2935
2601#define PCH_DPLL_A 0xc6014 2936#define _PCH_DPLL_A 0xc6014
2602#define PCH_DPLL_B 0xc6018 2937#define _PCH_DPLL_B 0xc6018
2938#define PCH_DPLL(pipe) _PIPE(pipe, _PCH_DPLL_A, _PCH_DPLL_B)
2603 2939
2604#define PCH_FPA0 0xc6040 2940#define _PCH_FPA0 0xc6040
2605#define PCH_FPA1 0xc6044 2941#define FP_CB_TUNE (0x3<<22)
2606#define PCH_FPB0 0xc6048 2942#define _PCH_FPA1 0xc6044
2607#define PCH_FPB1 0xc604c 2943#define _PCH_FPB0 0xc6048
2944#define _PCH_FPB1 0xc604c
2945#define PCH_FP0(pipe) _PIPE(pipe, _PCH_FPA0, _PCH_FPB0)
2946#define PCH_FP1(pipe) _PIPE(pipe, _PCH_FPA1, _PCH_FPB1)
2608 2947
2609#define PCH_DPLL_TEST 0xc606c 2948#define PCH_DPLL_TEST 0xc606c
2610 2949
@@ -2623,6 +2962,7 @@
2623#define DREF_NONSPREAD_SOURCE_MASK (3<<9) 2962#define DREF_NONSPREAD_SOURCE_MASK (3<<9)
2624#define DREF_SUPERSPREAD_SOURCE_DISABLE (0<<7) 2963#define DREF_SUPERSPREAD_SOURCE_DISABLE (0<<7)
2625#define DREF_SUPERSPREAD_SOURCE_ENABLE (2<<7) 2964#define DREF_SUPERSPREAD_SOURCE_ENABLE (2<<7)
2965#define DREF_SUPERSPREAD_SOURCE_MASK (3<<7)
2626#define DREF_SSC4_DOWNSPREAD (0<<6) 2966#define DREF_SSC4_DOWNSPREAD (0<<6)
2627#define DREF_SSC4_CENTERSPREAD (1<<6) 2967#define DREF_SSC4_CENTERSPREAD (1<<6)
2628#define DREF_SSC1_DISABLE (0<<1) 2968#define DREF_SSC1_DISABLE (0<<1)
@@ -2655,52 +2995,69 @@
2655 2995
2656/* transcoder */ 2996/* transcoder */
2657 2997
2658#define TRANS_HTOTAL_A 0xe0000 2998#define _TRANS_HTOTAL_A 0xe0000
2659#define TRANS_HTOTAL_SHIFT 16 2999#define TRANS_HTOTAL_SHIFT 16
2660#define TRANS_HACTIVE_SHIFT 0 3000#define TRANS_HACTIVE_SHIFT 0
2661#define TRANS_HBLANK_A 0xe0004 3001#define _TRANS_HBLANK_A 0xe0004
2662#define TRANS_HBLANK_END_SHIFT 16 3002#define TRANS_HBLANK_END_SHIFT 16
2663#define TRANS_HBLANK_START_SHIFT 0 3003#define TRANS_HBLANK_START_SHIFT 0
2664#define TRANS_HSYNC_A 0xe0008 3004#define _TRANS_HSYNC_A 0xe0008
2665#define TRANS_HSYNC_END_SHIFT 16 3005#define TRANS_HSYNC_END_SHIFT 16
2666#define TRANS_HSYNC_START_SHIFT 0 3006#define TRANS_HSYNC_START_SHIFT 0
2667#define TRANS_VTOTAL_A 0xe000c 3007#define _TRANS_VTOTAL_A 0xe000c
2668#define TRANS_VTOTAL_SHIFT 16 3008#define TRANS_VTOTAL_SHIFT 16
2669#define TRANS_VACTIVE_SHIFT 0 3009#define TRANS_VACTIVE_SHIFT 0
2670#define TRANS_VBLANK_A 0xe0010 3010#define _TRANS_VBLANK_A 0xe0010
2671#define TRANS_VBLANK_END_SHIFT 16 3011#define TRANS_VBLANK_END_SHIFT 16
2672#define TRANS_VBLANK_START_SHIFT 0 3012#define TRANS_VBLANK_START_SHIFT 0
2673#define TRANS_VSYNC_A 0xe0014 3013#define _TRANS_VSYNC_A 0xe0014
2674#define TRANS_VSYNC_END_SHIFT 16 3014#define TRANS_VSYNC_END_SHIFT 16
2675#define TRANS_VSYNC_START_SHIFT 0 3015#define TRANS_VSYNC_START_SHIFT 0
2676 3016
2677#define TRANSA_DATA_M1 0xe0030 3017#define _TRANSA_DATA_M1 0xe0030
2678#define TRANSA_DATA_N1 0xe0034 3018#define _TRANSA_DATA_N1 0xe0034
2679#define TRANSA_DATA_M2 0xe0038 3019#define _TRANSA_DATA_M2 0xe0038
2680#define TRANSA_DATA_N2 0xe003c 3020#define _TRANSA_DATA_N2 0xe003c
2681#define TRANSA_DP_LINK_M1 0xe0040 3021#define _TRANSA_DP_LINK_M1 0xe0040
2682#define TRANSA_DP_LINK_N1 0xe0044 3022#define _TRANSA_DP_LINK_N1 0xe0044
2683#define TRANSA_DP_LINK_M2 0xe0048 3023#define _TRANSA_DP_LINK_M2 0xe0048
2684#define TRANSA_DP_LINK_N2 0xe004c 3024#define _TRANSA_DP_LINK_N2 0xe004c
2685 3025
2686#define TRANS_HTOTAL_B 0xe1000 3026#define _TRANS_HTOTAL_B 0xe1000
2687#define TRANS_HBLANK_B 0xe1004 3027#define _TRANS_HBLANK_B 0xe1004
2688#define TRANS_HSYNC_B 0xe1008 3028#define _TRANS_HSYNC_B 0xe1008
2689#define TRANS_VTOTAL_B 0xe100c 3029#define _TRANS_VTOTAL_B 0xe100c
2690#define TRANS_VBLANK_B 0xe1010 3030#define _TRANS_VBLANK_B 0xe1010
2691#define TRANS_VSYNC_B 0xe1014 3031#define _TRANS_VSYNC_B 0xe1014
2692 3032
2693#define TRANSB_DATA_M1 0xe1030 3033#define TRANS_HTOTAL(pipe) _PIPE(pipe, _TRANS_HTOTAL_A, _TRANS_HTOTAL_B)
2694#define TRANSB_DATA_N1 0xe1034 3034#define TRANS_HBLANK(pipe) _PIPE(pipe, _TRANS_HBLANK_A, _TRANS_HBLANK_B)
2695#define TRANSB_DATA_M2 0xe1038 3035#define TRANS_HSYNC(pipe) _PIPE(pipe, _TRANS_HSYNC_A, _TRANS_HSYNC_B)
2696#define TRANSB_DATA_N2 0xe103c 3036#define TRANS_VTOTAL(pipe) _PIPE(pipe, _TRANS_VTOTAL_A, _TRANS_VTOTAL_B)
2697#define TRANSB_DP_LINK_M1 0xe1040 3037#define TRANS_VBLANK(pipe) _PIPE(pipe, _TRANS_VBLANK_A, _TRANS_VBLANK_B)
2698#define TRANSB_DP_LINK_N1 0xe1044 3038#define TRANS_VSYNC(pipe) _PIPE(pipe, _TRANS_VSYNC_A, _TRANS_VSYNC_B)
2699#define TRANSB_DP_LINK_M2 0xe1048 3039
2700#define TRANSB_DP_LINK_N2 0xe104c 3040#define _TRANSB_DATA_M1 0xe1030
2701 3041#define _TRANSB_DATA_N1 0xe1034
2702#define TRANSACONF 0xf0008 3042#define _TRANSB_DATA_M2 0xe1038
2703#define TRANSBCONF 0xf1008 3043#define _TRANSB_DATA_N2 0xe103c
3044#define _TRANSB_DP_LINK_M1 0xe1040
3045#define _TRANSB_DP_LINK_N1 0xe1044
3046#define _TRANSB_DP_LINK_M2 0xe1048
3047#define _TRANSB_DP_LINK_N2 0xe104c
3048
3049#define TRANSDATA_M1(pipe) _PIPE(pipe, _TRANSA_DATA_M1, _TRANSB_DATA_M1)
3050#define TRANSDATA_N1(pipe) _PIPE(pipe, _TRANSA_DATA_N1, _TRANSB_DATA_N1)
3051#define TRANSDATA_M2(pipe) _PIPE(pipe, _TRANSA_DATA_M2, _TRANSB_DATA_M2)
3052#define TRANSDATA_N2(pipe) _PIPE(pipe, _TRANSA_DATA_N2, _TRANSB_DATA_N2)
3053#define TRANSDPLINK_M1(pipe) _PIPE(pipe, _TRANSA_DP_LINK_M1, _TRANSB_DP_LINK_M1)
3054#define TRANSDPLINK_N1(pipe) _PIPE(pipe, _TRANSA_DP_LINK_N1, _TRANSB_DP_LINK_N1)
3055#define TRANSDPLINK_M2(pipe) _PIPE(pipe, _TRANSA_DP_LINK_M2, _TRANSB_DP_LINK_M2)
3056#define TRANSDPLINK_N2(pipe) _PIPE(pipe, _TRANSA_DP_LINK_N2, _TRANSB_DP_LINK_N2)
3057
3058#define _TRANSACONF 0xf0008
3059#define _TRANSBCONF 0xf1008
3060#define TRANSCONF(plane) _PIPE(plane, _TRANSACONF, _TRANSBCONF)
2704#define TRANS_DISABLE (0<<31) 3061#define TRANS_DISABLE (0<<31)
2705#define TRANS_ENABLE (1<<31) 3062#define TRANS_ENABLE (1<<31)
2706#define TRANS_STATE_MASK (1<<30) 3063#define TRANS_STATE_MASK (1<<30)
@@ -2718,13 +3075,22 @@
2718#define TRANS_6BPC (2<<5) 3075#define TRANS_6BPC (2<<5)
2719#define TRANS_12BPC (3<<5) 3076#define TRANS_12BPC (3<<5)
2720 3077
2721#define FDI_RXA_CHICKEN 0xc200c 3078#define SOUTH_CHICKEN2 0xc2004
2722#define FDI_RXB_CHICKEN 0xc2010 3079#define DPLS_EDP_PPS_FIX_DIS (1<<0)
2723#define FDI_RX_PHASE_SYNC_POINTER_ENABLE (1) 3080
3081#define _FDI_RXA_CHICKEN 0xc200c
3082#define _FDI_RXB_CHICKEN 0xc2010
3083#define FDI_RX_PHASE_SYNC_POINTER_OVR (1<<1)
3084#define FDI_RX_PHASE_SYNC_POINTER_EN (1<<0)
3085#define FDI_RX_CHICKEN(pipe) _PIPE(pipe, _FDI_RXA_CHICKEN, _FDI_RXB_CHICKEN)
3086
3087#define SOUTH_DSPCLK_GATE_D 0xc2020
3088#define PCH_DPLSUNIT_CLOCK_GATE_DISABLE (1<<29)
2724 3089
2725/* CPU: FDI_TX */ 3090/* CPU: FDI_TX */
2726#define FDI_TXA_CTL 0x60100 3091#define _FDI_TXA_CTL 0x60100
2727#define FDI_TXB_CTL 0x61100 3092#define _FDI_TXB_CTL 0x61100
3093#define FDI_TX_CTL(pipe) _PIPE(pipe, _FDI_TXA_CTL, _FDI_TXB_CTL)
2728#define FDI_TX_DISABLE (0<<31) 3094#define FDI_TX_DISABLE (0<<31)
2729#define FDI_TX_ENABLE (1<<31) 3095#define FDI_TX_ENABLE (1<<31)
2730#define FDI_LINK_TRAIN_PATTERN_1 (0<<28) 3096#define FDI_LINK_TRAIN_PATTERN_1 (0<<28)
@@ -2759,16 +3125,26 @@
2759#define FDI_TX_ENHANCE_FRAME_ENABLE (1<<18) 3125#define FDI_TX_ENHANCE_FRAME_ENABLE (1<<18)
2760/* Ironlake: hardwired to 1 */ 3126/* Ironlake: hardwired to 1 */
2761#define FDI_TX_PLL_ENABLE (1<<14) 3127#define FDI_TX_PLL_ENABLE (1<<14)
3128
3129/* Ivybridge has different bits for lolz */
3130#define FDI_LINK_TRAIN_PATTERN_1_IVB (0<<8)
3131#define FDI_LINK_TRAIN_PATTERN_2_IVB (1<<8)
3132#define FDI_LINK_TRAIN_PATTERN_IDLE_IVB (2<<8)
3133#define FDI_LINK_TRAIN_NONE_IVB (3<<8)
3134
2762/* both Tx and Rx */ 3135/* both Tx and Rx */
3136#define FDI_LINK_TRAIN_AUTO (1<<10)
2763#define FDI_SCRAMBLING_ENABLE (0<<7) 3137#define FDI_SCRAMBLING_ENABLE (0<<7)
2764#define FDI_SCRAMBLING_DISABLE (1<<7) 3138#define FDI_SCRAMBLING_DISABLE (1<<7)
2765 3139
2766/* FDI_RX, FDI_X is hard-wired to Transcoder_X */ 3140/* FDI_RX, FDI_X is hard-wired to Transcoder_X */
2767#define FDI_RXA_CTL 0xf000c 3141#define _FDI_RXA_CTL 0xf000c
2768#define FDI_RXB_CTL 0xf100c 3142#define _FDI_RXB_CTL 0xf100c
3143#define FDI_RX_CTL(pipe) _PIPE(pipe, _FDI_RXA_CTL, _FDI_RXB_CTL)
2769#define FDI_RX_ENABLE (1<<31) 3144#define FDI_RX_ENABLE (1<<31)
2770#define FDI_RX_DISABLE (0<<31)
2771/* train, dp width same as FDI_TX */ 3145/* train, dp width same as FDI_TX */
3146#define FDI_FS_ERRC_ENABLE (1<<27)
3147#define FDI_FE_ERRC_ENABLE (1<<26)
2772#define FDI_DP_PORT_WIDTH_X8 (7<<19) 3148#define FDI_DP_PORT_WIDTH_X8 (7<<19)
2773#define FDI_8BPC (0<<16) 3149#define FDI_8BPC (0<<16)
2774#define FDI_10BPC (1<<16) 3150#define FDI_10BPC (1<<16)
@@ -2782,8 +3158,7 @@
2782#define FDI_FS_ERR_REPORT_ENABLE (1<<9) 3158#define FDI_FS_ERR_REPORT_ENABLE (1<<9)
2783#define FDI_FE_ERR_REPORT_ENABLE (1<<8) 3159#define FDI_FE_ERR_REPORT_ENABLE (1<<8)
2784#define FDI_RX_ENHANCE_FRAME_ENABLE (1<<6) 3160#define FDI_RX_ENHANCE_FRAME_ENABLE (1<<6)
2785#define FDI_SEL_RAWCLK (0<<4) 3161#define FDI_PCDCLK (1<<4)
2786#define FDI_SEL_PCDCLK (1<<4)
2787/* CPT */ 3162/* CPT */
2788#define FDI_AUTO_TRAINING (1<<10) 3163#define FDI_AUTO_TRAINING (1<<10)
2789#define FDI_LINK_TRAIN_PATTERN_1_CPT (0<<8) 3164#define FDI_LINK_TRAIN_PATTERN_1_CPT (0<<8)
@@ -2792,12 +3167,15 @@
2792#define FDI_LINK_TRAIN_NORMAL_CPT (3<<8) 3167#define FDI_LINK_TRAIN_NORMAL_CPT (3<<8)
2793#define FDI_LINK_TRAIN_PATTERN_MASK_CPT (3<<8) 3168#define FDI_LINK_TRAIN_PATTERN_MASK_CPT (3<<8)
2794 3169
2795#define FDI_RXA_MISC 0xf0010 3170#define _FDI_RXA_MISC 0xf0010
2796#define FDI_RXB_MISC 0xf1010 3171#define _FDI_RXB_MISC 0xf1010
2797#define FDI_RXA_TUSIZE1 0xf0030 3172#define _FDI_RXA_TUSIZE1 0xf0030
2798#define FDI_RXA_TUSIZE2 0xf0038 3173#define _FDI_RXA_TUSIZE2 0xf0038
2799#define FDI_RXB_TUSIZE1 0xf1030 3174#define _FDI_RXB_TUSIZE1 0xf1030
2800#define FDI_RXB_TUSIZE2 0xf1038 3175#define _FDI_RXB_TUSIZE2 0xf1038
3176#define FDI_RX_MISC(pipe) _PIPE(pipe, _FDI_RXA_MISC, _FDI_RXB_MISC)
3177#define FDI_RX_TUSIZE1(pipe) _PIPE(pipe, _FDI_RXA_TUSIZE1, _FDI_RXB_TUSIZE1)
3178#define FDI_RX_TUSIZE2(pipe) _PIPE(pipe, _FDI_RXA_TUSIZE2, _FDI_RXB_TUSIZE2)
2801 3179
2802/* FDI_RX interrupt register format */ 3180/* FDI_RX interrupt register format */
2803#define FDI_RX_INTER_LANE_ALIGN (1<<10) 3181#define FDI_RX_INTER_LANE_ALIGN (1<<10)
@@ -2812,10 +3190,12 @@
2812#define FDI_RX_CROSS_CLOCK_OVERFLOW (1<<1) 3190#define FDI_RX_CROSS_CLOCK_OVERFLOW (1<<1)
2813#define FDI_RX_SYMBOL_QUEUE_OVERFLOW (1<<0) 3191#define FDI_RX_SYMBOL_QUEUE_OVERFLOW (1<<0)
2814 3192
2815#define FDI_RXA_IIR 0xf0014 3193#define _FDI_RXA_IIR 0xf0014
2816#define FDI_RXA_IMR 0xf0018 3194#define _FDI_RXA_IMR 0xf0018
2817#define FDI_RXB_IIR 0xf1014 3195#define _FDI_RXB_IIR 0xf1014
2818#define FDI_RXB_IMR 0xf1018 3196#define _FDI_RXB_IMR 0xf1018
3197#define FDI_RX_IIR(pipe) _PIPE(pipe, _FDI_RXA_IIR, _FDI_RXB_IIR)
3198#define FDI_RX_IMR(pipe) _PIPE(pipe, _FDI_RXA_IMR, _FDI_RXB_IMR)
2819 3199
2820#define FDI_PLL_CTL_1 0xfe000 3200#define FDI_PLL_CTL_1 0xfe000
2821#define FDI_PLL_CTL_2 0xfe004 3201#define FDI_PLL_CTL_2 0xfe004
@@ -2845,11 +3225,15 @@
2845#define ADPA_CRT_HOTPLUG_VOLREF_475MV (1<<17) 3225#define ADPA_CRT_HOTPLUG_VOLREF_475MV (1<<17)
2846#define ADPA_CRT_HOTPLUG_FORCE_TRIGGER (1<<16) 3226#define ADPA_CRT_HOTPLUG_FORCE_TRIGGER (1<<16)
2847 3227
3228#define ADPA_PIPE_ENABLED(V, P) \
3229 (((V) & (ADPA_TRANS_SELECT_MASK | ADPA_DAC_ENABLE)) == ((P) << 30 | ADPA_DAC_ENABLE))
3230
2848/* or SDVOB */ 3231/* or SDVOB */
2849#define HDMIB 0xe1140 3232#define HDMIB 0xe1140
2850#define PORT_ENABLE (1 << 31) 3233#define PORT_ENABLE (1 << 31)
2851#define TRANSCODER_A (0) 3234#define TRANSCODER_A (0)
2852#define TRANSCODER_B (1 << 30) 3235#define TRANSCODER_B (1 << 30)
3236#define TRANSCODER_MASK (1 << 30)
2853#define COLOR_FORMAT_8bpc (0) 3237#define COLOR_FORMAT_8bpc (0)
2854#define COLOR_FORMAT_12bpc (3 << 26) 3238#define COLOR_FORMAT_12bpc (3 << 26)
2855#define SDVOB_HOTPLUG_ENABLE (1 << 23) 3239#define SDVOB_HOTPLUG_ENABLE (1 << 23)
@@ -2865,6 +3249,9 @@
2865#define HSYNC_ACTIVE_HIGH (1 << 3) 3249#define HSYNC_ACTIVE_HIGH (1 << 3)
2866#define PORT_DETECTED (1 << 2) 3250#define PORT_DETECTED (1 << 2)
2867 3251
3252#define HDMI_PIPE_ENABLED(V, P) \
3253 (((V) & (TRANSCODER_MASK | PORT_ENABLE)) == ((P) << 30 | PORT_ENABLE))
3254
2868/* PCH SDVOB multiplex with HDMIB */ 3255/* PCH SDVOB multiplex with HDMIB */
2869#define PCH_SDVOB HDMIB 3256#define PCH_SDVOB HDMIB
2870 3257
@@ -2935,10 +3322,12 @@
2935#define TRANS_DP_CTL_A 0xe0300 3322#define TRANS_DP_CTL_A 0xe0300
2936#define TRANS_DP_CTL_B 0xe1300 3323#define TRANS_DP_CTL_B 0xe1300
2937#define TRANS_DP_CTL_C 0xe2300 3324#define TRANS_DP_CTL_C 0xe2300
3325#define TRANS_DP_CTL(pipe) (TRANS_DP_CTL_A + (pipe) * 0x01000)
2938#define TRANS_DP_OUTPUT_ENABLE (1<<31) 3326#define TRANS_DP_OUTPUT_ENABLE (1<<31)
2939#define TRANS_DP_PORT_SEL_B (0<<29) 3327#define TRANS_DP_PORT_SEL_B (0<<29)
2940#define TRANS_DP_PORT_SEL_C (1<<29) 3328#define TRANS_DP_PORT_SEL_C (1<<29)
2941#define TRANS_DP_PORT_SEL_D (2<<29) 3329#define TRANS_DP_PORT_SEL_D (2<<29)
3330#define TRANS_DP_PORT_SEL_NONE (3<<29)
2942#define TRANS_DP_PORT_SEL_MASK (3<<29) 3331#define TRANS_DP_PORT_SEL_MASK (3<<29)
2943#define TRANS_DP_AUDIO_ONLY (1<<26) 3332#define TRANS_DP_AUDIO_ONLY (1<<26)
2944#define TRANS_DP_ENH_FRAMING (1<<18) 3333#define TRANS_DP_ENH_FRAMING (1<<18)
@@ -2946,6 +3335,7 @@
2946#define TRANS_DP_10BPC (1<<9) 3335#define TRANS_DP_10BPC (1<<9)
2947#define TRANS_DP_6BPC (2<<9) 3336#define TRANS_DP_6BPC (2<<9)
2948#define TRANS_DP_12BPC (3<<9) 3337#define TRANS_DP_12BPC (3<<9)
3338#define TRANS_DP_BPC_MASK (3<<9)
2949#define TRANS_DP_VSYNC_ACTIVE_HIGH (1<<4) 3339#define TRANS_DP_VSYNC_ACTIVE_HIGH (1<<4)
2950#define TRANS_DP_VSYNC_ACTIVE_LOW 0 3340#define TRANS_DP_VSYNC_ACTIVE_LOW 0
2951#define TRANS_DP_HSYNC_ACTIVE_HIGH (1<<3) 3341#define TRANS_DP_HSYNC_ACTIVE_HIGH (1<<3)
@@ -2959,10 +3349,92 @@
2959#define EDP_LINK_TRAIN_600MV_3_5DB_SNB_A (0x01<<22) 3349#define EDP_LINK_TRAIN_600MV_3_5DB_SNB_A (0x01<<22)
2960#define EDP_LINK_TRAIN_800MV_0DB_SNB_A (0x0<<22) 3350#define EDP_LINK_TRAIN_800MV_0DB_SNB_A (0x0<<22)
2961/* SNB B-stepping */ 3351/* SNB B-stepping */
2962#define EDP_LINK_TRAIN_400MV_0DB_SNB_B (0x0<<22) 3352#define EDP_LINK_TRAIN_400_600MV_0DB_SNB_B (0x0<<22)
2963#define EDP_LINK_TRAIN_400MV_6DB_SNB_B (0x3a<<22) 3353#define EDP_LINK_TRAIN_400MV_3_5DB_SNB_B (0x1<<22)
2964#define EDP_LINK_TRAIN_600MV_3_5DB_SNB_B (0x39<<22) 3354#define EDP_LINK_TRAIN_400_600MV_6DB_SNB_B (0x3a<<22)
2965#define EDP_LINK_TRAIN_800MV_0DB_SNB_B (0x38<<22) 3355#define EDP_LINK_TRAIN_600_800MV_3_5DB_SNB_B (0x39<<22)
3356#define EDP_LINK_TRAIN_800_1200MV_0DB_SNB_B (0x38<<22)
2966#define EDP_LINK_TRAIN_VOL_EMP_MASK_SNB (0x3f<<22) 3357#define EDP_LINK_TRAIN_VOL_EMP_MASK_SNB (0x3f<<22)
2967 3358
3359#define FORCEWAKE 0xA18C
3360#define FORCEWAKE_ACK 0x130090
3361
3362#define GT_FIFO_FREE_ENTRIES 0x120008
3363
3364#define GEN6_RPNSWREQ 0xA008
3365#define GEN6_TURBO_DISABLE (1<<31)
3366#define GEN6_FREQUENCY(x) ((x)<<25)
3367#define GEN6_OFFSET(x) ((x)<<19)
3368#define GEN6_AGGRESSIVE_TURBO (0<<15)
3369#define GEN6_RC_VIDEO_FREQ 0xA00C
3370#define GEN6_RC_CONTROL 0xA090
3371#define GEN6_RC_CTL_RC6pp_ENABLE (1<<16)
3372#define GEN6_RC_CTL_RC6p_ENABLE (1<<17)
3373#define GEN6_RC_CTL_RC6_ENABLE (1<<18)
3374#define GEN6_RC_CTL_RC1e_ENABLE (1<<20)
3375#define GEN6_RC_CTL_RC7_ENABLE (1<<22)
3376#define GEN6_RC_CTL_EI_MODE(x) ((x)<<27)
3377#define GEN6_RC_CTL_HW_ENABLE (1<<31)
3378#define GEN6_RP_DOWN_TIMEOUT 0xA010
3379#define GEN6_RP_INTERRUPT_LIMITS 0xA014
3380#define GEN6_RPSTAT1 0xA01C
3381#define GEN6_CAGF_SHIFT 8
3382#define GEN6_CAGF_MASK (0x7f << GEN6_CAGF_SHIFT)
3383#define GEN6_RP_CONTROL 0xA024
3384#define GEN6_RP_MEDIA_TURBO (1<<11)
3385#define GEN6_RP_USE_NORMAL_FREQ (1<<9)
3386#define GEN6_RP_MEDIA_IS_GFX (1<<8)
3387#define GEN6_RP_ENABLE (1<<7)
3388#define GEN6_RP_UP_IDLE_MIN (0x1<<3)
3389#define GEN6_RP_UP_BUSY_AVG (0x2<<3)
3390#define GEN6_RP_UP_BUSY_CONT (0x4<<3)
3391#define GEN6_RP_DOWN_IDLE_CONT (0x1<<0)
3392#define GEN6_RP_UP_THRESHOLD 0xA02C
3393#define GEN6_RP_DOWN_THRESHOLD 0xA030
3394#define GEN6_RP_CUR_UP_EI 0xA050
3395#define GEN6_CURICONT_MASK 0xffffff
3396#define GEN6_RP_CUR_UP 0xA054
3397#define GEN6_CURBSYTAVG_MASK 0xffffff
3398#define GEN6_RP_PREV_UP 0xA058
3399#define GEN6_RP_CUR_DOWN_EI 0xA05C
3400#define GEN6_CURIAVG_MASK 0xffffff
3401#define GEN6_RP_CUR_DOWN 0xA060
3402#define GEN6_RP_PREV_DOWN 0xA064
3403#define GEN6_RP_UP_EI 0xA068
3404#define GEN6_RP_DOWN_EI 0xA06C
3405#define GEN6_RP_IDLE_HYSTERSIS 0xA070
3406#define GEN6_RC_STATE 0xA094
3407#define GEN6_RC1_WAKE_RATE_LIMIT 0xA098
3408#define GEN6_RC6_WAKE_RATE_LIMIT 0xA09C
3409#define GEN6_RC6pp_WAKE_RATE_LIMIT 0xA0A0
3410#define GEN6_RC_EVALUATION_INTERVAL 0xA0A8
3411#define GEN6_RC_IDLE_HYSTERSIS 0xA0AC
3412#define GEN6_RC_SLEEP 0xA0B0
3413#define GEN6_RC1e_THRESHOLD 0xA0B4
3414#define GEN6_RC6_THRESHOLD 0xA0B8
3415#define GEN6_RC6p_THRESHOLD 0xA0BC
3416#define GEN6_RC6pp_THRESHOLD 0xA0C0
3417#define GEN6_PMINTRMSK 0xA168
3418
3419#define GEN6_PMISR 0x44020
3420#define GEN6_PMIMR 0x44024 /* rps_lock */
3421#define GEN6_PMIIR 0x44028
3422#define GEN6_PMIER 0x4402C
3423#define GEN6_PM_MBOX_EVENT (1<<25)
3424#define GEN6_PM_THERMAL_EVENT (1<<24)
3425#define GEN6_PM_RP_DOWN_TIMEOUT (1<<6)
3426#define GEN6_PM_RP_UP_THRESHOLD (1<<5)
3427#define GEN6_PM_RP_DOWN_THRESHOLD (1<<4)
3428#define GEN6_PM_RP_UP_EI_EXPIRED (1<<2)
3429#define GEN6_PM_RP_DOWN_EI_EXPIRED (1<<1)
3430#define GEN6_PM_DEFERRED_EVENTS (GEN6_PM_RP_UP_THRESHOLD | \
3431 GEN6_PM_RP_DOWN_THRESHOLD | \
3432 GEN6_PM_RP_DOWN_TIMEOUT)
3433
3434#define GEN6_PCODE_MAILBOX 0x138124
3435#define GEN6_PCODE_READY (1<<31)
3436#define GEN6_READ_OC_PARAMS 0xc
3437#define GEN6_PCODE_WRITE_MIN_FREQ_TABLE 0x9
3438#define GEN6_PCODE_DATA 0x138128
3439
2968#endif /* _I915_REG_H_ */ 3440#endif /* _I915_REG_H_ */
diff --git a/drivers/gpu/drm/i915/i915_suspend.c b/drivers/gpu/drm/i915/i915_suspend.c
index 31f08581e93a..5257cfc34c35 100644
--- a/drivers/gpu/drm/i915/i915_suspend.c
+++ b/drivers/gpu/drm/i915/i915_suspend.c
@@ -34,11 +34,10 @@ static bool i915_pipe_enabled(struct drm_device *dev, enum pipe pipe)
34 struct drm_i915_private *dev_priv = dev->dev_private; 34 struct drm_i915_private *dev_priv = dev->dev_private;
35 u32 dpll_reg; 35 u32 dpll_reg;
36 36
37 if (HAS_PCH_SPLIT(dev)) { 37 if (HAS_PCH_SPLIT(dev))
38 dpll_reg = (pipe == PIPE_A) ? PCH_DPLL_A: PCH_DPLL_B; 38 dpll_reg = (pipe == PIPE_A) ? _PCH_DPLL_A : _PCH_DPLL_B;
39 } else { 39 else
40 dpll_reg = (pipe == PIPE_A) ? DPLL_A: DPLL_B; 40 dpll_reg = (pipe == PIPE_A) ? _DPLL_A : _DPLL_B;
41 }
42 41
43 return (I915_READ(dpll_reg) & DPLL_VCO_ENABLE); 42 return (I915_READ(dpll_reg) & DPLL_VCO_ENABLE);
44} 43}
@@ -46,7 +45,7 @@ static bool i915_pipe_enabled(struct drm_device *dev, enum pipe pipe)
46static void i915_save_palette(struct drm_device *dev, enum pipe pipe) 45static void i915_save_palette(struct drm_device *dev, enum pipe pipe)
47{ 46{
48 struct drm_i915_private *dev_priv = dev->dev_private; 47 struct drm_i915_private *dev_priv = dev->dev_private;
49 unsigned long reg = (pipe == PIPE_A ? PALETTE_A : PALETTE_B); 48 unsigned long reg = (pipe == PIPE_A ? _PALETTE_A : _PALETTE_B);
50 u32 *array; 49 u32 *array;
51 int i; 50 int i;
52 51
@@ -54,7 +53,7 @@ static void i915_save_palette(struct drm_device *dev, enum pipe pipe)
54 return; 53 return;
55 54
56 if (HAS_PCH_SPLIT(dev)) 55 if (HAS_PCH_SPLIT(dev))
57 reg = (pipe == PIPE_A) ? LGC_PALETTE_A : LGC_PALETTE_B; 56 reg = (pipe == PIPE_A) ? _LGC_PALETTE_A : _LGC_PALETTE_B;
58 57
59 if (pipe == PIPE_A) 58 if (pipe == PIPE_A)
60 array = dev_priv->save_palette_a; 59 array = dev_priv->save_palette_a;
@@ -68,7 +67,7 @@ static void i915_save_palette(struct drm_device *dev, enum pipe pipe)
68static void i915_restore_palette(struct drm_device *dev, enum pipe pipe) 67static void i915_restore_palette(struct drm_device *dev, enum pipe pipe)
69{ 68{
70 struct drm_i915_private *dev_priv = dev->dev_private; 69 struct drm_i915_private *dev_priv = dev->dev_private;
71 unsigned long reg = (pipe == PIPE_A ? PALETTE_A : PALETTE_B); 70 unsigned long reg = (pipe == PIPE_A ? _PALETTE_A : _PALETTE_B);
72 u32 *array; 71 u32 *array;
73 int i; 72 int i;
74 73
@@ -76,7 +75,7 @@ static void i915_restore_palette(struct drm_device *dev, enum pipe pipe)
76 return; 75 return;
77 76
78 if (HAS_PCH_SPLIT(dev)) 77 if (HAS_PCH_SPLIT(dev))
79 reg = (pipe == PIPE_A) ? LGC_PALETTE_A : LGC_PALETTE_B; 78 reg = (pipe == PIPE_A) ? _LGC_PALETTE_A : _LGC_PALETTE_B;
80 79
81 if (pipe == PIPE_A) 80 if (pipe == PIPE_A)
82 array = dev_priv->save_palette_a; 81 array = dev_priv->save_palette_a;
@@ -235,128 +234,161 @@ static void i915_restore_vga(struct drm_device *dev)
235static void i915_save_modeset_reg(struct drm_device *dev) 234static void i915_save_modeset_reg(struct drm_device *dev)
236{ 235{
237 struct drm_i915_private *dev_priv = dev->dev_private; 236 struct drm_i915_private *dev_priv = dev->dev_private;
237 int i;
238 238
239 if (drm_core_check_feature(dev, DRIVER_MODESET)) 239 if (drm_core_check_feature(dev, DRIVER_MODESET))
240 return; 240 return;
241 241
242 /* Cursor state */
243 dev_priv->saveCURACNTR = I915_READ(_CURACNTR);
244 dev_priv->saveCURAPOS = I915_READ(_CURAPOS);
245 dev_priv->saveCURABASE = I915_READ(_CURABASE);
246 dev_priv->saveCURBCNTR = I915_READ(_CURBCNTR);
247 dev_priv->saveCURBPOS = I915_READ(_CURBPOS);
248 dev_priv->saveCURBBASE = I915_READ(_CURBBASE);
249 if (IS_GEN2(dev))
250 dev_priv->saveCURSIZE = I915_READ(CURSIZE);
251
242 if (HAS_PCH_SPLIT(dev)) { 252 if (HAS_PCH_SPLIT(dev)) {
243 dev_priv->savePCH_DREF_CONTROL = I915_READ(PCH_DREF_CONTROL); 253 dev_priv->savePCH_DREF_CONTROL = I915_READ(PCH_DREF_CONTROL);
244 dev_priv->saveDISP_ARB_CTL = I915_READ(DISP_ARB_CTL); 254 dev_priv->saveDISP_ARB_CTL = I915_READ(DISP_ARB_CTL);
245 } 255 }
246 256
247 /* Pipe & plane A info */ 257 /* Pipe & plane A info */
248 dev_priv->savePIPEACONF = I915_READ(PIPEACONF); 258 dev_priv->savePIPEACONF = I915_READ(_PIPEACONF);
249 dev_priv->savePIPEASRC = I915_READ(PIPEASRC); 259 dev_priv->savePIPEASRC = I915_READ(_PIPEASRC);
250 if (HAS_PCH_SPLIT(dev)) { 260 if (HAS_PCH_SPLIT(dev)) {
251 dev_priv->saveFPA0 = I915_READ(PCH_FPA0); 261 dev_priv->saveFPA0 = I915_READ(_PCH_FPA0);
252 dev_priv->saveFPA1 = I915_READ(PCH_FPA1); 262 dev_priv->saveFPA1 = I915_READ(_PCH_FPA1);
253 dev_priv->saveDPLL_A = I915_READ(PCH_DPLL_A); 263 dev_priv->saveDPLL_A = I915_READ(_PCH_DPLL_A);
254 } else { 264 } else {
255 dev_priv->saveFPA0 = I915_READ(FPA0); 265 dev_priv->saveFPA0 = I915_READ(_FPA0);
256 dev_priv->saveFPA1 = I915_READ(FPA1); 266 dev_priv->saveFPA1 = I915_READ(_FPA1);
257 dev_priv->saveDPLL_A = I915_READ(DPLL_A); 267 dev_priv->saveDPLL_A = I915_READ(_DPLL_A);
258 } 268 }
259 if (IS_I965G(dev) && !HAS_PCH_SPLIT(dev)) 269 if (INTEL_INFO(dev)->gen >= 4 && !HAS_PCH_SPLIT(dev))
260 dev_priv->saveDPLL_A_MD = I915_READ(DPLL_A_MD); 270 dev_priv->saveDPLL_A_MD = I915_READ(_DPLL_A_MD);
261 dev_priv->saveHTOTAL_A = I915_READ(HTOTAL_A); 271 dev_priv->saveHTOTAL_A = I915_READ(_HTOTAL_A);
262 dev_priv->saveHBLANK_A = I915_READ(HBLANK_A); 272 dev_priv->saveHBLANK_A = I915_READ(_HBLANK_A);
263 dev_priv->saveHSYNC_A = I915_READ(HSYNC_A); 273 dev_priv->saveHSYNC_A = I915_READ(_HSYNC_A);
264 dev_priv->saveVTOTAL_A = I915_READ(VTOTAL_A); 274 dev_priv->saveVTOTAL_A = I915_READ(_VTOTAL_A);
265 dev_priv->saveVBLANK_A = I915_READ(VBLANK_A); 275 dev_priv->saveVBLANK_A = I915_READ(_VBLANK_A);
266 dev_priv->saveVSYNC_A = I915_READ(VSYNC_A); 276 dev_priv->saveVSYNC_A = I915_READ(_VSYNC_A);
267 if (!HAS_PCH_SPLIT(dev)) 277 if (!HAS_PCH_SPLIT(dev))
268 dev_priv->saveBCLRPAT_A = I915_READ(BCLRPAT_A); 278 dev_priv->saveBCLRPAT_A = I915_READ(_BCLRPAT_A);
269 279
270 if (HAS_PCH_SPLIT(dev)) { 280 if (HAS_PCH_SPLIT(dev)) {
271 dev_priv->savePIPEA_DATA_M1 = I915_READ(PIPEA_DATA_M1); 281 dev_priv->savePIPEA_DATA_M1 = I915_READ(_PIPEA_DATA_M1);
272 dev_priv->savePIPEA_DATA_N1 = I915_READ(PIPEA_DATA_N1); 282 dev_priv->savePIPEA_DATA_N1 = I915_READ(_PIPEA_DATA_N1);
273 dev_priv->savePIPEA_LINK_M1 = I915_READ(PIPEA_LINK_M1); 283 dev_priv->savePIPEA_LINK_M1 = I915_READ(_PIPEA_LINK_M1);
274 dev_priv->savePIPEA_LINK_N1 = I915_READ(PIPEA_LINK_N1); 284 dev_priv->savePIPEA_LINK_N1 = I915_READ(_PIPEA_LINK_N1);
275 285
276 dev_priv->saveFDI_TXA_CTL = I915_READ(FDI_TXA_CTL); 286 dev_priv->saveFDI_TXA_CTL = I915_READ(_FDI_TXA_CTL);
277 dev_priv->saveFDI_RXA_CTL = I915_READ(FDI_RXA_CTL); 287 dev_priv->saveFDI_RXA_CTL = I915_READ(_FDI_RXA_CTL);
278 288
279 dev_priv->savePFA_CTL_1 = I915_READ(PFA_CTL_1); 289 dev_priv->savePFA_CTL_1 = I915_READ(_PFA_CTL_1);
280 dev_priv->savePFA_WIN_SZ = I915_READ(PFA_WIN_SZ); 290 dev_priv->savePFA_WIN_SZ = I915_READ(_PFA_WIN_SZ);
281 dev_priv->savePFA_WIN_POS = I915_READ(PFA_WIN_POS); 291 dev_priv->savePFA_WIN_POS = I915_READ(_PFA_WIN_POS);
282 292
283 dev_priv->saveTRANSACONF = I915_READ(TRANSACONF); 293 dev_priv->saveTRANSACONF = I915_READ(_TRANSACONF);
284 dev_priv->saveTRANS_HTOTAL_A = I915_READ(TRANS_HTOTAL_A); 294 dev_priv->saveTRANS_HTOTAL_A = I915_READ(_TRANS_HTOTAL_A);
285 dev_priv->saveTRANS_HBLANK_A = I915_READ(TRANS_HBLANK_A); 295 dev_priv->saveTRANS_HBLANK_A = I915_READ(_TRANS_HBLANK_A);
286 dev_priv->saveTRANS_HSYNC_A = I915_READ(TRANS_HSYNC_A); 296 dev_priv->saveTRANS_HSYNC_A = I915_READ(_TRANS_HSYNC_A);
287 dev_priv->saveTRANS_VTOTAL_A = I915_READ(TRANS_VTOTAL_A); 297 dev_priv->saveTRANS_VTOTAL_A = I915_READ(_TRANS_VTOTAL_A);
288 dev_priv->saveTRANS_VBLANK_A = I915_READ(TRANS_VBLANK_A); 298 dev_priv->saveTRANS_VBLANK_A = I915_READ(_TRANS_VBLANK_A);
289 dev_priv->saveTRANS_VSYNC_A = I915_READ(TRANS_VSYNC_A); 299 dev_priv->saveTRANS_VSYNC_A = I915_READ(_TRANS_VSYNC_A);
290 } 300 }
291 301
292 dev_priv->saveDSPACNTR = I915_READ(DSPACNTR); 302 dev_priv->saveDSPACNTR = I915_READ(_DSPACNTR);
293 dev_priv->saveDSPASTRIDE = I915_READ(DSPASTRIDE); 303 dev_priv->saveDSPASTRIDE = I915_READ(_DSPASTRIDE);
294 dev_priv->saveDSPASIZE = I915_READ(DSPASIZE); 304 dev_priv->saveDSPASIZE = I915_READ(_DSPASIZE);
295 dev_priv->saveDSPAPOS = I915_READ(DSPAPOS); 305 dev_priv->saveDSPAPOS = I915_READ(_DSPAPOS);
296 dev_priv->saveDSPAADDR = I915_READ(DSPAADDR); 306 dev_priv->saveDSPAADDR = I915_READ(_DSPAADDR);
297 if (IS_I965G(dev)) { 307 if (INTEL_INFO(dev)->gen >= 4) {
298 dev_priv->saveDSPASURF = I915_READ(DSPASURF); 308 dev_priv->saveDSPASURF = I915_READ(_DSPASURF);
299 dev_priv->saveDSPATILEOFF = I915_READ(DSPATILEOFF); 309 dev_priv->saveDSPATILEOFF = I915_READ(_DSPATILEOFF);
300 } 310 }
301 i915_save_palette(dev, PIPE_A); 311 i915_save_palette(dev, PIPE_A);
302 dev_priv->savePIPEASTAT = I915_READ(PIPEASTAT); 312 dev_priv->savePIPEASTAT = I915_READ(_PIPEASTAT);
303 313
304 /* Pipe & plane B info */ 314 /* Pipe & plane B info */
305 dev_priv->savePIPEBCONF = I915_READ(PIPEBCONF); 315 dev_priv->savePIPEBCONF = I915_READ(_PIPEBCONF);
306 dev_priv->savePIPEBSRC = I915_READ(PIPEBSRC); 316 dev_priv->savePIPEBSRC = I915_READ(_PIPEBSRC);
307 if (HAS_PCH_SPLIT(dev)) { 317 if (HAS_PCH_SPLIT(dev)) {
308 dev_priv->saveFPB0 = I915_READ(PCH_FPB0); 318 dev_priv->saveFPB0 = I915_READ(_PCH_FPB0);
309 dev_priv->saveFPB1 = I915_READ(PCH_FPB1); 319 dev_priv->saveFPB1 = I915_READ(_PCH_FPB1);
310 dev_priv->saveDPLL_B = I915_READ(PCH_DPLL_B); 320 dev_priv->saveDPLL_B = I915_READ(_PCH_DPLL_B);
311 } else { 321 } else {
312 dev_priv->saveFPB0 = I915_READ(FPB0); 322 dev_priv->saveFPB0 = I915_READ(_FPB0);
313 dev_priv->saveFPB1 = I915_READ(FPB1); 323 dev_priv->saveFPB1 = I915_READ(_FPB1);
314 dev_priv->saveDPLL_B = I915_READ(DPLL_B); 324 dev_priv->saveDPLL_B = I915_READ(_DPLL_B);
315 } 325 }
316 if (IS_I965G(dev) && !HAS_PCH_SPLIT(dev)) 326 if (INTEL_INFO(dev)->gen >= 4 && !HAS_PCH_SPLIT(dev))
317 dev_priv->saveDPLL_B_MD = I915_READ(DPLL_B_MD); 327 dev_priv->saveDPLL_B_MD = I915_READ(_DPLL_B_MD);
318 dev_priv->saveHTOTAL_B = I915_READ(HTOTAL_B); 328 dev_priv->saveHTOTAL_B = I915_READ(_HTOTAL_B);
319 dev_priv->saveHBLANK_B = I915_READ(HBLANK_B); 329 dev_priv->saveHBLANK_B = I915_READ(_HBLANK_B);
320 dev_priv->saveHSYNC_B = I915_READ(HSYNC_B); 330 dev_priv->saveHSYNC_B = I915_READ(_HSYNC_B);
321 dev_priv->saveVTOTAL_B = I915_READ(VTOTAL_B); 331 dev_priv->saveVTOTAL_B = I915_READ(_VTOTAL_B);
322 dev_priv->saveVBLANK_B = I915_READ(VBLANK_B); 332 dev_priv->saveVBLANK_B = I915_READ(_VBLANK_B);
323 dev_priv->saveVSYNC_B = I915_READ(VSYNC_B); 333 dev_priv->saveVSYNC_B = I915_READ(_VSYNC_B);
324 if (!HAS_PCH_SPLIT(dev)) 334 if (!HAS_PCH_SPLIT(dev))
325 dev_priv->saveBCLRPAT_B = I915_READ(BCLRPAT_B); 335 dev_priv->saveBCLRPAT_B = I915_READ(_BCLRPAT_B);
326 336
327 if (HAS_PCH_SPLIT(dev)) { 337 if (HAS_PCH_SPLIT(dev)) {
328 dev_priv->savePIPEB_DATA_M1 = I915_READ(PIPEB_DATA_M1); 338 dev_priv->savePIPEB_DATA_M1 = I915_READ(_PIPEB_DATA_M1);
329 dev_priv->savePIPEB_DATA_N1 = I915_READ(PIPEB_DATA_N1); 339 dev_priv->savePIPEB_DATA_N1 = I915_READ(_PIPEB_DATA_N1);
330 dev_priv->savePIPEB_LINK_M1 = I915_READ(PIPEB_LINK_M1); 340 dev_priv->savePIPEB_LINK_M1 = I915_READ(_PIPEB_LINK_M1);
331 dev_priv->savePIPEB_LINK_N1 = I915_READ(PIPEB_LINK_N1); 341 dev_priv->savePIPEB_LINK_N1 = I915_READ(_PIPEB_LINK_N1);
332 342
333 dev_priv->saveFDI_TXB_CTL = I915_READ(FDI_TXB_CTL); 343 dev_priv->saveFDI_TXB_CTL = I915_READ(_FDI_TXB_CTL);
334 dev_priv->saveFDI_RXB_CTL = I915_READ(FDI_RXB_CTL); 344 dev_priv->saveFDI_RXB_CTL = I915_READ(_FDI_RXB_CTL);
335 345
336 dev_priv->savePFB_CTL_1 = I915_READ(PFB_CTL_1); 346 dev_priv->savePFB_CTL_1 = I915_READ(_PFB_CTL_1);
337 dev_priv->savePFB_WIN_SZ = I915_READ(PFB_WIN_SZ); 347 dev_priv->savePFB_WIN_SZ = I915_READ(_PFB_WIN_SZ);
338 dev_priv->savePFB_WIN_POS = I915_READ(PFB_WIN_POS); 348 dev_priv->savePFB_WIN_POS = I915_READ(_PFB_WIN_POS);
339 349
340 dev_priv->saveTRANSBCONF = I915_READ(TRANSBCONF); 350 dev_priv->saveTRANSBCONF = I915_READ(_TRANSBCONF);
341 dev_priv->saveTRANS_HTOTAL_B = I915_READ(TRANS_HTOTAL_B); 351 dev_priv->saveTRANS_HTOTAL_B = I915_READ(_TRANS_HTOTAL_B);
342 dev_priv->saveTRANS_HBLANK_B = I915_READ(TRANS_HBLANK_B); 352 dev_priv->saveTRANS_HBLANK_B = I915_READ(_TRANS_HBLANK_B);
343 dev_priv->saveTRANS_HSYNC_B = I915_READ(TRANS_HSYNC_B); 353 dev_priv->saveTRANS_HSYNC_B = I915_READ(_TRANS_HSYNC_B);
344 dev_priv->saveTRANS_VTOTAL_B = I915_READ(TRANS_VTOTAL_B); 354 dev_priv->saveTRANS_VTOTAL_B = I915_READ(_TRANS_VTOTAL_B);
345 dev_priv->saveTRANS_VBLANK_B = I915_READ(TRANS_VBLANK_B); 355 dev_priv->saveTRANS_VBLANK_B = I915_READ(_TRANS_VBLANK_B);
346 dev_priv->saveTRANS_VSYNC_B = I915_READ(TRANS_VSYNC_B); 356 dev_priv->saveTRANS_VSYNC_B = I915_READ(_TRANS_VSYNC_B);
347 } 357 }
348 358
349 dev_priv->saveDSPBCNTR = I915_READ(DSPBCNTR); 359 dev_priv->saveDSPBCNTR = I915_READ(_DSPBCNTR);
350 dev_priv->saveDSPBSTRIDE = I915_READ(DSPBSTRIDE); 360 dev_priv->saveDSPBSTRIDE = I915_READ(_DSPBSTRIDE);
351 dev_priv->saveDSPBSIZE = I915_READ(DSPBSIZE); 361 dev_priv->saveDSPBSIZE = I915_READ(_DSPBSIZE);
352 dev_priv->saveDSPBPOS = I915_READ(DSPBPOS); 362 dev_priv->saveDSPBPOS = I915_READ(_DSPBPOS);
353 dev_priv->saveDSPBADDR = I915_READ(DSPBADDR); 363 dev_priv->saveDSPBADDR = I915_READ(_DSPBADDR);
354 if (IS_I965GM(dev) || IS_GM45(dev)) { 364 if (INTEL_INFO(dev)->gen >= 4) {
355 dev_priv->saveDSPBSURF = I915_READ(DSPBSURF); 365 dev_priv->saveDSPBSURF = I915_READ(_DSPBSURF);
356 dev_priv->saveDSPBTILEOFF = I915_READ(DSPBTILEOFF); 366 dev_priv->saveDSPBTILEOFF = I915_READ(_DSPBTILEOFF);
357 } 367 }
358 i915_save_palette(dev, PIPE_B); 368 i915_save_palette(dev, PIPE_B);
359 dev_priv->savePIPEBSTAT = I915_READ(PIPEBSTAT); 369 dev_priv->savePIPEBSTAT = I915_READ(_PIPEBSTAT);
370
371 /* Fences */
372 switch (INTEL_INFO(dev)->gen) {
373 case 6:
374 for (i = 0; i < 16; i++)
375 dev_priv->saveFENCE[i] = I915_READ64(FENCE_REG_SANDYBRIDGE_0 + (i * 8));
376 break;
377 case 5:
378 case 4:
379 for (i = 0; i < 16; i++)
380 dev_priv->saveFENCE[i] = I915_READ64(FENCE_REG_965_0 + (i * 8));
381 break;
382 case 3:
383 if (IS_I945G(dev) || IS_I945GM(dev) || IS_G33(dev))
384 for (i = 0; i < 8; i++)
385 dev_priv->saveFENCE[i+8] = I915_READ(FENCE_REG_945_8 + (i * 4));
386 case 2:
387 for (i = 0; i < 8; i++)
388 dev_priv->saveFENCE[i] = I915_READ(FENCE_REG_830_0 + (i * 4));
389 break;
390 }
391
360 return; 392 return;
361} 393}
362 394
@@ -365,24 +397,47 @@ static void i915_restore_modeset_reg(struct drm_device *dev)
365 struct drm_i915_private *dev_priv = dev->dev_private; 397 struct drm_i915_private *dev_priv = dev->dev_private;
366 int dpll_a_reg, fpa0_reg, fpa1_reg; 398 int dpll_a_reg, fpa0_reg, fpa1_reg;
367 int dpll_b_reg, fpb0_reg, fpb1_reg; 399 int dpll_b_reg, fpb0_reg, fpb1_reg;
400 int i;
368 401
369 if (drm_core_check_feature(dev, DRIVER_MODESET)) 402 if (drm_core_check_feature(dev, DRIVER_MODESET))
370 return; 403 return;
371 404
405 /* Fences */
406 switch (INTEL_INFO(dev)->gen) {
407 case 6:
408 for (i = 0; i < 16; i++)
409 I915_WRITE64(FENCE_REG_SANDYBRIDGE_0 + (i * 8), dev_priv->saveFENCE[i]);
410 break;
411 case 5:
412 case 4:
413 for (i = 0; i < 16; i++)
414 I915_WRITE64(FENCE_REG_965_0 + (i * 8), dev_priv->saveFENCE[i]);
415 break;
416 case 3:
417 case 2:
418 if (IS_I945G(dev) || IS_I945GM(dev) || IS_G33(dev))
419 for (i = 0; i < 8; i++)
420 I915_WRITE(FENCE_REG_945_8 + (i * 4), dev_priv->saveFENCE[i+8]);
421 for (i = 0; i < 8; i++)
422 I915_WRITE(FENCE_REG_830_0 + (i * 4), dev_priv->saveFENCE[i]);
423 break;
424 }
425
426
372 if (HAS_PCH_SPLIT(dev)) { 427 if (HAS_PCH_SPLIT(dev)) {
373 dpll_a_reg = PCH_DPLL_A; 428 dpll_a_reg = _PCH_DPLL_A;
374 dpll_b_reg = PCH_DPLL_B; 429 dpll_b_reg = _PCH_DPLL_B;
375 fpa0_reg = PCH_FPA0; 430 fpa0_reg = _PCH_FPA0;
376 fpb0_reg = PCH_FPB0; 431 fpb0_reg = _PCH_FPB0;
377 fpa1_reg = PCH_FPA1; 432 fpa1_reg = _PCH_FPA1;
378 fpb1_reg = PCH_FPB1; 433 fpb1_reg = _PCH_FPB1;
379 } else { 434 } else {
380 dpll_a_reg = DPLL_A; 435 dpll_a_reg = _DPLL_A;
381 dpll_b_reg = DPLL_B; 436 dpll_b_reg = _DPLL_B;
382 fpa0_reg = FPA0; 437 fpa0_reg = _FPA0;
383 fpb0_reg = FPB0; 438 fpb0_reg = _FPB0;
384 fpa1_reg = FPA1; 439 fpa1_reg = _FPA1;
385 fpb1_reg = FPB1; 440 fpb1_reg = _FPB1;
386 } 441 }
387 442
388 if (HAS_PCH_SPLIT(dev)) { 443 if (HAS_PCH_SPLIT(dev)) {
@@ -404,61 +459,61 @@ static void i915_restore_modeset_reg(struct drm_device *dev)
404 I915_WRITE(dpll_a_reg, dev_priv->saveDPLL_A); 459 I915_WRITE(dpll_a_reg, dev_priv->saveDPLL_A);
405 POSTING_READ(dpll_a_reg); 460 POSTING_READ(dpll_a_reg);
406 udelay(150); 461 udelay(150);
407 if (IS_I965G(dev) && !HAS_PCH_SPLIT(dev)) { 462 if (INTEL_INFO(dev)->gen >= 4 && !HAS_PCH_SPLIT(dev)) {
408 I915_WRITE(DPLL_A_MD, dev_priv->saveDPLL_A_MD); 463 I915_WRITE(_DPLL_A_MD, dev_priv->saveDPLL_A_MD);
409 POSTING_READ(DPLL_A_MD); 464 POSTING_READ(_DPLL_A_MD);
410 } 465 }
411 udelay(150); 466 udelay(150);
412 467
413 /* Restore mode */ 468 /* Restore mode */
414 I915_WRITE(HTOTAL_A, dev_priv->saveHTOTAL_A); 469 I915_WRITE(_HTOTAL_A, dev_priv->saveHTOTAL_A);
415 I915_WRITE(HBLANK_A, dev_priv->saveHBLANK_A); 470 I915_WRITE(_HBLANK_A, dev_priv->saveHBLANK_A);
416 I915_WRITE(HSYNC_A, dev_priv->saveHSYNC_A); 471 I915_WRITE(_HSYNC_A, dev_priv->saveHSYNC_A);
417 I915_WRITE(VTOTAL_A, dev_priv->saveVTOTAL_A); 472 I915_WRITE(_VTOTAL_A, dev_priv->saveVTOTAL_A);
418 I915_WRITE(VBLANK_A, dev_priv->saveVBLANK_A); 473 I915_WRITE(_VBLANK_A, dev_priv->saveVBLANK_A);
419 I915_WRITE(VSYNC_A, dev_priv->saveVSYNC_A); 474 I915_WRITE(_VSYNC_A, dev_priv->saveVSYNC_A);
420 if (!HAS_PCH_SPLIT(dev)) 475 if (!HAS_PCH_SPLIT(dev))
421 I915_WRITE(BCLRPAT_A, dev_priv->saveBCLRPAT_A); 476 I915_WRITE(_BCLRPAT_A, dev_priv->saveBCLRPAT_A);
422 477
423 if (HAS_PCH_SPLIT(dev)) { 478 if (HAS_PCH_SPLIT(dev)) {
424 I915_WRITE(PIPEA_DATA_M1, dev_priv->savePIPEA_DATA_M1); 479 I915_WRITE(_PIPEA_DATA_M1, dev_priv->savePIPEA_DATA_M1);
425 I915_WRITE(PIPEA_DATA_N1, dev_priv->savePIPEA_DATA_N1); 480 I915_WRITE(_PIPEA_DATA_N1, dev_priv->savePIPEA_DATA_N1);
426 I915_WRITE(PIPEA_LINK_M1, dev_priv->savePIPEA_LINK_M1); 481 I915_WRITE(_PIPEA_LINK_M1, dev_priv->savePIPEA_LINK_M1);
427 I915_WRITE(PIPEA_LINK_N1, dev_priv->savePIPEA_LINK_N1); 482 I915_WRITE(_PIPEA_LINK_N1, dev_priv->savePIPEA_LINK_N1);
428 483
429 I915_WRITE(FDI_RXA_CTL, dev_priv->saveFDI_RXA_CTL); 484 I915_WRITE(_FDI_RXA_CTL, dev_priv->saveFDI_RXA_CTL);
430 I915_WRITE(FDI_TXA_CTL, dev_priv->saveFDI_TXA_CTL); 485 I915_WRITE(_FDI_TXA_CTL, dev_priv->saveFDI_TXA_CTL);
431 486
432 I915_WRITE(PFA_CTL_1, dev_priv->savePFA_CTL_1); 487 I915_WRITE(_PFA_CTL_1, dev_priv->savePFA_CTL_1);
433 I915_WRITE(PFA_WIN_SZ, dev_priv->savePFA_WIN_SZ); 488 I915_WRITE(_PFA_WIN_SZ, dev_priv->savePFA_WIN_SZ);
434 I915_WRITE(PFA_WIN_POS, dev_priv->savePFA_WIN_POS); 489 I915_WRITE(_PFA_WIN_POS, dev_priv->savePFA_WIN_POS);
435 490
436 I915_WRITE(TRANSACONF, dev_priv->saveTRANSACONF); 491 I915_WRITE(_TRANSACONF, dev_priv->saveTRANSACONF);
437 I915_WRITE(TRANS_HTOTAL_A, dev_priv->saveTRANS_HTOTAL_A); 492 I915_WRITE(_TRANS_HTOTAL_A, dev_priv->saveTRANS_HTOTAL_A);
438 I915_WRITE(TRANS_HBLANK_A, dev_priv->saveTRANS_HBLANK_A); 493 I915_WRITE(_TRANS_HBLANK_A, dev_priv->saveTRANS_HBLANK_A);
439 I915_WRITE(TRANS_HSYNC_A, dev_priv->saveTRANS_HSYNC_A); 494 I915_WRITE(_TRANS_HSYNC_A, dev_priv->saveTRANS_HSYNC_A);
440 I915_WRITE(TRANS_VTOTAL_A, dev_priv->saveTRANS_VTOTAL_A); 495 I915_WRITE(_TRANS_VTOTAL_A, dev_priv->saveTRANS_VTOTAL_A);
441 I915_WRITE(TRANS_VBLANK_A, dev_priv->saveTRANS_VBLANK_A); 496 I915_WRITE(_TRANS_VBLANK_A, dev_priv->saveTRANS_VBLANK_A);
442 I915_WRITE(TRANS_VSYNC_A, dev_priv->saveTRANS_VSYNC_A); 497 I915_WRITE(_TRANS_VSYNC_A, dev_priv->saveTRANS_VSYNC_A);
443 } 498 }
444 499
445 /* Restore plane info */ 500 /* Restore plane info */
446 I915_WRITE(DSPASIZE, dev_priv->saveDSPASIZE); 501 I915_WRITE(_DSPASIZE, dev_priv->saveDSPASIZE);
447 I915_WRITE(DSPAPOS, dev_priv->saveDSPAPOS); 502 I915_WRITE(_DSPAPOS, dev_priv->saveDSPAPOS);
448 I915_WRITE(PIPEASRC, dev_priv->savePIPEASRC); 503 I915_WRITE(_PIPEASRC, dev_priv->savePIPEASRC);
449 I915_WRITE(DSPAADDR, dev_priv->saveDSPAADDR); 504 I915_WRITE(_DSPAADDR, dev_priv->saveDSPAADDR);
450 I915_WRITE(DSPASTRIDE, dev_priv->saveDSPASTRIDE); 505 I915_WRITE(_DSPASTRIDE, dev_priv->saveDSPASTRIDE);
451 if (IS_I965G(dev)) { 506 if (INTEL_INFO(dev)->gen >= 4) {
452 I915_WRITE(DSPASURF, dev_priv->saveDSPASURF); 507 I915_WRITE(_DSPASURF, dev_priv->saveDSPASURF);
453 I915_WRITE(DSPATILEOFF, dev_priv->saveDSPATILEOFF); 508 I915_WRITE(_DSPATILEOFF, dev_priv->saveDSPATILEOFF);
454 } 509 }
455 510
456 I915_WRITE(PIPEACONF, dev_priv->savePIPEACONF); 511 I915_WRITE(_PIPEACONF, dev_priv->savePIPEACONF);
457 512
458 i915_restore_palette(dev, PIPE_A); 513 i915_restore_palette(dev, PIPE_A);
459 /* Enable the plane */ 514 /* Enable the plane */
460 I915_WRITE(DSPACNTR, dev_priv->saveDSPACNTR); 515 I915_WRITE(_DSPACNTR, dev_priv->saveDSPACNTR);
461 I915_WRITE(DSPAADDR, I915_READ(DSPAADDR)); 516 I915_WRITE(_DSPAADDR, I915_READ(_DSPAADDR));
462 517
463 /* Pipe & plane B info */ 518 /* Pipe & plane B info */
464 if (dev_priv->saveDPLL_B & DPLL_VCO_ENABLE) { 519 if (dev_priv->saveDPLL_B & DPLL_VCO_ENABLE) {
@@ -473,66 +528,76 @@ static void i915_restore_modeset_reg(struct drm_device *dev)
473 I915_WRITE(dpll_b_reg, dev_priv->saveDPLL_B); 528 I915_WRITE(dpll_b_reg, dev_priv->saveDPLL_B);
474 POSTING_READ(dpll_b_reg); 529 POSTING_READ(dpll_b_reg);
475 udelay(150); 530 udelay(150);
476 if (IS_I965G(dev) && !HAS_PCH_SPLIT(dev)) { 531 if (INTEL_INFO(dev)->gen >= 4 && !HAS_PCH_SPLIT(dev)) {
477 I915_WRITE(DPLL_B_MD, dev_priv->saveDPLL_B_MD); 532 I915_WRITE(_DPLL_B_MD, dev_priv->saveDPLL_B_MD);
478 POSTING_READ(DPLL_B_MD); 533 POSTING_READ(_DPLL_B_MD);
479 } 534 }
480 udelay(150); 535 udelay(150);
481 536
482 /* Restore mode */ 537 /* Restore mode */
483 I915_WRITE(HTOTAL_B, dev_priv->saveHTOTAL_B); 538 I915_WRITE(_HTOTAL_B, dev_priv->saveHTOTAL_B);
484 I915_WRITE(HBLANK_B, dev_priv->saveHBLANK_B); 539 I915_WRITE(_HBLANK_B, dev_priv->saveHBLANK_B);
485 I915_WRITE(HSYNC_B, dev_priv->saveHSYNC_B); 540 I915_WRITE(_HSYNC_B, dev_priv->saveHSYNC_B);
486 I915_WRITE(VTOTAL_B, dev_priv->saveVTOTAL_B); 541 I915_WRITE(_VTOTAL_B, dev_priv->saveVTOTAL_B);
487 I915_WRITE(VBLANK_B, dev_priv->saveVBLANK_B); 542 I915_WRITE(_VBLANK_B, dev_priv->saveVBLANK_B);
488 I915_WRITE(VSYNC_B, dev_priv->saveVSYNC_B); 543 I915_WRITE(_VSYNC_B, dev_priv->saveVSYNC_B);
489 if (!HAS_PCH_SPLIT(dev)) 544 if (!HAS_PCH_SPLIT(dev))
490 I915_WRITE(BCLRPAT_B, dev_priv->saveBCLRPAT_B); 545 I915_WRITE(_BCLRPAT_B, dev_priv->saveBCLRPAT_B);
491 546
492 if (HAS_PCH_SPLIT(dev)) { 547 if (HAS_PCH_SPLIT(dev)) {
493 I915_WRITE(PIPEB_DATA_M1, dev_priv->savePIPEB_DATA_M1); 548 I915_WRITE(_PIPEB_DATA_M1, dev_priv->savePIPEB_DATA_M1);
494 I915_WRITE(PIPEB_DATA_N1, dev_priv->savePIPEB_DATA_N1); 549 I915_WRITE(_PIPEB_DATA_N1, dev_priv->savePIPEB_DATA_N1);
495 I915_WRITE(PIPEB_LINK_M1, dev_priv->savePIPEB_LINK_M1); 550 I915_WRITE(_PIPEB_LINK_M1, dev_priv->savePIPEB_LINK_M1);
496 I915_WRITE(PIPEB_LINK_N1, dev_priv->savePIPEB_LINK_N1); 551 I915_WRITE(_PIPEB_LINK_N1, dev_priv->savePIPEB_LINK_N1);
497 552
498 I915_WRITE(FDI_RXB_CTL, dev_priv->saveFDI_RXB_CTL); 553 I915_WRITE(_FDI_RXB_CTL, dev_priv->saveFDI_RXB_CTL);
499 I915_WRITE(FDI_TXB_CTL, dev_priv->saveFDI_TXB_CTL); 554 I915_WRITE(_FDI_TXB_CTL, dev_priv->saveFDI_TXB_CTL);
500 555
501 I915_WRITE(PFB_CTL_1, dev_priv->savePFB_CTL_1); 556 I915_WRITE(_PFB_CTL_1, dev_priv->savePFB_CTL_1);
502 I915_WRITE(PFB_WIN_SZ, dev_priv->savePFB_WIN_SZ); 557 I915_WRITE(_PFB_WIN_SZ, dev_priv->savePFB_WIN_SZ);
503 I915_WRITE(PFB_WIN_POS, dev_priv->savePFB_WIN_POS); 558 I915_WRITE(_PFB_WIN_POS, dev_priv->savePFB_WIN_POS);
504 559
505 I915_WRITE(TRANSBCONF, dev_priv->saveTRANSBCONF); 560 I915_WRITE(_TRANSBCONF, dev_priv->saveTRANSBCONF);
506 I915_WRITE(TRANS_HTOTAL_B, dev_priv->saveTRANS_HTOTAL_B); 561 I915_WRITE(_TRANS_HTOTAL_B, dev_priv->saveTRANS_HTOTAL_B);
507 I915_WRITE(TRANS_HBLANK_B, dev_priv->saveTRANS_HBLANK_B); 562 I915_WRITE(_TRANS_HBLANK_B, dev_priv->saveTRANS_HBLANK_B);
508 I915_WRITE(TRANS_HSYNC_B, dev_priv->saveTRANS_HSYNC_B); 563 I915_WRITE(_TRANS_HSYNC_B, dev_priv->saveTRANS_HSYNC_B);
509 I915_WRITE(TRANS_VTOTAL_B, dev_priv->saveTRANS_VTOTAL_B); 564 I915_WRITE(_TRANS_VTOTAL_B, dev_priv->saveTRANS_VTOTAL_B);
510 I915_WRITE(TRANS_VBLANK_B, dev_priv->saveTRANS_VBLANK_B); 565 I915_WRITE(_TRANS_VBLANK_B, dev_priv->saveTRANS_VBLANK_B);
511 I915_WRITE(TRANS_VSYNC_B, dev_priv->saveTRANS_VSYNC_B); 566 I915_WRITE(_TRANS_VSYNC_B, dev_priv->saveTRANS_VSYNC_B);
512 } 567 }
513 568
514 /* Restore plane info */ 569 /* Restore plane info */
515 I915_WRITE(DSPBSIZE, dev_priv->saveDSPBSIZE); 570 I915_WRITE(_DSPBSIZE, dev_priv->saveDSPBSIZE);
516 I915_WRITE(DSPBPOS, dev_priv->saveDSPBPOS); 571 I915_WRITE(_DSPBPOS, dev_priv->saveDSPBPOS);
517 I915_WRITE(PIPEBSRC, dev_priv->savePIPEBSRC); 572 I915_WRITE(_PIPEBSRC, dev_priv->savePIPEBSRC);
518 I915_WRITE(DSPBADDR, dev_priv->saveDSPBADDR); 573 I915_WRITE(_DSPBADDR, dev_priv->saveDSPBADDR);
519 I915_WRITE(DSPBSTRIDE, dev_priv->saveDSPBSTRIDE); 574 I915_WRITE(_DSPBSTRIDE, dev_priv->saveDSPBSTRIDE);
520 if (IS_I965G(dev)) { 575 if (INTEL_INFO(dev)->gen >= 4) {
521 I915_WRITE(DSPBSURF, dev_priv->saveDSPBSURF); 576 I915_WRITE(_DSPBSURF, dev_priv->saveDSPBSURF);
522 I915_WRITE(DSPBTILEOFF, dev_priv->saveDSPBTILEOFF); 577 I915_WRITE(_DSPBTILEOFF, dev_priv->saveDSPBTILEOFF);
523 } 578 }
524 579
525 I915_WRITE(PIPEBCONF, dev_priv->savePIPEBCONF); 580 I915_WRITE(_PIPEBCONF, dev_priv->savePIPEBCONF);
526 581
527 i915_restore_palette(dev, PIPE_B); 582 i915_restore_palette(dev, PIPE_B);
528 /* Enable the plane */ 583 /* Enable the plane */
529 I915_WRITE(DSPBCNTR, dev_priv->saveDSPBCNTR); 584 I915_WRITE(_DSPBCNTR, dev_priv->saveDSPBCNTR);
530 I915_WRITE(DSPBADDR, I915_READ(DSPBADDR)); 585 I915_WRITE(_DSPBADDR, I915_READ(_DSPBADDR));
586
587 /* Cursor state */
588 I915_WRITE(_CURAPOS, dev_priv->saveCURAPOS);
589 I915_WRITE(_CURACNTR, dev_priv->saveCURACNTR);
590 I915_WRITE(_CURABASE, dev_priv->saveCURABASE);
591 I915_WRITE(_CURBPOS, dev_priv->saveCURBPOS);
592 I915_WRITE(_CURBCNTR, dev_priv->saveCURBCNTR);
593 I915_WRITE(_CURBBASE, dev_priv->saveCURBBASE);
594 if (IS_GEN2(dev))
595 I915_WRITE(CURSIZE, dev_priv->saveCURSIZE);
531 596
532 return; 597 return;
533} 598}
534 599
535void i915_save_display(struct drm_device *dev) 600static void i915_save_display(struct drm_device *dev)
536{ 601{
537 struct drm_i915_private *dev_priv = dev->dev_private; 602 struct drm_i915_private *dev_priv = dev->dev_private;
538 603
@@ -543,16 +608,6 @@ void i915_save_display(struct drm_device *dev)
543 /* Don't save them in KMS mode */ 608 /* Don't save them in KMS mode */
544 i915_save_modeset_reg(dev); 609 i915_save_modeset_reg(dev);
545 610
546 /* Cursor state */
547 dev_priv->saveCURACNTR = I915_READ(CURACNTR);
548 dev_priv->saveCURAPOS = I915_READ(CURAPOS);
549 dev_priv->saveCURABASE = I915_READ(CURABASE);
550 dev_priv->saveCURBCNTR = I915_READ(CURBCNTR);
551 dev_priv->saveCURBPOS = I915_READ(CURBPOS);
552 dev_priv->saveCURBBASE = I915_READ(CURBBASE);
553 if (!IS_I9XX(dev))
554 dev_priv->saveCURSIZE = I915_READ(CURSIZE);
555
556 /* CRT state */ 611 /* CRT state */
557 if (HAS_PCH_SPLIT(dev)) { 612 if (HAS_PCH_SPLIT(dev)) {
558 dev_priv->saveADPA = I915_READ(PCH_ADPA); 613 dev_priv->saveADPA = I915_READ(PCH_ADPA);
@@ -573,7 +628,7 @@ void i915_save_display(struct drm_device *dev)
573 dev_priv->savePFIT_PGM_RATIOS = I915_READ(PFIT_PGM_RATIOS); 628 dev_priv->savePFIT_PGM_RATIOS = I915_READ(PFIT_PGM_RATIOS);
574 dev_priv->saveBLC_PWM_CTL = I915_READ(BLC_PWM_CTL); 629 dev_priv->saveBLC_PWM_CTL = I915_READ(BLC_PWM_CTL);
575 dev_priv->saveBLC_HIST_CTL = I915_READ(BLC_HIST_CTL); 630 dev_priv->saveBLC_HIST_CTL = I915_READ(BLC_HIST_CTL);
576 if (IS_I965G(dev)) 631 if (INTEL_INFO(dev)->gen >= 4)
577 dev_priv->saveBLC_PWM_CTL2 = I915_READ(BLC_PWM_CTL2); 632 dev_priv->saveBLC_PWM_CTL2 = I915_READ(BLC_PWM_CTL2);
578 if (IS_MOBILE(dev) && !IS_I830(dev)) 633 if (IS_MOBILE(dev) && !IS_I830(dev))
579 dev_priv->saveLVDS = I915_READ(LVDS); 634 dev_priv->saveLVDS = I915_READ(LVDS);
@@ -597,14 +652,14 @@ void i915_save_display(struct drm_device *dev)
597 dev_priv->saveDP_B = I915_READ(DP_B); 652 dev_priv->saveDP_B = I915_READ(DP_B);
598 dev_priv->saveDP_C = I915_READ(DP_C); 653 dev_priv->saveDP_C = I915_READ(DP_C);
599 dev_priv->saveDP_D = I915_READ(DP_D); 654 dev_priv->saveDP_D = I915_READ(DP_D);
600 dev_priv->savePIPEA_GMCH_DATA_M = I915_READ(PIPEA_GMCH_DATA_M); 655 dev_priv->savePIPEA_GMCH_DATA_M = I915_READ(_PIPEA_GMCH_DATA_M);
601 dev_priv->savePIPEB_GMCH_DATA_M = I915_READ(PIPEB_GMCH_DATA_M); 656 dev_priv->savePIPEB_GMCH_DATA_M = I915_READ(_PIPEB_GMCH_DATA_M);
602 dev_priv->savePIPEA_GMCH_DATA_N = I915_READ(PIPEA_GMCH_DATA_N); 657 dev_priv->savePIPEA_GMCH_DATA_N = I915_READ(_PIPEA_GMCH_DATA_N);
603 dev_priv->savePIPEB_GMCH_DATA_N = I915_READ(PIPEB_GMCH_DATA_N); 658 dev_priv->savePIPEB_GMCH_DATA_N = I915_READ(_PIPEB_GMCH_DATA_N);
604 dev_priv->savePIPEA_DP_LINK_M = I915_READ(PIPEA_DP_LINK_M); 659 dev_priv->savePIPEA_DP_LINK_M = I915_READ(_PIPEA_DP_LINK_M);
605 dev_priv->savePIPEB_DP_LINK_M = I915_READ(PIPEB_DP_LINK_M); 660 dev_priv->savePIPEB_DP_LINK_M = I915_READ(_PIPEB_DP_LINK_M);
606 dev_priv->savePIPEA_DP_LINK_N = I915_READ(PIPEA_DP_LINK_N); 661 dev_priv->savePIPEA_DP_LINK_N = I915_READ(_PIPEA_DP_LINK_N);
607 dev_priv->savePIPEB_DP_LINK_N = I915_READ(PIPEB_DP_LINK_N); 662 dev_priv->savePIPEB_DP_LINK_N = I915_READ(_PIPEB_DP_LINK_N);
608 } 663 }
609 /* FIXME: save TV & SDVO state */ 664 /* FIXME: save TV & SDVO state */
610 665
@@ -634,7 +689,7 @@ void i915_save_display(struct drm_device *dev)
634 i915_save_vga(dev); 689 i915_save_vga(dev);
635} 690}
636 691
637void i915_restore_display(struct drm_device *dev) 692static void i915_restore_display(struct drm_device *dev)
638{ 693{
639 struct drm_i915_private *dev_priv = dev->dev_private; 694 struct drm_i915_private *dev_priv = dev->dev_private;
640 695
@@ -643,30 +698,20 @@ void i915_restore_display(struct drm_device *dev)
643 698
644 /* Display port ratios (must be done before clock is set) */ 699 /* Display port ratios (must be done before clock is set) */
645 if (SUPPORTS_INTEGRATED_DP(dev)) { 700 if (SUPPORTS_INTEGRATED_DP(dev)) {
646 I915_WRITE(PIPEA_GMCH_DATA_M, dev_priv->savePIPEA_GMCH_DATA_M); 701 I915_WRITE(_PIPEA_GMCH_DATA_M, dev_priv->savePIPEA_GMCH_DATA_M);
647 I915_WRITE(PIPEB_GMCH_DATA_M, dev_priv->savePIPEB_GMCH_DATA_M); 702 I915_WRITE(_PIPEB_GMCH_DATA_M, dev_priv->savePIPEB_GMCH_DATA_M);
648 I915_WRITE(PIPEA_GMCH_DATA_N, dev_priv->savePIPEA_GMCH_DATA_N); 703 I915_WRITE(_PIPEA_GMCH_DATA_N, dev_priv->savePIPEA_GMCH_DATA_N);
649 I915_WRITE(PIPEB_GMCH_DATA_N, dev_priv->savePIPEB_GMCH_DATA_N); 704 I915_WRITE(_PIPEB_GMCH_DATA_N, dev_priv->savePIPEB_GMCH_DATA_N);
650 I915_WRITE(PIPEA_DP_LINK_M, dev_priv->savePIPEA_DP_LINK_M); 705 I915_WRITE(_PIPEA_DP_LINK_M, dev_priv->savePIPEA_DP_LINK_M);
651 I915_WRITE(PIPEB_DP_LINK_M, dev_priv->savePIPEB_DP_LINK_M); 706 I915_WRITE(_PIPEB_DP_LINK_M, dev_priv->savePIPEB_DP_LINK_M);
652 I915_WRITE(PIPEA_DP_LINK_N, dev_priv->savePIPEA_DP_LINK_N); 707 I915_WRITE(_PIPEA_DP_LINK_N, dev_priv->savePIPEA_DP_LINK_N);
653 I915_WRITE(PIPEB_DP_LINK_N, dev_priv->savePIPEB_DP_LINK_N); 708 I915_WRITE(_PIPEB_DP_LINK_N, dev_priv->savePIPEB_DP_LINK_N);
654 } 709 }
655 710
656 /* This is only meaningful in non-KMS mode */ 711 /* This is only meaningful in non-KMS mode */
657 /* Don't restore them in KMS mode */ 712 /* Don't restore them in KMS mode */
658 i915_restore_modeset_reg(dev); 713 i915_restore_modeset_reg(dev);
659 714
660 /* Cursor state */
661 I915_WRITE(CURAPOS, dev_priv->saveCURAPOS);
662 I915_WRITE(CURACNTR, dev_priv->saveCURACNTR);
663 I915_WRITE(CURABASE, dev_priv->saveCURABASE);
664 I915_WRITE(CURBPOS, dev_priv->saveCURBPOS);
665 I915_WRITE(CURBCNTR, dev_priv->saveCURBCNTR);
666 I915_WRITE(CURBBASE, dev_priv->saveCURBBASE);
667 if (!IS_I9XX(dev))
668 I915_WRITE(CURSIZE, dev_priv->saveCURSIZE);
669
670 /* CRT state */ 715 /* CRT state */
671 if (HAS_PCH_SPLIT(dev)) 716 if (HAS_PCH_SPLIT(dev))
672 I915_WRITE(PCH_ADPA, dev_priv->saveADPA); 717 I915_WRITE(PCH_ADPA, dev_priv->saveADPA);
@@ -674,7 +719,7 @@ void i915_restore_display(struct drm_device *dev)
674 I915_WRITE(ADPA, dev_priv->saveADPA); 719 I915_WRITE(ADPA, dev_priv->saveADPA);
675 720
676 /* LVDS state */ 721 /* LVDS state */
677 if (IS_I965G(dev) && !HAS_PCH_SPLIT(dev)) 722 if (INTEL_INFO(dev)->gen >= 4 && !HAS_PCH_SPLIT(dev))
678 I915_WRITE(BLC_PWM_CTL2, dev_priv->saveBLC_PWM_CTL2); 723 I915_WRITE(BLC_PWM_CTL2, dev_priv->saveBLC_PWM_CTL2);
679 724
680 if (HAS_PCH_SPLIT(dev)) { 725 if (HAS_PCH_SPLIT(dev)) {
@@ -694,7 +739,7 @@ void i915_restore_display(struct drm_device *dev)
694 I915_WRITE(PCH_PP_OFF_DELAYS, dev_priv->savePP_OFF_DELAYS); 739 I915_WRITE(PCH_PP_OFF_DELAYS, dev_priv->savePP_OFF_DELAYS);
695 I915_WRITE(PCH_PP_DIVISOR, dev_priv->savePP_DIVISOR); 740 I915_WRITE(PCH_PP_DIVISOR, dev_priv->savePP_DIVISOR);
696 I915_WRITE(PCH_PP_CONTROL, dev_priv->savePP_CONTROL); 741 I915_WRITE(PCH_PP_CONTROL, dev_priv->savePP_CONTROL);
697 I915_WRITE(MCHBAR_RENDER_STANDBY, 742 I915_WRITE(RSTDBYCTL,
698 dev_priv->saveMCHBAR_RENDER_STANDBY); 743 dev_priv->saveMCHBAR_RENDER_STANDBY);
699 } else { 744 } else {
700 I915_WRITE(PFIT_PGM_RATIOS, dev_priv->savePFIT_PGM_RATIOS); 745 I915_WRITE(PFIT_PGM_RATIOS, dev_priv->savePFIT_PGM_RATIOS);
@@ -735,6 +780,7 @@ void i915_restore_display(struct drm_device *dev)
735 I915_WRITE(CPU_VGACNTRL, dev_priv->saveVGACNTRL); 780 I915_WRITE(CPU_VGACNTRL, dev_priv->saveVGACNTRL);
736 else 781 else
737 I915_WRITE(VGACNTRL, dev_priv->saveVGACNTRL); 782 I915_WRITE(VGACNTRL, dev_priv->saveVGACNTRL);
783
738 I915_WRITE(VGA0, dev_priv->saveVGA0); 784 I915_WRITE(VGA0, dev_priv->saveVGA0);
739 I915_WRITE(VGA1, dev_priv->saveVGA1); 785 I915_WRITE(VGA1, dev_priv->saveVGA1);
740 I915_WRITE(VGA_PD, dev_priv->saveVGA_PD); 786 I915_WRITE(VGA_PD, dev_priv->saveVGA_PD);
@@ -751,6 +797,8 @@ int i915_save_state(struct drm_device *dev)
751 797
752 pci_read_config_byte(dev->pdev, LBB, &dev_priv->saveLBB); 798 pci_read_config_byte(dev->pdev, LBB, &dev_priv->saveLBB);
753 799
800 mutex_lock(&dev->struct_mutex);
801
754 /* Hardware status page */ 802 /* Hardware status page */
755 dev_priv->saveHWS = I915_READ(HWS_PGA); 803 dev_priv->saveHWS = I915_READ(HWS_PGA);
756 804
@@ -762,17 +810,19 @@ int i915_save_state(struct drm_device *dev)
762 dev_priv->saveDEIMR = I915_READ(DEIMR); 810 dev_priv->saveDEIMR = I915_READ(DEIMR);
763 dev_priv->saveGTIER = I915_READ(GTIER); 811 dev_priv->saveGTIER = I915_READ(GTIER);
764 dev_priv->saveGTIMR = I915_READ(GTIMR); 812 dev_priv->saveGTIMR = I915_READ(GTIMR);
765 dev_priv->saveFDI_RXA_IMR = I915_READ(FDI_RXA_IMR); 813 dev_priv->saveFDI_RXA_IMR = I915_READ(_FDI_RXA_IMR);
766 dev_priv->saveFDI_RXB_IMR = I915_READ(FDI_RXB_IMR); 814 dev_priv->saveFDI_RXB_IMR = I915_READ(_FDI_RXB_IMR);
767 dev_priv->saveMCHBAR_RENDER_STANDBY = 815 dev_priv->saveMCHBAR_RENDER_STANDBY =
768 I915_READ(MCHBAR_RENDER_STANDBY); 816 I915_READ(RSTDBYCTL);
769 } else { 817 } else {
770 dev_priv->saveIER = I915_READ(IER); 818 dev_priv->saveIER = I915_READ(IER);
771 dev_priv->saveIMR = I915_READ(IMR); 819 dev_priv->saveIMR = I915_READ(IMR);
772 } 820 }
773 821
774 if (HAS_PCH_SPLIT(dev)) 822 if (IS_IRONLAKE_M(dev))
775 ironlake_disable_drps(dev); 823 ironlake_disable_drps(dev);
824 if (IS_GEN6(dev))
825 gen6_disable_rps(dev);
776 826
777 /* Cache mode state */ 827 /* Cache mode state */
778 dev_priv->saveCACHE_MODE_0 = I915_READ(CACHE_MODE_0); 828 dev_priv->saveCACHE_MODE_0 = I915_READ(CACHE_MODE_0);
@@ -788,27 +838,7 @@ int i915_save_state(struct drm_device *dev)
788 for (i = 0; i < 3; i++) 838 for (i = 0; i < 3; i++)
789 dev_priv->saveSWF2[i] = I915_READ(SWF30 + (i << 2)); 839 dev_priv->saveSWF2[i] = I915_READ(SWF30 + (i << 2));
790 840
791 /* Fences */ 841 mutex_unlock(&dev->struct_mutex);
792 switch (INTEL_INFO(dev)->gen) {
793 case 6:
794 for (i = 0; i < 16; i++)
795 dev_priv->saveFENCE[i] = I915_READ64(FENCE_REG_SANDYBRIDGE_0 + (i * 8));
796 break;
797 case 5:
798 case 4:
799 for (i = 0; i < 16; i++)
800 dev_priv->saveFENCE[i] = I915_READ64(FENCE_REG_965_0 + (i * 8));
801 break;
802 case 3:
803 if (IS_I945G(dev) || IS_I945GM(dev) || IS_G33(dev))
804 for (i = 0; i < 8; i++)
805 dev_priv->saveFENCE[i+8] = I915_READ(FENCE_REG_945_8 + (i * 4));
806 case 2:
807 for (i = 0; i < 8; i++)
808 dev_priv->saveFENCE[i] = I915_READ(FENCE_REG_830_0 + (i * 4));
809 break;
810
811 }
812 842
813 return 0; 843 return 0;
814} 844}
@@ -820,30 +850,11 @@ int i915_restore_state(struct drm_device *dev)
820 850
821 pci_write_config_byte(dev->pdev, LBB, dev_priv->saveLBB); 851 pci_write_config_byte(dev->pdev, LBB, dev_priv->saveLBB);
822 852
853 mutex_lock(&dev->struct_mutex);
854
823 /* Hardware status page */ 855 /* Hardware status page */
824 I915_WRITE(HWS_PGA, dev_priv->saveHWS); 856 I915_WRITE(HWS_PGA, dev_priv->saveHWS);
825 857
826 /* Fences */
827 switch (INTEL_INFO(dev)->gen) {
828 case 6:
829 for (i = 0; i < 16; i++)
830 I915_WRITE64(FENCE_REG_SANDYBRIDGE_0 + (i * 8), dev_priv->saveFENCE[i]);
831 break;
832 case 5:
833 case 4:
834 for (i = 0; i < 16; i++)
835 I915_WRITE64(FENCE_REG_965_0 + (i * 8), dev_priv->saveFENCE[i]);
836 break;
837 case 3:
838 case 2:
839 if (IS_I945G(dev) || IS_I945GM(dev) || IS_G33(dev))
840 for (i = 0; i < 8; i++)
841 I915_WRITE(FENCE_REG_945_8 + (i * 4), dev_priv->saveFENCE[i+8]);
842 for (i = 0; i < 8; i++)
843 I915_WRITE(FENCE_REG_830_0 + (i * 4), dev_priv->saveFENCE[i]);
844 break;
845 }
846
847 i915_restore_display(dev); 858 i915_restore_display(dev);
848 859
849 /* Interrupt state */ 860 /* Interrupt state */
@@ -852,18 +863,25 @@ int i915_restore_state(struct drm_device *dev)
852 I915_WRITE(DEIMR, dev_priv->saveDEIMR); 863 I915_WRITE(DEIMR, dev_priv->saveDEIMR);
853 I915_WRITE(GTIER, dev_priv->saveGTIER); 864 I915_WRITE(GTIER, dev_priv->saveGTIER);
854 I915_WRITE(GTIMR, dev_priv->saveGTIMR); 865 I915_WRITE(GTIMR, dev_priv->saveGTIMR);
855 I915_WRITE(FDI_RXA_IMR, dev_priv->saveFDI_RXA_IMR); 866 I915_WRITE(_FDI_RXA_IMR, dev_priv->saveFDI_RXA_IMR);
856 I915_WRITE(FDI_RXB_IMR, dev_priv->saveFDI_RXB_IMR); 867 I915_WRITE(_FDI_RXB_IMR, dev_priv->saveFDI_RXB_IMR);
857 } else { 868 } else {
858 I915_WRITE (IER, dev_priv->saveIER); 869 I915_WRITE(IER, dev_priv->saveIER);
859 I915_WRITE (IMR, dev_priv->saveIMR); 870 I915_WRITE(IMR, dev_priv->saveIMR);
860 } 871 }
872 mutex_unlock(&dev->struct_mutex);
861 873
862 /* Clock gating state */
863 intel_init_clock_gating(dev); 874 intel_init_clock_gating(dev);
864 875
865 if (HAS_PCH_SPLIT(dev)) 876 if (IS_IRONLAKE_M(dev)) {
866 ironlake_enable_drps(dev); 877 ironlake_enable_drps(dev);
878 intel_init_emon(dev);
879 }
880
881 if (IS_GEN6(dev))
882 gen6_enable_rps(dev_priv);
883
884 mutex_lock(&dev->struct_mutex);
867 885
868 /* Cache mode state */ 886 /* Cache mode state */
869 I915_WRITE (CACHE_MODE_0, dev_priv->saveCACHE_MODE_0 | 0xffff0000); 887 I915_WRITE (CACHE_MODE_0, dev_priv->saveCACHE_MODE_0 | 0xffff0000);
@@ -878,9 +896,9 @@ int i915_restore_state(struct drm_device *dev)
878 for (i = 0; i < 3; i++) 896 for (i = 0; i < 3; i++)
879 I915_WRITE(SWF30 + (i << 2), dev_priv->saveSWF2[i]); 897 I915_WRITE(SWF30 + (i << 2), dev_priv->saveSWF2[i]);
880 898
881 /* I2C state */ 899 mutex_unlock(&dev->struct_mutex);
882 intel_i2c_reset_gmbus(dev); 900
901 intel_i2c_reset(dev);
883 902
884 return 0; 903 return 0;
885} 904}
886
diff --git a/drivers/gpu/drm/i915/i915_trace.h b/drivers/gpu/drm/i915/i915_trace.h
index fea97a21cc14..d623fefbfaca 100644
--- a/drivers/gpu/drm/i915/i915_trace.h
+++ b/drivers/gpu/drm/i915/i915_trace.h
@@ -6,6 +6,8 @@
6#include <linux/tracepoint.h> 6#include <linux/tracepoint.h>
7 7
8#include <drm/drmP.h> 8#include <drm/drmP.h>
9#include "i915_drv.h"
10#include "intel_ringbuffer.h"
9 11
10#undef TRACE_SYSTEM 12#undef TRACE_SYSTEM
11#define TRACE_SYSTEM i915 13#define TRACE_SYSTEM i915
@@ -15,97 +17,160 @@
15/* object tracking */ 17/* object tracking */
16 18
17TRACE_EVENT(i915_gem_object_create, 19TRACE_EVENT(i915_gem_object_create,
18 20 TP_PROTO(struct drm_i915_gem_object *obj),
19 TP_PROTO(struct drm_gem_object *obj),
20
21 TP_ARGS(obj), 21 TP_ARGS(obj),
22 22
23 TP_STRUCT__entry( 23 TP_STRUCT__entry(
24 __field(struct drm_gem_object *, obj) 24 __field(struct drm_i915_gem_object *, obj)
25 __field(u32, size) 25 __field(u32, size)
26 ), 26 ),
27 27
28 TP_fast_assign( 28 TP_fast_assign(
29 __entry->obj = obj; 29 __entry->obj = obj;
30 __entry->size = obj->size; 30 __entry->size = obj->base.size;
31 ), 31 ),
32 32
33 TP_printk("obj=%p, size=%u", __entry->obj, __entry->size) 33 TP_printk("obj=%p, size=%u", __entry->obj, __entry->size)
34); 34);
35 35
36TRACE_EVENT(i915_gem_object_bind, 36TRACE_EVENT(i915_gem_object_bind,
37 TP_PROTO(struct drm_i915_gem_object *obj, bool mappable),
38 TP_ARGS(obj, mappable),
37 39
38 TP_PROTO(struct drm_gem_object *obj, u32 gtt_offset), 40 TP_STRUCT__entry(
41 __field(struct drm_i915_gem_object *, obj)
42 __field(u32, offset)
43 __field(u32, size)
44 __field(bool, mappable)
45 ),
39 46
40 TP_ARGS(obj, gtt_offset), 47 TP_fast_assign(
48 __entry->obj = obj;
49 __entry->offset = obj->gtt_space->start;
50 __entry->size = obj->gtt_space->size;
51 __entry->mappable = mappable;
52 ),
53
54 TP_printk("obj=%p, offset=%08x size=%x%s",
55 __entry->obj, __entry->offset, __entry->size,
56 __entry->mappable ? ", mappable" : "")
57);
58
59TRACE_EVENT(i915_gem_object_unbind,
60 TP_PROTO(struct drm_i915_gem_object *obj),
61 TP_ARGS(obj),
41 62
42 TP_STRUCT__entry( 63 TP_STRUCT__entry(
43 __field(struct drm_gem_object *, obj) 64 __field(struct drm_i915_gem_object *, obj)
44 __field(u32, gtt_offset) 65 __field(u32, offset)
66 __field(u32, size)
45 ), 67 ),
46 68
47 TP_fast_assign( 69 TP_fast_assign(
48 __entry->obj = obj; 70 __entry->obj = obj;
49 __entry->gtt_offset = gtt_offset; 71 __entry->offset = obj->gtt_space->start;
72 __entry->size = obj->gtt_space->size;
50 ), 73 ),
51 74
52 TP_printk("obj=%p, gtt_offset=%08x", 75 TP_printk("obj=%p, offset=%08x size=%x",
53 __entry->obj, __entry->gtt_offset) 76 __entry->obj, __entry->offset, __entry->size)
54); 77);
55 78
56TRACE_EVENT(i915_gem_object_change_domain, 79TRACE_EVENT(i915_gem_object_change_domain,
57 80 TP_PROTO(struct drm_i915_gem_object *obj, u32 old_read, u32 old_write),
58 TP_PROTO(struct drm_gem_object *obj, uint32_t old_read_domains, uint32_t old_write_domain), 81 TP_ARGS(obj, old_read, old_write),
59
60 TP_ARGS(obj, old_read_domains, old_write_domain),
61 82
62 TP_STRUCT__entry( 83 TP_STRUCT__entry(
63 __field(struct drm_gem_object *, obj) 84 __field(struct drm_i915_gem_object *, obj)
64 __field(u32, read_domains) 85 __field(u32, read_domains)
65 __field(u32, write_domain) 86 __field(u32, write_domain)
66 ), 87 ),
67 88
68 TP_fast_assign( 89 TP_fast_assign(
69 __entry->obj = obj; 90 __entry->obj = obj;
70 __entry->read_domains = obj->read_domains | (old_read_domains << 16); 91 __entry->read_domains = obj->base.read_domains | (old_read << 16);
71 __entry->write_domain = obj->write_domain | (old_write_domain << 16); 92 __entry->write_domain = obj->base.write_domain | (old_write << 16);
72 ), 93 ),
73 94
74 TP_printk("obj=%p, read=%04x, write=%04x", 95 TP_printk("obj=%p, read=%02x=>%02x, write=%02x=>%02x",
75 __entry->obj, 96 __entry->obj,
76 __entry->read_domains, __entry->write_domain) 97 __entry->read_domains >> 16,
98 __entry->read_domains & 0xffff,
99 __entry->write_domain >> 16,
100 __entry->write_domain & 0xffff)
77); 101);
78 102
79TRACE_EVENT(i915_gem_object_get_fence, 103TRACE_EVENT(i915_gem_object_pwrite,
104 TP_PROTO(struct drm_i915_gem_object *obj, u32 offset, u32 len),
105 TP_ARGS(obj, offset, len),
80 106
81 TP_PROTO(struct drm_gem_object *obj, int fence, int tiling_mode), 107 TP_STRUCT__entry(
108 __field(struct drm_i915_gem_object *, obj)
109 __field(u32, offset)
110 __field(u32, len)
111 ),
82 112
83 TP_ARGS(obj, fence, tiling_mode), 113 TP_fast_assign(
114 __entry->obj = obj;
115 __entry->offset = offset;
116 __entry->len = len;
117 ),
118
119 TP_printk("obj=%p, offset=%u, len=%u",
120 __entry->obj, __entry->offset, __entry->len)
121);
122
123TRACE_EVENT(i915_gem_object_pread,
124 TP_PROTO(struct drm_i915_gem_object *obj, u32 offset, u32 len),
125 TP_ARGS(obj, offset, len),
84 126
85 TP_STRUCT__entry( 127 TP_STRUCT__entry(
86 __field(struct drm_gem_object *, obj) 128 __field(struct drm_i915_gem_object *, obj)
87 __field(int, fence) 129 __field(u32, offset)
88 __field(int, tiling_mode) 130 __field(u32, len)
89 ), 131 ),
90 132
91 TP_fast_assign( 133 TP_fast_assign(
92 __entry->obj = obj; 134 __entry->obj = obj;
93 __entry->fence = fence; 135 __entry->offset = offset;
94 __entry->tiling_mode = tiling_mode; 136 __entry->len = len;
95 ), 137 ),
96 138
97 TP_printk("obj=%p, fence=%d, tiling=%d", 139 TP_printk("obj=%p, offset=%u, len=%u",
98 __entry->obj, __entry->fence, __entry->tiling_mode) 140 __entry->obj, __entry->offset, __entry->len)
99); 141);
100 142
101DECLARE_EVENT_CLASS(i915_gem_object, 143TRACE_EVENT(i915_gem_object_fault,
144 TP_PROTO(struct drm_i915_gem_object *obj, u32 index, bool gtt, bool write),
145 TP_ARGS(obj, index, gtt, write),
146
147 TP_STRUCT__entry(
148 __field(struct drm_i915_gem_object *, obj)
149 __field(u32, index)
150 __field(bool, gtt)
151 __field(bool, write)
152 ),
153
154 TP_fast_assign(
155 __entry->obj = obj;
156 __entry->index = index;
157 __entry->gtt = gtt;
158 __entry->write = write;
159 ),
102 160
103 TP_PROTO(struct drm_gem_object *obj), 161 TP_printk("obj=%p, %s index=%u %s",
162 __entry->obj,
163 __entry->gtt ? "GTT" : "CPU",
164 __entry->index,
165 __entry->write ? ", writable" : "")
166);
104 167
168DECLARE_EVENT_CLASS(i915_gem_object,
169 TP_PROTO(struct drm_i915_gem_object *obj),
105 TP_ARGS(obj), 170 TP_ARGS(obj),
106 171
107 TP_STRUCT__entry( 172 TP_STRUCT__entry(
108 __field(struct drm_gem_object *, obj) 173 __field(struct drm_i915_gem_object *, obj)
109 ), 174 ),
110 175
111 TP_fast_assign( 176 TP_fast_assign(
@@ -116,160 +181,181 @@ DECLARE_EVENT_CLASS(i915_gem_object,
116); 181);
117 182
118DEFINE_EVENT(i915_gem_object, i915_gem_object_clflush, 183DEFINE_EVENT(i915_gem_object, i915_gem_object_clflush,
119 184 TP_PROTO(struct drm_i915_gem_object *obj),
120 TP_PROTO(struct drm_gem_object *obj), 185 TP_ARGS(obj)
121
122 TP_ARGS(obj)
123); 186);
124 187
125DEFINE_EVENT(i915_gem_object, i915_gem_object_unbind, 188DEFINE_EVENT(i915_gem_object, i915_gem_object_destroy,
126 189 TP_PROTO(struct drm_i915_gem_object *obj),
127 TP_PROTO(struct drm_gem_object *obj),
128
129 TP_ARGS(obj) 190 TP_ARGS(obj)
130); 191);
131 192
132DEFINE_EVENT(i915_gem_object, i915_gem_object_destroy, 193TRACE_EVENT(i915_gem_evict,
194 TP_PROTO(struct drm_device *dev, u32 size, u32 align, bool mappable),
195 TP_ARGS(dev, size, align, mappable),
133 196
134 TP_PROTO(struct drm_gem_object *obj), 197 TP_STRUCT__entry(
198 __field(u32, dev)
199 __field(u32, size)
200 __field(u32, align)
201 __field(bool, mappable)
202 ),
135 203
136 TP_ARGS(obj) 204 TP_fast_assign(
205 __entry->dev = dev->primary->index;
206 __entry->size = size;
207 __entry->align = align;
208 __entry->mappable = mappable;
209 ),
210
211 TP_printk("dev=%d, size=%d, align=%d %s",
212 __entry->dev, __entry->size, __entry->align,
213 __entry->mappable ? ", mappable" : "")
137); 214);
138 215
139/* batch tracing */ 216TRACE_EVENT(i915_gem_evict_everything,
217 TP_PROTO(struct drm_device *dev, bool purgeable),
218 TP_ARGS(dev, purgeable),
140 219
141TRACE_EVENT(i915_gem_request_submit, 220 TP_STRUCT__entry(
221 __field(u32, dev)
222 __field(bool, purgeable)
223 ),
224
225 TP_fast_assign(
226 __entry->dev = dev->primary->index;
227 __entry->purgeable = purgeable;
228 ),
142 229
143 TP_PROTO(struct drm_device *dev, u32 seqno), 230 TP_printk("dev=%d%s",
231 __entry->dev,
232 __entry->purgeable ? ", purgeable only" : "")
233);
144 234
145 TP_ARGS(dev, seqno), 235TRACE_EVENT(i915_gem_ring_dispatch,
236 TP_PROTO(struct intel_ring_buffer *ring, u32 seqno),
237 TP_ARGS(ring, seqno),
146 238
147 TP_STRUCT__entry( 239 TP_STRUCT__entry(
148 __field(u32, dev) 240 __field(u32, dev)
241 __field(u32, ring)
149 __field(u32, seqno) 242 __field(u32, seqno)
150 ), 243 ),
151 244
152 TP_fast_assign( 245 TP_fast_assign(
153 __entry->dev = dev->primary->index; 246 __entry->dev = ring->dev->primary->index;
247 __entry->ring = ring->id;
154 __entry->seqno = seqno; 248 __entry->seqno = seqno;
155 i915_trace_irq_get(dev, seqno); 249 i915_trace_irq_get(ring, seqno);
156 ), 250 ),
157 251
158 TP_printk("dev=%u, seqno=%u", __entry->dev, __entry->seqno) 252 TP_printk("dev=%u, ring=%u, seqno=%u",
253 __entry->dev, __entry->ring, __entry->seqno)
159); 254);
160 255
161TRACE_EVENT(i915_gem_request_flush, 256TRACE_EVENT(i915_gem_ring_flush,
162 257 TP_PROTO(struct intel_ring_buffer *ring, u32 invalidate, u32 flush),
163 TP_PROTO(struct drm_device *dev, u32 seqno, 258 TP_ARGS(ring, invalidate, flush),
164 u32 flush_domains, u32 invalidate_domains),
165
166 TP_ARGS(dev, seqno, flush_domains, invalidate_domains),
167 259
168 TP_STRUCT__entry( 260 TP_STRUCT__entry(
169 __field(u32, dev) 261 __field(u32, dev)
170 __field(u32, seqno) 262 __field(u32, ring)
171 __field(u32, flush_domains) 263 __field(u32, invalidate)
172 __field(u32, invalidate_domains) 264 __field(u32, flush)
173 ), 265 ),
174 266
175 TP_fast_assign( 267 TP_fast_assign(
176 __entry->dev = dev->primary->index; 268 __entry->dev = ring->dev->primary->index;
177 __entry->seqno = seqno; 269 __entry->ring = ring->id;
178 __entry->flush_domains = flush_domains; 270 __entry->invalidate = invalidate;
179 __entry->invalidate_domains = invalidate_domains; 271 __entry->flush = flush;
180 ), 272 ),
181 273
182 TP_printk("dev=%u, seqno=%u, flush=%04x, invalidate=%04x", 274 TP_printk("dev=%u, ring=%x, invalidate=%04x, flush=%04x",
183 __entry->dev, __entry->seqno, 275 __entry->dev, __entry->ring,
184 __entry->flush_domains, __entry->invalidate_domains) 276 __entry->invalidate, __entry->flush)
185); 277);
186 278
187DECLARE_EVENT_CLASS(i915_gem_request, 279DECLARE_EVENT_CLASS(i915_gem_request,
188 280 TP_PROTO(struct intel_ring_buffer *ring, u32 seqno),
189 TP_PROTO(struct drm_device *dev, u32 seqno), 281 TP_ARGS(ring, seqno),
190
191 TP_ARGS(dev, seqno),
192 282
193 TP_STRUCT__entry( 283 TP_STRUCT__entry(
194 __field(u32, dev) 284 __field(u32, dev)
285 __field(u32, ring)
195 __field(u32, seqno) 286 __field(u32, seqno)
196 ), 287 ),
197 288
198 TP_fast_assign( 289 TP_fast_assign(
199 __entry->dev = dev->primary->index; 290 __entry->dev = ring->dev->primary->index;
291 __entry->ring = ring->id;
200 __entry->seqno = seqno; 292 __entry->seqno = seqno;
201 ), 293 ),
202 294
203 TP_printk("dev=%u, seqno=%u", __entry->dev, __entry->seqno) 295 TP_printk("dev=%u, ring=%u, seqno=%u",
296 __entry->dev, __entry->ring, __entry->seqno)
204); 297);
205 298
206DEFINE_EVENT(i915_gem_request, i915_gem_request_complete, 299DEFINE_EVENT(i915_gem_request, i915_gem_request_add,
207 300 TP_PROTO(struct intel_ring_buffer *ring, u32 seqno),
208 TP_PROTO(struct drm_device *dev, u32 seqno), 301 TP_ARGS(ring, seqno)
302);
209 303
210 TP_ARGS(dev, seqno) 304DEFINE_EVENT(i915_gem_request, i915_gem_request_complete,
305 TP_PROTO(struct intel_ring_buffer *ring, u32 seqno),
306 TP_ARGS(ring, seqno)
211); 307);
212 308
213DEFINE_EVENT(i915_gem_request, i915_gem_request_retire, 309DEFINE_EVENT(i915_gem_request, i915_gem_request_retire,
214 310 TP_PROTO(struct intel_ring_buffer *ring, u32 seqno),
215 TP_PROTO(struct drm_device *dev, u32 seqno), 311 TP_ARGS(ring, seqno)
216
217 TP_ARGS(dev, seqno)
218); 312);
219 313
220DEFINE_EVENT(i915_gem_request, i915_gem_request_wait_begin, 314DEFINE_EVENT(i915_gem_request, i915_gem_request_wait_begin,
221 315 TP_PROTO(struct intel_ring_buffer *ring, u32 seqno),
222 TP_PROTO(struct drm_device *dev, u32 seqno), 316 TP_ARGS(ring, seqno)
223
224 TP_ARGS(dev, seqno)
225); 317);
226 318
227DEFINE_EVENT(i915_gem_request, i915_gem_request_wait_end, 319DEFINE_EVENT(i915_gem_request, i915_gem_request_wait_end,
228 320 TP_PROTO(struct intel_ring_buffer *ring, u32 seqno),
229 TP_PROTO(struct drm_device *dev, u32 seqno), 321 TP_ARGS(ring, seqno)
230
231 TP_ARGS(dev, seqno)
232); 322);
233 323
234DECLARE_EVENT_CLASS(i915_ring, 324DECLARE_EVENT_CLASS(i915_ring,
235 325 TP_PROTO(struct intel_ring_buffer *ring),
236 TP_PROTO(struct drm_device *dev), 326 TP_ARGS(ring),
237
238 TP_ARGS(dev),
239 327
240 TP_STRUCT__entry( 328 TP_STRUCT__entry(
241 __field(u32, dev) 329 __field(u32, dev)
330 __field(u32, ring)
242 ), 331 ),
243 332
244 TP_fast_assign( 333 TP_fast_assign(
245 __entry->dev = dev->primary->index; 334 __entry->dev = ring->dev->primary->index;
335 __entry->ring = ring->id;
246 ), 336 ),
247 337
248 TP_printk("dev=%u", __entry->dev) 338 TP_printk("dev=%u, ring=%u", __entry->dev, __entry->ring)
249); 339);
250 340
251DEFINE_EVENT(i915_ring, i915_ring_wait_begin, 341DEFINE_EVENT(i915_ring, i915_ring_wait_begin,
252 342 TP_PROTO(struct intel_ring_buffer *ring),
253 TP_PROTO(struct drm_device *dev), 343 TP_ARGS(ring)
254
255 TP_ARGS(dev)
256); 344);
257 345
258DEFINE_EVENT(i915_ring, i915_ring_wait_end, 346DEFINE_EVENT(i915_ring, i915_ring_wait_end,
259 347 TP_PROTO(struct intel_ring_buffer *ring),
260 TP_PROTO(struct drm_device *dev), 348 TP_ARGS(ring)
261
262 TP_ARGS(dev)
263); 349);
264 350
265TRACE_EVENT(i915_flip_request, 351TRACE_EVENT(i915_flip_request,
266 TP_PROTO(int plane, struct drm_gem_object *obj), 352 TP_PROTO(int plane, struct drm_i915_gem_object *obj),
267 353
268 TP_ARGS(plane, obj), 354 TP_ARGS(plane, obj),
269 355
270 TP_STRUCT__entry( 356 TP_STRUCT__entry(
271 __field(int, plane) 357 __field(int, plane)
272 __field(struct drm_gem_object *, obj) 358 __field(struct drm_i915_gem_object *, obj)
273 ), 359 ),
274 360
275 TP_fast_assign( 361 TP_fast_assign(
@@ -281,13 +367,13 @@ TRACE_EVENT(i915_flip_request,
281); 367);
282 368
283TRACE_EVENT(i915_flip_complete, 369TRACE_EVENT(i915_flip_complete,
284 TP_PROTO(int plane, struct drm_gem_object *obj), 370 TP_PROTO(int plane, struct drm_i915_gem_object *obj),
285 371
286 TP_ARGS(plane, obj), 372 TP_ARGS(plane, obj),
287 373
288 TP_STRUCT__entry( 374 TP_STRUCT__entry(
289 __field(int, plane) 375 __field(int, plane)
290 __field(struct drm_gem_object *, obj) 376 __field(struct drm_i915_gem_object *, obj)
291 ), 377 ),
292 378
293 TP_fast_assign( 379 TP_fast_assign(
@@ -298,6 +384,32 @@ TRACE_EVENT(i915_flip_complete,
298 TP_printk("plane=%d, obj=%p", __entry->plane, __entry->obj) 384 TP_printk("plane=%d, obj=%p", __entry->plane, __entry->obj)
299); 385);
300 386
387TRACE_EVENT(i915_reg_rw,
388 TP_PROTO(bool write, u32 reg, u64 val, int len),
389
390 TP_ARGS(write, reg, val, len),
391
392 TP_STRUCT__entry(
393 __field(u64, val)
394 __field(u32, reg)
395 __field(u16, write)
396 __field(u16, len)
397 ),
398
399 TP_fast_assign(
400 __entry->val = (u64)val;
401 __entry->reg = reg;
402 __entry->write = write;
403 __entry->len = len;
404 ),
405
406 TP_printk("%s reg=0x%x, len=%d, val=(0x%x, 0x%x)",
407 __entry->write ? "write" : "read",
408 __entry->reg, __entry->len,
409 (u32)(__entry->val & 0xffffffff),
410 (u32)(__entry->val >> 32))
411);
412
301#endif /* _I915_TRACE_H_ */ 413#endif /* _I915_TRACE_H_ */
302 414
303/* This part must be outside protection */ 415/* This part must be outside protection */
diff --git a/drivers/gpu/drm/i915/intel_acpi.c b/drivers/gpu/drm/i915/intel_acpi.c
new file mode 100644
index 000000000000..2cb8e0b9f1ee
--- /dev/null
+++ b/drivers/gpu/drm/i915/intel_acpi.c
@@ -0,0 +1,252 @@
1/*
2 * Intel ACPI functions
3 *
4 * _DSM related code stolen from nouveau_acpi.c.
5 */
6#include <linux/pci.h>
7#include <linux/acpi.h>
8#include <linux/vga_switcheroo.h>
9#include <acpi/acpi_drivers.h>
10
11#include "drmP.h"
12
13#define INTEL_DSM_REVISION_ID 1 /* For Calpella anyway... */
14
15#define INTEL_DSM_FN_SUPPORTED_FUNCTIONS 0 /* No args */
16#define INTEL_DSM_FN_PLATFORM_MUX_INFO 1 /* No args */
17
18static struct intel_dsm_priv {
19 acpi_handle dhandle;
20} intel_dsm_priv;
21
22static const u8 intel_dsm_guid[] = {
23 0xd3, 0x73, 0xd8, 0x7e,
24 0xd0, 0xc2,
25 0x4f, 0x4e,
26 0xa8, 0x54,
27 0x0f, 0x13, 0x17, 0xb0, 0x1c, 0x2c
28};
29
30static int intel_dsm(acpi_handle handle, int func, int arg)
31{
32 struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL };
33 struct acpi_object_list input;
34 union acpi_object params[4];
35 union acpi_object *obj;
36 u32 result;
37 int ret = 0;
38
39 input.count = 4;
40 input.pointer = params;
41 params[0].type = ACPI_TYPE_BUFFER;
42 params[0].buffer.length = sizeof(intel_dsm_guid);
43 params[0].buffer.pointer = (char *)intel_dsm_guid;
44 params[1].type = ACPI_TYPE_INTEGER;
45 params[1].integer.value = INTEL_DSM_REVISION_ID;
46 params[2].type = ACPI_TYPE_INTEGER;
47 params[2].integer.value = func;
48 params[3].type = ACPI_TYPE_INTEGER;
49 params[3].integer.value = arg;
50
51 ret = acpi_evaluate_object(handle, "_DSM", &input, &output);
52 if (ret) {
53 DRM_DEBUG_DRIVER("failed to evaluate _DSM: %d\n", ret);
54 return ret;
55 }
56
57 obj = (union acpi_object *)output.pointer;
58
59 result = 0;
60 switch (obj->type) {
61 case ACPI_TYPE_INTEGER:
62 result = obj->integer.value;
63 break;
64
65 case ACPI_TYPE_BUFFER:
66 if (obj->buffer.length == 4) {
67 result =(obj->buffer.pointer[0] |
68 (obj->buffer.pointer[1] << 8) |
69 (obj->buffer.pointer[2] << 16) |
70 (obj->buffer.pointer[3] << 24));
71 break;
72 }
73 default:
74 ret = -EINVAL;
75 break;
76 }
77 if (result == 0x80000002)
78 ret = -ENODEV;
79
80 kfree(output.pointer);
81 return ret;
82}
83
84static char *intel_dsm_port_name(u8 id)
85{
86 switch (id) {
87 case 0:
88 return "Reserved";
89 case 1:
90 return "Analog VGA";
91 case 2:
92 return "LVDS";
93 case 3:
94 return "Reserved";
95 case 4:
96 return "HDMI/DVI_B";
97 case 5:
98 return "HDMI/DVI_C";
99 case 6:
100 return "HDMI/DVI_D";
101 case 7:
102 return "DisplayPort_A";
103 case 8:
104 return "DisplayPort_B";
105 case 9:
106 return "DisplayPort_C";
107 case 0xa:
108 return "DisplayPort_D";
109 case 0xb:
110 case 0xc:
111 case 0xd:
112 return "Reserved";
113 case 0xe:
114 return "WiDi";
115 default:
116 return "bad type";
117 }
118}
119
120static char *intel_dsm_mux_type(u8 type)
121{
122 switch (type) {
123 case 0:
124 return "unknown";
125 case 1:
126 return "No MUX, iGPU only";
127 case 2:
128 return "No MUX, dGPU only";
129 case 3:
130 return "MUXed between iGPU and dGPU";
131 default:
132 return "bad type";
133 }
134}
135
136static void intel_dsm_platform_mux_info(void)
137{
138 struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL };
139 struct acpi_object_list input;
140 union acpi_object params[4];
141 union acpi_object *pkg;
142 int i, ret;
143
144 input.count = 4;
145 input.pointer = params;
146 params[0].type = ACPI_TYPE_BUFFER;
147 params[0].buffer.length = sizeof(intel_dsm_guid);
148 params[0].buffer.pointer = (char *)intel_dsm_guid;
149 params[1].type = ACPI_TYPE_INTEGER;
150 params[1].integer.value = INTEL_DSM_REVISION_ID;
151 params[2].type = ACPI_TYPE_INTEGER;
152 params[2].integer.value = INTEL_DSM_FN_PLATFORM_MUX_INFO;
153 params[3].type = ACPI_TYPE_INTEGER;
154 params[3].integer.value = 0;
155
156 ret = acpi_evaluate_object(intel_dsm_priv.dhandle, "_DSM", &input,
157 &output);
158 if (ret) {
159 DRM_DEBUG_DRIVER("failed to evaluate _DSM: %d\n", ret);
160 goto out;
161 }
162
163 pkg = (union acpi_object *)output.pointer;
164
165 if (pkg->type == ACPI_TYPE_PACKAGE) {
166 union acpi_object *connector_count = &pkg->package.elements[0];
167 DRM_DEBUG_DRIVER("MUX info connectors: %lld\n",
168 (unsigned long long)connector_count->integer.value);
169 for (i = 1; i < pkg->package.count; i++) {
170 union acpi_object *obj = &pkg->package.elements[i];
171 union acpi_object *connector_id =
172 &obj->package.elements[0];
173 union acpi_object *info = &obj->package.elements[1];
174 DRM_DEBUG_DRIVER("Connector id: 0x%016llx\n",
175 (unsigned long long)connector_id->integer.value);
176 DRM_DEBUG_DRIVER(" port id: %s\n",
177 intel_dsm_port_name(info->buffer.pointer[0]));
178 DRM_DEBUG_DRIVER(" display mux info: %s\n",
179 intel_dsm_mux_type(info->buffer.pointer[1]));
180 DRM_DEBUG_DRIVER(" aux/dc mux info: %s\n",
181 intel_dsm_mux_type(info->buffer.pointer[2]));
182 DRM_DEBUG_DRIVER(" hpd mux info: %s\n",
183 intel_dsm_mux_type(info->buffer.pointer[3]));
184 }
185 } else {
186 DRM_ERROR("MUX INFO call failed\n");
187 }
188
189out:
190 kfree(output.pointer);
191}
192
193static bool intel_dsm_pci_probe(struct pci_dev *pdev)
194{
195 acpi_handle dhandle, intel_handle;
196 acpi_status status;
197 int ret;
198
199 dhandle = DEVICE_ACPI_HANDLE(&pdev->dev);
200 if (!dhandle)
201 return false;
202
203 status = acpi_get_handle(dhandle, "_DSM", &intel_handle);
204 if (ACPI_FAILURE(status)) {
205 DRM_DEBUG_KMS("no _DSM method for intel device\n");
206 return false;
207 }
208
209 ret = intel_dsm(dhandle, INTEL_DSM_FN_SUPPORTED_FUNCTIONS, 0);
210 if (ret < 0) {
211 DRM_ERROR("failed to get supported _DSM functions\n");
212 return false;
213 }
214
215 intel_dsm_priv.dhandle = dhandle;
216
217 intel_dsm_platform_mux_info();
218 return true;
219}
220
221static bool intel_dsm_detect(void)
222{
223 char acpi_method_name[255] = { 0 };
224 struct acpi_buffer buffer = {sizeof(acpi_method_name), acpi_method_name};
225 struct pci_dev *pdev = NULL;
226 bool has_dsm = false;
227 int vga_count = 0;
228
229 while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_VGA << 8, pdev)) != NULL) {
230 vga_count++;
231 has_dsm |= intel_dsm_pci_probe(pdev);
232 }
233
234 if (vga_count == 2 && has_dsm) {
235 acpi_get_name(intel_dsm_priv.dhandle, ACPI_FULL_PATHNAME, &buffer);
236 DRM_DEBUG_DRIVER("VGA switcheroo: detected DSM switching method %s handle\n",
237 acpi_method_name);
238 return true;
239 }
240
241 return false;
242}
243
244void intel_register_dsm_handler(void)
245{
246 if (!intel_dsm_detect())
247 return;
248}
249
250void intel_unregister_dsm_handler(void)
251{
252}
diff --git a/drivers/gpu/drm/i915/intel_bios.c b/drivers/gpu/drm/i915/intel_bios.c
index 96f75d7f6633..927442a11925 100644
--- a/drivers/gpu/drm/i915/intel_bios.c
+++ b/drivers/gpu/drm/i915/intel_bios.c
@@ -24,6 +24,7 @@
24 * Eric Anholt <eric@anholt.net> 24 * Eric Anholt <eric@anholt.net>
25 * 25 *
26 */ 26 */
27#include <drm/drm_dp_helper.h>
27#include "drmP.h" 28#include "drmP.h"
28#include "drm.h" 29#include "drm.h"
29#include "i915_drm.h" 30#include "i915_drm.h"
@@ -129,10 +130,6 @@ parse_lfp_panel_data(struct drm_i915_private *dev_priv,
129 int i, temp_downclock; 130 int i, temp_downclock;
130 struct drm_display_mode *temp_mode; 131 struct drm_display_mode *temp_mode;
131 132
132 /* Defaults if we can't find VBT info */
133 dev_priv->lvds_dither = 0;
134 dev_priv->lvds_vbt = 0;
135
136 lvds_options = find_section(bdb, BDB_LVDS_OPTIONS); 133 lvds_options = find_section(bdb, BDB_LVDS_OPTIONS);
137 if (!lvds_options) 134 if (!lvds_options)
138 return; 135 return;
@@ -140,6 +137,7 @@ parse_lfp_panel_data(struct drm_i915_private *dev_priv,
140 dev_priv->lvds_dither = lvds_options->pixel_dither; 137 dev_priv->lvds_dither = lvds_options->pixel_dither;
141 if (lvds_options->panel_type == 0xff) 138 if (lvds_options->panel_type == 0xff)
142 return; 139 return;
140
143 panel_type = lvds_options->panel_type; 141 panel_type = lvds_options->panel_type;
144 142
145 lvds_lfp_data = find_section(bdb, BDB_LVDS_LFP_DATA); 143 lvds_lfp_data = find_section(bdb, BDB_LVDS_LFP_DATA);
@@ -169,6 +167,8 @@ parse_lfp_panel_data(struct drm_i915_private *dev_priv,
169 ((unsigned char *)entry + dvo_timing_offset); 167 ((unsigned char *)entry + dvo_timing_offset);
170 168
171 panel_fixed_mode = kzalloc(sizeof(*panel_fixed_mode), GFP_KERNEL); 169 panel_fixed_mode = kzalloc(sizeof(*panel_fixed_mode), GFP_KERNEL);
170 if (!panel_fixed_mode)
171 return;
172 172
173 fill_detail_timing_data(panel_fixed_mode, dvo_timing); 173 fill_detail_timing_data(panel_fixed_mode, dvo_timing);
174 174
@@ -214,9 +214,9 @@ parse_lfp_panel_data(struct drm_i915_private *dev_priv,
214 i915_lvds_downclock) { 214 i915_lvds_downclock) {
215 dev_priv->lvds_downclock_avail = 1; 215 dev_priv->lvds_downclock_avail = 1;
216 dev_priv->lvds_downclock = temp_downclock; 216 dev_priv->lvds_downclock = temp_downclock;
217 DRM_DEBUG_KMS("LVDS downclock is found in VBT. ", 217 DRM_DEBUG_KMS("LVDS downclock is found in VBT. "
218 "Normal Clock %dKHz, downclock %dKHz\n", 218 "Normal Clock %dKHz, downclock %dKHz\n",
219 temp_downclock, panel_fixed_mode->clock); 219 temp_downclock, panel_fixed_mode->clock);
220 } 220 }
221 return; 221 return;
222} 222}
@@ -226,31 +226,49 @@ static void
226parse_sdvo_panel_data(struct drm_i915_private *dev_priv, 226parse_sdvo_panel_data(struct drm_i915_private *dev_priv,
227 struct bdb_header *bdb) 227 struct bdb_header *bdb)
228{ 228{
229 struct bdb_sdvo_lvds_options *sdvo_lvds_options;
230 struct lvds_dvo_timing *dvo_timing; 229 struct lvds_dvo_timing *dvo_timing;
231 struct drm_display_mode *panel_fixed_mode; 230 struct drm_display_mode *panel_fixed_mode;
231 int index;
232 232
233 dev_priv->sdvo_lvds_vbt_mode = NULL; 233 index = i915_vbt_sdvo_panel_type;
234 if (index == -1) {
235 struct bdb_sdvo_lvds_options *sdvo_lvds_options;
234 236
235 sdvo_lvds_options = find_section(bdb, BDB_SDVO_LVDS_OPTIONS); 237 sdvo_lvds_options = find_section(bdb, BDB_SDVO_LVDS_OPTIONS);
236 if (!sdvo_lvds_options) 238 if (!sdvo_lvds_options)
237 return; 239 return;
240
241 index = sdvo_lvds_options->panel_type;
242 }
238 243
239 dvo_timing = find_section(bdb, BDB_SDVO_PANEL_DTDS); 244 dvo_timing = find_section(bdb, BDB_SDVO_PANEL_DTDS);
240 if (!dvo_timing) 245 if (!dvo_timing)
241 return; 246 return;
242 247
243 panel_fixed_mode = kzalloc(sizeof(*panel_fixed_mode), GFP_KERNEL); 248 panel_fixed_mode = kzalloc(sizeof(*panel_fixed_mode), GFP_KERNEL);
244
245 if (!panel_fixed_mode) 249 if (!panel_fixed_mode)
246 return; 250 return;
247 251
248 fill_detail_timing_data(panel_fixed_mode, 252 fill_detail_timing_data(panel_fixed_mode, dvo_timing + index);
249 dvo_timing + sdvo_lvds_options->panel_type);
250 253
251 dev_priv->sdvo_lvds_vbt_mode = panel_fixed_mode; 254 dev_priv->sdvo_lvds_vbt_mode = panel_fixed_mode;
252 255
253 return; 256 DRM_DEBUG_KMS("Found SDVO panel mode in BIOS VBT tables:\n");
257 drm_mode_debug_printmodeline(panel_fixed_mode);
258}
259
260static int intel_bios_ssc_frequency(struct drm_device *dev,
261 bool alternate)
262{
263 switch (INTEL_INFO(dev)->gen) {
264 case 2:
265 return alternate ? 66 : 48;
266 case 3:
267 case 4:
268 return alternate ? 100 : 96;
269 default:
270 return alternate ? 100 : 120;
271 }
254} 272}
255 273
256static void 274static void
@@ -260,27 +278,13 @@ parse_general_features(struct drm_i915_private *dev_priv,
260 struct drm_device *dev = dev_priv->dev; 278 struct drm_device *dev = dev_priv->dev;
261 struct bdb_general_features *general; 279 struct bdb_general_features *general;
262 280
263 /* Set sensible defaults in case we can't find the general block */
264 dev_priv->int_tv_support = 1;
265 dev_priv->int_crt_support = 1;
266
267 general = find_section(bdb, BDB_GENERAL_FEATURES); 281 general = find_section(bdb, BDB_GENERAL_FEATURES);
268 if (general) { 282 if (general) {
269 dev_priv->int_tv_support = general->int_tv_support; 283 dev_priv->int_tv_support = general->int_tv_support;
270 dev_priv->int_crt_support = general->int_crt_support; 284 dev_priv->int_crt_support = general->int_crt_support;
271 dev_priv->lvds_use_ssc = general->enable_ssc; 285 dev_priv->lvds_use_ssc = general->enable_ssc;
272 286 dev_priv->lvds_ssc_freq =
273 if (dev_priv->lvds_use_ssc) { 287 intel_bios_ssc_frequency(dev, general->ssc_freq);
274 if (IS_I85X(dev_priv->dev))
275 dev_priv->lvds_ssc_freq =
276 general->ssc_freq ? 66 : 48;
277 else if (IS_IRONLAKE(dev_priv->dev) || IS_GEN6(dev))
278 dev_priv->lvds_ssc_freq =
279 general->ssc_freq ? 100 : 120;
280 else
281 dev_priv->lvds_ssc_freq =
282 general->ssc_freq ? 100 : 96;
283 }
284 } 288 }
285} 289}
286 290
@@ -289,14 +293,6 @@ parse_general_definitions(struct drm_i915_private *dev_priv,
289 struct bdb_header *bdb) 293 struct bdb_header *bdb)
290{ 294{
291 struct bdb_general_definitions *general; 295 struct bdb_general_definitions *general;
292 const int crt_bus_map_table[] = {
293 GPIOB,
294 GPIOA,
295 GPIOC,
296 GPIOD,
297 GPIOE,
298 GPIOF,
299 };
300 296
301 general = find_section(bdb, BDB_GENERAL_DEFINITIONS); 297 general = find_section(bdb, BDB_GENERAL_DEFINITIONS);
302 if (general) { 298 if (general) {
@@ -304,10 +300,8 @@ parse_general_definitions(struct drm_i915_private *dev_priv,
304 if (block_size >= sizeof(*general)) { 300 if (block_size >= sizeof(*general)) {
305 int bus_pin = general->crt_ddc_gmbus_pin; 301 int bus_pin = general->crt_ddc_gmbus_pin;
306 DRM_DEBUG_KMS("crt_ddc_bus_pin: %d\n", bus_pin); 302 DRM_DEBUG_KMS("crt_ddc_bus_pin: %d\n", bus_pin);
307 if ((bus_pin >= 1) && (bus_pin <= 6)) { 303 if (bus_pin >= 1 && bus_pin <= 6)
308 dev_priv->crt_ddc_bus = 304 dev_priv->crt_ddc_pin = bus_pin;
309 crt_bus_map_table[bus_pin-1];
310 }
311 } else { 305 } else {
312 DRM_DEBUG_KMS("BDB_GD too small (%d). Invalid.\n", 306 DRM_DEBUG_KMS("BDB_GD too small (%d). Invalid.\n",
313 block_size); 307 block_size);
@@ -317,7 +311,7 @@ parse_general_definitions(struct drm_i915_private *dev_priv,
317 311
318static void 312static void
319parse_sdvo_device_mapping(struct drm_i915_private *dev_priv, 313parse_sdvo_device_mapping(struct drm_i915_private *dev_priv,
320 struct bdb_header *bdb) 314 struct bdb_header *bdb)
321{ 315{
322 struct sdvo_device_mapping *p_mapping; 316 struct sdvo_device_mapping *p_mapping;
323 struct bdb_general_definitions *p_defs; 317 struct bdb_general_definitions *p_defs;
@@ -327,7 +321,7 @@ parse_sdvo_device_mapping(struct drm_i915_private *dev_priv,
327 321
328 p_defs = find_section(bdb, BDB_GENERAL_DEFINITIONS); 322 p_defs = find_section(bdb, BDB_GENERAL_DEFINITIONS);
329 if (!p_defs) { 323 if (!p_defs) {
330 DRM_DEBUG_KMS("No general definition block is found\n"); 324 DRM_DEBUG_KMS("No general definition block is found, unable to construct sdvo mapping.\n");
331 return; 325 return;
332 } 326 }
333 /* judge whether the size of child device meets the requirements. 327 /* judge whether the size of child device meets the requirements.
@@ -377,7 +371,16 @@ parse_sdvo_device_mapping(struct drm_i915_private *dev_priv,
377 p_mapping->slave_addr = p_child->slave_addr; 371 p_mapping->slave_addr = p_child->slave_addr;
378 p_mapping->dvo_wiring = p_child->dvo_wiring; 372 p_mapping->dvo_wiring = p_child->dvo_wiring;
379 p_mapping->ddc_pin = p_child->ddc_pin; 373 p_mapping->ddc_pin = p_child->ddc_pin;
374 p_mapping->i2c_pin = p_child->i2c_pin;
375 p_mapping->i2c_speed = p_child->i2c_speed;
380 p_mapping->initialized = 1; 376 p_mapping->initialized = 1;
377 DRM_DEBUG_KMS("SDVO device: dvo=%x, addr=%x, wiring=%d, ddc_pin=%d, i2c_pin=%d, i2c_speed=%d\n",
378 p_mapping->dvo_port,
379 p_mapping->slave_addr,
380 p_mapping->dvo_wiring,
381 p_mapping->ddc_pin,
382 p_mapping->i2c_pin,
383 p_mapping->i2c_speed);
381 } else { 384 } else {
382 DRM_DEBUG_KMS("Maybe one SDVO port is shared by " 385 DRM_DEBUG_KMS("Maybe one SDVO port is shared by "
383 "two SDVO device.\n"); 386 "two SDVO device.\n");
@@ -409,14 +412,11 @@ parse_driver_features(struct drm_i915_private *dev_priv,
409 if (!driver) 412 if (!driver)
410 return; 413 return;
411 414
412 if (driver && SUPPORTS_EDP(dev) && 415 if (SUPPORTS_EDP(dev) &&
413 driver->lvds_config == BDB_DRIVER_FEATURE_EDP) { 416 driver->lvds_config == BDB_DRIVER_FEATURE_EDP)
414 dev_priv->edp_support = 1; 417 dev_priv->edp.support = 1;
415 } else {
416 dev_priv->edp_support = 0;
417 }
418 418
419 if (driver && driver->dual_frequency) 419 if (driver->dual_frequency)
420 dev_priv->render_reclock_avail = true; 420 dev_priv->render_reclock_avail = true;
421} 421}
422 422
@@ -424,27 +424,78 @@ static void
424parse_edp(struct drm_i915_private *dev_priv, struct bdb_header *bdb) 424parse_edp(struct drm_i915_private *dev_priv, struct bdb_header *bdb)
425{ 425{
426 struct bdb_edp *edp; 426 struct bdb_edp *edp;
427 struct edp_power_seq *edp_pps;
428 struct edp_link_params *edp_link_params;
427 429
428 edp = find_section(bdb, BDB_EDP); 430 edp = find_section(bdb, BDB_EDP);
429 if (!edp) { 431 if (!edp) {
430 if (SUPPORTS_EDP(dev_priv->dev) && dev_priv->edp_support) { 432 if (SUPPORTS_EDP(dev_priv->dev) && dev_priv->edp.support) {
431 DRM_DEBUG_KMS("No eDP BDB found but eDP panel " 433 DRM_DEBUG_KMS("No eDP BDB found but eDP panel "
432 "supported, assume 18bpp panel color " 434 "supported, assume %dbpp panel color "
433 "depth.\n"); 435 "depth.\n",
434 dev_priv->edp_bpp = 18; 436 dev_priv->edp.bpp);
435 } 437 }
436 return; 438 return;
437 } 439 }
438 440
439 switch ((edp->color_depth >> (panel_type * 2)) & 3) { 441 switch ((edp->color_depth >> (panel_type * 2)) & 3) {
440 case EDP_18BPP: 442 case EDP_18BPP:
441 dev_priv->edp_bpp = 18; 443 dev_priv->edp.bpp = 18;
442 break; 444 break;
443 case EDP_24BPP: 445 case EDP_24BPP:
444 dev_priv->edp_bpp = 24; 446 dev_priv->edp.bpp = 24;
445 break; 447 break;
446 case EDP_30BPP: 448 case EDP_30BPP:
447 dev_priv->edp_bpp = 30; 449 dev_priv->edp.bpp = 30;
450 break;
451 }
452
453 /* Get the eDP sequencing and link info */
454 edp_pps = &edp->power_seqs[panel_type];
455 edp_link_params = &edp->link_params[panel_type];
456
457 dev_priv->edp.pps = *edp_pps;
458
459 dev_priv->edp.rate = edp_link_params->rate ? DP_LINK_BW_2_7 :
460 DP_LINK_BW_1_62;
461 switch (edp_link_params->lanes) {
462 case 0:
463 dev_priv->edp.lanes = 1;
464 break;
465 case 1:
466 dev_priv->edp.lanes = 2;
467 break;
468 case 3:
469 default:
470 dev_priv->edp.lanes = 4;
471 break;
472 }
473 switch (edp_link_params->preemphasis) {
474 case 0:
475 dev_priv->edp.preemphasis = DP_TRAIN_PRE_EMPHASIS_0;
476 break;
477 case 1:
478 dev_priv->edp.preemphasis = DP_TRAIN_PRE_EMPHASIS_3_5;
479 break;
480 case 2:
481 dev_priv->edp.preemphasis = DP_TRAIN_PRE_EMPHASIS_6;
482 break;
483 case 3:
484 dev_priv->edp.preemphasis = DP_TRAIN_PRE_EMPHASIS_9_5;
485 break;
486 }
487 switch (edp_link_params->vswing) {
488 case 0:
489 dev_priv->edp.vswing = DP_TRAIN_VOLTAGE_SWING_400;
490 break;
491 case 1:
492 dev_priv->edp.vswing = DP_TRAIN_VOLTAGE_SWING_600;
493 break;
494 case 2:
495 dev_priv->edp.vswing = DP_TRAIN_VOLTAGE_SWING_800;
496 break;
497 case 3:
498 dev_priv->edp.vswing = DP_TRAIN_VOLTAGE_SWING_1200;
448 break; 499 break;
449 } 500 }
450} 501}
@@ -460,7 +511,7 @@ parse_device_mapping(struct drm_i915_private *dev_priv,
460 511
461 p_defs = find_section(bdb, BDB_GENERAL_DEFINITIONS); 512 p_defs = find_section(bdb, BDB_GENERAL_DEFINITIONS);
462 if (!p_defs) { 513 if (!p_defs) {
463 DRM_DEBUG_KMS("No general definition block is found\n"); 514 DRM_DEBUG_KMS("No general definition block is found, no devices defined.\n");
464 return; 515 return;
465 } 516 }
466 /* judge whether the size of child device meets the requirements. 517 /* judge whether the size of child device meets the requirements.
@@ -513,50 +564,89 @@ parse_device_mapping(struct drm_i915_private *dev_priv,
513 } 564 }
514 return; 565 return;
515} 566}
567
568static void
569init_vbt_defaults(struct drm_i915_private *dev_priv)
570{
571 struct drm_device *dev = dev_priv->dev;
572
573 dev_priv->crt_ddc_pin = GMBUS_PORT_VGADDC;
574
575 /* LFP panel data */
576 dev_priv->lvds_dither = 1;
577 dev_priv->lvds_vbt = 0;
578
579 /* SDVO panel data */
580 dev_priv->sdvo_lvds_vbt_mode = NULL;
581
582 /* general features */
583 dev_priv->int_tv_support = 1;
584 dev_priv->int_crt_support = 1;
585
586 /* Default to using SSC */
587 dev_priv->lvds_use_ssc = 1;
588 dev_priv->lvds_ssc_freq = intel_bios_ssc_frequency(dev, 1);
589 DRM_DEBUG("Set default to SSC at %dMHz\n", dev_priv->lvds_ssc_freq);
590
591 /* eDP data */
592 dev_priv->edp.bpp = 18;
593}
594
516/** 595/**
517 * intel_init_bios - initialize VBIOS settings & find VBT 596 * intel_parse_bios - find VBT and initialize settings from the BIOS
518 * @dev: DRM device 597 * @dev: DRM device
519 * 598 *
520 * Loads the Video BIOS and checks that the VBT exists. Sets scratch registers 599 * Loads the Video BIOS and checks that the VBT exists. Sets scratch registers
521 * to appropriate values. 600 * to appropriate values.
522 * 601 *
523 * VBT existence is a sanity check that is relied on by other i830_bios.c code.
524 * Note that it would be better to use a BIOS call to get the VBT, as BIOSes may
525 * feed an updated VBT back through that, compared to what we'll fetch using
526 * this method of groping around in the BIOS data.
527 *
528 * Returns 0 on success, nonzero on failure. 602 * Returns 0 on success, nonzero on failure.
529 */ 603 */
530bool 604bool
531intel_init_bios(struct drm_device *dev) 605intel_parse_bios(struct drm_device *dev)
532{ 606{
533 struct drm_i915_private *dev_priv = dev->dev_private; 607 struct drm_i915_private *dev_priv = dev->dev_private;
534 struct pci_dev *pdev = dev->pdev; 608 struct pci_dev *pdev = dev->pdev;
535 struct vbt_header *vbt = NULL; 609 struct bdb_header *bdb = NULL;
536 struct bdb_header *bdb; 610 u8 __iomem *bios = NULL;
537 u8 __iomem *bios; 611
538 size_t size; 612 init_vbt_defaults(dev_priv);
539 int i; 613
540 614 /* XXX Should this validation be moved to intel_opregion.c? */
541 bios = pci_map_rom(pdev, &size); 615 if (dev_priv->opregion.vbt) {
542 if (!bios) 616 struct vbt_header *vbt = dev_priv->opregion.vbt;
543 return -1; 617 if (memcmp(vbt->signature, "$VBT", 4) == 0) {
544 618 DRM_DEBUG_DRIVER("Using VBT from OpRegion: %20s\n",
545 /* Scour memory looking for the VBT signature */ 619 vbt->signature);
546 for (i = 0; i + 4 < size; i++) { 620 bdb = (struct bdb_header *)((char *)vbt + vbt->bdb_offset);
547 if (!memcmp(bios + i, "$VBT", 4)) { 621 } else
548 vbt = (struct vbt_header *)(bios + i); 622 dev_priv->opregion.vbt = NULL;
549 break;
550 }
551 } 623 }
552 624
553 if (!vbt) { 625 if (bdb == NULL) {
554 DRM_ERROR("VBT signature missing\n"); 626 struct vbt_header *vbt = NULL;
555 pci_unmap_rom(pdev, bios); 627 size_t size;
556 return -1; 628 int i;
557 } 629
630 bios = pci_map_rom(pdev, &size);
631 if (!bios)
632 return -1;
633
634 /* Scour memory looking for the VBT signature */
635 for (i = 0; i + 4 < size; i++) {
636 if (!memcmp(bios + i, "$VBT", 4)) {
637 vbt = (struct vbt_header *)(bios + i);
638 break;
639 }
640 }
558 641
559 bdb = (struct bdb_header *)(bios + i + vbt->bdb_offset); 642 if (!vbt) {
643 DRM_ERROR("VBT signature missing\n");
644 pci_unmap_rom(pdev, bios);
645 return -1;
646 }
647
648 bdb = (struct bdb_header *)(bios + i + vbt->bdb_offset);
649 }
560 650
561 /* Grab useful general definitions */ 651 /* Grab useful general definitions */
562 parse_general_features(dev_priv, bdb); 652 parse_general_features(dev_priv, bdb);
@@ -568,7 +658,25 @@ intel_init_bios(struct drm_device *dev)
568 parse_driver_features(dev_priv, bdb); 658 parse_driver_features(dev_priv, bdb);
569 parse_edp(dev_priv, bdb); 659 parse_edp(dev_priv, bdb);
570 660
571 pci_unmap_rom(pdev, bios); 661 if (bios)
662 pci_unmap_rom(pdev, bios);
572 663
573 return 0; 664 return 0;
574} 665}
666
667/* Ensure that vital registers have been initialised, even if the BIOS
668 * is absent or just failing to do its job.
669 */
670void intel_setup_bios(struct drm_device *dev)
671{
672 struct drm_i915_private *dev_priv = dev->dev_private;
673
674 /* Set the Panel Power On/Off timings if uninitialized. */
675 if ((I915_READ(PP_ON_DELAYS) == 0) && (I915_READ(PP_OFF_DELAYS) == 0)) {
676 /* Set T2 to 40ms and T5 to 200ms */
677 I915_WRITE(PP_ON_DELAYS, 0x019007d0);
678
679 /* Set T3 to 35ms and Tx to 200ms */
680 I915_WRITE(PP_OFF_DELAYS, 0x015e07d0);
681 }
682}
diff --git a/drivers/gpu/drm/i915/intel_bios.h b/drivers/gpu/drm/i915/intel_bios.h
index 4c18514f6f80..5f8e4edcbbb9 100644
--- a/drivers/gpu/drm/i915/intel_bios.h
+++ b/drivers/gpu/drm/i915/intel_bios.h
@@ -197,7 +197,8 @@ struct bdb_general_features {
197struct child_device_config { 197struct child_device_config {
198 u16 handle; 198 u16 handle;
199 u16 device_type; 199 u16 device_type;
200 u8 device_id[10]; /* See DEVICE_TYPE_* above */ 200 u8 i2c_speed;
201 u8 rsvd[9];
201 u16 addin_offset; 202 u16 addin_offset;
202 u8 dvo_port; /* See Device_PORT_* above */ 203 u8 dvo_port; /* See Device_PORT_* above */
203 u8 i2c_pin; 204 u8 i2c_pin;
@@ -466,7 +467,8 @@ struct bdb_edp {
466 struct edp_link_params link_params[16]; 467 struct edp_link_params link_params[16];
467} __attribute__ ((packed)); 468} __attribute__ ((packed));
468 469
469bool intel_init_bios(struct drm_device *dev); 470void intel_setup_bios(struct drm_device *dev);
471bool intel_parse_bios(struct drm_device *dev);
470 472
471/* 473/*
472 * Driver<->VBIOS interaction occurs through scratch bits in 474 * Driver<->VBIOS interaction occurs through scratch bits in
diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c
index 197d4f32585a..0979d8877880 100644
--- a/drivers/gpu/drm/i915/intel_crt.c
+++ b/drivers/gpu/drm/i915/intel_crt.c
@@ -30,10 +30,30 @@
30#include "drm.h" 30#include "drm.h"
31#include "drm_crtc.h" 31#include "drm_crtc.h"
32#include "drm_crtc_helper.h" 32#include "drm_crtc_helper.h"
33#include "drm_edid.h"
33#include "intel_drv.h" 34#include "intel_drv.h"
34#include "i915_drm.h" 35#include "i915_drm.h"
35#include "i915_drv.h" 36#include "i915_drv.h"
36 37
38/* Here's the desired hotplug mode */
39#define ADPA_HOTPLUG_BITS (ADPA_CRT_HOTPLUG_PERIOD_128 | \
40 ADPA_CRT_HOTPLUG_WARMUP_10MS | \
41 ADPA_CRT_HOTPLUG_SAMPLE_4S | \
42 ADPA_CRT_HOTPLUG_VOLTAGE_50 | \
43 ADPA_CRT_HOTPLUG_VOLREF_325MV | \
44 ADPA_CRT_HOTPLUG_ENABLE)
45
46struct intel_crt {
47 struct intel_encoder base;
48 bool force_hotplug_required;
49};
50
51static struct intel_crt *intel_attached_crt(struct drm_connector *connector)
52{
53 return container_of(intel_attached_encoder(connector),
54 struct intel_crt, base);
55}
56
37static void intel_crt_dpms(struct drm_encoder *encoder, int mode) 57static void intel_crt_dpms(struct drm_encoder *encoder, int mode)
38{ 58{
39 struct drm_device *dev = encoder->dev; 59 struct drm_device *dev = encoder->dev;
@@ -79,7 +99,7 @@ static int intel_crt_mode_valid(struct drm_connector *connector,
79 if (mode->clock < 25000) 99 if (mode->clock < 25000)
80 return MODE_CLOCK_LOW; 100 return MODE_CLOCK_LOW;
81 101
82 if (!IS_I9XX(dev)) 102 if (IS_GEN2(dev))
83 max_clock = 350000; 103 max_clock = 350000;
84 else 104 else
85 max_clock = 400000; 105 max_clock = 400000;
@@ -109,10 +129,7 @@ static void intel_crt_mode_set(struct drm_encoder *encoder,
109 u32 adpa, dpll_md; 129 u32 adpa, dpll_md;
110 u32 adpa_reg; 130 u32 adpa_reg;
111 131
112 if (intel_crtc->pipe == 0) 132 dpll_md_reg = DPLL_MD(intel_crtc->pipe);
113 dpll_md_reg = DPLL_A_MD;
114 else
115 dpll_md_reg = DPLL_B_MD;
116 133
117 if (HAS_PCH_SPLIT(dev)) 134 if (HAS_PCH_SPLIT(dev))
118 adpa_reg = PCH_ADPA; 135 adpa_reg = PCH_ADPA;
@@ -123,13 +140,13 @@ static void intel_crt_mode_set(struct drm_encoder *encoder,
123 * Disable separate mode multiplier used when cloning SDVO to CRT 140 * Disable separate mode multiplier used when cloning SDVO to CRT
124 * XXX this needs to be adjusted when we really are cloning 141 * XXX this needs to be adjusted when we really are cloning
125 */ 142 */
126 if (IS_I965G(dev) && !HAS_PCH_SPLIT(dev)) { 143 if (INTEL_INFO(dev)->gen >= 4 && !HAS_PCH_SPLIT(dev)) {
127 dpll_md = I915_READ(dpll_md_reg); 144 dpll_md = I915_READ(dpll_md_reg);
128 I915_WRITE(dpll_md_reg, 145 I915_WRITE(dpll_md_reg,
129 dpll_md & ~DPLL_MD_UDI_MULTIPLIER_MASK); 146 dpll_md & ~DPLL_MD_UDI_MULTIPLIER_MASK);
130 } 147 }
131 148
132 adpa = 0; 149 adpa = ADPA_HOTPLUG_BITS;
133 if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC) 150 if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC)
134 adpa |= ADPA_HSYNC_ACTIVE_HIGH; 151 adpa |= ADPA_HSYNC_ACTIVE_HIGH;
135 if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC) 152 if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC)
@@ -140,69 +157,60 @@ static void intel_crt_mode_set(struct drm_encoder *encoder,
140 adpa |= PORT_TRANS_A_SEL_CPT; 157 adpa |= PORT_TRANS_A_SEL_CPT;
141 else 158 else
142 adpa |= ADPA_PIPE_A_SELECT; 159 adpa |= ADPA_PIPE_A_SELECT;
143 if (!HAS_PCH_SPLIT(dev))
144 I915_WRITE(BCLRPAT_A, 0);
145 } else { 160 } else {
146 if (HAS_PCH_CPT(dev)) 161 if (HAS_PCH_CPT(dev))
147 adpa |= PORT_TRANS_B_SEL_CPT; 162 adpa |= PORT_TRANS_B_SEL_CPT;
148 else 163 else
149 adpa |= ADPA_PIPE_B_SELECT; 164 adpa |= ADPA_PIPE_B_SELECT;
150 if (!HAS_PCH_SPLIT(dev))
151 I915_WRITE(BCLRPAT_B, 0);
152 } 165 }
153 166
167 if (!HAS_PCH_SPLIT(dev))
168 I915_WRITE(BCLRPAT(intel_crtc->pipe), 0);
169
154 I915_WRITE(adpa_reg, adpa); 170 I915_WRITE(adpa_reg, adpa);
155} 171}
156 172
157static bool intel_ironlake_crt_detect_hotplug(struct drm_connector *connector) 173static bool intel_ironlake_crt_detect_hotplug(struct drm_connector *connector)
158{ 174{
159 struct drm_device *dev = connector->dev; 175 struct drm_device *dev = connector->dev;
176 struct intel_crt *crt = intel_attached_crt(connector);
160 struct drm_i915_private *dev_priv = dev->dev_private; 177 struct drm_i915_private *dev_priv = dev->dev_private;
161 u32 adpa, temp; 178 u32 adpa;
162 bool ret; 179 bool ret;
163 bool turn_off_dac = false;
164 180
165 temp = adpa = I915_READ(PCH_ADPA); 181 /* The first time through, trigger an explicit detection cycle */
182 if (crt->force_hotplug_required) {
183 bool turn_off_dac = HAS_PCH_SPLIT(dev);
184 u32 save_adpa;
166 185
167 if (HAS_PCH_SPLIT(dev)) 186 crt->force_hotplug_required = 0;
168 turn_off_dac = true; 187
169 188 save_adpa = adpa = I915_READ(PCH_ADPA);
170 adpa &= ~ADPA_CRT_HOTPLUG_MASK; 189 DRM_DEBUG_KMS("trigger hotplug detect cycle: adpa=0x%x\n", adpa);
171 if (turn_off_dac) 190
172 adpa &= ~ADPA_DAC_ENABLE; 191 adpa |= ADPA_CRT_HOTPLUG_FORCE_TRIGGER;
173 192 if (turn_off_dac)
174 /* disable HPD first */ 193 adpa &= ~ADPA_DAC_ENABLE;
175 I915_WRITE(PCH_ADPA, adpa); 194
176 (void)I915_READ(PCH_ADPA); 195 I915_WRITE(PCH_ADPA, adpa);
177 196
178 adpa |= (ADPA_CRT_HOTPLUG_PERIOD_128 | 197 if (wait_for((I915_READ(PCH_ADPA) & ADPA_CRT_HOTPLUG_FORCE_TRIGGER) == 0,
179 ADPA_CRT_HOTPLUG_WARMUP_10MS | 198 1000))
180 ADPA_CRT_HOTPLUG_SAMPLE_4S | 199 DRM_DEBUG_KMS("timed out waiting for FORCE_TRIGGER");
181 ADPA_CRT_HOTPLUG_VOLTAGE_50 | /* default */ 200
182 ADPA_CRT_HOTPLUG_VOLREF_325MV | 201 if (turn_off_dac) {
183 ADPA_CRT_HOTPLUG_ENABLE | 202 I915_WRITE(PCH_ADPA, save_adpa);
184 ADPA_CRT_HOTPLUG_FORCE_TRIGGER); 203 POSTING_READ(PCH_ADPA);
185 204 }
186 DRM_DEBUG_KMS("pch crt adpa 0x%x", adpa);
187 I915_WRITE(PCH_ADPA, adpa);
188
189 if (wait_for((I915_READ(PCH_ADPA) & ADPA_CRT_HOTPLUG_FORCE_TRIGGER) == 0,
190 1000, 1))
191 DRM_DEBUG_KMS("timed out waiting for FORCE_TRIGGER");
192
193 if (turn_off_dac) {
194 I915_WRITE(PCH_ADPA, temp);
195 (void)I915_READ(PCH_ADPA);
196 } 205 }
197 206
198 /* Check the status to see if both blue and green are on now */ 207 /* Check the status to see if both blue and green are on now */
199 adpa = I915_READ(PCH_ADPA); 208 adpa = I915_READ(PCH_ADPA);
200 adpa &= ADPA_CRT_HOTPLUG_MONITOR_MASK; 209 if ((adpa & ADPA_CRT_HOTPLUG_MONITOR_MASK) != 0)
201 if ((adpa == ADPA_CRT_HOTPLUG_MONITOR_COLOR) ||
202 (adpa == ADPA_CRT_HOTPLUG_MONITOR_MONO))
203 ret = true; 210 ret = true;
204 else 211 else
205 ret = false; 212 ret = false;
213 DRM_DEBUG_KMS("ironlake hotplug adpa=0x%x, result %d\n", adpa, ret);
206 214
207 return ret; 215 return ret;
208} 216}
@@ -244,7 +252,7 @@ static bool intel_crt_detect_hotplug(struct drm_connector *connector)
244 /* wait for FORCE_DETECT to go off */ 252 /* wait for FORCE_DETECT to go off */
245 if (wait_for((I915_READ(PORT_HOTPLUG_EN) & 253 if (wait_for((I915_READ(PORT_HOTPLUG_EN) &
246 CRT_HOTPLUG_FORCE_DETECT) == 0, 254 CRT_HOTPLUG_FORCE_DETECT) == 0,
247 1000, 1)) 255 1000))
248 DRM_DEBUG_KMS("timed out waiting for FORCE_DETECT to go off"); 256 DRM_DEBUG_KMS("timed out waiting for FORCE_DETECT to go off");
249 } 257 }
250 258
@@ -261,25 +269,51 @@ static bool intel_crt_detect_hotplug(struct drm_connector *connector)
261 return ret; 269 return ret;
262} 270}
263 271
264static bool intel_crt_detect_ddc(struct drm_encoder *encoder) 272static bool intel_crt_detect_ddc(struct drm_connector *connector)
265{ 273{
266 struct intel_encoder *intel_encoder = enc_to_intel_encoder(encoder); 274 struct intel_crt *crt = intel_attached_crt(connector);
275 struct drm_i915_private *dev_priv = crt->base.base.dev->dev_private;
267 276
268 /* CRT should always be at 0, but check anyway */ 277 /* CRT should always be at 0, but check anyway */
269 if (intel_encoder->type != INTEL_OUTPUT_ANALOG) 278 if (crt->base.type != INTEL_OUTPUT_ANALOG)
270 return false; 279 return false;
271 280
272 return intel_ddc_probe(intel_encoder); 281 if (intel_ddc_probe(&crt->base, dev_priv->crt_ddc_pin)) {
282 struct edid *edid;
283 bool is_digital = false;
284
285 edid = drm_get_edid(connector,
286 &dev_priv->gmbus[dev_priv->crt_ddc_pin].adapter);
287 /*
288 * This may be a DVI-I connector with a shared DDC
289 * link between analog and digital outputs, so we
290 * have to check the EDID input spec of the attached device.
291 *
292 * On the other hand, what should we do if it is a broken EDID?
293 */
294 if (edid != NULL) {
295 is_digital = edid->input & DRM_EDID_INPUT_DIGITAL;
296 connector->display_info.raw_edid = NULL;
297 kfree(edid);
298 }
299
300 if (!is_digital) {
301 DRM_DEBUG_KMS("CRT detected via DDC:0x50 [EDID]\n");
302 return true;
303 } else {
304 DRM_DEBUG_KMS("CRT not detected via DDC:0x50 [EDID reports a digital panel]\n");
305 }
306 }
307
308 return false;
273} 309}
274 310
275static enum drm_connector_status 311static enum drm_connector_status
276intel_crt_load_detect(struct drm_crtc *crtc, struct intel_encoder *intel_encoder) 312intel_crt_load_detect(struct intel_crt *crt)
277{ 313{
278 struct drm_encoder *encoder = &intel_encoder->enc; 314 struct drm_device *dev = crt->base.base.dev;
279 struct drm_device *dev = encoder->dev;
280 struct drm_i915_private *dev_priv = dev->dev_private; 315 struct drm_i915_private *dev_priv = dev->dev_private;
281 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 316 uint32_t pipe = to_intel_crtc(crt->base.base.crtc)->pipe;
282 uint32_t pipe = intel_crtc->pipe;
283 uint32_t save_bclrpat; 317 uint32_t save_bclrpat;
284 uint32_t save_vtotal; 318 uint32_t save_vtotal;
285 uint32_t vtotal, vactive; 319 uint32_t vtotal, vactive;
@@ -295,21 +329,14 @@ intel_crt_load_detect(struct drm_crtc *crtc, struct intel_encoder *intel_encoder
295 uint8_t st00; 329 uint8_t st00;
296 enum drm_connector_status status; 330 enum drm_connector_status status;
297 331
298 if (pipe == 0) { 332 DRM_DEBUG_KMS("starting load-detect on CRT\n");
299 bclrpat_reg = BCLRPAT_A; 333
300 vtotal_reg = VTOTAL_A; 334 bclrpat_reg = BCLRPAT(pipe);
301 vblank_reg = VBLANK_A; 335 vtotal_reg = VTOTAL(pipe);
302 vsync_reg = VSYNC_A; 336 vblank_reg = VBLANK(pipe);
303 pipeconf_reg = PIPEACONF; 337 vsync_reg = VSYNC(pipe);
304 pipe_dsl_reg = PIPEADSL; 338 pipeconf_reg = PIPECONF(pipe);
305 } else { 339 pipe_dsl_reg = PIPEDSL(pipe);
306 bclrpat_reg = BCLRPAT_B;
307 vtotal_reg = VTOTAL_B;
308 vblank_reg = VBLANK_B;
309 vsync_reg = VSYNC_B;
310 pipeconf_reg = PIPEBCONF;
311 pipe_dsl_reg = PIPEBDSL;
312 }
313 340
314 save_bclrpat = I915_READ(bclrpat_reg); 341 save_bclrpat = I915_READ(bclrpat_reg);
315 save_vtotal = I915_READ(vtotal_reg); 342 save_vtotal = I915_READ(vtotal_reg);
@@ -324,9 +351,10 @@ intel_crt_load_detect(struct drm_crtc *crtc, struct intel_encoder *intel_encoder
324 /* Set the border color to purple. */ 351 /* Set the border color to purple. */
325 I915_WRITE(bclrpat_reg, 0x500050); 352 I915_WRITE(bclrpat_reg, 0x500050);
326 353
327 if (IS_I9XX(dev)) { 354 if (!IS_GEN2(dev)) {
328 uint32_t pipeconf = I915_READ(pipeconf_reg); 355 uint32_t pipeconf = I915_READ(pipeconf_reg);
329 I915_WRITE(pipeconf_reg, pipeconf | PIPECONF_FORCE_BORDER); 356 I915_WRITE(pipeconf_reg, pipeconf | PIPECONF_FORCE_BORDER);
357 POSTING_READ(pipeconf_reg);
330 /* Wait for next Vblank to substitue 358 /* Wait for next Vblank to substitue
331 * border color for Color info */ 359 * border color for Color info */
332 intel_wait_for_vblank(dev, pipe); 360 intel_wait_for_vblank(dev, pipe);
@@ -404,35 +432,41 @@ static enum drm_connector_status
404intel_crt_detect(struct drm_connector *connector, bool force) 432intel_crt_detect(struct drm_connector *connector, bool force)
405{ 433{
406 struct drm_device *dev = connector->dev; 434 struct drm_device *dev = connector->dev;
407 struct drm_encoder *encoder = intel_attached_encoder(connector); 435 struct intel_crt *crt = intel_attached_crt(connector);
408 struct intel_encoder *intel_encoder = enc_to_intel_encoder(encoder);
409 struct drm_crtc *crtc; 436 struct drm_crtc *crtc;
410 int dpms_mode;
411 enum drm_connector_status status; 437 enum drm_connector_status status;
412 438
413 if (IS_I9XX(dev) && !IS_I915G(dev) && !IS_I915GM(dev)) { 439 if (I915_HAS_HOTPLUG(dev)) {
414 if (intel_crt_detect_hotplug(connector)) 440 if (intel_crt_detect_hotplug(connector)) {
441 DRM_DEBUG_KMS("CRT detected via hotplug\n");
415 return connector_status_connected; 442 return connector_status_connected;
416 else 443 } else {
444 DRM_DEBUG_KMS("CRT not detected via hotplug\n");
417 return connector_status_disconnected; 445 return connector_status_disconnected;
446 }
418 } 447 }
419 448
420 if (intel_crt_detect_ddc(encoder)) 449 if (intel_crt_detect_ddc(connector))
421 return connector_status_connected; 450 return connector_status_connected;
422 451
423 if (!force) 452 if (!force)
424 return connector->status; 453 return connector->status;
425 454
426 /* for pre-945g platforms use load detect */ 455 /* for pre-945g platforms use load detect */
427 if (encoder->crtc && encoder->crtc->enabled) { 456 crtc = crt->base.base.crtc;
428 status = intel_crt_load_detect(encoder->crtc, intel_encoder); 457 if (crtc && crtc->enabled) {
458 status = intel_crt_load_detect(crt);
429 } else { 459 } else {
430 crtc = intel_get_load_detect_pipe(intel_encoder, connector, 460 struct intel_load_detect_pipe tmp;
431 NULL, &dpms_mode); 461
432 if (crtc) { 462 if (intel_get_load_detect_pipe(&crt->base, connector, NULL,
433 status = intel_crt_load_detect(crtc, intel_encoder); 463 &tmp)) {
434 intel_release_load_detect_pipe(intel_encoder, 464 if (intel_crt_detect_ddc(connector))
435 connector, dpms_mode); 465 status = connector_status_connected;
466 else
467 status = intel_crt_load_detect(crt);
468 intel_release_load_detect_pipe(&crt->base, connector,
469 &tmp);
436 } else 470 } else
437 status = connector_status_unknown; 471 status = connector_status_unknown;
438 } 472 }
@@ -449,32 +483,18 @@ static void intel_crt_destroy(struct drm_connector *connector)
449 483
450static int intel_crt_get_modes(struct drm_connector *connector) 484static int intel_crt_get_modes(struct drm_connector *connector)
451{ 485{
452 int ret;
453 struct drm_encoder *encoder = intel_attached_encoder(connector);
454 struct intel_encoder *intel_encoder = enc_to_intel_encoder(encoder);
455 struct i2c_adapter *ddc_bus;
456 struct drm_device *dev = connector->dev; 486 struct drm_device *dev = connector->dev;
487 struct drm_i915_private *dev_priv = dev->dev_private;
488 int ret;
457 489
458 490 ret = intel_ddc_get_modes(connector,
459 ret = intel_ddc_get_modes(connector, intel_encoder->ddc_bus); 491 &dev_priv->gmbus[dev_priv->crt_ddc_pin].adapter);
460 if (ret || !IS_G4X(dev)) 492 if (ret || !IS_G4X(dev))
461 goto end; 493 return ret;
462 494
463 /* Try to probe digital port for output in DVI-I -> VGA mode. */ 495 /* Try to probe digital port for output in DVI-I -> VGA mode. */
464 ddc_bus = intel_i2c_create(connector->dev, GPIOD, "CRTDDC_D"); 496 return intel_ddc_get_modes(connector,
465 497 &dev_priv->gmbus[GMBUS_PORT_DPB].adapter);
466 if (!ddc_bus) {
467 dev_printk(KERN_ERR, &connector->dev->pdev->dev,
468 "DDC bus registration failed for CRTDDC_D.\n");
469 goto end;
470 }
471 /* Try to get modes by GPIOD port */
472 ret = intel_ddc_get_modes(connector, ddc_bus);
473 intel_i2c_destroy(ddc_bus);
474
475end:
476 return ret;
477
478} 498}
479 499
480static int intel_crt_set_property(struct drm_connector *connector, 500static int intel_crt_set_property(struct drm_connector *connector,
@@ -484,6 +504,15 @@ static int intel_crt_set_property(struct drm_connector *connector,
484 return 0; 504 return 0;
485} 505}
486 506
507static void intel_crt_reset(struct drm_connector *connector)
508{
509 struct drm_device *dev = connector->dev;
510 struct intel_crt *crt = intel_attached_crt(connector);
511
512 if (HAS_PCH_SPLIT(dev))
513 crt->force_hotplug_required = 1;
514}
515
487/* 516/*
488 * Routines for controlling stuff on the analog port 517 * Routines for controlling stuff on the analog port
489 */ 518 */
@@ -497,6 +526,7 @@ static const struct drm_encoder_helper_funcs intel_crt_helper_funcs = {
497}; 526};
498 527
499static const struct drm_connector_funcs intel_crt_connector_funcs = { 528static const struct drm_connector_funcs intel_crt_connector_funcs = {
529 .reset = intel_crt_reset,
500 .dpms = drm_helper_connector_dpms, 530 .dpms = drm_helper_connector_dpms,
501 .detect = intel_crt_detect, 531 .detect = intel_crt_detect,
502 .fill_modes = drm_helper_probe_single_connector_modes, 532 .fill_modes = drm_helper_probe_single_connector_modes,
@@ -507,7 +537,7 @@ static const struct drm_connector_funcs intel_crt_connector_funcs = {
507static const struct drm_connector_helper_funcs intel_crt_connector_helper_funcs = { 537static const struct drm_connector_helper_funcs intel_crt_connector_helper_funcs = {
508 .mode_valid = intel_crt_mode_valid, 538 .mode_valid = intel_crt_mode_valid,
509 .get_modes = intel_crt_get_modes, 539 .get_modes = intel_crt_get_modes,
510 .best_encoder = intel_attached_encoder, 540 .best_encoder = intel_best_encoder,
511}; 541};
512 542
513static const struct drm_encoder_funcs intel_crt_enc_funcs = { 543static const struct drm_encoder_funcs intel_crt_enc_funcs = {
@@ -517,18 +547,17 @@ static const struct drm_encoder_funcs intel_crt_enc_funcs = {
517void intel_crt_init(struct drm_device *dev) 547void intel_crt_init(struct drm_device *dev)
518{ 548{
519 struct drm_connector *connector; 549 struct drm_connector *connector;
520 struct intel_encoder *intel_encoder; 550 struct intel_crt *crt;
521 struct intel_connector *intel_connector; 551 struct intel_connector *intel_connector;
522 struct drm_i915_private *dev_priv = dev->dev_private; 552 struct drm_i915_private *dev_priv = dev->dev_private;
523 u32 i2c_reg;
524 553
525 intel_encoder = kzalloc(sizeof(struct intel_encoder), GFP_KERNEL); 554 crt = kzalloc(sizeof(struct intel_crt), GFP_KERNEL);
526 if (!intel_encoder) 555 if (!crt)
527 return; 556 return;
528 557
529 intel_connector = kzalloc(sizeof(struct intel_connector), GFP_KERNEL); 558 intel_connector = kzalloc(sizeof(struct intel_connector), GFP_KERNEL);
530 if (!intel_connector) { 559 if (!intel_connector) {
531 kfree(intel_encoder); 560 kfree(crt);
532 return; 561 return;
533 } 562 }
534 563
@@ -536,37 +565,20 @@ void intel_crt_init(struct drm_device *dev)
536 drm_connector_init(dev, &intel_connector->base, 565 drm_connector_init(dev, &intel_connector->base,
537 &intel_crt_connector_funcs, DRM_MODE_CONNECTOR_VGA); 566 &intel_crt_connector_funcs, DRM_MODE_CONNECTOR_VGA);
538 567
539 drm_encoder_init(dev, &intel_encoder->enc, &intel_crt_enc_funcs, 568 drm_encoder_init(dev, &crt->base.base, &intel_crt_enc_funcs,
540 DRM_MODE_ENCODER_DAC); 569 DRM_MODE_ENCODER_DAC);
541 570
542 drm_mode_connector_attach_encoder(&intel_connector->base, 571 intel_connector_attach_encoder(intel_connector, &crt->base);
543 &intel_encoder->enc);
544 572
545 /* Set up the DDC bus. */ 573 crt->base.type = INTEL_OUTPUT_ANALOG;
546 if (HAS_PCH_SPLIT(dev)) 574 crt->base.clone_mask = (1 << INTEL_SDVO_NON_TV_CLONE_BIT |
547 i2c_reg = PCH_GPIOA; 575 1 << INTEL_ANALOG_CLONE_BIT |
548 else { 576 1 << INTEL_SDVO_LVDS_CLONE_BIT);
549 i2c_reg = GPIOA; 577 crt->base.crtc_mask = (1 << 0) | (1 << 1);
550 /* Use VBT information for CRT DDC if available */
551 if (dev_priv->crt_ddc_bus != 0)
552 i2c_reg = dev_priv->crt_ddc_bus;
553 }
554 intel_encoder->ddc_bus = intel_i2c_create(dev, i2c_reg, "CRTDDC_A");
555 if (!intel_encoder->ddc_bus) {
556 dev_printk(KERN_ERR, &dev->pdev->dev, "DDC bus registration "
557 "failed.\n");
558 return;
559 }
560
561 intel_encoder->type = INTEL_OUTPUT_ANALOG;
562 intel_encoder->clone_mask = (1 << INTEL_SDVO_NON_TV_CLONE_BIT) |
563 (1 << INTEL_ANALOG_CLONE_BIT) |
564 (1 << INTEL_SDVO_LVDS_CLONE_BIT);
565 intel_encoder->crtc_mask = (1 << 0) | (1 << 1);
566 connector->interlace_allowed = 1; 578 connector->interlace_allowed = 1;
567 connector->doublescan_allowed = 0; 579 connector->doublescan_allowed = 0;
568 580
569 drm_encoder_helper_add(&intel_encoder->enc, &intel_crt_helper_funcs); 581 drm_encoder_helper_add(&crt->base.base, &intel_crt_helper_funcs);
570 drm_connector_helper_add(connector, &intel_crt_connector_helper_funcs); 582 drm_connector_helper_add(connector, &intel_crt_connector_helper_funcs);
571 583
572 drm_sysfs_connector_add(connector); 584 drm_sysfs_connector_add(connector);
@@ -576,5 +588,22 @@ void intel_crt_init(struct drm_device *dev)
576 else 588 else
577 connector->polled = DRM_CONNECTOR_POLL_CONNECT; 589 connector->polled = DRM_CONNECTOR_POLL_CONNECT;
578 590
591 /*
592 * Configure the automatic hotplug detection stuff
593 */
594 crt->force_hotplug_required = 0;
595 if (HAS_PCH_SPLIT(dev)) {
596 u32 adpa;
597
598 adpa = I915_READ(PCH_ADPA);
599 adpa &= ~ADPA_CRT_HOTPLUG_MASK;
600 adpa |= ADPA_HOTPLUG_BITS;
601 I915_WRITE(PCH_ADPA, adpa);
602 POSTING_READ(PCH_ADPA);
603
604 DRM_DEBUG_KMS("pch crt adpa set to 0x%x\n", adpa);
605 crt->force_hotplug_required = 1;
606 }
607
579 dev_priv->hotplug_supported_mask |= CRT_HOTPLUG_INT_STATUS; 608 dev_priv->hotplug_supported_mask |= CRT_HOTPLUG_INT_STATUS;
580} 609}
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 979228594599..0f1c799afea1 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -43,8 +43,8 @@
43 43
44bool intel_pipe_has_type (struct drm_crtc *crtc, int type); 44bool intel_pipe_has_type (struct drm_crtc *crtc, int type);
45static void intel_update_watermarks(struct drm_device *dev); 45static void intel_update_watermarks(struct drm_device *dev);
46static void intel_increase_pllclock(struct drm_crtc *crtc, bool schedule); 46static void intel_increase_pllclock(struct drm_crtc *crtc);
47static void intel_crtc_update_cursor(struct drm_crtc *crtc); 47static void intel_crtc_update_cursor(struct drm_crtc *crtc, bool on);
48 48
49typedef struct { 49typedef struct {
50 /* given values */ 50 /* given values */
@@ -76,255 +76,6 @@ struct intel_limit {
76 int, int, intel_clock_t *); 76 int, int, intel_clock_t *);
77}; 77};
78 78
79#define I8XX_DOT_MIN 25000
80#define I8XX_DOT_MAX 350000
81#define I8XX_VCO_MIN 930000
82#define I8XX_VCO_MAX 1400000
83#define I8XX_N_MIN 3
84#define I8XX_N_MAX 16
85#define I8XX_M_MIN 96
86#define I8XX_M_MAX 140
87#define I8XX_M1_MIN 18
88#define I8XX_M1_MAX 26
89#define I8XX_M2_MIN 6
90#define I8XX_M2_MAX 16
91#define I8XX_P_MIN 4
92#define I8XX_P_MAX 128
93#define I8XX_P1_MIN 2
94#define I8XX_P1_MAX 33
95#define I8XX_P1_LVDS_MIN 1
96#define I8XX_P1_LVDS_MAX 6
97#define I8XX_P2_SLOW 4
98#define I8XX_P2_FAST 2
99#define I8XX_P2_LVDS_SLOW 14
100#define I8XX_P2_LVDS_FAST 7
101#define I8XX_P2_SLOW_LIMIT 165000
102
103#define I9XX_DOT_MIN 20000
104#define I9XX_DOT_MAX 400000
105#define I9XX_VCO_MIN 1400000
106#define I9XX_VCO_MAX 2800000
107#define PINEVIEW_VCO_MIN 1700000
108#define PINEVIEW_VCO_MAX 3500000
109#define I9XX_N_MIN 1
110#define I9XX_N_MAX 6
111/* Pineview's Ncounter is a ring counter */
112#define PINEVIEW_N_MIN 3
113#define PINEVIEW_N_MAX 6
114#define I9XX_M_MIN 70
115#define I9XX_M_MAX 120
116#define PINEVIEW_M_MIN 2
117#define PINEVIEW_M_MAX 256
118#define I9XX_M1_MIN 10
119#define I9XX_M1_MAX 22
120#define I9XX_M2_MIN 5
121#define I9XX_M2_MAX 9
122/* Pineview M1 is reserved, and must be 0 */
123#define PINEVIEW_M1_MIN 0
124#define PINEVIEW_M1_MAX 0
125#define PINEVIEW_M2_MIN 0
126#define PINEVIEW_M2_MAX 254
127#define I9XX_P_SDVO_DAC_MIN 5
128#define I9XX_P_SDVO_DAC_MAX 80
129#define I9XX_P_LVDS_MIN 7
130#define I9XX_P_LVDS_MAX 98
131#define PINEVIEW_P_LVDS_MIN 7
132#define PINEVIEW_P_LVDS_MAX 112
133#define I9XX_P1_MIN 1
134#define I9XX_P1_MAX 8
135#define I9XX_P2_SDVO_DAC_SLOW 10
136#define I9XX_P2_SDVO_DAC_FAST 5
137#define I9XX_P2_SDVO_DAC_SLOW_LIMIT 200000
138#define I9XX_P2_LVDS_SLOW 14
139#define I9XX_P2_LVDS_FAST 7
140#define I9XX_P2_LVDS_SLOW_LIMIT 112000
141
142/*The parameter is for SDVO on G4x platform*/
143#define G4X_DOT_SDVO_MIN 25000
144#define G4X_DOT_SDVO_MAX 270000
145#define G4X_VCO_MIN 1750000
146#define G4X_VCO_MAX 3500000
147#define G4X_N_SDVO_MIN 1
148#define G4X_N_SDVO_MAX 4
149#define G4X_M_SDVO_MIN 104
150#define G4X_M_SDVO_MAX 138
151#define G4X_M1_SDVO_MIN 17
152#define G4X_M1_SDVO_MAX 23
153#define G4X_M2_SDVO_MIN 5
154#define G4X_M2_SDVO_MAX 11
155#define G4X_P_SDVO_MIN 10
156#define G4X_P_SDVO_MAX 30
157#define G4X_P1_SDVO_MIN 1
158#define G4X_P1_SDVO_MAX 3
159#define G4X_P2_SDVO_SLOW 10
160#define G4X_P2_SDVO_FAST 10
161#define G4X_P2_SDVO_LIMIT 270000
162
163/*The parameter is for HDMI_DAC on G4x platform*/
164#define G4X_DOT_HDMI_DAC_MIN 22000
165#define G4X_DOT_HDMI_DAC_MAX 400000
166#define G4X_N_HDMI_DAC_MIN 1
167#define G4X_N_HDMI_DAC_MAX 4
168#define G4X_M_HDMI_DAC_MIN 104
169#define G4X_M_HDMI_DAC_MAX 138
170#define G4X_M1_HDMI_DAC_MIN 16
171#define G4X_M1_HDMI_DAC_MAX 23
172#define G4X_M2_HDMI_DAC_MIN 5
173#define G4X_M2_HDMI_DAC_MAX 11
174#define G4X_P_HDMI_DAC_MIN 5
175#define G4X_P_HDMI_DAC_MAX 80
176#define G4X_P1_HDMI_DAC_MIN 1
177#define G4X_P1_HDMI_DAC_MAX 8
178#define G4X_P2_HDMI_DAC_SLOW 10
179#define G4X_P2_HDMI_DAC_FAST 5
180#define G4X_P2_HDMI_DAC_LIMIT 165000
181
182/*The parameter is for SINGLE_CHANNEL_LVDS on G4x platform*/
183#define G4X_DOT_SINGLE_CHANNEL_LVDS_MIN 20000
184#define G4X_DOT_SINGLE_CHANNEL_LVDS_MAX 115000
185#define G4X_N_SINGLE_CHANNEL_LVDS_MIN 1
186#define G4X_N_SINGLE_CHANNEL_LVDS_MAX 3
187#define G4X_M_SINGLE_CHANNEL_LVDS_MIN 104
188#define G4X_M_SINGLE_CHANNEL_LVDS_MAX 138
189#define G4X_M1_SINGLE_CHANNEL_LVDS_MIN 17
190#define G4X_M1_SINGLE_CHANNEL_LVDS_MAX 23
191#define G4X_M2_SINGLE_CHANNEL_LVDS_MIN 5
192#define G4X_M2_SINGLE_CHANNEL_LVDS_MAX 11
193#define G4X_P_SINGLE_CHANNEL_LVDS_MIN 28
194#define G4X_P_SINGLE_CHANNEL_LVDS_MAX 112
195#define G4X_P1_SINGLE_CHANNEL_LVDS_MIN 2
196#define G4X_P1_SINGLE_CHANNEL_LVDS_MAX 8
197#define G4X_P2_SINGLE_CHANNEL_LVDS_SLOW 14
198#define G4X_P2_SINGLE_CHANNEL_LVDS_FAST 14
199#define G4X_P2_SINGLE_CHANNEL_LVDS_LIMIT 0
200
201/*The parameter is for DUAL_CHANNEL_LVDS on G4x platform*/
202#define G4X_DOT_DUAL_CHANNEL_LVDS_MIN 80000
203#define G4X_DOT_DUAL_CHANNEL_LVDS_MAX 224000
204#define G4X_N_DUAL_CHANNEL_LVDS_MIN 1
205#define G4X_N_DUAL_CHANNEL_LVDS_MAX 3
206#define G4X_M_DUAL_CHANNEL_LVDS_MIN 104
207#define G4X_M_DUAL_CHANNEL_LVDS_MAX 138
208#define G4X_M1_DUAL_CHANNEL_LVDS_MIN 17
209#define G4X_M1_DUAL_CHANNEL_LVDS_MAX 23
210#define G4X_M2_DUAL_CHANNEL_LVDS_MIN 5
211#define G4X_M2_DUAL_CHANNEL_LVDS_MAX 11
212#define G4X_P_DUAL_CHANNEL_LVDS_MIN 14
213#define G4X_P_DUAL_CHANNEL_LVDS_MAX 42
214#define G4X_P1_DUAL_CHANNEL_LVDS_MIN 2
215#define G4X_P1_DUAL_CHANNEL_LVDS_MAX 6
216#define G4X_P2_DUAL_CHANNEL_LVDS_SLOW 7
217#define G4X_P2_DUAL_CHANNEL_LVDS_FAST 7
218#define G4X_P2_DUAL_CHANNEL_LVDS_LIMIT 0
219
220/*The parameter is for DISPLAY PORT on G4x platform*/
221#define G4X_DOT_DISPLAY_PORT_MIN 161670
222#define G4X_DOT_DISPLAY_PORT_MAX 227000
223#define G4X_N_DISPLAY_PORT_MIN 1
224#define G4X_N_DISPLAY_PORT_MAX 2
225#define G4X_M_DISPLAY_PORT_MIN 97
226#define G4X_M_DISPLAY_PORT_MAX 108
227#define G4X_M1_DISPLAY_PORT_MIN 0x10
228#define G4X_M1_DISPLAY_PORT_MAX 0x12
229#define G4X_M2_DISPLAY_PORT_MIN 0x05
230#define G4X_M2_DISPLAY_PORT_MAX 0x06
231#define G4X_P_DISPLAY_PORT_MIN 10
232#define G4X_P_DISPLAY_PORT_MAX 20
233#define G4X_P1_DISPLAY_PORT_MIN 1
234#define G4X_P1_DISPLAY_PORT_MAX 2
235#define G4X_P2_DISPLAY_PORT_SLOW 10
236#define G4X_P2_DISPLAY_PORT_FAST 10
237#define G4X_P2_DISPLAY_PORT_LIMIT 0
238
239/* Ironlake / Sandybridge */
240/* as we calculate clock using (register_value + 2) for
241 N/M1/M2, so here the range value for them is (actual_value-2).
242 */
243#define IRONLAKE_DOT_MIN 25000
244#define IRONLAKE_DOT_MAX 350000
245#define IRONLAKE_VCO_MIN 1760000
246#define IRONLAKE_VCO_MAX 3510000
247#define IRONLAKE_M1_MIN 12
248#define IRONLAKE_M1_MAX 22
249#define IRONLAKE_M2_MIN 5
250#define IRONLAKE_M2_MAX 9
251#define IRONLAKE_P2_DOT_LIMIT 225000 /* 225Mhz */
252
253/* We have parameter ranges for different type of outputs. */
254
255/* DAC & HDMI Refclk 120Mhz */
256#define IRONLAKE_DAC_N_MIN 1
257#define IRONLAKE_DAC_N_MAX 5
258#define IRONLAKE_DAC_M_MIN 79
259#define IRONLAKE_DAC_M_MAX 127
260#define IRONLAKE_DAC_P_MIN 5
261#define IRONLAKE_DAC_P_MAX 80
262#define IRONLAKE_DAC_P1_MIN 1
263#define IRONLAKE_DAC_P1_MAX 8
264#define IRONLAKE_DAC_P2_SLOW 10
265#define IRONLAKE_DAC_P2_FAST 5
266
267/* LVDS single-channel 120Mhz refclk */
268#define IRONLAKE_LVDS_S_N_MIN 1
269#define IRONLAKE_LVDS_S_N_MAX 3
270#define IRONLAKE_LVDS_S_M_MIN 79
271#define IRONLAKE_LVDS_S_M_MAX 118
272#define IRONLAKE_LVDS_S_P_MIN 28
273#define IRONLAKE_LVDS_S_P_MAX 112
274#define IRONLAKE_LVDS_S_P1_MIN 2
275#define IRONLAKE_LVDS_S_P1_MAX 8
276#define IRONLAKE_LVDS_S_P2_SLOW 14
277#define IRONLAKE_LVDS_S_P2_FAST 14
278
279/* LVDS dual-channel 120Mhz refclk */
280#define IRONLAKE_LVDS_D_N_MIN 1
281#define IRONLAKE_LVDS_D_N_MAX 3
282#define IRONLAKE_LVDS_D_M_MIN 79
283#define IRONLAKE_LVDS_D_M_MAX 127
284#define IRONLAKE_LVDS_D_P_MIN 14
285#define IRONLAKE_LVDS_D_P_MAX 56
286#define IRONLAKE_LVDS_D_P1_MIN 2
287#define IRONLAKE_LVDS_D_P1_MAX 8
288#define IRONLAKE_LVDS_D_P2_SLOW 7
289#define IRONLAKE_LVDS_D_P2_FAST 7
290
291/* LVDS single-channel 100Mhz refclk */
292#define IRONLAKE_LVDS_S_SSC_N_MIN 1
293#define IRONLAKE_LVDS_S_SSC_N_MAX 2
294#define IRONLAKE_LVDS_S_SSC_M_MIN 79
295#define IRONLAKE_LVDS_S_SSC_M_MAX 126
296#define IRONLAKE_LVDS_S_SSC_P_MIN 28
297#define IRONLAKE_LVDS_S_SSC_P_MAX 112
298#define IRONLAKE_LVDS_S_SSC_P1_MIN 2
299#define IRONLAKE_LVDS_S_SSC_P1_MAX 8
300#define IRONLAKE_LVDS_S_SSC_P2_SLOW 14
301#define IRONLAKE_LVDS_S_SSC_P2_FAST 14
302
303/* LVDS dual-channel 100Mhz refclk */
304#define IRONLAKE_LVDS_D_SSC_N_MIN 1
305#define IRONLAKE_LVDS_D_SSC_N_MAX 3
306#define IRONLAKE_LVDS_D_SSC_M_MIN 79
307#define IRONLAKE_LVDS_D_SSC_M_MAX 126
308#define IRONLAKE_LVDS_D_SSC_P_MIN 14
309#define IRONLAKE_LVDS_D_SSC_P_MAX 42
310#define IRONLAKE_LVDS_D_SSC_P1_MIN 2
311#define IRONLAKE_LVDS_D_SSC_P1_MAX 6
312#define IRONLAKE_LVDS_D_SSC_P2_SLOW 7
313#define IRONLAKE_LVDS_D_SSC_P2_FAST 7
314
315/* DisplayPort */
316#define IRONLAKE_DP_N_MIN 1
317#define IRONLAKE_DP_N_MAX 2
318#define IRONLAKE_DP_M_MIN 81
319#define IRONLAKE_DP_M_MAX 90
320#define IRONLAKE_DP_P_MIN 10
321#define IRONLAKE_DP_P_MAX 20
322#define IRONLAKE_DP_P2_FAST 10
323#define IRONLAKE_DP_P2_SLOW 10
324#define IRONLAKE_DP_P2_LIMIT 0
325#define IRONLAKE_DP_P1_MIN 1
326#define IRONLAKE_DP_P1_MAX 2
327
328/* FDI */ 79/* FDI */
329#define IRONLAKE_FDI_FREQ 2700000 /* in kHz for mode->clock */ 80#define IRONLAKE_FDI_FREQ 2700000 /* in kHz for mode->clock */
330 81
@@ -342,316 +93,284 @@ static bool
342intel_find_pll_ironlake_dp(const intel_limit_t *, struct drm_crtc *crtc, 93intel_find_pll_ironlake_dp(const intel_limit_t *, struct drm_crtc *crtc,
343 int target, int refclk, intel_clock_t *best_clock); 94 int target, int refclk, intel_clock_t *best_clock);
344 95
96static inline u32 /* units of 100MHz */
97intel_fdi_link_freq(struct drm_device *dev)
98{
99 if (IS_GEN5(dev)) {
100 struct drm_i915_private *dev_priv = dev->dev_private;
101 return (I915_READ(FDI_PLL_BIOS_0) & FDI_PLL_FB_CLOCK_MASK) + 2;
102 } else
103 return 27;
104}
105
345static const intel_limit_t intel_limits_i8xx_dvo = { 106static const intel_limit_t intel_limits_i8xx_dvo = {
346 .dot = { .min = I8XX_DOT_MIN, .max = I8XX_DOT_MAX }, 107 .dot = { .min = 25000, .max = 350000 },
347 .vco = { .min = I8XX_VCO_MIN, .max = I8XX_VCO_MAX }, 108 .vco = { .min = 930000, .max = 1400000 },
348 .n = { .min = I8XX_N_MIN, .max = I8XX_N_MAX }, 109 .n = { .min = 3, .max = 16 },
349 .m = { .min = I8XX_M_MIN, .max = I8XX_M_MAX }, 110 .m = { .min = 96, .max = 140 },
350 .m1 = { .min = I8XX_M1_MIN, .max = I8XX_M1_MAX }, 111 .m1 = { .min = 18, .max = 26 },
351 .m2 = { .min = I8XX_M2_MIN, .max = I8XX_M2_MAX }, 112 .m2 = { .min = 6, .max = 16 },
352 .p = { .min = I8XX_P_MIN, .max = I8XX_P_MAX }, 113 .p = { .min = 4, .max = 128 },
353 .p1 = { .min = I8XX_P1_MIN, .max = I8XX_P1_MAX }, 114 .p1 = { .min = 2, .max = 33 },
354 .p2 = { .dot_limit = I8XX_P2_SLOW_LIMIT, 115 .p2 = { .dot_limit = 165000,
355 .p2_slow = I8XX_P2_SLOW, .p2_fast = I8XX_P2_FAST }, 116 .p2_slow = 4, .p2_fast = 2 },
356 .find_pll = intel_find_best_PLL, 117 .find_pll = intel_find_best_PLL,
357}; 118};
358 119
359static const intel_limit_t intel_limits_i8xx_lvds = { 120static const intel_limit_t intel_limits_i8xx_lvds = {
360 .dot = { .min = I8XX_DOT_MIN, .max = I8XX_DOT_MAX }, 121 .dot = { .min = 25000, .max = 350000 },
361 .vco = { .min = I8XX_VCO_MIN, .max = I8XX_VCO_MAX }, 122 .vco = { .min = 930000, .max = 1400000 },
362 .n = { .min = I8XX_N_MIN, .max = I8XX_N_MAX }, 123 .n = { .min = 3, .max = 16 },
363 .m = { .min = I8XX_M_MIN, .max = I8XX_M_MAX }, 124 .m = { .min = 96, .max = 140 },
364 .m1 = { .min = I8XX_M1_MIN, .max = I8XX_M1_MAX }, 125 .m1 = { .min = 18, .max = 26 },
365 .m2 = { .min = I8XX_M2_MIN, .max = I8XX_M2_MAX }, 126 .m2 = { .min = 6, .max = 16 },
366 .p = { .min = I8XX_P_MIN, .max = I8XX_P_MAX }, 127 .p = { .min = 4, .max = 128 },
367 .p1 = { .min = I8XX_P1_LVDS_MIN, .max = I8XX_P1_LVDS_MAX }, 128 .p1 = { .min = 1, .max = 6 },
368 .p2 = { .dot_limit = I8XX_P2_SLOW_LIMIT, 129 .p2 = { .dot_limit = 165000,
369 .p2_slow = I8XX_P2_LVDS_SLOW, .p2_fast = I8XX_P2_LVDS_FAST }, 130 .p2_slow = 14, .p2_fast = 7 },
370 .find_pll = intel_find_best_PLL, 131 .find_pll = intel_find_best_PLL,
371}; 132};
372 133
373static const intel_limit_t intel_limits_i9xx_sdvo = { 134static const intel_limit_t intel_limits_i9xx_sdvo = {
374 .dot = { .min = I9XX_DOT_MIN, .max = I9XX_DOT_MAX }, 135 .dot = { .min = 20000, .max = 400000 },
375 .vco = { .min = I9XX_VCO_MIN, .max = I9XX_VCO_MAX }, 136 .vco = { .min = 1400000, .max = 2800000 },
376 .n = { .min = I9XX_N_MIN, .max = I9XX_N_MAX }, 137 .n = { .min = 1, .max = 6 },
377 .m = { .min = I9XX_M_MIN, .max = I9XX_M_MAX }, 138 .m = { .min = 70, .max = 120 },
378 .m1 = { .min = I9XX_M1_MIN, .max = I9XX_M1_MAX }, 139 .m1 = { .min = 10, .max = 22 },
379 .m2 = { .min = I9XX_M2_MIN, .max = I9XX_M2_MAX }, 140 .m2 = { .min = 5, .max = 9 },
380 .p = { .min = I9XX_P_SDVO_DAC_MIN, .max = I9XX_P_SDVO_DAC_MAX }, 141 .p = { .min = 5, .max = 80 },
381 .p1 = { .min = I9XX_P1_MIN, .max = I9XX_P1_MAX }, 142 .p1 = { .min = 1, .max = 8 },
382 .p2 = { .dot_limit = I9XX_P2_SDVO_DAC_SLOW_LIMIT, 143 .p2 = { .dot_limit = 200000,
383 .p2_slow = I9XX_P2_SDVO_DAC_SLOW, .p2_fast = I9XX_P2_SDVO_DAC_FAST }, 144 .p2_slow = 10, .p2_fast = 5 },
384 .find_pll = intel_find_best_PLL, 145 .find_pll = intel_find_best_PLL,
385}; 146};
386 147
387static const intel_limit_t intel_limits_i9xx_lvds = { 148static const intel_limit_t intel_limits_i9xx_lvds = {
388 .dot = { .min = I9XX_DOT_MIN, .max = I9XX_DOT_MAX }, 149 .dot = { .min = 20000, .max = 400000 },
389 .vco = { .min = I9XX_VCO_MIN, .max = I9XX_VCO_MAX }, 150 .vco = { .min = 1400000, .max = 2800000 },
390 .n = { .min = I9XX_N_MIN, .max = I9XX_N_MAX }, 151 .n = { .min = 1, .max = 6 },
391 .m = { .min = I9XX_M_MIN, .max = I9XX_M_MAX }, 152 .m = { .min = 70, .max = 120 },
392 .m1 = { .min = I9XX_M1_MIN, .max = I9XX_M1_MAX }, 153 .m1 = { .min = 10, .max = 22 },
393 .m2 = { .min = I9XX_M2_MIN, .max = I9XX_M2_MAX }, 154 .m2 = { .min = 5, .max = 9 },
394 .p = { .min = I9XX_P_LVDS_MIN, .max = I9XX_P_LVDS_MAX }, 155 .p = { .min = 7, .max = 98 },
395 .p1 = { .min = I9XX_P1_MIN, .max = I9XX_P1_MAX }, 156 .p1 = { .min = 1, .max = 8 },
396 /* The single-channel range is 25-112Mhz, and dual-channel 157 .p2 = { .dot_limit = 112000,
397 * is 80-224Mhz. Prefer single channel as much as possible. 158 .p2_slow = 14, .p2_fast = 7 },
398 */
399 .p2 = { .dot_limit = I9XX_P2_LVDS_SLOW_LIMIT,
400 .p2_slow = I9XX_P2_LVDS_SLOW, .p2_fast = I9XX_P2_LVDS_FAST },
401 .find_pll = intel_find_best_PLL, 159 .find_pll = intel_find_best_PLL,
402}; 160};
403 161
404 /* below parameter and function is for G4X Chipset Family*/ 162
405static const intel_limit_t intel_limits_g4x_sdvo = { 163static const intel_limit_t intel_limits_g4x_sdvo = {
406 .dot = { .min = G4X_DOT_SDVO_MIN, .max = G4X_DOT_SDVO_MAX }, 164 .dot = { .min = 25000, .max = 270000 },
407 .vco = { .min = G4X_VCO_MIN, .max = G4X_VCO_MAX}, 165 .vco = { .min = 1750000, .max = 3500000},
408 .n = { .min = G4X_N_SDVO_MIN, .max = G4X_N_SDVO_MAX }, 166 .n = { .min = 1, .max = 4 },
409 .m = { .min = G4X_M_SDVO_MIN, .max = G4X_M_SDVO_MAX }, 167 .m = { .min = 104, .max = 138 },
410 .m1 = { .min = G4X_M1_SDVO_MIN, .max = G4X_M1_SDVO_MAX }, 168 .m1 = { .min = 17, .max = 23 },
411 .m2 = { .min = G4X_M2_SDVO_MIN, .max = G4X_M2_SDVO_MAX }, 169 .m2 = { .min = 5, .max = 11 },
412 .p = { .min = G4X_P_SDVO_MIN, .max = G4X_P_SDVO_MAX }, 170 .p = { .min = 10, .max = 30 },
413 .p1 = { .min = G4X_P1_SDVO_MIN, .max = G4X_P1_SDVO_MAX}, 171 .p1 = { .min = 1, .max = 3},
414 .p2 = { .dot_limit = G4X_P2_SDVO_LIMIT, 172 .p2 = { .dot_limit = 270000,
415 .p2_slow = G4X_P2_SDVO_SLOW, 173 .p2_slow = 10,
416 .p2_fast = G4X_P2_SDVO_FAST 174 .p2_fast = 10
417 }, 175 },
418 .find_pll = intel_g4x_find_best_PLL, 176 .find_pll = intel_g4x_find_best_PLL,
419}; 177};
420 178
421static const intel_limit_t intel_limits_g4x_hdmi = { 179static const intel_limit_t intel_limits_g4x_hdmi = {
422 .dot = { .min = G4X_DOT_HDMI_DAC_MIN, .max = G4X_DOT_HDMI_DAC_MAX }, 180 .dot = { .min = 22000, .max = 400000 },
423 .vco = { .min = G4X_VCO_MIN, .max = G4X_VCO_MAX}, 181 .vco = { .min = 1750000, .max = 3500000},
424 .n = { .min = G4X_N_HDMI_DAC_MIN, .max = G4X_N_HDMI_DAC_MAX }, 182 .n = { .min = 1, .max = 4 },
425 .m = { .min = G4X_M_HDMI_DAC_MIN, .max = G4X_M_HDMI_DAC_MAX }, 183 .m = { .min = 104, .max = 138 },
426 .m1 = { .min = G4X_M1_HDMI_DAC_MIN, .max = G4X_M1_HDMI_DAC_MAX }, 184 .m1 = { .min = 16, .max = 23 },
427 .m2 = { .min = G4X_M2_HDMI_DAC_MIN, .max = G4X_M2_HDMI_DAC_MAX }, 185 .m2 = { .min = 5, .max = 11 },
428 .p = { .min = G4X_P_HDMI_DAC_MIN, .max = G4X_P_HDMI_DAC_MAX }, 186 .p = { .min = 5, .max = 80 },
429 .p1 = { .min = G4X_P1_HDMI_DAC_MIN, .max = G4X_P1_HDMI_DAC_MAX}, 187 .p1 = { .min = 1, .max = 8},
430 .p2 = { .dot_limit = G4X_P2_HDMI_DAC_LIMIT, 188 .p2 = { .dot_limit = 165000,
431 .p2_slow = G4X_P2_HDMI_DAC_SLOW, 189 .p2_slow = 10, .p2_fast = 5 },
432 .p2_fast = G4X_P2_HDMI_DAC_FAST
433 },
434 .find_pll = intel_g4x_find_best_PLL, 190 .find_pll = intel_g4x_find_best_PLL,
435}; 191};
436 192
437static const intel_limit_t intel_limits_g4x_single_channel_lvds = { 193static const intel_limit_t intel_limits_g4x_single_channel_lvds = {
438 .dot = { .min = G4X_DOT_SINGLE_CHANNEL_LVDS_MIN, 194 .dot = { .min = 20000, .max = 115000 },
439 .max = G4X_DOT_SINGLE_CHANNEL_LVDS_MAX }, 195 .vco = { .min = 1750000, .max = 3500000 },
440 .vco = { .min = G4X_VCO_MIN, 196 .n = { .min = 1, .max = 3 },
441 .max = G4X_VCO_MAX }, 197 .m = { .min = 104, .max = 138 },
442 .n = { .min = G4X_N_SINGLE_CHANNEL_LVDS_MIN, 198 .m1 = { .min = 17, .max = 23 },
443 .max = G4X_N_SINGLE_CHANNEL_LVDS_MAX }, 199 .m2 = { .min = 5, .max = 11 },
444 .m = { .min = G4X_M_SINGLE_CHANNEL_LVDS_MIN, 200 .p = { .min = 28, .max = 112 },
445 .max = G4X_M_SINGLE_CHANNEL_LVDS_MAX }, 201 .p1 = { .min = 2, .max = 8 },
446 .m1 = { .min = G4X_M1_SINGLE_CHANNEL_LVDS_MIN, 202 .p2 = { .dot_limit = 0,
447 .max = G4X_M1_SINGLE_CHANNEL_LVDS_MAX }, 203 .p2_slow = 14, .p2_fast = 14
448 .m2 = { .min = G4X_M2_SINGLE_CHANNEL_LVDS_MIN,
449 .max = G4X_M2_SINGLE_CHANNEL_LVDS_MAX },
450 .p = { .min = G4X_P_SINGLE_CHANNEL_LVDS_MIN,
451 .max = G4X_P_SINGLE_CHANNEL_LVDS_MAX },
452 .p1 = { .min = G4X_P1_SINGLE_CHANNEL_LVDS_MIN,
453 .max = G4X_P1_SINGLE_CHANNEL_LVDS_MAX },
454 .p2 = { .dot_limit = G4X_P2_SINGLE_CHANNEL_LVDS_LIMIT,
455 .p2_slow = G4X_P2_SINGLE_CHANNEL_LVDS_SLOW,
456 .p2_fast = G4X_P2_SINGLE_CHANNEL_LVDS_FAST
457 }, 204 },
458 .find_pll = intel_g4x_find_best_PLL, 205 .find_pll = intel_g4x_find_best_PLL,
459}; 206};
460 207
461static const intel_limit_t intel_limits_g4x_dual_channel_lvds = { 208static const intel_limit_t intel_limits_g4x_dual_channel_lvds = {
462 .dot = { .min = G4X_DOT_DUAL_CHANNEL_LVDS_MIN, 209 .dot = { .min = 80000, .max = 224000 },
463 .max = G4X_DOT_DUAL_CHANNEL_LVDS_MAX }, 210 .vco = { .min = 1750000, .max = 3500000 },
464 .vco = { .min = G4X_VCO_MIN, 211 .n = { .min = 1, .max = 3 },
465 .max = G4X_VCO_MAX }, 212 .m = { .min = 104, .max = 138 },
466 .n = { .min = G4X_N_DUAL_CHANNEL_LVDS_MIN, 213 .m1 = { .min = 17, .max = 23 },
467 .max = G4X_N_DUAL_CHANNEL_LVDS_MAX }, 214 .m2 = { .min = 5, .max = 11 },
468 .m = { .min = G4X_M_DUAL_CHANNEL_LVDS_MIN, 215 .p = { .min = 14, .max = 42 },
469 .max = G4X_M_DUAL_CHANNEL_LVDS_MAX }, 216 .p1 = { .min = 2, .max = 6 },
470 .m1 = { .min = G4X_M1_DUAL_CHANNEL_LVDS_MIN, 217 .p2 = { .dot_limit = 0,
471 .max = G4X_M1_DUAL_CHANNEL_LVDS_MAX }, 218 .p2_slow = 7, .p2_fast = 7
472 .m2 = { .min = G4X_M2_DUAL_CHANNEL_LVDS_MIN,
473 .max = G4X_M2_DUAL_CHANNEL_LVDS_MAX },
474 .p = { .min = G4X_P_DUAL_CHANNEL_LVDS_MIN,
475 .max = G4X_P_DUAL_CHANNEL_LVDS_MAX },
476 .p1 = { .min = G4X_P1_DUAL_CHANNEL_LVDS_MIN,
477 .max = G4X_P1_DUAL_CHANNEL_LVDS_MAX },
478 .p2 = { .dot_limit = G4X_P2_DUAL_CHANNEL_LVDS_LIMIT,
479 .p2_slow = G4X_P2_DUAL_CHANNEL_LVDS_SLOW,
480 .p2_fast = G4X_P2_DUAL_CHANNEL_LVDS_FAST
481 }, 219 },
482 .find_pll = intel_g4x_find_best_PLL, 220 .find_pll = intel_g4x_find_best_PLL,
483}; 221};
484 222
485static const intel_limit_t intel_limits_g4x_display_port = { 223static const intel_limit_t intel_limits_g4x_display_port = {
486 .dot = { .min = G4X_DOT_DISPLAY_PORT_MIN, 224 .dot = { .min = 161670, .max = 227000 },
487 .max = G4X_DOT_DISPLAY_PORT_MAX }, 225 .vco = { .min = 1750000, .max = 3500000},
488 .vco = { .min = G4X_VCO_MIN, 226 .n = { .min = 1, .max = 2 },
489 .max = G4X_VCO_MAX}, 227 .m = { .min = 97, .max = 108 },
490 .n = { .min = G4X_N_DISPLAY_PORT_MIN, 228 .m1 = { .min = 0x10, .max = 0x12 },
491 .max = G4X_N_DISPLAY_PORT_MAX }, 229 .m2 = { .min = 0x05, .max = 0x06 },
492 .m = { .min = G4X_M_DISPLAY_PORT_MIN, 230 .p = { .min = 10, .max = 20 },
493 .max = G4X_M_DISPLAY_PORT_MAX }, 231 .p1 = { .min = 1, .max = 2},
494 .m1 = { .min = G4X_M1_DISPLAY_PORT_MIN, 232 .p2 = { .dot_limit = 0,
495 .max = G4X_M1_DISPLAY_PORT_MAX }, 233 .p2_slow = 10, .p2_fast = 10 },
496 .m2 = { .min = G4X_M2_DISPLAY_PORT_MIN,
497 .max = G4X_M2_DISPLAY_PORT_MAX },
498 .p = { .min = G4X_P_DISPLAY_PORT_MIN,
499 .max = G4X_P_DISPLAY_PORT_MAX },
500 .p1 = { .min = G4X_P1_DISPLAY_PORT_MIN,
501 .max = G4X_P1_DISPLAY_PORT_MAX},
502 .p2 = { .dot_limit = G4X_P2_DISPLAY_PORT_LIMIT,
503 .p2_slow = G4X_P2_DISPLAY_PORT_SLOW,
504 .p2_fast = G4X_P2_DISPLAY_PORT_FAST },
505 .find_pll = intel_find_pll_g4x_dp, 234 .find_pll = intel_find_pll_g4x_dp,
506}; 235};
507 236
508static const intel_limit_t intel_limits_pineview_sdvo = { 237static const intel_limit_t intel_limits_pineview_sdvo = {
509 .dot = { .min = I9XX_DOT_MIN, .max = I9XX_DOT_MAX}, 238 .dot = { .min = 20000, .max = 400000},
510 .vco = { .min = PINEVIEW_VCO_MIN, .max = PINEVIEW_VCO_MAX }, 239 .vco = { .min = 1700000, .max = 3500000 },
511 .n = { .min = PINEVIEW_N_MIN, .max = PINEVIEW_N_MAX }, 240 /* Pineview's Ncounter is a ring counter */
512 .m = { .min = PINEVIEW_M_MIN, .max = PINEVIEW_M_MAX }, 241 .n = { .min = 3, .max = 6 },
513 .m1 = { .min = PINEVIEW_M1_MIN, .max = PINEVIEW_M1_MAX }, 242 .m = { .min = 2, .max = 256 },
514 .m2 = { .min = PINEVIEW_M2_MIN, .max = PINEVIEW_M2_MAX }, 243 /* Pineview only has one combined m divider, which we treat as m2. */
515 .p = { .min = I9XX_P_SDVO_DAC_MIN, .max = I9XX_P_SDVO_DAC_MAX }, 244 .m1 = { .min = 0, .max = 0 },
516 .p1 = { .min = I9XX_P1_MIN, .max = I9XX_P1_MAX }, 245 .m2 = { .min = 0, .max = 254 },
517 .p2 = { .dot_limit = I9XX_P2_SDVO_DAC_SLOW_LIMIT, 246 .p = { .min = 5, .max = 80 },
518 .p2_slow = I9XX_P2_SDVO_DAC_SLOW, .p2_fast = I9XX_P2_SDVO_DAC_FAST }, 247 .p1 = { .min = 1, .max = 8 },
248 .p2 = { .dot_limit = 200000,
249 .p2_slow = 10, .p2_fast = 5 },
519 .find_pll = intel_find_best_PLL, 250 .find_pll = intel_find_best_PLL,
520}; 251};
521 252
522static const intel_limit_t intel_limits_pineview_lvds = { 253static const intel_limit_t intel_limits_pineview_lvds = {
523 .dot = { .min = I9XX_DOT_MIN, .max = I9XX_DOT_MAX }, 254 .dot = { .min = 20000, .max = 400000 },
524 .vco = { .min = PINEVIEW_VCO_MIN, .max = PINEVIEW_VCO_MAX }, 255 .vco = { .min = 1700000, .max = 3500000 },
525 .n = { .min = PINEVIEW_N_MIN, .max = PINEVIEW_N_MAX }, 256 .n = { .min = 3, .max = 6 },
526 .m = { .min = PINEVIEW_M_MIN, .max = PINEVIEW_M_MAX }, 257 .m = { .min = 2, .max = 256 },
527 .m1 = { .min = PINEVIEW_M1_MIN, .max = PINEVIEW_M1_MAX }, 258 .m1 = { .min = 0, .max = 0 },
528 .m2 = { .min = PINEVIEW_M2_MIN, .max = PINEVIEW_M2_MAX }, 259 .m2 = { .min = 0, .max = 254 },
529 .p = { .min = PINEVIEW_P_LVDS_MIN, .max = PINEVIEW_P_LVDS_MAX }, 260 .p = { .min = 7, .max = 112 },
530 .p1 = { .min = I9XX_P1_MIN, .max = I9XX_P1_MAX }, 261 .p1 = { .min = 1, .max = 8 },
531 /* Pineview only supports single-channel mode. */ 262 .p2 = { .dot_limit = 112000,
532 .p2 = { .dot_limit = I9XX_P2_LVDS_SLOW_LIMIT, 263 .p2_slow = 14, .p2_fast = 14 },
533 .p2_slow = I9XX_P2_LVDS_SLOW, .p2_fast = I9XX_P2_LVDS_SLOW },
534 .find_pll = intel_find_best_PLL, 264 .find_pll = intel_find_best_PLL,
535}; 265};
536 266
267/* Ironlake / Sandybridge
268 *
269 * We calculate clock using (register_value + 2) for N/M1/M2, so here
270 * the range value for them is (actual_value - 2).
271 */
537static const intel_limit_t intel_limits_ironlake_dac = { 272static const intel_limit_t intel_limits_ironlake_dac = {
538 .dot = { .min = IRONLAKE_DOT_MIN, .max = IRONLAKE_DOT_MAX }, 273 .dot = { .min = 25000, .max = 350000 },
539 .vco = { .min = IRONLAKE_VCO_MIN, .max = IRONLAKE_VCO_MAX }, 274 .vco = { .min = 1760000, .max = 3510000 },
540 .n = { .min = IRONLAKE_DAC_N_MIN, .max = IRONLAKE_DAC_N_MAX }, 275 .n = { .min = 1, .max = 5 },
541 .m = { .min = IRONLAKE_DAC_M_MIN, .max = IRONLAKE_DAC_M_MAX }, 276 .m = { .min = 79, .max = 127 },
542 .m1 = { .min = IRONLAKE_M1_MIN, .max = IRONLAKE_M1_MAX }, 277 .m1 = { .min = 12, .max = 22 },
543 .m2 = { .min = IRONLAKE_M2_MIN, .max = IRONLAKE_M2_MAX }, 278 .m2 = { .min = 5, .max = 9 },
544 .p = { .min = IRONLAKE_DAC_P_MIN, .max = IRONLAKE_DAC_P_MAX }, 279 .p = { .min = 5, .max = 80 },
545 .p1 = { .min = IRONLAKE_DAC_P1_MIN, .max = IRONLAKE_DAC_P1_MAX }, 280 .p1 = { .min = 1, .max = 8 },
546 .p2 = { .dot_limit = IRONLAKE_P2_DOT_LIMIT, 281 .p2 = { .dot_limit = 225000,
547 .p2_slow = IRONLAKE_DAC_P2_SLOW, 282 .p2_slow = 10, .p2_fast = 5 },
548 .p2_fast = IRONLAKE_DAC_P2_FAST },
549 .find_pll = intel_g4x_find_best_PLL, 283 .find_pll = intel_g4x_find_best_PLL,
550}; 284};
551 285
552static const intel_limit_t intel_limits_ironlake_single_lvds = { 286static const intel_limit_t intel_limits_ironlake_single_lvds = {
553 .dot = { .min = IRONLAKE_DOT_MIN, .max = IRONLAKE_DOT_MAX }, 287 .dot = { .min = 25000, .max = 350000 },
554 .vco = { .min = IRONLAKE_VCO_MIN, .max = IRONLAKE_VCO_MAX }, 288 .vco = { .min = 1760000, .max = 3510000 },
555 .n = { .min = IRONLAKE_LVDS_S_N_MIN, .max = IRONLAKE_LVDS_S_N_MAX }, 289 .n = { .min = 1, .max = 3 },
556 .m = { .min = IRONLAKE_LVDS_S_M_MIN, .max = IRONLAKE_LVDS_S_M_MAX }, 290 .m = { .min = 79, .max = 118 },
557 .m1 = { .min = IRONLAKE_M1_MIN, .max = IRONLAKE_M1_MAX }, 291 .m1 = { .min = 12, .max = 22 },
558 .m2 = { .min = IRONLAKE_M2_MIN, .max = IRONLAKE_M2_MAX }, 292 .m2 = { .min = 5, .max = 9 },
559 .p = { .min = IRONLAKE_LVDS_S_P_MIN, .max = IRONLAKE_LVDS_S_P_MAX }, 293 .p = { .min = 28, .max = 112 },
560 .p1 = { .min = IRONLAKE_LVDS_S_P1_MIN, .max = IRONLAKE_LVDS_S_P1_MAX }, 294 .p1 = { .min = 2, .max = 8 },
561 .p2 = { .dot_limit = IRONLAKE_P2_DOT_LIMIT, 295 .p2 = { .dot_limit = 225000,
562 .p2_slow = IRONLAKE_LVDS_S_P2_SLOW, 296 .p2_slow = 14, .p2_fast = 14 },
563 .p2_fast = IRONLAKE_LVDS_S_P2_FAST },
564 .find_pll = intel_g4x_find_best_PLL, 297 .find_pll = intel_g4x_find_best_PLL,
565}; 298};
566 299
567static const intel_limit_t intel_limits_ironlake_dual_lvds = { 300static const intel_limit_t intel_limits_ironlake_dual_lvds = {
568 .dot = { .min = IRONLAKE_DOT_MIN, .max = IRONLAKE_DOT_MAX }, 301 .dot = { .min = 25000, .max = 350000 },
569 .vco = { .min = IRONLAKE_VCO_MIN, .max = IRONLAKE_VCO_MAX }, 302 .vco = { .min = 1760000, .max = 3510000 },
570 .n = { .min = IRONLAKE_LVDS_D_N_MIN, .max = IRONLAKE_LVDS_D_N_MAX }, 303 .n = { .min = 1, .max = 3 },
571 .m = { .min = IRONLAKE_LVDS_D_M_MIN, .max = IRONLAKE_LVDS_D_M_MAX }, 304 .m = { .min = 79, .max = 127 },
572 .m1 = { .min = IRONLAKE_M1_MIN, .max = IRONLAKE_M1_MAX }, 305 .m1 = { .min = 12, .max = 22 },
573 .m2 = { .min = IRONLAKE_M2_MIN, .max = IRONLAKE_M2_MAX }, 306 .m2 = { .min = 5, .max = 9 },
574 .p = { .min = IRONLAKE_LVDS_D_P_MIN, .max = IRONLAKE_LVDS_D_P_MAX }, 307 .p = { .min = 14, .max = 56 },
575 .p1 = { .min = IRONLAKE_LVDS_D_P1_MIN, .max = IRONLAKE_LVDS_D_P1_MAX }, 308 .p1 = { .min = 2, .max = 8 },
576 .p2 = { .dot_limit = IRONLAKE_P2_DOT_LIMIT, 309 .p2 = { .dot_limit = 225000,
577 .p2_slow = IRONLAKE_LVDS_D_P2_SLOW, 310 .p2_slow = 7, .p2_fast = 7 },
578 .p2_fast = IRONLAKE_LVDS_D_P2_FAST },
579 .find_pll = intel_g4x_find_best_PLL, 311 .find_pll = intel_g4x_find_best_PLL,
580}; 312};
581 313
314/* LVDS 100mhz refclk limits. */
582static const intel_limit_t intel_limits_ironlake_single_lvds_100m = { 315static const intel_limit_t intel_limits_ironlake_single_lvds_100m = {
583 .dot = { .min = IRONLAKE_DOT_MIN, .max = IRONLAKE_DOT_MAX }, 316 .dot = { .min = 25000, .max = 350000 },
584 .vco = { .min = IRONLAKE_VCO_MIN, .max = IRONLAKE_VCO_MAX }, 317 .vco = { .min = 1760000, .max = 3510000 },
585 .n = { .min = IRONLAKE_LVDS_S_SSC_N_MIN, .max = IRONLAKE_LVDS_S_SSC_N_MAX }, 318 .n = { .min = 1, .max = 2 },
586 .m = { .min = IRONLAKE_LVDS_S_SSC_M_MIN, .max = IRONLAKE_LVDS_S_SSC_M_MAX }, 319 .m = { .min = 79, .max = 126 },
587 .m1 = { .min = IRONLAKE_M1_MIN, .max = IRONLAKE_M1_MAX }, 320 .m1 = { .min = 12, .max = 22 },
588 .m2 = { .min = IRONLAKE_M2_MIN, .max = IRONLAKE_M2_MAX }, 321 .m2 = { .min = 5, .max = 9 },
589 .p = { .min = IRONLAKE_LVDS_S_SSC_P_MIN, .max = IRONLAKE_LVDS_S_SSC_P_MAX }, 322 .p = { .min = 28, .max = 112 },
590 .p1 = { .min = IRONLAKE_LVDS_S_SSC_P1_MIN,.max = IRONLAKE_LVDS_S_SSC_P1_MAX }, 323 .p1 = { .min = 2,.max = 8 },
591 .p2 = { .dot_limit = IRONLAKE_P2_DOT_LIMIT, 324 .p2 = { .dot_limit = 225000,
592 .p2_slow = IRONLAKE_LVDS_S_SSC_P2_SLOW, 325 .p2_slow = 14, .p2_fast = 14 },
593 .p2_fast = IRONLAKE_LVDS_S_SSC_P2_FAST },
594 .find_pll = intel_g4x_find_best_PLL, 326 .find_pll = intel_g4x_find_best_PLL,
595}; 327};
596 328
597static const intel_limit_t intel_limits_ironlake_dual_lvds_100m = { 329static const intel_limit_t intel_limits_ironlake_dual_lvds_100m = {
598 .dot = { .min = IRONLAKE_DOT_MIN, .max = IRONLAKE_DOT_MAX }, 330 .dot = { .min = 25000, .max = 350000 },
599 .vco = { .min = IRONLAKE_VCO_MIN, .max = IRONLAKE_VCO_MAX }, 331 .vco = { .min = 1760000, .max = 3510000 },
600 .n = { .min = IRONLAKE_LVDS_D_SSC_N_MIN, .max = IRONLAKE_LVDS_D_SSC_N_MAX }, 332 .n = { .min = 1, .max = 3 },
601 .m = { .min = IRONLAKE_LVDS_D_SSC_M_MIN, .max = IRONLAKE_LVDS_D_SSC_M_MAX }, 333 .m = { .min = 79, .max = 126 },
602 .m1 = { .min = IRONLAKE_M1_MIN, .max = IRONLAKE_M1_MAX }, 334 .m1 = { .min = 12, .max = 22 },
603 .m2 = { .min = IRONLAKE_M2_MIN, .max = IRONLAKE_M2_MAX }, 335 .m2 = { .min = 5, .max = 9 },
604 .p = { .min = IRONLAKE_LVDS_D_SSC_P_MIN, .max = IRONLAKE_LVDS_D_SSC_P_MAX }, 336 .p = { .min = 14, .max = 42 },
605 .p1 = { .min = IRONLAKE_LVDS_D_SSC_P1_MIN,.max = IRONLAKE_LVDS_D_SSC_P1_MAX }, 337 .p1 = { .min = 2,.max = 6 },
606 .p2 = { .dot_limit = IRONLAKE_P2_DOT_LIMIT, 338 .p2 = { .dot_limit = 225000,
607 .p2_slow = IRONLAKE_LVDS_D_SSC_P2_SLOW, 339 .p2_slow = 7, .p2_fast = 7 },
608 .p2_fast = IRONLAKE_LVDS_D_SSC_P2_FAST },
609 .find_pll = intel_g4x_find_best_PLL, 340 .find_pll = intel_g4x_find_best_PLL,
610}; 341};
611 342
612static const intel_limit_t intel_limits_ironlake_display_port = { 343static const intel_limit_t intel_limits_ironlake_display_port = {
613 .dot = { .min = IRONLAKE_DOT_MIN, 344 .dot = { .min = 25000, .max = 350000 },
614 .max = IRONLAKE_DOT_MAX }, 345 .vco = { .min = 1760000, .max = 3510000},
615 .vco = { .min = IRONLAKE_VCO_MIN, 346 .n = { .min = 1, .max = 2 },
616 .max = IRONLAKE_VCO_MAX}, 347 .m = { .min = 81, .max = 90 },
617 .n = { .min = IRONLAKE_DP_N_MIN, 348 .m1 = { .min = 12, .max = 22 },
618 .max = IRONLAKE_DP_N_MAX }, 349 .m2 = { .min = 5, .max = 9 },
619 .m = { .min = IRONLAKE_DP_M_MIN, 350 .p = { .min = 10, .max = 20 },
620 .max = IRONLAKE_DP_M_MAX }, 351 .p1 = { .min = 1, .max = 2},
621 .m1 = { .min = IRONLAKE_M1_MIN, 352 .p2 = { .dot_limit = 0,
622 .max = IRONLAKE_M1_MAX }, 353 .p2_slow = 10, .p2_fast = 10 },
623 .m2 = { .min = IRONLAKE_M2_MIN,
624 .max = IRONLAKE_M2_MAX },
625 .p = { .min = IRONLAKE_DP_P_MIN,
626 .max = IRONLAKE_DP_P_MAX },
627 .p1 = { .min = IRONLAKE_DP_P1_MIN,
628 .max = IRONLAKE_DP_P1_MAX},
629 .p2 = { .dot_limit = IRONLAKE_DP_P2_LIMIT,
630 .p2_slow = IRONLAKE_DP_P2_SLOW,
631 .p2_fast = IRONLAKE_DP_P2_FAST },
632 .find_pll = intel_find_pll_ironlake_dp, 354 .find_pll = intel_find_pll_ironlake_dp,
633}; 355};
634 356
635static const intel_limit_t *intel_ironlake_limit(struct drm_crtc *crtc) 357static const intel_limit_t *intel_ironlake_limit(struct drm_crtc *crtc,
358 int refclk)
636{ 359{
637 struct drm_device *dev = crtc->dev; 360 struct drm_device *dev = crtc->dev;
638 struct drm_i915_private *dev_priv = dev->dev_private; 361 struct drm_i915_private *dev_priv = dev->dev_private;
639 const intel_limit_t *limit; 362 const intel_limit_t *limit;
640 int refclk = 120;
641 363
642 if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) { 364 if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) {
643 if (dev_priv->lvds_use_ssc && dev_priv->lvds_ssc_freq == 100)
644 refclk = 100;
645
646 if ((I915_READ(PCH_LVDS) & LVDS_CLKB_POWER_MASK) == 365 if ((I915_READ(PCH_LVDS) & LVDS_CLKB_POWER_MASK) ==
647 LVDS_CLKB_POWER_UP) { 366 LVDS_CLKB_POWER_UP) {
648 /* LVDS dual channel */ 367 /* LVDS dual channel */
649 if (refclk == 100) 368 if (refclk == 100000)
650 limit = &intel_limits_ironlake_dual_lvds_100m; 369 limit = &intel_limits_ironlake_dual_lvds_100m;
651 else 370 else
652 limit = &intel_limits_ironlake_dual_lvds; 371 limit = &intel_limits_ironlake_dual_lvds;
653 } else { 372 } else {
654 if (refclk == 100) 373 if (refclk == 100000)
655 limit = &intel_limits_ironlake_single_lvds_100m; 374 limit = &intel_limits_ironlake_single_lvds_100m;
656 else 375 else
657 limit = &intel_limits_ironlake_single_lvds; 376 limit = &intel_limits_ironlake_single_lvds;
@@ -692,25 +411,25 @@ static const intel_limit_t *intel_g4x_limit(struct drm_crtc *crtc)
692 return limit; 411 return limit;
693} 412}
694 413
695static const intel_limit_t *intel_limit(struct drm_crtc *crtc) 414static const intel_limit_t *intel_limit(struct drm_crtc *crtc, int refclk)
696{ 415{
697 struct drm_device *dev = crtc->dev; 416 struct drm_device *dev = crtc->dev;
698 const intel_limit_t *limit; 417 const intel_limit_t *limit;
699 418
700 if (HAS_PCH_SPLIT(dev)) 419 if (HAS_PCH_SPLIT(dev))
701 limit = intel_ironlake_limit(crtc); 420 limit = intel_ironlake_limit(crtc, refclk);
702 else if (IS_G4X(dev)) { 421 else if (IS_G4X(dev)) {
703 limit = intel_g4x_limit(crtc); 422 limit = intel_g4x_limit(crtc);
704 } else if (IS_I9XX(dev) && !IS_PINEVIEW(dev)) {
705 if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS))
706 limit = &intel_limits_i9xx_lvds;
707 else
708 limit = &intel_limits_i9xx_sdvo;
709 } else if (IS_PINEVIEW(dev)) { 423 } else if (IS_PINEVIEW(dev)) {
710 if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) 424 if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS))
711 limit = &intel_limits_pineview_lvds; 425 limit = &intel_limits_pineview_lvds;
712 else 426 else
713 limit = &intel_limits_pineview_sdvo; 427 limit = &intel_limits_pineview_sdvo;
428 } else if (!IS_GEN2(dev)) {
429 if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS))
430 limit = &intel_limits_i9xx_lvds;
431 else
432 limit = &intel_limits_i9xx_sdvo;
714 } else { 433 } else {
715 if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) 434 if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS))
716 limit = &intel_limits_i8xx_lvds; 435 limit = &intel_limits_i8xx_lvds;
@@ -744,20 +463,17 @@ static void intel_clock(struct drm_device *dev, int refclk, intel_clock_t *clock
744/** 463/**
745 * Returns whether any output on the specified pipe is of the specified type 464 * Returns whether any output on the specified pipe is of the specified type
746 */ 465 */
747bool intel_pipe_has_type (struct drm_crtc *crtc, int type) 466bool intel_pipe_has_type(struct drm_crtc *crtc, int type)
748{ 467{
749 struct drm_device *dev = crtc->dev; 468 struct drm_device *dev = crtc->dev;
750 struct drm_mode_config *mode_config = &dev->mode_config; 469 struct drm_mode_config *mode_config = &dev->mode_config;
751 struct drm_encoder *l_entry; 470 struct intel_encoder *encoder;
752 471
753 list_for_each_entry(l_entry, &mode_config->encoder_list, head) { 472 list_for_each_entry(encoder, &mode_config->encoder_list, base.head)
754 if (l_entry && l_entry->crtc == crtc) { 473 if (encoder->base.crtc == crtc && encoder->type == type)
755 struct intel_encoder *intel_encoder = enc_to_intel_encoder(l_entry); 474 return true;
756 if (intel_encoder->type == type) 475
757 return true; 476 return false;
758 }
759 }
760 return false;
761} 477}
762 478
763#define INTELPllInvalid(s) do { /* DRM_DEBUG(s); */ return false; } while (0) 479#define INTELPllInvalid(s) do { /* DRM_DEBUG(s); */ return false; } while (0)
@@ -766,11 +482,10 @@ bool intel_pipe_has_type (struct drm_crtc *crtc, int type)
766 * the given connectors. 482 * the given connectors.
767 */ 483 */
768 484
769static bool intel_PLL_is_valid(struct drm_crtc *crtc, intel_clock_t *clock) 485static bool intel_PLL_is_valid(struct drm_device *dev,
486 const intel_limit_t *limit,
487 const intel_clock_t *clock)
770{ 488{
771 const intel_limit_t *limit = intel_limit (crtc);
772 struct drm_device *dev = crtc->dev;
773
774 if (clock->p1 < limit->p1.min || limit->p1.max < clock->p1) 489 if (clock->p1 < limit->p1.min || limit->p1.max < clock->p1)
775 INTELPllInvalid ("p1 out of range\n"); 490 INTELPllInvalid ("p1 out of range\n");
776 if (clock->p < limit->p.min || limit->p.max < clock->p) 491 if (clock->p < limit->p.min || limit->p.max < clock->p)
@@ -842,8 +557,8 @@ intel_find_best_PLL(const intel_limit_t *limit, struct drm_crtc *crtc,
842 int this_err; 557 int this_err;
843 558
844 intel_clock(dev, refclk, &clock); 559 intel_clock(dev, refclk, &clock);
845 560 if (!intel_PLL_is_valid(dev, limit,
846 if (!intel_PLL_is_valid(crtc, &clock)) 561 &clock))
847 continue; 562 continue;
848 563
849 this_err = abs(clock.dot - target); 564 this_err = abs(clock.dot - target);
@@ -905,9 +620,11 @@ intel_g4x_find_best_PLL(const intel_limit_t *limit, struct drm_crtc *crtc,
905 int this_err; 620 int this_err;
906 621
907 intel_clock(dev, refclk, &clock); 622 intel_clock(dev, refclk, &clock);
908 if (!intel_PLL_is_valid(crtc, &clock)) 623 if (!intel_PLL_is_valid(dev, limit,
624 &clock))
909 continue; 625 continue;
910 this_err = abs(clock.dot - target) ; 626
627 this_err = abs(clock.dot - target);
911 if (this_err < err_most) { 628 if (this_err < err_most) {
912 *best_clock = clock; 629 *best_clock = clock;
913 err_most = this_err; 630 err_most = this_err;
@@ -928,10 +645,6 @@ intel_find_pll_ironlake_dp(const intel_limit_t *limit, struct drm_crtc *crtc,
928 struct drm_device *dev = crtc->dev; 645 struct drm_device *dev = crtc->dev;
929 intel_clock_t clock; 646 intel_clock_t clock;
930 647
931 /* return directly when it is eDP */
932 if (HAS_eDP)
933 return true;
934
935 if (target < 200000) { 648 if (target < 200000) {
936 clock.n = 1; 649 clock.n = 1;
937 clock.p1 = 2; 650 clock.p1 = 2;
@@ -955,26 +668,26 @@ static bool
955intel_find_pll_g4x_dp(const intel_limit_t *limit, struct drm_crtc *crtc, 668intel_find_pll_g4x_dp(const intel_limit_t *limit, struct drm_crtc *crtc,
956 int target, int refclk, intel_clock_t *best_clock) 669 int target, int refclk, intel_clock_t *best_clock)
957{ 670{
958 intel_clock_t clock; 671 intel_clock_t clock;
959 if (target < 200000) { 672 if (target < 200000) {
960 clock.p1 = 2; 673 clock.p1 = 2;
961 clock.p2 = 10; 674 clock.p2 = 10;
962 clock.n = 2; 675 clock.n = 2;
963 clock.m1 = 23; 676 clock.m1 = 23;
964 clock.m2 = 8; 677 clock.m2 = 8;
965 } else { 678 } else {
966 clock.p1 = 1; 679 clock.p1 = 1;
967 clock.p2 = 10; 680 clock.p2 = 10;
968 clock.n = 1; 681 clock.n = 1;
969 clock.m1 = 14; 682 clock.m1 = 14;
970 clock.m2 = 2; 683 clock.m2 = 2;
971 } 684 }
972 clock.m = 5 * (clock.m1 + 2) + (clock.m2 + 2); 685 clock.m = 5 * (clock.m1 + 2) + (clock.m2 + 2);
973 clock.p = (clock.p1 * clock.p2); 686 clock.p = (clock.p1 * clock.p2);
974 clock.dot = 96000 * clock.m / (clock.n + 2) / clock.p; 687 clock.dot = 96000 * clock.m / (clock.n + 2) / clock.p;
975 clock.vco = 0; 688 clock.vco = 0;
976 memcpy(best_clock, &clock, sizeof(intel_clock_t)); 689 memcpy(best_clock, &clock, sizeof(intel_clock_t));
977 return true; 690 return true;
978} 691}
979 692
980/** 693/**
@@ -988,7 +701,7 @@ intel_find_pll_g4x_dp(const intel_limit_t *limit, struct drm_crtc *crtc,
988void intel_wait_for_vblank(struct drm_device *dev, int pipe) 701void intel_wait_for_vblank(struct drm_device *dev, int pipe)
989{ 702{
990 struct drm_i915_private *dev_priv = dev->dev_private; 703 struct drm_i915_private *dev_priv = dev->dev_private;
991 int pipestat_reg = (pipe == 0 ? PIPEASTAT : PIPEBSTAT); 704 int pipestat_reg = PIPESTAT(pipe);
992 705
993 /* Clear existing vblank status. Note this will clear any other 706 /* Clear existing vblank status. Note this will clear any other
994 * sticky status fields as well. 707 * sticky status fields as well.
@@ -1007,9 +720,9 @@ void intel_wait_for_vblank(struct drm_device *dev, int pipe)
1007 I915_READ(pipestat_reg) | PIPE_VBLANK_INTERRUPT_STATUS); 720 I915_READ(pipestat_reg) | PIPE_VBLANK_INTERRUPT_STATUS);
1008 721
1009 /* Wait for vblank interrupt bit to set */ 722 /* Wait for vblank interrupt bit to set */
1010 if (wait_for((I915_READ(pipestat_reg) & 723 if (wait_for(I915_READ(pipestat_reg) &
1011 PIPE_VBLANK_INTERRUPT_STATUS), 724 PIPE_VBLANK_INTERRUPT_STATUS,
1012 50, 0)) 725 50))
1013 DRM_DEBUG_KMS("vblank wait timed out\n"); 726 DRM_DEBUG_KMS("vblank wait timed out\n");
1014} 727}
1015 728
@@ -1028,47 +741,664 @@ void intel_wait_for_vblank(struct drm_device *dev, int pipe)
1028 * Otherwise: 741 * Otherwise:
1029 * wait for the display line value to settle (it usually 742 * wait for the display line value to settle (it usually
1030 * ends up stopping at the start of the next frame). 743 * ends up stopping at the start of the next frame).
1031 * 744 *
1032 */ 745 */
1033static void intel_wait_for_pipe_off(struct drm_device *dev, int pipe) 746void intel_wait_for_pipe_off(struct drm_device *dev, int pipe)
1034{ 747{
1035 struct drm_i915_private *dev_priv = dev->dev_private; 748 struct drm_i915_private *dev_priv = dev->dev_private;
1036 749
1037 if (INTEL_INFO(dev)->gen >= 4) { 750 if (INTEL_INFO(dev)->gen >= 4) {
1038 int pipeconf_reg = (pipe == 0 ? PIPEACONF : PIPEBCONF); 751 int reg = PIPECONF(pipe);
1039 752
1040 /* Wait for the Pipe State to go off */ 753 /* Wait for the Pipe State to go off */
1041 if (wait_for((I915_READ(pipeconf_reg) & I965_PIPECONF_ACTIVE) == 0, 754 if (wait_for((I915_READ(reg) & I965_PIPECONF_ACTIVE) == 0,
1042 100, 0)) 755 100))
1043 DRM_DEBUG_KMS("pipe_off wait timed out\n"); 756 DRM_DEBUG_KMS("pipe_off wait timed out\n");
1044 } else { 757 } else {
1045 u32 last_line; 758 u32 last_line;
1046 int pipedsl_reg = (pipe == 0 ? PIPEADSL : PIPEBDSL); 759 int reg = PIPEDSL(pipe);
1047 unsigned long timeout = jiffies + msecs_to_jiffies(100); 760 unsigned long timeout = jiffies + msecs_to_jiffies(100);
1048 761
1049 /* Wait for the display line to settle */ 762 /* Wait for the display line to settle */
1050 do { 763 do {
1051 last_line = I915_READ(pipedsl_reg) & DSL_LINEMASK; 764 last_line = I915_READ(reg) & DSL_LINEMASK;
1052 mdelay(5); 765 mdelay(5);
1053 } while (((I915_READ(pipedsl_reg) & DSL_LINEMASK) != last_line) && 766 } while (((I915_READ(reg) & DSL_LINEMASK) != last_line) &&
1054 time_after(timeout, jiffies)); 767 time_after(timeout, jiffies));
1055 if (time_after(jiffies, timeout)) 768 if (time_after(jiffies, timeout))
1056 DRM_DEBUG_KMS("pipe_off wait timed out\n"); 769 DRM_DEBUG_KMS("pipe_off wait timed out\n");
1057 } 770 }
1058} 771}
1059 772
1060/* Parameters have changed, update FBC info */ 773static const char *state_string(bool enabled)
774{
775 return enabled ? "on" : "off";
776}
777
778/* Only for pre-ILK configs */
779static void assert_pll(struct drm_i915_private *dev_priv,
780 enum pipe pipe, bool state)
781{
782 int reg;
783 u32 val;
784 bool cur_state;
785
786 reg = DPLL(pipe);
787 val = I915_READ(reg);
788 cur_state = !!(val & DPLL_VCO_ENABLE);
789 WARN(cur_state != state,
790 "PLL state assertion failure (expected %s, current %s)\n",
791 state_string(state), state_string(cur_state));
792}
793#define assert_pll_enabled(d, p) assert_pll(d, p, true)
794#define assert_pll_disabled(d, p) assert_pll(d, p, false)
795
796/* For ILK+ */
797static void assert_pch_pll(struct drm_i915_private *dev_priv,
798 enum pipe pipe, bool state)
799{
800 int reg;
801 u32 val;
802 bool cur_state;
803
804 reg = PCH_DPLL(pipe);
805 val = I915_READ(reg);
806 cur_state = !!(val & DPLL_VCO_ENABLE);
807 WARN(cur_state != state,
808 "PCH PLL state assertion failure (expected %s, current %s)\n",
809 state_string(state), state_string(cur_state));
810}
811#define assert_pch_pll_enabled(d, p) assert_pch_pll(d, p, true)
812#define assert_pch_pll_disabled(d, p) assert_pch_pll(d, p, false)
813
814static void assert_fdi_tx(struct drm_i915_private *dev_priv,
815 enum pipe pipe, bool state)
816{
817 int reg;
818 u32 val;
819 bool cur_state;
820
821 reg = FDI_TX_CTL(pipe);
822 val = I915_READ(reg);
823 cur_state = !!(val & FDI_TX_ENABLE);
824 WARN(cur_state != state,
825 "FDI TX state assertion failure (expected %s, current %s)\n",
826 state_string(state), state_string(cur_state));
827}
828#define assert_fdi_tx_enabled(d, p) assert_fdi_tx(d, p, true)
829#define assert_fdi_tx_disabled(d, p) assert_fdi_tx(d, p, false)
830
831static void assert_fdi_rx(struct drm_i915_private *dev_priv,
832 enum pipe pipe, bool state)
833{
834 int reg;
835 u32 val;
836 bool cur_state;
837
838 reg = FDI_RX_CTL(pipe);
839 val = I915_READ(reg);
840 cur_state = !!(val & FDI_RX_ENABLE);
841 WARN(cur_state != state,
842 "FDI RX state assertion failure (expected %s, current %s)\n",
843 state_string(state), state_string(cur_state));
844}
845#define assert_fdi_rx_enabled(d, p) assert_fdi_rx(d, p, true)
846#define assert_fdi_rx_disabled(d, p) assert_fdi_rx(d, p, false)
847
848static void assert_fdi_tx_pll_enabled(struct drm_i915_private *dev_priv,
849 enum pipe pipe)
850{
851 int reg;
852 u32 val;
853
854 /* ILK FDI PLL is always enabled */
855 if (dev_priv->info->gen == 5)
856 return;
857
858 reg = FDI_TX_CTL(pipe);
859 val = I915_READ(reg);
860 WARN(!(val & FDI_TX_PLL_ENABLE), "FDI TX PLL assertion failure, should be active but is disabled\n");
861}
862
863static void assert_fdi_rx_pll_enabled(struct drm_i915_private *dev_priv,
864 enum pipe pipe)
865{
866 int reg;
867 u32 val;
868
869 reg = FDI_RX_CTL(pipe);
870 val = I915_READ(reg);
871 WARN(!(val & FDI_RX_PLL_ENABLE), "FDI RX PLL assertion failure, should be active but is disabled\n");
872}
873
874static void assert_panel_unlocked(struct drm_i915_private *dev_priv,
875 enum pipe pipe)
876{
877 int pp_reg, lvds_reg;
878 u32 val;
879 enum pipe panel_pipe = PIPE_A;
880 bool locked = locked;
881
882 if (HAS_PCH_SPLIT(dev_priv->dev)) {
883 pp_reg = PCH_PP_CONTROL;
884 lvds_reg = PCH_LVDS;
885 } else {
886 pp_reg = PP_CONTROL;
887 lvds_reg = LVDS;
888 }
889
890 val = I915_READ(pp_reg);
891 if (!(val & PANEL_POWER_ON) ||
892 ((val & PANEL_UNLOCK_REGS) == PANEL_UNLOCK_REGS))
893 locked = false;
894
895 if (I915_READ(lvds_reg) & LVDS_PIPEB_SELECT)
896 panel_pipe = PIPE_B;
897
898 WARN(panel_pipe == pipe && locked,
899 "panel assertion failure, pipe %c regs locked\n",
900 pipe_name(pipe));
901}
902
903static void assert_pipe(struct drm_i915_private *dev_priv,
904 enum pipe pipe, bool state)
905{
906 int reg;
907 u32 val;
908 bool cur_state;
909
910 reg = PIPECONF(pipe);
911 val = I915_READ(reg);
912 cur_state = !!(val & PIPECONF_ENABLE);
913 WARN(cur_state != state,
914 "pipe %c assertion failure (expected %s, current %s)\n",
915 pipe_name(pipe), state_string(state), state_string(cur_state));
916}
917#define assert_pipe_enabled(d, p) assert_pipe(d, p, true)
918#define assert_pipe_disabled(d, p) assert_pipe(d, p, false)
919
920static void assert_plane_enabled(struct drm_i915_private *dev_priv,
921 enum plane plane)
922{
923 int reg;
924 u32 val;
925
926 reg = DSPCNTR(plane);
927 val = I915_READ(reg);
928 WARN(!(val & DISPLAY_PLANE_ENABLE),
929 "plane %c assertion failure, should be active but is disabled\n",
930 plane_name(plane));
931}
932
933static void assert_planes_disabled(struct drm_i915_private *dev_priv,
934 enum pipe pipe)
935{
936 int reg, i;
937 u32 val;
938 int cur_pipe;
939
940 /* Planes are fixed to pipes on ILK+ */
941 if (HAS_PCH_SPLIT(dev_priv->dev))
942 return;
943
944 /* Need to check both planes against the pipe */
945 for (i = 0; i < 2; i++) {
946 reg = DSPCNTR(i);
947 val = I915_READ(reg);
948 cur_pipe = (val & DISPPLANE_SEL_PIPE_MASK) >>
949 DISPPLANE_SEL_PIPE_SHIFT;
950 WARN((val & DISPLAY_PLANE_ENABLE) && pipe == cur_pipe,
951 "plane %c assertion failure, should be off on pipe %c but is still active\n",
952 plane_name(i), pipe_name(pipe));
953 }
954}
955
956static void assert_pch_refclk_enabled(struct drm_i915_private *dev_priv)
957{
958 u32 val;
959 bool enabled;
960
961 val = I915_READ(PCH_DREF_CONTROL);
962 enabled = !!(val & (DREF_SSC_SOURCE_MASK | DREF_NONSPREAD_SOURCE_MASK |
963 DREF_SUPERSPREAD_SOURCE_MASK));
964 WARN(!enabled, "PCH refclk assertion failure, should be active but is disabled\n");
965}
966
967static void assert_transcoder_disabled(struct drm_i915_private *dev_priv,
968 enum pipe pipe)
969{
970 int reg;
971 u32 val;
972 bool enabled;
973
974 reg = TRANSCONF(pipe);
975 val = I915_READ(reg);
976 enabled = !!(val & TRANS_ENABLE);
977 WARN(enabled,
978 "transcoder assertion failed, should be off on pipe %c but is still active\n",
979 pipe_name(pipe));
980}
981
982static void assert_pch_dp_disabled(struct drm_i915_private *dev_priv,
983 enum pipe pipe, int reg)
984{
985 u32 val = I915_READ(reg);
986 WARN(DP_PIPE_ENABLED(val, pipe),
987 "PCH DP (0x%08x) enabled on transcoder %c, should be disabled\n",
988 reg, pipe_name(pipe));
989}
990
991static void assert_pch_hdmi_disabled(struct drm_i915_private *dev_priv,
992 enum pipe pipe, int reg)
993{
994 u32 val = I915_READ(reg);
995 WARN(HDMI_PIPE_ENABLED(val, pipe),
996 "PCH DP (0x%08x) enabled on transcoder %c, should be disabled\n",
997 reg, pipe_name(pipe));
998}
999
1000static void assert_pch_ports_disabled(struct drm_i915_private *dev_priv,
1001 enum pipe pipe)
1002{
1003 int reg;
1004 u32 val;
1005
1006 assert_pch_dp_disabled(dev_priv, pipe, PCH_DP_B);
1007 assert_pch_dp_disabled(dev_priv, pipe, PCH_DP_C);
1008 assert_pch_dp_disabled(dev_priv, pipe, PCH_DP_D);
1009
1010 reg = PCH_ADPA;
1011 val = I915_READ(reg);
1012 WARN(ADPA_PIPE_ENABLED(val, pipe),
1013 "PCH VGA enabled on transcoder %c, should be disabled\n",
1014 pipe_name(pipe));
1015
1016 reg = PCH_LVDS;
1017 val = I915_READ(reg);
1018 WARN(LVDS_PIPE_ENABLED(val, pipe),
1019 "PCH LVDS enabled on transcoder %c, should be disabled\n",
1020 pipe_name(pipe));
1021
1022 assert_pch_hdmi_disabled(dev_priv, pipe, HDMIB);
1023 assert_pch_hdmi_disabled(dev_priv, pipe, HDMIC);
1024 assert_pch_hdmi_disabled(dev_priv, pipe, HDMID);
1025}
1026
1027/**
1028 * intel_enable_pll - enable a PLL
1029 * @dev_priv: i915 private structure
1030 * @pipe: pipe PLL to enable
1031 *
1032 * Enable @pipe's PLL so we can start pumping pixels from a plane. Check to
1033 * make sure the PLL reg is writable first though, since the panel write
1034 * protect mechanism may be enabled.
1035 *
1036 * Note! This is for pre-ILK only.
1037 */
1038static void intel_enable_pll(struct drm_i915_private *dev_priv, enum pipe pipe)
1039{
1040 int reg;
1041 u32 val;
1042
1043 /* No really, not for ILK+ */
1044 BUG_ON(dev_priv->info->gen >= 5);
1045
1046 /* PLL is protected by panel, make sure we can write it */
1047 if (IS_MOBILE(dev_priv->dev) && !IS_I830(dev_priv->dev))
1048 assert_panel_unlocked(dev_priv, pipe);
1049
1050 reg = DPLL(pipe);
1051 val = I915_READ(reg);
1052 val |= DPLL_VCO_ENABLE;
1053
1054 /* We do this three times for luck */
1055 I915_WRITE(reg, val);
1056 POSTING_READ(reg);
1057 udelay(150); /* wait for warmup */
1058 I915_WRITE(reg, val);
1059 POSTING_READ(reg);
1060 udelay(150); /* wait for warmup */
1061 I915_WRITE(reg, val);
1062 POSTING_READ(reg);
1063 udelay(150); /* wait for warmup */
1064}
1065
1066/**
1067 * intel_disable_pll - disable a PLL
1068 * @dev_priv: i915 private structure
1069 * @pipe: pipe PLL to disable
1070 *
1071 * Disable the PLL for @pipe, making sure the pipe is off first.
1072 *
1073 * Note! This is for pre-ILK only.
1074 */
1075static void intel_disable_pll(struct drm_i915_private *dev_priv, enum pipe pipe)
1076{
1077 int reg;
1078 u32 val;
1079
1080 /* Don't disable pipe A or pipe A PLLs if needed */
1081 if (pipe == PIPE_A && (dev_priv->quirks & QUIRK_PIPEA_FORCE))
1082 return;
1083
1084 /* Make sure the pipe isn't still relying on us */
1085 assert_pipe_disabled(dev_priv, pipe);
1086
1087 reg = DPLL(pipe);
1088 val = I915_READ(reg);
1089 val &= ~DPLL_VCO_ENABLE;
1090 I915_WRITE(reg, val);
1091 POSTING_READ(reg);
1092}
1093
1094/**
1095 * intel_enable_pch_pll - enable PCH PLL
1096 * @dev_priv: i915 private structure
1097 * @pipe: pipe PLL to enable
1098 *
1099 * The PCH PLL needs to be enabled before the PCH transcoder, since it
1100 * drives the transcoder clock.
1101 */
1102static void intel_enable_pch_pll(struct drm_i915_private *dev_priv,
1103 enum pipe pipe)
1104{
1105 int reg;
1106 u32 val;
1107
1108 /* PCH only available on ILK+ */
1109 BUG_ON(dev_priv->info->gen < 5);
1110
1111 /* PCH refclock must be enabled first */
1112 assert_pch_refclk_enabled(dev_priv);
1113
1114 reg = PCH_DPLL(pipe);
1115 val = I915_READ(reg);
1116 val |= DPLL_VCO_ENABLE;
1117 I915_WRITE(reg, val);
1118 POSTING_READ(reg);
1119 udelay(200);
1120}
1121
1122static void intel_disable_pch_pll(struct drm_i915_private *dev_priv,
1123 enum pipe pipe)
1124{
1125 int reg;
1126 u32 val;
1127
1128 /* PCH only available on ILK+ */
1129 BUG_ON(dev_priv->info->gen < 5);
1130
1131 /* Make sure transcoder isn't still depending on us */
1132 assert_transcoder_disabled(dev_priv, pipe);
1133
1134 reg = PCH_DPLL(pipe);
1135 val = I915_READ(reg);
1136 val &= ~DPLL_VCO_ENABLE;
1137 I915_WRITE(reg, val);
1138 POSTING_READ(reg);
1139 udelay(200);
1140}
1141
1142static void intel_enable_transcoder(struct drm_i915_private *dev_priv,
1143 enum pipe pipe)
1144{
1145 int reg;
1146 u32 val;
1147
1148 /* PCH only available on ILK+ */
1149 BUG_ON(dev_priv->info->gen < 5);
1150
1151 /* Make sure PCH DPLL is enabled */
1152 assert_pch_pll_enabled(dev_priv, pipe);
1153
1154 /* FDI must be feeding us bits for PCH ports */
1155 assert_fdi_tx_enabled(dev_priv, pipe);
1156 assert_fdi_rx_enabled(dev_priv, pipe);
1157
1158 reg = TRANSCONF(pipe);
1159 val = I915_READ(reg);
1160 /*
1161 * make the BPC in transcoder be consistent with
1162 * that in pipeconf reg.
1163 */
1164 val &= ~PIPE_BPC_MASK;
1165 val |= I915_READ(PIPECONF(pipe)) & PIPE_BPC_MASK;
1166 I915_WRITE(reg, val | TRANS_ENABLE);
1167 if (wait_for(I915_READ(reg) & TRANS_STATE_ENABLE, 100))
1168 DRM_ERROR("failed to enable transcoder %d\n", pipe);
1169}
1170
1171static void intel_disable_transcoder(struct drm_i915_private *dev_priv,
1172 enum pipe pipe)
1173{
1174 int reg;
1175 u32 val;
1176
1177 /* FDI relies on the transcoder */
1178 assert_fdi_tx_disabled(dev_priv, pipe);
1179 assert_fdi_rx_disabled(dev_priv, pipe);
1180
1181 /* Ports must be off as well */
1182 assert_pch_ports_disabled(dev_priv, pipe);
1183
1184 reg = TRANSCONF(pipe);
1185 val = I915_READ(reg);
1186 val &= ~TRANS_ENABLE;
1187 I915_WRITE(reg, val);
1188 /* wait for PCH transcoder off, transcoder state */
1189 if (wait_for((I915_READ(reg) & TRANS_STATE_ENABLE) == 0, 50))
1190 DRM_ERROR("failed to disable transcoder\n");
1191}
1192
1193/**
1194 * intel_enable_pipe - enable a pipe, asserting requirements
1195 * @dev_priv: i915 private structure
1196 * @pipe: pipe to enable
1197 * @pch_port: on ILK+, is this pipe driving a PCH port or not
1198 *
1199 * Enable @pipe, making sure that various hardware specific requirements
1200 * are met, if applicable, e.g. PLL enabled, LVDS pairs enabled, etc.
1201 *
1202 * @pipe should be %PIPE_A or %PIPE_B.
1203 *
1204 * Will wait until the pipe is actually running (i.e. first vblank) before
1205 * returning.
1206 */
1207static void intel_enable_pipe(struct drm_i915_private *dev_priv, enum pipe pipe,
1208 bool pch_port)
1209{
1210 int reg;
1211 u32 val;
1212
1213 /*
1214 * A pipe without a PLL won't actually be able to drive bits from
1215 * a plane. On ILK+ the pipe PLLs are integrated, so we don't
1216 * need the check.
1217 */
1218 if (!HAS_PCH_SPLIT(dev_priv->dev))
1219 assert_pll_enabled(dev_priv, pipe);
1220 else {
1221 if (pch_port) {
1222 /* if driving the PCH, we need FDI enabled */
1223 assert_fdi_rx_pll_enabled(dev_priv, pipe);
1224 assert_fdi_tx_pll_enabled(dev_priv, pipe);
1225 }
1226 /* FIXME: assert CPU port conditions for SNB+ */
1227 }
1228
1229 reg = PIPECONF(pipe);
1230 val = I915_READ(reg);
1231 if (val & PIPECONF_ENABLE)
1232 return;
1233
1234 I915_WRITE(reg, val | PIPECONF_ENABLE);
1235 intel_wait_for_vblank(dev_priv->dev, pipe);
1236}
1237
1238/**
1239 * intel_disable_pipe - disable a pipe, asserting requirements
1240 * @dev_priv: i915 private structure
1241 * @pipe: pipe to disable
1242 *
1243 * Disable @pipe, making sure that various hardware specific requirements
1244 * are met, if applicable, e.g. plane disabled, panel fitter off, etc.
1245 *
1246 * @pipe should be %PIPE_A or %PIPE_B.
1247 *
1248 * Will wait until the pipe has shut down before returning.
1249 */
1250static void intel_disable_pipe(struct drm_i915_private *dev_priv,
1251 enum pipe pipe)
1252{
1253 int reg;
1254 u32 val;
1255
1256 /*
1257 * Make sure planes won't keep trying to pump pixels to us,
1258 * or we might hang the display.
1259 */
1260 assert_planes_disabled(dev_priv, pipe);
1261
1262 /* Don't disable pipe A or pipe A PLLs if needed */
1263 if (pipe == PIPE_A && (dev_priv->quirks & QUIRK_PIPEA_FORCE))
1264 return;
1265
1266 reg = PIPECONF(pipe);
1267 val = I915_READ(reg);
1268 if ((val & PIPECONF_ENABLE) == 0)
1269 return;
1270
1271 I915_WRITE(reg, val & ~PIPECONF_ENABLE);
1272 intel_wait_for_pipe_off(dev_priv->dev, pipe);
1273}
1274
1275/**
1276 * intel_enable_plane - enable a display plane on a given pipe
1277 * @dev_priv: i915 private structure
1278 * @plane: plane to enable
1279 * @pipe: pipe being fed
1280 *
1281 * Enable @plane on @pipe, making sure that @pipe is running first.
1282 */
1283static void intel_enable_plane(struct drm_i915_private *dev_priv,
1284 enum plane plane, enum pipe pipe)
1285{
1286 int reg;
1287 u32 val;
1288
1289 /* If the pipe isn't enabled, we can't pump pixels and may hang */
1290 assert_pipe_enabled(dev_priv, pipe);
1291
1292 reg = DSPCNTR(plane);
1293 val = I915_READ(reg);
1294 if (val & DISPLAY_PLANE_ENABLE)
1295 return;
1296
1297 I915_WRITE(reg, val | DISPLAY_PLANE_ENABLE);
1298 intel_wait_for_vblank(dev_priv->dev, pipe);
1299}
1300
1301/*
1302 * Plane regs are double buffered, going from enabled->disabled needs a
1303 * trigger in order to latch. The display address reg provides this.
1304 */
1305static void intel_flush_display_plane(struct drm_i915_private *dev_priv,
1306 enum plane plane)
1307{
1308 u32 reg = DSPADDR(plane);
1309 I915_WRITE(reg, I915_READ(reg));
1310}
1311
1312/**
1313 * intel_disable_plane - disable a display plane
1314 * @dev_priv: i915 private structure
1315 * @plane: plane to disable
1316 * @pipe: pipe consuming the data
1317 *
1318 * Disable @plane; should be an independent operation.
1319 */
1320static void intel_disable_plane(struct drm_i915_private *dev_priv,
1321 enum plane plane, enum pipe pipe)
1322{
1323 int reg;
1324 u32 val;
1325
1326 reg = DSPCNTR(plane);
1327 val = I915_READ(reg);
1328 if ((val & DISPLAY_PLANE_ENABLE) == 0)
1329 return;
1330
1331 I915_WRITE(reg, val & ~DISPLAY_PLANE_ENABLE);
1332 intel_flush_display_plane(dev_priv, plane);
1333 intel_wait_for_vblank(dev_priv->dev, pipe);
1334}
1335
1336static void disable_pch_dp(struct drm_i915_private *dev_priv,
1337 enum pipe pipe, int reg)
1338{
1339 u32 val = I915_READ(reg);
1340 if (DP_PIPE_ENABLED(val, pipe))
1341 I915_WRITE(reg, val & ~DP_PORT_EN);
1342}
1343
1344static void disable_pch_hdmi(struct drm_i915_private *dev_priv,
1345 enum pipe pipe, int reg)
1346{
1347 u32 val = I915_READ(reg);
1348 if (HDMI_PIPE_ENABLED(val, pipe))
1349 I915_WRITE(reg, val & ~PORT_ENABLE);
1350}
1351
1352/* Disable any ports connected to this transcoder */
1353static void intel_disable_pch_ports(struct drm_i915_private *dev_priv,
1354 enum pipe pipe)
1355{
1356 u32 reg, val;
1357
1358 val = I915_READ(PCH_PP_CONTROL);
1359 I915_WRITE(PCH_PP_CONTROL, val | PANEL_UNLOCK_REGS);
1360
1361 disable_pch_dp(dev_priv, pipe, PCH_DP_B);
1362 disable_pch_dp(dev_priv, pipe, PCH_DP_C);
1363 disable_pch_dp(dev_priv, pipe, PCH_DP_D);
1364
1365 reg = PCH_ADPA;
1366 val = I915_READ(reg);
1367 if (ADPA_PIPE_ENABLED(val, pipe))
1368 I915_WRITE(reg, val & ~ADPA_DAC_ENABLE);
1369
1370 reg = PCH_LVDS;
1371 val = I915_READ(reg);
1372 if (LVDS_PIPE_ENABLED(val, pipe)) {
1373 I915_WRITE(reg, val & ~LVDS_PORT_EN);
1374 POSTING_READ(reg);
1375 udelay(100);
1376 }
1377
1378 disable_pch_hdmi(dev_priv, pipe, HDMIB);
1379 disable_pch_hdmi(dev_priv, pipe, HDMIC);
1380 disable_pch_hdmi(dev_priv, pipe, HDMID);
1381}
1382
1061static void i8xx_enable_fbc(struct drm_crtc *crtc, unsigned long interval) 1383static void i8xx_enable_fbc(struct drm_crtc *crtc, unsigned long interval)
1062{ 1384{
1063 struct drm_device *dev = crtc->dev; 1385 struct drm_device *dev = crtc->dev;
1064 struct drm_i915_private *dev_priv = dev->dev_private; 1386 struct drm_i915_private *dev_priv = dev->dev_private;
1065 struct drm_framebuffer *fb = crtc->fb; 1387 struct drm_framebuffer *fb = crtc->fb;
1066 struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb); 1388 struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
1067 struct drm_i915_gem_object *obj_priv = to_intel_bo(intel_fb->obj); 1389 struct drm_i915_gem_object *obj = intel_fb->obj;
1068 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 1390 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
1069 int plane, i; 1391 int plane, i;
1070 u32 fbc_ctl, fbc_ctl2; 1392 u32 fbc_ctl, fbc_ctl2;
1071 1393
1394 if (fb->pitch == dev_priv->cfb_pitch &&
1395 obj->fence_reg == dev_priv->cfb_fence &&
1396 intel_crtc->plane == dev_priv->cfb_plane &&
1397 I915_READ(FBC_CONTROL) & FBC_CTL_EN)
1398 return;
1399
1400 i8xx_disable_fbc(dev);
1401
1072 dev_priv->cfb_pitch = dev_priv->cfb_size / FBC_LL_SIZE; 1402 dev_priv->cfb_pitch = dev_priv->cfb_size / FBC_LL_SIZE;
1073 1403
1074 if (fb->pitch < dev_priv->cfb_pitch) 1404 if (fb->pitch < dev_priv->cfb_pitch)
@@ -1076,7 +1406,7 @@ static void i8xx_enable_fbc(struct drm_crtc *crtc, unsigned long interval)
1076 1406
1077 /* FBC_CTL wants 64B units */ 1407 /* FBC_CTL wants 64B units */
1078 dev_priv->cfb_pitch = (dev_priv->cfb_pitch / 64) - 1; 1408 dev_priv->cfb_pitch = (dev_priv->cfb_pitch / 64) - 1;
1079 dev_priv->cfb_fence = obj_priv->fence_reg; 1409 dev_priv->cfb_fence = obj->fence_reg;
1080 dev_priv->cfb_plane = intel_crtc->plane; 1410 dev_priv->cfb_plane = intel_crtc->plane;
1081 plane = dev_priv->cfb_plane == 0 ? FBC_CTL_PLANEA : FBC_CTL_PLANEB; 1411 plane = dev_priv->cfb_plane == 0 ? FBC_CTL_PLANEA : FBC_CTL_PLANEB;
1082 1412
@@ -1086,7 +1416,7 @@ static void i8xx_enable_fbc(struct drm_crtc *crtc, unsigned long interval)
1086 1416
1087 /* Set it up... */ 1417 /* Set it up... */
1088 fbc_ctl2 = FBC_CTL_FENCE_DBL | FBC_CTL_IDLE_IMM | plane; 1418 fbc_ctl2 = FBC_CTL_FENCE_DBL | FBC_CTL_IDLE_IMM | plane;
1089 if (obj_priv->tiling_mode != I915_TILING_NONE) 1419 if (obj->tiling_mode != I915_TILING_NONE)
1090 fbc_ctl2 |= FBC_CTL_CPU_FENCE; 1420 fbc_ctl2 |= FBC_CTL_CPU_FENCE;
1091 I915_WRITE(FBC_CONTROL2, fbc_ctl2); 1421 I915_WRITE(FBC_CONTROL2, fbc_ctl2);
1092 I915_WRITE(FBC_FENCE_OFF, crtc->y); 1422 I915_WRITE(FBC_FENCE_OFF, crtc->y);
@@ -1097,12 +1427,12 @@ static void i8xx_enable_fbc(struct drm_crtc *crtc, unsigned long interval)
1097 fbc_ctl |= FBC_CTL_C3_IDLE; /* 945 needs special SR handling */ 1427 fbc_ctl |= FBC_CTL_C3_IDLE; /* 945 needs special SR handling */
1098 fbc_ctl |= (dev_priv->cfb_pitch & 0xff) << FBC_CTL_STRIDE_SHIFT; 1428 fbc_ctl |= (dev_priv->cfb_pitch & 0xff) << FBC_CTL_STRIDE_SHIFT;
1099 fbc_ctl |= (interval & 0x2fff) << FBC_CTL_INTERVAL_SHIFT; 1429 fbc_ctl |= (interval & 0x2fff) << FBC_CTL_INTERVAL_SHIFT;
1100 if (obj_priv->tiling_mode != I915_TILING_NONE) 1430 if (obj->tiling_mode != I915_TILING_NONE)
1101 fbc_ctl |= dev_priv->cfb_fence; 1431 fbc_ctl |= dev_priv->cfb_fence;
1102 I915_WRITE(FBC_CONTROL, fbc_ctl); 1432 I915_WRITE(FBC_CONTROL, fbc_ctl);
1103 1433
1104 DRM_DEBUG_KMS("enabled FBC, pitch %ld, yoff %d, plane %d, ", 1434 DRM_DEBUG_KMS("enabled FBC, pitch %ld, yoff %d, plane %d, ",
1105 dev_priv->cfb_pitch, crtc->y, dev_priv->cfb_plane); 1435 dev_priv->cfb_pitch, crtc->y, dev_priv->cfb_plane);
1106} 1436}
1107 1437
1108void i8xx_disable_fbc(struct drm_device *dev) 1438void i8xx_disable_fbc(struct drm_device *dev)
@@ -1110,19 +1440,16 @@ void i8xx_disable_fbc(struct drm_device *dev)
1110 struct drm_i915_private *dev_priv = dev->dev_private; 1440 struct drm_i915_private *dev_priv = dev->dev_private;
1111 u32 fbc_ctl; 1441 u32 fbc_ctl;
1112 1442
1113 if (!I915_HAS_FBC(dev))
1114 return;
1115
1116 if (!(I915_READ(FBC_CONTROL) & FBC_CTL_EN))
1117 return; /* Already off, just return */
1118
1119 /* Disable compression */ 1443 /* Disable compression */
1120 fbc_ctl = I915_READ(FBC_CONTROL); 1444 fbc_ctl = I915_READ(FBC_CONTROL);
1445 if ((fbc_ctl & FBC_CTL_EN) == 0)
1446 return;
1447
1121 fbc_ctl &= ~FBC_CTL_EN; 1448 fbc_ctl &= ~FBC_CTL_EN;
1122 I915_WRITE(FBC_CONTROL, fbc_ctl); 1449 I915_WRITE(FBC_CONTROL, fbc_ctl);
1123 1450
1124 /* Wait for compressing bit to clear */ 1451 /* Wait for compressing bit to clear */
1125 if (wait_for((I915_READ(FBC_STATUS) & FBC_STAT_COMPRESSING) == 0, 10, 0)) { 1452 if (wait_for((I915_READ(FBC_STATUS) & FBC_STAT_COMPRESSING) == 0, 10)) {
1126 DRM_DEBUG_KMS("FBC idle timed out\n"); 1453 DRM_DEBUG_KMS("FBC idle timed out\n");
1127 return; 1454 return;
1128 } 1455 }
@@ -1143,26 +1470,37 @@ static void g4x_enable_fbc(struct drm_crtc *crtc, unsigned long interval)
1143 struct drm_i915_private *dev_priv = dev->dev_private; 1470 struct drm_i915_private *dev_priv = dev->dev_private;
1144 struct drm_framebuffer *fb = crtc->fb; 1471 struct drm_framebuffer *fb = crtc->fb;
1145 struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb); 1472 struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
1146 struct drm_i915_gem_object *obj_priv = to_intel_bo(intel_fb->obj); 1473 struct drm_i915_gem_object *obj = intel_fb->obj;
1147 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 1474 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
1148 int plane = (intel_crtc->plane == 0 ? DPFC_CTL_PLANEA : 1475 int plane = intel_crtc->plane == 0 ? DPFC_CTL_PLANEA : DPFC_CTL_PLANEB;
1149 DPFC_CTL_PLANEB);
1150 unsigned long stall_watermark = 200; 1476 unsigned long stall_watermark = 200;
1151 u32 dpfc_ctl; 1477 u32 dpfc_ctl;
1152 1478
1479 dpfc_ctl = I915_READ(DPFC_CONTROL);
1480 if (dpfc_ctl & DPFC_CTL_EN) {
1481 if (dev_priv->cfb_pitch == dev_priv->cfb_pitch / 64 - 1 &&
1482 dev_priv->cfb_fence == obj->fence_reg &&
1483 dev_priv->cfb_plane == intel_crtc->plane &&
1484 dev_priv->cfb_y == crtc->y)
1485 return;
1486
1487 I915_WRITE(DPFC_CONTROL, dpfc_ctl & ~DPFC_CTL_EN);
1488 intel_wait_for_vblank(dev, intel_crtc->pipe);
1489 }
1490
1153 dev_priv->cfb_pitch = (dev_priv->cfb_pitch / 64) - 1; 1491 dev_priv->cfb_pitch = (dev_priv->cfb_pitch / 64) - 1;
1154 dev_priv->cfb_fence = obj_priv->fence_reg; 1492 dev_priv->cfb_fence = obj->fence_reg;
1155 dev_priv->cfb_plane = intel_crtc->plane; 1493 dev_priv->cfb_plane = intel_crtc->plane;
1494 dev_priv->cfb_y = crtc->y;
1156 1495
1157 dpfc_ctl = plane | DPFC_SR_EN | DPFC_CTL_LIMIT_1X; 1496 dpfc_ctl = plane | DPFC_SR_EN | DPFC_CTL_LIMIT_1X;
1158 if (obj_priv->tiling_mode != I915_TILING_NONE) { 1497 if (obj->tiling_mode != I915_TILING_NONE) {
1159 dpfc_ctl |= DPFC_CTL_FENCE_EN | dev_priv->cfb_fence; 1498 dpfc_ctl |= DPFC_CTL_FENCE_EN | dev_priv->cfb_fence;
1160 I915_WRITE(DPFC_CHICKEN, DPFC_HT_MODIFY); 1499 I915_WRITE(DPFC_CHICKEN, DPFC_HT_MODIFY);
1161 } else { 1500 } else {
1162 I915_WRITE(DPFC_CHICKEN, ~DPFC_HT_MODIFY); 1501 I915_WRITE(DPFC_CHICKEN, ~DPFC_HT_MODIFY);
1163 } 1502 }
1164 1503
1165 I915_WRITE(DPFC_CONTROL, dpfc_ctl);
1166 I915_WRITE(DPFC_RECOMP_CTL, DPFC_RECOMP_STALL_EN | 1504 I915_WRITE(DPFC_RECOMP_CTL, DPFC_RECOMP_STALL_EN |
1167 (stall_watermark << DPFC_RECOMP_STALL_WM_SHIFT) | 1505 (stall_watermark << DPFC_RECOMP_STALL_WM_SHIFT) |
1168 (interval << DPFC_RECOMP_TIMER_COUNT_SHIFT)); 1506 (interval << DPFC_RECOMP_TIMER_COUNT_SHIFT));
@@ -1181,10 +1519,12 @@ void g4x_disable_fbc(struct drm_device *dev)
1181 1519
1182 /* Disable compression */ 1520 /* Disable compression */
1183 dpfc_ctl = I915_READ(DPFC_CONTROL); 1521 dpfc_ctl = I915_READ(DPFC_CONTROL);
1184 dpfc_ctl &= ~DPFC_CTL_EN; 1522 if (dpfc_ctl & DPFC_CTL_EN) {
1185 I915_WRITE(DPFC_CONTROL, dpfc_ctl); 1523 dpfc_ctl &= ~DPFC_CTL_EN;
1524 I915_WRITE(DPFC_CONTROL, dpfc_ctl);
1186 1525
1187 DRM_DEBUG_KMS("disabled FBC\n"); 1526 DRM_DEBUG_KMS("disabled FBC\n");
1527 }
1188} 1528}
1189 1529
1190static bool g4x_fbc_enabled(struct drm_device *dev) 1530static bool g4x_fbc_enabled(struct drm_device *dev)
@@ -1194,42 +1534,80 @@ static bool g4x_fbc_enabled(struct drm_device *dev)
1194 return I915_READ(DPFC_CONTROL) & DPFC_CTL_EN; 1534 return I915_READ(DPFC_CONTROL) & DPFC_CTL_EN;
1195} 1535}
1196 1536
1537static void sandybridge_blit_fbc_update(struct drm_device *dev)
1538{
1539 struct drm_i915_private *dev_priv = dev->dev_private;
1540 u32 blt_ecoskpd;
1541
1542 /* Make sure blitter notifies FBC of writes */
1543 gen6_gt_force_wake_get(dev_priv);
1544 blt_ecoskpd = I915_READ(GEN6_BLITTER_ECOSKPD);
1545 blt_ecoskpd |= GEN6_BLITTER_FBC_NOTIFY <<
1546 GEN6_BLITTER_LOCK_SHIFT;
1547 I915_WRITE(GEN6_BLITTER_ECOSKPD, blt_ecoskpd);
1548 blt_ecoskpd |= GEN6_BLITTER_FBC_NOTIFY;
1549 I915_WRITE(GEN6_BLITTER_ECOSKPD, blt_ecoskpd);
1550 blt_ecoskpd &= ~(GEN6_BLITTER_FBC_NOTIFY <<
1551 GEN6_BLITTER_LOCK_SHIFT);
1552 I915_WRITE(GEN6_BLITTER_ECOSKPD, blt_ecoskpd);
1553 POSTING_READ(GEN6_BLITTER_ECOSKPD);
1554 gen6_gt_force_wake_put(dev_priv);
1555}
1556
1197static void ironlake_enable_fbc(struct drm_crtc *crtc, unsigned long interval) 1557static void ironlake_enable_fbc(struct drm_crtc *crtc, unsigned long interval)
1198{ 1558{
1199 struct drm_device *dev = crtc->dev; 1559 struct drm_device *dev = crtc->dev;
1200 struct drm_i915_private *dev_priv = dev->dev_private; 1560 struct drm_i915_private *dev_priv = dev->dev_private;
1201 struct drm_framebuffer *fb = crtc->fb; 1561 struct drm_framebuffer *fb = crtc->fb;
1202 struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb); 1562 struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
1203 struct drm_i915_gem_object *obj_priv = to_intel_bo(intel_fb->obj); 1563 struct drm_i915_gem_object *obj = intel_fb->obj;
1204 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 1564 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
1205 int plane = (intel_crtc->plane == 0) ? DPFC_CTL_PLANEA : 1565 int plane = intel_crtc->plane == 0 ? DPFC_CTL_PLANEA : DPFC_CTL_PLANEB;
1206 DPFC_CTL_PLANEB;
1207 unsigned long stall_watermark = 200; 1566 unsigned long stall_watermark = 200;
1208 u32 dpfc_ctl; 1567 u32 dpfc_ctl;
1209 1568
1569 dpfc_ctl = I915_READ(ILK_DPFC_CONTROL);
1570 if (dpfc_ctl & DPFC_CTL_EN) {
1571 if (dev_priv->cfb_pitch == dev_priv->cfb_pitch / 64 - 1 &&
1572 dev_priv->cfb_fence == obj->fence_reg &&
1573 dev_priv->cfb_plane == intel_crtc->plane &&
1574 dev_priv->cfb_offset == obj->gtt_offset &&
1575 dev_priv->cfb_y == crtc->y)
1576 return;
1577
1578 I915_WRITE(ILK_DPFC_CONTROL, dpfc_ctl & ~DPFC_CTL_EN);
1579 intel_wait_for_vblank(dev, intel_crtc->pipe);
1580 }
1581
1210 dev_priv->cfb_pitch = (dev_priv->cfb_pitch / 64) - 1; 1582 dev_priv->cfb_pitch = (dev_priv->cfb_pitch / 64) - 1;
1211 dev_priv->cfb_fence = obj_priv->fence_reg; 1583 dev_priv->cfb_fence = obj->fence_reg;
1212 dev_priv->cfb_plane = intel_crtc->plane; 1584 dev_priv->cfb_plane = intel_crtc->plane;
1585 dev_priv->cfb_offset = obj->gtt_offset;
1586 dev_priv->cfb_y = crtc->y;
1213 1587
1214 dpfc_ctl = I915_READ(ILK_DPFC_CONTROL);
1215 dpfc_ctl &= DPFC_RESERVED; 1588 dpfc_ctl &= DPFC_RESERVED;
1216 dpfc_ctl |= (plane | DPFC_CTL_LIMIT_1X); 1589 dpfc_ctl |= (plane | DPFC_CTL_LIMIT_1X);
1217 if (obj_priv->tiling_mode != I915_TILING_NONE) { 1590 if (obj->tiling_mode != I915_TILING_NONE) {
1218 dpfc_ctl |= (DPFC_CTL_FENCE_EN | dev_priv->cfb_fence); 1591 dpfc_ctl |= (DPFC_CTL_FENCE_EN | dev_priv->cfb_fence);
1219 I915_WRITE(ILK_DPFC_CHICKEN, DPFC_HT_MODIFY); 1592 I915_WRITE(ILK_DPFC_CHICKEN, DPFC_HT_MODIFY);
1220 } else { 1593 } else {
1221 I915_WRITE(ILK_DPFC_CHICKEN, ~DPFC_HT_MODIFY); 1594 I915_WRITE(ILK_DPFC_CHICKEN, ~DPFC_HT_MODIFY);
1222 } 1595 }
1223 1596
1224 I915_WRITE(ILK_DPFC_CONTROL, dpfc_ctl);
1225 I915_WRITE(ILK_DPFC_RECOMP_CTL, DPFC_RECOMP_STALL_EN | 1597 I915_WRITE(ILK_DPFC_RECOMP_CTL, DPFC_RECOMP_STALL_EN |
1226 (stall_watermark << DPFC_RECOMP_STALL_WM_SHIFT) | 1598 (stall_watermark << DPFC_RECOMP_STALL_WM_SHIFT) |
1227 (interval << DPFC_RECOMP_TIMER_COUNT_SHIFT)); 1599 (interval << DPFC_RECOMP_TIMER_COUNT_SHIFT));
1228 I915_WRITE(ILK_DPFC_FENCE_YOFF, crtc->y); 1600 I915_WRITE(ILK_DPFC_FENCE_YOFF, crtc->y);
1229 I915_WRITE(ILK_FBC_RT_BASE, obj_priv->gtt_offset | ILK_FBC_RT_VALID); 1601 I915_WRITE(ILK_FBC_RT_BASE, obj->gtt_offset | ILK_FBC_RT_VALID);
1230 /* enable it... */ 1602 /* enable it... */
1231 I915_WRITE(ILK_DPFC_CONTROL, I915_READ(ILK_DPFC_CONTROL) | 1603 I915_WRITE(ILK_DPFC_CONTROL, dpfc_ctl | DPFC_CTL_EN);
1232 DPFC_CTL_EN); 1604
1605 if (IS_GEN6(dev)) {
1606 I915_WRITE(SNB_DPFC_CTL_SA,
1607 SNB_CPU_FENCE_ENABLE | dev_priv->cfb_fence);
1608 I915_WRITE(DPFC_CPU_FENCE_OFFSET, crtc->y);
1609 sandybridge_blit_fbc_update(dev);
1610 }
1233 1611
1234 DRM_DEBUG_KMS("enabled fbc on plane %d\n", intel_crtc->plane); 1612 DRM_DEBUG_KMS("enabled fbc on plane %d\n", intel_crtc->plane);
1235} 1613}
@@ -1241,10 +1619,12 @@ void ironlake_disable_fbc(struct drm_device *dev)
1241 1619
1242 /* Disable compression */ 1620 /* Disable compression */
1243 dpfc_ctl = I915_READ(ILK_DPFC_CONTROL); 1621 dpfc_ctl = I915_READ(ILK_DPFC_CONTROL);
1244 dpfc_ctl &= ~DPFC_CTL_EN; 1622 if (dpfc_ctl & DPFC_CTL_EN) {
1245 I915_WRITE(ILK_DPFC_CONTROL, dpfc_ctl); 1623 dpfc_ctl &= ~DPFC_CTL_EN;
1624 I915_WRITE(ILK_DPFC_CONTROL, dpfc_ctl);
1246 1625
1247 DRM_DEBUG_KMS("disabled FBC\n"); 1626 DRM_DEBUG_KMS("disabled FBC\n");
1627 }
1248} 1628}
1249 1629
1250static bool ironlake_fbc_enabled(struct drm_device *dev) 1630static bool ironlake_fbc_enabled(struct drm_device *dev)
@@ -1286,8 +1666,7 @@ void intel_disable_fbc(struct drm_device *dev)
1286 1666
1287/** 1667/**
1288 * intel_update_fbc - enable/disable FBC as needed 1668 * intel_update_fbc - enable/disable FBC as needed
1289 * @crtc: CRTC to point the compressor at 1669 * @dev: the drm_device
1290 * @mode: mode in use
1291 * 1670 *
1292 * Set up the framebuffer compression hardware at mode set time. We 1671 * Set up the framebuffer compression hardware at mode set time. We
1293 * enable it if possible: 1672 * enable it if possible:
@@ -1304,18 +1683,14 @@ void intel_disable_fbc(struct drm_device *dev)
1304 * 1683 *
1305 * We need to enable/disable FBC on a global basis. 1684 * We need to enable/disable FBC on a global basis.
1306 */ 1685 */
1307static void intel_update_fbc(struct drm_crtc *crtc, 1686static void intel_update_fbc(struct drm_device *dev)
1308 struct drm_display_mode *mode)
1309{ 1687{
1310 struct drm_device *dev = crtc->dev;
1311 struct drm_i915_private *dev_priv = dev->dev_private; 1688 struct drm_i915_private *dev_priv = dev->dev_private;
1312 struct drm_framebuffer *fb = crtc->fb; 1689 struct drm_crtc *crtc = NULL, *tmp_crtc;
1690 struct intel_crtc *intel_crtc;
1691 struct drm_framebuffer *fb;
1313 struct intel_framebuffer *intel_fb; 1692 struct intel_framebuffer *intel_fb;
1314 struct drm_i915_gem_object *obj_priv; 1693 struct drm_i915_gem_object *obj;
1315 struct drm_crtc *tmp_crtc;
1316 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
1317 int plane = intel_crtc->plane;
1318 int crtcs_enabled = 0;
1319 1694
1320 DRM_DEBUG_KMS("\n"); 1695 DRM_DEBUG_KMS("\n");
1321 1696
@@ -1325,12 +1700,6 @@ static void intel_update_fbc(struct drm_crtc *crtc,
1325 if (!I915_HAS_FBC(dev)) 1700 if (!I915_HAS_FBC(dev))
1326 return; 1701 return;
1327 1702
1328 if (!crtc->fb)
1329 return;
1330
1331 intel_fb = to_intel_framebuffer(fb);
1332 obj_priv = to_intel_bo(intel_fb->obj);
1333
1334 /* 1703 /*
1335 * If FBC is already on, we just have to verify that we can 1704 * If FBC is already on, we just have to verify that we can
1336 * keep it that way... 1705 * keep it that way...
@@ -1341,40 +1710,57 @@ static void intel_update_fbc(struct drm_crtc *crtc,
1341 * - going to an unsupported config (interlace, pixel multiply, etc.) 1710 * - going to an unsupported config (interlace, pixel multiply, etc.)
1342 */ 1711 */
1343 list_for_each_entry(tmp_crtc, &dev->mode_config.crtc_list, head) { 1712 list_for_each_entry(tmp_crtc, &dev->mode_config.crtc_list, head) {
1344 if (tmp_crtc->enabled) 1713 if (tmp_crtc->enabled && tmp_crtc->fb) {
1345 crtcs_enabled++; 1714 if (crtc) {
1715 DRM_DEBUG_KMS("more than one pipe active, disabling compression\n");
1716 dev_priv->no_fbc_reason = FBC_MULTIPLE_PIPES;
1717 goto out_disable;
1718 }
1719 crtc = tmp_crtc;
1720 }
1346 } 1721 }
1347 DRM_DEBUG_KMS("%d pipes active\n", crtcs_enabled); 1722
1348 if (crtcs_enabled > 1) { 1723 if (!crtc || crtc->fb == NULL) {
1349 DRM_DEBUG_KMS("more than one pipe active, disabling compression\n"); 1724 DRM_DEBUG_KMS("no output, disabling\n");
1350 dev_priv->no_fbc_reason = FBC_MULTIPLE_PIPES; 1725 dev_priv->no_fbc_reason = FBC_NO_OUTPUT;
1351 goto out_disable; 1726 goto out_disable;
1352 } 1727 }
1353 if (intel_fb->obj->size > dev_priv->cfb_size) { 1728
1729 intel_crtc = to_intel_crtc(crtc);
1730 fb = crtc->fb;
1731 intel_fb = to_intel_framebuffer(fb);
1732 obj = intel_fb->obj;
1733
1734 if (!i915_enable_fbc) {
1735 DRM_DEBUG_KMS("fbc disabled per module param (default off)\n");
1736 dev_priv->no_fbc_reason = FBC_MODULE_PARAM;
1737 goto out_disable;
1738 }
1739 if (intel_fb->obj->base.size > dev_priv->cfb_size) {
1354 DRM_DEBUG_KMS("framebuffer too large, disabling " 1740 DRM_DEBUG_KMS("framebuffer too large, disabling "
1355 "compression\n"); 1741 "compression\n");
1356 dev_priv->no_fbc_reason = FBC_STOLEN_TOO_SMALL; 1742 dev_priv->no_fbc_reason = FBC_STOLEN_TOO_SMALL;
1357 goto out_disable; 1743 goto out_disable;
1358 } 1744 }
1359 if ((mode->flags & DRM_MODE_FLAG_INTERLACE) || 1745 if ((crtc->mode.flags & DRM_MODE_FLAG_INTERLACE) ||
1360 (mode->flags & DRM_MODE_FLAG_DBLSCAN)) { 1746 (crtc->mode.flags & DRM_MODE_FLAG_DBLSCAN)) {
1361 DRM_DEBUG_KMS("mode incompatible with compression, " 1747 DRM_DEBUG_KMS("mode incompatible with compression, "
1362 "disabling\n"); 1748 "disabling\n");
1363 dev_priv->no_fbc_reason = FBC_UNSUPPORTED_MODE; 1749 dev_priv->no_fbc_reason = FBC_UNSUPPORTED_MODE;
1364 goto out_disable; 1750 goto out_disable;
1365 } 1751 }
1366 if ((mode->hdisplay > 2048) || 1752 if ((crtc->mode.hdisplay > 2048) ||
1367 (mode->vdisplay > 1536)) { 1753 (crtc->mode.vdisplay > 1536)) {
1368 DRM_DEBUG_KMS("mode too large for compression, disabling\n"); 1754 DRM_DEBUG_KMS("mode too large for compression, disabling\n");
1369 dev_priv->no_fbc_reason = FBC_MODE_TOO_LARGE; 1755 dev_priv->no_fbc_reason = FBC_MODE_TOO_LARGE;
1370 goto out_disable; 1756 goto out_disable;
1371 } 1757 }
1372 if ((IS_I915GM(dev) || IS_I945GM(dev)) && plane != 0) { 1758 if ((IS_I915GM(dev) || IS_I945GM(dev)) && intel_crtc->plane != 0) {
1373 DRM_DEBUG_KMS("plane not 0, disabling compression\n"); 1759 DRM_DEBUG_KMS("plane not 0, disabling compression\n");
1374 dev_priv->no_fbc_reason = FBC_BAD_PLANE; 1760 dev_priv->no_fbc_reason = FBC_BAD_PLANE;
1375 goto out_disable; 1761 goto out_disable;
1376 } 1762 }
1377 if (obj_priv->tiling_mode != I915_TILING_X) { 1763 if (obj->tiling_mode != I915_TILING_X) {
1378 DRM_DEBUG_KMS("framebuffer not tiled, disabling compression\n"); 1764 DRM_DEBUG_KMS("framebuffer not tiled, disabling compression\n");
1379 dev_priv->no_fbc_reason = FBC_NOT_TILED; 1765 dev_priv->no_fbc_reason = FBC_NOT_TILED;
1380 goto out_disable; 1766 goto out_disable;
@@ -1384,18 +1770,7 @@ static void intel_update_fbc(struct drm_crtc *crtc,
1384 if (in_dbg_master()) 1770 if (in_dbg_master())
1385 goto out_disable; 1771 goto out_disable;
1386 1772
1387 if (intel_fbc_enabled(dev)) { 1773 intel_enable_fbc(crtc, 500);
1388 /* We can re-enable it in this case, but need to update pitch */
1389 if ((fb->pitch > dev_priv->cfb_pitch) ||
1390 (obj_priv->fence_reg != dev_priv->cfb_fence) ||
1391 (plane != dev_priv->cfb_plane))
1392 intel_disable_fbc(dev);
1393 }
1394
1395 /* Now try to turn it back on if possible */
1396 if (!intel_fbc_enabled(dev))
1397 intel_enable_fbc(crtc, 500);
1398
1399 return; 1774 return;
1400 1775
1401out_disable: 1776out_disable:
@@ -1407,17 +1782,19 @@ out_disable:
1407} 1782}
1408 1783
1409int 1784int
1410intel_pin_and_fence_fb_obj(struct drm_device *dev, struct drm_gem_object *obj) 1785intel_pin_and_fence_fb_obj(struct drm_device *dev,
1786 struct drm_i915_gem_object *obj,
1787 struct intel_ring_buffer *pipelined)
1411{ 1788{
1412 struct drm_i915_gem_object *obj_priv = to_intel_bo(obj); 1789 struct drm_i915_private *dev_priv = dev->dev_private;
1413 u32 alignment; 1790 u32 alignment;
1414 int ret; 1791 int ret;
1415 1792
1416 switch (obj_priv->tiling_mode) { 1793 switch (obj->tiling_mode) {
1417 case I915_TILING_NONE: 1794 case I915_TILING_NONE:
1418 if (IS_BROADWATER(dev) || IS_CRESTLINE(dev)) 1795 if (IS_BROADWATER(dev) || IS_CRESTLINE(dev))
1419 alignment = 128 * 1024; 1796 alignment = 128 * 1024;
1420 else if (IS_I965G(dev)) 1797 else if (INTEL_INFO(dev)->gen >= 4)
1421 alignment = 4 * 1024; 1798 alignment = 4 * 1024;
1422 else 1799 else
1423 alignment = 64 * 1024; 1800 alignment = 64 * 1024;
@@ -1434,46 +1811,50 @@ intel_pin_and_fence_fb_obj(struct drm_device *dev, struct drm_gem_object *obj)
1434 BUG(); 1811 BUG();
1435 } 1812 }
1436 1813
1437 ret = i915_gem_object_pin(obj, alignment); 1814 dev_priv->mm.interruptible = false;
1438 if (ret != 0) 1815 ret = i915_gem_object_pin(obj, alignment, true);
1439 return ret; 1816 if (ret)
1817 goto err_interruptible;
1818
1819 ret = i915_gem_object_set_to_display_plane(obj, pipelined);
1820 if (ret)
1821 goto err_unpin;
1440 1822
1441 /* Install a fence for tiled scan-out. Pre-i965 always needs a 1823 /* Install a fence for tiled scan-out. Pre-i965 always needs a
1442 * fence, whereas 965+ only requires a fence if using 1824 * fence, whereas 965+ only requires a fence if using
1443 * framebuffer compression. For simplicity, we always install 1825 * framebuffer compression. For simplicity, we always install
1444 * a fence as the cost is not that onerous. 1826 * a fence as the cost is not that onerous.
1445 */ 1827 */
1446 if (obj_priv->fence_reg == I915_FENCE_REG_NONE && 1828 if (obj->tiling_mode != I915_TILING_NONE) {
1447 obj_priv->tiling_mode != I915_TILING_NONE) { 1829 ret = i915_gem_object_get_fence(obj, pipelined);
1448 ret = i915_gem_object_get_fence_reg(obj); 1830 if (ret)
1449 if (ret != 0) { 1831 goto err_unpin;
1450 i915_gem_object_unpin(obj);
1451 return ret;
1452 }
1453 } 1832 }
1454 1833
1834 dev_priv->mm.interruptible = true;
1455 return 0; 1835 return 0;
1836
1837err_unpin:
1838 i915_gem_object_unpin(obj);
1839err_interruptible:
1840 dev_priv->mm.interruptible = true;
1841 return ret;
1456} 1842}
1457 1843
1458/* Assume fb object is pinned & idle & fenced and just update base pointers */ 1844/* Assume fb object is pinned & idle & fenced and just update base pointers */
1459static int 1845static int
1460intel_pipe_set_base_atomic(struct drm_crtc *crtc, struct drm_framebuffer *fb, 1846intel_pipe_set_base_atomic(struct drm_crtc *crtc, struct drm_framebuffer *fb,
1461 int x, int y) 1847 int x, int y, enum mode_set_atomic state)
1462{ 1848{
1463 struct drm_device *dev = crtc->dev; 1849 struct drm_device *dev = crtc->dev;
1464 struct drm_i915_private *dev_priv = dev->dev_private; 1850 struct drm_i915_private *dev_priv = dev->dev_private;
1465 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 1851 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
1466 struct intel_framebuffer *intel_fb; 1852 struct intel_framebuffer *intel_fb;
1467 struct drm_i915_gem_object *obj_priv; 1853 struct drm_i915_gem_object *obj;
1468 struct drm_gem_object *obj;
1469 int plane = intel_crtc->plane; 1854 int plane = intel_crtc->plane;
1470 unsigned long Start, Offset; 1855 unsigned long Start, Offset;
1471 int dspbase = (plane == 0 ? DSPAADDR : DSPBADDR);
1472 int dspsurf = (plane == 0 ? DSPASURF : DSPBSURF);
1473 int dspstride = (plane == 0) ? DSPASTRIDE : DSPBSTRIDE;
1474 int dsptileoff = (plane == 0 ? DSPATILEOFF : DSPBTILEOFF);
1475 int dspcntr_reg = (plane == 0) ? DSPACNTR : DSPBCNTR;
1476 u32 dspcntr; 1856 u32 dspcntr;
1857 u32 reg;
1477 1858
1478 switch (plane) { 1859 switch (plane) {
1479 case 0: 1860 case 0:
@@ -1486,9 +1867,9 @@ intel_pipe_set_base_atomic(struct drm_crtc *crtc, struct drm_framebuffer *fb,
1486 1867
1487 intel_fb = to_intel_framebuffer(fb); 1868 intel_fb = to_intel_framebuffer(fb);
1488 obj = intel_fb->obj; 1869 obj = intel_fb->obj;
1489 obj_priv = to_intel_bo(obj);
1490 1870
1491 dspcntr = I915_READ(dspcntr_reg); 1871 reg = DSPCNTR(plane);
1872 dspcntr = I915_READ(reg);
1492 /* Mask out pixel format bits in case we change it */ 1873 /* Mask out pixel format bits in case we change it */
1493 dspcntr &= ~DISPPLANE_PIXFORMAT_MASK; 1874 dspcntr &= ~DISPPLANE_PIXFORMAT_MASK;
1494 switch (fb->bits_per_pixel) { 1875 switch (fb->bits_per_pixel) {
@@ -1509,8 +1890,8 @@ intel_pipe_set_base_atomic(struct drm_crtc *crtc, struct drm_framebuffer *fb,
1509 DRM_ERROR("Unknown color depth\n"); 1890 DRM_ERROR("Unknown color depth\n");
1510 return -EINVAL; 1891 return -EINVAL;
1511 } 1892 }
1512 if (IS_I965G(dev)) { 1893 if (INTEL_INFO(dev)->gen >= 4) {
1513 if (obj_priv->tiling_mode != I915_TILING_NONE) 1894 if (obj->tiling_mode != I915_TILING_NONE)
1514 dspcntr |= DISPPLANE_TILED; 1895 dspcntr |= DISPPLANE_TILED;
1515 else 1896 else
1516 dspcntr &= ~DISPPLANE_TILED; 1897 dspcntr &= ~DISPPLANE_TILED;
@@ -1520,28 +1901,24 @@ intel_pipe_set_base_atomic(struct drm_crtc *crtc, struct drm_framebuffer *fb,
1520 /* must disable */ 1901 /* must disable */
1521 dspcntr |= DISPPLANE_TRICKLE_FEED_DISABLE; 1902 dspcntr |= DISPPLANE_TRICKLE_FEED_DISABLE;
1522 1903
1523 I915_WRITE(dspcntr_reg, dspcntr); 1904 I915_WRITE(reg, dspcntr);
1524 1905
1525 Start = obj_priv->gtt_offset; 1906 Start = obj->gtt_offset;
1526 Offset = y * fb->pitch + x * (fb->bits_per_pixel / 8); 1907 Offset = y * fb->pitch + x * (fb->bits_per_pixel / 8);
1527 1908
1528 DRM_DEBUG_KMS("Writing base %08lX %08lX %d %d %d\n", 1909 DRM_DEBUG_KMS("Writing base %08lX %08lX %d %d %d\n",
1529 Start, Offset, x, y, fb->pitch); 1910 Start, Offset, x, y, fb->pitch);
1530 I915_WRITE(dspstride, fb->pitch); 1911 I915_WRITE(DSPSTRIDE(plane), fb->pitch);
1531 if (IS_I965G(dev)) { 1912 if (INTEL_INFO(dev)->gen >= 4) {
1532 I915_WRITE(dspsurf, Start); 1913 I915_WRITE(DSPSURF(plane), Start);
1533 I915_WRITE(dsptileoff, (y << 16) | x); 1914 I915_WRITE(DSPTILEOFF(plane), (y << 16) | x);
1534 I915_WRITE(dspbase, Offset); 1915 I915_WRITE(DSPADDR(plane), Offset);
1535 } else { 1916 } else
1536 I915_WRITE(dspbase, Start + Offset); 1917 I915_WRITE(DSPADDR(plane), Start + Offset);
1537 } 1918 POSTING_READ(reg);
1538 POSTING_READ(dspbase);
1539
1540 if (IS_I965G(dev) || plane == 0)
1541 intel_update_fbc(crtc, &crtc->mode);
1542 1919
1543 intel_wait_for_vblank(dev, intel_crtc->pipe); 1920 intel_update_fbc(dev);
1544 intel_increase_pllclock(crtc, true); 1921 intel_increase_pllclock(crtc);
1545 1922
1546 return 0; 1923 return 0;
1547} 1924}
@@ -1553,11 +1930,6 @@ intel_pipe_set_base(struct drm_crtc *crtc, int x, int y,
1553 struct drm_device *dev = crtc->dev; 1930 struct drm_device *dev = crtc->dev;
1554 struct drm_i915_master_private *master_priv; 1931 struct drm_i915_master_private *master_priv;
1555 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 1932 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
1556 struct intel_framebuffer *intel_fb;
1557 struct drm_i915_gem_object *obj_priv;
1558 struct drm_gem_object *obj;
1559 int pipe = intel_crtc->pipe;
1560 int plane = intel_crtc->plane;
1561 int ret; 1933 int ret;
1562 1934
1563 /* no fb bound */ 1935 /* no fb bound */
@@ -1566,44 +1938,54 @@ intel_pipe_set_base(struct drm_crtc *crtc, int x, int y,
1566 return 0; 1938 return 0;
1567 } 1939 }
1568 1940
1569 switch (plane) { 1941 switch (intel_crtc->plane) {
1570 case 0: 1942 case 0:
1571 case 1: 1943 case 1:
1572 break; 1944 break;
1573 default: 1945 default:
1574 DRM_ERROR("Can't update plane %d in SAREA\n", plane);
1575 return -EINVAL; 1946 return -EINVAL;
1576 } 1947 }
1577 1948
1578 intel_fb = to_intel_framebuffer(crtc->fb);
1579 obj = intel_fb->obj;
1580 obj_priv = to_intel_bo(obj);
1581
1582 mutex_lock(&dev->struct_mutex); 1949 mutex_lock(&dev->struct_mutex);
1583 ret = intel_pin_and_fence_fb_obj(dev, obj); 1950 ret = intel_pin_and_fence_fb_obj(dev,
1951 to_intel_framebuffer(crtc->fb)->obj,
1952 NULL);
1584 if (ret != 0) { 1953 if (ret != 0) {
1585 mutex_unlock(&dev->struct_mutex); 1954 mutex_unlock(&dev->struct_mutex);
1586 return ret; 1955 return ret;
1587 } 1956 }
1588 1957
1589 ret = i915_gem_object_set_to_display_plane(obj); 1958 if (old_fb) {
1590 if (ret != 0) { 1959 struct drm_i915_private *dev_priv = dev->dev_private;
1591 i915_gem_object_unpin(obj); 1960 struct drm_i915_gem_object *obj = to_intel_framebuffer(old_fb)->obj;
1592 mutex_unlock(&dev->struct_mutex); 1961
1593 return ret; 1962 wait_event(dev_priv->pending_flip_queue,
1963 atomic_read(&dev_priv->mm.wedged) ||
1964 atomic_read(&obj->pending_flip) == 0);
1965
1966 /* Big Hammer, we also need to ensure that any pending
1967 * MI_WAIT_FOR_EVENT inside a user batch buffer on the
1968 * current scanout is retired before unpinning the old
1969 * framebuffer.
1970 *
1971 * This should only fail upon a hung GPU, in which case we
1972 * can safely continue.
1973 */
1974 ret = i915_gem_object_flush_gpu(obj);
1975 (void) ret;
1594 } 1976 }
1595 1977
1596 ret = intel_pipe_set_base_atomic(crtc, crtc->fb, x, y); 1978 ret = intel_pipe_set_base_atomic(crtc, crtc->fb, x, y,
1979 LEAVE_ATOMIC_MODE_SET);
1597 if (ret) { 1980 if (ret) {
1598 i915_gem_object_unpin(obj); 1981 i915_gem_object_unpin(to_intel_framebuffer(crtc->fb)->obj);
1599 mutex_unlock(&dev->struct_mutex); 1982 mutex_unlock(&dev->struct_mutex);
1600 return ret; 1983 return ret;
1601 } 1984 }
1602 1985
1603 if (old_fb) { 1986 if (old_fb) {
1604 intel_fb = to_intel_framebuffer(old_fb); 1987 intel_wait_for_vblank(dev, intel_crtc->pipe);
1605 obj_priv = to_intel_bo(intel_fb->obj); 1988 i915_gem_object_unpin(to_intel_framebuffer(old_fb)->obj);
1606 i915_gem_object_unpin(intel_fb->obj);
1607 } 1989 }
1608 1990
1609 mutex_unlock(&dev->struct_mutex); 1991 mutex_unlock(&dev->struct_mutex);
@@ -1615,7 +1997,7 @@ intel_pipe_set_base(struct drm_crtc *crtc, int x, int y,
1615 if (!master_priv->sarea_priv) 1997 if (!master_priv->sarea_priv)
1616 return 0; 1998 return 0;
1617 1999
1618 if (pipe) { 2000 if (intel_crtc->pipe) {
1619 master_priv->sarea_priv->pipeB_x = x; 2001 master_priv->sarea_priv->pipeB_x = x;
1620 master_priv->sarea_priv->pipeB_y = y; 2002 master_priv->sarea_priv->pipeB_y = y;
1621 } else { 2003 } else {
@@ -1626,7 +2008,7 @@ intel_pipe_set_base(struct drm_crtc *crtc, int x, int y,
1626 return 0; 2008 return 0;
1627} 2009}
1628 2010
1629static void ironlake_set_pll_edp (struct drm_crtc *crtc, int clock) 2011static void ironlake_set_pll_edp(struct drm_crtc *crtc, int clock)
1630{ 2012{
1631 struct drm_device *dev = crtc->dev; 2013 struct drm_device *dev = crtc->dev;
1632 struct drm_i915_private *dev_priv = dev->dev_private; 2014 struct drm_i915_private *dev_priv = dev->dev_private;
@@ -1659,9 +2041,51 @@ static void ironlake_set_pll_edp (struct drm_crtc *crtc, int clock)
1659 } 2041 }
1660 I915_WRITE(DP_A, dpa_ctl); 2042 I915_WRITE(DP_A, dpa_ctl);
1661 2043
2044 POSTING_READ(DP_A);
1662 udelay(500); 2045 udelay(500);
1663} 2046}
1664 2047
2048static void intel_fdi_normal_train(struct drm_crtc *crtc)
2049{
2050 struct drm_device *dev = crtc->dev;
2051 struct drm_i915_private *dev_priv = dev->dev_private;
2052 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
2053 int pipe = intel_crtc->pipe;
2054 u32 reg, temp;
2055
2056 /* enable normal train */
2057 reg = FDI_TX_CTL(pipe);
2058 temp = I915_READ(reg);
2059 if (IS_IVYBRIDGE(dev)) {
2060 temp &= ~FDI_LINK_TRAIN_NONE_IVB;
2061 temp |= FDI_LINK_TRAIN_NONE_IVB | FDI_TX_ENHANCE_FRAME_ENABLE;
2062 } else {
2063 temp &= ~FDI_LINK_TRAIN_NONE;
2064 temp |= FDI_LINK_TRAIN_NONE | FDI_TX_ENHANCE_FRAME_ENABLE;
2065 }
2066 I915_WRITE(reg, temp);
2067
2068 reg = FDI_RX_CTL(pipe);
2069 temp = I915_READ(reg);
2070 if (HAS_PCH_CPT(dev)) {
2071 temp &= ~FDI_LINK_TRAIN_PATTERN_MASK_CPT;
2072 temp |= FDI_LINK_TRAIN_NORMAL_CPT;
2073 } else {
2074 temp &= ~FDI_LINK_TRAIN_NONE;
2075 temp |= FDI_LINK_TRAIN_NONE;
2076 }
2077 I915_WRITE(reg, temp | FDI_RX_ENHANCE_FRAME_ENABLE);
2078
2079 /* wait one idle pattern time */
2080 POSTING_READ(reg);
2081 udelay(1000);
2082
2083 /* IVB wants error correction enabled */
2084 if (IS_IVYBRIDGE(dev))
2085 I915_WRITE(reg, I915_READ(reg) | FDI_FS_ERRC_ENABLE |
2086 FDI_FE_ERRC_ENABLE);
2087}
2088
1665/* The FDI link training functions for ILK/Ibexpeak. */ 2089/* The FDI link training functions for ILK/Ibexpeak. */
1666static void ironlake_fdi_link_train(struct drm_crtc *crtc) 2090static void ironlake_fdi_link_train(struct drm_crtc *crtc)
1667{ 2091{
@@ -1669,84 +2093,97 @@ static void ironlake_fdi_link_train(struct drm_crtc *crtc)
1669 struct drm_i915_private *dev_priv = dev->dev_private; 2093 struct drm_i915_private *dev_priv = dev->dev_private;
1670 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 2094 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
1671 int pipe = intel_crtc->pipe; 2095 int pipe = intel_crtc->pipe;
1672 int fdi_tx_reg = (pipe == 0) ? FDI_TXA_CTL : FDI_TXB_CTL; 2096 int plane = intel_crtc->plane;
1673 int fdi_rx_reg = (pipe == 0) ? FDI_RXA_CTL : FDI_RXB_CTL; 2097 u32 reg, temp, tries;
1674 int fdi_rx_iir_reg = (pipe == 0) ? FDI_RXA_IIR : FDI_RXB_IIR; 2098
1675 int fdi_rx_imr_reg = (pipe == 0) ? FDI_RXA_IMR : FDI_RXB_IMR; 2099 /* FDI needs bits from pipe & plane first */
1676 u32 temp, tries = 0; 2100 assert_pipe_enabled(dev_priv, pipe);
2101 assert_plane_enabled(dev_priv, plane);
1677 2102
1678 /* Train 1: umask FDI RX Interrupt symbol_lock and bit_lock bit 2103 /* Train 1: umask FDI RX Interrupt symbol_lock and bit_lock bit
1679 for train result */ 2104 for train result */
1680 temp = I915_READ(fdi_rx_imr_reg); 2105 reg = FDI_RX_IMR(pipe);
2106 temp = I915_READ(reg);
1681 temp &= ~FDI_RX_SYMBOL_LOCK; 2107 temp &= ~FDI_RX_SYMBOL_LOCK;
1682 temp &= ~FDI_RX_BIT_LOCK; 2108 temp &= ~FDI_RX_BIT_LOCK;
1683 I915_WRITE(fdi_rx_imr_reg, temp); 2109 I915_WRITE(reg, temp);
1684 I915_READ(fdi_rx_imr_reg); 2110 I915_READ(reg);
1685 udelay(150); 2111 udelay(150);
1686 2112
1687 /* enable CPU FDI TX and PCH FDI RX */ 2113 /* enable CPU FDI TX and PCH FDI RX */
1688 temp = I915_READ(fdi_tx_reg); 2114 reg = FDI_TX_CTL(pipe);
1689 temp |= FDI_TX_ENABLE; 2115 temp = I915_READ(reg);
1690 temp &= ~(7 << 19); 2116 temp &= ~(7 << 19);
1691 temp |= (intel_crtc->fdi_lanes - 1) << 19; 2117 temp |= (intel_crtc->fdi_lanes - 1) << 19;
1692 temp &= ~FDI_LINK_TRAIN_NONE; 2118 temp &= ~FDI_LINK_TRAIN_NONE;
1693 temp |= FDI_LINK_TRAIN_PATTERN_1; 2119 temp |= FDI_LINK_TRAIN_PATTERN_1;
1694 I915_WRITE(fdi_tx_reg, temp); 2120 I915_WRITE(reg, temp | FDI_TX_ENABLE);
1695 I915_READ(fdi_tx_reg);
1696 2121
1697 temp = I915_READ(fdi_rx_reg); 2122 reg = FDI_RX_CTL(pipe);
2123 temp = I915_READ(reg);
1698 temp &= ~FDI_LINK_TRAIN_NONE; 2124 temp &= ~FDI_LINK_TRAIN_NONE;
1699 temp |= FDI_LINK_TRAIN_PATTERN_1; 2125 temp |= FDI_LINK_TRAIN_PATTERN_1;
1700 I915_WRITE(fdi_rx_reg, temp | FDI_RX_ENABLE); 2126 I915_WRITE(reg, temp | FDI_RX_ENABLE);
1701 I915_READ(fdi_rx_reg); 2127
2128 POSTING_READ(reg);
1702 udelay(150); 2129 udelay(150);
1703 2130
2131 /* Ironlake workaround, enable clock pointer after FDI enable*/
2132 if (HAS_PCH_IBX(dev)) {
2133 I915_WRITE(FDI_RX_CHICKEN(pipe), FDI_RX_PHASE_SYNC_POINTER_OVR);
2134 I915_WRITE(FDI_RX_CHICKEN(pipe), FDI_RX_PHASE_SYNC_POINTER_OVR |
2135 FDI_RX_PHASE_SYNC_POINTER_EN);
2136 }
2137
2138 reg = FDI_RX_IIR(pipe);
1704 for (tries = 0; tries < 5; tries++) { 2139 for (tries = 0; tries < 5; tries++) {
1705 temp = I915_READ(fdi_rx_iir_reg); 2140 temp = I915_READ(reg);
1706 DRM_DEBUG_KMS("FDI_RX_IIR 0x%x\n", temp); 2141 DRM_DEBUG_KMS("FDI_RX_IIR 0x%x\n", temp);
1707 2142
1708 if ((temp & FDI_RX_BIT_LOCK)) { 2143 if ((temp & FDI_RX_BIT_LOCK)) {
1709 DRM_DEBUG_KMS("FDI train 1 done.\n"); 2144 DRM_DEBUG_KMS("FDI train 1 done.\n");
1710 I915_WRITE(fdi_rx_iir_reg, 2145 I915_WRITE(reg, temp | FDI_RX_BIT_LOCK);
1711 temp | FDI_RX_BIT_LOCK);
1712 break; 2146 break;
1713 } 2147 }
1714 } 2148 }
1715 if (tries == 5) 2149 if (tries == 5)
1716 DRM_DEBUG_KMS("FDI train 1 fail!\n"); 2150 DRM_ERROR("FDI train 1 fail!\n");
1717 2151
1718 /* Train 2 */ 2152 /* Train 2 */
1719 temp = I915_READ(fdi_tx_reg); 2153 reg = FDI_TX_CTL(pipe);
2154 temp = I915_READ(reg);
1720 temp &= ~FDI_LINK_TRAIN_NONE; 2155 temp &= ~FDI_LINK_TRAIN_NONE;
1721 temp |= FDI_LINK_TRAIN_PATTERN_2; 2156 temp |= FDI_LINK_TRAIN_PATTERN_2;
1722 I915_WRITE(fdi_tx_reg, temp); 2157 I915_WRITE(reg, temp);
1723 2158
1724 temp = I915_READ(fdi_rx_reg); 2159 reg = FDI_RX_CTL(pipe);
2160 temp = I915_READ(reg);
1725 temp &= ~FDI_LINK_TRAIN_NONE; 2161 temp &= ~FDI_LINK_TRAIN_NONE;
1726 temp |= FDI_LINK_TRAIN_PATTERN_2; 2162 temp |= FDI_LINK_TRAIN_PATTERN_2;
1727 I915_WRITE(fdi_rx_reg, temp); 2163 I915_WRITE(reg, temp);
1728 udelay(150);
1729 2164
1730 tries = 0; 2165 POSTING_READ(reg);
2166 udelay(150);
1731 2167
2168 reg = FDI_RX_IIR(pipe);
1732 for (tries = 0; tries < 5; tries++) { 2169 for (tries = 0; tries < 5; tries++) {
1733 temp = I915_READ(fdi_rx_iir_reg); 2170 temp = I915_READ(reg);
1734 DRM_DEBUG_KMS("FDI_RX_IIR 0x%x\n", temp); 2171 DRM_DEBUG_KMS("FDI_RX_IIR 0x%x\n", temp);
1735 2172
1736 if (temp & FDI_RX_SYMBOL_LOCK) { 2173 if (temp & FDI_RX_SYMBOL_LOCK) {
1737 I915_WRITE(fdi_rx_iir_reg, 2174 I915_WRITE(reg, temp | FDI_RX_SYMBOL_LOCK);
1738 temp | FDI_RX_SYMBOL_LOCK);
1739 DRM_DEBUG_KMS("FDI train 2 done.\n"); 2175 DRM_DEBUG_KMS("FDI train 2 done.\n");
1740 break; 2176 break;
1741 } 2177 }
1742 } 2178 }
1743 if (tries == 5) 2179 if (tries == 5)
1744 DRM_DEBUG_KMS("FDI train 2 fail!\n"); 2180 DRM_ERROR("FDI train 2 fail!\n");
1745 2181
1746 DRM_DEBUG_KMS("FDI train done\n"); 2182 DRM_DEBUG_KMS("FDI train done\n");
2183
1747} 2184}
1748 2185
1749static int snb_b_fdi_train_param [] = { 2186static const int snb_b_fdi_train_param [] = {
1750 FDI_LINK_TRAIN_400MV_0DB_SNB_B, 2187 FDI_LINK_TRAIN_400MV_0DB_SNB_B,
1751 FDI_LINK_TRAIN_400MV_6DB_SNB_B, 2188 FDI_LINK_TRAIN_400MV_6DB_SNB_B,
1752 FDI_LINK_TRAIN_600MV_3_5DB_SNB_B, 2189 FDI_LINK_TRAIN_600MV_3_5DB_SNB_B,
@@ -1760,24 +2197,22 @@ static void gen6_fdi_link_train(struct drm_crtc *crtc)
1760 struct drm_i915_private *dev_priv = dev->dev_private; 2197 struct drm_i915_private *dev_priv = dev->dev_private;
1761 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 2198 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
1762 int pipe = intel_crtc->pipe; 2199 int pipe = intel_crtc->pipe;
1763 int fdi_tx_reg = (pipe == 0) ? FDI_TXA_CTL : FDI_TXB_CTL; 2200 u32 reg, temp, i;
1764 int fdi_rx_reg = (pipe == 0) ? FDI_RXA_CTL : FDI_RXB_CTL;
1765 int fdi_rx_iir_reg = (pipe == 0) ? FDI_RXA_IIR : FDI_RXB_IIR;
1766 int fdi_rx_imr_reg = (pipe == 0) ? FDI_RXA_IMR : FDI_RXB_IMR;
1767 u32 temp, i;
1768 2201
1769 /* Train 1: umask FDI RX Interrupt symbol_lock and bit_lock bit 2202 /* Train 1: umask FDI RX Interrupt symbol_lock and bit_lock bit
1770 for train result */ 2203 for train result */
1771 temp = I915_READ(fdi_rx_imr_reg); 2204 reg = FDI_RX_IMR(pipe);
2205 temp = I915_READ(reg);
1772 temp &= ~FDI_RX_SYMBOL_LOCK; 2206 temp &= ~FDI_RX_SYMBOL_LOCK;
1773 temp &= ~FDI_RX_BIT_LOCK; 2207 temp &= ~FDI_RX_BIT_LOCK;
1774 I915_WRITE(fdi_rx_imr_reg, temp); 2208 I915_WRITE(reg, temp);
1775 I915_READ(fdi_rx_imr_reg); 2209
2210 POSTING_READ(reg);
1776 udelay(150); 2211 udelay(150);
1777 2212
1778 /* enable CPU FDI TX and PCH FDI RX */ 2213 /* enable CPU FDI TX and PCH FDI RX */
1779 temp = I915_READ(fdi_tx_reg); 2214 reg = FDI_TX_CTL(pipe);
1780 temp |= FDI_TX_ENABLE; 2215 temp = I915_READ(reg);
1781 temp &= ~(7 << 19); 2216 temp &= ~(7 << 19);
1782 temp |= (intel_crtc->fdi_lanes - 1) << 19; 2217 temp |= (intel_crtc->fdi_lanes - 1) << 19;
1783 temp &= ~FDI_LINK_TRAIN_NONE; 2218 temp &= ~FDI_LINK_TRAIN_NONE;
@@ -1785,10 +2220,10 @@ static void gen6_fdi_link_train(struct drm_crtc *crtc)
1785 temp &= ~FDI_LINK_TRAIN_VOL_EMP_MASK; 2220 temp &= ~FDI_LINK_TRAIN_VOL_EMP_MASK;
1786 /* SNB-B */ 2221 /* SNB-B */
1787 temp |= FDI_LINK_TRAIN_400MV_0DB_SNB_B; 2222 temp |= FDI_LINK_TRAIN_400MV_0DB_SNB_B;
1788 I915_WRITE(fdi_tx_reg, temp); 2223 I915_WRITE(reg, temp | FDI_TX_ENABLE);
1789 I915_READ(fdi_tx_reg);
1790 2224
1791 temp = I915_READ(fdi_rx_reg); 2225 reg = FDI_RX_CTL(pipe);
2226 temp = I915_READ(reg);
1792 if (HAS_PCH_CPT(dev)) { 2227 if (HAS_PCH_CPT(dev)) {
1793 temp &= ~FDI_LINK_TRAIN_PATTERN_MASK_CPT; 2228 temp &= ~FDI_LINK_TRAIN_PATTERN_MASK_CPT;
1794 temp |= FDI_LINK_TRAIN_PATTERN_1_CPT; 2229 temp |= FDI_LINK_TRAIN_PATTERN_1_CPT;
@@ -1796,32 +2231,37 @@ static void gen6_fdi_link_train(struct drm_crtc *crtc)
1796 temp &= ~FDI_LINK_TRAIN_NONE; 2231 temp &= ~FDI_LINK_TRAIN_NONE;
1797 temp |= FDI_LINK_TRAIN_PATTERN_1; 2232 temp |= FDI_LINK_TRAIN_PATTERN_1;
1798 } 2233 }
1799 I915_WRITE(fdi_rx_reg, temp | FDI_RX_ENABLE); 2234 I915_WRITE(reg, temp | FDI_RX_ENABLE);
1800 I915_READ(fdi_rx_reg); 2235
2236 POSTING_READ(reg);
1801 udelay(150); 2237 udelay(150);
1802 2238
1803 for (i = 0; i < 4; i++ ) { 2239 for (i = 0; i < 4; i++ ) {
1804 temp = I915_READ(fdi_tx_reg); 2240 reg = FDI_TX_CTL(pipe);
2241 temp = I915_READ(reg);
1805 temp &= ~FDI_LINK_TRAIN_VOL_EMP_MASK; 2242 temp &= ~FDI_LINK_TRAIN_VOL_EMP_MASK;
1806 temp |= snb_b_fdi_train_param[i]; 2243 temp |= snb_b_fdi_train_param[i];
1807 I915_WRITE(fdi_tx_reg, temp); 2244 I915_WRITE(reg, temp);
2245
2246 POSTING_READ(reg);
1808 udelay(500); 2247 udelay(500);
1809 2248
1810 temp = I915_READ(fdi_rx_iir_reg); 2249 reg = FDI_RX_IIR(pipe);
2250 temp = I915_READ(reg);
1811 DRM_DEBUG_KMS("FDI_RX_IIR 0x%x\n", temp); 2251 DRM_DEBUG_KMS("FDI_RX_IIR 0x%x\n", temp);
1812 2252
1813 if (temp & FDI_RX_BIT_LOCK) { 2253 if (temp & FDI_RX_BIT_LOCK) {
1814 I915_WRITE(fdi_rx_iir_reg, 2254 I915_WRITE(reg, temp | FDI_RX_BIT_LOCK);
1815 temp | FDI_RX_BIT_LOCK);
1816 DRM_DEBUG_KMS("FDI train 1 done.\n"); 2255 DRM_DEBUG_KMS("FDI train 1 done.\n");
1817 break; 2256 break;
1818 } 2257 }
1819 } 2258 }
1820 if (i == 4) 2259 if (i == 4)
1821 DRM_DEBUG_KMS("FDI train 1 fail!\n"); 2260 DRM_ERROR("FDI train 1 fail!\n");
1822 2261
1823 /* Train 2 */ 2262 /* Train 2 */
1824 temp = I915_READ(fdi_tx_reg); 2263 reg = FDI_TX_CTL(pipe);
2264 temp = I915_READ(reg);
1825 temp &= ~FDI_LINK_TRAIN_NONE; 2265 temp &= ~FDI_LINK_TRAIN_NONE;
1826 temp |= FDI_LINK_TRAIN_PATTERN_2; 2266 temp |= FDI_LINK_TRAIN_PATTERN_2;
1827 if (IS_GEN6(dev)) { 2267 if (IS_GEN6(dev)) {
@@ -1829,9 +2269,10 @@ static void gen6_fdi_link_train(struct drm_crtc *crtc)
1829 /* SNB-B */ 2269 /* SNB-B */
1830 temp |= FDI_LINK_TRAIN_400MV_0DB_SNB_B; 2270 temp |= FDI_LINK_TRAIN_400MV_0DB_SNB_B;
1831 } 2271 }
1832 I915_WRITE(fdi_tx_reg, temp); 2272 I915_WRITE(reg, temp);
1833 2273
1834 temp = I915_READ(fdi_rx_reg); 2274 reg = FDI_RX_CTL(pipe);
2275 temp = I915_READ(reg);
1835 if (HAS_PCH_CPT(dev)) { 2276 if (HAS_PCH_CPT(dev)) {
1836 temp &= ~FDI_LINK_TRAIN_PATTERN_MASK_CPT; 2277 temp &= ~FDI_LINK_TRAIN_PATTERN_MASK_CPT;
1837 temp |= FDI_LINK_TRAIN_PATTERN_2_CPT; 2278 temp |= FDI_LINK_TRAIN_PATTERN_2_CPT;
@@ -1839,445 +2280,544 @@ static void gen6_fdi_link_train(struct drm_crtc *crtc)
1839 temp &= ~FDI_LINK_TRAIN_NONE; 2280 temp &= ~FDI_LINK_TRAIN_NONE;
1840 temp |= FDI_LINK_TRAIN_PATTERN_2; 2281 temp |= FDI_LINK_TRAIN_PATTERN_2;
1841 } 2282 }
1842 I915_WRITE(fdi_rx_reg, temp); 2283 I915_WRITE(reg, temp);
2284
2285 POSTING_READ(reg);
1843 udelay(150); 2286 udelay(150);
1844 2287
1845 for (i = 0; i < 4; i++ ) { 2288 for (i = 0; i < 4; i++ ) {
1846 temp = I915_READ(fdi_tx_reg); 2289 reg = FDI_TX_CTL(pipe);
2290 temp = I915_READ(reg);
1847 temp &= ~FDI_LINK_TRAIN_VOL_EMP_MASK; 2291 temp &= ~FDI_LINK_TRAIN_VOL_EMP_MASK;
1848 temp |= snb_b_fdi_train_param[i]; 2292 temp |= snb_b_fdi_train_param[i];
1849 I915_WRITE(fdi_tx_reg, temp); 2293 I915_WRITE(reg, temp);
2294
2295 POSTING_READ(reg);
1850 udelay(500); 2296 udelay(500);
1851 2297
1852 temp = I915_READ(fdi_rx_iir_reg); 2298 reg = FDI_RX_IIR(pipe);
2299 temp = I915_READ(reg);
1853 DRM_DEBUG_KMS("FDI_RX_IIR 0x%x\n", temp); 2300 DRM_DEBUG_KMS("FDI_RX_IIR 0x%x\n", temp);
1854 2301
1855 if (temp & FDI_RX_SYMBOL_LOCK) { 2302 if (temp & FDI_RX_SYMBOL_LOCK) {
1856 I915_WRITE(fdi_rx_iir_reg, 2303 I915_WRITE(reg, temp | FDI_RX_SYMBOL_LOCK);
1857 temp | FDI_RX_SYMBOL_LOCK);
1858 DRM_DEBUG_KMS("FDI train 2 done.\n"); 2304 DRM_DEBUG_KMS("FDI train 2 done.\n");
1859 break; 2305 break;
1860 } 2306 }
1861 } 2307 }
1862 if (i == 4) 2308 if (i == 4)
1863 DRM_DEBUG_KMS("FDI train 2 fail!\n"); 2309 DRM_ERROR("FDI train 2 fail!\n");
1864 2310
1865 DRM_DEBUG_KMS("FDI train done.\n"); 2311 DRM_DEBUG_KMS("FDI train done.\n");
1866} 2312}
1867 2313
1868static void ironlake_crtc_dpms(struct drm_crtc *crtc, int mode) 2314/* Manual link training for Ivy Bridge A0 parts */
2315static void ivb_manual_fdi_link_train(struct drm_crtc *crtc)
1869{ 2316{
1870 struct drm_device *dev = crtc->dev; 2317 struct drm_device *dev = crtc->dev;
1871 struct drm_i915_private *dev_priv = dev->dev_private; 2318 struct drm_i915_private *dev_priv = dev->dev_private;
1872 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 2319 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
1873 int pipe = intel_crtc->pipe; 2320 int pipe = intel_crtc->pipe;
1874 int plane = intel_crtc->plane; 2321 u32 reg, temp, i;
1875 int pch_dpll_reg = (pipe == 0) ? PCH_DPLL_A : PCH_DPLL_B;
1876 int pipeconf_reg = (pipe == 0) ? PIPEACONF : PIPEBCONF;
1877 int dspcntr_reg = (plane == 0) ? DSPACNTR : DSPBCNTR;
1878 int dspbase_reg = (plane == 0) ? DSPAADDR : DSPBADDR;
1879 int fdi_tx_reg = (pipe == 0) ? FDI_TXA_CTL : FDI_TXB_CTL;
1880 int fdi_rx_reg = (pipe == 0) ? FDI_RXA_CTL : FDI_RXB_CTL;
1881 int transconf_reg = (pipe == 0) ? TRANSACONF : TRANSBCONF;
1882 int cpu_htot_reg = (pipe == 0) ? HTOTAL_A : HTOTAL_B;
1883 int cpu_hblank_reg = (pipe == 0) ? HBLANK_A : HBLANK_B;
1884 int cpu_hsync_reg = (pipe == 0) ? HSYNC_A : HSYNC_B;
1885 int cpu_vtot_reg = (pipe == 0) ? VTOTAL_A : VTOTAL_B;
1886 int cpu_vblank_reg = (pipe == 0) ? VBLANK_A : VBLANK_B;
1887 int cpu_vsync_reg = (pipe == 0) ? VSYNC_A : VSYNC_B;
1888 int trans_htot_reg = (pipe == 0) ? TRANS_HTOTAL_A : TRANS_HTOTAL_B;
1889 int trans_hblank_reg = (pipe == 0) ? TRANS_HBLANK_A : TRANS_HBLANK_B;
1890 int trans_hsync_reg = (pipe == 0) ? TRANS_HSYNC_A : TRANS_HSYNC_B;
1891 int trans_vtot_reg = (pipe == 0) ? TRANS_VTOTAL_A : TRANS_VTOTAL_B;
1892 int trans_vblank_reg = (pipe == 0) ? TRANS_VBLANK_A : TRANS_VBLANK_B;
1893 int trans_vsync_reg = (pipe == 0) ? TRANS_VSYNC_A : TRANS_VSYNC_B;
1894 int trans_dpll_sel = (pipe == 0) ? 0 : 1;
1895 u32 temp;
1896 u32 pipe_bpc;
1897
1898 temp = I915_READ(pipeconf_reg);
1899 pipe_bpc = temp & PIPE_BPC_MASK;
1900 2322
1901 /* XXX: When our outputs are all unaware of DPMS modes other than off 2323 /* Train 1: umask FDI RX Interrupt symbol_lock and bit_lock bit
1902 * and on, we should map those modes to DRM_MODE_DPMS_OFF in the CRTC. 2324 for train result */
1903 */ 2325 reg = FDI_RX_IMR(pipe);
1904 switch (mode) { 2326 temp = I915_READ(reg);
1905 case DRM_MODE_DPMS_ON: 2327 temp &= ~FDI_RX_SYMBOL_LOCK;
1906 case DRM_MODE_DPMS_STANDBY: 2328 temp &= ~FDI_RX_BIT_LOCK;
1907 case DRM_MODE_DPMS_SUSPEND: 2329 I915_WRITE(reg, temp);
1908 DRM_DEBUG_KMS("crtc %d/%d dpms on\n", pipe, plane);
1909 2330
1910 if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) { 2331 POSTING_READ(reg);
1911 temp = I915_READ(PCH_LVDS); 2332 udelay(150);
1912 if ((temp & LVDS_PORT_EN) == 0) {
1913 I915_WRITE(PCH_LVDS, temp | LVDS_PORT_EN);
1914 POSTING_READ(PCH_LVDS);
1915 }
1916 }
1917 2333
1918 if (!HAS_eDP) { 2334 /* enable CPU FDI TX and PCH FDI RX */
2335 reg = FDI_TX_CTL(pipe);
2336 temp = I915_READ(reg);
2337 temp &= ~(7 << 19);
2338 temp |= (intel_crtc->fdi_lanes - 1) << 19;
2339 temp &= ~(FDI_LINK_TRAIN_AUTO | FDI_LINK_TRAIN_NONE_IVB);
2340 temp |= FDI_LINK_TRAIN_PATTERN_1_IVB;
2341 temp &= ~FDI_LINK_TRAIN_VOL_EMP_MASK;
2342 temp |= FDI_LINK_TRAIN_400MV_0DB_SNB_B;
2343 I915_WRITE(reg, temp | FDI_TX_ENABLE);
1919 2344
1920 /* enable PCH FDI RX PLL, wait warmup plus DMI latency */ 2345 reg = FDI_RX_CTL(pipe);
1921 temp = I915_READ(fdi_rx_reg); 2346 temp = I915_READ(reg);
1922 /* 2347 temp &= ~FDI_LINK_TRAIN_AUTO;
1923 * make the BPC in FDI Rx be consistent with that in 2348 temp &= ~FDI_LINK_TRAIN_PATTERN_MASK_CPT;
1924 * pipeconf reg. 2349 temp |= FDI_LINK_TRAIN_PATTERN_1_CPT;
1925 */ 2350 I915_WRITE(reg, temp | FDI_RX_ENABLE);
1926 temp &= ~(0x7 << 16);
1927 temp |= (pipe_bpc << 11);
1928 temp &= ~(7 << 19);
1929 temp |= (intel_crtc->fdi_lanes - 1) << 19;
1930 I915_WRITE(fdi_rx_reg, temp | FDI_RX_PLL_ENABLE);
1931 I915_READ(fdi_rx_reg);
1932 udelay(200);
1933 2351
1934 /* Switch from Rawclk to PCDclk */ 2352 POSTING_READ(reg);
1935 temp = I915_READ(fdi_rx_reg); 2353 udelay(150);
1936 I915_WRITE(fdi_rx_reg, temp | FDI_SEL_PCDCLK);
1937 I915_READ(fdi_rx_reg);
1938 udelay(200);
1939 2354
1940 /* Enable CPU FDI TX PLL, always on for Ironlake */ 2355 for (i = 0; i < 4; i++ ) {
1941 temp = I915_READ(fdi_tx_reg); 2356 reg = FDI_TX_CTL(pipe);
1942 if ((temp & FDI_TX_PLL_ENABLE) == 0) { 2357 temp = I915_READ(reg);
1943 I915_WRITE(fdi_tx_reg, temp | FDI_TX_PLL_ENABLE); 2358 temp &= ~FDI_LINK_TRAIN_VOL_EMP_MASK;
1944 I915_READ(fdi_tx_reg); 2359 temp |= snb_b_fdi_train_param[i];
1945 udelay(100); 2360 I915_WRITE(reg, temp);
1946 }
1947 }
1948 2361
1949 /* Enable panel fitting for LVDS */ 2362 POSTING_READ(reg);
1950 if (dev_priv->pch_pf_size && 2363 udelay(500);
1951 (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)
1952 || HAS_eDP || intel_pch_has_edp(crtc))) {
1953 /* Force use of hard-coded filter coefficients
1954 * as some pre-programmed values are broken,
1955 * e.g. x201.
1956 */
1957 I915_WRITE(pipe ? PFB_CTL_1 : PFA_CTL_1,
1958 PF_ENABLE | PF_FILTER_MED_3x3);
1959 I915_WRITE(pipe ? PFB_WIN_POS : PFA_WIN_POS,
1960 dev_priv->pch_pf_pos);
1961 I915_WRITE(pipe ? PFB_WIN_SZ : PFA_WIN_SZ,
1962 dev_priv->pch_pf_size);
1963 }
1964 2364
1965 /* Enable CPU pipe */ 2365 reg = FDI_RX_IIR(pipe);
1966 temp = I915_READ(pipeconf_reg); 2366 temp = I915_READ(reg);
1967 if ((temp & PIPEACONF_ENABLE) == 0) { 2367 DRM_DEBUG_KMS("FDI_RX_IIR 0x%x\n", temp);
1968 I915_WRITE(pipeconf_reg, temp | PIPEACONF_ENABLE);
1969 I915_READ(pipeconf_reg);
1970 udelay(100);
1971 }
1972 2368
1973 /* configure and enable CPU plane */ 2369 if (temp & FDI_RX_BIT_LOCK ||
1974 temp = I915_READ(dspcntr_reg); 2370 (I915_READ(reg) & FDI_RX_BIT_LOCK)) {
1975 if ((temp & DISPLAY_PLANE_ENABLE) == 0) { 2371 I915_WRITE(reg, temp | FDI_RX_BIT_LOCK);
1976 I915_WRITE(dspcntr_reg, temp | DISPLAY_PLANE_ENABLE); 2372 DRM_DEBUG_KMS("FDI train 1 done.\n");
1977 /* Flush the plane changes */ 2373 break;
1978 I915_WRITE(dspbase_reg, I915_READ(dspbase_reg));
1979 } 2374 }
2375 }
2376 if (i == 4)
2377 DRM_ERROR("FDI train 1 fail!\n");
1980 2378
1981 if (!HAS_eDP) { 2379 /* Train 2 */
1982 /* For PCH output, training FDI link */ 2380 reg = FDI_TX_CTL(pipe);
1983 if (IS_GEN6(dev)) 2381 temp = I915_READ(reg);
1984 gen6_fdi_link_train(crtc); 2382 temp &= ~FDI_LINK_TRAIN_NONE_IVB;
1985 else 2383 temp |= FDI_LINK_TRAIN_PATTERN_2_IVB;
1986 ironlake_fdi_link_train(crtc); 2384 temp &= ~FDI_LINK_TRAIN_VOL_EMP_MASK;
2385 temp |= FDI_LINK_TRAIN_400MV_0DB_SNB_B;
2386 I915_WRITE(reg, temp);
1987 2387
1988 /* enable PCH DPLL */ 2388 reg = FDI_RX_CTL(pipe);
1989 temp = I915_READ(pch_dpll_reg); 2389 temp = I915_READ(reg);
1990 if ((temp & DPLL_VCO_ENABLE) == 0) { 2390 temp &= ~FDI_LINK_TRAIN_PATTERN_MASK_CPT;
1991 I915_WRITE(pch_dpll_reg, temp | DPLL_VCO_ENABLE); 2391 temp |= FDI_LINK_TRAIN_PATTERN_2_CPT;
1992 I915_READ(pch_dpll_reg); 2392 I915_WRITE(reg, temp);
1993 }
1994 udelay(200);
1995 2393
1996 if (HAS_PCH_CPT(dev)) { 2394 POSTING_READ(reg);
1997 /* Be sure PCH DPLL SEL is set */ 2395 udelay(150);
1998 temp = I915_READ(PCH_DPLL_SEL);
1999 if (trans_dpll_sel == 0 &&
2000 (temp & TRANSA_DPLL_ENABLE) == 0)
2001 temp |= (TRANSA_DPLL_ENABLE | TRANSA_DPLLA_SEL);
2002 else if (trans_dpll_sel == 1 &&
2003 (temp & TRANSB_DPLL_ENABLE) == 0)
2004 temp |= (TRANSB_DPLL_ENABLE | TRANSB_DPLLB_SEL);
2005 I915_WRITE(PCH_DPLL_SEL, temp);
2006 I915_READ(PCH_DPLL_SEL);
2007 }
2008 2396
2009 /* set transcoder timing */ 2397 for (i = 0; i < 4; i++ ) {
2010 I915_WRITE(trans_htot_reg, I915_READ(cpu_htot_reg)); 2398 reg = FDI_TX_CTL(pipe);
2011 I915_WRITE(trans_hblank_reg, I915_READ(cpu_hblank_reg)); 2399 temp = I915_READ(reg);
2012 I915_WRITE(trans_hsync_reg, I915_READ(cpu_hsync_reg)); 2400 temp &= ~FDI_LINK_TRAIN_VOL_EMP_MASK;
2013 2401 temp |= snb_b_fdi_train_param[i];
2014 I915_WRITE(trans_vtot_reg, I915_READ(cpu_vtot_reg)); 2402 I915_WRITE(reg, temp);
2015 I915_WRITE(trans_vblank_reg, I915_READ(cpu_vblank_reg));
2016 I915_WRITE(trans_vsync_reg, I915_READ(cpu_vsync_reg));
2017
2018 /* enable normal train */
2019 temp = I915_READ(fdi_tx_reg);
2020 temp &= ~FDI_LINK_TRAIN_NONE;
2021 I915_WRITE(fdi_tx_reg, temp | FDI_LINK_TRAIN_NONE |
2022 FDI_TX_ENHANCE_FRAME_ENABLE);
2023 I915_READ(fdi_tx_reg);
2024
2025 temp = I915_READ(fdi_rx_reg);
2026 if (HAS_PCH_CPT(dev)) {
2027 temp &= ~FDI_LINK_TRAIN_PATTERN_MASK_CPT;
2028 temp |= FDI_LINK_TRAIN_NORMAL_CPT;
2029 } else {
2030 temp &= ~FDI_LINK_TRAIN_NONE;
2031 temp |= FDI_LINK_TRAIN_NONE;
2032 }
2033 I915_WRITE(fdi_rx_reg, temp | FDI_RX_ENHANCE_FRAME_ENABLE);
2034 I915_READ(fdi_rx_reg);
2035
2036 /* wait one idle pattern time */
2037 udelay(100);
2038
2039 /* For PCH DP, enable TRANS_DP_CTL */
2040 if (HAS_PCH_CPT(dev) &&
2041 intel_pipe_has_type(crtc, INTEL_OUTPUT_DISPLAYPORT)) {
2042 int trans_dp_ctl = (pipe == 0) ? TRANS_DP_CTL_A : TRANS_DP_CTL_B;
2043 int reg;
2044
2045 reg = I915_READ(trans_dp_ctl);
2046 reg &= ~(TRANS_DP_PORT_SEL_MASK |
2047 TRANS_DP_SYNC_MASK);
2048 reg |= (TRANS_DP_OUTPUT_ENABLE |
2049 TRANS_DP_ENH_FRAMING);
2050
2051 if (crtc->mode.flags & DRM_MODE_FLAG_PHSYNC)
2052 reg |= TRANS_DP_HSYNC_ACTIVE_HIGH;
2053 if (crtc->mode.flags & DRM_MODE_FLAG_PVSYNC)
2054 reg |= TRANS_DP_VSYNC_ACTIVE_HIGH;
2055
2056 switch (intel_trans_dp_port_sel(crtc)) {
2057 case PCH_DP_B:
2058 reg |= TRANS_DP_PORT_SEL_B;
2059 break;
2060 case PCH_DP_C:
2061 reg |= TRANS_DP_PORT_SEL_C;
2062 break;
2063 case PCH_DP_D:
2064 reg |= TRANS_DP_PORT_SEL_D;
2065 break;
2066 default:
2067 DRM_DEBUG_KMS("Wrong PCH DP port return. Guess port B\n");
2068 reg |= TRANS_DP_PORT_SEL_B;
2069 break;
2070 }
2071 2403
2072 I915_WRITE(trans_dp_ctl, reg); 2404 POSTING_READ(reg);
2073 POSTING_READ(trans_dp_ctl); 2405 udelay(500);
2074 }
2075 2406
2076 /* enable PCH transcoder */ 2407 reg = FDI_RX_IIR(pipe);
2077 temp = I915_READ(transconf_reg); 2408 temp = I915_READ(reg);
2078 /* 2409 DRM_DEBUG_KMS("FDI_RX_IIR 0x%x\n", temp);
2079 * make the BPC in transcoder be consistent with
2080 * that in pipeconf reg.
2081 */
2082 temp &= ~PIPE_BPC_MASK;
2083 temp |= pipe_bpc;
2084 I915_WRITE(transconf_reg, temp | TRANS_ENABLE);
2085 I915_READ(transconf_reg);
2086 2410
2087 if (wait_for(I915_READ(transconf_reg) & TRANS_STATE_ENABLE, 100, 1)) 2411 if (temp & FDI_RX_SYMBOL_LOCK) {
2088 DRM_ERROR("failed to enable transcoder\n"); 2412 I915_WRITE(reg, temp | FDI_RX_SYMBOL_LOCK);
2413 DRM_DEBUG_KMS("FDI train 2 done.\n");
2414 break;
2089 } 2415 }
2416 }
2417 if (i == 4)
2418 DRM_ERROR("FDI train 2 fail!\n");
2090 2419
2091 intel_crtc_load_lut(crtc); 2420 DRM_DEBUG_KMS("FDI train done.\n");
2421}
2092 2422
2093 intel_update_fbc(crtc, &crtc->mode); 2423static void ironlake_fdi_pll_enable(struct drm_crtc *crtc)
2094 break; 2424{
2425 struct drm_device *dev = crtc->dev;
2426 struct drm_i915_private *dev_priv = dev->dev_private;
2427 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
2428 int pipe = intel_crtc->pipe;
2429 u32 reg, temp;
2095 2430
2096 case DRM_MODE_DPMS_OFF: 2431 /* Write the TU size bits so error detection works */
2097 DRM_DEBUG_KMS("crtc %d/%d dpms off\n", pipe, plane); 2432 I915_WRITE(FDI_RX_TUSIZE1(pipe),
2433 I915_READ(PIPE_DATA_M1(pipe)) & TU_SIZE_MASK);
2098 2434
2099 drm_vblank_off(dev, pipe); 2435 /* enable PCH FDI RX PLL, wait warmup plus DMI latency */
2100 /* Disable display plane */ 2436 reg = FDI_RX_CTL(pipe);
2101 temp = I915_READ(dspcntr_reg); 2437 temp = I915_READ(reg);
2102 if ((temp & DISPLAY_PLANE_ENABLE) != 0) { 2438 temp &= ~((0x7 << 19) | (0x7 << 16));
2103 I915_WRITE(dspcntr_reg, temp & ~DISPLAY_PLANE_ENABLE); 2439 temp |= (intel_crtc->fdi_lanes - 1) << 19;
2104 /* Flush the plane changes */ 2440 temp |= (I915_READ(PIPECONF(pipe)) & PIPE_BPC_MASK) << 11;
2105 I915_WRITE(dspbase_reg, I915_READ(dspbase_reg)); 2441 I915_WRITE(reg, temp | FDI_RX_PLL_ENABLE);
2106 I915_READ(dspbase_reg);
2107 }
2108 2442
2109 if (dev_priv->cfb_plane == plane && 2443 POSTING_READ(reg);
2110 dev_priv->display.disable_fbc) 2444 udelay(200);
2111 dev_priv->display.disable_fbc(dev);
2112 2445
2113 /* disable cpu pipe, disable after all planes disabled */ 2446 /* Switch from Rawclk to PCDclk */
2114 temp = I915_READ(pipeconf_reg); 2447 temp = I915_READ(reg);
2115 if ((temp & PIPEACONF_ENABLE) != 0) { 2448 I915_WRITE(reg, temp | FDI_PCDCLK);
2116 I915_WRITE(pipeconf_reg, temp & ~PIPEACONF_ENABLE);
2117 2449
2118 /* wait for cpu pipe off, pipe state */ 2450 POSTING_READ(reg);
2119 if (wait_for((I915_READ(pipeconf_reg) & I965_PIPECONF_ACTIVE) == 0, 50, 1)) 2451 udelay(200);
2120 DRM_ERROR("failed to turn off cpu pipe\n"); 2452
2121 } else 2453 /* Enable CPU FDI TX PLL, always on for Ironlake */
2122 DRM_DEBUG_KMS("crtc %d is disabled\n", pipe); 2454 reg = FDI_TX_CTL(pipe);
2455 temp = I915_READ(reg);
2456 if ((temp & FDI_TX_PLL_ENABLE) == 0) {
2457 I915_WRITE(reg, temp | FDI_TX_PLL_ENABLE);
2123 2458
2459 POSTING_READ(reg);
2124 udelay(100); 2460 udelay(100);
2461 }
2462}
2463
2464static void ironlake_fdi_disable(struct drm_crtc *crtc)
2465{
2466 struct drm_device *dev = crtc->dev;
2467 struct drm_i915_private *dev_priv = dev->dev_private;
2468 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
2469 int pipe = intel_crtc->pipe;
2470 u32 reg, temp;
2471
2472 /* disable CPU FDI tx and PCH FDI rx */
2473 reg = FDI_TX_CTL(pipe);
2474 temp = I915_READ(reg);
2475 I915_WRITE(reg, temp & ~FDI_TX_ENABLE);
2476 POSTING_READ(reg);
2477
2478 reg = FDI_RX_CTL(pipe);
2479 temp = I915_READ(reg);
2480 temp &= ~(0x7 << 16);
2481 temp |= (I915_READ(PIPECONF(pipe)) & PIPE_BPC_MASK) << 11;
2482 I915_WRITE(reg, temp & ~FDI_RX_ENABLE);
2483
2484 POSTING_READ(reg);
2485 udelay(100);
2486
2487 /* Ironlake workaround, disable clock pointer after downing FDI */
2488 if (HAS_PCH_IBX(dev)) {
2489 I915_WRITE(FDI_RX_CHICKEN(pipe), FDI_RX_PHASE_SYNC_POINTER_OVR);
2490 I915_WRITE(FDI_RX_CHICKEN(pipe),
2491 I915_READ(FDI_RX_CHICKEN(pipe) &
2492 ~FDI_RX_PHASE_SYNC_POINTER_EN));
2493 }
2494
2495 /* still set train pattern 1 */
2496 reg = FDI_TX_CTL(pipe);
2497 temp = I915_READ(reg);
2498 temp &= ~FDI_LINK_TRAIN_NONE;
2499 temp |= FDI_LINK_TRAIN_PATTERN_1;
2500 I915_WRITE(reg, temp);
2501
2502 reg = FDI_RX_CTL(pipe);
2503 temp = I915_READ(reg);
2504 if (HAS_PCH_CPT(dev)) {
2505 temp &= ~FDI_LINK_TRAIN_PATTERN_MASK_CPT;
2506 temp |= FDI_LINK_TRAIN_PATTERN_1_CPT;
2507 } else {
2508 temp &= ~FDI_LINK_TRAIN_NONE;
2509 temp |= FDI_LINK_TRAIN_PATTERN_1;
2510 }
2511 /* BPC in FDI rx is consistent with that in PIPECONF */
2512 temp &= ~(0x07 << 16);
2513 temp |= (I915_READ(PIPECONF(pipe)) & PIPE_BPC_MASK) << 11;
2514 I915_WRITE(reg, temp);
2125 2515
2126 /* Disable PF */ 2516 POSTING_READ(reg);
2127 I915_WRITE(pipe ? PFB_CTL_1 : PFA_CTL_1, 0); 2517 udelay(100);
2128 I915_WRITE(pipe ? PFB_WIN_SZ : PFA_WIN_SZ, 0); 2518}
2129 2519
2130 /* disable CPU FDI tx and PCH FDI rx */ 2520/*
2131 temp = I915_READ(fdi_tx_reg); 2521 * When we disable a pipe, we need to clear any pending scanline wait events
2132 I915_WRITE(fdi_tx_reg, temp & ~FDI_TX_ENABLE); 2522 * to avoid hanging the ring, which we assume we are waiting on.
2133 I915_READ(fdi_tx_reg); 2523 */
2524static void intel_clear_scanline_wait(struct drm_device *dev)
2525{
2526 struct drm_i915_private *dev_priv = dev->dev_private;
2527 struct intel_ring_buffer *ring;
2528 u32 tmp;
2134 2529
2135 temp = I915_READ(fdi_rx_reg); 2530 if (IS_GEN2(dev))
2136 /* BPC in FDI rx is consistent with that in pipeconf */ 2531 /* Can't break the hang on i8xx */
2137 temp &= ~(0x07 << 16); 2532 return;
2138 temp |= (pipe_bpc << 11);
2139 I915_WRITE(fdi_rx_reg, temp & ~FDI_RX_ENABLE);
2140 I915_READ(fdi_rx_reg);
2141 2533
2142 udelay(100); 2534 ring = LP_RING(dev_priv);
2535 tmp = I915_READ_CTL(ring);
2536 if (tmp & RING_WAIT)
2537 I915_WRITE_CTL(ring, tmp);
2538}
2143 2539
2144 /* still set train pattern 1 */ 2540static void intel_crtc_wait_for_pending_flips(struct drm_crtc *crtc)
2145 temp = I915_READ(fdi_tx_reg); 2541{
2146 temp &= ~FDI_LINK_TRAIN_NONE; 2542 struct drm_i915_gem_object *obj;
2147 temp |= FDI_LINK_TRAIN_PATTERN_1; 2543 struct drm_i915_private *dev_priv;
2148 I915_WRITE(fdi_tx_reg, temp);
2149 POSTING_READ(fdi_tx_reg);
2150 2544
2151 temp = I915_READ(fdi_rx_reg); 2545 if (crtc->fb == NULL)
2152 if (HAS_PCH_CPT(dev)) { 2546 return;
2153 temp &= ~FDI_LINK_TRAIN_PATTERN_MASK_CPT;
2154 temp |= FDI_LINK_TRAIN_PATTERN_1_CPT;
2155 } else {
2156 temp &= ~FDI_LINK_TRAIN_NONE;
2157 temp |= FDI_LINK_TRAIN_PATTERN_1;
2158 }
2159 I915_WRITE(fdi_rx_reg, temp);
2160 POSTING_READ(fdi_rx_reg);
2161 2547
2162 udelay(100); 2548 obj = to_intel_framebuffer(crtc->fb)->obj;
2549 dev_priv = crtc->dev->dev_private;
2550 wait_event(dev_priv->pending_flip_queue,
2551 atomic_read(&obj->pending_flip) == 0);
2552}
2163 2553
2164 if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) { 2554static bool intel_crtc_driving_pch(struct drm_crtc *crtc)
2165 temp = I915_READ(PCH_LVDS); 2555{
2166 I915_WRITE(PCH_LVDS, temp & ~LVDS_PORT_EN); 2556 struct drm_device *dev = crtc->dev;
2167 I915_READ(PCH_LVDS); 2557 struct drm_mode_config *mode_config = &dev->mode_config;
2168 udelay(100); 2558 struct intel_encoder *encoder;
2169 }
2170 2559
2171 /* disable PCH transcoder */ 2560 /*
2172 temp = I915_READ(transconf_reg); 2561 * If there's a non-PCH eDP on this crtc, it must be DP_A, and that
2173 if ((temp & TRANS_ENABLE) != 0) { 2562 * must be driven by its own crtc; no sharing is possible.
2174 I915_WRITE(transconf_reg, temp & ~TRANS_ENABLE); 2563 */
2564 list_for_each_entry(encoder, &mode_config->encoder_list, base.head) {
2565 if (encoder->base.crtc != crtc)
2566 continue;
2175 2567
2176 /* wait for PCH transcoder off, transcoder state */ 2568 switch (encoder->type) {
2177 if (wait_for((I915_READ(transconf_reg) & TRANS_STATE_ENABLE) == 0, 50, 1)) 2569 case INTEL_OUTPUT_EDP:
2178 DRM_ERROR("failed to disable transcoder\n"); 2570 if (!intel_encoder_is_pch_edp(&encoder->base))
2571 return false;
2572 continue;
2179 } 2573 }
2574 }
2180 2575
2181 temp = I915_READ(transconf_reg); 2576 return true;
2182 /* BPC in transcoder is consistent with that in pipeconf */ 2577}
2183 temp &= ~PIPE_BPC_MASK;
2184 temp |= pipe_bpc;
2185 I915_WRITE(transconf_reg, temp);
2186 I915_READ(transconf_reg);
2187 udelay(100);
2188 2578
2189 if (HAS_PCH_CPT(dev)) { 2579/*
2190 /* disable TRANS_DP_CTL */ 2580 * Enable PCH resources required for PCH ports:
2191 int trans_dp_ctl = (pipe == 0) ? TRANS_DP_CTL_A : TRANS_DP_CTL_B; 2581 * - PCH PLLs
2192 int reg; 2582 * - FDI training & RX/TX
2583 * - update transcoder timings
2584 * - DP transcoding bits
2585 * - transcoder
2586 */
2587static void ironlake_pch_enable(struct drm_crtc *crtc)
2588{
2589 struct drm_device *dev = crtc->dev;
2590 struct drm_i915_private *dev_priv = dev->dev_private;
2591 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
2592 int pipe = intel_crtc->pipe;
2593 u32 reg, temp;
2193 2594
2194 reg = I915_READ(trans_dp_ctl); 2595 /* For PCH output, training FDI link */
2195 reg &= ~(TRANS_DP_OUTPUT_ENABLE | TRANS_DP_PORT_SEL_MASK); 2596 dev_priv->display.fdi_link_train(crtc);
2196 I915_WRITE(trans_dp_ctl, reg);
2197 POSTING_READ(trans_dp_ctl);
2198 2597
2199 /* disable DPLL_SEL */ 2598 intel_enable_pch_pll(dev_priv, pipe);
2200 temp = I915_READ(PCH_DPLL_SEL); 2599
2201 if (trans_dpll_sel == 0) 2600 if (HAS_PCH_CPT(dev)) {
2202 temp &= ~(TRANSA_DPLL_ENABLE | TRANSA_DPLLB_SEL); 2601 /* Be sure PCH DPLL SEL is set */
2203 else 2602 temp = I915_READ(PCH_DPLL_SEL);
2204 temp &= ~(TRANSB_DPLL_ENABLE | TRANSB_DPLLB_SEL); 2603 if (pipe == 0 && (temp & TRANSA_DPLL_ENABLE) == 0)
2205 I915_WRITE(PCH_DPLL_SEL, temp); 2604 temp |= (TRANSA_DPLL_ENABLE | TRANSA_DPLLA_SEL);
2206 I915_READ(PCH_DPLL_SEL); 2605 else if (pipe == 1 && (temp & TRANSB_DPLL_ENABLE) == 0)
2606 temp |= (TRANSB_DPLL_ENABLE | TRANSB_DPLLB_SEL);
2607 I915_WRITE(PCH_DPLL_SEL, temp);
2608 }
2207 2609
2610 /* set transcoder timing, panel must allow it */
2611 assert_panel_unlocked(dev_priv, pipe);
2612 I915_WRITE(TRANS_HTOTAL(pipe), I915_READ(HTOTAL(pipe)));
2613 I915_WRITE(TRANS_HBLANK(pipe), I915_READ(HBLANK(pipe)));
2614 I915_WRITE(TRANS_HSYNC(pipe), I915_READ(HSYNC(pipe)));
2615
2616 I915_WRITE(TRANS_VTOTAL(pipe), I915_READ(VTOTAL(pipe)));
2617 I915_WRITE(TRANS_VBLANK(pipe), I915_READ(VBLANK(pipe)));
2618 I915_WRITE(TRANS_VSYNC(pipe), I915_READ(VSYNC(pipe)));
2619
2620 intel_fdi_normal_train(crtc);
2621
2622 /* For PCH DP, enable TRANS_DP_CTL */
2623 if (HAS_PCH_CPT(dev) &&
2624 intel_pipe_has_type(crtc, INTEL_OUTPUT_DISPLAYPORT)) {
2625 reg = TRANS_DP_CTL(pipe);
2626 temp = I915_READ(reg);
2627 temp &= ~(TRANS_DP_PORT_SEL_MASK |
2628 TRANS_DP_SYNC_MASK |
2629 TRANS_DP_BPC_MASK);
2630 temp |= (TRANS_DP_OUTPUT_ENABLE |
2631 TRANS_DP_ENH_FRAMING);
2632 temp |= TRANS_DP_8BPC;
2633
2634 if (crtc->mode.flags & DRM_MODE_FLAG_PHSYNC)
2635 temp |= TRANS_DP_HSYNC_ACTIVE_HIGH;
2636 if (crtc->mode.flags & DRM_MODE_FLAG_PVSYNC)
2637 temp |= TRANS_DP_VSYNC_ACTIVE_HIGH;
2638
2639 switch (intel_trans_dp_port_sel(crtc)) {
2640 case PCH_DP_B:
2641 temp |= TRANS_DP_PORT_SEL_B;
2642 break;
2643 case PCH_DP_C:
2644 temp |= TRANS_DP_PORT_SEL_C;
2645 break;
2646 case PCH_DP_D:
2647 temp |= TRANS_DP_PORT_SEL_D;
2648 break;
2649 default:
2650 DRM_DEBUG_KMS("Wrong PCH DP port return. Guess port B\n");
2651 temp |= TRANS_DP_PORT_SEL_B;
2652 break;
2208 } 2653 }
2209 2654
2210 /* disable PCH DPLL */ 2655 I915_WRITE(reg, temp);
2211 temp = I915_READ(pch_dpll_reg); 2656 }
2212 I915_WRITE(pch_dpll_reg, temp & ~DPLL_VCO_ENABLE);
2213 I915_READ(pch_dpll_reg);
2214
2215 /* Switch from PCDclk to Rawclk */
2216 temp = I915_READ(fdi_rx_reg);
2217 temp &= ~FDI_SEL_PCDCLK;
2218 I915_WRITE(fdi_rx_reg, temp);
2219 I915_READ(fdi_rx_reg);
2220
2221 /* Disable CPU FDI TX PLL */
2222 temp = I915_READ(fdi_tx_reg);
2223 I915_WRITE(fdi_tx_reg, temp & ~FDI_TX_PLL_ENABLE);
2224 I915_READ(fdi_tx_reg);
2225 udelay(100);
2226 2657
2227 temp = I915_READ(fdi_rx_reg); 2658 intel_enable_transcoder(dev_priv, pipe);
2228 temp &= ~FDI_RX_PLL_ENABLE; 2659}
2229 I915_WRITE(fdi_rx_reg, temp);
2230 I915_READ(fdi_rx_reg);
2231 2660
2232 /* Wait for the clocks to turn off. */ 2661static void ironlake_crtc_enable(struct drm_crtc *crtc)
2233 udelay(100); 2662{
2234 break; 2663 struct drm_device *dev = crtc->dev;
2664 struct drm_i915_private *dev_priv = dev->dev_private;
2665 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
2666 int pipe = intel_crtc->pipe;
2667 int plane = intel_crtc->plane;
2668 u32 temp;
2669 bool is_pch_port;
2670
2671 if (intel_crtc->active)
2672 return;
2673
2674 intel_crtc->active = true;
2675 intel_update_watermarks(dev);
2676
2677 if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) {
2678 temp = I915_READ(PCH_LVDS);
2679 if ((temp & LVDS_PORT_EN) == 0)
2680 I915_WRITE(PCH_LVDS, temp | LVDS_PORT_EN);
2235 } 2681 }
2682
2683 is_pch_port = intel_crtc_driving_pch(crtc);
2684
2685 if (is_pch_port)
2686 ironlake_fdi_pll_enable(crtc);
2687 else
2688 ironlake_fdi_disable(crtc);
2689
2690 /* Enable panel fitting for LVDS */
2691 if (dev_priv->pch_pf_size &&
2692 (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS) || HAS_eDP)) {
2693 /* Force use of hard-coded filter coefficients
2694 * as some pre-programmed values are broken,
2695 * e.g. x201.
2696 */
2697 I915_WRITE(PF_CTL(pipe), PF_ENABLE | PF_FILTER_MED_3x3);
2698 I915_WRITE(PF_WIN_POS(pipe), dev_priv->pch_pf_pos);
2699 I915_WRITE(PF_WIN_SZ(pipe), dev_priv->pch_pf_size);
2700 }
2701
2702 intel_enable_pipe(dev_priv, pipe, is_pch_port);
2703 intel_enable_plane(dev_priv, plane, pipe);
2704
2705 if (is_pch_port)
2706 ironlake_pch_enable(crtc);
2707
2708 intel_crtc_load_lut(crtc);
2709
2710 mutex_lock(&dev->struct_mutex);
2711 intel_update_fbc(dev);
2712 mutex_unlock(&dev->struct_mutex);
2713
2714 intel_crtc_update_cursor(crtc, true);
2236} 2715}
2237 2716
2238static void intel_crtc_dpms_overlay(struct intel_crtc *intel_crtc, bool enable) 2717static void ironlake_crtc_disable(struct drm_crtc *crtc)
2239{ 2718{
2240 struct intel_overlay *overlay; 2719 struct drm_device *dev = crtc->dev;
2241 int ret; 2720 struct drm_i915_private *dev_priv = dev->dev_private;
2721 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
2722 int pipe = intel_crtc->pipe;
2723 int plane = intel_crtc->plane;
2724 u32 reg, temp;
2242 2725
2243 if (!enable && intel_crtc->overlay) { 2726 if (!intel_crtc->active)
2244 overlay = intel_crtc->overlay; 2727 return;
2245 mutex_lock(&overlay->dev->struct_mutex);
2246 for (;;) {
2247 ret = intel_overlay_switch_off(overlay);
2248 if (ret == 0)
2249 break;
2250 2728
2251 ret = intel_overlay_recover_from_interrupt(overlay, 0); 2729 intel_crtc_wait_for_pending_flips(crtc);
2252 if (ret != 0) { 2730 drm_vblank_off(dev, pipe);
2253 /* overlay doesn't react anymore. Usually 2731 intel_crtc_update_cursor(crtc, false);
2254 * results in a black screen and an unkillable 2732
2255 * X server. */ 2733 intel_disable_plane(dev_priv, plane, pipe);
2256 BUG(); 2734
2257 overlay->hw_wedged = HW_WEDGED; 2735 if (dev_priv->cfb_plane == plane &&
2258 break; 2736 dev_priv->display.disable_fbc)
2259 } 2737 dev_priv->display.disable_fbc(dev);
2738
2739 intel_disable_pipe(dev_priv, pipe);
2740
2741 /* Disable PF */
2742 I915_WRITE(PF_CTL(pipe), 0);
2743 I915_WRITE(PF_WIN_SZ(pipe), 0);
2744
2745 ironlake_fdi_disable(crtc);
2746
2747 /* This is a horrible layering violation; we should be doing this in
2748 * the connector/encoder ->prepare instead, but we don't always have
2749 * enough information there about the config to know whether it will
2750 * actually be necessary or just cause undesired flicker.
2751 */
2752 intel_disable_pch_ports(dev_priv, pipe);
2753
2754 intel_disable_transcoder(dev_priv, pipe);
2755
2756 if (HAS_PCH_CPT(dev)) {
2757 /* disable TRANS_DP_CTL */
2758 reg = TRANS_DP_CTL(pipe);
2759 temp = I915_READ(reg);
2760 temp &= ~(TRANS_DP_OUTPUT_ENABLE | TRANS_DP_PORT_SEL_MASK);
2761 temp |= TRANS_DP_PORT_SEL_NONE;
2762 I915_WRITE(reg, temp);
2763
2764 /* disable DPLL_SEL */
2765 temp = I915_READ(PCH_DPLL_SEL);
2766 switch (pipe) {
2767 case 0:
2768 temp &= ~(TRANSA_DPLL_ENABLE | TRANSA_DPLLA_SEL);
2769 break;
2770 case 1:
2771 temp &= ~(TRANSB_DPLL_ENABLE | TRANSB_DPLLB_SEL);
2772 break;
2773 case 2:
2774 /* FIXME: manage transcoder PLLs? */
2775 temp &= ~(TRANSC_DPLL_ENABLE | TRANSC_DPLLB_SEL);
2776 break;
2777 default:
2778 BUG(); /* wtf */
2260 } 2779 }
2261 mutex_unlock(&overlay->dev->struct_mutex); 2780 I915_WRITE(PCH_DPLL_SEL, temp);
2262 } 2781 }
2263 /* Let userspace switch the overlay on again. In most cases userspace
2264 * has to recompute where to put it anyway. */
2265 2782
2266 return; 2783 /* disable PCH DPLL */
2784 intel_disable_pch_pll(dev_priv, pipe);
2785
2786 /* Switch from PCDclk to Rawclk */
2787 reg = FDI_RX_CTL(pipe);
2788 temp = I915_READ(reg);
2789 I915_WRITE(reg, temp & ~FDI_PCDCLK);
2790
2791 /* Disable CPU FDI TX PLL */
2792 reg = FDI_TX_CTL(pipe);
2793 temp = I915_READ(reg);
2794 I915_WRITE(reg, temp & ~FDI_TX_PLL_ENABLE);
2795
2796 POSTING_READ(reg);
2797 udelay(100);
2798
2799 reg = FDI_RX_CTL(pipe);
2800 temp = I915_READ(reg);
2801 I915_WRITE(reg, temp & ~FDI_RX_PLL_ENABLE);
2802
2803 /* Wait for the clocks to turn off. */
2804 POSTING_READ(reg);
2805 udelay(100);
2806
2807 intel_crtc->active = false;
2808 intel_update_watermarks(dev);
2809
2810 mutex_lock(&dev->struct_mutex);
2811 intel_update_fbc(dev);
2812 intel_clear_scanline_wait(dev);
2813 mutex_unlock(&dev->struct_mutex);
2267} 2814}
2268 2815
2269static void i9xx_crtc_dpms(struct drm_crtc *crtc, int mode) 2816static void ironlake_crtc_dpms(struct drm_crtc *crtc, int mode)
2270{ 2817{
2271 struct drm_device *dev = crtc->dev;
2272 struct drm_i915_private *dev_priv = dev->dev_private;
2273 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 2818 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
2274 int pipe = intel_crtc->pipe; 2819 int pipe = intel_crtc->pipe;
2275 int plane = intel_crtc->plane; 2820 int plane = intel_crtc->plane;
2276 int dpll_reg = (pipe == 0) ? DPLL_A : DPLL_B;
2277 int dspcntr_reg = (plane == 0) ? DSPACNTR : DSPBCNTR;
2278 int dspbase_reg = (plane == 0) ? DSPAADDR : DSPBADDR;
2279 int pipeconf_reg = (pipe == 0) ? PIPEACONF : PIPEBCONF;
2280 u32 temp;
2281 2821
2282 /* XXX: When our outputs are all unaware of DPMS modes other than off 2822 /* XXX: When our outputs are all unaware of DPMS modes other than off
2283 * and on, we should map those modes to DRM_MODE_DPMS_OFF in the CRTC. 2823 * and on, we should map those modes to DRM_MODE_DPMS_OFF in the CRTC.
@@ -2286,88 +2826,105 @@ static void i9xx_crtc_dpms(struct drm_crtc *crtc, int mode)
2286 case DRM_MODE_DPMS_ON: 2826 case DRM_MODE_DPMS_ON:
2287 case DRM_MODE_DPMS_STANDBY: 2827 case DRM_MODE_DPMS_STANDBY:
2288 case DRM_MODE_DPMS_SUSPEND: 2828 case DRM_MODE_DPMS_SUSPEND:
2289 /* Enable the DPLL */ 2829 DRM_DEBUG_KMS("crtc %d/%d dpms on\n", pipe, plane);
2290 temp = I915_READ(dpll_reg); 2830 ironlake_crtc_enable(crtc);
2291 if ((temp & DPLL_VCO_ENABLE) == 0) { 2831 break;
2292 I915_WRITE(dpll_reg, temp);
2293 I915_READ(dpll_reg);
2294 /* Wait for the clocks to stabilize. */
2295 udelay(150);
2296 I915_WRITE(dpll_reg, temp | DPLL_VCO_ENABLE);
2297 I915_READ(dpll_reg);
2298 /* Wait for the clocks to stabilize. */
2299 udelay(150);
2300 I915_WRITE(dpll_reg, temp | DPLL_VCO_ENABLE);
2301 I915_READ(dpll_reg);
2302 /* Wait for the clocks to stabilize. */
2303 udelay(150);
2304 }
2305 2832
2306 /* Enable the pipe */ 2833 case DRM_MODE_DPMS_OFF:
2307 temp = I915_READ(pipeconf_reg); 2834 DRM_DEBUG_KMS("crtc %d/%d dpms off\n", pipe, plane);
2308 if ((temp & PIPEACONF_ENABLE) == 0) 2835 ironlake_crtc_disable(crtc);
2309 I915_WRITE(pipeconf_reg, temp | PIPEACONF_ENABLE); 2836 break;
2310 2837 }
2311 /* Enable the plane */ 2838}
2312 temp = I915_READ(dspcntr_reg); 2839
2313 if ((temp & DISPLAY_PLANE_ENABLE) == 0) { 2840static void intel_crtc_dpms_overlay(struct intel_crtc *intel_crtc, bool enable)
2314 I915_WRITE(dspcntr_reg, temp | DISPLAY_PLANE_ENABLE); 2841{
2315 /* Flush the plane changes */ 2842 if (!enable && intel_crtc->overlay) {
2316 I915_WRITE(dspbase_reg, I915_READ(dspbase_reg)); 2843 struct drm_device *dev = intel_crtc->base.dev;
2317 } 2844 struct drm_i915_private *dev_priv = dev->dev_private;
2845
2846 mutex_lock(&dev->struct_mutex);
2847 dev_priv->mm.interruptible = false;
2848 (void) intel_overlay_switch_off(intel_crtc->overlay);
2849 dev_priv->mm.interruptible = true;
2850 mutex_unlock(&dev->struct_mutex);
2851 }
2318 2852
2319 intel_crtc_load_lut(crtc); 2853 /* Let userspace switch the overlay on again. In most cases userspace
2854 * has to recompute where to put it anyway.
2855 */
2856}
2320 2857
2321 if ((IS_I965G(dev) || plane == 0)) 2858static void i9xx_crtc_enable(struct drm_crtc *crtc)
2322 intel_update_fbc(crtc, &crtc->mode); 2859{
2860 struct drm_device *dev = crtc->dev;
2861 struct drm_i915_private *dev_priv = dev->dev_private;
2862 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
2863 int pipe = intel_crtc->pipe;
2864 int plane = intel_crtc->plane;
2323 2865
2324 /* Give the overlay scaler a chance to enable if it's on this pipe */ 2866 if (intel_crtc->active)
2325 intel_crtc_dpms_overlay(intel_crtc, true); 2867 return;
2326 break;
2327 case DRM_MODE_DPMS_OFF:
2328 /* Give the overlay scaler a chance to disable if it's on this pipe */
2329 intel_crtc_dpms_overlay(intel_crtc, false);
2330 drm_vblank_off(dev, pipe);
2331
2332 if (dev_priv->cfb_plane == plane &&
2333 dev_priv->display.disable_fbc)
2334 dev_priv->display.disable_fbc(dev);
2335
2336 /* Disable display plane */
2337 temp = I915_READ(dspcntr_reg);
2338 if ((temp & DISPLAY_PLANE_ENABLE) != 0) {
2339 I915_WRITE(dspcntr_reg, temp & ~DISPLAY_PLANE_ENABLE);
2340 /* Flush the plane changes */
2341 I915_WRITE(dspbase_reg, I915_READ(dspbase_reg));
2342 I915_READ(dspbase_reg);
2343 }
2344 2868
2345 /* Don't disable pipe A or pipe A PLLs if needed */ 2869 intel_crtc->active = true;
2346 if (pipeconf_reg == PIPEACONF && 2870 intel_update_watermarks(dev);
2347 (dev_priv->quirks & QUIRK_PIPEA_FORCE)) {
2348 /* Wait for vblank for the disable to take effect */
2349 intel_wait_for_vblank(dev, pipe);
2350 goto skip_pipe_off;
2351 }
2352 2871
2353 /* Next, disable display pipes */ 2872 intel_enable_pll(dev_priv, pipe);
2354 temp = I915_READ(pipeconf_reg); 2873 intel_enable_pipe(dev_priv, pipe, false);
2355 if ((temp & PIPEACONF_ENABLE) != 0) { 2874 intel_enable_plane(dev_priv, plane, pipe);
2356 I915_WRITE(pipeconf_reg, temp & ~PIPEACONF_ENABLE);
2357 I915_READ(pipeconf_reg);
2358 }
2359 2875
2360 /* Wait for the pipe to turn off */ 2876 intel_crtc_load_lut(crtc);
2361 intel_wait_for_pipe_off(dev, pipe); 2877 intel_update_fbc(dev);
2362 2878
2363 temp = I915_READ(dpll_reg); 2879 /* Give the overlay scaler a chance to enable if it's on this pipe */
2364 if ((temp & DPLL_VCO_ENABLE) != 0) { 2880 intel_crtc_dpms_overlay(intel_crtc, true);
2365 I915_WRITE(dpll_reg, temp & ~DPLL_VCO_ENABLE); 2881 intel_crtc_update_cursor(crtc, true);
2366 I915_READ(dpll_reg); 2882}
2367 } 2883
2368 skip_pipe_off: 2884static void i9xx_crtc_disable(struct drm_crtc *crtc)
2369 /* Wait for the clocks to turn off. */ 2885{
2370 udelay(150); 2886 struct drm_device *dev = crtc->dev;
2887 struct drm_i915_private *dev_priv = dev->dev_private;
2888 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
2889 int pipe = intel_crtc->pipe;
2890 int plane = intel_crtc->plane;
2891
2892 if (!intel_crtc->active)
2893 return;
2894
2895 /* Give the overlay scaler a chance to disable if it's on this pipe */
2896 intel_crtc_wait_for_pending_flips(crtc);
2897 drm_vblank_off(dev, pipe);
2898 intel_crtc_dpms_overlay(intel_crtc, false);
2899 intel_crtc_update_cursor(crtc, false);
2900
2901 if (dev_priv->cfb_plane == plane &&
2902 dev_priv->display.disable_fbc)
2903 dev_priv->display.disable_fbc(dev);
2904
2905 intel_disable_plane(dev_priv, plane, pipe);
2906 intel_disable_pipe(dev_priv, pipe);
2907 intel_disable_pll(dev_priv, pipe);
2908
2909 intel_crtc->active = false;
2910 intel_update_fbc(dev);
2911 intel_update_watermarks(dev);
2912 intel_clear_scanline_wait(dev);
2913}
2914
2915static void i9xx_crtc_dpms(struct drm_crtc *crtc, int mode)
2916{
2917 /* XXX: When our outputs are all unaware of DPMS modes other than off
2918 * and on, we should map those modes to DRM_MODE_DPMS_OFF in the CRTC.
2919 */
2920 switch (mode) {
2921 case DRM_MODE_DPMS_ON:
2922 case DRM_MODE_DPMS_STANDBY:
2923 case DRM_MODE_DPMS_SUSPEND:
2924 i9xx_crtc_enable(crtc);
2925 break;
2926 case DRM_MODE_DPMS_OFF:
2927 i9xx_crtc_disable(crtc);
2371 break; 2928 break;
2372 } 2929 }
2373} 2930}
@@ -2388,26 +2945,9 @@ static void intel_crtc_dpms(struct drm_crtc *crtc, int mode)
2388 return; 2945 return;
2389 2946
2390 intel_crtc->dpms_mode = mode; 2947 intel_crtc->dpms_mode = mode;
2391 intel_crtc->cursor_on = mode == DRM_MODE_DPMS_ON;
2392
2393 /* When switching on the display, ensure that SR is disabled
2394 * with multiple pipes prior to enabling to new pipe.
2395 *
2396 * When switching off the display, make sure the cursor is
2397 * properly hidden prior to disabling the pipe.
2398 */
2399 if (mode == DRM_MODE_DPMS_ON)
2400 intel_update_watermarks(dev);
2401 else
2402 intel_crtc_update_cursor(crtc);
2403 2948
2404 dev_priv->display.dpms(crtc, mode); 2949 dev_priv->display.dpms(crtc, mode);
2405 2950
2406 if (mode == DRM_MODE_DPMS_ON)
2407 intel_crtc_update_cursor(crtc);
2408 else
2409 intel_update_watermarks(dev);
2410
2411 if (!dev->primary->master) 2951 if (!dev->primary->master)
2412 return; 2952 return;
2413 2953
@@ -2427,21 +2967,51 @@ static void intel_crtc_dpms(struct drm_crtc *crtc, int mode)
2427 master_priv->sarea_priv->pipeB_h = enabled ? crtc->mode.vdisplay : 0; 2967 master_priv->sarea_priv->pipeB_h = enabled ? crtc->mode.vdisplay : 0;
2428 break; 2968 break;
2429 default: 2969 default:
2430 DRM_ERROR("Can't update pipe %d in SAREA\n", pipe); 2970 DRM_ERROR("Can't update pipe %c in SAREA\n", pipe_name(pipe));
2431 break; 2971 break;
2432 } 2972 }
2433} 2973}
2434 2974
2435static void intel_crtc_prepare (struct drm_crtc *crtc) 2975static void intel_crtc_disable(struct drm_crtc *crtc)
2436{ 2976{
2437 struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; 2977 struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private;
2978 struct drm_device *dev = crtc->dev;
2979
2438 crtc_funcs->dpms(crtc, DRM_MODE_DPMS_OFF); 2980 crtc_funcs->dpms(crtc, DRM_MODE_DPMS_OFF);
2981
2982 if (crtc->fb) {
2983 mutex_lock(&dev->struct_mutex);
2984 i915_gem_object_unpin(to_intel_framebuffer(crtc->fb)->obj);
2985 mutex_unlock(&dev->struct_mutex);
2986 }
2987}
2988
2989/* Prepare for a mode set.
2990 *
2991 * Note we could be a lot smarter here. We need to figure out which outputs
2992 * will be enabled, which disabled (in short, how the config will changes)
2993 * and perform the minimum necessary steps to accomplish that, e.g. updating
2994 * watermarks, FBC configuration, making sure PLLs are programmed correctly,
2995 * panel fitting is in the proper state, etc.
2996 */
2997static void i9xx_crtc_prepare(struct drm_crtc *crtc)
2998{
2999 i9xx_crtc_disable(crtc);
2439} 3000}
2440 3001
2441static void intel_crtc_commit (struct drm_crtc *crtc) 3002static void i9xx_crtc_commit(struct drm_crtc *crtc)
2442{ 3003{
2443 struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; 3004 i9xx_crtc_enable(crtc);
2444 crtc_funcs->dpms(crtc, DRM_MODE_DPMS_ON); 3005}
3006
3007static void ironlake_crtc_prepare(struct drm_crtc *crtc)
3008{
3009 ironlake_crtc_disable(crtc);
3010}
3011
3012static void ironlake_crtc_commit(struct drm_crtc *crtc)
3013{
3014 ironlake_crtc_enable(crtc);
2445} 3015}
2446 3016
2447void intel_encoder_prepare (struct drm_encoder *encoder) 3017void intel_encoder_prepare (struct drm_encoder *encoder)
@@ -2460,13 +3030,7 @@ void intel_encoder_commit (struct drm_encoder *encoder)
2460 3030
2461void intel_encoder_destroy(struct drm_encoder *encoder) 3031void intel_encoder_destroy(struct drm_encoder *encoder)
2462{ 3032{
2463 struct intel_encoder *intel_encoder = enc_to_intel_encoder(encoder); 3033 struct intel_encoder *intel_encoder = to_intel_encoder(encoder);
2464
2465 if (intel_encoder->ddc_bus)
2466 intel_i2c_destroy(intel_encoder->ddc_bus);
2467
2468 if (intel_encoder->i2c_bus)
2469 intel_i2c_destroy(intel_encoder->i2c_bus);
2470 3034
2471 drm_encoder_cleanup(encoder); 3035 drm_encoder_cleanup(encoder);
2472 kfree(intel_encoder); 3036 kfree(intel_encoder);
@@ -2557,33 +3121,6 @@ static int i830_get_display_clock_speed(struct drm_device *dev)
2557 return 133000; 3121 return 133000;
2558} 3122}
2559 3123
2560/**
2561 * Return the pipe currently connected to the panel fitter,
2562 * or -1 if the panel fitter is not present or not in use
2563 */
2564int intel_panel_fitter_pipe (struct drm_device *dev)
2565{
2566 struct drm_i915_private *dev_priv = dev->dev_private;
2567 u32 pfit_control;
2568
2569 /* i830 doesn't have a panel fitter */
2570 if (IS_I830(dev))
2571 return -1;
2572
2573 pfit_control = I915_READ(PFIT_CONTROL);
2574
2575 /* See if the panel fitter is in use */
2576 if ((pfit_control & PFIT_ENABLE) == 0)
2577 return -1;
2578
2579 /* 965 can place panel fitter on either pipe */
2580 if (IS_I965G(dev))
2581 return (pfit_control >> 29) & 0x3;
2582
2583 /* older chips can only use pipe 1 */
2584 return 1;
2585}
2586
2587struct fdi_m_n { 3124struct fdi_m_n {
2588 u32 tu; 3125 u32 tu;
2589 u32 gmch_m; 3126 u32 gmch_m;
@@ -2601,27 +3138,19 @@ fdi_reduce_ratio(u32 *num, u32 *den)
2601 } 3138 }
2602} 3139}
2603 3140
2604#define DATA_N 0x800000
2605#define LINK_N 0x80000
2606
2607static void 3141static void
2608ironlake_compute_m_n(int bits_per_pixel, int nlanes, int pixel_clock, 3142ironlake_compute_m_n(int bits_per_pixel, int nlanes, int pixel_clock,
2609 int link_clock, struct fdi_m_n *m_n) 3143 int link_clock, struct fdi_m_n *m_n)
2610{ 3144{
2611 u64 temp;
2612
2613 m_n->tu = 64; /* default size */ 3145 m_n->tu = 64; /* default size */
2614 3146
2615 temp = (u64) DATA_N * pixel_clock; 3147 /* BUG_ON(pixel_clock > INT_MAX / 36); */
2616 temp = div_u64(temp, link_clock); 3148 m_n->gmch_m = bits_per_pixel * pixel_clock;
2617 m_n->gmch_m = div_u64(temp * bits_per_pixel, nlanes); 3149 m_n->gmch_n = link_clock * nlanes * 8;
2618 m_n->gmch_m >>= 3; /* convert to bytes_per_pixel */
2619 m_n->gmch_n = DATA_N;
2620 fdi_reduce_ratio(&m_n->gmch_m, &m_n->gmch_n); 3150 fdi_reduce_ratio(&m_n->gmch_m, &m_n->gmch_n);
2621 3151
2622 temp = (u64) LINK_N * pixel_clock; 3152 m_n->link_m = pixel_clock;
2623 m_n->link_m = div_u64(temp, link_clock); 3153 m_n->link_n = link_clock;
2624 m_n->link_n = LINK_N;
2625 fdi_reduce_ratio(&m_n->link_m, &m_n->link_n); 3154 fdi_reduce_ratio(&m_n->link_m, &m_n->link_n);
2626} 3155}
2627 3156
@@ -2635,77 +3164,77 @@ struct intel_watermark_params {
2635}; 3164};
2636 3165
2637/* Pineview has different values for various configs */ 3166/* Pineview has different values for various configs */
2638static struct intel_watermark_params pineview_display_wm = { 3167static const struct intel_watermark_params pineview_display_wm = {
2639 PINEVIEW_DISPLAY_FIFO, 3168 PINEVIEW_DISPLAY_FIFO,
2640 PINEVIEW_MAX_WM, 3169 PINEVIEW_MAX_WM,
2641 PINEVIEW_DFT_WM, 3170 PINEVIEW_DFT_WM,
2642 PINEVIEW_GUARD_WM, 3171 PINEVIEW_GUARD_WM,
2643 PINEVIEW_FIFO_LINE_SIZE 3172 PINEVIEW_FIFO_LINE_SIZE
2644}; 3173};
2645static struct intel_watermark_params pineview_display_hplloff_wm = { 3174static const struct intel_watermark_params pineview_display_hplloff_wm = {
2646 PINEVIEW_DISPLAY_FIFO, 3175 PINEVIEW_DISPLAY_FIFO,
2647 PINEVIEW_MAX_WM, 3176 PINEVIEW_MAX_WM,
2648 PINEVIEW_DFT_HPLLOFF_WM, 3177 PINEVIEW_DFT_HPLLOFF_WM,
2649 PINEVIEW_GUARD_WM, 3178 PINEVIEW_GUARD_WM,
2650 PINEVIEW_FIFO_LINE_SIZE 3179 PINEVIEW_FIFO_LINE_SIZE
2651}; 3180};
2652static struct intel_watermark_params pineview_cursor_wm = { 3181static const struct intel_watermark_params pineview_cursor_wm = {
2653 PINEVIEW_CURSOR_FIFO, 3182 PINEVIEW_CURSOR_FIFO,
2654 PINEVIEW_CURSOR_MAX_WM, 3183 PINEVIEW_CURSOR_MAX_WM,
2655 PINEVIEW_CURSOR_DFT_WM, 3184 PINEVIEW_CURSOR_DFT_WM,
2656 PINEVIEW_CURSOR_GUARD_WM, 3185 PINEVIEW_CURSOR_GUARD_WM,
2657 PINEVIEW_FIFO_LINE_SIZE, 3186 PINEVIEW_FIFO_LINE_SIZE,
2658}; 3187};
2659static struct intel_watermark_params pineview_cursor_hplloff_wm = { 3188static const struct intel_watermark_params pineview_cursor_hplloff_wm = {
2660 PINEVIEW_CURSOR_FIFO, 3189 PINEVIEW_CURSOR_FIFO,
2661 PINEVIEW_CURSOR_MAX_WM, 3190 PINEVIEW_CURSOR_MAX_WM,
2662 PINEVIEW_CURSOR_DFT_WM, 3191 PINEVIEW_CURSOR_DFT_WM,
2663 PINEVIEW_CURSOR_GUARD_WM, 3192 PINEVIEW_CURSOR_GUARD_WM,
2664 PINEVIEW_FIFO_LINE_SIZE 3193 PINEVIEW_FIFO_LINE_SIZE
2665}; 3194};
2666static struct intel_watermark_params g4x_wm_info = { 3195static const struct intel_watermark_params g4x_wm_info = {
2667 G4X_FIFO_SIZE, 3196 G4X_FIFO_SIZE,
2668 G4X_MAX_WM, 3197 G4X_MAX_WM,
2669 G4X_MAX_WM, 3198 G4X_MAX_WM,
2670 2, 3199 2,
2671 G4X_FIFO_LINE_SIZE, 3200 G4X_FIFO_LINE_SIZE,
2672}; 3201};
2673static struct intel_watermark_params g4x_cursor_wm_info = { 3202static const struct intel_watermark_params g4x_cursor_wm_info = {
2674 I965_CURSOR_FIFO, 3203 I965_CURSOR_FIFO,
2675 I965_CURSOR_MAX_WM, 3204 I965_CURSOR_MAX_WM,
2676 I965_CURSOR_DFT_WM, 3205 I965_CURSOR_DFT_WM,
2677 2, 3206 2,
2678 G4X_FIFO_LINE_SIZE, 3207 G4X_FIFO_LINE_SIZE,
2679}; 3208};
2680static struct intel_watermark_params i965_cursor_wm_info = { 3209static const struct intel_watermark_params i965_cursor_wm_info = {
2681 I965_CURSOR_FIFO, 3210 I965_CURSOR_FIFO,
2682 I965_CURSOR_MAX_WM, 3211 I965_CURSOR_MAX_WM,
2683 I965_CURSOR_DFT_WM, 3212 I965_CURSOR_DFT_WM,
2684 2, 3213 2,
2685 I915_FIFO_LINE_SIZE, 3214 I915_FIFO_LINE_SIZE,
2686}; 3215};
2687static struct intel_watermark_params i945_wm_info = { 3216static const struct intel_watermark_params i945_wm_info = {
2688 I945_FIFO_SIZE, 3217 I945_FIFO_SIZE,
2689 I915_MAX_WM, 3218 I915_MAX_WM,
2690 1, 3219 1,
2691 2, 3220 2,
2692 I915_FIFO_LINE_SIZE 3221 I915_FIFO_LINE_SIZE
2693}; 3222};
2694static struct intel_watermark_params i915_wm_info = { 3223static const struct intel_watermark_params i915_wm_info = {
2695 I915_FIFO_SIZE, 3224 I915_FIFO_SIZE,
2696 I915_MAX_WM, 3225 I915_MAX_WM,
2697 1, 3226 1,
2698 2, 3227 2,
2699 I915_FIFO_LINE_SIZE 3228 I915_FIFO_LINE_SIZE
2700}; 3229};
2701static struct intel_watermark_params i855_wm_info = { 3230static const struct intel_watermark_params i855_wm_info = {
2702 I855GM_FIFO_SIZE, 3231 I855GM_FIFO_SIZE,
2703 I915_MAX_WM, 3232 I915_MAX_WM,
2704 1, 3233 1,
2705 2, 3234 2,
2706 I830_FIFO_LINE_SIZE 3235 I830_FIFO_LINE_SIZE
2707}; 3236};
2708static struct intel_watermark_params i830_wm_info = { 3237static const struct intel_watermark_params i830_wm_info = {
2709 I830_FIFO_SIZE, 3238 I830_FIFO_SIZE,
2710 I915_MAX_WM, 3239 I915_MAX_WM,
2711 1, 3240 1,
@@ -2713,31 +3242,28 @@ static struct intel_watermark_params i830_wm_info = {
2713 I830_FIFO_LINE_SIZE 3242 I830_FIFO_LINE_SIZE
2714}; 3243};
2715 3244
2716static struct intel_watermark_params ironlake_display_wm_info = { 3245static const struct intel_watermark_params ironlake_display_wm_info = {
2717 ILK_DISPLAY_FIFO, 3246 ILK_DISPLAY_FIFO,
2718 ILK_DISPLAY_MAXWM, 3247 ILK_DISPLAY_MAXWM,
2719 ILK_DISPLAY_DFTWM, 3248 ILK_DISPLAY_DFTWM,
2720 2, 3249 2,
2721 ILK_FIFO_LINE_SIZE 3250 ILK_FIFO_LINE_SIZE
2722}; 3251};
2723 3252static const struct intel_watermark_params ironlake_cursor_wm_info = {
2724static struct intel_watermark_params ironlake_cursor_wm_info = {
2725 ILK_CURSOR_FIFO, 3253 ILK_CURSOR_FIFO,
2726 ILK_CURSOR_MAXWM, 3254 ILK_CURSOR_MAXWM,
2727 ILK_CURSOR_DFTWM, 3255 ILK_CURSOR_DFTWM,
2728 2, 3256 2,
2729 ILK_FIFO_LINE_SIZE 3257 ILK_FIFO_LINE_SIZE
2730}; 3258};
2731 3259static const struct intel_watermark_params ironlake_display_srwm_info = {
2732static struct intel_watermark_params ironlake_display_srwm_info = {
2733 ILK_DISPLAY_SR_FIFO, 3260 ILK_DISPLAY_SR_FIFO,
2734 ILK_DISPLAY_MAX_SRWM, 3261 ILK_DISPLAY_MAX_SRWM,
2735 ILK_DISPLAY_DFT_SRWM, 3262 ILK_DISPLAY_DFT_SRWM,
2736 2, 3263 2,
2737 ILK_FIFO_LINE_SIZE 3264 ILK_FIFO_LINE_SIZE
2738}; 3265};
2739 3266static const struct intel_watermark_params ironlake_cursor_srwm_info = {
2740static struct intel_watermark_params ironlake_cursor_srwm_info = {
2741 ILK_CURSOR_SR_FIFO, 3267 ILK_CURSOR_SR_FIFO,
2742 ILK_CURSOR_MAX_SRWM, 3268 ILK_CURSOR_MAX_SRWM,
2743 ILK_CURSOR_DFT_SRWM, 3269 ILK_CURSOR_DFT_SRWM,
@@ -2745,6 +3271,36 @@ static struct intel_watermark_params ironlake_cursor_srwm_info = {
2745 ILK_FIFO_LINE_SIZE 3271 ILK_FIFO_LINE_SIZE
2746}; 3272};
2747 3273
3274static const struct intel_watermark_params sandybridge_display_wm_info = {
3275 SNB_DISPLAY_FIFO,
3276 SNB_DISPLAY_MAXWM,
3277 SNB_DISPLAY_DFTWM,
3278 2,
3279 SNB_FIFO_LINE_SIZE
3280};
3281static const struct intel_watermark_params sandybridge_cursor_wm_info = {
3282 SNB_CURSOR_FIFO,
3283 SNB_CURSOR_MAXWM,
3284 SNB_CURSOR_DFTWM,
3285 2,
3286 SNB_FIFO_LINE_SIZE
3287};
3288static const struct intel_watermark_params sandybridge_display_srwm_info = {
3289 SNB_DISPLAY_SR_FIFO,
3290 SNB_DISPLAY_MAX_SRWM,
3291 SNB_DISPLAY_DFT_SRWM,
3292 2,
3293 SNB_FIFO_LINE_SIZE
3294};
3295static const struct intel_watermark_params sandybridge_cursor_srwm_info = {
3296 SNB_CURSOR_SR_FIFO,
3297 SNB_CURSOR_MAX_SRWM,
3298 SNB_CURSOR_DFT_SRWM,
3299 2,
3300 SNB_FIFO_LINE_SIZE
3301};
3302
3303
2748/** 3304/**
2749 * intel_calculate_wm - calculate watermark level 3305 * intel_calculate_wm - calculate watermark level
2750 * @clock_in_khz: pixel clock 3306 * @clock_in_khz: pixel clock
@@ -2764,7 +3320,8 @@ static struct intel_watermark_params ironlake_cursor_srwm_info = {
2764 * will occur, and a display engine hang could result. 3320 * will occur, and a display engine hang could result.
2765 */ 3321 */
2766static unsigned long intel_calculate_wm(unsigned long clock_in_khz, 3322static unsigned long intel_calculate_wm(unsigned long clock_in_khz,
2767 struct intel_watermark_params *wm, 3323 const struct intel_watermark_params *wm,
3324 int fifo_size,
2768 int pixel_size, 3325 int pixel_size,
2769 unsigned long latency_ns) 3326 unsigned long latency_ns)
2770{ 3327{
@@ -2780,11 +3337,11 @@ static unsigned long intel_calculate_wm(unsigned long clock_in_khz,
2780 1000; 3337 1000;
2781 entries_required = DIV_ROUND_UP(entries_required, wm->cacheline_size); 3338 entries_required = DIV_ROUND_UP(entries_required, wm->cacheline_size);
2782 3339
2783 DRM_DEBUG_KMS("FIFO entries required for mode: %d\n", entries_required); 3340 DRM_DEBUG_KMS("FIFO entries required for mode: %ld\n", entries_required);
2784 3341
2785 wm_size = wm->fifo_size - (entries_required + wm->guard_size); 3342 wm_size = fifo_size - (entries_required + wm->guard_size);
2786 3343
2787 DRM_DEBUG_KMS("FIFO watermark level: %d\n", wm_size); 3344 DRM_DEBUG_KMS("FIFO watermark level: %ld\n", wm_size);
2788 3345
2789 /* Don't promote wm_size to unsigned... */ 3346 /* Don't promote wm_size to unsigned... */
2790 if (wm_size > (long)wm->max_wm) 3347 if (wm_size > (long)wm->max_wm)
@@ -2902,7 +3459,7 @@ static int i9xx_get_fifo_size(struct drm_device *dev, int plane)
2902 size = ((dsparb >> DSPARB_CSTART_SHIFT) & 0x7f) - size; 3459 size = ((dsparb >> DSPARB_CSTART_SHIFT) & 0x7f) - size;
2903 3460
2904 DRM_DEBUG_KMS("FIFO size - (0x%08x) %s: %d\n", dsparb, 3461 DRM_DEBUG_KMS("FIFO size - (0x%08x) %s: %d\n", dsparb,
2905 plane ? "B" : "A", size); 3462 plane ? "B" : "A", size);
2906 3463
2907 return size; 3464 return size;
2908} 3465}
@@ -2919,7 +3476,7 @@ static int i85x_get_fifo_size(struct drm_device *dev, int plane)
2919 size >>= 1; /* Convert to cachelines */ 3476 size >>= 1; /* Convert to cachelines */
2920 3477
2921 DRM_DEBUG_KMS("FIFO size - (0x%08x) %s: %d\n", dsparb, 3478 DRM_DEBUG_KMS("FIFO size - (0x%08x) %s: %d\n", dsparb,
2922 plane ? "B" : "A", size); 3479 plane ? "B" : "A", size);
2923 3480
2924 return size; 3481 return size;
2925} 3482}
@@ -2934,8 +3491,8 @@ static int i845_get_fifo_size(struct drm_device *dev, int plane)
2934 size >>= 2; /* Convert to cachelines */ 3491 size >>= 2; /* Convert to cachelines */
2935 3492
2936 DRM_DEBUG_KMS("FIFO size - (0x%08x) %s: %d\n", dsparb, 3493 DRM_DEBUG_KMS("FIFO size - (0x%08x) %s: %d\n", dsparb,
2937 plane ? "B" : "A", 3494 plane ? "B" : "A",
2938 size); 3495 size);
2939 3496
2940 return size; 3497 return size;
2941} 3498}
@@ -2950,20 +3507,33 @@ static int i830_get_fifo_size(struct drm_device *dev, int plane)
2950 size >>= 1; /* Convert to cachelines */ 3507 size >>= 1; /* Convert to cachelines */
2951 3508
2952 DRM_DEBUG_KMS("FIFO size - (0x%08x) %s: %d\n", dsparb, 3509 DRM_DEBUG_KMS("FIFO size - (0x%08x) %s: %d\n", dsparb,
2953 plane ? "B" : "A", size); 3510 plane ? "B" : "A", size);
2954 3511
2955 return size; 3512 return size;
2956} 3513}
2957 3514
2958static void pineview_update_wm(struct drm_device *dev, int planea_clock, 3515static struct drm_crtc *single_enabled_crtc(struct drm_device *dev)
2959 int planeb_clock, int sr_hdisplay, int unused, 3516{
2960 int pixel_size) 3517 struct drm_crtc *crtc, *enabled = NULL;
3518
3519 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
3520 if (crtc->enabled && crtc->fb) {
3521 if (enabled)
3522 return NULL;
3523 enabled = crtc;
3524 }
3525 }
3526
3527 return enabled;
3528}
3529
3530static void pineview_update_wm(struct drm_device *dev)
2961{ 3531{
2962 struct drm_i915_private *dev_priv = dev->dev_private; 3532 struct drm_i915_private *dev_priv = dev->dev_private;
3533 struct drm_crtc *crtc;
2963 const struct cxsr_latency *latency; 3534 const struct cxsr_latency *latency;
2964 u32 reg; 3535 u32 reg;
2965 unsigned long wm; 3536 unsigned long wm;
2966 int sr_clock;
2967 3537
2968 latency = intel_get_cxsr_latency(IS_PINEVIEW_G(dev), dev_priv->is_ddr3, 3538 latency = intel_get_cxsr_latency(IS_PINEVIEW_G(dev), dev_priv->is_ddr3,
2969 dev_priv->fsb_freq, dev_priv->mem_freq); 3539 dev_priv->fsb_freq, dev_priv->mem_freq);
@@ -2973,11 +3543,14 @@ static void pineview_update_wm(struct drm_device *dev, int planea_clock,
2973 return; 3543 return;
2974 } 3544 }
2975 3545
2976 if (!planea_clock || !planeb_clock) { 3546 crtc = single_enabled_crtc(dev);
2977 sr_clock = planea_clock ? planea_clock : planeb_clock; 3547 if (crtc) {
3548 int clock = crtc->mode.clock;
3549 int pixel_size = crtc->fb->bits_per_pixel / 8;
2978 3550
2979 /* Display SR */ 3551 /* Display SR */
2980 wm = intel_calculate_wm(sr_clock, &pineview_display_wm, 3552 wm = intel_calculate_wm(clock, &pineview_display_wm,
3553 pineview_display_wm.fifo_size,
2981 pixel_size, latency->display_sr); 3554 pixel_size, latency->display_sr);
2982 reg = I915_READ(DSPFW1); 3555 reg = I915_READ(DSPFW1);
2983 reg &= ~DSPFW_SR_MASK; 3556 reg &= ~DSPFW_SR_MASK;
@@ -2986,7 +3559,8 @@ static void pineview_update_wm(struct drm_device *dev, int planea_clock,
2986 DRM_DEBUG_KMS("DSPFW1 register is %x\n", reg); 3559 DRM_DEBUG_KMS("DSPFW1 register is %x\n", reg);
2987 3560
2988 /* cursor SR */ 3561 /* cursor SR */
2989 wm = intel_calculate_wm(sr_clock, &pineview_cursor_wm, 3562 wm = intel_calculate_wm(clock, &pineview_cursor_wm,
3563 pineview_display_wm.fifo_size,
2990 pixel_size, latency->cursor_sr); 3564 pixel_size, latency->cursor_sr);
2991 reg = I915_READ(DSPFW3); 3565 reg = I915_READ(DSPFW3);
2992 reg &= ~DSPFW_CURSOR_SR_MASK; 3566 reg &= ~DSPFW_CURSOR_SR_MASK;
@@ -2994,7 +3568,8 @@ static void pineview_update_wm(struct drm_device *dev, int planea_clock,
2994 I915_WRITE(DSPFW3, reg); 3568 I915_WRITE(DSPFW3, reg);
2995 3569
2996 /* Display HPLL off SR */ 3570 /* Display HPLL off SR */
2997 wm = intel_calculate_wm(sr_clock, &pineview_display_hplloff_wm, 3571 wm = intel_calculate_wm(clock, &pineview_display_hplloff_wm,
3572 pineview_display_hplloff_wm.fifo_size,
2998 pixel_size, latency->display_hpll_disable); 3573 pixel_size, latency->display_hpll_disable);
2999 reg = I915_READ(DSPFW3); 3574 reg = I915_READ(DSPFW3);
3000 reg &= ~DSPFW_HPLL_SR_MASK; 3575 reg &= ~DSPFW_HPLL_SR_MASK;
@@ -3002,7 +3577,8 @@ static void pineview_update_wm(struct drm_device *dev, int planea_clock,
3002 I915_WRITE(DSPFW3, reg); 3577 I915_WRITE(DSPFW3, reg);
3003 3578
3004 /* cursor HPLL off SR */ 3579 /* cursor HPLL off SR */
3005 wm = intel_calculate_wm(sr_clock, &pineview_cursor_hplloff_wm, 3580 wm = intel_calculate_wm(clock, &pineview_cursor_hplloff_wm,
3581 pineview_display_hplloff_wm.fifo_size,
3006 pixel_size, latency->cursor_hpll_disable); 3582 pixel_size, latency->cursor_hpll_disable);
3007 reg = I915_READ(DSPFW3); 3583 reg = I915_READ(DSPFW3);
3008 reg &= ~DSPFW_HPLL_CURSOR_MASK; 3584 reg &= ~DSPFW_HPLL_CURSOR_MASK;
@@ -3020,125 +3596,229 @@ static void pineview_update_wm(struct drm_device *dev, int planea_clock,
3020 } 3596 }
3021} 3597}
3022 3598
3023static void g4x_update_wm(struct drm_device *dev, int planea_clock, 3599static bool g4x_compute_wm0(struct drm_device *dev,
3024 int planeb_clock, int sr_hdisplay, int sr_htotal, 3600 int plane,
3025 int pixel_size) 3601 const struct intel_watermark_params *display,
3602 int display_latency_ns,
3603 const struct intel_watermark_params *cursor,
3604 int cursor_latency_ns,
3605 int *plane_wm,
3606 int *cursor_wm)
3026{ 3607{
3027 struct drm_i915_private *dev_priv = dev->dev_private; 3608 struct drm_crtc *crtc;
3028 int total_size, cacheline_size; 3609 int htotal, hdisplay, clock, pixel_size;
3029 int planea_wm, planeb_wm, cursora_wm, cursorb_wm, cursor_sr; 3610 int line_time_us, line_count;
3030 struct intel_watermark_params planea_params, planeb_params; 3611 int entries, tlb_miss;
3031 unsigned long line_time_us; 3612
3032 int sr_clock, sr_entries = 0, entries_required; 3613 crtc = intel_get_crtc_for_plane(dev, plane);
3033 3614 if (crtc->fb == NULL || !crtc->enabled) {
3034 /* Create copies of the base settings for each pipe */ 3615 *cursor_wm = cursor->guard_size;
3035 planea_params = planeb_params = g4x_wm_info; 3616 *plane_wm = display->guard_size;
3617 return false;
3618 }
3036 3619
3037 /* Grab a couple of global values before we overwrite them */ 3620 htotal = crtc->mode.htotal;
3038 total_size = planea_params.fifo_size; 3621 hdisplay = crtc->mode.hdisplay;
3039 cacheline_size = planea_params.cacheline_size; 3622 clock = crtc->mode.clock;
3623 pixel_size = crtc->fb->bits_per_pixel / 8;
3624
3625 /* Use the small buffer method to calculate plane watermark */
3626 entries = ((clock * pixel_size / 1000) * display_latency_ns) / 1000;
3627 tlb_miss = display->fifo_size*display->cacheline_size - hdisplay * 8;
3628 if (tlb_miss > 0)
3629 entries += tlb_miss;
3630 entries = DIV_ROUND_UP(entries, display->cacheline_size);
3631 *plane_wm = entries + display->guard_size;
3632 if (*plane_wm > (int)display->max_wm)
3633 *plane_wm = display->max_wm;
3634
3635 /* Use the large buffer method to calculate cursor watermark */
3636 line_time_us = ((htotal * 1000) / clock);
3637 line_count = (cursor_latency_ns / line_time_us + 1000) / 1000;
3638 entries = line_count * 64 * pixel_size;
3639 tlb_miss = cursor->fifo_size*cursor->cacheline_size - hdisplay * 8;
3640 if (tlb_miss > 0)
3641 entries += tlb_miss;
3642 entries = DIV_ROUND_UP(entries, cursor->cacheline_size);
3643 *cursor_wm = entries + cursor->guard_size;
3644 if (*cursor_wm > (int)cursor->max_wm)
3645 *cursor_wm = (int)cursor->max_wm;
3040 3646
3041 /* 3647 return true;
3042 * Note: we need to make sure we don't overflow for various clock & 3648}
3043 * latency values.
3044 * clocks go from a few thousand to several hundred thousand.
3045 * latency is usually a few thousand
3046 */
3047 entries_required = ((planea_clock / 1000) * pixel_size * latency_ns) /
3048 1000;
3049 entries_required = DIV_ROUND_UP(entries_required, G4X_FIFO_LINE_SIZE);
3050 planea_wm = entries_required + planea_params.guard_size;
3051 3649
3052 entries_required = ((planeb_clock / 1000) * pixel_size * latency_ns) / 3650/*
3053 1000; 3651 * Check the wm result.
3054 entries_required = DIV_ROUND_UP(entries_required, G4X_FIFO_LINE_SIZE); 3652 *
3055 planeb_wm = entries_required + planeb_params.guard_size; 3653 * If any calculated watermark values is larger than the maximum value that
3654 * can be programmed into the associated watermark register, that watermark
3655 * must be disabled.
3656 */
3657static bool g4x_check_srwm(struct drm_device *dev,
3658 int display_wm, int cursor_wm,
3659 const struct intel_watermark_params *display,
3660 const struct intel_watermark_params *cursor)
3661{
3662 DRM_DEBUG_KMS("SR watermark: display plane %d, cursor %d\n",
3663 display_wm, cursor_wm);
3056 3664
3057 cursora_wm = cursorb_wm = 16; 3665 if (display_wm > display->max_wm) {
3058 cursor_sr = 32; 3666 DRM_DEBUG_KMS("display watermark is too large(%d/%ld), disabling\n",
3667 display_wm, display->max_wm);
3668 return false;
3669 }
3059 3670
3060 DRM_DEBUG("FIFO watermarks - A: %d, B: %d\n", planea_wm, planeb_wm); 3671 if (cursor_wm > cursor->max_wm) {
3672 DRM_DEBUG_KMS("cursor watermark is too large(%d/%ld), disabling\n",
3673 cursor_wm, cursor->max_wm);
3674 return false;
3675 }
3061 3676
3062 /* Calc sr entries for one plane configs */ 3677 if (!(display_wm || cursor_wm)) {
3063 if (sr_hdisplay && (!planea_clock || !planeb_clock)) { 3678 DRM_DEBUG_KMS("SR latency is 0, disabling\n");
3064 /* self-refresh has much higher latency */ 3679 return false;
3065 static const int sr_latency_ns = 12000; 3680 }
3066 3681
3067 sr_clock = planea_clock ? planea_clock : planeb_clock; 3682 return true;
3068 line_time_us = ((sr_htotal * 1000) / sr_clock); 3683}
3069 3684
3070 /* Use ns/us then divide to preserve precision */ 3685static bool g4x_compute_srwm(struct drm_device *dev,
3071 sr_entries = (((sr_latency_ns / line_time_us) + 1000) / 1000) * 3686 int plane,
3072 pixel_size * sr_hdisplay; 3687 int latency_ns,
3073 sr_entries = DIV_ROUND_UP(sr_entries, cacheline_size); 3688 const struct intel_watermark_params *display,
3074 3689 const struct intel_watermark_params *cursor,
3075 entries_required = (((sr_latency_ns / line_time_us) + 3690 int *display_wm, int *cursor_wm)
3076 1000) / 1000) * pixel_size * 64; 3691{
3077 entries_required = DIV_ROUND_UP(entries_required, 3692 struct drm_crtc *crtc;
3078 g4x_cursor_wm_info.cacheline_size); 3693 int hdisplay, htotal, pixel_size, clock;
3079 cursor_sr = entries_required + g4x_cursor_wm_info.guard_size; 3694 unsigned long line_time_us;
3080 3695 int line_count, line_size;
3081 if (cursor_sr > g4x_cursor_wm_info.max_wm) 3696 int small, large;
3082 cursor_sr = g4x_cursor_wm_info.max_wm; 3697 int entries;
3083 DRM_DEBUG_KMS("self-refresh watermark: display plane %d "
3084 "cursor %d\n", sr_entries, cursor_sr);
3085 3698
3086 I915_WRITE(FW_BLC_SELF, FW_BLC_SELF_EN); 3699 if (!latency_ns) {
3087 } else { 3700 *display_wm = *cursor_wm = 0;
3088 /* Turn off self refresh if both pipes are enabled */ 3701 return false;
3089 I915_WRITE(FW_BLC_SELF, I915_READ(FW_BLC_SELF)
3090 & ~FW_BLC_SELF_EN);
3091 } 3702 }
3092 3703
3093 DRM_DEBUG("Setting FIFO watermarks - A: %d, B: %d, SR %d\n", 3704 crtc = intel_get_crtc_for_plane(dev, plane);
3094 planea_wm, planeb_wm, sr_entries); 3705 hdisplay = crtc->mode.hdisplay;
3706 htotal = crtc->mode.htotal;
3707 clock = crtc->mode.clock;
3708 pixel_size = crtc->fb->bits_per_pixel / 8;
3709
3710 line_time_us = (htotal * 1000) / clock;
3711 line_count = (latency_ns / line_time_us + 1000) / 1000;
3712 line_size = hdisplay * pixel_size;
3095 3713
3096 planea_wm &= 0x3f; 3714 /* Use the minimum of the small and large buffer method for primary */
3097 planeb_wm &= 0x3f; 3715 small = ((clock * pixel_size / 1000) * latency_ns) / 1000;
3716 large = line_count * line_size;
3717
3718 entries = DIV_ROUND_UP(min(small, large), display->cacheline_size);
3719 *display_wm = entries + display->guard_size;
3720
3721 /* calculate the self-refresh watermark for display cursor */
3722 entries = line_count * pixel_size * 64;
3723 entries = DIV_ROUND_UP(entries, cursor->cacheline_size);
3724 *cursor_wm = entries + cursor->guard_size;
3725
3726 return g4x_check_srwm(dev,
3727 *display_wm, *cursor_wm,
3728 display, cursor);
3729}
3730
3731#define single_plane_enabled(mask) is_power_of_2(mask)
3732
3733static void g4x_update_wm(struct drm_device *dev)
3734{
3735 static const int sr_latency_ns = 12000;
3736 struct drm_i915_private *dev_priv = dev->dev_private;
3737 int planea_wm, planeb_wm, cursora_wm, cursorb_wm;
3738 int plane_sr, cursor_sr;
3739 unsigned int enabled = 0;
3740
3741 if (g4x_compute_wm0(dev, 0,
3742 &g4x_wm_info, latency_ns,
3743 &g4x_cursor_wm_info, latency_ns,
3744 &planea_wm, &cursora_wm))
3745 enabled |= 1;
3746
3747 if (g4x_compute_wm0(dev, 1,
3748 &g4x_wm_info, latency_ns,
3749 &g4x_cursor_wm_info, latency_ns,
3750 &planeb_wm, &cursorb_wm))
3751 enabled |= 2;
3752
3753 plane_sr = cursor_sr = 0;
3754 if (single_plane_enabled(enabled) &&
3755 g4x_compute_srwm(dev, ffs(enabled) - 1,
3756 sr_latency_ns,
3757 &g4x_wm_info,
3758 &g4x_cursor_wm_info,
3759 &plane_sr, &cursor_sr))
3760 I915_WRITE(FW_BLC_SELF, FW_BLC_SELF_EN);
3761 else
3762 I915_WRITE(FW_BLC_SELF,
3763 I915_READ(FW_BLC_SELF) & ~FW_BLC_SELF_EN);
3098 3764
3099 I915_WRITE(DSPFW1, (sr_entries << DSPFW_SR_SHIFT) | 3765 DRM_DEBUG_KMS("Setting FIFO watermarks - A: plane=%d, cursor=%d, B: plane=%d, cursor=%d, SR: plane=%d, cursor=%d\n",
3766 planea_wm, cursora_wm,
3767 planeb_wm, cursorb_wm,
3768 plane_sr, cursor_sr);
3769
3770 I915_WRITE(DSPFW1,
3771 (plane_sr << DSPFW_SR_SHIFT) |
3100 (cursorb_wm << DSPFW_CURSORB_SHIFT) | 3772 (cursorb_wm << DSPFW_CURSORB_SHIFT) |
3101 (planeb_wm << DSPFW_PLANEB_SHIFT) | planea_wm); 3773 (planeb_wm << DSPFW_PLANEB_SHIFT) |
3102 I915_WRITE(DSPFW2, (I915_READ(DSPFW2) & DSPFW_CURSORA_MASK) | 3774 planea_wm);
3775 I915_WRITE(DSPFW2,
3776 (I915_READ(DSPFW2) & DSPFW_CURSORA_MASK) |
3103 (cursora_wm << DSPFW_CURSORA_SHIFT)); 3777 (cursora_wm << DSPFW_CURSORA_SHIFT));
3104 /* HPLL off in SR has some issues on G4x... disable it */ 3778 /* HPLL off in SR has some issues on G4x... disable it */
3105 I915_WRITE(DSPFW3, (I915_READ(DSPFW3) & ~DSPFW_HPLL_SR_EN) | 3779 I915_WRITE(DSPFW3,
3780 (I915_READ(DSPFW3) & ~DSPFW_HPLL_SR_EN) |
3106 (cursor_sr << DSPFW_CURSOR_SR_SHIFT)); 3781 (cursor_sr << DSPFW_CURSOR_SR_SHIFT));
3107} 3782}
3108 3783
3109static void i965_update_wm(struct drm_device *dev, int planea_clock, 3784static void i965_update_wm(struct drm_device *dev)
3110 int planeb_clock, int sr_hdisplay, int sr_htotal,
3111 int pixel_size)
3112{ 3785{
3113 struct drm_i915_private *dev_priv = dev->dev_private; 3786 struct drm_i915_private *dev_priv = dev->dev_private;
3114 unsigned long line_time_us; 3787 struct drm_crtc *crtc;
3115 int sr_clock, sr_entries, srwm = 1; 3788 int srwm = 1;
3116 int cursor_sr = 16; 3789 int cursor_sr = 16;
3117 3790
3118 /* Calc sr entries for one plane configs */ 3791 /* Calc sr entries for one plane configs */
3119 if (sr_hdisplay && (!planea_clock || !planeb_clock)) { 3792 crtc = single_enabled_crtc(dev);
3793 if (crtc) {
3120 /* self-refresh has much higher latency */ 3794 /* self-refresh has much higher latency */
3121 static const int sr_latency_ns = 12000; 3795 static const int sr_latency_ns = 12000;
3796 int clock = crtc->mode.clock;
3797 int htotal = crtc->mode.htotal;
3798 int hdisplay = crtc->mode.hdisplay;
3799 int pixel_size = crtc->fb->bits_per_pixel / 8;
3800 unsigned long line_time_us;
3801 int entries;
3122 3802
3123 sr_clock = planea_clock ? planea_clock : planeb_clock; 3803 line_time_us = ((htotal * 1000) / clock);
3124 line_time_us = ((sr_htotal * 1000) / sr_clock);
3125 3804
3126 /* Use ns/us then divide to preserve precision */ 3805 /* Use ns/us then divide to preserve precision */
3127 sr_entries = (((sr_latency_ns / line_time_us) + 1000) / 1000) * 3806 entries = (((sr_latency_ns / line_time_us) + 1000) / 1000) *
3128 pixel_size * sr_hdisplay; 3807 pixel_size * hdisplay;
3129 sr_entries = DIV_ROUND_UP(sr_entries, I915_FIFO_LINE_SIZE); 3808 entries = DIV_ROUND_UP(entries, I915_FIFO_LINE_SIZE);
3130 DRM_DEBUG("self-refresh entries: %d\n", sr_entries); 3809 srwm = I965_FIFO_SIZE - entries;
3131 srwm = I965_FIFO_SIZE - sr_entries;
3132 if (srwm < 0) 3810 if (srwm < 0)
3133 srwm = 1; 3811 srwm = 1;
3134 srwm &= 0x1ff; 3812 srwm &= 0x1ff;
3813 DRM_DEBUG_KMS("self-refresh entries: %d, wm: %d\n",
3814 entries, srwm);
3135 3815
3136 sr_entries = (((sr_latency_ns / line_time_us) + 1000) / 1000) * 3816 entries = (((sr_latency_ns / line_time_us) + 1000) / 1000) *
3137 pixel_size * 64; 3817 pixel_size * 64;
3138 sr_entries = DIV_ROUND_UP(sr_entries, 3818 entries = DIV_ROUND_UP(entries,
3139 i965_cursor_wm_info.cacheline_size); 3819 i965_cursor_wm_info.cacheline_size);
3140 cursor_sr = i965_cursor_wm_info.fifo_size - 3820 cursor_sr = i965_cursor_wm_info.fifo_size -
3141 (sr_entries + i965_cursor_wm_info.guard_size); 3821 (entries + i965_cursor_wm_info.guard_size);
3142 3822
3143 if (cursor_sr > i965_cursor_wm_info.max_wm) 3823 if (cursor_sr > i965_cursor_wm_info.max_wm)
3144 cursor_sr = i965_cursor_wm_info.max_wm; 3824 cursor_sr = i965_cursor_wm_info.max_wm;
@@ -3146,11 +3826,11 @@ static void i965_update_wm(struct drm_device *dev, int planea_clock,
3146 DRM_DEBUG_KMS("self-refresh watermark: display plane %d " 3826 DRM_DEBUG_KMS("self-refresh watermark: display plane %d "
3147 "cursor %d\n", srwm, cursor_sr); 3827 "cursor %d\n", srwm, cursor_sr);
3148 3828
3149 if (IS_I965GM(dev)) 3829 if (IS_CRESTLINE(dev))
3150 I915_WRITE(FW_BLC_SELF, FW_BLC_SELF_EN); 3830 I915_WRITE(FW_BLC_SELF, FW_BLC_SELF_EN);
3151 } else { 3831 } else {
3152 /* Turn off self refresh if both pipes are enabled */ 3832 /* Turn off self refresh if both pipes are enabled */
3153 if (IS_I965GM(dev)) 3833 if (IS_CRESTLINE(dev))
3154 I915_WRITE(FW_BLC_SELF, I915_READ(FW_BLC_SELF) 3834 I915_WRITE(FW_BLC_SELF, I915_READ(FW_BLC_SELF)
3155 & ~FW_BLC_SELF_EN); 3835 & ~FW_BLC_SELF_EN);
3156 } 3836 }
@@ -3159,46 +3839,56 @@ static void i965_update_wm(struct drm_device *dev, int planea_clock,
3159 srwm); 3839 srwm);
3160 3840
3161 /* 965 has limitations... */ 3841 /* 965 has limitations... */
3162 I915_WRITE(DSPFW1, (srwm << DSPFW_SR_SHIFT) | (8 << 16) | (8 << 8) | 3842 I915_WRITE(DSPFW1, (srwm << DSPFW_SR_SHIFT) |
3163 (8 << 0)); 3843 (8 << 16) | (8 << 8) | (8 << 0));
3164 I915_WRITE(DSPFW2, (8 << 8) | (8 << 0)); 3844 I915_WRITE(DSPFW2, (8 << 8) | (8 << 0));
3165 /* update cursor SR watermark */ 3845 /* update cursor SR watermark */
3166 I915_WRITE(DSPFW3, (cursor_sr << DSPFW_CURSOR_SR_SHIFT)); 3846 I915_WRITE(DSPFW3, (cursor_sr << DSPFW_CURSOR_SR_SHIFT));
3167} 3847}
3168 3848
3169static void i9xx_update_wm(struct drm_device *dev, int planea_clock, 3849static void i9xx_update_wm(struct drm_device *dev)
3170 int planeb_clock, int sr_hdisplay, int sr_htotal,
3171 int pixel_size)
3172{ 3850{
3173 struct drm_i915_private *dev_priv = dev->dev_private; 3851 struct drm_i915_private *dev_priv = dev->dev_private;
3852 const struct intel_watermark_params *wm_info;
3174 uint32_t fwater_lo; 3853 uint32_t fwater_lo;
3175 uint32_t fwater_hi; 3854 uint32_t fwater_hi;
3176 int total_size, cacheline_size, cwm, srwm = 1; 3855 int cwm, srwm = 1;
3856 int fifo_size;
3177 int planea_wm, planeb_wm; 3857 int planea_wm, planeb_wm;
3178 struct intel_watermark_params planea_params, planeb_params; 3858 struct drm_crtc *crtc, *enabled = NULL;
3179 unsigned long line_time_us;
3180 int sr_clock, sr_entries = 0;
3181 3859
3182 /* Create copies of the base settings for each pipe */ 3860 if (IS_I945GM(dev))
3183 if (IS_I965GM(dev) || IS_I945GM(dev)) 3861 wm_info = &i945_wm_info;
3184 planea_params = planeb_params = i945_wm_info; 3862 else if (!IS_GEN2(dev))
3185 else if (IS_I9XX(dev)) 3863 wm_info = &i915_wm_info;
3186 planea_params = planeb_params = i915_wm_info;
3187 else 3864 else
3188 planea_params = planeb_params = i855_wm_info; 3865 wm_info = &i855_wm_info;
3189 3866
3190 /* Grab a couple of global values before we overwrite them */ 3867 fifo_size = dev_priv->display.get_fifo_size(dev, 0);
3191 total_size = planea_params.fifo_size; 3868 crtc = intel_get_crtc_for_plane(dev, 0);
3192 cacheline_size = planea_params.cacheline_size; 3869 if (crtc->enabled && crtc->fb) {
3193 3870 planea_wm = intel_calculate_wm(crtc->mode.clock,
3194 /* Update per-plane FIFO sizes */ 3871 wm_info, fifo_size,
3195 planea_params.fifo_size = dev_priv->display.get_fifo_size(dev, 0); 3872 crtc->fb->bits_per_pixel / 8,
3196 planeb_params.fifo_size = dev_priv->display.get_fifo_size(dev, 1); 3873 latency_ns);
3874 enabled = crtc;
3875 } else
3876 planea_wm = fifo_size - wm_info->guard_size;
3877
3878 fifo_size = dev_priv->display.get_fifo_size(dev, 1);
3879 crtc = intel_get_crtc_for_plane(dev, 1);
3880 if (crtc->enabled && crtc->fb) {
3881 planeb_wm = intel_calculate_wm(crtc->mode.clock,
3882 wm_info, fifo_size,
3883 crtc->fb->bits_per_pixel / 8,
3884 latency_ns);
3885 if (enabled == NULL)
3886 enabled = crtc;
3887 else
3888 enabled = NULL;
3889 } else
3890 planeb_wm = fifo_size - wm_info->guard_size;
3197 3891
3198 planea_wm = intel_calculate_wm(planea_clock, &planea_params,
3199 pixel_size, latency_ns);
3200 planeb_wm = intel_calculate_wm(planeb_clock, &planeb_params,
3201 pixel_size, latency_ns);
3202 DRM_DEBUG_KMS("FIFO watermarks - A: %d, B: %d\n", planea_wm, planeb_wm); 3892 DRM_DEBUG_KMS("FIFO watermarks - A: %d, B: %d\n", planea_wm, planeb_wm);
3203 3893
3204 /* 3894 /*
@@ -3206,43 +3896,43 @@ static void i9xx_update_wm(struct drm_device *dev, int planea_clock,
3206 */ 3896 */
3207 cwm = 2; 3897 cwm = 2;
3208 3898
3899 /* Play safe and disable self-refresh before adjusting watermarks. */
3900 if (IS_I945G(dev) || IS_I945GM(dev))
3901 I915_WRITE(FW_BLC_SELF, FW_BLC_SELF_EN_MASK | 0);
3902 else if (IS_I915GM(dev))
3903 I915_WRITE(INSTPM, I915_READ(INSTPM) & ~INSTPM_SELF_EN);
3904
3209 /* Calc sr entries for one plane configs */ 3905 /* Calc sr entries for one plane configs */
3210 if (HAS_FW_BLC(dev) && sr_hdisplay && 3906 if (HAS_FW_BLC(dev) && enabled) {
3211 (!planea_clock || !planeb_clock)) {
3212 /* self-refresh has much higher latency */ 3907 /* self-refresh has much higher latency */
3213 static const int sr_latency_ns = 6000; 3908 static const int sr_latency_ns = 6000;
3909 int clock = enabled->mode.clock;
3910 int htotal = enabled->mode.htotal;
3911 int hdisplay = enabled->mode.hdisplay;
3912 int pixel_size = enabled->fb->bits_per_pixel / 8;
3913 unsigned long line_time_us;
3914 int entries;
3214 3915
3215 sr_clock = planea_clock ? planea_clock : planeb_clock; 3916 line_time_us = (htotal * 1000) / clock;
3216 line_time_us = ((sr_htotal * 1000) / sr_clock);
3217 3917
3218 /* Use ns/us then divide to preserve precision */ 3918 /* Use ns/us then divide to preserve precision */
3219 sr_entries = (((sr_latency_ns / line_time_us) + 1000) / 1000) * 3919 entries = (((sr_latency_ns / line_time_us) + 1000) / 1000) *
3220 pixel_size * sr_hdisplay; 3920 pixel_size * hdisplay;
3221 sr_entries = DIV_ROUND_UP(sr_entries, cacheline_size); 3921 entries = DIV_ROUND_UP(entries, wm_info->cacheline_size);
3222 DRM_DEBUG_KMS("self-refresh entries: %d\n", sr_entries); 3922 DRM_DEBUG_KMS("self-refresh entries: %d\n", entries);
3223 srwm = total_size - sr_entries; 3923 srwm = wm_info->fifo_size - entries;
3224 if (srwm < 0) 3924 if (srwm < 0)
3225 srwm = 1; 3925 srwm = 1;
3226 3926
3227 if (IS_I945G(dev) || IS_I945GM(dev)) 3927 if (IS_I945G(dev) || IS_I945GM(dev))
3228 I915_WRITE(FW_BLC_SELF, FW_BLC_SELF_FIFO_MASK | (srwm & 0xff)); 3928 I915_WRITE(FW_BLC_SELF,
3229 else if (IS_I915GM(dev)) { 3929 FW_BLC_SELF_FIFO_MASK | (srwm & 0xff));
3230 /* 915M has a smaller SRWM field */ 3930 else if (IS_I915GM(dev))
3231 I915_WRITE(FW_BLC_SELF, srwm & 0x3f); 3931 I915_WRITE(FW_BLC_SELF, srwm & 0x3f);
3232 I915_WRITE(INSTPM, I915_READ(INSTPM) | INSTPM_SELF_EN);
3233 }
3234 } else {
3235 /* Turn off self refresh if both pipes are enabled */
3236 if (IS_I945G(dev) || IS_I945GM(dev)) {
3237 I915_WRITE(FW_BLC_SELF, I915_READ(FW_BLC_SELF)
3238 & ~FW_BLC_SELF_EN);
3239 } else if (IS_I915GM(dev)) {
3240 I915_WRITE(INSTPM, I915_READ(INSTPM) & ~INSTPM_SELF_EN);
3241 }
3242 } 3932 }
3243 3933
3244 DRM_DEBUG_KMS("Setting FIFO watermarks - A: %d, B: %d, C: %d, SR %d\n", 3934 DRM_DEBUG_KMS("Setting FIFO watermarks - A: %d, B: %d, C: %d, SR %d\n",
3245 planea_wm, planeb_wm, cwm, srwm); 3935 planea_wm, planeb_wm, cwm, srwm);
3246 3936
3247 fwater_lo = ((planeb_wm & 0x3f) << 16) | (planea_wm & 0x3f); 3937 fwater_lo = ((planeb_wm & 0x3f) << 16) | (planea_wm & 0x3f);
3248 fwater_hi = (cwm & 0x1f); 3938 fwater_hi = (cwm & 0x1f);
@@ -3253,19 +3943,36 @@ static void i9xx_update_wm(struct drm_device *dev, int planea_clock,
3253 3943
3254 I915_WRITE(FW_BLC, fwater_lo); 3944 I915_WRITE(FW_BLC, fwater_lo);
3255 I915_WRITE(FW_BLC2, fwater_hi); 3945 I915_WRITE(FW_BLC2, fwater_hi);
3946
3947 if (HAS_FW_BLC(dev)) {
3948 if (enabled) {
3949 if (IS_I945G(dev) || IS_I945GM(dev))
3950 I915_WRITE(FW_BLC_SELF,
3951 FW_BLC_SELF_EN_MASK | FW_BLC_SELF_EN);
3952 else if (IS_I915GM(dev))
3953 I915_WRITE(INSTPM, I915_READ(INSTPM) | INSTPM_SELF_EN);
3954 DRM_DEBUG_KMS("memory self refresh enabled\n");
3955 } else
3956 DRM_DEBUG_KMS("memory self refresh disabled\n");
3957 }
3256} 3958}
3257 3959
3258static void i830_update_wm(struct drm_device *dev, int planea_clock, int unused, 3960static void i830_update_wm(struct drm_device *dev)
3259 int unused2, int unused3, int pixel_size)
3260{ 3961{
3261 struct drm_i915_private *dev_priv = dev->dev_private; 3962 struct drm_i915_private *dev_priv = dev->dev_private;
3262 uint32_t fwater_lo = I915_READ(FW_BLC) & ~0xfff; 3963 struct drm_crtc *crtc;
3964 uint32_t fwater_lo;
3263 int planea_wm; 3965 int planea_wm;
3264 3966
3265 i830_wm_info.fifo_size = dev_priv->display.get_fifo_size(dev, 0); 3967 crtc = single_enabled_crtc(dev);
3968 if (crtc == NULL)
3969 return;
3266 3970
3267 planea_wm = intel_calculate_wm(planea_clock, &i830_wm_info, 3971 planea_wm = intel_calculate_wm(crtc->mode.clock, &i830_wm_info,
3268 pixel_size, latency_ns); 3972 dev_priv->display.get_fifo_size(dev, 0),
3973 crtc->fb->bits_per_pixel / 8,
3974 latency_ns);
3975 fwater_lo = I915_READ(FW_BLC) & ~0xfff;
3269 fwater_lo |= (3<<8) | planea_wm; 3976 fwater_lo |= (3<<8) | planea_wm;
3270 3977
3271 DRM_DEBUG_KMS("Setting FIFO watermarks - A: %d\n", planea_wm); 3978 DRM_DEBUG_KMS("Setting FIFO watermarks - A: %d\n", planea_wm);
@@ -3276,146 +3983,286 @@ static void i830_update_wm(struct drm_device *dev, int planea_clock, int unused,
3276#define ILK_LP0_PLANE_LATENCY 700 3983#define ILK_LP0_PLANE_LATENCY 700
3277#define ILK_LP0_CURSOR_LATENCY 1300 3984#define ILK_LP0_CURSOR_LATENCY 1300
3278 3985
3279static void ironlake_update_wm(struct drm_device *dev, int planea_clock, 3986/*
3280 int planeb_clock, int sr_hdisplay, int sr_htotal, 3987 * Check the wm result.
3281 int pixel_size) 3988 *
3989 * If any calculated watermark values is larger than the maximum value that
3990 * can be programmed into the associated watermark register, that watermark
3991 * must be disabled.
3992 */
3993static bool ironlake_check_srwm(struct drm_device *dev, int level,
3994 int fbc_wm, int display_wm, int cursor_wm,
3995 const struct intel_watermark_params *display,
3996 const struct intel_watermark_params *cursor)
3282{ 3997{
3283 struct drm_i915_private *dev_priv = dev->dev_private; 3998 struct drm_i915_private *dev_priv = dev->dev_private;
3284 int planea_wm, planeb_wm, cursora_wm, cursorb_wm; 3999
3285 int sr_wm, cursor_wm; 4000 DRM_DEBUG_KMS("watermark %d: display plane %d, fbc lines %d,"
3286 unsigned long line_time_us; 4001 " cursor %d\n", level, display_wm, fbc_wm, cursor_wm);
3287 int sr_clock, entries_required; 4002
3288 u32 reg_value; 4003 if (fbc_wm > SNB_FBC_MAX_SRWM) {
3289 int line_count; 4004 DRM_DEBUG_KMS("fbc watermark(%d) is too large(%d), disabling wm%d+\n",
3290 int planea_htotal = 0, planeb_htotal = 0; 4005 fbc_wm, SNB_FBC_MAX_SRWM, level);
4006
4007 /* fbc has it's own way to disable FBC WM */
4008 I915_WRITE(DISP_ARB_CTL,
4009 I915_READ(DISP_ARB_CTL) | DISP_FBC_WM_DIS);
4010 return false;
4011 }
4012
4013 if (display_wm > display->max_wm) {
4014 DRM_DEBUG_KMS("display watermark(%d) is too large(%d), disabling wm%d+\n",
4015 display_wm, SNB_DISPLAY_MAX_SRWM, level);
4016 return false;
4017 }
4018
4019 if (cursor_wm > cursor->max_wm) {
4020 DRM_DEBUG_KMS("cursor watermark(%d) is too large(%d), disabling wm%d+\n",
4021 cursor_wm, SNB_CURSOR_MAX_SRWM, level);
4022 return false;
4023 }
4024
4025 if (!(fbc_wm || display_wm || cursor_wm)) {
4026 DRM_DEBUG_KMS("latency %d is 0, disabling wm%d+\n", level, level);
4027 return false;
4028 }
4029
4030 return true;
4031}
4032
4033/*
4034 * Compute watermark values of WM[1-3],
4035 */
4036static bool ironlake_compute_srwm(struct drm_device *dev, int level, int plane,
4037 int latency_ns,
4038 const struct intel_watermark_params *display,
4039 const struct intel_watermark_params *cursor,
4040 int *fbc_wm, int *display_wm, int *cursor_wm)
4041{
3291 struct drm_crtc *crtc; 4042 struct drm_crtc *crtc;
4043 unsigned long line_time_us;
4044 int hdisplay, htotal, pixel_size, clock;
4045 int line_count, line_size;
4046 int small, large;
4047 int entries;
3292 4048
3293 /* Need htotal for all active display plane */ 4049 if (!latency_ns) {
3294 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { 4050 *fbc_wm = *display_wm = *cursor_wm = 0;
3295 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 4051 return false;
3296 if (intel_crtc->dpms_mode == DRM_MODE_DPMS_ON) {
3297 if (intel_crtc->plane == 0)
3298 planea_htotal = crtc->mode.htotal;
3299 else
3300 planeb_htotal = crtc->mode.htotal;
3301 }
3302 } 4052 }
3303 4053
3304 /* Calculate and update the watermark for plane A */ 4054 crtc = intel_get_crtc_for_plane(dev, plane);
3305 if (planea_clock) { 4055 hdisplay = crtc->mode.hdisplay;
3306 entries_required = ((planea_clock / 1000) * pixel_size * 4056 htotal = crtc->mode.htotal;
3307 ILK_LP0_PLANE_LATENCY) / 1000; 4057 clock = crtc->mode.clock;
3308 entries_required = DIV_ROUND_UP(entries_required, 4058 pixel_size = crtc->fb->bits_per_pixel / 8;
3309 ironlake_display_wm_info.cacheline_size);
3310 planea_wm = entries_required +
3311 ironlake_display_wm_info.guard_size;
3312 4059
3313 if (planea_wm > (int)ironlake_display_wm_info.max_wm) 4060 line_time_us = (htotal * 1000) / clock;
3314 planea_wm = ironlake_display_wm_info.max_wm; 4061 line_count = (latency_ns / line_time_us + 1000) / 1000;
4062 line_size = hdisplay * pixel_size;
3315 4063
3316 /* Use the large buffer method to calculate cursor watermark */ 4064 /* Use the minimum of the small and large buffer method for primary */
3317 line_time_us = (planea_htotal * 1000) / planea_clock; 4065 small = ((clock * pixel_size / 1000) * latency_ns) / 1000;
4066 large = line_count * line_size;
3318 4067
3319 /* Use ns/us then divide to preserve precision */ 4068 entries = DIV_ROUND_UP(min(small, large), display->cacheline_size);
3320 line_count = (ILK_LP0_CURSOR_LATENCY / line_time_us + 1000) / 1000; 4069 *display_wm = entries + display->guard_size;
3321
3322 /* calculate the cursor watermark for cursor A */
3323 entries_required = line_count * 64 * pixel_size;
3324 entries_required = DIV_ROUND_UP(entries_required,
3325 ironlake_cursor_wm_info.cacheline_size);
3326 cursora_wm = entries_required + ironlake_cursor_wm_info.guard_size;
3327 if (cursora_wm > ironlake_cursor_wm_info.max_wm)
3328 cursora_wm = ironlake_cursor_wm_info.max_wm;
3329
3330 reg_value = I915_READ(WM0_PIPEA_ILK);
3331 reg_value &= ~(WM0_PIPE_PLANE_MASK | WM0_PIPE_CURSOR_MASK);
3332 reg_value |= (planea_wm << WM0_PIPE_PLANE_SHIFT) |
3333 (cursora_wm & WM0_PIPE_CURSOR_MASK);
3334 I915_WRITE(WM0_PIPEA_ILK, reg_value);
3335 DRM_DEBUG_KMS("FIFO watermarks For pipe A - plane %d, "
3336 "cursor: %d\n", planea_wm, cursora_wm);
3337 }
3338 /* Calculate and update the watermark for plane B */
3339 if (planeb_clock) {
3340 entries_required = ((planeb_clock / 1000) * pixel_size *
3341 ILK_LP0_PLANE_LATENCY) / 1000;
3342 entries_required = DIV_ROUND_UP(entries_required,
3343 ironlake_display_wm_info.cacheline_size);
3344 planeb_wm = entries_required +
3345 ironlake_display_wm_info.guard_size;
3346
3347 if (planeb_wm > (int)ironlake_display_wm_info.max_wm)
3348 planeb_wm = ironlake_display_wm_info.max_wm;
3349
3350 /* Use the large buffer method to calculate cursor watermark */
3351 line_time_us = (planeb_htotal * 1000) / planeb_clock;
3352 4070
3353 /* Use ns/us then divide to preserve precision */ 4071 /*
3354 line_count = (ILK_LP0_CURSOR_LATENCY / line_time_us + 1000) / 1000; 4072 * Spec says:
4073 * FBC WM = ((Final Primary WM * 64) / number of bytes per line) + 2
4074 */
4075 *fbc_wm = DIV_ROUND_UP(*display_wm * 64, line_size) + 2;
4076
4077 /* calculate the self-refresh watermark for display cursor */
4078 entries = line_count * pixel_size * 64;
4079 entries = DIV_ROUND_UP(entries, cursor->cacheline_size);
4080 *cursor_wm = entries + cursor->guard_size;
3355 4081
3356 /* calculate the cursor watermark for cursor B */ 4082 return ironlake_check_srwm(dev, level,
3357 entries_required = line_count * 64 * pixel_size; 4083 *fbc_wm, *display_wm, *cursor_wm,
3358 entries_required = DIV_ROUND_UP(entries_required, 4084 display, cursor);
3359 ironlake_cursor_wm_info.cacheline_size); 4085}
3360 cursorb_wm = entries_required + ironlake_cursor_wm_info.guard_size;
3361 if (cursorb_wm > ironlake_cursor_wm_info.max_wm)
3362 cursorb_wm = ironlake_cursor_wm_info.max_wm;
3363 4086
3364 reg_value = I915_READ(WM0_PIPEB_ILK); 4087static void ironlake_update_wm(struct drm_device *dev)
3365 reg_value &= ~(WM0_PIPE_PLANE_MASK | WM0_PIPE_CURSOR_MASK); 4088{
3366 reg_value |= (planeb_wm << WM0_PIPE_PLANE_SHIFT) | 4089 struct drm_i915_private *dev_priv = dev->dev_private;
3367 (cursorb_wm & WM0_PIPE_CURSOR_MASK); 4090 int fbc_wm, plane_wm, cursor_wm;
3368 I915_WRITE(WM0_PIPEB_ILK, reg_value); 4091 unsigned int enabled;
3369 DRM_DEBUG_KMS("FIFO watermarks For pipe B - plane %d, " 4092
3370 "cursor: %d\n", planeb_wm, cursorb_wm); 4093 enabled = 0;
4094 if (g4x_compute_wm0(dev, 0,
4095 &ironlake_display_wm_info,
4096 ILK_LP0_PLANE_LATENCY,
4097 &ironlake_cursor_wm_info,
4098 ILK_LP0_CURSOR_LATENCY,
4099 &plane_wm, &cursor_wm)) {
4100 I915_WRITE(WM0_PIPEA_ILK,
4101 (plane_wm << WM0_PIPE_PLANE_SHIFT) | cursor_wm);
4102 DRM_DEBUG_KMS("FIFO watermarks For pipe A -"
4103 " plane %d, " "cursor: %d\n",
4104 plane_wm, cursor_wm);
4105 enabled |= 1;
4106 }
4107
4108 if (g4x_compute_wm0(dev, 1,
4109 &ironlake_display_wm_info,
4110 ILK_LP0_PLANE_LATENCY,
4111 &ironlake_cursor_wm_info,
4112 ILK_LP0_CURSOR_LATENCY,
4113 &plane_wm, &cursor_wm)) {
4114 I915_WRITE(WM0_PIPEB_ILK,
4115 (plane_wm << WM0_PIPE_PLANE_SHIFT) | cursor_wm);
4116 DRM_DEBUG_KMS("FIFO watermarks For pipe B -"
4117 " plane %d, cursor: %d\n",
4118 plane_wm, cursor_wm);
4119 enabled |= 2;
3371 } 4120 }
3372 4121
3373 /* 4122 /*
3374 * Calculate and update the self-refresh watermark only when one 4123 * Calculate and update the self-refresh watermark only when one
3375 * display plane is used. 4124 * display plane is used.
3376 */ 4125 */
3377 if (!planea_clock || !planeb_clock) { 4126 I915_WRITE(WM3_LP_ILK, 0);
4127 I915_WRITE(WM2_LP_ILK, 0);
4128 I915_WRITE(WM1_LP_ILK, 0);
3378 4129
3379 /* Read the self-refresh latency. The unit is 0.5us */ 4130 if (!single_plane_enabled(enabled))
3380 int ilk_sr_latency = I915_READ(MLTR_ILK) & ILK_SRLT_MASK; 4131 return;
4132 enabled = ffs(enabled) - 1;
4133
4134 /* WM1 */
4135 if (!ironlake_compute_srwm(dev, 1, enabled,
4136 ILK_READ_WM1_LATENCY() * 500,
4137 &ironlake_display_srwm_info,
4138 &ironlake_cursor_srwm_info,
4139 &fbc_wm, &plane_wm, &cursor_wm))
4140 return;
3381 4141
3382 sr_clock = planea_clock ? planea_clock : planeb_clock; 4142 I915_WRITE(WM1_LP_ILK,
3383 line_time_us = ((sr_htotal * 1000) / sr_clock); 4143 WM1_LP_SR_EN |
4144 (ILK_READ_WM1_LATENCY() << WM1_LP_LATENCY_SHIFT) |
4145 (fbc_wm << WM1_LP_FBC_SHIFT) |
4146 (plane_wm << WM1_LP_SR_SHIFT) |
4147 cursor_wm);
4148
4149 /* WM2 */
4150 if (!ironlake_compute_srwm(dev, 2, enabled,
4151 ILK_READ_WM2_LATENCY() * 500,
4152 &ironlake_display_srwm_info,
4153 &ironlake_cursor_srwm_info,
4154 &fbc_wm, &plane_wm, &cursor_wm))
4155 return;
3384 4156
3385 /* Use ns/us then divide to preserve precision */ 4157 I915_WRITE(WM2_LP_ILK,
3386 line_count = ((ilk_sr_latency * 500) / line_time_us + 1000) 4158 WM2_LP_EN |
3387 / 1000; 4159 (ILK_READ_WM2_LATENCY() << WM1_LP_LATENCY_SHIFT) |
3388 4160 (fbc_wm << WM1_LP_FBC_SHIFT) |
3389 /* calculate the self-refresh watermark for display plane */ 4161 (plane_wm << WM1_LP_SR_SHIFT) |
3390 entries_required = line_count * sr_hdisplay * pixel_size; 4162 cursor_wm);
3391 entries_required = DIV_ROUND_UP(entries_required,
3392 ironlake_display_srwm_info.cacheline_size);
3393 sr_wm = entries_required +
3394 ironlake_display_srwm_info.guard_size;
3395
3396 /* calculate the self-refresh watermark for display cursor */
3397 entries_required = line_count * pixel_size * 64;
3398 entries_required = DIV_ROUND_UP(entries_required,
3399 ironlake_cursor_srwm_info.cacheline_size);
3400 cursor_wm = entries_required +
3401 ironlake_cursor_srwm_info.guard_size;
3402
3403 /* configure watermark and enable self-refresh */
3404 reg_value = I915_READ(WM1_LP_ILK);
3405 reg_value &= ~(WM1_LP_LATENCY_MASK | WM1_LP_SR_MASK |
3406 WM1_LP_CURSOR_MASK);
3407 reg_value |= (ilk_sr_latency << WM1_LP_LATENCY_SHIFT) |
3408 (sr_wm << WM1_LP_SR_SHIFT) | cursor_wm;
3409
3410 I915_WRITE(WM1_LP_ILK, reg_value);
3411 DRM_DEBUG_KMS("self-refresh watermark: display plane %d "
3412 "cursor %d\n", sr_wm, cursor_wm);
3413 4163
3414 } else { 4164 /*
3415 /* Turn off self refresh if both pipes are enabled */ 4165 * WM3 is unsupported on ILK, probably because we don't have latency
3416 I915_WRITE(WM1_LP_ILK, I915_READ(WM1_LP_ILK) & ~WM1_LP_SR_EN); 4166 * data for that power state
4167 */
4168}
4169
4170static void sandybridge_update_wm(struct drm_device *dev)
4171{
4172 struct drm_i915_private *dev_priv = dev->dev_private;
4173 int latency = SNB_READ_WM0_LATENCY() * 100; /* In unit 0.1us */
4174 int fbc_wm, plane_wm, cursor_wm;
4175 unsigned int enabled;
4176
4177 enabled = 0;
4178 if (g4x_compute_wm0(dev, 0,
4179 &sandybridge_display_wm_info, latency,
4180 &sandybridge_cursor_wm_info, latency,
4181 &plane_wm, &cursor_wm)) {
4182 I915_WRITE(WM0_PIPEA_ILK,
4183 (plane_wm << WM0_PIPE_PLANE_SHIFT) | cursor_wm);
4184 DRM_DEBUG_KMS("FIFO watermarks For pipe A -"
4185 " plane %d, " "cursor: %d\n",
4186 plane_wm, cursor_wm);
4187 enabled |= 1;
4188 }
4189
4190 if (g4x_compute_wm0(dev, 1,
4191 &sandybridge_display_wm_info, latency,
4192 &sandybridge_cursor_wm_info, latency,
4193 &plane_wm, &cursor_wm)) {
4194 I915_WRITE(WM0_PIPEB_ILK,
4195 (plane_wm << WM0_PIPE_PLANE_SHIFT) | cursor_wm);
4196 DRM_DEBUG_KMS("FIFO watermarks For pipe B -"
4197 " plane %d, cursor: %d\n",
4198 plane_wm, cursor_wm);
4199 enabled |= 2;
3417 } 4200 }
4201
4202 /*
4203 * Calculate and update the self-refresh watermark only when one
4204 * display plane is used.
4205 *
4206 * SNB support 3 levels of watermark.
4207 *
4208 * WM1/WM2/WM2 watermarks have to be enabled in the ascending order,
4209 * and disabled in the descending order
4210 *
4211 */
4212 I915_WRITE(WM3_LP_ILK, 0);
4213 I915_WRITE(WM2_LP_ILK, 0);
4214 I915_WRITE(WM1_LP_ILK, 0);
4215
4216 if (!single_plane_enabled(enabled))
4217 return;
4218 enabled = ffs(enabled) - 1;
4219
4220 /* WM1 */
4221 if (!ironlake_compute_srwm(dev, 1, enabled,
4222 SNB_READ_WM1_LATENCY() * 500,
4223 &sandybridge_display_srwm_info,
4224 &sandybridge_cursor_srwm_info,
4225 &fbc_wm, &plane_wm, &cursor_wm))
4226 return;
4227
4228 I915_WRITE(WM1_LP_ILK,
4229 WM1_LP_SR_EN |
4230 (SNB_READ_WM1_LATENCY() << WM1_LP_LATENCY_SHIFT) |
4231 (fbc_wm << WM1_LP_FBC_SHIFT) |
4232 (plane_wm << WM1_LP_SR_SHIFT) |
4233 cursor_wm);
4234
4235 /* WM2 */
4236 if (!ironlake_compute_srwm(dev, 2, enabled,
4237 SNB_READ_WM2_LATENCY() * 500,
4238 &sandybridge_display_srwm_info,
4239 &sandybridge_cursor_srwm_info,
4240 &fbc_wm, &plane_wm, &cursor_wm))
4241 return;
4242
4243 I915_WRITE(WM2_LP_ILK,
4244 WM2_LP_EN |
4245 (SNB_READ_WM2_LATENCY() << WM1_LP_LATENCY_SHIFT) |
4246 (fbc_wm << WM1_LP_FBC_SHIFT) |
4247 (plane_wm << WM1_LP_SR_SHIFT) |
4248 cursor_wm);
4249
4250 /* WM3 */
4251 if (!ironlake_compute_srwm(dev, 3, enabled,
4252 SNB_READ_WM3_LATENCY() * 500,
4253 &sandybridge_display_srwm_info,
4254 &sandybridge_cursor_srwm_info,
4255 &fbc_wm, &plane_wm, &cursor_wm))
4256 return;
4257
4258 I915_WRITE(WM3_LP_ILK,
4259 WM3_LP_EN |
4260 (SNB_READ_WM3_LATENCY() << WM1_LP_LATENCY_SHIFT) |
4261 (fbc_wm << WM1_LP_FBC_SHIFT) |
4262 (plane_wm << WM1_LP_SR_SHIFT) |
4263 cursor_wm);
3418} 4264}
4265
3419/** 4266/**
3420 * intel_update_watermarks - update FIFO watermark values based on current modes 4267 * intel_update_watermarks - update FIFO watermark values based on current modes
3421 * 4268 *
@@ -3447,117 +4294,56 @@ static void ironlake_update_wm(struct drm_device *dev, int planea_clock,
3447 * 4294 *
3448 * We don't use the sprite, so we can ignore that. And on Crestline we have 4295 * We don't use the sprite, so we can ignore that. And on Crestline we have
3449 * to set the non-SR watermarks to 8. 4296 * to set the non-SR watermarks to 8.
3450 */ 4297 */
3451static void intel_update_watermarks(struct drm_device *dev) 4298static void intel_update_watermarks(struct drm_device *dev)
3452{ 4299{
3453 struct drm_i915_private *dev_priv = dev->dev_private; 4300 struct drm_i915_private *dev_priv = dev->dev_private;
3454 struct drm_crtc *crtc;
3455 int sr_hdisplay = 0;
3456 unsigned long planea_clock = 0, planeb_clock = 0, sr_clock = 0;
3457 int enabled = 0, pixel_size = 0;
3458 int sr_htotal = 0;
3459 4301
3460 if (!dev_priv->display.update_wm) 4302 if (dev_priv->display.update_wm)
3461 return; 4303 dev_priv->display.update_wm(dev);
3462 4304}
3463 /* Get the clock config from both planes */
3464 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
3465 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
3466 if (intel_crtc->dpms_mode == DRM_MODE_DPMS_ON) {
3467 enabled++;
3468 if (intel_crtc->plane == 0) {
3469 DRM_DEBUG_KMS("plane A (pipe %d) clock: %d\n",
3470 intel_crtc->pipe, crtc->mode.clock);
3471 planea_clock = crtc->mode.clock;
3472 } else {
3473 DRM_DEBUG_KMS("plane B (pipe %d) clock: %d\n",
3474 intel_crtc->pipe, crtc->mode.clock);
3475 planeb_clock = crtc->mode.clock;
3476 }
3477 sr_hdisplay = crtc->mode.hdisplay;
3478 sr_clock = crtc->mode.clock;
3479 sr_htotal = crtc->mode.htotal;
3480 if (crtc->fb)
3481 pixel_size = crtc->fb->bits_per_pixel / 8;
3482 else
3483 pixel_size = 4; /* by default */
3484 }
3485 }
3486
3487 if (enabled <= 0)
3488 return;
3489 4305
3490 dev_priv->display.update_wm(dev, planea_clock, planeb_clock, 4306static inline bool intel_panel_use_ssc(struct drm_i915_private *dev_priv)
3491 sr_hdisplay, sr_htotal, pixel_size); 4307{
4308 return dev_priv->lvds_use_ssc && i915_panel_use_ssc
4309 && !(dev_priv->quirks & QUIRK_LVDS_SSC_DISABLE);
3492} 4310}
3493 4311
3494static int intel_crtc_mode_set(struct drm_crtc *crtc, 4312static int i9xx_crtc_mode_set(struct drm_crtc *crtc,
3495 struct drm_display_mode *mode, 4313 struct drm_display_mode *mode,
3496 struct drm_display_mode *adjusted_mode, 4314 struct drm_display_mode *adjusted_mode,
3497 int x, int y, 4315 int x, int y,
3498 struct drm_framebuffer *old_fb) 4316 struct drm_framebuffer *old_fb)
3499{ 4317{
3500 struct drm_device *dev = crtc->dev; 4318 struct drm_device *dev = crtc->dev;
3501 struct drm_i915_private *dev_priv = dev->dev_private; 4319 struct drm_i915_private *dev_priv = dev->dev_private;
3502 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 4320 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
3503 int pipe = intel_crtc->pipe; 4321 int pipe = intel_crtc->pipe;
3504 int plane = intel_crtc->plane; 4322 int plane = intel_crtc->plane;
3505 int fp_reg = (pipe == 0) ? FPA0 : FPB0;
3506 int dpll_reg = (pipe == 0) ? DPLL_A : DPLL_B;
3507 int dpll_md_reg = (intel_crtc->pipe == 0) ? DPLL_A_MD : DPLL_B_MD;
3508 int dspcntr_reg = (plane == 0) ? DSPACNTR : DSPBCNTR;
3509 int pipeconf_reg = (pipe == 0) ? PIPEACONF : PIPEBCONF;
3510 int htot_reg = (pipe == 0) ? HTOTAL_A : HTOTAL_B;
3511 int hblank_reg = (pipe == 0) ? HBLANK_A : HBLANK_B;
3512 int hsync_reg = (pipe == 0) ? HSYNC_A : HSYNC_B;
3513 int vtot_reg = (pipe == 0) ? VTOTAL_A : VTOTAL_B;
3514 int vblank_reg = (pipe == 0) ? VBLANK_A : VBLANK_B;
3515 int vsync_reg = (pipe == 0) ? VSYNC_A : VSYNC_B;
3516 int dspsize_reg = (plane == 0) ? DSPASIZE : DSPBSIZE;
3517 int dsppos_reg = (plane == 0) ? DSPAPOS : DSPBPOS;
3518 int pipesrc_reg = (pipe == 0) ? PIPEASRC : PIPEBSRC;
3519 int refclk, num_connectors = 0; 4323 int refclk, num_connectors = 0;
3520 intel_clock_t clock, reduced_clock; 4324 intel_clock_t clock, reduced_clock;
3521 u32 dpll = 0, fp = 0, fp2 = 0, dspcntr, pipeconf; 4325 u32 dpll, fp = 0, fp2 = 0, dspcntr, pipeconf;
3522 bool ok, has_reduced_clock = false, is_sdvo = false, is_dvo = false; 4326 bool ok, has_reduced_clock = false, is_sdvo = false, is_dvo = false;
3523 bool is_crt = false, is_lvds = false, is_tv = false, is_dp = false; 4327 bool is_crt = false, is_lvds = false, is_tv = false, is_dp = false;
3524 struct intel_encoder *has_edp_encoder = NULL;
3525 struct drm_mode_config *mode_config = &dev->mode_config; 4328 struct drm_mode_config *mode_config = &dev->mode_config;
3526 struct drm_encoder *encoder; 4329 struct intel_encoder *encoder;
3527 const intel_limit_t *limit; 4330 const intel_limit_t *limit;
3528 int ret; 4331 int ret;
3529 struct fdi_m_n m_n = {0};
3530 int data_m1_reg = (pipe == 0) ? PIPEA_DATA_M1 : PIPEB_DATA_M1;
3531 int data_n1_reg = (pipe == 0) ? PIPEA_DATA_N1 : PIPEB_DATA_N1;
3532 int link_m1_reg = (pipe == 0) ? PIPEA_LINK_M1 : PIPEB_LINK_M1;
3533 int link_n1_reg = (pipe == 0) ? PIPEA_LINK_N1 : PIPEB_LINK_N1;
3534 int pch_fp_reg = (pipe == 0) ? PCH_FPA0 : PCH_FPB0;
3535 int pch_dpll_reg = (pipe == 0) ? PCH_DPLL_A : PCH_DPLL_B;
3536 int fdi_rx_reg = (pipe == 0) ? FDI_RXA_CTL : FDI_RXB_CTL;
3537 int fdi_tx_reg = (pipe == 0) ? FDI_TXA_CTL : FDI_TXB_CTL;
3538 int trans_dpll_sel = (pipe == 0) ? 0 : 1;
3539 int lvds_reg = LVDS;
3540 u32 temp; 4332 u32 temp;
3541 int sdvo_pixel_multiply; 4333 u32 lvds_sync = 0;
3542 int target_clock;
3543
3544 drm_vblank_pre_modeset(dev, pipe);
3545
3546 list_for_each_entry(encoder, &mode_config->encoder_list, head) {
3547 struct intel_encoder *intel_encoder;
3548 4334
3549 if (encoder->crtc != crtc) 4335 list_for_each_entry(encoder, &mode_config->encoder_list, base.head) {
4336 if (encoder->base.crtc != crtc)
3550 continue; 4337 continue;
3551 4338
3552 intel_encoder = enc_to_intel_encoder(encoder); 4339 switch (encoder->type) {
3553 switch (intel_encoder->type) {
3554 case INTEL_OUTPUT_LVDS: 4340 case INTEL_OUTPUT_LVDS:
3555 is_lvds = true; 4341 is_lvds = true;
3556 break; 4342 break;
3557 case INTEL_OUTPUT_SDVO: 4343 case INTEL_OUTPUT_SDVO:
3558 case INTEL_OUTPUT_HDMI: 4344 case INTEL_OUTPUT_HDMI:
3559 is_sdvo = true; 4345 is_sdvo = true;
3560 if (intel_encoder->needs_tv_clock) 4346 if (encoder->needs_tv_clock)
3561 is_tv = true; 4347 is_tv = true;
3562 break; 4348 break;
3563 case INTEL_OUTPUT_DVO: 4349 case INTEL_OUTPUT_DVO:
@@ -3572,48 +4358,41 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc,
3572 case INTEL_OUTPUT_DISPLAYPORT: 4358 case INTEL_OUTPUT_DISPLAYPORT:
3573 is_dp = true; 4359 is_dp = true;
3574 break; 4360 break;
3575 case INTEL_OUTPUT_EDP:
3576 has_edp_encoder = intel_encoder;
3577 break;
3578 } 4361 }
3579 4362
3580 num_connectors++; 4363 num_connectors++;
3581 } 4364 }
3582 4365
3583 if (is_lvds && dev_priv->lvds_use_ssc && num_connectors < 2) { 4366 if (is_lvds && intel_panel_use_ssc(dev_priv) && num_connectors < 2) {
3584 refclk = dev_priv->lvds_ssc_freq * 1000; 4367 refclk = dev_priv->lvds_ssc_freq * 1000;
3585 DRM_DEBUG_KMS("using SSC reference clock of %d MHz\n", 4368 DRM_DEBUG_KMS("using SSC reference clock of %d MHz\n",
3586 refclk / 1000); 4369 refclk / 1000);
3587 } else if (IS_I9XX(dev)) { 4370 } else if (!IS_GEN2(dev)) {
3588 refclk = 96000; 4371 refclk = 96000;
3589 if (HAS_PCH_SPLIT(dev))
3590 refclk = 120000; /* 120Mhz refclk */
3591 } else { 4372 } else {
3592 refclk = 48000; 4373 refclk = 48000;
3593 } 4374 }
3594
3595 4375
3596 /* 4376 /*
3597 * Returns a set of divisors for the desired target clock with the given 4377 * Returns a set of divisors for the desired target clock with the given
3598 * refclk, or FALSE. The returned values represent the clock equation: 4378 * refclk, or FALSE. The returned values represent the clock equation:
3599 * reflck * (5 * (m1 + 2) + (m2 + 2)) / (n + 2) / p1 / p2. 4379 * reflck * (5 * (m1 + 2) + (m2 + 2)) / (n + 2) / p1 / p2.
3600 */ 4380 */
3601 limit = intel_limit(crtc); 4381 limit = intel_limit(crtc, refclk);
3602 ok = limit->find_pll(limit, crtc, adjusted_mode->clock, refclk, &clock); 4382 ok = limit->find_pll(limit, crtc, adjusted_mode->clock, refclk, &clock);
3603 if (!ok) { 4383 if (!ok) {
3604 DRM_ERROR("Couldn't find PLL settings for mode!\n"); 4384 DRM_ERROR("Couldn't find PLL settings for mode!\n");
3605 drm_vblank_post_modeset(dev, pipe);
3606 return -EINVAL; 4385 return -EINVAL;
3607 } 4386 }
3608 4387
3609 /* Ensure that the cursor is valid for the new mode before changing... */ 4388 /* Ensure that the cursor is valid for the new mode before changing... */
3610 intel_crtc_update_cursor(crtc); 4389 intel_crtc_update_cursor(crtc, true);
3611 4390
3612 if (is_lvds && dev_priv->lvds_downclock_avail) { 4391 if (is_lvds && dev_priv->lvds_downclock_avail) {
3613 has_reduced_clock = limit->find_pll(limit, crtc, 4392 has_reduced_clock = limit->find_pll(limit, crtc,
3614 dev_priv->lvds_downclock, 4393 dev_priv->lvds_downclock,
3615 refclk, 4394 refclk,
3616 &reduced_clock); 4395 &reduced_clock);
3617 if (has_reduced_clock && (clock.p != reduced_clock.p)) { 4396 if (has_reduced_clock && (clock.p != reduced_clock.p)) {
3618 /* 4397 /*
3619 * If the different P is found, it means that we can't 4398 * If the different P is found, it means that we can't
@@ -3622,7 +4401,7 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc,
3622 * feature. 4401 * feature.
3623 */ 4402 */
3624 DRM_DEBUG_KMS("Different P is found for " 4403 DRM_DEBUG_KMS("Different P is found for "
3625 "LVDS clock/downclock\n"); 4404 "LVDS clock/downclock\n");
3626 has_reduced_clock = 0; 4405 has_reduced_clock = 0;
3627 } 4406 }
3628 } 4407 }
@@ -3630,14 +4409,14 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc,
3630 this mirrors vbios setting. */ 4409 this mirrors vbios setting. */
3631 if (is_sdvo && is_tv) { 4410 if (is_sdvo && is_tv) {
3632 if (adjusted_mode->clock >= 100000 4411 if (adjusted_mode->clock >= 100000
3633 && adjusted_mode->clock < 140500) { 4412 && adjusted_mode->clock < 140500) {
3634 clock.p1 = 2; 4413 clock.p1 = 2;
3635 clock.p2 = 10; 4414 clock.p2 = 10;
3636 clock.n = 3; 4415 clock.n = 3;
3637 clock.m1 = 16; 4416 clock.m1 = 16;
3638 clock.m2 = 8; 4417 clock.m2 = 8;
3639 } else if (adjusted_mode->clock >= 140500 4418 } else if (adjusted_mode->clock >= 140500
3640 && adjusted_mode->clock <= 200000) { 4419 && adjusted_mode->clock <= 200000) {
3641 clock.p1 = 1; 4420 clock.p1 = 1;
3642 clock.p2 = 10; 4421 clock.p2 = 10;
3643 clock.n = 6; 4422 clock.n = 6;
@@ -3646,128 +4425,6 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc,
3646 } 4425 }
3647 } 4426 }
3648 4427
3649 /* FDI link */
3650 if (HAS_PCH_SPLIT(dev)) {
3651 int lane = 0, link_bw, bpp;
3652 /* eDP doesn't require FDI link, so just set DP M/N
3653 according to current link config */
3654 if (has_edp_encoder) {
3655 target_clock = mode->clock;
3656 intel_edp_link_config(has_edp_encoder,
3657 &lane, &link_bw);
3658 } else {
3659 /* DP over FDI requires target mode clock
3660 instead of link clock */
3661 if (is_dp)
3662 target_clock = mode->clock;
3663 else
3664 target_clock = adjusted_mode->clock;
3665 link_bw = 270000;
3666 }
3667
3668 /* determine panel color depth */
3669 temp = I915_READ(pipeconf_reg);
3670 temp &= ~PIPE_BPC_MASK;
3671 if (is_lvds) {
3672 int lvds_reg = I915_READ(PCH_LVDS);
3673 /* the BPC will be 6 if it is 18-bit LVDS panel */
3674 if ((lvds_reg & LVDS_A3_POWER_MASK) == LVDS_A3_POWER_UP)
3675 temp |= PIPE_8BPC;
3676 else
3677 temp |= PIPE_6BPC;
3678 } else if (has_edp_encoder || (is_dp && intel_pch_has_edp(crtc))) {
3679 switch (dev_priv->edp_bpp/3) {
3680 case 8:
3681 temp |= PIPE_8BPC;
3682 break;
3683 case 10:
3684 temp |= PIPE_10BPC;
3685 break;
3686 case 6:
3687 temp |= PIPE_6BPC;
3688 break;
3689 case 12:
3690 temp |= PIPE_12BPC;
3691 break;
3692 }
3693 } else
3694 temp |= PIPE_8BPC;
3695 I915_WRITE(pipeconf_reg, temp);
3696 I915_READ(pipeconf_reg);
3697
3698 switch (temp & PIPE_BPC_MASK) {
3699 case PIPE_8BPC:
3700 bpp = 24;
3701 break;
3702 case PIPE_10BPC:
3703 bpp = 30;
3704 break;
3705 case PIPE_6BPC:
3706 bpp = 18;
3707 break;
3708 case PIPE_12BPC:
3709 bpp = 36;
3710 break;
3711 default:
3712 DRM_ERROR("unknown pipe bpc value\n");
3713 bpp = 24;
3714 }
3715
3716 if (!lane) {
3717 /*
3718 * Account for spread spectrum to avoid
3719 * oversubscribing the link. Max center spread
3720 * is 2.5%; use 5% for safety's sake.
3721 */
3722 u32 bps = target_clock * bpp * 21 / 20;
3723 lane = bps / (link_bw * 8) + 1;
3724 }
3725
3726 intel_crtc->fdi_lanes = lane;
3727
3728 ironlake_compute_m_n(bpp, lane, target_clock, link_bw, &m_n);
3729 }
3730
3731 /* Ironlake: try to setup display ref clock before DPLL
3732 * enabling. This is only under driver's control after
3733 * PCH B stepping, previous chipset stepping should be
3734 * ignoring this setting.
3735 */
3736 if (HAS_PCH_SPLIT(dev)) {
3737 temp = I915_READ(PCH_DREF_CONTROL);
3738 /* Always enable nonspread source */
3739 temp &= ~DREF_NONSPREAD_SOURCE_MASK;
3740 temp |= DREF_NONSPREAD_SOURCE_ENABLE;
3741 I915_WRITE(PCH_DREF_CONTROL, temp);
3742 POSTING_READ(PCH_DREF_CONTROL);
3743
3744 temp &= ~DREF_SSC_SOURCE_MASK;
3745 temp |= DREF_SSC_SOURCE_ENABLE;
3746 I915_WRITE(PCH_DREF_CONTROL, temp);
3747 POSTING_READ(PCH_DREF_CONTROL);
3748
3749 udelay(200);
3750
3751 if (has_edp_encoder) {
3752 if (dev_priv->lvds_use_ssc) {
3753 temp |= DREF_SSC1_ENABLE;
3754 I915_WRITE(PCH_DREF_CONTROL, temp);
3755 POSTING_READ(PCH_DREF_CONTROL);
3756
3757 udelay(200);
3758
3759 temp &= ~DREF_CPU_SOURCE_OUTPUT_MASK;
3760 temp |= DREF_CPU_SOURCE_OUTPUT_DOWNSPREAD;
3761 I915_WRITE(PCH_DREF_CONTROL, temp);
3762 POSTING_READ(PCH_DREF_CONTROL);
3763 } else {
3764 temp |= DREF_CPU_SOURCE_OUTPUT_NONSPREAD;
3765 I915_WRITE(PCH_DREF_CONTROL, temp);
3766 POSTING_READ(PCH_DREF_CONTROL);
3767 }
3768 }
3769 }
3770
3771 if (IS_PINEVIEW(dev)) { 4428 if (IS_PINEVIEW(dev)) {
3772 fp = (1 << clock.n) << 16 | clock.m1 << 8 | clock.m2; 4429 fp = (1 << clock.n) << 16 | clock.m1 << 8 | clock.m2;
3773 if (has_reduced_clock) 4430 if (has_reduced_clock)
@@ -3780,21 +4437,20 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc,
3780 reduced_clock.m2; 4437 reduced_clock.m2;
3781 } 4438 }
3782 4439
3783 if (!HAS_PCH_SPLIT(dev)) 4440 dpll = DPLL_VGA_MODE_DIS;
3784 dpll = DPLL_VGA_MODE_DIS;
3785 4441
3786 if (IS_I9XX(dev)) { 4442 if (!IS_GEN2(dev)) {
3787 if (is_lvds) 4443 if (is_lvds)
3788 dpll |= DPLLB_MODE_LVDS; 4444 dpll |= DPLLB_MODE_LVDS;
3789 else 4445 else
3790 dpll |= DPLLB_MODE_DAC_SERIAL; 4446 dpll |= DPLLB_MODE_DAC_SERIAL;
3791 if (is_sdvo) { 4447 if (is_sdvo) {
4448 int pixel_multiplier = intel_mode_get_pixel_multiplier(adjusted_mode);
4449 if (pixel_multiplier > 1) {
4450 if (IS_I945G(dev) || IS_I945GM(dev) || IS_G33(dev))
4451 dpll |= (pixel_multiplier - 1) << SDVO_MULTIPLIER_SHIFT_HIRES;
4452 }
3792 dpll |= DPLL_DVO_HIGH_SPEED; 4453 dpll |= DPLL_DVO_HIGH_SPEED;
3793 sdvo_pixel_multiply = adjusted_mode->clock / mode->clock;
3794 if (IS_I945G(dev) || IS_I945GM(dev) || IS_G33(dev))
3795 dpll |= (sdvo_pixel_multiply - 1) << SDVO_MULTIPLIER_SHIFT_HIRES;
3796 else if (HAS_PCH_SPLIT(dev))
3797 dpll |= (sdvo_pixel_multiply - 1) << PLL_REF_SDVO_HDMI_MULTIPLIER_SHIFT;
3798 } 4454 }
3799 if (is_dp) 4455 if (is_dp)
3800 dpll |= DPLL_DVO_HIGH_SPEED; 4456 dpll |= DPLL_DVO_HIGH_SPEED;
@@ -3804,9 +4460,6 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc,
3804 dpll |= (1 << (clock.p1 - 1)) << DPLL_FPA01_P1_POST_DIV_SHIFT_PINEVIEW; 4460 dpll |= (1 << (clock.p1 - 1)) << DPLL_FPA01_P1_POST_DIV_SHIFT_PINEVIEW;
3805 else { 4461 else {
3806 dpll |= (1 << (clock.p1 - 1)) << DPLL_FPA01_P1_POST_DIV_SHIFT; 4462 dpll |= (1 << (clock.p1 - 1)) << DPLL_FPA01_P1_POST_DIV_SHIFT;
3807 /* also FPA1 */
3808 if (HAS_PCH_SPLIT(dev))
3809 dpll |= (1 << (clock.p1 - 1)) << DPLL_FPA1_P1_POST_DIV_SHIFT;
3810 if (IS_G4X(dev) && has_reduced_clock) 4463 if (IS_G4X(dev) && has_reduced_clock)
3811 dpll |= (1 << (reduced_clock.p1 - 1)) << DPLL_FPA1_P1_POST_DIV_SHIFT; 4464 dpll |= (1 << (reduced_clock.p1 - 1)) << DPLL_FPA1_P1_POST_DIV_SHIFT;
3812 } 4465 }
@@ -3824,7 +4477,7 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc,
3824 dpll |= DPLLB_LVDS_P2_CLOCK_DIV_14; 4477 dpll |= DPLLB_LVDS_P2_CLOCK_DIV_14;
3825 break; 4478 break;
3826 } 4479 }
3827 if (IS_I965G(dev) && !HAS_PCH_SPLIT(dev)) 4480 if (INTEL_INFO(dev)->gen >= 4)
3828 dpll |= (6 << PLL_LOAD_PULSE_PHASE_SHIFT); 4481 dpll |= (6 << PLL_LOAD_PULSE_PHASE_SHIFT);
3829 } else { 4482 } else {
3830 if (is_lvds) { 4483 if (is_lvds) {
@@ -3845,27 +4498,25 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc,
3845 /* XXX: just matching BIOS for now */ 4498 /* XXX: just matching BIOS for now */
3846 /* dpll |= PLL_REF_INPUT_TVCLKINBC; */ 4499 /* dpll |= PLL_REF_INPUT_TVCLKINBC; */
3847 dpll |= 3; 4500 dpll |= 3;
3848 else if (is_lvds && dev_priv->lvds_use_ssc && num_connectors < 2) 4501 else if (is_lvds && intel_panel_use_ssc(dev_priv) && num_connectors < 2)
3849 dpll |= PLLB_REF_INPUT_SPREADSPECTRUMIN; 4502 dpll |= PLLB_REF_INPUT_SPREADSPECTRUMIN;
3850 else 4503 else
3851 dpll |= PLL_REF_INPUT_DREFCLK; 4504 dpll |= PLL_REF_INPUT_DREFCLK;
3852 4505
3853 /* setup pipeconf */ 4506 /* setup pipeconf */
3854 pipeconf = I915_READ(pipeconf_reg); 4507 pipeconf = I915_READ(PIPECONF(pipe));
3855 4508
3856 /* Set up the display plane register */ 4509 /* Set up the display plane register */
3857 dspcntr = DISPPLANE_GAMMA_ENABLE; 4510 dspcntr = DISPPLANE_GAMMA_ENABLE;
3858 4511
3859 /* Ironlake's plane is forced to pipe, bit 24 is to 4512 /* Ironlake's plane is forced to pipe, bit 24 is to
3860 enable color space conversion */ 4513 enable color space conversion */
3861 if (!HAS_PCH_SPLIT(dev)) { 4514 if (pipe == 0)
3862 if (pipe == 0) 4515 dspcntr &= ~DISPPLANE_SEL_PIPE_MASK;
3863 dspcntr &= ~DISPPLANE_SEL_PIPE_MASK; 4516 else
3864 else 4517 dspcntr |= DISPPLANE_SEL_PIPE_B;
3865 dspcntr |= DISPPLANE_SEL_PIPE_B;
3866 }
3867 4518
3868 if (pipe == 0 && !IS_I965G(dev)) { 4519 if (pipe == 0 && INTEL_INFO(dev)->gen < 4) {
3869 /* Enable pixel doubling when the dot clock is > 90% of the (display) 4520 /* Enable pixel doubling when the dot clock is > 90% of the (display)
3870 * core speed. 4521 * core speed.
3871 * 4522 *
@@ -3874,51 +4525,536 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc,
3874 */ 4525 */
3875 if (mode->clock > 4526 if (mode->clock >
3876 dev_priv->display.get_display_clock_speed(dev) * 9 / 10) 4527 dev_priv->display.get_display_clock_speed(dev) * 9 / 10)
3877 pipeconf |= PIPEACONF_DOUBLE_WIDE; 4528 pipeconf |= PIPECONF_DOUBLE_WIDE;
3878 else 4529 else
3879 pipeconf &= ~PIPEACONF_DOUBLE_WIDE; 4530 pipeconf &= ~PIPECONF_DOUBLE_WIDE;
3880 } 4531 }
3881 4532
3882 dspcntr |= DISPLAY_PLANE_ENABLE;
3883 pipeconf |= PIPEACONF_ENABLE;
3884 dpll |= DPLL_VCO_ENABLE; 4533 dpll |= DPLL_VCO_ENABLE;
3885 4534
4535 DRM_DEBUG_KMS("Mode for pipe %c:\n", pipe == 0 ? 'A' : 'B');
4536 drm_mode_debug_printmodeline(mode);
3886 4537
3887 /* Disable the panel fitter if it was on our pipe */ 4538 I915_WRITE(FP0(pipe), fp);
3888 if (!HAS_PCH_SPLIT(dev) && intel_panel_fitter_pipe(dev) == pipe) 4539 I915_WRITE(DPLL(pipe), dpll & ~DPLL_VCO_ENABLE);
3889 I915_WRITE(PFIT_CONTROL, 0); 4540
4541 POSTING_READ(DPLL(pipe));
4542 udelay(150);
4543
4544 /* The LVDS pin pair needs to be on before the DPLLs are enabled.
4545 * This is an exception to the general rule that mode_set doesn't turn
4546 * things on.
4547 */
4548 if (is_lvds) {
4549 temp = I915_READ(LVDS);
4550 temp |= LVDS_PORT_EN | LVDS_A0A2_CLKA_POWER_UP;
4551 if (pipe == 1) {
4552 temp |= LVDS_PIPEB_SELECT;
4553 } else {
4554 temp &= ~LVDS_PIPEB_SELECT;
4555 }
4556 /* set the corresponsding LVDS_BORDER bit */
4557 temp |= dev_priv->lvds_border_bits;
4558 /* Set the B0-B3 data pairs corresponding to whether we're going to
4559 * set the DPLLs for dual-channel mode or not.
4560 */
4561 if (clock.p2 == 7)
4562 temp |= LVDS_B0B3_POWER_UP | LVDS_CLKB_POWER_UP;
4563 else
4564 temp &= ~(LVDS_B0B3_POWER_UP | LVDS_CLKB_POWER_UP);
4565
4566 /* It would be nice to set 24 vs 18-bit mode (LVDS_A3_POWER_UP)
4567 * appropriately here, but we need to look more thoroughly into how
4568 * panels behave in the two modes.
4569 */
4570 /* set the dithering flag on LVDS as needed */
4571 if (INTEL_INFO(dev)->gen >= 4) {
4572 if (dev_priv->lvds_dither)
4573 temp |= LVDS_ENABLE_DITHER;
4574 else
4575 temp &= ~LVDS_ENABLE_DITHER;
4576 }
4577 if (adjusted_mode->flags & DRM_MODE_FLAG_NHSYNC)
4578 lvds_sync |= LVDS_HSYNC_POLARITY;
4579 if (adjusted_mode->flags & DRM_MODE_FLAG_NVSYNC)
4580 lvds_sync |= LVDS_VSYNC_POLARITY;
4581 if ((temp & (LVDS_HSYNC_POLARITY | LVDS_VSYNC_POLARITY))
4582 != lvds_sync) {
4583 char flags[2] = "-+";
4584 DRM_INFO("Changing LVDS panel from "
4585 "(%chsync, %cvsync) to (%chsync, %cvsync)\n",
4586 flags[!(temp & LVDS_HSYNC_POLARITY)],
4587 flags[!(temp & LVDS_VSYNC_POLARITY)],
4588 flags[!(lvds_sync & LVDS_HSYNC_POLARITY)],
4589 flags[!(lvds_sync & LVDS_VSYNC_POLARITY)]);
4590 temp &= ~(LVDS_HSYNC_POLARITY | LVDS_VSYNC_POLARITY);
4591 temp |= lvds_sync;
4592 }
4593 I915_WRITE(LVDS, temp);
4594 }
4595
4596 if (is_dp) {
4597 intel_dp_set_m_n(crtc, mode, adjusted_mode);
4598 }
4599
4600 I915_WRITE(DPLL(pipe), dpll);
4601
4602 /* Wait for the clocks to stabilize. */
4603 POSTING_READ(DPLL(pipe));
4604 udelay(150);
4605
4606 if (INTEL_INFO(dev)->gen >= 4) {
4607 temp = 0;
4608 if (is_sdvo) {
4609 temp = intel_mode_get_pixel_multiplier(adjusted_mode);
4610 if (temp > 1)
4611 temp = (temp - 1) << DPLL_MD_UDI_MULTIPLIER_SHIFT;
4612 else
4613 temp = 0;
4614 }
4615 I915_WRITE(DPLL_MD(pipe), temp);
4616 } else {
4617 /* The pixel multiplier can only be updated once the
4618 * DPLL is enabled and the clocks are stable.
4619 *
4620 * So write it again.
4621 */
4622 I915_WRITE(DPLL(pipe), dpll);
4623 }
4624
4625 intel_crtc->lowfreq_avail = false;
4626 if (is_lvds && has_reduced_clock && i915_powersave) {
4627 I915_WRITE(FP1(pipe), fp2);
4628 intel_crtc->lowfreq_avail = true;
4629 if (HAS_PIPE_CXSR(dev)) {
4630 DRM_DEBUG_KMS("enabling CxSR downclocking\n");
4631 pipeconf |= PIPECONF_CXSR_DOWNCLOCK;
4632 }
4633 } else {
4634 I915_WRITE(FP1(pipe), fp);
4635 if (HAS_PIPE_CXSR(dev)) {
4636 DRM_DEBUG_KMS("disabling CxSR downclocking\n");
4637 pipeconf &= ~PIPECONF_CXSR_DOWNCLOCK;
4638 }
4639 }
4640
4641 if (adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE) {
4642 pipeconf |= PIPECONF_INTERLACE_W_FIELD_INDICATION;
4643 /* the chip adds 2 halflines automatically */
4644 adjusted_mode->crtc_vdisplay -= 1;
4645 adjusted_mode->crtc_vtotal -= 1;
4646 adjusted_mode->crtc_vblank_start -= 1;
4647 adjusted_mode->crtc_vblank_end -= 1;
4648 adjusted_mode->crtc_vsync_end -= 1;
4649 adjusted_mode->crtc_vsync_start -= 1;
4650 } else
4651 pipeconf &= ~PIPECONF_INTERLACE_W_FIELD_INDICATION; /* progressive */
4652
4653 I915_WRITE(HTOTAL(pipe),
4654 (adjusted_mode->crtc_hdisplay - 1) |
4655 ((adjusted_mode->crtc_htotal - 1) << 16));
4656 I915_WRITE(HBLANK(pipe),
4657 (adjusted_mode->crtc_hblank_start - 1) |
4658 ((adjusted_mode->crtc_hblank_end - 1) << 16));
4659 I915_WRITE(HSYNC(pipe),
4660 (adjusted_mode->crtc_hsync_start - 1) |
4661 ((adjusted_mode->crtc_hsync_end - 1) << 16));
4662
4663 I915_WRITE(VTOTAL(pipe),
4664 (adjusted_mode->crtc_vdisplay - 1) |
4665 ((adjusted_mode->crtc_vtotal - 1) << 16));
4666 I915_WRITE(VBLANK(pipe),
4667 (adjusted_mode->crtc_vblank_start - 1) |
4668 ((adjusted_mode->crtc_vblank_end - 1) << 16));
4669 I915_WRITE(VSYNC(pipe),
4670 (adjusted_mode->crtc_vsync_start - 1) |
4671 ((adjusted_mode->crtc_vsync_end - 1) << 16));
4672
4673 /* pipesrc and dspsize control the size that is scaled from,
4674 * which should always be the user's requested size.
4675 */
4676 I915_WRITE(DSPSIZE(plane),
4677 ((mode->vdisplay - 1) << 16) |
4678 (mode->hdisplay - 1));
4679 I915_WRITE(DSPPOS(plane), 0);
4680 I915_WRITE(PIPESRC(pipe),
4681 ((mode->hdisplay - 1) << 16) | (mode->vdisplay - 1));
4682
4683 I915_WRITE(PIPECONF(pipe), pipeconf);
4684 POSTING_READ(PIPECONF(pipe));
4685 intel_enable_pipe(dev_priv, pipe, false);
4686
4687 intel_wait_for_vblank(dev, pipe);
4688
4689 I915_WRITE(DSPCNTR(plane), dspcntr);
4690 POSTING_READ(DSPCNTR(plane));
4691 intel_enable_plane(dev_priv, plane, pipe);
4692
4693 ret = intel_pipe_set_base(crtc, x, y, old_fb);
4694
4695 intel_update_watermarks(dev);
4696
4697 return ret;
4698}
4699
4700static int ironlake_crtc_mode_set(struct drm_crtc *crtc,
4701 struct drm_display_mode *mode,
4702 struct drm_display_mode *adjusted_mode,
4703 int x, int y,
4704 struct drm_framebuffer *old_fb)
4705{
4706 struct drm_device *dev = crtc->dev;
4707 struct drm_i915_private *dev_priv = dev->dev_private;
4708 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
4709 int pipe = intel_crtc->pipe;
4710 int plane = intel_crtc->plane;
4711 int refclk, num_connectors = 0;
4712 intel_clock_t clock, reduced_clock;
4713 u32 dpll, fp = 0, fp2 = 0, dspcntr, pipeconf;
4714 bool ok, has_reduced_clock = false, is_sdvo = false;
4715 bool is_crt = false, is_lvds = false, is_tv = false, is_dp = false;
4716 struct intel_encoder *has_edp_encoder = NULL;
4717 struct drm_mode_config *mode_config = &dev->mode_config;
4718 struct intel_encoder *encoder;
4719 const intel_limit_t *limit;
4720 int ret;
4721 struct fdi_m_n m_n = {0};
4722 u32 temp;
4723 u32 lvds_sync = 0;
4724 int target_clock, pixel_multiplier, lane, link_bw, bpp, factor;
4725
4726 list_for_each_entry(encoder, &mode_config->encoder_list, base.head) {
4727 if (encoder->base.crtc != crtc)
4728 continue;
4729
4730 switch (encoder->type) {
4731 case INTEL_OUTPUT_LVDS:
4732 is_lvds = true;
4733 break;
4734 case INTEL_OUTPUT_SDVO:
4735 case INTEL_OUTPUT_HDMI:
4736 is_sdvo = true;
4737 if (encoder->needs_tv_clock)
4738 is_tv = true;
4739 break;
4740 case INTEL_OUTPUT_TVOUT:
4741 is_tv = true;
4742 break;
4743 case INTEL_OUTPUT_ANALOG:
4744 is_crt = true;
4745 break;
4746 case INTEL_OUTPUT_DISPLAYPORT:
4747 is_dp = true;
4748 break;
4749 case INTEL_OUTPUT_EDP:
4750 has_edp_encoder = encoder;
4751 break;
4752 }
4753
4754 num_connectors++;
4755 }
4756
4757 if (is_lvds && intel_panel_use_ssc(dev_priv) && num_connectors < 2) {
4758 refclk = dev_priv->lvds_ssc_freq * 1000;
4759 DRM_DEBUG_KMS("using SSC reference clock of %d MHz\n",
4760 refclk / 1000);
4761 } else {
4762 refclk = 96000;
4763 if (!has_edp_encoder ||
4764 intel_encoder_is_pch_edp(&has_edp_encoder->base))
4765 refclk = 120000; /* 120Mhz refclk */
4766 }
4767
4768 /*
4769 * Returns a set of divisors for the desired target clock with the given
4770 * refclk, or FALSE. The returned values represent the clock equation:
4771 * reflck * (5 * (m1 + 2) + (m2 + 2)) / (n + 2) / p1 / p2.
4772 */
4773 limit = intel_limit(crtc, refclk);
4774 ok = limit->find_pll(limit, crtc, adjusted_mode->clock, refclk, &clock);
4775 if (!ok) {
4776 DRM_ERROR("Couldn't find PLL settings for mode!\n");
4777 return -EINVAL;
4778 }
4779
4780 /* Ensure that the cursor is valid for the new mode before changing... */
4781 intel_crtc_update_cursor(crtc, true);
4782
4783 if (is_lvds && dev_priv->lvds_downclock_avail) {
4784 has_reduced_clock = limit->find_pll(limit, crtc,
4785 dev_priv->lvds_downclock,
4786 refclk,
4787 &reduced_clock);
4788 if (has_reduced_clock && (clock.p != reduced_clock.p)) {
4789 /*
4790 * If the different P is found, it means that we can't
4791 * switch the display clock by using the FP0/FP1.
4792 * In such case we will disable the LVDS downclock
4793 * feature.
4794 */
4795 DRM_DEBUG_KMS("Different P is found for "
4796 "LVDS clock/downclock\n");
4797 has_reduced_clock = 0;
4798 }
4799 }
4800 /* SDVO TV has fixed PLL values depend on its clock range,
4801 this mirrors vbios setting. */
4802 if (is_sdvo && is_tv) {
4803 if (adjusted_mode->clock >= 100000
4804 && adjusted_mode->clock < 140500) {
4805 clock.p1 = 2;
4806 clock.p2 = 10;
4807 clock.n = 3;
4808 clock.m1 = 16;
4809 clock.m2 = 8;
4810 } else if (adjusted_mode->clock >= 140500
4811 && adjusted_mode->clock <= 200000) {
4812 clock.p1 = 1;
4813 clock.p2 = 10;
4814 clock.n = 6;
4815 clock.m1 = 12;
4816 clock.m2 = 8;
4817 }
4818 }
4819
4820 /* FDI link */
4821 pixel_multiplier = intel_mode_get_pixel_multiplier(adjusted_mode);
4822 lane = 0;
4823 /* CPU eDP doesn't require FDI link, so just set DP M/N
4824 according to current link config */
4825 if (has_edp_encoder &&
4826 !intel_encoder_is_pch_edp(&has_edp_encoder->base)) {
4827 target_clock = mode->clock;
4828 intel_edp_link_config(has_edp_encoder,
4829 &lane, &link_bw);
4830 } else {
4831 /* [e]DP over FDI requires target mode clock
4832 instead of link clock */
4833 if (is_dp || intel_encoder_is_pch_edp(&has_edp_encoder->base))
4834 target_clock = mode->clock;
4835 else
4836 target_clock = adjusted_mode->clock;
4837
4838 /* FDI is a binary signal running at ~2.7GHz, encoding
4839 * each output octet as 10 bits. The actual frequency
4840 * is stored as a divider into a 100MHz clock, and the
4841 * mode pixel clock is stored in units of 1KHz.
4842 * Hence the bw of each lane in terms of the mode signal
4843 * is:
4844 */
4845 link_bw = intel_fdi_link_freq(dev) * MHz(100)/KHz(1)/10;
4846 }
4847
4848 /* determine panel color depth */
4849 temp = I915_READ(PIPECONF(pipe));
4850 temp &= ~PIPE_BPC_MASK;
4851 if (is_lvds) {
4852 /* the BPC will be 6 if it is 18-bit LVDS panel */
4853 if ((I915_READ(PCH_LVDS) & LVDS_A3_POWER_MASK) == LVDS_A3_POWER_UP)
4854 temp |= PIPE_8BPC;
4855 else
4856 temp |= PIPE_6BPC;
4857 } else if (has_edp_encoder) {
4858 switch (dev_priv->edp.bpp/3) {
4859 case 8:
4860 temp |= PIPE_8BPC;
4861 break;
4862 case 10:
4863 temp |= PIPE_10BPC;
4864 break;
4865 case 6:
4866 temp |= PIPE_6BPC;
4867 break;
4868 case 12:
4869 temp |= PIPE_12BPC;
4870 break;
4871 }
4872 } else
4873 temp |= PIPE_8BPC;
4874 I915_WRITE(PIPECONF(pipe), temp);
4875
4876 switch (temp & PIPE_BPC_MASK) {
4877 case PIPE_8BPC:
4878 bpp = 24;
4879 break;
4880 case PIPE_10BPC:
4881 bpp = 30;
4882 break;
4883 case PIPE_6BPC:
4884 bpp = 18;
4885 break;
4886 case PIPE_12BPC:
4887 bpp = 36;
4888 break;
4889 default:
4890 DRM_ERROR("unknown pipe bpc value\n");
4891 bpp = 24;
4892 }
4893
4894 if (!lane) {
4895 /*
4896 * Account for spread spectrum to avoid
4897 * oversubscribing the link. Max center spread
4898 * is 2.5%; use 5% for safety's sake.
4899 */
4900 u32 bps = target_clock * bpp * 21 / 20;
4901 lane = bps / (link_bw * 8) + 1;
4902 }
4903
4904 intel_crtc->fdi_lanes = lane;
4905
4906 if (pixel_multiplier > 1)
4907 link_bw *= pixel_multiplier;
4908 ironlake_compute_m_n(bpp, lane, target_clock, link_bw, &m_n);
4909
4910 /* Ironlake: try to setup display ref clock before DPLL
4911 * enabling. This is only under driver's control after
4912 * PCH B stepping, previous chipset stepping should be
4913 * ignoring this setting.
4914 */
4915 temp = I915_READ(PCH_DREF_CONTROL);
4916 /* Always enable nonspread source */
4917 temp &= ~DREF_NONSPREAD_SOURCE_MASK;
4918 temp |= DREF_NONSPREAD_SOURCE_ENABLE;
4919 temp &= ~DREF_SSC_SOURCE_MASK;
4920 temp |= DREF_SSC_SOURCE_ENABLE;
4921 I915_WRITE(PCH_DREF_CONTROL, temp);
4922
4923 POSTING_READ(PCH_DREF_CONTROL);
4924 udelay(200);
4925
4926 if (has_edp_encoder) {
4927 if (intel_panel_use_ssc(dev_priv)) {
4928 temp |= DREF_SSC1_ENABLE;
4929 I915_WRITE(PCH_DREF_CONTROL, temp);
4930
4931 POSTING_READ(PCH_DREF_CONTROL);
4932 udelay(200);
4933 }
4934 temp &= ~DREF_CPU_SOURCE_OUTPUT_MASK;
4935
4936 /* Enable CPU source on CPU attached eDP */
4937 if (!intel_encoder_is_pch_edp(&has_edp_encoder->base)) {
4938 if (intel_panel_use_ssc(dev_priv))
4939 temp |= DREF_CPU_SOURCE_OUTPUT_DOWNSPREAD;
4940 else
4941 temp |= DREF_CPU_SOURCE_OUTPUT_NONSPREAD;
4942 } else {
4943 /* Enable SSC on PCH eDP if needed */
4944 if (intel_panel_use_ssc(dev_priv)) {
4945 DRM_ERROR("enabling SSC on PCH\n");
4946 temp |= DREF_SUPERSPREAD_SOURCE_ENABLE;
4947 }
4948 }
4949 I915_WRITE(PCH_DREF_CONTROL, temp);
4950 POSTING_READ(PCH_DREF_CONTROL);
4951 udelay(200);
4952 }
4953
4954 fp = clock.n << 16 | clock.m1 << 8 | clock.m2;
4955 if (has_reduced_clock)
4956 fp2 = reduced_clock.n << 16 | reduced_clock.m1 << 8 |
4957 reduced_clock.m2;
4958
4959 /* Enable autotuning of the PLL clock (if permissible) */
4960 factor = 21;
4961 if (is_lvds) {
4962 if ((intel_panel_use_ssc(dev_priv) &&
4963 dev_priv->lvds_ssc_freq == 100) ||
4964 (I915_READ(PCH_LVDS) & LVDS_CLKB_POWER_MASK) == LVDS_CLKB_POWER_UP)
4965 factor = 25;
4966 } else if (is_sdvo && is_tv)
4967 factor = 20;
4968
4969 if (clock.m1 < factor * clock.n)
4970 fp |= FP_CB_TUNE;
4971
4972 dpll = 0;
4973
4974 if (is_lvds)
4975 dpll |= DPLLB_MODE_LVDS;
4976 else
4977 dpll |= DPLLB_MODE_DAC_SERIAL;
4978 if (is_sdvo) {
4979 int pixel_multiplier = intel_mode_get_pixel_multiplier(adjusted_mode);
4980 if (pixel_multiplier > 1) {
4981 dpll |= (pixel_multiplier - 1) << PLL_REF_SDVO_HDMI_MULTIPLIER_SHIFT;
4982 }
4983 dpll |= DPLL_DVO_HIGH_SPEED;
4984 }
4985 if (is_dp || intel_encoder_is_pch_edp(&has_edp_encoder->base))
4986 dpll |= DPLL_DVO_HIGH_SPEED;
4987
4988 /* compute bitmask from p1 value */
4989 dpll |= (1 << (clock.p1 - 1)) << DPLL_FPA01_P1_POST_DIV_SHIFT;
4990 /* also FPA1 */
4991 dpll |= (1 << (clock.p1 - 1)) << DPLL_FPA1_P1_POST_DIV_SHIFT;
4992
4993 switch (clock.p2) {
4994 case 5:
4995 dpll |= DPLL_DAC_SERIAL_P2_CLOCK_DIV_5;
4996 break;
4997 case 7:
4998 dpll |= DPLLB_LVDS_P2_CLOCK_DIV_7;
4999 break;
5000 case 10:
5001 dpll |= DPLL_DAC_SERIAL_P2_CLOCK_DIV_10;
5002 break;
5003 case 14:
5004 dpll |= DPLLB_LVDS_P2_CLOCK_DIV_14;
5005 break;
5006 }
5007
5008 if (is_sdvo && is_tv)
5009 dpll |= PLL_REF_INPUT_TVCLKINBC;
5010 else if (is_tv)
5011 /* XXX: just matching BIOS for now */
5012 /* dpll |= PLL_REF_INPUT_TVCLKINBC; */
5013 dpll |= 3;
5014 else if (is_lvds && intel_panel_use_ssc(dev_priv) && num_connectors < 2)
5015 dpll |= PLLB_REF_INPUT_SPREADSPECTRUMIN;
5016 else
5017 dpll |= PLL_REF_INPUT_DREFCLK;
5018
5019 /* setup pipeconf */
5020 pipeconf = I915_READ(PIPECONF(pipe));
5021
5022 /* Set up the display plane register */
5023 dspcntr = DISPPLANE_GAMMA_ENABLE;
3890 5024
3891 DRM_DEBUG_KMS("Mode for pipe %c:\n", pipe == 0 ? 'A' : 'B'); 5025 DRM_DEBUG_KMS("Mode for pipe %c:\n", pipe == 0 ? 'A' : 'B');
3892 drm_mode_debug_printmodeline(mode); 5026 drm_mode_debug_printmodeline(mode);
3893 5027
3894 /* assign to Ironlake registers */ 5028 /* PCH eDP needs FDI, but CPU eDP does not */
3895 if (HAS_PCH_SPLIT(dev)) { 5029 if (!has_edp_encoder || intel_encoder_is_pch_edp(&has_edp_encoder->base)) {
3896 fp_reg = pch_fp_reg; 5030 I915_WRITE(PCH_FP0(pipe), fp);
3897 dpll_reg = pch_dpll_reg; 5031 I915_WRITE(PCH_DPLL(pipe), dpll & ~DPLL_VCO_ENABLE);
3898 }
3899 5032
3900 if (!has_edp_encoder) { 5033 POSTING_READ(PCH_DPLL(pipe));
3901 I915_WRITE(fp_reg, fp);
3902 I915_WRITE(dpll_reg, dpll & ~DPLL_VCO_ENABLE);
3903 I915_READ(dpll_reg);
3904 udelay(150); 5034 udelay(150);
3905 } 5035 }
3906 5036
3907 /* enable transcoder DPLL */ 5037 /* enable transcoder DPLL */
3908 if (HAS_PCH_CPT(dev)) { 5038 if (HAS_PCH_CPT(dev)) {
3909 temp = I915_READ(PCH_DPLL_SEL); 5039 temp = I915_READ(PCH_DPLL_SEL);
3910 if (trans_dpll_sel == 0) 5040 switch (pipe) {
3911 temp |= (TRANSA_DPLL_ENABLE | TRANSA_DPLLA_SEL); 5041 case 0:
3912 else 5042 temp |= TRANSA_DPLL_ENABLE | TRANSA_DPLLA_SEL;
3913 temp |= (TRANSB_DPLL_ENABLE | TRANSB_DPLLB_SEL); 5043 break;
5044 case 1:
5045 temp |= TRANSB_DPLL_ENABLE | TRANSB_DPLLB_SEL;
5046 break;
5047 case 2:
5048 /* FIXME: manage transcoder PLLs? */
5049 temp |= TRANSC_DPLL_ENABLE | TRANSC_DPLLB_SEL;
5050 break;
5051 default:
5052 BUG();
5053 }
3914 I915_WRITE(PCH_DPLL_SEL, temp); 5054 I915_WRITE(PCH_DPLL_SEL, temp);
3915 I915_READ(PCH_DPLL_SEL);
3916 udelay(150);
3917 }
3918 5055
3919 if (HAS_PCH_SPLIT(dev)) { 5056 POSTING_READ(PCH_DPLL_SEL);
3920 pipeconf &= ~PIPE_ENABLE_DITHER; 5057 udelay(150);
3921 pipeconf &= ~PIPE_DITHER_TYPE_MASK;
3922 } 5058 }
3923 5059
3924 /* The LVDS pin pair needs to be on before the DPLLs are enabled. 5060 /* The LVDS pin pair needs to be on before the DPLLs are enabled.
@@ -3926,105 +5062,96 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc,
3926 * things on. 5062 * things on.
3927 */ 5063 */
3928 if (is_lvds) { 5064 if (is_lvds) {
3929 u32 lvds; 5065 temp = I915_READ(PCH_LVDS);
3930 5066 temp |= LVDS_PORT_EN | LVDS_A0A2_CLKA_POWER_UP;
3931 if (HAS_PCH_SPLIT(dev))
3932 lvds_reg = PCH_LVDS;
3933
3934 lvds = I915_READ(lvds_reg);
3935 lvds |= LVDS_PORT_EN | LVDS_A0A2_CLKA_POWER_UP;
3936 if (pipe == 1) { 5067 if (pipe == 1) {
3937 if (HAS_PCH_CPT(dev)) 5068 if (HAS_PCH_CPT(dev))
3938 lvds |= PORT_TRANS_B_SEL_CPT; 5069 temp |= PORT_TRANS_B_SEL_CPT;
3939 else 5070 else
3940 lvds |= LVDS_PIPEB_SELECT; 5071 temp |= LVDS_PIPEB_SELECT;
3941 } else { 5072 } else {
3942 if (HAS_PCH_CPT(dev)) 5073 if (HAS_PCH_CPT(dev))
3943 lvds &= ~PORT_TRANS_SEL_MASK; 5074 temp &= ~PORT_TRANS_SEL_MASK;
3944 else 5075 else
3945 lvds &= ~LVDS_PIPEB_SELECT; 5076 temp &= ~LVDS_PIPEB_SELECT;
3946 } 5077 }
3947 /* set the corresponsding LVDS_BORDER bit */ 5078 /* set the corresponsding LVDS_BORDER bit */
3948 lvds |= dev_priv->lvds_border_bits; 5079 temp |= dev_priv->lvds_border_bits;
3949 /* Set the B0-B3 data pairs corresponding to whether we're going to 5080 /* Set the B0-B3 data pairs corresponding to whether we're going to
3950 * set the DPLLs for dual-channel mode or not. 5081 * set the DPLLs for dual-channel mode or not.
3951 */ 5082 */
3952 if (clock.p2 == 7) 5083 if (clock.p2 == 7)
3953 lvds |= LVDS_B0B3_POWER_UP | LVDS_CLKB_POWER_UP; 5084 temp |= LVDS_B0B3_POWER_UP | LVDS_CLKB_POWER_UP;
3954 else 5085 else
3955 lvds &= ~(LVDS_B0B3_POWER_UP | LVDS_CLKB_POWER_UP); 5086 temp &= ~(LVDS_B0B3_POWER_UP | LVDS_CLKB_POWER_UP);
3956 5087
3957 /* It would be nice to set 24 vs 18-bit mode (LVDS_A3_POWER_UP) 5088 /* It would be nice to set 24 vs 18-bit mode (LVDS_A3_POWER_UP)
3958 * appropriately here, but we need to look more thoroughly into how 5089 * appropriately here, but we need to look more thoroughly into how
3959 * panels behave in the two modes. 5090 * panels behave in the two modes.
3960 */ 5091 */
3961 /* set the dithering flag */ 5092 if (adjusted_mode->flags & DRM_MODE_FLAG_NHSYNC)
3962 if (IS_I965G(dev)) { 5093 lvds_sync |= LVDS_HSYNC_POLARITY;
3963 if (dev_priv->lvds_dither) { 5094 if (adjusted_mode->flags & DRM_MODE_FLAG_NVSYNC)
3964 if (HAS_PCH_SPLIT(dev)) { 5095 lvds_sync |= LVDS_VSYNC_POLARITY;
3965 pipeconf |= PIPE_ENABLE_DITHER; 5096 if ((temp & (LVDS_HSYNC_POLARITY | LVDS_VSYNC_POLARITY))
3966 pipeconf |= PIPE_DITHER_TYPE_ST01; 5097 != lvds_sync) {
3967 } else 5098 char flags[2] = "-+";
3968 lvds |= LVDS_ENABLE_DITHER; 5099 DRM_INFO("Changing LVDS panel from "
3969 } else { 5100 "(%chsync, %cvsync) to (%chsync, %cvsync)\n",
3970 if (!HAS_PCH_SPLIT(dev)) { 5101 flags[!(temp & LVDS_HSYNC_POLARITY)],
3971 lvds &= ~LVDS_ENABLE_DITHER; 5102 flags[!(temp & LVDS_VSYNC_POLARITY)],
3972 } 5103 flags[!(lvds_sync & LVDS_HSYNC_POLARITY)],
3973 } 5104 flags[!(lvds_sync & LVDS_VSYNC_POLARITY)]);
5105 temp &= ~(LVDS_HSYNC_POLARITY | LVDS_VSYNC_POLARITY);
5106 temp |= lvds_sync;
3974 } 5107 }
3975 I915_WRITE(lvds_reg, lvds); 5108 I915_WRITE(PCH_LVDS, temp);
3976 I915_READ(lvds_reg);
3977 } 5109 }
3978 if (is_dp) 5110
5111 /* set the dithering flag and clear for anything other than a panel. */
5112 pipeconf &= ~PIPECONF_DITHER_EN;
5113 pipeconf &= ~PIPECONF_DITHER_TYPE_MASK;
5114 if (dev_priv->lvds_dither && (is_lvds || has_edp_encoder)) {
5115 pipeconf |= PIPECONF_DITHER_EN;
5116 pipeconf |= PIPECONF_DITHER_TYPE_ST1;
5117 }
5118
5119 if (is_dp || intel_encoder_is_pch_edp(&has_edp_encoder->base)) {
3979 intel_dp_set_m_n(crtc, mode, adjusted_mode); 5120 intel_dp_set_m_n(crtc, mode, adjusted_mode);
3980 else if (HAS_PCH_SPLIT(dev)) { 5121 } else {
3981 /* For non-DP output, clear any trans DP clock recovery setting.*/ 5122 /* For non-DP output, clear any trans DP clock recovery setting.*/
3982 if (pipe == 0) { 5123 I915_WRITE(TRANSDATA_M1(pipe), 0);
3983 I915_WRITE(TRANSA_DATA_M1, 0); 5124 I915_WRITE(TRANSDATA_N1(pipe), 0);
3984 I915_WRITE(TRANSA_DATA_N1, 0); 5125 I915_WRITE(TRANSDPLINK_M1(pipe), 0);
3985 I915_WRITE(TRANSA_DP_LINK_M1, 0); 5126 I915_WRITE(TRANSDPLINK_N1(pipe), 0);
3986 I915_WRITE(TRANSA_DP_LINK_N1, 0);
3987 } else {
3988 I915_WRITE(TRANSB_DATA_M1, 0);
3989 I915_WRITE(TRANSB_DATA_N1, 0);
3990 I915_WRITE(TRANSB_DP_LINK_M1, 0);
3991 I915_WRITE(TRANSB_DP_LINK_N1, 0);
3992 }
3993 } 5127 }
3994 5128
3995 if (!has_edp_encoder) { 5129 if (!has_edp_encoder ||
3996 I915_WRITE(fp_reg, fp); 5130 intel_encoder_is_pch_edp(&has_edp_encoder->base)) {
3997 I915_WRITE(dpll_reg, dpll); 5131 I915_WRITE(PCH_DPLL(pipe), dpll);
3998 I915_READ(dpll_reg);
3999 /* Wait for the clocks to stabilize. */
4000 udelay(150);
4001 5132
4002 if (IS_I965G(dev) && !HAS_PCH_SPLIT(dev)) {
4003 if (is_sdvo) {
4004 sdvo_pixel_multiply = adjusted_mode->clock / mode->clock;
4005 I915_WRITE(dpll_md_reg, (0 << DPLL_MD_UDI_DIVIDER_SHIFT) |
4006 ((sdvo_pixel_multiply - 1) << DPLL_MD_UDI_MULTIPLIER_SHIFT));
4007 } else
4008 I915_WRITE(dpll_md_reg, 0);
4009 } else {
4010 /* write it again -- the BIOS does, after all */
4011 I915_WRITE(dpll_reg, dpll);
4012 }
4013 I915_READ(dpll_reg);
4014 /* Wait for the clocks to stabilize. */ 5133 /* Wait for the clocks to stabilize. */
5134 POSTING_READ(PCH_DPLL(pipe));
4015 udelay(150); 5135 udelay(150);
5136
5137 /* The pixel multiplier can only be updated once the
5138 * DPLL is enabled and the clocks are stable.
5139 *
5140 * So write it again.
5141 */
5142 I915_WRITE(PCH_DPLL(pipe), dpll);
4016 } 5143 }
4017 5144
5145 intel_crtc->lowfreq_avail = false;
4018 if (is_lvds && has_reduced_clock && i915_powersave) { 5146 if (is_lvds && has_reduced_clock && i915_powersave) {
4019 I915_WRITE(fp_reg + 4, fp2); 5147 I915_WRITE(PCH_FP1(pipe), fp2);
4020 intel_crtc->lowfreq_avail = true; 5148 intel_crtc->lowfreq_avail = true;
4021 if (HAS_PIPE_CXSR(dev)) { 5149 if (HAS_PIPE_CXSR(dev)) {
4022 DRM_DEBUG_KMS("enabling CxSR downclocking\n"); 5150 DRM_DEBUG_KMS("enabling CxSR downclocking\n");
4023 pipeconf |= PIPECONF_CXSR_DOWNCLOCK; 5151 pipeconf |= PIPECONF_CXSR_DOWNCLOCK;
4024 } 5152 }
4025 } else { 5153 } else {
4026 I915_WRITE(fp_reg + 4, fp); 5154 I915_WRITE(PCH_FP1(pipe), fp);
4027 intel_crtc->lowfreq_avail = false;
4028 if (HAS_PIPE_CXSR(dev)) { 5155 if (HAS_PIPE_CXSR(dev)) {
4029 DRM_DEBUG_KMS("disabling CxSR downclocking\n"); 5156 DRM_DEBUG_KMS("disabling CxSR downclocking\n");
4030 pipeconf &= ~PIPECONF_CXSR_DOWNCLOCK; 5157 pipeconf &= ~PIPECONF_CXSR_DOWNCLOCK;
@@ -4043,74 +5170,80 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc,
4043 } else 5170 } else
4044 pipeconf &= ~PIPECONF_INTERLACE_W_FIELD_INDICATION; /* progressive */ 5171 pipeconf &= ~PIPECONF_INTERLACE_W_FIELD_INDICATION; /* progressive */
4045 5172
4046 I915_WRITE(htot_reg, (adjusted_mode->crtc_hdisplay - 1) | 5173 I915_WRITE(HTOTAL(pipe),
5174 (adjusted_mode->crtc_hdisplay - 1) |
4047 ((adjusted_mode->crtc_htotal - 1) << 16)); 5175 ((adjusted_mode->crtc_htotal - 1) << 16));
4048 I915_WRITE(hblank_reg, (adjusted_mode->crtc_hblank_start - 1) | 5176 I915_WRITE(HBLANK(pipe),
5177 (adjusted_mode->crtc_hblank_start - 1) |
4049 ((adjusted_mode->crtc_hblank_end - 1) << 16)); 5178 ((adjusted_mode->crtc_hblank_end - 1) << 16));
4050 I915_WRITE(hsync_reg, (adjusted_mode->crtc_hsync_start - 1) | 5179 I915_WRITE(HSYNC(pipe),
5180 (adjusted_mode->crtc_hsync_start - 1) |
4051 ((adjusted_mode->crtc_hsync_end - 1) << 16)); 5181 ((adjusted_mode->crtc_hsync_end - 1) << 16));
4052 I915_WRITE(vtot_reg, (adjusted_mode->crtc_vdisplay - 1) | 5182
5183 I915_WRITE(VTOTAL(pipe),
5184 (adjusted_mode->crtc_vdisplay - 1) |
4053 ((adjusted_mode->crtc_vtotal - 1) << 16)); 5185 ((adjusted_mode->crtc_vtotal - 1) << 16));
4054 I915_WRITE(vblank_reg, (adjusted_mode->crtc_vblank_start - 1) | 5186 I915_WRITE(VBLANK(pipe),
5187 (adjusted_mode->crtc_vblank_start - 1) |
4055 ((adjusted_mode->crtc_vblank_end - 1) << 16)); 5188 ((adjusted_mode->crtc_vblank_end - 1) << 16));
4056 I915_WRITE(vsync_reg, (adjusted_mode->crtc_vsync_start - 1) | 5189 I915_WRITE(VSYNC(pipe),
5190 (adjusted_mode->crtc_vsync_start - 1) |
4057 ((adjusted_mode->crtc_vsync_end - 1) << 16)); 5191 ((adjusted_mode->crtc_vsync_end - 1) << 16));
4058 /* pipesrc and dspsize control the size that is scaled from, which should 5192
5193 /* pipesrc controls the size that is scaled from, which should
4059 * always be the user's requested size. 5194 * always be the user's requested size.
4060 */ 5195 */
4061 if (!HAS_PCH_SPLIT(dev)) { 5196 I915_WRITE(PIPESRC(pipe),
4062 I915_WRITE(dspsize_reg, ((mode->vdisplay - 1) << 16) | 5197 ((mode->hdisplay - 1) << 16) | (mode->vdisplay - 1));
4063 (mode->hdisplay - 1));
4064 I915_WRITE(dsppos_reg, 0);
4065 }
4066 I915_WRITE(pipesrc_reg, ((mode->hdisplay - 1) << 16) | (mode->vdisplay - 1));
4067
4068 if (HAS_PCH_SPLIT(dev)) {
4069 I915_WRITE(data_m1_reg, TU_SIZE(m_n.tu) | m_n.gmch_m);
4070 I915_WRITE(data_n1_reg, TU_SIZE(m_n.tu) | m_n.gmch_n);
4071 I915_WRITE(link_m1_reg, m_n.link_m);
4072 I915_WRITE(link_n1_reg, m_n.link_n);
4073
4074 if (has_edp_encoder) {
4075 ironlake_set_pll_edp(crtc, adjusted_mode->clock);
4076 } else {
4077 /* enable FDI RX PLL too */
4078 temp = I915_READ(fdi_rx_reg);
4079 I915_WRITE(fdi_rx_reg, temp | FDI_RX_PLL_ENABLE);
4080 I915_READ(fdi_rx_reg);
4081 udelay(200);
4082 5198
4083 /* enable FDI TX PLL too */ 5199 I915_WRITE(PIPE_DATA_M1(pipe), TU_SIZE(m_n.tu) | m_n.gmch_m);
4084 temp = I915_READ(fdi_tx_reg); 5200 I915_WRITE(PIPE_DATA_N1(pipe), m_n.gmch_n);
4085 I915_WRITE(fdi_tx_reg, temp | FDI_TX_PLL_ENABLE); 5201 I915_WRITE(PIPE_LINK_M1(pipe), m_n.link_m);
4086 I915_READ(fdi_tx_reg); 5202 I915_WRITE(PIPE_LINK_N1(pipe), m_n.link_n);
4087 5203
4088 /* enable FDI RX PCDCLK */ 5204 if (has_edp_encoder &&
4089 temp = I915_READ(fdi_rx_reg); 5205 !intel_encoder_is_pch_edp(&has_edp_encoder->base)) {
4090 I915_WRITE(fdi_rx_reg, temp | FDI_SEL_PCDCLK); 5206 ironlake_set_pll_edp(crtc, adjusted_mode->clock);
4091 I915_READ(fdi_rx_reg);
4092 udelay(200);
4093 }
4094 } 5207 }
4095 5208
4096 I915_WRITE(pipeconf_reg, pipeconf); 5209 I915_WRITE(PIPECONF(pipe), pipeconf);
4097 I915_READ(pipeconf_reg); 5210 POSTING_READ(PIPECONF(pipe));
4098 5211
4099 intel_wait_for_vblank(dev, pipe); 5212 intel_wait_for_vblank(dev, pipe);
4100 5213
4101 if (IS_IRONLAKE(dev)) { 5214 if (IS_GEN5(dev)) {
4102 /* enable address swizzle for tiling buffer */ 5215 /* enable address swizzle for tiling buffer */
4103 temp = I915_READ(DISP_ARB_CTL); 5216 temp = I915_READ(DISP_ARB_CTL);
4104 I915_WRITE(DISP_ARB_CTL, temp | DISP_TILE_SURFACE_SWIZZLING); 5217 I915_WRITE(DISP_ARB_CTL, temp | DISP_TILE_SURFACE_SWIZZLING);
4105 } 5218 }
4106 5219
4107 I915_WRITE(dspcntr_reg, dspcntr); 5220 I915_WRITE(DSPCNTR(plane), dspcntr);
5221 POSTING_READ(DSPCNTR(plane));
4108 5222
4109 /* Flush the plane changes */
4110 ret = intel_pipe_set_base(crtc, x, y, old_fb); 5223 ret = intel_pipe_set_base(crtc, x, y, old_fb);
4111 5224
4112 intel_update_watermarks(dev); 5225 intel_update_watermarks(dev);
4113 5226
5227 return ret;
5228}
5229
5230static int intel_crtc_mode_set(struct drm_crtc *crtc,
5231 struct drm_display_mode *mode,
5232 struct drm_display_mode *adjusted_mode,
5233 int x, int y,
5234 struct drm_framebuffer *old_fb)
5235{
5236 struct drm_device *dev = crtc->dev;
5237 struct drm_i915_private *dev_priv = dev->dev_private;
5238 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
5239 int pipe = intel_crtc->pipe;
5240 int ret;
5241
5242 drm_vblank_pre_modeset(dev, pipe);
5243
5244 ret = dev_priv->display.crtc_mode_set(crtc, mode, adjusted_mode,
5245 x, y, old_fb);
5246
4114 drm_vblank_post_modeset(dev, pipe); 5247 drm_vblank_post_modeset(dev, pipe);
4115 5248
4116 return ret; 5249 return ret;
@@ -4122,7 +5255,7 @@ void intel_crtc_load_lut(struct drm_crtc *crtc)
4122 struct drm_device *dev = crtc->dev; 5255 struct drm_device *dev = crtc->dev;
4123 struct drm_i915_private *dev_priv = dev->dev_private; 5256 struct drm_i915_private *dev_priv = dev->dev_private;
4124 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 5257 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
4125 int palreg = (intel_crtc->pipe == 0) ? PALETTE_A : PALETTE_B; 5258 int palreg = PALETTE(intel_crtc->pipe);
4126 int i; 5259 int i;
4127 5260
4128 /* The clocks have to be on to load the palette. */ 5261 /* The clocks have to be on to load the palette. */
@@ -4131,8 +5264,7 @@ void intel_crtc_load_lut(struct drm_crtc *crtc)
4131 5264
4132 /* use legacy palette for Ironlake */ 5265 /* use legacy palette for Ironlake */
4133 if (HAS_PCH_SPLIT(dev)) 5266 if (HAS_PCH_SPLIT(dev))
4134 palreg = (intel_crtc->pipe == 0) ? LGC_PALETTE_A : 5267 palreg = LGC_PALETTE(intel_crtc->pipe);
4135 LGC_PALETTE_B;
4136 5268
4137 for (i = 0; i < 256; i++) { 5269 for (i = 0; i < 256; i++) {
4138 I915_WRITE(palreg + 4 * i, 5270 I915_WRITE(palreg + 4 * i,
@@ -4153,12 +5285,12 @@ static void i845_update_cursor(struct drm_crtc *crtc, u32 base)
4153 if (intel_crtc->cursor_visible == visible) 5285 if (intel_crtc->cursor_visible == visible)
4154 return; 5286 return;
4155 5287
4156 cntl = I915_READ(CURACNTR); 5288 cntl = I915_READ(_CURACNTR);
4157 if (visible) { 5289 if (visible) {
4158 /* On these chipsets we can only modify the base whilst 5290 /* On these chipsets we can only modify the base whilst
4159 * the cursor is disabled. 5291 * the cursor is disabled.
4160 */ 5292 */
4161 I915_WRITE(CURABASE, base); 5293 I915_WRITE(_CURABASE, base);
4162 5294
4163 cntl &= ~(CURSOR_FORMAT_MASK); 5295 cntl &= ~(CURSOR_FORMAT_MASK);
4164 /* XXX width must be 64, stride 256 => 0x00 << 28 */ 5296 /* XXX width must be 64, stride 256 => 0x00 << 28 */
@@ -4167,7 +5299,7 @@ static void i845_update_cursor(struct drm_crtc *crtc, u32 base)
4167 CURSOR_FORMAT_ARGB; 5299 CURSOR_FORMAT_ARGB;
4168 } else 5300 } else
4169 cntl &= ~(CURSOR_ENABLE | CURSOR_GAMMA_ENABLE); 5301 cntl &= ~(CURSOR_ENABLE | CURSOR_GAMMA_ENABLE);
4170 I915_WRITE(CURACNTR, cntl); 5302 I915_WRITE(_CURACNTR, cntl);
4171 5303
4172 intel_crtc->cursor_visible = visible; 5304 intel_crtc->cursor_visible = visible;
4173} 5305}
@@ -4181,7 +5313,7 @@ static void i9xx_update_cursor(struct drm_crtc *crtc, u32 base)
4181 bool visible = base != 0; 5313 bool visible = base != 0;
4182 5314
4183 if (intel_crtc->cursor_visible != visible) { 5315 if (intel_crtc->cursor_visible != visible) {
4184 uint32_t cntl = I915_READ(pipe == 0 ? CURACNTR : CURBCNTR); 5316 uint32_t cntl = I915_READ(CURCNTR(pipe));
4185 if (base) { 5317 if (base) {
4186 cntl &= ~(CURSOR_MODE | MCURSOR_PIPE_SELECT); 5318 cntl &= ~(CURSOR_MODE | MCURSOR_PIPE_SELECT);
4187 cntl |= CURSOR_MODE_64_ARGB_AX | MCURSOR_GAMMA_ENABLE; 5319 cntl |= CURSOR_MODE_64_ARGB_AX | MCURSOR_GAMMA_ENABLE;
@@ -4190,16 +5322,17 @@ static void i9xx_update_cursor(struct drm_crtc *crtc, u32 base)
4190 cntl &= ~(CURSOR_MODE | MCURSOR_GAMMA_ENABLE); 5322 cntl &= ~(CURSOR_MODE | MCURSOR_GAMMA_ENABLE);
4191 cntl |= CURSOR_MODE_DISABLE; 5323 cntl |= CURSOR_MODE_DISABLE;
4192 } 5324 }
4193 I915_WRITE(pipe == 0 ? CURACNTR : CURBCNTR, cntl); 5325 I915_WRITE(CURCNTR(pipe), cntl);
4194 5326
4195 intel_crtc->cursor_visible = visible; 5327 intel_crtc->cursor_visible = visible;
4196 } 5328 }
4197 /* and commit changes on next vblank */ 5329 /* and commit changes on next vblank */
4198 I915_WRITE(pipe == 0 ? CURABASE : CURBBASE, base); 5330 I915_WRITE(CURBASE(pipe), base);
4199} 5331}
4200 5332
4201/* If no-part of the cursor is visible on the framebuffer, then the GPU may hang... */ 5333/* If no-part of the cursor is visible on the framebuffer, then the GPU may hang... */
4202static void intel_crtc_update_cursor(struct drm_crtc *crtc) 5334static void intel_crtc_update_cursor(struct drm_crtc *crtc,
5335 bool on)
4203{ 5336{
4204 struct drm_device *dev = crtc->dev; 5337 struct drm_device *dev = crtc->dev;
4205 struct drm_i915_private *dev_priv = dev->dev_private; 5338 struct drm_i915_private *dev_priv = dev->dev_private;
@@ -4212,7 +5345,7 @@ static void intel_crtc_update_cursor(struct drm_crtc *crtc)
4212 5345
4213 pos = 0; 5346 pos = 0;
4214 5347
4215 if (intel_crtc->cursor_on && crtc->fb) { 5348 if (on && crtc->enabled && crtc->fb) {
4216 base = intel_crtc->cursor_addr; 5349 base = intel_crtc->cursor_addr;
4217 if (x > (int) crtc->fb->width) 5350 if (x > (int) crtc->fb->width)
4218 base = 0; 5351 base = 0;
@@ -4244,7 +5377,7 @@ static void intel_crtc_update_cursor(struct drm_crtc *crtc)
4244 if (!visible && !intel_crtc->cursor_visible) 5377 if (!visible && !intel_crtc->cursor_visible)
4245 return; 5378 return;
4246 5379
4247 I915_WRITE(pipe == 0 ? CURAPOS : CURBPOS, pos); 5380 I915_WRITE(CURPOS(pipe), pos);
4248 if (IS_845G(dev) || IS_I865G(dev)) 5381 if (IS_845G(dev) || IS_I865G(dev))
4249 i845_update_cursor(crtc, base); 5382 i845_update_cursor(crtc, base);
4250 else 5383 else
@@ -4255,15 +5388,14 @@ static void intel_crtc_update_cursor(struct drm_crtc *crtc)
4255} 5388}
4256 5389
4257static int intel_crtc_cursor_set(struct drm_crtc *crtc, 5390static int intel_crtc_cursor_set(struct drm_crtc *crtc,
4258 struct drm_file *file_priv, 5391 struct drm_file *file,
4259 uint32_t handle, 5392 uint32_t handle,
4260 uint32_t width, uint32_t height) 5393 uint32_t width, uint32_t height)
4261{ 5394{
4262 struct drm_device *dev = crtc->dev; 5395 struct drm_device *dev = crtc->dev;
4263 struct drm_i915_private *dev_priv = dev->dev_private; 5396 struct drm_i915_private *dev_priv = dev->dev_private;
4264 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 5397 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
4265 struct drm_gem_object *bo; 5398 struct drm_i915_gem_object *obj;
4266 struct drm_i915_gem_object *obj_priv;
4267 uint32_t addr; 5399 uint32_t addr;
4268 int ret; 5400 int ret;
4269 5401
@@ -4273,7 +5405,7 @@ static int intel_crtc_cursor_set(struct drm_crtc *crtc,
4273 if (!handle) { 5405 if (!handle) {
4274 DRM_DEBUG_KMS("cursor off\n"); 5406 DRM_DEBUG_KMS("cursor off\n");
4275 addr = 0; 5407 addr = 0;
4276 bo = NULL; 5408 obj = NULL;
4277 mutex_lock(&dev->struct_mutex); 5409 mutex_lock(&dev->struct_mutex);
4278 goto finish; 5410 goto finish;
4279 } 5411 }
@@ -4284,13 +5416,11 @@ static int intel_crtc_cursor_set(struct drm_crtc *crtc,
4284 return -EINVAL; 5416 return -EINVAL;
4285 } 5417 }
4286 5418
4287 bo = drm_gem_object_lookup(dev, file_priv, handle); 5419 obj = to_intel_bo(drm_gem_object_lookup(dev, file, handle));
4288 if (!bo) 5420 if (&obj->base == NULL)
4289 return -ENOENT; 5421 return -ENOENT;
4290 5422
4291 obj_priv = to_intel_bo(bo); 5423 if (obj->base.size < width * height * 4) {
4292
4293 if (bo->size < width * height * 4) {
4294 DRM_ERROR("buffer is to small\n"); 5424 DRM_ERROR("buffer is to small\n");
4295 ret = -ENOMEM; 5425 ret = -ENOMEM;
4296 goto fail; 5426 goto fail;
@@ -4299,60 +5429,72 @@ static int intel_crtc_cursor_set(struct drm_crtc *crtc,
4299 /* we only need to pin inside GTT if cursor is non-phy */ 5429 /* we only need to pin inside GTT if cursor is non-phy */
4300 mutex_lock(&dev->struct_mutex); 5430 mutex_lock(&dev->struct_mutex);
4301 if (!dev_priv->info->cursor_needs_physical) { 5431 if (!dev_priv->info->cursor_needs_physical) {
4302 ret = i915_gem_object_pin(bo, PAGE_SIZE); 5432 if (obj->tiling_mode) {
5433 DRM_ERROR("cursor cannot be tiled\n");
5434 ret = -EINVAL;
5435 goto fail_locked;
5436 }
5437
5438 ret = i915_gem_object_pin(obj, PAGE_SIZE, true);
4303 if (ret) { 5439 if (ret) {
4304 DRM_ERROR("failed to pin cursor bo\n"); 5440 DRM_ERROR("failed to pin cursor bo\n");
4305 goto fail_locked; 5441 goto fail_locked;
4306 } 5442 }
4307 5443
4308 ret = i915_gem_object_set_to_gtt_domain(bo, 0); 5444 ret = i915_gem_object_set_to_gtt_domain(obj, 0);
5445 if (ret) {
5446 DRM_ERROR("failed to move cursor bo into the GTT\n");
5447 goto fail_unpin;
5448 }
5449
5450 ret = i915_gem_object_put_fence(obj);
4309 if (ret) { 5451 if (ret) {
4310 DRM_ERROR("failed to move cursor bo into the GTT\n"); 5452 DRM_ERROR("failed to move cursor bo into the GTT\n");
4311 goto fail_unpin; 5453 goto fail_unpin;
4312 } 5454 }
4313 5455
4314 addr = obj_priv->gtt_offset; 5456 addr = obj->gtt_offset;
4315 } else { 5457 } else {
4316 int align = IS_I830(dev) ? 16 * 1024 : 256; 5458 int align = IS_I830(dev) ? 16 * 1024 : 256;
4317 ret = i915_gem_attach_phys_object(dev, bo, 5459 ret = i915_gem_attach_phys_object(dev, obj,
4318 (intel_crtc->pipe == 0) ? I915_GEM_PHYS_CURSOR_0 : I915_GEM_PHYS_CURSOR_1, 5460 (intel_crtc->pipe == 0) ? I915_GEM_PHYS_CURSOR_0 : I915_GEM_PHYS_CURSOR_1,
4319 align); 5461 align);
4320 if (ret) { 5462 if (ret) {
4321 DRM_ERROR("failed to attach phys object\n"); 5463 DRM_ERROR("failed to attach phys object\n");
4322 goto fail_locked; 5464 goto fail_locked;
4323 } 5465 }
4324 addr = obj_priv->phys_obj->handle->busaddr; 5466 addr = obj->phys_obj->handle->busaddr;
4325 } 5467 }
4326 5468
4327 if (!IS_I9XX(dev)) 5469 if (IS_GEN2(dev))
4328 I915_WRITE(CURSIZE, (height << 12) | width); 5470 I915_WRITE(CURSIZE, (height << 12) | width);
4329 5471
4330 finish: 5472 finish:
4331 if (intel_crtc->cursor_bo) { 5473 if (intel_crtc->cursor_bo) {
4332 if (dev_priv->info->cursor_needs_physical) { 5474 if (dev_priv->info->cursor_needs_physical) {
4333 if (intel_crtc->cursor_bo != bo) 5475 if (intel_crtc->cursor_bo != obj)
4334 i915_gem_detach_phys_object(dev, intel_crtc->cursor_bo); 5476 i915_gem_detach_phys_object(dev, intel_crtc->cursor_bo);
4335 } else 5477 } else
4336 i915_gem_object_unpin(intel_crtc->cursor_bo); 5478 i915_gem_object_unpin(intel_crtc->cursor_bo);
4337 drm_gem_object_unreference(intel_crtc->cursor_bo); 5479 drm_gem_object_unreference(&intel_crtc->cursor_bo->base);
4338 } 5480 }
4339 5481
4340 mutex_unlock(&dev->struct_mutex); 5482 mutex_unlock(&dev->struct_mutex);
4341 5483
4342 intel_crtc->cursor_addr = addr; 5484 intel_crtc->cursor_addr = addr;
4343 intel_crtc->cursor_bo = bo; 5485 intel_crtc->cursor_bo = obj;
4344 intel_crtc->cursor_width = width; 5486 intel_crtc->cursor_width = width;
4345 intel_crtc->cursor_height = height; 5487 intel_crtc->cursor_height = height;
4346 5488
4347 intel_crtc_update_cursor(crtc); 5489 intel_crtc_update_cursor(crtc, true);
4348 5490
4349 return 0; 5491 return 0;
4350fail_unpin: 5492fail_unpin:
4351 i915_gem_object_unpin(bo); 5493 i915_gem_object_unpin(obj);
4352fail_locked: 5494fail_locked:
4353 mutex_unlock(&dev->struct_mutex); 5495 mutex_unlock(&dev->struct_mutex);
4354fail: 5496fail:
4355 drm_gem_object_unreference_unlocked(bo); 5497 drm_gem_object_unreference_unlocked(&obj->base);
4356 return ret; 5498 return ret;
4357} 5499}
4358 5500
@@ -4363,7 +5505,7 @@ static int intel_crtc_cursor_move(struct drm_crtc *crtc, int x, int y)
4363 intel_crtc->cursor_x = x; 5505 intel_crtc->cursor_x = x;
4364 intel_crtc->cursor_y = y; 5506 intel_crtc->cursor_y = y;
4365 5507
4366 intel_crtc_update_cursor(crtc); 5508 intel_crtc_update_cursor(crtc, true);
4367 5509
4368 return 0; 5510 return 0;
4369} 5511}
@@ -4424,43 +5566,140 @@ static struct drm_display_mode load_detect_mode = {
4424 704, 832, 0, 480, 489, 491, 520, 0, DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC), 5566 704, 832, 0, 480, 489, 491, 520, 0, DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC),
4425}; 5567};
4426 5568
4427struct drm_crtc *intel_get_load_detect_pipe(struct intel_encoder *intel_encoder, 5569static struct drm_framebuffer *
4428 struct drm_connector *connector, 5570intel_framebuffer_create(struct drm_device *dev,
4429 struct drm_display_mode *mode, 5571 struct drm_mode_fb_cmd *mode_cmd,
4430 int *dpms_mode) 5572 struct drm_i915_gem_object *obj)
5573{
5574 struct intel_framebuffer *intel_fb;
5575 int ret;
5576
5577 intel_fb = kzalloc(sizeof(*intel_fb), GFP_KERNEL);
5578 if (!intel_fb) {
5579 drm_gem_object_unreference_unlocked(&obj->base);
5580 return ERR_PTR(-ENOMEM);
5581 }
5582
5583 ret = intel_framebuffer_init(dev, intel_fb, mode_cmd, obj);
5584 if (ret) {
5585 drm_gem_object_unreference_unlocked(&obj->base);
5586 kfree(intel_fb);
5587 return ERR_PTR(ret);
5588 }
5589
5590 return &intel_fb->base;
5591}
5592
5593static u32
5594intel_framebuffer_pitch_for_width(int width, int bpp)
5595{
5596 u32 pitch = DIV_ROUND_UP(width * bpp, 8);
5597 return ALIGN(pitch, 64);
5598}
5599
5600static u32
5601intel_framebuffer_size_for_mode(struct drm_display_mode *mode, int bpp)
5602{
5603 u32 pitch = intel_framebuffer_pitch_for_width(mode->hdisplay, bpp);
5604 return ALIGN(pitch * mode->vdisplay, PAGE_SIZE);
5605}
5606
5607static struct drm_framebuffer *
5608intel_framebuffer_create_for_mode(struct drm_device *dev,
5609 struct drm_display_mode *mode,
5610 int depth, int bpp)
5611{
5612 struct drm_i915_gem_object *obj;
5613 struct drm_mode_fb_cmd mode_cmd;
5614
5615 obj = i915_gem_alloc_object(dev,
5616 intel_framebuffer_size_for_mode(mode, bpp));
5617 if (obj == NULL)
5618 return ERR_PTR(-ENOMEM);
5619
5620 mode_cmd.width = mode->hdisplay;
5621 mode_cmd.height = mode->vdisplay;
5622 mode_cmd.depth = depth;
5623 mode_cmd.bpp = bpp;
5624 mode_cmd.pitch = intel_framebuffer_pitch_for_width(mode_cmd.width, bpp);
5625
5626 return intel_framebuffer_create(dev, &mode_cmd, obj);
5627}
5628
5629static struct drm_framebuffer *
5630mode_fits_in_fbdev(struct drm_device *dev,
5631 struct drm_display_mode *mode)
5632{
5633 struct drm_i915_private *dev_priv = dev->dev_private;
5634 struct drm_i915_gem_object *obj;
5635 struct drm_framebuffer *fb;
5636
5637 if (dev_priv->fbdev == NULL)
5638 return NULL;
5639
5640 obj = dev_priv->fbdev->ifb.obj;
5641 if (obj == NULL)
5642 return NULL;
5643
5644 fb = &dev_priv->fbdev->ifb.base;
5645 if (fb->pitch < intel_framebuffer_pitch_for_width(mode->hdisplay,
5646 fb->bits_per_pixel))
5647 return NULL;
5648
5649 if (obj->base.size < mode->vdisplay * fb->pitch)
5650 return NULL;
5651
5652 return fb;
5653}
5654
5655bool intel_get_load_detect_pipe(struct intel_encoder *intel_encoder,
5656 struct drm_connector *connector,
5657 struct drm_display_mode *mode,
5658 struct intel_load_detect_pipe *old)
4431{ 5659{
4432 struct intel_crtc *intel_crtc; 5660 struct intel_crtc *intel_crtc;
4433 struct drm_crtc *possible_crtc; 5661 struct drm_crtc *possible_crtc;
4434 struct drm_crtc *supported_crtc =NULL; 5662 struct drm_encoder *encoder = &intel_encoder->base;
4435 struct drm_encoder *encoder = &intel_encoder->enc;
4436 struct drm_crtc *crtc = NULL; 5663 struct drm_crtc *crtc = NULL;
4437 struct drm_device *dev = encoder->dev; 5664 struct drm_device *dev = encoder->dev;
4438 struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private; 5665 struct drm_framebuffer *old_fb;
4439 struct drm_crtc_helper_funcs *crtc_funcs;
4440 int i = -1; 5666 int i = -1;
4441 5667
5668 DRM_DEBUG_KMS("[CONNECTOR:%d:%s], [ENCODER:%d:%s]\n",
5669 connector->base.id, drm_get_connector_name(connector),
5670 encoder->base.id, drm_get_encoder_name(encoder));
5671
4442 /* 5672 /*
4443 * Algorithm gets a little messy: 5673 * Algorithm gets a little messy:
5674 *
4444 * - if the connector already has an assigned crtc, use it (but make 5675 * - if the connector already has an assigned crtc, use it (but make
4445 * sure it's on first) 5676 * sure it's on first)
5677 *
4446 * - try to find the first unused crtc that can drive this connector, 5678 * - try to find the first unused crtc that can drive this connector,
4447 * and use that if we find one 5679 * and use that if we find one
4448 * - if there are no unused crtcs available, try to use the first
4449 * one we found that supports the connector
4450 */ 5680 */
4451 5681
4452 /* See if we already have a CRTC for this connector */ 5682 /* See if we already have a CRTC for this connector */
4453 if (encoder->crtc) { 5683 if (encoder->crtc) {
4454 crtc = encoder->crtc; 5684 crtc = encoder->crtc;
4455 /* Make sure the crtc and connector are running */ 5685
4456 intel_crtc = to_intel_crtc(crtc); 5686 intel_crtc = to_intel_crtc(crtc);
4457 *dpms_mode = intel_crtc->dpms_mode; 5687 old->dpms_mode = intel_crtc->dpms_mode;
5688 old->load_detect_temp = false;
5689
5690 /* Make sure the crtc and connector are running */
4458 if (intel_crtc->dpms_mode != DRM_MODE_DPMS_ON) { 5691 if (intel_crtc->dpms_mode != DRM_MODE_DPMS_ON) {
5692 struct drm_encoder_helper_funcs *encoder_funcs;
5693 struct drm_crtc_helper_funcs *crtc_funcs;
5694
4459 crtc_funcs = crtc->helper_private; 5695 crtc_funcs = crtc->helper_private;
4460 crtc_funcs->dpms(crtc, DRM_MODE_DPMS_ON); 5696 crtc_funcs->dpms(crtc, DRM_MODE_DPMS_ON);
5697
5698 encoder_funcs = encoder->helper_private;
4461 encoder_funcs->dpms(encoder, DRM_MODE_DPMS_ON); 5699 encoder_funcs->dpms(encoder, DRM_MODE_DPMS_ON);
4462 } 5700 }
4463 return crtc; 5701
5702 return true;
4464 } 5703 }
4465 5704
4466 /* Find an unused one (if possible) */ 5705 /* Find an unused one (if possible) */
@@ -4472,66 +5711,91 @@ struct drm_crtc *intel_get_load_detect_pipe(struct intel_encoder *intel_encoder,
4472 crtc = possible_crtc; 5711 crtc = possible_crtc;
4473 break; 5712 break;
4474 } 5713 }
4475 if (!supported_crtc)
4476 supported_crtc = possible_crtc;
4477 } 5714 }
4478 5715
4479 /* 5716 /*
4480 * If we didn't find an unused CRTC, don't use any. 5717 * If we didn't find an unused CRTC, don't use any.
4481 */ 5718 */
4482 if (!crtc) { 5719 if (!crtc) {
4483 return NULL; 5720 DRM_DEBUG_KMS("no pipe available for load-detect\n");
5721 return false;
4484 } 5722 }
4485 5723
4486 encoder->crtc = crtc; 5724 encoder->crtc = crtc;
4487 connector->encoder = encoder; 5725 connector->encoder = encoder;
4488 intel_encoder->load_detect_temp = true;
4489 5726
4490 intel_crtc = to_intel_crtc(crtc); 5727 intel_crtc = to_intel_crtc(crtc);
4491 *dpms_mode = intel_crtc->dpms_mode; 5728 old->dpms_mode = intel_crtc->dpms_mode;
5729 old->load_detect_temp = true;
5730 old->release_fb = NULL;
4492 5731
4493 if (!crtc->enabled) { 5732 if (!mode)
4494 if (!mode) 5733 mode = &load_detect_mode;
4495 mode = &load_detect_mode; 5734
4496 drm_crtc_helper_set_mode(crtc, mode, 0, 0, crtc->fb); 5735 old_fb = crtc->fb;
4497 } else {
4498 if (intel_crtc->dpms_mode != DRM_MODE_DPMS_ON) {
4499 crtc_funcs = crtc->helper_private;
4500 crtc_funcs->dpms(crtc, DRM_MODE_DPMS_ON);
4501 }
4502 5736
4503 /* Add this connector to the crtc */ 5737 /* We need a framebuffer large enough to accommodate all accesses
4504 encoder_funcs->mode_set(encoder, &crtc->mode, &crtc->mode); 5738 * that the plane may generate whilst we perform load detection.
4505 encoder_funcs->commit(encoder); 5739 * We can not rely on the fbcon either being present (we get called
5740 * during its initialisation to detect all boot displays, or it may
5741 * not even exist) or that it is large enough to satisfy the
5742 * requested mode.
5743 */
5744 crtc->fb = mode_fits_in_fbdev(dev, mode);
5745 if (crtc->fb == NULL) {
5746 DRM_DEBUG_KMS("creating tmp fb for load-detection\n");
5747 crtc->fb = intel_framebuffer_create_for_mode(dev, mode, 24, 32);
5748 old->release_fb = crtc->fb;
5749 } else
5750 DRM_DEBUG_KMS("reusing fbdev for load-detection framebuffer\n");
5751 if (IS_ERR(crtc->fb)) {
5752 DRM_DEBUG_KMS("failed to allocate framebuffer for load-detection\n");
5753 crtc->fb = old_fb;
5754 return false;
4506 } 5755 }
5756
5757 if (!drm_crtc_helper_set_mode(crtc, mode, 0, 0, old_fb)) {
5758 DRM_DEBUG_KMS("failed to set mode on load-detect pipe\n");
5759 if (old->release_fb)
5760 old->release_fb->funcs->destroy(old->release_fb);
5761 crtc->fb = old_fb;
5762 return false;
5763 }
5764
4507 /* let the connector get through one full cycle before testing */ 5765 /* let the connector get through one full cycle before testing */
4508 intel_wait_for_vblank(dev, intel_crtc->pipe); 5766 intel_wait_for_vblank(dev, intel_crtc->pipe);
4509 5767
4510 return crtc; 5768 return true;
4511} 5769}
4512 5770
4513void intel_release_load_detect_pipe(struct intel_encoder *intel_encoder, 5771void intel_release_load_detect_pipe(struct intel_encoder *intel_encoder,
4514 struct drm_connector *connector, int dpms_mode) 5772 struct drm_connector *connector,
5773 struct intel_load_detect_pipe *old)
4515{ 5774{
4516 struct drm_encoder *encoder = &intel_encoder->enc; 5775 struct drm_encoder *encoder = &intel_encoder->base;
4517 struct drm_device *dev = encoder->dev; 5776 struct drm_device *dev = encoder->dev;
4518 struct drm_crtc *crtc = encoder->crtc; 5777 struct drm_crtc *crtc = encoder->crtc;
4519 struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private; 5778 struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private;
4520 struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; 5779 struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private;
4521 5780
4522 if (intel_encoder->load_detect_temp) { 5781 DRM_DEBUG_KMS("[CONNECTOR:%d:%s], [ENCODER:%d:%s]\n",
4523 encoder->crtc = NULL; 5782 connector->base.id, drm_get_connector_name(connector),
5783 encoder->base.id, drm_get_encoder_name(encoder));
5784
5785 if (old->load_detect_temp) {
4524 connector->encoder = NULL; 5786 connector->encoder = NULL;
4525 intel_encoder->load_detect_temp = false;
4526 crtc->enabled = drm_helper_crtc_in_use(crtc);
4527 drm_helper_disable_unused_functions(dev); 5787 drm_helper_disable_unused_functions(dev);
5788
5789 if (old->release_fb)
5790 old->release_fb->funcs->destroy(old->release_fb);
5791
5792 return;
4528 } 5793 }
4529 5794
4530 /* Switch crtc and encoder back off if necessary */ 5795 /* Switch crtc and encoder back off if necessary */
4531 if (crtc->enabled && dpms_mode != DRM_MODE_DPMS_ON) { 5796 if (old->dpms_mode != DRM_MODE_DPMS_ON) {
4532 if (encoder->crtc == crtc) 5797 encoder_funcs->dpms(encoder, old->dpms_mode);
4533 encoder_funcs->dpms(encoder, dpms_mode); 5798 crtc_funcs->dpms(crtc, old->dpms_mode);
4534 crtc_funcs->dpms(crtc, dpms_mode);
4535 } 5799 }
4536} 5800}
4537 5801
@@ -4541,14 +5805,14 @@ static int intel_crtc_clock_get(struct drm_device *dev, struct drm_crtc *crtc)
4541 struct drm_i915_private *dev_priv = dev->dev_private; 5805 struct drm_i915_private *dev_priv = dev->dev_private;
4542 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 5806 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
4543 int pipe = intel_crtc->pipe; 5807 int pipe = intel_crtc->pipe;
4544 u32 dpll = I915_READ((pipe == 0) ? DPLL_A : DPLL_B); 5808 u32 dpll = I915_READ(DPLL(pipe));
4545 u32 fp; 5809 u32 fp;
4546 intel_clock_t clock; 5810 intel_clock_t clock;
4547 5811
4548 if ((dpll & DISPLAY_RATE_SELECT_FPA1) == 0) 5812 if ((dpll & DISPLAY_RATE_SELECT_FPA1) == 0)
4549 fp = I915_READ((pipe == 0) ? FPA0 : FPB0); 5813 fp = I915_READ(FP0(pipe));
4550 else 5814 else
4551 fp = I915_READ((pipe == 0) ? FPA1 : FPB1); 5815 fp = I915_READ(FP1(pipe));
4552 5816
4553 clock.m1 = (fp & FP_M1_DIV_MASK) >> FP_M1_DIV_SHIFT; 5817 clock.m1 = (fp & FP_M1_DIV_MASK) >> FP_M1_DIV_SHIFT;
4554 if (IS_PINEVIEW(dev)) { 5818 if (IS_PINEVIEW(dev)) {
@@ -4559,7 +5823,7 @@ static int intel_crtc_clock_get(struct drm_device *dev, struct drm_crtc *crtc)
4559 clock.m2 = (fp & FP_M2_DIV_MASK) >> FP_M2_DIV_SHIFT; 5823 clock.m2 = (fp & FP_M2_DIV_MASK) >> FP_M2_DIV_SHIFT;
4560 } 5824 }
4561 5825
4562 if (IS_I9XX(dev)) { 5826 if (!IS_GEN2(dev)) {
4563 if (IS_PINEVIEW(dev)) 5827 if (IS_PINEVIEW(dev))
4564 clock.p1 = ffs((dpll & DPLL_FPA01_P1_POST_DIV_MASK_PINEVIEW) >> 5828 clock.p1 = ffs((dpll & DPLL_FPA01_P1_POST_DIV_MASK_PINEVIEW) >>
4565 DPLL_FPA01_P1_POST_DIV_SHIFT_PINEVIEW); 5829 DPLL_FPA01_P1_POST_DIV_SHIFT_PINEVIEW);
@@ -4630,10 +5894,10 @@ struct drm_display_mode *intel_crtc_mode_get(struct drm_device *dev,
4630 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 5894 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
4631 int pipe = intel_crtc->pipe; 5895 int pipe = intel_crtc->pipe;
4632 struct drm_display_mode *mode; 5896 struct drm_display_mode *mode;
4633 int htot = I915_READ((pipe == 0) ? HTOTAL_A : HTOTAL_B); 5897 int htot = I915_READ(HTOTAL(pipe));
4634 int hsync = I915_READ((pipe == 0) ? HSYNC_A : HSYNC_B); 5898 int hsync = I915_READ(HSYNC(pipe));
4635 int vtot = I915_READ((pipe == 0) ? VTOTAL_A : VTOTAL_B); 5899 int vtot = I915_READ(VTOTAL(pipe));
4636 int vsync = I915_READ((pipe == 0) ? VSYNC_A : VSYNC_B); 5900 int vsync = I915_READ(VSYNC(pipe));
4637 5901
4638 mode = kzalloc(sizeof(*mode), GFP_KERNEL); 5902 mode = kzalloc(sizeof(*mode), GFP_KERNEL);
4639 if (!mode) 5903 if (!mode)
@@ -4663,10 +5927,14 @@ static void intel_gpu_idle_timer(unsigned long arg)
4663 struct drm_device *dev = (struct drm_device *)arg; 5927 struct drm_device *dev = (struct drm_device *)arg;
4664 drm_i915_private_t *dev_priv = dev->dev_private; 5928 drm_i915_private_t *dev_priv = dev->dev_private;
4665 5929
4666 DRM_DEBUG_DRIVER("idle timer fired, downclocking\n"); 5930 if (!list_empty(&dev_priv->mm.active_list)) {
5931 /* Still processing requests, so just re-arm the timer. */
5932 mod_timer(&dev_priv->idle_timer, jiffies +
5933 msecs_to_jiffies(GPU_IDLE_TIMEOUT));
5934 return;
5935 }
4667 5936
4668 dev_priv->busy = false; 5937 dev_priv->busy = false;
4669
4670 queue_work(dev_priv->wq, &dev_priv->idle_work); 5938 queue_work(dev_priv->wq, &dev_priv->idle_work);
4671} 5939}
4672 5940
@@ -4677,22 +5945,28 @@ static void intel_crtc_idle_timer(unsigned long arg)
4677 struct intel_crtc *intel_crtc = (struct intel_crtc *)arg; 5945 struct intel_crtc *intel_crtc = (struct intel_crtc *)arg;
4678 struct drm_crtc *crtc = &intel_crtc->base; 5946 struct drm_crtc *crtc = &intel_crtc->base;
4679 drm_i915_private_t *dev_priv = crtc->dev->dev_private; 5947 drm_i915_private_t *dev_priv = crtc->dev->dev_private;
5948 struct intel_framebuffer *intel_fb;
4680 5949
4681 DRM_DEBUG_DRIVER("idle timer fired, downclocking\n"); 5950 intel_fb = to_intel_framebuffer(crtc->fb);
5951 if (intel_fb && intel_fb->obj->active) {
5952 /* The framebuffer is still being accessed by the GPU. */
5953 mod_timer(&intel_crtc->idle_timer, jiffies +
5954 msecs_to_jiffies(CRTC_IDLE_TIMEOUT));
5955 return;
5956 }
4682 5957
4683 intel_crtc->busy = false; 5958 intel_crtc->busy = false;
4684
4685 queue_work(dev_priv->wq, &dev_priv->idle_work); 5959 queue_work(dev_priv->wq, &dev_priv->idle_work);
4686} 5960}
4687 5961
4688static void intel_increase_pllclock(struct drm_crtc *crtc, bool schedule) 5962static void intel_increase_pllclock(struct drm_crtc *crtc)
4689{ 5963{
4690 struct drm_device *dev = crtc->dev; 5964 struct drm_device *dev = crtc->dev;
4691 drm_i915_private_t *dev_priv = dev->dev_private; 5965 drm_i915_private_t *dev_priv = dev->dev_private;
4692 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 5966 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
4693 int pipe = intel_crtc->pipe; 5967 int pipe = intel_crtc->pipe;
4694 int dpll_reg = (pipe == 0) ? DPLL_A : DPLL_B; 5968 int dpll_reg = DPLL(pipe);
4695 int dpll = I915_READ(dpll_reg); 5969 int dpll;
4696 5970
4697 if (HAS_PCH_SPLIT(dev)) 5971 if (HAS_PCH_SPLIT(dev))
4698 return; 5972 return;
@@ -4700,17 +5974,18 @@ static void intel_increase_pllclock(struct drm_crtc *crtc, bool schedule)
4700 if (!dev_priv->lvds_downclock_avail) 5974 if (!dev_priv->lvds_downclock_avail)
4701 return; 5975 return;
4702 5976
5977 dpll = I915_READ(dpll_reg);
4703 if (!HAS_PIPE_CXSR(dev) && (dpll & DISPLAY_RATE_SELECT_FPA1)) { 5978 if (!HAS_PIPE_CXSR(dev) && (dpll & DISPLAY_RATE_SELECT_FPA1)) {
4704 DRM_DEBUG_DRIVER("upclocking LVDS\n"); 5979 DRM_DEBUG_DRIVER("upclocking LVDS\n");
4705 5980
4706 /* Unlock panel regs */ 5981 /* Unlock panel regs */
4707 I915_WRITE(PP_CONTROL, I915_READ(PP_CONTROL) | 5982 I915_WRITE(PP_CONTROL,
4708 PANEL_UNLOCK_REGS); 5983 I915_READ(PP_CONTROL) | PANEL_UNLOCK_REGS);
4709 5984
4710 dpll &= ~DISPLAY_RATE_SELECT_FPA1; 5985 dpll &= ~DISPLAY_RATE_SELECT_FPA1;
4711 I915_WRITE(dpll_reg, dpll); 5986 I915_WRITE(dpll_reg, dpll);
4712 dpll = I915_READ(dpll_reg);
4713 intel_wait_for_vblank(dev, pipe); 5987 intel_wait_for_vblank(dev, pipe);
5988
4714 dpll = I915_READ(dpll_reg); 5989 dpll = I915_READ(dpll_reg);
4715 if (dpll & DISPLAY_RATE_SELECT_FPA1) 5990 if (dpll & DISPLAY_RATE_SELECT_FPA1)
4716 DRM_DEBUG_DRIVER("failed to upclock LVDS!\n"); 5991 DRM_DEBUG_DRIVER("failed to upclock LVDS!\n");
@@ -4720,9 +5995,8 @@ static void intel_increase_pllclock(struct drm_crtc *crtc, bool schedule)
4720 } 5995 }
4721 5996
4722 /* Schedule downclock */ 5997 /* Schedule downclock */
4723 if (schedule) 5998 mod_timer(&intel_crtc->idle_timer, jiffies +
4724 mod_timer(&intel_crtc->idle_timer, jiffies + 5999 msecs_to_jiffies(CRTC_IDLE_TIMEOUT));
4725 msecs_to_jiffies(CRTC_IDLE_TIMEOUT));
4726} 6000}
4727 6001
4728static void intel_decrease_pllclock(struct drm_crtc *crtc) 6002static void intel_decrease_pllclock(struct drm_crtc *crtc)
@@ -4731,7 +6005,7 @@ static void intel_decrease_pllclock(struct drm_crtc *crtc)
4731 drm_i915_private_t *dev_priv = dev->dev_private; 6005 drm_i915_private_t *dev_priv = dev->dev_private;
4732 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 6006 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
4733 int pipe = intel_crtc->pipe; 6007 int pipe = intel_crtc->pipe;
4734 int dpll_reg = (pipe == 0) ? DPLL_A : DPLL_B; 6008 int dpll_reg = DPLL(pipe);
4735 int dpll = I915_READ(dpll_reg); 6009 int dpll = I915_READ(dpll_reg);
4736 6010
4737 if (HAS_PCH_SPLIT(dev)) 6011 if (HAS_PCH_SPLIT(dev))
@@ -4753,7 +6027,6 @@ static void intel_decrease_pllclock(struct drm_crtc *crtc)
4753 6027
4754 dpll |= DISPLAY_RATE_SELECT_FPA1; 6028 dpll |= DISPLAY_RATE_SELECT_FPA1;
4755 I915_WRITE(dpll_reg, dpll); 6029 I915_WRITE(dpll_reg, dpll);
4756 dpll = I915_READ(dpll_reg);
4757 intel_wait_for_vblank(dev, pipe); 6030 intel_wait_for_vblank(dev, pipe);
4758 dpll = I915_READ(dpll_reg); 6031 dpll = I915_READ(dpll_reg);
4759 if (!(dpll & DISPLAY_RATE_SELECT_FPA1)) 6032 if (!(dpll & DISPLAY_RATE_SELECT_FPA1))
@@ -4779,7 +6052,6 @@ static void intel_idle_update(struct work_struct *work)
4779 struct drm_device *dev = dev_priv->dev; 6052 struct drm_device *dev = dev_priv->dev;
4780 struct drm_crtc *crtc; 6053 struct drm_crtc *crtc;
4781 struct intel_crtc *intel_crtc; 6054 struct intel_crtc *intel_crtc;
4782 int enabled = 0;
4783 6055
4784 if (!i915_powersave) 6056 if (!i915_powersave)
4785 return; 6057 return;
@@ -4793,16 +6065,11 @@ static void intel_idle_update(struct work_struct *work)
4793 if (!crtc->fb) 6065 if (!crtc->fb)
4794 continue; 6066 continue;
4795 6067
4796 enabled++;
4797 intel_crtc = to_intel_crtc(crtc); 6068 intel_crtc = to_intel_crtc(crtc);
4798 if (!intel_crtc->busy) 6069 if (!intel_crtc->busy)
4799 intel_decrease_pllclock(crtc); 6070 intel_decrease_pllclock(crtc);
4800 } 6071 }
4801 6072
4802 if ((enabled == 1) && (IS_I945G(dev) || IS_I945GM(dev))) {
4803 DRM_DEBUG_DRIVER("enable memory self refresh on 945\n");
4804 I915_WRITE(FW_BLC_SELF, FW_BLC_SELF_EN_MASK | FW_BLC_SELF_EN);
4805 }
4806 6073
4807 mutex_unlock(&dev->struct_mutex); 6074 mutex_unlock(&dev->struct_mutex);
4808} 6075}
@@ -4817,7 +6084,7 @@ static void intel_idle_update(struct work_struct *work)
4817 * buffer), we'll also mark the display as busy, so we know to increase its 6084 * buffer), we'll also mark the display as busy, so we know to increase its
4818 * clock frequency. 6085 * clock frequency.
4819 */ 6086 */
4820void intel_mark_busy(struct drm_device *dev, struct drm_gem_object *obj) 6087void intel_mark_busy(struct drm_device *dev, struct drm_i915_gem_object *obj)
4821{ 6088{
4822 drm_i915_private_t *dev_priv = dev->dev_private; 6089 drm_i915_private_t *dev_priv = dev->dev_private;
4823 struct drm_crtc *crtc = NULL; 6090 struct drm_crtc *crtc = NULL;
@@ -4827,17 +6094,9 @@ void intel_mark_busy(struct drm_device *dev, struct drm_gem_object *obj)
4827 if (!drm_core_check_feature(dev, DRIVER_MODESET)) 6094 if (!drm_core_check_feature(dev, DRIVER_MODESET))
4828 return; 6095 return;
4829 6096
4830 if (!dev_priv->busy) { 6097 if (!dev_priv->busy)
4831 if (IS_I945G(dev) || IS_I945GM(dev)) {
4832 u32 fw_blc_self;
4833
4834 DRM_DEBUG_DRIVER("disable memory self refresh on 945\n");
4835 fw_blc_self = I915_READ(FW_BLC_SELF);
4836 fw_blc_self &= ~FW_BLC_SELF_EN;
4837 I915_WRITE(FW_BLC_SELF, fw_blc_self | FW_BLC_SELF_EN_MASK);
4838 }
4839 dev_priv->busy = true; 6098 dev_priv->busy = true;
4840 } else 6099 else
4841 mod_timer(&dev_priv->idle_timer, jiffies + 6100 mod_timer(&dev_priv->idle_timer, jiffies +
4842 msecs_to_jiffies(GPU_IDLE_TIMEOUT)); 6101 msecs_to_jiffies(GPU_IDLE_TIMEOUT));
4843 6102
@@ -4849,16 +6108,8 @@ void intel_mark_busy(struct drm_device *dev, struct drm_gem_object *obj)
4849 intel_fb = to_intel_framebuffer(crtc->fb); 6108 intel_fb = to_intel_framebuffer(crtc->fb);
4850 if (intel_fb->obj == obj) { 6109 if (intel_fb->obj == obj) {
4851 if (!intel_crtc->busy) { 6110 if (!intel_crtc->busy) {
4852 if (IS_I945G(dev) || IS_I945GM(dev)) {
4853 u32 fw_blc_self;
4854
4855 DRM_DEBUG_DRIVER("disable memory self refresh on 945\n");
4856 fw_blc_self = I915_READ(FW_BLC_SELF);
4857 fw_blc_self &= ~FW_BLC_SELF_EN;
4858 I915_WRITE(FW_BLC_SELF, fw_blc_self | FW_BLC_SELF_EN_MASK);
4859 }
4860 /* Non-busy -> busy, upclock */ 6111 /* Non-busy -> busy, upclock */
4861 intel_increase_pllclock(crtc, true); 6112 intel_increase_pllclock(crtc);
4862 intel_crtc->busy = true; 6113 intel_crtc->busy = true;
4863 } else { 6114 } else {
4864 /* Busy -> busy, put off timer */ 6115 /* Busy -> busy, put off timer */
@@ -4872,8 +6123,22 @@ void intel_mark_busy(struct drm_device *dev, struct drm_gem_object *obj)
4872static void intel_crtc_destroy(struct drm_crtc *crtc) 6123static void intel_crtc_destroy(struct drm_crtc *crtc)
4873{ 6124{
4874 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 6125 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
6126 struct drm_device *dev = crtc->dev;
6127 struct intel_unpin_work *work;
6128 unsigned long flags;
6129
6130 spin_lock_irqsave(&dev->event_lock, flags);
6131 work = intel_crtc->unpin_work;
6132 intel_crtc->unpin_work = NULL;
6133 spin_unlock_irqrestore(&dev->event_lock, flags);
6134
6135 if (work) {
6136 cancel_work_sync(&work->work);
6137 kfree(work);
6138 }
4875 6139
4876 drm_crtc_cleanup(crtc); 6140 drm_crtc_cleanup(crtc);
6141
4877 kfree(intel_crtc); 6142 kfree(intel_crtc);
4878} 6143}
4879 6144
@@ -4884,8 +6149,9 @@ static void intel_unpin_work_fn(struct work_struct *__work)
4884 6149
4885 mutex_lock(&work->dev->struct_mutex); 6150 mutex_lock(&work->dev->struct_mutex);
4886 i915_gem_object_unpin(work->old_fb_obj); 6151 i915_gem_object_unpin(work->old_fb_obj);
4887 drm_gem_object_unreference(work->pending_flip_obj); 6152 drm_gem_object_unreference(&work->pending_flip_obj->base);
4888 drm_gem_object_unreference(work->old_fb_obj); 6153 drm_gem_object_unreference(&work->old_fb_obj->base);
6154
4889 mutex_unlock(&work->dev->struct_mutex); 6155 mutex_unlock(&work->dev->struct_mutex);
4890 kfree(work); 6156 kfree(work);
4891} 6157}
@@ -4896,15 +6162,17 @@ static void do_intel_finish_page_flip(struct drm_device *dev,
4896 drm_i915_private_t *dev_priv = dev->dev_private; 6162 drm_i915_private_t *dev_priv = dev->dev_private;
4897 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 6163 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
4898 struct intel_unpin_work *work; 6164 struct intel_unpin_work *work;
4899 struct drm_i915_gem_object *obj_priv; 6165 struct drm_i915_gem_object *obj;
4900 struct drm_pending_vblank_event *e; 6166 struct drm_pending_vblank_event *e;
4901 struct timeval now; 6167 struct timeval tnow, tvbl;
4902 unsigned long flags; 6168 unsigned long flags;
4903 6169
4904 /* Ignore early vblank irqs */ 6170 /* Ignore early vblank irqs */
4905 if (intel_crtc == NULL) 6171 if (intel_crtc == NULL)
4906 return; 6172 return;
4907 6173
6174 do_gettimeofday(&tnow);
6175
4908 spin_lock_irqsave(&dev->event_lock, flags); 6176 spin_lock_irqsave(&dev->event_lock, flags);
4909 work = intel_crtc->unpin_work; 6177 work = intel_crtc->unpin_work;
4910 if (work == NULL || !work->pending) { 6178 if (work == NULL || !work->pending) {
@@ -4913,27 +6181,49 @@ static void do_intel_finish_page_flip(struct drm_device *dev,
4913 } 6181 }
4914 6182
4915 intel_crtc->unpin_work = NULL; 6183 intel_crtc->unpin_work = NULL;
4916 drm_vblank_put(dev, intel_crtc->pipe);
4917 6184
4918 if (work->event) { 6185 if (work->event) {
4919 e = work->event; 6186 e = work->event;
4920 do_gettimeofday(&now); 6187 e->event.sequence = drm_vblank_count_and_time(dev, intel_crtc->pipe, &tvbl);
4921 e->event.sequence = drm_vblank_count(dev, intel_crtc->pipe); 6188
4922 e->event.tv_sec = now.tv_sec; 6189 /* Called before vblank count and timestamps have
4923 e->event.tv_usec = now.tv_usec; 6190 * been updated for the vblank interval of flip
6191 * completion? Need to increment vblank count and
6192 * add one videorefresh duration to returned timestamp
6193 * to account for this. We assume this happened if we
6194 * get called over 0.9 frame durations after the last
6195 * timestamped vblank.
6196 *
6197 * This calculation can not be used with vrefresh rates
6198 * below 5Hz (10Hz to be on the safe side) without
6199 * promoting to 64 integers.
6200 */
6201 if (10 * (timeval_to_ns(&tnow) - timeval_to_ns(&tvbl)) >
6202 9 * crtc->framedur_ns) {
6203 e->event.sequence++;
6204 tvbl = ns_to_timeval(timeval_to_ns(&tvbl) +
6205 crtc->framedur_ns);
6206 }
6207
6208 e->event.tv_sec = tvbl.tv_sec;
6209 e->event.tv_usec = tvbl.tv_usec;
6210
4924 list_add_tail(&e->base.link, 6211 list_add_tail(&e->base.link,
4925 &e->base.file_priv->event_list); 6212 &e->base.file_priv->event_list);
4926 wake_up_interruptible(&e->base.file_priv->event_wait); 6213 wake_up_interruptible(&e->base.file_priv->event_wait);
4927 } 6214 }
4928 6215
6216 drm_vblank_put(dev, intel_crtc->pipe);
6217
4929 spin_unlock_irqrestore(&dev->event_lock, flags); 6218 spin_unlock_irqrestore(&dev->event_lock, flags);
4930 6219
4931 obj_priv = to_intel_bo(work->pending_flip_obj); 6220 obj = work->old_fb_obj;
6221
6222 atomic_clear_mask(1 << intel_crtc->plane,
6223 &obj->pending_flip.counter);
6224 if (atomic_read(&obj->pending_flip) == 0)
6225 wake_up(&dev_priv->pending_flip_queue);
4932 6226
4933 /* Initial scanout buffer will have a 0 pending flip count */
4934 if ((atomic_read(&obj_priv->pending_flip) == 0) ||
4935 atomic_dec_and_test(&obj_priv->pending_flip))
4936 DRM_WAKEUP(&dev_priv->pending_flip_queue);
4937 schedule_work(&work->work); 6227 schedule_work(&work->work);
4938 6228
4939 trace_i915_flip_complete(intel_crtc->plane, work->pending_flip_obj); 6229 trace_i915_flip_complete(intel_crtc->plane, work->pending_flip_obj);
@@ -4972,6 +6262,197 @@ void intel_prepare_page_flip(struct drm_device *dev, int plane)
4972 spin_unlock_irqrestore(&dev->event_lock, flags); 6262 spin_unlock_irqrestore(&dev->event_lock, flags);
4973} 6263}
4974 6264
6265static int intel_gen2_queue_flip(struct drm_device *dev,
6266 struct drm_crtc *crtc,
6267 struct drm_framebuffer *fb,
6268 struct drm_i915_gem_object *obj)
6269{
6270 struct drm_i915_private *dev_priv = dev->dev_private;
6271 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
6272 unsigned long offset;
6273 u32 flip_mask;
6274 int ret;
6275
6276 ret = intel_pin_and_fence_fb_obj(dev, obj, LP_RING(dev_priv));
6277 if (ret)
6278 goto out;
6279
6280 /* Offset into the new buffer for cases of shared fbs between CRTCs */
6281 offset = crtc->y * fb->pitch + crtc->x * fb->bits_per_pixel/8;
6282
6283 ret = BEGIN_LP_RING(6);
6284 if (ret)
6285 goto out;
6286
6287 /* Can't queue multiple flips, so wait for the previous
6288 * one to finish before executing the next.
6289 */
6290 if (intel_crtc->plane)
6291 flip_mask = MI_WAIT_FOR_PLANE_B_FLIP;
6292 else
6293 flip_mask = MI_WAIT_FOR_PLANE_A_FLIP;
6294 OUT_RING(MI_WAIT_FOR_EVENT | flip_mask);
6295 OUT_RING(MI_NOOP);
6296 OUT_RING(MI_DISPLAY_FLIP |
6297 MI_DISPLAY_FLIP_PLANE(intel_crtc->plane));
6298 OUT_RING(fb->pitch);
6299 OUT_RING(obj->gtt_offset + offset);
6300 OUT_RING(MI_NOOP);
6301 ADVANCE_LP_RING();
6302out:
6303 return ret;
6304}
6305
6306static int intel_gen3_queue_flip(struct drm_device *dev,
6307 struct drm_crtc *crtc,
6308 struct drm_framebuffer *fb,
6309 struct drm_i915_gem_object *obj)
6310{
6311 struct drm_i915_private *dev_priv = dev->dev_private;
6312 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
6313 unsigned long offset;
6314 u32 flip_mask;
6315 int ret;
6316
6317 ret = intel_pin_and_fence_fb_obj(dev, obj, LP_RING(dev_priv));
6318 if (ret)
6319 goto out;
6320
6321 /* Offset into the new buffer for cases of shared fbs between CRTCs */
6322 offset = crtc->y * fb->pitch + crtc->x * fb->bits_per_pixel/8;
6323
6324 ret = BEGIN_LP_RING(6);
6325 if (ret)
6326 goto out;
6327
6328 if (intel_crtc->plane)
6329 flip_mask = MI_WAIT_FOR_PLANE_B_FLIP;
6330 else
6331 flip_mask = MI_WAIT_FOR_PLANE_A_FLIP;
6332 OUT_RING(MI_WAIT_FOR_EVENT | flip_mask);
6333 OUT_RING(MI_NOOP);
6334 OUT_RING(MI_DISPLAY_FLIP_I915 |
6335 MI_DISPLAY_FLIP_PLANE(intel_crtc->plane));
6336 OUT_RING(fb->pitch);
6337 OUT_RING(obj->gtt_offset + offset);
6338 OUT_RING(MI_NOOP);
6339
6340 ADVANCE_LP_RING();
6341out:
6342 return ret;
6343}
6344
6345static int intel_gen4_queue_flip(struct drm_device *dev,
6346 struct drm_crtc *crtc,
6347 struct drm_framebuffer *fb,
6348 struct drm_i915_gem_object *obj)
6349{
6350 struct drm_i915_private *dev_priv = dev->dev_private;
6351 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
6352 uint32_t pf, pipesrc;
6353 int ret;
6354
6355 ret = intel_pin_and_fence_fb_obj(dev, obj, LP_RING(dev_priv));
6356 if (ret)
6357 goto out;
6358
6359 ret = BEGIN_LP_RING(4);
6360 if (ret)
6361 goto out;
6362
6363 /* i965+ uses the linear or tiled offsets from the
6364 * Display Registers (which do not change across a page-flip)
6365 * so we need only reprogram the base address.
6366 */
6367 OUT_RING(MI_DISPLAY_FLIP |
6368 MI_DISPLAY_FLIP_PLANE(intel_crtc->plane));
6369 OUT_RING(fb->pitch);
6370 OUT_RING(obj->gtt_offset | obj->tiling_mode);
6371
6372 /* XXX Enabling the panel-fitter across page-flip is so far
6373 * untested on non-native modes, so ignore it for now.
6374 * pf = I915_READ(pipe == 0 ? PFA_CTL_1 : PFB_CTL_1) & PF_ENABLE;
6375 */
6376 pf = 0;
6377 pipesrc = I915_READ(PIPESRC(intel_crtc->pipe)) & 0x0fff0fff;
6378 OUT_RING(pf | pipesrc);
6379 ADVANCE_LP_RING();
6380out:
6381 return ret;
6382}
6383
6384static int intel_gen6_queue_flip(struct drm_device *dev,
6385 struct drm_crtc *crtc,
6386 struct drm_framebuffer *fb,
6387 struct drm_i915_gem_object *obj)
6388{
6389 struct drm_i915_private *dev_priv = dev->dev_private;
6390 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
6391 uint32_t pf, pipesrc;
6392 int ret;
6393
6394 ret = intel_pin_and_fence_fb_obj(dev, obj, LP_RING(dev_priv));
6395 if (ret)
6396 goto out;
6397
6398 ret = BEGIN_LP_RING(4);
6399 if (ret)
6400 goto out;
6401
6402 OUT_RING(MI_DISPLAY_FLIP |
6403 MI_DISPLAY_FLIP_PLANE(intel_crtc->plane));
6404 OUT_RING(fb->pitch | obj->tiling_mode);
6405 OUT_RING(obj->gtt_offset);
6406
6407 pf = I915_READ(PF_CTL(intel_crtc->pipe)) & PF_ENABLE;
6408 pipesrc = I915_READ(PIPESRC(intel_crtc->pipe)) & 0x0fff0fff;
6409 OUT_RING(pf | pipesrc);
6410 ADVANCE_LP_RING();
6411out:
6412 return ret;
6413}
6414
6415/*
6416 * On gen7 we currently use the blit ring because (in early silicon at least)
6417 * the render ring doesn't give us interrpts for page flip completion, which
6418 * means clients will hang after the first flip is queued. Fortunately the
6419 * blit ring generates interrupts properly, so use it instead.
6420 */
6421static int intel_gen7_queue_flip(struct drm_device *dev,
6422 struct drm_crtc *crtc,
6423 struct drm_framebuffer *fb,
6424 struct drm_i915_gem_object *obj)
6425{
6426 struct drm_i915_private *dev_priv = dev->dev_private;
6427 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
6428 struct intel_ring_buffer *ring = &dev_priv->ring[BCS];
6429 int ret;
6430
6431 ret = intel_pin_and_fence_fb_obj(dev, obj, ring);
6432 if (ret)
6433 goto out;
6434
6435 ret = intel_ring_begin(ring, 4);
6436 if (ret)
6437 goto out;
6438
6439 intel_ring_emit(ring, MI_DISPLAY_FLIP_I915 | (intel_crtc->plane << 19));
6440 intel_ring_emit(ring, (fb->pitch | obj->tiling_mode));
6441 intel_ring_emit(ring, (obj->gtt_offset));
6442 intel_ring_emit(ring, (MI_NOOP));
6443 intel_ring_advance(ring);
6444out:
6445 return ret;
6446}
6447
6448static int intel_default_queue_flip(struct drm_device *dev,
6449 struct drm_crtc *crtc,
6450 struct drm_framebuffer *fb,
6451 struct drm_i915_gem_object *obj)
6452{
6453 return -ENODEV;
6454}
6455
4975static int intel_crtc_page_flip(struct drm_crtc *crtc, 6456static int intel_crtc_page_flip(struct drm_crtc *crtc,
4976 struct drm_framebuffer *fb, 6457 struct drm_framebuffer *fb,
4977 struct drm_pending_vblank_event *event) 6458 struct drm_pending_vblank_event *event)
@@ -4979,13 +6460,10 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc,
4979 struct drm_device *dev = crtc->dev; 6460 struct drm_device *dev = crtc->dev;
4980 struct drm_i915_private *dev_priv = dev->dev_private; 6461 struct drm_i915_private *dev_priv = dev->dev_private;
4981 struct intel_framebuffer *intel_fb; 6462 struct intel_framebuffer *intel_fb;
4982 struct drm_i915_gem_object *obj_priv; 6463 struct drm_i915_gem_object *obj;
4983 struct drm_gem_object *obj;
4984 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 6464 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
4985 struct intel_unpin_work *work; 6465 struct intel_unpin_work *work;
4986 unsigned long flags, offset; 6466 unsigned long flags;
4987 int pipe = intel_crtc->pipe;
4988 u32 pf, pipesrc;
4989 int ret; 6467 int ret;
4990 6468
4991 work = kzalloc(sizeof *work, GFP_KERNEL); 6469 work = kzalloc(sizeof *work, GFP_KERNEL);
@@ -5014,96 +6492,29 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc,
5014 obj = intel_fb->obj; 6492 obj = intel_fb->obj;
5015 6493
5016 mutex_lock(&dev->struct_mutex); 6494 mutex_lock(&dev->struct_mutex);
5017 ret = intel_pin_and_fence_fb_obj(dev, obj);
5018 if (ret)
5019 goto cleanup_work;
5020 6495
5021 /* Reference the objects for the scheduled work. */ 6496 /* Reference the objects for the scheduled work. */
5022 drm_gem_object_reference(work->old_fb_obj); 6497 drm_gem_object_reference(&work->old_fb_obj->base);
5023 drm_gem_object_reference(obj); 6498 drm_gem_object_reference(&obj->base);
5024 6499
5025 crtc->fb = fb; 6500 crtc->fb = fb;
5026 ret = i915_gem_object_flush_write_domain(obj);
5027 if (ret)
5028 goto cleanup_objs;
5029 6501
5030 ret = drm_vblank_get(dev, intel_crtc->pipe); 6502 ret = drm_vblank_get(dev, intel_crtc->pipe);
5031 if (ret) 6503 if (ret)
5032 goto cleanup_objs; 6504 goto cleanup_objs;
5033 6505
5034 obj_priv = to_intel_bo(obj);
5035 atomic_inc(&obj_priv->pending_flip);
5036 work->pending_flip_obj = obj; 6506 work->pending_flip_obj = obj;
5037 6507
5038 if (IS_GEN3(dev) || IS_GEN2(dev)) {
5039 u32 flip_mask;
5040
5041 if (intel_crtc->plane)
5042 flip_mask = MI_WAIT_FOR_PLANE_B_FLIP;
5043 else
5044 flip_mask = MI_WAIT_FOR_PLANE_A_FLIP;
5045
5046 BEGIN_LP_RING(2);
5047 OUT_RING(MI_WAIT_FOR_EVENT | flip_mask);
5048 OUT_RING(0);
5049 ADVANCE_LP_RING();
5050 }
5051
5052 work->enable_stall_check = true; 6508 work->enable_stall_check = true;
5053 6509
5054 /* Offset into the new buffer for cases of shared fbs between CRTCs */ 6510 /* Block clients from rendering to the new back buffer until
5055 offset = crtc->y * fb->pitch + crtc->x * fb->bits_per_pixel/8; 6511 * the flip occurs and the object is no longer visible.
5056 6512 */
5057 BEGIN_LP_RING(4); 6513 atomic_add(1 << intel_crtc->plane, &work->old_fb_obj->pending_flip);
5058 switch(INTEL_INFO(dev)->gen) {
5059 case 2:
5060 OUT_RING(MI_DISPLAY_FLIP |
5061 MI_DISPLAY_FLIP_PLANE(intel_crtc->plane));
5062 OUT_RING(fb->pitch);
5063 OUT_RING(obj_priv->gtt_offset + offset);
5064 OUT_RING(MI_NOOP);
5065 break;
5066
5067 case 3:
5068 OUT_RING(MI_DISPLAY_FLIP_I915 |
5069 MI_DISPLAY_FLIP_PLANE(intel_crtc->plane));
5070 OUT_RING(fb->pitch);
5071 OUT_RING(obj_priv->gtt_offset + offset);
5072 OUT_RING(MI_NOOP);
5073 break;
5074
5075 case 4:
5076 case 5:
5077 /* i965+ uses the linear or tiled offsets from the
5078 * Display Registers (which do not change across a page-flip)
5079 * so we need only reprogram the base address.
5080 */
5081 OUT_RING(MI_DISPLAY_FLIP |
5082 MI_DISPLAY_FLIP_PLANE(intel_crtc->plane));
5083 OUT_RING(fb->pitch);
5084 OUT_RING(obj_priv->gtt_offset | obj_priv->tiling_mode);
5085
5086 /* XXX Enabling the panel-fitter across page-flip is so far
5087 * untested on non-native modes, so ignore it for now.
5088 * pf = I915_READ(pipe == 0 ? PFA_CTL_1 : PFB_CTL_1) & PF_ENABLE;
5089 */
5090 pf = 0;
5091 pipesrc = I915_READ(pipe == 0 ? PIPEASRC : PIPEBSRC) & 0x0fff0fff;
5092 OUT_RING(pf | pipesrc);
5093 break;
5094 6514
5095 case 6: 6515 ret = dev_priv->display.queue_flip(dev, crtc, fb, obj);
5096 OUT_RING(MI_DISPLAY_FLIP | 6516 if (ret)
5097 MI_DISPLAY_FLIP_PLANE(intel_crtc->plane)); 6517 goto cleanup_pending;
5098 OUT_RING(fb->pitch | obj_priv->tiling_mode);
5099 OUT_RING(obj_priv->gtt_offset);
5100
5101 pf = I915_READ(pipe == 0 ? PFA_CTL_1 : PFB_CTL_1) & PF_ENABLE;
5102 pipesrc = I915_READ(pipe == 0 ? PIPEASRC : PIPEBSRC) & 0x0fff0fff;
5103 OUT_RING(pf | pipesrc);
5104 break;
5105 }
5106 ADVANCE_LP_RING();
5107 6518
5108 mutex_unlock(&dev->struct_mutex); 6519 mutex_unlock(&dev->struct_mutex);
5109 6520
@@ -5111,10 +6522,11 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc,
5111 6522
5112 return 0; 6523 return 0;
5113 6524
6525cleanup_pending:
6526 atomic_sub(1 << intel_crtc->plane, &work->old_fb_obj->pending_flip);
5114cleanup_objs: 6527cleanup_objs:
5115 drm_gem_object_unreference(work->old_fb_obj); 6528 drm_gem_object_unreference(&work->old_fb_obj->base);
5116 drm_gem_object_unreference(obj); 6529 drm_gem_object_unreference(&obj->base);
5117cleanup_work:
5118 mutex_unlock(&dev->struct_mutex); 6530 mutex_unlock(&dev->struct_mutex);
5119 6531
5120 spin_lock_irqsave(&dev->event_lock, flags); 6532 spin_lock_irqsave(&dev->event_lock, flags);
@@ -5126,18 +6538,70 @@ cleanup_work:
5126 return ret; 6538 return ret;
5127} 6539}
5128 6540
5129static const struct drm_crtc_helper_funcs intel_helper_funcs = { 6541static void intel_sanitize_modesetting(struct drm_device *dev,
6542 int pipe, int plane)
6543{
6544 struct drm_i915_private *dev_priv = dev->dev_private;
6545 u32 reg, val;
6546
6547 if (HAS_PCH_SPLIT(dev))
6548 return;
6549
6550 /* Who knows what state these registers were left in by the BIOS or
6551 * grub?
6552 *
6553 * If we leave the registers in a conflicting state (e.g. with the
6554 * display plane reading from the other pipe than the one we intend
6555 * to use) then when we attempt to teardown the active mode, we will
6556 * not disable the pipes and planes in the correct order -- leaving
6557 * a plane reading from a disabled pipe and possibly leading to
6558 * undefined behaviour.
6559 */
6560
6561 reg = DSPCNTR(plane);
6562 val = I915_READ(reg);
6563
6564 if ((val & DISPLAY_PLANE_ENABLE) == 0)
6565 return;
6566 if (!!(val & DISPPLANE_SEL_PIPE_MASK) == pipe)
6567 return;
6568
6569 /* This display plane is active and attached to the other CPU pipe. */
6570 pipe = !pipe;
6571
6572 /* Disable the plane and wait for it to stop reading from the pipe. */
6573 intel_disable_plane(dev_priv, plane, pipe);
6574 intel_disable_pipe(dev_priv, pipe);
6575}
6576
6577static void intel_crtc_reset(struct drm_crtc *crtc)
6578{
6579 struct drm_device *dev = crtc->dev;
6580 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
6581
6582 /* Reset flags back to the 'unknown' status so that they
6583 * will be correctly set on the initial modeset.
6584 */
6585 intel_crtc->dpms_mode = -1;
6586
6587 /* We need to fix up any BIOS configuration that conflicts with
6588 * our expectations.
6589 */
6590 intel_sanitize_modesetting(dev, intel_crtc->pipe, intel_crtc->plane);
6591}
6592
6593static struct drm_crtc_helper_funcs intel_helper_funcs = {
5130 .dpms = intel_crtc_dpms, 6594 .dpms = intel_crtc_dpms,
5131 .mode_fixup = intel_crtc_mode_fixup, 6595 .mode_fixup = intel_crtc_mode_fixup,
5132 .mode_set = intel_crtc_mode_set, 6596 .mode_set = intel_crtc_mode_set,
5133 .mode_set_base = intel_pipe_set_base, 6597 .mode_set_base = intel_pipe_set_base,
5134 .mode_set_base_atomic = intel_pipe_set_base_atomic, 6598 .mode_set_base_atomic = intel_pipe_set_base_atomic,
5135 .prepare = intel_crtc_prepare,
5136 .commit = intel_crtc_commit,
5137 .load_lut = intel_crtc_load_lut, 6599 .load_lut = intel_crtc_load_lut,
6600 .disable = intel_crtc_disable,
5138}; 6601};
5139 6602
5140static const struct drm_crtc_funcs intel_crtc_funcs = { 6603static const struct drm_crtc_funcs intel_crtc_funcs = {
6604 .reset = intel_crtc_reset,
5141 .cursor_set = intel_crtc_cursor_set, 6605 .cursor_set = intel_crtc_cursor_set,
5142 .cursor_move = intel_crtc_cursor_move, 6606 .cursor_move = intel_crtc_cursor_move,
5143 .gamma_set = intel_crtc_gamma_set, 6607 .gamma_set = intel_crtc_gamma_set,
@@ -5146,7 +6610,6 @@ static const struct drm_crtc_funcs intel_crtc_funcs = {
5146 .page_flip = intel_crtc_page_flip, 6610 .page_flip = intel_crtc_page_flip,
5147}; 6611};
5148 6612
5149
5150static void intel_crtc_init(struct drm_device *dev, int pipe) 6613static void intel_crtc_init(struct drm_device *dev, int pipe)
5151{ 6614{
5152 drm_i915_private_t *dev_priv = dev->dev_private; 6615 drm_i915_private_t *dev_priv = dev->dev_private;
@@ -5160,8 +6623,6 @@ static void intel_crtc_init(struct drm_device *dev, int pipe)
5160 drm_crtc_init(dev, &intel_crtc->base, &intel_crtc_funcs); 6623 drm_crtc_init(dev, &intel_crtc->base, &intel_crtc_funcs);
5161 6624
5162 drm_mode_crtc_set_gamma_size(&intel_crtc->base, 256); 6625 drm_mode_crtc_set_gamma_size(&intel_crtc->base, 256);
5163 intel_crtc->pipe = pipe;
5164 intel_crtc->plane = pipe;
5165 for (i = 0; i < 256; i++) { 6626 for (i = 0; i < 256; i++) {
5166 intel_crtc->lut_r[i] = i; 6627 intel_crtc->lut_r[i] = i;
5167 intel_crtc->lut_g[i] = i; 6628 intel_crtc->lut_g[i] = i;
@@ -5171,9 +6632,9 @@ static void intel_crtc_init(struct drm_device *dev, int pipe)
5171 /* Swap pipes & planes for FBC on pre-965 */ 6632 /* Swap pipes & planes for FBC on pre-965 */
5172 intel_crtc->pipe = pipe; 6633 intel_crtc->pipe = pipe;
5173 intel_crtc->plane = pipe; 6634 intel_crtc->plane = pipe;
5174 if (IS_MOBILE(dev) && (IS_I9XX(dev) && !IS_I965G(dev))) { 6635 if (IS_MOBILE(dev) && IS_GEN3(dev)) {
5175 DRM_DEBUG_KMS("swapping pipes & planes for FBC\n"); 6636 DRM_DEBUG_KMS("swapping pipes & planes for FBC\n");
5176 intel_crtc->plane = ((pipe == 0) ? 1 : 0); 6637 intel_crtc->plane = !pipe;
5177 } 6638 }
5178 6639
5179 BUG_ON(pipe >= ARRAY_SIZE(dev_priv->plane_to_crtc_mapping) || 6640 BUG_ON(pipe >= ARRAY_SIZE(dev_priv->plane_to_crtc_mapping) ||
@@ -5181,8 +6642,17 @@ static void intel_crtc_init(struct drm_device *dev, int pipe)
5181 dev_priv->plane_to_crtc_mapping[intel_crtc->plane] = &intel_crtc->base; 6642 dev_priv->plane_to_crtc_mapping[intel_crtc->plane] = &intel_crtc->base;
5182 dev_priv->pipe_to_crtc_mapping[intel_crtc->pipe] = &intel_crtc->base; 6643 dev_priv->pipe_to_crtc_mapping[intel_crtc->pipe] = &intel_crtc->base;
5183 6644
5184 intel_crtc->cursor_addr = 0; 6645 intel_crtc_reset(&intel_crtc->base);
5185 intel_crtc->dpms_mode = -1; 6646 intel_crtc->active = true; /* force the pipe off on setup_init_config */
6647
6648 if (HAS_PCH_SPLIT(dev)) {
6649 intel_helper_funcs.prepare = ironlake_crtc_prepare;
6650 intel_helper_funcs.commit = ironlake_crtc_commit;
6651 } else {
6652 intel_helper_funcs.prepare = i9xx_crtc_prepare;
6653 intel_helper_funcs.commit = i9xx_crtc_commit;
6654 }
6655
5186 drm_crtc_helper_add(&intel_crtc->base, &intel_helper_funcs); 6656 drm_crtc_helper_add(&intel_crtc->base, &intel_helper_funcs);
5187 6657
5188 intel_crtc->busy = false; 6658 intel_crtc->busy = false;
@@ -5192,7 +6662,7 @@ static void intel_crtc_init(struct drm_device *dev, int pipe)
5192} 6662}
5193 6663
5194int intel_get_pipe_from_crtc_id(struct drm_device *dev, void *data, 6664int intel_get_pipe_from_crtc_id(struct drm_device *dev, void *data,
5195 struct drm_file *file_priv) 6665 struct drm_file *file)
5196{ 6666{
5197 drm_i915_private_t *dev_priv = dev->dev_private; 6667 drm_i915_private_t *dev_priv = dev->dev_private;
5198 struct drm_i915_get_pipe_from_crtc_id *pipe_from_crtc_id = data; 6668 struct drm_i915_get_pipe_from_crtc_id *pipe_from_crtc_id = data;
@@ -5218,47 +6688,56 @@ int intel_get_pipe_from_crtc_id(struct drm_device *dev, void *data,
5218 return 0; 6688 return 0;
5219} 6689}
5220 6690
5221struct drm_crtc *intel_get_crtc_from_pipe(struct drm_device *dev, int pipe)
5222{
5223 struct drm_crtc *crtc = NULL;
5224
5225 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
5226 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
5227 if (intel_crtc->pipe == pipe)
5228 break;
5229 }
5230 return crtc;
5231}
5232
5233static int intel_encoder_clones(struct drm_device *dev, int type_mask) 6691static int intel_encoder_clones(struct drm_device *dev, int type_mask)
5234{ 6692{
6693 struct intel_encoder *encoder;
5235 int index_mask = 0; 6694 int index_mask = 0;
5236 struct drm_encoder *encoder;
5237 int entry = 0; 6695 int entry = 0;
5238 6696
5239 list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { 6697 list_for_each_entry(encoder, &dev->mode_config.encoder_list, base.head) {
5240 struct intel_encoder *intel_encoder = enc_to_intel_encoder(encoder); 6698 if (type_mask & encoder->clone_mask)
5241 if (type_mask & intel_encoder->clone_mask)
5242 index_mask |= (1 << entry); 6699 index_mask |= (1 << entry);
5243 entry++; 6700 entry++;
5244 } 6701 }
6702
5245 return index_mask; 6703 return index_mask;
5246} 6704}
5247 6705
6706static bool has_edp_a(struct drm_device *dev)
6707{
6708 struct drm_i915_private *dev_priv = dev->dev_private;
6709
6710 if (!IS_MOBILE(dev))
6711 return false;
6712
6713 if ((I915_READ(DP_A) & DP_DETECTED) == 0)
6714 return false;
6715
6716 if (IS_GEN5(dev) &&
6717 (I915_READ(ILK_DISPLAY_CHICKEN_FUSES) & ILK_eDP_A_DISABLE))
6718 return false;
6719
6720 return true;
6721}
5248 6722
5249static void intel_setup_outputs(struct drm_device *dev) 6723static void intel_setup_outputs(struct drm_device *dev)
5250{ 6724{
5251 struct drm_i915_private *dev_priv = dev->dev_private; 6725 struct drm_i915_private *dev_priv = dev->dev_private;
5252 struct drm_encoder *encoder; 6726 struct intel_encoder *encoder;
5253 bool dpd_is_edp = false; 6727 bool dpd_is_edp = false;
6728 bool has_lvds = false;
5254 6729
5255 if (IS_MOBILE(dev) && !IS_I830(dev)) 6730 if (IS_MOBILE(dev) && !IS_I830(dev))
5256 intel_lvds_init(dev); 6731 has_lvds = intel_lvds_init(dev);
6732 if (!has_lvds && !HAS_PCH_SPLIT(dev)) {
6733 /* disable the panel fitter on everything but LVDS */
6734 I915_WRITE(PFIT_CONTROL, 0);
6735 }
5257 6736
5258 if (HAS_PCH_SPLIT(dev)) { 6737 if (HAS_PCH_SPLIT(dev)) {
5259 dpd_is_edp = intel_dpd_is_edp(dev); 6738 dpd_is_edp = intel_dpd_is_edp(dev);
5260 6739
5261 if (IS_MOBILE(dev) && (I915_READ(DP_A) & DP_DETECTED)) 6740 if (has_edp_a(dev))
5262 intel_dp_init(dev, DP_A); 6741 intel_dp_init(dev, DP_A);
5263 6742
5264 if (dpd_is_edp && (I915_READ(PCH_DP_D) & DP_DETECTED)) 6743 if (dpd_is_edp && (I915_READ(PCH_DP_D) & DP_DETECTED))
@@ -5338,13 +6817,16 @@ static void intel_setup_outputs(struct drm_device *dev)
5338 if (SUPPORTS_TV(dev)) 6817 if (SUPPORTS_TV(dev))
5339 intel_tv_init(dev); 6818 intel_tv_init(dev);
5340 6819
5341 list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { 6820 list_for_each_entry(encoder, &dev->mode_config.encoder_list, base.head) {
5342 struct intel_encoder *intel_encoder = enc_to_intel_encoder(encoder); 6821 encoder->base.possible_crtcs = encoder->crtc_mask;
5343 6822 encoder->base.possible_clones =
5344 encoder->possible_crtcs = intel_encoder->crtc_mask; 6823 intel_encoder_clones(dev, encoder->clone_mask);
5345 encoder->possible_clones = intel_encoder_clones(dev,
5346 intel_encoder->clone_mask);
5347 } 6824 }
6825
6826 intel_panel_setup_backlight(dev);
6827
6828 /* disable all the possible outputs/crtcs before entering KMS mode */
6829 drm_helper_disable_unused_functions(dev);
5348} 6830}
5349 6831
5350static void intel_user_framebuffer_destroy(struct drm_framebuffer *fb) 6832static void intel_user_framebuffer_destroy(struct drm_framebuffer *fb)
@@ -5352,19 +6834,19 @@ static void intel_user_framebuffer_destroy(struct drm_framebuffer *fb)
5352 struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb); 6834 struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
5353 6835
5354 drm_framebuffer_cleanup(fb); 6836 drm_framebuffer_cleanup(fb);
5355 drm_gem_object_unreference_unlocked(intel_fb->obj); 6837 drm_gem_object_unreference_unlocked(&intel_fb->obj->base);
5356 6838
5357 kfree(intel_fb); 6839 kfree(intel_fb);
5358} 6840}
5359 6841
5360static int intel_user_framebuffer_create_handle(struct drm_framebuffer *fb, 6842static int intel_user_framebuffer_create_handle(struct drm_framebuffer *fb,
5361 struct drm_file *file_priv, 6843 struct drm_file *file,
5362 unsigned int *handle) 6844 unsigned int *handle)
5363{ 6845{
5364 struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb); 6846 struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
5365 struct drm_gem_object *object = intel_fb->obj; 6847 struct drm_i915_gem_object *obj = intel_fb->obj;
5366 6848
5367 return drm_gem_handle_create(file_priv, object, handle); 6849 return drm_gem_handle_create(file, &obj->base, handle);
5368} 6850}
5369 6851
5370static const struct drm_framebuffer_funcs intel_fb_funcs = { 6852static const struct drm_framebuffer_funcs intel_fb_funcs = {
@@ -5375,10 +6857,26 @@ static const struct drm_framebuffer_funcs intel_fb_funcs = {
5375int intel_framebuffer_init(struct drm_device *dev, 6857int intel_framebuffer_init(struct drm_device *dev,
5376 struct intel_framebuffer *intel_fb, 6858 struct intel_framebuffer *intel_fb,
5377 struct drm_mode_fb_cmd *mode_cmd, 6859 struct drm_mode_fb_cmd *mode_cmd,
5378 struct drm_gem_object *obj) 6860 struct drm_i915_gem_object *obj)
5379{ 6861{
5380 int ret; 6862 int ret;
5381 6863
6864 if (obj->tiling_mode == I915_TILING_Y)
6865 return -EINVAL;
6866
6867 if (mode_cmd->pitch & 63)
6868 return -EINVAL;
6869
6870 switch (mode_cmd->bpp) {
6871 case 8:
6872 case 16:
6873 case 24:
6874 case 32:
6875 break;
6876 default:
6877 return -EINVAL;
6878 }
6879
5382 ret = drm_framebuffer_init(dev, &intel_fb->base, &intel_fb_funcs); 6880 ret = drm_framebuffer_init(dev, &intel_fb->base, &intel_fb_funcs);
5383 if (ret) { 6881 if (ret) {
5384 DRM_ERROR("framebuffer init failed %d\n", ret); 6882 DRM_ERROR("framebuffer init failed %d\n", ret);
@@ -5395,27 +6893,13 @@ intel_user_framebuffer_create(struct drm_device *dev,
5395 struct drm_file *filp, 6893 struct drm_file *filp,
5396 struct drm_mode_fb_cmd *mode_cmd) 6894 struct drm_mode_fb_cmd *mode_cmd)
5397{ 6895{
5398 struct drm_gem_object *obj; 6896 struct drm_i915_gem_object *obj;
5399 struct intel_framebuffer *intel_fb;
5400 int ret;
5401 6897
5402 obj = drm_gem_object_lookup(dev, filp, mode_cmd->handle); 6898 obj = to_intel_bo(drm_gem_object_lookup(dev, filp, mode_cmd->handle));
5403 if (!obj) 6899 if (&obj->base == NULL)
5404 return ERR_PTR(-ENOENT); 6900 return ERR_PTR(-ENOENT);
5405 6901
5406 intel_fb = kzalloc(sizeof(*intel_fb), GFP_KERNEL); 6902 return intel_framebuffer_create(dev, mode_cmd, obj);
5407 if (!intel_fb)
5408 return ERR_PTR(-ENOMEM);
5409
5410 ret = intel_framebuffer_init(dev, intel_fb,
5411 mode_cmd, obj);
5412 if (ret) {
5413 drm_gem_object_unreference_unlocked(obj);
5414 kfree(intel_fb);
5415 return ERR_PTR(ret);
5416 }
5417
5418 return &intel_fb->base;
5419} 6903}
5420 6904
5421static const struct drm_mode_config_funcs intel_mode_funcs = { 6905static const struct drm_mode_config_funcs intel_mode_funcs = {
@@ -5423,20 +6907,21 @@ static const struct drm_mode_config_funcs intel_mode_funcs = {
5423 .output_poll_changed = intel_fb_output_poll_changed, 6907 .output_poll_changed = intel_fb_output_poll_changed,
5424}; 6908};
5425 6909
5426static struct drm_gem_object * 6910static struct drm_i915_gem_object *
5427intel_alloc_context_page(struct drm_device *dev) 6911intel_alloc_context_page(struct drm_device *dev)
5428{ 6912{
5429 struct drm_gem_object *ctx; 6913 struct drm_i915_gem_object *ctx;
5430 int ret; 6914 int ret;
5431 6915
6916 WARN_ON(!mutex_is_locked(&dev->struct_mutex));
6917
5432 ctx = i915_gem_alloc_object(dev, 4096); 6918 ctx = i915_gem_alloc_object(dev, 4096);
5433 if (!ctx) { 6919 if (!ctx) {
5434 DRM_DEBUG("failed to alloc power context, RC6 disabled\n"); 6920 DRM_DEBUG("failed to alloc power context, RC6 disabled\n");
5435 return NULL; 6921 return NULL;
5436 } 6922 }
5437 6923
5438 mutex_lock(&dev->struct_mutex); 6924 ret = i915_gem_object_pin(ctx, 4096, true);
5439 ret = i915_gem_object_pin(ctx, 4096);
5440 if (ret) { 6925 if (ret) {
5441 DRM_ERROR("failed to pin power context: %d\n", ret); 6926 DRM_ERROR("failed to pin power context: %d\n", ret);
5442 goto err_unref; 6927 goto err_unref;
@@ -5447,14 +6932,13 @@ intel_alloc_context_page(struct drm_device *dev)
5447 DRM_ERROR("failed to set-domain on power context: %d\n", ret); 6932 DRM_ERROR("failed to set-domain on power context: %d\n", ret);
5448 goto err_unpin; 6933 goto err_unpin;
5449 } 6934 }
5450 mutex_unlock(&dev->struct_mutex);
5451 6935
5452 return ctx; 6936 return ctx;
5453 6937
5454err_unpin: 6938err_unpin:
5455 i915_gem_object_unpin(ctx); 6939 i915_gem_object_unpin(ctx);
5456err_unref: 6940err_unref:
5457 drm_gem_object_unreference(ctx); 6941 drm_gem_object_unreference(&ctx->base);
5458 mutex_unlock(&dev->struct_mutex); 6942 mutex_unlock(&dev->struct_mutex);
5459 return NULL; 6943 return NULL;
5460} 6944}
@@ -5487,6 +6971,10 @@ void ironlake_enable_drps(struct drm_device *dev)
5487 u32 rgvmodectl = I915_READ(MEMMODECTL); 6971 u32 rgvmodectl = I915_READ(MEMMODECTL);
5488 u8 fmax, fmin, fstart, vstart; 6972 u8 fmax, fmin, fstart, vstart;
5489 6973
6974 /* Enable temp reporting */
6975 I915_WRITE16(PMMISC, I915_READ(PMMISC) | MCPPCE_EN);
6976 I915_WRITE16(TSC1, I915_READ(TSC1) | TSE);
6977
5490 /* 100ms RC evaluation intervals */ 6978 /* 100ms RC evaluation intervals */
5491 I915_WRITE(RCUPEI, 100000); 6979 I915_WRITE(RCUPEI, 100000);
5492 I915_WRITE(RCDNEI, 100000); 6980 I915_WRITE(RCDNEI, 100000);
@@ -5502,20 +6990,19 @@ void ironlake_enable_drps(struct drm_device *dev)
5502 fmin = (rgvmodectl & MEMMODE_FMIN_MASK); 6990 fmin = (rgvmodectl & MEMMODE_FMIN_MASK);
5503 fstart = (rgvmodectl & MEMMODE_FSTART_MASK) >> 6991 fstart = (rgvmodectl & MEMMODE_FSTART_MASK) >>
5504 MEMMODE_FSTART_SHIFT; 6992 MEMMODE_FSTART_SHIFT;
5505 fstart = fmax;
5506 6993
5507 vstart = (I915_READ(PXVFREQ_BASE + (fstart * 4)) & PXVFREQ_PX_MASK) >> 6994 vstart = (I915_READ(PXVFREQ_BASE + (fstart * 4)) & PXVFREQ_PX_MASK) >>
5508 PXVFREQ_PX_SHIFT; 6995 PXVFREQ_PX_SHIFT;
5509 6996
5510 dev_priv->fmax = fstart; /* IPS callback will increase this */ 6997 dev_priv->fmax = fmax; /* IPS callback will increase this */
5511 dev_priv->fstart = fstart; 6998 dev_priv->fstart = fstart;
5512 6999
5513 dev_priv->max_delay = fmax; 7000 dev_priv->max_delay = fstart;
5514 dev_priv->min_delay = fmin; 7001 dev_priv->min_delay = fmin;
5515 dev_priv->cur_delay = fstart; 7002 dev_priv->cur_delay = fstart;
5516 7003
5517 DRM_DEBUG_DRIVER("fmax: %d, fmin: %d, fstart: %d\n", fmax, fmin, 7004 DRM_DEBUG_DRIVER("fmax: %d, fmin: %d, fstart: %d\n",
5518 fstart); 7005 fmax, fmin, fstart);
5519 7006
5520 I915_WRITE(MEMINTREN, MEMINT_CX_SUPR_EN | MEMINT_EVAL_CHG_EN); 7007 I915_WRITE(MEMINTREN, MEMINT_CX_SUPR_EN | MEMINT_EVAL_CHG_EN);
5521 7008
@@ -5529,7 +7016,7 @@ void ironlake_enable_drps(struct drm_device *dev)
5529 rgvmodectl |= MEMMODE_SWMODE_EN; 7016 rgvmodectl |= MEMMODE_SWMODE_EN;
5530 I915_WRITE(MEMMODECTL, rgvmodectl); 7017 I915_WRITE(MEMMODECTL, rgvmodectl);
5531 7018
5532 if (wait_for((I915_READ(MEMSWCTL) & MEMCTL_CMD_STS) == 0, 1, 0)) 7019 if (wait_for((I915_READ(MEMSWCTL) & MEMCTL_CMD_STS) == 0, 10))
5533 DRM_ERROR("stuck trying to change perf mode\n"); 7020 DRM_ERROR("stuck trying to change perf mode\n");
5534 msleep(1); 7021 msleep(1);
5535 7022
@@ -5563,6 +7050,30 @@ void ironlake_disable_drps(struct drm_device *dev)
5563 7050
5564} 7051}
5565 7052
7053void gen6_set_rps(struct drm_device *dev, u8 val)
7054{
7055 struct drm_i915_private *dev_priv = dev->dev_private;
7056 u32 swreq;
7057
7058 swreq = (val & 0x3ff) << 25;
7059 I915_WRITE(GEN6_RPNSWREQ, swreq);
7060}
7061
7062void gen6_disable_rps(struct drm_device *dev)
7063{
7064 struct drm_i915_private *dev_priv = dev->dev_private;
7065
7066 I915_WRITE(GEN6_RPNSWREQ, 1 << 31);
7067 I915_WRITE(GEN6_PMINTRMSK, 0xffffffff);
7068 I915_WRITE(GEN6_PMIER, 0);
7069
7070 spin_lock_irq(&dev_priv->rps_lock);
7071 dev_priv->pm_iir = 0;
7072 spin_unlock_irq(&dev_priv->rps_lock);
7073
7074 I915_WRITE(GEN6_PMIIR, I915_READ(GEN6_PMIIR));
7075}
7076
5566static unsigned long intel_pxfreq(u32 vidfreq) 7077static unsigned long intel_pxfreq(u32 vidfreq)
5567{ 7078{
5568 unsigned long freq; 7079 unsigned long freq;
@@ -5649,158 +7160,475 @@ void intel_init_emon(struct drm_device *dev)
5649 dev_priv->corr = (lcfuse & LCFUSE_HIV_MASK); 7160 dev_priv->corr = (lcfuse & LCFUSE_HIV_MASK);
5650} 7161}
5651 7162
5652void intel_init_clock_gating(struct drm_device *dev) 7163void gen6_enable_rps(struct drm_i915_private *dev_priv)
7164{
7165 u32 rp_state_cap = I915_READ(GEN6_RP_STATE_CAP);
7166 u32 gt_perf_status = I915_READ(GEN6_GT_PERF_STATUS);
7167 u32 pcu_mbox, rc6_mask = 0;
7168 int cur_freq, min_freq, max_freq;
7169 int i;
7170
7171 /* Here begins a magic sequence of register writes to enable
7172 * auto-downclocking.
7173 *
7174 * Perhaps there might be some value in exposing these to
7175 * userspace...
7176 */
7177 I915_WRITE(GEN6_RC_STATE, 0);
7178 mutex_lock(&dev_priv->dev->struct_mutex);
7179 gen6_gt_force_wake_get(dev_priv);
7180
7181 /* disable the counters and set deterministic thresholds */
7182 I915_WRITE(GEN6_RC_CONTROL, 0);
7183
7184 I915_WRITE(GEN6_RC1_WAKE_RATE_LIMIT, 1000 << 16);
7185 I915_WRITE(GEN6_RC6_WAKE_RATE_LIMIT, 40 << 16 | 30);
7186 I915_WRITE(GEN6_RC6pp_WAKE_RATE_LIMIT, 30);
7187 I915_WRITE(GEN6_RC_EVALUATION_INTERVAL, 125000);
7188 I915_WRITE(GEN6_RC_IDLE_HYSTERSIS, 25);
7189
7190 for (i = 0; i < I915_NUM_RINGS; i++)
7191 I915_WRITE(RING_MAX_IDLE(dev_priv->ring[i].mmio_base), 10);
7192
7193 I915_WRITE(GEN6_RC_SLEEP, 0);
7194 I915_WRITE(GEN6_RC1e_THRESHOLD, 1000);
7195 I915_WRITE(GEN6_RC6_THRESHOLD, 50000);
7196 I915_WRITE(GEN6_RC6p_THRESHOLD, 100000);
7197 I915_WRITE(GEN6_RC6pp_THRESHOLD, 64000); /* unused */
7198
7199 if (i915_enable_rc6)
7200 rc6_mask = GEN6_RC_CTL_RC6p_ENABLE |
7201 GEN6_RC_CTL_RC6_ENABLE;
7202
7203 I915_WRITE(GEN6_RC_CONTROL,
7204 rc6_mask |
7205 GEN6_RC_CTL_EI_MODE(1) |
7206 GEN6_RC_CTL_HW_ENABLE);
7207
7208 I915_WRITE(GEN6_RPNSWREQ,
7209 GEN6_FREQUENCY(10) |
7210 GEN6_OFFSET(0) |
7211 GEN6_AGGRESSIVE_TURBO);
7212 I915_WRITE(GEN6_RC_VIDEO_FREQ,
7213 GEN6_FREQUENCY(12));
7214
7215 I915_WRITE(GEN6_RP_DOWN_TIMEOUT, 1000000);
7216 I915_WRITE(GEN6_RP_INTERRUPT_LIMITS,
7217 18 << 24 |
7218 6 << 16);
7219 I915_WRITE(GEN6_RP_UP_THRESHOLD, 10000);
7220 I915_WRITE(GEN6_RP_DOWN_THRESHOLD, 1000000);
7221 I915_WRITE(GEN6_RP_UP_EI, 100000);
7222 I915_WRITE(GEN6_RP_DOWN_EI, 5000000);
7223 I915_WRITE(GEN6_RP_IDLE_HYSTERSIS, 10);
7224 I915_WRITE(GEN6_RP_CONTROL,
7225 GEN6_RP_MEDIA_TURBO |
7226 GEN6_RP_USE_NORMAL_FREQ |
7227 GEN6_RP_MEDIA_IS_GFX |
7228 GEN6_RP_ENABLE |
7229 GEN6_RP_UP_BUSY_AVG |
7230 GEN6_RP_DOWN_IDLE_CONT);
7231
7232 if (wait_for((I915_READ(GEN6_PCODE_MAILBOX) & GEN6_PCODE_READY) == 0,
7233 500))
7234 DRM_ERROR("timeout waiting for pcode mailbox to become idle\n");
7235
7236 I915_WRITE(GEN6_PCODE_DATA, 0);
7237 I915_WRITE(GEN6_PCODE_MAILBOX,
7238 GEN6_PCODE_READY |
7239 GEN6_PCODE_WRITE_MIN_FREQ_TABLE);
7240 if (wait_for((I915_READ(GEN6_PCODE_MAILBOX) & GEN6_PCODE_READY) == 0,
7241 500))
7242 DRM_ERROR("timeout waiting for pcode mailbox to finish\n");
7243
7244 min_freq = (rp_state_cap & 0xff0000) >> 16;
7245 max_freq = rp_state_cap & 0xff;
7246 cur_freq = (gt_perf_status & 0xff00) >> 8;
7247
7248 /* Check for overclock support */
7249 if (wait_for((I915_READ(GEN6_PCODE_MAILBOX) & GEN6_PCODE_READY) == 0,
7250 500))
7251 DRM_ERROR("timeout waiting for pcode mailbox to become idle\n");
7252 I915_WRITE(GEN6_PCODE_MAILBOX, GEN6_READ_OC_PARAMS);
7253 pcu_mbox = I915_READ(GEN6_PCODE_DATA);
7254 if (wait_for((I915_READ(GEN6_PCODE_MAILBOX) & GEN6_PCODE_READY) == 0,
7255 500))
7256 DRM_ERROR("timeout waiting for pcode mailbox to finish\n");
7257 if (pcu_mbox & (1<<31)) { /* OC supported */
7258 max_freq = pcu_mbox & 0xff;
7259 DRM_DEBUG_DRIVER("overclocking supported, adjusting frequency max to %dMHz\n", pcu_mbox * 50);
7260 }
7261
7262 /* In units of 100MHz */
7263 dev_priv->max_delay = max_freq;
7264 dev_priv->min_delay = min_freq;
7265 dev_priv->cur_delay = cur_freq;
7266
7267 /* requires MSI enabled */
7268 I915_WRITE(GEN6_PMIER,
7269 GEN6_PM_MBOX_EVENT |
7270 GEN6_PM_THERMAL_EVENT |
7271 GEN6_PM_RP_DOWN_TIMEOUT |
7272 GEN6_PM_RP_UP_THRESHOLD |
7273 GEN6_PM_RP_DOWN_THRESHOLD |
7274 GEN6_PM_RP_UP_EI_EXPIRED |
7275 GEN6_PM_RP_DOWN_EI_EXPIRED);
7276 spin_lock_irq(&dev_priv->rps_lock);
7277 WARN_ON(dev_priv->pm_iir != 0);
7278 I915_WRITE(GEN6_PMIMR, 0);
7279 spin_unlock_irq(&dev_priv->rps_lock);
7280 /* enable all PM interrupts */
7281 I915_WRITE(GEN6_PMINTRMSK, 0);
7282
7283 gen6_gt_force_wake_put(dev_priv);
7284 mutex_unlock(&dev_priv->dev->struct_mutex);
7285}
7286
7287static void ironlake_init_clock_gating(struct drm_device *dev)
5653{ 7288{
5654 struct drm_i915_private *dev_priv = dev->dev_private; 7289 struct drm_i915_private *dev_priv = dev->dev_private;
7290 uint32_t dspclk_gate = VRHUNIT_CLOCK_GATE_DISABLE;
7291
7292 /* Required for FBC */
7293 dspclk_gate |= DPFCUNIT_CLOCK_GATE_DISABLE |
7294 DPFCRUNIT_CLOCK_GATE_DISABLE |
7295 DPFDUNIT_CLOCK_GATE_DISABLE;
7296 /* Required for CxSR */
7297 dspclk_gate |= DPARBUNIT_CLOCK_GATE_DISABLE;
7298
7299 I915_WRITE(PCH_3DCGDIS0,
7300 MARIUNIT_CLOCK_GATE_DISABLE |
7301 SVSMUNIT_CLOCK_GATE_DISABLE);
7302 I915_WRITE(PCH_3DCGDIS1,
7303 VFMUNIT_CLOCK_GATE_DISABLE);
7304
7305 I915_WRITE(PCH_DSPCLK_GATE_D, dspclk_gate);
5655 7306
5656 /* 7307 /*
5657 * Disable clock gating reported to work incorrectly according to the 7308 * According to the spec the following bits should be set in
5658 * specs, but enable as much else as we can. 7309 * order to enable memory self-refresh
7310 * The bit 22/21 of 0x42004
7311 * The bit 5 of 0x42020
7312 * The bit 15 of 0x45000
5659 */ 7313 */
5660 if (HAS_PCH_SPLIT(dev)) { 7314 I915_WRITE(ILK_DISPLAY_CHICKEN2,
5661 uint32_t dspclk_gate = VRHUNIT_CLOCK_GATE_DISABLE; 7315 (I915_READ(ILK_DISPLAY_CHICKEN2) |
7316 ILK_DPARB_GATE | ILK_VSDPFD_FULL));
7317 I915_WRITE(ILK_DSPCLK_GATE,
7318 (I915_READ(ILK_DSPCLK_GATE) |
7319 ILK_DPARB_CLK_GATE));
7320 I915_WRITE(DISP_ARB_CTL,
7321 (I915_READ(DISP_ARB_CTL) |
7322 DISP_FBC_WM_DIS));
7323 I915_WRITE(WM3_LP_ILK, 0);
7324 I915_WRITE(WM2_LP_ILK, 0);
7325 I915_WRITE(WM1_LP_ILK, 0);
5662 7326
5663 if (IS_IRONLAKE(dev)) { 7327 /*
5664 /* Required for FBC */ 7328 * Based on the document from hardware guys the following bits
5665 dspclk_gate |= DPFDUNIT_CLOCK_GATE_DISABLE; 7329 * should be set unconditionally in order to enable FBC.
5666 /* Required for CxSR */ 7330 * The bit 22 of 0x42000
5667 dspclk_gate |= DPARBUNIT_CLOCK_GATE_DISABLE; 7331 * The bit 22 of 0x42004
7332 * The bit 7,8,9 of 0x42020.
7333 */
7334 if (IS_IRONLAKE_M(dev)) {
7335 I915_WRITE(ILK_DISPLAY_CHICKEN1,
7336 I915_READ(ILK_DISPLAY_CHICKEN1) |
7337 ILK_FBCQ_DIS);
7338 I915_WRITE(ILK_DISPLAY_CHICKEN2,
7339 I915_READ(ILK_DISPLAY_CHICKEN2) |
7340 ILK_DPARB_GATE);
7341 I915_WRITE(ILK_DSPCLK_GATE,
7342 I915_READ(ILK_DSPCLK_GATE) |
7343 ILK_DPFC_DIS1 |
7344 ILK_DPFC_DIS2 |
7345 ILK_CLK_FBC);
7346 }
7347
7348 I915_WRITE(ILK_DISPLAY_CHICKEN2,
7349 I915_READ(ILK_DISPLAY_CHICKEN2) |
7350 ILK_ELPIN_409_SELECT);
7351 I915_WRITE(_3D_CHICKEN2,
7352 _3D_CHICKEN2_WM_READ_PIPELINED << 16 |
7353 _3D_CHICKEN2_WM_READ_PIPELINED);
7354}
5668 7355
5669 I915_WRITE(PCH_3DCGDIS0, 7356static void gen6_init_clock_gating(struct drm_device *dev)
5670 MARIUNIT_CLOCK_GATE_DISABLE | 7357{
5671 SVSMUNIT_CLOCK_GATE_DISABLE); 7358 struct drm_i915_private *dev_priv = dev->dev_private;
5672 } 7359 int pipe;
7360 uint32_t dspclk_gate = VRHUNIT_CLOCK_GATE_DISABLE;
5673 7361
5674 I915_WRITE(PCH_DSPCLK_GATE_D, dspclk_gate); 7362 I915_WRITE(PCH_DSPCLK_GATE_D, dspclk_gate);
5675 7363
5676 /* 7364 I915_WRITE(ILK_DISPLAY_CHICKEN2,
5677 * According to the spec the following bits should be set in 7365 I915_READ(ILK_DISPLAY_CHICKEN2) |
5678 * order to enable memory self-refresh 7366 ILK_ELPIN_409_SELECT);
5679 * The bit 22/21 of 0x42004 7367
5680 * The bit 5 of 0x42020 7368 I915_WRITE(WM3_LP_ILK, 0);
5681 * The bit 15 of 0x45000 7369 I915_WRITE(WM2_LP_ILK, 0);
5682 */ 7370 I915_WRITE(WM1_LP_ILK, 0);
5683 if (IS_IRONLAKE(dev)) { 7371
5684 I915_WRITE(ILK_DISPLAY_CHICKEN2, 7372 /*
5685 (I915_READ(ILK_DISPLAY_CHICKEN2) | 7373 * According to the spec the following bits should be
5686 ILK_DPARB_GATE | ILK_VSDPFD_FULL)); 7374 * set in order to enable memory self-refresh and fbc:
5687 I915_WRITE(ILK_DSPCLK_GATE, 7375 * The bit21 and bit22 of 0x42000
5688 (I915_READ(ILK_DSPCLK_GATE) | 7376 * The bit21 and bit22 of 0x42004
5689 ILK_DPARB_CLK_GATE)); 7377 * The bit5 and bit7 of 0x42020
5690 I915_WRITE(DISP_ARB_CTL, 7378 * The bit14 of 0x70180
5691 (I915_READ(DISP_ARB_CTL) | 7379 * The bit14 of 0x71180
5692 DISP_FBC_WM_DIS)); 7380 */
5693 I915_WRITE(WM3_LP_ILK, 0); 7381 I915_WRITE(ILK_DISPLAY_CHICKEN1,
5694 I915_WRITE(WM2_LP_ILK, 0); 7382 I915_READ(ILK_DISPLAY_CHICKEN1) |
5695 I915_WRITE(WM1_LP_ILK, 0); 7383 ILK_FBCQ_DIS | ILK_PABSTRETCH_DIS);
5696 } 7384 I915_WRITE(ILK_DISPLAY_CHICKEN2,
5697 /* 7385 I915_READ(ILK_DISPLAY_CHICKEN2) |
5698 * Based on the document from hardware guys the following bits 7386 ILK_DPARB_GATE | ILK_VSDPFD_FULL);
5699 * should be set unconditionally in order to enable FBC. 7387 I915_WRITE(ILK_DSPCLK_GATE,
5700 * The bit 22 of 0x42000 7388 I915_READ(ILK_DSPCLK_GATE) |
5701 * The bit 22 of 0x42004 7389 ILK_DPARB_CLK_GATE |
5702 * The bit 7,8,9 of 0x42020. 7390 ILK_DPFD_CLK_GATE);
5703 */ 7391
5704 if (IS_IRONLAKE_M(dev)) { 7392 for_each_pipe(pipe)
5705 I915_WRITE(ILK_DISPLAY_CHICKEN1, 7393 I915_WRITE(DSPCNTR(pipe),
5706 I915_READ(ILK_DISPLAY_CHICKEN1) | 7394 I915_READ(DSPCNTR(pipe)) |
5707 ILK_FBCQ_DIS); 7395 DISPPLANE_TRICKLE_FEED_DISABLE);
5708 I915_WRITE(ILK_DISPLAY_CHICKEN2, 7396}
5709 I915_READ(ILK_DISPLAY_CHICKEN2) | 7397
5710 ILK_DPARB_GATE); 7398static void ivybridge_init_clock_gating(struct drm_device *dev)
5711 I915_WRITE(ILK_DSPCLK_GATE, 7399{
5712 I915_READ(ILK_DSPCLK_GATE) | 7400 struct drm_i915_private *dev_priv = dev->dev_private;
5713 ILK_DPFC_DIS1 | 7401 int pipe;
5714 ILK_DPFC_DIS2 | 7402 uint32_t dspclk_gate = VRHUNIT_CLOCK_GATE_DISABLE;
5715 ILK_CLK_FBC); 7403
5716 } 7404 I915_WRITE(PCH_DSPCLK_GATE_D, dspclk_gate);
7405
7406 I915_WRITE(WM3_LP_ILK, 0);
7407 I915_WRITE(WM2_LP_ILK, 0);
7408 I915_WRITE(WM1_LP_ILK, 0);
7409
7410 I915_WRITE(ILK_DSPCLK_GATE, IVB_VRHUNIT_CLK_GATE);
7411
7412 for_each_pipe(pipe)
7413 I915_WRITE(DSPCNTR(pipe),
7414 I915_READ(DSPCNTR(pipe)) |
7415 DISPPLANE_TRICKLE_FEED_DISABLE);
7416}
7417
7418static void g4x_init_clock_gating(struct drm_device *dev)
7419{
7420 struct drm_i915_private *dev_priv = dev->dev_private;
7421 uint32_t dspclk_gate;
7422
7423 I915_WRITE(RENCLK_GATE_D1, 0);
7424 I915_WRITE(RENCLK_GATE_D2, VF_UNIT_CLOCK_GATE_DISABLE |
7425 GS_UNIT_CLOCK_GATE_DISABLE |
7426 CL_UNIT_CLOCK_GATE_DISABLE);
7427 I915_WRITE(RAMCLK_GATE_D, 0);
7428 dspclk_gate = VRHUNIT_CLOCK_GATE_DISABLE |
7429 OVRUNIT_CLOCK_GATE_DISABLE |
7430 OVCUNIT_CLOCK_GATE_DISABLE;
7431 if (IS_GM45(dev))
7432 dspclk_gate |= DSSUNIT_CLOCK_GATE_DISABLE;
7433 I915_WRITE(DSPCLK_GATE_D, dspclk_gate);
7434}
7435
7436static void crestline_init_clock_gating(struct drm_device *dev)
7437{
7438 struct drm_i915_private *dev_priv = dev->dev_private;
7439
7440 I915_WRITE(RENCLK_GATE_D1, I965_RCC_CLOCK_GATE_DISABLE);
7441 I915_WRITE(RENCLK_GATE_D2, 0);
7442 I915_WRITE(DSPCLK_GATE_D, 0);
7443 I915_WRITE(RAMCLK_GATE_D, 0);
7444 I915_WRITE16(DEUC, 0);
7445}
7446
7447static void broadwater_init_clock_gating(struct drm_device *dev)
7448{
7449 struct drm_i915_private *dev_priv = dev->dev_private;
7450
7451 I915_WRITE(RENCLK_GATE_D1, I965_RCZ_CLOCK_GATE_DISABLE |
7452 I965_RCC_CLOCK_GATE_DISABLE |
7453 I965_RCPB_CLOCK_GATE_DISABLE |
7454 I965_ISC_CLOCK_GATE_DISABLE |
7455 I965_FBC_CLOCK_GATE_DISABLE);
7456 I915_WRITE(RENCLK_GATE_D2, 0);
7457}
7458
7459static void gen3_init_clock_gating(struct drm_device *dev)
7460{
7461 struct drm_i915_private *dev_priv = dev->dev_private;
7462 u32 dstate = I915_READ(D_STATE);
7463
7464 dstate |= DSTATE_PLL_D3_OFF | DSTATE_GFX_CLOCK_GATING |
7465 DSTATE_DOT_CLOCK_GATING;
7466 I915_WRITE(D_STATE, dstate);
7467}
7468
7469static void i85x_init_clock_gating(struct drm_device *dev)
7470{
7471 struct drm_i915_private *dev_priv = dev->dev_private;
7472
7473 I915_WRITE(RENCLK_GATE_D1, SV_CLOCK_GATE_DISABLE);
7474}
7475
7476static void i830_init_clock_gating(struct drm_device *dev)
7477{
7478 struct drm_i915_private *dev_priv = dev->dev_private;
7479
7480 I915_WRITE(DSPCLK_GATE_D, OVRUNIT_CLOCK_GATE_DISABLE);
7481}
7482
7483static void ibx_init_clock_gating(struct drm_device *dev)
7484{
7485 struct drm_i915_private *dev_priv = dev->dev_private;
7486
7487 /*
7488 * On Ibex Peak and Cougar Point, we need to disable clock
7489 * gating for the panel power sequencer or it will fail to
7490 * start up when no ports are active.
7491 */
7492 I915_WRITE(SOUTH_DSPCLK_GATE_D, PCH_DPLSUNIT_CLOCK_GATE_DISABLE);
7493}
7494
7495static void cpt_init_clock_gating(struct drm_device *dev)
7496{
7497 struct drm_i915_private *dev_priv = dev->dev_private;
7498
7499 /*
7500 * On Ibex Peak and Cougar Point, we need to disable clock
7501 * gating for the panel power sequencer or it will fail to
7502 * start up when no ports are active.
7503 */
7504 I915_WRITE(SOUTH_DSPCLK_GATE_D, PCH_DPLSUNIT_CLOCK_GATE_DISABLE);
7505 I915_WRITE(SOUTH_CHICKEN2, I915_READ(SOUTH_CHICKEN2) |
7506 DPLS_EDP_PPS_FIX_DIS);
7507}
7508
7509static void ironlake_teardown_rc6(struct drm_device *dev)
7510{
7511 struct drm_i915_private *dev_priv = dev->dev_private;
7512
7513 if (dev_priv->renderctx) {
7514 i915_gem_object_unpin(dev_priv->renderctx);
7515 drm_gem_object_unreference(&dev_priv->renderctx->base);
7516 dev_priv->renderctx = NULL;
7517 }
7518
7519 if (dev_priv->pwrctx) {
7520 i915_gem_object_unpin(dev_priv->pwrctx);
7521 drm_gem_object_unreference(&dev_priv->pwrctx->base);
7522 dev_priv->pwrctx = NULL;
7523 }
7524}
7525
7526static void ironlake_disable_rc6(struct drm_device *dev)
7527{
7528 struct drm_i915_private *dev_priv = dev->dev_private;
7529
7530 if (I915_READ(PWRCTXA)) {
7531 /* Wake the GPU, prevent RC6, then restore RSTDBYCTL */
7532 I915_WRITE(RSTDBYCTL, I915_READ(RSTDBYCTL) | RCX_SW_EXIT);
7533 wait_for(((I915_READ(RSTDBYCTL) & RSX_STATUS_MASK) == RSX_STATUS_ON),
7534 50);
7535
7536 I915_WRITE(PWRCTXA, 0);
7537 POSTING_READ(PWRCTXA);
7538
7539 I915_WRITE(RSTDBYCTL, I915_READ(RSTDBYCTL) & ~RCX_SW_EXIT);
7540 POSTING_READ(RSTDBYCTL);
7541 }
7542
7543 ironlake_teardown_rc6(dev);
7544}
7545
7546static int ironlake_setup_rc6(struct drm_device *dev)
7547{
7548 struct drm_i915_private *dev_priv = dev->dev_private;
7549
7550 if (dev_priv->renderctx == NULL)
7551 dev_priv->renderctx = intel_alloc_context_page(dev);
7552 if (!dev_priv->renderctx)
7553 return -ENOMEM;
7554
7555 if (dev_priv->pwrctx == NULL)
7556 dev_priv->pwrctx = intel_alloc_context_page(dev);
7557 if (!dev_priv->pwrctx) {
7558 ironlake_teardown_rc6(dev);
7559 return -ENOMEM;
7560 }
7561
7562 return 0;
7563}
7564
7565void ironlake_enable_rc6(struct drm_device *dev)
7566{
7567 struct drm_i915_private *dev_priv = dev->dev_private;
7568 int ret;
7569
7570 /* rc6 disabled by default due to repeated reports of hanging during
7571 * boot and resume.
7572 */
7573 if (!i915_enable_rc6)
7574 return;
7575
7576 mutex_lock(&dev->struct_mutex);
7577 ret = ironlake_setup_rc6(dev);
7578 if (ret) {
7579 mutex_unlock(&dev->struct_mutex);
5717 return; 7580 return;
5718 } else if (IS_G4X(dev)) {
5719 uint32_t dspclk_gate;
5720 I915_WRITE(RENCLK_GATE_D1, 0);
5721 I915_WRITE(RENCLK_GATE_D2, VF_UNIT_CLOCK_GATE_DISABLE |
5722 GS_UNIT_CLOCK_GATE_DISABLE |
5723 CL_UNIT_CLOCK_GATE_DISABLE);
5724 I915_WRITE(RAMCLK_GATE_D, 0);
5725 dspclk_gate = VRHUNIT_CLOCK_GATE_DISABLE |
5726 OVRUNIT_CLOCK_GATE_DISABLE |
5727 OVCUNIT_CLOCK_GATE_DISABLE;
5728 if (IS_GM45(dev))
5729 dspclk_gate |= DSSUNIT_CLOCK_GATE_DISABLE;
5730 I915_WRITE(DSPCLK_GATE_D, dspclk_gate);
5731 } else if (IS_I965GM(dev)) {
5732 I915_WRITE(RENCLK_GATE_D1, I965_RCC_CLOCK_GATE_DISABLE);
5733 I915_WRITE(RENCLK_GATE_D2, 0);
5734 I915_WRITE(DSPCLK_GATE_D, 0);
5735 I915_WRITE(RAMCLK_GATE_D, 0);
5736 I915_WRITE16(DEUC, 0);
5737 } else if (IS_I965G(dev)) {
5738 I915_WRITE(RENCLK_GATE_D1, I965_RCZ_CLOCK_GATE_DISABLE |
5739 I965_RCC_CLOCK_GATE_DISABLE |
5740 I965_RCPB_CLOCK_GATE_DISABLE |
5741 I965_ISC_CLOCK_GATE_DISABLE |
5742 I965_FBC_CLOCK_GATE_DISABLE);
5743 I915_WRITE(RENCLK_GATE_D2, 0);
5744 } else if (IS_I9XX(dev)) {
5745 u32 dstate = I915_READ(D_STATE);
5746
5747 dstate |= DSTATE_PLL_D3_OFF | DSTATE_GFX_CLOCK_GATING |
5748 DSTATE_DOT_CLOCK_GATING;
5749 I915_WRITE(D_STATE, dstate);
5750 } else if (IS_I85X(dev) || IS_I865G(dev)) {
5751 I915_WRITE(RENCLK_GATE_D1, SV_CLOCK_GATE_DISABLE);
5752 } else if (IS_I830(dev)) {
5753 I915_WRITE(DSPCLK_GATE_D, OVRUNIT_CLOCK_GATE_DISABLE);
5754 } 7581 }
5755 7582
5756 /* 7583 /*
5757 * GPU can automatically power down the render unit if given a page 7584 * GPU can automatically power down the render unit if given a page
5758 * to save state. 7585 * to save state.
5759 */ 7586 */
5760 if (IS_IRONLAKE_M(dev)) { 7587 ret = BEGIN_LP_RING(6);
5761 if (dev_priv->renderctx == NULL) 7588 if (ret) {
5762 dev_priv->renderctx = intel_alloc_context_page(dev); 7589 ironlake_teardown_rc6(dev);
5763 if (dev_priv->renderctx) { 7590 mutex_unlock(&dev->struct_mutex);
5764 struct drm_i915_gem_object *obj_priv; 7591 return;
5765 obj_priv = to_intel_bo(dev_priv->renderctx);
5766 if (obj_priv) {
5767 BEGIN_LP_RING(4);
5768 OUT_RING(MI_SET_CONTEXT);
5769 OUT_RING(obj_priv->gtt_offset |
5770 MI_MM_SPACE_GTT |
5771 MI_SAVE_EXT_STATE_EN |
5772 MI_RESTORE_EXT_STATE_EN |
5773 MI_RESTORE_INHIBIT);
5774 OUT_RING(MI_NOOP);
5775 OUT_RING(MI_FLUSH);
5776 ADVANCE_LP_RING();
5777 }
5778 } else
5779 DRM_DEBUG_KMS("Failed to allocate render context."
5780 "Disable RC6\n");
5781 } 7592 }
5782 7593
5783 if (I915_HAS_RC6(dev) && drm_core_check_feature(dev, DRIVER_MODESET)) { 7594 OUT_RING(MI_SUSPEND_FLUSH | MI_SUSPEND_FLUSH_EN);
5784 struct drm_i915_gem_object *obj_priv = NULL; 7595 OUT_RING(MI_SET_CONTEXT);
7596 OUT_RING(dev_priv->renderctx->gtt_offset |
7597 MI_MM_SPACE_GTT |
7598 MI_SAVE_EXT_STATE_EN |
7599 MI_RESTORE_EXT_STATE_EN |
7600 MI_RESTORE_INHIBIT);
7601 OUT_RING(MI_SUSPEND_FLUSH);
7602 OUT_RING(MI_NOOP);
7603 OUT_RING(MI_FLUSH);
7604 ADVANCE_LP_RING();
5785 7605
5786 if (dev_priv->pwrctx) { 7606 /*
5787 obj_priv = to_intel_bo(dev_priv->pwrctx); 7607 * Wait for the command parser to advance past MI_SET_CONTEXT. The HW
5788 } else { 7608 * does an implicit flush, combined with MI_FLUSH above, it should be
5789 struct drm_gem_object *pwrctx; 7609 * safe to assume that renderctx is valid
7610 */
7611 ret = intel_wait_ring_idle(LP_RING(dev_priv));
7612 if (ret) {
7613 DRM_ERROR("failed to enable ironlake power power savings\n");
7614 ironlake_teardown_rc6(dev);
7615 mutex_unlock(&dev->struct_mutex);
7616 return;
7617 }
5790 7618
5791 pwrctx = intel_alloc_context_page(dev); 7619 I915_WRITE(PWRCTXA, dev_priv->pwrctx->gtt_offset | PWRCTX_EN);
5792 if (pwrctx) { 7620 I915_WRITE(RSTDBYCTL, I915_READ(RSTDBYCTL) & ~RCX_SW_EXIT);
5793 dev_priv->pwrctx = pwrctx; 7621 mutex_unlock(&dev->struct_mutex);
5794 obj_priv = to_intel_bo(pwrctx); 7622}
5795 }
5796 }
5797 7623
5798 if (obj_priv) { 7624void intel_init_clock_gating(struct drm_device *dev)
5799 I915_WRITE(PWRCTXA, obj_priv->gtt_offset | PWRCTX_EN); 7625{
5800 I915_WRITE(MCHBAR_RENDER_STANDBY, 7626 struct drm_i915_private *dev_priv = dev->dev_private;
5801 I915_READ(MCHBAR_RENDER_STANDBY) & ~RCX_SW_EXIT); 7627
5802 } 7628 dev_priv->display.init_clock_gating(dev);
5803 } 7629
7630 if (dev_priv->display.init_pch_clock_gating)
7631 dev_priv->display.init_pch_clock_gating(dev);
5804} 7632}
5805 7633
5806/* Set up chip specific display functions */ 7634/* Set up chip specific display functions */
@@ -5809,13 +7637,16 @@ static void intel_init_display(struct drm_device *dev)
5809 struct drm_i915_private *dev_priv = dev->dev_private; 7637 struct drm_i915_private *dev_priv = dev->dev_private;
5810 7638
5811 /* We always want a DPMS function */ 7639 /* We always want a DPMS function */
5812 if (HAS_PCH_SPLIT(dev)) 7640 if (HAS_PCH_SPLIT(dev)) {
5813 dev_priv->display.dpms = ironlake_crtc_dpms; 7641 dev_priv->display.dpms = ironlake_crtc_dpms;
5814 else 7642 dev_priv->display.crtc_mode_set = ironlake_crtc_mode_set;
7643 } else {
5815 dev_priv->display.dpms = i9xx_crtc_dpms; 7644 dev_priv->display.dpms = i9xx_crtc_dpms;
7645 dev_priv->display.crtc_mode_set = i9xx_crtc_mode_set;
7646 }
5816 7647
5817 if (I915_HAS_FBC(dev)) { 7648 if (I915_HAS_FBC(dev)) {
5818 if (IS_IRONLAKE_M(dev)) { 7649 if (HAS_PCH_SPLIT(dev)) {
5819 dev_priv->display.fbc_enabled = ironlake_fbc_enabled; 7650 dev_priv->display.fbc_enabled = ironlake_fbc_enabled;
5820 dev_priv->display.enable_fbc = ironlake_enable_fbc; 7651 dev_priv->display.enable_fbc = ironlake_enable_fbc;
5821 dev_priv->display.disable_fbc = ironlake_disable_fbc; 7652 dev_priv->display.disable_fbc = ironlake_disable_fbc;
@@ -5823,7 +7654,7 @@ static void intel_init_display(struct drm_device *dev)
5823 dev_priv->display.fbc_enabled = g4x_fbc_enabled; 7654 dev_priv->display.fbc_enabled = g4x_fbc_enabled;
5824 dev_priv->display.enable_fbc = g4x_enable_fbc; 7655 dev_priv->display.enable_fbc = g4x_enable_fbc;
5825 dev_priv->display.disable_fbc = g4x_disable_fbc; 7656 dev_priv->display.disable_fbc = g4x_disable_fbc;
5826 } else if (IS_I965GM(dev)) { 7657 } else if (IS_CRESTLINE(dev)) {
5827 dev_priv->display.fbc_enabled = i8xx_fbc_enabled; 7658 dev_priv->display.fbc_enabled = i8xx_fbc_enabled;
5828 dev_priv->display.enable_fbc = i8xx_enable_fbc; 7659 dev_priv->display.enable_fbc = i8xx_enable_fbc;
5829 dev_priv->display.disable_fbc = i8xx_disable_fbc; 7660 dev_priv->display.disable_fbc = i8xx_disable_fbc;
@@ -5856,7 +7687,12 @@ static void intel_init_display(struct drm_device *dev)
5856 7687
5857 /* For FIFO watermark updates */ 7688 /* For FIFO watermark updates */
5858 if (HAS_PCH_SPLIT(dev)) { 7689 if (HAS_PCH_SPLIT(dev)) {
5859 if (IS_IRONLAKE(dev)) { 7690 if (HAS_PCH_IBX(dev))
7691 dev_priv->display.init_pch_clock_gating = ibx_init_clock_gating;
7692 else if (HAS_PCH_CPT(dev))
7693 dev_priv->display.init_pch_clock_gating = cpt_init_clock_gating;
7694
7695 if (IS_GEN5(dev)) {
5860 if (I915_READ(MLTR_ILK) & ILK_SRLT_MASK) 7696 if (I915_READ(MLTR_ILK) & ILK_SRLT_MASK)
5861 dev_priv->display.update_wm = ironlake_update_wm; 7697 dev_priv->display.update_wm = ironlake_update_wm;
5862 else { 7698 else {
@@ -5864,6 +7700,30 @@ static void intel_init_display(struct drm_device *dev)
5864 "Disable CxSR\n"); 7700 "Disable CxSR\n");
5865 dev_priv->display.update_wm = NULL; 7701 dev_priv->display.update_wm = NULL;
5866 } 7702 }
7703 dev_priv->display.fdi_link_train = ironlake_fdi_link_train;
7704 dev_priv->display.init_clock_gating = ironlake_init_clock_gating;
7705 } else if (IS_GEN6(dev)) {
7706 if (SNB_READ_WM0_LATENCY()) {
7707 dev_priv->display.update_wm = sandybridge_update_wm;
7708 } else {
7709 DRM_DEBUG_KMS("Failed to read display plane latency. "
7710 "Disable CxSR\n");
7711 dev_priv->display.update_wm = NULL;
7712 }
7713 dev_priv->display.fdi_link_train = gen6_fdi_link_train;
7714 dev_priv->display.init_clock_gating = gen6_init_clock_gating;
7715 } else if (IS_IVYBRIDGE(dev)) {
7716 /* FIXME: detect B0+ stepping and use auto training */
7717 dev_priv->display.fdi_link_train = ivb_manual_fdi_link_train;
7718 if (SNB_READ_WM0_LATENCY()) {
7719 dev_priv->display.update_wm = sandybridge_update_wm;
7720 } else {
7721 DRM_DEBUG_KMS("Failed to read display plane latency. "
7722 "Disable CxSR\n");
7723 dev_priv->display.update_wm = NULL;
7724 }
7725 dev_priv->display.init_clock_gating = ivybridge_init_clock_gating;
7726
5867 } else 7727 } else
5868 dev_priv->display.update_wm = NULL; 7728 dev_priv->display.update_wm = NULL;
5869 } else if (IS_PINEVIEW(dev)) { 7729 } else if (IS_PINEVIEW(dev)) {
@@ -5881,23 +7741,61 @@ static void intel_init_display(struct drm_device *dev)
5881 dev_priv->display.update_wm = NULL; 7741 dev_priv->display.update_wm = NULL;
5882 } else 7742 } else
5883 dev_priv->display.update_wm = pineview_update_wm; 7743 dev_priv->display.update_wm = pineview_update_wm;
5884 } else if (IS_G4X(dev)) 7744 dev_priv->display.init_clock_gating = gen3_init_clock_gating;
7745 } else if (IS_G4X(dev)) {
5885 dev_priv->display.update_wm = g4x_update_wm; 7746 dev_priv->display.update_wm = g4x_update_wm;
5886 else if (IS_I965G(dev)) 7747 dev_priv->display.init_clock_gating = g4x_init_clock_gating;
7748 } else if (IS_GEN4(dev)) {
5887 dev_priv->display.update_wm = i965_update_wm; 7749 dev_priv->display.update_wm = i965_update_wm;
5888 else if (IS_I9XX(dev)) { 7750 if (IS_CRESTLINE(dev))
7751 dev_priv->display.init_clock_gating = crestline_init_clock_gating;
7752 else if (IS_BROADWATER(dev))
7753 dev_priv->display.init_clock_gating = broadwater_init_clock_gating;
7754 } else if (IS_GEN3(dev)) {
5889 dev_priv->display.update_wm = i9xx_update_wm; 7755 dev_priv->display.update_wm = i9xx_update_wm;
5890 dev_priv->display.get_fifo_size = i9xx_get_fifo_size; 7756 dev_priv->display.get_fifo_size = i9xx_get_fifo_size;
7757 dev_priv->display.init_clock_gating = gen3_init_clock_gating;
7758 } else if (IS_I865G(dev)) {
7759 dev_priv->display.update_wm = i830_update_wm;
7760 dev_priv->display.init_clock_gating = i85x_init_clock_gating;
7761 dev_priv->display.get_fifo_size = i830_get_fifo_size;
5891 } else if (IS_I85X(dev)) { 7762 } else if (IS_I85X(dev)) {
5892 dev_priv->display.update_wm = i9xx_update_wm; 7763 dev_priv->display.update_wm = i9xx_update_wm;
5893 dev_priv->display.get_fifo_size = i85x_get_fifo_size; 7764 dev_priv->display.get_fifo_size = i85x_get_fifo_size;
7765 dev_priv->display.init_clock_gating = i85x_init_clock_gating;
5894 } else { 7766 } else {
5895 dev_priv->display.update_wm = i830_update_wm; 7767 dev_priv->display.update_wm = i830_update_wm;
7768 dev_priv->display.init_clock_gating = i830_init_clock_gating;
5896 if (IS_845G(dev)) 7769 if (IS_845G(dev))
5897 dev_priv->display.get_fifo_size = i845_get_fifo_size; 7770 dev_priv->display.get_fifo_size = i845_get_fifo_size;
5898 else 7771 else
5899 dev_priv->display.get_fifo_size = i830_get_fifo_size; 7772 dev_priv->display.get_fifo_size = i830_get_fifo_size;
5900 } 7773 }
7774
7775 /* Default just returns -ENODEV to indicate unsupported */
7776 dev_priv->display.queue_flip = intel_default_queue_flip;
7777
7778 switch (INTEL_INFO(dev)->gen) {
7779 case 2:
7780 dev_priv->display.queue_flip = intel_gen2_queue_flip;
7781 break;
7782
7783 case 3:
7784 dev_priv->display.queue_flip = intel_gen3_queue_flip;
7785 break;
7786
7787 case 4:
7788 case 5:
7789 dev_priv->display.queue_flip = intel_gen4_queue_flip;
7790 break;
7791
7792 case 6:
7793 dev_priv->display.queue_flip = intel_gen6_queue_flip;
7794 break;
7795 case 7:
7796 dev_priv->display.queue_flip = intel_gen7_queue_flip;
7797 break;
7798 }
5901} 7799}
5902 7800
5903/* 7801/*
@@ -5913,6 +7811,15 @@ static void quirk_pipea_force (struct drm_device *dev)
5913 DRM_DEBUG_DRIVER("applying pipe a force quirk\n"); 7811 DRM_DEBUG_DRIVER("applying pipe a force quirk\n");
5914} 7812}
5915 7813
7814/*
7815 * Some machines (Lenovo U160) do not work with SSC on LVDS for some reason
7816 */
7817static void quirk_ssc_force_disable(struct drm_device *dev)
7818{
7819 struct drm_i915_private *dev_priv = dev->dev_private;
7820 dev_priv->quirks |= QUIRK_LVDS_SSC_DISABLE;
7821}
7822
5916struct intel_quirk { 7823struct intel_quirk {
5917 int device; 7824 int device;
5918 int subsystem_vendor; 7825 int subsystem_vendor;
@@ -5941,6 +7848,9 @@ struct intel_quirk intel_quirks[] = {
5941 /* 855 & before need to leave pipe A & dpll A up */ 7848 /* 855 & before need to leave pipe A & dpll A up */
5942 { 0x3582, PCI_ANY_ID, PCI_ANY_ID, quirk_pipea_force }, 7849 { 0x3582, PCI_ANY_ID, PCI_ANY_ID, quirk_pipea_force },
5943 { 0x2562, PCI_ANY_ID, PCI_ANY_ID, quirk_pipea_force }, 7850 { 0x2562, PCI_ANY_ID, PCI_ANY_ID, quirk_pipea_force },
7851
7852 /* Lenovo U160 cannot use SSC on LVDS */
7853 { 0x0046, 0x17aa, 0x3920, quirk_ssc_force_disable },
5944}; 7854};
5945 7855
5946static void intel_init_quirks(struct drm_device *dev) 7856static void intel_init_quirks(struct drm_device *dev)
@@ -5999,27 +7909,18 @@ void intel_modeset_init(struct drm_device *dev)
5999 7909
6000 intel_init_display(dev); 7910 intel_init_display(dev);
6001 7911
6002 if (IS_I965G(dev)) { 7912 if (IS_GEN2(dev)) {
6003 dev->mode_config.max_width = 8192; 7913 dev->mode_config.max_width = 2048;
6004 dev->mode_config.max_height = 8192; 7914 dev->mode_config.max_height = 2048;
6005 } else if (IS_I9XX(dev)) { 7915 } else if (IS_GEN3(dev)) {
6006 dev->mode_config.max_width = 4096; 7916 dev->mode_config.max_width = 4096;
6007 dev->mode_config.max_height = 4096; 7917 dev->mode_config.max_height = 4096;
6008 } else { 7918 } else {
6009 dev->mode_config.max_width = 2048; 7919 dev->mode_config.max_width = 8192;
6010 dev->mode_config.max_height = 2048; 7920 dev->mode_config.max_height = 8192;
6011 } 7921 }
7922 dev->mode_config.fb_base = dev->agp->base;
6012 7923
6013 /* set memory base */
6014 if (IS_I9XX(dev))
6015 dev->mode_config.fb_base = pci_resource_start(dev->pdev, 2);
6016 else
6017 dev->mode_config.fb_base = pci_resource_start(dev->pdev, 0);
6018
6019 if (IS_MOBILE(dev) || IS_I9XX(dev))
6020 dev_priv->num_pipe = 2;
6021 else
6022 dev_priv->num_pipe = 1;
6023 DRM_DEBUG_KMS("%d display pipe%s available.\n", 7924 DRM_DEBUG_KMS("%d display pipe%s available.\n",
6024 dev_priv->num_pipe, dev_priv->num_pipe > 1 ? "s" : ""); 7925 dev_priv->num_pipe, dev_priv->num_pipe > 1 ? "s" : "");
6025 7926
@@ -6027,21 +7928,29 @@ void intel_modeset_init(struct drm_device *dev)
6027 intel_crtc_init(dev, i); 7928 intel_crtc_init(dev, i);
6028 } 7929 }
6029 7930
7931 /* Just disable it once at startup */
7932 i915_disable_vga(dev);
6030 intel_setup_outputs(dev); 7933 intel_setup_outputs(dev);
6031 7934
6032 intel_init_clock_gating(dev); 7935 intel_init_clock_gating(dev);
6033 7936
6034 /* Just disable it once at startup */
6035 i915_disable_vga(dev);
6036
6037 if (IS_IRONLAKE_M(dev)) { 7937 if (IS_IRONLAKE_M(dev)) {
6038 ironlake_enable_drps(dev); 7938 ironlake_enable_drps(dev);
6039 intel_init_emon(dev); 7939 intel_init_emon(dev);
6040 } 7940 }
6041 7941
7942 if (IS_GEN6(dev))
7943 gen6_enable_rps(dev_priv);
7944
6042 INIT_WORK(&dev_priv->idle_work, intel_idle_update); 7945 INIT_WORK(&dev_priv->idle_work, intel_idle_update);
6043 setup_timer(&dev_priv->idle_timer, intel_gpu_idle_timer, 7946 setup_timer(&dev_priv->idle_timer, intel_gpu_idle_timer,
6044 (unsigned long)dev); 7947 (unsigned long)dev);
7948}
7949
7950void intel_modeset_gem_init(struct drm_device *dev)
7951{
7952 if (IS_IRONLAKE_M(dev))
7953 ironlake_enable_rc6(dev);
6045 7954
6046 intel_setup_overlay(dev); 7955 intel_setup_overlay(dev);
6047} 7956}
@@ -6052,10 +7961,11 @@ void intel_modeset_cleanup(struct drm_device *dev)
6052 struct drm_crtc *crtc; 7961 struct drm_crtc *crtc;
6053 struct intel_crtc *intel_crtc; 7962 struct intel_crtc *intel_crtc;
6054 7963
7964 drm_kms_helper_poll_fini(dev);
6055 mutex_lock(&dev->struct_mutex); 7965 mutex_lock(&dev->struct_mutex);
6056 7966
6057 drm_kms_helper_poll_fini(dev); 7967 intel_unregister_dsm_handler();
6058 intel_fbdev_fini(dev); 7968
6059 7969
6060 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { 7970 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
6061 /* Skip inactive CRTCs */ 7971 /* Skip inactive CRTCs */
@@ -6063,67 +7973,52 @@ void intel_modeset_cleanup(struct drm_device *dev)
6063 continue; 7973 continue;
6064 7974
6065 intel_crtc = to_intel_crtc(crtc); 7975 intel_crtc = to_intel_crtc(crtc);
6066 intel_increase_pllclock(crtc, false); 7976 intel_increase_pllclock(crtc);
6067 del_timer_sync(&intel_crtc->idle_timer);
6068 } 7977 }
6069 7978
6070 del_timer_sync(&dev_priv->idle_timer);
6071
6072 if (dev_priv->display.disable_fbc) 7979 if (dev_priv->display.disable_fbc)
6073 dev_priv->display.disable_fbc(dev); 7980 dev_priv->display.disable_fbc(dev);
6074 7981
6075 if (dev_priv->renderctx) {
6076 struct drm_i915_gem_object *obj_priv;
6077
6078 obj_priv = to_intel_bo(dev_priv->renderctx);
6079 I915_WRITE(CCID, obj_priv->gtt_offset &~ CCID_EN);
6080 I915_READ(CCID);
6081 i915_gem_object_unpin(dev_priv->renderctx);
6082 drm_gem_object_unreference(dev_priv->renderctx);
6083 }
6084
6085 if (dev_priv->pwrctx) {
6086 struct drm_i915_gem_object *obj_priv;
6087
6088 obj_priv = to_intel_bo(dev_priv->pwrctx);
6089 I915_WRITE(PWRCTXA, obj_priv->gtt_offset &~ PWRCTX_EN);
6090 I915_READ(PWRCTXA);
6091 i915_gem_object_unpin(dev_priv->pwrctx);
6092 drm_gem_object_unreference(dev_priv->pwrctx);
6093 }
6094
6095 if (IS_IRONLAKE_M(dev)) 7982 if (IS_IRONLAKE_M(dev))
6096 ironlake_disable_drps(dev); 7983 ironlake_disable_drps(dev);
7984 if (IS_GEN6(dev))
7985 gen6_disable_rps(dev);
7986
7987 if (IS_IRONLAKE_M(dev))
7988 ironlake_disable_rc6(dev);
6097 7989
6098 mutex_unlock(&dev->struct_mutex); 7990 mutex_unlock(&dev->struct_mutex);
6099 7991
7992 /* Disable the irq before mode object teardown, for the irq might
7993 * enqueue unpin/hotplug work. */
7994 drm_irq_uninstall(dev);
7995 cancel_work_sync(&dev_priv->hotplug_work);
7996
7997 /* Shut off idle work before the crtcs get freed. */
7998 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
7999 intel_crtc = to_intel_crtc(crtc);
8000 del_timer_sync(&intel_crtc->idle_timer);
8001 }
8002 del_timer_sync(&dev_priv->idle_timer);
8003 cancel_work_sync(&dev_priv->idle_work);
8004
6100 drm_mode_config_cleanup(dev); 8005 drm_mode_config_cleanup(dev);
6101} 8006}
6102 8007
6103
6104/* 8008/*
6105 * Return which encoder is currently attached for connector. 8009 * Return which encoder is currently attached for connector.
6106 */ 8010 */
6107struct drm_encoder *intel_attached_encoder (struct drm_connector *connector) 8011struct drm_encoder *intel_best_encoder(struct drm_connector *connector)
6108{ 8012{
6109 struct drm_mode_object *obj; 8013 return &intel_attached_encoder(connector)->base;
6110 struct drm_encoder *encoder; 8014}
6111 int i;
6112
6113 for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
6114 if (connector->encoder_ids[i] == 0)
6115 break;
6116
6117 obj = drm_mode_object_find(connector->dev,
6118 connector->encoder_ids[i],
6119 DRM_MODE_OBJECT_ENCODER);
6120 if (!obj)
6121 continue;
6122 8015
6123 encoder = obj_to_encoder(obj); 8016void intel_connector_attach_encoder(struct intel_connector *connector,
6124 return encoder; 8017 struct intel_encoder *encoder)
6125 } 8018{
6126 return NULL; 8019 connector->encoder = encoder;
8020 drm_mode_connector_attach_encoder(&connector->base,
8021 &encoder->base);
6127} 8022}
6128 8023
6129/* 8024/*
@@ -6142,3 +8037,113 @@ int intel_modeset_vga_set_state(struct drm_device *dev, bool state)
6142 pci_write_config_word(dev_priv->bridge_dev, INTEL_GMCH_CTRL, gmch_ctrl); 8037 pci_write_config_word(dev_priv->bridge_dev, INTEL_GMCH_CTRL, gmch_ctrl);
6143 return 0; 8038 return 0;
6144} 8039}
8040
8041#ifdef CONFIG_DEBUG_FS
8042#include <linux/seq_file.h>
8043
8044struct intel_display_error_state {
8045 struct intel_cursor_error_state {
8046 u32 control;
8047 u32 position;
8048 u32 base;
8049 u32 size;
8050 } cursor[2];
8051
8052 struct intel_pipe_error_state {
8053 u32 conf;
8054 u32 source;
8055
8056 u32 htotal;
8057 u32 hblank;
8058 u32 hsync;
8059 u32 vtotal;
8060 u32 vblank;
8061 u32 vsync;
8062 } pipe[2];
8063
8064 struct intel_plane_error_state {
8065 u32 control;
8066 u32 stride;
8067 u32 size;
8068 u32 pos;
8069 u32 addr;
8070 u32 surface;
8071 u32 tile_offset;
8072 } plane[2];
8073};
8074
8075struct intel_display_error_state *
8076intel_display_capture_error_state(struct drm_device *dev)
8077{
8078 drm_i915_private_t *dev_priv = dev->dev_private;
8079 struct intel_display_error_state *error;
8080 int i;
8081
8082 error = kmalloc(sizeof(*error), GFP_ATOMIC);
8083 if (error == NULL)
8084 return NULL;
8085
8086 for (i = 0; i < 2; i++) {
8087 error->cursor[i].control = I915_READ(CURCNTR(i));
8088 error->cursor[i].position = I915_READ(CURPOS(i));
8089 error->cursor[i].base = I915_READ(CURBASE(i));
8090
8091 error->plane[i].control = I915_READ(DSPCNTR(i));
8092 error->plane[i].stride = I915_READ(DSPSTRIDE(i));
8093 error->plane[i].size = I915_READ(DSPSIZE(i));
8094 error->plane[i].pos= I915_READ(DSPPOS(i));
8095 error->plane[i].addr = I915_READ(DSPADDR(i));
8096 if (INTEL_INFO(dev)->gen >= 4) {
8097 error->plane[i].surface = I915_READ(DSPSURF(i));
8098 error->plane[i].tile_offset = I915_READ(DSPTILEOFF(i));
8099 }
8100
8101 error->pipe[i].conf = I915_READ(PIPECONF(i));
8102 error->pipe[i].source = I915_READ(PIPESRC(i));
8103 error->pipe[i].htotal = I915_READ(HTOTAL(i));
8104 error->pipe[i].hblank = I915_READ(HBLANK(i));
8105 error->pipe[i].hsync = I915_READ(HSYNC(i));
8106 error->pipe[i].vtotal = I915_READ(VTOTAL(i));
8107 error->pipe[i].vblank = I915_READ(VBLANK(i));
8108 error->pipe[i].vsync = I915_READ(VSYNC(i));
8109 }
8110
8111 return error;
8112}
8113
8114void
8115intel_display_print_error_state(struct seq_file *m,
8116 struct drm_device *dev,
8117 struct intel_display_error_state *error)
8118{
8119 int i;
8120
8121 for (i = 0; i < 2; i++) {
8122 seq_printf(m, "Pipe [%d]:\n", i);
8123 seq_printf(m, " CONF: %08x\n", error->pipe[i].conf);
8124 seq_printf(m, " SRC: %08x\n", error->pipe[i].source);
8125 seq_printf(m, " HTOTAL: %08x\n", error->pipe[i].htotal);
8126 seq_printf(m, " HBLANK: %08x\n", error->pipe[i].hblank);
8127 seq_printf(m, " HSYNC: %08x\n", error->pipe[i].hsync);
8128 seq_printf(m, " VTOTAL: %08x\n", error->pipe[i].vtotal);
8129 seq_printf(m, " VBLANK: %08x\n", error->pipe[i].vblank);
8130 seq_printf(m, " VSYNC: %08x\n", error->pipe[i].vsync);
8131
8132 seq_printf(m, "Plane [%d]:\n", i);
8133 seq_printf(m, " CNTR: %08x\n", error->plane[i].control);
8134 seq_printf(m, " STRIDE: %08x\n", error->plane[i].stride);
8135 seq_printf(m, " SIZE: %08x\n", error->plane[i].size);
8136 seq_printf(m, " POS: %08x\n", error->plane[i].pos);
8137 seq_printf(m, " ADDR: %08x\n", error->plane[i].addr);
8138 if (INTEL_INFO(dev)->gen >= 4) {
8139 seq_printf(m, " SURF: %08x\n", error->plane[i].surface);
8140 seq_printf(m, " TILEOFF: %08x\n", error->plane[i].tile_offset);
8141 }
8142
8143 seq_printf(m, "Cursor [%d]:\n", i);
8144 seq_printf(m, " CNTR: %08x\n", error->cursor[i].control);
8145 seq_printf(m, " POS: %08x\n", error->cursor[i].position);
8146 seq_printf(m, " BASE: %08x\n", error->cursor[i].base);
8147 }
8148}
8149#endif
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index 9ab8708ac6ba..e2aced6eec4c 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -42,30 +42,81 @@
42 42
43#define DP_LINK_CONFIGURATION_SIZE 9 43#define DP_LINK_CONFIGURATION_SIZE 9
44 44
45#define IS_eDP(i) ((i)->base.type == INTEL_OUTPUT_EDP)
46#define IS_PCH_eDP(i) ((i)->is_pch_edp)
47
48struct intel_dp { 45struct intel_dp {
49 struct intel_encoder base; 46 struct intel_encoder base;
50 uint32_t output_reg; 47 uint32_t output_reg;
51 uint32_t DP; 48 uint32_t DP;
52 uint8_t link_configuration[DP_LINK_CONFIGURATION_SIZE]; 49 uint8_t link_configuration[DP_LINK_CONFIGURATION_SIZE];
53 bool has_audio; 50 bool has_audio;
54 int dpms_mode; 51 int force_audio;
52 uint32_t color_range;
55 uint8_t link_bw; 53 uint8_t link_bw;
56 uint8_t lane_count; 54 uint8_t lane_count;
57 uint8_t dpcd[4]; 55 uint8_t dpcd[4];
58 struct i2c_adapter adapter; 56 struct i2c_adapter adapter;
59 struct i2c_algo_dp_aux_data algo; 57 struct i2c_algo_dp_aux_data algo;
60 bool is_pch_edp; 58 bool is_pch_edp;
59 uint8_t train_set[4];
60 uint8_t link_status[DP_LINK_STATUS_SIZE];
61}; 61};
62 62
63/**
64 * is_edp - is the given port attached to an eDP panel (either CPU or PCH)
65 * @intel_dp: DP struct
66 *
67 * If a CPU or PCH DP output is attached to an eDP panel, this function
68 * will return true, and false otherwise.
69 */
70static bool is_edp(struct intel_dp *intel_dp)
71{
72 return intel_dp->base.type == INTEL_OUTPUT_EDP;
73}
74
75/**
76 * is_pch_edp - is the port on the PCH and attached to an eDP panel?
77 * @intel_dp: DP struct
78 *
79 * Returns true if the given DP struct corresponds to a PCH DP port attached
80 * to an eDP panel, false otherwise. Helpful for determining whether we
81 * may need FDI resources for a given DP output or not.
82 */
83static bool is_pch_edp(struct intel_dp *intel_dp)
84{
85 return intel_dp->is_pch_edp;
86}
87
63static struct intel_dp *enc_to_intel_dp(struct drm_encoder *encoder) 88static struct intel_dp *enc_to_intel_dp(struct drm_encoder *encoder)
64{ 89{
65 return container_of(enc_to_intel_encoder(encoder), struct intel_dp, base); 90 return container_of(encoder, struct intel_dp, base.base);
66} 91}
67 92
68static void intel_dp_link_train(struct intel_dp *intel_dp); 93static struct intel_dp *intel_attached_dp(struct drm_connector *connector)
94{
95 return container_of(intel_attached_encoder(connector),
96 struct intel_dp, base);
97}
98
99/**
100 * intel_encoder_is_pch_edp - is the given encoder a PCH attached eDP?
101 * @encoder: DRM encoder
102 *
103 * Return true if @encoder corresponds to a PCH attached eDP panel. Needed
104 * by intel_display.c.
105 */
106bool intel_encoder_is_pch_edp(struct drm_encoder *encoder)
107{
108 struct intel_dp *intel_dp;
109
110 if (!encoder)
111 return false;
112
113 intel_dp = enc_to_intel_dp(encoder);
114
115 return is_pch_edp(intel_dp);
116}
117
118static void intel_dp_start_link_train(struct intel_dp *intel_dp);
119static void intel_dp_complete_link_train(struct intel_dp *intel_dp);
69static void intel_dp_link_down(struct intel_dp *intel_dp); 120static void intel_dp_link_down(struct intel_dp *intel_dp);
70 121
71void 122void
@@ -86,8 +137,8 @@ intel_dp_max_lane_count(struct intel_dp *intel_dp)
86{ 137{
87 int max_lane_count = 4; 138 int max_lane_count = 4;
88 139
89 if (intel_dp->dpcd[0] >= 0x11) { 140 if (intel_dp->dpcd[DP_DPCD_REV] >= 0x11) {
90 max_lane_count = intel_dp->dpcd[2] & 0x1f; 141 max_lane_count = intel_dp->dpcd[DP_MAX_LANE_COUNT] & 0x1f;
91 switch (max_lane_count) { 142 switch (max_lane_count) {
92 case 1: case 2: case 4: 143 case 1: case 2: case 4:
93 break; 144 break;
@@ -101,7 +152,7 @@ intel_dp_max_lane_count(struct intel_dp *intel_dp)
101static int 152static int
102intel_dp_max_link_bw(struct intel_dp *intel_dp) 153intel_dp_max_link_bw(struct intel_dp *intel_dp)
103{ 154{
104 int max_link_bw = intel_dp->dpcd[1]; 155 int max_link_bw = intel_dp->dpcd[DP_MAX_LINK_RATE];
105 156
106 switch (max_link_bw) { 157 switch (max_link_bw) {
107 case DP_LINK_BW_1_62: 158 case DP_LINK_BW_1_62:
@@ -129,8 +180,8 @@ intel_dp_link_required(struct drm_device *dev, struct intel_dp *intel_dp, int pi
129{ 180{
130 struct drm_i915_private *dev_priv = dev->dev_private; 181 struct drm_i915_private *dev_priv = dev->dev_private;
131 182
132 if (IS_eDP(intel_dp) || IS_PCH_eDP(intel_dp)) 183 if (is_edp(intel_dp))
133 return (pixel_clock * dev_priv->edp_bpp) / 8; 184 return (pixel_clock * dev_priv->edp.bpp + 7) / 8;
134 else 185 else
135 return pixel_clock * 3; 186 return pixel_clock * 3;
136} 187}
@@ -145,15 +196,13 @@ static int
145intel_dp_mode_valid(struct drm_connector *connector, 196intel_dp_mode_valid(struct drm_connector *connector,
146 struct drm_display_mode *mode) 197 struct drm_display_mode *mode)
147{ 198{
148 struct drm_encoder *encoder = intel_attached_encoder(connector); 199 struct intel_dp *intel_dp = intel_attached_dp(connector);
149 struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
150 struct drm_device *dev = connector->dev; 200 struct drm_device *dev = connector->dev;
151 struct drm_i915_private *dev_priv = dev->dev_private; 201 struct drm_i915_private *dev_priv = dev->dev_private;
152 int max_link_clock = intel_dp_link_clock(intel_dp_max_link_bw(intel_dp)); 202 int max_link_clock = intel_dp_link_clock(intel_dp_max_link_bw(intel_dp));
153 int max_lanes = intel_dp_max_lane_count(intel_dp); 203 int max_lanes = intel_dp_max_lane_count(intel_dp);
154 204
155 if ((IS_eDP(intel_dp) || IS_PCH_eDP(intel_dp)) && 205 if (is_edp(intel_dp) && dev_priv->panel_fixed_mode) {
156 dev_priv->panel_fixed_mode) {
157 if (mode->hdisplay > dev_priv->panel_fixed_mode->hdisplay) 206 if (mode->hdisplay > dev_priv->panel_fixed_mode->hdisplay)
158 return MODE_PANEL; 207 return MODE_PANEL;
159 208
@@ -161,9 +210,9 @@ intel_dp_mode_valid(struct drm_connector *connector,
161 return MODE_PANEL; 210 return MODE_PANEL;
162 } 211 }
163 212
164 /* only refuse the mode on non eDP since we have seen some wierd eDP panels 213 /* only refuse the mode on non eDP since we have seen some weird eDP panels
165 which are outside spec tolerances but somehow work by magic */ 214 which are outside spec tolerances but somehow work by magic */
166 if (!IS_eDP(intel_dp) && 215 if (!is_edp(intel_dp) &&
167 (intel_dp_link_required(connector->dev, intel_dp, mode->clock) 216 (intel_dp_link_required(connector->dev, intel_dp, mode->clock)
168 > intel_dp_max_data_rate(max_link_clock, max_lanes))) 217 > intel_dp_max_data_rate(max_link_clock, max_lanes)))
169 return MODE_CLOCK_HIGH; 218 return MODE_CLOCK_HIGH;
@@ -233,7 +282,7 @@ intel_dp_aux_ch(struct intel_dp *intel_dp,
233 uint8_t *recv, int recv_size) 282 uint8_t *recv, int recv_size)
234{ 283{
235 uint32_t output_reg = intel_dp->output_reg; 284 uint32_t output_reg = intel_dp->output_reg;
236 struct drm_device *dev = intel_dp->base.enc.dev; 285 struct drm_device *dev = intel_dp->base.base.dev;
237 struct drm_i915_private *dev_priv = dev->dev_private; 286 struct drm_i915_private *dev_priv = dev->dev_private;
238 uint32_t ch_ctl = output_reg + 0x10; 287 uint32_t ch_ctl = output_reg + 0x10;
239 uint32_t ch_data = ch_ctl + 4; 288 uint32_t ch_data = ch_ctl + 4;
@@ -246,8 +295,11 @@ intel_dp_aux_ch(struct intel_dp *intel_dp,
246 /* The clock divider is based off the hrawclk, 295 /* The clock divider is based off the hrawclk,
247 * and would like to run at 2MHz. So, take the 296 * and would like to run at 2MHz. So, take the
248 * hrawclk value and divide by 2 and use that 297 * hrawclk value and divide by 2 and use that
298 *
299 * Note that PCH attached eDP panels should use a 125MHz input
300 * clock divider.
249 */ 301 */
250 if (IS_eDP(intel_dp)) { 302 if (is_edp(intel_dp) && !is_pch_edp(intel_dp)) {
251 if (IS_GEN6(dev)) 303 if (IS_GEN6(dev))
252 aux_clock_divider = 200; /* SNB eDP input clock at 400Mhz */ 304 aux_clock_divider = 200; /* SNB eDP input clock at 400Mhz */
253 else 305 else
@@ -425,6 +477,7 @@ intel_dp_i2c_aux_ch(struct i2c_adapter *adapter, int mode,
425 uint16_t address = algo_data->address; 477 uint16_t address = algo_data->address;
426 uint8_t msg[5]; 478 uint8_t msg[5];
427 uint8_t reply[2]; 479 uint8_t reply[2];
480 unsigned retry;
428 int msg_bytes; 481 int msg_bytes;
429 int reply_bytes; 482 int reply_bytes;
430 int ret; 483 int ret;
@@ -459,14 +512,33 @@ intel_dp_i2c_aux_ch(struct i2c_adapter *adapter, int mode,
459 break; 512 break;
460 } 513 }
461 514
462 for (;;) { 515 for (retry = 0; retry < 5; retry++) {
463 ret = intel_dp_aux_ch(intel_dp, 516 ret = intel_dp_aux_ch(intel_dp,
464 msg, msg_bytes, 517 msg, msg_bytes,
465 reply, reply_bytes); 518 reply, reply_bytes);
466 if (ret < 0) { 519 if (ret < 0) {
467 DRM_DEBUG_KMS("aux_ch failed %d\n", ret); 520 DRM_DEBUG_KMS("aux_ch failed %d\n", ret);
468 return ret; 521 return ret;
469 } 522 }
523
524 switch (reply[0] & AUX_NATIVE_REPLY_MASK) {
525 case AUX_NATIVE_REPLY_ACK:
526 /* I2C-over-AUX Reply field is only valid
527 * when paired with AUX ACK.
528 */
529 break;
530 case AUX_NATIVE_REPLY_NACK:
531 DRM_DEBUG_KMS("aux_ch native nack\n");
532 return -EREMOTEIO;
533 case AUX_NATIVE_REPLY_DEFER:
534 udelay(100);
535 continue;
536 default:
537 DRM_ERROR("aux_ch invalid native reply 0x%02x\n",
538 reply[0]);
539 return -EREMOTEIO;
540 }
541
470 switch (reply[0] & AUX_I2C_REPLY_MASK) { 542 switch (reply[0] & AUX_I2C_REPLY_MASK) {
471 case AUX_I2C_REPLY_ACK: 543 case AUX_I2C_REPLY_ACK:
472 if (mode == MODE_I2C_READ) { 544 if (mode == MODE_I2C_READ) {
@@ -474,17 +546,20 @@ intel_dp_i2c_aux_ch(struct i2c_adapter *adapter, int mode,
474 } 546 }
475 return reply_bytes - 1; 547 return reply_bytes - 1;
476 case AUX_I2C_REPLY_NACK: 548 case AUX_I2C_REPLY_NACK:
477 DRM_DEBUG_KMS("aux_ch nack\n"); 549 DRM_DEBUG_KMS("aux_i2c nack\n");
478 return -EREMOTEIO; 550 return -EREMOTEIO;
479 case AUX_I2C_REPLY_DEFER: 551 case AUX_I2C_REPLY_DEFER:
480 DRM_DEBUG_KMS("aux_ch defer\n"); 552 DRM_DEBUG_KMS("aux_i2c defer\n");
481 udelay(100); 553 udelay(100);
482 break; 554 break;
483 default: 555 default:
484 DRM_ERROR("aux_ch invalid reply 0x%02x\n", reply[0]); 556 DRM_ERROR("aux_i2c invalid reply 0x%02x\n", reply[0]);
485 return -EREMOTEIO; 557 return -EREMOTEIO;
486 } 558 }
487 } 559 }
560
561 DRM_ERROR("too many retries, giving up\n");
562 return -EREMOTEIO;
488} 563}
489 564
490static int 565static int
@@ -519,8 +594,7 @@ intel_dp_mode_fixup(struct drm_encoder *encoder, struct drm_display_mode *mode,
519 int max_clock = intel_dp_max_link_bw(intel_dp) == DP_LINK_BW_2_7 ? 1 : 0; 594 int max_clock = intel_dp_max_link_bw(intel_dp) == DP_LINK_BW_2_7 ? 1 : 0;
520 static int bws[2] = { DP_LINK_BW_1_62, DP_LINK_BW_2_7 }; 595 static int bws[2] = { DP_LINK_BW_1_62, DP_LINK_BW_2_7 };
521 596
522 if ((IS_eDP(intel_dp) || IS_PCH_eDP(intel_dp)) && 597 if (is_edp(intel_dp) && dev_priv->panel_fixed_mode) {
523 dev_priv->panel_fixed_mode) {
524 intel_fixed_panel_mode(dev_priv->panel_fixed_mode, adjusted_mode); 598 intel_fixed_panel_mode(dev_priv->panel_fixed_mode, adjusted_mode);
525 intel_pch_panel_fitting(dev, DRM_MODE_SCALE_FULLSCREEN, 599 intel_pch_panel_fitting(dev, DRM_MODE_SCALE_FULLSCREEN,
526 mode, adjusted_mode); 600 mode, adjusted_mode);
@@ -549,7 +623,7 @@ intel_dp_mode_fixup(struct drm_encoder *encoder, struct drm_display_mode *mode,
549 } 623 }
550 } 624 }
551 625
552 if (IS_eDP(intel_dp) || IS_PCH_eDP(intel_dp)) { 626 if (is_edp(intel_dp)) {
553 /* okay we failed just pick the highest */ 627 /* okay we failed just pick the highest */
554 intel_dp->lane_count = max_lane_count; 628 intel_dp->lane_count = max_lane_count;
555 intel_dp->link_bw = bws[max_clock]; 629 intel_dp->link_bw = bws[max_clock];
@@ -598,25 +672,6 @@ intel_dp_compute_m_n(int bpp,
598 intel_reduce_ratio(&m_n->link_m, &m_n->link_n); 672 intel_reduce_ratio(&m_n->link_m, &m_n->link_n);
599} 673}
600 674
601bool intel_pch_has_edp(struct drm_crtc *crtc)
602{
603 struct drm_device *dev = crtc->dev;
604 struct drm_mode_config *mode_config = &dev->mode_config;
605 struct drm_encoder *encoder;
606
607 list_for_each_entry(encoder, &mode_config->encoder_list, head) {
608 struct intel_dp *intel_dp;
609
610 if (encoder->crtc != crtc)
611 continue;
612
613 intel_dp = enc_to_intel_dp(encoder);
614 if (intel_dp->base.type == INTEL_OUTPUT_DISPLAYPORT)
615 return intel_dp->is_pch_edp;
616 }
617 return false;
618}
619
620void 675void
621intel_dp_set_m_n(struct drm_crtc *crtc, struct drm_display_mode *mode, 676intel_dp_set_m_n(struct drm_crtc *crtc, struct drm_display_mode *mode,
622 struct drm_display_mode *adjusted_mode) 677 struct drm_display_mode *adjusted_mode)
@@ -628,6 +683,7 @@ intel_dp_set_m_n(struct drm_crtc *crtc, struct drm_display_mode *mode,
628 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 683 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
629 int lane_count = 4, bpp = 24; 684 int lane_count = 4, bpp = 24;
630 struct intel_dp_m_n m_n; 685 struct intel_dp_m_n m_n;
686 int pipe = intel_crtc->pipe;
631 687
632 /* 688 /*
633 * Find the lane count in the intel_encoder private 689 * Find the lane count in the intel_encoder private
@@ -641,8 +697,10 @@ intel_dp_set_m_n(struct drm_crtc *crtc, struct drm_display_mode *mode,
641 intel_dp = enc_to_intel_dp(encoder); 697 intel_dp = enc_to_intel_dp(encoder);
642 if (intel_dp->base.type == INTEL_OUTPUT_DISPLAYPORT) { 698 if (intel_dp->base.type == INTEL_OUTPUT_DISPLAYPORT) {
643 lane_count = intel_dp->lane_count; 699 lane_count = intel_dp->lane_count;
644 if (IS_PCH_eDP(intel_dp)) 700 break;
645 bpp = dev_priv->edp_bpp; 701 } else if (is_edp(intel_dp)) {
702 lane_count = dev_priv->edp.lanes;
703 bpp = dev_priv->edp.bpp;
646 break; 704 break;
647 } 705 }
648 } 706 }
@@ -656,39 +714,19 @@ intel_dp_set_m_n(struct drm_crtc *crtc, struct drm_display_mode *mode,
656 mode->clock, adjusted_mode->clock, &m_n); 714 mode->clock, adjusted_mode->clock, &m_n);
657 715
658 if (HAS_PCH_SPLIT(dev)) { 716 if (HAS_PCH_SPLIT(dev)) {
659 if (intel_crtc->pipe == 0) { 717 I915_WRITE(TRANSDATA_M1(pipe),
660 I915_WRITE(TRANSA_DATA_M1, 718 ((m_n.tu - 1) << PIPE_GMCH_DATA_M_TU_SIZE_SHIFT) |
661 ((m_n.tu - 1) << PIPE_GMCH_DATA_M_TU_SIZE_SHIFT) | 719 m_n.gmch_m);
662 m_n.gmch_m); 720 I915_WRITE(TRANSDATA_N1(pipe), m_n.gmch_n);
663 I915_WRITE(TRANSA_DATA_N1, m_n.gmch_n); 721 I915_WRITE(TRANSDPLINK_M1(pipe), m_n.link_m);
664 I915_WRITE(TRANSA_DP_LINK_M1, m_n.link_m); 722 I915_WRITE(TRANSDPLINK_N1(pipe), m_n.link_n);
665 I915_WRITE(TRANSA_DP_LINK_N1, m_n.link_n);
666 } else {
667 I915_WRITE(TRANSB_DATA_M1,
668 ((m_n.tu - 1) << PIPE_GMCH_DATA_M_TU_SIZE_SHIFT) |
669 m_n.gmch_m);
670 I915_WRITE(TRANSB_DATA_N1, m_n.gmch_n);
671 I915_WRITE(TRANSB_DP_LINK_M1, m_n.link_m);
672 I915_WRITE(TRANSB_DP_LINK_N1, m_n.link_n);
673 }
674 } else { 723 } else {
675 if (intel_crtc->pipe == 0) { 724 I915_WRITE(PIPE_GMCH_DATA_M(pipe),
676 I915_WRITE(PIPEA_GMCH_DATA_M, 725 ((m_n.tu - 1) << PIPE_GMCH_DATA_M_TU_SIZE_SHIFT) |
677 ((m_n.tu - 1) << PIPE_GMCH_DATA_M_TU_SIZE_SHIFT) | 726 m_n.gmch_m);
678 m_n.gmch_m); 727 I915_WRITE(PIPE_GMCH_DATA_N(pipe), m_n.gmch_n);
679 I915_WRITE(PIPEA_GMCH_DATA_N, 728 I915_WRITE(PIPE_DP_LINK_M(pipe), m_n.link_m);
680 m_n.gmch_n); 729 I915_WRITE(PIPE_DP_LINK_N(pipe), m_n.link_n);
681 I915_WRITE(PIPEA_DP_LINK_M, m_n.link_m);
682 I915_WRITE(PIPEA_DP_LINK_N, m_n.link_n);
683 } else {
684 I915_WRITE(PIPEB_GMCH_DATA_M,
685 ((m_n.tu - 1) << PIPE_GMCH_DATA_M_TU_SIZE_SHIFT) |
686 m_n.gmch_m);
687 I915_WRITE(PIPEB_GMCH_DATA_N,
688 m_n.gmch_n);
689 I915_WRITE(PIPEB_DP_LINK_M, m_n.link_m);
690 I915_WRITE(PIPEB_DP_LINK_N, m_n.link_n);
691 }
692 } 730 }
693} 731}
694 732
@@ -698,18 +736,18 @@ intel_dp_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode,
698{ 736{
699 struct drm_device *dev = encoder->dev; 737 struct drm_device *dev = encoder->dev;
700 struct intel_dp *intel_dp = enc_to_intel_dp(encoder); 738 struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
701 struct drm_crtc *crtc = intel_dp->base.enc.crtc; 739 struct drm_crtc *crtc = intel_dp->base.base.crtc;
702 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 740 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
703 741
704 intel_dp->DP = (DP_VOLTAGE_0_4 | 742 intel_dp->DP = DP_VOLTAGE_0_4 | DP_PRE_EMPHASIS_0;
705 DP_PRE_EMPHASIS_0); 743 intel_dp->DP |= intel_dp->color_range;
706 744
707 if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC) 745 if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC)
708 intel_dp->DP |= DP_SYNC_HS_HIGH; 746 intel_dp->DP |= DP_SYNC_HS_HIGH;
709 if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC) 747 if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC)
710 intel_dp->DP |= DP_SYNC_VS_HIGH; 748 intel_dp->DP |= DP_SYNC_VS_HIGH;
711 749
712 if (HAS_PCH_CPT(dev) && !IS_eDP(intel_dp)) 750 if (HAS_PCH_CPT(dev) && !is_edp(intel_dp))
713 intel_dp->DP |= DP_LINK_TRAIN_OFF_CPT; 751 intel_dp->DP |= DP_LINK_TRAIN_OFF_CPT;
714 else 752 else
715 intel_dp->DP |= DP_LINK_TRAIN_OFF; 753 intel_dp->DP |= DP_LINK_TRAIN_OFF;
@@ -735,7 +773,8 @@ intel_dp_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode,
735 /* 773 /*
736 * Check for DPCD version > 1.1 and enhanced framing support 774 * Check for DPCD version > 1.1 and enhanced framing support
737 */ 775 */
738 if (intel_dp->dpcd[0] >= 0x11 && (intel_dp->dpcd[2] & DP_ENHANCED_FRAME_CAP)) { 776 if (intel_dp->dpcd[DP_DPCD_REV] >= 0x11 &&
777 (intel_dp->dpcd[DP_MAX_LANE_COUNT] & DP_ENHANCED_FRAME_CAP)) {
739 intel_dp->link_configuration[1] |= DP_LANE_COUNT_ENHANCED_FRAME_EN; 778 intel_dp->link_configuration[1] |= DP_LANE_COUNT_ENHANCED_FRAME_EN;
740 intel_dp->DP |= DP_ENHANCED_FRAMING; 779 intel_dp->DP |= DP_ENHANCED_FRAMING;
741 } 780 }
@@ -744,7 +783,7 @@ intel_dp_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode,
744 if (intel_crtc->pipe == 1 && !HAS_PCH_CPT(dev)) 783 if (intel_crtc->pipe == 1 && !HAS_PCH_CPT(dev))
745 intel_dp->DP |= DP_PIPEB_SELECT; 784 intel_dp->DP |= DP_PIPEB_SELECT;
746 785
747 if (IS_eDP(intel_dp)) { 786 if (is_edp(intel_dp) && !is_pch_edp(intel_dp)) {
748 /* don't miss out required setting for eDP */ 787 /* don't miss out required setting for eDP */
749 intel_dp->DP |= DP_PLL_ENABLE; 788 intel_dp->DP |= DP_PLL_ENABLE;
750 if (adjusted_mode->clock < 200000) 789 if (adjusted_mode->clock < 200000)
@@ -754,13 +793,49 @@ intel_dp_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode,
754 } 793 }
755} 794}
756 795
757static void ironlake_edp_panel_on (struct drm_device *dev) 796static void ironlake_edp_panel_vdd_on(struct intel_dp *intel_dp)
797{
798 struct drm_device *dev = intel_dp->base.base.dev;
799 struct drm_i915_private *dev_priv = dev->dev_private;
800 u32 pp;
801
802 /*
803 * If the panel wasn't on, make sure there's not a currently
804 * active PP sequence before enabling AUX VDD.
805 */
806 if (!(I915_READ(PCH_PP_STATUS) & PP_ON))
807 msleep(dev_priv->panel_t3);
808
809 pp = I915_READ(PCH_PP_CONTROL);
810 pp |= EDP_FORCE_VDD;
811 I915_WRITE(PCH_PP_CONTROL, pp);
812 POSTING_READ(PCH_PP_CONTROL);
813}
814
815static void ironlake_edp_panel_vdd_off(struct intel_dp *intel_dp)
758{ 816{
817 struct drm_device *dev = intel_dp->base.base.dev;
759 struct drm_i915_private *dev_priv = dev->dev_private; 818 struct drm_i915_private *dev_priv = dev->dev_private;
760 u32 pp; 819 u32 pp;
761 820
821 pp = I915_READ(PCH_PP_CONTROL);
822 pp &= ~EDP_FORCE_VDD;
823 I915_WRITE(PCH_PP_CONTROL, pp);
824 POSTING_READ(PCH_PP_CONTROL);
825
826 /* Make sure sequencer is idle before allowing subsequent activity */
827 msleep(dev_priv->panel_t12);
828}
829
830/* Returns true if the panel was already on when called */
831static bool ironlake_edp_panel_on (struct intel_dp *intel_dp)
832{
833 struct drm_device *dev = intel_dp->base.base.dev;
834 struct drm_i915_private *dev_priv = dev->dev_private;
835 u32 pp, idle_on_mask = PP_ON | PP_SEQUENCE_STATE_ON_IDLE;
836
762 if (I915_READ(PCH_PP_STATUS) & PP_ON) 837 if (I915_READ(PCH_PP_STATUS) & PP_ON)
763 return; 838 return true;
764 839
765 pp = I915_READ(PCH_PP_CONTROL); 840 pp = I915_READ(PCH_PP_CONTROL);
766 841
@@ -771,21 +846,25 @@ static void ironlake_edp_panel_on (struct drm_device *dev)
771 846
772 pp |= PANEL_UNLOCK_REGS | POWER_TARGET_ON; 847 pp |= PANEL_UNLOCK_REGS | POWER_TARGET_ON;
773 I915_WRITE(PCH_PP_CONTROL, pp); 848 I915_WRITE(PCH_PP_CONTROL, pp);
849 POSTING_READ(PCH_PP_CONTROL);
774 850
775 if (wait_for(I915_READ(PCH_PP_STATUS) & PP_ON, 5000, 10)) 851 if (wait_for((I915_READ(PCH_PP_STATUS) & idle_on_mask) == idle_on_mask,
852 5000))
776 DRM_ERROR("panel on wait timed out: 0x%08x\n", 853 DRM_ERROR("panel on wait timed out: 0x%08x\n",
777 I915_READ(PCH_PP_STATUS)); 854 I915_READ(PCH_PP_STATUS));
778 855
779 pp &= ~(PANEL_UNLOCK_REGS | EDP_FORCE_VDD);
780 pp |= PANEL_POWER_RESET; /* restore panel reset bit */ 856 pp |= PANEL_POWER_RESET; /* restore panel reset bit */
781 I915_WRITE(PCH_PP_CONTROL, pp); 857 I915_WRITE(PCH_PP_CONTROL, pp);
782 POSTING_READ(PCH_PP_CONTROL); 858 POSTING_READ(PCH_PP_CONTROL);
859
860 return false;
783} 861}
784 862
785static void ironlake_edp_panel_off (struct drm_device *dev) 863static void ironlake_edp_panel_off (struct drm_device *dev)
786{ 864{
787 struct drm_i915_private *dev_priv = dev->dev_private; 865 struct drm_i915_private *dev_priv = dev->dev_private;
788 u32 pp; 866 u32 pp, idle_off_mask = PP_ON | PP_SEQUENCE_MASK |
867 PP_CYCLE_DELAY_ACTIVE | PP_SEQUENCE_STATE_MASK;
789 868
790 pp = I915_READ(PCH_PP_CONTROL); 869 pp = I915_READ(PCH_PP_CONTROL);
791 870
@@ -796,13 +875,13 @@ static void ironlake_edp_panel_off (struct drm_device *dev)
796 875
797 pp &= ~POWER_TARGET_ON; 876 pp &= ~POWER_TARGET_ON;
798 I915_WRITE(PCH_PP_CONTROL, pp); 877 I915_WRITE(PCH_PP_CONTROL, pp);
878 POSTING_READ(PCH_PP_CONTROL);
799 879
800 if (wait_for((I915_READ(PCH_PP_STATUS) & PP_ON) == 0, 5000, 10)) 880 if (wait_for((I915_READ(PCH_PP_STATUS) & idle_off_mask) == 0, 5000))
801 DRM_ERROR("panel off wait timed out: 0x%08x\n", 881 DRM_ERROR("panel off wait timed out: 0x%08x\n",
802 I915_READ(PCH_PP_STATUS)); 882 I915_READ(PCH_PP_STATUS));
803 883
804 /* Make sure VDD is enabled so DP AUX will work */ 884 pp |= PANEL_POWER_RESET; /* restore panel reset bit */
805 pp |= EDP_FORCE_VDD | PANEL_POWER_RESET; /* restore panel reset bit */
806 I915_WRITE(PCH_PP_CONTROL, pp); 885 I915_WRITE(PCH_PP_CONTROL, pp);
807 POSTING_READ(PCH_PP_CONTROL); 886 POSTING_READ(PCH_PP_CONTROL);
808} 887}
@@ -813,6 +892,13 @@ static void ironlake_edp_backlight_on (struct drm_device *dev)
813 u32 pp; 892 u32 pp;
814 893
815 DRM_DEBUG_KMS("\n"); 894 DRM_DEBUG_KMS("\n");
895 /*
896 * If we enable the backlight right away following a panel power
897 * on, we may see slight flicker as the panel syncs with the eDP
898 * link. So delay a bit to make sure the image is solid before
899 * allowing it to appear.
900 */
901 msleep(300);
816 pp = I915_READ(PCH_PP_CONTROL); 902 pp = I915_READ(PCH_PP_CONTROL);
817 pp |= EDP_BLC_ENABLE; 903 pp |= EDP_BLC_ENABLE;
818 I915_WRITE(PCH_PP_CONTROL, pp); 904 I915_WRITE(PCH_PP_CONTROL, pp);
@@ -837,8 +923,10 @@ static void ironlake_edp_pll_on(struct drm_encoder *encoder)
837 923
838 DRM_DEBUG_KMS("\n"); 924 DRM_DEBUG_KMS("\n");
839 dpa_ctl = I915_READ(DP_A); 925 dpa_ctl = I915_READ(DP_A);
840 dpa_ctl &= ~DP_PLL_ENABLE; 926 dpa_ctl |= DP_PLL_ENABLE;
841 I915_WRITE(DP_A, dpa_ctl); 927 I915_WRITE(DP_A, dpa_ctl);
928 POSTING_READ(DP_A);
929 udelay(200);
842} 930}
843 931
844static void ironlake_edp_pll_off(struct drm_encoder *encoder) 932static void ironlake_edp_pll_off(struct drm_encoder *encoder)
@@ -848,38 +936,79 @@ static void ironlake_edp_pll_off(struct drm_encoder *encoder)
848 u32 dpa_ctl; 936 u32 dpa_ctl;
849 937
850 dpa_ctl = I915_READ(DP_A); 938 dpa_ctl = I915_READ(DP_A);
851 dpa_ctl |= DP_PLL_ENABLE; 939 dpa_ctl &= ~DP_PLL_ENABLE;
852 I915_WRITE(DP_A, dpa_ctl); 940 I915_WRITE(DP_A, dpa_ctl);
941 POSTING_READ(DP_A);
853 udelay(200); 942 udelay(200);
854} 943}
855 944
945/* If the sink supports it, try to set the power state appropriately */
946static void intel_dp_sink_dpms(struct intel_dp *intel_dp, int mode)
947{
948 int ret, i;
949
950 /* Should have a valid DPCD by this point */
951 if (intel_dp->dpcd[DP_DPCD_REV] < 0x11)
952 return;
953
954 if (mode != DRM_MODE_DPMS_ON) {
955 ret = intel_dp_aux_native_write_1(intel_dp, DP_SET_POWER,
956 DP_SET_POWER_D3);
957 if (ret != 1)
958 DRM_DEBUG_DRIVER("failed to write sink power state\n");
959 } else {
960 /*
961 * When turning on, we need to retry for 1ms to give the sink
962 * time to wake up.
963 */
964 for (i = 0; i < 3; i++) {
965 ret = intel_dp_aux_native_write_1(intel_dp,
966 DP_SET_POWER,
967 DP_SET_POWER_D0);
968 if (ret == 1)
969 break;
970 msleep(1);
971 }
972 }
973}
974
856static void intel_dp_prepare(struct drm_encoder *encoder) 975static void intel_dp_prepare(struct drm_encoder *encoder)
857{ 976{
858 struct intel_dp *intel_dp = enc_to_intel_dp(encoder); 977 struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
859 struct drm_device *dev = encoder->dev; 978 struct drm_device *dev = encoder->dev;
860 struct drm_i915_private *dev_priv = dev->dev_private;
861 uint32_t dp_reg = I915_READ(intel_dp->output_reg);
862 979
863 if (IS_eDP(intel_dp)) { 980 /* Wake up the sink first */
981 intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_ON);
982
983 if (is_edp(intel_dp)) {
864 ironlake_edp_backlight_off(dev); 984 ironlake_edp_backlight_off(dev);
865 ironlake_edp_panel_on(dev); 985 ironlake_edp_panel_off(dev);
866 ironlake_edp_pll_on(encoder); 986 if (!is_pch_edp(intel_dp))
987 ironlake_edp_pll_on(encoder);
988 else
989 ironlake_edp_pll_off(encoder);
867 } 990 }
868 if (dp_reg & DP_PORT_EN) 991 intel_dp_link_down(intel_dp);
869 intel_dp_link_down(intel_dp);
870} 992}
871 993
872static void intel_dp_commit(struct drm_encoder *encoder) 994static void intel_dp_commit(struct drm_encoder *encoder)
873{ 995{
874 struct intel_dp *intel_dp = enc_to_intel_dp(encoder); 996 struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
875 struct drm_device *dev = encoder->dev; 997 struct drm_device *dev = encoder->dev;
876 struct drm_i915_private *dev_priv = dev->dev_private;
877 uint32_t dp_reg = I915_READ(intel_dp->output_reg);
878 998
879 if (!(dp_reg & DP_PORT_EN)) { 999 if (is_edp(intel_dp))
880 intel_dp_link_train(intel_dp); 1000 ironlake_edp_panel_vdd_on(intel_dp);
1001
1002 intel_dp_start_link_train(intel_dp);
1003
1004 if (is_edp(intel_dp)) {
1005 ironlake_edp_panel_on(intel_dp);
1006 ironlake_edp_panel_vdd_off(intel_dp);
881 } 1007 }
882 if (IS_eDP(intel_dp) || IS_PCH_eDP(intel_dp)) 1008
1009 intel_dp_complete_link_train(intel_dp);
1010
1011 if (is_edp(intel_dp))
883 ironlake_edp_backlight_on(dev); 1012 ironlake_edp_backlight_on(dev);
884} 1013}
885 1014
@@ -892,24 +1021,54 @@ intel_dp_dpms(struct drm_encoder *encoder, int mode)
892 uint32_t dp_reg = I915_READ(intel_dp->output_reg); 1021 uint32_t dp_reg = I915_READ(intel_dp->output_reg);
893 1022
894 if (mode != DRM_MODE_DPMS_ON) { 1023 if (mode != DRM_MODE_DPMS_ON) {
895 if (IS_eDP(intel_dp) || IS_PCH_eDP(intel_dp)) { 1024 if (is_edp(intel_dp))
896 ironlake_edp_backlight_off(dev); 1025 ironlake_edp_backlight_off(dev);
1026 intel_dp_sink_dpms(intel_dp, mode);
1027 intel_dp_link_down(intel_dp);
1028 if (is_edp(intel_dp))
897 ironlake_edp_panel_off(dev); 1029 ironlake_edp_panel_off(dev);
898 } 1030 if (is_edp(intel_dp) && !is_pch_edp(intel_dp))
899 if (dp_reg & DP_PORT_EN)
900 intel_dp_link_down(intel_dp);
901 if (IS_eDP(intel_dp) || IS_PCH_eDP(intel_dp))
902 ironlake_edp_pll_off(encoder); 1031 ironlake_edp_pll_off(encoder);
903 } else { 1032 } else {
1033 if (is_edp(intel_dp))
1034 ironlake_edp_panel_vdd_on(intel_dp);
1035 intel_dp_sink_dpms(intel_dp, mode);
904 if (!(dp_reg & DP_PORT_EN)) { 1036 if (!(dp_reg & DP_PORT_EN)) {
905 if (IS_eDP(intel_dp) || IS_PCH_eDP(intel_dp)) 1037 intel_dp_start_link_train(intel_dp);
906 ironlake_edp_panel_on(dev); 1038 if (is_edp(intel_dp)) {
907 intel_dp_link_train(intel_dp); 1039 ironlake_edp_panel_on(intel_dp);
908 if (IS_eDP(intel_dp) || IS_PCH_eDP(intel_dp)) 1040 ironlake_edp_panel_vdd_off(intel_dp);
909 ironlake_edp_backlight_on(dev); 1041 }
1042 intel_dp_complete_link_train(intel_dp);
910 } 1043 }
1044 if (is_edp(intel_dp))
1045 ironlake_edp_backlight_on(dev);
1046 }
1047}
1048
1049/*
1050 * Native read with retry for link status and receiver capability reads for
1051 * cases where the sink may still be asleep.
1052 */
1053static bool
1054intel_dp_aux_native_read_retry(struct intel_dp *intel_dp, uint16_t address,
1055 uint8_t *recv, int recv_bytes)
1056{
1057 int ret, i;
1058
1059 /*
1060 * Sinks are *supposed* to come up within 1ms from an off state,
1061 * but we're also supposed to retry 3 times per the spec.
1062 */
1063 for (i = 0; i < 3; i++) {
1064 ret = intel_dp_aux_native_read(intel_dp, address, recv,
1065 recv_bytes);
1066 if (ret == recv_bytes)
1067 return true;
1068 msleep(1);
911 } 1069 }
912 intel_dp->dpms_mode = mode; 1070
1071 return false;
913} 1072}
914 1073
915/* 1074/*
@@ -917,17 +1076,12 @@ intel_dp_dpms(struct drm_encoder *encoder, int mode)
917 * link status information 1076 * link status information
918 */ 1077 */
919static bool 1078static bool
920intel_dp_get_link_status(struct intel_dp *intel_dp, 1079intel_dp_get_link_status(struct intel_dp *intel_dp)
921 uint8_t link_status[DP_LINK_STATUS_SIZE])
922{ 1080{
923 int ret; 1081 return intel_dp_aux_native_read_retry(intel_dp,
924 1082 DP_LANE0_1_STATUS,
925 ret = intel_dp_aux_native_read(intel_dp, 1083 intel_dp->link_status,
926 DP_LANE0_1_STATUS, 1084 DP_LINK_STATUS_SIZE);
927 link_status, DP_LINK_STATUS_SIZE);
928 if (ret != DP_LINK_STATUS_SIZE)
929 return false;
930 return true;
931} 1085}
932 1086
933static uint8_t 1087static uint8_t
@@ -999,18 +1153,15 @@ intel_dp_pre_emphasis_max(uint8_t voltage_swing)
999} 1153}
1000 1154
1001static void 1155static void
1002intel_get_adjust_train(struct intel_dp *intel_dp, 1156intel_get_adjust_train(struct intel_dp *intel_dp)
1003 uint8_t link_status[DP_LINK_STATUS_SIZE],
1004 int lane_count,
1005 uint8_t train_set[4])
1006{ 1157{
1007 uint8_t v = 0; 1158 uint8_t v = 0;
1008 uint8_t p = 0; 1159 uint8_t p = 0;
1009 int lane; 1160 int lane;
1010 1161
1011 for (lane = 0; lane < lane_count; lane++) { 1162 for (lane = 0; lane < intel_dp->lane_count; lane++) {
1012 uint8_t this_v = intel_get_adjust_request_voltage(link_status, lane); 1163 uint8_t this_v = intel_get_adjust_request_voltage(intel_dp->link_status, lane);
1013 uint8_t this_p = intel_get_adjust_request_pre_emphasis(link_status, lane); 1164 uint8_t this_p = intel_get_adjust_request_pre_emphasis(intel_dp->link_status, lane);
1014 1165
1015 if (this_v > v) 1166 if (this_v > v)
1016 v = this_v; 1167 v = this_v;
@@ -1025,7 +1176,7 @@ intel_get_adjust_train(struct intel_dp *intel_dp,
1025 p = intel_dp_pre_emphasis_max(v) | DP_TRAIN_MAX_PRE_EMPHASIS_REACHED; 1176 p = intel_dp_pre_emphasis_max(v) | DP_TRAIN_MAX_PRE_EMPHASIS_REACHED;
1026 1177
1027 for (lane = 0; lane < 4; lane++) 1178 for (lane = 0; lane < 4; lane++)
1028 train_set[lane] = v | p; 1179 intel_dp->train_set[lane] = v | p;
1029} 1180}
1030 1181
1031static uint32_t 1182static uint32_t
@@ -1070,18 +1221,27 @@ intel_dp_signal_levels(uint8_t train_set, int lane_count)
1070static uint32_t 1221static uint32_t
1071intel_gen6_edp_signal_levels(uint8_t train_set) 1222intel_gen6_edp_signal_levels(uint8_t train_set)
1072{ 1223{
1073 switch (train_set & (DP_TRAIN_VOLTAGE_SWING_MASK|DP_TRAIN_PRE_EMPHASIS_MASK)) { 1224 int signal_levels = train_set & (DP_TRAIN_VOLTAGE_SWING_MASK |
1225 DP_TRAIN_PRE_EMPHASIS_MASK);
1226 switch (signal_levels) {
1074 case DP_TRAIN_VOLTAGE_SWING_400 | DP_TRAIN_PRE_EMPHASIS_0: 1227 case DP_TRAIN_VOLTAGE_SWING_400 | DP_TRAIN_PRE_EMPHASIS_0:
1075 return EDP_LINK_TRAIN_400MV_0DB_SNB_B; 1228 case DP_TRAIN_VOLTAGE_SWING_600 | DP_TRAIN_PRE_EMPHASIS_0:
1229 return EDP_LINK_TRAIN_400_600MV_0DB_SNB_B;
1230 case DP_TRAIN_VOLTAGE_SWING_400 | DP_TRAIN_PRE_EMPHASIS_3_5:
1231 return EDP_LINK_TRAIN_400MV_3_5DB_SNB_B;
1076 case DP_TRAIN_VOLTAGE_SWING_400 | DP_TRAIN_PRE_EMPHASIS_6: 1232 case DP_TRAIN_VOLTAGE_SWING_400 | DP_TRAIN_PRE_EMPHASIS_6:
1077 return EDP_LINK_TRAIN_400MV_6DB_SNB_B; 1233 case DP_TRAIN_VOLTAGE_SWING_600 | DP_TRAIN_PRE_EMPHASIS_6:
1234 return EDP_LINK_TRAIN_400_600MV_6DB_SNB_B;
1078 case DP_TRAIN_VOLTAGE_SWING_600 | DP_TRAIN_PRE_EMPHASIS_3_5: 1235 case DP_TRAIN_VOLTAGE_SWING_600 | DP_TRAIN_PRE_EMPHASIS_3_5:
1079 return EDP_LINK_TRAIN_600MV_3_5DB_SNB_B; 1236 case DP_TRAIN_VOLTAGE_SWING_800 | DP_TRAIN_PRE_EMPHASIS_3_5:
1237 return EDP_LINK_TRAIN_600_800MV_3_5DB_SNB_B;
1080 case DP_TRAIN_VOLTAGE_SWING_800 | DP_TRAIN_PRE_EMPHASIS_0: 1238 case DP_TRAIN_VOLTAGE_SWING_800 | DP_TRAIN_PRE_EMPHASIS_0:
1081 return EDP_LINK_TRAIN_800MV_0DB_SNB_B; 1239 case DP_TRAIN_VOLTAGE_SWING_1200 | DP_TRAIN_PRE_EMPHASIS_0:
1240 return EDP_LINK_TRAIN_800_1200MV_0DB_SNB_B;
1082 default: 1241 default:
1083 DRM_DEBUG_KMS("Unsupported voltage swing/pre-emphasis level\n"); 1242 DRM_DEBUG_KMS("Unsupported voltage swing/pre-emphasis level:"
1084 return EDP_LINK_TRAIN_400MV_0DB_SNB_B; 1243 "0x%x\n", signal_levels);
1244 return EDP_LINK_TRAIN_400_600MV_0DB_SNB_B;
1085 } 1245 }
1086} 1246}
1087 1247
@@ -1116,18 +1276,18 @@ intel_clock_recovery_ok(uint8_t link_status[DP_LINK_STATUS_SIZE], int lane_count
1116 DP_LANE_CHANNEL_EQ_DONE|\ 1276 DP_LANE_CHANNEL_EQ_DONE|\
1117 DP_LANE_SYMBOL_LOCKED) 1277 DP_LANE_SYMBOL_LOCKED)
1118static bool 1278static bool
1119intel_channel_eq_ok(uint8_t link_status[DP_LINK_STATUS_SIZE], int lane_count) 1279intel_channel_eq_ok(struct intel_dp *intel_dp)
1120{ 1280{
1121 uint8_t lane_align; 1281 uint8_t lane_align;
1122 uint8_t lane_status; 1282 uint8_t lane_status;
1123 int lane; 1283 int lane;
1124 1284
1125 lane_align = intel_dp_link_status(link_status, 1285 lane_align = intel_dp_link_status(intel_dp->link_status,
1126 DP_LANE_ALIGN_STATUS_UPDATED); 1286 DP_LANE_ALIGN_STATUS_UPDATED);
1127 if ((lane_align & DP_INTERLANE_ALIGN_DONE) == 0) 1287 if ((lane_align & DP_INTERLANE_ALIGN_DONE) == 0)
1128 return false; 1288 return false;
1129 for (lane = 0; lane < lane_count; lane++) { 1289 for (lane = 0; lane < intel_dp->lane_count; lane++) {
1130 lane_status = intel_get_lane_status(link_status, lane); 1290 lane_status = intel_get_lane_status(intel_dp->link_status, lane);
1131 if ((lane_status & CHANNEL_EQ_BITS) != CHANNEL_EQ_BITS) 1291 if ((lane_status & CHANNEL_EQ_BITS) != CHANNEL_EQ_BITS)
1132 return false; 1292 return false;
1133 } 1293 }
@@ -1137,10 +1297,9 @@ intel_channel_eq_ok(uint8_t link_status[DP_LINK_STATUS_SIZE], int lane_count)
1137static bool 1297static bool
1138intel_dp_set_link_train(struct intel_dp *intel_dp, 1298intel_dp_set_link_train(struct intel_dp *intel_dp,
1139 uint32_t dp_reg_value, 1299 uint32_t dp_reg_value,
1140 uint8_t dp_train_pat, 1300 uint8_t dp_train_pat)
1141 uint8_t train_set[4])
1142{ 1301{
1143 struct drm_device *dev = intel_dp->base.enc.dev; 1302 struct drm_device *dev = intel_dp->base.base.dev;
1144 struct drm_i915_private *dev_priv = dev->dev_private; 1303 struct drm_i915_private *dev_priv = dev->dev_private;
1145 int ret; 1304 int ret;
1146 1305
@@ -1152,28 +1311,27 @@ intel_dp_set_link_train(struct intel_dp *intel_dp,
1152 dp_train_pat); 1311 dp_train_pat);
1153 1312
1154 ret = intel_dp_aux_native_write(intel_dp, 1313 ret = intel_dp_aux_native_write(intel_dp,
1155 DP_TRAINING_LANE0_SET, train_set, 4); 1314 DP_TRAINING_LANE0_SET,
1315 intel_dp->train_set, 4);
1156 if (ret != 4) 1316 if (ret != 4)
1157 return false; 1317 return false;
1158 1318
1159 return true; 1319 return true;
1160} 1320}
1161 1321
1322/* Enable corresponding port and start training pattern 1 */
1162static void 1323static void
1163intel_dp_link_train(struct intel_dp *intel_dp) 1324intel_dp_start_link_train(struct intel_dp *intel_dp)
1164{ 1325{
1165 struct drm_device *dev = intel_dp->base.enc.dev; 1326 struct drm_device *dev = intel_dp->base.base.dev;
1166 struct drm_i915_private *dev_priv = dev->dev_private; 1327 struct drm_i915_private *dev_priv = dev->dev_private;
1167 uint8_t train_set[4]; 1328 struct intel_crtc *intel_crtc = to_intel_crtc(intel_dp->base.base.crtc);
1168 uint8_t link_status[DP_LINK_STATUS_SIZE];
1169 int i; 1329 int i;
1170 uint8_t voltage; 1330 uint8_t voltage;
1171 bool clock_recovery = false; 1331 bool clock_recovery = false;
1172 bool channel_eq = false;
1173 int tries; 1332 int tries;
1174 u32 reg; 1333 u32 reg;
1175 uint32_t DP = intel_dp->DP; 1334 uint32_t DP = intel_dp->DP;
1176 struct intel_crtc *intel_crtc = to_intel_crtc(intel_dp->base.enc.crtc);
1177 1335
1178 /* Enable output, wait for it to become active */ 1336 /* Enable output, wait for it to become active */
1179 I915_WRITE(intel_dp->output_reg, intel_dp->DP); 1337 I915_WRITE(intel_dp->output_reg, intel_dp->DP);
@@ -1186,108 +1344,140 @@ intel_dp_link_train(struct intel_dp *intel_dp)
1186 DP_LINK_CONFIGURATION_SIZE); 1344 DP_LINK_CONFIGURATION_SIZE);
1187 1345
1188 DP |= DP_PORT_EN; 1346 DP |= DP_PORT_EN;
1189 if (HAS_PCH_CPT(dev) && !IS_eDP(intel_dp)) 1347 if (HAS_PCH_CPT(dev) && !is_edp(intel_dp))
1190 DP &= ~DP_LINK_TRAIN_MASK_CPT; 1348 DP &= ~DP_LINK_TRAIN_MASK_CPT;
1191 else 1349 else
1192 DP &= ~DP_LINK_TRAIN_MASK; 1350 DP &= ~DP_LINK_TRAIN_MASK;
1193 memset(train_set, 0, 4); 1351 memset(intel_dp->train_set, 0, 4);
1194 voltage = 0xff; 1352 voltage = 0xff;
1195 tries = 0; 1353 tries = 0;
1196 clock_recovery = false; 1354 clock_recovery = false;
1197 for (;;) { 1355 for (;;) {
1198 /* Use train_set[0] to set the voltage and pre emphasis values */ 1356 /* Use intel_dp->train_set[0] to set the voltage and pre emphasis values */
1199 uint32_t signal_levels; 1357 uint32_t signal_levels;
1200 if (IS_GEN6(dev) && IS_eDP(intel_dp)) { 1358 if (IS_GEN6(dev) && is_edp(intel_dp)) {
1201 signal_levels = intel_gen6_edp_signal_levels(train_set[0]); 1359 signal_levels = intel_gen6_edp_signal_levels(intel_dp->train_set[0]);
1202 DP = (DP & ~EDP_LINK_TRAIN_VOL_EMP_MASK_SNB) | signal_levels; 1360 DP = (DP & ~EDP_LINK_TRAIN_VOL_EMP_MASK_SNB) | signal_levels;
1203 } else { 1361 } else {
1204 signal_levels = intel_dp_signal_levels(train_set[0], intel_dp->lane_count); 1362 signal_levels = intel_dp_signal_levels(intel_dp->train_set[0], intel_dp->lane_count);
1205 DP = (DP & ~(DP_VOLTAGE_MASK|DP_PRE_EMPHASIS_MASK)) | signal_levels; 1363 DP = (DP & ~(DP_VOLTAGE_MASK|DP_PRE_EMPHASIS_MASK)) | signal_levels;
1206 } 1364 }
1207 1365
1208 if (HAS_PCH_CPT(dev) && !IS_eDP(intel_dp)) 1366 if (HAS_PCH_CPT(dev) && !is_edp(intel_dp))
1209 reg = DP | DP_LINK_TRAIN_PAT_1_CPT; 1367 reg = DP | DP_LINK_TRAIN_PAT_1_CPT;
1210 else 1368 else
1211 reg = DP | DP_LINK_TRAIN_PAT_1; 1369 reg = DP | DP_LINK_TRAIN_PAT_1;
1212 1370
1213 if (!intel_dp_set_link_train(intel_dp, reg, 1371 if (!intel_dp_set_link_train(intel_dp, reg,
1214 DP_TRAINING_PATTERN_1, train_set)) 1372 DP_TRAINING_PATTERN_1))
1215 break; 1373 break;
1216 /* Set training pattern 1 */ 1374 /* Set training pattern 1 */
1217 1375
1218 udelay(100); 1376 udelay(100);
1219 if (!intel_dp_get_link_status(intel_dp, link_status)) 1377 if (!intel_dp_get_link_status(intel_dp))
1220 break; 1378 break;
1221 1379
1222 if (intel_clock_recovery_ok(link_status, intel_dp->lane_count)) { 1380 if (intel_clock_recovery_ok(intel_dp->link_status, intel_dp->lane_count)) {
1223 clock_recovery = true; 1381 clock_recovery = true;
1224 break; 1382 break;
1225 } 1383 }
1226 1384
1227 /* Check to see if we've tried the max voltage */ 1385 /* Check to see if we've tried the max voltage */
1228 for (i = 0; i < intel_dp->lane_count; i++) 1386 for (i = 0; i < intel_dp->lane_count; i++)
1229 if ((train_set[i] & DP_TRAIN_MAX_SWING_REACHED) == 0) 1387 if ((intel_dp->train_set[i] & DP_TRAIN_MAX_SWING_REACHED) == 0)
1230 break; 1388 break;
1231 if (i == intel_dp->lane_count) 1389 if (i == intel_dp->lane_count)
1232 break; 1390 break;
1233 1391
1234 /* Check to see if we've tried the same voltage 5 times */ 1392 /* Check to see if we've tried the same voltage 5 times */
1235 if ((train_set[0] & DP_TRAIN_VOLTAGE_SWING_MASK) == voltage) { 1393 if ((intel_dp->train_set[0] & DP_TRAIN_VOLTAGE_SWING_MASK) == voltage) {
1236 ++tries; 1394 ++tries;
1237 if (tries == 5) 1395 if (tries == 5)
1238 break; 1396 break;
1239 } else 1397 } else
1240 tries = 0; 1398 tries = 0;
1241 voltage = train_set[0] & DP_TRAIN_VOLTAGE_SWING_MASK; 1399 voltage = intel_dp->train_set[0] & DP_TRAIN_VOLTAGE_SWING_MASK;
1242 1400
1243 /* Compute new train_set as requested by target */ 1401 /* Compute new intel_dp->train_set as requested by target */
1244 intel_get_adjust_train(intel_dp, link_status, intel_dp->lane_count, train_set); 1402 intel_get_adjust_train(intel_dp);
1245 } 1403 }
1246 1404
1405 intel_dp->DP = DP;
1406}
1407
1408static void
1409intel_dp_complete_link_train(struct intel_dp *intel_dp)
1410{
1411 struct drm_device *dev = intel_dp->base.base.dev;
1412 struct drm_i915_private *dev_priv = dev->dev_private;
1413 bool channel_eq = false;
1414 int tries, cr_tries;
1415 u32 reg;
1416 uint32_t DP = intel_dp->DP;
1417
1247 /* channel equalization */ 1418 /* channel equalization */
1248 tries = 0; 1419 tries = 0;
1420 cr_tries = 0;
1249 channel_eq = false; 1421 channel_eq = false;
1250 for (;;) { 1422 for (;;) {
1251 /* Use train_set[0] to set the voltage and pre emphasis values */ 1423 /* Use intel_dp->train_set[0] to set the voltage and pre emphasis values */
1252 uint32_t signal_levels; 1424 uint32_t signal_levels;
1253 1425
1254 if (IS_GEN6(dev) && IS_eDP(intel_dp)) { 1426 if (cr_tries > 5) {
1255 signal_levels = intel_gen6_edp_signal_levels(train_set[0]); 1427 DRM_ERROR("failed to train DP, aborting\n");
1428 intel_dp_link_down(intel_dp);
1429 break;
1430 }
1431
1432 if (IS_GEN6(dev) && is_edp(intel_dp)) {
1433 signal_levels = intel_gen6_edp_signal_levels(intel_dp->train_set[0]);
1256 DP = (DP & ~EDP_LINK_TRAIN_VOL_EMP_MASK_SNB) | signal_levels; 1434 DP = (DP & ~EDP_LINK_TRAIN_VOL_EMP_MASK_SNB) | signal_levels;
1257 } else { 1435 } else {
1258 signal_levels = intel_dp_signal_levels(train_set[0], intel_dp->lane_count); 1436 signal_levels = intel_dp_signal_levels(intel_dp->train_set[0], intel_dp->lane_count);
1259 DP = (DP & ~(DP_VOLTAGE_MASK|DP_PRE_EMPHASIS_MASK)) | signal_levels; 1437 DP = (DP & ~(DP_VOLTAGE_MASK|DP_PRE_EMPHASIS_MASK)) | signal_levels;
1260 } 1438 }
1261 1439
1262 if (HAS_PCH_CPT(dev) && !IS_eDP(intel_dp)) 1440 if (HAS_PCH_CPT(dev) && !is_edp(intel_dp))
1263 reg = DP | DP_LINK_TRAIN_PAT_2_CPT; 1441 reg = DP | DP_LINK_TRAIN_PAT_2_CPT;
1264 else 1442 else
1265 reg = DP | DP_LINK_TRAIN_PAT_2; 1443 reg = DP | DP_LINK_TRAIN_PAT_2;
1266 1444
1267 /* channel eq pattern */ 1445 /* channel eq pattern */
1268 if (!intel_dp_set_link_train(intel_dp, reg, 1446 if (!intel_dp_set_link_train(intel_dp, reg,
1269 DP_TRAINING_PATTERN_2, train_set)) 1447 DP_TRAINING_PATTERN_2))
1270 break; 1448 break;
1271 1449
1272 udelay(400); 1450 udelay(400);
1273 if (!intel_dp_get_link_status(intel_dp, link_status)) 1451 if (!intel_dp_get_link_status(intel_dp))
1274 break; 1452 break;
1275 1453
1276 if (intel_channel_eq_ok(link_status, intel_dp->lane_count)) { 1454 /* Make sure clock is still ok */
1455 if (!intel_clock_recovery_ok(intel_dp->link_status, intel_dp->lane_count)) {
1456 intel_dp_start_link_train(intel_dp);
1457 cr_tries++;
1458 continue;
1459 }
1460
1461 if (intel_channel_eq_ok(intel_dp)) {
1277 channel_eq = true; 1462 channel_eq = true;
1278 break; 1463 break;
1279 } 1464 }
1280 1465
1281 /* Try 5 times */ 1466 /* Try 5 times, then try clock recovery if that fails */
1282 if (tries > 5) 1467 if (tries > 5) {
1283 break; 1468 intel_dp_link_down(intel_dp);
1469 intel_dp_start_link_train(intel_dp);
1470 tries = 0;
1471 cr_tries++;
1472 continue;
1473 }
1284 1474
1285 /* Compute new train_set as requested by target */ 1475 /* Compute new intel_dp->train_set as requested by target */
1286 intel_get_adjust_train(intel_dp, link_status, intel_dp->lane_count, train_set); 1476 intel_get_adjust_train(intel_dp);
1287 ++tries; 1477 ++tries;
1288 } 1478 }
1289 1479
1290 if (HAS_PCH_CPT(dev) && !IS_eDP(intel_dp)) 1480 if (HAS_PCH_CPT(dev) && !is_edp(intel_dp))
1291 reg = DP | DP_LINK_TRAIN_OFF_CPT; 1481 reg = DP | DP_LINK_TRAIN_OFF_CPT;
1292 else 1482 else
1293 reg = DP | DP_LINK_TRAIN_OFF; 1483 reg = DP | DP_LINK_TRAIN_OFF;
@@ -1301,33 +1491,69 @@ intel_dp_link_train(struct intel_dp *intel_dp)
1301static void 1491static void
1302intel_dp_link_down(struct intel_dp *intel_dp) 1492intel_dp_link_down(struct intel_dp *intel_dp)
1303{ 1493{
1304 struct drm_device *dev = intel_dp->base.enc.dev; 1494 struct drm_device *dev = intel_dp->base.base.dev;
1305 struct drm_i915_private *dev_priv = dev->dev_private; 1495 struct drm_i915_private *dev_priv = dev->dev_private;
1306 uint32_t DP = intel_dp->DP; 1496 uint32_t DP = intel_dp->DP;
1307 1497
1498 if ((I915_READ(intel_dp->output_reg) & DP_PORT_EN) == 0)
1499 return;
1500
1308 DRM_DEBUG_KMS("\n"); 1501 DRM_DEBUG_KMS("\n");
1309 1502
1310 if (IS_eDP(intel_dp)) { 1503 if (is_edp(intel_dp)) {
1311 DP &= ~DP_PLL_ENABLE; 1504 DP &= ~DP_PLL_ENABLE;
1312 I915_WRITE(intel_dp->output_reg, DP); 1505 I915_WRITE(intel_dp->output_reg, DP);
1313 POSTING_READ(intel_dp->output_reg); 1506 POSTING_READ(intel_dp->output_reg);
1314 udelay(100); 1507 udelay(100);
1315 } 1508 }
1316 1509
1317 if (HAS_PCH_CPT(dev) && !IS_eDP(intel_dp)) { 1510 if (HAS_PCH_CPT(dev) && !is_edp(intel_dp)) {
1318 DP &= ~DP_LINK_TRAIN_MASK_CPT; 1511 DP &= ~DP_LINK_TRAIN_MASK_CPT;
1319 I915_WRITE(intel_dp->output_reg, DP | DP_LINK_TRAIN_PAT_IDLE_CPT); 1512 I915_WRITE(intel_dp->output_reg, DP | DP_LINK_TRAIN_PAT_IDLE_CPT);
1320 POSTING_READ(intel_dp->output_reg);
1321 } else { 1513 } else {
1322 DP &= ~DP_LINK_TRAIN_MASK; 1514 DP &= ~DP_LINK_TRAIN_MASK;
1323 I915_WRITE(intel_dp->output_reg, DP | DP_LINK_TRAIN_PAT_IDLE); 1515 I915_WRITE(intel_dp->output_reg, DP | DP_LINK_TRAIN_PAT_IDLE);
1324 POSTING_READ(intel_dp->output_reg);
1325 } 1516 }
1517 POSTING_READ(intel_dp->output_reg);
1326 1518
1327 udelay(17000); 1519 msleep(17);
1328 1520
1329 if (IS_eDP(intel_dp)) 1521 if (is_edp(intel_dp))
1330 DP |= DP_LINK_TRAIN_OFF; 1522 DP |= DP_LINK_TRAIN_OFF;
1523
1524 if (!HAS_PCH_CPT(dev) &&
1525 I915_READ(intel_dp->output_reg) & DP_PIPEB_SELECT) {
1526 struct drm_crtc *crtc = intel_dp->base.base.crtc;
1527
1528 /* Hardware workaround: leaving our transcoder select
1529 * set to transcoder B while it's off will prevent the
1530 * corresponding HDMI output on transcoder A.
1531 *
1532 * Combine this with another hardware workaround:
1533 * transcoder select bit can only be cleared while the
1534 * port is enabled.
1535 */
1536 DP &= ~DP_PIPEB_SELECT;
1537 I915_WRITE(intel_dp->output_reg, DP);
1538
1539 /* Changes to enable or select take place the vblank
1540 * after being written.
1541 */
1542 if (crtc == NULL) {
1543 /* We can arrive here never having been attached
1544 * to a CRTC, for instance, due to inheriting
1545 * random state from the BIOS.
1546 *
1547 * If the pipe is not running, play safe and
1548 * wait for the clocks to stabilise before
1549 * continuing.
1550 */
1551 POSTING_READ(intel_dp->output_reg);
1552 msleep(50);
1553 } else
1554 intel_wait_for_vblank(dev, to_intel_crtc(crtc)->pipe);
1555 }
1556
1331 I915_WRITE(intel_dp->output_reg, DP & ~DP_PORT_EN); 1557 I915_WRITE(intel_dp->output_reg, DP & ~DP_PORT_EN);
1332 POSTING_READ(intel_dp->output_reg); 1558 POSTING_READ(intel_dp->output_reg);
1333} 1559}
@@ -1344,60 +1570,63 @@ intel_dp_link_down(struct intel_dp *intel_dp)
1344static void 1570static void
1345intel_dp_check_link_status(struct intel_dp *intel_dp) 1571intel_dp_check_link_status(struct intel_dp *intel_dp)
1346{ 1572{
1347 uint8_t link_status[DP_LINK_STATUS_SIZE]; 1573 int ret;
1574
1575 if (!intel_dp->base.base.crtc)
1576 return;
1348 1577
1349 if (!intel_dp->base.enc.crtc) 1578 if (!intel_dp_get_link_status(intel_dp)) {
1579 intel_dp_link_down(intel_dp);
1350 return; 1580 return;
1581 }
1351 1582
1352 if (!intel_dp_get_link_status(intel_dp, link_status)) { 1583 /* Try to read receiver status if the link appears to be up */
1584 ret = intel_dp_aux_native_read(intel_dp,
1585 0x000, intel_dp->dpcd,
1586 sizeof (intel_dp->dpcd));
1587 if (ret != sizeof(intel_dp->dpcd)) {
1353 intel_dp_link_down(intel_dp); 1588 intel_dp_link_down(intel_dp);
1354 return; 1589 return;
1355 } 1590 }
1356 1591
1357 if (!intel_channel_eq_ok(link_status, intel_dp->lane_count)) 1592 if (!intel_channel_eq_ok(intel_dp)) {
1358 intel_dp_link_train(intel_dp); 1593 intel_dp_start_link_train(intel_dp);
1594 intel_dp_complete_link_train(intel_dp);
1595 }
1359} 1596}
1360 1597
1361static enum drm_connector_status 1598static enum drm_connector_status
1362ironlake_dp_detect(struct drm_connector *connector) 1599ironlake_dp_detect(struct intel_dp *intel_dp)
1363{ 1600{
1364 struct drm_encoder *encoder = intel_attached_encoder(connector);
1365 struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
1366 enum drm_connector_status status; 1601 enum drm_connector_status status;
1602 bool ret;
1367 1603
1368 status = connector_status_disconnected; 1604 /* Can't disconnect eDP, but you can close the lid... */
1369 if (intel_dp_aux_native_read(intel_dp, 1605 if (is_edp(intel_dp)) {
1370 0x000, intel_dp->dpcd, 1606 status = intel_panel_detect(intel_dp->base.base.dev);
1371 sizeof (intel_dp->dpcd)) == sizeof (intel_dp->dpcd)) 1607 if (status == connector_status_unknown)
1372 {
1373 if (intel_dp->dpcd[0] != 0)
1374 status = connector_status_connected; 1608 status = connector_status_connected;
1609 return status;
1375 } 1610 }
1611
1612 status = connector_status_disconnected;
1613 ret = intel_dp_aux_native_read_retry(intel_dp,
1614 0x000, intel_dp->dpcd,
1615 sizeof (intel_dp->dpcd));
1616 if (ret && intel_dp->dpcd[DP_DPCD_REV] != 0)
1617 status = connector_status_connected;
1376 DRM_DEBUG_KMS("DPCD: %hx%hx%hx%hx\n", intel_dp->dpcd[0], 1618 DRM_DEBUG_KMS("DPCD: %hx%hx%hx%hx\n", intel_dp->dpcd[0],
1377 intel_dp->dpcd[1], intel_dp->dpcd[2], intel_dp->dpcd[3]); 1619 intel_dp->dpcd[1], intel_dp->dpcd[2], intel_dp->dpcd[3]);
1378 return status; 1620 return status;
1379} 1621}
1380 1622
1381/**
1382 * Uses CRT_HOTPLUG_EN and CRT_HOTPLUG_STAT to detect DP connection.
1383 *
1384 * \return true if DP port is connected.
1385 * \return false if DP port is disconnected.
1386 */
1387static enum drm_connector_status 1623static enum drm_connector_status
1388intel_dp_detect(struct drm_connector *connector, bool force) 1624g4x_dp_detect(struct intel_dp *intel_dp)
1389{ 1625{
1390 struct drm_encoder *encoder = intel_attached_encoder(connector); 1626 struct drm_device *dev = intel_dp->base.base.dev;
1391 struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
1392 struct drm_device *dev = intel_dp->base.enc.dev;
1393 struct drm_i915_private *dev_priv = dev->dev_private; 1627 struct drm_i915_private *dev_priv = dev->dev_private;
1394 uint32_t temp, bit;
1395 enum drm_connector_status status; 1628 enum drm_connector_status status;
1396 1629 uint32_t temp, bit;
1397 intel_dp->has_audio = false;
1398
1399 if (HAS_PCH_SPLIT(dev))
1400 return ironlake_dp_detect(connector);
1401 1630
1402 switch (intel_dp->output_reg) { 1631 switch (intel_dp->output_reg) {
1403 case DP_B: 1632 case DP_B:
@@ -1419,31 +1648,66 @@ intel_dp_detect(struct drm_connector *connector, bool force)
1419 return connector_status_disconnected; 1648 return connector_status_disconnected;
1420 1649
1421 status = connector_status_disconnected; 1650 status = connector_status_disconnected;
1422 if (intel_dp_aux_native_read(intel_dp, 1651 if (intel_dp_aux_native_read(intel_dp, 0x000, intel_dp->dpcd,
1423 0x000, intel_dp->dpcd,
1424 sizeof (intel_dp->dpcd)) == sizeof (intel_dp->dpcd)) 1652 sizeof (intel_dp->dpcd)) == sizeof (intel_dp->dpcd))
1425 { 1653 {
1426 if (intel_dp->dpcd[0] != 0) 1654 if (intel_dp->dpcd[DP_DPCD_REV] != 0)
1427 status = connector_status_connected; 1655 status = connector_status_connected;
1428 } 1656 }
1657
1429 return status; 1658 return status;
1430} 1659}
1431 1660
1661/**
1662 * Uses CRT_HOTPLUG_EN and CRT_HOTPLUG_STAT to detect DP connection.
1663 *
1664 * \return true if DP port is connected.
1665 * \return false if DP port is disconnected.
1666 */
1667static enum drm_connector_status
1668intel_dp_detect(struct drm_connector *connector, bool force)
1669{
1670 struct intel_dp *intel_dp = intel_attached_dp(connector);
1671 struct drm_device *dev = intel_dp->base.base.dev;
1672 enum drm_connector_status status;
1673 struct edid *edid = NULL;
1674
1675 intel_dp->has_audio = false;
1676
1677 if (HAS_PCH_SPLIT(dev))
1678 status = ironlake_dp_detect(intel_dp);
1679 else
1680 status = g4x_dp_detect(intel_dp);
1681 if (status != connector_status_connected)
1682 return status;
1683
1684 if (intel_dp->force_audio) {
1685 intel_dp->has_audio = intel_dp->force_audio > 0;
1686 } else {
1687 edid = drm_get_edid(connector, &intel_dp->adapter);
1688 if (edid) {
1689 intel_dp->has_audio = drm_detect_monitor_audio(edid);
1690 connector->display_info.raw_edid = NULL;
1691 kfree(edid);
1692 }
1693 }
1694
1695 return connector_status_connected;
1696}
1697
1432static int intel_dp_get_modes(struct drm_connector *connector) 1698static int intel_dp_get_modes(struct drm_connector *connector)
1433{ 1699{
1434 struct drm_encoder *encoder = intel_attached_encoder(connector); 1700 struct intel_dp *intel_dp = intel_attached_dp(connector);
1435 struct intel_dp *intel_dp = enc_to_intel_dp(encoder); 1701 struct drm_device *dev = intel_dp->base.base.dev;
1436 struct drm_device *dev = intel_dp->base.enc.dev;
1437 struct drm_i915_private *dev_priv = dev->dev_private; 1702 struct drm_i915_private *dev_priv = dev->dev_private;
1438 int ret; 1703 int ret;
1439 1704
1440 /* We should parse the EDID data and find out if it has an audio sink 1705 /* We should parse the EDID data and find out if it has an audio sink
1441 */ 1706 */
1442 1707
1443 ret = intel_ddc_get_modes(connector, intel_dp->base.ddc_bus); 1708 ret = intel_ddc_get_modes(connector, &intel_dp->adapter);
1444 if (ret) { 1709 if (ret) {
1445 if ((IS_eDP(intel_dp) || IS_PCH_eDP(intel_dp)) && 1710 if (is_edp(intel_dp) && !dev_priv->panel_fixed_mode) {
1446 !dev_priv->panel_fixed_mode) {
1447 struct drm_display_mode *newmode; 1711 struct drm_display_mode *newmode;
1448 list_for_each_entry(newmode, &connector->probed_modes, 1712 list_for_each_entry(newmode, &connector->probed_modes,
1449 head) { 1713 head) {
@@ -1459,7 +1723,7 @@ static int intel_dp_get_modes(struct drm_connector *connector)
1459 } 1723 }
1460 1724
1461 /* if eDP has no EDID, try to use fixed panel mode from VBT */ 1725 /* if eDP has no EDID, try to use fixed panel mode from VBT */
1462 if (IS_eDP(intel_dp) || IS_PCH_eDP(intel_dp)) { 1726 if (is_edp(intel_dp)) {
1463 if (dev_priv->panel_fixed_mode != NULL) { 1727 if (dev_priv->panel_fixed_mode != NULL) {
1464 struct drm_display_mode *mode; 1728 struct drm_display_mode *mode;
1465 mode = drm_mode_duplicate(dev, dev_priv->panel_fixed_mode); 1729 mode = drm_mode_duplicate(dev, dev_priv->panel_fixed_mode);
@@ -1470,6 +1734,79 @@ static int intel_dp_get_modes(struct drm_connector *connector)
1470 return 0; 1734 return 0;
1471} 1735}
1472 1736
1737static bool
1738intel_dp_detect_audio(struct drm_connector *connector)
1739{
1740 struct intel_dp *intel_dp = intel_attached_dp(connector);
1741 struct edid *edid;
1742 bool has_audio = false;
1743
1744 edid = drm_get_edid(connector, &intel_dp->adapter);
1745 if (edid) {
1746 has_audio = drm_detect_monitor_audio(edid);
1747
1748 connector->display_info.raw_edid = NULL;
1749 kfree(edid);
1750 }
1751
1752 return has_audio;
1753}
1754
1755static int
1756intel_dp_set_property(struct drm_connector *connector,
1757 struct drm_property *property,
1758 uint64_t val)
1759{
1760 struct drm_i915_private *dev_priv = connector->dev->dev_private;
1761 struct intel_dp *intel_dp = intel_attached_dp(connector);
1762 int ret;
1763
1764 ret = drm_connector_property_set_value(connector, property, val);
1765 if (ret)
1766 return ret;
1767
1768 if (property == dev_priv->force_audio_property) {
1769 int i = val;
1770 bool has_audio;
1771
1772 if (i == intel_dp->force_audio)
1773 return 0;
1774
1775 intel_dp->force_audio = i;
1776
1777 if (i == 0)
1778 has_audio = intel_dp_detect_audio(connector);
1779 else
1780 has_audio = i > 0;
1781
1782 if (has_audio == intel_dp->has_audio)
1783 return 0;
1784
1785 intel_dp->has_audio = has_audio;
1786 goto done;
1787 }
1788
1789 if (property == dev_priv->broadcast_rgb_property) {
1790 if (val == !!intel_dp->color_range)
1791 return 0;
1792
1793 intel_dp->color_range = val ? DP_COLOR_RANGE_16_235 : 0;
1794 goto done;
1795 }
1796
1797 return -EINVAL;
1798
1799done:
1800 if (intel_dp->base.base.crtc) {
1801 struct drm_crtc *crtc = intel_dp->base.base.crtc;
1802 drm_crtc_helper_set_mode(crtc, &crtc->mode,
1803 crtc->x, crtc->y,
1804 crtc->fb);
1805 }
1806
1807 return 0;
1808}
1809
1473static void 1810static void
1474intel_dp_destroy (struct drm_connector *connector) 1811intel_dp_destroy (struct drm_connector *connector)
1475{ 1812{
@@ -1478,6 +1815,15 @@ intel_dp_destroy (struct drm_connector *connector)
1478 kfree(connector); 1815 kfree(connector);
1479} 1816}
1480 1817
1818static void intel_dp_encoder_destroy(struct drm_encoder *encoder)
1819{
1820 struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
1821
1822 i2c_del_adapter(&intel_dp->adapter);
1823 drm_encoder_cleanup(encoder);
1824 kfree(intel_dp);
1825}
1826
1481static const struct drm_encoder_helper_funcs intel_dp_helper_funcs = { 1827static const struct drm_encoder_helper_funcs intel_dp_helper_funcs = {
1482 .dpms = intel_dp_dpms, 1828 .dpms = intel_dp_dpms,
1483 .mode_fixup = intel_dp_mode_fixup, 1829 .mode_fixup = intel_dp_mode_fixup,
@@ -1490,26 +1836,26 @@ static const struct drm_connector_funcs intel_dp_connector_funcs = {
1490 .dpms = drm_helper_connector_dpms, 1836 .dpms = drm_helper_connector_dpms,
1491 .detect = intel_dp_detect, 1837 .detect = intel_dp_detect,
1492 .fill_modes = drm_helper_probe_single_connector_modes, 1838 .fill_modes = drm_helper_probe_single_connector_modes,
1839 .set_property = intel_dp_set_property,
1493 .destroy = intel_dp_destroy, 1840 .destroy = intel_dp_destroy,
1494}; 1841};
1495 1842
1496static const struct drm_connector_helper_funcs intel_dp_connector_helper_funcs = { 1843static const struct drm_connector_helper_funcs intel_dp_connector_helper_funcs = {
1497 .get_modes = intel_dp_get_modes, 1844 .get_modes = intel_dp_get_modes,
1498 .mode_valid = intel_dp_mode_valid, 1845 .mode_valid = intel_dp_mode_valid,
1499 .best_encoder = intel_attached_encoder, 1846 .best_encoder = intel_best_encoder,
1500}; 1847};
1501 1848
1502static const struct drm_encoder_funcs intel_dp_enc_funcs = { 1849static const struct drm_encoder_funcs intel_dp_enc_funcs = {
1503 .destroy = intel_encoder_destroy, 1850 .destroy = intel_dp_encoder_destroy,
1504}; 1851};
1505 1852
1506void 1853static void
1507intel_dp_hot_plug(struct intel_encoder *intel_encoder) 1854intel_dp_hot_plug(struct intel_encoder *intel_encoder)
1508{ 1855{
1509 struct intel_dp *intel_dp = container_of(intel_encoder, struct intel_dp, base); 1856 struct intel_dp *intel_dp = container_of(intel_encoder, struct intel_dp, base);
1510 1857
1511 if (intel_dp->dpms_mode == DRM_MODE_DPMS_ON) 1858 intel_dp_check_link_status(intel_dp);
1512 intel_dp_check_link_status(intel_dp);
1513} 1859}
1514 1860
1515/* Return which DP Port should be selected for Transcoder DP control */ 1861/* Return which DP Port should be selected for Transcoder DP control */
@@ -1554,6 +1900,13 @@ bool intel_dpd_is_edp(struct drm_device *dev)
1554 return false; 1900 return false;
1555} 1901}
1556 1902
1903static void
1904intel_dp_add_properties(struct intel_dp *intel_dp, struct drm_connector *connector)
1905{
1906 intel_attach_force_audio_property(connector);
1907 intel_attach_broadcast_rgb_property(connector);
1908}
1909
1557void 1910void
1558intel_dp_init(struct drm_device *dev, int output_reg) 1911intel_dp_init(struct drm_device *dev, int output_reg)
1559{ 1912{
@@ -1569,6 +1922,8 @@ intel_dp_init(struct drm_device *dev, int output_reg)
1569 if (!intel_dp) 1922 if (!intel_dp)
1570 return; 1923 return;
1571 1924
1925 intel_dp->output_reg = output_reg;
1926
1572 intel_connector = kzalloc(sizeof(struct intel_connector), GFP_KERNEL); 1927 intel_connector = kzalloc(sizeof(struct intel_connector), GFP_KERNEL);
1573 if (!intel_connector) { 1928 if (!intel_connector) {
1574 kfree(intel_dp); 1929 kfree(intel_dp);
@@ -1580,7 +1935,7 @@ intel_dp_init(struct drm_device *dev, int output_reg)
1580 if (intel_dpd_is_edp(dev)) 1935 if (intel_dpd_is_edp(dev))
1581 intel_dp->is_pch_edp = true; 1936 intel_dp->is_pch_edp = true;
1582 1937
1583 if (output_reg == DP_A || IS_PCH_eDP(intel_dp)) { 1938 if (output_reg == DP_A || is_pch_edp(intel_dp)) {
1584 type = DRM_MODE_CONNECTOR_eDP; 1939 type = DRM_MODE_CONNECTOR_eDP;
1585 intel_encoder->type = INTEL_OUTPUT_EDP; 1940 intel_encoder->type = INTEL_OUTPUT_EDP;
1586 } else { 1941 } else {
@@ -1601,23 +1956,18 @@ intel_dp_init(struct drm_device *dev, int output_reg)
1601 else if (output_reg == DP_D || output_reg == PCH_DP_D) 1956 else if (output_reg == DP_D || output_reg == PCH_DP_D)
1602 intel_encoder->clone_mask = (1 << INTEL_DP_D_CLONE_BIT); 1957 intel_encoder->clone_mask = (1 << INTEL_DP_D_CLONE_BIT);
1603 1958
1604 if (IS_eDP(intel_dp)) 1959 if (is_edp(intel_dp))
1605 intel_encoder->clone_mask = (1 << INTEL_EDP_CLONE_BIT); 1960 intel_encoder->clone_mask = (1 << INTEL_EDP_CLONE_BIT);
1606 1961
1607 intel_encoder->crtc_mask = (1 << 0) | (1 << 1); 1962 intel_encoder->crtc_mask = (1 << 0) | (1 << 1);
1608 connector->interlace_allowed = true; 1963 connector->interlace_allowed = true;
1609 connector->doublescan_allowed = 0; 1964 connector->doublescan_allowed = 0;
1610 1965
1611 intel_dp->output_reg = output_reg; 1966 drm_encoder_init(dev, &intel_encoder->base, &intel_dp_enc_funcs,
1612 intel_dp->has_audio = false;
1613 intel_dp->dpms_mode = DRM_MODE_DPMS_ON;
1614
1615 drm_encoder_init(dev, &intel_encoder->enc, &intel_dp_enc_funcs,
1616 DRM_MODE_ENCODER_TMDS); 1967 DRM_MODE_ENCODER_TMDS);
1617 drm_encoder_helper_add(&intel_encoder->enc, &intel_dp_helper_funcs); 1968 drm_encoder_helper_add(&intel_encoder->base, &intel_dp_helper_funcs);
1618 1969
1619 drm_mode_connector_attach_encoder(&intel_connector->base, 1970 intel_connector_attach_encoder(intel_connector, intel_encoder);
1620 &intel_encoder->enc);
1621 drm_sysfs_connector_add(connector); 1971 drm_sysfs_connector_add(connector);
1622 1972
1623 /* Set up the DDC bus. */ 1973 /* Set up the DDC bus. */
@@ -1647,10 +1997,42 @@ intel_dp_init(struct drm_device *dev, int output_reg)
1647 1997
1648 intel_dp_i2c_init(intel_dp, intel_connector, name); 1998 intel_dp_i2c_init(intel_dp, intel_connector, name);
1649 1999
1650 intel_encoder->ddc_bus = &intel_dp->adapter; 2000 /* Cache some DPCD data in the eDP case */
2001 if (is_edp(intel_dp)) {
2002 int ret;
2003 u32 pp_on, pp_div;
2004
2005 pp_on = I915_READ(PCH_PP_ON_DELAYS);
2006 pp_div = I915_READ(PCH_PP_DIVISOR);
2007
2008 /* Get T3 & T12 values (note: VESA not bspec terminology) */
2009 dev_priv->panel_t3 = (pp_on & 0x1fff0000) >> 16;
2010 dev_priv->panel_t3 /= 10; /* t3 in 100us units */
2011 dev_priv->panel_t12 = pp_div & 0xf;
2012 dev_priv->panel_t12 *= 100; /* t12 in 100ms units */
2013
2014 ironlake_edp_panel_vdd_on(intel_dp);
2015 ret = intel_dp_aux_native_read(intel_dp, DP_DPCD_REV,
2016 intel_dp->dpcd,
2017 sizeof(intel_dp->dpcd));
2018 ironlake_edp_panel_vdd_off(intel_dp);
2019 if (ret == sizeof(intel_dp->dpcd)) {
2020 if (intel_dp->dpcd[DP_DPCD_REV] >= 0x11)
2021 dev_priv->no_aux_handshake =
2022 intel_dp->dpcd[DP_MAX_DOWNSPREAD] &
2023 DP_NO_AUX_HANDSHAKE_LINK_TRAINING;
2024 } else {
2025 /* if this fails, presume the device is a ghost */
2026 DRM_INFO("failed to retrieve link info, disabling eDP\n");
2027 intel_dp_encoder_destroy(&intel_dp->base.base);
2028 intel_dp_destroy(&intel_connector->base);
2029 return;
2030 }
2031 }
2032
1651 intel_encoder->hot_plug = intel_dp_hot_plug; 2033 intel_encoder->hot_plug = intel_dp_hot_plug;
1652 2034
1653 if (output_reg == DP_A || IS_PCH_eDP(intel_dp)) { 2035 if (is_edp(intel_dp)) {
1654 /* initialize panel mode from VBT if available for eDP */ 2036 /* initialize panel mode from VBT if available for eDP */
1655 if (dev_priv->lfp_lvds_vbt_mode) { 2037 if (dev_priv->lfp_lvds_vbt_mode) {
1656 dev_priv->panel_fixed_mode = 2038 dev_priv->panel_fixed_mode =
@@ -1662,6 +2044,8 @@ intel_dp_init(struct drm_device *dev, int output_reg)
1662 } 2044 }
1663 } 2045 }
1664 2046
2047 intel_dp_add_properties(intel_dp, connector);
2048
1665 /* For G4X desktop chip, PEG_BAND_GAP_DATA 3:0 must first be written 2049 /* For G4X desktop chip, PEG_BAND_GAP_DATA 3:0 must first be written
1666 * 0xd. Failure to do so will result in spurious interrupts being 2050 * 0xd. Failure to do so will result in spurious interrupts being
1667 * generated on the port when a cable is not attached. 2051 * generated on the port when a cable is not attached.
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index 8828b3ac6414..9ffa61eb4d7e 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -26,14 +26,12 @@
26#define __INTEL_DRV_H__ 26#define __INTEL_DRV_H__
27 27
28#include <linux/i2c.h> 28#include <linux/i2c.h>
29#include <linux/i2c-id.h>
30#include <linux/i2c-algo-bit.h>
31#include "i915_drv.h" 29#include "i915_drv.h"
32#include "drm_crtc.h" 30#include "drm_crtc.h"
33
34#include "drm_crtc_helper.h" 31#include "drm_crtc_helper.h"
32#include "drm_fb_helper.h"
35 33
36#define wait_for(COND, MS, W) ({ \ 34#define _wait_for(COND, MS, W) ({ \
37 unsigned long timeout__ = jiffies + msecs_to_jiffies(MS); \ 35 unsigned long timeout__ = jiffies + msecs_to_jiffies(MS); \
38 int ret__ = 0; \ 36 int ret__ = 0; \
39 while (! (COND)) { \ 37 while (! (COND)) { \
@@ -41,11 +39,24 @@
41 ret__ = -ETIMEDOUT; \ 39 ret__ = -ETIMEDOUT; \
42 break; \ 40 break; \
43 } \ 41 } \
44 if (W) msleep(W); \ 42 if (W && !(in_atomic() || in_dbg_master())) msleep(W); \
45 } \ 43 } \
46 ret__; \ 44 ret__; \
47}) 45})
48 46
47#define wait_for(COND, MS) _wait_for(COND, MS, 1)
48#define wait_for_atomic(COND, MS) _wait_for(COND, MS, 0)
49
50#define MSLEEP(x) do { \
51 if (in_dbg_master()) \
52 mdelay(x); \
53 else \
54 msleep(x); \
55} while(0)
56
57#define KHz(x) (1000*x)
58#define MHz(x) KHz(1000*x)
59
49/* 60/*
50 * Display related stuff 61 * Display related stuff
51 */ 62 */
@@ -96,25 +107,39 @@
96#define INTEL_DVO_CHIP_TMDS 2 107#define INTEL_DVO_CHIP_TMDS 2
97#define INTEL_DVO_CHIP_TVOUT 4 108#define INTEL_DVO_CHIP_TVOUT 4
98 109
99struct intel_i2c_chan { 110/* drm_display_mode->private_flags */
100 struct drm_device *drm_dev; /* for getting at dev. private (mmio etc.) */ 111#define INTEL_MODE_PIXEL_MULTIPLIER_SHIFT (0x0)
101 u32 reg; /* GPIO reg */ 112#define INTEL_MODE_PIXEL_MULTIPLIER_MASK (0xf << INTEL_MODE_PIXEL_MULTIPLIER_SHIFT)
102 struct i2c_adapter adapter; 113
103 struct i2c_algo_bit_data algo; 114static inline void
104}; 115intel_mode_set_pixel_multiplier(struct drm_display_mode *mode,
116 int multiplier)
117{
118 mode->clock *= multiplier;
119 mode->private_flags |= multiplier;
120}
121
122static inline int
123intel_mode_get_pixel_multiplier(const struct drm_display_mode *mode)
124{
125 return (mode->private_flags & INTEL_MODE_PIXEL_MULTIPLIER_MASK) >> INTEL_MODE_PIXEL_MULTIPLIER_SHIFT;
126}
105 127
106struct intel_framebuffer { 128struct intel_framebuffer {
107 struct drm_framebuffer base; 129 struct drm_framebuffer base;
108 struct drm_gem_object *obj; 130 struct drm_i915_gem_object *obj;
109}; 131};
110 132
133struct intel_fbdev {
134 struct drm_fb_helper helper;
135 struct intel_framebuffer ifb;
136 struct list_head fbdev_list;
137 struct drm_display_mode *our_mode;
138};
111 139
112struct intel_encoder { 140struct intel_encoder {
113 struct drm_encoder enc; 141 struct drm_encoder base;
114 int type; 142 int type;
115 struct i2c_adapter *i2c_bus;
116 struct i2c_adapter *ddc_bus;
117 bool load_detect_temp;
118 bool needs_tv_clock; 143 bool needs_tv_clock;
119 void (*hot_plug)(struct intel_encoder *); 144 void (*hot_plug)(struct intel_encoder *);
120 int crtc_mask; 145 int crtc_mask;
@@ -123,32 +148,7 @@ struct intel_encoder {
123 148
124struct intel_connector { 149struct intel_connector {
125 struct drm_connector base; 150 struct drm_connector base;
126}; 151 struct intel_encoder *encoder;
127
128struct intel_crtc;
129struct intel_overlay {
130 struct drm_device *dev;
131 struct intel_crtc *crtc;
132 struct drm_i915_gem_object *vid_bo;
133 struct drm_i915_gem_object *old_vid_bo;
134 int active;
135 int pfit_active;
136 u32 pfit_vscale_ratio; /* shifted-point number, (1<<12) == 1.0 */
137 u32 color_key;
138 u32 brightness, contrast, saturation;
139 u32 old_xscale, old_yscale;
140 /* register access */
141 u32 flip_addr;
142 struct drm_i915_gem_object *reg_bo;
143 void *virt_addr;
144 /* flip handling */
145 uint32_t last_flip_req;
146 int hw_wedged;
147#define HW_WEDGED 1
148#define NEEDS_WAIT_FOR_FLIP 2
149#define RELEASE_OLD_VID 3
150#define SWITCH_OFF_STAGE_1 4
151#define SWITCH_OFF_STAGE_2 5
152}; 152};
153 153
154struct intel_crtc { 154struct intel_crtc {
@@ -157,6 +157,7 @@ struct intel_crtc {
157 enum plane plane; 157 enum plane plane;
158 u8 lut_r[256], lut_g[256], lut_b[256]; 158 u8 lut_r[256], lut_g[256], lut_b[256];
159 int dpms_mode; 159 int dpms_mode;
160 bool active; /* is the crtc on? independent of the dpms mode */
160 bool busy; /* is scanout buffer being updated frequently? */ 161 bool busy; /* is scanout buffer being updated frequently? */
161 struct timer_list idle_timer; 162 struct timer_list idle_timer;
162 bool lowfreq_avail; 163 bool lowfreq_avail;
@@ -164,80 +165,145 @@ struct intel_crtc {
164 struct intel_unpin_work *unpin_work; 165 struct intel_unpin_work *unpin_work;
165 int fdi_lanes; 166 int fdi_lanes;
166 167
167 struct drm_gem_object *cursor_bo; 168 struct drm_i915_gem_object *cursor_bo;
168 uint32_t cursor_addr; 169 uint32_t cursor_addr;
169 int16_t cursor_x, cursor_y; 170 int16_t cursor_x, cursor_y;
170 int16_t cursor_width, cursor_height; 171 int16_t cursor_width, cursor_height;
171 bool cursor_visible, cursor_on; 172 bool cursor_visible;
172}; 173};
173 174
174#define to_intel_crtc(x) container_of(x, struct intel_crtc, base) 175#define to_intel_crtc(x) container_of(x, struct intel_crtc, base)
175#define to_intel_connector(x) container_of(x, struct intel_connector, base) 176#define to_intel_connector(x) container_of(x, struct intel_connector, base)
176#define enc_to_intel_encoder(x) container_of(x, struct intel_encoder, enc) 177#define to_intel_encoder(x) container_of(x, struct intel_encoder, base)
177#define to_intel_framebuffer(x) container_of(x, struct intel_framebuffer, base) 178#define to_intel_framebuffer(x) container_of(x, struct intel_framebuffer, base)
178 179
180#define DIP_TYPE_AVI 0x82
181#define DIP_VERSION_AVI 0x2
182#define DIP_LEN_AVI 13
183
184struct dip_infoframe {
185 uint8_t type; /* HB0 */
186 uint8_t ver; /* HB1 */
187 uint8_t len; /* HB2 - body len, not including checksum */
188 uint8_t ecc; /* Header ECC */
189 uint8_t checksum; /* PB0 */
190 union {
191 struct {
192 /* PB1 - Y 6:5, A 4:4, B 3:2, S 1:0 */
193 uint8_t Y_A_B_S;
194 /* PB2 - C 7:6, M 5:4, R 3:0 */
195 uint8_t C_M_R;
196 /* PB3 - ITC 7:7, EC 6:4, Q 3:2, SC 1:0 */
197 uint8_t ITC_EC_Q_SC;
198 /* PB4 - VIC 6:0 */
199 uint8_t VIC;
200 /* PB5 - PR 3:0 */
201 uint8_t PR;
202 /* PB6 to PB13 */
203 uint16_t top_bar_end;
204 uint16_t bottom_bar_start;
205 uint16_t left_bar_end;
206 uint16_t right_bar_start;
207 } avi;
208 uint8_t payload[27];
209 } __attribute__ ((packed)) body;
210} __attribute__((packed));
211
212static inline struct drm_crtc *
213intel_get_crtc_for_pipe(struct drm_device *dev, int pipe)
214{
215 struct drm_i915_private *dev_priv = dev->dev_private;
216 return dev_priv->pipe_to_crtc_mapping[pipe];
217}
218
219static inline struct drm_crtc *
220intel_get_crtc_for_plane(struct drm_device *dev, int plane)
221{
222 struct drm_i915_private *dev_priv = dev->dev_private;
223 return dev_priv->plane_to_crtc_mapping[plane];
224}
225
179struct intel_unpin_work { 226struct intel_unpin_work {
180 struct work_struct work; 227 struct work_struct work;
181 struct drm_device *dev; 228 struct drm_device *dev;
182 struct drm_gem_object *old_fb_obj; 229 struct drm_i915_gem_object *old_fb_obj;
183 struct drm_gem_object *pending_flip_obj; 230 struct drm_i915_gem_object *pending_flip_obj;
184 struct drm_pending_vblank_event *event; 231 struct drm_pending_vblank_event *event;
185 int pending; 232 int pending;
186 bool enable_stall_check; 233 bool enable_stall_check;
187}; 234};
188 235
189struct i2c_adapter *intel_i2c_create(struct drm_device *dev, const u32 reg,
190 const char *name);
191void intel_i2c_destroy(struct i2c_adapter *adapter);
192int intel_ddc_get_modes(struct drm_connector *c, struct i2c_adapter *adapter); 236int intel_ddc_get_modes(struct drm_connector *c, struct i2c_adapter *adapter);
193extern bool intel_ddc_probe(struct intel_encoder *intel_encoder); 237extern bool intel_ddc_probe(struct intel_encoder *intel_encoder, int ddc_bus);
194void intel_i2c_quirk_set(struct drm_device *dev, bool enable); 238
195void intel_i2c_reset_gmbus(struct drm_device *dev); 239extern void intel_attach_force_audio_property(struct drm_connector *connector);
240extern void intel_attach_broadcast_rgb_property(struct drm_connector *connector);
196 241
197extern void intel_crt_init(struct drm_device *dev); 242extern void intel_crt_init(struct drm_device *dev);
198extern void intel_hdmi_init(struct drm_device *dev, int sdvox_reg); 243extern void intel_hdmi_init(struct drm_device *dev, int sdvox_reg);
244void intel_dip_infoframe_csum(struct dip_infoframe *avi_if);
199extern bool intel_sdvo_init(struct drm_device *dev, int output_device); 245extern bool intel_sdvo_init(struct drm_device *dev, int output_device);
200extern void intel_dvo_init(struct drm_device *dev); 246extern void intel_dvo_init(struct drm_device *dev);
201extern void intel_tv_init(struct drm_device *dev); 247extern void intel_tv_init(struct drm_device *dev);
202extern void intel_mark_busy(struct drm_device *dev, struct drm_gem_object *obj); 248extern void intel_mark_busy(struct drm_device *dev,
203extern void intel_lvds_init(struct drm_device *dev); 249 struct drm_i915_gem_object *obj);
250extern bool intel_lvds_init(struct drm_device *dev);
204extern void intel_dp_init(struct drm_device *dev, int dp_reg); 251extern void intel_dp_init(struct drm_device *dev, int dp_reg);
205void 252void
206intel_dp_set_m_n(struct drm_crtc *crtc, struct drm_display_mode *mode, 253intel_dp_set_m_n(struct drm_crtc *crtc, struct drm_display_mode *mode,
207 struct drm_display_mode *adjusted_mode); 254 struct drm_display_mode *adjusted_mode);
208extern bool intel_pch_has_edp(struct drm_crtc *crtc);
209extern bool intel_dpd_is_edp(struct drm_device *dev); 255extern bool intel_dpd_is_edp(struct drm_device *dev);
210extern void intel_edp_link_config (struct intel_encoder *, int *, int *); 256extern void intel_edp_link_config (struct intel_encoder *, int *, int *);
257extern bool intel_encoder_is_pch_edp(struct drm_encoder *encoder);
211 258
212 259/* intel_panel.c */
213extern void intel_fixed_panel_mode(struct drm_display_mode *fixed_mode, 260extern void intel_fixed_panel_mode(struct drm_display_mode *fixed_mode,
214 struct drm_display_mode *adjusted_mode); 261 struct drm_display_mode *adjusted_mode);
215extern void intel_pch_panel_fitting(struct drm_device *dev, 262extern void intel_pch_panel_fitting(struct drm_device *dev,
216 int fitting_mode, 263 int fitting_mode,
217 struct drm_display_mode *mode, 264 struct drm_display_mode *mode,
218 struct drm_display_mode *adjusted_mode); 265 struct drm_display_mode *adjusted_mode);
266extern u32 intel_panel_get_max_backlight(struct drm_device *dev);
267extern u32 intel_panel_get_backlight(struct drm_device *dev);
268extern void intel_panel_set_backlight(struct drm_device *dev, u32 level);
269extern void intel_panel_setup_backlight(struct drm_device *dev);
270extern void intel_panel_enable_backlight(struct drm_device *dev);
271extern void intel_panel_disable_backlight(struct drm_device *dev);
272extern enum drm_connector_status intel_panel_detect(struct drm_device *dev);
219 273
220extern int intel_panel_fitter_pipe (struct drm_device *dev);
221extern void intel_crtc_load_lut(struct drm_crtc *crtc); 274extern void intel_crtc_load_lut(struct drm_crtc *crtc);
222extern void intel_encoder_prepare (struct drm_encoder *encoder); 275extern void intel_encoder_prepare (struct drm_encoder *encoder);
223extern void intel_encoder_commit (struct drm_encoder *encoder); 276extern void intel_encoder_commit (struct drm_encoder *encoder);
224extern void intel_encoder_destroy(struct drm_encoder *encoder); 277extern void intel_encoder_destroy(struct drm_encoder *encoder);
225 278
226extern struct drm_encoder *intel_attached_encoder(struct drm_connector *connector); 279static inline struct intel_encoder *intel_attached_encoder(struct drm_connector *connector)
280{
281 return to_intel_connector(connector)->encoder;
282}
283
284extern void intel_connector_attach_encoder(struct intel_connector *connector,
285 struct intel_encoder *encoder);
286extern struct drm_encoder *intel_best_encoder(struct drm_connector *connector);
227 287
228extern struct drm_display_mode *intel_crtc_mode_get(struct drm_device *dev, 288extern struct drm_display_mode *intel_crtc_mode_get(struct drm_device *dev,
229 struct drm_crtc *crtc); 289 struct drm_crtc *crtc);
230int intel_get_pipe_from_crtc_id(struct drm_device *dev, void *data, 290int intel_get_pipe_from_crtc_id(struct drm_device *dev, void *data,
231 struct drm_file *file_priv); 291 struct drm_file *file_priv);
232extern void intel_wait_for_vblank(struct drm_device *dev, int pipe); 292extern void intel_wait_for_vblank(struct drm_device *dev, int pipe);
233extern struct drm_crtc *intel_get_crtc_from_pipe(struct drm_device *dev, int pipe); 293extern void intel_wait_for_pipe_off(struct drm_device *dev, int pipe);
234extern struct drm_crtc *intel_get_load_detect_pipe(struct intel_encoder *intel_encoder, 294
235 struct drm_connector *connector, 295struct intel_load_detect_pipe {
236 struct drm_display_mode *mode, 296 struct drm_framebuffer *release_fb;
237 int *dpms_mode); 297 bool load_detect_temp;
298 int dpms_mode;
299};
300extern bool intel_get_load_detect_pipe(struct intel_encoder *intel_encoder,
301 struct drm_connector *connector,
302 struct drm_display_mode *mode,
303 struct intel_load_detect_pipe *old);
238extern void intel_release_load_detect_pipe(struct intel_encoder *intel_encoder, 304extern void intel_release_load_detect_pipe(struct intel_encoder *intel_encoder,
239 struct drm_connector *connector, 305 struct drm_connector *connector,
240 int dpms_mode); 306 struct intel_load_detect_pipe *old);
241 307
242extern struct drm_connector* intel_sdvo_find(struct drm_device *dev, int sdvoB); 308extern struct drm_connector* intel_sdvo_find(struct drm_device *dev, int sdvoB);
243extern int intel_sdvo_supports_hotplug(struct drm_connector *connector); 309extern int intel_sdvo_supports_hotplug(struct drm_connector *connector);
@@ -247,17 +313,21 @@ extern void intel_crtc_fb_gamma_set(struct drm_crtc *crtc, u16 red, u16 green,
247 u16 blue, int regno); 313 u16 blue, int regno);
248extern void intel_crtc_fb_gamma_get(struct drm_crtc *crtc, u16 *red, u16 *green, 314extern void intel_crtc_fb_gamma_get(struct drm_crtc *crtc, u16 *red, u16 *green,
249 u16 *blue, int regno); 315 u16 *blue, int regno);
250extern void intel_init_clock_gating(struct drm_device *dev); 316extern void intel_enable_clock_gating(struct drm_device *dev);
251extern void ironlake_enable_drps(struct drm_device *dev); 317extern void ironlake_enable_drps(struct drm_device *dev);
252extern void ironlake_disable_drps(struct drm_device *dev); 318extern void ironlake_disable_drps(struct drm_device *dev);
319extern void gen6_enable_rps(struct drm_i915_private *dev_priv);
320extern void gen6_disable_rps(struct drm_device *dev);
321extern void intel_init_emon(struct drm_device *dev);
253 322
254extern int intel_pin_and_fence_fb_obj(struct drm_device *dev, 323extern int intel_pin_and_fence_fb_obj(struct drm_device *dev,
255 struct drm_gem_object *obj); 324 struct drm_i915_gem_object *obj,
325 struct intel_ring_buffer *pipelined);
256 326
257extern int intel_framebuffer_init(struct drm_device *dev, 327extern int intel_framebuffer_init(struct drm_device *dev,
258 struct intel_framebuffer *ifb, 328 struct intel_framebuffer *ifb,
259 struct drm_mode_fb_cmd *mode_cmd, 329 struct drm_mode_fb_cmd *mode_cmd,
260 struct drm_gem_object *obj); 330 struct drm_i915_gem_object *obj);
261extern int intel_fbdev_init(struct drm_device *dev); 331extern int intel_fbdev_init(struct drm_device *dev);
262extern void intel_fbdev_fini(struct drm_device *dev); 332extern void intel_fbdev_fini(struct drm_device *dev);
263 333
@@ -268,12 +338,13 @@ extern void intel_finish_page_flip_plane(struct drm_device *dev, int plane);
268extern void intel_setup_overlay(struct drm_device *dev); 338extern void intel_setup_overlay(struct drm_device *dev);
269extern void intel_cleanup_overlay(struct drm_device *dev); 339extern void intel_cleanup_overlay(struct drm_device *dev);
270extern int intel_overlay_switch_off(struct intel_overlay *overlay); 340extern int intel_overlay_switch_off(struct intel_overlay *overlay);
271extern int intel_overlay_recover_from_interrupt(struct intel_overlay *overlay,
272 int interruptible);
273extern int intel_overlay_put_image(struct drm_device *dev, void *data, 341extern int intel_overlay_put_image(struct drm_device *dev, void *data,
274 struct drm_file *file_priv); 342 struct drm_file *file_priv);
275extern int intel_overlay_attrs(struct drm_device *dev, void *data, 343extern int intel_overlay_attrs(struct drm_device *dev, void *data,
276 struct drm_file *file_priv); 344 struct drm_file *file_priv);
277 345
278extern void intel_fb_output_poll_changed(struct drm_device *dev); 346extern void intel_fb_output_poll_changed(struct drm_device *dev);
347extern void intel_fb_restore_mode(struct drm_device *dev);
348
349extern void intel_init_clock_gating(struct drm_device *dev);
279#endif /* __INTEL_DRV_H__ */ 350#endif /* __INTEL_DRV_H__ */
diff --git a/drivers/gpu/drm/i915/intel_dvo.c b/drivers/gpu/drm/i915/intel_dvo.c
index 7c9ec1472d46..6eda1b51c636 100644
--- a/drivers/gpu/drm/i915/intel_dvo.c
+++ b/drivers/gpu/drm/i915/intel_dvo.c
@@ -72,7 +72,7 @@ static const struct intel_dvo_device intel_dvo_devices[] = {
72 .name = "ch7017", 72 .name = "ch7017",
73 .dvo_reg = DVOC, 73 .dvo_reg = DVOC,
74 .slave_addr = 0x75, 74 .slave_addr = 0x75,
75 .gpio = GPIOE, 75 .gpio = GMBUS_PORT_DPB,
76 .dev_ops = &ch7017_ops, 76 .dev_ops = &ch7017_ops,
77 } 77 }
78}; 78};
@@ -88,7 +88,13 @@ struct intel_dvo {
88 88
89static struct intel_dvo *enc_to_intel_dvo(struct drm_encoder *encoder) 89static struct intel_dvo *enc_to_intel_dvo(struct drm_encoder *encoder)
90{ 90{
91 return container_of(enc_to_intel_encoder(encoder), struct intel_dvo, base); 91 return container_of(encoder, struct intel_dvo, base.base);
92}
93
94static struct intel_dvo *intel_attached_dvo(struct drm_connector *connector)
95{
96 return container_of(intel_attached_encoder(connector),
97 struct intel_dvo, base);
92} 98}
93 99
94static void intel_dvo_dpms(struct drm_encoder *encoder, int mode) 100static void intel_dvo_dpms(struct drm_encoder *encoder, int mode)
@@ -112,8 +118,7 @@ static void intel_dvo_dpms(struct drm_encoder *encoder, int mode)
112static int intel_dvo_mode_valid(struct drm_connector *connector, 118static int intel_dvo_mode_valid(struct drm_connector *connector,
113 struct drm_display_mode *mode) 119 struct drm_display_mode *mode)
114{ 120{
115 struct drm_encoder *encoder = intel_attached_encoder(connector); 121 struct intel_dvo *intel_dvo = intel_attached_dvo(connector);
116 struct intel_dvo *intel_dvo = enc_to_intel_dvo(encoder);
117 122
118 if (mode->flags & DRM_MODE_FLAG_DBLSCAN) 123 if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
119 return MODE_NO_DBLESCAN; 124 return MODE_NO_DBLESCAN;
@@ -173,7 +178,7 @@ static void intel_dvo_mode_set(struct drm_encoder *encoder,
173 int pipe = intel_crtc->pipe; 178 int pipe = intel_crtc->pipe;
174 u32 dvo_val; 179 u32 dvo_val;
175 u32 dvo_reg = intel_dvo->dev.dvo_reg, dvo_srcdim_reg; 180 u32 dvo_reg = intel_dvo->dev.dvo_reg, dvo_srcdim_reg;
176 int dpll_reg = (pipe == 0) ? DPLL_A : DPLL_B; 181 int dpll_reg = DPLL(pipe);
177 182
178 switch (dvo_reg) { 183 switch (dvo_reg) {
179 case DVOA: 184 case DVOA:
@@ -224,23 +229,22 @@ static void intel_dvo_mode_set(struct drm_encoder *encoder,
224static enum drm_connector_status 229static enum drm_connector_status
225intel_dvo_detect(struct drm_connector *connector, bool force) 230intel_dvo_detect(struct drm_connector *connector, bool force)
226{ 231{
227 struct drm_encoder *encoder = intel_attached_encoder(connector); 232 struct intel_dvo *intel_dvo = intel_attached_dvo(connector);
228 struct intel_dvo *intel_dvo = enc_to_intel_dvo(encoder);
229
230 return intel_dvo->dev.dev_ops->detect(&intel_dvo->dev); 233 return intel_dvo->dev.dev_ops->detect(&intel_dvo->dev);
231} 234}
232 235
233static int intel_dvo_get_modes(struct drm_connector *connector) 236static int intel_dvo_get_modes(struct drm_connector *connector)
234{ 237{
235 struct drm_encoder *encoder = intel_attached_encoder(connector); 238 struct intel_dvo *intel_dvo = intel_attached_dvo(connector);
236 struct intel_dvo *intel_dvo = enc_to_intel_dvo(encoder); 239 struct drm_i915_private *dev_priv = connector->dev->dev_private;
237 240
238 /* We should probably have an i2c driver get_modes function for those 241 /* We should probably have an i2c driver get_modes function for those
239 * devices which will have a fixed set of modes determined by the chip 242 * devices which will have a fixed set of modes determined by the chip
240 * (TV-out, for example), but for now with just TMDS and LVDS, 243 * (TV-out, for example), but for now with just TMDS and LVDS,
241 * that's not the case. 244 * that's not the case.
242 */ 245 */
243 intel_ddc_get_modes(connector, intel_dvo->base.ddc_bus); 246 intel_ddc_get_modes(connector,
247 &dev_priv->gmbus[GMBUS_PORT_DPC].adapter);
244 if (!list_empty(&connector->probed_modes)) 248 if (!list_empty(&connector->probed_modes))
245 return 1; 249 return 1;
246 250
@@ -281,7 +285,7 @@ static const struct drm_connector_funcs intel_dvo_connector_funcs = {
281static const struct drm_connector_helper_funcs intel_dvo_connector_helper_funcs = { 285static const struct drm_connector_helper_funcs intel_dvo_connector_helper_funcs = {
282 .mode_valid = intel_dvo_mode_valid, 286 .mode_valid = intel_dvo_mode_valid,
283 .get_modes = intel_dvo_get_modes, 287 .get_modes = intel_dvo_get_modes,
284 .best_encoder = intel_attached_encoder, 288 .best_encoder = intel_best_encoder,
285}; 289};
286 290
287static void intel_dvo_enc_destroy(struct drm_encoder *encoder) 291static void intel_dvo_enc_destroy(struct drm_encoder *encoder)
@@ -311,8 +315,7 @@ intel_dvo_get_current_mode(struct drm_connector *connector)
311{ 315{
312 struct drm_device *dev = connector->dev; 316 struct drm_device *dev = connector->dev;
313 struct drm_i915_private *dev_priv = dev->dev_private; 317 struct drm_i915_private *dev_priv = dev->dev_private;
314 struct drm_encoder *encoder = intel_attached_encoder(connector); 318 struct intel_dvo *intel_dvo = intel_attached_dvo(connector);
315 struct intel_dvo *intel_dvo = enc_to_intel_dvo(encoder);
316 uint32_t dvo_val = I915_READ(intel_dvo->dev.dvo_reg); 319 uint32_t dvo_val = I915_READ(intel_dvo->dev.dvo_reg);
317 struct drm_display_mode *mode = NULL; 320 struct drm_display_mode *mode = NULL;
318 321
@@ -323,7 +326,7 @@ intel_dvo_get_current_mode(struct drm_connector *connector)
323 struct drm_crtc *crtc; 326 struct drm_crtc *crtc;
324 int pipe = (dvo_val & DVO_PIPE_B_SELECT) ? 1 : 0; 327 int pipe = (dvo_val & DVO_PIPE_B_SELECT) ? 1 : 0;
325 328
326 crtc = intel_get_crtc_from_pipe(dev, pipe); 329 crtc = intel_get_crtc_for_pipe(dev, pipe);
327 if (crtc) { 330 if (crtc) {
328 mode = intel_crtc_mode_get(dev, crtc); 331 mode = intel_crtc_mode_get(dev, crtc);
329 if (mode) { 332 if (mode) {
@@ -341,11 +344,10 @@ intel_dvo_get_current_mode(struct drm_connector *connector)
341 344
342void intel_dvo_init(struct drm_device *dev) 345void intel_dvo_init(struct drm_device *dev)
343{ 346{
347 struct drm_i915_private *dev_priv = dev->dev_private;
344 struct intel_encoder *intel_encoder; 348 struct intel_encoder *intel_encoder;
345 struct intel_dvo *intel_dvo; 349 struct intel_dvo *intel_dvo;
346 struct intel_connector *intel_connector; 350 struct intel_connector *intel_connector;
347 struct i2c_adapter *i2cbus = NULL;
348 int ret = 0;
349 int i; 351 int i;
350 int encoder_type = DRM_MODE_ENCODER_NONE; 352 int encoder_type = DRM_MODE_ENCODER_NONE;
351 353
@@ -360,16 +362,14 @@ void intel_dvo_init(struct drm_device *dev)
360 } 362 }
361 363
362 intel_encoder = &intel_dvo->base; 364 intel_encoder = &intel_dvo->base;
363 365 drm_encoder_init(dev, &intel_encoder->base,
364 /* Set up the DDC bus */ 366 &intel_dvo_enc_funcs, encoder_type);
365 intel_encoder->ddc_bus = intel_i2c_create(dev, GPIOD, "DVODDC_D");
366 if (!intel_encoder->ddc_bus)
367 goto free_intel;
368 367
369 /* Now, try to find a controller */ 368 /* Now, try to find a controller */
370 for (i = 0; i < ARRAY_SIZE(intel_dvo_devices); i++) { 369 for (i = 0; i < ARRAY_SIZE(intel_dvo_devices); i++) {
371 struct drm_connector *connector = &intel_connector->base; 370 struct drm_connector *connector = &intel_connector->base;
372 const struct intel_dvo_device *dvo = &intel_dvo_devices[i]; 371 const struct intel_dvo_device *dvo = &intel_dvo_devices[i];
372 struct i2c_adapter *i2c;
373 int gpio; 373 int gpio;
374 374
375 /* Allow the I2C driver info to specify the GPIO to be used in 375 /* Allow the I2C driver info to specify the GPIO to be used in
@@ -379,24 +379,18 @@ void intel_dvo_init(struct drm_device *dev)
379 if (dvo->gpio != 0) 379 if (dvo->gpio != 0)
380 gpio = dvo->gpio; 380 gpio = dvo->gpio;
381 else if (dvo->type == INTEL_DVO_CHIP_LVDS) 381 else if (dvo->type == INTEL_DVO_CHIP_LVDS)
382 gpio = GPIOB; 382 gpio = GMBUS_PORT_SSC;
383 else 383 else
384 gpio = GPIOE; 384 gpio = GMBUS_PORT_DPB;
385 385
386 /* Set up the I2C bus necessary for the chip we're probing. 386 /* Set up the I2C bus necessary for the chip we're probing.
387 * It appears that everything is on GPIOE except for panels 387 * It appears that everything is on GPIOE except for panels
388 * on i830 laptops, which are on GPIOB (DVOA). 388 * on i830 laptops, which are on GPIOB (DVOA).
389 */ 389 */
390 if (i2cbus != NULL) 390 i2c = &dev_priv->gmbus[gpio].adapter;
391 intel_i2c_destroy(i2cbus);
392 if (!(i2cbus = intel_i2c_create(dev, gpio,
393 gpio == GPIOB ? "DVOI2C_B" : "DVOI2C_E"))) {
394 continue;
395 }
396 391
397 intel_dvo->dev = *dvo; 392 intel_dvo->dev = *dvo;
398 ret = dvo->dev_ops->init(&intel_dvo->dev, i2cbus); 393 if (!dvo->dev_ops->init(&intel_dvo->dev, i2c))
399 if (!ret)
400 continue; 394 continue;
401 395
402 intel_encoder->type = INTEL_OUTPUT_DVO; 396 intel_encoder->type = INTEL_OUTPUT_DVO;
@@ -427,13 +421,10 @@ void intel_dvo_init(struct drm_device *dev)
427 connector->interlace_allowed = false; 421 connector->interlace_allowed = false;
428 connector->doublescan_allowed = false; 422 connector->doublescan_allowed = false;
429 423
430 drm_encoder_init(dev, &intel_encoder->enc, 424 drm_encoder_helper_add(&intel_encoder->base,
431 &intel_dvo_enc_funcs, encoder_type);
432 drm_encoder_helper_add(&intel_encoder->enc,
433 &intel_dvo_helper_funcs); 425 &intel_dvo_helper_funcs);
434 426
435 drm_mode_connector_attach_encoder(&intel_connector->base, 427 intel_connector_attach_encoder(intel_connector, intel_encoder);
436 &intel_encoder->enc);
437 if (dvo->type == INTEL_DVO_CHIP_LVDS) { 428 if (dvo->type == INTEL_DVO_CHIP_LVDS) {
438 /* For our LVDS chipsets, we should hopefully be able 429 /* For our LVDS chipsets, we should hopefully be able
439 * to dig the fixed panel mode out of the BIOS data. 430 * to dig the fixed panel mode out of the BIOS data.
@@ -451,11 +442,7 @@ void intel_dvo_init(struct drm_device *dev)
451 return; 442 return;
452 } 443 }
453 444
454 intel_i2c_destroy(intel_encoder->ddc_bus); 445 drm_encoder_cleanup(&intel_encoder->base);
455 /* Didn't find a chip, so tear down. */
456 if (i2cbus != NULL)
457 intel_i2c_destroy(i2cbus);
458free_intel:
459 kfree(intel_dvo); 446 kfree(intel_dvo);
460 kfree(intel_connector); 447 kfree(intel_connector);
461} 448}
diff --git a/drivers/gpu/drm/i915/intel_fb.c b/drivers/gpu/drm/i915/intel_fb.c
index b61966c126d3..ec49bae73382 100644
--- a/drivers/gpu/drm/i915/intel_fb.c
+++ b/drivers/gpu/drm/i915/intel_fb.c
@@ -44,13 +44,6 @@
44#include "i915_drm.h" 44#include "i915_drm.h"
45#include "i915_drv.h" 45#include "i915_drv.h"
46 46
47struct intel_fbdev {
48 struct drm_fb_helper helper;
49 struct intel_framebuffer ifb;
50 struct list_head fbdev_list;
51 struct drm_display_mode *our_mode;
52};
53
54static struct fb_ops intelfb_ops = { 47static struct fb_ops intelfb_ops = {
55 .owner = THIS_MODULE, 48 .owner = THIS_MODULE,
56 .fb_check_var = drm_fb_helper_check_var, 49 .fb_check_var = drm_fb_helper_check_var,
@@ -69,13 +62,13 @@ static int intelfb_create(struct intel_fbdev *ifbdev,
69 struct drm_fb_helper_surface_size *sizes) 62 struct drm_fb_helper_surface_size *sizes)
70{ 63{
71 struct drm_device *dev = ifbdev->helper.dev; 64 struct drm_device *dev = ifbdev->helper.dev;
65 struct drm_i915_private *dev_priv = dev->dev_private;
72 struct fb_info *info; 66 struct fb_info *info;
73 struct drm_framebuffer *fb; 67 struct drm_framebuffer *fb;
74 struct drm_mode_fb_cmd mode_cmd; 68 struct drm_mode_fb_cmd mode_cmd;
75 struct drm_gem_object *fbo = NULL; 69 struct drm_i915_gem_object *obj;
76 struct drm_i915_gem_object *obj_priv;
77 struct device *device = &dev->pdev->dev; 70 struct device *device = &dev->pdev->dev;
78 int size, ret, mmio_bar = IS_I9XX(dev) ? 0 : 1; 71 int size, ret;
79 72
80 /* we don't do packed 24bpp */ 73 /* we don't do packed 24bpp */
81 if (sizes->surface_bpp == 24) 74 if (sizes->surface_bpp == 24)
@@ -85,34 +78,27 @@ static int intelfb_create(struct intel_fbdev *ifbdev,
85 mode_cmd.height = sizes->surface_height; 78 mode_cmd.height = sizes->surface_height;
86 79
87 mode_cmd.bpp = sizes->surface_bpp; 80 mode_cmd.bpp = sizes->surface_bpp;
88 mode_cmd.pitch = ALIGN(mode_cmd.width * ((mode_cmd.bpp + 1) / 8), 64); 81 mode_cmd.pitch = ALIGN(mode_cmd.width * ((mode_cmd.bpp + 7) / 8), 64);
89 mode_cmd.depth = sizes->surface_depth; 82 mode_cmd.depth = sizes->surface_depth;
90 83
91 size = mode_cmd.pitch * mode_cmd.height; 84 size = mode_cmd.pitch * mode_cmd.height;
92 size = ALIGN(size, PAGE_SIZE); 85 size = ALIGN(size, PAGE_SIZE);
93 fbo = i915_gem_alloc_object(dev, size); 86 obj = i915_gem_alloc_object(dev, size);
94 if (!fbo) { 87 if (!obj) {
95 DRM_ERROR("failed to allocate framebuffer\n"); 88 DRM_ERROR("failed to allocate framebuffer\n");
96 ret = -ENOMEM; 89 ret = -ENOMEM;
97 goto out; 90 goto out;
98 } 91 }
99 obj_priv = to_intel_bo(fbo);
100 92
101 mutex_lock(&dev->struct_mutex); 93 mutex_lock(&dev->struct_mutex);
102 94
103 ret = intel_pin_and_fence_fb_obj(dev, fbo); 95 /* Flush everything out, we'll be doing GTT only from now on */
96 ret = intel_pin_and_fence_fb_obj(dev, obj, false);
104 if (ret) { 97 if (ret) {
105 DRM_ERROR("failed to pin fb: %d\n", ret); 98 DRM_ERROR("failed to pin fb: %d\n", ret);
106 goto out_unref; 99 goto out_unref;
107 } 100 }
108 101
109 /* Flush everything out, we'll be doing GTT only from now on */
110 ret = i915_gem_object_set_to_gtt_domain(fbo, 1);
111 if (ret) {
112 DRM_ERROR("failed to bind fb: %d.\n", ret);
113 goto out_unpin;
114 }
115
116 info = framebuffer_alloc(0, device); 102 info = framebuffer_alloc(0, device);
117 if (!info) { 103 if (!info) {
118 ret = -ENOMEM; 104 ret = -ENOMEM;
@@ -121,7 +107,7 @@ static int intelfb_create(struct intel_fbdev *ifbdev,
121 107
122 info->par = ifbdev; 108 info->par = ifbdev;
123 109
124 ret = intel_framebuffer_init(dev, &ifbdev->ifb, &mode_cmd, fbo); 110 ret = intel_framebuffer_init(dev, &ifbdev->ifb, &mode_cmd, obj);
125 if (ret) 111 if (ret)
126 goto out_unpin; 112 goto out_unpin;
127 113
@@ -135,6 +121,11 @@ static int intelfb_create(struct intel_fbdev *ifbdev,
135 info->flags = FBINFO_DEFAULT | FBINFO_CAN_FORCE_OUTPUT; 121 info->flags = FBINFO_DEFAULT | FBINFO_CAN_FORCE_OUTPUT;
136 info->fbops = &intelfb_ops; 122 info->fbops = &intelfb_ops;
137 123
124 ret = fb_alloc_cmap(&info->cmap, 256, 0);
125 if (ret) {
126 ret = -ENOMEM;
127 goto out_unpin;
128 }
138 /* setup aperture base/size for vesafb takeover */ 129 /* setup aperture base/size for vesafb takeover */
139 info->apertures = alloc_apertures(1); 130 info->apertures = alloc_apertures(1);
140 if (!info->apertures) { 131 if (!info->apertures) {
@@ -142,26 +133,17 @@ static int intelfb_create(struct intel_fbdev *ifbdev,
142 goto out_unpin; 133 goto out_unpin;
143 } 134 }
144 info->apertures->ranges[0].base = dev->mode_config.fb_base; 135 info->apertures->ranges[0].base = dev->mode_config.fb_base;
145 if (IS_I9XX(dev)) 136 info->apertures->ranges[0].size =
146 info->apertures->ranges[0].size = pci_resource_len(dev->pdev, 2); 137 dev_priv->mm.gtt->gtt_mappable_entries << PAGE_SHIFT;
147 else
148 info->apertures->ranges[0].size = pci_resource_len(dev->pdev, 0);
149 138
150 info->fix.smem_start = dev->mode_config.fb_base + obj_priv->gtt_offset; 139 info->fix.smem_start = dev->mode_config.fb_base + obj->gtt_offset;
151 info->fix.smem_len = size; 140 info->fix.smem_len = size;
152 141
153 info->screen_base = ioremap_wc(dev->agp->base + obj_priv->gtt_offset, 142 info->screen_base = ioremap_wc(dev->agp->base + obj->gtt_offset, size);
154 size);
155 if (!info->screen_base) { 143 if (!info->screen_base) {
156 ret = -ENOSPC; 144 ret = -ENOSPC;
157 goto out_unpin; 145 goto out_unpin;
158 } 146 }
159
160 ret = fb_alloc_cmap(&info->cmap, 256, 0);
161 if (ret) {
162 ret = -ENOMEM;
163 goto out_unpin;
164 }
165 info->screen_size = size; 147 info->screen_size = size;
166 148
167// memset(info->screen_base, 0, size); 149// memset(info->screen_base, 0, size);
@@ -169,10 +151,6 @@ static int intelfb_create(struct intel_fbdev *ifbdev,
169 drm_fb_helper_fill_fix(info, fb->pitch, fb->depth); 151 drm_fb_helper_fill_fix(info, fb->pitch, fb->depth);
170 drm_fb_helper_fill_var(info, &ifbdev->helper, sizes->fb_width, sizes->fb_height); 152 drm_fb_helper_fill_var(info, &ifbdev->helper, sizes->fb_width, sizes->fb_height);
171 153
172 /* FIXME: we really shouldn't expose mmio space at all */
173 info->fix.mmio_start = pci_resource_start(dev->pdev, mmio_bar);
174 info->fix.mmio_len = pci_resource_len(dev->pdev, mmio_bar);
175
176 info->pixmap.size = 64*1024; 154 info->pixmap.size = 64*1024;
177 info->pixmap.buf_align = 8; 155 info->pixmap.buf_align = 8;
178 info->pixmap.access_align = 32; 156 info->pixmap.access_align = 32;
@@ -181,7 +159,7 @@ static int intelfb_create(struct intel_fbdev *ifbdev,
181 159
182 DRM_DEBUG_KMS("allocated %dx%d fb: 0x%08x, bo %p\n", 160 DRM_DEBUG_KMS("allocated %dx%d fb: 0x%08x, bo %p\n",
183 fb->width, fb->height, 161 fb->width, fb->height,
184 obj_priv->gtt_offset, fbo); 162 obj->gtt_offset, obj);
185 163
186 164
187 mutex_unlock(&dev->struct_mutex); 165 mutex_unlock(&dev->struct_mutex);
@@ -189,9 +167,9 @@ static int intelfb_create(struct intel_fbdev *ifbdev,
189 return 0; 167 return 0;
190 168
191out_unpin: 169out_unpin:
192 i915_gem_object_unpin(fbo); 170 i915_gem_object_unpin(obj);
193out_unref: 171out_unref:
194 drm_gem_object_unreference(fbo); 172 drm_gem_object_unreference(&obj->base);
195 mutex_unlock(&dev->struct_mutex); 173 mutex_unlock(&dev->struct_mutex);
196out: 174out:
197 return ret; 175 return ret;
@@ -219,8 +197,8 @@ static struct drm_fb_helper_funcs intel_fb_helper_funcs = {
219 .fb_probe = intel_fb_find_or_create_single, 197 .fb_probe = intel_fb_find_or_create_single,
220}; 198};
221 199
222int intel_fbdev_destroy(struct drm_device *dev, 200static void intel_fbdev_destroy(struct drm_device *dev,
223 struct intel_fbdev *ifbdev) 201 struct intel_fbdev *ifbdev)
224{ 202{
225 struct fb_info *info; 203 struct fb_info *info;
226 struct intel_framebuffer *ifb = &ifbdev->ifb; 204 struct intel_framebuffer *ifb = &ifbdev->ifb;
@@ -238,11 +216,9 @@ int intel_fbdev_destroy(struct drm_device *dev,
238 216
239 drm_framebuffer_cleanup(&ifb->base); 217 drm_framebuffer_cleanup(&ifb->base);
240 if (ifb->obj) { 218 if (ifb->obj) {
241 drm_gem_object_unreference(ifb->obj); 219 drm_gem_object_unreference_unlocked(&ifb->obj->base);
242 ifb->obj = NULL; 220 ifb->obj = NULL;
243 } 221 }
244
245 return 0;
246} 222}
247 223
248int intel_fbdev_init(struct drm_device *dev) 224int intel_fbdev_init(struct drm_device *dev)
@@ -288,3 +264,13 @@ void intel_fb_output_poll_changed(struct drm_device *dev)
288 drm_i915_private_t *dev_priv = dev->dev_private; 264 drm_i915_private_t *dev_priv = dev->dev_private;
289 drm_fb_helper_hotplug_event(&dev_priv->fbdev->helper); 265 drm_fb_helper_hotplug_event(&dev_priv->fbdev->helper);
290} 266}
267
268void intel_fb_restore_mode(struct drm_device *dev)
269{
270 int ret;
271 drm_i915_private_t *dev_priv = dev->dev_private;
272
273 ret = drm_fb_helper_restore_fbdev_mode(&dev_priv->fbdev->helper);
274 if (ret)
275 DRM_DEBUG("failed to restore crtc mode\n");
276}
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c
index 926934a482ec..aa0a8e83142e 100644
--- a/drivers/gpu/drm/i915/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/intel_hdmi.c
@@ -40,12 +40,76 @@
40struct intel_hdmi { 40struct intel_hdmi {
41 struct intel_encoder base; 41 struct intel_encoder base;
42 u32 sdvox_reg; 42 u32 sdvox_reg;
43 int ddc_bus;
44 uint32_t color_range;
43 bool has_hdmi_sink; 45 bool has_hdmi_sink;
46 bool has_audio;
47 int force_audio;
44}; 48};
45 49
46static struct intel_hdmi *enc_to_intel_hdmi(struct drm_encoder *encoder) 50static struct intel_hdmi *enc_to_intel_hdmi(struct drm_encoder *encoder)
47{ 51{
48 return container_of(enc_to_intel_encoder(encoder), struct intel_hdmi, base); 52 return container_of(encoder, struct intel_hdmi, base.base);
53}
54
55static struct intel_hdmi *intel_attached_hdmi(struct drm_connector *connector)
56{
57 return container_of(intel_attached_encoder(connector),
58 struct intel_hdmi, base);
59}
60
61void intel_dip_infoframe_csum(struct dip_infoframe *avi_if)
62{
63 uint8_t *data = (uint8_t *)avi_if;
64 uint8_t sum = 0;
65 unsigned i;
66
67 avi_if->checksum = 0;
68 avi_if->ecc = 0;
69
70 for (i = 0; i < sizeof(*avi_if); i++)
71 sum += data[i];
72
73 avi_if->checksum = 0x100 - sum;
74}
75
76static void intel_hdmi_set_avi_infoframe(struct drm_encoder *encoder)
77{
78 struct dip_infoframe avi_if = {
79 .type = DIP_TYPE_AVI,
80 .ver = DIP_VERSION_AVI,
81 .len = DIP_LEN_AVI,
82 };
83 uint32_t *data = (uint32_t *)&avi_if;
84 struct drm_device *dev = encoder->dev;
85 struct drm_i915_private *dev_priv = dev->dev_private;
86 struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
87 u32 port;
88 unsigned i;
89
90 if (!intel_hdmi->has_hdmi_sink)
91 return;
92
93 /* XXX first guess at handling video port, is this corrent? */
94 if (intel_hdmi->sdvox_reg == SDVOB)
95 port = VIDEO_DIP_PORT_B;
96 else if (intel_hdmi->sdvox_reg == SDVOC)
97 port = VIDEO_DIP_PORT_C;
98 else
99 return;
100
101 I915_WRITE(VIDEO_DIP_CTL, VIDEO_DIP_ENABLE | port |
102 VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC);
103
104 intel_dip_infoframe_csum(&avi_if);
105 for (i = 0; i < sizeof(avi_if); i += 4) {
106 I915_WRITE(VIDEO_DIP_DATA, *data);
107 data++;
108 }
109
110 I915_WRITE(VIDEO_DIP_CTL, VIDEO_DIP_ENABLE | port |
111 VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC |
112 VIDEO_DIP_ENABLE_AVI);
49} 113}
50 114
51static void intel_hdmi_mode_set(struct drm_encoder *encoder, 115static void intel_hdmi_mode_set(struct drm_encoder *encoder,
@@ -60,15 +124,19 @@ static void intel_hdmi_mode_set(struct drm_encoder *encoder,
60 u32 sdvox; 124 u32 sdvox;
61 125
62 sdvox = SDVO_ENCODING_HDMI | SDVO_BORDER_ENABLE; 126 sdvox = SDVO_ENCODING_HDMI | SDVO_BORDER_ENABLE;
127 sdvox |= intel_hdmi->color_range;
63 if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC) 128 if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC)
64 sdvox |= SDVO_VSYNC_ACTIVE_HIGH; 129 sdvox |= SDVO_VSYNC_ACTIVE_HIGH;
65 if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC) 130 if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC)
66 sdvox |= SDVO_HSYNC_ACTIVE_HIGH; 131 sdvox |= SDVO_HSYNC_ACTIVE_HIGH;
67 132
68 if (intel_hdmi->has_hdmi_sink) { 133 /* Required on CPT */
134 if (intel_hdmi->has_hdmi_sink && HAS_PCH_CPT(dev))
135 sdvox |= HDMI_MODE_SELECT;
136
137 if (intel_hdmi->has_audio) {
69 sdvox |= SDVO_AUDIO_ENABLE; 138 sdvox |= SDVO_AUDIO_ENABLE;
70 if (HAS_PCH_CPT(dev)) 139 sdvox |= SDVO_NULL_PACKETS_DURING_VSYNC;
71 sdvox |= HDMI_MODE_SELECT;
72 } 140 }
73 141
74 if (intel_crtc->pipe == 1) { 142 if (intel_crtc->pipe == 1) {
@@ -80,6 +148,8 @@ static void intel_hdmi_mode_set(struct drm_encoder *encoder,
80 148
81 I915_WRITE(intel_hdmi->sdvox_reg, sdvox); 149 I915_WRITE(intel_hdmi->sdvox_reg, sdvox);
82 POSTING_READ(intel_hdmi->sdvox_reg); 150 POSTING_READ(intel_hdmi->sdvox_reg);
151
152 intel_hdmi_set_avi_infoframe(encoder);
83} 153}
84 154
85static void intel_hdmi_dpms(struct drm_encoder *encoder, int mode) 155static void intel_hdmi_dpms(struct drm_encoder *encoder, int mode)
@@ -123,7 +193,7 @@ static int intel_hdmi_mode_valid(struct drm_connector *connector,
123 if (mode->clock > 165000) 193 if (mode->clock > 165000)
124 return MODE_CLOCK_HIGH; 194 return MODE_CLOCK_HIGH;
125 if (mode->clock < 20000) 195 if (mode->clock < 20000)
126 return MODE_CLOCK_HIGH; 196 return MODE_CLOCK_LOW;
127 197
128 if (mode->flags & DRM_MODE_FLAG_DBLSCAN) 198 if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
129 return MODE_NO_DBLESCAN; 199 return MODE_NO_DBLESCAN;
@@ -141,36 +211,121 @@ static bool intel_hdmi_mode_fixup(struct drm_encoder *encoder,
141static enum drm_connector_status 211static enum drm_connector_status
142intel_hdmi_detect(struct drm_connector *connector, bool force) 212intel_hdmi_detect(struct drm_connector *connector, bool force)
143{ 213{
144 struct drm_encoder *encoder = intel_attached_encoder(connector); 214 struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
145 struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder); 215 struct drm_i915_private *dev_priv = connector->dev->dev_private;
146 struct edid *edid = NULL; 216 struct edid *edid;
147 enum drm_connector_status status = connector_status_disconnected; 217 enum drm_connector_status status = connector_status_disconnected;
148 218
149 intel_hdmi->has_hdmi_sink = false; 219 intel_hdmi->has_hdmi_sink = false;
150 edid = drm_get_edid(connector, intel_hdmi->base.ddc_bus); 220 intel_hdmi->has_audio = false;
221 edid = drm_get_edid(connector,
222 &dev_priv->gmbus[intel_hdmi->ddc_bus].adapter);
151 223
152 if (edid) { 224 if (edid) {
153 if (edid->input & DRM_EDID_INPUT_DIGITAL) { 225 if (edid->input & DRM_EDID_INPUT_DIGITAL) {
154 status = connector_status_connected; 226 status = connector_status_connected;
155 intel_hdmi->has_hdmi_sink = drm_detect_hdmi_monitor(edid); 227 intel_hdmi->has_hdmi_sink = drm_detect_hdmi_monitor(edid);
228 intel_hdmi->has_audio = drm_detect_monitor_audio(edid);
156 } 229 }
157 connector->display_info.raw_edid = NULL; 230 connector->display_info.raw_edid = NULL;
158 kfree(edid); 231 kfree(edid);
159 } 232 }
160 233
234 if (status == connector_status_connected) {
235 if (intel_hdmi->force_audio)
236 intel_hdmi->has_audio = intel_hdmi->force_audio > 0;
237 }
238
161 return status; 239 return status;
162} 240}
163 241
164static int intel_hdmi_get_modes(struct drm_connector *connector) 242static int intel_hdmi_get_modes(struct drm_connector *connector)
165{ 243{
166 struct drm_encoder *encoder = intel_attached_encoder(connector); 244 struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
167 struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder); 245 struct drm_i915_private *dev_priv = connector->dev->dev_private;
168 246
169 /* We should parse the EDID data and find out if it's an HDMI sink so 247 /* We should parse the EDID data and find out if it's an HDMI sink so
170 * we can send audio to it. 248 * we can send audio to it.
171 */ 249 */
172 250
173 return intel_ddc_get_modes(connector, intel_hdmi->base.ddc_bus); 251 return intel_ddc_get_modes(connector,
252 &dev_priv->gmbus[intel_hdmi->ddc_bus].adapter);
253}
254
255static bool
256intel_hdmi_detect_audio(struct drm_connector *connector)
257{
258 struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
259 struct drm_i915_private *dev_priv = connector->dev->dev_private;
260 struct edid *edid;
261 bool has_audio = false;
262
263 edid = drm_get_edid(connector,
264 &dev_priv->gmbus[intel_hdmi->ddc_bus].adapter);
265 if (edid) {
266 if (edid->input & DRM_EDID_INPUT_DIGITAL)
267 has_audio = drm_detect_monitor_audio(edid);
268
269 connector->display_info.raw_edid = NULL;
270 kfree(edid);
271 }
272
273 return has_audio;
274}
275
276static int
277intel_hdmi_set_property(struct drm_connector *connector,
278 struct drm_property *property,
279 uint64_t val)
280{
281 struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
282 struct drm_i915_private *dev_priv = connector->dev->dev_private;
283 int ret;
284
285 ret = drm_connector_property_set_value(connector, property, val);
286 if (ret)
287 return ret;
288
289 if (property == dev_priv->force_audio_property) {
290 int i = val;
291 bool has_audio;
292
293 if (i == intel_hdmi->force_audio)
294 return 0;
295
296 intel_hdmi->force_audio = i;
297
298 if (i == 0)
299 has_audio = intel_hdmi_detect_audio(connector);
300 else
301 has_audio = i > 0;
302
303 if (has_audio == intel_hdmi->has_audio)
304 return 0;
305
306 intel_hdmi->has_audio = has_audio;
307 goto done;
308 }
309
310 if (property == dev_priv->broadcast_rgb_property) {
311 if (val == !!intel_hdmi->color_range)
312 return 0;
313
314 intel_hdmi->color_range = val ? SDVO_COLOR_RANGE_16_235 : 0;
315 goto done;
316 }
317
318 return -EINVAL;
319
320done:
321 if (intel_hdmi->base.base.crtc) {
322 struct drm_crtc *crtc = intel_hdmi->base.base.crtc;
323 drm_crtc_helper_set_mode(crtc, &crtc->mode,
324 crtc->x, crtc->y,
325 crtc->fb);
326 }
327
328 return 0;
174} 329}
175 330
176static void intel_hdmi_destroy(struct drm_connector *connector) 331static void intel_hdmi_destroy(struct drm_connector *connector)
@@ -192,19 +347,27 @@ static const struct drm_connector_funcs intel_hdmi_connector_funcs = {
192 .dpms = drm_helper_connector_dpms, 347 .dpms = drm_helper_connector_dpms,
193 .detect = intel_hdmi_detect, 348 .detect = intel_hdmi_detect,
194 .fill_modes = drm_helper_probe_single_connector_modes, 349 .fill_modes = drm_helper_probe_single_connector_modes,
350 .set_property = intel_hdmi_set_property,
195 .destroy = intel_hdmi_destroy, 351 .destroy = intel_hdmi_destroy,
196}; 352};
197 353
198static const struct drm_connector_helper_funcs intel_hdmi_connector_helper_funcs = { 354static const struct drm_connector_helper_funcs intel_hdmi_connector_helper_funcs = {
199 .get_modes = intel_hdmi_get_modes, 355 .get_modes = intel_hdmi_get_modes,
200 .mode_valid = intel_hdmi_mode_valid, 356 .mode_valid = intel_hdmi_mode_valid,
201 .best_encoder = intel_attached_encoder, 357 .best_encoder = intel_best_encoder,
202}; 358};
203 359
204static const struct drm_encoder_funcs intel_hdmi_enc_funcs = { 360static const struct drm_encoder_funcs intel_hdmi_enc_funcs = {
205 .destroy = intel_encoder_destroy, 361 .destroy = intel_encoder_destroy,
206}; 362};
207 363
364static void
365intel_hdmi_add_properties(struct intel_hdmi *intel_hdmi, struct drm_connector *connector)
366{
367 intel_attach_force_audio_property(connector);
368 intel_attach_broadcast_rgb_property(connector);
369}
370
208void intel_hdmi_init(struct drm_device *dev, int sdvox_reg) 371void intel_hdmi_init(struct drm_device *dev, int sdvox_reg)
209{ 372{
210 struct drm_i915_private *dev_priv = dev->dev_private; 373 struct drm_i915_private *dev_priv = dev->dev_private;
@@ -224,6 +387,9 @@ void intel_hdmi_init(struct drm_device *dev, int sdvox_reg)
224 } 387 }
225 388
226 intel_encoder = &intel_hdmi->base; 389 intel_encoder = &intel_hdmi->base;
390 drm_encoder_init(dev, &intel_encoder->base, &intel_hdmi_enc_funcs,
391 DRM_MODE_ENCODER_TMDS);
392
227 connector = &intel_connector->base; 393 connector = &intel_connector->base;
228 drm_connector_init(dev, connector, &intel_hdmi_connector_funcs, 394 drm_connector_init(dev, connector, &intel_hdmi_connector_funcs,
229 DRM_MODE_CONNECTOR_HDMIA); 395 DRM_MODE_CONNECTOR_HDMIA);
@@ -239,39 +405,33 @@ void intel_hdmi_init(struct drm_device *dev, int sdvox_reg)
239 /* Set up the DDC bus. */ 405 /* Set up the DDC bus. */
240 if (sdvox_reg == SDVOB) { 406 if (sdvox_reg == SDVOB) {
241 intel_encoder->clone_mask = (1 << INTEL_HDMIB_CLONE_BIT); 407 intel_encoder->clone_mask = (1 << INTEL_HDMIB_CLONE_BIT);
242 intel_encoder->ddc_bus = intel_i2c_create(dev, GPIOE, "HDMIB"); 408 intel_hdmi->ddc_bus = GMBUS_PORT_DPB;
243 dev_priv->hotplug_supported_mask |= HDMIB_HOTPLUG_INT_STATUS; 409 dev_priv->hotplug_supported_mask |= HDMIB_HOTPLUG_INT_STATUS;
244 } else if (sdvox_reg == SDVOC) { 410 } else if (sdvox_reg == SDVOC) {
245 intel_encoder->clone_mask = (1 << INTEL_HDMIC_CLONE_BIT); 411 intel_encoder->clone_mask = (1 << INTEL_HDMIC_CLONE_BIT);
246 intel_encoder->ddc_bus = intel_i2c_create(dev, GPIOD, "HDMIC"); 412 intel_hdmi->ddc_bus = GMBUS_PORT_DPC;
247 dev_priv->hotplug_supported_mask |= HDMIC_HOTPLUG_INT_STATUS; 413 dev_priv->hotplug_supported_mask |= HDMIC_HOTPLUG_INT_STATUS;
248 } else if (sdvox_reg == HDMIB) { 414 } else if (sdvox_reg == HDMIB) {
249 intel_encoder->clone_mask = (1 << INTEL_HDMID_CLONE_BIT); 415 intel_encoder->clone_mask = (1 << INTEL_HDMID_CLONE_BIT);
250 intel_encoder->ddc_bus = intel_i2c_create(dev, PCH_GPIOE, 416 intel_hdmi->ddc_bus = GMBUS_PORT_DPB;
251 "HDMIB");
252 dev_priv->hotplug_supported_mask |= HDMIB_HOTPLUG_INT_STATUS; 417 dev_priv->hotplug_supported_mask |= HDMIB_HOTPLUG_INT_STATUS;
253 } else if (sdvox_reg == HDMIC) { 418 } else if (sdvox_reg == HDMIC) {
254 intel_encoder->clone_mask = (1 << INTEL_HDMIE_CLONE_BIT); 419 intel_encoder->clone_mask = (1 << INTEL_HDMIE_CLONE_BIT);
255 intel_encoder->ddc_bus = intel_i2c_create(dev, PCH_GPIOD, 420 intel_hdmi->ddc_bus = GMBUS_PORT_DPC;
256 "HDMIC");
257 dev_priv->hotplug_supported_mask |= HDMIC_HOTPLUG_INT_STATUS; 421 dev_priv->hotplug_supported_mask |= HDMIC_HOTPLUG_INT_STATUS;
258 } else if (sdvox_reg == HDMID) { 422 } else if (sdvox_reg == HDMID) {
259 intel_encoder->clone_mask = (1 << INTEL_HDMIF_CLONE_BIT); 423 intel_encoder->clone_mask = (1 << INTEL_HDMIF_CLONE_BIT);
260 intel_encoder->ddc_bus = intel_i2c_create(dev, PCH_GPIOF, 424 intel_hdmi->ddc_bus = GMBUS_PORT_DPD;
261 "HDMID");
262 dev_priv->hotplug_supported_mask |= HDMID_HOTPLUG_INT_STATUS; 425 dev_priv->hotplug_supported_mask |= HDMID_HOTPLUG_INT_STATUS;
263 } 426 }
264 if (!intel_encoder->ddc_bus)
265 goto err_connector;
266 427
267 intel_hdmi->sdvox_reg = sdvox_reg; 428 intel_hdmi->sdvox_reg = sdvox_reg;
268 429
269 drm_encoder_init(dev, &intel_encoder->enc, &intel_hdmi_enc_funcs, 430 drm_encoder_helper_add(&intel_encoder->base, &intel_hdmi_helper_funcs);
270 DRM_MODE_ENCODER_TMDS); 431
271 drm_encoder_helper_add(&intel_encoder->enc, &intel_hdmi_helper_funcs); 432 intel_hdmi_add_properties(intel_hdmi, connector);
272 433
273 drm_mode_connector_attach_encoder(&intel_connector->base, 434 intel_connector_attach_encoder(intel_connector, intel_encoder);
274 &intel_encoder->enc);
275 drm_sysfs_connector_add(connector); 435 drm_sysfs_connector_add(connector);
276 436
277 /* For G4X desktop chip, PEG_BAND_GAP_DATA 3:0 must first be written 437 /* For G4X desktop chip, PEG_BAND_GAP_DATA 3:0 must first be written
@@ -282,13 +442,4 @@ void intel_hdmi_init(struct drm_device *dev, int sdvox_reg)
282 u32 temp = I915_READ(PEG_BAND_GAP_DATA); 442 u32 temp = I915_READ(PEG_BAND_GAP_DATA);
283 I915_WRITE(PEG_BAND_GAP_DATA, (temp & ~0xf) | 0xd); 443 I915_WRITE(PEG_BAND_GAP_DATA, (temp & ~0xf) | 0xd);
284 } 444 }
285
286 return;
287
288err_connector:
289 drm_connector_cleanup(connector);
290 kfree(intel_hdmi);
291 kfree(intel_connector);
292
293 return;
294} 445}
diff --git a/drivers/gpu/drm/i915/intel_i2c.c b/drivers/gpu/drm/i915/intel_i2c.c
index c2649c7df14c..d98cee60b602 100644
--- a/drivers/gpu/drm/i915/intel_i2c.c
+++ b/drivers/gpu/drm/i915/intel_i2c.c
@@ -1,6 +1,6 @@
1/* 1/*
2 * Copyright (c) 2006 Dave Airlie <airlied@linux.ie> 2 * Copyright (c) 2006 Dave Airlie <airlied@linux.ie>
3 * Copyright © 2006-2008 Intel Corporation 3 * Copyright © 2006-2008,2010 Intel Corporation
4 * Jesse Barnes <jesse.barnes@intel.com> 4 * Jesse Barnes <jesse.barnes@intel.com>
5 * 5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a 6 * Permission is hereby granted, free of charge, to any person obtaining a
@@ -24,10 +24,9 @@
24 * 24 *
25 * Authors: 25 * Authors:
26 * Eric Anholt <eric@anholt.net> 26 * Eric Anholt <eric@anholt.net>
27 * Chris Wilson <chris@chris-wilson.co.uk>
27 */ 28 */
28#include <linux/i2c.h> 29#include <linux/i2c.h>
29#include <linux/slab.h>
30#include <linux/i2c-id.h>
31#include <linux/i2c-algo-bit.h> 30#include <linux/i2c-algo-bit.h>
32#include "drmP.h" 31#include "drmP.h"
33#include "drm.h" 32#include "drm.h"
@@ -35,79 +34,107 @@
35#include "i915_drm.h" 34#include "i915_drm.h"
36#include "i915_drv.h" 35#include "i915_drv.h"
37 36
38void intel_i2c_quirk_set(struct drm_device *dev, bool enable) 37/* Intel GPIO access functions */
38
39#define I2C_RISEFALL_TIME 20
40
41static inline struct intel_gmbus *
42to_intel_gmbus(struct i2c_adapter *i2c)
43{
44 return container_of(i2c, struct intel_gmbus, adapter);
45}
46
47struct intel_gpio {
48 struct i2c_adapter adapter;
49 struct i2c_algo_bit_data algo;
50 struct drm_i915_private *dev_priv;
51 u32 reg;
52};
53
54void
55intel_i2c_reset(struct drm_device *dev)
39{ 56{
40 struct drm_i915_private *dev_priv = dev->dev_private; 57 struct drm_i915_private *dev_priv = dev->dev_private;
58 if (HAS_PCH_SPLIT(dev))
59 I915_WRITE(PCH_GMBUS0, 0);
60 else
61 I915_WRITE(GMBUS0, 0);
62}
63
64static void intel_i2c_quirk_set(struct drm_i915_private *dev_priv, bool enable)
65{
66 u32 val;
41 67
42 /* When using bit bashing for I2C, this bit needs to be set to 1 */ 68 /* When using bit bashing for I2C, this bit needs to be set to 1 */
43 if (!IS_PINEVIEW(dev)) 69 if (!IS_PINEVIEW(dev_priv->dev))
44 return; 70 return;
71
72 val = I915_READ(DSPCLK_GATE_D);
45 if (enable) 73 if (enable)
46 I915_WRITE(DSPCLK_GATE_D, 74 val |= DPCUNIT_CLOCK_GATE_DISABLE;
47 I915_READ(DSPCLK_GATE_D) | DPCUNIT_CLOCK_GATE_DISABLE);
48 else 75 else
49 I915_WRITE(DSPCLK_GATE_D, 76 val &= ~DPCUNIT_CLOCK_GATE_DISABLE;
50 I915_READ(DSPCLK_GATE_D) & (~DPCUNIT_CLOCK_GATE_DISABLE)); 77 I915_WRITE(DSPCLK_GATE_D, val);
51} 78}
52 79
53/* 80static u32 get_reserved(struct intel_gpio *gpio)
54 * Intel GPIO access functions 81{
55 */ 82 struct drm_i915_private *dev_priv = gpio->dev_priv;
83 struct drm_device *dev = dev_priv->dev;
84 u32 reserved = 0;
56 85
57#define I2C_RISEFALL_TIME 20 86 /* On most chips, these bits must be preserved in software. */
87 if (!IS_I830(dev) && !IS_845G(dev))
88 reserved = I915_READ_NOTRACE(gpio->reg) &
89 (GPIO_DATA_PULLUP_DISABLE |
90 GPIO_CLOCK_PULLUP_DISABLE);
91
92 return reserved;
93}
58 94
59static int get_clock(void *data) 95static int get_clock(void *data)
60{ 96{
61 struct intel_i2c_chan *chan = data; 97 struct intel_gpio *gpio = data;
62 struct drm_i915_private *dev_priv = chan->drm_dev->dev_private; 98 struct drm_i915_private *dev_priv = gpio->dev_priv;
63 u32 val; 99 u32 reserved = get_reserved(gpio);
64 100 I915_WRITE_NOTRACE(gpio->reg, reserved | GPIO_CLOCK_DIR_MASK);
65 val = I915_READ(chan->reg); 101 I915_WRITE_NOTRACE(gpio->reg, reserved);
66 return ((val & GPIO_CLOCK_VAL_IN) != 0); 102 return (I915_READ_NOTRACE(gpio->reg) & GPIO_CLOCK_VAL_IN) != 0;
67} 103}
68 104
69static int get_data(void *data) 105static int get_data(void *data)
70{ 106{
71 struct intel_i2c_chan *chan = data; 107 struct intel_gpio *gpio = data;
72 struct drm_i915_private *dev_priv = chan->drm_dev->dev_private; 108 struct drm_i915_private *dev_priv = gpio->dev_priv;
73 u32 val; 109 u32 reserved = get_reserved(gpio);
74 110 I915_WRITE_NOTRACE(gpio->reg, reserved | GPIO_DATA_DIR_MASK);
75 val = I915_READ(chan->reg); 111 I915_WRITE_NOTRACE(gpio->reg, reserved);
76 return ((val & GPIO_DATA_VAL_IN) != 0); 112 return (I915_READ_NOTRACE(gpio->reg) & GPIO_DATA_VAL_IN) != 0;
77} 113}
78 114
79static void set_clock(void *data, int state_high) 115static void set_clock(void *data, int state_high)
80{ 116{
81 struct intel_i2c_chan *chan = data; 117 struct intel_gpio *gpio = data;
82 struct drm_device *dev = chan->drm_dev; 118 struct drm_i915_private *dev_priv = gpio->dev_priv;
83 struct drm_i915_private *dev_priv = chan->drm_dev->dev_private; 119 u32 reserved = get_reserved(gpio);
84 u32 reserved = 0, clock_bits; 120 u32 clock_bits;
85
86 /* On most chips, these bits must be preserved in software. */
87 if (!IS_I830(dev) && !IS_845G(dev))
88 reserved = I915_READ(chan->reg) & (GPIO_DATA_PULLUP_DISABLE |
89 GPIO_CLOCK_PULLUP_DISABLE);
90 121
91 if (state_high) 122 if (state_high)
92 clock_bits = GPIO_CLOCK_DIR_IN | GPIO_CLOCK_DIR_MASK; 123 clock_bits = GPIO_CLOCK_DIR_IN | GPIO_CLOCK_DIR_MASK;
93 else 124 else
94 clock_bits = GPIO_CLOCK_DIR_OUT | GPIO_CLOCK_DIR_MASK | 125 clock_bits = GPIO_CLOCK_DIR_OUT | GPIO_CLOCK_DIR_MASK |
95 GPIO_CLOCK_VAL_MASK; 126 GPIO_CLOCK_VAL_MASK;
96 I915_WRITE(chan->reg, reserved | clock_bits); 127
97 udelay(I2C_RISEFALL_TIME); /* wait for the line to change state */ 128 I915_WRITE_NOTRACE(gpio->reg, reserved | clock_bits);
129 POSTING_READ(gpio->reg);
98} 130}
99 131
100static void set_data(void *data, int state_high) 132static void set_data(void *data, int state_high)
101{ 133{
102 struct intel_i2c_chan *chan = data; 134 struct intel_gpio *gpio = data;
103 struct drm_device *dev = chan->drm_dev; 135 struct drm_i915_private *dev_priv = gpio->dev_priv;
104 struct drm_i915_private *dev_priv = chan->drm_dev->dev_private; 136 u32 reserved = get_reserved(gpio);
105 u32 reserved = 0, data_bits; 137 u32 data_bits;
106
107 /* On most chips, these bits must be preserved in software. */
108 if (!IS_I830(dev) && !IS_845G(dev))
109 reserved = I915_READ(chan->reg) & (GPIO_DATA_PULLUP_DISABLE |
110 GPIO_CLOCK_PULLUP_DISABLE);
111 138
112 if (state_high) 139 if (state_high)
113 data_bits = GPIO_DATA_DIR_IN | GPIO_DATA_DIR_MASK; 140 data_bits = GPIO_DATA_DIR_IN | GPIO_DATA_DIR_MASK;
@@ -115,109 +142,331 @@ static void set_data(void *data, int state_high)
115 data_bits = GPIO_DATA_DIR_OUT | GPIO_DATA_DIR_MASK | 142 data_bits = GPIO_DATA_DIR_OUT | GPIO_DATA_DIR_MASK |
116 GPIO_DATA_VAL_MASK; 143 GPIO_DATA_VAL_MASK;
117 144
118 I915_WRITE(chan->reg, reserved | data_bits); 145 I915_WRITE_NOTRACE(gpio->reg, reserved | data_bits);
119 udelay(I2C_RISEFALL_TIME); /* wait for the line to change state */ 146 POSTING_READ(gpio->reg);
120} 147}
121 148
122/* Clears the GMBUS setup. Our driver doesn't make use of the GMBUS I2C 149static struct i2c_adapter *
123 * engine, but if the BIOS leaves it enabled, then that can break our use 150intel_gpio_create(struct drm_i915_private *dev_priv, u32 pin)
124 * of the bit-banging I2C interfaces. This is notably the case with the
125 * Mac Mini in EFI mode.
126 */
127void
128intel_i2c_reset_gmbus(struct drm_device *dev)
129{ 151{
130 struct drm_i915_private *dev_priv = dev->dev_private; 152 static const int map_pin_to_reg[] = {
153 0,
154 GPIOB,
155 GPIOA,
156 GPIOC,
157 GPIOD,
158 GPIOE,
159 0,
160 GPIOF,
161 };
162 struct intel_gpio *gpio;
131 163
132 if (HAS_PCH_SPLIT(dev)) { 164 if (pin >= ARRAY_SIZE(map_pin_to_reg) || !map_pin_to_reg[pin])
133 I915_WRITE(PCH_GMBUS0, 0); 165 return NULL;
134 } else { 166
135 I915_WRITE(GMBUS0, 0); 167 gpio = kzalloc(sizeof(struct intel_gpio), GFP_KERNEL);
168 if (gpio == NULL)
169 return NULL;
170
171 gpio->reg = map_pin_to_reg[pin];
172 if (HAS_PCH_SPLIT(dev_priv->dev))
173 gpio->reg += PCH_GPIOA - GPIOA;
174 gpio->dev_priv = dev_priv;
175
176 snprintf(gpio->adapter.name, sizeof(gpio->adapter.name),
177 "i915 GPIO%c", "?BACDE?F"[pin]);
178 gpio->adapter.owner = THIS_MODULE;
179 gpio->adapter.algo_data = &gpio->algo;
180 gpio->adapter.dev.parent = &dev_priv->dev->pdev->dev;
181 gpio->algo.setsda = set_data;
182 gpio->algo.setscl = set_clock;
183 gpio->algo.getsda = get_data;
184 gpio->algo.getscl = get_clock;
185 gpio->algo.udelay = I2C_RISEFALL_TIME;
186 gpio->algo.timeout = usecs_to_jiffies(2200);
187 gpio->algo.data = gpio;
188
189 if (i2c_bit_add_bus(&gpio->adapter))
190 goto out_free;
191
192 return &gpio->adapter;
193
194out_free:
195 kfree(gpio);
196 return NULL;
197}
198
199static int
200intel_i2c_quirk_xfer(struct drm_i915_private *dev_priv,
201 struct i2c_adapter *adapter,
202 struct i2c_msg *msgs,
203 int num)
204{
205 struct intel_gpio *gpio = container_of(adapter,
206 struct intel_gpio,
207 adapter);
208 int ret;
209
210 intel_i2c_reset(dev_priv->dev);
211
212 intel_i2c_quirk_set(dev_priv, true);
213 set_data(gpio, 1);
214 set_clock(gpio, 1);
215 udelay(I2C_RISEFALL_TIME);
216
217 ret = adapter->algo->master_xfer(adapter, msgs, num);
218
219 set_data(gpio, 1);
220 set_clock(gpio, 1);
221 intel_i2c_quirk_set(dev_priv, false);
222
223 return ret;
224}
225
226static int
227gmbus_xfer(struct i2c_adapter *adapter,
228 struct i2c_msg *msgs,
229 int num)
230{
231 struct intel_gmbus *bus = container_of(adapter,
232 struct intel_gmbus,
233 adapter);
234 struct drm_i915_private *dev_priv = adapter->algo_data;
235 int i, reg_offset;
236
237 if (bus->force_bit)
238 return intel_i2c_quirk_xfer(dev_priv,
239 bus->force_bit, msgs, num);
240
241 reg_offset = HAS_PCH_SPLIT(dev_priv->dev) ? PCH_GMBUS0 - GMBUS0 : 0;
242
243 I915_WRITE(GMBUS0 + reg_offset, bus->reg0);
244
245 for (i = 0; i < num; i++) {
246 u16 len = msgs[i].len;
247 u8 *buf = msgs[i].buf;
248
249 if (msgs[i].flags & I2C_M_RD) {
250 I915_WRITE(GMBUS1 + reg_offset,
251 GMBUS_CYCLE_WAIT | (i + 1 == num ? GMBUS_CYCLE_STOP : 0) |
252 (len << GMBUS_BYTE_COUNT_SHIFT) |
253 (msgs[i].addr << GMBUS_SLAVE_ADDR_SHIFT) |
254 GMBUS_SLAVE_READ | GMBUS_SW_RDY);
255 POSTING_READ(GMBUS2+reg_offset);
256 do {
257 u32 val, loop = 0;
258
259 if (wait_for(I915_READ(GMBUS2 + reg_offset) & (GMBUS_SATOER | GMBUS_HW_RDY), 50))
260 goto timeout;
261 if (I915_READ(GMBUS2 + reg_offset) & GMBUS_SATOER)
262 goto clear_err;
263
264 val = I915_READ(GMBUS3 + reg_offset);
265 do {
266 *buf++ = val & 0xff;
267 val >>= 8;
268 } while (--len && ++loop < 4);
269 } while (len);
270 } else {
271 u32 val, loop;
272
273 val = loop = 0;
274 do {
275 val |= *buf++ << (8 * loop);
276 } while (--len && ++loop < 4);
277
278 I915_WRITE(GMBUS3 + reg_offset, val);
279 I915_WRITE(GMBUS1 + reg_offset,
280 (i + 1 == num ? GMBUS_CYCLE_STOP : GMBUS_CYCLE_WAIT) |
281 (msgs[i].len << GMBUS_BYTE_COUNT_SHIFT) |
282 (msgs[i].addr << GMBUS_SLAVE_ADDR_SHIFT) |
283 GMBUS_SLAVE_WRITE | GMBUS_SW_RDY);
284 POSTING_READ(GMBUS2+reg_offset);
285
286 while (len) {
287 if (wait_for(I915_READ(GMBUS2 + reg_offset) & (GMBUS_SATOER | GMBUS_HW_RDY), 50))
288 goto timeout;
289 if (I915_READ(GMBUS2 + reg_offset) & GMBUS_SATOER)
290 goto clear_err;
291
292 val = loop = 0;
293 do {
294 val |= *buf++ << (8 * loop);
295 } while (--len && ++loop < 4);
296
297 I915_WRITE(GMBUS3 + reg_offset, val);
298 POSTING_READ(GMBUS2+reg_offset);
299 }
300 }
301
302 if (i + 1 < num && wait_for(I915_READ(GMBUS2 + reg_offset) & (GMBUS_SATOER | GMBUS_HW_WAIT_PHASE), 50))
303 goto timeout;
304 if (I915_READ(GMBUS2 + reg_offset) & GMBUS_SATOER)
305 goto clear_err;
136 } 306 }
307
308 goto done;
309
310clear_err:
311 /* Toggle the Software Clear Interrupt bit. This has the effect
312 * of resetting the GMBUS controller and so clearing the
313 * BUS_ERROR raised by the slave's NAK.
314 */
315 I915_WRITE(GMBUS1 + reg_offset, GMBUS_SW_CLR_INT);
316 I915_WRITE(GMBUS1 + reg_offset, 0);
317
318done:
319 /* Mark the GMBUS interface as disabled. We will re-enable it at the
320 * start of the next xfer, till then let it sleep.
321 */
322 I915_WRITE(GMBUS0 + reg_offset, 0);
323 return i;
324
325timeout:
326 DRM_INFO("GMBUS timed out, falling back to bit banging on pin %d [%s]\n",
327 bus->reg0 & 0xff, bus->adapter.name);
328 I915_WRITE(GMBUS0 + reg_offset, 0);
329
330 /* Hardware may not support GMBUS over these pins? Try GPIO bitbanging instead. */
331 bus->force_bit = intel_gpio_create(dev_priv, bus->reg0 & 0xff);
332 if (!bus->force_bit)
333 return -ENOMEM;
334
335 return intel_i2c_quirk_xfer(dev_priv, bus->force_bit, msgs, num);
137} 336}
138 337
338static u32 gmbus_func(struct i2c_adapter *adapter)
339{
340 struct intel_gmbus *bus = container_of(adapter,
341 struct intel_gmbus,
342 adapter);
343
344 if (bus->force_bit)
345 bus->force_bit->algo->functionality(bus->force_bit);
346
347 return (I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL |
348 /* I2C_FUNC_10BIT_ADDR | */
349 I2C_FUNC_SMBUS_READ_BLOCK_DATA |
350 I2C_FUNC_SMBUS_BLOCK_PROC_CALL);
351}
352
353static const struct i2c_algorithm gmbus_algorithm = {
354 .master_xfer = gmbus_xfer,
355 .functionality = gmbus_func
356};
357
139/** 358/**
140 * intel_i2c_create - instantiate an Intel i2c bus using the specified GPIO reg 359 * intel_gmbus_setup - instantiate all Intel i2c GMBuses
141 * @dev: DRM device 360 * @dev: DRM device
142 * @output: driver specific output device
143 * @reg: GPIO reg to use
144 * @name: name for this bus
145 * @slave_addr: slave address (if fixed)
146 *
147 * Creates and registers a new i2c bus with the Linux i2c layer, for use
148 * in output probing and control (e.g. DDC or SDVO control functions).
149 *
150 * Possible values for @reg include:
151 * %GPIOA
152 * %GPIOB
153 * %GPIOC
154 * %GPIOD
155 * %GPIOE
156 * %GPIOF
157 * %GPIOG
158 * %GPIOH
159 * see PRM for details on how these different busses are used.
160 */ 361 */
161struct i2c_adapter *intel_i2c_create(struct drm_device *dev, const u32 reg, 362int intel_setup_gmbus(struct drm_device *dev)
162 const char *name)
163{ 363{
164 struct intel_i2c_chan *chan; 364 static const char *names[GMBUS_NUM_PORTS] = {
365 "disabled",
366 "ssc",
367 "vga",
368 "panel",
369 "dpc",
370 "dpb",
371 "reserved",
372 "dpd",
373 };
374 struct drm_i915_private *dev_priv = dev->dev_private;
375 int ret, i;
165 376
166 chan = kzalloc(sizeof(struct intel_i2c_chan), GFP_KERNEL); 377 dev_priv->gmbus = kcalloc(sizeof(struct intel_gmbus), GMBUS_NUM_PORTS,
167 if (!chan) 378 GFP_KERNEL);
168 goto out_free; 379 if (dev_priv->gmbus == NULL)
380 return -ENOMEM;
169 381
170 chan->drm_dev = dev; 382 for (i = 0; i < GMBUS_NUM_PORTS; i++) {
171 chan->reg = reg; 383 struct intel_gmbus *bus = &dev_priv->gmbus[i];
172 snprintf(chan->adapter.name, I2C_NAME_SIZE, "intel drm %s", name);
173 chan->adapter.owner = THIS_MODULE;
174 chan->adapter.algo_data = &chan->algo;
175 chan->adapter.dev.parent = &dev->pdev->dev;
176 chan->algo.setsda = set_data;
177 chan->algo.setscl = set_clock;
178 chan->algo.getsda = get_data;
179 chan->algo.getscl = get_clock;
180 chan->algo.udelay = 20;
181 chan->algo.timeout = usecs_to_jiffies(2200);
182 chan->algo.data = chan;
183
184 i2c_set_adapdata(&chan->adapter, chan);
185
186 if(i2c_bit_add_bus(&chan->adapter))
187 goto out_free;
188 384
189 intel_i2c_reset_gmbus(dev); 385 bus->adapter.owner = THIS_MODULE;
386 bus->adapter.class = I2C_CLASS_DDC;
387 snprintf(bus->adapter.name,
388 sizeof(bus->adapter.name),
389 "i915 gmbus %s",
390 names[i]);
190 391
191 /* JJJ: raise SCL and SDA? */ 392 bus->adapter.dev.parent = &dev->pdev->dev;
192 intel_i2c_quirk_set(dev, true); 393 bus->adapter.algo_data = dev_priv;
193 set_data(chan, 1);
194 set_clock(chan, 1);
195 intel_i2c_quirk_set(dev, false);
196 udelay(20);
197 394
198 return &chan->adapter; 395 bus->adapter.algo = &gmbus_algorithm;
396 ret = i2c_add_adapter(&bus->adapter);
397 if (ret)
398 goto err;
199 399
200out_free: 400 /* By default use a conservative clock rate */
201 kfree(chan); 401 bus->reg0 = i | GMBUS_RATE_100KHZ;
202 return NULL; 402
403 /* XXX force bit banging until GMBUS is fully debugged */
404 bus->force_bit = intel_gpio_create(dev_priv, i);
405 }
406
407 intel_i2c_reset(dev_priv->dev);
408
409 return 0;
410
411err:
412 while (--i) {
413 struct intel_gmbus *bus = &dev_priv->gmbus[i];
414 i2c_del_adapter(&bus->adapter);
415 }
416 kfree(dev_priv->gmbus);
417 dev_priv->gmbus = NULL;
418 return ret;
203} 419}
204 420
205/** 421void intel_gmbus_set_speed(struct i2c_adapter *adapter, int speed)
206 * intel_i2c_destroy - unregister and free i2c bus resources 422{
207 * @output: channel to free 423 struct intel_gmbus *bus = to_intel_gmbus(adapter);
208 * 424
209 * Unregister the adapter from the i2c layer, then free the structure. 425 /* speed:
210 */ 426 * 0x0 = 100 KHz
211void intel_i2c_destroy(struct i2c_adapter *adapter) 427 * 0x1 = 50 KHz
428 * 0x2 = 400 KHz
429 * 0x3 = 1000 Khz
430 */
431 bus->reg0 = (bus->reg0 & ~(0x3 << 8)) | (speed << 8);
432}
433
434void intel_gmbus_force_bit(struct i2c_adapter *adapter, bool force_bit)
435{
436 struct intel_gmbus *bus = to_intel_gmbus(adapter);
437
438 if (force_bit) {
439 if (bus->force_bit == NULL) {
440 struct drm_i915_private *dev_priv = adapter->algo_data;
441 bus->force_bit = intel_gpio_create(dev_priv,
442 bus->reg0 & 0xff);
443 }
444 } else {
445 if (bus->force_bit) {
446 i2c_del_adapter(bus->force_bit);
447 kfree(bus->force_bit);
448 bus->force_bit = NULL;
449 }
450 }
451}
452
453void intel_teardown_gmbus(struct drm_device *dev)
212{ 454{
213 struct intel_i2c_chan *chan; 455 struct drm_i915_private *dev_priv = dev->dev_private;
456 int i;
214 457
215 if (!adapter) 458 if (dev_priv->gmbus == NULL)
216 return; 459 return;
217 460
218 chan = container_of(adapter, 461 for (i = 0; i < GMBUS_NUM_PORTS; i++) {
219 struct intel_i2c_chan, 462 struct intel_gmbus *bus = &dev_priv->gmbus[i];
220 adapter); 463 if (bus->force_bit) {
221 i2c_del_adapter(&chan->adapter); 464 i2c_del_adapter(bus->force_bit);
222 kfree(chan); 465 kfree(bus->force_bit);
466 }
467 i2c_del_adapter(&bus->adapter);
468 }
469
470 kfree(dev_priv->gmbus);
471 dev_priv->gmbus = NULL;
223} 472}
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c
index 6ec39a86ed06..b28f7bd9f88a 100644
--- a/drivers/gpu/drm/i915/intel_lvds.c
+++ b/drivers/gpu/drm/i915/intel_lvds.c
@@ -43,102 +43,110 @@
43/* Private structure for the integrated LVDS support */ 43/* Private structure for the integrated LVDS support */
44struct intel_lvds { 44struct intel_lvds {
45 struct intel_encoder base; 45 struct intel_encoder base;
46
47 struct edid *edid;
48
46 int fitting_mode; 49 int fitting_mode;
47 u32 pfit_control; 50 u32 pfit_control;
48 u32 pfit_pgm_ratios; 51 u32 pfit_pgm_ratios;
52 bool pfit_dirty;
53
54 struct drm_display_mode *fixed_mode;
49}; 55};
50 56
51static struct intel_lvds *enc_to_intel_lvds(struct drm_encoder *encoder) 57static struct intel_lvds *to_intel_lvds(struct drm_encoder *encoder)
52{ 58{
53 return container_of(enc_to_intel_encoder(encoder), struct intel_lvds, base); 59 return container_of(encoder, struct intel_lvds, base.base);
54} 60}
55 61
56/** 62static struct intel_lvds *intel_attached_lvds(struct drm_connector *connector)
57 * Sets the backlight level.
58 *
59 * \param level backlight level, from 0 to intel_lvds_get_max_backlight().
60 */
61static void intel_lvds_set_backlight(struct drm_device *dev, int level)
62{ 63{
63 struct drm_i915_private *dev_priv = dev->dev_private; 64 return container_of(intel_attached_encoder(connector),
64 u32 blc_pwm_ctl, reg; 65 struct intel_lvds, base);
65
66 if (HAS_PCH_SPLIT(dev))
67 reg = BLC_PWM_CPU_CTL;
68 else
69 reg = BLC_PWM_CTL;
70
71 blc_pwm_ctl = I915_READ(reg) & ~BACKLIGHT_DUTY_CYCLE_MASK;
72 I915_WRITE(reg, (blc_pwm_ctl |
73 (level << BACKLIGHT_DUTY_CYCLE_SHIFT)));
74} 66}
75 67
76/** 68/**
77 * Returns the maximum level of the backlight duty cycle field. 69 * Sets the power state for the panel.
78 */ 70 */
79static u32 intel_lvds_get_max_backlight(struct drm_device *dev) 71static void intel_lvds_enable(struct intel_lvds *intel_lvds)
80{ 72{
73 struct drm_device *dev = intel_lvds->base.base.dev;
81 struct drm_i915_private *dev_priv = dev->dev_private; 74 struct drm_i915_private *dev_priv = dev->dev_private;
82 u32 reg; 75 u32 ctl_reg, lvds_reg;
83 76
84 if (HAS_PCH_SPLIT(dev)) 77 if (HAS_PCH_SPLIT(dev)) {
85 reg = BLC_PWM_PCH_CTL2; 78 ctl_reg = PCH_PP_CONTROL;
86 else 79 lvds_reg = PCH_LVDS;
87 reg = BLC_PWM_CTL; 80 } else {
81 ctl_reg = PP_CONTROL;
82 lvds_reg = LVDS;
83 }
84
85 I915_WRITE(lvds_reg, I915_READ(lvds_reg) | LVDS_PORT_EN);
88 86
89 return ((I915_READ(reg) & BACKLIGHT_MODULATION_FREQ_MASK) >> 87 if (intel_lvds->pfit_dirty) {
90 BACKLIGHT_MODULATION_FREQ_SHIFT) * 2; 88 /*
89 * Enable automatic panel scaling so that non-native modes
90 * fill the screen. The panel fitter should only be
91 * adjusted whilst the pipe is disabled, according to
92 * register description and PRM.
93 */
94 DRM_DEBUG_KMS("applying panel-fitter: %x, %x\n",
95 intel_lvds->pfit_control,
96 intel_lvds->pfit_pgm_ratios);
97 if (wait_for((I915_READ(PP_STATUS) & PP_ON) == 0, 1000)) {
98 DRM_ERROR("timed out waiting for panel to power off\n");
99 } else {
100 I915_WRITE(PFIT_PGM_RATIOS, intel_lvds->pfit_pgm_ratios);
101 I915_WRITE(PFIT_CONTROL, intel_lvds->pfit_control);
102 intel_lvds->pfit_dirty = false;
103 }
104 }
105
106 I915_WRITE(ctl_reg, I915_READ(ctl_reg) | POWER_TARGET_ON);
107 POSTING_READ(lvds_reg);
108
109 intel_panel_enable_backlight(dev);
91} 110}
92 111
93/** 112static void intel_lvds_disable(struct intel_lvds *intel_lvds)
94 * Sets the power state for the panel.
95 */
96static void intel_lvds_set_power(struct drm_device *dev, bool on)
97{ 113{
114 struct drm_device *dev = intel_lvds->base.base.dev;
98 struct drm_i915_private *dev_priv = dev->dev_private; 115 struct drm_i915_private *dev_priv = dev->dev_private;
99 u32 ctl_reg, status_reg, lvds_reg; 116 u32 ctl_reg, lvds_reg;
100 117
101 if (HAS_PCH_SPLIT(dev)) { 118 if (HAS_PCH_SPLIT(dev)) {
102 ctl_reg = PCH_PP_CONTROL; 119 ctl_reg = PCH_PP_CONTROL;
103 status_reg = PCH_PP_STATUS;
104 lvds_reg = PCH_LVDS; 120 lvds_reg = PCH_LVDS;
105 } else { 121 } else {
106 ctl_reg = PP_CONTROL; 122 ctl_reg = PP_CONTROL;
107 status_reg = PP_STATUS;
108 lvds_reg = LVDS; 123 lvds_reg = LVDS;
109 } 124 }
110 125
111 if (on) { 126 intel_panel_disable_backlight(dev);
112 I915_WRITE(lvds_reg, I915_READ(lvds_reg) | LVDS_PORT_EN);
113 POSTING_READ(lvds_reg);
114 127
115 I915_WRITE(ctl_reg, I915_READ(ctl_reg) | 128 I915_WRITE(ctl_reg, I915_READ(ctl_reg) & ~POWER_TARGET_ON);
116 POWER_TARGET_ON);
117 if (wait_for(I915_READ(status_reg) & PP_ON, 1000, 0))
118 DRM_ERROR("timed out waiting to enable LVDS pipe");
119
120 intel_lvds_set_backlight(dev, dev_priv->backlight_duty_cycle);
121 } else {
122 intel_lvds_set_backlight(dev, 0);
123 129
124 I915_WRITE(ctl_reg, I915_READ(ctl_reg) & 130 if (intel_lvds->pfit_control) {
125 ~POWER_TARGET_ON); 131 if (wait_for((I915_READ(PP_STATUS) & PP_ON) == 0, 1000))
126 if (wait_for((I915_READ(status_reg) & PP_ON) == 0, 1000, 0)) 132 DRM_ERROR("timed out waiting for panel to power off\n");
127 DRM_ERROR("timed out waiting for LVDS pipe to turn off");
128 133
129 I915_WRITE(lvds_reg, I915_READ(lvds_reg) & ~LVDS_PORT_EN); 134 I915_WRITE(PFIT_CONTROL, 0);
130 POSTING_READ(lvds_reg); 135 intel_lvds->pfit_dirty = true;
131 } 136 }
137
138 I915_WRITE(lvds_reg, I915_READ(lvds_reg) & ~LVDS_PORT_EN);
139 POSTING_READ(lvds_reg);
132} 140}
133 141
134static void intel_lvds_dpms(struct drm_encoder *encoder, int mode) 142static void intel_lvds_dpms(struct drm_encoder *encoder, int mode)
135{ 143{
136 struct drm_device *dev = encoder->dev; 144 struct intel_lvds *intel_lvds = to_intel_lvds(encoder);
137 145
138 if (mode == DRM_MODE_DPMS_ON) 146 if (mode == DRM_MODE_DPMS_ON)
139 intel_lvds_set_power(dev, true); 147 intel_lvds_enable(intel_lvds);
140 else 148 else
141 intel_lvds_set_power(dev, false); 149 intel_lvds_disable(intel_lvds);
142 150
143 /* XXX: We never power down the LVDS pairs. */ 151 /* XXX: We never power down the LVDS pairs. */
144} 152}
@@ -146,16 +154,13 @@ static void intel_lvds_dpms(struct drm_encoder *encoder, int mode)
146static int intel_lvds_mode_valid(struct drm_connector *connector, 154static int intel_lvds_mode_valid(struct drm_connector *connector,
147 struct drm_display_mode *mode) 155 struct drm_display_mode *mode)
148{ 156{
149 struct drm_device *dev = connector->dev; 157 struct intel_lvds *intel_lvds = intel_attached_lvds(connector);
150 struct drm_i915_private *dev_priv = dev->dev_private; 158 struct drm_display_mode *fixed_mode = intel_lvds->fixed_mode;
151 struct drm_display_mode *fixed_mode = dev_priv->panel_fixed_mode;
152 159
153 if (fixed_mode) { 160 if (mode->hdisplay > fixed_mode->hdisplay)
154 if (mode->hdisplay > fixed_mode->hdisplay) 161 return MODE_PANEL;
155 return MODE_PANEL; 162 if (mode->vdisplay > fixed_mode->vdisplay)
156 if (mode->vdisplay > fixed_mode->vdisplay) 163 return MODE_PANEL;
157 return MODE_PANEL;
158 }
159 164
160 return MODE_OK; 165 return MODE_OK;
161} 166}
@@ -223,12 +228,13 @@ static bool intel_lvds_mode_fixup(struct drm_encoder *encoder,
223 struct drm_device *dev = encoder->dev; 228 struct drm_device *dev = encoder->dev;
224 struct drm_i915_private *dev_priv = dev->dev_private; 229 struct drm_i915_private *dev_priv = dev->dev_private;
225 struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc); 230 struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
226 struct intel_lvds *intel_lvds = enc_to_intel_lvds(encoder); 231 struct intel_lvds *intel_lvds = to_intel_lvds(encoder);
227 struct drm_encoder *tmp_encoder; 232 struct drm_encoder *tmp_encoder;
228 u32 pfit_control = 0, pfit_pgm_ratios = 0, border = 0; 233 u32 pfit_control = 0, pfit_pgm_ratios = 0, border = 0;
234 int pipe;
229 235
230 /* Should never happen!! */ 236 /* Should never happen!! */
231 if (!IS_I965G(dev) && intel_crtc->pipe == 0) { 237 if (INTEL_INFO(dev)->gen < 4 && intel_crtc->pipe == 0) {
232 DRM_ERROR("Can't support LVDS on pipe A\n"); 238 DRM_ERROR("Can't support LVDS on pipe A\n");
233 return false; 239 return false;
234 } 240 }
@@ -241,9 +247,6 @@ static bool intel_lvds_mode_fixup(struct drm_encoder *encoder,
241 return false; 247 return false;
242 } 248 }
243 } 249 }
244 /* If we don't have a panel mode, there is nothing we can do */
245 if (dev_priv->panel_fixed_mode == NULL)
246 return true;
247 250
248 /* 251 /*
249 * We have timings from the BIOS for the panel, put them in 252 * We have timings from the BIOS for the panel, put them in
@@ -251,7 +254,7 @@ static bool intel_lvds_mode_fixup(struct drm_encoder *encoder,
251 * with the panel scaling set up to source from the H/VDisplay 254 * with the panel scaling set up to source from the H/VDisplay
252 * of the original mode. 255 * of the original mode.
253 */ 256 */
254 intel_fixed_panel_mode(dev_priv->panel_fixed_mode, adjusted_mode); 257 intel_fixed_panel_mode(intel_lvds->fixed_mode, adjusted_mode);
255 258
256 if (HAS_PCH_SPLIT(dev)) { 259 if (HAS_PCH_SPLIT(dev)) {
257 intel_pch_panel_fitting(dev, intel_lvds->fitting_mode, 260 intel_pch_panel_fitting(dev, intel_lvds->fitting_mode,
@@ -259,19 +262,13 @@ static bool intel_lvds_mode_fixup(struct drm_encoder *encoder,
259 return true; 262 return true;
260 } 263 }
261 264
262 /* Make sure pre-965s set dither correctly */
263 if (!IS_I965G(dev)) {
264 if (dev_priv->panel_wants_dither || dev_priv->lvds_dither)
265 pfit_control |= PANEL_8TO6_DITHER_ENABLE;
266 }
267
268 /* Native modes don't need fitting */ 265 /* Native modes don't need fitting */
269 if (adjusted_mode->hdisplay == mode->hdisplay && 266 if (adjusted_mode->hdisplay == mode->hdisplay &&
270 adjusted_mode->vdisplay == mode->vdisplay) 267 adjusted_mode->vdisplay == mode->vdisplay)
271 goto out; 268 goto out;
272 269
273 /* 965+ wants fuzzy fitting */ 270 /* 965+ wants fuzzy fitting */
274 if (IS_I965G(dev)) 271 if (INTEL_INFO(dev)->gen >= 4)
275 pfit_control |= ((intel_crtc->pipe << PFIT_PIPE_SHIFT) | 272 pfit_control |= ((intel_crtc->pipe << PFIT_PIPE_SHIFT) |
276 PFIT_FILTER_FUZZY); 273 PFIT_FILTER_FUZZY);
277 274
@@ -281,8 +278,8 @@ static bool intel_lvds_mode_fixup(struct drm_encoder *encoder,
281 * to register description and PRM. 278 * to register description and PRM.
282 * Change the value here to see the borders for debugging 279 * Change the value here to see the borders for debugging
283 */ 280 */
284 I915_WRITE(BCLRPAT_A, 0); 281 for_each_pipe(pipe)
285 I915_WRITE(BCLRPAT_B, 0); 282 I915_WRITE(BCLRPAT(pipe), 0);
286 283
287 switch (intel_lvds->fitting_mode) { 284 switch (intel_lvds->fitting_mode) {
288 case DRM_MODE_SCALE_CENTER: 285 case DRM_MODE_SCALE_CENTER:
@@ -297,18 +294,17 @@ static bool intel_lvds_mode_fixup(struct drm_encoder *encoder,
297 294
298 case DRM_MODE_SCALE_ASPECT: 295 case DRM_MODE_SCALE_ASPECT:
299 /* Scale but preserve the aspect ratio */ 296 /* Scale but preserve the aspect ratio */
300 if (IS_I965G(dev)) { 297 if (INTEL_INFO(dev)->gen >= 4) {
301 u32 scaled_width = adjusted_mode->hdisplay * mode->vdisplay; 298 u32 scaled_width = adjusted_mode->hdisplay * mode->vdisplay;
302 u32 scaled_height = mode->hdisplay * adjusted_mode->vdisplay; 299 u32 scaled_height = mode->hdisplay * adjusted_mode->vdisplay;
303 300
304 pfit_control |= PFIT_ENABLE;
305 /* 965+ is easy, it does everything in hw */ 301 /* 965+ is easy, it does everything in hw */
306 if (scaled_width > scaled_height) 302 if (scaled_width > scaled_height)
307 pfit_control |= PFIT_SCALING_PILLAR; 303 pfit_control |= PFIT_ENABLE | PFIT_SCALING_PILLAR;
308 else if (scaled_width < scaled_height) 304 else if (scaled_width < scaled_height)
309 pfit_control |= PFIT_SCALING_LETTER; 305 pfit_control |= PFIT_ENABLE | PFIT_SCALING_LETTER;
310 else 306 else if (adjusted_mode->hdisplay != mode->hdisplay)
311 pfit_control |= PFIT_SCALING_AUTO; 307 pfit_control |= PFIT_ENABLE | PFIT_SCALING_AUTO;
312 } else { 308 } else {
313 u32 scaled_width = adjusted_mode->hdisplay * mode->vdisplay; 309 u32 scaled_width = adjusted_mode->hdisplay * mode->vdisplay;
314 u32 scaled_height = mode->hdisplay * adjusted_mode->vdisplay; 310 u32 scaled_height = mode->hdisplay * adjusted_mode->vdisplay;
@@ -355,13 +351,17 @@ static bool intel_lvds_mode_fixup(struct drm_encoder *encoder,
355 * Full scaling, even if it changes the aspect ratio. 351 * Full scaling, even if it changes the aspect ratio.
356 * Fortunately this is all done for us in hw. 352 * Fortunately this is all done for us in hw.
357 */ 353 */
358 pfit_control |= PFIT_ENABLE; 354 if (mode->vdisplay != adjusted_mode->vdisplay ||
359 if (IS_I965G(dev)) 355 mode->hdisplay != adjusted_mode->hdisplay) {
360 pfit_control |= PFIT_SCALING_AUTO; 356 pfit_control |= PFIT_ENABLE;
361 else 357 if (INTEL_INFO(dev)->gen >= 4)
362 pfit_control |= (VERT_AUTO_SCALE | HORIZ_AUTO_SCALE | 358 pfit_control |= PFIT_SCALING_AUTO;
363 VERT_INTERP_BILINEAR | 359 else
364 HORIZ_INTERP_BILINEAR); 360 pfit_control |= (VERT_AUTO_SCALE |
361 VERT_INTERP_BILINEAR |
362 HORIZ_AUTO_SCALE |
363 HORIZ_INTERP_BILINEAR);
364 }
365 break; 365 break;
366 366
367 default: 367 default:
@@ -369,8 +369,22 @@ static bool intel_lvds_mode_fixup(struct drm_encoder *encoder,
369 } 369 }
370 370
371out: 371out:
372 intel_lvds->pfit_control = pfit_control; 372 /* If not enabling scaling, be consistent and always use 0. */
373 intel_lvds->pfit_pgm_ratios = pfit_pgm_ratios; 373 if ((pfit_control & PFIT_ENABLE) == 0) {
374 pfit_control = 0;
375 pfit_pgm_ratios = 0;
376 }
377
378 /* Make sure pre-965 set dither correctly */
379 if (INTEL_INFO(dev)->gen < 4 && dev_priv->lvds_dither)
380 pfit_control |= PANEL_8TO6_DITHER_ENABLE;
381
382 if (pfit_control != intel_lvds->pfit_control ||
383 pfit_pgm_ratios != intel_lvds->pfit_pgm_ratios) {
384 intel_lvds->pfit_control = pfit_control;
385 intel_lvds->pfit_pgm_ratios = pfit_pgm_ratios;
386 intel_lvds->pfit_dirty = true;
387 }
374 dev_priv->lvds_border_bits = border; 388 dev_priv->lvds_border_bits = border;
375 389
376 /* 390 /*
@@ -386,56 +400,66 @@ static void intel_lvds_prepare(struct drm_encoder *encoder)
386{ 400{
387 struct drm_device *dev = encoder->dev; 401 struct drm_device *dev = encoder->dev;
388 struct drm_i915_private *dev_priv = dev->dev_private; 402 struct drm_i915_private *dev_priv = dev->dev_private;
389 u32 reg; 403 struct intel_lvds *intel_lvds = to_intel_lvds(encoder);
390 404
391 if (HAS_PCH_SPLIT(dev)) 405 /* We try to do the minimum that is necessary in order to unlock
392 reg = BLC_PWM_CPU_CTL; 406 * the registers for mode setting.
393 else 407 *
394 reg = BLC_PWM_CTL; 408 * On Ironlake, this is quite simple as we just set the unlock key
395 409 * and ignore all subtleties. (This may cause some issues...)
396 dev_priv->saveBLC_PWM_CTL = I915_READ(reg); 410 *
397 dev_priv->backlight_duty_cycle = (dev_priv->saveBLC_PWM_CTL & 411 * Prior to Ironlake, we must disable the pipe if we want to adjust
398 BACKLIGHT_DUTY_CYCLE_MASK); 412 * the panel fitter. However at all other times we can just reset
413 * the registers regardless.
414 */
399 415
400 intel_lvds_set_power(dev, false); 416 if (HAS_PCH_SPLIT(dev)) {
417 I915_WRITE(PCH_PP_CONTROL,
418 I915_READ(PCH_PP_CONTROL) | PANEL_UNLOCK_REGS);
419 } else if (intel_lvds->pfit_dirty) {
420 I915_WRITE(PP_CONTROL,
421 (I915_READ(PP_CONTROL) | PANEL_UNLOCK_REGS)
422 & ~POWER_TARGET_ON);
423 } else {
424 I915_WRITE(PP_CONTROL,
425 I915_READ(PP_CONTROL) | PANEL_UNLOCK_REGS);
426 }
401} 427}
402 428
403static void intel_lvds_commit( struct drm_encoder *encoder) 429static void intel_lvds_commit(struct drm_encoder *encoder)
404{ 430{
405 struct drm_device *dev = encoder->dev; 431 struct drm_device *dev = encoder->dev;
406 struct drm_i915_private *dev_priv = dev->dev_private; 432 struct drm_i915_private *dev_priv = dev->dev_private;
433 struct intel_lvds *intel_lvds = to_intel_lvds(encoder);
407 434
408 if (dev_priv->backlight_duty_cycle == 0) 435 /* Undo any unlocking done in prepare to prevent accidental
409 dev_priv->backlight_duty_cycle = 436 * adjustment of the registers.
410 intel_lvds_get_max_backlight(dev); 437 */
438 if (HAS_PCH_SPLIT(dev)) {
439 u32 val = I915_READ(PCH_PP_CONTROL);
440 if ((val & PANEL_UNLOCK_REGS) == PANEL_UNLOCK_REGS)
441 I915_WRITE(PCH_PP_CONTROL, val & 0x3);
442 } else {
443 u32 val = I915_READ(PP_CONTROL);
444 if ((val & PANEL_UNLOCK_REGS) == PANEL_UNLOCK_REGS)
445 I915_WRITE(PP_CONTROL, val & 0x3);
446 }
411 447
412 intel_lvds_set_power(dev, true); 448 /* Always do a full power on as we do not know what state
449 * we were left in.
450 */
451 intel_lvds_enable(intel_lvds);
413} 452}
414 453
415static void intel_lvds_mode_set(struct drm_encoder *encoder, 454static void intel_lvds_mode_set(struct drm_encoder *encoder,
416 struct drm_display_mode *mode, 455 struct drm_display_mode *mode,
417 struct drm_display_mode *adjusted_mode) 456 struct drm_display_mode *adjusted_mode)
418{ 457{
419 struct drm_device *dev = encoder->dev;
420 struct drm_i915_private *dev_priv = dev->dev_private;
421 struct intel_lvds *intel_lvds = enc_to_intel_lvds(encoder);
422
423 /* 458 /*
424 * The LVDS pin pair will already have been turned on in the 459 * The LVDS pin pair will already have been turned on in the
425 * intel_crtc_mode_set since it has a large impact on the DPLL 460 * intel_crtc_mode_set since it has a large impact on the DPLL
426 * settings. 461 * settings.
427 */ 462 */
428
429 if (HAS_PCH_SPLIT(dev))
430 return;
431
432 /*
433 * Enable automatic panel scaling so that non-native modes fill the
434 * screen. Should be enabled before the pipe is enabled, according to
435 * register description and PRM.
436 */
437 I915_WRITE(PFIT_PGM_RATIOS, intel_lvds->pfit_pgm_ratios);
438 I915_WRITE(PFIT_CONTROL, intel_lvds->pfit_control);
439} 463}
440 464
441/** 465/**
@@ -449,15 +473,13 @@ static enum drm_connector_status
449intel_lvds_detect(struct drm_connector *connector, bool force) 473intel_lvds_detect(struct drm_connector *connector, bool force)
450{ 474{
451 struct drm_device *dev = connector->dev; 475 struct drm_device *dev = connector->dev;
452 enum drm_connector_status status = connector_status_connected; 476 enum drm_connector_status status;
453 477
454 /* ACPI lid methods were generally unreliable in this generation, so 478 status = intel_panel_detect(dev);
455 * don't even bother. 479 if (status != connector_status_unknown)
456 */ 480 return status;
457 if (IS_GEN2(dev) || IS_GEN3(dev))
458 return connector_status_connected;
459 481
460 return status; 482 return connector_status_connected;
461} 483}
462 484
463/** 485/**
@@ -465,38 +487,19 @@ intel_lvds_detect(struct drm_connector *connector, bool force)
465 */ 487 */
466static int intel_lvds_get_modes(struct drm_connector *connector) 488static int intel_lvds_get_modes(struct drm_connector *connector)
467{ 489{
490 struct intel_lvds *intel_lvds = intel_attached_lvds(connector);
468 struct drm_device *dev = connector->dev; 491 struct drm_device *dev = connector->dev;
469 struct drm_encoder *encoder = intel_attached_encoder(connector); 492 struct drm_display_mode *mode;
470 struct intel_encoder *intel_encoder = enc_to_intel_encoder(encoder);
471 struct drm_i915_private *dev_priv = dev->dev_private;
472 int ret = 0;
473
474 if (dev_priv->lvds_edid_good) {
475 ret = intel_ddc_get_modes(connector, intel_encoder->ddc_bus);
476
477 if (ret)
478 return ret;
479 }
480
481 /* Didn't get an EDID, so
482 * Set wide sync ranges so we get all modes
483 * handed to valid_mode for checking
484 */
485 connector->display_info.min_vfreq = 0;
486 connector->display_info.max_vfreq = 200;
487 connector->display_info.min_hfreq = 0;
488 connector->display_info.max_hfreq = 200;
489
490 if (dev_priv->panel_fixed_mode != NULL) {
491 struct drm_display_mode *mode;
492 493
493 mode = drm_mode_duplicate(dev, dev_priv->panel_fixed_mode); 494 if (intel_lvds->edid)
494 drm_mode_probed_add(connector, mode); 495 return drm_add_edid_modes(connector, intel_lvds->edid);
495 496
496 return 1; 497 mode = drm_mode_duplicate(dev, intel_lvds->fixed_mode);
497 } 498 if (mode == NULL)
499 return 0;
498 500
499 return 0; 501 drm_mode_probed_add(connector, mode);
502 return 1;
500} 503}
501 504
502static int intel_no_modeset_on_lid_dmi_callback(const struct dmi_system_id *id) 505static int intel_no_modeset_on_lid_dmi_callback(const struct dmi_system_id *id)
@@ -536,6 +539,9 @@ static int intel_lid_notify(struct notifier_block *nb, unsigned long val,
536 struct drm_device *dev = dev_priv->dev; 539 struct drm_device *dev = dev_priv->dev;
537 struct drm_connector *connector = dev_priv->int_lvds_connector; 540 struct drm_connector *connector = dev_priv->int_lvds_connector;
538 541
542 if (dev->switch_power_state != DRM_SWITCH_POWER_ON)
543 return NOTIFY_OK;
544
539 /* 545 /*
540 * check and update the status of LVDS connector after receiving 546 * check and update the status of LVDS connector after receiving
541 * the LID nofication event. 547 * the LID nofication event.
@@ -587,18 +593,17 @@ static int intel_lvds_set_property(struct drm_connector *connector,
587 struct drm_property *property, 593 struct drm_property *property,
588 uint64_t value) 594 uint64_t value)
589{ 595{
596 struct intel_lvds *intel_lvds = intel_attached_lvds(connector);
590 struct drm_device *dev = connector->dev; 597 struct drm_device *dev = connector->dev;
591 598
592 if (property == dev->mode_config.scaling_mode_property && 599 if (property == dev->mode_config.scaling_mode_property) {
593 connector->encoder) { 600 struct drm_crtc *crtc = intel_lvds->base.base.crtc;
594 struct drm_crtc *crtc = connector->encoder->crtc;
595 struct drm_encoder *encoder = connector->encoder;
596 struct intel_lvds *intel_lvds = enc_to_intel_lvds(encoder);
597 601
598 if (value == DRM_MODE_SCALE_NONE) { 602 if (value == DRM_MODE_SCALE_NONE) {
599 DRM_DEBUG_KMS("no scaling not supported\n"); 603 DRM_DEBUG_KMS("no scaling not supported\n");
600 return 0; 604 return -EINVAL;
601 } 605 }
606
602 if (intel_lvds->fitting_mode == value) { 607 if (intel_lvds->fitting_mode == value) {
603 /* the LVDS scaling property is not changed */ 608 /* the LVDS scaling property is not changed */
604 return 0; 609 return 0;
@@ -628,7 +633,7 @@ static const struct drm_encoder_helper_funcs intel_lvds_helper_funcs = {
628static const struct drm_connector_helper_funcs intel_lvds_connector_helper_funcs = { 633static const struct drm_connector_helper_funcs intel_lvds_connector_helper_funcs = {
629 .get_modes = intel_lvds_get_modes, 634 .get_modes = intel_lvds_get_modes,
630 .mode_valid = intel_lvds_mode_valid, 635 .mode_valid = intel_lvds_mode_valid,
631 .best_encoder = intel_attached_encoder, 636 .best_encoder = intel_best_encoder,
632}; 637};
633 638
634static const struct drm_connector_funcs intel_lvds_connector_funcs = { 639static const struct drm_connector_funcs intel_lvds_connector_funcs = {
@@ -701,6 +706,14 @@ static const struct dmi_system_id intel_no_lvds[] = {
701 }, 706 },
702 { 707 {
703 .callback = intel_no_lvds_dmi_callback, 708 .callback = intel_no_lvds_dmi_callback,
709 .ident = "AOpen i915GMm-HFS",
710 .matches = {
711 DMI_MATCH(DMI_BOARD_VENDOR, "AOpen"),
712 DMI_MATCH(DMI_BOARD_NAME, "i915GMm-HFS"),
713 },
714 },
715 {
716 .callback = intel_no_lvds_dmi_callback,
704 .ident = "Aopen i945GTt-VFA", 717 .ident = "Aopen i945GTt-VFA",
705 .matches = { 718 .matches = {
706 DMI_MATCH(DMI_PRODUCT_VERSION, "AO00001JW"), 719 DMI_MATCH(DMI_PRODUCT_VERSION, "AO00001JW"),
@@ -714,6 +727,14 @@ static const struct dmi_system_id intel_no_lvds[] = {
714 DMI_MATCH(DMI_PRODUCT_NAME, "U800"), 727 DMI_MATCH(DMI_PRODUCT_NAME, "U800"),
715 }, 728 },
716 }, 729 },
730 {
731 .callback = intel_no_lvds_dmi_callback,
732 .ident = "Asus EeeBox PC EB1007",
733 .matches = {
734 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK Computer INC."),
735 DMI_MATCH(DMI_PRODUCT_NAME, "EB1007"),
736 },
737 },
717 738
718 { } /* terminating entry */ 739 { } /* terminating entry */
719}; 740};
@@ -726,16 +747,14 @@ static const struct dmi_system_id intel_no_lvds[] = {
726 * Find the reduced downclock for LVDS in EDID. 747 * Find the reduced downclock for LVDS in EDID.
727 */ 748 */
728static void intel_find_lvds_downclock(struct drm_device *dev, 749static void intel_find_lvds_downclock(struct drm_device *dev,
729 struct drm_connector *connector) 750 struct drm_display_mode *fixed_mode,
751 struct drm_connector *connector)
730{ 752{
731 struct drm_i915_private *dev_priv = dev->dev_private; 753 struct drm_i915_private *dev_priv = dev->dev_private;
732 struct drm_display_mode *scan, *panel_fixed_mode; 754 struct drm_display_mode *scan;
733 int temp_downclock; 755 int temp_downclock;
734 756
735 panel_fixed_mode = dev_priv->panel_fixed_mode; 757 temp_downclock = fixed_mode->clock;
736 temp_downclock = panel_fixed_mode->clock;
737
738 mutex_lock(&dev->mode_config.mutex);
739 list_for_each_entry(scan, &connector->probed_modes, head) { 758 list_for_each_entry(scan, &connector->probed_modes, head) {
740 /* 759 /*
741 * If one mode has the same resolution with the fixed_panel 760 * If one mode has the same resolution with the fixed_panel
@@ -744,14 +763,14 @@ static void intel_find_lvds_downclock(struct drm_device *dev,
744 * case we can set the different FPx0/1 to dynamically select 763 * case we can set the different FPx0/1 to dynamically select
745 * between low and high frequency. 764 * between low and high frequency.
746 */ 765 */
747 if (scan->hdisplay == panel_fixed_mode->hdisplay && 766 if (scan->hdisplay == fixed_mode->hdisplay &&
748 scan->hsync_start == panel_fixed_mode->hsync_start && 767 scan->hsync_start == fixed_mode->hsync_start &&
749 scan->hsync_end == panel_fixed_mode->hsync_end && 768 scan->hsync_end == fixed_mode->hsync_end &&
750 scan->htotal == panel_fixed_mode->htotal && 769 scan->htotal == fixed_mode->htotal &&
751 scan->vdisplay == panel_fixed_mode->vdisplay && 770 scan->vdisplay == fixed_mode->vdisplay &&
752 scan->vsync_start == panel_fixed_mode->vsync_start && 771 scan->vsync_start == fixed_mode->vsync_start &&
753 scan->vsync_end == panel_fixed_mode->vsync_end && 772 scan->vsync_end == fixed_mode->vsync_end &&
754 scan->vtotal == panel_fixed_mode->vtotal) { 773 scan->vtotal == fixed_mode->vtotal) {
755 if (scan->clock < temp_downclock) { 774 if (scan->clock < temp_downclock) {
756 /* 775 /*
757 * The downclock is already found. But we 776 * The downclock is already found. But we
@@ -761,17 +780,14 @@ static void intel_find_lvds_downclock(struct drm_device *dev,
761 } 780 }
762 } 781 }
763 } 782 }
764 mutex_unlock(&dev->mode_config.mutex); 783 if (temp_downclock < fixed_mode->clock && i915_lvds_downclock) {
765 if (temp_downclock < panel_fixed_mode->clock &&
766 i915_lvds_downclock) {
767 /* We found the downclock for LVDS. */ 784 /* We found the downclock for LVDS. */
768 dev_priv->lvds_downclock_avail = 1; 785 dev_priv->lvds_downclock_avail = 1;
769 dev_priv->lvds_downclock = temp_downclock; 786 dev_priv->lvds_downclock = temp_downclock;
770 DRM_DEBUG_KMS("LVDS downclock is found in EDID. " 787 DRM_DEBUG_KMS("LVDS downclock is found in EDID. "
771 "Normal clock %dKhz, downclock %dKhz\n", 788 "Normal clock %dKhz, downclock %dKhz\n",
772 panel_fixed_mode->clock, temp_downclock); 789 fixed_mode->clock, temp_downclock);
773 } 790 }
774 return;
775} 791}
776 792
777/* 793/*
@@ -780,38 +796,48 @@ static void intel_find_lvds_downclock(struct drm_device *dev,
780 * If it is present, return 1. 796 * If it is present, return 1.
781 * If it is not present, return false. 797 * If it is not present, return false.
782 * If no child dev is parsed from VBT, it assumes that the LVDS is present. 798 * If no child dev is parsed from VBT, it assumes that the LVDS is present.
783 * Note: The addin_offset should also be checked for LVDS panel.
784 * Only when it is non-zero, it is assumed that it is present.
785 */ 799 */
786static int lvds_is_present_in_vbt(struct drm_device *dev) 800static bool lvds_is_present_in_vbt(struct drm_device *dev,
801 u8 *i2c_pin)
787{ 802{
788 struct drm_i915_private *dev_priv = dev->dev_private; 803 struct drm_i915_private *dev_priv = dev->dev_private;
789 struct child_device_config *p_child; 804 int i;
790 int i, ret;
791 805
792 if (!dev_priv->child_dev_num) 806 if (!dev_priv->child_dev_num)
793 return 1; 807 return true;
794 808
795 ret = 0;
796 for (i = 0; i < dev_priv->child_dev_num; i++) { 809 for (i = 0; i < dev_priv->child_dev_num; i++) {
797 p_child = dev_priv->child_dev + i; 810 struct child_device_config *child = dev_priv->child_dev + i;
798 /* 811
799 * If the device type is not LFP, continue. 812 /* If the device type is not LFP, continue.
800 * If the device type is 0x22, it is also regarded as LFP. 813 * We have to check both the new identifiers as well as the
814 * old for compatibility with some BIOSes.
801 */ 815 */
802 if (p_child->device_type != DEVICE_TYPE_INT_LFP && 816 if (child->device_type != DEVICE_TYPE_INT_LFP &&
803 p_child->device_type != DEVICE_TYPE_LFP) 817 child->device_type != DEVICE_TYPE_LFP)
804 continue; 818 continue;
805 819
806 /* The addin_offset should be checked. Only when it is 820 if (child->i2c_pin)
807 * non-zero, it is regarded as present. 821 *i2c_pin = child->i2c_pin;
822
823 /* However, we cannot trust the BIOS writers to populate
824 * the VBT correctly. Since LVDS requires additional
825 * information from AIM blocks, a non-zero addin offset is
826 * a good indicator that the LVDS is actually present.
808 */ 827 */
809 if (p_child->addin_offset) { 828 if (child->addin_offset)
810 ret = 1; 829 return true;
811 break; 830
812 } 831 /* But even then some BIOS writers perform some black magic
832 * and instantiate the device without reference to any
833 * additional data. Trust that if the VBT was written into
834 * the OpRegion then they have validated the LVDS's existence.
835 */
836 if (dev_priv->opregion.vbt)
837 return true;
813 } 838 }
814 return ret; 839
840 return false;
815} 841}
816 842
817/** 843/**
@@ -821,7 +847,7 @@ static int lvds_is_present_in_vbt(struct drm_device *dev)
821 * Create the connector, register the LVDS DDC bus, and try to figure out what 847 * Create the connector, register the LVDS DDC bus, and try to figure out what
822 * modes we can display on the LVDS panel (if present). 848 * modes we can display on the LVDS panel (if present).
823 */ 849 */
824void intel_lvds_init(struct drm_device *dev) 850bool intel_lvds_init(struct drm_device *dev)
825{ 851{
826 struct drm_i915_private *dev_priv = dev->dev_private; 852 struct drm_i915_private *dev_priv = dev->dev_private;
827 struct intel_lvds *intel_lvds; 853 struct intel_lvds *intel_lvds;
@@ -832,52 +858,59 @@ void intel_lvds_init(struct drm_device *dev)
832 struct drm_display_mode *scan; /* *modes, *bios_mode; */ 858 struct drm_display_mode *scan; /* *modes, *bios_mode; */
833 struct drm_crtc *crtc; 859 struct drm_crtc *crtc;
834 u32 lvds; 860 u32 lvds;
835 int pipe, gpio = GPIOC; 861 int pipe;
862 u8 pin;
836 863
837 /* Skip init on machines we know falsely report LVDS */ 864 /* Skip init on machines we know falsely report LVDS */
838 if (dmi_check_system(intel_no_lvds)) 865 if (dmi_check_system(intel_no_lvds))
839 return; 866 return false;
840 867
841 if (!lvds_is_present_in_vbt(dev)) { 868 pin = GMBUS_PORT_PANEL;
869 if (!lvds_is_present_in_vbt(dev, &pin)) {
842 DRM_DEBUG_KMS("LVDS is not present in VBT\n"); 870 DRM_DEBUG_KMS("LVDS is not present in VBT\n");
843 return; 871 return false;
844 } 872 }
845 873
846 if (HAS_PCH_SPLIT(dev)) { 874 if (HAS_PCH_SPLIT(dev)) {
847 if ((I915_READ(PCH_LVDS) & LVDS_DETECTED) == 0) 875 if ((I915_READ(PCH_LVDS) & LVDS_DETECTED) == 0)
848 return; 876 return false;
849 if (dev_priv->edp_support) { 877 if (dev_priv->edp.support) {
850 DRM_DEBUG_KMS("disable LVDS for eDP support\n"); 878 DRM_DEBUG_KMS("disable LVDS for eDP support\n");
851 return; 879 return false;
852 } 880 }
853 gpio = PCH_GPIOC;
854 } 881 }
855 882
856 intel_lvds = kzalloc(sizeof(struct intel_lvds), GFP_KERNEL); 883 intel_lvds = kzalloc(sizeof(struct intel_lvds), GFP_KERNEL);
857 if (!intel_lvds) { 884 if (!intel_lvds) {
858 return; 885 return false;
859 } 886 }
860 887
861 intel_connector = kzalloc(sizeof(struct intel_connector), GFP_KERNEL); 888 intel_connector = kzalloc(sizeof(struct intel_connector), GFP_KERNEL);
862 if (!intel_connector) { 889 if (!intel_connector) {
863 kfree(intel_lvds); 890 kfree(intel_lvds);
864 return; 891 return false;
892 }
893
894 if (!HAS_PCH_SPLIT(dev)) {
895 intel_lvds->pfit_control = I915_READ(PFIT_CONTROL);
865 } 896 }
866 897
867 intel_encoder = &intel_lvds->base; 898 intel_encoder = &intel_lvds->base;
868 encoder = &intel_encoder->enc; 899 encoder = &intel_encoder->base;
869 connector = &intel_connector->base; 900 connector = &intel_connector->base;
870 drm_connector_init(dev, &intel_connector->base, &intel_lvds_connector_funcs, 901 drm_connector_init(dev, &intel_connector->base, &intel_lvds_connector_funcs,
871 DRM_MODE_CONNECTOR_LVDS); 902 DRM_MODE_CONNECTOR_LVDS);
872 903
873 drm_encoder_init(dev, &intel_encoder->enc, &intel_lvds_enc_funcs, 904 drm_encoder_init(dev, &intel_encoder->base, &intel_lvds_enc_funcs,
874 DRM_MODE_ENCODER_LVDS); 905 DRM_MODE_ENCODER_LVDS);
875 906
876 drm_mode_connector_attach_encoder(&intel_connector->base, &intel_encoder->enc); 907 intel_connector_attach_encoder(intel_connector, intel_encoder);
877 intel_encoder->type = INTEL_OUTPUT_LVDS; 908 intel_encoder->type = INTEL_OUTPUT_LVDS;
878 909
879 intel_encoder->clone_mask = (1 << INTEL_LVDS_CLONE_BIT); 910 intel_encoder->clone_mask = (1 << INTEL_LVDS_CLONE_BIT);
880 intel_encoder->crtc_mask = (1 << 1); 911 intel_encoder->crtc_mask = (1 << 1);
912 if (INTEL_INFO(dev)->gen >= 5)
913 intel_encoder->crtc_mask |= (1 << 0);
881 drm_encoder_helper_add(encoder, &intel_lvds_helper_funcs); 914 drm_encoder_helper_add(encoder, &intel_lvds_helper_funcs);
882 drm_connector_helper_add(connector, &intel_lvds_connector_helper_funcs); 915 drm_connector_helper_add(connector, &intel_lvds_connector_helper_funcs);
883 connector->display_info.subpixel_order = SubPixelHorizontalRGB; 916 connector->display_info.subpixel_order = SubPixelHorizontalRGB;
@@ -904,43 +937,50 @@ void intel_lvds_init(struct drm_device *dev)
904 * if closed, act like it's not there for now 937 * if closed, act like it's not there for now
905 */ 938 */
906 939
907 /* Set up the DDC bus. */
908 intel_encoder->ddc_bus = intel_i2c_create(dev, gpio, "LVDSDDC_C");
909 if (!intel_encoder->ddc_bus) {
910 dev_printk(KERN_ERR, &dev->pdev->dev, "DDC bus registration "
911 "failed.\n");
912 goto failed;
913 }
914
915 /* 940 /*
916 * Attempt to get the fixed panel mode from DDC. Assume that the 941 * Attempt to get the fixed panel mode from DDC. Assume that the
917 * preferred mode is the right one. 942 * preferred mode is the right one.
918 */ 943 */
919 dev_priv->lvds_edid_good = true; 944 intel_lvds->edid = drm_get_edid(connector,
920 945 &dev_priv->gmbus[pin].adapter);
921 if (!intel_ddc_get_modes(connector, intel_encoder->ddc_bus)) 946 if (intel_lvds->edid) {
922 dev_priv->lvds_edid_good = false; 947 if (drm_add_edid_modes(connector,
948 intel_lvds->edid)) {
949 drm_mode_connector_update_edid_property(connector,
950 intel_lvds->edid);
951 } else {
952 kfree(intel_lvds->edid);
953 intel_lvds->edid = NULL;
954 }
955 }
956 if (!intel_lvds->edid) {
957 /* Didn't get an EDID, so
958 * Set wide sync ranges so we get all modes
959 * handed to valid_mode for checking
960 */
961 connector->display_info.min_vfreq = 0;
962 connector->display_info.max_vfreq = 200;
963 connector->display_info.min_hfreq = 0;
964 connector->display_info.max_hfreq = 200;
965 }
923 966
924 list_for_each_entry(scan, &connector->probed_modes, head) { 967 list_for_each_entry(scan, &connector->probed_modes, head) {
925 mutex_lock(&dev->mode_config.mutex);
926 if (scan->type & DRM_MODE_TYPE_PREFERRED) { 968 if (scan->type & DRM_MODE_TYPE_PREFERRED) {
927 dev_priv->panel_fixed_mode = 969 intel_lvds->fixed_mode =
928 drm_mode_duplicate(dev, scan); 970 drm_mode_duplicate(dev, scan);
929 mutex_unlock(&dev->mode_config.mutex); 971 intel_find_lvds_downclock(dev,
930 intel_find_lvds_downclock(dev, connector); 972 intel_lvds->fixed_mode,
973 connector);
931 goto out; 974 goto out;
932 } 975 }
933 mutex_unlock(&dev->mode_config.mutex);
934 } 976 }
935 977
936 /* Failed to get EDID, what about VBT? */ 978 /* Failed to get EDID, what about VBT? */
937 if (dev_priv->lfp_lvds_vbt_mode) { 979 if (dev_priv->lfp_lvds_vbt_mode) {
938 mutex_lock(&dev->mode_config.mutex); 980 intel_lvds->fixed_mode =
939 dev_priv->panel_fixed_mode =
940 drm_mode_duplicate(dev, dev_priv->lfp_lvds_vbt_mode); 981 drm_mode_duplicate(dev, dev_priv->lfp_lvds_vbt_mode);
941 mutex_unlock(&dev->mode_config.mutex); 982 if (intel_lvds->fixed_mode) {
942 if (dev_priv->panel_fixed_mode) { 983 intel_lvds->fixed_mode->type |=
943 dev_priv->panel_fixed_mode->type |=
944 DRM_MODE_TYPE_PREFERRED; 984 DRM_MODE_TYPE_PREFERRED;
945 goto out; 985 goto out;
946 } 986 }
@@ -958,28 +998,36 @@ void intel_lvds_init(struct drm_device *dev)
958 998
959 lvds = I915_READ(LVDS); 999 lvds = I915_READ(LVDS);
960 pipe = (lvds & LVDS_PIPEB_SELECT) ? 1 : 0; 1000 pipe = (lvds & LVDS_PIPEB_SELECT) ? 1 : 0;
961 crtc = intel_get_crtc_from_pipe(dev, pipe); 1001 crtc = intel_get_crtc_for_pipe(dev, pipe);
962 1002
963 if (crtc && (lvds & LVDS_PORT_EN)) { 1003 if (crtc && (lvds & LVDS_PORT_EN)) {
964 dev_priv->panel_fixed_mode = intel_crtc_mode_get(dev, crtc); 1004 intel_lvds->fixed_mode = intel_crtc_mode_get(dev, crtc);
965 if (dev_priv->panel_fixed_mode) { 1005 if (intel_lvds->fixed_mode) {
966 dev_priv->panel_fixed_mode->type |= 1006 intel_lvds->fixed_mode->type |=
967 DRM_MODE_TYPE_PREFERRED; 1007 DRM_MODE_TYPE_PREFERRED;
968 goto out; 1008 goto out;
969 } 1009 }
970 } 1010 }
971 1011
972 /* If we still don't have a mode after all that, give up. */ 1012 /* If we still don't have a mode after all that, give up. */
973 if (!dev_priv->panel_fixed_mode) 1013 if (!intel_lvds->fixed_mode)
974 goto failed; 1014 goto failed;
975 1015
976out: 1016out:
977 if (HAS_PCH_SPLIT(dev)) { 1017 if (HAS_PCH_SPLIT(dev)) {
978 u32 pwm; 1018 u32 pwm;
979 /* make sure PWM is enabled */ 1019
1020 pipe = (I915_READ(PCH_LVDS) & LVDS_PIPEB_SELECT) ? 1 : 0;
1021
1022 /* make sure PWM is enabled and locked to the LVDS pipe */
980 pwm = I915_READ(BLC_PWM_CPU_CTL2); 1023 pwm = I915_READ(BLC_PWM_CPU_CTL2);
981 pwm |= (PWM_ENABLE | PWM_PIPE_B); 1024 if (pipe == 0 && (pwm & PWM_PIPE_B))
982 I915_WRITE(BLC_PWM_CPU_CTL2, pwm); 1025 I915_WRITE(BLC_PWM_CPU_CTL2, pwm & ~PWM_ENABLE);
1026 if (pipe)
1027 pwm |= PWM_PIPE_B;
1028 else
1029 pwm &= ~PWM_PIPE_B;
1030 I915_WRITE(BLC_PWM_CPU_CTL2, pwm | PWM_ENABLE);
983 1031
984 pwm = I915_READ(BLC_PWM_PCH_CTL1); 1032 pwm = I915_READ(BLC_PWM_PCH_CTL1);
985 pwm |= PWM_PCH_ENABLE; 1033 pwm |= PWM_PCH_ENABLE;
@@ -993,14 +1041,13 @@ out:
993 /* keep the LVDS connector */ 1041 /* keep the LVDS connector */
994 dev_priv->int_lvds_connector = connector; 1042 dev_priv->int_lvds_connector = connector;
995 drm_sysfs_connector_add(connector); 1043 drm_sysfs_connector_add(connector);
996 return; 1044 return true;
997 1045
998failed: 1046failed:
999 DRM_DEBUG_KMS("No LVDS modes found, disabling.\n"); 1047 DRM_DEBUG_KMS("No LVDS modes found, disabling.\n");
1000 if (intel_encoder->ddc_bus)
1001 intel_i2c_destroy(intel_encoder->ddc_bus);
1002 drm_connector_cleanup(connector); 1048 drm_connector_cleanup(connector);
1003 drm_encoder_cleanup(encoder); 1049 drm_encoder_cleanup(encoder);
1004 kfree(intel_lvds); 1050 kfree(intel_lvds);
1005 kfree(intel_connector); 1051 kfree(intel_connector);
1052 return false;
1006} 1053}
diff --git a/drivers/gpu/drm/i915/intel_modes.c b/drivers/gpu/drm/i915/intel_modes.c
index 4b1fd3d9c73c..3b26a3ba02dd 100644
--- a/drivers/gpu/drm/i915/intel_modes.c
+++ b/drivers/gpu/drm/i915/intel_modes.c
@@ -1,6 +1,6 @@
1/* 1/*
2 * Copyright (c) 2007 Dave Airlie <airlied@linux.ie> 2 * Copyright (c) 2007 Dave Airlie <airlied@linux.ie>
3 * Copyright (c) 2007 Intel Corporation 3 * Copyright (c) 2007, 2010 Intel Corporation
4 * Jesse Barnes <jesse.barnes@intel.com> 4 * Jesse Barnes <jesse.barnes@intel.com>
5 * 5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a 6 * Permission is hereby granted, free of charge, to any person obtaining a
@@ -34,11 +34,11 @@
34 * intel_ddc_probe 34 * intel_ddc_probe
35 * 35 *
36 */ 36 */
37bool intel_ddc_probe(struct intel_encoder *intel_encoder) 37bool intel_ddc_probe(struct intel_encoder *intel_encoder, int ddc_bus)
38{ 38{
39 struct drm_i915_private *dev_priv = intel_encoder->base.dev->dev_private;
39 u8 out_buf[] = { 0x0, 0x0}; 40 u8 out_buf[] = { 0x0, 0x0};
40 u8 buf[2]; 41 u8 buf[2];
41 int ret;
42 struct i2c_msg msgs[] = { 42 struct i2c_msg msgs[] = {
43 { 43 {
44 .addr = 0x50, 44 .addr = 0x50,
@@ -54,13 +54,7 @@ bool intel_ddc_probe(struct intel_encoder *intel_encoder)
54 } 54 }
55 }; 55 };
56 56
57 intel_i2c_quirk_set(intel_encoder->enc.dev, true); 57 return i2c_transfer(&dev_priv->gmbus[ddc_bus].adapter, msgs, 2) == 2;
58 ret = i2c_transfer(intel_encoder->ddc_bus, msgs, 2);
59 intel_i2c_quirk_set(intel_encoder->enc.dev, false);
60 if (ret == 2)
61 return true;
62
63 return false;
64} 58}
65 59
66/** 60/**
@@ -76,9 +70,7 @@ int intel_ddc_get_modes(struct drm_connector *connector,
76 struct edid *edid; 70 struct edid *edid;
77 int ret = 0; 71 int ret = 0;
78 72
79 intel_i2c_quirk_set(connector->dev, true);
80 edid = drm_get_edid(connector, adapter); 73 edid = drm_get_edid(connector, adapter);
81 intel_i2c_quirk_set(connector->dev, false);
82 if (edid) { 74 if (edid) {
83 drm_mode_connector_update_edid_property(connector, edid); 75 drm_mode_connector_update_edid_property(connector, edid);
84 ret = drm_add_edid_modes(connector, edid); 76 ret = drm_add_edid_modes(connector, edid);
@@ -88,3 +80,63 @@ int intel_ddc_get_modes(struct drm_connector *connector,
88 80
89 return ret; 81 return ret;
90} 82}
83
84static const char *force_audio_names[] = {
85 "off",
86 "auto",
87 "on",
88};
89
90void
91intel_attach_force_audio_property(struct drm_connector *connector)
92{
93 struct drm_device *dev = connector->dev;
94 struct drm_i915_private *dev_priv = dev->dev_private;
95 struct drm_property *prop;
96 int i;
97
98 prop = dev_priv->force_audio_property;
99 if (prop == NULL) {
100 prop = drm_property_create(dev, DRM_MODE_PROP_ENUM,
101 "audio",
102 ARRAY_SIZE(force_audio_names));
103 if (prop == NULL)
104 return;
105
106 for (i = 0; i < ARRAY_SIZE(force_audio_names); i++)
107 drm_property_add_enum(prop, i, i-1, force_audio_names[i]);
108
109 dev_priv->force_audio_property = prop;
110 }
111 drm_connector_attach_property(connector, prop, 0);
112}
113
114static const char *broadcast_rgb_names[] = {
115 "Full",
116 "Limited 16:235",
117};
118
119void
120intel_attach_broadcast_rgb_property(struct drm_connector *connector)
121{
122 struct drm_device *dev = connector->dev;
123 struct drm_i915_private *dev_priv = dev->dev_private;
124 struct drm_property *prop;
125 int i;
126
127 prop = dev_priv->broadcast_rgb_property;
128 if (prop == NULL) {
129 prop = drm_property_create(dev, DRM_MODE_PROP_ENUM,
130 "Broadcast RGB",
131 ARRAY_SIZE(broadcast_rgb_names));
132 if (prop == NULL)
133 return;
134
135 for (i = 0; i < ARRAY_SIZE(broadcast_rgb_names); i++)
136 drm_property_add_enum(prop, i, i, broadcast_rgb_names[i]);
137
138 dev_priv->broadcast_rgb_property = prop;
139 }
140
141 drm_connector_attach_property(connector, prop, 0);
142}
diff --git a/drivers/gpu/drm/i915/i915_opregion.c b/drivers/gpu/drm/i915/intel_opregion.c
index ea5d3fea4b61..d2c710422908 100644
--- a/drivers/gpu/drm/i915/i915_opregion.c
+++ b/drivers/gpu/drm/i915/intel_opregion.c
@@ -26,22 +26,24 @@
26 */ 26 */
27 27
28#include <linux/acpi.h> 28#include <linux/acpi.h>
29#include <linux/acpi_io.h>
29#include <acpi/video.h> 30#include <acpi/video.h>
30 31
31#include "drmP.h" 32#include "drmP.h"
32#include "i915_drm.h" 33#include "i915_drm.h"
33#include "i915_drv.h" 34#include "i915_drv.h"
35#include "intel_drv.h"
34 36
35#define PCI_ASLE 0xe4 37#define PCI_ASLE 0xe4
36#define PCI_LBPC 0xf4
37#define PCI_ASLS 0xfc 38#define PCI_ASLS 0xfc
38 39
39#define OPREGION_SZ (8*1024)
40#define OPREGION_HEADER_OFFSET 0 40#define OPREGION_HEADER_OFFSET 0
41#define OPREGION_ACPI_OFFSET 0x100 41#define OPREGION_ACPI_OFFSET 0x100
42#define ACPI_CLID 0x01ac /* current lid state indicator */
43#define ACPI_CDCK 0x01b0 /* current docking state indicator */
42#define OPREGION_SWSCI_OFFSET 0x200 44#define OPREGION_SWSCI_OFFSET 0x200
43#define OPREGION_ASLE_OFFSET 0x300 45#define OPREGION_ASLE_OFFSET 0x300
44#define OPREGION_VBT_OFFSET 0x1000 46#define OPREGION_VBT_OFFSET 0x400
45 47
46#define OPREGION_SIGNATURE "IntelGraphicsMem" 48#define OPREGION_SIGNATURE "IntelGraphicsMem"
47#define MBOX_ACPI (1<<0) 49#define MBOX_ACPI (1<<0)
@@ -143,40 +145,22 @@ struct opregion_asle {
143#define ACPI_DIGITAL_OUTPUT (3<<8) 145#define ACPI_DIGITAL_OUTPUT (3<<8)
144#define ACPI_LVDS_OUTPUT (4<<8) 146#define ACPI_LVDS_OUTPUT (4<<8)
145 147
148#ifdef CONFIG_ACPI
146static u32 asle_set_backlight(struct drm_device *dev, u32 bclp) 149static u32 asle_set_backlight(struct drm_device *dev, u32 bclp)
147{ 150{
148 struct drm_i915_private *dev_priv = dev->dev_private; 151 struct drm_i915_private *dev_priv = dev->dev_private;
149 struct opregion_asle *asle = dev_priv->opregion.asle; 152 struct opregion_asle *asle = dev_priv->opregion.asle;
150 u32 blc_pwm_ctl, blc_pwm_ctl2; 153 u32 max;
151 u32 max_backlight, level, shift;
152 154
153 if (!(bclp & ASLE_BCLP_VALID)) 155 if (!(bclp & ASLE_BCLP_VALID))
154 return ASLE_BACKLIGHT_FAILED; 156 return ASLE_BACKLIGHT_FAILED;
155 157
156 bclp &= ASLE_BCLP_MSK; 158 bclp &= ASLE_BCLP_MSK;
157 if (bclp < 0 || bclp > 255) 159 if (bclp > 255)
158 return ASLE_BACKLIGHT_FAILED; 160 return ASLE_BACKLIGHT_FAILED;
159 161
160 blc_pwm_ctl = I915_READ(BLC_PWM_CTL); 162 max = intel_panel_get_max_backlight(dev);
161 blc_pwm_ctl2 = I915_READ(BLC_PWM_CTL2); 163 intel_panel_set_backlight(dev, bclp * max / 255);
162
163 if (IS_I965G(dev) && (blc_pwm_ctl2 & BLM_COMBINATION_MODE))
164 pci_write_config_dword(dev->pdev, PCI_LBPC, bclp);
165 else {
166 if (IS_PINEVIEW(dev)) {
167 blc_pwm_ctl &= ~(BACKLIGHT_DUTY_CYCLE_MASK - 1);
168 max_backlight = (blc_pwm_ctl & BACKLIGHT_MODULATION_FREQ_MASK) >>
169 BACKLIGHT_MODULATION_FREQ_SHIFT;
170 shift = BACKLIGHT_DUTY_CYCLE_SHIFT + 1;
171 } else {
172 blc_pwm_ctl &= ~BACKLIGHT_DUTY_CYCLE_MASK;
173 max_backlight = ((blc_pwm_ctl & BACKLIGHT_MODULATION_FREQ_MASK) >>
174 BACKLIGHT_MODULATION_FREQ_SHIFT) * 2;
175 shift = BACKLIGHT_DUTY_CYCLE_SHIFT;
176 }
177 level = (bclp * max_backlight) / 255;
178 I915_WRITE(BLC_PWM_CTL, blc_pwm_ctl | (level << shift));
179 }
180 asle->cblv = (bclp*0x64)/0xff | ASLE_CBLV_VALID; 164 asle->cblv = (bclp*0x64)/0xff | ASLE_CBLV_VALID;
181 165
182 return 0; 166 return 0;
@@ -211,7 +195,7 @@ static u32 asle_set_pfit(struct drm_device *dev, u32 pfit)
211 return 0; 195 return 0;
212} 196}
213 197
214void opregion_asle_intr(struct drm_device *dev) 198void intel_opregion_asle_intr(struct drm_device *dev)
215{ 199{
216 struct drm_i915_private *dev_priv = dev->dev_private; 200 struct drm_i915_private *dev_priv = dev->dev_private;
217 struct opregion_asle *asle = dev_priv->opregion.asle; 201 struct opregion_asle *asle = dev_priv->opregion.asle;
@@ -243,37 +227,8 @@ void opregion_asle_intr(struct drm_device *dev)
243 asle->aslc = asle_stat; 227 asle->aslc = asle_stat;
244} 228}
245 229
246static u32 asle_set_backlight_ironlake(struct drm_device *dev, u32 bclp) 230/* Only present on Ironlake+ */
247{ 231void intel_opregion_gse_intr(struct drm_device *dev)
248 struct drm_i915_private *dev_priv = dev->dev_private;
249 struct opregion_asle *asle = dev_priv->opregion.asle;
250 u32 cpu_pwm_ctl, pch_pwm_ctl2;
251 u32 max_backlight, level;
252
253 if (!(bclp & ASLE_BCLP_VALID))
254 return ASLE_BACKLIGHT_FAILED;
255
256 bclp &= ASLE_BCLP_MSK;
257 if (bclp < 0 || bclp > 255)
258 return ASLE_BACKLIGHT_FAILED;
259
260 cpu_pwm_ctl = I915_READ(BLC_PWM_CPU_CTL);
261 pch_pwm_ctl2 = I915_READ(BLC_PWM_PCH_CTL2);
262 /* get the max PWM frequency */
263 max_backlight = (pch_pwm_ctl2 >> 16) & BACKLIGHT_DUTY_CYCLE_MASK;
264 /* calculate the expected PMW frequency */
265 level = (bclp * max_backlight) / 255;
266 /* reserve the high 16 bits */
267 cpu_pwm_ctl &= ~(BACKLIGHT_DUTY_CYCLE_MASK);
268 /* write the updated PWM frequency */
269 I915_WRITE(BLC_PWM_CPU_CTL, cpu_pwm_ctl | level);
270
271 asle->cblv = (bclp*0x64)/0xff | ASLE_CBLV_VALID;
272
273 return 0;
274}
275
276void ironlake_opregion_gse_intr(struct drm_device *dev)
277{ 232{
278 struct drm_i915_private *dev_priv = dev->dev_private; 233 struct drm_i915_private *dev_priv = dev->dev_private;
279 struct opregion_asle *asle = dev_priv->opregion.asle; 234 struct opregion_asle *asle = dev_priv->opregion.asle;
@@ -296,7 +251,7 @@ void ironlake_opregion_gse_intr(struct drm_device *dev)
296 } 251 }
297 252
298 if (asle_req & ASLE_SET_BACKLIGHT) 253 if (asle_req & ASLE_SET_BACKLIGHT)
299 asle_stat |= asle_set_backlight_ironlake(dev, asle->bclp); 254 asle_stat |= asle_set_backlight(dev, asle->bclp);
300 255
301 if (asle_req & ASLE_SET_PFIT) { 256 if (asle_req & ASLE_SET_PFIT) {
302 DRM_DEBUG_DRIVER("Pfit is not supported\n"); 257 DRM_DEBUG_DRIVER("Pfit is not supported\n");
@@ -315,20 +270,14 @@ void ironlake_opregion_gse_intr(struct drm_device *dev)
315#define ASLE_PFIT_EN (1<<2) 270#define ASLE_PFIT_EN (1<<2)
316#define ASLE_PFMB_EN (1<<3) 271#define ASLE_PFMB_EN (1<<3)
317 272
318void opregion_enable_asle(struct drm_device *dev) 273void intel_opregion_enable_asle(struct drm_device *dev)
319{ 274{
320 struct drm_i915_private *dev_priv = dev->dev_private; 275 struct drm_i915_private *dev_priv = dev->dev_private;
321 struct opregion_asle *asle = dev_priv->opregion.asle; 276 struct opregion_asle *asle = dev_priv->opregion.asle;
322 277
323 if (asle) { 278 if (asle) {
324 if (IS_MOBILE(dev)) { 279 if (IS_MOBILE(dev))
325 unsigned long irqflags;
326
327 spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags);
328 intel_enable_asle(dev); 280 intel_enable_asle(dev);
329 spin_unlock_irqrestore(&dev_priv->user_irq_lock,
330 irqflags);
331 }
332 281
333 asle->tche = ASLE_ALS_EN | ASLE_BLC_EN | ASLE_PFIT_EN | 282 asle->tche = ASLE_ALS_EN | ASLE_BLC_EN | ASLE_PFIT_EN |
334 ASLE_PFMB_EN; 283 ASLE_PFMB_EN;
@@ -464,7 +413,58 @@ blind_set:
464 goto end; 413 goto end;
465} 414}
466 415
467int intel_opregion_init(struct drm_device *dev, int resume) 416void intel_opregion_init(struct drm_device *dev)
417{
418 struct drm_i915_private *dev_priv = dev->dev_private;
419 struct intel_opregion *opregion = &dev_priv->opregion;
420
421 if (!opregion->header)
422 return;
423
424 if (opregion->acpi) {
425 if (drm_core_check_feature(dev, DRIVER_MODESET))
426 intel_didl_outputs(dev);
427
428 /* Notify BIOS we are ready to handle ACPI video ext notifs.
429 * Right now, all the events are handled by the ACPI video module.
430 * We don't actually need to do anything with them. */
431 opregion->acpi->csts = 0;
432 opregion->acpi->drdy = 1;
433
434 system_opregion = opregion;
435 register_acpi_notifier(&intel_opregion_notifier);
436 }
437
438 if (opregion->asle)
439 intel_opregion_enable_asle(dev);
440}
441
442void intel_opregion_fini(struct drm_device *dev)
443{
444 struct drm_i915_private *dev_priv = dev->dev_private;
445 struct intel_opregion *opregion = &dev_priv->opregion;
446
447 if (!opregion->header)
448 return;
449
450 if (opregion->acpi) {
451 opregion->acpi->drdy = 0;
452
453 system_opregion = NULL;
454 unregister_acpi_notifier(&intel_opregion_notifier);
455 }
456
457 /* just clear all opregion memory pointers now */
458 iounmap(opregion->header);
459 opregion->header = NULL;
460 opregion->acpi = NULL;
461 opregion->swsci = NULL;
462 opregion->asle = NULL;
463 opregion->vbt = NULL;
464}
465#endif
466
467int intel_opregion_setup(struct drm_device *dev)
468{ 468{
469 struct drm_i915_private *dev_priv = dev->dev_private; 469 struct drm_i915_private *dev_priv = dev->dev_private;
470 struct intel_opregion *opregion = &dev_priv->opregion; 470 struct intel_opregion *opregion = &dev_priv->opregion;
@@ -479,29 +479,25 @@ int intel_opregion_init(struct drm_device *dev, int resume)
479 return -ENOTSUPP; 479 return -ENOTSUPP;
480 } 480 }
481 481
482 base = ioremap(asls, OPREGION_SZ); 482 base = acpi_os_ioremap(asls, OPREGION_SIZE);
483 if (!base) 483 if (!base)
484 return -ENOMEM; 484 return -ENOMEM;
485 485
486 opregion->header = base; 486 if (memcmp(base, OPREGION_SIGNATURE, 16)) {
487 if (memcmp(opregion->header->signature, OPREGION_SIGNATURE, 16)) {
488 DRM_DEBUG_DRIVER("opregion signature mismatch\n"); 487 DRM_DEBUG_DRIVER("opregion signature mismatch\n");
489 err = -EINVAL; 488 err = -EINVAL;
490 goto err_out; 489 goto err_out;
491 } 490 }
491 opregion->header = base;
492 opregion->vbt = base + OPREGION_VBT_OFFSET;
493
494 opregion->lid_state = base + ACPI_CLID;
492 495
493 mboxes = opregion->header->mboxes; 496 mboxes = opregion->header->mboxes;
494 if (mboxes & MBOX_ACPI) { 497 if (mboxes & MBOX_ACPI) {
495 DRM_DEBUG_DRIVER("Public ACPI methods supported\n"); 498 DRM_DEBUG_DRIVER("Public ACPI methods supported\n");
496 opregion->acpi = base + OPREGION_ACPI_OFFSET; 499 opregion->acpi = base + OPREGION_ACPI_OFFSET;
497 if (drm_core_check_feature(dev, DRIVER_MODESET))
498 intel_didl_outputs(dev);
499 } else {
500 DRM_DEBUG_DRIVER("Public ACPI methods not supported\n");
501 err = -ENOTSUPP;
502 goto err_out;
503 } 500 }
504 opregion->enabled = 1;
505 501
506 if (mboxes & MBOX_SWSCI) { 502 if (mboxes & MBOX_SWSCI) {
507 DRM_DEBUG_DRIVER("SWSCI supported\n"); 503 DRM_DEBUG_DRIVER("SWSCI supported\n");
@@ -510,53 +506,11 @@ int intel_opregion_init(struct drm_device *dev, int resume)
510 if (mboxes & MBOX_ASLE) { 506 if (mboxes & MBOX_ASLE) {
511 DRM_DEBUG_DRIVER("ASLE supported\n"); 507 DRM_DEBUG_DRIVER("ASLE supported\n");
512 opregion->asle = base + OPREGION_ASLE_OFFSET; 508 opregion->asle = base + OPREGION_ASLE_OFFSET;
513 opregion_enable_asle(dev);
514 } 509 }
515 510
516 if (!resume)
517 acpi_video_register();
518
519
520 /* Notify BIOS we are ready to handle ACPI video ext notifs.
521 * Right now, all the events are handled by the ACPI video module.
522 * We don't actually need to do anything with them. */
523 opregion->acpi->csts = 0;
524 opregion->acpi->drdy = 1;
525
526 system_opregion = opregion;
527 register_acpi_notifier(&intel_opregion_notifier);
528
529 return 0; 511 return 0;
530 512
531err_out: 513err_out:
532 iounmap(opregion->header); 514 iounmap(base);
533 opregion->header = NULL;
534 acpi_video_register();
535 return err; 515 return err;
536} 516}
537
538void intel_opregion_free(struct drm_device *dev, int suspend)
539{
540 struct drm_i915_private *dev_priv = dev->dev_private;
541 struct intel_opregion *opregion = &dev_priv->opregion;
542
543 if (!opregion->enabled)
544 return;
545
546 if (!suspend)
547 acpi_video_unregister();
548
549 opregion->acpi->drdy = 0;
550
551 system_opregion = NULL;
552 unregister_acpi_notifier(&intel_opregion_notifier);
553
554 /* just clear all opregion memory pointers now */
555 iounmap(opregion->header);
556 opregion->header = NULL;
557 opregion->acpi = NULL;
558 opregion->swsci = NULL;
559 opregion->asle = NULL;
560
561 opregion->enabled = 0;
562}
diff --git a/drivers/gpu/drm/i915/intel_overlay.c b/drivers/gpu/drm/i915/intel_overlay.c
index 1d306a458be6..9e2959bc91cd 100644
--- a/drivers/gpu/drm/i915/intel_overlay.c
+++ b/drivers/gpu/drm/i915/intel_overlay.c
@@ -170,91 +170,180 @@ struct overlay_registers {
170 u16 RESERVEDG[0x100 / 2 - N_HORIZ_UV_TAPS * N_PHASES]; 170 u16 RESERVEDG[0x100 / 2 - N_HORIZ_UV_TAPS * N_PHASES];
171}; 171};
172 172
173/* overlay flip addr flag */ 173struct intel_overlay {
174#define OFC_UPDATE 0x1 174 struct drm_device *dev;
175 175 struct intel_crtc *crtc;
176#define OVERLAY_NONPHYSICAL(dev) (IS_G33(dev) || IS_I965G(dev)) 176 struct drm_i915_gem_object *vid_bo;
177#define OVERLAY_EXISTS(dev) (!IS_G4X(dev) && !IS_IRONLAKE(dev) && !IS_GEN6(dev)) 177 struct drm_i915_gem_object *old_vid_bo;
178 178 int active;
179 int pfit_active;
180 u32 pfit_vscale_ratio; /* shifted-point number, (1<<12) == 1.0 */
181 u32 color_key;
182 u32 brightness, contrast, saturation;
183 u32 old_xscale, old_yscale;
184 /* register access */
185 u32 flip_addr;
186 struct drm_i915_gem_object *reg_bo;
187 /* flip handling */
188 uint32_t last_flip_req;
189 void (*flip_tail)(struct intel_overlay *);
190};
179 191
180static struct overlay_registers *intel_overlay_map_regs_atomic(struct intel_overlay *overlay) 192static struct overlay_registers *
193intel_overlay_map_regs(struct intel_overlay *overlay)
181{ 194{
182 drm_i915_private_t *dev_priv = overlay->dev->dev_private; 195 drm_i915_private_t *dev_priv = overlay->dev->dev_private;
183 struct overlay_registers *regs; 196 struct overlay_registers *regs;
184 197
185 /* no recursive mappings */ 198 if (OVERLAY_NEEDS_PHYSICAL(overlay->dev))
186 BUG_ON(overlay->virt_addr); 199 regs = overlay->reg_bo->phys_obj->handle->vaddr;
200 else
201 regs = io_mapping_map_wc(dev_priv->mm.gtt_mapping,
202 overlay->reg_bo->gtt_offset);
187 203
188 if (OVERLAY_NONPHYSICAL(overlay->dev)) { 204 return regs;
189 regs = io_mapping_map_atomic_wc(dev_priv->mm.gtt_mapping, 205}
190 overlay->reg_bo->gtt_offset,
191 KM_USER0);
192 206
193 if (!regs) { 207static void intel_overlay_unmap_regs(struct intel_overlay *overlay,
194 DRM_ERROR("failed to map overlay regs in GTT\n"); 208 struct overlay_registers *regs)
195 return NULL; 209{
196 } 210 if (!OVERLAY_NEEDS_PHYSICAL(overlay->dev))
197 } else 211 io_mapping_unmap(regs);
198 regs = overlay->reg_bo->phys_obj->handle->vaddr; 212}
213
214static int intel_overlay_do_wait_request(struct intel_overlay *overlay,
215 struct drm_i915_gem_request *request,
216 void (*tail)(struct intel_overlay *))
217{
218 struct drm_device *dev = overlay->dev;
219 drm_i915_private_t *dev_priv = dev->dev_private;
220 int ret;
199 221
200 return overlay->virt_addr = regs; 222 BUG_ON(overlay->last_flip_req);
223 ret = i915_add_request(LP_RING(dev_priv), NULL, request);
224 if (ret) {
225 kfree(request);
226 return ret;
227 }
228 overlay->last_flip_req = request->seqno;
229 overlay->flip_tail = tail;
230 ret = i915_wait_request(LP_RING(dev_priv), overlay->last_flip_req);
231 if (ret)
232 return ret;
233
234 overlay->last_flip_req = 0;
235 return 0;
201} 236}
202 237
203static void intel_overlay_unmap_regs_atomic(struct intel_overlay *overlay) 238/* Workaround for i830 bug where pipe a must be enable to change control regs */
239static int
240i830_activate_pipe_a(struct drm_device *dev)
204{ 241{
205 if (OVERLAY_NONPHYSICAL(overlay->dev)) 242 drm_i915_private_t *dev_priv = dev->dev_private;
206 io_mapping_unmap_atomic(overlay->virt_addr, KM_USER0); 243 struct intel_crtc *crtc;
244 struct drm_crtc_helper_funcs *crtc_funcs;
245 struct drm_display_mode vesa_640x480 = {
246 DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 25175, 640, 656,
247 752, 800, 0, 480, 489, 492, 525, 0,
248 DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC)
249 }, *mode;
250
251 crtc = to_intel_crtc(dev_priv->pipe_to_crtc_mapping[0]);
252 if (crtc->dpms_mode == DRM_MODE_DPMS_ON)
253 return 0;
207 254
208 overlay->virt_addr = NULL; 255 /* most i8xx have pipe a forced on, so don't trust dpms mode */
256 if (I915_READ(_PIPEACONF) & PIPECONF_ENABLE)
257 return 0;
209 258
210 return; 259 crtc_funcs = crtc->base.helper_private;
260 if (crtc_funcs->dpms == NULL)
261 return 0;
262
263 DRM_DEBUG_DRIVER("Enabling pipe A in order to enable overlay\n");
264
265 mode = drm_mode_duplicate(dev, &vesa_640x480);
266 drm_mode_set_crtcinfo(mode, CRTC_INTERLACE_HALVE_V);
267 if(!drm_crtc_helper_set_mode(&crtc->base, mode,
268 crtc->base.x, crtc->base.y,
269 crtc->base.fb))
270 return 0;
271
272 crtc_funcs->dpms(&crtc->base, DRM_MODE_DPMS_ON);
273 return 1;
274}
275
276static void
277i830_deactivate_pipe_a(struct drm_device *dev)
278{
279 drm_i915_private_t *dev_priv = dev->dev_private;
280 struct drm_crtc *crtc = dev_priv->pipe_to_crtc_mapping[0];
281 struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private;
282
283 crtc_funcs->dpms(crtc, DRM_MODE_DPMS_OFF);
211} 284}
212 285
213/* overlay needs to be disable in OCMD reg */ 286/* overlay needs to be disable in OCMD reg */
214static int intel_overlay_on(struct intel_overlay *overlay) 287static int intel_overlay_on(struct intel_overlay *overlay)
215{ 288{
216 struct drm_device *dev = overlay->dev; 289 struct drm_device *dev = overlay->dev;
290 struct drm_i915_private *dev_priv = dev->dev_private;
291 struct drm_i915_gem_request *request;
292 int pipe_a_quirk = 0;
217 int ret; 293 int ret;
218 drm_i915_private_t *dev_priv = dev->dev_private;
219 294
220 BUG_ON(overlay->active); 295 BUG_ON(overlay->active);
221
222 overlay->active = 1; 296 overlay->active = 1;
223 overlay->hw_wedged = NEEDS_WAIT_FOR_FLIP;
224 297
225 BEGIN_LP_RING(4); 298 if (IS_I830(dev)) {
299 pipe_a_quirk = i830_activate_pipe_a(dev);
300 if (pipe_a_quirk < 0)
301 return pipe_a_quirk;
302 }
303
304 request = kzalloc(sizeof(*request), GFP_KERNEL);
305 if (request == NULL) {
306 ret = -ENOMEM;
307 goto out;
308 }
309
310 ret = BEGIN_LP_RING(4);
311 if (ret) {
312 kfree(request);
313 goto out;
314 }
315
226 OUT_RING(MI_OVERLAY_FLIP | MI_OVERLAY_ON); 316 OUT_RING(MI_OVERLAY_FLIP | MI_OVERLAY_ON);
227 OUT_RING(overlay->flip_addr | OFC_UPDATE); 317 OUT_RING(overlay->flip_addr | OFC_UPDATE);
228 OUT_RING(MI_WAIT_FOR_EVENT | MI_WAIT_FOR_OVERLAY_FLIP); 318 OUT_RING(MI_WAIT_FOR_EVENT | MI_WAIT_FOR_OVERLAY_FLIP);
229 OUT_RING(MI_NOOP); 319 OUT_RING(MI_NOOP);
230 ADVANCE_LP_RING(); 320 ADVANCE_LP_RING();
231 321
232 overlay->last_flip_req = 322 ret = intel_overlay_do_wait_request(overlay, request, NULL);
233 i915_add_request(dev, NULL, 0, &dev_priv->render_ring); 323out:
234 if (overlay->last_flip_req == 0) 324 if (pipe_a_quirk)
235 return -ENOMEM; 325 i830_deactivate_pipe_a(dev);
236 326
237 ret = i915_do_wait_request(dev, 327 return ret;
238 overlay->last_flip_req, 1, &dev_priv->render_ring);
239 if (ret != 0)
240 return ret;
241
242 overlay->hw_wedged = 0;
243 overlay->last_flip_req = 0;
244 return 0;
245} 328}
246 329
247/* overlay needs to be enabled in OCMD reg */ 330/* overlay needs to be enabled in OCMD reg */
248static void intel_overlay_continue(struct intel_overlay *overlay, 331static int intel_overlay_continue(struct intel_overlay *overlay,
249 bool load_polyphase_filter) 332 bool load_polyphase_filter)
250{ 333{
251 struct drm_device *dev = overlay->dev; 334 struct drm_device *dev = overlay->dev;
252 drm_i915_private_t *dev_priv = dev->dev_private; 335 drm_i915_private_t *dev_priv = dev->dev_private;
336 struct drm_i915_gem_request *request;
253 u32 flip_addr = overlay->flip_addr; 337 u32 flip_addr = overlay->flip_addr;
254 u32 tmp; 338 u32 tmp;
339 int ret;
255 340
256 BUG_ON(!overlay->active); 341 BUG_ON(!overlay->active);
257 342
343 request = kzalloc(sizeof(*request), GFP_KERNEL);
344 if (request == NULL)
345 return -ENOMEM;
346
258 if (load_polyphase_filter) 347 if (load_polyphase_filter)
259 flip_addr |= OFC_UPDATE; 348 flip_addr |= OFC_UPDATE;
260 349
@@ -263,226 +352,154 @@ static void intel_overlay_continue(struct intel_overlay *overlay,
263 if (tmp & (1 << 17)) 352 if (tmp & (1 << 17))
264 DRM_DEBUG("overlay underrun, DOVSTA: %x\n", tmp); 353 DRM_DEBUG("overlay underrun, DOVSTA: %x\n", tmp);
265 354
266 BEGIN_LP_RING(2); 355 ret = BEGIN_LP_RING(2);
356 if (ret) {
357 kfree(request);
358 return ret;
359 }
267 OUT_RING(MI_OVERLAY_FLIP | MI_OVERLAY_CONTINUE); 360 OUT_RING(MI_OVERLAY_FLIP | MI_OVERLAY_CONTINUE);
268 OUT_RING(flip_addr); 361 OUT_RING(flip_addr);
269 ADVANCE_LP_RING(); 362 ADVANCE_LP_RING();
270 363
271 overlay->last_flip_req = 364 ret = i915_add_request(LP_RING(dev_priv), NULL, request);
272 i915_add_request(dev, NULL, 0, &dev_priv->render_ring); 365 if (ret) {
366 kfree(request);
367 return ret;
368 }
369
370 overlay->last_flip_req = request->seqno;
371 return 0;
273} 372}
274 373
275static int intel_overlay_wait_flip(struct intel_overlay *overlay) 374static void intel_overlay_release_old_vid_tail(struct intel_overlay *overlay)
276{ 375{
277 struct drm_device *dev = overlay->dev; 376 struct drm_i915_gem_object *obj = overlay->old_vid_bo;
278 drm_i915_private_t *dev_priv = dev->dev_private;
279 int ret;
280 u32 tmp;
281
282 if (overlay->last_flip_req != 0) {
283 ret = i915_do_wait_request(dev, overlay->last_flip_req,
284 1, &dev_priv->render_ring);
285 if (ret == 0) {
286 overlay->last_flip_req = 0;
287
288 tmp = I915_READ(ISR);
289 377
290 if (!(tmp & I915_OVERLAY_PLANE_FLIP_PENDING_INTERRUPT)) 378 i915_gem_object_unpin(obj);
291 return 0; 379 drm_gem_object_unreference(&obj->base);
292 }
293 }
294 380
295 /* synchronous slowpath */ 381 overlay->old_vid_bo = NULL;
296 overlay->hw_wedged = RELEASE_OLD_VID; 382}
297 383
298 BEGIN_LP_RING(2); 384static void intel_overlay_off_tail(struct intel_overlay *overlay)
299 OUT_RING(MI_WAIT_FOR_EVENT | MI_WAIT_FOR_OVERLAY_FLIP); 385{
300 OUT_RING(MI_NOOP); 386 struct drm_i915_gem_object *obj = overlay->vid_bo;
301 ADVANCE_LP_RING();
302 387
303 overlay->last_flip_req = 388 /* never have the overlay hw on without showing a frame */
304 i915_add_request(dev, NULL, 0, &dev_priv->render_ring); 389 BUG_ON(!overlay->vid_bo);
305 if (overlay->last_flip_req == 0)
306 return -ENOMEM;
307 390
308 ret = i915_do_wait_request(dev, overlay->last_flip_req, 391 i915_gem_object_unpin(obj);
309 1, &dev_priv->render_ring); 392 drm_gem_object_unreference(&obj->base);
310 if (ret != 0) 393 overlay->vid_bo = NULL;
311 return ret;
312 394
313 overlay->hw_wedged = 0; 395 overlay->crtc->overlay = NULL;
314 overlay->last_flip_req = 0; 396 overlay->crtc = NULL;
315 return 0; 397 overlay->active = 0;
316} 398}
317 399
318/* overlay needs to be disabled in OCMD reg */ 400/* overlay needs to be disabled in OCMD reg */
319static int intel_overlay_off(struct intel_overlay *overlay) 401static int intel_overlay_off(struct intel_overlay *overlay)
320{ 402{
321 u32 flip_addr = overlay->flip_addr;
322 struct drm_device *dev = overlay->dev; 403 struct drm_device *dev = overlay->dev;
323 drm_i915_private_t *dev_priv = dev->dev_private; 404 struct drm_i915_private *dev_priv = dev->dev_private;
405 u32 flip_addr = overlay->flip_addr;
406 struct drm_i915_gem_request *request;
324 int ret; 407 int ret;
325 408
326 BUG_ON(!overlay->active); 409 BUG_ON(!overlay->active);
327 410
411 request = kzalloc(sizeof(*request), GFP_KERNEL);
412 if (request == NULL)
413 return -ENOMEM;
414
328 /* According to intel docs the overlay hw may hang (when switching 415 /* According to intel docs the overlay hw may hang (when switching
329 * off) without loading the filter coeffs. It is however unclear whether 416 * off) without loading the filter coeffs. It is however unclear whether
330 * this applies to the disabling of the overlay or to the switching off 417 * this applies to the disabling of the overlay or to the switching off
331 * of the hw. Do it in both cases */ 418 * of the hw. Do it in both cases */
332 flip_addr |= OFC_UPDATE; 419 flip_addr |= OFC_UPDATE;
333 420
421 ret = BEGIN_LP_RING(6);
422 if (ret) {
423 kfree(request);
424 return ret;
425 }
334 /* wait for overlay to go idle */ 426 /* wait for overlay to go idle */
335 overlay->hw_wedged = SWITCH_OFF_STAGE_1;
336
337 BEGIN_LP_RING(4);
338 OUT_RING(MI_OVERLAY_FLIP | MI_OVERLAY_CONTINUE); 427 OUT_RING(MI_OVERLAY_FLIP | MI_OVERLAY_CONTINUE);
339 OUT_RING(flip_addr); 428 OUT_RING(flip_addr);
340 OUT_RING(MI_WAIT_FOR_EVENT | MI_WAIT_FOR_OVERLAY_FLIP); 429 OUT_RING(MI_WAIT_FOR_EVENT | MI_WAIT_FOR_OVERLAY_FLIP);
341 OUT_RING(MI_NOOP);
342 ADVANCE_LP_RING();
343
344 overlay->last_flip_req =
345 i915_add_request(dev, NULL, 0, &dev_priv->render_ring);
346 if (overlay->last_flip_req == 0)
347 return -ENOMEM;
348
349 ret = i915_do_wait_request(dev, overlay->last_flip_req,
350 1, &dev_priv->render_ring);
351 if (ret != 0)
352 return ret;
353
354 /* turn overlay off */ 430 /* turn overlay off */
355 overlay->hw_wedged = SWITCH_OFF_STAGE_2; 431 OUT_RING(MI_OVERLAY_FLIP | MI_OVERLAY_OFF);
356
357 BEGIN_LP_RING(4);
358 OUT_RING(MI_OVERLAY_FLIP | MI_OVERLAY_OFF);
359 OUT_RING(flip_addr); 432 OUT_RING(flip_addr);
360 OUT_RING(MI_WAIT_FOR_EVENT | MI_WAIT_FOR_OVERLAY_FLIP); 433 OUT_RING(MI_WAIT_FOR_EVENT | MI_WAIT_FOR_OVERLAY_FLIP);
361 OUT_RING(MI_NOOP);
362 ADVANCE_LP_RING(); 434 ADVANCE_LP_RING();
363 435
364 overlay->last_flip_req = 436 return intel_overlay_do_wait_request(overlay, request,
365 i915_add_request(dev, NULL, 0, &dev_priv->render_ring); 437 intel_overlay_off_tail);
366 if (overlay->last_flip_req == 0)
367 return -ENOMEM;
368
369 ret = i915_do_wait_request(dev, overlay->last_flip_req,
370 1, &dev_priv->render_ring);
371 if (ret != 0)
372 return ret;
373
374 overlay->hw_wedged = 0;
375 overlay->last_flip_req = 0;
376 return ret;
377}
378
379static void intel_overlay_off_tail(struct intel_overlay *overlay)
380{
381 struct drm_gem_object *obj;
382
383 /* never have the overlay hw on without showing a frame */
384 BUG_ON(!overlay->vid_bo);
385 obj = &overlay->vid_bo->base;
386
387 i915_gem_object_unpin(obj);
388 drm_gem_object_unreference(obj);
389 overlay->vid_bo = NULL;
390
391 overlay->crtc->overlay = NULL;
392 overlay->crtc = NULL;
393 overlay->active = 0;
394} 438}
395 439
396/* recover from an interruption due to a signal 440/* recover from an interruption due to a signal
397 * We have to be careful not to repeat work forever an make forward progess. */ 441 * We have to be careful not to repeat work forever an make forward progess. */
398int intel_overlay_recover_from_interrupt(struct intel_overlay *overlay, 442static int intel_overlay_recover_from_interrupt(struct intel_overlay *overlay)
399 int interruptible)
400{ 443{
401 struct drm_device *dev = overlay->dev; 444 struct drm_device *dev = overlay->dev;
402 struct drm_gem_object *obj;
403 drm_i915_private_t *dev_priv = dev->dev_private; 445 drm_i915_private_t *dev_priv = dev->dev_private;
404 u32 flip_addr;
405 int ret; 446 int ret;
406 447
407 if (overlay->hw_wedged == HW_WEDGED) 448 if (overlay->last_flip_req == 0)
408 return -EIO; 449 return 0;
409
410 if (overlay->last_flip_req == 0) {
411 overlay->last_flip_req =
412 i915_add_request(dev, NULL, 0, &dev_priv->render_ring);
413 if (overlay->last_flip_req == 0)
414 return -ENOMEM;
415 }
416 450
417 ret = i915_do_wait_request(dev, overlay->last_flip_req, 451 ret = i915_wait_request(LP_RING(dev_priv), overlay->last_flip_req);
418 interruptible, &dev_priv->render_ring); 452 if (ret)
419 if (ret != 0)
420 return ret; 453 return ret;
421 454
422 switch (overlay->hw_wedged) { 455 if (overlay->flip_tail)
423 case RELEASE_OLD_VID: 456 overlay->flip_tail(overlay);
424 obj = &overlay->old_vid_bo->base;
425 i915_gem_object_unpin(obj);
426 drm_gem_object_unreference(obj);
427 overlay->old_vid_bo = NULL;
428 break;
429 case SWITCH_OFF_STAGE_1:
430 flip_addr = overlay->flip_addr;
431 flip_addr |= OFC_UPDATE;
432
433 overlay->hw_wedged = SWITCH_OFF_STAGE_2;
434
435 BEGIN_LP_RING(4);
436 OUT_RING(MI_OVERLAY_FLIP | MI_OVERLAY_OFF);
437 OUT_RING(flip_addr);
438 OUT_RING(MI_WAIT_FOR_EVENT | MI_WAIT_FOR_OVERLAY_FLIP);
439 OUT_RING(MI_NOOP);
440 ADVANCE_LP_RING();
441
442 overlay->last_flip_req = i915_add_request(dev, NULL,
443 0, &dev_priv->render_ring);
444 if (overlay->last_flip_req == 0)
445 return -ENOMEM;
446
447 ret = i915_do_wait_request(dev, overlay->last_flip_req,
448 interruptible, &dev_priv->render_ring);
449 if (ret != 0)
450 return ret;
451
452 case SWITCH_OFF_STAGE_2:
453 intel_overlay_off_tail(overlay);
454 break;
455 default:
456 BUG_ON(overlay->hw_wedged != NEEDS_WAIT_FOR_FLIP);
457 }
458 457
459 overlay->hw_wedged = 0;
460 overlay->last_flip_req = 0; 458 overlay->last_flip_req = 0;
461 return 0; 459 return 0;
462} 460}
463 461
464/* Wait for pending overlay flip and release old frame. 462/* Wait for pending overlay flip and release old frame.
465 * Needs to be called before the overlay register are changed 463 * Needs to be called before the overlay register are changed
466 * via intel_overlay_(un)map_regs_atomic */ 464 * via intel_overlay_(un)map_regs
465 */
467static int intel_overlay_release_old_vid(struct intel_overlay *overlay) 466static int intel_overlay_release_old_vid(struct intel_overlay *overlay)
468{ 467{
468 struct drm_device *dev = overlay->dev;
469 drm_i915_private_t *dev_priv = dev->dev_private;
469 int ret; 470 int ret;
470 struct drm_gem_object *obj;
471 471
472 /* only wait if there is actually an old frame to release to 472 /* Only wait if there is actually an old frame to release to
473 * guarantee forward progress */ 473 * guarantee forward progress.
474 */
474 if (!overlay->old_vid_bo) 475 if (!overlay->old_vid_bo)
475 return 0; 476 return 0;
476 477
477 ret = intel_overlay_wait_flip(overlay); 478 if (I915_READ(ISR) & I915_OVERLAY_PLANE_FLIP_PENDING_INTERRUPT) {
478 if (ret != 0) 479 struct drm_i915_gem_request *request;
479 return ret;
480 480
481 obj = &overlay->old_vid_bo->base; 481 /* synchronous slowpath */
482 i915_gem_object_unpin(obj); 482 request = kzalloc(sizeof(*request), GFP_KERNEL);
483 drm_gem_object_unreference(obj); 483 if (request == NULL)
484 overlay->old_vid_bo = NULL; 484 return -ENOMEM;
485
486 ret = BEGIN_LP_RING(2);
487 if (ret) {
488 kfree(request);
489 return ret;
490 }
491
492 OUT_RING(MI_WAIT_FOR_EVENT | MI_WAIT_FOR_OVERLAY_FLIP);
493 OUT_RING(MI_NOOP);
494 ADVANCE_LP_RING();
495
496 ret = intel_overlay_do_wait_request(overlay, request,
497 intel_overlay_release_old_vid_tail);
498 if (ret)
499 return ret;
500 }
485 501
502 intel_overlay_release_old_vid_tail(overlay);
486 return 0; 503 return 0;
487} 504}
488 505
@@ -506,65 +523,65 @@ struct put_image_params {
506static int packed_depth_bytes(u32 format) 523static int packed_depth_bytes(u32 format)
507{ 524{
508 switch (format & I915_OVERLAY_DEPTH_MASK) { 525 switch (format & I915_OVERLAY_DEPTH_MASK) {
509 case I915_OVERLAY_YUV422: 526 case I915_OVERLAY_YUV422:
510 return 4; 527 return 4;
511 case I915_OVERLAY_YUV411: 528 case I915_OVERLAY_YUV411:
512 /* return 6; not implemented */ 529 /* return 6; not implemented */
513 default: 530 default:
514 return -EINVAL; 531 return -EINVAL;
515 } 532 }
516} 533}
517 534
518static int packed_width_bytes(u32 format, short width) 535static int packed_width_bytes(u32 format, short width)
519{ 536{
520 switch (format & I915_OVERLAY_DEPTH_MASK) { 537 switch (format & I915_OVERLAY_DEPTH_MASK) {
521 case I915_OVERLAY_YUV422: 538 case I915_OVERLAY_YUV422:
522 return width << 1; 539 return width << 1;
523 default: 540 default:
524 return -EINVAL; 541 return -EINVAL;
525 } 542 }
526} 543}
527 544
528static int uv_hsubsampling(u32 format) 545static int uv_hsubsampling(u32 format)
529{ 546{
530 switch (format & I915_OVERLAY_DEPTH_MASK) { 547 switch (format & I915_OVERLAY_DEPTH_MASK) {
531 case I915_OVERLAY_YUV422: 548 case I915_OVERLAY_YUV422:
532 case I915_OVERLAY_YUV420: 549 case I915_OVERLAY_YUV420:
533 return 2; 550 return 2;
534 case I915_OVERLAY_YUV411: 551 case I915_OVERLAY_YUV411:
535 case I915_OVERLAY_YUV410: 552 case I915_OVERLAY_YUV410:
536 return 4; 553 return 4;
537 default: 554 default:
538 return -EINVAL; 555 return -EINVAL;
539 } 556 }
540} 557}
541 558
542static int uv_vsubsampling(u32 format) 559static int uv_vsubsampling(u32 format)
543{ 560{
544 switch (format & I915_OVERLAY_DEPTH_MASK) { 561 switch (format & I915_OVERLAY_DEPTH_MASK) {
545 case I915_OVERLAY_YUV420: 562 case I915_OVERLAY_YUV420:
546 case I915_OVERLAY_YUV410: 563 case I915_OVERLAY_YUV410:
547 return 2; 564 return 2;
548 case I915_OVERLAY_YUV422: 565 case I915_OVERLAY_YUV422:
549 case I915_OVERLAY_YUV411: 566 case I915_OVERLAY_YUV411:
550 return 1; 567 return 1;
551 default: 568 default:
552 return -EINVAL; 569 return -EINVAL;
553 } 570 }
554} 571}
555 572
556static u32 calc_swidthsw(struct drm_device *dev, u32 offset, u32 width) 573static u32 calc_swidthsw(struct drm_device *dev, u32 offset, u32 width)
557{ 574{
558 u32 mask, shift, ret; 575 u32 mask, shift, ret;
559 if (IS_I9XX(dev)) { 576 if (IS_GEN2(dev)) {
560 mask = 0x3f;
561 shift = 6;
562 } else {
563 mask = 0x1f; 577 mask = 0x1f;
564 shift = 5; 578 shift = 5;
579 } else {
580 mask = 0x3f;
581 shift = 6;
565 } 582 }
566 ret = ((offset + width + mask) >> shift) - (offset >> shift); 583 ret = ((offset + width + mask) >> shift) - (offset >> shift);
567 if (IS_I9XX(dev)) 584 if (!IS_GEN2(dev))
568 ret <<= 1; 585 ret <<= 1;
569 ret -=1; 586 ret -=1;
570 return ret << 2; 587 return ret << 2;
@@ -587,7 +604,9 @@ static const u16 y_static_hcoeffs[N_HORIZ_Y_TAPS * N_PHASES] = {
587 0x3020, 0xb340, 0x1fb8, 0x34a0, 0xb060, 604 0x3020, 0xb340, 0x1fb8, 0x34a0, 0xb060,
588 0x3020, 0xb240, 0x1fe0, 0x32e0, 0xb040, 605 0x3020, 0xb240, 0x1fe0, 0x32e0, 0xb040,
589 0x3020, 0xb140, 0x1ff8, 0x3160, 0xb020, 606 0x3020, 0xb140, 0x1ff8, 0x3160, 0xb020,
590 0xb000, 0x3000, 0x0800, 0x3000, 0xb000}; 607 0xb000, 0x3000, 0x0800, 0x3000, 0xb000
608};
609
591static const u16 uv_static_hcoeffs[N_HORIZ_UV_TAPS * N_PHASES] = { 610static const u16 uv_static_hcoeffs[N_HORIZ_UV_TAPS * N_PHASES] = {
592 0x3000, 0x1800, 0x1800, 0xb000, 0x18d0, 0x2e60, 611 0x3000, 0x1800, 0x1800, 0xb000, 0x18d0, 0x2e60,
593 0xb000, 0x1990, 0x2ce0, 0xb020, 0x1a68, 0x2b40, 612 0xb000, 0x1990, 0x2ce0, 0xb020, 0x1a68, 0x2b40,
@@ -597,7 +616,8 @@ static const u16 uv_static_hcoeffs[N_HORIZ_UV_TAPS * N_PHASES] = {
597 0xb100, 0x1eb8, 0x3620, 0xb100, 0x1f18, 0x34a0, 616 0xb100, 0x1eb8, 0x3620, 0xb100, 0x1f18, 0x34a0,
598 0xb100, 0x1f68, 0x3360, 0xb0e0, 0x1fa8, 0x3240, 617 0xb100, 0x1f68, 0x3360, 0xb0e0, 0x1fa8, 0x3240,
599 0xb0c0, 0x1fe0, 0x3140, 0xb060, 0x1ff0, 0x30a0, 618 0xb0c0, 0x1fe0, 0x3140, 0xb060, 0x1ff0, 0x30a0,
600 0x3000, 0x0800, 0x3000}; 619 0x3000, 0x0800, 0x3000
620};
601 621
602static void update_polyphase_filter(struct overlay_registers *regs) 622static void update_polyphase_filter(struct overlay_registers *regs)
603{ 623{
@@ -630,29 +650,31 @@ static bool update_scaling_factors(struct intel_overlay *overlay,
630 yscale = 1 << FP_SHIFT; 650 yscale = 1 << FP_SHIFT;
631 651
632 /*if (params->format & I915_OVERLAY_YUV_PLANAR) {*/ 652 /*if (params->format & I915_OVERLAY_YUV_PLANAR) {*/
633 xscale_UV = xscale/uv_hscale; 653 xscale_UV = xscale/uv_hscale;
634 yscale_UV = yscale/uv_vscale; 654 yscale_UV = yscale/uv_vscale;
635 /* make the Y scale to UV scale ratio an exact multiply */ 655 /* make the Y scale to UV scale ratio an exact multiply */
636 xscale = xscale_UV * uv_hscale; 656 xscale = xscale_UV * uv_hscale;
637 yscale = yscale_UV * uv_vscale; 657 yscale = yscale_UV * uv_vscale;
638 /*} else { 658 /*} else {
639 xscale_UV = 0; 659 xscale_UV = 0;
640 yscale_UV = 0; 660 yscale_UV = 0;
641 }*/ 661 }*/
642 662
643 if (xscale != overlay->old_xscale || yscale != overlay->old_yscale) 663 if (xscale != overlay->old_xscale || yscale != overlay->old_yscale)
644 scale_changed = true; 664 scale_changed = true;
645 overlay->old_xscale = xscale; 665 overlay->old_xscale = xscale;
646 overlay->old_yscale = yscale; 666 overlay->old_yscale = yscale;
647 667
648 regs->YRGBSCALE = ((yscale & FRACT_MASK) << 20) 668 regs->YRGBSCALE = (((yscale & FRACT_MASK) << 20) |
649 | ((xscale >> FP_SHIFT) << 16) 669 ((xscale >> FP_SHIFT) << 16) |
650 | ((xscale & FRACT_MASK) << 3); 670 ((xscale & FRACT_MASK) << 3));
651 regs->UVSCALE = ((yscale_UV & FRACT_MASK) << 20) 671
652 | ((xscale_UV >> FP_SHIFT) << 16) 672 regs->UVSCALE = (((yscale_UV & FRACT_MASK) << 20) |
653 | ((xscale_UV & FRACT_MASK) << 3); 673 ((xscale_UV >> FP_SHIFT) << 16) |
654 regs->UVSCALEV = ((yscale >> FP_SHIFT) << 16) 674 ((xscale_UV & FRACT_MASK) << 3));
655 | ((yscale_UV >> FP_SHIFT) << 0); 675
676 regs->UVSCALEV = ((((yscale >> FP_SHIFT) << 16) |
677 ((yscale_UV >> FP_SHIFT) << 0)));
656 678
657 if (scale_changed) 679 if (scale_changed)
658 update_polyphase_filter(regs); 680 update_polyphase_filter(regs);
@@ -664,22 +686,28 @@ static void update_colorkey(struct intel_overlay *overlay,
664 struct overlay_registers *regs) 686 struct overlay_registers *regs)
665{ 687{
666 u32 key = overlay->color_key; 688 u32 key = overlay->color_key;
689
667 switch (overlay->crtc->base.fb->bits_per_pixel) { 690 switch (overlay->crtc->base.fb->bits_per_pixel) {
668 case 8: 691 case 8:
669 regs->DCLRKV = 0; 692 regs->DCLRKV = 0;
670 regs->DCLRKM = CLK_RGB8I_MASK | DST_KEY_ENABLE; 693 regs->DCLRKM = CLK_RGB8I_MASK | DST_KEY_ENABLE;
671 case 16: 694 break;
672 if (overlay->crtc->base.fb->depth == 15) { 695
673 regs->DCLRKV = RGB15_TO_COLORKEY(key); 696 case 16:
674 regs->DCLRKM = CLK_RGB15_MASK | DST_KEY_ENABLE; 697 if (overlay->crtc->base.fb->depth == 15) {
675 } else { 698 regs->DCLRKV = RGB15_TO_COLORKEY(key);
676 regs->DCLRKV = RGB16_TO_COLORKEY(key); 699 regs->DCLRKM = CLK_RGB15_MASK | DST_KEY_ENABLE;
677 regs->DCLRKM = CLK_RGB16_MASK | DST_KEY_ENABLE; 700 } else {
678 } 701 regs->DCLRKV = RGB16_TO_COLORKEY(key);
679 case 24: 702 regs->DCLRKM = CLK_RGB16_MASK | DST_KEY_ENABLE;
680 case 32: 703 }
681 regs->DCLRKV = key; 704 break;
682 regs->DCLRKM = CLK_RGB24_MASK | DST_KEY_ENABLE; 705
706 case 24:
707 case 32:
708 regs->DCLRKV = key;
709 regs->DCLRKM = CLK_RGB24_MASK | DST_KEY_ENABLE;
710 break;
683 } 711 }
684} 712}
685 713
@@ -689,53 +717,52 @@ static u32 overlay_cmd_reg(struct put_image_params *params)
689 717
690 if (params->format & I915_OVERLAY_YUV_PLANAR) { 718 if (params->format & I915_OVERLAY_YUV_PLANAR) {
691 switch (params->format & I915_OVERLAY_DEPTH_MASK) { 719 switch (params->format & I915_OVERLAY_DEPTH_MASK) {
692 case I915_OVERLAY_YUV422: 720 case I915_OVERLAY_YUV422:
693 cmd |= OCMD_YUV_422_PLANAR; 721 cmd |= OCMD_YUV_422_PLANAR;
694 break; 722 break;
695 case I915_OVERLAY_YUV420: 723 case I915_OVERLAY_YUV420:
696 cmd |= OCMD_YUV_420_PLANAR; 724 cmd |= OCMD_YUV_420_PLANAR;
697 break; 725 break;
698 case I915_OVERLAY_YUV411: 726 case I915_OVERLAY_YUV411:
699 case I915_OVERLAY_YUV410: 727 case I915_OVERLAY_YUV410:
700 cmd |= OCMD_YUV_410_PLANAR; 728 cmd |= OCMD_YUV_410_PLANAR;
701 break; 729 break;
702 } 730 }
703 } else { /* YUV packed */ 731 } else { /* YUV packed */
704 switch (params->format & I915_OVERLAY_DEPTH_MASK) { 732 switch (params->format & I915_OVERLAY_DEPTH_MASK) {
705 case I915_OVERLAY_YUV422: 733 case I915_OVERLAY_YUV422:
706 cmd |= OCMD_YUV_422_PACKED; 734 cmd |= OCMD_YUV_422_PACKED;
707 break; 735 break;
708 case I915_OVERLAY_YUV411: 736 case I915_OVERLAY_YUV411:
709 cmd |= OCMD_YUV_411_PACKED; 737 cmd |= OCMD_YUV_411_PACKED;
710 break; 738 break;
711 } 739 }
712 740
713 switch (params->format & I915_OVERLAY_SWAP_MASK) { 741 switch (params->format & I915_OVERLAY_SWAP_MASK) {
714 case I915_OVERLAY_NO_SWAP: 742 case I915_OVERLAY_NO_SWAP:
715 break; 743 break;
716 case I915_OVERLAY_UV_SWAP: 744 case I915_OVERLAY_UV_SWAP:
717 cmd |= OCMD_UV_SWAP; 745 cmd |= OCMD_UV_SWAP;
718 break; 746 break;
719 case I915_OVERLAY_Y_SWAP: 747 case I915_OVERLAY_Y_SWAP:
720 cmd |= OCMD_Y_SWAP; 748 cmd |= OCMD_Y_SWAP;
721 break; 749 break;
722 case I915_OVERLAY_Y_AND_UV_SWAP: 750 case I915_OVERLAY_Y_AND_UV_SWAP:
723 cmd |= OCMD_Y_AND_UV_SWAP; 751 cmd |= OCMD_Y_AND_UV_SWAP;
724 break; 752 break;
725 } 753 }
726 } 754 }
727 755
728 return cmd; 756 return cmd;
729} 757}
730 758
731int intel_overlay_do_put_image(struct intel_overlay *overlay, 759static int intel_overlay_do_put_image(struct intel_overlay *overlay,
732 struct drm_gem_object *new_bo, 760 struct drm_i915_gem_object *new_bo,
733 struct put_image_params *params) 761 struct put_image_params *params)
734{ 762{
735 int ret, tmp_width; 763 int ret, tmp_width;
736 struct overlay_registers *regs; 764 struct overlay_registers *regs;
737 bool scale_changed = false; 765 bool scale_changed = false;
738 struct drm_i915_gem_object *bo_priv = to_intel_bo(new_bo);
739 struct drm_device *dev = overlay->dev; 766 struct drm_device *dev = overlay->dev;
740 767
741 BUG_ON(!mutex_is_locked(&dev->struct_mutex)); 768 BUG_ON(!mutex_is_locked(&dev->struct_mutex));
@@ -746,7 +773,7 @@ int intel_overlay_do_put_image(struct intel_overlay *overlay,
746 if (ret != 0) 773 if (ret != 0)
747 return ret; 774 return ret;
748 775
749 ret = i915_gem_object_pin(new_bo, PAGE_SIZE); 776 ret = i915_gem_object_pin(new_bo, PAGE_SIZE, true);
750 if (ret != 0) 777 if (ret != 0)
751 return ret; 778 return ret;
752 779
@@ -754,25 +781,29 @@ int intel_overlay_do_put_image(struct intel_overlay *overlay,
754 if (ret != 0) 781 if (ret != 0)
755 goto out_unpin; 782 goto out_unpin;
756 783
784 ret = i915_gem_object_put_fence(new_bo);
785 if (ret)
786 goto out_unpin;
787
757 if (!overlay->active) { 788 if (!overlay->active) {
758 regs = intel_overlay_map_regs_atomic(overlay); 789 regs = intel_overlay_map_regs(overlay);
759 if (!regs) { 790 if (!regs) {
760 ret = -ENOMEM; 791 ret = -ENOMEM;
761 goto out_unpin; 792 goto out_unpin;
762 } 793 }
763 regs->OCONFIG = OCONF_CC_OUT_8BIT; 794 regs->OCONFIG = OCONF_CC_OUT_8BIT;
764 if (IS_I965GM(overlay->dev)) 795 if (IS_GEN4(overlay->dev))
765 regs->OCONFIG |= OCONF_CSC_MODE_BT709; 796 regs->OCONFIG |= OCONF_CSC_MODE_BT709;
766 regs->OCONFIG |= overlay->crtc->pipe == 0 ? 797 regs->OCONFIG |= overlay->crtc->pipe == 0 ?
767 OCONF_PIPE_A : OCONF_PIPE_B; 798 OCONF_PIPE_A : OCONF_PIPE_B;
768 intel_overlay_unmap_regs_atomic(overlay); 799 intel_overlay_unmap_regs(overlay, regs);
769 800
770 ret = intel_overlay_on(overlay); 801 ret = intel_overlay_on(overlay);
771 if (ret != 0) 802 if (ret != 0)
772 goto out_unpin; 803 goto out_unpin;
773 } 804 }
774 805
775 regs = intel_overlay_map_regs_atomic(overlay); 806 regs = intel_overlay_map_regs(overlay);
776 if (!regs) { 807 if (!regs) {
777 ret = -ENOMEM; 808 ret = -ENOMEM;
778 goto out_unpin; 809 goto out_unpin;
@@ -788,9 +819,9 @@ int intel_overlay_do_put_image(struct intel_overlay *overlay,
788 819
789 regs->SWIDTH = params->src_w; 820 regs->SWIDTH = params->src_w;
790 regs->SWIDTHSW = calc_swidthsw(overlay->dev, 821 regs->SWIDTHSW = calc_swidthsw(overlay->dev,
791 params->offset_Y, tmp_width); 822 params->offset_Y, tmp_width);
792 regs->SHEIGHT = params->src_h; 823 regs->SHEIGHT = params->src_h;
793 regs->OBUF_0Y = bo_priv->gtt_offset + params-> offset_Y; 824 regs->OBUF_0Y = new_bo->gtt_offset + params-> offset_Y;
794 regs->OSTRIDE = params->stride_Y; 825 regs->OSTRIDE = params->stride_Y;
795 826
796 if (params->format & I915_OVERLAY_YUV_PLANAR) { 827 if (params->format & I915_OVERLAY_YUV_PLANAR) {
@@ -799,13 +830,13 @@ int intel_overlay_do_put_image(struct intel_overlay *overlay,
799 u32 tmp_U, tmp_V; 830 u32 tmp_U, tmp_V;
800 regs->SWIDTH |= (params->src_w/uv_hscale) << 16; 831 regs->SWIDTH |= (params->src_w/uv_hscale) << 16;
801 tmp_U = calc_swidthsw(overlay->dev, params->offset_U, 832 tmp_U = calc_swidthsw(overlay->dev, params->offset_U,
802 params->src_w/uv_hscale); 833 params->src_w/uv_hscale);
803 tmp_V = calc_swidthsw(overlay->dev, params->offset_V, 834 tmp_V = calc_swidthsw(overlay->dev, params->offset_V,
804 params->src_w/uv_hscale); 835 params->src_w/uv_hscale);
805 regs->SWIDTHSW |= max_t(u32, tmp_U, tmp_V) << 16; 836 regs->SWIDTHSW |= max_t(u32, tmp_U, tmp_V) << 16;
806 regs->SHEIGHT |= (params->src_h/uv_vscale) << 16; 837 regs->SHEIGHT |= (params->src_h/uv_vscale) << 16;
807 regs->OBUF_0U = bo_priv->gtt_offset + params->offset_U; 838 regs->OBUF_0U = new_bo->gtt_offset + params->offset_U;
808 regs->OBUF_0V = bo_priv->gtt_offset + params->offset_V; 839 regs->OBUF_0V = new_bo->gtt_offset + params->offset_V;
809 regs->OSTRIDE |= params->stride_UV << 16; 840 regs->OSTRIDE |= params->stride_UV << 16;
810 } 841 }
811 842
@@ -815,12 +846,14 @@ int intel_overlay_do_put_image(struct intel_overlay *overlay,
815 846
816 regs->OCMD = overlay_cmd_reg(params); 847 regs->OCMD = overlay_cmd_reg(params);
817 848
818 intel_overlay_unmap_regs_atomic(overlay); 849 intel_overlay_unmap_regs(overlay, regs);
819 850
820 intel_overlay_continue(overlay, scale_changed); 851 ret = intel_overlay_continue(overlay, scale_changed);
852 if (ret)
853 goto out_unpin;
821 854
822 overlay->old_vid_bo = overlay->vid_bo; 855 overlay->old_vid_bo = overlay->vid_bo;
823 overlay->vid_bo = to_intel_bo(new_bo); 856 overlay->vid_bo = new_bo;
824 857
825 return 0; 858 return 0;
826 859
@@ -831,18 +864,16 @@ out_unpin:
831 864
832int intel_overlay_switch_off(struct intel_overlay *overlay) 865int intel_overlay_switch_off(struct intel_overlay *overlay)
833{ 866{
834 int ret;
835 struct overlay_registers *regs; 867 struct overlay_registers *regs;
836 struct drm_device *dev = overlay->dev; 868 struct drm_device *dev = overlay->dev;
869 int ret;
837 870
838 BUG_ON(!mutex_is_locked(&dev->struct_mutex)); 871 BUG_ON(!mutex_is_locked(&dev->struct_mutex));
839 BUG_ON(!mutex_is_locked(&dev->mode_config.mutex)); 872 BUG_ON(!mutex_is_locked(&dev->mode_config.mutex));
840 873
841 if (overlay->hw_wedged) { 874 ret = intel_overlay_recover_from_interrupt(overlay);
842 ret = intel_overlay_recover_from_interrupt(overlay, 1); 875 if (ret != 0)
843 if (ret != 0) 876 return ret;
844 return ret;
845 }
846 877
847 if (!overlay->active) 878 if (!overlay->active)
848 return 0; 879 return 0;
@@ -851,33 +882,29 @@ int intel_overlay_switch_off(struct intel_overlay *overlay)
851 if (ret != 0) 882 if (ret != 0)
852 return ret; 883 return ret;
853 884
854 regs = intel_overlay_map_regs_atomic(overlay); 885 regs = intel_overlay_map_regs(overlay);
855 regs->OCMD = 0; 886 regs->OCMD = 0;
856 intel_overlay_unmap_regs_atomic(overlay); 887 intel_overlay_unmap_regs(overlay, regs);
857 888
858 ret = intel_overlay_off(overlay); 889 ret = intel_overlay_off(overlay);
859 if (ret != 0) 890 if (ret != 0)
860 return ret; 891 return ret;
861 892
862 intel_overlay_off_tail(overlay); 893 intel_overlay_off_tail(overlay);
863
864 return 0; 894 return 0;
865} 895}
866 896
867static int check_overlay_possible_on_crtc(struct intel_overlay *overlay, 897static int check_overlay_possible_on_crtc(struct intel_overlay *overlay,
868 struct intel_crtc *crtc) 898 struct intel_crtc *crtc)
869{ 899{
870 drm_i915_private_t *dev_priv = overlay->dev->dev_private; 900 drm_i915_private_t *dev_priv = overlay->dev->dev_private;
871 u32 pipeconf;
872 int pipeconf_reg = (crtc->pipe == 0) ? PIPEACONF : PIPEBCONF;
873 901
874 if (!crtc->base.enabled || crtc->dpms_mode != DRM_MODE_DPMS_ON) 902 if (!crtc->active)
875 return -EINVAL; 903 return -EINVAL;
876 904
877 pipeconf = I915_READ(pipeconf_reg);
878
879 /* can't use the overlay with double wide pipe */ 905 /* can't use the overlay with double wide pipe */
880 if (!IS_I965G(overlay->dev) && pipeconf & PIPEACONF_DOUBLE_WIDE) 906 if (INTEL_INFO(overlay->dev)->gen < 4 &&
907 (I915_READ(PIPECONF(crtc->pipe)) & (PIPECONF_DOUBLE_WIDE | PIPECONF_ENABLE)) != PIPECONF_ENABLE)
881 return -EINVAL; 908 return -EINVAL;
882 909
883 return 0; 910 return 0;
@@ -886,20 +913,22 @@ static int check_overlay_possible_on_crtc(struct intel_overlay *overlay,
886static void update_pfit_vscale_ratio(struct intel_overlay *overlay) 913static void update_pfit_vscale_ratio(struct intel_overlay *overlay)
887{ 914{
888 struct drm_device *dev = overlay->dev; 915 struct drm_device *dev = overlay->dev;
889 drm_i915_private_t *dev_priv = dev->dev_private; 916 drm_i915_private_t *dev_priv = dev->dev_private;
890 u32 ratio;
891 u32 pfit_control = I915_READ(PFIT_CONTROL); 917 u32 pfit_control = I915_READ(PFIT_CONTROL);
918 u32 ratio;
892 919
893 /* XXX: This is not the same logic as in the xorg driver, but more in 920 /* XXX: This is not the same logic as in the xorg driver, but more in
894 * line with the intel documentation for the i965 */ 921 * line with the intel documentation for the i965
895 if (!IS_I965G(dev) && (pfit_control & VERT_AUTO_SCALE)) { 922 */
896 ratio = I915_READ(PFIT_AUTO_RATIOS) >> PFIT_VERT_SCALE_SHIFT; 923 if (INTEL_INFO(dev)->gen >= 4) {
897 } else { /* on i965 use the PGM reg to read out the autoscaler values */ 924 /* on i965 use the PGM reg to read out the autoscaler values */
898 ratio = I915_READ(PFIT_PGM_RATIOS); 925 ratio = I915_READ(PFIT_PGM_RATIOS) >> PFIT_VERT_SCALE_SHIFT_965;
899 if (IS_I965G(dev)) 926 } else {
900 ratio >>= PFIT_VERT_SCALE_SHIFT_965; 927 if (pfit_control & VERT_AUTO_SCALE)
928 ratio = I915_READ(PFIT_AUTO_RATIOS);
901 else 929 else
902 ratio >>= PFIT_VERT_SCALE_SHIFT; 930 ratio = I915_READ(PFIT_PGM_RATIOS);
931 ratio >>= PFIT_VERT_SCALE_SHIFT;
903 } 932 }
904 933
905 overlay->pfit_vscale_ratio = ratio; 934 overlay->pfit_vscale_ratio = ratio;
@@ -910,12 +939,10 @@ static int check_overlay_dst(struct intel_overlay *overlay,
910{ 939{
911 struct drm_display_mode *mode = &overlay->crtc->base.mode; 940 struct drm_display_mode *mode = &overlay->crtc->base.mode;
912 941
913 if ((rec->dst_x < mode->crtc_hdisplay) 942 if (rec->dst_x < mode->crtc_hdisplay &&
914 && (rec->dst_x + rec->dst_width 943 rec->dst_x + rec->dst_width <= mode->crtc_hdisplay &&
915 <= mode->crtc_hdisplay) 944 rec->dst_y < mode->crtc_vdisplay &&
916 && (rec->dst_y < mode->crtc_vdisplay) 945 rec->dst_y + rec->dst_height <= mode->crtc_vdisplay)
917 && (rec->dst_y + rec->dst_height
918 <= mode->crtc_vdisplay))
919 return 0; 946 return 0;
920 else 947 else
921 return -EINVAL; 948 return -EINVAL;
@@ -938,55 +965,61 @@ static int check_overlay_scaling(struct put_image_params *rec)
938 965
939static int check_overlay_src(struct drm_device *dev, 966static int check_overlay_src(struct drm_device *dev,
940 struct drm_intel_overlay_put_image *rec, 967 struct drm_intel_overlay_put_image *rec,
941 struct drm_gem_object *new_bo) 968 struct drm_i915_gem_object *new_bo)
942{ 969{
943 u32 stride_mask;
944 int depth;
945 int uv_hscale = uv_hsubsampling(rec->flags); 970 int uv_hscale = uv_hsubsampling(rec->flags);
946 int uv_vscale = uv_vsubsampling(rec->flags); 971 int uv_vscale = uv_vsubsampling(rec->flags);
947 size_t tmp; 972 u32 stride_mask;
973 int depth;
974 u32 tmp;
948 975
949 /* check src dimensions */ 976 /* check src dimensions */
950 if (IS_845G(dev) || IS_I830(dev)) { 977 if (IS_845G(dev) || IS_I830(dev)) {
951 if (rec->src_height > IMAGE_MAX_HEIGHT_LEGACY 978 if (rec->src_height > IMAGE_MAX_HEIGHT_LEGACY ||
952 || rec->src_width > IMAGE_MAX_WIDTH_LEGACY) 979 rec->src_width > IMAGE_MAX_WIDTH_LEGACY)
953 return -EINVAL; 980 return -EINVAL;
954 } else { 981 } else {
955 if (rec->src_height > IMAGE_MAX_HEIGHT 982 if (rec->src_height > IMAGE_MAX_HEIGHT ||
956 || rec->src_width > IMAGE_MAX_WIDTH) 983 rec->src_width > IMAGE_MAX_WIDTH)
957 return -EINVAL; 984 return -EINVAL;
958 } 985 }
986
959 /* better safe than sorry, use 4 as the maximal subsampling ratio */ 987 /* better safe than sorry, use 4 as the maximal subsampling ratio */
960 if (rec->src_height < N_VERT_Y_TAPS*4 988 if (rec->src_height < N_VERT_Y_TAPS*4 ||
961 || rec->src_width < N_HORIZ_Y_TAPS*4) 989 rec->src_width < N_HORIZ_Y_TAPS*4)
962 return -EINVAL; 990 return -EINVAL;
963 991
964 /* check alignment constraints */ 992 /* check alignment constraints */
965 switch (rec->flags & I915_OVERLAY_TYPE_MASK) { 993 switch (rec->flags & I915_OVERLAY_TYPE_MASK) {
966 case I915_OVERLAY_RGB: 994 case I915_OVERLAY_RGB:
967 /* not implemented */ 995 /* not implemented */
996 return -EINVAL;
997
998 case I915_OVERLAY_YUV_PACKED:
999 if (uv_vscale != 1)
968 return -EINVAL; 1000 return -EINVAL;
969 case I915_OVERLAY_YUV_PACKED: 1001
970 depth = packed_depth_bytes(rec->flags); 1002 depth = packed_depth_bytes(rec->flags);
971 if (uv_vscale != 1) 1003 if (depth < 0)
972 return -EINVAL; 1004 return depth;
973 if (depth < 0) 1005
974 return depth; 1006 /* ignore UV planes */
975 /* ignore UV planes */ 1007 rec->stride_UV = 0;
976 rec->stride_UV = 0; 1008 rec->offset_U = 0;
977 rec->offset_U = 0; 1009 rec->offset_V = 0;
978 rec->offset_V = 0; 1010 /* check pixel alignment */
979 /* check pixel alignment */ 1011 if (rec->offset_Y % depth)
980 if (rec->offset_Y % depth)
981 return -EINVAL;
982 break;
983 case I915_OVERLAY_YUV_PLANAR:
984 if (uv_vscale < 0 || uv_hscale < 0)
985 return -EINVAL;
986 /* no offset restrictions for planar formats */
987 break;
988 default:
989 return -EINVAL; 1012 return -EINVAL;
1013 break;
1014
1015 case I915_OVERLAY_YUV_PLANAR:
1016 if (uv_vscale < 0 || uv_hscale < 0)
1017 return -EINVAL;
1018 /* no offset restrictions for planar formats */
1019 break;
1020
1021 default:
1022 return -EINVAL;
990 } 1023 }
991 1024
992 if (rec->src_width % uv_hscale) 1025 if (rec->src_width % uv_hscale)
@@ -1000,47 +1033,74 @@ static int check_overlay_src(struct drm_device *dev,
1000 1033
1001 if (rec->stride_Y & stride_mask || rec->stride_UV & stride_mask) 1034 if (rec->stride_Y & stride_mask || rec->stride_UV & stride_mask)
1002 return -EINVAL; 1035 return -EINVAL;
1003 if (IS_I965G(dev) && rec->stride_Y < 512) 1036 if (IS_GEN4(dev) && rec->stride_Y < 512)
1004 return -EINVAL; 1037 return -EINVAL;
1005 1038
1006 tmp = (rec->flags & I915_OVERLAY_TYPE_MASK) == I915_OVERLAY_YUV_PLANAR ? 1039 tmp = (rec->flags & I915_OVERLAY_TYPE_MASK) == I915_OVERLAY_YUV_PLANAR ?
1007 4 : 8; 1040 4096 : 8192;
1008 if (rec->stride_Y > tmp*1024 || rec->stride_UV > 2*1024) 1041 if (rec->stride_Y > tmp || rec->stride_UV > 2*1024)
1009 return -EINVAL; 1042 return -EINVAL;
1010 1043
1011 /* check buffer dimensions */ 1044 /* check buffer dimensions */
1012 switch (rec->flags & I915_OVERLAY_TYPE_MASK) { 1045 switch (rec->flags & I915_OVERLAY_TYPE_MASK) {
1013 case I915_OVERLAY_RGB: 1046 case I915_OVERLAY_RGB:
1014 case I915_OVERLAY_YUV_PACKED: 1047 case I915_OVERLAY_YUV_PACKED:
1015 /* always 4 Y values per depth pixels */ 1048 /* always 4 Y values per depth pixels */
1016 if (packed_width_bytes(rec->flags, rec->src_width) 1049 if (packed_width_bytes(rec->flags, rec->src_width) > rec->stride_Y)
1017 > rec->stride_Y) 1050 return -EINVAL;
1018 return -EINVAL; 1051
1019 1052 tmp = rec->stride_Y*rec->src_height;
1020 tmp = rec->stride_Y*rec->src_height; 1053 if (rec->offset_Y + tmp > new_bo->base.size)
1021 if (rec->offset_Y + tmp > new_bo->size) 1054 return -EINVAL;
1022 return -EINVAL; 1055 break;
1023 break; 1056
1024 case I915_OVERLAY_YUV_PLANAR: 1057 case I915_OVERLAY_YUV_PLANAR:
1025 if (rec->src_width > rec->stride_Y) 1058 if (rec->src_width > rec->stride_Y)
1026 return -EINVAL; 1059 return -EINVAL;
1027 if (rec->src_width/uv_hscale > rec->stride_UV) 1060 if (rec->src_width/uv_hscale > rec->stride_UV)
1028 return -EINVAL; 1061 return -EINVAL;
1029 1062
1030 tmp = rec->stride_Y*rec->src_height; 1063 tmp = rec->stride_Y * rec->src_height;
1031 if (rec->offset_Y + tmp > new_bo->size) 1064 if (rec->offset_Y + tmp > new_bo->base.size)
1032 return -EINVAL; 1065 return -EINVAL;
1033 tmp = rec->stride_UV*rec->src_height; 1066
1034 tmp /= uv_vscale; 1067 tmp = rec->stride_UV * (rec->src_height / uv_vscale);
1035 if (rec->offset_U + tmp > new_bo->size 1068 if (rec->offset_U + tmp > new_bo->base.size ||
1036 || rec->offset_V + tmp > new_bo->size) 1069 rec->offset_V + tmp > new_bo->base.size)
1037 return -EINVAL; 1070 return -EINVAL;
1038 break; 1071 break;
1039 } 1072 }
1040 1073
1041 return 0; 1074 return 0;
1042} 1075}
1043 1076
1077/**
1078 * Return the pipe currently connected to the panel fitter,
1079 * or -1 if the panel fitter is not present or not in use
1080 */
1081static int intel_panel_fitter_pipe(struct drm_device *dev)
1082{
1083 struct drm_i915_private *dev_priv = dev->dev_private;
1084 u32 pfit_control;
1085
1086 /* i830 doesn't have a panel fitter */
1087 if (IS_I830(dev))
1088 return -1;
1089
1090 pfit_control = I915_READ(PFIT_CONTROL);
1091
1092 /* See if the panel fitter is in use */
1093 if ((pfit_control & PFIT_ENABLE) == 0)
1094 return -1;
1095
1096 /* 965 can place panel fitter on either pipe */
1097 if (IS_GEN4(dev))
1098 return (pfit_control >> 29) & 0x3;
1099
1100 /* older chips can only use pipe 1 */
1101 return 1;
1102}
1103
1044int intel_overlay_put_image(struct drm_device *dev, void *data, 1104int intel_overlay_put_image(struct drm_device *dev, void *data,
1045 struct drm_file *file_priv) 1105 struct drm_file *file_priv)
1046{ 1106{
@@ -1049,7 +1109,7 @@ int intel_overlay_put_image(struct drm_device *dev, void *data,
1049 struct intel_overlay *overlay; 1109 struct intel_overlay *overlay;
1050 struct drm_mode_object *drmmode_obj; 1110 struct drm_mode_object *drmmode_obj;
1051 struct intel_crtc *crtc; 1111 struct intel_crtc *crtc;
1052 struct drm_gem_object *new_bo; 1112 struct drm_i915_gem_object *new_bo;
1053 struct put_image_params *params; 1113 struct put_image_params *params;
1054 int ret; 1114 int ret;
1055 1115
@@ -1081,16 +1141,16 @@ int intel_overlay_put_image(struct drm_device *dev, void *data,
1081 return -ENOMEM; 1141 return -ENOMEM;
1082 1142
1083 drmmode_obj = drm_mode_object_find(dev, put_image_rec->crtc_id, 1143 drmmode_obj = drm_mode_object_find(dev, put_image_rec->crtc_id,
1084 DRM_MODE_OBJECT_CRTC); 1144 DRM_MODE_OBJECT_CRTC);
1085 if (!drmmode_obj) { 1145 if (!drmmode_obj) {
1086 ret = -ENOENT; 1146 ret = -ENOENT;
1087 goto out_free; 1147 goto out_free;
1088 } 1148 }
1089 crtc = to_intel_crtc(obj_to_crtc(drmmode_obj)); 1149 crtc = to_intel_crtc(obj_to_crtc(drmmode_obj));
1090 1150
1091 new_bo = drm_gem_object_lookup(dev, file_priv, 1151 new_bo = to_intel_bo(drm_gem_object_lookup(dev, file_priv,
1092 put_image_rec->bo_handle); 1152 put_image_rec->bo_handle));
1093 if (!new_bo) { 1153 if (&new_bo->base == NULL) {
1094 ret = -ENOENT; 1154 ret = -ENOENT;
1095 goto out_free; 1155 goto out_free;
1096 } 1156 }
@@ -1098,12 +1158,16 @@ int intel_overlay_put_image(struct drm_device *dev, void *data,
1098 mutex_lock(&dev->mode_config.mutex); 1158 mutex_lock(&dev->mode_config.mutex);
1099 mutex_lock(&dev->struct_mutex); 1159 mutex_lock(&dev->struct_mutex);
1100 1160
1101 if (overlay->hw_wedged) { 1161 if (new_bo->tiling_mode) {
1102 ret = intel_overlay_recover_from_interrupt(overlay, 1); 1162 DRM_ERROR("buffer used for overlay image can not be tiled\n");
1103 if (ret != 0) 1163 ret = -EINVAL;
1104 goto out_unlock; 1164 goto out_unlock;
1105 } 1165 }
1106 1166
1167 ret = intel_overlay_recover_from_interrupt(overlay);
1168 if (ret != 0)
1169 goto out_unlock;
1170
1107 if (overlay->crtc != crtc) { 1171 if (overlay->crtc != crtc) {
1108 struct drm_display_mode *mode = &crtc->base.mode; 1172 struct drm_display_mode *mode = &crtc->base.mode;
1109 ret = intel_overlay_switch_off(overlay); 1173 ret = intel_overlay_switch_off(overlay);
@@ -1117,9 +1181,9 @@ int intel_overlay_put_image(struct drm_device *dev, void *data,
1117 overlay->crtc = crtc; 1181 overlay->crtc = crtc;
1118 crtc->overlay = overlay; 1182 crtc->overlay = overlay;
1119 1183
1120 if (intel_panel_fitter_pipe(dev) == crtc->pipe 1184 /* line too wide, i.e. one-line-mode */
1121 /* and line to wide, i.e. one-line-mode */ 1185 if (mode->hdisplay > 1024 &&
1122 && mode->hdisplay > 1024) { 1186 intel_panel_fitter_pipe(dev) == crtc->pipe) {
1123 overlay->pfit_active = 1; 1187 overlay->pfit_active = 1;
1124 update_pfit_vscale_ratio(overlay); 1188 update_pfit_vscale_ratio(overlay);
1125 } else 1189 } else
@@ -1132,10 +1196,10 @@ int intel_overlay_put_image(struct drm_device *dev, void *data,
1132 1196
1133 if (overlay->pfit_active) { 1197 if (overlay->pfit_active) {
1134 params->dst_y = ((((u32)put_image_rec->dst_y) << 12) / 1198 params->dst_y = ((((u32)put_image_rec->dst_y) << 12) /
1135 overlay->pfit_vscale_ratio); 1199 overlay->pfit_vscale_ratio);
1136 /* shifting right rounds downwards, so add 1 */ 1200 /* shifting right rounds downwards, so add 1 */
1137 params->dst_h = ((((u32)put_image_rec->dst_height) << 12) / 1201 params->dst_h = ((((u32)put_image_rec->dst_height) << 12) /
1138 overlay->pfit_vscale_ratio) + 1; 1202 overlay->pfit_vscale_ratio) + 1;
1139 } else { 1203 } else {
1140 params->dst_y = put_image_rec->dst_y; 1204 params->dst_y = put_image_rec->dst_y;
1141 params->dst_h = put_image_rec->dst_height; 1205 params->dst_h = put_image_rec->dst_height;
@@ -1147,8 +1211,8 @@ int intel_overlay_put_image(struct drm_device *dev, void *data,
1147 params->src_h = put_image_rec->src_height; 1211 params->src_h = put_image_rec->src_height;
1148 params->src_scan_w = put_image_rec->src_scan_width; 1212 params->src_scan_w = put_image_rec->src_scan_width;
1149 params->src_scan_h = put_image_rec->src_scan_height; 1213 params->src_scan_h = put_image_rec->src_scan_height;
1150 if (params->src_scan_h > params->src_h 1214 if (params->src_scan_h > params->src_h ||
1151 || params->src_scan_w > params->src_w) { 1215 params->src_scan_w > params->src_w) {
1152 ret = -EINVAL; 1216 ret = -EINVAL;
1153 goto out_unlock; 1217 goto out_unlock;
1154 } 1218 }
@@ -1182,7 +1246,7 @@ int intel_overlay_put_image(struct drm_device *dev, void *data,
1182out_unlock: 1246out_unlock:
1183 mutex_unlock(&dev->struct_mutex); 1247 mutex_unlock(&dev->struct_mutex);
1184 mutex_unlock(&dev->mode_config.mutex); 1248 mutex_unlock(&dev->mode_config.mutex);
1185 drm_gem_object_unreference_unlocked(new_bo); 1249 drm_gem_object_unreference_unlocked(&new_bo->base);
1186out_free: 1250out_free:
1187 kfree(params); 1251 kfree(params);
1188 1252
@@ -1204,7 +1268,7 @@ static bool check_gamma_bounds(u32 gamma1, u32 gamma2)
1204 return false; 1268 return false;
1205 1269
1206 for (i = 0; i < 3; i++) { 1270 for (i = 0; i < 3; i++) {
1207 if (((gamma1 >> i * 8) & 0xff) >= ((gamma2 >> i*8) & 0xff)) 1271 if (((gamma1 >> i*8) & 0xff) >= ((gamma2 >> i*8) & 0xff))
1208 return false; 1272 return false;
1209 } 1273 }
1210 1274
@@ -1225,16 +1289,18 @@ static bool check_gamma5_errata(u32 gamma5)
1225 1289
1226static int check_gamma(struct drm_intel_overlay_attrs *attrs) 1290static int check_gamma(struct drm_intel_overlay_attrs *attrs)
1227{ 1291{
1228 if (!check_gamma_bounds(0, attrs->gamma0) 1292 if (!check_gamma_bounds(0, attrs->gamma0) ||
1229 || !check_gamma_bounds(attrs->gamma0, attrs->gamma1) 1293 !check_gamma_bounds(attrs->gamma0, attrs->gamma1) ||
1230 || !check_gamma_bounds(attrs->gamma1, attrs->gamma2) 1294 !check_gamma_bounds(attrs->gamma1, attrs->gamma2) ||
1231 || !check_gamma_bounds(attrs->gamma2, attrs->gamma3) 1295 !check_gamma_bounds(attrs->gamma2, attrs->gamma3) ||
1232 || !check_gamma_bounds(attrs->gamma3, attrs->gamma4) 1296 !check_gamma_bounds(attrs->gamma3, attrs->gamma4) ||
1233 || !check_gamma_bounds(attrs->gamma4, attrs->gamma5) 1297 !check_gamma_bounds(attrs->gamma4, attrs->gamma5) ||
1234 || !check_gamma_bounds(attrs->gamma5, 0x00ffffff)) 1298 !check_gamma_bounds(attrs->gamma5, 0x00ffffff))
1235 return -EINVAL; 1299 return -EINVAL;
1300
1236 if (!check_gamma5_errata(attrs->gamma5)) 1301 if (!check_gamma5_errata(attrs->gamma5))
1237 return -EINVAL; 1302 return -EINVAL;
1303
1238 return 0; 1304 return 0;
1239} 1305}
1240 1306
@@ -1261,13 +1327,14 @@ int intel_overlay_attrs(struct drm_device *dev, void *data,
1261 mutex_lock(&dev->mode_config.mutex); 1327 mutex_lock(&dev->mode_config.mutex);
1262 mutex_lock(&dev->struct_mutex); 1328 mutex_lock(&dev->struct_mutex);
1263 1329
1330 ret = -EINVAL;
1264 if (!(attrs->flags & I915_OVERLAY_UPDATE_ATTRS)) { 1331 if (!(attrs->flags & I915_OVERLAY_UPDATE_ATTRS)) {
1265 attrs->color_key = overlay->color_key; 1332 attrs->color_key = overlay->color_key;
1266 attrs->brightness = overlay->brightness; 1333 attrs->brightness = overlay->brightness;
1267 attrs->contrast = overlay->contrast; 1334 attrs->contrast = overlay->contrast;
1268 attrs->saturation = overlay->saturation; 1335 attrs->saturation = overlay->saturation;
1269 1336
1270 if (IS_I9XX(dev)) { 1337 if (!IS_GEN2(dev)) {
1271 attrs->gamma0 = I915_READ(OGAMC0); 1338 attrs->gamma0 = I915_READ(OGAMC0);
1272 attrs->gamma1 = I915_READ(OGAMC1); 1339 attrs->gamma1 = I915_READ(OGAMC1);
1273 attrs->gamma2 = I915_READ(OGAMC2); 1340 attrs->gamma2 = I915_READ(OGAMC2);
@@ -1275,29 +1342,20 @@ int intel_overlay_attrs(struct drm_device *dev, void *data,
1275 attrs->gamma4 = I915_READ(OGAMC4); 1342 attrs->gamma4 = I915_READ(OGAMC4);
1276 attrs->gamma5 = I915_READ(OGAMC5); 1343 attrs->gamma5 = I915_READ(OGAMC5);
1277 } 1344 }
1278 ret = 0;
1279 } else { 1345 } else {
1280 overlay->color_key = attrs->color_key; 1346 if (attrs->brightness < -128 || attrs->brightness > 127)
1281 if (attrs->brightness >= -128 && attrs->brightness <= 127) {
1282 overlay->brightness = attrs->brightness;
1283 } else {
1284 ret = -EINVAL;
1285 goto out_unlock; 1347 goto out_unlock;
1286 } 1348 if (attrs->contrast > 255)
1287 if (attrs->contrast <= 255) {
1288 overlay->contrast = attrs->contrast;
1289 } else {
1290 ret = -EINVAL;
1291 goto out_unlock; 1349 goto out_unlock;
1292 } 1350 if (attrs->saturation > 1023)
1293 if (attrs->saturation <= 1023) {
1294 overlay->saturation = attrs->saturation;
1295 } else {
1296 ret = -EINVAL;
1297 goto out_unlock; 1351 goto out_unlock;
1298 }
1299 1352
1300 regs = intel_overlay_map_regs_atomic(overlay); 1353 overlay->color_key = attrs->color_key;
1354 overlay->brightness = attrs->brightness;
1355 overlay->contrast = attrs->contrast;
1356 overlay->saturation = attrs->saturation;
1357
1358 regs = intel_overlay_map_regs(overlay);
1301 if (!regs) { 1359 if (!regs) {
1302 ret = -ENOMEM; 1360 ret = -ENOMEM;
1303 goto out_unlock; 1361 goto out_unlock;
@@ -1305,13 +1363,11 @@ int intel_overlay_attrs(struct drm_device *dev, void *data,
1305 1363
1306 update_reg_attrs(overlay, regs); 1364 update_reg_attrs(overlay, regs);
1307 1365
1308 intel_overlay_unmap_regs_atomic(overlay); 1366 intel_overlay_unmap_regs(overlay, regs);
1309 1367
1310 if (attrs->flags & I915_OVERLAY_UPDATE_GAMMA) { 1368 if (attrs->flags & I915_OVERLAY_UPDATE_GAMMA) {
1311 if (!IS_I9XX(dev)) { 1369 if (IS_GEN2(dev))
1312 ret = -EINVAL;
1313 goto out_unlock; 1370 goto out_unlock;
1314 }
1315 1371
1316 if (overlay->active) { 1372 if (overlay->active) {
1317 ret = -EBUSY; 1373 ret = -EBUSY;
@@ -1319,7 +1375,7 @@ int intel_overlay_attrs(struct drm_device *dev, void *data,
1319 } 1375 }
1320 1376
1321 ret = check_gamma(attrs); 1377 ret = check_gamma(attrs);
1322 if (ret != 0) 1378 if (ret)
1323 goto out_unlock; 1379 goto out_unlock;
1324 1380
1325 I915_WRITE(OGAMC0, attrs->gamma0); 1381 I915_WRITE(OGAMC0, attrs->gamma0);
@@ -1329,9 +1385,9 @@ int intel_overlay_attrs(struct drm_device *dev, void *data,
1329 I915_WRITE(OGAMC4, attrs->gamma4); 1385 I915_WRITE(OGAMC4, attrs->gamma4);
1330 I915_WRITE(OGAMC5, attrs->gamma5); 1386 I915_WRITE(OGAMC5, attrs->gamma5);
1331 } 1387 }
1332 ret = 0;
1333 } 1388 }
1334 1389
1390 ret = 0;
1335out_unlock: 1391out_unlock:
1336 mutex_unlock(&dev->struct_mutex); 1392 mutex_unlock(&dev->struct_mutex);
1337 mutex_unlock(&dev->mode_config.mutex); 1393 mutex_unlock(&dev->mode_config.mutex);
@@ -1343,39 +1399,50 @@ void intel_setup_overlay(struct drm_device *dev)
1343{ 1399{
1344 drm_i915_private_t *dev_priv = dev->dev_private; 1400 drm_i915_private_t *dev_priv = dev->dev_private;
1345 struct intel_overlay *overlay; 1401 struct intel_overlay *overlay;
1346 struct drm_gem_object *reg_bo; 1402 struct drm_i915_gem_object *reg_bo;
1347 struct overlay_registers *regs; 1403 struct overlay_registers *regs;
1348 int ret; 1404 int ret;
1349 1405
1350 if (!OVERLAY_EXISTS(dev)) 1406 if (!HAS_OVERLAY(dev))
1351 return; 1407 return;
1352 1408
1353 overlay = kzalloc(sizeof(struct intel_overlay), GFP_KERNEL); 1409 overlay = kzalloc(sizeof(struct intel_overlay), GFP_KERNEL);
1354 if (!overlay) 1410 if (!overlay)
1355 return; 1411 return;
1412
1413 mutex_lock(&dev->struct_mutex);
1414 if (WARN_ON(dev_priv->overlay))
1415 goto out_free;
1416
1356 overlay->dev = dev; 1417 overlay->dev = dev;
1357 1418
1358 reg_bo = i915_gem_alloc_object(dev, PAGE_SIZE); 1419 reg_bo = i915_gem_alloc_object(dev, PAGE_SIZE);
1359 if (!reg_bo) 1420 if (!reg_bo)
1360 goto out_free; 1421 goto out_free;
1361 overlay->reg_bo = to_intel_bo(reg_bo); 1422 overlay->reg_bo = reg_bo;
1362 1423
1363 if (OVERLAY_NONPHYSICAL(dev)) { 1424 if (OVERLAY_NEEDS_PHYSICAL(dev)) {
1364 ret = i915_gem_object_pin(reg_bo, PAGE_SIZE);
1365 if (ret) {
1366 DRM_ERROR("failed to pin overlay register bo\n");
1367 goto out_free_bo;
1368 }
1369 overlay->flip_addr = overlay->reg_bo->gtt_offset;
1370 } else {
1371 ret = i915_gem_attach_phys_object(dev, reg_bo, 1425 ret = i915_gem_attach_phys_object(dev, reg_bo,
1372 I915_GEM_PHYS_OVERLAY_REGS, 1426 I915_GEM_PHYS_OVERLAY_REGS,
1373 0); 1427 PAGE_SIZE);
1374 if (ret) { 1428 if (ret) {
1375 DRM_ERROR("failed to attach phys overlay regs\n"); 1429 DRM_ERROR("failed to attach phys overlay regs\n");
1376 goto out_free_bo; 1430 goto out_free_bo;
1377 } 1431 }
1378 overlay->flip_addr = overlay->reg_bo->phys_obj->handle->busaddr; 1432 overlay->flip_addr = reg_bo->phys_obj->handle->busaddr;
1433 } else {
1434 ret = i915_gem_object_pin(reg_bo, PAGE_SIZE, true);
1435 if (ret) {
1436 DRM_ERROR("failed to pin overlay register bo\n");
1437 goto out_free_bo;
1438 }
1439 overlay->flip_addr = reg_bo->gtt_offset;
1440
1441 ret = i915_gem_object_set_to_gtt_domain(reg_bo, true);
1442 if (ret) {
1443 DRM_ERROR("failed to move overlay register bo into the GTT\n");
1444 goto out_unpin_bo;
1445 }
1379 } 1446 }
1380 1447
1381 /* init all values */ 1448 /* init all values */
@@ -1384,42 +1451,51 @@ void intel_setup_overlay(struct drm_device *dev)
1384 overlay->contrast = 75; 1451 overlay->contrast = 75;
1385 overlay->saturation = 146; 1452 overlay->saturation = 146;
1386 1453
1387 regs = intel_overlay_map_regs_atomic(overlay); 1454 regs = intel_overlay_map_regs(overlay);
1388 if (!regs) 1455 if (!regs)
1389 goto out_free_bo; 1456 goto out_unpin_bo;
1390 1457
1391 memset(regs, 0, sizeof(struct overlay_registers)); 1458 memset(regs, 0, sizeof(struct overlay_registers));
1392 update_polyphase_filter(regs); 1459 update_polyphase_filter(regs);
1393
1394 update_reg_attrs(overlay, regs); 1460 update_reg_attrs(overlay, regs);
1395 1461
1396 intel_overlay_unmap_regs_atomic(overlay); 1462 intel_overlay_unmap_regs(overlay, regs);
1397 1463
1398 dev_priv->overlay = overlay; 1464 dev_priv->overlay = overlay;
1465 mutex_unlock(&dev->struct_mutex);
1399 DRM_INFO("initialized overlay support\n"); 1466 DRM_INFO("initialized overlay support\n");
1400 return; 1467 return;
1401 1468
1469out_unpin_bo:
1470 if (!OVERLAY_NEEDS_PHYSICAL(dev))
1471 i915_gem_object_unpin(reg_bo);
1402out_free_bo: 1472out_free_bo:
1403 drm_gem_object_unreference(reg_bo); 1473 drm_gem_object_unreference(&reg_bo->base);
1404out_free: 1474out_free:
1475 mutex_unlock(&dev->struct_mutex);
1405 kfree(overlay); 1476 kfree(overlay);
1406 return; 1477 return;
1407} 1478}
1408 1479
1409void intel_cleanup_overlay(struct drm_device *dev) 1480void intel_cleanup_overlay(struct drm_device *dev)
1410{ 1481{
1411 drm_i915_private_t *dev_priv = dev->dev_private; 1482 drm_i915_private_t *dev_priv = dev->dev_private;
1412 1483
1413 if (dev_priv->overlay) { 1484 if (!dev_priv->overlay)
1414 /* The bo's should be free'd by the generic code already. 1485 return;
1415 * Furthermore modesetting teardown happens beforehand so the
1416 * hardware should be off already */
1417 BUG_ON(dev_priv->overlay->active);
1418 1486
1419 kfree(dev_priv->overlay); 1487 /* The bo's should be free'd by the generic code already.
1420 } 1488 * Furthermore modesetting teardown happens beforehand so the
1489 * hardware should be off already */
1490 BUG_ON(dev_priv->overlay->active);
1491
1492 drm_gem_object_unreference_unlocked(&dev_priv->overlay->reg_bo->base);
1493 kfree(dev_priv->overlay);
1421} 1494}
1422 1495
1496#ifdef CONFIG_DEBUG_FS
1497#include <linux/seq_file.h>
1498
1423struct intel_overlay_error_state { 1499struct intel_overlay_error_state {
1424 struct overlay_registers regs; 1500 struct overlay_registers regs;
1425 unsigned long base; 1501 unsigned long base;
@@ -1427,6 +1503,29 @@ struct intel_overlay_error_state {
1427 u32 isr; 1503 u32 isr;
1428}; 1504};
1429 1505
1506static struct overlay_registers *
1507intel_overlay_map_regs_atomic(struct intel_overlay *overlay)
1508{
1509 drm_i915_private_t *dev_priv = overlay->dev->dev_private;
1510 struct overlay_registers *regs;
1511
1512 if (OVERLAY_NEEDS_PHYSICAL(overlay->dev))
1513 regs = overlay->reg_bo->phys_obj->handle->vaddr;
1514 else
1515 regs = io_mapping_map_atomic_wc(dev_priv->mm.gtt_mapping,
1516 overlay->reg_bo->gtt_offset);
1517
1518 return regs;
1519}
1520
1521static void intel_overlay_unmap_regs_atomic(struct intel_overlay *overlay,
1522 struct overlay_registers *regs)
1523{
1524 if (!OVERLAY_NEEDS_PHYSICAL(overlay->dev))
1525 io_mapping_unmap_atomic(regs);
1526}
1527
1528
1430struct intel_overlay_error_state * 1529struct intel_overlay_error_state *
1431intel_overlay_capture_error_state(struct drm_device *dev) 1530intel_overlay_capture_error_state(struct drm_device *dev)
1432{ 1531{
@@ -1444,17 +1543,17 @@ intel_overlay_capture_error_state(struct drm_device *dev)
1444 1543
1445 error->dovsta = I915_READ(DOVSTA); 1544 error->dovsta = I915_READ(DOVSTA);
1446 error->isr = I915_READ(ISR); 1545 error->isr = I915_READ(ISR);
1447 if (OVERLAY_NONPHYSICAL(overlay->dev)) 1546 if (OVERLAY_NEEDS_PHYSICAL(overlay->dev))
1448 error->base = (long) overlay->reg_bo->gtt_offset;
1449 else
1450 error->base = (long) overlay->reg_bo->phys_obj->handle->vaddr; 1547 error->base = (long) overlay->reg_bo->phys_obj->handle->vaddr;
1548 else
1549 error->base = (long) overlay->reg_bo->gtt_offset;
1451 1550
1452 regs = intel_overlay_map_regs_atomic(overlay); 1551 regs = intel_overlay_map_regs_atomic(overlay);
1453 if (!regs) 1552 if (!regs)
1454 goto err; 1553 goto err;
1455 1554
1456 memcpy_fromio(&error->regs, regs, sizeof(struct overlay_registers)); 1555 memcpy_fromio(&error->regs, regs, sizeof(struct overlay_registers));
1457 intel_overlay_unmap_regs_atomic(overlay); 1556 intel_overlay_unmap_regs_atomic(overlay, regs);
1458 1557
1459 return error; 1558 return error;
1460 1559
@@ -1515,3 +1614,4 @@ intel_overlay_print_error_state(struct seq_file *m, struct intel_overlay_error_s
1515 P(UVSCALEV); 1614 P(UVSCALEV);
1516#undef P 1615#undef P
1517} 1616}
1617#endif
diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c
index e7f5299d9d57..a06ff07a4d3b 100644
--- a/drivers/gpu/drm/i915/intel_panel.c
+++ b/drivers/gpu/drm/i915/intel_panel.c
@@ -30,6 +30,8 @@
30 30
31#include "intel_drv.h" 31#include "intel_drv.h"
32 32
33#define PCI_LBPC 0xf4 /* legacy/combination backlight modes */
34
33void 35void
34intel_fixed_panel_mode(struct drm_display_mode *fixed_mode, 36intel_fixed_panel_mode(struct drm_display_mode *fixed_mode,
35 struct drm_display_mode *adjusted_mode) 37 struct drm_display_mode *adjusted_mode)
@@ -109,3 +111,197 @@ done:
109 dev_priv->pch_pf_pos = (x << 16) | y; 111 dev_priv->pch_pf_pos = (x << 16) | y;
110 dev_priv->pch_pf_size = (width << 16) | height; 112 dev_priv->pch_pf_size = (width << 16) | height;
111} 113}
114
115static int is_backlight_combination_mode(struct drm_device *dev)
116{
117 struct drm_i915_private *dev_priv = dev->dev_private;
118
119 if (INTEL_INFO(dev)->gen >= 4)
120 return I915_READ(BLC_PWM_CTL2) & BLM_COMBINATION_MODE;
121
122 if (IS_GEN2(dev))
123 return I915_READ(BLC_PWM_CTL) & BLM_LEGACY_MODE;
124
125 return 0;
126}
127
128static u32 i915_read_blc_pwm_ctl(struct drm_i915_private *dev_priv)
129{
130 u32 val;
131
132 /* Restore the CTL value if it lost, e.g. GPU reset */
133
134 if (HAS_PCH_SPLIT(dev_priv->dev)) {
135 val = I915_READ(BLC_PWM_PCH_CTL2);
136 if (dev_priv->saveBLC_PWM_CTL2 == 0) {
137 dev_priv->saveBLC_PWM_CTL2 = val;
138 } else if (val == 0) {
139 I915_WRITE(BLC_PWM_PCH_CTL2,
140 dev_priv->saveBLC_PWM_CTL);
141 val = dev_priv->saveBLC_PWM_CTL;
142 }
143 } else {
144 val = I915_READ(BLC_PWM_CTL);
145 if (dev_priv->saveBLC_PWM_CTL == 0) {
146 dev_priv->saveBLC_PWM_CTL = val;
147 dev_priv->saveBLC_PWM_CTL2 = I915_READ(BLC_PWM_CTL2);
148 } else if (val == 0) {
149 I915_WRITE(BLC_PWM_CTL,
150 dev_priv->saveBLC_PWM_CTL);
151 I915_WRITE(BLC_PWM_CTL2,
152 dev_priv->saveBLC_PWM_CTL2);
153 val = dev_priv->saveBLC_PWM_CTL;
154 }
155 }
156
157 return val;
158}
159
160u32 intel_panel_get_max_backlight(struct drm_device *dev)
161{
162 struct drm_i915_private *dev_priv = dev->dev_private;
163 u32 max;
164
165 max = i915_read_blc_pwm_ctl(dev_priv);
166 if (max == 0) {
167 /* XXX add code here to query mode clock or hardware clock
168 * and program max PWM appropriately.
169 */
170 printk_once(KERN_WARNING "fixme: max PWM is zero.\n");
171 return 1;
172 }
173
174 if (HAS_PCH_SPLIT(dev)) {
175 max >>= 16;
176 } else {
177 if (IS_PINEVIEW(dev)) {
178 max >>= 17;
179 } else {
180 max >>= 16;
181 if (INTEL_INFO(dev)->gen < 4)
182 max &= ~1;
183 }
184
185 if (is_backlight_combination_mode(dev))
186 max *= 0xff;
187 }
188
189 DRM_DEBUG_DRIVER("max backlight PWM = %d\n", max);
190 return max;
191}
192
193u32 intel_panel_get_backlight(struct drm_device *dev)
194{
195 struct drm_i915_private *dev_priv = dev->dev_private;
196 u32 val;
197
198 if (HAS_PCH_SPLIT(dev)) {
199 val = I915_READ(BLC_PWM_CPU_CTL) & BACKLIGHT_DUTY_CYCLE_MASK;
200 } else {
201 val = I915_READ(BLC_PWM_CTL) & BACKLIGHT_DUTY_CYCLE_MASK;
202 if (IS_PINEVIEW(dev))
203 val >>= 1;
204
205 if (is_backlight_combination_mode(dev)){
206 u8 lbpc;
207
208 val &= ~1;
209 pci_read_config_byte(dev->pdev, PCI_LBPC, &lbpc);
210 val *= lbpc;
211 }
212 }
213
214 DRM_DEBUG_DRIVER("get backlight PWM = %d\n", val);
215 return val;
216}
217
218static void intel_pch_panel_set_backlight(struct drm_device *dev, u32 level)
219{
220 struct drm_i915_private *dev_priv = dev->dev_private;
221 u32 val = I915_READ(BLC_PWM_CPU_CTL) & ~BACKLIGHT_DUTY_CYCLE_MASK;
222 I915_WRITE(BLC_PWM_CPU_CTL, val | level);
223}
224
225void intel_panel_set_backlight(struct drm_device *dev, u32 level)
226{
227 struct drm_i915_private *dev_priv = dev->dev_private;
228 u32 tmp;
229
230 DRM_DEBUG_DRIVER("set backlight PWM = %d\n", level);
231
232 if (HAS_PCH_SPLIT(dev))
233 return intel_pch_panel_set_backlight(dev, level);
234
235 if (is_backlight_combination_mode(dev)){
236 u32 max = intel_panel_get_max_backlight(dev);
237 u8 lbpc;
238
239 lbpc = level * 0xfe / max + 1;
240 level /= lbpc;
241 pci_write_config_byte(dev->pdev, PCI_LBPC, lbpc);
242 }
243
244 tmp = I915_READ(BLC_PWM_CTL);
245 if (IS_PINEVIEW(dev)) {
246 tmp &= ~(BACKLIGHT_DUTY_CYCLE_MASK - 1);
247 level <<= 1;
248 } else
249 tmp &= ~BACKLIGHT_DUTY_CYCLE_MASK;
250 I915_WRITE(BLC_PWM_CTL, tmp | level);
251}
252
253void intel_panel_disable_backlight(struct drm_device *dev)
254{
255 struct drm_i915_private *dev_priv = dev->dev_private;
256
257 if (dev_priv->backlight_enabled) {
258 dev_priv->backlight_level = intel_panel_get_backlight(dev);
259 dev_priv->backlight_enabled = false;
260 }
261
262 intel_panel_set_backlight(dev, 0);
263}
264
265void intel_panel_enable_backlight(struct drm_device *dev)
266{
267 struct drm_i915_private *dev_priv = dev->dev_private;
268
269 if (dev_priv->backlight_level == 0)
270 dev_priv->backlight_level = intel_panel_get_max_backlight(dev);
271
272 intel_panel_set_backlight(dev, dev_priv->backlight_level);
273 dev_priv->backlight_enabled = true;
274}
275
276void intel_panel_setup_backlight(struct drm_device *dev)
277{
278 struct drm_i915_private *dev_priv = dev->dev_private;
279
280 dev_priv->backlight_level = intel_panel_get_backlight(dev);
281 dev_priv->backlight_enabled = dev_priv->backlight_level != 0;
282}
283
284enum drm_connector_status
285intel_panel_detect(struct drm_device *dev)
286{
287#if 0
288 struct drm_i915_private *dev_priv = dev->dev_private;
289#endif
290
291 if (i915_panel_ignore_lid)
292 return i915_panel_ignore_lid > 0 ?
293 connector_status_connected :
294 connector_status_disconnected;
295
296 /* opregion lid state on HP 2540p is wrong at boot up,
297 * appears to be either the BIOS or Linux ACPI fault */
298#if 0
299 /* Assume that the BIOS does not lie through the OpRegion... */
300 if (dev_priv->opregion.lid_state)
301 return ioread32(dev_priv->opregion.lid_state) & 0x1 ?
302 connector_status_connected :
303 connector_status_disconnected;
304#endif
305
306 return connector_status_unknown;
307}
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c
index cb3508f78bc3..95c4b1429935 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.c
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
@@ -32,6 +32,15 @@
32#include "i915_drv.h" 32#include "i915_drv.h"
33#include "i915_drm.h" 33#include "i915_drm.h"
34#include "i915_trace.h" 34#include "i915_trace.h"
35#include "intel_drv.h"
36
37static inline int ring_space(struct intel_ring_buffer *ring)
38{
39 int space = (ring->head & HEAD_ADDR) - (ring->tail + 8);
40 if (space < 0)
41 space += ring->size;
42 return space;
43}
35 44
36static u32 i915_gem_get_seqno(struct drm_device *dev) 45static u32 i915_gem_get_seqno(struct drm_device *dev)
37{ 46{
@@ -47,537 +56,718 @@ static u32 i915_gem_get_seqno(struct drm_device *dev)
47 return seqno; 56 return seqno;
48} 57}
49 58
50static void 59static int
51render_ring_flush(struct drm_device *dev, 60render_ring_flush(struct intel_ring_buffer *ring,
52 struct intel_ring_buffer *ring, 61 u32 invalidate_domains,
53 u32 invalidate_domains, 62 u32 flush_domains)
54 u32 flush_domains)
55{ 63{
56 drm_i915_private_t *dev_priv = dev->dev_private; 64 struct drm_device *dev = ring->dev;
57 u32 cmd; 65 u32 cmd;
66 int ret;
58 67
59#if WATCH_EXEC 68 /*
60 DRM_INFO("%s: invalidate %08x flush %08x\n", __func__, 69 * read/write caches:
61 invalidate_domains, flush_domains); 70 *
62#endif 71 * I915_GEM_DOMAIN_RENDER is always invalidated, but is
63 72 * only flushed if MI_NO_WRITE_FLUSH is unset. On 965, it is
64 trace_i915_gem_request_flush(dev, dev_priv->next_seqno, 73 * also flushed at 2d versus 3d pipeline switches.
65 invalidate_domains, flush_domains); 74 *
66 75 * read-only caches:
67 if ((invalidate_domains | flush_domains) & I915_GEM_GPU_DOMAINS) { 76 *
77 * I915_GEM_DOMAIN_SAMPLER is flushed on pre-965 if
78 * MI_READ_FLUSH is set, and is always flushed on 965.
79 *
80 * I915_GEM_DOMAIN_COMMAND may not exist?
81 *
82 * I915_GEM_DOMAIN_INSTRUCTION, which exists on 965, is
83 * invalidated when MI_EXE_FLUSH is set.
84 *
85 * I915_GEM_DOMAIN_VERTEX, which exists on 965, is
86 * invalidated with every MI_FLUSH.
87 *
88 * TLBs:
89 *
90 * On 965, TLBs associated with I915_GEM_DOMAIN_COMMAND
91 * and I915_GEM_DOMAIN_CPU in are invalidated at PTE write and
92 * I915_GEM_DOMAIN_RENDER and I915_GEM_DOMAIN_SAMPLER
93 * are flushed at any MI_FLUSH.
94 */
95
96 cmd = MI_FLUSH | MI_NO_WRITE_FLUSH;
97 if ((invalidate_domains|flush_domains) &
98 I915_GEM_DOMAIN_RENDER)
99 cmd &= ~MI_NO_WRITE_FLUSH;
100 if (INTEL_INFO(dev)->gen < 4) {
68 /* 101 /*
69 * read/write caches: 102 * On the 965, the sampler cache always gets flushed
70 * 103 * and this bit is reserved.
71 * I915_GEM_DOMAIN_RENDER is always invalidated, but is
72 * only flushed if MI_NO_WRITE_FLUSH is unset. On 965, it is
73 * also flushed at 2d versus 3d pipeline switches.
74 *
75 * read-only caches:
76 *
77 * I915_GEM_DOMAIN_SAMPLER is flushed on pre-965 if
78 * MI_READ_FLUSH is set, and is always flushed on 965.
79 *
80 * I915_GEM_DOMAIN_COMMAND may not exist?
81 *
82 * I915_GEM_DOMAIN_INSTRUCTION, which exists on 965, is
83 * invalidated when MI_EXE_FLUSH is set.
84 *
85 * I915_GEM_DOMAIN_VERTEX, which exists on 965, is
86 * invalidated with every MI_FLUSH.
87 *
88 * TLBs:
89 *
90 * On 965, TLBs associated with I915_GEM_DOMAIN_COMMAND
91 * and I915_GEM_DOMAIN_CPU in are invalidated at PTE write and
92 * I915_GEM_DOMAIN_RENDER and I915_GEM_DOMAIN_SAMPLER
93 * are flushed at any MI_FLUSH.
94 */ 104 */
95 105 if (invalidate_domains & I915_GEM_DOMAIN_SAMPLER)
96 cmd = MI_FLUSH | MI_NO_WRITE_FLUSH; 106 cmd |= MI_READ_FLUSH;
97 if ((invalidate_domains|flush_domains) &
98 I915_GEM_DOMAIN_RENDER)
99 cmd &= ~MI_NO_WRITE_FLUSH;
100 if (!IS_I965G(dev)) {
101 /*
102 * On the 965, the sampler cache always gets flushed
103 * and this bit is reserved.
104 */
105 if (invalidate_domains & I915_GEM_DOMAIN_SAMPLER)
106 cmd |= MI_READ_FLUSH;
107 }
108 if (invalidate_domains & I915_GEM_DOMAIN_INSTRUCTION)
109 cmd |= MI_EXE_FLUSH;
110
111#if WATCH_EXEC
112 DRM_INFO("%s: queue flush %08x to ring\n", __func__, cmd);
113#endif
114 intel_ring_begin(dev, ring, 2);
115 intel_ring_emit(dev, ring, cmd);
116 intel_ring_emit(dev, ring, MI_NOOP);
117 intel_ring_advance(dev, ring);
118 } 107 }
119} 108 if (invalidate_domains & I915_GEM_DOMAIN_INSTRUCTION)
109 cmd |= MI_EXE_FLUSH;
120 110
121static unsigned int render_ring_get_head(struct drm_device *dev, 111 if (invalidate_domains & I915_GEM_DOMAIN_COMMAND &&
122 struct intel_ring_buffer *ring) 112 (IS_G4X(dev) || IS_GEN5(dev)))
123{ 113 cmd |= MI_INVALIDATE_ISP;
124 drm_i915_private_t *dev_priv = dev->dev_private; 114
125 return I915_READ(PRB0_HEAD) & HEAD_ADDR; 115 ret = intel_ring_begin(ring, 2);
116 if (ret)
117 return ret;
118
119 intel_ring_emit(ring, cmd);
120 intel_ring_emit(ring, MI_NOOP);
121 intel_ring_advance(ring);
122
123 return 0;
126} 124}
127 125
128static unsigned int render_ring_get_tail(struct drm_device *dev, 126static void ring_write_tail(struct intel_ring_buffer *ring,
129 struct intel_ring_buffer *ring) 127 u32 value)
130{ 128{
131 drm_i915_private_t *dev_priv = dev->dev_private; 129 drm_i915_private_t *dev_priv = ring->dev->dev_private;
132 return I915_READ(PRB0_TAIL) & TAIL_ADDR; 130 I915_WRITE_TAIL(ring, value);
133} 131}
134 132
135static unsigned int render_ring_get_active_head(struct drm_device *dev, 133u32 intel_ring_get_active_head(struct intel_ring_buffer *ring)
136 struct intel_ring_buffer *ring)
137{ 134{
138 drm_i915_private_t *dev_priv = dev->dev_private; 135 drm_i915_private_t *dev_priv = ring->dev->dev_private;
139 u32 acthd_reg = IS_I965G(dev) ? ACTHD_I965 : ACTHD; 136 u32 acthd_reg = INTEL_INFO(ring->dev)->gen >= 4 ?
137 RING_ACTHD(ring->mmio_base) : ACTHD;
140 138
141 return I915_READ(acthd_reg); 139 return I915_READ(acthd_reg);
142} 140}
143 141
144static void render_ring_advance_ring(struct drm_device *dev, 142static int init_ring_common(struct intel_ring_buffer *ring)
145 struct intel_ring_buffer *ring)
146{
147 drm_i915_private_t *dev_priv = dev->dev_private;
148 I915_WRITE(PRB0_TAIL, ring->tail);
149}
150
151static int init_ring_common(struct drm_device *dev,
152 struct intel_ring_buffer *ring)
153{ 143{
144 drm_i915_private_t *dev_priv = ring->dev->dev_private;
145 struct drm_i915_gem_object *obj = ring->obj;
154 u32 head; 146 u32 head;
155 drm_i915_private_t *dev_priv = dev->dev_private;
156 struct drm_i915_gem_object *obj_priv;
157 obj_priv = to_intel_bo(ring->gem_object);
158 147
159 /* Stop the ring if it's running. */ 148 /* Stop the ring if it's running. */
160 I915_WRITE(ring->regs.ctl, 0); 149 I915_WRITE_CTL(ring, 0);
161 I915_WRITE(ring->regs.head, 0); 150 I915_WRITE_HEAD(ring, 0);
162 I915_WRITE(ring->regs.tail, 0); 151 ring->write_tail(ring, 0);
163 152
164 /* Initialize the ring. */ 153 /* Initialize the ring. */
165 I915_WRITE(ring->regs.start, obj_priv->gtt_offset); 154 I915_WRITE_START(ring, obj->gtt_offset);
166 head = ring->get_head(dev, ring); 155 head = I915_READ_HEAD(ring) & HEAD_ADDR;
167 156
168 /* G45 ring initialization fails to reset head to zero */ 157 /* G45 ring initialization fails to reset head to zero */
169 if (head != 0) { 158 if (head != 0) {
170 DRM_ERROR("%s head not reset to zero " 159 DRM_DEBUG_KMS("%s head not reset to zero "
171 "ctl %08x head %08x tail %08x start %08x\n", 160 "ctl %08x head %08x tail %08x start %08x\n",
172 ring->name, 161 ring->name,
173 I915_READ(ring->regs.ctl), 162 I915_READ_CTL(ring),
174 I915_READ(ring->regs.head), 163 I915_READ_HEAD(ring),
175 I915_READ(ring->regs.tail), 164 I915_READ_TAIL(ring),
176 I915_READ(ring->regs.start)); 165 I915_READ_START(ring));
177 166
178 I915_WRITE(ring->regs.head, 0); 167 I915_WRITE_HEAD(ring, 0);
179 168
180 DRM_ERROR("%s head forced to zero " 169 if (I915_READ_HEAD(ring) & HEAD_ADDR) {
181 "ctl %08x head %08x tail %08x start %08x\n", 170 DRM_ERROR("failed to set %s head to zero "
182 ring->name, 171 "ctl %08x head %08x tail %08x start %08x\n",
183 I915_READ(ring->regs.ctl), 172 ring->name,
184 I915_READ(ring->regs.head), 173 I915_READ_CTL(ring),
185 I915_READ(ring->regs.tail), 174 I915_READ_HEAD(ring),
186 I915_READ(ring->regs.start)); 175 I915_READ_TAIL(ring),
176 I915_READ_START(ring));
177 }
187 } 178 }
188 179
189 I915_WRITE(ring->regs.ctl, 180 I915_WRITE_CTL(ring,
190 ((ring->gem_object->size - PAGE_SIZE) & RING_NR_PAGES) 181 ((ring->size - PAGE_SIZE) & RING_NR_PAGES)
191 | RING_NO_REPORT | RING_VALID); 182 | RING_REPORT_64K | RING_VALID);
192 183
193 head = I915_READ(ring->regs.head) & HEAD_ADDR;
194 /* If the head is still not zero, the ring is dead */ 184 /* If the head is still not zero, the ring is dead */
195 if (head != 0) { 185 if ((I915_READ_CTL(ring) & RING_VALID) == 0 ||
186 I915_READ_START(ring) != obj->gtt_offset ||
187 (I915_READ_HEAD(ring) & HEAD_ADDR) != 0) {
196 DRM_ERROR("%s initialization failed " 188 DRM_ERROR("%s initialization failed "
197 "ctl %08x head %08x tail %08x start %08x\n", 189 "ctl %08x head %08x tail %08x start %08x\n",
198 ring->name, 190 ring->name,
199 I915_READ(ring->regs.ctl), 191 I915_READ_CTL(ring),
200 I915_READ(ring->regs.head), 192 I915_READ_HEAD(ring),
201 I915_READ(ring->regs.tail), 193 I915_READ_TAIL(ring),
202 I915_READ(ring->regs.start)); 194 I915_READ_START(ring));
203 return -EIO; 195 return -EIO;
204 } 196 }
205 197
206 if (!drm_core_check_feature(dev, DRIVER_MODESET)) 198 if (!drm_core_check_feature(ring->dev, DRIVER_MODESET))
207 i915_kernel_lost_context(dev); 199 i915_kernel_lost_context(ring->dev);
208 else { 200 else {
209 ring->head = ring->get_head(dev, ring); 201 ring->head = I915_READ_HEAD(ring);
210 ring->tail = ring->get_tail(dev, ring); 202 ring->tail = I915_READ_TAIL(ring) & TAIL_ADDR;
211 ring->space = ring->head - (ring->tail + 8); 203 ring->space = ring_space(ring);
212 if (ring->space < 0)
213 ring->space += ring->size;
214 } 204 }
205
215 return 0; 206 return 0;
216} 207}
217 208
218static int init_render_ring(struct drm_device *dev, 209/*
219 struct intel_ring_buffer *ring) 210 * 965+ support PIPE_CONTROL commands, which provide finer grained control
211 * over cache flushing.
212 */
213struct pipe_control {
214 struct drm_i915_gem_object *obj;
215 volatile u32 *cpu_page;
216 u32 gtt_offset;
217};
218
219static int
220init_pipe_control(struct intel_ring_buffer *ring)
220{ 221{
221 drm_i915_private_t *dev_priv = dev->dev_private; 222 struct pipe_control *pc;
222 int ret = init_ring_common(dev, ring); 223 struct drm_i915_gem_object *obj;
223 int mode; 224 int ret;
225
226 if (ring->private)
227 return 0;
228
229 pc = kmalloc(sizeof(*pc), GFP_KERNEL);
230 if (!pc)
231 return -ENOMEM;
232
233 obj = i915_gem_alloc_object(ring->dev, 4096);
234 if (obj == NULL) {
235 DRM_ERROR("Failed to allocate seqno page\n");
236 ret = -ENOMEM;
237 goto err;
238 }
239 obj->cache_level = I915_CACHE_LLC;
240
241 ret = i915_gem_object_pin(obj, 4096, true);
242 if (ret)
243 goto err_unref;
244
245 pc->gtt_offset = obj->gtt_offset;
246 pc->cpu_page = kmap(obj->pages[0]);
247 if (pc->cpu_page == NULL)
248 goto err_unpin;
249
250 pc->obj = obj;
251 ring->private = pc;
252 return 0;
253
254err_unpin:
255 i915_gem_object_unpin(obj);
256err_unref:
257 drm_gem_object_unreference(&obj->base);
258err:
259 kfree(pc);
260 return ret;
261}
262
263static void
264cleanup_pipe_control(struct intel_ring_buffer *ring)
265{
266 struct pipe_control *pc = ring->private;
267 struct drm_i915_gem_object *obj;
268
269 if (!ring->private)
270 return;
271
272 obj = pc->obj;
273 kunmap(obj->pages[0]);
274 i915_gem_object_unpin(obj);
275 drm_gem_object_unreference(&obj->base);
276
277 kfree(pc);
278 ring->private = NULL;
279}
224 280
225 if (IS_I9XX(dev) && !IS_GEN3(dev)) { 281static int init_render_ring(struct intel_ring_buffer *ring)
226 mode = VS_TIMER_DISPATCH << 16 | VS_TIMER_DISPATCH; 282{
227 if (IS_GEN6(dev)) 283 struct drm_device *dev = ring->dev;
284 struct drm_i915_private *dev_priv = dev->dev_private;
285 int ret = init_ring_common(ring);
286
287 if (INTEL_INFO(dev)->gen > 3) {
288 int mode = VS_TIMER_DISPATCH << 16 | VS_TIMER_DISPATCH;
289 if (IS_GEN6(dev) || IS_GEN7(dev))
228 mode |= MI_FLUSH_ENABLE << 16 | MI_FLUSH_ENABLE; 290 mode |= MI_FLUSH_ENABLE << 16 | MI_FLUSH_ENABLE;
229 I915_WRITE(MI_MODE, mode); 291 I915_WRITE(MI_MODE, mode);
230 } 292 }
293
294 if (INTEL_INFO(dev)->gen >= 6) {
295 } else if (IS_GEN5(dev)) {
296 ret = init_pipe_control(ring);
297 if (ret)
298 return ret;
299 }
300
231 return ret; 301 return ret;
232} 302}
233 303
234#define PIPE_CONTROL_FLUSH(addr) \ 304static void render_ring_cleanup(struct intel_ring_buffer *ring)
305{
306 if (!ring->private)
307 return;
308
309 cleanup_pipe_control(ring);
310}
311
312static void
313update_semaphore(struct intel_ring_buffer *ring, int i, u32 seqno)
314{
315 struct drm_device *dev = ring->dev;
316 struct drm_i915_private *dev_priv = dev->dev_private;
317 int id;
318
319 /*
320 * cs -> 1 = vcs, 0 = bcs
321 * vcs -> 1 = bcs, 0 = cs,
322 * bcs -> 1 = cs, 0 = vcs.
323 */
324 id = ring - dev_priv->ring;
325 id += 2 - i;
326 id %= 3;
327
328 intel_ring_emit(ring,
329 MI_SEMAPHORE_MBOX |
330 MI_SEMAPHORE_REGISTER |
331 MI_SEMAPHORE_UPDATE);
332 intel_ring_emit(ring, seqno);
333 intel_ring_emit(ring,
334 RING_SYNC_0(dev_priv->ring[id].mmio_base) + 4*i);
335}
336
337static int
338gen6_add_request(struct intel_ring_buffer *ring,
339 u32 *result)
340{
341 u32 seqno;
342 int ret;
343
344 ret = intel_ring_begin(ring, 10);
345 if (ret)
346 return ret;
347
348 seqno = i915_gem_get_seqno(ring->dev);
349 update_semaphore(ring, 0, seqno);
350 update_semaphore(ring, 1, seqno);
351
352 intel_ring_emit(ring, MI_STORE_DWORD_INDEX);
353 intel_ring_emit(ring, I915_GEM_HWS_INDEX << MI_STORE_DWORD_INDEX_SHIFT);
354 intel_ring_emit(ring, seqno);
355 intel_ring_emit(ring, MI_USER_INTERRUPT);
356 intel_ring_advance(ring);
357
358 *result = seqno;
359 return 0;
360}
361
362int
363intel_ring_sync(struct intel_ring_buffer *ring,
364 struct intel_ring_buffer *to,
365 u32 seqno)
366{
367 int ret;
368
369 ret = intel_ring_begin(ring, 4);
370 if (ret)
371 return ret;
372
373 intel_ring_emit(ring,
374 MI_SEMAPHORE_MBOX |
375 MI_SEMAPHORE_REGISTER |
376 intel_ring_sync_index(ring, to) << 17 |
377 MI_SEMAPHORE_COMPARE);
378 intel_ring_emit(ring, seqno);
379 intel_ring_emit(ring, 0);
380 intel_ring_emit(ring, MI_NOOP);
381 intel_ring_advance(ring);
382
383 return 0;
384}
385
386#define PIPE_CONTROL_FLUSH(ring__, addr__) \
235do { \ 387do { \
236 OUT_RING(GFX_OP_PIPE_CONTROL | PIPE_CONTROL_QW_WRITE | \ 388 intel_ring_emit(ring__, GFX_OP_PIPE_CONTROL | PIPE_CONTROL_QW_WRITE | \
237 PIPE_CONTROL_DEPTH_STALL | 2); \ 389 PIPE_CONTROL_DEPTH_STALL | 2); \
238 OUT_RING(addr | PIPE_CONTROL_GLOBAL_GTT); \ 390 intel_ring_emit(ring__, (addr__) | PIPE_CONTROL_GLOBAL_GTT); \
239 OUT_RING(0); \ 391 intel_ring_emit(ring__, 0); \
240 OUT_RING(0); \ 392 intel_ring_emit(ring__, 0); \
241} while (0) 393} while (0)
242 394
243/** 395static int
244 * Creates a new sequence number, emitting a write of it to the status page 396pc_render_add_request(struct intel_ring_buffer *ring,
245 * plus an interrupt, which will trigger i915_user_interrupt_handler. 397 u32 *result)
246 *
247 * Must be called with struct_lock held.
248 *
249 * Returned sequence numbers are nonzero on success.
250 */
251static u32
252render_ring_add_request(struct drm_device *dev,
253 struct intel_ring_buffer *ring,
254 struct drm_file *file_priv,
255 u32 flush_domains)
256{ 398{
257 drm_i915_private_t *dev_priv = dev->dev_private; 399 struct drm_device *dev = ring->dev;
258 u32 seqno; 400 u32 seqno = i915_gem_get_seqno(dev);
401 struct pipe_control *pc = ring->private;
402 u32 scratch_addr = pc->gtt_offset + 128;
403 int ret;
259 404
260 seqno = i915_gem_get_seqno(dev); 405 /* For Ironlake, MI_USER_INTERRUPT was deprecated and apparently
261 406 * incoherent with writes to memory, i.e. completely fubar,
262 if (IS_GEN6(dev)) { 407 * so we need to use PIPE_NOTIFY instead.
263 BEGIN_LP_RING(6); 408 *
264 OUT_RING(GFX_OP_PIPE_CONTROL | 3); 409 * However, we also need to workaround the qword write
265 OUT_RING(PIPE_CONTROL_QW_WRITE | 410 * incoherence by flushing the 6 PIPE_NOTIFY buffers out to
266 PIPE_CONTROL_WC_FLUSH | PIPE_CONTROL_IS_FLUSH | 411 * memory before requesting an interrupt.
267 PIPE_CONTROL_NOTIFY); 412 */
268 OUT_RING(dev_priv->seqno_gfx_addr | PIPE_CONTROL_GLOBAL_GTT); 413 ret = intel_ring_begin(ring, 32);
269 OUT_RING(seqno); 414 if (ret)
270 OUT_RING(0); 415 return ret;
271 OUT_RING(0); 416
272 ADVANCE_LP_RING(); 417 intel_ring_emit(ring, GFX_OP_PIPE_CONTROL | PIPE_CONTROL_QW_WRITE |
273 } else if (HAS_PIPE_CONTROL(dev)) { 418 PIPE_CONTROL_WC_FLUSH | PIPE_CONTROL_TC_FLUSH);
274 u32 scratch_addr = dev_priv->seqno_gfx_addr + 128; 419 intel_ring_emit(ring, pc->gtt_offset | PIPE_CONTROL_GLOBAL_GTT);
420 intel_ring_emit(ring, seqno);
421 intel_ring_emit(ring, 0);
422 PIPE_CONTROL_FLUSH(ring, scratch_addr);
423 scratch_addr += 128; /* write to separate cachelines */
424 PIPE_CONTROL_FLUSH(ring, scratch_addr);
425 scratch_addr += 128;
426 PIPE_CONTROL_FLUSH(ring, scratch_addr);
427 scratch_addr += 128;
428 PIPE_CONTROL_FLUSH(ring, scratch_addr);
429 scratch_addr += 128;
430 PIPE_CONTROL_FLUSH(ring, scratch_addr);
431 scratch_addr += 128;
432 PIPE_CONTROL_FLUSH(ring, scratch_addr);
433 intel_ring_emit(ring, GFX_OP_PIPE_CONTROL | PIPE_CONTROL_QW_WRITE |
434 PIPE_CONTROL_WC_FLUSH | PIPE_CONTROL_TC_FLUSH |
435 PIPE_CONTROL_NOTIFY);
436 intel_ring_emit(ring, pc->gtt_offset | PIPE_CONTROL_GLOBAL_GTT);
437 intel_ring_emit(ring, seqno);
438 intel_ring_emit(ring, 0);
439 intel_ring_advance(ring);
440
441 *result = seqno;
442 return 0;
443}
275 444
276 /* 445static int
277 * Workaround qword write incoherence by flushing the 446render_ring_add_request(struct intel_ring_buffer *ring,
278 * PIPE_NOTIFY buffers out to memory before requesting 447 u32 *result)
279 * an interrupt. 448{
280 */ 449 struct drm_device *dev = ring->dev;
281 BEGIN_LP_RING(32); 450 u32 seqno = i915_gem_get_seqno(dev);
282 OUT_RING(GFX_OP_PIPE_CONTROL | PIPE_CONTROL_QW_WRITE | 451 int ret;
283 PIPE_CONTROL_WC_FLUSH | PIPE_CONTROL_TC_FLUSH);
284 OUT_RING(dev_priv->seqno_gfx_addr | PIPE_CONTROL_GLOBAL_GTT);
285 OUT_RING(seqno);
286 OUT_RING(0);
287 PIPE_CONTROL_FLUSH(scratch_addr);
288 scratch_addr += 128; /* write to separate cachelines */
289 PIPE_CONTROL_FLUSH(scratch_addr);
290 scratch_addr += 128;
291 PIPE_CONTROL_FLUSH(scratch_addr);
292 scratch_addr += 128;
293 PIPE_CONTROL_FLUSH(scratch_addr);
294 scratch_addr += 128;
295 PIPE_CONTROL_FLUSH(scratch_addr);
296 scratch_addr += 128;
297 PIPE_CONTROL_FLUSH(scratch_addr);
298 OUT_RING(GFX_OP_PIPE_CONTROL | PIPE_CONTROL_QW_WRITE |
299 PIPE_CONTROL_WC_FLUSH | PIPE_CONTROL_TC_FLUSH |
300 PIPE_CONTROL_NOTIFY);
301 OUT_RING(dev_priv->seqno_gfx_addr | PIPE_CONTROL_GLOBAL_GTT);
302 OUT_RING(seqno);
303 OUT_RING(0);
304 ADVANCE_LP_RING();
305 } else {
306 BEGIN_LP_RING(4);
307 OUT_RING(MI_STORE_DWORD_INDEX);
308 OUT_RING(I915_GEM_HWS_INDEX << MI_STORE_DWORD_INDEX_SHIFT);
309 OUT_RING(seqno);
310 452
311 OUT_RING(MI_USER_INTERRUPT); 453 ret = intel_ring_begin(ring, 4);
312 ADVANCE_LP_RING(); 454 if (ret)
313 } 455 return ret;
314 return seqno; 456
457 intel_ring_emit(ring, MI_STORE_DWORD_INDEX);
458 intel_ring_emit(ring, I915_GEM_HWS_INDEX << MI_STORE_DWORD_INDEX_SHIFT);
459 intel_ring_emit(ring, seqno);
460 intel_ring_emit(ring, MI_USER_INTERRUPT);
461 intel_ring_advance(ring);
462
463 *result = seqno;
464 return 0;
315} 465}
316 466
317static u32 467static u32
318render_ring_get_gem_seqno(struct drm_device *dev, 468ring_get_seqno(struct intel_ring_buffer *ring)
319 struct intel_ring_buffer *ring)
320{ 469{
321 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 470 return intel_read_status_page(ring, I915_GEM_HWS_INDEX);
322 if (HAS_PIPE_CONTROL(dev)) 471}
323 return ((volatile u32 *)(dev_priv->seqno_page))[0]; 472
324 else 473static u32
325 return intel_read_status_page(ring, I915_GEM_HWS_INDEX); 474pc_render_get_seqno(struct intel_ring_buffer *ring)
475{
476 struct pipe_control *pc = ring->private;
477 return pc->cpu_page[0];
478}
479
480static void
481ironlake_enable_irq(drm_i915_private_t *dev_priv, u32 mask)
482{
483 dev_priv->gt_irq_mask &= ~mask;
484 I915_WRITE(GTIMR, dev_priv->gt_irq_mask);
485 POSTING_READ(GTIMR);
486}
487
488static void
489ironlake_disable_irq(drm_i915_private_t *dev_priv, u32 mask)
490{
491 dev_priv->gt_irq_mask |= mask;
492 I915_WRITE(GTIMR, dev_priv->gt_irq_mask);
493 POSTING_READ(GTIMR);
494}
495
496static void
497i915_enable_irq(drm_i915_private_t *dev_priv, u32 mask)
498{
499 dev_priv->irq_mask &= ~mask;
500 I915_WRITE(IMR, dev_priv->irq_mask);
501 POSTING_READ(IMR);
326} 502}
327 503
328static void 504static void
329render_ring_get_user_irq(struct drm_device *dev, 505i915_disable_irq(drm_i915_private_t *dev_priv, u32 mask)
330 struct intel_ring_buffer *ring) 506{
507 dev_priv->irq_mask |= mask;
508 I915_WRITE(IMR, dev_priv->irq_mask);
509 POSTING_READ(IMR);
510}
511
512static bool
513render_ring_get_irq(struct intel_ring_buffer *ring)
331{ 514{
332 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 515 struct drm_device *dev = ring->dev;
333 unsigned long irqflags; 516 drm_i915_private_t *dev_priv = dev->dev_private;
334 517
335 spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags); 518 if (!dev->irq_enabled)
336 if (dev->irq_enabled && (++ring->user_irq_refcount == 1)) { 519 return false;
520
521 spin_lock(&ring->irq_lock);
522 if (ring->irq_refcount++ == 0) {
337 if (HAS_PCH_SPLIT(dev)) 523 if (HAS_PCH_SPLIT(dev))
338 ironlake_enable_graphics_irq(dev_priv, GT_PIPE_NOTIFY); 524 ironlake_enable_irq(dev_priv,
525 GT_PIPE_NOTIFY | GT_USER_INTERRUPT);
339 else 526 else
340 i915_enable_irq(dev_priv, I915_USER_INTERRUPT); 527 i915_enable_irq(dev_priv, I915_USER_INTERRUPT);
341 } 528 }
342 spin_unlock_irqrestore(&dev_priv->user_irq_lock, irqflags); 529 spin_unlock(&ring->irq_lock);
530
531 return true;
343} 532}
344 533
345static void 534static void
346render_ring_put_user_irq(struct drm_device *dev, 535render_ring_put_irq(struct intel_ring_buffer *ring)
347 struct intel_ring_buffer *ring)
348{ 536{
349 drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; 537 struct drm_device *dev = ring->dev;
350 unsigned long irqflags; 538 drm_i915_private_t *dev_priv = dev->dev_private;
351 539
352 spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags); 540 spin_lock(&ring->irq_lock);
353 BUG_ON(dev->irq_enabled && ring->user_irq_refcount <= 0); 541 if (--ring->irq_refcount == 0) {
354 if (dev->irq_enabled && (--ring->user_irq_refcount == 0)) {
355 if (HAS_PCH_SPLIT(dev)) 542 if (HAS_PCH_SPLIT(dev))
356 ironlake_disable_graphics_irq(dev_priv, GT_PIPE_NOTIFY); 543 ironlake_disable_irq(dev_priv,
544 GT_USER_INTERRUPT |
545 GT_PIPE_NOTIFY);
357 else 546 else
358 i915_disable_irq(dev_priv, I915_USER_INTERRUPT); 547 i915_disable_irq(dev_priv, I915_USER_INTERRUPT);
359 } 548 }
360 spin_unlock_irqrestore(&dev_priv->user_irq_lock, irqflags); 549 spin_unlock(&ring->irq_lock);
361} 550}
362 551
363static void render_setup_status_page(struct drm_device *dev, 552void intel_ring_setup_status_page(struct intel_ring_buffer *ring)
364 struct intel_ring_buffer *ring)
365{ 553{
366 drm_i915_private_t *dev_priv = dev->dev_private; 554 struct drm_device *dev = ring->dev;
367 if (IS_GEN6(dev)) { 555 drm_i915_private_t *dev_priv = ring->dev->dev_private;
368 I915_WRITE(HWS_PGA_GEN6, ring->status_page.gfx_addr); 556 u32 mmio = 0;
369 I915_READ(HWS_PGA_GEN6); /* posting read */ 557
558 /* The ring status page addresses are no longer next to the rest of
559 * the ring registers as of gen7.
560 */
561 if (IS_GEN7(dev)) {
562 switch (ring->id) {
563 case RING_RENDER:
564 mmio = RENDER_HWS_PGA_GEN7;
565 break;
566 case RING_BLT:
567 mmio = BLT_HWS_PGA_GEN7;
568 break;
569 case RING_BSD:
570 mmio = BSD_HWS_PGA_GEN7;
571 break;
572 }
573 } else if (IS_GEN6(ring->dev)) {
574 mmio = RING_HWS_PGA_GEN6(ring->mmio_base);
370 } else { 575 } else {
371 I915_WRITE(HWS_PGA, ring->status_page.gfx_addr); 576 mmio = RING_HWS_PGA(ring->mmio_base);
372 I915_READ(HWS_PGA); /* posting read */
373 } 577 }
374 578
579 I915_WRITE(mmio, (u32)ring->status_page.gfx_addr);
580 POSTING_READ(mmio);
375} 581}
376 582
377void 583static int
378bsd_ring_flush(struct drm_device *dev, 584bsd_ring_flush(struct intel_ring_buffer *ring,
379 struct intel_ring_buffer *ring, 585 u32 invalidate_domains,
380 u32 invalidate_domains, 586 u32 flush_domains)
381 u32 flush_domains)
382{ 587{
383 intel_ring_begin(dev, ring, 2); 588 int ret;
384 intel_ring_emit(dev, ring, MI_FLUSH);
385 intel_ring_emit(dev, ring, MI_NOOP);
386 intel_ring_advance(dev, ring);
387}
388 589
389static inline unsigned int bsd_ring_get_head(struct drm_device *dev, 590 ret = intel_ring_begin(ring, 2);
390 struct intel_ring_buffer *ring) 591 if (ret)
391{ 592 return ret;
392 drm_i915_private_t *dev_priv = dev->dev_private;
393 return I915_READ(BSD_RING_HEAD) & HEAD_ADDR;
394}
395 593
396static inline unsigned int bsd_ring_get_tail(struct drm_device *dev, 594 intel_ring_emit(ring, MI_FLUSH);
397 struct intel_ring_buffer *ring) 595 intel_ring_emit(ring, MI_NOOP);
398{ 596 intel_ring_advance(ring);
399 drm_i915_private_t *dev_priv = dev->dev_private; 597 return 0;
400 return I915_READ(BSD_RING_TAIL) & TAIL_ADDR;
401} 598}
402 599
403static inline unsigned int bsd_ring_get_active_head(struct drm_device *dev, 600static int
404 struct intel_ring_buffer *ring) 601ring_add_request(struct intel_ring_buffer *ring,
602 u32 *result)
405{ 603{
406 drm_i915_private_t *dev_priv = dev->dev_private; 604 u32 seqno;
407 return I915_READ(BSD_RING_ACTHD); 605 int ret;
408}
409 606
410static inline void bsd_ring_advance_ring(struct drm_device *dev, 607 ret = intel_ring_begin(ring, 4);
411 struct intel_ring_buffer *ring) 608 if (ret)
412{ 609 return ret;
413 drm_i915_private_t *dev_priv = dev->dev_private;
414 I915_WRITE(BSD_RING_TAIL, ring->tail);
415}
416 610
417static int init_bsd_ring(struct drm_device *dev, 611 seqno = i915_gem_get_seqno(ring->dev);
418 struct intel_ring_buffer *ring) 612
419{ 613 intel_ring_emit(ring, MI_STORE_DWORD_INDEX);
420 return init_ring_common(dev, ring); 614 intel_ring_emit(ring, I915_GEM_HWS_INDEX << MI_STORE_DWORD_INDEX_SHIFT);
615 intel_ring_emit(ring, seqno);
616 intel_ring_emit(ring, MI_USER_INTERRUPT);
617 intel_ring_advance(ring);
618
619 *result = seqno;
620 return 0;
421} 621}
422 622
423static u32 623static bool
424bsd_ring_add_request(struct drm_device *dev, 624gen6_ring_get_irq(struct intel_ring_buffer *ring, u32 gflag, u32 rflag)
425 struct intel_ring_buffer *ring,
426 struct drm_file *file_priv,
427 u32 flush_domains)
428{ 625{
429 u32 seqno; 626 struct drm_device *dev = ring->dev;
430 627 drm_i915_private_t *dev_priv = dev->dev_private;
431 seqno = i915_gem_get_seqno(dev);
432 628
433 intel_ring_begin(dev, ring, 4); 629 if (!dev->irq_enabled)
434 intel_ring_emit(dev, ring, MI_STORE_DWORD_INDEX); 630 return false;
435 intel_ring_emit(dev, ring,
436 I915_GEM_HWS_INDEX << MI_STORE_DWORD_INDEX_SHIFT);
437 intel_ring_emit(dev, ring, seqno);
438 intel_ring_emit(dev, ring, MI_USER_INTERRUPT);
439 intel_ring_advance(dev, ring);
440 631
441 DRM_DEBUG_DRIVER("%s %d\n", ring->name, seqno); 632 spin_lock(&ring->irq_lock);
633 if (ring->irq_refcount++ == 0) {
634 ring->irq_mask &= ~rflag;
635 I915_WRITE_IMR(ring, ring->irq_mask);
636 ironlake_enable_irq(dev_priv, gflag);
637 }
638 spin_unlock(&ring->irq_lock);
442 639
443 return seqno; 640 return true;
444} 641}
445 642
446static void bsd_setup_status_page(struct drm_device *dev, 643static void
447 struct intel_ring_buffer *ring) 644gen6_ring_put_irq(struct intel_ring_buffer *ring, u32 gflag, u32 rflag)
448{ 645{
646 struct drm_device *dev = ring->dev;
449 drm_i915_private_t *dev_priv = dev->dev_private; 647 drm_i915_private_t *dev_priv = dev->dev_private;
450 I915_WRITE(BSD_HWS_PGA, ring->status_page.gfx_addr); 648
451 I915_READ(BSD_HWS_PGA); 649 spin_lock(&ring->irq_lock);
650 if (--ring->irq_refcount == 0) {
651 ring->irq_mask |= rflag;
652 I915_WRITE_IMR(ring, ring->irq_mask);
653 ironlake_disable_irq(dev_priv, gflag);
654 }
655 spin_unlock(&ring->irq_lock);
452} 656}
453 657
454static void 658static bool
455bsd_ring_get_user_irq(struct drm_device *dev, 659bsd_ring_get_irq(struct intel_ring_buffer *ring)
456 struct intel_ring_buffer *ring)
457{ 660{
458 /* do nothing */ 661 struct drm_device *dev = ring->dev;
662 drm_i915_private_t *dev_priv = dev->dev_private;
663
664 if (!dev->irq_enabled)
665 return false;
666
667 spin_lock(&ring->irq_lock);
668 if (ring->irq_refcount++ == 0) {
669 if (IS_G4X(dev))
670 i915_enable_irq(dev_priv, I915_BSD_USER_INTERRUPT);
671 else
672 ironlake_enable_irq(dev_priv, GT_BSD_USER_INTERRUPT);
673 }
674 spin_unlock(&ring->irq_lock);
675
676 return true;
459} 677}
460static void 678static void
461bsd_ring_put_user_irq(struct drm_device *dev, 679bsd_ring_put_irq(struct intel_ring_buffer *ring)
462 struct intel_ring_buffer *ring)
463{ 680{
464 /* do nothing */ 681 struct drm_device *dev = ring->dev;
465} 682 drm_i915_private_t *dev_priv = dev->dev_private;
466 683
467static u32 684 spin_lock(&ring->irq_lock);
468bsd_ring_get_gem_seqno(struct drm_device *dev, 685 if (--ring->irq_refcount == 0) {
469 struct intel_ring_buffer *ring) 686 if (IS_G4X(dev))
470{ 687 i915_disable_irq(dev_priv, I915_BSD_USER_INTERRUPT);
471 return intel_read_status_page(ring, I915_GEM_HWS_INDEX); 688 else
689 ironlake_disable_irq(dev_priv, GT_BSD_USER_INTERRUPT);
690 }
691 spin_unlock(&ring->irq_lock);
472} 692}
473 693
474static int 694static int
475bsd_ring_dispatch_gem_execbuffer(struct drm_device *dev, 695ring_dispatch_execbuffer(struct intel_ring_buffer *ring, u32 offset, u32 length)
476 struct intel_ring_buffer *ring, 696{
477 struct drm_i915_gem_execbuffer2 *exec, 697 int ret;
478 struct drm_clip_rect *cliprects, 698
479 uint64_t exec_offset) 699 ret = intel_ring_begin(ring, 2);
480{ 700 if (ret)
481 uint32_t exec_start; 701 return ret;
482 exec_start = (uint32_t) exec_offset + exec->batch_start_offset; 702
483 intel_ring_begin(dev, ring, 2); 703 intel_ring_emit(ring,
484 intel_ring_emit(dev, ring, MI_BATCH_BUFFER_START | 704 MI_BATCH_BUFFER_START | (2 << 6) |
485 (2 << 6) | MI_BATCH_NON_SECURE_I965); 705 MI_BATCH_NON_SECURE_I965);
486 intel_ring_emit(dev, ring, exec_start); 706 intel_ring_emit(ring, offset);
487 intel_ring_advance(dev, ring); 707 intel_ring_advance(ring);
708
488 return 0; 709 return 0;
489} 710}
490 711
491
492static int 712static int
493render_ring_dispatch_gem_execbuffer(struct drm_device *dev, 713render_ring_dispatch_execbuffer(struct intel_ring_buffer *ring,
494 struct intel_ring_buffer *ring, 714 u32 offset, u32 len)
495 struct drm_i915_gem_execbuffer2 *exec,
496 struct drm_clip_rect *cliprects,
497 uint64_t exec_offset)
498{ 715{
499 drm_i915_private_t *dev_priv = dev->dev_private; 716 struct drm_device *dev = ring->dev;
500 int nbox = exec->num_cliprects; 717 int ret;
501 int i = 0, count; 718
502 uint32_t exec_start, exec_len; 719 if (IS_I830(dev) || IS_845G(dev)) {
503 exec_start = (uint32_t) exec_offset + exec->batch_start_offset; 720 ret = intel_ring_begin(ring, 4);
504 exec_len = (uint32_t) exec->batch_len; 721 if (ret)
505 722 return ret;
506 trace_i915_gem_request_submit(dev, dev_priv->next_seqno + 1); 723
507 724 intel_ring_emit(ring, MI_BATCH_BUFFER);
508 count = nbox ? nbox : 1; 725 intel_ring_emit(ring, offset | MI_BATCH_NON_SECURE);
509 726 intel_ring_emit(ring, offset + len - 8);
510 for (i = 0; i < count; i++) { 727 intel_ring_emit(ring, 0);
511 if (i < nbox) { 728 } else {
512 int ret = i915_emit_box(dev, cliprects, i, 729 ret = intel_ring_begin(ring, 2);
513 exec->DR1, exec->DR4); 730 if (ret)
514 if (ret) 731 return ret;
515 return ret;
516 }
517 732
518 if (IS_I830(dev) || IS_845G(dev)) { 733 if (INTEL_INFO(dev)->gen >= 4) {
519 intel_ring_begin(dev, ring, 4); 734 intel_ring_emit(ring,
520 intel_ring_emit(dev, ring, MI_BATCH_BUFFER); 735 MI_BATCH_BUFFER_START | (2 << 6) |
521 intel_ring_emit(dev, ring, 736 MI_BATCH_NON_SECURE_I965);
522 exec_start | MI_BATCH_NON_SECURE); 737 intel_ring_emit(ring, offset);
523 intel_ring_emit(dev, ring, exec_start + exec_len - 4);
524 intel_ring_emit(dev, ring, 0);
525 } else { 738 } else {
526 intel_ring_begin(dev, ring, 4); 739 intel_ring_emit(ring,
527 if (IS_I965G(dev)) { 740 MI_BATCH_BUFFER_START | (2 << 6));
528 intel_ring_emit(dev, ring, 741 intel_ring_emit(ring, offset | MI_BATCH_NON_SECURE);
529 MI_BATCH_BUFFER_START | (2 << 6)
530 | MI_BATCH_NON_SECURE_I965);
531 intel_ring_emit(dev, ring, exec_start);
532 } else {
533 intel_ring_emit(dev, ring, MI_BATCH_BUFFER_START
534 | (2 << 6));
535 intel_ring_emit(dev, ring, exec_start |
536 MI_BATCH_NON_SECURE);
537 }
538 } 742 }
539 intel_ring_advance(dev, ring);
540 }
541
542 if (IS_G4X(dev) || IS_IRONLAKE(dev)) {
543 intel_ring_begin(dev, ring, 2);
544 intel_ring_emit(dev, ring, MI_FLUSH |
545 MI_NO_WRITE_FLUSH |
546 MI_INVALIDATE_ISP );
547 intel_ring_emit(dev, ring, MI_NOOP);
548 intel_ring_advance(dev, ring);
549 } 743 }
550 /* XXX breadcrumb */ 744 intel_ring_advance(ring);
551 745
552 return 0; 746 return 0;
553} 747}
554 748
555static void cleanup_status_page(struct drm_device *dev, 749static void cleanup_status_page(struct intel_ring_buffer *ring)
556 struct intel_ring_buffer *ring)
557{ 750{
558 drm_i915_private_t *dev_priv = dev->dev_private; 751 drm_i915_private_t *dev_priv = ring->dev->dev_private;
559 struct drm_gem_object *obj; 752 struct drm_i915_gem_object *obj;
560 struct drm_i915_gem_object *obj_priv;
561 753
562 obj = ring->status_page.obj; 754 obj = ring->status_page.obj;
563 if (obj == NULL) 755 if (obj == NULL)
564 return; 756 return;
565 obj_priv = to_intel_bo(obj);
566 757
567 kunmap(obj_priv->pages[0]); 758 kunmap(obj->pages[0]);
568 i915_gem_object_unpin(obj); 759 i915_gem_object_unpin(obj);
569 drm_gem_object_unreference(obj); 760 drm_gem_object_unreference(&obj->base);
570 ring->status_page.obj = NULL; 761 ring->status_page.obj = NULL;
571 762
572 memset(&dev_priv->hws_map, 0, sizeof(dev_priv->hws_map)); 763 memset(&dev_priv->hws_map, 0, sizeof(dev_priv->hws_map));
573} 764}
574 765
575static int init_status_page(struct drm_device *dev, 766static int init_status_page(struct intel_ring_buffer *ring)
576 struct intel_ring_buffer *ring)
577{ 767{
768 struct drm_device *dev = ring->dev;
578 drm_i915_private_t *dev_priv = dev->dev_private; 769 drm_i915_private_t *dev_priv = dev->dev_private;
579 struct drm_gem_object *obj; 770 struct drm_i915_gem_object *obj;
580 struct drm_i915_gem_object *obj_priv;
581 int ret; 771 int ret;
582 772
583 obj = i915_gem_alloc_object(dev, 4096); 773 obj = i915_gem_alloc_object(dev, 4096);
@@ -586,16 +776,15 @@ static int init_status_page(struct drm_device *dev,
586 ret = -ENOMEM; 776 ret = -ENOMEM;
587 goto err; 777 goto err;
588 } 778 }
589 obj_priv = to_intel_bo(obj); 779 obj->cache_level = I915_CACHE_LLC;
590 obj_priv->agp_type = AGP_USER_CACHED_MEMORY;
591 780
592 ret = i915_gem_object_pin(obj, 4096); 781 ret = i915_gem_object_pin(obj, 4096, true);
593 if (ret != 0) { 782 if (ret != 0) {
594 goto err_unref; 783 goto err_unref;
595 } 784 }
596 785
597 ring->status_page.gfx_addr = obj_priv->gtt_offset; 786 ring->status_page.gfx_addr = obj->gtt_offset;
598 ring->status_page.page_addr = kmap(obj_priv->pages[0]); 787 ring->status_page.page_addr = kmap(obj->pages[0]);
599 if (ring->status_page.page_addr == NULL) { 788 if (ring->status_page.page_addr == NULL) {
600 memset(&dev_priv->hws_map, 0, sizeof(dev_priv->hws_map)); 789 memset(&dev_priv->hws_map, 0, sizeof(dev_priv->hws_map));
601 goto err_unpin; 790 goto err_unpin;
@@ -603,7 +792,7 @@ static int init_status_page(struct drm_device *dev,
603 ring->status_page.obj = obj; 792 ring->status_page.obj = obj;
604 memset(ring->status_page.page_addr, 0, PAGE_SIZE); 793 memset(ring->status_page.page_addr, 0, PAGE_SIZE);
605 794
606 ring->setup_status_page(dev, ring); 795 intel_ring_setup_status_page(ring);
607 DRM_DEBUG_DRIVER("%s hws offset: 0x%08x\n", 796 DRM_DEBUG_DRIVER("%s hws offset: 0x%08x\n",
608 ring->name, ring->status_page.gfx_addr); 797 ring->name, ring->status_page.gfx_addr);
609 798
@@ -612,23 +801,28 @@ static int init_status_page(struct drm_device *dev,
612err_unpin: 801err_unpin:
613 i915_gem_object_unpin(obj); 802 i915_gem_object_unpin(obj);
614err_unref: 803err_unref:
615 drm_gem_object_unreference(obj); 804 drm_gem_object_unreference(&obj->base);
616err: 805err:
617 return ret; 806 return ret;
618} 807}
619 808
620
621int intel_init_ring_buffer(struct drm_device *dev, 809int intel_init_ring_buffer(struct drm_device *dev,
622 struct intel_ring_buffer *ring) 810 struct intel_ring_buffer *ring)
623{ 811{
624 struct drm_i915_gem_object *obj_priv; 812 struct drm_i915_gem_object *obj;
625 struct drm_gem_object *obj;
626 int ret; 813 int ret;
627 814
628 ring->dev = dev; 815 ring->dev = dev;
816 INIT_LIST_HEAD(&ring->active_list);
817 INIT_LIST_HEAD(&ring->request_list);
818 INIT_LIST_HEAD(&ring->gpu_write_list);
819
820 init_waitqueue_head(&ring->irq_queue);
821 spin_lock_init(&ring->irq_lock);
822 ring->irq_mask = ~0;
629 823
630 if (I915_NEED_GFX_HWS(dev)) { 824 if (I915_NEED_GFX_HWS(dev)) {
631 ret = init_status_page(dev, ring); 825 ret = init_status_page(ring);
632 if (ret) 826 if (ret)
633 return ret; 827 return ret;
634 } 828 }
@@ -640,15 +834,14 @@ int intel_init_ring_buffer(struct drm_device *dev,
640 goto err_hws; 834 goto err_hws;
641 } 835 }
642 836
643 ring->gem_object = obj; 837 ring->obj = obj;
644 838
645 ret = i915_gem_object_pin(obj, ring->alignment); 839 ret = i915_gem_object_pin(obj, PAGE_SIZE, true);
646 if (ret) 840 if (ret)
647 goto err_unref; 841 goto err_unref;
648 842
649 obj_priv = to_intel_bo(obj);
650 ring->map.size = ring->size; 843 ring->map.size = ring->size;
651 ring->map.offset = dev->agp->base + obj_priv->gtt_offset; 844 ring->map.offset = dev->agp->base + obj->gtt_offset;
652 ring->map.type = 0; 845 ring->map.type = 0;
653 ring->map.flags = 0; 846 ring->map.flags = 0;
654 ring->map.mtrr = 0; 847 ring->map.mtrr = 0;
@@ -661,58 +854,68 @@ int intel_init_ring_buffer(struct drm_device *dev,
661 } 854 }
662 855
663 ring->virtual_start = ring->map.handle; 856 ring->virtual_start = ring->map.handle;
664 ret = ring->init(dev, ring); 857 ret = ring->init(ring);
665 if (ret) 858 if (ret)
666 goto err_unmap; 859 goto err_unmap;
667 860
668 if (!drm_core_check_feature(dev, DRIVER_MODESET)) 861 /* Workaround an erratum on the i830 which causes a hang if
669 i915_kernel_lost_context(dev); 862 * the TAIL pointer points to within the last 2 cachelines
670 else { 863 * of the buffer.
671 ring->head = ring->get_head(dev, ring); 864 */
672 ring->tail = ring->get_tail(dev, ring); 865 ring->effective_size = ring->size;
673 ring->space = ring->head - (ring->tail + 8); 866 if (IS_I830(ring->dev))
674 if (ring->space < 0) 867 ring->effective_size -= 128;
675 ring->space += ring->size; 868
676 } 869 return 0;
677 INIT_LIST_HEAD(&ring->active_list);
678 INIT_LIST_HEAD(&ring->request_list);
679 return ret;
680 870
681err_unmap: 871err_unmap:
682 drm_core_ioremapfree(&ring->map, dev); 872 drm_core_ioremapfree(&ring->map, dev);
683err_unpin: 873err_unpin:
684 i915_gem_object_unpin(obj); 874 i915_gem_object_unpin(obj);
685err_unref: 875err_unref:
686 drm_gem_object_unreference(obj); 876 drm_gem_object_unreference(&obj->base);
687 ring->gem_object = NULL; 877 ring->obj = NULL;
688err_hws: 878err_hws:
689 cleanup_status_page(dev, ring); 879 cleanup_status_page(ring);
690 return ret; 880 return ret;
691} 881}
692 882
693void intel_cleanup_ring_buffer(struct drm_device *dev, 883void intel_cleanup_ring_buffer(struct intel_ring_buffer *ring)
694 struct intel_ring_buffer *ring)
695{ 884{
696 if (ring->gem_object == NULL) 885 struct drm_i915_private *dev_priv;
886 int ret;
887
888 if (ring->obj == NULL)
697 return; 889 return;
698 890
699 drm_core_ioremapfree(&ring->map, dev); 891 /* Disable the ring buffer. The ring must be idle at this point */
892 dev_priv = ring->dev->dev_private;
893 ret = intel_wait_ring_idle(ring);
894 if (ret)
895 DRM_ERROR("failed to quiesce %s whilst cleaning up: %d\n",
896 ring->name, ret);
897
898 I915_WRITE_CTL(ring, 0);
700 899
701 i915_gem_object_unpin(ring->gem_object); 900 drm_core_ioremapfree(&ring->map, ring->dev);
702 drm_gem_object_unreference(ring->gem_object); 901
703 ring->gem_object = NULL; 902 i915_gem_object_unpin(ring->obj);
704 cleanup_status_page(dev, ring); 903 drm_gem_object_unreference(&ring->obj->base);
904 ring->obj = NULL;
905
906 if (ring->cleanup)
907 ring->cleanup(ring);
908
909 cleanup_status_page(ring);
705} 910}
706 911
707int intel_wrap_ring_buffer(struct drm_device *dev, 912static int intel_wrap_ring_buffer(struct intel_ring_buffer *ring)
708 struct intel_ring_buffer *ring)
709{ 913{
710 unsigned int *virt; 914 unsigned int *virt;
711 int rem; 915 int rem = ring->size - ring->tail;
712 rem = ring->size - ring->tail;
713 916
714 if (ring->space < rem) { 917 if (ring->space < rem) {
715 int ret = intel_wait_ring_buffer(dev, ring, rem); 918 int ret = intel_wait_ring_buffer(ring, rem);
716 if (ret) 919 if (ret)
717 return ret; 920 return ret;
718 } 921 }
@@ -725,25 +928,36 @@ int intel_wrap_ring_buffer(struct drm_device *dev,
725 } 928 }
726 929
727 ring->tail = 0; 930 ring->tail = 0;
728 ring->space = ring->head - 8; 931 ring->space = ring_space(ring);
729 932
730 return 0; 933 return 0;
731} 934}
732 935
733int intel_wait_ring_buffer(struct drm_device *dev, 936int intel_wait_ring_buffer(struct intel_ring_buffer *ring, int n)
734 struct intel_ring_buffer *ring, int n)
735{ 937{
938 struct drm_device *dev = ring->dev;
939 struct drm_i915_private *dev_priv = dev->dev_private;
736 unsigned long end; 940 unsigned long end;
941 u32 head;
942
943 /* If the reported head position has wrapped or hasn't advanced,
944 * fallback to the slow and accurate path.
945 */
946 head = intel_read_status_page(ring, 4);
947 if (head > ring->head) {
948 ring->head = head;
949 ring->space = ring_space(ring);
950 if (ring->space >= n)
951 return 0;
952 }
737 953
738 trace_i915_ring_wait_begin (dev); 954 trace_i915_ring_wait_begin(ring);
739 end = jiffies + 3 * HZ; 955 end = jiffies + 3 * HZ;
740 do { 956 do {
741 ring->head = ring->get_head(dev, ring); 957 ring->head = I915_READ_HEAD(ring);
742 ring->space = ring->head - (ring->tail + 8); 958 ring->space = ring_space(ring);
743 if (ring->space < 0)
744 ring->space += ring->size;
745 if (ring->space >= n) { 959 if (ring->space >= n) {
746 trace_i915_ring_wait_end (dev); 960 trace_i915_ring_wait_end(ring);
747 return 0; 961 return 0;
748 } 962 }
749 963
@@ -753,116 +967,404 @@ int intel_wait_ring_buffer(struct drm_device *dev,
753 master_priv->sarea_priv->perf_boxes |= I915_BOX_WAIT; 967 master_priv->sarea_priv->perf_boxes |= I915_BOX_WAIT;
754 } 968 }
755 969
756 yield(); 970 msleep(1);
971 if (atomic_read(&dev_priv->mm.wedged))
972 return -EAGAIN;
757 } while (!time_after(jiffies, end)); 973 } while (!time_after(jiffies, end));
758 trace_i915_ring_wait_end (dev); 974 trace_i915_ring_wait_end(ring);
759 return -EBUSY; 975 return -EBUSY;
760} 976}
761 977
762void intel_ring_begin(struct drm_device *dev, 978int intel_ring_begin(struct intel_ring_buffer *ring,
763 struct intel_ring_buffer *ring, int num_dwords) 979 int num_dwords)
764{ 980{
981 struct drm_i915_private *dev_priv = ring->dev->dev_private;
765 int n = 4*num_dwords; 982 int n = 4*num_dwords;
766 if (unlikely(ring->tail + n > ring->size)) 983 int ret;
767 intel_wrap_ring_buffer(dev, ring);
768 if (unlikely(ring->space < n))
769 intel_wait_ring_buffer(dev, ring, n);
770 984
771 ring->space -= n; 985 if (unlikely(atomic_read(&dev_priv->mm.wedged)))
772} 986 return -EIO;
773 987
774void intel_ring_advance(struct drm_device *dev, 988 if (unlikely(ring->tail + n > ring->effective_size)) {
775 struct intel_ring_buffer *ring) 989 ret = intel_wrap_ring_buffer(ring);
776{ 990 if (unlikely(ret))
777 ring->tail &= ring->size - 1; 991 return ret;
778 ring->advance_ring(dev, ring); 992 }
993
994 if (unlikely(ring->space < n)) {
995 ret = intel_wait_ring_buffer(ring, n);
996 if (unlikely(ret))
997 return ret;
998 }
999
1000 ring->space -= n;
1001 return 0;
779} 1002}
780 1003
781void intel_fill_struct(struct drm_device *dev, 1004void intel_ring_advance(struct intel_ring_buffer *ring)
782 struct intel_ring_buffer *ring,
783 void *data,
784 unsigned int len)
785{ 1005{
786 unsigned int *virt = ring->virtual_start + ring->tail;
787 BUG_ON((len&~(4-1)) != 0);
788 intel_ring_begin(dev, ring, len/4);
789 memcpy(virt, data, len);
790 ring->tail += len;
791 ring->tail &= ring->size - 1; 1006 ring->tail &= ring->size - 1;
792 ring->space -= len; 1007 ring->write_tail(ring, ring->tail);
793 intel_ring_advance(dev, ring);
794} 1008}
795 1009
796struct intel_ring_buffer render_ring = { 1010static const struct intel_ring_buffer render_ring = {
797 .name = "render ring", 1011 .name = "render ring",
798 .regs = { 1012 .id = RING_RENDER,
799 .ctl = PRB0_CTL, 1013 .mmio_base = RENDER_RING_BASE,
800 .head = PRB0_HEAD,
801 .tail = PRB0_TAIL,
802 .start = PRB0_START
803 },
804 .ring_flag = I915_EXEC_RENDER,
805 .size = 32 * PAGE_SIZE, 1014 .size = 32 * PAGE_SIZE,
806 .alignment = PAGE_SIZE,
807 .virtual_start = NULL,
808 .dev = NULL,
809 .gem_object = NULL,
810 .head = 0,
811 .tail = 0,
812 .space = 0,
813 .user_irq_refcount = 0,
814 .irq_gem_seqno = 0,
815 .waiting_gem_seqno = 0,
816 .setup_status_page = render_setup_status_page,
817 .init = init_render_ring, 1015 .init = init_render_ring,
818 .get_head = render_ring_get_head, 1016 .write_tail = ring_write_tail,
819 .get_tail = render_ring_get_tail,
820 .get_active_head = render_ring_get_active_head,
821 .advance_ring = render_ring_advance_ring,
822 .flush = render_ring_flush, 1017 .flush = render_ring_flush,
823 .add_request = render_ring_add_request, 1018 .add_request = render_ring_add_request,
824 .get_gem_seqno = render_ring_get_gem_seqno, 1019 .get_seqno = ring_get_seqno,
825 .user_irq_get = render_ring_get_user_irq, 1020 .irq_get = render_ring_get_irq,
826 .user_irq_put = render_ring_put_user_irq, 1021 .irq_put = render_ring_put_irq,
827 .dispatch_gem_execbuffer = render_ring_dispatch_gem_execbuffer, 1022 .dispatch_execbuffer = render_ring_dispatch_execbuffer,
828 .status_page = {NULL, 0, NULL}, 1023 .cleanup = render_ring_cleanup,
829 .map = {0,}
830}; 1024};
831 1025
832/* ring buffer for bit-stream decoder */ 1026/* ring buffer for bit-stream decoder */
833 1027
834struct intel_ring_buffer bsd_ring = { 1028static const struct intel_ring_buffer bsd_ring = {
835 .name = "bsd ring", 1029 .name = "bsd ring",
836 .regs = { 1030 .id = RING_BSD,
837 .ctl = BSD_RING_CTL, 1031 .mmio_base = BSD_RING_BASE,
838 .head = BSD_RING_HEAD,
839 .tail = BSD_RING_TAIL,
840 .start = BSD_RING_START
841 },
842 .ring_flag = I915_EXEC_BSD,
843 .size = 32 * PAGE_SIZE, 1032 .size = 32 * PAGE_SIZE,
844 .alignment = PAGE_SIZE, 1033 .init = init_ring_common,
845 .virtual_start = NULL, 1034 .write_tail = ring_write_tail,
846 .dev = NULL,
847 .gem_object = NULL,
848 .head = 0,
849 .tail = 0,
850 .space = 0,
851 .user_irq_refcount = 0,
852 .irq_gem_seqno = 0,
853 .waiting_gem_seqno = 0,
854 .setup_status_page = bsd_setup_status_page,
855 .init = init_bsd_ring,
856 .get_head = bsd_ring_get_head,
857 .get_tail = bsd_ring_get_tail,
858 .get_active_head = bsd_ring_get_active_head,
859 .advance_ring = bsd_ring_advance_ring,
860 .flush = bsd_ring_flush, 1035 .flush = bsd_ring_flush,
861 .add_request = bsd_ring_add_request, 1036 .add_request = ring_add_request,
862 .get_gem_seqno = bsd_ring_get_gem_seqno, 1037 .get_seqno = ring_get_seqno,
863 .user_irq_get = bsd_ring_get_user_irq, 1038 .irq_get = bsd_ring_get_irq,
864 .user_irq_put = bsd_ring_put_user_irq, 1039 .irq_put = bsd_ring_put_irq,
865 .dispatch_gem_execbuffer = bsd_ring_dispatch_gem_execbuffer, 1040 .dispatch_execbuffer = ring_dispatch_execbuffer,
866 .status_page = {NULL, 0, NULL}, 1041};
867 .map = {0,} 1042
1043
1044static void gen6_bsd_ring_write_tail(struct intel_ring_buffer *ring,
1045 u32 value)
1046{
1047 drm_i915_private_t *dev_priv = ring->dev->dev_private;
1048
1049 /* Every tail move must follow the sequence below */
1050 I915_WRITE(GEN6_BSD_SLEEP_PSMI_CONTROL,
1051 GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_MODIFY_MASK |
1052 GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_DISABLE);
1053 I915_WRITE(GEN6_BSD_RNCID, 0x0);
1054
1055 if (wait_for((I915_READ(GEN6_BSD_SLEEP_PSMI_CONTROL) &
1056 GEN6_BSD_SLEEP_PSMI_CONTROL_IDLE_INDICATOR) == 0,
1057 50))
1058 DRM_ERROR("timed out waiting for IDLE Indicator\n");
1059
1060 I915_WRITE_TAIL(ring, value);
1061 I915_WRITE(GEN6_BSD_SLEEP_PSMI_CONTROL,
1062 GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_MODIFY_MASK |
1063 GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_ENABLE);
1064}
1065
1066static int gen6_ring_flush(struct intel_ring_buffer *ring,
1067 u32 invalidate, u32 flush)
1068{
1069 uint32_t cmd;
1070 int ret;
1071
1072 ret = intel_ring_begin(ring, 4);
1073 if (ret)
1074 return ret;
1075
1076 cmd = MI_FLUSH_DW;
1077 if (invalidate & I915_GEM_GPU_DOMAINS)
1078 cmd |= MI_INVALIDATE_TLB | MI_INVALIDATE_BSD;
1079 intel_ring_emit(ring, cmd);
1080 intel_ring_emit(ring, 0);
1081 intel_ring_emit(ring, 0);
1082 intel_ring_emit(ring, MI_NOOP);
1083 intel_ring_advance(ring);
1084 return 0;
1085}
1086
1087static int
1088gen6_ring_dispatch_execbuffer(struct intel_ring_buffer *ring,
1089 u32 offset, u32 len)
1090{
1091 int ret;
1092
1093 ret = intel_ring_begin(ring, 2);
1094 if (ret)
1095 return ret;
1096
1097 intel_ring_emit(ring, MI_BATCH_BUFFER_START | MI_BATCH_NON_SECURE_I965);
1098 /* bit0-7 is the length on GEN6+ */
1099 intel_ring_emit(ring, offset);
1100 intel_ring_advance(ring);
1101
1102 return 0;
1103}
1104
1105static bool
1106gen6_render_ring_get_irq(struct intel_ring_buffer *ring)
1107{
1108 return gen6_ring_get_irq(ring,
1109 GT_USER_INTERRUPT,
1110 GEN6_RENDER_USER_INTERRUPT);
1111}
1112
1113static void
1114gen6_render_ring_put_irq(struct intel_ring_buffer *ring)
1115{
1116 return gen6_ring_put_irq(ring,
1117 GT_USER_INTERRUPT,
1118 GEN6_RENDER_USER_INTERRUPT);
1119}
1120
1121static bool
1122gen6_bsd_ring_get_irq(struct intel_ring_buffer *ring)
1123{
1124 return gen6_ring_get_irq(ring,
1125 GT_GEN6_BSD_USER_INTERRUPT,
1126 GEN6_BSD_USER_INTERRUPT);
1127}
1128
1129static void
1130gen6_bsd_ring_put_irq(struct intel_ring_buffer *ring)
1131{
1132 return gen6_ring_put_irq(ring,
1133 GT_GEN6_BSD_USER_INTERRUPT,
1134 GEN6_BSD_USER_INTERRUPT);
1135}
1136
1137/* ring buffer for Video Codec for Gen6+ */
1138static const struct intel_ring_buffer gen6_bsd_ring = {
1139 .name = "gen6 bsd ring",
1140 .id = RING_BSD,
1141 .mmio_base = GEN6_BSD_RING_BASE,
1142 .size = 32 * PAGE_SIZE,
1143 .init = init_ring_common,
1144 .write_tail = gen6_bsd_ring_write_tail,
1145 .flush = gen6_ring_flush,
1146 .add_request = gen6_add_request,
1147 .get_seqno = ring_get_seqno,
1148 .irq_get = gen6_bsd_ring_get_irq,
1149 .irq_put = gen6_bsd_ring_put_irq,
1150 .dispatch_execbuffer = gen6_ring_dispatch_execbuffer,
1151};
1152
1153/* Blitter support (SandyBridge+) */
1154
1155static bool
1156blt_ring_get_irq(struct intel_ring_buffer *ring)
1157{
1158 return gen6_ring_get_irq(ring,
1159 GT_BLT_USER_INTERRUPT,
1160 GEN6_BLITTER_USER_INTERRUPT);
1161}
1162
1163static void
1164blt_ring_put_irq(struct intel_ring_buffer *ring)
1165{
1166 gen6_ring_put_irq(ring,
1167 GT_BLT_USER_INTERRUPT,
1168 GEN6_BLITTER_USER_INTERRUPT);
1169}
1170
1171
1172/* Workaround for some stepping of SNB,
1173 * each time when BLT engine ring tail moved,
1174 * the first command in the ring to be parsed
1175 * should be MI_BATCH_BUFFER_START
1176 */
1177#define NEED_BLT_WORKAROUND(dev) \
1178 (IS_GEN6(dev) && (dev->pdev->revision < 8))
1179
1180static inline struct drm_i915_gem_object *
1181to_blt_workaround(struct intel_ring_buffer *ring)
1182{
1183 return ring->private;
1184}
1185
1186static int blt_ring_init(struct intel_ring_buffer *ring)
1187{
1188 if (NEED_BLT_WORKAROUND(ring->dev)) {
1189 struct drm_i915_gem_object *obj;
1190 u32 *ptr;
1191 int ret;
1192
1193 obj = i915_gem_alloc_object(ring->dev, 4096);
1194 if (obj == NULL)
1195 return -ENOMEM;
1196
1197 ret = i915_gem_object_pin(obj, 4096, true);
1198 if (ret) {
1199 drm_gem_object_unreference(&obj->base);
1200 return ret;
1201 }
1202
1203 ptr = kmap(obj->pages[0]);
1204 *ptr++ = MI_BATCH_BUFFER_END;
1205 *ptr++ = MI_NOOP;
1206 kunmap(obj->pages[0]);
1207
1208 ret = i915_gem_object_set_to_gtt_domain(obj, false);
1209 if (ret) {
1210 i915_gem_object_unpin(obj);
1211 drm_gem_object_unreference(&obj->base);
1212 return ret;
1213 }
1214
1215 ring->private = obj;
1216 }
1217
1218 return init_ring_common(ring);
1219}
1220
1221static int blt_ring_begin(struct intel_ring_buffer *ring,
1222 int num_dwords)
1223{
1224 if (ring->private) {
1225 int ret = intel_ring_begin(ring, num_dwords+2);
1226 if (ret)
1227 return ret;
1228
1229 intel_ring_emit(ring, MI_BATCH_BUFFER_START);
1230 intel_ring_emit(ring, to_blt_workaround(ring)->gtt_offset);
1231
1232 return 0;
1233 } else
1234 return intel_ring_begin(ring, 4);
1235}
1236
1237static int blt_ring_flush(struct intel_ring_buffer *ring,
1238 u32 invalidate, u32 flush)
1239{
1240 uint32_t cmd;
1241 int ret;
1242
1243 ret = blt_ring_begin(ring, 4);
1244 if (ret)
1245 return ret;
1246
1247 cmd = MI_FLUSH_DW;
1248 if (invalidate & I915_GEM_DOMAIN_RENDER)
1249 cmd |= MI_INVALIDATE_TLB;
1250 intel_ring_emit(ring, cmd);
1251 intel_ring_emit(ring, 0);
1252 intel_ring_emit(ring, 0);
1253 intel_ring_emit(ring, MI_NOOP);
1254 intel_ring_advance(ring);
1255 return 0;
1256}
1257
1258static void blt_ring_cleanup(struct intel_ring_buffer *ring)
1259{
1260 if (!ring->private)
1261 return;
1262
1263 i915_gem_object_unpin(ring->private);
1264 drm_gem_object_unreference(ring->private);
1265 ring->private = NULL;
1266}
1267
1268static const struct intel_ring_buffer gen6_blt_ring = {
1269 .name = "blt ring",
1270 .id = RING_BLT,
1271 .mmio_base = BLT_RING_BASE,
1272 .size = 32 * PAGE_SIZE,
1273 .init = blt_ring_init,
1274 .write_tail = ring_write_tail,
1275 .flush = blt_ring_flush,
1276 .add_request = gen6_add_request,
1277 .get_seqno = ring_get_seqno,
1278 .irq_get = blt_ring_get_irq,
1279 .irq_put = blt_ring_put_irq,
1280 .dispatch_execbuffer = gen6_ring_dispatch_execbuffer,
1281 .cleanup = blt_ring_cleanup,
868}; 1282};
1283
1284int intel_init_render_ring_buffer(struct drm_device *dev)
1285{
1286 drm_i915_private_t *dev_priv = dev->dev_private;
1287 struct intel_ring_buffer *ring = &dev_priv->ring[RCS];
1288
1289 *ring = render_ring;
1290 if (INTEL_INFO(dev)->gen >= 6) {
1291 ring->add_request = gen6_add_request;
1292 ring->irq_get = gen6_render_ring_get_irq;
1293 ring->irq_put = gen6_render_ring_put_irq;
1294 } else if (IS_GEN5(dev)) {
1295 ring->add_request = pc_render_add_request;
1296 ring->get_seqno = pc_render_get_seqno;
1297 }
1298
1299 if (!I915_NEED_GFX_HWS(dev)) {
1300 ring->status_page.page_addr = dev_priv->status_page_dmah->vaddr;
1301 memset(ring->status_page.page_addr, 0, PAGE_SIZE);
1302 }
1303
1304 return intel_init_ring_buffer(dev, ring);
1305}
1306
1307int intel_render_ring_init_dri(struct drm_device *dev, u64 start, u32 size)
1308{
1309 drm_i915_private_t *dev_priv = dev->dev_private;
1310 struct intel_ring_buffer *ring = &dev_priv->ring[RCS];
1311
1312 *ring = render_ring;
1313 if (INTEL_INFO(dev)->gen >= 6) {
1314 ring->add_request = gen6_add_request;
1315 ring->irq_get = gen6_render_ring_get_irq;
1316 ring->irq_put = gen6_render_ring_put_irq;
1317 } else if (IS_GEN5(dev)) {
1318 ring->add_request = pc_render_add_request;
1319 ring->get_seqno = pc_render_get_seqno;
1320 }
1321
1322 ring->dev = dev;
1323 INIT_LIST_HEAD(&ring->active_list);
1324 INIT_LIST_HEAD(&ring->request_list);
1325 INIT_LIST_HEAD(&ring->gpu_write_list);
1326
1327 ring->size = size;
1328 ring->effective_size = ring->size;
1329 if (IS_I830(ring->dev))
1330 ring->effective_size -= 128;
1331
1332 ring->map.offset = start;
1333 ring->map.size = size;
1334 ring->map.type = 0;
1335 ring->map.flags = 0;
1336 ring->map.mtrr = 0;
1337
1338 drm_core_ioremap_wc(&ring->map, dev);
1339 if (ring->map.handle == NULL) {
1340 DRM_ERROR("can not ioremap virtual address for"
1341 " ring buffer\n");
1342 return -ENOMEM;
1343 }
1344
1345 ring->virtual_start = (void __force __iomem *)ring->map.handle;
1346 return 0;
1347}
1348
1349int intel_init_bsd_ring_buffer(struct drm_device *dev)
1350{
1351 drm_i915_private_t *dev_priv = dev->dev_private;
1352 struct intel_ring_buffer *ring = &dev_priv->ring[VCS];
1353
1354 if (IS_GEN6(dev) || IS_GEN7(dev))
1355 *ring = gen6_bsd_ring;
1356 else
1357 *ring = bsd_ring;
1358
1359 return intel_init_ring_buffer(dev, ring);
1360}
1361
1362int intel_init_blt_ring_buffer(struct drm_device *dev)
1363{
1364 drm_i915_private_t *dev_priv = dev->dev_private;
1365 struct intel_ring_buffer *ring = &dev_priv->ring[BCS];
1366
1367 *ring = gen6_blt_ring;
1368
1369 return intel_init_ring_buffer(dev, ring);
1370}
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h
index 525e7d3edda8..39ac2b634ae5 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.h
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.h
@@ -1,69 +1,80 @@
1#ifndef _INTEL_RINGBUFFER_H_ 1#ifndef _INTEL_RINGBUFFER_H_
2#define _INTEL_RINGBUFFER_H_ 2#define _INTEL_RINGBUFFER_H_
3 3
4enum {
5 RCS = 0x0,
6 VCS,
7 BCS,
8 I915_NUM_RINGS,
9};
10
4struct intel_hw_status_page { 11struct intel_hw_status_page {
5 void *page_addr; 12 u32 __iomem *page_addr;
6 unsigned int gfx_addr; 13 unsigned int gfx_addr;
7 struct drm_gem_object *obj; 14 struct drm_i915_gem_object *obj;
8}; 15};
9 16
10struct drm_i915_gem_execbuffer2; 17#define I915_READ_TAIL(ring) I915_READ(RING_TAIL((ring)->mmio_base))
18#define I915_WRITE_TAIL(ring, val) I915_WRITE(RING_TAIL((ring)->mmio_base), val)
19
20#define I915_READ_START(ring) I915_READ(RING_START((ring)->mmio_base))
21#define I915_WRITE_START(ring, val) I915_WRITE(RING_START((ring)->mmio_base), val)
22
23#define I915_READ_HEAD(ring) I915_READ(RING_HEAD((ring)->mmio_base))
24#define I915_WRITE_HEAD(ring, val) I915_WRITE(RING_HEAD((ring)->mmio_base), val)
25
26#define I915_READ_CTL(ring) I915_READ(RING_CTL((ring)->mmio_base))
27#define I915_WRITE_CTL(ring, val) I915_WRITE(RING_CTL((ring)->mmio_base), val)
28
29#define I915_READ_IMR(ring) I915_READ(RING_IMR((ring)->mmio_base))
30#define I915_WRITE_IMR(ring, val) I915_WRITE(RING_IMR((ring)->mmio_base), val)
31
32#define I915_READ_NOPID(ring) I915_READ(RING_NOPID((ring)->mmio_base))
33#define I915_READ_SYNC_0(ring) I915_READ(RING_SYNC_0((ring)->mmio_base))
34#define I915_READ_SYNC_1(ring) I915_READ(RING_SYNC_1((ring)->mmio_base))
35
11struct intel_ring_buffer { 36struct intel_ring_buffer {
12 const char *name; 37 const char *name;
13 struct ring_regs { 38 enum intel_ring_id {
14 u32 ctl; 39 RING_RENDER = 0x1,
15 u32 head; 40 RING_BSD = 0x2,
16 u32 tail; 41 RING_BLT = 0x4,
17 u32 start; 42 } id;
18 } regs; 43 u32 mmio_base;
19 unsigned int ring_flag; 44 void __iomem *virtual_start;
20 unsigned long size;
21 unsigned int alignment;
22 void *virtual_start;
23 struct drm_device *dev; 45 struct drm_device *dev;
24 struct drm_gem_object *gem_object; 46 struct drm_i915_gem_object *obj;
25 47
26 unsigned int head; 48 u32 head;
27 unsigned int tail; 49 u32 tail;
28 unsigned int space; 50 int space;
51 int size;
52 int effective_size;
29 struct intel_hw_status_page status_page; 53 struct intel_hw_status_page status_page;
30 54
31 u32 irq_gem_seqno; /* last seq seem at irq time */ 55 spinlock_t irq_lock;
32 u32 waiting_gem_seqno; 56 u32 irq_refcount;
33 int user_irq_refcount; 57 u32 irq_mask;
34 void (*user_irq_get)(struct drm_device *dev, 58 u32 irq_seqno; /* last seq seem at irq time */
35 struct intel_ring_buffer *ring); 59 u32 trace_irq_seqno;
36 void (*user_irq_put)(struct drm_device *dev, 60 u32 waiting_seqno;
37 struct intel_ring_buffer *ring); 61 u32 sync_seqno[I915_NUM_RINGS-1];
38 void (*setup_status_page)(struct drm_device *dev, 62 bool __must_check (*irq_get)(struct intel_ring_buffer *ring);
39 struct intel_ring_buffer *ring); 63 void (*irq_put)(struct intel_ring_buffer *ring);
40 64
41 int (*init)(struct drm_device *dev, 65 int (*init)(struct intel_ring_buffer *ring);
42 struct intel_ring_buffer *ring); 66
43 67 void (*write_tail)(struct intel_ring_buffer *ring,
44 unsigned int (*get_head)(struct drm_device *dev, 68 u32 value);
45 struct intel_ring_buffer *ring); 69 int __must_check (*flush)(struct intel_ring_buffer *ring,
46 unsigned int (*get_tail)(struct drm_device *dev, 70 u32 invalidate_domains,
47 struct intel_ring_buffer *ring); 71 u32 flush_domains);
48 unsigned int (*get_active_head)(struct drm_device *dev, 72 int (*add_request)(struct intel_ring_buffer *ring,
49 struct intel_ring_buffer *ring); 73 u32 *seqno);
50 void (*advance_ring)(struct drm_device *dev, 74 u32 (*get_seqno)(struct intel_ring_buffer *ring);
51 struct intel_ring_buffer *ring); 75 int (*dispatch_execbuffer)(struct intel_ring_buffer *ring,
52 void (*flush)(struct drm_device *dev, 76 u32 offset, u32 length);
53 struct intel_ring_buffer *ring, 77 void (*cleanup)(struct intel_ring_buffer *ring);
54 u32 invalidate_domains,
55 u32 flush_domains);
56 u32 (*add_request)(struct drm_device *dev,
57 struct intel_ring_buffer *ring,
58 struct drm_file *file_priv,
59 u32 flush_domains);
60 u32 (*get_gem_seqno)(struct drm_device *dev,
61 struct intel_ring_buffer *ring);
62 int (*dispatch_gem_execbuffer)(struct drm_device *dev,
63 struct intel_ring_buffer *ring,
64 struct drm_i915_gem_execbuffer2 *exec,
65 struct drm_clip_rect *cliprects,
66 uint64_t exec_offset);
67 78
68 /** 79 /**
69 * List of objects currently involved in rendering from the 80 * List of objects currently involved in rendering from the
@@ -83,49 +94,110 @@ struct intel_ring_buffer {
83 */ 94 */
84 struct list_head request_list; 95 struct list_head request_list;
85 96
97 /**
98 * List of objects currently pending a GPU write flush.
99 *
100 * All elements on this list will belong to either the
101 * active_list or flushing_list, last_rendering_seqno can
102 * be used to differentiate between the two elements.
103 */
104 struct list_head gpu_write_list;
105
106 /**
107 * Do we have some not yet emitted requests outstanding?
108 */
109 u32 outstanding_lazy_request;
110
86 wait_queue_head_t irq_queue; 111 wait_queue_head_t irq_queue;
87 drm_local_map_t map; 112 drm_local_map_t map;
113
114 void *private;
88}; 115};
89 116
90static inline u32 117static inline u32
118intel_ring_sync_index(struct intel_ring_buffer *ring,
119 struct intel_ring_buffer *other)
120{
121 int idx;
122
123 /*
124 * cs -> 0 = vcs, 1 = bcs
125 * vcs -> 0 = bcs, 1 = cs,
126 * bcs -> 0 = cs, 1 = vcs.
127 */
128
129 idx = (other - ring) - 1;
130 if (idx < 0)
131 idx += I915_NUM_RINGS;
132
133 return idx;
134}
135
136static inline u32
91intel_read_status_page(struct intel_ring_buffer *ring, 137intel_read_status_page(struct intel_ring_buffer *ring,
92 int reg) 138 int reg)
139{
140 return ioread32(ring->status_page.page_addr + reg);
141}
142
143/**
144 * Reads a dword out of the status page, which is written to from the command
145 * queue by automatic updates, MI_REPORT_HEAD, MI_STORE_DATA_INDEX, or
146 * MI_STORE_DATA_IMM.
147 *
148 * The following dwords have a reserved meaning:
149 * 0x00: ISR copy, updated when an ISR bit not set in the HWSTAM changes.
150 * 0x04: ring 0 head pointer
151 * 0x05: ring 1 head pointer (915-class)
152 * 0x06: ring 2 head pointer (915-class)
153 * 0x10-0x1b: Context status DWords (GM45)
154 * 0x1f: Last written status offset. (GM45)
155 *
156 * The area from dword 0x20 to 0x3ff is available for driver usage.
157 */
158#define READ_HWSP(dev_priv, reg) intel_read_status_page(LP_RING(dev_priv), reg)
159#define READ_BREADCRUMB(dev_priv) READ_HWSP(dev_priv, I915_BREADCRUMB_INDEX)
160#define I915_GEM_HWS_INDEX 0x20
161#define I915_BREADCRUMB_INDEX 0x21
162
163void intel_cleanup_ring_buffer(struct intel_ring_buffer *ring);
164
165int __must_check intel_wait_ring_buffer(struct intel_ring_buffer *ring, int n);
166static inline int intel_wait_ring_idle(struct intel_ring_buffer *ring)
93{ 167{
94 u32 *regs = ring->status_page.page_addr; 168 return intel_wait_ring_buffer(ring, ring->size - 8);
95 return regs[reg];
96} 169}
97 170
98int intel_init_ring_buffer(struct drm_device *dev, 171int __must_check intel_ring_begin(struct intel_ring_buffer *ring, int n);
99 struct intel_ring_buffer *ring); 172
100void intel_cleanup_ring_buffer(struct drm_device *dev, 173static inline void intel_ring_emit(struct intel_ring_buffer *ring,
101 struct intel_ring_buffer *ring); 174 u32 data)
102int intel_wait_ring_buffer(struct drm_device *dev,
103 struct intel_ring_buffer *ring, int n);
104int intel_wrap_ring_buffer(struct drm_device *dev,
105 struct intel_ring_buffer *ring);
106void intel_ring_begin(struct drm_device *dev,
107 struct intel_ring_buffer *ring, int n);
108
109static inline void intel_ring_emit(struct drm_device *dev,
110 struct intel_ring_buffer *ring,
111 unsigned int data)
112{ 175{
113 unsigned int *virt = ring->virtual_start + ring->tail; 176 iowrite32(data, ring->virtual_start + ring->tail);
114 *virt = data;
115 ring->tail += 4; 177 ring->tail += 4;
116} 178}
117 179
118void intel_fill_struct(struct drm_device *dev, 180void intel_ring_advance(struct intel_ring_buffer *ring);
119 struct intel_ring_buffer *ring, 181
120 void *data, 182u32 intel_ring_get_seqno(struct intel_ring_buffer *ring);
121 unsigned int len); 183int intel_ring_sync(struct intel_ring_buffer *ring,
122void intel_ring_advance(struct drm_device *dev, 184 struct intel_ring_buffer *to,
123 struct intel_ring_buffer *ring); 185 u32 seqno);
124 186
125u32 intel_ring_get_seqno(struct drm_device *dev, 187int intel_init_render_ring_buffer(struct drm_device *dev);
126 struct intel_ring_buffer *ring); 188int intel_init_bsd_ring_buffer(struct drm_device *dev);
189int intel_init_blt_ring_buffer(struct drm_device *dev);
190
191u32 intel_ring_get_active_head(struct intel_ring_buffer *ring);
192void intel_ring_setup_status_page(struct intel_ring_buffer *ring);
193
194static inline void i915_trace_irq_get(struct intel_ring_buffer *ring, u32 seqno)
195{
196 if (ring->trace_irq_seqno == 0 && ring->irq_get(ring))
197 ring->trace_irq_seqno = seqno;
198}
127 199
128extern struct intel_ring_buffer render_ring; 200/* DRI warts */
129extern struct intel_ring_buffer bsd_ring; 201int intel_render_ring_init_dri(struct drm_device *dev, u64 start, u32 size);
130 202
131#endif /* _INTEL_RINGBUFFER_H_ */ 203#endif /* _INTEL_RINGBUFFER_H_ */
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c
index ee73e428a84a..30fe554d8936 100644
--- a/drivers/gpu/drm/i915/intel_sdvo.c
+++ b/drivers/gpu/drm/i915/intel_sdvo.c
@@ -46,6 +46,7 @@
46 SDVO_TV_MASK) 46 SDVO_TV_MASK)
47 47
48#define IS_TV(c) (c->output_flag & SDVO_TV_MASK) 48#define IS_TV(c) (c->output_flag & SDVO_TV_MASK)
49#define IS_TMDS(c) (c->output_flag & SDVO_TMDS_MASK)
49#define IS_LVDS(c) (c->output_flag & SDVO_LVDS_MASK) 50#define IS_LVDS(c) (c->output_flag & SDVO_LVDS_MASK)
50#define IS_TV_OR_LVDS(c) (c->output_flag & (SDVO_TV_MASK | SDVO_LVDS_MASK)) 51#define IS_TV_OR_LVDS(c) (c->output_flag & (SDVO_TV_MASK | SDVO_LVDS_MASK))
51 52
@@ -65,8 +66,11 @@ static const char *tv_format_names[] = {
65struct intel_sdvo { 66struct intel_sdvo {
66 struct intel_encoder base; 67 struct intel_encoder base;
67 68
69 struct i2c_adapter *i2c;
68 u8 slave_addr; 70 u8 slave_addr;
69 71
72 struct i2c_adapter ddc;
73
70 /* Register for the SDVO device: SDVOB or SDVOC */ 74 /* Register for the SDVO device: SDVOB or SDVOC */
71 int sdvo_reg; 75 int sdvo_reg;
72 76
@@ -89,6 +93,12 @@ struct intel_sdvo {
89 uint16_t attached_output; 93 uint16_t attached_output;
90 94
91 /** 95 /**
96 * This is used to select the color range of RBG outputs in HDMI mode.
97 * It is only valid when using TMDS encoding and 8 bit per color mode.
98 */
99 uint32_t color_range;
100
101 /**
92 * This is set if we're going to treat the device as TV-out. 102 * This is set if we're going to treat the device as TV-out.
93 * 103 *
94 * While we have these nice friendly flags for output types that ought 104 * While we have these nice friendly flags for output types that ought
@@ -104,34 +114,25 @@ struct intel_sdvo {
104 * This is set if we treat the device as HDMI, instead of DVI. 114 * This is set if we treat the device as HDMI, instead of DVI.
105 */ 115 */
106 bool is_hdmi; 116 bool is_hdmi;
117 bool has_hdmi_monitor;
118 bool has_hdmi_audio;
107 119
108 /** 120 /**
109 * This is set if we detect output of sdvo device as LVDS. 121 * This is set if we detect output of sdvo device as LVDS and
122 * have a valid fixed mode to use with the panel.
110 */ 123 */
111 bool is_lvds; 124 bool is_lvds;
112 125
113 /** 126 /**
114 * This is sdvo flags for input timing.
115 */
116 uint8_t sdvo_flags;
117
118 /**
119 * This is sdvo fixed pannel mode pointer 127 * This is sdvo fixed pannel mode pointer
120 */ 128 */
121 struct drm_display_mode *sdvo_lvds_fixed_mode; 129 struct drm_display_mode *sdvo_lvds_fixed_mode;
122 130
123 /*
124 * supported encoding mode, used to determine whether HDMI is
125 * supported
126 */
127 struct intel_sdvo_encode encode;
128
129 /* DDC bus used by this SDVO encoder */ 131 /* DDC bus used by this SDVO encoder */
130 uint8_t ddc_bus; 132 uint8_t ddc_bus;
131 133
132 /* Mac mini hack -- use the same DDC as the analog connector */ 134 /* Input timings for adjusted_mode */
133 struct i2c_adapter *analog_ddc_bus; 135 struct intel_sdvo_dtd input_dtd;
134
135}; 136};
136 137
137struct intel_sdvo_connector { 138struct intel_sdvo_connector {
@@ -140,6 +141,8 @@ struct intel_sdvo_connector {
140 /* Mark the type of connector */ 141 /* Mark the type of connector */
141 uint16_t output_flag; 142 uint16_t output_flag;
142 143
144 int force_audio;
145
143 /* This contains all current supported TV format */ 146 /* This contains all current supported TV format */
144 u8 tv_format_supported[TV_FORMAT_NUM]; 147 u8 tv_format_supported[TV_FORMAT_NUM];
145 int format_supported_num; 148 int format_supported_num;
@@ -186,9 +189,15 @@ struct intel_sdvo_connector {
186 u32 cur_dot_crawl, max_dot_crawl; 189 u32 cur_dot_crawl, max_dot_crawl;
187}; 190};
188 191
189static struct intel_sdvo *enc_to_intel_sdvo(struct drm_encoder *encoder) 192static struct intel_sdvo *to_intel_sdvo(struct drm_encoder *encoder)
193{
194 return container_of(encoder, struct intel_sdvo, base.base);
195}
196
197static struct intel_sdvo *intel_attached_sdvo(struct drm_connector *connector)
190{ 198{
191 return container_of(enc_to_intel_encoder(encoder), struct intel_sdvo, base); 199 return container_of(intel_attached_encoder(connector),
200 struct intel_sdvo, base);
192} 201}
193 202
194static struct intel_sdvo_connector *to_intel_sdvo_connector(struct drm_connector *connector) 203static struct intel_sdvo_connector *to_intel_sdvo_connector(struct drm_connector *connector)
@@ -213,7 +222,7 @@ intel_sdvo_create_enhance_property(struct intel_sdvo *intel_sdvo,
213 */ 222 */
214static void intel_sdvo_write_sdvox(struct intel_sdvo *intel_sdvo, u32 val) 223static void intel_sdvo_write_sdvox(struct intel_sdvo *intel_sdvo, u32 val)
215{ 224{
216 struct drm_device *dev = intel_sdvo->base.enc.dev; 225 struct drm_device *dev = intel_sdvo->base.base.dev;
217 struct drm_i915_private *dev_priv = dev->dev_private; 226 struct drm_i915_private *dev_priv = dev->dev_private;
218 u32 bval = val, cval = val; 227 u32 bval = val, cval = val;
219 int i; 228 int i;
@@ -245,49 +254,29 @@ static void intel_sdvo_write_sdvox(struct intel_sdvo *intel_sdvo, u32 val)
245 254
246static bool intel_sdvo_read_byte(struct intel_sdvo *intel_sdvo, u8 addr, u8 *ch) 255static bool intel_sdvo_read_byte(struct intel_sdvo *intel_sdvo, u8 addr, u8 *ch)
247{ 256{
248 u8 out_buf[2] = { addr, 0 };
249 u8 buf[2];
250 struct i2c_msg msgs[] = { 257 struct i2c_msg msgs[] = {
251 { 258 {
252 .addr = intel_sdvo->slave_addr >> 1, 259 .addr = intel_sdvo->slave_addr,
253 .flags = 0, 260 .flags = 0,
254 .len = 1, 261 .len = 1,
255 .buf = out_buf, 262 .buf = &addr,
256 }, 263 },
257 { 264 {
258 .addr = intel_sdvo->slave_addr >> 1, 265 .addr = intel_sdvo->slave_addr,
259 .flags = I2C_M_RD, 266 .flags = I2C_M_RD,
260 .len = 1, 267 .len = 1,
261 .buf = buf, 268 .buf = ch,
262 } 269 }
263 }; 270 };
264 int ret; 271 int ret;
265 272
266 if ((ret = i2c_transfer(intel_sdvo->base.i2c_bus, msgs, 2)) == 2) 273 if ((ret = i2c_transfer(intel_sdvo->i2c, msgs, 2)) == 2)
267 {
268 *ch = buf[0];
269 return true; 274 return true;
270 }
271 275
272 DRM_DEBUG_KMS("i2c transfer returned %d\n", ret); 276 DRM_DEBUG_KMS("i2c transfer returned %d\n", ret);
273 return false; 277 return false;
274} 278}
275 279
276static bool intel_sdvo_write_byte(struct intel_sdvo *intel_sdvo, int addr, u8 ch)
277{
278 u8 out_buf[2] = { addr, ch };
279 struct i2c_msg msgs[] = {
280 {
281 .addr = intel_sdvo->slave_addr >> 1,
282 .flags = 0,
283 .len = 2,
284 .buf = out_buf,
285 }
286 };
287
288 return i2c_transfer(intel_sdvo->base.i2c_bus, msgs, 1) == 1;
289}
290
291#define SDVO_CMD_NAME_ENTRY(cmd) {cmd, #cmd} 280#define SDVO_CMD_NAME_ENTRY(cmd) {cmd, #cmd}
292/** Mapping of command numbers to names, for debug output */ 281/** Mapping of command numbers to names, for debug output */
293static const struct _sdvo_cmd_name { 282static const struct _sdvo_cmd_name {
@@ -432,22 +421,6 @@ static void intel_sdvo_debug_write(struct intel_sdvo *intel_sdvo, u8 cmd,
432 DRM_LOG_KMS("\n"); 421 DRM_LOG_KMS("\n");
433} 422}
434 423
435static bool intel_sdvo_write_cmd(struct intel_sdvo *intel_sdvo, u8 cmd,
436 const void *args, int args_len)
437{
438 int i;
439
440 intel_sdvo_debug_write(intel_sdvo, cmd, args, args_len);
441
442 for (i = 0; i < args_len; i++) {
443 if (!intel_sdvo_write_byte(intel_sdvo, SDVO_I2C_ARG_0 - i,
444 ((u8*)args)[i]))
445 return false;
446 }
447
448 return intel_sdvo_write_byte(intel_sdvo, SDVO_I2C_OPCODE, cmd);
449}
450
451static const char *cmd_status_names[] = { 424static const char *cmd_status_names[] = {
452 "Power on", 425 "Power on",
453 "Success", 426 "Success",
@@ -458,54 +431,108 @@ static const char *cmd_status_names[] = {
458 "Scaling not supported" 431 "Scaling not supported"
459}; 432};
460 433
461static void intel_sdvo_debug_response(struct intel_sdvo *intel_sdvo, 434static bool intel_sdvo_write_cmd(struct intel_sdvo *intel_sdvo, u8 cmd,
462 void *response, int response_len, 435 const void *args, int args_len)
463 u8 status)
464{ 436{
465 int i; 437 u8 buf[args_len*2 + 2], status;
438 struct i2c_msg msgs[args_len + 3];
439 int i, ret;
466 440
467 DRM_DEBUG_KMS("%s: R: ", SDVO_NAME(intel_sdvo)); 441 intel_sdvo_debug_write(intel_sdvo, cmd, args, args_len);
468 for (i = 0; i < response_len; i++) 442
469 DRM_LOG_KMS("%02X ", ((u8 *)response)[i]); 443 for (i = 0; i < args_len; i++) {
470 for (; i < 8; i++) 444 msgs[i].addr = intel_sdvo->slave_addr;
471 DRM_LOG_KMS(" "); 445 msgs[i].flags = 0;
472 if (status <= SDVO_CMD_STATUS_SCALING_NOT_SUPP) 446 msgs[i].len = 2;
473 DRM_LOG_KMS("(%s)", cmd_status_names[status]); 447 msgs[i].buf = buf + 2 *i;
474 else 448 buf[2*i + 0] = SDVO_I2C_ARG_0 - i;
475 DRM_LOG_KMS("(??? %d)", status); 449 buf[2*i + 1] = ((u8*)args)[i];
476 DRM_LOG_KMS("\n"); 450 }
451 msgs[i].addr = intel_sdvo->slave_addr;
452 msgs[i].flags = 0;
453 msgs[i].len = 2;
454 msgs[i].buf = buf + 2*i;
455 buf[2*i + 0] = SDVO_I2C_OPCODE;
456 buf[2*i + 1] = cmd;
457
458 /* the following two are to read the response */
459 status = SDVO_I2C_CMD_STATUS;
460 msgs[i+1].addr = intel_sdvo->slave_addr;
461 msgs[i+1].flags = 0;
462 msgs[i+1].len = 1;
463 msgs[i+1].buf = &status;
464
465 msgs[i+2].addr = intel_sdvo->slave_addr;
466 msgs[i+2].flags = I2C_M_RD;
467 msgs[i+2].len = 1;
468 msgs[i+2].buf = &status;
469
470 ret = i2c_transfer(intel_sdvo->i2c, msgs, i+3);
471 if (ret < 0) {
472 DRM_DEBUG_KMS("I2c transfer returned %d\n", ret);
473 return false;
474 }
475 if (ret != i+3) {
476 /* failure in I2C transfer */
477 DRM_DEBUG_KMS("I2c transfer returned %d/%d\n", ret, i+3);
478 return false;
479 }
480
481 return true;
477} 482}
478 483
479static bool intel_sdvo_read_response(struct intel_sdvo *intel_sdvo, 484static bool intel_sdvo_read_response(struct intel_sdvo *intel_sdvo,
480 void *response, int response_len) 485 void *response, int response_len)
481{ 486{
482 int i; 487 u8 retry = 5;
483 u8 status; 488 u8 status;
484 u8 retry = 50; 489 int i;
485 490
486 while (retry--) { 491 DRM_DEBUG_KMS("%s: R: ", SDVO_NAME(intel_sdvo));
487 /* Read the command response */
488 for (i = 0; i < response_len; i++) {
489 if (!intel_sdvo_read_byte(intel_sdvo,
490 SDVO_I2C_RETURN_0 + i,
491 &((u8 *)response)[i]))
492 return false;
493 }
494 492
495 /* read the return status */ 493 /*
496 if (!intel_sdvo_read_byte(intel_sdvo, SDVO_I2C_CMD_STATUS, 494 * The documentation states that all commands will be
495 * processed within 15µs, and that we need only poll
496 * the status byte a maximum of 3 times in order for the
497 * command to be complete.
498 *
499 * Check 5 times in case the hardware failed to read the docs.
500 */
501 if (!intel_sdvo_read_byte(intel_sdvo,
502 SDVO_I2C_CMD_STATUS,
503 &status))
504 goto log_fail;
505
506 while (status == SDVO_CMD_STATUS_PENDING && retry--) {
507 udelay(15);
508 if (!intel_sdvo_read_byte(intel_sdvo,
509 SDVO_I2C_CMD_STATUS,
497 &status)) 510 &status))
498 return false; 511 goto log_fail;
512 }
499 513
500 intel_sdvo_debug_response(intel_sdvo, response, response_len, 514 if (status <= SDVO_CMD_STATUS_SCALING_NOT_SUPP)
501 status); 515 DRM_LOG_KMS("(%s)", cmd_status_names[status]);
502 if (status != SDVO_CMD_STATUS_PENDING) 516 else
503 break; 517 DRM_LOG_KMS("(??? %d)", status);
504 518
505 mdelay(50); 519 if (status != SDVO_CMD_STATUS_SUCCESS)
520 goto log_fail;
521
522 /* Read the command response */
523 for (i = 0; i < response_len; i++) {
524 if (!intel_sdvo_read_byte(intel_sdvo,
525 SDVO_I2C_RETURN_0 + i,
526 &((u8 *)response)[i]))
527 goto log_fail;
528 DRM_LOG_KMS(" %02X", ((u8 *)response)[i]);
506 } 529 }
530 DRM_LOG_KMS("\n");
531 return true;
507 532
508 return status == SDVO_CMD_STATUS_SUCCESS; 533log_fail:
534 DRM_LOG_KMS("... failed\n");
535 return false;
509} 536}
510 537
511static int intel_sdvo_get_pixel_multiplier(struct drm_display_mode *mode) 538static int intel_sdvo_get_pixel_multiplier(struct drm_display_mode *mode)
@@ -518,63 +545,13 @@ static int intel_sdvo_get_pixel_multiplier(struct drm_display_mode *mode)
518 return 4; 545 return 4;
519} 546}
520 547
521/** 548static bool intel_sdvo_set_control_bus_switch(struct intel_sdvo *intel_sdvo,
522 * Try to read the response after issuie the DDC switch command. But it 549 u8 ddc_bus)
523 * is noted that we must do the action of reading response and issuing DDC
524 * switch command in one I2C transaction. Otherwise when we try to start
525 * another I2C transaction after issuing the DDC bus switch, it will be
526 * switched to the internal SDVO register.
527 */
528static void intel_sdvo_set_control_bus_switch(struct intel_sdvo *intel_sdvo,
529 u8 target)
530{ 550{
531 u8 out_buf[2], cmd_buf[2], ret_value[2], ret; 551 /* This must be the immediately preceding write before the i2c xfer */
532 struct i2c_msg msgs[] = { 552 return intel_sdvo_write_cmd(intel_sdvo,
533 { 553 SDVO_CMD_SET_CONTROL_BUS_SWITCH,
534 .addr = intel_sdvo->slave_addr >> 1, 554 &ddc_bus, 1);
535 .flags = 0,
536 .len = 2,
537 .buf = out_buf,
538 },
539 /* the following two are to read the response */
540 {
541 .addr = intel_sdvo->slave_addr >> 1,
542 .flags = 0,
543 .len = 1,
544 .buf = cmd_buf,
545 },
546 {
547 .addr = intel_sdvo->slave_addr >> 1,
548 .flags = I2C_M_RD,
549 .len = 1,
550 .buf = ret_value,
551 },
552 };
553
554 intel_sdvo_debug_write(intel_sdvo, SDVO_CMD_SET_CONTROL_BUS_SWITCH,
555 &target, 1);
556 /* write the DDC switch command argument */
557 intel_sdvo_write_byte(intel_sdvo, SDVO_I2C_ARG_0, target);
558
559 out_buf[0] = SDVO_I2C_OPCODE;
560 out_buf[1] = SDVO_CMD_SET_CONTROL_BUS_SWITCH;
561 cmd_buf[0] = SDVO_I2C_CMD_STATUS;
562 cmd_buf[1] = 0;
563 ret_value[0] = 0;
564 ret_value[1] = 0;
565
566 ret = i2c_transfer(intel_sdvo->base.i2c_bus, msgs, 3);
567 if (ret != 3) {
568 /* failure in I2C transfer */
569 DRM_DEBUG_KMS("I2c transfer returned %d\n", ret);
570 return;
571 }
572 if (ret_value[0] != SDVO_CMD_STATUS_SUCCESS) {
573 DRM_DEBUG_KMS("DDC switch command returns response %d\n",
574 ret_value[0]);
575 return;
576 }
577 return;
578} 555}
579 556
580static bool intel_sdvo_set_value(struct intel_sdvo *intel_sdvo, u8 cmd, const void *data, int len) 557static bool intel_sdvo_set_value(struct intel_sdvo *intel_sdvo, u8 cmd, const void *data, int len)
@@ -612,6 +589,7 @@ static bool intel_sdvo_get_trained_inputs(struct intel_sdvo *intel_sdvo, bool *i
612{ 589{
613 struct intel_sdvo_get_trained_inputs_response response; 590 struct intel_sdvo_get_trained_inputs_response response;
614 591
592 BUILD_BUG_ON(sizeof(response) != 1);
615 if (!intel_sdvo_get_value(intel_sdvo, SDVO_CMD_GET_TRAINED_INPUTS, 593 if (!intel_sdvo_get_value(intel_sdvo, SDVO_CMD_GET_TRAINED_INPUTS,
616 &response, sizeof(response))) 594 &response, sizeof(response)))
617 return false; 595 return false;
@@ -659,6 +637,7 @@ static bool intel_sdvo_get_input_pixel_clock_range(struct intel_sdvo *intel_sdvo
659{ 637{
660 struct intel_sdvo_pixel_clock_range clocks; 638 struct intel_sdvo_pixel_clock_range clocks;
661 639
640 BUILD_BUG_ON(sizeof(clocks) != 4);
662 if (!intel_sdvo_get_value(intel_sdvo, 641 if (!intel_sdvo_get_value(intel_sdvo,
663 SDVO_CMD_GET_INPUT_PIXEL_CLOCK_RANGE, 642 SDVO_CMD_GET_INPUT_PIXEL_CLOCK_RANGE,
664 &clocks, sizeof(clocks))) 643 &clocks, sizeof(clocks)))
@@ -726,6 +705,8 @@ intel_sdvo_create_preferred_input_timing(struct intel_sdvo *intel_sdvo,
726static bool intel_sdvo_get_preferred_input_timing(struct intel_sdvo *intel_sdvo, 705static bool intel_sdvo_get_preferred_input_timing(struct intel_sdvo *intel_sdvo,
727 struct intel_sdvo_dtd *dtd) 706 struct intel_sdvo_dtd *dtd)
728{ 707{
708 BUILD_BUG_ON(sizeof(dtd->part1) != 8);
709 BUILD_BUG_ON(sizeof(dtd->part2) != 8);
729 return intel_sdvo_get_value(intel_sdvo, SDVO_CMD_GET_PREFERRED_INPUT_TIMING_PART1, 710 return intel_sdvo_get_value(intel_sdvo, SDVO_CMD_GET_PREFERRED_INPUT_TIMING_PART1,
730 &dtd->part1, sizeof(dtd->part1)) && 711 &dtd->part1, sizeof(dtd->part1)) &&
731 intel_sdvo_get_value(intel_sdvo, SDVO_CMD_GET_PREFERRED_INPUT_TIMING_PART2, 712 intel_sdvo_get_value(intel_sdvo, SDVO_CMD_GET_PREFERRED_INPUT_TIMING_PART2,
@@ -819,17 +800,14 @@ static void intel_sdvo_get_mode_from_dtd(struct drm_display_mode * mode,
819 mode->flags |= DRM_MODE_FLAG_PVSYNC; 800 mode->flags |= DRM_MODE_FLAG_PVSYNC;
820} 801}
821 802
822static bool intel_sdvo_get_supp_encode(struct intel_sdvo *intel_sdvo, 803static bool intel_sdvo_check_supp_encode(struct intel_sdvo *intel_sdvo)
823 struct intel_sdvo_encode *encode)
824{ 804{
825 if (intel_sdvo_get_value(intel_sdvo, 805 struct intel_sdvo_encode encode;
826 SDVO_CMD_GET_SUPP_ENCODE,
827 encode, sizeof(*encode)))
828 return true;
829 806
830 /* non-support means DVI */ 807 BUILD_BUG_ON(sizeof(encode) != 2);
831 memset(encode, 0, sizeof(*encode)); 808 return intel_sdvo_get_value(intel_sdvo,
832 return false; 809 SDVO_CMD_GET_SUPP_ENCODE,
810 &encode, sizeof(encode));
833} 811}
834 812
835static bool intel_sdvo_set_encode(struct intel_sdvo *intel_sdvo, 813static bool intel_sdvo_set_encode(struct intel_sdvo *intel_sdvo,
@@ -874,115 +852,36 @@ static void intel_sdvo_dump_hdmi_buf(struct intel_sdvo *intel_sdvo)
874} 852}
875#endif 853#endif
876 854
877static bool intel_sdvo_set_hdmi_buf(struct intel_sdvo *intel_sdvo, 855static bool intel_sdvo_set_avi_infoframe(struct intel_sdvo *intel_sdvo)
878 int index,
879 uint8_t *data, int8_t size, uint8_t tx_rate)
880{
881 uint8_t set_buf_index[2];
882
883 set_buf_index[0] = index;
884 set_buf_index[1] = 0;
885
886 if (!intel_sdvo_write_cmd(intel_sdvo, SDVO_CMD_SET_HBUF_INDEX,
887 set_buf_index, 2))
888 return false;
889
890 for (; size > 0; size -= 8) {
891 if (!intel_sdvo_write_cmd(intel_sdvo, SDVO_CMD_SET_HBUF_DATA, data, 8))
892 return false;
893
894 data += 8;
895 }
896
897 return intel_sdvo_write_cmd(intel_sdvo, SDVO_CMD_SET_HBUF_TXRATE, &tx_rate, 1);
898}
899
900static uint8_t intel_sdvo_calc_hbuf_csum(uint8_t *data, uint8_t size)
901{
902 uint8_t csum = 0;
903 int i;
904
905 for (i = 0; i < size; i++)
906 csum += data[i];
907
908 return 0x100 - csum;
909}
910
911#define DIP_TYPE_AVI 0x82
912#define DIP_VERSION_AVI 0x2
913#define DIP_LEN_AVI 13
914
915struct dip_infoframe {
916 uint8_t type;
917 uint8_t version;
918 uint8_t len;
919 uint8_t checksum;
920 union {
921 struct {
922 /* Packet Byte #1 */
923 uint8_t S:2;
924 uint8_t B:2;
925 uint8_t A:1;
926 uint8_t Y:2;
927 uint8_t rsvd1:1;
928 /* Packet Byte #2 */
929 uint8_t R:4;
930 uint8_t M:2;
931 uint8_t C:2;
932 /* Packet Byte #3 */
933 uint8_t SC:2;
934 uint8_t Q:2;
935 uint8_t EC:3;
936 uint8_t ITC:1;
937 /* Packet Byte #4 */
938 uint8_t VIC:7;
939 uint8_t rsvd2:1;
940 /* Packet Byte #5 */
941 uint8_t PR:4;
942 uint8_t rsvd3:4;
943 /* Packet Byte #6~13 */
944 uint16_t top_bar_end;
945 uint16_t bottom_bar_start;
946 uint16_t left_bar_end;
947 uint16_t right_bar_start;
948 } avi;
949 struct {
950 /* Packet Byte #1 */
951 uint8_t channel_count:3;
952 uint8_t rsvd1:1;
953 uint8_t coding_type:4;
954 /* Packet Byte #2 */
955 uint8_t sample_size:2; /* SS0, SS1 */
956 uint8_t sample_frequency:3;
957 uint8_t rsvd2:3;
958 /* Packet Byte #3 */
959 uint8_t coding_type_private:5;
960 uint8_t rsvd3:3;
961 /* Packet Byte #4 */
962 uint8_t channel_allocation;
963 /* Packet Byte #5 */
964 uint8_t rsvd4:3;
965 uint8_t level_shift:4;
966 uint8_t downmix_inhibit:1;
967 } audio;
968 uint8_t payload[28];
969 } __attribute__ ((packed)) u;
970} __attribute__((packed));
971
972static bool intel_sdvo_set_avi_infoframe(struct intel_sdvo *intel_sdvo,
973 struct drm_display_mode * mode)
974{ 856{
975 struct dip_infoframe avi_if = { 857 struct dip_infoframe avi_if = {
976 .type = DIP_TYPE_AVI, 858 .type = DIP_TYPE_AVI,
977 .version = DIP_VERSION_AVI, 859 .ver = DIP_VERSION_AVI,
978 .len = DIP_LEN_AVI, 860 .len = DIP_LEN_AVI,
979 }; 861 };
862 uint8_t tx_rate = SDVO_HBUF_TX_VSYNC;
863 uint8_t set_buf_index[2] = { 1, 0 };
864 uint64_t *data = (uint64_t *)&avi_if;
865 unsigned i;
866
867 intel_dip_infoframe_csum(&avi_if);
868
869 if (!intel_sdvo_set_value(intel_sdvo,
870 SDVO_CMD_SET_HBUF_INDEX,
871 set_buf_index, 2))
872 return false;
980 873
981 avi_if.checksum = intel_sdvo_calc_hbuf_csum((uint8_t *)&avi_if, 874 for (i = 0; i < sizeof(avi_if); i += 8) {
982 4 + avi_if.len); 875 if (!intel_sdvo_set_value(intel_sdvo,
983 return intel_sdvo_set_hdmi_buf(intel_sdvo, 1, (uint8_t *)&avi_if, 876 SDVO_CMD_SET_HBUF_DATA,
984 4 + avi_if.len, 877 data, 8))
985 SDVO_HBUF_TX_VSYNC); 878 return false;
879 data++;
880 }
881
882 return intel_sdvo_set_value(intel_sdvo,
883 SDVO_CMD_SET_HBUF_TXRATE,
884 &tx_rate, 1);
986} 885}
987 886
988static bool intel_sdvo_set_tv_format(struct intel_sdvo *intel_sdvo) 887static bool intel_sdvo_set_tv_format(struct intel_sdvo *intel_sdvo)
@@ -1022,8 +921,6 @@ intel_sdvo_set_input_timings_for_mode(struct intel_sdvo *intel_sdvo,
1022 struct drm_display_mode *mode, 921 struct drm_display_mode *mode,
1023 struct drm_display_mode *adjusted_mode) 922 struct drm_display_mode *adjusted_mode)
1024{ 923{
1025 struct intel_sdvo_dtd input_dtd;
1026
1027 /* Reset the input timing to the screen. Assume always input 0. */ 924 /* Reset the input timing to the screen. Assume always input 0. */
1028 if (!intel_sdvo_set_target_input(intel_sdvo)) 925 if (!intel_sdvo_set_target_input(intel_sdvo))
1029 return false; 926 return false;
@@ -1035,14 +932,12 @@ intel_sdvo_set_input_timings_for_mode(struct intel_sdvo *intel_sdvo,
1035 return false; 932 return false;
1036 933
1037 if (!intel_sdvo_get_preferred_input_timing(intel_sdvo, 934 if (!intel_sdvo_get_preferred_input_timing(intel_sdvo,
1038 &input_dtd)) 935 &intel_sdvo->input_dtd))
1039 return false; 936 return false;
1040 937
1041 intel_sdvo_get_mode_from_dtd(adjusted_mode, &input_dtd); 938 intel_sdvo_get_mode_from_dtd(adjusted_mode, &intel_sdvo->input_dtd);
1042 intel_sdvo->sdvo_flags = input_dtd.part2.sdvo_flags;
1043 939
1044 drm_mode_set_crtcinfo(adjusted_mode, 0); 940 drm_mode_set_crtcinfo(adjusted_mode, 0);
1045 mode->clock = adjusted_mode->clock;
1046 return true; 941 return true;
1047} 942}
1048 943
@@ -1050,7 +945,8 @@ static bool intel_sdvo_mode_fixup(struct drm_encoder *encoder,
1050 struct drm_display_mode *mode, 945 struct drm_display_mode *mode,
1051 struct drm_display_mode *adjusted_mode) 946 struct drm_display_mode *adjusted_mode)
1052{ 947{
1053 struct intel_sdvo *intel_sdvo = enc_to_intel_sdvo(encoder); 948 struct intel_sdvo *intel_sdvo = to_intel_sdvo(encoder);
949 int multiplier;
1054 950
1055 /* We need to construct preferred input timings based on our 951 /* We need to construct preferred input timings based on our
1056 * output timings. To do that, we have to set the output 952 * output timings. To do that, we have to set the output
@@ -1065,10 +961,8 @@ static bool intel_sdvo_mode_fixup(struct drm_encoder *encoder,
1065 mode, 961 mode,
1066 adjusted_mode); 962 adjusted_mode);
1067 } else if (intel_sdvo->is_lvds) { 963 } else if (intel_sdvo->is_lvds) {
1068 drm_mode_set_crtcinfo(intel_sdvo->sdvo_lvds_fixed_mode, 0);
1069
1070 if (!intel_sdvo_set_output_timings_from_mode(intel_sdvo, 964 if (!intel_sdvo_set_output_timings_from_mode(intel_sdvo,
1071 intel_sdvo->sdvo_lvds_fixed_mode)) 965 intel_sdvo->sdvo_lvds_fixed_mode))
1072 return false; 966 return false;
1073 967
1074 (void) intel_sdvo_set_input_timings_for_mode(intel_sdvo, 968 (void) intel_sdvo_set_input_timings_for_mode(intel_sdvo,
@@ -1077,9 +971,10 @@ static bool intel_sdvo_mode_fixup(struct drm_encoder *encoder,
1077 } 971 }
1078 972
1079 /* Make the CRTC code factor in the SDVO pixel multiplier. The 973 /* Make the CRTC code factor in the SDVO pixel multiplier. The
1080 * SDVO device will be told of the multiplier during mode_set. 974 * SDVO device will factor out the multiplier during mode_set.
1081 */ 975 */
1082 adjusted_mode->clock *= intel_sdvo_get_pixel_multiplier(mode); 976 multiplier = intel_sdvo_get_pixel_multiplier(adjusted_mode);
977 intel_mode_set_pixel_multiplier(adjusted_mode, multiplier);
1083 978
1084 return true; 979 return true;
1085} 980}
@@ -1092,11 +987,12 @@ static void intel_sdvo_mode_set(struct drm_encoder *encoder,
1092 struct drm_i915_private *dev_priv = dev->dev_private; 987 struct drm_i915_private *dev_priv = dev->dev_private;
1093 struct drm_crtc *crtc = encoder->crtc; 988 struct drm_crtc *crtc = encoder->crtc;
1094 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 989 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
1095 struct intel_sdvo *intel_sdvo = enc_to_intel_sdvo(encoder); 990 struct intel_sdvo *intel_sdvo = to_intel_sdvo(encoder);
1096 u32 sdvox = 0; 991 u32 sdvox;
1097 int sdvo_pixel_multiply, rate;
1098 struct intel_sdvo_in_out_map in_out; 992 struct intel_sdvo_in_out_map in_out;
1099 struct intel_sdvo_dtd input_dtd; 993 struct intel_sdvo_dtd input_dtd;
994 int pixel_multiplier = intel_mode_get_pixel_multiplier(adjusted_mode);
995 int rate;
1100 996
1101 if (!mode) 997 if (!mode)
1102 return; 998 return;
@@ -1114,28 +1010,23 @@ static void intel_sdvo_mode_set(struct drm_encoder *encoder,
1114 SDVO_CMD_SET_IN_OUT_MAP, 1010 SDVO_CMD_SET_IN_OUT_MAP,
1115 &in_out, sizeof(in_out)); 1011 &in_out, sizeof(in_out));
1116 1012
1117 if (intel_sdvo->is_hdmi) { 1013 /* Set the output timings to the screen */
1118 if (!intel_sdvo_set_avi_infoframe(intel_sdvo, mode)) 1014 if (!intel_sdvo_set_target_output(intel_sdvo,
1119 return; 1015 intel_sdvo->attached_output))
1120 1016 return;
1121 sdvox |= SDVO_AUDIO_ENABLE;
1122 }
1123 1017
1124 /* We have tried to get input timing in mode_fixup, and filled into 1018 /* We have tried to get input timing in mode_fixup, and filled into
1125 adjusted_mode */ 1019 * adjusted_mode.
1126 intel_sdvo_get_dtd_from_mode(&input_dtd, adjusted_mode);
1127 if (intel_sdvo->is_tv || intel_sdvo->is_lvds)
1128 input_dtd.part2.sdvo_flags = intel_sdvo->sdvo_flags;
1129
1130 /* If it's a TV, we already set the output timing in mode_fixup.
1131 * Otherwise, the output timing is equal to the input timing.
1132 */ 1020 */
1133 if (!intel_sdvo->is_tv && !intel_sdvo->is_lvds) { 1021 if (intel_sdvo->is_tv || intel_sdvo->is_lvds) {
1022 input_dtd = intel_sdvo->input_dtd;
1023 } else {
1134 /* Set the output timing to the screen */ 1024 /* Set the output timing to the screen */
1135 if (!intel_sdvo_set_target_output(intel_sdvo, 1025 if (!intel_sdvo_set_target_output(intel_sdvo,
1136 intel_sdvo->attached_output)) 1026 intel_sdvo->attached_output))
1137 return; 1027 return;
1138 1028
1029 intel_sdvo_get_dtd_from_mode(&input_dtd, adjusted_mode);
1139 (void) intel_sdvo_set_output_timing(intel_sdvo, &input_dtd); 1030 (void) intel_sdvo_set_output_timing(intel_sdvo, &input_dtd);
1140 } 1031 }
1141 1032
@@ -1143,31 +1034,22 @@ static void intel_sdvo_mode_set(struct drm_encoder *encoder,
1143 if (!intel_sdvo_set_target_input(intel_sdvo)) 1034 if (!intel_sdvo_set_target_input(intel_sdvo))
1144 return; 1035 return;
1145 1036
1146 if (intel_sdvo->is_tv) { 1037 if (intel_sdvo->has_hdmi_monitor) {
1147 if (!intel_sdvo_set_tv_format(intel_sdvo)) 1038 intel_sdvo_set_encode(intel_sdvo, SDVO_ENCODE_HDMI);
1148 return; 1039 intel_sdvo_set_colorimetry(intel_sdvo,
1149 } 1040 SDVO_COLORIMETRY_RGB256);
1041 intel_sdvo_set_avi_infoframe(intel_sdvo);
1042 } else
1043 intel_sdvo_set_encode(intel_sdvo, SDVO_ENCODE_DVI);
1150 1044
1151 /* We would like to use intel_sdvo_create_preferred_input_timing() to 1045 if (intel_sdvo->is_tv &&
1152 * provide the device with a timing it can support, if it supports that 1046 !intel_sdvo_set_tv_format(intel_sdvo))
1153 * feature. However, presumably we would need to adjust the CRTC to 1047 return;
1154 * output the preferred timing, and we don't support that currently.
1155 */
1156#if 0
1157 success = intel_sdvo_create_preferred_input_timing(encoder, clock,
1158 width, height);
1159 if (success) {
1160 struct intel_sdvo_dtd *input_dtd;
1161 1048
1162 intel_sdvo_get_preferred_input_timing(encoder, &input_dtd);
1163 intel_sdvo_set_input_timing(encoder, &input_dtd);
1164 }
1165#else
1166 (void) intel_sdvo_set_input_timing(intel_sdvo, &input_dtd); 1049 (void) intel_sdvo_set_input_timing(intel_sdvo, &input_dtd);
1167#endif
1168 1050
1169 sdvo_pixel_multiply = intel_sdvo_get_pixel_multiplier(mode); 1051 switch (pixel_multiplier) {
1170 switch (sdvo_pixel_multiply) { 1052 default:
1171 case 1: rate = SDVO_CLOCK_RATE_MULT_1X; break; 1053 case 1: rate = SDVO_CLOCK_RATE_MULT_1X; break;
1172 case 2: rate = SDVO_CLOCK_RATE_MULT_2X; break; 1054 case 2: rate = SDVO_CLOCK_RATE_MULT_2X; break;
1173 case 4: rate = SDVO_CLOCK_RATE_MULT_4X; break; 1055 case 4: rate = SDVO_CLOCK_RATE_MULT_4X; break;
@@ -1176,14 +1058,18 @@ static void intel_sdvo_mode_set(struct drm_encoder *encoder,
1176 return; 1058 return;
1177 1059
1178 /* Set the SDVO control regs. */ 1060 /* Set the SDVO control regs. */
1179 if (IS_I965G(dev)) { 1061 if (INTEL_INFO(dev)->gen >= 4) {
1180 sdvox |= SDVO_BORDER_ENABLE; 1062 sdvox = 0;
1063 if (intel_sdvo->is_hdmi)
1064 sdvox |= intel_sdvo->color_range;
1065 if (INTEL_INFO(dev)->gen < 5)
1066 sdvox |= SDVO_BORDER_ENABLE;
1181 if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC) 1067 if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC)
1182 sdvox |= SDVO_VSYNC_ACTIVE_HIGH; 1068 sdvox |= SDVO_VSYNC_ACTIVE_HIGH;
1183 if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC) 1069 if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC)
1184 sdvox |= SDVO_HSYNC_ACTIVE_HIGH; 1070 sdvox |= SDVO_HSYNC_ACTIVE_HIGH;
1185 } else { 1071 } else {
1186 sdvox |= I915_READ(intel_sdvo->sdvo_reg); 1072 sdvox = I915_READ(intel_sdvo->sdvo_reg);
1187 switch (intel_sdvo->sdvo_reg) { 1073 switch (intel_sdvo->sdvo_reg) {
1188 case SDVOB: 1074 case SDVOB:
1189 sdvox &= SDVOB_PRESERVE_MASK; 1075 sdvox &= SDVOB_PRESERVE_MASK;
@@ -1196,16 +1082,19 @@ static void intel_sdvo_mode_set(struct drm_encoder *encoder,
1196 } 1082 }
1197 if (intel_crtc->pipe == 1) 1083 if (intel_crtc->pipe == 1)
1198 sdvox |= SDVO_PIPE_B_SELECT; 1084 sdvox |= SDVO_PIPE_B_SELECT;
1085 if (intel_sdvo->has_hdmi_audio)
1086 sdvox |= SDVO_AUDIO_ENABLE;
1199 1087
1200 if (IS_I965G(dev)) { 1088 if (INTEL_INFO(dev)->gen >= 4) {
1201 /* done in crtc_mode_set as the dpll_md reg must be written early */ 1089 /* done in crtc_mode_set as the dpll_md reg must be written early */
1202 } else if (IS_I945G(dev) || IS_I945GM(dev) || IS_G33(dev)) { 1090 } else if (IS_I945G(dev) || IS_I945GM(dev) || IS_G33(dev)) {
1203 /* done in crtc_mode_set as it lives inside the dpll register */ 1091 /* done in crtc_mode_set as it lives inside the dpll register */
1204 } else { 1092 } else {
1205 sdvox |= (sdvo_pixel_multiply - 1) << SDVO_PORT_MULTIPLY_SHIFT; 1093 sdvox |= (pixel_multiplier - 1) << SDVO_PORT_MULTIPLY_SHIFT;
1206 } 1094 }
1207 1095
1208 if (intel_sdvo->sdvo_flags & SDVO_NEED_TO_STALL) 1096 if (input_dtd.part2.sdvo_flags & SDVO_NEED_TO_STALL &&
1097 INTEL_INFO(dev)->gen < 5)
1209 sdvox |= SDVO_STALL_SELECT; 1098 sdvox |= SDVO_STALL_SELECT;
1210 intel_sdvo_write_sdvox(intel_sdvo, sdvox); 1099 intel_sdvo_write_sdvox(intel_sdvo, sdvox);
1211} 1100}
@@ -1214,7 +1103,7 @@ static void intel_sdvo_dpms(struct drm_encoder *encoder, int mode)
1214{ 1103{
1215 struct drm_device *dev = encoder->dev; 1104 struct drm_device *dev = encoder->dev;
1216 struct drm_i915_private *dev_priv = dev->dev_private; 1105 struct drm_i915_private *dev_priv = dev->dev_private;
1217 struct intel_sdvo *intel_sdvo = enc_to_intel_sdvo(encoder); 1106 struct intel_sdvo *intel_sdvo = to_intel_sdvo(encoder);
1218 struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc); 1107 struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
1219 u32 temp; 1108 u32 temp;
1220 1109
@@ -1260,8 +1149,7 @@ static void intel_sdvo_dpms(struct drm_encoder *encoder, int mode)
1260static int intel_sdvo_mode_valid(struct drm_connector *connector, 1149static int intel_sdvo_mode_valid(struct drm_connector *connector,
1261 struct drm_display_mode *mode) 1150 struct drm_display_mode *mode)
1262{ 1151{
1263 struct drm_encoder *encoder = intel_attached_encoder(connector); 1152 struct intel_sdvo *intel_sdvo = intel_attached_sdvo(connector);
1264 struct intel_sdvo *intel_sdvo = enc_to_intel_sdvo(encoder);
1265 1153
1266 if (mode->flags & DRM_MODE_FLAG_DBLSCAN) 1154 if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
1267 return MODE_NO_DBLESCAN; 1155 return MODE_NO_DBLESCAN;
@@ -1285,7 +1173,39 @@ static int intel_sdvo_mode_valid(struct drm_connector *connector,
1285 1173
1286static bool intel_sdvo_get_capabilities(struct intel_sdvo *intel_sdvo, struct intel_sdvo_caps *caps) 1174static bool intel_sdvo_get_capabilities(struct intel_sdvo *intel_sdvo, struct intel_sdvo_caps *caps)
1287{ 1175{
1288 return intel_sdvo_get_value(intel_sdvo, SDVO_CMD_GET_DEVICE_CAPS, caps, sizeof(*caps)); 1176 BUILD_BUG_ON(sizeof(*caps) != 8);
1177 if (!intel_sdvo_get_value(intel_sdvo,
1178 SDVO_CMD_GET_DEVICE_CAPS,
1179 caps, sizeof(*caps)))
1180 return false;
1181
1182 DRM_DEBUG_KMS("SDVO capabilities:\n"
1183 " vendor_id: %d\n"
1184 " device_id: %d\n"
1185 " device_rev_id: %d\n"
1186 " sdvo_version_major: %d\n"
1187 " sdvo_version_minor: %d\n"
1188 " sdvo_inputs_mask: %d\n"
1189 " smooth_scaling: %d\n"
1190 " sharp_scaling: %d\n"
1191 " up_scaling: %d\n"
1192 " down_scaling: %d\n"
1193 " stall_support: %d\n"
1194 " output_flags: %d\n",
1195 caps->vendor_id,
1196 caps->device_id,
1197 caps->device_rev_id,
1198 caps->sdvo_version_major,
1199 caps->sdvo_version_minor,
1200 caps->sdvo_inputs_mask,
1201 caps->smooth_scaling,
1202 caps->sharp_scaling,
1203 caps->up_scaling,
1204 caps->down_scaling,
1205 caps->stall_support,
1206 caps->output_flags);
1207
1208 return true;
1289} 1209}
1290 1210
1291/* No use! */ 1211/* No use! */
@@ -1360,128 +1280,85 @@ void intel_sdvo_set_hotplug(struct drm_connector *connector, int on)
1360static bool 1280static bool
1361intel_sdvo_multifunc_encoder(struct intel_sdvo *intel_sdvo) 1281intel_sdvo_multifunc_encoder(struct intel_sdvo *intel_sdvo)
1362{ 1282{
1363 int caps = 0; 1283 /* Is there more than one type of output? */
1364 1284 int caps = intel_sdvo->caps.output_flags & 0xf;
1365 if (intel_sdvo->caps.output_flags & 1285 return caps & -caps;
1366 (SDVO_OUTPUT_TMDS0 | SDVO_OUTPUT_TMDS1))
1367 caps++;
1368 if (intel_sdvo->caps.output_flags &
1369 (SDVO_OUTPUT_RGB0 | SDVO_OUTPUT_RGB1))
1370 caps++;
1371 if (intel_sdvo->caps.output_flags &
1372 (SDVO_OUTPUT_SVID0 | SDVO_OUTPUT_SVID1))
1373 caps++;
1374 if (intel_sdvo->caps.output_flags &
1375 (SDVO_OUTPUT_CVBS0 | SDVO_OUTPUT_CVBS1))
1376 caps++;
1377 if (intel_sdvo->caps.output_flags &
1378 (SDVO_OUTPUT_YPRPB0 | SDVO_OUTPUT_YPRPB1))
1379 caps++;
1380
1381 if (intel_sdvo->caps.output_flags &
1382 (SDVO_OUTPUT_SCART0 | SDVO_OUTPUT_SCART1))
1383 caps++;
1384
1385 if (intel_sdvo->caps.output_flags &
1386 (SDVO_OUTPUT_LVDS0 | SDVO_OUTPUT_LVDS1))
1387 caps++;
1388
1389 return (caps > 1);
1390} 1286}
1391 1287
1392static struct drm_connector * 1288static struct edid *
1393intel_find_analog_connector(struct drm_device *dev) 1289intel_sdvo_get_edid(struct drm_connector *connector)
1394{ 1290{
1395 struct drm_connector *connector; 1291 struct intel_sdvo *sdvo = intel_attached_sdvo(connector);
1396 struct drm_encoder *encoder; 1292 return drm_get_edid(connector, &sdvo->ddc);
1397 struct intel_sdvo *intel_sdvo;
1398
1399 list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
1400 intel_sdvo = enc_to_intel_sdvo(encoder);
1401 if (intel_sdvo->base.type == INTEL_OUTPUT_ANALOG) {
1402 list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
1403 if (encoder == intel_attached_encoder(connector))
1404 return connector;
1405 }
1406 }
1407 }
1408 return NULL;
1409} 1293}
1410 1294
1411static int 1295/* Mac mini hack -- use the same DDC as the analog connector */
1412intel_analog_is_connected(struct drm_device *dev) 1296static struct edid *
1297intel_sdvo_get_analog_edid(struct drm_connector *connector)
1413{ 1298{
1414 struct drm_connector *analog_connector; 1299 struct drm_i915_private *dev_priv = connector->dev->dev_private;
1415
1416 analog_connector = intel_find_analog_connector(dev);
1417 if (!analog_connector)
1418 return false;
1419
1420 if (analog_connector->funcs->detect(analog_connector, false) ==
1421 connector_status_disconnected)
1422 return false;
1423 1300
1424 return true; 1301 return drm_get_edid(connector,
1302 &dev_priv->gmbus[dev_priv->crt_ddc_pin].adapter);
1425} 1303}
1426 1304
1427enum drm_connector_status 1305enum drm_connector_status
1428intel_sdvo_hdmi_sink_detect(struct drm_connector *connector) 1306intel_sdvo_hdmi_sink_detect(struct drm_connector *connector)
1429{ 1307{
1430 struct drm_encoder *encoder = intel_attached_encoder(connector); 1308 struct intel_sdvo *intel_sdvo = intel_attached_sdvo(connector);
1431 struct intel_sdvo *intel_sdvo = enc_to_intel_sdvo(encoder); 1309 enum drm_connector_status status;
1432 struct intel_sdvo_connector *intel_sdvo_connector = to_intel_sdvo_connector(connector); 1310 struct edid *edid;
1433 enum drm_connector_status status = connector_status_connected;
1434 struct edid *edid = NULL;
1435 1311
1436 edid = drm_get_edid(connector, intel_sdvo->base.ddc_bus); 1312 edid = intel_sdvo_get_edid(connector);
1437 1313
1438 /* This is only applied to SDVO cards with multiple outputs */
1439 if (edid == NULL && intel_sdvo_multifunc_encoder(intel_sdvo)) { 1314 if (edid == NULL && intel_sdvo_multifunc_encoder(intel_sdvo)) {
1440 uint8_t saved_ddc, temp_ddc; 1315 u8 ddc, saved_ddc = intel_sdvo->ddc_bus;
1441 saved_ddc = intel_sdvo->ddc_bus; 1316
1442 temp_ddc = intel_sdvo->ddc_bus >> 1;
1443 /* 1317 /*
1444 * Don't use the 1 as the argument of DDC bus switch to get 1318 * Don't use the 1 as the argument of DDC bus switch to get
1445 * the EDID. It is used for SDVO SPD ROM. 1319 * the EDID. It is used for SDVO SPD ROM.
1446 */ 1320 */
1447 while(temp_ddc > 1) { 1321 for (ddc = intel_sdvo->ddc_bus >> 1; ddc > 1; ddc >>= 1) {
1448 intel_sdvo->ddc_bus = temp_ddc; 1322 intel_sdvo->ddc_bus = ddc;
1449 edid = drm_get_edid(connector, intel_sdvo->base.ddc_bus); 1323 edid = intel_sdvo_get_edid(connector);
1450 if (edid) { 1324 if (edid)
1451 /*
1452 * When we can get the EDID, maybe it is the
1453 * correct DDC bus. Update it.
1454 */
1455 intel_sdvo->ddc_bus = temp_ddc;
1456 break; 1325 break;
1457 }
1458 temp_ddc >>= 1;
1459 } 1326 }
1327 /*
1328 * If we found the EDID on the other bus,
1329 * assume that is the correct DDC bus.
1330 */
1460 if (edid == NULL) 1331 if (edid == NULL)
1461 intel_sdvo->ddc_bus = saved_ddc; 1332 intel_sdvo->ddc_bus = saved_ddc;
1462 } 1333 }
1463 /* when there is no edid and no monitor is connected with VGA 1334
1464 * port, try to use the CRT ddc to read the EDID for DVI-connector 1335 /*
1336 * When there is no edid and no monitor is connected with VGA
1337 * port, try to use the CRT ddc to read the EDID for DVI-connector.
1465 */ 1338 */
1466 if (edid == NULL && intel_sdvo->analog_ddc_bus && 1339 if (edid == NULL)
1467 !intel_analog_is_connected(connector->dev)) 1340 edid = intel_sdvo_get_analog_edid(connector);
1468 edid = drm_get_edid(connector, intel_sdvo->analog_ddc_bus);
1469 1341
1342 status = connector_status_unknown;
1470 if (edid != NULL) { 1343 if (edid != NULL) {
1471 bool is_digital = !!(edid->input & DRM_EDID_INPUT_DIGITAL);
1472 bool need_digital = !!(intel_sdvo_connector->output_flag & SDVO_TMDS_MASK);
1473
1474 /* DDC bus is shared, match EDID to connector type */ 1344 /* DDC bus is shared, match EDID to connector type */
1475 if (is_digital && need_digital) 1345 if (edid->input & DRM_EDID_INPUT_DIGITAL) {
1476 intel_sdvo->is_hdmi = drm_detect_hdmi_monitor(edid); 1346 status = connector_status_connected;
1477 else if (is_digital != need_digital) 1347 if (intel_sdvo->is_hdmi) {
1348 intel_sdvo->has_hdmi_monitor = drm_detect_hdmi_monitor(edid);
1349 intel_sdvo->has_hdmi_audio = drm_detect_monitor_audio(edid);
1350 }
1351 } else
1478 status = connector_status_disconnected; 1352 status = connector_status_disconnected;
1479
1480 connector->display_info.raw_edid = NULL; 1353 connector->display_info.raw_edid = NULL;
1481 } else 1354 kfree(edid);
1482 status = connector_status_disconnected; 1355 }
1483 1356
1484 kfree(edid); 1357 if (status == connector_status_connected) {
1358 struct intel_sdvo_connector *intel_sdvo_connector = to_intel_sdvo_connector(connector);
1359 if (intel_sdvo_connector->force_audio)
1360 intel_sdvo->has_hdmi_audio = intel_sdvo_connector->force_audio > 0;
1361 }
1485 1362
1486 return status; 1363 return status;
1487} 1364}
@@ -1490,34 +1367,55 @@ static enum drm_connector_status
1490intel_sdvo_detect(struct drm_connector *connector, bool force) 1367intel_sdvo_detect(struct drm_connector *connector, bool force)
1491{ 1368{
1492 uint16_t response; 1369 uint16_t response;
1493 struct drm_encoder *encoder = intel_attached_encoder(connector); 1370 struct intel_sdvo *intel_sdvo = intel_attached_sdvo(connector);
1494 struct intel_sdvo *intel_sdvo = enc_to_intel_sdvo(encoder);
1495 struct intel_sdvo_connector *intel_sdvo_connector = to_intel_sdvo_connector(connector); 1371 struct intel_sdvo_connector *intel_sdvo_connector = to_intel_sdvo_connector(connector);
1496 enum drm_connector_status ret; 1372 enum drm_connector_status ret;
1497 1373
1498 if (!intel_sdvo_write_cmd(intel_sdvo, 1374 if (!intel_sdvo_write_cmd(intel_sdvo,
1499 SDVO_CMD_GET_ATTACHED_DISPLAYS, NULL, 0)) 1375 SDVO_CMD_GET_ATTACHED_DISPLAYS, NULL, 0))
1500 return connector_status_unknown; 1376 return connector_status_unknown;
1501 if (intel_sdvo->is_tv) { 1377
1502 /* add 30ms delay when the output type is SDVO-TV */ 1378 /* add 30ms delay when the output type might be TV */
1379 if (intel_sdvo->caps.output_flags &
1380 (SDVO_OUTPUT_SVID0 | SDVO_OUTPUT_CVBS0))
1503 mdelay(30); 1381 mdelay(30);
1504 } 1382
1505 if (!intel_sdvo_read_response(intel_sdvo, &response, 2)) 1383 if (!intel_sdvo_read_response(intel_sdvo, &response, 2))
1506 return connector_status_unknown; 1384 return connector_status_unknown;
1507 1385
1508 DRM_DEBUG_KMS("SDVO response %d %d\n", response & 0xff, response >> 8); 1386 DRM_DEBUG_KMS("SDVO response %d %d [%x]\n",
1387 response & 0xff, response >> 8,
1388 intel_sdvo_connector->output_flag);
1509 1389
1510 if (response == 0) 1390 if (response == 0)
1511 return connector_status_disconnected; 1391 return connector_status_disconnected;
1512 1392
1513 intel_sdvo->attached_output = response; 1393 intel_sdvo->attached_output = response;
1514 1394
1395 intel_sdvo->has_hdmi_monitor = false;
1396 intel_sdvo->has_hdmi_audio = false;
1397
1515 if ((intel_sdvo_connector->output_flag & response) == 0) 1398 if ((intel_sdvo_connector->output_flag & response) == 0)
1516 ret = connector_status_disconnected; 1399 ret = connector_status_disconnected;
1517 else if (response & SDVO_TMDS_MASK) 1400 else if (IS_TMDS(intel_sdvo_connector))
1518 ret = intel_sdvo_hdmi_sink_detect(connector); 1401 ret = intel_sdvo_hdmi_sink_detect(connector);
1519 else 1402 else {
1520 ret = connector_status_connected; 1403 struct edid *edid;
1404
1405 /* if we have an edid check it matches the connection */
1406 edid = intel_sdvo_get_edid(connector);
1407 if (edid == NULL)
1408 edid = intel_sdvo_get_analog_edid(connector);
1409 if (edid != NULL) {
1410 if (edid->input & DRM_EDID_INPUT_DIGITAL)
1411 ret = connector_status_disconnected;
1412 else
1413 ret = connector_status_connected;
1414 connector->display_info.raw_edid = NULL;
1415 kfree(edid);
1416 } else
1417 ret = connector_status_connected;
1418 }
1521 1419
1522 /* May update encoder flag for like clock for SDVO TV, etc.*/ 1420 /* May update encoder flag for like clock for SDVO TV, etc.*/
1523 if (ret == connector_status_connected) { 1421 if (ret == connector_status_connected) {
@@ -1538,12 +1436,10 @@ intel_sdvo_detect(struct drm_connector *connector, bool force)
1538 1436
1539static void intel_sdvo_get_ddc_modes(struct drm_connector *connector) 1437static void intel_sdvo_get_ddc_modes(struct drm_connector *connector)
1540{ 1438{
1541 struct drm_encoder *encoder = intel_attached_encoder(connector); 1439 struct edid *edid;
1542 struct intel_sdvo *intel_sdvo = enc_to_intel_sdvo(encoder);
1543 int num_modes;
1544 1440
1545 /* set the bus switch and get the modes */ 1441 /* set the bus switch and get the modes */
1546 num_modes = intel_ddc_get_modes(connector, intel_sdvo->base.ddc_bus); 1442 edid = intel_sdvo_get_edid(connector);
1547 1443
1548 /* 1444 /*
1549 * Mac mini hack. On this device, the DVI-I connector shares one DDC 1445 * Mac mini hack. On this device, the DVI-I connector shares one DDC
@@ -1551,12 +1447,21 @@ static void intel_sdvo_get_ddc_modes(struct drm_connector *connector)
1551 * DDC fails, check to see if the analog output is disconnected, in 1447 * DDC fails, check to see if the analog output is disconnected, in
1552 * which case we'll look there for the digital DDC data. 1448 * which case we'll look there for the digital DDC data.
1553 */ 1449 */
1554 if (num_modes == 0 && 1450 if (edid == NULL)
1555 intel_sdvo->analog_ddc_bus && 1451 edid = intel_sdvo_get_analog_edid(connector);
1556 !intel_analog_is_connected(connector->dev)) { 1452
1557 /* Switch to the analog ddc bus and try that 1453 if (edid != NULL) {
1558 */ 1454 struct intel_sdvo_connector *intel_sdvo_connector = to_intel_sdvo_connector(connector);
1559 (void) intel_ddc_get_modes(connector, intel_sdvo->analog_ddc_bus); 1455 bool monitor_is_digital = !!(edid->input & DRM_EDID_INPUT_DIGITAL);
1456 bool connector_is_digital = !!IS_TMDS(intel_sdvo_connector);
1457
1458 if (connector_is_digital == monitor_is_digital) {
1459 drm_mode_connector_update_edid_property(connector, edid);
1460 drm_add_edid_modes(connector, edid);
1461 }
1462
1463 connector->display_info.raw_edid = NULL;
1464 kfree(edid);
1560 } 1465 }
1561} 1466}
1562 1467
@@ -1565,7 +1470,7 @@ static void intel_sdvo_get_ddc_modes(struct drm_connector *connector)
1565 * Note! This is in reply order (see loop in get_tv_modes). 1470 * Note! This is in reply order (see loop in get_tv_modes).
1566 * XXX: all 60Hz refresh? 1471 * XXX: all 60Hz refresh?
1567 */ 1472 */
1568struct drm_display_mode sdvo_tv_modes[] = { 1473static const struct drm_display_mode sdvo_tv_modes[] = {
1569 { DRM_MODE("320x200", DRM_MODE_TYPE_DRIVER, 5815, 320, 321, 384, 1474 { DRM_MODE("320x200", DRM_MODE_TYPE_DRIVER, 5815, 320, 321, 384,
1570 416, 0, 200, 201, 232, 233, 0, 1475 416, 0, 200, 201, 232, 233, 0,
1571 DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, 1476 DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
@@ -1627,8 +1532,7 @@ struct drm_display_mode sdvo_tv_modes[] = {
1627 1532
1628static void intel_sdvo_get_tv_modes(struct drm_connector *connector) 1533static void intel_sdvo_get_tv_modes(struct drm_connector *connector)
1629{ 1534{
1630 struct drm_encoder *encoder = intel_attached_encoder(connector); 1535 struct intel_sdvo *intel_sdvo = intel_attached_sdvo(connector);
1631 struct intel_sdvo *intel_sdvo = enc_to_intel_sdvo(encoder);
1632 struct intel_sdvo_sdtv_resolution_request tv_res; 1536 struct intel_sdvo_sdtv_resolution_request tv_res;
1633 uint32_t reply = 0, format_map = 0; 1537 uint32_t reply = 0, format_map = 0;
1634 int i; 1538 int i;
@@ -1644,7 +1548,8 @@ static void intel_sdvo_get_tv_modes(struct drm_connector *connector)
1644 return; 1548 return;
1645 1549
1646 BUILD_BUG_ON(sizeof(tv_res) != 3); 1550 BUILD_BUG_ON(sizeof(tv_res) != 3);
1647 if (!intel_sdvo_write_cmd(intel_sdvo, SDVO_CMD_GET_SDTV_RESOLUTION_SUPPORT, 1551 if (!intel_sdvo_write_cmd(intel_sdvo,
1552 SDVO_CMD_GET_SDTV_RESOLUTION_SUPPORT,
1648 &tv_res, sizeof(tv_res))) 1553 &tv_res, sizeof(tv_res)))
1649 return; 1554 return;
1650 if (!intel_sdvo_read_response(intel_sdvo, &reply, 3)) 1555 if (!intel_sdvo_read_response(intel_sdvo, &reply, 3))
@@ -1662,8 +1567,7 @@ static void intel_sdvo_get_tv_modes(struct drm_connector *connector)
1662 1567
1663static void intel_sdvo_get_lvds_modes(struct drm_connector *connector) 1568static void intel_sdvo_get_lvds_modes(struct drm_connector *connector)
1664{ 1569{
1665 struct drm_encoder *encoder = intel_attached_encoder(connector); 1570 struct intel_sdvo *intel_sdvo = intel_attached_sdvo(connector);
1666 struct intel_sdvo *intel_sdvo = enc_to_intel_sdvo(encoder);
1667 struct drm_i915_private *dev_priv = connector->dev->dev_private; 1571 struct drm_i915_private *dev_priv = connector->dev->dev_private;
1668 struct drm_display_mode *newmode; 1572 struct drm_display_mode *newmode;
1669 1573
@@ -1672,7 +1576,7 @@ static void intel_sdvo_get_lvds_modes(struct drm_connector *connector)
1672 * Assume that the preferred modes are 1576 * Assume that the preferred modes are
1673 * arranged in priority order. 1577 * arranged in priority order.
1674 */ 1578 */
1675 intel_ddc_get_modes(connector, intel_sdvo->base.ddc_bus); 1579 intel_ddc_get_modes(connector, intel_sdvo->i2c);
1676 if (list_empty(&connector->probed_modes) == false) 1580 if (list_empty(&connector->probed_modes) == false)
1677 goto end; 1581 goto end;
1678 1582
@@ -1693,6 +1597,10 @@ end:
1693 if (newmode->type & DRM_MODE_TYPE_PREFERRED) { 1597 if (newmode->type & DRM_MODE_TYPE_PREFERRED) {
1694 intel_sdvo->sdvo_lvds_fixed_mode = 1598 intel_sdvo->sdvo_lvds_fixed_mode =
1695 drm_mode_duplicate(connector->dev, newmode); 1599 drm_mode_duplicate(connector->dev, newmode);
1600
1601 drm_mode_set_crtcinfo(intel_sdvo->sdvo_lvds_fixed_mode,
1602 0);
1603
1696 intel_sdvo->is_lvds = true; 1604 intel_sdvo->is_lvds = true;
1697 break; 1605 break;
1698 } 1606 }
@@ -1770,14 +1678,30 @@ static void intel_sdvo_destroy(struct drm_connector *connector)
1770 kfree(connector); 1678 kfree(connector);
1771} 1679}
1772 1680
1681static bool intel_sdvo_detect_hdmi_audio(struct drm_connector *connector)
1682{
1683 struct intel_sdvo *intel_sdvo = intel_attached_sdvo(connector);
1684 struct edid *edid;
1685 bool has_audio = false;
1686
1687 if (!intel_sdvo->is_hdmi)
1688 return false;
1689
1690 edid = intel_sdvo_get_edid(connector);
1691 if (edid != NULL && edid->input & DRM_EDID_INPUT_DIGITAL)
1692 has_audio = drm_detect_monitor_audio(edid);
1693
1694 return has_audio;
1695}
1696
1773static int 1697static int
1774intel_sdvo_set_property(struct drm_connector *connector, 1698intel_sdvo_set_property(struct drm_connector *connector,
1775 struct drm_property *property, 1699 struct drm_property *property,
1776 uint64_t val) 1700 uint64_t val)
1777{ 1701{
1778 struct drm_encoder *encoder = intel_attached_encoder(connector); 1702 struct intel_sdvo *intel_sdvo = intel_attached_sdvo(connector);
1779 struct intel_sdvo *intel_sdvo = enc_to_intel_sdvo(encoder);
1780 struct intel_sdvo_connector *intel_sdvo_connector = to_intel_sdvo_connector(connector); 1703 struct intel_sdvo_connector *intel_sdvo_connector = to_intel_sdvo_connector(connector);
1704 struct drm_i915_private *dev_priv = connector->dev->dev_private;
1781 uint16_t temp_value; 1705 uint16_t temp_value;
1782 uint8_t cmd; 1706 uint8_t cmd;
1783 int ret; 1707 int ret;
@@ -1786,6 +1710,35 @@ intel_sdvo_set_property(struct drm_connector *connector,
1786 if (ret) 1710 if (ret)
1787 return ret; 1711 return ret;
1788 1712
1713 if (property == dev_priv->force_audio_property) {
1714 int i = val;
1715 bool has_audio;
1716
1717 if (i == intel_sdvo_connector->force_audio)
1718 return 0;
1719
1720 intel_sdvo_connector->force_audio = i;
1721
1722 if (i == 0)
1723 has_audio = intel_sdvo_detect_hdmi_audio(connector);
1724 else
1725 has_audio = i > 0;
1726
1727 if (has_audio == intel_sdvo->has_hdmi_audio)
1728 return 0;
1729
1730 intel_sdvo->has_hdmi_audio = has_audio;
1731 goto done;
1732 }
1733
1734 if (property == dev_priv->broadcast_rgb_property) {
1735 if (val == !!intel_sdvo->color_range)
1736 return 0;
1737
1738 intel_sdvo->color_range = val ? SDVO_COLOR_RANGE_16_235 : 0;
1739 goto done;
1740 }
1741
1789#define CHECK_PROPERTY(name, NAME) \ 1742#define CHECK_PROPERTY(name, NAME) \
1790 if (intel_sdvo_connector->name == property) { \ 1743 if (intel_sdvo_connector->name == property) { \
1791 if (intel_sdvo_connector->cur_##name == temp_value) return 0; \ 1744 if (intel_sdvo_connector->cur_##name == temp_value) return 0; \
@@ -1879,9 +1832,8 @@ set_value:
1879 1832
1880 1833
1881done: 1834done:
1882 if (encoder->crtc) { 1835 if (intel_sdvo->base.base.crtc) {
1883 struct drm_crtc *crtc = encoder->crtc; 1836 struct drm_crtc *crtc = intel_sdvo->base.base.crtc;
1884
1885 drm_crtc_helper_set_mode(crtc, &crtc->mode, crtc->x, 1837 drm_crtc_helper_set_mode(crtc, &crtc->mode, crtc->x,
1886 crtc->y, crtc->fb); 1838 crtc->y, crtc->fb);
1887 } 1839 }
@@ -1909,20 +1861,18 @@ static const struct drm_connector_funcs intel_sdvo_connector_funcs = {
1909static const struct drm_connector_helper_funcs intel_sdvo_connector_helper_funcs = { 1861static const struct drm_connector_helper_funcs intel_sdvo_connector_helper_funcs = {
1910 .get_modes = intel_sdvo_get_modes, 1862 .get_modes = intel_sdvo_get_modes,
1911 .mode_valid = intel_sdvo_mode_valid, 1863 .mode_valid = intel_sdvo_mode_valid,
1912 .best_encoder = intel_attached_encoder, 1864 .best_encoder = intel_best_encoder,
1913}; 1865};
1914 1866
1915static void intel_sdvo_enc_destroy(struct drm_encoder *encoder) 1867static void intel_sdvo_enc_destroy(struct drm_encoder *encoder)
1916{ 1868{
1917 struct intel_sdvo *intel_sdvo = enc_to_intel_sdvo(encoder); 1869 struct intel_sdvo *intel_sdvo = to_intel_sdvo(encoder);
1918
1919 if (intel_sdvo->analog_ddc_bus)
1920 intel_i2c_destroy(intel_sdvo->analog_ddc_bus);
1921 1870
1922 if (intel_sdvo->sdvo_lvds_fixed_mode != NULL) 1871 if (intel_sdvo->sdvo_lvds_fixed_mode != NULL)
1923 drm_mode_destroy(encoder->dev, 1872 drm_mode_destroy(encoder->dev,
1924 intel_sdvo->sdvo_lvds_fixed_mode); 1873 intel_sdvo->sdvo_lvds_fixed_mode);
1925 1874
1875 i2c_del_adapter(&intel_sdvo->ddc);
1926 intel_encoder_destroy(encoder); 1876 intel_encoder_destroy(encoder);
1927} 1877}
1928 1878
@@ -1990,54 +1940,39 @@ intel_sdvo_select_ddc_bus(struct drm_i915_private *dev_priv,
1990 intel_sdvo_guess_ddc_bus(sdvo); 1940 intel_sdvo_guess_ddc_bus(sdvo);
1991} 1941}
1992 1942
1993static bool 1943static void
1994intel_sdvo_get_digital_encoding_mode(struct intel_sdvo *intel_sdvo, int device) 1944intel_sdvo_select_i2c_bus(struct drm_i915_private *dev_priv,
1945 struct intel_sdvo *sdvo, u32 reg)
1995{ 1946{
1996 return intel_sdvo_set_target_output(intel_sdvo, 1947 struct sdvo_device_mapping *mapping;
1997 device == 0 ? SDVO_OUTPUT_TMDS0 : SDVO_OUTPUT_TMDS1) && 1948 u8 pin, speed;
1998 intel_sdvo_get_value(intel_sdvo, SDVO_CMD_GET_ENCODE,
1999 &intel_sdvo->is_hdmi, 1);
2000}
2001 1949
2002static struct intel_sdvo * 1950 if (IS_SDVOB(reg))
2003intel_sdvo_chan_to_intel_sdvo(struct intel_i2c_chan *chan) 1951 mapping = &dev_priv->sdvo_mappings[0];
2004{ 1952 else
2005 struct drm_device *dev = chan->drm_dev; 1953 mapping = &dev_priv->sdvo_mappings[1];
2006 struct drm_encoder *encoder;
2007 1954
2008 list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { 1955 pin = GMBUS_PORT_DPB;
2009 struct intel_sdvo *intel_sdvo = enc_to_intel_sdvo(encoder); 1956 speed = GMBUS_RATE_1MHZ >> 8;
2010 if (intel_sdvo->base.ddc_bus == &chan->adapter) 1957 if (mapping->initialized) {
2011 return intel_sdvo; 1958 pin = mapping->i2c_pin;
1959 speed = mapping->i2c_speed;
2012 } 1960 }
2013 1961
2014 return NULL; 1962 if (pin < GMBUS_NUM_PORTS) {
1963 sdvo->i2c = &dev_priv->gmbus[pin].adapter;
1964 intel_gmbus_set_speed(sdvo->i2c, speed);
1965 intel_gmbus_force_bit(sdvo->i2c, true);
1966 } else
1967 sdvo->i2c = &dev_priv->gmbus[GMBUS_PORT_DPB].adapter;
2015} 1968}
2016 1969
2017static int intel_sdvo_master_xfer(struct i2c_adapter *i2c_adap, 1970static bool
2018 struct i2c_msg msgs[], int num) 1971intel_sdvo_is_hdmi_connector(struct intel_sdvo *intel_sdvo, int device)
2019{ 1972{
2020 struct intel_sdvo *intel_sdvo; 1973 return intel_sdvo_check_supp_encode(intel_sdvo);
2021 struct i2c_algo_bit_data *algo_data;
2022 const struct i2c_algorithm *algo;
2023
2024 algo_data = (struct i2c_algo_bit_data *)i2c_adap->algo_data;
2025 intel_sdvo =
2026 intel_sdvo_chan_to_intel_sdvo((struct intel_i2c_chan *)
2027 (algo_data->data));
2028 if (intel_sdvo == NULL)
2029 return -EINVAL;
2030
2031 algo = intel_sdvo->base.i2c_bus->algo;
2032
2033 intel_sdvo_set_control_bus_switch(intel_sdvo, intel_sdvo->ddc_bus);
2034 return algo->master_xfer(i2c_adap, msgs, num);
2035} 1974}
2036 1975
2037static struct i2c_algorithm intel_sdvo_i2c_bit_algo = {
2038 .master_xfer = intel_sdvo_master_xfer,
2039};
2040
2041static u8 1976static u8
2042intel_sdvo_get_slave_addr(struct drm_device *dev, int sdvo_reg) 1977intel_sdvo_get_slave_addr(struct drm_device *dev, int sdvo_reg)
2043{ 1978{
@@ -2076,26 +2011,39 @@ intel_sdvo_get_slave_addr(struct drm_device *dev, int sdvo_reg)
2076} 2011}
2077 2012
2078static void 2013static void
2079intel_sdvo_connector_init(struct drm_encoder *encoder, 2014intel_sdvo_connector_init(struct intel_sdvo_connector *connector,
2080 struct drm_connector *connector) 2015 struct intel_sdvo *encoder)
2081{ 2016{
2082 drm_connector_init(encoder->dev, connector, &intel_sdvo_connector_funcs, 2017 drm_connector_init(encoder->base.base.dev,
2083 connector->connector_type); 2018 &connector->base.base,
2019 &intel_sdvo_connector_funcs,
2020 connector->base.base.connector_type);
2084 2021
2085 drm_connector_helper_add(connector, &intel_sdvo_connector_helper_funcs); 2022 drm_connector_helper_add(&connector->base.base,
2023 &intel_sdvo_connector_helper_funcs);
2086 2024
2087 connector->interlace_allowed = 0; 2025 connector->base.base.interlace_allowed = 0;
2088 connector->doublescan_allowed = 0; 2026 connector->base.base.doublescan_allowed = 0;
2089 connector->display_info.subpixel_order = SubPixelHorizontalRGB; 2027 connector->base.base.display_info.subpixel_order = SubPixelHorizontalRGB;
2090 2028
2091 drm_mode_connector_attach_encoder(connector, encoder); 2029 intel_connector_attach_encoder(&connector->base, &encoder->base);
2092 drm_sysfs_connector_add(connector); 2030 drm_sysfs_connector_add(&connector->base.base);
2031}
2032
2033static void
2034intel_sdvo_add_hdmi_properties(struct intel_sdvo_connector *connector)
2035{
2036 struct drm_device *dev = connector->base.base.dev;
2037
2038 intel_attach_force_audio_property(&connector->base.base);
2039 if (INTEL_INFO(dev)->gen >= 4 && IS_MOBILE(dev))
2040 intel_attach_broadcast_rgb_property(&connector->base.base);
2093} 2041}
2094 2042
2095static bool 2043static bool
2096intel_sdvo_dvi_init(struct intel_sdvo *intel_sdvo, int device) 2044intel_sdvo_dvi_init(struct intel_sdvo *intel_sdvo, int device)
2097{ 2045{
2098 struct drm_encoder *encoder = &intel_sdvo->base.enc; 2046 struct drm_encoder *encoder = &intel_sdvo->base.base;
2099 struct drm_connector *connector; 2047 struct drm_connector *connector;
2100 struct intel_connector *intel_connector; 2048 struct intel_connector *intel_connector;
2101 struct intel_sdvo_connector *intel_sdvo_connector; 2049 struct intel_sdvo_connector *intel_sdvo_connector;
@@ -2118,19 +2066,16 @@ intel_sdvo_dvi_init(struct intel_sdvo *intel_sdvo, int device)
2118 encoder->encoder_type = DRM_MODE_ENCODER_TMDS; 2066 encoder->encoder_type = DRM_MODE_ENCODER_TMDS;
2119 connector->connector_type = DRM_MODE_CONNECTOR_DVID; 2067 connector->connector_type = DRM_MODE_CONNECTOR_DVID;
2120 2068
2121 if (intel_sdvo_get_supp_encode(intel_sdvo, &intel_sdvo->encode) 2069 if (intel_sdvo_is_hdmi_connector(intel_sdvo, device)) {
2122 && intel_sdvo_get_digital_encoding_mode(intel_sdvo, device)
2123 && intel_sdvo->is_hdmi) {
2124 /* enable hdmi encoding mode if supported */
2125 intel_sdvo_set_encode(intel_sdvo, SDVO_ENCODE_HDMI);
2126 intel_sdvo_set_colorimetry(intel_sdvo,
2127 SDVO_COLORIMETRY_RGB256);
2128 connector->connector_type = DRM_MODE_CONNECTOR_HDMIA; 2070 connector->connector_type = DRM_MODE_CONNECTOR_HDMIA;
2071 intel_sdvo->is_hdmi = true;
2129 } 2072 }
2130 intel_sdvo->base.clone_mask = ((1 << INTEL_SDVO_NON_TV_CLONE_BIT) | 2073 intel_sdvo->base.clone_mask = ((1 << INTEL_SDVO_NON_TV_CLONE_BIT) |
2131 (1 << INTEL_ANALOG_CLONE_BIT)); 2074 (1 << INTEL_ANALOG_CLONE_BIT));
2132 2075
2133 intel_sdvo_connector_init(encoder, connector); 2076 intel_sdvo_connector_init(intel_sdvo_connector, intel_sdvo);
2077 if (intel_sdvo->is_hdmi)
2078 intel_sdvo_add_hdmi_properties(intel_sdvo_connector);
2134 2079
2135 return true; 2080 return true;
2136} 2081}
@@ -2138,36 +2083,36 @@ intel_sdvo_dvi_init(struct intel_sdvo *intel_sdvo, int device)
2138static bool 2083static bool
2139intel_sdvo_tv_init(struct intel_sdvo *intel_sdvo, int type) 2084intel_sdvo_tv_init(struct intel_sdvo *intel_sdvo, int type)
2140{ 2085{
2141 struct drm_encoder *encoder = &intel_sdvo->base.enc; 2086 struct drm_encoder *encoder = &intel_sdvo->base.base;
2142 struct drm_connector *connector; 2087 struct drm_connector *connector;
2143 struct intel_connector *intel_connector; 2088 struct intel_connector *intel_connector;
2144 struct intel_sdvo_connector *intel_sdvo_connector; 2089 struct intel_sdvo_connector *intel_sdvo_connector;
2145 2090
2146 intel_sdvo_connector = kzalloc(sizeof(struct intel_sdvo_connector), GFP_KERNEL); 2091 intel_sdvo_connector = kzalloc(sizeof(struct intel_sdvo_connector), GFP_KERNEL);
2147 if (!intel_sdvo_connector) 2092 if (!intel_sdvo_connector)
2148 return false; 2093 return false;
2149 2094
2150 intel_connector = &intel_sdvo_connector->base; 2095 intel_connector = &intel_sdvo_connector->base;
2151 connector = &intel_connector->base; 2096 connector = &intel_connector->base;
2152 encoder->encoder_type = DRM_MODE_ENCODER_TVDAC; 2097 encoder->encoder_type = DRM_MODE_ENCODER_TVDAC;
2153 connector->connector_type = DRM_MODE_CONNECTOR_SVIDEO; 2098 connector->connector_type = DRM_MODE_CONNECTOR_SVIDEO;
2154 2099
2155 intel_sdvo->controlled_output |= type; 2100 intel_sdvo->controlled_output |= type;
2156 intel_sdvo_connector->output_flag = type; 2101 intel_sdvo_connector->output_flag = type;
2157 2102
2158 intel_sdvo->is_tv = true; 2103 intel_sdvo->is_tv = true;
2159 intel_sdvo->base.needs_tv_clock = true; 2104 intel_sdvo->base.needs_tv_clock = true;
2160 intel_sdvo->base.clone_mask = 1 << INTEL_SDVO_TV_CLONE_BIT; 2105 intel_sdvo->base.clone_mask = 1 << INTEL_SDVO_TV_CLONE_BIT;
2161 2106
2162 intel_sdvo_connector_init(encoder, connector); 2107 intel_sdvo_connector_init(intel_sdvo_connector, intel_sdvo);
2163 2108
2164 if (!intel_sdvo_tv_create_property(intel_sdvo, intel_sdvo_connector, type)) 2109 if (!intel_sdvo_tv_create_property(intel_sdvo, intel_sdvo_connector, type))
2165 goto err; 2110 goto err;
2166 2111
2167 if (!intel_sdvo_create_enhance_property(intel_sdvo, intel_sdvo_connector)) 2112 if (!intel_sdvo_create_enhance_property(intel_sdvo, intel_sdvo_connector))
2168 goto err; 2113 goto err;
2169 2114
2170 return true; 2115 return true;
2171 2116
2172err: 2117err:
2173 intel_sdvo_destroy(connector); 2118 intel_sdvo_destroy(connector);
@@ -2177,43 +2122,44 @@ err:
2177static bool 2122static bool
2178intel_sdvo_analog_init(struct intel_sdvo *intel_sdvo, int device) 2123intel_sdvo_analog_init(struct intel_sdvo *intel_sdvo, int device)
2179{ 2124{
2180 struct drm_encoder *encoder = &intel_sdvo->base.enc; 2125 struct drm_encoder *encoder = &intel_sdvo->base.base;
2181 struct drm_connector *connector; 2126 struct drm_connector *connector;
2182 struct intel_connector *intel_connector; 2127 struct intel_connector *intel_connector;
2183 struct intel_sdvo_connector *intel_sdvo_connector; 2128 struct intel_sdvo_connector *intel_sdvo_connector;
2184 2129
2185 intel_sdvo_connector = kzalloc(sizeof(struct intel_sdvo_connector), GFP_KERNEL); 2130 intel_sdvo_connector = kzalloc(sizeof(struct intel_sdvo_connector), GFP_KERNEL);
2186 if (!intel_sdvo_connector) 2131 if (!intel_sdvo_connector)
2187 return false; 2132 return false;
2188 2133
2189 intel_connector = &intel_sdvo_connector->base; 2134 intel_connector = &intel_sdvo_connector->base;
2190 connector = &intel_connector->base; 2135 connector = &intel_connector->base;
2191 connector->polled = DRM_CONNECTOR_POLL_CONNECT; 2136 connector->polled = DRM_CONNECTOR_POLL_CONNECT;
2192 encoder->encoder_type = DRM_MODE_ENCODER_DAC; 2137 encoder->encoder_type = DRM_MODE_ENCODER_DAC;
2193 connector->connector_type = DRM_MODE_CONNECTOR_VGA; 2138 connector->connector_type = DRM_MODE_CONNECTOR_VGA;
2194 2139
2195 if (device == 0) { 2140 if (device == 0) {
2196 intel_sdvo->controlled_output |= SDVO_OUTPUT_RGB0; 2141 intel_sdvo->controlled_output |= SDVO_OUTPUT_RGB0;
2197 intel_sdvo_connector->output_flag = SDVO_OUTPUT_RGB0; 2142 intel_sdvo_connector->output_flag = SDVO_OUTPUT_RGB0;
2198 } else if (device == 1) { 2143 } else if (device == 1) {
2199 intel_sdvo->controlled_output |= SDVO_OUTPUT_RGB1; 2144 intel_sdvo->controlled_output |= SDVO_OUTPUT_RGB1;
2200 intel_sdvo_connector->output_flag = SDVO_OUTPUT_RGB1; 2145 intel_sdvo_connector->output_flag = SDVO_OUTPUT_RGB1;
2201 } 2146 }
2202 2147
2203 intel_sdvo->base.clone_mask = ((1 << INTEL_SDVO_NON_TV_CLONE_BIT) | 2148 intel_sdvo->base.clone_mask = ((1 << INTEL_SDVO_NON_TV_CLONE_BIT) |
2204 (1 << INTEL_ANALOG_CLONE_BIT)); 2149 (1 << INTEL_ANALOG_CLONE_BIT));
2205 2150
2206 intel_sdvo_connector_init(encoder, connector); 2151 intel_sdvo_connector_init(intel_sdvo_connector,
2207 return true; 2152 intel_sdvo);
2153 return true;
2208} 2154}
2209 2155
2210static bool 2156static bool
2211intel_sdvo_lvds_init(struct intel_sdvo *intel_sdvo, int device) 2157intel_sdvo_lvds_init(struct intel_sdvo *intel_sdvo, int device)
2212{ 2158{
2213 struct drm_encoder *encoder = &intel_sdvo->base.enc; 2159 struct drm_encoder *encoder = &intel_sdvo->base.base;
2214 struct drm_connector *connector; 2160 struct drm_connector *connector;
2215 struct intel_connector *intel_connector; 2161 struct intel_connector *intel_connector;
2216 struct intel_sdvo_connector *intel_sdvo_connector; 2162 struct intel_sdvo_connector *intel_sdvo_connector;
2217 2163
2218 intel_sdvo_connector = kzalloc(sizeof(struct intel_sdvo_connector), GFP_KERNEL); 2164 intel_sdvo_connector = kzalloc(sizeof(struct intel_sdvo_connector), GFP_KERNEL);
2219 if (!intel_sdvo_connector) 2165 if (!intel_sdvo_connector)
@@ -2221,22 +2167,22 @@ intel_sdvo_lvds_init(struct intel_sdvo *intel_sdvo, int device)
2221 2167
2222 intel_connector = &intel_sdvo_connector->base; 2168 intel_connector = &intel_sdvo_connector->base;
2223 connector = &intel_connector->base; 2169 connector = &intel_connector->base;
2224 encoder->encoder_type = DRM_MODE_ENCODER_LVDS; 2170 encoder->encoder_type = DRM_MODE_ENCODER_LVDS;
2225 connector->connector_type = DRM_MODE_CONNECTOR_LVDS; 2171 connector->connector_type = DRM_MODE_CONNECTOR_LVDS;
2226 2172
2227 if (device == 0) { 2173 if (device == 0) {
2228 intel_sdvo->controlled_output |= SDVO_OUTPUT_LVDS0; 2174 intel_sdvo->controlled_output |= SDVO_OUTPUT_LVDS0;
2229 intel_sdvo_connector->output_flag = SDVO_OUTPUT_LVDS0; 2175 intel_sdvo_connector->output_flag = SDVO_OUTPUT_LVDS0;
2230 } else if (device == 1) { 2176 } else if (device == 1) {
2231 intel_sdvo->controlled_output |= SDVO_OUTPUT_LVDS1; 2177 intel_sdvo->controlled_output |= SDVO_OUTPUT_LVDS1;
2232 intel_sdvo_connector->output_flag = SDVO_OUTPUT_LVDS1; 2178 intel_sdvo_connector->output_flag = SDVO_OUTPUT_LVDS1;
2233 } 2179 }
2234 2180
2235 intel_sdvo->base.clone_mask = ((1 << INTEL_ANALOG_CLONE_BIT) | 2181 intel_sdvo->base.clone_mask = ((1 << INTEL_ANALOG_CLONE_BIT) |
2236 (1 << INTEL_SDVO_LVDS_CLONE_BIT)); 2182 (1 << INTEL_SDVO_LVDS_CLONE_BIT));
2237 2183
2238 intel_sdvo_connector_init(encoder, connector); 2184 intel_sdvo_connector_init(intel_sdvo_connector, intel_sdvo);
2239 if (!intel_sdvo_create_enhance_property(intel_sdvo, intel_sdvo_connector)) 2185 if (!intel_sdvo_create_enhance_property(intel_sdvo, intel_sdvo_connector))
2240 goto err; 2186 goto err;
2241 2187
2242 return true; 2188 return true;
@@ -2307,13 +2253,14 @@ static bool intel_sdvo_tv_create_property(struct intel_sdvo *intel_sdvo,
2307 struct intel_sdvo_connector *intel_sdvo_connector, 2253 struct intel_sdvo_connector *intel_sdvo_connector,
2308 int type) 2254 int type)
2309{ 2255{
2310 struct drm_device *dev = intel_sdvo->base.enc.dev; 2256 struct drm_device *dev = intel_sdvo->base.base.dev;
2311 struct intel_sdvo_tv_format format; 2257 struct intel_sdvo_tv_format format;
2312 uint32_t format_map, i; 2258 uint32_t format_map, i;
2313 2259
2314 if (!intel_sdvo_set_target_output(intel_sdvo, type)) 2260 if (!intel_sdvo_set_target_output(intel_sdvo, type))
2315 return false; 2261 return false;
2316 2262
2263 BUILD_BUG_ON(sizeof(format) != 6);
2317 if (!intel_sdvo_get_value(intel_sdvo, 2264 if (!intel_sdvo_get_value(intel_sdvo,
2318 SDVO_CMD_GET_SUPPORTED_TV_FORMATS, 2265 SDVO_CMD_GET_SUPPORTED_TV_FORMATS,
2319 &format, sizeof(format))) 2266 &format, sizeof(format)))
@@ -2373,7 +2320,7 @@ intel_sdvo_create_enhance_property_tv(struct intel_sdvo *intel_sdvo,
2373 struct intel_sdvo_connector *intel_sdvo_connector, 2320 struct intel_sdvo_connector *intel_sdvo_connector,
2374 struct intel_sdvo_enhancements_reply enhancements) 2321 struct intel_sdvo_enhancements_reply enhancements)
2375{ 2322{
2376 struct drm_device *dev = intel_sdvo->base.enc.dev; 2323 struct drm_device *dev = intel_sdvo->base.base.dev;
2377 struct drm_connector *connector = &intel_sdvo_connector->base.base; 2324 struct drm_connector *connector = &intel_sdvo_connector->base.base;
2378 uint16_t response, data_value[2]; 2325 uint16_t response, data_value[2];
2379 2326
@@ -2502,7 +2449,7 @@ intel_sdvo_create_enhance_property_lvds(struct intel_sdvo *intel_sdvo,
2502 struct intel_sdvo_connector *intel_sdvo_connector, 2449 struct intel_sdvo_connector *intel_sdvo_connector,
2503 struct intel_sdvo_enhancements_reply enhancements) 2450 struct intel_sdvo_enhancements_reply enhancements)
2504{ 2451{
2505 struct drm_device *dev = intel_sdvo->base.enc.dev; 2452 struct drm_device *dev = intel_sdvo->base.base.dev;
2506 struct drm_connector *connector = &intel_sdvo_connector->base.base; 2453 struct drm_connector *connector = &intel_sdvo_connector->base.base;
2507 uint16_t response, data_value[2]; 2454 uint16_t response, data_value[2];
2508 2455
@@ -2520,6 +2467,8 @@ static bool intel_sdvo_create_enhance_property(struct intel_sdvo *intel_sdvo,
2520 uint16_t response; 2467 uint16_t response;
2521 } enhancements; 2468 } enhancements;
2522 2469
2470 BUILD_BUG_ON(sizeof(enhancements) != 2);
2471
2523 enhancements.response = 0; 2472 enhancements.response = 0;
2524 intel_sdvo_get_value(intel_sdvo, 2473 intel_sdvo_get_value(intel_sdvo,
2525 SDVO_CMD_GET_SUPPORTED_ENHANCEMENTS, 2474 SDVO_CMD_GET_SUPPORTED_ENHANCEMENTS,
@@ -2535,7 +2484,43 @@ static bool intel_sdvo_create_enhance_property(struct intel_sdvo *intel_sdvo,
2535 return intel_sdvo_create_enhance_property_lvds(intel_sdvo, intel_sdvo_connector, enhancements.reply); 2484 return intel_sdvo_create_enhance_property_lvds(intel_sdvo, intel_sdvo_connector, enhancements.reply);
2536 else 2485 else
2537 return true; 2486 return true;
2487}
2538 2488
2489static int intel_sdvo_ddc_proxy_xfer(struct i2c_adapter *adapter,
2490 struct i2c_msg *msgs,
2491 int num)
2492{
2493 struct intel_sdvo *sdvo = adapter->algo_data;
2494
2495 if (!intel_sdvo_set_control_bus_switch(sdvo, sdvo->ddc_bus))
2496 return -EIO;
2497
2498 return sdvo->i2c->algo->master_xfer(sdvo->i2c, msgs, num);
2499}
2500
2501static u32 intel_sdvo_ddc_proxy_func(struct i2c_adapter *adapter)
2502{
2503 struct intel_sdvo *sdvo = adapter->algo_data;
2504 return sdvo->i2c->algo->functionality(sdvo->i2c);
2505}
2506
2507static const struct i2c_algorithm intel_sdvo_ddc_proxy = {
2508 .master_xfer = intel_sdvo_ddc_proxy_xfer,
2509 .functionality = intel_sdvo_ddc_proxy_func
2510};
2511
2512static bool
2513intel_sdvo_init_ddc_proxy(struct intel_sdvo *sdvo,
2514 struct drm_device *dev)
2515{
2516 sdvo->ddc.owner = THIS_MODULE;
2517 sdvo->ddc.class = I2C_CLASS_DDC;
2518 snprintf(sdvo->ddc.name, I2C_NAME_SIZE, "SDVO DDC proxy");
2519 sdvo->ddc.dev.parent = &dev->pdev->dev;
2520 sdvo->ddc.algo_data = sdvo;
2521 sdvo->ddc.algo = &intel_sdvo_ddc_proxy;
2522
2523 return i2c_add_adapter(&sdvo->ddc) == 0;
2539} 2524}
2540 2525
2541bool intel_sdvo_init(struct drm_device *dev, int sdvo_reg) 2526bool intel_sdvo_init(struct drm_device *dev, int sdvo_reg)
@@ -2543,95 +2528,64 @@ bool intel_sdvo_init(struct drm_device *dev, int sdvo_reg)
2543 struct drm_i915_private *dev_priv = dev->dev_private; 2528 struct drm_i915_private *dev_priv = dev->dev_private;
2544 struct intel_encoder *intel_encoder; 2529 struct intel_encoder *intel_encoder;
2545 struct intel_sdvo *intel_sdvo; 2530 struct intel_sdvo *intel_sdvo;
2546 u8 ch[0x40];
2547 int i; 2531 int i;
2548 u32 i2c_reg, ddc_reg, analog_ddc_reg;
2549 2532
2550 intel_sdvo = kzalloc(sizeof(struct intel_sdvo), GFP_KERNEL); 2533 intel_sdvo = kzalloc(sizeof(struct intel_sdvo), GFP_KERNEL);
2551 if (!intel_sdvo) 2534 if (!intel_sdvo)
2552 return false; 2535 return false;
2553 2536
2554 intel_sdvo->sdvo_reg = sdvo_reg; 2537 intel_sdvo->sdvo_reg = sdvo_reg;
2538 intel_sdvo->slave_addr = intel_sdvo_get_slave_addr(dev, sdvo_reg) >> 1;
2539 intel_sdvo_select_i2c_bus(dev_priv, intel_sdvo, sdvo_reg);
2540 if (!intel_sdvo_init_ddc_proxy(intel_sdvo, dev)) {
2541 kfree(intel_sdvo);
2542 return false;
2543 }
2555 2544
2545 /* encoder type will be decided later */
2556 intel_encoder = &intel_sdvo->base; 2546 intel_encoder = &intel_sdvo->base;
2557 intel_encoder->type = INTEL_OUTPUT_SDVO; 2547 intel_encoder->type = INTEL_OUTPUT_SDVO;
2558 2548 drm_encoder_init(dev, &intel_encoder->base, &intel_sdvo_enc_funcs, 0);
2559 if (HAS_PCH_SPLIT(dev)) {
2560 i2c_reg = PCH_GPIOE;
2561 ddc_reg = PCH_GPIOE;
2562 analog_ddc_reg = PCH_GPIOA;
2563 } else {
2564 i2c_reg = GPIOE;
2565 ddc_reg = GPIOE;
2566 analog_ddc_reg = GPIOA;
2567 }
2568
2569 /* setup the DDC bus. */
2570 if (IS_SDVOB(sdvo_reg))
2571 intel_encoder->i2c_bus = intel_i2c_create(dev, i2c_reg, "SDVOCTRL_E for SDVOB");
2572 else
2573 intel_encoder->i2c_bus = intel_i2c_create(dev, i2c_reg, "SDVOCTRL_E for SDVOC");
2574
2575 if (!intel_encoder->i2c_bus)
2576 goto err_inteloutput;
2577
2578 intel_sdvo->slave_addr = intel_sdvo_get_slave_addr(dev, sdvo_reg);
2579
2580 /* Save the bit-banging i2c functionality for use by the DDC wrapper */
2581 intel_sdvo_i2c_bit_algo.functionality = intel_encoder->i2c_bus->algo->functionality;
2582 2549
2583 /* Read the regs to test if we can talk to the device */ 2550 /* Read the regs to test if we can talk to the device */
2584 for (i = 0; i < 0x40; i++) { 2551 for (i = 0; i < 0x40; i++) {
2585 if (!intel_sdvo_read_byte(intel_sdvo, i, &ch[i])) { 2552 u8 byte;
2553
2554 if (!intel_sdvo_read_byte(intel_sdvo, i, &byte)) {
2586 DRM_DEBUG_KMS("No SDVO device found on SDVO%c\n", 2555 DRM_DEBUG_KMS("No SDVO device found on SDVO%c\n",
2587 IS_SDVOB(sdvo_reg) ? 'B' : 'C'); 2556 IS_SDVOB(sdvo_reg) ? 'B' : 'C');
2588 goto err_i2c; 2557 goto err;
2589 } 2558 }
2590 } 2559 }
2591 2560
2592 /* setup the DDC bus. */ 2561 if (IS_SDVOB(sdvo_reg))
2593 if (IS_SDVOB(sdvo_reg)) {
2594 intel_encoder->ddc_bus = intel_i2c_create(dev, ddc_reg, "SDVOB DDC BUS");
2595 intel_sdvo->analog_ddc_bus = intel_i2c_create(dev, analog_ddc_reg,
2596 "SDVOB/VGA DDC BUS");
2597 dev_priv->hotplug_supported_mask |= SDVOB_HOTPLUG_INT_STATUS; 2562 dev_priv->hotplug_supported_mask |= SDVOB_HOTPLUG_INT_STATUS;
2598 } else { 2563 else
2599 intel_encoder->ddc_bus = intel_i2c_create(dev, ddc_reg, "SDVOC DDC BUS");
2600 intel_sdvo->analog_ddc_bus = intel_i2c_create(dev, analog_ddc_reg,
2601 "SDVOC/VGA DDC BUS");
2602 dev_priv->hotplug_supported_mask |= SDVOC_HOTPLUG_INT_STATUS; 2564 dev_priv->hotplug_supported_mask |= SDVOC_HOTPLUG_INT_STATUS;
2603 }
2604 if (intel_encoder->ddc_bus == NULL || intel_sdvo->analog_ddc_bus == NULL)
2605 goto err_i2c;
2606 2565
2607 /* Wrap with our custom algo which switches to DDC mode */ 2566 drm_encoder_helper_add(&intel_encoder->base, &intel_sdvo_helper_funcs);
2608 intel_encoder->ddc_bus->algo = &intel_sdvo_i2c_bit_algo;
2609
2610 /* encoder type will be decided later */
2611 drm_encoder_init(dev, &intel_encoder->enc, &intel_sdvo_enc_funcs, 0);
2612 drm_encoder_helper_add(&intel_encoder->enc, &intel_sdvo_helper_funcs);
2613 2567
2614 /* In default case sdvo lvds is false */ 2568 /* In default case sdvo lvds is false */
2615 if (!intel_sdvo_get_capabilities(intel_sdvo, &intel_sdvo->caps)) 2569 if (!intel_sdvo_get_capabilities(intel_sdvo, &intel_sdvo->caps))
2616 goto err_enc; 2570 goto err;
2617 2571
2618 if (intel_sdvo_output_setup(intel_sdvo, 2572 if (intel_sdvo_output_setup(intel_sdvo,
2619 intel_sdvo->caps.output_flags) != true) { 2573 intel_sdvo->caps.output_flags) != true) {
2620 DRM_DEBUG_KMS("SDVO output failed to setup on SDVO%c\n", 2574 DRM_DEBUG_KMS("SDVO output failed to setup on SDVO%c\n",
2621 IS_SDVOB(sdvo_reg) ? 'B' : 'C'); 2575 IS_SDVOB(sdvo_reg) ? 'B' : 'C');
2622 goto err_enc; 2576 goto err;
2623 } 2577 }
2624 2578
2625 intel_sdvo_select_ddc_bus(dev_priv, intel_sdvo, sdvo_reg); 2579 intel_sdvo_select_ddc_bus(dev_priv, intel_sdvo, sdvo_reg);
2626 2580
2627 /* Set the input timing to the screen. Assume always input 0. */ 2581 /* Set the input timing to the screen. Assume always input 0. */
2628 if (!intel_sdvo_set_target_input(intel_sdvo)) 2582 if (!intel_sdvo_set_target_input(intel_sdvo))
2629 goto err_enc; 2583 goto err;
2630 2584
2631 if (!intel_sdvo_get_input_pixel_clock_range(intel_sdvo, 2585 if (!intel_sdvo_get_input_pixel_clock_range(intel_sdvo,
2632 &intel_sdvo->pixel_clock_min, 2586 &intel_sdvo->pixel_clock_min,
2633 &intel_sdvo->pixel_clock_max)) 2587 &intel_sdvo->pixel_clock_max))
2634 goto err_enc; 2588 goto err;
2635 2589
2636 DRM_DEBUG_KMS("%s device VID/DID: %02X:%02X.%02X, " 2590 DRM_DEBUG_KMS("%s device VID/DID: %02X:%02X.%02X, "
2637 "clock range %dMHz - %dMHz, " 2591 "clock range %dMHz - %dMHz, "
@@ -2651,16 +2605,9 @@ bool intel_sdvo_init(struct drm_device *dev, int sdvo_reg)
2651 (SDVO_OUTPUT_TMDS1 | SDVO_OUTPUT_RGB1) ? 'Y' : 'N'); 2605 (SDVO_OUTPUT_TMDS1 | SDVO_OUTPUT_RGB1) ? 'Y' : 'N');
2652 return true; 2606 return true;
2653 2607
2654err_enc: 2608err:
2655 drm_encoder_cleanup(&intel_encoder->enc); 2609 drm_encoder_cleanup(&intel_encoder->base);
2656err_i2c: 2610 i2c_del_adapter(&intel_sdvo->ddc);
2657 if (intel_sdvo->analog_ddc_bus != NULL)
2658 intel_i2c_destroy(intel_sdvo->analog_ddc_bus);
2659 if (intel_encoder->ddc_bus != NULL)
2660 intel_i2c_destroy(intel_encoder->ddc_bus);
2661 if (intel_encoder->i2c_bus != NULL)
2662 intel_i2c_destroy(intel_encoder->i2c_bus);
2663err_inteloutput:
2664 kfree(intel_sdvo); 2611 kfree(intel_sdvo);
2665 2612
2666 return false; 2613 return false;
diff --git a/drivers/gpu/drm/i915/intel_sdvo_regs.h b/drivers/gpu/drm/i915/intel_sdvo_regs.h
index a386b022e538..4f4e23bc2d16 100644
--- a/drivers/gpu/drm/i915/intel_sdvo_regs.h
+++ b/drivers/gpu/drm/i915/intel_sdvo_regs.h
@@ -230,7 +230,7 @@ struct intel_sdvo_set_target_input_args {
230} __attribute__((packed)); 230} __attribute__((packed));
231 231
232/** 232/**
233 * Takes a struct intel_sdvo_output_flags of which outputs are targetted by 233 * Takes a struct intel_sdvo_output_flags of which outputs are targeted by
234 * future output commands. 234 * future output commands.
235 * 235 *
236 * Affected commands inclue SET_OUTPUT_TIMINGS_PART[12], 236 * Affected commands inclue SET_OUTPUT_TIMINGS_PART[12],
diff --git a/drivers/gpu/drm/i915/intel_tv.c b/drivers/gpu/drm/i915/intel_tv.c
index 4a117e318a73..113e4e7264cd 100644
--- a/drivers/gpu/drm/i915/intel_tv.c
+++ b/drivers/gpu/drm/i915/intel_tv.c
@@ -48,7 +48,7 @@ struct intel_tv {
48 struct intel_encoder base; 48 struct intel_encoder base;
49 49
50 int type; 50 int type;
51 char *tv_format; 51 const char *tv_format;
52 int margin[4]; 52 int margin[4];
53 u32 save_TV_H_CTL_1; 53 u32 save_TV_H_CTL_1;
54 u32 save_TV_H_CTL_2; 54 u32 save_TV_H_CTL_2;
@@ -350,7 +350,7 @@ static const struct video_levels component_levels = {
350 350
351 351
352struct tv_mode { 352struct tv_mode {
353 char *name; 353 const char *name;
354 int clock; 354 int clock;
355 int refresh; /* in millihertz (for precision) */ 355 int refresh; /* in millihertz (for precision) */
356 u32 oversample; 356 u32 oversample;
@@ -900,7 +900,14 @@ static const struct tv_mode tv_modes[] = {
900 900
901static struct intel_tv *enc_to_intel_tv(struct drm_encoder *encoder) 901static struct intel_tv *enc_to_intel_tv(struct drm_encoder *encoder)
902{ 902{
903 return container_of(enc_to_intel_encoder(encoder), struct intel_tv, base); 903 return container_of(encoder, struct intel_tv, base.base);
904}
905
906static struct intel_tv *intel_attached_tv(struct drm_connector *connector)
907{
908 return container_of(intel_attached_encoder(connector),
909 struct intel_tv,
910 base);
904} 911}
905 912
906static void 913static void
@@ -922,7 +929,7 @@ intel_tv_dpms(struct drm_encoder *encoder, int mode)
922} 929}
923 930
924static const struct tv_mode * 931static const struct tv_mode *
925intel_tv_mode_lookup (char *tv_format) 932intel_tv_mode_lookup(const char *tv_format)
926{ 933{
927 int i; 934 int i;
928 935
@@ -936,22 +943,23 @@ intel_tv_mode_lookup (char *tv_format)
936} 943}
937 944
938static const struct tv_mode * 945static const struct tv_mode *
939intel_tv_mode_find (struct intel_tv *intel_tv) 946intel_tv_mode_find(struct intel_tv *intel_tv)
940{ 947{
941 return intel_tv_mode_lookup(intel_tv->tv_format); 948 return intel_tv_mode_lookup(intel_tv->tv_format);
942} 949}
943 950
944static enum drm_mode_status 951static enum drm_mode_status
945intel_tv_mode_valid(struct drm_connector *connector, struct drm_display_mode *mode) 952intel_tv_mode_valid(struct drm_connector *connector,
953 struct drm_display_mode *mode)
946{ 954{
947 struct drm_encoder *encoder = intel_attached_encoder(connector); 955 struct intel_tv *intel_tv = intel_attached_tv(connector);
948 struct intel_tv *intel_tv = enc_to_intel_tv(encoder);
949 const struct tv_mode *tv_mode = intel_tv_mode_find(intel_tv); 956 const struct tv_mode *tv_mode = intel_tv_mode_find(intel_tv);
950 957
951 /* Ensure TV refresh is close to desired refresh */ 958 /* Ensure TV refresh is close to desired refresh */
952 if (tv_mode && abs(tv_mode->refresh - drm_mode_vrefresh(mode) * 1000) 959 if (tv_mode && abs(tv_mode->refresh - drm_mode_vrefresh(mode) * 1000)
953 < 1000) 960 < 1000)
954 return MODE_OK; 961 return MODE_OK;
962
955 return MODE_CLOCK_RANGE; 963 return MODE_CLOCK_RANGE;
956} 964}
957 965
@@ -998,6 +1006,7 @@ intel_tv_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode,
998 const struct video_levels *video_levels; 1006 const struct video_levels *video_levels;
999 const struct color_conversion *color_conversion; 1007 const struct color_conversion *color_conversion;
1000 bool burst_ena; 1008 bool burst_ena;
1009 int pipe = intel_crtc->pipe;
1001 1010
1002 if (!tv_mode) 1011 if (!tv_mode)
1003 return; /* can't happen (mode_prepare prevents this) */ 1012 return; /* can't happen (mode_prepare prevents this) */
@@ -1131,7 +1140,7 @@ intel_tv_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode,
1131 color_conversion->av); 1140 color_conversion->av);
1132 } 1141 }
1133 1142
1134 if (IS_I965G(dev)) 1143 if (INTEL_INFO(dev)->gen >= 4)
1135 I915_WRITE(TV_CLR_KNOBS, 0x00404000); 1144 I915_WRITE(TV_CLR_KNOBS, 0x00404000);
1136 else 1145 else
1137 I915_WRITE(TV_CLR_KNOBS, 0x00606000); 1146 I915_WRITE(TV_CLR_KNOBS, 0x00606000);
@@ -1141,14 +1150,11 @@ intel_tv_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode,
1141 ((video_levels->black << TV_BLACK_LEVEL_SHIFT) | 1150 ((video_levels->black << TV_BLACK_LEVEL_SHIFT) |
1142 (video_levels->blank << TV_BLANK_LEVEL_SHIFT))); 1151 (video_levels->blank << TV_BLANK_LEVEL_SHIFT)));
1143 { 1152 {
1144 int pipeconf_reg = (intel_crtc->pipe == 0) ? 1153 int pipeconf_reg = PIPECONF(pipe);
1145 PIPEACONF : PIPEBCONF; 1154 int dspcntr_reg = DSPCNTR(intel_crtc->plane);
1146 int dspcntr_reg = (intel_crtc->plane == 0) ?
1147 DSPACNTR : DSPBCNTR;
1148 int pipeconf = I915_READ(pipeconf_reg); 1155 int pipeconf = I915_READ(pipeconf_reg);
1149 int dspcntr = I915_READ(dspcntr_reg); 1156 int dspcntr = I915_READ(dspcntr_reg);
1150 int dspbase_reg = (intel_crtc->plane == 0) ? 1157 int dspbase_reg = DSPADDR(intel_crtc->plane);
1151 DSPAADDR : DSPBADDR;
1152 int xpos = 0x0, ypos = 0x0; 1158 int xpos = 0x0, ypos = 0x0;
1153 unsigned int xsize, ysize; 1159 unsigned int xsize, ysize;
1154 /* Pipe must be off here */ 1160 /* Pipe must be off here */
@@ -1157,12 +1163,12 @@ intel_tv_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode,
1157 I915_WRITE(dspbase_reg, I915_READ(dspbase_reg)); 1163 I915_WRITE(dspbase_reg, I915_READ(dspbase_reg));
1158 1164
1159 /* Wait for vblank for the disable to take effect */ 1165 /* Wait for vblank for the disable to take effect */
1160 if (!IS_I9XX(dev)) 1166 if (IS_GEN2(dev))
1161 intel_wait_for_vblank(dev, intel_crtc->pipe); 1167 intel_wait_for_vblank(dev, intel_crtc->pipe);
1162 1168
1163 I915_WRITE(pipeconf_reg, pipeconf & ~PIPEACONF_ENABLE); 1169 I915_WRITE(pipeconf_reg, pipeconf & ~PIPECONF_ENABLE);
1164 /* Wait for vblank for the disable to take effect. */ 1170 /* Wait for vblank for the disable to take effect. */
1165 intel_wait_for_vblank(dev, intel_crtc->pipe); 1171 intel_wait_for_pipe_off(dev, intel_crtc->pipe);
1166 1172
1167 /* Filter ctl must be set before TV_WIN_SIZE */ 1173 /* Filter ctl must be set before TV_WIN_SIZE */
1168 I915_WRITE(TV_FILTER_CTL_1, TV_AUTO_SCALE); 1174 I915_WRITE(TV_FILTER_CTL_1, TV_AUTO_SCALE);
@@ -1196,7 +1202,7 @@ intel_tv_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode,
1196 I915_WRITE(TV_V_LUMA_0 + (i<<2), tv_mode->filter_table[j++]); 1202 I915_WRITE(TV_V_LUMA_0 + (i<<2), tv_mode->filter_table[j++]);
1197 for (i = 0; i < 43; i++) 1203 for (i = 0; i < 43; i++)
1198 I915_WRITE(TV_V_CHROMA_0 + (i<<2), tv_mode->filter_table[j++]); 1204 I915_WRITE(TV_V_CHROMA_0 + (i<<2), tv_mode->filter_table[j++]);
1199 I915_WRITE(TV_DAC, 0); 1205 I915_WRITE(TV_DAC, I915_READ(TV_DAC) & TV_DAC_SAVE);
1200 I915_WRITE(TV_CTL, tv_ctl); 1206 I915_WRITE(TV_CTL, tv_ctl);
1201} 1207}
1202 1208
@@ -1226,37 +1232,34 @@ static const struct drm_display_mode reported_modes[] = {
1226 * \return false if TV is disconnected. 1232 * \return false if TV is disconnected.
1227 */ 1233 */
1228static int 1234static int
1229intel_tv_detect_type (struct intel_tv *intel_tv) 1235intel_tv_detect_type (struct intel_tv *intel_tv,
1236 struct drm_connector *connector)
1230{ 1237{
1231 struct drm_encoder *encoder = &intel_tv->base.enc; 1238 struct drm_encoder *encoder = &intel_tv->base.base;
1232 struct drm_device *dev = encoder->dev; 1239 struct drm_device *dev = encoder->dev;
1233 struct drm_i915_private *dev_priv = dev->dev_private; 1240 struct drm_i915_private *dev_priv = dev->dev_private;
1234 unsigned long irqflags; 1241 unsigned long irqflags;
1235 u32 tv_ctl, save_tv_ctl; 1242 u32 tv_ctl, save_tv_ctl;
1236 u32 tv_dac, save_tv_dac; 1243 u32 tv_dac, save_tv_dac;
1237 int type = DRM_MODE_CONNECTOR_Unknown; 1244 int type;
1238
1239 tv_dac = I915_READ(TV_DAC);
1240 1245
1241 /* Disable TV interrupts around load detect or we'll recurse */ 1246 /* Disable TV interrupts around load detect or we'll recurse */
1242 spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags); 1247 if (connector->polled & DRM_CONNECTOR_POLL_HPD) {
1243 i915_disable_pipestat(dev_priv, 0, PIPE_HOTPLUG_INTERRUPT_ENABLE | 1248 spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
1244 PIPE_HOTPLUG_TV_INTERRUPT_ENABLE); 1249 i915_disable_pipestat(dev_priv, 0,
1245 spin_unlock_irqrestore(&dev_priv->user_irq_lock, irqflags); 1250 PIPE_HOTPLUG_INTERRUPT_ENABLE |
1251 PIPE_HOTPLUG_TV_INTERRUPT_ENABLE);
1252 spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
1253 }
1246 1254
1247 /* 1255 save_tv_dac = tv_dac = I915_READ(TV_DAC);
1248 * Detect TV by polling) 1256 save_tv_ctl = tv_ctl = I915_READ(TV_CTL);
1249 */ 1257
1250 save_tv_dac = tv_dac; 1258 /* Poll for TV detection */
1251 tv_ctl = I915_READ(TV_CTL); 1259 tv_ctl &= ~(TV_ENC_ENABLE | TV_TEST_MODE_MASK);
1252 save_tv_ctl = tv_ctl;
1253 tv_ctl &= ~TV_ENC_ENABLE;
1254 tv_ctl &= ~TV_TEST_MODE_MASK;
1255 tv_ctl |= TV_TEST_MODE_MONITOR_DETECT; 1260 tv_ctl |= TV_TEST_MODE_MONITOR_DETECT;
1256 tv_dac &= ~TVDAC_SENSE_MASK; 1261
1257 tv_dac &= ~DAC_A_MASK; 1262 tv_dac &= ~(TVDAC_SENSE_MASK | DAC_A_MASK | DAC_B_MASK | DAC_C_MASK);
1258 tv_dac &= ~DAC_B_MASK;
1259 tv_dac &= ~DAC_C_MASK;
1260 tv_dac |= (TVDAC_STATE_CHG_EN | 1263 tv_dac |= (TVDAC_STATE_CHG_EN |
1261 TVDAC_A_SENSE_CTL | 1264 TVDAC_A_SENSE_CTL |
1262 TVDAC_B_SENSE_CTL | 1265 TVDAC_B_SENSE_CTL |
@@ -1265,42 +1268,48 @@ intel_tv_detect_type (struct intel_tv *intel_tv)
1265 DAC_A_0_7_V | 1268 DAC_A_0_7_V |
1266 DAC_B_0_7_V | 1269 DAC_B_0_7_V |
1267 DAC_C_0_7_V); 1270 DAC_C_0_7_V);
1271
1268 I915_WRITE(TV_CTL, tv_ctl); 1272 I915_WRITE(TV_CTL, tv_ctl);
1269 I915_WRITE(TV_DAC, tv_dac); 1273 I915_WRITE(TV_DAC, tv_dac);
1270 POSTING_READ(TV_DAC); 1274 POSTING_READ(TV_DAC);
1271 msleep(20);
1272 1275
1273 tv_dac = I915_READ(TV_DAC); 1276 intel_wait_for_vblank(intel_tv->base.base.dev,
1274 I915_WRITE(TV_DAC, save_tv_dac); 1277 to_intel_crtc(intel_tv->base.base.crtc)->pipe);
1275 I915_WRITE(TV_CTL, save_tv_ctl);
1276 POSTING_READ(TV_CTL);
1277 msleep(20);
1278 1278
1279 /* 1279 type = -1;
1280 * A B C 1280 if (wait_for((tv_dac = I915_READ(TV_DAC)) & TVDAC_STATE_CHG, 20) == 0) {
1281 * 0 1 1 Composite 1281 DRM_DEBUG_KMS("TV detected: %x, %x\n", tv_ctl, tv_dac);
1282 * 1 0 X svideo 1282 /*
1283 * 0 0 0 Component 1283 * A B C
1284 */ 1284 * 0 1 1 Composite
1285 if ((tv_dac & TVDAC_SENSE_MASK) == (TVDAC_B_SENSE | TVDAC_C_SENSE)) { 1285 * 1 0 X svideo
1286 DRM_DEBUG_KMS("Detected Composite TV connection\n"); 1286 * 0 0 0 Component
1287 type = DRM_MODE_CONNECTOR_Composite; 1287 */
1288 } else if ((tv_dac & (TVDAC_A_SENSE|TVDAC_B_SENSE)) == TVDAC_A_SENSE) { 1288 if ((tv_dac & TVDAC_SENSE_MASK) == (TVDAC_B_SENSE | TVDAC_C_SENSE)) {
1289 DRM_DEBUG_KMS("Detected S-Video TV connection\n"); 1289 DRM_DEBUG_KMS("Detected Composite TV connection\n");
1290 type = DRM_MODE_CONNECTOR_SVIDEO; 1290 type = DRM_MODE_CONNECTOR_Composite;
1291 } else if ((tv_dac & TVDAC_SENSE_MASK) == 0) { 1291 } else if ((tv_dac & (TVDAC_A_SENSE|TVDAC_B_SENSE)) == TVDAC_A_SENSE) {
1292 DRM_DEBUG_KMS("Detected Component TV connection\n"); 1292 DRM_DEBUG_KMS("Detected S-Video TV connection\n");
1293 type = DRM_MODE_CONNECTOR_Component; 1293 type = DRM_MODE_CONNECTOR_SVIDEO;
1294 } else { 1294 } else if ((tv_dac & TVDAC_SENSE_MASK) == 0) {
1295 DRM_DEBUG_KMS("No TV connection detected\n"); 1295 DRM_DEBUG_KMS("Detected Component TV connection\n");
1296 type = -1; 1296 type = DRM_MODE_CONNECTOR_Component;
1297 } else {
1298 DRM_DEBUG_KMS("Unrecognised TV connection\n");
1299 }
1297 } 1300 }
1298 1301
1302 I915_WRITE(TV_DAC, save_tv_dac & ~TVDAC_STATE_CHG_EN);
1303 I915_WRITE(TV_CTL, save_tv_ctl);
1304
1299 /* Restore interrupt config */ 1305 /* Restore interrupt config */
1300 spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags); 1306 if (connector->polled & DRM_CONNECTOR_POLL_HPD) {
1301 i915_enable_pipestat(dev_priv, 0, PIPE_HOTPLUG_INTERRUPT_ENABLE | 1307 spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
1302 PIPE_HOTPLUG_TV_INTERRUPT_ENABLE); 1308 i915_enable_pipestat(dev_priv, 0,
1303 spin_unlock_irqrestore(&dev_priv->user_irq_lock, irqflags); 1309 PIPE_HOTPLUG_INTERRUPT_ENABLE |
1310 PIPE_HOTPLUG_TV_INTERRUPT_ENABLE);
1311 spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
1312 }
1304 1313
1305 return type; 1314 return type;
1306} 1315}
@@ -1311,8 +1320,7 @@ intel_tv_detect_type (struct intel_tv *intel_tv)
1311 */ 1320 */
1312static void intel_tv_find_better_format(struct drm_connector *connector) 1321static void intel_tv_find_better_format(struct drm_connector *connector)
1313{ 1322{
1314 struct drm_encoder *encoder = intel_attached_encoder(connector); 1323 struct intel_tv *intel_tv = intel_attached_tv(connector);
1315 struct intel_tv *intel_tv = enc_to_intel_tv(encoder);
1316 const struct tv_mode *tv_mode = intel_tv_mode_find(intel_tv); 1324 const struct tv_mode *tv_mode = intel_tv_mode_find(intel_tv);
1317 int i; 1325 int i;
1318 1326
@@ -1344,25 +1352,23 @@ static enum drm_connector_status
1344intel_tv_detect(struct drm_connector *connector, bool force) 1352intel_tv_detect(struct drm_connector *connector, bool force)
1345{ 1353{
1346 struct drm_display_mode mode; 1354 struct drm_display_mode mode;
1347 struct drm_encoder *encoder = intel_attached_encoder(connector); 1355 struct intel_tv *intel_tv = intel_attached_tv(connector);
1348 struct intel_tv *intel_tv = enc_to_intel_tv(encoder);
1349 int type; 1356 int type;
1350 1357
1351 mode = reported_modes[0]; 1358 mode = reported_modes[0];
1352 drm_mode_set_crtcinfo(&mode, CRTC_INTERLACE_HALVE_V); 1359 drm_mode_set_crtcinfo(&mode, CRTC_INTERLACE_HALVE_V);
1353 1360
1354 if (encoder->crtc && encoder->crtc->enabled) { 1361 if (intel_tv->base.base.crtc && intel_tv->base.base.crtc->enabled) {
1355 type = intel_tv_detect_type(intel_tv); 1362 type = intel_tv_detect_type(intel_tv, connector);
1356 } else if (force) { 1363 } else if (force) {
1357 struct drm_crtc *crtc; 1364 struct intel_load_detect_pipe tmp;
1358 int dpms_mode; 1365
1359 1366 if (intel_get_load_detect_pipe(&intel_tv->base, connector,
1360 crtc = intel_get_load_detect_pipe(&intel_tv->base, connector, 1367 &mode, &tmp)) {
1361 &mode, &dpms_mode); 1368 type = intel_tv_detect_type(intel_tv, connector);
1362 if (crtc) { 1369 intel_release_load_detect_pipe(&intel_tv->base,
1363 type = intel_tv_detect_type(intel_tv); 1370 connector,
1364 intel_release_load_detect_pipe(&intel_tv->base, connector, 1371 &tmp);
1365 dpms_mode);
1366 } else 1372 } else
1367 return connector_status_unknown; 1373 return connector_status_unknown;
1368 } else 1374 } else
@@ -1371,15 +1377,16 @@ intel_tv_detect(struct drm_connector *connector, bool force)
1371 if (type < 0) 1377 if (type < 0)
1372 return connector_status_disconnected; 1378 return connector_status_disconnected;
1373 1379
1380 intel_tv->type = type;
1374 intel_tv_find_better_format(connector); 1381 intel_tv_find_better_format(connector);
1382
1375 return connector_status_connected; 1383 return connector_status_connected;
1376} 1384}
1377 1385
1378static struct input_res { 1386static const struct input_res {
1379 char *name; 1387 const char *name;
1380 int w, h; 1388 int w, h;
1381} input_res_table[] = 1389} input_res_table[] = {
1382{
1383 {"640x480", 640, 480}, 1390 {"640x480", 640, 480},
1384 {"800x600", 800, 600}, 1391 {"800x600", 800, 600},
1385 {"1024x768", 1024, 768}, 1392 {"1024x768", 1024, 768},
@@ -1396,8 +1403,7 @@ static void
1396intel_tv_chose_preferred_modes(struct drm_connector *connector, 1403intel_tv_chose_preferred_modes(struct drm_connector *connector,
1397 struct drm_display_mode *mode_ptr) 1404 struct drm_display_mode *mode_ptr)
1398{ 1405{
1399 struct drm_encoder *encoder = intel_attached_encoder(connector); 1406 struct intel_tv *intel_tv = intel_attached_tv(connector);
1400 struct intel_tv *intel_tv = enc_to_intel_tv(encoder);
1401 const struct tv_mode *tv_mode = intel_tv_mode_find(intel_tv); 1407 const struct tv_mode *tv_mode = intel_tv_mode_find(intel_tv);
1402 1408
1403 if (tv_mode->nbr_end < 480 && mode_ptr->vdisplay == 480) 1409 if (tv_mode->nbr_end < 480 && mode_ptr->vdisplay == 480)
@@ -1422,15 +1428,14 @@ static int
1422intel_tv_get_modes(struct drm_connector *connector) 1428intel_tv_get_modes(struct drm_connector *connector)
1423{ 1429{
1424 struct drm_display_mode *mode_ptr; 1430 struct drm_display_mode *mode_ptr;
1425 struct drm_encoder *encoder = intel_attached_encoder(connector); 1431 struct intel_tv *intel_tv = intel_attached_tv(connector);
1426 struct intel_tv *intel_tv = enc_to_intel_tv(encoder);
1427 const struct tv_mode *tv_mode = intel_tv_mode_find(intel_tv); 1432 const struct tv_mode *tv_mode = intel_tv_mode_find(intel_tv);
1428 int j, count = 0; 1433 int j, count = 0;
1429 u64 tmp; 1434 u64 tmp;
1430 1435
1431 for (j = 0; j < ARRAY_SIZE(input_res_table); 1436 for (j = 0; j < ARRAY_SIZE(input_res_table);
1432 j++) { 1437 j++) {
1433 struct input_res *input = &input_res_table[j]; 1438 const struct input_res *input = &input_res_table[j];
1434 unsigned int hactive_s = input->w; 1439 unsigned int hactive_s = input->w;
1435 unsigned int vactive_s = input->h; 1440 unsigned int vactive_s = input->h;
1436 1441
@@ -1488,9 +1493,8 @@ intel_tv_set_property(struct drm_connector *connector, struct drm_property *prop
1488 uint64_t val) 1493 uint64_t val)
1489{ 1494{
1490 struct drm_device *dev = connector->dev; 1495 struct drm_device *dev = connector->dev;
1491 struct drm_encoder *encoder = intel_attached_encoder(connector); 1496 struct intel_tv *intel_tv = intel_attached_tv(connector);
1492 struct intel_tv *intel_tv = enc_to_intel_tv(encoder); 1497 struct drm_crtc *crtc = intel_tv->base.base.crtc;
1493 struct drm_crtc *crtc = encoder->crtc;
1494 int ret = 0; 1498 int ret = 0;
1495 bool changed = false; 1499 bool changed = false;
1496 1500
@@ -1555,7 +1559,7 @@ static const struct drm_connector_funcs intel_tv_connector_funcs = {
1555static const struct drm_connector_helper_funcs intel_tv_connector_helper_funcs = { 1559static const struct drm_connector_helper_funcs intel_tv_connector_helper_funcs = {
1556 .mode_valid = intel_tv_mode_valid, 1560 .mode_valid = intel_tv_mode_valid,
1557 .get_modes = intel_tv_get_modes, 1561 .get_modes = intel_tv_get_modes,
1558 .best_encoder = intel_attached_encoder, 1562 .best_encoder = intel_best_encoder,
1559}; 1563};
1560 1564
1561static const struct drm_encoder_funcs intel_tv_enc_funcs = { 1565static const struct drm_encoder_funcs intel_tv_enc_funcs = {
@@ -1607,7 +1611,7 @@ intel_tv_init(struct drm_device *dev)
1607 struct intel_encoder *intel_encoder; 1611 struct intel_encoder *intel_encoder;
1608 struct intel_connector *intel_connector; 1612 struct intel_connector *intel_connector;
1609 u32 tv_dac_on, tv_dac_off, save_tv_dac; 1613 u32 tv_dac_on, tv_dac_off, save_tv_dac;
1610 char **tv_format_names; 1614 char *tv_format_names[ARRAY_SIZE(tv_modes)];
1611 int i, initial_mode = 0; 1615 int i, initial_mode = 0;
1612 1616
1613 if ((I915_READ(TV_CTL) & TV_FUSE_STATE_MASK) == TV_FUSE_STATE_DISABLED) 1617 if ((I915_READ(TV_CTL) & TV_FUSE_STATE_MASK) == TV_FUSE_STATE_DISABLED)
@@ -1658,18 +1662,29 @@ intel_tv_init(struct drm_device *dev)
1658 intel_encoder = &intel_tv->base; 1662 intel_encoder = &intel_tv->base;
1659 connector = &intel_connector->base; 1663 connector = &intel_connector->base;
1660 1664
1665 /* The documentation, for the older chipsets at least, recommend
1666 * using a polling method rather than hotplug detection for TVs.
1667 * This is because in order to perform the hotplug detection, the PLLs
1668 * for the TV must be kept alive increasing power drain and starving
1669 * bandwidth from other encoders. Notably for instance, it causes
1670 * pipe underruns on Crestline when this encoder is supposedly idle.
1671 *
1672 * More recent chipsets favour HDMI rather than integrated S-Video.
1673 */
1674 connector->polled = DRM_CONNECTOR_POLL_CONNECT;
1675
1661 drm_connector_init(dev, connector, &intel_tv_connector_funcs, 1676 drm_connector_init(dev, connector, &intel_tv_connector_funcs,
1662 DRM_MODE_CONNECTOR_SVIDEO); 1677 DRM_MODE_CONNECTOR_SVIDEO);
1663 1678
1664 drm_encoder_init(dev, &intel_encoder->enc, &intel_tv_enc_funcs, 1679 drm_encoder_init(dev, &intel_encoder->base, &intel_tv_enc_funcs,
1665 DRM_MODE_ENCODER_TVDAC); 1680 DRM_MODE_ENCODER_TVDAC);
1666 1681
1667 drm_mode_connector_attach_encoder(&intel_connector->base, &intel_encoder->enc); 1682 intel_connector_attach_encoder(intel_connector, intel_encoder);
1668 intel_encoder->type = INTEL_OUTPUT_TVOUT; 1683 intel_encoder->type = INTEL_OUTPUT_TVOUT;
1669 intel_encoder->crtc_mask = (1 << 0) | (1 << 1); 1684 intel_encoder->crtc_mask = (1 << 0) | (1 << 1);
1670 intel_encoder->clone_mask = (1 << INTEL_TV_CLONE_BIT); 1685 intel_encoder->clone_mask = (1 << INTEL_TV_CLONE_BIT);
1671 intel_encoder->enc.possible_crtcs = ((1 << 0) | (1 << 1)); 1686 intel_encoder->base.possible_crtcs = ((1 << 0) | (1 << 1));
1672 intel_encoder->enc.possible_clones = (1 << INTEL_OUTPUT_TVOUT); 1687 intel_encoder->base.possible_clones = (1 << INTEL_OUTPUT_TVOUT);
1673 intel_tv->type = DRM_MODE_CONNECTOR_Unknown; 1688 intel_tv->type = DRM_MODE_CONNECTOR_Unknown;
1674 1689
1675 /* BIOS margin values */ 1690 /* BIOS margin values */
@@ -1678,21 +1693,19 @@ intel_tv_init(struct drm_device *dev)
1678 intel_tv->margin[TV_MARGIN_RIGHT] = 46; 1693 intel_tv->margin[TV_MARGIN_RIGHT] = 46;
1679 intel_tv->margin[TV_MARGIN_BOTTOM] = 37; 1694 intel_tv->margin[TV_MARGIN_BOTTOM] = 37;
1680 1695
1681 intel_tv->tv_format = kstrdup(tv_modes[initial_mode].name, GFP_KERNEL); 1696 intel_tv->tv_format = tv_modes[initial_mode].name;
1682 1697
1683 drm_encoder_helper_add(&intel_encoder->enc, &intel_tv_helper_funcs); 1698 drm_encoder_helper_add(&intel_encoder->base, &intel_tv_helper_funcs);
1684 drm_connector_helper_add(connector, &intel_tv_connector_helper_funcs); 1699 drm_connector_helper_add(connector, &intel_tv_connector_helper_funcs);
1685 connector->interlace_allowed = false; 1700 connector->interlace_allowed = false;
1686 connector->doublescan_allowed = false; 1701 connector->doublescan_allowed = false;
1687 1702
1688 /* Create TV properties then attach current values */ 1703 /* Create TV properties then attach current values */
1689 tv_format_names = kmalloc(sizeof(char *) * ARRAY_SIZE(tv_modes),
1690 GFP_KERNEL);
1691 if (!tv_format_names)
1692 goto out;
1693 for (i = 0; i < ARRAY_SIZE(tv_modes); i++) 1704 for (i = 0; i < ARRAY_SIZE(tv_modes); i++)
1694 tv_format_names[i] = tv_modes[i].name; 1705 tv_format_names[i] = (char *)tv_modes[i].name;
1695 drm_mode_create_tv_properties(dev, ARRAY_SIZE(tv_modes), tv_format_names); 1706 drm_mode_create_tv_properties(dev,
1707 ARRAY_SIZE(tv_modes),
1708 tv_format_names);
1696 1709
1697 drm_connector_attach_property(connector, dev->mode_config.tv_mode_property, 1710 drm_connector_attach_property(connector, dev->mode_config.tv_mode_property,
1698 initial_mode); 1711 initial_mode);
@@ -1708,6 +1721,5 @@ intel_tv_init(struct drm_device *dev)
1708 drm_connector_attach_property(connector, 1721 drm_connector_attach_property(connector,
1709 dev->mode_config.tv_bottom_margin_property, 1722 dev->mode_config.tv_bottom_margin_property,
1710 intel_tv->margin[TV_MARGIN_BOTTOM]); 1723 intel_tv->margin[TV_MARGIN_BOTTOM]);
1711out:
1712 drm_sysfs_connector_add(connector); 1724 drm_sysfs_connector_add(connector);
1713} 1725}
diff --git a/drivers/gpu/drm/mga/mga_dma.c b/drivers/gpu/drm/mga/mga_dma.c
index 08868ac3048a..5ccb65deb83c 100644
--- a/drivers/gpu/drm/mga/mga_dma.c
+++ b/drivers/gpu/drm/mga/mga_dma.c
@@ -426,7 +426,7 @@ int mga_driver_load(struct drm_device *dev, unsigned long flags)
426 * Bootstrap the driver for AGP DMA. 426 * Bootstrap the driver for AGP DMA.
427 * 427 *
428 * \todo 428 * \todo
429 * Investigate whether there is any benifit to storing the WARP microcode in 429 * Investigate whether there is any benefit to storing the WARP microcode in
430 * AGP memory. If not, the microcode may as well always be put in PCI 430 * AGP memory. If not, the microcode may as well always be put in PCI
431 * memory. 431 * memory.
432 * 432 *
@@ -703,7 +703,7 @@ static int mga_do_pci_dma_bootstrap(struct drm_device *dev,
703static int mga_do_dma_bootstrap(struct drm_device *dev, 703static int mga_do_dma_bootstrap(struct drm_device *dev,
704 drm_mga_dma_bootstrap_t *dma_bs) 704 drm_mga_dma_bootstrap_t *dma_bs)
705{ 705{
706 const int is_agp = (dma_bs->agp_mode != 0) && drm_device_is_agp(dev); 706 const int is_agp = (dma_bs->agp_mode != 0) && drm_pci_device_is_agp(dev);
707 int err; 707 int err;
708 drm_mga_private_t *const dev_priv = 708 drm_mga_private_t *const dev_priv =
709 (drm_mga_private_t *) dev->dev_private; 709 (drm_mga_private_t *) dev->dev_private;
diff --git a/drivers/gpu/drm/mga/mga_drv.c b/drivers/gpu/drm/mga/mga_drv.c
index 26d0d8ced80d..42d31874edf2 100644
--- a/drivers/gpu/drm/mga/mga_drv.c
+++ b/drivers/gpu/drm/mga/mga_drv.c
@@ -60,8 +60,6 @@ static struct drm_driver driver = {
60 .irq_uninstall = mga_driver_irq_uninstall, 60 .irq_uninstall = mga_driver_irq_uninstall,
61 .irq_handler = mga_driver_irq_handler, 61 .irq_handler = mga_driver_irq_handler,
62 .reclaim_buffers = drm_core_reclaim_buffers, 62 .reclaim_buffers = drm_core_reclaim_buffers,
63 .get_map_ofs = drm_core_get_map_ofs,
64 .get_reg_ofs = drm_core_get_reg_ofs,
65 .ioctls = mga_ioctls, 63 .ioctls = mga_ioctls,
66 .dma_ioctl = mga_dma_buffers, 64 .dma_ioctl = mga_dma_buffers,
67 .fops = { 65 .fops = {
@@ -75,10 +73,7 @@ static struct drm_driver driver = {
75#ifdef CONFIG_COMPAT 73#ifdef CONFIG_COMPAT
76 .compat_ioctl = mga_compat_ioctl, 74 .compat_ioctl = mga_compat_ioctl,
77#endif 75#endif
78 }, 76 .llseek = noop_llseek,
79 .pci_driver = {
80 .name = DRIVER_NAME,
81 .id_table = pciidlist,
82 }, 77 },
83 78
84 .name = DRIVER_NAME, 79 .name = DRIVER_NAME,
@@ -89,15 +84,20 @@ static struct drm_driver driver = {
89 .patchlevel = DRIVER_PATCHLEVEL, 84 .patchlevel = DRIVER_PATCHLEVEL,
90}; 85};
91 86
87static struct pci_driver mga_pci_driver = {
88 .name = DRIVER_NAME,
89 .id_table = pciidlist,
90};
91
92static int __init mga_init(void) 92static int __init mga_init(void)
93{ 93{
94 driver.num_ioctls = mga_max_ioctl; 94 driver.num_ioctls = mga_max_ioctl;
95 return drm_init(&driver); 95 return drm_pci_init(&driver, &mga_pci_driver);
96} 96}
97 97
98static void __exit mga_exit(void) 98static void __exit mga_exit(void)
99{ 99{
100 drm_exit(&driver); 100 drm_pci_exit(&driver, &mga_pci_driver);
101} 101}
102 102
103module_init(mga_init); 103module_init(mga_init);
diff --git a/drivers/gpu/drm/mga/mga_drv.h b/drivers/gpu/drm/mga/mga_drv.h
index 1084fa4d261b..54558a01969a 100644
--- a/drivers/gpu/drm/mga/mga_drv.h
+++ b/drivers/gpu/drm/mga/mga_drv.h
@@ -195,29 +195,10 @@ extern long mga_compat_ioctl(struct file *filp, unsigned int cmd,
195 195
196#define mga_flush_write_combine() DRM_WRITEMEMORYBARRIER() 196#define mga_flush_write_combine() DRM_WRITEMEMORYBARRIER()
197 197
198#if defined(__linux__) && defined(__alpha__)
199#define MGA_BASE(reg) ((unsigned long)(dev_priv->mmio->handle))
200#define MGA_ADDR(reg) (MGA_BASE(reg) + reg)
201
202#define MGA_DEREF(reg) (*(volatile u32 *)MGA_ADDR(reg))
203#define MGA_DEREF8(reg) (*(volatile u8 *)MGA_ADDR(reg))
204
205#define MGA_READ(reg) (_MGA_READ((u32 *)MGA_ADDR(reg)))
206#define MGA_READ8(reg) (_MGA_READ((u8 *)MGA_ADDR(reg)))
207#define MGA_WRITE(reg, val) do { DRM_WRITEMEMORYBARRIER(); MGA_DEREF(reg) = val; } while (0)
208#define MGA_WRITE8(reg, val) do { DRM_WRITEMEMORYBARRIER(); MGA_DEREF8(reg) = val; } while (0)
209
210static inline u32 _MGA_READ(u32 *addr)
211{
212 DRM_MEMORYBARRIER();
213 return *(volatile u32 *)addr;
214}
215#else
216#define MGA_READ8(reg) DRM_READ8(dev_priv->mmio, (reg)) 198#define MGA_READ8(reg) DRM_READ8(dev_priv->mmio, (reg))
217#define MGA_READ(reg) DRM_READ32(dev_priv->mmio, (reg)) 199#define MGA_READ(reg) DRM_READ32(dev_priv->mmio, (reg))
218#define MGA_WRITE8(reg, val) DRM_WRITE8(dev_priv->mmio, (reg), (val)) 200#define MGA_WRITE8(reg, val) DRM_WRITE8(dev_priv->mmio, (reg), (val))
219#define MGA_WRITE(reg, val) DRM_WRITE32(dev_priv->mmio, (reg), (val)) 201#define MGA_WRITE(reg, val) DRM_WRITE32(dev_priv->mmio, (reg), (val))
220#endif
221 202
222#define DWGREG0 0x1c00 203#define DWGREG0 0x1c00
223#define DWGREG0_END 0x1dff 204#define DWGREG0_END 0x1dff
diff --git a/drivers/gpu/drm/nouveau/Kconfig b/drivers/gpu/drm/nouveau/Kconfig
index d2d28048efb2..ca1639918f57 100644
--- a/drivers/gpu/drm/nouveau/Kconfig
+++ b/drivers/gpu/drm/nouveau/Kconfig
@@ -8,8 +8,11 @@ config DRM_NOUVEAU
8 select FB_CFB_COPYAREA 8 select FB_CFB_COPYAREA
9 select FB_CFB_IMAGEBLIT 9 select FB_CFB_IMAGEBLIT
10 select FB 10 select FB
11 select FRAMEBUFFER_CONSOLE if !EMBEDDED 11 select FRAMEBUFFER_CONSOLE if !EXPERT
12 select FB_BACKLIGHT if DRM_NOUVEAU_BACKLIGHT 12 select FB_BACKLIGHT if DRM_NOUVEAU_BACKLIGHT
13 select ACPI_VIDEO if ACPI && X86 && BACKLIGHT_CLASS_DEVICE && VIDEO_OUTPUT_CONTROL && INPUT
14 select ACPI_WMI if ACPI
15 select MXM_WMI if ACPI
13 help 16 help
14 Choose this option for open-source nVidia support. 17 Choose this option for open-source nVidia support.
15 18
diff --git a/drivers/gpu/drm/nouveau/Makefile b/drivers/gpu/drm/nouveau/Makefile
index e9b06e4ef2a2..0583677e4581 100644
--- a/drivers/gpu/drm/nouveau/Makefile
+++ b/drivers/gpu/drm/nouveau/Makefile
@@ -5,25 +5,34 @@
5ccflags-y := -Iinclude/drm 5ccflags-y := -Iinclude/drm
6nouveau-y := nouveau_drv.o nouveau_state.o nouveau_channel.o nouveau_mem.o \ 6nouveau-y := nouveau_drv.o nouveau_state.o nouveau_channel.o nouveau_mem.o \
7 nouveau_object.o nouveau_irq.o nouveau_notifier.o \ 7 nouveau_object.o nouveau_irq.o nouveau_notifier.o \
8 nouveau_sgdma.o nouveau_dma.o \ 8 nouveau_sgdma.o nouveau_dma.o nouveau_util.o \
9 nouveau_bo.o nouveau_fence.o nouveau_gem.o nouveau_ttm.o \ 9 nouveau_bo.o nouveau_fence.o nouveau_gem.o nouveau_ttm.o \
10 nouveau_hw.o nouveau_calc.o nouveau_bios.o nouveau_i2c.o \ 10 nouveau_hw.o nouveau_calc.o nouveau_bios.o nouveau_i2c.o \
11 nouveau_display.o nouveau_connector.o nouveau_fbcon.o \ 11 nouveau_display.o nouveau_connector.o nouveau_fbcon.o \
12 nouveau_dp.o \ 12 nouveau_dp.o nouveau_ramht.o \
13 nouveau_pm.o nouveau_volt.o nouveau_perf.o nouveau_temp.o \
14 nouveau_mm.o nouveau_vm.o \
13 nv04_timer.o \ 15 nv04_timer.o \
14 nv04_mc.o nv40_mc.o nv50_mc.o \ 16 nv04_mc.o nv40_mc.o nv50_mc.o \
15 nv04_fb.o nv10_fb.o nv30_fb.o nv40_fb.o nv50_fb.o nvc0_fb.o \ 17 nv04_fb.o nv10_fb.o nv30_fb.o nv40_fb.o nv50_fb.o nvc0_fb.o \
16 nv04_fifo.o nv10_fifo.o nv40_fifo.o nv50_fifo.o nvc0_fifo.o \ 18 nv04_fifo.o nv10_fifo.o nv40_fifo.o nv50_fifo.o nvc0_fifo.o \
17 nv04_graph.o nv10_graph.o nv20_graph.o \ 19 nv04_graph.o nv10_graph.o nv20_graph.o \
18 nv40_graph.o nv50_graph.o nvc0_graph.o \ 20 nv40_graph.o nv50_graph.o nvc0_graph.o \
19 nv40_grctx.o nv50_grctx.o \ 21 nv40_grctx.o nv50_grctx.o nvc0_grctx.o \
22 nv84_crypt.o \
23 nva3_copy.o nvc0_copy.o \
24 nv40_mpeg.o nv50_mpeg.o \
20 nv04_instmem.o nv50_instmem.o nvc0_instmem.o \ 25 nv04_instmem.o nv50_instmem.o nvc0_instmem.o \
21 nv50_crtc.o nv50_dac.o nv50_sor.o \ 26 nv50_evo.o nv50_crtc.o nv50_dac.o nv50_sor.o \
22 nv50_cursor.o nv50_display.o nv50_fbcon.o \ 27 nv50_cursor.o nv50_display.o \
23 nv04_dac.o nv04_dfp.o nv04_tv.o nv17_tv.o nv17_tv_modes.o \ 28 nv04_dac.o nv04_dfp.o nv04_tv.o nv17_tv.o nv17_tv_modes.o \
24 nv04_crtc.o nv04_display.o nv04_cursor.o nv04_fbcon.o \ 29 nv04_crtc.o nv04_display.o nv04_cursor.o \
30 nv04_fbcon.o nv50_fbcon.o nvc0_fbcon.o \
25 nv10_gpio.o nv50_gpio.o \ 31 nv10_gpio.o nv50_gpio.o \
26 nv50_calc.o 32 nv50_calc.o \
33 nv04_pm.o nv50_pm.o nva3_pm.o \
34 nv50_vram.o nvc0_vram.o \
35 nv50_vm.o nvc0_vm.o
27 36
28nouveau-$(CONFIG_DRM_NOUVEAU_DEBUG) += nouveau_debugfs.o 37nouveau-$(CONFIG_DRM_NOUVEAU_DEBUG) += nouveau_debugfs.o
29nouveau-$(CONFIG_COMPAT) += nouveau_ioc32.o 38nouveau-$(CONFIG_COMPAT) += nouveau_ioc32.o
diff --git a/drivers/gpu/drm/nouveau/nouveau_acpi.c b/drivers/gpu/drm/nouveau/nouveau_acpi.c
index c17a055ee3e5..525744d593c1 100644
--- a/drivers/gpu/drm/nouveau/nouveau_acpi.c
+++ b/drivers/gpu/drm/nouveau/nouveau_acpi.c
@@ -4,6 +4,8 @@
4#include <acpi/acpi_drivers.h> 4#include <acpi/acpi_drivers.h>
5#include <acpi/acpi_bus.h> 5#include <acpi/acpi_bus.h>
6#include <acpi/video.h> 6#include <acpi/video.h>
7#include <acpi/acpi.h>
8#include <linux/mxm-wmi.h>
7 9
8#include "drmP.h" 10#include "drmP.h"
9#include "drm.h" 11#include "drm.h"
@@ -35,15 +37,71 @@
35 37
36static struct nouveau_dsm_priv { 38static struct nouveau_dsm_priv {
37 bool dsm_detected; 39 bool dsm_detected;
40 bool optimus_detected;
38 acpi_handle dhandle; 41 acpi_handle dhandle;
39 acpi_handle rom_handle; 42 acpi_handle rom_handle;
40} nouveau_dsm_priv; 43} nouveau_dsm_priv;
41 44
45#define NOUVEAU_DSM_HAS_MUX 0x1
46#define NOUVEAU_DSM_HAS_OPT 0x2
47
42static const char nouveau_dsm_muid[] = { 48static const char nouveau_dsm_muid[] = {
43 0xA0, 0xA0, 0x95, 0x9D, 0x60, 0x00, 0x48, 0x4D, 49 0xA0, 0xA0, 0x95, 0x9D, 0x60, 0x00, 0x48, 0x4D,
44 0xB3, 0x4D, 0x7E, 0x5F, 0xEA, 0x12, 0x9F, 0xD4, 50 0xB3, 0x4D, 0x7E, 0x5F, 0xEA, 0x12, 0x9F, 0xD4,
45}; 51};
46 52
53static const char nouveau_op_dsm_muid[] = {
54 0xF8, 0xD8, 0x86, 0xA4, 0xDA, 0x0B, 0x1B, 0x47,
55 0xA7, 0x2B, 0x60, 0x42, 0xA6, 0xB5, 0xBE, 0xE0,
56};
57
58static int nouveau_optimus_dsm(acpi_handle handle, int func, int arg, uint32_t *result)
59{
60 struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL };
61 struct acpi_object_list input;
62 union acpi_object params[4];
63 union acpi_object *obj;
64 int err;
65
66 input.count = 4;
67 input.pointer = params;
68 params[0].type = ACPI_TYPE_BUFFER;
69 params[0].buffer.length = sizeof(nouveau_op_dsm_muid);
70 params[0].buffer.pointer = (char *)nouveau_op_dsm_muid;
71 params[1].type = ACPI_TYPE_INTEGER;
72 params[1].integer.value = 0x00000100;
73 params[2].type = ACPI_TYPE_INTEGER;
74 params[2].integer.value = func;
75 params[3].type = ACPI_TYPE_BUFFER;
76 params[3].buffer.length = 0;
77
78 err = acpi_evaluate_object(handle, "_DSM", &input, &output);
79 if (err) {
80 printk(KERN_INFO "failed to evaluate _DSM: %d\n", err);
81 return err;
82 }
83
84 obj = (union acpi_object *)output.pointer;
85
86 if (obj->type == ACPI_TYPE_INTEGER)
87 if (obj->integer.value == 0x80000002) {
88 return -ENODEV;
89 }
90
91 if (obj->type == ACPI_TYPE_BUFFER) {
92 if (obj->buffer.length == 4 && result) {
93 *result = 0;
94 *result |= obj->buffer.pointer[0];
95 *result |= (obj->buffer.pointer[1] << 8);
96 *result |= (obj->buffer.pointer[2] << 16);
97 *result |= (obj->buffer.pointer[3] << 24);
98 }
99 }
100
101 kfree(output.pointer);
102 return 0;
103}
104
47static int nouveau_dsm(acpi_handle handle, int func, int arg, uint32_t *result) 105static int nouveau_dsm(acpi_handle handle, int func, int arg, uint32_t *result)
48{ 106{
49 struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL }; 107 struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL };
@@ -92,6 +150,8 @@ static int nouveau_dsm(acpi_handle handle, int func, int arg, uint32_t *result)
92 150
93static int nouveau_dsm_switch_mux(acpi_handle handle, int mux_id) 151static int nouveau_dsm_switch_mux(acpi_handle handle, int mux_id)
94{ 152{
153 mxm_wmi_call_mxmx(mux_id == NOUVEAU_DSM_LED_STAMINA ? MXM_MXDS_ADAPTER_IGD : MXM_MXDS_ADAPTER_0);
154 mxm_wmi_call_mxds(mux_id == NOUVEAU_DSM_LED_STAMINA ? MXM_MXDS_ADAPTER_IGD : MXM_MXDS_ADAPTER_0);
95 return nouveau_dsm(handle, NOUVEAU_DSM_LED, mux_id, NULL); 155 return nouveau_dsm(handle, NOUVEAU_DSM_LED, mux_id, NULL);
96} 156}
97 157
@@ -130,10 +190,15 @@ static int nouveau_dsm_init(void)
130 190
131static int nouveau_dsm_get_client_id(struct pci_dev *pdev) 191static int nouveau_dsm_get_client_id(struct pci_dev *pdev)
132{ 192{
133 if (nouveau_dsm_priv.dhandle == DEVICE_ACPI_HANDLE(&pdev->dev)) 193 /* easy option one - intel vendor ID means Integrated */
194 if (pdev->vendor == PCI_VENDOR_ID_INTEL)
134 return VGA_SWITCHEROO_IGD; 195 return VGA_SWITCHEROO_IGD;
135 else 196
136 return VGA_SWITCHEROO_DIS; 197 /* is this device on Bus 0? - this may need improving */
198 if (pdev->bus->number == 0)
199 return VGA_SWITCHEROO_IGD;
200
201 return VGA_SWITCHEROO_DIS;
137} 202}
138 203
139static struct vga_switcheroo_handler nouveau_dsm_handler = { 204static struct vga_switcheroo_handler nouveau_dsm_handler = {
@@ -143,11 +208,11 @@ static struct vga_switcheroo_handler nouveau_dsm_handler = {
143 .get_client_id = nouveau_dsm_get_client_id, 208 .get_client_id = nouveau_dsm_get_client_id,
144}; 209};
145 210
146static bool nouveau_dsm_pci_probe(struct pci_dev *pdev) 211static int nouveau_dsm_pci_probe(struct pci_dev *pdev)
147{ 212{
148 acpi_handle dhandle, nvidia_handle; 213 acpi_handle dhandle, nvidia_handle;
149 acpi_status status; 214 acpi_status status;
150 int ret; 215 int ret, retval = 0;
151 uint32_t result; 216 uint32_t result;
152 217
153 dhandle = DEVICE_ACPI_HANDLE(&pdev->dev); 218 dhandle = DEVICE_ACPI_HANDLE(&pdev->dev);
@@ -161,11 +226,17 @@ static bool nouveau_dsm_pci_probe(struct pci_dev *pdev)
161 226
162 ret = nouveau_dsm(dhandle, NOUVEAU_DSM_SUPPORTED, 227 ret = nouveau_dsm(dhandle, NOUVEAU_DSM_SUPPORTED,
163 NOUVEAU_DSM_SUPPORTED_FUNCTIONS, &result); 228 NOUVEAU_DSM_SUPPORTED_FUNCTIONS, &result);
164 if (ret < 0) 229 if (ret == 0)
165 return false; 230 retval |= NOUVEAU_DSM_HAS_MUX;
166 231
167 nouveau_dsm_priv.dhandle = dhandle; 232 ret = nouveau_optimus_dsm(dhandle, 0, 0, &result);
168 return true; 233 if (ret == 0)
234 retval |= NOUVEAU_DSM_HAS_OPT;
235
236 if (retval)
237 nouveau_dsm_priv.dhandle = dhandle;
238
239 return retval;
169} 240}
170 241
171static bool nouveau_dsm_detect(void) 242static bool nouveau_dsm_detect(void)
@@ -174,22 +245,41 @@ static bool nouveau_dsm_detect(void)
174 struct acpi_buffer buffer = {sizeof(acpi_method_name), acpi_method_name}; 245 struct acpi_buffer buffer = {sizeof(acpi_method_name), acpi_method_name};
175 struct pci_dev *pdev = NULL; 246 struct pci_dev *pdev = NULL;
176 int has_dsm = 0; 247 int has_dsm = 0;
248 int has_optimus;
177 int vga_count = 0; 249 int vga_count = 0;
250 bool guid_valid;
251 int retval;
252 bool ret = false;
253
254 /* lookup the MXM GUID */
255 guid_valid = mxm_wmi_supported();
178 256
257 if (guid_valid)
258 printk("MXM: GUID detected in BIOS\n");
259
260 /* now do DSM detection */
179 while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_VGA << 8, pdev)) != NULL) { 261 while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_VGA << 8, pdev)) != NULL) {
180 vga_count++; 262 vga_count++;
181 263
182 has_dsm |= (nouveau_dsm_pci_probe(pdev) == true); 264 retval = nouveau_dsm_pci_probe(pdev);
265 if (retval & NOUVEAU_DSM_HAS_MUX)
266 has_dsm |= 1;
267 if (retval & NOUVEAU_DSM_HAS_OPT)
268 has_optimus = 1;
183 } 269 }
184 270
185 if (vga_count == 2 && has_dsm) { 271 if (vga_count == 2 && has_dsm && guid_valid) {
186 acpi_get_name(nouveau_dsm_priv.dhandle, ACPI_FULL_PATHNAME, &buffer); 272 acpi_get_name(nouveau_dsm_priv.dhandle, ACPI_FULL_PATHNAME, &buffer);
187 printk(KERN_INFO "VGA switcheroo: detected DSM switching method %s handle\n", 273 printk(KERN_INFO "VGA switcheroo: detected DSM switching method %s handle\n",
188 acpi_method_name); 274 acpi_method_name);
189 nouveau_dsm_priv.dsm_detected = true; 275 nouveau_dsm_priv.dsm_detected = true;
190 return true; 276 ret = true;
191 } 277 }
192 return false; 278
279 if (has_optimus == 1)
280 nouveau_dsm_priv.optimus_detected = true;
281
282 return ret;
193} 283}
194 284
195void nouveau_register_dsm_handler(void) 285void nouveau_register_dsm_handler(void)
@@ -242,7 +332,7 @@ bool nouveau_acpi_rom_supported(struct pci_dev *pdev)
242 acpi_status status; 332 acpi_status status;
243 acpi_handle dhandle, rom_handle; 333 acpi_handle dhandle, rom_handle;
244 334
245 if (!nouveau_dsm_priv.dsm_detected) 335 if (!nouveau_dsm_priv.dsm_detected && !nouveau_dsm_priv.optimus_detected)
246 return false; 336 return false;
247 337
248 dhandle = DEVICE_ACPI_HANDLE(&pdev->dev); 338 dhandle = DEVICE_ACPI_HANDLE(&pdev->dev);
@@ -292,6 +382,6 @@ nouveau_acpi_edid(struct drm_device *dev, struct drm_connector *connector)
292 if (ret < 0) 382 if (ret < 0)
293 return ret; 383 return ret;
294 384
295 nv_connector->edid = edid; 385 nv_connector->edid = kmemdup(edid, EDID_LENGTH, GFP_KERNEL);
296 return 0; 386 return 0;
297} 387}
diff --git a/drivers/gpu/drm/nouveau/nouveau_backlight.c b/drivers/gpu/drm/nouveau/nouveau_backlight.c
index 406228f4a2a0..00a55dfdba82 100644
--- a/drivers/gpu/drm/nouveau/nouveau_backlight.c
+++ b/drivers/gpu/drm/nouveau/nouveau_backlight.c
@@ -31,6 +31,7 @@
31 */ 31 */
32 32
33#include <linux/backlight.h> 33#include <linux/backlight.h>
34#include <linux/acpi.h>
34 35
35#include "drmP.h" 36#include "drmP.h"
36#include "nouveau_drv.h" 37#include "nouveau_drv.h"
@@ -58,7 +59,7 @@ static int nv40_set_intensity(struct backlight_device *bd)
58 return 0; 59 return 0;
59} 60}
60 61
61static struct backlight_ops nv40_bl_ops = { 62static const struct backlight_ops nv40_bl_ops = {
62 .options = BL_CORE_SUSPENDRESUME, 63 .options = BL_CORE_SUSPENDRESUME,
63 .get_brightness = nv40_get_intensity, 64 .get_brightness = nv40_get_intensity,
64 .update_status = nv40_set_intensity, 65 .update_status = nv40_set_intensity,
@@ -81,24 +82,26 @@ static int nv50_set_intensity(struct backlight_device *bd)
81 return 0; 82 return 0;
82} 83}
83 84
84static struct backlight_ops nv50_bl_ops = { 85static const struct backlight_ops nv50_bl_ops = {
85 .options = BL_CORE_SUSPENDRESUME, 86 .options = BL_CORE_SUSPENDRESUME,
86 .get_brightness = nv50_get_intensity, 87 .get_brightness = nv50_get_intensity,
87 .update_status = nv50_set_intensity, 88 .update_status = nv50_set_intensity,
88}; 89};
89 90
90static int nouveau_nv40_backlight_init(struct drm_device *dev) 91static int nouveau_nv40_backlight_init(struct drm_connector *connector)
91{ 92{
92 struct backlight_properties props; 93 struct drm_device *dev = connector->dev;
93 struct drm_nouveau_private *dev_priv = dev->dev_private; 94 struct drm_nouveau_private *dev_priv = dev->dev_private;
95 struct backlight_properties props;
94 struct backlight_device *bd; 96 struct backlight_device *bd;
95 97
96 if (!(nv_rd32(dev, NV40_PMC_BACKLIGHT) & NV40_PMC_BACKLIGHT_MASK)) 98 if (!(nv_rd32(dev, NV40_PMC_BACKLIGHT) & NV40_PMC_BACKLIGHT_MASK))
97 return 0; 99 return 0;
98 100
99 memset(&props, 0, sizeof(struct backlight_properties)); 101 memset(&props, 0, sizeof(struct backlight_properties));
102 props.type = BACKLIGHT_RAW;
100 props.max_brightness = 31; 103 props.max_brightness = 31;
101 bd = backlight_device_register("nv_backlight", &dev->pdev->dev, dev, 104 bd = backlight_device_register("nv_backlight", &connector->kdev, dev,
102 &nv40_bl_ops, &props); 105 &nv40_bl_ops, &props);
103 if (IS_ERR(bd)) 106 if (IS_ERR(bd))
104 return PTR_ERR(bd); 107 return PTR_ERR(bd);
@@ -110,18 +113,20 @@ static int nouveau_nv40_backlight_init(struct drm_device *dev)
110 return 0; 113 return 0;
111} 114}
112 115
113static int nouveau_nv50_backlight_init(struct drm_device *dev) 116static int nouveau_nv50_backlight_init(struct drm_connector *connector)
114{ 117{
115 struct backlight_properties props; 118 struct drm_device *dev = connector->dev;
116 struct drm_nouveau_private *dev_priv = dev->dev_private; 119 struct drm_nouveau_private *dev_priv = dev->dev_private;
120 struct backlight_properties props;
117 struct backlight_device *bd; 121 struct backlight_device *bd;
118 122
119 if (!nv_rd32(dev, NV50_PDISPLAY_SOR_BACKLIGHT)) 123 if (!nv_rd32(dev, NV50_PDISPLAY_SOR_BACKLIGHT))
120 return 0; 124 return 0;
121 125
122 memset(&props, 0, sizeof(struct backlight_properties)); 126 memset(&props, 0, sizeof(struct backlight_properties));
127 props.type = BACKLIGHT_RAW;
123 props.max_brightness = 1025; 128 props.max_brightness = 1025;
124 bd = backlight_device_register("nv_backlight", &dev->pdev->dev, dev, 129 bd = backlight_device_register("nv_backlight", &connector->kdev, dev,
125 &nv50_bl_ops, &props); 130 &nv50_bl_ops, &props);
126 if (IS_ERR(bd)) 131 if (IS_ERR(bd))
127 return PTR_ERR(bd); 132 return PTR_ERR(bd);
@@ -132,15 +137,24 @@ static int nouveau_nv50_backlight_init(struct drm_device *dev)
132 return 0; 137 return 0;
133} 138}
134 139
135int nouveau_backlight_init(struct drm_device *dev) 140int nouveau_backlight_init(struct drm_connector *connector)
136{ 141{
142 struct drm_device *dev = connector->dev;
137 struct drm_nouveau_private *dev_priv = dev->dev_private; 143 struct drm_nouveau_private *dev_priv = dev->dev_private;
138 144
145#ifdef CONFIG_ACPI
146 if (acpi_video_backlight_support()) {
147 NV_INFO(dev, "ACPI backlight interface available, "
148 "not registering our own\n");
149 return 0;
150 }
151#endif
152
139 switch (dev_priv->card_type) { 153 switch (dev_priv->card_type) {
140 case NV_40: 154 case NV_40:
141 return nouveau_nv40_backlight_init(dev); 155 return nouveau_nv40_backlight_init(connector);
142 case NV_50: 156 case NV_50:
143 return nouveau_nv50_backlight_init(dev); 157 return nouveau_nv50_backlight_init(connector);
144 default: 158 default:
145 break; 159 break;
146 } 160 }
@@ -148,8 +162,9 @@ int nouveau_backlight_init(struct drm_device *dev)
148 return 0; 162 return 0;
149} 163}
150 164
151void nouveau_backlight_exit(struct drm_device *dev) 165void nouveau_backlight_exit(struct drm_connector *connector)
152{ 166{
167 struct drm_device *dev = connector->dev;
153 struct drm_nouveau_private *dev_priv = dev->dev_private; 168 struct drm_nouveau_private *dev_priv = dev->dev_private;
154 169
155 if (dev_priv->backlight) { 170 if (dev_priv->backlight) {
diff --git a/drivers/gpu/drm/nouveau/nouveau_bios.c b/drivers/gpu/drm/nouveau/nouveau_bios.c
index 974b0f8ae048..729d5fd7c88d 100644
--- a/drivers/gpu/drm/nouveau/nouveau_bios.c
+++ b/drivers/gpu/drm/nouveau/nouveau_bios.c
@@ -43,9 +43,6 @@
43#define BIOSLOG(sip, fmt, arg...) NV_DEBUG(sip->dev, fmt, ##arg) 43#define BIOSLOG(sip, fmt, arg...) NV_DEBUG(sip->dev, fmt, ##arg)
44#define LOG_OLD_VALUE(x) 44#define LOG_OLD_VALUE(x)
45 45
46#define ROM16(x) le16_to_cpu(*(uint16_t *)&(x))
47#define ROM32(x) le32_to_cpu(*(uint32_t *)&(x))
48
49struct init_exec { 46struct init_exec {
50 bool execute; 47 bool execute;
51 bool repeat; 48 bool repeat;
@@ -272,13 +269,7 @@ struct init_tbl_entry {
272 int (*handler)(struct nvbios *, uint16_t, struct init_exec *); 269 int (*handler)(struct nvbios *, uint16_t, struct init_exec *);
273}; 270};
274 271
275struct bit_entry { 272static int parse_init_table(struct nvbios *, uint16_t, struct init_exec *);
276 uint8_t id[2];
277 uint16_t length;
278 uint16_t offset;
279};
280
281static int parse_init_table(struct nvbios *, unsigned int, struct init_exec *);
282 273
283#define MACRO_INDEX_SIZE 2 274#define MACRO_INDEX_SIZE 2
284#define MACRO_SIZE 8 275#define MACRO_SIZE 8
@@ -291,7 +282,7 @@ static void still_alive(void)
291{ 282{
292#if 0 283#if 0
293 sync(); 284 sync();
294 msleep(2); 285 mdelay(2);
295#endif 286#endif
296} 287}
297 288
@@ -1231,7 +1222,7 @@ init_dp_condition(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
1231 return 3; 1222 return 3;
1232 } 1223 }
1233 1224
1234 if (cond & 1) 1225 if (!(cond & 1))
1235 iexec->execute = false; 1226 iexec->execute = false;
1236 } 1227 }
1237 break; 1228 break;
@@ -1913,7 +1904,7 @@ init_condition_time(struct nvbios *bios, uint16_t offset,
1913 BIOSLOG(bios, "0x%04X: " 1904 BIOSLOG(bios, "0x%04X: "
1914 "Condition not met, sleeping for 20ms\n", 1905 "Condition not met, sleeping for 20ms\n",
1915 offset); 1906 offset);
1916 msleep(20); 1907 mdelay(20);
1917 } 1908 }
1918 } 1909 }
1919 1910
@@ -1936,7 +1927,7 @@ init_ltime(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
1936 * offset (8 bit): opcode 1927 * offset (8 bit): opcode
1937 * offset + 1 (16 bit): time 1928 * offset + 1 (16 bit): time
1938 * 1929 *
1939 * Sleep for "time" miliseconds. 1930 * Sleep for "time" milliseconds.
1940 */ 1931 */
1941 1932
1942 unsigned time = ROM16(bios->data[offset + 1]); 1933 unsigned time = ROM16(bios->data[offset + 1]);
@@ -1944,10 +1935,10 @@ init_ltime(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
1944 if (!iexec->execute) 1935 if (!iexec->execute)
1945 return 3; 1936 return 3;
1946 1937
1947 BIOSLOG(bios, "0x%04X: Sleeping for 0x%04X miliseconds\n", 1938 BIOSLOG(bios, "0x%04X: Sleeping for 0x%04X milliseconds\n",
1948 offset, time); 1939 offset, time);
1949 1940
1950 msleep(time); 1941 mdelay(time);
1951 1942
1952 return 3; 1943 return 3;
1953} 1944}
@@ -2020,6 +2011,27 @@ init_sub_direct(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
2020} 2011}
2021 2012
2022static int 2013static int
2014init_jump(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
2015{
2016 /*
2017 * INIT_JUMP opcode: 0x5C ('\')
2018 *
2019 * offset (8 bit): opcode
2020 * offset + 1 (16 bit): offset (in bios)
2021 *
2022 * Continue execution of init table from 'offset'
2023 */
2024
2025 uint16_t jmp_offset = ROM16(bios->data[offset + 1]);
2026
2027 if (!iexec->execute)
2028 return 3;
2029
2030 BIOSLOG(bios, "0x%04X: Jump to 0x%04X\n", offset, jmp_offset);
2031 return jmp_offset - offset;
2032}
2033
2034static int
2023init_i2c_if(struct nvbios *bios, uint16_t offset, struct init_exec *iexec) 2035init_i2c_if(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
2024{ 2036{
2025 /* 2037 /*
@@ -2167,11 +2179,11 @@ peek_fb(struct drm_device *dev, struct io_mapping *fb,
2167 2179
2168 if (off < pci_resource_len(dev->pdev, 1)) { 2180 if (off < pci_resource_len(dev->pdev, 1)) {
2169 uint8_t __iomem *p = 2181 uint8_t __iomem *p =
2170 io_mapping_map_atomic_wc(fb, off & PAGE_MASK, KM_USER0); 2182 io_mapping_map_atomic_wc(fb, off & PAGE_MASK);
2171 2183
2172 val = ioread32(p + (off & ~PAGE_MASK)); 2184 val = ioread32(p + (off & ~PAGE_MASK));
2173 2185
2174 io_mapping_unmap_atomic(p, KM_USER0); 2186 io_mapping_unmap_atomic(p);
2175 } 2187 }
2176 2188
2177 return val; 2189 return val;
@@ -2183,12 +2195,12 @@ poke_fb(struct drm_device *dev, struct io_mapping *fb,
2183{ 2195{
2184 if (off < pci_resource_len(dev->pdev, 1)) { 2196 if (off < pci_resource_len(dev->pdev, 1)) {
2185 uint8_t __iomem *p = 2197 uint8_t __iomem *p =
2186 io_mapping_map_atomic_wc(fb, off & PAGE_MASK, KM_USER0); 2198 io_mapping_map_atomic_wc(fb, off & PAGE_MASK);
2187 2199
2188 iowrite32(val, p + (off & ~PAGE_MASK)); 2200 iowrite32(val, p + (off & ~PAGE_MASK));
2189 wmb(); 2201 wmb();
2190 2202
2191 io_mapping_unmap_atomic(p, KM_USER0); 2203 io_mapping_unmap_atomic(p);
2192 } 2204 }
2193} 2205}
2194 2206
@@ -2971,7 +2983,7 @@ init_time(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
2971 if (time < 1000) 2983 if (time < 1000)
2972 udelay(time); 2984 udelay(time);
2973 else 2985 else
2974 msleep((time + 900) / 1000); 2986 mdelay((time + 900) / 1000);
2975 2987
2976 return 3; 2988 return 3;
2977} 2989}
@@ -3668,6 +3680,7 @@ static struct init_tbl_entry itbl_entry[] = {
3668 { "INIT_ZM_REG_SEQUENCE" , 0x58, init_zm_reg_sequence }, 3680 { "INIT_ZM_REG_SEQUENCE" , 0x58, init_zm_reg_sequence },
3669 /* INIT_INDIRECT_REG (0x5A, 7, 0, 0) removed due to no example of use */ 3681 /* INIT_INDIRECT_REG (0x5A, 7, 0, 0) removed due to no example of use */
3670 { "INIT_SUB_DIRECT" , 0x5B, init_sub_direct }, 3682 { "INIT_SUB_DIRECT" , 0x5B, init_sub_direct },
3683 { "INIT_JUMP" , 0x5C, init_jump },
3671 { "INIT_I2C_IF" , 0x5E, init_i2c_if }, 3684 { "INIT_I2C_IF" , 0x5E, init_i2c_if },
3672 { "INIT_COPY_NV_REG" , 0x5F, init_copy_nv_reg }, 3685 { "INIT_COPY_NV_REG" , 0x5F, init_copy_nv_reg },
3673 { "INIT_ZM_INDEX_IO" , 0x62, init_zm_index_io }, 3686 { "INIT_ZM_INDEX_IO" , 0x62, init_zm_index_io },
@@ -3709,8 +3722,7 @@ static struct init_tbl_entry itbl_entry[] = {
3709#define MAX_TABLE_OPS 1000 3722#define MAX_TABLE_OPS 1000
3710 3723
3711static int 3724static int
3712parse_init_table(struct nvbios *bios, unsigned int offset, 3725parse_init_table(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
3713 struct init_exec *iexec)
3714{ 3726{
3715 /* 3727 /*
3716 * Parses all commands in an init table. 3728 * Parses all commands in an init table.
@@ -3865,7 +3877,7 @@ static int call_lvds_manufacturer_script(struct drm_device *dev, struct dcb_entr
3865 3877
3866 if (script == LVDS_PANEL_OFF) { 3878 if (script == LVDS_PANEL_OFF) {
3867 /* off-on delay in ms */ 3879 /* off-on delay in ms */
3868 msleep(ROM16(bios->data[bios->fp.xlated_entry + 7])); 3880 mdelay(ROM16(bios->data[bios->fp.xlated_entry + 7]));
3869 } 3881 }
3870#ifdef __powerpc__ 3882#ifdef __powerpc__
3871 /* Powerbook specific quirks */ 3883 /* Powerbook specific quirks */
@@ -4675,6 +4687,92 @@ int run_tmds_table(struct drm_device *dev, struct dcb_entry *dcbent, int head, i
4675 return 0; 4687 return 0;
4676} 4688}
4677 4689
4690struct pll_mapping {
4691 u8 type;
4692 u32 reg;
4693};
4694
4695static struct pll_mapping nv04_pll_mapping[] = {
4696 { PLL_CORE , NV_PRAMDAC_NVPLL_COEFF },
4697 { PLL_MEMORY, NV_PRAMDAC_MPLL_COEFF },
4698 { PLL_VPLL0 , NV_PRAMDAC_VPLL_COEFF },
4699 { PLL_VPLL1 , NV_RAMDAC_VPLL2 },
4700 {}
4701};
4702
4703static struct pll_mapping nv40_pll_mapping[] = {
4704 { PLL_CORE , 0x004000 },
4705 { PLL_MEMORY, 0x004020 },
4706 { PLL_VPLL0 , NV_PRAMDAC_VPLL_COEFF },
4707 { PLL_VPLL1 , NV_RAMDAC_VPLL2 },
4708 {}
4709};
4710
4711static struct pll_mapping nv50_pll_mapping[] = {
4712 { PLL_CORE , 0x004028 },
4713 { PLL_SHADER, 0x004020 },
4714 { PLL_UNK03 , 0x004000 },
4715 { PLL_MEMORY, 0x004008 },
4716 { PLL_UNK40 , 0x00e810 },
4717 { PLL_UNK41 , 0x00e818 },
4718 { PLL_UNK42 , 0x00e824 },
4719 { PLL_VPLL0 , 0x614100 },
4720 { PLL_VPLL1 , 0x614900 },
4721 {}
4722};
4723
4724static struct pll_mapping nv84_pll_mapping[] = {
4725 { PLL_CORE , 0x004028 },
4726 { PLL_SHADER, 0x004020 },
4727 { PLL_MEMORY, 0x004008 },
4728 { PLL_UNK05 , 0x004030 },
4729 { PLL_UNK41 , 0x00e818 },
4730 { PLL_VPLL0 , 0x614100 },
4731 { PLL_VPLL1 , 0x614900 },
4732 {}
4733};
4734
4735u32
4736get_pll_register(struct drm_device *dev, enum pll_types type)
4737{
4738 struct drm_nouveau_private *dev_priv = dev->dev_private;
4739 struct nvbios *bios = &dev_priv->vbios;
4740 struct pll_mapping *map;
4741 int i;
4742
4743 if (dev_priv->card_type < NV_40)
4744 map = nv04_pll_mapping;
4745 else
4746 if (dev_priv->card_type < NV_50)
4747 map = nv40_pll_mapping;
4748 else {
4749 u8 *plim = &bios->data[bios->pll_limit_tbl_ptr];
4750
4751 if (plim[0] >= 0x30) {
4752 u8 *entry = plim + plim[1];
4753 for (i = 0; i < plim[3]; i++, entry += plim[2]) {
4754 if (entry[0] == type)
4755 return ROM32(entry[3]);
4756 }
4757
4758 return 0;
4759 }
4760
4761 if (dev_priv->chipset == 0x50)
4762 map = nv50_pll_mapping;
4763 else
4764 map = nv84_pll_mapping;
4765 }
4766
4767 while (map->reg) {
4768 if (map->type == type)
4769 return map->reg;
4770 map++;
4771 }
4772
4773 return 0;
4774}
4775
4678int get_pll_limits(struct drm_device *dev, uint32_t limit_match, struct pll_lims *pll_lim) 4776int get_pll_limits(struct drm_device *dev, uint32_t limit_match, struct pll_lims *pll_lim)
4679{ 4777{
4680 /* 4778 /*
@@ -4750,6 +4848,17 @@ int get_pll_limits(struct drm_device *dev, uint32_t limit_match, struct pll_lims
4750 /* initialize all members to zero */ 4848 /* initialize all members to zero */
4751 memset(pll_lim, 0, sizeof(struct pll_lims)); 4849 memset(pll_lim, 0, sizeof(struct pll_lims));
4752 4850
4851 /* if we were passed a type rather than a register, figure
4852 * out the register and store it
4853 */
4854 if (limit_match > PLL_MAX)
4855 pll_lim->reg = limit_match;
4856 else {
4857 pll_lim->reg = get_pll_register(dev, limit_match);
4858 if (!pll_lim->reg)
4859 return -ENOENT;
4860 }
4861
4753 if (pll_lim_ver == 0x10 || pll_lim_ver == 0x11) { 4862 if (pll_lim_ver == 0x10 || pll_lim_ver == 0x11) {
4754 uint8_t *pll_rec = &bios->data[bios->pll_limit_tbl_ptr + headerlen + recordlen * pllindex]; 4863 uint8_t *pll_rec = &bios->data[bios->pll_limit_tbl_ptr + headerlen + recordlen * pllindex];
4755 4864
@@ -4785,7 +4894,6 @@ int get_pll_limits(struct drm_device *dev, uint32_t limit_match, struct pll_lims
4785 pll_lim->max_usable_log2p = 0x6; 4894 pll_lim->max_usable_log2p = 0x6;
4786 } else if (pll_lim_ver == 0x20 || pll_lim_ver == 0x21) { 4895 } else if (pll_lim_ver == 0x20 || pll_lim_ver == 0x21) {
4787 uint16_t plloffs = bios->pll_limit_tbl_ptr + headerlen; 4896 uint16_t plloffs = bios->pll_limit_tbl_ptr + headerlen;
4788 uint32_t reg = 0; /* default match */
4789 uint8_t *pll_rec; 4897 uint8_t *pll_rec;
4790 int i; 4898 int i;
4791 4899
@@ -4797,37 +4905,22 @@ int get_pll_limits(struct drm_device *dev, uint32_t limit_match, struct pll_lims
4797 NV_WARN(dev, "Default PLL limit entry has non-zero " 4905 NV_WARN(dev, "Default PLL limit entry has non-zero "
4798 "register field\n"); 4906 "register field\n");
4799 4907
4800 if (limit_match > MAX_PLL_TYPES)
4801 /* we've been passed a reg as the match */
4802 reg = limit_match;
4803 else /* limit match is a pll type */
4804 for (i = 1; i < entries && !reg; i++) {
4805 uint32_t cmpreg = ROM32(bios->data[plloffs + recordlen * i]);
4806
4807 if (limit_match == NVPLL &&
4808 (cmpreg == NV_PRAMDAC_NVPLL_COEFF || cmpreg == 0x4000))
4809 reg = cmpreg;
4810 if (limit_match == MPLL &&
4811 (cmpreg == NV_PRAMDAC_MPLL_COEFF || cmpreg == 0x4020))
4812 reg = cmpreg;
4813 if (limit_match == VPLL1 &&
4814 (cmpreg == NV_PRAMDAC_VPLL_COEFF || cmpreg == 0x4010))
4815 reg = cmpreg;
4816 if (limit_match == VPLL2 &&
4817 (cmpreg == NV_RAMDAC_VPLL2 || cmpreg == 0x4018))
4818 reg = cmpreg;
4819 }
4820
4821 for (i = 1; i < entries; i++) 4908 for (i = 1; i < entries; i++)
4822 if (ROM32(bios->data[plloffs + recordlen * i]) == reg) { 4909 if (ROM32(bios->data[plloffs + recordlen * i]) == pll_lim->reg) {
4823 pllindex = i; 4910 pllindex = i;
4824 break; 4911 break;
4825 } 4912 }
4826 4913
4914 if ((dev_priv->card_type >= NV_50) && (pllindex == 0)) {
4915 NV_ERROR(dev, "Register 0x%08x not found in PLL "
4916 "limits table", pll_lim->reg);
4917 return -ENOENT;
4918 }
4919
4827 pll_rec = &bios->data[plloffs + recordlen * pllindex]; 4920 pll_rec = &bios->data[plloffs + recordlen * pllindex];
4828 4921
4829 BIOSLOG(bios, "Loading PLL limits for reg 0x%08x\n", 4922 BIOSLOG(bios, "Loading PLL limits for reg 0x%08x\n",
4830 pllindex ? reg : 0); 4923 pllindex ? pll_lim->reg : 0);
4831 4924
4832 /* 4925 /*
4833 * Frequencies are stored in tables in MHz, kHz are more 4926 * Frequencies are stored in tables in MHz, kHz are more
@@ -4877,8 +4970,8 @@ int get_pll_limits(struct drm_device *dev, uint32_t limit_match, struct pll_lims
4877 if (cv == 0x51 && !pll_lim->refclk) { 4970 if (cv == 0x51 && !pll_lim->refclk) {
4878 uint32_t sel_clk = bios_rd32(bios, NV_PRAMDAC_SEL_CLK); 4971 uint32_t sel_clk = bios_rd32(bios, NV_PRAMDAC_SEL_CLK);
4879 4972
4880 if (((limit_match == NV_PRAMDAC_VPLL_COEFF || limit_match == VPLL1) && sel_clk & 0x20) || 4973 if ((pll_lim->reg == NV_PRAMDAC_VPLL_COEFF && sel_clk & 0x20) ||
4881 ((limit_match == NV_RAMDAC_VPLL2 || limit_match == VPLL2) && sel_clk & 0x80)) { 4974 (pll_lim->reg == NV_RAMDAC_VPLL2 && sel_clk & 0x80)) {
4882 if (bios_idxprt_rd(bios, NV_CIO_CRX__COLOR, NV_CIO_CRE_CHIP_ID_INDEX) < 0xa3) 4975 if (bios_idxprt_rd(bios, NV_CIO_CRX__COLOR, NV_CIO_CRE_CHIP_ID_INDEX) < 0xa3)
4883 pll_lim->refclk = 200000; 4976 pll_lim->refclk = 200000;
4884 else 4977 else
@@ -4891,10 +4984,10 @@ int get_pll_limits(struct drm_device *dev, uint32_t limit_match, struct pll_lims
4891 int i; 4984 int i;
4892 4985
4893 BIOSLOG(bios, "Loading PLL limits for register 0x%08x\n", 4986 BIOSLOG(bios, "Loading PLL limits for register 0x%08x\n",
4894 limit_match); 4987 pll_lim->reg);
4895 4988
4896 for (i = 0; i < entries; i++, entry += recordlen) { 4989 for (i = 0; i < entries; i++, entry += recordlen) {
4897 if (ROM32(entry[3]) == limit_match) { 4990 if (ROM32(entry[3]) == pll_lim->reg) {
4898 record = &bios->data[ROM16(entry[1])]; 4991 record = &bios->data[ROM16(entry[1])];
4899 break; 4992 break;
4900 } 4993 }
@@ -4902,7 +4995,7 @@ int get_pll_limits(struct drm_device *dev, uint32_t limit_match, struct pll_lims
4902 4995
4903 if (!record) { 4996 if (!record) {
4904 NV_ERROR(dev, "Register 0x%08x not found in PLL " 4997 NV_ERROR(dev, "Register 0x%08x not found in PLL "
4905 "limits table", limit_match); 4998 "limits table", pll_lim->reg);
4906 return -ENOENT; 4999 return -ENOENT;
4907 } 5000 }
4908 5001
@@ -4931,10 +5024,10 @@ int get_pll_limits(struct drm_device *dev, uint32_t limit_match, struct pll_lims
4931 int i; 5024 int i;
4932 5025
4933 BIOSLOG(bios, "Loading PLL limits for register 0x%08x\n", 5026 BIOSLOG(bios, "Loading PLL limits for register 0x%08x\n",
4934 limit_match); 5027 pll_lim->reg);
4935 5028
4936 for (i = 0; i < entries; i++, entry += recordlen) { 5029 for (i = 0; i < entries; i++, entry += recordlen) {
4937 if (ROM32(entry[3]) == limit_match) { 5030 if (ROM32(entry[3]) == pll_lim->reg) {
4938 record = &bios->data[ROM16(entry[1])]; 5031 record = &bios->data[ROM16(entry[1])];
4939 break; 5032 break;
4940 } 5033 }
@@ -4942,7 +5035,7 @@ int get_pll_limits(struct drm_device *dev, uint32_t limit_match, struct pll_lims
4942 5035
4943 if (!record) { 5036 if (!record) {
4944 NV_ERROR(dev, "Register 0x%08x not found in PLL " 5037 NV_ERROR(dev, "Register 0x%08x not found in PLL "
4945 "limits table", limit_match); 5038 "limits table", pll_lim->reg);
4946 return -ENOENT; 5039 return -ENOENT;
4947 } 5040 }
4948 5041
@@ -4956,11 +5049,7 @@ int get_pll_limits(struct drm_device *dev, uint32_t limit_match, struct pll_lims
4956 pll_lim->vco1.max_n = record[11]; 5049 pll_lim->vco1.max_n = record[11];
4957 pll_lim->min_p = record[12]; 5050 pll_lim->min_p = record[12];
4958 pll_lim->max_p = record[13]; 5051 pll_lim->max_p = record[13];
4959 /* where did this go to?? */ 5052 pll_lim->refclk = ROM16(entry[9]) * 1000;
4960 if ((entry[0] & 0xf0) == 0x80)
4961 pll_lim->refclk = 27000;
4962 else
4963 pll_lim->refclk = 100000;
4964 } 5053 }
4965 5054
4966 /* 5055 /*
@@ -5293,7 +5382,7 @@ parse_bit_M_tbl_entry(struct drm_device *dev, struct nvbios *bios,
5293 if (bitentry->length < 0x5) 5382 if (bitentry->length < 0x5)
5294 return 0; 5383 return 0;
5295 5384
5296 if (bitentry->id[1] < 2) { 5385 if (bitentry->version < 2) {
5297 bios->ram_restrict_group_count = bios->data[bitentry->offset + 2]; 5386 bios->ram_restrict_group_count = bios->data[bitentry->offset + 2];
5298 bios->ram_restrict_tbl_ptr = ROM16(bios->data[bitentry->offset + 3]); 5387 bios->ram_restrict_tbl_ptr = ROM16(bios->data[bitentry->offset + 3]);
5299 } else { 5388 } else {
@@ -5403,27 +5492,40 @@ struct bit_table {
5403 5492
5404#define BIT_TABLE(id, funcid) ((struct bit_table){ id, parse_bit_##funcid##_tbl_entry }) 5493#define BIT_TABLE(id, funcid) ((struct bit_table){ id, parse_bit_##funcid##_tbl_entry })
5405 5494
5495int
5496bit_table(struct drm_device *dev, u8 id, struct bit_entry *bit)
5497{
5498 struct drm_nouveau_private *dev_priv = dev->dev_private;
5499 struct nvbios *bios = &dev_priv->vbios;
5500 u8 entries, *entry;
5501
5502 entries = bios->data[bios->offset + 10];
5503 entry = &bios->data[bios->offset + 12];
5504 while (entries--) {
5505 if (entry[0] == id) {
5506 bit->id = entry[0];
5507 bit->version = entry[1];
5508 bit->length = ROM16(entry[2]);
5509 bit->offset = ROM16(entry[4]);
5510 bit->data = ROMPTR(bios, entry[4]);
5511 return 0;
5512 }
5513
5514 entry += bios->data[bios->offset + 9];
5515 }
5516
5517 return -ENOENT;
5518}
5519
5406static int 5520static int
5407parse_bit_table(struct nvbios *bios, const uint16_t bitoffset, 5521parse_bit_table(struct nvbios *bios, const uint16_t bitoffset,
5408 struct bit_table *table) 5522 struct bit_table *table)
5409{ 5523{
5410 struct drm_device *dev = bios->dev; 5524 struct drm_device *dev = bios->dev;
5411 uint8_t maxentries = bios->data[bitoffset + 4];
5412 int i, offset;
5413 struct bit_entry bitentry; 5525 struct bit_entry bitentry;
5414 5526
5415 for (i = 0, offset = bitoffset + 6; i < maxentries; i++, offset += 6) { 5527 if (bit_table(dev, table->id, &bitentry) == 0)
5416 bitentry.id[0] = bios->data[offset];
5417
5418 if (bitentry.id[0] != table->id)
5419 continue;
5420
5421 bitentry.id[1] = bios->data[offset + 1];
5422 bitentry.length = ROM16(bios->data[offset + 2]);
5423 bitentry.offset = ROM16(bios->data[offset + 4]);
5424
5425 return table->parse_fn(dev, bios, &bitentry); 5528 return table->parse_fn(dev, bios, &bitentry);
5426 }
5427 5529
5428 NV_INFO(dev, "BIT table '%c' not found\n", table->id); 5530 NV_INFO(dev, "BIT table '%c' not found\n", table->id);
5429 return -ENOSYS; 5531 return -ENOSYS;
@@ -5683,8 +5785,14 @@ static uint16_t findstr(uint8_t *data, int n, const uint8_t *str, int len)
5683static struct dcb_gpio_entry * 5785static struct dcb_gpio_entry *
5684new_gpio_entry(struct nvbios *bios) 5786new_gpio_entry(struct nvbios *bios)
5685{ 5787{
5788 struct drm_device *dev = bios->dev;
5686 struct dcb_gpio_table *gpio = &bios->dcb.gpio; 5789 struct dcb_gpio_table *gpio = &bios->dcb.gpio;
5687 5790
5791 if (gpio->entries >= DCB_MAX_NUM_GPIO_ENTRIES) {
5792 NV_ERROR(dev, "exceeded maximum number of gpio entries!!\n");
5793 return NULL;
5794 }
5795
5688 return &gpio->entry[gpio->entries++]; 5796 return &gpio->entry[gpio->entries++];
5689} 5797}
5690 5798
@@ -5706,113 +5814,90 @@ nouveau_bios_gpio_entry(struct drm_device *dev, enum dcb_gpio_tag tag)
5706} 5814}
5707 5815
5708static void 5816static void
5709parse_dcb30_gpio_entry(struct nvbios *bios, uint16_t offset)
5710{
5711 struct dcb_gpio_entry *gpio;
5712 uint16_t ent = ROM16(bios->data[offset]);
5713 uint8_t line = ent & 0x1f,
5714 tag = ent >> 5 & 0x3f,
5715 flags = ent >> 11 & 0x1f;
5716
5717 if (tag == 0x3f)
5718 return;
5719
5720 gpio = new_gpio_entry(bios);
5721
5722 gpio->tag = tag;
5723 gpio->line = line;
5724 gpio->invert = flags != 4;
5725 gpio->entry = ent;
5726}
5727
5728static void
5729parse_dcb40_gpio_entry(struct nvbios *bios, uint16_t offset)
5730{
5731 uint32_t entry = ROM32(bios->data[offset]);
5732 struct dcb_gpio_entry *gpio;
5733
5734 if ((entry & 0x0000ff00) == 0x0000ff00)
5735 return;
5736
5737 gpio = new_gpio_entry(bios);
5738 gpio->tag = (entry & 0x0000ff00) >> 8;
5739 gpio->line = (entry & 0x0000001f) >> 0;
5740 gpio->state_default = (entry & 0x01000000) >> 24;
5741 gpio->state[0] = (entry & 0x18000000) >> 27;
5742 gpio->state[1] = (entry & 0x60000000) >> 29;
5743 gpio->entry = entry;
5744}
5745
5746static void
5747parse_dcb_gpio_table(struct nvbios *bios) 5817parse_dcb_gpio_table(struct nvbios *bios)
5748{ 5818{
5749 struct drm_device *dev = bios->dev; 5819 struct drm_device *dev = bios->dev;
5750 uint16_t gpio_table_ptr = bios->dcb.gpio_table_ptr; 5820 struct dcb_gpio_entry *e;
5751 uint8_t *gpio_table = &bios->data[gpio_table_ptr]; 5821 u8 headerlen, entries, recordlen;
5752 int header_len = gpio_table[1], 5822 u8 *dcb, *gpio = NULL, *entry;
5753 entries = gpio_table[2],
5754 entry_len = gpio_table[3];
5755 void (*parse_entry)(struct nvbios *, uint16_t) = NULL;
5756 int i; 5823 int i;
5757 5824
5758 if (bios->dcb.version >= 0x40) { 5825 dcb = ROMPTR(bios, bios->data[0x36]);
5759 if (gpio_table_ptr && entry_len != 4) { 5826 if (dcb[0] >= 0x30) {
5760 NV_WARN(dev, "Invalid DCB GPIO table entry length.\n"); 5827 gpio = ROMPTR(bios, dcb[10]);
5761 return; 5828 if (!gpio)
5762 } 5829 goto no_table;
5763 5830
5764 parse_entry = parse_dcb40_gpio_entry; 5831 headerlen = gpio[1];
5832 entries = gpio[2];
5833 recordlen = gpio[3];
5834 } else
5835 if (dcb[0] >= 0x22 && dcb[-1] >= 0x13) {
5836 gpio = ROMPTR(bios, dcb[-15]);
5837 if (!gpio)
5838 goto no_table;
5839
5840 headerlen = 3;
5841 entries = gpio[2];
5842 recordlen = gpio[1];
5843 } else
5844 if (dcb[0] >= 0x22) {
5845 /* No GPIO table present, parse the TVDAC GPIO data. */
5846 uint8_t *tvdac_gpio = &dcb[-5];
5765 5847
5766 } else if (bios->dcb.version >= 0x30) { 5848 if (tvdac_gpio[0] & 1) {
5767 if (gpio_table_ptr && entry_len != 2) { 5849 e = new_gpio_entry(bios);
5768 NV_WARN(dev, "Invalid DCB GPIO table entry length.\n"); 5850 e->tag = DCB_GPIO_TVDAC0;
5769 return; 5851 e->line = tvdac_gpio[1] >> 4;
5852 e->invert = tvdac_gpio[0] & 2;
5770 } 5853 }
5771 5854
5772 parse_entry = parse_dcb30_gpio_entry; 5855 goto no_table;
5773 5856 } else {
5774 } else if (bios->dcb.version >= 0x22) { 5857 NV_DEBUG(dev, "no/unknown gpio table on DCB 0x%02x\n", dcb[0]);
5775 /* 5858 goto no_table;
5776 * DCBs older than v3.0 don't really have a GPIO 5859 }
5777 * table, instead they keep some GPIO info at fixed
5778 * locations.
5779 */
5780 uint16_t dcbptr = ROM16(bios->data[0x36]);
5781 uint8_t *tvdac_gpio = &bios->data[dcbptr - 5];
5782 5860
5783 if (tvdac_gpio[0] & 1) { 5861 entry = gpio + headerlen;
5784 struct dcb_gpio_entry *gpio = new_gpio_entry(bios); 5862 for (i = 0; i < entries; i++, entry += recordlen) {
5863 e = new_gpio_entry(bios);
5864 if (!e)
5865 break;
5785 5866
5786 gpio->tag = DCB_GPIO_TVDAC0; 5867 if (gpio[0] < 0x40) {
5787 gpio->line = tvdac_gpio[1] >> 4; 5868 e->entry = ROM16(entry[0]);
5788 gpio->invert = tvdac_gpio[0] & 2; 5869 e->tag = (e->entry & 0x07e0) >> 5;
5789 } 5870 if (e->tag == 0x3f) {
5790 } else { 5871 bios->dcb.gpio.entries--;
5791 /* 5872 continue;
5792 * No systematic way to store GPIO info on pre-v2.2 5873 }
5793 * DCBs, try to match the PCI device IDs.
5794 */
5795 5874
5796 /* Apple iMac G4 NV18 */ 5875 e->line = (e->entry & 0x001f);
5797 if (nv_match_device(dev, 0x0189, 0x10de, 0x0010)) { 5876 e->invert = ((e->entry & 0xf800) >> 11) != 4;
5798 struct dcb_gpio_entry *gpio = new_gpio_entry(bios); 5877 } else {
5878 e->entry = ROM32(entry[0]);
5879 e->tag = (e->entry & 0x0000ff00) >> 8;
5880 if (e->tag == 0xff) {
5881 bios->dcb.gpio.entries--;
5882 continue;
5883 }
5799 5884
5800 gpio->tag = DCB_GPIO_TVDAC0; 5885 e->line = (e->entry & 0x0000001f) >> 0;
5801 gpio->line = 4; 5886 e->state_default = (e->entry & 0x01000000) >> 24;
5887 e->state[0] = (e->entry & 0x18000000) >> 27;
5888 e->state[1] = (e->entry & 0x60000000) >> 29;
5802 } 5889 }
5803
5804 } 5890 }
5805 5891
5806 if (!gpio_table_ptr) 5892no_table:
5807 return; 5893 /* Apple iMac G4 NV18 */
5808 5894 if (nv_match_device(dev, 0x0189, 0x10de, 0x0010)) {
5809 if (entries > DCB_MAX_NUM_GPIO_ENTRIES) { 5895 e = new_gpio_entry(bios);
5810 NV_WARN(dev, "Too many entries in the DCB GPIO table.\n"); 5896 if (e) {
5811 entries = DCB_MAX_NUM_GPIO_ENTRIES; 5897 e->tag = DCB_GPIO_TVDAC0;
5898 e->line = 4;
5899 }
5812 } 5900 }
5813
5814 for (i = 0; i < entries; i++)
5815 parse_entry(bios, gpio_table_ptr + header_len + entry_len * i);
5816} 5901}
5817 5902
5818struct dcb_connector_table_entry * 5903struct dcb_connector_table_entry *
@@ -5882,6 +5967,11 @@ apply_dcb_connector_quirks(struct nvbios *bios, int idx)
5882 } 5967 }
5883} 5968}
5884 5969
5970static const u8 hpd_gpio[16] = {
5971 0xff, 0x07, 0x08, 0xff, 0xff, 0x51, 0x52, 0xff,
5972 0xff, 0xff, 0xff, 0xff, 0xff, 0x5e, 0x5f, 0x60,
5973};
5974
5885static void 5975static void
5886parse_dcb_connector_table(struct nvbios *bios) 5976parse_dcb_connector_table(struct nvbios *bios)
5887{ 5977{
@@ -5918,23 +6008,9 @@ parse_dcb_connector_table(struct nvbios *bios)
5918 6008
5919 cte->type = (cte->entry & 0x000000ff) >> 0; 6009 cte->type = (cte->entry & 0x000000ff) >> 0;
5920 cte->index2 = (cte->entry & 0x00000f00) >> 8; 6010 cte->index2 = (cte->entry & 0x00000f00) >> 8;
5921 switch (cte->entry & 0x00033000) { 6011
5922 case 0x00001000: 6012 cte->gpio_tag = ffs((cte->entry & 0x07033000) >> 12);
5923 cte->gpio_tag = 0x07; 6013 cte->gpio_tag = hpd_gpio[cte->gpio_tag];
5924 break;
5925 case 0x00002000:
5926 cte->gpio_tag = 0x08;
5927 break;
5928 case 0x00010000:
5929 cte->gpio_tag = 0x51;
5930 break;
5931 case 0x00020000:
5932 cte->gpio_tag = 0x52;
5933 break;
5934 default:
5935 cte->gpio_tag = 0xff;
5936 break;
5937 }
5938 6014
5939 if (cte->type == 0xff) 6015 if (cte->type == 0xff)
5940 continue; 6016 continue;
@@ -5955,6 +6031,7 @@ parse_dcb_connector_table(struct nvbios *bios)
5955 case DCB_CONNECTOR_DVI_I: 6031 case DCB_CONNECTOR_DVI_I:
5956 case DCB_CONNECTOR_DVI_D: 6032 case DCB_CONNECTOR_DVI_D:
5957 case DCB_CONNECTOR_LVDS: 6033 case DCB_CONNECTOR_LVDS:
6034 case DCB_CONNECTOR_LVDS_SPWG:
5958 case DCB_CONNECTOR_DP: 6035 case DCB_CONNECTOR_DP:
5959 case DCB_CONNECTOR_eDP: 6036 case DCB_CONNECTOR_eDP:
5960 case DCB_CONNECTOR_HDMI_0: 6037 case DCB_CONNECTOR_HDMI_0:
@@ -5985,52 +6062,17 @@ static struct dcb_entry *new_dcb_entry(struct dcb_table *dcb)
5985 return entry; 6062 return entry;
5986} 6063}
5987 6064
5988static void fabricate_vga_output(struct dcb_table *dcb, int i2c, int heads) 6065static void fabricate_dcb_output(struct dcb_table *dcb, int type, int i2c,
6066 int heads, int or)
5989{ 6067{
5990 struct dcb_entry *entry = new_dcb_entry(dcb); 6068 struct dcb_entry *entry = new_dcb_entry(dcb);
5991 6069
5992 entry->type = 0; 6070 entry->type = type;
5993 entry->i2c_index = i2c; 6071 entry->i2c_index = i2c;
5994 entry->heads = heads; 6072 entry->heads = heads;
5995 entry->location = DCB_LOC_ON_CHIP; 6073 if (type != OUTPUT_ANALOG)
5996 entry->or = 1; 6074 entry->location = !DCB_LOC_ON_CHIP; /* ie OFF CHIP */
5997} 6075 entry->or = or;
5998
5999static void fabricate_dvi_i_output(struct dcb_table *dcb, bool twoHeads)
6000{
6001 struct dcb_entry *entry = new_dcb_entry(dcb);
6002
6003 entry->type = 2;
6004 entry->i2c_index = LEGACY_I2C_PANEL;
6005 entry->heads = twoHeads ? 3 : 1;
6006 entry->location = !DCB_LOC_ON_CHIP; /* ie OFF CHIP */
6007 entry->or = 1; /* means |0x10 gets set on CRE_LCD__INDEX */
6008 entry->duallink_possible = false; /* SiI164 and co. are single link */
6009
6010#if 0
6011 /*
6012 * For dvi-a either crtc probably works, but my card appears to only
6013 * support dvi-d. "nvidia" still attempts to program it for dvi-a,
6014 * doing the full fp output setup (program 0x6808.. fp dimension regs,
6015 * setting 0x680848 to 0x10000111 to enable, maybe setting 0x680880);
6016 * the monitor picks up the mode res ok and lights up, but no pixel
6017 * data appears, so the board manufacturer probably connected up the
6018 * sync lines, but missed the video traces / components
6019 *
6020 * with this introduction, dvi-a left as an exercise for the reader.
6021 */
6022 fabricate_vga_output(dcb, LEGACY_I2C_PANEL, entry->heads);
6023#endif
6024}
6025
6026static void fabricate_tv_output(struct dcb_table *dcb, bool twoHeads)
6027{
6028 struct dcb_entry *entry = new_dcb_entry(dcb);
6029
6030 entry->type = 1;
6031 entry->i2c_index = LEGACY_I2C_TV;
6032 entry->heads = twoHeads ? 3 : 1;
6033 entry->location = !DCB_LOC_ON_CHIP; /* ie OFF CHIP */
6034} 6076}
6035 6077
6036static bool 6078static bool
@@ -6195,7 +6237,7 @@ parse_dcb15_entry(struct drm_device *dev, struct dcb_table *dcb,
6195 entry->tvconf.has_component_output = false; 6237 entry->tvconf.has_component_output = false;
6196 break; 6238 break;
6197 case OUTPUT_LVDS: 6239 case OUTPUT_LVDS:
6198 if ((conn & 0x00003f00) != 0x10) 6240 if ((conn & 0x00003f00) >> 8 != 0x10)
6199 entry->lvdsconf.use_straps_for_mode = true; 6241 entry->lvdsconf.use_straps_for_mode = true;
6200 entry->lvdsconf.use_power_scripts = true; 6242 entry->lvdsconf.use_power_scripts = true;
6201 break; 6243 break;
@@ -6277,6 +6319,9 @@ void merge_like_dcb_entries(struct drm_device *dev, struct dcb_table *dcb)
6277static bool 6319static bool
6278apply_dcb_encoder_quirks(struct drm_device *dev, int idx, u32 *conn, u32 *conf) 6320apply_dcb_encoder_quirks(struct drm_device *dev, int idx, u32 *conn, u32 *conf)
6279{ 6321{
6322 struct drm_nouveau_private *dev_priv = dev->dev_private;
6323 struct dcb_table *dcb = &dev_priv->vbios.dcb;
6324
6280 /* Dell Precision M6300 6325 /* Dell Precision M6300
6281 * DCB entry 2: 02025312 00000010 6326 * DCB entry 2: 02025312 00000010
6282 * DCB entry 3: 02026312 00000020 6327 * DCB entry 3: 02026312 00000020
@@ -6294,11 +6339,77 @@ apply_dcb_encoder_quirks(struct drm_device *dev, int idx, u32 *conn, u32 *conf)
6294 return false; 6339 return false;
6295 } 6340 }
6296 6341
6342 /* GeForce3 Ti 200
6343 *
6344 * DCB reports an LVDS output that should be TMDS:
6345 * DCB entry 1: f2005014 ffffffff
6346 */
6347 if (nv_match_device(dev, 0x0201, 0x1462, 0x8851)) {
6348 if (*conn == 0xf2005014 && *conf == 0xffffffff) {
6349 fabricate_dcb_output(dcb, OUTPUT_TMDS, 1, 1, 1);
6350 return false;
6351 }
6352 }
6353
6354 /* XFX GT-240X-YA
6355 *
6356 * So many things wrong here, replace the entire encoder table..
6357 */
6358 if (nv_match_device(dev, 0x0ca3, 0x1682, 0x3003)) {
6359 if (idx == 0) {
6360 *conn = 0x02001300; /* VGA, connector 1 */
6361 *conf = 0x00000028;
6362 } else
6363 if (idx == 1) {
6364 *conn = 0x01010312; /* DVI, connector 0 */
6365 *conf = 0x00020030;
6366 } else
6367 if (idx == 2) {
6368 *conn = 0x01010310; /* VGA, connector 0 */
6369 *conf = 0x00000028;
6370 } else
6371 if (idx == 3) {
6372 *conn = 0x02022362; /* HDMI, connector 2 */
6373 *conf = 0x00020010;
6374 } else {
6375 *conn = 0x0000000e; /* EOL */
6376 *conf = 0x00000000;
6377 }
6378 }
6379
6297 return true; 6380 return true;
6298} 6381}
6299 6382
6383static void
6384fabricate_dcb_encoder_table(struct drm_device *dev, struct nvbios *bios)
6385{
6386 struct dcb_table *dcb = &bios->dcb;
6387 int all_heads = (nv_two_heads(dev) ? 3 : 1);
6388
6389#ifdef __powerpc__
6390 /* Apple iMac G4 NV17 */
6391 if (of_machine_is_compatible("PowerMac4,5")) {
6392 fabricate_dcb_output(dcb, OUTPUT_TMDS, 0, all_heads, 1);
6393 fabricate_dcb_output(dcb, OUTPUT_ANALOG, 1, all_heads, 2);
6394 return;
6395 }
6396#endif
6397
6398 /* Make up some sane defaults */
6399 fabricate_dcb_output(dcb, OUTPUT_ANALOG, LEGACY_I2C_CRT, 1, 1);
6400
6401 if (nv04_tv_identify(dev, bios->legacy.i2c_indices.tv) >= 0)
6402 fabricate_dcb_output(dcb, OUTPUT_TV, LEGACY_I2C_TV,
6403 all_heads, 0);
6404
6405 else if (bios->tmds.output0_script_ptr ||
6406 bios->tmds.output1_script_ptr)
6407 fabricate_dcb_output(dcb, OUTPUT_TMDS, LEGACY_I2C_PANEL,
6408 all_heads, 1);
6409}
6410
6300static int 6411static int
6301parse_dcb_table(struct drm_device *dev, struct nvbios *bios, bool twoHeads) 6412parse_dcb_table(struct drm_device *dev, struct nvbios *bios)
6302{ 6413{
6303 struct drm_nouveau_private *dev_priv = dev->dev_private; 6414 struct drm_nouveau_private *dev_priv = dev->dev_private;
6304 struct dcb_table *dcb = &bios->dcb; 6415 struct dcb_table *dcb = &bios->dcb;
@@ -6318,12 +6429,7 @@ parse_dcb_table(struct drm_device *dev, struct nvbios *bios, bool twoHeads)
6318 6429
6319 /* this situation likely means a really old card, pre DCB */ 6430 /* this situation likely means a really old card, pre DCB */
6320 if (dcbptr == 0x0) { 6431 if (dcbptr == 0x0) {
6321 NV_INFO(dev, "Assuming a CRT output exists\n"); 6432 fabricate_dcb_encoder_table(dev, bios);
6322 fabricate_vga_output(dcb, LEGACY_I2C_CRT, 1);
6323
6324 if (nv04_tv_identify(dev, bios->legacy.i2c_indices.tv) >= 0)
6325 fabricate_tv_output(dcb, twoHeads);
6326
6327 return 0; 6433 return 0;
6328 } 6434 }
6329 6435
@@ -6383,21 +6489,7 @@ parse_dcb_table(struct drm_device *dev, struct nvbios *bios, bool twoHeads)
6383 */ 6489 */
6384 NV_TRACEWARN(dev, "No useful information in BIOS output table; " 6490 NV_TRACEWARN(dev, "No useful information in BIOS output table; "
6385 "adding all possible outputs\n"); 6491 "adding all possible outputs\n");
6386 fabricate_vga_output(dcb, LEGACY_I2C_CRT, 1); 6492 fabricate_dcb_encoder_table(dev, bios);
6387
6388 /*
6389 * Attempt to detect TV before DVI because the test
6390 * for the former is more accurate and it rules the
6391 * latter out.
6392 */
6393 if (nv04_tv_identify(dev,
6394 bios->legacy.i2c_indices.tv) >= 0)
6395 fabricate_tv_output(dcb, twoHeads);
6396
6397 else if (bios->tmds.output0_script_ptr ||
6398 bios->tmds.output1_script_ptr)
6399 fabricate_dvi_i_output(dcb, twoHeads);
6400
6401 return 0; 6493 return 0;
6402 } 6494 }
6403 6495
@@ -6645,11 +6737,11 @@ nouveau_bios_run_init_table(struct drm_device *dev, uint16_t table,
6645 struct nvbios *bios = &dev_priv->vbios; 6737 struct nvbios *bios = &dev_priv->vbios;
6646 struct init_exec iexec = { true, false }; 6738 struct init_exec iexec = { true, false };
6647 6739
6648 mutex_lock(&bios->lock); 6740 spin_lock_bh(&bios->lock);
6649 bios->display.output = dcbent; 6741 bios->display.output = dcbent;
6650 parse_init_table(bios, table, &iexec); 6742 parse_init_table(bios, table, &iexec);
6651 bios->display.output = NULL; 6743 bios->display.output = NULL;
6652 mutex_unlock(&bios->lock); 6744 spin_unlock_bh(&bios->lock);
6653} 6745}
6654 6746
6655static bool NVInitVBIOS(struct drm_device *dev) 6747static bool NVInitVBIOS(struct drm_device *dev)
@@ -6658,7 +6750,7 @@ static bool NVInitVBIOS(struct drm_device *dev)
6658 struct nvbios *bios = &dev_priv->vbios; 6750 struct nvbios *bios = &dev_priv->vbios;
6659 6751
6660 memset(bios, 0, sizeof(struct nvbios)); 6752 memset(bios, 0, sizeof(struct nvbios));
6661 mutex_init(&bios->lock); 6753 spin_lock_init(&bios->lock);
6662 bios->dev = dev; 6754 bios->dev = dev;
6663 6755
6664 if (!NVShadowVBIOS(dev, bios->data)) 6756 if (!NVShadowVBIOS(dev, bios->data))
@@ -6680,6 +6772,8 @@ static int nouveau_parse_vbios_struct(struct drm_device *dev)
6680 bit_signature, sizeof(bit_signature)); 6772 bit_signature, sizeof(bit_signature));
6681 if (offset) { 6773 if (offset) {
6682 NV_TRACE(dev, "BIT BIOS found\n"); 6774 NV_TRACE(dev, "BIT BIOS found\n");
6775 bios->type = NVBIOS_BIT;
6776 bios->offset = offset;
6683 return parse_bit_structure(bios, offset + 6); 6777 return parse_bit_structure(bios, offset + 6);
6684 } 6778 }
6685 6779
@@ -6687,6 +6781,8 @@ static int nouveau_parse_vbios_struct(struct drm_device *dev)
6687 bmp_signature, sizeof(bmp_signature)); 6781 bmp_signature, sizeof(bmp_signature));
6688 if (offset) { 6782 if (offset) {
6689 NV_TRACE(dev, "BMP BIOS found\n"); 6783 NV_TRACE(dev, "BMP BIOS found\n");
6784 bios->type = NVBIOS_BMP;
6785 bios->offset = offset;
6690 return parse_bmp_structure(dev, bios, offset); 6786 return parse_bmp_structure(dev, bios, offset);
6691 } 6787 }
6692 6788
@@ -6757,7 +6853,7 @@ nouveau_bios_posted(struct drm_device *dev)
6757 struct drm_nouveau_private *dev_priv = dev->dev_private; 6853 struct drm_nouveau_private *dev_priv = dev->dev_private;
6758 unsigned htotal; 6854 unsigned htotal;
6759 6855
6760 if (dev_priv->chipset >= NV_50) { 6856 if (dev_priv->card_type >= NV_50) {
6761 if (NVReadVgaCrtc(dev, 0, 0x00) == 0 && 6857 if (NVReadVgaCrtc(dev, 0, 0x00) == 0 &&
6762 NVReadVgaCrtc(dev, 0, 0x1a) == 0) 6858 NVReadVgaCrtc(dev, 0, 0x1a) == 0)
6763 return false; 6859 return false;
@@ -6787,7 +6883,7 @@ nouveau_bios_init(struct drm_device *dev)
6787 if (ret) 6883 if (ret)
6788 return ret; 6884 return ret;
6789 6885
6790 ret = parse_dcb_table(dev, bios, nv_two_heads(dev)); 6886 ret = parse_dcb_table(dev, bios);
6791 if (ret) 6887 if (ret)
6792 return ret; 6888 return ret;
6793 6889
@@ -6806,6 +6902,8 @@ nouveau_bios_init(struct drm_device *dev)
6806 "running VBIOS init tables.\n"); 6902 "running VBIOS init tables.\n");
6807 bios->execute = true; 6903 bios->execute = true;
6808 } 6904 }
6905 if (nouveau_force_post)
6906 bios->execute = true;
6809 6907
6810 ret = nouveau_run_vbios_init(dev); 6908 ret = nouveau_run_vbios_init(dev);
6811 if (ret) 6909 if (ret)
diff --git a/drivers/gpu/drm/nouveau/nouveau_bios.h b/drivers/gpu/drm/nouveau/nouveau_bios.h
index c1de2f3fcb0e..050c314119df 100644
--- a/drivers/gpu/drm/nouveau/nouveau_bios.h
+++ b/drivers/gpu/drm/nouveau/nouveau_bios.h
@@ -34,6 +34,20 @@
34 34
35#define DCB_LOC_ON_CHIP 0 35#define DCB_LOC_ON_CHIP 0
36 36
37#define ROM16(x) le16_to_cpu(*(uint16_t *)&(x))
38#define ROM32(x) le32_to_cpu(*(uint32_t *)&(x))
39#define ROMPTR(bios, x) (ROM16(x) ? &(bios)->data[ROM16(x)] : NULL)
40
41struct bit_entry {
42 uint8_t id;
43 uint8_t version;
44 uint16_t length;
45 uint16_t offset;
46 uint8_t *data;
47};
48
49int bit_table(struct drm_device *, u8 id, struct bit_entry *);
50
37struct dcb_i2c_entry { 51struct dcb_i2c_entry {
38 uint32_t entry; 52 uint32_t entry;
39 uint8_t port_type; 53 uint8_t port_type;
@@ -68,6 +82,7 @@ enum dcb_connector_type {
68 DCB_CONNECTOR_DVI_I = 0x30, 82 DCB_CONNECTOR_DVI_I = 0x30,
69 DCB_CONNECTOR_DVI_D = 0x31, 83 DCB_CONNECTOR_DVI_D = 0x31,
70 DCB_CONNECTOR_LVDS = 0x40, 84 DCB_CONNECTOR_LVDS = 0x40,
85 DCB_CONNECTOR_LVDS_SPWG = 0x41,
71 DCB_CONNECTOR_DP = 0x46, 86 DCB_CONNECTOR_DP = 0x46,
72 DCB_CONNECTOR_eDP = 0x47, 87 DCB_CONNECTOR_eDP = 0x47,
73 DCB_CONNECTOR_HDMI_0 = 0x60, 88 DCB_CONNECTOR_HDMI_0 = 0x60,
@@ -170,16 +185,28 @@ enum LVDS_script {
170 LVDS_PANEL_OFF 185 LVDS_PANEL_OFF
171}; 186};
172 187
173/* changing these requires matching changes to reg tables in nv_get_clock */ 188/* these match types in pll limits table version 0x40,
174#define MAX_PLL_TYPES 4 189 * nouveau uses them on all chipsets internally where a
190 * specific pll needs to be referenced, but the exact
191 * register isn't known.
192 */
175enum pll_types { 193enum pll_types {
176 NVPLL, 194 PLL_CORE = 0x01,
177 MPLL, 195 PLL_SHADER = 0x02,
178 VPLL1, 196 PLL_UNK03 = 0x03,
179 VPLL2 197 PLL_MEMORY = 0x04,
198 PLL_UNK05 = 0x05,
199 PLL_UNK40 = 0x40,
200 PLL_UNK41 = 0x41,
201 PLL_UNK42 = 0x42,
202 PLL_VPLL0 = 0x80,
203 PLL_VPLL1 = 0x81,
204 PLL_MAX = 0xff
180}; 205};
181 206
182struct pll_lims { 207struct pll_lims {
208 u32 reg;
209
183 struct { 210 struct {
184 int minfreq; 211 int minfreq;
185 int maxfreq; 212 int maxfreq;
@@ -212,6 +239,11 @@ struct pll_lims {
212 239
213struct nvbios { 240struct nvbios {
214 struct drm_device *dev; 241 struct drm_device *dev;
242 enum {
243 NVBIOS_BMP,
244 NVBIOS_BIT
245 } type;
246 uint16_t offset;
215 247
216 uint8_t chip_version; 248 uint8_t chip_version;
217 249
@@ -220,7 +252,7 @@ struct nvbios {
220 uint8_t digital_min_front_porch; 252 uint8_t digital_min_front_porch;
221 bool fp_no_ddc; 253 bool fp_no_ddc;
222 254
223 struct mutex lock; 255 spinlock_t lock;
224 256
225 uint8_t data[NV_PROM_SIZE]; 257 uint8_t data[NV_PROM_SIZE];
226 unsigned int length; 258 unsigned int length;
diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c b/drivers/gpu/drm/nouveau/nouveau_bo.c
index f6f44779d82f..2ad49cbf7c8b 100644
--- a/drivers/gpu/drm/nouveau/nouveau_bo.c
+++ b/drivers/gpu/drm/nouveau/nouveau_bo.c
@@ -32,25 +32,12 @@
32#include "nouveau_drm.h" 32#include "nouveau_drm.h"
33#include "nouveau_drv.h" 33#include "nouveau_drv.h"
34#include "nouveau_dma.h" 34#include "nouveau_dma.h"
35#include "nouveau_mm.h"
36#include "nouveau_vm.h"
35 37
36#include <linux/log2.h> 38#include <linux/log2.h>
37#include <linux/slab.h> 39#include <linux/slab.h>
38 40
39int
40nouveau_bo_sync_gpu(struct nouveau_bo *nvbo, struct nouveau_channel *chan)
41{
42 struct nouveau_fence *prev_fence = nvbo->bo.sync_obj;
43 int ret;
44
45 if (!prev_fence || nouveau_fence_channel(prev_fence) == chan)
46 return 0;
47
48 spin_lock(&nvbo->bo.lock);
49 ret = ttm_bo_wait(&nvbo->bo, false, false, false);
50 spin_unlock(&nvbo->bo.lock);
51 return ret;
52}
53
54static void 41static void
55nouveau_bo_del_ttm(struct ttm_buffer_object *bo) 42nouveau_bo_del_ttm(struct ttm_buffer_object *bo)
56{ 43{
@@ -58,114 +45,90 @@ nouveau_bo_del_ttm(struct ttm_buffer_object *bo)
58 struct drm_device *dev = dev_priv->dev; 45 struct drm_device *dev = dev_priv->dev;
59 struct nouveau_bo *nvbo = nouveau_bo(bo); 46 struct nouveau_bo *nvbo = nouveau_bo(bo);
60 47
61 ttm_bo_kunmap(&nvbo->kmap);
62
63 if (unlikely(nvbo->gem)) 48 if (unlikely(nvbo->gem))
64 DRM_ERROR("bo %p still attached to GEM object\n", bo); 49 DRM_ERROR("bo %p still attached to GEM object\n", bo);
65 50
66 if (nvbo->tile) 51 nv10_mem_put_tile_region(dev, nvbo->tile, NULL);
67 nv10_mem_expire_tiling(dev, nvbo->tile, NULL); 52 if (nvbo->vma.node) {
68 53 nouveau_vm_unmap(&nvbo->vma);
54 nouveau_vm_put(&nvbo->vma);
55 }
69 kfree(nvbo); 56 kfree(nvbo);
70} 57}
71 58
72static void 59static void
73nouveau_bo_fixup_align(struct drm_device *dev, 60nouveau_bo_fixup_align(struct nouveau_bo *nvbo, u32 flags,
74 uint32_t tile_mode, uint32_t tile_flags, 61 int *align, int *size, int *page_shift)
75 int *align, int *size)
76{ 62{
77 struct drm_nouveau_private *dev_priv = dev->dev_private; 63 struct drm_nouveau_private *dev_priv = nouveau_bdev(nvbo->bo.bdev);
78
79 /*
80 * Some of the tile_flags have a periodic structure of N*4096 bytes,
81 * align to to that as well as the page size. Align the size to the
82 * appropriate boundaries. This does imply that sizes are rounded up
83 * 3-7 pages, so be aware of this and do not waste memory by allocating
84 * many small buffers.
85 */
86 if (dev_priv->card_type == NV_50) {
87 uint32_t block_size = dev_priv->vram_size >> 15;
88 int i;
89
90 switch (tile_flags) {
91 case 0x1800:
92 case 0x2800:
93 case 0x4800:
94 case 0x7a00:
95 if (is_power_of_2(block_size)) {
96 for (i = 1; i < 10; i++) {
97 *align = 12 * i * block_size;
98 if (!(*align % 65536))
99 break;
100 }
101 } else {
102 for (i = 1; i < 10; i++) {
103 *align = 8 * i * block_size;
104 if (!(*align % 65536))
105 break;
106 }
107 }
108 *size = roundup(*size, *align);
109 break;
110 default:
111 break;
112 }
113 64
114 } else { 65 if (dev_priv->card_type < NV_50) {
115 if (tile_mode) { 66 if (nvbo->tile_mode) {
116 if (dev_priv->chipset >= 0x40) { 67 if (dev_priv->chipset >= 0x40) {
117 *align = 65536; 68 *align = 65536;
118 *size = roundup(*size, 64 * tile_mode); 69 *size = roundup(*size, 64 * nvbo->tile_mode);
119 70
120 } else if (dev_priv->chipset >= 0x30) { 71 } else if (dev_priv->chipset >= 0x30) {
121 *align = 32768; 72 *align = 32768;
122 *size = roundup(*size, 64 * tile_mode); 73 *size = roundup(*size, 64 * nvbo->tile_mode);
123 74
124 } else if (dev_priv->chipset >= 0x20) { 75 } else if (dev_priv->chipset >= 0x20) {
125 *align = 16384; 76 *align = 16384;
126 *size = roundup(*size, 64 * tile_mode); 77 *size = roundup(*size, 64 * nvbo->tile_mode);
127 78
128 } else if (dev_priv->chipset >= 0x10) { 79 } else if (dev_priv->chipset >= 0x10) {
129 *align = 16384; 80 *align = 16384;
130 *size = roundup(*size, 32 * tile_mode); 81 *size = roundup(*size, 32 * nvbo->tile_mode);
131 } 82 }
132 } 83 }
84 } else {
85 if (likely(dev_priv->chan_vm)) {
86 if (!(flags & TTM_PL_FLAG_TT) && *size > 256 * 1024)
87 *page_shift = dev_priv->chan_vm->lpg_shift;
88 else
89 *page_shift = dev_priv->chan_vm->spg_shift;
90 } else {
91 *page_shift = 12;
92 }
93
94 *size = roundup(*size, (1 << *page_shift));
95 *align = max((1 << *page_shift), *align);
133 } 96 }
134 97
135 /* ALIGN works only on powers of two. */
136 *size = roundup(*size, PAGE_SIZE); 98 *size = roundup(*size, PAGE_SIZE);
137
138 if (dev_priv->card_type == NV_50) {
139 *size = roundup(*size, 65536);
140 *align = max(65536, *align);
141 }
142} 99}
143 100
144int 101int
145nouveau_bo_new(struct drm_device *dev, struct nouveau_channel *chan, 102nouveau_bo_new(struct drm_device *dev, struct nouveau_channel *chan,
146 int size, int align, uint32_t flags, uint32_t tile_mode, 103 int size, int align, uint32_t flags, uint32_t tile_mode,
147 uint32_t tile_flags, bool no_vm, bool mappable, 104 uint32_t tile_flags, struct nouveau_bo **pnvbo)
148 struct nouveau_bo **pnvbo)
149{ 105{
150 struct drm_nouveau_private *dev_priv = dev->dev_private; 106 struct drm_nouveau_private *dev_priv = dev->dev_private;
151 struct nouveau_bo *nvbo; 107 struct nouveau_bo *nvbo;
152 int ret = 0; 108 int ret = 0, page_shift = 0;
153 109
154 nvbo = kzalloc(sizeof(struct nouveau_bo), GFP_KERNEL); 110 nvbo = kzalloc(sizeof(struct nouveau_bo), GFP_KERNEL);
155 if (!nvbo) 111 if (!nvbo)
156 return -ENOMEM; 112 return -ENOMEM;
157 INIT_LIST_HEAD(&nvbo->head); 113 INIT_LIST_HEAD(&nvbo->head);
158 INIT_LIST_HEAD(&nvbo->entry); 114 INIT_LIST_HEAD(&nvbo->entry);
159 nvbo->mappable = mappable;
160 nvbo->no_vm = no_vm;
161 nvbo->tile_mode = tile_mode; 115 nvbo->tile_mode = tile_mode;
162 nvbo->tile_flags = tile_flags; 116 nvbo->tile_flags = tile_flags;
117 nvbo->bo.bdev = &dev_priv->ttm.bdev;
163 118
164 nouveau_bo_fixup_align(dev, tile_mode, tile_flags, &align, &size); 119 nouveau_bo_fixup_align(nvbo, flags, &align, &size, &page_shift);
165 align >>= PAGE_SHIFT; 120 align >>= PAGE_SHIFT;
166 121
167 nvbo->placement.fpfn = 0; 122 if (dev_priv->chan_vm) {
168 nvbo->placement.lpfn = mappable ? dev_priv->fb_mappable_pages : 0; 123 ret = nouveau_vm_get(dev_priv->chan_vm, size, page_shift,
124 NV_MEM_ACCESS_RW, &nvbo->vma);
125 if (ret) {
126 kfree(nvbo);
127 return ret;
128 }
129 }
130
131 nvbo->bo.mem.num_pages = size >> PAGE_SHIFT;
169 nouveau_bo_placement_set(nvbo, flags, 0); 132 nouveau_bo_placement_set(nvbo, flags, 0);
170 133
171 nvbo->channel = chan; 134 nvbo->channel = chan;
@@ -178,6 +141,8 @@ nouveau_bo_new(struct drm_device *dev, struct nouveau_channel *chan,
178 } 141 }
179 nvbo->channel = NULL; 142 nvbo->channel = NULL;
180 143
144 if (nvbo->vma.node)
145 nvbo->bo.offset = nvbo->vma.offset;
181 *pnvbo = nvbo; 146 *pnvbo = nvbo;
182 return 0; 147 return 0;
183} 148}
@@ -195,6 +160,31 @@ set_placement_list(uint32_t *pl, unsigned *n, uint32_t type, uint32_t flags)
195 pl[(*n)++] = TTM_PL_FLAG_SYSTEM | flags; 160 pl[(*n)++] = TTM_PL_FLAG_SYSTEM | flags;
196} 161}
197 162
163static void
164set_placement_range(struct nouveau_bo *nvbo, uint32_t type)
165{
166 struct drm_nouveau_private *dev_priv = nouveau_bdev(nvbo->bo.bdev);
167 int vram_pages = dev_priv->vram_size >> PAGE_SHIFT;
168
169 if (dev_priv->card_type == NV_10 &&
170 nvbo->tile_mode && (type & TTM_PL_FLAG_VRAM) &&
171 nvbo->bo.mem.num_pages < vram_pages / 2) {
172 /*
173 * Make sure that the color and depth buffers are handled
174 * by independent memory controller units. Up to a 9x
175 * speed up when alpha-blending and depth-test are enabled
176 * at the same time.
177 */
178 if (nvbo->tile_flags & NOUVEAU_GEM_TILE_ZETA) {
179 nvbo->placement.fpfn = vram_pages / 2;
180 nvbo->placement.lpfn = ~0;
181 } else {
182 nvbo->placement.fpfn = 0;
183 nvbo->placement.lpfn = vram_pages / 2;
184 }
185 }
186}
187
198void 188void
199nouveau_bo_placement_set(struct nouveau_bo *nvbo, uint32_t type, uint32_t busy) 189nouveau_bo_placement_set(struct nouveau_bo *nvbo, uint32_t type, uint32_t busy)
200{ 190{
@@ -209,6 +199,8 @@ nouveau_bo_placement_set(struct nouveau_bo *nvbo, uint32_t type, uint32_t busy)
209 pl->busy_placement = nvbo->busy_placements; 199 pl->busy_placement = nvbo->busy_placements;
210 set_placement_list(nvbo->busy_placements, &pl->num_busy_placement, 200 set_placement_list(nvbo->busy_placements, &pl->num_busy_placement,
211 type | busy, flags); 201 type | busy, flags);
202
203 set_placement_range(nvbo, type);
212} 204}
213 205
214int 206int
@@ -234,7 +226,7 @@ nouveau_bo_pin(struct nouveau_bo *nvbo, uint32_t memtype)
234 226
235 nouveau_bo_placement_set(nvbo, memtype, 0); 227 nouveau_bo_placement_set(nvbo, memtype, 0);
236 228
237 ret = ttm_bo_validate(bo, &nvbo->placement, false, false, false); 229 ret = nouveau_bo_validate(nvbo, false, false, false);
238 if (ret == 0) { 230 if (ret == 0) {
239 switch (bo->mem.mem_type) { 231 switch (bo->mem.mem_type) {
240 case TTM_PL_VRAM: 232 case TTM_PL_VRAM:
@@ -270,7 +262,7 @@ nouveau_bo_unpin(struct nouveau_bo *nvbo)
270 262
271 nouveau_bo_placement_set(nvbo, bo->mem.placement, 0); 263 nouveau_bo_placement_set(nvbo, bo->mem.placement, 0);
272 264
273 ret = ttm_bo_validate(bo, &nvbo->placement, false, false, false); 265 ret = nouveau_bo_validate(nvbo, false, false, false);
274 if (ret == 0) { 266 if (ret == 0) {
275 switch (bo->mem.mem_type) { 267 switch (bo->mem.mem_type) {
276 case TTM_PL_VRAM: 268 case TTM_PL_VRAM:
@@ -305,7 +297,24 @@ nouveau_bo_map(struct nouveau_bo *nvbo)
305void 297void
306nouveau_bo_unmap(struct nouveau_bo *nvbo) 298nouveau_bo_unmap(struct nouveau_bo *nvbo)
307{ 299{
308 ttm_bo_kunmap(&nvbo->kmap); 300 if (nvbo)
301 ttm_bo_kunmap(&nvbo->kmap);
302}
303
304int
305nouveau_bo_validate(struct nouveau_bo *nvbo, bool interruptible,
306 bool no_wait_reserve, bool no_wait_gpu)
307{
308 int ret;
309
310 ret = ttm_bo_validate(&nvbo->bo, &nvbo->placement, interruptible,
311 no_wait_reserve, no_wait_gpu);
312 if (ret)
313 return ret;
314
315 if (nvbo->vma.node)
316 nvbo->bo.offset = nvbo->vma.offset;
317 return 0;
309} 318}
310 319
311u16 320u16
@@ -367,7 +376,8 @@ nouveau_bo_create_ttm_backend_entry(struct ttm_bo_device *bdev)
367 case NOUVEAU_GART_AGP: 376 case NOUVEAU_GART_AGP:
368 return ttm_agp_backend_init(bdev, dev->agp->bridge); 377 return ttm_agp_backend_init(bdev, dev->agp->bridge);
369#endif 378#endif
370 case NOUVEAU_GART_SGDMA: 379 case NOUVEAU_GART_PDMA:
380 case NOUVEAU_GART_HW:
371 return nouveau_sgdma_init_ttm(dev); 381 return nouveau_sgdma_init_ttm(dev);
372 default: 382 default:
373 NV_ERROR(dev, "Unknown GART type %d\n", 383 NV_ERROR(dev, "Unknown GART type %d\n",
@@ -399,32 +409,44 @@ nouveau_bo_init_mem_type(struct ttm_bo_device *bdev, uint32_t type,
399 man->default_caching = TTM_PL_FLAG_CACHED; 409 man->default_caching = TTM_PL_FLAG_CACHED;
400 break; 410 break;
401 case TTM_PL_VRAM: 411 case TTM_PL_VRAM:
412 if (dev_priv->card_type >= NV_50) {
413 man->func = &nouveau_vram_manager;
414 man->io_reserve_fastpath = false;
415 man->use_io_reserve_lru = true;
416 } else {
417 man->func = &ttm_bo_manager_func;
418 }
402 man->flags = TTM_MEMTYPE_FLAG_FIXED | 419 man->flags = TTM_MEMTYPE_FLAG_FIXED |
403 TTM_MEMTYPE_FLAG_MAPPABLE; 420 TTM_MEMTYPE_FLAG_MAPPABLE;
404 man->available_caching = TTM_PL_FLAG_UNCACHED | 421 man->available_caching = TTM_PL_FLAG_UNCACHED |
405 TTM_PL_FLAG_WC; 422 TTM_PL_FLAG_WC;
406 man->default_caching = TTM_PL_FLAG_WC; 423 man->default_caching = TTM_PL_FLAG_WC;
407 man->gpu_offset = dev_priv->vm_vram_base;
408 break; 424 break;
409 case TTM_PL_TT: 425 case TTM_PL_TT:
426 if (dev_priv->card_type >= NV_50)
427 man->func = &nouveau_gart_manager;
428 else
429 man->func = &ttm_bo_manager_func;
410 switch (dev_priv->gart_info.type) { 430 switch (dev_priv->gart_info.type) {
411 case NOUVEAU_GART_AGP: 431 case NOUVEAU_GART_AGP:
412 man->flags = TTM_MEMTYPE_FLAG_MAPPABLE; 432 man->flags = TTM_MEMTYPE_FLAG_MAPPABLE;
413 man->available_caching = TTM_PL_FLAG_UNCACHED; 433 man->available_caching = TTM_PL_FLAG_UNCACHED |
414 man->default_caching = TTM_PL_FLAG_UNCACHED; 434 TTM_PL_FLAG_WC;
435 man->default_caching = TTM_PL_FLAG_WC;
415 break; 436 break;
416 case NOUVEAU_GART_SGDMA: 437 case NOUVEAU_GART_PDMA:
438 case NOUVEAU_GART_HW:
417 man->flags = TTM_MEMTYPE_FLAG_MAPPABLE | 439 man->flags = TTM_MEMTYPE_FLAG_MAPPABLE |
418 TTM_MEMTYPE_FLAG_CMA; 440 TTM_MEMTYPE_FLAG_CMA;
419 man->available_caching = TTM_PL_MASK_CACHING; 441 man->available_caching = TTM_PL_MASK_CACHING;
420 man->default_caching = TTM_PL_FLAG_CACHED; 442 man->default_caching = TTM_PL_FLAG_CACHED;
443 man->gpu_offset = dev_priv->gart_info.aper_base;
421 break; 444 break;
422 default: 445 default:
423 NV_ERROR(dev, "Unknown GART type: %d\n", 446 NV_ERROR(dev, "Unknown GART type: %d\n",
424 dev_priv->gart_info.type); 447 dev_priv->gart_info.type);
425 return -EINVAL; 448 return -EINVAL;
426 } 449 }
427 man->gpu_offset = dev_priv->vm_gart_base;
428 break; 450 break;
429 default: 451 default:
430 NV_ERROR(dev, "Unsupported memory type %u\n", (unsigned)type); 452 NV_ERROR(dev, "Unsupported memory type %u\n", (unsigned)type);
@@ -469,111 +491,270 @@ nouveau_bo_move_accel_cleanup(struct nouveau_channel *chan,
469 if (ret) 491 if (ret)
470 return ret; 492 return ret;
471 493
472 ret = ttm_bo_move_accel_cleanup(&nvbo->bo, fence, NULL, 494 ret = ttm_bo_move_accel_cleanup(&nvbo->bo, fence, NULL, evict,
473 evict || (nvbo->channel &&
474 nvbo->channel != chan),
475 no_wait_reserve, no_wait_gpu, new_mem); 495 no_wait_reserve, no_wait_gpu, new_mem);
476 nouveau_fence_unref((void *)&fence); 496 nouveau_fence_unref(&fence);
477 return ret; 497 return ret;
478} 498}
479 499
480static inline uint32_t 500static int
481nouveau_bo_mem_ctxdma(struct nouveau_bo *nvbo, struct nouveau_channel *chan, 501nvc0_bo_move_m2mf(struct nouveau_channel *chan, struct ttm_buffer_object *bo,
482 struct ttm_mem_reg *mem) 502 struct ttm_mem_reg *old_mem, struct ttm_mem_reg *new_mem)
483{ 503{
484 if (chan == nouveau_bdev(nvbo->bo.bdev)->channel) { 504 struct nouveau_mem *old_node = old_mem->mm_node;
485 if (mem->mem_type == TTM_PL_TT) 505 struct nouveau_mem *new_node = new_mem->mm_node;
486 return NvDmaGART; 506 struct nouveau_bo *nvbo = nouveau_bo(bo);
487 return NvDmaVRAM; 507 u32 page_count = new_mem->num_pages;
508 u64 src_offset, dst_offset;
509 int ret;
510
511 src_offset = old_node->tmp_vma.offset;
512 if (new_node->tmp_vma.node)
513 dst_offset = new_node->tmp_vma.offset;
514 else
515 dst_offset = nvbo->vma.offset;
516
517 page_count = new_mem->num_pages;
518 while (page_count) {
519 int line_count = (page_count > 2047) ? 2047 : page_count;
520
521 ret = RING_SPACE(chan, 12);
522 if (ret)
523 return ret;
524
525 BEGIN_NVC0(chan, 2, NvSubM2MF, 0x0238, 2);
526 OUT_RING (chan, upper_32_bits(dst_offset));
527 OUT_RING (chan, lower_32_bits(dst_offset));
528 BEGIN_NVC0(chan, 2, NvSubM2MF, 0x030c, 6);
529 OUT_RING (chan, upper_32_bits(src_offset));
530 OUT_RING (chan, lower_32_bits(src_offset));
531 OUT_RING (chan, PAGE_SIZE); /* src_pitch */
532 OUT_RING (chan, PAGE_SIZE); /* dst_pitch */
533 OUT_RING (chan, PAGE_SIZE); /* line_length */
534 OUT_RING (chan, line_count);
535 BEGIN_NVC0(chan, 2, NvSubM2MF, 0x0300, 1);
536 OUT_RING (chan, 0x00100110);
537
538 page_count -= line_count;
539 src_offset += (PAGE_SIZE * line_count);
540 dst_offset += (PAGE_SIZE * line_count);
488 } 541 }
489 542
490 if (mem->mem_type == TTM_PL_TT) 543 return 0;
491 return chan->gart_handle;
492 return chan->vram_handle;
493} 544}
494 545
495static int 546static int
496nouveau_bo_move_m2mf(struct ttm_buffer_object *bo, int evict, bool intr, 547nv50_bo_move_m2mf(struct nouveau_channel *chan, struct ttm_buffer_object *bo,
497 bool no_wait_reserve, bool no_wait_gpu, 548 struct ttm_mem_reg *old_mem, struct ttm_mem_reg *new_mem)
498 struct ttm_mem_reg *new_mem)
499{ 549{
550 struct nouveau_mem *old_node = old_mem->mm_node;
551 struct nouveau_mem *new_node = new_mem->mm_node;
500 struct nouveau_bo *nvbo = nouveau_bo(bo); 552 struct nouveau_bo *nvbo = nouveau_bo(bo);
501 struct drm_nouveau_private *dev_priv = nouveau_bdev(bo->bdev); 553 u64 length = (new_mem->num_pages << PAGE_SHIFT);
502 struct ttm_mem_reg *old_mem = &bo->mem; 554 u64 src_offset, dst_offset;
503 struct nouveau_channel *chan;
504 uint64_t src_offset, dst_offset;
505 uint32_t page_count;
506 int ret; 555 int ret;
507 556
508 chan = nvbo->channel; 557 src_offset = old_node->tmp_vma.offset;
509 if (!chan || nvbo->tile_flags || nvbo->no_vm) 558 if (new_node->tmp_vma.node)
510 chan = dev_priv->channel; 559 dst_offset = new_node->tmp_vma.offset;
560 else
561 dst_offset = nvbo->vma.offset;
511 562
512 src_offset = old_mem->mm_node->start << PAGE_SHIFT; 563 while (length) {
513 dst_offset = new_mem->mm_node->start << PAGE_SHIFT; 564 u32 amount, stride, height;
514 if (chan != dev_priv->channel) {
515 if (old_mem->mem_type == TTM_PL_TT)
516 src_offset += dev_priv->vm_gart_base;
517 else
518 src_offset += dev_priv->vm_vram_base;
519 565
520 if (new_mem->mem_type == TTM_PL_TT) 566 amount = min(length, (u64)(4 * 1024 * 1024));
521 dst_offset += dev_priv->vm_gart_base; 567 stride = 16 * 4;
522 else 568 height = amount / stride;
523 dst_offset += dev_priv->vm_vram_base; 569
570 if (new_mem->mem_type == TTM_PL_VRAM &&
571 nouveau_bo_tile_layout(nvbo)) {
572 ret = RING_SPACE(chan, 8);
573 if (ret)
574 return ret;
575
576 BEGIN_RING(chan, NvSubM2MF, 0x0200, 7);
577 OUT_RING (chan, 0);
578 OUT_RING (chan, 0);
579 OUT_RING (chan, stride);
580 OUT_RING (chan, height);
581 OUT_RING (chan, 1);
582 OUT_RING (chan, 0);
583 OUT_RING (chan, 0);
584 } else {
585 ret = RING_SPACE(chan, 2);
586 if (ret)
587 return ret;
588
589 BEGIN_RING(chan, NvSubM2MF, 0x0200, 1);
590 OUT_RING (chan, 1);
591 }
592 if (old_mem->mem_type == TTM_PL_VRAM &&
593 nouveau_bo_tile_layout(nvbo)) {
594 ret = RING_SPACE(chan, 8);
595 if (ret)
596 return ret;
597
598 BEGIN_RING(chan, NvSubM2MF, 0x021c, 7);
599 OUT_RING (chan, 0);
600 OUT_RING (chan, 0);
601 OUT_RING (chan, stride);
602 OUT_RING (chan, height);
603 OUT_RING (chan, 1);
604 OUT_RING (chan, 0);
605 OUT_RING (chan, 0);
606 } else {
607 ret = RING_SPACE(chan, 2);
608 if (ret)
609 return ret;
610
611 BEGIN_RING(chan, NvSubM2MF, 0x021c, 1);
612 OUT_RING (chan, 1);
613 }
614
615 ret = RING_SPACE(chan, 14);
616 if (ret)
617 return ret;
618
619 BEGIN_RING(chan, NvSubM2MF, 0x0238, 2);
620 OUT_RING (chan, upper_32_bits(src_offset));
621 OUT_RING (chan, upper_32_bits(dst_offset));
622 BEGIN_RING(chan, NvSubM2MF, 0x030c, 8);
623 OUT_RING (chan, lower_32_bits(src_offset));
624 OUT_RING (chan, lower_32_bits(dst_offset));
625 OUT_RING (chan, stride);
626 OUT_RING (chan, stride);
627 OUT_RING (chan, stride);
628 OUT_RING (chan, height);
629 OUT_RING (chan, 0x00000101);
630 OUT_RING (chan, 0x00000000);
631 BEGIN_RING(chan, NvSubM2MF, NV_MEMORY_TO_MEMORY_FORMAT_NOP, 1);
632 OUT_RING (chan, 0);
633
634 length -= amount;
635 src_offset += amount;
636 dst_offset += amount;
524 } 637 }
525 638
639 return 0;
640}
641
642static inline uint32_t
643nouveau_bo_mem_ctxdma(struct ttm_buffer_object *bo,
644 struct nouveau_channel *chan, struct ttm_mem_reg *mem)
645{
646 if (mem->mem_type == TTM_PL_TT)
647 return chan->gart_handle;
648 return chan->vram_handle;
649}
650
651static int
652nv04_bo_move_m2mf(struct nouveau_channel *chan, struct ttm_buffer_object *bo,
653 struct ttm_mem_reg *old_mem, struct ttm_mem_reg *new_mem)
654{
655 u32 src_offset = old_mem->start << PAGE_SHIFT;
656 u32 dst_offset = new_mem->start << PAGE_SHIFT;
657 u32 page_count = new_mem->num_pages;
658 int ret;
659
526 ret = RING_SPACE(chan, 3); 660 ret = RING_SPACE(chan, 3);
527 if (ret) 661 if (ret)
528 return ret; 662 return ret;
529 BEGIN_RING(chan, NvSubM2MF, NV_MEMORY_TO_MEMORY_FORMAT_DMA_SOURCE, 2);
530 OUT_RING(chan, nouveau_bo_mem_ctxdma(nvbo, chan, old_mem));
531 OUT_RING(chan, nouveau_bo_mem_ctxdma(nvbo, chan, new_mem));
532 663
533 if (dev_priv->card_type >= NV_50) { 664 BEGIN_RING(chan, NvSubM2MF, NV_MEMORY_TO_MEMORY_FORMAT_DMA_SOURCE, 2);
534 ret = RING_SPACE(chan, 4); 665 OUT_RING (chan, nouveau_bo_mem_ctxdma(bo, chan, old_mem));
535 if (ret) 666 OUT_RING (chan, nouveau_bo_mem_ctxdma(bo, chan, new_mem));
536 return ret;
537 BEGIN_RING(chan, NvSubM2MF, 0x0200, 1);
538 OUT_RING(chan, 1);
539 BEGIN_RING(chan, NvSubM2MF, 0x021c, 1);
540 OUT_RING(chan, 1);
541 }
542 667
543 page_count = new_mem->num_pages; 668 page_count = new_mem->num_pages;
544 while (page_count) { 669 while (page_count) {
545 int line_count = (page_count > 2047) ? 2047 : page_count; 670 int line_count = (page_count > 2047) ? 2047 : page_count;
546 671
547 if (dev_priv->card_type >= NV_50) {
548 ret = RING_SPACE(chan, 3);
549 if (ret)
550 return ret;
551 BEGIN_RING(chan, NvSubM2MF, 0x0238, 2);
552 OUT_RING(chan, upper_32_bits(src_offset));
553 OUT_RING(chan, upper_32_bits(dst_offset));
554 }
555 ret = RING_SPACE(chan, 11); 672 ret = RING_SPACE(chan, 11);
556 if (ret) 673 if (ret)
557 return ret; 674 return ret;
675
558 BEGIN_RING(chan, NvSubM2MF, 676 BEGIN_RING(chan, NvSubM2MF,
559 NV_MEMORY_TO_MEMORY_FORMAT_OFFSET_IN, 8); 677 NV_MEMORY_TO_MEMORY_FORMAT_OFFSET_IN, 8);
560 OUT_RING(chan, lower_32_bits(src_offset)); 678 OUT_RING (chan, src_offset);
561 OUT_RING(chan, lower_32_bits(dst_offset)); 679 OUT_RING (chan, dst_offset);
562 OUT_RING(chan, PAGE_SIZE); /* src_pitch */ 680 OUT_RING (chan, PAGE_SIZE); /* src_pitch */
563 OUT_RING(chan, PAGE_SIZE); /* dst_pitch */ 681 OUT_RING (chan, PAGE_SIZE); /* dst_pitch */
564 OUT_RING(chan, PAGE_SIZE); /* line_length */ 682 OUT_RING (chan, PAGE_SIZE); /* line_length */
565 OUT_RING(chan, line_count); 683 OUT_RING (chan, line_count);
566 OUT_RING(chan, (1<<8)|(1<<0)); 684 OUT_RING (chan, 0x00000101);
567 OUT_RING(chan, 0); 685 OUT_RING (chan, 0x00000000);
568 BEGIN_RING(chan, NvSubM2MF, NV_MEMORY_TO_MEMORY_FORMAT_NOP, 1); 686 BEGIN_RING(chan, NvSubM2MF, NV_MEMORY_TO_MEMORY_FORMAT_NOP, 1);
569 OUT_RING(chan, 0); 687 OUT_RING (chan, 0);
570 688
571 page_count -= line_count; 689 page_count -= line_count;
572 src_offset += (PAGE_SIZE * line_count); 690 src_offset += (PAGE_SIZE * line_count);
573 dst_offset += (PAGE_SIZE * line_count); 691 dst_offset += (PAGE_SIZE * line_count);
574 } 692 }
575 693
576 return nouveau_bo_move_accel_cleanup(chan, nvbo, evict, no_wait_reserve, no_wait_gpu, new_mem); 694 return 0;
695}
696
697static int
698nouveau_bo_move_m2mf(struct ttm_buffer_object *bo, int evict, bool intr,
699 bool no_wait_reserve, bool no_wait_gpu,
700 struct ttm_mem_reg *new_mem)
701{
702 struct drm_nouveau_private *dev_priv = nouveau_bdev(bo->bdev);
703 struct nouveau_bo *nvbo = nouveau_bo(bo);
704 struct ttm_mem_reg *old_mem = &bo->mem;
705 struct nouveau_channel *chan;
706 int ret;
707
708 chan = nvbo->channel;
709 if (!chan) {
710 chan = dev_priv->channel;
711 mutex_lock_nested(&chan->mutex, NOUVEAU_KCHANNEL_MUTEX);
712 }
713
714 /* create temporary vma for old memory, this will get cleaned
715 * up after ttm destroys the ttm_mem_reg
716 */
717 if (dev_priv->card_type >= NV_50) {
718 struct nouveau_mem *node = old_mem->mm_node;
719 if (!node->tmp_vma.node) {
720 u32 page_shift = nvbo->vma.node->type;
721 if (old_mem->mem_type == TTM_PL_TT)
722 page_shift = nvbo->vma.vm->spg_shift;
723
724 ret = nouveau_vm_get(chan->vm,
725 old_mem->num_pages << PAGE_SHIFT,
726 page_shift, NV_MEM_ACCESS_RO,
727 &node->tmp_vma);
728 if (ret)
729 goto out;
730 }
731
732 if (old_mem->mem_type == TTM_PL_VRAM)
733 nouveau_vm_map(&node->tmp_vma, node);
734 else {
735 nouveau_vm_map_sg(&node->tmp_vma, 0,
736 old_mem->num_pages << PAGE_SHIFT,
737 node, node->pages);
738 }
739 }
740
741 if (dev_priv->card_type < NV_50)
742 ret = nv04_bo_move_m2mf(chan, bo, &bo->mem, new_mem);
743 else
744 if (dev_priv->card_type < NV_C0)
745 ret = nv50_bo_move_m2mf(chan, bo, &bo->mem, new_mem);
746 else
747 ret = nvc0_bo_move_m2mf(chan, bo, &bo->mem, new_mem);
748 if (ret == 0) {
749 ret = nouveau_bo_move_accel_cleanup(chan, nvbo, evict,
750 no_wait_reserve,
751 no_wait_gpu, new_mem);
752 }
753
754out:
755 if (chan == dev_priv->channel)
756 mutex_unlock(&chan->mutex);
757 return ret;
577} 758}
578 759
579static int 760static int
@@ -581,6 +762,7 @@ nouveau_bo_move_flipd(struct ttm_buffer_object *bo, bool evict, bool intr,
581 bool no_wait_reserve, bool no_wait_gpu, 762 bool no_wait_reserve, bool no_wait_gpu,
582 struct ttm_mem_reg *new_mem) 763 struct ttm_mem_reg *new_mem)
583{ 764{
765 struct drm_nouveau_private *dev_priv = nouveau_bdev(bo->bdev);
584 u32 placement_memtype = TTM_PL_FLAG_TT | TTM_PL_MASK_CACHING; 766 u32 placement_memtype = TTM_PL_FLAG_TT | TTM_PL_MASK_CACHING;
585 struct ttm_placement placement; 767 struct ttm_placement placement;
586 struct ttm_mem_reg tmp_mem; 768 struct ttm_mem_reg tmp_mem;
@@ -600,18 +782,29 @@ nouveau_bo_move_flipd(struct ttm_buffer_object *bo, bool evict, bool intr,
600 if (ret) 782 if (ret)
601 goto out; 783 goto out;
602 784
785 if (dev_priv->card_type >= NV_50) {
786 struct nouveau_bo *nvbo = nouveau_bo(bo);
787 struct nouveau_mem *node = tmp_mem.mm_node;
788 struct nouveau_vma *vma = &nvbo->vma;
789 if (vma->node->type != vma->vm->spg_shift)
790 vma = &node->tmp_vma;
791 nouveau_vm_map_sg(vma, 0, tmp_mem.num_pages << PAGE_SHIFT,
792 node, node->pages);
793 }
794
603 ret = nouveau_bo_move_m2mf(bo, true, intr, no_wait_reserve, no_wait_gpu, &tmp_mem); 795 ret = nouveau_bo_move_m2mf(bo, true, intr, no_wait_reserve, no_wait_gpu, &tmp_mem);
796
797 if (dev_priv->card_type >= NV_50) {
798 struct nouveau_bo *nvbo = nouveau_bo(bo);
799 nouveau_vm_unmap(&nvbo->vma);
800 }
801
604 if (ret) 802 if (ret)
605 goto out; 803 goto out;
606 804
607 ret = ttm_bo_move_ttm(bo, evict, no_wait_reserve, no_wait_gpu, new_mem); 805 ret = ttm_bo_move_ttm(bo, true, no_wait_reserve, no_wait_gpu, new_mem);
608out: 806out:
609 if (tmp_mem.mm_node) { 807 ttm_bo_mem_put(bo, &tmp_mem);
610 spin_lock(&bo->bdev->glob->lru_lock);
611 drm_mm_put_block(tmp_mem.mm_node);
612 spin_unlock(&bo->bdev->glob->lru_lock);
613 }
614
615 return ret; 808 return ret;
616} 809}
617 810
@@ -635,24 +828,49 @@ nouveau_bo_move_flips(struct ttm_buffer_object *bo, bool evict, bool intr,
635 if (ret) 828 if (ret)
636 return ret; 829 return ret;
637 830
638 ret = ttm_bo_move_ttm(bo, evict, no_wait_reserve, no_wait_gpu, &tmp_mem); 831 ret = ttm_bo_move_ttm(bo, true, no_wait_reserve, no_wait_gpu, &tmp_mem);
639 if (ret) 832 if (ret)
640 goto out; 833 goto out;
641 834
642 ret = nouveau_bo_move_m2mf(bo, evict, intr, no_wait_reserve, no_wait_gpu, new_mem); 835 ret = nouveau_bo_move_m2mf(bo, true, intr, no_wait_reserve, no_wait_gpu, new_mem);
643 if (ret) 836 if (ret)
644 goto out; 837 goto out;
645 838
646out: 839out:
647 if (tmp_mem.mm_node) { 840 ttm_bo_mem_put(bo, &tmp_mem);
648 spin_lock(&bo->bdev->glob->lru_lock);
649 drm_mm_put_block(tmp_mem.mm_node);
650 spin_unlock(&bo->bdev->glob->lru_lock);
651 }
652
653 return ret; 841 return ret;
654} 842}
655 843
844static void
845nouveau_bo_move_ntfy(struct ttm_buffer_object *bo, struct ttm_mem_reg *new_mem)
846{
847 struct drm_nouveau_private *dev_priv = nouveau_bdev(bo->bdev);
848 struct nouveau_mem *node = new_mem->mm_node;
849 struct nouveau_bo *nvbo = nouveau_bo(bo);
850 struct nouveau_vma *vma = &nvbo->vma;
851 struct nouveau_vm *vm = vma->vm;
852
853 if (dev_priv->card_type < NV_50)
854 return;
855
856 switch (new_mem->mem_type) {
857 case TTM_PL_VRAM:
858 nouveau_vm_map(vma, node);
859 break;
860 case TTM_PL_TT:
861 if (vma->node->type != vm->spg_shift) {
862 nouveau_vm_unmap(vma);
863 vma = &node->tmp_vma;
864 }
865 nouveau_vm_map_sg(vma, 0, new_mem->num_pages << PAGE_SHIFT,
866 node, node->pages);
867 break;
868 default:
869 nouveau_vm_unmap(&nvbo->vma);
870 break;
871 }
872}
873
656static int 874static int
657nouveau_bo_vm_bind(struct ttm_buffer_object *bo, struct ttm_mem_reg *new_mem, 875nouveau_bo_vm_bind(struct ttm_buffer_object *bo, struct ttm_mem_reg *new_mem,
658 struct nouveau_tile_reg **new_tile) 876 struct nouveau_tile_reg **new_tile)
@@ -660,28 +878,16 @@ nouveau_bo_vm_bind(struct ttm_buffer_object *bo, struct ttm_mem_reg *new_mem,
660 struct drm_nouveau_private *dev_priv = nouveau_bdev(bo->bdev); 878 struct drm_nouveau_private *dev_priv = nouveau_bdev(bo->bdev);
661 struct drm_device *dev = dev_priv->dev; 879 struct drm_device *dev = dev_priv->dev;
662 struct nouveau_bo *nvbo = nouveau_bo(bo); 880 struct nouveau_bo *nvbo = nouveau_bo(bo);
663 uint64_t offset; 881 u64 offset = new_mem->start << PAGE_SHIFT;
664 int ret;
665 882
666 if (nvbo->no_vm || new_mem->mem_type != TTM_PL_VRAM) { 883 *new_tile = NULL;
667 /* Nothing to do. */ 884 if (new_mem->mem_type != TTM_PL_VRAM)
668 *new_tile = NULL;
669 return 0; 885 return 0;
670 }
671
672 offset = new_mem->mm_node->start << PAGE_SHIFT;
673
674 if (dev_priv->card_type == NV_50) {
675 ret = nv50_mem_vm_bind_linear(dev,
676 offset + dev_priv->vm_vram_base,
677 new_mem->size, nvbo->tile_flags,
678 offset);
679 if (ret)
680 return ret;
681 886
682 } else if (dev_priv->card_type >= NV_10) { 887 if (dev_priv->card_type >= NV_10) {
683 *new_tile = nv10_mem_set_tiling(dev, offset, new_mem->size, 888 *new_tile = nv10_mem_set_tiling(dev, offset, new_mem->size,
684 nvbo->tile_mode); 889 nvbo->tile_mode,
890 nvbo->tile_flags);
685 } 891 }
686 892
687 return 0; 893 return 0;
@@ -695,13 +901,8 @@ nouveau_bo_vm_cleanup(struct ttm_buffer_object *bo,
695 struct drm_nouveau_private *dev_priv = nouveau_bdev(bo->bdev); 901 struct drm_nouveau_private *dev_priv = nouveau_bdev(bo->bdev);
696 struct drm_device *dev = dev_priv->dev; 902 struct drm_device *dev = dev_priv->dev;
697 903
698 if (dev_priv->card_type >= NV_10 && 904 nv10_mem_put_tile_region(dev, *old_tile, bo->sync_obj);
699 dev_priv->card_type < NV_50) { 905 *old_tile = new_tile;
700 if (*old_tile)
701 nv10_mem_expire_tiling(dev, *old_tile, bo->sync_obj);
702
703 *old_tile = new_tile;
704 }
705} 906}
706 907
707static int 908static int
@@ -715,14 +916,10 @@ nouveau_bo_move(struct ttm_buffer_object *bo, bool evict, bool intr,
715 struct nouveau_tile_reg *new_tile = NULL; 916 struct nouveau_tile_reg *new_tile = NULL;
716 int ret = 0; 917 int ret = 0;
717 918
718 ret = nouveau_bo_vm_bind(bo, new_mem, &new_tile); 919 if (dev_priv->card_type < NV_50) {
719 if (ret) 920 ret = nouveau_bo_vm_bind(bo, new_mem, &new_tile);
720 return ret; 921 if (ret)
721 922 return ret;
722 /* Software copy if the card isn't up and running yet. */
723 if (!dev_priv->channel) {
724 ret = ttm_bo_move_memcpy(bo, evict, no_wait_reserve, no_wait_gpu, new_mem);
725 goto out;
726 } 923 }
727 924
728 /* Fake bo copy. */ 925 /* Fake bo copy. */
@@ -733,6 +930,12 @@ nouveau_bo_move(struct ttm_buffer_object *bo, bool evict, bool intr,
733 goto out; 930 goto out;
734 } 931 }
735 932
933 /* Software copy if the card isn't up and running yet. */
934 if (!dev_priv->channel) {
935 ret = ttm_bo_move_memcpy(bo, evict, no_wait_reserve, no_wait_gpu, new_mem);
936 goto out;
937 }
938
736 /* Hardware assisted copy. */ 939 /* Hardware assisted copy. */
737 if (new_mem->mem_type == TTM_PL_SYSTEM) 940 if (new_mem->mem_type == TTM_PL_SYSTEM)
738 ret = nouveau_bo_move_flipd(bo, evict, intr, no_wait_reserve, no_wait_gpu, new_mem); 941 ret = nouveau_bo_move_flipd(bo, evict, intr, no_wait_reserve, no_wait_gpu, new_mem);
@@ -748,10 +951,12 @@ nouveau_bo_move(struct ttm_buffer_object *bo, bool evict, bool intr,
748 ret = ttm_bo_move_memcpy(bo, evict, no_wait_reserve, no_wait_gpu, new_mem); 951 ret = ttm_bo_move_memcpy(bo, evict, no_wait_reserve, no_wait_gpu, new_mem);
749 952
750out: 953out:
751 if (ret) 954 if (dev_priv->card_type < NV_50) {
752 nouveau_bo_vm_cleanup(bo, NULL, &new_tile); 955 if (ret)
753 else 956 nouveau_bo_vm_cleanup(bo, NULL, &new_tile);
754 nouveau_bo_vm_cleanup(bo, new_tile, &nvbo->tile); 957 else
958 nouveau_bo_vm_cleanup(bo, new_tile, &nvbo->tile);
959 }
755 960
756 return ret; 961 return ret;
757} 962}
@@ -768,6 +973,7 @@ nouveau_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_mem_reg *mem)
768 struct ttm_mem_type_manager *man = &bdev->man[mem->mem_type]; 973 struct ttm_mem_type_manager *man = &bdev->man[mem->mem_type];
769 struct drm_nouveau_private *dev_priv = nouveau_bdev(bdev); 974 struct drm_nouveau_private *dev_priv = nouveau_bdev(bdev);
770 struct drm_device *dev = dev_priv->dev; 975 struct drm_device *dev = dev_priv->dev;
976 int ret;
771 977
772 mem->bus.addr = NULL; 978 mem->bus.addr = NULL;
773 mem->bus.offset = 0; 979 mem->bus.offset = 0;
@@ -783,16 +989,47 @@ nouveau_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_mem_reg *mem)
783 case TTM_PL_TT: 989 case TTM_PL_TT:
784#if __OS_HAS_AGP 990#if __OS_HAS_AGP
785 if (dev_priv->gart_info.type == NOUVEAU_GART_AGP) { 991 if (dev_priv->gart_info.type == NOUVEAU_GART_AGP) {
786 mem->bus.offset = mem->mm_node->start << PAGE_SHIFT; 992 mem->bus.offset = mem->start << PAGE_SHIFT;
787 mem->bus.base = dev_priv->gart_info.aper_base; 993 mem->bus.base = dev_priv->gart_info.aper_base;
788 mem->bus.is_iomem = true; 994 mem->bus.is_iomem = true;
789 } 995 }
790#endif 996#endif
791 break; 997 break;
792 case TTM_PL_VRAM: 998 case TTM_PL_VRAM:
793 mem->bus.offset = mem->mm_node->start << PAGE_SHIFT; 999 {
1000 struct nouveau_mem *node = mem->mm_node;
1001 u8 page_shift;
1002
1003 if (!dev_priv->bar1_vm) {
1004 mem->bus.offset = mem->start << PAGE_SHIFT;
1005 mem->bus.base = pci_resource_start(dev->pdev, 1);
1006 mem->bus.is_iomem = true;
1007 break;
1008 }
1009
1010 if (dev_priv->card_type == NV_C0)
1011 page_shift = node->page_shift;
1012 else
1013 page_shift = 12;
1014
1015 ret = nouveau_vm_get(dev_priv->bar1_vm, mem->bus.size,
1016 page_shift, NV_MEM_ACCESS_RW,
1017 &node->bar_vma);
1018 if (ret)
1019 return ret;
1020
1021 nouveau_vm_map(&node->bar_vma, node);
1022 if (ret) {
1023 nouveau_vm_put(&node->bar_vma);
1024 return ret;
1025 }
1026
1027 mem->bus.offset = node->bar_vma.offset;
1028 if (dev_priv->card_type == NV_50) /*XXX*/
1029 mem->bus.offset -= 0x0020000000ULL;
794 mem->bus.base = pci_resource_start(dev->pdev, 1); 1030 mem->bus.base = pci_resource_start(dev->pdev, 1);
795 mem->bus.is_iomem = true; 1031 mem->bus.is_iomem = true;
1032 }
796 break; 1033 break;
797 default: 1034 default:
798 return -EINVAL; 1035 return -EINVAL;
@@ -803,12 +1040,59 @@ nouveau_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_mem_reg *mem)
803static void 1040static void
804nouveau_ttm_io_mem_free(struct ttm_bo_device *bdev, struct ttm_mem_reg *mem) 1041nouveau_ttm_io_mem_free(struct ttm_bo_device *bdev, struct ttm_mem_reg *mem)
805{ 1042{
1043 struct drm_nouveau_private *dev_priv = nouveau_bdev(bdev);
1044 struct nouveau_mem *node = mem->mm_node;
1045
1046 if (!dev_priv->bar1_vm || mem->mem_type != TTM_PL_VRAM)
1047 return;
1048
1049 if (!node->bar_vma.node)
1050 return;
1051
1052 nouveau_vm_unmap(&node->bar_vma);
1053 nouveau_vm_put(&node->bar_vma);
806} 1054}
807 1055
808static int 1056static int
809nouveau_ttm_fault_reserve_notify(struct ttm_buffer_object *bo) 1057nouveau_ttm_fault_reserve_notify(struct ttm_buffer_object *bo)
810{ 1058{
811 return 0; 1059 struct drm_nouveau_private *dev_priv = nouveau_bdev(bo->bdev);
1060 struct nouveau_bo *nvbo = nouveau_bo(bo);
1061
1062 /* as long as the bo isn't in vram, and isn't tiled, we've got
1063 * nothing to do here.
1064 */
1065 if (bo->mem.mem_type != TTM_PL_VRAM) {
1066 if (dev_priv->card_type < NV_50 ||
1067 !nouveau_bo_tile_layout(nvbo))
1068 return 0;
1069 }
1070
1071 /* make sure bo is in mappable vram */
1072 if (bo->mem.start + bo->mem.num_pages < dev_priv->fb_mappable_pages)
1073 return 0;
1074
1075
1076 nvbo->placement.fpfn = 0;
1077 nvbo->placement.lpfn = dev_priv->fb_mappable_pages;
1078 nouveau_bo_placement_set(nvbo, TTM_PL_VRAM, 0);
1079 return nouveau_bo_validate(nvbo, false, true, false);
1080}
1081
1082void
1083nouveau_bo_fence(struct nouveau_bo *nvbo, struct nouveau_fence *fence)
1084{
1085 struct nouveau_fence *old_fence;
1086
1087 if (likely(fence))
1088 nouveau_fence_ref(fence);
1089
1090 spin_lock(&nvbo->bo.bdev->fence_lock);
1091 old_fence = nvbo->bo.sync_obj;
1092 nvbo->bo.sync_obj = fence;
1093 spin_unlock(&nvbo->bo.bdev->fence_lock);
1094
1095 nouveau_fence_unref(&old_fence);
812} 1096}
813 1097
814struct ttm_bo_driver nouveau_bo_driver = { 1098struct ttm_bo_driver nouveau_bo_driver = {
@@ -816,13 +1100,14 @@ struct ttm_bo_driver nouveau_bo_driver = {
816 .invalidate_caches = nouveau_bo_invalidate_caches, 1100 .invalidate_caches = nouveau_bo_invalidate_caches,
817 .init_mem_type = nouveau_bo_init_mem_type, 1101 .init_mem_type = nouveau_bo_init_mem_type,
818 .evict_flags = nouveau_bo_evict_flags, 1102 .evict_flags = nouveau_bo_evict_flags,
1103 .move_notify = nouveau_bo_move_ntfy,
819 .move = nouveau_bo_move, 1104 .move = nouveau_bo_move,
820 .verify_access = nouveau_bo_verify_access, 1105 .verify_access = nouveau_bo_verify_access,
821 .sync_obj_signaled = nouveau_fence_signalled, 1106 .sync_obj_signaled = __nouveau_fence_signalled,
822 .sync_obj_wait = nouveau_fence_wait, 1107 .sync_obj_wait = __nouveau_fence_wait,
823 .sync_obj_flush = nouveau_fence_flush, 1108 .sync_obj_flush = __nouveau_fence_flush,
824 .sync_obj_unref = nouveau_fence_unref, 1109 .sync_obj_unref = __nouveau_fence_unref,
825 .sync_obj_ref = nouveau_fence_ref, 1110 .sync_obj_ref = __nouveau_fence_ref,
826 .fault_reserve_notify = &nouveau_ttm_fault_reserve_notify, 1111 .fault_reserve_notify = &nouveau_ttm_fault_reserve_notify,
827 .io_mem_reserve = &nouveau_ttm_io_mem_reserve, 1112 .io_mem_reserve = &nouveau_ttm_io_mem_reserve,
828 .io_mem_free = &nouveau_ttm_io_mem_free, 1113 .io_mem_free = &nouveau_ttm_io_mem_free,
diff --git a/drivers/gpu/drm/nouveau/nouveau_calc.c b/drivers/gpu/drm/nouveau/nouveau_calc.c
index ca85da784846..dad96cce5e39 100644
--- a/drivers/gpu/drm/nouveau/nouveau_calc.c
+++ b/drivers/gpu/drm/nouveau/nouveau_calc.c
@@ -198,8 +198,8 @@ nv04_update_arb(struct drm_device *dev, int VClk, int bpp,
198 struct drm_nouveau_private *dev_priv = dev->dev_private; 198 struct drm_nouveau_private *dev_priv = dev->dev_private;
199 struct nv_fifo_info fifo_data; 199 struct nv_fifo_info fifo_data;
200 struct nv_sim_state sim_data; 200 struct nv_sim_state sim_data;
201 int MClk = nouveau_hw_get_clock(dev, MPLL); 201 int MClk = nouveau_hw_get_clock(dev, PLL_MEMORY);
202 int NVClk = nouveau_hw_get_clock(dev, NVPLL); 202 int NVClk = nouveau_hw_get_clock(dev, PLL_CORE);
203 uint32_t cfg1 = nvReadFB(dev, NV04_PFB_CFG1); 203 uint32_t cfg1 = nvReadFB(dev, NV04_PFB_CFG1);
204 204
205 sim_data.pclk_khz = VClk; 205 sim_data.pclk_khz = VClk;
@@ -234,7 +234,7 @@ nv04_update_arb(struct drm_device *dev, int VClk, int bpp,
234} 234}
235 235
236static void 236static void
237nv30_update_arb(int *burst, int *lwm) 237nv20_update_arb(int *burst, int *lwm)
238{ 238{
239 unsigned int fifo_size, burst_size, graphics_lwm; 239 unsigned int fifo_size, burst_size, graphics_lwm;
240 240
@@ -251,14 +251,14 @@ nouveau_calc_arb(struct drm_device *dev, int vclk, int bpp, int *burst, int *lwm
251{ 251{
252 struct drm_nouveau_private *dev_priv = dev->dev_private; 252 struct drm_nouveau_private *dev_priv = dev->dev_private;
253 253
254 if (dev_priv->card_type < NV_30) 254 if (dev_priv->card_type < NV_20)
255 nv04_update_arb(dev, vclk, bpp, burst, lwm); 255 nv04_update_arb(dev, vclk, bpp, burst, lwm);
256 else if ((dev->pci_device & 0xfff0) == 0x0240 /*CHIPSET_C51*/ || 256 else if ((dev->pci_device & 0xfff0) == 0x0240 /*CHIPSET_C51*/ ||
257 (dev->pci_device & 0xfff0) == 0x03d0 /*CHIPSET_C512*/) { 257 (dev->pci_device & 0xfff0) == 0x03d0 /*CHIPSET_C512*/) {
258 *burst = 128; 258 *burst = 128;
259 *lwm = 0x0480; 259 *lwm = 0x0480;
260 } else 260 } else
261 nv30_update_arb(burst, lwm); 261 nv20_update_arb(burst, lwm);
262} 262}
263 263
264static int 264static int
diff --git a/drivers/gpu/drm/nouveau/nouveau_channel.c b/drivers/gpu/drm/nouveau/nouveau_channel.c
index 0480f064f2c1..a7583a8ddb01 100644
--- a/drivers/gpu/drm/nouveau/nouveau_channel.c
+++ b/drivers/gpu/drm/nouveau/nouveau_channel.c
@@ -35,50 +35,48 @@ nouveau_channel_pushbuf_ctxdma_init(struct nouveau_channel *chan)
35 struct drm_nouveau_private *dev_priv = dev->dev_private; 35 struct drm_nouveau_private *dev_priv = dev->dev_private;
36 struct nouveau_bo *pb = chan->pushbuf_bo; 36 struct nouveau_bo *pb = chan->pushbuf_bo;
37 struct nouveau_gpuobj *pushbuf = NULL; 37 struct nouveau_gpuobj *pushbuf = NULL;
38 int ret; 38 int ret = 0;
39 39
40 if (dev_priv->card_type >= NV_50) { 40 if (dev_priv->card_type >= NV_50) {
41 ret = nouveau_gpuobj_dma_new(chan, NV_CLASS_DMA_IN_MEMORY, 0, 41 if (dev_priv->card_type < NV_C0) {
42 dev_priv->vm_end, NV_DMA_ACCESS_RO, 42 ret = nouveau_gpuobj_dma_new(chan,
43 NV_DMA_TARGET_AGP, &pushbuf); 43 NV_CLASS_DMA_IN_MEMORY, 0,
44 (1ULL << 40),
45 NV_MEM_ACCESS_RO,
46 NV_MEM_TARGET_VM,
47 &pushbuf);
48 }
44 chan->pushbuf_base = pb->bo.offset; 49 chan->pushbuf_base = pb->bo.offset;
45 } else 50 } else
46 if (pb->bo.mem.mem_type == TTM_PL_TT) { 51 if (pb->bo.mem.mem_type == TTM_PL_TT) {
47 ret = nouveau_gpuobj_gart_dma_new(chan, 0, 52 ret = nouveau_gpuobj_dma_new(chan, NV_CLASS_DMA_IN_MEMORY, 0,
48 dev_priv->gart_info.aper_size, 53 dev_priv->gart_info.aper_size,
49 NV_DMA_ACCESS_RO, &pushbuf, 54 NV_MEM_ACCESS_RO,
50 NULL); 55 NV_MEM_TARGET_GART, &pushbuf);
51 chan->pushbuf_base = pb->bo.mem.mm_node->start << PAGE_SHIFT; 56 chan->pushbuf_base = pb->bo.mem.start << PAGE_SHIFT;
52 } else 57 } else
53 if (dev_priv->card_type != NV_04) { 58 if (dev_priv->card_type != NV_04) {
54 ret = nouveau_gpuobj_dma_new(chan, NV_CLASS_DMA_IN_MEMORY, 0, 59 ret = nouveau_gpuobj_dma_new(chan, NV_CLASS_DMA_IN_MEMORY, 0,
55 dev_priv->fb_available_size, 60 dev_priv->fb_available_size,
56 NV_DMA_ACCESS_RO, 61 NV_MEM_ACCESS_RO,
57 NV_DMA_TARGET_VIDMEM, &pushbuf); 62 NV_MEM_TARGET_VRAM, &pushbuf);
58 chan->pushbuf_base = pb->bo.mem.mm_node->start << PAGE_SHIFT; 63 chan->pushbuf_base = pb->bo.mem.start << PAGE_SHIFT;
59 } else { 64 } else {
60 /* NV04 cmdbuf hack, from original ddx.. not sure of it's 65 /* NV04 cmdbuf hack, from original ddx.. not sure of it's
61 * exact reason for existing :) PCI access to cmdbuf in 66 * exact reason for existing :) PCI access to cmdbuf in
62 * VRAM. 67 * VRAM.
63 */ 68 */
64 ret = nouveau_gpuobj_dma_new(chan, NV_CLASS_DMA_IN_MEMORY, 69 ret = nouveau_gpuobj_dma_new(chan, NV_CLASS_DMA_IN_MEMORY,
65 pci_resource_start(dev->pdev, 70 pci_resource_start(dev->pdev, 1),
66 1),
67 dev_priv->fb_available_size, 71 dev_priv->fb_available_size,
68 NV_DMA_ACCESS_RO, 72 NV_MEM_ACCESS_RO,
69 NV_DMA_TARGET_PCI, &pushbuf); 73 NV_MEM_TARGET_PCI, &pushbuf);
70 chan->pushbuf_base = pb->bo.mem.mm_node->start << PAGE_SHIFT; 74 chan->pushbuf_base = pb->bo.mem.start << PAGE_SHIFT;
71 }
72
73 ret = nouveau_gpuobj_ref_add(dev, chan, 0, pushbuf, &chan->pushbuf);
74 if (ret) {
75 NV_ERROR(dev, "Error referencing pushbuf ctxdma: %d\n", ret);
76 if (pushbuf != dev_priv->gart_info.sg_ctxdma)
77 nouveau_gpuobj_del(dev, &pushbuf);
78 return ret;
79 } 75 }
80 76
81 return 0; 77 nouveau_gpuobj_ref(pushbuf, &chan->pushbuf);
78 nouveau_gpuobj_ref(NULL, &pushbuf);
79 return ret;
82} 80}
83 81
84static struct nouveau_bo * 82static struct nouveau_bo *
@@ -92,8 +90,7 @@ nouveau_channel_user_pushbuf_alloc(struct drm_device *dev)
92 else 90 else
93 location = TTM_PL_FLAG_TT; 91 location = TTM_PL_FLAG_TT;
94 92
95 ret = nouveau_bo_new(dev, NULL, 65536, 0, location, 0, 0x0000, false, 93 ret = nouveau_bo_new(dev, NULL, 65536, 0, location, 0, 0x0000, &pushbuf);
96 true, &pushbuf);
97 if (ret) { 94 if (ret) {
98 NV_ERROR(dev, "error allocating DMA push buffer: %d\n", ret); 95 NV_ERROR(dev, "error allocating DMA push buffer: %d\n", ret);
99 return NULL; 96 return NULL;
@@ -106,6 +103,13 @@ nouveau_channel_user_pushbuf_alloc(struct drm_device *dev)
106 return NULL; 103 return NULL;
107 } 104 }
108 105
106 ret = nouveau_bo_map(pushbuf);
107 if (ret) {
108 nouveau_bo_unpin(pushbuf);
109 nouveau_bo_ref(NULL, &pushbuf);
110 return NULL;
111 }
112
109 return pushbuf; 113 return pushbuf;
110} 114}
111 115
@@ -113,74 +117,59 @@ nouveau_channel_user_pushbuf_alloc(struct drm_device *dev)
113int 117int
114nouveau_channel_alloc(struct drm_device *dev, struct nouveau_channel **chan_ret, 118nouveau_channel_alloc(struct drm_device *dev, struct nouveau_channel **chan_ret,
115 struct drm_file *file_priv, 119 struct drm_file *file_priv,
116 uint32_t vram_handle, uint32_t tt_handle) 120 uint32_t vram_handle, uint32_t gart_handle)
117{ 121{
118 struct drm_nouveau_private *dev_priv = dev->dev_private; 122 struct drm_nouveau_private *dev_priv = dev->dev_private;
119 struct nouveau_pgraph_engine *pgraph = &dev_priv->engine.graph;
120 struct nouveau_fifo_engine *pfifo = &dev_priv->engine.fifo; 123 struct nouveau_fifo_engine *pfifo = &dev_priv->engine.fifo;
121 struct nouveau_channel *chan; 124 struct nouveau_channel *chan;
122 int channel, user; 125 unsigned long flags;
123 int ret; 126 int ret;
124 127
125 /* 128 /* allocate and lock channel structure */
126 * Alright, here is the full story 129 chan = kzalloc(sizeof(*chan), GFP_KERNEL);
127 * Nvidia cards have multiple hw fifo contexts (praise them for that, 130 if (!chan)
128 * no complicated crash-prone context switches) 131 return -ENOMEM;
129 * We allocate a new context for each app and let it write to it 132 chan->dev = dev;
130 * directly (woo, full userspace command submission !) 133 chan->file_priv = file_priv;
131 * When there are no more contexts, you lost 134 chan->vram_handle = vram_handle;
132 */ 135 chan->gart_handle = gart_handle;
133 for (channel = 0; channel < pfifo->channels; channel++) { 136
134 if (dev_priv->fifos[channel] == NULL) 137 kref_init(&chan->ref);
138 atomic_set(&chan->users, 1);
139 mutex_init(&chan->mutex);
140 mutex_lock(&chan->mutex);
141
142 /* allocate hw channel id */
143 spin_lock_irqsave(&dev_priv->channels.lock, flags);
144 for (chan->id = 0; chan->id < pfifo->channels; chan->id++) {
145 if (!dev_priv->channels.ptr[chan->id]) {
146 nouveau_channel_ref(chan, &dev_priv->channels.ptr[chan->id]);
135 break; 147 break;
148 }
136 } 149 }
150 spin_unlock_irqrestore(&dev_priv->channels.lock, flags);
137 151
138 /* no more fifos. you lost. */ 152 if (chan->id == pfifo->channels) {
139 if (channel == pfifo->channels) 153 mutex_unlock(&chan->mutex);
140 return -EINVAL; 154 kfree(chan);
155 return -ENODEV;
156 }
141 157
142 dev_priv->fifos[channel] = kzalloc(sizeof(struct nouveau_channel), 158 NV_DEBUG(dev, "initialising channel %d\n", chan->id);
143 GFP_KERNEL);
144 if (!dev_priv->fifos[channel])
145 return -ENOMEM;
146 chan = dev_priv->fifos[channel];
147 INIT_LIST_HEAD(&chan->nvsw.vbl_wait); 159 INIT_LIST_HEAD(&chan->nvsw.vbl_wait);
160 INIT_LIST_HEAD(&chan->nvsw.flip);
148 INIT_LIST_HEAD(&chan->fence.pending); 161 INIT_LIST_HEAD(&chan->fence.pending);
149 chan->dev = dev;
150 chan->id = channel;
151 chan->file_priv = file_priv;
152 chan->vram_handle = vram_handle;
153 chan->gart_handle = tt_handle;
154
155 NV_INFO(dev, "Allocating FIFO number %d\n", channel);
156 162
157 /* Allocate DMA push buffer */ 163 /* Allocate DMA push buffer */
158 chan->pushbuf_bo = nouveau_channel_user_pushbuf_alloc(dev); 164 chan->pushbuf_bo = nouveau_channel_user_pushbuf_alloc(dev);
159 if (!chan->pushbuf_bo) { 165 if (!chan->pushbuf_bo) {
160 ret = -ENOMEM; 166 ret = -ENOMEM;
161 NV_ERROR(dev, "pushbuf %d\n", ret); 167 NV_ERROR(dev, "pushbuf %d\n", ret);
162 nouveau_channel_free(chan); 168 nouveau_channel_put(&chan);
163 return ret; 169 return ret;
164 } 170 }
165 171
166 nouveau_dma_pre_init(chan); 172 nouveau_dma_pre_init(chan);
167
168 /* Locate channel's user control regs */
169 if (dev_priv->card_type < NV_40)
170 user = NV03_USER(channel);
171 else
172 if (dev_priv->card_type < NV_50)
173 user = NV40_USER(channel);
174 else
175 user = NV50_USER(channel);
176
177 chan->user = ioremap(pci_resource_start(dev->pdev, 0) + user,
178 PAGE_SIZE);
179 if (!chan->user) {
180 NV_ERROR(dev, "ioremap of regs failed.\n");
181 nouveau_channel_free(chan);
182 return -ENOMEM;
183 }
184 chan->user_put = 0x40; 173 chan->user_put = 0x40;
185 chan->user_get = 0x44; 174 chan->user_get = 0x44;
186 175
@@ -188,15 +177,15 @@ nouveau_channel_alloc(struct drm_device *dev, struct nouveau_channel **chan_ret,
188 ret = nouveau_notifier_init_channel(chan); 177 ret = nouveau_notifier_init_channel(chan);
189 if (ret) { 178 if (ret) {
190 NV_ERROR(dev, "ntfy %d\n", ret); 179 NV_ERROR(dev, "ntfy %d\n", ret);
191 nouveau_channel_free(chan); 180 nouveau_channel_put(&chan);
192 return ret; 181 return ret;
193 } 182 }
194 183
195 /* Setup channel's default objects */ 184 /* Setup channel's default objects */
196 ret = nouveau_gpuobj_channel_init(chan, vram_handle, tt_handle); 185 ret = nouveau_gpuobj_channel_init(chan, vram_handle, gart_handle);
197 if (ret) { 186 if (ret) {
198 NV_ERROR(dev, "gpuobj %d\n", ret); 187 NV_ERROR(dev, "gpuobj %d\n", ret);
199 nouveau_channel_free(chan); 188 nouveau_channel_put(&chan);
200 return ret; 189 return ret;
201 } 190 }
202 191
@@ -204,24 +193,17 @@ nouveau_channel_alloc(struct drm_device *dev, struct nouveau_channel **chan_ret,
204 ret = nouveau_channel_pushbuf_ctxdma_init(chan); 193 ret = nouveau_channel_pushbuf_ctxdma_init(chan);
205 if (ret) { 194 if (ret) {
206 NV_ERROR(dev, "pbctxdma %d\n", ret); 195 NV_ERROR(dev, "pbctxdma %d\n", ret);
207 nouveau_channel_free(chan); 196 nouveau_channel_put(&chan);
208 return ret; 197 return ret;
209 } 198 }
210 199
211 /* disable the fifo caches */ 200 /* disable the fifo caches */
212 pfifo->reassign(dev, false); 201 pfifo->reassign(dev, false);
213 202
214 /* Create a graphics context for new channel */ 203 /* Construct initial RAMFC for new channel */
215 ret = pgraph->create_context(chan);
216 if (ret) {
217 nouveau_channel_free(chan);
218 return ret;
219 }
220
221 /* Construct inital RAMFC for new channel */
222 ret = pfifo->create_context(chan); 204 ret = pfifo->create_context(chan);
223 if (ret) { 205 if (ret) {
224 nouveau_channel_free(chan); 206 nouveau_channel_put(&chan);
225 return ret; 207 return ret;
226 } 208 }
227 209
@@ -229,130 +211,187 @@ nouveau_channel_alloc(struct drm_device *dev, struct nouveau_channel **chan_ret,
229 211
230 ret = nouveau_dma_init(chan); 212 ret = nouveau_dma_init(chan);
231 if (!ret) 213 if (!ret)
232 ret = nouveau_fence_init(chan); 214 ret = nouveau_fence_channel_init(chan);
233 if (ret) { 215 if (ret) {
234 nouveau_channel_free(chan); 216 nouveau_channel_put(&chan);
235 return ret; 217 return ret;
236 } 218 }
237 219
238 nouveau_debugfs_channel_init(chan); 220 nouveau_debugfs_channel_init(chan);
239 221
240 NV_INFO(dev, "%s: initialised FIFO %d\n", __func__, channel); 222 NV_DEBUG(dev, "channel %d initialised\n", chan->id);
241 *chan_ret = chan; 223 *chan_ret = chan;
242 return 0; 224 return 0;
243} 225}
244 226
245/* stops a fifo */ 227struct nouveau_channel *
228nouveau_channel_get_unlocked(struct nouveau_channel *ref)
229{
230 struct nouveau_channel *chan = NULL;
231
232 if (likely(ref && atomic_inc_not_zero(&ref->users)))
233 nouveau_channel_ref(ref, &chan);
234
235 return chan;
236}
237
238struct nouveau_channel *
239nouveau_channel_get(struct drm_device *dev, struct drm_file *file_priv, int id)
240{
241 struct drm_nouveau_private *dev_priv = dev->dev_private;
242 struct nouveau_channel *chan;
243 unsigned long flags;
244
245 if (unlikely(id < 0 || id >= NOUVEAU_MAX_CHANNEL_NR))
246 return ERR_PTR(-EINVAL);
247
248 spin_lock_irqsave(&dev_priv->channels.lock, flags);
249 chan = nouveau_channel_get_unlocked(dev_priv->channels.ptr[id]);
250 spin_unlock_irqrestore(&dev_priv->channels.lock, flags);
251
252 if (unlikely(!chan))
253 return ERR_PTR(-EINVAL);
254
255 if (unlikely(file_priv && chan->file_priv != file_priv)) {
256 nouveau_channel_put_unlocked(&chan);
257 return ERR_PTR(-EINVAL);
258 }
259
260 mutex_lock(&chan->mutex);
261 return chan;
262}
263
246void 264void
247nouveau_channel_free(struct nouveau_channel *chan) 265nouveau_channel_put_unlocked(struct nouveau_channel **pchan)
248{ 266{
267 struct nouveau_channel *chan = *pchan;
249 struct drm_device *dev = chan->dev; 268 struct drm_device *dev = chan->dev;
250 struct drm_nouveau_private *dev_priv = dev->dev_private; 269 struct drm_nouveau_private *dev_priv = dev->dev_private;
251 struct nouveau_pgraph_engine *pgraph = &dev_priv->engine.graph;
252 struct nouveau_fifo_engine *pfifo = &dev_priv->engine.fifo; 270 struct nouveau_fifo_engine *pfifo = &dev_priv->engine.fifo;
253 unsigned long flags; 271 unsigned long flags;
254 int ret; 272 int i;
255 273
256 NV_INFO(dev, "%s: freeing fifo %d\n", __func__, chan->id); 274 /* decrement the refcount, and we're done if there's still refs */
275 if (likely(!atomic_dec_and_test(&chan->users))) {
276 nouveau_channel_ref(NULL, pchan);
277 return;
278 }
257 279
280 /* no one wants the channel anymore */
281 NV_DEBUG(dev, "freeing channel %d\n", chan->id);
258 nouveau_debugfs_channel_fini(chan); 282 nouveau_debugfs_channel_fini(chan);
259 283
260 /* Give outstanding push buffers a chance to complete */ 284 /* give it chance to idle */
261 nouveau_fence_update(chan); 285 nouveau_channel_idle(chan);
262 if (chan->fence.sequence != chan->fence.sequence_ack) {
263 struct nouveau_fence *fence = NULL;
264
265 ret = nouveau_fence_new(chan, &fence, true);
266 if (ret == 0) {
267 ret = nouveau_fence_wait(fence, NULL, false, false);
268 nouveau_fence_unref((void *)&fence);
269 }
270
271 if (ret)
272 NV_ERROR(dev, "Failed to idle channel %d.\n", chan->id);
273 }
274 286
275 /* Ensure all outstanding fences are signaled. They should be if the 287 /* ensure all outstanding fences are signaled. they should be if the
276 * above attempts at idling were OK, but if we failed this'll tell TTM 288 * above attempts at idling were OK, but if we failed this'll tell TTM
277 * we're done with the buffers. 289 * we're done with the buffers.
278 */ 290 */
279 nouveau_fence_fini(chan); 291 nouveau_fence_channel_fini(chan);
280 292
281 /* This will prevent pfifo from switching channels. */ 293 /* boot it off the hardware */
282 pfifo->reassign(dev, false); 294 pfifo->reassign(dev, false);
283 295
284 /* We want to give pgraph a chance to idle and get rid of all potential 296 /* destroy the engine specific contexts */
285 * errors. We need to do this before the lock, otherwise the irq handler
286 * is unable to process them.
287 */
288 if (pgraph->channel(dev) == chan)
289 nouveau_wait_for_idle(dev);
290
291 spin_lock_irqsave(&dev_priv->context_switch_lock, flags);
292
293 pgraph->fifo_access(dev, false);
294 if (pgraph->channel(dev) == chan)
295 pgraph->unload_context(dev);
296 pgraph->destroy_context(chan);
297 pgraph->fifo_access(dev, true);
298
299 if (pfifo->channel_id(dev) == chan->id) {
300 pfifo->disable(dev);
301 pfifo->unload_context(dev);
302 pfifo->enable(dev);
303 }
304 pfifo->destroy_context(chan); 297 pfifo->destroy_context(chan);
298 for (i = 0; i < NVOBJ_ENGINE_NR; i++) {
299 if (chan->engctx[i])
300 dev_priv->eng[i]->context_del(chan, i);
301 }
305 302
306 pfifo->reassign(dev, true); 303 pfifo->reassign(dev, true);
307 304
308 spin_unlock_irqrestore(&dev_priv->context_switch_lock, flags); 305 /* aside from its resources, the channel should now be dead,
306 * remove it from the channel list
307 */
308 spin_lock_irqsave(&dev_priv->channels.lock, flags);
309 nouveau_channel_ref(NULL, &dev_priv->channels.ptr[chan->id]);
310 spin_unlock_irqrestore(&dev_priv->channels.lock, flags);
309 311
310 /* Release the channel's resources */ 312 /* destroy any resources the channel owned */
311 nouveau_gpuobj_ref_del(dev, &chan->pushbuf); 313 nouveau_gpuobj_ref(NULL, &chan->pushbuf);
312 if (chan->pushbuf_bo) { 314 if (chan->pushbuf_bo) {
315 nouveau_bo_unmap(chan->pushbuf_bo);
313 nouveau_bo_unpin(chan->pushbuf_bo); 316 nouveau_bo_unpin(chan->pushbuf_bo);
314 nouveau_bo_ref(NULL, &chan->pushbuf_bo); 317 nouveau_bo_ref(NULL, &chan->pushbuf_bo);
315 } 318 }
316 nouveau_gpuobj_channel_takedown(chan); 319 nouveau_gpuobj_channel_takedown(chan);
317 nouveau_notifier_takedown_channel(chan); 320 nouveau_notifier_takedown_channel(chan);
318 if (chan->user)
319 iounmap(chan->user);
320 321
321 dev_priv->fifos[chan->id] = NULL; 322 nouveau_channel_ref(NULL, pchan);
323}
324
325void
326nouveau_channel_put(struct nouveau_channel **pchan)
327{
328 mutex_unlock(&(*pchan)->mutex);
329 nouveau_channel_put_unlocked(pchan);
330}
331
332static void
333nouveau_channel_del(struct kref *ref)
334{
335 struct nouveau_channel *chan =
336 container_of(ref, struct nouveau_channel, ref);
337
322 kfree(chan); 338 kfree(chan);
323} 339}
324 340
341void
342nouveau_channel_ref(struct nouveau_channel *chan,
343 struct nouveau_channel **pchan)
344{
345 if (chan)
346 kref_get(&chan->ref);
347
348 if (*pchan)
349 kref_put(&(*pchan)->ref, nouveau_channel_del);
350
351 *pchan = chan;
352}
353
354void
355nouveau_channel_idle(struct nouveau_channel *chan)
356{
357 struct drm_device *dev = chan->dev;
358 struct nouveau_fence *fence = NULL;
359 int ret;
360
361 nouveau_fence_update(chan);
362
363 if (chan->fence.sequence != chan->fence.sequence_ack) {
364 ret = nouveau_fence_new(chan, &fence, true);
365 if (!ret) {
366 ret = nouveau_fence_wait(fence, false, false);
367 nouveau_fence_unref(&fence);
368 }
369
370 if (ret)
371 NV_ERROR(dev, "Failed to idle channel %d.\n", chan->id);
372 }
373}
374
325/* cleans up all the fifos from file_priv */ 375/* cleans up all the fifos from file_priv */
326void 376void
327nouveau_channel_cleanup(struct drm_device *dev, struct drm_file *file_priv) 377nouveau_channel_cleanup(struct drm_device *dev, struct drm_file *file_priv)
328{ 378{
329 struct drm_nouveau_private *dev_priv = dev->dev_private; 379 struct drm_nouveau_private *dev_priv = dev->dev_private;
330 struct nouveau_engine *engine = &dev_priv->engine; 380 struct nouveau_engine *engine = &dev_priv->engine;
381 struct nouveau_channel *chan;
331 int i; 382 int i;
332 383
333 NV_DEBUG(dev, "clearing FIFO enables from file_priv\n"); 384 NV_DEBUG(dev, "clearing FIFO enables from file_priv\n");
334 for (i = 0; i < engine->fifo.channels; i++) { 385 for (i = 0; i < engine->fifo.channels; i++) {
335 struct nouveau_channel *chan = dev_priv->fifos[i]; 386 chan = nouveau_channel_get(dev, file_priv, i);
387 if (IS_ERR(chan))
388 continue;
336 389
337 if (chan && chan->file_priv == file_priv) 390 atomic_dec(&chan->users);
338 nouveau_channel_free(chan); 391 nouveau_channel_put(&chan);
339 } 392 }
340} 393}
341 394
342int
343nouveau_channel_owner(struct drm_device *dev, struct drm_file *file_priv,
344 int channel)
345{
346 struct drm_nouveau_private *dev_priv = dev->dev_private;
347 struct nouveau_engine *engine = &dev_priv->engine;
348
349 if (channel >= engine->fifo.channels)
350 return 0;
351 if (dev_priv->fifos[channel] == NULL)
352 return 0;
353
354 return (dev_priv->fifos[channel]->file_priv == file_priv);
355}
356 395
357/*********************************** 396/***********************************
358 * ioctls wrapping the functions 397 * ioctls wrapping the functions
@@ -367,7 +406,7 @@ nouveau_ioctl_fifo_alloc(struct drm_device *dev, void *data,
367 struct nouveau_channel *chan; 406 struct nouveau_channel *chan;
368 int ret; 407 int ret;
369 408
370 if (dev_priv->engine.graph.accel_blocked) 409 if (!dev_priv->eng[NVOBJ_ENGINE_GR])
371 return -ENODEV; 410 return -ENODEV;
372 411
373 if (init->fb_ctxdma_handle == ~0 || init->tt_ctxdma_handle == ~0) 412 if (init->fb_ctxdma_handle == ~0 || init->tt_ctxdma_handle == ~0)
@@ -388,36 +427,44 @@ nouveau_ioctl_fifo_alloc(struct drm_device *dev, void *data,
388 else 427 else
389 init->pushbuf_domains = NOUVEAU_GEM_DOMAIN_GART; 428 init->pushbuf_domains = NOUVEAU_GEM_DOMAIN_GART;
390 429
391 init->subchan[0].handle = NvM2MF; 430 if (dev_priv->card_type < NV_C0) {
392 if (dev_priv->card_type < NV_50) 431 init->subchan[0].handle = NvM2MF;
393 init->subchan[0].grclass = 0x0039; 432 if (dev_priv->card_type < NV_50)
394 else 433 init->subchan[0].grclass = 0x0039;
395 init->subchan[0].grclass = 0x5039; 434 else
396 init->subchan[1].handle = NvSw; 435 init->subchan[0].grclass = 0x5039;
397 init->subchan[1].grclass = NV_SW; 436 init->subchan[1].handle = NvSw;
398 init->nr_subchan = 2; 437 init->subchan[1].grclass = NV_SW;
438 init->nr_subchan = 2;
439 } else {
440 init->subchan[0].handle = 0x9039;
441 init->subchan[0].grclass = 0x9039;
442 init->nr_subchan = 1;
443 }
399 444
400 /* Named memory object area */ 445 /* Named memory object area */
401 ret = drm_gem_handle_create(file_priv, chan->notifier_bo->gem, 446 ret = drm_gem_handle_create(file_priv, chan->notifier_bo->gem,
402 &init->notifier_handle); 447 &init->notifier_handle);
403 if (ret) {
404 nouveau_channel_free(chan);
405 return ret;
406 }
407 448
408 return 0; 449 if (ret == 0)
450 atomic_inc(&chan->users); /* userspace reference */
451 nouveau_channel_put(&chan);
452 return ret;
409} 453}
410 454
411static int 455static int
412nouveau_ioctl_fifo_free(struct drm_device *dev, void *data, 456nouveau_ioctl_fifo_free(struct drm_device *dev, void *data,
413 struct drm_file *file_priv) 457 struct drm_file *file_priv)
414{ 458{
415 struct drm_nouveau_channel_free *cfree = data; 459 struct drm_nouveau_channel_free *req = data;
416 struct nouveau_channel *chan; 460 struct nouveau_channel *chan;
417 461
418 NOUVEAU_GET_USER_CHANNEL_WITH_RETURN(cfree->channel, file_priv, chan); 462 chan = nouveau_channel_get(dev, file_priv, req->channel);
463 if (IS_ERR(chan))
464 return PTR_ERR(chan);
419 465
420 nouveau_channel_free(chan); 466 atomic_dec(&chan->users);
467 nouveau_channel_put(&chan);
421 return 0; 468 return 0;
422} 469}
423 470
@@ -426,18 +473,18 @@ nouveau_ioctl_fifo_free(struct drm_device *dev, void *data,
426 ***********************************/ 473 ***********************************/
427 474
428struct drm_ioctl_desc nouveau_ioctls[] = { 475struct drm_ioctl_desc nouveau_ioctls[] = {
429 DRM_IOCTL_DEF_DRV(NOUVEAU_GETPARAM, nouveau_ioctl_getparam, DRM_AUTH), 476 DRM_IOCTL_DEF_DRV(NOUVEAU_GETPARAM, nouveau_ioctl_getparam, DRM_UNLOCKED|DRM_AUTH),
430 DRM_IOCTL_DEF_DRV(NOUVEAU_SETPARAM, nouveau_ioctl_setparam, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), 477 DRM_IOCTL_DEF_DRV(NOUVEAU_SETPARAM, nouveau_ioctl_setparam, DRM_UNLOCKED|DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
431 DRM_IOCTL_DEF_DRV(NOUVEAU_CHANNEL_ALLOC, nouveau_ioctl_fifo_alloc, DRM_AUTH), 478 DRM_IOCTL_DEF_DRV(NOUVEAU_CHANNEL_ALLOC, nouveau_ioctl_fifo_alloc, DRM_UNLOCKED|DRM_AUTH),
432 DRM_IOCTL_DEF_DRV(NOUVEAU_CHANNEL_FREE, nouveau_ioctl_fifo_free, DRM_AUTH), 479 DRM_IOCTL_DEF_DRV(NOUVEAU_CHANNEL_FREE, nouveau_ioctl_fifo_free, DRM_UNLOCKED|DRM_AUTH),
433 DRM_IOCTL_DEF_DRV(NOUVEAU_GROBJ_ALLOC, nouveau_ioctl_grobj_alloc, DRM_AUTH), 480 DRM_IOCTL_DEF_DRV(NOUVEAU_GROBJ_ALLOC, nouveau_ioctl_grobj_alloc, DRM_UNLOCKED|DRM_AUTH),
434 DRM_IOCTL_DEF_DRV(NOUVEAU_NOTIFIEROBJ_ALLOC, nouveau_ioctl_notifier_alloc, DRM_AUTH), 481 DRM_IOCTL_DEF_DRV(NOUVEAU_NOTIFIEROBJ_ALLOC, nouveau_ioctl_notifier_alloc, DRM_UNLOCKED|DRM_AUTH),
435 DRM_IOCTL_DEF_DRV(NOUVEAU_GPUOBJ_FREE, nouveau_ioctl_gpuobj_free, DRM_AUTH), 482 DRM_IOCTL_DEF_DRV(NOUVEAU_GPUOBJ_FREE, nouveau_ioctl_gpuobj_free, DRM_UNLOCKED|DRM_AUTH),
436 DRM_IOCTL_DEF_DRV(NOUVEAU_GEM_NEW, nouveau_gem_ioctl_new, DRM_AUTH), 483 DRM_IOCTL_DEF_DRV(NOUVEAU_GEM_NEW, nouveau_gem_ioctl_new, DRM_UNLOCKED|DRM_AUTH),
437 DRM_IOCTL_DEF_DRV(NOUVEAU_GEM_PUSHBUF, nouveau_gem_ioctl_pushbuf, DRM_AUTH), 484 DRM_IOCTL_DEF_DRV(NOUVEAU_GEM_PUSHBUF, nouveau_gem_ioctl_pushbuf, DRM_UNLOCKED|DRM_AUTH),
438 DRM_IOCTL_DEF_DRV(NOUVEAU_GEM_CPU_PREP, nouveau_gem_ioctl_cpu_prep, DRM_AUTH), 485 DRM_IOCTL_DEF_DRV(NOUVEAU_GEM_CPU_PREP, nouveau_gem_ioctl_cpu_prep, DRM_UNLOCKED|DRM_AUTH),
439 DRM_IOCTL_DEF_DRV(NOUVEAU_GEM_CPU_FINI, nouveau_gem_ioctl_cpu_fini, DRM_AUTH), 486 DRM_IOCTL_DEF_DRV(NOUVEAU_GEM_CPU_FINI, nouveau_gem_ioctl_cpu_fini, DRM_UNLOCKED|DRM_AUTH),
440 DRM_IOCTL_DEF_DRV(NOUVEAU_GEM_INFO, nouveau_gem_ioctl_info, DRM_AUTH), 487 DRM_IOCTL_DEF_DRV(NOUVEAU_GEM_INFO, nouveau_gem_ioctl_info, DRM_UNLOCKED|DRM_AUTH),
441}; 488};
442 489
443int nouveau_max_ioctl = DRM_ARRAY_SIZE(nouveau_ioctls); 490int nouveau_max_ioctl = DRM_ARRAY_SIZE(nouveau_ioctls);
diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.c b/drivers/gpu/drm/nouveau/nouveau_connector.c
index fc737037f751..1595d0b6e815 100644
--- a/drivers/gpu/drm/nouveau/nouveau_connector.c
+++ b/drivers/gpu/drm/nouveau/nouveau_connector.c
@@ -37,6 +37,8 @@
37#include "nouveau_connector.h" 37#include "nouveau_connector.h"
38#include "nouveau_hw.h" 38#include "nouveau_hw.h"
39 39
40static void nouveau_connector_hotplug(void *, int);
41
40static struct nouveau_encoder * 42static struct nouveau_encoder *
41find_encoder_by_type(struct drm_connector *connector, int type) 43find_encoder_by_type(struct drm_connector *connector, int type)
42{ 44{
@@ -76,24 +78,52 @@ nouveau_encoder_connector_get(struct nouveau_encoder *encoder)
76 return NULL; 78 return NULL;
77} 79}
78 80
81/*TODO: This could use improvement, and learn to handle the fixed
82 * BIOS tables etc. It's fine currently, for its only user.
83 */
84int
85nouveau_connector_bpp(struct drm_connector *connector)
86{
87 struct nouveau_connector *nv_connector = nouveau_connector(connector);
88
89 if (nv_connector->edid && nv_connector->edid->revision >= 4) {
90 u8 bpc = ((nv_connector->edid->input & 0x70) >> 3) + 4;
91 if (bpc > 4)
92 return bpc;
93 }
94
95 return 18;
96}
79 97
80static void 98static void
81nouveau_connector_destroy(struct drm_connector *drm_connector) 99nouveau_connector_destroy(struct drm_connector *connector)
82{ 100{
83 struct nouveau_connector *nv_connector = 101 struct nouveau_connector *nv_connector = nouveau_connector(connector);
84 nouveau_connector(drm_connector); 102 struct drm_nouveau_private *dev_priv;
103 struct nouveau_gpio_engine *pgpio;
85 struct drm_device *dev; 104 struct drm_device *dev;
86 105
87 if (!nv_connector) 106 if (!nv_connector)
88 return; 107 return;
89 108
90 dev = nv_connector->base.dev; 109 dev = nv_connector->base.dev;
110 dev_priv = dev->dev_private;
91 NV_DEBUG_KMS(dev, "\n"); 111 NV_DEBUG_KMS(dev, "\n");
92 112
113 pgpio = &dev_priv->engine.gpio;
114 if (pgpio->irq_unregister) {
115 pgpio->irq_unregister(dev, nv_connector->dcb->gpio_tag,
116 nouveau_connector_hotplug, connector);
117 }
118
119 if (connector->connector_type == DRM_MODE_CONNECTOR_LVDS ||
120 connector->connector_type == DRM_MODE_CONNECTOR_eDP)
121 nouveau_backlight_exit(connector);
122
93 kfree(nv_connector->edid); 123 kfree(nv_connector->edid);
94 drm_sysfs_connector_remove(drm_connector); 124 drm_sysfs_connector_remove(connector);
95 drm_connector_cleanup(drm_connector); 125 drm_connector_cleanup(connector);
96 kfree(drm_connector); 126 kfree(connector);
97} 127}
98 128
99static struct nouveau_i2c_chan * 129static struct nouveau_i2c_chan *
@@ -130,6 +160,36 @@ nouveau_connector_ddc_detect(struct drm_connector *connector,
130 return NULL; 160 return NULL;
131} 161}
132 162
163static struct nouveau_encoder *
164nouveau_connector_of_detect(struct drm_connector *connector)
165{
166#ifdef __powerpc__
167 struct drm_device *dev = connector->dev;
168 struct nouveau_connector *nv_connector = nouveau_connector(connector);
169 struct nouveau_encoder *nv_encoder;
170 struct device_node *cn, *dn = pci_device_to_OF_node(dev->pdev);
171
172 if (!dn ||
173 !((nv_encoder = find_encoder_by_type(connector, OUTPUT_TMDS)) ||
174 (nv_encoder = find_encoder_by_type(connector, OUTPUT_ANALOG))))
175 return NULL;
176
177 for_each_child_of_node(dn, cn) {
178 const char *name = of_get_property(cn, "name", NULL);
179 const void *edid = of_get_property(cn, "EDID", NULL);
180 int idx = name ? name[strlen(name) - 1] - 'A' : 0;
181
182 if (nv_encoder->dcb->i2c_index == idx && edid) {
183 nv_connector->edid =
184 kmemdup(edid, EDID_LENGTH, GFP_KERNEL);
185 of_node_put(cn);
186 return nv_encoder;
187 }
188 }
189#endif
190 return NULL;
191}
192
133static void 193static void
134nouveau_connector_set_encoder(struct drm_connector *connector, 194nouveau_connector_set_encoder(struct drm_connector *connector,
135 struct nouveau_encoder *nv_encoder) 195 struct nouveau_encoder *nv_encoder)
@@ -225,11 +285,17 @@ nouveau_connector_detect(struct drm_connector *connector, bool force)
225 return connector_status_connected; 285 return connector_status_connected;
226 } 286 }
227 287
288 nv_encoder = nouveau_connector_of_detect(connector);
289 if (nv_encoder) {
290 nouveau_connector_set_encoder(connector, nv_encoder);
291 return connector_status_connected;
292 }
293
228detect_analog: 294detect_analog:
229 nv_encoder = find_encoder_by_type(connector, OUTPUT_ANALOG); 295 nv_encoder = find_encoder_by_type(connector, OUTPUT_ANALOG);
230 if (!nv_encoder && !nouveau_tv_disable) 296 if (!nv_encoder && !nouveau_tv_disable)
231 nv_encoder = find_encoder_by_type(connector, OUTPUT_TV); 297 nv_encoder = find_encoder_by_type(connector, OUTPUT_TV);
232 if (nv_encoder) { 298 if (nv_encoder && force) {
233 struct drm_encoder *encoder = to_drm_encoder(nv_encoder); 299 struct drm_encoder *encoder = to_drm_encoder(nv_encoder);
234 struct drm_encoder_helper_funcs *helper = 300 struct drm_encoder_helper_funcs *helper =
235 encoder->helper_private; 301 encoder->helper_private;
@@ -376,7 +442,7 @@ nouveau_connector_set_property(struct drm_connector *connector,
376 } 442 }
377 443
378 /* LVDS always needs gpu scaling */ 444 /* LVDS always needs gpu scaling */
379 if (nv_connector->dcb->type == DCB_CONNECTOR_LVDS && 445 if (connector->connector_type == DRM_MODE_CONNECTOR_LVDS &&
380 value == DRM_MODE_SCALE_NONE) 446 value == DRM_MODE_SCALE_NONE)
381 return -EINVAL; 447 return -EINVAL;
382 448
@@ -445,6 +511,7 @@ nouveau_connector_native_mode(struct drm_connector *connector)
445 int high_w = 0, high_h = 0, high_v = 0; 511 int high_w = 0, high_h = 0, high_v = 0;
446 512
447 list_for_each_entry(mode, &nv_connector->base.probed_modes, head) { 513 list_for_each_entry(mode, &nv_connector->base.probed_modes, head) {
514 mode->vrefresh = drm_mode_vrefresh(mode);
448 if (helper->mode_valid(connector, mode) != MODE_OK || 515 if (helper->mode_valid(connector, mode) != MODE_OK ||
449 (mode->flags & DRM_MODE_FLAG_INTERLACE)) 516 (mode->flags & DRM_MODE_FLAG_INTERLACE))
450 continue; 517 continue;
@@ -583,17 +650,35 @@ nouveau_connector_get_modes(struct drm_connector *connector)
583 ret = get_slave_funcs(encoder)->get_modes(encoder, connector); 650 ret = get_slave_funcs(encoder)->get_modes(encoder, connector);
584 651
585 if (nv_connector->dcb->type == DCB_CONNECTOR_LVDS || 652 if (nv_connector->dcb->type == DCB_CONNECTOR_LVDS ||
653 nv_connector->dcb->type == DCB_CONNECTOR_LVDS_SPWG ||
586 nv_connector->dcb->type == DCB_CONNECTOR_eDP) 654 nv_connector->dcb->type == DCB_CONNECTOR_eDP)
587 ret += nouveau_connector_scaler_modes_add(connector); 655 ret += nouveau_connector_scaler_modes_add(connector);
588 656
589 return ret; 657 return ret;
590} 658}
591 659
660static unsigned
661get_tmds_link_bandwidth(struct drm_connector *connector)
662{
663 struct nouveau_connector *nv_connector = nouveau_connector(connector);
664 struct drm_nouveau_private *dev_priv = connector->dev->dev_private;
665 struct dcb_entry *dcb = nv_connector->detected_encoder->dcb;
666
667 if (dcb->location != DCB_LOC_ON_CHIP ||
668 dev_priv->chipset >= 0x46)
669 return 165000;
670 else if (dev_priv->chipset >= 0x40)
671 return 155000;
672 else if (dev_priv->chipset >= 0x18)
673 return 135000;
674 else
675 return 112000;
676}
677
592static int 678static int
593nouveau_connector_mode_valid(struct drm_connector *connector, 679nouveau_connector_mode_valid(struct drm_connector *connector,
594 struct drm_display_mode *mode) 680 struct drm_display_mode *mode)
595{ 681{
596 struct drm_nouveau_private *dev_priv = connector->dev->dev_private;
597 struct nouveau_connector *nv_connector = nouveau_connector(connector); 682 struct nouveau_connector *nv_connector = nouveau_connector(connector);
598 struct nouveau_encoder *nv_encoder = nv_connector->detected_encoder; 683 struct nouveau_encoder *nv_encoder = nv_connector->detected_encoder;
599 struct drm_encoder *encoder = to_drm_encoder(nv_encoder); 684 struct drm_encoder *encoder = to_drm_encoder(nv_encoder);
@@ -611,11 +696,9 @@ nouveau_connector_mode_valid(struct drm_connector *connector,
611 max_clock = 400000; 696 max_clock = 400000;
612 break; 697 break;
613 case OUTPUT_TMDS: 698 case OUTPUT_TMDS:
614 if ((dev_priv->card_type >= NV_50 && !nouveau_duallink) || 699 max_clock = get_tmds_link_bandwidth(connector);
615 !nv_encoder->dcb->duallink_possible) 700 if (nouveau_duallink && nv_encoder->dcb->duallink_possible)
616 max_clock = 165000; 701 max_clock *= 2;
617 else
618 max_clock = 330000;
619 break; 702 break;
620 case OUTPUT_ANALOG: 703 case OUTPUT_ANALOG:
621 max_clock = nv_encoder->dcb->crtconf.maxfreq; 704 max_clock = nv_encoder->dcb->crtconf.maxfreq;
@@ -630,7 +713,7 @@ nouveau_connector_mode_valid(struct drm_connector *connector,
630 else 713 else
631 max_clock = nv_encoder->dp.link_nr * 162000; 714 max_clock = nv_encoder->dp.link_nr * 162000;
632 715
633 clock *= 3; 716 clock = clock * nouveau_connector_bpp(connector) / 8;
634 break; 717 break;
635 default: 718 default:
636 BUG_ON(1); 719 BUG_ON(1);
@@ -657,44 +740,6 @@ nouveau_connector_best_encoder(struct drm_connector *connector)
657 return NULL; 740 return NULL;
658} 741}
659 742
660void
661nouveau_connector_set_polling(struct drm_connector *connector)
662{
663 struct drm_device *dev = connector->dev;
664 struct drm_nouveau_private *dev_priv = dev->dev_private;
665 struct drm_crtc *crtc;
666 bool spare_crtc = false;
667
668 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head)
669 spare_crtc |= !crtc->enabled;
670
671 connector->polled = 0;
672
673 switch (connector->connector_type) {
674 case DRM_MODE_CONNECTOR_VGA:
675 case DRM_MODE_CONNECTOR_TV:
676 if (dev_priv->card_type >= NV_50 ||
677 (nv_gf4_disp_arch(dev) && spare_crtc))
678 connector->polled = DRM_CONNECTOR_POLL_CONNECT;
679 break;
680
681 case DRM_MODE_CONNECTOR_DVII:
682 case DRM_MODE_CONNECTOR_DVID:
683 case DRM_MODE_CONNECTOR_HDMIA:
684 case DRM_MODE_CONNECTOR_DisplayPort:
685 case DRM_MODE_CONNECTOR_eDP:
686 if (dev_priv->card_type >= NV_50)
687 connector->polled = DRM_CONNECTOR_POLL_HPD;
688 else if (connector->connector_type == DRM_MODE_CONNECTOR_DVID ||
689 spare_crtc)
690 connector->polled = DRM_CONNECTOR_POLL_CONNECT;
691 break;
692
693 default:
694 break;
695 }
696}
697
698static const struct drm_connector_helper_funcs 743static const struct drm_connector_helper_funcs
699nouveau_connector_helper_funcs = { 744nouveau_connector_helper_funcs = {
700 .get_modes = nouveau_connector_get_modes, 745 .get_modes = nouveau_connector_get_modes,
@@ -731,6 +776,7 @@ nouveau_connector_create(struct drm_device *dev, int index)
731{ 776{
732 const struct drm_connector_funcs *funcs = &nouveau_connector_funcs; 777 const struct drm_connector_funcs *funcs = &nouveau_connector_funcs;
733 struct drm_nouveau_private *dev_priv = dev->dev_private; 778 struct drm_nouveau_private *dev_priv = dev->dev_private;
779 struct nouveau_gpio_engine *pgpio = &dev_priv->engine.gpio;
734 struct nouveau_connector *nv_connector = NULL; 780 struct nouveau_connector *nv_connector = NULL;
735 struct dcb_connector_table_entry *dcb = NULL; 781 struct dcb_connector_table_entry *dcb = NULL;
736 struct drm_connector *connector; 782 struct drm_connector *connector;
@@ -765,6 +811,7 @@ nouveau_connector_create(struct drm_device *dev, int index)
765 type = DRM_MODE_CONNECTOR_HDMIA; 811 type = DRM_MODE_CONNECTOR_HDMIA;
766 break; 812 break;
767 case DCB_CONNECTOR_LVDS: 813 case DCB_CONNECTOR_LVDS:
814 case DCB_CONNECTOR_LVDS_SPWG:
768 type = DRM_MODE_CONNECTOR_LVDS; 815 type = DRM_MODE_CONNECTOR_LVDS;
769 funcs = &nouveau_connector_funcs_lvds; 816 funcs = &nouveau_connector_funcs_lvds;
770 break; 817 break;
@@ -793,7 +840,7 @@ nouveau_connector_create(struct drm_device *dev, int index)
793 drm_connector_helper_add(connector, &nouveau_connector_helper_funcs); 840 drm_connector_helper_add(connector, &nouveau_connector_helper_funcs);
794 841
795 /* Check if we need dithering enabled */ 842 /* Check if we need dithering enabled */
796 if (dcb->type == DCB_CONNECTOR_LVDS) { 843 if (connector->connector_type == DRM_MODE_CONNECTOR_LVDS) {
797 bool dummy, is_24bit = false; 844 bool dummy, is_24bit = false;
798 845
799 ret = nouveau_bios_parse_lvds_table(dev, 0, &dummy, &is_24bit); 846 ret = nouveau_bios_parse_lvds_table(dev, 0, &dummy, &is_24bit);
@@ -820,6 +867,7 @@ nouveau_connector_create(struct drm_device *dev, int index)
820 dev->mode_config.scaling_mode_property, 867 dev->mode_config.scaling_mode_property,
821 nv_connector->scaling_mode); 868 nv_connector->scaling_mode);
822 } 869 }
870 connector->polled = DRM_CONNECTOR_POLL_CONNECT;
823 /* fall-through */ 871 /* fall-through */
824 case DCB_CONNECTOR_TV_0: 872 case DCB_CONNECTOR_TV_0:
825 case DCB_CONNECTOR_TV_1: 873 case DCB_CONNECTOR_TV_1:
@@ -836,12 +884,27 @@ nouveau_connector_create(struct drm_device *dev, int index)
836 dev->mode_config.dithering_mode_property, 884 dev->mode_config.dithering_mode_property,
837 nv_connector->use_dithering ? 885 nv_connector->use_dithering ?
838 DRM_MODE_DITHERING_ON : DRM_MODE_DITHERING_OFF); 886 DRM_MODE_DITHERING_ON : DRM_MODE_DITHERING_OFF);
887
888 if (connector->connector_type != DRM_MODE_CONNECTOR_LVDS) {
889 if (dev_priv->card_type >= NV_50)
890 connector->polled = DRM_CONNECTOR_POLL_HPD;
891 else
892 connector->polled = DRM_CONNECTOR_POLL_CONNECT;
893 }
839 break; 894 break;
840 } 895 }
841 896
842 nouveau_connector_set_polling(connector); 897 if (pgpio->irq_register) {
898 pgpio->irq_register(dev, nv_connector->dcb->gpio_tag,
899 nouveau_connector_hotplug, connector);
900 }
843 901
844 drm_sysfs_connector_add(connector); 902 drm_sysfs_connector_add(connector);
903
904 if (connector->connector_type == DRM_MODE_CONNECTOR_LVDS ||
905 connector->connector_type == DRM_MODE_CONNECTOR_eDP)
906 nouveau_backlight_init(connector);
907
845 dcb->drm = connector; 908 dcb->drm = connector;
846 return dcb->drm; 909 return dcb->drm;
847 910
@@ -851,3 +914,29 @@ fail:
851 return ERR_PTR(ret); 914 return ERR_PTR(ret);
852 915
853} 916}
917
918static void
919nouveau_connector_hotplug(void *data, int plugged)
920{
921 struct drm_connector *connector = data;
922 struct drm_device *dev = connector->dev;
923
924 NV_INFO(dev, "%splugged %s\n", plugged ? "" : "un",
925 drm_get_connector_name(connector));
926
927 if (connector->encoder && connector->encoder->crtc &&
928 connector->encoder->crtc->enabled) {
929 struct nouveau_encoder *nv_encoder = nouveau_encoder(connector->encoder);
930 struct drm_encoder_helper_funcs *helper =
931 connector->encoder->helper_private;
932
933 if (nv_encoder->dcb->type == OUTPUT_DP) {
934 if (plugged)
935 helper->dpms(connector->encoder, DRM_MODE_DPMS_ON);
936 else
937 helper->dpms(connector->encoder, DRM_MODE_DPMS_OFF);
938 }
939 }
940
941 drm_helper_hpd_irq_event(dev);
942}
diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.h b/drivers/gpu/drm/nouveau/nouveau_connector.h
index 0d2e668ccfe5..711b1e9203af 100644
--- a/drivers/gpu/drm/nouveau/nouveau_connector.h
+++ b/drivers/gpu/drm/nouveau/nouveau_connector.h
@@ -52,7 +52,7 @@ static inline struct nouveau_connector *nouveau_connector(
52struct drm_connector * 52struct drm_connector *
53nouveau_connector_create(struct drm_device *, int index); 53nouveau_connector_create(struct drm_device *, int index);
54 54
55void 55int
56nouveau_connector_set_polling(struct drm_connector *); 56nouveau_connector_bpp(struct drm_connector *);
57 57
58#endif /* __NOUVEAU_CONNECTOR_H__ */ 58#endif /* __NOUVEAU_CONNECTOR_H__ */
diff --git a/drivers/gpu/drm/nouveau/nouveau_debugfs.c b/drivers/gpu/drm/nouveau/nouveau_debugfs.c
index 7933de4aff2e..8e1592368cce 100644
--- a/drivers/gpu/drm/nouveau/nouveau_debugfs.c
+++ b/drivers/gpu/drm/nouveau/nouveau_debugfs.c
@@ -157,7 +157,23 @@ nouveau_debugfs_vbios_image(struct seq_file *m, void *data)
157 return 0; 157 return 0;
158} 158}
159 159
160static int
161nouveau_debugfs_evict_vram(struct seq_file *m, void *data)
162{
163 struct drm_info_node *node = (struct drm_info_node *) m->private;
164 struct drm_nouveau_private *dev_priv = node->minor->dev->dev_private;
165 int ret;
166
167 ret = ttm_bo_evict_mm(&dev_priv->ttm.bdev, TTM_PL_VRAM);
168 if (ret)
169 seq_printf(m, "failed: %d", ret);
170 else
171 seq_printf(m, "succeeded\n");
172 return 0;
173}
174
160static struct drm_info_list nouveau_debugfs_list[] = { 175static struct drm_info_list nouveau_debugfs_list[] = {
176 { "evict_vram", nouveau_debugfs_evict_vram, 0, NULL },
161 { "chipset", nouveau_debugfs_chipset_info, 0, NULL }, 177 { "chipset", nouveau_debugfs_chipset_info, 0, NULL },
162 { "memory", nouveau_debugfs_memory_info, 0, NULL }, 178 { "memory", nouveau_debugfs_memory_info, 0, NULL },
163 { "vbios.rom", nouveau_debugfs_vbios_image, 0, NULL }, 179 { "vbios.rom", nouveau_debugfs_vbios_image, 0, NULL },
diff --git a/drivers/gpu/drm/nouveau/nouveau_display.c b/drivers/gpu/drm/nouveau/nouveau_display.c
index 2e11fd65b4dd..eb514ea29377 100644
--- a/drivers/gpu/drm/nouveau/nouveau_display.c
+++ b/drivers/gpu/drm/nouveau/nouveau_display.c
@@ -29,6 +29,10 @@
29#include "nouveau_drv.h" 29#include "nouveau_drv.h"
30#include "nouveau_fb.h" 30#include "nouveau_fb.h"
31#include "nouveau_fbcon.h" 31#include "nouveau_fbcon.h"
32#include "nouveau_hw.h"
33#include "nouveau_crtc.h"
34#include "nouveau_dma.h"
35#include "nv50_display.h"
32 36
33static void 37static void
34nouveau_user_framebuffer_destroy(struct drm_framebuffer *drm_fb) 38nouveau_user_framebuffer_destroy(struct drm_framebuffer *drm_fb)
@@ -58,18 +62,59 @@ static const struct drm_framebuffer_funcs nouveau_framebuffer_funcs = {
58}; 62};
59 63
60int 64int
61nouveau_framebuffer_init(struct drm_device *dev, struct nouveau_framebuffer *nouveau_fb, 65nouveau_framebuffer_init(struct drm_device *dev,
62 struct drm_mode_fb_cmd *mode_cmd, struct nouveau_bo *nvbo) 66 struct nouveau_framebuffer *nv_fb,
67 struct drm_mode_fb_cmd *mode_cmd,
68 struct nouveau_bo *nvbo)
63{ 69{
70 struct drm_nouveau_private *dev_priv = dev->dev_private;
71 struct drm_framebuffer *fb = &nv_fb->base;
64 int ret; 72 int ret;
65 73
66 ret = drm_framebuffer_init(dev, &nouveau_fb->base, &nouveau_framebuffer_funcs); 74 ret = drm_framebuffer_init(dev, fb, &nouveau_framebuffer_funcs);
67 if (ret) { 75 if (ret) {
68 return ret; 76 return ret;
69 } 77 }
70 78
71 drm_helper_mode_fill_fb_struct(&nouveau_fb->base, mode_cmd); 79 drm_helper_mode_fill_fb_struct(fb, mode_cmd);
72 nouveau_fb->nvbo = nvbo; 80 nv_fb->nvbo = nvbo;
81
82 if (dev_priv->card_type >= NV_50) {
83 u32 tile_flags = nouveau_bo_tile_layout(nvbo);
84 if (tile_flags == 0x7a00 ||
85 tile_flags == 0xfe00)
86 nv_fb->r_dma = NvEvoFB32;
87 else
88 if (tile_flags == 0x7000)
89 nv_fb->r_dma = NvEvoFB16;
90 else
91 nv_fb->r_dma = NvEvoVRAM_LP;
92
93 switch (fb->depth) {
94 case 8: nv_fb->r_format = NV50_EVO_CRTC_FB_DEPTH_8; break;
95 case 15: nv_fb->r_format = NV50_EVO_CRTC_FB_DEPTH_15; break;
96 case 16: nv_fb->r_format = NV50_EVO_CRTC_FB_DEPTH_16; break;
97 case 24:
98 case 32: nv_fb->r_format = NV50_EVO_CRTC_FB_DEPTH_24; break;
99 case 30: nv_fb->r_format = NV50_EVO_CRTC_FB_DEPTH_30; break;
100 default:
101 NV_ERROR(dev, "unknown depth %d\n", fb->depth);
102 return -EINVAL;
103 }
104
105 if (dev_priv->chipset == 0x50)
106 nv_fb->r_format |= (tile_flags << 8);
107
108 if (!tile_flags)
109 nv_fb->r_pitch = 0x00100000 | fb->pitch;
110 else {
111 u32 mode = nvbo->tile_mode;
112 if (dev_priv->card_type >= NV_C0)
113 mode >>= 4;
114 nv_fb->r_pitch = ((fb->pitch / 4) << 4) | mode;
115 }
116 }
117
73 return 0; 118 return 0;
74} 119}
75 120
@@ -104,3 +149,220 @@ const struct drm_mode_config_funcs nouveau_mode_config_funcs = {
104 .output_poll_changed = nouveau_fbcon_output_poll_changed, 149 .output_poll_changed = nouveau_fbcon_output_poll_changed,
105}; 150};
106 151
152int
153nouveau_vblank_enable(struct drm_device *dev, int crtc)
154{
155 struct drm_nouveau_private *dev_priv = dev->dev_private;
156
157 if (dev_priv->card_type >= NV_50)
158 nv_mask(dev, NV50_PDISPLAY_INTR_EN_1, 0,
159 NV50_PDISPLAY_INTR_EN_1_VBLANK_CRTC_(crtc));
160 else
161 NVWriteCRTC(dev, crtc, NV_PCRTC_INTR_EN_0,
162 NV_PCRTC_INTR_0_VBLANK);
163
164 return 0;
165}
166
167void
168nouveau_vblank_disable(struct drm_device *dev, int crtc)
169{
170 struct drm_nouveau_private *dev_priv = dev->dev_private;
171
172 if (dev_priv->card_type >= NV_50)
173 nv_mask(dev, NV50_PDISPLAY_INTR_EN_1,
174 NV50_PDISPLAY_INTR_EN_1_VBLANK_CRTC_(crtc), 0);
175 else
176 NVWriteCRTC(dev, crtc, NV_PCRTC_INTR_EN_0, 0);
177}
178
179static int
180nouveau_page_flip_reserve(struct nouveau_bo *old_bo,
181 struct nouveau_bo *new_bo)
182{
183 int ret;
184
185 ret = nouveau_bo_pin(new_bo, TTM_PL_FLAG_VRAM);
186 if (ret)
187 return ret;
188
189 ret = ttm_bo_reserve(&new_bo->bo, false, false, false, 0);
190 if (ret)
191 goto fail;
192
193 ret = ttm_bo_reserve(&old_bo->bo, false, false, false, 0);
194 if (ret)
195 goto fail_unreserve;
196
197 return 0;
198
199fail_unreserve:
200 ttm_bo_unreserve(&new_bo->bo);
201fail:
202 nouveau_bo_unpin(new_bo);
203 return ret;
204}
205
206static void
207nouveau_page_flip_unreserve(struct nouveau_bo *old_bo,
208 struct nouveau_bo *new_bo,
209 struct nouveau_fence *fence)
210{
211 nouveau_bo_fence(new_bo, fence);
212 ttm_bo_unreserve(&new_bo->bo);
213
214 nouveau_bo_fence(old_bo, fence);
215 ttm_bo_unreserve(&old_bo->bo);
216
217 nouveau_bo_unpin(old_bo);
218}
219
220static int
221nouveau_page_flip_emit(struct nouveau_channel *chan,
222 struct nouveau_bo *old_bo,
223 struct nouveau_bo *new_bo,
224 struct nouveau_page_flip_state *s,
225 struct nouveau_fence **pfence)
226{
227 struct drm_nouveau_private *dev_priv = chan->dev->dev_private;
228 struct drm_device *dev = chan->dev;
229 unsigned long flags;
230 int ret;
231
232 /* Queue it to the pending list */
233 spin_lock_irqsave(&dev->event_lock, flags);
234 list_add_tail(&s->head, &chan->nvsw.flip);
235 spin_unlock_irqrestore(&dev->event_lock, flags);
236
237 /* Synchronize with the old framebuffer */
238 ret = nouveau_fence_sync(old_bo->bo.sync_obj, chan);
239 if (ret)
240 goto fail;
241
242 /* Emit the pageflip */
243 ret = RING_SPACE(chan, 2);
244 if (ret)
245 goto fail;
246
247 if (dev_priv->card_type < NV_C0)
248 BEGIN_RING(chan, NvSubSw, NV_SW_PAGE_FLIP, 1);
249 else
250 BEGIN_NVC0(chan, 2, NvSubM2MF, 0x0500, 1);
251 OUT_RING (chan, 0);
252 FIRE_RING (chan);
253
254 ret = nouveau_fence_new(chan, pfence, true);
255 if (ret)
256 goto fail;
257
258 return 0;
259fail:
260 spin_lock_irqsave(&dev->event_lock, flags);
261 list_del(&s->head);
262 spin_unlock_irqrestore(&dev->event_lock, flags);
263 return ret;
264}
265
266int
267nouveau_crtc_page_flip(struct drm_crtc *crtc, struct drm_framebuffer *fb,
268 struct drm_pending_vblank_event *event)
269{
270 struct drm_device *dev = crtc->dev;
271 struct drm_nouveau_private *dev_priv = dev->dev_private;
272 struct nouveau_bo *old_bo = nouveau_framebuffer(crtc->fb)->nvbo;
273 struct nouveau_bo *new_bo = nouveau_framebuffer(fb)->nvbo;
274 struct nouveau_page_flip_state *s;
275 struct nouveau_channel *chan;
276 struct nouveau_fence *fence;
277 int ret;
278
279 if (!dev_priv->channel)
280 return -ENODEV;
281
282 s = kzalloc(sizeof(*s), GFP_KERNEL);
283 if (!s)
284 return -ENOMEM;
285
286 /* Don't let the buffers go away while we flip */
287 ret = nouveau_page_flip_reserve(old_bo, new_bo);
288 if (ret)
289 goto fail_free;
290
291 /* Initialize a page flip struct */
292 *s = (struct nouveau_page_flip_state)
293 { { }, event, nouveau_crtc(crtc)->index,
294 fb->bits_per_pixel, fb->pitch, crtc->x, crtc->y,
295 new_bo->bo.offset };
296
297 /* Choose the channel the flip will be handled in */
298 chan = nouveau_fence_channel(new_bo->bo.sync_obj);
299 if (!chan)
300 chan = nouveau_channel_get_unlocked(dev_priv->channel);
301 mutex_lock(&chan->mutex);
302
303 /* Emit a page flip */
304 if (dev_priv->card_type >= NV_50) {
305 ret = nv50_display_flip_next(crtc, fb, chan);
306 if (ret) {
307 nouveau_channel_put(&chan);
308 goto fail_unreserve;
309 }
310 }
311
312 ret = nouveau_page_flip_emit(chan, old_bo, new_bo, s, &fence);
313 nouveau_channel_put(&chan);
314 if (ret)
315 goto fail_unreserve;
316
317 /* Update the crtc struct and cleanup */
318 crtc->fb = fb;
319
320 nouveau_page_flip_unreserve(old_bo, new_bo, fence);
321 nouveau_fence_unref(&fence);
322 return 0;
323
324fail_unreserve:
325 nouveau_page_flip_unreserve(old_bo, new_bo, NULL);
326fail_free:
327 kfree(s);
328 return ret;
329}
330
331int
332nouveau_finish_page_flip(struct nouveau_channel *chan,
333 struct nouveau_page_flip_state *ps)
334{
335 struct drm_device *dev = chan->dev;
336 struct nouveau_page_flip_state *s;
337 unsigned long flags;
338
339 spin_lock_irqsave(&dev->event_lock, flags);
340
341 if (list_empty(&chan->nvsw.flip)) {
342 NV_ERROR(dev, "Unexpected pageflip in channel %d.\n", chan->id);
343 spin_unlock_irqrestore(&dev->event_lock, flags);
344 return -EINVAL;
345 }
346
347 s = list_first_entry(&chan->nvsw.flip,
348 struct nouveau_page_flip_state, head);
349 if (s->event) {
350 struct drm_pending_vblank_event *e = s->event;
351 struct timeval now;
352
353 do_gettimeofday(&now);
354 e->event.sequence = 0;
355 e->event.tv_sec = now.tv_sec;
356 e->event.tv_usec = now.tv_usec;
357 list_add_tail(&e->base.link, &e->base.file_priv->event_list);
358 wake_up_interruptible(&e->base.file_priv->event_wait);
359 }
360
361 list_del(&s->head);
362 if (ps)
363 *ps = *s;
364 kfree(s);
365
366 spin_unlock_irqrestore(&dev->event_lock, flags);
367 return 0;
368}
diff --git a/drivers/gpu/drm/nouveau/nouveau_dma.c b/drivers/gpu/drm/nouveau/nouveau_dma.c
index 2e3c6caa97ee..568caedd7216 100644
--- a/drivers/gpu/drm/nouveau/nouveau_dma.c
+++ b/drivers/gpu/drm/nouveau/nouveau_dma.c
@@ -28,6 +28,7 @@
28#include "drm.h" 28#include "drm.h"
29#include "nouveau_drv.h" 29#include "nouveau_drv.h"
30#include "nouveau_dma.h" 30#include "nouveau_dma.h"
31#include "nouveau_ramht.h"
31 32
32void 33void
33nouveau_dma_pre_init(struct nouveau_channel *chan) 34nouveau_dma_pre_init(struct nouveau_channel *chan)
@@ -35,7 +36,7 @@ nouveau_dma_pre_init(struct nouveau_channel *chan)
35 struct drm_nouveau_private *dev_priv = chan->dev->dev_private; 36 struct drm_nouveau_private *dev_priv = chan->dev->dev_private;
36 struct nouveau_bo *pushbuf = chan->pushbuf_bo; 37 struct nouveau_bo *pushbuf = chan->pushbuf_bo;
37 38
38 if (dev_priv->card_type == NV_50) { 39 if (dev_priv->card_type >= NV_50) {
39 const int ib_size = pushbuf->bo.mem.size / 2; 40 const int ib_size = pushbuf->bo.mem.size / 2;
40 41
41 chan->dma.ib_base = (pushbuf->bo.mem.size - ib_size) >> 2; 42 chan->dma.ib_base = (pushbuf->bo.mem.size - ib_size) >> 2;
@@ -58,41 +59,32 @@ nouveau_dma_init(struct nouveau_channel *chan)
58{ 59{
59 struct drm_device *dev = chan->dev; 60 struct drm_device *dev = chan->dev;
60 struct drm_nouveau_private *dev_priv = dev->dev_private; 61 struct drm_nouveau_private *dev_priv = dev->dev_private;
61 struct nouveau_gpuobj *m2mf = NULL;
62 struct nouveau_gpuobj *nvsw = NULL;
63 int ret, i; 62 int ret, i;
64 63
65 /* Create NV_MEMORY_TO_MEMORY_FORMAT for buffer moves */ 64 if (dev_priv->card_type >= NV_C0) {
66 ret = nouveau_gpuobj_gr_new(chan, dev_priv->card_type < NV_50 ? 65 ret = nouveau_gpuobj_gr_new(chan, 0x9039, 0x9039);
67 0x0039 : 0x5039, &m2mf); 66 if (ret)
68 if (ret) 67 return ret;
69 return ret;
70 68
71 ret = nouveau_gpuobj_ref_add(dev, chan, NvM2MF, m2mf, NULL); 69 ret = RING_SPACE(chan, 2);
72 if (ret) 70 if (ret)
73 return ret; 71 return ret;
74 72
75 /* Create an NV_SW object for various sync purposes */ 73 BEGIN_NVC0(chan, 2, NvSubM2MF, 0x0000, 1);
76 ret = nouveau_gpuobj_sw_new(chan, NV_SW, &nvsw); 74 OUT_RING (chan, 0x00009039);
77 if (ret) 75 FIRE_RING (chan);
78 return ret; 76 return 0;
77 }
79 78
80 ret = nouveau_gpuobj_ref_add(dev, chan, NvSw, nvsw, NULL); 79 /* Create NV_MEMORY_TO_MEMORY_FORMAT for buffer moves */
80 ret = nouveau_gpuobj_gr_new(chan, NvM2MF, dev_priv->card_type < NV_50 ?
81 0x0039 : 0x5039);
81 if (ret) 82 if (ret)
82 return ret; 83 return ret;
83 84
84 /* NV_MEMORY_TO_MEMORY_FORMAT requires a notifier object */ 85 /* NV_MEMORY_TO_MEMORY_FORMAT requires a notifier object */
85 ret = nouveau_notifier_alloc(chan, NvNotify0, 32, &chan->m2mf_ntfy); 86 ret = nouveau_notifier_alloc(chan, NvNotify0, 32, 0xfe0, 0x1000,
86 if (ret) 87 &chan->m2mf_ntfy);
87 return ret;
88
89 /* Map push buffer */
90 ret = nouveau_bo_map(chan->pushbuf_bo);
91 if (ret)
92 return ret;
93
94 /* Map M2MF notifier object - fbcon. */
95 ret = nouveau_bo_map(chan->notifier_bo);
96 if (ret) 88 if (ret)
97 return ret; 89 return ret;
98 90
@@ -105,20 +97,15 @@ nouveau_dma_init(struct nouveau_channel *chan)
105 OUT_RING(chan, 0); 97 OUT_RING(chan, 0);
106 98
107 /* Initialise NV_MEMORY_TO_MEMORY_FORMAT */ 99 /* Initialise NV_MEMORY_TO_MEMORY_FORMAT */
108 ret = RING_SPACE(chan, 4); 100 ret = RING_SPACE(chan, 6);
109 if (ret) 101 if (ret)
110 return ret; 102 return ret;
111 BEGIN_RING(chan, NvSubM2MF, NV_MEMORY_TO_MEMORY_FORMAT_NAME, 1); 103 BEGIN_RING(chan, NvSubM2MF, NV_MEMORY_TO_MEMORY_FORMAT_NAME, 1);
112 OUT_RING(chan, NvM2MF); 104 OUT_RING (chan, NvM2MF);
113 BEGIN_RING(chan, NvSubM2MF, NV_MEMORY_TO_MEMORY_FORMAT_DMA_NOTIFY, 1); 105 BEGIN_RING(chan, NvSubM2MF, NV_MEMORY_TO_MEMORY_FORMAT_DMA_NOTIFY, 3);
114 OUT_RING(chan, NvNotify0); 106 OUT_RING (chan, NvNotify0);
115 107 OUT_RING (chan, chan->vram_handle);
116 /* Initialise NV_SW */ 108 OUT_RING (chan, chan->gart_handle);
117 ret = RING_SPACE(chan, 2);
118 if (ret)
119 return ret;
120 BEGIN_RING(chan, NvSubSw, 0, 1);
121 OUT_RING(chan, NvSw);
122 109
123 /* Sit back and pray the channel works.. */ 110 /* Sit back and pray the channel works.. */
124 FIRE_RING(chan); 111 FIRE_RING(chan);
@@ -217,7 +204,7 @@ nv50_dma_push_wait(struct nouveau_channel *chan, int count)
217 204
218 chan->dma.ib_free = get - chan->dma.ib_put; 205 chan->dma.ib_free = get - chan->dma.ib_put;
219 if (chan->dma.ib_free <= 0) 206 if (chan->dma.ib_free <= 0)
220 chan->dma.ib_free += chan->dma.ib_max + 1; 207 chan->dma.ib_free += chan->dma.ib_max;
221 } 208 }
222 209
223 return 0; 210 return 0;
diff --git a/drivers/gpu/drm/nouveau/nouveau_dma.h b/drivers/gpu/drm/nouveau/nouveau_dma.h
index 8b05c15866d5..23d4edf992b7 100644
--- a/drivers/gpu/drm/nouveau/nouveau_dma.h
+++ b/drivers/gpu/drm/nouveau/nouveau_dma.h
@@ -61,8 +61,6 @@ enum {
61 NvM2MF = 0x80000001, 61 NvM2MF = 0x80000001,
62 NvDmaFB = 0x80000002, 62 NvDmaFB = 0x80000002,
63 NvDmaTT = 0x80000003, 63 NvDmaTT = 0x80000003,
64 NvDmaVRAM = 0x80000004,
65 NvDmaGART = 0x80000005,
66 NvNotify0 = 0x80000006, 64 NvNotify0 = 0x80000006,
67 Nv2D = 0x80000007, 65 Nv2D = 0x80000007,
68 NvCtxSurf2D = 0x80000008, 66 NvCtxSurf2D = 0x80000008,
@@ -72,11 +70,16 @@ enum {
72 NvGdiRect = 0x8000000c, 70 NvGdiRect = 0x8000000c,
73 NvImageBlit = 0x8000000d, 71 NvImageBlit = 0x8000000d,
74 NvSw = 0x8000000e, 72 NvSw = 0x8000000e,
73 NvSema = 0x8000000f,
74 NvEvoSema0 = 0x80000010,
75 NvEvoSema1 = 0x80000011,
75 76
76 /* G80+ display objects */ 77 /* G80+ display objects */
77 NvEvoVRAM = 0x01000000, 78 NvEvoVRAM = 0x01000000,
78 NvEvoFB16 = 0x01000001, 79 NvEvoFB16 = 0x01000001,
79 NvEvoFB32 = 0x01000002 80 NvEvoFB32 = 0x01000002,
81 NvEvoVRAM_LP = 0x01000003,
82 NvEvoSync = 0xcafe0000
80}; 83};
81 84
82#define NV_MEMORY_TO_MEMORY_FORMAT 0x00000039 85#define NV_MEMORY_TO_MEMORY_FORMAT 0x00000039
@@ -124,6 +127,12 @@ extern void
124OUT_RINGp(struct nouveau_channel *chan, const void *data, unsigned nr_dwords); 127OUT_RINGp(struct nouveau_channel *chan, const void *data, unsigned nr_dwords);
125 128
126static inline void 129static inline void
130BEGIN_NVC0(struct nouveau_channel *chan, int op, int subc, int mthd, int size)
131{
132 OUT_RING(chan, (op << 28) | (size << 16) | (subc << 13) | (mthd >> 2));
133}
134
135static inline void
127BEGIN_RING(struct nouveau_channel *chan, int subc, int mthd, int size) 136BEGIN_RING(struct nouveau_channel *chan, int subc, int mthd, int size)
128{ 137{
129 OUT_RING(chan, (subc << 13) | (size << 18) | mthd); 138 OUT_RING(chan, (subc << 13) | (size << 18) | mthd);
diff --git a/drivers/gpu/drm/nouveau/nouveau_dp.c b/drivers/gpu/drm/nouveau/nouveau_dp.c
index 8a1b188b4cd1..7beb82a0315d 100644
--- a/drivers/gpu/drm/nouveau/nouveau_dp.c
+++ b/drivers/gpu/drm/nouveau/nouveau_dp.c
@@ -175,7 +175,6 @@ nouveau_dp_link_train_adjust(struct drm_encoder *encoder, uint8_t *config)
175{ 175{
176 struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder); 176 struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder);
177 struct drm_device *dev = encoder->dev; 177 struct drm_device *dev = encoder->dev;
178 struct bit_displayport_encoder_table_entry *dpse;
179 struct bit_displayport_encoder_table *dpe; 178 struct bit_displayport_encoder_table *dpe;
180 int ret, i, dpe_headerlen, vs = 0, pre = 0; 179 int ret, i, dpe_headerlen, vs = 0, pre = 0;
181 uint8_t request[2]; 180 uint8_t request[2];
@@ -183,7 +182,6 @@ nouveau_dp_link_train_adjust(struct drm_encoder *encoder, uint8_t *config)
183 dpe = nouveau_bios_dp_table(dev, nv_encoder->dcb, &dpe_headerlen); 182 dpe = nouveau_bios_dp_table(dev, nv_encoder->dcb, &dpe_headerlen);
184 if (!dpe) 183 if (!dpe)
185 return false; 184 return false;
186 dpse = (void *)((char *)dpe + dpe_headerlen);
187 185
188 ret = auxch_rd(encoder, DP_ADJUST_REQUEST_LANE0_1, request, 2); 186 ret = auxch_rd(encoder, DP_ADJUST_REQUEST_LANE0_1, request, 2);
189 if (ret) 187 if (ret)
@@ -279,7 +277,7 @@ nouveau_dp_link_train(struct drm_encoder *encoder)
279 struct bit_displayport_encoder_table *dpe; 277 struct bit_displayport_encoder_table *dpe;
280 int dpe_headerlen; 278 int dpe_headerlen;
281 uint8_t config[4], status[3]; 279 uint8_t config[4], status[3];
282 bool cr_done, cr_max_vs, eq_done; 280 bool cr_done, cr_max_vs, eq_done, hpd_state;
283 int ret = 0, i, tries, voltage; 281 int ret = 0, i, tries, voltage;
284 282
285 NV_DEBUG_KMS(dev, "link training!!\n"); 283 NV_DEBUG_KMS(dev, "link training!!\n");
@@ -297,7 +295,7 @@ nouveau_dp_link_train(struct drm_encoder *encoder)
297 /* disable hotplug detect, this flips around on some panels during 295 /* disable hotplug detect, this flips around on some panels during
298 * link training. 296 * link training.
299 */ 297 */
300 pgpio->irq_enable(dev, nv_connector->dcb->gpio_tag, false); 298 hpd_state = pgpio->irq_enable(dev, nv_connector->dcb->gpio_tag, false);
301 299
302 if (dpe->script0) { 300 if (dpe->script0) {
303 NV_DEBUG_KMS(dev, "SOR-%d: running DP script 0\n", nv_encoder->or); 301 NV_DEBUG_KMS(dev, "SOR-%d: running DP script 0\n", nv_encoder->or);
@@ -317,7 +315,8 @@ train:
317 return false; 315 return false;
318 316
319 config[0] = nv_encoder->dp.link_nr; 317 config[0] = nv_encoder->dp.link_nr;
320 if (nv_encoder->dp.dpcd_version >= 0x11) 318 if (nv_encoder->dp.dpcd_version >= 0x11 &&
319 nv_encoder->dp.enhanced_frame)
321 config[0] |= DP_LANE_COUNT_ENHANCED_FRAME_EN; 320 config[0] |= DP_LANE_COUNT_ENHANCED_FRAME_EN;
322 321
323 ret = nouveau_dp_lane_count_set(encoder, config[0]); 322 ret = nouveau_dp_lane_count_set(encoder, config[0]);
@@ -438,7 +437,7 @@ stop:
438 } 437 }
439 438
440 /* re-enable hotplug detect */ 439 /* re-enable hotplug detect */
441 pgpio->irq_enable(dev, nv_connector->dcb->gpio_tag, true); 440 pgpio->irq_enable(dev, nv_connector->dcb->gpio_tag, hpd_state);
442 441
443 return eq_done; 442 return eq_done;
444} 443}
@@ -468,10 +467,12 @@ nouveau_dp_detect(struct drm_encoder *encoder)
468 !nv_encoder->dcb->dpconf.link_bw) 467 !nv_encoder->dcb->dpconf.link_bw)
469 nv_encoder->dp.link_bw = DP_LINK_BW_1_62; 468 nv_encoder->dp.link_bw = DP_LINK_BW_1_62;
470 469
471 nv_encoder->dp.link_nr = dpcd[2] & 0xf; 470 nv_encoder->dp.link_nr = dpcd[2] & DP_MAX_LANE_COUNT_MASK;
472 if (nv_encoder->dp.link_nr > nv_encoder->dcb->dpconf.link_nr) 471 if (nv_encoder->dp.link_nr > nv_encoder->dcb->dpconf.link_nr)
473 nv_encoder->dp.link_nr = nv_encoder->dcb->dpconf.link_nr; 472 nv_encoder->dp.link_nr = nv_encoder->dcb->dpconf.link_nr;
474 473
474 nv_encoder->dp.enhanced_frame = (dpcd[2] & DP_ENHANCED_FRAME_CAP);
475
475 return true; 476 return true;
476} 477}
477 478
@@ -524,7 +525,8 @@ nouveau_dp_auxch(struct nouveau_i2c_chan *auxch, int cmd, int addr,
524 nv_wr32(dev, NV50_AUXCH_CTRL(index), ctrl | 0x80000000); 525 nv_wr32(dev, NV50_AUXCH_CTRL(index), ctrl | 0x80000000);
525 nv_wr32(dev, NV50_AUXCH_CTRL(index), ctrl); 526 nv_wr32(dev, NV50_AUXCH_CTRL(index), ctrl);
526 nv_wr32(dev, NV50_AUXCH_CTRL(index), ctrl | 0x00010000); 527 nv_wr32(dev, NV50_AUXCH_CTRL(index), ctrl | 0x00010000);
527 if (!nv_wait(NV50_AUXCH_CTRL(index), 0x00010000, 0x00000000)) { 528 if (!nv_wait(dev, NV50_AUXCH_CTRL(index),
529 0x00010000, 0x00000000)) {
528 NV_ERROR(dev, "expected bit 16 == 0, got 0x%08x\n", 530 NV_ERROR(dev, "expected bit 16 == 0, got 0x%08x\n",
529 nv_rd32(dev, NV50_AUXCH_CTRL(index))); 531 nv_rd32(dev, NV50_AUXCH_CTRL(index)));
530 ret = -EBUSY; 532 ret = -EBUSY;
diff --git a/drivers/gpu/drm/nouveau/nouveau_drv.c b/drivers/gpu/drm/nouveau/nouveau_drv.c
index 1de5eb53e016..02c6f37d8bd7 100644
--- a/drivers/gpu/drm/nouveau/nouveau_drv.c
+++ b/drivers/gpu/drm/nouveau/nouveau_drv.c
@@ -31,13 +31,14 @@
31#include "nouveau_hw.h" 31#include "nouveau_hw.h"
32#include "nouveau_fb.h" 32#include "nouveau_fb.h"
33#include "nouveau_fbcon.h" 33#include "nouveau_fbcon.h"
34#include "nouveau_pm.h"
34#include "nv50_display.h" 35#include "nv50_display.h"
35 36
36#include "drm_pciids.h" 37#include "drm_pciids.h"
37 38
38MODULE_PARM_DESC(noagp, "Disable AGP"); 39MODULE_PARM_DESC(agpmode, "AGP mode (0 to disable AGP)");
39int nouveau_noagp; 40int nouveau_agpmode = -1;
40module_param_named(noagp, nouveau_noagp, int, 0400); 41module_param_named(agpmode, nouveau_agpmode, int, 0400);
41 42
42MODULE_PARM_DESC(modeset, "Enable kernel modesetting"); 43MODULE_PARM_DESC(modeset, "Enable kernel modesetting");
43static int nouveau_modeset = -1; /* kms */ 44static int nouveau_modeset = -1; /* kms */
@@ -79,6 +80,10 @@ MODULE_PARM_DESC(nofbaccel, "Disable fbcon acceleration");
79int nouveau_nofbaccel = 0; 80int nouveau_nofbaccel = 0;
80module_param_named(nofbaccel, nouveau_nofbaccel, int, 0400); 81module_param_named(nofbaccel, nouveau_nofbaccel, int, 0400);
81 82
83MODULE_PARM_DESC(force_post, "Force POST");
84int nouveau_force_post = 0;
85module_param_named(force_post, nouveau_force_post, int, 0400);
86
82MODULE_PARM_DESC(override_conntype, "Ignore DCB connector type"); 87MODULE_PARM_DESC(override_conntype, "Ignore DCB connector type");
83int nouveau_override_conntype = 0; 88int nouveau_override_conntype = 0;
84module_param_named(override_conntype, nouveau_override_conntype, int, 0400); 89module_param_named(override_conntype, nouveau_override_conntype, int, 0400);
@@ -102,6 +107,18 @@ MODULE_PARM_DESC(reg_debug, "Register access debug bitmask:\n"
102int nouveau_reg_debug; 107int nouveau_reg_debug;
103module_param_named(reg_debug, nouveau_reg_debug, int, 0600); 108module_param_named(reg_debug, nouveau_reg_debug, int, 0600);
104 109
110MODULE_PARM_DESC(perflvl, "Performance level (default: boot)\n");
111char *nouveau_perflvl;
112module_param_named(perflvl, nouveau_perflvl, charp, 0400);
113
114MODULE_PARM_DESC(perflvl_wr, "Allow perflvl changes (warning: dangerous!)\n");
115int nouveau_perflvl_wr;
116module_param_named(perflvl_wr, nouveau_perflvl_wr, int, 0400);
117
118MODULE_PARM_DESC(msi, "Enable MSI (default: off)\n");
119int nouveau_msi;
120module_param_named(msi, nouveau_msi, int, 0400);
121
105int nouveau_fbpercrtc; 122int nouveau_fbpercrtc;
106#if 0 123#if 0
107module_param_named(fbpercrtc, nouveau_fbpercrtc, int, 0400); 124module_param_named(fbpercrtc, nouveau_fbpercrtc, int, 0400);
@@ -145,15 +162,17 @@ nouveau_pci_suspend(struct pci_dev *pdev, pm_message_t pm_state)
145 struct drm_device *dev = pci_get_drvdata(pdev); 162 struct drm_device *dev = pci_get_drvdata(pdev);
146 struct drm_nouveau_private *dev_priv = dev->dev_private; 163 struct drm_nouveau_private *dev_priv = dev->dev_private;
147 struct nouveau_instmem_engine *pinstmem = &dev_priv->engine.instmem; 164 struct nouveau_instmem_engine *pinstmem = &dev_priv->engine.instmem;
148 struct nouveau_pgraph_engine *pgraph = &dev_priv->engine.graph;
149 struct nouveau_fifo_engine *pfifo = &dev_priv->engine.fifo; 165 struct nouveau_fifo_engine *pfifo = &dev_priv->engine.fifo;
150 struct nouveau_channel *chan; 166 struct nouveau_channel *chan;
151 struct drm_crtc *crtc; 167 struct drm_crtc *crtc;
152 int ret, i; 168 int ret, i, e;
153 169
154 if (pm_state.event == PM_EVENT_PRETHAW) 170 if (pm_state.event == PM_EVENT_PRETHAW)
155 return 0; 171 return 0;
156 172
173 if (dev->switch_power_state == DRM_SWITCH_POWER_OFF)
174 return 0;
175
157 NV_INFO(dev, "Disabling fbcon acceleration...\n"); 176 NV_INFO(dev, "Disabling fbcon acceleration...\n");
158 nouveau_fbcon_save_disable_accel(dev); 177 nouveau_fbcon_save_disable_accel(dev);
159 178
@@ -180,43 +199,35 @@ nouveau_pci_suspend(struct pci_dev *pdev, pm_message_t pm_state)
180 199
181 NV_INFO(dev, "Idling channels...\n"); 200 NV_INFO(dev, "Idling channels...\n");
182 for (i = 0; i < pfifo->channels; i++) { 201 for (i = 0; i < pfifo->channels; i++) {
183 struct nouveau_fence *fence = NULL; 202 chan = dev_priv->channels.ptr[i];
184 203
185 chan = dev_priv->fifos[i]; 204 if (chan && chan->pushbuf_bo)
186 if (!chan || (dev_priv->card_type >= NV_50 && 205 nouveau_channel_idle(chan);
187 chan == dev_priv->fifos[0]))
188 continue;
189
190 ret = nouveau_fence_new(chan, &fence, true);
191 if (ret == 0) {
192 ret = nouveau_fence_wait(fence, NULL, false, false);
193 nouveau_fence_unref((void *)&fence);
194 }
195
196 if (ret) {
197 NV_ERROR(dev, "Failed to idle channel %d for suspend\n",
198 chan->id);
199 }
200 } 206 }
201 207
202 pgraph->fifo_access(dev, false);
203 nouveau_wait_for_idle(dev);
204 pfifo->reassign(dev, false); 208 pfifo->reassign(dev, false);
205 pfifo->disable(dev); 209 pfifo->disable(dev);
206 pfifo->unload_context(dev); 210 pfifo->unload_context(dev);
207 pgraph->unload_context(dev);
208 211
209 NV_INFO(dev, "Suspending GPU objects...\n"); 212 for (e = NVOBJ_ENGINE_NR - 1; e >= 0; e--) {
210 ret = nouveau_gpuobj_suspend(dev); 213 if (dev_priv->eng[e]) {
214 ret = dev_priv->eng[e]->fini(dev, e);
215 if (ret)
216 goto out_abort;
217 }
218 }
219
220 ret = pinstmem->suspend(dev);
211 if (ret) { 221 if (ret) {
212 NV_ERROR(dev, "... failed: %d\n", ret); 222 NV_ERROR(dev, "... failed: %d\n", ret);
213 goto out_abort; 223 goto out_abort;
214 } 224 }
215 225
216 ret = pinstmem->suspend(dev); 226 NV_INFO(dev, "Suspending GPU objects...\n");
227 ret = nouveau_gpuobj_suspend(dev);
217 if (ret) { 228 if (ret) {
218 NV_ERROR(dev, "... failed: %d\n", ret); 229 NV_ERROR(dev, "... failed: %d\n", ret);
219 nouveau_gpuobj_suspend_cleanup(dev); 230 pinstmem->resume(dev);
220 goto out_abort; 231 goto out_abort;
221 } 232 }
222 233
@@ -227,17 +238,20 @@ nouveau_pci_suspend(struct pci_dev *pdev, pm_message_t pm_state)
227 pci_set_power_state(pdev, PCI_D3hot); 238 pci_set_power_state(pdev, PCI_D3hot);
228 } 239 }
229 240
230 acquire_console_sem(); 241 console_lock();
231 nouveau_fbcon_set_suspend(dev, 1); 242 nouveau_fbcon_set_suspend(dev, 1);
232 release_console_sem(); 243 console_unlock();
233 nouveau_fbcon_restore_accel(dev); 244 nouveau_fbcon_restore_accel(dev);
234 return 0; 245 return 0;
235 246
236out_abort: 247out_abort:
237 NV_INFO(dev, "Re-enabling acceleration..\n"); 248 NV_INFO(dev, "Re-enabling acceleration..\n");
249 for (e = e + 1; e < NVOBJ_ENGINE_NR; e++) {
250 if (dev_priv->eng[e])
251 dev_priv->eng[e]->init(dev, e);
252 }
238 pfifo->enable(dev); 253 pfifo->enable(dev);
239 pfifo->reassign(dev, true); 254 pfifo->reassign(dev, true);
240 pgraph->fifo_access(dev, true);
241 return ret; 255 return ret;
242} 256}
243 257
@@ -250,6 +264,9 @@ nouveau_pci_resume(struct pci_dev *pdev)
250 struct drm_crtc *crtc; 264 struct drm_crtc *crtc;
251 int ret, i; 265 int ret, i;
252 266
267 if (dev->switch_power_state == DRM_SWITCH_POWER_OFF)
268 return 0;
269
253 nouveau_fbcon_save_disable_accel(dev); 270 nouveau_fbcon_save_disable_accel(dev);
254 271
255 NV_INFO(dev, "We're back, enabling device...\n"); 272 NV_INFO(dev, "We're back, enabling device...\n");
@@ -271,6 +288,8 @@ nouveau_pci_resume(struct pci_dev *pdev)
271 if (ret) 288 if (ret)
272 return ret; 289 return ret;
273 290
291 nouveau_pm_resume(dev);
292
274 if (dev_priv->gart_info.type == NOUVEAU_GART_AGP) { 293 if (dev_priv->gart_info.type == NOUVEAU_GART_AGP) {
275 ret = nouveau_mem_init_agp(dev); 294 ret = nouveau_mem_init_agp(dev);
276 if (ret) { 295 if (ret) {
@@ -279,17 +298,20 @@ nouveau_pci_resume(struct pci_dev *pdev)
279 } 298 }
280 } 299 }
281 300
301 NV_INFO(dev, "Restoring GPU objects...\n");
302 nouveau_gpuobj_resume(dev);
303
282 NV_INFO(dev, "Reinitialising engines...\n"); 304 NV_INFO(dev, "Reinitialising engines...\n");
283 engine->instmem.resume(dev); 305 engine->instmem.resume(dev);
284 engine->mc.init(dev); 306 engine->mc.init(dev);
285 engine->timer.init(dev); 307 engine->timer.init(dev);
286 engine->fb.init(dev); 308 engine->fb.init(dev);
287 engine->graph.init(dev); 309 for (i = 0; i < NVOBJ_ENGINE_NR; i++) {
310 if (dev_priv->eng[i])
311 dev_priv->eng[i]->init(dev, i);
312 }
288 engine->fifo.init(dev); 313 engine->fifo.init(dev);
289 314
290 NV_INFO(dev, "Restoring GPU objects...\n");
291 nouveau_gpuobj_resume(dev);
292
293 nouveau_irq_postinstall(dev); 315 nouveau_irq_postinstall(dev);
294 316
295 /* Re-write SKIPS, they'll have been lost over the suspend */ 317 /* Re-write SKIPS, they'll have been lost over the suspend */
@@ -298,7 +320,7 @@ nouveau_pci_resume(struct pci_dev *pdev)
298 int j; 320 int j;
299 321
300 for (i = 0; i < dev_priv->engine.fifo.channels; i++) { 322 for (i = 0; i < dev_priv->engine.fifo.channels; i++) {
301 chan = dev_priv->fifos[i]; 323 chan = dev_priv->channels.ptr[i];
302 if (!chan || !chan->pushbuf_bo) 324 if (!chan || !chan->pushbuf_bo)
303 continue; 325 continue;
304 326
@@ -332,13 +354,11 @@ nouveau_pci_resume(struct pci_dev *pdev)
332 354
333 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { 355 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
334 struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc); 356 struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc);
357 u32 offset = nv_crtc->cursor.nvbo->bo.mem.start << PAGE_SHIFT;
335 358
336 nv_crtc->cursor.set_offset(nv_crtc, 359 nv_crtc->cursor.set_offset(nv_crtc, offset);
337 nv_crtc->cursor.nvbo->bo.offset -
338 dev_priv->vm_vram_base);
339
340 nv_crtc->cursor.set_pos(nv_crtc, nv_crtc->cursor_saved_x, 360 nv_crtc->cursor.set_pos(nv_crtc, nv_crtc->cursor_saved_x,
341 nv_crtc->cursor_saved_y); 361 nv_crtc->cursor_saved_y);
342 } 362 }
343 363
344 /* Force CLUT to get re-loaded during modeset */ 364 /* Force CLUT to get re-loaded during modeset */
@@ -348,9 +368,9 @@ nouveau_pci_resume(struct pci_dev *pdev)
348 nv_crtc->lut.depth = 0; 368 nv_crtc->lut.depth = 0;
349 } 369 }
350 370
351 acquire_console_sem(); 371 console_lock();
352 nouveau_fbcon_set_suspend(dev, 0); 372 nouveau_fbcon_set_suspend(dev, 0);
353 release_console_sem(); 373 console_unlock();
354 374
355 nouveau_fbcon_zfill_all(dev); 375 nouveau_fbcon_zfill_all(dev);
356 376
@@ -378,9 +398,10 @@ static struct drm_driver driver = {
378 .irq_postinstall = nouveau_irq_postinstall, 398 .irq_postinstall = nouveau_irq_postinstall,
379 .irq_uninstall = nouveau_irq_uninstall, 399 .irq_uninstall = nouveau_irq_uninstall,
380 .irq_handler = nouveau_irq_handler, 400 .irq_handler = nouveau_irq_handler,
401 .get_vblank_counter = drm_vblank_count,
402 .enable_vblank = nouveau_vblank_enable,
403 .disable_vblank = nouveau_vblank_disable,
381 .reclaim_buffers = drm_core_reclaim_buffers, 404 .reclaim_buffers = drm_core_reclaim_buffers,
382 .get_map_ofs = drm_core_get_map_ofs,
383 .get_reg_ofs = drm_core_get_reg_ofs,
384 .ioctls = nouveau_ioctls, 405 .ioctls = nouveau_ioctls,
385 .fops = { 406 .fops = {
386 .owner = THIS_MODULE, 407 .owner = THIS_MODULE,
@@ -390,17 +411,11 @@ static struct drm_driver driver = {
390 .mmap = nouveau_ttm_mmap, 411 .mmap = nouveau_ttm_mmap,
391 .poll = drm_poll, 412 .poll = drm_poll,
392 .fasync = drm_fasync, 413 .fasync = drm_fasync,
414 .read = drm_read,
393#if defined(CONFIG_COMPAT) 415#if defined(CONFIG_COMPAT)
394 .compat_ioctl = nouveau_compat_ioctl, 416 .compat_ioctl = nouveau_compat_ioctl,
395#endif 417#endif
396 }, 418 .llseek = noop_llseek,
397 .pci_driver = {
398 .name = DRIVER_NAME,
399 .id_table = pciidlist,
400 .probe = nouveau_pci_probe,
401 .remove = nouveau_pci_remove,
402 .suspend = nouveau_pci_suspend,
403 .resume = nouveau_pci_resume
404 }, 419 },
405 420
406 .gem_init_object = nouveau_gem_object_new, 421 .gem_init_object = nouveau_gem_object_new,
@@ -418,6 +433,15 @@ static struct drm_driver driver = {
418 .patchlevel = DRIVER_PATCHLEVEL, 433 .patchlevel = DRIVER_PATCHLEVEL,
419}; 434};
420 435
436static struct pci_driver nouveau_pci_driver = {
437 .name = DRIVER_NAME,
438 .id_table = pciidlist,
439 .probe = nouveau_pci_probe,
440 .remove = nouveau_pci_remove,
441 .suspend = nouveau_pci_suspend,
442 .resume = nouveau_pci_resume
443};
444
421static int __init nouveau_init(void) 445static int __init nouveau_init(void)
422{ 446{
423 driver.num_ioctls = nouveau_max_ioctl; 447 driver.num_ioctls = nouveau_max_ioctl;
@@ -435,7 +459,7 @@ static int __init nouveau_init(void)
435 return 0; 459 return 0;
436 460
437 nouveau_register_dsm_handler(); 461 nouveau_register_dsm_handler();
438 return drm_init(&driver); 462 return drm_pci_init(&driver, &nouveau_pci_driver);
439} 463}
440 464
441static void __exit nouveau_exit(void) 465static void __exit nouveau_exit(void)
@@ -443,7 +467,7 @@ static void __exit nouveau_exit(void)
443 if (!nouveau_modeset) 467 if (!nouveau_modeset)
444 return; 468 return;
445 469
446 drm_exit(&driver); 470 drm_pci_exit(&driver, &nouveau_pci_driver);
447 nouveau_unregister_dsm_handler(); 471 nouveau_unregister_dsm_handler();
448} 472}
449 473
diff --git a/drivers/gpu/drm/nouveau/nouveau_drv.h b/drivers/gpu/drm/nouveau/nouveau_drv.h
index b1be617373b6..9c56331941e2 100644
--- a/drivers/gpu/drm/nouveau/nouveau_drv.h
+++ b/drivers/gpu/drm/nouveau/nouveau_drv.h
@@ -54,27 +54,46 @@ struct nouveau_fpriv {
54#include "nouveau_drm.h" 54#include "nouveau_drm.h"
55#include "nouveau_reg.h" 55#include "nouveau_reg.h"
56#include "nouveau_bios.h" 56#include "nouveau_bios.h"
57#include "nouveau_util.h"
58
57struct nouveau_grctx; 59struct nouveau_grctx;
60struct nouveau_mem;
61#include "nouveau_vm.h"
58 62
59#define MAX_NUM_DCB_ENTRIES 16 63#define MAX_NUM_DCB_ENTRIES 16
60 64
61#define NOUVEAU_MAX_CHANNEL_NR 128 65#define NOUVEAU_MAX_CHANNEL_NR 128
62#define NOUVEAU_MAX_TILE_NR 15 66#define NOUVEAU_MAX_TILE_NR 15
63 67
64#define NV50_VM_MAX_VRAM (2*1024*1024*1024ULL) 68struct nouveau_mem {
65#define NV50_VM_BLOCK (512*1024*1024ULL) 69 struct drm_device *dev;
66#define NV50_VM_VRAM_NR (NV50_VM_MAX_VRAM / NV50_VM_BLOCK) 70
71 struct nouveau_vma bar_vma;
72 struct nouveau_vma tmp_vma;
73 u8 page_shift;
74
75 struct drm_mm_node *tag;
76 struct list_head regions;
77 dma_addr_t *pages;
78 u32 memtype;
79 u64 offset;
80 u64 size;
81};
67 82
68struct nouveau_tile_reg { 83struct nouveau_tile_reg {
69 struct nouveau_fence *fence;
70 uint32_t addr;
71 uint32_t size;
72 bool used; 84 bool used;
85 uint32_t addr;
86 uint32_t limit;
87 uint32_t pitch;
88 uint32_t zcomp;
89 struct drm_mm_node *tag_mem;
90 struct nouveau_fence *fence;
73}; 91};
74 92
75struct nouveau_bo { 93struct nouveau_bo {
76 struct ttm_buffer_object bo; 94 struct ttm_buffer_object bo;
77 struct ttm_placement placement; 95 struct ttm_placement placement;
96 u32 valid_domains;
78 u32 placements[3]; 97 u32 placements[3];
79 u32 busy_placements[3]; 98 u32 busy_placements[3];
80 struct ttm_bo_kmap_obj kmap; 99 struct ttm_bo_kmap_obj kmap;
@@ -88,18 +107,19 @@ struct nouveau_bo {
88 107
89 struct nouveau_channel *channel; 108 struct nouveau_channel *channel;
90 109
91 bool mappable; 110 struct nouveau_vma vma;
92 bool no_vm;
93 111
94 uint32_t tile_mode; 112 uint32_t tile_mode;
95 uint32_t tile_flags; 113 uint32_t tile_flags;
96 struct nouveau_tile_reg *tile; 114 struct nouveau_tile_reg *tile;
97 115
98 struct drm_gem_object *gem; 116 struct drm_gem_object *gem;
99 struct drm_file *cpu_filp;
100 int pin_refcnt; 117 int pin_refcnt;
101}; 118};
102 119
120#define nouveau_bo_tile_layout(nvbo) \
121 ((nvbo)->tile_flags & NOUVEAU_GEM_TILE_LAYOUT_MASK)
122
103static inline struct nouveau_bo * 123static inline struct nouveau_bo *
104nouveau_bo(struct ttm_buffer_object *bo) 124nouveau_bo(struct ttm_buffer_object *bo)
105{ 125{
@@ -130,25 +150,35 @@ enum nouveau_flags {
130 150
131#define NVOBJ_ENGINE_SW 0 151#define NVOBJ_ENGINE_SW 0
132#define NVOBJ_ENGINE_GR 1 152#define NVOBJ_ENGINE_GR 1
133#define NVOBJ_ENGINE_DISPLAY 2 153#define NVOBJ_ENGINE_CRYPT 2
134#define NVOBJ_ENGINE_INT 0xdeadbeef 154#define NVOBJ_ENGINE_COPY0 3
135 155#define NVOBJ_ENGINE_COPY1 4
136#define NVOBJ_FLAG_ALLOW_NO_REFS (1 << 0) 156#define NVOBJ_ENGINE_MPEG 5
157#define NVOBJ_ENGINE_DISPLAY 15
158#define NVOBJ_ENGINE_NR 16
159
160#define NVOBJ_FLAG_DONT_MAP (1 << 0)
137#define NVOBJ_FLAG_ZERO_ALLOC (1 << 1) 161#define NVOBJ_FLAG_ZERO_ALLOC (1 << 1)
138#define NVOBJ_FLAG_ZERO_FREE (1 << 2) 162#define NVOBJ_FLAG_ZERO_FREE (1 << 2)
139#define NVOBJ_FLAG_FAKE (1 << 3) 163#define NVOBJ_FLAG_VM (1 << 3)
164#define NVOBJ_FLAG_VM_USER (1 << 4)
165
166#define NVOBJ_CINST_GLOBAL 0xdeadbeef
167
140struct nouveau_gpuobj { 168struct nouveau_gpuobj {
169 struct drm_device *dev;
170 struct kref refcount;
141 struct list_head list; 171 struct list_head list;
142 172
143 struct nouveau_channel *im_channel; 173 void *node;
144 struct drm_mm_node *im_pramin; 174 u32 *suspend;
145 struct nouveau_bo *im_backing;
146 uint32_t im_backing_start;
147 uint32_t *im_backing_suspend;
148 int im_bound;
149 175
150 uint32_t flags; 176 uint32_t flags;
151 int refcount; 177
178 u32 size;
179 u32 pinst;
180 u32 cinst;
181 u64 vinst;
152 182
153 uint32_t engine; 183 uint32_t engine;
154 uint32_t class; 184 uint32_t class;
@@ -157,26 +187,35 @@ struct nouveau_gpuobj {
157 void *priv; 187 void *priv;
158}; 188};
159 189
160struct nouveau_gpuobj_ref { 190struct nouveau_page_flip_state {
161 struct list_head list; 191 struct list_head head;
162 192 struct drm_pending_vblank_event *event;
163 struct nouveau_gpuobj *gpuobj; 193 int crtc, bpp, pitch, x, y;
164 uint32_t instance; 194 uint64_t offset;
195};
165 196
166 struct nouveau_channel *channel; 197enum nouveau_channel_mutex_class {
167 int handle; 198 NOUVEAU_UCHANNEL_MUTEX,
199 NOUVEAU_KCHANNEL_MUTEX
168}; 200};
169 201
170struct nouveau_channel { 202struct nouveau_channel {
171 struct drm_device *dev; 203 struct drm_device *dev;
172 int id; 204 int id;
173 205
206 /* references to the channel data structure */
207 struct kref ref;
208 /* users of the hardware channel resources, the hardware
209 * context will be kicked off when it reaches zero. */
210 atomic_t users;
211 struct mutex mutex;
212
174 /* owner of this fifo */ 213 /* owner of this fifo */
175 struct drm_file *file_priv; 214 struct drm_file *file_priv;
176 /* mapping of the fifo itself */ 215 /* mapping of the fifo itself */
177 struct drm_local_map *map; 216 struct drm_local_map *map;
178 217
179 /* mapping of the regs controling the fifo */ 218 /* mapping of the regs controlling the fifo */
180 void __iomem *user; 219 void __iomem *user;
181 uint32_t user_get; 220 uint32_t user_get;
182 uint32_t user_put; 221 uint32_t user_put;
@@ -192,33 +231,30 @@ struct nouveau_channel {
192 } fence; 231 } fence;
193 232
194 /* DMA push buffer */ 233 /* DMA push buffer */
195 struct nouveau_gpuobj_ref *pushbuf; 234 struct nouveau_gpuobj *pushbuf;
196 struct nouveau_bo *pushbuf_bo; 235 struct nouveau_bo *pushbuf_bo;
197 uint32_t pushbuf_base; 236 uint32_t pushbuf_base;
198 237
199 /* Notifier memory */ 238 /* Notifier memory */
200 struct nouveau_bo *notifier_bo; 239 struct nouveau_bo *notifier_bo;
201 struct drm_mm notifier_heap; 240 struct drm_mm notifier_heap;
202 241
203 /* PFIFO context */ 242 /* PFIFO context */
204 struct nouveau_gpuobj_ref *ramfc; 243 struct nouveau_gpuobj *ramfc;
205 struct nouveau_gpuobj_ref *cache; 244 struct nouveau_gpuobj *cache;
245 void *fifo_priv;
206 246
207 /* PGRAPH context */ 247 /* Execution engine contexts */
208 /* XXX may be merge 2 pointers as private data ??? */ 248 void *engctx[NVOBJ_ENGINE_NR];
209 struct nouveau_gpuobj_ref *ramin_grctx;
210 void *pgraph_ctx;
211 249
212 /* NV50 VM */ 250 /* NV50 VM */
213 struct nouveau_gpuobj *vm_pd; 251 struct nouveau_vm *vm;
214 struct nouveau_gpuobj_ref *vm_gart_pt; 252 struct nouveau_gpuobj *vm_pd;
215 struct nouveau_gpuobj_ref *vm_vram_pt[NV50_VM_VRAM_NR];
216 253
217 /* Objects */ 254 /* Objects */
218 struct nouveau_gpuobj_ref *ramin; /* Private instmem */ 255 struct nouveau_gpuobj *ramin; /* Private instmem */
219 struct drm_mm ramin_heap; /* Private PRAMIN heap */ 256 struct drm_mm ramin_heap; /* Private PRAMIN heap */
220 struct nouveau_gpuobj_ref *ramht; /* Hash table */ 257 struct nouveau_ramht *ramht; /* Hash table */
221 struct list_head ramht_refs; /* Objects referenced by RAMHT */
222 258
223 /* GPU object info for stuff used in-kernel (mm_enabled) */ 259 /* GPU object info for stuff used in-kernel (mm_enabled) */
224 uint32_t m2mf_ntfy; 260 uint32_t m2mf_ntfy;
@@ -244,9 +280,11 @@ struct nouveau_channel {
244 280
245 struct { 281 struct {
246 struct nouveau_gpuobj *vblsem; 282 struct nouveau_gpuobj *vblsem;
283 uint32_t vblsem_head;
247 uint32_t vblsem_offset; 284 uint32_t vblsem_offset;
248 uint32_t vblsem_rval; 285 uint32_t vblsem_rval;
249 struct list_head vbl_wait; 286 struct list_head vbl_wait;
287 struct list_head flip;
250 } nvsw; 288 } nvsw;
251 289
252 struct { 290 struct {
@@ -256,6 +294,18 @@ struct nouveau_channel {
256 } debugfs; 294 } debugfs;
257}; 295};
258 296
297struct nouveau_exec_engine {
298 void (*destroy)(struct drm_device *, int engine);
299 int (*init)(struct drm_device *, int engine);
300 int (*fini)(struct drm_device *, int engine);
301 int (*context_new)(struct nouveau_channel *, int engine);
302 void (*context_del)(struct nouveau_channel *, int engine);
303 int (*object_new)(struct nouveau_channel *, int engine,
304 u32 handle, u16 class);
305 void (*set_tile_region)(struct drm_device *dev, int i);
306 void (*tlb_flush)(struct drm_device *, int engine);
307};
308
259struct nouveau_instmem_engine { 309struct nouveau_instmem_engine {
260 void *priv; 310 void *priv;
261 311
@@ -264,11 +314,11 @@ struct nouveau_instmem_engine {
264 int (*suspend)(struct drm_device *dev); 314 int (*suspend)(struct drm_device *dev);
265 void (*resume)(struct drm_device *dev); 315 void (*resume)(struct drm_device *dev);
266 316
267 int (*populate)(struct drm_device *, struct nouveau_gpuobj *, 317 int (*get)(struct nouveau_gpuobj *, u32 size, u32 align);
268 uint32_t *size); 318 void (*put)(struct nouveau_gpuobj *);
269 void (*clear)(struct drm_device *, struct nouveau_gpuobj *); 319 int (*map)(struct nouveau_gpuobj *);
270 int (*bind)(struct drm_device *, struct nouveau_gpuobj *); 320 void (*unmap)(struct nouveau_gpuobj *);
271 int (*unbind)(struct drm_device *, struct nouveau_gpuobj *); 321
272 void (*flush)(struct drm_device *); 322 void (*flush)(struct drm_device *);
273}; 323};
274 324
@@ -285,18 +335,24 @@ struct nouveau_timer_engine {
285 335
286struct nouveau_fb_engine { 336struct nouveau_fb_engine {
287 int num_tiles; 337 int num_tiles;
338 struct drm_mm tag_heap;
339 void *priv;
288 340
289 int (*init)(struct drm_device *dev); 341 int (*init)(struct drm_device *dev);
290 void (*takedown)(struct drm_device *dev); 342 void (*takedown)(struct drm_device *dev);
291 343
292 void (*set_region_tiling)(struct drm_device *dev, int i, uint32_t addr, 344 void (*init_tile_region)(struct drm_device *dev, int i,
293 uint32_t size, uint32_t pitch); 345 uint32_t addr, uint32_t size,
346 uint32_t pitch, uint32_t flags);
347 void (*set_tile_region)(struct drm_device *dev, int i);
348 void (*free_tile_region)(struct drm_device *dev, int i);
294}; 349};
295 350
296struct nouveau_fifo_engine { 351struct nouveau_fifo_engine {
352 void *priv;
297 int channels; 353 int channels;
298 354
299 struct nouveau_gpuobj_ref *playlist[2]; 355 struct nouveau_gpuobj *playlist[2];
300 int cur_playlist; 356 int cur_playlist;
301 357
302 int (*init)(struct drm_device *); 358 int (*init)(struct drm_device *);
@@ -305,7 +361,6 @@ struct nouveau_fifo_engine {
305 void (*disable)(struct drm_device *); 361 void (*disable)(struct drm_device *);
306 void (*enable)(struct drm_device *); 362 void (*enable)(struct drm_device *);
307 bool (*reassign)(struct drm_device *, bool enable); 363 bool (*reassign)(struct drm_device *, bool enable);
308 bool (*cache_flush)(struct drm_device *dev);
309 bool (*cache_pull)(struct drm_device *dev, bool enable); 364 bool (*cache_pull)(struct drm_device *dev, bool enable);
310 365
311 int (*channel_id)(struct drm_device *); 366 int (*channel_id)(struct drm_device *);
@@ -314,59 +369,131 @@ struct nouveau_fifo_engine {
314 void (*destroy_context)(struct nouveau_channel *); 369 void (*destroy_context)(struct nouveau_channel *);
315 int (*load_context)(struct nouveau_channel *); 370 int (*load_context)(struct nouveau_channel *);
316 int (*unload_context)(struct drm_device *); 371 int (*unload_context)(struct drm_device *);
372 void (*tlb_flush)(struct drm_device *dev);
317}; 373};
318 374
319struct nouveau_pgraph_object_method { 375struct nouveau_display_engine {
320 int id; 376 void *priv;
321 int (*exec)(struct nouveau_channel *chan, int grclass, int mthd, 377 int (*early_init)(struct drm_device *);
322 uint32_t data); 378 void (*late_takedown)(struct drm_device *);
379 int (*create)(struct drm_device *);
380 int (*init)(struct drm_device *);
381 void (*destroy)(struct drm_device *);
382};
383
384struct nouveau_gpio_engine {
385 void *priv;
386
387 int (*init)(struct drm_device *);
388 void (*takedown)(struct drm_device *);
389
390 int (*get)(struct drm_device *, enum dcb_gpio_tag);
391 int (*set)(struct drm_device *, enum dcb_gpio_tag, int state);
392
393 int (*irq_register)(struct drm_device *, enum dcb_gpio_tag,
394 void (*)(void *, int), void *);
395 void (*irq_unregister)(struct drm_device *, enum dcb_gpio_tag,
396 void (*)(void *, int), void *);
397 bool (*irq_enable)(struct drm_device *, enum dcb_gpio_tag, bool on);
323}; 398};
324 399
325struct nouveau_pgraph_object_class { 400struct nouveau_pm_voltage_level {
401 u8 voltage;
402 u8 vid;
403};
404
405struct nouveau_pm_voltage {
406 bool supported;
407 u8 vid_mask;
408
409 struct nouveau_pm_voltage_level *level;
410 int nr_level;
411};
412
413struct nouveau_pm_memtiming {
326 int id; 414 int id;
327 bool software; 415 u32 reg_100220;
328 struct nouveau_pgraph_object_method *methods; 416 u32 reg_100224;
417 u32 reg_100228;
418 u32 reg_10022c;
419 u32 reg_100230;
420 u32 reg_100234;
421 u32 reg_100238;
422 u32 reg_10023c;
423 u32 reg_100240;
329}; 424};
330 425
331struct nouveau_pgraph_engine { 426#define NOUVEAU_PM_MAX_LEVEL 8
332 struct nouveau_pgraph_object_class *grclass; 427struct nouveau_pm_level {
333 bool accel_blocked; 428 struct device_attribute dev_attr;
334 int grctx_size; 429 char name[32];
430 int id;
335 431
336 /* NV2x/NV3x context table (0x400780) */ 432 u32 core;
337 struct nouveau_gpuobj_ref *ctx_table; 433 u32 memory;
434 u32 shader;
435 u32 unk05;
436 u32 unk0a;
338 437
339 int (*init)(struct drm_device *); 438 u8 voltage;
340 void (*takedown)(struct drm_device *); 439 u8 fanspeed;
341 440
342 void (*fifo_access)(struct drm_device *, bool); 441 u16 memscript;
442 struct nouveau_pm_memtiming *timing;
443};
343 444
344 struct nouveau_channel *(*channel)(struct drm_device *); 445struct nouveau_pm_temp_sensor_constants {
345 int (*create_context)(struct nouveau_channel *); 446 u16 offset_constant;
346 void (*destroy_context)(struct nouveau_channel *); 447 s16 offset_mult;
347 int (*load_context)(struct nouveau_channel *); 448 u16 offset_div;
348 int (*unload_context)(struct drm_device *); 449 u16 slope_mult;
450 u16 slope_div;
451};
349 452
350 void (*set_region_tiling)(struct drm_device *dev, int i, uint32_t addr, 453struct nouveau_pm_threshold_temp {
351 uint32_t size, uint32_t pitch); 454 s16 critical;
455 s16 down_clock;
456 s16 fan_boost;
352}; 457};
353 458
354struct nouveau_display_engine { 459struct nouveau_pm_memtimings {
355 int (*early_init)(struct drm_device *); 460 bool supported;
356 void (*late_takedown)(struct drm_device *); 461 struct nouveau_pm_memtiming *timing;
357 int (*create)(struct drm_device *); 462 int nr_timing;
358 int (*init)(struct drm_device *);
359 void (*destroy)(struct drm_device *);
360}; 463};
361 464
362struct nouveau_gpio_engine { 465struct nouveau_pm_engine {
363 int (*init)(struct drm_device *); 466 struct nouveau_pm_voltage voltage;
364 void (*takedown)(struct drm_device *); 467 struct nouveau_pm_level perflvl[NOUVEAU_PM_MAX_LEVEL];
468 int nr_perflvl;
469 struct nouveau_pm_memtimings memtimings;
470 struct nouveau_pm_temp_sensor_constants sensor_constants;
471 struct nouveau_pm_threshold_temp threshold_temp;
472
473 struct nouveau_pm_level boot;
474 struct nouveau_pm_level *cur;
475
476 struct device *hwmon;
477 struct notifier_block acpi_nb;
478
479 int (*clock_get)(struct drm_device *, u32 id);
480 void *(*clock_pre)(struct drm_device *, struct nouveau_pm_level *,
481 u32 id, int khz);
482 void (*clock_set)(struct drm_device *, void *);
483 int (*voltage_get)(struct drm_device *);
484 int (*voltage_set)(struct drm_device *, int voltage);
485 int (*fanspeed_get)(struct drm_device *);
486 int (*fanspeed_set)(struct drm_device *, int fanspeed);
487 int (*temp_get)(struct drm_device *);
488};
365 489
366 int (*get)(struct drm_device *, enum dcb_gpio_tag); 490struct nouveau_vram_engine {
367 int (*set)(struct drm_device *, enum dcb_gpio_tag, int state); 491 int (*init)(struct drm_device *);
492 int (*get)(struct drm_device *, u64, u32 align, u32 size_nc,
493 u32 type, struct nouveau_mem **);
494 void (*put)(struct drm_device *, struct nouveau_mem **);
368 495
369 void (*irq_enable)(struct drm_device *, enum dcb_gpio_tag, bool on); 496 bool (*flags_valid)(struct drm_device *, u32 tile_flags);
370}; 497};
371 498
372struct nouveau_engine { 499struct nouveau_engine {
@@ -374,10 +501,11 @@ struct nouveau_engine {
374 struct nouveau_mc_engine mc; 501 struct nouveau_mc_engine mc;
375 struct nouveau_timer_engine timer; 502 struct nouveau_timer_engine timer;
376 struct nouveau_fb_engine fb; 503 struct nouveau_fb_engine fb;
377 struct nouveau_pgraph_engine graph;
378 struct nouveau_fifo_engine fifo; 504 struct nouveau_fifo_engine fifo;
379 struct nouveau_display_engine display; 505 struct nouveau_display_engine display;
380 struct nouveau_gpio_engine gpio; 506 struct nouveau_gpio_engine gpio;
507 struct nouveau_pm_engine pm;
508 struct nouveau_vram_engine vram;
381}; 509};
382 510
383struct nouveau_pll_vals { 511struct nouveau_pll_vals {
@@ -409,13 +537,13 @@ enum nv04_fp_display_regs {
409}; 537};
410 538
411struct nv04_crtc_reg { 539struct nv04_crtc_reg {
412 unsigned char MiscOutReg; /* */ 540 unsigned char MiscOutReg;
413 uint8_t CRTC[0xa0]; 541 uint8_t CRTC[0xa0];
414 uint8_t CR58[0x10]; 542 uint8_t CR58[0x10];
415 uint8_t Sequencer[5]; 543 uint8_t Sequencer[5];
416 uint8_t Graphics[9]; 544 uint8_t Graphics[9];
417 uint8_t Attribute[21]; 545 uint8_t Attribute[21];
418 unsigned char DAC[768]; /* Internal Colorlookuptable */ 546 unsigned char DAC[768];
419 547
420 /* PCRTC regs */ 548 /* PCRTC regs */
421 uint32_t fb_start; 549 uint32_t fb_start;
@@ -463,43 +591,9 @@ struct nv04_output_reg {
463}; 591};
464 592
465struct nv04_mode_state { 593struct nv04_mode_state {
466 uint32_t bpp; 594 struct nv04_crtc_reg crtc_reg[2];
467 uint32_t width;
468 uint32_t height;
469 uint32_t interlace;
470 uint32_t repaint0;
471 uint32_t repaint1;
472 uint32_t screen;
473 uint32_t scale;
474 uint32_t dither;
475 uint32_t extra;
476 uint32_t fifo;
477 uint32_t pixel;
478 uint32_t horiz;
479 int arbitration0;
480 int arbitration1;
481 uint32_t pll;
482 uint32_t pllB;
483 uint32_t vpll;
484 uint32_t vpll2;
485 uint32_t vpllB;
486 uint32_t vpll2B;
487 uint32_t pllsel; 595 uint32_t pllsel;
488 uint32_t sel_clk; 596 uint32_t sel_clk;
489 uint32_t general;
490 uint32_t crtcOwner;
491 uint32_t head;
492 uint32_t head2;
493 uint32_t cursorConfig;
494 uint32_t cursor0;
495 uint32_t cursor1;
496 uint32_t cursor2;
497 uint32_t timingH;
498 uint32_t timingV;
499 uint32_t displayV;
500 uint32_t crtcSync;
501
502 struct nv04_crtc_reg crtc_reg[2];
503}; 597};
504 598
505enum nouveau_card_type { 599enum nouveau_card_type {
@@ -519,17 +613,26 @@ struct drm_nouveau_private {
519 enum nouveau_card_type card_type; 613 enum nouveau_card_type card_type;
520 /* exact chipset, derived from NV_PMC_BOOT_0 */ 614 /* exact chipset, derived from NV_PMC_BOOT_0 */
521 int chipset; 615 int chipset;
616 int stepping;
522 int flags; 617 int flags;
523 618
524 void __iomem *mmio; 619 void __iomem *mmio;
620
621 spinlock_t ramin_lock;
525 void __iomem *ramin; 622 void __iomem *ramin;
526 uint32_t ramin_size; 623 u32 ramin_size;
624 u32 ramin_base;
625 bool ramin_available;
626 struct drm_mm ramin_heap;
627 struct nouveau_exec_engine *eng[NVOBJ_ENGINE_NR];
628 struct list_head gpuobj_list;
629 struct list_head classes;
527 630
528 struct nouveau_bo *vga_ram; 631 struct nouveau_bo *vga_ram;
529 632
530 struct workqueue_struct *wq; 633 /* interrupt handling */
531 struct work_struct irq_work; 634 void (*irq_handler[32])(struct drm_device *);
532 struct work_struct hpd_work; 635 bool msi_enabled;
533 636
534 struct list_head vbl_waiting; 637 struct list_head vbl_waiting;
535 638
@@ -540,8 +643,16 @@ struct drm_nouveau_private {
540 atomic_t validate_sequence; 643 atomic_t validate_sequence;
541 } ttm; 644 } ttm;
542 645
543 int fifo_alloc_count; 646 struct {
544 struct nouveau_channel *fifos[NOUVEAU_MAX_CHANNEL_NR]; 647 spinlock_t lock;
648 struct drm_mm heap;
649 struct nouveau_bo *bo;
650 } fence;
651
652 struct {
653 spinlock_t lock;
654 struct nouveau_channel *ptr[NOUVEAU_MAX_CHANNEL_NR];
655 } channels;
545 656
546 struct nouveau_engine engine; 657 struct nouveau_engine engine;
547 struct nouveau_channel *channel; 658 struct nouveau_channel *channel;
@@ -549,30 +660,35 @@ struct drm_nouveau_private {
549 /* For PFIFO and PGRAPH. */ 660 /* For PFIFO and PGRAPH. */
550 spinlock_t context_switch_lock; 661 spinlock_t context_switch_lock;
551 662
663 /* VM/PRAMIN flush, legacy PRAMIN aperture */
664 spinlock_t vm_lock;
665
552 /* RAMIN configuration, RAMFC, RAMHT and RAMRO offsets */ 666 /* RAMIN configuration, RAMFC, RAMHT and RAMRO offsets */
553 struct nouveau_gpuobj *ramht; 667 struct nouveau_ramht *ramht;
668 struct nouveau_gpuobj *ramfc;
669 struct nouveau_gpuobj *ramro;
670
554 uint32_t ramin_rsvd_vram; 671 uint32_t ramin_rsvd_vram;
555 uint32_t ramht_offset;
556 uint32_t ramht_size;
557 uint32_t ramht_bits;
558 uint32_t ramfc_offset;
559 uint32_t ramfc_size;
560 uint32_t ramro_offset;
561 uint32_t ramro_size;
562 672
563 struct { 673 struct {
564 enum { 674 enum {
565 NOUVEAU_GART_NONE = 0, 675 NOUVEAU_GART_NONE = 0,
566 NOUVEAU_GART_AGP, 676 NOUVEAU_GART_AGP, /* AGP */
567 NOUVEAU_GART_SGDMA 677 NOUVEAU_GART_PDMA, /* paged dma object */
678 NOUVEAU_GART_HW /* on-chip gart/vm */
568 } type; 679 } type;
569 uint64_t aper_base; 680 uint64_t aper_base;
570 uint64_t aper_size; 681 uint64_t aper_size;
571 uint64_t aper_free; 682 uint64_t aper_free;
572 683
684 struct ttm_backend_func *func;
685
686 struct {
687 struct page *page;
688 dma_addr_t addr;
689 } dummy;
690
573 struct nouveau_gpuobj *sg_ctxdma; 691 struct nouveau_gpuobj *sg_ctxdma;
574 struct page *sg_dummy_page;
575 dma_addr_t sg_dummy_bus;
576 } gart_info; 692 } gart_info;
577 693
578 /* nv10-nv40 tiling regions */ 694 /* nv10-nv40 tiling regions */
@@ -584,6 +700,7 @@ struct drm_nouveau_private {
584 /* VRAM/fb configuration */ 700 /* VRAM/fb configuration */
585 uint64_t vram_size; 701 uint64_t vram_size;
586 uint64_t vram_sys_base; 702 uint64_t vram_sys_base;
703 u32 vram_rblock_size;
587 704
588 uint64_t fb_phys; 705 uint64_t fb_phys;
589 uint64_t fb_available_size; 706 uint64_t fb_available_size;
@@ -591,18 +708,12 @@ struct drm_nouveau_private {
591 uint64_t fb_aper_free; 708 uint64_t fb_aper_free;
592 int fb_mtrr; 709 int fb_mtrr;
593 710
594 /* G8x/G9x virtual address space */ 711 /* BAR control (NV50-) */
595 uint64_t vm_gart_base; 712 struct nouveau_vm *bar1_vm;
596 uint64_t vm_gart_size; 713 struct nouveau_vm *bar3_vm;
597 uint64_t vm_vram_base;
598 uint64_t vm_vram_size;
599 uint64_t vm_end;
600 struct nouveau_gpuobj *vm_vram_pt[NV50_VM_VRAM_NR];
601 int vm_vram_pt_nr;
602 714
603 struct drm_mm ramin_heap; 715 /* G8x/G9x virtual address space */
604 716 struct nouveau_vm *chan_vm;
605 struct list_head gpuobj_list;
606 717
607 struct nvbios vbios; 718 struct nvbios vbios;
608 719
@@ -612,19 +723,8 @@ struct drm_nouveau_private {
612 uint32_t crtc_owner; 723 uint32_t crtc_owner;
613 uint32_t dac_users[4]; 724 uint32_t dac_users[4];
614 725
615 struct nouveau_suspend_resume {
616 uint32_t *ramin_copy;
617 } susres;
618
619 struct backlight_device *backlight; 726 struct backlight_device *backlight;
620 727
621 struct nouveau_channel *evo;
622 struct {
623 struct dcb_entry *dcb;
624 u16 script;
625 u32 pclk;
626 } evo_irq;
627
628 struct { 728 struct {
629 struct dentry *channel_root; 729 struct dentry *channel_root;
630 } debugfs; 730 } debugfs;
@@ -634,6 +734,12 @@ struct drm_nouveau_private {
634}; 734};
635 735
636static inline struct drm_nouveau_private * 736static inline struct drm_nouveau_private *
737nouveau_private(struct drm_device *dev)
738{
739 return dev->dev_private;
740}
741
742static inline struct drm_nouveau_private *
637nouveau_bdev(struct ttm_bo_device *bd) 743nouveau_bdev(struct ttm_bo_device *bd)
638{ 744{
639 return container_of(bd, struct drm_nouveau_private, ttm.bdev); 745 return container_of(bd, struct drm_nouveau_private, ttm.bdev);
@@ -658,18 +764,8 @@ nouveau_bo_ref(struct nouveau_bo *ref, struct nouveau_bo **pnvbo)
658 return 0; 764 return 0;
659} 765}
660 766
661#define NOUVEAU_GET_USER_CHANNEL_WITH_RETURN(id, cl, ch) do { \
662 struct drm_nouveau_private *nv = dev->dev_private; \
663 if (!nouveau_channel_owner(dev, (cl), (id))) { \
664 NV_ERROR(dev, "pid %d doesn't own channel %d\n", \
665 DRM_CURRENTPID, (id)); \
666 return -EPERM; \
667 } \
668 (ch) = nv->fifos[(id)]; \
669} while (0)
670
671/* nouveau_drv.c */ 767/* nouveau_drv.c */
672extern int nouveau_noagp; 768extern int nouveau_agpmode;
673extern int nouveau_duallink; 769extern int nouveau_duallink;
674extern int nouveau_uscript_lvds; 770extern int nouveau_uscript_lvds;
675extern int nouveau_uscript_tmds; 771extern int nouveau_uscript_tmds;
@@ -683,7 +779,11 @@ extern char *nouveau_vbios;
683extern int nouveau_ignorelid; 779extern int nouveau_ignorelid;
684extern int nouveau_nofbaccel; 780extern int nouveau_nofbaccel;
685extern int nouveau_noaccel; 781extern int nouveau_noaccel;
782extern int nouveau_force_post;
686extern int nouveau_override_conntype; 783extern int nouveau_override_conntype;
784extern char *nouveau_perflvl;
785extern int nouveau_perflvl_wr;
786extern int nouveau_msi;
687 787
688extern int nouveau_pci_suspend(struct pci_dev *pdev, pm_message_t pm_state); 788extern int nouveau_pci_suspend(struct pci_dev *pdev, pm_message_t pm_state);
689extern int nouveau_pci_resume(struct pci_dev *pdev); 789extern int nouveau_pci_resume(struct pci_dev *pdev);
@@ -698,35 +798,38 @@ extern int nouveau_ioctl_getparam(struct drm_device *, void *data,
698 struct drm_file *); 798 struct drm_file *);
699extern int nouveau_ioctl_setparam(struct drm_device *, void *data, 799extern int nouveau_ioctl_setparam(struct drm_device *, void *data,
700 struct drm_file *); 800 struct drm_file *);
701extern bool nouveau_wait_until(struct drm_device *, uint64_t timeout, 801extern bool nouveau_wait_eq(struct drm_device *, uint64_t timeout,
702 uint32_t reg, uint32_t mask, uint32_t val); 802 uint32_t reg, uint32_t mask, uint32_t val);
803extern bool nouveau_wait_ne(struct drm_device *, uint64_t timeout,
804 uint32_t reg, uint32_t mask, uint32_t val);
703extern bool nouveau_wait_for_idle(struct drm_device *); 805extern bool nouveau_wait_for_idle(struct drm_device *);
704extern int nouveau_card_init(struct drm_device *); 806extern int nouveau_card_init(struct drm_device *);
705 807
706/* nouveau_mem.c */ 808/* nouveau_mem.c */
707extern int nouveau_mem_detect(struct drm_device *dev); 809extern int nouveau_mem_vram_init(struct drm_device *);
708extern int nouveau_mem_init(struct drm_device *); 810extern void nouveau_mem_vram_fini(struct drm_device *);
811extern int nouveau_mem_gart_init(struct drm_device *);
812extern void nouveau_mem_gart_fini(struct drm_device *);
709extern int nouveau_mem_init_agp(struct drm_device *); 813extern int nouveau_mem_init_agp(struct drm_device *);
710extern int nouveau_mem_reset_agp(struct drm_device *); 814extern int nouveau_mem_reset_agp(struct drm_device *);
711extern void nouveau_mem_close(struct drm_device *); 815extern void nouveau_mem_close(struct drm_device *);
712extern struct nouveau_tile_reg *nv10_mem_set_tiling(struct drm_device *dev, 816extern int nouveau_mem_detect(struct drm_device *);
713 uint32_t addr, 817extern bool nouveau_mem_flags_valid(struct drm_device *, u32 tile_flags);
714 uint32_t size, 818extern struct nouveau_tile_reg *nv10_mem_set_tiling(
715 uint32_t pitch); 819 struct drm_device *dev, uint32_t addr, uint32_t size,
716extern void nv10_mem_expire_tiling(struct drm_device *dev, 820 uint32_t pitch, uint32_t flags);
717 struct nouveau_tile_reg *tile, 821extern void nv10_mem_put_tile_region(struct drm_device *dev,
718 struct nouveau_fence *fence); 822 struct nouveau_tile_reg *tile,
719extern int nv50_mem_vm_bind_linear(struct drm_device *, uint64_t virt, 823 struct nouveau_fence *fence);
720 uint32_t size, uint32_t flags, 824extern const struct ttm_mem_type_manager_func nouveau_vram_manager;
721 uint64_t phys); 825extern const struct ttm_mem_type_manager_func nouveau_gart_manager;
722extern void nv50_mem_vm_unbind(struct drm_device *, uint64_t virt,
723 uint32_t size);
724 826
725/* nouveau_notifier.c */ 827/* nouveau_notifier.c */
726extern int nouveau_notifier_init_channel(struct nouveau_channel *); 828extern int nouveau_notifier_init_channel(struct nouveau_channel *);
727extern void nouveau_notifier_takedown_channel(struct nouveau_channel *); 829extern void nouveau_notifier_takedown_channel(struct nouveau_channel *);
728extern int nouveau_notifier_alloc(struct nouveau_channel *, uint32_t handle, 830extern int nouveau_notifier_alloc(struct nouveau_channel *, uint32_t handle,
729 int cout, uint32_t *offset); 831 int cout, uint32_t start, uint32_t end,
832 uint32_t *offset);
730extern int nouveau_notifier_offset(struct nouveau_gpuobj *, uint32_t *); 833extern int nouveau_notifier_offset(struct nouveau_gpuobj *, uint32_t *);
731extern int nouveau_ioctl_notifier_alloc(struct drm_device *, void *data, 834extern int nouveau_ioctl_notifier_alloc(struct drm_device *, void *data,
732 struct drm_file *); 835 struct drm_file *);
@@ -737,64 +840,87 @@ extern int nouveau_ioctl_notifier_free(struct drm_device *, void *data,
737extern struct drm_ioctl_desc nouveau_ioctls[]; 840extern struct drm_ioctl_desc nouveau_ioctls[];
738extern int nouveau_max_ioctl; 841extern int nouveau_max_ioctl;
739extern void nouveau_channel_cleanup(struct drm_device *, struct drm_file *); 842extern void nouveau_channel_cleanup(struct drm_device *, struct drm_file *);
740extern int nouveau_channel_owner(struct drm_device *, struct drm_file *,
741 int channel);
742extern int nouveau_channel_alloc(struct drm_device *dev, 843extern int nouveau_channel_alloc(struct drm_device *dev,
743 struct nouveau_channel **chan, 844 struct nouveau_channel **chan,
744 struct drm_file *file_priv, 845 struct drm_file *file_priv,
745 uint32_t fb_ctxdma, uint32_t tt_ctxdma); 846 uint32_t fb_ctxdma, uint32_t tt_ctxdma);
746extern void nouveau_channel_free(struct nouveau_channel *); 847extern struct nouveau_channel *
848nouveau_channel_get_unlocked(struct nouveau_channel *);
849extern struct nouveau_channel *
850nouveau_channel_get(struct drm_device *, struct drm_file *, int id);
851extern void nouveau_channel_put_unlocked(struct nouveau_channel **);
852extern void nouveau_channel_put(struct nouveau_channel **);
853extern void nouveau_channel_ref(struct nouveau_channel *chan,
854 struct nouveau_channel **pchan);
855extern void nouveau_channel_idle(struct nouveau_channel *chan);
747 856
748/* nouveau_object.c */ 857/* nouveau_object.c */
858#define NVOBJ_ENGINE_ADD(d, e, p) do { \
859 struct drm_nouveau_private *dev_priv = (d)->dev_private; \
860 dev_priv->eng[NVOBJ_ENGINE_##e] = (p); \
861} while (0)
862
863#define NVOBJ_ENGINE_DEL(d, e) do { \
864 struct drm_nouveau_private *dev_priv = (d)->dev_private; \
865 dev_priv->eng[NVOBJ_ENGINE_##e] = NULL; \
866} while (0)
867
868#define NVOBJ_CLASS(d, c, e) do { \
869 int ret = nouveau_gpuobj_class_new((d), (c), NVOBJ_ENGINE_##e); \
870 if (ret) \
871 return ret; \
872} while (0)
873
874#define NVOBJ_MTHD(d, c, m, e) do { \
875 int ret = nouveau_gpuobj_mthd_new((d), (c), (m), (e)); \
876 if (ret) \
877 return ret; \
878} while (0)
879
749extern int nouveau_gpuobj_early_init(struct drm_device *); 880extern int nouveau_gpuobj_early_init(struct drm_device *);
750extern int nouveau_gpuobj_init(struct drm_device *); 881extern int nouveau_gpuobj_init(struct drm_device *);
751extern void nouveau_gpuobj_takedown(struct drm_device *); 882extern void nouveau_gpuobj_takedown(struct drm_device *);
752extern void nouveau_gpuobj_late_takedown(struct drm_device *);
753extern int nouveau_gpuobj_suspend(struct drm_device *dev); 883extern int nouveau_gpuobj_suspend(struct drm_device *dev);
754extern void nouveau_gpuobj_suspend_cleanup(struct drm_device *dev);
755extern void nouveau_gpuobj_resume(struct drm_device *dev); 884extern void nouveau_gpuobj_resume(struct drm_device *dev);
885extern int nouveau_gpuobj_class_new(struct drm_device *, u32 class, u32 eng);
886extern int nouveau_gpuobj_mthd_new(struct drm_device *, u32 class, u32 mthd,
887 int (*exec)(struct nouveau_channel *,
888 u32 class, u32 mthd, u32 data));
889extern int nouveau_gpuobj_mthd_call(struct nouveau_channel *, u32, u32, u32);
890extern int nouveau_gpuobj_mthd_call2(struct drm_device *, int, u32, u32, u32);
756extern int nouveau_gpuobj_channel_init(struct nouveau_channel *, 891extern int nouveau_gpuobj_channel_init(struct nouveau_channel *,
757 uint32_t vram_h, uint32_t tt_h); 892 uint32_t vram_h, uint32_t tt_h);
758extern void nouveau_gpuobj_channel_takedown(struct nouveau_channel *); 893extern void nouveau_gpuobj_channel_takedown(struct nouveau_channel *);
759extern int nouveau_gpuobj_new(struct drm_device *, struct nouveau_channel *, 894extern int nouveau_gpuobj_new(struct drm_device *, struct nouveau_channel *,
760 uint32_t size, int align, uint32_t flags, 895 uint32_t size, int align, uint32_t flags,
761 struct nouveau_gpuobj **); 896 struct nouveau_gpuobj **);
762extern int nouveau_gpuobj_del(struct drm_device *, struct nouveau_gpuobj **); 897extern void nouveau_gpuobj_ref(struct nouveau_gpuobj *,
763extern int nouveau_gpuobj_ref_add(struct drm_device *, struct nouveau_channel *, 898 struct nouveau_gpuobj **);
764 uint32_t handle, struct nouveau_gpuobj *, 899extern int nouveau_gpuobj_new_fake(struct drm_device *, u32 pinst, u64 vinst,
765 struct nouveau_gpuobj_ref **); 900 u32 size, u32 flags,
766extern int nouveau_gpuobj_ref_del(struct drm_device *, 901 struct nouveau_gpuobj **);
767 struct nouveau_gpuobj_ref **);
768extern int nouveau_gpuobj_ref_find(struct nouveau_channel *, uint32_t handle,
769 struct nouveau_gpuobj_ref **ref_ret);
770extern int nouveau_gpuobj_new_ref(struct drm_device *,
771 struct nouveau_channel *alloc_chan,
772 struct nouveau_channel *ref_chan,
773 uint32_t handle, uint32_t size, int align,
774 uint32_t flags, struct nouveau_gpuobj_ref **);
775extern int nouveau_gpuobj_new_fake(struct drm_device *,
776 uint32_t p_offset, uint32_t b_offset,
777 uint32_t size, uint32_t flags,
778 struct nouveau_gpuobj **,
779 struct nouveau_gpuobj_ref**);
780extern int nouveau_gpuobj_dma_new(struct nouveau_channel *, int class, 902extern int nouveau_gpuobj_dma_new(struct nouveau_channel *, int class,
781 uint64_t offset, uint64_t size, int access, 903 uint64_t offset, uint64_t size, int access,
782 int target, struct nouveau_gpuobj **); 904 int target, struct nouveau_gpuobj **);
783extern int nouveau_gpuobj_gart_dma_new(struct nouveau_channel *, 905extern int nouveau_gpuobj_gr_new(struct nouveau_channel *, u32 handle, int class);
784 uint64_t offset, uint64_t size, 906extern int nv50_gpuobj_dma_new(struct nouveau_channel *, int class, u64 base,
785 int access, struct nouveau_gpuobj **, 907 u64 size, int target, int access, u32 type,
786 uint32_t *o_ret); 908 u32 comp, struct nouveau_gpuobj **pobj);
787extern int nouveau_gpuobj_gr_new(struct nouveau_channel *, int class, 909extern void nv50_gpuobj_dma_init(struct nouveau_gpuobj *, u32 offset,
788 struct nouveau_gpuobj **); 910 int class, u64 base, u64 size, int target,
789extern int nouveau_gpuobj_sw_new(struct nouveau_channel *, int class, 911 int access, u32 type, u32 comp);
790 struct nouveau_gpuobj **);
791extern int nouveau_ioctl_grobj_alloc(struct drm_device *, void *data, 912extern int nouveau_ioctl_grobj_alloc(struct drm_device *, void *data,
792 struct drm_file *); 913 struct drm_file *);
793extern int nouveau_ioctl_gpuobj_free(struct drm_device *, void *data, 914extern int nouveau_ioctl_gpuobj_free(struct drm_device *, void *data,
794 struct drm_file *); 915 struct drm_file *);
795 916
796/* nouveau_irq.c */ 917/* nouveau_irq.c */
918extern int nouveau_irq_init(struct drm_device *);
919extern void nouveau_irq_fini(struct drm_device *);
797extern irqreturn_t nouveau_irq_handler(DRM_IRQ_ARGS); 920extern irqreturn_t nouveau_irq_handler(DRM_IRQ_ARGS);
921extern void nouveau_irq_register(struct drm_device *, int status_bit,
922 void (*)(struct drm_device *));
923extern void nouveau_irq_unregister(struct drm_device *, int status_bit);
798extern void nouveau_irq_preinstall(struct drm_device *); 924extern void nouveau_irq_preinstall(struct drm_device *);
799extern int nouveau_irq_postinstall(struct drm_device *); 925extern int nouveau_irq_postinstall(struct drm_device *);
800extern void nouveau_irq_uninstall(struct drm_device *); 926extern void nouveau_irq_uninstall(struct drm_device *);
@@ -802,8 +928,8 @@ extern void nouveau_irq_uninstall(struct drm_device *);
802/* nouveau_sgdma.c */ 928/* nouveau_sgdma.c */
803extern int nouveau_sgdma_init(struct drm_device *); 929extern int nouveau_sgdma_init(struct drm_device *);
804extern void nouveau_sgdma_takedown(struct drm_device *); 930extern void nouveau_sgdma_takedown(struct drm_device *);
805extern int nouveau_sgdma_get_page(struct drm_device *, uint32_t offset, 931extern uint32_t nouveau_sgdma_get_physical(struct drm_device *,
806 uint32_t *page); 932 uint32_t offset);
807extern struct ttm_backend *nouveau_sgdma_init_ttm(struct drm_device *); 933extern struct ttm_backend *nouveau_sgdma_init_ttm(struct drm_device *);
808 934
809/* nouveau_debugfs.c */ 935/* nouveau_debugfs.c */
@@ -858,15 +984,15 @@ static inline int nouveau_acpi_edid(struct drm_device *dev, struct drm_connector
858 984
859/* nouveau_backlight.c */ 985/* nouveau_backlight.c */
860#ifdef CONFIG_DRM_NOUVEAU_BACKLIGHT 986#ifdef CONFIG_DRM_NOUVEAU_BACKLIGHT
861extern int nouveau_backlight_init(struct drm_device *); 987extern int nouveau_backlight_init(struct drm_connector *);
862extern void nouveau_backlight_exit(struct drm_device *); 988extern void nouveau_backlight_exit(struct drm_connector *);
863#else 989#else
864static inline int nouveau_backlight_init(struct drm_device *dev) 990static inline int nouveau_backlight_init(struct drm_connector *dev)
865{ 991{
866 return 0; 992 return 0;
867} 993}
868 994
869static inline void nouveau_backlight_exit(struct drm_device *dev) { } 995static inline void nouveau_backlight_exit(struct drm_connector *dev) { }
870#endif 996#endif
871 997
872/* nouveau_bios.c */ 998/* nouveau_bios.c */
@@ -879,6 +1005,7 @@ extern struct dcb_gpio_entry *nouveau_bios_gpio_entry(struct drm_device *,
879 enum dcb_gpio_tag); 1005 enum dcb_gpio_tag);
880extern struct dcb_connector_table_entry * 1006extern struct dcb_connector_table_entry *
881nouveau_bios_connector_entry(struct drm_device *, int index); 1007nouveau_bios_connector_entry(struct drm_device *, int index);
1008extern u32 get_pll_register(struct drm_device *, enum pll_types);
882extern int get_pll_limits(struct drm_device *, uint32_t limit_match, 1009extern int get_pll_limits(struct drm_device *, uint32_t limit_match,
883 struct pll_lims *); 1010 struct pll_lims *);
884extern int nouveau_bios_run_display_table(struct drm_device *, 1011extern int nouveau_bios_run_display_table(struct drm_device *,
@@ -913,22 +1040,29 @@ extern void nv04_fb_takedown(struct drm_device *);
913/* nv10_fb.c */ 1040/* nv10_fb.c */
914extern int nv10_fb_init(struct drm_device *); 1041extern int nv10_fb_init(struct drm_device *);
915extern void nv10_fb_takedown(struct drm_device *); 1042extern void nv10_fb_takedown(struct drm_device *);
916extern void nv10_fb_set_region_tiling(struct drm_device *, int, uint32_t, 1043extern void nv10_fb_init_tile_region(struct drm_device *dev, int i,
917 uint32_t, uint32_t); 1044 uint32_t addr, uint32_t size,
1045 uint32_t pitch, uint32_t flags);
1046extern void nv10_fb_set_tile_region(struct drm_device *dev, int i);
1047extern void nv10_fb_free_tile_region(struct drm_device *dev, int i);
918 1048
919/* nv30_fb.c */ 1049/* nv30_fb.c */
920extern int nv30_fb_init(struct drm_device *); 1050extern int nv30_fb_init(struct drm_device *);
921extern void nv30_fb_takedown(struct drm_device *); 1051extern void nv30_fb_takedown(struct drm_device *);
1052extern void nv30_fb_init_tile_region(struct drm_device *dev, int i,
1053 uint32_t addr, uint32_t size,
1054 uint32_t pitch, uint32_t flags);
1055extern void nv30_fb_free_tile_region(struct drm_device *dev, int i);
922 1056
923/* nv40_fb.c */ 1057/* nv40_fb.c */
924extern int nv40_fb_init(struct drm_device *); 1058extern int nv40_fb_init(struct drm_device *);
925extern void nv40_fb_takedown(struct drm_device *); 1059extern void nv40_fb_takedown(struct drm_device *);
926extern void nv40_fb_set_region_tiling(struct drm_device *, int, uint32_t, 1060extern void nv40_fb_set_tile_region(struct drm_device *dev, int i);
927 uint32_t, uint32_t);
928 1061
929/* nv50_fb.c */ 1062/* nv50_fb.c */
930extern int nv50_fb_init(struct drm_device *); 1063extern int nv50_fb_init(struct drm_device *);
931extern void nv50_fb_takedown(struct drm_device *); 1064extern void nv50_fb_takedown(struct drm_device *);
1065extern void nv50_fb_vm_trap(struct drm_device *, int display);
932 1066
933/* nvc0_fb.c */ 1067/* nvc0_fb.c */
934extern int nvc0_fb_init(struct drm_device *); 1068extern int nvc0_fb_init(struct drm_device *);
@@ -936,29 +1070,28 @@ extern void nvc0_fb_takedown(struct drm_device *);
936 1070
937/* nv04_fifo.c */ 1071/* nv04_fifo.c */
938extern int nv04_fifo_init(struct drm_device *); 1072extern int nv04_fifo_init(struct drm_device *);
1073extern void nv04_fifo_fini(struct drm_device *);
939extern void nv04_fifo_disable(struct drm_device *); 1074extern void nv04_fifo_disable(struct drm_device *);
940extern void nv04_fifo_enable(struct drm_device *); 1075extern void nv04_fifo_enable(struct drm_device *);
941extern bool nv04_fifo_reassign(struct drm_device *, bool); 1076extern bool nv04_fifo_reassign(struct drm_device *, bool);
942extern bool nv04_fifo_cache_flush(struct drm_device *);
943extern bool nv04_fifo_cache_pull(struct drm_device *, bool); 1077extern bool nv04_fifo_cache_pull(struct drm_device *, bool);
944extern int nv04_fifo_channel_id(struct drm_device *); 1078extern int nv04_fifo_channel_id(struct drm_device *);
945extern int nv04_fifo_create_context(struct nouveau_channel *); 1079extern int nv04_fifo_create_context(struct nouveau_channel *);
946extern void nv04_fifo_destroy_context(struct nouveau_channel *); 1080extern void nv04_fifo_destroy_context(struct nouveau_channel *);
947extern int nv04_fifo_load_context(struct nouveau_channel *); 1081extern int nv04_fifo_load_context(struct nouveau_channel *);
948extern int nv04_fifo_unload_context(struct drm_device *); 1082extern int nv04_fifo_unload_context(struct drm_device *);
1083extern void nv04_fifo_isr(struct drm_device *);
949 1084
950/* nv10_fifo.c */ 1085/* nv10_fifo.c */
951extern int nv10_fifo_init(struct drm_device *); 1086extern int nv10_fifo_init(struct drm_device *);
952extern int nv10_fifo_channel_id(struct drm_device *); 1087extern int nv10_fifo_channel_id(struct drm_device *);
953extern int nv10_fifo_create_context(struct nouveau_channel *); 1088extern int nv10_fifo_create_context(struct nouveau_channel *);
954extern void nv10_fifo_destroy_context(struct nouveau_channel *);
955extern int nv10_fifo_load_context(struct nouveau_channel *); 1089extern int nv10_fifo_load_context(struct nouveau_channel *);
956extern int nv10_fifo_unload_context(struct drm_device *); 1090extern int nv10_fifo_unload_context(struct drm_device *);
957 1091
958/* nv40_fifo.c */ 1092/* nv40_fifo.c */
959extern int nv40_fifo_init(struct drm_device *); 1093extern int nv40_fifo_init(struct drm_device *);
960extern int nv40_fifo_create_context(struct nouveau_channel *); 1094extern int nv40_fifo_create_context(struct nouveau_channel *);
961extern void nv40_fifo_destroy_context(struct nouveau_channel *);
962extern int nv40_fifo_load_context(struct nouveau_channel *); 1095extern int nv40_fifo_load_context(struct nouveau_channel *);
963extern int nv40_fifo_unload_context(struct drm_device *); 1096extern int nv40_fifo_unload_context(struct drm_device *);
964 1097
@@ -970,6 +1103,7 @@ extern int nv50_fifo_create_context(struct nouveau_channel *);
970extern void nv50_fifo_destroy_context(struct nouveau_channel *); 1103extern void nv50_fifo_destroy_context(struct nouveau_channel *);
971extern int nv50_fifo_load_context(struct nouveau_channel *); 1104extern int nv50_fifo_load_context(struct nouveau_channel *);
972extern int nv50_fifo_unload_context(struct drm_device *); 1105extern int nv50_fifo_unload_context(struct drm_device *);
1106extern void nv50_fifo_tlb_flush(struct drm_device *dev);
973 1107
974/* nvc0_fifo.c */ 1108/* nvc0_fifo.c */
975extern int nvc0_fifo_init(struct drm_device *); 1109extern int nvc0_fifo_init(struct drm_device *);
@@ -977,7 +1111,6 @@ extern void nvc0_fifo_takedown(struct drm_device *);
977extern void nvc0_fifo_disable(struct drm_device *); 1111extern void nvc0_fifo_disable(struct drm_device *);
978extern void nvc0_fifo_enable(struct drm_device *); 1112extern void nvc0_fifo_enable(struct drm_device *);
979extern bool nvc0_fifo_reassign(struct drm_device *, bool); 1113extern bool nvc0_fifo_reassign(struct drm_device *, bool);
980extern bool nvc0_fifo_cache_flush(struct drm_device *);
981extern bool nvc0_fifo_cache_pull(struct drm_device *, bool); 1114extern bool nvc0_fifo_cache_pull(struct drm_device *, bool);
982extern int nvc0_fifo_channel_id(struct drm_device *); 1115extern int nvc0_fifo_channel_id(struct drm_device *);
983extern int nvc0_fifo_create_context(struct nouveau_channel *); 1116extern int nvc0_fifo_create_context(struct nouveau_channel *);
@@ -986,89 +1119,60 @@ extern int nvc0_fifo_load_context(struct nouveau_channel *);
986extern int nvc0_fifo_unload_context(struct drm_device *); 1119extern int nvc0_fifo_unload_context(struct drm_device *);
987 1120
988/* nv04_graph.c */ 1121/* nv04_graph.c */
989extern struct nouveau_pgraph_object_class nv04_graph_grclass[]; 1122extern int nv04_graph_create(struct drm_device *);
990extern int nv04_graph_init(struct drm_device *);
991extern void nv04_graph_takedown(struct drm_device *);
992extern void nv04_graph_fifo_access(struct drm_device *, bool); 1123extern void nv04_graph_fifo_access(struct drm_device *, bool);
993extern struct nouveau_channel *nv04_graph_channel(struct drm_device *); 1124extern int nv04_graph_object_new(struct nouveau_channel *, int, u32, u16);
994extern int nv04_graph_create_context(struct nouveau_channel *); 1125extern int nv04_graph_mthd_page_flip(struct nouveau_channel *chan,
995extern void nv04_graph_destroy_context(struct nouveau_channel *); 1126 u32 class, u32 mthd, u32 data);
996extern int nv04_graph_load_context(struct nouveau_channel *); 1127extern struct nouveau_bitfield nv04_graph_nsource[];
997extern int nv04_graph_unload_context(struct drm_device *);
998extern void nv04_graph_context_switch(struct drm_device *);
999 1128
1000/* nv10_graph.c */ 1129/* nv10_graph.c */
1001extern struct nouveau_pgraph_object_class nv10_graph_grclass[]; 1130extern int nv10_graph_create(struct drm_device *);
1002extern int nv10_graph_init(struct drm_device *);
1003extern void nv10_graph_takedown(struct drm_device *);
1004extern struct nouveau_channel *nv10_graph_channel(struct drm_device *); 1131extern struct nouveau_channel *nv10_graph_channel(struct drm_device *);
1005extern int nv10_graph_create_context(struct nouveau_channel *); 1132extern struct nouveau_bitfield nv10_graph_intr[];
1006extern void nv10_graph_destroy_context(struct nouveau_channel *); 1133extern struct nouveau_bitfield nv10_graph_nstatus[];
1007extern int nv10_graph_load_context(struct nouveau_channel *);
1008extern int nv10_graph_unload_context(struct drm_device *);
1009extern void nv10_graph_context_switch(struct drm_device *);
1010extern void nv10_graph_set_region_tiling(struct drm_device *, int, uint32_t,
1011 uint32_t, uint32_t);
1012 1134
1013/* nv20_graph.c */ 1135/* nv20_graph.c */
1014extern struct nouveau_pgraph_object_class nv20_graph_grclass[]; 1136extern int nv20_graph_create(struct drm_device *);
1015extern struct nouveau_pgraph_object_class nv30_graph_grclass[];
1016extern int nv20_graph_create_context(struct nouveau_channel *);
1017extern void nv20_graph_destroy_context(struct nouveau_channel *);
1018extern int nv20_graph_load_context(struct nouveau_channel *);
1019extern int nv20_graph_unload_context(struct drm_device *);
1020extern int nv20_graph_init(struct drm_device *);
1021extern void nv20_graph_takedown(struct drm_device *);
1022extern int nv30_graph_init(struct drm_device *);
1023extern void nv20_graph_set_region_tiling(struct drm_device *, int, uint32_t,
1024 uint32_t, uint32_t);
1025 1137
1026/* nv40_graph.c */ 1138/* nv40_graph.c */
1027extern struct nouveau_pgraph_object_class nv40_graph_grclass[]; 1139extern int nv40_graph_create(struct drm_device *);
1028extern int nv40_graph_init(struct drm_device *);
1029extern void nv40_graph_takedown(struct drm_device *);
1030extern struct nouveau_channel *nv40_graph_channel(struct drm_device *);
1031extern int nv40_graph_create_context(struct nouveau_channel *);
1032extern void nv40_graph_destroy_context(struct nouveau_channel *);
1033extern int nv40_graph_load_context(struct nouveau_channel *);
1034extern int nv40_graph_unload_context(struct drm_device *);
1035extern void nv40_grctx_init(struct nouveau_grctx *); 1140extern void nv40_grctx_init(struct nouveau_grctx *);
1036extern void nv40_graph_set_region_tiling(struct drm_device *, int, uint32_t,
1037 uint32_t, uint32_t);
1038 1141
1039/* nv50_graph.c */ 1142/* nv50_graph.c */
1040extern struct nouveau_pgraph_object_class nv50_graph_grclass[]; 1143extern int nv50_graph_create(struct drm_device *);
1041extern int nv50_graph_init(struct drm_device *);
1042extern void nv50_graph_takedown(struct drm_device *);
1043extern void nv50_graph_fifo_access(struct drm_device *, bool);
1044extern struct nouveau_channel *nv50_graph_channel(struct drm_device *);
1045extern int nv50_graph_create_context(struct nouveau_channel *);
1046extern void nv50_graph_destroy_context(struct nouveau_channel *);
1047extern int nv50_graph_load_context(struct nouveau_channel *);
1048extern int nv50_graph_unload_context(struct drm_device *);
1049extern void nv50_graph_context_switch(struct drm_device *);
1050extern int nv50_grctx_init(struct nouveau_grctx *); 1144extern int nv50_grctx_init(struct nouveau_grctx *);
1145extern struct nouveau_enum nv50_data_error_names[];
1146extern int nv50_graph_isr_chid(struct drm_device *dev, u64 inst);
1051 1147
1052/* nvc0_graph.c */ 1148/* nvc0_graph.c */
1053extern int nvc0_graph_init(struct drm_device *); 1149extern int nvc0_graph_create(struct drm_device *);
1054extern void nvc0_graph_takedown(struct drm_device *); 1150extern int nvc0_graph_isr_chid(struct drm_device *dev, u64 inst);
1055extern void nvc0_graph_fifo_access(struct drm_device *, bool); 1151
1056extern struct nouveau_channel *nvc0_graph_channel(struct drm_device *); 1152/* nv84_crypt.c */
1057extern int nvc0_graph_create_context(struct nouveau_channel *); 1153extern int nv84_crypt_create(struct drm_device *);
1058extern void nvc0_graph_destroy_context(struct nouveau_channel *); 1154
1059extern int nvc0_graph_load_context(struct nouveau_channel *); 1155/* nva3_copy.c */
1060extern int nvc0_graph_unload_context(struct drm_device *); 1156extern int nva3_copy_create(struct drm_device *dev);
1157
1158/* nvc0_copy.c */
1159extern int nvc0_copy_create(struct drm_device *dev, int engine);
1160
1161/* nv40_mpeg.c */
1162extern int nv40_mpeg_create(struct drm_device *dev);
1163
1164/* nv50_mpeg.c */
1165extern int nv50_mpeg_create(struct drm_device *dev);
1061 1166
1062/* nv04_instmem.c */ 1167/* nv04_instmem.c */
1063extern int nv04_instmem_init(struct drm_device *); 1168extern int nv04_instmem_init(struct drm_device *);
1064extern void nv04_instmem_takedown(struct drm_device *); 1169extern void nv04_instmem_takedown(struct drm_device *);
1065extern int nv04_instmem_suspend(struct drm_device *); 1170extern int nv04_instmem_suspend(struct drm_device *);
1066extern void nv04_instmem_resume(struct drm_device *); 1171extern void nv04_instmem_resume(struct drm_device *);
1067extern int nv04_instmem_populate(struct drm_device *, struct nouveau_gpuobj *, 1172extern int nv04_instmem_get(struct nouveau_gpuobj *, u32 size, u32 align);
1068 uint32_t *size); 1173extern void nv04_instmem_put(struct nouveau_gpuobj *);
1069extern void nv04_instmem_clear(struct drm_device *, struct nouveau_gpuobj *); 1174extern int nv04_instmem_map(struct nouveau_gpuobj *);
1070extern int nv04_instmem_bind(struct drm_device *, struct nouveau_gpuobj *); 1175extern void nv04_instmem_unmap(struct nouveau_gpuobj *);
1071extern int nv04_instmem_unbind(struct drm_device *, struct nouveau_gpuobj *);
1072extern void nv04_instmem_flush(struct drm_device *); 1176extern void nv04_instmem_flush(struct drm_device *);
1073 1177
1074/* nv50_instmem.c */ 1178/* nv50_instmem.c */
@@ -1076,26 +1180,18 @@ extern int nv50_instmem_init(struct drm_device *);
1076extern void nv50_instmem_takedown(struct drm_device *); 1180extern void nv50_instmem_takedown(struct drm_device *);
1077extern int nv50_instmem_suspend(struct drm_device *); 1181extern int nv50_instmem_suspend(struct drm_device *);
1078extern void nv50_instmem_resume(struct drm_device *); 1182extern void nv50_instmem_resume(struct drm_device *);
1079extern int nv50_instmem_populate(struct drm_device *, struct nouveau_gpuobj *, 1183extern int nv50_instmem_get(struct nouveau_gpuobj *, u32 size, u32 align);
1080 uint32_t *size); 1184extern void nv50_instmem_put(struct nouveau_gpuobj *);
1081extern void nv50_instmem_clear(struct drm_device *, struct nouveau_gpuobj *); 1185extern int nv50_instmem_map(struct nouveau_gpuobj *);
1082extern int nv50_instmem_bind(struct drm_device *, struct nouveau_gpuobj *); 1186extern void nv50_instmem_unmap(struct nouveau_gpuobj *);
1083extern int nv50_instmem_unbind(struct drm_device *, struct nouveau_gpuobj *);
1084extern void nv50_instmem_flush(struct drm_device *); 1187extern void nv50_instmem_flush(struct drm_device *);
1085extern void nv84_instmem_flush(struct drm_device *); 1188extern void nv84_instmem_flush(struct drm_device *);
1086extern void nv50_vm_flush(struct drm_device *, int engine);
1087 1189
1088/* nvc0_instmem.c */ 1190/* nvc0_instmem.c */
1089extern int nvc0_instmem_init(struct drm_device *); 1191extern int nvc0_instmem_init(struct drm_device *);
1090extern void nvc0_instmem_takedown(struct drm_device *); 1192extern void nvc0_instmem_takedown(struct drm_device *);
1091extern int nvc0_instmem_suspend(struct drm_device *); 1193extern int nvc0_instmem_suspend(struct drm_device *);
1092extern void nvc0_instmem_resume(struct drm_device *); 1194extern void nvc0_instmem_resume(struct drm_device *);
1093extern int nvc0_instmem_populate(struct drm_device *, struct nouveau_gpuobj *,
1094 uint32_t *size);
1095extern void nvc0_instmem_clear(struct drm_device *, struct nouveau_gpuobj *);
1096extern int nvc0_instmem_bind(struct drm_device *, struct nouveau_gpuobj *);
1097extern int nvc0_instmem_unbind(struct drm_device *, struct nouveau_gpuobj *);
1098extern void nvc0_instmem_flush(struct drm_device *);
1099 1195
1100/* nv04_mc.c */ 1196/* nv04_mc.c */
1101extern int nv04_mc_init(struct drm_device *); 1197extern int nv04_mc_init(struct drm_device *);
@@ -1154,7 +1250,7 @@ extern struct ttm_bo_driver nouveau_bo_driver;
1154extern int nouveau_bo_new(struct drm_device *, struct nouveau_channel *, 1250extern int nouveau_bo_new(struct drm_device *, struct nouveau_channel *,
1155 int size, int align, uint32_t flags, 1251 int size, int align, uint32_t flags,
1156 uint32_t tile_mode, uint32_t tile_flags, 1252 uint32_t tile_mode, uint32_t tile_flags,
1157 bool no_vm, bool mappable, struct nouveau_bo **); 1253 struct nouveau_bo **);
1158extern int nouveau_bo_pin(struct nouveau_bo *, uint32_t flags); 1254extern int nouveau_bo_pin(struct nouveau_bo *, uint32_t flags);
1159extern int nouveau_bo_unpin(struct nouveau_bo *); 1255extern int nouveau_bo_unpin(struct nouveau_bo *);
1160extern int nouveau_bo_map(struct nouveau_bo *); 1256extern int nouveau_bo_map(struct nouveau_bo *);
@@ -1165,28 +1261,59 @@ extern u16 nouveau_bo_rd16(struct nouveau_bo *nvbo, unsigned index);
1165extern void nouveau_bo_wr16(struct nouveau_bo *nvbo, unsigned index, u16 val); 1261extern void nouveau_bo_wr16(struct nouveau_bo *nvbo, unsigned index, u16 val);
1166extern u32 nouveau_bo_rd32(struct nouveau_bo *nvbo, unsigned index); 1262extern u32 nouveau_bo_rd32(struct nouveau_bo *nvbo, unsigned index);
1167extern void nouveau_bo_wr32(struct nouveau_bo *nvbo, unsigned index, u32 val); 1263extern void nouveau_bo_wr32(struct nouveau_bo *nvbo, unsigned index, u32 val);
1168extern int nouveau_bo_sync_gpu(struct nouveau_bo *, struct nouveau_channel *); 1264extern void nouveau_bo_fence(struct nouveau_bo *, struct nouveau_fence *);
1265extern int nouveau_bo_validate(struct nouveau_bo *, bool interruptible,
1266 bool no_wait_reserve, bool no_wait_gpu);
1169 1267
1170/* nouveau_fence.c */ 1268/* nouveau_fence.c */
1171struct nouveau_fence; 1269struct nouveau_fence;
1172extern int nouveau_fence_init(struct nouveau_channel *); 1270extern int nouveau_fence_init(struct drm_device *);
1173extern void nouveau_fence_fini(struct nouveau_channel *); 1271extern void nouveau_fence_fini(struct drm_device *);
1272extern int nouveau_fence_channel_init(struct nouveau_channel *);
1273extern void nouveau_fence_channel_fini(struct nouveau_channel *);
1174extern void nouveau_fence_update(struct nouveau_channel *); 1274extern void nouveau_fence_update(struct nouveau_channel *);
1175extern int nouveau_fence_new(struct nouveau_channel *, struct nouveau_fence **, 1275extern int nouveau_fence_new(struct nouveau_channel *, struct nouveau_fence **,
1176 bool emit); 1276 bool emit);
1177extern int nouveau_fence_emit(struct nouveau_fence *); 1277extern int nouveau_fence_emit(struct nouveau_fence *);
1278extern void nouveau_fence_work(struct nouveau_fence *fence,
1279 void (*work)(void *priv, bool signalled),
1280 void *priv);
1178struct nouveau_channel *nouveau_fence_channel(struct nouveau_fence *); 1281struct nouveau_channel *nouveau_fence_channel(struct nouveau_fence *);
1179extern bool nouveau_fence_signalled(void *obj, void *arg); 1282
1180extern int nouveau_fence_wait(void *obj, void *arg, bool lazy, bool intr); 1283extern bool __nouveau_fence_signalled(void *obj, void *arg);
1181extern int nouveau_fence_flush(void *obj, void *arg); 1284extern int __nouveau_fence_wait(void *obj, void *arg, bool lazy, bool intr);
1182extern void nouveau_fence_unref(void **obj); 1285extern int __nouveau_fence_flush(void *obj, void *arg);
1183extern void *nouveau_fence_ref(void *obj); 1286extern void __nouveau_fence_unref(void **obj);
1287extern void *__nouveau_fence_ref(void *obj);
1288
1289static inline bool nouveau_fence_signalled(struct nouveau_fence *obj)
1290{
1291 return __nouveau_fence_signalled(obj, NULL);
1292}
1293static inline int
1294nouveau_fence_wait(struct nouveau_fence *obj, bool lazy, bool intr)
1295{
1296 return __nouveau_fence_wait(obj, NULL, lazy, intr);
1297}
1298extern int nouveau_fence_sync(struct nouveau_fence *, struct nouveau_channel *);
1299static inline int nouveau_fence_flush(struct nouveau_fence *obj)
1300{
1301 return __nouveau_fence_flush(obj, NULL);
1302}
1303static inline void nouveau_fence_unref(struct nouveau_fence **obj)
1304{
1305 __nouveau_fence_unref((void **)obj);
1306}
1307static inline struct nouveau_fence *nouveau_fence_ref(struct nouveau_fence *obj)
1308{
1309 return __nouveau_fence_ref(obj);
1310}
1184 1311
1185/* nouveau_gem.c */ 1312/* nouveau_gem.c */
1186extern int nouveau_gem_new(struct drm_device *, struct nouveau_channel *, 1313extern int nouveau_gem_new(struct drm_device *, struct nouveau_channel *,
1187 int size, int align, uint32_t flags, 1314 int size, int align, uint32_t domain,
1188 uint32_t tile_mode, uint32_t tile_flags, 1315 uint32_t tile_mode, uint32_t tile_flags,
1189 bool no_vm, bool mappable, struct nouveau_bo **); 1316 struct nouveau_bo **);
1190extern int nouveau_gem_object_new(struct drm_gem_object *); 1317extern int nouveau_gem_object_new(struct drm_gem_object *);
1191extern void nouveau_gem_object_del(struct drm_gem_object *); 1318extern void nouveau_gem_object_del(struct drm_gem_object *);
1192extern int nouveau_gem_ioctl_new(struct drm_device *, void *, 1319extern int nouveau_gem_ioctl_new(struct drm_device *, void *,
@@ -1200,21 +1327,34 @@ extern int nouveau_gem_ioctl_cpu_fini(struct drm_device *, void *,
1200extern int nouveau_gem_ioctl_info(struct drm_device *, void *, 1327extern int nouveau_gem_ioctl_info(struct drm_device *, void *,
1201 struct drm_file *); 1328 struct drm_file *);
1202 1329
1330/* nouveau_display.c */
1331int nouveau_vblank_enable(struct drm_device *dev, int crtc);
1332void nouveau_vblank_disable(struct drm_device *dev, int crtc);
1333int nouveau_crtc_page_flip(struct drm_crtc *crtc, struct drm_framebuffer *fb,
1334 struct drm_pending_vblank_event *event);
1335int nouveau_finish_page_flip(struct nouveau_channel *,
1336 struct nouveau_page_flip_state *);
1337
1203/* nv10_gpio.c */ 1338/* nv10_gpio.c */
1204int nv10_gpio_get(struct drm_device *dev, enum dcb_gpio_tag tag); 1339int nv10_gpio_get(struct drm_device *dev, enum dcb_gpio_tag tag);
1205int nv10_gpio_set(struct drm_device *dev, enum dcb_gpio_tag tag, int state); 1340int nv10_gpio_set(struct drm_device *dev, enum dcb_gpio_tag tag, int state);
1206 1341
1207/* nv50_gpio.c */ 1342/* nv50_gpio.c */
1208int nv50_gpio_init(struct drm_device *dev); 1343int nv50_gpio_init(struct drm_device *dev);
1344void nv50_gpio_fini(struct drm_device *dev);
1209int nv50_gpio_get(struct drm_device *dev, enum dcb_gpio_tag tag); 1345int nv50_gpio_get(struct drm_device *dev, enum dcb_gpio_tag tag);
1210int nv50_gpio_set(struct drm_device *dev, enum dcb_gpio_tag tag, int state); 1346int nv50_gpio_set(struct drm_device *dev, enum dcb_gpio_tag tag, int state);
1211void nv50_gpio_irq_enable(struct drm_device *, enum dcb_gpio_tag, bool on); 1347int nv50_gpio_irq_register(struct drm_device *, enum dcb_gpio_tag,
1348 void (*)(void *, int), void *);
1349void nv50_gpio_irq_unregister(struct drm_device *, enum dcb_gpio_tag,
1350 void (*)(void *, int), void *);
1351bool nv50_gpio_irq_enable(struct drm_device *, enum dcb_gpio_tag, bool on);
1212 1352
1213/* nv50_calc. */ 1353/* nv50_calc. */
1214int nv50_calc_pll(struct drm_device *, struct pll_lims *, int clk, 1354int nv50_calc_pll(struct drm_device *, struct pll_lims *, int clk,
1215 int *N1, int *M1, int *N2, int *M2, int *P); 1355 int *N1, int *M1, int *N2, int *M2, int *P);
1216int nv50_calc_pll2(struct drm_device *, struct pll_lims *, 1356int nva3_calc_pll(struct drm_device *, struct pll_lims *,
1217 int clk, int *N, int *fN, int *M, int *P); 1357 int clk, int *N, int *fN, int *M, int *P);
1218 1358
1219#ifndef ioread32_native 1359#ifndef ioread32_native
1220#ifdef __BIG_ENDIAN 1360#ifdef __BIG_ENDIAN
@@ -1255,12 +1395,11 @@ static inline void nv_wr32(struct drm_device *dev, unsigned reg, u32 val)
1255 iowrite32_native(val, dev_priv->mmio + reg); 1395 iowrite32_native(val, dev_priv->mmio + reg);
1256} 1396}
1257 1397
1258static inline void nv_mask(struct drm_device *dev, u32 reg, u32 mask, u32 val) 1398static inline u32 nv_mask(struct drm_device *dev, u32 reg, u32 mask, u32 val)
1259{ 1399{
1260 u32 tmp = nv_rd32(dev, reg); 1400 u32 tmp = nv_rd32(dev, reg);
1261 tmp &= ~mask; 1401 nv_wr32(dev, reg, (tmp & ~mask) | val);
1262 tmp |= val; 1402 return tmp;
1263 nv_wr32(dev, reg, tmp);
1264} 1403}
1265 1404
1266static inline u8 nv_rd08(struct drm_device *dev, unsigned reg) 1405static inline u8 nv_rd08(struct drm_device *dev, unsigned reg)
@@ -1275,8 +1414,10 @@ static inline void nv_wr08(struct drm_device *dev, unsigned reg, u8 val)
1275 iowrite8(val, dev_priv->mmio + reg); 1414 iowrite8(val, dev_priv->mmio + reg);
1276} 1415}
1277 1416
1278#define nv_wait(reg, mask, val) \ 1417#define nv_wait(dev, reg, mask, val) \
1279 nouveau_wait_until(dev, 2000000000ULL, (reg), (mask), (val)) 1418 nouveau_wait_eq(dev, 2000000000ULL, (reg), (mask), (val))
1419#define nv_wait_ne(dev, reg, mask, val) \
1420 nouveau_wait_ne(dev, 2000000000ULL, (reg), (mask), (val))
1280 1421
1281/* PRAMIN access */ 1422/* PRAMIN access */
1282static inline u32 nv_ri32(struct drm_device *dev, unsigned offset) 1423static inline u32 nv_ri32(struct drm_device *dev, unsigned offset)
@@ -1292,17 +1433,8 @@ static inline void nv_wi32(struct drm_device *dev, unsigned offset, u32 val)
1292} 1433}
1293 1434
1294/* object access */ 1435/* object access */
1295static inline u32 nv_ro32(struct drm_device *dev, struct nouveau_gpuobj *obj, 1436extern u32 nv_ro32(struct nouveau_gpuobj *, u32 offset);
1296 unsigned index) 1437extern void nv_wo32(struct nouveau_gpuobj *, u32 offset, u32 val);
1297{
1298 return nv_ri32(dev, obj->im_pramin->start + index * 4);
1299}
1300
1301static inline void nv_wo32(struct drm_device *dev, struct nouveau_gpuobj *obj,
1302 unsigned index, u32 val)
1303{
1304 nv_wi32(dev, obj->im_pramin->start + index * 4, val);
1305}
1306 1438
1307/* 1439/*
1308 * Logging 1440 * Logging
@@ -1398,14 +1530,54 @@ nv_match_device(struct drm_device *dev, unsigned device,
1398 dev->pdev->subsystem_device == sub_device; 1530 dev->pdev->subsystem_device == sub_device;
1399} 1531}
1400 1532
1533static inline void *
1534nv_engine(struct drm_device *dev, int engine)
1535{
1536 struct drm_nouveau_private *dev_priv = dev->dev_private;
1537 return (void *)dev_priv->eng[engine];
1538}
1539
1540/* returns 1 if device is one of the nv4x using the 0x4497 object class,
1541 * helpful to determine a number of other hardware features
1542 */
1543static inline int
1544nv44_graph_class(struct drm_device *dev)
1545{
1546 struct drm_nouveau_private *dev_priv = dev->dev_private;
1547
1548 if ((dev_priv->chipset & 0xf0) == 0x60)
1549 return 1;
1550
1551 return !(0x0baf & (1 << (dev_priv->chipset & 0x0f)));
1552}
1553
1554/* memory type/access flags, do not match hardware values */
1555#define NV_MEM_ACCESS_RO 1
1556#define NV_MEM_ACCESS_WO 2
1557#define NV_MEM_ACCESS_RW (NV_MEM_ACCESS_RO | NV_MEM_ACCESS_WO)
1558#define NV_MEM_ACCESS_SYS 4
1559#define NV_MEM_ACCESS_VM 8
1560
1561#define NV_MEM_TARGET_VRAM 0
1562#define NV_MEM_TARGET_PCI 1
1563#define NV_MEM_TARGET_PCI_NOSNOOP 2
1564#define NV_MEM_TARGET_VM 3
1565#define NV_MEM_TARGET_GART 4
1566
1567#define NV_MEM_TYPE_VM 0x7f
1568#define NV_MEM_COMP_VM 0x03
1569
1570/* NV_SW object class */
1401#define NV_SW 0x0000506e 1571#define NV_SW 0x0000506e
1402#define NV_SW_DMA_SEMAPHORE 0x00000060 1572#define NV_SW_DMA_SEMAPHORE 0x00000060
1403#define NV_SW_SEMAPHORE_OFFSET 0x00000064 1573#define NV_SW_SEMAPHORE_OFFSET 0x00000064
1404#define NV_SW_SEMAPHORE_ACQUIRE 0x00000068 1574#define NV_SW_SEMAPHORE_ACQUIRE 0x00000068
1405#define NV_SW_SEMAPHORE_RELEASE 0x0000006c 1575#define NV_SW_SEMAPHORE_RELEASE 0x0000006c
1576#define NV_SW_YIELD 0x00000080
1406#define NV_SW_DMA_VBLSEM 0x0000018c 1577#define NV_SW_DMA_VBLSEM 0x0000018c
1407#define NV_SW_VBLSEM_OFFSET 0x00000400 1578#define NV_SW_VBLSEM_OFFSET 0x00000400
1408#define NV_SW_VBLSEM_RELEASE_VALUE 0x00000404 1579#define NV_SW_VBLSEM_RELEASE_VALUE 0x00000404
1409#define NV_SW_VBLSEM_RELEASE 0x00000408 1580#define NV_SW_VBLSEM_RELEASE 0x00000408
1581#define NV_SW_PAGE_FLIP 0x00000500
1410 1582
1411#endif /* __NOUVEAU_DRV_H__ */ 1583#endif /* __NOUVEAU_DRV_H__ */
diff --git a/drivers/gpu/drm/nouveau/nouveau_encoder.h b/drivers/gpu/drm/nouveau/nouveau_encoder.h
index 7c82d68bc155..ae69b61d93db 100644
--- a/drivers/gpu/drm/nouveau/nouveau_encoder.h
+++ b/drivers/gpu/drm/nouveau/nouveau_encoder.h
@@ -55,6 +55,7 @@ struct nouveau_encoder {
55 int dpcd_version; 55 int dpcd_version;
56 int link_nr; 56 int link_nr;
57 int link_bw; 57 int link_bw;
58 bool enhanced_frame;
58 } dp; 59 } dp;
59 }; 60 };
60}; 61};
diff --git a/drivers/gpu/drm/nouveau/nouveau_fb.h b/drivers/gpu/drm/nouveau/nouveau_fb.h
index d432134b71e0..a3a88ad00f86 100644
--- a/drivers/gpu/drm/nouveau/nouveau_fb.h
+++ b/drivers/gpu/drm/nouveau/nouveau_fb.h
@@ -30,6 +30,9 @@
30struct nouveau_framebuffer { 30struct nouveau_framebuffer {
31 struct drm_framebuffer base; 31 struct drm_framebuffer base;
32 struct nouveau_bo *nvbo; 32 struct nouveau_bo *nvbo;
33 u32 r_dma;
34 u32 r_format;
35 u32 r_pitch;
33}; 36};
34 37
35static inline struct nouveau_framebuffer * 38static inline struct nouveau_framebuffer *
diff --git a/drivers/gpu/drm/nouveau/nouveau_fbcon.c b/drivers/gpu/drm/nouveau/nouveau_fbcon.c
index dbd30b2e43fd..39aee6d4daf8 100644
--- a/drivers/gpu/drm/nouveau/nouveau_fbcon.c
+++ b/drivers/gpu/drm/nouveau/nouveau_fbcon.c
@@ -49,6 +49,102 @@
49#include "nouveau_fbcon.h" 49#include "nouveau_fbcon.h"
50#include "nouveau_dma.h" 50#include "nouveau_dma.h"
51 51
52static void
53nouveau_fbcon_fillrect(struct fb_info *info, const struct fb_fillrect *rect)
54{
55 struct nouveau_fbdev *nfbdev = info->par;
56 struct drm_device *dev = nfbdev->dev;
57 struct drm_nouveau_private *dev_priv = dev->dev_private;
58 int ret;
59
60 if (info->state != FBINFO_STATE_RUNNING)
61 return;
62
63 ret = -ENODEV;
64 if (!in_interrupt() && !(info->flags & FBINFO_HWACCEL_DISABLED) &&
65 mutex_trylock(&dev_priv->channel->mutex)) {
66 if (dev_priv->card_type < NV_50)
67 ret = nv04_fbcon_fillrect(info, rect);
68 else
69 if (dev_priv->card_type < NV_C0)
70 ret = nv50_fbcon_fillrect(info, rect);
71 else
72 ret = nvc0_fbcon_fillrect(info, rect);
73 mutex_unlock(&dev_priv->channel->mutex);
74 }
75
76 if (ret == 0)
77 return;
78
79 if (ret != -ENODEV)
80 nouveau_fbcon_gpu_lockup(info);
81 cfb_fillrect(info, rect);
82}
83
84static void
85nouveau_fbcon_copyarea(struct fb_info *info, const struct fb_copyarea *image)
86{
87 struct nouveau_fbdev *nfbdev = info->par;
88 struct drm_device *dev = nfbdev->dev;
89 struct drm_nouveau_private *dev_priv = dev->dev_private;
90 int ret;
91
92 if (info->state != FBINFO_STATE_RUNNING)
93 return;
94
95 ret = -ENODEV;
96 if (!in_interrupt() && !(info->flags & FBINFO_HWACCEL_DISABLED) &&
97 mutex_trylock(&dev_priv->channel->mutex)) {
98 if (dev_priv->card_type < NV_50)
99 ret = nv04_fbcon_copyarea(info, image);
100 else
101 if (dev_priv->card_type < NV_C0)
102 ret = nv50_fbcon_copyarea(info, image);
103 else
104 ret = nvc0_fbcon_copyarea(info, image);
105 mutex_unlock(&dev_priv->channel->mutex);
106 }
107
108 if (ret == 0)
109 return;
110
111 if (ret != -ENODEV)
112 nouveau_fbcon_gpu_lockup(info);
113 cfb_copyarea(info, image);
114}
115
116static void
117nouveau_fbcon_imageblit(struct fb_info *info, const struct fb_image *image)
118{
119 struct nouveau_fbdev *nfbdev = info->par;
120 struct drm_device *dev = nfbdev->dev;
121 struct drm_nouveau_private *dev_priv = dev->dev_private;
122 int ret;
123
124 if (info->state != FBINFO_STATE_RUNNING)
125 return;
126
127 ret = -ENODEV;
128 if (!in_interrupt() && !(info->flags & FBINFO_HWACCEL_DISABLED) &&
129 mutex_trylock(&dev_priv->channel->mutex)) {
130 if (dev_priv->card_type < NV_50)
131 ret = nv04_fbcon_imageblit(info, image);
132 else
133 if (dev_priv->card_type < NV_C0)
134 ret = nv50_fbcon_imageblit(info, image);
135 else
136 ret = nvc0_fbcon_imageblit(info, image);
137 mutex_unlock(&dev_priv->channel->mutex);
138 }
139
140 if (ret == 0)
141 return;
142
143 if (ret != -ENODEV)
144 nouveau_fbcon_gpu_lockup(info);
145 cfb_imageblit(info, image);
146}
147
52static int 148static int
53nouveau_fbcon_sync(struct fb_info *info) 149nouveau_fbcon_sync(struct fb_info *info)
54{ 150{
@@ -58,26 +154,40 @@ nouveau_fbcon_sync(struct fb_info *info)
58 struct nouveau_channel *chan = dev_priv->channel; 154 struct nouveau_channel *chan = dev_priv->channel;
59 int ret, i; 155 int ret, i;
60 156
61 if (!chan || !chan->accel_done || 157 if (!chan || !chan->accel_done || in_interrupt() ||
62 info->state != FBINFO_STATE_RUNNING || 158 info->state != FBINFO_STATE_RUNNING ||
63 info->flags & FBINFO_HWACCEL_DISABLED) 159 info->flags & FBINFO_HWACCEL_DISABLED)
64 return 0; 160 return 0;
65 161
66 if (RING_SPACE(chan, 4)) { 162 if (!mutex_trylock(&chan->mutex))
163 return 0;
164
165 ret = RING_SPACE(chan, 4);
166 if (ret) {
167 mutex_unlock(&chan->mutex);
67 nouveau_fbcon_gpu_lockup(info); 168 nouveau_fbcon_gpu_lockup(info);
68 return 0; 169 return 0;
69 } 170 }
70 171
71 BEGIN_RING(chan, 0, 0x0104, 1); 172 if (dev_priv->card_type >= NV_C0) {
72 OUT_RING(chan, 0); 173 BEGIN_NVC0(chan, 2, NvSub2D, 0x010c, 1);
73 BEGIN_RING(chan, 0, 0x0100, 1); 174 OUT_RING (chan, 0);
74 OUT_RING(chan, 0); 175 BEGIN_NVC0(chan, 2, NvSub2D, 0x0100, 1);
75 nouveau_bo_wr32(chan->notifier_bo, chan->m2mf_ntfy + 3, 0xffffffff); 176 OUT_RING (chan, 0);
177 } else {
178 BEGIN_RING(chan, 0, 0x0104, 1);
179 OUT_RING (chan, 0);
180 BEGIN_RING(chan, 0, 0x0100, 1);
181 OUT_RING (chan, 0);
182 }
183
184 nouveau_bo_wr32(chan->notifier_bo, chan->m2mf_ntfy/4 + 3, 0xffffffff);
76 FIRE_RING(chan); 185 FIRE_RING(chan);
186 mutex_unlock(&chan->mutex);
77 187
78 ret = -EBUSY; 188 ret = -EBUSY;
79 for (i = 0; i < 100000; i++) { 189 for (i = 0; i < 100000; i++) {
80 if (!nouveau_bo_rd32(chan->notifier_bo, chan->m2mf_ntfy + 3)) { 190 if (!nouveau_bo_rd32(chan->notifier_bo, chan->m2mf_ntfy/4 + 3)) {
81 ret = 0; 191 ret = 0;
82 break; 192 break;
83 } 193 }
@@ -97,39 +207,29 @@ static struct fb_ops nouveau_fbcon_ops = {
97 .owner = THIS_MODULE, 207 .owner = THIS_MODULE,
98 .fb_check_var = drm_fb_helper_check_var, 208 .fb_check_var = drm_fb_helper_check_var,
99 .fb_set_par = drm_fb_helper_set_par, 209 .fb_set_par = drm_fb_helper_set_par,
100 .fb_fillrect = cfb_fillrect, 210 .fb_fillrect = nouveau_fbcon_fillrect,
101 .fb_copyarea = cfb_copyarea, 211 .fb_copyarea = nouveau_fbcon_copyarea,
102 .fb_imageblit = cfb_imageblit, 212 .fb_imageblit = nouveau_fbcon_imageblit,
103 .fb_sync = nouveau_fbcon_sync,
104 .fb_pan_display = drm_fb_helper_pan_display,
105 .fb_blank = drm_fb_helper_blank,
106 .fb_setcmap = drm_fb_helper_setcmap,
107};
108
109static struct fb_ops nv04_fbcon_ops = {
110 .owner = THIS_MODULE,
111 .fb_check_var = drm_fb_helper_check_var,
112 .fb_set_par = drm_fb_helper_set_par,
113 .fb_fillrect = nv04_fbcon_fillrect,
114 .fb_copyarea = nv04_fbcon_copyarea,
115 .fb_imageblit = nv04_fbcon_imageblit,
116 .fb_sync = nouveau_fbcon_sync, 213 .fb_sync = nouveau_fbcon_sync,
117 .fb_pan_display = drm_fb_helper_pan_display, 214 .fb_pan_display = drm_fb_helper_pan_display,
118 .fb_blank = drm_fb_helper_blank, 215 .fb_blank = drm_fb_helper_blank,
119 .fb_setcmap = drm_fb_helper_setcmap, 216 .fb_setcmap = drm_fb_helper_setcmap,
217 .fb_debug_enter = drm_fb_helper_debug_enter,
218 .fb_debug_leave = drm_fb_helper_debug_leave,
120}; 219};
121 220
122static struct fb_ops nv50_fbcon_ops = { 221static struct fb_ops nouveau_fbcon_sw_ops = {
123 .owner = THIS_MODULE, 222 .owner = THIS_MODULE,
124 .fb_check_var = drm_fb_helper_check_var, 223 .fb_check_var = drm_fb_helper_check_var,
125 .fb_set_par = drm_fb_helper_set_par, 224 .fb_set_par = drm_fb_helper_set_par,
126 .fb_fillrect = nv50_fbcon_fillrect, 225 .fb_fillrect = cfb_fillrect,
127 .fb_copyarea = nv50_fbcon_copyarea, 226 .fb_copyarea = cfb_copyarea,
128 .fb_imageblit = nv50_fbcon_imageblit, 227 .fb_imageblit = cfb_imageblit,
129 .fb_sync = nouveau_fbcon_sync,
130 .fb_pan_display = drm_fb_helper_pan_display, 228 .fb_pan_display = drm_fb_helper_pan_display,
131 .fb_blank = drm_fb_helper_blank, 229 .fb_blank = drm_fb_helper_blank,
132 .fb_setcmap = drm_fb_helper_setcmap, 230 .fb_setcmap = drm_fb_helper_setcmap,
231 .fb_debug_enter = drm_fb_helper_debug_enter,
232 .fb_debug_leave = drm_fb_helper_debug_leave,
133}; 233};
134 234
135static void nouveau_fbcon_gamma_set(struct drm_crtc *crtc, u16 red, u16 green, 235static void nouveau_fbcon_gamma_set(struct drm_crtc *crtc, u16 red, u16 green,
@@ -196,8 +296,8 @@ nouveau_fbcon_create(struct nouveau_fbdev *nfbdev,
196 size = mode_cmd.pitch * mode_cmd.height; 296 size = mode_cmd.pitch * mode_cmd.height;
197 size = roundup(size, PAGE_SIZE); 297 size = roundup(size, PAGE_SIZE);
198 298
199 ret = nouveau_gem_new(dev, dev_priv->channel, size, 0, TTM_PL_FLAG_VRAM, 299 ret = nouveau_gem_new(dev, dev_priv->channel, size, 0,
200 0, 0x0000, false, true, &nvbo); 300 NOUVEAU_GEM_DOMAIN_VRAM, 0, 0x0000, &nvbo);
201 if (ret) { 301 if (ret) {
202 NV_ERROR(dev, "failed to allocate framebuffer\n"); 302 NV_ERROR(dev, "failed to allocate framebuffer\n");
203 goto out; 303 goto out;
@@ -251,9 +351,9 @@ nouveau_fbcon_create(struct nouveau_fbdev *nfbdev,
251 FBINFO_HWACCEL_FILLRECT | 351 FBINFO_HWACCEL_FILLRECT |
252 FBINFO_HWACCEL_IMAGEBLIT; 352 FBINFO_HWACCEL_IMAGEBLIT;
253 info->flags |= FBINFO_CAN_FORCE_OUTPUT; 353 info->flags |= FBINFO_CAN_FORCE_OUTPUT;
254 info->fbops = &nouveau_fbcon_ops; 354 info->fbops = &nouveau_fbcon_sw_ops;
255 info->fix.smem_start = dev->mode_config.fb_base + nvbo->bo.offset - 355 info->fix.smem_start = nvbo->bo.mem.bus.base +
256 dev_priv->vm_vram_base; 356 nvbo->bo.mem.bus.offset;
257 info->fix.smem_len = size; 357 info->fix.smem_len = size;
258 358
259 info->screen_base = nvbo_kmap_obj_iovirtual(nouveau_fb->nvbo); 359 info->screen_base = nvbo_kmap_obj_iovirtual(nouveau_fb->nvbo);
@@ -262,10 +362,6 @@ nouveau_fbcon_create(struct nouveau_fbdev *nfbdev,
262 drm_fb_helper_fill_fix(info, fb->pitch, fb->depth); 362 drm_fb_helper_fill_fix(info, fb->pitch, fb->depth);
263 drm_fb_helper_fill_var(info, &nfbdev->helper, sizes->fb_width, sizes->fb_height); 363 drm_fb_helper_fill_var(info, &nfbdev->helper, sizes->fb_width, sizes->fb_height);
264 364
265 /* FIXME: we really shouldn't expose mmio space at all */
266 info->fix.mmio_start = pci_resource_start(pdev, 1);
267 info->fix.mmio_len = pci_resource_len(pdev, 1);
268
269 /* Set aperture base/size for vesafb takeover */ 365 /* Set aperture base/size for vesafb takeover */
270 info->apertures = dev_priv->apertures; 366 info->apertures = dev_priv->apertures;
271 if (!info->apertures) { 367 if (!info->apertures) {
@@ -279,19 +375,20 @@ nouveau_fbcon_create(struct nouveau_fbdev *nfbdev,
279 info->pixmap.flags = FB_PIXMAP_SYSTEM; 375 info->pixmap.flags = FB_PIXMAP_SYSTEM;
280 info->pixmap.scan_align = 1; 376 info->pixmap.scan_align = 1;
281 377
378 mutex_unlock(&dev->struct_mutex);
379
282 if (dev_priv->channel && !nouveau_nofbaccel) { 380 if (dev_priv->channel && !nouveau_nofbaccel) {
283 switch (dev_priv->card_type) { 381 ret = -ENODEV;
284 case NV_C0: 382 if (dev_priv->card_type < NV_50)
285 break; 383 ret = nv04_fbcon_accel_init(info);
286 case NV_50: 384 else
287 nv50_fbcon_accel_init(info); 385 if (dev_priv->card_type < NV_C0)
288 info->fbops = &nv50_fbcon_ops; 386 ret = nv50_fbcon_accel_init(info);
289 break; 387 else
290 default: 388 ret = nvc0_fbcon_accel_init(info);
291 nv04_fbcon_accel_init(info); 389
292 info->fbops = &nv04_fbcon_ops; 390 if (ret == 0)
293 break; 391 info->fbops = &nouveau_fbcon_ops;
294 };
295 } 392 }
296 393
297 nouveau_fbcon_zfill(dev, nfbdev); 394 nouveau_fbcon_zfill(dev, nfbdev);
@@ -302,7 +399,6 @@ nouveau_fbcon_create(struct nouveau_fbdev *nfbdev,
302 nouveau_fb->base.height, 399 nouveau_fb->base.height,
303 nvbo->bo.offset, nvbo); 400 nvbo->bo.offset, nvbo);
304 401
305 mutex_unlock(&dev->struct_mutex);
306 vga_switcheroo_client_fb_set(dev->pdev, info); 402 vga_switcheroo_client_fb_set(dev->pdev, info);
307 return 0; 403 return 0;
308 404
diff --git a/drivers/gpu/drm/nouveau/nouveau_fbcon.h b/drivers/gpu/drm/nouveau/nouveau_fbcon.h
index e7e12684c37e..b73c29f87fc3 100644
--- a/drivers/gpu/drm/nouveau/nouveau_fbcon.h
+++ b/drivers/gpu/drm/nouveau/nouveau_fbcon.h
@@ -40,15 +40,21 @@ struct nouveau_fbdev {
40 40
41void nouveau_fbcon_restore(void); 41void nouveau_fbcon_restore(void);
42 42
43void nv04_fbcon_copyarea(struct fb_info *info, const struct fb_copyarea *region); 43int nv04_fbcon_copyarea(struct fb_info *info, const struct fb_copyarea *region);
44void nv04_fbcon_fillrect(struct fb_info *info, const struct fb_fillrect *rect); 44int nv04_fbcon_fillrect(struct fb_info *info, const struct fb_fillrect *rect);
45void nv04_fbcon_imageblit(struct fb_info *info, const struct fb_image *image); 45int nv04_fbcon_imageblit(struct fb_info *info, const struct fb_image *image);
46int nv04_fbcon_accel_init(struct fb_info *info); 46int nv04_fbcon_accel_init(struct fb_info *info);
47void nv50_fbcon_fillrect(struct fb_info *info, const struct fb_fillrect *rect); 47
48void nv50_fbcon_copyarea(struct fb_info *info, const struct fb_copyarea *region); 48int nv50_fbcon_fillrect(struct fb_info *info, const struct fb_fillrect *rect);
49void nv50_fbcon_imageblit(struct fb_info *info, const struct fb_image *image); 49int nv50_fbcon_copyarea(struct fb_info *info, const struct fb_copyarea *region);
50int nv50_fbcon_imageblit(struct fb_info *info, const struct fb_image *image);
50int nv50_fbcon_accel_init(struct fb_info *info); 51int nv50_fbcon_accel_init(struct fb_info *info);
51 52
53int nvc0_fbcon_fillrect(struct fb_info *info, const struct fb_fillrect *rect);
54int nvc0_fbcon_copyarea(struct fb_info *info, const struct fb_copyarea *region);
55int nvc0_fbcon_imageblit(struct fb_info *info, const struct fb_image *image);
56int nvc0_fbcon_accel_init(struct fb_info *info);
57
52void nouveau_fbcon_gpu_lockup(struct fb_info *info); 58void nouveau_fbcon_gpu_lockup(struct fb_info *info);
53 59
54int nouveau_fbcon_init(struct drm_device *dev); 60int nouveau_fbcon_init(struct drm_device *dev);
diff --git a/drivers/gpu/drm/nouveau/nouveau_fence.c b/drivers/gpu/drm/nouveau/nouveau_fence.c
index 87ac21ec23d2..7347075ca5b8 100644
--- a/drivers/gpu/drm/nouveau/nouveau_fence.c
+++ b/drivers/gpu/drm/nouveau/nouveau_fence.c
@@ -27,10 +27,15 @@
27#include "drmP.h" 27#include "drmP.h"
28#include "drm.h" 28#include "drm.h"
29 29
30#include <linux/ktime.h>
31#include <linux/hrtimer.h>
32
30#include "nouveau_drv.h" 33#include "nouveau_drv.h"
34#include "nouveau_ramht.h"
31#include "nouveau_dma.h" 35#include "nouveau_dma.h"
32 36
33#define USE_REFCNT (dev_priv->card_type >= NV_10) 37#define USE_REFCNT(dev) (nouveau_private(dev)->chipset >= 0x10)
38#define USE_SEMA(dev) (nouveau_private(dev)->chipset >= 0x17)
34 39
35struct nouveau_fence { 40struct nouveau_fence {
36 struct nouveau_channel *channel; 41 struct nouveau_channel *channel;
@@ -39,6 +44,15 @@ struct nouveau_fence {
39 44
40 uint32_t sequence; 45 uint32_t sequence;
41 bool signalled; 46 bool signalled;
47
48 void (*work)(void *priv, bool signalled);
49 void *priv;
50};
51
52struct nouveau_semaphore {
53 struct kref ref;
54 struct drm_device *dev;
55 struct drm_mm_node *mem;
42}; 56};
43 57
44static inline struct nouveau_fence * 58static inline struct nouveau_fence *
@@ -53,34 +67,39 @@ nouveau_fence_del(struct kref *ref)
53 struct nouveau_fence *fence = 67 struct nouveau_fence *fence =
54 container_of(ref, struct nouveau_fence, refcount); 68 container_of(ref, struct nouveau_fence, refcount);
55 69
70 nouveau_channel_ref(NULL, &fence->channel);
56 kfree(fence); 71 kfree(fence);
57} 72}
58 73
59void 74void
60nouveau_fence_update(struct nouveau_channel *chan) 75nouveau_fence_update(struct nouveau_channel *chan)
61{ 76{
62 struct drm_nouveau_private *dev_priv = chan->dev->dev_private; 77 struct drm_device *dev = chan->dev;
63 struct list_head *entry, *tmp; 78 struct nouveau_fence *tmp, *fence;
64 struct nouveau_fence *fence;
65 uint32_t sequence; 79 uint32_t sequence;
66 80
67 spin_lock(&chan->fence.lock); 81 spin_lock(&chan->fence.lock);
68 82
69 if (USE_REFCNT) 83 /* Fetch the last sequence if the channel is still up and running */
70 sequence = nvchan_rd32(chan, 0x48); 84 if (likely(!list_empty(&chan->fence.pending))) {
71 else 85 if (USE_REFCNT(dev))
72 sequence = atomic_read(&chan->fence.last_sequence_irq); 86 sequence = nvchan_rd32(chan, 0x48);
73 87 else
74 if (chan->fence.sequence_ack == sequence) 88 sequence = atomic_read(&chan->fence.last_sequence_irq);
75 goto out;
76 chan->fence.sequence_ack = sequence;
77 89
78 list_for_each_safe(entry, tmp, &chan->fence.pending) { 90 if (chan->fence.sequence_ack == sequence)
79 fence = list_entry(entry, struct nouveau_fence, entry); 91 goto out;
92 chan->fence.sequence_ack = sequence;
93 }
80 94
95 list_for_each_entry_safe(fence, tmp, &chan->fence.pending, entry) {
81 sequence = fence->sequence; 96 sequence = fence->sequence;
82 fence->signalled = true; 97 fence->signalled = true;
83 list_del(&fence->entry); 98 list_del(&fence->entry);
99
100 if (unlikely(fence->work))
101 fence->work(fence->priv, true);
102
84 kref_put(&fence->refcount, nouveau_fence_del); 103 kref_put(&fence->refcount, nouveau_fence_del);
85 104
86 if (sequence == chan->fence.sequence_ack) 105 if (sequence == chan->fence.sequence_ack)
@@ -101,13 +120,13 @@ nouveau_fence_new(struct nouveau_channel *chan, struct nouveau_fence **pfence,
101 if (!fence) 120 if (!fence)
102 return -ENOMEM; 121 return -ENOMEM;
103 kref_init(&fence->refcount); 122 kref_init(&fence->refcount);
104 fence->channel = chan; 123 nouveau_channel_ref(chan, &fence->channel);
105 124
106 if (emit) 125 if (emit)
107 ret = nouveau_fence_emit(fence); 126 ret = nouveau_fence_emit(fence);
108 127
109 if (ret) 128 if (ret)
110 nouveau_fence_unref((void *)&fence); 129 nouveau_fence_unref(&fence);
111 *pfence = fence; 130 *pfence = fence;
112 return ret; 131 return ret;
113} 132}
@@ -115,14 +134,15 @@ nouveau_fence_new(struct nouveau_channel *chan, struct nouveau_fence **pfence,
115struct nouveau_channel * 134struct nouveau_channel *
116nouveau_fence_channel(struct nouveau_fence *fence) 135nouveau_fence_channel(struct nouveau_fence *fence)
117{ 136{
118 return fence ? fence->channel : NULL; 137 return fence ? nouveau_channel_get_unlocked(fence->channel) : NULL;
119} 138}
120 139
121int 140int
122nouveau_fence_emit(struct nouveau_fence *fence) 141nouveau_fence_emit(struct nouveau_fence *fence)
123{ 142{
124 struct drm_nouveau_private *dev_priv = fence->channel->dev->dev_private;
125 struct nouveau_channel *chan = fence->channel; 143 struct nouveau_channel *chan = fence->channel;
144 struct drm_device *dev = chan->dev;
145 struct drm_nouveau_private *dev_priv = dev->dev_private;
126 int ret; 146 int ret;
127 147
128 ret = RING_SPACE(chan, 2); 148 ret = RING_SPACE(chan, 2);
@@ -143,15 +163,41 @@ nouveau_fence_emit(struct nouveau_fence *fence)
143 list_add_tail(&fence->entry, &chan->fence.pending); 163 list_add_tail(&fence->entry, &chan->fence.pending);
144 spin_unlock(&chan->fence.lock); 164 spin_unlock(&chan->fence.lock);
145 165
146 BEGIN_RING(chan, NvSubSw, USE_REFCNT ? 0x0050 : 0x0150, 1); 166 if (USE_REFCNT(dev)) {
147 OUT_RING(chan, fence->sequence); 167 if (dev_priv->card_type < NV_C0)
168 BEGIN_RING(chan, NvSubSw, 0x0050, 1);
169 else
170 BEGIN_NVC0(chan, 2, NvSubM2MF, 0x0050, 1);
171 } else {
172 BEGIN_RING(chan, NvSubSw, 0x0150, 1);
173 }
174 OUT_RING (chan, fence->sequence);
148 FIRE_RING(chan); 175 FIRE_RING(chan);
149 176
150 return 0; 177 return 0;
151} 178}
152 179
153void 180void
154nouveau_fence_unref(void **sync_obj) 181nouveau_fence_work(struct nouveau_fence *fence,
182 void (*work)(void *priv, bool signalled),
183 void *priv)
184{
185 BUG_ON(fence->work);
186
187 spin_lock(&fence->channel->fence.lock);
188
189 if (fence->signalled) {
190 work(priv, true);
191 } else {
192 fence->work = work;
193 fence->priv = priv;
194 }
195
196 spin_unlock(&fence->channel->fence.lock);
197}
198
199void
200__nouveau_fence_unref(void **sync_obj)
155{ 201{
156 struct nouveau_fence *fence = nouveau_fence(*sync_obj); 202 struct nouveau_fence *fence = nouveau_fence(*sync_obj);
157 203
@@ -161,7 +207,7 @@ nouveau_fence_unref(void **sync_obj)
161} 207}
162 208
163void * 209void *
164nouveau_fence_ref(void *sync_obj) 210__nouveau_fence_ref(void *sync_obj)
165{ 211{
166 struct nouveau_fence *fence = nouveau_fence(sync_obj); 212 struct nouveau_fence *fence = nouveau_fence(sync_obj);
167 213
@@ -170,7 +216,7 @@ nouveau_fence_ref(void *sync_obj)
170} 216}
171 217
172bool 218bool
173nouveau_fence_signalled(void *sync_obj, void *sync_arg) 219__nouveau_fence_signalled(void *sync_obj, void *sync_arg)
174{ 220{
175 struct nouveau_fence *fence = nouveau_fence(sync_obj); 221 struct nouveau_fence *fence = nouveau_fence(sync_obj);
176 struct nouveau_channel *chan = fence->channel; 222 struct nouveau_channel *chan = fence->channel;
@@ -183,13 +229,15 @@ nouveau_fence_signalled(void *sync_obj, void *sync_arg)
183} 229}
184 230
185int 231int
186nouveau_fence_wait(void *sync_obj, void *sync_arg, bool lazy, bool intr) 232__nouveau_fence_wait(void *sync_obj, void *sync_arg, bool lazy, bool intr)
187{ 233{
188 unsigned long timeout = jiffies + (3 * DRM_HZ); 234 unsigned long timeout = jiffies + (3 * DRM_HZ);
235 unsigned long sleep_time = NSEC_PER_MSEC / 1000;
236 ktime_t t;
189 int ret = 0; 237 int ret = 0;
190 238
191 while (1) { 239 while (1) {
192 if (nouveau_fence_signalled(sync_obj, sync_arg)) 240 if (__nouveau_fence_signalled(sync_obj, sync_arg))
193 break; 241 break;
194 242
195 if (time_after_eq(jiffies, timeout)) { 243 if (time_after_eq(jiffies, timeout)) {
@@ -199,8 +247,13 @@ nouveau_fence_wait(void *sync_obj, void *sync_arg, bool lazy, bool intr)
199 247
200 __set_current_state(intr ? TASK_INTERRUPTIBLE 248 __set_current_state(intr ? TASK_INTERRUPTIBLE
201 : TASK_UNINTERRUPTIBLE); 249 : TASK_UNINTERRUPTIBLE);
202 if (lazy) 250 if (lazy) {
203 schedule_timeout(1); 251 t = ktime_set(0, sleep_time);
252 schedule_hrtimeout(&t, HRTIMER_MODE_REL);
253 sleep_time *= 2;
254 if (sleep_time > NSEC_PER_MSEC)
255 sleep_time = NSEC_PER_MSEC;
256 }
204 257
205 if (intr && signal_pending(current)) { 258 if (intr && signal_pending(current)) {
206 ret = -ERESTARTSYS; 259 ret = -ERESTARTSYS;
@@ -213,15 +266,282 @@ nouveau_fence_wait(void *sync_obj, void *sync_arg, bool lazy, bool intr)
213 return ret; 266 return ret;
214} 267}
215 268
269static struct nouveau_semaphore *
270semaphore_alloc(struct drm_device *dev)
271{
272 struct drm_nouveau_private *dev_priv = dev->dev_private;
273 struct nouveau_semaphore *sema;
274 int size = (dev_priv->chipset < 0x84) ? 4 : 16;
275 int ret, i;
276
277 if (!USE_SEMA(dev))
278 return NULL;
279
280 sema = kmalloc(sizeof(*sema), GFP_KERNEL);
281 if (!sema)
282 goto fail;
283
284 ret = drm_mm_pre_get(&dev_priv->fence.heap);
285 if (ret)
286 goto fail;
287
288 spin_lock(&dev_priv->fence.lock);
289 sema->mem = drm_mm_search_free(&dev_priv->fence.heap, size, 0, 0);
290 if (sema->mem)
291 sema->mem = drm_mm_get_block_atomic(sema->mem, size, 0);
292 spin_unlock(&dev_priv->fence.lock);
293
294 if (!sema->mem)
295 goto fail;
296
297 kref_init(&sema->ref);
298 sema->dev = dev;
299 for (i = sema->mem->start; i < sema->mem->start + size; i += 4)
300 nouveau_bo_wr32(dev_priv->fence.bo, i / 4, 0);
301
302 return sema;
303fail:
304 kfree(sema);
305 return NULL;
306}
307
308static void
309semaphore_free(struct kref *ref)
310{
311 struct nouveau_semaphore *sema =
312 container_of(ref, struct nouveau_semaphore, ref);
313 struct drm_nouveau_private *dev_priv = sema->dev->dev_private;
314
315 spin_lock(&dev_priv->fence.lock);
316 drm_mm_put_block(sema->mem);
317 spin_unlock(&dev_priv->fence.lock);
318
319 kfree(sema);
320}
321
322static void
323semaphore_work(void *priv, bool signalled)
324{
325 struct nouveau_semaphore *sema = priv;
326 struct drm_nouveau_private *dev_priv = sema->dev->dev_private;
327
328 if (unlikely(!signalled))
329 nouveau_bo_wr32(dev_priv->fence.bo, sema->mem->start / 4, 1);
330
331 kref_put(&sema->ref, semaphore_free);
332}
333
334static int
335semaphore_acquire(struct nouveau_channel *chan, struct nouveau_semaphore *sema)
336{
337 struct drm_nouveau_private *dev_priv = chan->dev->dev_private;
338 struct nouveau_fence *fence = NULL;
339 int ret;
340
341 if (dev_priv->chipset < 0x84) {
342 ret = RING_SPACE(chan, 4);
343 if (ret)
344 return ret;
345
346 BEGIN_RING(chan, NvSubSw, NV_SW_DMA_SEMAPHORE, 3);
347 OUT_RING (chan, NvSema);
348 OUT_RING (chan, sema->mem->start);
349 OUT_RING (chan, 1);
350 } else
351 if (dev_priv->chipset < 0xc0) {
352 struct nouveau_vma *vma = &dev_priv->fence.bo->vma;
353 u64 offset = vma->offset + sema->mem->start;
354
355 ret = RING_SPACE(chan, 7);
356 if (ret)
357 return ret;
358
359 BEGIN_RING(chan, NvSubSw, NV_SW_DMA_SEMAPHORE, 1);
360 OUT_RING (chan, chan->vram_handle);
361 BEGIN_RING(chan, NvSubSw, 0x0010, 4);
362 OUT_RING (chan, upper_32_bits(offset));
363 OUT_RING (chan, lower_32_bits(offset));
364 OUT_RING (chan, 1);
365 OUT_RING (chan, 1); /* ACQUIRE_EQ */
366 } else {
367 struct nouveau_vma *vma = &dev_priv->fence.bo->vma;
368 u64 offset = vma->offset + sema->mem->start;
369
370 ret = RING_SPACE(chan, 5);
371 if (ret)
372 return ret;
373
374 BEGIN_NVC0(chan, 2, NvSubM2MF, 0x0010, 4);
375 OUT_RING (chan, upper_32_bits(offset));
376 OUT_RING (chan, lower_32_bits(offset));
377 OUT_RING (chan, 1);
378 OUT_RING (chan, 0x1001); /* ACQUIRE_EQ */
379 }
380
381 /* Delay semaphore destruction until its work is done */
382 ret = nouveau_fence_new(chan, &fence, true);
383 if (ret)
384 return ret;
385
386 kref_get(&sema->ref);
387 nouveau_fence_work(fence, semaphore_work, sema);
388 nouveau_fence_unref(&fence);
389 return 0;
390}
391
392static int
393semaphore_release(struct nouveau_channel *chan, struct nouveau_semaphore *sema)
394{
395 struct drm_nouveau_private *dev_priv = chan->dev->dev_private;
396 struct nouveau_fence *fence = NULL;
397 int ret;
398
399 if (dev_priv->chipset < 0x84) {
400 ret = RING_SPACE(chan, 5);
401 if (ret)
402 return ret;
403
404 BEGIN_RING(chan, NvSubSw, NV_SW_DMA_SEMAPHORE, 2);
405 OUT_RING (chan, NvSema);
406 OUT_RING (chan, sema->mem->start);
407 BEGIN_RING(chan, NvSubSw, NV_SW_SEMAPHORE_RELEASE, 1);
408 OUT_RING (chan, 1);
409 } else
410 if (dev_priv->chipset < 0xc0) {
411 struct nouveau_vma *vma = &dev_priv->fence.bo->vma;
412 u64 offset = vma->offset + sema->mem->start;
413
414 ret = RING_SPACE(chan, 7);
415 if (ret)
416 return ret;
417
418 BEGIN_RING(chan, NvSubSw, NV_SW_DMA_SEMAPHORE, 1);
419 OUT_RING (chan, chan->vram_handle);
420 BEGIN_RING(chan, NvSubSw, 0x0010, 4);
421 OUT_RING (chan, upper_32_bits(offset));
422 OUT_RING (chan, lower_32_bits(offset));
423 OUT_RING (chan, 1);
424 OUT_RING (chan, 2); /* RELEASE */
425 } else {
426 struct nouveau_vma *vma = &dev_priv->fence.bo->vma;
427 u64 offset = vma->offset + sema->mem->start;
428
429 ret = RING_SPACE(chan, 5);
430 if (ret)
431 return ret;
432
433 BEGIN_NVC0(chan, 2, NvSubM2MF, 0x0010, 4);
434 OUT_RING (chan, upper_32_bits(offset));
435 OUT_RING (chan, lower_32_bits(offset));
436 OUT_RING (chan, 1);
437 OUT_RING (chan, 0x1002); /* RELEASE */
438 }
439
440 /* Delay semaphore destruction until its work is done */
441 ret = nouveau_fence_new(chan, &fence, true);
442 if (ret)
443 return ret;
444
445 kref_get(&sema->ref);
446 nouveau_fence_work(fence, semaphore_work, sema);
447 nouveau_fence_unref(&fence);
448 return 0;
449}
450
216int 451int
217nouveau_fence_flush(void *sync_obj, void *sync_arg) 452nouveau_fence_sync(struct nouveau_fence *fence,
453 struct nouveau_channel *wchan)
454{
455 struct nouveau_channel *chan = nouveau_fence_channel(fence);
456 struct drm_device *dev = wchan->dev;
457 struct nouveau_semaphore *sema;
458 int ret = 0;
459
460 if (likely(!chan || chan == wchan ||
461 nouveau_fence_signalled(fence)))
462 goto out;
463
464 sema = semaphore_alloc(dev);
465 if (!sema) {
466 /* Early card or broken userspace, fall back to
467 * software sync. */
468 ret = nouveau_fence_wait(fence, true, false);
469 goto out;
470 }
471
472 /* try to take chan's mutex, if we can't take it right away
473 * we have to fallback to software sync to prevent locking
474 * order issues
475 */
476 if (!mutex_trylock(&chan->mutex)) {
477 ret = nouveau_fence_wait(fence, true, false);
478 goto out_unref;
479 }
480
481 /* Make wchan wait until it gets signalled */
482 ret = semaphore_acquire(wchan, sema);
483 if (ret)
484 goto out_unlock;
485
486 /* Signal the semaphore from chan */
487 ret = semaphore_release(chan, sema);
488
489out_unlock:
490 mutex_unlock(&chan->mutex);
491out_unref:
492 kref_put(&sema->ref, semaphore_free);
493out:
494 if (chan)
495 nouveau_channel_put_unlocked(&chan);
496 return ret;
497}
498
499int
500__nouveau_fence_flush(void *sync_obj, void *sync_arg)
218{ 501{
219 return 0; 502 return 0;
220} 503}
221 504
222int 505int
223nouveau_fence_init(struct nouveau_channel *chan) 506nouveau_fence_channel_init(struct nouveau_channel *chan)
224{ 507{
508 struct drm_device *dev = chan->dev;
509 struct drm_nouveau_private *dev_priv = dev->dev_private;
510 struct nouveau_gpuobj *obj = NULL;
511 int ret;
512
513 if (dev_priv->card_type < NV_C0) {
514 /* Create an NV_SW object for various sync purposes */
515 ret = nouveau_gpuobj_gr_new(chan, NvSw, NV_SW);
516 if (ret)
517 return ret;
518
519 ret = RING_SPACE(chan, 2);
520 if (ret)
521 return ret;
522
523 BEGIN_RING(chan, NvSubSw, 0, 1);
524 OUT_RING (chan, NvSw);
525 FIRE_RING (chan);
526 }
527
528 /* Setup area of memory shared between all channels for x-chan sync */
529 if (USE_SEMA(dev) && dev_priv->chipset < 0x84) {
530 struct ttm_mem_reg *mem = &dev_priv->fence.bo->bo.mem;
531
532 ret = nouveau_gpuobj_dma_new(chan, NV_CLASS_DMA_IN_MEMORY,
533 mem->start << PAGE_SHIFT,
534 mem->size, NV_MEM_ACCESS_RW,
535 NV_MEM_TARGET_VRAM, &obj);
536 if (ret)
537 return ret;
538
539 ret = nouveau_ramht_insert(chan, NvSema, obj);
540 nouveau_gpuobj_ref(NULL, &obj);
541 if (ret)
542 return ret;
543 }
544
225 INIT_LIST_HEAD(&chan->fence.pending); 545 INIT_LIST_HEAD(&chan->fence.pending);
226 spin_lock_init(&chan->fence.lock); 546 spin_lock_init(&chan->fence.lock);
227 atomic_set(&chan->fence.last_sequence_irq, 0); 547 atomic_set(&chan->fence.last_sequence_irq, 0);
@@ -229,17 +549,71 @@ nouveau_fence_init(struct nouveau_channel *chan)
229} 549}
230 550
231void 551void
232nouveau_fence_fini(struct nouveau_channel *chan) 552nouveau_fence_channel_fini(struct nouveau_channel *chan)
233{ 553{
234 struct list_head *entry, *tmp; 554 struct nouveau_fence *tmp, *fence;
235 struct nouveau_fence *fence;
236 555
237 list_for_each_safe(entry, tmp, &chan->fence.pending) { 556 spin_lock(&chan->fence.lock);
238 fence = list_entry(entry, struct nouveau_fence, entry);
239 557
558 list_for_each_entry_safe(fence, tmp, &chan->fence.pending, entry) {
240 fence->signalled = true; 559 fence->signalled = true;
241 list_del(&fence->entry); 560 list_del(&fence->entry);
561
562 if (unlikely(fence->work))
563 fence->work(fence->priv, false);
564
242 kref_put(&fence->refcount, nouveau_fence_del); 565 kref_put(&fence->refcount, nouveau_fence_del);
243 } 566 }
567
568 spin_unlock(&chan->fence.lock);
569}
570
571int
572nouveau_fence_init(struct drm_device *dev)
573{
574 struct drm_nouveau_private *dev_priv = dev->dev_private;
575 int size = (dev_priv->chipset < 0x84) ? 4096 : 16384;
576 int ret;
577
578 /* Create a shared VRAM heap for cross-channel sync. */
579 if (USE_SEMA(dev)) {
580 ret = nouveau_bo_new(dev, NULL, size, 0, TTM_PL_FLAG_VRAM,
581 0, 0, &dev_priv->fence.bo);
582 if (ret)
583 return ret;
584
585 ret = nouveau_bo_pin(dev_priv->fence.bo, TTM_PL_FLAG_VRAM);
586 if (ret)
587 goto fail;
588
589 ret = nouveau_bo_map(dev_priv->fence.bo);
590 if (ret)
591 goto fail;
592
593 ret = drm_mm_init(&dev_priv->fence.heap, 0,
594 dev_priv->fence.bo->bo.mem.size);
595 if (ret)
596 goto fail;
597
598 spin_lock_init(&dev_priv->fence.lock);
599 }
600
601 return 0;
602fail:
603 nouveau_bo_unmap(dev_priv->fence.bo);
604 nouveau_bo_ref(NULL, &dev_priv->fence.bo);
605 return ret;
244} 606}
245 607
608void
609nouveau_fence_fini(struct drm_device *dev)
610{
611 struct drm_nouveau_private *dev_priv = dev->dev_private;
612
613 if (USE_SEMA(dev)) {
614 drm_mm_takedown(&dev_priv->fence.heap);
615 nouveau_bo_unmap(dev_priv->fence.bo);
616 nouveau_bo_unpin(dev_priv->fence.bo);
617 nouveau_bo_ref(NULL, &dev_priv->fence.bo);
618 }
619}
diff --git a/drivers/gpu/drm/nouveau/nouveau_gem.c b/drivers/gpu/drm/nouveau/nouveau_gem.c
index 19620a6709f5..b52e46018245 100644
--- a/drivers/gpu/drm/nouveau/nouveau_gem.c
+++ b/drivers/gpu/drm/nouveau/nouveau_gem.c
@@ -48,9 +48,6 @@ nouveau_gem_object_del(struct drm_gem_object *gem)
48 return; 48 return;
49 nvbo->gem = NULL; 49 nvbo->gem = NULL;
50 50
51 if (unlikely(nvbo->cpu_filp))
52 ttm_bo_synccpu_write_release(bo);
53
54 if (unlikely(nvbo->pin_refcnt)) { 51 if (unlikely(nvbo->pin_refcnt)) {
55 nvbo->pin_refcnt = 1; 52 nvbo->pin_refcnt = 1;
56 nouveau_bo_unpin(nvbo); 53 nouveau_bo_unpin(nvbo);
@@ -64,26 +61,43 @@ nouveau_gem_object_del(struct drm_gem_object *gem)
64 61
65int 62int
66nouveau_gem_new(struct drm_device *dev, struct nouveau_channel *chan, 63nouveau_gem_new(struct drm_device *dev, struct nouveau_channel *chan,
67 int size, int align, uint32_t flags, uint32_t tile_mode, 64 int size, int align, uint32_t domain, uint32_t tile_mode,
68 uint32_t tile_flags, bool no_vm, bool mappable, 65 uint32_t tile_flags, struct nouveau_bo **pnvbo)
69 struct nouveau_bo **pnvbo)
70{ 66{
67 struct drm_nouveau_private *dev_priv = dev->dev_private;
71 struct nouveau_bo *nvbo; 68 struct nouveau_bo *nvbo;
69 u32 flags = 0;
72 int ret; 70 int ret;
73 71
72 if (domain & NOUVEAU_GEM_DOMAIN_VRAM)
73 flags |= TTM_PL_FLAG_VRAM;
74 if (domain & NOUVEAU_GEM_DOMAIN_GART)
75 flags |= TTM_PL_FLAG_TT;
76 if (!flags || domain & NOUVEAU_GEM_DOMAIN_CPU)
77 flags |= TTM_PL_FLAG_SYSTEM;
78
74 ret = nouveau_bo_new(dev, chan, size, align, flags, tile_mode, 79 ret = nouveau_bo_new(dev, chan, size, align, flags, tile_mode,
75 tile_flags, no_vm, mappable, pnvbo); 80 tile_flags, pnvbo);
76 if (ret) 81 if (ret)
77 return ret; 82 return ret;
78 nvbo = *pnvbo; 83 nvbo = *pnvbo;
79 84
85 /* we restrict allowed domains on nv50+ to only the types
86 * that were requested at creation time. not possibly on
87 * earlier chips without busting the ABI.
88 */
89 nvbo->valid_domains = NOUVEAU_GEM_DOMAIN_VRAM |
90 NOUVEAU_GEM_DOMAIN_GART;
91 if (dev_priv->card_type >= NV_50)
92 nvbo->valid_domains &= domain;
93
80 nvbo->gem = drm_gem_object_alloc(dev, nvbo->bo.mem.size); 94 nvbo->gem = drm_gem_object_alloc(dev, nvbo->bo.mem.size);
81 if (!nvbo->gem) { 95 if (!nvbo->gem) {
82 nouveau_bo_ref(NULL, pnvbo); 96 nouveau_bo_ref(NULL, pnvbo);
83 return -ENOMEM; 97 return -ENOMEM;
84 } 98 }
85 99
86 nvbo->bo.persistant_swap_storage = nvbo->gem->filp; 100 nvbo->bo.persistent_swap_storage = nvbo->gem->filp;
87 nvbo->gem->driver_private = nvbo; 101 nvbo->gem->driver_private = nvbo;
88 return 0; 102 return 0;
89} 103}
@@ -100,32 +114,12 @@ nouveau_gem_info(struct drm_gem_object *gem, struct drm_nouveau_gem_info *rep)
100 114
101 rep->size = nvbo->bo.mem.num_pages << PAGE_SHIFT; 115 rep->size = nvbo->bo.mem.num_pages << PAGE_SHIFT;
102 rep->offset = nvbo->bo.offset; 116 rep->offset = nvbo->bo.offset;
103 rep->map_handle = nvbo->mappable ? nvbo->bo.addr_space_offset : 0; 117 rep->map_handle = nvbo->bo.addr_space_offset;
104 rep->tile_mode = nvbo->tile_mode; 118 rep->tile_mode = nvbo->tile_mode;
105 rep->tile_flags = nvbo->tile_flags; 119 rep->tile_flags = nvbo->tile_flags;
106 return 0; 120 return 0;
107} 121}
108 122
109static bool
110nouveau_gem_tile_flags_valid(struct drm_device *dev, uint32_t tile_flags) {
111 switch (tile_flags) {
112 case 0x0000:
113 case 0x1800:
114 case 0x2800:
115 case 0x4800:
116 case 0x7000:
117 case 0x7400:
118 case 0x7a00:
119 case 0xe000:
120 break;
121 default:
122 NV_ERROR(dev, "bad page flags: 0x%08x\n", tile_flags);
123 return false;
124 }
125
126 return true;
127}
128
129int 123int
130nouveau_gem_ioctl_new(struct drm_device *dev, void *data, 124nouveau_gem_ioctl_new(struct drm_device *dev, void *data,
131 struct drm_file *file_priv) 125 struct drm_file *file_priv)
@@ -134,31 +128,27 @@ nouveau_gem_ioctl_new(struct drm_device *dev, void *data,
134 struct drm_nouveau_gem_new *req = data; 128 struct drm_nouveau_gem_new *req = data;
135 struct nouveau_bo *nvbo = NULL; 129 struct nouveau_bo *nvbo = NULL;
136 struct nouveau_channel *chan = NULL; 130 struct nouveau_channel *chan = NULL;
137 uint32_t flags = 0;
138 int ret = 0; 131 int ret = 0;
139 132
140 if (unlikely(dev_priv->ttm.bdev.dev_mapping == NULL)) 133 if (unlikely(dev_priv->ttm.bdev.dev_mapping == NULL))
141 dev_priv->ttm.bdev.dev_mapping = dev_priv->dev->dev_mapping; 134 dev_priv->ttm.bdev.dev_mapping = dev_priv->dev->dev_mapping;
142 135
143 if (req->channel_hint) { 136 if (!dev_priv->engine.vram.flags_valid(dev, req->info.tile_flags)) {
144 NOUVEAU_GET_USER_CHANNEL_WITH_RETURN(req->channel_hint, 137 NV_ERROR(dev, "bad page flags: 0x%08x\n", req->info.tile_flags);
145 file_priv, chan); 138 return -EINVAL;
146 } 139 }
147 140
148 if (req->info.domain & NOUVEAU_GEM_DOMAIN_VRAM) 141 if (req->channel_hint) {
149 flags |= TTM_PL_FLAG_VRAM; 142 chan = nouveau_channel_get(dev, file_priv, req->channel_hint);
150 if (req->info.domain & NOUVEAU_GEM_DOMAIN_GART) 143 if (IS_ERR(chan))
151 flags |= TTM_PL_FLAG_TT; 144 return PTR_ERR(chan);
152 if (!flags || req->info.domain & NOUVEAU_GEM_DOMAIN_CPU) 145 }
153 flags |= TTM_PL_FLAG_SYSTEM;
154
155 if (!nouveau_gem_tile_flags_valid(dev, req->info.tile_flags))
156 return -EINVAL;
157 146
158 ret = nouveau_gem_new(dev, chan, req->info.size, req->align, flags, 147 ret = nouveau_gem_new(dev, chan, req->info.size, req->align,
159 req->info.tile_mode, req->info.tile_flags, false, 148 req->info.domain, req->info.tile_mode,
160 (req->info.domain & NOUVEAU_GEM_DOMAIN_MAPPABLE), 149 req->info.tile_flags, &nvbo);
161 &nvbo); 150 if (chan)
151 nouveau_channel_put(&chan);
162 if (ret) 152 if (ret)
163 return ret; 153 return ret;
164 154
@@ -179,7 +169,7 @@ nouveau_gem_set_domain(struct drm_gem_object *gem, uint32_t read_domains,
179{ 169{
180 struct nouveau_bo *nvbo = gem->driver_private; 170 struct nouveau_bo *nvbo = gem->driver_private;
181 struct ttm_buffer_object *bo = &nvbo->bo; 171 struct ttm_buffer_object *bo = &nvbo->bo;
182 uint32_t domains = valid_domains & 172 uint32_t domains = valid_domains & nvbo->valid_domains &
183 (write_domains ? write_domains : read_domains); 173 (write_domains ? write_domains : read_domains);
184 uint32_t pref_flags = 0, valid_flags = 0; 174 uint32_t pref_flags = 0, valid_flags = 0;
185 175
@@ -225,15 +215,8 @@ validate_fini_list(struct list_head *list, struct nouveau_fence *fence)
225 215
226 list_for_each_safe(entry, tmp, list) { 216 list_for_each_safe(entry, tmp, list) {
227 nvbo = list_entry(entry, struct nouveau_bo, entry); 217 nvbo = list_entry(entry, struct nouveau_bo, entry);
228 if (likely(fence)) { 218
229 struct nouveau_fence *prev_fence; 219 nouveau_bo_fence(nvbo, fence);
230
231 spin_lock(&nvbo->bo.lock);
232 prev_fence = nvbo->bo.sync_obj;
233 nvbo->bo.sync_obj = nouveau_fence_ref(fence);
234 spin_unlock(&nvbo->bo.lock);
235 nouveau_fence_unref((void *)&prev_fence);
236 }
237 220
238 if (unlikely(nvbo->validate_mapped)) { 221 if (unlikely(nvbo->validate_mapped)) {
239 ttm_bo_kunmap(&nvbo->kmap); 222 ttm_bo_kunmap(&nvbo->kmap);
@@ -293,14 +276,15 @@ retry:
293 return -EINVAL; 276 return -EINVAL;
294 } 277 }
295 278
296 ret = ttm_bo_reserve(&nvbo->bo, false, false, true, sequence); 279 ret = ttm_bo_reserve(&nvbo->bo, true, false, true, sequence);
297 if (ret) { 280 if (ret) {
298 validate_fini(op, NULL); 281 validate_fini(op, NULL);
299 if (ret == -EAGAIN) 282 if (unlikely(ret == -EAGAIN))
300 ret = ttm_bo_wait_unreserved(&nvbo->bo, false); 283 ret = ttm_bo_wait_unreserved(&nvbo->bo, true);
301 drm_gem_object_unreference_unlocked(gem); 284 drm_gem_object_unreference_unlocked(gem);
302 if (ret) { 285 if (unlikely(ret)) {
303 NV_ERROR(dev, "fail reserve\n"); 286 if (ret != -ERESTARTSYS)
287 NV_ERROR(dev, "fail reserve\n");
304 return ret; 288 return ret;
305 } 289 }
306 goto retry; 290 goto retry;
@@ -325,25 +309,6 @@ retry:
325 validate_fini(op, NULL); 309 validate_fini(op, NULL);
326 return -EINVAL; 310 return -EINVAL;
327 } 311 }
328
329 if (unlikely(atomic_read(&nvbo->bo.cpu_writers) > 0)) {
330 validate_fini(op, NULL);
331
332 if (nvbo->cpu_filp == file_priv) {
333 NV_ERROR(dev, "bo %p mapped by process trying "
334 "to validate it!\n", nvbo);
335 return -EINVAL;
336 }
337
338 mutex_unlock(&drm_global_mutex);
339 ret = ttm_bo_wait_cpu(&nvbo->bo, false);
340 mutex_lock(&drm_global_mutex);
341 if (ret) {
342 NV_ERROR(dev, "fail wait_cpu\n");
343 return ret;
344 }
345 goto retry;
346 }
347 } 312 }
348 313
349 return 0; 314 return 0;
@@ -362,7 +327,7 @@ validate_list(struct nouveau_channel *chan, struct list_head *list,
362 list_for_each_entry(nvbo, list, entry) { 327 list_for_each_entry(nvbo, list, entry) {
363 struct drm_nouveau_gem_pushbuf_bo *b = &pbbo[nvbo->pbbo_index]; 328 struct drm_nouveau_gem_pushbuf_bo *b = &pbbo[nvbo->pbbo_index];
364 329
365 ret = nouveau_bo_sync_gpu(nvbo, chan); 330 ret = nouveau_fence_sync(nvbo->bo.sync_obj, chan);
366 if (unlikely(ret)) { 331 if (unlikely(ret)) {
367 NV_ERROR(dev, "fail pre-validate sync\n"); 332 NV_ERROR(dev, "fail pre-validate sync\n");
368 return ret; 333 return ret;
@@ -377,15 +342,15 @@ validate_list(struct nouveau_channel *chan, struct list_head *list,
377 } 342 }
378 343
379 nvbo->channel = (b->read_domains & (1 << 31)) ? NULL : chan; 344 nvbo->channel = (b->read_domains & (1 << 31)) ? NULL : chan;
380 ret = ttm_bo_validate(&nvbo->bo, &nvbo->placement, 345 ret = nouveau_bo_validate(nvbo, true, false, false);
381 false, false, false);
382 nvbo->channel = NULL; 346 nvbo->channel = NULL;
383 if (unlikely(ret)) { 347 if (unlikely(ret)) {
384 NV_ERROR(dev, "fail ttm_validate\n"); 348 if (ret != -ERESTARTSYS)
349 NV_ERROR(dev, "fail ttm_validate\n");
385 return ret; 350 return ret;
386 } 351 }
387 352
388 ret = nouveau_bo_sync_gpu(nvbo, chan); 353 ret = nouveau_fence_sync(nvbo->bo.sync_obj, chan);
389 if (unlikely(ret)) { 354 if (unlikely(ret)) {
390 NV_ERROR(dev, "fail post-validate sync\n"); 355 NV_ERROR(dev, "fail post-validate sync\n");
391 return ret; 356 return ret;
@@ -433,13 +398,15 @@ nouveau_gem_pushbuf_validate(struct nouveau_channel *chan,
433 398
434 ret = validate_init(chan, file_priv, pbbo, nr_buffers, op); 399 ret = validate_init(chan, file_priv, pbbo, nr_buffers, op);
435 if (unlikely(ret)) { 400 if (unlikely(ret)) {
436 NV_ERROR(dev, "validate_init\n"); 401 if (ret != -ERESTARTSYS)
402 NV_ERROR(dev, "validate_init\n");
437 return ret; 403 return ret;
438 } 404 }
439 405
440 ret = validate_list(chan, &op->vram_list, pbbo, user_buffers); 406 ret = validate_list(chan, &op->vram_list, pbbo, user_buffers);
441 if (unlikely(ret < 0)) { 407 if (unlikely(ret < 0)) {
442 NV_ERROR(dev, "validate vram_list\n"); 408 if (ret != -ERESTARTSYS)
409 NV_ERROR(dev, "validate vram_list\n");
443 validate_fini(op, NULL); 410 validate_fini(op, NULL);
444 return ret; 411 return ret;
445 } 412 }
@@ -447,7 +414,8 @@ nouveau_gem_pushbuf_validate(struct nouveau_channel *chan,
447 414
448 ret = validate_list(chan, &op->gart_list, pbbo, user_buffers); 415 ret = validate_list(chan, &op->gart_list, pbbo, user_buffers);
449 if (unlikely(ret < 0)) { 416 if (unlikely(ret < 0)) {
450 NV_ERROR(dev, "validate gart_list\n"); 417 if (ret != -ERESTARTSYS)
418 NV_ERROR(dev, "validate gart_list\n");
451 validate_fini(op, NULL); 419 validate_fini(op, NULL);
452 return ret; 420 return ret;
453 } 421 }
@@ -455,7 +423,8 @@ nouveau_gem_pushbuf_validate(struct nouveau_channel *chan,
455 423
456 ret = validate_list(chan, &op->both_list, pbbo, user_buffers); 424 ret = validate_list(chan, &op->both_list, pbbo, user_buffers);
457 if (unlikely(ret < 0)) { 425 if (unlikely(ret < 0)) {
458 NV_ERROR(dev, "validate both_list\n"); 426 if (ret != -ERESTARTSYS)
427 NV_ERROR(dev, "validate both_list\n");
459 validate_fini(op, NULL); 428 validate_fini(op, NULL);
460 return ret; 429 return ret;
461 } 430 }
@@ -551,9 +520,9 @@ nouveau_gem_pushbuf_reloc_apply(struct drm_device *dev,
551 data |= r->vor; 520 data |= r->vor;
552 } 521 }
553 522
554 spin_lock(&nvbo->bo.lock); 523 spin_lock(&nvbo->bo.bdev->fence_lock);
555 ret = ttm_bo_wait(&nvbo->bo, false, false, false); 524 ret = ttm_bo_wait(&nvbo->bo, false, false, false);
556 spin_unlock(&nvbo->bo.lock); 525 spin_unlock(&nvbo->bo.bdev->fence_lock);
557 if (ret) { 526 if (ret) {
558 NV_ERROR(dev, "reloc wait_idle failed: %d\n", ret); 527 NV_ERROR(dev, "reloc wait_idle failed: %d\n", ret);
559 break; 528 break;
@@ -579,7 +548,9 @@ nouveau_gem_ioctl_pushbuf(struct drm_device *dev, void *data,
579 struct nouveau_fence *fence = NULL; 548 struct nouveau_fence *fence = NULL;
580 int i, j, ret = 0, do_reloc = 0; 549 int i, j, ret = 0, do_reloc = 0;
581 550
582 NOUVEAU_GET_USER_CHANNEL_WITH_RETURN(req->channel, file_priv, chan); 551 chan = nouveau_channel_get(dev, file_priv, req->channel);
552 if (IS_ERR(chan))
553 return PTR_ERR(chan);
583 554
584 req->vram_available = dev_priv->fb_aper_free; 555 req->vram_available = dev_priv->fb_aper_free;
585 req->gart_available = dev_priv->gart_info.aper_free; 556 req->gart_available = dev_priv->gart_info.aper_free;
@@ -589,28 +560,34 @@ nouveau_gem_ioctl_pushbuf(struct drm_device *dev, void *data,
589 if (unlikely(req->nr_push > NOUVEAU_GEM_MAX_PUSH)) { 560 if (unlikely(req->nr_push > NOUVEAU_GEM_MAX_PUSH)) {
590 NV_ERROR(dev, "pushbuf push count exceeds limit: %d max %d\n", 561 NV_ERROR(dev, "pushbuf push count exceeds limit: %d max %d\n",
591 req->nr_push, NOUVEAU_GEM_MAX_PUSH); 562 req->nr_push, NOUVEAU_GEM_MAX_PUSH);
563 nouveau_channel_put(&chan);
592 return -EINVAL; 564 return -EINVAL;
593 } 565 }
594 566
595 if (unlikely(req->nr_buffers > NOUVEAU_GEM_MAX_BUFFERS)) { 567 if (unlikely(req->nr_buffers > NOUVEAU_GEM_MAX_BUFFERS)) {
596 NV_ERROR(dev, "pushbuf bo count exceeds limit: %d max %d\n", 568 NV_ERROR(dev, "pushbuf bo count exceeds limit: %d max %d\n",
597 req->nr_buffers, NOUVEAU_GEM_MAX_BUFFERS); 569 req->nr_buffers, NOUVEAU_GEM_MAX_BUFFERS);
570 nouveau_channel_put(&chan);
598 return -EINVAL; 571 return -EINVAL;
599 } 572 }
600 573
601 if (unlikely(req->nr_relocs > NOUVEAU_GEM_MAX_RELOCS)) { 574 if (unlikely(req->nr_relocs > NOUVEAU_GEM_MAX_RELOCS)) {
602 NV_ERROR(dev, "pushbuf reloc count exceeds limit: %d max %d\n", 575 NV_ERROR(dev, "pushbuf reloc count exceeds limit: %d max %d\n",
603 req->nr_relocs, NOUVEAU_GEM_MAX_RELOCS); 576 req->nr_relocs, NOUVEAU_GEM_MAX_RELOCS);
577 nouveau_channel_put(&chan);
604 return -EINVAL; 578 return -EINVAL;
605 } 579 }
606 580
607 push = u_memcpya(req->push, req->nr_push, sizeof(*push)); 581 push = u_memcpya(req->push, req->nr_push, sizeof(*push));
608 if (IS_ERR(push)) 582 if (IS_ERR(push)) {
583 nouveau_channel_put(&chan);
609 return PTR_ERR(push); 584 return PTR_ERR(push);
585 }
610 586
611 bo = u_memcpya(req->buffers, req->nr_buffers, sizeof(*bo)); 587 bo = u_memcpya(req->buffers, req->nr_buffers, sizeof(*bo));
612 if (IS_ERR(bo)) { 588 if (IS_ERR(bo)) {
613 kfree(push); 589 kfree(push);
590 nouveau_channel_put(&chan);
614 return PTR_ERR(bo); 591 return PTR_ERR(bo);
615 } 592 }
616 593
@@ -623,7 +600,7 @@ nouveau_gem_ioctl_pushbuf(struct drm_device *dev, void *data,
623 if (push[i].bo_index >= req->nr_buffers) { 600 if (push[i].bo_index >= req->nr_buffers) {
624 NV_ERROR(dev, "push %d buffer not in list\n", i); 601 NV_ERROR(dev, "push %d buffer not in list\n", i);
625 ret = -EINVAL; 602 ret = -EINVAL;
626 goto out; 603 goto out_prevalid;
627 } 604 }
628 605
629 bo[push[i].bo_index].read_domains |= (1 << 31); 606 bo[push[i].bo_index].read_domains |= (1 << 31);
@@ -633,8 +610,9 @@ nouveau_gem_ioctl_pushbuf(struct drm_device *dev, void *data,
633 ret = nouveau_gem_pushbuf_validate(chan, file_priv, bo, req->buffers, 610 ret = nouveau_gem_pushbuf_validate(chan, file_priv, bo, req->buffers,
634 req->nr_buffers, &op, &do_reloc); 611 req->nr_buffers, &op, &do_reloc);
635 if (ret) { 612 if (ret) {
636 NV_ERROR(dev, "validate: %d\n", ret); 613 if (ret != -ERESTARTSYS)
637 goto out; 614 NV_ERROR(dev, "validate: %d\n", ret);
615 goto out_prevalid;
638 } 616 }
639 617
640 /* Apply any relocations that are required */ 618 /* Apply any relocations that are required */
@@ -726,7 +704,9 @@ nouveau_gem_ioctl_pushbuf(struct drm_device *dev, void *data,
726 704
727out: 705out:
728 validate_fini(&op, fence); 706 validate_fini(&op, fence);
729 nouveau_fence_unref((void**)&fence); 707 nouveau_fence_unref(&fence);
708
709out_prevalid:
730 kfree(bo); 710 kfree(bo);
731 kfree(push); 711 kfree(push);
732 712
@@ -744,6 +724,7 @@ out_next:
744 req->suffix1 = 0x00000000; 724 req->suffix1 = 0x00000000;
745 } 725 }
746 726
727 nouveau_channel_put(&chan);
747 return ret; 728 return ret;
748} 729}
749 730
@@ -775,26 +756,9 @@ nouveau_gem_ioctl_cpu_prep(struct drm_device *dev, void *data,
775 return -ENOENT; 756 return -ENOENT;
776 nvbo = nouveau_gem_object(gem); 757 nvbo = nouveau_gem_object(gem);
777 758
778 if (nvbo->cpu_filp) { 759 spin_lock(&nvbo->bo.bdev->fence_lock);
779 if (nvbo->cpu_filp == file_priv) 760 ret = ttm_bo_wait(&nvbo->bo, true, true, no_wait);
780 goto out; 761 spin_unlock(&nvbo->bo.bdev->fence_lock);
781
782 ret = ttm_bo_wait_cpu(&nvbo->bo, no_wait);
783 if (ret)
784 goto out;
785 }
786
787 if (req->flags & NOUVEAU_GEM_CPU_PREP_NOBLOCK) {
788 spin_lock(&nvbo->bo.lock);
789 ret = ttm_bo_wait(&nvbo->bo, false, false, no_wait);
790 spin_unlock(&nvbo->bo.lock);
791 } else {
792 ret = ttm_bo_synccpu_write_grab(&nvbo->bo, no_wait);
793 if (ret == 0)
794 nvbo->cpu_filp = file_priv;
795 }
796
797out:
798 drm_gem_object_unreference_unlocked(gem); 762 drm_gem_object_unreference_unlocked(gem);
799 return ret; 763 return ret;
800} 764}
@@ -803,26 +767,7 @@ int
803nouveau_gem_ioctl_cpu_fini(struct drm_device *dev, void *data, 767nouveau_gem_ioctl_cpu_fini(struct drm_device *dev, void *data,
804 struct drm_file *file_priv) 768 struct drm_file *file_priv)
805{ 769{
806 struct drm_nouveau_gem_cpu_prep *req = data; 770 return 0;
807 struct drm_gem_object *gem;
808 struct nouveau_bo *nvbo;
809 int ret = -EINVAL;
810
811 gem = drm_gem_object_lookup(dev, file_priv, req->handle);
812 if (!gem)
813 return -ENOENT;
814 nvbo = nouveau_gem_object(gem);
815
816 if (nvbo->cpu_filp != file_priv)
817 goto out;
818 nvbo->cpu_filp = NULL;
819
820 ttm_bo_synccpu_write_release(&nvbo->bo);
821 ret = 0;
822
823out:
824 drm_gem_object_unreference_unlocked(gem);
825 return ret;
826} 771}
827 772
828int 773int
diff --git a/drivers/gpu/drm/nouveau/nouveau_grctx.h b/drivers/gpu/drm/nouveau/nouveau_grctx.h
index 5d39c4ce8006..86c2e374e938 100644
--- a/drivers/gpu/drm/nouveau/nouveau_grctx.h
+++ b/drivers/gpu/drm/nouveau/nouveau_grctx.h
@@ -87,10 +87,10 @@ _cp_bra(struct nouveau_grctx *ctx, u32 mod, int flag, int state, int name)
87 cp_out(ctx, CP_BRA | (mod << 18) | ip | flag | 87 cp_out(ctx, CP_BRA | (mod << 18) | ip | flag |
88 (state ? 0 : CP_BRA_IF_CLEAR)); 88 (state ? 0 : CP_BRA_IF_CLEAR));
89} 89}
90#define cp_bra(c,f,s,n) _cp_bra((c), 0, CP_FLAG_##f, CP_FLAG_##f##_##s, n) 90#define cp_bra(c, f, s, n) _cp_bra((c), 0, CP_FLAG_##f, CP_FLAG_##f##_##s, n)
91#ifdef CP_BRA_MOD 91#ifdef CP_BRA_MOD
92#define cp_cal(c,f,s,n) _cp_bra((c), 1, CP_FLAG_##f, CP_FLAG_##f##_##s, n) 92#define cp_cal(c, f, s, n) _cp_bra((c), 1, CP_FLAG_##f, CP_FLAG_##f##_##s, n)
93#define cp_ret(c,f,s) _cp_bra((c), 2, CP_FLAG_##f, CP_FLAG_##f##_##s, 0) 93#define cp_ret(c, f, s) _cp_bra((c), 2, CP_FLAG_##f, CP_FLAG_##f##_##s, 0)
94#endif 94#endif
95 95
96static inline void 96static inline void
@@ -98,14 +98,14 @@ _cp_wait(struct nouveau_grctx *ctx, int flag, int state)
98{ 98{
99 cp_out(ctx, CP_WAIT | flag | (state ? CP_WAIT_SET : 0)); 99 cp_out(ctx, CP_WAIT | flag | (state ? CP_WAIT_SET : 0));
100} 100}
101#define cp_wait(c,f,s) _cp_wait((c), CP_FLAG_##f, CP_FLAG_##f##_##s) 101#define cp_wait(c, f, s) _cp_wait((c), CP_FLAG_##f, CP_FLAG_##f##_##s)
102 102
103static inline void 103static inline void
104_cp_set(struct nouveau_grctx *ctx, int flag, int state) 104_cp_set(struct nouveau_grctx *ctx, int flag, int state)
105{ 105{
106 cp_out(ctx, CP_SET | flag | (state ? CP_SET_1 : 0)); 106 cp_out(ctx, CP_SET | flag | (state ? CP_SET_1 : 0));
107} 107}
108#define cp_set(c,f,s) _cp_set((c), CP_FLAG_##f, CP_FLAG_##f##_##s) 108#define cp_set(c, f, s) _cp_set((c), CP_FLAG_##f, CP_FLAG_##f##_##s)
109 109
110static inline void 110static inline void
111cp_pos(struct nouveau_grctx *ctx, int offset) 111cp_pos(struct nouveau_grctx *ctx, int offset)
@@ -126,7 +126,7 @@ gr_def(struct nouveau_grctx *ctx, uint32_t reg, uint32_t val)
126 reg = (reg - 0x00400000) / 4; 126 reg = (reg - 0x00400000) / 4;
127 reg = (reg - ctx->ctxprog_reg) + ctx->ctxvals_base; 127 reg = (reg - ctx->ctxprog_reg) + ctx->ctxvals_base;
128 128
129 nv_wo32(ctx->dev, ctx->data, reg, val); 129 nv_wo32(ctx->data, reg * 4, val);
130} 130}
131#endif 131#endif
132 132
diff --git a/drivers/gpu/drm/nouveau/nouveau_hw.c b/drivers/gpu/drm/nouveau/nouveau_hw.c
index 7b613682e400..ba896e54b799 100644
--- a/drivers/gpu/drm/nouveau/nouveau_hw.c
+++ b/drivers/gpu/drm/nouveau/nouveau_hw.c
@@ -305,7 +305,7 @@ setPLL_double_lowregs(struct drm_device *dev, uint32_t NMNMreg,
305 bool mpll = Preg == 0x4020; 305 bool mpll = Preg == 0x4020;
306 uint32_t oldPval = nvReadMC(dev, Preg); 306 uint32_t oldPval = nvReadMC(dev, Preg);
307 uint32_t NMNM = pv->NM2 << 16 | pv->NM1; 307 uint32_t NMNM = pv->NM2 << 16 | pv->NM1;
308 uint32_t Pval = (oldPval & (mpll ? ~(0x11 << 16) : ~(1 << 16))) | 308 uint32_t Pval = (oldPval & (mpll ? ~(0x77 << 16) : ~(7 << 16))) |
309 0xc << 28 | pv->log2P << 16; 309 0xc << 28 | pv->log2P << 16;
310 uint32_t saved4600 = 0; 310 uint32_t saved4600 = 0;
311 /* some cards have different maskc040s */ 311 /* some cards have different maskc040s */
@@ -427,22 +427,12 @@ nouveau_hw_get_pllvals(struct drm_device *dev, enum pll_types plltype,
427 struct nouveau_pll_vals *pllvals) 427 struct nouveau_pll_vals *pllvals)
428{ 428{
429 struct drm_nouveau_private *dev_priv = dev->dev_private; 429 struct drm_nouveau_private *dev_priv = dev->dev_private;
430 const uint32_t nv04_regs[MAX_PLL_TYPES] = { NV_PRAMDAC_NVPLL_COEFF, 430 uint32_t reg1 = get_pll_register(dev, plltype), pll1, pll2 = 0;
431 NV_PRAMDAC_MPLL_COEFF,
432 NV_PRAMDAC_VPLL_COEFF,
433 NV_RAMDAC_VPLL2 };
434 const uint32_t nv40_regs[MAX_PLL_TYPES] = { 0x4000,
435 0x4020,
436 NV_PRAMDAC_VPLL_COEFF,
437 NV_RAMDAC_VPLL2 };
438 uint32_t reg1, pll1, pll2 = 0;
439 struct pll_lims pll_lim; 431 struct pll_lims pll_lim;
440 int ret; 432 int ret;
441 433
442 if (dev_priv->card_type < NV_40) 434 if (reg1 == 0)
443 reg1 = nv04_regs[plltype]; 435 return -ENOENT;
444 else
445 reg1 = nv40_regs[plltype];
446 436
447 pll1 = nvReadMC(dev, reg1); 437 pll1 = nvReadMC(dev, reg1);
448 438
@@ -491,8 +481,10 @@ int
491nouveau_hw_get_clock(struct drm_device *dev, enum pll_types plltype) 481nouveau_hw_get_clock(struct drm_device *dev, enum pll_types plltype)
492{ 482{
493 struct nouveau_pll_vals pllvals; 483 struct nouveau_pll_vals pllvals;
484 int ret;
494 485
495 if (plltype == MPLL && (dev->pci_device & 0x0ff0) == CHIPSET_NFORCE) { 486 if (plltype == PLL_MEMORY &&
487 (dev->pci_device & 0x0ff0) == CHIPSET_NFORCE) {
496 uint32_t mpllP; 488 uint32_t mpllP;
497 489
498 pci_read_config_dword(pci_get_bus_and_slot(0, 3), 0x6c, &mpllP); 490 pci_read_config_dword(pci_get_bus_and_slot(0, 3), 0x6c, &mpllP);
@@ -501,14 +493,17 @@ nouveau_hw_get_clock(struct drm_device *dev, enum pll_types plltype)
501 493
502 return 400000 / mpllP; 494 return 400000 / mpllP;
503 } else 495 } else
504 if (plltype == MPLL && (dev->pci_device & 0xff0) == CHIPSET_NFORCE2) { 496 if (plltype == PLL_MEMORY &&
497 (dev->pci_device & 0xff0) == CHIPSET_NFORCE2) {
505 uint32_t clock; 498 uint32_t clock;
506 499
507 pci_read_config_dword(pci_get_bus_and_slot(0, 5), 0x4c, &clock); 500 pci_read_config_dword(pci_get_bus_and_slot(0, 5), 0x4c, &clock);
508 return clock; 501 return clock;
509 } 502 }
510 503
511 nouveau_hw_get_pllvals(dev, plltype, &pllvals); 504 ret = nouveau_hw_get_pllvals(dev, plltype, &pllvals);
505 if (ret)
506 return ret;
512 507
513 return nouveau_hw_pllvals_to_clk(&pllvals); 508 return nouveau_hw_pllvals_to_clk(&pllvals);
514} 509}
@@ -524,11 +519,11 @@ nouveau_hw_fix_bad_vpll(struct drm_device *dev, int head)
524 519
525 struct pll_lims pll_lim; 520 struct pll_lims pll_lim;
526 struct nouveau_pll_vals pv; 521 struct nouveau_pll_vals pv;
527 uint32_t pllreg = head ? NV_RAMDAC_VPLL2 : NV_PRAMDAC_VPLL_COEFF; 522 enum pll_types pll = head ? PLL_VPLL1 : PLL_VPLL0;
528 523
529 if (get_pll_limits(dev, head ? VPLL2 : VPLL1, &pll_lim)) 524 if (get_pll_limits(dev, pll, &pll_lim))
530 return; 525 return;
531 nouveau_hw_get_pllvals(dev, head ? VPLL2 : VPLL1, &pv); 526 nouveau_hw_get_pllvals(dev, pll, &pv);
532 527
533 if (pv.M1 >= pll_lim.vco1.min_m && pv.M1 <= pll_lim.vco1.max_m && 528 if (pv.M1 >= pll_lim.vco1.min_m && pv.M1 <= pll_lim.vco1.max_m &&
534 pv.N1 >= pll_lim.vco1.min_n && pv.N1 <= pll_lim.vco1.max_n && 529 pv.N1 >= pll_lim.vco1.min_n && pv.N1 <= pll_lim.vco1.max_n &&
@@ -541,7 +536,7 @@ nouveau_hw_fix_bad_vpll(struct drm_device *dev, int head)
541 pv.M1 = pll_lim.vco1.max_m; 536 pv.M1 = pll_lim.vco1.max_m;
542 pv.N1 = pll_lim.vco1.min_n; 537 pv.N1 = pll_lim.vco1.min_n;
543 pv.log2P = pll_lim.max_usable_log2p; 538 pv.log2P = pll_lim.max_usable_log2p;
544 nouveau_hw_setpll(dev, pllreg, &pv); 539 nouveau_hw_setpll(dev, pll_lim.reg, &pv);
545} 540}
546 541
547/* 542/*
@@ -661,7 +656,7 @@ nv_save_state_ramdac(struct drm_device *dev, int head,
661 if (dev_priv->card_type >= NV_10) 656 if (dev_priv->card_type >= NV_10)
662 regp->nv10_cursync = NVReadRAMDAC(dev, head, NV_RAMDAC_NV10_CURSYNC); 657 regp->nv10_cursync = NVReadRAMDAC(dev, head, NV_RAMDAC_NV10_CURSYNC);
663 658
664 nouveau_hw_get_pllvals(dev, head ? VPLL2 : VPLL1, &regp->pllvals); 659 nouveau_hw_get_pllvals(dev, head ? PLL_VPLL1 : PLL_VPLL0, &regp->pllvals);
665 state->pllsel = NVReadRAMDAC(dev, 0, NV_PRAMDAC_PLL_COEFF_SELECT); 660 state->pllsel = NVReadRAMDAC(dev, 0, NV_PRAMDAC_PLL_COEFF_SELECT);
666 if (nv_two_heads(dev)) 661 if (nv_two_heads(dev))
667 state->sel_clk = NVReadRAMDAC(dev, 0, NV_PRAMDAC_SEL_CLK); 662 state->sel_clk = NVReadRAMDAC(dev, 0, NV_PRAMDAC_SEL_CLK);
@@ -866,10 +861,11 @@ nv_save_state_ext(struct drm_device *dev, int head,
866 rd_cio_state(dev, head, regp, NV_CIO_CRE_FFLWM__INDEX); 861 rd_cio_state(dev, head, regp, NV_CIO_CRE_FFLWM__INDEX);
867 rd_cio_state(dev, head, regp, NV_CIO_CRE_21); 862 rd_cio_state(dev, head, regp, NV_CIO_CRE_21);
868 863
869 if (dev_priv->card_type >= NV_30) { 864 if (dev_priv->card_type >= NV_20)
870 rd_cio_state(dev, head, regp, NV_CIO_CRE_47); 865 rd_cio_state(dev, head, regp, NV_CIO_CRE_47);
866
867 if (dev_priv->card_type >= NV_30)
871 rd_cio_state(dev, head, regp, 0x9f); 868 rd_cio_state(dev, head, regp, 0x9f);
872 }
873 869
874 rd_cio_state(dev, head, regp, NV_CIO_CRE_49); 870 rd_cio_state(dev, head, regp, NV_CIO_CRE_49);
875 rd_cio_state(dev, head, regp, NV_CIO_CRE_HCUR_ADDR0_INDEX); 871 rd_cio_state(dev, head, regp, NV_CIO_CRE_HCUR_ADDR0_INDEX);
@@ -904,6 +900,7 @@ nv_save_state_ext(struct drm_device *dev, int head,
904 } 900 }
905 /* NV11 and NV20 don't have this, they stop at 0x52. */ 901 /* NV11 and NV20 don't have this, they stop at 0x52. */
906 if (nv_gf4_disp_arch(dev)) { 902 if (nv_gf4_disp_arch(dev)) {
903 rd_cio_state(dev, head, regp, NV_CIO_CRE_42);
907 rd_cio_state(dev, head, regp, NV_CIO_CRE_53); 904 rd_cio_state(dev, head, regp, NV_CIO_CRE_53);
908 rd_cio_state(dev, head, regp, NV_CIO_CRE_54); 905 rd_cio_state(dev, head, regp, NV_CIO_CRE_54);
909 906
@@ -957,7 +954,7 @@ nv_load_state_ext(struct drm_device *dev, int head,
957 NVWriteCRTC(dev, head, NV_PCRTC_850, regp->crtc_850); 954 NVWriteCRTC(dev, head, NV_PCRTC_850, regp->crtc_850);
958 955
959 reg900 = NVReadRAMDAC(dev, head, NV_PRAMDAC_900); 956 reg900 = NVReadRAMDAC(dev, head, NV_PRAMDAC_900);
960 if (regp->crtc_cfg == NV_PCRTC_CONFIG_START_ADDRESS_HSYNC) 957 if (regp->crtc_cfg == NV10_PCRTC_CONFIG_START_ADDRESS_HSYNC)
961 NVWriteRAMDAC(dev, head, NV_PRAMDAC_900, reg900 | 0x10000); 958 NVWriteRAMDAC(dev, head, NV_PRAMDAC_900, reg900 | 0x10000);
962 else 959 else
963 NVWriteRAMDAC(dev, head, NV_PRAMDAC_900, reg900 & ~0x10000); 960 NVWriteRAMDAC(dev, head, NV_PRAMDAC_900, reg900 & ~0x10000);
@@ -976,10 +973,11 @@ nv_load_state_ext(struct drm_device *dev, int head,
976 wr_cio_state(dev, head, regp, NV_CIO_CRE_FF_INDEX); 973 wr_cio_state(dev, head, regp, NV_CIO_CRE_FF_INDEX);
977 wr_cio_state(dev, head, regp, NV_CIO_CRE_FFLWM__INDEX); 974 wr_cio_state(dev, head, regp, NV_CIO_CRE_FFLWM__INDEX);
978 975
979 if (dev_priv->card_type >= NV_30) { 976 if (dev_priv->card_type >= NV_20)
980 wr_cio_state(dev, head, regp, NV_CIO_CRE_47); 977 wr_cio_state(dev, head, regp, NV_CIO_CRE_47);
978
979 if (dev_priv->card_type >= NV_30)
981 wr_cio_state(dev, head, regp, 0x9f); 980 wr_cio_state(dev, head, regp, 0x9f);
982 }
983 981
984 wr_cio_state(dev, head, regp, NV_CIO_CRE_49); 982 wr_cio_state(dev, head, regp, NV_CIO_CRE_49);
985 wr_cio_state(dev, head, regp, NV_CIO_CRE_HCUR_ADDR0_INDEX); 983 wr_cio_state(dev, head, regp, NV_CIO_CRE_HCUR_ADDR0_INDEX);
@@ -1002,10 +1000,11 @@ nv_load_state_ext(struct drm_device *dev, int head,
1002 if (dev_priv->card_type == NV_10) { 1000 if (dev_priv->card_type == NV_10) {
1003 /* Not waiting for vertical retrace before modifying 1001 /* Not waiting for vertical retrace before modifying
1004 CRE_53/CRE_54 causes lockups. */ 1002 CRE_53/CRE_54 causes lockups. */
1005 nouveau_wait_until(dev, 650000000, NV_PRMCIO_INP0__COLOR, 0x8, 0x8); 1003 nouveau_wait_eq(dev, 650000000, NV_PRMCIO_INP0__COLOR, 0x8, 0x8);
1006 nouveau_wait_until(dev, 650000000, NV_PRMCIO_INP0__COLOR, 0x8, 0x0); 1004 nouveau_wait_eq(dev, 650000000, NV_PRMCIO_INP0__COLOR, 0x8, 0x0);
1007 } 1005 }
1008 1006
1007 wr_cio_state(dev, head, regp, NV_CIO_CRE_42);
1009 wr_cio_state(dev, head, regp, NV_CIO_CRE_53); 1008 wr_cio_state(dev, head, regp, NV_CIO_CRE_53);
1010 wr_cio_state(dev, head, regp, NV_CIO_CRE_54); 1009 wr_cio_state(dev, head, regp, NV_CIO_CRE_54);
1011 1010
@@ -1020,8 +1019,9 @@ nv_load_state_ext(struct drm_device *dev, int head,
1020 1019
1021 NVWriteCRTC(dev, head, NV_PCRTC_START, regp->fb_start); 1020 NVWriteCRTC(dev, head, NV_PCRTC_START, regp->fb_start);
1022 1021
1023 /* Setting 1 on this value gives you interrupts for every vblank period. */ 1022 /* Enable vblank interrupts. */
1024 NVWriteCRTC(dev, head, NV_PCRTC_INTR_EN_0, 0); 1023 NVWriteCRTC(dev, head, NV_PCRTC_INTR_EN_0,
1024 (dev->vblank_enabled[head] ? 1 : 0));
1025 NVWriteCRTC(dev, head, NV_PCRTC_INTR_0, NV_PCRTC_INTR_0_VBLANK); 1025 NVWriteCRTC(dev, head, NV_PCRTC_INTR_0, NV_PCRTC_INTR_0_VBLANK);
1026} 1026}
1027 1027
diff --git a/drivers/gpu/drm/nouveau/nouveau_hw.h b/drivers/gpu/drm/nouveau/nouveau_hw.h
index 869130f83602..2989090b9434 100644
--- a/drivers/gpu/drm/nouveau/nouveau_hw.h
+++ b/drivers/gpu/drm/nouveau/nouveau_hw.h
@@ -416,6 +416,25 @@ nv_fix_nv40_hw_cursor(struct drm_device *dev, int head)
416} 416}
417 417
418static inline void 418static inline void
419nv_set_crtc_base(struct drm_device *dev, int head, uint32_t offset)
420{
421 struct drm_nouveau_private *dev_priv = dev->dev_private;
422
423 NVWriteCRTC(dev, head, NV_PCRTC_START, offset);
424
425 if (dev_priv->card_type == NV_04) {
426 /*
427 * Hilarious, the 24th bit doesn't want to stick to
428 * PCRTC_START...
429 */
430 int cre_heb = NVReadVgaCrtc(dev, head, NV_CIO_CRE_HEB__INDEX);
431
432 NVWriteVgaCrtc(dev, head, NV_CIO_CRE_HEB__INDEX,
433 (cre_heb & ~0x40) | ((offset >> 18) & 0x40));
434 }
435}
436
437static inline void
419nv_show_cursor(struct drm_device *dev, int head, bool show) 438nv_show_cursor(struct drm_device *dev, int head, bool show)
420{ 439{
421 struct drm_nouveau_private *dev_priv = dev->dev_private; 440 struct drm_nouveau_private *dev_priv = dev->dev_private;
diff --git a/drivers/gpu/drm/nouveau/nouveau_i2c.c b/drivers/gpu/drm/nouveau/nouveau_i2c.c
index 84614858728b..cb389d014326 100644
--- a/drivers/gpu/drm/nouveau/nouveau_i2c.c
+++ b/drivers/gpu/drm/nouveau/nouveau_i2c.c
@@ -256,7 +256,7 @@ nouveau_i2c_find(struct drm_device *dev, int index)
256 if (index >= DCB_MAX_NUM_I2C_ENTRIES) 256 if (index >= DCB_MAX_NUM_I2C_ENTRIES)
257 return NULL; 257 return NULL;
258 258
259 if (dev_priv->chipset >= NV_50 && (i2c->entry & 0x00000100)) { 259 if (dev_priv->card_type >= NV_50 && (i2c->entry & 0x00000100)) {
260 uint32_t reg = 0xe500, val; 260 uint32_t reg = 0xe500, val;
261 261
262 if (i2c->port_type == 6) { 262 if (i2c->port_type == 6) {
@@ -299,7 +299,10 @@ nouveau_probe_i2c_addr(struct nouveau_i2c_chan *i2c, int addr)
299 299
300int 300int
301nouveau_i2c_identify(struct drm_device *dev, const char *what, 301nouveau_i2c_identify(struct drm_device *dev, const char *what,
302 struct i2c_board_info *info, int index) 302 struct i2c_board_info *info,
303 bool (*match)(struct nouveau_i2c_chan *,
304 struct i2c_board_info *),
305 int index)
303{ 306{
304 struct nouveau_i2c_chan *i2c = nouveau_i2c_find(dev, index); 307 struct nouveau_i2c_chan *i2c = nouveau_i2c_find(dev, index);
305 int i; 308 int i;
@@ -307,7 +310,8 @@ nouveau_i2c_identify(struct drm_device *dev, const char *what,
307 NV_DEBUG(dev, "Probing %ss on I2C bus: %d\n", what, index); 310 NV_DEBUG(dev, "Probing %ss on I2C bus: %d\n", what, index);
308 311
309 for (i = 0; info[i].addr; i++) { 312 for (i = 0; info[i].addr; i++) {
310 if (nouveau_probe_i2c_addr(i2c, info[i].addr)) { 313 if (nouveau_probe_i2c_addr(i2c, info[i].addr) &&
314 (!match || match(i2c, &info[i]))) {
311 NV_INFO(dev, "Detected %s: %s\n", what, info[i].type); 315 NV_INFO(dev, "Detected %s: %s\n", what, info[i].type);
312 return i; 316 return i;
313 } 317 }
diff --git a/drivers/gpu/drm/nouveau/nouveau_i2c.h b/drivers/gpu/drm/nouveau/nouveau_i2c.h
index f71cb32f7571..422b62fd8272 100644
--- a/drivers/gpu/drm/nouveau/nouveau_i2c.h
+++ b/drivers/gpu/drm/nouveau/nouveau_i2c.h
@@ -24,7 +24,6 @@
24#define __NOUVEAU_I2C_H__ 24#define __NOUVEAU_I2C_H__
25 25
26#include <linux/i2c.h> 26#include <linux/i2c.h>
27#include <linux/i2c-id.h>
28#include <linux/i2c-algo-bit.h> 27#include <linux/i2c-algo-bit.h>
29#include "drm_dp_helper.h" 28#include "drm_dp_helper.h"
30 29
@@ -44,7 +43,10 @@ void nouveau_i2c_fini(struct drm_device *, struct dcb_i2c_entry *);
44struct nouveau_i2c_chan *nouveau_i2c_find(struct drm_device *, int index); 43struct nouveau_i2c_chan *nouveau_i2c_find(struct drm_device *, int index);
45bool nouveau_probe_i2c_addr(struct nouveau_i2c_chan *i2c, int addr); 44bool nouveau_probe_i2c_addr(struct nouveau_i2c_chan *i2c, int addr);
46int nouveau_i2c_identify(struct drm_device *dev, const char *what, 45int nouveau_i2c_identify(struct drm_device *dev, const char *what,
47 struct i2c_board_info *info, int index); 46 struct i2c_board_info *info,
47 bool (*match)(struct nouveau_i2c_chan *,
48 struct i2c_board_info *),
49 int index);
48 50
49extern const struct i2c_algorithm nouveau_dp_i2c_algo; 51extern const struct i2c_algorithm nouveau_dp_i2c_algo;
50 52
diff --git a/drivers/gpu/drm/nouveau/nouveau_irq.c b/drivers/gpu/drm/nouveau/nouveau_irq.c
index 794b0ee30cf6..2ba7265bc967 100644
--- a/drivers/gpu/drm/nouveau/nouveau_irq.c
+++ b/drivers/gpu/drm/nouveau/nouveau_irq.c
@@ -35,11 +35,8 @@
35#include "nouveau_drm.h" 35#include "nouveau_drm.h"
36#include "nouveau_drv.h" 36#include "nouveau_drv.h"
37#include "nouveau_reg.h" 37#include "nouveau_reg.h"
38#include <linux/ratelimit.h> 38#include "nouveau_ramht.h"
39 39#include "nouveau_util.h"
40/* needed for hotplug irq */
41#include "nouveau_connector.h"
42#include "nv50_display.h"
43 40
44void 41void
45nouveau_irq_preinstall(struct drm_device *dev) 42nouveau_irq_preinstall(struct drm_device *dev)
@@ -49,18 +46,19 @@ nouveau_irq_preinstall(struct drm_device *dev)
49 /* Master disable */ 46 /* Master disable */
50 nv_wr32(dev, NV03_PMC_INTR_EN_0, 0); 47 nv_wr32(dev, NV03_PMC_INTR_EN_0, 0);
51 48
52 if (dev_priv->card_type >= NV_50) { 49 INIT_LIST_HEAD(&dev_priv->vbl_waiting);
53 INIT_WORK(&dev_priv->irq_work, nv50_display_irq_handler_bh);
54 INIT_WORK(&dev_priv->hpd_work, nv50_display_irq_hotplug_bh);
55 INIT_LIST_HEAD(&dev_priv->vbl_waiting);
56 }
57} 50}
58 51
59int 52int
60nouveau_irq_postinstall(struct drm_device *dev) 53nouveau_irq_postinstall(struct drm_device *dev)
61{ 54{
55 struct drm_nouveau_private *dev_priv = dev->dev_private;
56
62 /* Master enable */ 57 /* Master enable */
63 nv_wr32(dev, NV03_PMC_INTR_EN_0, NV_PMC_INTR_EN_0_MASTER_ENABLE); 58 nv_wr32(dev, NV03_PMC_INTR_EN_0, NV_PMC_INTR_EN_0_MASTER_ENABLE);
59 if (dev_priv->msi_enabled)
60 nv_wr08(dev, 0x00088068, 0xff);
61
64 return 0; 62 return 0;
65} 63}
66 64
@@ -71,1178 +69,83 @@ nouveau_irq_uninstall(struct drm_device *dev)
71 nv_wr32(dev, NV03_PMC_INTR_EN_0, 0); 69 nv_wr32(dev, NV03_PMC_INTR_EN_0, 0);
72} 70}
73 71
74static int 72irqreturn_t
75nouveau_call_method(struct nouveau_channel *chan, int class, int mthd, int data) 73nouveau_irq_handler(DRM_IRQ_ARGS)
76{
77 struct drm_nouveau_private *dev_priv = chan->dev->dev_private;
78 struct nouveau_pgraph_object_method *grm;
79 struct nouveau_pgraph_object_class *grc;
80
81 grc = dev_priv->engine.graph.grclass;
82 while (grc->id) {
83 if (grc->id == class)
84 break;
85 grc++;
86 }
87
88 if (grc->id != class || !grc->methods)
89 return -ENOENT;
90
91 grm = grc->methods;
92 while (grm->id) {
93 if (grm->id == mthd)
94 return grm->exec(chan, class, mthd, data);
95 grm++;
96 }
97
98 return -ENOENT;
99}
100
101static bool
102nouveau_fifo_swmthd(struct nouveau_channel *chan, uint32_t addr, uint32_t data)
103{
104 struct drm_device *dev = chan->dev;
105 const int subc = (addr >> 13) & 0x7;
106 const int mthd = addr & 0x1ffc;
107
108 if (mthd == 0x0000) {
109 struct nouveau_gpuobj_ref *ref = NULL;
110
111 if (nouveau_gpuobj_ref_find(chan, data, &ref))
112 return false;
113
114 if (ref->gpuobj->engine != NVOBJ_ENGINE_SW)
115 return false;
116
117 chan->sw_subchannel[subc] = ref->gpuobj->class;
118 nv_wr32(dev, NV04_PFIFO_CACHE1_ENGINE, nv_rd32(dev,
119 NV04_PFIFO_CACHE1_ENGINE) & ~(0xf << subc * 4));
120 return true;
121 }
122
123 /* hw object */
124 if (nv_rd32(dev, NV04_PFIFO_CACHE1_ENGINE) & (1 << (subc*4)))
125 return false;
126
127 if (nouveau_call_method(chan, chan->sw_subchannel[subc], mthd, data))
128 return false;
129
130 return true;
131}
132
133static void
134nouveau_fifo_irq_handler(struct drm_device *dev)
135{
136 struct drm_nouveau_private *dev_priv = dev->dev_private;
137 struct nouveau_engine *engine = &dev_priv->engine;
138 uint32_t status, reassign;
139 int cnt = 0;
140
141 reassign = nv_rd32(dev, NV03_PFIFO_CACHES) & 1;
142 while ((status = nv_rd32(dev, NV03_PFIFO_INTR_0)) && (cnt++ < 100)) {
143 struct nouveau_channel *chan = NULL;
144 uint32_t chid, get;
145
146 nv_wr32(dev, NV03_PFIFO_CACHES, 0);
147
148 chid = engine->fifo.channel_id(dev);
149 if (chid >= 0 && chid < engine->fifo.channels)
150 chan = dev_priv->fifos[chid];
151 get = nv_rd32(dev, NV03_PFIFO_CACHE1_GET);
152
153 if (status & NV_PFIFO_INTR_CACHE_ERROR) {
154 uint32_t mthd, data;
155 int ptr;
156
157 /* NV_PFIFO_CACHE1_GET actually goes to 0xffc before
158 * wrapping on my G80 chips, but CACHE1 isn't big
159 * enough for this much data.. Tests show that it
160 * wraps around to the start at GET=0x800.. No clue
161 * as to why..
162 */
163 ptr = (get & 0x7ff) >> 2;
164
165 if (dev_priv->card_type < NV_40) {
166 mthd = nv_rd32(dev,
167 NV04_PFIFO_CACHE1_METHOD(ptr));
168 data = nv_rd32(dev,
169 NV04_PFIFO_CACHE1_DATA(ptr));
170 } else {
171 mthd = nv_rd32(dev,
172 NV40_PFIFO_CACHE1_METHOD(ptr));
173 data = nv_rd32(dev,
174 NV40_PFIFO_CACHE1_DATA(ptr));
175 }
176
177 if (!chan || !nouveau_fifo_swmthd(chan, mthd, data)) {
178 NV_INFO(dev, "PFIFO_CACHE_ERROR - Ch %d/%d "
179 "Mthd 0x%04x Data 0x%08x\n",
180 chid, (mthd >> 13) & 7, mthd & 0x1ffc,
181 data);
182 }
183
184 nv_wr32(dev, NV04_PFIFO_CACHE1_DMA_PUSH, 0);
185 nv_wr32(dev, NV03_PFIFO_INTR_0,
186 NV_PFIFO_INTR_CACHE_ERROR);
187
188 nv_wr32(dev, NV03_PFIFO_CACHE1_PUSH0,
189 nv_rd32(dev, NV03_PFIFO_CACHE1_PUSH0) & ~1);
190 nv_wr32(dev, NV03_PFIFO_CACHE1_GET, get + 4);
191 nv_wr32(dev, NV03_PFIFO_CACHE1_PUSH0,
192 nv_rd32(dev, NV03_PFIFO_CACHE1_PUSH0) | 1);
193 nv_wr32(dev, NV04_PFIFO_CACHE1_HASH, 0);
194
195 nv_wr32(dev, NV04_PFIFO_CACHE1_DMA_PUSH,
196 nv_rd32(dev, NV04_PFIFO_CACHE1_DMA_PUSH) | 1);
197 nv_wr32(dev, NV04_PFIFO_CACHE1_PULL0, 1);
198
199 status &= ~NV_PFIFO_INTR_CACHE_ERROR;
200 }
201
202 if (status & NV_PFIFO_INTR_DMA_PUSHER) {
203 NV_INFO(dev, "PFIFO_DMA_PUSHER - Ch %d\n", chid);
204
205 status &= ~NV_PFIFO_INTR_DMA_PUSHER;
206 nv_wr32(dev, NV03_PFIFO_INTR_0,
207 NV_PFIFO_INTR_DMA_PUSHER);
208
209 nv_wr32(dev, NV04_PFIFO_CACHE1_DMA_STATE, 0x00000000);
210 if (nv_rd32(dev, NV04_PFIFO_CACHE1_DMA_PUT) != get)
211 nv_wr32(dev, NV04_PFIFO_CACHE1_DMA_GET,
212 get + 4);
213 }
214
215 if (status & NV_PFIFO_INTR_SEMAPHORE) {
216 uint32_t sem;
217
218 status &= ~NV_PFIFO_INTR_SEMAPHORE;
219 nv_wr32(dev, NV03_PFIFO_INTR_0,
220 NV_PFIFO_INTR_SEMAPHORE);
221
222 sem = nv_rd32(dev, NV10_PFIFO_CACHE1_SEMAPHORE);
223 nv_wr32(dev, NV10_PFIFO_CACHE1_SEMAPHORE, sem | 0x1);
224
225 nv_wr32(dev, NV03_PFIFO_CACHE1_GET, get + 4);
226 nv_wr32(dev, NV04_PFIFO_CACHE1_PULL0, 1);
227 }
228
229 if (status) {
230 NV_INFO(dev, "PFIFO_INTR 0x%08x - Ch %d\n",
231 status, chid);
232 nv_wr32(dev, NV03_PFIFO_INTR_0, status);
233 status = 0;
234 }
235
236 nv_wr32(dev, NV03_PFIFO_CACHES, reassign);
237 }
238
239 if (status) {
240 NV_INFO(dev, "PFIFO still angry after %d spins, halt\n", cnt);
241 nv_wr32(dev, 0x2140, 0);
242 nv_wr32(dev, 0x140, 0);
243 }
244
245 nv_wr32(dev, NV03_PMC_INTR_0, NV_PMC_INTR_0_PFIFO_PENDING);
246}
247
248struct nouveau_bitfield_names {
249 uint32_t mask;
250 const char *name;
251};
252
253static struct nouveau_bitfield_names nstatus_names[] =
254{
255 { NV04_PGRAPH_NSTATUS_STATE_IN_USE, "STATE_IN_USE" },
256 { NV04_PGRAPH_NSTATUS_INVALID_STATE, "INVALID_STATE" },
257 { NV04_PGRAPH_NSTATUS_BAD_ARGUMENT, "BAD_ARGUMENT" },
258 { NV04_PGRAPH_NSTATUS_PROTECTION_FAULT, "PROTECTION_FAULT" }
259};
260
261static struct nouveau_bitfield_names nstatus_names_nv10[] =
262{
263 { NV10_PGRAPH_NSTATUS_STATE_IN_USE, "STATE_IN_USE" },
264 { NV10_PGRAPH_NSTATUS_INVALID_STATE, "INVALID_STATE" },
265 { NV10_PGRAPH_NSTATUS_BAD_ARGUMENT, "BAD_ARGUMENT" },
266 { NV10_PGRAPH_NSTATUS_PROTECTION_FAULT, "PROTECTION_FAULT" }
267};
268
269static struct nouveau_bitfield_names nsource_names[] =
270{
271 { NV03_PGRAPH_NSOURCE_NOTIFICATION, "NOTIFICATION" },
272 { NV03_PGRAPH_NSOURCE_DATA_ERROR, "DATA_ERROR" },
273 { NV03_PGRAPH_NSOURCE_PROTECTION_ERROR, "PROTECTION_ERROR" },
274 { NV03_PGRAPH_NSOURCE_RANGE_EXCEPTION, "RANGE_EXCEPTION" },
275 { NV03_PGRAPH_NSOURCE_LIMIT_COLOR, "LIMIT_COLOR" },
276 { NV03_PGRAPH_NSOURCE_LIMIT_ZETA, "LIMIT_ZETA" },
277 { NV03_PGRAPH_NSOURCE_ILLEGAL_MTHD, "ILLEGAL_MTHD" },
278 { NV03_PGRAPH_NSOURCE_DMA_R_PROTECTION, "DMA_R_PROTECTION" },
279 { NV03_PGRAPH_NSOURCE_DMA_W_PROTECTION, "DMA_W_PROTECTION" },
280 { NV03_PGRAPH_NSOURCE_FORMAT_EXCEPTION, "FORMAT_EXCEPTION" },
281 { NV03_PGRAPH_NSOURCE_PATCH_EXCEPTION, "PATCH_EXCEPTION" },
282 { NV03_PGRAPH_NSOURCE_STATE_INVALID, "STATE_INVALID" },
283 { NV03_PGRAPH_NSOURCE_DOUBLE_NOTIFY, "DOUBLE_NOTIFY" },
284 { NV03_PGRAPH_NSOURCE_NOTIFY_IN_USE, "NOTIFY_IN_USE" },
285 { NV03_PGRAPH_NSOURCE_METHOD_CNT, "METHOD_CNT" },
286 { NV03_PGRAPH_NSOURCE_BFR_NOTIFICATION, "BFR_NOTIFICATION" },
287 { NV03_PGRAPH_NSOURCE_DMA_VTX_PROTECTION, "DMA_VTX_PROTECTION" },
288 { NV03_PGRAPH_NSOURCE_DMA_WIDTH_A, "DMA_WIDTH_A" },
289 { NV03_PGRAPH_NSOURCE_DMA_WIDTH_B, "DMA_WIDTH_B" },
290};
291
292static void
293nouveau_print_bitfield_names_(uint32_t value,
294 const struct nouveau_bitfield_names *namelist,
295 const int namelist_len)
296{
297 /*
298 * Caller must have already printed the KERN_* log level for us.
299 * Also the caller is responsible for adding the newline.
300 */
301 int i;
302 for (i = 0; i < namelist_len; ++i) {
303 uint32_t mask = namelist[i].mask;
304 if (value & mask) {
305 printk(" %s", namelist[i].name);
306 value &= ~mask;
307 }
308 }
309 if (value)
310 printk(" (unknown bits 0x%08x)", value);
311}
312#define nouveau_print_bitfield_names(val, namelist) \
313 nouveau_print_bitfield_names_((val), (namelist), ARRAY_SIZE(namelist))
314
315struct nouveau_enum_names {
316 uint32_t value;
317 const char *name;
318};
319
320static void
321nouveau_print_enum_names_(uint32_t value,
322 const struct nouveau_enum_names *namelist,
323 const int namelist_len)
324{
325 /*
326 * Caller must have already printed the KERN_* log level for us.
327 * Also the caller is responsible for adding the newline.
328 */
329 int i;
330 for (i = 0; i < namelist_len; ++i) {
331 if (value == namelist[i].value) {
332 printk("%s", namelist[i].name);
333 return;
334 }
335 }
336 printk("unknown value 0x%08x", value);
337}
338#define nouveau_print_enum_names(val, namelist) \
339 nouveau_print_enum_names_((val), (namelist), ARRAY_SIZE(namelist))
340
341static int
342nouveau_graph_chid_from_grctx(struct drm_device *dev)
343{ 74{
75 struct drm_device *dev = (struct drm_device *)arg;
344 struct drm_nouveau_private *dev_priv = dev->dev_private; 76 struct drm_nouveau_private *dev_priv = dev->dev_private;
345 uint32_t inst; 77 unsigned long flags;
78 u32 stat;
346 int i; 79 int i;
347 80
348 if (dev_priv->card_type < NV_40) 81 stat = nv_rd32(dev, NV03_PMC_INTR_0);
349 return dev_priv->engine.fifo.channels; 82 if (!stat)
350 else 83 return IRQ_NONE;
351 if (dev_priv->card_type < NV_50) {
352 inst = (nv_rd32(dev, 0x40032c) & 0xfffff) << 4;
353
354 for (i = 0; i < dev_priv->engine.fifo.channels; i++) {
355 struct nouveau_channel *chan = dev_priv->fifos[i];
356
357 if (!chan || !chan->ramin_grctx)
358 continue;
359
360 if (inst == chan->ramin_grctx->instance)
361 break;
362 }
363 } else {
364 inst = (nv_rd32(dev, 0x40032c) & 0xfffff) << 12;
365
366 for (i = 0; i < dev_priv->engine.fifo.channels; i++) {
367 struct nouveau_channel *chan = dev_priv->fifos[i];
368
369 if (!chan || !chan->ramin)
370 continue;
371
372 if (inst == chan->ramin->instance)
373 break;
374 }
375 }
376
377
378 return i;
379}
380
381static int
382nouveau_graph_trapped_channel(struct drm_device *dev, int *channel_ret)
383{
384 struct drm_nouveau_private *dev_priv = dev->dev_private;
385 struct nouveau_engine *engine = &dev_priv->engine;
386 int channel;
387
388 if (dev_priv->card_type < NV_10)
389 channel = (nv_rd32(dev, NV04_PGRAPH_TRAPPED_ADDR) >> 24) & 0xf;
390 else
391 if (dev_priv->card_type < NV_40)
392 channel = (nv_rd32(dev, NV04_PGRAPH_TRAPPED_ADDR) >> 20) & 0x1f;
393 else
394 channel = nouveau_graph_chid_from_grctx(dev);
395
396 if (channel >= engine->fifo.channels || !dev_priv->fifos[channel]) {
397 NV_ERROR(dev, "AIII, invalid/inactive channel id %d\n", channel);
398 return -EINVAL;
399 }
400
401 *channel_ret = channel;
402 return 0;
403}
404
405struct nouveau_pgraph_trap {
406 int channel;
407 int class;
408 int subc, mthd, size;
409 uint32_t data, data2;
410 uint32_t nsource, nstatus;
411};
412
413static void
414nouveau_graph_trap_info(struct drm_device *dev,
415 struct nouveau_pgraph_trap *trap)
416{
417 struct drm_nouveau_private *dev_priv = dev->dev_private;
418 uint32_t address;
419
420 trap->nsource = trap->nstatus = 0;
421 if (dev_priv->card_type < NV_50) {
422 trap->nsource = nv_rd32(dev, NV03_PGRAPH_NSOURCE);
423 trap->nstatus = nv_rd32(dev, NV03_PGRAPH_NSTATUS);
424 }
425
426 if (nouveau_graph_trapped_channel(dev, &trap->channel))
427 trap->channel = -1;
428 address = nv_rd32(dev, NV04_PGRAPH_TRAPPED_ADDR);
429
430 trap->mthd = address & 0x1FFC;
431 trap->data = nv_rd32(dev, NV04_PGRAPH_TRAPPED_DATA);
432 if (dev_priv->card_type < NV_10) {
433 trap->subc = (address >> 13) & 0x7;
434 } else {
435 trap->subc = (address >> 16) & 0x7;
436 trap->data2 = nv_rd32(dev, NV10_PGRAPH_TRAPPED_DATA_HIGH);
437 }
438
439 if (dev_priv->card_type < NV_10)
440 trap->class = nv_rd32(dev, 0x400180 + trap->subc*4) & 0xFF;
441 else if (dev_priv->card_type < NV_40)
442 trap->class = nv_rd32(dev, 0x400160 + trap->subc*4) & 0xFFF;
443 else if (dev_priv->card_type < NV_50)
444 trap->class = nv_rd32(dev, 0x400160 + trap->subc*4) & 0xFFFF;
445 else
446 trap->class = nv_rd32(dev, 0x400814);
447}
448
449static void
450nouveau_graph_dump_trap_info(struct drm_device *dev, const char *id,
451 struct nouveau_pgraph_trap *trap)
452{
453 struct drm_nouveau_private *dev_priv = dev->dev_private;
454 uint32_t nsource = trap->nsource, nstatus = trap->nstatus;
455
456 if (dev_priv->card_type < NV_50) {
457 NV_INFO(dev, "%s - nSource:", id);
458 nouveau_print_bitfield_names(nsource, nsource_names);
459 printk(", nStatus:");
460 if (dev_priv->card_type < NV_10)
461 nouveau_print_bitfield_names(nstatus, nstatus_names);
462 else
463 nouveau_print_bitfield_names(nstatus, nstatus_names_nv10);
464 printk("\n");
465 }
466
467 NV_INFO(dev, "%s - Ch %d/%d Class 0x%04x Mthd 0x%04x "
468 "Data 0x%08x:0x%08x\n",
469 id, trap->channel, trap->subc,
470 trap->class, trap->mthd,
471 trap->data2, trap->data);
472}
473
474static int
475nouveau_pgraph_intr_swmthd(struct drm_device *dev,
476 struct nouveau_pgraph_trap *trap)
477{
478 struct drm_nouveau_private *dev_priv = dev->dev_private;
479
480 if (trap->channel < 0 ||
481 trap->channel >= dev_priv->engine.fifo.channels ||
482 !dev_priv->fifos[trap->channel])
483 return -ENODEV;
484
485 return nouveau_call_method(dev_priv->fifos[trap->channel],
486 trap->class, trap->mthd, trap->data);
487}
488
489static inline void
490nouveau_pgraph_intr_notify(struct drm_device *dev, uint32_t nsource)
491{
492 struct nouveau_pgraph_trap trap;
493 int unhandled = 0;
494 84
495 nouveau_graph_trap_info(dev, &trap); 85 spin_lock_irqsave(&dev_priv->context_switch_lock, flags);
86 for (i = 0; i < 32 && stat; i++) {
87 if (!(stat & (1 << i)) || !dev_priv->irq_handler[i])
88 continue;
496 89
497 if (nsource & NV03_PGRAPH_NSOURCE_ILLEGAL_MTHD) { 90 dev_priv->irq_handler[i](dev);
498 if (nouveau_pgraph_intr_swmthd(dev, &trap)) 91 stat &= ~(1 << i);
499 unhandled = 1;
500 } else {
501 unhandled = 1;
502 } 92 }
503 93
504 if (unhandled) 94 if (dev_priv->msi_enabled)
505 nouveau_graph_dump_trap_info(dev, "PGRAPH_NOTIFY", &trap); 95 nv_wr08(dev, 0x00088068, 0xff);
506} 96 spin_unlock_irqrestore(&dev_priv->context_switch_lock, flags);
507
508static DEFINE_RATELIMIT_STATE(nouveau_ratelimit_state, 3 * HZ, 20);
509
510static int nouveau_ratelimit(void)
511{
512 return __ratelimit(&nouveau_ratelimit_state);
513}
514
515
516static inline void
517nouveau_pgraph_intr_error(struct drm_device *dev, uint32_t nsource)
518{
519 struct nouveau_pgraph_trap trap;
520 int unhandled = 0;
521
522 nouveau_graph_trap_info(dev, &trap);
523 trap.nsource = nsource;
524
525 if (nsource & NV03_PGRAPH_NSOURCE_ILLEGAL_MTHD) {
526 if (nouveau_pgraph_intr_swmthd(dev, &trap))
527 unhandled = 1;
528 } else if (nsource & NV03_PGRAPH_NSOURCE_DMA_VTX_PROTECTION) {
529 uint32_t v = nv_rd32(dev, 0x402000);
530 nv_wr32(dev, 0x402000, v);
531
532 /* dump the error anyway for now: it's useful for
533 Gallium development */
534 unhandled = 1;
535 } else {
536 unhandled = 1;
537 }
538 97
539 if (unhandled && nouveau_ratelimit()) 98 if (stat && nouveau_ratelimit())
540 nouveau_graph_dump_trap_info(dev, "PGRAPH_ERROR", &trap); 99 NV_ERROR(dev, "PMC - unhandled INTR 0x%08x\n", stat);
100 return IRQ_HANDLED;
541} 101}
542 102
543static inline void 103int
544nouveau_pgraph_intr_context_switch(struct drm_device *dev) 104nouveau_irq_init(struct drm_device *dev)
545{ 105{
546 struct drm_nouveau_private *dev_priv = dev->dev_private; 106 struct drm_nouveau_private *dev_priv = dev->dev_private;
547 struct nouveau_engine *engine = &dev_priv->engine; 107 int ret;
548 uint32_t chid;
549
550 chid = engine->fifo.channel_id(dev);
551 NV_DEBUG(dev, "PGRAPH context switch interrupt channel %x\n", chid);
552
553 switch (dev_priv->card_type) {
554 case NV_04:
555 nv04_graph_context_switch(dev);
556 break;
557 case NV_10:
558 nv10_graph_context_switch(dev);
559 break;
560 default:
561 NV_ERROR(dev, "Context switch not implemented\n");
562 break;
563 }
564}
565
566static void
567nouveau_pgraph_irq_handler(struct drm_device *dev)
568{
569 uint32_t status;
570
571 while ((status = nv_rd32(dev, NV03_PGRAPH_INTR))) {
572 uint32_t nsource = nv_rd32(dev, NV03_PGRAPH_NSOURCE);
573
574 if (status & NV_PGRAPH_INTR_NOTIFY) {
575 nouveau_pgraph_intr_notify(dev, nsource);
576 108
577 status &= ~NV_PGRAPH_INTR_NOTIFY; 109 if (nouveau_msi != 0 && dev_priv->card_type >= NV_50) {
578 nv_wr32(dev, NV03_PGRAPH_INTR, NV_PGRAPH_INTR_NOTIFY); 110 ret = pci_enable_msi(dev->pdev);
111 if (ret == 0) {
112 NV_INFO(dev, "enabled MSI\n");
113 dev_priv->msi_enabled = true;
579 } 114 }
580
581 if (status & NV_PGRAPH_INTR_ERROR) {
582 nouveau_pgraph_intr_error(dev, nsource);
583
584 status &= ~NV_PGRAPH_INTR_ERROR;
585 nv_wr32(dev, NV03_PGRAPH_INTR, NV_PGRAPH_INTR_ERROR);
586 }
587
588 if (status & NV_PGRAPH_INTR_CONTEXT_SWITCH) {
589 status &= ~NV_PGRAPH_INTR_CONTEXT_SWITCH;
590 nv_wr32(dev, NV03_PGRAPH_INTR,
591 NV_PGRAPH_INTR_CONTEXT_SWITCH);
592
593 nouveau_pgraph_intr_context_switch(dev);
594 }
595
596 if (status) {
597 NV_INFO(dev, "Unhandled PGRAPH_INTR - 0x%08x\n", status);
598 nv_wr32(dev, NV03_PGRAPH_INTR, status);
599 }
600
601 if ((nv_rd32(dev, NV04_PGRAPH_FIFO) & (1 << 0)) == 0)
602 nv_wr32(dev, NV04_PGRAPH_FIFO, 1);
603 } 115 }
604 116
605 nv_wr32(dev, NV03_PMC_INTR_0, NV_PMC_INTR_0_PGRAPH_PENDING); 117 return drm_irq_install(dev);
606} 118}
607 119
608static void 120void
609nv50_pfb_vm_trap(struct drm_device *dev, int display, const char *name) 121nouveau_irq_fini(struct drm_device *dev)
610{ 122{
611 struct drm_nouveau_private *dev_priv = dev->dev_private; 123 struct drm_nouveau_private *dev_priv = dev->dev_private;
612 uint32_t trap[6];
613 int i, ch;
614 uint32_t idx = nv_rd32(dev, 0x100c90);
615 if (idx & 0x80000000) {
616 idx &= 0xffffff;
617 if (display) {
618 for (i = 0; i < 6; i++) {
619 nv_wr32(dev, 0x100c90, idx | i << 24);
620 trap[i] = nv_rd32(dev, 0x100c94);
621 }
622 for (ch = 0; ch < dev_priv->engine.fifo.channels; ch++) {
623 struct nouveau_channel *chan = dev_priv->fifos[ch];
624
625 if (!chan || !chan->ramin)
626 continue;
627 124
628 if (trap[1] == chan->ramin->instance >> 12) 125 drm_irq_uninstall(dev);
629 break; 126 if (dev_priv->msi_enabled)
630 } 127 pci_disable_msi(dev->pdev);
631 NV_INFO(dev, "%s - VM: Trapped %s at %02x%04x%04x status %08x %08x channel %d\n",
632 name, (trap[5]&0x100?"read":"write"),
633 trap[5]&0xff, trap[4]&0xffff,
634 trap[3]&0xffff, trap[0], trap[2], ch);
635 }
636 nv_wr32(dev, 0x100c90, idx | 0x80000000);
637 } else if (display) {
638 NV_INFO(dev, "%s - no VM fault?\n", name);
639 }
640}
641
642static struct nouveau_enum_names nv50_mp_exec_error_names[] =
643{
644 { 3, "STACK_UNDERFLOW" },
645 { 4, "QUADON_ACTIVE" },
646 { 8, "TIMEOUT" },
647 { 0x10, "INVALID_OPCODE" },
648 { 0x40, "BREAKPOINT" },
649};
650
651static void
652nv50_pgraph_mp_trap(struct drm_device *dev, int tpid, int display)
653{
654 struct drm_nouveau_private *dev_priv = dev->dev_private;
655 uint32_t units = nv_rd32(dev, 0x1540);
656 uint32_t addr, mp10, status, pc, oplow, ophigh;
657 int i;
658 int mps = 0;
659 for (i = 0; i < 4; i++) {
660 if (!(units & 1 << (i+24)))
661 continue;
662 if (dev_priv->chipset < 0xa0)
663 addr = 0x408200 + (tpid << 12) + (i << 7);
664 else
665 addr = 0x408100 + (tpid << 11) + (i << 7);
666 mp10 = nv_rd32(dev, addr + 0x10);
667 status = nv_rd32(dev, addr + 0x14);
668 if (!status)
669 continue;
670 if (display) {
671 nv_rd32(dev, addr + 0x20);
672 pc = nv_rd32(dev, addr + 0x24);
673 oplow = nv_rd32(dev, addr + 0x70);
674 ophigh= nv_rd32(dev, addr + 0x74);
675 NV_INFO(dev, "PGRAPH_TRAP_MP_EXEC - "
676 "TP %d MP %d: ", tpid, i);
677 nouveau_print_enum_names(status,
678 nv50_mp_exec_error_names);
679 printk(" at %06x warp %d, opcode %08x %08x\n",
680 pc&0xffffff, pc >> 24,
681 oplow, ophigh);
682 }
683 nv_wr32(dev, addr + 0x10, mp10);
684 nv_wr32(dev, addr + 0x14, 0);
685 mps++;
686 }
687 if (!mps && display)
688 NV_INFO(dev, "PGRAPH_TRAP_MP_EXEC - TP %d: "
689 "No MPs claiming errors?\n", tpid);
690} 128}
691 129
692static void 130void
693nv50_pgraph_tp_trap(struct drm_device *dev, int type, uint32_t ustatus_old, 131nouveau_irq_register(struct drm_device *dev, int status_bit,
694 uint32_t ustatus_new, int display, const char *name) 132 void (*handler)(struct drm_device *))
695{ 133{
696 struct drm_nouveau_private *dev_priv = dev->dev_private; 134 struct drm_nouveau_private *dev_priv = dev->dev_private;
697 int tps = 0; 135 unsigned long flags;
698 uint32_t units = nv_rd32(dev, 0x1540);
699 int i, r;
700 uint32_t ustatus_addr, ustatus;
701 for (i = 0; i < 16; i++) {
702 if (!(units & (1 << i)))
703 continue;
704 if (dev_priv->chipset < 0xa0)
705 ustatus_addr = ustatus_old + (i << 12);
706 else
707 ustatus_addr = ustatus_new + (i << 11);
708 ustatus = nv_rd32(dev, ustatus_addr) & 0x7fffffff;
709 if (!ustatus)
710 continue;
711 tps++;
712 switch (type) {
713 case 6: /* texture error... unknown for now */
714 nv50_pfb_vm_trap(dev, display, name);
715 if (display) {
716 NV_ERROR(dev, "magic set %d:\n", i);
717 for (r = ustatus_addr + 4; r <= ustatus_addr + 0x10; r += 4)
718 NV_ERROR(dev, "\t0x%08x: 0x%08x\n", r,
719 nv_rd32(dev, r));
720 }
721 break;
722 case 7: /* MP error */
723 if (ustatus & 0x00010000) {
724 nv50_pgraph_mp_trap(dev, i, display);
725 ustatus &= ~0x00010000;
726 }
727 break;
728 case 8: /* TPDMA error */
729 {
730 uint32_t e0c = nv_rd32(dev, ustatus_addr + 4);
731 uint32_t e10 = nv_rd32(dev, ustatus_addr + 8);
732 uint32_t e14 = nv_rd32(dev, ustatus_addr + 0xc);
733 uint32_t e18 = nv_rd32(dev, ustatus_addr + 0x10);
734 uint32_t e1c = nv_rd32(dev, ustatus_addr + 0x14);
735 uint32_t e20 = nv_rd32(dev, ustatus_addr + 0x18);
736 uint32_t e24 = nv_rd32(dev, ustatus_addr + 0x1c);
737 nv50_pfb_vm_trap(dev, display, name);
738 /* 2d engine destination */
739 if (ustatus & 0x00000010) {
740 if (display) {
741 NV_INFO(dev, "PGRAPH_TRAP_TPDMA_2D - TP %d - Unknown fault at address %02x%08x\n",
742 i, e14, e10);
743 NV_INFO(dev, "PGRAPH_TRAP_TPDMA_2D - TP %d - e0c: %08x, e18: %08x, e1c: %08x, e20: %08x, e24: %08x\n",
744 i, e0c, e18, e1c, e20, e24);
745 }
746 ustatus &= ~0x00000010;
747 }
748 /* Render target */
749 if (ustatus & 0x00000040) {
750 if (display) {
751 NV_INFO(dev, "PGRAPH_TRAP_TPDMA_RT - TP %d - Unknown fault at address %02x%08x\n",
752 i, e14, e10);
753 NV_INFO(dev, "PGRAPH_TRAP_TPDMA_RT - TP %d - e0c: %08x, e18: %08x, e1c: %08x, e20: %08x, e24: %08x\n",
754 i, e0c, e18, e1c, e20, e24);
755 }
756 ustatus &= ~0x00000040;
757 }
758 /* CUDA memory: l[], g[] or stack. */
759 if (ustatus & 0x00000080) {
760 if (display) {
761 if (e18 & 0x80000000) {
762 /* g[] read fault? */
763 NV_INFO(dev, "PGRAPH_TRAP_TPDMA - TP %d - Global read fault at address %02x%08x\n",
764 i, e14, e10 | ((e18 >> 24) & 0x1f));
765 e18 &= ~0x1f000000;
766 } else if (e18 & 0xc) {
767 /* g[] write fault? */
768 NV_INFO(dev, "PGRAPH_TRAP_TPDMA - TP %d - Global write fault at address %02x%08x\n",
769 i, e14, e10 | ((e18 >> 7) & 0x1f));
770 e18 &= ~0x00000f80;
771 } else {
772 NV_INFO(dev, "PGRAPH_TRAP_TPDMA - TP %d - Unknown CUDA fault at address %02x%08x\n",
773 i, e14, e10);
774 }
775 NV_INFO(dev, "PGRAPH_TRAP_TPDMA - TP %d - e0c: %08x, e18: %08x, e1c: %08x, e20: %08x, e24: %08x\n",
776 i, e0c, e18, e1c, e20, e24);
777 }
778 ustatus &= ~0x00000080;
779 }
780 }
781 break;
782 }
783 if (ustatus) {
784 if (display)
785 NV_INFO(dev, "%s - TP%d: Unhandled ustatus 0x%08x\n", name, i, ustatus);
786 }
787 nv_wr32(dev, ustatus_addr, 0xc0000000);
788 }
789
790 if (!tps && display)
791 NV_INFO(dev, "%s - No TPs claiming errors?\n", name);
792}
793
794static void
795nv50_pgraph_trap_handler(struct drm_device *dev)
796{
797 struct nouveau_pgraph_trap trap;
798 uint32_t status = nv_rd32(dev, 0x400108);
799 uint32_t ustatus;
800 int display = nouveau_ratelimit();
801
802
803 if (!status && display) {
804 nouveau_graph_trap_info(dev, &trap);
805 nouveau_graph_dump_trap_info(dev, "PGRAPH_TRAP", &trap);
806 NV_INFO(dev, "PGRAPH_TRAP - no units reporting traps?\n");
807 }
808
809 /* DISPATCH: Relays commands to other units and handles NOTIFY,
810 * COND, QUERY. If you get a trap from it, the command is still stuck
811 * in DISPATCH and you need to do something about it. */
812 if (status & 0x001) {
813 ustatus = nv_rd32(dev, 0x400804) & 0x7fffffff;
814 if (!ustatus && display) {
815 NV_INFO(dev, "PGRAPH_TRAP_DISPATCH - no ustatus?\n");
816 }
817
818 /* Known to be triggered by screwed up NOTIFY and COND... */
819 if (ustatus & 0x00000001) {
820 nv50_pfb_vm_trap(dev, display, "PGRAPH_TRAP_DISPATCH_FAULT");
821 nv_wr32(dev, 0x400500, 0);
822 if (nv_rd32(dev, 0x400808) & 0x80000000) {
823 if (display) {
824 if (nouveau_graph_trapped_channel(dev, &trap.channel))
825 trap.channel = -1;
826 trap.class = nv_rd32(dev, 0x400814);
827 trap.mthd = nv_rd32(dev, 0x400808) & 0x1ffc;
828 trap.subc = (nv_rd32(dev, 0x400808) >> 16) & 0x7;
829 trap.data = nv_rd32(dev, 0x40080c);
830 trap.data2 = nv_rd32(dev, 0x400810);
831 nouveau_graph_dump_trap_info(dev,
832 "PGRAPH_TRAP_DISPATCH_FAULT", &trap);
833 NV_INFO(dev, "PGRAPH_TRAP_DISPATCH_FAULT - 400808: %08x\n", nv_rd32(dev, 0x400808));
834 NV_INFO(dev, "PGRAPH_TRAP_DISPATCH_FAULT - 400848: %08x\n", nv_rd32(dev, 0x400848));
835 }
836 nv_wr32(dev, 0x400808, 0);
837 } else if (display) {
838 NV_INFO(dev, "PGRAPH_TRAP_DISPATCH_FAULT - No stuck command?\n");
839 }
840 nv_wr32(dev, 0x4008e8, nv_rd32(dev, 0x4008e8) & 3);
841 nv_wr32(dev, 0x400848, 0);
842 ustatus &= ~0x00000001;
843 }
844 if (ustatus & 0x00000002) {
845 nv50_pfb_vm_trap(dev, display, "PGRAPH_TRAP_DISPATCH_QUERY");
846 nv_wr32(dev, 0x400500, 0);
847 if (nv_rd32(dev, 0x40084c) & 0x80000000) {
848 if (display) {
849 if (nouveau_graph_trapped_channel(dev, &trap.channel))
850 trap.channel = -1;
851 trap.class = nv_rd32(dev, 0x400814);
852 trap.mthd = nv_rd32(dev, 0x40084c) & 0x1ffc;
853 trap.subc = (nv_rd32(dev, 0x40084c) >> 16) & 0x7;
854 trap.data = nv_rd32(dev, 0x40085c);
855 trap.data2 = 0;
856 nouveau_graph_dump_trap_info(dev,
857 "PGRAPH_TRAP_DISPATCH_QUERY", &trap);
858 NV_INFO(dev, "PGRAPH_TRAP_DISPATCH_QUERY - 40084c: %08x\n", nv_rd32(dev, 0x40084c));
859 }
860 nv_wr32(dev, 0x40084c, 0);
861 } else if (display) {
862 NV_INFO(dev, "PGRAPH_TRAP_DISPATCH_QUERY - No stuck command?\n");
863 }
864 ustatus &= ~0x00000002;
865 }
866 if (ustatus && display)
867 NV_INFO(dev, "PGRAPH_TRAP_DISPATCH - Unhandled ustatus 0x%08x\n", ustatus);
868 nv_wr32(dev, 0x400804, 0xc0000000);
869 nv_wr32(dev, 0x400108, 0x001);
870 status &= ~0x001;
871 }
872
873 /* TRAPs other than dispatch use the "normal" trap regs. */
874 if (status && display) {
875 nouveau_graph_trap_info(dev, &trap);
876 nouveau_graph_dump_trap_info(dev,
877 "PGRAPH_TRAP", &trap);
878 }
879
880 /* M2MF: Memory to memory copy engine. */
881 if (status & 0x002) {
882 ustatus = nv_rd32(dev, 0x406800) & 0x7fffffff;
883 if (!ustatus && display) {
884 NV_INFO(dev, "PGRAPH_TRAP_M2MF - no ustatus?\n");
885 }
886 if (ustatus & 0x00000001) {
887 nv50_pfb_vm_trap(dev, display, "PGRAPH_TRAP_M2MF_NOTIFY");
888 ustatus &= ~0x00000001;
889 }
890 if (ustatus & 0x00000002) {
891 nv50_pfb_vm_trap(dev, display, "PGRAPH_TRAP_M2MF_IN");
892 ustatus &= ~0x00000002;
893 }
894 if (ustatus & 0x00000004) {
895 nv50_pfb_vm_trap(dev, display, "PGRAPH_TRAP_M2MF_OUT");
896 ustatus &= ~0x00000004;
897 }
898 NV_INFO (dev, "PGRAPH_TRAP_M2MF - %08x %08x %08x %08x\n",
899 nv_rd32(dev, 0x406804),
900 nv_rd32(dev, 0x406808),
901 nv_rd32(dev, 0x40680c),
902 nv_rd32(dev, 0x406810));
903 if (ustatus && display)
904 NV_INFO(dev, "PGRAPH_TRAP_M2MF - Unhandled ustatus 0x%08x\n", ustatus);
905 /* No sane way found yet -- just reset the bugger. */
906 nv_wr32(dev, 0x400040, 2);
907 nv_wr32(dev, 0x400040, 0);
908 nv_wr32(dev, 0x406800, 0xc0000000);
909 nv_wr32(dev, 0x400108, 0x002);
910 status &= ~0x002;
911 }
912
913 /* VFETCH: Fetches data from vertex buffers. */
914 if (status & 0x004) {
915 ustatus = nv_rd32(dev, 0x400c04) & 0x7fffffff;
916 if (!ustatus && display) {
917 NV_INFO(dev, "PGRAPH_TRAP_VFETCH - no ustatus?\n");
918 }
919 if (ustatus & 0x00000001) {
920 nv50_pfb_vm_trap(dev, display, "PGRAPH_TRAP_VFETCH_FAULT");
921 NV_INFO (dev, "PGRAPH_TRAP_VFETCH_FAULT - %08x %08x %08x %08x\n",
922 nv_rd32(dev, 0x400c00),
923 nv_rd32(dev, 0x400c08),
924 nv_rd32(dev, 0x400c0c),
925 nv_rd32(dev, 0x400c10));
926 ustatus &= ~0x00000001;
927 }
928 if (ustatus && display)
929 NV_INFO(dev, "PGRAPH_TRAP_VFETCH - Unhandled ustatus 0x%08x\n", ustatus);
930 nv_wr32(dev, 0x400c04, 0xc0000000);
931 nv_wr32(dev, 0x400108, 0x004);
932 status &= ~0x004;
933 }
934
935 /* STRMOUT: DirectX streamout / OpenGL transform feedback. */
936 if (status & 0x008) {
937 ustatus = nv_rd32(dev, 0x401800) & 0x7fffffff;
938 if (!ustatus && display) {
939 NV_INFO(dev, "PGRAPH_TRAP_STRMOUT - no ustatus?\n");
940 }
941 if (ustatus & 0x00000001) {
942 nv50_pfb_vm_trap(dev, display, "PGRAPH_TRAP_STRMOUT_FAULT");
943 NV_INFO (dev, "PGRAPH_TRAP_STRMOUT_FAULT - %08x %08x %08x %08x\n",
944 nv_rd32(dev, 0x401804),
945 nv_rd32(dev, 0x401808),
946 nv_rd32(dev, 0x40180c),
947 nv_rd32(dev, 0x401810));
948 ustatus &= ~0x00000001;
949 }
950 if (ustatus && display)
951 NV_INFO(dev, "PGRAPH_TRAP_STRMOUT - Unhandled ustatus 0x%08x\n", ustatus);
952 /* No sane way found yet -- just reset the bugger. */
953 nv_wr32(dev, 0x400040, 0x80);
954 nv_wr32(dev, 0x400040, 0);
955 nv_wr32(dev, 0x401800, 0xc0000000);
956 nv_wr32(dev, 0x400108, 0x008);
957 status &= ~0x008;
958 }
959
960 /* CCACHE: Handles code and c[] caches and fills them. */
961 if (status & 0x010) {
962 ustatus = nv_rd32(dev, 0x405018) & 0x7fffffff;
963 if (!ustatus && display) {
964 NV_INFO(dev, "PGRAPH_TRAP_CCACHE - no ustatus?\n");
965 }
966 if (ustatus & 0x00000001) {
967 nv50_pfb_vm_trap(dev, display, "PGRAPH_TRAP_CCACHE_FAULT");
968 NV_INFO (dev, "PGRAPH_TRAP_CCACHE_FAULT - %08x %08x %08x %08x %08x %08x %08x\n",
969 nv_rd32(dev, 0x405800),
970 nv_rd32(dev, 0x405804),
971 nv_rd32(dev, 0x405808),
972 nv_rd32(dev, 0x40580c),
973 nv_rd32(dev, 0x405810),
974 nv_rd32(dev, 0x405814),
975 nv_rd32(dev, 0x40581c));
976 ustatus &= ~0x00000001;
977 }
978 if (ustatus && display)
979 NV_INFO(dev, "PGRAPH_TRAP_CCACHE - Unhandled ustatus 0x%08x\n", ustatus);
980 nv_wr32(dev, 0x405018, 0xc0000000);
981 nv_wr32(dev, 0x400108, 0x010);
982 status &= ~0x010;
983 }
984
985 /* Unknown, not seen yet... 0x402000 is the only trap status reg
986 * remaining, so try to handle it anyway. Perhaps related to that
987 * unknown DMA slot on tesla? */
988 if (status & 0x20) {
989 nv50_pfb_vm_trap(dev, display, "PGRAPH_TRAP_UNKC04");
990 ustatus = nv_rd32(dev, 0x402000) & 0x7fffffff;
991 if (display)
992 NV_INFO(dev, "PGRAPH_TRAP_UNKC04 - Unhandled ustatus 0x%08x\n", ustatus);
993 nv_wr32(dev, 0x402000, 0xc0000000);
994 /* no status modifiction on purpose */
995 }
996
997 /* TEXTURE: CUDA texturing units */
998 if (status & 0x040) {
999 nv50_pgraph_tp_trap (dev, 6, 0x408900, 0x408600, display,
1000 "PGRAPH_TRAP_TEXTURE");
1001 nv_wr32(dev, 0x400108, 0x040);
1002 status &= ~0x040;
1003 }
1004
1005 /* MP: CUDA execution engines. */
1006 if (status & 0x080) {
1007 nv50_pgraph_tp_trap (dev, 7, 0x408314, 0x40831c, display,
1008 "PGRAPH_TRAP_MP");
1009 nv_wr32(dev, 0x400108, 0x080);
1010 status &= ~0x080;
1011 }
1012
1013 /* TPDMA: Handles TP-initiated uncached memory accesses:
1014 * l[], g[], stack, 2d surfaces, render targets. */
1015 if (status & 0x100) {
1016 nv50_pgraph_tp_trap (dev, 8, 0x408e08, 0x408708, display,
1017 "PGRAPH_TRAP_TPDMA");
1018 nv_wr32(dev, 0x400108, 0x100);
1019 status &= ~0x100;
1020 }
1021
1022 if (status) {
1023 if (display)
1024 NV_INFO(dev, "PGRAPH_TRAP - Unknown trap 0x%08x\n",
1025 status);
1026 nv_wr32(dev, 0x400108, status);
1027 }
1028}
1029
1030/* There must be a *lot* of these. Will take some time to gather them up. */
1031static struct nouveau_enum_names nv50_data_error_names[] =
1032{
1033 { 4, "INVALID_VALUE" },
1034 { 5, "INVALID_ENUM" },
1035 { 8, "INVALID_OBJECT" },
1036 { 0xc, "INVALID_BITFIELD" },
1037 { 0x28, "MP_NO_REG_SPACE" },
1038 { 0x2b, "MP_BLOCK_SIZE_MISMATCH" },
1039};
1040
1041static void
1042nv50_pgraph_irq_handler(struct drm_device *dev)
1043{
1044 struct nouveau_pgraph_trap trap;
1045 int unhandled = 0;
1046 uint32_t status;
1047
1048 while ((status = nv_rd32(dev, NV03_PGRAPH_INTR))) {
1049 /* NOTIFY: You've set a NOTIFY an a command and it's done. */
1050 if (status & 0x00000001) {
1051 nouveau_graph_trap_info(dev, &trap);
1052 if (nouveau_ratelimit())
1053 nouveau_graph_dump_trap_info(dev,
1054 "PGRAPH_NOTIFY", &trap);
1055 status &= ~0x00000001;
1056 nv_wr32(dev, NV03_PGRAPH_INTR, 0x00000001);
1057 }
1058
1059 /* COMPUTE_QUERY: Purpose and exact cause unknown, happens
1060 * when you write 0x200 to 0x50c0 method 0x31c. */
1061 if (status & 0x00000002) {
1062 nouveau_graph_trap_info(dev, &trap);
1063 if (nouveau_ratelimit())
1064 nouveau_graph_dump_trap_info(dev,
1065 "PGRAPH_COMPUTE_QUERY", &trap);
1066 status &= ~0x00000002;
1067 nv_wr32(dev, NV03_PGRAPH_INTR, 0x00000002);
1068 }
1069
1070 /* Unknown, never seen: 0x4 */
1071
1072 /* ILLEGAL_MTHD: You used a wrong method for this class. */
1073 if (status & 0x00000010) {
1074 nouveau_graph_trap_info(dev, &trap);
1075 if (nouveau_pgraph_intr_swmthd(dev, &trap))
1076 unhandled = 1;
1077 if (unhandled && nouveau_ratelimit())
1078 nouveau_graph_dump_trap_info(dev,
1079 "PGRAPH_ILLEGAL_MTHD", &trap);
1080 status &= ~0x00000010;
1081 nv_wr32(dev, NV03_PGRAPH_INTR, 0x00000010);
1082 }
1083
1084 /* ILLEGAL_CLASS: You used a wrong class. */
1085 if (status & 0x00000020) {
1086 nouveau_graph_trap_info(dev, &trap);
1087 if (nouveau_ratelimit())
1088 nouveau_graph_dump_trap_info(dev,
1089 "PGRAPH_ILLEGAL_CLASS", &trap);
1090 status &= ~0x00000020;
1091 nv_wr32(dev, NV03_PGRAPH_INTR, 0x00000020);
1092 }
1093
1094 /* DOUBLE_NOTIFY: You tried to set a NOTIFY on another NOTIFY. */
1095 if (status & 0x00000040) {
1096 nouveau_graph_trap_info(dev, &trap);
1097 if (nouveau_ratelimit())
1098 nouveau_graph_dump_trap_info(dev,
1099 "PGRAPH_DOUBLE_NOTIFY", &trap);
1100 status &= ~0x00000040;
1101 nv_wr32(dev, NV03_PGRAPH_INTR, 0x00000040);
1102 }
1103
1104 /* CONTEXT_SWITCH: PGRAPH needs us to load a new context */
1105 if (status & 0x00001000) {
1106 nv_wr32(dev, 0x400500, 0x00000000);
1107 nv_wr32(dev, NV03_PGRAPH_INTR,
1108 NV_PGRAPH_INTR_CONTEXT_SWITCH);
1109 nv_wr32(dev, NV40_PGRAPH_INTR_EN, nv_rd32(dev,
1110 NV40_PGRAPH_INTR_EN) &
1111 ~NV_PGRAPH_INTR_CONTEXT_SWITCH);
1112 nv_wr32(dev, 0x400500, 0x00010001);
1113
1114 nv50_graph_context_switch(dev);
1115
1116 status &= ~NV_PGRAPH_INTR_CONTEXT_SWITCH;
1117 }
1118
1119 /* BUFFER_NOTIFY: Your m2mf transfer finished */
1120 if (status & 0x00010000) {
1121 nouveau_graph_trap_info(dev, &trap);
1122 if (nouveau_ratelimit())
1123 nouveau_graph_dump_trap_info(dev,
1124 "PGRAPH_BUFFER_NOTIFY", &trap);
1125 status &= ~0x00010000;
1126 nv_wr32(dev, NV03_PGRAPH_INTR, 0x00010000);
1127 }
1128
1129 /* DATA_ERROR: Invalid value for this method, or invalid
1130 * state in current PGRAPH context for this operation */
1131 if (status & 0x00100000) {
1132 nouveau_graph_trap_info(dev, &trap);
1133 if (nouveau_ratelimit()) {
1134 nouveau_graph_dump_trap_info(dev,
1135 "PGRAPH_DATA_ERROR", &trap);
1136 NV_INFO (dev, "PGRAPH_DATA_ERROR - ");
1137 nouveau_print_enum_names(nv_rd32(dev, 0x400110),
1138 nv50_data_error_names);
1139 printk("\n");
1140 }
1141 status &= ~0x00100000;
1142 nv_wr32(dev, NV03_PGRAPH_INTR, 0x00100000);
1143 }
1144
1145 /* TRAP: Something bad happened in the middle of command
1146 * execution. Has a billion types, subtypes, and even
1147 * subsubtypes. */
1148 if (status & 0x00200000) {
1149 nv50_pgraph_trap_handler(dev);
1150 status &= ~0x00200000;
1151 nv_wr32(dev, NV03_PGRAPH_INTR, 0x00200000);
1152 }
1153
1154 /* Unknown, never seen: 0x00400000 */
1155
1156 /* SINGLE_STEP: Happens on every method if you turned on
1157 * single stepping in 40008c */
1158 if (status & 0x01000000) {
1159 nouveau_graph_trap_info(dev, &trap);
1160 if (nouveau_ratelimit())
1161 nouveau_graph_dump_trap_info(dev,
1162 "PGRAPH_SINGLE_STEP", &trap);
1163 status &= ~0x01000000;
1164 nv_wr32(dev, NV03_PGRAPH_INTR, 0x01000000);
1165 }
1166
1167 /* 0x02000000 happens when you pause a ctxprog...
1168 * but the only way this can happen that I know is by
1169 * poking the relevant MMIO register, and we don't
1170 * do that. */
1171
1172 if (status) {
1173 NV_INFO(dev, "Unhandled PGRAPH_INTR - 0x%08x\n",
1174 status);
1175 nv_wr32(dev, NV03_PGRAPH_INTR, status);
1176 }
1177
1178 {
1179 const int isb = (1 << 16) | (1 << 0);
1180
1181 if ((nv_rd32(dev, 0x400500) & isb) != isb)
1182 nv_wr32(dev, 0x400500,
1183 nv_rd32(dev, 0x400500) | isb);
1184 }
1185 }
1186
1187 nv_wr32(dev, NV03_PMC_INTR_0, NV_PMC_INTR_0_PGRAPH_PENDING);
1188 if (nv_rd32(dev, 0x400824) & (1 << 31))
1189 nv_wr32(dev, 0x400824, nv_rd32(dev, 0x400824) & ~(1 << 31));
1190}
1191
1192static void
1193nouveau_crtc_irq_handler(struct drm_device *dev, int crtc)
1194{
1195 if (crtc & 1)
1196 nv_wr32(dev, NV_CRTC0_INTSTAT, NV_CRTC_INTR_VBLANK);
1197 136
1198 if (crtc & 2) 137 spin_lock_irqsave(&dev_priv->context_switch_lock, flags);
1199 nv_wr32(dev, NV_CRTC1_INTSTAT, NV_CRTC_INTR_VBLANK); 138 dev_priv->irq_handler[status_bit] = handler;
139 spin_unlock_irqrestore(&dev_priv->context_switch_lock, flags);
1200} 140}
1201 141
1202irqreturn_t 142void
1203nouveau_irq_handler(DRM_IRQ_ARGS) 143nouveau_irq_unregister(struct drm_device *dev, int status_bit)
1204{ 144{
1205 struct drm_device *dev = (struct drm_device *)arg;
1206 struct drm_nouveau_private *dev_priv = dev->dev_private; 145 struct drm_nouveau_private *dev_priv = dev->dev_private;
1207 uint32_t status;
1208 unsigned long flags; 146 unsigned long flags;
1209 147
1210 status = nv_rd32(dev, NV03_PMC_INTR_0);
1211 if (!status)
1212 return IRQ_NONE;
1213
1214 spin_lock_irqsave(&dev_priv->context_switch_lock, flags); 148 spin_lock_irqsave(&dev_priv->context_switch_lock, flags);
1215 149 dev_priv->irq_handler[status_bit] = NULL;
1216 if (status & NV_PMC_INTR_0_PFIFO_PENDING) {
1217 nouveau_fifo_irq_handler(dev);
1218 status &= ~NV_PMC_INTR_0_PFIFO_PENDING;
1219 }
1220
1221 if (status & NV_PMC_INTR_0_PGRAPH_PENDING) {
1222 if (dev_priv->card_type >= NV_50)
1223 nv50_pgraph_irq_handler(dev);
1224 else
1225 nouveau_pgraph_irq_handler(dev);
1226
1227 status &= ~NV_PMC_INTR_0_PGRAPH_PENDING;
1228 }
1229
1230 if (status & NV_PMC_INTR_0_CRTCn_PENDING) {
1231 nouveau_crtc_irq_handler(dev, (status>>24)&3);
1232 status &= ~NV_PMC_INTR_0_CRTCn_PENDING;
1233 }
1234
1235 if (status & (NV_PMC_INTR_0_NV50_DISPLAY_PENDING |
1236 NV_PMC_INTR_0_NV50_I2C_PENDING)) {
1237 nv50_display_irq_handler(dev);
1238 status &= ~(NV_PMC_INTR_0_NV50_DISPLAY_PENDING |
1239 NV_PMC_INTR_0_NV50_I2C_PENDING);
1240 }
1241
1242 if (status)
1243 NV_ERROR(dev, "Unhandled PMC INTR status bits 0x%08x\n", status);
1244
1245 spin_unlock_irqrestore(&dev_priv->context_switch_lock, flags); 150 spin_unlock_irqrestore(&dev_priv->context_switch_lock, flags);
1246
1247 return IRQ_HANDLED;
1248} 151}
diff --git a/drivers/gpu/drm/nouveau/nouveau_mem.c b/drivers/gpu/drm/nouveau/nouveau_mem.c
index 9689d4147686..5ee14d216ce8 100644
--- a/drivers/gpu/drm/nouveau/nouveau_mem.c
+++ b/drivers/gpu/drm/nouveau/nouveau_mem.c
@@ -33,202 +33,144 @@
33#include "drmP.h" 33#include "drmP.h"
34#include "drm.h" 34#include "drm.h"
35#include "drm_sarea.h" 35#include "drm_sarea.h"
36
36#include "nouveau_drv.h" 37#include "nouveau_drv.h"
38#include "nouveau_pm.h"
39#include "nouveau_mm.h"
40#include "nouveau_vm.h"
37 41
38/* 42/*
39 * NV10-NV40 tiling helpers 43 * NV10-NV40 tiling helpers
40 */ 44 */
41 45
42static void 46static void
43nv10_mem_set_region_tiling(struct drm_device *dev, int i, uint32_t addr, 47nv10_mem_update_tile_region(struct drm_device *dev,
44 uint32_t size, uint32_t pitch) 48 struct nouveau_tile_reg *tile, uint32_t addr,
49 uint32_t size, uint32_t pitch, uint32_t flags)
45{ 50{
46 struct drm_nouveau_private *dev_priv = dev->dev_private; 51 struct drm_nouveau_private *dev_priv = dev->dev_private;
47 struct nouveau_fifo_engine *pfifo = &dev_priv->engine.fifo; 52 struct nouveau_fifo_engine *pfifo = &dev_priv->engine.fifo;
48 struct nouveau_fb_engine *pfb = &dev_priv->engine.fb; 53 struct nouveau_fb_engine *pfb = &dev_priv->engine.fb;
49 struct nouveau_pgraph_engine *pgraph = &dev_priv->engine.graph; 54 int i = tile - dev_priv->tile.reg, j;
50 struct nouveau_tile_reg *tile = &dev_priv->tile.reg[i]; 55 unsigned long save;
51 56
52 tile->addr = addr; 57 nouveau_fence_unref(&tile->fence);
53 tile->size = size;
54 tile->used = !!pitch;
55 nouveau_fence_unref((void **)&tile->fence);
56 58
57 if (!pfifo->cache_flush(dev)) 59 if (tile->pitch)
58 return; 60 pfb->free_tile_region(dev, i);
61
62 if (pitch)
63 pfb->init_tile_region(dev, i, addr, size, pitch, flags);
59 64
65 spin_lock_irqsave(&dev_priv->context_switch_lock, save);
60 pfifo->reassign(dev, false); 66 pfifo->reassign(dev, false);
61 pfifo->cache_flush(dev);
62 pfifo->cache_pull(dev, false); 67 pfifo->cache_pull(dev, false);
63 68
64 nouveau_wait_for_idle(dev); 69 nouveau_wait_for_idle(dev);
65 70
66 pgraph->set_region_tiling(dev, i, addr, size, pitch); 71 pfb->set_tile_region(dev, i);
67 pfb->set_region_tiling(dev, i, addr, size, pitch); 72 for (j = 0; j < NVOBJ_ENGINE_NR; j++) {
73 if (dev_priv->eng[j] && dev_priv->eng[j]->set_tile_region)
74 dev_priv->eng[j]->set_tile_region(dev, i);
75 }
68 76
69 pfifo->cache_pull(dev, true); 77 pfifo->cache_pull(dev, true);
70 pfifo->reassign(dev, true); 78 pfifo->reassign(dev, true);
79 spin_unlock_irqrestore(&dev_priv->context_switch_lock, save);
71} 80}
72 81
73struct nouveau_tile_reg * 82static struct nouveau_tile_reg *
74nv10_mem_set_tiling(struct drm_device *dev, uint32_t addr, uint32_t size, 83nv10_mem_get_tile_region(struct drm_device *dev, int i)
75 uint32_t pitch)
76{ 84{
77 struct drm_nouveau_private *dev_priv = dev->dev_private; 85 struct drm_nouveau_private *dev_priv = dev->dev_private;
78 struct nouveau_fb_engine *pfb = &dev_priv->engine.fb; 86 struct nouveau_tile_reg *tile = &dev_priv->tile.reg[i];
79 struct nouveau_tile_reg *tile = dev_priv->tile.reg, *found = NULL;
80 int i;
81 87
82 spin_lock(&dev_priv->tile.lock); 88 spin_lock(&dev_priv->tile.lock);
83 89
84 for (i = 0; i < pfb->num_tiles; i++) { 90 if (!tile->used &&
85 if (tile[i].used) 91 (!tile->fence || nouveau_fence_signalled(tile->fence)))
86 /* Tile region in use. */ 92 tile->used = true;
87 continue; 93 else
88 94 tile = NULL;
89 if (tile[i].fence &&
90 !nouveau_fence_signalled(tile[i].fence, NULL))
91 /* Pending tile region. */
92 continue;
93
94 if (max(tile[i].addr, addr) <
95 min(tile[i].addr + tile[i].size, addr + size))
96 /* Kill an intersecting tile region. */
97 nv10_mem_set_region_tiling(dev, i, 0, 0, 0);
98
99 if (pitch && !found) {
100 /* Free tile region. */
101 nv10_mem_set_region_tiling(dev, i, addr, size, pitch);
102 found = &tile[i];
103 }
104 }
105 95
106 spin_unlock(&dev_priv->tile.lock); 96 spin_unlock(&dev_priv->tile.lock);
107 97 return tile;
108 return found;
109} 98}
110 99
111void 100void
112nv10_mem_expire_tiling(struct drm_device *dev, struct nouveau_tile_reg *tile, 101nv10_mem_put_tile_region(struct drm_device *dev, struct nouveau_tile_reg *tile,
113 struct nouveau_fence *fence) 102 struct nouveau_fence *fence)
114{
115 if (fence) {
116 /* Mark it as pending. */
117 tile->fence = fence;
118 nouveau_fence_ref(fence);
119 }
120
121 tile->used = false;
122}
123
124/*
125 * NV50 VM helpers
126 */
127int
128nv50_mem_vm_bind_linear(struct drm_device *dev, uint64_t virt, uint32_t size,
129 uint32_t flags, uint64_t phys)
130{ 103{
131 struct drm_nouveau_private *dev_priv = dev->dev_private; 104 struct drm_nouveau_private *dev_priv = dev->dev_private;
132 struct nouveau_gpuobj *pgt;
133 unsigned block;
134 int i;
135 105
136 virt = ((virt - dev_priv->vm_vram_base) >> 16) << 1; 106 if (tile) {
137 size = (size >> 16) << 1; 107 spin_lock(&dev_priv->tile.lock);
138 108 if (fence) {
139 phys |= ((uint64_t)flags << 32); 109 /* Mark it as pending. */
140 phys |= 1; 110 tile->fence = fence;
141 if (dev_priv->vram_sys_base) { 111 nouveau_fence_ref(fence);
142 phys += dev_priv->vram_sys_base;
143 phys |= 0x30;
144 }
145
146 while (size) {
147 unsigned offset_h = upper_32_bits(phys);
148 unsigned offset_l = lower_32_bits(phys);
149 unsigned pte, end;
150
151 for (i = 7; i >= 0; i--) {
152 block = 1 << (i + 1);
153 if (size >= block && !(virt & (block - 1)))
154 break;
155 } 112 }
156 offset_l |= (i << 7);
157
158 phys += block << 15;
159 size -= block;
160 113
161 while (block) { 114 tile->used = false;
162 pgt = dev_priv->vm_vram_pt[virt >> 14]; 115 spin_unlock(&dev_priv->tile.lock);
163 pte = virt & 0x3ffe;
164
165 end = pte + block;
166 if (end > 16384)
167 end = 16384;
168 block -= (end - pte);
169 virt += (end - pte);
170
171 while (pte < end) {
172 nv_wo32(dev, pgt, pte++, offset_l);
173 nv_wo32(dev, pgt, pte++, offset_h);
174 }
175 }
176 } 116 }
177 dev_priv->engine.instmem.flush(dev);
178
179 nv50_vm_flush(dev, 5);
180 nv50_vm_flush(dev, 0);
181 nv50_vm_flush(dev, 4);
182 nv50_vm_flush(dev, 6);
183 return 0;
184} 117}
185 118
186void 119struct nouveau_tile_reg *
187nv50_mem_vm_unbind(struct drm_device *dev, uint64_t virt, uint32_t size) 120nv10_mem_set_tiling(struct drm_device *dev, uint32_t addr, uint32_t size,
121 uint32_t pitch, uint32_t flags)
188{ 122{
189 struct drm_nouveau_private *dev_priv = dev->dev_private; 123 struct drm_nouveau_private *dev_priv = dev->dev_private;
190 struct nouveau_gpuobj *pgt; 124 struct nouveau_fb_engine *pfb = &dev_priv->engine.fb;
191 unsigned pages, pte, end; 125 struct nouveau_tile_reg *tile, *found = NULL;
126 int i;
192 127
193 virt -= dev_priv->vm_vram_base; 128 for (i = 0; i < pfb->num_tiles; i++) {
194 pages = (size >> 16) << 1; 129 tile = nv10_mem_get_tile_region(dev, i);
195 130
196 while (pages) { 131 if (pitch && !found) {
197 pgt = dev_priv->vm_vram_pt[virt >> 29]; 132 found = tile;
198 pte = (virt & 0x1ffe0000ULL) >> 15; 133 continue;
199 134
200 end = pte + pages; 135 } else if (tile && tile->pitch) {
201 if (end > 16384) 136 /* Kill an unused tile region. */
202 end = 16384; 137 nv10_mem_update_tile_region(dev, tile, 0, 0, 0, 0);
203 pages -= (end - pte); 138 }
204 virt += (end - pte) << 15;
205 139
206 while (pte < end) 140 nv10_mem_put_tile_region(dev, tile, NULL);
207 nv_wo32(dev, pgt, pte++, 0);
208 } 141 }
209 dev_priv->engine.instmem.flush(dev);
210 142
211 nv50_vm_flush(dev, 5); 143 if (found)
212 nv50_vm_flush(dev, 0); 144 nv10_mem_update_tile_region(dev, found, addr, size,
213 nv50_vm_flush(dev, 4); 145 pitch, flags);
214 nv50_vm_flush(dev, 6); 146 return found;
215} 147}
216 148
217/* 149/*
218 * Cleanup everything 150 * Cleanup everything
219 */ 151 */
220void 152void
221nouveau_mem_close(struct drm_device *dev) 153nouveau_mem_vram_fini(struct drm_device *dev)
222{ 154{
223 struct drm_nouveau_private *dev_priv = dev->dev_private; 155 struct drm_nouveau_private *dev_priv = dev->dev_private;
224 156
225 nouveau_bo_unpin(dev_priv->vga_ram);
226 nouveau_bo_ref(NULL, &dev_priv->vga_ram);
227
228 ttm_bo_device_release(&dev_priv->ttm.bdev); 157 ttm_bo_device_release(&dev_priv->ttm.bdev);
229 158
230 nouveau_ttm_global_release(dev_priv); 159 nouveau_ttm_global_release(dev_priv);
231 160
161 if (dev_priv->fb_mtrr >= 0) {
162 drm_mtrr_del(dev_priv->fb_mtrr,
163 pci_resource_start(dev->pdev, 1),
164 pci_resource_len(dev->pdev, 1), DRM_MTRR_WC);
165 dev_priv->fb_mtrr = -1;
166 }
167}
168
169void
170nouveau_mem_gart_fini(struct drm_device *dev)
171{
172 nouveau_sgdma_takedown(dev);
173
232 if (drm_core_has_AGP(dev) && dev->agp) { 174 if (drm_core_has_AGP(dev) && dev->agp) {
233 struct drm_agp_mem *entry, *tempe; 175 struct drm_agp_mem *entry, *tempe;
234 176
@@ -248,13 +190,6 @@ nouveau_mem_close(struct drm_device *dev)
248 dev->agp->acquired = 0; 190 dev->agp->acquired = 0;
249 dev->agp->enabled = 0; 191 dev->agp->enabled = 0;
250 } 192 }
251
252 if (dev_priv->fb_mtrr) {
253 drm_mtrr_del(dev_priv->fb_mtrr,
254 pci_resource_start(dev->pdev, 1),
255 pci_resource_len(dev->pdev, 1), DRM_MTRR_WC);
256 dev_priv->fb_mtrr = -1;
257 }
258} 193}
259 194
260static uint32_t 195static uint32_t
@@ -305,7 +240,6 @@ nouveau_mem_detect_nforce(struct drm_device *dev)
305 return 0; 240 return 0;
306} 241}
307 242
308/* returns the amount of FB ram in bytes */
309int 243int
310nouveau_mem_detect(struct drm_device *dev) 244nouveau_mem_detect(struct drm_device *dev)
311{ 245{
@@ -320,24 +254,6 @@ nouveau_mem_detect(struct drm_device *dev)
320 if (dev_priv->card_type < NV_50) { 254 if (dev_priv->card_type < NV_50) {
321 dev_priv->vram_size = nv_rd32(dev, NV04_PFB_FIFO_DATA); 255 dev_priv->vram_size = nv_rd32(dev, NV04_PFB_FIFO_DATA);
322 dev_priv->vram_size &= NV10_PFB_FIFO_DATA_RAM_AMOUNT_MB_MASK; 256 dev_priv->vram_size &= NV10_PFB_FIFO_DATA_RAM_AMOUNT_MB_MASK;
323 } else
324 if (dev_priv->card_type < NV_C0) {
325 dev_priv->vram_size = nv_rd32(dev, NV04_PFB_FIFO_DATA);
326 dev_priv->vram_size |= (dev_priv->vram_size & 0xff) << 32;
327 dev_priv->vram_size &= 0xffffffff00ll;
328 if (dev_priv->chipset == 0xaa || dev_priv->chipset == 0xac) {
329 dev_priv->vram_sys_base = nv_rd32(dev, 0x100e10);
330 dev_priv->vram_sys_base <<= 12;
331 }
332 } else {
333 dev_priv->vram_size = nv_rd32(dev, 0x10f20c) << 20;
334 dev_priv->vram_size *= nv_rd32(dev, 0x121c74);
335 }
336
337 NV_INFO(dev, "Detected %dMiB VRAM\n", (int)(dev_priv->vram_size >> 20));
338 if (dev_priv->vram_sys_base) {
339 NV_INFO(dev, "Stolen system memory at: 0x%010llx\n",
340 dev_priv->vram_sys_base);
341 } 257 }
342 258
343 if (dev_priv->vram_size) 259 if (dev_priv->vram_size)
@@ -345,6 +261,42 @@ nouveau_mem_detect(struct drm_device *dev)
345 return -ENOMEM; 261 return -ENOMEM;
346} 262}
347 263
264bool
265nouveau_mem_flags_valid(struct drm_device *dev, u32 tile_flags)
266{
267 if (!(tile_flags & NOUVEAU_GEM_TILE_LAYOUT_MASK))
268 return true;
269
270 return false;
271}
272
273#if __OS_HAS_AGP
274static unsigned long
275get_agp_mode(struct drm_device *dev, unsigned long mode)
276{
277 struct drm_nouveau_private *dev_priv = dev->dev_private;
278
279 /*
280 * FW seems to be broken on nv18, it makes the card lock up
281 * randomly.
282 */
283 if (dev_priv->chipset == 0x18)
284 mode &= ~PCI_AGP_COMMAND_FW;
285
286 /*
287 * AGP mode set in the command line.
288 */
289 if (nouveau_agpmode > 0) {
290 bool agpv3 = mode & 0x8;
291 int rate = agpv3 ? nouveau_agpmode / 4 : nouveau_agpmode;
292
293 mode = (mode & ~0x7) | (rate & 0x7);
294 }
295
296 return mode;
297}
298#endif
299
348int 300int
349nouveau_mem_reset_agp(struct drm_device *dev) 301nouveau_mem_reset_agp(struct drm_device *dev)
350{ 302{
@@ -355,7 +307,8 @@ nouveau_mem_reset_agp(struct drm_device *dev)
355 /* First of all, disable fast writes, otherwise if it's 307 /* First of all, disable fast writes, otherwise if it's
356 * already enabled in the AGP bridge and we disable the card's 308 * already enabled in the AGP bridge and we disable the card's
357 * AGP controller we might be locking ourselves out of it. */ 309 * AGP controller we might be locking ourselves out of it. */
358 if (nv_rd32(dev, NV04_PBUS_PCI_NV_19) & PCI_AGP_COMMAND_FW) { 310 if ((nv_rd32(dev, NV04_PBUS_PCI_NV_19) |
311 dev->agp->mode) & PCI_AGP_COMMAND_FW) {
359 struct drm_agp_info info; 312 struct drm_agp_info info;
360 struct drm_agp_mode mode; 313 struct drm_agp_mode mode;
361 314
@@ -363,7 +316,7 @@ nouveau_mem_reset_agp(struct drm_device *dev)
363 if (ret) 316 if (ret)
364 return ret; 317 return ret;
365 318
366 mode.mode = info.mode & ~PCI_AGP_COMMAND_FW; 319 mode.mode = get_agp_mode(dev, info.mode) & ~PCI_AGP_COMMAND_FW;
367 ret = drm_agp_enable(dev, mode); 320 ret = drm_agp_enable(dev, mode);
368 if (ret) 321 if (ret)
369 return ret; 322 return ret;
@@ -418,7 +371,7 @@ nouveau_mem_init_agp(struct drm_device *dev)
418 } 371 }
419 372
420 /* see agp.h for the AGPSTAT_* modes available */ 373 /* see agp.h for the AGPSTAT_* modes available */
421 mode.mode = info.mode; 374 mode.mode = get_agp_mode(dev, info.mode);
422 ret = drm_agp_enable(dev, mode); 375 ret = drm_agp_enable(dev, mode);
423 if (ret) { 376 if (ret) {
424 NV_ERROR(dev, "Unable to enable AGP: %d\n", ret); 377 NV_ERROR(dev, "Unable to enable AGP: %d\n", ret);
@@ -433,24 +386,29 @@ nouveau_mem_init_agp(struct drm_device *dev)
433} 386}
434 387
435int 388int
436nouveau_mem_init(struct drm_device *dev) 389nouveau_mem_vram_init(struct drm_device *dev)
437{ 390{
438 struct drm_nouveau_private *dev_priv = dev->dev_private; 391 struct drm_nouveau_private *dev_priv = dev->dev_private;
439 struct ttm_bo_device *bdev = &dev_priv->ttm.bdev; 392 struct ttm_bo_device *bdev = &dev_priv->ttm.bdev;
440 int ret, dma_bits = 32; 393 int ret, dma_bits;
441 394
442 dev_priv->fb_phys = pci_resource_start(dev->pdev, 1); 395 dma_bits = 32;
443 dev_priv->gart_info.type = NOUVEAU_GART_NONE; 396 if (dev_priv->card_type >= NV_50) {
444 397 if (pci_dma_supported(dev->pdev, DMA_BIT_MASK(40)))
445 if (dev_priv->card_type >= NV_50 && 398 dma_bits = 40;
446 pci_dma_supported(dev->pdev, DMA_BIT_MASK(40))) 399 } else
447 dma_bits = 40; 400 if (0 && drm_pci_device_is_pcie(dev) &&
401 dev_priv->chipset > 0x40 &&
402 dev_priv->chipset != 0x45) {
403 if (pci_dma_supported(dev->pdev, DMA_BIT_MASK(39)))
404 dma_bits = 39;
405 }
448 406
449 ret = pci_set_dma_mask(dev->pdev, DMA_BIT_MASK(dma_bits)); 407 ret = pci_set_dma_mask(dev->pdev, DMA_BIT_MASK(dma_bits));
450 if (ret) { 408 if (ret)
451 NV_ERROR(dev, "Error setting DMA mask: %d\n", ret);
452 return ret; 409 return ret;
453 } 410
411 dev_priv->fb_phys = pci_resource_start(dev->pdev, 1);
454 412
455 ret = nouveau_ttm_global_init(dev_priv); 413 ret = nouveau_ttm_global_init(dev_priv);
456 if (ret) 414 if (ret)
@@ -465,16 +423,50 @@ nouveau_mem_init(struct drm_device *dev)
465 return ret; 423 return ret;
466 } 424 }
467 425
468 spin_lock_init(&dev_priv->tile.lock); 426 /* reserve space at end of VRAM for PRAMIN */
427 if (dev_priv->card_type >= NV_50) {
428 dev_priv->ramin_rsvd_vram = 1 * 1024 * 1024;
429 } else
430 if (dev_priv->card_type >= NV_40) {
431 u32 vs = hweight8((nv_rd32(dev, 0x001540) & 0x0000ff00) >> 8);
432 u32 rsvd;
433
434 /* estimate grctx size, the magics come from nv40_grctx.c */
435 if (dev_priv->chipset == 0x40) rsvd = 0x6aa0 * vs;
436 else if (dev_priv->chipset < 0x43) rsvd = 0x4f00 * vs;
437 else if (nv44_graph_class(dev)) rsvd = 0x4980 * vs;
438 else rsvd = 0x4a40 * vs;
439 rsvd += 16 * 1024;
440 rsvd *= dev_priv->engine.fifo.channels;
441
442 /* pciegart table */
443 if (drm_pci_device_is_pcie(dev))
444 rsvd += 512 * 1024;
445
446 /* object storage */
447 rsvd += 512 * 1024;
448
449 dev_priv->ramin_rsvd_vram = round_up(rsvd, 4096);
450 } else {
451 dev_priv->ramin_rsvd_vram = 512 * 1024;
452 }
453
454 ret = dev_priv->engine.vram.init(dev);
455 if (ret)
456 return ret;
457
458 NV_INFO(dev, "Detected %dMiB VRAM\n", (int)(dev_priv->vram_size >> 20));
459 if (dev_priv->vram_sys_base) {
460 NV_INFO(dev, "Stolen system memory at: 0x%010llx\n",
461 dev_priv->vram_sys_base);
462 }
469 463
470 dev_priv->fb_available_size = dev_priv->vram_size; 464 dev_priv->fb_available_size = dev_priv->vram_size;
471 dev_priv->fb_mappable_pages = dev_priv->fb_available_size; 465 dev_priv->fb_mappable_pages = dev_priv->fb_available_size;
472 if (dev_priv->fb_mappable_pages > pci_resource_len(dev->pdev, 1)) 466 if (dev_priv->fb_mappable_pages > pci_resource_len(dev->pdev, 1))
473 dev_priv->fb_mappable_pages = 467 dev_priv->fb_mappable_pages = pci_resource_len(dev->pdev, 1);
474 pci_resource_len(dev->pdev, 1);
475 dev_priv->fb_mappable_pages >>= PAGE_SHIFT; 468 dev_priv->fb_mappable_pages >>= PAGE_SHIFT;
476 469
477 /* remove reserved space at end of vram from available amount */
478 dev_priv->fb_available_size -= dev_priv->ramin_rsvd_vram; 470 dev_priv->fb_available_size -= dev_priv->ramin_rsvd_vram;
479 dev_priv->fb_aper_free = dev_priv->fb_available_size; 471 dev_priv->fb_aper_free = dev_priv->fb_available_size;
480 472
@@ -486,18 +478,36 @@ nouveau_mem_init(struct drm_device *dev)
486 return ret; 478 return ret;
487 } 479 }
488 480
489 ret = nouveau_bo_new(dev, NULL, 256*1024, 0, TTM_PL_FLAG_VRAM, 481 if (dev_priv->card_type < NV_50) {
490 0, 0, true, true, &dev_priv->vga_ram); 482 ret = nouveau_bo_new(dev, NULL, 256*1024, 0, TTM_PL_FLAG_VRAM,
491 if (ret == 0) 483 0, 0, &dev_priv->vga_ram);
492 ret = nouveau_bo_pin(dev_priv->vga_ram, TTM_PL_FLAG_VRAM); 484 if (ret == 0)
493 if (ret) { 485 ret = nouveau_bo_pin(dev_priv->vga_ram,
494 NV_WARN(dev, "failed to reserve VGA memory\n"); 486 TTM_PL_FLAG_VRAM);
495 nouveau_bo_ref(NULL, &dev_priv->vga_ram); 487
488 if (ret) {
489 NV_WARN(dev, "failed to reserve VGA memory\n");
490 nouveau_bo_ref(NULL, &dev_priv->vga_ram);
491 }
496 } 492 }
497 493
498 /* GART */ 494 dev_priv->fb_mtrr = drm_mtrr_add(pci_resource_start(dev->pdev, 1),
495 pci_resource_len(dev->pdev, 1),
496 DRM_MTRR_WC);
497 return 0;
498}
499
500int
501nouveau_mem_gart_init(struct drm_device *dev)
502{
503 struct drm_nouveau_private *dev_priv = dev->dev_private;
504 struct ttm_bo_device *bdev = &dev_priv->ttm.bdev;
505 int ret;
506
507 dev_priv->gart_info.type = NOUVEAU_GART_NONE;
508
499#if !defined(__powerpc__) && !defined(__ia64__) 509#if !defined(__powerpc__) && !defined(__ia64__)
500 if (drm_device_is_agp(dev) && dev->agp && !nouveau_noagp) { 510 if (drm_pci_device_is_agp(dev) && dev->agp && nouveau_agpmode) {
501 ret = nouveau_mem_init_agp(dev); 511 ret = nouveau_mem_init_agp(dev);
502 if (ret) 512 if (ret)
503 NV_ERROR(dev, "Error initialising AGP: %d\n", ret); 513 NV_ERROR(dev, "Error initialising AGP: %d\n", ret);
@@ -523,11 +533,398 @@ nouveau_mem_init(struct drm_device *dev)
523 return ret; 533 return ret;
524 } 534 }
525 535
526 dev_priv->fb_mtrr = drm_mtrr_add(pci_resource_start(dev->pdev, 1), 536 return 0;
527 pci_resource_len(dev->pdev, 1), 537}
528 DRM_MTRR_WC); 538
539void
540nouveau_mem_timing_init(struct drm_device *dev)
541{
542 /* cards < NVC0 only */
543 struct drm_nouveau_private *dev_priv = dev->dev_private;
544 struct nouveau_pm_engine *pm = &dev_priv->engine.pm;
545 struct nouveau_pm_memtimings *memtimings = &pm->memtimings;
546 struct nvbios *bios = &dev_priv->vbios;
547 struct bit_entry P;
548 u8 tUNK_0, tUNK_1, tUNK_2;
549 u8 tRP; /* Byte 3 */
550 u8 tRAS; /* Byte 5 */
551 u8 tRFC; /* Byte 7 */
552 u8 tRC; /* Byte 9 */
553 u8 tUNK_10, tUNK_11, tUNK_12, tUNK_13, tUNK_14;
554 u8 tUNK_18, tUNK_19, tUNK_20, tUNK_21;
555 u8 magic_number = 0; /* Yeah... sorry*/
556 u8 *mem = NULL, *entry;
557 int i, recordlen, entries;
558
559 if (bios->type == NVBIOS_BIT) {
560 if (bit_table(dev, 'P', &P))
561 return;
562
563 if (P.version == 1)
564 mem = ROMPTR(bios, P.data[4]);
565 else
566 if (P.version == 2)
567 mem = ROMPTR(bios, P.data[8]);
568 else {
569 NV_WARN(dev, "unknown mem for BIT P %d\n", P.version);
570 }
571 } else {
572 NV_DEBUG(dev, "BMP version too old for memory\n");
573 return;
574 }
575
576 if (!mem) {
577 NV_DEBUG(dev, "memory timing table pointer invalid\n");
578 return;
579 }
580
581 if (mem[0] != 0x10) {
582 NV_WARN(dev, "memory timing table 0x%02x unknown\n", mem[0]);
583 return;
584 }
585
586 /* validate record length */
587 entries = mem[2];
588 recordlen = mem[3];
589 if (recordlen < 15) {
590 NV_ERROR(dev, "mem timing table length unknown: %d\n", mem[3]);
591 return;
592 }
593
594 /* parse vbios entries into common format */
595 memtimings->timing =
596 kcalloc(entries, sizeof(*memtimings->timing), GFP_KERNEL);
597 if (!memtimings->timing)
598 return;
599
600 /* Get "some number" from the timing reg for NV_40 and NV_50
601 * Used in calculations later */
602 if (dev_priv->card_type >= NV_40 && dev_priv->chipset < 0x98) {
603 magic_number = (nv_rd32(dev, 0x100228) & 0x0f000000) >> 24;
604 }
605
606 entry = mem + mem[1];
607 for (i = 0; i < entries; i++, entry += recordlen) {
608 struct nouveau_pm_memtiming *timing = &pm->memtimings.timing[i];
609 if (entry[0] == 0)
610 continue;
611
612 tUNK_18 = 1;
613 tUNK_19 = 1;
614 tUNK_20 = 0;
615 tUNK_21 = 0;
616 switch (min(recordlen, 22)) {
617 case 22:
618 tUNK_21 = entry[21];
619 case 21:
620 tUNK_20 = entry[20];
621 case 20:
622 tUNK_19 = entry[19];
623 case 19:
624 tUNK_18 = entry[18];
625 default:
626 tUNK_0 = entry[0];
627 tUNK_1 = entry[1];
628 tUNK_2 = entry[2];
629 tRP = entry[3];
630 tRAS = entry[5];
631 tRFC = entry[7];
632 tRC = entry[9];
633 tUNK_10 = entry[10];
634 tUNK_11 = entry[11];
635 tUNK_12 = entry[12];
636 tUNK_13 = entry[13];
637 tUNK_14 = entry[14];
638 break;
639 }
640
641 timing->reg_100220 = (tRC << 24 | tRFC << 16 | tRAS << 8 | tRP);
642
643 /* XXX: I don't trust the -1's and +1's... they must come
644 * from somewhere! */
645 timing->reg_100224 = (tUNK_0 + tUNK_19 + 1 + magic_number) << 24 |
646 max(tUNK_18, (u8) 1) << 16 |
647 (tUNK_1 + tUNK_19 + 1 + magic_number) << 8;
648 if (dev_priv->chipset == 0xa8) {
649 timing->reg_100224 |= (tUNK_2 - 1);
650 } else {
651 timing->reg_100224 |= (tUNK_2 + 2 - magic_number);
652 }
653
654 timing->reg_100228 = (tUNK_12 << 16 | tUNK_11 << 8 | tUNK_10);
655 if (dev_priv->chipset >= 0xa3 && dev_priv->chipset < 0xaa)
656 timing->reg_100228 |= (tUNK_19 - 1) << 24;
657 else
658 timing->reg_100228 |= magic_number << 24;
659
660 if (dev_priv->card_type == NV_40) {
661 /* NV40: don't know what the rest of the regs are..
662 * And don't need to know either */
663 timing->reg_100228 |= 0x20200000;
664 } else if (dev_priv->card_type >= NV_50) {
665 if (dev_priv->chipset < 0x98 ||
666 (dev_priv->chipset == 0x98 &&
667 dev_priv->stepping <= 0xa1)) {
668 timing->reg_10022c = (0x14 + tUNK_2) << 24 |
669 0x16 << 16 |
670 (tUNK_2 - 1) << 8 |
671 (tUNK_2 - 1);
672 } else {
673 /* XXX: reg_10022c for recentish cards */
674 timing->reg_10022c = tUNK_2 - 1;
675 }
676
677 timing->reg_100230 = (tUNK_20 << 24 | tUNK_21 << 16 |
678 tUNK_13 << 8 | tUNK_13);
679
680 timing->reg_100234 = (tRAS << 24 | tRC);
681 timing->reg_100234 += max(tUNK_10, tUNK_11) << 16;
682
683 if (dev_priv->chipset < 0x98 ||
684 (dev_priv->chipset == 0x98 &&
685 dev_priv->stepping <= 0xa1)) {
686 timing->reg_100234 |= (tUNK_2 + 2) << 8;
687 } else {
688 /* XXX: +6? */
689 timing->reg_100234 |= (tUNK_19 + 6) << 8;
690 }
691
692 /* XXX; reg_100238
693 * reg_100238: 0x00?????? */
694 timing->reg_10023c = 0x202;
695 if (dev_priv->chipset < 0x98 ||
696 (dev_priv->chipset == 0x98 &&
697 dev_priv->stepping <= 0xa1)) {
698 timing->reg_10023c |= 0x4000000 | (tUNK_2 - 1) << 16;
699 } else {
700 /* XXX: reg_10023c
701 * currently unknown
702 * 10023c seen as 06xxxxxx, 0bxxxxxx or 0fxxxxxx */
703 }
704
705 /* XXX: reg_100240? */
706 }
707 timing->id = i;
708
709 NV_DEBUG(dev, "Entry %d: 220: %08x %08x %08x %08x\n", i,
710 timing->reg_100220, timing->reg_100224,
711 timing->reg_100228, timing->reg_10022c);
712 NV_DEBUG(dev, " 230: %08x %08x %08x %08x\n",
713 timing->reg_100230, timing->reg_100234,
714 timing->reg_100238, timing->reg_10023c);
715 NV_DEBUG(dev, " 240: %08x\n", timing->reg_100240);
716 }
717
718 memtimings->nr_timing = entries;
719 memtimings->supported = (dev_priv->chipset <= 0x98);
720}
721
722void
723nouveau_mem_timing_fini(struct drm_device *dev)
724{
725 struct drm_nouveau_private *dev_priv = dev->dev_private;
726 struct nouveau_pm_memtimings *mem = &dev_priv->engine.pm.memtimings;
727
728 kfree(mem->timing);
729}
730
731static int
732nouveau_vram_manager_init(struct ttm_mem_type_manager *man, unsigned long p_size)
733{
734 struct drm_nouveau_private *dev_priv = nouveau_bdev(man->bdev);
735 struct nouveau_mm *mm;
736 u64 size, block, rsvd;
737 int ret;
738
739 rsvd = (256 * 1024); /* vga memory */
740 size = (p_size << PAGE_SHIFT) - rsvd;
741 block = dev_priv->vram_rblock_size;
742
743 ret = nouveau_mm_init(&mm, rsvd >> 12, size >> 12, block >> 12);
744 if (ret)
745 return ret;
746
747 man->priv = mm;
748 return 0;
749}
750
751static int
752nouveau_vram_manager_fini(struct ttm_mem_type_manager *man)
753{
754 struct nouveau_mm *mm = man->priv;
755 int ret;
756
757 ret = nouveau_mm_fini(&mm);
758 if (ret)
759 return ret;
760
761 man->priv = NULL;
762 return 0;
763}
764
765static void
766nouveau_vram_manager_del(struct ttm_mem_type_manager *man,
767 struct ttm_mem_reg *mem)
768{
769 struct drm_nouveau_private *dev_priv = nouveau_bdev(man->bdev);
770 struct nouveau_vram_engine *vram = &dev_priv->engine.vram;
771 struct nouveau_mem *node = mem->mm_node;
772 struct drm_device *dev = dev_priv->dev;
773
774 if (node->tmp_vma.node) {
775 nouveau_vm_unmap(&node->tmp_vma);
776 nouveau_vm_put(&node->tmp_vma);
777 }
778
779 vram->put(dev, (struct nouveau_mem **)&mem->mm_node);
780}
781
782static int
783nouveau_vram_manager_new(struct ttm_mem_type_manager *man,
784 struct ttm_buffer_object *bo,
785 struct ttm_placement *placement,
786 struct ttm_mem_reg *mem)
787{
788 struct drm_nouveau_private *dev_priv = nouveau_bdev(man->bdev);
789 struct nouveau_vram_engine *vram = &dev_priv->engine.vram;
790 struct drm_device *dev = dev_priv->dev;
791 struct nouveau_bo *nvbo = nouveau_bo(bo);
792 struct nouveau_mem *node;
793 u32 size_nc = 0;
794 int ret;
795
796 if (nvbo->tile_flags & NOUVEAU_GEM_TILE_NONCONTIG)
797 size_nc = 1 << nvbo->vma.node->type;
798
799 ret = vram->get(dev, mem->num_pages << PAGE_SHIFT,
800 mem->page_alignment << PAGE_SHIFT, size_nc,
801 (nvbo->tile_flags >> 8) & 0x3ff, &node);
802 if (ret) {
803 mem->mm_node = NULL;
804 return (ret == -ENOSPC) ? 0 : ret;
805 }
529 806
807 node->page_shift = 12;
808 if (nvbo->vma.node)
809 node->page_shift = nvbo->vma.node->type;
810
811 mem->mm_node = node;
812 mem->start = node->offset >> PAGE_SHIFT;
530 return 0; 813 return 0;
531} 814}
532 815
816void
817nouveau_vram_manager_debug(struct ttm_mem_type_manager *man, const char *prefix)
818{
819 struct nouveau_mm *mm = man->priv;
820 struct nouveau_mm_node *r;
821 u32 total = 0, free = 0;
822
823 mutex_lock(&mm->mutex);
824 list_for_each_entry(r, &mm->nodes, nl_entry) {
825 printk(KERN_DEBUG "%s %d: 0x%010llx 0x%010llx\n",
826 prefix, r->type, ((u64)r->offset << 12),
827 (((u64)r->offset + r->length) << 12));
828
829 total += r->length;
830 if (!r->type)
831 free += r->length;
832 }
833 mutex_unlock(&mm->mutex);
834
835 printk(KERN_DEBUG "%s total: 0x%010llx free: 0x%010llx\n",
836 prefix, (u64)total << 12, (u64)free << 12);
837 printk(KERN_DEBUG "%s block: 0x%08x\n",
838 prefix, mm->block_size << 12);
839}
840
841const struct ttm_mem_type_manager_func nouveau_vram_manager = {
842 nouveau_vram_manager_init,
843 nouveau_vram_manager_fini,
844 nouveau_vram_manager_new,
845 nouveau_vram_manager_del,
846 nouveau_vram_manager_debug
847};
848
849static int
850nouveau_gart_manager_init(struct ttm_mem_type_manager *man, unsigned long psize)
851{
852 return 0;
853}
854
855static int
856nouveau_gart_manager_fini(struct ttm_mem_type_manager *man)
857{
858 return 0;
859}
860
861static void
862nouveau_gart_manager_del(struct ttm_mem_type_manager *man,
863 struct ttm_mem_reg *mem)
864{
865 struct nouveau_mem *node = mem->mm_node;
866
867 if (node->tmp_vma.node) {
868 nouveau_vm_unmap(&node->tmp_vma);
869 nouveau_vm_put(&node->tmp_vma);
870 }
871
872 mem->mm_node = NULL;
873 kfree(node);
874}
875
876static int
877nouveau_gart_manager_new(struct ttm_mem_type_manager *man,
878 struct ttm_buffer_object *bo,
879 struct ttm_placement *placement,
880 struct ttm_mem_reg *mem)
881{
882 struct drm_nouveau_private *dev_priv = nouveau_bdev(bo->bdev);
883 struct nouveau_bo *nvbo = nouveau_bo(bo);
884 struct nouveau_vma *vma = &nvbo->vma;
885 struct nouveau_vm *vm = vma->vm;
886 struct nouveau_mem *node;
887 int ret;
888
889 if (unlikely((mem->num_pages << PAGE_SHIFT) >=
890 dev_priv->gart_info.aper_size))
891 return -ENOMEM;
892
893 node = kzalloc(sizeof(*node), GFP_KERNEL);
894 if (!node)
895 return -ENOMEM;
896
897 /* This node must be for evicting large-paged VRAM
898 * to system memory. Due to a nv50 limitation of
899 * not being able to mix large/small pages within
900 * the same PDE, we need to create a temporary
901 * small-paged VMA for the eviction.
902 */
903 if (vma->node->type != vm->spg_shift) {
904 ret = nouveau_vm_get(vm, (u64)vma->node->length << 12,
905 vm->spg_shift, NV_MEM_ACCESS_RW,
906 &node->tmp_vma);
907 if (ret) {
908 kfree(node);
909 return ret;
910 }
911 }
912
913 node->page_shift = nvbo->vma.node->type;
914 mem->mm_node = node;
915 mem->start = 0;
916 return 0;
917}
918
919void
920nouveau_gart_manager_debug(struct ttm_mem_type_manager *man, const char *prefix)
921{
922}
533 923
924const struct ttm_mem_type_manager_func nouveau_gart_manager = {
925 nouveau_gart_manager_init,
926 nouveau_gart_manager_fini,
927 nouveau_gart_manager_new,
928 nouveau_gart_manager_del,
929 nouveau_gart_manager_debug
930};
diff --git a/drivers/gpu/drm/nouveau/nouveau_mm.c b/drivers/gpu/drm/nouveau/nouveau_mm.c
new file mode 100644
index 000000000000..7609756b6faf
--- /dev/null
+++ b/drivers/gpu/drm/nouveau/nouveau_mm.c
@@ -0,0 +1,171 @@
1/*
2 * Copyright 2010 Red Hat 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: Ben Skeggs
23 */
24
25#include "drmP.h"
26#include "nouveau_drv.h"
27#include "nouveau_mm.h"
28
29static inline void
30region_put(struct nouveau_mm *rmm, struct nouveau_mm_node *a)
31{
32 list_del(&a->nl_entry);
33 list_del(&a->fl_entry);
34 kfree(a);
35}
36
37static struct nouveau_mm_node *
38region_split(struct nouveau_mm *rmm, struct nouveau_mm_node *a, u32 size)
39{
40 struct nouveau_mm_node *b;
41
42 if (a->length == size)
43 return a;
44
45 b = kmalloc(sizeof(*b), GFP_KERNEL);
46 if (unlikely(b == NULL))
47 return NULL;
48
49 b->offset = a->offset;
50 b->length = size;
51 b->type = a->type;
52 a->offset += size;
53 a->length -= size;
54 list_add_tail(&b->nl_entry, &a->nl_entry);
55 if (b->type == 0)
56 list_add_tail(&b->fl_entry, &a->fl_entry);
57 return b;
58}
59
60#define node(root, dir) ((root)->nl_entry.dir == &rmm->nodes) ? NULL : \
61 list_entry((root)->nl_entry.dir, struct nouveau_mm_node, nl_entry)
62
63void
64nouveau_mm_put(struct nouveau_mm *rmm, struct nouveau_mm_node *this)
65{
66 struct nouveau_mm_node *prev = node(this, prev);
67 struct nouveau_mm_node *next = node(this, next);
68
69 list_add(&this->fl_entry, &rmm->free);
70 this->type = 0;
71
72 if (prev && prev->type == 0) {
73 prev->length += this->length;
74 region_put(rmm, this);
75 this = prev;
76 }
77
78 if (next && next->type == 0) {
79 next->offset = this->offset;
80 next->length += this->length;
81 region_put(rmm, this);
82 }
83}
84
85int
86nouveau_mm_get(struct nouveau_mm *rmm, int type, u32 size, u32 size_nc,
87 u32 align, struct nouveau_mm_node **pnode)
88{
89 struct nouveau_mm_node *prev, *this, *next;
90 u32 min = size_nc ? size_nc : size;
91 u32 align_mask = align - 1;
92 u32 splitoff;
93 u32 s, e;
94
95 list_for_each_entry(this, &rmm->free, fl_entry) {
96 e = this->offset + this->length;
97 s = this->offset;
98
99 prev = node(this, prev);
100 if (prev && prev->type != type)
101 s = roundup(s, rmm->block_size);
102
103 next = node(this, next);
104 if (next && next->type != type)
105 e = rounddown(e, rmm->block_size);
106
107 s = (s + align_mask) & ~align_mask;
108 e &= ~align_mask;
109 if (s > e || e - s < min)
110 continue;
111
112 splitoff = s - this->offset;
113 if (splitoff && !region_split(rmm, this, splitoff))
114 return -ENOMEM;
115
116 this = region_split(rmm, this, min(size, e - s));
117 if (!this)
118 return -ENOMEM;
119
120 this->type = type;
121 list_del(&this->fl_entry);
122 *pnode = this;
123 return 0;
124 }
125
126 return -ENOSPC;
127}
128
129int
130nouveau_mm_init(struct nouveau_mm **prmm, u32 offset, u32 length, u32 block)
131{
132 struct nouveau_mm *rmm;
133 struct nouveau_mm_node *heap;
134
135 heap = kzalloc(sizeof(*heap), GFP_KERNEL);
136 if (!heap)
137 return -ENOMEM;
138 heap->offset = roundup(offset, block);
139 heap->length = rounddown(offset + length, block) - heap->offset;
140
141 rmm = kzalloc(sizeof(*rmm), GFP_KERNEL);
142 if (!rmm) {
143 kfree(heap);
144 return -ENOMEM;
145 }
146 rmm->block_size = block;
147 mutex_init(&rmm->mutex);
148 INIT_LIST_HEAD(&rmm->nodes);
149 INIT_LIST_HEAD(&rmm->free);
150 list_add(&heap->nl_entry, &rmm->nodes);
151 list_add(&heap->fl_entry, &rmm->free);
152
153 *prmm = rmm;
154 return 0;
155}
156
157int
158nouveau_mm_fini(struct nouveau_mm **prmm)
159{
160 struct nouveau_mm *rmm = *prmm;
161 struct nouveau_mm_node *heap =
162 list_first_entry(&rmm->nodes, struct nouveau_mm_node, nl_entry);
163
164 if (!list_is_singular(&rmm->nodes))
165 return -EBUSY;
166
167 kfree(heap);
168 kfree(rmm);
169 *prmm = NULL;
170 return 0;
171}
diff --git a/drivers/gpu/drm/nouveau/nouveau_mm.h b/drivers/gpu/drm/nouveau/nouveau_mm.h
new file mode 100644
index 000000000000..1f7483aae9a4
--- /dev/null
+++ b/drivers/gpu/drm/nouveau/nouveau_mm.h
@@ -0,0 +1,65 @@
1/*
2 * Copyright 2010 Red Hat 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: Ben Skeggs
23 */
24
25#ifndef __NOUVEAU_REGION_H__
26#define __NOUVEAU_REGION_H__
27
28struct nouveau_mm_node {
29 struct list_head nl_entry;
30 struct list_head fl_entry;
31 struct list_head rl_entry;
32
33 u8 type;
34 u32 offset;
35 u32 length;
36};
37
38struct nouveau_mm {
39 struct list_head nodes;
40 struct list_head free;
41
42 struct mutex mutex;
43
44 u32 block_size;
45};
46
47int nouveau_mm_init(struct nouveau_mm **, u32 offset, u32 length, u32 block);
48int nouveau_mm_fini(struct nouveau_mm **);
49int nouveau_mm_pre(struct nouveau_mm *);
50int nouveau_mm_get(struct nouveau_mm *, int type, u32 size, u32 size_nc,
51 u32 align, struct nouveau_mm_node **);
52void nouveau_mm_put(struct nouveau_mm *, struct nouveau_mm_node *);
53
54int nv50_vram_init(struct drm_device *);
55int nv50_vram_new(struct drm_device *, u64 size, u32 align, u32 size_nc,
56 u32 memtype, struct nouveau_mem **);
57void nv50_vram_del(struct drm_device *, struct nouveau_mem **);
58bool nv50_vram_flags_valid(struct drm_device *, u32 tile_flags);
59
60int nvc0_vram_init(struct drm_device *);
61int nvc0_vram_new(struct drm_device *, u64 size, u32 align, u32 ncmin,
62 u32 memtype, struct nouveau_mem **);
63bool nvc0_vram_flags_valid(struct drm_device *, u32 tile_flags);
64
65#endif
diff --git a/drivers/gpu/drm/nouveau/nouveau_notifier.c b/drivers/gpu/drm/nouveau/nouveau_notifier.c
index 3ec181ff50ce..5b39718ae1f8 100644
--- a/drivers/gpu/drm/nouveau/nouveau_notifier.c
+++ b/drivers/gpu/drm/nouveau/nouveau_notifier.c
@@ -28,26 +28,29 @@
28#include "drmP.h" 28#include "drmP.h"
29#include "drm.h" 29#include "drm.h"
30#include "nouveau_drv.h" 30#include "nouveau_drv.h"
31#include "nouveau_ramht.h"
31 32
32int 33int
33nouveau_notifier_init_channel(struct nouveau_channel *chan) 34nouveau_notifier_init_channel(struct nouveau_channel *chan)
34{ 35{
35 struct drm_device *dev = chan->dev; 36 struct drm_device *dev = chan->dev;
36 struct nouveau_bo *ntfy = NULL; 37 struct nouveau_bo *ntfy = NULL;
37 uint32_t flags; 38 uint32_t flags, ttmpl;
38 int ret; 39 int ret;
39 40
40 if (nouveau_vram_notify) 41 if (nouveau_vram_notify) {
41 flags = TTM_PL_FLAG_VRAM; 42 flags = NOUVEAU_GEM_DOMAIN_VRAM;
42 else 43 ttmpl = TTM_PL_FLAG_VRAM;
43 flags = TTM_PL_FLAG_TT; 44 } else {
45 flags = NOUVEAU_GEM_DOMAIN_GART;
46 ttmpl = TTM_PL_FLAG_TT;
47 }
44 48
45 ret = nouveau_gem_new(dev, NULL, PAGE_SIZE, 0, flags, 49 ret = nouveau_gem_new(dev, NULL, PAGE_SIZE, 0, flags, 0, 0, &ntfy);
46 0, 0x0000, false, true, &ntfy);
47 if (ret) 50 if (ret)
48 return ret; 51 return ret;
49 52
50 ret = nouveau_bo_pin(ntfy, flags); 53 ret = nouveau_bo_pin(ntfy, ttmpl);
51 if (ret) 54 if (ret)
52 goto out_err; 55 goto out_err;
53 56
@@ -95,7 +98,8 @@ nouveau_notifier_gpuobj_dtor(struct drm_device *dev,
95 98
96int 99int
97nouveau_notifier_alloc(struct nouveau_channel *chan, uint32_t handle, 100nouveau_notifier_alloc(struct nouveau_channel *chan, uint32_t handle,
98 int size, uint32_t *b_offset) 101 int size, uint32_t start, uint32_t end,
102 uint32_t *b_offset)
99{ 103{
100 struct drm_device *dev = chan->dev; 104 struct drm_device *dev = chan->dev;
101 struct drm_nouveau_private *dev_priv = dev->dev_private; 105 struct drm_nouveau_private *dev_priv = dev->dev_private;
@@ -104,39 +108,29 @@ nouveau_notifier_alloc(struct nouveau_channel *chan, uint32_t handle,
104 uint32_t offset; 108 uint32_t offset;
105 int target, ret; 109 int target, ret;
106 110
107 mem = drm_mm_search_free(&chan->notifier_heap, size, 0, 0); 111 mem = drm_mm_search_free_in_range(&chan->notifier_heap, size, 0,
112 start, end, 0);
108 if (mem) 113 if (mem)
109 mem = drm_mm_get_block(mem, size, 0); 114 mem = drm_mm_get_block_range(mem, size, 0, start, end);
110 if (!mem) { 115 if (!mem) {
111 NV_ERROR(dev, "Channel %d notifier block full\n", chan->id); 116 NV_ERROR(dev, "Channel %d notifier block full\n", chan->id);
112 return -ENOMEM; 117 return -ENOMEM;
113 } 118 }
114 119
115 offset = chan->notifier_bo->bo.mem.mm_node->start << PAGE_SHIFT; 120 if (dev_priv->card_type < NV_50) {
116 if (chan->notifier_bo->bo.mem.mem_type == TTM_PL_VRAM) { 121 if (chan->notifier_bo->bo.mem.mem_type == TTM_PL_VRAM)
117 target = NV_DMA_TARGET_VIDMEM; 122 target = NV_MEM_TARGET_VRAM;
118 } else 123 else
119 if (chan->notifier_bo->bo.mem.mem_type == TTM_PL_TT) { 124 target = NV_MEM_TARGET_GART;
120 if (dev_priv->gart_info.type == NOUVEAU_GART_SGDMA && 125 offset = chan->notifier_bo->bo.mem.start << PAGE_SHIFT;
121 dev_priv->card_type < NV_50) {
122 ret = nouveau_sgdma_get_page(dev, offset, &offset);
123 if (ret)
124 return ret;
125 target = NV_DMA_TARGET_PCI;
126 } else {
127 target = NV_DMA_TARGET_AGP;
128 if (dev_priv->card_type >= NV_50)
129 offset += dev_priv->vm_gart_base;
130 }
131 } else { 126 } else {
132 NV_ERROR(dev, "Bad DMA target, mem_type %d!\n", 127 target = NV_MEM_TARGET_VM;
133 chan->notifier_bo->bo.mem.mem_type); 128 offset = chan->notifier_bo->vma.offset;
134 return -EINVAL;
135 } 129 }
136 offset += mem->start; 130 offset += mem->start;
137 131
138 ret = nouveau_gpuobj_dma_new(chan, NV_CLASS_DMA_IN_MEMORY, offset, 132 ret = nouveau_gpuobj_dma_new(chan, NV_CLASS_DMA_IN_MEMORY, offset,
139 mem->size, NV_DMA_ACCESS_RW, target, 133 mem->size, NV_MEM_ACCESS_RW, target,
140 &nobj); 134 &nobj);
141 if (ret) { 135 if (ret) {
142 drm_mm_put_block(mem); 136 drm_mm_put_block(mem);
@@ -146,11 +140,11 @@ nouveau_notifier_alloc(struct nouveau_channel *chan, uint32_t handle,
146 nobj->dtor = nouveau_notifier_gpuobj_dtor; 140 nobj->dtor = nouveau_notifier_gpuobj_dtor;
147 nobj->priv = mem; 141 nobj->priv = mem;
148 142
149 ret = nouveau_gpuobj_ref_add(dev, chan, handle, nobj, NULL); 143 ret = nouveau_ramht_insert(chan, handle, nobj);
144 nouveau_gpuobj_ref(NULL, &nobj);
150 if (ret) { 145 if (ret) {
151 nouveau_gpuobj_del(dev, &nobj);
152 drm_mm_put_block(mem); 146 drm_mm_put_block(mem);
153 NV_ERROR(dev, "Error referencing notifier ctxdma: %d\n", ret); 147 NV_ERROR(dev, "Error adding notifier to ramht: %d\n", ret);
154 return ret; 148 return ret;
155 } 149 }
156 150
@@ -180,15 +174,21 @@ int
180nouveau_ioctl_notifier_alloc(struct drm_device *dev, void *data, 174nouveau_ioctl_notifier_alloc(struct drm_device *dev, void *data,
181 struct drm_file *file_priv) 175 struct drm_file *file_priv)
182{ 176{
177 struct drm_nouveau_private *dev_priv = dev->dev_private;
183 struct drm_nouveau_notifierobj_alloc *na = data; 178 struct drm_nouveau_notifierobj_alloc *na = data;
184 struct nouveau_channel *chan; 179 struct nouveau_channel *chan;
185 int ret; 180 int ret;
186 181
187 NOUVEAU_GET_USER_CHANNEL_WITH_RETURN(na->channel, file_priv, chan); 182 /* completely unnecessary for these chipsets... */
183 if (unlikely(dev_priv->card_type >= NV_C0))
184 return -EINVAL;
188 185
189 ret = nouveau_notifier_alloc(chan, na->handle, na->size, &na->offset); 186 chan = nouveau_channel_get(dev, file_priv, na->channel);
190 if (ret) 187 if (IS_ERR(chan))
191 return ret; 188 return PTR_ERR(chan);
192 189
193 return 0; 190 ret = nouveau_notifier_alloc(chan, na->handle, na->size, 0, 0x1000,
191 &na->offset);
192 nouveau_channel_put(&chan);
193 return ret;
194} 194}
diff --git a/drivers/gpu/drm/nouveau/nouveau_object.c b/drivers/gpu/drm/nouveau/nouveau_object.c
index b6bcb254f4ab..8f97016f5b26 100644
--- a/drivers/gpu/drm/nouveau/nouveau_object.c
+++ b/drivers/gpu/drm/nouveau/nouveau_object.c
@@ -34,6 +34,104 @@
34#include "drm.h" 34#include "drm.h"
35#include "nouveau_drv.h" 35#include "nouveau_drv.h"
36#include "nouveau_drm.h" 36#include "nouveau_drm.h"
37#include "nouveau_ramht.h"
38#include "nouveau_vm.h"
39#include "nv50_display.h"
40
41struct nouveau_gpuobj_method {
42 struct list_head head;
43 u32 mthd;
44 int (*exec)(struct nouveau_channel *, u32 class, u32 mthd, u32 data);
45};
46
47struct nouveau_gpuobj_class {
48 struct list_head head;
49 struct list_head methods;
50 u32 id;
51 u32 engine;
52};
53
54int
55nouveau_gpuobj_class_new(struct drm_device *dev, u32 class, u32 engine)
56{
57 struct drm_nouveau_private *dev_priv = dev->dev_private;
58 struct nouveau_gpuobj_class *oc;
59
60 oc = kzalloc(sizeof(*oc), GFP_KERNEL);
61 if (!oc)
62 return -ENOMEM;
63
64 INIT_LIST_HEAD(&oc->methods);
65 oc->id = class;
66 oc->engine = engine;
67 list_add(&oc->head, &dev_priv->classes);
68 return 0;
69}
70
71int
72nouveau_gpuobj_mthd_new(struct drm_device *dev, u32 class, u32 mthd,
73 int (*exec)(struct nouveau_channel *, u32, u32, u32))
74{
75 struct drm_nouveau_private *dev_priv = dev->dev_private;
76 struct nouveau_gpuobj_method *om;
77 struct nouveau_gpuobj_class *oc;
78
79 list_for_each_entry(oc, &dev_priv->classes, head) {
80 if (oc->id == class)
81 goto found;
82 }
83
84 return -EINVAL;
85
86found:
87 om = kzalloc(sizeof(*om), GFP_KERNEL);
88 if (!om)
89 return -ENOMEM;
90
91 om->mthd = mthd;
92 om->exec = exec;
93 list_add(&om->head, &oc->methods);
94 return 0;
95}
96
97int
98nouveau_gpuobj_mthd_call(struct nouveau_channel *chan,
99 u32 class, u32 mthd, u32 data)
100{
101 struct drm_nouveau_private *dev_priv = chan->dev->dev_private;
102 struct nouveau_gpuobj_method *om;
103 struct nouveau_gpuobj_class *oc;
104
105 list_for_each_entry(oc, &dev_priv->classes, head) {
106 if (oc->id != class)
107 continue;
108
109 list_for_each_entry(om, &oc->methods, head) {
110 if (om->mthd == mthd)
111 return om->exec(chan, class, mthd, data);
112 }
113 }
114
115 return -ENOENT;
116}
117
118int
119nouveau_gpuobj_mthd_call2(struct drm_device *dev, int chid,
120 u32 class, u32 mthd, u32 data)
121{
122 struct drm_nouveau_private *dev_priv = dev->dev_private;
123 struct nouveau_channel *chan = NULL;
124 unsigned long flags;
125 int ret = -EINVAL;
126
127 spin_lock_irqsave(&dev_priv->channels.lock, flags);
128 if (chid > 0 && chid < dev_priv->engine.fifo.channels)
129 chan = dev_priv->channels.ptr[chid];
130 if (chan)
131 ret = nouveau_gpuobj_mthd_call(chan, class, mthd, data);
132 spin_unlock_irqrestore(&dev_priv->channels.lock, flags);
133 return ret;
134}
37 135
38/* NVidia uses context objects to drive drawing operations. 136/* NVidia uses context objects to drive drawing operations.
39 137
@@ -65,137 +163,6 @@
65 The key into the hash table depends on the object handle and channel id and 163 The key into the hash table depends on the object handle and channel id and
66 is given as: 164 is given as:
67*/ 165*/
68static uint32_t
69nouveau_ramht_hash_handle(struct drm_device *dev, int channel, uint32_t handle)
70{
71 struct drm_nouveau_private *dev_priv = dev->dev_private;
72 uint32_t hash = 0;
73 int i;
74
75 NV_DEBUG(dev, "ch%d handle=0x%08x\n", channel, handle);
76
77 for (i = 32; i > 0; i -= dev_priv->ramht_bits) {
78 hash ^= (handle & ((1 << dev_priv->ramht_bits) - 1));
79 handle >>= dev_priv->ramht_bits;
80 }
81
82 if (dev_priv->card_type < NV_50)
83 hash ^= channel << (dev_priv->ramht_bits - 4);
84 hash <<= 3;
85
86 NV_DEBUG(dev, "hash=0x%08x\n", hash);
87 return hash;
88}
89
90static int
91nouveau_ramht_entry_valid(struct drm_device *dev, struct nouveau_gpuobj *ramht,
92 uint32_t offset)
93{
94 struct drm_nouveau_private *dev_priv = dev->dev_private;
95 uint32_t ctx = nv_ro32(dev, ramht, (offset + 4)/4);
96
97 if (dev_priv->card_type < NV_40)
98 return ((ctx & NV_RAMHT_CONTEXT_VALID) != 0);
99 return (ctx != 0);
100}
101
102static int
103nouveau_ramht_insert(struct drm_device *dev, struct nouveau_gpuobj_ref *ref)
104{
105 struct drm_nouveau_private *dev_priv = dev->dev_private;
106 struct nouveau_instmem_engine *instmem = &dev_priv->engine.instmem;
107 struct nouveau_channel *chan = ref->channel;
108 struct nouveau_gpuobj *ramht = chan->ramht ? chan->ramht->gpuobj : NULL;
109 uint32_t ctx, co, ho;
110
111 if (!ramht) {
112 NV_ERROR(dev, "No hash table!\n");
113 return -EINVAL;
114 }
115
116 if (dev_priv->card_type < NV_40) {
117 ctx = NV_RAMHT_CONTEXT_VALID | (ref->instance >> 4) |
118 (chan->id << NV_RAMHT_CONTEXT_CHANNEL_SHIFT) |
119 (ref->gpuobj->engine << NV_RAMHT_CONTEXT_ENGINE_SHIFT);
120 } else
121 if (dev_priv->card_type < NV_50) {
122 ctx = (ref->instance >> 4) |
123 (chan->id << NV40_RAMHT_CONTEXT_CHANNEL_SHIFT) |
124 (ref->gpuobj->engine << NV40_RAMHT_CONTEXT_ENGINE_SHIFT);
125 } else {
126 if (ref->gpuobj->engine == NVOBJ_ENGINE_DISPLAY) {
127 ctx = (ref->instance << 10) | 2;
128 } else {
129 ctx = (ref->instance >> 4) |
130 ((ref->gpuobj->engine <<
131 NV40_RAMHT_CONTEXT_ENGINE_SHIFT));
132 }
133 }
134
135 co = ho = nouveau_ramht_hash_handle(dev, chan->id, ref->handle);
136 do {
137 if (!nouveau_ramht_entry_valid(dev, ramht, co)) {
138 NV_DEBUG(dev,
139 "insert ch%d 0x%08x: h=0x%08x, c=0x%08x\n",
140 chan->id, co, ref->handle, ctx);
141 nv_wo32(dev, ramht, (co + 0)/4, ref->handle);
142 nv_wo32(dev, ramht, (co + 4)/4, ctx);
143
144 list_add_tail(&ref->list, &chan->ramht_refs);
145 instmem->flush(dev);
146 return 0;
147 }
148 NV_DEBUG(dev, "collision ch%d 0x%08x: h=0x%08x\n",
149 chan->id, co, nv_ro32(dev, ramht, co/4));
150
151 co += 8;
152 if (co >= dev_priv->ramht_size)
153 co = 0;
154 } while (co != ho);
155
156 NV_ERROR(dev, "RAMHT space exhausted. ch=%d\n", chan->id);
157 return -ENOMEM;
158}
159
160static void
161nouveau_ramht_remove(struct drm_device *dev, struct nouveau_gpuobj_ref *ref)
162{
163 struct drm_nouveau_private *dev_priv = dev->dev_private;
164 struct nouveau_instmem_engine *instmem = &dev_priv->engine.instmem;
165 struct nouveau_channel *chan = ref->channel;
166 struct nouveau_gpuobj *ramht = chan->ramht ? chan->ramht->gpuobj : NULL;
167 uint32_t co, ho;
168
169 if (!ramht) {
170 NV_ERROR(dev, "No hash table!\n");
171 return;
172 }
173
174 co = ho = nouveau_ramht_hash_handle(dev, chan->id, ref->handle);
175 do {
176 if (nouveau_ramht_entry_valid(dev, ramht, co) &&
177 (ref->handle == nv_ro32(dev, ramht, (co/4)))) {
178 NV_DEBUG(dev,
179 "remove ch%d 0x%08x: h=0x%08x, c=0x%08x\n",
180 chan->id, co, ref->handle,
181 nv_ro32(dev, ramht, (co + 4)));
182 nv_wo32(dev, ramht, (co + 0)/4, 0x00000000);
183 nv_wo32(dev, ramht, (co + 4)/4, 0x00000000);
184
185 list_del(&ref->list);
186 instmem->flush(dev);
187 return;
188 }
189
190 co += 8;
191 if (co >= dev_priv->ramht_size)
192 co = 0;
193 } while (co != ho);
194 list_del(&ref->list);
195
196 NV_ERROR(dev, "RAMHT entry not found. ch=%d, handle=0x%08x\n",
197 chan->id, ref->handle);
198}
199 166
200int 167int
201nouveau_gpuobj_new(struct drm_device *dev, struct nouveau_channel *chan, 168nouveau_gpuobj_new(struct drm_device *dev, struct nouveau_channel *chan,
@@ -203,84 +170,67 @@ nouveau_gpuobj_new(struct drm_device *dev, struct nouveau_channel *chan,
203 struct nouveau_gpuobj **gpuobj_ret) 170 struct nouveau_gpuobj **gpuobj_ret)
204{ 171{
205 struct drm_nouveau_private *dev_priv = dev->dev_private; 172 struct drm_nouveau_private *dev_priv = dev->dev_private;
206 struct nouveau_engine *engine = &dev_priv->engine; 173 struct nouveau_instmem_engine *instmem = &dev_priv->engine.instmem;
207 struct nouveau_gpuobj *gpuobj; 174 struct nouveau_gpuobj *gpuobj;
208 struct drm_mm *pramin = NULL; 175 struct drm_mm_node *ramin = NULL;
209 int ret; 176 int ret, i;
210 177
211 NV_DEBUG(dev, "ch%d size=%u align=%d flags=0x%08x\n", 178 NV_DEBUG(dev, "ch%d size=%u align=%d flags=0x%08x\n",
212 chan ? chan->id : -1, size, align, flags); 179 chan ? chan->id : -1, size, align, flags);
213 180
214 if (!dev_priv || !gpuobj_ret || *gpuobj_ret != NULL)
215 return -EINVAL;
216
217 gpuobj = kzalloc(sizeof(*gpuobj), GFP_KERNEL); 181 gpuobj = kzalloc(sizeof(*gpuobj), GFP_KERNEL);
218 if (!gpuobj) 182 if (!gpuobj)
219 return -ENOMEM; 183 return -ENOMEM;
220 NV_DEBUG(dev, "gpuobj %p\n", gpuobj); 184 NV_DEBUG(dev, "gpuobj %p\n", gpuobj);
185 gpuobj->dev = dev;
221 gpuobj->flags = flags; 186 gpuobj->flags = flags;
222 gpuobj->im_channel = chan; 187 kref_init(&gpuobj->refcount);
188 gpuobj->size = size;
223 189
190 spin_lock(&dev_priv->ramin_lock);
224 list_add_tail(&gpuobj->list, &dev_priv->gpuobj_list); 191 list_add_tail(&gpuobj->list, &dev_priv->gpuobj_list);
192 spin_unlock(&dev_priv->ramin_lock);
225 193
226 /* Choose between global instmem heap, and per-channel private
227 * instmem heap. On <NV50 allow requests for private instmem
228 * to be satisfied from global heap if no per-channel area
229 * available.
230 */
231 if (chan) { 194 if (chan) {
232 NV_DEBUG(dev, "channel heap\n"); 195 ramin = drm_mm_search_free(&chan->ramin_heap, size, align, 0);
233 pramin = &chan->ramin_heap; 196 if (ramin)
234 } else { 197 ramin = drm_mm_get_block(ramin, size, align);
235 NV_DEBUG(dev, "global heap\n"); 198 if (!ramin) {
236 pramin = &dev_priv->ramin_heap; 199 nouveau_gpuobj_ref(NULL, &gpuobj);
237 200 return -ENOMEM;
238 ret = engine->instmem.populate(dev, gpuobj, &size);
239 if (ret) {
240 nouveau_gpuobj_del(dev, &gpuobj);
241 return ret;
242 } 201 }
243 }
244 202
245 /* Allocate a chunk of the PRAMIN aperture */ 203 gpuobj->pinst = chan->ramin->pinst;
246 gpuobj->im_pramin = drm_mm_search_free(pramin, size, align, 0); 204 if (gpuobj->pinst != ~0)
247 if (gpuobj->im_pramin) 205 gpuobj->pinst += ramin->start;
248 gpuobj->im_pramin = drm_mm_get_block(gpuobj->im_pramin, size, align);
249 206
250 if (!gpuobj->im_pramin) { 207 gpuobj->cinst = ramin->start;
251 nouveau_gpuobj_del(dev, &gpuobj); 208 gpuobj->vinst = ramin->start + chan->ramin->vinst;
252 return -ENOMEM; 209 gpuobj->node = ramin;
253 } 210 } else {
254 211 ret = instmem->get(gpuobj, size, align);
255 if (!chan) {
256 ret = engine->instmem.bind(dev, gpuobj);
257 if (ret) { 212 if (ret) {
258 nouveau_gpuobj_del(dev, &gpuobj); 213 nouveau_gpuobj_ref(NULL, &gpuobj);
259 return ret; 214 return ret;
260 } 215 }
261 }
262 216
263 if (gpuobj->flags & NVOBJ_FLAG_ZERO_ALLOC) { 217 ret = -ENOSYS;
264 int i; 218 if (!(flags & NVOBJ_FLAG_DONT_MAP))
219 ret = instmem->map(gpuobj);
220 if (ret)
221 gpuobj->pinst = ~0;
265 222
266 for (i = 0; i < gpuobj->im_pramin->size; i += 4) 223 gpuobj->cinst = NVOBJ_CINST_GLOBAL;
267 nv_wo32(dev, gpuobj, i/4, 0);
268 engine->instmem.flush(dev);
269 } 224 }
270 225
271 *gpuobj_ret = gpuobj; 226 if (gpuobj->flags & NVOBJ_FLAG_ZERO_ALLOC) {
272 return 0; 227 for (i = 0; i < gpuobj->size; i += 4)
273} 228 nv_wo32(gpuobj, i, 0);
274 229 instmem->flush(dev);
275int 230 }
276nouveau_gpuobj_early_init(struct drm_device *dev)
277{
278 struct drm_nouveau_private *dev_priv = dev->dev_private;
279
280 NV_DEBUG(dev, "\n");
281 231
282 INIT_LIST_HEAD(&dev_priv->gpuobj_list);
283 232
233 *gpuobj_ret = gpuobj;
284 return 0; 234 return 0;
285} 235}
286 236
@@ -288,18 +238,13 @@ int
288nouveau_gpuobj_init(struct drm_device *dev) 238nouveau_gpuobj_init(struct drm_device *dev)
289{ 239{
290 struct drm_nouveau_private *dev_priv = dev->dev_private; 240 struct drm_nouveau_private *dev_priv = dev->dev_private;
291 int ret;
292 241
293 NV_DEBUG(dev, "\n"); 242 NV_DEBUG(dev, "\n");
294 243
295 if (dev_priv->card_type < NV_50) { 244 INIT_LIST_HEAD(&dev_priv->gpuobj_list);
296 ret = nouveau_gpuobj_new_fake(dev, 245 INIT_LIST_HEAD(&dev_priv->classes);
297 dev_priv->ramht_offset, ~0, dev_priv->ramht_size, 246 spin_lock_init(&dev_priv->ramin_lock);
298 NVOBJ_FLAG_ZERO_ALLOC | NVOBJ_FLAG_ALLOW_NO_REFS, 247 dev_priv->ramin_base = ~0;
299 &dev_priv->ramht, NULL);
300 if (ret)
301 return ret;
302 }
303 248
304 return 0; 249 return 0;
305} 250}
@@ -308,317 +253,114 @@ void
308nouveau_gpuobj_takedown(struct drm_device *dev) 253nouveau_gpuobj_takedown(struct drm_device *dev)
309{ 254{
310 struct drm_nouveau_private *dev_priv = dev->dev_private; 255 struct drm_nouveau_private *dev_priv = dev->dev_private;
256 struct nouveau_gpuobj_method *om, *tm;
257 struct nouveau_gpuobj_class *oc, *tc;
311 258
312 NV_DEBUG(dev, "\n"); 259 NV_DEBUG(dev, "\n");
313 260
314 nouveau_gpuobj_del(dev, &dev_priv->ramht); 261 list_for_each_entry_safe(oc, tc, &dev_priv->classes, head) {
315} 262 list_for_each_entry_safe(om, tm, &oc->methods, head) {
316 263 list_del(&om->head);
317void 264 kfree(om);
318nouveau_gpuobj_late_takedown(struct drm_device *dev) 265 }
319{ 266 list_del(&oc->head);
320 struct drm_nouveau_private *dev_priv = dev->dev_private; 267 kfree(oc);
321 struct nouveau_gpuobj *gpuobj = NULL;
322 struct list_head *entry, *tmp;
323
324 NV_DEBUG(dev, "\n");
325
326 list_for_each_safe(entry, tmp, &dev_priv->gpuobj_list) {
327 gpuobj = list_entry(entry, struct nouveau_gpuobj, list);
328
329 NV_ERROR(dev, "gpuobj %p still exists at takedown, refs=%d\n",
330 gpuobj, gpuobj->refcount);
331 gpuobj->refcount = 0;
332 nouveau_gpuobj_del(dev, &gpuobj);
333 } 268 }
269
270 BUG_ON(!list_empty(&dev_priv->gpuobj_list));
334} 271}
335 272
336int 273
337nouveau_gpuobj_del(struct drm_device *dev, struct nouveau_gpuobj **pgpuobj) 274static void
275nouveau_gpuobj_del(struct kref *ref)
338{ 276{
277 struct nouveau_gpuobj *gpuobj =
278 container_of(ref, struct nouveau_gpuobj, refcount);
279 struct drm_device *dev = gpuobj->dev;
339 struct drm_nouveau_private *dev_priv = dev->dev_private; 280 struct drm_nouveau_private *dev_priv = dev->dev_private;
340 struct nouveau_engine *engine = &dev_priv->engine; 281 struct nouveau_instmem_engine *instmem = &dev_priv->engine.instmem;
341 struct nouveau_gpuobj *gpuobj;
342 int i; 282 int i;
343 283
344 NV_DEBUG(dev, "gpuobj %p\n", pgpuobj ? *pgpuobj : NULL); 284 NV_DEBUG(dev, "gpuobj %p\n", gpuobj);
345
346 if (!dev_priv || !pgpuobj || !(*pgpuobj))
347 return -EINVAL;
348 gpuobj = *pgpuobj;
349
350 if (gpuobj->refcount != 0) {
351 NV_ERROR(dev, "gpuobj refcount is %d\n", gpuobj->refcount);
352 return -EINVAL;
353 }
354 285
355 if (gpuobj->im_pramin && (gpuobj->flags & NVOBJ_FLAG_ZERO_FREE)) { 286 if (gpuobj->node && (gpuobj->flags & NVOBJ_FLAG_ZERO_FREE)) {
356 for (i = 0; i < gpuobj->im_pramin->size; i += 4) 287 for (i = 0; i < gpuobj->size; i += 4)
357 nv_wo32(dev, gpuobj, i/4, 0); 288 nv_wo32(gpuobj, i, 0);
358 engine->instmem.flush(dev); 289 instmem->flush(dev);
359 } 290 }
360 291
361 if (gpuobj->dtor) 292 if (gpuobj->dtor)
362 gpuobj->dtor(dev, gpuobj); 293 gpuobj->dtor(dev, gpuobj);
363 294
364 if (gpuobj->im_backing && !(gpuobj->flags & NVOBJ_FLAG_FAKE)) 295 if (gpuobj->cinst == NVOBJ_CINST_GLOBAL) {
365 engine->instmem.clear(dev, gpuobj); 296 if (gpuobj->node) {
366 297 instmem->unmap(gpuobj);
367 if (gpuobj->im_pramin) { 298 instmem->put(gpuobj);
368 if (gpuobj->flags & NVOBJ_FLAG_FAKE)
369 kfree(gpuobj->im_pramin);
370 else
371 drm_mm_put_block(gpuobj->im_pramin);
372 }
373
374 list_del(&gpuobj->list);
375
376 *pgpuobj = NULL;
377 kfree(gpuobj);
378 return 0;
379}
380
381static int
382nouveau_gpuobj_instance_get(struct drm_device *dev,
383 struct nouveau_channel *chan,
384 struct nouveau_gpuobj *gpuobj, uint32_t *inst)
385{
386 struct drm_nouveau_private *dev_priv = dev->dev_private;
387 struct nouveau_gpuobj *cpramin;
388
389 /* <NV50 use PRAMIN address everywhere */
390 if (dev_priv->card_type < NV_50) {
391 *inst = gpuobj->im_pramin->start;
392 return 0;
393 }
394
395 if (chan && gpuobj->im_channel != chan) {
396 NV_ERROR(dev, "Channel mismatch: obj %d, ref %d\n",
397 gpuobj->im_channel->id, chan->id);
398 return -EINVAL;
399 }
400
401 /* NV50 channel-local instance */
402 if (chan) {
403 cpramin = chan->ramin->gpuobj;
404 *inst = gpuobj->im_pramin->start - cpramin->im_pramin->start;
405 return 0;
406 }
407
408 /* NV50 global (VRAM) instance */
409 if (!gpuobj->im_channel) {
410 /* ...from global heap */
411 if (!gpuobj->im_backing) {
412 NV_ERROR(dev, "AII, no VRAM backing gpuobj\n");
413 return -EINVAL;
414 } 299 }
415 *inst = gpuobj->im_backing_start;
416 return 0;
417 } else { 300 } else {
418 /* ...from local heap */ 301 if (gpuobj->node) {
419 cpramin = gpuobj->im_channel->ramin->gpuobj; 302 spin_lock(&dev_priv->ramin_lock);
420 *inst = cpramin->im_backing_start + 303 drm_mm_put_block(gpuobj->node);
421 (gpuobj->im_pramin->start - cpramin->im_pramin->start); 304 spin_unlock(&dev_priv->ramin_lock);
422 return 0;
423 }
424
425 return -EINVAL;
426}
427
428int
429nouveau_gpuobj_ref_add(struct drm_device *dev, struct nouveau_channel *chan,
430 uint32_t handle, struct nouveau_gpuobj *gpuobj,
431 struct nouveau_gpuobj_ref **ref_ret)
432{
433 struct drm_nouveau_private *dev_priv = dev->dev_private;
434 struct nouveau_gpuobj_ref *ref;
435 uint32_t instance;
436 int ret;
437
438 NV_DEBUG(dev, "ch%d h=0x%08x gpuobj=%p\n",
439 chan ? chan->id : -1, handle, gpuobj);
440
441 if (!dev_priv || !gpuobj || (ref_ret && *ref_ret != NULL))
442 return -EINVAL;
443
444 if (!chan && !ref_ret)
445 return -EINVAL;
446
447 if (gpuobj->engine == NVOBJ_ENGINE_SW && !gpuobj->im_pramin) {
448 /* sw object */
449 instance = 0x40;
450 } else {
451 ret = nouveau_gpuobj_instance_get(dev, chan, gpuobj, &instance);
452 if (ret)
453 return ret;
454 }
455
456 ref = kzalloc(sizeof(*ref), GFP_KERNEL);
457 if (!ref)
458 return -ENOMEM;
459 INIT_LIST_HEAD(&ref->list);
460 ref->gpuobj = gpuobj;
461 ref->channel = chan;
462 ref->instance = instance;
463
464 if (!ref_ret) {
465 ref->handle = handle;
466
467 ret = nouveau_ramht_insert(dev, ref);
468 if (ret) {
469 kfree(ref);
470 return ret;
471 }
472 } else {
473 ref->handle = ~0;
474 *ref_ret = ref;
475 }
476
477 ref->gpuobj->refcount++;
478 return 0;
479}
480
481int nouveau_gpuobj_ref_del(struct drm_device *dev, struct nouveau_gpuobj_ref **pref)
482{
483 struct nouveau_gpuobj_ref *ref;
484
485 NV_DEBUG(dev, "ref %p\n", pref ? *pref : NULL);
486
487 if (!dev || !pref || *pref == NULL)
488 return -EINVAL;
489 ref = *pref;
490
491 if (ref->handle != ~0)
492 nouveau_ramht_remove(dev, ref);
493
494 if (ref->gpuobj) {
495 ref->gpuobj->refcount--;
496
497 if (ref->gpuobj->refcount == 0) {
498 if (!(ref->gpuobj->flags & NVOBJ_FLAG_ALLOW_NO_REFS))
499 nouveau_gpuobj_del(dev, &ref->gpuobj);
500 } 305 }
501 } 306 }
502 307
503 *pref = NULL; 308 spin_lock(&dev_priv->ramin_lock);
504 kfree(ref); 309 list_del(&gpuobj->list);
505 return 0; 310 spin_unlock(&dev_priv->ramin_lock);
506}
507
508int
509nouveau_gpuobj_new_ref(struct drm_device *dev,
510 struct nouveau_channel *oc, struct nouveau_channel *rc,
511 uint32_t handle, uint32_t size, int align,
512 uint32_t flags, struct nouveau_gpuobj_ref **ref)
513{
514 struct nouveau_gpuobj *gpuobj = NULL;
515 int ret;
516
517 ret = nouveau_gpuobj_new(dev, oc, size, align, flags, &gpuobj);
518 if (ret)
519 return ret;
520
521 ret = nouveau_gpuobj_ref_add(dev, rc, handle, gpuobj, ref);
522 if (ret) {
523 nouveau_gpuobj_del(dev, &gpuobj);
524 return ret;
525 }
526 311
527 return 0; 312 kfree(gpuobj);
528} 313}
529 314
530int 315void
531nouveau_gpuobj_ref_find(struct nouveau_channel *chan, uint32_t handle, 316nouveau_gpuobj_ref(struct nouveau_gpuobj *ref, struct nouveau_gpuobj **ptr)
532 struct nouveau_gpuobj_ref **ref_ret)
533{ 317{
534 struct nouveau_gpuobj_ref *ref; 318 if (ref)
535 struct list_head *entry, *tmp; 319 kref_get(&ref->refcount);
536
537 list_for_each_safe(entry, tmp, &chan->ramht_refs) {
538 ref = list_entry(entry, struct nouveau_gpuobj_ref, list);
539 320
540 if (ref->handle == handle) { 321 if (*ptr)
541 if (ref_ret) 322 kref_put(&(*ptr)->refcount, nouveau_gpuobj_del);
542 *ref_ret = ref;
543 return 0;
544 }
545 }
546 323
547 return -EINVAL; 324 *ptr = ref;
548} 325}
549 326
550int 327int
551nouveau_gpuobj_new_fake(struct drm_device *dev, uint32_t p_offset, 328nouveau_gpuobj_new_fake(struct drm_device *dev, u32 pinst, u64 vinst,
552 uint32_t b_offset, uint32_t size, 329 u32 size, u32 flags, struct nouveau_gpuobj **pgpuobj)
553 uint32_t flags, struct nouveau_gpuobj **pgpuobj,
554 struct nouveau_gpuobj_ref **pref)
555{ 330{
556 struct drm_nouveau_private *dev_priv = dev->dev_private; 331 struct drm_nouveau_private *dev_priv = dev->dev_private;
557 struct nouveau_gpuobj *gpuobj = NULL; 332 struct nouveau_gpuobj *gpuobj = NULL;
558 int i; 333 int i;
559 334
560 NV_DEBUG(dev, 335 NV_DEBUG(dev,
561 "p_offset=0x%08x b_offset=0x%08x size=0x%08x flags=0x%08x\n", 336 "pinst=0x%08x vinst=0x%010llx size=0x%08x flags=0x%08x\n",
562 p_offset, b_offset, size, flags); 337 pinst, vinst, size, flags);
563 338
564 gpuobj = kzalloc(sizeof(*gpuobj), GFP_KERNEL); 339 gpuobj = kzalloc(sizeof(*gpuobj), GFP_KERNEL);
565 if (!gpuobj) 340 if (!gpuobj)
566 return -ENOMEM; 341 return -ENOMEM;
567 NV_DEBUG(dev, "gpuobj %p\n", gpuobj); 342 NV_DEBUG(dev, "gpuobj %p\n", gpuobj);
568 gpuobj->im_channel = NULL; 343 gpuobj->dev = dev;
569 gpuobj->flags = flags | NVOBJ_FLAG_FAKE; 344 gpuobj->flags = flags;
570 345 kref_init(&gpuobj->refcount);
571 list_add_tail(&gpuobj->list, &dev_priv->gpuobj_list); 346 gpuobj->size = size;
572 347 gpuobj->pinst = pinst;
573 if (p_offset != ~0) { 348 gpuobj->cinst = NVOBJ_CINST_GLOBAL;
574 gpuobj->im_pramin = kzalloc(sizeof(struct drm_mm_node), 349 gpuobj->vinst = vinst;
575 GFP_KERNEL);
576 if (!gpuobj->im_pramin) {
577 nouveau_gpuobj_del(dev, &gpuobj);
578 return -ENOMEM;
579 }
580 gpuobj->im_pramin->start = p_offset;
581 gpuobj->im_pramin->size = size;
582 }
583
584 if (b_offset != ~0) {
585 gpuobj->im_backing = (struct nouveau_bo *)-1;
586 gpuobj->im_backing_start = b_offset;
587 }
588 350
589 if (gpuobj->flags & NVOBJ_FLAG_ZERO_ALLOC) { 351 if (gpuobj->flags & NVOBJ_FLAG_ZERO_ALLOC) {
590 for (i = 0; i < gpuobj->im_pramin->size; i += 4) 352 for (i = 0; i < gpuobj->size; i += 4)
591 nv_wo32(dev, gpuobj, i/4, 0); 353 nv_wo32(gpuobj, i, 0);
592 dev_priv->engine.instmem.flush(dev); 354 dev_priv->engine.instmem.flush(dev);
593 } 355 }
594 356
595 if (pref) { 357 spin_lock(&dev_priv->ramin_lock);
596 i = nouveau_gpuobj_ref_add(dev, NULL, 0, gpuobj, pref); 358 list_add_tail(&gpuobj->list, &dev_priv->gpuobj_list);
597 if (i) { 359 spin_unlock(&dev_priv->ramin_lock);
598 nouveau_gpuobj_del(dev, &gpuobj); 360 *pgpuobj = gpuobj;
599 return i;
600 }
601 }
602
603 if (pgpuobj)
604 *pgpuobj = gpuobj;
605 return 0; 361 return 0;
606} 362}
607 363
608
609static uint32_t
610nouveau_gpuobj_class_instmem_size(struct drm_device *dev, int class)
611{
612 struct drm_nouveau_private *dev_priv = dev->dev_private;
613
614 /*XXX: dodgy hack for now */
615 if (dev_priv->card_type >= NV_50)
616 return 24;
617 if (dev_priv->card_type >= NV_40)
618 return 32;
619 return 16;
620}
621
622/* 364/*
623 DMA objects are used to reference a piece of memory in the 365 DMA objects are used to reference a piece of memory in the
624 framebuffer, PCI or AGP address space. Each object is 16 bytes big 366 framebuffer, PCI or AGP address space. Each object is 16 bytes big
@@ -646,115 +388,156 @@ nouveau_gpuobj_class_instmem_size(struct drm_device *dev, int class)
646 The method below creates a DMA object in instance RAM and returns a handle 388 The method below creates a DMA object in instance RAM and returns a handle
647 to it that can be used to set up context objects. 389 to it that can be used to set up context objects.
648*/ 390*/
649int 391
650nouveau_gpuobj_dma_new(struct nouveau_channel *chan, int class, 392void
651 uint64_t offset, uint64_t size, int access, 393nv50_gpuobj_dma_init(struct nouveau_gpuobj *obj, u32 offset, int class,
652 int target, struct nouveau_gpuobj **gpuobj) 394 u64 base, u64 size, int target, int access,
395 u32 type, u32 comp)
653{ 396{
654 struct drm_device *dev = chan->dev; 397 struct drm_nouveau_private *dev_priv = obj->dev->dev_private;
655 struct drm_nouveau_private *dev_priv = dev->dev_private; 398 struct nouveau_instmem_engine *pinstmem = &dev_priv->engine.instmem;
656 struct nouveau_instmem_engine *instmem = &dev_priv->engine.instmem; 399 u32 flags0;
657 int ret;
658 400
659 NV_DEBUG(dev, "ch%d class=0x%04x offset=0x%llx size=0x%llx\n", 401 flags0 = (comp << 29) | (type << 22) | class;
660 chan->id, class, offset, size); 402 flags0 |= 0x00100000;
661 NV_DEBUG(dev, "access=%d target=%d\n", access, target); 403
404 switch (access) {
405 case NV_MEM_ACCESS_RO: flags0 |= 0x00040000; break;
406 case NV_MEM_ACCESS_RW:
407 case NV_MEM_ACCESS_WO: flags0 |= 0x00080000; break;
408 default:
409 break;
410 }
662 411
663 switch (target) { 412 switch (target) {
664 case NV_DMA_TARGET_AGP: 413 case NV_MEM_TARGET_VRAM:
665 offset += dev_priv->gart_info.aper_base; 414 flags0 |= 0x00010000;
415 break;
416 case NV_MEM_TARGET_PCI:
417 flags0 |= 0x00020000;
666 break; 418 break;
419 case NV_MEM_TARGET_PCI_NOSNOOP:
420 flags0 |= 0x00030000;
421 break;
422 case NV_MEM_TARGET_GART:
423 base += dev_priv->gart_info.aper_base;
667 default: 424 default:
425 flags0 &= ~0x00100000;
668 break; 426 break;
669 } 427 }
670 428
671 ret = nouveau_gpuobj_new(dev, chan, 429 /* convert to base + limit */
672 nouveau_gpuobj_class_instmem_size(dev, class), 430 size = (base + size) - 1;
673 16, NVOBJ_FLAG_ZERO_ALLOC |
674 NVOBJ_FLAG_ZERO_FREE, gpuobj);
675 if (ret) {
676 NV_ERROR(dev, "Error creating gpuobj: %d\n", ret);
677 return ret;
678 }
679 431
680 if (dev_priv->card_type < NV_50) { 432 nv_wo32(obj, offset + 0x00, flags0);
681 uint32_t frame, adjust, pte_flags = 0; 433 nv_wo32(obj, offset + 0x04, lower_32_bits(size));
682 434 nv_wo32(obj, offset + 0x08, lower_32_bits(base));
683 if (access != NV_DMA_ACCESS_RO) 435 nv_wo32(obj, offset + 0x0c, upper_32_bits(size) << 24 |
684 pte_flags |= (1<<1); 436 upper_32_bits(base));
685 adjust = offset & 0x00000fff; 437 nv_wo32(obj, offset + 0x10, 0x00000000);
686 frame = offset & ~0x00000fff; 438 nv_wo32(obj, offset + 0x14, 0x00000000);
687
688 nv_wo32(dev, *gpuobj, 0, ((1<<12) | (1<<13) |
689 (adjust << 20) |
690 (access << 14) |
691 (target << 16) |
692 class));
693 nv_wo32(dev, *gpuobj, 1, size - 1);
694 nv_wo32(dev, *gpuobj, 2, frame | pte_flags);
695 nv_wo32(dev, *gpuobj, 3, frame | pte_flags);
696 } else {
697 uint64_t limit = offset + size - 1;
698 uint32_t flags0, flags5;
699 439
700 if (target == NV_DMA_TARGET_VIDMEM) { 440 pinstmem->flush(obj->dev);
701 flags0 = 0x00190000; 441}
702 flags5 = 0x00010000;
703 } else {
704 flags0 = 0x7fc00000;
705 flags5 = 0x00080000;
706 }
707 442
708 nv_wo32(dev, *gpuobj, 0, flags0 | class); 443int
709 nv_wo32(dev, *gpuobj, 1, lower_32_bits(limit)); 444nv50_gpuobj_dma_new(struct nouveau_channel *chan, int class, u64 base, u64 size,
710 nv_wo32(dev, *gpuobj, 2, lower_32_bits(offset)); 445 int target, int access, u32 type, u32 comp,
711 nv_wo32(dev, *gpuobj, 3, ((upper_32_bits(limit) & 0xff) << 24) | 446 struct nouveau_gpuobj **pobj)
712 (upper_32_bits(offset) & 0xff)); 447{
713 nv_wo32(dev, *gpuobj, 5, flags5); 448 struct drm_device *dev = chan->dev;
714 } 449 int ret;
715 450
716 instmem->flush(dev); 451 ret = nouveau_gpuobj_new(dev, chan, 24, 16, NVOBJ_FLAG_ZERO_FREE, pobj);
452 if (ret)
453 return ret;
717 454
718 (*gpuobj)->engine = NVOBJ_ENGINE_SW; 455 nv50_gpuobj_dma_init(*pobj, 0, class, base, size, target,
719 (*gpuobj)->class = class; 456 access, type, comp);
720 return 0; 457 return 0;
721} 458}
722 459
723int 460int
724nouveau_gpuobj_gart_dma_new(struct nouveau_channel *chan, 461nouveau_gpuobj_dma_new(struct nouveau_channel *chan, int class, u64 base,
725 uint64_t offset, uint64_t size, int access, 462 u64 size, int access, int target,
726 struct nouveau_gpuobj **gpuobj, 463 struct nouveau_gpuobj **pobj)
727 uint32_t *o_ret)
728{ 464{
465 struct drm_nouveau_private *dev_priv = chan->dev->dev_private;
729 struct drm_device *dev = chan->dev; 466 struct drm_device *dev = chan->dev;
730 struct drm_nouveau_private *dev_priv = dev->dev_private; 467 struct nouveau_gpuobj *obj;
468 u32 flags0, flags2;
731 int ret; 469 int ret;
732 470
733 if (dev_priv->gart_info.type == NOUVEAU_GART_AGP || 471 if (dev_priv->card_type >= NV_50) {
734 (dev_priv->card_type >= NV_50 && 472 u32 comp = (target == NV_MEM_TARGET_VM) ? NV_MEM_COMP_VM : 0;
735 dev_priv->gart_info.type == NOUVEAU_GART_SGDMA)) { 473 u32 type = (target == NV_MEM_TARGET_VM) ? NV_MEM_TYPE_VM : 0;
736 ret = nouveau_gpuobj_dma_new(chan, NV_CLASS_DMA_IN_MEMORY, 474
737 offset + dev_priv->vm_gart_base, 475 return nv50_gpuobj_dma_new(chan, class, base, size,
738 size, access, NV_DMA_TARGET_AGP, 476 target, access, type, comp, pobj);
739 gpuobj); 477 }
740 if (o_ret) 478
741 *o_ret = 0; 479 if (target == NV_MEM_TARGET_GART) {
742 } else 480 struct nouveau_gpuobj *gart = dev_priv->gart_info.sg_ctxdma;
743 if (dev_priv->gart_info.type == NOUVEAU_GART_SGDMA) { 481
744 *gpuobj = dev_priv->gart_info.sg_ctxdma; 482 if (dev_priv->gart_info.type == NOUVEAU_GART_PDMA) {
745 if (offset & ~0xffffffffULL) { 483 if (base == 0) {
746 NV_ERROR(dev, "obj offset exceeds 32-bits\n"); 484 nouveau_gpuobj_ref(gart, pobj);
747 return -EINVAL; 485 return 0;
486 }
487
488 base = nouveau_sgdma_get_physical(dev, base);
489 target = NV_MEM_TARGET_PCI;
490 } else {
491 base += dev_priv->gart_info.aper_base;
492 if (dev_priv->gart_info.type == NOUVEAU_GART_AGP)
493 target = NV_MEM_TARGET_PCI_NOSNOOP;
494 else
495 target = NV_MEM_TARGET_PCI;
748 } 496 }
749 if (o_ret)
750 *o_ret = (uint32_t)offset;
751 ret = (*gpuobj != NULL) ? 0 : -EINVAL;
752 } else {
753 NV_ERROR(dev, "Invalid GART type %d\n", dev_priv->gart_info.type);
754 return -EINVAL;
755 } 497 }
756 498
757 return ret; 499 flags0 = class;
500 flags0 |= 0x00003000; /* PT present, PT linear */
501 flags2 = 0;
502
503 switch (target) {
504 case NV_MEM_TARGET_PCI:
505 flags0 |= 0x00020000;
506 break;
507 case NV_MEM_TARGET_PCI_NOSNOOP:
508 flags0 |= 0x00030000;
509 break;
510 default:
511 break;
512 }
513
514 switch (access) {
515 case NV_MEM_ACCESS_RO:
516 flags0 |= 0x00004000;
517 break;
518 case NV_MEM_ACCESS_WO:
519 flags0 |= 0x00008000;
520 default:
521 flags2 |= 0x00000002;
522 break;
523 }
524
525 flags0 |= (base & 0x00000fff) << 20;
526 flags2 |= (base & 0xfffff000);
527
528 ret = nouveau_gpuobj_new(dev, chan, 16, 16, NVOBJ_FLAG_ZERO_FREE, &obj);
529 if (ret)
530 return ret;
531
532 nv_wo32(obj, 0x00, flags0);
533 nv_wo32(obj, 0x04, size - 1);
534 nv_wo32(obj, 0x08, flags2);
535 nv_wo32(obj, 0x0c, flags2);
536
537 obj->engine = NVOBJ_ENGINE_SW;
538 obj->class = class;
539 *pobj = obj;
540 return 0;
758} 541}
759 542
760/* Context objects in the instance RAM have the following structure. 543/* Context objects in the instance RAM have the following structure.
@@ -808,77 +591,61 @@ nouveau_gpuobj_gart_dma_new(struct nouveau_channel *chan,
808 entry[5]: 591 entry[5]:
809 set to 0? 592 set to 0?
810*/ 593*/
811int 594static int
812nouveau_gpuobj_gr_new(struct nouveau_channel *chan, int class, 595nouveau_gpuobj_sw_new(struct nouveau_channel *chan, u32 handle, u16 class)
813 struct nouveau_gpuobj **gpuobj)
814{ 596{
815 struct drm_device *dev = chan->dev; 597 struct drm_nouveau_private *dev_priv = chan->dev->dev_private;
816 struct drm_nouveau_private *dev_priv = dev->dev_private; 598 struct nouveau_gpuobj *gpuobj;
817 int ret; 599 int ret;
818 600
819 NV_DEBUG(dev, "ch%d class=0x%04x\n", chan->id, class); 601 gpuobj = kzalloc(sizeof(*gpuobj), GFP_KERNEL);
820 602 if (!gpuobj)
821 ret = nouveau_gpuobj_new(dev, chan, 603 return -ENOMEM;
822 nouveau_gpuobj_class_instmem_size(dev, class), 604 gpuobj->dev = chan->dev;
823 16, 605 gpuobj->engine = NVOBJ_ENGINE_SW;
824 NVOBJ_FLAG_ZERO_ALLOC | NVOBJ_FLAG_ZERO_FREE, 606 gpuobj->class = class;
825 gpuobj); 607 kref_init(&gpuobj->refcount);
826 if (ret) { 608 gpuobj->cinst = 0x40;
827 NV_ERROR(dev, "Error creating gpuobj: %d\n", ret);
828 return ret;
829 }
830 609
831 if (dev_priv->card_type >= NV_50) { 610 spin_lock(&dev_priv->ramin_lock);
832 nv_wo32(dev, *gpuobj, 0, class); 611 list_add_tail(&gpuobj->list, &dev_priv->gpuobj_list);
833 nv_wo32(dev, *gpuobj, 5, 0x00010000); 612 spin_unlock(&dev_priv->ramin_lock);
834 } else {
835 switch (class) {
836 case NV_CLASS_NULL:
837 nv_wo32(dev, *gpuobj, 0, 0x00001030);
838 nv_wo32(dev, *gpuobj, 1, 0xFFFFFFFF);
839 break;
840 default:
841 if (dev_priv->card_type >= NV_40) {
842 nv_wo32(dev, *gpuobj, 0, class);
843#ifdef __BIG_ENDIAN
844 nv_wo32(dev, *gpuobj, 2, 0x01000000);
845#endif
846 } else {
847#ifdef __BIG_ENDIAN
848 nv_wo32(dev, *gpuobj, 0, class | 0x00080000);
849#else
850 nv_wo32(dev, *gpuobj, 0, class);
851#endif
852 }
853 }
854 }
855 dev_priv->engine.instmem.flush(dev);
856 613
857 (*gpuobj)->engine = NVOBJ_ENGINE_GR; 614 ret = nouveau_ramht_insert(chan, handle, gpuobj);
858 (*gpuobj)->class = class; 615 nouveau_gpuobj_ref(NULL, &gpuobj);
859 return 0; 616 return ret;
860} 617}
861 618
862int 619int
863nouveau_gpuobj_sw_new(struct nouveau_channel *chan, int class, 620nouveau_gpuobj_gr_new(struct nouveau_channel *chan, u32 handle, int class)
864 struct nouveau_gpuobj **gpuobj_ret)
865{ 621{
866 struct drm_nouveau_private *dev_priv; 622 struct drm_nouveau_private *dev_priv = chan->dev->dev_private;
867 struct nouveau_gpuobj *gpuobj; 623 struct drm_device *dev = chan->dev;
624 struct nouveau_gpuobj_class *oc;
625 int ret;
868 626
869 if (!chan || !gpuobj_ret || *gpuobj_ret != NULL) 627 NV_DEBUG(dev, "ch%d class=0x%04x\n", chan->id, class);
870 return -EINVAL;
871 dev_priv = chan->dev->dev_private;
872 628
873 gpuobj = kzalloc(sizeof(*gpuobj), GFP_KERNEL); 629 list_for_each_entry(oc, &dev_priv->classes, head) {
874 if (!gpuobj) 630 struct nouveau_exec_engine *eng = dev_priv->eng[oc->engine];
875 return -ENOMEM;
876 gpuobj->engine = NVOBJ_ENGINE_SW;
877 gpuobj->class = class;
878 631
879 list_add_tail(&gpuobj->list, &dev_priv->gpuobj_list); 632 if (oc->id != class)
880 *gpuobj_ret = gpuobj; 633 continue;
881 return 0; 634
635 if (oc->engine == NVOBJ_ENGINE_SW)
636 return nouveau_gpuobj_sw_new(chan, handle, class);
637
638 if (!chan->engctx[oc->engine]) {
639 ret = eng->context_new(chan, oc->engine);
640 if (ret)
641 return ret;
642 }
643
644 return eng->object_new(chan, oc->engine, handle, class);
645 }
646
647 NV_ERROR(dev, "illegal object class: 0x%x\n", class);
648 return -EINVAL;
882} 649}
883 650
884static int 651static int
@@ -886,7 +653,6 @@ nouveau_gpuobj_channel_init_pramin(struct nouveau_channel *chan)
886{ 653{
887 struct drm_device *dev = chan->dev; 654 struct drm_device *dev = chan->dev;
888 struct drm_nouveau_private *dev_priv = dev->dev_private; 655 struct drm_nouveau_private *dev_priv = dev->dev_private;
889 struct nouveau_gpuobj *pramin = NULL;
890 uint32_t size; 656 uint32_t size;
891 uint32_t base; 657 uint32_t base;
892 int ret; 658 int ret;
@@ -894,12 +660,9 @@ nouveau_gpuobj_channel_init_pramin(struct nouveau_channel *chan)
894 NV_DEBUG(dev, "ch%d\n", chan->id); 660 NV_DEBUG(dev, "ch%d\n", chan->id);
895 661
896 /* Base amount for object storage (4KiB enough?) */ 662 /* Base amount for object storage (4KiB enough?) */
897 size = 0x1000; 663 size = 0x2000;
898 base = 0; 664 base = 0;
899 665
900 /* PGRAPH context */
901 size += dev_priv->engine.graph.grctx_size;
902
903 if (dev_priv->card_type == NV_50) { 666 if (dev_priv->card_type == NV_50) {
904 /* Various fixed table thingos */ 667 /* Various fixed table thingos */
905 size += 0x1400; /* mostly unknown stuff */ 668 size += 0x1400; /* mostly unknown stuff */
@@ -911,18 +674,16 @@ nouveau_gpuobj_channel_init_pramin(struct nouveau_channel *chan)
911 size += 0x1000; 674 size += 0x1000;
912 } 675 }
913 676
914 ret = nouveau_gpuobj_new_ref(dev, NULL, NULL, 0, size, 0x1000, 0, 677 ret = nouveau_gpuobj_new(dev, NULL, size, 0x1000, 0, &chan->ramin);
915 &chan->ramin);
916 if (ret) { 678 if (ret) {
917 NV_ERROR(dev, "Error allocating channel PRAMIN: %d\n", ret); 679 NV_ERROR(dev, "Error allocating channel PRAMIN: %d\n", ret);
918 return ret; 680 return ret;
919 } 681 }
920 pramin = chan->ramin->gpuobj;
921 682
922 ret = drm_mm_init(&chan->ramin_heap, pramin->im_pramin->start + base, size); 683 ret = drm_mm_init(&chan->ramin_heap, base, size);
923 if (ret) { 684 if (ret) {
924 NV_ERROR(dev, "Error creating PRAMIN heap: %d\n", ret); 685 NV_ERROR(dev, "Error creating PRAMIN heap: %d\n", ret);
925 nouveau_gpuobj_ref_del(dev, &chan->ramin); 686 nouveau_gpuobj_ref(NULL, &chan->ramin);
926 return ret; 687 return ret;
927 } 688 }
928 689
@@ -935,14 +696,30 @@ nouveau_gpuobj_channel_init(struct nouveau_channel *chan,
935{ 696{
936 struct drm_device *dev = chan->dev; 697 struct drm_device *dev = chan->dev;
937 struct drm_nouveau_private *dev_priv = dev->dev_private; 698 struct drm_nouveau_private *dev_priv = dev->dev_private;
938 struct nouveau_instmem_engine *instmem = &dev_priv->engine.instmem;
939 struct nouveau_gpuobj *vram = NULL, *tt = NULL; 699 struct nouveau_gpuobj *vram = NULL, *tt = NULL;
940 int ret, i; 700 int ret, i;
941 701
942 INIT_LIST_HEAD(&chan->ramht_refs);
943
944 NV_DEBUG(dev, "ch%d vram=0x%08x tt=0x%08x\n", chan->id, vram_h, tt_h); 702 NV_DEBUG(dev, "ch%d vram=0x%08x tt=0x%08x\n", chan->id, vram_h, tt_h);
945 703
704 if (dev_priv->card_type == NV_C0) {
705 struct nouveau_vm *vm = dev_priv->chan_vm;
706 struct nouveau_vm_pgd *vpgd;
707
708 ret = nouveau_gpuobj_new(dev, NULL, 4096, 0x1000, 0,
709 &chan->ramin);
710 if (ret)
711 return ret;
712
713 nouveau_vm_ref(vm, &chan->vm, NULL);
714
715 vpgd = list_first_entry(&vm->pgd_list, struct nouveau_vm_pgd, head);
716 nv_wo32(chan->ramin, 0x0200, lower_32_bits(vpgd->obj->vinst));
717 nv_wo32(chan->ramin, 0x0204, upper_32_bits(vpgd->obj->vinst));
718 nv_wo32(chan->ramin, 0x0208, 0xffffffff);
719 nv_wo32(chan->ramin, 0x020c, 0x000000ff);
720 return 0;
721 }
722
946 /* Allocate a chunk of memory for per-channel object storage */ 723 /* Allocate a chunk of memory for per-channel object storage */
947 ret = nouveau_gpuobj_channel_init_pramin(chan); 724 ret = nouveau_gpuobj_channel_init_pramin(chan);
948 if (ret) { 725 if (ret) {
@@ -952,103 +729,97 @@ nouveau_gpuobj_channel_init(struct nouveau_channel *chan,
952 729
953 /* NV50 VM 730 /* NV50 VM
954 * - Allocate per-channel page-directory 731 * - Allocate per-channel page-directory
955 * - Map GART and VRAM into the channel's address space at the 732 * - Link with shared channel VM
956 * locations determined during init.
957 */ 733 */
958 if (dev_priv->card_type >= NV_50) { 734 if (dev_priv->chan_vm) {
959 uint32_t vm_offset, pde; 735 u32 pgd_offs = (dev_priv->chipset == 0x50) ? 0x1400 : 0x0200;
736 u64 vm_vinst = chan->ramin->vinst + pgd_offs;
737 u32 vm_pinst = chan->ramin->pinst;
960 738
961 vm_offset = (dev_priv->chipset & 0xf0) == 0x50 ? 0x1400 : 0x200; 739 if (vm_pinst != ~0)
962 vm_offset += chan->ramin->gpuobj->im_pramin->start; 740 vm_pinst += pgd_offs;
963 741
964 ret = nouveau_gpuobj_new_fake(dev, vm_offset, ~0, 0x4000, 742 ret = nouveau_gpuobj_new_fake(dev, vm_pinst, vm_vinst, 0x4000,
965 0, &chan->vm_pd, NULL); 743 0, &chan->vm_pd);
966 if (ret) 744 if (ret)
967 return ret; 745 return ret;
968 for (i = 0; i < 0x4000; i += 8) {
969 nv_wo32(dev, chan->vm_pd, (i+0)/4, 0x00000000);
970 nv_wo32(dev, chan->vm_pd, (i+4)/4, 0xdeadcafe);
971 }
972 746
973 pde = (dev_priv->vm_gart_base / (512*1024*1024)) * 2; 747 nouveau_vm_ref(dev_priv->chan_vm, &chan->vm, chan->vm_pd);
974 ret = nouveau_gpuobj_ref_add(dev, NULL, 0,
975 dev_priv->gart_info.sg_ctxdma,
976 &chan->vm_gart_pt);
977 if (ret)
978 return ret;
979 nv_wo32(dev, chan->vm_pd, pde++,
980 chan->vm_gart_pt->instance | 0x03);
981 nv_wo32(dev, chan->vm_pd, pde++, 0x00000000);
982
983 pde = (dev_priv->vm_vram_base / (512*1024*1024)) * 2;
984 for (i = 0; i < dev_priv->vm_vram_pt_nr; i++) {
985 ret = nouveau_gpuobj_ref_add(dev, NULL, 0,
986 dev_priv->vm_vram_pt[i],
987 &chan->vm_vram_pt[i]);
988 if (ret)
989 return ret;
990
991 nv_wo32(dev, chan->vm_pd, pde++,
992 chan->vm_vram_pt[i]->instance | 0x61);
993 nv_wo32(dev, chan->vm_pd, pde++, 0x00000000);
994 }
995
996 instmem->flush(dev);
997 } 748 }
998 749
999 /* RAMHT */ 750 /* RAMHT */
1000 if (dev_priv->card_type < NV_50) { 751 if (dev_priv->card_type < NV_50) {
1001 ret = nouveau_gpuobj_ref_add(dev, NULL, 0, dev_priv->ramht, 752 nouveau_ramht_ref(dev_priv->ramht, &chan->ramht, NULL);
1002 &chan->ramht); 753 } else {
754 struct nouveau_gpuobj *ramht = NULL;
755
756 ret = nouveau_gpuobj_new(dev, chan, 0x8000, 16,
757 NVOBJ_FLAG_ZERO_ALLOC, &ramht);
1003 if (ret) 758 if (ret)
1004 return ret; 759 return ret;
1005 } else { 760
1006 ret = nouveau_gpuobj_new_ref(dev, chan, chan, 0, 761 ret = nouveau_ramht_new(dev, ramht, &chan->ramht);
1007 0x8000, 16, 762 nouveau_gpuobj_ref(NULL, &ramht);
1008 NVOBJ_FLAG_ZERO_ALLOC,
1009 &chan->ramht);
1010 if (ret) 763 if (ret)
1011 return ret; 764 return ret;
765
766 /* dma objects for display sync channel semaphore blocks */
767 for (i = 0; i < 2; i++) {
768 struct nouveau_gpuobj *sem = NULL;
769 struct nv50_display_crtc *dispc =
770 &nv50_display(dev)->crtc[i];
771 u64 offset = dispc->sem.bo->bo.mem.start << PAGE_SHIFT;
772
773 ret = nouveau_gpuobj_dma_new(chan, 0x3d, offset, 0xfff,
774 NV_MEM_ACCESS_RW,
775 NV_MEM_TARGET_VRAM, &sem);
776 if (ret)
777 return ret;
778
779 ret = nouveau_ramht_insert(chan, NvEvoSema0 + i, sem);
780 nouveau_gpuobj_ref(NULL, &sem);
781 if (ret)
782 return ret;
783 }
1012 } 784 }
1013 785
1014 /* VRAM ctxdma */ 786 /* VRAM ctxdma */
1015 if (dev_priv->card_type >= NV_50) { 787 if (dev_priv->card_type >= NV_50) {
1016 ret = nouveau_gpuobj_dma_new(chan, NV_CLASS_DMA_IN_MEMORY, 788 ret = nouveau_gpuobj_dma_new(chan, NV_CLASS_DMA_IN_MEMORY,
1017 0, dev_priv->vm_end, 789 0, (1ULL << 40), NV_MEM_ACCESS_RW,
1018 NV_DMA_ACCESS_RW, 790 NV_MEM_TARGET_VM, &vram);
1019 NV_DMA_TARGET_AGP, &vram);
1020 if (ret) { 791 if (ret) {
1021 NV_ERROR(dev, "Error creating VRAM ctxdma: %d\n", ret); 792 NV_ERROR(dev, "Error creating VRAM ctxdma: %d\n", ret);
1022 return ret; 793 return ret;
1023 } 794 }
1024 } else { 795 } else {
1025 ret = nouveau_gpuobj_dma_new(chan, NV_CLASS_DMA_IN_MEMORY, 796 ret = nouveau_gpuobj_dma_new(chan, NV_CLASS_DMA_IN_MEMORY,
1026 0, dev_priv->fb_available_size, 797 0, dev_priv->fb_available_size,
1027 NV_DMA_ACCESS_RW, 798 NV_MEM_ACCESS_RW,
1028 NV_DMA_TARGET_VIDMEM, &vram); 799 NV_MEM_TARGET_VRAM, &vram);
1029 if (ret) { 800 if (ret) {
1030 NV_ERROR(dev, "Error creating VRAM ctxdma: %d\n", ret); 801 NV_ERROR(dev, "Error creating VRAM ctxdma: %d\n", ret);
1031 return ret; 802 return ret;
1032 } 803 }
1033 } 804 }
1034 805
1035 ret = nouveau_gpuobj_ref_add(dev, chan, vram_h, vram, NULL); 806 ret = nouveau_ramht_insert(chan, vram_h, vram);
807 nouveau_gpuobj_ref(NULL, &vram);
1036 if (ret) { 808 if (ret) {
1037 NV_ERROR(dev, "Error referencing VRAM ctxdma: %d\n", ret); 809 NV_ERROR(dev, "Error adding VRAM ctxdma to RAMHT: %d\n", ret);
1038 return ret; 810 return ret;
1039 } 811 }
1040 812
1041 /* TT memory ctxdma */ 813 /* TT memory ctxdma */
1042 if (dev_priv->card_type >= NV_50) { 814 if (dev_priv->card_type >= NV_50) {
1043 tt = vram; 815 ret = nouveau_gpuobj_dma_new(chan, NV_CLASS_DMA_IN_MEMORY,
1044 } else 816 0, (1ULL << 40), NV_MEM_ACCESS_RW,
1045 if (dev_priv->gart_info.type != NOUVEAU_GART_NONE) { 817 NV_MEM_TARGET_VM, &tt);
1046 ret = nouveau_gpuobj_gart_dma_new(chan, 0,
1047 dev_priv->gart_info.aper_size,
1048 NV_DMA_ACCESS_RW, &tt, NULL);
1049 } else { 818 } else {
1050 NV_ERROR(dev, "Invalid GART type %d\n", dev_priv->gart_info.type); 819 ret = nouveau_gpuobj_dma_new(chan, NV_CLASS_DMA_IN_MEMORY,
1051 ret = -EINVAL; 820 0, dev_priv->gart_info.aper_size,
821 NV_MEM_ACCESS_RW,
822 NV_MEM_TARGET_GART, &tt);
1052 } 823 }
1053 824
1054 if (ret) { 825 if (ret) {
@@ -1056,9 +827,10 @@ nouveau_gpuobj_channel_init(struct nouveau_channel *chan,
1056 return ret; 827 return ret;
1057 } 828 }
1058 829
1059 ret = nouveau_gpuobj_ref_add(dev, chan, tt_h, tt, NULL); 830 ret = nouveau_ramht_insert(chan, tt_h, tt);
831 nouveau_gpuobj_ref(NULL, &tt);
1060 if (ret) { 832 if (ret) {
1061 NV_ERROR(dev, "Error referencing TT ctxdma: %d\n", ret); 833 NV_ERROR(dev, "Error adding TT ctxdma to RAMHT: %d\n", ret);
1062 return ret; 834 return ret;
1063 } 835 }
1064 836
@@ -1068,35 +840,18 @@ nouveau_gpuobj_channel_init(struct nouveau_channel *chan,
1068void 840void
1069nouveau_gpuobj_channel_takedown(struct nouveau_channel *chan) 841nouveau_gpuobj_channel_takedown(struct nouveau_channel *chan)
1070{ 842{
1071 struct drm_nouveau_private *dev_priv = chan->dev->dev_private;
1072 struct drm_device *dev = chan->dev; 843 struct drm_device *dev = chan->dev;
1073 struct list_head *entry, *tmp;
1074 struct nouveau_gpuobj_ref *ref;
1075 int i;
1076 844
1077 NV_DEBUG(dev, "ch%d\n", chan->id); 845 NV_DEBUG(dev, "ch%d\n", chan->id);
1078 846
1079 if (!chan->ramht_refs.next) 847 nouveau_ramht_ref(NULL, &chan->ramht, chan);
1080 return;
1081
1082 list_for_each_safe(entry, tmp, &chan->ramht_refs) {
1083 ref = list_entry(entry, struct nouveau_gpuobj_ref, list);
1084
1085 nouveau_gpuobj_ref_del(dev, &ref);
1086 }
1087 848
1088 nouveau_gpuobj_ref_del(dev, &chan->ramht); 849 nouveau_vm_ref(NULL, &chan->vm, chan->vm_pd);
850 nouveau_gpuobj_ref(NULL, &chan->vm_pd);
1089 851
1090 nouveau_gpuobj_del(dev, &chan->vm_pd); 852 if (drm_mm_initialized(&chan->ramin_heap))
1091 nouveau_gpuobj_ref_del(dev, &chan->vm_gart_pt);
1092 for (i = 0; i < dev_priv->vm_vram_pt_nr; i++)
1093 nouveau_gpuobj_ref_del(dev, &chan->vm_vram_pt[i]);
1094
1095 if (chan->ramin_heap.free_stack.next)
1096 drm_mm_takedown(&chan->ramin_heap); 853 drm_mm_takedown(&chan->ramin_heap);
1097 if (chan->ramin) 854 nouveau_gpuobj_ref(NULL, &chan->ramin);
1098 nouveau_gpuobj_ref_del(dev, &chan->ramin);
1099
1100} 855}
1101 856
1102int 857int
@@ -1106,147 +861,138 @@ nouveau_gpuobj_suspend(struct drm_device *dev)
1106 struct nouveau_gpuobj *gpuobj; 861 struct nouveau_gpuobj *gpuobj;
1107 int i; 862 int i;
1108 863
1109 if (dev_priv->card_type < NV_50) {
1110 dev_priv->susres.ramin_copy = vmalloc(dev_priv->ramin_rsvd_vram);
1111 if (!dev_priv->susres.ramin_copy)
1112 return -ENOMEM;
1113
1114 for (i = 0; i < dev_priv->ramin_rsvd_vram; i += 4)
1115 dev_priv->susres.ramin_copy[i/4] = nv_ri32(dev, i);
1116 return 0;
1117 }
1118
1119 list_for_each_entry(gpuobj, &dev_priv->gpuobj_list, list) { 864 list_for_each_entry(gpuobj, &dev_priv->gpuobj_list, list) {
1120 if (!gpuobj->im_backing || (gpuobj->flags & NVOBJ_FLAG_FAKE)) 865 if (gpuobj->cinst != NVOBJ_CINST_GLOBAL)
1121 continue; 866 continue;
1122 867
1123 gpuobj->im_backing_suspend = vmalloc(gpuobj->im_pramin->size); 868 gpuobj->suspend = vmalloc(gpuobj->size);
1124 if (!gpuobj->im_backing_suspend) { 869 if (!gpuobj->suspend) {
1125 nouveau_gpuobj_resume(dev); 870 nouveau_gpuobj_resume(dev);
1126 return -ENOMEM; 871 return -ENOMEM;
1127 } 872 }
1128 873
1129 for (i = 0; i < gpuobj->im_pramin->size / 4; i++) 874 for (i = 0; i < gpuobj->size; i += 4)
1130 gpuobj->im_backing_suspend[i] = nv_ro32(dev, gpuobj, i); 875 gpuobj->suspend[i/4] = nv_ro32(gpuobj, i);
1131 } 876 }
1132 877
1133 return 0; 878 return 0;
1134} 879}
1135 880
1136void 881void
1137nouveau_gpuobj_suspend_cleanup(struct drm_device *dev)
1138{
1139 struct drm_nouveau_private *dev_priv = dev->dev_private;
1140 struct nouveau_gpuobj *gpuobj;
1141
1142 if (dev_priv->card_type < NV_50) {
1143 vfree(dev_priv->susres.ramin_copy);
1144 dev_priv->susres.ramin_copy = NULL;
1145 return;
1146 }
1147
1148 list_for_each_entry(gpuobj, &dev_priv->gpuobj_list, list) {
1149 if (!gpuobj->im_backing_suspend)
1150 continue;
1151
1152 vfree(gpuobj->im_backing_suspend);
1153 gpuobj->im_backing_suspend = NULL;
1154 }
1155}
1156
1157void
1158nouveau_gpuobj_resume(struct drm_device *dev) 882nouveau_gpuobj_resume(struct drm_device *dev)
1159{ 883{
1160 struct drm_nouveau_private *dev_priv = dev->dev_private; 884 struct drm_nouveau_private *dev_priv = dev->dev_private;
1161 struct nouveau_gpuobj *gpuobj; 885 struct nouveau_gpuobj *gpuobj;
1162 int i; 886 int i;
1163 887
1164 if (dev_priv->card_type < NV_50) {
1165 for (i = 0; i < dev_priv->ramin_rsvd_vram; i += 4)
1166 nv_wi32(dev, i, dev_priv->susres.ramin_copy[i/4]);
1167 nouveau_gpuobj_suspend_cleanup(dev);
1168 return;
1169 }
1170
1171 list_for_each_entry(gpuobj, &dev_priv->gpuobj_list, list) { 888 list_for_each_entry(gpuobj, &dev_priv->gpuobj_list, list) {
1172 if (!gpuobj->im_backing_suspend) 889 if (!gpuobj->suspend)
1173 continue; 890 continue;
1174 891
1175 for (i = 0; i < gpuobj->im_pramin->size / 4; i++) 892 for (i = 0; i < gpuobj->size; i += 4)
1176 nv_wo32(dev, gpuobj, i, gpuobj->im_backing_suspend[i]); 893 nv_wo32(gpuobj, i, gpuobj->suspend[i/4]);
1177 dev_priv->engine.instmem.flush(dev); 894
895 vfree(gpuobj->suspend);
896 gpuobj->suspend = NULL;
1178 } 897 }
1179 898
1180 nouveau_gpuobj_suspend_cleanup(dev); 899 dev_priv->engine.instmem.flush(dev);
1181} 900}
1182 901
1183int nouveau_ioctl_grobj_alloc(struct drm_device *dev, void *data, 902int nouveau_ioctl_grobj_alloc(struct drm_device *dev, void *data,
1184 struct drm_file *file_priv) 903 struct drm_file *file_priv)
1185{ 904{
1186 struct drm_nouveau_private *dev_priv = dev->dev_private;
1187 struct drm_nouveau_grobj_alloc *init = data; 905 struct drm_nouveau_grobj_alloc *init = data;
1188 struct nouveau_pgraph_engine *pgraph = &dev_priv->engine.graph;
1189 struct nouveau_pgraph_object_class *grc;
1190 struct nouveau_gpuobj *gr = NULL;
1191 struct nouveau_channel *chan; 906 struct nouveau_channel *chan;
1192 int ret; 907 int ret;
1193 908
1194 NOUVEAU_GET_USER_CHANNEL_WITH_RETURN(init->channel, file_priv, chan);
1195
1196 if (init->handle == ~0) 909 if (init->handle == ~0)
1197 return -EINVAL; 910 return -EINVAL;
1198 911
1199 grc = pgraph->grclass; 912 chan = nouveau_channel_get(dev, file_priv, init->channel);
1200 while (grc->id) { 913 if (IS_ERR(chan))
1201 if (grc->id == init->class) 914 return PTR_ERR(chan);
1202 break;
1203 grc++;
1204 }
1205 915
1206 if (!grc->id) { 916 if (nouveau_ramht_find(chan, init->handle)) {
1207 NV_ERROR(dev, "Illegal object class: 0x%x\n", init->class); 917 ret = -EEXIST;
1208 return -EPERM; 918 goto out;
1209 } 919 }
1210 920
1211 if (nouveau_gpuobj_ref_find(chan, init->handle, NULL) == 0) 921 ret = nouveau_gpuobj_gr_new(chan, init->handle, init->class);
1212 return -EEXIST;
1213
1214 if (!grc->software)
1215 ret = nouveau_gpuobj_gr_new(chan, grc->id, &gr);
1216 else
1217 ret = nouveau_gpuobj_sw_new(chan, grc->id, &gr);
1218
1219 if (ret) { 922 if (ret) {
1220 NV_ERROR(dev, "Error creating object: %d (%d/0x%08x)\n", 923 NV_ERROR(dev, "Error creating object: %d (%d/0x%08x)\n",
1221 ret, init->channel, init->handle); 924 ret, init->channel, init->handle);
1222 return ret;
1223 } 925 }
1224 926
1225 ret = nouveau_gpuobj_ref_add(dev, chan, init->handle, gr, NULL); 927out:
1226 if (ret) { 928 nouveau_channel_put(&chan);
1227 NV_ERROR(dev, "Error referencing object: %d (%d/0x%08x)\n", 929 return ret;
1228 ret, init->channel, init->handle);
1229 nouveau_gpuobj_del(dev, &gr);
1230 return ret;
1231 }
1232
1233 return 0;
1234} 930}
1235 931
1236int nouveau_ioctl_gpuobj_free(struct drm_device *dev, void *data, 932int nouveau_ioctl_gpuobj_free(struct drm_device *dev, void *data,
1237 struct drm_file *file_priv) 933 struct drm_file *file_priv)
1238{ 934{
1239 struct drm_nouveau_gpuobj_free *objfree = data; 935 struct drm_nouveau_gpuobj_free *objfree = data;
1240 struct nouveau_gpuobj_ref *ref;
1241 struct nouveau_channel *chan; 936 struct nouveau_channel *chan;
1242 int ret; 937 int ret;
1243 938
1244 NOUVEAU_GET_USER_CHANNEL_WITH_RETURN(objfree->channel, file_priv, chan); 939 chan = nouveau_channel_get(dev, file_priv, objfree->channel);
940 if (IS_ERR(chan))
941 return PTR_ERR(chan);
1245 942
1246 ret = nouveau_gpuobj_ref_find(chan, objfree->handle, &ref); 943 /* Synchronize with the user channel */
1247 if (ret) 944 nouveau_channel_idle(chan);
1248 return ret;
1249 nouveau_gpuobj_ref_del(dev, &ref);
1250 945
1251 return 0; 946 ret = nouveau_ramht_remove(chan, objfree->handle);
947 nouveau_channel_put(&chan);
948 return ret;
949}
950
951u32
952nv_ro32(struct nouveau_gpuobj *gpuobj, u32 offset)
953{
954 struct drm_nouveau_private *dev_priv = gpuobj->dev->dev_private;
955 struct drm_device *dev = gpuobj->dev;
956 unsigned long flags;
957
958 if (gpuobj->pinst == ~0 || !dev_priv->ramin_available) {
959 u64 ptr = gpuobj->vinst + offset;
960 u32 base = ptr >> 16;
961 u32 val;
962
963 spin_lock_irqsave(&dev_priv->vm_lock, flags);
964 if (dev_priv->ramin_base != base) {
965 dev_priv->ramin_base = base;
966 nv_wr32(dev, 0x001700, dev_priv->ramin_base);
967 }
968 val = nv_rd32(dev, 0x700000 + (ptr & 0xffff));
969 spin_unlock_irqrestore(&dev_priv->vm_lock, flags);
970 return val;
971 }
972
973 return nv_ri32(dev, gpuobj->pinst + offset);
974}
975
976void
977nv_wo32(struct nouveau_gpuobj *gpuobj, u32 offset, u32 val)
978{
979 struct drm_nouveau_private *dev_priv = gpuobj->dev->dev_private;
980 struct drm_device *dev = gpuobj->dev;
981 unsigned long flags;
982
983 if (gpuobj->pinst == ~0 || !dev_priv->ramin_available) {
984 u64 ptr = gpuobj->vinst + offset;
985 u32 base = ptr >> 16;
986
987 spin_lock_irqsave(&dev_priv->vm_lock, flags);
988 if (dev_priv->ramin_base != base) {
989 dev_priv->ramin_base = base;
990 nv_wr32(dev, 0x001700, dev_priv->ramin_base);
991 }
992 nv_wr32(dev, 0x700000 + (ptr & 0xffff), val);
993 spin_unlock_irqrestore(&dev_priv->vm_lock, flags);
994 return;
995 }
996
997 nv_wi32(dev, gpuobj->pinst + offset, val);
1252} 998}
diff --git a/drivers/gpu/drm/nouveau/nouveau_perf.c b/drivers/gpu/drm/nouveau/nouveau_perf.c
new file mode 100644
index 000000000000..ef9dec0e6f8b
--- /dev/null
+++ b/drivers/gpu/drm/nouveau/nouveau_perf.c
@@ -0,0 +1,296 @@
1/*
2 * Copyright 2010 Red Hat 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: Ben Skeggs
23 */
24
25#include "drmP.h"
26
27#include "nouveau_drv.h"
28#include "nouveau_pm.h"
29
30static void
31legacy_perf_init(struct drm_device *dev)
32{
33 struct drm_nouveau_private *dev_priv = dev->dev_private;
34 struct nvbios *bios = &dev_priv->vbios;
35 struct nouveau_pm_engine *pm = &dev_priv->engine.pm;
36 char *perf, *entry, *bmp = &bios->data[bios->offset];
37 int headerlen, use_straps;
38
39 if (bmp[5] < 0x5 || bmp[6] < 0x14) {
40 NV_DEBUG(dev, "BMP version too old for perf\n");
41 return;
42 }
43
44 perf = ROMPTR(bios, bmp[0x73]);
45 if (!perf) {
46 NV_DEBUG(dev, "No memclock table pointer found.\n");
47 return;
48 }
49
50 switch (perf[0]) {
51 case 0x12:
52 case 0x14:
53 case 0x18:
54 use_straps = 0;
55 headerlen = 1;
56 break;
57 case 0x01:
58 use_straps = perf[1] & 1;
59 headerlen = (use_straps ? 8 : 2);
60 break;
61 default:
62 NV_WARN(dev, "Unknown memclock table version %x.\n", perf[0]);
63 return;
64 }
65
66 entry = perf + headerlen;
67 if (use_straps)
68 entry += (nv_rd32(dev, NV_PEXTDEV_BOOT_0) & 0x3c) >> 1;
69
70 sprintf(pm->perflvl[0].name, "performance_level_0");
71 pm->perflvl[0].memory = ROM16(entry[0]) * 20;
72 pm->nr_perflvl = 1;
73}
74
75static struct nouveau_pm_memtiming *
76nouveau_perf_timing(struct drm_device *dev, struct bit_entry *P,
77 u16 memclk, u8 *entry, u8 recordlen, u8 entries)
78{
79 struct drm_nouveau_private *dev_priv = dev->dev_private;
80 struct nouveau_pm_engine *pm = &dev_priv->engine.pm;
81 struct nvbios *bios = &dev_priv->vbios;
82 u8 ramcfg;
83 int i;
84
85 /* perf v2 has a separate "timing map" table, we have to match
86 * the target memory clock to a specific entry, *then* use
87 * ramcfg to select the correct subentry
88 */
89 if (P->version == 2) {
90 u8 *tmap = ROMPTR(bios, P->data[4]);
91 if (!tmap) {
92 NV_DEBUG(dev, "no timing map pointer\n");
93 return NULL;
94 }
95
96 if (tmap[0] != 0x10) {
97 NV_WARN(dev, "timing map 0x%02x unknown\n", tmap[0]);
98 return NULL;
99 }
100
101 entry = tmap + tmap[1];
102 recordlen = tmap[2] + (tmap[4] * tmap[3]);
103 for (i = 0; i < tmap[5]; i++, entry += recordlen) {
104 if (memclk >= ROM16(entry[0]) &&
105 memclk <= ROM16(entry[2]))
106 break;
107 }
108
109 if (i == tmap[5]) {
110 NV_WARN(dev, "no match in timing map table\n");
111 return NULL;
112 }
113
114 entry += tmap[2];
115 recordlen = tmap[3];
116 entries = tmap[4];
117 }
118
119 ramcfg = (nv_rd32(dev, NV_PEXTDEV_BOOT_0) & 0x0000003c) >> 2;
120 if (bios->ram_restrict_tbl_ptr)
121 ramcfg = bios->data[bios->ram_restrict_tbl_ptr + ramcfg];
122
123 if (ramcfg >= entries) {
124 NV_WARN(dev, "ramcfg strap out of bounds!\n");
125 return NULL;
126 }
127
128 entry += ramcfg * recordlen;
129 if (entry[1] >= pm->memtimings.nr_timing) {
130 NV_WARN(dev, "timingset %d does not exist\n", entry[1]);
131 return NULL;
132 }
133
134 return &pm->memtimings.timing[entry[1]];
135}
136
137void
138nouveau_perf_init(struct drm_device *dev)
139{
140 struct drm_nouveau_private *dev_priv = dev->dev_private;
141 struct nouveau_pm_engine *pm = &dev_priv->engine.pm;
142 struct nvbios *bios = &dev_priv->vbios;
143 struct bit_entry P;
144 u8 version, headerlen, recordlen, entries;
145 u8 *perf, *entry;
146 int vid, i;
147
148 if (bios->type == NVBIOS_BIT) {
149 if (bit_table(dev, 'P', &P))
150 return;
151
152 if (P.version != 1 && P.version != 2) {
153 NV_WARN(dev, "unknown perf for BIT P %d\n", P.version);
154 return;
155 }
156
157 perf = ROMPTR(bios, P.data[0]);
158 version = perf[0];
159 headerlen = perf[1];
160 if (version < 0x40) {
161 recordlen = perf[3] + (perf[4] * perf[5]);
162 entries = perf[2];
163 } else {
164 recordlen = perf[2] + (perf[3] * perf[4]);
165 entries = perf[5];
166 }
167 } else {
168 if (bios->data[bios->offset + 6] < 0x25) {
169 legacy_perf_init(dev);
170 return;
171 }
172
173 perf = ROMPTR(bios, bios->data[bios->offset + 0x94]);
174 if (!perf) {
175 NV_DEBUG(dev, "perf table pointer invalid\n");
176 return;
177 }
178
179 version = perf[1];
180 headerlen = perf[0];
181 recordlen = perf[3];
182 entries = perf[2];
183 }
184
185 if (entries > NOUVEAU_PM_MAX_LEVEL) {
186 NV_DEBUG(dev, "perf table has too many entries - buggy vbios?\n");
187 entries = NOUVEAU_PM_MAX_LEVEL;
188 }
189
190 entry = perf + headerlen;
191 for (i = 0; i < entries; i++) {
192 struct nouveau_pm_level *perflvl = &pm->perflvl[pm->nr_perflvl];
193
194 perflvl->timing = NULL;
195
196 if (entry[0] == 0xff) {
197 entry += recordlen;
198 continue;
199 }
200
201 switch (version) {
202 case 0x12:
203 case 0x13:
204 case 0x15:
205 perflvl->fanspeed = entry[55];
206 perflvl->voltage = (recordlen > 56) ? entry[56] : 0;
207 perflvl->core = ROM32(entry[1]) * 10;
208 perflvl->memory = ROM32(entry[5]) * 20;
209 break;
210 case 0x21:
211 case 0x23:
212 case 0x24:
213 perflvl->fanspeed = entry[4];
214 perflvl->voltage = entry[5];
215 perflvl->core = ROM16(entry[6]) * 1000;
216
217 if (dev_priv->chipset == 0x49 ||
218 dev_priv->chipset == 0x4b)
219 perflvl->memory = ROM16(entry[11]) * 1000;
220 else
221 perflvl->memory = ROM16(entry[11]) * 2000;
222
223 break;
224 case 0x25:
225 perflvl->fanspeed = entry[4];
226 perflvl->voltage = entry[5];
227 perflvl->core = ROM16(entry[6]) * 1000;
228 perflvl->shader = ROM16(entry[10]) * 1000;
229 perflvl->memory = ROM16(entry[12]) * 1000;
230 break;
231 case 0x30:
232 perflvl->memscript = ROM16(entry[2]);
233 case 0x35:
234 perflvl->fanspeed = entry[6];
235 perflvl->voltage = entry[7];
236 perflvl->core = ROM16(entry[8]) * 1000;
237 perflvl->shader = ROM16(entry[10]) * 1000;
238 perflvl->memory = ROM16(entry[12]) * 1000;
239 /*XXX: confirm on 0x35 */
240 perflvl->unk05 = ROM16(entry[16]) * 1000;
241 break;
242 case 0x40:
243#define subent(n) entry[perf[2] + ((n) * perf[3])]
244 perflvl->fanspeed = 0; /*XXX*/
245 perflvl->voltage = entry[2];
246 if (dev_priv->card_type == NV_50) {
247 perflvl->core = ROM16(subent(0)) & 0xfff;
248 perflvl->shader = ROM16(subent(1)) & 0xfff;
249 perflvl->memory = ROM16(subent(2)) & 0xfff;
250 } else {
251 perflvl->shader = ROM16(subent(3)) & 0xfff;
252 perflvl->core = perflvl->shader / 2;
253 perflvl->unk0a = ROM16(subent(4)) & 0xfff;
254 perflvl->memory = ROM16(subent(5)) & 0xfff;
255 }
256
257 perflvl->core *= 1000;
258 perflvl->shader *= 1000;
259 perflvl->memory *= 1000;
260 perflvl->unk0a *= 1000;
261 break;
262 }
263
264 /* make sure vid is valid */
265 if (pm->voltage.supported && perflvl->voltage) {
266 vid = nouveau_volt_vid_lookup(dev, perflvl->voltage);
267 if (vid < 0) {
268 NV_DEBUG(dev, "drop perflvl %d, bad vid\n", i);
269 entry += recordlen;
270 continue;
271 }
272 }
273
274 /* get the corresponding memory timings */
275 if (version > 0x15) {
276 /* last 3 args are for < 0x40, ignored for >= 0x40 */
277 perflvl->timing =
278 nouveau_perf_timing(dev, &P,
279 perflvl->memory / 1000,
280 entry + perf[3],
281 perf[5], perf[4]);
282 }
283
284 snprintf(perflvl->name, sizeof(perflvl->name),
285 "performance_level_%d", i);
286 perflvl->id = i;
287 pm->nr_perflvl++;
288
289 entry += recordlen;
290 }
291}
292
293void
294nouveau_perf_fini(struct drm_device *dev)
295{
296}
diff --git a/drivers/gpu/drm/nouveau/nouveau_pm.c b/drivers/gpu/drm/nouveau/nouveau_pm.c
new file mode 100644
index 000000000000..da8d994d5e8a
--- /dev/null
+++ b/drivers/gpu/drm/nouveau/nouveau_pm.c
@@ -0,0 +1,557 @@
1/*
2 * Copyright 2010 Red Hat 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: Ben Skeggs
23 */
24
25#include "drmP.h"
26
27#include "nouveau_drv.h"
28#include "nouveau_pm.h"
29
30#ifdef CONFIG_ACPI
31#include <linux/acpi.h>
32#endif
33#include <linux/power_supply.h>
34#include <linux/hwmon.h>
35#include <linux/hwmon-sysfs.h>
36
37static int
38nouveau_pm_clock_set(struct drm_device *dev, struct nouveau_pm_level *perflvl,
39 u8 id, u32 khz)
40{
41 struct drm_nouveau_private *dev_priv = dev->dev_private;
42 struct nouveau_pm_engine *pm = &dev_priv->engine.pm;
43 void *pre_state;
44
45 if (khz == 0)
46 return 0;
47
48 pre_state = pm->clock_pre(dev, perflvl, id, khz);
49 if (IS_ERR(pre_state))
50 return PTR_ERR(pre_state);
51
52 if (pre_state)
53 pm->clock_set(dev, pre_state);
54 return 0;
55}
56
57static int
58nouveau_pm_perflvl_set(struct drm_device *dev, struct nouveau_pm_level *perflvl)
59{
60 struct drm_nouveau_private *dev_priv = dev->dev_private;
61 struct nouveau_pm_engine *pm = &dev_priv->engine.pm;
62 int ret;
63
64 if (perflvl == pm->cur)
65 return 0;
66
67 if (pm->voltage.supported && pm->voltage_set && perflvl->voltage) {
68 ret = pm->voltage_set(dev, perflvl->voltage);
69 if (ret) {
70 NV_ERROR(dev, "voltage_set %d failed: %d\n",
71 perflvl->voltage, ret);
72 }
73 }
74
75 nouveau_pm_clock_set(dev, perflvl, PLL_CORE, perflvl->core);
76 nouveau_pm_clock_set(dev, perflvl, PLL_SHADER, perflvl->shader);
77 nouveau_pm_clock_set(dev, perflvl, PLL_MEMORY, perflvl->memory);
78 nouveau_pm_clock_set(dev, perflvl, PLL_UNK05, perflvl->unk05);
79
80 pm->cur = perflvl;
81 return 0;
82}
83
84static int
85nouveau_pm_profile_set(struct drm_device *dev, const char *profile)
86{
87 struct drm_nouveau_private *dev_priv = dev->dev_private;
88 struct nouveau_pm_engine *pm = &dev_priv->engine.pm;
89 struct nouveau_pm_level *perflvl = NULL;
90
91 /* safety precaution, for now */
92 if (nouveau_perflvl_wr != 7777)
93 return -EPERM;
94
95 if (!pm->clock_set)
96 return -EINVAL;
97
98 if (!strncmp(profile, "boot", 4))
99 perflvl = &pm->boot;
100 else {
101 int pl = simple_strtol(profile, NULL, 10);
102 int i;
103
104 for (i = 0; i < pm->nr_perflvl; i++) {
105 if (pm->perflvl[i].id == pl) {
106 perflvl = &pm->perflvl[i];
107 break;
108 }
109 }
110
111 if (!perflvl)
112 return -EINVAL;
113 }
114
115 NV_INFO(dev, "setting performance level: %s\n", profile);
116 return nouveau_pm_perflvl_set(dev, perflvl);
117}
118
119static int
120nouveau_pm_perflvl_get(struct drm_device *dev, struct nouveau_pm_level *perflvl)
121{
122 struct drm_nouveau_private *dev_priv = dev->dev_private;
123 struct nouveau_pm_engine *pm = &dev_priv->engine.pm;
124 int ret;
125
126 if (!pm->clock_get)
127 return -EINVAL;
128
129 memset(perflvl, 0, sizeof(*perflvl));
130
131 ret = pm->clock_get(dev, PLL_CORE);
132 if (ret > 0)
133 perflvl->core = ret;
134
135 ret = pm->clock_get(dev, PLL_MEMORY);
136 if (ret > 0)
137 perflvl->memory = ret;
138
139 ret = pm->clock_get(dev, PLL_SHADER);
140 if (ret > 0)
141 perflvl->shader = ret;
142
143 ret = pm->clock_get(dev, PLL_UNK05);
144 if (ret > 0)
145 perflvl->unk05 = ret;
146
147 if (pm->voltage.supported && pm->voltage_get) {
148 ret = pm->voltage_get(dev);
149 if (ret > 0)
150 perflvl->voltage = ret;
151 }
152
153 return 0;
154}
155
156static void
157nouveau_pm_perflvl_info(struct nouveau_pm_level *perflvl, char *ptr, int len)
158{
159 char c[16], s[16], v[16], f[16], t[16];
160
161 c[0] = '\0';
162 if (perflvl->core)
163 snprintf(c, sizeof(c), " core %dMHz", perflvl->core / 1000);
164
165 s[0] = '\0';
166 if (perflvl->shader)
167 snprintf(s, sizeof(s), " shader %dMHz", perflvl->shader / 1000);
168
169 v[0] = '\0';
170 if (perflvl->voltage)
171 snprintf(v, sizeof(v), " voltage %dmV", perflvl->voltage * 10);
172
173 f[0] = '\0';
174 if (perflvl->fanspeed)
175 snprintf(f, sizeof(f), " fanspeed %d%%", perflvl->fanspeed);
176
177 t[0] = '\0';
178 if (perflvl->timing)
179 snprintf(t, sizeof(t), " timing %d", perflvl->timing->id);
180
181 snprintf(ptr, len, "memory %dMHz%s%s%s%s%s\n", perflvl->memory / 1000,
182 c, s, v, f, t);
183}
184
185static ssize_t
186nouveau_pm_get_perflvl_info(struct device *d,
187 struct device_attribute *a, char *buf)
188{
189 struct nouveau_pm_level *perflvl = (struct nouveau_pm_level *)a;
190 char *ptr = buf;
191 int len = PAGE_SIZE;
192
193 snprintf(ptr, len, "%d: ", perflvl->id);
194 ptr += strlen(buf);
195 len -= strlen(buf);
196
197 nouveau_pm_perflvl_info(perflvl, ptr, len);
198 return strlen(buf);
199}
200
201static ssize_t
202nouveau_pm_get_perflvl(struct device *d, struct device_attribute *a, char *buf)
203{
204 struct drm_device *dev = pci_get_drvdata(to_pci_dev(d));
205 struct drm_nouveau_private *dev_priv = dev->dev_private;
206 struct nouveau_pm_engine *pm = &dev_priv->engine.pm;
207 struct nouveau_pm_level cur;
208 int len = PAGE_SIZE, ret;
209 char *ptr = buf;
210
211 if (!pm->cur)
212 snprintf(ptr, len, "setting: boot\n");
213 else if (pm->cur == &pm->boot)
214 snprintf(ptr, len, "setting: boot\nc: ");
215 else
216 snprintf(ptr, len, "setting: static %d\nc: ", pm->cur->id);
217 ptr += strlen(buf);
218 len -= strlen(buf);
219
220 ret = nouveau_pm_perflvl_get(dev, &cur);
221 if (ret == 0)
222 nouveau_pm_perflvl_info(&cur, ptr, len);
223 return strlen(buf);
224}
225
226static ssize_t
227nouveau_pm_set_perflvl(struct device *d, struct device_attribute *a,
228 const char *buf, size_t count)
229{
230 struct drm_device *dev = pci_get_drvdata(to_pci_dev(d));
231 int ret;
232
233 ret = nouveau_pm_profile_set(dev, buf);
234 if (ret)
235 return ret;
236 return strlen(buf);
237}
238
239static DEVICE_ATTR(performance_level, S_IRUGO | S_IWUSR,
240 nouveau_pm_get_perflvl, nouveau_pm_set_perflvl);
241
242static int
243nouveau_sysfs_init(struct drm_device *dev)
244{
245 struct drm_nouveau_private *dev_priv = dev->dev_private;
246 struct nouveau_pm_engine *pm = &dev_priv->engine.pm;
247 struct device *d = &dev->pdev->dev;
248 int ret, i;
249
250 ret = device_create_file(d, &dev_attr_performance_level);
251 if (ret)
252 return ret;
253
254 for (i = 0; i < pm->nr_perflvl; i++) {
255 struct nouveau_pm_level *perflvl = &pm->perflvl[i];
256
257 perflvl->dev_attr.attr.name = perflvl->name;
258 perflvl->dev_attr.attr.mode = S_IRUGO;
259 perflvl->dev_attr.show = nouveau_pm_get_perflvl_info;
260 perflvl->dev_attr.store = NULL;
261 sysfs_attr_init(&perflvl->dev_attr.attr);
262
263 ret = device_create_file(d, &perflvl->dev_attr);
264 if (ret) {
265 NV_ERROR(dev, "failed pervlvl %d sysfs: %d\n",
266 perflvl->id, i);
267 perflvl->dev_attr.attr.name = NULL;
268 nouveau_pm_fini(dev);
269 return ret;
270 }
271 }
272
273 return 0;
274}
275
276static void
277nouveau_sysfs_fini(struct drm_device *dev)
278{
279 struct drm_nouveau_private *dev_priv = dev->dev_private;
280 struct nouveau_pm_engine *pm = &dev_priv->engine.pm;
281 struct device *d = &dev->pdev->dev;
282 int i;
283
284 device_remove_file(d, &dev_attr_performance_level);
285 for (i = 0; i < pm->nr_perflvl; i++) {
286 struct nouveau_pm_level *pl = &pm->perflvl[i];
287
288 if (!pl->dev_attr.attr.name)
289 break;
290
291 device_remove_file(d, &pl->dev_attr);
292 }
293}
294
295#ifdef CONFIG_HWMON
296static ssize_t
297nouveau_hwmon_show_temp(struct device *d, struct device_attribute *a, char *buf)
298{
299 struct drm_device *dev = dev_get_drvdata(d);
300 struct drm_nouveau_private *dev_priv = dev->dev_private;
301 struct nouveau_pm_engine *pm = &dev_priv->engine.pm;
302
303 return snprintf(buf, PAGE_SIZE, "%d\n", pm->temp_get(dev)*1000);
304}
305static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, nouveau_hwmon_show_temp,
306 NULL, 0);
307
308static ssize_t
309nouveau_hwmon_max_temp(struct device *d, struct device_attribute *a, char *buf)
310{
311 struct drm_device *dev = dev_get_drvdata(d);
312 struct drm_nouveau_private *dev_priv = dev->dev_private;
313 struct nouveau_pm_engine *pm = &dev_priv->engine.pm;
314 struct nouveau_pm_threshold_temp *temp = &pm->threshold_temp;
315
316 return snprintf(buf, PAGE_SIZE, "%d\n", temp->down_clock*1000);
317}
318static ssize_t
319nouveau_hwmon_set_max_temp(struct device *d, struct device_attribute *a,
320 const char *buf, size_t count)
321{
322 struct drm_device *dev = dev_get_drvdata(d);
323 struct drm_nouveau_private *dev_priv = dev->dev_private;
324 struct nouveau_pm_engine *pm = &dev_priv->engine.pm;
325 struct nouveau_pm_threshold_temp *temp = &pm->threshold_temp;
326 long value;
327
328 if (strict_strtol(buf, 10, &value) == -EINVAL)
329 return count;
330
331 temp->down_clock = value/1000;
332
333 nouveau_temp_safety_checks(dev);
334
335 return count;
336}
337static SENSOR_DEVICE_ATTR(temp1_max, S_IRUGO | S_IWUSR, nouveau_hwmon_max_temp,
338 nouveau_hwmon_set_max_temp,
339 0);
340
341static ssize_t
342nouveau_hwmon_critical_temp(struct device *d, struct device_attribute *a,
343 char *buf)
344{
345 struct drm_device *dev = dev_get_drvdata(d);
346 struct drm_nouveau_private *dev_priv = dev->dev_private;
347 struct nouveau_pm_engine *pm = &dev_priv->engine.pm;
348 struct nouveau_pm_threshold_temp *temp = &pm->threshold_temp;
349
350 return snprintf(buf, PAGE_SIZE, "%d\n", temp->critical*1000);
351}
352static ssize_t
353nouveau_hwmon_set_critical_temp(struct device *d, struct device_attribute *a,
354 const char *buf,
355 size_t count)
356{
357 struct drm_device *dev = dev_get_drvdata(d);
358 struct drm_nouveau_private *dev_priv = dev->dev_private;
359 struct nouveau_pm_engine *pm = &dev_priv->engine.pm;
360 struct nouveau_pm_threshold_temp *temp = &pm->threshold_temp;
361 long value;
362
363 if (strict_strtol(buf, 10, &value) == -EINVAL)
364 return count;
365
366 temp->critical = value/1000;
367
368 nouveau_temp_safety_checks(dev);
369
370 return count;
371}
372static SENSOR_DEVICE_ATTR(temp1_crit, S_IRUGO | S_IWUSR,
373 nouveau_hwmon_critical_temp,
374 nouveau_hwmon_set_critical_temp,
375 0);
376
377static ssize_t nouveau_hwmon_show_name(struct device *dev,
378 struct device_attribute *attr,
379 char *buf)
380{
381 return sprintf(buf, "nouveau\n");
382}
383static SENSOR_DEVICE_ATTR(name, S_IRUGO, nouveau_hwmon_show_name, NULL, 0);
384
385static ssize_t nouveau_hwmon_show_update_rate(struct device *dev,
386 struct device_attribute *attr,
387 char *buf)
388{
389 return sprintf(buf, "1000\n");
390}
391static SENSOR_DEVICE_ATTR(update_rate, S_IRUGO,
392 nouveau_hwmon_show_update_rate,
393 NULL, 0);
394
395static struct attribute *hwmon_attributes[] = {
396 &sensor_dev_attr_temp1_input.dev_attr.attr,
397 &sensor_dev_attr_temp1_max.dev_attr.attr,
398 &sensor_dev_attr_temp1_crit.dev_attr.attr,
399 &sensor_dev_attr_name.dev_attr.attr,
400 &sensor_dev_attr_update_rate.dev_attr.attr,
401 NULL
402};
403
404static const struct attribute_group hwmon_attrgroup = {
405 .attrs = hwmon_attributes,
406};
407#endif
408
409static int
410nouveau_hwmon_init(struct drm_device *dev)
411{
412#ifdef CONFIG_HWMON
413 struct drm_nouveau_private *dev_priv = dev->dev_private;
414 struct nouveau_pm_engine *pm = &dev_priv->engine.pm;
415 struct device *hwmon_dev;
416 int ret;
417
418 if (!pm->temp_get)
419 return -ENODEV;
420
421 hwmon_dev = hwmon_device_register(&dev->pdev->dev);
422 if (IS_ERR(hwmon_dev)) {
423 ret = PTR_ERR(hwmon_dev);
424 NV_ERROR(dev,
425 "Unable to register hwmon device: %d\n", ret);
426 return ret;
427 }
428 dev_set_drvdata(hwmon_dev, dev);
429 ret = sysfs_create_group(&dev->pdev->dev.kobj, &hwmon_attrgroup);
430 if (ret) {
431 NV_ERROR(dev,
432 "Unable to create hwmon sysfs file: %d\n", ret);
433 hwmon_device_unregister(hwmon_dev);
434 return ret;
435 }
436
437 pm->hwmon = hwmon_dev;
438#endif
439 return 0;
440}
441
442static void
443nouveau_hwmon_fini(struct drm_device *dev)
444{
445#ifdef CONFIG_HWMON
446 struct drm_nouveau_private *dev_priv = dev->dev_private;
447 struct nouveau_pm_engine *pm = &dev_priv->engine.pm;
448
449 if (pm->hwmon) {
450 sysfs_remove_group(&dev->pdev->dev.kobj, &hwmon_attrgroup);
451 hwmon_device_unregister(pm->hwmon);
452 }
453#endif
454}
455
456#if defined(CONFIG_ACPI) && defined(CONFIG_POWER_SUPPLY)
457static int
458nouveau_pm_acpi_event(struct notifier_block *nb, unsigned long val, void *data)
459{
460 struct drm_nouveau_private *dev_priv =
461 container_of(nb, struct drm_nouveau_private, engine.pm.acpi_nb);
462 struct drm_device *dev = dev_priv->dev;
463 struct acpi_bus_event *entry = (struct acpi_bus_event *)data;
464
465 if (strcmp(entry->device_class, "ac_adapter") == 0) {
466 bool ac = power_supply_is_system_supplied();
467
468 NV_DEBUG(dev, "power supply changed: %s\n", ac ? "AC" : "DC");
469 }
470
471 return NOTIFY_OK;
472}
473#endif
474
475int
476nouveau_pm_init(struct drm_device *dev)
477{
478 struct drm_nouveau_private *dev_priv = dev->dev_private;
479 struct nouveau_pm_engine *pm = &dev_priv->engine.pm;
480 char info[256];
481 int ret, i;
482
483 nouveau_mem_timing_init(dev);
484 nouveau_volt_init(dev);
485 nouveau_perf_init(dev);
486 nouveau_temp_init(dev);
487
488 NV_INFO(dev, "%d available performance level(s)\n", pm->nr_perflvl);
489 for (i = 0; i < pm->nr_perflvl; i++) {
490 nouveau_pm_perflvl_info(&pm->perflvl[i], info, sizeof(info));
491 NV_INFO(dev, "%d: %s", pm->perflvl[i].id, info);
492 }
493
494 /* determine current ("boot") performance level */
495 ret = nouveau_pm_perflvl_get(dev, &pm->boot);
496 if (ret == 0) {
497 strncpy(pm->boot.name, "boot", 4);
498 pm->cur = &pm->boot;
499
500 nouveau_pm_perflvl_info(&pm->boot, info, sizeof(info));
501 NV_INFO(dev, "c: %s", info);
502 }
503
504 /* switch performance levels now if requested */
505 if (nouveau_perflvl != NULL) {
506 ret = nouveau_pm_profile_set(dev, nouveau_perflvl);
507 if (ret) {
508 NV_ERROR(dev, "error setting perflvl \"%s\": %d\n",
509 nouveau_perflvl, ret);
510 }
511 }
512
513 nouveau_sysfs_init(dev);
514 nouveau_hwmon_init(dev);
515#if defined(CONFIG_ACPI) && defined(CONFIG_POWER_SUPPLY)
516 pm->acpi_nb.notifier_call = nouveau_pm_acpi_event;
517 register_acpi_notifier(&pm->acpi_nb);
518#endif
519
520 return 0;
521}
522
523void
524nouveau_pm_fini(struct drm_device *dev)
525{
526 struct drm_nouveau_private *dev_priv = dev->dev_private;
527 struct nouveau_pm_engine *pm = &dev_priv->engine.pm;
528
529 if (pm->cur != &pm->boot)
530 nouveau_pm_perflvl_set(dev, &pm->boot);
531
532 nouveau_temp_fini(dev);
533 nouveau_perf_fini(dev);
534 nouveau_volt_fini(dev);
535 nouveau_mem_timing_fini(dev);
536
537#if defined(CONFIG_ACPI) && defined(CONFIG_POWER_SUPPLY)
538 unregister_acpi_notifier(&pm->acpi_nb);
539#endif
540 nouveau_hwmon_fini(dev);
541 nouveau_sysfs_fini(dev);
542}
543
544void
545nouveau_pm_resume(struct drm_device *dev)
546{
547 struct drm_nouveau_private *dev_priv = dev->dev_private;
548 struct nouveau_pm_engine *pm = &dev_priv->engine.pm;
549 struct nouveau_pm_level *perflvl;
550
551 if (!pm->cur || pm->cur == &pm->boot)
552 return;
553
554 perflvl = pm->cur;
555 pm->cur = &pm->boot;
556 nouveau_pm_perflvl_set(dev, perflvl);
557}
diff --git a/drivers/gpu/drm/nouveau/nouveau_pm.h b/drivers/gpu/drm/nouveau/nouveau_pm.h
new file mode 100644
index 000000000000..4a9838ddacec
--- /dev/null
+++ b/drivers/gpu/drm/nouveau/nouveau_pm.h
@@ -0,0 +1,74 @@
1/*
2 * Copyright 2010 Red Hat 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: Ben Skeggs
23 */
24
25#ifndef __NOUVEAU_PM_H__
26#define __NOUVEAU_PM_H__
27
28/* nouveau_pm.c */
29int nouveau_pm_init(struct drm_device *dev);
30void nouveau_pm_fini(struct drm_device *dev);
31void nouveau_pm_resume(struct drm_device *dev);
32
33/* nouveau_volt.c */
34void nouveau_volt_init(struct drm_device *);
35void nouveau_volt_fini(struct drm_device *);
36int nouveau_volt_vid_lookup(struct drm_device *, int voltage);
37int nouveau_volt_lvl_lookup(struct drm_device *, int vid);
38int nouveau_voltage_gpio_get(struct drm_device *);
39int nouveau_voltage_gpio_set(struct drm_device *, int voltage);
40
41/* nouveau_perf.c */
42void nouveau_perf_init(struct drm_device *);
43void nouveau_perf_fini(struct drm_device *);
44
45/* nouveau_mem.c */
46void nouveau_mem_timing_init(struct drm_device *);
47void nouveau_mem_timing_fini(struct drm_device *);
48
49/* nv04_pm.c */
50int nv04_pm_clock_get(struct drm_device *, u32 id);
51void *nv04_pm_clock_pre(struct drm_device *, struct nouveau_pm_level *,
52 u32 id, int khz);
53void nv04_pm_clock_set(struct drm_device *, void *);
54
55/* nv50_pm.c */
56int nv50_pm_clock_get(struct drm_device *, u32 id);
57void *nv50_pm_clock_pre(struct drm_device *, struct nouveau_pm_level *,
58 u32 id, int khz);
59void nv50_pm_clock_set(struct drm_device *, void *);
60
61/* nva3_pm.c */
62int nva3_pm_clock_get(struct drm_device *, u32 id);
63void *nva3_pm_clock_pre(struct drm_device *, struct nouveau_pm_level *,
64 u32 id, int khz);
65void nva3_pm_clock_set(struct drm_device *, void *);
66
67/* nouveau_temp.c */
68void nouveau_temp_init(struct drm_device *dev);
69void nouveau_temp_fini(struct drm_device *dev);
70void nouveau_temp_safety_checks(struct drm_device *dev);
71int nv40_temp_get(struct drm_device *dev);
72int nv84_temp_get(struct drm_device *dev);
73
74#endif
diff --git a/drivers/gpu/drm/nouveau/nouveau_ramht.c b/drivers/gpu/drm/nouveau/nouveau_ramht.c
new file mode 100644
index 000000000000..a24a81f5a89e
--- /dev/null
+++ b/drivers/gpu/drm/nouveau/nouveau_ramht.c
@@ -0,0 +1,309 @@
1/*
2 * Copyright 2010 Red Hat 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: Ben Skeggs
23 */
24
25#include "drmP.h"
26
27#include "nouveau_drv.h"
28#include "nouveau_ramht.h"
29
30static u32
31nouveau_ramht_hash_handle(struct nouveau_channel *chan, u32 handle)
32{
33 struct drm_device *dev = chan->dev;
34 struct drm_nouveau_private *dev_priv = dev->dev_private;
35 struct nouveau_ramht *ramht = chan->ramht;
36 u32 hash = 0;
37 int i;
38
39 NV_DEBUG(dev, "ch%d handle=0x%08x\n", chan->id, handle);
40
41 for (i = 32; i > 0; i -= ramht->bits) {
42 hash ^= (handle & ((1 << ramht->bits) - 1));
43 handle >>= ramht->bits;
44 }
45
46 if (dev_priv->card_type < NV_50)
47 hash ^= chan->id << (ramht->bits - 4);
48 hash <<= 3;
49
50 NV_DEBUG(dev, "hash=0x%08x\n", hash);
51 return hash;
52}
53
54static int
55nouveau_ramht_entry_valid(struct drm_device *dev, struct nouveau_gpuobj *ramht,
56 u32 offset)
57{
58 struct drm_nouveau_private *dev_priv = dev->dev_private;
59 u32 ctx = nv_ro32(ramht, offset + 4);
60
61 if (dev_priv->card_type < NV_40)
62 return ((ctx & NV_RAMHT_CONTEXT_VALID) != 0);
63 return (ctx != 0);
64}
65
66static int
67nouveau_ramht_entry_same_channel(struct nouveau_channel *chan,
68 struct nouveau_gpuobj *ramht, u32 offset)
69{
70 struct drm_nouveau_private *dev_priv = chan->dev->dev_private;
71 u32 ctx = nv_ro32(ramht, offset + 4);
72
73 if (dev_priv->card_type >= NV_50)
74 return true;
75 else if (dev_priv->card_type >= NV_40)
76 return chan->id ==
77 ((ctx >> NV40_RAMHT_CONTEXT_CHANNEL_SHIFT) & 0x1f);
78 else
79 return chan->id ==
80 ((ctx >> NV_RAMHT_CONTEXT_CHANNEL_SHIFT) & 0x1f);
81}
82
83int
84nouveau_ramht_insert(struct nouveau_channel *chan, u32 handle,
85 struct nouveau_gpuobj *gpuobj)
86{
87 struct drm_device *dev = chan->dev;
88 struct drm_nouveau_private *dev_priv = dev->dev_private;
89 struct nouveau_instmem_engine *instmem = &dev_priv->engine.instmem;
90 struct nouveau_ramht_entry *entry;
91 struct nouveau_gpuobj *ramht = chan->ramht->gpuobj;
92 unsigned long flags;
93 u32 ctx, co, ho;
94
95 if (nouveau_ramht_find(chan, handle))
96 return -EEXIST;
97
98 entry = kmalloc(sizeof(*entry), GFP_KERNEL);
99 if (!entry)
100 return -ENOMEM;
101 entry->channel = chan;
102 entry->gpuobj = NULL;
103 entry->handle = handle;
104 nouveau_gpuobj_ref(gpuobj, &entry->gpuobj);
105
106 if (dev_priv->card_type < NV_40) {
107 ctx = NV_RAMHT_CONTEXT_VALID | (gpuobj->pinst >> 4) |
108 (chan->id << NV_RAMHT_CONTEXT_CHANNEL_SHIFT) |
109 (gpuobj->engine << NV_RAMHT_CONTEXT_ENGINE_SHIFT);
110 } else
111 if (dev_priv->card_type < NV_50) {
112 ctx = (gpuobj->pinst >> 4) |
113 (chan->id << NV40_RAMHT_CONTEXT_CHANNEL_SHIFT) |
114 (gpuobj->engine << NV40_RAMHT_CONTEXT_ENGINE_SHIFT);
115 } else {
116 if (gpuobj->engine == NVOBJ_ENGINE_DISPLAY) {
117 ctx = (gpuobj->cinst << 10) |
118 (chan->id << 28) |
119 chan->id; /* HASH_TAG */
120 } else {
121 ctx = (gpuobj->cinst >> 4) |
122 ((gpuobj->engine <<
123 NV40_RAMHT_CONTEXT_ENGINE_SHIFT));
124 }
125 }
126
127 spin_lock_irqsave(&chan->ramht->lock, flags);
128 list_add(&entry->head, &chan->ramht->entries);
129
130 co = ho = nouveau_ramht_hash_handle(chan, handle);
131 do {
132 if (!nouveau_ramht_entry_valid(dev, ramht, co)) {
133 NV_DEBUG(dev,
134 "insert ch%d 0x%08x: h=0x%08x, c=0x%08x\n",
135 chan->id, co, handle, ctx);
136 nv_wo32(ramht, co + 0, handle);
137 nv_wo32(ramht, co + 4, ctx);
138
139 spin_unlock_irqrestore(&chan->ramht->lock, flags);
140 instmem->flush(dev);
141 return 0;
142 }
143 NV_DEBUG(dev, "collision ch%d 0x%08x: h=0x%08x\n",
144 chan->id, co, nv_ro32(ramht, co));
145
146 co += 8;
147 if (co >= ramht->size)
148 co = 0;
149 } while (co != ho);
150
151 NV_ERROR(dev, "RAMHT space exhausted. ch=%d\n", chan->id);
152 list_del(&entry->head);
153 spin_unlock_irqrestore(&chan->ramht->lock, flags);
154 kfree(entry);
155 return -ENOMEM;
156}
157
158static struct nouveau_ramht_entry *
159nouveau_ramht_remove_entry(struct nouveau_channel *chan, u32 handle)
160{
161 struct nouveau_ramht *ramht = chan ? chan->ramht : NULL;
162 struct nouveau_ramht_entry *entry;
163 unsigned long flags;
164
165 if (!ramht)
166 return NULL;
167
168 spin_lock_irqsave(&ramht->lock, flags);
169 list_for_each_entry(entry, &ramht->entries, head) {
170 if (entry->channel == chan &&
171 (!handle || entry->handle == handle)) {
172 list_del(&entry->head);
173 spin_unlock_irqrestore(&ramht->lock, flags);
174
175 return entry;
176 }
177 }
178 spin_unlock_irqrestore(&ramht->lock, flags);
179
180 return NULL;
181}
182
183static void
184nouveau_ramht_remove_hash(struct nouveau_channel *chan, u32 handle)
185{
186 struct drm_device *dev = chan->dev;
187 struct drm_nouveau_private *dev_priv = dev->dev_private;
188 struct nouveau_instmem_engine *instmem = &dev_priv->engine.instmem;
189 struct nouveau_gpuobj *ramht = chan->ramht->gpuobj;
190 unsigned long flags;
191 u32 co, ho;
192
193 spin_lock_irqsave(&chan->ramht->lock, flags);
194 co = ho = nouveau_ramht_hash_handle(chan, handle);
195 do {
196 if (nouveau_ramht_entry_valid(dev, ramht, co) &&
197 nouveau_ramht_entry_same_channel(chan, ramht, co) &&
198 (handle == nv_ro32(ramht, co))) {
199 NV_DEBUG(dev,
200 "remove ch%d 0x%08x: h=0x%08x, c=0x%08x\n",
201 chan->id, co, handle, nv_ro32(ramht, co + 4));
202 nv_wo32(ramht, co + 0, 0x00000000);
203 nv_wo32(ramht, co + 4, 0x00000000);
204 instmem->flush(dev);
205 goto out;
206 }
207
208 co += 8;
209 if (co >= ramht->size)
210 co = 0;
211 } while (co != ho);
212
213 NV_ERROR(dev, "RAMHT entry not found. ch=%d, handle=0x%08x\n",
214 chan->id, handle);
215out:
216 spin_unlock_irqrestore(&chan->ramht->lock, flags);
217}
218
219int
220nouveau_ramht_remove(struct nouveau_channel *chan, u32 handle)
221{
222 struct nouveau_ramht_entry *entry;
223
224 entry = nouveau_ramht_remove_entry(chan, handle);
225 if (!entry)
226 return -ENOENT;
227
228 nouveau_ramht_remove_hash(chan, entry->handle);
229 nouveau_gpuobj_ref(NULL, &entry->gpuobj);
230 kfree(entry);
231 return 0;
232}
233
234struct nouveau_gpuobj *
235nouveau_ramht_find(struct nouveau_channel *chan, u32 handle)
236{
237 struct nouveau_ramht *ramht = chan->ramht;
238 struct nouveau_ramht_entry *entry;
239 struct nouveau_gpuobj *gpuobj = NULL;
240 unsigned long flags;
241
242 if (unlikely(!chan->ramht))
243 return NULL;
244
245 spin_lock_irqsave(&ramht->lock, flags);
246 list_for_each_entry(entry, &chan->ramht->entries, head) {
247 if (entry->channel == chan && entry->handle == handle) {
248 gpuobj = entry->gpuobj;
249 break;
250 }
251 }
252 spin_unlock_irqrestore(&ramht->lock, flags);
253
254 return gpuobj;
255}
256
257int
258nouveau_ramht_new(struct drm_device *dev, struct nouveau_gpuobj *gpuobj,
259 struct nouveau_ramht **pramht)
260{
261 struct nouveau_ramht *ramht;
262
263 ramht = kzalloc(sizeof(*ramht), GFP_KERNEL);
264 if (!ramht)
265 return -ENOMEM;
266
267 ramht->dev = dev;
268 kref_init(&ramht->refcount);
269 ramht->bits = drm_order(gpuobj->size / 8);
270 INIT_LIST_HEAD(&ramht->entries);
271 spin_lock_init(&ramht->lock);
272 nouveau_gpuobj_ref(gpuobj, &ramht->gpuobj);
273
274 *pramht = ramht;
275 return 0;
276}
277
278static void
279nouveau_ramht_del(struct kref *ref)
280{
281 struct nouveau_ramht *ramht =
282 container_of(ref, struct nouveau_ramht, refcount);
283
284 nouveau_gpuobj_ref(NULL, &ramht->gpuobj);
285 kfree(ramht);
286}
287
288void
289nouveau_ramht_ref(struct nouveau_ramht *ref, struct nouveau_ramht **ptr,
290 struct nouveau_channel *chan)
291{
292 struct nouveau_ramht_entry *entry;
293 struct nouveau_ramht *ramht;
294
295 if (ref)
296 kref_get(&ref->refcount);
297
298 ramht = *ptr;
299 if (ramht) {
300 while ((entry = nouveau_ramht_remove_entry(chan, 0))) {
301 nouveau_ramht_remove_hash(chan, entry->handle);
302 nouveau_gpuobj_ref(NULL, &entry->gpuobj);
303 kfree(entry);
304 }
305
306 kref_put(&ramht->refcount, nouveau_ramht_del);
307 }
308 *ptr = ref;
309}
diff --git a/drivers/gpu/drm/nouveau/nouveau_ramht.h b/drivers/gpu/drm/nouveau/nouveau_ramht.h
new file mode 100644
index 000000000000..c82de98fee0e
--- /dev/null
+++ b/drivers/gpu/drm/nouveau/nouveau_ramht.h
@@ -0,0 +1,55 @@
1/*
2 * Copyright 2010 Red Hat 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: Ben Skeggs
23 */
24
25#ifndef __NOUVEAU_RAMHT_H__
26#define __NOUVEAU_RAMHT_H__
27
28struct nouveau_ramht_entry {
29 struct list_head head;
30 struct nouveau_channel *channel;
31 struct nouveau_gpuobj *gpuobj;
32 u32 handle;
33};
34
35struct nouveau_ramht {
36 struct drm_device *dev;
37 struct kref refcount;
38 spinlock_t lock;
39 struct nouveau_gpuobj *gpuobj;
40 struct list_head entries;
41 int bits;
42};
43
44extern int nouveau_ramht_new(struct drm_device *, struct nouveau_gpuobj *,
45 struct nouveau_ramht **);
46extern void nouveau_ramht_ref(struct nouveau_ramht *, struct nouveau_ramht **,
47 struct nouveau_channel *unref_channel);
48
49extern int nouveau_ramht_insert(struct nouveau_channel *, u32 handle,
50 struct nouveau_gpuobj *);
51extern int nouveau_ramht_remove(struct nouveau_channel *, u32 handle);
52extern struct nouveau_gpuobj *
53nouveau_ramht_find(struct nouveau_channel *chan, u32 handle);
54
55#endif
diff --git a/drivers/gpu/drm/nouveau/nouveau_reg.h b/drivers/gpu/drm/nouveau/nouveau_reg.h
index 21a6e453b975..f18cdfc3400f 100644
--- a/drivers/gpu/drm/nouveau/nouveau_reg.h
+++ b/drivers/gpu/drm/nouveau/nouveau_reg.h
@@ -45,6 +45,11 @@
45# define NV04_PFB_REF_CMD_REFRESH (1 << 0) 45# define NV04_PFB_REF_CMD_REFRESH (1 << 0)
46#define NV04_PFB_PRE 0x001002d4 46#define NV04_PFB_PRE 0x001002d4
47# define NV04_PFB_PRE_CMD_PRECHARGE (1 << 0) 47# define NV04_PFB_PRE_CMD_PRECHARGE (1 << 0)
48#define NV20_PFB_ZCOMP(i) (0x00100300 + 4*(i))
49# define NV20_PFB_ZCOMP_MODE_32 (4 << 24)
50# define NV20_PFB_ZCOMP_EN (1 << 31)
51# define NV25_PFB_ZCOMP_MODE_16 (1 << 20)
52# define NV25_PFB_ZCOMP_MODE_32 (2 << 20)
48#define NV10_PFB_CLOSE_PAGE2 0x0010033c 53#define NV10_PFB_CLOSE_PAGE2 0x0010033c
49#define NV04_PFB_SCRAMBLE(i) (0x00100400 + 4 * (i)) 54#define NV04_PFB_SCRAMBLE(i) (0x00100400 + 4 * (i))
50#define NV40_PFB_TILE(i) (0x00100600 + (i*16)) 55#define NV40_PFB_TILE(i) (0x00100600 + (i*16))
@@ -74,17 +79,6 @@
74# define NV40_RAMHT_CONTEXT_ENGINE_SHIFT 20 79# define NV40_RAMHT_CONTEXT_ENGINE_SHIFT 20
75# define NV40_RAMHT_CONTEXT_INSTANCE_SHIFT 0 80# define NV40_RAMHT_CONTEXT_INSTANCE_SHIFT 0
76 81
77/* DMA object defines */
78#define NV_DMA_ACCESS_RW 0
79#define NV_DMA_ACCESS_RO 1
80#define NV_DMA_ACCESS_WO 2
81#define NV_DMA_TARGET_VIDMEM 0
82#define NV_DMA_TARGET_PCI 2
83#define NV_DMA_TARGET_AGP 3
84/* The following is not a real value used by the card, it's changed by
85 * nouveau_object_dma_create */
86#define NV_DMA_TARGET_PCI_NONLINEAR 8
87
88/* Some object classes we care about in the drm */ 82/* Some object classes we care about in the drm */
89#define NV_CLASS_DMA_FROM_MEMORY 0x00000002 83#define NV_CLASS_DMA_FROM_MEMORY 0x00000002
90#define NV_CLASS_DMA_TO_MEMORY 0x00000003 84#define NV_CLASS_DMA_TO_MEMORY 0x00000003
@@ -332,6 +326,7 @@
332#define NV04_PGRAPH_BSWIZZLE5 0x004006A0 326#define NV04_PGRAPH_BSWIZZLE5 0x004006A0
333#define NV03_PGRAPH_STATUS 0x004006B0 327#define NV03_PGRAPH_STATUS 0x004006B0
334#define NV04_PGRAPH_STATUS 0x00400700 328#define NV04_PGRAPH_STATUS 0x00400700
329# define NV40_PGRAPH_STATUS_SYNC_STALL 0x00004000
335#define NV04_PGRAPH_TRAPPED_ADDR 0x00400704 330#define NV04_PGRAPH_TRAPPED_ADDR 0x00400704
336#define NV04_PGRAPH_TRAPPED_DATA 0x00400708 331#define NV04_PGRAPH_TRAPPED_DATA 0x00400708
337#define NV04_PGRAPH_SURFACE 0x0040070C 332#define NV04_PGRAPH_SURFACE 0x0040070C
@@ -378,6 +373,7 @@
378#define NV20_PGRAPH_TLIMIT(i) (0x00400904 + (i*16)) 373#define NV20_PGRAPH_TLIMIT(i) (0x00400904 + (i*16))
379#define NV20_PGRAPH_TSIZE(i) (0x00400908 + (i*16)) 374#define NV20_PGRAPH_TSIZE(i) (0x00400908 + (i*16))
380#define NV20_PGRAPH_TSTATUS(i) (0x0040090C + (i*16)) 375#define NV20_PGRAPH_TSTATUS(i) (0x0040090C + (i*16))
376#define NV20_PGRAPH_ZCOMP(i) (0x00400980 + 4*(i))
381#define NV10_PGRAPH_TILE(i) (0x00400B00 + (i*16)) 377#define NV10_PGRAPH_TILE(i) (0x00400B00 + (i*16))
382#define NV10_PGRAPH_TLIMIT(i) (0x00400B04 + (i*16)) 378#define NV10_PGRAPH_TLIMIT(i) (0x00400B04 + (i*16))
383#define NV10_PGRAPH_TSIZE(i) (0x00400B08 + (i*16)) 379#define NV10_PGRAPH_TSIZE(i) (0x00400B08 + (i*16))
@@ -551,6 +547,8 @@
551#define NV10_PFIFO_CACHE1_DMA_SUBROUTINE 0x0000324C 547#define NV10_PFIFO_CACHE1_DMA_SUBROUTINE 0x0000324C
552#define NV03_PFIFO_CACHE1_PULL0 0x00003240 548#define NV03_PFIFO_CACHE1_PULL0 0x00003240
553#define NV04_PFIFO_CACHE1_PULL0 0x00003250 549#define NV04_PFIFO_CACHE1_PULL0 0x00003250
550# define NV04_PFIFO_CACHE1_PULL0_HASH_FAILED 0x00000010
551# define NV04_PFIFO_CACHE1_PULL0_HASH_BUSY 0x00001000
554#define NV03_PFIFO_CACHE1_PULL1 0x00003250 552#define NV03_PFIFO_CACHE1_PULL1 0x00003250
555#define NV04_PFIFO_CACHE1_PULL1 0x00003254 553#define NV04_PFIFO_CACHE1_PULL1 0x00003254
556#define NV04_PFIFO_CACHE1_HASH 0x00003258 554#define NV04_PFIFO_CACHE1_HASH 0x00003258
@@ -641,9 +639,9 @@
641# define NV50_PCONNECTOR_I2C_PORT_4 0x0000e240 639# define NV50_PCONNECTOR_I2C_PORT_4 0x0000e240
642# define NV50_PCONNECTOR_I2C_PORT_5 0x0000e258 640# define NV50_PCONNECTOR_I2C_PORT_5 0x0000e258
643 641
644#define NV50_AUXCH_DATA_OUT(i,n) ((n) * 4 + (i) * 0x50 + 0x0000e4c0) 642#define NV50_AUXCH_DATA_OUT(i, n) ((n) * 4 + (i) * 0x50 + 0x0000e4c0)
645#define NV50_AUXCH_DATA_OUT__SIZE 4 643#define NV50_AUXCH_DATA_OUT__SIZE 4
646#define NV50_AUXCH_DATA_IN(i,n) ((n) * 4 + (i) * 0x50 + 0x0000e4d0) 644#define NV50_AUXCH_DATA_IN(i, n) ((n) * 4 + (i) * 0x50 + 0x0000e4d0)
647#define NV50_AUXCH_DATA_IN__SIZE 4 645#define NV50_AUXCH_DATA_IN__SIZE 4
648#define NV50_AUXCH_ADDR(i) ((i) * 0x50 + 0x0000e4e0) 646#define NV50_AUXCH_ADDR(i) ((i) * 0x50 + 0x0000e4e0)
649#define NV50_AUXCH_CTRL(i) ((i) * 0x50 + 0x0000e4e4) 647#define NV50_AUXCH_CTRL(i) ((i) * 0x50 + 0x0000e4e4)
@@ -712,31 +710,32 @@
712#define NV50_PDISPLAY_INTR_1_CLK_UNK10 0x00000010 710#define NV50_PDISPLAY_INTR_1_CLK_UNK10 0x00000010
713#define NV50_PDISPLAY_INTR_1_CLK_UNK20 0x00000020 711#define NV50_PDISPLAY_INTR_1_CLK_UNK20 0x00000020
714#define NV50_PDISPLAY_INTR_1_CLK_UNK40 0x00000040 712#define NV50_PDISPLAY_INTR_1_CLK_UNK40 0x00000040
715#define NV50_PDISPLAY_INTR_EN 0x0061002c 713#define NV50_PDISPLAY_INTR_EN_0 0x00610028
716#define NV50_PDISPLAY_INTR_EN_VBLANK_CRTC 0x0000000c 714#define NV50_PDISPLAY_INTR_EN_1 0x0061002c
717#define NV50_PDISPLAY_INTR_EN_VBLANK_CRTC_(n) (1 << ((n) + 2)) 715#define NV50_PDISPLAY_INTR_EN_1_VBLANK_CRTC 0x0000000c
718#define NV50_PDISPLAY_INTR_EN_VBLANK_CRTC_0 0x00000004 716#define NV50_PDISPLAY_INTR_EN_1_VBLANK_CRTC_(n) (1 << ((n) + 2))
719#define NV50_PDISPLAY_INTR_EN_VBLANK_CRTC_1 0x00000008 717#define NV50_PDISPLAY_INTR_EN_1_VBLANK_CRTC_0 0x00000004
720#define NV50_PDISPLAY_INTR_EN_CLK_UNK10 0x00000010 718#define NV50_PDISPLAY_INTR_EN_1_VBLANK_CRTC_1 0x00000008
721#define NV50_PDISPLAY_INTR_EN_CLK_UNK20 0x00000020 719#define NV50_PDISPLAY_INTR_EN_1_CLK_UNK10 0x00000010
722#define NV50_PDISPLAY_INTR_EN_CLK_UNK40 0x00000040 720#define NV50_PDISPLAY_INTR_EN_1_CLK_UNK20 0x00000020
721#define NV50_PDISPLAY_INTR_EN_1_CLK_UNK40 0x00000040
723#define NV50_PDISPLAY_UNK30_CTRL 0x00610030 722#define NV50_PDISPLAY_UNK30_CTRL 0x00610030
724#define NV50_PDISPLAY_UNK30_CTRL_UPDATE_VCLK0 0x00000200 723#define NV50_PDISPLAY_UNK30_CTRL_UPDATE_VCLK0 0x00000200
725#define NV50_PDISPLAY_UNK30_CTRL_UPDATE_VCLK1 0x00000400 724#define NV50_PDISPLAY_UNK30_CTRL_UPDATE_VCLK1 0x00000400
726#define NV50_PDISPLAY_UNK30_CTRL_PENDING 0x80000000 725#define NV50_PDISPLAY_UNK30_CTRL_PENDING 0x80000000
727#define NV50_PDISPLAY_TRAPPED_ADDR 0x00610080 726#define NV50_PDISPLAY_TRAPPED_ADDR(i) ((i) * 0x08 + 0x00610080)
728#define NV50_PDISPLAY_TRAPPED_DATA 0x00610084 727#define NV50_PDISPLAY_TRAPPED_DATA(i) ((i) * 0x08 + 0x00610084)
729#define NV50_PDISPLAY_CHANNEL_STAT(i) ((i) * 0x10 + 0x00610200) 728#define NV50_PDISPLAY_EVO_CTRL(i) ((i) * 0x10 + 0x00610200)
730#define NV50_PDISPLAY_CHANNEL_STAT_DMA 0x00000010 729#define NV50_PDISPLAY_EVO_CTRL_DMA 0x00000010
731#define NV50_PDISPLAY_CHANNEL_STAT_DMA_DISABLED 0x00000000 730#define NV50_PDISPLAY_EVO_CTRL_DMA_DISABLED 0x00000000
732#define NV50_PDISPLAY_CHANNEL_STAT_DMA_ENABLED 0x00000010 731#define NV50_PDISPLAY_EVO_CTRL_DMA_ENABLED 0x00000010
733#define NV50_PDISPLAY_CHANNEL_DMA_CB(i) ((i) * 0x10 + 0x00610204) 732#define NV50_PDISPLAY_EVO_DMA_CB(i) ((i) * 0x10 + 0x00610204)
734#define NV50_PDISPLAY_CHANNEL_DMA_CB_LOCATION 0x00000002 733#define NV50_PDISPLAY_EVO_DMA_CB_LOCATION 0x00000002
735#define NV50_PDISPLAY_CHANNEL_DMA_CB_LOCATION_VRAM 0x00000000 734#define NV50_PDISPLAY_EVO_DMA_CB_LOCATION_VRAM 0x00000000
736#define NV50_PDISPLAY_CHANNEL_DMA_CB_LOCATION_SYSTEM 0x00000002 735#define NV50_PDISPLAY_EVO_DMA_CB_LOCATION_SYSTEM 0x00000002
737#define NV50_PDISPLAY_CHANNEL_DMA_CB_VALID 0x00000001 736#define NV50_PDISPLAY_EVO_DMA_CB_VALID 0x00000001
738#define NV50_PDISPLAY_CHANNEL_UNK2(i) ((i) * 0x10 + 0x00610208) 737#define NV50_PDISPLAY_EVO_UNK2(i) ((i) * 0x10 + 0x00610208)
739#define NV50_PDISPLAY_CHANNEL_UNK3(i) ((i) * 0x10 + 0x0061020c) 738#define NV50_PDISPLAY_EVO_HASH_TAG(i) ((i) * 0x10 + 0x0061020c)
740 739
741#define NV50_PDISPLAY_CURSOR 0x00610270 740#define NV50_PDISPLAY_CURSOR 0x00610270
742#define NV50_PDISPLAY_CURSOR_CURSOR_CTRL2(i) ((i) * 0x10 + 0x00610270) 741#define NV50_PDISPLAY_CURSOR_CURSOR_CTRL2(i) ((i) * 0x10 + 0x00610270)
@@ -744,15 +743,11 @@
744#define NV50_PDISPLAY_CURSOR_CURSOR_CTRL2_STATUS 0x00030000 743#define NV50_PDISPLAY_CURSOR_CURSOR_CTRL2_STATUS 0x00030000
745#define NV50_PDISPLAY_CURSOR_CURSOR_CTRL2_STATUS_ACTIVE 0x00010000 744#define NV50_PDISPLAY_CURSOR_CURSOR_CTRL2_STATUS_ACTIVE 0x00010000
746 745
747#define NV50_PDISPLAY_CTRL_STATE 0x00610300 746#define NV50_PDISPLAY_PIO_CTRL 0x00610300
748#define NV50_PDISPLAY_CTRL_STATE_PENDING 0x80000000 747#define NV50_PDISPLAY_PIO_CTRL_PENDING 0x80000000
749#define NV50_PDISPLAY_CTRL_STATE_METHOD 0x00001ffc 748#define NV50_PDISPLAY_PIO_CTRL_MTHD 0x00001ffc
750#define NV50_PDISPLAY_CTRL_STATE_ENABLE 0x00000001 749#define NV50_PDISPLAY_PIO_CTRL_ENABLED 0x00000001
751#define NV50_PDISPLAY_CTRL_VAL 0x00610304 750#define NV50_PDISPLAY_PIO_DATA 0x00610304
752#define NV50_PDISPLAY_UNK_380 0x00610380
753#define NV50_PDISPLAY_RAM_AMOUNT 0x00610384
754#define NV50_PDISPLAY_UNK_388 0x00610388
755#define NV50_PDISPLAY_UNK_38C 0x0061038c
756 751
757#define NV50_PDISPLAY_CRTC_P(i, r) ((i) * 0x540 + NV50_PDISPLAY_CRTC_##r) 752#define NV50_PDISPLAY_CRTC_P(i, r) ((i) * 0x540 + NV50_PDISPLAY_CRTC_##r)
758#define NV50_PDISPLAY_CRTC_C(i, r) (4 + (i) * 0x540 + NV50_PDISPLAY_CRTC_##r) 753#define NV50_PDISPLAY_CRTC_C(i, r) (4 + (i) * 0x540 + NV50_PDISPLAY_CRTC_##r)
@@ -785,15 +780,12 @@
785#define NV50_PDISPLAY_DAC_MODE_CTRL_C(i) (0x00610b5c + (i) * 0x8) 780#define NV50_PDISPLAY_DAC_MODE_CTRL_C(i) (0x00610b5c + (i) * 0x8)
786#define NV50_PDISPLAY_SOR_MODE_CTRL_P(i) (0x00610b70 + (i) * 0x8) 781#define NV50_PDISPLAY_SOR_MODE_CTRL_P(i) (0x00610b70 + (i) * 0x8)
787#define NV50_PDISPLAY_SOR_MODE_CTRL_C(i) (0x00610b74 + (i) * 0x8) 782#define NV50_PDISPLAY_SOR_MODE_CTRL_C(i) (0x00610b74 + (i) * 0x8)
783#define NV50_PDISPLAY_EXT_MODE_CTRL_P(i) (0x00610b80 + (i) * 0x8)
784#define NV50_PDISPLAY_EXT_MODE_CTRL_C(i) (0x00610b84 + (i) * 0x8)
788#define NV50_PDISPLAY_DAC_MODE_CTRL2_P(i) (0x00610bdc + (i) * 0x8) 785#define NV50_PDISPLAY_DAC_MODE_CTRL2_P(i) (0x00610bdc + (i) * 0x8)
789#define NV50_PDISPLAY_DAC_MODE_CTRL2_C(i) (0x00610be0 + (i) * 0x8) 786#define NV50_PDISPLAY_DAC_MODE_CTRL2_C(i) (0x00610be0 + (i) * 0x8)
790
791#define NV90_PDISPLAY_SOR_MODE_CTRL_P(i) (0x00610794 + (i) * 0x8) 787#define NV90_PDISPLAY_SOR_MODE_CTRL_P(i) (0x00610794 + (i) * 0x8)
792#define NV90_PDISPLAY_SOR_MODE_CTRL_C(i) (0x00610798 + (i) * 0x8) 788#define NV90_PDISPLAY_SOR_MODE_CTRL_C(i) (0x00610798 + (i) * 0x8)
793#define NV90_PDISPLAY_DAC_MODE_CTRL_P(i) (0x00610b58 + (i) * 0x8)
794#define NV90_PDISPLAY_DAC_MODE_CTRL_C(i) (0x00610b5c + (i) * 0x8)
795#define NV90_PDISPLAY_DAC_MODE_CTRL2_P(i) (0x00610b80 + (i) * 0x8)
796#define NV90_PDISPLAY_DAC_MODE_CTRL2_C(i) (0x00610b84 + (i) * 0x8)
797 789
798#define NV50_PDISPLAY_CRTC_CLK 0x00614000 790#define NV50_PDISPLAY_CRTC_CLK 0x00614000
799#define NV50_PDISPLAY_CRTC_CLK_CTRL1(i) ((i) * 0x800 + 0x614100) 791#define NV50_PDISPLAY_CRTC_CLK_CTRL1(i) ((i) * 0x800 + 0x614100)
@@ -837,7 +829,7 @@
837#define NV50_PDISPLAY_SOR_BACKLIGHT 0x0061c084 829#define NV50_PDISPLAY_SOR_BACKLIGHT 0x0061c084
838#define NV50_PDISPLAY_SOR_BACKLIGHT_ENABLE 0x80000000 830#define NV50_PDISPLAY_SOR_BACKLIGHT_ENABLE 0x80000000
839#define NV50_PDISPLAY_SOR_BACKLIGHT_LEVEL 0x00000fff 831#define NV50_PDISPLAY_SOR_BACKLIGHT_LEVEL 0x00000fff
840#define NV50_SOR_DP_CTRL(i,l) (0x0061c10c + (i) * 0x800 + (l) * 0x80) 832#define NV50_SOR_DP_CTRL(i, l) (0x0061c10c + (i) * 0x800 + (l) * 0x80)
841#define NV50_SOR_DP_CTRL_ENABLED 0x00000001 833#define NV50_SOR_DP_CTRL_ENABLED 0x00000001
842#define NV50_SOR_DP_CTRL_ENHANCED_FRAME_ENABLED 0x00004000 834#define NV50_SOR_DP_CTRL_ENHANCED_FRAME_ENABLED 0x00004000
843#define NV50_SOR_DP_CTRL_LANE_MASK 0x001f0000 835#define NV50_SOR_DP_CTRL_LANE_MASK 0x001f0000
@@ -849,10 +841,10 @@
849#define NV50_SOR_DP_CTRL_TRAINING_PATTERN_DISABLED 0x00000000 841#define NV50_SOR_DP_CTRL_TRAINING_PATTERN_DISABLED 0x00000000
850#define NV50_SOR_DP_CTRL_TRAINING_PATTERN_1 0x01000000 842#define NV50_SOR_DP_CTRL_TRAINING_PATTERN_1 0x01000000
851#define NV50_SOR_DP_CTRL_TRAINING_PATTERN_2 0x02000000 843#define NV50_SOR_DP_CTRL_TRAINING_PATTERN_2 0x02000000
852#define NV50_SOR_DP_UNK118(i,l) (0x0061c118 + (i) * 0x800 + (l) * 0x80) 844#define NV50_SOR_DP_UNK118(i, l) (0x0061c118 + (i) * 0x800 + (l) * 0x80)
853#define NV50_SOR_DP_UNK120(i,l) (0x0061c120 + (i) * 0x800 + (l) * 0x80) 845#define NV50_SOR_DP_UNK120(i, l) (0x0061c120 + (i) * 0x800 + (l) * 0x80)
854#define NV50_SOR_DP_UNK128(i,l) (0x0061c128 + (i) * 0x800 + (l) * 0x80) 846#define NV50_SOR_DP_UNK128(i, l) (0x0061c128 + (i) * 0x800 + (l) * 0x80)
855#define NV50_SOR_DP_UNK130(i,l) (0x0061c130 + (i) * 0x800 + (l) * 0x80) 847#define NV50_SOR_DP_UNK130(i, l) (0x0061c130 + (i) * 0x800 + (l) * 0x80)
856 848
857#define NV50_PDISPLAY_USER(i) ((i) * 0x1000 + 0x00640000) 849#define NV50_PDISPLAY_USER(i) ((i) * 0x1000 + 0x00640000)
858#define NV50_PDISPLAY_USER_PUT(i) ((i) * 0x1000 + 0x00640000) 850#define NV50_PDISPLAY_USER_PUT(i) ((i) * 0x1000 + 0x00640000)
diff --git a/drivers/gpu/drm/nouveau/nouveau_sgdma.c b/drivers/gpu/drm/nouveau/nouveau_sgdma.c
index 6b9187d7f67d..82fad914e648 100644
--- a/drivers/gpu/drm/nouveau/nouveau_sgdma.c
+++ b/drivers/gpu/drm/nouveau/nouveau_sgdma.c
@@ -12,15 +12,17 @@ struct nouveau_sgdma_be {
12 struct drm_device *dev; 12 struct drm_device *dev;
13 13
14 dma_addr_t *pages; 14 dma_addr_t *pages;
15 bool *ttm_alloced;
15 unsigned nr_pages; 16 unsigned nr_pages;
16 17
17 unsigned pte_start; 18 u64 offset;
18 bool bound; 19 bool bound;
19}; 20};
20 21
21static int 22static int
22nouveau_sgdma_populate(struct ttm_backend *be, unsigned long num_pages, 23nouveau_sgdma_populate(struct ttm_backend *be, unsigned long num_pages,
23 struct page **pages, struct page *dummy_read_page) 24 struct page **pages, struct page *dummy_read_page,
25 dma_addr_t *dma_addrs)
24{ 26{
25 struct nouveau_sgdma_be *nvbe = (struct nouveau_sgdma_be *)be; 27 struct nouveau_sgdma_be *nvbe = (struct nouveau_sgdma_be *)be;
26 struct drm_device *dev = nvbe->dev; 28 struct drm_device *dev = nvbe->dev;
@@ -34,15 +36,27 @@ nouveau_sgdma_populate(struct ttm_backend *be, unsigned long num_pages,
34 if (!nvbe->pages) 36 if (!nvbe->pages)
35 return -ENOMEM; 37 return -ENOMEM;
36 38
39 nvbe->ttm_alloced = kmalloc(sizeof(bool) * num_pages, GFP_KERNEL);
40 if (!nvbe->ttm_alloced)
41 return -ENOMEM;
42
37 nvbe->nr_pages = 0; 43 nvbe->nr_pages = 0;
38 while (num_pages--) { 44 while (num_pages--) {
39 nvbe->pages[nvbe->nr_pages] = 45 /* this code path isn't called and is incorrect anyways */
40 pci_map_page(dev->pdev, pages[nvbe->nr_pages], 0, 46 if (0) { /*dma_addrs[nvbe->nr_pages] != DMA_ERROR_CODE)*/
47 nvbe->pages[nvbe->nr_pages] =
48 dma_addrs[nvbe->nr_pages];
49 nvbe->ttm_alloced[nvbe->nr_pages] = true;
50 } else {
51 nvbe->pages[nvbe->nr_pages] =
52 pci_map_page(dev->pdev, pages[nvbe->nr_pages], 0,
41 PAGE_SIZE, PCI_DMA_BIDIRECTIONAL); 53 PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);
42 if (pci_dma_mapping_error(dev->pdev, 54 if (pci_dma_mapping_error(dev->pdev,
43 nvbe->pages[nvbe->nr_pages])) { 55 nvbe->pages[nvbe->nr_pages])) {
44 be->func->clear(be); 56 be->func->clear(be);
45 return -EFAULT; 57 return -EFAULT;
58 }
59 nvbe->ttm_alloced[nvbe->nr_pages] = false;
46 } 60 }
47 61
48 nvbe->nr_pages++; 62 nvbe->nr_pages++;
@@ -65,29 +79,36 @@ nouveau_sgdma_clear(struct ttm_backend *be)
65 be->func->unbind(be); 79 be->func->unbind(be);
66 80
67 while (nvbe->nr_pages--) { 81 while (nvbe->nr_pages--) {
68 pci_unmap_page(dev->pdev, nvbe->pages[nvbe->nr_pages], 82 if (!nvbe->ttm_alloced[nvbe->nr_pages])
83 pci_unmap_page(dev->pdev, nvbe->pages[nvbe->nr_pages],
69 PAGE_SIZE, PCI_DMA_BIDIRECTIONAL); 84 PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);
70 } 85 }
71 kfree(nvbe->pages); 86 kfree(nvbe->pages);
87 kfree(nvbe->ttm_alloced);
72 nvbe->pages = NULL; 88 nvbe->pages = NULL;
89 nvbe->ttm_alloced = NULL;
73 nvbe->nr_pages = 0; 90 nvbe->nr_pages = 0;
74 } 91 }
75} 92}
76 93
77static inline unsigned 94static void
78nouveau_sgdma_pte(struct drm_device *dev, uint64_t offset) 95nouveau_sgdma_destroy(struct ttm_backend *be)
79{ 96{
80 struct drm_nouveau_private *dev_priv = dev->dev_private; 97 struct nouveau_sgdma_be *nvbe = (struct nouveau_sgdma_be *)be;
81 unsigned pte = (offset >> NV_CTXDMA_PAGE_SHIFT);
82 98
83 if (dev_priv->card_type < NV_50) 99 if (be) {
84 return pte + 2; 100 NV_DEBUG(nvbe->dev, "\n");
85 101
86 return pte << 1; 102 if (nvbe) {
103 if (nvbe->pages)
104 be->func->clear(be);
105 kfree(nvbe);
106 }
107 }
87} 108}
88 109
89static int 110static int
90nouveau_sgdma_bind(struct ttm_backend *be, struct ttm_mem_reg *mem) 111nv04_sgdma_bind(struct ttm_backend *be, struct ttm_mem_reg *mem)
91{ 112{
92 struct nouveau_sgdma_be *nvbe = (struct nouveau_sgdma_be *)be; 113 struct nouveau_sgdma_be *nvbe = (struct nouveau_sgdma_be *)be;
93 struct drm_device *dev = nvbe->dev; 114 struct drm_device *dev = nvbe->dev;
@@ -95,39 +116,26 @@ nouveau_sgdma_bind(struct ttm_backend *be, struct ttm_mem_reg *mem)
95 struct nouveau_gpuobj *gpuobj = dev_priv->gart_info.sg_ctxdma; 116 struct nouveau_gpuobj *gpuobj = dev_priv->gart_info.sg_ctxdma;
96 unsigned i, j, pte; 117 unsigned i, j, pte;
97 118
98 NV_DEBUG(dev, "pg=0x%lx\n", mem->mm_node->start); 119 NV_DEBUG(dev, "pg=0x%lx\n", mem->start);
99 120
100 pte = nouveau_sgdma_pte(nvbe->dev, mem->mm_node->start << PAGE_SHIFT); 121 nvbe->offset = mem->start << PAGE_SHIFT;
101 nvbe->pte_start = pte; 122 pte = (nvbe->offset >> NV_CTXDMA_PAGE_SHIFT) + 2;
102 for (i = 0; i < nvbe->nr_pages; i++) { 123 for (i = 0; i < nvbe->nr_pages; i++) {
103 dma_addr_t dma_offset = nvbe->pages[i]; 124 dma_addr_t dma_offset = nvbe->pages[i];
104 uint32_t offset_l = lower_32_bits(dma_offset); 125 uint32_t offset_l = lower_32_bits(dma_offset);
105 uint32_t offset_h = upper_32_bits(dma_offset);
106
107 for (j = 0; j < PAGE_SIZE / NV_CTXDMA_PAGE_SIZE; j++) {
108 if (dev_priv->card_type < NV_50)
109 nv_wo32(dev, gpuobj, pte++, offset_l | 3);
110 else {
111 nv_wo32(dev, gpuobj, pte++, offset_l | 0x21);
112 nv_wo32(dev, gpuobj, pte++, offset_h & 0xff);
113 }
114 126
127 for (j = 0; j < PAGE_SIZE / NV_CTXDMA_PAGE_SIZE; j++, pte++) {
128 nv_wo32(gpuobj, (pte * 4) + 0, offset_l | 3);
115 dma_offset += NV_CTXDMA_PAGE_SIZE; 129 dma_offset += NV_CTXDMA_PAGE_SIZE;
116 } 130 }
117 } 131 }
118 dev_priv->engine.instmem.flush(nvbe->dev);
119
120 if (dev_priv->card_type == NV_50) {
121 nv50_vm_flush(dev, 5); /* PGRAPH */
122 nv50_vm_flush(dev, 0); /* PFIFO */
123 }
124 132
125 nvbe->bound = true; 133 nvbe->bound = true;
126 return 0; 134 return 0;
127} 135}
128 136
129static int 137static int
130nouveau_sgdma_unbind(struct ttm_backend *be) 138nv04_sgdma_unbind(struct ttm_backend *be)
131{ 139{
132 struct nouveau_sgdma_be *nvbe = (struct nouveau_sgdma_be *)be; 140 struct nouveau_sgdma_be *nvbe = (struct nouveau_sgdma_be *)be;
133 struct drm_device *dev = nvbe->dev; 141 struct drm_device *dev = nvbe->dev;
@@ -140,53 +148,260 @@ nouveau_sgdma_unbind(struct ttm_backend *be)
140 if (!nvbe->bound) 148 if (!nvbe->bound)
141 return 0; 149 return 0;
142 150
143 pte = nvbe->pte_start; 151 pte = (nvbe->offset >> NV_CTXDMA_PAGE_SHIFT) + 2;
144 for (i = 0; i < nvbe->nr_pages; i++) { 152 for (i = 0; i < nvbe->nr_pages; i++) {
145 dma_addr_t dma_offset = dev_priv->gart_info.sg_dummy_bus; 153 for (j = 0; j < PAGE_SIZE / NV_CTXDMA_PAGE_SIZE; j++, pte++)
146 154 nv_wo32(gpuobj, (pte * 4) + 0, 0x00000000);
147 for (j = 0; j < PAGE_SIZE / NV_CTXDMA_PAGE_SIZE; j++) { 155 }
148 if (dev_priv->card_type < NV_50)
149 nv_wo32(dev, gpuobj, pte++, dma_offset | 3);
150 else {
151 nv_wo32(dev, gpuobj, pte++, dma_offset | 0x21);
152 nv_wo32(dev, gpuobj, pte++, 0x00000000);
153 }
154 156
155 dma_offset += NV_CTXDMA_PAGE_SIZE; 157 nvbe->bound = false;
156 } 158 return 0;
159}
160
161static struct ttm_backend_func nv04_sgdma_backend = {
162 .populate = nouveau_sgdma_populate,
163 .clear = nouveau_sgdma_clear,
164 .bind = nv04_sgdma_bind,
165 .unbind = nv04_sgdma_unbind,
166 .destroy = nouveau_sgdma_destroy
167};
168
169static void
170nv41_sgdma_flush(struct nouveau_sgdma_be *nvbe)
171{
172 struct drm_device *dev = nvbe->dev;
173
174 nv_wr32(dev, 0x100810, 0x00000022);
175 if (!nv_wait(dev, 0x100810, 0x00000100, 0x00000100))
176 NV_ERROR(dev, "vm flush timeout: 0x%08x\n",
177 nv_rd32(dev, 0x100810));
178 nv_wr32(dev, 0x100810, 0x00000000);
179}
180
181static int
182nv41_sgdma_bind(struct ttm_backend *be, struct ttm_mem_reg *mem)
183{
184 struct nouveau_sgdma_be *nvbe = (struct nouveau_sgdma_be *)be;
185 struct drm_nouveau_private *dev_priv = nvbe->dev->dev_private;
186 struct nouveau_gpuobj *pgt = dev_priv->gart_info.sg_ctxdma;
187 dma_addr_t *list = nvbe->pages;
188 u32 pte = mem->start << 2;
189 u32 cnt = nvbe->nr_pages;
190
191 nvbe->offset = mem->start << PAGE_SHIFT;
192
193 while (cnt--) {
194 nv_wo32(pgt, pte, (*list++ >> 7) | 1);
195 pte += 4;
157 } 196 }
158 dev_priv->engine.instmem.flush(nvbe->dev);
159 197
160 if (dev_priv->card_type == NV_50) { 198 nv41_sgdma_flush(nvbe);
161 nv50_vm_flush(dev, 5); 199 nvbe->bound = true;
162 nv50_vm_flush(dev, 0); 200 return 0;
201}
202
203static int
204nv41_sgdma_unbind(struct ttm_backend *be)
205{
206 struct nouveau_sgdma_be *nvbe = (struct nouveau_sgdma_be *)be;
207 struct drm_nouveau_private *dev_priv = nvbe->dev->dev_private;
208 struct nouveau_gpuobj *pgt = dev_priv->gart_info.sg_ctxdma;
209 u32 pte = (nvbe->offset >> 12) << 2;
210 u32 cnt = nvbe->nr_pages;
211
212 while (cnt--) {
213 nv_wo32(pgt, pte, 0x00000000);
214 pte += 4;
163 } 215 }
164 216
217 nv41_sgdma_flush(nvbe);
165 nvbe->bound = false; 218 nvbe->bound = false;
166 return 0; 219 return 0;
167} 220}
168 221
222static struct ttm_backend_func nv41_sgdma_backend = {
223 .populate = nouveau_sgdma_populate,
224 .clear = nouveau_sgdma_clear,
225 .bind = nv41_sgdma_bind,
226 .unbind = nv41_sgdma_unbind,
227 .destroy = nouveau_sgdma_destroy
228};
229
169static void 230static void
170nouveau_sgdma_destroy(struct ttm_backend *be) 231nv44_sgdma_flush(struct nouveau_sgdma_be *nvbe)
171{ 232{
172 struct nouveau_sgdma_be *nvbe = (struct nouveau_sgdma_be *)be; 233 struct drm_device *dev = nvbe->dev;
173 234
174 if (be) { 235 nv_wr32(dev, 0x100814, (nvbe->nr_pages - 1) << 12);
175 NV_DEBUG(nvbe->dev, "\n"); 236 nv_wr32(dev, 0x100808, nvbe->offset | 0x20);
237 if (!nv_wait(dev, 0x100808, 0x00000001, 0x00000001))
238 NV_ERROR(dev, "gart flush timeout: 0x%08x\n",
239 nv_rd32(dev, 0x100808));
240 nv_wr32(dev, 0x100808, 0x00000000);
241}
176 242
177 if (nvbe) { 243static void
178 if (nvbe->pages) 244nv44_sgdma_fill(struct nouveau_gpuobj *pgt, dma_addr_t *list, u32 base, u32 cnt)
179 be->func->clear(be); 245{
180 kfree(nvbe); 246 struct drm_nouveau_private *dev_priv = pgt->dev->dev_private;
247 dma_addr_t dummy = dev_priv->gart_info.dummy.addr;
248 u32 pte, tmp[4];
249
250 pte = base >> 2;
251 base &= ~0x0000000f;
252
253 tmp[0] = nv_ro32(pgt, base + 0x0);
254 tmp[1] = nv_ro32(pgt, base + 0x4);
255 tmp[2] = nv_ro32(pgt, base + 0x8);
256 tmp[3] = nv_ro32(pgt, base + 0xc);
257 while (cnt--) {
258 u32 addr = list ? (*list++ >> 12) : (dummy >> 12);
259 switch (pte++ & 0x3) {
260 case 0:
261 tmp[0] &= ~0x07ffffff;
262 tmp[0] |= addr;
263 break;
264 case 1:
265 tmp[0] &= ~0xf8000000;
266 tmp[0] |= addr << 27;
267 tmp[1] &= ~0x003fffff;
268 tmp[1] |= addr >> 5;
269 break;
270 case 2:
271 tmp[1] &= ~0xffc00000;
272 tmp[1] |= addr << 22;
273 tmp[2] &= ~0x0001ffff;
274 tmp[2] |= addr >> 10;
275 break;
276 case 3:
277 tmp[2] &= ~0xfffe0000;
278 tmp[2] |= addr << 17;
279 tmp[3] &= ~0x00000fff;
280 tmp[3] |= addr >> 15;
281 break;
181 } 282 }
182 } 283 }
284
285 tmp[3] |= 0x40000000;
286
287 nv_wo32(pgt, base + 0x0, tmp[0]);
288 nv_wo32(pgt, base + 0x4, tmp[1]);
289 nv_wo32(pgt, base + 0x8, tmp[2]);
290 nv_wo32(pgt, base + 0xc, tmp[3]);
183} 291}
184 292
185static struct ttm_backend_func nouveau_sgdma_backend = { 293static int
294nv44_sgdma_bind(struct ttm_backend *be, struct ttm_mem_reg *mem)
295{
296 struct nouveau_sgdma_be *nvbe = (struct nouveau_sgdma_be *)be;
297 struct drm_nouveau_private *dev_priv = nvbe->dev->dev_private;
298 struct nouveau_gpuobj *pgt = dev_priv->gart_info.sg_ctxdma;
299 dma_addr_t *list = nvbe->pages;
300 u32 pte = mem->start << 2, tmp[4];
301 u32 cnt = nvbe->nr_pages;
302 int i;
303
304 nvbe->offset = mem->start << PAGE_SHIFT;
305
306 if (pte & 0x0000000c) {
307 u32 max = 4 - ((pte >> 2) & 0x3);
308 u32 part = (cnt > max) ? max : cnt;
309 nv44_sgdma_fill(pgt, list, pte, part);
310 pte += (part << 2);
311 list += part;
312 cnt -= part;
313 }
314
315 while (cnt >= 4) {
316 for (i = 0; i < 4; i++)
317 tmp[i] = *list++ >> 12;
318 nv_wo32(pgt, pte + 0x0, tmp[0] >> 0 | tmp[1] << 27);
319 nv_wo32(pgt, pte + 0x4, tmp[1] >> 5 | tmp[2] << 22);
320 nv_wo32(pgt, pte + 0x8, tmp[2] >> 10 | tmp[3] << 17);
321 nv_wo32(pgt, pte + 0xc, tmp[3] >> 15 | 0x40000000);
322 pte += 0x10;
323 cnt -= 4;
324 }
325
326 if (cnt)
327 nv44_sgdma_fill(pgt, list, pte, cnt);
328
329 nv44_sgdma_flush(nvbe);
330 nvbe->bound = true;
331 return 0;
332}
333
334static int
335nv44_sgdma_unbind(struct ttm_backend *be)
336{
337 struct nouveau_sgdma_be *nvbe = (struct nouveau_sgdma_be *)be;
338 struct drm_nouveau_private *dev_priv = nvbe->dev->dev_private;
339 struct nouveau_gpuobj *pgt = dev_priv->gart_info.sg_ctxdma;
340 u32 pte = (nvbe->offset >> 12) << 2;
341 u32 cnt = nvbe->nr_pages;
342
343 if (pte & 0x0000000c) {
344 u32 max = 4 - ((pte >> 2) & 0x3);
345 u32 part = (cnt > max) ? max : cnt;
346 nv44_sgdma_fill(pgt, NULL, pte, part);
347 pte += (part << 2);
348 cnt -= part;
349 }
350
351 while (cnt >= 4) {
352 nv_wo32(pgt, pte + 0x0, 0x00000000);
353 nv_wo32(pgt, pte + 0x4, 0x00000000);
354 nv_wo32(pgt, pte + 0x8, 0x00000000);
355 nv_wo32(pgt, pte + 0xc, 0x00000000);
356 pte += 0x10;
357 cnt -= 4;
358 }
359
360 if (cnt)
361 nv44_sgdma_fill(pgt, NULL, pte, cnt);
362
363 nv44_sgdma_flush(nvbe);
364 nvbe->bound = false;
365 return 0;
366}
367
368static struct ttm_backend_func nv44_sgdma_backend = {
186 .populate = nouveau_sgdma_populate, 369 .populate = nouveau_sgdma_populate,
187 .clear = nouveau_sgdma_clear, 370 .clear = nouveau_sgdma_clear,
188 .bind = nouveau_sgdma_bind, 371 .bind = nv44_sgdma_bind,
189 .unbind = nouveau_sgdma_unbind, 372 .unbind = nv44_sgdma_unbind,
373 .destroy = nouveau_sgdma_destroy
374};
375
376static int
377nv50_sgdma_bind(struct ttm_backend *be, struct ttm_mem_reg *mem)
378{
379 struct nouveau_sgdma_be *nvbe = (struct nouveau_sgdma_be *)be;
380 struct nouveau_mem *node = mem->mm_node;
381 /* noop: bound in move_notify() */
382 node->pages = nvbe->pages;
383 nvbe->pages = (dma_addr_t *)node;
384 nvbe->bound = true;
385 return 0;
386}
387
388static int
389nv50_sgdma_unbind(struct ttm_backend *be)
390{
391 struct nouveau_sgdma_be *nvbe = (struct nouveau_sgdma_be *)be;
392 struct nouveau_mem *node = (struct nouveau_mem *)nvbe->pages;
393 /* noop: unbound in move_notify() */
394 nvbe->pages = node->pages;
395 node->pages = NULL;
396 nvbe->bound = false;
397 return 0;
398}
399
400static struct ttm_backend_func nv50_sgdma_backend = {
401 .populate = nouveau_sgdma_populate,
402 .clear = nouveau_sgdma_clear,
403 .bind = nv50_sgdma_bind,
404 .unbind = nv50_sgdma_unbind,
190 .destroy = nouveau_sgdma_destroy 405 .destroy = nouveau_sgdma_destroy
191}; 406};
192 407
@@ -196,17 +411,13 @@ nouveau_sgdma_init_ttm(struct drm_device *dev)
196 struct drm_nouveau_private *dev_priv = dev->dev_private; 411 struct drm_nouveau_private *dev_priv = dev->dev_private;
197 struct nouveau_sgdma_be *nvbe; 412 struct nouveau_sgdma_be *nvbe;
198 413
199 if (!dev_priv->gart_info.sg_ctxdma)
200 return NULL;
201
202 nvbe = kzalloc(sizeof(*nvbe), GFP_KERNEL); 414 nvbe = kzalloc(sizeof(*nvbe), GFP_KERNEL);
203 if (!nvbe) 415 if (!nvbe)
204 return NULL; 416 return NULL;
205 417
206 nvbe->dev = dev; 418 nvbe->dev = dev;
207 419
208 nvbe->backend.func = &nouveau_sgdma_backend; 420 nvbe->backend.func = dev_priv->gart_info.func;
209
210 return &nvbe->backend; 421 return &nvbe->backend;
211} 422}
212 423
@@ -214,73 +425,84 @@ int
214nouveau_sgdma_init(struct drm_device *dev) 425nouveau_sgdma_init(struct drm_device *dev)
215{ 426{
216 struct drm_nouveau_private *dev_priv = dev->dev_private; 427 struct drm_nouveau_private *dev_priv = dev->dev_private;
217 struct pci_dev *pdev = dev->pdev;
218 struct nouveau_gpuobj *gpuobj = NULL; 428 struct nouveau_gpuobj *gpuobj = NULL;
219 uint32_t aper_size, obj_size; 429 u32 aper_size, align;
220 int i, ret; 430 int ret;
221 431
222 if (dev_priv->card_type < NV_50) { 432 if (dev_priv->card_type >= NV_40 && drm_pci_device_is_pcie(dev))
223 aper_size = (64 * 1024 * 1024); 433 aper_size = 512 * 1024 * 1024;
224 obj_size = (aper_size >> NV_CTXDMA_PAGE_SHIFT) * 4; 434 else
225 obj_size += 8; /* ctxdma header */ 435 aper_size = 64 * 1024 * 1024;
226 } else { 436
227 /* 1 entire VM page table */ 437 /* Dear NVIDIA, NV44+ would like proper present bits in PTEs for
228 aper_size = (512 * 1024 * 1024); 438 * christmas. The cards before it have them, the cards after
229 obj_size = (aper_size >> NV_CTXDMA_PAGE_SHIFT) * 8; 439 * it have them, why is NV44 so unloved?
230 } 440 */
231 441 dev_priv->gart_info.dummy.page = alloc_page(GFP_DMA32 | GFP_KERNEL);
232 ret = nouveau_gpuobj_new(dev, NULL, obj_size, 16, 442 if (!dev_priv->gart_info.dummy.page)
233 NVOBJ_FLAG_ALLOW_NO_REFS | 443 return -ENOMEM;
234 NVOBJ_FLAG_ZERO_ALLOC |
235 NVOBJ_FLAG_ZERO_FREE, &gpuobj);
236 if (ret) {
237 NV_ERROR(dev, "Error creating sgdma object: %d\n", ret);
238 return ret;
239 }
240 444
241 dev_priv->gart_info.sg_dummy_page = 445 dev_priv->gart_info.dummy.addr =
242 alloc_page(GFP_KERNEL|__GFP_DMA32); 446 pci_map_page(dev->pdev, dev_priv->gart_info.dummy.page,
243 if (!dev_priv->gart_info.sg_dummy_page) { 447 0, PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);
244 nouveau_gpuobj_del(dev, &gpuobj); 448 if (pci_dma_mapping_error(dev->pdev, dev_priv->gart_info.dummy.addr)) {
449 NV_ERROR(dev, "error mapping dummy page\n");
450 __free_page(dev_priv->gart_info.dummy.page);
451 dev_priv->gart_info.dummy.page = NULL;
245 return -ENOMEM; 452 return -ENOMEM;
246 } 453 }
247 454
248 set_bit(PG_locked, &dev_priv->gart_info.sg_dummy_page->flags); 455 if (dev_priv->card_type >= NV_50) {
249 dev_priv->gart_info.sg_dummy_bus = 456 dev_priv->gart_info.aper_base = 0;
250 pci_map_page(pdev, dev_priv->gart_info.sg_dummy_page, 0, 457 dev_priv->gart_info.aper_size = aper_size;
251 PAGE_SIZE, PCI_DMA_BIDIRECTIONAL); 458 dev_priv->gart_info.type = NOUVEAU_GART_HW;
252 if (pci_dma_mapping_error(pdev, dev_priv->gart_info.sg_dummy_bus)) { 459 dev_priv->gart_info.func = &nv50_sgdma_backend;
253 nouveau_gpuobj_del(dev, &gpuobj); 460 } else
254 return -EFAULT; 461 if (0 && drm_pci_device_is_pcie(dev) &&
255 } 462 dev_priv->chipset > 0x40 && dev_priv->chipset != 0x45) {
463 if (nv44_graph_class(dev)) {
464 dev_priv->gart_info.func = &nv44_sgdma_backend;
465 align = 512 * 1024;
466 } else {
467 dev_priv->gart_info.func = &nv41_sgdma_backend;
468 align = 16;
469 }
256 470
257 if (dev_priv->card_type < NV_50) { 471 ret = nouveau_gpuobj_new(dev, NULL, aper_size / 1024, align,
258 /* Maybe use NV_DMA_TARGET_AGP for PCIE? NVIDIA do this, and 472 NVOBJ_FLAG_ZERO_ALLOC |
259 * confirmed to work on c51. Perhaps means NV_DMA_TARGET_PCIE 473 NVOBJ_FLAG_ZERO_FREE, &gpuobj);
260 * on those cards? */ 474 if (ret) {
261 nv_wo32(dev, gpuobj, 0, NV_CLASS_DMA_IN_MEMORY | 475 NV_ERROR(dev, "Error creating sgdma object: %d\n", ret);
262 (1 << 12) /* PT present */ | 476 return ret;
263 (0 << 13) /* PT *not* linear */ |
264 (NV_DMA_ACCESS_RW << 14) |
265 (NV_DMA_TARGET_PCI << 16));
266 nv_wo32(dev, gpuobj, 1, aper_size - 1);
267 for (i = 2; i < 2 + (aper_size >> 12); i++) {
268 nv_wo32(dev, gpuobj, i,
269 dev_priv->gart_info.sg_dummy_bus | 3);
270 } 477 }
478
479 dev_priv->gart_info.sg_ctxdma = gpuobj;
480 dev_priv->gart_info.aper_base = 0;
481 dev_priv->gart_info.aper_size = aper_size;
482 dev_priv->gart_info.type = NOUVEAU_GART_HW;
271 } else { 483 } else {
272 for (i = 0; i < obj_size; i += 8) { 484 ret = nouveau_gpuobj_new(dev, NULL, (aper_size / 1024) + 8, 16,
273 nv_wo32(dev, gpuobj, (i+0)/4, 485 NVOBJ_FLAG_ZERO_ALLOC |
274 dev_priv->gart_info.sg_dummy_bus | 0x21); 486 NVOBJ_FLAG_ZERO_FREE, &gpuobj);
275 nv_wo32(dev, gpuobj, (i+4)/4, 0); 487 if (ret) {
488 NV_ERROR(dev, "Error creating sgdma object: %d\n", ret);
489 return ret;
276 } 490 }
491
492 nv_wo32(gpuobj, 0, NV_CLASS_DMA_IN_MEMORY |
493 (1 << 12) /* PT present */ |
494 (0 << 13) /* PT *not* linear */ |
495 (0 << 14) /* RW */ |
496 (2 << 16) /* PCI */);
497 nv_wo32(gpuobj, 4, aper_size - 1);
498
499 dev_priv->gart_info.sg_ctxdma = gpuobj;
500 dev_priv->gart_info.aper_base = 0;
501 dev_priv->gart_info.aper_size = aper_size;
502 dev_priv->gart_info.type = NOUVEAU_GART_PDMA;
503 dev_priv->gart_info.func = &nv04_sgdma_backend;
277 } 504 }
278 dev_priv->engine.instmem.flush(dev);
279 505
280 dev_priv->gart_info.type = NOUVEAU_GART_SGDMA;
281 dev_priv->gart_info.aper_base = 0;
282 dev_priv->gart_info.aper_size = aper_size;
283 dev_priv->gart_info.sg_ctxdma = gpuobj;
284 return 0; 506 return 0;
285} 507}
286 508
@@ -289,31 +511,25 @@ nouveau_sgdma_takedown(struct drm_device *dev)
289{ 511{
290 struct drm_nouveau_private *dev_priv = dev->dev_private; 512 struct drm_nouveau_private *dev_priv = dev->dev_private;
291 513
292 if (dev_priv->gart_info.sg_dummy_page) { 514 nouveau_gpuobj_ref(NULL, &dev_priv->gart_info.sg_ctxdma);
293 pci_unmap_page(dev->pdev, dev_priv->gart_info.sg_dummy_bus,
294 NV_CTXDMA_PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);
295 unlock_page(dev_priv->gart_info.sg_dummy_page);
296 __free_page(dev_priv->gart_info.sg_dummy_page);
297 dev_priv->gart_info.sg_dummy_page = NULL;
298 dev_priv->gart_info.sg_dummy_bus = 0;
299 }
300 515
301 nouveau_gpuobj_del(dev, &dev_priv->gart_info.sg_ctxdma); 516 if (dev_priv->gart_info.dummy.page) {
517 pci_unmap_page(dev->pdev, dev_priv->gart_info.dummy.addr,
518 PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);
519 __free_page(dev_priv->gart_info.dummy.page);
520 dev_priv->gart_info.dummy.page = NULL;
521 }
302} 522}
303 523
304int 524uint32_t
305nouveau_sgdma_get_page(struct drm_device *dev, uint32_t offset, uint32_t *page) 525nouveau_sgdma_get_physical(struct drm_device *dev, uint32_t offset)
306{ 526{
307 struct drm_nouveau_private *dev_priv = dev->dev_private; 527 struct drm_nouveau_private *dev_priv = dev->dev_private;
308 struct nouveau_gpuobj *gpuobj = dev_priv->gart_info.sg_ctxdma; 528 struct nouveau_gpuobj *gpuobj = dev_priv->gart_info.sg_ctxdma;
309 int pte; 529 int pte = (offset >> NV_CTXDMA_PAGE_SHIFT) + 2;
310 530
311 pte = (offset >> NV_CTXDMA_PAGE_SHIFT); 531 BUG_ON(dev_priv->card_type >= NV_50);
312 if (dev_priv->card_type < NV_50) {
313 *page = nv_ro32(dev, gpuobj, (pte + 2)) & ~NV_CTXDMA_PAGE_MASK;
314 return 0;
315 }
316 532
317 NV_ERROR(dev, "Unimplemented on NV50\n"); 533 return (nv_ro32(gpuobj, 4 * pte) & ~NV_CTXDMA_PAGE_MASK) |
318 return -EINVAL; 534 (offset & NV_CTXDMA_PAGE_MASK);
319} 535}
diff --git a/drivers/gpu/drm/nouveau/nouveau_state.c b/drivers/gpu/drm/nouveau/nouveau_state.c
index 989322be3728..731acea865b5 100644
--- a/drivers/gpu/drm/nouveau/nouveau_state.c
+++ b/drivers/gpu/drm/nouveau/nouveau_state.c
@@ -35,6 +35,8 @@
35#include "nouveau_drv.h" 35#include "nouveau_drv.h"
36#include "nouveau_drm.h" 36#include "nouveau_drm.h"
37#include "nouveau_fbcon.h" 37#include "nouveau_fbcon.h"
38#include "nouveau_ramht.h"
39#include "nouveau_pm.h"
38#include "nv50_display.h" 40#include "nv50_display.h"
39 41
40static void nouveau_stub_takedown(struct drm_device *dev) {} 42static void nouveau_stub_takedown(struct drm_device *dev) {}
@@ -51,10 +53,10 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev)
51 engine->instmem.takedown = nv04_instmem_takedown; 53 engine->instmem.takedown = nv04_instmem_takedown;
52 engine->instmem.suspend = nv04_instmem_suspend; 54 engine->instmem.suspend = nv04_instmem_suspend;
53 engine->instmem.resume = nv04_instmem_resume; 55 engine->instmem.resume = nv04_instmem_resume;
54 engine->instmem.populate = nv04_instmem_populate; 56 engine->instmem.get = nv04_instmem_get;
55 engine->instmem.clear = nv04_instmem_clear; 57 engine->instmem.put = nv04_instmem_put;
56 engine->instmem.bind = nv04_instmem_bind; 58 engine->instmem.map = nv04_instmem_map;
57 engine->instmem.unbind = nv04_instmem_unbind; 59 engine->instmem.unmap = nv04_instmem_unmap;
58 engine->instmem.flush = nv04_instmem_flush; 60 engine->instmem.flush = nv04_instmem_flush;
59 engine->mc.init = nv04_mc_init; 61 engine->mc.init = nv04_mc_init;
60 engine->mc.takedown = nv04_mc_takedown; 62 engine->mc.takedown = nv04_mc_takedown;
@@ -63,22 +65,12 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev)
63 engine->timer.takedown = nv04_timer_takedown; 65 engine->timer.takedown = nv04_timer_takedown;
64 engine->fb.init = nv04_fb_init; 66 engine->fb.init = nv04_fb_init;
65 engine->fb.takedown = nv04_fb_takedown; 67 engine->fb.takedown = nv04_fb_takedown;
66 engine->graph.grclass = nv04_graph_grclass;
67 engine->graph.init = nv04_graph_init;
68 engine->graph.takedown = nv04_graph_takedown;
69 engine->graph.fifo_access = nv04_graph_fifo_access;
70 engine->graph.channel = nv04_graph_channel;
71 engine->graph.create_context = nv04_graph_create_context;
72 engine->graph.destroy_context = nv04_graph_destroy_context;
73 engine->graph.load_context = nv04_graph_load_context;
74 engine->graph.unload_context = nv04_graph_unload_context;
75 engine->fifo.channels = 16; 68 engine->fifo.channels = 16;
76 engine->fifo.init = nv04_fifo_init; 69 engine->fifo.init = nv04_fifo_init;
77 engine->fifo.takedown = nouveau_stub_takedown; 70 engine->fifo.takedown = nv04_fifo_fini;
78 engine->fifo.disable = nv04_fifo_disable; 71 engine->fifo.disable = nv04_fifo_disable;
79 engine->fifo.enable = nv04_fifo_enable; 72 engine->fifo.enable = nv04_fifo_enable;
80 engine->fifo.reassign = nv04_fifo_reassign; 73 engine->fifo.reassign = nv04_fifo_reassign;
81 engine->fifo.cache_flush = nv04_fifo_cache_flush;
82 engine->fifo.cache_pull = nv04_fifo_cache_pull; 74 engine->fifo.cache_pull = nv04_fifo_cache_pull;
83 engine->fifo.channel_id = nv04_fifo_channel_id; 75 engine->fifo.channel_id = nv04_fifo_channel_id;
84 engine->fifo.create_context = nv04_fifo_create_context; 76 engine->fifo.create_context = nv04_fifo_create_context;
@@ -95,16 +87,21 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev)
95 engine->gpio.get = NULL; 87 engine->gpio.get = NULL;
96 engine->gpio.set = NULL; 88 engine->gpio.set = NULL;
97 engine->gpio.irq_enable = NULL; 89 engine->gpio.irq_enable = NULL;
90 engine->pm.clock_get = nv04_pm_clock_get;
91 engine->pm.clock_pre = nv04_pm_clock_pre;
92 engine->pm.clock_set = nv04_pm_clock_set;
93 engine->vram.init = nouveau_mem_detect;
94 engine->vram.flags_valid = nouveau_mem_flags_valid;
98 break; 95 break;
99 case 0x10: 96 case 0x10:
100 engine->instmem.init = nv04_instmem_init; 97 engine->instmem.init = nv04_instmem_init;
101 engine->instmem.takedown = nv04_instmem_takedown; 98 engine->instmem.takedown = nv04_instmem_takedown;
102 engine->instmem.suspend = nv04_instmem_suspend; 99 engine->instmem.suspend = nv04_instmem_suspend;
103 engine->instmem.resume = nv04_instmem_resume; 100 engine->instmem.resume = nv04_instmem_resume;
104 engine->instmem.populate = nv04_instmem_populate; 101 engine->instmem.get = nv04_instmem_get;
105 engine->instmem.clear = nv04_instmem_clear; 102 engine->instmem.put = nv04_instmem_put;
106 engine->instmem.bind = nv04_instmem_bind; 103 engine->instmem.map = nv04_instmem_map;
107 engine->instmem.unbind = nv04_instmem_unbind; 104 engine->instmem.unmap = nv04_instmem_unmap;
108 engine->instmem.flush = nv04_instmem_flush; 105 engine->instmem.flush = nv04_instmem_flush;
109 engine->mc.init = nv04_mc_init; 106 engine->mc.init = nv04_mc_init;
110 engine->mc.takedown = nv04_mc_takedown; 107 engine->mc.takedown = nv04_mc_takedown;
@@ -113,28 +110,19 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev)
113 engine->timer.takedown = nv04_timer_takedown; 110 engine->timer.takedown = nv04_timer_takedown;
114 engine->fb.init = nv10_fb_init; 111 engine->fb.init = nv10_fb_init;
115 engine->fb.takedown = nv10_fb_takedown; 112 engine->fb.takedown = nv10_fb_takedown;
116 engine->fb.set_region_tiling = nv10_fb_set_region_tiling; 113 engine->fb.init_tile_region = nv10_fb_init_tile_region;
117 engine->graph.grclass = nv10_graph_grclass; 114 engine->fb.set_tile_region = nv10_fb_set_tile_region;
118 engine->graph.init = nv10_graph_init; 115 engine->fb.free_tile_region = nv10_fb_free_tile_region;
119 engine->graph.takedown = nv10_graph_takedown;
120 engine->graph.channel = nv10_graph_channel;
121 engine->graph.create_context = nv10_graph_create_context;
122 engine->graph.destroy_context = nv10_graph_destroy_context;
123 engine->graph.fifo_access = nv04_graph_fifo_access;
124 engine->graph.load_context = nv10_graph_load_context;
125 engine->graph.unload_context = nv10_graph_unload_context;
126 engine->graph.set_region_tiling = nv10_graph_set_region_tiling;
127 engine->fifo.channels = 32; 116 engine->fifo.channels = 32;
128 engine->fifo.init = nv10_fifo_init; 117 engine->fifo.init = nv10_fifo_init;
129 engine->fifo.takedown = nouveau_stub_takedown; 118 engine->fifo.takedown = nv04_fifo_fini;
130 engine->fifo.disable = nv04_fifo_disable; 119 engine->fifo.disable = nv04_fifo_disable;
131 engine->fifo.enable = nv04_fifo_enable; 120 engine->fifo.enable = nv04_fifo_enable;
132 engine->fifo.reassign = nv04_fifo_reassign; 121 engine->fifo.reassign = nv04_fifo_reassign;
133 engine->fifo.cache_flush = nv04_fifo_cache_flush;
134 engine->fifo.cache_pull = nv04_fifo_cache_pull; 122 engine->fifo.cache_pull = nv04_fifo_cache_pull;
135 engine->fifo.channel_id = nv10_fifo_channel_id; 123 engine->fifo.channel_id = nv10_fifo_channel_id;
136 engine->fifo.create_context = nv10_fifo_create_context; 124 engine->fifo.create_context = nv10_fifo_create_context;
137 engine->fifo.destroy_context = nv10_fifo_destroy_context; 125 engine->fifo.destroy_context = nv04_fifo_destroy_context;
138 engine->fifo.load_context = nv10_fifo_load_context; 126 engine->fifo.load_context = nv10_fifo_load_context;
139 engine->fifo.unload_context = nv10_fifo_unload_context; 127 engine->fifo.unload_context = nv10_fifo_unload_context;
140 engine->display.early_init = nv04_display_early_init; 128 engine->display.early_init = nv04_display_early_init;
@@ -147,16 +135,21 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev)
147 engine->gpio.get = nv10_gpio_get; 135 engine->gpio.get = nv10_gpio_get;
148 engine->gpio.set = nv10_gpio_set; 136 engine->gpio.set = nv10_gpio_set;
149 engine->gpio.irq_enable = NULL; 137 engine->gpio.irq_enable = NULL;
138 engine->pm.clock_get = nv04_pm_clock_get;
139 engine->pm.clock_pre = nv04_pm_clock_pre;
140 engine->pm.clock_set = nv04_pm_clock_set;
141 engine->vram.init = nouveau_mem_detect;
142 engine->vram.flags_valid = nouveau_mem_flags_valid;
150 break; 143 break;
151 case 0x20: 144 case 0x20:
152 engine->instmem.init = nv04_instmem_init; 145 engine->instmem.init = nv04_instmem_init;
153 engine->instmem.takedown = nv04_instmem_takedown; 146 engine->instmem.takedown = nv04_instmem_takedown;
154 engine->instmem.suspend = nv04_instmem_suspend; 147 engine->instmem.suspend = nv04_instmem_suspend;
155 engine->instmem.resume = nv04_instmem_resume; 148 engine->instmem.resume = nv04_instmem_resume;
156 engine->instmem.populate = nv04_instmem_populate; 149 engine->instmem.get = nv04_instmem_get;
157 engine->instmem.clear = nv04_instmem_clear; 150 engine->instmem.put = nv04_instmem_put;
158 engine->instmem.bind = nv04_instmem_bind; 151 engine->instmem.map = nv04_instmem_map;
159 engine->instmem.unbind = nv04_instmem_unbind; 152 engine->instmem.unmap = nv04_instmem_unmap;
160 engine->instmem.flush = nv04_instmem_flush; 153 engine->instmem.flush = nv04_instmem_flush;
161 engine->mc.init = nv04_mc_init; 154 engine->mc.init = nv04_mc_init;
162 engine->mc.takedown = nv04_mc_takedown; 155 engine->mc.takedown = nv04_mc_takedown;
@@ -165,28 +158,19 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev)
165 engine->timer.takedown = nv04_timer_takedown; 158 engine->timer.takedown = nv04_timer_takedown;
166 engine->fb.init = nv10_fb_init; 159 engine->fb.init = nv10_fb_init;
167 engine->fb.takedown = nv10_fb_takedown; 160 engine->fb.takedown = nv10_fb_takedown;
168 engine->fb.set_region_tiling = nv10_fb_set_region_tiling; 161 engine->fb.init_tile_region = nv10_fb_init_tile_region;
169 engine->graph.grclass = nv20_graph_grclass; 162 engine->fb.set_tile_region = nv10_fb_set_tile_region;
170 engine->graph.init = nv20_graph_init; 163 engine->fb.free_tile_region = nv10_fb_free_tile_region;
171 engine->graph.takedown = nv20_graph_takedown;
172 engine->graph.channel = nv10_graph_channel;
173 engine->graph.create_context = nv20_graph_create_context;
174 engine->graph.destroy_context = nv20_graph_destroy_context;
175 engine->graph.fifo_access = nv04_graph_fifo_access;
176 engine->graph.load_context = nv20_graph_load_context;
177 engine->graph.unload_context = nv20_graph_unload_context;
178 engine->graph.set_region_tiling = nv20_graph_set_region_tiling;
179 engine->fifo.channels = 32; 164 engine->fifo.channels = 32;
180 engine->fifo.init = nv10_fifo_init; 165 engine->fifo.init = nv10_fifo_init;
181 engine->fifo.takedown = nouveau_stub_takedown; 166 engine->fifo.takedown = nv04_fifo_fini;
182 engine->fifo.disable = nv04_fifo_disable; 167 engine->fifo.disable = nv04_fifo_disable;
183 engine->fifo.enable = nv04_fifo_enable; 168 engine->fifo.enable = nv04_fifo_enable;
184 engine->fifo.reassign = nv04_fifo_reassign; 169 engine->fifo.reassign = nv04_fifo_reassign;
185 engine->fifo.cache_flush = nv04_fifo_cache_flush;
186 engine->fifo.cache_pull = nv04_fifo_cache_pull; 170 engine->fifo.cache_pull = nv04_fifo_cache_pull;
187 engine->fifo.channel_id = nv10_fifo_channel_id; 171 engine->fifo.channel_id = nv10_fifo_channel_id;
188 engine->fifo.create_context = nv10_fifo_create_context; 172 engine->fifo.create_context = nv10_fifo_create_context;
189 engine->fifo.destroy_context = nv10_fifo_destroy_context; 173 engine->fifo.destroy_context = nv04_fifo_destroy_context;
190 engine->fifo.load_context = nv10_fifo_load_context; 174 engine->fifo.load_context = nv10_fifo_load_context;
191 engine->fifo.unload_context = nv10_fifo_unload_context; 175 engine->fifo.unload_context = nv10_fifo_unload_context;
192 engine->display.early_init = nv04_display_early_init; 176 engine->display.early_init = nv04_display_early_init;
@@ -199,16 +183,21 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev)
199 engine->gpio.get = nv10_gpio_get; 183 engine->gpio.get = nv10_gpio_get;
200 engine->gpio.set = nv10_gpio_set; 184 engine->gpio.set = nv10_gpio_set;
201 engine->gpio.irq_enable = NULL; 185 engine->gpio.irq_enable = NULL;
186 engine->pm.clock_get = nv04_pm_clock_get;
187 engine->pm.clock_pre = nv04_pm_clock_pre;
188 engine->pm.clock_set = nv04_pm_clock_set;
189 engine->vram.init = nouveau_mem_detect;
190 engine->vram.flags_valid = nouveau_mem_flags_valid;
202 break; 191 break;
203 case 0x30: 192 case 0x30:
204 engine->instmem.init = nv04_instmem_init; 193 engine->instmem.init = nv04_instmem_init;
205 engine->instmem.takedown = nv04_instmem_takedown; 194 engine->instmem.takedown = nv04_instmem_takedown;
206 engine->instmem.suspend = nv04_instmem_suspend; 195 engine->instmem.suspend = nv04_instmem_suspend;
207 engine->instmem.resume = nv04_instmem_resume; 196 engine->instmem.resume = nv04_instmem_resume;
208 engine->instmem.populate = nv04_instmem_populate; 197 engine->instmem.get = nv04_instmem_get;
209 engine->instmem.clear = nv04_instmem_clear; 198 engine->instmem.put = nv04_instmem_put;
210 engine->instmem.bind = nv04_instmem_bind; 199 engine->instmem.map = nv04_instmem_map;
211 engine->instmem.unbind = nv04_instmem_unbind; 200 engine->instmem.unmap = nv04_instmem_unmap;
212 engine->instmem.flush = nv04_instmem_flush; 201 engine->instmem.flush = nv04_instmem_flush;
213 engine->mc.init = nv04_mc_init; 202 engine->mc.init = nv04_mc_init;
214 engine->mc.takedown = nv04_mc_takedown; 203 engine->mc.takedown = nv04_mc_takedown;
@@ -217,28 +206,19 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev)
217 engine->timer.takedown = nv04_timer_takedown; 206 engine->timer.takedown = nv04_timer_takedown;
218 engine->fb.init = nv30_fb_init; 207 engine->fb.init = nv30_fb_init;
219 engine->fb.takedown = nv30_fb_takedown; 208 engine->fb.takedown = nv30_fb_takedown;
220 engine->fb.set_region_tiling = nv10_fb_set_region_tiling; 209 engine->fb.init_tile_region = nv30_fb_init_tile_region;
221 engine->graph.grclass = nv30_graph_grclass; 210 engine->fb.set_tile_region = nv10_fb_set_tile_region;
222 engine->graph.init = nv30_graph_init; 211 engine->fb.free_tile_region = nv30_fb_free_tile_region;
223 engine->graph.takedown = nv20_graph_takedown;
224 engine->graph.fifo_access = nv04_graph_fifo_access;
225 engine->graph.channel = nv10_graph_channel;
226 engine->graph.create_context = nv20_graph_create_context;
227 engine->graph.destroy_context = nv20_graph_destroy_context;
228 engine->graph.load_context = nv20_graph_load_context;
229 engine->graph.unload_context = nv20_graph_unload_context;
230 engine->graph.set_region_tiling = nv20_graph_set_region_tiling;
231 engine->fifo.channels = 32; 212 engine->fifo.channels = 32;
232 engine->fifo.init = nv10_fifo_init; 213 engine->fifo.init = nv10_fifo_init;
233 engine->fifo.takedown = nouveau_stub_takedown; 214 engine->fifo.takedown = nv04_fifo_fini;
234 engine->fifo.disable = nv04_fifo_disable; 215 engine->fifo.disable = nv04_fifo_disable;
235 engine->fifo.enable = nv04_fifo_enable; 216 engine->fifo.enable = nv04_fifo_enable;
236 engine->fifo.reassign = nv04_fifo_reassign; 217 engine->fifo.reassign = nv04_fifo_reassign;
237 engine->fifo.cache_flush = nv04_fifo_cache_flush;
238 engine->fifo.cache_pull = nv04_fifo_cache_pull; 218 engine->fifo.cache_pull = nv04_fifo_cache_pull;
239 engine->fifo.channel_id = nv10_fifo_channel_id; 219 engine->fifo.channel_id = nv10_fifo_channel_id;
240 engine->fifo.create_context = nv10_fifo_create_context; 220 engine->fifo.create_context = nv10_fifo_create_context;
241 engine->fifo.destroy_context = nv10_fifo_destroy_context; 221 engine->fifo.destroy_context = nv04_fifo_destroy_context;
242 engine->fifo.load_context = nv10_fifo_load_context; 222 engine->fifo.load_context = nv10_fifo_load_context;
243 engine->fifo.unload_context = nv10_fifo_unload_context; 223 engine->fifo.unload_context = nv10_fifo_unload_context;
244 engine->display.early_init = nv04_display_early_init; 224 engine->display.early_init = nv04_display_early_init;
@@ -251,6 +231,13 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev)
251 engine->gpio.get = nv10_gpio_get; 231 engine->gpio.get = nv10_gpio_get;
252 engine->gpio.set = nv10_gpio_set; 232 engine->gpio.set = nv10_gpio_set;
253 engine->gpio.irq_enable = NULL; 233 engine->gpio.irq_enable = NULL;
234 engine->pm.clock_get = nv04_pm_clock_get;
235 engine->pm.clock_pre = nv04_pm_clock_pre;
236 engine->pm.clock_set = nv04_pm_clock_set;
237 engine->pm.voltage_get = nouveau_voltage_gpio_get;
238 engine->pm.voltage_set = nouveau_voltage_gpio_set;
239 engine->vram.init = nouveau_mem_detect;
240 engine->vram.flags_valid = nouveau_mem_flags_valid;
254 break; 241 break;
255 case 0x40: 242 case 0x40:
256 case 0x60: 243 case 0x60:
@@ -258,10 +245,10 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev)
258 engine->instmem.takedown = nv04_instmem_takedown; 245 engine->instmem.takedown = nv04_instmem_takedown;
259 engine->instmem.suspend = nv04_instmem_suspend; 246 engine->instmem.suspend = nv04_instmem_suspend;
260 engine->instmem.resume = nv04_instmem_resume; 247 engine->instmem.resume = nv04_instmem_resume;
261 engine->instmem.populate = nv04_instmem_populate; 248 engine->instmem.get = nv04_instmem_get;
262 engine->instmem.clear = nv04_instmem_clear; 249 engine->instmem.put = nv04_instmem_put;
263 engine->instmem.bind = nv04_instmem_bind; 250 engine->instmem.map = nv04_instmem_map;
264 engine->instmem.unbind = nv04_instmem_unbind; 251 engine->instmem.unmap = nv04_instmem_unmap;
265 engine->instmem.flush = nv04_instmem_flush; 252 engine->instmem.flush = nv04_instmem_flush;
266 engine->mc.init = nv40_mc_init; 253 engine->mc.init = nv40_mc_init;
267 engine->mc.takedown = nv40_mc_takedown; 254 engine->mc.takedown = nv40_mc_takedown;
@@ -270,28 +257,19 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev)
270 engine->timer.takedown = nv04_timer_takedown; 257 engine->timer.takedown = nv04_timer_takedown;
271 engine->fb.init = nv40_fb_init; 258 engine->fb.init = nv40_fb_init;
272 engine->fb.takedown = nv40_fb_takedown; 259 engine->fb.takedown = nv40_fb_takedown;
273 engine->fb.set_region_tiling = nv40_fb_set_region_tiling; 260 engine->fb.init_tile_region = nv30_fb_init_tile_region;
274 engine->graph.grclass = nv40_graph_grclass; 261 engine->fb.set_tile_region = nv40_fb_set_tile_region;
275 engine->graph.init = nv40_graph_init; 262 engine->fb.free_tile_region = nv30_fb_free_tile_region;
276 engine->graph.takedown = nv40_graph_takedown;
277 engine->graph.fifo_access = nv04_graph_fifo_access;
278 engine->graph.channel = nv40_graph_channel;
279 engine->graph.create_context = nv40_graph_create_context;
280 engine->graph.destroy_context = nv40_graph_destroy_context;
281 engine->graph.load_context = nv40_graph_load_context;
282 engine->graph.unload_context = nv40_graph_unload_context;
283 engine->graph.set_region_tiling = nv40_graph_set_region_tiling;
284 engine->fifo.channels = 32; 263 engine->fifo.channels = 32;
285 engine->fifo.init = nv40_fifo_init; 264 engine->fifo.init = nv40_fifo_init;
286 engine->fifo.takedown = nouveau_stub_takedown; 265 engine->fifo.takedown = nv04_fifo_fini;
287 engine->fifo.disable = nv04_fifo_disable; 266 engine->fifo.disable = nv04_fifo_disable;
288 engine->fifo.enable = nv04_fifo_enable; 267 engine->fifo.enable = nv04_fifo_enable;
289 engine->fifo.reassign = nv04_fifo_reassign; 268 engine->fifo.reassign = nv04_fifo_reassign;
290 engine->fifo.cache_flush = nv04_fifo_cache_flush;
291 engine->fifo.cache_pull = nv04_fifo_cache_pull; 269 engine->fifo.cache_pull = nv04_fifo_cache_pull;
292 engine->fifo.channel_id = nv10_fifo_channel_id; 270 engine->fifo.channel_id = nv10_fifo_channel_id;
293 engine->fifo.create_context = nv40_fifo_create_context; 271 engine->fifo.create_context = nv40_fifo_create_context;
294 engine->fifo.destroy_context = nv40_fifo_destroy_context; 272 engine->fifo.destroy_context = nv04_fifo_destroy_context;
295 engine->fifo.load_context = nv40_fifo_load_context; 273 engine->fifo.load_context = nv40_fifo_load_context;
296 engine->fifo.unload_context = nv40_fifo_unload_context; 274 engine->fifo.unload_context = nv40_fifo_unload_context;
297 engine->display.early_init = nv04_display_early_init; 275 engine->display.early_init = nv04_display_early_init;
@@ -304,6 +282,14 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev)
304 engine->gpio.get = nv10_gpio_get; 282 engine->gpio.get = nv10_gpio_get;
305 engine->gpio.set = nv10_gpio_set; 283 engine->gpio.set = nv10_gpio_set;
306 engine->gpio.irq_enable = NULL; 284 engine->gpio.irq_enable = NULL;
285 engine->pm.clock_get = nv04_pm_clock_get;
286 engine->pm.clock_pre = nv04_pm_clock_pre;
287 engine->pm.clock_set = nv04_pm_clock_set;
288 engine->pm.voltage_get = nouveau_voltage_gpio_get;
289 engine->pm.voltage_set = nouveau_voltage_gpio_set;
290 engine->pm.temp_get = nv40_temp_get;
291 engine->vram.init = nouveau_mem_detect;
292 engine->vram.flags_valid = nouveau_mem_flags_valid;
307 break; 293 break;
308 case 0x50: 294 case 0x50:
309 case 0x80: /* gotta love NVIDIA's consistency.. */ 295 case 0x80: /* gotta love NVIDIA's consistency.. */
@@ -313,10 +299,10 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev)
313 engine->instmem.takedown = nv50_instmem_takedown; 299 engine->instmem.takedown = nv50_instmem_takedown;
314 engine->instmem.suspend = nv50_instmem_suspend; 300 engine->instmem.suspend = nv50_instmem_suspend;
315 engine->instmem.resume = nv50_instmem_resume; 301 engine->instmem.resume = nv50_instmem_resume;
316 engine->instmem.populate = nv50_instmem_populate; 302 engine->instmem.get = nv50_instmem_get;
317 engine->instmem.clear = nv50_instmem_clear; 303 engine->instmem.put = nv50_instmem_put;
318 engine->instmem.bind = nv50_instmem_bind; 304 engine->instmem.map = nv50_instmem_map;
319 engine->instmem.unbind = nv50_instmem_unbind; 305 engine->instmem.unmap = nv50_instmem_unmap;
320 if (dev_priv->chipset == 0x50) 306 if (dev_priv->chipset == 0x50)
321 engine->instmem.flush = nv50_instmem_flush; 307 engine->instmem.flush = nv50_instmem_flush;
322 else 308 else
@@ -328,15 +314,6 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev)
328 engine->timer.takedown = nv04_timer_takedown; 314 engine->timer.takedown = nv04_timer_takedown;
329 engine->fb.init = nv50_fb_init; 315 engine->fb.init = nv50_fb_init;
330 engine->fb.takedown = nv50_fb_takedown; 316 engine->fb.takedown = nv50_fb_takedown;
331 engine->graph.grclass = nv50_graph_grclass;
332 engine->graph.init = nv50_graph_init;
333 engine->graph.takedown = nv50_graph_takedown;
334 engine->graph.fifo_access = nv50_graph_fifo_access;
335 engine->graph.channel = nv50_graph_channel;
336 engine->graph.create_context = nv50_graph_create_context;
337 engine->graph.destroy_context = nv50_graph_destroy_context;
338 engine->graph.load_context = nv50_graph_load_context;
339 engine->graph.unload_context = nv50_graph_unload_context;
340 engine->fifo.channels = 128; 317 engine->fifo.channels = 128;
341 engine->fifo.init = nv50_fifo_init; 318 engine->fifo.init = nv50_fifo_init;
342 engine->fifo.takedown = nv50_fifo_takedown; 319 engine->fifo.takedown = nv50_fifo_takedown;
@@ -348,27 +325,61 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev)
348 engine->fifo.destroy_context = nv50_fifo_destroy_context; 325 engine->fifo.destroy_context = nv50_fifo_destroy_context;
349 engine->fifo.load_context = nv50_fifo_load_context; 326 engine->fifo.load_context = nv50_fifo_load_context;
350 engine->fifo.unload_context = nv50_fifo_unload_context; 327 engine->fifo.unload_context = nv50_fifo_unload_context;
328 engine->fifo.tlb_flush = nv50_fifo_tlb_flush;
351 engine->display.early_init = nv50_display_early_init; 329 engine->display.early_init = nv50_display_early_init;
352 engine->display.late_takedown = nv50_display_late_takedown; 330 engine->display.late_takedown = nv50_display_late_takedown;
353 engine->display.create = nv50_display_create; 331 engine->display.create = nv50_display_create;
354 engine->display.init = nv50_display_init; 332 engine->display.init = nv50_display_init;
355 engine->display.destroy = nv50_display_destroy; 333 engine->display.destroy = nv50_display_destroy;
356 engine->gpio.init = nv50_gpio_init; 334 engine->gpio.init = nv50_gpio_init;
357 engine->gpio.takedown = nouveau_stub_takedown; 335 engine->gpio.takedown = nv50_gpio_fini;
358 engine->gpio.get = nv50_gpio_get; 336 engine->gpio.get = nv50_gpio_get;
359 engine->gpio.set = nv50_gpio_set; 337 engine->gpio.set = nv50_gpio_set;
338 engine->gpio.irq_register = nv50_gpio_irq_register;
339 engine->gpio.irq_unregister = nv50_gpio_irq_unregister;
360 engine->gpio.irq_enable = nv50_gpio_irq_enable; 340 engine->gpio.irq_enable = nv50_gpio_irq_enable;
341 switch (dev_priv->chipset) {
342 case 0x84:
343 case 0x86:
344 case 0x92:
345 case 0x94:
346 case 0x96:
347 case 0x98:
348 case 0xa0:
349 case 0xaa:
350 case 0xac:
351 case 0x50:
352 engine->pm.clock_get = nv50_pm_clock_get;
353 engine->pm.clock_pre = nv50_pm_clock_pre;
354 engine->pm.clock_set = nv50_pm_clock_set;
355 break;
356 default:
357 engine->pm.clock_get = nva3_pm_clock_get;
358 engine->pm.clock_pre = nva3_pm_clock_pre;
359 engine->pm.clock_set = nva3_pm_clock_set;
360 break;
361 }
362 engine->pm.voltage_get = nouveau_voltage_gpio_get;
363 engine->pm.voltage_set = nouveau_voltage_gpio_set;
364 if (dev_priv->chipset >= 0x84)
365 engine->pm.temp_get = nv84_temp_get;
366 else
367 engine->pm.temp_get = nv40_temp_get;
368 engine->vram.init = nv50_vram_init;
369 engine->vram.get = nv50_vram_new;
370 engine->vram.put = nv50_vram_del;
371 engine->vram.flags_valid = nv50_vram_flags_valid;
361 break; 372 break;
362 case 0xC0: 373 case 0xC0:
363 engine->instmem.init = nvc0_instmem_init; 374 engine->instmem.init = nvc0_instmem_init;
364 engine->instmem.takedown = nvc0_instmem_takedown; 375 engine->instmem.takedown = nvc0_instmem_takedown;
365 engine->instmem.suspend = nvc0_instmem_suspend; 376 engine->instmem.suspend = nvc0_instmem_suspend;
366 engine->instmem.resume = nvc0_instmem_resume; 377 engine->instmem.resume = nvc0_instmem_resume;
367 engine->instmem.populate = nvc0_instmem_populate; 378 engine->instmem.get = nv50_instmem_get;
368 engine->instmem.clear = nvc0_instmem_clear; 379 engine->instmem.put = nv50_instmem_put;
369 engine->instmem.bind = nvc0_instmem_bind; 380 engine->instmem.map = nv50_instmem_map;
370 engine->instmem.unbind = nvc0_instmem_unbind; 381 engine->instmem.unmap = nv50_instmem_unmap;
371 engine->instmem.flush = nvc0_instmem_flush; 382 engine->instmem.flush = nv84_instmem_flush;
372 engine->mc.init = nv50_mc_init; 383 engine->mc.init = nv50_mc_init;
373 engine->mc.takedown = nv50_mc_takedown; 384 engine->mc.takedown = nv50_mc_takedown;
374 engine->timer.init = nv04_timer_init; 385 engine->timer.init = nv04_timer_init;
@@ -376,15 +387,6 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev)
376 engine->timer.takedown = nv04_timer_takedown; 387 engine->timer.takedown = nv04_timer_takedown;
377 engine->fb.init = nvc0_fb_init; 388 engine->fb.init = nvc0_fb_init;
378 engine->fb.takedown = nvc0_fb_takedown; 389 engine->fb.takedown = nvc0_fb_takedown;
379 engine->graph.grclass = NULL; //nvc0_graph_grclass;
380 engine->graph.init = nvc0_graph_init;
381 engine->graph.takedown = nvc0_graph_takedown;
382 engine->graph.fifo_access = nvc0_graph_fifo_access;
383 engine->graph.channel = nvc0_graph_channel;
384 engine->graph.create_context = nvc0_graph_create_context;
385 engine->graph.destroy_context = nvc0_graph_destroy_context;
386 engine->graph.load_context = nvc0_graph_load_context;
387 engine->graph.unload_context = nvc0_graph_unload_context;
388 engine->fifo.channels = 128; 390 engine->fifo.channels = 128;
389 engine->fifo.init = nvc0_fifo_init; 391 engine->fifo.init = nvc0_fifo_init;
390 engine->fifo.takedown = nvc0_fifo_takedown; 392 engine->fifo.takedown = nvc0_fifo_takedown;
@@ -405,7 +407,13 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev)
405 engine->gpio.takedown = nouveau_stub_takedown; 407 engine->gpio.takedown = nouveau_stub_takedown;
406 engine->gpio.get = nv50_gpio_get; 408 engine->gpio.get = nv50_gpio_get;
407 engine->gpio.set = nv50_gpio_set; 409 engine->gpio.set = nv50_gpio_set;
410 engine->gpio.irq_register = nv50_gpio_irq_register;
411 engine->gpio.irq_unregister = nv50_gpio_irq_unregister;
408 engine->gpio.irq_enable = nv50_gpio_irq_enable; 412 engine->gpio.irq_enable = nv50_gpio_irq_enable;
413 engine->vram.init = nvc0_vram_init;
414 engine->vram.get = nvc0_vram_new;
415 engine->vram.put = nv50_vram_del;
416 engine->vram.flags_valid = nvc0_vram_flags_valid;
409 break; 417 break;
410 default: 418 default:
411 NV_ERROR(dev, "NV%02x unsupported\n", dev_priv->chipset); 419 NV_ERROR(dev, "NV%02x unsupported\n", dev_priv->chipset);
@@ -437,46 +445,15 @@ static int
437nouveau_card_init_channel(struct drm_device *dev) 445nouveau_card_init_channel(struct drm_device *dev)
438{ 446{
439 struct drm_nouveau_private *dev_priv = dev->dev_private; 447 struct drm_nouveau_private *dev_priv = dev->dev_private;
440 struct nouveau_gpuobj *gpuobj;
441 int ret; 448 int ret;
442 449
443 ret = nouveau_channel_alloc(dev, &dev_priv->channel, 450 ret = nouveau_channel_alloc(dev, &dev_priv->channel,
444 (struct drm_file *)-2, 451 (struct drm_file *)-2, NvDmaFB, NvDmaTT);
445 NvDmaFB, NvDmaTT);
446 if (ret) 452 if (ret)
447 return ret; 453 return ret;
448 454
449 gpuobj = NULL; 455 mutex_unlock(&dev_priv->channel->mutex);
450 ret = nouveau_gpuobj_dma_new(dev_priv->channel, NV_CLASS_DMA_IN_MEMORY,
451 0, dev_priv->vram_size,
452 NV_DMA_ACCESS_RW, NV_DMA_TARGET_VIDMEM,
453 &gpuobj);
454 if (ret)
455 goto out_err;
456
457 ret = nouveau_gpuobj_ref_add(dev, dev_priv->channel, NvDmaVRAM,
458 gpuobj, NULL);
459 if (ret)
460 goto out_err;
461
462 gpuobj = NULL;
463 ret = nouveau_gpuobj_gart_dma_new(dev_priv->channel, 0,
464 dev_priv->gart_info.aper_size,
465 NV_DMA_ACCESS_RW, &gpuobj, NULL);
466 if (ret)
467 goto out_err;
468
469 ret = nouveau_gpuobj_ref_add(dev, dev_priv->channel, NvDmaGART,
470 gpuobj, NULL);
471 if (ret)
472 goto out_err;
473
474 return 0; 456 return 0;
475out_err:
476 nouveau_gpuobj_del(dev, &gpuobj);
477 nouveau_channel_free(dev_priv->channel);
478 dev_priv->channel = NULL;
479 return ret;
480} 457}
481 458
482static void nouveau_switcheroo_set_state(struct pci_dev *pdev, 459static void nouveau_switcheroo_set_state(struct pci_dev *pdev,
@@ -486,15 +463,25 @@ static void nouveau_switcheroo_set_state(struct pci_dev *pdev,
486 pm_message_t pmm = { .event = PM_EVENT_SUSPEND }; 463 pm_message_t pmm = { .event = PM_EVENT_SUSPEND };
487 if (state == VGA_SWITCHEROO_ON) { 464 if (state == VGA_SWITCHEROO_ON) {
488 printk(KERN_ERR "VGA switcheroo: switched nouveau on\n"); 465 printk(KERN_ERR "VGA switcheroo: switched nouveau on\n");
466 dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;
489 nouveau_pci_resume(pdev); 467 nouveau_pci_resume(pdev);
490 drm_kms_helper_poll_enable(dev); 468 drm_kms_helper_poll_enable(dev);
469 dev->switch_power_state = DRM_SWITCH_POWER_ON;
491 } else { 470 } else {
492 printk(KERN_ERR "VGA switcheroo: switched nouveau off\n"); 471 printk(KERN_ERR "VGA switcheroo: switched nouveau off\n");
472 dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;
493 drm_kms_helper_poll_disable(dev); 473 drm_kms_helper_poll_disable(dev);
494 nouveau_pci_suspend(pdev, pmm); 474 nouveau_pci_suspend(pdev, pmm);
475 dev->switch_power_state = DRM_SWITCH_POWER_OFF;
495 } 476 }
496} 477}
497 478
479static void nouveau_switcheroo_reprobe(struct pci_dev *pdev)
480{
481 struct drm_device *dev = pci_get_drvdata(pdev);
482 nouveau_fbcon_output_poll_changed(dev);
483}
484
498static bool nouveau_switcheroo_can_switch(struct pci_dev *pdev) 485static bool nouveau_switcheroo_can_switch(struct pci_dev *pdev)
499{ 486{
500 struct drm_device *dev = pci_get_drvdata(pdev); 487 struct drm_device *dev = pci_get_drvdata(pdev);
@@ -511,10 +498,11 @@ nouveau_card_init(struct drm_device *dev)
511{ 498{
512 struct drm_nouveau_private *dev_priv = dev->dev_private; 499 struct drm_nouveau_private *dev_priv = dev->dev_private;
513 struct nouveau_engine *engine; 500 struct nouveau_engine *engine;
514 int ret; 501 int ret, e = 0;
515 502
516 vga_client_register(dev->pdev, dev, NULL, nouveau_vga_set_decode); 503 vga_client_register(dev->pdev, dev, NULL, nouveau_vga_set_decode);
517 vga_switcheroo_register_client(dev->pdev, nouveau_switcheroo_set_state, 504 vga_switcheroo_register_client(dev->pdev, nouveau_switcheroo_set_state,
505 nouveau_switcheroo_reprobe,
518 nouveau_switcheroo_can_switch); 506 nouveau_switcheroo_can_switch);
519 507
520 /* Initialise internal driver API hooks */ 508 /* Initialise internal driver API hooks */
@@ -522,7 +510,10 @@ nouveau_card_init(struct drm_device *dev)
522 if (ret) 510 if (ret)
523 goto out; 511 goto out;
524 engine = &dev_priv->engine; 512 engine = &dev_priv->engine;
513 spin_lock_init(&dev_priv->channels.lock);
514 spin_lock_init(&dev_priv->tile.lock);
525 spin_lock_init(&dev_priv->context_switch_lock); 515 spin_lock_init(&dev_priv->context_switch_lock);
516 spin_lock_init(&dev_priv->vm_lock);
526 517
527 /* Make the CRTCs and I2C buses accessible */ 518 /* Make the CRTCs and I2C buses accessible */
528 ret = engine->display.early_init(dev); 519 ret = engine->display.early_init(dev);
@@ -534,35 +525,28 @@ nouveau_card_init(struct drm_device *dev)
534 if (ret) 525 if (ret)
535 goto out_display_early; 526 goto out_display_early;
536 527
537 ret = nouveau_mem_detect(dev); 528 nouveau_pm_init(dev);
529
530 ret = nouveau_mem_vram_init(dev);
538 if (ret) 531 if (ret)
539 goto out_bios; 532 goto out_bios;
540 533
541 ret = nouveau_gpuobj_early_init(dev); 534 ret = nouveau_gpuobj_init(dev);
542 if (ret) 535 if (ret)
543 goto out_bios; 536 goto out_vram;
544 537
545 /* Initialise instance memory, must happen before mem_init so we
546 * know exactly how much VRAM we're able to use for "normal"
547 * purposes.
548 */
549 ret = engine->instmem.init(dev); 538 ret = engine->instmem.init(dev);
550 if (ret) 539 if (ret)
551 goto out_gpuobj_early; 540 goto out_gpuobj;
552 541
553 /* Setup the memory manager */ 542 ret = nouveau_mem_gart_init(dev);
554 ret = nouveau_mem_init(dev);
555 if (ret) 543 if (ret)
556 goto out_instmem; 544 goto out_instmem;
557 545
558 ret = nouveau_gpuobj_init(dev);
559 if (ret)
560 goto out_mem;
561
562 /* PMC */ 546 /* PMC */
563 ret = engine->mc.init(dev); 547 ret = engine->mc.init(dev);
564 if (ret) 548 if (ret)
565 goto out_gpuobj; 549 goto out_gart;
566 550
567 /* PGPIO */ 551 /* PGPIO */
568 ret = engine->gpio.init(dev); 552 ret = engine->gpio.init(dev);
@@ -579,62 +563,130 @@ nouveau_card_init(struct drm_device *dev)
579 if (ret) 563 if (ret)
580 goto out_timer; 564 goto out_timer;
581 565
582 if (nouveau_noaccel) 566 if (!nouveau_noaccel) {
583 engine->graph.accel_blocked = true; 567 switch (dev_priv->card_type) {
584 else { 568 case NV_04:
585 /* PGRAPH */ 569 nv04_graph_create(dev);
586 ret = engine->graph.init(dev); 570 break;
587 if (ret) 571 case NV_10:
588 goto out_fb; 572 nv10_graph_create(dev);
573 break;
574 case NV_20:
575 case NV_30:
576 nv20_graph_create(dev);
577 break;
578 case NV_40:
579 nv40_graph_create(dev);
580 break;
581 case NV_50:
582 nv50_graph_create(dev);
583 break;
584 case NV_C0:
585 nvc0_graph_create(dev);
586 break;
587 default:
588 break;
589 }
590
591 switch (dev_priv->chipset) {
592 case 0x84:
593 case 0x86:
594 case 0x92:
595 case 0x94:
596 case 0x96:
597 case 0xa0:
598 nv84_crypt_create(dev);
599 break;
600 }
601
602 switch (dev_priv->card_type) {
603 case NV_50:
604 switch (dev_priv->chipset) {
605 case 0xa3:
606 case 0xa5:
607 case 0xa8:
608 case 0xaf:
609 nva3_copy_create(dev);
610 break;
611 }
612 break;
613 case NV_C0:
614 nvc0_copy_create(dev, 0);
615 nvc0_copy_create(dev, 1);
616 break;
617 default:
618 break;
619 }
620
621 if (dev_priv->card_type == NV_40)
622 nv40_mpeg_create(dev);
623 else
624 if (dev_priv->card_type == NV_50 &&
625 (dev_priv->chipset < 0x98 || dev_priv->chipset == 0xa0))
626 nv50_mpeg_create(dev);
627
628 for (e = 0; e < NVOBJ_ENGINE_NR; e++) {
629 if (dev_priv->eng[e]) {
630 ret = dev_priv->eng[e]->init(dev, e);
631 if (ret)
632 goto out_engine;
633 }
634 }
589 635
590 /* PFIFO */ 636 /* PFIFO */
591 ret = engine->fifo.init(dev); 637 ret = engine->fifo.init(dev);
592 if (ret) 638 if (ret)
593 goto out_graph; 639 goto out_engine;
594 } 640 }
595 641
596 ret = engine->display.create(dev); 642 ret = engine->display.create(dev);
597 if (ret) 643 if (ret)
598 goto out_fifo; 644 goto out_fifo;
599 645
600 /* this call irq_preinstall, register irq handler and 646 ret = drm_vblank_init(dev, nv_two_heads(dev) ? 2 : 1);
601 * call irq_postinstall
602 */
603 ret = drm_irq_install(dev);
604 if (ret) 647 if (ret)
605 goto out_display; 648 goto out_vblank;
606 649
607 ret = drm_vblank_init(dev, 0); 650 ret = nouveau_irq_init(dev);
608 if (ret) 651 if (ret)
609 goto out_irq; 652 goto out_vblank;
610 653
611 /* what about PVIDEO/PCRTC/PRAMDAC etc? */ 654 /* what about PVIDEO/PCRTC/PRAMDAC etc? */
612 655
613 if (!engine->graph.accel_blocked) { 656 if (dev_priv->eng[NVOBJ_ENGINE_GR]) {
614 ret = nouveau_card_init_channel(dev); 657 ret = nouveau_fence_init(dev);
615 if (ret) 658 if (ret)
616 goto out_irq; 659 goto out_irq;
617 }
618 660
619 ret = nouveau_backlight_init(dev); 661 ret = nouveau_card_init_channel(dev);
620 if (ret) 662 if (ret)
621 NV_ERROR(dev, "Error %d registering backlight\n", ret); 663 goto out_fence;
664 }
622 665
623 nouveau_fbcon_init(dev); 666 nouveau_fbcon_init(dev);
624 drm_kms_helper_poll_init(dev); 667 drm_kms_helper_poll_init(dev);
625 return 0; 668 return 0;
626 669
670out_fence:
671 nouveau_fence_fini(dev);
627out_irq: 672out_irq:
628 drm_irq_uninstall(dev); 673 nouveau_irq_fini(dev);
629out_display: 674out_vblank:
675 drm_vblank_cleanup(dev);
630 engine->display.destroy(dev); 676 engine->display.destroy(dev);
631out_fifo: 677out_fifo:
632 if (!nouveau_noaccel) 678 if (!nouveau_noaccel)
633 engine->fifo.takedown(dev); 679 engine->fifo.takedown(dev);
634out_graph: 680out_engine:
635 if (!nouveau_noaccel) 681 if (!nouveau_noaccel) {
636 engine->graph.takedown(dev); 682 for (e = e - 1; e >= 0; e--) {
637out_fb: 683 if (!dev_priv->eng[e])
684 continue;
685 dev_priv->eng[e]->fini(dev, e);
686 dev_priv->eng[e]->destroy(dev,e );
687 }
688 }
689
638 engine->fb.takedown(dev); 690 engine->fb.takedown(dev);
639out_timer: 691out_timer:
640 engine->timer.takedown(dev); 692 engine->timer.takedown(dev);
@@ -642,16 +694,16 @@ out_gpio:
642 engine->gpio.takedown(dev); 694 engine->gpio.takedown(dev);
643out_mc: 695out_mc:
644 engine->mc.takedown(dev); 696 engine->mc.takedown(dev);
645out_gpuobj: 697out_gart:
646 nouveau_gpuobj_takedown(dev); 698 nouveau_mem_gart_fini(dev);
647out_mem:
648 nouveau_sgdma_takedown(dev);
649 nouveau_mem_close(dev);
650out_instmem: 699out_instmem:
651 engine->instmem.takedown(dev); 700 engine->instmem.takedown(dev);
652out_gpuobj_early: 701out_gpuobj:
653 nouveau_gpuobj_late_takedown(dev); 702 nouveau_gpuobj_takedown(dev);
703out_vram:
704 nouveau_mem_vram_fini(dev);
654out_bios: 705out_bios:
706 nouveau_pm_fini(dev);
655 nouveau_bios_takedown(dev); 707 nouveau_bios_takedown(dev);
656out_display_early: 708out_display_early:
657 engine->display.late_takedown(dev); 709 engine->display.late_takedown(dev);
@@ -664,17 +716,21 @@ static void nouveau_card_takedown(struct drm_device *dev)
664{ 716{
665 struct drm_nouveau_private *dev_priv = dev->dev_private; 717 struct drm_nouveau_private *dev_priv = dev->dev_private;
666 struct nouveau_engine *engine = &dev_priv->engine; 718 struct nouveau_engine *engine = &dev_priv->engine;
667 719 int e;
668 nouveau_backlight_exit(dev);
669 720
670 if (dev_priv->channel) { 721 if (dev_priv->channel) {
671 nouveau_channel_free(dev_priv->channel); 722 nouveau_fence_fini(dev);
672 dev_priv->channel = NULL; 723 nouveau_channel_put_unlocked(&dev_priv->channel);
673 } 724 }
674 725
675 if (!nouveau_noaccel) { 726 if (!nouveau_noaccel) {
676 engine->fifo.takedown(dev); 727 engine->fifo.takedown(dev);
677 engine->graph.takedown(dev); 728 for (e = NVOBJ_ENGINE_NR - 1; e >= 0; e--) {
729 if (dev_priv->eng[e]) {
730 dev_priv->eng[e]->fini(dev, e);
731 dev_priv->eng[e]->destroy(dev,e );
732 }
733 }
678 } 734 }
679 engine->fb.takedown(dev); 735 engine->fb.takedown(dev);
680 engine->timer.takedown(dev); 736 engine->timer.takedown(dev);
@@ -682,19 +738,25 @@ static void nouveau_card_takedown(struct drm_device *dev)
682 engine->mc.takedown(dev); 738 engine->mc.takedown(dev);
683 engine->display.late_takedown(dev); 739 engine->display.late_takedown(dev);
684 740
741 if (dev_priv->vga_ram) {
742 nouveau_bo_unpin(dev_priv->vga_ram);
743 nouveau_bo_ref(NULL, &dev_priv->vga_ram);
744 }
745
685 mutex_lock(&dev->struct_mutex); 746 mutex_lock(&dev->struct_mutex);
686 ttm_bo_clean_mm(&dev_priv->ttm.bdev, TTM_PL_VRAM); 747 ttm_bo_clean_mm(&dev_priv->ttm.bdev, TTM_PL_VRAM);
687 ttm_bo_clean_mm(&dev_priv->ttm.bdev, TTM_PL_TT); 748 ttm_bo_clean_mm(&dev_priv->ttm.bdev, TTM_PL_TT);
688 mutex_unlock(&dev->struct_mutex); 749 mutex_unlock(&dev->struct_mutex);
689 nouveau_sgdma_takedown(dev); 750 nouveau_mem_gart_fini(dev);
690 751
691 nouveau_gpuobj_takedown(dev);
692 nouveau_mem_close(dev);
693 engine->instmem.takedown(dev); 752 engine->instmem.takedown(dev);
753 nouveau_gpuobj_takedown(dev);
754 nouveau_mem_vram_fini(dev);
694 755
695 drm_irq_uninstall(dev); 756 nouveau_irq_fini(dev);
757 drm_vblank_cleanup(dev);
696 758
697 nouveau_gpuobj_late_takedown(dev); 759 nouveau_pm_fini(dev);
698 nouveau_bios_takedown(dev); 760 nouveau_bios_takedown(dev);
699 761
700 vga_client_register(dev->pdev, NULL, NULL, NULL); 762 vga_client_register(dev->pdev, NULL, NULL, NULL);
@@ -774,7 +836,7 @@ static int nouveau_remove_conflicting_drivers(struct drm_device *dev)
774#ifdef CONFIG_X86 836#ifdef CONFIG_X86
775 primary = dev->pdev->resource[PCI_ROM_RESOURCE].flags & IORESOURCE_ROM_SHADOW; 837 primary = dev->pdev->resource[PCI_ROM_RESOURCE].flags & IORESOURCE_ROM_SHADOW;
776#endif 838#endif
777 839
778 remove_conflicting_framebuffers(dev_priv->apertures, "nouveaufb", primary); 840 remove_conflicting_framebuffers(dev_priv->apertures, "nouveaufb", primary);
779 return 0; 841 return 0;
780} 842}
@@ -799,12 +861,6 @@ int nouveau_load(struct drm_device *dev, unsigned long flags)
799 NV_DEBUG(dev, "vendor: 0x%X device: 0x%X class: 0x%X\n", 861 NV_DEBUG(dev, "vendor: 0x%X device: 0x%X class: 0x%X\n",
800 dev->pci_vendor, dev->pci_device, dev->pdev->class); 862 dev->pci_vendor, dev->pci_device, dev->pdev->class);
801 863
802 dev_priv->wq = create_workqueue("nouveau");
803 if (!dev_priv->wq) {
804 ret = -EINVAL;
805 goto err_priv;
806 }
807
808 /* resource 0 is mmio regs */ 864 /* resource 0 is mmio regs */
809 /* resource 1 is linear FB */ 865 /* resource 1 is linear FB */
810 /* resource 2 is RAMIN (mmio regs + 0x1000000) */ 866 /* resource 2 is RAMIN (mmio regs + 0x1000000) */
@@ -817,26 +873,28 @@ int nouveau_load(struct drm_device *dev, unsigned long flags)
817 NV_ERROR(dev, "Unable to initialize the mmio mapping. " 873 NV_ERROR(dev, "Unable to initialize the mmio mapping. "
818 "Please report your setup to " DRIVER_EMAIL "\n"); 874 "Please report your setup to " DRIVER_EMAIL "\n");
819 ret = -EINVAL; 875 ret = -EINVAL;
820 goto err_wq; 876 goto err_priv;
821 } 877 }
822 NV_DEBUG(dev, "regs mapped ok at 0x%llx\n", 878 NV_DEBUG(dev, "regs mapped ok at 0x%llx\n",
823 (unsigned long long)mmio_start_offs); 879 (unsigned long long)mmio_start_offs);
824 880
825#ifdef __BIG_ENDIAN 881#ifdef __BIG_ENDIAN
826 /* Put the card in BE mode if it's not */ 882 /* Put the card in BE mode if it's not */
827 if (nv_rd32(dev, NV03_PMC_BOOT_1)) 883 if (nv_rd32(dev, NV03_PMC_BOOT_1) != 0x01000001)
828 nv_wr32(dev, NV03_PMC_BOOT_1, 0x00000001); 884 nv_wr32(dev, NV03_PMC_BOOT_1, 0x01000001);
829 885
830 DRM_MEMORYBARRIER(); 886 DRM_MEMORYBARRIER();
831#endif 887#endif
832 888
833 /* Time to determine the card architecture */ 889 /* Time to determine the card architecture */
834 reg0 = nv_rd32(dev, NV03_PMC_BOOT_0); 890 reg0 = nv_rd32(dev, NV03_PMC_BOOT_0);
891 dev_priv->stepping = 0; /* XXX: add stepping for pre-NV10? */
835 892
836 /* We're dealing with >=NV10 */ 893 /* We're dealing with >=NV10 */
837 if ((reg0 & 0x0f000000) > 0) { 894 if ((reg0 & 0x0f000000) > 0) {
838 /* Bit 27-20 contain the architecture in hex */ 895 /* Bit 27-20 contain the architecture in hex */
839 dev_priv->chipset = (reg0 & 0xff00000) >> 20; 896 dev_priv->chipset = (reg0 & 0xff00000) >> 20;
897 dev_priv->stepping = (reg0 & 0xff);
840 /* NV04 or NV05 */ 898 /* NV04 or NV05 */
841 } else if ((reg0 & 0xff00fff0) == 0x20004000) { 899 } else if ((reg0 & 0xff00fff0) == 0x20004000) {
842 if (reg0 & 0x00f00000) 900 if (reg0 & 0x00f00000)
@@ -879,7 +937,7 @@ int nouveau_load(struct drm_device *dev, unsigned long flags)
879 if (ret) 937 if (ret)
880 goto err_mmio; 938 goto err_mmio;
881 939
882 /* Map PRAMIN BAR, or on older cards, the aperture withing BAR0 */ 940 /* Map PRAMIN BAR, or on older cards, the aperture within BAR0 */
883 if (dev_priv->card_type >= NV_40) { 941 if (dev_priv->card_type >= NV_40) {
884 int ramin_bar = 2; 942 int ramin_bar = 2;
885 if (pci_resource_len(dev->pdev, ramin_bar) == 0) 943 if (pci_resource_len(dev->pdev, ramin_bar) == 0)
@@ -924,8 +982,6 @@ err_ramin:
924 iounmap(dev_priv->ramin); 982 iounmap(dev_priv->ramin);
925err_mmio: 983err_mmio:
926 iounmap(dev_priv->mmio); 984 iounmap(dev_priv->mmio);
927err_wq:
928 destroy_workqueue(dev_priv->wq);
929err_priv: 985err_priv:
930 kfree(dev_priv); 986 kfree(dev_priv);
931 dev->dev_private = NULL; 987 dev->dev_private = NULL;
@@ -935,6 +991,7 @@ err_out:
935 991
936void nouveau_lastclose(struct drm_device *dev) 992void nouveau_lastclose(struct drm_device *dev)
937{ 993{
994 vga_switcheroo_process_delayed_switch();
938} 995}
939 996
940int nouveau_unload(struct drm_device *dev) 997int nouveau_unload(struct drm_device *dev)
@@ -972,28 +1029,13 @@ int nouveau_ioctl_getparam(struct drm_device *dev, void *data,
972 getparam->value = dev->pci_device; 1029 getparam->value = dev->pci_device;
973 break; 1030 break;
974 case NOUVEAU_GETPARAM_BUS_TYPE: 1031 case NOUVEAU_GETPARAM_BUS_TYPE:
975 if (drm_device_is_agp(dev)) 1032 if (drm_pci_device_is_agp(dev))
976 getparam->value = NV_AGP; 1033 getparam->value = NV_AGP;
977 else if (drm_device_is_pcie(dev)) 1034 else if (drm_pci_device_is_pcie(dev))
978 getparam->value = NV_PCIE; 1035 getparam->value = NV_PCIE;
979 else 1036 else
980 getparam->value = NV_PCI; 1037 getparam->value = NV_PCI;
981 break; 1038 break;
982 case NOUVEAU_GETPARAM_FB_PHYSICAL:
983 getparam->value = dev_priv->fb_phys;
984 break;
985 case NOUVEAU_GETPARAM_AGP_PHYSICAL:
986 getparam->value = dev_priv->gart_info.aper_base;
987 break;
988 case NOUVEAU_GETPARAM_PCI_PHYSICAL:
989 if (dev->sg) {
990 getparam->value = (unsigned long)dev->sg->virtual;
991 } else {
992 NV_ERROR(dev, "Requested PCIGART address, "
993 "while no PCIGART was created\n");
994 return -EINVAL;
995 }
996 break;
997 case NOUVEAU_GETPARAM_FB_SIZE: 1039 case NOUVEAU_GETPARAM_FB_SIZE:
998 getparam->value = dev_priv->fb_available_size; 1040 getparam->value = dev_priv->fb_available_size;
999 break; 1041 break;
@@ -1001,11 +1043,17 @@ int nouveau_ioctl_getparam(struct drm_device *dev, void *data,
1001 getparam->value = dev_priv->gart_info.aper_size; 1043 getparam->value = dev_priv->gart_info.aper_size;
1002 break; 1044 break;
1003 case NOUVEAU_GETPARAM_VM_VRAM_BASE: 1045 case NOUVEAU_GETPARAM_VM_VRAM_BASE:
1004 getparam->value = dev_priv->vm_vram_base; 1046 getparam->value = 0; /* deprecated */
1005 break; 1047 break;
1006 case NOUVEAU_GETPARAM_PTIMER_TIME: 1048 case NOUVEAU_GETPARAM_PTIMER_TIME:
1007 getparam->value = dev_priv->engine.timer.read(dev); 1049 getparam->value = dev_priv->engine.timer.read(dev);
1008 break; 1050 break;
1051 case NOUVEAU_GETPARAM_HAS_BO_USAGE:
1052 getparam->value = 1;
1053 break;
1054 case NOUVEAU_GETPARAM_HAS_PAGEFLIP:
1055 getparam->value = 1;
1056 break;
1009 case NOUVEAU_GETPARAM_GRAPH_UNITS: 1057 case NOUVEAU_GETPARAM_GRAPH_UNITS:
1010 /* NV40 and NV50 versions are quite different, but register 1058 /* NV40 and NV50 versions are quite different, but register
1011 * address is the same. User is supposed to know the card 1059 * address is the same. User is supposed to know the card
@@ -1016,7 +1064,7 @@ int nouveau_ioctl_getparam(struct drm_device *dev, void *data,
1016 } 1064 }
1017 /* FALLTHRU */ 1065 /* FALLTHRU */
1018 default: 1066 default:
1019 NV_ERROR(dev, "unknown parameter %lld\n", getparam->param); 1067 NV_DEBUG(dev, "unknown parameter %lld\n", getparam->param);
1020 return -EINVAL; 1068 return -EINVAL;
1021 } 1069 }
1022 1070
@@ -1031,7 +1079,7 @@ nouveau_ioctl_setparam(struct drm_device *dev, void *data,
1031 1079
1032 switch (setparam->param) { 1080 switch (setparam->param) {
1033 default: 1081 default:
1034 NV_ERROR(dev, "unknown parameter %lld\n", setparam->param); 1082 NV_DEBUG(dev, "unknown parameter %lld\n", setparam->param);
1035 return -EINVAL; 1083 return -EINVAL;
1036 } 1084 }
1037 1085
@@ -1039,8 +1087,9 @@ nouveau_ioctl_setparam(struct drm_device *dev, void *data,
1039} 1087}
1040 1088
1041/* Wait until (value(reg) & mask) == val, up until timeout has hit */ 1089/* Wait until (value(reg) & mask) == val, up until timeout has hit */
1042bool nouveau_wait_until(struct drm_device *dev, uint64_t timeout, 1090bool
1043 uint32_t reg, uint32_t mask, uint32_t val) 1091nouveau_wait_eq(struct drm_device *dev, uint64_t timeout,
1092 uint32_t reg, uint32_t mask, uint32_t val)
1044{ 1093{
1045 struct drm_nouveau_private *dev_priv = dev->dev_private; 1094 struct drm_nouveau_private *dev_priv = dev->dev_private;
1046 struct nouveau_timer_engine *ptimer = &dev_priv->engine.timer; 1095 struct nouveau_timer_engine *ptimer = &dev_priv->engine.timer;
@@ -1054,10 +1103,33 @@ bool nouveau_wait_until(struct drm_device *dev, uint64_t timeout,
1054 return false; 1103 return false;
1055} 1104}
1056 1105
1106/* Wait until (value(reg) & mask) != val, up until timeout has hit */
1107bool
1108nouveau_wait_ne(struct drm_device *dev, uint64_t timeout,
1109 uint32_t reg, uint32_t mask, uint32_t val)
1110{
1111 struct drm_nouveau_private *dev_priv = dev->dev_private;
1112 struct nouveau_timer_engine *ptimer = &dev_priv->engine.timer;
1113 uint64_t start = ptimer->read(dev);
1114
1115 do {
1116 if ((nv_rd32(dev, reg) & mask) != val)
1117 return true;
1118 } while (ptimer->read(dev) - start < timeout);
1119
1120 return false;
1121}
1122
1057/* Waits for PGRAPH to go completely idle */ 1123/* Waits for PGRAPH to go completely idle */
1058bool nouveau_wait_for_idle(struct drm_device *dev) 1124bool nouveau_wait_for_idle(struct drm_device *dev)
1059{ 1125{
1060 if (!nv_wait(NV04_PGRAPH_STATUS, 0xffffffff, 0x00000000)) { 1126 struct drm_nouveau_private *dev_priv = dev->dev_private;
1127 uint32_t mask = ~0;
1128
1129 if (dev_priv->card_type == NV_40)
1130 mask &= ~NV40_PGRAPH_STATUS_SYNC_STALL;
1131
1132 if (!nv_wait(dev, NV04_PGRAPH_STATUS, mask, 0)) {
1061 NV_ERROR(dev, "PGRAPH idle timed out with status 0x%08x\n", 1133 NV_ERROR(dev, "PGRAPH idle timed out with status 0x%08x\n",
1062 nv_rd32(dev, NV04_PGRAPH_STATUS)); 1134 nv_rd32(dev, NV04_PGRAPH_STATUS));
1063 return false; 1135 return false;
diff --git a/drivers/gpu/drm/nouveau/nouveau_temp.c b/drivers/gpu/drm/nouveau/nouveau_temp.c
new file mode 100644
index 000000000000..649b0413b09f
--- /dev/null
+++ b/drivers/gpu/drm/nouveau/nouveau_temp.c
@@ -0,0 +1,307 @@
1/*
2 * Copyright 2010 PathScale 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: Martin Peres
23 */
24
25#include "drmP.h"
26
27#include "nouveau_drv.h"
28#include "nouveau_pm.h"
29
30static void
31nouveau_temp_vbios_parse(struct drm_device *dev, u8 *temp)
32{
33 struct drm_nouveau_private *dev_priv = dev->dev_private;
34 struct nouveau_pm_engine *pm = &dev_priv->engine.pm;
35 struct nouveau_pm_temp_sensor_constants *sensor = &pm->sensor_constants;
36 struct nouveau_pm_threshold_temp *temps = &pm->threshold_temp;
37 int i, headerlen, recordlen, entries;
38
39 if (!temp) {
40 NV_DEBUG(dev, "temperature table pointer invalid\n");
41 return;
42 }
43
44 /* Set the default sensor's contants */
45 sensor->offset_constant = 0;
46 sensor->offset_mult = 1;
47 sensor->offset_div = 1;
48 sensor->slope_mult = 1;
49 sensor->slope_div = 1;
50
51 /* Set the default temperature thresholds */
52 temps->critical = 110;
53 temps->down_clock = 100;
54 temps->fan_boost = 90;
55
56 /* Set the known default values to setup the temperature sensor */
57 if (dev_priv->card_type >= NV_40) {
58 switch (dev_priv->chipset) {
59 case 0x43:
60 sensor->offset_mult = 32060;
61 sensor->offset_div = 1000;
62 sensor->slope_mult = 792;
63 sensor->slope_div = 1000;
64 break;
65
66 case 0x44:
67 case 0x47:
68 case 0x4a:
69 sensor->offset_mult = 27839;
70 sensor->offset_div = 1000;
71 sensor->slope_mult = 780;
72 sensor->slope_div = 1000;
73 break;
74
75 case 0x46:
76 sensor->offset_mult = -24775;
77 sensor->offset_div = 100;
78 sensor->slope_mult = 467;
79 sensor->slope_div = 10000;
80 break;
81
82 case 0x49:
83 sensor->offset_mult = -25051;
84 sensor->offset_div = 100;
85 sensor->slope_mult = 458;
86 sensor->slope_div = 10000;
87 break;
88
89 case 0x4b:
90 sensor->offset_mult = -24088;
91 sensor->offset_div = 100;
92 sensor->slope_mult = 442;
93 sensor->slope_div = 10000;
94 break;
95
96 case 0x50:
97 sensor->offset_mult = -22749;
98 sensor->offset_div = 100;
99 sensor->slope_mult = 431;
100 sensor->slope_div = 10000;
101 break;
102 }
103 }
104
105 headerlen = temp[1];
106 recordlen = temp[2];
107 entries = temp[3];
108 temp = temp + headerlen;
109
110 /* Read the entries from the table */
111 for (i = 0; i < entries; i++) {
112 u16 value = ROM16(temp[1]);
113
114 switch (temp[0]) {
115 case 0x01:
116 if ((value & 0x8f) == 0)
117 sensor->offset_constant = (value >> 9) & 0x7f;
118 break;
119
120 case 0x04:
121 if ((value & 0xf00f) == 0xa000) /* core */
122 temps->critical = (value&0x0ff0) >> 4;
123 break;
124
125 case 0x07:
126 if ((value & 0xf00f) == 0xa000) /* core */
127 temps->down_clock = (value&0x0ff0) >> 4;
128 break;
129
130 case 0x08:
131 if ((value & 0xf00f) == 0xa000) /* core */
132 temps->fan_boost = (value&0x0ff0) >> 4;
133 break;
134
135 case 0x10:
136 sensor->offset_mult = value;
137 break;
138
139 case 0x11:
140 sensor->offset_div = value;
141 break;
142
143 case 0x12:
144 sensor->slope_mult = value;
145 break;
146
147 case 0x13:
148 sensor->slope_div = value;
149 break;
150 }
151 temp += recordlen;
152 }
153
154 nouveau_temp_safety_checks(dev);
155}
156
157static int
158nv40_sensor_setup(struct drm_device *dev)
159{
160 struct drm_nouveau_private *dev_priv = dev->dev_private;
161 struct nouveau_pm_engine *pm = &dev_priv->engine.pm;
162 struct nouveau_pm_temp_sensor_constants *sensor = &pm->sensor_constants;
163 u32 offset = sensor->offset_mult / sensor->offset_div;
164 u32 sensor_calibration;
165
166 /* set up the sensors */
167 sensor_calibration = 120 - offset - sensor->offset_constant;
168 sensor_calibration = sensor_calibration * sensor->slope_div /
169 sensor->slope_mult;
170
171 if (dev_priv->chipset >= 0x46)
172 sensor_calibration |= 0x80000000;
173 else
174 sensor_calibration |= 0x10000000;
175
176 nv_wr32(dev, 0x0015b0, sensor_calibration);
177
178 /* Wait for the sensor to update */
179 msleep(5);
180
181 /* read */
182 return nv_rd32(dev, 0x0015b4) & 0x1fff;
183}
184
185int
186nv40_temp_get(struct drm_device *dev)
187{
188 struct drm_nouveau_private *dev_priv = dev->dev_private;
189 struct nouveau_pm_engine *pm = &dev_priv->engine.pm;
190 struct nouveau_pm_temp_sensor_constants *sensor = &pm->sensor_constants;
191 int offset = sensor->offset_mult / sensor->offset_div;
192 int core_temp;
193
194 if (dev_priv->card_type >= NV_50) {
195 core_temp = nv_rd32(dev, 0x20008);
196 } else {
197 core_temp = nv_rd32(dev, 0x0015b4) & 0x1fff;
198 /* Setup the sensor if the temperature is 0 */
199 if (core_temp == 0)
200 core_temp = nv40_sensor_setup(dev);
201 }
202
203 core_temp = core_temp * sensor->slope_mult / sensor->slope_div;
204 core_temp = core_temp + offset + sensor->offset_constant;
205
206 return core_temp;
207}
208
209int
210nv84_temp_get(struct drm_device *dev)
211{
212 return nv_rd32(dev, 0x20400);
213}
214
215void
216nouveau_temp_safety_checks(struct drm_device *dev)
217{
218 struct drm_nouveau_private *dev_priv = dev->dev_private;
219 struct nouveau_pm_engine *pm = &dev_priv->engine.pm;
220 struct nouveau_pm_threshold_temp *temps = &pm->threshold_temp;
221
222 if (temps->critical > 120)
223 temps->critical = 120;
224 else if (temps->critical < 80)
225 temps->critical = 80;
226
227 if (temps->down_clock > 110)
228 temps->down_clock = 110;
229 else if (temps->down_clock < 60)
230 temps->down_clock = 60;
231
232 if (temps->fan_boost > 100)
233 temps->fan_boost = 100;
234 else if (temps->fan_boost < 40)
235 temps->fan_boost = 40;
236}
237
238static bool
239probe_monitoring_device(struct nouveau_i2c_chan *i2c,
240 struct i2c_board_info *info)
241{
242 struct i2c_client *client;
243
244 request_module("%s%s", I2C_MODULE_PREFIX, info->type);
245
246 client = i2c_new_device(&i2c->adapter, info);
247 if (!client)
248 return false;
249
250 if (!client->driver || client->driver->detect(client, info)) {
251 i2c_unregister_device(client);
252 return false;
253 }
254
255 return true;
256}
257
258static void
259nouveau_temp_probe_i2c(struct drm_device *dev)
260{
261 struct drm_nouveau_private *dev_priv = dev->dev_private;
262 struct dcb_table *dcb = &dev_priv->vbios.dcb;
263 struct i2c_board_info info[] = {
264 { I2C_BOARD_INFO("w83l785ts", 0x2d) },
265 { I2C_BOARD_INFO("w83781d", 0x2d) },
266 { I2C_BOARD_INFO("adt7473", 0x2e) },
267 { I2C_BOARD_INFO("f75375", 0x2e) },
268 { I2C_BOARD_INFO("lm99", 0x4c) },
269 { }
270 };
271 int idx = (dcb->version >= 0x40 ?
272 dcb->i2c_default_indices & 0xf : 2);
273
274 nouveau_i2c_identify(dev, "monitoring device", info,
275 probe_monitoring_device, idx);
276}
277
278void
279nouveau_temp_init(struct drm_device *dev)
280{
281 struct drm_nouveau_private *dev_priv = dev->dev_private;
282 struct nvbios *bios = &dev_priv->vbios;
283 struct bit_entry P;
284 u8 *temp = NULL;
285
286 if (bios->type == NVBIOS_BIT) {
287 if (bit_table(dev, 'P', &P))
288 return;
289
290 if (P.version == 1)
291 temp = ROMPTR(bios, P.data[12]);
292 else if (P.version == 2)
293 temp = ROMPTR(bios, P.data[16]);
294 else
295 NV_WARN(dev, "unknown temp for BIT P %d\n", P.version);
296
297 nouveau_temp_vbios_parse(dev, temp);
298 }
299
300 nouveau_temp_probe_i2c(dev);
301}
302
303void
304nouveau_temp_fini(struct drm_device *dev)
305{
306
307}
diff --git a/drivers/gpu/drm/nouveau/nouveau_util.c b/drivers/gpu/drm/nouveau/nouveau_util.c
new file mode 100644
index 000000000000..e51b51503baa
--- /dev/null
+++ b/drivers/gpu/drm/nouveau/nouveau_util.c
@@ -0,0 +1,78 @@
1/*
2 * Copyright (C) 2010 Nouveau Project
3 *
4 * All Rights Reserved.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining
7 * a copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sublicense, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
13 *
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial
16 * portions of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
21 * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
22 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 *
26 */
27
28#include <linux/ratelimit.h>
29
30#include "nouveau_util.h"
31
32static DEFINE_RATELIMIT_STATE(nouveau_ratelimit_state, 3 * HZ, 20);
33
34void
35nouveau_bitfield_print(const struct nouveau_bitfield *bf, u32 value)
36{
37 while (bf->name) {
38 if (value & bf->mask) {
39 printk(" %s", bf->name);
40 value &= ~bf->mask;
41 }
42
43 bf++;
44 }
45
46 if (value)
47 printk(" (unknown bits 0x%08x)", value);
48}
49
50const struct nouveau_enum *
51nouveau_enum_find(const struct nouveau_enum *en, u32 value)
52{
53 while (en->name) {
54 if (en->value == value)
55 return en;
56 en++;
57 }
58
59 return NULL;
60}
61
62void
63nouveau_enum_print(const struct nouveau_enum *en, u32 value)
64{
65 en = nouveau_enum_find(en, value);
66 if (en) {
67 printk("%s", en->name);
68 return;
69 }
70
71 printk("(unknown enum 0x%08x)", value);
72}
73
74int
75nouveau_ratelimit(void)
76{
77 return __ratelimit(&nouveau_ratelimit_state);
78}
diff --git a/drivers/gpu/drm/nouveau/nouveau_util.h b/drivers/gpu/drm/nouveau/nouveau_util.h
new file mode 100644
index 000000000000..b97719fbb739
--- /dev/null
+++ b/drivers/gpu/drm/nouveau/nouveau_util.h
@@ -0,0 +1,49 @@
1/*
2 * Copyright (C) 2010 Nouveau Project
3 *
4 * All Rights Reserved.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining
7 * a copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sublicense, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
13 *
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial
16 * portions of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
21 * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
22 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 *
26 */
27
28#ifndef __NOUVEAU_UTIL_H__
29#define __NOUVEAU_UTIL_H__
30
31struct nouveau_bitfield {
32 u32 mask;
33 const char *name;
34};
35
36struct nouveau_enum {
37 u32 value;
38 const char *name;
39 void *data;
40};
41
42void nouveau_bitfield_print(const struct nouveau_bitfield *, u32 value);
43void nouveau_enum_print(const struct nouveau_enum *, u32 value);
44const struct nouveau_enum *
45nouveau_enum_find(const struct nouveau_enum *, u32 value);
46
47int nouveau_ratelimit(void);
48
49#endif
diff --git a/drivers/gpu/drm/nouveau/nouveau_vm.c b/drivers/gpu/drm/nouveau/nouveau_vm.c
new file mode 100644
index 000000000000..519a6b4bba46
--- /dev/null
+++ b/drivers/gpu/drm/nouveau/nouveau_vm.c
@@ -0,0 +1,432 @@
1/*
2 * Copyright 2010 Red Hat 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: Ben Skeggs
23 */
24
25#include "drmP.h"
26#include "nouveau_drv.h"
27#include "nouveau_mm.h"
28#include "nouveau_vm.h"
29
30void
31nouveau_vm_map_at(struct nouveau_vma *vma, u64 delta, struct nouveau_mem *node)
32{
33 struct nouveau_vm *vm = vma->vm;
34 struct nouveau_mm_node *r;
35 int big = vma->node->type != vm->spg_shift;
36 u32 offset = vma->node->offset + (delta >> 12);
37 u32 bits = vma->node->type - 12;
38 u32 pde = (offset >> vm->pgt_bits) - vm->fpde;
39 u32 pte = (offset & ((1 << vm->pgt_bits) - 1)) >> bits;
40 u32 max = 1 << (vm->pgt_bits - bits);
41 u32 end, len;
42
43 delta = 0;
44 list_for_each_entry(r, &node->regions, rl_entry) {
45 u64 phys = (u64)r->offset << 12;
46 u32 num = r->length >> bits;
47
48 while (num) {
49 struct nouveau_gpuobj *pgt = vm->pgt[pde].obj[big];
50
51 end = (pte + num);
52 if (unlikely(end >= max))
53 end = max;
54 len = end - pte;
55
56 vm->map(vma, pgt, node, pte, len, phys, delta);
57
58 num -= len;
59 pte += len;
60 if (unlikely(end >= max)) {
61 phys += len << (bits + 12);
62 pde++;
63 pte = 0;
64 }
65
66 delta += (u64)len << vma->node->type;
67 }
68 }
69
70 vm->flush(vm);
71}
72
73void
74nouveau_vm_map(struct nouveau_vma *vma, struct nouveau_mem *node)
75{
76 nouveau_vm_map_at(vma, 0, node);
77}
78
79void
80nouveau_vm_map_sg(struct nouveau_vma *vma, u64 delta, u64 length,
81 struct nouveau_mem *mem, dma_addr_t *list)
82{
83 struct nouveau_vm *vm = vma->vm;
84 int big = vma->node->type != vm->spg_shift;
85 u32 offset = vma->node->offset + (delta >> 12);
86 u32 bits = vma->node->type - 12;
87 u32 num = length >> vma->node->type;
88 u32 pde = (offset >> vm->pgt_bits) - vm->fpde;
89 u32 pte = (offset & ((1 << vm->pgt_bits) - 1)) >> bits;
90 u32 max = 1 << (vm->pgt_bits - bits);
91 u32 end, len;
92
93 while (num) {
94 struct nouveau_gpuobj *pgt = vm->pgt[pde].obj[big];
95
96 end = (pte + num);
97 if (unlikely(end >= max))
98 end = max;
99 len = end - pte;
100
101 vm->map_sg(vma, pgt, mem, pte, len, list);
102
103 num -= len;
104 pte += len;
105 list += len;
106 if (unlikely(end >= max)) {
107 pde++;
108 pte = 0;
109 }
110 }
111
112 vm->flush(vm);
113}
114
115void
116nouveau_vm_unmap_at(struct nouveau_vma *vma, u64 delta, u64 length)
117{
118 struct nouveau_vm *vm = vma->vm;
119 int big = vma->node->type != vm->spg_shift;
120 u32 offset = vma->node->offset + (delta >> 12);
121 u32 bits = vma->node->type - 12;
122 u32 num = length >> vma->node->type;
123 u32 pde = (offset >> vm->pgt_bits) - vm->fpde;
124 u32 pte = (offset & ((1 << vm->pgt_bits) - 1)) >> bits;
125 u32 max = 1 << (vm->pgt_bits - bits);
126 u32 end, len;
127
128 while (num) {
129 struct nouveau_gpuobj *pgt = vm->pgt[pde].obj[big];
130
131 end = (pte + num);
132 if (unlikely(end >= max))
133 end = max;
134 len = end - pte;
135
136 vm->unmap(pgt, pte, len);
137
138 num -= len;
139 pte += len;
140 if (unlikely(end >= max)) {
141 pde++;
142 pte = 0;
143 }
144 }
145
146 vm->flush(vm);
147}
148
149void
150nouveau_vm_unmap(struct nouveau_vma *vma)
151{
152 nouveau_vm_unmap_at(vma, 0, (u64)vma->node->length << 12);
153}
154
155static void
156nouveau_vm_unmap_pgt(struct nouveau_vm *vm, int big, u32 fpde, u32 lpde)
157{
158 struct nouveau_vm_pgd *vpgd;
159 struct nouveau_vm_pgt *vpgt;
160 struct nouveau_gpuobj *pgt;
161 u32 pde;
162
163 for (pde = fpde; pde <= lpde; pde++) {
164 vpgt = &vm->pgt[pde - vm->fpde];
165 if (--vpgt->refcount[big])
166 continue;
167
168 pgt = vpgt->obj[big];
169 vpgt->obj[big] = NULL;
170
171 list_for_each_entry(vpgd, &vm->pgd_list, head) {
172 vm->map_pgt(vpgd->obj, pde, vpgt->obj);
173 }
174
175 mutex_unlock(&vm->mm->mutex);
176 nouveau_gpuobj_ref(NULL, &pgt);
177 mutex_lock(&vm->mm->mutex);
178 }
179}
180
181static int
182nouveau_vm_map_pgt(struct nouveau_vm *vm, u32 pde, u32 type)
183{
184 struct nouveau_vm_pgt *vpgt = &vm->pgt[pde - vm->fpde];
185 struct nouveau_vm_pgd *vpgd;
186 struct nouveau_gpuobj *pgt;
187 int big = (type != vm->spg_shift);
188 u32 pgt_size;
189 int ret;
190
191 pgt_size = (1 << (vm->pgt_bits + 12)) >> type;
192 pgt_size *= 8;
193
194 mutex_unlock(&vm->mm->mutex);
195 ret = nouveau_gpuobj_new(vm->dev, NULL, pgt_size, 0x1000,
196 NVOBJ_FLAG_ZERO_ALLOC, &pgt);
197 mutex_lock(&vm->mm->mutex);
198 if (unlikely(ret))
199 return ret;
200
201 /* someone beat us to filling the PDE while we didn't have the lock */
202 if (unlikely(vpgt->refcount[big]++)) {
203 mutex_unlock(&vm->mm->mutex);
204 nouveau_gpuobj_ref(NULL, &pgt);
205 mutex_lock(&vm->mm->mutex);
206 return 0;
207 }
208
209 vpgt->obj[big] = pgt;
210 list_for_each_entry(vpgd, &vm->pgd_list, head) {
211 vm->map_pgt(vpgd->obj, pde, vpgt->obj);
212 }
213
214 return 0;
215}
216
217int
218nouveau_vm_get(struct nouveau_vm *vm, u64 size, u32 page_shift,
219 u32 access, struct nouveau_vma *vma)
220{
221 u32 align = (1 << page_shift) >> 12;
222 u32 msize = size >> 12;
223 u32 fpde, lpde, pde;
224 int ret;
225
226 mutex_lock(&vm->mm->mutex);
227 ret = nouveau_mm_get(vm->mm, page_shift, msize, 0, align, &vma->node);
228 if (unlikely(ret != 0)) {
229 mutex_unlock(&vm->mm->mutex);
230 return ret;
231 }
232
233 fpde = (vma->node->offset >> vm->pgt_bits);
234 lpde = (vma->node->offset + vma->node->length - 1) >> vm->pgt_bits;
235 for (pde = fpde; pde <= lpde; pde++) {
236 struct nouveau_vm_pgt *vpgt = &vm->pgt[pde - vm->fpde];
237 int big = (vma->node->type != vm->spg_shift);
238
239 if (likely(vpgt->refcount[big])) {
240 vpgt->refcount[big]++;
241 continue;
242 }
243
244 ret = nouveau_vm_map_pgt(vm, pde, vma->node->type);
245 if (ret) {
246 if (pde != fpde)
247 nouveau_vm_unmap_pgt(vm, big, fpde, pde - 1);
248 nouveau_mm_put(vm->mm, vma->node);
249 mutex_unlock(&vm->mm->mutex);
250 vma->node = NULL;
251 return ret;
252 }
253 }
254 mutex_unlock(&vm->mm->mutex);
255
256 vma->vm = vm;
257 vma->offset = (u64)vma->node->offset << 12;
258 vma->access = access;
259 return 0;
260}
261
262void
263nouveau_vm_put(struct nouveau_vma *vma)
264{
265 struct nouveau_vm *vm = vma->vm;
266 u32 fpde, lpde;
267
268 if (unlikely(vma->node == NULL))
269 return;
270 fpde = (vma->node->offset >> vm->pgt_bits);
271 lpde = (vma->node->offset + vma->node->length - 1) >> vm->pgt_bits;
272
273 mutex_lock(&vm->mm->mutex);
274 nouveau_vm_unmap_pgt(vm, vma->node->type != vm->spg_shift, fpde, lpde);
275 nouveau_mm_put(vm->mm, vma->node);
276 vma->node = NULL;
277 mutex_unlock(&vm->mm->mutex);
278}
279
280int
281nouveau_vm_new(struct drm_device *dev, u64 offset, u64 length, u64 mm_offset,
282 struct nouveau_vm **pvm)
283{
284 struct drm_nouveau_private *dev_priv = dev->dev_private;
285 struct nouveau_vm *vm;
286 u64 mm_length = (offset + length) - mm_offset;
287 u32 block, pgt_bits;
288 int ret;
289
290 vm = kzalloc(sizeof(*vm), GFP_KERNEL);
291 if (!vm)
292 return -ENOMEM;
293
294 if (dev_priv->card_type == NV_50) {
295 vm->map_pgt = nv50_vm_map_pgt;
296 vm->map = nv50_vm_map;
297 vm->map_sg = nv50_vm_map_sg;
298 vm->unmap = nv50_vm_unmap;
299 vm->flush = nv50_vm_flush;
300 vm->spg_shift = 12;
301 vm->lpg_shift = 16;
302
303 pgt_bits = 29;
304 block = (1 << pgt_bits);
305 if (length < block)
306 block = length;
307
308 } else
309 if (dev_priv->card_type == NV_C0) {
310 vm->map_pgt = nvc0_vm_map_pgt;
311 vm->map = nvc0_vm_map;
312 vm->map_sg = nvc0_vm_map_sg;
313 vm->unmap = nvc0_vm_unmap;
314 vm->flush = nvc0_vm_flush;
315 vm->spg_shift = 12;
316 vm->lpg_shift = 17;
317 pgt_bits = 27;
318 block = 4096;
319 } else {
320 kfree(vm);
321 return -ENOSYS;
322 }
323
324 vm->fpde = offset >> pgt_bits;
325 vm->lpde = (offset + length - 1) >> pgt_bits;
326 vm->pgt = kcalloc(vm->lpde - vm->fpde + 1, sizeof(*vm->pgt), GFP_KERNEL);
327 if (!vm->pgt) {
328 kfree(vm);
329 return -ENOMEM;
330 }
331
332 INIT_LIST_HEAD(&vm->pgd_list);
333 vm->dev = dev;
334 vm->refcount = 1;
335 vm->pgt_bits = pgt_bits - 12;
336
337 ret = nouveau_mm_init(&vm->mm, mm_offset >> 12, mm_length >> 12,
338 block >> 12);
339 if (ret) {
340 kfree(vm);
341 return ret;
342 }
343
344 *pvm = vm;
345 return 0;
346}
347
348static int
349nouveau_vm_link(struct nouveau_vm *vm, struct nouveau_gpuobj *pgd)
350{
351 struct nouveau_vm_pgd *vpgd;
352 int i;
353
354 if (!pgd)
355 return 0;
356
357 vpgd = kzalloc(sizeof(*vpgd), GFP_KERNEL);
358 if (!vpgd)
359 return -ENOMEM;
360
361 nouveau_gpuobj_ref(pgd, &vpgd->obj);
362
363 mutex_lock(&vm->mm->mutex);
364 for (i = vm->fpde; i <= vm->lpde; i++)
365 vm->map_pgt(pgd, i, vm->pgt[i - vm->fpde].obj);
366 list_add(&vpgd->head, &vm->pgd_list);
367 mutex_unlock(&vm->mm->mutex);
368 return 0;
369}
370
371static void
372nouveau_vm_unlink(struct nouveau_vm *vm, struct nouveau_gpuobj *pgd)
373{
374 struct nouveau_vm_pgd *vpgd, *tmp;
375
376 if (!pgd)
377 return;
378
379 mutex_lock(&vm->mm->mutex);
380 list_for_each_entry_safe(vpgd, tmp, &vm->pgd_list, head) {
381 if (vpgd->obj != pgd)
382 continue;
383
384 list_del(&vpgd->head);
385 nouveau_gpuobj_ref(NULL, &vpgd->obj);
386 kfree(vpgd);
387 }
388 mutex_unlock(&vm->mm->mutex);
389}
390
391static void
392nouveau_vm_del(struct nouveau_vm *vm)
393{
394 struct nouveau_vm_pgd *vpgd, *tmp;
395
396 list_for_each_entry_safe(vpgd, tmp, &vm->pgd_list, head) {
397 nouveau_vm_unlink(vm, vpgd->obj);
398 }
399 WARN_ON(nouveau_mm_fini(&vm->mm) != 0);
400
401 kfree(vm->pgt);
402 kfree(vm);
403}
404
405int
406nouveau_vm_ref(struct nouveau_vm *ref, struct nouveau_vm **ptr,
407 struct nouveau_gpuobj *pgd)
408{
409 struct nouveau_vm *vm;
410 int ret;
411
412 vm = ref;
413 if (vm) {
414 ret = nouveau_vm_link(vm, pgd);
415 if (ret)
416 return ret;
417
418 vm->refcount++;
419 }
420
421 vm = *ptr;
422 *ptr = ref;
423
424 if (vm) {
425 nouveau_vm_unlink(vm, pgd);
426
427 if (--vm->refcount == 0)
428 nouveau_vm_del(vm);
429 }
430
431 return 0;
432}
diff --git a/drivers/gpu/drm/nouveau/nouveau_vm.h b/drivers/gpu/drm/nouveau/nouveau_vm.h
new file mode 100644
index 000000000000..c48a9fc2b47b
--- /dev/null
+++ b/drivers/gpu/drm/nouveau/nouveau_vm.h
@@ -0,0 +1,113 @@
1/*
2 * Copyright 2010 Red Hat 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: Ben Skeggs
23 */
24
25#ifndef __NOUVEAU_VM_H__
26#define __NOUVEAU_VM_H__
27
28#include "drmP.h"
29
30#include "nouveau_drv.h"
31#include "nouveau_mm.h"
32
33struct nouveau_vm_pgt {
34 struct nouveau_gpuobj *obj[2];
35 u32 refcount[2];
36};
37
38struct nouveau_vm_pgd {
39 struct list_head head;
40 struct nouveau_gpuobj *obj;
41};
42
43struct nouveau_vma {
44 struct nouveau_vm *vm;
45 struct nouveau_mm_node *node;
46 u64 offset;
47 u32 access;
48};
49
50struct nouveau_vm {
51 struct drm_device *dev;
52 struct nouveau_mm *mm;
53 int refcount;
54
55 struct list_head pgd_list;
56 atomic_t engref[16];
57
58 struct nouveau_vm_pgt *pgt;
59 u32 fpde;
60 u32 lpde;
61
62 u32 pgt_bits;
63 u8 spg_shift;
64 u8 lpg_shift;
65
66 void (*map_pgt)(struct nouveau_gpuobj *pgd, u32 pde,
67 struct nouveau_gpuobj *pgt[2]);
68 void (*map)(struct nouveau_vma *, struct nouveau_gpuobj *,
69 struct nouveau_mem *, u32 pte, u32 cnt,
70 u64 phys, u64 delta);
71 void (*map_sg)(struct nouveau_vma *, struct nouveau_gpuobj *,
72 struct nouveau_mem *, u32 pte, u32 cnt, dma_addr_t *);
73 void (*unmap)(struct nouveau_gpuobj *pgt, u32 pte, u32 cnt);
74 void (*flush)(struct nouveau_vm *);
75};
76
77/* nouveau_vm.c */
78int nouveau_vm_new(struct drm_device *, u64 offset, u64 length, u64 mm_offset,
79 struct nouveau_vm **);
80int nouveau_vm_ref(struct nouveau_vm *, struct nouveau_vm **,
81 struct nouveau_gpuobj *pgd);
82int nouveau_vm_get(struct nouveau_vm *, u64 size, u32 page_shift,
83 u32 access, struct nouveau_vma *);
84void nouveau_vm_put(struct nouveau_vma *);
85void nouveau_vm_map(struct nouveau_vma *, struct nouveau_mem *);
86void nouveau_vm_map_at(struct nouveau_vma *, u64 offset, struct nouveau_mem *);
87void nouveau_vm_unmap(struct nouveau_vma *);
88void nouveau_vm_unmap_at(struct nouveau_vma *, u64 offset, u64 length);
89void nouveau_vm_map_sg(struct nouveau_vma *, u64 offset, u64 length,
90 struct nouveau_mem *, dma_addr_t *);
91
92/* nv50_vm.c */
93void nv50_vm_map_pgt(struct nouveau_gpuobj *pgd, u32 pde,
94 struct nouveau_gpuobj *pgt[2]);
95void nv50_vm_map(struct nouveau_vma *, struct nouveau_gpuobj *,
96 struct nouveau_mem *, u32 pte, u32 cnt, u64 phys, u64 delta);
97void nv50_vm_map_sg(struct nouveau_vma *, struct nouveau_gpuobj *,
98 struct nouveau_mem *, u32 pte, u32 cnt, dma_addr_t *);
99void nv50_vm_unmap(struct nouveau_gpuobj *, u32 pte, u32 cnt);
100void nv50_vm_flush(struct nouveau_vm *);
101void nv50_vm_flush_engine(struct drm_device *, int engine);
102
103/* nvc0_vm.c */
104void nvc0_vm_map_pgt(struct nouveau_gpuobj *pgd, u32 pde,
105 struct nouveau_gpuobj *pgt[2]);
106void nvc0_vm_map(struct nouveau_vma *, struct nouveau_gpuobj *,
107 struct nouveau_mem *, u32 pte, u32 cnt, u64 phys, u64 delta);
108void nvc0_vm_map_sg(struct nouveau_vma *, struct nouveau_gpuobj *,
109 struct nouveau_mem *, u32 pte, u32 cnt, dma_addr_t *);
110void nvc0_vm_unmap(struct nouveau_gpuobj *, u32 pte, u32 cnt);
111void nvc0_vm_flush(struct nouveau_vm *);
112
113#endif
diff --git a/drivers/gpu/drm/nouveau/nouveau_volt.c b/drivers/gpu/drm/nouveau/nouveau_volt.c
new file mode 100644
index 000000000000..75e872741d92
--- /dev/null
+++ b/drivers/gpu/drm/nouveau/nouveau_volt.c
@@ -0,0 +1,220 @@
1/*
2 * Copyright 2010 Red Hat 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: Ben Skeggs
23 */
24
25#include "drmP.h"
26
27#include "nouveau_drv.h"
28#include "nouveau_pm.h"
29
30static const enum dcb_gpio_tag vidtag[] = { 0x04, 0x05, 0x06, 0x1a };
31static int nr_vidtag = sizeof(vidtag) / sizeof(vidtag[0]);
32
33int
34nouveau_voltage_gpio_get(struct drm_device *dev)
35{
36 struct drm_nouveau_private *dev_priv = dev->dev_private;
37 struct nouveau_gpio_engine *gpio = &dev_priv->engine.gpio;
38 struct nouveau_pm_voltage *volt = &dev_priv->engine.pm.voltage;
39 u8 vid = 0;
40 int i;
41
42 for (i = 0; i < nr_vidtag; i++) {
43 if (!(volt->vid_mask & (1 << i)))
44 continue;
45
46 vid |= gpio->get(dev, vidtag[i]) << i;
47 }
48
49 return nouveau_volt_lvl_lookup(dev, vid);
50}
51
52int
53nouveau_voltage_gpio_set(struct drm_device *dev, int voltage)
54{
55 struct drm_nouveau_private *dev_priv = dev->dev_private;
56 struct nouveau_gpio_engine *gpio = &dev_priv->engine.gpio;
57 struct nouveau_pm_voltage *volt = &dev_priv->engine.pm.voltage;
58 int vid, i;
59
60 vid = nouveau_volt_vid_lookup(dev, voltage);
61 if (vid < 0)
62 return vid;
63
64 for (i = 0; i < nr_vidtag; i++) {
65 if (!(volt->vid_mask & (1 << i)))
66 continue;
67
68 gpio->set(dev, vidtag[i], !!(vid & (1 << i)));
69 }
70
71 return 0;
72}
73
74int
75nouveau_volt_vid_lookup(struct drm_device *dev, int voltage)
76{
77 struct drm_nouveau_private *dev_priv = dev->dev_private;
78 struct nouveau_pm_voltage *volt = &dev_priv->engine.pm.voltage;
79 int i;
80
81 for (i = 0; i < volt->nr_level; i++) {
82 if (volt->level[i].voltage == voltage)
83 return volt->level[i].vid;
84 }
85
86 return -ENOENT;
87}
88
89int
90nouveau_volt_lvl_lookup(struct drm_device *dev, int vid)
91{
92 struct drm_nouveau_private *dev_priv = dev->dev_private;
93 struct nouveau_pm_voltage *volt = &dev_priv->engine.pm.voltage;
94 int i;
95
96 for (i = 0; i < volt->nr_level; i++) {
97 if (volt->level[i].vid == vid)
98 return volt->level[i].voltage;
99 }
100
101 return -ENOENT;
102}
103
104void
105nouveau_volt_init(struct drm_device *dev)
106{
107 struct drm_nouveau_private *dev_priv = dev->dev_private;
108 struct nouveau_pm_engine *pm = &dev_priv->engine.pm;
109 struct nouveau_pm_voltage *voltage = &pm->voltage;
110 struct nvbios *bios = &dev_priv->vbios;
111 struct bit_entry P;
112 u8 *volt = NULL, *entry;
113 int i, headerlen, recordlen, entries, vidmask, vidshift;
114
115 if (bios->type == NVBIOS_BIT) {
116 if (bit_table(dev, 'P', &P))
117 return;
118
119 if (P.version == 1)
120 volt = ROMPTR(bios, P.data[16]);
121 else
122 if (P.version == 2)
123 volt = ROMPTR(bios, P.data[12]);
124 else {
125 NV_WARN(dev, "unknown volt for BIT P %d\n", P.version);
126 }
127 } else {
128 if (bios->data[bios->offset + 6] < 0x27) {
129 NV_DEBUG(dev, "BMP version too old for voltage\n");
130 return;
131 }
132
133 volt = ROMPTR(bios, bios->data[bios->offset + 0x98]);
134 }
135
136 if (!volt) {
137 NV_DEBUG(dev, "voltage table pointer invalid\n");
138 return;
139 }
140
141 switch (volt[0]) {
142 case 0x10:
143 case 0x11:
144 case 0x12:
145 headerlen = 5;
146 recordlen = volt[1];
147 entries = volt[2];
148 vidshift = 0;
149 vidmask = volt[4];
150 break;
151 case 0x20:
152 headerlen = volt[1];
153 recordlen = volt[3];
154 entries = volt[2];
155 vidshift = 0; /* could be vidshift like 0x30? */
156 vidmask = volt[5];
157 break;
158 case 0x30:
159 headerlen = volt[1];
160 recordlen = volt[2];
161 entries = volt[3];
162 vidmask = volt[4];
163 /* no longer certain what volt[5] is, if it's related to
164 * the vid shift then it's definitely not a function of
165 * how many bits are set.
166 *
167 * after looking at a number of nva3+ vbios images, they
168 * all seem likely to have a static shift of 2.. lets
169 * go with that for now until proven otherwise.
170 */
171 vidshift = 2;
172 break;
173 default:
174 NV_WARN(dev, "voltage table 0x%02x unknown\n", volt[0]);
175 return;
176 }
177
178 /* validate vid mask */
179 voltage->vid_mask = vidmask;
180 if (!voltage->vid_mask)
181 return;
182
183 i = 0;
184 while (vidmask) {
185 if (i > nr_vidtag) {
186 NV_DEBUG(dev, "vid bit %d unknown\n", i);
187 return;
188 }
189
190 if (!nouveau_bios_gpio_entry(dev, vidtag[i])) {
191 NV_DEBUG(dev, "vid bit %d has no gpio tag\n", i);
192 return;
193 }
194
195 vidmask >>= 1;
196 i++;
197 }
198
199 /* parse vbios entries into common format */
200 voltage->level = kcalloc(entries, sizeof(*voltage->level), GFP_KERNEL);
201 if (!voltage->level)
202 return;
203
204 entry = volt + headerlen;
205 for (i = 0; i < entries; i++, entry += recordlen) {
206 voltage->level[i].voltage = entry[0];
207 voltage->level[i].vid = entry[1] >> vidshift;
208 }
209 voltage->nr_level = entries;
210 voltage->supported = true;
211}
212
213void
214nouveau_volt_fini(struct drm_device *dev)
215{
216 struct drm_nouveau_private *dev_priv = dev->dev_private;
217 struct nouveau_pm_voltage *volt = &dev_priv->engine.pm.voltage;
218
219 kfree(volt->level);
220}
diff --git a/drivers/gpu/drm/nouveau/nv04_crtc.c b/drivers/gpu/drm/nouveau/nv04_crtc.c
index 497df8765f28..f1a3ae491995 100644
--- a/drivers/gpu/drm/nouveau/nv04_crtc.c
+++ b/drivers/gpu/drm/nouveau/nv04_crtc.c
@@ -33,6 +33,7 @@
33#include "nouveau_fb.h" 33#include "nouveau_fb.h"
34#include "nouveau_hw.h" 34#include "nouveau_hw.h"
35#include "nvreg.h" 35#include "nvreg.h"
36#include "nouveau_fbcon.h"
36 37
37static int 38static int
38nv04_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y, 39nv04_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y,
@@ -109,7 +110,7 @@ static void nv_crtc_calc_state_ext(struct drm_crtc *crtc, struct drm_display_mod
109 struct nouveau_pll_vals *pv = &regp->pllvals; 110 struct nouveau_pll_vals *pv = &regp->pllvals;
110 struct pll_lims pll_lim; 111 struct pll_lims pll_lim;
111 112
112 if (get_pll_limits(dev, nv_crtc->index ? VPLL2 : VPLL1, &pll_lim)) 113 if (get_pll_limits(dev, nv_crtc->index ? PLL_VPLL1 : PLL_VPLL0, &pll_lim))
113 return; 114 return;
114 115
115 /* NM2 == 0 is used to determine single stage mode on two stage plls */ 116 /* NM2 == 0 is used to determine single stage mode on two stage plls */
@@ -157,14 +158,13 @@ nv_crtc_dpms(struct drm_crtc *crtc, int mode)
157{ 158{
158 struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc); 159 struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc);
159 struct drm_device *dev = crtc->dev; 160 struct drm_device *dev = crtc->dev;
160 struct drm_connector *connector;
161 unsigned char seq1 = 0, crtc17 = 0; 161 unsigned char seq1 = 0, crtc17 = 0;
162 unsigned char crtc1A; 162 unsigned char crtc1A;
163 163
164 NV_DEBUG_KMS(dev, "Setting dpms mode %d on CRTC %d\n", mode, 164 NV_DEBUG_KMS(dev, "Setting dpms mode %d on CRTC %d\n", mode,
165 nv_crtc->index); 165 nv_crtc->index);
166 166
167 if (nv_crtc->last_dpms == mode) /* Don't do unnecesary mode changes. */ 167 if (nv_crtc->last_dpms == mode) /* Don't do unnecessary mode changes. */
168 return; 168 return;
169 169
170 nv_crtc->last_dpms = mode; 170 nv_crtc->last_dpms = mode;
@@ -212,10 +212,6 @@ nv_crtc_dpms(struct drm_crtc *crtc, int mode)
212 NVVgaSeqReset(dev, nv_crtc->index, false); 212 NVVgaSeqReset(dev, nv_crtc->index, false);
213 213
214 NVWriteVgaCrtc(dev, nv_crtc->index, NV_CIO_CRE_RPC1_INDEX, crtc1A); 214 NVWriteVgaCrtc(dev, nv_crtc->index, NV_CIO_CRE_RPC1_INDEX, crtc1A);
215
216 /* Update connector polling modes */
217 list_for_each_entry(connector, &dev->mode_config.connector_list, head)
218 nouveau_connector_set_polling(connector);
219} 215}
220 216
221static bool 217static bool
@@ -380,7 +376,10 @@ nv_crtc_mode_set_vga(struct drm_crtc *crtc, struct drm_display_mode *mode)
380 */ 376 */
381 377
382 /* framebuffer can be larger than crtc scanout area. */ 378 /* framebuffer can be larger than crtc scanout area. */
383 regp->CRTC[NV_CIO_CRE_RPC0_INDEX] = XLATE(fb->pitch / 8, 8, NV_CIO_CRE_RPC0_OFFSET_10_8); 379 regp->CRTC[NV_CIO_CRE_RPC0_INDEX] =
380 XLATE(fb->pitch / 8, 8, NV_CIO_CRE_RPC0_OFFSET_10_8);
381 regp->CRTC[NV_CIO_CRE_42] =
382 XLATE(fb->pitch / 8, 11, NV_CIO_CRE_42_OFFSET_11);
384 regp->CRTC[NV_CIO_CRE_RPC1_INDEX] = mode->crtc_hdisplay < 1280 ? 383 regp->CRTC[NV_CIO_CRE_RPC1_INDEX] = mode->crtc_hdisplay < 1280 ?
385 MASK(NV_CIO_CRE_RPC1_LARGE) : 0x00; 384 MASK(NV_CIO_CRE_RPC1_LARGE) : 0x00;
386 regp->CRTC[NV_CIO_CRE_LSR_INDEX] = XLATE(horizBlankEnd, 6, NV_CIO_CRE_LSR_HBE_6) | 385 regp->CRTC[NV_CIO_CRE_LSR_INDEX] = XLATE(horizBlankEnd, 6, NV_CIO_CRE_LSR_HBE_6) |
@@ -555,7 +554,10 @@ nv_crtc_mode_set_regs(struct drm_crtc *crtc, struct drm_display_mode * mode)
555 if (dev_priv->card_type >= NV_30) 554 if (dev_priv->card_type >= NV_30)
556 regp->gpio_ext = NVReadCRTC(dev, 0, NV_PCRTC_GPIO_EXT); 555 regp->gpio_ext = NVReadCRTC(dev, 0, NV_PCRTC_GPIO_EXT);
557 556
558 regp->crtc_cfg = NV_PCRTC_CONFIG_START_ADDRESS_HSYNC; 557 if (dev_priv->card_type >= NV_10)
558 regp->crtc_cfg = NV10_PCRTC_CONFIG_START_ADDRESS_HSYNC;
559 else
560 regp->crtc_cfg = NV04_PCRTC_CONFIG_START_ADDRESS_HSYNC;
559 561
560 /* Some misc regs */ 562 /* Some misc regs */
561 if (dev_priv->card_type == NV_40) { 563 if (dev_priv->card_type == NV_40) {
@@ -673,11 +675,12 @@ static void nv_crtc_prepare(struct drm_crtc *crtc)
673 if (nv_two_heads(dev)) 675 if (nv_two_heads(dev))
674 NVSetOwner(dev, nv_crtc->index); 676 NVSetOwner(dev, nv_crtc->index);
675 677
678 drm_vblank_pre_modeset(dev, nv_crtc->index);
676 funcs->dpms(crtc, DRM_MODE_DPMS_OFF); 679 funcs->dpms(crtc, DRM_MODE_DPMS_OFF);
677 680
678 NVBlankScreen(dev, nv_crtc->index, true); 681 NVBlankScreen(dev, nv_crtc->index, true);
679 682
680 /* Some more preperation. */ 683 /* Some more preparation. */
681 NVWriteCRTC(dev, nv_crtc->index, NV_PCRTC_CONFIG, NV_PCRTC_CONFIG_START_ADDRESS_NON_VGA); 684 NVWriteCRTC(dev, nv_crtc->index, NV_PCRTC_CONFIG, NV_PCRTC_CONFIG_START_ADDRESS_NON_VGA);
682 if (dev_priv->card_type == NV_40) { 685 if (dev_priv->card_type == NV_40) {
683 uint32_t reg900 = NVReadRAMDAC(dev, nv_crtc->index, NV_PRAMDAC_900); 686 uint32_t reg900 = NVReadRAMDAC(dev, nv_crtc->index, NV_PRAMDAC_900);
@@ -705,6 +708,7 @@ static void nv_crtc_commit(struct drm_crtc *crtc)
705#endif 708#endif
706 709
707 funcs->dpms(crtc, DRM_MODE_DPMS_ON); 710 funcs->dpms(crtc, DRM_MODE_DPMS_ON);
711 drm_vblank_post_modeset(dev, nv_crtc->index);
708} 712}
709 713
710static void nv_crtc_destroy(struct drm_crtc *crtc) 714static void nv_crtc_destroy(struct drm_crtc *crtc)
@@ -718,6 +722,7 @@ static void nv_crtc_destroy(struct drm_crtc *crtc)
718 722
719 drm_crtc_cleanup(crtc); 723 drm_crtc_cleanup(crtc);
720 724
725 nouveau_bo_unmap(nv_crtc->cursor.nvbo);
721 nouveau_bo_ref(NULL, &nv_crtc->cursor.nvbo); 726 nouveau_bo_ref(NULL, &nv_crtc->cursor.nvbo);
722 kfree(nv_crtc); 727 kfree(nv_crtc);
723} 728}
@@ -768,8 +773,9 @@ nv_crtc_gamma_set(struct drm_crtc *crtc, u16 *r, u16 *g, u16 *b, uint32_t start,
768} 773}
769 774
770static int 775static int
771nv04_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y, 776nv04_crtc_do_mode_set_base(struct drm_crtc *crtc,
772 struct drm_framebuffer *old_fb) 777 struct drm_framebuffer *passed_fb,
778 int x, int y, bool atomic)
773{ 779{
774 struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc); 780 struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc);
775 struct drm_device *dev = crtc->dev; 781 struct drm_device *dev = crtc->dev;
@@ -780,13 +786,25 @@ nv04_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y,
780 int arb_burst, arb_lwm; 786 int arb_burst, arb_lwm;
781 int ret; 787 int ret;
782 788
783 ret = nouveau_bo_pin(fb->nvbo, TTM_PL_FLAG_VRAM); 789 /* If atomic, we want to switch to the fb we were passed, so
784 if (ret) 790 * now we update pointers to do that. (We don't pin; just
785 return ret; 791 * assume we're already pinned and update the base address.)
792 */
793 if (atomic) {
794 drm_fb = passed_fb;
795 fb = nouveau_framebuffer(passed_fb);
796 } else {
797 /* If not atomic, we can go ahead and pin, and unpin the
798 * old fb we were passed.
799 */
800 ret = nouveau_bo_pin(fb->nvbo, TTM_PL_FLAG_VRAM);
801 if (ret)
802 return ret;
786 803
787 if (old_fb) { 804 if (passed_fb) {
788 struct nouveau_framebuffer *ofb = nouveau_framebuffer(old_fb); 805 struct nouveau_framebuffer *ofb = nouveau_framebuffer(passed_fb);
789 nouveau_bo_unpin(ofb->nvbo); 806 nouveau_bo_unpin(ofb->nvbo);
807 }
790 } 808 }
791 809
792 nv_crtc->fb.offset = fb->nvbo->bo.offset; 810 nv_crtc->fb.offset = fb->nvbo->bo.offset;
@@ -809,13 +827,16 @@ nv04_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y,
809 regp->CRTC[NV_CIO_CR_OFFSET_INDEX] = drm_fb->pitch >> 3; 827 regp->CRTC[NV_CIO_CR_OFFSET_INDEX] = drm_fb->pitch >> 3;
810 regp->CRTC[NV_CIO_CRE_RPC0_INDEX] = 828 regp->CRTC[NV_CIO_CRE_RPC0_INDEX] =
811 XLATE(drm_fb->pitch >> 3, 8, NV_CIO_CRE_RPC0_OFFSET_10_8); 829 XLATE(drm_fb->pitch >> 3, 8, NV_CIO_CRE_RPC0_OFFSET_10_8);
830 regp->CRTC[NV_CIO_CRE_42] =
831 XLATE(drm_fb->pitch / 8, 11, NV_CIO_CRE_42_OFFSET_11);
812 crtc_wr_cio_state(crtc, regp, NV_CIO_CRE_RPC0_INDEX); 832 crtc_wr_cio_state(crtc, regp, NV_CIO_CRE_RPC0_INDEX);
813 crtc_wr_cio_state(crtc, regp, NV_CIO_CR_OFFSET_INDEX); 833 crtc_wr_cio_state(crtc, regp, NV_CIO_CR_OFFSET_INDEX);
834 crtc_wr_cio_state(crtc, regp, NV_CIO_CRE_42);
814 835
815 /* Update the framebuffer location. */ 836 /* Update the framebuffer location. */
816 regp->fb_start = nv_crtc->fb.offset & ~3; 837 regp->fb_start = nv_crtc->fb.offset & ~3;
817 regp->fb_start += (y * drm_fb->pitch) + (x * drm_fb->bits_per_pixel / 8); 838 regp->fb_start += (y * drm_fb->pitch) + (x * drm_fb->bits_per_pixel / 8);
818 NVWriteCRTC(dev, nv_crtc->index, NV_PCRTC_START, regp->fb_start); 839 nv_set_crtc_base(dev, nv_crtc->index, regp->fb_start);
819 840
820 /* Update the arbitration parameters. */ 841 /* Update the arbitration parameters. */
821 nouveau_calc_arb(dev, crtc->mode.clock, drm_fb->bits_per_pixel, 842 nouveau_calc_arb(dev, crtc->mode.clock, drm_fb->bits_per_pixel,
@@ -826,7 +847,7 @@ nv04_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y,
826 crtc_wr_cio_state(crtc, regp, NV_CIO_CRE_FF_INDEX); 847 crtc_wr_cio_state(crtc, regp, NV_CIO_CRE_FF_INDEX);
827 crtc_wr_cio_state(crtc, regp, NV_CIO_CRE_FFLWM__INDEX); 848 crtc_wr_cio_state(crtc, regp, NV_CIO_CRE_FFLWM__INDEX);
828 849
829 if (dev_priv->card_type >= NV_30) { 850 if (dev_priv->card_type >= NV_20) {
830 regp->CRTC[NV_CIO_CRE_47] = arb_lwm >> 8; 851 regp->CRTC[NV_CIO_CRE_47] = arb_lwm >> 8;
831 crtc_wr_cio_state(crtc, regp, NV_CIO_CRE_47); 852 crtc_wr_cio_state(crtc, regp, NV_CIO_CRE_47);
832 } 853 }
@@ -834,6 +855,29 @@ nv04_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y,
834 return 0; 855 return 0;
835} 856}
836 857
858static int
859nv04_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y,
860 struct drm_framebuffer *old_fb)
861{
862 return nv04_crtc_do_mode_set_base(crtc, old_fb, x, y, false);
863}
864
865static int
866nv04_crtc_mode_set_base_atomic(struct drm_crtc *crtc,
867 struct drm_framebuffer *fb,
868 int x, int y, enum mode_set_atomic state)
869{
870 struct drm_nouveau_private *dev_priv = crtc->dev->dev_private;
871 struct drm_device *dev = dev_priv->dev;
872
873 if (state == ENTER_ATOMIC_MODE_SET)
874 nouveau_fbcon_save_disable_accel(dev);
875 else
876 nouveau_fbcon_restore_accel(dev);
877
878 return nv04_crtc_do_mode_set_base(crtc, fb, x, y, true);
879}
880
837static void nv04_cursor_upload(struct drm_device *dev, struct nouveau_bo *src, 881static void nv04_cursor_upload(struct drm_device *dev, struct nouveau_bo *src,
838 struct nouveau_bo *dst) 882 struct nouveau_bo *dst)
839{ 883{
@@ -905,14 +949,14 @@ nv04_crtc_cursor_set(struct drm_crtc *crtc, struct drm_file *file_priv,
905 struct drm_gem_object *gem; 949 struct drm_gem_object *gem;
906 int ret = 0; 950 int ret = 0;
907 951
908 if (width != 64 || height != 64)
909 return -EINVAL;
910
911 if (!buffer_handle) { 952 if (!buffer_handle) {
912 nv_crtc->cursor.hide(nv_crtc, true); 953 nv_crtc->cursor.hide(nv_crtc, true);
913 return 0; 954 return 0;
914 } 955 }
915 956
957 if (width != 64 || height != 64)
958 return -EINVAL;
959
916 gem = drm_gem_object_lookup(dev, file_priv, buffer_handle); 960 gem = drm_gem_object_lookup(dev, file_priv, buffer_handle);
917 if (!gem) 961 if (!gem)
918 return -ENOENT; 962 return -ENOENT;
@@ -952,6 +996,7 @@ static const struct drm_crtc_funcs nv04_crtc_funcs = {
952 .cursor_move = nv04_crtc_cursor_move, 996 .cursor_move = nv04_crtc_cursor_move,
953 .gamma_set = nv_crtc_gamma_set, 997 .gamma_set = nv_crtc_gamma_set,
954 .set_config = drm_crtc_helper_set_config, 998 .set_config = drm_crtc_helper_set_config,
999 .page_flip = nouveau_crtc_page_flip,
955 .destroy = nv_crtc_destroy, 1000 .destroy = nv_crtc_destroy,
956}; 1001};
957 1002
@@ -962,6 +1007,7 @@ static const struct drm_crtc_helper_funcs nv04_crtc_helper_funcs = {
962 .mode_fixup = nv_crtc_mode_fixup, 1007 .mode_fixup = nv_crtc_mode_fixup,
963 .mode_set = nv_crtc_mode_set, 1008 .mode_set = nv_crtc_mode_set,
964 .mode_set_base = nv04_crtc_mode_set_base, 1009 .mode_set_base = nv04_crtc_mode_set_base,
1010 .mode_set_base_atomic = nv04_crtc_mode_set_base_atomic,
965 .load_lut = nv_crtc_gamma_load, 1011 .load_lut = nv_crtc_gamma_load,
966}; 1012};
967 1013
@@ -990,7 +1036,7 @@ nv04_crtc_create(struct drm_device *dev, int crtc_num)
990 drm_mode_crtc_set_gamma_size(&nv_crtc->base, 256); 1036 drm_mode_crtc_set_gamma_size(&nv_crtc->base, 256);
991 1037
992 ret = nouveau_bo_new(dev, NULL, 64*64*4, 0x100, TTM_PL_FLAG_VRAM, 1038 ret = nouveau_bo_new(dev, NULL, 64*64*4, 0x100, TTM_PL_FLAG_VRAM,
993 0, 0x0000, false, true, &nv_crtc->cursor.nvbo); 1039 0, 0x0000, &nv_crtc->cursor.nvbo);
994 if (!ret) { 1040 if (!ret) {
995 ret = nouveau_bo_pin(nv_crtc->cursor.nvbo, TTM_PL_FLAG_VRAM); 1041 ret = nouveau_bo_pin(nv_crtc->cursor.nvbo, TTM_PL_FLAG_VRAM);
996 if (!ret) 1042 if (!ret)
diff --git a/drivers/gpu/drm/nouveau/nv04_dac.c b/drivers/gpu/drm/nouveau/nv04_dac.c
index ea3627041ecf..e000455e06d0 100644
--- a/drivers/gpu/drm/nouveau/nv04_dac.c
+++ b/drivers/gpu/drm/nouveau/nv04_dac.c
@@ -74,14 +74,14 @@ static int sample_load_twice(struct drm_device *dev, bool sense[2])
74 * use a 10ms timeout (guards against crtc being inactive, in 74 * use a 10ms timeout (guards against crtc being inactive, in
75 * which case blank state would never change) 75 * which case blank state would never change)
76 */ 76 */
77 if (!nouveau_wait_until(dev, 10000000, NV_PRMCIO_INP0__COLOR, 77 if (!nouveau_wait_eq(dev, 10000000, NV_PRMCIO_INP0__COLOR,
78 0x00000001, 0x00000000)) 78 0x00000001, 0x00000000))
79 return -EBUSY; 79 return -EBUSY;
80 if (!nouveau_wait_until(dev, 10000000, NV_PRMCIO_INP0__COLOR, 80 if (!nouveau_wait_eq(dev, 10000000, NV_PRMCIO_INP0__COLOR,
81 0x00000001, 0x00000001)) 81 0x00000001, 0x00000001))
82 return -EBUSY; 82 return -EBUSY;
83 if (!nouveau_wait_until(dev, 10000000, NV_PRMCIO_INP0__COLOR, 83 if (!nouveau_wait_eq(dev, 10000000, NV_PRMCIO_INP0__COLOR,
84 0x00000001, 0x00000000)) 84 0x00000001, 0x00000000))
85 return -EBUSY; 85 return -EBUSY;
86 86
87 udelay(100); 87 udelay(100);
@@ -291,6 +291,8 @@ uint32_t nv17_dac_sample_load(struct drm_encoder *encoder)
291 msleep(5); 291 msleep(5);
292 292
293 sample = NVReadRAMDAC(dev, 0, NV_PRAMDAC_TEST_CONTROL + regoffset); 293 sample = NVReadRAMDAC(dev, 0, NV_PRAMDAC_TEST_CONTROL + regoffset);
294 /* do it again just in case it's a residual current */
295 sample &= NVReadRAMDAC(dev, 0, NV_PRAMDAC_TEST_CONTROL + regoffset);
294 296
295 temp = NVReadRAMDAC(dev, head, NV_PRAMDAC_TEST_CONTROL); 297 temp = NVReadRAMDAC(dev, head, NV_PRAMDAC_TEST_CONTROL);
296 NVWriteRAMDAC(dev, head, NV_PRAMDAC_TEST_CONTROL, 298 NVWriteRAMDAC(dev, head, NV_PRAMDAC_TEST_CONTROL,
@@ -343,22 +345,13 @@ static void nv04_dac_prepare(struct drm_encoder *encoder)
343{ 345{
344 struct drm_encoder_helper_funcs *helper = encoder->helper_private; 346 struct drm_encoder_helper_funcs *helper = encoder->helper_private;
345 struct drm_device *dev = encoder->dev; 347 struct drm_device *dev = encoder->dev;
346 struct drm_nouveau_private *dev_priv = dev->dev_private;
347 int head = nouveau_crtc(encoder->crtc)->index; 348 int head = nouveau_crtc(encoder->crtc)->index;
348 struct nv04_crtc_reg *crtcstate = dev_priv->mode_reg.crtc_reg;
349 349
350 helper->dpms(encoder, DRM_MODE_DPMS_OFF); 350 helper->dpms(encoder, DRM_MODE_DPMS_OFF);
351 351
352 nv04_dfp_disable(dev, head); 352 nv04_dfp_disable(dev, head);
353
354 /* Some NV4x have unknown values (0x3f, 0x50, 0x54, 0x6b, 0x79, 0x7f)
355 * at LCD__INDEX which we don't alter
356 */
357 if (!(crtcstate[head].CRTC[NV_CIO_CRE_LCD__INDEX] & 0x44))
358 crtcstate[head].CRTC[NV_CIO_CRE_LCD__INDEX] = 0;
359} 353}
360 354
361
362static void nv04_dac_mode_set(struct drm_encoder *encoder, 355static void nv04_dac_mode_set(struct drm_encoder *encoder,
363 struct drm_display_mode *mode, 356 struct drm_display_mode *mode,
364 struct drm_display_mode *adjusted_mode) 357 struct drm_display_mode *adjusted_mode)
diff --git a/drivers/gpu/drm/nouveau/nv04_dfp.c b/drivers/gpu/drm/nouveau/nv04_dfp.c
index 0d3206a7046c..12098bf839c4 100644
--- a/drivers/gpu/drm/nouveau/nv04_dfp.c
+++ b/drivers/gpu/drm/nouveau/nv04_dfp.c
@@ -104,6 +104,8 @@ void nv04_dfp_disable(struct drm_device *dev, int head)
104 } 104 }
105 /* don't inadvertently turn it on when state written later */ 105 /* don't inadvertently turn it on when state written later */
106 crtcstate[head].fp_control = FP_TG_CONTROL_OFF; 106 crtcstate[head].fp_control = FP_TG_CONTROL_OFF;
107 crtcstate[head].CRTC[NV_CIO_CRE_LCD__INDEX] &=
108 ~NV_CIO_CRE_LCD_ROUTE_MASK;
107} 109}
108 110
109void nv04_dfp_update_fp_control(struct drm_encoder *encoder, int mode) 111void nv04_dfp_update_fp_control(struct drm_encoder *encoder, int mode)
@@ -183,14 +185,15 @@ static bool nv04_dfp_mode_fixup(struct drm_encoder *encoder,
183 struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder); 185 struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder);
184 struct nouveau_connector *nv_connector = nouveau_encoder_connector_get(nv_encoder); 186 struct nouveau_connector *nv_connector = nouveau_encoder_connector_get(nv_encoder);
185 187
186 /* For internal panels and gpu scaling on DVI we need the native mode */ 188 if (!nv_connector->native_mode ||
187 if (nv_connector->scaling_mode != DRM_MODE_SCALE_NONE) { 189 nv_connector->scaling_mode == DRM_MODE_SCALE_NONE ||
188 if (!nv_connector->native_mode) 190 mode->hdisplay > nv_connector->native_mode->hdisplay ||
189 return false; 191 mode->vdisplay > nv_connector->native_mode->vdisplay) {
192 nv_encoder->mode = *adjusted_mode;
193
194 } else {
190 nv_encoder->mode = *nv_connector->native_mode; 195 nv_encoder->mode = *nv_connector->native_mode;
191 adjusted_mode->clock = nv_connector->native_mode->clock; 196 adjusted_mode->clock = nv_connector->native_mode->clock;
192 } else {
193 nv_encoder->mode = *adjusted_mode;
194 } 197 }
195 198
196 return true; 199 return true;
@@ -253,26 +256,21 @@ static void nv04_dfp_prepare(struct drm_encoder *encoder)
253 256
254 nv04_dfp_prepare_sel_clk(dev, nv_encoder, head); 257 nv04_dfp_prepare_sel_clk(dev, nv_encoder, head);
255 258
256 /* Some NV4x have unknown values (0x3f, 0x50, 0x54, 0x6b, 0x79, 0x7f) 259 *cr_lcd = (*cr_lcd & ~NV_CIO_CRE_LCD_ROUTE_MASK) | 0x3;
257 * at LCD__INDEX which we don't alter 260
258 */ 261 if (nv_two_heads(dev)) {
259 if (!(*cr_lcd & 0x44)) { 262 if (nv_encoder->dcb->location == DCB_LOC_ON_CHIP)
260 *cr_lcd = 0x3; 263 *cr_lcd |= head ? 0x0 : 0x8;
261 264 else {
262 if (nv_two_heads(dev)) { 265 *cr_lcd |= (nv_encoder->dcb->or << 4) & 0x30;
263 if (nv_encoder->dcb->location == DCB_LOC_ON_CHIP) 266 if (nv_encoder->dcb->type == OUTPUT_LVDS)
264 *cr_lcd |= head ? 0x0 : 0x8; 267 *cr_lcd |= 0x30;
265 else { 268 if ((*cr_lcd & 0x30) == (*cr_lcd_oth & 0x30)) {
266 *cr_lcd |= (nv_encoder->dcb->or << 4) & 0x30; 269 /* avoid being connected to both crtcs */
267 if (nv_encoder->dcb->type == OUTPUT_LVDS) 270 *cr_lcd_oth &= ~0x30;
268 *cr_lcd |= 0x30; 271 NVWriteVgaCrtc(dev, head ^ 1,
269 if ((*cr_lcd & 0x30) == (*cr_lcd_oth & 0x30)) { 272 NV_CIO_CRE_LCD__INDEX,
270 /* avoid being connected to both crtcs */ 273 *cr_lcd_oth);
271 *cr_lcd_oth &= ~0x30;
272 NVWriteVgaCrtc(dev, head ^ 1,
273 NV_CIO_CRE_LCD__INDEX,
274 *cr_lcd_oth);
275 }
276 } 274 }
277 } 275 }
278 } 276 }
@@ -344,8 +342,8 @@ static void nv04_dfp_mode_set(struct drm_encoder *encoder,
344 if (nv_encoder->dcb->type == OUTPUT_LVDS) { 342 if (nv_encoder->dcb->type == OUTPUT_LVDS) {
345 bool duallink, dummy; 343 bool duallink, dummy;
346 344
347 nouveau_bios_parse_lvds_table(dev, nv_connector->native_mode-> 345 nouveau_bios_parse_lvds_table(dev, output_mode->clock,
348 clock, &duallink, &dummy); 346 &duallink, &dummy);
349 if (duallink) 347 if (duallink)
350 regp->fp_control |= (8 << 28); 348 regp->fp_control |= (8 << 28);
351 } else 349 } else
@@ -520,8 +518,6 @@ static void nv04_lvds_dpms(struct drm_encoder *encoder, int mode)
520 return; 518 return;
521 519
522 if (nv_encoder->dcb->lvdsconf.use_power_scripts) { 520 if (nv_encoder->dcb->lvdsconf.use_power_scripts) {
523 struct nouveau_connector *nv_connector = nouveau_encoder_connector_get(nv_encoder);
524
525 /* when removing an output, crtc may not be set, but PANEL_OFF 521 /* when removing an output, crtc may not be set, but PANEL_OFF
526 * must still be run 522 * must still be run
527 */ 523 */
@@ -529,12 +525,8 @@ static void nv04_lvds_dpms(struct drm_encoder *encoder, int mode)
529 nv04_dfp_get_bound_head(dev, nv_encoder->dcb); 525 nv04_dfp_get_bound_head(dev, nv_encoder->dcb);
530 526
531 if (mode == DRM_MODE_DPMS_ON) { 527 if (mode == DRM_MODE_DPMS_ON) {
532 if (!nv_connector->native_mode) {
533 NV_ERROR(dev, "Not turning on LVDS without native mode\n");
534 return;
535 }
536 call_lvds_script(dev, nv_encoder->dcb, head, 528 call_lvds_script(dev, nv_encoder->dcb, head,
537 LVDS_PANEL_ON, nv_connector->native_mode->clock); 529 LVDS_PANEL_ON, nv_encoder->mode.clock);
538 } else 530 } else
539 /* pxclk of 0 is fine for PANEL_OFF, and for a 531 /* pxclk of 0 is fine for PANEL_OFF, and for a
540 * disconnected LVDS encoder there is no native_mode 532 * disconnected LVDS encoder there is no native_mode
@@ -589,12 +581,13 @@ static void nv04_dfp_restore(struct drm_encoder *encoder)
589 int head = nv_encoder->restore.head; 581 int head = nv_encoder->restore.head;
590 582
591 if (nv_encoder->dcb->type == OUTPUT_LVDS) { 583 if (nv_encoder->dcb->type == OUTPUT_LVDS) {
592 struct drm_display_mode *native_mode = nouveau_encoder_connector_get(nv_encoder)->native_mode; 584 struct nouveau_connector *connector =
593 if (native_mode) 585 nouveau_encoder_connector_get(nv_encoder);
594 call_lvds_script(dev, nv_encoder->dcb, head, LVDS_PANEL_ON, 586
595 native_mode->clock); 587 if (connector && connector->native_mode)
596 else 588 call_lvds_script(dev, nv_encoder->dcb, head,
597 NV_ERROR(dev, "Not restoring LVDS without native mode\n"); 589 LVDS_PANEL_ON,
590 connector->native_mode->clock);
598 591
599 } else if (nv_encoder->dcb->type == OUTPUT_TMDS) { 592 } else if (nv_encoder->dcb->type == OUTPUT_TMDS) {
600 int clock = nouveau_hw_pllvals_to_clk 593 int clock = nouveau_hw_pllvals_to_clk
@@ -640,7 +633,7 @@ static void nv04_tmds_slave_init(struct drm_encoder *encoder)
640 get_tmds_slave(encoder)) 633 get_tmds_slave(encoder))
641 return; 634 return;
642 635
643 type = nouveau_i2c_identify(dev, "TMDS transmitter", info, 2); 636 type = nouveau_i2c_identify(dev, "TMDS transmitter", info, NULL, 2);
644 if (type < 0) 637 if (type < 0)
645 return; 638 return;
646 639
diff --git a/drivers/gpu/drm/nouveau/nv04_display.c b/drivers/gpu/drm/nouveau/nv04_display.c
index 9e28cf772e3c..1715e1464b7d 100644
--- a/drivers/gpu/drm/nouveau/nv04_display.c
+++ b/drivers/gpu/drm/nouveau/nv04_display.c
@@ -32,6 +32,9 @@
32#include "nouveau_encoder.h" 32#include "nouveau_encoder.h"
33#include "nouveau_connector.h" 33#include "nouveau_connector.h"
34 34
35static void nv04_vblank_crtc0_isr(struct drm_device *);
36static void nv04_vblank_crtc1_isr(struct drm_device *);
37
35static void 38static void
36nv04_display_store_initial_head_owner(struct drm_device *dev) 39nv04_display_store_initial_head_owner(struct drm_device *dev)
37{ 40{
@@ -197,6 +200,8 @@ nv04_display_create(struct drm_device *dev)
197 func->save(encoder); 200 func->save(encoder);
198 } 201 }
199 202
203 nouveau_irq_register(dev, 24, nv04_vblank_crtc0_isr);
204 nouveau_irq_register(dev, 25, nv04_vblank_crtc1_isr);
200 return 0; 205 return 0;
201} 206}
202 207
@@ -208,6 +213,9 @@ nv04_display_destroy(struct drm_device *dev)
208 213
209 NV_DEBUG_KMS(dev, "\n"); 214 NV_DEBUG_KMS(dev, "\n");
210 215
216 nouveau_irq_unregister(dev, 24);
217 nouveau_irq_unregister(dev, 25);
218
211 /* Turn every CRTC off. */ 219 /* Turn every CRTC off. */
212 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { 220 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
213 struct drm_mode_set modeset = { 221 struct drm_mode_set modeset = {
@@ -258,3 +266,16 @@ nv04_display_init(struct drm_device *dev)
258 return 0; 266 return 0;
259} 267}
260 268
269static void
270nv04_vblank_crtc0_isr(struct drm_device *dev)
271{
272 nv_wr32(dev, NV_CRTC0_INTSTAT, NV_CRTC_INTR_VBLANK);
273 drm_handle_vblank(dev, 0);
274}
275
276static void
277nv04_vblank_crtc1_isr(struct drm_device *dev)
278{
279 nv_wr32(dev, NV_CRTC1_INTSTAT, NV_CRTC_INTR_VBLANK);
280 drm_handle_vblank(dev, 1);
281}
diff --git a/drivers/gpu/drm/nouveau/nv04_fbcon.c b/drivers/gpu/drm/nouveau/nv04_fbcon.c
index 1eeac4fae73d..7a1189371096 100644
--- a/drivers/gpu/drm/nouveau/nv04_fbcon.c
+++ b/drivers/gpu/drm/nouveau/nv04_fbcon.c
@@ -25,54 +25,42 @@
25#include "drmP.h" 25#include "drmP.h"
26#include "nouveau_drv.h" 26#include "nouveau_drv.h"
27#include "nouveau_dma.h" 27#include "nouveau_dma.h"
28#include "nouveau_ramht.h"
28#include "nouveau_fbcon.h" 29#include "nouveau_fbcon.h"
29 30
30void 31int
31nv04_fbcon_copyarea(struct fb_info *info, const struct fb_copyarea *region) 32nv04_fbcon_copyarea(struct fb_info *info, const struct fb_copyarea *region)
32{ 33{
33 struct nouveau_fbdev *nfbdev = info->par; 34 struct nouveau_fbdev *nfbdev = info->par;
34 struct drm_device *dev = nfbdev->dev; 35 struct drm_device *dev = nfbdev->dev;
35 struct drm_nouveau_private *dev_priv = dev->dev_private; 36 struct drm_nouveau_private *dev_priv = dev->dev_private;
36 struct nouveau_channel *chan = dev_priv->channel; 37 struct nouveau_channel *chan = dev_priv->channel;
38 int ret;
37 39
38 if (info->state != FBINFO_STATE_RUNNING) 40 ret = RING_SPACE(chan, 4);
39 return; 41 if (ret)
40 42 return ret;
41 if (!(info->flags & FBINFO_HWACCEL_DISABLED) && RING_SPACE(chan, 4)) {
42 nouveau_fbcon_gpu_lockup(info);
43 }
44
45 if (info->flags & FBINFO_HWACCEL_DISABLED) {
46 cfb_copyarea(info, region);
47 return;
48 }
49 43
50 BEGIN_RING(chan, NvSubImageBlit, 0x0300, 3); 44 BEGIN_RING(chan, NvSubImageBlit, 0x0300, 3);
51 OUT_RING(chan, (region->sy << 16) | region->sx); 45 OUT_RING(chan, (region->sy << 16) | region->sx);
52 OUT_RING(chan, (region->dy << 16) | region->dx); 46 OUT_RING(chan, (region->dy << 16) | region->dx);
53 OUT_RING(chan, (region->height << 16) | region->width); 47 OUT_RING(chan, (region->height << 16) | region->width);
54 FIRE_RING(chan); 48 FIRE_RING(chan);
49 return 0;
55} 50}
56 51
57void 52int
58nv04_fbcon_fillrect(struct fb_info *info, const struct fb_fillrect *rect) 53nv04_fbcon_fillrect(struct fb_info *info, const struct fb_fillrect *rect)
59{ 54{
60 struct nouveau_fbdev *nfbdev = info->par; 55 struct nouveau_fbdev *nfbdev = info->par;
61 struct drm_device *dev = nfbdev->dev; 56 struct drm_device *dev = nfbdev->dev;
62 struct drm_nouveau_private *dev_priv = dev->dev_private; 57 struct drm_nouveau_private *dev_priv = dev->dev_private;
63 struct nouveau_channel *chan = dev_priv->channel; 58 struct nouveau_channel *chan = dev_priv->channel;
59 int ret;
64 60
65 if (info->state != FBINFO_STATE_RUNNING) 61 ret = RING_SPACE(chan, 7);
66 return; 62 if (ret)
67 63 return ret;
68 if (!(info->flags & FBINFO_HWACCEL_DISABLED) && RING_SPACE(chan, 7)) {
69 nouveau_fbcon_gpu_lockup(info);
70 }
71
72 if (info->flags & FBINFO_HWACCEL_DISABLED) {
73 cfb_fillrect(info, rect);
74 return;
75 }
76 64
77 BEGIN_RING(chan, NvSubGdiRect, 0x02fc, 1); 65 BEGIN_RING(chan, NvSubGdiRect, 0x02fc, 1);
78 OUT_RING(chan, (rect->rop != ROP_COPY) ? 1 : 3); 66 OUT_RING(chan, (rect->rop != ROP_COPY) ? 1 : 3);
@@ -86,9 +74,10 @@ nv04_fbcon_fillrect(struct fb_info *info, const struct fb_fillrect *rect)
86 OUT_RING(chan, (rect->dx << 16) | rect->dy); 74 OUT_RING(chan, (rect->dx << 16) | rect->dy);
87 OUT_RING(chan, (rect->width << 16) | rect->height); 75 OUT_RING(chan, (rect->width << 16) | rect->height);
88 FIRE_RING(chan); 76 FIRE_RING(chan);
77 return 0;
89} 78}
90 79
91void 80int
92nv04_fbcon_imageblit(struct fb_info *info, const struct fb_image *image) 81nv04_fbcon_imageblit(struct fb_info *info, const struct fb_image *image)
93{ 82{
94 struct nouveau_fbdev *nfbdev = info->par; 83 struct nouveau_fbdev *nfbdev = info->par;
@@ -100,23 +89,14 @@ nv04_fbcon_imageblit(struct fb_info *info, const struct fb_image *image)
100 uint32_t dsize; 89 uint32_t dsize;
101 uint32_t width; 90 uint32_t width;
102 uint32_t *data = (uint32_t *)image->data; 91 uint32_t *data = (uint32_t *)image->data;
92 int ret;
103 93
104 if (info->state != FBINFO_STATE_RUNNING) 94 if (image->depth != 1)
105 return; 95 return -ENODEV;
106
107 if (image->depth != 1) {
108 cfb_imageblit(info, image);
109 return;
110 }
111
112 if (!(info->flags & FBINFO_HWACCEL_DISABLED) && RING_SPACE(chan, 8)) {
113 nouveau_fbcon_gpu_lockup(info);
114 }
115 96
116 if (info->flags & FBINFO_HWACCEL_DISABLED) { 97 ret = RING_SPACE(chan, 8);
117 cfb_imageblit(info, image); 98 if (ret)
118 return; 99 return ret;
119 }
120 100
121 width = ALIGN(image->width, 8); 101 width = ALIGN(image->width, 8);
122 dsize = ALIGN(width * image->height, 32) >> 5; 102 dsize = ALIGN(width * image->height, 32) >> 5;
@@ -143,11 +123,9 @@ nv04_fbcon_imageblit(struct fb_info *info, const struct fb_image *image)
143 while (dsize) { 123 while (dsize) {
144 int iter_len = dsize > 128 ? 128 : dsize; 124 int iter_len = dsize > 128 ? 128 : dsize;
145 125
146 if (RING_SPACE(chan, iter_len + 1)) { 126 ret = RING_SPACE(chan, iter_len + 1);
147 nouveau_fbcon_gpu_lockup(info); 127 if (ret)
148 cfb_imageblit(info, image); 128 return ret;
149 return;
150 }
151 129
152 BEGIN_RING(chan, NvSubGdiRect, 0x0c00, iter_len); 130 BEGIN_RING(chan, NvSubGdiRect, 0x0c00, iter_len);
153 OUT_RINGp(chan, data, iter_len); 131 OUT_RINGp(chan, data, iter_len);
@@ -156,23 +134,6 @@ nv04_fbcon_imageblit(struct fb_info *info, const struct fb_image *image)
156 } 134 }
157 135
158 FIRE_RING(chan); 136 FIRE_RING(chan);
159}
160
161static int
162nv04_fbcon_grobj_new(struct drm_device *dev, int class, uint32_t handle)
163{
164 struct drm_nouveau_private *dev_priv = dev->dev_private;
165 struct nouveau_gpuobj *obj = NULL;
166 int ret;
167
168 ret = nouveau_gpuobj_gr_new(dev_priv->channel, class, &obj);
169 if (ret)
170 return ret;
171
172 ret = nouveau_gpuobj_ref_add(dev, dev_priv->channel, handle, obj, NULL);
173 if (ret)
174 return ret;
175
176 return 0; 137 return 0;
177} 138}
178 139
@@ -215,29 +176,31 @@ nv04_fbcon_accel_init(struct fb_info *info)
215 return -EINVAL; 176 return -EINVAL;
216 } 177 }
217 178
218 ret = nv04_fbcon_grobj_new(dev, dev_priv->card_type >= NV_10 ? 179 ret = nouveau_gpuobj_gr_new(chan, NvCtxSurf2D,
219 0x0062 : 0x0042, NvCtxSurf2D); 180 dev_priv->card_type >= NV_10 ?
181 0x0062 : 0x0042);
220 if (ret) 182 if (ret)
221 return ret; 183 return ret;
222 184
223 ret = nv04_fbcon_grobj_new(dev, 0x0019, NvClipRect); 185 ret = nouveau_gpuobj_gr_new(chan, NvClipRect, 0x0019);
224 if (ret) 186 if (ret)
225 return ret; 187 return ret;
226 188
227 ret = nv04_fbcon_grobj_new(dev, 0x0043, NvRop); 189 ret = nouveau_gpuobj_gr_new(chan, NvRop, 0x0043);
228 if (ret) 190 if (ret)
229 return ret; 191 return ret;
230 192
231 ret = nv04_fbcon_grobj_new(dev, 0x0044, NvImagePatt); 193 ret = nouveau_gpuobj_gr_new(chan, NvImagePatt, 0x0044);
232 if (ret) 194 if (ret)
233 return ret; 195 return ret;
234 196
235 ret = nv04_fbcon_grobj_new(dev, 0x004a, NvGdiRect); 197 ret = nouveau_gpuobj_gr_new(chan, NvGdiRect, 0x004a);
236 if (ret) 198 if (ret)
237 return ret; 199 return ret;
238 200
239 ret = nv04_fbcon_grobj_new(dev, dev_priv->chipset >= 0x11 ? 201 ret = nouveau_gpuobj_gr_new(chan, NvImageBlit,
240 0x009f : 0x005f, NvImageBlit); 202 dev_priv->chipset >= 0x11 ?
203 0x009f : 0x005f);
241 if (ret) 204 if (ret)
242 return ret; 205 return ret;
243 206
diff --git a/drivers/gpu/drm/nouveau/nv04_fifo.c b/drivers/gpu/drm/nouveau/nv04_fifo.c
index 06cedd99c26a..db465a3ee1b2 100644
--- a/drivers/gpu/drm/nouveau/nv04_fifo.c
+++ b/drivers/gpu/drm/nouveau/nv04_fifo.c
@@ -27,8 +27,10 @@
27#include "drmP.h" 27#include "drmP.h"
28#include "drm.h" 28#include "drm.h"
29#include "nouveau_drv.h" 29#include "nouveau_drv.h"
30#include "nouveau_ramht.h"
31#include "nouveau_util.h"
30 32
31#define NV04_RAMFC(c) (dev_priv->ramfc_offset + ((c) * NV04_RAMFC__SIZE)) 33#define NV04_RAMFC(c) (dev_priv->ramfc->pinst + ((c) * NV04_RAMFC__SIZE))
32#define NV04_RAMFC__SIZE 32 34#define NV04_RAMFC__SIZE 32
33#define NV04_RAMFC_DMA_PUT 0x00 35#define NV04_RAMFC_DMA_PUT 0x00
34#define NV04_RAMFC_DMA_GET 0x04 36#define NV04_RAMFC_DMA_GET 0x04
@@ -38,10 +40,8 @@
38#define NV04_RAMFC_ENGINE 0x14 40#define NV04_RAMFC_ENGINE 0x14
39#define NV04_RAMFC_PULL1_ENGINE 0x18 41#define NV04_RAMFC_PULL1_ENGINE 0x18
40 42
41#define RAMFC_WR(offset, val) nv_wo32(dev, chan->ramfc->gpuobj, \ 43#define RAMFC_WR(offset, val) nv_wo32(chan->ramfc, NV04_RAMFC_##offset, (val))
42 NV04_RAMFC_##offset/4, (val)) 44#define RAMFC_RD(offset) nv_ro32(chan->ramfc, NV04_RAMFC_##offset)
43#define RAMFC_RD(offset) nv_ro32(dev, chan->ramfc->gpuobj, \
44 NV04_RAMFC_##offset/4)
45 45
46void 46void
47nv04_fifo_disable(struct drm_device *dev) 47nv04_fifo_disable(struct drm_device *dev)
@@ -72,37 +72,32 @@ nv04_fifo_reassign(struct drm_device *dev, bool enable)
72} 72}
73 73
74bool 74bool
75nv04_fifo_cache_flush(struct drm_device *dev)
76{
77 struct drm_nouveau_private *dev_priv = dev->dev_private;
78 struct nouveau_timer_engine *ptimer = &dev_priv->engine.timer;
79 uint64_t start = ptimer->read(dev);
80
81 do {
82 if (nv_rd32(dev, NV03_PFIFO_CACHE1_GET) ==
83 nv_rd32(dev, NV03_PFIFO_CACHE1_PUT))
84 return true;
85
86 } while (ptimer->read(dev) - start < 100000000);
87
88 NV_ERROR(dev, "Timeout flushing the PFIFO cache.\n");
89
90 return false;
91}
92
93bool
94nv04_fifo_cache_pull(struct drm_device *dev, bool enable) 75nv04_fifo_cache_pull(struct drm_device *dev, bool enable)
95{ 76{
96 uint32_t pull = nv_rd32(dev, NV04_PFIFO_CACHE1_PULL0); 77 int pull = nv_mask(dev, NV04_PFIFO_CACHE1_PULL0, 1, enable);
78
79 if (!enable) {
80 /* In some cases the PFIFO puller may be left in an
81 * inconsistent state if you try to stop it when it's
82 * busy translating handles. Sometimes you get a
83 * PFIFO_CACHE_ERROR, sometimes it just fails silently
84 * sending incorrect instance offsets to PGRAPH after
85 * it's started up again. To avoid the latter we
86 * invalidate the most recently calculated instance.
87 */
88 if (!nv_wait(dev, NV04_PFIFO_CACHE1_PULL0,
89 NV04_PFIFO_CACHE1_PULL0_HASH_BUSY, 0))
90 NV_ERROR(dev, "Timeout idling the PFIFO puller.\n");
91
92 if (nv_rd32(dev, NV04_PFIFO_CACHE1_PULL0) &
93 NV04_PFIFO_CACHE1_PULL0_HASH_FAILED)
94 nv_wr32(dev, NV03_PFIFO_INTR_0,
95 NV_PFIFO_INTR_CACHE_ERROR);
97 96
98 if (enable) {
99 nv_wr32(dev, NV04_PFIFO_CACHE1_PULL0, pull | 1);
100 } else {
101 nv_wr32(dev, NV04_PFIFO_CACHE1_PULL0, pull & ~1);
102 nv_wr32(dev, NV04_PFIFO_CACHE1_HASH, 0); 97 nv_wr32(dev, NV04_PFIFO_CACHE1_HASH, 0);
103 } 98 }
104 99
105 return !!(pull & 1); 100 return pull & 1;
106} 101}
107 102
108int 103int
@@ -130,16 +125,21 @@ nv04_fifo_create_context(struct nouveau_channel *chan)
130 NV04_RAMFC__SIZE, 125 NV04_RAMFC__SIZE,
131 NVOBJ_FLAG_ZERO_ALLOC | 126 NVOBJ_FLAG_ZERO_ALLOC |
132 NVOBJ_FLAG_ZERO_FREE, 127 NVOBJ_FLAG_ZERO_FREE,
133 NULL, &chan->ramfc); 128 &chan->ramfc);
134 if (ret) 129 if (ret)
135 return ret; 130 return ret;
136 131
132 chan->user = ioremap(pci_resource_start(dev->pdev, 0) +
133 NV03_USER(chan->id), PAGE_SIZE);
134 if (!chan->user)
135 return -ENOMEM;
136
137 spin_lock_irqsave(&dev_priv->context_switch_lock, flags); 137 spin_lock_irqsave(&dev_priv->context_switch_lock, flags);
138 138
139 /* Setup initial state */ 139 /* Setup initial state */
140 RAMFC_WR(DMA_PUT, chan->pushbuf_base); 140 RAMFC_WR(DMA_PUT, chan->pushbuf_base);
141 RAMFC_WR(DMA_GET, chan->pushbuf_base); 141 RAMFC_WR(DMA_GET, chan->pushbuf_base);
142 RAMFC_WR(DMA_INSTANCE, chan->pushbuf->instance >> 4); 142 RAMFC_WR(DMA_INSTANCE, chan->pushbuf->pinst >> 4);
143 RAMFC_WR(DMA_FETCH, (NV_PFIFO_CACHE1_DMA_FETCH_TRIG_128_BYTES | 143 RAMFC_WR(DMA_FETCH, (NV_PFIFO_CACHE1_DMA_FETCH_TRIG_128_BYTES |
144 NV_PFIFO_CACHE1_DMA_FETCH_SIZE_128_BYTES | 144 NV_PFIFO_CACHE1_DMA_FETCH_SIZE_128_BYTES |
145 NV_PFIFO_CACHE1_DMA_FETCH_MAX_REQS_8 | 145 NV_PFIFO_CACHE1_DMA_FETCH_MAX_REQS_8 |
@@ -157,11 +157,32 @@ void
157nv04_fifo_destroy_context(struct nouveau_channel *chan) 157nv04_fifo_destroy_context(struct nouveau_channel *chan)
158{ 158{
159 struct drm_device *dev = chan->dev; 159 struct drm_device *dev = chan->dev;
160 struct drm_nouveau_private *dev_priv = dev->dev_private;
161 struct nouveau_fifo_engine *pfifo = &dev_priv->engine.fifo;
162 unsigned long flags;
160 163
161 nv_wr32(dev, NV04_PFIFO_MODE, 164 spin_lock_irqsave(&dev_priv->context_switch_lock, flags);
162 nv_rd32(dev, NV04_PFIFO_MODE) & ~(1 << chan->id)); 165 pfifo->reassign(dev, false);
163 166
164 nouveau_gpuobj_ref_del(dev, &chan->ramfc); 167 /* Unload the context if it's the currently active one */
168 if (pfifo->channel_id(dev) == chan->id) {
169 pfifo->disable(dev);
170 pfifo->unload_context(dev);
171 pfifo->enable(dev);
172 }
173
174 /* Keep it from being rescheduled */
175 nv_mask(dev, NV04_PFIFO_MODE, 1 << chan->id, 0);
176
177 pfifo->reassign(dev, true);
178 spin_unlock_irqrestore(&dev_priv->context_switch_lock, flags);
179
180 /* Free the channel resources */
181 if (chan->user) {
182 iounmap(chan->user);
183 chan->user = NULL;
184 }
185 nouveau_gpuobj_ref(NULL, &chan->ramfc);
165} 186}
166 187
167static void 188static void
@@ -214,7 +235,7 @@ nv04_fifo_unload_context(struct drm_device *dev)
214 if (chid < 0 || chid >= dev_priv->engine.fifo.channels) 235 if (chid < 0 || chid >= dev_priv->engine.fifo.channels)
215 return 0; 236 return 0;
216 237
217 chan = dev_priv->fifos[chid]; 238 chan = dev_priv->channels.ptr[chid];
218 if (!chan) { 239 if (!chan) {
219 NV_ERROR(dev, "Inactive channel on PFIFO: %d\n", chid); 240 NV_ERROR(dev, "Inactive channel on PFIFO: %d\n", chid);
220 return -EINVAL; 241 return -EINVAL;
@@ -264,15 +285,16 @@ nv04_fifo_init_ramxx(struct drm_device *dev)
264 struct drm_nouveau_private *dev_priv = dev->dev_private; 285 struct drm_nouveau_private *dev_priv = dev->dev_private;
265 286
266 nv_wr32(dev, NV03_PFIFO_RAMHT, (0x03 << 24) /* search 128 */ | 287 nv_wr32(dev, NV03_PFIFO_RAMHT, (0x03 << 24) /* search 128 */ |
267 ((dev_priv->ramht_bits - 9) << 16) | 288 ((dev_priv->ramht->bits - 9) << 16) |
268 (dev_priv->ramht_offset >> 8)); 289 (dev_priv->ramht->gpuobj->pinst >> 8));
269 nv_wr32(dev, NV03_PFIFO_RAMRO, dev_priv->ramro_offset>>8); 290 nv_wr32(dev, NV03_PFIFO_RAMRO, dev_priv->ramro->pinst >> 8);
270 nv_wr32(dev, NV03_PFIFO_RAMFC, dev_priv->ramfc_offset >> 8); 291 nv_wr32(dev, NV03_PFIFO_RAMFC, dev_priv->ramfc->pinst >> 8);
271} 292}
272 293
273static void 294static void
274nv04_fifo_init_intr(struct drm_device *dev) 295nv04_fifo_init_intr(struct drm_device *dev)
275{ 296{
297 nouveau_irq_register(dev, 8, nv04_fifo_isr);
276 nv_wr32(dev, 0x002100, 0xffffffff); 298 nv_wr32(dev, 0x002100, 0xffffffff);
277 nv_wr32(dev, 0x002140, 0xffffffff); 299 nv_wr32(dev, 0x002140, 0xffffffff);
278} 300}
@@ -295,7 +317,7 @@ nv04_fifo_init(struct drm_device *dev)
295 pfifo->reassign(dev, true); 317 pfifo->reassign(dev, true);
296 318
297 for (i = 0; i < dev_priv->engine.fifo.channels; i++) { 319 for (i = 0; i < dev_priv->engine.fifo.channels; i++) {
298 if (dev_priv->fifos[i]) { 320 if (dev_priv->channels.ptr[i]) {
299 uint32_t mode = nv_rd32(dev, NV04_PFIFO_MODE); 321 uint32_t mode = nv_rd32(dev, NV04_PFIFO_MODE);
300 nv_wr32(dev, NV04_PFIFO_MODE, mode | (1 << i)); 322 nv_wr32(dev, NV04_PFIFO_MODE, mode | (1 << i));
301 } 323 }
@@ -304,3 +326,218 @@ nv04_fifo_init(struct drm_device *dev)
304 return 0; 326 return 0;
305} 327}
306 328
329void
330nv04_fifo_fini(struct drm_device *dev)
331{
332 nv_wr32(dev, 0x2140, 0x00000000);
333 nouveau_irq_unregister(dev, 8);
334}
335
336static bool
337nouveau_fifo_swmthd(struct drm_device *dev, u32 chid, u32 addr, u32 data)
338{
339 struct drm_nouveau_private *dev_priv = dev->dev_private;
340 struct nouveau_channel *chan = NULL;
341 struct nouveau_gpuobj *obj;
342 unsigned long flags;
343 const int subc = (addr >> 13) & 0x7;
344 const int mthd = addr & 0x1ffc;
345 bool handled = false;
346 u32 engine;
347
348 spin_lock_irqsave(&dev_priv->channels.lock, flags);
349 if (likely(chid >= 0 && chid < dev_priv->engine.fifo.channels))
350 chan = dev_priv->channels.ptr[chid];
351 if (unlikely(!chan))
352 goto out;
353
354 switch (mthd) {
355 case 0x0000: /* bind object to subchannel */
356 obj = nouveau_ramht_find(chan, data);
357 if (unlikely(!obj || obj->engine != NVOBJ_ENGINE_SW))
358 break;
359
360 chan->sw_subchannel[subc] = obj->class;
361 engine = 0x0000000f << (subc * 4);
362
363 nv_mask(dev, NV04_PFIFO_CACHE1_ENGINE, engine, 0x00000000);
364 handled = true;
365 break;
366 default:
367 engine = nv_rd32(dev, NV04_PFIFO_CACHE1_ENGINE);
368 if (unlikely(((engine >> (subc * 4)) & 0xf) != 0))
369 break;
370
371 if (!nouveau_gpuobj_mthd_call(chan, chan->sw_subchannel[subc],
372 mthd, data))
373 handled = true;
374 break;
375 }
376
377out:
378 spin_unlock_irqrestore(&dev_priv->channels.lock, flags);
379 return handled;
380}
381
382static const char *nv_dma_state_err(u32 state)
383{
384 static const char * const desc[] = {
385 "NONE", "CALL_SUBR_ACTIVE", "INVALID_MTHD", "RET_SUBR_INACTIVE",
386 "INVALID_CMD", "IB_EMPTY"/* NV50+ */, "MEM_FAULT", "UNK"
387 };
388 return desc[(state >> 29) & 0x7];
389}
390
391void
392nv04_fifo_isr(struct drm_device *dev)
393{
394 struct drm_nouveau_private *dev_priv = dev->dev_private;
395 struct nouveau_engine *engine = &dev_priv->engine;
396 uint32_t status, reassign;
397 int cnt = 0;
398
399 reassign = nv_rd32(dev, NV03_PFIFO_CACHES) & 1;
400 while ((status = nv_rd32(dev, NV03_PFIFO_INTR_0)) && (cnt++ < 100)) {
401 uint32_t chid, get;
402
403 nv_wr32(dev, NV03_PFIFO_CACHES, 0);
404
405 chid = engine->fifo.channel_id(dev);
406 get = nv_rd32(dev, NV03_PFIFO_CACHE1_GET);
407
408 if (status & NV_PFIFO_INTR_CACHE_ERROR) {
409 uint32_t mthd, data;
410 int ptr;
411
412 /* NV_PFIFO_CACHE1_GET actually goes to 0xffc before
413 * wrapping on my G80 chips, but CACHE1 isn't big
414 * enough for this much data.. Tests show that it
415 * wraps around to the start at GET=0x800.. No clue
416 * as to why..
417 */
418 ptr = (get & 0x7ff) >> 2;
419
420 if (dev_priv->card_type < NV_40) {
421 mthd = nv_rd32(dev,
422 NV04_PFIFO_CACHE1_METHOD(ptr));
423 data = nv_rd32(dev,
424 NV04_PFIFO_CACHE1_DATA(ptr));
425 } else {
426 mthd = nv_rd32(dev,
427 NV40_PFIFO_CACHE1_METHOD(ptr));
428 data = nv_rd32(dev,
429 NV40_PFIFO_CACHE1_DATA(ptr));
430 }
431
432 if (!nouveau_fifo_swmthd(dev, chid, mthd, data)) {
433 NV_INFO(dev, "PFIFO_CACHE_ERROR - Ch %d/%d "
434 "Mthd 0x%04x Data 0x%08x\n",
435 chid, (mthd >> 13) & 7, mthd & 0x1ffc,
436 data);
437 }
438
439 nv_wr32(dev, NV04_PFIFO_CACHE1_DMA_PUSH, 0);
440 nv_wr32(dev, NV03_PFIFO_INTR_0,
441 NV_PFIFO_INTR_CACHE_ERROR);
442
443 nv_wr32(dev, NV03_PFIFO_CACHE1_PUSH0,
444 nv_rd32(dev, NV03_PFIFO_CACHE1_PUSH0) & ~1);
445 nv_wr32(dev, NV03_PFIFO_CACHE1_GET, get + 4);
446 nv_wr32(dev, NV03_PFIFO_CACHE1_PUSH0,
447 nv_rd32(dev, NV03_PFIFO_CACHE1_PUSH0) | 1);
448 nv_wr32(dev, NV04_PFIFO_CACHE1_HASH, 0);
449
450 nv_wr32(dev, NV04_PFIFO_CACHE1_DMA_PUSH,
451 nv_rd32(dev, NV04_PFIFO_CACHE1_DMA_PUSH) | 1);
452 nv_wr32(dev, NV04_PFIFO_CACHE1_PULL0, 1);
453
454 status &= ~NV_PFIFO_INTR_CACHE_ERROR;
455 }
456
457 if (status & NV_PFIFO_INTR_DMA_PUSHER) {
458 u32 dma_get = nv_rd32(dev, 0x003244);
459 u32 dma_put = nv_rd32(dev, 0x003240);
460 u32 push = nv_rd32(dev, 0x003220);
461 u32 state = nv_rd32(dev, 0x003228);
462
463 if (dev_priv->card_type == NV_50) {
464 u32 ho_get = nv_rd32(dev, 0x003328);
465 u32 ho_put = nv_rd32(dev, 0x003320);
466 u32 ib_get = nv_rd32(dev, 0x003334);
467 u32 ib_put = nv_rd32(dev, 0x003330);
468
469 if (nouveau_ratelimit())
470 NV_INFO(dev, "PFIFO_DMA_PUSHER - Ch %d Get 0x%02x%08x "
471 "Put 0x%02x%08x IbGet 0x%08x IbPut 0x%08x "
472 "State 0x%08x (err: %s) Push 0x%08x\n",
473 chid, ho_get, dma_get, ho_put,
474 dma_put, ib_get, ib_put, state,
475 nv_dma_state_err(state),
476 push);
477
478 /* METHOD_COUNT, in DMA_STATE on earlier chipsets */
479 nv_wr32(dev, 0x003364, 0x00000000);
480 if (dma_get != dma_put || ho_get != ho_put) {
481 nv_wr32(dev, 0x003244, dma_put);
482 nv_wr32(dev, 0x003328, ho_put);
483 } else
484 if (ib_get != ib_put) {
485 nv_wr32(dev, 0x003334, ib_put);
486 }
487 } else {
488 NV_INFO(dev, "PFIFO_DMA_PUSHER - Ch %d Get 0x%08x "
489 "Put 0x%08x State 0x%08x (err: %s) Push 0x%08x\n",
490 chid, dma_get, dma_put, state,
491 nv_dma_state_err(state), push);
492
493 if (dma_get != dma_put)
494 nv_wr32(dev, 0x003244, dma_put);
495 }
496
497 nv_wr32(dev, 0x003228, 0x00000000);
498 nv_wr32(dev, 0x003220, 0x00000001);
499 nv_wr32(dev, 0x002100, NV_PFIFO_INTR_DMA_PUSHER);
500 status &= ~NV_PFIFO_INTR_DMA_PUSHER;
501 }
502
503 if (status & NV_PFIFO_INTR_SEMAPHORE) {
504 uint32_t sem;
505
506 status &= ~NV_PFIFO_INTR_SEMAPHORE;
507 nv_wr32(dev, NV03_PFIFO_INTR_0,
508 NV_PFIFO_INTR_SEMAPHORE);
509
510 sem = nv_rd32(dev, NV10_PFIFO_CACHE1_SEMAPHORE);
511 nv_wr32(dev, NV10_PFIFO_CACHE1_SEMAPHORE, sem | 0x1);
512
513 nv_wr32(dev, NV03_PFIFO_CACHE1_GET, get + 4);
514 nv_wr32(dev, NV04_PFIFO_CACHE1_PULL0, 1);
515 }
516
517 if (dev_priv->card_type == NV_50) {
518 if (status & 0x00000010) {
519 nv50_fb_vm_trap(dev, nouveau_ratelimit());
520 status &= ~0x00000010;
521 nv_wr32(dev, 0x002100, 0x00000010);
522 }
523 }
524
525 if (status) {
526 if (nouveau_ratelimit())
527 NV_INFO(dev, "PFIFO_INTR 0x%08x - Ch %d\n",
528 status, chid);
529 nv_wr32(dev, NV03_PFIFO_INTR_0, status);
530 status = 0;
531 }
532
533 nv_wr32(dev, NV03_PFIFO_CACHES, reassign);
534 }
535
536 if (status) {
537 NV_INFO(dev, "PFIFO still angry after %d spins, halt\n", cnt);
538 nv_wr32(dev, 0x2140, 0);
539 nv_wr32(dev, 0x140, 0);
540 }
541
542 nv_wr32(dev, NV03_PMC_INTR_0, NV_PMC_INTR_0_PFIFO_PENDING);
543}
diff --git a/drivers/gpu/drm/nouveau/nv04_graph.c b/drivers/gpu/drm/nouveau/nv04_graph.c
index c8973421b635..3626ee7db3ba 100644
--- a/drivers/gpu/drm/nouveau/nv04_graph.c
+++ b/drivers/gpu/drm/nouveau/nv04_graph.c
@@ -26,6 +26,13 @@
26#include "drm.h" 26#include "drm.h"
27#include "nouveau_drm.h" 27#include "nouveau_drm.h"
28#include "nouveau_drv.h" 28#include "nouveau_drv.h"
29#include "nouveau_hw.h"
30#include "nouveau_util.h"
31#include "nouveau_ramht.h"
32
33struct nv04_graph_engine {
34 struct nouveau_exec_engine base;
35};
29 36
30static uint32_t nv04_graph_ctx_regs[] = { 37static uint32_t nv04_graph_ctx_regs[] = {
31 0x0040053c, 38 0x0040053c,
@@ -345,7 +352,7 @@ struct graph_state {
345 uint32_t nv04[ARRAY_SIZE(nv04_graph_ctx_regs)]; 352 uint32_t nv04[ARRAY_SIZE(nv04_graph_ctx_regs)];
346}; 353};
347 354
348struct nouveau_channel * 355static struct nouveau_channel *
349nv04_graph_channel(struct drm_device *dev) 356nv04_graph_channel(struct drm_device *dev)
350{ 357{
351 struct drm_nouveau_private *dev_priv = dev->dev_private; 358 struct drm_nouveau_private *dev_priv = dev->dev_private;
@@ -357,30 +364,7 @@ nv04_graph_channel(struct drm_device *dev)
357 if (chid >= dev_priv->engine.fifo.channels) 364 if (chid >= dev_priv->engine.fifo.channels)
358 return NULL; 365 return NULL;
359 366
360 return dev_priv->fifos[chid]; 367 return dev_priv->channels.ptr[chid];
361}
362
363void
364nv04_graph_context_switch(struct drm_device *dev)
365{
366 struct drm_nouveau_private *dev_priv = dev->dev_private;
367 struct nouveau_pgraph_engine *pgraph = &dev_priv->engine.graph;
368 struct nouveau_channel *chan = NULL;
369 int chid;
370
371 pgraph->fifo_access(dev, false);
372 nouveau_wait_for_idle(dev);
373
374 /* If previous context is valid, we need to save it */
375 pgraph->unload_context(dev);
376
377 /* Load context for next channel */
378 chid = dev_priv->engine.fifo.channel_id(dev);
379 chan = dev_priv->fifos[chid];
380 if (chan)
381 nv04_graph_load_context(chan);
382
383 pgraph->fifo_access(dev, true);
384} 368}
385 369
386static uint32_t *ctx_reg(struct graph_state *ctx, uint32_t reg) 370static uint32_t *ctx_reg(struct graph_state *ctx, uint32_t reg)
@@ -395,33 +379,11 @@ static uint32_t *ctx_reg(struct graph_state *ctx, uint32_t reg)
395 return NULL; 379 return NULL;
396} 380}
397 381
398int nv04_graph_create_context(struct nouveau_channel *chan) 382static int
399{ 383nv04_graph_load_context(struct nouveau_channel *chan)
400 struct graph_state *pgraph_ctx;
401 NV_DEBUG(chan->dev, "nv04_graph_context_create %d\n", chan->id);
402
403 chan->pgraph_ctx = pgraph_ctx = kzalloc(sizeof(*pgraph_ctx),
404 GFP_KERNEL);
405 if (pgraph_ctx == NULL)
406 return -ENOMEM;
407
408 *ctx_reg(pgraph_ctx, NV04_PGRAPH_DEBUG_3) = 0xfad4ff31;
409
410 return 0;
411}
412
413void nv04_graph_destroy_context(struct nouveau_channel *chan)
414{
415 struct graph_state *pgraph_ctx = chan->pgraph_ctx;
416
417 kfree(pgraph_ctx);
418 chan->pgraph_ctx = NULL;
419}
420
421int nv04_graph_load_context(struct nouveau_channel *chan)
422{ 384{
385 struct graph_state *pgraph_ctx = chan->engctx[NVOBJ_ENGINE_GR];
423 struct drm_device *dev = chan->dev; 386 struct drm_device *dev = chan->dev;
424 struct graph_state *pgraph_ctx = chan->pgraph_ctx;
425 uint32_t tmp; 387 uint32_t tmp;
426 int i; 388 int i;
427 389
@@ -439,20 +401,19 @@ int nv04_graph_load_context(struct nouveau_channel *chan)
439 return 0; 401 return 0;
440} 402}
441 403
442int 404static int
443nv04_graph_unload_context(struct drm_device *dev) 405nv04_graph_unload_context(struct drm_device *dev)
444{ 406{
445 struct drm_nouveau_private *dev_priv = dev->dev_private; 407 struct drm_nouveau_private *dev_priv = dev->dev_private;
446 struct nouveau_pgraph_engine *pgraph = &dev_priv->engine.graph;
447 struct nouveau_channel *chan = NULL; 408 struct nouveau_channel *chan = NULL;
448 struct graph_state *ctx; 409 struct graph_state *ctx;
449 uint32_t tmp; 410 uint32_t tmp;
450 int i; 411 int i;
451 412
452 chan = pgraph->channel(dev); 413 chan = nv04_graph_channel(dev);
453 if (!chan) 414 if (!chan)
454 return 0; 415 return 0;
455 ctx = chan->pgraph_ctx; 416 ctx = chan->engctx[NVOBJ_ENGINE_GR];
456 417
457 for (i = 0; i < ARRAY_SIZE(nv04_graph_ctx_regs); i++) 418 for (i = 0; i < ARRAY_SIZE(nv04_graph_ctx_regs); i++)
458 ctx->nv04[i] = nv_rd32(dev, nv04_graph_ctx_regs[i]); 419 ctx->nv04[i] = nv_rd32(dev, nv04_graph_ctx_regs[i]);
@@ -464,7 +425,75 @@ nv04_graph_unload_context(struct drm_device *dev)
464 return 0; 425 return 0;
465} 426}
466 427
467int nv04_graph_init(struct drm_device *dev) 428static int
429nv04_graph_context_new(struct nouveau_channel *chan, int engine)
430{
431 struct graph_state *pgraph_ctx;
432 NV_DEBUG(chan->dev, "nv04_graph_context_create %d\n", chan->id);
433
434 pgraph_ctx = kzalloc(sizeof(*pgraph_ctx), GFP_KERNEL);
435 if (pgraph_ctx == NULL)
436 return -ENOMEM;
437
438 *ctx_reg(pgraph_ctx, NV04_PGRAPH_DEBUG_3) = 0xfad4ff31;
439
440 chan->engctx[engine] = pgraph_ctx;
441 return 0;
442}
443
444static void
445nv04_graph_context_del(struct nouveau_channel *chan, int engine)
446{
447 struct drm_device *dev = chan->dev;
448 struct drm_nouveau_private *dev_priv = dev->dev_private;
449 struct graph_state *pgraph_ctx = chan->engctx[engine];
450 unsigned long flags;
451
452 spin_lock_irqsave(&dev_priv->context_switch_lock, flags);
453 nv04_graph_fifo_access(dev, false);
454
455 /* Unload the context if it's the currently active one */
456 if (nv04_graph_channel(dev) == chan)
457 nv04_graph_unload_context(dev);
458
459 nv04_graph_fifo_access(dev, true);
460 spin_unlock_irqrestore(&dev_priv->context_switch_lock, flags);
461
462 /* Free the context resources */
463 kfree(pgraph_ctx);
464 chan->engctx[engine] = NULL;
465}
466
467int
468nv04_graph_object_new(struct nouveau_channel *chan, int engine,
469 u32 handle, u16 class)
470{
471 struct drm_device *dev = chan->dev;
472 struct nouveau_gpuobj *obj = NULL;
473 int ret;
474
475 ret = nouveau_gpuobj_new(dev, chan, 16, 16, NVOBJ_FLAG_ZERO_FREE, &obj);
476 if (ret)
477 return ret;
478 obj->engine = 1;
479 obj->class = class;
480
481#ifdef __BIG_ENDIAN
482 nv_wo32(obj, 0x00, 0x00080000 | class);
483#else
484 nv_wo32(obj, 0x00, class);
485#endif
486 nv_wo32(obj, 0x04, 0x00000000);
487 nv_wo32(obj, 0x08, 0x00000000);
488 nv_wo32(obj, 0x0c, 0x00000000);
489
490 ret = nouveau_ramht_insert(chan, handle, obj);
491 nouveau_gpuobj_ref(NULL, &obj);
492 return ret;
493}
494
495static int
496nv04_graph_init(struct drm_device *dev, int engine)
468{ 497{
469 struct drm_nouveau_private *dev_priv = dev->dev_private; 498 struct drm_nouveau_private *dev_priv = dev->dev_private;
470 uint32_t tmp; 499 uint32_t tmp;
@@ -484,7 +513,7 @@ int nv04_graph_init(struct drm_device *dev)
484 nv_wr32(dev, NV04_PGRAPH_DEBUG_0, 0x001FFFFF);*/ 513 nv_wr32(dev, NV04_PGRAPH_DEBUG_0, 0x001FFFFF);*/
485 nv_wr32(dev, NV04_PGRAPH_DEBUG_0, 0x1231c000); 514 nv_wr32(dev, NV04_PGRAPH_DEBUG_0, 0x1231c000);
486 /*1231C000 blob, 001 haiku*/ 515 /*1231C000 blob, 001 haiku*/
487 //*V_WRITE(NV04_PGRAPH_DEBUG_1, 0xf2d91100);*/ 516 /*V_WRITE(NV04_PGRAPH_DEBUG_1, 0xf2d91100);*/
488 nv_wr32(dev, NV04_PGRAPH_DEBUG_1, 0x72111100); 517 nv_wr32(dev, NV04_PGRAPH_DEBUG_1, 0x72111100);
489 /*0x72111100 blob , 01 haiku*/ 518 /*0x72111100 blob , 01 haiku*/
490 /*nv_wr32(dev, NV04_PGRAPH_DEBUG_2, 0x11d5f870);*/ 519 /*nv_wr32(dev, NV04_PGRAPH_DEBUG_2, 0x11d5f870);*/
@@ -508,8 +537,12 @@ int nv04_graph_init(struct drm_device *dev)
508 return 0; 537 return 0;
509} 538}
510 539
511void nv04_graph_takedown(struct drm_device *dev) 540static int
541nv04_graph_fini(struct drm_device *dev, int engine)
512{ 542{
543 nv04_graph_unload_context(dev);
544 nv_wr32(dev, NV03_PGRAPH_INTR_EN, 0x00000000);
545 return 0;
513} 546}
514 547
515void 548void
@@ -524,13 +557,27 @@ nv04_graph_fifo_access(struct drm_device *dev, bool enabled)
524} 557}
525 558
526static int 559static int
527nv04_graph_mthd_set_ref(struct nouveau_channel *chan, int grclass, 560nv04_graph_mthd_set_ref(struct nouveau_channel *chan,
528 int mthd, uint32_t data) 561 u32 class, u32 mthd, u32 data)
529{ 562{
530 atomic_set(&chan->fence.last_sequence_irq, data); 563 atomic_set(&chan->fence.last_sequence_irq, data);
531 return 0; 564 return 0;
532} 565}
533 566
567int
568nv04_graph_mthd_page_flip(struct nouveau_channel *chan,
569 u32 class, u32 mthd, u32 data)
570{
571 struct drm_device *dev = chan->dev;
572 struct nouveau_page_flip_state s;
573
574 if (!nouveau_finish_page_flip(chan, &s))
575 nv_set_crtc_base(dev, s.crtc,
576 s.offset + s.y * s.pitch + s.x * s.bpp / 8);
577
578 return 0;
579}
580
534/* 581/*
535 * Software methods, why they are needed, and how they all work: 582 * Software methods, why they are needed, and how they all work:
536 * 583 *
@@ -606,12 +653,12 @@ nv04_graph_mthd_set_ref(struct nouveau_channel *chan, int grclass,
606 */ 653 */
607 654
608static void 655static void
609nv04_graph_set_ctx1(struct nouveau_channel *chan, uint32_t mask, uint32_t value) 656nv04_graph_set_ctx1(struct nouveau_channel *chan, u32 mask, u32 value)
610{ 657{
611 struct drm_device *dev = chan->dev; 658 struct drm_device *dev = chan->dev;
612 uint32_t instance = (nv_rd32(dev, NV04_PGRAPH_CTX_SWITCH4) & 0xffff) << 4; 659 u32 instance = (nv_rd32(dev, NV04_PGRAPH_CTX_SWITCH4) & 0xffff) << 4;
613 int subc = (nv_rd32(dev, NV04_PGRAPH_TRAPPED_ADDR) >> 13) & 0x7; 660 int subc = (nv_rd32(dev, NV04_PGRAPH_TRAPPED_ADDR) >> 13) & 0x7;
614 uint32_t tmp; 661 u32 tmp;
615 662
616 tmp = nv_ri32(dev, instance); 663 tmp = nv_ri32(dev, instance);
617 tmp &= ~mask; 664 tmp &= ~mask;
@@ -623,11 +670,11 @@ nv04_graph_set_ctx1(struct nouveau_channel *chan, uint32_t mask, uint32_t value)
623} 670}
624 671
625static void 672static void
626nv04_graph_set_ctx_val(struct nouveau_channel *chan, uint32_t mask, uint32_t value) 673nv04_graph_set_ctx_val(struct nouveau_channel *chan, u32 mask, u32 value)
627{ 674{
628 struct drm_device *dev = chan->dev; 675 struct drm_device *dev = chan->dev;
629 uint32_t instance = (nv_rd32(dev, NV04_PGRAPH_CTX_SWITCH4) & 0xffff) << 4; 676 u32 instance = (nv_rd32(dev, NV04_PGRAPH_CTX_SWITCH4) & 0xffff) << 4;
630 uint32_t tmp, ctx1; 677 u32 tmp, ctx1;
631 int class, op, valid = 1; 678 int class, op, valid = 1;
632 679
633 ctx1 = nv_ri32(dev, instance); 680 ctx1 = nv_ri32(dev, instance);
@@ -672,13 +719,13 @@ nv04_graph_set_ctx_val(struct nouveau_channel *chan, uint32_t mask, uint32_t val
672} 719}
673 720
674static int 721static int
675nv04_graph_mthd_set_operation(struct nouveau_channel *chan, int grclass, 722nv04_graph_mthd_set_operation(struct nouveau_channel *chan,
676 int mthd, uint32_t data) 723 u32 class, u32 mthd, u32 data)
677{ 724{
678 if (data > 5) 725 if (data > 5)
679 return 1; 726 return 1;
680 /* Old versions of the objects only accept first three operations. */ 727 /* Old versions of the objects only accept first three operations. */
681 if (data > 2 && grclass < 0x40) 728 if (data > 2 && class < 0x40)
682 return 1; 729 return 1;
683 nv04_graph_set_ctx1(chan, 0x00038000, data << 15); 730 nv04_graph_set_ctx1(chan, 0x00038000, data << 15);
684 /* changing operation changes set of objects needed for validation */ 731 /* changing operation changes set of objects needed for validation */
@@ -687,8 +734,8 @@ nv04_graph_mthd_set_operation(struct nouveau_channel *chan, int grclass,
687} 734}
688 735
689static int 736static int
690nv04_graph_mthd_surf3d_clip_h(struct nouveau_channel *chan, int grclass, 737nv04_graph_mthd_surf3d_clip_h(struct nouveau_channel *chan,
691 int mthd, uint32_t data) 738 u32 class, u32 mthd, u32 data)
692{ 739{
693 uint32_t min = data & 0xffff, max; 740 uint32_t min = data & 0xffff, max;
694 uint32_t w = data >> 16; 741 uint32_t w = data >> 16;
@@ -706,8 +753,8 @@ nv04_graph_mthd_surf3d_clip_h(struct nouveau_channel *chan, int grclass,
706} 753}
707 754
708static int 755static int
709nv04_graph_mthd_surf3d_clip_v(struct nouveau_channel *chan, int grclass, 756nv04_graph_mthd_surf3d_clip_v(struct nouveau_channel *chan,
710 int mthd, uint32_t data) 757 u32 class, u32 mthd, u32 data)
711{ 758{
712 uint32_t min = data & 0xffff, max; 759 uint32_t min = data & 0xffff, max;
713 uint32_t w = data >> 16; 760 uint32_t w = data >> 16;
@@ -725,8 +772,8 @@ nv04_graph_mthd_surf3d_clip_v(struct nouveau_channel *chan, int grclass,
725} 772}
726 773
727static int 774static int
728nv04_graph_mthd_bind_surf2d(struct nouveau_channel *chan, int grclass, 775nv04_graph_mthd_bind_surf2d(struct nouveau_channel *chan,
729 int mthd, uint32_t data) 776 u32 class, u32 mthd, u32 data)
730{ 777{
731 switch (nv_ri32(chan->dev, data << 4) & 0xff) { 778 switch (nv_ri32(chan->dev, data << 4) & 0xff) {
732 case 0x30: 779 case 0x30:
@@ -742,8 +789,8 @@ nv04_graph_mthd_bind_surf2d(struct nouveau_channel *chan, int grclass,
742} 789}
743 790
744static int 791static int
745nv04_graph_mthd_bind_surf2d_swzsurf(struct nouveau_channel *chan, int grclass, 792nv04_graph_mthd_bind_surf2d_swzsurf(struct nouveau_channel *chan,
746 int mthd, uint32_t data) 793 u32 class, u32 mthd, u32 data)
747{ 794{
748 switch (nv_ri32(chan->dev, data << 4) & 0xff) { 795 switch (nv_ri32(chan->dev, data << 4) & 0xff) {
749 case 0x30: 796 case 0x30:
@@ -763,8 +810,8 @@ nv04_graph_mthd_bind_surf2d_swzsurf(struct nouveau_channel *chan, int grclass,
763} 810}
764 811
765static int 812static int
766nv04_graph_mthd_bind_nv01_patt(struct nouveau_channel *chan, int grclass, 813nv04_graph_mthd_bind_nv01_patt(struct nouveau_channel *chan,
767 int mthd, uint32_t data) 814 u32 class, u32 mthd, u32 data)
768{ 815{
769 switch (nv_ri32(chan->dev, data << 4) & 0xff) { 816 switch (nv_ri32(chan->dev, data << 4) & 0xff) {
770 case 0x30: 817 case 0x30:
@@ -778,8 +825,8 @@ nv04_graph_mthd_bind_nv01_patt(struct nouveau_channel *chan, int grclass,
778} 825}
779 826
780static int 827static int
781nv04_graph_mthd_bind_nv04_patt(struct nouveau_channel *chan, int grclass, 828nv04_graph_mthd_bind_nv04_patt(struct nouveau_channel *chan,
782 int mthd, uint32_t data) 829 u32 class, u32 mthd, u32 data)
783{ 830{
784 switch (nv_ri32(chan->dev, data << 4) & 0xff) { 831 switch (nv_ri32(chan->dev, data << 4) & 0xff) {
785 case 0x30: 832 case 0x30:
@@ -793,8 +840,8 @@ nv04_graph_mthd_bind_nv04_patt(struct nouveau_channel *chan, int grclass,
793} 840}
794 841
795static int 842static int
796nv04_graph_mthd_bind_rop(struct nouveau_channel *chan, int grclass, 843nv04_graph_mthd_bind_rop(struct nouveau_channel *chan,
797 int mthd, uint32_t data) 844 u32 class, u32 mthd, u32 data)
798{ 845{
799 switch (nv_ri32(chan->dev, data << 4) & 0xff) { 846 switch (nv_ri32(chan->dev, data << 4) & 0xff) {
800 case 0x30: 847 case 0x30:
@@ -808,8 +855,8 @@ nv04_graph_mthd_bind_rop(struct nouveau_channel *chan, int grclass,
808} 855}
809 856
810static int 857static int
811nv04_graph_mthd_bind_beta1(struct nouveau_channel *chan, int grclass, 858nv04_graph_mthd_bind_beta1(struct nouveau_channel *chan,
812 int mthd, uint32_t data) 859 u32 class, u32 mthd, u32 data)
813{ 860{
814 switch (nv_ri32(chan->dev, data << 4) & 0xff) { 861 switch (nv_ri32(chan->dev, data << 4) & 0xff) {
815 case 0x30: 862 case 0x30:
@@ -823,8 +870,8 @@ nv04_graph_mthd_bind_beta1(struct nouveau_channel *chan, int grclass,
823} 870}
824 871
825static int 872static int
826nv04_graph_mthd_bind_beta4(struct nouveau_channel *chan, int grclass, 873nv04_graph_mthd_bind_beta4(struct nouveau_channel *chan,
827 int mthd, uint32_t data) 874 u32 class, u32 mthd, u32 data)
828{ 875{
829 switch (nv_ri32(chan->dev, data << 4) & 0xff) { 876 switch (nv_ri32(chan->dev, data << 4) & 0xff) {
830 case 0x30: 877 case 0x30:
@@ -838,8 +885,8 @@ nv04_graph_mthd_bind_beta4(struct nouveau_channel *chan, int grclass,
838} 885}
839 886
840static int 887static int
841nv04_graph_mthd_bind_surf_dst(struct nouveau_channel *chan, int grclass, 888nv04_graph_mthd_bind_surf_dst(struct nouveau_channel *chan,
842 int mthd, uint32_t data) 889 u32 class, u32 mthd, u32 data)
843{ 890{
844 switch (nv_ri32(chan->dev, data << 4) & 0xff) { 891 switch (nv_ri32(chan->dev, data << 4) & 0xff) {
845 case 0x30: 892 case 0x30:
@@ -853,8 +900,8 @@ nv04_graph_mthd_bind_surf_dst(struct nouveau_channel *chan, int grclass,
853} 900}
854 901
855static int 902static int
856nv04_graph_mthd_bind_surf_src(struct nouveau_channel *chan, int grclass, 903nv04_graph_mthd_bind_surf_src(struct nouveau_channel *chan,
857 int mthd, uint32_t data) 904 u32 class, u32 mthd, u32 data)
858{ 905{
859 switch (nv_ri32(chan->dev, data << 4) & 0xff) { 906 switch (nv_ri32(chan->dev, data << 4) & 0xff) {
860 case 0x30: 907 case 0x30:
@@ -868,8 +915,8 @@ nv04_graph_mthd_bind_surf_src(struct nouveau_channel *chan, int grclass,
868} 915}
869 916
870static int 917static int
871nv04_graph_mthd_bind_surf_color(struct nouveau_channel *chan, int grclass, 918nv04_graph_mthd_bind_surf_color(struct nouveau_channel *chan,
872 int mthd, uint32_t data) 919 u32 class, u32 mthd, u32 data)
873{ 920{
874 switch (nv_ri32(chan->dev, data << 4) & 0xff) { 921 switch (nv_ri32(chan->dev, data << 4) & 0xff) {
875 case 0x30: 922 case 0x30:
@@ -883,8 +930,8 @@ nv04_graph_mthd_bind_surf_color(struct nouveau_channel *chan, int grclass,
883} 930}
884 931
885static int 932static int
886nv04_graph_mthd_bind_surf_zeta(struct nouveau_channel *chan, int grclass, 933nv04_graph_mthd_bind_surf_zeta(struct nouveau_channel *chan,
887 int mthd, uint32_t data) 934 u32 class, u32 mthd, u32 data)
888{ 935{
889 switch (nv_ri32(chan->dev, data << 4) & 0xff) { 936 switch (nv_ri32(chan->dev, data << 4) & 0xff) {
890 case 0x30: 937 case 0x30:
@@ -898,8 +945,8 @@ nv04_graph_mthd_bind_surf_zeta(struct nouveau_channel *chan, int grclass,
898} 945}
899 946
900static int 947static int
901nv04_graph_mthd_bind_clip(struct nouveau_channel *chan, int grclass, 948nv04_graph_mthd_bind_clip(struct nouveau_channel *chan,
902 int mthd, uint32_t data) 949 u32 class, u32 mthd, u32 data)
903{ 950{
904 switch (nv_ri32(chan->dev, data << 4) & 0xff) { 951 switch (nv_ri32(chan->dev, data << 4) & 0xff) {
905 case 0x30: 952 case 0x30:
@@ -913,8 +960,8 @@ nv04_graph_mthd_bind_clip(struct nouveau_channel *chan, int grclass,
913} 960}
914 961
915static int 962static int
916nv04_graph_mthd_bind_chroma(struct nouveau_channel *chan, int grclass, 963nv04_graph_mthd_bind_chroma(struct nouveau_channel *chan,
917 int mthd, uint32_t data) 964 u32 class, u32 mthd, u32 data)
918{ 965{
919 switch (nv_ri32(chan->dev, data << 4) & 0xff) { 966 switch (nv_ri32(chan->dev, data << 4) & 0xff) {
920 case 0x30: 967 case 0x30:
@@ -930,194 +977,383 @@ nv04_graph_mthd_bind_chroma(struct nouveau_channel *chan, int grclass,
930 return 1; 977 return 1;
931} 978}
932 979
933static struct nouveau_pgraph_object_method nv04_graph_mthds_sw[] = { 980static struct nouveau_bitfield nv04_graph_intr[] = {
934 { 0x0150, nv04_graph_mthd_set_ref }, 981 { NV_PGRAPH_INTR_NOTIFY, "NOTIFY" },
935 {} 982 {}
936}; 983};
937 984
938static struct nouveau_pgraph_object_method nv04_graph_mthds_nv03_gdirect[] = { 985static struct nouveau_bitfield nv04_graph_nstatus[] = {
939 { 0x0184, nv04_graph_mthd_bind_nv01_patt }, 986 { NV04_PGRAPH_NSTATUS_STATE_IN_USE, "STATE_IN_USE" },
940 { 0x0188, nv04_graph_mthd_bind_rop }, 987 { NV04_PGRAPH_NSTATUS_INVALID_STATE, "INVALID_STATE" },
941 { 0x018c, nv04_graph_mthd_bind_beta1 }, 988 { NV04_PGRAPH_NSTATUS_BAD_ARGUMENT, "BAD_ARGUMENT" },
942 { 0x0190, nv04_graph_mthd_bind_surf_dst }, 989 { NV04_PGRAPH_NSTATUS_PROTECTION_FAULT, "PROTECTION_FAULT" },
943 { 0x02fc, nv04_graph_mthd_set_operation }, 990 {}
944 {},
945};
946
947static struct nouveau_pgraph_object_method nv04_graph_mthds_nv04_gdirect[] = {
948 { 0x0188, nv04_graph_mthd_bind_nv04_patt },
949 { 0x018c, nv04_graph_mthd_bind_rop },
950 { 0x0190, nv04_graph_mthd_bind_beta1 },
951 { 0x0194, nv04_graph_mthd_bind_beta4 },
952 { 0x0198, nv04_graph_mthd_bind_surf2d },
953 { 0x02fc, nv04_graph_mthd_set_operation },
954 {},
955};
956
957static struct nouveau_pgraph_object_method nv04_graph_mthds_nv01_imageblit[] = {
958 { 0x0184, nv04_graph_mthd_bind_chroma },
959 { 0x0188, nv04_graph_mthd_bind_clip },
960 { 0x018c, nv04_graph_mthd_bind_nv01_patt },
961 { 0x0190, nv04_graph_mthd_bind_rop },
962 { 0x0194, nv04_graph_mthd_bind_beta1 },
963 { 0x0198, nv04_graph_mthd_bind_surf_dst },
964 { 0x019c, nv04_graph_mthd_bind_surf_src },
965 { 0x02fc, nv04_graph_mthd_set_operation },
966 {},
967};
968
969static struct nouveau_pgraph_object_method nv04_graph_mthds_nv04_imageblit_ifc[] = {
970 { 0x0184, nv04_graph_mthd_bind_chroma },
971 { 0x0188, nv04_graph_mthd_bind_clip },
972 { 0x018c, nv04_graph_mthd_bind_nv04_patt },
973 { 0x0190, nv04_graph_mthd_bind_rop },
974 { 0x0194, nv04_graph_mthd_bind_beta1 },
975 { 0x0198, nv04_graph_mthd_bind_beta4 },
976 { 0x019c, nv04_graph_mthd_bind_surf2d },
977 { 0x02fc, nv04_graph_mthd_set_operation },
978 {},
979}; 991};
980 992
981static struct nouveau_pgraph_object_method nv04_graph_mthds_nv04_iifc[] = { 993struct nouveau_bitfield nv04_graph_nsource[] = {
982 { 0x0188, nv04_graph_mthd_bind_chroma }, 994 { NV03_PGRAPH_NSOURCE_NOTIFICATION, "NOTIFICATION" },
983 { 0x018c, nv04_graph_mthd_bind_clip }, 995 { NV03_PGRAPH_NSOURCE_DATA_ERROR, "DATA_ERROR" },
984 { 0x0190, nv04_graph_mthd_bind_nv04_patt }, 996 { NV03_PGRAPH_NSOURCE_PROTECTION_ERROR, "PROTECTION_ERROR" },
985 { 0x0194, nv04_graph_mthd_bind_rop }, 997 { NV03_PGRAPH_NSOURCE_RANGE_EXCEPTION, "RANGE_EXCEPTION" },
986 { 0x0198, nv04_graph_mthd_bind_beta1 }, 998 { NV03_PGRAPH_NSOURCE_LIMIT_COLOR, "LIMIT_COLOR" },
987 { 0x019c, nv04_graph_mthd_bind_beta4 }, 999 { NV03_PGRAPH_NSOURCE_LIMIT_ZETA, "LIMIT_ZETA" },
988 { 0x01a0, nv04_graph_mthd_bind_surf2d_swzsurf }, 1000 { NV03_PGRAPH_NSOURCE_ILLEGAL_MTHD, "ILLEGAL_MTHD" },
989 { 0x03e4, nv04_graph_mthd_set_operation }, 1001 { NV03_PGRAPH_NSOURCE_DMA_R_PROTECTION, "DMA_R_PROTECTION" },
990 {}, 1002 { NV03_PGRAPH_NSOURCE_DMA_W_PROTECTION, "DMA_W_PROTECTION" },
1003 { NV03_PGRAPH_NSOURCE_FORMAT_EXCEPTION, "FORMAT_EXCEPTION" },
1004 { NV03_PGRAPH_NSOURCE_PATCH_EXCEPTION, "PATCH_EXCEPTION" },
1005 { NV03_PGRAPH_NSOURCE_STATE_INVALID, "STATE_INVALID" },
1006 { NV03_PGRAPH_NSOURCE_DOUBLE_NOTIFY, "DOUBLE_NOTIFY" },
1007 { NV03_PGRAPH_NSOURCE_NOTIFY_IN_USE, "NOTIFY_IN_USE" },
1008 { NV03_PGRAPH_NSOURCE_METHOD_CNT, "METHOD_CNT" },
1009 { NV03_PGRAPH_NSOURCE_BFR_NOTIFICATION, "BFR_NOTIFICATION" },
1010 { NV03_PGRAPH_NSOURCE_DMA_VTX_PROTECTION, "DMA_VTX_PROTECTION" },
1011 { NV03_PGRAPH_NSOURCE_DMA_WIDTH_A, "DMA_WIDTH_A" },
1012 { NV03_PGRAPH_NSOURCE_DMA_WIDTH_B, "DMA_WIDTH_B" },
1013 {}
991}; 1014};
992 1015
993static struct nouveau_pgraph_object_method nv04_graph_mthds_nv01_ifc[] = { 1016static void
994 { 0x0184, nv04_graph_mthd_bind_chroma }, 1017nv04_graph_context_switch(struct drm_device *dev)
995 { 0x0188, nv04_graph_mthd_bind_clip }, 1018{
996 { 0x018c, nv04_graph_mthd_bind_nv01_patt }, 1019 struct drm_nouveau_private *dev_priv = dev->dev_private;
997 { 0x0190, nv04_graph_mthd_bind_rop }, 1020 struct nouveau_channel *chan = NULL;
998 { 0x0194, nv04_graph_mthd_bind_beta1 }, 1021 int chid;
999 { 0x0198, nv04_graph_mthd_bind_surf_dst },
1000 { 0x02fc, nv04_graph_mthd_set_operation },
1001 {},
1002};
1003 1022
1004static struct nouveau_pgraph_object_method nv04_graph_mthds_nv03_sifc[] = { 1023 nouveau_wait_for_idle(dev);
1005 { 0x0184, nv04_graph_mthd_bind_chroma },
1006 { 0x0188, nv04_graph_mthd_bind_nv01_patt },
1007 { 0x018c, nv04_graph_mthd_bind_rop },
1008 { 0x0190, nv04_graph_mthd_bind_beta1 },
1009 { 0x0194, nv04_graph_mthd_bind_surf_dst },
1010 { 0x02fc, nv04_graph_mthd_set_operation },
1011 {},
1012};
1013 1024
1014static struct nouveau_pgraph_object_method nv04_graph_mthds_nv04_sifc[] = { 1025 /* If previous context is valid, we need to save it */
1015 { 0x0184, nv04_graph_mthd_bind_chroma }, 1026 nv04_graph_unload_context(dev);
1016 { 0x0188, nv04_graph_mthd_bind_nv04_patt },
1017 { 0x018c, nv04_graph_mthd_bind_rop },
1018 { 0x0190, nv04_graph_mthd_bind_beta1 },
1019 { 0x0194, nv04_graph_mthd_bind_beta4 },
1020 { 0x0198, nv04_graph_mthd_bind_surf2d },
1021 { 0x02fc, nv04_graph_mthd_set_operation },
1022 {},
1023};
1024 1027
1025static struct nouveau_pgraph_object_method nv04_graph_mthds_nv03_sifm[] = { 1028 /* Load context for next channel */
1026 { 0x0188, nv04_graph_mthd_bind_nv01_patt }, 1029 chid = dev_priv->engine.fifo.channel_id(dev);
1027 { 0x018c, nv04_graph_mthd_bind_rop }, 1030 chan = dev_priv->channels.ptr[chid];
1028 { 0x0190, nv04_graph_mthd_bind_beta1 }, 1031 if (chan)
1029 { 0x0194, nv04_graph_mthd_bind_surf_dst }, 1032 nv04_graph_load_context(chan);
1030 { 0x0304, nv04_graph_mthd_set_operation }, 1033}
1031 {},
1032};
1033 1034
1034static struct nouveau_pgraph_object_method nv04_graph_mthds_nv04_sifm[] = { 1035static void
1035 { 0x0188, nv04_graph_mthd_bind_nv04_patt }, 1036nv04_graph_isr(struct drm_device *dev)
1036 { 0x018c, nv04_graph_mthd_bind_rop }, 1037{
1037 { 0x0190, nv04_graph_mthd_bind_beta1 }, 1038 u32 stat;
1038 { 0x0194, nv04_graph_mthd_bind_beta4 }, 1039
1039 { 0x0198, nv04_graph_mthd_bind_surf2d_swzsurf }, 1040 while ((stat = nv_rd32(dev, NV03_PGRAPH_INTR))) {
1040 { 0x0304, nv04_graph_mthd_set_operation }, 1041 u32 nsource = nv_rd32(dev, NV03_PGRAPH_NSOURCE);
1041 {}, 1042 u32 nstatus = nv_rd32(dev, NV03_PGRAPH_NSTATUS);
1042}; 1043 u32 addr = nv_rd32(dev, NV04_PGRAPH_TRAPPED_ADDR);
1044 u32 chid = (addr & 0x0f000000) >> 24;
1045 u32 subc = (addr & 0x0000e000) >> 13;
1046 u32 mthd = (addr & 0x00001ffc);
1047 u32 data = nv_rd32(dev, NV04_PGRAPH_TRAPPED_DATA);
1048 u32 class = nv_rd32(dev, 0x400180 + subc * 4) & 0xff;
1049 u32 show = stat;
1050
1051 if (stat & NV_PGRAPH_INTR_NOTIFY) {
1052 if (nsource & NV03_PGRAPH_NSOURCE_ILLEGAL_MTHD) {
1053 if (!nouveau_gpuobj_mthd_call2(dev, chid, class, mthd, data))
1054 show &= ~NV_PGRAPH_INTR_NOTIFY;
1055 }
1056 }
1057
1058 if (stat & NV_PGRAPH_INTR_CONTEXT_SWITCH) {
1059 nv_wr32(dev, NV03_PGRAPH_INTR, NV_PGRAPH_INTR_CONTEXT_SWITCH);
1060 stat &= ~NV_PGRAPH_INTR_CONTEXT_SWITCH;
1061 show &= ~NV_PGRAPH_INTR_CONTEXT_SWITCH;
1062 nv04_graph_context_switch(dev);
1063 }
1064
1065 nv_wr32(dev, NV03_PGRAPH_INTR, stat);
1066 nv_wr32(dev, NV04_PGRAPH_FIFO, 0x00000001);
1067
1068 if (show && nouveau_ratelimit()) {
1069 NV_INFO(dev, "PGRAPH -");
1070 nouveau_bitfield_print(nv04_graph_intr, show);
1071 printk(" nsource:");
1072 nouveau_bitfield_print(nv04_graph_nsource, nsource);
1073 printk(" nstatus:");
1074 nouveau_bitfield_print(nv04_graph_nstatus, nstatus);
1075 printk("\n");
1076 NV_INFO(dev, "PGRAPH - ch %d/%d class 0x%04x "
1077 "mthd 0x%04x data 0x%08x\n",
1078 chid, subc, class, mthd, data);
1079 }
1080 }
1081}
1043 1082
1044static struct nouveau_pgraph_object_method nv04_graph_mthds_nv01_shape[] = { 1083static void
1045 { 0x0184, nv04_graph_mthd_bind_clip }, 1084nv04_graph_destroy(struct drm_device *dev, int engine)
1046 { 0x0188, nv04_graph_mthd_bind_nv01_patt }, 1085{
1047 { 0x018c, nv04_graph_mthd_bind_rop }, 1086 struct nv04_graph_engine *pgraph = nv_engine(dev, engine);
1048 { 0x0190, nv04_graph_mthd_bind_beta1 },
1049 { 0x0194, nv04_graph_mthd_bind_surf_dst },
1050 { 0x02fc, nv04_graph_mthd_set_operation },
1051 {},
1052};
1053 1087
1054static struct nouveau_pgraph_object_method nv04_graph_mthds_nv04_shape[] = { 1088 nouveau_irq_unregister(dev, 12);
1055 { 0x0184, nv04_graph_mthd_bind_clip },
1056 { 0x0188, nv04_graph_mthd_bind_nv04_patt },
1057 { 0x018c, nv04_graph_mthd_bind_rop },
1058 { 0x0190, nv04_graph_mthd_bind_beta1 },
1059 { 0x0194, nv04_graph_mthd_bind_beta4 },
1060 { 0x0198, nv04_graph_mthd_bind_surf2d },
1061 { 0x02fc, nv04_graph_mthd_set_operation },
1062 {},
1063};
1064 1089
1065static struct nouveau_pgraph_object_method nv04_graph_mthds_nv03_tex_tri[] = { 1090 NVOBJ_ENGINE_DEL(dev, GR);
1066 { 0x0188, nv04_graph_mthd_bind_clip }, 1091 kfree(pgraph);
1067 { 0x018c, nv04_graph_mthd_bind_surf_color }, 1092}
1068 { 0x0190, nv04_graph_mthd_bind_surf_zeta },
1069 {},
1070};
1071 1093
1072static struct nouveau_pgraph_object_method nv04_graph_mthds_surf3d[] = { 1094int
1073 { 0x02f8, nv04_graph_mthd_surf3d_clip_h }, 1095nv04_graph_create(struct drm_device *dev)
1074 { 0x02fc, nv04_graph_mthd_surf3d_clip_v }, 1096{
1075 {}, 1097 struct nv04_graph_engine *pgraph;
1076};
1077 1098
1078struct nouveau_pgraph_object_class nv04_graph_grclass[] = { 1099 pgraph = kzalloc(sizeof(*pgraph), GFP_KERNEL);
1079 { 0x0038, false, NULL }, /* dvd subpicture */ 1100 if (!pgraph)
1080 { 0x0039, false, NULL }, /* m2mf */ 1101 return -ENOMEM;
1081 { 0x004b, false, nv04_graph_mthds_nv03_gdirect }, /* nv03 gdirect */
1082 { 0x004a, false, nv04_graph_mthds_nv04_gdirect }, /* nv04 gdirect */
1083 { 0x001f, false, nv04_graph_mthds_nv01_imageblit }, /* nv01 imageblit */
1084 { 0x005f, false, nv04_graph_mthds_nv04_imageblit_ifc }, /* nv04 imageblit */
1085 { 0x0060, false, nv04_graph_mthds_nv04_iifc }, /* nv04 iifc */
1086 { 0x0064, false, NULL }, /* nv05 iifc */
1087 { 0x0021, false, nv04_graph_mthds_nv01_ifc }, /* nv01 ifc */
1088 { 0x0061, false, nv04_graph_mthds_nv04_imageblit_ifc }, /* nv04 ifc */
1089 { 0x0065, false, NULL }, /* nv05 ifc */
1090 { 0x0036, false, nv04_graph_mthds_nv03_sifc }, /* nv03 sifc */
1091 { 0x0076, false, nv04_graph_mthds_nv04_sifc }, /* nv04 sifc */
1092 { 0x0066, false, NULL }, /* nv05 sifc */
1093 { 0x0037, false, nv04_graph_mthds_nv03_sifm }, /* nv03 sifm */
1094 { 0x0077, false, nv04_graph_mthds_nv04_sifm }, /* nv04 sifm */
1095 { 0x0030, false, NULL }, /* null */
1096 { 0x0042, false, NULL }, /* surf2d */
1097 { 0x0043, false, NULL }, /* rop */
1098 { 0x0012, false, NULL }, /* beta1 */
1099 { 0x0072, false, NULL }, /* beta4 */
1100 { 0x0019, false, NULL }, /* cliprect */
1101 { 0x0018, false, NULL }, /* nv01 pattern */
1102 { 0x0044, false, NULL }, /* nv04 pattern */
1103 { 0x0052, false, NULL }, /* swzsurf */
1104 { 0x0053, false, nv04_graph_mthds_surf3d }, /* surf3d */
1105 { 0x0048, false, nv04_graph_mthds_nv03_tex_tri }, /* nv03 tex_tri */
1106 { 0x0054, false, NULL }, /* tex_tri */
1107 { 0x0055, false, NULL }, /* multitex_tri */
1108 { 0x0017, false, NULL }, /* nv01 chroma */
1109 { 0x0057, false, NULL }, /* nv04 chroma */
1110 { 0x0058, false, NULL }, /* surf_dst */
1111 { 0x0059, false, NULL }, /* surf_src */
1112 { 0x005a, false, NULL }, /* surf_color */
1113 { 0x005b, false, NULL }, /* surf_zeta */
1114 { 0x001c, false, nv04_graph_mthds_nv01_shape }, /* nv01 line */
1115 { 0x005c, false, nv04_graph_mthds_nv04_shape }, /* nv04 line */
1116 { 0x001d, false, nv04_graph_mthds_nv01_shape }, /* nv01 tri */
1117 { 0x005d, false, nv04_graph_mthds_nv04_shape }, /* nv04 tri */
1118 { 0x001e, false, nv04_graph_mthds_nv01_shape }, /* nv01 rect */
1119 { 0x005e, false, nv04_graph_mthds_nv04_shape }, /* nv04 rect */
1120 { 0x506e, true, nv04_graph_mthds_sw },
1121 {}
1122};
1123 1102
1103 pgraph->base.destroy = nv04_graph_destroy;
1104 pgraph->base.init = nv04_graph_init;
1105 pgraph->base.fini = nv04_graph_fini;
1106 pgraph->base.context_new = nv04_graph_context_new;
1107 pgraph->base.context_del = nv04_graph_context_del;
1108 pgraph->base.object_new = nv04_graph_object_new;
1109
1110 NVOBJ_ENGINE_ADD(dev, GR, &pgraph->base);
1111 nouveau_irq_register(dev, 12, nv04_graph_isr);
1112
1113 /* dvd subpicture */
1114 NVOBJ_CLASS(dev, 0x0038, GR);
1115
1116 /* m2mf */
1117 NVOBJ_CLASS(dev, 0x0039, GR);
1118
1119 /* nv03 gdirect */
1120 NVOBJ_CLASS(dev, 0x004b, GR);
1121 NVOBJ_MTHD (dev, 0x004b, 0x0184, nv04_graph_mthd_bind_nv01_patt);
1122 NVOBJ_MTHD (dev, 0x004b, 0x0188, nv04_graph_mthd_bind_rop);
1123 NVOBJ_MTHD (dev, 0x004b, 0x018c, nv04_graph_mthd_bind_beta1);
1124 NVOBJ_MTHD (dev, 0x004b, 0x0190, nv04_graph_mthd_bind_surf_dst);
1125 NVOBJ_MTHD (dev, 0x004b, 0x02fc, nv04_graph_mthd_set_operation);
1126
1127 /* nv04 gdirect */
1128 NVOBJ_CLASS(dev, 0x004a, GR);
1129 NVOBJ_MTHD (dev, 0x004a, 0x0188, nv04_graph_mthd_bind_nv04_patt);
1130 NVOBJ_MTHD (dev, 0x004a, 0x018c, nv04_graph_mthd_bind_rop);
1131 NVOBJ_MTHD (dev, 0x004a, 0x0190, nv04_graph_mthd_bind_beta1);
1132 NVOBJ_MTHD (dev, 0x004a, 0x0194, nv04_graph_mthd_bind_beta4);
1133 NVOBJ_MTHD (dev, 0x004a, 0x0198, nv04_graph_mthd_bind_surf2d);
1134 NVOBJ_MTHD (dev, 0x004a, 0x02fc, nv04_graph_mthd_set_operation);
1135
1136 /* nv01 imageblit */
1137 NVOBJ_CLASS(dev, 0x001f, GR);
1138 NVOBJ_MTHD (dev, 0x001f, 0x0184, nv04_graph_mthd_bind_chroma);
1139 NVOBJ_MTHD (dev, 0x001f, 0x0188, nv04_graph_mthd_bind_clip);
1140 NVOBJ_MTHD (dev, 0x001f, 0x018c, nv04_graph_mthd_bind_nv01_patt);
1141 NVOBJ_MTHD (dev, 0x001f, 0x0190, nv04_graph_mthd_bind_rop);
1142 NVOBJ_MTHD (dev, 0x001f, 0x0194, nv04_graph_mthd_bind_beta1);
1143 NVOBJ_MTHD (dev, 0x001f, 0x0198, nv04_graph_mthd_bind_surf_dst);
1144 NVOBJ_MTHD (dev, 0x001f, 0x019c, nv04_graph_mthd_bind_surf_src);
1145 NVOBJ_MTHD (dev, 0x001f, 0x02fc, nv04_graph_mthd_set_operation);
1146
1147 /* nv04 imageblit */
1148 NVOBJ_CLASS(dev, 0x005f, GR);
1149 NVOBJ_MTHD (dev, 0x005f, 0x0184, nv04_graph_mthd_bind_chroma);
1150 NVOBJ_MTHD (dev, 0x005f, 0x0188, nv04_graph_mthd_bind_clip);
1151 NVOBJ_MTHD (dev, 0x005f, 0x018c, nv04_graph_mthd_bind_nv04_patt);
1152 NVOBJ_MTHD (dev, 0x005f, 0x0190, nv04_graph_mthd_bind_rop);
1153 NVOBJ_MTHD (dev, 0x005f, 0x0194, nv04_graph_mthd_bind_beta1);
1154 NVOBJ_MTHD (dev, 0x005f, 0x0198, nv04_graph_mthd_bind_beta4);
1155 NVOBJ_MTHD (dev, 0x005f, 0x019c, nv04_graph_mthd_bind_surf2d);
1156 NVOBJ_MTHD (dev, 0x005f, 0x02fc, nv04_graph_mthd_set_operation);
1157
1158 /* nv04 iifc */
1159 NVOBJ_CLASS(dev, 0x0060, GR);
1160 NVOBJ_MTHD (dev, 0x0060, 0x0188, nv04_graph_mthd_bind_chroma);
1161 NVOBJ_MTHD (dev, 0x0060, 0x018c, nv04_graph_mthd_bind_clip);
1162 NVOBJ_MTHD (dev, 0x0060, 0x0190, nv04_graph_mthd_bind_nv04_patt);
1163 NVOBJ_MTHD (dev, 0x0060, 0x0194, nv04_graph_mthd_bind_rop);
1164 NVOBJ_MTHD (dev, 0x0060, 0x0198, nv04_graph_mthd_bind_beta1);
1165 NVOBJ_MTHD (dev, 0x0060, 0x019c, nv04_graph_mthd_bind_beta4);
1166 NVOBJ_MTHD (dev, 0x0060, 0x01a0, nv04_graph_mthd_bind_surf2d_swzsurf);
1167 NVOBJ_MTHD (dev, 0x0060, 0x03e4, nv04_graph_mthd_set_operation);
1168
1169 /* nv05 iifc */
1170 NVOBJ_CLASS(dev, 0x0064, GR);
1171
1172 /* nv01 ifc */
1173 NVOBJ_CLASS(dev, 0x0021, GR);
1174 NVOBJ_MTHD (dev, 0x0021, 0x0184, nv04_graph_mthd_bind_chroma);
1175 NVOBJ_MTHD (dev, 0x0021, 0x0188, nv04_graph_mthd_bind_clip);
1176 NVOBJ_MTHD (dev, 0x0021, 0x018c, nv04_graph_mthd_bind_nv01_patt);
1177 NVOBJ_MTHD (dev, 0x0021, 0x0190, nv04_graph_mthd_bind_rop);
1178 NVOBJ_MTHD (dev, 0x0021, 0x0194, nv04_graph_mthd_bind_beta1);
1179 NVOBJ_MTHD (dev, 0x0021, 0x0198, nv04_graph_mthd_bind_surf_dst);
1180 NVOBJ_MTHD (dev, 0x0021, 0x02fc, nv04_graph_mthd_set_operation);
1181
1182 /* nv04 ifc */
1183 NVOBJ_CLASS(dev, 0x0061, GR);
1184 NVOBJ_MTHD (dev, 0x0061, 0x0184, nv04_graph_mthd_bind_chroma);
1185 NVOBJ_MTHD (dev, 0x0061, 0x0188, nv04_graph_mthd_bind_clip);
1186 NVOBJ_MTHD (dev, 0x0061, 0x018c, nv04_graph_mthd_bind_nv04_patt);
1187 NVOBJ_MTHD (dev, 0x0061, 0x0190, nv04_graph_mthd_bind_rop);
1188 NVOBJ_MTHD (dev, 0x0061, 0x0194, nv04_graph_mthd_bind_beta1);
1189 NVOBJ_MTHD (dev, 0x0061, 0x0198, nv04_graph_mthd_bind_beta4);
1190 NVOBJ_MTHD (dev, 0x0061, 0x019c, nv04_graph_mthd_bind_surf2d);
1191 NVOBJ_MTHD (dev, 0x0061, 0x02fc, nv04_graph_mthd_set_operation);
1192
1193 /* nv05 ifc */
1194 NVOBJ_CLASS(dev, 0x0065, GR);
1195
1196 /* nv03 sifc */
1197 NVOBJ_CLASS(dev, 0x0036, GR);
1198 NVOBJ_MTHD (dev, 0x0036, 0x0184, nv04_graph_mthd_bind_chroma);
1199 NVOBJ_MTHD (dev, 0x0036, 0x0188, nv04_graph_mthd_bind_nv01_patt);
1200 NVOBJ_MTHD (dev, 0x0036, 0x018c, nv04_graph_mthd_bind_rop);
1201 NVOBJ_MTHD (dev, 0x0036, 0x0190, nv04_graph_mthd_bind_beta1);
1202 NVOBJ_MTHD (dev, 0x0036, 0x0194, nv04_graph_mthd_bind_surf_dst);
1203 NVOBJ_MTHD (dev, 0x0036, 0x02fc, nv04_graph_mthd_set_operation);
1204
1205 /* nv04 sifc */
1206 NVOBJ_CLASS(dev, 0x0076, GR);
1207 NVOBJ_MTHD (dev, 0x0076, 0x0184, nv04_graph_mthd_bind_chroma);
1208 NVOBJ_MTHD (dev, 0x0076, 0x0188, nv04_graph_mthd_bind_nv04_patt);
1209 NVOBJ_MTHD (dev, 0x0076, 0x018c, nv04_graph_mthd_bind_rop);
1210 NVOBJ_MTHD (dev, 0x0076, 0x0190, nv04_graph_mthd_bind_beta1);
1211 NVOBJ_MTHD (dev, 0x0076, 0x0194, nv04_graph_mthd_bind_beta4);
1212 NVOBJ_MTHD (dev, 0x0076, 0x0198, nv04_graph_mthd_bind_surf2d);
1213 NVOBJ_MTHD (dev, 0x0076, 0x02fc, nv04_graph_mthd_set_operation);
1214
1215 /* nv05 sifc */
1216 NVOBJ_CLASS(dev, 0x0066, GR);
1217
1218 /* nv03 sifm */
1219 NVOBJ_CLASS(dev, 0x0037, GR);
1220 NVOBJ_MTHD (dev, 0x0037, 0x0188, nv04_graph_mthd_bind_nv01_patt);
1221 NVOBJ_MTHD (dev, 0x0037, 0x018c, nv04_graph_mthd_bind_rop);
1222 NVOBJ_MTHD (dev, 0x0037, 0x0190, nv04_graph_mthd_bind_beta1);
1223 NVOBJ_MTHD (dev, 0x0037, 0x0194, nv04_graph_mthd_bind_surf_dst);
1224 NVOBJ_MTHD (dev, 0x0037, 0x0304, nv04_graph_mthd_set_operation);
1225
1226 /* nv04 sifm */
1227 NVOBJ_CLASS(dev, 0x0077, GR);
1228 NVOBJ_MTHD (dev, 0x0077, 0x0188, nv04_graph_mthd_bind_nv04_patt);
1229 NVOBJ_MTHD (dev, 0x0077, 0x018c, nv04_graph_mthd_bind_rop);
1230 NVOBJ_MTHD (dev, 0x0077, 0x0190, nv04_graph_mthd_bind_beta1);
1231 NVOBJ_MTHD (dev, 0x0077, 0x0194, nv04_graph_mthd_bind_beta4);
1232 NVOBJ_MTHD (dev, 0x0077, 0x0198, nv04_graph_mthd_bind_surf2d_swzsurf);
1233 NVOBJ_MTHD (dev, 0x0077, 0x0304, nv04_graph_mthd_set_operation);
1234
1235 /* null */
1236 NVOBJ_CLASS(dev, 0x0030, GR);
1237
1238 /* surf2d */
1239 NVOBJ_CLASS(dev, 0x0042, GR);
1240
1241 /* rop */
1242 NVOBJ_CLASS(dev, 0x0043, GR);
1243
1244 /* beta1 */
1245 NVOBJ_CLASS(dev, 0x0012, GR);
1246
1247 /* beta4 */
1248 NVOBJ_CLASS(dev, 0x0072, GR);
1249
1250 /* cliprect */
1251 NVOBJ_CLASS(dev, 0x0019, GR);
1252
1253 /* nv01 pattern */
1254 NVOBJ_CLASS(dev, 0x0018, GR);
1255
1256 /* nv04 pattern */
1257 NVOBJ_CLASS(dev, 0x0044, GR);
1258
1259 /* swzsurf */
1260 NVOBJ_CLASS(dev, 0x0052, GR);
1261
1262 /* surf3d */
1263 NVOBJ_CLASS(dev, 0x0053, GR);
1264 NVOBJ_MTHD (dev, 0x0053, 0x02f8, nv04_graph_mthd_surf3d_clip_h);
1265 NVOBJ_MTHD (dev, 0x0053, 0x02fc, nv04_graph_mthd_surf3d_clip_v);
1266
1267 /* nv03 tex_tri */
1268 NVOBJ_CLASS(dev, 0x0048, GR);
1269 NVOBJ_MTHD (dev, 0x0048, 0x0188, nv04_graph_mthd_bind_clip);
1270 NVOBJ_MTHD (dev, 0x0048, 0x018c, nv04_graph_mthd_bind_surf_color);
1271 NVOBJ_MTHD (dev, 0x0048, 0x0190, nv04_graph_mthd_bind_surf_zeta);
1272
1273 /* tex_tri */
1274 NVOBJ_CLASS(dev, 0x0054, GR);
1275
1276 /* multitex_tri */
1277 NVOBJ_CLASS(dev, 0x0055, GR);
1278
1279 /* nv01 chroma */
1280 NVOBJ_CLASS(dev, 0x0017, GR);
1281
1282 /* nv04 chroma */
1283 NVOBJ_CLASS(dev, 0x0057, GR);
1284
1285 /* surf_dst */
1286 NVOBJ_CLASS(dev, 0x0058, GR);
1287
1288 /* surf_src */
1289 NVOBJ_CLASS(dev, 0x0059, GR);
1290
1291 /* surf_color */
1292 NVOBJ_CLASS(dev, 0x005a, GR);
1293
1294 /* surf_zeta */
1295 NVOBJ_CLASS(dev, 0x005b, GR);
1296
1297 /* nv01 line */
1298 NVOBJ_CLASS(dev, 0x001c, GR);
1299 NVOBJ_MTHD (dev, 0x001c, 0x0184, nv04_graph_mthd_bind_clip);
1300 NVOBJ_MTHD (dev, 0x001c, 0x0188, nv04_graph_mthd_bind_nv01_patt);
1301 NVOBJ_MTHD (dev, 0x001c, 0x018c, nv04_graph_mthd_bind_rop);
1302 NVOBJ_MTHD (dev, 0x001c, 0x0190, nv04_graph_mthd_bind_beta1);
1303 NVOBJ_MTHD (dev, 0x001c, 0x0194, nv04_graph_mthd_bind_surf_dst);
1304 NVOBJ_MTHD (dev, 0x001c, 0x02fc, nv04_graph_mthd_set_operation);
1305
1306 /* nv04 line */
1307 NVOBJ_CLASS(dev, 0x005c, GR);
1308 NVOBJ_MTHD (dev, 0x005c, 0x0184, nv04_graph_mthd_bind_clip);
1309 NVOBJ_MTHD (dev, 0x005c, 0x0188, nv04_graph_mthd_bind_nv04_patt);
1310 NVOBJ_MTHD (dev, 0x005c, 0x018c, nv04_graph_mthd_bind_rop);
1311 NVOBJ_MTHD (dev, 0x005c, 0x0190, nv04_graph_mthd_bind_beta1);
1312 NVOBJ_MTHD (dev, 0x005c, 0x0194, nv04_graph_mthd_bind_beta4);
1313 NVOBJ_MTHD (dev, 0x005c, 0x0198, nv04_graph_mthd_bind_surf2d);
1314 NVOBJ_MTHD (dev, 0x005c, 0x02fc, nv04_graph_mthd_set_operation);
1315
1316 /* nv01 tri */
1317 NVOBJ_CLASS(dev, 0x001d, GR);
1318 NVOBJ_MTHD (dev, 0x001d, 0x0184, nv04_graph_mthd_bind_clip);
1319 NVOBJ_MTHD (dev, 0x001d, 0x0188, nv04_graph_mthd_bind_nv01_patt);
1320 NVOBJ_MTHD (dev, 0x001d, 0x018c, nv04_graph_mthd_bind_rop);
1321 NVOBJ_MTHD (dev, 0x001d, 0x0190, nv04_graph_mthd_bind_beta1);
1322 NVOBJ_MTHD (dev, 0x001d, 0x0194, nv04_graph_mthd_bind_surf_dst);
1323 NVOBJ_MTHD (dev, 0x001d, 0x02fc, nv04_graph_mthd_set_operation);
1324
1325 /* nv04 tri */
1326 NVOBJ_CLASS(dev, 0x005d, GR);
1327 NVOBJ_MTHD (dev, 0x005d, 0x0184, nv04_graph_mthd_bind_clip);
1328 NVOBJ_MTHD (dev, 0x005d, 0x0188, nv04_graph_mthd_bind_nv04_patt);
1329 NVOBJ_MTHD (dev, 0x005d, 0x018c, nv04_graph_mthd_bind_rop);
1330 NVOBJ_MTHD (dev, 0x005d, 0x0190, nv04_graph_mthd_bind_beta1);
1331 NVOBJ_MTHD (dev, 0x005d, 0x0194, nv04_graph_mthd_bind_beta4);
1332 NVOBJ_MTHD (dev, 0x005d, 0x0198, nv04_graph_mthd_bind_surf2d);
1333 NVOBJ_MTHD (dev, 0x005d, 0x02fc, nv04_graph_mthd_set_operation);
1334
1335 /* nv01 rect */
1336 NVOBJ_CLASS(dev, 0x001e, GR);
1337 NVOBJ_MTHD (dev, 0x001e, 0x0184, nv04_graph_mthd_bind_clip);
1338 NVOBJ_MTHD (dev, 0x001e, 0x0188, nv04_graph_mthd_bind_nv01_patt);
1339 NVOBJ_MTHD (dev, 0x001e, 0x018c, nv04_graph_mthd_bind_rop);
1340 NVOBJ_MTHD (dev, 0x001e, 0x0190, nv04_graph_mthd_bind_beta1);
1341 NVOBJ_MTHD (dev, 0x001e, 0x0194, nv04_graph_mthd_bind_surf_dst);
1342 NVOBJ_MTHD (dev, 0x001e, 0x02fc, nv04_graph_mthd_set_operation);
1343
1344 /* nv04 rect */
1345 NVOBJ_CLASS(dev, 0x005e, GR);
1346 NVOBJ_MTHD (dev, 0x005e, 0x0184, nv04_graph_mthd_bind_clip);
1347 NVOBJ_MTHD (dev, 0x005e, 0x0188, nv04_graph_mthd_bind_nv04_patt);
1348 NVOBJ_MTHD (dev, 0x005e, 0x018c, nv04_graph_mthd_bind_rop);
1349 NVOBJ_MTHD (dev, 0x005e, 0x0190, nv04_graph_mthd_bind_beta1);
1350 NVOBJ_MTHD (dev, 0x005e, 0x0194, nv04_graph_mthd_bind_beta4);
1351 NVOBJ_MTHD (dev, 0x005e, 0x0198, nv04_graph_mthd_bind_surf2d);
1352 NVOBJ_MTHD (dev, 0x005e, 0x02fc, nv04_graph_mthd_set_operation);
1353
1354 /* nvsw */
1355 NVOBJ_CLASS(dev, 0x506e, SW);
1356 NVOBJ_MTHD (dev, 0x506e, 0x0150, nv04_graph_mthd_set_ref);
1357 NVOBJ_MTHD (dev, 0x506e, 0x0500, nv04_graph_mthd_page_flip);
1358 return 0;
1359}
diff --git a/drivers/gpu/drm/nouveau/nv04_instmem.c b/drivers/gpu/drm/nouveau/nv04_instmem.c
index 4408232d33f1..b8611b955313 100644
--- a/drivers/gpu/drm/nouveau/nv04_instmem.c
+++ b/drivers/gpu/drm/nouveau/nv04_instmem.c
@@ -1,6 +1,7 @@
1#include "drmP.h" 1#include "drmP.h"
2#include "drm.h" 2#include "drm.h"
3#include "nouveau_drv.h" 3#include "nouveau_drv.h"
4#include "nouveau_ramht.h"
4 5
5/* returns the size of fifo context */ 6/* returns the size of fifo context */
6static int 7static int
@@ -17,102 +18,51 @@ nouveau_fifo_ctx_size(struct drm_device *dev)
17 return 32; 18 return 32;
18} 19}
19 20
20static void 21int nv04_instmem_init(struct drm_device *dev)
21nv04_instmem_determine_amount(struct drm_device *dev)
22{ 22{
23 struct drm_nouveau_private *dev_priv = dev->dev_private; 23 struct drm_nouveau_private *dev_priv = dev->dev_private;
24 int i; 24 struct nouveau_gpuobj *ramht = NULL;
25 u32 offset, length;
26 int ret;
25 27
26 /* Figure out how much instance memory we need */ 28 /* RAMIN always available */
27 if (dev_priv->card_type >= NV_40) { 29 dev_priv->ramin_available = true;
28 /* We'll want more instance memory than this on some NV4x cards.
29 * There's a 16MB aperture to play with that maps onto the end
30 * of vram. For now, only reserve a small piece until we know
31 * more about what each chipset requires.
32 */
33 switch (dev_priv->chipset) {
34 case 0x40:
35 case 0x47:
36 case 0x49:
37 case 0x4b:
38 dev_priv->ramin_rsvd_vram = (2 * 1024 * 1024);
39 break;
40 default:
41 dev_priv->ramin_rsvd_vram = (1 * 1024 * 1024);
42 break;
43 }
44 } else {
45 /*XXX: what *are* the limits on <NV40 cards?
46 */
47 dev_priv->ramin_rsvd_vram = (512 * 1024);
48 }
49 NV_DEBUG(dev, "RAMIN size: %dKiB\n", dev_priv->ramin_rsvd_vram >> 10);
50 30
51 /* Clear all of it, except the BIOS image that's in the first 64KiB */ 31 /* Setup shared RAMHT */
52 for (i = 64 * 1024; i < dev_priv->ramin_rsvd_vram; i += 4) 32 ret = nouveau_gpuobj_new_fake(dev, 0x10000, ~0, 4096,
53 nv_wi32(dev, i, 0x00000000); 33 NVOBJ_FLAG_ZERO_ALLOC, &ramht);
54} 34 if (ret)
35 return ret;
55 36
56static void 37 ret = nouveau_ramht_new(dev, ramht, &dev_priv->ramht);
57nv04_instmem_configure_fixed_tables(struct drm_device *dev) 38 nouveau_gpuobj_ref(NULL, &ramht);
58{ 39 if (ret)
59 struct drm_nouveau_private *dev_priv = dev->dev_private; 40 return ret;
60 struct nouveau_engine *engine = &dev_priv->engine;
61 41
62 /* FIFO hash table (RAMHT) 42 /* And RAMRO */
63 * use 4k hash table at RAMIN+0x10000 43 ret = nouveau_gpuobj_new_fake(dev, 0x11200, ~0, 512,
64 * TODO: extend the hash table 44 NVOBJ_FLAG_ZERO_ALLOC, &dev_priv->ramro);
65 */ 45 if (ret)
66 dev_priv->ramht_offset = 0x10000; 46 return ret;
67 dev_priv->ramht_bits = 9; 47
68 dev_priv->ramht_size = (1 << dev_priv->ramht_bits); /* nr entries */ 48 /* And RAMFC */
69 dev_priv->ramht_size *= 8; /* 2 32-bit values per entry in RAMHT */ 49 length = dev_priv->engine.fifo.channels * nouveau_fifo_ctx_size(dev);
70 NV_DEBUG(dev, "RAMHT offset=0x%x, size=%d\n", dev_priv->ramht_offset,
71 dev_priv->ramht_size);
72
73 /* FIFO runout table (RAMRO) - 512k at 0x11200 */
74 dev_priv->ramro_offset = 0x11200;
75 dev_priv->ramro_size = 512;
76 NV_DEBUG(dev, "RAMRO offset=0x%x, size=%d\n", dev_priv->ramro_offset,
77 dev_priv->ramro_size);
78
79 /* FIFO context table (RAMFC)
80 * NV40 : Not sure exactly how to position RAMFC on some cards,
81 * 0x30002 seems to position it at RAMIN+0x20000 on these
82 * cards. RAMFC is 4kb (32 fifos, 128byte entries).
83 * Others: Position RAMFC at RAMIN+0x11400
84 */
85 dev_priv->ramfc_size = engine->fifo.channels *
86 nouveau_fifo_ctx_size(dev);
87 switch (dev_priv->card_type) { 50 switch (dev_priv->card_type) {
88 case NV_40: 51 case NV_40:
89 dev_priv->ramfc_offset = 0x20000; 52 offset = 0x20000;
90 break; 53 break;
91 case NV_30:
92 case NV_20:
93 case NV_10:
94 case NV_04:
95 default: 54 default:
96 dev_priv->ramfc_offset = 0x11400; 55 offset = 0x11400;
97 break; 56 break;
98 } 57 }
99 NV_DEBUG(dev, "RAMFC offset=0x%x, size=%d\n", dev_priv->ramfc_offset,
100 dev_priv->ramfc_size);
101}
102 58
103int nv04_instmem_init(struct drm_device *dev) 59 ret = nouveau_gpuobj_new_fake(dev, offset, ~0, length,
104{ 60 NVOBJ_FLAG_ZERO_ALLOC, &dev_priv->ramfc);
105 struct drm_nouveau_private *dev_priv = dev->dev_private; 61 if (ret)
106 uint32_t offset; 62 return ret;
107 int ret;
108 63
109 nv04_instmem_determine_amount(dev); 64 /* Only allow space after RAMFC to be used for object allocation */
110 nv04_instmem_configure_fixed_tables(dev); 65 offset += length;
111
112 /* Create a heap to manage RAMIN allocations, we don't allocate
113 * the space that was reserved for RAMHT/FC/RO.
114 */
115 offset = dev_priv->ramfc_offset + dev_priv->ramfc_size;
116 66
117 /* It appears RAMRO (or something?) is controlled by 0x2220/0x2230 67 /* It appears RAMRO (or something?) is controlled by 0x2220/0x2230
118 * on certain NV4x chipsets as well as RAMFC. When 0x2230 == 0 68 * on certain NV4x chipsets as well as RAMFC. When 0x2230 == 0
@@ -140,62 +90,77 @@ int nv04_instmem_init(struct drm_device *dev)
140void 90void
141nv04_instmem_takedown(struct drm_device *dev) 91nv04_instmem_takedown(struct drm_device *dev)
142{ 92{
93 struct drm_nouveau_private *dev_priv = dev->dev_private;
94
95 nouveau_ramht_ref(NULL, &dev_priv->ramht, NULL);
96 nouveau_gpuobj_ref(NULL, &dev_priv->ramro);
97 nouveau_gpuobj_ref(NULL, &dev_priv->ramfc);
98
99 if (drm_mm_initialized(&dev_priv->ramin_heap))
100 drm_mm_takedown(&dev_priv->ramin_heap);
143} 101}
144 102
145int 103int
146nv04_instmem_populate(struct drm_device *dev, struct nouveau_gpuobj *gpuobj, uint32_t *sz) 104nv04_instmem_suspend(struct drm_device *dev)
147{ 105{
148 if (gpuobj->im_backing)
149 return -EINVAL;
150
151 return 0; 106 return 0;
152} 107}
153 108
154void 109void
155nv04_instmem_clear(struct drm_device *dev, struct nouveau_gpuobj *gpuobj) 110nv04_instmem_resume(struct drm_device *dev)
156{ 111{
157 struct drm_nouveau_private *dev_priv = dev->dev_private;
158
159 if (gpuobj && gpuobj->im_backing) {
160 if (gpuobj->im_bound)
161 dev_priv->engine.instmem.unbind(dev, gpuobj);
162 gpuobj->im_backing = NULL;
163 }
164} 112}
165 113
166int 114int
167nv04_instmem_bind(struct drm_device *dev, struct nouveau_gpuobj *gpuobj) 115nv04_instmem_get(struct nouveau_gpuobj *gpuobj, u32 size, u32 align)
168{ 116{
169 if (!gpuobj->im_pramin || gpuobj->im_bound) 117 struct drm_nouveau_private *dev_priv = gpuobj->dev->dev_private;
170 return -EINVAL; 118 struct drm_mm_node *ramin = NULL;
171 119
172 gpuobj->im_bound = 1; 120 do {
173 return 0; 121 if (drm_mm_pre_get(&dev_priv->ramin_heap))
174} 122 return -ENOMEM;
123
124 spin_lock(&dev_priv->ramin_lock);
125 ramin = drm_mm_search_free(&dev_priv->ramin_heap, size, align, 0);
126 if (ramin == NULL) {
127 spin_unlock(&dev_priv->ramin_lock);
128 return -ENOMEM;
129 }
175 130
176int 131 ramin = drm_mm_get_block_atomic(ramin, size, align);
177nv04_instmem_unbind(struct drm_device *dev, struct nouveau_gpuobj *gpuobj) 132 spin_unlock(&dev_priv->ramin_lock);
178{ 133 } while (ramin == NULL);
179 if (gpuobj->im_bound == 0)
180 return -EINVAL;
181 134
182 gpuobj->im_bound = 0; 135 gpuobj->node = ramin;
136 gpuobj->vinst = ramin->start;
183 return 0; 137 return 0;
184} 138}
185 139
186void 140void
187nv04_instmem_flush(struct drm_device *dev) 141nv04_instmem_put(struct nouveau_gpuobj *gpuobj)
188{ 142{
143 struct drm_nouveau_private *dev_priv = gpuobj->dev->dev_private;
144
145 spin_lock(&dev_priv->ramin_lock);
146 drm_mm_put_block(gpuobj->node);
147 gpuobj->node = NULL;
148 spin_unlock(&dev_priv->ramin_lock);
189} 149}
190 150
191int 151int
192nv04_instmem_suspend(struct drm_device *dev) 152nv04_instmem_map(struct nouveau_gpuobj *gpuobj)
193{ 153{
154 gpuobj->pinst = gpuobj->vinst;
194 return 0; 155 return 0;
195} 156}
196 157
197void 158void
198nv04_instmem_resume(struct drm_device *dev) 159nv04_instmem_unmap(struct nouveau_gpuobj *gpuobj)
199{ 160{
200} 161}
201 162
163void
164nv04_instmem_flush(struct drm_device *dev)
165{
166}
diff --git a/drivers/gpu/drm/nouveau/nv04_pm.c b/drivers/gpu/drm/nouveau/nv04_pm.c
new file mode 100644
index 000000000000..eb1c70dd82ed
--- /dev/null
+++ b/drivers/gpu/drm/nouveau/nv04_pm.c
@@ -0,0 +1,90 @@
1/*
2 * Copyright 2010 Red Hat 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: Ben Skeggs
23 */
24
25#include "drmP.h"
26#include "nouveau_drv.h"
27#include "nouveau_hw.h"
28#include "nouveau_pm.h"
29
30struct nv04_pm_state {
31 struct pll_lims pll;
32 struct nouveau_pll_vals calc;
33};
34
35int
36nv04_pm_clock_get(struct drm_device *dev, u32 id)
37{
38 return nouveau_hw_get_clock(dev, id);
39}
40
41void *
42nv04_pm_clock_pre(struct drm_device *dev, struct nouveau_pm_level *perflvl,
43 u32 id, int khz)
44{
45 struct nv04_pm_state *state;
46 int ret;
47
48 state = kzalloc(sizeof(*state), GFP_KERNEL);
49 if (!state)
50 return ERR_PTR(-ENOMEM);
51
52 ret = get_pll_limits(dev, id, &state->pll);
53 if (ret) {
54 kfree(state);
55 return (ret == -ENOENT) ? NULL : ERR_PTR(ret);
56 }
57
58 ret = nouveau_calc_pll_mnp(dev, &state->pll, khz, &state->calc);
59 if (!ret) {
60 kfree(state);
61 return ERR_PTR(-EINVAL);
62 }
63
64 return state;
65}
66
67void
68nv04_pm_clock_set(struct drm_device *dev, void *pre_state)
69{
70 struct drm_nouveau_private *dev_priv = dev->dev_private;
71 struct nv04_pm_state *state = pre_state;
72 u32 reg = state->pll.reg;
73
74 /* thank the insane nouveau_hw_setpll() interface for this */
75 if (dev_priv->card_type >= NV_40)
76 reg += 4;
77
78 nouveau_hw_setpll(dev, reg, &state->calc);
79
80 if (dev_priv->card_type < NV_30 && reg == NV_PRAMDAC_MPLL_COEFF) {
81 if (dev_priv->card_type == NV_20)
82 nv_mask(dev, 0x1002c4, 0, 1 << 20);
83
84 /* Reset the DLLs */
85 nv_mask(dev, 0x1002c0, 0, 1 << 8);
86 }
87
88 kfree(state);
89}
90
diff --git a/drivers/gpu/drm/nouveau/nv04_tv.c b/drivers/gpu/drm/nouveau/nv04_tv.c
index 0b5d012d7c28..3eb605ddfd03 100644
--- a/drivers/gpu/drm/nouveau/nv04_tv.c
+++ b/drivers/gpu/drm/nouveau/nv04_tv.c
@@ -49,8 +49,8 @@ static struct i2c_board_info nv04_tv_encoder_info[] = {
49 49
50int nv04_tv_identify(struct drm_device *dev, int i2c_index) 50int nv04_tv_identify(struct drm_device *dev, int i2c_index)
51{ 51{
52 return nouveau_i2c_identify(dev, "TV encoder", 52 return nouveau_i2c_identify(dev, "TV encoder", nv04_tv_encoder_info,
53 nv04_tv_encoder_info, i2c_index); 53 NULL, i2c_index);
54} 54}
55 55
56 56
@@ -99,12 +99,10 @@ static void nv04_tv_bind(struct drm_device *dev, int head, bool bind)
99 99
100 state->tv_setup = 0; 100 state->tv_setup = 0;
101 101
102 if (bind) { 102 if (bind)
103 state->CRTC[NV_CIO_CRE_LCD__INDEX] = 0;
104 state->CRTC[NV_CIO_CRE_49] |= 0x10; 103 state->CRTC[NV_CIO_CRE_49] |= 0x10;
105 } else { 104 else
106 state->CRTC[NV_CIO_CRE_49] &= ~0x10; 105 state->CRTC[NV_CIO_CRE_49] &= ~0x10;
107 }
108 106
109 NVWriteVgaCrtc(dev, head, NV_CIO_CRE_LCD__INDEX, 107 NVWriteVgaCrtc(dev, head, NV_CIO_CRE_LCD__INDEX,
110 state->CRTC[NV_CIO_CRE_LCD__INDEX]); 108 state->CRTC[NV_CIO_CRE_LCD__INDEX]);
diff --git a/drivers/gpu/drm/nouveau/nv10_fb.c b/drivers/gpu/drm/nouveau/nv10_fb.c
index cc5cda44e501..f78181a59b4a 100644
--- a/drivers/gpu/drm/nouveau/nv10_fb.c
+++ b/drivers/gpu/drm/nouveau/nv10_fb.c
@@ -3,23 +3,109 @@
3#include "nouveau_drv.h" 3#include "nouveau_drv.h"
4#include "nouveau_drm.h" 4#include "nouveau_drm.h"
5 5
6static struct drm_mm_node *
7nv20_fb_alloc_tag(struct drm_device *dev, uint32_t size)
8{
9 struct drm_nouveau_private *dev_priv = dev->dev_private;
10 struct nouveau_fb_engine *pfb = &dev_priv->engine.fb;
11 struct drm_mm_node *mem;
12 int ret;
13
14 ret = drm_mm_pre_get(&pfb->tag_heap);
15 if (ret)
16 return NULL;
17
18 spin_lock(&dev_priv->tile.lock);
19 mem = drm_mm_search_free(&pfb->tag_heap, size, 0, 0);
20 if (mem)
21 mem = drm_mm_get_block_atomic(mem, size, 0);
22 spin_unlock(&dev_priv->tile.lock);
23
24 return mem;
25}
26
27static void
28nv20_fb_free_tag(struct drm_device *dev, struct drm_mm_node *mem)
29{
30 struct drm_nouveau_private *dev_priv = dev->dev_private;
31
32 spin_lock(&dev_priv->tile.lock);
33 drm_mm_put_block(mem);
34 spin_unlock(&dev_priv->tile.lock);
35}
36
37void
38nv10_fb_init_tile_region(struct drm_device *dev, int i, uint32_t addr,
39 uint32_t size, uint32_t pitch, uint32_t flags)
40{
41 struct drm_nouveau_private *dev_priv = dev->dev_private;
42 struct nouveau_tile_reg *tile = &dev_priv->tile.reg[i];
43 int bpp = (flags & NOUVEAU_GEM_TILE_32BPP ? 32 : 16);
44
45 tile->addr = addr;
46 tile->limit = max(1u, addr + size) - 1;
47 tile->pitch = pitch;
48
49 if (dev_priv->card_type == NV_20) {
50 if (flags & NOUVEAU_GEM_TILE_ZETA) {
51 /*
52 * Allocate some of the on-die tag memory,
53 * used to store Z compression meta-data (most
54 * likely just a bitmap determining if a given
55 * tile is compressed or not).
56 */
57 tile->tag_mem = nv20_fb_alloc_tag(dev, size / 256);
58
59 if (tile->tag_mem) {
60 /* Enable Z compression */
61 if (dev_priv->chipset >= 0x25)
62 tile->zcomp = tile->tag_mem->start |
63 (bpp == 16 ?
64 NV25_PFB_ZCOMP_MODE_16 :
65 NV25_PFB_ZCOMP_MODE_32);
66 else
67 tile->zcomp = tile->tag_mem->start |
68 NV20_PFB_ZCOMP_EN |
69 (bpp == 16 ? 0 :
70 NV20_PFB_ZCOMP_MODE_32);
71 }
72
73 tile->addr |= 3;
74 } else {
75 tile->addr |= 1;
76 }
77
78 } else {
79 tile->addr |= 1 << 31;
80 }
81}
82
6void 83void
7nv10_fb_set_region_tiling(struct drm_device *dev, int i, uint32_t addr, 84nv10_fb_free_tile_region(struct drm_device *dev, int i)
8 uint32_t size, uint32_t pitch)
9{ 85{
10 struct drm_nouveau_private *dev_priv = dev->dev_private; 86 struct drm_nouveau_private *dev_priv = dev->dev_private;
11 uint32_t limit = max(1u, addr + size) - 1; 87 struct nouveau_tile_reg *tile = &dev_priv->tile.reg[i];
12 88
13 if (pitch) { 89 if (tile->tag_mem) {
14 if (dev_priv->card_type >= NV_20) 90 nv20_fb_free_tag(dev, tile->tag_mem);
15 addr |= 1; 91 tile->tag_mem = NULL;
16 else
17 addr |= 1 << 31;
18 } 92 }
19 93
20 nv_wr32(dev, NV10_PFB_TLIMIT(i), limit); 94 tile->addr = tile->limit = tile->pitch = tile->zcomp = 0;
21 nv_wr32(dev, NV10_PFB_TSIZE(i), pitch); 95}
22 nv_wr32(dev, NV10_PFB_TILE(i), addr); 96
97void
98nv10_fb_set_tile_region(struct drm_device *dev, int i)
99{
100 struct drm_nouveau_private *dev_priv = dev->dev_private;
101 struct nouveau_tile_reg *tile = &dev_priv->tile.reg[i];
102
103 nv_wr32(dev, NV10_PFB_TLIMIT(i), tile->limit);
104 nv_wr32(dev, NV10_PFB_TSIZE(i), tile->pitch);
105 nv_wr32(dev, NV10_PFB_TILE(i), tile->addr);
106
107 if (dev_priv->card_type == NV_20)
108 nv_wr32(dev, NV20_PFB_ZCOMP(i), tile->zcomp);
23} 109}
24 110
25int 111int
@@ -31,9 +117,14 @@ nv10_fb_init(struct drm_device *dev)
31 117
32 pfb->num_tiles = NV10_PFB_TILE__SIZE; 118 pfb->num_tiles = NV10_PFB_TILE__SIZE;
33 119
120 if (dev_priv->card_type == NV_20)
121 drm_mm_init(&pfb->tag_heap, 0,
122 (dev_priv->chipset >= 0x25 ?
123 64 * 1024 : 32 * 1024));
124
34 /* Turn all the tiling regions off. */ 125 /* Turn all the tiling regions off. */
35 for (i = 0; i < pfb->num_tiles; i++) 126 for (i = 0; i < pfb->num_tiles; i++)
36 pfb->set_region_tiling(dev, i, 0, 0, 0); 127 pfb->set_tile_region(dev, i);
37 128
38 return 0; 129 return 0;
39} 130}
@@ -41,4 +132,13 @@ nv10_fb_init(struct drm_device *dev)
41void 132void
42nv10_fb_takedown(struct drm_device *dev) 133nv10_fb_takedown(struct drm_device *dev)
43{ 134{
135 struct drm_nouveau_private *dev_priv = dev->dev_private;
136 struct nouveau_fb_engine *pfb = &dev_priv->engine.fb;
137 int i;
138
139 for (i = 0; i < pfb->num_tiles; i++)
140 pfb->free_tile_region(dev, i);
141
142 if (dev_priv->card_type == NV_20)
143 drm_mm_takedown(&pfb->tag_heap);
44} 144}
diff --git a/drivers/gpu/drm/nouveau/nv10_fifo.c b/drivers/gpu/drm/nouveau/nv10_fifo.c
index 7a4069cf5d0b..d2ecbff4bee1 100644
--- a/drivers/gpu/drm/nouveau/nv10_fifo.c
+++ b/drivers/gpu/drm/nouveau/nv10_fifo.c
@@ -27,8 +27,9 @@
27#include "drmP.h" 27#include "drmP.h"
28#include "drm.h" 28#include "drm.h"
29#include "nouveau_drv.h" 29#include "nouveau_drv.h"
30#include "nouveau_ramht.h"
30 31
31#define NV10_RAMFC(c) (dev_priv->ramfc_offset + ((c) * NV10_RAMFC__SIZE)) 32#define NV10_RAMFC(c) (dev_priv->ramfc->pinst + ((c) * NV10_RAMFC__SIZE))
32#define NV10_RAMFC__SIZE ((dev_priv->chipset) >= 0x17 ? 64 : 32) 33#define NV10_RAMFC__SIZE ((dev_priv->chipset) >= 0x17 ? 64 : 32)
33 34
34int 35int
@@ -48,16 +49,21 @@ nv10_fifo_create_context(struct nouveau_channel *chan)
48 49
49 ret = nouveau_gpuobj_new_fake(dev, NV10_RAMFC(chan->id), ~0, 50 ret = nouveau_gpuobj_new_fake(dev, NV10_RAMFC(chan->id), ~0,
50 NV10_RAMFC__SIZE, NVOBJ_FLAG_ZERO_ALLOC | 51 NV10_RAMFC__SIZE, NVOBJ_FLAG_ZERO_ALLOC |
51 NVOBJ_FLAG_ZERO_FREE, NULL, &chan->ramfc); 52 NVOBJ_FLAG_ZERO_FREE, &chan->ramfc);
52 if (ret) 53 if (ret)
53 return ret; 54 return ret;
54 55
56 chan->user = ioremap(pci_resource_start(dev->pdev, 0) +
57 NV03_USER(chan->id), PAGE_SIZE);
58 if (!chan->user)
59 return -ENOMEM;
60
55 /* Fill entries that are seen filled in dumps of nvidia driver just 61 /* Fill entries that are seen filled in dumps of nvidia driver just
56 * after channel's is put into DMA mode 62 * after channel's is put into DMA mode
57 */ 63 */
58 nv_wi32(dev, fc + 0, chan->pushbuf_base); 64 nv_wi32(dev, fc + 0, chan->pushbuf_base);
59 nv_wi32(dev, fc + 4, chan->pushbuf_base); 65 nv_wi32(dev, fc + 4, chan->pushbuf_base);
60 nv_wi32(dev, fc + 12, chan->pushbuf->instance >> 4); 66 nv_wi32(dev, fc + 12, chan->pushbuf->pinst >> 4);
61 nv_wi32(dev, fc + 20, NV_PFIFO_CACHE1_DMA_FETCH_TRIG_128_BYTES | 67 nv_wi32(dev, fc + 20, NV_PFIFO_CACHE1_DMA_FETCH_TRIG_128_BYTES |
62 NV_PFIFO_CACHE1_DMA_FETCH_SIZE_128_BYTES | 68 NV_PFIFO_CACHE1_DMA_FETCH_SIZE_128_BYTES |
63 NV_PFIFO_CACHE1_DMA_FETCH_MAX_REQS_8 | 69 NV_PFIFO_CACHE1_DMA_FETCH_MAX_REQS_8 |
@@ -72,17 +78,6 @@ nv10_fifo_create_context(struct nouveau_channel *chan)
72 return 0; 78 return 0;
73} 79}
74 80
75void
76nv10_fifo_destroy_context(struct nouveau_channel *chan)
77{
78 struct drm_device *dev = chan->dev;
79
80 nv_wr32(dev, NV04_PFIFO_MODE,
81 nv_rd32(dev, NV04_PFIFO_MODE) & ~(1 << chan->id));
82
83 nouveau_gpuobj_ref_del(dev, &chan->ramfc);
84}
85
86static void 81static void
87nv10_fifo_do_load_context(struct drm_device *dev, int chid) 82nv10_fifo_do_load_context(struct drm_device *dev, int chid)
88{ 83{
@@ -202,14 +197,14 @@ nv10_fifo_init_ramxx(struct drm_device *dev)
202 struct drm_nouveau_private *dev_priv = dev->dev_private; 197 struct drm_nouveau_private *dev_priv = dev->dev_private;
203 198
204 nv_wr32(dev, NV03_PFIFO_RAMHT, (0x03 << 24) /* search 128 */ | 199 nv_wr32(dev, NV03_PFIFO_RAMHT, (0x03 << 24) /* search 128 */ |
205 ((dev_priv->ramht_bits - 9) << 16) | 200 ((dev_priv->ramht->bits - 9) << 16) |
206 (dev_priv->ramht_offset >> 8)); 201 (dev_priv->ramht->gpuobj->pinst >> 8));
207 nv_wr32(dev, NV03_PFIFO_RAMRO, dev_priv->ramro_offset>>8); 202 nv_wr32(dev, NV03_PFIFO_RAMRO, dev_priv->ramro->pinst >> 8);
208 203
209 if (dev_priv->chipset < 0x17) { 204 if (dev_priv->chipset < 0x17) {
210 nv_wr32(dev, NV03_PFIFO_RAMFC, dev_priv->ramfc_offset >> 8); 205 nv_wr32(dev, NV03_PFIFO_RAMFC, dev_priv->ramfc->pinst >> 8);
211 } else { 206 } else {
212 nv_wr32(dev, NV03_PFIFO_RAMFC, (dev_priv->ramfc_offset >> 8) | 207 nv_wr32(dev, NV03_PFIFO_RAMFC, (dev_priv->ramfc->pinst >> 8) |
213 (1 << 16) /* 64 Bytes entry*/); 208 (1 << 16) /* 64 Bytes entry*/);
214 /* XXX nvidia blob set bit 18, 21,23 for nv20 & nv30 */ 209 /* XXX nvidia blob set bit 18, 21,23 for nv20 & nv30 */
215 } 210 }
@@ -218,6 +213,7 @@ nv10_fifo_init_ramxx(struct drm_device *dev)
218static void 213static void
219nv10_fifo_init_intr(struct drm_device *dev) 214nv10_fifo_init_intr(struct drm_device *dev)
220{ 215{
216 nouveau_irq_register(dev, 8, nv04_fifo_isr);
221 nv_wr32(dev, 0x002100, 0xffffffff); 217 nv_wr32(dev, 0x002100, 0xffffffff);
222 nv_wr32(dev, 0x002140, 0xffffffff); 218 nv_wr32(dev, 0x002140, 0xffffffff);
223} 219}
@@ -240,7 +236,7 @@ nv10_fifo_init(struct drm_device *dev)
240 pfifo->reassign(dev, true); 236 pfifo->reassign(dev, true);
241 237
242 for (i = 0; i < dev_priv->engine.fifo.channels; i++) { 238 for (i = 0; i < dev_priv->engine.fifo.channels; i++) {
243 if (dev_priv->fifos[i]) { 239 if (dev_priv->channels.ptr[i]) {
244 uint32_t mode = nv_rd32(dev, NV04_PFIFO_MODE); 240 uint32_t mode = nv_rd32(dev, NV04_PFIFO_MODE);
245 nv_wr32(dev, NV04_PFIFO_MODE, mode | (1 << i)); 241 nv_wr32(dev, NV04_PFIFO_MODE, mode | (1 << i));
246 } 242 }
diff --git a/drivers/gpu/drm/nouveau/nv10_graph.c b/drivers/gpu/drm/nouveau/nv10_graph.c
index b2f6a57c0cc5..0930c6cb88e0 100644
--- a/drivers/gpu/drm/nouveau/nv10_graph.c
+++ b/drivers/gpu/drm/nouveau/nv10_graph.c
@@ -26,8 +26,11 @@
26#include "drm.h" 26#include "drm.h"
27#include "nouveau_drm.h" 27#include "nouveau_drm.h"
28#include "nouveau_drv.h" 28#include "nouveau_drv.h"
29#include "nouveau_util.h"
29 30
30#define NV10_FIFO_NUMBER 32 31struct nv10_graph_engine {
32 struct nouveau_exec_engine base;
33};
31 34
32struct pipe_state { 35struct pipe_state {
33 uint32_t pipe_0x0000[0x040/4]; 36 uint32_t pipe_0x0000[0x040/4];
@@ -410,9 +413,9 @@ struct graph_state {
410 413
411static void nv10_graph_save_pipe(struct nouveau_channel *chan) 414static void nv10_graph_save_pipe(struct nouveau_channel *chan)
412{ 415{
413 struct drm_device *dev = chan->dev; 416 struct graph_state *pgraph_ctx = chan->engctx[NVOBJ_ENGINE_GR];
414 struct graph_state *pgraph_ctx = chan->pgraph_ctx;
415 struct pipe_state *pipe = &pgraph_ctx->pipe_state; 417 struct pipe_state *pipe = &pgraph_ctx->pipe_state;
418 struct drm_device *dev = chan->dev;
416 419
417 PIPE_SAVE(dev, pipe->pipe_0x4400, 0x4400); 420 PIPE_SAVE(dev, pipe->pipe_0x4400, 0x4400);
418 PIPE_SAVE(dev, pipe->pipe_0x0200, 0x0200); 421 PIPE_SAVE(dev, pipe->pipe_0x0200, 0x0200);
@@ -428,9 +431,9 @@ static void nv10_graph_save_pipe(struct nouveau_channel *chan)
428 431
429static void nv10_graph_load_pipe(struct nouveau_channel *chan) 432static void nv10_graph_load_pipe(struct nouveau_channel *chan)
430{ 433{
431 struct drm_device *dev = chan->dev; 434 struct graph_state *pgraph_ctx = chan->engctx[NVOBJ_ENGINE_GR];
432 struct graph_state *pgraph_ctx = chan->pgraph_ctx;
433 struct pipe_state *pipe = &pgraph_ctx->pipe_state; 435 struct pipe_state *pipe = &pgraph_ctx->pipe_state;
436 struct drm_device *dev = chan->dev;
434 uint32_t xfmode0, xfmode1; 437 uint32_t xfmode0, xfmode1;
435 int i; 438 int i;
436 439
@@ -478,9 +481,9 @@ static void nv10_graph_load_pipe(struct nouveau_channel *chan)
478 481
479static void nv10_graph_create_pipe(struct nouveau_channel *chan) 482static void nv10_graph_create_pipe(struct nouveau_channel *chan)
480{ 483{
481 struct drm_device *dev = chan->dev; 484 struct graph_state *pgraph_ctx = chan->engctx[NVOBJ_ENGINE_GR];
482 struct graph_state *pgraph_ctx = chan->pgraph_ctx;
483 struct pipe_state *fifo_pipe_state = &pgraph_ctx->pipe_state; 485 struct pipe_state *fifo_pipe_state = &pgraph_ctx->pipe_state;
486 struct drm_device *dev = chan->dev;
484 uint32_t *fifo_pipe_state_addr; 487 uint32_t *fifo_pipe_state_addr;
485 int i; 488 int i;
486#define PIPE_INIT(addr) \ 489#define PIPE_INIT(addr) \
@@ -657,8 +660,6 @@ static void nv10_graph_load_dma_vtxbuf(struct nouveau_channel *chan,
657 uint32_t inst) 660 uint32_t inst)
658{ 661{
659 struct drm_device *dev = chan->dev; 662 struct drm_device *dev = chan->dev;
660 struct drm_nouveau_private *dev_priv = dev->dev_private;
661 struct nouveau_pgraph_engine *pgraph = &dev_priv->engine.graph;
662 uint32_t st2, st2_dl, st2_dh, fifo_ptr, fifo[0x60/4]; 663 uint32_t st2, st2_dl, st2_dh, fifo_ptr, fifo[0x60/4];
663 uint32_t ctx_user, ctx_switch[5]; 664 uint32_t ctx_user, ctx_switch[5];
664 int i, subchan = -1; 665 int i, subchan = -1;
@@ -707,8 +708,8 @@ static void nv10_graph_load_dma_vtxbuf(struct nouveau_channel *chan,
707 0x2c000000 | chan->id << 20 | subchan << 16 | 0x18c); 708 0x2c000000 | chan->id << 20 | subchan << 16 | 0x18c);
708 nv_wr32(dev, NV10_PGRAPH_FFINTFC_ST2_DL, inst); 709 nv_wr32(dev, NV10_PGRAPH_FFINTFC_ST2_DL, inst);
709 nv_mask(dev, NV10_PGRAPH_CTX_CONTROL, 0, 0x10000); 710 nv_mask(dev, NV10_PGRAPH_CTX_CONTROL, 0, 0x10000);
710 pgraph->fifo_access(dev, true); 711 nv04_graph_fifo_access(dev, true);
711 pgraph->fifo_access(dev, false); 712 nv04_graph_fifo_access(dev, false);
712 713
713 /* Restore the FIFO state */ 714 /* Restore the FIFO state */
714 for (i = 0; i < ARRAY_SIZE(fifo); i++) 715 for (i = 0; i < ARRAY_SIZE(fifo); i++)
@@ -725,11 +726,12 @@ static void nv10_graph_load_dma_vtxbuf(struct nouveau_channel *chan,
725 nv_wr32(dev, NV10_PGRAPH_CTX_USER, ctx_user); 726 nv_wr32(dev, NV10_PGRAPH_CTX_USER, ctx_user);
726} 727}
727 728
728int nv10_graph_load_context(struct nouveau_channel *chan) 729static int
730nv10_graph_load_context(struct nouveau_channel *chan)
729{ 731{
730 struct drm_device *dev = chan->dev; 732 struct drm_device *dev = chan->dev;
731 struct drm_nouveau_private *dev_priv = dev->dev_private; 733 struct drm_nouveau_private *dev_priv = dev->dev_private;
732 struct graph_state *pgraph_ctx = chan->pgraph_ctx; 734 struct graph_state *pgraph_ctx = chan->engctx[NVOBJ_ENGINE_GR];
733 uint32_t tmp; 735 uint32_t tmp;
734 int i; 736 int i;
735 737
@@ -753,21 +755,20 @@ int nv10_graph_load_context(struct nouveau_channel *chan)
753 return 0; 755 return 0;
754} 756}
755 757
756int 758static int
757nv10_graph_unload_context(struct drm_device *dev) 759nv10_graph_unload_context(struct drm_device *dev)
758{ 760{
759 struct drm_nouveau_private *dev_priv = dev->dev_private; 761 struct drm_nouveau_private *dev_priv = dev->dev_private;
760 struct nouveau_pgraph_engine *pgraph = &dev_priv->engine.graph;
761 struct nouveau_fifo_engine *pfifo = &dev_priv->engine.fifo; 762 struct nouveau_fifo_engine *pfifo = &dev_priv->engine.fifo;
762 struct nouveau_channel *chan; 763 struct nouveau_channel *chan;
763 struct graph_state *ctx; 764 struct graph_state *ctx;
764 uint32_t tmp; 765 uint32_t tmp;
765 int i; 766 int i;
766 767
767 chan = pgraph->channel(dev); 768 chan = nv10_graph_channel(dev);
768 if (!chan) 769 if (!chan)
769 return 0; 770 return 0;
770 ctx = chan->pgraph_ctx; 771 ctx = chan->engctx[NVOBJ_ENGINE_GR];
771 772
772 for (i = 0; i < ARRAY_SIZE(nv10_graph_ctx_regs); i++) 773 for (i = 0; i < ARRAY_SIZE(nv10_graph_ctx_regs); i++)
773 ctx->nv10[i] = nv_rd32(dev, nv10_graph_ctx_regs[i]); 774 ctx->nv10[i] = nv_rd32(dev, nv10_graph_ctx_regs[i]);
@@ -786,15 +787,13 @@ nv10_graph_unload_context(struct drm_device *dev)
786 return 0; 787 return 0;
787} 788}
788 789
789void 790static void
790nv10_graph_context_switch(struct drm_device *dev) 791nv10_graph_context_switch(struct drm_device *dev)
791{ 792{
792 struct drm_nouveau_private *dev_priv = dev->dev_private; 793 struct drm_nouveau_private *dev_priv = dev->dev_private;
793 struct nouveau_pgraph_engine *pgraph = &dev_priv->engine.graph;
794 struct nouveau_channel *chan = NULL; 794 struct nouveau_channel *chan = NULL;
795 int chid; 795 int chid;
796 796
797 pgraph->fifo_access(dev, false);
798 nouveau_wait_for_idle(dev); 797 nouveau_wait_for_idle(dev);
799 798
800 /* If previous context is valid, we need to save it */ 799 /* If previous context is valid, we need to save it */
@@ -802,11 +801,9 @@ nv10_graph_context_switch(struct drm_device *dev)
802 801
803 /* Load context for next channel */ 802 /* Load context for next channel */
804 chid = (nv_rd32(dev, NV04_PGRAPH_TRAPPED_ADDR) >> 20) & 0x1f; 803 chid = (nv_rd32(dev, NV04_PGRAPH_TRAPPED_ADDR) >> 20) & 0x1f;
805 chan = dev_priv->fifos[chid]; 804 chan = dev_priv->channels.ptr[chid];
806 if (chan) 805 if (chan && chan->engctx[NVOBJ_ENGINE_GR])
807 nv10_graph_load_context(chan); 806 nv10_graph_load_context(chan);
808
809 pgraph->fifo_access(dev, true);
810} 807}
811 808
812#define NV_WRITE_CTX(reg, val) do { \ 809#define NV_WRITE_CTX(reg, val) do { \
@@ -833,10 +830,11 @@ nv10_graph_channel(struct drm_device *dev)
833 if (chid >= dev_priv->engine.fifo.channels) 830 if (chid >= dev_priv->engine.fifo.channels)
834 return NULL; 831 return NULL;
835 832
836 return dev_priv->fifos[chid]; 833 return dev_priv->channels.ptr[chid];
837} 834}
838 835
839int nv10_graph_create_context(struct nouveau_channel *chan) 836static int
837nv10_graph_context_new(struct nouveau_channel *chan, int engine)
840{ 838{
841 struct drm_device *dev = chan->dev; 839 struct drm_device *dev = chan->dev;
842 struct drm_nouveau_private *dev_priv = dev->dev_private; 840 struct drm_nouveau_private *dev_priv = dev->dev_private;
@@ -844,11 +842,10 @@ int nv10_graph_create_context(struct nouveau_channel *chan)
844 842
845 NV_DEBUG(dev, "nv10_graph_context_create %d\n", chan->id); 843 NV_DEBUG(dev, "nv10_graph_context_create %d\n", chan->id);
846 844
847 chan->pgraph_ctx = pgraph_ctx = kzalloc(sizeof(*pgraph_ctx), 845 pgraph_ctx = kzalloc(sizeof(*pgraph_ctx), GFP_KERNEL);
848 GFP_KERNEL);
849 if (pgraph_ctx == NULL) 846 if (pgraph_ctx == NULL)
850 return -ENOMEM; 847 return -ENOMEM;
851 848 chan->engctx[engine] = pgraph_ctx;
852 849
853 NV_WRITE_CTX(0x00400e88, 0x08000000); 850 NV_WRITE_CTX(0x00400e88, 0x08000000);
854 NV_WRITE_CTX(0x00400e9c, 0x4b7fffff); 851 NV_WRITE_CTX(0x00400e9c, 0x4b7fffff);
@@ -873,32 +870,45 @@ int nv10_graph_create_context(struct nouveau_channel *chan)
873 return 0; 870 return 0;
874} 871}
875 872
876void nv10_graph_destroy_context(struct nouveau_channel *chan) 873static void
874nv10_graph_context_del(struct nouveau_channel *chan, int engine)
877{ 875{
878 struct graph_state *pgraph_ctx = chan->pgraph_ctx; 876 struct drm_device *dev = chan->dev;
877 struct drm_nouveau_private *dev_priv = dev->dev_private;
878 struct graph_state *pgraph_ctx = chan->engctx[engine];
879 unsigned long flags;
880
881 spin_lock_irqsave(&dev_priv->context_switch_lock, flags);
882 nv04_graph_fifo_access(dev, false);
883
884 /* Unload the context if it's the currently active one */
885 if (nv10_graph_channel(dev) == chan)
886 nv10_graph_unload_context(dev);
879 887
888 nv04_graph_fifo_access(dev, true);
889 spin_unlock_irqrestore(&dev_priv->context_switch_lock, flags);
890
891 /* Free the context resources */
892 chan->engctx[engine] = NULL;
880 kfree(pgraph_ctx); 893 kfree(pgraph_ctx);
881 chan->pgraph_ctx = NULL;
882} 894}
883 895
884void 896static void
885nv10_graph_set_region_tiling(struct drm_device *dev, int i, uint32_t addr, 897nv10_graph_set_tile_region(struct drm_device *dev, int i)
886 uint32_t size, uint32_t pitch)
887{ 898{
888 uint32_t limit = max(1u, addr + size) - 1; 899 struct drm_nouveau_private *dev_priv = dev->dev_private;
889 900 struct nouveau_tile_reg *tile = &dev_priv->tile.reg[i];
890 if (pitch)
891 addr |= 1 << 31;
892 901
893 nv_wr32(dev, NV10_PGRAPH_TLIMIT(i), limit); 902 nv_wr32(dev, NV10_PGRAPH_TLIMIT(i), tile->limit);
894 nv_wr32(dev, NV10_PGRAPH_TSIZE(i), pitch); 903 nv_wr32(dev, NV10_PGRAPH_TSIZE(i), tile->pitch);
895 nv_wr32(dev, NV10_PGRAPH_TILE(i), addr); 904 nv_wr32(dev, NV10_PGRAPH_TILE(i), tile->addr);
896} 905}
897 906
898int nv10_graph_init(struct drm_device *dev) 907static int
908nv10_graph_init(struct drm_device *dev, int engine)
899{ 909{
900 struct drm_nouveau_private *dev_priv = dev->dev_private; 910 struct drm_nouveau_private *dev_priv = dev->dev_private;
901 uint32_t tmp; 911 u32 tmp;
902 int i; 912 int i;
903 913
904 nv_wr32(dev, NV03_PMC_ENABLE, nv_rd32(dev, NV03_PMC_ENABLE) & 914 nv_wr32(dev, NV03_PMC_ENABLE, nv_rd32(dev, NV03_PMC_ENABLE) &
@@ -928,7 +938,7 @@ int nv10_graph_init(struct drm_device *dev)
928 938
929 /* Turn all the tiling regions off. */ 939 /* Turn all the tiling regions off. */
930 for (i = 0; i < NV10_PFB_TILE__SIZE; i++) 940 for (i = 0; i < NV10_PFB_TILE__SIZE; i++)
931 nv10_graph_set_region_tiling(dev, i, 0, 0, 0); 941 nv10_graph_set_tile_region(dev, i);
932 942
933 nv_wr32(dev, NV10_PGRAPH_CTX_SWITCH(0), 0x00000000); 943 nv_wr32(dev, NV10_PGRAPH_CTX_SWITCH(0), 0x00000000);
934 nv_wr32(dev, NV10_PGRAPH_CTX_SWITCH(1), 0x00000000); 944 nv_wr32(dev, NV10_PGRAPH_CTX_SWITCH(1), 0x00000000);
@@ -946,19 +956,21 @@ int nv10_graph_init(struct drm_device *dev)
946 return 0; 956 return 0;
947} 957}
948 958
949void nv10_graph_takedown(struct drm_device *dev) 959static int
960nv10_graph_fini(struct drm_device *dev, int engine)
950{ 961{
962 nv10_graph_unload_context(dev);
963 nv_wr32(dev, NV03_PGRAPH_INTR_EN, 0x00000000);
964 return 0;
951} 965}
952 966
953static int 967static int
954nv17_graph_mthd_lma_window(struct nouveau_channel *chan, int grclass, 968nv17_graph_mthd_lma_window(struct nouveau_channel *chan,
955 int mthd, uint32_t data) 969 u32 class, u32 mthd, u32 data)
956{ 970{
971 struct graph_state *ctx = chan->engctx[NVOBJ_ENGINE_GR];
957 struct drm_device *dev = chan->dev; 972 struct drm_device *dev = chan->dev;
958 struct graph_state *ctx = chan->pgraph_ctx;
959 struct pipe_state *pipe = &ctx->pipe_state; 973 struct pipe_state *pipe = &ctx->pipe_state;
960 struct drm_nouveau_private *dev_priv = dev->dev_private;
961 struct nouveau_pgraph_engine *pgraph = &dev_priv->engine.graph;
962 uint32_t pipe_0x0040[1], pipe_0x64c0[8], pipe_0x6a80[3], pipe_0x6ab0[3]; 974 uint32_t pipe_0x0040[1], pipe_0x64c0[8], pipe_0x6a80[3], pipe_0x6ab0[3];
963 uint32_t xfmode0, xfmode1; 975 uint32_t xfmode0, xfmode1;
964 int i; 976 int i;
@@ -1025,18 +1037,14 @@ nv17_graph_mthd_lma_window(struct nouveau_channel *chan, int grclass,
1025 1037
1026 nouveau_wait_for_idle(dev); 1038 nouveau_wait_for_idle(dev);
1027 1039
1028 pgraph->fifo_access(dev, true);
1029
1030 return 0; 1040 return 0;
1031} 1041}
1032 1042
1033static int 1043static int
1034nv17_graph_mthd_lma_enable(struct nouveau_channel *chan, int grclass, 1044nv17_graph_mthd_lma_enable(struct nouveau_channel *chan,
1035 int mthd, uint32_t data) 1045 u32 class, u32 mthd, u32 data)
1036{ 1046{
1037 struct drm_device *dev = chan->dev; 1047 struct drm_device *dev = chan->dev;
1038 struct drm_nouveau_private *dev_priv = dev->dev_private;
1039 struct nouveau_pgraph_engine *pgraph = &dev_priv->engine.graph;
1040 1048
1041 nouveau_wait_for_idle(dev); 1049 nouveau_wait_for_idle(dev);
1042 1050
@@ -1045,40 +1053,137 @@ nv17_graph_mthd_lma_enable(struct nouveau_channel *chan, int grclass,
1045 nv_wr32(dev, 0x004006b0, 1053 nv_wr32(dev, 0x004006b0,
1046 nv_rd32(dev, 0x004006b0) | 0x8 << 24); 1054 nv_rd32(dev, 0x004006b0) | 0x8 << 24);
1047 1055
1048 pgraph->fifo_access(dev, true);
1049
1050 return 0; 1056 return 0;
1051} 1057}
1052 1058
1053static struct nouveau_pgraph_object_method nv17_graph_celsius_mthds[] = { 1059struct nouveau_bitfield nv10_graph_intr[] = {
1054 { 0x1638, nv17_graph_mthd_lma_window }, 1060 { NV_PGRAPH_INTR_NOTIFY, "NOTIFY" },
1055 { 0x163c, nv17_graph_mthd_lma_window }, 1061 { NV_PGRAPH_INTR_ERROR, "ERROR" },
1056 { 0x1640, nv17_graph_mthd_lma_window },
1057 { 0x1644, nv17_graph_mthd_lma_window },
1058 { 0x1658, nv17_graph_mthd_lma_enable },
1059 {} 1062 {}
1060}; 1063};
1061 1064
1062struct nouveau_pgraph_object_class nv10_graph_grclass[] = { 1065struct nouveau_bitfield nv10_graph_nstatus[] = {
1063 { 0x0030, false, NULL }, /* null */ 1066 { NV10_PGRAPH_NSTATUS_STATE_IN_USE, "STATE_IN_USE" },
1064 { 0x0039, false, NULL }, /* m2mf */ 1067 { NV10_PGRAPH_NSTATUS_INVALID_STATE, "INVALID_STATE" },
1065 { 0x004a, false, NULL }, /* gdirect */ 1068 { NV10_PGRAPH_NSTATUS_BAD_ARGUMENT, "BAD_ARGUMENT" },
1066 { 0x005f, false, NULL }, /* imageblit */ 1069 { NV10_PGRAPH_NSTATUS_PROTECTION_FAULT, "PROTECTION_FAULT" },
1067 { 0x009f, false, NULL }, /* imageblit (nv12) */
1068 { 0x008a, false, NULL }, /* ifc */
1069 { 0x0089, false, NULL }, /* sifm */
1070 { 0x0062, false, NULL }, /* surf2d */
1071 { 0x0043, false, NULL }, /* rop */
1072 { 0x0012, false, NULL }, /* beta1 */
1073 { 0x0072, false, NULL }, /* beta4 */
1074 { 0x0019, false, NULL }, /* cliprect */
1075 { 0x0044, false, NULL }, /* pattern */
1076 { 0x0052, false, NULL }, /* swzsurf */
1077 { 0x0093, false, NULL }, /* surf3d */
1078 { 0x0094, false, NULL }, /* tex_tri */
1079 { 0x0095, false, NULL }, /* multitex_tri */
1080 { 0x0056, false, NULL }, /* celcius (nv10) */
1081 { 0x0096, false, NULL }, /* celcius (nv11) */
1082 { 0x0099, false, nv17_graph_celsius_mthds }, /* celcius (nv17) */
1083 {} 1070 {}
1084}; 1071};
1072
1073static void
1074nv10_graph_isr(struct drm_device *dev)
1075{
1076 u32 stat;
1077
1078 while ((stat = nv_rd32(dev, NV03_PGRAPH_INTR))) {
1079 u32 nsource = nv_rd32(dev, NV03_PGRAPH_NSOURCE);
1080 u32 nstatus = nv_rd32(dev, NV03_PGRAPH_NSTATUS);
1081 u32 addr = nv_rd32(dev, NV04_PGRAPH_TRAPPED_ADDR);
1082 u32 chid = (addr & 0x01f00000) >> 20;
1083 u32 subc = (addr & 0x00070000) >> 16;
1084 u32 mthd = (addr & 0x00001ffc);
1085 u32 data = nv_rd32(dev, NV04_PGRAPH_TRAPPED_DATA);
1086 u32 class = nv_rd32(dev, 0x400160 + subc * 4) & 0xfff;
1087 u32 show = stat;
1088
1089 if (stat & NV_PGRAPH_INTR_ERROR) {
1090 if (nsource & NV03_PGRAPH_NSOURCE_ILLEGAL_MTHD) {
1091 if (!nouveau_gpuobj_mthd_call2(dev, chid, class, mthd, data))
1092 show &= ~NV_PGRAPH_INTR_ERROR;
1093 }
1094 }
1095
1096 if (stat & NV_PGRAPH_INTR_CONTEXT_SWITCH) {
1097 nv_wr32(dev, NV03_PGRAPH_INTR, NV_PGRAPH_INTR_CONTEXT_SWITCH);
1098 stat &= ~NV_PGRAPH_INTR_CONTEXT_SWITCH;
1099 show &= ~NV_PGRAPH_INTR_CONTEXT_SWITCH;
1100 nv10_graph_context_switch(dev);
1101 }
1102
1103 nv_wr32(dev, NV03_PGRAPH_INTR, stat);
1104 nv_wr32(dev, NV04_PGRAPH_FIFO, 0x00000001);
1105
1106 if (show && nouveau_ratelimit()) {
1107 NV_INFO(dev, "PGRAPH -");
1108 nouveau_bitfield_print(nv10_graph_intr, show);
1109 printk(" nsource:");
1110 nouveau_bitfield_print(nv04_graph_nsource, nsource);
1111 printk(" nstatus:");
1112 nouveau_bitfield_print(nv10_graph_nstatus, nstatus);
1113 printk("\n");
1114 NV_INFO(dev, "PGRAPH - ch %d/%d class 0x%04x "
1115 "mthd 0x%04x data 0x%08x\n",
1116 chid, subc, class, mthd, data);
1117 }
1118 }
1119}
1120
1121static void
1122nv10_graph_destroy(struct drm_device *dev, int engine)
1123{
1124 struct nv10_graph_engine *pgraph = nv_engine(dev, engine);
1125
1126 nouveau_irq_unregister(dev, 12);
1127 kfree(pgraph);
1128}
1129
1130int
1131nv10_graph_create(struct drm_device *dev)
1132{
1133 struct drm_nouveau_private *dev_priv = dev->dev_private;
1134 struct nv10_graph_engine *pgraph;
1135
1136 pgraph = kzalloc(sizeof(*pgraph), GFP_KERNEL);
1137 if (!pgraph)
1138 return -ENOMEM;
1139
1140 pgraph->base.destroy = nv10_graph_destroy;
1141 pgraph->base.init = nv10_graph_init;
1142 pgraph->base.fini = nv10_graph_fini;
1143 pgraph->base.context_new = nv10_graph_context_new;
1144 pgraph->base.context_del = nv10_graph_context_del;
1145 pgraph->base.object_new = nv04_graph_object_new;
1146 pgraph->base.set_tile_region = nv10_graph_set_tile_region;
1147
1148 NVOBJ_ENGINE_ADD(dev, GR, &pgraph->base);
1149 nouveau_irq_register(dev, 12, nv10_graph_isr);
1150
1151 /* nvsw */
1152 NVOBJ_CLASS(dev, 0x506e, SW);
1153 NVOBJ_MTHD (dev, 0x506e, 0x0500, nv04_graph_mthd_page_flip);
1154
1155 NVOBJ_CLASS(dev, 0x0030, GR); /* null */
1156 NVOBJ_CLASS(dev, 0x0039, GR); /* m2mf */
1157 NVOBJ_CLASS(dev, 0x004a, GR); /* gdirect */
1158 NVOBJ_CLASS(dev, 0x005f, GR); /* imageblit */
1159 NVOBJ_CLASS(dev, 0x009f, GR); /* imageblit (nv12) */
1160 NVOBJ_CLASS(dev, 0x008a, GR); /* ifc */
1161 NVOBJ_CLASS(dev, 0x0089, GR); /* sifm */
1162 NVOBJ_CLASS(dev, 0x0062, GR); /* surf2d */
1163 NVOBJ_CLASS(dev, 0x0043, GR); /* rop */
1164 NVOBJ_CLASS(dev, 0x0012, GR); /* beta1 */
1165 NVOBJ_CLASS(dev, 0x0072, GR); /* beta4 */
1166 NVOBJ_CLASS(dev, 0x0019, GR); /* cliprect */
1167 NVOBJ_CLASS(dev, 0x0044, GR); /* pattern */
1168 NVOBJ_CLASS(dev, 0x0052, GR); /* swzsurf */
1169 NVOBJ_CLASS(dev, 0x0093, GR); /* surf3d */
1170 NVOBJ_CLASS(dev, 0x0094, GR); /* tex_tri */
1171 NVOBJ_CLASS(dev, 0x0095, GR); /* multitex_tri */
1172
1173 /* celcius */
1174 if (dev_priv->chipset <= 0x10) {
1175 NVOBJ_CLASS(dev, 0x0056, GR);
1176 } else
1177 if (dev_priv->chipset < 0x17 || dev_priv->chipset == 0x1a) {
1178 NVOBJ_CLASS(dev, 0x0096, GR);
1179 } else {
1180 NVOBJ_CLASS(dev, 0x0099, GR);
1181 NVOBJ_MTHD (dev, 0x0099, 0x1638, nv17_graph_mthd_lma_window);
1182 NVOBJ_MTHD (dev, 0x0099, 0x163c, nv17_graph_mthd_lma_window);
1183 NVOBJ_MTHD (dev, 0x0099, 0x1640, nv17_graph_mthd_lma_window);
1184 NVOBJ_MTHD (dev, 0x0099, 0x1644, nv17_graph_mthd_lma_window);
1185 NVOBJ_MTHD (dev, 0x0099, 0x1658, nv17_graph_mthd_lma_enable);
1186 }
1187
1188 return 0;
1189}
diff --git a/drivers/gpu/drm/nouveau/nv17_tv.c b/drivers/gpu/drm/nouveau/nv17_tv.c
index 13cdc05b7c2d..3900cebba560 100644
--- a/drivers/gpu/drm/nouveau/nv17_tv.c
+++ b/drivers/gpu/drm/nouveau/nv17_tv.c
@@ -193,55 +193,58 @@ nv17_tv_detect(struct drm_encoder *encoder, struct drm_connector *connector)
193 } 193 }
194} 194}
195 195
196static const struct { 196static int nv17_tv_get_ld_modes(struct drm_encoder *encoder,
197 int hdisplay; 197 struct drm_connector *connector)
198 int vdisplay;
199} modes[] = {
200 { 640, 400 },
201 { 640, 480 },
202 { 720, 480 },
203 { 720, 576 },
204 { 800, 600 },
205 { 1024, 768 },
206 { 1280, 720 },
207 { 1280, 1024 },
208 { 1920, 1080 }
209};
210
211static int nv17_tv_get_modes(struct drm_encoder *encoder,
212 struct drm_connector *connector)
213{ 198{
214 struct nv17_tv_norm_params *tv_norm = get_tv_norm(encoder); 199 struct nv17_tv_norm_params *tv_norm = get_tv_norm(encoder);
215 struct drm_display_mode *mode; 200 const struct drm_display_mode *tv_mode;
216 struct drm_display_mode *output_mode;
217 int n = 0; 201 int n = 0;
218 int i;
219 202
220 if (tv_norm->kind != CTV_ENC_MODE) { 203 for (tv_mode = nv17_tv_modes; tv_mode->hdisplay; tv_mode++) {
221 struct drm_display_mode *tv_mode; 204 struct drm_display_mode *mode;
222 205
223 for (tv_mode = nv17_tv_modes; tv_mode->hdisplay; tv_mode++) { 206 mode = drm_mode_duplicate(encoder->dev, tv_mode);
224 mode = drm_mode_duplicate(encoder->dev, tv_mode);
225 207
226 mode->clock = tv_norm->tv_enc_mode.vrefresh * 208 mode->clock = tv_norm->tv_enc_mode.vrefresh *
227 mode->htotal / 1000 * 209 mode->htotal / 1000 *
228 mode->vtotal / 1000; 210 mode->vtotal / 1000;
229 211
230 if (mode->flags & DRM_MODE_FLAG_DBLSCAN) 212 if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
231 mode->clock *= 2; 213 mode->clock *= 2;
232 214
233 if (mode->hdisplay == tv_norm->tv_enc_mode.hdisplay && 215 if (mode->hdisplay == tv_norm->tv_enc_mode.hdisplay &&
234 mode->vdisplay == tv_norm->tv_enc_mode.vdisplay) 216 mode->vdisplay == tv_norm->tv_enc_mode.vdisplay)
235 mode->type |= DRM_MODE_TYPE_PREFERRED; 217 mode->type |= DRM_MODE_TYPE_PREFERRED;
236 218
237 drm_mode_probed_add(connector, mode); 219 drm_mode_probed_add(connector, mode);
238 n++; 220 n++;
239 }
240 return n;
241 } 221 }
242 222
243 /* tv_norm->kind == CTV_ENC_MODE */ 223 return n;
244 output_mode = &tv_norm->ctv_enc_mode.mode; 224}
225
226static int nv17_tv_get_hd_modes(struct drm_encoder *encoder,
227 struct drm_connector *connector)
228{
229 struct nv17_tv_norm_params *tv_norm = get_tv_norm(encoder);
230 struct drm_display_mode *output_mode = &tv_norm->ctv_enc_mode.mode;
231 struct drm_display_mode *mode;
232 const struct {
233 int hdisplay;
234 int vdisplay;
235 } modes[] = {
236 { 640, 400 },
237 { 640, 480 },
238 { 720, 480 },
239 { 720, 576 },
240 { 800, 600 },
241 { 1024, 768 },
242 { 1280, 720 },
243 { 1280, 1024 },
244 { 1920, 1080 }
245 };
246 int i, n = 0;
247
245 for (i = 0; i < ARRAY_SIZE(modes); i++) { 248 for (i = 0; i < ARRAY_SIZE(modes); i++) {
246 if (modes[i].hdisplay > output_mode->hdisplay || 249 if (modes[i].hdisplay > output_mode->hdisplay ||
247 modes[i].vdisplay > output_mode->vdisplay) 250 modes[i].vdisplay > output_mode->vdisplay)
@@ -251,11 +254,12 @@ static int nv17_tv_get_modes(struct drm_encoder *encoder,
251 modes[i].vdisplay == output_mode->vdisplay) { 254 modes[i].vdisplay == output_mode->vdisplay) {
252 mode = drm_mode_duplicate(encoder->dev, output_mode); 255 mode = drm_mode_duplicate(encoder->dev, output_mode);
253 mode->type |= DRM_MODE_TYPE_PREFERRED; 256 mode->type |= DRM_MODE_TYPE_PREFERRED;
257
254 } else { 258 } else {
255 mode = drm_cvt_mode(encoder->dev, modes[i].hdisplay, 259 mode = drm_cvt_mode(encoder->dev, modes[i].hdisplay,
256 modes[i].vdisplay, 60, false, 260 modes[i].vdisplay, 60, false,
257 output_mode->flags & DRM_MODE_FLAG_INTERLACE, 261 (output_mode->flags &
258 false); 262 DRM_MODE_FLAG_INTERLACE), false);
259 } 263 }
260 264
261 /* CVT modes are sometimes unsuitable... */ 265 /* CVT modes are sometimes unsuitable... */
@@ -266,6 +270,7 @@ static int nv17_tv_get_modes(struct drm_encoder *encoder,
266 - mode->hdisplay) * 9 / 10) & ~7; 270 - mode->hdisplay) * 9 / 10) & ~7;
267 mode->hsync_end = mode->hsync_start + 8; 271 mode->hsync_end = mode->hsync_start + 8;
268 } 272 }
273
269 if (output_mode->vdisplay >= 1024) { 274 if (output_mode->vdisplay >= 1024) {
270 mode->vtotal = output_mode->vtotal; 275 mode->vtotal = output_mode->vtotal;
271 mode->vsync_start = output_mode->vsync_start; 276 mode->vsync_start = output_mode->vsync_start;
@@ -276,9 +281,21 @@ static int nv17_tv_get_modes(struct drm_encoder *encoder,
276 drm_mode_probed_add(connector, mode); 281 drm_mode_probed_add(connector, mode);
277 n++; 282 n++;
278 } 283 }
284
279 return n; 285 return n;
280} 286}
281 287
288static int nv17_tv_get_modes(struct drm_encoder *encoder,
289 struct drm_connector *connector)
290{
291 struct nv17_tv_norm_params *tv_norm = get_tv_norm(encoder);
292
293 if (tv_norm->kind == CTV_ENC_MODE)
294 return nv17_tv_get_hd_modes(encoder, connector);
295 else
296 return nv17_tv_get_ld_modes(encoder, connector);
297}
298
282static int nv17_tv_mode_valid(struct drm_encoder *encoder, 299static int nv17_tv_mode_valid(struct drm_encoder *encoder,
283 struct drm_display_mode *mode) 300 struct drm_display_mode *mode)
284{ 301{
@@ -408,15 +425,8 @@ static void nv17_tv_prepare(struct drm_encoder *encoder)
408 425
409 } 426 }
410 427
411 /* Some NV4x have unknown values (0x3f, 0x50, 0x54, 0x6b, 0x79, 0x7f) 428 if (tv_norm->kind == CTV_ENC_MODE)
412 * at LCD__INDEX which we don't alter 429 *cr_lcd |= 0x1 | (head ? 0x0 : 0x8);
413 */
414 if (!(*cr_lcd & 0x44)) {
415 if (tv_norm->kind == CTV_ENC_MODE)
416 *cr_lcd = 0x1 | (head ? 0x0 : 0x8);
417 else
418 *cr_lcd = 0;
419 }
420 430
421 /* Set the DACCLK register */ 431 /* Set the DACCLK register */
422 dacclk = (NVReadRAMDAC(dev, 0, dacclk_off) & ~0x30) | 0x1; 432 dacclk = (NVReadRAMDAC(dev, 0, dacclk_off) & ~0x30) | 0x1;
diff --git a/drivers/gpu/drm/nouveau/nv17_tv.h b/drivers/gpu/drm/nouveau/nv17_tv.h
index c00977cedabd..622e72221682 100644
--- a/drivers/gpu/drm/nouveau/nv17_tv.h
+++ b/drivers/gpu/drm/nouveau/nv17_tv.h
@@ -112,7 +112,7 @@ extern struct nv17_tv_norm_params {
112} nv17_tv_norms[NUM_TV_NORMS]; 112} nv17_tv_norms[NUM_TV_NORMS];
113#define get_tv_norm(enc) (&nv17_tv_norms[to_tv_enc(enc)->tv_norm]) 113#define get_tv_norm(enc) (&nv17_tv_norms[to_tv_enc(enc)->tv_norm])
114 114
115extern struct drm_display_mode nv17_tv_modes[]; 115extern const struct drm_display_mode nv17_tv_modes[];
116 116
117static inline int interpolate(int y0, int y1, int y2, int x) 117static inline int interpolate(int y0, int y1, int y2, int x)
118{ 118{
@@ -127,7 +127,8 @@ void nv17_ctv_update_rescaler(struct drm_encoder *encoder);
127 127
128/* TV hardware access functions */ 128/* TV hardware access functions */
129 129
130static inline void nv_write_ptv(struct drm_device *dev, uint32_t reg, uint32_t val) 130static inline void nv_write_ptv(struct drm_device *dev, uint32_t reg,
131 uint32_t val)
131{ 132{
132 nv_wr32(dev, reg, val); 133 nv_wr32(dev, reg, val);
133} 134}
@@ -137,7 +138,8 @@ static inline uint32_t nv_read_ptv(struct drm_device *dev, uint32_t reg)
137 return nv_rd32(dev, reg); 138 return nv_rd32(dev, reg);
138} 139}
139 140
140static inline void nv_write_tv_enc(struct drm_device *dev, uint8_t reg, uint8_t val) 141static inline void nv_write_tv_enc(struct drm_device *dev, uint8_t reg,
142 uint8_t val)
141{ 143{
142 nv_write_ptv(dev, NV_PTV_TV_INDEX, reg); 144 nv_write_ptv(dev, NV_PTV_TV_INDEX, reg);
143 nv_write_ptv(dev, NV_PTV_TV_DATA, val); 145 nv_write_ptv(dev, NV_PTV_TV_DATA, val);
@@ -149,8 +151,11 @@ static inline uint8_t nv_read_tv_enc(struct drm_device *dev, uint8_t reg)
149 return nv_read_ptv(dev, NV_PTV_TV_DATA); 151 return nv_read_ptv(dev, NV_PTV_TV_DATA);
150} 152}
151 153
152#define nv_load_ptv(dev, state, reg) nv_write_ptv(dev, NV_PTV_OFFSET + 0x##reg, state->ptv_##reg) 154#define nv_load_ptv(dev, state, reg) \
153#define nv_save_ptv(dev, state, reg) state->ptv_##reg = nv_read_ptv(dev, NV_PTV_OFFSET + 0x##reg) 155 nv_write_ptv(dev, NV_PTV_OFFSET + 0x##reg, state->ptv_##reg)
154#define nv_load_tv_enc(dev, state, reg) nv_write_tv_enc(dev, 0x##reg, state->tv_enc[0x##reg]) 156#define nv_save_ptv(dev, state, reg) \
157 state->ptv_##reg = nv_read_ptv(dev, NV_PTV_OFFSET + 0x##reg)
158#define nv_load_tv_enc(dev, state, reg) \
159 nv_write_tv_enc(dev, 0x##reg, state->tv_enc[0x##reg])
155 160
156#endif 161#endif
diff --git a/drivers/gpu/drm/nouveau/nv17_tv_modes.c b/drivers/gpu/drm/nouveau/nv17_tv_modes.c
index d64683d97e0d..4d1d29f60307 100644
--- a/drivers/gpu/drm/nouveau/nv17_tv_modes.c
+++ b/drivers/gpu/drm/nouveau/nv17_tv_modes.c
@@ -336,12 +336,17 @@ static void tv_setup_filter(struct drm_encoder *encoder)
336 struct filter_params *p = &fparams[k][j]; 336 struct filter_params *p = &fparams[k][j];
337 337
338 for (i = 0; i < 7; i++) { 338 for (i = 0; i < 7; i++) {
339 int64_t c = (p->k1 + p->ki*i + p->ki2*i*i + p->ki3*i*i*i) 339 int64_t c = (p->k1 + p->ki*i + p->ki2*i*i +
340 + (p->kr + p->kir*i + p->ki2r*i*i + p->ki3r*i*i*i)*rs[k] 340 p->ki3*i*i*i)
341 + (p->kf + p->kif*i + p->ki2f*i*i + p->ki3f*i*i*i)*flicker 341 + (p->kr + p->kir*i + p->ki2r*i*i +
342 + (p->krf + p->kirf*i + p->ki2rf*i*i + p->ki3rf*i*i*i)*flicker*rs[k]; 342 p->ki3r*i*i*i) * rs[k]
343 343 + (p->kf + p->kif*i + p->ki2f*i*i +
344 (*filters[k])[j][i] = (c + id5/2) >> 39 & (0x1 << 31 | 0x7f << 9); 344 p->ki3f*i*i*i) * flicker
345 + (p->krf + p->kirf*i + p->ki2rf*i*i +
346 p->ki3rf*i*i*i) * flicker * rs[k];
347
348 (*filters[k])[j][i] = (c + id5/2) >> 39
349 & (0x1 << 31 | 0x7f << 9);
345 } 350 }
346 } 351 }
347 } 352 }
@@ -349,7 +354,8 @@ static void tv_setup_filter(struct drm_encoder *encoder)
349 354
350/* Hardware state saving/restoring */ 355/* Hardware state saving/restoring */
351 356
352static void tv_save_filter(struct drm_device *dev, uint32_t base, uint32_t regs[4][7]) 357static void tv_save_filter(struct drm_device *dev, uint32_t base,
358 uint32_t regs[4][7])
353{ 359{
354 int i, j; 360 int i, j;
355 uint32_t offsets[] = { base, base + 0x1c, base + 0x40, base + 0x5c }; 361 uint32_t offsets[] = { base, base + 0x1c, base + 0x40, base + 0x5c };
@@ -360,7 +366,8 @@ static void tv_save_filter(struct drm_device *dev, uint32_t base, uint32_t regs[
360 } 366 }
361} 367}
362 368
363static void tv_load_filter(struct drm_device *dev, uint32_t base, uint32_t regs[4][7]) 369static void tv_load_filter(struct drm_device *dev, uint32_t base,
370 uint32_t regs[4][7])
364{ 371{
365 int i, j; 372 int i, j;
366 uint32_t offsets[] = { base, base + 0x1c, base + 0x40, base + 0x5c }; 373 uint32_t offsets[] = { base, base + 0x1c, base + 0x40, base + 0x5c };
@@ -431,7 +438,7 @@ void nv17_tv_state_load(struct drm_device *dev, struct nv17_tv_state *state)
431 438
432/* Timings similar to the ones the blob sets */ 439/* Timings similar to the ones the blob sets */
433 440
434struct drm_display_mode nv17_tv_modes[] = { 441const struct drm_display_mode nv17_tv_modes[] = {
435 { DRM_MODE("320x200", DRM_MODE_TYPE_DRIVER, 0, 442 { DRM_MODE("320x200", DRM_MODE_TYPE_DRIVER, 0,
436 320, 344, 392, 560, 0, 200, 200, 202, 220, 0, 443 320, 344, 392, 560, 0, 200, 200, 202, 220, 0,
437 DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC 444 DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC
@@ -504,10 +511,10 @@ void nv17_tv_update_properties(struct drm_encoder *encoder)
504 break; 511 break;
505 } 512 }
506 513
507 regs->tv_enc[0x20] = interpolate(0, tv_norm->tv_enc_mode.tv_enc[0x20], 255, 514 regs->tv_enc[0x20] = interpolate(0, tv_norm->tv_enc_mode.tv_enc[0x20],
508 tv_enc->saturation); 515 255, tv_enc->saturation);
509 regs->tv_enc[0x22] = interpolate(0, tv_norm->tv_enc_mode.tv_enc[0x22], 255, 516 regs->tv_enc[0x22] = interpolate(0, tv_norm->tv_enc_mode.tv_enc[0x22],
510 tv_enc->saturation); 517 255, tv_enc->saturation);
511 regs->tv_enc[0x25] = tv_enc->hue * 255 / 100; 518 regs->tv_enc[0x25] = tv_enc->hue * 255 / 100;
512 519
513 nv_load_ptv(dev, regs, 204); 520 nv_load_ptv(dev, regs, 204);
@@ -541,7 +548,8 @@ void nv17_ctv_update_rescaler(struct drm_encoder *encoder)
541 int head = nouveau_crtc(encoder->crtc)->index; 548 int head = nouveau_crtc(encoder->crtc)->index;
542 struct nv04_crtc_reg *regs = &dev_priv->mode_reg.crtc_reg[head]; 549 struct nv04_crtc_reg *regs = &dev_priv->mode_reg.crtc_reg[head];
543 struct drm_display_mode *crtc_mode = &encoder->crtc->mode; 550 struct drm_display_mode *crtc_mode = &encoder->crtc->mode;
544 struct drm_display_mode *output_mode = &get_tv_norm(encoder)->ctv_enc_mode.mode; 551 struct drm_display_mode *output_mode =
552 &get_tv_norm(encoder)->ctv_enc_mode.mode;
545 int overscan, hmargin, vmargin, hratio, vratio; 553 int overscan, hmargin, vmargin, hratio, vratio;
546 554
547 /* The rescaler doesn't do the right thing for interlaced modes. */ 555 /* The rescaler doesn't do the right thing for interlaced modes. */
@@ -553,13 +561,15 @@ void nv17_ctv_update_rescaler(struct drm_encoder *encoder)
553 hmargin = (output_mode->hdisplay - crtc_mode->hdisplay) / 2; 561 hmargin = (output_mode->hdisplay - crtc_mode->hdisplay) / 2;
554 vmargin = (output_mode->vdisplay - crtc_mode->vdisplay) / 2; 562 vmargin = (output_mode->vdisplay - crtc_mode->vdisplay) / 2;
555 563
556 hmargin = interpolate(0, min(hmargin, output_mode->hdisplay/20), hmargin, 564 hmargin = interpolate(0, min(hmargin, output_mode->hdisplay/20),
557 overscan); 565 hmargin, overscan);
558 vmargin = interpolate(0, min(vmargin, output_mode->vdisplay/20), vmargin, 566 vmargin = interpolate(0, min(vmargin, output_mode->vdisplay/20),
559 overscan); 567 vmargin, overscan);
560 568
561 hratio = crtc_mode->hdisplay * 0x800 / (output_mode->hdisplay - 2*hmargin); 569 hratio = crtc_mode->hdisplay * 0x800 /
562 vratio = crtc_mode->vdisplay * 0x800 / (output_mode->vdisplay - 2*vmargin) & ~3; 570 (output_mode->hdisplay - 2*hmargin);
571 vratio = crtc_mode->vdisplay * 0x800 /
572 (output_mode->vdisplay - 2*vmargin) & ~3;
563 573
564 regs->fp_horiz_regs[FP_VALID_START] = hmargin; 574 regs->fp_horiz_regs[FP_VALID_START] = hmargin;
565 regs->fp_horiz_regs[FP_VALID_END] = output_mode->hdisplay - hmargin - 1; 575 regs->fp_horiz_regs[FP_VALID_END] = output_mode->hdisplay - hmargin - 1;
diff --git a/drivers/gpu/drm/nouveau/nv20_graph.c b/drivers/gpu/drm/nouveau/nv20_graph.c
index 17f309b36c91..affc7d7dd029 100644
--- a/drivers/gpu/drm/nouveau/nv20_graph.c
+++ b/drivers/gpu/drm/nouveau/nv20_graph.c
@@ -24,6 +24,14 @@
24 * 24 *
25 */ 25 */
26 26
27struct nv20_graph_engine {
28 struct nouveau_exec_engine base;
29 struct nouveau_gpuobj *ctxtab;
30 void (*grctx_init)(struct nouveau_gpuobj *);
31 u32 grctx_size;
32 u32 grctx_user;
33};
34
27#define NV20_GRCTX_SIZE (3580*4) 35#define NV20_GRCTX_SIZE (3580*4)
28#define NV25_GRCTX_SIZE (3529*4) 36#define NV25_GRCTX_SIZE (3529*4)
29#define NV2A_GRCTX_SIZE (3500*4) 37#define NV2A_GRCTX_SIZE (3500*4)
@@ -32,535 +40,474 @@
32#define NV34_GRCTX_SIZE (18140) 40#define NV34_GRCTX_SIZE (18140)
33#define NV35_36_GRCTX_SIZE (22396) 41#define NV35_36_GRCTX_SIZE (22396)
34 42
43int
44nv20_graph_unload_context(struct drm_device *dev)
45{
46 struct drm_nouveau_private *dev_priv = dev->dev_private;
47 struct nouveau_fifo_engine *pfifo = &dev_priv->engine.fifo;
48 struct nouveau_channel *chan;
49 struct nouveau_gpuobj *grctx;
50 u32 tmp;
51
52 chan = nv10_graph_channel(dev);
53 if (!chan)
54 return 0;
55 grctx = chan->engctx[NVOBJ_ENGINE_GR];
56
57 nv_wr32(dev, NV20_PGRAPH_CHANNEL_CTX_POINTER, grctx->pinst >> 4);
58 nv_wr32(dev, NV20_PGRAPH_CHANNEL_CTX_XFER,
59 NV20_PGRAPH_CHANNEL_CTX_XFER_SAVE);
60
61 nouveau_wait_for_idle(dev);
62
63 nv_wr32(dev, NV10_PGRAPH_CTX_CONTROL, 0x10000000);
64 tmp = nv_rd32(dev, NV10_PGRAPH_CTX_USER) & 0x00ffffff;
65 tmp |= (pfifo->channels - 1) << 24;
66 nv_wr32(dev, NV10_PGRAPH_CTX_USER, tmp);
67 return 0;
68}
69
70static void
71nv20_graph_rdi(struct drm_device *dev)
72{
73 struct drm_nouveau_private *dev_priv = dev->dev_private;
74 int i, writecount = 32;
75 uint32_t rdi_index = 0x2c80000;
76
77 if (dev_priv->chipset == 0x20) {
78 rdi_index = 0x3d0000;
79 writecount = 15;
80 }
81
82 nv_wr32(dev, NV10_PGRAPH_RDI_INDEX, rdi_index);
83 for (i = 0; i < writecount; i++)
84 nv_wr32(dev, NV10_PGRAPH_RDI_DATA, 0);
85
86 nouveau_wait_for_idle(dev);
87}
88
35static void 89static void
36nv20_graph_context_init(struct drm_device *dev, struct nouveau_gpuobj *ctx) 90nv20_graph_context_init(struct nouveau_gpuobj *ctx)
37{ 91{
38 int i; 92 int i;
39 93
40 nv_wo32(dev, ctx, 0x033c/4, 0xffff0000); 94 nv_wo32(ctx, 0x033c, 0xffff0000);
41 nv_wo32(dev, ctx, 0x03a0/4, 0x0fff0000); 95 nv_wo32(ctx, 0x03a0, 0x0fff0000);
42 nv_wo32(dev, ctx, 0x03a4/4, 0x0fff0000); 96 nv_wo32(ctx, 0x03a4, 0x0fff0000);
43 nv_wo32(dev, ctx, 0x047c/4, 0x00000101); 97 nv_wo32(ctx, 0x047c, 0x00000101);
44 nv_wo32(dev, ctx, 0x0490/4, 0x00000111); 98 nv_wo32(ctx, 0x0490, 0x00000111);
45 nv_wo32(dev, ctx, 0x04a8/4, 0x44400000); 99 nv_wo32(ctx, 0x04a8, 0x44400000);
46 for (i = 0x04d4; i <= 0x04e0; i += 4) 100 for (i = 0x04d4; i <= 0x04e0; i += 4)
47 nv_wo32(dev, ctx, i/4, 0x00030303); 101 nv_wo32(ctx, i, 0x00030303);
48 for (i = 0x04f4; i <= 0x0500; i += 4) 102 for (i = 0x04f4; i <= 0x0500; i += 4)
49 nv_wo32(dev, ctx, i/4, 0x00080000); 103 nv_wo32(ctx, i, 0x00080000);
50 for (i = 0x050c; i <= 0x0518; i += 4) 104 for (i = 0x050c; i <= 0x0518; i += 4)
51 nv_wo32(dev, ctx, i/4, 0x01012000); 105 nv_wo32(ctx, i, 0x01012000);
52 for (i = 0x051c; i <= 0x0528; i += 4) 106 for (i = 0x051c; i <= 0x0528; i += 4)
53 nv_wo32(dev, ctx, i/4, 0x000105b8); 107 nv_wo32(ctx, i, 0x000105b8);
54 for (i = 0x052c; i <= 0x0538; i += 4) 108 for (i = 0x052c; i <= 0x0538; i += 4)
55 nv_wo32(dev, ctx, i/4, 0x00080008); 109 nv_wo32(ctx, i, 0x00080008);
56 for (i = 0x055c; i <= 0x0598; i += 4) 110 for (i = 0x055c; i <= 0x0598; i += 4)
57 nv_wo32(dev, ctx, i/4, 0x07ff0000); 111 nv_wo32(ctx, i, 0x07ff0000);
58 nv_wo32(dev, ctx, 0x05a4/4, 0x4b7fffff); 112 nv_wo32(ctx, 0x05a4, 0x4b7fffff);
59 nv_wo32(dev, ctx, 0x05fc/4, 0x00000001); 113 nv_wo32(ctx, 0x05fc, 0x00000001);
60 nv_wo32(dev, ctx, 0x0604/4, 0x00004000); 114 nv_wo32(ctx, 0x0604, 0x00004000);
61 nv_wo32(dev, ctx, 0x0610/4, 0x00000001); 115 nv_wo32(ctx, 0x0610, 0x00000001);
62 nv_wo32(dev, ctx, 0x0618/4, 0x00040000); 116 nv_wo32(ctx, 0x0618, 0x00040000);
63 nv_wo32(dev, ctx, 0x061c/4, 0x00010000); 117 nv_wo32(ctx, 0x061c, 0x00010000);
64 for (i = 0x1c1c; i <= 0x248c; i += 16) { 118 for (i = 0x1c1c; i <= 0x248c; i += 16) {
65 nv_wo32(dev, ctx, (i + 0)/4, 0x10700ff9); 119 nv_wo32(ctx, (i + 0), 0x10700ff9);
66 nv_wo32(dev, ctx, (i + 4)/4, 0x0436086c); 120 nv_wo32(ctx, (i + 4), 0x0436086c);
67 nv_wo32(dev, ctx, (i + 8)/4, 0x000c001b); 121 nv_wo32(ctx, (i + 8), 0x000c001b);
68 } 122 }
69 nv_wo32(dev, ctx, 0x281c/4, 0x3f800000); 123 nv_wo32(ctx, 0x281c, 0x3f800000);
70 nv_wo32(dev, ctx, 0x2830/4, 0x3f800000); 124 nv_wo32(ctx, 0x2830, 0x3f800000);
71 nv_wo32(dev, ctx, 0x285c/4, 0x40000000); 125 nv_wo32(ctx, 0x285c, 0x40000000);
72 nv_wo32(dev, ctx, 0x2860/4, 0x3f800000); 126 nv_wo32(ctx, 0x2860, 0x3f800000);
73 nv_wo32(dev, ctx, 0x2864/4, 0x3f000000); 127 nv_wo32(ctx, 0x2864, 0x3f000000);
74 nv_wo32(dev, ctx, 0x286c/4, 0x40000000); 128 nv_wo32(ctx, 0x286c, 0x40000000);
75 nv_wo32(dev, ctx, 0x2870/4, 0x3f800000); 129 nv_wo32(ctx, 0x2870, 0x3f800000);
76 nv_wo32(dev, ctx, 0x2878/4, 0xbf800000); 130 nv_wo32(ctx, 0x2878, 0xbf800000);
77 nv_wo32(dev, ctx, 0x2880/4, 0xbf800000); 131 nv_wo32(ctx, 0x2880, 0xbf800000);
78 nv_wo32(dev, ctx, 0x34a4/4, 0x000fe000); 132 nv_wo32(ctx, 0x34a4, 0x000fe000);
79 nv_wo32(dev, ctx, 0x3530/4, 0x000003f8); 133 nv_wo32(ctx, 0x3530, 0x000003f8);
80 nv_wo32(dev, ctx, 0x3540/4, 0x002fe000); 134 nv_wo32(ctx, 0x3540, 0x002fe000);
81 for (i = 0x355c; i <= 0x3578; i += 4) 135 for (i = 0x355c; i <= 0x3578; i += 4)
82 nv_wo32(dev, ctx, i/4, 0x001c527c); 136 nv_wo32(ctx, i, 0x001c527c);
83} 137}
84 138
85static void 139static void
86nv25_graph_context_init(struct drm_device *dev, struct nouveau_gpuobj *ctx) 140nv25_graph_context_init(struct nouveau_gpuobj *ctx)
87{ 141{
88 int i; 142 int i;
89 143
90 nv_wo32(dev, ctx, 0x035c/4, 0xffff0000); 144 nv_wo32(ctx, 0x035c, 0xffff0000);
91 nv_wo32(dev, ctx, 0x03c0/4, 0x0fff0000); 145 nv_wo32(ctx, 0x03c0, 0x0fff0000);
92 nv_wo32(dev, ctx, 0x03c4/4, 0x0fff0000); 146 nv_wo32(ctx, 0x03c4, 0x0fff0000);
93 nv_wo32(dev, ctx, 0x049c/4, 0x00000101); 147 nv_wo32(ctx, 0x049c, 0x00000101);
94 nv_wo32(dev, ctx, 0x04b0/4, 0x00000111); 148 nv_wo32(ctx, 0x04b0, 0x00000111);
95 nv_wo32(dev, ctx, 0x04c8/4, 0x00000080); 149 nv_wo32(ctx, 0x04c8, 0x00000080);
96 nv_wo32(dev, ctx, 0x04cc/4, 0xffff0000); 150 nv_wo32(ctx, 0x04cc, 0xffff0000);
97 nv_wo32(dev, ctx, 0x04d0/4, 0x00000001); 151 nv_wo32(ctx, 0x04d0, 0x00000001);
98 nv_wo32(dev, ctx, 0x04e4/4, 0x44400000); 152 nv_wo32(ctx, 0x04e4, 0x44400000);
99 nv_wo32(dev, ctx, 0x04fc/4, 0x4b800000); 153 nv_wo32(ctx, 0x04fc, 0x4b800000);
100 for (i = 0x0510; i <= 0x051c; i += 4) 154 for (i = 0x0510; i <= 0x051c; i += 4)
101 nv_wo32(dev, ctx, i/4, 0x00030303); 155 nv_wo32(ctx, i, 0x00030303);
102 for (i = 0x0530; i <= 0x053c; i += 4) 156 for (i = 0x0530; i <= 0x053c; i += 4)
103 nv_wo32(dev, ctx, i/4, 0x00080000); 157 nv_wo32(ctx, i, 0x00080000);
104 for (i = 0x0548; i <= 0x0554; i += 4) 158 for (i = 0x0548; i <= 0x0554; i += 4)
105 nv_wo32(dev, ctx, i/4, 0x01012000); 159 nv_wo32(ctx, i, 0x01012000);
106 for (i = 0x0558; i <= 0x0564; i += 4) 160 for (i = 0x0558; i <= 0x0564; i += 4)
107 nv_wo32(dev, ctx, i/4, 0x000105b8); 161 nv_wo32(ctx, i, 0x000105b8);
108 for (i = 0x0568; i <= 0x0574; i += 4) 162 for (i = 0x0568; i <= 0x0574; i += 4)
109 nv_wo32(dev, ctx, i/4, 0x00080008); 163 nv_wo32(ctx, i, 0x00080008);
110 for (i = 0x0598; i <= 0x05d4; i += 4) 164 for (i = 0x0598; i <= 0x05d4; i += 4)
111 nv_wo32(dev, ctx, i/4, 0x07ff0000); 165 nv_wo32(ctx, i, 0x07ff0000);
112 nv_wo32(dev, ctx, 0x05e0/4, 0x4b7fffff); 166 nv_wo32(ctx, 0x05e0, 0x4b7fffff);
113 nv_wo32(dev, ctx, 0x0620/4, 0x00000080); 167 nv_wo32(ctx, 0x0620, 0x00000080);
114 nv_wo32(dev, ctx, 0x0624/4, 0x30201000); 168 nv_wo32(ctx, 0x0624, 0x30201000);
115 nv_wo32(dev, ctx, 0x0628/4, 0x70605040); 169 nv_wo32(ctx, 0x0628, 0x70605040);
116 nv_wo32(dev, ctx, 0x062c/4, 0xb0a09080); 170 nv_wo32(ctx, 0x062c, 0xb0a09080);
117 nv_wo32(dev, ctx, 0x0630/4, 0xf0e0d0c0); 171 nv_wo32(ctx, 0x0630, 0xf0e0d0c0);
118 nv_wo32(dev, ctx, 0x0664/4, 0x00000001); 172 nv_wo32(ctx, 0x0664, 0x00000001);
119 nv_wo32(dev, ctx, 0x066c/4, 0x00004000); 173 nv_wo32(ctx, 0x066c, 0x00004000);
120 nv_wo32(dev, ctx, 0x0678/4, 0x00000001); 174 nv_wo32(ctx, 0x0678, 0x00000001);
121 nv_wo32(dev, ctx, 0x0680/4, 0x00040000); 175 nv_wo32(ctx, 0x0680, 0x00040000);
122 nv_wo32(dev, ctx, 0x0684/4, 0x00010000); 176 nv_wo32(ctx, 0x0684, 0x00010000);
123 for (i = 0x1b04; i <= 0x2374; i += 16) { 177 for (i = 0x1b04; i <= 0x2374; i += 16) {
124 nv_wo32(dev, ctx, (i + 0)/4, 0x10700ff9); 178 nv_wo32(ctx, (i + 0), 0x10700ff9);
125 nv_wo32(dev, ctx, (i + 4)/4, 0x0436086c); 179 nv_wo32(ctx, (i + 4), 0x0436086c);
126 nv_wo32(dev, ctx, (i + 8)/4, 0x000c001b); 180 nv_wo32(ctx, (i + 8), 0x000c001b);
127 } 181 }
128 nv_wo32(dev, ctx, 0x2704/4, 0x3f800000); 182 nv_wo32(ctx, 0x2704, 0x3f800000);
129 nv_wo32(dev, ctx, 0x2718/4, 0x3f800000); 183 nv_wo32(ctx, 0x2718, 0x3f800000);
130 nv_wo32(dev, ctx, 0x2744/4, 0x40000000); 184 nv_wo32(ctx, 0x2744, 0x40000000);
131 nv_wo32(dev, ctx, 0x2748/4, 0x3f800000); 185 nv_wo32(ctx, 0x2748, 0x3f800000);
132 nv_wo32(dev, ctx, 0x274c/4, 0x3f000000); 186 nv_wo32(ctx, 0x274c, 0x3f000000);
133 nv_wo32(dev, ctx, 0x2754/4, 0x40000000); 187 nv_wo32(ctx, 0x2754, 0x40000000);
134 nv_wo32(dev, ctx, 0x2758/4, 0x3f800000); 188 nv_wo32(ctx, 0x2758, 0x3f800000);
135 nv_wo32(dev, ctx, 0x2760/4, 0xbf800000); 189 nv_wo32(ctx, 0x2760, 0xbf800000);
136 nv_wo32(dev, ctx, 0x2768/4, 0xbf800000); 190 nv_wo32(ctx, 0x2768, 0xbf800000);
137 nv_wo32(dev, ctx, 0x308c/4, 0x000fe000); 191 nv_wo32(ctx, 0x308c, 0x000fe000);
138 nv_wo32(dev, ctx, 0x3108/4, 0x000003f8); 192 nv_wo32(ctx, 0x3108, 0x000003f8);
139 nv_wo32(dev, ctx, 0x3468/4, 0x002fe000); 193 nv_wo32(ctx, 0x3468, 0x002fe000);
140 for (i = 0x3484; i <= 0x34a0; i += 4) 194 for (i = 0x3484; i <= 0x34a0; i += 4)
141 nv_wo32(dev, ctx, i/4, 0x001c527c); 195 nv_wo32(ctx, i, 0x001c527c);
142} 196}
143 197
144static void 198static void
145nv2a_graph_context_init(struct drm_device *dev, struct nouveau_gpuobj *ctx) 199nv2a_graph_context_init(struct nouveau_gpuobj *ctx)
146{ 200{
147 int i; 201 int i;
148 202
149 nv_wo32(dev, ctx, 0x033c/4, 0xffff0000); 203 nv_wo32(ctx, 0x033c, 0xffff0000);
150 nv_wo32(dev, ctx, 0x03a0/4, 0x0fff0000); 204 nv_wo32(ctx, 0x03a0, 0x0fff0000);
151 nv_wo32(dev, ctx, 0x03a4/4, 0x0fff0000); 205 nv_wo32(ctx, 0x03a4, 0x0fff0000);
152 nv_wo32(dev, ctx, 0x047c/4, 0x00000101); 206 nv_wo32(ctx, 0x047c, 0x00000101);
153 nv_wo32(dev, ctx, 0x0490/4, 0x00000111); 207 nv_wo32(ctx, 0x0490, 0x00000111);
154 nv_wo32(dev, ctx, 0x04a8/4, 0x44400000); 208 nv_wo32(ctx, 0x04a8, 0x44400000);
155 for (i = 0x04d4; i <= 0x04e0; i += 4) 209 for (i = 0x04d4; i <= 0x04e0; i += 4)
156 nv_wo32(dev, ctx, i/4, 0x00030303); 210 nv_wo32(ctx, i, 0x00030303);
157 for (i = 0x04f4; i <= 0x0500; i += 4) 211 for (i = 0x04f4; i <= 0x0500; i += 4)
158 nv_wo32(dev, ctx, i/4, 0x00080000); 212 nv_wo32(ctx, i, 0x00080000);
159 for (i = 0x050c; i <= 0x0518; i += 4) 213 for (i = 0x050c; i <= 0x0518; i += 4)
160 nv_wo32(dev, ctx, i/4, 0x01012000); 214 nv_wo32(ctx, i, 0x01012000);
161 for (i = 0x051c; i <= 0x0528; i += 4) 215 for (i = 0x051c; i <= 0x0528; i += 4)
162 nv_wo32(dev, ctx, i/4, 0x000105b8); 216 nv_wo32(ctx, i, 0x000105b8);
163 for (i = 0x052c; i <= 0x0538; i += 4) 217 for (i = 0x052c; i <= 0x0538; i += 4)
164 nv_wo32(dev, ctx, i/4, 0x00080008); 218 nv_wo32(ctx, i, 0x00080008);
165 for (i = 0x055c; i <= 0x0598; i += 4) 219 for (i = 0x055c; i <= 0x0598; i += 4)
166 nv_wo32(dev, ctx, i/4, 0x07ff0000); 220 nv_wo32(ctx, i, 0x07ff0000);
167 nv_wo32(dev, ctx, 0x05a4/4, 0x4b7fffff); 221 nv_wo32(ctx, 0x05a4, 0x4b7fffff);
168 nv_wo32(dev, ctx, 0x05fc/4, 0x00000001); 222 nv_wo32(ctx, 0x05fc, 0x00000001);
169 nv_wo32(dev, ctx, 0x0604/4, 0x00004000); 223 nv_wo32(ctx, 0x0604, 0x00004000);
170 nv_wo32(dev, ctx, 0x0610/4, 0x00000001); 224 nv_wo32(ctx, 0x0610, 0x00000001);
171 nv_wo32(dev, ctx, 0x0618/4, 0x00040000); 225 nv_wo32(ctx, 0x0618, 0x00040000);
172 nv_wo32(dev, ctx, 0x061c/4, 0x00010000); 226 nv_wo32(ctx, 0x061c, 0x00010000);
173 for (i = 0x1a9c; i <= 0x22fc; i += 16) { /*XXX: check!! */ 227 for (i = 0x1a9c; i <= 0x22fc; i += 16) { /*XXX: check!! */
174 nv_wo32(dev, ctx, (i + 0)/4, 0x10700ff9); 228 nv_wo32(ctx, (i + 0), 0x10700ff9);
175 nv_wo32(dev, ctx, (i + 4)/4, 0x0436086c); 229 nv_wo32(ctx, (i + 4), 0x0436086c);
176 nv_wo32(dev, ctx, (i + 8)/4, 0x000c001b); 230 nv_wo32(ctx, (i + 8), 0x000c001b);
177 } 231 }
178 nv_wo32(dev, ctx, 0x269c/4, 0x3f800000); 232 nv_wo32(ctx, 0x269c, 0x3f800000);
179 nv_wo32(dev, ctx, 0x26b0/4, 0x3f800000); 233 nv_wo32(ctx, 0x26b0, 0x3f800000);
180 nv_wo32(dev, ctx, 0x26dc/4, 0x40000000); 234 nv_wo32(ctx, 0x26dc, 0x40000000);
181 nv_wo32(dev, ctx, 0x26e0/4, 0x3f800000); 235 nv_wo32(ctx, 0x26e0, 0x3f800000);
182 nv_wo32(dev, ctx, 0x26e4/4, 0x3f000000); 236 nv_wo32(ctx, 0x26e4, 0x3f000000);
183 nv_wo32(dev, ctx, 0x26ec/4, 0x40000000); 237 nv_wo32(ctx, 0x26ec, 0x40000000);
184 nv_wo32(dev, ctx, 0x26f0/4, 0x3f800000); 238 nv_wo32(ctx, 0x26f0, 0x3f800000);
185 nv_wo32(dev, ctx, 0x26f8/4, 0xbf800000); 239 nv_wo32(ctx, 0x26f8, 0xbf800000);
186 nv_wo32(dev, ctx, 0x2700/4, 0xbf800000); 240 nv_wo32(ctx, 0x2700, 0xbf800000);
187 nv_wo32(dev, ctx, 0x3024/4, 0x000fe000); 241 nv_wo32(ctx, 0x3024, 0x000fe000);
188 nv_wo32(dev, ctx, 0x30a0/4, 0x000003f8); 242 nv_wo32(ctx, 0x30a0, 0x000003f8);
189 nv_wo32(dev, ctx, 0x33fc/4, 0x002fe000); 243 nv_wo32(ctx, 0x33fc, 0x002fe000);
190 for (i = 0x341c; i <= 0x3438; i += 4) 244 for (i = 0x341c; i <= 0x3438; i += 4)
191 nv_wo32(dev, ctx, i/4, 0x001c527c); 245 nv_wo32(ctx, i, 0x001c527c);
192} 246}
193 247
194static void 248static void
195nv30_31_graph_context_init(struct drm_device *dev, struct nouveau_gpuobj *ctx) 249nv30_31_graph_context_init(struct nouveau_gpuobj *ctx)
196{ 250{
197 int i; 251 int i;
198 252
199 nv_wo32(dev, ctx, 0x0410/4, 0x00000101); 253 nv_wo32(ctx, 0x0410, 0x00000101);
200 nv_wo32(dev, ctx, 0x0424/4, 0x00000111); 254 nv_wo32(ctx, 0x0424, 0x00000111);
201 nv_wo32(dev, ctx, 0x0428/4, 0x00000060); 255 nv_wo32(ctx, 0x0428, 0x00000060);
202 nv_wo32(dev, ctx, 0x0444/4, 0x00000080); 256 nv_wo32(ctx, 0x0444, 0x00000080);
203 nv_wo32(dev, ctx, 0x0448/4, 0xffff0000); 257 nv_wo32(ctx, 0x0448, 0xffff0000);
204 nv_wo32(dev, ctx, 0x044c/4, 0x00000001); 258 nv_wo32(ctx, 0x044c, 0x00000001);
205 nv_wo32(dev, ctx, 0x0460/4, 0x44400000); 259 nv_wo32(ctx, 0x0460, 0x44400000);
206 nv_wo32(dev, ctx, 0x048c/4, 0xffff0000); 260 nv_wo32(ctx, 0x048c, 0xffff0000);
207 for (i = 0x04e0; i < 0x04e8; i += 4) 261 for (i = 0x04e0; i < 0x04e8; i += 4)
208 nv_wo32(dev, ctx, i/4, 0x0fff0000); 262 nv_wo32(ctx, i, 0x0fff0000);
209 nv_wo32(dev, ctx, 0x04ec/4, 0x00011100); 263 nv_wo32(ctx, 0x04ec, 0x00011100);
210 for (i = 0x0508; i < 0x0548; i += 4) 264 for (i = 0x0508; i < 0x0548; i += 4)
211 nv_wo32(dev, ctx, i/4, 0x07ff0000); 265 nv_wo32(ctx, i, 0x07ff0000);
212 nv_wo32(dev, ctx, 0x0550/4, 0x4b7fffff); 266 nv_wo32(ctx, 0x0550, 0x4b7fffff);
213 nv_wo32(dev, ctx, 0x058c/4, 0x00000080); 267 nv_wo32(ctx, 0x058c, 0x00000080);
214 nv_wo32(dev, ctx, 0x0590/4, 0x30201000); 268 nv_wo32(ctx, 0x0590, 0x30201000);
215 nv_wo32(dev, ctx, 0x0594/4, 0x70605040); 269 nv_wo32(ctx, 0x0594, 0x70605040);
216 nv_wo32(dev, ctx, 0x0598/4, 0xb8a89888); 270 nv_wo32(ctx, 0x0598, 0xb8a89888);
217 nv_wo32(dev, ctx, 0x059c/4, 0xf8e8d8c8); 271 nv_wo32(ctx, 0x059c, 0xf8e8d8c8);
218 nv_wo32(dev, ctx, 0x05b0/4, 0xb0000000); 272 nv_wo32(ctx, 0x05b0, 0xb0000000);
219 for (i = 0x0600; i < 0x0640; i += 4) 273 for (i = 0x0600; i < 0x0640; i += 4)
220 nv_wo32(dev, ctx, i/4, 0x00010588); 274 nv_wo32(ctx, i, 0x00010588);
221 for (i = 0x0640; i < 0x0680; i += 4) 275 for (i = 0x0640; i < 0x0680; i += 4)
222 nv_wo32(dev, ctx, i/4, 0x00030303); 276 nv_wo32(ctx, i, 0x00030303);
223 for (i = 0x06c0; i < 0x0700; i += 4) 277 for (i = 0x06c0; i < 0x0700; i += 4)
224 nv_wo32(dev, ctx, i/4, 0x0008aae4); 278 nv_wo32(ctx, i, 0x0008aae4);
225 for (i = 0x0700; i < 0x0740; i += 4) 279 for (i = 0x0700; i < 0x0740; i += 4)
226 nv_wo32(dev, ctx, i/4, 0x01012000); 280 nv_wo32(ctx, i, 0x01012000);
227 for (i = 0x0740; i < 0x0780; i += 4) 281 for (i = 0x0740; i < 0x0780; i += 4)
228 nv_wo32(dev, ctx, i/4, 0x00080008); 282 nv_wo32(ctx, i, 0x00080008);
229 nv_wo32(dev, ctx, 0x085c/4, 0x00040000); 283 nv_wo32(ctx, 0x085c, 0x00040000);
230 nv_wo32(dev, ctx, 0x0860/4, 0x00010000); 284 nv_wo32(ctx, 0x0860, 0x00010000);
231 for (i = 0x0864; i < 0x0874; i += 4) 285 for (i = 0x0864; i < 0x0874; i += 4)
232 nv_wo32(dev, ctx, i/4, 0x00040004); 286 nv_wo32(ctx, i, 0x00040004);
233 for (i = 0x1f18; i <= 0x3088 ; i += 16) { 287 for (i = 0x1f18; i <= 0x3088 ; i += 16) {
234 nv_wo32(dev, ctx, i/4 + 0, 0x10700ff9); 288 nv_wo32(ctx, i + 0, 0x10700ff9);
235 nv_wo32(dev, ctx, i/4 + 1, 0x0436086c); 289 nv_wo32(ctx, i + 1, 0x0436086c);
236 nv_wo32(dev, ctx, i/4 + 2, 0x000c001b); 290 nv_wo32(ctx, i + 2, 0x000c001b);
237 } 291 }
238 for (i = 0x30b8; i < 0x30c8; i += 4) 292 for (i = 0x30b8; i < 0x30c8; i += 4)
239 nv_wo32(dev, ctx, i/4, 0x0000ffff); 293 nv_wo32(ctx, i, 0x0000ffff);
240 nv_wo32(dev, ctx, 0x344c/4, 0x3f800000); 294 nv_wo32(ctx, 0x344c, 0x3f800000);
241 nv_wo32(dev, ctx, 0x3808/4, 0x3f800000); 295 nv_wo32(ctx, 0x3808, 0x3f800000);
242 nv_wo32(dev, ctx, 0x381c/4, 0x3f800000); 296 nv_wo32(ctx, 0x381c, 0x3f800000);
243 nv_wo32(dev, ctx, 0x3848/4, 0x40000000); 297 nv_wo32(ctx, 0x3848, 0x40000000);
244 nv_wo32(dev, ctx, 0x384c/4, 0x3f800000); 298 nv_wo32(ctx, 0x384c, 0x3f800000);
245 nv_wo32(dev, ctx, 0x3850/4, 0x3f000000); 299 nv_wo32(ctx, 0x3850, 0x3f000000);
246 nv_wo32(dev, ctx, 0x3858/4, 0x40000000); 300 nv_wo32(ctx, 0x3858, 0x40000000);
247 nv_wo32(dev, ctx, 0x385c/4, 0x3f800000); 301 nv_wo32(ctx, 0x385c, 0x3f800000);
248 nv_wo32(dev, ctx, 0x3864/4, 0xbf800000); 302 nv_wo32(ctx, 0x3864, 0xbf800000);
249 nv_wo32(dev, ctx, 0x386c/4, 0xbf800000); 303 nv_wo32(ctx, 0x386c, 0xbf800000);
250} 304}
251 305
252static void 306static void
253nv34_graph_context_init(struct drm_device *dev, struct nouveau_gpuobj *ctx) 307nv34_graph_context_init(struct nouveau_gpuobj *ctx)
254{ 308{
255 int i; 309 int i;
256 310
257 nv_wo32(dev, ctx, 0x040c/4, 0x01000101); 311 nv_wo32(ctx, 0x040c, 0x01000101);
258 nv_wo32(dev, ctx, 0x0420/4, 0x00000111); 312 nv_wo32(ctx, 0x0420, 0x00000111);
259 nv_wo32(dev, ctx, 0x0424/4, 0x00000060); 313 nv_wo32(ctx, 0x0424, 0x00000060);
260 nv_wo32(dev, ctx, 0x0440/4, 0x00000080); 314 nv_wo32(ctx, 0x0440, 0x00000080);
261 nv_wo32(dev, ctx, 0x0444/4, 0xffff0000); 315 nv_wo32(ctx, 0x0444, 0xffff0000);
262 nv_wo32(dev, ctx, 0x0448/4, 0x00000001); 316 nv_wo32(ctx, 0x0448, 0x00000001);
263 nv_wo32(dev, ctx, 0x045c/4, 0x44400000); 317 nv_wo32(ctx, 0x045c, 0x44400000);
264 nv_wo32(dev, ctx, 0x0480/4, 0xffff0000); 318 nv_wo32(ctx, 0x0480, 0xffff0000);
265 for (i = 0x04d4; i < 0x04dc; i += 4) 319 for (i = 0x04d4; i < 0x04dc; i += 4)
266 nv_wo32(dev, ctx, i/4, 0x0fff0000); 320 nv_wo32(ctx, i, 0x0fff0000);
267 nv_wo32(dev, ctx, 0x04e0/4, 0x00011100); 321 nv_wo32(ctx, 0x04e0, 0x00011100);
268 for (i = 0x04fc; i < 0x053c; i += 4) 322 for (i = 0x04fc; i < 0x053c; i += 4)
269 nv_wo32(dev, ctx, i/4, 0x07ff0000); 323 nv_wo32(ctx, i, 0x07ff0000);
270 nv_wo32(dev, ctx, 0x0544/4, 0x4b7fffff); 324 nv_wo32(ctx, 0x0544, 0x4b7fffff);
271 nv_wo32(dev, ctx, 0x057c/4, 0x00000080); 325 nv_wo32(ctx, 0x057c, 0x00000080);
272 nv_wo32(dev, ctx, 0x0580/4, 0x30201000); 326 nv_wo32(ctx, 0x0580, 0x30201000);
273 nv_wo32(dev, ctx, 0x0584/4, 0x70605040); 327 nv_wo32(ctx, 0x0584, 0x70605040);
274 nv_wo32(dev, ctx, 0x0588/4, 0xb8a89888); 328 nv_wo32(ctx, 0x0588, 0xb8a89888);
275 nv_wo32(dev, ctx, 0x058c/4, 0xf8e8d8c8); 329 nv_wo32(ctx, 0x058c, 0xf8e8d8c8);
276 nv_wo32(dev, ctx, 0x05a0/4, 0xb0000000); 330 nv_wo32(ctx, 0x05a0, 0xb0000000);
277 for (i = 0x05f0; i < 0x0630; i += 4) 331 for (i = 0x05f0; i < 0x0630; i += 4)
278 nv_wo32(dev, ctx, i/4, 0x00010588); 332 nv_wo32(ctx, i, 0x00010588);
279 for (i = 0x0630; i < 0x0670; i += 4) 333 for (i = 0x0630; i < 0x0670; i += 4)
280 nv_wo32(dev, ctx, i/4, 0x00030303); 334 nv_wo32(ctx, i, 0x00030303);
281 for (i = 0x06b0; i < 0x06f0; i += 4) 335 for (i = 0x06b0; i < 0x06f0; i += 4)
282 nv_wo32(dev, ctx, i/4, 0x0008aae4); 336 nv_wo32(ctx, i, 0x0008aae4);
283 for (i = 0x06f0; i < 0x0730; i += 4) 337 for (i = 0x06f0; i < 0x0730; i += 4)
284 nv_wo32(dev, ctx, i/4, 0x01012000); 338 nv_wo32(ctx, i, 0x01012000);
285 for (i = 0x0730; i < 0x0770; i += 4) 339 for (i = 0x0730; i < 0x0770; i += 4)
286 nv_wo32(dev, ctx, i/4, 0x00080008); 340 nv_wo32(ctx, i, 0x00080008);
287 nv_wo32(dev, ctx, 0x0850/4, 0x00040000); 341 nv_wo32(ctx, 0x0850, 0x00040000);
288 nv_wo32(dev, ctx, 0x0854/4, 0x00010000); 342 nv_wo32(ctx, 0x0854, 0x00010000);
289 for (i = 0x0858; i < 0x0868; i += 4) 343 for (i = 0x0858; i < 0x0868; i += 4)
290 nv_wo32(dev, ctx, i/4, 0x00040004); 344 nv_wo32(ctx, i, 0x00040004);
291 for (i = 0x15ac; i <= 0x271c ; i += 16) { 345 for (i = 0x15ac; i <= 0x271c ; i += 16) {
292 nv_wo32(dev, ctx, i/4 + 0, 0x10700ff9); 346 nv_wo32(ctx, i + 0, 0x10700ff9);
293 nv_wo32(dev, ctx, i/4 + 1, 0x0436086c); 347 nv_wo32(ctx, i + 1, 0x0436086c);
294 nv_wo32(dev, ctx, i/4 + 2, 0x000c001b); 348 nv_wo32(ctx, i + 2, 0x000c001b);
295 } 349 }
296 for (i = 0x274c; i < 0x275c; i += 4) 350 for (i = 0x274c; i < 0x275c; i += 4)
297 nv_wo32(dev, ctx, i/4, 0x0000ffff); 351 nv_wo32(ctx, i, 0x0000ffff);
298 nv_wo32(dev, ctx, 0x2ae0/4, 0x3f800000); 352 nv_wo32(ctx, 0x2ae0, 0x3f800000);
299 nv_wo32(dev, ctx, 0x2e9c/4, 0x3f800000); 353 nv_wo32(ctx, 0x2e9c, 0x3f800000);
300 nv_wo32(dev, ctx, 0x2eb0/4, 0x3f800000); 354 nv_wo32(ctx, 0x2eb0, 0x3f800000);
301 nv_wo32(dev, ctx, 0x2edc/4, 0x40000000); 355 nv_wo32(ctx, 0x2edc, 0x40000000);
302 nv_wo32(dev, ctx, 0x2ee0/4, 0x3f800000); 356 nv_wo32(ctx, 0x2ee0, 0x3f800000);
303 nv_wo32(dev, ctx, 0x2ee4/4, 0x3f000000); 357 nv_wo32(ctx, 0x2ee4, 0x3f000000);
304 nv_wo32(dev, ctx, 0x2eec/4, 0x40000000); 358 nv_wo32(ctx, 0x2eec, 0x40000000);
305 nv_wo32(dev, ctx, 0x2ef0/4, 0x3f800000); 359 nv_wo32(ctx, 0x2ef0, 0x3f800000);
306 nv_wo32(dev, ctx, 0x2ef8/4, 0xbf800000); 360 nv_wo32(ctx, 0x2ef8, 0xbf800000);
307 nv_wo32(dev, ctx, 0x2f00/4, 0xbf800000); 361 nv_wo32(ctx, 0x2f00, 0xbf800000);
308} 362}
309 363
310static void 364static void
311nv35_36_graph_context_init(struct drm_device *dev, struct nouveau_gpuobj *ctx) 365nv35_36_graph_context_init(struct nouveau_gpuobj *ctx)
312{ 366{
313 int i; 367 int i;
314 368
315 nv_wo32(dev, ctx, 0x040c/4, 0x00000101); 369 nv_wo32(ctx, 0x040c, 0x00000101);
316 nv_wo32(dev, ctx, 0x0420/4, 0x00000111); 370 nv_wo32(ctx, 0x0420, 0x00000111);
317 nv_wo32(dev, ctx, 0x0424/4, 0x00000060); 371 nv_wo32(ctx, 0x0424, 0x00000060);
318 nv_wo32(dev, ctx, 0x0440/4, 0x00000080); 372 nv_wo32(ctx, 0x0440, 0x00000080);
319 nv_wo32(dev, ctx, 0x0444/4, 0xffff0000); 373 nv_wo32(ctx, 0x0444, 0xffff0000);
320 nv_wo32(dev, ctx, 0x0448/4, 0x00000001); 374 nv_wo32(ctx, 0x0448, 0x00000001);
321 nv_wo32(dev, ctx, 0x045c/4, 0x44400000); 375 nv_wo32(ctx, 0x045c, 0x44400000);
322 nv_wo32(dev, ctx, 0x0488/4, 0xffff0000); 376 nv_wo32(ctx, 0x0488, 0xffff0000);
323 for (i = 0x04dc; i < 0x04e4; i += 4) 377 for (i = 0x04dc; i < 0x04e4; i += 4)
324 nv_wo32(dev, ctx, i/4, 0x0fff0000); 378 nv_wo32(ctx, i, 0x0fff0000);
325 nv_wo32(dev, ctx, 0x04e8/4, 0x00011100); 379 nv_wo32(ctx, 0x04e8, 0x00011100);
326 for (i = 0x0504; i < 0x0544; i += 4) 380 for (i = 0x0504; i < 0x0544; i += 4)
327 nv_wo32(dev, ctx, i/4, 0x07ff0000); 381 nv_wo32(ctx, i, 0x07ff0000);
328 nv_wo32(dev, ctx, 0x054c/4, 0x4b7fffff); 382 nv_wo32(ctx, 0x054c, 0x4b7fffff);
329 nv_wo32(dev, ctx, 0x0588/4, 0x00000080); 383 nv_wo32(ctx, 0x0588, 0x00000080);
330 nv_wo32(dev, ctx, 0x058c/4, 0x30201000); 384 nv_wo32(ctx, 0x058c, 0x30201000);
331 nv_wo32(dev, ctx, 0x0590/4, 0x70605040); 385 nv_wo32(ctx, 0x0590, 0x70605040);
332 nv_wo32(dev, ctx, 0x0594/4, 0xb8a89888); 386 nv_wo32(ctx, 0x0594, 0xb8a89888);
333 nv_wo32(dev, ctx, 0x0598/4, 0xf8e8d8c8); 387 nv_wo32(ctx, 0x0598, 0xf8e8d8c8);
334 nv_wo32(dev, ctx, 0x05ac/4, 0xb0000000); 388 nv_wo32(ctx, 0x05ac, 0xb0000000);
335 for (i = 0x0604; i < 0x0644; i += 4) 389 for (i = 0x0604; i < 0x0644; i += 4)
336 nv_wo32(dev, ctx, i/4, 0x00010588); 390 nv_wo32(ctx, i, 0x00010588);
337 for (i = 0x0644; i < 0x0684; i += 4) 391 for (i = 0x0644; i < 0x0684; i += 4)
338 nv_wo32(dev, ctx, i/4, 0x00030303); 392 nv_wo32(ctx, i, 0x00030303);
339 for (i = 0x06c4; i < 0x0704; i += 4) 393 for (i = 0x06c4; i < 0x0704; i += 4)
340 nv_wo32(dev, ctx, i/4, 0x0008aae4); 394 nv_wo32(ctx, i, 0x0008aae4);
341 for (i = 0x0704; i < 0x0744; i += 4) 395 for (i = 0x0704; i < 0x0744; i += 4)
342 nv_wo32(dev, ctx, i/4, 0x01012000); 396 nv_wo32(ctx, i, 0x01012000);
343 for (i = 0x0744; i < 0x0784; i += 4) 397 for (i = 0x0744; i < 0x0784; i += 4)
344 nv_wo32(dev, ctx, i/4, 0x00080008); 398 nv_wo32(ctx, i, 0x00080008);
345 nv_wo32(dev, ctx, 0x0860/4, 0x00040000); 399 nv_wo32(ctx, 0x0860, 0x00040000);
346 nv_wo32(dev, ctx, 0x0864/4, 0x00010000); 400 nv_wo32(ctx, 0x0864, 0x00010000);
347 for (i = 0x0868; i < 0x0878; i += 4) 401 for (i = 0x0868; i < 0x0878; i += 4)
348 nv_wo32(dev, ctx, i/4, 0x00040004); 402 nv_wo32(ctx, i, 0x00040004);
349 for (i = 0x1f1c; i <= 0x308c ; i += 16) { 403 for (i = 0x1f1c; i <= 0x308c ; i += 16) {
350 nv_wo32(dev, ctx, i/4 + 0, 0x10700ff9); 404 nv_wo32(ctx, i + 0, 0x10700ff9);
351 nv_wo32(dev, ctx, i/4 + 1, 0x0436086c); 405 nv_wo32(ctx, i + 4, 0x0436086c);
352 nv_wo32(dev, ctx, i/4 + 2, 0x000c001b); 406 nv_wo32(ctx, i + 8, 0x000c001b);
353 } 407 }
354 for (i = 0x30bc; i < 0x30cc; i += 4) 408 for (i = 0x30bc; i < 0x30cc; i += 4)
355 nv_wo32(dev, ctx, i/4, 0x0000ffff); 409 nv_wo32(ctx, i, 0x0000ffff);
356 nv_wo32(dev, ctx, 0x3450/4, 0x3f800000); 410 nv_wo32(ctx, 0x3450, 0x3f800000);
357 nv_wo32(dev, ctx, 0x380c/4, 0x3f800000); 411 nv_wo32(ctx, 0x380c, 0x3f800000);
358 nv_wo32(dev, ctx, 0x3820/4, 0x3f800000); 412 nv_wo32(ctx, 0x3820, 0x3f800000);
359 nv_wo32(dev, ctx, 0x384c/4, 0x40000000); 413 nv_wo32(ctx, 0x384c, 0x40000000);
360 nv_wo32(dev, ctx, 0x3850/4, 0x3f800000); 414 nv_wo32(ctx, 0x3850, 0x3f800000);
361 nv_wo32(dev, ctx, 0x3854/4, 0x3f000000); 415 nv_wo32(ctx, 0x3854, 0x3f000000);
362 nv_wo32(dev, ctx, 0x385c/4, 0x40000000); 416 nv_wo32(ctx, 0x385c, 0x40000000);
363 nv_wo32(dev, ctx, 0x3860/4, 0x3f800000); 417 nv_wo32(ctx, 0x3860, 0x3f800000);
364 nv_wo32(dev, ctx, 0x3868/4, 0xbf800000); 418 nv_wo32(ctx, 0x3868, 0xbf800000);
365 nv_wo32(dev, ctx, 0x3870/4, 0xbf800000); 419 nv_wo32(ctx, 0x3870, 0xbf800000);
366} 420}
367 421
368int 422int
369nv20_graph_create_context(struct nouveau_channel *chan) 423nv20_graph_context_new(struct nouveau_channel *chan, int engine)
370{ 424{
425 struct nv20_graph_engine *pgraph = nv_engine(chan->dev, engine);
426 struct nouveau_gpuobj *grctx = NULL;
371 struct drm_device *dev = chan->dev; 427 struct drm_device *dev = chan->dev;
372 struct drm_nouveau_private *dev_priv = dev->dev_private;
373 struct nouveau_pgraph_engine *pgraph = &dev_priv->engine.graph;
374 void (*ctx_init)(struct drm_device *, struct nouveau_gpuobj *);
375 unsigned int idoffs = 0x28/4;
376 int ret; 428 int ret;
377 429
378 switch (dev_priv->chipset) { 430 ret = nouveau_gpuobj_new(dev, NULL, pgraph->grctx_size, 16,
379 case 0x20: 431 NVOBJ_FLAG_ZERO_ALLOC, &grctx);
380 ctx_init = nv20_graph_context_init;
381 idoffs = 0;
382 break;
383 case 0x25:
384 case 0x28:
385 ctx_init = nv25_graph_context_init;
386 break;
387 case 0x2a:
388 ctx_init = nv2a_graph_context_init;
389 idoffs = 0;
390 break;
391 case 0x30:
392 case 0x31:
393 ctx_init = nv30_31_graph_context_init;
394 break;
395 case 0x34:
396 ctx_init = nv34_graph_context_init;
397 break;
398 case 0x35:
399 case 0x36:
400 ctx_init = nv35_36_graph_context_init;
401 break;
402 default:
403 BUG_ON(1);
404 }
405
406 ret = nouveau_gpuobj_new_ref(dev, chan, NULL, 0, pgraph->grctx_size,
407 16, NVOBJ_FLAG_ZERO_ALLOC,
408 &chan->ramin_grctx);
409 if (ret) 432 if (ret)
410 return ret; 433 return ret;
411 434
412 /* Initialise default context values */ 435 /* Initialise default context values */
413 ctx_init(dev, chan->ramin_grctx->gpuobj); 436 pgraph->grctx_init(grctx);
414 437
415 /* nv20: nv_wo32(dev, chan->ramin_grctx->gpuobj, 10, chan->id<<24); */ 438 /* nv20: nv_wo32(dev, chan->ramin_grctx->gpuobj, 10, chan->id<<24); */
416 nv_wo32(dev, chan->ramin_grctx->gpuobj, idoffs, 439 /* CTX_USER */
417 (chan->id << 24) | 0x1); /* CTX_USER */ 440 nv_wo32(grctx, pgraph->grctx_user, (chan->id << 24) | 0x1);
418 441
419 nv_wo32(dev, pgraph->ctx_table->gpuobj, chan->id, 442 nv_wo32(pgraph->ctxtab, chan->id * 4, grctx->pinst >> 4);
420 chan->ramin_grctx->instance >> 4); 443 chan->engctx[engine] = grctx;
421 return 0; 444 return 0;
422} 445}
423 446
424void 447void
425nv20_graph_destroy_context(struct nouveau_channel *chan) 448nv20_graph_context_del(struct nouveau_channel *chan, int engine)
426{ 449{
450 struct nv20_graph_engine *pgraph = nv_engine(chan->dev, engine);
451 struct nouveau_gpuobj *grctx = chan->engctx[engine];
427 struct drm_device *dev = chan->dev; 452 struct drm_device *dev = chan->dev;
428 struct drm_nouveau_private *dev_priv = dev->dev_private; 453 struct drm_nouveau_private *dev_priv = dev->dev_private;
429 struct nouveau_pgraph_engine *pgraph = &dev_priv->engine.graph; 454 unsigned long flags;
430 455
431 if (chan->ramin_grctx) 456 spin_lock_irqsave(&dev_priv->context_switch_lock, flags);
432 nouveau_gpuobj_ref_del(dev, &chan->ramin_grctx); 457 nv04_graph_fifo_access(dev, false);
433 458
434 nv_wo32(dev, pgraph->ctx_table->gpuobj, chan->id, 0); 459 /* Unload the context if it's the currently active one */
435} 460 if (nv10_graph_channel(dev) == chan)
461 nv20_graph_unload_context(dev);
436 462
437int 463 nv04_graph_fifo_access(dev, true);
438nv20_graph_load_context(struct nouveau_channel *chan) 464 spin_unlock_irqrestore(&dev_priv->context_switch_lock, flags);
439{
440 struct drm_device *dev = chan->dev;
441 uint32_t inst;
442 465
443 if (!chan->ramin_grctx) 466 /* Free the context resources */
444 return -EINVAL; 467 nv_wo32(pgraph->ctxtab, chan->id * 4, 0);
445 inst = chan->ramin_grctx->instance >> 4;
446
447 nv_wr32(dev, NV20_PGRAPH_CHANNEL_CTX_POINTER, inst);
448 nv_wr32(dev, NV20_PGRAPH_CHANNEL_CTX_XFER,
449 NV20_PGRAPH_CHANNEL_CTX_XFER_LOAD);
450 nv_wr32(dev, NV10_PGRAPH_CTX_CONTROL, 0x10010100);
451 468
452 nouveau_wait_for_idle(dev); 469 nouveau_gpuobj_ref(NULL, &grctx);
453 return 0; 470 chan->engctx[engine] = NULL;
454}
455
456int
457nv20_graph_unload_context(struct drm_device *dev)
458{
459 struct drm_nouveau_private *dev_priv = dev->dev_private;
460 struct nouveau_pgraph_engine *pgraph = &dev_priv->engine.graph;
461 struct nouveau_fifo_engine *pfifo = &dev_priv->engine.fifo;
462 struct nouveau_channel *chan;
463 uint32_t inst, tmp;
464
465 chan = pgraph->channel(dev);
466 if (!chan)
467 return 0;
468 inst = chan->ramin_grctx->instance >> 4;
469
470 nv_wr32(dev, NV20_PGRAPH_CHANNEL_CTX_POINTER, inst);
471 nv_wr32(dev, NV20_PGRAPH_CHANNEL_CTX_XFER,
472 NV20_PGRAPH_CHANNEL_CTX_XFER_SAVE);
473
474 nouveau_wait_for_idle(dev);
475
476 nv_wr32(dev, NV10_PGRAPH_CTX_CONTROL, 0x10000000);
477 tmp = nv_rd32(dev, NV10_PGRAPH_CTX_USER) & 0x00ffffff;
478 tmp |= (pfifo->channels - 1) << 24;
479 nv_wr32(dev, NV10_PGRAPH_CTX_USER, tmp);
480 return 0;
481} 471}
482 472
483static void 473static void
484nv20_graph_rdi(struct drm_device *dev) 474nv20_graph_set_tile_region(struct drm_device *dev, int i)
485{ 475{
486 struct drm_nouveau_private *dev_priv = dev->dev_private; 476 struct drm_nouveau_private *dev_priv = dev->dev_private;
487 int i, writecount = 32; 477 struct nouveau_tile_reg *tile = &dev_priv->tile.reg[i];
488 uint32_t rdi_index = 0x2c80000;
489
490 if (dev_priv->chipset == 0x20) {
491 rdi_index = 0x3d0000;
492 writecount = 15;
493 }
494 478
495 nv_wr32(dev, NV10_PGRAPH_RDI_INDEX, rdi_index); 479 nv_wr32(dev, NV20_PGRAPH_TLIMIT(i), tile->limit);
496 for (i = 0; i < writecount; i++) 480 nv_wr32(dev, NV20_PGRAPH_TSIZE(i), tile->pitch);
497 nv_wr32(dev, NV10_PGRAPH_RDI_DATA, 0); 481 nv_wr32(dev, NV20_PGRAPH_TILE(i), tile->addr);
498
499 nouveau_wait_for_idle(dev);
500}
501
502void
503nv20_graph_set_region_tiling(struct drm_device *dev, int i, uint32_t addr,
504 uint32_t size, uint32_t pitch)
505{
506 uint32_t limit = max(1u, addr + size) - 1;
507
508 if (pitch)
509 addr |= 1;
510
511 nv_wr32(dev, NV20_PGRAPH_TLIMIT(i), limit);
512 nv_wr32(dev, NV20_PGRAPH_TSIZE(i), pitch);
513 nv_wr32(dev, NV20_PGRAPH_TILE(i), addr);
514 482
515 nv_wr32(dev, NV10_PGRAPH_RDI_INDEX, 0x00EA0030 + 4 * i); 483 nv_wr32(dev, NV10_PGRAPH_RDI_INDEX, 0x00EA0030 + 4 * i);
516 nv_wr32(dev, NV10_PGRAPH_RDI_DATA, limit); 484 nv_wr32(dev, NV10_PGRAPH_RDI_DATA, tile->limit);
517 nv_wr32(dev, NV10_PGRAPH_RDI_INDEX, 0x00EA0050 + 4 * i); 485 nv_wr32(dev, NV10_PGRAPH_RDI_INDEX, 0x00EA0050 + 4 * i);
518 nv_wr32(dev, NV10_PGRAPH_RDI_DATA, pitch); 486 nv_wr32(dev, NV10_PGRAPH_RDI_DATA, tile->pitch);
519 nv_wr32(dev, NV10_PGRAPH_RDI_INDEX, 0x00EA0010 + 4 * i); 487 nv_wr32(dev, NV10_PGRAPH_RDI_INDEX, 0x00EA0010 + 4 * i);
520 nv_wr32(dev, NV10_PGRAPH_RDI_DATA, addr); 488 nv_wr32(dev, NV10_PGRAPH_RDI_DATA, tile->addr);
489
490 if (dev_priv->card_type == NV_20) {
491 nv_wr32(dev, NV20_PGRAPH_ZCOMP(i), tile->zcomp);
492 nv_wr32(dev, NV10_PGRAPH_RDI_INDEX, 0x00ea0090 + 4 * i);
493 nv_wr32(dev, NV10_PGRAPH_RDI_DATA, tile->zcomp);
494 }
521} 495}
522 496
523int 497int
524nv20_graph_init(struct drm_device *dev) 498nv20_graph_init(struct drm_device *dev, int engine)
525{ 499{
500 struct nv20_graph_engine *pgraph = nv_engine(dev, engine);
526 struct drm_nouveau_private *dev_priv = dev->dev_private; 501 struct drm_nouveau_private *dev_priv = dev->dev_private;
527 struct nouveau_pgraph_engine *pgraph = &dev_priv->engine.graph;
528 uint32_t tmp, vramsz; 502 uint32_t tmp, vramsz;
529 int ret, i; 503 int i;
530
531 switch (dev_priv->chipset) {
532 case 0x20:
533 pgraph->grctx_size = NV20_GRCTX_SIZE;
534 break;
535 case 0x25:
536 case 0x28:
537 pgraph->grctx_size = NV25_GRCTX_SIZE;
538 break;
539 case 0x2a:
540 pgraph->grctx_size = NV2A_GRCTX_SIZE;
541 break;
542 default:
543 NV_ERROR(dev, "unknown chipset, disabling acceleration\n");
544 pgraph->accel_blocked = true;
545 return 0;
546 }
547 504
548 nv_wr32(dev, NV03_PMC_ENABLE, 505 nv_wr32(dev, NV03_PMC_ENABLE,
549 nv_rd32(dev, NV03_PMC_ENABLE) & ~NV_PMC_ENABLE_PGRAPH); 506 nv_rd32(dev, NV03_PMC_ENABLE) & ~NV_PMC_ENABLE_PGRAPH);
550 nv_wr32(dev, NV03_PMC_ENABLE, 507 nv_wr32(dev, NV03_PMC_ENABLE,
551 nv_rd32(dev, NV03_PMC_ENABLE) | NV_PMC_ENABLE_PGRAPH); 508 nv_rd32(dev, NV03_PMC_ENABLE) | NV_PMC_ENABLE_PGRAPH);
552 509
553 if (!pgraph->ctx_table) { 510 nv_wr32(dev, NV20_PGRAPH_CHANNEL_CTX_TABLE, pgraph->ctxtab->pinst >> 4);
554 /* Create Context Pointer Table */
555 ret = nouveau_gpuobj_new_ref(dev, NULL, NULL, 0, 32 * 4, 16,
556 NVOBJ_FLAG_ZERO_ALLOC,
557 &pgraph->ctx_table);
558 if (ret)
559 return ret;
560 }
561
562 nv_wr32(dev, NV20_PGRAPH_CHANNEL_CTX_TABLE,
563 pgraph->ctx_table->instance >> 4);
564 511
565 nv20_graph_rdi(dev); 512 nv20_graph_rdi(dev);
566 513
@@ -575,16 +522,17 @@ nv20_graph_init(struct drm_device *dev)
575 nv_wr32(dev, 0x40009C , 0x00000040); 522 nv_wr32(dev, 0x40009C , 0x00000040);
576 523
577 if (dev_priv->chipset >= 0x25) { 524 if (dev_priv->chipset >= 0x25) {
578 nv_wr32(dev, 0x400890, 0x00080000); 525 nv_wr32(dev, 0x400890, 0x00a8cfff);
579 nv_wr32(dev, 0x400610, 0x304B1FB6); 526 nv_wr32(dev, 0x400610, 0x304B1FB6);
580 nv_wr32(dev, 0x400B80, 0x18B82880); 527 nv_wr32(dev, 0x400B80, 0x1cbd3883);
581 nv_wr32(dev, 0x400B84, 0x44000000); 528 nv_wr32(dev, 0x400B84, 0x44000000);
582 nv_wr32(dev, 0x400098, 0x40000080); 529 nv_wr32(dev, 0x400098, 0x40000080);
583 nv_wr32(dev, 0x400B88, 0x000000ff); 530 nv_wr32(dev, 0x400B88, 0x000000ff);
531
584 } else { 532 } else {
585 nv_wr32(dev, 0x400880, 0x00080000); /* 0x0008c7df */ 533 nv_wr32(dev, 0x400880, 0x0008c7df);
586 nv_wr32(dev, 0x400094, 0x00000005); 534 nv_wr32(dev, 0x400094, 0x00000005);
587 nv_wr32(dev, 0x400B80, 0x45CAA208); /* 0x45eae20e */ 535 nv_wr32(dev, 0x400B80, 0x45eae20e);
588 nv_wr32(dev, 0x400B84, 0x24000000); 536 nv_wr32(dev, 0x400B84, 0x24000000);
589 nv_wr32(dev, 0x400098, 0x00000040); 537 nv_wr32(dev, 0x400098, 0x00000040);
590 nv_wr32(dev, NV10_PGRAPH_RDI_INDEX, 0x00E00038); 538 nv_wr32(dev, NV10_PGRAPH_RDI_INDEX, 0x00E00038);
@@ -595,14 +543,8 @@ nv20_graph_init(struct drm_device *dev)
595 543
596 /* Turn all the tiling regions off. */ 544 /* Turn all the tiling regions off. */
597 for (i = 0; i < NV10_PFB_TILE__SIZE; i++) 545 for (i = 0; i < NV10_PFB_TILE__SIZE; i++)
598 nv20_graph_set_region_tiling(dev, i, 0, 0, 0); 546 nv20_graph_set_tile_region(dev, i);
599 547
600 for (i = 0; i < 8; i++) {
601 nv_wr32(dev, 0x400980 + i * 4, nv_rd32(dev, 0x100300 + i * 4));
602 nv_wr32(dev, NV10_PGRAPH_RDI_INDEX, 0x00EA0090 + i * 4);
603 nv_wr32(dev, NV10_PGRAPH_RDI_DATA,
604 nv_rd32(dev, 0x100300 + i * 4));
605 }
606 nv_wr32(dev, 0x4009a0, nv_rd32(dev, 0x100324)); 548 nv_wr32(dev, 0x4009a0, nv_rd32(dev, 0x100324));
607 nv_wr32(dev, NV10_PGRAPH_RDI_INDEX, 0x00EA000C); 549 nv_wr32(dev, NV10_PGRAPH_RDI_INDEX, 0x00EA000C);
608 nv_wr32(dev, NV10_PGRAPH_RDI_DATA, nv_rd32(dev, 0x100324)); 550 nv_wr32(dev, NV10_PGRAPH_RDI_DATA, nv_rd32(dev, 0x100324));
@@ -640,56 +582,19 @@ nv20_graph_init(struct drm_device *dev)
640 return 0; 582 return 0;
641} 583}
642 584
643void
644nv20_graph_takedown(struct drm_device *dev)
645{
646 struct drm_nouveau_private *dev_priv = dev->dev_private;
647 struct nouveau_pgraph_engine *pgraph = &dev_priv->engine.graph;
648
649 nouveau_gpuobj_ref_del(dev, &pgraph->ctx_table);
650}
651
652int 585int
653nv30_graph_init(struct drm_device *dev) 586nv30_graph_init(struct drm_device *dev, int engine)
654{ 587{
588 struct nv20_graph_engine *pgraph = nv_engine(dev, engine);
655 struct drm_nouveau_private *dev_priv = dev->dev_private; 589 struct drm_nouveau_private *dev_priv = dev->dev_private;
656 struct nouveau_pgraph_engine *pgraph = &dev_priv->engine.graph; 590 int i;
657 int ret, i;
658
659 switch (dev_priv->chipset) {
660 case 0x30:
661 case 0x31:
662 pgraph->grctx_size = NV30_31_GRCTX_SIZE;
663 break;
664 case 0x34:
665 pgraph->grctx_size = NV34_GRCTX_SIZE;
666 break;
667 case 0x35:
668 case 0x36:
669 pgraph->grctx_size = NV35_36_GRCTX_SIZE;
670 break;
671 default:
672 NV_ERROR(dev, "unknown chipset, disabling acceleration\n");
673 pgraph->accel_blocked = true;
674 return 0;
675 }
676 591
677 nv_wr32(dev, NV03_PMC_ENABLE, 592 nv_wr32(dev, NV03_PMC_ENABLE,
678 nv_rd32(dev, NV03_PMC_ENABLE) & ~NV_PMC_ENABLE_PGRAPH); 593 nv_rd32(dev, NV03_PMC_ENABLE) & ~NV_PMC_ENABLE_PGRAPH);
679 nv_wr32(dev, NV03_PMC_ENABLE, 594 nv_wr32(dev, NV03_PMC_ENABLE,
680 nv_rd32(dev, NV03_PMC_ENABLE) | NV_PMC_ENABLE_PGRAPH); 595 nv_rd32(dev, NV03_PMC_ENABLE) | NV_PMC_ENABLE_PGRAPH);
681 596
682 if (!pgraph->ctx_table) { 597 nv_wr32(dev, NV20_PGRAPH_CHANNEL_CTX_TABLE, pgraph->ctxtab->pinst >> 4);
683 /* Create Context Pointer Table */
684 ret = nouveau_gpuobj_new_ref(dev, NULL, NULL, 0, 32 * 4, 16,
685 NVOBJ_FLAG_ZERO_ALLOC,
686 &pgraph->ctx_table);
687 if (ret)
688 return ret;
689 }
690
691 nv_wr32(dev, NV20_PGRAPH_CHANNEL_CTX_TABLE,
692 pgraph->ctx_table->instance >> 4);
693 598
694 nv_wr32(dev, NV03_PGRAPH_INTR , 0xFFFFFFFF); 599 nv_wr32(dev, NV03_PGRAPH_INTR , 0xFFFFFFFF);
695 nv_wr32(dev, NV03_PGRAPH_INTR_EN, 0xFFFFFFFF); 600 nv_wr32(dev, NV03_PGRAPH_INTR_EN, 0xFFFFFFFF);
@@ -728,7 +633,7 @@ nv30_graph_init(struct drm_device *dev)
728 633
729 /* Turn all the tiling regions off. */ 634 /* Turn all the tiling regions off. */
730 for (i = 0; i < NV10_PFB_TILE__SIZE; i++) 635 for (i = 0; i < NV10_PFB_TILE__SIZE; i++)
731 nv20_graph_set_region_tiling(dev, i, 0, 0, 0); 636 nv20_graph_set_tile_region(dev, i);
732 637
733 nv_wr32(dev, NV10_PGRAPH_CTX_CONTROL, 0x10000100); 638 nv_wr32(dev, NV10_PGRAPH_CTX_CONTROL, 0x10000100);
734 nv_wr32(dev, NV10_PGRAPH_STATE , 0xFFFFFFFF); 639 nv_wr32(dev, NV10_PGRAPH_STATE , 0xFFFFFFFF);
@@ -748,46 +653,183 @@ nv30_graph_init(struct drm_device *dev)
748 return 0; 653 return 0;
749} 654}
750 655
751struct nouveau_pgraph_object_class nv20_graph_grclass[] = { 656int
752 { 0x0030, false, NULL }, /* null */ 657nv20_graph_fini(struct drm_device *dev, int engine)
753 { 0x0039, false, NULL }, /* m2mf */ 658{
754 { 0x004a, false, NULL }, /* gdirect */ 659 nv20_graph_unload_context(dev);
755 { 0x009f, false, NULL }, /* imageblit (nv12) */ 660 nv_wr32(dev, NV03_PGRAPH_INTR_EN, 0x00000000);
756 { 0x008a, false, NULL }, /* ifc */ 661 return 0;
757 { 0x0089, false, NULL }, /* sifm */ 662}
758 { 0x0062, false, NULL }, /* surf2d */
759 { 0x0043, false, NULL }, /* rop */
760 { 0x0012, false, NULL }, /* beta1 */
761 { 0x0072, false, NULL }, /* beta4 */
762 { 0x0019, false, NULL }, /* cliprect */
763 { 0x0044, false, NULL }, /* pattern */
764 { 0x009e, false, NULL }, /* swzsurf */
765 { 0x0096, false, NULL }, /* celcius */
766 { 0x0097, false, NULL }, /* kelvin (nv20) */
767 { 0x0597, false, NULL }, /* kelvin (nv25) */
768 {}
769};
770 663
771struct nouveau_pgraph_object_class nv30_graph_grclass[] = { 664static void
772 { 0x0030, false, NULL }, /* null */ 665nv20_graph_isr(struct drm_device *dev)
773 { 0x0039, false, NULL }, /* m2mf */ 666{
774 { 0x004a, false, NULL }, /* gdirect */ 667 u32 stat;
775 { 0x009f, false, NULL }, /* imageblit (nv12) */ 668
776 { 0x008a, false, NULL }, /* ifc */ 669 while ((stat = nv_rd32(dev, NV03_PGRAPH_INTR))) {
777 { 0x038a, false, NULL }, /* ifc (nv30) */ 670 u32 nsource = nv_rd32(dev, NV03_PGRAPH_NSOURCE);
778 { 0x0089, false, NULL }, /* sifm */ 671 u32 nstatus = nv_rd32(dev, NV03_PGRAPH_NSTATUS);
779 { 0x0389, false, NULL }, /* sifm (nv30) */ 672 u32 addr = nv_rd32(dev, NV04_PGRAPH_TRAPPED_ADDR);
780 { 0x0062, false, NULL }, /* surf2d */ 673 u32 chid = (addr & 0x01f00000) >> 20;
781 { 0x0362, false, NULL }, /* surf2d (nv30) */ 674 u32 subc = (addr & 0x00070000) >> 16;
782 { 0x0043, false, NULL }, /* rop */ 675 u32 mthd = (addr & 0x00001ffc);
783 { 0x0012, false, NULL }, /* beta1 */ 676 u32 data = nv_rd32(dev, NV04_PGRAPH_TRAPPED_DATA);
784 { 0x0072, false, NULL }, /* beta4 */ 677 u32 class = nv_rd32(dev, 0x400160 + subc * 4) & 0xfff;
785 { 0x0019, false, NULL }, /* cliprect */ 678 u32 show = stat;
786 { 0x0044, false, NULL }, /* pattern */ 679
787 { 0x039e, false, NULL }, /* swzsurf */ 680 if (stat & NV_PGRAPH_INTR_ERROR) {
788 { 0x0397, false, NULL }, /* rankine (nv30) */ 681 if (nsource & NV03_PGRAPH_NSOURCE_ILLEGAL_MTHD) {
789 { 0x0497, false, NULL }, /* rankine (nv35) */ 682 if (!nouveau_gpuobj_mthd_call2(dev, chid, class, mthd, data))
790 { 0x0697, false, NULL }, /* rankine (nv34) */ 683 show &= ~NV_PGRAPH_INTR_ERROR;
791 {} 684 }
792}; 685 }
686
687 nv_wr32(dev, NV03_PGRAPH_INTR, stat);
688 nv_wr32(dev, NV04_PGRAPH_FIFO, 0x00000001);
689
690 if (show && nouveau_ratelimit()) {
691 NV_INFO(dev, "PGRAPH -");
692 nouveau_bitfield_print(nv10_graph_intr, show);
693 printk(" nsource:");
694 nouveau_bitfield_print(nv04_graph_nsource, nsource);
695 printk(" nstatus:");
696 nouveau_bitfield_print(nv10_graph_nstatus, nstatus);
697 printk("\n");
698 NV_INFO(dev, "PGRAPH - ch %d/%d class 0x%04x "
699 "mthd 0x%04x data 0x%08x\n",
700 chid, subc, class, mthd, data);
701 }
702 }
703}
704
705static void
706nv20_graph_destroy(struct drm_device *dev, int engine)
707{
708 struct nv20_graph_engine *pgraph = nv_engine(dev, engine);
709
710 nouveau_irq_unregister(dev, 12);
711 nouveau_gpuobj_ref(NULL, &pgraph->ctxtab);
793 712
713 NVOBJ_ENGINE_DEL(dev, GR);
714 kfree(pgraph);
715}
716
717int
718nv20_graph_create(struct drm_device *dev)
719{
720 struct drm_nouveau_private *dev_priv = dev->dev_private;
721 struct nv20_graph_engine *pgraph;
722 int ret;
723
724 pgraph = kzalloc(sizeof(*pgraph), GFP_KERNEL);
725 if (!pgraph)
726 return -ENOMEM;
727
728 pgraph->base.destroy = nv20_graph_destroy;
729 pgraph->base.fini = nv20_graph_fini;
730 pgraph->base.context_new = nv20_graph_context_new;
731 pgraph->base.context_del = nv20_graph_context_del;
732 pgraph->base.object_new = nv04_graph_object_new;
733 pgraph->base.set_tile_region = nv20_graph_set_tile_region;
734
735 pgraph->grctx_user = 0x0028;
736 if (dev_priv->card_type == NV_20) {
737 pgraph->base.init = nv20_graph_init;
738 switch (dev_priv->chipset) {
739 case 0x20:
740 pgraph->grctx_init = nv20_graph_context_init;
741 pgraph->grctx_size = NV20_GRCTX_SIZE;
742 pgraph->grctx_user = 0x0000;
743 break;
744 case 0x25:
745 case 0x28:
746 pgraph->grctx_init = nv25_graph_context_init;
747 pgraph->grctx_size = NV25_GRCTX_SIZE;
748 break;
749 case 0x2a:
750 pgraph->grctx_init = nv2a_graph_context_init;
751 pgraph->grctx_size = NV2A_GRCTX_SIZE;
752 pgraph->grctx_user = 0x0000;
753 break;
754 default:
755 NV_ERROR(dev, "PGRAPH: unknown chipset\n");
756 return 0;
757 }
758 } else {
759 pgraph->base.init = nv30_graph_init;
760 switch (dev_priv->chipset) {
761 case 0x30:
762 case 0x31:
763 pgraph->grctx_init = nv30_31_graph_context_init;
764 pgraph->grctx_size = NV30_31_GRCTX_SIZE;
765 break;
766 case 0x34:
767 pgraph->grctx_init = nv34_graph_context_init;
768 pgraph->grctx_size = NV34_GRCTX_SIZE;
769 break;
770 case 0x35:
771 case 0x36:
772 pgraph->grctx_init = nv35_36_graph_context_init;
773 pgraph->grctx_size = NV35_36_GRCTX_SIZE;
774 break;
775 default:
776 NV_ERROR(dev, "PGRAPH: unknown chipset\n");
777 return 0;
778 }
779 }
780
781 /* Create Context Pointer Table */
782 ret = nouveau_gpuobj_new(dev, NULL, 32 * 4, 16, NVOBJ_FLAG_ZERO_ALLOC,
783 &pgraph->ctxtab);
784 if (ret) {
785 kfree(pgraph);
786 return ret;
787 }
788
789 NVOBJ_ENGINE_ADD(dev, GR, &pgraph->base);
790 nouveau_irq_register(dev, 12, nv20_graph_isr);
791
792 /* nvsw */
793 NVOBJ_CLASS(dev, 0x506e, SW);
794 NVOBJ_MTHD (dev, 0x506e, 0x0500, nv04_graph_mthd_page_flip);
795
796 NVOBJ_CLASS(dev, 0x0030, GR); /* null */
797 NVOBJ_CLASS(dev, 0x0039, GR); /* m2mf */
798 NVOBJ_CLASS(dev, 0x004a, GR); /* gdirect */
799 NVOBJ_CLASS(dev, 0x009f, GR); /* imageblit (nv12) */
800 NVOBJ_CLASS(dev, 0x008a, GR); /* ifc */
801 NVOBJ_CLASS(dev, 0x0089, GR); /* sifm */
802 NVOBJ_CLASS(dev, 0x0062, GR); /* surf2d */
803 NVOBJ_CLASS(dev, 0x0043, GR); /* rop */
804 NVOBJ_CLASS(dev, 0x0012, GR); /* beta1 */
805 NVOBJ_CLASS(dev, 0x0072, GR); /* beta4 */
806 NVOBJ_CLASS(dev, 0x0019, GR); /* cliprect */
807 NVOBJ_CLASS(dev, 0x0044, GR); /* pattern */
808 if (dev_priv->card_type == NV_20) {
809 NVOBJ_CLASS(dev, 0x009e, GR); /* swzsurf */
810 NVOBJ_CLASS(dev, 0x0096, GR); /* celcius */
811
812 /* kelvin */
813 if (dev_priv->chipset < 0x25)
814 NVOBJ_CLASS(dev, 0x0097, GR);
815 else
816 NVOBJ_CLASS(dev, 0x0597, GR);
817 } else {
818 NVOBJ_CLASS(dev, 0x038a, GR); /* ifc (nv30) */
819 NVOBJ_CLASS(dev, 0x0389, GR); /* sifm (nv30) */
820 NVOBJ_CLASS(dev, 0x0362, GR); /* surf2d (nv30) */
821 NVOBJ_CLASS(dev, 0x039e, GR); /* swzsurf */
822
823 /* rankine */
824 if (0x00000003 & (1 << (dev_priv->chipset & 0x0f)))
825 NVOBJ_CLASS(dev, 0x0397, GR);
826 else
827 if (0x00000010 & (1 << (dev_priv->chipset & 0x0f)))
828 NVOBJ_CLASS(dev, 0x0697, GR);
829 else
830 if (0x000001e0 & (1 << (dev_priv->chipset & 0x0f)))
831 NVOBJ_CLASS(dev, 0x0497, GR);
832 }
833
834 return 0;
835}
diff --git a/drivers/gpu/drm/nouveau/nv30_fb.c b/drivers/gpu/drm/nouveau/nv30_fb.c
index 4a3f2f095128..e0135f0e2144 100644
--- a/drivers/gpu/drm/nouveau/nv30_fb.c
+++ b/drivers/gpu/drm/nouveau/nv30_fb.c
@@ -29,6 +29,27 @@
29#include "nouveau_drv.h" 29#include "nouveau_drv.h"
30#include "nouveau_drm.h" 30#include "nouveau_drm.h"
31 31
32void
33nv30_fb_init_tile_region(struct drm_device *dev, int i, uint32_t addr,
34 uint32_t size, uint32_t pitch, uint32_t flags)
35{
36 struct drm_nouveau_private *dev_priv = dev->dev_private;
37 struct nouveau_tile_reg *tile = &dev_priv->tile.reg[i];
38
39 tile->addr = addr | 1;
40 tile->limit = max(1u, addr + size) - 1;
41 tile->pitch = pitch;
42}
43
44void
45nv30_fb_free_tile_region(struct drm_device *dev, int i)
46{
47 struct drm_nouveau_private *dev_priv = dev->dev_private;
48 struct nouveau_tile_reg *tile = &dev_priv->tile.reg[i];
49
50 tile->addr = tile->limit = tile->pitch = 0;
51}
52
32static int 53static int
33calc_bias(struct drm_device *dev, int k, int i, int j) 54calc_bias(struct drm_device *dev, int k, int i, int j)
34{ 55{
@@ -65,7 +86,7 @@ nv30_fb_init(struct drm_device *dev)
65 86
66 /* Turn all the tiling regions off. */ 87 /* Turn all the tiling regions off. */
67 for (i = 0; i < pfb->num_tiles; i++) 88 for (i = 0; i < pfb->num_tiles; i++)
68 pfb->set_region_tiling(dev, i, 0, 0, 0); 89 pfb->set_tile_region(dev, i);
69 90
70 /* Init the memory timing regs at 0x10037c/0x1003ac */ 91 /* Init the memory timing regs at 0x10037c/0x1003ac */
71 if (dev_priv->chipset == 0x30 || 92 if (dev_priv->chipset == 0x30 ||
diff --git a/drivers/gpu/drm/nouveau/nv40_fb.c b/drivers/gpu/drm/nouveau/nv40_fb.c
index 3cd07d8d5bd7..f0ac2a768c67 100644
--- a/drivers/gpu/drm/nouveau/nv40_fb.c
+++ b/drivers/gpu/drm/nouveau/nv40_fb.c
@@ -4,30 +4,73 @@
4#include "nouveau_drm.h" 4#include "nouveau_drm.h"
5 5
6void 6void
7nv40_fb_set_region_tiling(struct drm_device *dev, int i, uint32_t addr, 7nv40_fb_set_tile_region(struct drm_device *dev, int i)
8 uint32_t size, uint32_t pitch)
9{ 8{
10 struct drm_nouveau_private *dev_priv = dev->dev_private; 9 struct drm_nouveau_private *dev_priv = dev->dev_private;
11 uint32_t limit = max(1u, addr + size) - 1; 10 struct nouveau_tile_reg *tile = &dev_priv->tile.reg[i];
12
13 if (pitch)
14 addr |= 1;
15 11
16 switch (dev_priv->chipset) { 12 switch (dev_priv->chipset) {
17 case 0x40: 13 case 0x40:
18 nv_wr32(dev, NV10_PFB_TLIMIT(i), limit); 14 nv_wr32(dev, NV10_PFB_TLIMIT(i), tile->limit);
19 nv_wr32(dev, NV10_PFB_TSIZE(i), pitch); 15 nv_wr32(dev, NV10_PFB_TSIZE(i), tile->pitch);
20 nv_wr32(dev, NV10_PFB_TILE(i), addr); 16 nv_wr32(dev, NV10_PFB_TILE(i), tile->addr);
21 break; 17 break;
22 18
23 default: 19 default:
24 nv_wr32(dev, NV40_PFB_TLIMIT(i), limit); 20 nv_wr32(dev, NV40_PFB_TLIMIT(i), tile->limit);
25 nv_wr32(dev, NV40_PFB_TSIZE(i), pitch); 21 nv_wr32(dev, NV40_PFB_TSIZE(i), tile->pitch);
26 nv_wr32(dev, NV40_PFB_TILE(i), addr); 22 nv_wr32(dev, NV40_PFB_TILE(i), tile->addr);
27 break; 23 break;
28 } 24 }
29} 25}
30 26
27static void
28nv40_fb_init_gart(struct drm_device *dev)
29{
30 struct drm_nouveau_private *dev_priv = dev->dev_private;
31 struct nouveau_gpuobj *gart = dev_priv->gart_info.sg_ctxdma;
32
33 if (dev_priv->gart_info.type != NOUVEAU_GART_HW) {
34 nv_wr32(dev, 0x100800, 0x00000001);
35 return;
36 }
37
38 nv_wr32(dev, 0x100800, gart->pinst | 0x00000002);
39 nv_mask(dev, 0x10008c, 0x00000100, 0x00000100);
40 nv_wr32(dev, 0x100820, 0x00000000);
41}
42
43static void
44nv44_fb_init_gart(struct drm_device *dev)
45{
46 struct drm_nouveau_private *dev_priv = dev->dev_private;
47 struct nouveau_gpuobj *gart = dev_priv->gart_info.sg_ctxdma;
48 u32 vinst;
49
50 if (dev_priv->gart_info.type != NOUVEAU_GART_HW) {
51 nv_wr32(dev, 0x100850, 0x80000000);
52 nv_wr32(dev, 0x100800, 0x00000001);
53 return;
54 }
55
56 /* calculate vram address of this PRAMIN block, object
57 * must be allocated on 512KiB alignment, and not exceed
58 * a total size of 512KiB for this to work correctly
59 */
60 vinst = nv_rd32(dev, 0x10020c);
61 vinst -= ((gart->pinst >> 19) + 1) << 19;
62
63 nv_wr32(dev, 0x100850, 0x80000000);
64 nv_wr32(dev, 0x100818, dev_priv->gart_info.dummy.addr);
65
66 nv_wr32(dev, 0x100804, dev_priv->gart_info.aper_size);
67 nv_wr32(dev, 0x100850, 0x00008000);
68 nv_mask(dev, 0x10008c, 0x00000200, 0x00000200);
69 nv_wr32(dev, 0x100820, 0x00000000);
70 nv_wr32(dev, 0x10082c, 0x00000001);
71 nv_wr32(dev, 0x100800, vinst | 0x00000010);
72}
73
31int 74int
32nv40_fb_init(struct drm_device *dev) 75nv40_fb_init(struct drm_device *dev)
33{ 76{
@@ -36,12 +79,12 @@ nv40_fb_init(struct drm_device *dev)
36 uint32_t tmp; 79 uint32_t tmp;
37 int i; 80 int i;
38 81
39 /* This is strictly a NV4x register (don't know about NV5x). */ 82 if (dev_priv->chipset != 0x40 && dev_priv->chipset != 0x45) {
40 /* The blob sets these to all kinds of values, and they mess up our setup. */ 83 if (nv44_graph_class(dev))
41 /* I got value 0x52802 instead. For some cards the blob even sets it back to 0x1. */ 84 nv44_fb_init_gart(dev);
42 /* Note: the blob doesn't read this value, so i'm pretty sure this is safe for all cards. */ 85 else
43 /* Any idea what this is? */ 86 nv40_fb_init_gart(dev);
44 nv_wr32(dev, NV40_PFB_UNK_800, 0x1); 87 }
45 88
46 switch (dev_priv->chipset) { 89 switch (dev_priv->chipset) {
47 case 0x40: 90 case 0x40:
@@ -64,7 +107,7 @@ nv40_fb_init(struct drm_device *dev)
64 107
65 /* Turn all the tiling regions off. */ 108 /* Turn all the tiling regions off. */
66 for (i = 0; i < pfb->num_tiles; i++) 109 for (i = 0; i < pfb->num_tiles; i++)
67 pfb->set_region_tiling(dev, i, 0, 0, 0); 110 pfb->set_tile_region(dev, i);
68 111
69 return 0; 112 return 0;
70} 113}
diff --git a/drivers/gpu/drm/nouveau/nv40_fifo.c b/drivers/gpu/drm/nouveau/nv40_fifo.c
index 2b67f1835c39..68cb2d991c88 100644
--- a/drivers/gpu/drm/nouveau/nv40_fifo.c
+++ b/drivers/gpu/drm/nouveau/nv40_fifo.c
@@ -27,8 +27,9 @@
27#include "drmP.h" 27#include "drmP.h"
28#include "nouveau_drv.h" 28#include "nouveau_drv.h"
29#include "nouveau_drm.h" 29#include "nouveau_drm.h"
30#include "nouveau_ramht.h"
30 31
31#define NV40_RAMFC(c) (dev_priv->ramfc_offset + ((c) * NV40_RAMFC__SIZE)) 32#define NV40_RAMFC(c) (dev_priv->ramfc->pinst + ((c) * NV40_RAMFC__SIZE))
32#define NV40_RAMFC__SIZE 128 33#define NV40_RAMFC__SIZE 128
33 34
34int 35int
@@ -42,15 +43,20 @@ nv40_fifo_create_context(struct nouveau_channel *chan)
42 43
43 ret = nouveau_gpuobj_new_fake(dev, NV40_RAMFC(chan->id), ~0, 44 ret = nouveau_gpuobj_new_fake(dev, NV40_RAMFC(chan->id), ~0,
44 NV40_RAMFC__SIZE, NVOBJ_FLAG_ZERO_ALLOC | 45 NV40_RAMFC__SIZE, NVOBJ_FLAG_ZERO_ALLOC |
45 NVOBJ_FLAG_ZERO_FREE, NULL, &chan->ramfc); 46 NVOBJ_FLAG_ZERO_FREE, &chan->ramfc);
46 if (ret) 47 if (ret)
47 return ret; 48 return ret;
48 49
50 chan->user = ioremap(pci_resource_start(dev->pdev, 0) +
51 NV40_USER(chan->id), PAGE_SIZE);
52 if (!chan->user)
53 return -ENOMEM;
54
49 spin_lock_irqsave(&dev_priv->context_switch_lock, flags); 55 spin_lock_irqsave(&dev_priv->context_switch_lock, flags);
50 56
51 nv_wi32(dev, fc + 0, chan->pushbuf_base); 57 nv_wi32(dev, fc + 0, chan->pushbuf_base);
52 nv_wi32(dev, fc + 4, chan->pushbuf_base); 58 nv_wi32(dev, fc + 4, chan->pushbuf_base);
53 nv_wi32(dev, fc + 12, chan->pushbuf->instance >> 4); 59 nv_wi32(dev, fc + 12, chan->pushbuf->pinst >> 4);
54 nv_wi32(dev, fc + 24, NV_PFIFO_CACHE1_DMA_FETCH_TRIG_128_BYTES | 60 nv_wi32(dev, fc + 24, NV_PFIFO_CACHE1_DMA_FETCH_TRIG_128_BYTES |
55 NV_PFIFO_CACHE1_DMA_FETCH_SIZE_128_BYTES | 61 NV_PFIFO_CACHE1_DMA_FETCH_SIZE_128_BYTES |
56 NV_PFIFO_CACHE1_DMA_FETCH_MAX_REQS_8 | 62 NV_PFIFO_CACHE1_DMA_FETCH_MAX_REQS_8 |
@@ -58,7 +64,6 @@ nv40_fifo_create_context(struct nouveau_channel *chan)
58 NV_PFIFO_CACHE1_BIG_ENDIAN | 64 NV_PFIFO_CACHE1_BIG_ENDIAN |
59#endif 65#endif
60 0x30000000 /* no idea.. */); 66 0x30000000 /* no idea.. */);
61 nv_wi32(dev, fc + 56, chan->ramin_grctx->instance >> 4);
62 nv_wi32(dev, fc + 60, 0x0001FFFF); 67 nv_wi32(dev, fc + 60, 0x0001FFFF);
63 68
64 /* enable the fifo dma operation */ 69 /* enable the fifo dma operation */
@@ -69,18 +74,6 @@ nv40_fifo_create_context(struct nouveau_channel *chan)
69 return 0; 74 return 0;
70} 75}
71 76
72void
73nv40_fifo_destroy_context(struct nouveau_channel *chan)
74{
75 struct drm_device *dev = chan->dev;
76
77 nv_wr32(dev, NV04_PFIFO_MODE,
78 nv_rd32(dev, NV04_PFIFO_MODE) & ~(1 << chan->id));
79
80 if (chan->ramfc)
81 nouveau_gpuobj_ref_del(dev, &chan->ramfc);
82}
83
84static void 77static void
85nv40_fifo_do_load_context(struct drm_device *dev, int chid) 78nv40_fifo_do_load_context(struct drm_device *dev, int chid)
86{ 79{
@@ -122,6 +115,7 @@ nv40_fifo_do_load_context(struct drm_device *dev, int chid)
122 nv_wr32(dev, 0x32e8, nv_ri32(dev, fc + 68)); 115 nv_wr32(dev, 0x32e8, nv_ri32(dev, fc + 68));
123 nv_wr32(dev, 0x2088, nv_ri32(dev, fc + 76)); 116 nv_wr32(dev, 0x2088, nv_ri32(dev, fc + 76));
124 nv_wr32(dev, 0x3300, nv_ri32(dev, fc + 80)); 117 nv_wr32(dev, 0x3300, nv_ri32(dev, fc + 80));
118 nv_wr32(dev, 0x330c, nv_ri32(dev, fc + 84));
125 119
126 nv_wr32(dev, NV03_PFIFO_CACHE1_GET, 0); 120 nv_wr32(dev, NV03_PFIFO_CACHE1_GET, 0);
127 nv_wr32(dev, NV03_PFIFO_CACHE1_PUT, 0); 121 nv_wr32(dev, NV03_PFIFO_CACHE1_PUT, 0);
@@ -193,6 +187,7 @@ nv40_fifo_unload_context(struct drm_device *dev)
193 tmp |= (nv_rd32(dev, NV04_PFIFO_CACHE1_PUT) << 16); 187 tmp |= (nv_rd32(dev, NV04_PFIFO_CACHE1_PUT) << 16);
194 nv_wi32(dev, fc + 72, tmp); 188 nv_wi32(dev, fc + 72, tmp);
195#endif 189#endif
190 nv_wi32(dev, fc + 84, nv_rd32(dev, 0x330c));
196 191
197 nv40_fifo_do_load_context(dev, pfifo->channels - 1); 192 nv40_fifo_do_load_context(dev, pfifo->channels - 1);
198 nv_wr32(dev, NV03_PFIFO_CACHE1_PUSH1, 193 nv_wr32(dev, NV03_PFIFO_CACHE1_PUSH1,
@@ -241,9 +236,9 @@ nv40_fifo_init_ramxx(struct drm_device *dev)
241 struct drm_nouveau_private *dev_priv = dev->dev_private; 236 struct drm_nouveau_private *dev_priv = dev->dev_private;
242 237
243 nv_wr32(dev, NV03_PFIFO_RAMHT, (0x03 << 24) /* search 128 */ | 238 nv_wr32(dev, NV03_PFIFO_RAMHT, (0x03 << 24) /* search 128 */ |
244 ((dev_priv->ramht_bits - 9) << 16) | 239 ((dev_priv->ramht->bits - 9) << 16) |
245 (dev_priv->ramht_offset >> 8)); 240 (dev_priv->ramht->gpuobj->pinst >> 8));
246 nv_wr32(dev, NV03_PFIFO_RAMRO, dev_priv->ramro_offset>>8); 241 nv_wr32(dev, NV03_PFIFO_RAMRO, dev_priv->ramro->pinst >> 8);
247 242
248 switch (dev_priv->chipset) { 243 switch (dev_priv->chipset) {
249 case 0x47: 244 case 0x47:
@@ -271,7 +266,7 @@ nv40_fifo_init_ramxx(struct drm_device *dev)
271 nv_wr32(dev, 0x2230, 0); 266 nv_wr32(dev, 0x2230, 0);
272 nv_wr32(dev, NV40_PFIFO_RAMFC, 267 nv_wr32(dev, NV40_PFIFO_RAMFC,
273 ((dev_priv->vram_size - 512 * 1024 + 268 ((dev_priv->vram_size - 512 * 1024 +
274 dev_priv->ramfc_offset) >> 16) | (3 << 16)); 269 dev_priv->ramfc->pinst) >> 16) | (3 << 16));
275 break; 270 break;
276 } 271 }
277} 272}
@@ -279,6 +274,7 @@ nv40_fifo_init_ramxx(struct drm_device *dev)
279static void 274static void
280nv40_fifo_init_intr(struct drm_device *dev) 275nv40_fifo_init_intr(struct drm_device *dev)
281{ 276{
277 nouveau_irq_register(dev, 8, nv04_fifo_isr);
282 nv_wr32(dev, 0x002100, 0xffffffff); 278 nv_wr32(dev, 0x002100, 0xffffffff);
283 nv_wr32(dev, 0x002140, 0xffffffff); 279 nv_wr32(dev, 0x002140, 0xffffffff);
284} 280}
@@ -301,7 +297,7 @@ nv40_fifo_init(struct drm_device *dev)
301 pfifo->reassign(dev, true); 297 pfifo->reassign(dev, true);
302 298
303 for (i = 0; i < dev_priv->engine.fifo.channels; i++) { 299 for (i = 0; i < dev_priv->engine.fifo.channels; i++) {
304 if (dev_priv->fifos[i]) { 300 if (dev_priv->channels.ptr[i]) {
305 uint32_t mode = nv_rd32(dev, NV04_PFIFO_MODE); 301 uint32_t mode = nv_rd32(dev, NV04_PFIFO_MODE);
306 nv_wr32(dev, NV04_PFIFO_MODE, mode | (1 << i)); 302 nv_wr32(dev, NV04_PFIFO_MODE, mode | (1 << i));
307 } 303 }
diff --git a/drivers/gpu/drm/nouveau/nv40_graph.c b/drivers/gpu/drm/nouveau/nv40_graph.c
index fd7d2b501316..5beb01b8ace1 100644
--- a/drivers/gpu/drm/nouveau/nv40_graph.c
+++ b/drivers/gpu/drm/nouveau/nv40_graph.c
@@ -28,11 +28,18 @@
28#include "drm.h" 28#include "drm.h"
29#include "nouveau_drv.h" 29#include "nouveau_drv.h"
30#include "nouveau_grctx.h" 30#include "nouveau_grctx.h"
31#include "nouveau_ramht.h"
31 32
32struct nouveau_channel * 33struct nv40_graph_engine {
34 struct nouveau_exec_engine base;
35 u32 grctx_size;
36};
37
38static struct nouveau_channel *
33nv40_graph_channel(struct drm_device *dev) 39nv40_graph_channel(struct drm_device *dev)
34{ 40{
35 struct drm_nouveau_private *dev_priv = dev->dev_private; 41 struct drm_nouveau_private *dev_priv = dev->dev_private;
42 struct nouveau_gpuobj *grctx;
36 uint32_t inst; 43 uint32_t inst;
37 int i; 44 int i;
38 45
@@ -42,48 +49,17 @@ nv40_graph_channel(struct drm_device *dev)
42 inst = (inst & NV40_PGRAPH_CTXCTL_CUR_INSTANCE) << 4; 49 inst = (inst & NV40_PGRAPH_CTXCTL_CUR_INSTANCE) << 4;
43 50
44 for (i = 0; i < dev_priv->engine.fifo.channels; i++) { 51 for (i = 0; i < dev_priv->engine.fifo.channels; i++) {
45 struct nouveau_channel *chan = dev_priv->fifos[i]; 52 if (!dev_priv->channels.ptr[i])
53 continue;
46 54
47 if (chan && chan->ramin_grctx && 55 grctx = dev_priv->channels.ptr[i]->engctx[NVOBJ_ENGINE_GR];
48 chan->ramin_grctx->instance == inst) 56 if (grctx && grctx->pinst == inst)
49 return chan; 57 return dev_priv->channels.ptr[i];
50 } 58 }
51 59
52 return NULL; 60 return NULL;
53} 61}
54 62
55int
56nv40_graph_create_context(struct nouveau_channel *chan)
57{
58 struct drm_device *dev = chan->dev;
59 struct drm_nouveau_private *dev_priv = dev->dev_private;
60 struct nouveau_pgraph_engine *pgraph = &dev_priv->engine.graph;
61 struct nouveau_grctx ctx = {};
62 int ret;
63
64 ret = nouveau_gpuobj_new_ref(dev, chan, NULL, 0, pgraph->grctx_size,
65 16, NVOBJ_FLAG_ZERO_ALLOC,
66 &chan->ramin_grctx);
67 if (ret)
68 return ret;
69
70 /* Initialise default context values */
71 ctx.dev = chan->dev;
72 ctx.mode = NOUVEAU_GRCTX_VALS;
73 ctx.data = chan->ramin_grctx->gpuobj;
74 nv40_grctx_init(&ctx);
75
76 nv_wo32(dev, chan->ramin_grctx->gpuobj, 0,
77 chan->ramin_grctx->gpuobj->im_pramin->start);
78 return 0;
79}
80
81void
82nv40_graph_destroy_context(struct nouveau_channel *chan)
83{
84 nouveau_gpuobj_ref_del(chan->dev, &chan->ramin_grctx);
85}
86
87static int 63static int
88nv40_graph_transfer_context(struct drm_device *dev, uint32_t inst, int save) 64nv40_graph_transfer_context(struct drm_device *dev, uint32_t inst, int save)
89{ 65{
@@ -125,94 +101,153 @@ nv40_graph_transfer_context(struct drm_device *dev, uint32_t inst, int save)
125 return 0; 101 return 0;
126} 102}
127 103
128/* Restore the context for a specific channel into PGRAPH */ 104static int
129int 105nv40_graph_unload_context(struct drm_device *dev)
130nv40_graph_load_context(struct nouveau_channel *chan)
131{ 106{
132 struct drm_device *dev = chan->dev;
133 uint32_t inst; 107 uint32_t inst;
134 int ret; 108 int ret;
135 109
136 if (!chan->ramin_grctx) 110 inst = nv_rd32(dev, NV40_PGRAPH_CTXCTL_CUR);
137 return -EINVAL; 111 if (!(inst & NV40_PGRAPH_CTXCTL_CUR_LOADED))
138 inst = chan->ramin_grctx->instance >> 4; 112 return 0;
113 inst &= NV40_PGRAPH_CTXCTL_CUR_INSTANCE;
139 114
140 ret = nv40_graph_transfer_context(dev, inst, 0); 115 ret = nv40_graph_transfer_context(dev, inst, 1);
116
117 nv_wr32(dev, NV40_PGRAPH_CTXCTL_CUR, inst);
118 return ret;
119}
120
121static int
122nv40_graph_context_new(struct nouveau_channel *chan, int engine)
123{
124 struct nv40_graph_engine *pgraph = nv_engine(chan->dev, engine);
125 struct drm_device *dev = chan->dev;
126 struct drm_nouveau_private *dev_priv = dev->dev_private;
127 struct nouveau_gpuobj *grctx = NULL;
128 struct nouveau_grctx ctx = {};
129 unsigned long flags;
130 int ret;
131
132 ret = nouveau_gpuobj_new(dev, NULL, pgraph->grctx_size, 16,
133 NVOBJ_FLAG_ZERO_ALLOC, &grctx);
141 if (ret) 134 if (ret)
142 return ret; 135 return ret;
143 136
144 /* 0x40032C, no idea of it's exact function. Could simply be a 137 /* Initialise default context values */
145 * record of the currently active PGRAPH context. It's currently 138 ctx.dev = chan->dev;
146 * unknown as to what bit 24 does. The nv ddx has it set, so we will 139 ctx.mode = NOUVEAU_GRCTX_VALS;
147 * set it here too. 140 ctx.data = grctx;
148 */ 141 nv40_grctx_init(&ctx);
149 nv_wr32(dev, NV20_PGRAPH_CHANNEL_CTX_POINTER, inst); 142
150 nv_wr32(dev, NV40_PGRAPH_CTXCTL_CUR, 143 nv_wo32(grctx, 0, grctx->vinst);
151 (inst & NV40_PGRAPH_CTXCTL_CUR_INSTANCE) | 144
152 NV40_PGRAPH_CTXCTL_CUR_LOADED); 145 /* init grctx pointer in ramfc, and on PFIFO if channel is
153 /* 0x32E0 records the instance address of the active FIFO's PGRAPH 146 * already active there
154 * context. If at any time this doesn't match 0x40032C, you will
155 * recieve PGRAPH_INTR_CONTEXT_SWITCH
156 */ 147 */
157 nv_wr32(dev, NV40_PFIFO_GRCTX_INSTANCE, inst); 148 spin_lock_irqsave(&dev_priv->context_switch_lock, flags);
149 nv_wo32(chan->ramfc, 0x38, grctx->vinst >> 4);
150 nv_mask(dev, 0x002500, 0x00000001, 0x00000000);
151 if ((nv_rd32(dev, 0x003204) & 0x0000001f) == chan->id)
152 nv_wr32(dev, 0x0032e0, grctx->vinst >> 4);
153 nv_mask(dev, 0x002500, 0x00000001, 0x00000001);
154 spin_unlock_irqrestore(&dev_priv->context_switch_lock, flags);
155
156 chan->engctx[engine] = grctx;
158 return 0; 157 return 0;
159} 158}
160 159
161int 160static void
162nv40_graph_unload_context(struct drm_device *dev) 161nv40_graph_context_del(struct nouveau_channel *chan, int engine)
163{ 162{
164 uint32_t inst; 163 struct nouveau_gpuobj *grctx = chan->engctx[engine];
165 int ret; 164 struct drm_device *dev = chan->dev;
165 struct drm_nouveau_private *dev_priv = dev->dev_private;
166 unsigned long flags;
166 167
167 inst = nv_rd32(dev, NV40_PGRAPH_CTXCTL_CUR); 168 spin_lock_irqsave(&dev_priv->context_switch_lock, flags);
168 if (!(inst & NV40_PGRAPH_CTXCTL_CUR_LOADED)) 169 nv04_graph_fifo_access(dev, false);
169 return 0;
170 inst &= NV40_PGRAPH_CTXCTL_CUR_INSTANCE;
171 170
172 ret = nv40_graph_transfer_context(dev, inst, 1); 171 /* Unload the context if it's the currently active one */
172 if (nv40_graph_channel(dev) == chan)
173 nv40_graph_unload_context(dev);
173 174
174 nv_wr32(dev, NV40_PGRAPH_CTXCTL_CUR, inst); 175 nv04_graph_fifo_access(dev, true);
176 spin_unlock_irqrestore(&dev_priv->context_switch_lock, flags);
177
178 /* Free the context resources */
179 nouveau_gpuobj_ref(NULL, &grctx);
180 chan->engctx[engine] = NULL;
181}
182
183int
184nv40_graph_object_new(struct nouveau_channel *chan, int engine,
185 u32 handle, u16 class)
186{
187 struct drm_device *dev = chan->dev;
188 struct nouveau_gpuobj *obj = NULL;
189 int ret;
190
191 ret = nouveau_gpuobj_new(dev, chan, 20, 16, NVOBJ_FLAG_ZERO_FREE, &obj);
192 if (ret)
193 return ret;
194 obj->engine = 1;
195 obj->class = class;
196
197 nv_wo32(obj, 0x00, class);
198 nv_wo32(obj, 0x04, 0x00000000);
199#ifndef __BIG_ENDIAN
200 nv_wo32(obj, 0x08, 0x00000000);
201#else
202 nv_wo32(obj, 0x08, 0x01000000);
203#endif
204 nv_wo32(obj, 0x0c, 0x00000000);
205 nv_wo32(obj, 0x10, 0x00000000);
206
207 ret = nouveau_ramht_insert(chan, handle, obj);
208 nouveau_gpuobj_ref(NULL, &obj);
175 return ret; 209 return ret;
176} 210}
177 211
178void 212static void
179nv40_graph_set_region_tiling(struct drm_device *dev, int i, uint32_t addr, 213nv40_graph_set_tile_region(struct drm_device *dev, int i)
180 uint32_t size, uint32_t pitch)
181{ 214{
182 struct drm_nouveau_private *dev_priv = dev->dev_private; 215 struct drm_nouveau_private *dev_priv = dev->dev_private;
183 uint32_t limit = max(1u, addr + size) - 1; 216 struct nouveau_tile_reg *tile = &dev_priv->tile.reg[i];
184
185 if (pitch)
186 addr |= 1;
187 217
188 switch (dev_priv->chipset) { 218 switch (dev_priv->chipset) {
219 case 0x40:
220 case 0x41: /* guess */
221 case 0x42:
222 case 0x43:
223 case 0x45: /* guess */
224 case 0x4e:
225 nv_wr32(dev, NV20_PGRAPH_TSIZE(i), tile->pitch);
226 nv_wr32(dev, NV20_PGRAPH_TLIMIT(i), tile->limit);
227 nv_wr32(dev, NV20_PGRAPH_TILE(i), tile->addr);
228 nv_wr32(dev, NV40_PGRAPH_TSIZE1(i), tile->pitch);
229 nv_wr32(dev, NV40_PGRAPH_TLIMIT1(i), tile->limit);
230 nv_wr32(dev, NV40_PGRAPH_TILE1(i), tile->addr);
231 break;
189 case 0x44: 232 case 0x44:
190 case 0x4a: 233 case 0x4a:
191 case 0x4e: 234 nv_wr32(dev, NV20_PGRAPH_TSIZE(i), tile->pitch);
192 nv_wr32(dev, NV20_PGRAPH_TSIZE(i), pitch); 235 nv_wr32(dev, NV20_PGRAPH_TLIMIT(i), tile->limit);
193 nv_wr32(dev, NV20_PGRAPH_TLIMIT(i), limit); 236 nv_wr32(dev, NV20_PGRAPH_TILE(i), tile->addr);
194 nv_wr32(dev, NV20_PGRAPH_TILE(i), addr);
195 break; 237 break;
196
197 case 0x46: 238 case 0x46:
198 case 0x47: 239 case 0x47:
199 case 0x49: 240 case 0x49:
200 case 0x4b: 241 case 0x4b:
201 nv_wr32(dev, NV47_PGRAPH_TSIZE(i), pitch); 242 case 0x4c:
202 nv_wr32(dev, NV47_PGRAPH_TLIMIT(i), limit); 243 case 0x67:
203 nv_wr32(dev, NV47_PGRAPH_TILE(i), addr);
204 nv_wr32(dev, NV40_PGRAPH_TSIZE1(i), pitch);
205 nv_wr32(dev, NV40_PGRAPH_TLIMIT1(i), limit);
206 nv_wr32(dev, NV40_PGRAPH_TILE1(i), addr);
207 break;
208
209 default: 244 default:
210 nv_wr32(dev, NV20_PGRAPH_TSIZE(i), pitch); 245 nv_wr32(dev, NV47_PGRAPH_TSIZE(i), tile->pitch);
211 nv_wr32(dev, NV20_PGRAPH_TLIMIT(i), limit); 246 nv_wr32(dev, NV47_PGRAPH_TLIMIT(i), tile->limit);
212 nv_wr32(dev, NV20_PGRAPH_TILE(i), addr); 247 nv_wr32(dev, NV47_PGRAPH_TILE(i), tile->addr);
213 nv_wr32(dev, NV40_PGRAPH_TSIZE1(i), pitch); 248 nv_wr32(dev, NV40_PGRAPH_TSIZE1(i), tile->pitch);
214 nv_wr32(dev, NV40_PGRAPH_TLIMIT1(i), limit); 249 nv_wr32(dev, NV40_PGRAPH_TLIMIT1(i), tile->limit);
215 nv_wr32(dev, NV40_PGRAPH_TILE1(i), addr); 250 nv_wr32(dev, NV40_PGRAPH_TILE1(i), tile->addr);
216 break; 251 break;
217 } 252 }
218} 253}
@@ -227,10 +262,10 @@ nv40_graph_set_region_tiling(struct drm_device *dev, int i, uint32_t addr,
227 * C51 0x4e 262 * C51 0x4e
228 */ 263 */
229int 264int
230nv40_graph_init(struct drm_device *dev) 265nv40_graph_init(struct drm_device *dev, int engine)
231{ 266{
232 struct drm_nouveau_private *dev_priv = 267 struct nv40_graph_engine *pgraph = nv_engine(dev, engine);
233 (struct drm_nouveau_private *)dev->dev_private; 268 struct drm_nouveau_private *dev_priv = dev->dev_private;
234 struct nouveau_fb_engine *pfb = &dev_priv->engine.fb; 269 struct nouveau_fb_engine *pfb = &dev_priv->engine.fb;
235 struct nouveau_grctx ctx = {}; 270 struct nouveau_grctx ctx = {};
236 uint32_t vramsz, *cp; 271 uint32_t vramsz, *cp;
@@ -250,7 +285,7 @@ nv40_graph_init(struct drm_device *dev)
250 ctx.data = cp; 285 ctx.data = cp;
251 ctx.ctxprog_max = 256; 286 ctx.ctxprog_max = 256;
252 nv40_grctx_init(&ctx); 287 nv40_grctx_init(&ctx);
253 dev_priv->engine.graph.grctx_size = ctx.ctxvals_pos * 4; 288 pgraph->grctx_size = ctx.ctxvals_pos * 4;
254 289
255 nv_wr32(dev, NV40_PGRAPH_CTXCTL_UCODE_INDEX, 0); 290 nv_wr32(dev, NV40_PGRAPH_CTXCTL_UCODE_INDEX, 0);
256 for (i = 0; i < ctx.ctxprog_len; i++) 291 for (i = 0; i < ctx.ctxprog_len; i++)
@@ -349,7 +384,7 @@ nv40_graph_init(struct drm_device *dev)
349 384
350 /* Turn all the tiling regions off. */ 385 /* Turn all the tiling regions off. */
351 for (i = 0; i < pfb->num_tiles; i++) 386 for (i = 0; i < pfb->num_tiles; i++)
352 nv40_graph_set_region_tiling(dev, i, 0, 0, 0); 387 nv40_graph_set_tile_region(dev, i);
353 388
354 /* begin RAM config */ 389 /* begin RAM config */
355 vramsz = pci_resource_len(dev->pdev, 0) - 1; 390 vramsz = pci_resource_len(dev->pdev, 0) - 1;
@@ -366,17 +401,20 @@ nv40_graph_init(struct drm_device *dev)
366 break; 401 break;
367 default: 402 default:
368 switch (dev_priv->chipset) { 403 switch (dev_priv->chipset) {
369 case 0x46: 404 case 0x41:
370 case 0x47: 405 case 0x42:
371 case 0x49: 406 case 0x43:
372 case 0x4b: 407 case 0x45:
373 nv_wr32(dev, 0x400DF0, nv_rd32(dev, NV04_PFB_CFG0)); 408 case 0x4e:
374 nv_wr32(dev, 0x400DF4, nv_rd32(dev, NV04_PFB_CFG1)); 409 case 0x44:
375 break; 410 case 0x4a:
376 default:
377 nv_wr32(dev, 0x4009F0, nv_rd32(dev, NV04_PFB_CFG0)); 411 nv_wr32(dev, 0x4009F0, nv_rd32(dev, NV04_PFB_CFG0));
378 nv_wr32(dev, 0x4009F4, nv_rd32(dev, NV04_PFB_CFG1)); 412 nv_wr32(dev, 0x4009F4, nv_rd32(dev, NV04_PFB_CFG1));
379 break; 413 break;
414 default:
415 nv_wr32(dev, 0x400DF0, nv_rd32(dev, NV04_PFB_CFG0));
416 nv_wr32(dev, 0x400DF4, nv_rd32(dev, NV04_PFB_CFG1));
417 break;
380 } 418 }
381 nv_wr32(dev, 0x4069F0, nv_rd32(dev, NV04_PFB_CFG0)); 419 nv_wr32(dev, 0x4069F0, nv_rd32(dev, NV04_PFB_CFG0));
382 nv_wr32(dev, 0x4069F4, nv_rd32(dev, NV04_PFB_CFG1)); 420 nv_wr32(dev, 0x4069F4, nv_rd32(dev, NV04_PFB_CFG1));
@@ -390,28 +428,135 @@ nv40_graph_init(struct drm_device *dev)
390 return 0; 428 return 0;
391} 429}
392 430
393void nv40_graph_takedown(struct drm_device *dev) 431static int
432nv40_graph_fini(struct drm_device *dev, int engine)
394{ 433{
434 nv40_graph_unload_context(dev);
435 return 0;
395} 436}
396 437
397struct nouveau_pgraph_object_class nv40_graph_grclass[] = { 438static int
398 { 0x0030, false, NULL }, /* null */ 439nv40_graph_isr_chid(struct drm_device *dev, u32 inst)
399 { 0x0039, false, NULL }, /* m2mf */ 440{
400 { 0x004a, false, NULL }, /* gdirect */ 441 struct drm_nouveau_private *dev_priv = dev->dev_private;
401 { 0x009f, false, NULL }, /* imageblit (nv12) */ 442 struct nouveau_gpuobj *grctx;
402 { 0x008a, false, NULL }, /* ifc */ 443 unsigned long flags;
403 { 0x0089, false, NULL }, /* sifm */ 444 int i;
404 { 0x3089, false, NULL }, /* sifm (nv40) */ 445
405 { 0x0062, false, NULL }, /* surf2d */ 446 spin_lock_irqsave(&dev_priv->channels.lock, flags);
406 { 0x3062, false, NULL }, /* surf2d (nv40) */ 447 for (i = 0; i < dev_priv->engine.fifo.channels; i++) {
407 { 0x0043, false, NULL }, /* rop */ 448 if (!dev_priv->channels.ptr[i])
408 { 0x0012, false, NULL }, /* beta1 */ 449 continue;
409 { 0x0072, false, NULL }, /* beta4 */ 450 grctx = dev_priv->channels.ptr[i]->engctx[NVOBJ_ENGINE_GR];
410 { 0x0019, false, NULL }, /* cliprect */
411 { 0x0044, false, NULL }, /* pattern */
412 { 0x309e, false, NULL }, /* swzsurf */
413 { 0x4097, false, NULL }, /* curie (nv40) */
414 { 0x4497, false, NULL }, /* curie (nv44) */
415 {}
416};
417 451
452 if (grctx && grctx->pinst == inst)
453 break;
454 }
455 spin_unlock_irqrestore(&dev_priv->channels.lock, flags);
456 return i;
457}
458
459static void
460nv40_graph_isr(struct drm_device *dev)
461{
462 u32 stat;
463
464 while ((stat = nv_rd32(dev, NV03_PGRAPH_INTR))) {
465 u32 nsource = nv_rd32(dev, NV03_PGRAPH_NSOURCE);
466 u32 nstatus = nv_rd32(dev, NV03_PGRAPH_NSTATUS);
467 u32 inst = (nv_rd32(dev, 0x40032c) & 0x000fffff) << 4;
468 u32 chid = nv40_graph_isr_chid(dev, inst);
469 u32 addr = nv_rd32(dev, NV04_PGRAPH_TRAPPED_ADDR);
470 u32 subc = (addr & 0x00070000) >> 16;
471 u32 mthd = (addr & 0x00001ffc);
472 u32 data = nv_rd32(dev, NV04_PGRAPH_TRAPPED_DATA);
473 u32 class = nv_rd32(dev, 0x400160 + subc * 4) & 0xffff;
474 u32 show = stat;
475
476 if (stat & NV_PGRAPH_INTR_ERROR) {
477 if (nsource & NV03_PGRAPH_NSOURCE_ILLEGAL_MTHD) {
478 if (!nouveau_gpuobj_mthd_call2(dev, chid, class, mthd, data))
479 show &= ~NV_PGRAPH_INTR_ERROR;
480 } else
481 if (nsource & NV03_PGRAPH_NSOURCE_DMA_VTX_PROTECTION) {
482 nv_mask(dev, 0x402000, 0, 0);
483 }
484 }
485
486 nv_wr32(dev, NV03_PGRAPH_INTR, stat);
487 nv_wr32(dev, NV04_PGRAPH_FIFO, 0x00000001);
488
489 if (show && nouveau_ratelimit()) {
490 NV_INFO(dev, "PGRAPH -");
491 nouveau_bitfield_print(nv10_graph_intr, show);
492 printk(" nsource:");
493 nouveau_bitfield_print(nv04_graph_nsource, nsource);
494 printk(" nstatus:");
495 nouveau_bitfield_print(nv10_graph_nstatus, nstatus);
496 printk("\n");
497 NV_INFO(dev, "PGRAPH - ch %d (0x%08x) subc %d "
498 "class 0x%04x mthd 0x%04x data 0x%08x\n",
499 chid, inst, subc, class, mthd, data);
500 }
501 }
502}
503
504static void
505nv40_graph_destroy(struct drm_device *dev, int engine)
506{
507 struct nv40_graph_engine *pgraph = nv_engine(dev, engine);
508
509 nouveau_irq_unregister(dev, 12);
510
511 NVOBJ_ENGINE_DEL(dev, GR);
512 kfree(pgraph);
513}
514
515int
516nv40_graph_create(struct drm_device *dev)
517{
518 struct nv40_graph_engine *pgraph;
519
520 pgraph = kzalloc(sizeof(*pgraph), GFP_KERNEL);
521 if (!pgraph)
522 return -ENOMEM;
523
524 pgraph->base.destroy = nv40_graph_destroy;
525 pgraph->base.init = nv40_graph_init;
526 pgraph->base.fini = nv40_graph_fini;
527 pgraph->base.context_new = nv40_graph_context_new;
528 pgraph->base.context_del = nv40_graph_context_del;
529 pgraph->base.object_new = nv40_graph_object_new;
530 pgraph->base.set_tile_region = nv40_graph_set_tile_region;
531
532 NVOBJ_ENGINE_ADD(dev, GR, &pgraph->base);
533 nouveau_irq_register(dev, 12, nv40_graph_isr);
534
535 NVOBJ_CLASS(dev, 0x506e, SW); /* nvsw */
536 NVOBJ_CLASS(dev, 0x0030, GR); /* null */
537 NVOBJ_CLASS(dev, 0x0039, GR); /* m2mf */
538 NVOBJ_CLASS(dev, 0x004a, GR); /* gdirect */
539 NVOBJ_CLASS(dev, 0x009f, GR); /* imageblit (nv12) */
540 NVOBJ_CLASS(dev, 0x008a, GR); /* ifc */
541 NVOBJ_CLASS(dev, 0x0089, GR); /* sifm */
542 NVOBJ_CLASS(dev, 0x3089, GR); /* sifm (nv40) */
543 NVOBJ_CLASS(dev, 0x0062, GR); /* surf2d */
544 NVOBJ_CLASS(dev, 0x3062, GR); /* surf2d (nv40) */
545 NVOBJ_CLASS(dev, 0x0043, GR); /* rop */
546 NVOBJ_CLASS(dev, 0x0012, GR); /* beta1 */
547 NVOBJ_CLASS(dev, 0x0072, GR); /* beta4 */
548 NVOBJ_CLASS(dev, 0x0019, GR); /* cliprect */
549 NVOBJ_CLASS(dev, 0x0044, GR); /* pattern */
550 NVOBJ_CLASS(dev, 0x309e, GR); /* swzsurf */
551
552 /* curie */
553 if (nv44_graph_class(dev))
554 NVOBJ_CLASS(dev, 0x4497, GR);
555 else
556 NVOBJ_CLASS(dev, 0x4097, GR);
557
558 /* nvsw */
559 NVOBJ_CLASS(dev, 0x506e, SW);
560 NVOBJ_MTHD (dev, 0x506e, 0x0500, nv04_graph_mthd_page_flip);
561 return 0;
562}
diff --git a/drivers/gpu/drm/nouveau/nv40_grctx.c b/drivers/gpu/drm/nouveau/nv40_grctx.c
index 9b5c97469588..f70447d131d7 100644
--- a/drivers/gpu/drm/nouveau/nv40_grctx.c
+++ b/drivers/gpu/drm/nouveau/nv40_grctx.c
@@ -118,17 +118,6 @@
118 */ 118 */
119 119
120static int 120static int
121nv40_graph_4097(struct drm_device *dev)
122{
123 struct drm_nouveau_private *dev_priv = dev->dev_private;
124
125 if ((dev_priv->chipset & 0xf0) == 0x60)
126 return 0;
127
128 return !!(0x0baf & (1 << dev_priv->chipset));
129}
130
131static int
132nv40_graph_vs_count(struct drm_device *dev) 121nv40_graph_vs_count(struct drm_device *dev)
133{ 122{
134 struct drm_nouveau_private *dev_priv = dev->dev_private; 123 struct drm_nouveau_private *dev_priv = dev->dev_private;
@@ -219,7 +208,7 @@ nv40_graph_construct_general(struct nouveau_grctx *ctx)
219 gr_def(ctx, 0x4009dc, 0x80000000); 208 gr_def(ctx, 0x4009dc, 0x80000000);
220 } else { 209 } else {
221 cp_ctx(ctx, 0x400840, 20); 210 cp_ctx(ctx, 0x400840, 20);
222 if (!nv40_graph_4097(ctx->dev)) { 211 if (nv44_graph_class(ctx->dev)) {
223 for (i = 0; i < 8; i++) 212 for (i = 0; i < 8; i++)
224 gr_def(ctx, 0x400860 + (i * 4), 0x00000001); 213 gr_def(ctx, 0x400860 + (i * 4), 0x00000001);
225 } 214 }
@@ -228,7 +217,7 @@ nv40_graph_construct_general(struct nouveau_grctx *ctx)
228 gr_def(ctx, 0x400888, 0x00000040); 217 gr_def(ctx, 0x400888, 0x00000040);
229 cp_ctx(ctx, 0x400894, 11); 218 cp_ctx(ctx, 0x400894, 11);
230 gr_def(ctx, 0x400894, 0x00000040); 219 gr_def(ctx, 0x400894, 0x00000040);
231 if (nv40_graph_4097(ctx->dev)) { 220 if (!nv44_graph_class(ctx->dev)) {
232 for (i = 0; i < 8; i++) 221 for (i = 0; i < 8; i++)
233 gr_def(ctx, 0x4008a0 + (i * 4), 0x80000000); 222 gr_def(ctx, 0x4008a0 + (i * 4), 0x80000000);
234 } 223 }
@@ -546,7 +535,7 @@ nv40_graph_construct_state3d_2(struct nouveau_grctx *ctx)
546static void 535static void
547nv40_graph_construct_state3d_3(struct nouveau_grctx *ctx) 536nv40_graph_construct_state3d_3(struct nouveau_grctx *ctx)
548{ 537{
549 int len = nv40_graph_4097(ctx->dev) ? 0x0684 : 0x0084; 538 int len = nv44_graph_class(ctx->dev) ? 0x0084 : 0x0684;
550 539
551 cp_out (ctx, 0x300000); 540 cp_out (ctx, 0x300000);
552 cp_lsr (ctx, len - 4); 541 cp_lsr (ctx, len - 4);
@@ -582,11 +571,11 @@ nv40_graph_construct_shader(struct nouveau_grctx *ctx)
582 } else { 571 } else {
583 b0_offset = 0x1d40/4; /* 2200 */ 572 b0_offset = 0x1d40/4; /* 2200 */
584 b1_offset = 0x3f40/4; /* 0b00 : 0a40 */ 573 b1_offset = 0x3f40/4; /* 0b00 : 0a40 */
585 vs_len = nv40_graph_4097(dev) ? 0x4a40/4 : 0x4980/4; 574 vs_len = nv44_graph_class(dev) ? 0x4980/4 : 0x4a40/4;
586 } 575 }
587 576
588 cp_lsr(ctx, vs_len * vs_nr + 0x300/4); 577 cp_lsr(ctx, vs_len * vs_nr + 0x300/4);
589 cp_out(ctx, nv40_graph_4097(dev) ? 0x800041 : 0x800029); 578 cp_out(ctx, nv44_graph_class(dev) ? 0x800029 : 0x800041);
590 579
591 offset = ctx->ctxvals_pos; 580 offset = ctx->ctxvals_pos;
592 ctx->ctxvals_pos += (0x0300/4 + (vs_nr * vs_len)); 581 ctx->ctxvals_pos += (0x0300/4 + (vs_nr * vs_len));
@@ -596,13 +585,13 @@ nv40_graph_construct_shader(struct nouveau_grctx *ctx)
596 585
597 offset += 0x0280/4; 586 offset += 0x0280/4;
598 for (i = 0; i < 16; i++, offset += 2) 587 for (i = 0; i < 16; i++, offset += 2)
599 nv_wo32(dev, obj, offset, 0x3f800000); 588 nv_wo32(obj, offset * 4, 0x3f800000);
600 589
601 for (vs = 0; vs < vs_nr; vs++, offset += vs_len) { 590 for (vs = 0; vs < vs_nr; vs++, offset += vs_len) {
602 for (i = 0; i < vs_nr_b0 * 6; i += 6) 591 for (i = 0; i < vs_nr_b0 * 6; i += 6)
603 nv_wo32(dev, obj, offset + b0_offset + i, 0x00000001); 592 nv_wo32(obj, (offset + b0_offset + i) * 4, 0x00000001);
604 for (i = 0; i < vs_nr_b1 * 4; i += 4) 593 for (i = 0; i < vs_nr_b1 * 4; i += 4)
605 nv_wo32(dev, obj, offset + b1_offset + i, 0x3f800000); 594 nv_wo32(obj, (offset + b1_offset + i) * 4, 0x3f800000);
606 } 595 }
607} 596}
608 597
diff --git a/drivers/gpu/drm/nouveau/nv40_mc.c b/drivers/gpu/drm/nouveau/nv40_mc.c
index e4e72c12ab6a..03c0d4c3f355 100644
--- a/drivers/gpu/drm/nouveau/nv40_mc.c
+++ b/drivers/gpu/drm/nouveau/nv40_mc.c
@@ -6,27 +6,17 @@
6int 6int
7nv40_mc_init(struct drm_device *dev) 7nv40_mc_init(struct drm_device *dev)
8{ 8{
9 struct drm_nouveau_private *dev_priv = dev->dev_private;
10 uint32_t tmp;
11
12 /* Power up everything, resetting each individual unit will 9 /* Power up everything, resetting each individual unit will
13 * be done later if needed. 10 * be done later if needed.
14 */ 11 */
15 nv_wr32(dev, NV03_PMC_ENABLE, 0xFFFFFFFF); 12 nv_wr32(dev, NV03_PMC_ENABLE, 0xFFFFFFFF);
16 13
17 switch (dev_priv->chipset) { 14 if (nv44_graph_class(dev)) {
18 case 0x44: 15 u32 tmp = nv_rd32(dev, NV04_PFB_FIFO_DATA);
19 case 0x46: /* G72 */
20 case 0x4e:
21 case 0x4c: /* C51_G7X */
22 tmp = nv_rd32(dev, NV04_PFB_FIFO_DATA);
23 nv_wr32(dev, NV40_PMC_1700, tmp); 16 nv_wr32(dev, NV40_PMC_1700, tmp);
24 nv_wr32(dev, NV40_PMC_1704, 0); 17 nv_wr32(dev, NV40_PMC_1704, 0);
25 nv_wr32(dev, NV40_PMC_1708, 0); 18 nv_wr32(dev, NV40_PMC_1708, 0);
26 nv_wr32(dev, NV40_PMC_170C, tmp); 19 nv_wr32(dev, NV40_PMC_170C, tmp);
27 break;
28 default:
29 break;
30 } 20 }
31 21
32 return 0; 22 return 0;
diff --git a/drivers/gpu/drm/nouveau/nv40_mpeg.c b/drivers/gpu/drm/nouveau/nv40_mpeg.c
new file mode 100644
index 000000000000..6d2af292a2e3
--- /dev/null
+++ b/drivers/gpu/drm/nouveau/nv40_mpeg.c
@@ -0,0 +1,311 @@
1/*
2 * Copyright 2011 Red Hat 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: Ben Skeggs
23 */
24
25#include "drmP.h"
26#include "nouveau_drv.h"
27#include "nouveau_ramht.h"
28
29struct nv40_mpeg_engine {
30 struct nouveau_exec_engine base;
31};
32
33static int
34nv40_mpeg_context_new(struct nouveau_channel *chan, int engine)
35{
36 struct drm_device *dev = chan->dev;
37 struct drm_nouveau_private *dev_priv = dev->dev_private;
38 struct nouveau_gpuobj *ctx = NULL;
39 unsigned long flags;
40 int ret;
41
42 NV_DEBUG(dev, "ch%d\n", chan->id);
43
44 ret = nouveau_gpuobj_new(dev, NULL, 264 * 4, 16, NVOBJ_FLAG_ZERO_ALLOC |
45 NVOBJ_FLAG_ZERO_FREE, &ctx);
46 if (ret)
47 return ret;
48
49 nv_wo32(ctx, 0x78, 0x02001ec1);
50
51 spin_lock_irqsave(&dev_priv->context_switch_lock, flags);
52 nv_mask(dev, 0x002500, 0x00000001, 0x00000000);
53 if ((nv_rd32(dev, 0x003204) & 0x1f) == chan->id)
54 nv_wr32(dev, 0x00330c, ctx->pinst >> 4);
55 nv_wo32(chan->ramfc, 0x54, ctx->pinst >> 4);
56 nv_mask(dev, 0x002500, 0x00000001, 0x00000001);
57 spin_unlock_irqrestore(&dev_priv->context_switch_lock, flags);
58
59 chan->engctx[engine] = ctx;
60 return 0;
61}
62
63static void
64nv40_mpeg_context_del(struct nouveau_channel *chan, int engine)
65{
66 struct drm_nouveau_private *dev_priv = chan->dev->dev_private;
67 struct nouveau_gpuobj *ctx = chan->engctx[engine];
68 struct drm_device *dev = chan->dev;
69 unsigned long flags;
70 u32 inst = 0x80000000 | (ctx->pinst >> 4);
71
72 spin_lock_irqsave(&dev_priv->context_switch_lock, flags);
73 nv_mask(dev, 0x00b32c, 0x00000001, 0x00000000);
74 if (nv_rd32(dev, 0x00b318) == inst)
75 nv_mask(dev, 0x00b318, 0x80000000, 0x00000000);
76 nv_mask(dev, 0x00b32c, 0x00000001, 0x00000001);
77 spin_unlock_irqrestore(&dev_priv->context_switch_lock, flags);
78
79 nouveau_gpuobj_ref(NULL, &ctx);
80 chan->engctx[engine] = NULL;
81}
82
83static int
84nv40_mpeg_object_new(struct nouveau_channel *chan, int engine,
85 u32 handle, u16 class)
86{
87 struct drm_device *dev = chan->dev;
88 struct nouveau_gpuobj *obj = NULL;
89 int ret;
90
91 ret = nouveau_gpuobj_new(dev, chan, 20, 16, NVOBJ_FLAG_ZERO_ALLOC |
92 NVOBJ_FLAG_ZERO_FREE, &obj);
93 if (ret)
94 return ret;
95 obj->engine = 2;
96 obj->class = class;
97
98 nv_wo32(obj, 0x00, class);
99
100 ret = nouveau_ramht_insert(chan, handle, obj);
101 nouveau_gpuobj_ref(NULL, &obj);
102 return ret;
103}
104
105static int
106nv40_mpeg_init(struct drm_device *dev, int engine)
107{
108 struct drm_nouveau_private *dev_priv = dev->dev_private;
109 struct nv40_mpeg_engine *pmpeg = nv_engine(dev, engine);
110 int i;
111
112 /* VPE init */
113 nv_mask(dev, 0x000200, 0x00000002, 0x00000000);
114 nv_mask(dev, 0x000200, 0x00000002, 0x00000002);
115 nv_wr32(dev, 0x00b0e0, 0x00000020); /* nvidia: rd 0x01, wr 0x20 */
116 nv_wr32(dev, 0x00b0e8, 0x00000020); /* nvidia: rd 0x01, wr 0x20 */
117
118 for (i = 0; i < dev_priv->engine.fb.num_tiles; i++)
119 pmpeg->base.set_tile_region(dev, i);
120
121 /* PMPEG init */
122 nv_wr32(dev, 0x00b32c, 0x00000000);
123 nv_wr32(dev, 0x00b314, 0x00000100);
124 nv_wr32(dev, 0x00b220, 0x00000044);
125 nv_wr32(dev, 0x00b300, 0x02001ec1);
126 nv_mask(dev, 0x00b32c, 0x00000001, 0x00000001);
127
128 nv_wr32(dev, 0x00b100, 0xffffffff);
129 nv_wr32(dev, 0x00b140, 0xffffffff);
130
131 if (!nv_wait(dev, 0x00b200, 0x00000001, 0x00000000)) {
132 NV_ERROR(dev, "PMPEG init: 0x%08x\n", nv_rd32(dev, 0x00b200));
133 return -EBUSY;
134 }
135
136 return 0;
137}
138
139static int
140nv40_mpeg_fini(struct drm_device *dev, int engine)
141{
142 /*XXX: context save? */
143 nv_mask(dev, 0x00b32c, 0x00000001, 0x00000000);
144 nv_wr32(dev, 0x00b140, 0x00000000);
145 return 0;
146}
147
148static int
149nv40_mpeg_mthd_dma(struct nouveau_channel *chan, u32 class, u32 mthd, u32 data)
150{
151 struct drm_device *dev = chan->dev;
152 u32 inst = data << 4;
153 u32 dma0 = nv_ri32(dev, inst + 0);
154 u32 dma1 = nv_ri32(dev, inst + 4);
155 u32 dma2 = nv_ri32(dev, inst + 8);
156 u32 base = (dma2 & 0xfffff000) | (dma0 >> 20);
157 u32 size = dma1 + 1;
158
159 /* only allow linear DMA objects */
160 if (!(dma0 & 0x00002000))
161 return -EINVAL;
162
163 if (mthd == 0x0190) {
164 /* DMA_CMD */
165 nv_mask(dev, 0x00b300, 0x00030000, (dma0 & 0x00030000));
166 nv_wr32(dev, 0x00b334, base);
167 nv_wr32(dev, 0x00b324, size);
168 } else
169 if (mthd == 0x01a0) {
170 /* DMA_DATA */
171 nv_mask(dev, 0x00b300, 0x000c0000, (dma0 & 0x00030000) << 2);
172 nv_wr32(dev, 0x00b360, base);
173 nv_wr32(dev, 0x00b364, size);
174 } else {
175 /* DMA_IMAGE, VRAM only */
176 if (dma0 & 0x000c0000)
177 return -EINVAL;
178
179 nv_wr32(dev, 0x00b370, base);
180 nv_wr32(dev, 0x00b374, size);
181 }
182
183 return 0;
184}
185
186static int
187nv40_mpeg_isr_chid(struct drm_device *dev, u32 inst)
188{
189 struct drm_nouveau_private *dev_priv = dev->dev_private;
190 struct nouveau_gpuobj *ctx;
191 unsigned long flags;
192 int i;
193
194 spin_lock_irqsave(&dev_priv->channels.lock, flags);
195 for (i = 0; i < dev_priv->engine.fifo.channels; i++) {
196 if (!dev_priv->channels.ptr[i])
197 continue;
198
199 ctx = dev_priv->channels.ptr[i]->engctx[NVOBJ_ENGINE_MPEG];
200 if (ctx && ctx->pinst == inst)
201 break;
202 }
203 spin_unlock_irqrestore(&dev_priv->channels.lock, flags);
204 return i;
205}
206
207static void
208nv40_vpe_set_tile_region(struct drm_device *dev, int i)
209{
210 struct drm_nouveau_private *dev_priv = dev->dev_private;
211 struct nouveau_tile_reg *tile = &dev_priv->tile.reg[i];
212
213 nv_wr32(dev, 0x00b008 + (i * 0x10), tile->pitch);
214 nv_wr32(dev, 0x00b004 + (i * 0x10), tile->limit);
215 nv_wr32(dev, 0x00b000 + (i * 0x10), tile->addr);
216}
217
218static void
219nv40_mpeg_isr(struct drm_device *dev)
220{
221 u32 inst = (nv_rd32(dev, 0x00b318) & 0x000fffff) << 4;
222 u32 chid = nv40_mpeg_isr_chid(dev, inst);
223 u32 stat = nv_rd32(dev, 0x00b100);
224 u32 type = nv_rd32(dev, 0x00b230);
225 u32 mthd = nv_rd32(dev, 0x00b234);
226 u32 data = nv_rd32(dev, 0x00b238);
227 u32 show = stat;
228
229 if (stat & 0x01000000) {
230 /* happens on initial binding of the object */
231 if (type == 0x00000020 && mthd == 0x0000) {
232 nv_mask(dev, 0x00b308, 0x00000000, 0x00000000);
233 show &= ~0x01000000;
234 }
235
236 if (type == 0x00000010) {
237 if (!nouveau_gpuobj_mthd_call2(dev, chid, 0x3174, mthd, data))
238 show &= ~0x01000000;
239 }
240 }
241
242 nv_wr32(dev, 0x00b100, stat);
243 nv_wr32(dev, 0x00b230, 0x00000001);
244
245 if (show && nouveau_ratelimit()) {
246 NV_INFO(dev, "PMPEG: Ch %d [0x%08x] 0x%08x 0x%08x 0x%08x 0x%08x\n",
247 chid, inst, stat, type, mthd, data);
248 }
249}
250
251static void
252nv40_vpe_isr(struct drm_device *dev)
253{
254 if (nv_rd32(dev, 0x00b100))
255 nv40_mpeg_isr(dev);
256
257 if (nv_rd32(dev, 0x00b800)) {
258 u32 stat = nv_rd32(dev, 0x00b800);
259 NV_INFO(dev, "PMSRCH: 0x%08x\n", stat);
260 nv_wr32(dev, 0xb800, stat);
261 }
262}
263
264static void
265nv40_mpeg_destroy(struct drm_device *dev, int engine)
266{
267 struct nv40_mpeg_engine *pmpeg = nv_engine(dev, engine);
268
269 nouveau_irq_unregister(dev, 0);
270
271 NVOBJ_ENGINE_DEL(dev, MPEG);
272 kfree(pmpeg);
273}
274
275int
276nv40_mpeg_create(struct drm_device *dev)
277{
278 struct nv40_mpeg_engine *pmpeg;
279
280 pmpeg = kzalloc(sizeof(*pmpeg), GFP_KERNEL);
281 if (!pmpeg)
282 return -ENOMEM;
283
284 pmpeg->base.destroy = nv40_mpeg_destroy;
285 pmpeg->base.init = nv40_mpeg_init;
286 pmpeg->base.fini = nv40_mpeg_fini;
287 pmpeg->base.context_new = nv40_mpeg_context_new;
288 pmpeg->base.context_del = nv40_mpeg_context_del;
289 pmpeg->base.object_new = nv40_mpeg_object_new;
290
291 /* ISR vector, PMC_ENABLE bit, and TILE regs are shared between
292 * all VPE engines, for this driver's purposes the PMPEG engine
293 * will be treated as the "master" and handle the global VPE
294 * bits too
295 */
296 pmpeg->base.set_tile_region = nv40_vpe_set_tile_region;
297 nouveau_irq_register(dev, 0, nv40_vpe_isr);
298
299 NVOBJ_ENGINE_ADD(dev, MPEG, &pmpeg->base);
300 NVOBJ_CLASS(dev, 0x3174, MPEG);
301 NVOBJ_MTHD (dev, 0x3174, 0x0190, nv40_mpeg_mthd_dma);
302 NVOBJ_MTHD (dev, 0x3174, 0x01a0, nv40_mpeg_mthd_dma);
303 NVOBJ_MTHD (dev, 0x3174, 0x01b0, nv40_mpeg_mthd_dma);
304
305#if 0
306 NVOBJ_ENGINE_ADD(dev, ME, &pme->base);
307 NVOBJ_CLASS(dev, 0x4075, ME);
308#endif
309 return 0;
310
311}
diff --git a/drivers/gpu/drm/nouveau/nv50_calc.c b/drivers/gpu/drm/nouveau/nv50_calc.c
index 2cdc2bfe7179..8cf63a8b30cd 100644
--- a/drivers/gpu/drm/nouveau/nv50_calc.c
+++ b/drivers/gpu/drm/nouveau/nv50_calc.c
@@ -23,7 +23,6 @@
23 */ 23 */
24 24
25#include "drmP.h" 25#include "drmP.h"
26#include "drm_fixed.h"
27#include "nouveau_drv.h" 26#include "nouveau_drv.h"
28#include "nouveau_hw.h" 27#include "nouveau_hw.h"
29 28
@@ -47,10 +46,11 @@ nv50_calc_pll(struct drm_device *dev, struct pll_lims *pll, int clk,
47} 46}
48 47
49int 48int
50nv50_calc_pll2(struct drm_device *dev, struct pll_lims *pll, int clk, 49nva3_calc_pll(struct drm_device *dev, struct pll_lims *pll, int clk,
51 int *N, int *fN, int *M, int *P) 50 int *pN, int *pfN, int *pM, int *P)
52{ 51{
53 fixed20_12 fb_div, a, b; 52 u32 best_err = ~0, err;
53 int M, lM, hM, N, fN;
54 54
55 *P = pll->vco1.maxfreq / clk; 55 *P = pll->vco1.maxfreq / clk;
56 if (*P > pll->max_p) 56 if (*P > pll->max_p)
@@ -58,30 +58,40 @@ nv50_calc_pll2(struct drm_device *dev, struct pll_lims *pll, int clk,
58 if (*P < pll->min_p) 58 if (*P < pll->min_p)
59 *P = pll->min_p; 59 *P = pll->min_p;
60 60
61 /* *M = ceil(refclk / pll->vco.max_inputfreq); */ 61 lM = (pll->refclk + pll->vco1.max_inputfreq) / pll->vco1.max_inputfreq;
62 a.full = dfixed_const(pll->refclk); 62 lM = max(lM, (int)pll->vco1.min_m);
63 b.full = dfixed_const(pll->vco1.max_inputfreq); 63 hM = (pll->refclk + pll->vco1.min_inputfreq) / pll->vco1.min_inputfreq;
64 a.full = dfixed_div(a, b); 64 hM = min(hM, (int)pll->vco1.max_m);
65 a.full = dfixed_ceil(a);
66 *M = dfixed_trunc(a);
67 65
68 /* fb_div = (vco * *M) / refclk; */ 66 for (M = lM; M <= hM; M++) {
69 fb_div.full = dfixed_const(clk * *P); 67 u32 tmp = clk * *P * M;
70 fb_div.full = dfixed_mul(fb_div, a); 68 N = tmp / pll->refclk;
71 a.full = dfixed_const(pll->refclk); 69 fN = tmp % pll->refclk;
72 fb_div.full = dfixed_div(fb_div, a); 70 if (!pfN && fN >= pll->refclk / 2)
71 N++;
73 72
74 /* *N = floor(fb_div); */ 73 if (N < pll->vco1.min_n)
75 a.full = dfixed_floor(fb_div); 74 continue;
76 *N = dfixed_trunc(fb_div); 75 if (N > pll->vco1.max_n)
76 break;
77 77
78 /* *fN = (fmod(fb_div, 1.0) * 8192) - 4096; */ 78 err = abs(clk - (pll->refclk * N / M / *P));
79 b.full = dfixed_const(8192); 79 if (err < best_err) {
80 a.full = dfixed_mul(a, b); 80 best_err = err;
81 fb_div.full = dfixed_mul(fb_div, b); 81 *pN = N;
82 fb_div.full = fb_div.full - a.full; 82 *pM = M;
83 *fN = dfixed_trunc(fb_div) - 4096; 83 }
84 *fN &= 0xffff;
85 84
86 return clk; 85 if (pfN) {
86 *pfN = (((fN << 13) / pll->refclk) - 4096) & 0xffff;
87 return clk;
88 }
89 }
90
91 if (unlikely(best_err == ~0)) {
92 NV_ERROR(dev, "unable to find matching pll values\n");
93 return -EINVAL;
94 }
95
96 return pll->refclk * *pN / *pM / *P;
87} 97}
diff --git a/drivers/gpu/drm/nouveau/nv50_crtc.c b/drivers/gpu/drm/nouveau/nv50_crtc.c
index bfd4ca2fe7ef..ebabacf38da9 100644
--- a/drivers/gpu/drm/nouveau/nv50_crtc.c
+++ b/drivers/gpu/drm/nouveau/nv50_crtc.c
@@ -65,7 +65,7 @@ nv50_crtc_blank(struct nouveau_crtc *nv_crtc, bool blanked)
65{ 65{
66 struct drm_device *dev = nv_crtc->base.dev; 66 struct drm_device *dev = nv_crtc->base.dev;
67 struct drm_nouveau_private *dev_priv = dev->dev_private; 67 struct drm_nouveau_private *dev_priv = dev->dev_private;
68 struct nouveau_channel *evo = dev_priv->evo; 68 struct nouveau_channel *evo = nv50_display(dev)->master;
69 int index = nv_crtc->index, ret; 69 int index = nv_crtc->index, ret;
70 70
71 NV_DEBUG_KMS(dev, "index %d\n", nv_crtc->index); 71 NV_DEBUG_KMS(dev, "index %d\n", nv_crtc->index);
@@ -104,8 +104,7 @@ nv50_crtc_blank(struct nouveau_crtc *nv_crtc, bool blanked)
104 OUT_RING(evo, nv_crtc->lut.depth == 8 ? 104 OUT_RING(evo, nv_crtc->lut.depth == 8 ?
105 NV50_EVO_CRTC_CLUT_MODE_OFF : 105 NV50_EVO_CRTC_CLUT_MODE_OFF :
106 NV50_EVO_CRTC_CLUT_MODE_ON); 106 NV50_EVO_CRTC_CLUT_MODE_ON);
107 OUT_RING(evo, (nv_crtc->lut.nvbo->bo.mem.mm_node->start << 107 OUT_RING(evo, (nv_crtc->lut.nvbo->bo.mem.start << PAGE_SHIFT) >> 8);
108 PAGE_SHIFT) >> 8);
109 if (dev_priv->chipset != 0x50) { 108 if (dev_priv->chipset != 0x50) {
110 BEGIN_RING(evo, 0, NV84_EVO_CRTC(index, CLUT_DMA), 1); 109 BEGIN_RING(evo, 0, NV84_EVO_CRTC(index, CLUT_DMA), 1);
111 OUT_RING(evo, NvEvoVRAM); 110 OUT_RING(evo, NvEvoVRAM);
@@ -116,15 +115,16 @@ nv50_crtc_blank(struct nouveau_crtc *nv_crtc, bool blanked)
116 OUT_RING(evo, 0); 115 OUT_RING(evo, 0);
117 BEGIN_RING(evo, 0, NV50_EVO_CRTC(index, FB_DMA), 1); 116 BEGIN_RING(evo, 0, NV50_EVO_CRTC(index, FB_DMA), 1);
118 if (dev_priv->chipset != 0x50) 117 if (dev_priv->chipset != 0x50)
119 if (nv_crtc->fb.tile_flags == 0x7a00) 118 if (nv_crtc->fb.tile_flags == 0x7a00 ||
119 nv_crtc->fb.tile_flags == 0xfe00)
120 OUT_RING(evo, NvEvoFB32); 120 OUT_RING(evo, NvEvoFB32);
121 else 121 else
122 if (nv_crtc->fb.tile_flags == 0x7000) 122 if (nv_crtc->fb.tile_flags == 0x7000)
123 OUT_RING(evo, NvEvoFB16); 123 OUT_RING(evo, NvEvoFB16);
124 else 124 else
125 OUT_RING(evo, NvEvoVRAM); 125 OUT_RING(evo, NvEvoVRAM_LP);
126 else 126 else
127 OUT_RING(evo, NvEvoVRAM); 127 OUT_RING(evo, NvEvoVRAM_LP);
128 } 128 }
129 129
130 nv_crtc->fb.blanked = blanked; 130 nv_crtc->fb.blanked = blanked;
@@ -135,8 +135,7 @@ static int
135nv50_crtc_set_dither(struct nouveau_crtc *nv_crtc, bool on, bool update) 135nv50_crtc_set_dither(struct nouveau_crtc *nv_crtc, bool on, bool update)
136{ 136{
137 struct drm_device *dev = nv_crtc->base.dev; 137 struct drm_device *dev = nv_crtc->base.dev;
138 struct drm_nouveau_private *dev_priv = dev->dev_private; 138 struct nouveau_channel *evo = nv50_display(dev)->master;
139 struct nouveau_channel *evo = dev_priv->evo;
140 int ret; 139 int ret;
141 140
142 NV_DEBUG_KMS(dev, "\n"); 141 NV_DEBUG_KMS(dev, "\n");
@@ -186,8 +185,7 @@ nv50_crtc_set_scale(struct nouveau_crtc *nv_crtc, int scaling_mode, bool update)
186 struct nouveau_connector *nv_connector = 185 struct nouveau_connector *nv_connector =
187 nouveau_crtc_connector_get(nv_crtc); 186 nouveau_crtc_connector_get(nv_crtc);
188 struct drm_device *dev = nv_crtc->base.dev; 187 struct drm_device *dev = nv_crtc->base.dev;
189 struct drm_nouveau_private *dev_priv = dev->dev_private; 188 struct nouveau_channel *evo = nv50_display(dev)->master;
190 struct nouveau_channel *evo = dev_priv->evo;
191 struct drm_display_mode *native_mode = NULL; 189 struct drm_display_mode *native_mode = NULL;
192 struct drm_display_mode *mode = &nv_crtc->base.mode; 190 struct drm_display_mode *mode = &nv_crtc->base.mode;
193 uint32_t outX, outY, horiz, vert; 191 uint32_t outX, outY, horiz, vert;
@@ -266,15 +264,10 @@ nv50_crtc_set_clock(struct drm_device *dev, int head, int pclk)
266{ 264{
267 struct drm_nouveau_private *dev_priv = dev->dev_private; 265 struct drm_nouveau_private *dev_priv = dev->dev_private;
268 struct pll_lims pll; 266 struct pll_lims pll;
269 uint32_t reg, reg1, reg2; 267 uint32_t reg1, reg2;
270 int ret, N1, M1, N2, M2, P; 268 int ret, N1, M1, N2, M2, P;
271 269
272 if (dev_priv->chipset < NV_C0) 270 ret = get_pll_limits(dev, PLL_VPLL0 + head, &pll);
273 reg = NV50_PDISPLAY_CRTC_CLK_CTRL1(head);
274 else
275 reg = 0x614140 + (head * 0x800);
276
277 ret = get_pll_limits(dev, reg, &pll);
278 if (ret) 271 if (ret)
279 return ret; 272 return ret;
280 273
@@ -286,35 +279,35 @@ nv50_crtc_set_clock(struct drm_device *dev, int head, int pclk)
286 NV_DEBUG(dev, "pclk %d out %d NM1 %d %d NM2 %d %d P %d\n", 279 NV_DEBUG(dev, "pclk %d out %d NM1 %d %d NM2 %d %d P %d\n",
287 pclk, ret, N1, M1, N2, M2, P); 280 pclk, ret, N1, M1, N2, M2, P);
288 281
289 reg1 = nv_rd32(dev, reg + 4) & 0xff00ff00; 282 reg1 = nv_rd32(dev, pll.reg + 4) & 0xff00ff00;
290 reg2 = nv_rd32(dev, reg + 8) & 0x8000ff00; 283 reg2 = nv_rd32(dev, pll.reg + 8) & 0x8000ff00;
291 nv_wr32(dev, reg, 0x10000611); 284 nv_wr32(dev, pll.reg + 0, 0x10000611);
292 nv_wr32(dev, reg + 4, reg1 | (M1 << 16) | N1); 285 nv_wr32(dev, pll.reg + 4, reg1 | (M1 << 16) | N1);
293 nv_wr32(dev, reg + 8, reg2 | (P << 28) | (M2 << 16) | N2); 286 nv_wr32(dev, pll.reg + 8, reg2 | (P << 28) | (M2 << 16) | N2);
294 } else 287 } else
295 if (dev_priv->chipset < NV_C0) { 288 if (dev_priv->chipset < NV_C0) {
296 ret = nv50_calc_pll2(dev, &pll, pclk, &N1, &N2, &M1, &P); 289 ret = nva3_calc_pll(dev, &pll, pclk, &N1, &N2, &M1, &P);
297 if (ret <= 0) 290 if (ret <= 0)
298 return 0; 291 return 0;
299 292
300 NV_DEBUG(dev, "pclk %d out %d N %d fN 0x%04x M %d P %d\n", 293 NV_DEBUG(dev, "pclk %d out %d N %d fN 0x%04x M %d P %d\n",
301 pclk, ret, N1, N2, M1, P); 294 pclk, ret, N1, N2, M1, P);
302 295
303 reg1 = nv_rd32(dev, reg + 4) & 0xffc00000; 296 reg1 = nv_rd32(dev, pll.reg + 4) & 0xffc00000;
304 nv_wr32(dev, reg, 0x50000610); 297 nv_wr32(dev, pll.reg + 0, 0x50000610);
305 nv_wr32(dev, reg + 4, reg1 | (P << 16) | (M1 << 8) | N1); 298 nv_wr32(dev, pll.reg + 4, reg1 | (P << 16) | (M1 << 8) | N1);
306 nv_wr32(dev, reg + 8, N2); 299 nv_wr32(dev, pll.reg + 8, N2);
307 } else { 300 } else {
308 ret = nv50_calc_pll2(dev, &pll, pclk, &N1, &N2, &M1, &P); 301 ret = nva3_calc_pll(dev, &pll, pclk, &N1, &N2, &M1, &P);
309 if (ret <= 0) 302 if (ret <= 0)
310 return 0; 303 return 0;
311 304
312 NV_DEBUG(dev, "pclk %d out %d N %d fN 0x%04x M %d P %d\n", 305 NV_DEBUG(dev, "pclk %d out %d N %d fN 0x%04x M %d P %d\n",
313 pclk, ret, N1, N2, M1, P); 306 pclk, ret, N1, N2, M1, P);
314 307
315 nv_mask(dev, reg + 0x0c, 0x00000000, 0x00000100); 308 nv_mask(dev, pll.reg + 0x0c, 0x00000000, 0x00000100);
316 nv_wr32(dev, reg + 0x04, (P << 16) | (N1 << 8) | M1); 309 nv_wr32(dev, pll.reg + 0x04, (P << 16) | (N1 << 8) | M1);
317 nv_wr32(dev, reg + 0x10, N2 << 16); 310 nv_wr32(dev, pll.reg + 0x10, N2 << 16);
318 } 311 }
319 312
320 return 0; 313 return 0;
@@ -338,7 +331,9 @@ nv50_crtc_destroy(struct drm_crtc *crtc)
338 331
339 nv50_cursor_fini(nv_crtc); 332 nv50_cursor_fini(nv_crtc);
340 333
334 nouveau_bo_unmap(nv_crtc->lut.nvbo);
341 nouveau_bo_ref(NULL, &nv_crtc->lut.nvbo); 335 nouveau_bo_ref(NULL, &nv_crtc->lut.nvbo);
336 nouveau_bo_unmap(nv_crtc->cursor.nvbo);
342 nouveau_bo_ref(NULL, &nv_crtc->cursor.nvbo); 337 nouveau_bo_ref(NULL, &nv_crtc->cursor.nvbo);
343 kfree(nv_crtc->mode); 338 kfree(nv_crtc->mode);
344 kfree(nv_crtc); 339 kfree(nv_crtc);
@@ -349,20 +344,19 @@ nv50_crtc_cursor_set(struct drm_crtc *crtc, struct drm_file *file_priv,
349 uint32_t buffer_handle, uint32_t width, uint32_t height) 344 uint32_t buffer_handle, uint32_t width, uint32_t height)
350{ 345{
351 struct drm_device *dev = crtc->dev; 346 struct drm_device *dev = crtc->dev;
352 struct drm_nouveau_private *dev_priv = dev->dev_private;
353 struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc); 347 struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc);
354 struct nouveau_bo *cursor = NULL; 348 struct nouveau_bo *cursor = NULL;
355 struct drm_gem_object *gem; 349 struct drm_gem_object *gem;
356 int ret = 0, i; 350 int ret = 0, i;
357 351
358 if (width != 64 || height != 64)
359 return -EINVAL;
360
361 if (!buffer_handle) { 352 if (!buffer_handle) {
362 nv_crtc->cursor.hide(nv_crtc, true); 353 nv_crtc->cursor.hide(nv_crtc, true);
363 return 0; 354 return 0;
364 } 355 }
365 356
357 if (width != 64 || height != 64)
358 return -EINVAL;
359
366 gem = drm_gem_object_lookup(dev, file_priv, buffer_handle); 360 gem = drm_gem_object_lookup(dev, file_priv, buffer_handle);
367 if (!gem) 361 if (!gem)
368 return -ENOENT; 362 return -ENOENT;
@@ -378,8 +372,7 @@ nv50_crtc_cursor_set(struct drm_crtc *crtc, struct drm_file *file_priv,
378 372
379 nouveau_bo_unmap(cursor); 373 nouveau_bo_unmap(cursor);
380 374
381 nv_crtc->cursor.set_offset(nv_crtc, nv_crtc->cursor.nvbo->bo.offset - 375 nv_crtc->cursor.set_offset(nv_crtc, nv_crtc->cursor.nvbo->bo.mem.start << PAGE_SHIFT);
382 dev_priv->vm_vram_base);
383 nv_crtc->cursor.show(nv_crtc, true); 376 nv_crtc->cursor.show(nv_crtc, true);
384 377
385out: 378out:
@@ -441,6 +434,7 @@ static const struct drm_crtc_funcs nv50_crtc_funcs = {
441 .cursor_move = nv50_crtc_cursor_move, 434 .cursor_move = nv50_crtc_cursor_move,
442 .gamma_set = nv50_crtc_gamma_set, 435 .gamma_set = nv50_crtc_gamma_set,
443 .set_config = drm_crtc_helper_set_config, 436 .set_config = drm_crtc_helper_set_config,
437 .page_flip = nouveau_crtc_page_flip,
444 .destroy = nv50_crtc_destroy, 438 .destroy = nv50_crtc_destroy,
445}; 439};
446 440
@@ -449,6 +443,39 @@ nv50_crtc_dpms(struct drm_crtc *crtc, int mode)
449{ 443{
450} 444}
451 445
446static int
447nv50_crtc_wait_complete(struct drm_crtc *crtc)
448{
449 struct drm_device *dev = crtc->dev;
450 struct drm_nouveau_private *dev_priv = dev->dev_private;
451 struct nouveau_timer_engine *ptimer = &dev_priv->engine.timer;
452 struct nv50_display *disp = nv50_display(dev);
453 struct nouveau_channel *evo = disp->master;
454 u64 start;
455 int ret;
456
457 ret = RING_SPACE(evo, 6);
458 if (ret)
459 return ret;
460 BEGIN_RING(evo, 0, 0x0084, 1);
461 OUT_RING (evo, 0x80000000);
462 BEGIN_RING(evo, 0, 0x0080, 1);
463 OUT_RING (evo, 0);
464 BEGIN_RING(evo, 0, 0x0084, 1);
465 OUT_RING (evo, 0x00000000);
466
467 nv_wo32(disp->ntfy, 0x000, 0x00000000);
468 FIRE_RING (evo);
469
470 start = ptimer->read(dev);
471 do {
472 if (nv_ro32(disp->ntfy, 0x000))
473 return 0;
474 } while (ptimer->read(dev) - start < 2000000000ULL);
475
476 return -EBUSY;
477}
478
452static void 479static void
453nv50_crtc_prepare(struct drm_crtc *crtc) 480nv50_crtc_prepare(struct drm_crtc *crtc)
454{ 481{
@@ -457,6 +484,8 @@ nv50_crtc_prepare(struct drm_crtc *crtc)
457 484
458 NV_DEBUG_KMS(dev, "index %d\n", nv_crtc->index); 485 NV_DEBUG_KMS(dev, "index %d\n", nv_crtc->index);
459 486
487 nv50_display_flip_stop(crtc);
488 drm_vblank_pre_modeset(dev, nv_crtc->index);
460 nv50_crtc_blank(nv_crtc, true); 489 nv50_crtc_blank(nv_crtc, true);
461} 490}
462 491
@@ -464,23 +493,14 @@ static void
464nv50_crtc_commit(struct drm_crtc *crtc) 493nv50_crtc_commit(struct drm_crtc *crtc)
465{ 494{
466 struct drm_device *dev = crtc->dev; 495 struct drm_device *dev = crtc->dev;
467 struct drm_nouveau_private *dev_priv = dev->dev_private;
468 struct nouveau_channel *evo = dev_priv->evo;
469 struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc); 496 struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc);
470 int ret;
471 497
472 NV_DEBUG_KMS(dev, "index %d\n", nv_crtc->index); 498 NV_DEBUG_KMS(dev, "index %d\n", nv_crtc->index);
473 499
474 nv50_crtc_blank(nv_crtc, false); 500 nv50_crtc_blank(nv_crtc, false);
475 501 drm_vblank_post_modeset(dev, nv_crtc->index);
476 ret = RING_SPACE(evo, 2); 502 nv50_crtc_wait_complete(crtc);
477 if (ret) { 503 nv50_display_flip_next(crtc, crtc->fb, NULL);
478 NV_ERROR(dev, "no space while committing crtc\n");
479 return;
480 }
481 BEGIN_RING(evo, 0, NV50_EVO_UPDATE, 1);
482 OUT_RING (evo, 0);
483 FIRE_RING (evo);
484} 504}
485 505
486static bool 506static bool
@@ -491,52 +511,43 @@ nv50_crtc_mode_fixup(struct drm_crtc *crtc, struct drm_display_mode *mode,
491} 511}
492 512
493static int 513static int
494nv50_crtc_do_mode_set_base(struct drm_crtc *crtc, int x, int y, 514nv50_crtc_do_mode_set_base(struct drm_crtc *crtc,
495 struct drm_framebuffer *old_fb, bool update) 515 struct drm_framebuffer *passed_fb,
516 int x, int y, bool atomic)
496{ 517{
497 struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc); 518 struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc);
498 struct drm_device *dev = nv_crtc->base.dev; 519 struct drm_device *dev = nv_crtc->base.dev;
499 struct drm_nouveau_private *dev_priv = dev->dev_private; 520 struct drm_nouveau_private *dev_priv = dev->dev_private;
500 struct nouveau_channel *evo = dev_priv->evo; 521 struct nouveau_channel *evo = nv50_display(dev)->master;
501 struct drm_framebuffer *drm_fb = nv_crtc->base.fb; 522 struct drm_framebuffer *drm_fb = nv_crtc->base.fb;
502 struct nouveau_framebuffer *fb = nouveau_framebuffer(drm_fb); 523 struct nouveau_framebuffer *fb = nouveau_framebuffer(drm_fb);
503 int ret, format; 524 int ret;
504 525
505 NV_DEBUG_KMS(dev, "index %d\n", nv_crtc->index); 526 NV_DEBUG_KMS(dev, "index %d\n", nv_crtc->index);
506 527
507 switch (drm_fb->depth) { 528 /* If atomic, we want to switch to the fb we were passed, so
508 case 8: 529 * now we update pointers to do that. (We don't pin; just
509 format = NV50_EVO_CRTC_FB_DEPTH_8; 530 * assume we're already pinned and update the base address.)
510 break; 531 */
511 case 15: 532 if (atomic) {
512 format = NV50_EVO_CRTC_FB_DEPTH_15; 533 drm_fb = passed_fb;
513 break; 534 fb = nouveau_framebuffer(passed_fb);
514 case 16: 535 } else {
515 format = NV50_EVO_CRTC_FB_DEPTH_16; 536 /* If not atomic, we can go ahead and pin, and unpin the
516 break; 537 * old fb we were passed.
517 case 24: 538 */
518 case 32: 539 ret = nouveau_bo_pin(fb->nvbo, TTM_PL_FLAG_VRAM);
519 format = NV50_EVO_CRTC_FB_DEPTH_24; 540 if (ret)
520 break; 541 return ret;
521 case 30:
522 format = NV50_EVO_CRTC_FB_DEPTH_30;
523 break;
524 default:
525 NV_ERROR(dev, "unknown depth %d\n", drm_fb->depth);
526 return -EINVAL;
527 }
528
529 ret = nouveau_bo_pin(fb->nvbo, TTM_PL_FLAG_VRAM);
530 if (ret)
531 return ret;
532 542
533 if (old_fb) { 543 if (passed_fb) {
534 struct nouveau_framebuffer *ofb = nouveau_framebuffer(old_fb); 544 struct nouveau_framebuffer *ofb = nouveau_framebuffer(passed_fb);
535 nouveau_bo_unpin(ofb->nvbo); 545 nouveau_bo_unpin(ofb->nvbo);
546 }
536 } 547 }
537 548
538 nv_crtc->fb.offset = fb->nvbo->bo.offset - dev_priv->vm_vram_base; 549 nv_crtc->fb.offset = fb->nvbo->bo.mem.start << PAGE_SHIFT;
539 nv_crtc->fb.tile_flags = fb->nvbo->tile_flags; 550 nv_crtc->fb.tile_flags = nouveau_bo_tile_layout(fb->nvbo);
540 nv_crtc->fb.cpp = drm_fb->bits_per_pixel / 8; 551 nv_crtc->fb.cpp = drm_fb->bits_per_pixel / 8;
541 if (!nv_crtc->fb.blanked && dev_priv->chipset != 0x50) { 552 if (!nv_crtc->fb.blanked && dev_priv->chipset != 0x50) {
542 ret = RING_SPACE(evo, 2); 553 ret = RING_SPACE(evo, 2);
@@ -544,13 +555,7 @@ nv50_crtc_do_mode_set_base(struct drm_crtc *crtc, int x, int y,
544 return ret; 555 return ret;
545 556
546 BEGIN_RING(evo, 0, NV50_EVO_CRTC(nv_crtc->index, FB_DMA), 1); 557 BEGIN_RING(evo, 0, NV50_EVO_CRTC(nv_crtc->index, FB_DMA), 1);
547 if (nv_crtc->fb.tile_flags == 0x7a00) 558 OUT_RING (evo, fb->r_dma);
548 OUT_RING(evo, NvEvoFB32);
549 else
550 if (nv_crtc->fb.tile_flags == 0x7000)
551 OUT_RING(evo, NvEvoFB16);
552 else
553 OUT_RING(evo, NvEvoVRAM);
554 } 559 }
555 560
556 ret = RING_SPACE(evo, 12); 561 ret = RING_SPACE(evo, 12);
@@ -558,43 +563,26 @@ nv50_crtc_do_mode_set_base(struct drm_crtc *crtc, int x, int y,
558 return ret; 563 return ret;
559 564
560 BEGIN_RING(evo, 0, NV50_EVO_CRTC(nv_crtc->index, FB_OFFSET), 5); 565 BEGIN_RING(evo, 0, NV50_EVO_CRTC(nv_crtc->index, FB_OFFSET), 5);
561 OUT_RING(evo, nv_crtc->fb.offset >> 8); 566 OUT_RING (evo, nv_crtc->fb.offset >> 8);
562 OUT_RING(evo, 0); 567 OUT_RING (evo, 0);
563 OUT_RING(evo, (drm_fb->height << 16) | drm_fb->width); 568 OUT_RING (evo, (drm_fb->height << 16) | drm_fb->width);
564 if (!nv_crtc->fb.tile_flags) { 569 OUT_RING (evo, fb->r_pitch);
565 OUT_RING(evo, drm_fb->pitch | (1 << 20)); 570 OUT_RING (evo, fb->r_format);
566 } else {
567 OUT_RING(evo, ((drm_fb->pitch / 4) << 4) |
568 fb->nvbo->tile_mode);
569 }
570 if (dev_priv->chipset == 0x50)
571 OUT_RING(evo, (fb->nvbo->tile_flags << 8) | format);
572 else
573 OUT_RING(evo, format);
574 571
575 BEGIN_RING(evo, 0, NV50_EVO_CRTC(nv_crtc->index, CLUT_MODE), 1); 572 BEGIN_RING(evo, 0, NV50_EVO_CRTC(nv_crtc->index, CLUT_MODE), 1);
576 OUT_RING(evo, fb->base.depth == 8 ? 573 OUT_RING (evo, fb->base.depth == 8 ?
577 NV50_EVO_CRTC_CLUT_MODE_OFF : NV50_EVO_CRTC_CLUT_MODE_ON); 574 NV50_EVO_CRTC_CLUT_MODE_OFF : NV50_EVO_CRTC_CLUT_MODE_ON);
578 575
579 BEGIN_RING(evo, 0, NV50_EVO_CRTC(nv_crtc->index, COLOR_CTRL), 1); 576 BEGIN_RING(evo, 0, NV50_EVO_CRTC(nv_crtc->index, COLOR_CTRL), 1);
580 OUT_RING(evo, NV50_EVO_CRTC_COLOR_CTRL_COLOR); 577 OUT_RING (evo, NV50_EVO_CRTC_COLOR_CTRL_COLOR);
581 BEGIN_RING(evo, 0, NV50_EVO_CRTC(nv_crtc->index, FB_POS), 1); 578 BEGIN_RING(evo, 0, NV50_EVO_CRTC(nv_crtc->index, FB_POS), 1);
582 OUT_RING(evo, (y << 16) | x); 579 OUT_RING (evo, (y << 16) | x);
583 580
584 if (nv_crtc->lut.depth != fb->base.depth) { 581 if (nv_crtc->lut.depth != fb->base.depth) {
585 nv_crtc->lut.depth = fb->base.depth; 582 nv_crtc->lut.depth = fb->base.depth;
586 nv50_crtc_lut_load(crtc); 583 nv50_crtc_lut_load(crtc);
587 } 584 }
588 585
589 if (update) {
590 ret = RING_SPACE(evo, 2);
591 if (ret)
592 return ret;
593 BEGIN_RING(evo, 0, NV50_EVO_UPDATE, 1);
594 OUT_RING(evo, 0);
595 FIRE_RING(evo);
596 }
597
598 return 0; 586 return 0;
599} 587}
600 588
@@ -604,8 +592,7 @@ nv50_crtc_mode_set(struct drm_crtc *crtc, struct drm_display_mode *mode,
604 struct drm_framebuffer *old_fb) 592 struct drm_framebuffer *old_fb)
605{ 593{
606 struct drm_device *dev = crtc->dev; 594 struct drm_device *dev = crtc->dev;
607 struct drm_nouveau_private *dev_priv = dev->dev_private; 595 struct nouveau_channel *evo = nv50_display(dev)->master;
608 struct nouveau_channel *evo = dev_priv->evo;
609 struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc); 596 struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc);
610 struct nouveau_connector *nv_connector = NULL; 597 struct nouveau_connector *nv_connector = NULL;
611 uint32_t hsync_dur, vsync_dur, hsync_start_to_end, vsync_start_to_end; 598 uint32_t hsync_dur, vsync_dur, hsync_start_to_end, vsync_start_to_end;
@@ -685,14 +672,40 @@ nv50_crtc_mode_set(struct drm_crtc *crtc, struct drm_display_mode *mode,
685 nv_crtc->set_dither(nv_crtc, nv_connector->use_dithering, false); 672 nv_crtc->set_dither(nv_crtc, nv_connector->use_dithering, false);
686 nv_crtc->set_scale(nv_crtc, nv_connector->scaling_mode, false); 673 nv_crtc->set_scale(nv_crtc, nv_connector->scaling_mode, false);
687 674
688 return nv50_crtc_do_mode_set_base(crtc, x, y, old_fb, false); 675 return nv50_crtc_do_mode_set_base(crtc, old_fb, x, y, false);
689} 676}
690 677
691static int 678static int
692nv50_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y, 679nv50_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y,
693 struct drm_framebuffer *old_fb) 680 struct drm_framebuffer *old_fb)
694{ 681{
695 return nv50_crtc_do_mode_set_base(crtc, x, y, old_fb, true); 682 int ret;
683
684 nv50_display_flip_stop(crtc);
685 ret = nv50_crtc_do_mode_set_base(crtc, old_fb, x, y, false);
686 if (ret)
687 return ret;
688
689 ret = nv50_crtc_wait_complete(crtc);
690 if (ret)
691 return ret;
692
693 return nv50_display_flip_next(crtc, crtc->fb, NULL);
694}
695
696static int
697nv50_crtc_mode_set_base_atomic(struct drm_crtc *crtc,
698 struct drm_framebuffer *fb,
699 int x, int y, enum mode_set_atomic state)
700{
701 int ret;
702
703 nv50_display_flip_stop(crtc);
704 ret = nv50_crtc_do_mode_set_base(crtc, fb, x, y, true);
705 if (ret)
706 return ret;
707
708 return nv50_crtc_wait_complete(crtc);
696} 709}
697 710
698static const struct drm_crtc_helper_funcs nv50_crtc_helper_funcs = { 711static const struct drm_crtc_helper_funcs nv50_crtc_helper_funcs = {
@@ -702,6 +715,7 @@ static const struct drm_crtc_helper_funcs nv50_crtc_helper_funcs = {
702 .mode_fixup = nv50_crtc_mode_fixup, 715 .mode_fixup = nv50_crtc_mode_fixup,
703 .mode_set = nv50_crtc_mode_set, 716 .mode_set = nv50_crtc_mode_set,
704 .mode_set_base = nv50_crtc_mode_set_base, 717 .mode_set_base = nv50_crtc_mode_set_base,
718 .mode_set_base_atomic = nv50_crtc_mode_set_base_atomic,
705 .load_lut = nv50_crtc_lut_load, 719 .load_lut = nv50_crtc_lut_load,
706}; 720};
707 721
@@ -734,7 +748,7 @@ nv50_crtc_create(struct drm_device *dev, int index)
734 nv_crtc->lut.depth = 0; 748 nv_crtc->lut.depth = 0;
735 749
736 ret = nouveau_bo_new(dev, NULL, 4096, 0x100, TTM_PL_FLAG_VRAM, 750 ret = nouveau_bo_new(dev, NULL, 4096, 0x100, TTM_PL_FLAG_VRAM,
737 0, 0x0000, false, true, &nv_crtc->lut.nvbo); 751 0, 0x0000, &nv_crtc->lut.nvbo);
738 if (!ret) { 752 if (!ret) {
739 ret = nouveau_bo_pin(nv_crtc->lut.nvbo, TTM_PL_FLAG_VRAM); 753 ret = nouveau_bo_pin(nv_crtc->lut.nvbo, TTM_PL_FLAG_VRAM);
740 if (!ret) 754 if (!ret)
@@ -760,7 +774,7 @@ nv50_crtc_create(struct drm_device *dev, int index)
760 drm_mode_crtc_set_gamma_size(&nv_crtc->base, 256); 774 drm_mode_crtc_set_gamma_size(&nv_crtc->base, 256);
761 775
762 ret = nouveau_bo_new(dev, NULL, 64*64*4, 0x100, TTM_PL_FLAG_VRAM, 776 ret = nouveau_bo_new(dev, NULL, 64*64*4, 0x100, TTM_PL_FLAG_VRAM,
763 0, 0x0000, false, true, &nv_crtc->cursor.nvbo); 777 0, 0x0000, &nv_crtc->cursor.nvbo);
764 if (!ret) { 778 if (!ret) {
765 ret = nouveau_bo_pin(nv_crtc->cursor.nvbo, TTM_PL_FLAG_VRAM); 779 ret = nouveau_bo_pin(nv_crtc->cursor.nvbo, TTM_PL_FLAG_VRAM);
766 if (!ret) 780 if (!ret)
diff --git a/drivers/gpu/drm/nouveau/nv50_cursor.c b/drivers/gpu/drm/nouveau/nv50_cursor.c
index 03ad7ab14f09..9752c35bb84b 100644
--- a/drivers/gpu/drm/nouveau/nv50_cursor.c
+++ b/drivers/gpu/drm/nouveau/nv50_cursor.c
@@ -36,9 +36,9 @@
36static void 36static void
37nv50_cursor_show(struct nouveau_crtc *nv_crtc, bool update) 37nv50_cursor_show(struct nouveau_crtc *nv_crtc, bool update)
38{ 38{
39 struct drm_nouveau_private *dev_priv = nv_crtc->base.dev->dev_private;
40 struct nouveau_channel *evo = dev_priv->evo;
41 struct drm_device *dev = nv_crtc->base.dev; 39 struct drm_device *dev = nv_crtc->base.dev;
40 struct drm_nouveau_private *dev_priv = dev->dev_private;
41 struct nouveau_channel *evo = nv50_display(dev)->master;
42 int ret; 42 int ret;
43 43
44 NV_DEBUG_KMS(dev, "\n"); 44 NV_DEBUG_KMS(dev, "\n");
@@ -71,9 +71,9 @@ nv50_cursor_show(struct nouveau_crtc *nv_crtc, bool update)
71static void 71static void
72nv50_cursor_hide(struct nouveau_crtc *nv_crtc, bool update) 72nv50_cursor_hide(struct nouveau_crtc *nv_crtc, bool update)
73{ 73{
74 struct drm_nouveau_private *dev_priv = nv_crtc->base.dev->dev_private;
75 struct nouveau_channel *evo = dev_priv->evo;
76 struct drm_device *dev = nv_crtc->base.dev; 74 struct drm_device *dev = nv_crtc->base.dev;
75 struct drm_nouveau_private *dev_priv = dev->dev_private;
76 struct nouveau_channel *evo = nv50_display(dev)->master;
77 int ret; 77 int ret;
78 78
79 NV_DEBUG_KMS(dev, "\n"); 79 NV_DEBUG_KMS(dev, "\n");
@@ -147,7 +147,7 @@ nv50_cursor_fini(struct nouveau_crtc *nv_crtc)
147 NV_DEBUG_KMS(dev, "\n"); 147 NV_DEBUG_KMS(dev, "\n");
148 148
149 nv_wr32(dev, NV50_PDISPLAY_CURSOR_CURSOR_CTRL2(idx), 0); 149 nv_wr32(dev, NV50_PDISPLAY_CURSOR_CURSOR_CTRL2(idx), 0);
150 if (!nv_wait(NV50_PDISPLAY_CURSOR_CURSOR_CTRL2(idx), 150 if (!nv_wait(dev, NV50_PDISPLAY_CURSOR_CURSOR_CTRL2(idx),
151 NV50_PDISPLAY_CURSOR_CURSOR_CTRL2_STATUS, 0)) { 151 NV50_PDISPLAY_CURSOR_CURSOR_CTRL2_STATUS, 0)) {
152 NV_ERROR(dev, "timeout: CURSOR_CTRL2_STATUS == 0\n"); 152 NV_ERROR(dev, "timeout: CURSOR_CTRL2_STATUS == 0\n");
153 NV_ERROR(dev, "CURSOR_CTRL2 = 0x%08x\n", 153 NV_ERROR(dev, "CURSOR_CTRL2 = 0x%08x\n",
diff --git a/drivers/gpu/drm/nouveau/nv50_dac.c b/drivers/gpu/drm/nouveau/nv50_dac.c
index 1bc085962945..808f3ec8f827 100644
--- a/drivers/gpu/drm/nouveau/nv50_dac.c
+++ b/drivers/gpu/drm/nouveau/nv50_dac.c
@@ -41,8 +41,7 @@ nv50_dac_disconnect(struct drm_encoder *encoder)
41{ 41{
42 struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder); 42 struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder);
43 struct drm_device *dev = encoder->dev; 43 struct drm_device *dev = encoder->dev;
44 struct drm_nouveau_private *dev_priv = dev->dev_private; 44 struct nouveau_channel *evo = nv50_display(dev)->master;
45 struct nouveau_channel *evo = dev_priv->evo;
46 int ret; 45 int ret;
47 46
48 if (!nv_encoder->crtc) 47 if (!nv_encoder->crtc)
@@ -79,7 +78,7 @@ nv50_dac_detect(struct drm_encoder *encoder, struct drm_connector *connector)
79 78
80 nv_wr32(dev, NV50_PDISPLAY_DAC_DPMS_CTRL(or), 79 nv_wr32(dev, NV50_PDISPLAY_DAC_DPMS_CTRL(or),
81 0x00150000 | NV50_PDISPLAY_DAC_DPMS_CTRL_PENDING); 80 0x00150000 | NV50_PDISPLAY_DAC_DPMS_CTRL_PENDING);
82 if (!nv_wait(NV50_PDISPLAY_DAC_DPMS_CTRL(or), 81 if (!nv_wait(dev, NV50_PDISPLAY_DAC_DPMS_CTRL(or),
83 NV50_PDISPLAY_DAC_DPMS_CTRL_PENDING, 0)) { 82 NV50_PDISPLAY_DAC_DPMS_CTRL_PENDING, 0)) {
84 NV_ERROR(dev, "timeout: DAC_DPMS_CTRL_PENDING(%d) == 0\n", or); 83 NV_ERROR(dev, "timeout: DAC_DPMS_CTRL_PENDING(%d) == 0\n", or);
85 NV_ERROR(dev, "DAC_DPMS_CTRL(%d) = 0x%08x\n", or, 84 NV_ERROR(dev, "DAC_DPMS_CTRL(%d) = 0x%08x\n", or,
@@ -130,7 +129,7 @@ nv50_dac_dpms(struct drm_encoder *encoder, int mode)
130 NV_DEBUG_KMS(dev, "or %d mode %d\n", or, mode); 129 NV_DEBUG_KMS(dev, "or %d mode %d\n", or, mode);
131 130
132 /* wait for it to be done */ 131 /* wait for it to be done */
133 if (!nv_wait(NV50_PDISPLAY_DAC_DPMS_CTRL(or), 132 if (!nv_wait(dev, NV50_PDISPLAY_DAC_DPMS_CTRL(or),
134 NV50_PDISPLAY_DAC_DPMS_CTRL_PENDING, 0)) { 133 NV50_PDISPLAY_DAC_DPMS_CTRL_PENDING, 0)) {
135 NV_ERROR(dev, "timeout: DAC_DPMS_CTRL_PENDING(%d) == 0\n", or); 134 NV_ERROR(dev, "timeout: DAC_DPMS_CTRL_PENDING(%d) == 0\n", or);
136 NV_ERROR(dev, "DAC_DPMS_CTRL(%d) = 0x%08x\n", or, 135 NV_ERROR(dev, "DAC_DPMS_CTRL(%d) = 0x%08x\n", or,
@@ -216,8 +215,7 @@ nv50_dac_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode,
216{ 215{
217 struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder); 216 struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder);
218 struct drm_device *dev = encoder->dev; 217 struct drm_device *dev = encoder->dev;
219 struct drm_nouveau_private *dev_priv = dev->dev_private; 218 struct nouveau_channel *evo = nv50_display(dev)->master;
220 struct nouveau_channel *evo = dev_priv->evo;
221 struct nouveau_crtc *crtc = nouveau_crtc(encoder->crtc); 219 struct nouveau_crtc *crtc = nouveau_crtc(encoder->crtc);
222 uint32_t mode_ctl = 0, mode_ctl2 = 0; 220 uint32_t mode_ctl = 0, mode_ctl2 = 0;
223 int ret; 221 int ret;
diff --git a/drivers/gpu/drm/nouveau/nv50_display.c b/drivers/gpu/drm/nouveau/nv50_display.c
index 612fa6d6a0cb..08da478ba544 100644
--- a/drivers/gpu/drm/nouveau/nv50_display.c
+++ b/drivers/gpu/drm/nouveau/nv50_display.c
@@ -24,160 +24,30 @@
24 * 24 *
25 */ 25 */
26 26
27#define NOUVEAU_DMA_DEBUG (nouveau_reg_debug & NOUVEAU_REG_DEBUG_EVO)
27#include "nv50_display.h" 28#include "nv50_display.h"
28#include "nouveau_crtc.h" 29#include "nouveau_crtc.h"
29#include "nouveau_encoder.h" 30#include "nouveau_encoder.h"
30#include "nouveau_connector.h" 31#include "nouveau_connector.h"
31#include "nouveau_fb.h" 32#include "nouveau_fb.h"
32#include "nouveau_fbcon.h" 33#include "nouveau_fbcon.h"
34#include "nouveau_ramht.h"
33#include "drm_crtc_helper.h" 35#include "drm_crtc_helper.h"
34 36
35static void 37static void nv50_display_isr(struct drm_device *);
36nv50_evo_channel_del(struct nouveau_channel **pchan) 38static void nv50_display_bh(unsigned long);
37{
38 struct nouveau_channel *chan = *pchan;
39
40 if (!chan)
41 return;
42 *pchan = NULL;
43
44 nouveau_gpuobj_channel_takedown(chan);
45 nouveau_bo_ref(NULL, &chan->pushbuf_bo);
46
47 if (chan->user)
48 iounmap(chan->user);
49
50 kfree(chan);
51}
52
53static int
54nv50_evo_dmaobj_new(struct nouveau_channel *evo, uint32_t class, uint32_t name,
55 uint32_t tile_flags, uint32_t magic_flags,
56 uint32_t offset, uint32_t limit)
57{
58 struct drm_nouveau_private *dev_priv = evo->dev->dev_private;
59 struct drm_device *dev = evo->dev;
60 struct nouveau_gpuobj *obj = NULL;
61 int ret;
62
63 ret = nouveau_gpuobj_new(dev, evo, 6*4, 32, 0, &obj);
64 if (ret)
65 return ret;
66 obj->engine = NVOBJ_ENGINE_DISPLAY;
67
68 ret = nouveau_gpuobj_ref_add(dev, evo, name, obj, NULL);
69 if (ret) {
70 nouveau_gpuobj_del(dev, &obj);
71 return ret;
72 }
73
74 nv_wo32(dev, obj, 0, (tile_flags << 22) | (magic_flags << 16) | class);
75 nv_wo32(dev, obj, 1, limit);
76 nv_wo32(dev, obj, 2, offset);
77 nv_wo32(dev, obj, 3, 0x00000000);
78 nv_wo32(dev, obj, 4, 0x00000000);
79 if (dev_priv->card_type < NV_C0)
80 nv_wo32(dev, obj, 5, 0x00010000);
81 else
82 nv_wo32(dev, obj, 5, 0x00020000);
83 dev_priv->engine.instmem.flush(dev);
84
85 return 0;
86}
87 39
88static int 40static inline int
89nv50_evo_channel_new(struct drm_device *dev, struct nouveau_channel **pchan) 41nv50_sor_nr(struct drm_device *dev)
90{ 42{
91 struct drm_nouveau_private *dev_priv = dev->dev_private; 43 struct drm_nouveau_private *dev_priv = dev->dev_private;
92 struct nouveau_channel *chan;
93 int ret;
94
95 chan = kzalloc(sizeof(struct nouveau_channel), GFP_KERNEL);
96 if (!chan)
97 return -ENOMEM;
98 *pchan = chan;
99
100 chan->id = -1;
101 chan->dev = dev;
102 chan->user_get = 4;
103 chan->user_put = 0;
104
105 INIT_LIST_HEAD(&chan->ramht_refs);
106
107 ret = nouveau_gpuobj_new_ref(dev, NULL, NULL, 0, 32768, 0x1000,
108 NVOBJ_FLAG_ZERO_ALLOC, &chan->ramin);
109 if (ret) {
110 NV_ERROR(dev, "Error allocating EVO channel memory: %d\n", ret);
111 nv50_evo_channel_del(pchan);
112 return ret;
113 }
114
115 ret = drm_mm_init(&chan->ramin_heap,
116 chan->ramin->gpuobj->im_pramin->start, 32768);
117 if (ret) {
118 NV_ERROR(dev, "Error initialising EVO PRAMIN heap: %d\n", ret);
119 nv50_evo_channel_del(pchan);
120 return ret;
121 }
122
123 ret = nouveau_gpuobj_new_ref(dev, chan, chan, 0, 4096, 16,
124 0, &chan->ramht);
125 if (ret) {
126 NV_ERROR(dev, "Unable to allocate EVO RAMHT: %d\n", ret);
127 nv50_evo_channel_del(pchan);
128 return ret;
129 }
130
131 if (dev_priv->chipset != 0x50) {
132 ret = nv50_evo_dmaobj_new(chan, 0x3d, NvEvoFB16, 0x70, 0x19,
133 0, 0xffffffff);
134 if (ret) {
135 nv50_evo_channel_del(pchan);
136 return ret;
137 }
138
139 44
140 ret = nv50_evo_dmaobj_new(chan, 0x3d, NvEvoFB32, 0x7a, 0x19, 45 if (dev_priv->chipset < 0x90 ||
141 0, 0xffffffff); 46 dev_priv->chipset == 0x92 ||
142 if (ret) { 47 dev_priv->chipset == 0xa0)
143 nv50_evo_channel_del(pchan); 48 return 2;
144 return ret;
145 }
146 }
147
148 ret = nv50_evo_dmaobj_new(chan, 0x3d, NvEvoVRAM, 0, 0x19,
149 0, dev_priv->vram_size);
150 if (ret) {
151 nv50_evo_channel_del(pchan);
152 return ret;
153 }
154
155 ret = nouveau_bo_new(dev, NULL, 4096, 0, TTM_PL_FLAG_VRAM, 0, 0,
156 false, true, &chan->pushbuf_bo);
157 if (ret == 0)
158 ret = nouveau_bo_pin(chan->pushbuf_bo, TTM_PL_FLAG_VRAM);
159 if (ret) {
160 NV_ERROR(dev, "Error creating EVO DMA push buffer: %d\n", ret);
161 nv50_evo_channel_del(pchan);
162 return ret;
163 }
164
165 ret = nouveau_bo_map(chan->pushbuf_bo);
166 if (ret) {
167 NV_ERROR(dev, "Error mapping EVO DMA push buffer: %d\n", ret);
168 nv50_evo_channel_del(pchan);
169 return ret;
170 }
171 49
172 chan->user = ioremap(pci_resource_start(dev->pdev, 0) + 50 return 4;
173 NV50_PDISPLAY_USER(0), PAGE_SIZE);
174 if (!chan->user) {
175 NV_ERROR(dev, "Error mapping EVO control regs.\n");
176 nv50_evo_channel_del(pchan);
177 return -ENOMEM;
178 }
179
180 return 0;
181} 51}
182 52
183int 53int
@@ -195,17 +65,16 @@ int
195nv50_display_init(struct drm_device *dev) 65nv50_display_init(struct drm_device *dev)
196{ 66{
197 struct drm_nouveau_private *dev_priv = dev->dev_private; 67 struct drm_nouveau_private *dev_priv = dev->dev_private;
198 struct nouveau_timer_engine *ptimer = &dev_priv->engine.timer;
199 struct nouveau_gpio_engine *pgpio = &dev_priv->engine.gpio; 68 struct nouveau_gpio_engine *pgpio = &dev_priv->engine.gpio;
200 struct nouveau_channel *evo = dev_priv->evo;
201 struct drm_connector *connector; 69 struct drm_connector *connector;
202 uint32_t val, ram_amount; 70 struct nouveau_channel *evo;
203 uint64_t start;
204 int ret, i; 71 int ret, i;
72 u32 val;
205 73
206 NV_DEBUG_KMS(dev, "\n"); 74 NV_DEBUG_KMS(dev, "\n");
207 75
208 nv_wr32(dev, 0x00610184, nv_rd32(dev, 0x00614004)); 76 nv_wr32(dev, 0x00610184, nv_rd32(dev, 0x00614004));
77
209 /* 78 /*
210 * I think the 0x006101XX range is some kind of main control area 79 * I think the 0x006101XX range is some kind of main control area
211 * that enables things. 80 * that enables things.
@@ -221,17 +90,20 @@ nv50_display_init(struct drm_device *dev)
221 val = nv_rd32(dev, 0x0061610c + (i * 0x800)); 90 val = nv_rd32(dev, 0x0061610c + (i * 0x800));
222 nv_wr32(dev, 0x0061019c + (i * 0x10), val); 91 nv_wr32(dev, 0x0061019c + (i * 0x10), val);
223 } 92 }
93
224 /* DAC */ 94 /* DAC */
225 for (i = 0; i < 3; i++) { 95 for (i = 0; i < 3; i++) {
226 val = nv_rd32(dev, 0x0061a000 + (i * 0x800)); 96 val = nv_rd32(dev, 0x0061a000 + (i * 0x800));
227 nv_wr32(dev, 0x006101d0 + (i * 0x04), val); 97 nv_wr32(dev, 0x006101d0 + (i * 0x04), val);
228 } 98 }
99
229 /* SOR */ 100 /* SOR */
230 for (i = 0; i < 4; i++) { 101 for (i = 0; i < nv50_sor_nr(dev); i++) {
231 val = nv_rd32(dev, 0x0061c000 + (i * 0x800)); 102 val = nv_rd32(dev, 0x0061c000 + (i * 0x800));
232 nv_wr32(dev, 0x006101e0 + (i * 0x04), val); 103 nv_wr32(dev, 0x006101e0 + (i * 0x04), val);
233 } 104 }
234 /* Something not yet in use, tv-out maybe. */ 105
106 /* EXT */
235 for (i = 0; i < 3; i++) { 107 for (i = 0; i < 3; i++) {
236 val = nv_rd32(dev, 0x0061e000 + (i * 0x800)); 108 val = nv_rd32(dev, 0x0061e000 + (i * 0x800));
237 nv_wr32(dev, 0x006101f0 + (i * 0x04), val); 109 nv_wr32(dev, 0x006101f0 + (i * 0x04), val);
@@ -243,24 +115,13 @@ nv50_display_init(struct drm_device *dev)
243 nv_wr32(dev, NV50_PDISPLAY_DAC_CLK_CTRL1(i), 0x00000001); 115 nv_wr32(dev, NV50_PDISPLAY_DAC_CLK_CTRL1(i), 0x00000001);
244 } 116 }
245 117
246 /* This used to be in crtc unblank, but seems out of place there. */
247 nv_wr32(dev, NV50_PDISPLAY_UNK_380, 0);
248 /* RAM is clamped to 256 MiB. */
249 ram_amount = dev_priv->vram_size;
250 NV_DEBUG_KMS(dev, "ram_amount %d\n", ram_amount);
251 if (ram_amount > 256*1024*1024)
252 ram_amount = 256*1024*1024;
253 nv_wr32(dev, NV50_PDISPLAY_RAM_AMOUNT, ram_amount - 1);
254 nv_wr32(dev, NV50_PDISPLAY_UNK_388, 0x150000);
255 nv_wr32(dev, NV50_PDISPLAY_UNK_38C, 0);
256
257 /* The precise purpose is unknown, i suspect it has something to do 118 /* The precise purpose is unknown, i suspect it has something to do
258 * with text mode. 119 * with text mode.
259 */ 120 */
260 if (nv_rd32(dev, NV50_PDISPLAY_INTR_1) & 0x100) { 121 if (nv_rd32(dev, NV50_PDISPLAY_INTR_1) & 0x100) {
261 nv_wr32(dev, NV50_PDISPLAY_INTR_1, 0x100); 122 nv_wr32(dev, NV50_PDISPLAY_INTR_1, 0x100);
262 nv_wr32(dev, 0x006194e8, nv_rd32(dev, 0x006194e8) & ~1); 123 nv_wr32(dev, 0x006194e8, nv_rd32(dev, 0x006194e8) & ~1);
263 if (!nv_wait(0x006194e8, 2, 0)) { 124 if (!nv_wait(dev, 0x006194e8, 2, 0)) {
264 NV_ERROR(dev, "timeout: (0x6194e8 & 2) != 0\n"); 125 NV_ERROR(dev, "timeout: (0x6194e8 & 2) != 0\n");
265 NV_ERROR(dev, "0x6194e8 = 0x%08x\n", 126 NV_ERROR(dev, "0x6194e8 = 0x%08x\n",
266 nv_rd32(dev, 0x6194e8)); 127 nv_rd32(dev, 0x6194e8));
@@ -268,39 +129,9 @@ nv50_display_init(struct drm_device *dev)
268 } 129 }
269 } 130 }
270 131
271 /* taken from nv bug #12637, attempts to un-wedge the hw if it's
272 * stuck in some unspecified state
273 */
274 start = ptimer->read(dev);
275 nv_wr32(dev, NV50_PDISPLAY_CHANNEL_STAT(0), 0x2b00);
276 while ((val = nv_rd32(dev, NV50_PDISPLAY_CHANNEL_STAT(0))) & 0x1e0000) {
277 if ((val & 0x9f0000) == 0x20000)
278 nv_wr32(dev, NV50_PDISPLAY_CHANNEL_STAT(0),
279 val | 0x800000);
280
281 if ((val & 0x3f0000) == 0x30000)
282 nv_wr32(dev, NV50_PDISPLAY_CHANNEL_STAT(0),
283 val | 0x200000);
284
285 if (ptimer->read(dev) - start > 1000000000ULL) {
286 NV_ERROR(dev, "timeout: (0x610200 & 0x1e0000) != 0\n");
287 NV_ERROR(dev, "0x610200 = 0x%08x\n", val);
288 return -EBUSY;
289 }
290 }
291
292 nv_wr32(dev, NV50_PDISPLAY_CTRL_STATE, NV50_PDISPLAY_CTRL_STATE_ENABLE);
293 nv_wr32(dev, NV50_PDISPLAY_CHANNEL_STAT(0), 0x1000b03);
294 if (!nv_wait(NV50_PDISPLAY_CHANNEL_STAT(0), 0x40000000, 0x40000000)) {
295 NV_ERROR(dev, "timeout: (0x610200 & 0x40000000) == 0x40000000\n");
296 NV_ERROR(dev, "0x610200 = 0x%08x\n",
297 nv_rd32(dev, NV50_PDISPLAY_CHANNEL_STAT(0)));
298 return -EBUSY;
299 }
300
301 for (i = 0; i < 2; i++) { 132 for (i = 0; i < 2; i++) {
302 nv_wr32(dev, NV50_PDISPLAY_CURSOR_CURSOR_CTRL2(i), 0x2000); 133 nv_wr32(dev, NV50_PDISPLAY_CURSOR_CURSOR_CTRL2(i), 0x2000);
303 if (!nv_wait(NV50_PDISPLAY_CURSOR_CURSOR_CTRL2(i), 134 if (!nv_wait(dev, NV50_PDISPLAY_CURSOR_CURSOR_CTRL2(i),
304 NV50_PDISPLAY_CURSOR_CURSOR_CTRL2_STATUS, 0)) { 135 NV50_PDISPLAY_CURSOR_CURSOR_CTRL2_STATUS, 0)) {
305 NV_ERROR(dev, "timeout: CURSOR_CTRL2_STATUS == 0\n"); 136 NV_ERROR(dev, "timeout: CURSOR_CTRL2_STATUS == 0\n");
306 NV_ERROR(dev, "CURSOR_CTRL2 = 0x%08x\n", 137 NV_ERROR(dev, "CURSOR_CTRL2 = 0x%08x\n",
@@ -310,7 +141,7 @@ nv50_display_init(struct drm_device *dev)
310 141
311 nv_wr32(dev, NV50_PDISPLAY_CURSOR_CURSOR_CTRL2(i), 142 nv_wr32(dev, NV50_PDISPLAY_CURSOR_CURSOR_CTRL2(i),
312 NV50_PDISPLAY_CURSOR_CURSOR_CTRL2_ON); 143 NV50_PDISPLAY_CURSOR_CURSOR_CTRL2_ON);
313 if (!nv_wait(NV50_PDISPLAY_CURSOR_CURSOR_CTRL2(i), 144 if (!nv_wait(dev, NV50_PDISPLAY_CURSOR_CURSOR_CTRL2(i),
314 NV50_PDISPLAY_CURSOR_CURSOR_CTRL2_STATUS, 145 NV50_PDISPLAY_CURSOR_CURSOR_CTRL2_STATUS,
315 NV50_PDISPLAY_CURSOR_CURSOR_CTRL2_STATUS_ACTIVE)) { 146 NV50_PDISPLAY_CURSOR_CURSOR_CTRL2_STATUS_ACTIVE)) {
316 NV_ERROR(dev, "timeout: " 147 NV_ERROR(dev, "timeout: "
@@ -321,46 +152,38 @@ nv50_display_init(struct drm_device *dev)
321 } 152 }
322 } 153 }
323 154
324 nv_wr32(dev, NV50_PDISPLAY_OBJECTS, (evo->ramin->instance >> 8) | 9); 155 nv_wr32(dev, NV50_PDISPLAY_PIO_CTRL, 0x00000000);
325 156 nv_mask(dev, NV50_PDISPLAY_INTR_0, 0x00000000, 0x00000000);
326 /* initialise fifo */ 157 nv_wr32(dev, NV50_PDISPLAY_INTR_EN_0, 0x00000000);
327 nv_wr32(dev, NV50_PDISPLAY_CHANNEL_DMA_CB(0), 158 nv_mask(dev, NV50_PDISPLAY_INTR_1, 0x00000000, 0x00000000);
328 ((evo->pushbuf_bo->bo.mem.mm_node->start << PAGE_SHIFT) >> 8) | 159 nv_wr32(dev, NV50_PDISPLAY_INTR_EN_1,
329 NV50_PDISPLAY_CHANNEL_DMA_CB_LOCATION_VRAM | 160 NV50_PDISPLAY_INTR_EN_1_CLK_UNK10 |
330 NV50_PDISPLAY_CHANNEL_DMA_CB_VALID); 161 NV50_PDISPLAY_INTR_EN_1_CLK_UNK20 |
331 nv_wr32(dev, NV50_PDISPLAY_CHANNEL_UNK2(0), 0x00010000); 162 NV50_PDISPLAY_INTR_EN_1_CLK_UNK40);
332 nv_wr32(dev, NV50_PDISPLAY_CHANNEL_UNK3(0), 0x00000002); 163
333 if (!nv_wait(0x610200, 0x80000000, 0x00000000)) { 164 /* enable hotplug interrupts */
334 NV_ERROR(dev, "timeout: (0x610200 & 0x80000000) == 0\n"); 165 list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
335 NV_ERROR(dev, "0x610200 = 0x%08x\n", nv_rd32(dev, 0x610200)); 166 struct nouveau_connector *conn = nouveau_connector(connector);
336 return -EBUSY; 167
168 if (conn->dcb->gpio_tag == 0xff)
169 continue;
170
171 pgpio->irq_enable(dev, conn->dcb->gpio_tag, true);
337 } 172 }
338 nv_wr32(dev, NV50_PDISPLAY_CHANNEL_STAT(0), 173
339 (nv_rd32(dev, NV50_PDISPLAY_CHANNEL_STAT(0)) & ~0x00000003) | 174 ret = nv50_evo_init(dev);
340 NV50_PDISPLAY_CHANNEL_STAT_DMA_ENABLED);
341 nv_wr32(dev, NV50_PDISPLAY_USER_PUT(0), 0);
342 nv_wr32(dev, NV50_PDISPLAY_CHANNEL_STAT(0), 0x01000003 |
343 NV50_PDISPLAY_CHANNEL_STAT_DMA_ENABLED);
344 nv_wr32(dev, 0x610300, nv_rd32(dev, 0x610300) & ~1);
345
346 evo->dma.max = (4096/4) - 2;
347 evo->dma.put = 0;
348 evo->dma.cur = evo->dma.put;
349 evo->dma.free = evo->dma.max - evo->dma.cur;
350
351 ret = RING_SPACE(evo, NOUVEAU_DMA_SKIPS);
352 if (ret) 175 if (ret)
353 return ret; 176 return ret;
177 evo = nv50_display(dev)->master;
354 178
355 for (i = 0; i < NOUVEAU_DMA_SKIPS; i++) 179 nv_wr32(dev, NV50_PDISPLAY_OBJECTS, (evo->ramin->vinst >> 8) | 9);
356 OUT_RING(evo, 0);
357 180
358 ret = RING_SPACE(evo, 11); 181 ret = RING_SPACE(evo, 15);
359 if (ret) 182 if (ret)
360 return ret; 183 return ret;
361 BEGIN_RING(evo, 0, NV50_EVO_UNK84, 2); 184 BEGIN_RING(evo, 0, NV50_EVO_UNK84, 2);
362 OUT_RING(evo, NV50_EVO_UNK84_NOTIFY_DISABLED); 185 OUT_RING(evo, NV50_EVO_UNK84_NOTIFY_DISABLED);
363 OUT_RING(evo, NV50_EVO_DMA_NOTIFY_HANDLE_NONE); 186 OUT_RING(evo, NvEvoSync);
364 BEGIN_RING(evo, 0, NV50_EVO_CRTC(0, FB_DMA), 1); 187 BEGIN_RING(evo, 0, NV50_EVO_CRTC(0, FB_DMA), 1);
365 OUT_RING(evo, NV50_EVO_CRTC_FB_DMA_HANDLE_NONE); 188 OUT_RING(evo, NV50_EVO_CRTC_FB_DMA_HANDLE_NONE);
366 BEGIN_RING(evo, 0, NV50_EVO_CRTC(0, UNK0800), 1); 189 BEGIN_RING(evo, 0, NV50_EVO_CRTC(0, UNK0800), 1);
@@ -369,25 +192,15 @@ nv50_display_init(struct drm_device *dev)
369 OUT_RING(evo, 0); 192 OUT_RING(evo, 0);
370 BEGIN_RING(evo, 0, NV50_EVO_CRTC(0, UNK082C), 1); 193 BEGIN_RING(evo, 0, NV50_EVO_CRTC(0, UNK082C), 1);
371 OUT_RING(evo, 0); 194 OUT_RING(evo, 0);
195 /* required to make display sync channels not hate life */
196 BEGIN_RING(evo, 0, NV50_EVO_CRTC(0, UNK900), 1);
197 OUT_RING (evo, 0x00000311);
198 BEGIN_RING(evo, 0, NV50_EVO_CRTC(1, UNK900), 1);
199 OUT_RING (evo, 0x00000311);
372 FIRE_RING(evo); 200 FIRE_RING(evo);
373 if (!nv_wait(0x640004, 0xffffffff, evo->dma.put << 2)) 201 if (!nv_wait(dev, 0x640004, 0xffffffff, evo->dma.put << 2))
374 NV_ERROR(dev, "evo pushbuf stalled\n"); 202 NV_ERROR(dev, "evo pushbuf stalled\n");
375 203
376 /* enable clock change interrupts. */
377 nv_wr32(dev, 0x610028, 0x00010001);
378 nv_wr32(dev, NV50_PDISPLAY_INTR_EN, (NV50_PDISPLAY_INTR_EN_CLK_UNK10 |
379 NV50_PDISPLAY_INTR_EN_CLK_UNK20 |
380 NV50_PDISPLAY_INTR_EN_CLK_UNK40));
381
382 /* enable hotplug interrupts */
383 list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
384 struct nouveau_connector *conn = nouveau_connector(connector);
385
386 if (conn->dcb->gpio_tag == 0xff)
387 continue;
388
389 pgpio->irq_enable(dev, conn->dcb->gpio_tag, true);
390 }
391 204
392 return 0; 205 return 0;
393} 206}
@@ -395,6 +208,8 @@ nv50_display_init(struct drm_device *dev)
395static int nv50_display_disable(struct drm_device *dev) 208static int nv50_display_disable(struct drm_device *dev)
396{ 209{
397 struct drm_nouveau_private *dev_priv = dev->dev_private; 210 struct drm_nouveau_private *dev_priv = dev->dev_private;
211 struct nv50_display *disp = nv50_display(dev);
212 struct nouveau_channel *evo = disp->master;
398 struct drm_crtc *drm_crtc; 213 struct drm_crtc *drm_crtc;
399 int ret, i; 214 int ret, i;
400 215
@@ -406,12 +221,12 @@ static int nv50_display_disable(struct drm_device *dev)
406 nv50_crtc_blank(crtc, true); 221 nv50_crtc_blank(crtc, true);
407 } 222 }
408 223
409 ret = RING_SPACE(dev_priv->evo, 2); 224 ret = RING_SPACE(evo, 2);
410 if (ret == 0) { 225 if (ret == 0) {
411 BEGIN_RING(dev_priv->evo, 0, NV50_EVO_UPDATE, 1); 226 BEGIN_RING(evo, 0, NV50_EVO_UPDATE, 1);
412 OUT_RING(dev_priv->evo, 0); 227 OUT_RING(evo, 0);
413 } 228 }
414 FIRE_RING(dev_priv->evo); 229 FIRE_RING(evo);
415 230
416 /* Almost like ack'ing a vblank interrupt, maybe in the spirit of 231 /* Almost like ack'ing a vblank interrupt, maybe in the spirit of
417 * cleaning up? 232 * cleaning up?
@@ -424,7 +239,7 @@ static int nv50_display_disable(struct drm_device *dev)
424 continue; 239 continue;
425 240
426 nv_wr32(dev, NV50_PDISPLAY_INTR_1, mask); 241 nv_wr32(dev, NV50_PDISPLAY_INTR_1, mask);
427 if (!nv_wait(NV50_PDISPLAY_INTR_1, mask, mask)) { 242 if (!nv_wait(dev, NV50_PDISPLAY_INTR_1, mask, mask)) {
428 NV_ERROR(dev, "timeout: (0x610024 & 0x%08x) == " 243 NV_ERROR(dev, "timeout: (0x610024 & 0x%08x) == "
429 "0x%08x\n", mask, mask); 244 "0x%08x\n", mask, mask);
430 NV_ERROR(dev, "0x610024 = 0x%08x\n", 245 NV_ERROR(dev, "0x610024 = 0x%08x\n",
@@ -432,16 +247,10 @@ static int nv50_display_disable(struct drm_device *dev)
432 } 247 }
433 } 248 }
434 249
435 nv_wr32(dev, NV50_PDISPLAY_CHANNEL_STAT(0), 0); 250 nv50_evo_fini(dev);
436 nv_wr32(dev, NV50_PDISPLAY_CTRL_STATE, 0);
437 if (!nv_wait(NV50_PDISPLAY_CHANNEL_STAT(0), 0x1e0000, 0)) {
438 NV_ERROR(dev, "timeout: (0x610200 & 0x1e0000) == 0\n");
439 NV_ERROR(dev, "0x610200 = 0x%08x\n",
440 nv_rd32(dev, NV50_PDISPLAY_CHANNEL_STAT(0)));
441 }
442 251
443 for (i = 0; i < 3; i++) { 252 for (i = 0; i < 3; i++) {
444 if (!nv_wait(NV50_PDISPLAY_SOR_DPMS_STATE(i), 253 if (!nv_wait(dev, NV50_PDISPLAY_SOR_DPMS_STATE(i),
445 NV50_PDISPLAY_SOR_DPMS_STATE_WAIT, 0)) { 254 NV50_PDISPLAY_SOR_DPMS_STATE_WAIT, 0)) {
446 NV_ERROR(dev, "timeout: SOR_DPMS_STATE_WAIT(%d) == 0\n", i); 255 NV_ERROR(dev, "timeout: SOR_DPMS_STATE_WAIT(%d) == 0\n", i);
447 NV_ERROR(dev, "SOR_DPMS_STATE(%d) = 0x%08x\n", i, 256 NV_ERROR(dev, "SOR_DPMS_STATE(%d) = 0x%08x\n", i,
@@ -450,7 +259,7 @@ static int nv50_display_disable(struct drm_device *dev)
450 } 259 }
451 260
452 /* disable interrupts. */ 261 /* disable interrupts. */
453 nv_wr32(dev, NV50_PDISPLAY_INTR_EN, 0x00000000); 262 nv_wr32(dev, NV50_PDISPLAY_INTR_EN_1, 0x00000000);
454 263
455 /* disable hotplug interrupts */ 264 /* disable hotplug interrupts */
456 nv_wr32(dev, 0xe054, 0xffffffff); 265 nv_wr32(dev, 0xe054, 0xffffffff);
@@ -467,10 +276,16 @@ int nv50_display_create(struct drm_device *dev)
467 struct drm_nouveau_private *dev_priv = dev->dev_private; 276 struct drm_nouveau_private *dev_priv = dev->dev_private;
468 struct dcb_table *dcb = &dev_priv->vbios.dcb; 277 struct dcb_table *dcb = &dev_priv->vbios.dcb;
469 struct drm_connector *connector, *ct; 278 struct drm_connector *connector, *ct;
279 struct nv50_display *priv;
470 int ret, i; 280 int ret, i;
471 281
472 NV_DEBUG_KMS(dev, "\n"); 282 NV_DEBUG_KMS(dev, "\n");
473 283
284 priv = kzalloc(sizeof(*priv), GFP_KERNEL);
285 if (!priv)
286 return -ENOMEM;
287 dev_priv->engine.display.priv = priv;
288
474 /* init basic kernel modesetting */ 289 /* init basic kernel modesetting */
475 drm_mode_config_init(dev); 290 drm_mode_config_init(dev);
476 291
@@ -488,13 +303,6 @@ int nv50_display_create(struct drm_device *dev)
488 303
489 dev->mode_config.fb_base = dev_priv->fb_phys; 304 dev->mode_config.fb_base = dev_priv->fb_phys;
490 305
491 /* Create EVO channel */
492 ret = nv50_evo_channel_new(dev, &dev_priv->evo);
493 if (ret) {
494 NV_ERROR(dev, "Error creating EVO channel: %d\n", ret);
495 return ret;
496 }
497
498 /* Create CRTC objects */ 306 /* Create CRTC objects */
499 for (i = 0; i < 2; i++) 307 for (i = 0; i < 2; i++)
500 nv50_crtc_create(dev, i); 308 nv50_crtc_create(dev, i);
@@ -537,6 +345,9 @@ int nv50_display_create(struct drm_device *dev)
537 } 345 }
538 } 346 }
539 347
348 tasklet_init(&priv->tasklet, nv50_display_bh, (unsigned long)dev);
349 nouveau_irq_register(dev, 26, nv50_display_isr);
350
540 ret = nv50_display_init(dev); 351 ret = nv50_display_init(dev);
541 if (ret) { 352 if (ret) {
542 nv50_display_destroy(dev); 353 nv50_display_destroy(dev);
@@ -549,14 +360,142 @@ int nv50_display_create(struct drm_device *dev)
549void 360void
550nv50_display_destroy(struct drm_device *dev) 361nv50_display_destroy(struct drm_device *dev)
551{ 362{
552 struct drm_nouveau_private *dev_priv = dev->dev_private; 363 struct nv50_display *disp = nv50_display(dev);
553 364
554 NV_DEBUG_KMS(dev, "\n"); 365 NV_DEBUG_KMS(dev, "\n");
555 366
556 drm_mode_config_cleanup(dev); 367 drm_mode_config_cleanup(dev);
557 368
558 nv50_display_disable(dev); 369 nv50_display_disable(dev);
559 nv50_evo_channel_del(&dev_priv->evo); 370 nouveau_irq_unregister(dev, 26);
371 kfree(disp);
372}
373
374void
375nv50_display_flip_stop(struct drm_crtc *crtc)
376{
377 struct nv50_display *disp = nv50_display(crtc->dev);
378 struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc);
379 struct nv50_display_crtc *dispc = &disp->crtc[nv_crtc->index];
380 struct nouveau_channel *evo = dispc->sync;
381 int ret;
382
383 ret = RING_SPACE(evo, 8);
384 if (ret) {
385 WARN_ON(1);
386 return;
387 }
388
389 BEGIN_RING(evo, 0, 0x0084, 1);
390 OUT_RING (evo, 0x00000000);
391 BEGIN_RING(evo, 0, 0x0094, 1);
392 OUT_RING (evo, 0x00000000);
393 BEGIN_RING(evo, 0, 0x00c0, 1);
394 OUT_RING (evo, 0x00000000);
395 BEGIN_RING(evo, 0, 0x0080, 1);
396 OUT_RING (evo, 0x00000000);
397 FIRE_RING (evo);
398}
399
400int
401nv50_display_flip_next(struct drm_crtc *crtc, struct drm_framebuffer *fb,
402 struct nouveau_channel *chan)
403{
404 struct drm_nouveau_private *dev_priv = crtc->dev->dev_private;
405 struct nouveau_framebuffer *nv_fb = nouveau_framebuffer(fb);
406 struct nv50_display *disp = nv50_display(crtc->dev);
407 struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc);
408 struct nv50_display_crtc *dispc = &disp->crtc[nv_crtc->index];
409 struct nouveau_channel *evo = dispc->sync;
410 int ret;
411
412 ret = RING_SPACE(evo, chan ? 25 : 27);
413 if (unlikely(ret))
414 return ret;
415
416 /* synchronise with the rendering channel, if necessary */
417 if (likely(chan)) {
418 u64 offset = dispc->sem.bo->vma.offset + dispc->sem.offset;
419
420 ret = RING_SPACE(chan, 10);
421 if (ret) {
422 WIND_RING(evo);
423 return ret;
424 }
425
426 if (dev_priv->chipset < 0xc0) {
427 BEGIN_RING(chan, NvSubSw, 0x0060, 2);
428 OUT_RING (chan, NvEvoSema0 + nv_crtc->index);
429 OUT_RING (chan, dispc->sem.offset);
430 BEGIN_RING(chan, NvSubSw, 0x006c, 1);
431 OUT_RING (chan, 0xf00d0000 | dispc->sem.value);
432 BEGIN_RING(chan, NvSubSw, 0x0064, 2);
433 OUT_RING (chan, dispc->sem.offset ^ 0x10);
434 OUT_RING (chan, 0x74b1e000);
435 BEGIN_RING(chan, NvSubSw, 0x0060, 1);
436 if (dev_priv->chipset < 0x84)
437 OUT_RING (chan, NvSema);
438 else
439 OUT_RING (chan, chan->vram_handle);
440 } else {
441 BEGIN_NVC0(chan, 2, NvSubM2MF, 0x0010, 4);
442 OUT_RING (chan, upper_32_bits(offset));
443 OUT_RING (chan, lower_32_bits(offset));
444 OUT_RING (chan, 0xf00d0000 | dispc->sem.value);
445 OUT_RING (chan, 0x1002);
446 BEGIN_NVC0(chan, 2, NvSubM2MF, 0x0010, 4);
447 OUT_RING (chan, upper_32_bits(offset));
448 OUT_RING (chan, lower_32_bits(offset ^ 0x10));
449 OUT_RING (chan, 0x74b1e000);
450 OUT_RING (chan, 0x1001);
451 }
452 FIRE_RING (chan);
453 } else {
454 nouveau_bo_wr32(dispc->sem.bo, dispc->sem.offset / 4,
455 0xf00d0000 | dispc->sem.value);
456 }
457
458 /* queue the flip on the crtc's "display sync" channel */
459 BEGIN_RING(evo, 0, 0x0100, 1);
460 OUT_RING (evo, 0xfffe0000);
461 if (chan) {
462 BEGIN_RING(evo, 0, 0x0084, 1);
463 OUT_RING (evo, 0x00000100);
464 } else {
465 BEGIN_RING(evo, 0, 0x0084, 1);
466 OUT_RING (evo, 0x00000010);
467 /* allows gamma somehow, PDISP will bitch at you if
468 * you don't wait for vblank before changing this..
469 */
470 BEGIN_RING(evo, 0, 0x00e0, 1);
471 OUT_RING (evo, 0x40000000);
472 }
473 BEGIN_RING(evo, 0, 0x0088, 4);
474 OUT_RING (evo, dispc->sem.offset);
475 OUT_RING (evo, 0xf00d0000 | dispc->sem.value);
476 OUT_RING (evo, 0x74b1e000);
477 OUT_RING (evo, NvEvoSync);
478 BEGIN_RING(evo, 0, 0x00a0, 2);
479 OUT_RING (evo, 0x00000000);
480 OUT_RING (evo, 0x00000000);
481 BEGIN_RING(evo, 0, 0x00c0, 1);
482 OUT_RING (evo, nv_fb->r_dma);
483 BEGIN_RING(evo, 0, 0x0110, 2);
484 OUT_RING (evo, 0x00000000);
485 OUT_RING (evo, 0x00000000);
486 BEGIN_RING(evo, 0, 0x0800, 5);
487 OUT_RING (evo, (nv_fb->nvbo->bo.mem.start << PAGE_SHIFT) >> 8);
488 OUT_RING (evo, 0);
489 OUT_RING (evo, (fb->height << 16) | fb->width);
490 OUT_RING (evo, nv_fb->r_pitch);
491 OUT_RING (evo, nv_fb->r_format);
492 BEGIN_RING(evo, 0, 0x0080, 1);
493 OUT_RING (evo, 0x00000000);
494 FIRE_RING (evo);
495
496 dispc->sem.offset ^= 0x10;
497 dispc->sem.value++;
498 return 0;
560} 499}
561 500
562static u16 501static u16
@@ -589,13 +528,25 @@ nv50_display_script_select(struct drm_device *dev, struct dcb_entry *dcb,
589 if (bios->fp.if_is_24bit) 528 if (bios->fp.if_is_24bit)
590 script |= 0x0200; 529 script |= 0x0200;
591 } else { 530 } else {
531 /* determine number of lvds links */
532 if (nv_connector && nv_connector->edid &&
533 nv_connector->dcb->type == DCB_CONNECTOR_LVDS_SPWG) {
534 /* http://www.spwg.org */
535 if (((u8 *)nv_connector->edid)[121] == 2)
536 script |= 0x0100;
537 } else
592 if (pxclk >= bios->fp.duallink_transition_clk) { 538 if (pxclk >= bios->fp.duallink_transition_clk) {
593 script |= 0x0100; 539 script |= 0x0100;
540 }
541
542 /* determine panel depth */
543 if (script & 0x0100) {
594 if (bios->fp.strapless_is_24bit & 2) 544 if (bios->fp.strapless_is_24bit & 2)
595 script |= 0x0200; 545 script |= 0x0200;
596 } else 546 } else {
597 if (bios->fp.strapless_is_24bit & 1) 547 if (bios->fp.strapless_is_24bit & 1)
598 script |= 0x0200; 548 script |= 0x0200;
549 }
599 550
600 if (nv_connector && nv_connector->edid && 551 if (nv_connector && nv_connector->edid &&
601 (nv_connector->edid->revision >= 4) && 552 (nv_connector->edid->revision >= 4) &&
@@ -640,43 +591,44 @@ static void
640nv50_display_vblank_crtc_handler(struct drm_device *dev, int crtc) 591nv50_display_vblank_crtc_handler(struct drm_device *dev, int crtc)
641{ 592{
642 struct drm_nouveau_private *dev_priv = dev->dev_private; 593 struct drm_nouveau_private *dev_priv = dev->dev_private;
643 struct nouveau_channel *chan; 594 struct nouveau_channel *chan, *tmp;
644 struct list_head *entry, *tmp;
645 595
646 list_for_each_safe(entry, tmp, &dev_priv->vbl_waiting) { 596 list_for_each_entry_safe(chan, tmp, &dev_priv->vbl_waiting,
647 chan = list_entry(entry, struct nouveau_channel, nvsw.vbl_wait); 597 nvsw.vbl_wait) {
598 if (chan->nvsw.vblsem_head != crtc)
599 continue;
648 600
649 nouveau_bo_wr32(chan->notifier_bo, chan->nvsw.vblsem_offset, 601 nouveau_bo_wr32(chan->notifier_bo, chan->nvsw.vblsem_offset,
650 chan->nvsw.vblsem_rval); 602 chan->nvsw.vblsem_rval);
651 list_del(&chan->nvsw.vbl_wait); 603 list_del(&chan->nvsw.vbl_wait);
604 drm_vblank_put(dev, crtc);
652 } 605 }
606
607 drm_handle_vblank(dev, crtc);
653} 608}
654 609
655static void 610static void
656nv50_display_vblank_handler(struct drm_device *dev, uint32_t intr) 611nv50_display_vblank_handler(struct drm_device *dev, uint32_t intr)
657{ 612{
658 intr &= NV50_PDISPLAY_INTR_1_VBLANK_CRTC;
659
660 if (intr & NV50_PDISPLAY_INTR_1_VBLANK_CRTC_0) 613 if (intr & NV50_PDISPLAY_INTR_1_VBLANK_CRTC_0)
661 nv50_display_vblank_crtc_handler(dev, 0); 614 nv50_display_vblank_crtc_handler(dev, 0);
662 615
663 if (intr & NV50_PDISPLAY_INTR_1_VBLANK_CRTC_1) 616 if (intr & NV50_PDISPLAY_INTR_1_VBLANK_CRTC_1)
664 nv50_display_vblank_crtc_handler(dev, 1); 617 nv50_display_vblank_crtc_handler(dev, 1);
665 618
666 nv_wr32(dev, NV50_PDISPLAY_INTR_EN, nv_rd32(dev, 619 nv_wr32(dev, NV50_PDISPLAY_INTR_1, NV50_PDISPLAY_INTR_1_VBLANK_CRTC);
667 NV50_PDISPLAY_INTR_EN) & ~intr);
668 nv_wr32(dev, NV50_PDISPLAY_INTR_1, intr);
669} 620}
670 621
671static void 622static void
672nv50_display_unk10_handler(struct drm_device *dev) 623nv50_display_unk10_handler(struct drm_device *dev)
673{ 624{
674 struct drm_nouveau_private *dev_priv = dev->dev_private; 625 struct drm_nouveau_private *dev_priv = dev->dev_private;
626 struct nv50_display *disp = nv50_display(dev);
675 u32 unk30 = nv_rd32(dev, 0x610030), mc; 627 u32 unk30 = nv_rd32(dev, 0x610030), mc;
676 int i, crtc, or, type = OUTPUT_ANY; 628 int i, crtc, or, type = OUTPUT_ANY;
677 629
678 NV_DEBUG_KMS(dev, "0x610030: 0x%08x\n", unk30); 630 NV_DEBUG_KMS(dev, "0x610030: 0x%08x\n", unk30);
679 dev_priv->evo_irq.dcb = NULL; 631 disp->irq.dcb = NULL;
680 632
681 nv_wr32(dev, 0x619494, nv_rd32(dev, 0x619494) & ~8); 633 nv_wr32(dev, 0x619494, nv_rd32(dev, 0x619494) & ~8);
682 634
@@ -710,7 +662,7 @@ nv50_display_unk10_handler(struct drm_device *dev)
710 or = i; 662 or = i;
711 } 663 }
712 664
713 for (i = 0; type == OUTPUT_ANY && i < 4; i++) { 665 for (i = 0; type == OUTPUT_ANY && i < nv50_sor_nr(dev); i++) {
714 if (dev_priv->chipset < 0x90 || 666 if (dev_priv->chipset < 0x90 ||
715 dev_priv->chipset == 0x92 || 667 dev_priv->chipset == 0x92 ||
716 dev_priv->chipset == 0xa0) 668 dev_priv->chipset == 0xa0)
@@ -747,7 +699,7 @@ nv50_display_unk10_handler(struct drm_device *dev)
747 699
748 if (dcb->type == type && (dcb->or & (1 << or))) { 700 if (dcb->type == type && (dcb->or & (1 << or))) {
749 nouveau_bios_run_display_table(dev, dcb, 0, -1); 701 nouveau_bios_run_display_table(dev, dcb, 0, -1);
750 dev_priv->evo_irq.dcb = dcb; 702 disp->irq.dcb = dcb;
751 goto ack; 703 goto ack;
752 } 704 }
753 } 705 }
@@ -793,15 +745,16 @@ static void
793nv50_display_unk20_handler(struct drm_device *dev) 745nv50_display_unk20_handler(struct drm_device *dev)
794{ 746{
795 struct drm_nouveau_private *dev_priv = dev->dev_private; 747 struct drm_nouveau_private *dev_priv = dev->dev_private;
796 u32 unk30 = nv_rd32(dev, 0x610030), tmp, pclk, script, mc; 748 struct nv50_display *disp = nv50_display(dev);
749 u32 unk30 = nv_rd32(dev, 0x610030), tmp, pclk, script, mc = 0;
797 struct dcb_entry *dcb; 750 struct dcb_entry *dcb;
798 int i, crtc, or, type = OUTPUT_ANY; 751 int i, crtc, or, type = OUTPUT_ANY;
799 752
800 NV_DEBUG_KMS(dev, "0x610030: 0x%08x\n", unk30); 753 NV_DEBUG_KMS(dev, "0x610030: 0x%08x\n", unk30);
801 dcb = dev_priv->evo_irq.dcb; 754 dcb = disp->irq.dcb;
802 if (dcb) { 755 if (dcb) {
803 nouveau_bios_run_display_table(dev, dcb, 0, -2); 756 nouveau_bios_run_display_table(dev, dcb, 0, -2);
804 dev_priv->evo_irq.dcb = NULL; 757 disp->irq.dcb = NULL;
805 } 758 }
806 759
807 /* CRTC clock change requested? */ 760 /* CRTC clock change requested? */
@@ -841,7 +794,7 @@ nv50_display_unk20_handler(struct drm_device *dev)
841 or = i; 794 or = i;
842 } 795 }
843 796
844 for (i = 0; type == OUTPUT_ANY && i < 4; i++) { 797 for (i = 0; type == OUTPUT_ANY && i < nv50_sor_nr(dev); i++) {
845 if (dev_priv->chipset < 0x90 || 798 if (dev_priv->chipset < 0x90 ||
846 dev_priv->chipset == 0x92 || 799 dev_priv->chipset == 0x92 ||
847 dev_priv->chipset == 0xa0) 800 dev_priv->chipset == 0xa0)
@@ -898,9 +851,9 @@ nv50_display_unk20_handler(struct drm_device *dev)
898 nv_wr32(dev, NV50_PDISPLAY_DAC_CLK_CTRL2(or), 0); 851 nv_wr32(dev, NV50_PDISPLAY_DAC_CLK_CTRL2(or), 0);
899 } 852 }
900 853
901 dev_priv->evo_irq.dcb = dcb; 854 disp->irq.dcb = dcb;
902 dev_priv->evo_irq.pclk = pclk; 855 disp->irq.pclk = pclk;
903 dev_priv->evo_irq.script = script; 856 disp->irq.script = script;
904 857
905ack: 858ack:
906 nv_wr32(dev, NV50_PDISPLAY_INTR_1, NV50_PDISPLAY_INTR_1_CLK_UNK20); 859 nv_wr32(dev, NV50_PDISPLAY_INTR_1, NV50_PDISPLAY_INTR_1_CLK_UNK20);
@@ -941,13 +894,13 @@ nv50_display_unk40_dp_set_tmds(struct drm_device *dev, struct dcb_entry *dcb)
941static void 894static void
942nv50_display_unk40_handler(struct drm_device *dev) 895nv50_display_unk40_handler(struct drm_device *dev)
943{ 896{
944 struct drm_nouveau_private *dev_priv = dev->dev_private; 897 struct nv50_display *disp = nv50_display(dev);
945 struct dcb_entry *dcb = dev_priv->evo_irq.dcb; 898 struct dcb_entry *dcb = disp->irq.dcb;
946 u16 script = dev_priv->evo_irq.script; 899 u16 script = disp->irq.script;
947 u32 unk30 = nv_rd32(dev, 0x610030), pclk = dev_priv->evo_irq.pclk; 900 u32 unk30 = nv_rd32(dev, 0x610030), pclk = disp->irq.pclk;
948 901
949 NV_DEBUG_KMS(dev, "0x610030: 0x%08x\n", unk30); 902 NV_DEBUG_KMS(dev, "0x610030: 0x%08x\n", unk30);
950 dev_priv->evo_irq.dcb = NULL; 903 disp->irq.dcb = NULL;
951 if (!dcb) 904 if (!dcb)
952 goto ack; 905 goto ack;
953 906
@@ -960,12 +913,10 @@ ack:
960 nv_wr32(dev, 0x619494, nv_rd32(dev, 0x619494) | 8); 913 nv_wr32(dev, 0x619494, nv_rd32(dev, 0x619494) | 8);
961} 914}
962 915
963void 916static void
964nv50_display_irq_handler_bh(struct work_struct *work) 917nv50_display_bh(unsigned long data)
965{ 918{
966 struct drm_nouveau_private *dev_priv = 919 struct drm_device *dev = (struct drm_device *)data;
967 container_of(work, struct drm_nouveau_private, irq_work);
968 struct drm_device *dev = dev_priv->dev;
969 920
970 for (;;) { 921 for (;;) {
971 uint32_t intr0 = nv_rd32(dev, NV50_PDISPLAY_INTR_0); 922 uint32_t intr0 = nv_rd32(dev, NV50_PDISPLAY_INTR_0);
@@ -991,91 +942,31 @@ nv50_display_irq_handler_bh(struct work_struct *work)
991static void 942static void
992nv50_display_error_handler(struct drm_device *dev) 943nv50_display_error_handler(struct drm_device *dev)
993{ 944{
994 uint32_t addr, data; 945 u32 channels = (nv_rd32(dev, NV50_PDISPLAY_INTR_0) & 0x001f0000) >> 16;
995 946 u32 addr, data;
996 nv_wr32(dev, NV50_PDISPLAY_INTR_0, 0x00010000); 947 int chid;
997 addr = nv_rd32(dev, NV50_PDISPLAY_TRAPPED_ADDR);
998 data = nv_rd32(dev, NV50_PDISPLAY_TRAPPED_DATA);
999
1000 NV_ERROR(dev, "EvoCh %d Mthd 0x%04x Data 0x%08x (0x%04x 0x%02x)\n",
1001 0, addr & 0xffc, data, addr >> 16, (addr >> 12) & 0xf);
1002
1003 nv_wr32(dev, NV50_PDISPLAY_TRAPPED_ADDR, 0x90000000);
1004}
1005
1006void
1007nv50_display_irq_hotplug_bh(struct work_struct *work)
1008{
1009 struct drm_nouveau_private *dev_priv =
1010 container_of(work, struct drm_nouveau_private, hpd_work);
1011 struct drm_device *dev = dev_priv->dev;
1012 struct drm_connector *connector;
1013 const uint32_t gpio_reg[4] = { 0xe104, 0xe108, 0xe280, 0xe284 };
1014 uint32_t unplug_mask, plug_mask, change_mask;
1015 uint32_t hpd0, hpd1 = 0;
1016
1017 hpd0 = nv_rd32(dev, 0xe054) & nv_rd32(dev, 0xe050);
1018 if (dev_priv->chipset >= 0x90)
1019 hpd1 = nv_rd32(dev, 0xe074) & nv_rd32(dev, 0xe070);
1020
1021 plug_mask = (hpd0 & 0x0000ffff) | (hpd1 << 16);
1022 unplug_mask = (hpd0 >> 16) | (hpd1 & 0xffff0000);
1023 change_mask = plug_mask | unplug_mask;
1024
1025 list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
1026 struct drm_encoder_helper_funcs *helper;
1027 struct nouveau_connector *nv_connector =
1028 nouveau_connector(connector);
1029 struct nouveau_encoder *nv_encoder;
1030 struct dcb_gpio_entry *gpio;
1031 uint32_t reg;
1032 bool plugged;
1033
1034 if (!nv_connector->dcb)
1035 continue;
1036
1037 gpio = nouveau_bios_gpio_entry(dev, nv_connector->dcb->gpio_tag);
1038 if (!gpio || !(change_mask & (1 << gpio->line)))
1039 continue;
1040 948
1041 reg = nv_rd32(dev, gpio_reg[gpio->line >> 3]); 949 for (chid = 0; chid < 5; chid++) {
1042 plugged = !!(reg & (4 << ((gpio->line & 7) << 2))); 950 if (!(channels & (1 << chid)))
1043 NV_INFO(dev, "%splugged %s\n", plugged ? "" : "un",
1044 drm_get_connector_name(connector)) ;
1045
1046 if (!connector->encoder || !connector->encoder->crtc ||
1047 !connector->encoder->crtc->enabled)
1048 continue; 951 continue;
1049 nv_encoder = nouveau_encoder(connector->encoder);
1050 helper = connector->encoder->helper_private;
1051 952
1052 if (nv_encoder->dcb->type != OUTPUT_DP) 953 nv_wr32(dev, NV50_PDISPLAY_INTR_0, 0x00010000 << chid);
1053 continue; 954 addr = nv_rd32(dev, NV50_PDISPLAY_TRAPPED_ADDR(chid));
955 data = nv_rd32(dev, NV50_PDISPLAY_TRAPPED_DATA(chid));
956 NV_ERROR(dev, "EvoCh %d Mthd 0x%04x Data 0x%08x "
957 "(0x%04x 0x%02x)\n", chid,
958 addr & 0xffc, data, addr >> 16, (addr >> 12) & 0xf);
1054 959
1055 if (plugged) 960 nv_wr32(dev, NV50_PDISPLAY_TRAPPED_ADDR(chid), 0x90000000);
1056 helper->dpms(connector->encoder, DRM_MODE_DPMS_ON);
1057 else
1058 helper->dpms(connector->encoder, DRM_MODE_DPMS_OFF);
1059 } 961 }
1060
1061 nv_wr32(dev, 0xe054, nv_rd32(dev, 0xe054));
1062 if (dev_priv->chipset >= 0x90)
1063 nv_wr32(dev, 0xe074, nv_rd32(dev, 0xe074));
1064
1065 drm_helper_hpd_irq_event(dev);
1066} 962}
1067 963
1068void 964static void
1069nv50_display_irq_handler(struct drm_device *dev) 965nv50_display_isr(struct drm_device *dev)
1070{ 966{
1071 struct drm_nouveau_private *dev_priv = dev->dev_private; 967 struct nv50_display *disp = nv50_display(dev);
1072 uint32_t delayed = 0; 968 uint32_t delayed = 0;
1073 969
1074 if (nv_rd32(dev, NV50_PMC_INTR_0) & NV50_PMC_INTR_0_HOTPLUG) {
1075 if (!work_pending(&dev_priv->hpd_work))
1076 queue_work(dev_priv->wq, &dev_priv->hpd_work);
1077 }
1078
1079 while (nv_rd32(dev, NV50_PMC_INTR_0) & NV50_PMC_INTR_0_DISPLAY) { 970 while (nv_rd32(dev, NV50_PMC_INTR_0) & NV50_PMC_INTR_0_DISPLAY) {
1080 uint32_t intr0 = nv_rd32(dev, NV50_PDISPLAY_INTR_0); 971 uint32_t intr0 = nv_rd32(dev, NV50_PDISPLAY_INTR_0);
1081 uint32_t intr1 = nv_rd32(dev, NV50_PDISPLAY_INTR_1); 972 uint32_t intr1 = nv_rd32(dev, NV50_PDISPLAY_INTR_1);
@@ -1086,9 +977,9 @@ nv50_display_irq_handler(struct drm_device *dev)
1086 if (!intr0 && !(intr1 & ~delayed)) 977 if (!intr0 && !(intr1 & ~delayed))
1087 break; 978 break;
1088 979
1089 if (intr0 & 0x00010000) { 980 if (intr0 & 0x001f0000) {
1090 nv50_display_error_handler(dev); 981 nv50_display_error_handler(dev);
1091 intr0 &= ~0x00010000; 982 intr0 &= ~0x001f0000;
1092 } 983 }
1093 984
1094 if (intr1 & NV50_PDISPLAY_INTR_1_VBLANK_CRTC) { 985 if (intr1 & NV50_PDISPLAY_INTR_1_VBLANK_CRTC) {
@@ -1101,8 +992,7 @@ nv50_display_irq_handler(struct drm_device *dev)
1101 NV50_PDISPLAY_INTR_1_CLK_UNK40)); 992 NV50_PDISPLAY_INTR_1_CLK_UNK40));
1102 if (clock) { 993 if (clock) {
1103 nv_wr32(dev, NV03_PMC_INTR_EN_0, 0); 994 nv_wr32(dev, NV03_PMC_INTR_EN_0, 0);
1104 if (!work_pending(&dev_priv->irq_work)) 995 tasklet_schedule(&disp->tasklet);
1105 queue_work(dev_priv->wq, &dev_priv->irq_work);
1106 delayed |= clock; 996 delayed |= clock;
1107 intr1 &= ~clock; 997 intr1 &= ~clock;
1108 } 998 }
@@ -1119,4 +1009,3 @@ nv50_display_irq_handler(struct drm_device *dev)
1119 } 1009 }
1120 } 1010 }
1121} 1011}
1122
diff --git a/drivers/gpu/drm/nouveau/nv50_display.h b/drivers/gpu/drm/nouveau/nv50_display.h
index c551f0b85ee0..c2da503a22aa 100644
--- a/drivers/gpu/drm/nouveau/nv50_display.h
+++ b/drivers/gpu/drm/nouveau/nv50_display.h
@@ -35,9 +35,36 @@
35#include "nouveau_crtc.h" 35#include "nouveau_crtc.h"
36#include "nv50_evo.h" 36#include "nv50_evo.h"
37 37
38void nv50_display_irq_handler(struct drm_device *dev); 38struct nv50_display_crtc {
39void nv50_display_irq_handler_bh(struct work_struct *work); 39 struct nouveau_channel *sync;
40void nv50_display_irq_hotplug_bh(struct work_struct *work); 40 struct {
41 struct nouveau_bo *bo;
42 u32 offset;
43 u16 value;
44 } sem;
45};
46
47struct nv50_display {
48 struct nouveau_channel *master;
49 struct nouveau_gpuobj *ntfy;
50
51 struct nv50_display_crtc crtc[2];
52
53 struct tasklet_struct tasklet;
54 struct {
55 struct dcb_entry *dcb;
56 u16 script;
57 u32 pclk;
58 } irq;
59};
60
61static inline struct nv50_display *
62nv50_display(struct drm_device *dev)
63{
64 struct drm_nouveau_private *dev_priv = dev->dev_private;
65 return dev_priv->engine.display.priv;
66}
67
41int nv50_display_early_init(struct drm_device *dev); 68int nv50_display_early_init(struct drm_device *dev);
42void nv50_display_late_takedown(struct drm_device *dev); 69void nv50_display_late_takedown(struct drm_device *dev);
43int nv50_display_create(struct drm_device *dev); 70int nv50_display_create(struct drm_device *dev);
@@ -46,4 +73,15 @@ void nv50_display_destroy(struct drm_device *dev);
46int nv50_crtc_blank(struct nouveau_crtc *, bool blank); 73int nv50_crtc_blank(struct nouveau_crtc *, bool blank);
47int nv50_crtc_set_clock(struct drm_device *, int head, int pclk); 74int nv50_crtc_set_clock(struct drm_device *, int head, int pclk);
48 75
76int nv50_display_flip_next(struct drm_crtc *, struct drm_framebuffer *,
77 struct nouveau_channel *chan);
78void nv50_display_flip_stop(struct drm_crtc *);
79
80int nv50_evo_init(struct drm_device *dev);
81void nv50_evo_fini(struct drm_device *dev);
82void nv50_evo_dmaobj_init(struct nouveau_gpuobj *, u32 memtype, u64 base,
83 u64 size);
84int nv50_evo_dmaobj_new(struct nouveau_channel *, u32 handle, u32 memtype,
85 u64 base, u64 size, struct nouveau_gpuobj **);
86
49#endif /* __NV50_DISPLAY_H__ */ 87#endif /* __NV50_DISPLAY_H__ */
diff --git a/drivers/gpu/drm/nouveau/nv50_evo.c b/drivers/gpu/drm/nouveau/nv50_evo.c
new file mode 100644
index 000000000000..c8e83c1a4de8
--- /dev/null
+++ b/drivers/gpu/drm/nouveau/nv50_evo.c
@@ -0,0 +1,425 @@
1/*
2 * Copyright 2010 Red Hat 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: Ben Skeggs
23 */
24
25#include "drmP.h"
26
27#include "nouveau_drv.h"
28#include "nouveau_dma.h"
29#include "nouveau_ramht.h"
30#include "nv50_display.h"
31
32static void
33nv50_evo_channel_del(struct nouveau_channel **pevo)
34{
35 struct nouveau_channel *evo = *pevo;
36
37 if (!evo)
38 return;
39 *pevo = NULL;
40
41 nouveau_gpuobj_channel_takedown(evo);
42 nouveau_bo_unmap(evo->pushbuf_bo);
43 nouveau_bo_ref(NULL, &evo->pushbuf_bo);
44
45 if (evo->user)
46 iounmap(evo->user);
47
48 kfree(evo);
49}
50
51void
52nv50_evo_dmaobj_init(struct nouveau_gpuobj *obj, u32 memtype, u64 base, u64 size)
53{
54 struct drm_nouveau_private *dev_priv = obj->dev->dev_private;
55 u32 flags5;
56
57 if (dev_priv->chipset < 0xc0) {
58 /* not supported on 0x50, specified in format mthd */
59 if (dev_priv->chipset == 0x50)
60 memtype = 0;
61 flags5 = 0x00010000;
62 } else {
63 if (memtype & 0x80000000)
64 flags5 = 0x00000000; /* large pages */
65 else
66 flags5 = 0x00020000;
67 }
68
69 nv50_gpuobj_dma_init(obj, 0, 0x3d, base, size, NV_MEM_TARGET_VRAM,
70 NV_MEM_ACCESS_RW, (memtype >> 8) & 0xff, 0);
71 nv_wo32(obj, 0x14, flags5);
72 dev_priv->engine.instmem.flush(obj->dev);
73}
74
75int
76nv50_evo_dmaobj_new(struct nouveau_channel *evo, u32 handle, u32 memtype,
77 u64 base, u64 size, struct nouveau_gpuobj **pobj)
78{
79 struct nv50_display *disp = nv50_display(evo->dev);
80 struct nouveau_gpuobj *obj = NULL;
81 int ret;
82
83 ret = nouveau_gpuobj_new(evo->dev, disp->master, 6*4, 32, 0, &obj);
84 if (ret)
85 return ret;
86 obj->engine = NVOBJ_ENGINE_DISPLAY;
87
88 nv50_evo_dmaobj_init(obj, memtype, base, size);
89
90 ret = nouveau_ramht_insert(evo, handle, obj);
91 if (ret)
92 goto out;
93
94 if (pobj)
95 nouveau_gpuobj_ref(obj, pobj);
96out:
97 nouveau_gpuobj_ref(NULL, &obj);
98 return ret;
99}
100
101static int
102nv50_evo_channel_new(struct drm_device *dev, int chid,
103 struct nouveau_channel **pevo)
104{
105 struct nv50_display *disp = nv50_display(dev);
106 struct nouveau_channel *evo;
107 int ret;
108
109 evo = kzalloc(sizeof(struct nouveau_channel), GFP_KERNEL);
110 if (!evo)
111 return -ENOMEM;
112 *pevo = evo;
113
114 evo->id = chid;
115 evo->dev = dev;
116 evo->user_get = 4;
117 evo->user_put = 0;
118
119 ret = nouveau_bo_new(dev, NULL, 4096, 0, TTM_PL_FLAG_VRAM, 0, 0,
120 &evo->pushbuf_bo);
121 if (ret == 0)
122 ret = nouveau_bo_pin(evo->pushbuf_bo, TTM_PL_FLAG_VRAM);
123 if (ret) {
124 NV_ERROR(dev, "Error creating EVO DMA push buffer: %d\n", ret);
125 nv50_evo_channel_del(pevo);
126 return ret;
127 }
128
129 ret = nouveau_bo_map(evo->pushbuf_bo);
130 if (ret) {
131 NV_ERROR(dev, "Error mapping EVO DMA push buffer: %d\n", ret);
132 nv50_evo_channel_del(pevo);
133 return ret;
134 }
135
136 evo->user = ioremap(pci_resource_start(dev->pdev, 0) +
137 NV50_PDISPLAY_USER(evo->id), PAGE_SIZE);
138 if (!evo->user) {
139 NV_ERROR(dev, "Error mapping EVO control regs.\n");
140 nv50_evo_channel_del(pevo);
141 return -ENOMEM;
142 }
143
144 /* bind primary evo channel's ramht to the channel */
145 if (disp->master && evo != disp->master)
146 nouveau_ramht_ref(disp->master->ramht, &evo->ramht, NULL);
147
148 return 0;
149}
150
151static int
152nv50_evo_channel_init(struct nouveau_channel *evo)
153{
154 struct drm_device *dev = evo->dev;
155 int id = evo->id, ret, i;
156 u64 pushbuf = evo->pushbuf_bo->bo.mem.start << PAGE_SHIFT;
157 u32 tmp;
158
159 tmp = nv_rd32(dev, NV50_PDISPLAY_EVO_CTRL(id));
160 if ((tmp & 0x009f0000) == 0x00020000)
161 nv_wr32(dev, NV50_PDISPLAY_EVO_CTRL(id), tmp | 0x00800000);
162
163 tmp = nv_rd32(dev, NV50_PDISPLAY_EVO_CTRL(id));
164 if ((tmp & 0x003f0000) == 0x00030000)
165 nv_wr32(dev, NV50_PDISPLAY_EVO_CTRL(id), tmp | 0x00600000);
166
167 /* initialise fifo */
168 nv_wr32(dev, NV50_PDISPLAY_EVO_DMA_CB(id), pushbuf >> 8 |
169 NV50_PDISPLAY_EVO_DMA_CB_LOCATION_VRAM |
170 NV50_PDISPLAY_EVO_DMA_CB_VALID);
171 nv_wr32(dev, NV50_PDISPLAY_EVO_UNK2(id), 0x00010000);
172 nv_wr32(dev, NV50_PDISPLAY_EVO_HASH_TAG(id), id);
173 nv_mask(dev, NV50_PDISPLAY_EVO_CTRL(id), NV50_PDISPLAY_EVO_CTRL_DMA,
174 NV50_PDISPLAY_EVO_CTRL_DMA_ENABLED);
175
176 nv_wr32(dev, NV50_PDISPLAY_USER_PUT(id), 0x00000000);
177 nv_wr32(dev, NV50_PDISPLAY_EVO_CTRL(id), 0x01000003 |
178 NV50_PDISPLAY_EVO_CTRL_DMA_ENABLED);
179 if (!nv_wait(dev, NV50_PDISPLAY_EVO_CTRL(id), 0x80000000, 0x00000000)) {
180 NV_ERROR(dev, "EvoCh %d init timeout: 0x%08x\n", id,
181 nv_rd32(dev, NV50_PDISPLAY_EVO_CTRL(id)));
182 return -EBUSY;
183 }
184
185 /* enable error reporting on the channel */
186 nv_mask(dev, 0x610028, 0x00000000, 0x00010001 << id);
187
188 evo->dma.max = (4096/4) - 2;
189 evo->dma.max &= ~7;
190 evo->dma.put = 0;
191 evo->dma.cur = evo->dma.put;
192 evo->dma.free = evo->dma.max - evo->dma.cur;
193
194 ret = RING_SPACE(evo, NOUVEAU_DMA_SKIPS);
195 if (ret)
196 return ret;
197
198 for (i = 0; i < NOUVEAU_DMA_SKIPS; i++)
199 OUT_RING(evo, 0);
200
201 return 0;
202}
203
204static void
205nv50_evo_channel_fini(struct nouveau_channel *evo)
206{
207 struct drm_device *dev = evo->dev;
208 int id = evo->id;
209
210 nv_mask(dev, 0x610028, 0x00010001 << id, 0x00000000);
211 nv_mask(dev, NV50_PDISPLAY_EVO_CTRL(id), 0x00001010, 0x00001000);
212 nv_wr32(dev, NV50_PDISPLAY_INTR_0, (1 << id));
213 nv_mask(dev, NV50_PDISPLAY_EVO_CTRL(id), 0x00000003, 0x00000000);
214 if (!nv_wait(dev, NV50_PDISPLAY_EVO_CTRL(id), 0x001e0000, 0x00000000)) {
215 NV_ERROR(dev, "EvoCh %d takedown timeout: 0x%08x\n", id,
216 nv_rd32(dev, NV50_PDISPLAY_EVO_CTRL(id)));
217 }
218}
219
220static void
221nv50_evo_destroy(struct drm_device *dev)
222{
223 struct nv50_display *disp = nv50_display(dev);
224 int i;
225
226 for (i = 0; i < 2; i++) {
227 if (disp->crtc[i].sem.bo) {
228 nouveau_bo_unmap(disp->crtc[i].sem.bo);
229 nouveau_bo_ref(NULL, &disp->crtc[i].sem.bo);
230 }
231 nv50_evo_channel_del(&disp->crtc[i].sync);
232 }
233 nouveau_gpuobj_ref(NULL, &disp->ntfy);
234 nv50_evo_channel_del(&disp->master);
235}
236
237static int
238nv50_evo_create(struct drm_device *dev)
239{
240 struct drm_nouveau_private *dev_priv = dev->dev_private;
241 struct nv50_display *disp = nv50_display(dev);
242 struct nouveau_gpuobj *ramht = NULL;
243 struct nouveau_channel *evo;
244 int ret, i, j;
245
246 /* create primary evo channel, the one we use for modesetting
247 * purporses
248 */
249 ret = nv50_evo_channel_new(dev, 0, &disp->master);
250 if (ret)
251 return ret;
252 evo = disp->master;
253
254 /* setup object management on it, any other evo channel will
255 * use this also as there's no per-channel support on the
256 * hardware
257 */
258 ret = nouveau_gpuobj_new(dev, NULL, 32768, 65536,
259 NVOBJ_FLAG_ZERO_ALLOC, &evo->ramin);
260 if (ret) {
261 NV_ERROR(dev, "Error allocating EVO channel memory: %d\n", ret);
262 goto err;
263 }
264
265 ret = drm_mm_init(&evo->ramin_heap, 0, 32768);
266 if (ret) {
267 NV_ERROR(dev, "Error initialising EVO PRAMIN heap: %d\n", ret);
268 goto err;
269 }
270
271 ret = nouveau_gpuobj_new(dev, evo, 4096, 16, 0, &ramht);
272 if (ret) {
273 NV_ERROR(dev, "Unable to allocate EVO RAMHT: %d\n", ret);
274 goto err;
275 }
276
277 ret = nouveau_ramht_new(dev, ramht, &evo->ramht);
278 nouveau_gpuobj_ref(NULL, &ramht);
279 if (ret)
280 goto err;
281
282 /* not sure exactly what this is..
283 *
284 * the first dword of the structure is used by nvidia to wait on
285 * full completion of an EVO "update" command.
286 *
287 * method 0x8c on the master evo channel will fill a lot more of
288 * this structure with some undefined info
289 */
290 ret = nouveau_gpuobj_new(dev, disp->master, 0x1000, 0,
291 NVOBJ_FLAG_ZERO_ALLOC, &disp->ntfy);
292 if (ret)
293 goto err;
294
295 ret = nv50_evo_dmaobj_new(disp->master, NvEvoSync, 0x0000,
296 disp->ntfy->vinst, disp->ntfy->size, NULL);
297 if (ret)
298 goto err;
299
300 /* create some default objects for the scanout memtypes we support */
301 ret = nv50_evo_dmaobj_new(disp->master, NvEvoVRAM, 0x0000,
302 0, dev_priv->vram_size, NULL);
303 if (ret)
304 goto err;
305
306 ret = nv50_evo_dmaobj_new(disp->master, NvEvoVRAM_LP, 0x80000000,
307 0, dev_priv->vram_size, NULL);
308 if (ret)
309 goto err;
310
311 ret = nv50_evo_dmaobj_new(disp->master, NvEvoFB32, 0x80000000 |
312 (dev_priv->chipset < 0xc0 ? 0x7a00 : 0xfe00),
313 0, dev_priv->vram_size, NULL);
314 if (ret)
315 goto err;
316
317 ret = nv50_evo_dmaobj_new(disp->master, NvEvoFB16, 0x80000000 |
318 (dev_priv->chipset < 0xc0 ? 0x7000 : 0xfe00),
319 0, dev_priv->vram_size, NULL);
320 if (ret)
321 goto err;
322
323 /* create "display sync" channels and other structures we need
324 * to implement page flipping
325 */
326 for (i = 0; i < 2; i++) {
327 struct nv50_display_crtc *dispc = &disp->crtc[i];
328 u64 offset;
329
330 ret = nv50_evo_channel_new(dev, 1 + i, &dispc->sync);
331 if (ret)
332 goto err;
333
334 ret = nouveau_bo_new(dev, NULL, 4096, 0x1000, TTM_PL_FLAG_VRAM,
335 0, 0x0000, &dispc->sem.bo);
336 if (!ret) {
337 offset = dispc->sem.bo->bo.mem.start << PAGE_SHIFT;
338
339 ret = nouveau_bo_pin(dispc->sem.bo, TTM_PL_FLAG_VRAM);
340 if (!ret)
341 ret = nouveau_bo_map(dispc->sem.bo);
342 if (ret)
343 nouveau_bo_ref(NULL, &dispc->sem.bo);
344 }
345
346 if (ret)
347 goto err;
348
349 ret = nv50_evo_dmaobj_new(dispc->sync, NvEvoSync, 0x0000,
350 offset, 4096, NULL);
351 if (ret)
352 goto err;
353
354 ret = nv50_evo_dmaobj_new(dispc->sync, NvEvoVRAM_LP, 0x80000000,
355 0, dev_priv->vram_size, NULL);
356 if (ret)
357 goto err;
358
359 ret = nv50_evo_dmaobj_new(dispc->sync, NvEvoFB32, 0x80000000 |
360 (dev_priv->chipset < 0xc0 ?
361 0x7a00 : 0xfe00),
362 0, dev_priv->vram_size, NULL);
363 if (ret)
364 goto err;
365
366 ret = nv50_evo_dmaobj_new(dispc->sync, NvEvoFB16, 0x80000000 |
367 (dev_priv->chipset < 0xc0 ?
368 0x7000 : 0xfe00),
369 0, dev_priv->vram_size, NULL);
370 if (ret)
371 goto err;
372
373 for (j = 0; j < 4096; j += 4)
374 nouveau_bo_wr32(dispc->sem.bo, j / 4, 0x74b1e000);
375 dispc->sem.offset = 0;
376 }
377
378 return 0;
379
380err:
381 nv50_evo_destroy(dev);
382 return ret;
383}
384
385int
386nv50_evo_init(struct drm_device *dev)
387{
388 struct nv50_display *disp = nv50_display(dev);
389 int ret, i;
390
391 if (!disp->master) {
392 ret = nv50_evo_create(dev);
393 if (ret)
394 return ret;
395 }
396
397 ret = nv50_evo_channel_init(disp->master);
398 if (ret)
399 return ret;
400
401 for (i = 0; i < 2; i++) {
402 ret = nv50_evo_channel_init(disp->crtc[i].sync);
403 if (ret)
404 return ret;
405 }
406
407 return 0;
408}
409
410void
411nv50_evo_fini(struct drm_device *dev)
412{
413 struct nv50_display *disp = nv50_display(dev);
414 int i;
415
416 for (i = 0; i < 2; i++) {
417 if (disp->crtc[i].sync)
418 nv50_evo_channel_fini(disp->crtc[i].sync);
419 }
420
421 if (disp->master)
422 nv50_evo_channel_fini(disp->master);
423
424 nv50_evo_destroy(dev);
425}
diff --git a/drivers/gpu/drm/nouveau/nv50_evo.h b/drivers/gpu/drm/nouveau/nv50_evo.h
index aae13343bcec..3860ca62cb19 100644
--- a/drivers/gpu/drm/nouveau/nv50_evo.h
+++ b/drivers/gpu/drm/nouveau/nv50_evo.h
@@ -24,6 +24,9 @@
24 * 24 *
25 */ 25 */
26 26
27#ifndef __NV50_EVO_H__
28#define __NV50_EVO_H__
29
27#define NV50_EVO_UPDATE 0x00000080 30#define NV50_EVO_UPDATE 0x00000080
28#define NV50_EVO_UNK84 0x00000084 31#define NV50_EVO_UNK84 0x00000084
29#define NV50_EVO_UNK84_NOTIFY 0x40000000 32#define NV50_EVO_UNK84_NOTIFY 0x40000000
@@ -110,4 +113,7 @@
110/* Both of these are needed, otherwise nothing happens. */ 113/* Both of these are needed, otherwise nothing happens. */
111#define NV50_EVO_CRTC_SCALE_RES1 0x000008d8 114#define NV50_EVO_CRTC_SCALE_RES1 0x000008d8
112#define NV50_EVO_CRTC_SCALE_RES2 0x000008dc 115#define NV50_EVO_CRTC_SCALE_RES2 0x000008dc
116#define NV50_EVO_CRTC_UNK900 0x00000900
117#define NV50_EVO_CRTC_UNK904 0x00000904
113 118
119#endif
diff --git a/drivers/gpu/drm/nouveau/nv50_fb.c b/drivers/gpu/drm/nouveau/nv50_fb.c
index 32611bd30e6d..bdd2afe29205 100644
--- a/drivers/gpu/drm/nouveau/nv50_fb.c
+++ b/drivers/gpu/drm/nouveau/nv50_fb.c
@@ -3,29 +3,105 @@
3#include "nouveau_drv.h" 3#include "nouveau_drv.h"
4#include "nouveau_drm.h" 4#include "nouveau_drm.h"
5 5
6struct nv50_fb_priv {
7 struct page *r100c08_page;
8 dma_addr_t r100c08;
9};
10
11static void
12nv50_fb_destroy(struct drm_device *dev)
13{
14 struct drm_nouveau_private *dev_priv = dev->dev_private;
15 struct nouveau_fb_engine *pfb = &dev_priv->engine.fb;
16 struct nv50_fb_priv *priv = pfb->priv;
17
18 if (drm_mm_initialized(&pfb->tag_heap))
19 drm_mm_takedown(&pfb->tag_heap);
20
21 if (priv->r100c08_page) {
22 pci_unmap_page(dev->pdev, priv->r100c08, PAGE_SIZE,
23 PCI_DMA_BIDIRECTIONAL);
24 __free_page(priv->r100c08_page);
25 }
26
27 kfree(priv);
28 pfb->priv = NULL;
29}
30
31static int
32nv50_fb_create(struct drm_device *dev)
33{
34 struct drm_nouveau_private *dev_priv = dev->dev_private;
35 struct nouveau_fb_engine *pfb = &dev_priv->engine.fb;
36 struct nv50_fb_priv *priv;
37 u32 tagmem;
38 int ret;
39
40 priv = kzalloc(sizeof(*priv), GFP_KERNEL);
41 if (!priv)
42 return -ENOMEM;
43 pfb->priv = priv;
44
45 priv->r100c08_page = alloc_page(GFP_KERNEL | __GFP_ZERO);
46 if (!priv->r100c08_page) {
47 nv50_fb_destroy(dev);
48 return -ENOMEM;
49 }
50
51 priv->r100c08 = pci_map_page(dev->pdev, priv->r100c08_page, 0,
52 PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);
53 if (pci_dma_mapping_error(dev->pdev, priv->r100c08)) {
54 nv50_fb_destroy(dev);
55 return -EFAULT;
56 }
57
58 tagmem = nv_rd32(dev, 0x100320);
59 NV_DEBUG(dev, "%d tags available\n", tagmem);
60 ret = drm_mm_init(&pfb->tag_heap, 0, tagmem);
61 if (ret) {
62 nv50_fb_destroy(dev);
63 return ret;
64 }
65
66 return 0;
67}
68
6int 69int
7nv50_fb_init(struct drm_device *dev) 70nv50_fb_init(struct drm_device *dev)
8{ 71{
9 struct drm_nouveau_private *dev_priv = dev->dev_private; 72 struct drm_nouveau_private *dev_priv = dev->dev_private;
73 struct nv50_fb_priv *priv;
74 int ret;
75
76 if (!dev_priv->engine.fb.priv) {
77 ret = nv50_fb_create(dev);
78 if (ret)
79 return ret;
80 }
81 priv = dev_priv->engine.fb.priv;
10 82
11 /* Not a clue what this is exactly. Without pointing it at a 83 /* Not a clue what this is exactly. Without pointing it at a
12 * scratch page, VRAM->GART blits with M2MF (as in DDX DFS) 84 * scratch page, VRAM->GART blits with M2MF (as in DDX DFS)
13 * cause IOMMU "read from address 0" errors (rh#561267) 85 * cause IOMMU "read from address 0" errors (rh#561267)
14 */ 86 */
15 nv_wr32(dev, 0x100c08, dev_priv->gart_info.sg_dummy_bus >> 8); 87 nv_wr32(dev, 0x100c08, priv->r100c08 >> 8);
16 88
17 /* This is needed to get meaningful information from 100c90 89 /* This is needed to get meaningful information from 100c90
18 * on traps. No idea what these values mean exactly. */ 90 * on traps. No idea what these values mean exactly. */
19 switch (dev_priv->chipset) { 91 switch (dev_priv->chipset) {
20 case 0x50: 92 case 0x50:
21 nv_wr32(dev, 0x100c90, 0x0707ff); 93 nv_wr32(dev, 0x100c90, 0x000707ff);
22 break; 94 break;
95 case 0xa3:
23 case 0xa5: 96 case 0xa5:
24 case 0xa8: 97 case 0xa8:
25 nv_wr32(dev, 0x100c90, 0x0d0fff); 98 nv_wr32(dev, 0x100c90, 0x000d0fff);
99 break;
100 case 0xaf:
101 nv_wr32(dev, 0x100c90, 0x089d1fff);
26 break; 102 break;
27 default: 103 default:
28 nv_wr32(dev, 0x100c90, 0x1d07ff); 104 nv_wr32(dev, 0x100c90, 0x001d07ff);
29 break; 105 break;
30 } 106 }
31 107
@@ -35,4 +111,184 @@ nv50_fb_init(struct drm_device *dev)
35void 111void
36nv50_fb_takedown(struct drm_device *dev) 112nv50_fb_takedown(struct drm_device *dev)
37{ 113{
114 nv50_fb_destroy(dev);
115}
116
117static struct nouveau_enum vm_dispatch_subclients[] = {
118 { 0x00000000, "GRCTX", NULL },
119 { 0x00000001, "NOTIFY", NULL },
120 { 0x00000002, "QUERY", NULL },
121 { 0x00000003, "COND", NULL },
122 { 0x00000004, "M2M_IN", NULL },
123 { 0x00000005, "M2M_OUT", NULL },
124 { 0x00000006, "M2M_NOTIFY", NULL },
125 {}
126};
127
128static struct nouveau_enum vm_ccache_subclients[] = {
129 { 0x00000000, "CB", NULL },
130 { 0x00000001, "TIC", NULL },
131 { 0x00000002, "TSC", NULL },
132 {}
133};
134
135static struct nouveau_enum vm_prop_subclients[] = {
136 { 0x00000000, "RT0", NULL },
137 { 0x00000001, "RT1", NULL },
138 { 0x00000002, "RT2", NULL },
139 { 0x00000003, "RT3", NULL },
140 { 0x00000004, "RT4", NULL },
141 { 0x00000005, "RT5", NULL },
142 { 0x00000006, "RT6", NULL },
143 { 0x00000007, "RT7", NULL },
144 { 0x00000008, "ZETA", NULL },
145 { 0x00000009, "LOCAL", NULL },
146 { 0x0000000a, "GLOBAL", NULL },
147 { 0x0000000b, "STACK", NULL },
148 { 0x0000000c, "DST2D", NULL },
149 {}
150};
151
152static struct nouveau_enum vm_pfifo_subclients[] = {
153 { 0x00000000, "PUSHBUF", NULL },
154 { 0x00000001, "SEMAPHORE", NULL },
155 {}
156};
157
158static struct nouveau_enum vm_bar_subclients[] = {
159 { 0x00000000, "FB", NULL },
160 { 0x00000001, "IN", NULL },
161 {}
162};
163
164static struct nouveau_enum vm_client[] = {
165 { 0x00000000, "STRMOUT", NULL },
166 { 0x00000003, "DISPATCH", vm_dispatch_subclients },
167 { 0x00000004, "PFIFO_WRITE", NULL },
168 { 0x00000005, "CCACHE", vm_ccache_subclients },
169 { 0x00000006, "PPPP", NULL },
170 { 0x00000007, "CLIPID", NULL },
171 { 0x00000008, "PFIFO_READ", NULL },
172 { 0x00000009, "VFETCH", NULL },
173 { 0x0000000a, "TEXTURE", NULL },
174 { 0x0000000b, "PROP", vm_prop_subclients },
175 { 0x0000000c, "PVP", NULL },
176 { 0x0000000d, "PBSP", NULL },
177 { 0x0000000e, "PCRYPT", NULL },
178 { 0x0000000f, "PCOUNTER", NULL },
179 { 0x00000011, "PDAEMON", NULL },
180 {}
181};
182
183static struct nouveau_enum vm_engine[] = {
184 { 0x00000000, "PGRAPH", NULL },
185 { 0x00000001, "PVP", NULL },
186 { 0x00000004, "PEEPHOLE", NULL },
187 { 0x00000005, "PFIFO", vm_pfifo_subclients },
188 { 0x00000006, "BAR", vm_bar_subclients },
189 { 0x00000008, "PPPP", NULL },
190 { 0x00000009, "PBSP", NULL },
191 { 0x0000000a, "PCRYPT", NULL },
192 { 0x0000000b, "PCOUNTER", NULL },
193 { 0x0000000c, "SEMAPHORE_BG", NULL },
194 { 0x0000000d, "PCOPY", NULL },
195 { 0x0000000e, "PDAEMON", NULL },
196 {}
197};
198
199static struct nouveau_enum vm_fault[] = {
200 { 0x00000000, "PT_NOT_PRESENT", NULL },
201 { 0x00000001, "PT_TOO_SHORT", NULL },
202 { 0x00000002, "PAGE_NOT_PRESENT", NULL },
203 { 0x00000003, "PAGE_SYSTEM_ONLY", NULL },
204 { 0x00000004, "PAGE_READ_ONLY", NULL },
205 { 0x00000006, "NULL_DMAOBJ", NULL },
206 { 0x00000007, "WRONG_MEMTYPE", NULL },
207 { 0x0000000b, "VRAM_LIMIT", NULL },
208 { 0x0000000f, "DMAOBJ_LIMIT", NULL },
209 {}
210};
211
212void
213nv50_fb_vm_trap(struct drm_device *dev, int display)
214{
215 struct drm_nouveau_private *dev_priv = dev->dev_private;
216 const struct nouveau_enum *en, *cl;
217 unsigned long flags;
218 u32 trap[6], idx, chinst;
219 u8 st0, st1, st2, st3;
220 int i, ch;
221
222 idx = nv_rd32(dev, 0x100c90);
223 if (!(idx & 0x80000000))
224 return;
225 idx &= 0x00ffffff;
226
227 for (i = 0; i < 6; i++) {
228 nv_wr32(dev, 0x100c90, idx | i << 24);
229 trap[i] = nv_rd32(dev, 0x100c94);
230 }
231 nv_wr32(dev, 0x100c90, idx | 0x80000000);
232
233 if (!display)
234 return;
235
236 /* lookup channel id */
237 chinst = (trap[2] << 16) | trap[1];
238 spin_lock_irqsave(&dev_priv->channels.lock, flags);
239 for (ch = 0; ch < dev_priv->engine.fifo.channels; ch++) {
240 struct nouveau_channel *chan = dev_priv->channels.ptr[ch];
241
242 if (!chan || !chan->ramin)
243 continue;
244
245 if (chinst == chan->ramin->vinst >> 12)
246 break;
247 }
248 spin_unlock_irqrestore(&dev_priv->channels.lock, flags);
249
250 /* decode status bits into something more useful */
251 if (dev_priv->chipset < 0xa3 ||
252 dev_priv->chipset == 0xaa || dev_priv->chipset == 0xac) {
253 st0 = (trap[0] & 0x0000000f) >> 0;
254 st1 = (trap[0] & 0x000000f0) >> 4;
255 st2 = (trap[0] & 0x00000f00) >> 8;
256 st3 = (trap[0] & 0x0000f000) >> 12;
257 } else {
258 st0 = (trap[0] & 0x000000ff) >> 0;
259 st1 = (trap[0] & 0x0000ff00) >> 8;
260 st2 = (trap[0] & 0x00ff0000) >> 16;
261 st3 = (trap[0] & 0xff000000) >> 24;
262 }
263
264 NV_INFO(dev, "VM: trapped %s at 0x%02x%04x%04x on ch %d [0x%08x] ",
265 (trap[5] & 0x00000100) ? "read" : "write",
266 trap[5] & 0xff, trap[4] & 0xffff, trap[3] & 0xffff, ch, chinst);
267
268 en = nouveau_enum_find(vm_engine, st0);
269 if (en)
270 printk("%s/", en->name);
271 else
272 printk("%02x/", st0);
273
274 cl = nouveau_enum_find(vm_client, st2);
275 if (cl)
276 printk("%s/", cl->name);
277 else
278 printk("%02x/", st2);
279
280 if (cl && cl->data) cl = nouveau_enum_find(cl->data, st3);
281 else if (en && en->data) cl = nouveau_enum_find(en->data, st3);
282 else cl = NULL;
283 if (cl)
284 printk("%s", cl->name);
285 else
286 printk("%02x", st3);
287
288 printk(" reason: ");
289 en = nouveau_enum_find(vm_fault, st1);
290 if (en)
291 printk("%s\n", en->name);
292 else
293 printk("0x%08x\n", st1);
38} 294}
diff --git a/drivers/gpu/drm/nouveau/nv50_fbcon.c b/drivers/gpu/drm/nouveau/nv50_fbcon.c
index 6bf025c6fc6f..791ded1c5c6d 100644
--- a/drivers/gpu/drm/nouveau/nv50_fbcon.c
+++ b/drivers/gpu/drm/nouveau/nv50_fbcon.c
@@ -1,28 +1,46 @@
1/*
2 * Copyright 2010 Red Hat 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: Ben Skeggs
23 */
24
1#include "drmP.h" 25#include "drmP.h"
2#include "nouveau_drv.h" 26#include "nouveau_drv.h"
3#include "nouveau_dma.h" 27#include "nouveau_dma.h"
28#include "nouveau_ramht.h"
4#include "nouveau_fbcon.h" 29#include "nouveau_fbcon.h"
30#include "nouveau_mm.h"
5 31
6void 32int
7nv50_fbcon_fillrect(struct fb_info *info, const struct fb_fillrect *rect) 33nv50_fbcon_fillrect(struct fb_info *info, const struct fb_fillrect *rect)
8{ 34{
9 struct nouveau_fbdev *nfbdev = info->par; 35 struct nouveau_fbdev *nfbdev = info->par;
10 struct drm_device *dev = nfbdev->dev; 36 struct drm_device *dev = nfbdev->dev;
11 struct drm_nouveau_private *dev_priv = dev->dev_private; 37 struct drm_nouveau_private *dev_priv = dev->dev_private;
12 struct nouveau_channel *chan = dev_priv->channel; 38 struct nouveau_channel *chan = dev_priv->channel;
39 int ret;
13 40
14 if (info->state != FBINFO_STATE_RUNNING) 41 ret = RING_SPACE(chan, rect->rop == ROP_COPY ? 7 : 11);
15 return; 42 if (ret)
16 43 return ret;
17 if (!(info->flags & FBINFO_HWACCEL_DISABLED) &&
18 RING_SPACE(chan, rect->rop == ROP_COPY ? 7 : 11)) {
19 nouveau_fbcon_gpu_lockup(info);
20 }
21
22 if (info->flags & FBINFO_HWACCEL_DISABLED) {
23 cfb_fillrect(info, rect);
24 return;
25 }
26 44
27 if (rect->rop != ROP_COPY) { 45 if (rect->rop != ROP_COPY) {
28 BEGIN_RING(chan, NvSub2D, 0x02ac, 1); 46 BEGIN_RING(chan, NvSub2D, 0x02ac, 1);
@@ -44,27 +62,21 @@ nv50_fbcon_fillrect(struct fb_info *info, const struct fb_fillrect *rect)
44 OUT_RING(chan, 3); 62 OUT_RING(chan, 3);
45 } 63 }
46 FIRE_RING(chan); 64 FIRE_RING(chan);
65 return 0;
47} 66}
48 67
49void 68int
50nv50_fbcon_copyarea(struct fb_info *info, const struct fb_copyarea *region) 69nv50_fbcon_copyarea(struct fb_info *info, const struct fb_copyarea *region)
51{ 70{
52 struct nouveau_fbdev *nfbdev = info->par; 71 struct nouveau_fbdev *nfbdev = info->par;
53 struct drm_device *dev = nfbdev->dev; 72 struct drm_device *dev = nfbdev->dev;
54 struct drm_nouveau_private *dev_priv = dev->dev_private; 73 struct drm_nouveau_private *dev_priv = dev->dev_private;
55 struct nouveau_channel *chan = dev_priv->channel; 74 struct nouveau_channel *chan = dev_priv->channel;
75 int ret;
56 76
57 if (info->state != FBINFO_STATE_RUNNING) 77 ret = RING_SPACE(chan, 12);
58 return; 78 if (ret)
59 79 return ret;
60 if (!(info->flags & FBINFO_HWACCEL_DISABLED) && RING_SPACE(chan, 12)) {
61 nouveau_fbcon_gpu_lockup(info);
62 }
63
64 if (info->flags & FBINFO_HWACCEL_DISABLED) {
65 cfb_copyarea(info, region);
66 return;
67 }
68 80
69 BEGIN_RING(chan, NvSub2D, 0x0110, 1); 81 BEGIN_RING(chan, NvSub2D, 0x0110, 1);
70 OUT_RING(chan, 0); 82 OUT_RING(chan, 0);
@@ -79,9 +91,10 @@ nv50_fbcon_copyarea(struct fb_info *info, const struct fb_copyarea *region)
79 OUT_RING(chan, 0); 91 OUT_RING(chan, 0);
80 OUT_RING(chan, region->sy); 92 OUT_RING(chan, region->sy);
81 FIRE_RING(chan); 93 FIRE_RING(chan);
94 return 0;
82} 95}
83 96
84void 97int
85nv50_fbcon_imageblit(struct fb_info *info, const struct fb_image *image) 98nv50_fbcon_imageblit(struct fb_info *info, const struct fb_image *image)
86{ 99{
87 struct nouveau_fbdev *nfbdev = info->par; 100 struct nouveau_fbdev *nfbdev = info->par;
@@ -91,23 +104,14 @@ nv50_fbcon_imageblit(struct fb_info *info, const struct fb_image *image)
91 uint32_t width, dwords, *data = (uint32_t *)image->data; 104 uint32_t width, dwords, *data = (uint32_t *)image->data;
92 uint32_t mask = ~(~0 >> (32 - info->var.bits_per_pixel)); 105 uint32_t mask = ~(~0 >> (32 - info->var.bits_per_pixel));
93 uint32_t *palette = info->pseudo_palette; 106 uint32_t *palette = info->pseudo_palette;
107 int ret;
94 108
95 if (info->state != FBINFO_STATE_RUNNING) 109 if (image->depth != 1)
96 return; 110 return -ENODEV;
97
98 if (image->depth != 1) {
99 cfb_imageblit(info, image);
100 return;
101 }
102 111
103 if (!(info->flags & FBINFO_HWACCEL_DISABLED) && RING_SPACE(chan, 11)) { 112 ret = RING_SPACE(chan, 11);
104 nouveau_fbcon_gpu_lockup(info); 113 if (ret)
105 } 114 return ret;
106
107 if (info->flags & FBINFO_HWACCEL_DISABLED) {
108 cfb_imageblit(info, image);
109 return;
110 }
111 115
112 width = ALIGN(image->width, 32); 116 width = ALIGN(image->width, 32);
113 dwords = (width * image->height) >> 5; 117 dwords = (width * image->height) >> 5;
@@ -133,11 +137,9 @@ nv50_fbcon_imageblit(struct fb_info *info, const struct fb_image *image)
133 while (dwords) { 137 while (dwords) {
134 int push = dwords > 2047 ? 2047 : dwords; 138 int push = dwords > 2047 ? 2047 : dwords;
135 139
136 if (RING_SPACE(chan, push + 1)) { 140 ret = RING_SPACE(chan, push + 1);
137 nouveau_fbcon_gpu_lockup(info); 141 if (ret)
138 cfb_imageblit(info, image); 142 return ret;
139 return;
140 }
141 143
142 dwords -= push; 144 dwords -= push;
143 145
@@ -147,6 +149,7 @@ nv50_fbcon_imageblit(struct fb_info *info, const struct fb_image *image)
147 } 149 }
148 150
149 FIRE_RING(chan); 151 FIRE_RING(chan);
152 return 0;
150} 153}
151 154
152int 155int
@@ -156,12 +159,9 @@ nv50_fbcon_accel_init(struct fb_info *info)
156 struct drm_device *dev = nfbdev->dev; 159 struct drm_device *dev = nfbdev->dev;
157 struct drm_nouveau_private *dev_priv = dev->dev_private; 160 struct drm_nouveau_private *dev_priv = dev->dev_private;
158 struct nouveau_channel *chan = dev_priv->channel; 161 struct nouveau_channel *chan = dev_priv->channel;
159 struct nouveau_gpuobj *eng2d = NULL; 162 struct nouveau_bo *nvbo = nfbdev->nouveau_fb.nvbo;
160 uint64_t fb;
161 int ret, format; 163 int ret, format;
162 164
163 fb = info->fix.smem_start - dev_priv->fb_phys + dev_priv->vm_vram_base;
164
165 switch (info->var.bits_per_pixel) { 165 switch (info->var.bits_per_pixel) {
166 case 8: 166 case 8:
167 format = 0xf3; 167 format = 0xf3;
@@ -189,11 +189,7 @@ nv50_fbcon_accel_init(struct fb_info *info)
189 return -EINVAL; 189 return -EINVAL;
190 } 190 }
191 191
192 ret = nouveau_gpuobj_gr_new(dev_priv->channel, 0x502d, &eng2d); 192 ret = nouveau_gpuobj_gr_new(dev_priv->channel, Nv2D, 0x502d);
193 if (ret)
194 return ret;
195
196 ret = nouveau_gpuobj_ref_add(dev, dev_priv->channel, Nv2D, eng2d, NULL);
197 if (ret) 193 if (ret)
198 return ret; 194 return ret;
199 195
@@ -251,8 +247,8 @@ nv50_fbcon_accel_init(struct fb_info *info)
251 OUT_RING(chan, info->fix.line_length); 247 OUT_RING(chan, info->fix.line_length);
252 OUT_RING(chan, info->var.xres_virtual); 248 OUT_RING(chan, info->var.xres_virtual);
253 OUT_RING(chan, info->var.yres_virtual); 249 OUT_RING(chan, info->var.yres_virtual);
254 OUT_RING(chan, upper_32_bits(fb)); 250 OUT_RING(chan, upper_32_bits(nvbo->vma.offset));
255 OUT_RING(chan, lower_32_bits(fb)); 251 OUT_RING(chan, lower_32_bits(nvbo->vma.offset));
256 BEGIN_RING(chan, NvSub2D, 0x0230, 2); 252 BEGIN_RING(chan, NvSub2D, 0x0230, 2);
257 OUT_RING(chan, format); 253 OUT_RING(chan, format);
258 OUT_RING(chan, 1); 254 OUT_RING(chan, 1);
@@ -260,8 +256,8 @@ nv50_fbcon_accel_init(struct fb_info *info)
260 OUT_RING(chan, info->fix.line_length); 256 OUT_RING(chan, info->fix.line_length);
261 OUT_RING(chan, info->var.xres_virtual); 257 OUT_RING(chan, info->var.xres_virtual);
262 OUT_RING(chan, info->var.yres_virtual); 258 OUT_RING(chan, info->var.yres_virtual);
263 OUT_RING(chan, upper_32_bits(fb)); 259 OUT_RING(chan, upper_32_bits(nvbo->vma.offset));
264 OUT_RING(chan, lower_32_bits(fb)); 260 OUT_RING(chan, lower_32_bits(nvbo->vma.offset));
265 261
266 return 0; 262 return 0;
267} 263}
diff --git a/drivers/gpu/drm/nouveau/nv50_fifo.c b/drivers/gpu/drm/nouveau/nv50_fifo.c
index fb0281ae8f90..c34a074f7ea1 100644
--- a/drivers/gpu/drm/nouveau/nv50_fifo.c
+++ b/drivers/gpu/drm/nouveau/nv50_fifo.c
@@ -27,13 +27,15 @@
27#include "drmP.h" 27#include "drmP.h"
28#include "drm.h" 28#include "drm.h"
29#include "nouveau_drv.h" 29#include "nouveau_drv.h"
30#include "nouveau_ramht.h"
31#include "nouveau_vm.h"
30 32
31static void 33static void
32nv50_fifo_playlist_update(struct drm_device *dev) 34nv50_fifo_playlist_update(struct drm_device *dev)
33{ 35{
34 struct drm_nouveau_private *dev_priv = dev->dev_private; 36 struct drm_nouveau_private *dev_priv = dev->dev_private;
35 struct nouveau_fifo_engine *pfifo = &dev_priv->engine.fifo; 37 struct nouveau_fifo_engine *pfifo = &dev_priv->engine.fifo;
36 struct nouveau_gpuobj_ref *cur; 38 struct nouveau_gpuobj *cur;
37 int i, nr; 39 int i, nr;
38 40
39 NV_DEBUG(dev, "\n"); 41 NV_DEBUG(dev, "\n");
@@ -43,12 +45,15 @@ nv50_fifo_playlist_update(struct drm_device *dev)
43 45
44 /* We never schedule channel 0 or 127 */ 46 /* We never schedule channel 0 or 127 */
45 for (i = 1, nr = 0; i < 127; i++) { 47 for (i = 1, nr = 0; i < 127; i++) {
46 if (dev_priv->fifos[i] && dev_priv->fifos[i]->ramfc) 48 if (dev_priv->channels.ptr[i] &&
47 nv_wo32(dev, cur->gpuobj, nr++, i); 49 dev_priv->channels.ptr[i]->ramfc) {
50 nv_wo32(cur, (nr * 4), i);
51 nr++;
52 }
48 } 53 }
49 dev_priv->engine.instmem.flush(dev); 54 dev_priv->engine.instmem.flush(dev);
50 55
51 nv_wr32(dev, 0x32f4, cur->instance >> 12); 56 nv_wr32(dev, 0x32f4, cur->vinst >> 12);
52 nv_wr32(dev, 0x32ec, nr); 57 nv_wr32(dev, 0x32ec, nr);
53 nv_wr32(dev, 0x2500, 0x101); 58 nv_wr32(dev, 0x2500, 0x101);
54} 59}
@@ -57,15 +62,15 @@ static void
57nv50_fifo_channel_enable(struct drm_device *dev, int channel) 62nv50_fifo_channel_enable(struct drm_device *dev, int channel)
58{ 63{
59 struct drm_nouveau_private *dev_priv = dev->dev_private; 64 struct drm_nouveau_private *dev_priv = dev->dev_private;
60 struct nouveau_channel *chan = dev_priv->fifos[channel]; 65 struct nouveau_channel *chan = dev_priv->channels.ptr[channel];
61 uint32_t inst; 66 uint32_t inst;
62 67
63 NV_DEBUG(dev, "ch%d\n", channel); 68 NV_DEBUG(dev, "ch%d\n", channel);
64 69
65 if (dev_priv->chipset == 0x50) 70 if (dev_priv->chipset == 0x50)
66 inst = chan->ramfc->instance >> 12; 71 inst = chan->ramfc->vinst >> 12;
67 else 72 else
68 inst = chan->ramfc->instance >> 8; 73 inst = chan->ramfc->vinst >> 8;
69 74
70 nv_wr32(dev, NV50_PFIFO_CTX_TABLE(channel), inst | 75 nv_wr32(dev, NV50_PFIFO_CTX_TABLE(channel), inst |
71 NV50_PFIFO_CTX_TABLE_CHANNEL_ENABLED); 76 NV50_PFIFO_CTX_TABLE_CHANNEL_ENABLED);
@@ -102,6 +107,7 @@ nv50_fifo_init_intr(struct drm_device *dev)
102{ 107{
103 NV_DEBUG(dev, "\n"); 108 NV_DEBUG(dev, "\n");
104 109
110 nouveau_irq_register(dev, 8, nv04_fifo_isr);
105 nv_wr32(dev, NV03_PFIFO_INTR_0, 0xFFFFFFFF); 111 nv_wr32(dev, NV03_PFIFO_INTR_0, 0xFFFFFFFF);
106 nv_wr32(dev, NV03_PFIFO_INTR_EN_0, 0xFFFFFFFF); 112 nv_wr32(dev, NV03_PFIFO_INTR_EN_0, 0xFFFFFFFF);
107} 113}
@@ -115,7 +121,7 @@ nv50_fifo_init_context_table(struct drm_device *dev)
115 NV_DEBUG(dev, "\n"); 121 NV_DEBUG(dev, "\n");
116 122
117 for (i = 0; i < NV50_PFIFO_CTX_TABLE__SIZE; i++) { 123 for (i = 0; i < NV50_PFIFO_CTX_TABLE__SIZE; i++) {
118 if (dev_priv->fifos[i]) 124 if (dev_priv->channels.ptr[i])
119 nv50_fifo_channel_enable(dev, i); 125 nv50_fifo_channel_enable(dev, i);
120 else 126 else
121 nv50_fifo_channel_disable(dev, i); 127 nv50_fifo_channel_disable(dev, i);
@@ -143,6 +149,7 @@ nv50_fifo_init_regs(struct drm_device *dev)
143 nv_wr32(dev, 0x3204, 0); 149 nv_wr32(dev, 0x3204, 0);
144 nv_wr32(dev, 0x3210, 0); 150 nv_wr32(dev, 0x3210, 0);
145 nv_wr32(dev, 0x3270, 0); 151 nv_wr32(dev, 0x3270, 0);
152 nv_wr32(dev, 0x2044, 0x01003fff);
146 153
147 /* Enable dummy channels setup by nv50_instmem.c */ 154 /* Enable dummy channels setup by nv50_instmem.c */
148 nv50_fifo_channel_enable(dev, 0); 155 nv50_fifo_channel_enable(dev, 0);
@@ -163,19 +170,19 @@ nv50_fifo_init(struct drm_device *dev)
163 goto just_reset; 170 goto just_reset;
164 } 171 }
165 172
166 ret = nouveau_gpuobj_new_ref(dev, NULL, NULL, 0, 128*4, 0x1000, 173 ret = nouveau_gpuobj_new(dev, NULL, 128*4, 0x1000,
167 NVOBJ_FLAG_ZERO_ALLOC, 174 NVOBJ_FLAG_ZERO_ALLOC,
168 &pfifo->playlist[0]); 175 &pfifo->playlist[0]);
169 if (ret) { 176 if (ret) {
170 NV_ERROR(dev, "error creating playlist 0: %d\n", ret); 177 NV_ERROR(dev, "error creating playlist 0: %d\n", ret);
171 return ret; 178 return ret;
172 } 179 }
173 180
174 ret = nouveau_gpuobj_new_ref(dev, NULL, NULL, 0, 128*4, 0x1000, 181 ret = nouveau_gpuobj_new(dev, NULL, 128*4, 0x1000,
175 NVOBJ_FLAG_ZERO_ALLOC, 182 NVOBJ_FLAG_ZERO_ALLOC,
176 &pfifo->playlist[1]); 183 &pfifo->playlist[1]);
177 if (ret) { 184 if (ret) {
178 nouveau_gpuobj_ref_del(dev, &pfifo->playlist[0]); 185 nouveau_gpuobj_ref(NULL, &pfifo->playlist[0]);
179 NV_ERROR(dev, "error creating playlist 1: %d\n", ret); 186 NV_ERROR(dev, "error creating playlist 1: %d\n", ret);
180 return ret; 187 return ret;
181 } 188 }
@@ -203,8 +210,11 @@ nv50_fifo_takedown(struct drm_device *dev)
203 if (!pfifo->playlist[0]) 210 if (!pfifo->playlist[0])
204 return; 211 return;
205 212
206 nouveau_gpuobj_ref_del(dev, &pfifo->playlist[0]); 213 nv_wr32(dev, 0x2140, 0x00000000);
207 nouveau_gpuobj_ref_del(dev, &pfifo->playlist[1]); 214 nouveau_irq_unregister(dev, 8);
215
216 nouveau_gpuobj_ref(NULL, &pfifo->playlist[0]);
217 nouveau_gpuobj_ref(NULL, &pfifo->playlist[1]);
208} 218}
209 219
210int 220int
@@ -226,59 +236,59 @@ nv50_fifo_create_context(struct nouveau_channel *chan)
226 NV_DEBUG(dev, "ch%d\n", chan->id); 236 NV_DEBUG(dev, "ch%d\n", chan->id);
227 237
228 if (dev_priv->chipset == 0x50) { 238 if (dev_priv->chipset == 0x50) {
229 uint32_t ramin_poffset = chan->ramin->gpuobj->im_pramin->start; 239 ret = nouveau_gpuobj_new_fake(dev, chan->ramin->pinst,
230 uint32_t ramin_voffset = chan->ramin->gpuobj->im_backing_start; 240 chan->ramin->vinst, 0x100,
231 241 NVOBJ_FLAG_ZERO_ALLOC |
232 ret = nouveau_gpuobj_new_fake(dev, ramin_poffset, ramin_voffset, 242 NVOBJ_FLAG_ZERO_FREE,
233 0x100, NVOBJ_FLAG_ZERO_ALLOC |
234 NVOBJ_FLAG_ZERO_FREE, &ramfc,
235 &chan->ramfc); 243 &chan->ramfc);
236 if (ret) 244 if (ret)
237 return ret; 245 return ret;
238 246
239 ret = nouveau_gpuobj_new_fake(dev, ramin_poffset + 0x0400, 247 ret = nouveau_gpuobj_new_fake(dev, chan->ramin->pinst + 0x0400,
240 ramin_voffset + 0x0400, 4096, 248 chan->ramin->vinst + 0x0400,
241 0, NULL, &chan->cache); 249 4096, 0, &chan->cache);
242 if (ret) 250 if (ret)
243 return ret; 251 return ret;
244 } else { 252 } else {
245 ret = nouveau_gpuobj_new_ref(dev, chan, NULL, 0, 0x100, 256, 253 ret = nouveau_gpuobj_new(dev, chan, 0x100, 256,
246 NVOBJ_FLAG_ZERO_ALLOC | 254 NVOBJ_FLAG_ZERO_ALLOC |
247 NVOBJ_FLAG_ZERO_FREE, 255 NVOBJ_FLAG_ZERO_FREE, &chan->ramfc);
248 &chan->ramfc);
249 if (ret) 256 if (ret)
250 return ret; 257 return ret;
251 ramfc = chan->ramfc->gpuobj;
252 258
253 ret = nouveau_gpuobj_new_ref(dev, chan, NULL, 0, 4096, 1024, 259 ret = nouveau_gpuobj_new(dev, chan, 4096, 1024,
254 0, &chan->cache); 260 0, &chan->cache);
255 if (ret) 261 if (ret)
256 return ret; 262 return ret;
257 } 263 }
264 ramfc = chan->ramfc;
265
266 chan->user = ioremap(pci_resource_start(dev->pdev, 0) +
267 NV50_USER(chan->id), PAGE_SIZE);
268 if (!chan->user)
269 return -ENOMEM;
258 270
259 spin_lock_irqsave(&dev_priv->context_switch_lock, flags); 271 spin_lock_irqsave(&dev_priv->context_switch_lock, flags);
260 272
261 nv_wo32(dev, ramfc, 0x48/4, chan->pushbuf->instance >> 4); 273 nv_wo32(ramfc, 0x48, chan->pushbuf->cinst >> 4);
262 nv_wo32(dev, ramfc, 0x80/4, (0 << 27) /* 4KiB */ | 274 nv_wo32(ramfc, 0x80, ((chan->ramht->bits - 9) << 27) |
263 (4 << 24) /* SEARCH_FULL */ | 275 (4 << 24) /* SEARCH_FULL */ |
264 (chan->ramht->instance >> 4)); 276 (chan->ramht->gpuobj->cinst >> 4));
265 nv_wo32(dev, ramfc, 0x44/4, 0x2101ffff); 277 nv_wo32(ramfc, 0x44, 0x01003fff);
266 nv_wo32(dev, ramfc, 0x60/4, 0x7fffffff); 278 nv_wo32(ramfc, 0x60, 0x7fffffff);
267 nv_wo32(dev, ramfc, 0x40/4, 0x00000000); 279 nv_wo32(ramfc, 0x40, 0x00000000);
268 nv_wo32(dev, ramfc, 0x7c/4, 0x30000001); 280 nv_wo32(ramfc, 0x7c, 0x30000001);
269 nv_wo32(dev, ramfc, 0x78/4, 0x00000000); 281 nv_wo32(ramfc, 0x78, 0x00000000);
270 nv_wo32(dev, ramfc, 0x3c/4, 0x403f6078); 282 nv_wo32(ramfc, 0x3c, 0x403f6078);
271 nv_wo32(dev, ramfc, 0x50/4, chan->pushbuf_base + 283 nv_wo32(ramfc, 0x50, chan->pushbuf_base + chan->dma.ib_base * 4);
272 chan->dma.ib_base * 4); 284 nv_wo32(ramfc, 0x54, drm_order(chan->dma.ib_max + 1) << 16);
273 nv_wo32(dev, ramfc, 0x54/4, drm_order(chan->dma.ib_max + 1) << 16);
274 285
275 if (dev_priv->chipset != 0x50) { 286 if (dev_priv->chipset != 0x50) {
276 nv_wo32(dev, chan->ramin->gpuobj, 0, chan->id); 287 nv_wo32(chan->ramin, 0, chan->id);
277 nv_wo32(dev, chan->ramin->gpuobj, 1, 288 nv_wo32(chan->ramin, 4, chan->ramfc->vinst >> 8);
278 chan->ramfc->instance >> 8);
279 289
280 nv_wo32(dev, ramfc, 0x88/4, chan->cache->instance >> 10); 290 nv_wo32(ramfc, 0x88, chan->cache->vinst >> 10);
281 nv_wo32(dev, ramfc, 0x98/4, chan->ramin->instance >> 12); 291 nv_wo32(ramfc, 0x98, chan->ramin->vinst >> 12);
282 } 292 }
283 293
284 dev_priv->engine.instmem.flush(dev); 294 dev_priv->engine.instmem.flush(dev);
@@ -293,12 +303,26 @@ void
293nv50_fifo_destroy_context(struct nouveau_channel *chan) 303nv50_fifo_destroy_context(struct nouveau_channel *chan)
294{ 304{
295 struct drm_device *dev = chan->dev; 305 struct drm_device *dev = chan->dev;
296 struct nouveau_gpuobj_ref *ramfc = chan->ramfc; 306 struct drm_nouveau_private *dev_priv = dev->dev_private;
307 struct nouveau_fifo_engine *pfifo = &dev_priv->engine.fifo;
308 struct nouveau_gpuobj *ramfc = NULL;
309 unsigned long flags;
297 310
298 NV_DEBUG(dev, "ch%d\n", chan->id); 311 NV_DEBUG(dev, "ch%d\n", chan->id);
299 312
313 spin_lock_irqsave(&dev_priv->context_switch_lock, flags);
314 pfifo->reassign(dev, false);
315
316 /* Unload the context if it's the currently active one */
317 if (pfifo->channel_id(dev) == chan->id) {
318 pfifo->disable(dev);
319 pfifo->unload_context(dev);
320 pfifo->enable(dev);
321 }
322
300 /* This will ensure the channel is seen as disabled. */ 323 /* This will ensure the channel is seen as disabled. */
301 chan->ramfc = NULL; 324 nouveau_gpuobj_ref(chan->ramfc, &ramfc);
325 nouveau_gpuobj_ref(NULL, &chan->ramfc);
302 nv50_fifo_channel_disable(dev, chan->id); 326 nv50_fifo_channel_disable(dev, chan->id);
303 327
304 /* Dummy channel, also used on ch 127 */ 328 /* Dummy channel, also used on ch 127 */
@@ -306,8 +330,16 @@ nv50_fifo_destroy_context(struct nouveau_channel *chan)
306 nv50_fifo_channel_disable(dev, 127); 330 nv50_fifo_channel_disable(dev, 127);
307 nv50_fifo_playlist_update(dev); 331 nv50_fifo_playlist_update(dev);
308 332
309 nouveau_gpuobj_ref_del(dev, &ramfc); 333 pfifo->reassign(dev, true);
310 nouveau_gpuobj_ref_del(dev, &chan->cache); 334 spin_unlock_irqrestore(&dev_priv->context_switch_lock, flags);
335
336 /* Free the channel resources */
337 if (chan->user) {
338 iounmap(chan->user);
339 chan->user = NULL;
340 }
341 nouveau_gpuobj_ref(NULL, &ramfc);
342 nouveau_gpuobj_ref(NULL, &chan->cache);
311} 343}
312 344
313int 345int
@@ -315,63 +347,63 @@ nv50_fifo_load_context(struct nouveau_channel *chan)
315{ 347{
316 struct drm_device *dev = chan->dev; 348 struct drm_device *dev = chan->dev;
317 struct drm_nouveau_private *dev_priv = dev->dev_private; 349 struct drm_nouveau_private *dev_priv = dev->dev_private;
318 struct nouveau_gpuobj *ramfc = chan->ramfc->gpuobj; 350 struct nouveau_gpuobj *ramfc = chan->ramfc;
319 struct nouveau_gpuobj *cache = chan->cache->gpuobj; 351 struct nouveau_gpuobj *cache = chan->cache;
320 int ptr, cnt; 352 int ptr, cnt;
321 353
322 NV_DEBUG(dev, "ch%d\n", chan->id); 354 NV_DEBUG(dev, "ch%d\n", chan->id);
323 355
324 nv_wr32(dev, 0x3330, nv_ro32(dev, ramfc, 0x00/4)); 356 nv_wr32(dev, 0x3330, nv_ro32(ramfc, 0x00));
325 nv_wr32(dev, 0x3334, nv_ro32(dev, ramfc, 0x04/4)); 357 nv_wr32(dev, 0x3334, nv_ro32(ramfc, 0x04));
326 nv_wr32(dev, 0x3240, nv_ro32(dev, ramfc, 0x08/4)); 358 nv_wr32(dev, 0x3240, nv_ro32(ramfc, 0x08));
327 nv_wr32(dev, 0x3320, nv_ro32(dev, ramfc, 0x0c/4)); 359 nv_wr32(dev, 0x3320, nv_ro32(ramfc, 0x0c));
328 nv_wr32(dev, 0x3244, nv_ro32(dev, ramfc, 0x10/4)); 360 nv_wr32(dev, 0x3244, nv_ro32(ramfc, 0x10));
329 nv_wr32(dev, 0x3328, nv_ro32(dev, ramfc, 0x14/4)); 361 nv_wr32(dev, 0x3328, nv_ro32(ramfc, 0x14));
330 nv_wr32(dev, 0x3368, nv_ro32(dev, ramfc, 0x18/4)); 362 nv_wr32(dev, 0x3368, nv_ro32(ramfc, 0x18));
331 nv_wr32(dev, 0x336c, nv_ro32(dev, ramfc, 0x1c/4)); 363 nv_wr32(dev, 0x336c, nv_ro32(ramfc, 0x1c));
332 nv_wr32(dev, 0x3370, nv_ro32(dev, ramfc, 0x20/4)); 364 nv_wr32(dev, 0x3370, nv_ro32(ramfc, 0x20));
333 nv_wr32(dev, 0x3374, nv_ro32(dev, ramfc, 0x24/4)); 365 nv_wr32(dev, 0x3374, nv_ro32(ramfc, 0x24));
334 nv_wr32(dev, 0x3378, nv_ro32(dev, ramfc, 0x28/4)); 366 nv_wr32(dev, 0x3378, nv_ro32(ramfc, 0x28));
335 nv_wr32(dev, 0x337c, nv_ro32(dev, ramfc, 0x2c/4)); 367 nv_wr32(dev, 0x337c, nv_ro32(ramfc, 0x2c));
336 nv_wr32(dev, 0x3228, nv_ro32(dev, ramfc, 0x30/4)); 368 nv_wr32(dev, 0x3228, nv_ro32(ramfc, 0x30));
337 nv_wr32(dev, 0x3364, nv_ro32(dev, ramfc, 0x34/4)); 369 nv_wr32(dev, 0x3364, nv_ro32(ramfc, 0x34));
338 nv_wr32(dev, 0x32a0, nv_ro32(dev, ramfc, 0x38/4)); 370 nv_wr32(dev, 0x32a0, nv_ro32(ramfc, 0x38));
339 nv_wr32(dev, 0x3224, nv_ro32(dev, ramfc, 0x3c/4)); 371 nv_wr32(dev, 0x3224, nv_ro32(ramfc, 0x3c));
340 nv_wr32(dev, 0x324c, nv_ro32(dev, ramfc, 0x40/4)); 372 nv_wr32(dev, 0x324c, nv_ro32(ramfc, 0x40));
341 nv_wr32(dev, 0x2044, nv_ro32(dev, ramfc, 0x44/4)); 373 nv_wr32(dev, 0x2044, nv_ro32(ramfc, 0x44));
342 nv_wr32(dev, 0x322c, nv_ro32(dev, ramfc, 0x48/4)); 374 nv_wr32(dev, 0x322c, nv_ro32(ramfc, 0x48));
343 nv_wr32(dev, 0x3234, nv_ro32(dev, ramfc, 0x4c/4)); 375 nv_wr32(dev, 0x3234, nv_ro32(ramfc, 0x4c));
344 nv_wr32(dev, 0x3340, nv_ro32(dev, ramfc, 0x50/4)); 376 nv_wr32(dev, 0x3340, nv_ro32(ramfc, 0x50));
345 nv_wr32(dev, 0x3344, nv_ro32(dev, ramfc, 0x54/4)); 377 nv_wr32(dev, 0x3344, nv_ro32(ramfc, 0x54));
346 nv_wr32(dev, 0x3280, nv_ro32(dev, ramfc, 0x58/4)); 378 nv_wr32(dev, 0x3280, nv_ro32(ramfc, 0x58));
347 nv_wr32(dev, 0x3254, nv_ro32(dev, ramfc, 0x5c/4)); 379 nv_wr32(dev, 0x3254, nv_ro32(ramfc, 0x5c));
348 nv_wr32(dev, 0x3260, nv_ro32(dev, ramfc, 0x60/4)); 380 nv_wr32(dev, 0x3260, nv_ro32(ramfc, 0x60));
349 nv_wr32(dev, 0x3264, nv_ro32(dev, ramfc, 0x64/4)); 381 nv_wr32(dev, 0x3264, nv_ro32(ramfc, 0x64));
350 nv_wr32(dev, 0x3268, nv_ro32(dev, ramfc, 0x68/4)); 382 nv_wr32(dev, 0x3268, nv_ro32(ramfc, 0x68));
351 nv_wr32(dev, 0x326c, nv_ro32(dev, ramfc, 0x6c/4)); 383 nv_wr32(dev, 0x326c, nv_ro32(ramfc, 0x6c));
352 nv_wr32(dev, 0x32e4, nv_ro32(dev, ramfc, 0x70/4)); 384 nv_wr32(dev, 0x32e4, nv_ro32(ramfc, 0x70));
353 nv_wr32(dev, 0x3248, nv_ro32(dev, ramfc, 0x74/4)); 385 nv_wr32(dev, 0x3248, nv_ro32(ramfc, 0x74));
354 nv_wr32(dev, 0x2088, nv_ro32(dev, ramfc, 0x78/4)); 386 nv_wr32(dev, 0x2088, nv_ro32(ramfc, 0x78));
355 nv_wr32(dev, 0x2058, nv_ro32(dev, ramfc, 0x7c/4)); 387 nv_wr32(dev, 0x2058, nv_ro32(ramfc, 0x7c));
356 nv_wr32(dev, 0x2210, nv_ro32(dev, ramfc, 0x80/4)); 388 nv_wr32(dev, 0x2210, nv_ro32(ramfc, 0x80));
357 389
358 cnt = nv_ro32(dev, ramfc, 0x84/4); 390 cnt = nv_ro32(ramfc, 0x84);
359 for (ptr = 0; ptr < cnt; ptr++) { 391 for (ptr = 0; ptr < cnt; ptr++) {
360 nv_wr32(dev, NV40_PFIFO_CACHE1_METHOD(ptr), 392 nv_wr32(dev, NV40_PFIFO_CACHE1_METHOD(ptr),
361 nv_ro32(dev, cache, (ptr * 2) + 0)); 393 nv_ro32(cache, (ptr * 8) + 0));
362 nv_wr32(dev, NV40_PFIFO_CACHE1_DATA(ptr), 394 nv_wr32(dev, NV40_PFIFO_CACHE1_DATA(ptr),
363 nv_ro32(dev, cache, (ptr * 2) + 1)); 395 nv_ro32(cache, (ptr * 8) + 4));
364 } 396 }
365 nv_wr32(dev, NV03_PFIFO_CACHE1_PUT, cnt << 2); 397 nv_wr32(dev, NV03_PFIFO_CACHE1_PUT, cnt << 2);
366 nv_wr32(dev, NV03_PFIFO_CACHE1_GET, 0); 398 nv_wr32(dev, NV03_PFIFO_CACHE1_GET, 0);
367 399
368 /* guessing that all the 0x34xx regs aren't on NV50 */ 400 /* guessing that all the 0x34xx regs aren't on NV50 */
369 if (dev_priv->chipset != 0x50) { 401 if (dev_priv->chipset != 0x50) {
370 nv_wr32(dev, 0x340c, nv_ro32(dev, ramfc, 0x88/4)); 402 nv_wr32(dev, 0x340c, nv_ro32(ramfc, 0x88));
371 nv_wr32(dev, 0x3400, nv_ro32(dev, ramfc, 0x8c/4)); 403 nv_wr32(dev, 0x3400, nv_ro32(ramfc, 0x8c));
372 nv_wr32(dev, 0x3404, nv_ro32(dev, ramfc, 0x90/4)); 404 nv_wr32(dev, 0x3404, nv_ro32(ramfc, 0x90));
373 nv_wr32(dev, 0x3408, nv_ro32(dev, ramfc, 0x94/4)); 405 nv_wr32(dev, 0x3408, nv_ro32(ramfc, 0x94));
374 nv_wr32(dev, 0x3410, nv_ro32(dev, ramfc, 0x98/4)); 406 nv_wr32(dev, 0x3410, nv_ro32(ramfc, 0x98));
375 } 407 }
376 408
377 nv_wr32(dev, NV03_PFIFO_CACHE1_PUSH1, chan->id | (1<<16)); 409 nv_wr32(dev, NV03_PFIFO_CACHE1_PUSH1, chan->id | (1<<16));
@@ -393,68 +425,69 @@ nv50_fifo_unload_context(struct drm_device *dev)
393 if (chid < 1 || chid >= dev_priv->engine.fifo.channels - 1) 425 if (chid < 1 || chid >= dev_priv->engine.fifo.channels - 1)
394 return 0; 426 return 0;
395 427
396 chan = dev_priv->fifos[chid]; 428 chan = dev_priv->channels.ptr[chid];
397 if (!chan) { 429 if (!chan) {
398 NV_ERROR(dev, "Inactive channel on PFIFO: %d\n", chid); 430 NV_ERROR(dev, "Inactive channel on PFIFO: %d\n", chid);
399 return -EINVAL; 431 return -EINVAL;
400 } 432 }
401 NV_DEBUG(dev, "ch%d\n", chan->id); 433 NV_DEBUG(dev, "ch%d\n", chan->id);
402 ramfc = chan->ramfc->gpuobj; 434 ramfc = chan->ramfc;
403 cache = chan->cache->gpuobj; 435 cache = chan->cache;
404 436
405 nv_wo32(dev, ramfc, 0x00/4, nv_rd32(dev, 0x3330)); 437 nv_wo32(ramfc, 0x00, nv_rd32(dev, 0x3330));
406 nv_wo32(dev, ramfc, 0x04/4, nv_rd32(dev, 0x3334)); 438 nv_wo32(ramfc, 0x04, nv_rd32(dev, 0x3334));
407 nv_wo32(dev, ramfc, 0x08/4, nv_rd32(dev, 0x3240)); 439 nv_wo32(ramfc, 0x08, nv_rd32(dev, 0x3240));
408 nv_wo32(dev, ramfc, 0x0c/4, nv_rd32(dev, 0x3320)); 440 nv_wo32(ramfc, 0x0c, nv_rd32(dev, 0x3320));
409 nv_wo32(dev, ramfc, 0x10/4, nv_rd32(dev, 0x3244)); 441 nv_wo32(ramfc, 0x10, nv_rd32(dev, 0x3244));
410 nv_wo32(dev, ramfc, 0x14/4, nv_rd32(dev, 0x3328)); 442 nv_wo32(ramfc, 0x14, nv_rd32(dev, 0x3328));
411 nv_wo32(dev, ramfc, 0x18/4, nv_rd32(dev, 0x3368)); 443 nv_wo32(ramfc, 0x18, nv_rd32(dev, 0x3368));
412 nv_wo32(dev, ramfc, 0x1c/4, nv_rd32(dev, 0x336c)); 444 nv_wo32(ramfc, 0x1c, nv_rd32(dev, 0x336c));
413 nv_wo32(dev, ramfc, 0x20/4, nv_rd32(dev, 0x3370)); 445 nv_wo32(ramfc, 0x20, nv_rd32(dev, 0x3370));
414 nv_wo32(dev, ramfc, 0x24/4, nv_rd32(dev, 0x3374)); 446 nv_wo32(ramfc, 0x24, nv_rd32(dev, 0x3374));
415 nv_wo32(dev, ramfc, 0x28/4, nv_rd32(dev, 0x3378)); 447 nv_wo32(ramfc, 0x28, nv_rd32(dev, 0x3378));
416 nv_wo32(dev, ramfc, 0x2c/4, nv_rd32(dev, 0x337c)); 448 nv_wo32(ramfc, 0x2c, nv_rd32(dev, 0x337c));
417 nv_wo32(dev, ramfc, 0x30/4, nv_rd32(dev, 0x3228)); 449 nv_wo32(ramfc, 0x30, nv_rd32(dev, 0x3228));
418 nv_wo32(dev, ramfc, 0x34/4, nv_rd32(dev, 0x3364)); 450 nv_wo32(ramfc, 0x34, nv_rd32(dev, 0x3364));
419 nv_wo32(dev, ramfc, 0x38/4, nv_rd32(dev, 0x32a0)); 451 nv_wo32(ramfc, 0x38, nv_rd32(dev, 0x32a0));
420 nv_wo32(dev, ramfc, 0x3c/4, nv_rd32(dev, 0x3224)); 452 nv_wo32(ramfc, 0x3c, nv_rd32(dev, 0x3224));
421 nv_wo32(dev, ramfc, 0x40/4, nv_rd32(dev, 0x324c)); 453 nv_wo32(ramfc, 0x40, nv_rd32(dev, 0x324c));
422 nv_wo32(dev, ramfc, 0x44/4, nv_rd32(dev, 0x2044)); 454 nv_wo32(ramfc, 0x44, nv_rd32(dev, 0x2044));
423 nv_wo32(dev, ramfc, 0x48/4, nv_rd32(dev, 0x322c)); 455 nv_wo32(ramfc, 0x48, nv_rd32(dev, 0x322c));
424 nv_wo32(dev, ramfc, 0x4c/4, nv_rd32(dev, 0x3234)); 456 nv_wo32(ramfc, 0x4c, nv_rd32(dev, 0x3234));
425 nv_wo32(dev, ramfc, 0x50/4, nv_rd32(dev, 0x3340)); 457 nv_wo32(ramfc, 0x50, nv_rd32(dev, 0x3340));
426 nv_wo32(dev, ramfc, 0x54/4, nv_rd32(dev, 0x3344)); 458 nv_wo32(ramfc, 0x54, nv_rd32(dev, 0x3344));
427 nv_wo32(dev, ramfc, 0x58/4, nv_rd32(dev, 0x3280)); 459 nv_wo32(ramfc, 0x58, nv_rd32(dev, 0x3280));
428 nv_wo32(dev, ramfc, 0x5c/4, nv_rd32(dev, 0x3254)); 460 nv_wo32(ramfc, 0x5c, nv_rd32(dev, 0x3254));
429 nv_wo32(dev, ramfc, 0x60/4, nv_rd32(dev, 0x3260)); 461 nv_wo32(ramfc, 0x60, nv_rd32(dev, 0x3260));
430 nv_wo32(dev, ramfc, 0x64/4, nv_rd32(dev, 0x3264)); 462 nv_wo32(ramfc, 0x64, nv_rd32(dev, 0x3264));
431 nv_wo32(dev, ramfc, 0x68/4, nv_rd32(dev, 0x3268)); 463 nv_wo32(ramfc, 0x68, nv_rd32(dev, 0x3268));
432 nv_wo32(dev, ramfc, 0x6c/4, nv_rd32(dev, 0x326c)); 464 nv_wo32(ramfc, 0x6c, nv_rd32(dev, 0x326c));
433 nv_wo32(dev, ramfc, 0x70/4, nv_rd32(dev, 0x32e4)); 465 nv_wo32(ramfc, 0x70, nv_rd32(dev, 0x32e4));
434 nv_wo32(dev, ramfc, 0x74/4, nv_rd32(dev, 0x3248)); 466 nv_wo32(ramfc, 0x74, nv_rd32(dev, 0x3248));
435 nv_wo32(dev, ramfc, 0x78/4, nv_rd32(dev, 0x2088)); 467 nv_wo32(ramfc, 0x78, nv_rd32(dev, 0x2088));
436 nv_wo32(dev, ramfc, 0x7c/4, nv_rd32(dev, 0x2058)); 468 nv_wo32(ramfc, 0x7c, nv_rd32(dev, 0x2058));
437 nv_wo32(dev, ramfc, 0x80/4, nv_rd32(dev, 0x2210)); 469 nv_wo32(ramfc, 0x80, nv_rd32(dev, 0x2210));
438 470
439 put = (nv_rd32(dev, NV03_PFIFO_CACHE1_PUT) & 0x7ff) >> 2; 471 put = (nv_rd32(dev, NV03_PFIFO_CACHE1_PUT) & 0x7ff) >> 2;
440 get = (nv_rd32(dev, NV03_PFIFO_CACHE1_GET) & 0x7ff) >> 2; 472 get = (nv_rd32(dev, NV03_PFIFO_CACHE1_GET) & 0x7ff) >> 2;
441 ptr = 0; 473 ptr = 0;
442 while (put != get) { 474 while (put != get) {
443 nv_wo32(dev, cache, ptr++, 475 nv_wo32(cache, ptr + 0,
444 nv_rd32(dev, NV40_PFIFO_CACHE1_METHOD(get))); 476 nv_rd32(dev, NV40_PFIFO_CACHE1_METHOD(get)));
445 nv_wo32(dev, cache, ptr++, 477 nv_wo32(cache, ptr + 4,
446 nv_rd32(dev, NV40_PFIFO_CACHE1_DATA(get))); 478 nv_rd32(dev, NV40_PFIFO_CACHE1_DATA(get)));
447 get = (get + 1) & 0x1ff; 479 get = (get + 1) & 0x1ff;
480 ptr += 8;
448 } 481 }
449 482
450 /* guessing that all the 0x34xx regs aren't on NV50 */ 483 /* guessing that all the 0x34xx regs aren't on NV50 */
451 if (dev_priv->chipset != 0x50) { 484 if (dev_priv->chipset != 0x50) {
452 nv_wo32(dev, ramfc, 0x84/4, ptr >> 1); 485 nv_wo32(ramfc, 0x84, ptr >> 3);
453 nv_wo32(dev, ramfc, 0x88/4, nv_rd32(dev, 0x340c)); 486 nv_wo32(ramfc, 0x88, nv_rd32(dev, 0x340c));
454 nv_wo32(dev, ramfc, 0x8c/4, nv_rd32(dev, 0x3400)); 487 nv_wo32(ramfc, 0x8c, nv_rd32(dev, 0x3400));
455 nv_wo32(dev, ramfc, 0x90/4, nv_rd32(dev, 0x3404)); 488 nv_wo32(ramfc, 0x90, nv_rd32(dev, 0x3404));
456 nv_wo32(dev, ramfc, 0x94/4, nv_rd32(dev, 0x3408)); 489 nv_wo32(ramfc, 0x94, nv_rd32(dev, 0x3408));
457 nv_wo32(dev, ramfc, 0x98/4, nv_rd32(dev, 0x3410)); 490 nv_wo32(ramfc, 0x98, nv_rd32(dev, 0x3410));
458 } 491 }
459 492
460 dev_priv->engine.instmem.flush(dev); 493 dev_priv->engine.instmem.flush(dev);
@@ -464,3 +497,8 @@ nv50_fifo_unload_context(struct drm_device *dev)
464 return 0; 497 return 0;
465} 498}
466 499
500void
501nv50_fifo_tlb_flush(struct drm_device *dev)
502{
503 nv50_vm_flush_engine(dev, 5);
504}
diff --git a/drivers/gpu/drm/nouveau/nv50_gpio.c b/drivers/gpu/drm/nouveau/nv50_gpio.c
index b2fab2bf3d61..d4f4206dad7e 100644
--- a/drivers/gpu/drm/nouveau/nv50_gpio.c
+++ b/drivers/gpu/drm/nouveau/nv50_gpio.c
@@ -26,6 +26,28 @@
26#include "nouveau_drv.h" 26#include "nouveau_drv.h"
27#include "nouveau_hw.h" 27#include "nouveau_hw.h"
28 28
29#include "nv50_display.h"
30
31static void nv50_gpio_isr(struct drm_device *dev);
32static void nv50_gpio_isr_bh(struct work_struct *work);
33
34struct nv50_gpio_priv {
35 struct list_head handlers;
36 spinlock_t lock;
37};
38
39struct nv50_gpio_handler {
40 struct drm_device *dev;
41 struct list_head head;
42 struct work_struct work;
43 bool inhibit;
44
45 struct dcb_gpio_entry *gpio;
46
47 void (*handler)(void *data, int state);
48 void *data;
49};
50
29static int 51static int
30nv50_gpio_location(struct dcb_gpio_entry *gpio, uint32_t *reg, uint32_t *shift) 52nv50_gpio_location(struct dcb_gpio_entry *gpio, uint32_t *reg, uint32_t *shift)
31{ 53{
@@ -75,29 +97,126 @@ nv50_gpio_set(struct drm_device *dev, enum dcb_gpio_tag tag, int state)
75 return 0; 97 return 0;
76} 98}
77 99
100int
101nv50_gpio_irq_register(struct drm_device *dev, enum dcb_gpio_tag tag,
102 void (*handler)(void *, int), void *data)
103{
104 struct drm_nouveau_private *dev_priv = dev->dev_private;
105 struct nouveau_gpio_engine *pgpio = &dev_priv->engine.gpio;
106 struct nv50_gpio_priv *priv = pgpio->priv;
107 struct nv50_gpio_handler *gpioh;
108 struct dcb_gpio_entry *gpio;
109 unsigned long flags;
110
111 gpio = nouveau_bios_gpio_entry(dev, tag);
112 if (!gpio)
113 return -ENOENT;
114
115 gpioh = kzalloc(sizeof(*gpioh), GFP_KERNEL);
116 if (!gpioh)
117 return -ENOMEM;
118
119 INIT_WORK(&gpioh->work, nv50_gpio_isr_bh);
120 gpioh->dev = dev;
121 gpioh->gpio = gpio;
122 gpioh->handler = handler;
123 gpioh->data = data;
124
125 spin_lock_irqsave(&priv->lock, flags);
126 list_add(&gpioh->head, &priv->handlers);
127 spin_unlock_irqrestore(&priv->lock, flags);
128 return 0;
129}
130
78void 131void
79nv50_gpio_irq_enable(struct drm_device *dev, enum dcb_gpio_tag tag, bool on) 132nv50_gpio_irq_unregister(struct drm_device *dev, enum dcb_gpio_tag tag,
133 void (*handler)(void *, int), void *data)
80{ 134{
135 struct drm_nouveau_private *dev_priv = dev->dev_private;
136 struct nouveau_gpio_engine *pgpio = &dev_priv->engine.gpio;
137 struct nv50_gpio_priv *priv = pgpio->priv;
138 struct nv50_gpio_handler *gpioh, *tmp;
81 struct dcb_gpio_entry *gpio; 139 struct dcb_gpio_entry *gpio;
82 u32 reg, mask; 140 LIST_HEAD(tofree);
141 unsigned long flags;
83 142
84 gpio = nouveau_bios_gpio_entry(dev, tag); 143 gpio = nouveau_bios_gpio_entry(dev, tag);
85 if (!gpio) { 144 if (!gpio)
86 NV_ERROR(dev, "gpio tag 0x%02x not found\n", tag);
87 return; 145 return;
146
147 spin_lock_irqsave(&priv->lock, flags);
148 list_for_each_entry_safe(gpioh, tmp, &priv->handlers, head) {
149 if (gpioh->gpio != gpio ||
150 gpioh->handler != handler ||
151 gpioh->data != data)
152 continue;
153 list_move(&gpioh->head, &tofree);
154 }
155 spin_unlock_irqrestore(&priv->lock, flags);
156
157 list_for_each_entry_safe(gpioh, tmp, &tofree, head) {
158 flush_work_sync(&gpioh->work);
159 kfree(gpioh);
88 } 160 }
161}
162
163bool
164nv50_gpio_irq_enable(struct drm_device *dev, enum dcb_gpio_tag tag, bool on)
165{
166 struct dcb_gpio_entry *gpio;
167 u32 reg, mask;
168
169 gpio = nouveau_bios_gpio_entry(dev, tag);
170 if (!gpio)
171 return false;
89 172
90 reg = gpio->line < 16 ? 0xe050 : 0xe070; 173 reg = gpio->line < 16 ? 0xe050 : 0xe070;
91 mask = 0x00010001 << (gpio->line & 0xf); 174 mask = 0x00010001 << (gpio->line & 0xf);
92 175
93 nv_wr32(dev, reg + 4, mask); 176 nv_wr32(dev, reg + 4, mask);
94 nv_mask(dev, reg + 0, mask, on ? mask : 0); 177 reg = nv_mask(dev, reg + 0, mask, on ? mask : 0);
178 return (reg & mask) == mask;
179}
180
181static int
182nv50_gpio_create(struct drm_device *dev)
183{
184 struct drm_nouveau_private *dev_priv = dev->dev_private;
185 struct nouveau_gpio_engine *pgpio = &dev_priv->engine.gpio;
186 struct nv50_gpio_priv *priv;
187
188 priv = kzalloc(sizeof(*priv), GFP_KERNEL);
189 if (!priv)
190 return -ENOMEM;
191
192 INIT_LIST_HEAD(&priv->handlers);
193 spin_lock_init(&priv->lock);
194 pgpio->priv = priv;
195 return 0;
196}
197
198static void
199nv50_gpio_destroy(struct drm_device *dev)
200{
201 struct drm_nouveau_private *dev_priv = dev->dev_private;
202 struct nouveau_gpio_engine *pgpio = &dev_priv->engine.gpio;
203
204 kfree(pgpio->priv);
205 pgpio->priv = NULL;
95} 206}
96 207
97int 208int
98nv50_gpio_init(struct drm_device *dev) 209nv50_gpio_init(struct drm_device *dev)
99{ 210{
100 struct drm_nouveau_private *dev_priv = dev->dev_private; 211 struct drm_nouveau_private *dev_priv = dev->dev_private;
212 struct nouveau_gpio_engine *pgpio = &dev_priv->engine.gpio;
213 int ret;
214
215 if (!pgpio->priv) {
216 ret = nv50_gpio_create(dev);
217 if (ret)
218 return ret;
219 }
101 220
102 /* disable, and ack any pending gpio interrupts */ 221 /* disable, and ack any pending gpio interrupts */
103 nv_wr32(dev, 0xe050, 0x00000000); 222 nv_wr32(dev, 0xe050, 0x00000000);
@@ -107,5 +226,77 @@ nv50_gpio_init(struct drm_device *dev)
107 nv_wr32(dev, 0xe074, 0xffffffff); 226 nv_wr32(dev, 0xe074, 0xffffffff);
108 } 227 }
109 228
229 nouveau_irq_register(dev, 21, nv50_gpio_isr);
110 return 0; 230 return 0;
111} 231}
232
233void
234nv50_gpio_fini(struct drm_device *dev)
235{
236 struct drm_nouveau_private *dev_priv = dev->dev_private;
237
238 nv_wr32(dev, 0xe050, 0x00000000);
239 if (dev_priv->chipset >= 0x90)
240 nv_wr32(dev, 0xe070, 0x00000000);
241 nouveau_irq_unregister(dev, 21);
242
243 nv50_gpio_destroy(dev);
244}
245
246static void
247nv50_gpio_isr_bh(struct work_struct *work)
248{
249 struct nv50_gpio_handler *gpioh =
250 container_of(work, struct nv50_gpio_handler, work);
251 struct drm_nouveau_private *dev_priv = gpioh->dev->dev_private;
252 struct nouveau_gpio_engine *pgpio = &dev_priv->engine.gpio;
253 struct nv50_gpio_priv *priv = pgpio->priv;
254 unsigned long flags;
255 int state;
256
257 state = pgpio->get(gpioh->dev, gpioh->gpio->tag);
258 if (state < 0)
259 return;
260
261 gpioh->handler(gpioh->data, state);
262
263 spin_lock_irqsave(&priv->lock, flags);
264 gpioh->inhibit = false;
265 spin_unlock_irqrestore(&priv->lock, flags);
266}
267
268static void
269nv50_gpio_isr(struct drm_device *dev)
270{
271 struct drm_nouveau_private *dev_priv = dev->dev_private;
272 struct nouveau_gpio_engine *pgpio = &dev_priv->engine.gpio;
273 struct nv50_gpio_priv *priv = pgpio->priv;
274 struct nv50_gpio_handler *gpioh;
275 u32 intr0, intr1 = 0;
276 u32 hi, lo, ch;
277
278 intr0 = nv_rd32(dev, 0xe054) & nv_rd32(dev, 0xe050);
279 if (dev_priv->chipset >= 0x90)
280 intr1 = nv_rd32(dev, 0xe074) & nv_rd32(dev, 0xe070);
281
282 hi = (intr0 & 0x0000ffff) | (intr1 << 16);
283 lo = (intr0 >> 16) | (intr1 & 0xffff0000);
284 ch = hi | lo;
285
286 nv_wr32(dev, 0xe054, intr0);
287 if (dev_priv->chipset >= 0x90)
288 nv_wr32(dev, 0xe074, intr1);
289
290 spin_lock(&priv->lock);
291 list_for_each_entry(gpioh, &priv->handlers, head) {
292 if (!(ch & (1 << gpioh->gpio->line)))
293 continue;
294
295 if (gpioh->inhibit)
296 continue;
297 gpioh->inhibit = true;
298
299 schedule_work(&gpioh->work);
300 }
301 spin_unlock(&priv->lock);
302}
diff --git a/drivers/gpu/drm/nouveau/nv50_graph.c b/drivers/gpu/drm/nouveau/nv50_graph.c
index 1413028e1580..e25cbb46789a 100644
--- a/drivers/gpu/drm/nouveau/nv50_graph.c
+++ b/drivers/gpu/drm/nouveau/nv50_graph.c
@@ -27,8 +27,99 @@
27#include "drmP.h" 27#include "drmP.h"
28#include "drm.h" 28#include "drm.h"
29#include "nouveau_drv.h" 29#include "nouveau_drv.h"
30 30#include "nouveau_ramht.h"
31#include "nouveau_grctx.h" 31#include "nouveau_grctx.h"
32#include "nouveau_dma.h"
33#include "nouveau_vm.h"
34#include "nouveau_ramht.h"
35#include "nv50_evo.h"
36
37struct nv50_graph_engine {
38 struct nouveau_exec_engine base;
39 u32 ctxprog[512];
40 u32 ctxprog_size;
41 u32 grctx_size;
42};
43
44static void
45nv50_graph_fifo_access(struct drm_device *dev, bool enabled)
46{
47 const uint32_t mask = 0x00010001;
48
49 if (enabled)
50 nv_wr32(dev, 0x400500, nv_rd32(dev, 0x400500) | mask);
51 else
52 nv_wr32(dev, 0x400500, nv_rd32(dev, 0x400500) & ~mask);
53}
54
55static struct nouveau_channel *
56nv50_graph_channel(struct drm_device *dev)
57{
58 struct drm_nouveau_private *dev_priv = dev->dev_private;
59 uint32_t inst;
60 int i;
61
62 /* Be sure we're not in the middle of a context switch or bad things
63 * will happen, such as unloading the wrong pgraph context.
64 */
65 if (!nv_wait(dev, 0x400300, 0x00000001, 0x00000000))
66 NV_ERROR(dev, "Ctxprog is still running\n");
67
68 inst = nv_rd32(dev, NV50_PGRAPH_CTXCTL_CUR);
69 if (!(inst & NV50_PGRAPH_CTXCTL_CUR_LOADED))
70 return NULL;
71 inst = (inst & NV50_PGRAPH_CTXCTL_CUR_INSTANCE) << 12;
72
73 for (i = 0; i < dev_priv->engine.fifo.channels; i++) {
74 struct nouveau_channel *chan = dev_priv->channels.ptr[i];
75
76 if (chan && chan->ramin && chan->ramin->vinst == inst)
77 return chan;
78 }
79
80 return NULL;
81}
82
83static int
84nv50_graph_do_load_context(struct drm_device *dev, uint32_t inst)
85{
86 uint32_t fifo = nv_rd32(dev, 0x400500);
87
88 nv_wr32(dev, 0x400500, fifo & ~1);
89 nv_wr32(dev, 0x400784, inst);
90 nv_wr32(dev, 0x400824, nv_rd32(dev, 0x400824) | 0x40);
91 nv_wr32(dev, 0x400320, nv_rd32(dev, 0x400320) | 0x11);
92 nv_wr32(dev, 0x400040, 0xffffffff);
93 (void)nv_rd32(dev, 0x400040);
94 nv_wr32(dev, 0x400040, 0x00000000);
95 nv_wr32(dev, 0x400304, nv_rd32(dev, 0x400304) | 1);
96
97 if (nouveau_wait_for_idle(dev))
98 nv_wr32(dev, 0x40032c, inst | (1<<31));
99 nv_wr32(dev, 0x400500, fifo);
100
101 return 0;
102}
103
104static int
105nv50_graph_unload_context(struct drm_device *dev)
106{
107 uint32_t inst;
108
109 inst = nv_rd32(dev, NV50_PGRAPH_CTXCTL_CUR);
110 if (!(inst & NV50_PGRAPH_CTXCTL_CUR_LOADED))
111 return 0;
112 inst &= NV50_PGRAPH_CTXCTL_CUR_INSTANCE;
113
114 nouveau_wait_for_idle(dev);
115 nv_wr32(dev, 0x400784, inst);
116 nv_wr32(dev, 0x400824, nv_rd32(dev, 0x400824) | 0x20);
117 nv_wr32(dev, 0x400304, nv_rd32(dev, 0x400304) | 0x01);
118 nouveau_wait_for_idle(dev);
119
120 nv_wr32(dev, NV50_PGRAPH_CTXCTL_CUR, inst);
121 return 0;
122}
32 123
33static void 124static void
34nv50_graph_init_reset(struct drm_device *dev) 125nv50_graph_init_reset(struct drm_device *dev)
@@ -88,55 +179,64 @@ nv50_graph_init_regs__nv(struct drm_device *dev)
88} 179}
89 180
90static void 181static void
91nv50_graph_init_regs(struct drm_device *dev) 182nv50_graph_init_zcull(struct drm_device *dev)
92{ 183{
184 struct drm_nouveau_private *dev_priv = dev->dev_private;
185 int i;
186
93 NV_DEBUG(dev, "\n"); 187 NV_DEBUG(dev, "\n");
94 188
95 nv_wr32(dev, NV04_PGRAPH_DEBUG_3, 189 switch (dev_priv->chipset & 0xf0) {
96 (1 << 2) /* HW_CONTEXT_SWITCH_ENABLED */); 190 case 0x50:
97 nv_wr32(dev, 0x402ca8, 0x800); 191 case 0x80:
192 case 0x90:
193 nv_wr32(dev, 0x402ca8, 0x00000800);
194 break;
195 case 0xa0:
196 default:
197 nv_wr32(dev, 0x402cc0, 0x00000000);
198 if (dev_priv->chipset == 0xa0 ||
199 dev_priv->chipset == 0xaa ||
200 dev_priv->chipset == 0xac) {
201 nv_wr32(dev, 0x402ca8, 0x00000802);
202 } else {
203 nv_wr32(dev, 0x402cc0, 0x00000000);
204 nv_wr32(dev, 0x402ca8, 0x00000002);
205 }
206
207 break;
208 }
209
210 /* zero out zcull regions */
211 for (i = 0; i < 8; i++) {
212 nv_wr32(dev, 0x402c20 + (i * 8), 0x00000000);
213 nv_wr32(dev, 0x402c24 + (i * 8), 0x00000000);
214 nv_wr32(dev, 0x402c28 + (i * 8), 0x00000000);
215 nv_wr32(dev, 0x402c2c + (i * 8), 0x00000000);
216 }
98} 217}
99 218
100static int 219static int
101nv50_graph_init_ctxctl(struct drm_device *dev) 220nv50_graph_init_ctxctl(struct drm_device *dev)
102{ 221{
103 struct drm_nouveau_private *dev_priv = dev->dev_private; 222 struct nv50_graph_engine *pgraph = nv_engine(dev, NVOBJ_ENGINE_GR);
104 struct nouveau_grctx ctx = {};
105 uint32_t *cp;
106 int i; 223 int i;
107 224
108 NV_DEBUG(dev, "\n"); 225 NV_DEBUG(dev, "\n");
109 226
110 cp = kmalloc(512 * 4, GFP_KERNEL); 227 nv_wr32(dev, NV40_PGRAPH_CTXCTL_UCODE_INDEX, 0);
111 if (!cp) { 228 for (i = 0; i < pgraph->ctxprog_size; i++)
112 NV_ERROR(dev, "failed to allocate ctxprog\n"); 229 nv_wr32(dev, NV40_PGRAPH_CTXCTL_UCODE_DATA, pgraph->ctxprog[i]);
113 dev_priv->engine.graph.accel_blocked = true;
114 return 0;
115 }
116
117 ctx.dev = dev;
118 ctx.mode = NOUVEAU_GRCTX_PROG;
119 ctx.data = cp;
120 ctx.ctxprog_max = 512;
121 if (!nv50_grctx_init(&ctx)) {
122 dev_priv->engine.graph.grctx_size = ctx.ctxvals_pos * 4;
123
124 nv_wr32(dev, NV40_PGRAPH_CTXCTL_UCODE_INDEX, 0);
125 for (i = 0; i < ctx.ctxprog_len; i++)
126 nv_wr32(dev, NV40_PGRAPH_CTXCTL_UCODE_DATA, cp[i]);
127 } else {
128 dev_priv->engine.graph.accel_blocked = true;
129 }
130 kfree(cp);
131 230
231 nv_wr32(dev, 0x40008c, 0x00000004); /* HW_CTX_SWITCH_ENABLED */
132 nv_wr32(dev, 0x400320, 4); 232 nv_wr32(dev, 0x400320, 4);
133 nv_wr32(dev, NV40_PGRAPH_CTXCTL_CUR, 0); 233 nv_wr32(dev, NV40_PGRAPH_CTXCTL_CUR, 0);
134 nv_wr32(dev, NV20_PGRAPH_CHANNEL_CTX_POINTER, 0); 234 nv_wr32(dev, NV20_PGRAPH_CHANNEL_CTX_POINTER, 0);
135 return 0; 235 return 0;
136} 236}
137 237
138int 238static int
139nv50_graph_init(struct drm_device *dev) 239nv50_graph_init(struct drm_device *dev, int engine)
140{ 240{
141 int ret; 241 int ret;
142 242
@@ -144,171 +244,129 @@ nv50_graph_init(struct drm_device *dev)
144 244
145 nv50_graph_init_reset(dev); 245 nv50_graph_init_reset(dev);
146 nv50_graph_init_regs__nv(dev); 246 nv50_graph_init_regs__nv(dev);
147 nv50_graph_init_regs(dev); 247 nv50_graph_init_zcull(dev);
148 nv50_graph_init_intr(dev);
149 248
150 ret = nv50_graph_init_ctxctl(dev); 249 ret = nv50_graph_init_ctxctl(dev);
151 if (ret) 250 if (ret)
152 return ret; 251 return ret;
153 252
253 nv50_graph_init_intr(dev);
154 return 0; 254 return 0;
155} 255}
156 256
157void 257static int
158nv50_graph_takedown(struct drm_device *dev) 258nv50_graph_fini(struct drm_device *dev, int engine)
159{ 259{
160 NV_DEBUG(dev, "\n"); 260 NV_DEBUG(dev, "\n");
261 nv50_graph_unload_context(dev);
262 nv_wr32(dev, 0x40013c, 0x00000000);
263 return 0;
161} 264}
162 265
163void 266static int
164nv50_graph_fifo_access(struct drm_device *dev, bool enabled) 267nv50_graph_context_new(struct nouveau_channel *chan, int engine)
165{
166 const uint32_t mask = 0x00010001;
167
168 if (enabled)
169 nv_wr32(dev, 0x400500, nv_rd32(dev, 0x400500) | mask);
170 else
171 nv_wr32(dev, 0x400500, nv_rd32(dev, 0x400500) & ~mask);
172}
173
174struct nouveau_channel *
175nv50_graph_channel(struct drm_device *dev)
176{
177 struct drm_nouveau_private *dev_priv = dev->dev_private;
178 uint32_t inst;
179 int i;
180
181 /* Be sure we're not in the middle of a context switch or bad things
182 * will happen, such as unloading the wrong pgraph context.
183 */
184 if (!nv_wait(0x400300, 0x00000001, 0x00000000))
185 NV_ERROR(dev, "Ctxprog is still running\n");
186
187 inst = nv_rd32(dev, NV50_PGRAPH_CTXCTL_CUR);
188 if (!(inst & NV50_PGRAPH_CTXCTL_CUR_LOADED))
189 return NULL;
190 inst = (inst & NV50_PGRAPH_CTXCTL_CUR_INSTANCE) << 12;
191
192 for (i = 0; i < dev_priv->engine.fifo.channels; i++) {
193 struct nouveau_channel *chan = dev_priv->fifos[i];
194
195 if (chan && chan->ramin && chan->ramin->instance == inst)
196 return chan;
197 }
198
199 return NULL;
200}
201
202int
203nv50_graph_create_context(struct nouveau_channel *chan)
204{ 268{
205 struct drm_device *dev = chan->dev; 269 struct drm_device *dev = chan->dev;
206 struct drm_nouveau_private *dev_priv = dev->dev_private; 270 struct drm_nouveau_private *dev_priv = dev->dev_private;
207 struct nouveau_gpuobj *ramin = chan->ramin->gpuobj; 271 struct nouveau_gpuobj *ramin = chan->ramin;
208 struct nouveau_gpuobj *obj; 272 struct nouveau_gpuobj *grctx = NULL;
209 struct nouveau_pgraph_engine *pgraph = &dev_priv->engine.graph; 273 struct nv50_graph_engine *pgraph = nv_engine(dev, engine);
210 struct nouveau_grctx ctx = {}; 274 struct nouveau_grctx ctx = {};
211 int hdr, ret; 275 int hdr, ret;
212 276
213 NV_DEBUG(dev, "ch%d\n", chan->id); 277 NV_DEBUG(dev, "ch%d\n", chan->id);
214 278
215 ret = nouveau_gpuobj_new_ref(dev, chan, NULL, 0, pgraph->grctx_size, 279 ret = nouveau_gpuobj_new(dev, NULL, pgraph->grctx_size, 0,
216 0x1000, NVOBJ_FLAG_ZERO_ALLOC | 280 NVOBJ_FLAG_ZERO_ALLOC |
217 NVOBJ_FLAG_ZERO_FREE, &chan->ramin_grctx); 281 NVOBJ_FLAG_ZERO_FREE, &grctx);
218 if (ret) 282 if (ret)
219 return ret; 283 return ret;
220 obj = chan->ramin_grctx->gpuobj;
221 284
222 hdr = (dev_priv->chipset == 0x50) ? 0x200 : 0x20; 285 hdr = (dev_priv->chipset == 0x50) ? 0x200 : 0x20;
223 nv_wo32(dev, ramin, (hdr + 0x00)/4, 0x00190002); 286 nv_wo32(ramin, hdr + 0x00, 0x00190002);
224 nv_wo32(dev, ramin, (hdr + 0x04)/4, chan->ramin_grctx->instance + 287 nv_wo32(ramin, hdr + 0x04, grctx->vinst + grctx->size - 1);
225 pgraph->grctx_size - 1); 288 nv_wo32(ramin, hdr + 0x08, grctx->vinst);
226 nv_wo32(dev, ramin, (hdr + 0x08)/4, chan->ramin_grctx->instance); 289 nv_wo32(ramin, hdr + 0x0c, 0);
227 nv_wo32(dev, ramin, (hdr + 0x0c)/4, 0); 290 nv_wo32(ramin, hdr + 0x10, 0);
228 nv_wo32(dev, ramin, (hdr + 0x10)/4, 0); 291 nv_wo32(ramin, hdr + 0x14, 0x00010000);
229 nv_wo32(dev, ramin, (hdr + 0x14)/4, 0x00010000);
230 292
231 ctx.dev = chan->dev; 293 ctx.dev = chan->dev;
232 ctx.mode = NOUVEAU_GRCTX_VALS; 294 ctx.mode = NOUVEAU_GRCTX_VALS;
233 ctx.data = obj; 295 ctx.data = grctx;
234 nv50_grctx_init(&ctx); 296 nv50_grctx_init(&ctx);
235 297
236 nv_wo32(dev, obj, 0x00000/4, chan->ramin->instance >> 12); 298 nv_wo32(grctx, 0x00000, chan->ramin->vinst >> 12);
237 299
238 dev_priv->engine.instmem.flush(dev); 300 dev_priv->engine.instmem.flush(dev);
301
302 atomic_inc(&chan->vm->engref[NVOBJ_ENGINE_GR]);
303 chan->engctx[NVOBJ_ENGINE_GR] = grctx;
239 return 0; 304 return 0;
240} 305}
241 306
242void 307static void
243nv50_graph_destroy_context(struct nouveau_channel *chan) 308nv50_graph_context_del(struct nouveau_channel *chan, int engine)
244{ 309{
310 struct nouveau_gpuobj *grctx = chan->engctx[engine];
245 struct drm_device *dev = chan->dev; 311 struct drm_device *dev = chan->dev;
246 struct drm_nouveau_private *dev_priv = dev->dev_private; 312 struct drm_nouveau_private *dev_priv = dev->dev_private;
313 struct nouveau_fifo_engine *pfifo = &dev_priv->engine.fifo;
247 int i, hdr = (dev_priv->chipset == 0x50) ? 0x200 : 0x20; 314 int i, hdr = (dev_priv->chipset == 0x50) ? 0x200 : 0x20;
315 unsigned long flags;
248 316
249 NV_DEBUG(dev, "ch%d\n", chan->id); 317 NV_DEBUG(dev, "ch%d\n", chan->id);
250 318
251 if (!chan->ramin || !chan->ramin->gpuobj) 319 if (!chan->ramin)
252 return; 320 return;
253 321
254 for (i = hdr; i < hdr + 24; i += 4) 322 spin_lock_irqsave(&dev_priv->context_switch_lock, flags);
255 nv_wo32(dev, chan->ramin->gpuobj, i/4, 0); 323 pfifo->reassign(dev, false);
256 dev_priv->engine.instmem.flush(dev); 324 nv50_graph_fifo_access(dev, false);
257
258 nouveau_gpuobj_ref_del(dev, &chan->ramin_grctx);
259}
260
261static int
262nv50_graph_do_load_context(struct drm_device *dev, uint32_t inst)
263{
264 uint32_t fifo = nv_rd32(dev, 0x400500);
265 325
266 nv_wr32(dev, 0x400500, fifo & ~1); 326 if (nv50_graph_channel(dev) == chan)
267 nv_wr32(dev, 0x400784, inst); 327 nv50_graph_unload_context(dev);
268 nv_wr32(dev, 0x400824, nv_rd32(dev, 0x400824) | 0x40);
269 nv_wr32(dev, 0x400320, nv_rd32(dev, 0x400320) | 0x11);
270 nv_wr32(dev, 0x400040, 0xffffffff);
271 (void)nv_rd32(dev, 0x400040);
272 nv_wr32(dev, 0x400040, 0x00000000);
273 nv_wr32(dev, 0x400304, nv_rd32(dev, 0x400304) | 1);
274 328
275 if (nouveau_wait_for_idle(dev)) 329 for (i = hdr; i < hdr + 24; i += 4)
276 nv_wr32(dev, 0x40032c, inst | (1<<31)); 330 nv_wo32(chan->ramin, i, 0);
277 nv_wr32(dev, 0x400500, fifo); 331 dev_priv->engine.instmem.flush(dev);
278 332
279 return 0; 333 nv50_graph_fifo_access(dev, true);
280} 334 pfifo->reassign(dev, true);
335 spin_unlock_irqrestore(&dev_priv->context_switch_lock, flags);
281 336
282int 337 nouveau_gpuobj_ref(NULL, &grctx);
283nv50_graph_load_context(struct nouveau_channel *chan)
284{
285 uint32_t inst = chan->ramin->instance >> 12;
286 338
287 NV_DEBUG(chan->dev, "ch%d\n", chan->id); 339 atomic_dec(&chan->vm->engref[engine]);
288 return nv50_graph_do_load_context(chan->dev, inst); 340 chan->engctx[engine] = NULL;
289} 341}
290 342
291int 343static int
292nv50_graph_unload_context(struct drm_device *dev) 344nv50_graph_object_new(struct nouveau_channel *chan, int engine,
345 u32 handle, u16 class)
293{ 346{
294 uint32_t inst; 347 struct drm_device *dev = chan->dev;
348 struct drm_nouveau_private *dev_priv = dev->dev_private;
349 struct nouveau_gpuobj *obj = NULL;
350 int ret;
295 351
296 inst = nv_rd32(dev, NV50_PGRAPH_CTXCTL_CUR); 352 ret = nouveau_gpuobj_new(dev, chan, 16, 16, NVOBJ_FLAG_ZERO_FREE, &obj);
297 if (!(inst & NV50_PGRAPH_CTXCTL_CUR_LOADED)) 353 if (ret)
298 return 0; 354 return ret;
299 inst &= NV50_PGRAPH_CTXCTL_CUR_INSTANCE; 355 obj->engine = 1;
356 obj->class = class;
300 357
301 nouveau_wait_for_idle(dev); 358 nv_wo32(obj, 0x00, class);
302 nv_wr32(dev, 0x400784, inst); 359 nv_wo32(obj, 0x04, 0x00000000);
303 nv_wr32(dev, 0x400824, nv_rd32(dev, 0x400824) | 0x20); 360 nv_wo32(obj, 0x08, 0x00000000);
304 nv_wr32(dev, 0x400304, nv_rd32(dev, 0x400304) | 0x01); 361 nv_wo32(obj, 0x0c, 0x00000000);
305 nouveau_wait_for_idle(dev); 362 dev_priv->engine.instmem.flush(dev);
306 363
307 nv_wr32(dev, NV50_PGRAPH_CTXCTL_CUR, inst); 364 ret = nouveau_ramht_insert(chan, handle, obj);
308 return 0; 365 nouveau_gpuobj_ref(NULL, &obj);
366 return ret;
309} 367}
310 368
311void 369static void
312nv50_graph_context_switch(struct drm_device *dev) 370nv50_graph_context_switch(struct drm_device *dev)
313{ 371{
314 uint32_t inst; 372 uint32_t inst;
@@ -324,25 +382,26 @@ nv50_graph_context_switch(struct drm_device *dev)
324} 382}
325 383
326static int 384static int
327nv50_graph_nvsw_dma_vblsem(struct nouveau_channel *chan, int grclass, 385nv50_graph_nvsw_dma_vblsem(struct nouveau_channel *chan,
328 int mthd, uint32_t data) 386 u32 class, u32 mthd, u32 data)
329{ 387{
330 struct nouveau_gpuobj_ref *ref = NULL; 388 struct nouveau_gpuobj *gpuobj;
331 389
332 if (nouveau_gpuobj_ref_find(chan, data, &ref)) 390 gpuobj = nouveau_ramht_find(chan, data);
391 if (!gpuobj)
333 return -ENOENT; 392 return -ENOENT;
334 393
335 if (nouveau_notifier_offset(ref->gpuobj, NULL)) 394 if (nouveau_notifier_offset(gpuobj, NULL))
336 return -EINVAL; 395 return -EINVAL;
337 396
338 chan->nvsw.vblsem = ref->gpuobj; 397 chan->nvsw.vblsem = gpuobj;
339 chan->nvsw.vblsem_offset = ~0; 398 chan->nvsw.vblsem_offset = ~0;
340 return 0; 399 return 0;
341} 400}
342 401
343static int 402static int
344nv50_graph_nvsw_vblsem_offset(struct nouveau_channel *chan, int grclass, 403nv50_graph_nvsw_vblsem_offset(struct nouveau_channel *chan,
345 int mthd, uint32_t data) 404 u32 class, u32 mthd, u32 data)
346{ 405{
347 if (nouveau_notifier_offset(chan->nvsw.vblsem, &data)) 406 if (nouveau_notifier_offset(chan->nvsw.vblsem, &data))
348 return -ERANGE; 407 return -ERANGE;
@@ -352,16 +411,16 @@ nv50_graph_nvsw_vblsem_offset(struct nouveau_channel *chan, int grclass,
352} 411}
353 412
354static int 413static int
355nv50_graph_nvsw_vblsem_release_val(struct nouveau_channel *chan, int grclass, 414nv50_graph_nvsw_vblsem_release_val(struct nouveau_channel *chan,
356 int mthd, uint32_t data) 415 u32 class, u32 mthd, u32 data)
357{ 416{
358 chan->nvsw.vblsem_rval = data; 417 chan->nvsw.vblsem_rval = data;
359 return 0; 418 return 0;
360} 419}
361 420
362static int 421static int
363nv50_graph_nvsw_vblsem_release(struct nouveau_channel *chan, int grclass, 422nv50_graph_nvsw_vblsem_release(struct nouveau_channel *chan,
364 int mthd, uint32_t data) 423 u32 class, u32 mthd, u32 data)
365{ 424{
366 struct drm_device *dev = chan->dev; 425 struct drm_device *dev = chan->dev;
367 struct drm_nouveau_private *dev_priv = dev->dev_private; 426 struct drm_nouveau_private *dev_priv = dev->dev_private;
@@ -369,37 +428,694 @@ nv50_graph_nvsw_vblsem_release(struct nouveau_channel *chan, int grclass,
369 if (!chan->nvsw.vblsem || chan->nvsw.vblsem_offset == ~0 || data > 1) 428 if (!chan->nvsw.vblsem || chan->nvsw.vblsem_offset == ~0 || data > 1)
370 return -EINVAL; 429 return -EINVAL;
371 430
372 if (!(nv_rd32(dev, NV50_PDISPLAY_INTR_EN) & 431 drm_vblank_get(dev, data);
373 NV50_PDISPLAY_INTR_EN_VBLANK_CRTC_(data))) {
374 nv_wr32(dev, NV50_PDISPLAY_INTR_1,
375 NV50_PDISPLAY_INTR_1_VBLANK_CRTC_(data));
376 nv_wr32(dev, NV50_PDISPLAY_INTR_EN, nv_rd32(dev,
377 NV50_PDISPLAY_INTR_EN) |
378 NV50_PDISPLAY_INTR_EN_VBLANK_CRTC_(data));
379 }
380 432
433 chan->nvsw.vblsem_head = data;
381 list_add(&chan->nvsw.vbl_wait, &dev_priv->vbl_waiting); 434 list_add(&chan->nvsw.vbl_wait, &dev_priv->vbl_waiting);
435
382 return 0; 436 return 0;
383} 437}
384 438
385static struct nouveau_pgraph_object_method nv50_graph_nvsw_methods[] = { 439static int
386 { 0x018c, nv50_graph_nvsw_dma_vblsem }, 440nv50_graph_nvsw_mthd_page_flip(struct nouveau_channel *chan,
387 { 0x0400, nv50_graph_nvsw_vblsem_offset }, 441 u32 class, u32 mthd, u32 data)
388 { 0x0404, nv50_graph_nvsw_vblsem_release_val }, 442{
389 { 0x0408, nv50_graph_nvsw_vblsem_release }, 443 nouveau_finish_page_flip(chan, NULL);
444 return 0;
445}
446
447
448static void
449nv50_graph_tlb_flush(struct drm_device *dev, int engine)
450{
451 nv50_vm_flush_engine(dev, 0);
452}
453
454static void
455nv84_graph_tlb_flush(struct drm_device *dev, int engine)
456{
457 struct drm_nouveau_private *dev_priv = dev->dev_private;
458 struct nouveau_timer_engine *ptimer = &dev_priv->engine.timer;
459 bool idle, timeout = false;
460 unsigned long flags;
461 u64 start;
462 u32 tmp;
463
464 spin_lock_irqsave(&dev_priv->context_switch_lock, flags);
465 nv_mask(dev, 0x400500, 0x00000001, 0x00000000);
466
467 start = ptimer->read(dev);
468 do {
469 idle = true;
470
471 for (tmp = nv_rd32(dev, 0x400380); tmp && idle; tmp >>= 3) {
472 if ((tmp & 7) == 1)
473 idle = false;
474 }
475
476 for (tmp = nv_rd32(dev, 0x400384); tmp && idle; tmp >>= 3) {
477 if ((tmp & 7) == 1)
478 idle = false;
479 }
480
481 for (tmp = nv_rd32(dev, 0x400388); tmp && idle; tmp >>= 3) {
482 if ((tmp & 7) == 1)
483 idle = false;
484 }
485 } while (!idle && !(timeout = ptimer->read(dev) - start > 2000000000));
486
487 if (timeout) {
488 NV_ERROR(dev, "PGRAPH TLB flush idle timeout fail: "
489 "0x%08x 0x%08x 0x%08x 0x%08x\n",
490 nv_rd32(dev, 0x400700), nv_rd32(dev, 0x400380),
491 nv_rd32(dev, 0x400384), nv_rd32(dev, 0x400388));
492 }
493
494 nv50_vm_flush_engine(dev, 0);
495
496 nv_mask(dev, 0x400500, 0x00000001, 0x00000001);
497 spin_unlock_irqrestore(&dev_priv->context_switch_lock, flags);
498}
499
500static struct nouveau_enum nv50_mp_exec_error_names[] = {
501 { 3, "STACK_UNDERFLOW", NULL },
502 { 4, "QUADON_ACTIVE", NULL },
503 { 8, "TIMEOUT", NULL },
504 { 0x10, "INVALID_OPCODE", NULL },
505 { 0x40, "BREAKPOINT", NULL },
506 {}
507};
508
509static struct nouveau_bitfield nv50_graph_trap_m2mf[] = {
510 { 0x00000001, "NOTIFY" },
511 { 0x00000002, "IN" },
512 { 0x00000004, "OUT" },
513 {}
514};
515
516static struct nouveau_bitfield nv50_graph_trap_vfetch[] = {
517 { 0x00000001, "FAULT" },
518 {}
519};
520
521static struct nouveau_bitfield nv50_graph_trap_strmout[] = {
522 { 0x00000001, "FAULT" },
523 {}
524};
525
526static struct nouveau_bitfield nv50_graph_trap_ccache[] = {
527 { 0x00000001, "FAULT" },
528 {}
529};
530
531/* There must be a *lot* of these. Will take some time to gather them up. */
532struct nouveau_enum nv50_data_error_names[] = {
533 { 0x00000003, "INVALID_QUERY_OR_TEXTURE", NULL },
534 { 0x00000004, "INVALID_VALUE", NULL },
535 { 0x00000005, "INVALID_ENUM", NULL },
536 { 0x00000008, "INVALID_OBJECT", NULL },
537 { 0x00000009, "READ_ONLY_OBJECT", NULL },
538 { 0x0000000a, "SUPERVISOR_OBJECT", NULL },
539 { 0x0000000b, "INVALID_ADDRESS_ALIGNMENT", NULL },
540 { 0x0000000c, "INVALID_BITFIELD", NULL },
541 { 0x0000000d, "BEGIN_END_ACTIVE", NULL },
542 { 0x0000000e, "SEMANTIC_COLOR_BACK_OVER_LIMIT", NULL },
543 { 0x0000000f, "VIEWPORT_ID_NEEDS_GP", NULL },
544 { 0x00000010, "RT_DOUBLE_BIND", NULL },
545 { 0x00000011, "RT_TYPES_MISMATCH", NULL },
546 { 0x00000012, "RT_LINEAR_WITH_ZETA", NULL },
547 { 0x00000015, "FP_TOO_FEW_REGS", NULL },
548 { 0x00000016, "ZETA_FORMAT_CSAA_MISMATCH", NULL },
549 { 0x00000017, "RT_LINEAR_WITH_MSAA", NULL },
550 { 0x00000018, "FP_INTERPOLANT_START_OVER_LIMIT", NULL },
551 { 0x00000019, "SEMANTIC_LAYER_OVER_LIMIT", NULL },
552 { 0x0000001a, "RT_INVALID_ALIGNMENT", NULL },
553 { 0x0000001b, "SAMPLER_OVER_LIMIT", NULL },
554 { 0x0000001c, "TEXTURE_OVER_LIMIT", NULL },
555 { 0x0000001e, "GP_TOO_MANY_OUTPUTS", NULL },
556 { 0x0000001f, "RT_BPP128_WITH_MS8", NULL },
557 { 0x00000021, "Z_OUT_OF_BOUNDS", NULL },
558 { 0x00000023, "XY_OUT_OF_BOUNDS", NULL },
559 { 0x00000027, "CP_MORE_PARAMS_THAN_SHARED", NULL },
560 { 0x00000028, "CP_NO_REG_SPACE_STRIPED", NULL },
561 { 0x00000029, "CP_NO_REG_SPACE_PACKED", NULL },
562 { 0x0000002a, "CP_NOT_ENOUGH_WARPS", NULL },
563 { 0x0000002b, "CP_BLOCK_SIZE_MISMATCH", NULL },
564 { 0x0000002c, "CP_NOT_ENOUGH_LOCAL_WARPS", NULL },
565 { 0x0000002d, "CP_NOT_ENOUGH_STACK_WARPS", NULL },
566 { 0x0000002e, "CP_NO_BLOCKDIM_LATCH", NULL },
567 { 0x00000031, "ENG2D_FORMAT_MISMATCH", NULL },
568 { 0x0000003f, "PRIMITIVE_ID_NEEDS_GP", NULL },
569 { 0x00000044, "SEMANTIC_VIEWPORT_OVER_LIMIT", NULL },
570 { 0x00000045, "SEMANTIC_COLOR_FRONT_OVER_LIMIT", NULL },
571 { 0x00000046, "LAYER_ID_NEEDS_GP", NULL },
572 { 0x00000047, "SEMANTIC_CLIP_OVER_LIMIT", NULL },
573 { 0x00000048, "SEMANTIC_PTSZ_OVER_LIMIT", NULL },
390 {} 574 {}
391}; 575};
392 576
393struct nouveau_pgraph_object_class nv50_graph_grclass[] = { 577static struct nouveau_bitfield nv50_graph_intr[] = {
394 { 0x506e, true, nv50_graph_nvsw_methods }, /* nvsw */ 578 { 0x00000001, "NOTIFY" },
395 { 0x0030, false, NULL }, /* null */ 579 { 0x00000002, "COMPUTE_QUERY" },
396 { 0x5039, false, NULL }, /* m2mf */ 580 { 0x00000010, "ILLEGAL_MTHD" },
397 { 0x502d, false, NULL }, /* 2d */ 581 { 0x00000020, "ILLEGAL_CLASS" },
398 { 0x50c0, false, NULL }, /* compute */ 582 { 0x00000040, "DOUBLE_NOTIFY" },
399 { 0x85c0, false, NULL }, /* compute (nva3, nva5, nva8) */ 583 { 0x00001000, "CONTEXT_SWITCH" },
400 { 0x5097, false, NULL }, /* tesla (nv50) */ 584 { 0x00010000, "BUFFER_NOTIFY" },
401 { 0x8297, false, NULL }, /* tesla (nv8x/nv9x) */ 585 { 0x00100000, "DATA_ERROR" },
402 { 0x8397, false, NULL }, /* tesla (nva0, nvaa, nvac) */ 586 { 0x00200000, "TRAP" },
403 { 0x8597, false, NULL }, /* tesla (nva3, nva5, nva8) */ 587 { 0x01000000, "SINGLE_STEP" },
404 {} 588 {}
405}; 589};
590
591static void
592nv50_pgraph_mp_trap(struct drm_device *dev, int tpid, int display)
593{
594 struct drm_nouveau_private *dev_priv = dev->dev_private;
595 uint32_t units = nv_rd32(dev, 0x1540);
596 uint32_t addr, mp10, status, pc, oplow, ophigh;
597 int i;
598 int mps = 0;
599 for (i = 0; i < 4; i++) {
600 if (!(units & 1 << (i+24)))
601 continue;
602 if (dev_priv->chipset < 0xa0)
603 addr = 0x408200 + (tpid << 12) + (i << 7);
604 else
605 addr = 0x408100 + (tpid << 11) + (i << 7);
606 mp10 = nv_rd32(dev, addr + 0x10);
607 status = nv_rd32(dev, addr + 0x14);
608 if (!status)
609 continue;
610 if (display) {
611 nv_rd32(dev, addr + 0x20);
612 pc = nv_rd32(dev, addr + 0x24);
613 oplow = nv_rd32(dev, addr + 0x70);
614 ophigh = nv_rd32(dev, addr + 0x74);
615 NV_INFO(dev, "PGRAPH_TRAP_MP_EXEC - "
616 "TP %d MP %d: ", tpid, i);
617 nouveau_enum_print(nv50_mp_exec_error_names, status);
618 printk(" at %06x warp %d, opcode %08x %08x\n",
619 pc&0xffffff, pc >> 24,
620 oplow, ophigh);
621 }
622 nv_wr32(dev, addr + 0x10, mp10);
623 nv_wr32(dev, addr + 0x14, 0);
624 mps++;
625 }
626 if (!mps && display)
627 NV_INFO(dev, "PGRAPH_TRAP_MP_EXEC - TP %d: "
628 "No MPs claiming errors?\n", tpid);
629}
630
631static void
632nv50_pgraph_tp_trap(struct drm_device *dev, int type, uint32_t ustatus_old,
633 uint32_t ustatus_new, int display, const char *name)
634{
635 struct drm_nouveau_private *dev_priv = dev->dev_private;
636 int tps = 0;
637 uint32_t units = nv_rd32(dev, 0x1540);
638 int i, r;
639 uint32_t ustatus_addr, ustatus;
640 for (i = 0; i < 16; i++) {
641 if (!(units & (1 << i)))
642 continue;
643 if (dev_priv->chipset < 0xa0)
644 ustatus_addr = ustatus_old + (i << 12);
645 else
646 ustatus_addr = ustatus_new + (i << 11);
647 ustatus = nv_rd32(dev, ustatus_addr) & 0x7fffffff;
648 if (!ustatus)
649 continue;
650 tps++;
651 switch (type) {
652 case 6: /* texture error... unknown for now */
653 if (display) {
654 NV_ERROR(dev, "magic set %d:\n", i);
655 for (r = ustatus_addr + 4; r <= ustatus_addr + 0x10; r += 4)
656 NV_ERROR(dev, "\t0x%08x: 0x%08x\n", r,
657 nv_rd32(dev, r));
658 }
659 break;
660 case 7: /* MP error */
661 if (ustatus & 0x00010000) {
662 nv50_pgraph_mp_trap(dev, i, display);
663 ustatus &= ~0x00010000;
664 }
665 break;
666 case 8: /* TPDMA error */
667 {
668 uint32_t e0c = nv_rd32(dev, ustatus_addr + 4);
669 uint32_t e10 = nv_rd32(dev, ustatus_addr + 8);
670 uint32_t e14 = nv_rd32(dev, ustatus_addr + 0xc);
671 uint32_t e18 = nv_rd32(dev, ustatus_addr + 0x10);
672 uint32_t e1c = nv_rd32(dev, ustatus_addr + 0x14);
673 uint32_t e20 = nv_rd32(dev, ustatus_addr + 0x18);
674 uint32_t e24 = nv_rd32(dev, ustatus_addr + 0x1c);
675 /* 2d engine destination */
676 if (ustatus & 0x00000010) {
677 if (display) {
678 NV_INFO(dev, "PGRAPH_TRAP_TPDMA_2D - TP %d - Unknown fault at address %02x%08x\n",
679 i, e14, e10);
680 NV_INFO(dev, "PGRAPH_TRAP_TPDMA_2D - TP %d - e0c: %08x, e18: %08x, e1c: %08x, e20: %08x, e24: %08x\n",
681 i, e0c, e18, e1c, e20, e24);
682 }
683 ustatus &= ~0x00000010;
684 }
685 /* Render target */
686 if (ustatus & 0x00000040) {
687 if (display) {
688 NV_INFO(dev, "PGRAPH_TRAP_TPDMA_RT - TP %d - Unknown fault at address %02x%08x\n",
689 i, e14, e10);
690 NV_INFO(dev, "PGRAPH_TRAP_TPDMA_RT - TP %d - e0c: %08x, e18: %08x, e1c: %08x, e20: %08x, e24: %08x\n",
691 i, e0c, e18, e1c, e20, e24);
692 }
693 ustatus &= ~0x00000040;
694 }
695 /* CUDA memory: l[], g[] or stack. */
696 if (ustatus & 0x00000080) {
697 if (display) {
698 if (e18 & 0x80000000) {
699 /* g[] read fault? */
700 NV_INFO(dev, "PGRAPH_TRAP_TPDMA - TP %d - Global read fault at address %02x%08x\n",
701 i, e14, e10 | ((e18 >> 24) & 0x1f));
702 e18 &= ~0x1f000000;
703 } else if (e18 & 0xc) {
704 /* g[] write fault? */
705 NV_INFO(dev, "PGRAPH_TRAP_TPDMA - TP %d - Global write fault at address %02x%08x\n",
706 i, e14, e10 | ((e18 >> 7) & 0x1f));
707 e18 &= ~0x00000f80;
708 } else {
709 NV_INFO(dev, "PGRAPH_TRAP_TPDMA - TP %d - Unknown CUDA fault at address %02x%08x\n",
710 i, e14, e10);
711 }
712 NV_INFO(dev, "PGRAPH_TRAP_TPDMA - TP %d - e0c: %08x, e18: %08x, e1c: %08x, e20: %08x, e24: %08x\n",
713 i, e0c, e18, e1c, e20, e24);
714 }
715 ustatus &= ~0x00000080;
716 }
717 }
718 break;
719 }
720 if (ustatus) {
721 if (display)
722 NV_INFO(dev, "%s - TP%d: Unhandled ustatus 0x%08x\n", name, i, ustatus);
723 }
724 nv_wr32(dev, ustatus_addr, 0xc0000000);
725 }
726
727 if (!tps && display)
728 NV_INFO(dev, "%s - No TPs claiming errors?\n", name);
729}
730
731static int
732nv50_pgraph_trap_handler(struct drm_device *dev, u32 display, u64 inst, u32 chid)
733{
734 u32 status = nv_rd32(dev, 0x400108);
735 u32 ustatus;
736
737 if (!status && display) {
738 NV_INFO(dev, "PGRAPH - TRAP: no units reporting traps?\n");
739 return 1;
740 }
741
742 /* DISPATCH: Relays commands to other units and handles NOTIFY,
743 * COND, QUERY. If you get a trap from it, the command is still stuck
744 * in DISPATCH and you need to do something about it. */
745 if (status & 0x001) {
746 ustatus = nv_rd32(dev, 0x400804) & 0x7fffffff;
747 if (!ustatus && display) {
748 NV_INFO(dev, "PGRAPH_TRAP_DISPATCH - no ustatus?\n");
749 }
750
751 nv_wr32(dev, 0x400500, 0x00000000);
752
753 /* Known to be triggered by screwed up NOTIFY and COND... */
754 if (ustatus & 0x00000001) {
755 u32 addr = nv_rd32(dev, 0x400808);
756 u32 subc = (addr & 0x00070000) >> 16;
757 u32 mthd = (addr & 0x00001ffc);
758 u32 datal = nv_rd32(dev, 0x40080c);
759 u32 datah = nv_rd32(dev, 0x400810);
760 u32 class = nv_rd32(dev, 0x400814);
761 u32 r848 = nv_rd32(dev, 0x400848);
762
763 NV_INFO(dev, "PGRAPH - TRAP DISPATCH_FAULT\n");
764 if (display && (addr & 0x80000000)) {
765 NV_INFO(dev, "PGRAPH - ch %d (0x%010llx) "
766 "subc %d class 0x%04x mthd 0x%04x "
767 "data 0x%08x%08x "
768 "400808 0x%08x 400848 0x%08x\n",
769 chid, inst, subc, class, mthd, datah,
770 datal, addr, r848);
771 } else
772 if (display) {
773 NV_INFO(dev, "PGRAPH - no stuck command?\n");
774 }
775
776 nv_wr32(dev, 0x400808, 0);
777 nv_wr32(dev, 0x4008e8, nv_rd32(dev, 0x4008e8) & 3);
778 nv_wr32(dev, 0x400848, 0);
779 ustatus &= ~0x00000001;
780 }
781
782 if (ustatus & 0x00000002) {
783 u32 addr = nv_rd32(dev, 0x40084c);
784 u32 subc = (addr & 0x00070000) >> 16;
785 u32 mthd = (addr & 0x00001ffc);
786 u32 data = nv_rd32(dev, 0x40085c);
787 u32 class = nv_rd32(dev, 0x400814);
788
789 NV_INFO(dev, "PGRAPH - TRAP DISPATCH_QUERY\n");
790 if (display && (addr & 0x80000000)) {
791 NV_INFO(dev, "PGRAPH - ch %d (0x%010llx) "
792 "subc %d class 0x%04x mthd 0x%04x "
793 "data 0x%08x 40084c 0x%08x\n",
794 chid, inst, subc, class, mthd,
795 data, addr);
796 } else
797 if (display) {
798 NV_INFO(dev, "PGRAPH - no stuck command?\n");
799 }
800
801 nv_wr32(dev, 0x40084c, 0);
802 ustatus &= ~0x00000002;
803 }
804
805 if (ustatus && display) {
806 NV_INFO(dev, "PGRAPH - TRAP_DISPATCH (unknown "
807 "0x%08x)\n", ustatus);
808 }
809
810 nv_wr32(dev, 0x400804, 0xc0000000);
811 nv_wr32(dev, 0x400108, 0x001);
812 status &= ~0x001;
813 if (!status)
814 return 0;
815 }
816
817 /* M2MF: Memory to memory copy engine. */
818 if (status & 0x002) {
819 u32 ustatus = nv_rd32(dev, 0x406800) & 0x7fffffff;
820 if (display) {
821 NV_INFO(dev, "PGRAPH - TRAP_M2MF");
822 nouveau_bitfield_print(nv50_graph_trap_m2mf, ustatus);
823 printk("\n");
824 NV_INFO(dev, "PGRAPH - TRAP_M2MF %08x %08x %08x %08x\n",
825 nv_rd32(dev, 0x406804), nv_rd32(dev, 0x406808),
826 nv_rd32(dev, 0x40680c), nv_rd32(dev, 0x406810));
827
828 }
829
830 /* No sane way found yet -- just reset the bugger. */
831 nv_wr32(dev, 0x400040, 2);
832 nv_wr32(dev, 0x400040, 0);
833 nv_wr32(dev, 0x406800, 0xc0000000);
834 nv_wr32(dev, 0x400108, 0x002);
835 status &= ~0x002;
836 }
837
838 /* VFETCH: Fetches data from vertex buffers. */
839 if (status & 0x004) {
840 u32 ustatus = nv_rd32(dev, 0x400c04) & 0x7fffffff;
841 if (display) {
842 NV_INFO(dev, "PGRAPH - TRAP_VFETCH");
843 nouveau_bitfield_print(nv50_graph_trap_vfetch, ustatus);
844 printk("\n");
845 NV_INFO(dev, "PGRAPH - TRAP_VFETCH %08x %08x %08x %08x\n",
846 nv_rd32(dev, 0x400c00), nv_rd32(dev, 0x400c08),
847 nv_rd32(dev, 0x400c0c), nv_rd32(dev, 0x400c10));
848 }
849
850 nv_wr32(dev, 0x400c04, 0xc0000000);
851 nv_wr32(dev, 0x400108, 0x004);
852 status &= ~0x004;
853 }
854
855 /* STRMOUT: DirectX streamout / OpenGL transform feedback. */
856 if (status & 0x008) {
857 ustatus = nv_rd32(dev, 0x401800) & 0x7fffffff;
858 if (display) {
859 NV_INFO(dev, "PGRAPH - TRAP_STRMOUT");
860 nouveau_bitfield_print(nv50_graph_trap_strmout, ustatus);
861 printk("\n");
862 NV_INFO(dev, "PGRAPH - TRAP_STRMOUT %08x %08x %08x %08x\n",
863 nv_rd32(dev, 0x401804), nv_rd32(dev, 0x401808),
864 nv_rd32(dev, 0x40180c), nv_rd32(dev, 0x401810));
865
866 }
867
868 /* No sane way found yet -- just reset the bugger. */
869 nv_wr32(dev, 0x400040, 0x80);
870 nv_wr32(dev, 0x400040, 0);
871 nv_wr32(dev, 0x401800, 0xc0000000);
872 nv_wr32(dev, 0x400108, 0x008);
873 status &= ~0x008;
874 }
875
876 /* CCACHE: Handles code and c[] caches and fills them. */
877 if (status & 0x010) {
878 ustatus = nv_rd32(dev, 0x405018) & 0x7fffffff;
879 if (display) {
880 NV_INFO(dev, "PGRAPH - TRAP_CCACHE");
881 nouveau_bitfield_print(nv50_graph_trap_ccache, ustatus);
882 printk("\n");
883 NV_INFO(dev, "PGRAPH - TRAP_CCACHE %08x %08x %08x %08x"
884 " %08x %08x %08x\n",
885 nv_rd32(dev, 0x405000), nv_rd32(dev, 0x405004),
886 nv_rd32(dev, 0x405008), nv_rd32(dev, 0x40500c),
887 nv_rd32(dev, 0x405010), nv_rd32(dev, 0x405014),
888 nv_rd32(dev, 0x40501c));
889
890 }
891
892 nv_wr32(dev, 0x405018, 0xc0000000);
893 nv_wr32(dev, 0x400108, 0x010);
894 status &= ~0x010;
895 }
896
897 /* Unknown, not seen yet... 0x402000 is the only trap status reg
898 * remaining, so try to handle it anyway. Perhaps related to that
899 * unknown DMA slot on tesla? */
900 if (status & 0x20) {
901 ustatus = nv_rd32(dev, 0x402000) & 0x7fffffff;
902 if (display)
903 NV_INFO(dev, "PGRAPH - TRAP_UNKC04 0x%08x\n", ustatus);
904 nv_wr32(dev, 0x402000, 0xc0000000);
905 /* no status modifiction on purpose */
906 }
907
908 /* TEXTURE: CUDA texturing units */
909 if (status & 0x040) {
910 nv50_pgraph_tp_trap(dev, 6, 0x408900, 0x408600, display,
911 "PGRAPH - TRAP_TEXTURE");
912 nv_wr32(dev, 0x400108, 0x040);
913 status &= ~0x040;
914 }
915
916 /* MP: CUDA execution engines. */
917 if (status & 0x080) {
918 nv50_pgraph_tp_trap(dev, 7, 0x408314, 0x40831c, display,
919 "PGRAPH - TRAP_MP");
920 nv_wr32(dev, 0x400108, 0x080);
921 status &= ~0x080;
922 }
923
924 /* TPDMA: Handles TP-initiated uncached memory accesses:
925 * l[], g[], stack, 2d surfaces, render targets. */
926 if (status & 0x100) {
927 nv50_pgraph_tp_trap(dev, 8, 0x408e08, 0x408708, display,
928 "PGRAPH - TRAP_TPDMA");
929 nv_wr32(dev, 0x400108, 0x100);
930 status &= ~0x100;
931 }
932
933 if (status) {
934 if (display)
935 NV_INFO(dev, "PGRAPH - TRAP: unknown 0x%08x\n", status);
936 nv_wr32(dev, 0x400108, status);
937 }
938
939 return 1;
940}
941
942int
943nv50_graph_isr_chid(struct drm_device *dev, u64 inst)
944{
945 struct drm_nouveau_private *dev_priv = dev->dev_private;
946 struct nouveau_channel *chan;
947 unsigned long flags;
948 int i;
949
950 spin_lock_irqsave(&dev_priv->channels.lock, flags);
951 for (i = 0; i < dev_priv->engine.fifo.channels; i++) {
952 chan = dev_priv->channels.ptr[i];
953 if (!chan || !chan->ramin)
954 continue;
955
956 if (inst == chan->ramin->vinst)
957 break;
958 }
959 spin_unlock_irqrestore(&dev_priv->channels.lock, flags);
960 return i;
961}
962
963static void
964nv50_graph_isr(struct drm_device *dev)
965{
966 u32 stat;
967
968 while ((stat = nv_rd32(dev, 0x400100))) {
969 u64 inst = (u64)(nv_rd32(dev, 0x40032c) & 0x0fffffff) << 12;
970 u32 chid = nv50_graph_isr_chid(dev, inst);
971 u32 addr = nv_rd32(dev, NV04_PGRAPH_TRAPPED_ADDR);
972 u32 subc = (addr & 0x00070000) >> 16;
973 u32 mthd = (addr & 0x00001ffc);
974 u32 data = nv_rd32(dev, NV04_PGRAPH_TRAPPED_DATA);
975 u32 class = nv_rd32(dev, 0x400814);
976 u32 show = stat;
977
978 if (stat & 0x00000010) {
979 if (!nouveau_gpuobj_mthd_call2(dev, chid, class,
980 mthd, data))
981 show &= ~0x00000010;
982 }
983
984 if (stat & 0x00001000) {
985 nv_wr32(dev, 0x400500, 0x00000000);
986 nv_wr32(dev, 0x400100, 0x00001000);
987 nv_mask(dev, 0x40013c, 0x00001000, 0x00000000);
988 nv50_graph_context_switch(dev);
989 stat &= ~0x00001000;
990 show &= ~0x00001000;
991 }
992
993 show = (show && nouveau_ratelimit()) ? show : 0;
994
995 if (show & 0x00100000) {
996 u32 ecode = nv_rd32(dev, 0x400110);
997 NV_INFO(dev, "PGRAPH - DATA_ERROR ");
998 nouveau_enum_print(nv50_data_error_names, ecode);
999 printk("\n");
1000 }
1001
1002 if (stat & 0x00200000) {
1003 if (!nv50_pgraph_trap_handler(dev, show, inst, chid))
1004 show &= ~0x00200000;
1005 }
1006
1007 nv_wr32(dev, 0x400100, stat);
1008 nv_wr32(dev, 0x400500, 0x00010001);
1009
1010 if (show) {
1011 NV_INFO(dev, "PGRAPH -");
1012 nouveau_bitfield_print(nv50_graph_intr, show);
1013 printk("\n");
1014 NV_INFO(dev, "PGRAPH - ch %d (0x%010llx) subc %d "
1015 "class 0x%04x mthd 0x%04x data 0x%08x\n",
1016 chid, inst, subc, class, mthd, data);
1017 nv50_fb_vm_trap(dev, 1);
1018 }
1019 }
1020
1021 if (nv_rd32(dev, 0x400824) & (1 << 31))
1022 nv_wr32(dev, 0x400824, nv_rd32(dev, 0x400824) & ~(1 << 31));
1023}
1024
1025static void
1026nv50_graph_destroy(struct drm_device *dev, int engine)
1027{
1028 struct nv50_graph_engine *pgraph = nv_engine(dev, engine);
1029
1030 NVOBJ_ENGINE_DEL(dev, GR);
1031
1032 nouveau_irq_unregister(dev, 12);
1033 kfree(pgraph);
1034}
1035
1036int
1037nv50_graph_create(struct drm_device *dev)
1038{
1039 struct drm_nouveau_private *dev_priv = dev->dev_private;
1040 struct nv50_graph_engine *pgraph;
1041 struct nouveau_grctx ctx = {};
1042 int ret;
1043
1044 pgraph = kzalloc(sizeof(*pgraph),GFP_KERNEL);
1045 if (!pgraph)
1046 return -ENOMEM;
1047
1048 ctx.dev = dev;
1049 ctx.mode = NOUVEAU_GRCTX_PROG;
1050 ctx.data = pgraph->ctxprog;
1051 ctx.ctxprog_max = ARRAY_SIZE(pgraph->ctxprog);
1052
1053 ret = nv50_grctx_init(&ctx);
1054 if (ret) {
1055 NV_ERROR(dev, "PGRAPH: ctxprog build failed\n");
1056 kfree(pgraph);
1057 return 0;
1058 }
1059
1060 pgraph->grctx_size = ctx.ctxvals_pos * 4;
1061 pgraph->ctxprog_size = ctx.ctxprog_len;
1062
1063 pgraph->base.destroy = nv50_graph_destroy;
1064 pgraph->base.init = nv50_graph_init;
1065 pgraph->base.fini = nv50_graph_fini;
1066 pgraph->base.context_new = nv50_graph_context_new;
1067 pgraph->base.context_del = nv50_graph_context_del;
1068 pgraph->base.object_new = nv50_graph_object_new;
1069 if (dev_priv->chipset == 0x50 || dev_priv->chipset == 0xac)
1070 pgraph->base.tlb_flush = nv50_graph_tlb_flush;
1071 else
1072 pgraph->base.tlb_flush = nv84_graph_tlb_flush;
1073
1074 nouveau_irq_register(dev, 12, nv50_graph_isr);
1075
1076 /* NVSW really doesn't live here... */
1077 NVOBJ_CLASS(dev, 0x506e, SW); /* nvsw */
1078 NVOBJ_MTHD (dev, 0x506e, 0x018c, nv50_graph_nvsw_dma_vblsem);
1079 NVOBJ_MTHD (dev, 0x506e, 0x0400, nv50_graph_nvsw_vblsem_offset);
1080 NVOBJ_MTHD (dev, 0x506e, 0x0404, nv50_graph_nvsw_vblsem_release_val);
1081 NVOBJ_MTHD (dev, 0x506e, 0x0408, nv50_graph_nvsw_vblsem_release);
1082 NVOBJ_MTHD (dev, 0x506e, 0x0500, nv50_graph_nvsw_mthd_page_flip);
1083
1084 NVOBJ_ENGINE_ADD(dev, GR, &pgraph->base);
1085 NVOBJ_CLASS(dev, 0x0030, GR); /* null */
1086 NVOBJ_CLASS(dev, 0x5039, GR); /* m2mf */
1087 NVOBJ_CLASS(dev, 0x502d, GR); /* 2d */
1088
1089 /* tesla */
1090 if (dev_priv->chipset == 0x50)
1091 NVOBJ_CLASS(dev, 0x5097, GR); /* tesla (nv50) */
1092 else
1093 if (dev_priv->chipset < 0xa0)
1094 NVOBJ_CLASS(dev, 0x8297, GR); /* tesla (nv8x/nv9x) */
1095 else {
1096 switch (dev_priv->chipset) {
1097 case 0xa0:
1098 case 0xaa:
1099 case 0xac:
1100 NVOBJ_CLASS(dev, 0x8397, GR);
1101 break;
1102 case 0xa3:
1103 case 0xa5:
1104 case 0xa8:
1105 NVOBJ_CLASS(dev, 0x8597, GR);
1106 break;
1107 case 0xaf:
1108 NVOBJ_CLASS(dev, 0x8697, GR);
1109 break;
1110 }
1111 }
1112
1113 /* compute */
1114 NVOBJ_CLASS(dev, 0x50c0, GR);
1115 if (dev_priv->chipset > 0xa0 &&
1116 dev_priv->chipset != 0xaa &&
1117 dev_priv->chipset != 0xac)
1118 NVOBJ_CLASS(dev, 0x85c0, GR);
1119
1120 return 0;
1121}
diff --git a/drivers/gpu/drm/nouveau/nv50_grctx.c b/drivers/gpu/drm/nouveau/nv50_grctx.c
index 42a8fb20c1e6..de9abff12b90 100644
--- a/drivers/gpu/drm/nouveau/nv50_grctx.c
+++ b/drivers/gpu/drm/nouveau/nv50_grctx.c
@@ -103,6 +103,9 @@
103#include "nouveau_drv.h" 103#include "nouveau_drv.h"
104#include "nouveau_grctx.h" 104#include "nouveau_grctx.h"
105 105
106#define IS_NVA3F(x) (((x) > 0xa0 && (x) < 0xaa) || (x) == 0xaf)
107#define IS_NVAAF(x) ((x) >= 0xaa && (x) <= 0xac)
108
106/* 109/*
107 * This code deals with PGRAPH contexts on NV50 family cards. Like NV40, it's 110 * This code deals with PGRAPH contexts on NV50 family cards. Like NV40, it's
108 * the GPU itself that does context-switching, but it needs a special 111 * the GPU itself that does context-switching, but it needs a special
@@ -182,6 +185,7 @@ nv50_grctx_init(struct nouveau_grctx *ctx)
182 case 0xa8: 185 case 0xa8:
183 case 0xaa: 186 case 0xaa:
184 case 0xac: 187 case 0xac:
188 case 0xaf:
185 break; 189 break;
186 default: 190 default:
187 NV_ERROR(ctx->dev, "I don't know how to make a ctxprog for " 191 NV_ERROR(ctx->dev, "I don't know how to make a ctxprog for "
@@ -268,6 +272,9 @@ nv50_grctx_init(struct nouveau_grctx *ctx)
268 */ 272 */
269 273
270static void 274static void
275nv50_graph_construct_mmio_ddata(struct nouveau_grctx *ctx);
276
277static void
271nv50_graph_construct_mmio(struct nouveau_grctx *ctx) 278nv50_graph_construct_mmio(struct nouveau_grctx *ctx)
272{ 279{
273 struct drm_nouveau_private *dev_priv = ctx->dev->dev_private; 280 struct drm_nouveau_private *dev_priv = ctx->dev->dev_private;
@@ -286,7 +293,7 @@ nv50_graph_construct_mmio(struct nouveau_grctx *ctx)
286 gr_def(ctx, 0x400840, 0xffe806a8); 293 gr_def(ctx, 0x400840, 0xffe806a8);
287 } 294 }
288 gr_def(ctx, 0x400844, 0x00000002); 295 gr_def(ctx, 0x400844, 0x00000002);
289 if (dev_priv->chipset > 0xa0 && dev_priv->chipset < 0xaa) 296 if (IS_NVA3F(dev_priv->chipset))
290 gr_def(ctx, 0x400894, 0x00001000); 297 gr_def(ctx, 0x400894, 0x00001000);
291 gr_def(ctx, 0x4008e8, 0x00000003); 298 gr_def(ctx, 0x4008e8, 0x00000003);
292 gr_def(ctx, 0x4008ec, 0x00001000); 299 gr_def(ctx, 0x4008ec, 0x00001000);
@@ -299,13 +306,15 @@ nv50_graph_construct_mmio(struct nouveau_grctx *ctx)
299 306
300 if (dev_priv->chipset >= 0xa0) 307 if (dev_priv->chipset >= 0xa0)
301 cp_ctx(ctx, 0x400b00, 0x1); 308 cp_ctx(ctx, 0x400b00, 0x1);
302 if (dev_priv->chipset > 0xa0 && dev_priv->chipset < 0xaa) { 309 if (IS_NVA3F(dev_priv->chipset)) {
303 cp_ctx(ctx, 0x400b10, 0x1); 310 cp_ctx(ctx, 0x400b10, 0x1);
304 gr_def(ctx, 0x400b10, 0x0001629d); 311 gr_def(ctx, 0x400b10, 0x0001629d);
305 cp_ctx(ctx, 0x400b20, 0x1); 312 cp_ctx(ctx, 0x400b20, 0x1);
306 gr_def(ctx, 0x400b20, 0x0001629d); 313 gr_def(ctx, 0x400b20, 0x0001629d);
307 } 314 }
308 315
316 nv50_graph_construct_mmio_ddata(ctx);
317
309 /* 0C00: VFETCH */ 318 /* 0C00: VFETCH */
310 cp_ctx(ctx, 0x400c08, 0x2); 319 cp_ctx(ctx, 0x400c08, 0x2);
311 gr_def(ctx, 0x400c08, 0x0000fe0c); 320 gr_def(ctx, 0x400c08, 0x0000fe0c);
@@ -314,7 +323,7 @@ nv50_graph_construct_mmio(struct nouveau_grctx *ctx)
314 if (dev_priv->chipset < 0xa0) { 323 if (dev_priv->chipset < 0xa0) {
315 cp_ctx(ctx, 0x401008, 0x4); 324 cp_ctx(ctx, 0x401008, 0x4);
316 gr_def(ctx, 0x401014, 0x00001000); 325 gr_def(ctx, 0x401014, 0x00001000);
317 } else if (dev_priv->chipset == 0xa0 || dev_priv->chipset >= 0xaa) { 326 } else if (!IS_NVA3F(dev_priv->chipset)) {
318 cp_ctx(ctx, 0x401008, 0x5); 327 cp_ctx(ctx, 0x401008, 0x5);
319 gr_def(ctx, 0x401018, 0x00001000); 328 gr_def(ctx, 0x401018, 0x00001000);
320 } else { 329 } else {
@@ -368,10 +377,13 @@ nv50_graph_construct_mmio(struct nouveau_grctx *ctx)
368 case 0xa3: 377 case 0xa3:
369 case 0xa5: 378 case 0xa5:
370 case 0xa8: 379 case 0xa8:
380 case 0xaf:
371 gr_def(ctx, 0x401c00, 0x142500df); 381 gr_def(ctx, 0x401c00, 0x142500df);
372 break; 382 break;
373 } 383 }
374 384
385 /* 2000 */
386
375 /* 2400 */ 387 /* 2400 */
376 cp_ctx(ctx, 0x402400, 0x1); 388 cp_ctx(ctx, 0x402400, 0x1);
377 if (dev_priv->chipset == 0x50) 389 if (dev_priv->chipset == 0x50)
@@ -380,12 +392,12 @@ nv50_graph_construct_mmio(struct nouveau_grctx *ctx)
380 cp_ctx(ctx, 0x402408, 0x2); 392 cp_ctx(ctx, 0x402408, 0x2);
381 gr_def(ctx, 0x402408, 0x00000600); 393 gr_def(ctx, 0x402408, 0x00000600);
382 394
383 /* 2800 */ 395 /* 2800: CSCHED */
384 cp_ctx(ctx, 0x402800, 0x1); 396 cp_ctx(ctx, 0x402800, 0x1);
385 if (dev_priv->chipset == 0x50) 397 if (dev_priv->chipset == 0x50)
386 gr_def(ctx, 0x402800, 0x00000006); 398 gr_def(ctx, 0x402800, 0x00000006);
387 399
388 /* 2C00 */ 400 /* 2C00: ZCULL */
389 cp_ctx(ctx, 0x402c08, 0x6); 401 cp_ctx(ctx, 0x402c08, 0x6);
390 if (dev_priv->chipset != 0x50) 402 if (dev_priv->chipset != 0x50)
391 gr_def(ctx, 0x402c14, 0x01000000); 403 gr_def(ctx, 0x402c14, 0x01000000);
@@ -396,23 +408,23 @@ nv50_graph_construct_mmio(struct nouveau_grctx *ctx)
396 cp_ctx(ctx, 0x402ca0, 0x2); 408 cp_ctx(ctx, 0x402ca0, 0x2);
397 if (dev_priv->chipset < 0xa0) 409 if (dev_priv->chipset < 0xa0)
398 gr_def(ctx, 0x402ca0, 0x00000400); 410 gr_def(ctx, 0x402ca0, 0x00000400);
399 else if (dev_priv->chipset == 0xa0 || dev_priv->chipset >= 0xaa) 411 else if (!IS_NVA3F(dev_priv->chipset))
400 gr_def(ctx, 0x402ca0, 0x00000800); 412 gr_def(ctx, 0x402ca0, 0x00000800);
401 else 413 else
402 gr_def(ctx, 0x402ca0, 0x00000400); 414 gr_def(ctx, 0x402ca0, 0x00000400);
403 cp_ctx(ctx, 0x402cac, 0x4); 415 cp_ctx(ctx, 0x402cac, 0x4);
404 416
405 /* 3000 */ 417 /* 3000: ENG2D */
406 cp_ctx(ctx, 0x403004, 0x1); 418 cp_ctx(ctx, 0x403004, 0x1);
407 gr_def(ctx, 0x403004, 0x00000001); 419 gr_def(ctx, 0x403004, 0x00000001);
408 420
409 /* 3404 */ 421 /* 3400 */
410 if (dev_priv->chipset >= 0xa0) { 422 if (dev_priv->chipset >= 0xa0) {
411 cp_ctx(ctx, 0x403404, 0x1); 423 cp_ctx(ctx, 0x403404, 0x1);
412 gr_def(ctx, 0x403404, 0x00000001); 424 gr_def(ctx, 0x403404, 0x00000001);
413 } 425 }
414 426
415 /* 5000 */ 427 /* 5000: CCACHE */
416 cp_ctx(ctx, 0x405000, 0x1); 428 cp_ctx(ctx, 0x405000, 0x1);
417 switch (dev_priv->chipset) { 429 switch (dev_priv->chipset) {
418 case 0x50: 430 case 0x50:
@@ -425,6 +437,7 @@ nv50_graph_construct_mmio(struct nouveau_grctx *ctx)
425 case 0xa8: 437 case 0xa8:
426 case 0xaa: 438 case 0xaa:
427 case 0xac: 439 case 0xac:
440 case 0xaf:
428 gr_def(ctx, 0x405000, 0x000e0080); 441 gr_def(ctx, 0x405000, 0x000e0080);
429 break; 442 break;
430 case 0x86: 443 case 0x86:
@@ -441,210 +454,6 @@ nv50_graph_construct_mmio(struct nouveau_grctx *ctx)
441 cp_ctx(ctx, 0x405024, 0x1); 454 cp_ctx(ctx, 0x405024, 0x1);
442 cp_ctx(ctx, 0x40502c, 0x1); 455 cp_ctx(ctx, 0x40502c, 0x1);
443 456
444 /* 5400 or maybe 4800 */
445 if (dev_priv->chipset == 0x50) {
446 offset = 0x405400;
447 cp_ctx(ctx, 0x405400, 0xea);
448 } else if (dev_priv->chipset < 0x94) {
449 offset = 0x405400;
450 cp_ctx(ctx, 0x405400, 0xcb);
451 } else if (dev_priv->chipset < 0xa0) {
452 offset = 0x405400;
453 cp_ctx(ctx, 0x405400, 0xcc);
454 } else if (dev_priv->chipset > 0xa0 && dev_priv->chipset < 0xaa) {
455 offset = 0x404800;
456 cp_ctx(ctx, 0x404800, 0xda);
457 } else {
458 offset = 0x405400;
459 cp_ctx(ctx, 0x405400, 0xd4);
460 }
461 gr_def(ctx, offset + 0x0c, 0x00000002);
462 gr_def(ctx, offset + 0x10, 0x00000001);
463 if (dev_priv->chipset >= 0x94)
464 offset += 4;
465 gr_def(ctx, offset + 0x1c, 0x00000001);
466 gr_def(ctx, offset + 0x20, 0x00000100);
467 gr_def(ctx, offset + 0x38, 0x00000002);
468 gr_def(ctx, offset + 0x3c, 0x00000001);
469 gr_def(ctx, offset + 0x40, 0x00000001);
470 gr_def(ctx, offset + 0x50, 0x00000001);
471 gr_def(ctx, offset + 0x54, 0x003fffff);
472 gr_def(ctx, offset + 0x58, 0x00001fff);
473 gr_def(ctx, offset + 0x60, 0x00000001);
474 gr_def(ctx, offset + 0x64, 0x00000001);
475 gr_def(ctx, offset + 0x6c, 0x00000001);
476 gr_def(ctx, offset + 0x70, 0x00000001);
477 gr_def(ctx, offset + 0x74, 0x00000001);
478 gr_def(ctx, offset + 0x78, 0x00000004);
479 gr_def(ctx, offset + 0x7c, 0x00000001);
480 if (dev_priv->chipset > 0xa0 && dev_priv->chipset < 0xaa)
481 offset += 4;
482 gr_def(ctx, offset + 0x80, 0x00000001);
483 gr_def(ctx, offset + 0x84, 0x00000001);
484 gr_def(ctx, offset + 0x88, 0x00000007);
485 gr_def(ctx, offset + 0x8c, 0x00000001);
486 gr_def(ctx, offset + 0x90, 0x00000007);
487 gr_def(ctx, offset + 0x94, 0x00000001);
488 gr_def(ctx, offset + 0x98, 0x00000001);
489 gr_def(ctx, offset + 0x9c, 0x00000001);
490 if (dev_priv->chipset == 0x50) {
491 gr_def(ctx, offset + 0xb0, 0x00000001);
492 gr_def(ctx, offset + 0xb4, 0x00000001);
493 gr_def(ctx, offset + 0xbc, 0x00000001);
494 gr_def(ctx, offset + 0xc0, 0x0000000a);
495 gr_def(ctx, offset + 0xd0, 0x00000040);
496 gr_def(ctx, offset + 0xd8, 0x00000002);
497 gr_def(ctx, offset + 0xdc, 0x00000100);
498 gr_def(ctx, offset + 0xe0, 0x00000001);
499 gr_def(ctx, offset + 0xe4, 0x00000100);
500 gr_def(ctx, offset + 0x100, 0x00000001);
501 gr_def(ctx, offset + 0x124, 0x00000004);
502 gr_def(ctx, offset + 0x13c, 0x00000001);
503 gr_def(ctx, offset + 0x140, 0x00000100);
504 gr_def(ctx, offset + 0x148, 0x00000001);
505 gr_def(ctx, offset + 0x154, 0x00000100);
506 gr_def(ctx, offset + 0x158, 0x00000001);
507 gr_def(ctx, offset + 0x15c, 0x00000100);
508 gr_def(ctx, offset + 0x164, 0x00000001);
509 gr_def(ctx, offset + 0x170, 0x00000100);
510 gr_def(ctx, offset + 0x174, 0x00000001);
511 gr_def(ctx, offset + 0x17c, 0x00000001);
512 gr_def(ctx, offset + 0x188, 0x00000002);
513 gr_def(ctx, offset + 0x190, 0x00000001);
514 gr_def(ctx, offset + 0x198, 0x00000001);
515 gr_def(ctx, offset + 0x1ac, 0x00000003);
516 offset += 0xd0;
517 } else {
518 gr_def(ctx, offset + 0xb0, 0x00000001);
519 gr_def(ctx, offset + 0xb4, 0x00000100);
520 gr_def(ctx, offset + 0xbc, 0x00000001);
521 gr_def(ctx, offset + 0xc8, 0x00000100);
522 gr_def(ctx, offset + 0xcc, 0x00000001);
523 gr_def(ctx, offset + 0xd0, 0x00000100);
524 gr_def(ctx, offset + 0xd8, 0x00000001);
525 gr_def(ctx, offset + 0xe4, 0x00000100);
526 }
527 gr_def(ctx, offset + 0xf8, 0x00000004);
528 gr_def(ctx, offset + 0xfc, 0x00000070);
529 gr_def(ctx, offset + 0x100, 0x00000080);
530 if (dev_priv->chipset > 0xa0 && dev_priv->chipset < 0xaa)
531 offset += 4;
532 gr_def(ctx, offset + 0x114, 0x0000000c);
533 if (dev_priv->chipset == 0x50)
534 offset -= 4;
535 gr_def(ctx, offset + 0x11c, 0x00000008);
536 gr_def(ctx, offset + 0x120, 0x00000014);
537 if (dev_priv->chipset == 0x50) {
538 gr_def(ctx, offset + 0x124, 0x00000026);
539 offset -= 0x18;
540 } else {
541 gr_def(ctx, offset + 0x128, 0x00000029);
542 gr_def(ctx, offset + 0x12c, 0x00000027);
543 gr_def(ctx, offset + 0x130, 0x00000026);
544 gr_def(ctx, offset + 0x134, 0x00000008);
545 gr_def(ctx, offset + 0x138, 0x00000004);
546 gr_def(ctx, offset + 0x13c, 0x00000027);
547 }
548 gr_def(ctx, offset + 0x148, 0x00000001);
549 gr_def(ctx, offset + 0x14c, 0x00000002);
550 gr_def(ctx, offset + 0x150, 0x00000003);
551 gr_def(ctx, offset + 0x154, 0x00000004);
552 gr_def(ctx, offset + 0x158, 0x00000005);
553 gr_def(ctx, offset + 0x15c, 0x00000006);
554 gr_def(ctx, offset + 0x160, 0x00000007);
555 gr_def(ctx, offset + 0x164, 0x00000001);
556 gr_def(ctx, offset + 0x1a8, 0x000000cf);
557 if (dev_priv->chipset == 0x50)
558 offset -= 4;
559 gr_def(ctx, offset + 0x1d8, 0x00000080);
560 gr_def(ctx, offset + 0x1dc, 0x00000004);
561 gr_def(ctx, offset + 0x1e0, 0x00000004);
562 if (dev_priv->chipset == 0x50)
563 offset -= 4;
564 else
565 gr_def(ctx, offset + 0x1e4, 0x00000003);
566 if (dev_priv->chipset > 0xa0 && dev_priv->chipset < 0xaa) {
567 gr_def(ctx, offset + 0x1ec, 0x00000003);
568 offset += 8;
569 }
570 gr_def(ctx, offset + 0x1e8, 0x00000001);
571 if (dev_priv->chipset == 0x50)
572 offset -= 4;
573 gr_def(ctx, offset + 0x1f4, 0x00000012);
574 gr_def(ctx, offset + 0x1f8, 0x00000010);
575 gr_def(ctx, offset + 0x1fc, 0x0000000c);
576 gr_def(ctx, offset + 0x200, 0x00000001);
577 gr_def(ctx, offset + 0x210, 0x00000004);
578 gr_def(ctx, offset + 0x214, 0x00000002);
579 gr_def(ctx, offset + 0x218, 0x00000004);
580 if (dev_priv->chipset >= 0xa0)
581 offset += 4;
582 gr_def(ctx, offset + 0x224, 0x003fffff);
583 gr_def(ctx, offset + 0x228, 0x00001fff);
584 if (dev_priv->chipset == 0x50)
585 offset -= 0x20;
586 else if (dev_priv->chipset >= 0xa0) {
587 gr_def(ctx, offset + 0x250, 0x00000001);
588 gr_def(ctx, offset + 0x254, 0x00000001);
589 gr_def(ctx, offset + 0x258, 0x00000002);
590 offset += 0x10;
591 }
592 gr_def(ctx, offset + 0x250, 0x00000004);
593 gr_def(ctx, offset + 0x254, 0x00000014);
594 gr_def(ctx, offset + 0x258, 0x00000001);
595 if (dev_priv->chipset > 0xa0 && dev_priv->chipset < 0xaa)
596 offset += 4;
597 gr_def(ctx, offset + 0x264, 0x00000002);
598 if (dev_priv->chipset >= 0xa0)
599 offset += 8;
600 gr_def(ctx, offset + 0x270, 0x00000001);
601 gr_def(ctx, offset + 0x278, 0x00000002);
602 gr_def(ctx, offset + 0x27c, 0x00001000);
603 if (dev_priv->chipset == 0x50)
604 offset -= 0xc;
605 else {
606 gr_def(ctx, offset + 0x280, 0x00000e00);
607 gr_def(ctx, offset + 0x284, 0x00001000);
608 gr_def(ctx, offset + 0x288, 0x00001e00);
609 }
610 gr_def(ctx, offset + 0x290, 0x00000001);
611 gr_def(ctx, offset + 0x294, 0x00000001);
612 gr_def(ctx, offset + 0x298, 0x00000001);
613 gr_def(ctx, offset + 0x29c, 0x00000001);
614 gr_def(ctx, offset + 0x2a0, 0x00000001);
615 gr_def(ctx, offset + 0x2b0, 0x00000200);
616 if (dev_priv->chipset > 0xa0 && dev_priv->chipset < 0xaa) {
617 gr_def(ctx, offset + 0x2b4, 0x00000200);
618 offset += 4;
619 }
620 if (dev_priv->chipset < 0xa0) {
621 gr_def(ctx, offset + 0x2b8, 0x00000001);
622 gr_def(ctx, offset + 0x2bc, 0x00000070);
623 gr_def(ctx, offset + 0x2c0, 0x00000080);
624 gr_def(ctx, offset + 0x2cc, 0x00000001);
625 gr_def(ctx, offset + 0x2d0, 0x00000070);
626 gr_def(ctx, offset + 0x2d4, 0x00000080);
627 } else {
628 gr_def(ctx, offset + 0x2b8, 0x00000001);
629 gr_def(ctx, offset + 0x2bc, 0x000000f0);
630 gr_def(ctx, offset + 0x2c0, 0x000000ff);
631 gr_def(ctx, offset + 0x2cc, 0x00000001);
632 gr_def(ctx, offset + 0x2d0, 0x000000f0);
633 gr_def(ctx, offset + 0x2d4, 0x000000ff);
634 gr_def(ctx, offset + 0x2dc, 0x00000009);
635 offset += 4;
636 }
637 gr_def(ctx, offset + 0x2e4, 0x00000001);
638 gr_def(ctx, offset + 0x2e8, 0x000000cf);
639 gr_def(ctx, offset + 0x2f0, 0x00000001);
640 gr_def(ctx, offset + 0x300, 0x000000cf);
641 gr_def(ctx, offset + 0x308, 0x00000002);
642 gr_def(ctx, offset + 0x310, 0x00000001);
643 gr_def(ctx, offset + 0x318, 0x00000001);
644 gr_def(ctx, offset + 0x320, 0x000000cf);
645 gr_def(ctx, offset + 0x324, 0x000000cf);
646 gr_def(ctx, offset + 0x328, 0x00000001);
647
648 /* 6000? */ 457 /* 6000? */
649 if (dev_priv->chipset == 0x50) 458 if (dev_priv->chipset == 0x50)
650 cp_ctx(ctx, 0x4063e0, 0x1); 459 cp_ctx(ctx, 0x4063e0, 0x1);
@@ -661,7 +470,7 @@ nv50_graph_construct_mmio(struct nouveau_grctx *ctx)
661 gr_def(ctx, 0x406818, 0x00000f80); 470 gr_def(ctx, 0x406818, 0x00000f80);
662 else 471 else
663 gr_def(ctx, 0x406818, 0x00001f80); 472 gr_def(ctx, 0x406818, 0x00001f80);
664 if (dev_priv->chipset > 0xa0 && dev_priv->chipset < 0xaa) 473 if (IS_NVA3F(dev_priv->chipset))
665 gr_def(ctx, 0x40681c, 0x00000030); 474 gr_def(ctx, 0x40681c, 0x00000030);
666 cp_ctx(ctx, 0x406830, 0x3); 475 cp_ctx(ctx, 0x406830, 0x3);
667 } 476 }
@@ -706,7 +515,7 @@ nv50_graph_construct_mmio(struct nouveau_grctx *ctx)
706 515
707 if (dev_priv->chipset < 0xa0) 516 if (dev_priv->chipset < 0xa0)
708 cp_ctx(ctx, 0x407094 + (i<<8), 1); 517 cp_ctx(ctx, 0x407094 + (i<<8), 1);
709 else if (dev_priv->chipset <= 0xa0 || dev_priv->chipset >= 0xaa) 518 else if (!IS_NVA3F(dev_priv->chipset))
710 cp_ctx(ctx, 0x407094 + (i<<8), 3); 519 cp_ctx(ctx, 0x407094 + (i<<8), 3);
711 else { 520 else {
712 cp_ctx(ctx, 0x407094 + (i<<8), 4); 521 cp_ctx(ctx, 0x407094 + (i<<8), 4);
@@ -799,6 +608,7 @@ nv50_graph_construct_mmio(struct nouveau_grctx *ctx)
799 case 0xa8: 608 case 0xa8:
800 case 0xaa: 609 case 0xaa:
801 case 0xac: 610 case 0xac:
611 case 0xaf:
802 gr_def(ctx, offset + 0x1c, 0x300c0000); 612 gr_def(ctx, offset + 0x1c, 0x300c0000);
803 break; 613 break;
804 } 614 }
@@ -825,7 +635,7 @@ nv50_graph_construct_mmio(struct nouveau_grctx *ctx)
825 gr_def(ctx, base + 0x304, 0x00007070); 635 gr_def(ctx, base + 0x304, 0x00007070);
826 else if (dev_priv->chipset < 0xa0) 636 else if (dev_priv->chipset < 0xa0)
827 gr_def(ctx, base + 0x304, 0x00027070); 637 gr_def(ctx, base + 0x304, 0x00027070);
828 else if (dev_priv->chipset <= 0xa0 || dev_priv->chipset >= 0xaa) 638 else if (!IS_NVA3F(dev_priv->chipset))
829 gr_def(ctx, base + 0x304, 0x01127070); 639 gr_def(ctx, base + 0x304, 0x01127070);
830 else 640 else
831 gr_def(ctx, base + 0x304, 0x05127070); 641 gr_def(ctx, base + 0x304, 0x05127070);
@@ -849,7 +659,7 @@ nv50_graph_construct_mmio(struct nouveau_grctx *ctx)
849 if (dev_priv->chipset < 0xa0) { 659 if (dev_priv->chipset < 0xa0) {
850 cp_ctx(ctx, base + 0x340, 9); 660 cp_ctx(ctx, base + 0x340, 9);
851 offset = base + 0x340; 661 offset = base + 0x340;
852 } else if (dev_priv->chipset <= 0xa0 || dev_priv->chipset >= 0xaa) { 662 } else if (!IS_NVA3F(dev_priv->chipset)) {
853 cp_ctx(ctx, base + 0x33c, 0xb); 663 cp_ctx(ctx, base + 0x33c, 0xb);
854 offset = base + 0x344; 664 offset = base + 0x344;
855 } else { 665 } else {
@@ -880,7 +690,7 @@ nv50_graph_construct_mmio(struct nouveau_grctx *ctx)
880 gr_def(ctx, offset + 0x0, 0x000001f0); 690 gr_def(ctx, offset + 0x0, 0x000001f0);
881 gr_def(ctx, offset + 0x4, 0x00000001); 691 gr_def(ctx, offset + 0x4, 0x00000001);
882 gr_def(ctx, offset + 0x8, 0x00000003); 692 gr_def(ctx, offset + 0x8, 0x00000003);
883 if (dev_priv->chipset == 0x50 || dev_priv->chipset >= 0xaa) 693 if (dev_priv->chipset == 0x50 || IS_NVAAF(dev_priv->chipset))
884 gr_def(ctx, offset + 0xc, 0x00008000); 694 gr_def(ctx, offset + 0xc, 0x00008000);
885 gr_def(ctx, offset + 0x14, 0x00039e00); 695 gr_def(ctx, offset + 0x14, 0x00039e00);
886 cp_ctx(ctx, offset + 0x1c, 2); 696 cp_ctx(ctx, offset + 0x1c, 2);
@@ -892,7 +702,7 @@ nv50_graph_construct_mmio(struct nouveau_grctx *ctx)
892 702
893 if (dev_priv->chipset >= 0xa0) { 703 if (dev_priv->chipset >= 0xa0) {
894 cp_ctx(ctx, base + 0x54c, 2); 704 cp_ctx(ctx, base + 0x54c, 2);
895 if (dev_priv->chipset <= 0xa0 || dev_priv->chipset >= 0xaa) 705 if (!IS_NVA3F(dev_priv->chipset))
896 gr_def(ctx, base + 0x54c, 0x003fe006); 706 gr_def(ctx, base + 0x54c, 0x003fe006);
897 else 707 else
898 gr_def(ctx, base + 0x54c, 0x003fe007); 708 gr_def(ctx, base + 0x54c, 0x003fe007);
@@ -937,7 +747,7 @@ nv50_graph_construct_mmio(struct nouveau_grctx *ctx)
937 gr_def(ctx, offset + 0x64, 0x0000001f); 747 gr_def(ctx, offset + 0x64, 0x0000001f);
938 gr_def(ctx, offset + 0x68, 0x0000000f); 748 gr_def(ctx, offset + 0x68, 0x0000000f);
939 gr_def(ctx, offset + 0x6c, 0x0000000f); 749 gr_def(ctx, offset + 0x6c, 0x0000000f);
940 } else if(dev_priv->chipset < 0xa0) { 750 } else if (dev_priv->chipset < 0xa0) {
941 cp_ctx(ctx, offset + 0x50, 1); 751 cp_ctx(ctx, offset + 0x50, 1);
942 cp_ctx(ctx, offset + 0x70, 1); 752 cp_ctx(ctx, offset + 0x70, 1);
943 } else { 753 } else {
@@ -948,6 +758,336 @@ nv50_graph_construct_mmio(struct nouveau_grctx *ctx)
948 } 758 }
949} 759}
950 760
761static void
762dd_emit(struct nouveau_grctx *ctx, int num, uint32_t val) {
763 int i;
764 if (val && ctx->mode == NOUVEAU_GRCTX_VALS)
765 for (i = 0; i < num; i++)
766 nv_wo32(ctx->data, 4 * (ctx->ctxvals_pos + i), val);
767 ctx->ctxvals_pos += num;
768}
769
770static void
771nv50_graph_construct_mmio_ddata(struct nouveau_grctx *ctx)
772{
773 struct drm_nouveau_private *dev_priv = ctx->dev->dev_private;
774 int base, num;
775 base = ctx->ctxvals_pos;
776
777 /* tesla state */
778 dd_emit(ctx, 1, 0); /* 00000001 UNK0F90 */
779 dd_emit(ctx, 1, 0); /* 00000001 UNK135C */
780
781 /* SRC_TIC state */
782 dd_emit(ctx, 1, 0); /* 00000007 SRC_TILE_MODE_Z */
783 dd_emit(ctx, 1, 2); /* 00000007 SRC_TILE_MODE_Y */
784 dd_emit(ctx, 1, 1); /* 00000001 SRC_LINEAR #1 */
785 dd_emit(ctx, 1, 0); /* 000000ff SRC_ADDRESS_HIGH */
786 dd_emit(ctx, 1, 0); /* 00000001 SRC_SRGB */
787 if (dev_priv->chipset >= 0x94)
788 dd_emit(ctx, 1, 0); /* 00000003 eng2d UNK0258 */
789 dd_emit(ctx, 1, 1); /* 00000fff SRC_DEPTH */
790 dd_emit(ctx, 1, 0x100); /* 0000ffff SRC_HEIGHT */
791
792 /* turing state */
793 dd_emit(ctx, 1, 0); /* 0000000f TEXTURES_LOG2 */
794 dd_emit(ctx, 1, 0); /* 0000000f SAMPLERS_LOG2 */
795 dd_emit(ctx, 1, 0); /* 000000ff CB_DEF_ADDRESS_HIGH */
796 dd_emit(ctx, 1, 0); /* ffffffff CB_DEF_ADDRESS_LOW */
797 dd_emit(ctx, 1, 0); /* ffffffff SHARED_SIZE */
798 dd_emit(ctx, 1, 2); /* ffffffff REG_MODE */
799 dd_emit(ctx, 1, 1); /* 0000ffff BLOCK_ALLOC_THREADS */
800 dd_emit(ctx, 1, 1); /* 00000001 LANES32 */
801 dd_emit(ctx, 1, 0); /* 000000ff UNK370 */
802 dd_emit(ctx, 1, 0); /* 000000ff USER_PARAM_UNK */
803 dd_emit(ctx, 1, 0); /* 000000ff USER_PARAM_COUNT */
804 dd_emit(ctx, 1, 1); /* 000000ff UNK384 bits 8-15 */
805 dd_emit(ctx, 1, 0x3fffff); /* 003fffff TIC_LIMIT */
806 dd_emit(ctx, 1, 0x1fff); /* 000fffff TSC_LIMIT */
807 dd_emit(ctx, 1, 0); /* 0000ffff CB_ADDR_INDEX */
808 dd_emit(ctx, 1, 1); /* 000007ff BLOCKDIM_X */
809 dd_emit(ctx, 1, 1); /* 000007ff BLOCKDIM_XMY */
810 dd_emit(ctx, 1, 0); /* 00000001 BLOCKDIM_XMY_OVERFLOW */
811 dd_emit(ctx, 1, 1); /* 0003ffff BLOCKDIM_XMYMZ */
812 dd_emit(ctx, 1, 1); /* 000007ff BLOCKDIM_Y */
813 dd_emit(ctx, 1, 1); /* 0000007f BLOCKDIM_Z */
814 dd_emit(ctx, 1, 4); /* 000000ff CP_REG_ALLOC_TEMP */
815 dd_emit(ctx, 1, 1); /* 00000001 BLOCKDIM_DIRTY */
816 if (IS_NVA3F(dev_priv->chipset))
817 dd_emit(ctx, 1, 0); /* 00000003 UNK03E8 */
818 dd_emit(ctx, 1, 1); /* 0000007f BLOCK_ALLOC_HALFWARPS */
819 dd_emit(ctx, 1, 1); /* 00000007 LOCAL_WARPS_NO_CLAMP */
820 dd_emit(ctx, 1, 7); /* 00000007 LOCAL_WARPS_LOG_ALLOC */
821 dd_emit(ctx, 1, 1); /* 00000007 STACK_WARPS_NO_CLAMP */
822 dd_emit(ctx, 1, 7); /* 00000007 STACK_WARPS_LOG_ALLOC */
823 dd_emit(ctx, 1, 1); /* 00001fff BLOCK_ALLOC_REGSLOTS_PACKED */
824 dd_emit(ctx, 1, 1); /* 00001fff BLOCK_ALLOC_REGSLOTS_STRIDED */
825 dd_emit(ctx, 1, 1); /* 000007ff BLOCK_ALLOC_THREADS */
826
827 /* compat 2d state */
828 if (dev_priv->chipset == 0x50) {
829 dd_emit(ctx, 4, 0); /* 0000ffff clip X, Y, W, H */
830
831 dd_emit(ctx, 1, 1); /* ffffffff chroma COLOR_FORMAT */
832
833 dd_emit(ctx, 1, 1); /* ffffffff pattern COLOR_FORMAT */
834 dd_emit(ctx, 1, 0); /* ffffffff pattern SHAPE */
835 dd_emit(ctx, 1, 1); /* ffffffff pattern PATTERN_SELECT */
836
837 dd_emit(ctx, 1, 0xa); /* ffffffff surf2d SRC_FORMAT */
838 dd_emit(ctx, 1, 0); /* ffffffff surf2d DMA_SRC */
839 dd_emit(ctx, 1, 0); /* 000000ff surf2d SRC_ADDRESS_HIGH */
840 dd_emit(ctx, 1, 0); /* ffffffff surf2d SRC_ADDRESS_LOW */
841 dd_emit(ctx, 1, 0x40); /* 0000ffff surf2d SRC_PITCH */
842 dd_emit(ctx, 1, 0); /* 0000000f surf2d SRC_TILE_MODE_Z */
843 dd_emit(ctx, 1, 2); /* 0000000f surf2d SRC_TILE_MODE_Y */
844 dd_emit(ctx, 1, 0x100); /* ffffffff surf2d SRC_HEIGHT */
845 dd_emit(ctx, 1, 1); /* 00000001 surf2d SRC_LINEAR */
846 dd_emit(ctx, 1, 0x100); /* ffffffff surf2d SRC_WIDTH */
847
848 dd_emit(ctx, 1, 0); /* 0000ffff gdirect CLIP_B_X */
849 dd_emit(ctx, 1, 0); /* 0000ffff gdirect CLIP_B_Y */
850 dd_emit(ctx, 1, 0); /* 0000ffff gdirect CLIP_C_X */
851 dd_emit(ctx, 1, 0); /* 0000ffff gdirect CLIP_C_Y */
852 dd_emit(ctx, 1, 0); /* 0000ffff gdirect CLIP_D_X */
853 dd_emit(ctx, 1, 0); /* 0000ffff gdirect CLIP_D_Y */
854 dd_emit(ctx, 1, 1); /* ffffffff gdirect COLOR_FORMAT */
855 dd_emit(ctx, 1, 0); /* ffffffff gdirect OPERATION */
856 dd_emit(ctx, 1, 0); /* 0000ffff gdirect POINT_X */
857 dd_emit(ctx, 1, 0); /* 0000ffff gdirect POINT_Y */
858
859 dd_emit(ctx, 1, 0); /* 0000ffff blit SRC_Y */
860 dd_emit(ctx, 1, 0); /* ffffffff blit OPERATION */
861
862 dd_emit(ctx, 1, 0); /* ffffffff ifc OPERATION */
863
864 dd_emit(ctx, 1, 0); /* ffffffff iifc INDEX_FORMAT */
865 dd_emit(ctx, 1, 0); /* ffffffff iifc LUT_OFFSET */
866 dd_emit(ctx, 1, 4); /* ffffffff iifc COLOR_FORMAT */
867 dd_emit(ctx, 1, 0); /* ffffffff iifc OPERATION */
868 }
869
870 /* m2mf state */
871 dd_emit(ctx, 1, 0); /* ffffffff m2mf LINE_COUNT */
872 dd_emit(ctx, 1, 0); /* ffffffff m2mf LINE_LENGTH_IN */
873 dd_emit(ctx, 2, 0); /* ffffffff m2mf OFFSET_IN, OFFSET_OUT */
874 dd_emit(ctx, 1, 1); /* ffffffff m2mf TILING_DEPTH_OUT */
875 dd_emit(ctx, 1, 0x100); /* ffffffff m2mf TILING_HEIGHT_OUT */
876 dd_emit(ctx, 1, 0); /* ffffffff m2mf TILING_POSITION_OUT_Z */
877 dd_emit(ctx, 1, 1); /* 00000001 m2mf LINEAR_OUT */
878 dd_emit(ctx, 2, 0); /* 0000ffff m2mf TILING_POSITION_OUT_X, Y */
879 dd_emit(ctx, 1, 0x100); /* ffffffff m2mf TILING_PITCH_OUT */
880 dd_emit(ctx, 1, 1); /* ffffffff m2mf TILING_DEPTH_IN */
881 dd_emit(ctx, 1, 0x100); /* ffffffff m2mf TILING_HEIGHT_IN */
882 dd_emit(ctx, 1, 0); /* ffffffff m2mf TILING_POSITION_IN_Z */
883 dd_emit(ctx, 1, 1); /* 00000001 m2mf LINEAR_IN */
884 dd_emit(ctx, 2, 0); /* 0000ffff m2mf TILING_POSITION_IN_X, Y */
885 dd_emit(ctx, 1, 0x100); /* ffffffff m2mf TILING_PITCH_IN */
886
887 /* more compat 2d state */
888 if (dev_priv->chipset == 0x50) {
889 dd_emit(ctx, 1, 1); /* ffffffff line COLOR_FORMAT */
890 dd_emit(ctx, 1, 0); /* ffffffff line OPERATION */
891
892 dd_emit(ctx, 1, 1); /* ffffffff triangle COLOR_FORMAT */
893 dd_emit(ctx, 1, 0); /* ffffffff triangle OPERATION */
894
895 dd_emit(ctx, 1, 0); /* 0000000f sifm TILE_MODE_Z */
896 dd_emit(ctx, 1, 2); /* 0000000f sifm TILE_MODE_Y */
897 dd_emit(ctx, 1, 0); /* 000000ff sifm FORMAT_FILTER */
898 dd_emit(ctx, 1, 1); /* 000000ff sifm FORMAT_ORIGIN */
899 dd_emit(ctx, 1, 0); /* 0000ffff sifm SRC_PITCH */
900 dd_emit(ctx, 1, 1); /* 00000001 sifm SRC_LINEAR */
901 dd_emit(ctx, 1, 0); /* 000000ff sifm SRC_OFFSET_HIGH */
902 dd_emit(ctx, 1, 0); /* ffffffff sifm SRC_OFFSET */
903 dd_emit(ctx, 1, 0); /* 0000ffff sifm SRC_HEIGHT */
904 dd_emit(ctx, 1, 0); /* 0000ffff sifm SRC_WIDTH */
905 dd_emit(ctx, 1, 3); /* ffffffff sifm COLOR_FORMAT */
906 dd_emit(ctx, 1, 0); /* ffffffff sifm OPERATION */
907
908 dd_emit(ctx, 1, 0); /* ffffffff sifc OPERATION */
909 }
910
911 /* tesla state */
912 dd_emit(ctx, 1, 0); /* 0000000f GP_TEXTURES_LOG2 */
913 dd_emit(ctx, 1, 0); /* 0000000f GP_SAMPLERS_LOG2 */
914 dd_emit(ctx, 1, 0); /* 000000ff */
915 dd_emit(ctx, 1, 0); /* ffffffff */
916 dd_emit(ctx, 1, 4); /* 000000ff UNK12B0_0 */
917 dd_emit(ctx, 1, 0x70); /* 000000ff UNK12B0_1 */
918 dd_emit(ctx, 1, 0x80); /* 000000ff UNK12B0_3 */
919 dd_emit(ctx, 1, 0); /* 000000ff UNK12B0_2 */
920 dd_emit(ctx, 1, 0); /* 0000000f FP_TEXTURES_LOG2 */
921 dd_emit(ctx, 1, 0); /* 0000000f FP_SAMPLERS_LOG2 */
922 if (IS_NVA3F(dev_priv->chipset)) {
923 dd_emit(ctx, 1, 0); /* ffffffff */
924 dd_emit(ctx, 1, 0); /* 0000007f MULTISAMPLE_SAMPLES_LOG2 */
925 } else {
926 dd_emit(ctx, 1, 0); /* 0000000f MULTISAMPLE_SAMPLES_LOG2 */
927 }
928 dd_emit(ctx, 1, 0xc); /* 000000ff SEMANTIC_COLOR.BFC0_ID */
929 if (dev_priv->chipset != 0x50)
930 dd_emit(ctx, 1, 0); /* 00000001 SEMANTIC_COLOR.CLMP_EN */
931 dd_emit(ctx, 1, 8); /* 000000ff SEMANTIC_COLOR.COLR_NR */
932 dd_emit(ctx, 1, 0x14); /* 000000ff SEMANTIC_COLOR.FFC0_ID */
933 if (dev_priv->chipset == 0x50) {
934 dd_emit(ctx, 1, 0); /* 000000ff SEMANTIC_LAYER */
935 dd_emit(ctx, 1, 0); /* 00000001 */
936 } else {
937 dd_emit(ctx, 1, 0); /* 00000001 SEMANTIC_PTSZ.ENABLE */
938 dd_emit(ctx, 1, 0x29); /* 000000ff SEMANTIC_PTSZ.PTSZ_ID */
939 dd_emit(ctx, 1, 0x27); /* 000000ff SEMANTIC_PRIM */
940 dd_emit(ctx, 1, 0x26); /* 000000ff SEMANTIC_LAYER */
941 dd_emit(ctx, 1, 8); /* 0000000f SMENATIC_CLIP.CLIP_HIGH */
942 dd_emit(ctx, 1, 4); /* 000000ff SEMANTIC_CLIP.CLIP_LO */
943 dd_emit(ctx, 1, 0x27); /* 000000ff UNK0FD4 */
944 dd_emit(ctx, 1, 0); /* 00000001 UNK1900 */
945 }
946 dd_emit(ctx, 1, 0); /* 00000007 RT_CONTROL_MAP0 */
947 dd_emit(ctx, 1, 1); /* 00000007 RT_CONTROL_MAP1 */
948 dd_emit(ctx, 1, 2); /* 00000007 RT_CONTROL_MAP2 */
949 dd_emit(ctx, 1, 3); /* 00000007 RT_CONTROL_MAP3 */
950 dd_emit(ctx, 1, 4); /* 00000007 RT_CONTROL_MAP4 */
951 dd_emit(ctx, 1, 5); /* 00000007 RT_CONTROL_MAP5 */
952 dd_emit(ctx, 1, 6); /* 00000007 RT_CONTROL_MAP6 */
953 dd_emit(ctx, 1, 7); /* 00000007 RT_CONTROL_MAP7 */
954 dd_emit(ctx, 1, 1); /* 0000000f RT_CONTROL_COUNT */
955 dd_emit(ctx, 8, 0); /* 00000001 RT_HORIZ_UNK */
956 dd_emit(ctx, 8, 0); /* ffffffff RT_ADDRESS_LOW */
957 dd_emit(ctx, 1, 0xcf); /* 000000ff RT_FORMAT */
958 dd_emit(ctx, 7, 0); /* 000000ff RT_FORMAT */
959 if (dev_priv->chipset != 0x50)
960 dd_emit(ctx, 3, 0); /* 1, 1, 1 */
961 else
962 dd_emit(ctx, 2, 0); /* 1, 1 */
963 dd_emit(ctx, 1, 0); /* ffffffff GP_ENABLE */
964 dd_emit(ctx, 1, 0x80); /* 0000ffff GP_VERTEX_OUTPUT_COUNT*/
965 dd_emit(ctx, 1, 4); /* 000000ff GP_REG_ALLOC_RESULT */
966 dd_emit(ctx, 1, 4); /* 000000ff GP_RESULT_MAP_SIZE */
967 if (IS_NVA3F(dev_priv->chipset)) {
968 dd_emit(ctx, 1, 3); /* 00000003 */
969 dd_emit(ctx, 1, 0); /* 00000001 UNK1418. Alone. */
970 }
971 if (dev_priv->chipset != 0x50)
972 dd_emit(ctx, 1, 3); /* 00000003 UNK15AC */
973 dd_emit(ctx, 1, 1); /* ffffffff RASTERIZE_ENABLE */
974 dd_emit(ctx, 1, 0); /* 00000001 FP_CONTROL.EXPORTS_Z */
975 if (dev_priv->chipset != 0x50)
976 dd_emit(ctx, 1, 0); /* 00000001 FP_CONTROL.MULTIPLE_RESULTS */
977 dd_emit(ctx, 1, 0x12); /* 000000ff FP_INTERPOLANT_CTRL.COUNT */
978 dd_emit(ctx, 1, 0x10); /* 000000ff FP_INTERPOLANT_CTRL.COUNT_NONFLAT */
979 dd_emit(ctx, 1, 0xc); /* 000000ff FP_INTERPOLANT_CTRL.OFFSET */
980 dd_emit(ctx, 1, 1); /* 00000001 FP_INTERPOLANT_CTRL.UMASK.W */
981 dd_emit(ctx, 1, 0); /* 00000001 FP_INTERPOLANT_CTRL.UMASK.X */
982 dd_emit(ctx, 1, 0); /* 00000001 FP_INTERPOLANT_CTRL.UMASK.Y */
983 dd_emit(ctx, 1, 0); /* 00000001 FP_INTERPOLANT_CTRL.UMASK.Z */
984 dd_emit(ctx, 1, 4); /* 000000ff FP_RESULT_COUNT */
985 dd_emit(ctx, 1, 2); /* ffffffff REG_MODE */
986 dd_emit(ctx, 1, 4); /* 000000ff FP_REG_ALLOC_TEMP */
987 if (dev_priv->chipset >= 0xa0)
988 dd_emit(ctx, 1, 0); /* ffffffff */
989 dd_emit(ctx, 1, 0); /* 00000001 GP_BUILTIN_RESULT_EN.LAYER_IDX */
990 dd_emit(ctx, 1, 0); /* ffffffff STRMOUT_ENABLE */
991 dd_emit(ctx, 1, 0x3fffff); /* 003fffff TIC_LIMIT */
992 dd_emit(ctx, 1, 0x1fff); /* 000fffff TSC_LIMIT */
993 dd_emit(ctx, 1, 0); /* 00000001 VERTEX_TWO_SIDE_ENABLE*/
994 if (dev_priv->chipset != 0x50)
995 dd_emit(ctx, 8, 0); /* 00000001 */
996 if (dev_priv->chipset >= 0xa0) {
997 dd_emit(ctx, 1, 1); /* 00000007 VTX_ATTR_DEFINE.COMP */
998 dd_emit(ctx, 1, 1); /* 00000007 VTX_ATTR_DEFINE.SIZE */
999 dd_emit(ctx, 1, 2); /* 00000007 VTX_ATTR_DEFINE.TYPE */
1000 dd_emit(ctx, 1, 0); /* 000000ff VTX_ATTR_DEFINE.ATTR */
1001 }
1002 dd_emit(ctx, 1, 4); /* 0000007f VP_RESULT_MAP_SIZE */
1003 dd_emit(ctx, 1, 0x14); /* 0000001f ZETA_FORMAT */
1004 dd_emit(ctx, 1, 1); /* 00000001 ZETA_ENABLE */
1005 dd_emit(ctx, 1, 0); /* 0000000f VP_TEXTURES_LOG2 */
1006 dd_emit(ctx, 1, 0); /* 0000000f VP_SAMPLERS_LOG2 */
1007 if (IS_NVA3F(dev_priv->chipset))
1008 dd_emit(ctx, 1, 0); /* 00000001 */
1009 dd_emit(ctx, 1, 2); /* 00000003 POLYGON_MODE_BACK */
1010 if (dev_priv->chipset >= 0xa0)
1011 dd_emit(ctx, 1, 0); /* 00000003 VTX_ATTR_DEFINE.SIZE - 1 */
1012 dd_emit(ctx, 1, 0); /* 0000ffff CB_ADDR_INDEX */
1013 if (dev_priv->chipset >= 0xa0)
1014 dd_emit(ctx, 1, 0); /* 00000003 */
1015 dd_emit(ctx, 1, 0); /* 00000001 CULL_FACE_ENABLE */
1016 dd_emit(ctx, 1, 1); /* 00000003 CULL_FACE */
1017 dd_emit(ctx, 1, 0); /* 00000001 FRONT_FACE */
1018 dd_emit(ctx, 1, 2); /* 00000003 POLYGON_MODE_FRONT */
1019 dd_emit(ctx, 1, 0x1000); /* 00007fff UNK141C */
1020 if (dev_priv->chipset != 0x50) {
1021 dd_emit(ctx, 1, 0xe00); /* 7fff */
1022 dd_emit(ctx, 1, 0x1000); /* 7fff */
1023 dd_emit(ctx, 1, 0x1e00); /* 7fff */
1024 }
1025 dd_emit(ctx, 1, 0); /* 00000001 BEGIN_END_ACTIVE */
1026 dd_emit(ctx, 1, 1); /* 00000001 POLYGON_MODE_??? */
1027 dd_emit(ctx, 1, 1); /* 000000ff GP_REG_ALLOC_TEMP / 4 rounded up */
1028 dd_emit(ctx, 1, 1); /* 000000ff FP_REG_ALLOC_TEMP... without /4? */
1029 dd_emit(ctx, 1, 1); /* 000000ff VP_REG_ALLOC_TEMP / 4 rounded up */
1030 dd_emit(ctx, 1, 1); /* 00000001 */
1031 dd_emit(ctx, 1, 0); /* 00000001 */
1032 dd_emit(ctx, 1, 0); /* 00000001 VTX_ATTR_MASK_UNK0 nonempty */
1033 dd_emit(ctx, 1, 0); /* 00000001 VTX_ATTR_MASK_UNK1 nonempty */
1034 dd_emit(ctx, 1, 0x200); /* 0003ffff GP_VERTEX_OUTPUT_COUNT*GP_REG_ALLOC_RESULT */
1035 if (IS_NVA3F(dev_priv->chipset))
1036 dd_emit(ctx, 1, 0x200);
1037 dd_emit(ctx, 1, 0); /* 00000001 */
1038 if (dev_priv->chipset < 0xa0) {
1039 dd_emit(ctx, 1, 1); /* 00000001 */
1040 dd_emit(ctx, 1, 0x70); /* 000000ff */
1041 dd_emit(ctx, 1, 0x80); /* 000000ff */
1042 dd_emit(ctx, 1, 0); /* 000000ff */
1043 dd_emit(ctx, 1, 0); /* 00000001 */
1044 dd_emit(ctx, 1, 1); /* 00000001 */
1045 dd_emit(ctx, 1, 0x70); /* 000000ff */
1046 dd_emit(ctx, 1, 0x80); /* 000000ff */
1047 dd_emit(ctx, 1, 0); /* 000000ff */
1048 } else {
1049 dd_emit(ctx, 1, 1); /* 00000001 */
1050 dd_emit(ctx, 1, 0xf0); /* 000000ff */
1051 dd_emit(ctx, 1, 0xff); /* 000000ff */
1052 dd_emit(ctx, 1, 0); /* 000000ff */
1053 dd_emit(ctx, 1, 0); /* 00000001 */
1054 dd_emit(ctx, 1, 1); /* 00000001 */
1055 dd_emit(ctx, 1, 0xf0); /* 000000ff */
1056 dd_emit(ctx, 1, 0xff); /* 000000ff */
1057 dd_emit(ctx, 1, 0); /* 000000ff */
1058 dd_emit(ctx, 1, 9); /* 0000003f UNK114C.COMP,SIZE */
1059 }
1060
1061 /* eng2d state */
1062 dd_emit(ctx, 1, 0); /* 00000001 eng2d COLOR_KEY_ENABLE */
1063 dd_emit(ctx, 1, 0); /* 00000007 eng2d COLOR_KEY_FORMAT */
1064 dd_emit(ctx, 1, 1); /* ffffffff eng2d DST_DEPTH */
1065 dd_emit(ctx, 1, 0xcf); /* 000000ff eng2d DST_FORMAT */
1066 dd_emit(ctx, 1, 0); /* ffffffff eng2d DST_LAYER */
1067 dd_emit(ctx, 1, 1); /* 00000001 eng2d DST_LINEAR */
1068 dd_emit(ctx, 1, 0); /* 00000007 eng2d PATTERN_COLOR_FORMAT */
1069 dd_emit(ctx, 1, 0); /* 00000007 eng2d OPERATION */
1070 dd_emit(ctx, 1, 0); /* 00000003 eng2d PATTERN_SELECT */
1071 dd_emit(ctx, 1, 0xcf); /* 000000ff eng2d SIFC_FORMAT */
1072 dd_emit(ctx, 1, 0); /* 00000001 eng2d SIFC_BITMAP_ENABLE */
1073 dd_emit(ctx, 1, 2); /* 00000003 eng2d SIFC_BITMAP_UNK808 */
1074 dd_emit(ctx, 1, 0); /* ffffffff eng2d BLIT_DU_DX_FRACT */
1075 dd_emit(ctx, 1, 1); /* ffffffff eng2d BLIT_DU_DX_INT */
1076 dd_emit(ctx, 1, 0); /* ffffffff eng2d BLIT_DV_DY_FRACT */
1077 dd_emit(ctx, 1, 1); /* ffffffff eng2d BLIT_DV_DY_INT */
1078 dd_emit(ctx, 1, 0); /* 00000001 eng2d BLIT_CONTROL_FILTER */
1079 dd_emit(ctx, 1, 0xcf); /* 000000ff eng2d DRAW_COLOR_FORMAT */
1080 dd_emit(ctx, 1, 0xcf); /* 000000ff eng2d SRC_FORMAT */
1081 dd_emit(ctx, 1, 1); /* 00000001 eng2d SRC_LINEAR #2 */
1082
1083 num = ctx->ctxvals_pos - base;
1084 ctx->ctxvals_pos = base;
1085 if (IS_NVA3F(dev_priv->chipset))
1086 cp_ctx(ctx, 0x404800, num);
1087 else
1088 cp_ctx(ctx, 0x405400, num);
1089}
1090
951/* 1091/*
952 * xfer areas. These are a pain. 1092 * xfer areas. These are a pain.
953 * 1093 *
@@ -990,28 +1130,33 @@ nv50_graph_construct_mmio(struct nouveau_grctx *ctx)
990 * without the help of ctxprog. 1130 * without the help of ctxprog.
991 */ 1131 */
992 1132
993static inline void 1133static void
994xf_emit(struct nouveau_grctx *ctx, int num, uint32_t val) { 1134xf_emit(struct nouveau_grctx *ctx, int num, uint32_t val) {
995 int i; 1135 int i;
996 if (val && ctx->mode == NOUVEAU_GRCTX_VALS) 1136 if (val && ctx->mode == NOUVEAU_GRCTX_VALS)
997 for (i = 0; i < num; i++) 1137 for (i = 0; i < num; i++)
998 nv_wo32(ctx->dev, ctx->data, ctx->ctxvals_pos + (i << 3), val); 1138 nv_wo32(ctx->data, 4 * (ctx->ctxvals_pos + (i << 3)), val);
999 ctx->ctxvals_pos += num << 3; 1139 ctx->ctxvals_pos += num << 3;
1000} 1140}
1001 1141
1002/* Gene declarations... */ 1142/* Gene declarations... */
1003 1143
1144static void nv50_graph_construct_gene_dispatch(struct nouveau_grctx *ctx);
1004static void nv50_graph_construct_gene_m2mf(struct nouveau_grctx *ctx); 1145static void nv50_graph_construct_gene_m2mf(struct nouveau_grctx *ctx);
1005static void nv50_graph_construct_gene_unk1(struct nouveau_grctx *ctx); 1146static void nv50_graph_construct_gene_ccache(struct nouveau_grctx *ctx);
1006static void nv50_graph_construct_gene_unk2(struct nouveau_grctx *ctx); 1147static void nv50_graph_construct_gene_unk10xx(struct nouveau_grctx *ctx);
1007static void nv50_graph_construct_gene_unk3(struct nouveau_grctx *ctx); 1148static void nv50_graph_construct_gene_unk14xx(struct nouveau_grctx *ctx);
1008static void nv50_graph_construct_gene_unk4(struct nouveau_grctx *ctx); 1149static void nv50_graph_construct_gene_zcull(struct nouveau_grctx *ctx);
1009static void nv50_graph_construct_gene_unk5(struct nouveau_grctx *ctx); 1150static void nv50_graph_construct_gene_clipid(struct nouveau_grctx *ctx);
1010static void nv50_graph_construct_gene_unk6(struct nouveau_grctx *ctx); 1151static void nv50_graph_construct_gene_unk24xx(struct nouveau_grctx *ctx);
1011static void nv50_graph_construct_gene_unk7(struct nouveau_grctx *ctx); 1152static void nv50_graph_construct_gene_vfetch(struct nouveau_grctx *ctx);
1012static void nv50_graph_construct_gene_unk8(struct nouveau_grctx *ctx); 1153static void nv50_graph_construct_gene_eng2d(struct nouveau_grctx *ctx);
1013static void nv50_graph_construct_gene_unk9(struct nouveau_grctx *ctx); 1154static void nv50_graph_construct_gene_csched(struct nouveau_grctx *ctx);
1014static void nv50_graph_construct_gene_unk10(struct nouveau_grctx *ctx); 1155static void nv50_graph_construct_gene_unk1cxx(struct nouveau_grctx *ctx);
1156static void nv50_graph_construct_gene_strmout(struct nouveau_grctx *ctx);
1157static void nv50_graph_construct_gene_unk34xx(struct nouveau_grctx *ctx);
1158static void nv50_graph_construct_gene_ropm1(struct nouveau_grctx *ctx);
1159static void nv50_graph_construct_gene_ropm2(struct nouveau_grctx *ctx);
1015static void nv50_graph_construct_gene_ropc(struct nouveau_grctx *ctx); 1160static void nv50_graph_construct_gene_ropc(struct nouveau_grctx *ctx);
1016static void nv50_graph_construct_xfer_tp(struct nouveau_grctx *ctx); 1161static void nv50_graph_construct_xfer_tp(struct nouveau_grctx *ctx);
1017 1162
@@ -1030,102 +1175,32 @@ nv50_graph_construct_xfer1(struct nouveau_grctx *ctx)
1030 if (dev_priv->chipset < 0xa0) { 1175 if (dev_priv->chipset < 0xa0) {
1031 /* Strand 0 */ 1176 /* Strand 0 */
1032 ctx->ctxvals_pos = offset; 1177 ctx->ctxvals_pos = offset;
1033 switch (dev_priv->chipset) { 1178 nv50_graph_construct_gene_dispatch(ctx);
1034 case 0x50: 1179 nv50_graph_construct_gene_m2mf(ctx);
1035 xf_emit(ctx, 0x99, 0); 1180 nv50_graph_construct_gene_unk24xx(ctx);
1036 break; 1181 nv50_graph_construct_gene_clipid(ctx);
1037 case 0x84: 1182 nv50_graph_construct_gene_zcull(ctx);
1038 case 0x86:
1039 xf_emit(ctx, 0x384, 0);
1040 break;
1041 case 0x92:
1042 case 0x94:
1043 case 0x96:
1044 case 0x98:
1045 xf_emit(ctx, 0x380, 0);
1046 break;
1047 }
1048 nv50_graph_construct_gene_m2mf (ctx);
1049 switch (dev_priv->chipset) {
1050 case 0x50:
1051 case 0x84:
1052 case 0x86:
1053 case 0x98:
1054 xf_emit(ctx, 0x4c4, 0);
1055 break;
1056 case 0x92:
1057 case 0x94:
1058 case 0x96:
1059 xf_emit(ctx, 0x984, 0);
1060 break;
1061 }
1062 nv50_graph_construct_gene_unk5(ctx);
1063 if (dev_priv->chipset == 0x50)
1064 xf_emit(ctx, 0xa, 0);
1065 else
1066 xf_emit(ctx, 0xb, 0);
1067 nv50_graph_construct_gene_unk4(ctx);
1068 nv50_graph_construct_gene_unk3(ctx);
1069 if ((ctx->ctxvals_pos-offset)/8 > size) 1183 if ((ctx->ctxvals_pos-offset)/8 > size)
1070 size = (ctx->ctxvals_pos-offset)/8; 1184 size = (ctx->ctxvals_pos-offset)/8;
1071 1185
1072 /* Strand 1 */ 1186 /* Strand 1 */
1073 ctx->ctxvals_pos = offset + 0x1; 1187 ctx->ctxvals_pos = offset + 0x1;
1074 nv50_graph_construct_gene_unk6(ctx); 1188 nv50_graph_construct_gene_vfetch(ctx);
1075 nv50_graph_construct_gene_unk7(ctx); 1189 nv50_graph_construct_gene_eng2d(ctx);
1076 nv50_graph_construct_gene_unk8(ctx); 1190 nv50_graph_construct_gene_csched(ctx);
1077 switch (dev_priv->chipset) { 1191 nv50_graph_construct_gene_ropm1(ctx);
1078 case 0x50: 1192 nv50_graph_construct_gene_ropm2(ctx);
1079 case 0x92:
1080 xf_emit(ctx, 0xfb, 0);
1081 break;
1082 case 0x84:
1083 xf_emit(ctx, 0xd3, 0);
1084 break;
1085 case 0x94:
1086 case 0x96:
1087 xf_emit(ctx, 0xab, 0);
1088 break;
1089 case 0x86:
1090 case 0x98:
1091 xf_emit(ctx, 0x6b, 0);
1092 break;
1093 }
1094 xf_emit(ctx, 2, 0x4e3bfdf);
1095 xf_emit(ctx, 4, 0);
1096 xf_emit(ctx, 1, 0x0fac6881);
1097 xf_emit(ctx, 0xb, 0);
1098 xf_emit(ctx, 2, 0x4e3bfdf);
1099 if ((ctx->ctxvals_pos-offset)/8 > size) 1193 if ((ctx->ctxvals_pos-offset)/8 > size)
1100 size = (ctx->ctxvals_pos-offset)/8; 1194 size = (ctx->ctxvals_pos-offset)/8;
1101 1195
1102 /* Strand 2 */ 1196 /* Strand 2 */
1103 ctx->ctxvals_pos = offset + 0x2; 1197 ctx->ctxvals_pos = offset + 0x2;
1104 switch (dev_priv->chipset) { 1198 nv50_graph_construct_gene_ccache(ctx);
1105 case 0x50: 1199 nv50_graph_construct_gene_unk1cxx(ctx);
1106 case 0x92: 1200 nv50_graph_construct_gene_strmout(ctx);
1107 xf_emit(ctx, 0xa80, 0); 1201 nv50_graph_construct_gene_unk14xx(ctx);
1108 break; 1202 nv50_graph_construct_gene_unk10xx(ctx);
1109 case 0x84: 1203 nv50_graph_construct_gene_unk34xx(ctx);
1110 xf_emit(ctx, 0xa7e, 0);
1111 break;
1112 case 0x94:
1113 case 0x96:
1114 xf_emit(ctx, 0xa7c, 0);
1115 break;
1116 case 0x86:
1117 case 0x98:
1118 xf_emit(ctx, 0xa7a, 0);
1119 break;
1120 }
1121 xf_emit(ctx, 1, 0x3fffff);
1122 xf_emit(ctx, 2, 0);
1123 xf_emit(ctx, 1, 0x1fff);
1124 xf_emit(ctx, 0xe, 0);
1125 nv50_graph_construct_gene_unk9(ctx);
1126 nv50_graph_construct_gene_unk2(ctx);
1127 nv50_graph_construct_gene_unk1(ctx);
1128 nv50_graph_construct_gene_unk10(ctx);
1129 if ((ctx->ctxvals_pos-offset)/8 > size) 1204 if ((ctx->ctxvals_pos-offset)/8 > size)
1130 size = (ctx->ctxvals_pos-offset)/8; 1205 size = (ctx->ctxvals_pos-offset)/8;
1131 1206
@@ -1150,86 +1225,46 @@ nv50_graph_construct_xfer1(struct nouveau_grctx *ctx)
1150 } else { 1225 } else {
1151 /* Strand 0 */ 1226 /* Strand 0 */
1152 ctx->ctxvals_pos = offset; 1227 ctx->ctxvals_pos = offset;
1153 if (dev_priv->chipset > 0xa0 && dev_priv->chipset < 0xaa) 1228 nv50_graph_construct_gene_dispatch(ctx);
1154 xf_emit(ctx, 0x385, 0);
1155 else
1156 xf_emit(ctx, 0x384, 0);
1157 nv50_graph_construct_gene_m2mf(ctx); 1229 nv50_graph_construct_gene_m2mf(ctx);
1158 xf_emit(ctx, 0x950, 0); 1230 nv50_graph_construct_gene_unk34xx(ctx);
1159 nv50_graph_construct_gene_unk10(ctx); 1231 nv50_graph_construct_gene_csched(ctx);
1160 xf_emit(ctx, 1, 0x0fac6881); 1232 nv50_graph_construct_gene_unk1cxx(ctx);
1161 if (dev_priv->chipset > 0xa0 && dev_priv->chipset < 0xaa) { 1233 nv50_graph_construct_gene_strmout(ctx);
1162 xf_emit(ctx, 1, 1);
1163 xf_emit(ctx, 3, 0);
1164 }
1165 nv50_graph_construct_gene_unk8(ctx);
1166 if (dev_priv->chipset == 0xa0)
1167 xf_emit(ctx, 0x189, 0);
1168 else if (dev_priv->chipset == 0xa3)
1169 xf_emit(ctx, 0xd5, 0);
1170 else if (dev_priv->chipset == 0xa5)
1171 xf_emit(ctx, 0x99, 0);
1172 else if (dev_priv->chipset == 0xaa)
1173 xf_emit(ctx, 0x65, 0);
1174 else
1175 xf_emit(ctx, 0x6d, 0);
1176 nv50_graph_construct_gene_unk9(ctx);
1177 if ((ctx->ctxvals_pos-offset)/8 > size) 1234 if ((ctx->ctxvals_pos-offset)/8 > size)
1178 size = (ctx->ctxvals_pos-offset)/8; 1235 size = (ctx->ctxvals_pos-offset)/8;
1179 1236
1180 /* Strand 1 */ 1237 /* Strand 1 */
1181 ctx->ctxvals_pos = offset + 1; 1238 ctx->ctxvals_pos = offset + 1;
1182 nv50_graph_construct_gene_unk1(ctx); 1239 nv50_graph_construct_gene_unk10xx(ctx);
1183 if ((ctx->ctxvals_pos-offset)/8 > size) 1240 if ((ctx->ctxvals_pos-offset)/8 > size)
1184 size = (ctx->ctxvals_pos-offset)/8; 1241 size = (ctx->ctxvals_pos-offset)/8;
1185 1242
1186 /* Strand 2 */ 1243 /* Strand 2 */
1187 ctx->ctxvals_pos = offset + 2; 1244 ctx->ctxvals_pos = offset + 2;
1188 if (dev_priv->chipset == 0xa0) { 1245 if (dev_priv->chipset == 0xa0)
1189 nv50_graph_construct_gene_unk2(ctx); 1246 nv50_graph_construct_gene_unk14xx(ctx);
1190 } 1247 nv50_graph_construct_gene_unk24xx(ctx);
1191 xf_emit(ctx, 0x36, 0);
1192 nv50_graph_construct_gene_unk5(ctx);
1193 if ((ctx->ctxvals_pos-offset)/8 > size) 1248 if ((ctx->ctxvals_pos-offset)/8 > size)
1194 size = (ctx->ctxvals_pos-offset)/8; 1249 size = (ctx->ctxvals_pos-offset)/8;
1195 1250
1196 /* Strand 3 */ 1251 /* Strand 3 */
1197 ctx->ctxvals_pos = offset + 3; 1252 ctx->ctxvals_pos = offset + 3;
1198 xf_emit(ctx, 1, 0); 1253 nv50_graph_construct_gene_vfetch(ctx);
1199 xf_emit(ctx, 1, 1);
1200 nv50_graph_construct_gene_unk6(ctx);
1201 if ((ctx->ctxvals_pos-offset)/8 > size) 1254 if ((ctx->ctxvals_pos-offset)/8 > size)
1202 size = (ctx->ctxvals_pos-offset)/8; 1255 size = (ctx->ctxvals_pos-offset)/8;
1203 1256
1204 /* Strand 4 */ 1257 /* Strand 4 */
1205 ctx->ctxvals_pos = offset + 4; 1258 ctx->ctxvals_pos = offset + 4;
1206 if (dev_priv->chipset == 0xa0) 1259 nv50_graph_construct_gene_ccache(ctx);
1207 xf_emit(ctx, 0xa80, 0);
1208 else if (dev_priv->chipset == 0xa3)
1209 xf_emit(ctx, 0xa7c, 0);
1210 else
1211 xf_emit(ctx, 0xa7a, 0);
1212 xf_emit(ctx, 1, 0x3fffff);
1213 xf_emit(ctx, 2, 0);
1214 xf_emit(ctx, 1, 0x1fff);
1215 if ((ctx->ctxvals_pos-offset)/8 > size) 1260 if ((ctx->ctxvals_pos-offset)/8 > size)
1216 size = (ctx->ctxvals_pos-offset)/8; 1261 size = (ctx->ctxvals_pos-offset)/8;
1217 1262
1218 /* Strand 5 */ 1263 /* Strand 5 */
1219 ctx->ctxvals_pos = offset + 5; 1264 ctx->ctxvals_pos = offset + 5;
1220 xf_emit(ctx, 1, 0); 1265 nv50_graph_construct_gene_ropm2(ctx);
1221 xf_emit(ctx, 1, 0x0fac6881); 1266 nv50_graph_construct_gene_ropm1(ctx);
1222 xf_emit(ctx, 0xb, 0); 1267 /* per-ROP context */
1223 xf_emit(ctx, 2, 0x4e3bfdf);
1224 xf_emit(ctx, 3, 0);
1225 if (dev_priv->chipset > 0xa0 && dev_priv->chipset < 0xaa)
1226 xf_emit(ctx, 1, 0x11);
1227 xf_emit(ctx, 1, 0);
1228 xf_emit(ctx, 2, 0x4e3bfdf);
1229 xf_emit(ctx, 2, 0);
1230 if (dev_priv->chipset > 0xa0 && dev_priv->chipset < 0xaa)
1231 xf_emit(ctx, 1, 0x11);
1232 xf_emit(ctx, 1, 0);
1233 for (i = 0; i < 8; i++) 1268 for (i = 0; i < 8; i++)
1234 if (units & (1<<(i+16))) 1269 if (units & (1<<(i+16)))
1235 nv50_graph_construct_gene_ropc(ctx); 1270 nv50_graph_construct_gene_ropc(ctx);
@@ -1238,10 +1273,9 @@ nv50_graph_construct_xfer1(struct nouveau_grctx *ctx)
1238 1273
1239 /* Strand 6 */ 1274 /* Strand 6 */
1240 ctx->ctxvals_pos = offset + 6; 1275 ctx->ctxvals_pos = offset + 6;
1241 nv50_graph_construct_gene_unk3(ctx); 1276 nv50_graph_construct_gene_zcull(ctx);
1242 xf_emit(ctx, 0xb, 0); 1277 nv50_graph_construct_gene_clipid(ctx);
1243 nv50_graph_construct_gene_unk4(ctx); 1278 nv50_graph_construct_gene_eng2d(ctx);
1244 nv50_graph_construct_gene_unk7(ctx);
1245 if (units & (1 << 0)) 1279 if (units & (1 << 0))
1246 nv50_graph_construct_xfer_tp(ctx); 1280 nv50_graph_construct_xfer_tp(ctx);
1247 if (units & (1 << 1)) 1281 if (units & (1 << 1))
@@ -1269,7 +1303,7 @@ nv50_graph_construct_xfer1(struct nouveau_grctx *ctx)
1269 if (units & (1 << 9)) 1303 if (units & (1 << 9))
1270 nv50_graph_construct_xfer_tp(ctx); 1304 nv50_graph_construct_xfer_tp(ctx);
1271 } else { 1305 } else {
1272 nv50_graph_construct_gene_unk2(ctx); 1306 nv50_graph_construct_gene_unk14xx(ctx);
1273 } 1307 }
1274 if ((ctx->ctxvals_pos-offset)/8 > size) 1308 if ((ctx->ctxvals_pos-offset)/8 > size)
1275 size = (ctx->ctxvals_pos-offset)/8; 1309 size = (ctx->ctxvals_pos-offset)/8;
@@ -1290,9 +1324,70 @@ nv50_graph_construct_xfer1(struct nouveau_grctx *ctx)
1290 */ 1324 */
1291 1325
1292static void 1326static void
1327nv50_graph_construct_gene_dispatch(struct nouveau_grctx *ctx)
1328{
1329 /* start of strand 0 */
1330 struct drm_nouveau_private *dev_priv = ctx->dev->dev_private;
1331 /* SEEK */
1332 if (dev_priv->chipset == 0x50)
1333 xf_emit(ctx, 5, 0);
1334 else if (!IS_NVA3F(dev_priv->chipset))
1335 xf_emit(ctx, 6, 0);
1336 else
1337 xf_emit(ctx, 4, 0);
1338 /* SEEK */
1339 /* the PGRAPH's internal FIFO */
1340 if (dev_priv->chipset == 0x50)
1341 xf_emit(ctx, 8*3, 0);
1342 else
1343 xf_emit(ctx, 0x100*3, 0);
1344 /* and another bonus slot?!? */
1345 xf_emit(ctx, 3, 0);
1346 /* and YET ANOTHER bonus slot? */
1347 if (IS_NVA3F(dev_priv->chipset))
1348 xf_emit(ctx, 3, 0);
1349 /* SEEK */
1350 /* CTX_SWITCH: caches of gr objects bound to subchannels. 8 values, last used index */
1351 xf_emit(ctx, 9, 0);
1352 /* SEEK */
1353 xf_emit(ctx, 9, 0);
1354 /* SEEK */
1355 xf_emit(ctx, 9, 0);
1356 /* SEEK */
1357 xf_emit(ctx, 9, 0);
1358 /* SEEK */
1359 if (dev_priv->chipset < 0x90)
1360 xf_emit(ctx, 4, 0);
1361 /* SEEK */
1362 xf_emit(ctx, 2, 0);
1363 /* SEEK */
1364 xf_emit(ctx, 6*2, 0);
1365 xf_emit(ctx, 2, 0);
1366 /* SEEK */
1367 xf_emit(ctx, 2, 0);
1368 /* SEEK */
1369 xf_emit(ctx, 6*2, 0);
1370 xf_emit(ctx, 2, 0);
1371 /* SEEK */
1372 if (dev_priv->chipset == 0x50)
1373 xf_emit(ctx, 0x1c, 0);
1374 else if (dev_priv->chipset < 0xa0)
1375 xf_emit(ctx, 0x1e, 0);
1376 else
1377 xf_emit(ctx, 0x22, 0);
1378 /* SEEK */
1379 xf_emit(ctx, 0x15, 0);
1380}
1381
1382static void
1293nv50_graph_construct_gene_m2mf(struct nouveau_grctx *ctx) 1383nv50_graph_construct_gene_m2mf(struct nouveau_grctx *ctx)
1294{ 1384{
1295 /* m2mf state */ 1385 /* Strand 0, right after dispatch */
1386 struct drm_nouveau_private *dev_priv = ctx->dev->dev_private;
1387 int smallm2mf = 0;
1388 if (dev_priv->chipset < 0x92 || dev_priv->chipset == 0x98)
1389 smallm2mf = 1;
1390 /* SEEK */
1296 xf_emit (ctx, 1, 0); /* DMA_NOTIFY instance >> 4 */ 1391 xf_emit (ctx, 1, 0); /* DMA_NOTIFY instance >> 4 */
1297 xf_emit (ctx, 1, 0); /* DMA_BUFFER_IN instance >> 4 */ 1392 xf_emit (ctx, 1, 0); /* DMA_BUFFER_IN instance >> 4 */
1298 xf_emit (ctx, 1, 0); /* DMA_BUFFER_OUT instance >> 4 */ 1393 xf_emit (ctx, 1, 0); /* DMA_BUFFER_OUT instance >> 4 */
@@ -1319,427 +1414,973 @@ nv50_graph_construct_gene_m2mf(struct nouveau_grctx *ctx)
1319 xf_emit (ctx, 1, 0); /* TILING_POSITION_OUT */ 1414 xf_emit (ctx, 1, 0); /* TILING_POSITION_OUT */
1320 xf_emit (ctx, 1, 0); /* OFFSET_IN_HIGH */ 1415 xf_emit (ctx, 1, 0); /* OFFSET_IN_HIGH */
1321 xf_emit (ctx, 1, 0); /* OFFSET_OUT_HIGH */ 1416 xf_emit (ctx, 1, 0); /* OFFSET_OUT_HIGH */
1417 /* SEEK */
1418 if (smallm2mf)
1419 xf_emit(ctx, 0x40, 0); /* 20 * ffffffff, 3ffff */
1420 else
1421 xf_emit(ctx, 0x100, 0); /* 80 * ffffffff, 3ffff */
1422 xf_emit(ctx, 4, 0); /* 1f/7f, 0, 1f/7f, 0 [1f for smallm2mf, 7f otherwise] */
1423 /* SEEK */
1424 if (smallm2mf)
1425 xf_emit(ctx, 0x400, 0); /* ffffffff */
1426 else
1427 xf_emit(ctx, 0x800, 0); /* ffffffff */
1428 xf_emit(ctx, 4, 0); /* ff/1ff, 0, 0, 0 [ff for smallm2mf, 1ff otherwise] */
1429 /* SEEK */
1430 xf_emit(ctx, 0x40, 0); /* 20 * bits ffffffff, 3ffff */
1431 xf_emit(ctx, 0x6, 0); /* 1f, 0, 1f, 0, 1f, 0 */
1322} 1432}
1323 1433
1324static void 1434static void
1325nv50_graph_construct_gene_unk1(struct nouveau_grctx *ctx) 1435nv50_graph_construct_gene_ccache(struct nouveau_grctx *ctx)
1326{ 1436{
1327 struct drm_nouveau_private *dev_priv = ctx->dev->dev_private; 1437 struct drm_nouveau_private *dev_priv = ctx->dev->dev_private;
1328 /* end of area 2 on pre-NVA0, area 1 on NVAx */ 1438 xf_emit(ctx, 2, 0); /* RO */
1329 xf_emit(ctx, 2, 4); 1439 xf_emit(ctx, 0x800, 0); /* ffffffff */
1330 xf_emit(ctx, 1, 0);
1331 xf_emit(ctx, 1, 0x80);
1332 xf_emit(ctx, 1, 4);
1333 xf_emit(ctx, 1, 0x80c14);
1334 xf_emit(ctx, 1, 0);
1335 if (dev_priv->chipset == 0x50)
1336 xf_emit(ctx, 1, 0x3ff);
1337 else
1338 xf_emit(ctx, 1, 0x7ff);
1339 switch (dev_priv->chipset) { 1440 switch (dev_priv->chipset) {
1340 case 0x50: 1441 case 0x50:
1341 case 0x86: 1442 case 0x92:
1342 case 0x98: 1443 case 0xa0:
1343 case 0xaa: 1444 xf_emit(ctx, 0x2b, 0);
1344 case 0xac:
1345 xf_emit(ctx, 0x542, 0);
1346 break; 1445 break;
1347 case 0x84: 1446 case 0x84:
1348 case 0x92: 1447 xf_emit(ctx, 0x29, 0);
1448 break;
1349 case 0x94: 1449 case 0x94:
1350 case 0x96: 1450 case 0x96:
1351 xf_emit(ctx, 0x942, 0);
1352 break;
1353 case 0xa0:
1354 case 0xa3: 1451 case 0xa3:
1355 xf_emit(ctx, 0x2042, 0); 1452 xf_emit(ctx, 0x27, 0);
1356 break; 1453 break;
1454 case 0x86:
1455 case 0x98:
1357 case 0xa5: 1456 case 0xa5:
1358 case 0xa8: 1457 case 0xa8:
1359 xf_emit(ctx, 0x842, 0); 1458 case 0xaa:
1459 case 0xac:
1460 case 0xaf:
1461 xf_emit(ctx, 0x25, 0);
1360 break; 1462 break;
1361 } 1463 }
1362 xf_emit(ctx, 2, 4); 1464 /* CB bindings, 0x80 of them. first word is address >> 8, second is
1363 xf_emit(ctx, 1, 0); 1465 * size >> 4 | valid << 24 */
1364 xf_emit(ctx, 1, 0x80); 1466 xf_emit(ctx, 0x100, 0); /* ffffffff CB_DEF */
1365 xf_emit(ctx, 1, 4); 1467 xf_emit(ctx, 1, 0); /* 0000007f CB_ADDR_BUFFER */
1366 xf_emit(ctx, 1, 1); 1468 xf_emit(ctx, 1, 0); /* 0 */
1367 xf_emit(ctx, 1, 0); 1469 xf_emit(ctx, 0x30, 0); /* ff SET_PROGRAM_CB */
1368 xf_emit(ctx, 1, 0x27); 1470 xf_emit(ctx, 1, 0); /* 3f last SET_PROGRAM_CB */
1369 xf_emit(ctx, 1, 0); 1471 xf_emit(ctx, 4, 0); /* RO */
1370 xf_emit(ctx, 1, 0x26); 1472 xf_emit(ctx, 0x100, 0); /* ffffffff */
1371 xf_emit(ctx, 3, 0); 1473 xf_emit(ctx, 8, 0); /* 1f, 0, 0, ... */
1474 xf_emit(ctx, 8, 0); /* ffffffff */
1475 xf_emit(ctx, 4, 0); /* ffffffff */
1476 xf_emit(ctx, 1, 0); /* 3 */
1477 xf_emit(ctx, 1, 0); /* ffffffff */
1478 xf_emit(ctx, 1, 0); /* 0000ffff DMA_CODE_CB */
1479 xf_emit(ctx, 1, 0); /* 0000ffff DMA_TIC */
1480 xf_emit(ctx, 1, 0); /* 0000ffff DMA_TSC */
1481 xf_emit(ctx, 1, 0); /* 00000001 LINKED_TSC */
1482 xf_emit(ctx, 1, 0); /* 000000ff TIC_ADDRESS_HIGH */
1483 xf_emit(ctx, 1, 0); /* ffffffff TIC_ADDRESS_LOW */
1484 xf_emit(ctx, 1, 0x3fffff); /* 003fffff TIC_LIMIT */
1485 xf_emit(ctx, 1, 0); /* 000000ff TSC_ADDRESS_HIGH */
1486 xf_emit(ctx, 1, 0); /* ffffffff TSC_ADDRESS_LOW */
1487 xf_emit(ctx, 1, 0x1fff); /* 000fffff TSC_LIMIT */
1488 xf_emit(ctx, 1, 0); /* 000000ff VP_ADDRESS_HIGH */
1489 xf_emit(ctx, 1, 0); /* ffffffff VP_ADDRESS_LOW */
1490 xf_emit(ctx, 1, 0); /* 00ffffff VP_START_ID */
1491 xf_emit(ctx, 1, 0); /* 000000ff CB_DEF_ADDRESS_HIGH */
1492 xf_emit(ctx, 1, 0); /* ffffffff CB_DEF_ADDRESS_LOW */
1493 xf_emit(ctx, 1, 0); /* 00000001 GP_ENABLE */
1494 xf_emit(ctx, 1, 0); /* 000000ff GP_ADDRESS_HIGH */
1495 xf_emit(ctx, 1, 0); /* ffffffff GP_ADDRESS_LOW */
1496 xf_emit(ctx, 1, 0); /* 00ffffff GP_START_ID */
1497 xf_emit(ctx, 1, 0); /* 000000ff FP_ADDRESS_HIGH */
1498 xf_emit(ctx, 1, 0); /* ffffffff FP_ADDRESS_LOW */
1499 xf_emit(ctx, 1, 0); /* 00ffffff FP_START_ID */
1372} 1500}
1373 1501
1374static void 1502static void
1375nv50_graph_construct_gene_unk10(struct nouveau_grctx *ctx) 1503nv50_graph_construct_gene_unk10xx(struct nouveau_grctx *ctx)
1376{ 1504{
1505 struct drm_nouveau_private *dev_priv = ctx->dev->dev_private;
1506 int i;
1377 /* end of area 2 on pre-NVA0, area 1 on NVAx */ 1507 /* end of area 2 on pre-NVA0, area 1 on NVAx */
1378 xf_emit(ctx, 0x10, 0x04000000); 1508 xf_emit(ctx, 1, 4); /* 000000ff GP_RESULT_MAP_SIZE */
1379 xf_emit(ctx, 0x24, 0); 1509 xf_emit(ctx, 1, 4); /* 0000007f VP_RESULT_MAP_SIZE */
1380 xf_emit(ctx, 2, 0x04e3bfdf); 1510 xf_emit(ctx, 1, 0); /* 00000001 GP_ENABLE */
1381 xf_emit(ctx, 2, 0); 1511 xf_emit(ctx, 1, 0x80); /* 0000ffff GP_VERTEX_OUTPUT_COUNT */
1382 xf_emit(ctx, 1, 0x1fe21); 1512 xf_emit(ctx, 1, 4); /* 000000ff GP_REG_ALLOC_RESULT */
1513 xf_emit(ctx, 1, 0x80c14); /* 01ffffff SEMANTIC_COLOR */
1514 xf_emit(ctx, 1, 0); /* 00000001 VERTEX_TWO_SIDE_ENABLE */
1515 if (dev_priv->chipset == 0x50)
1516 xf_emit(ctx, 1, 0x3ff);
1517 else
1518 xf_emit(ctx, 1, 0x7ff); /* 000007ff */
1519 xf_emit(ctx, 1, 0); /* 111/113 */
1520 xf_emit(ctx, 1, 0); /* ffffffff tesla UNK1A30 */
1521 for (i = 0; i < 8; i++) {
1522 switch (dev_priv->chipset) {
1523 case 0x50:
1524 case 0x86:
1525 case 0x98:
1526 case 0xaa:
1527 case 0xac:
1528 xf_emit(ctx, 0xa0, 0); /* ffffffff */
1529 break;
1530 case 0x84:
1531 case 0x92:
1532 case 0x94:
1533 case 0x96:
1534 xf_emit(ctx, 0x120, 0);
1535 break;
1536 case 0xa5:
1537 case 0xa8:
1538 xf_emit(ctx, 0x100, 0); /* ffffffff */
1539 break;
1540 case 0xa0:
1541 case 0xa3:
1542 case 0xaf:
1543 xf_emit(ctx, 0x400, 0); /* ffffffff */
1544 break;
1545 }
1546 xf_emit(ctx, 4, 0); /* 3f, 0, 0, 0 */
1547 xf_emit(ctx, 4, 0); /* ffffffff */
1548 }
1549 xf_emit(ctx, 1, 4); /* 000000ff GP_RESULT_MAP_SIZE */
1550 xf_emit(ctx, 1, 4); /* 0000007f VP_RESULT_MAP_SIZE */
1551 xf_emit(ctx, 1, 0); /* 00000001 GP_ENABLE */
1552 xf_emit(ctx, 1, 0x80); /* 0000ffff GP_VERTEX_OUTPUT_COUNT */
1553 xf_emit(ctx, 1, 4); /* 000000ff GP_REG_ALLOC_TEMP */
1554 xf_emit(ctx, 1, 1); /* 00000001 RASTERIZE_ENABLE */
1555 xf_emit(ctx, 1, 0); /* 00000001 tesla UNK1900 */
1556 xf_emit(ctx, 1, 0x27); /* 000000ff UNK0FD4 */
1557 xf_emit(ctx, 1, 0); /* 0001ffff GP_BUILTIN_RESULT_EN */
1558 xf_emit(ctx, 1, 0x26); /* 000000ff SEMANTIC_LAYER */
1559 xf_emit(ctx, 1, 0); /* ffffffff tesla UNK1A30 */
1560}
1561
1562static void
1563nv50_graph_construct_gene_unk34xx(struct nouveau_grctx *ctx)
1564{
1565 struct drm_nouveau_private *dev_priv = ctx->dev->dev_private;
1566 /* end of area 2 on pre-NVA0, area 1 on NVAx */
1567 xf_emit(ctx, 1, 0); /* 00000001 VIEWPORT_CLIP_RECTS_EN */
1568 xf_emit(ctx, 1, 0); /* 00000003 VIEWPORT_CLIP_MODE */
1569 xf_emit(ctx, 0x10, 0x04000000); /* 07ffffff VIEWPORT_CLIP_HORIZ*8, VIEWPORT_CLIP_VERT*8 */
1570 xf_emit(ctx, 1, 0); /* 00000001 POLYGON_STIPPLE_ENABLE */
1571 xf_emit(ctx, 0x20, 0); /* ffffffff POLYGON_STIPPLE */
1572 xf_emit(ctx, 2, 0); /* 00007fff WINDOW_OFFSET_XY */
1573 xf_emit(ctx, 1, 0); /* ffff0ff3 */
1574 xf_emit(ctx, 1, 0x04e3bfdf); /* ffffffff UNK0D64 */
1575 xf_emit(ctx, 1, 0x04e3bfdf); /* ffffffff UNK0DF4 */
1576 xf_emit(ctx, 1, 0); /* 00000003 WINDOW_ORIGIN */
1577 xf_emit(ctx, 1, 0); /* 00000007 */
1578 xf_emit(ctx, 1, 0x1fe21); /* 0001ffff tesla UNK0FAC */
1579 if (dev_priv->chipset >= 0xa0)
1580 xf_emit(ctx, 1, 0x0fac6881);
1581 if (IS_NVA3F(dev_priv->chipset)) {
1582 xf_emit(ctx, 1, 1);
1583 xf_emit(ctx, 3, 0);
1584 }
1383} 1585}
1384 1586
1385static void 1587static void
1386nv50_graph_construct_gene_unk2(struct nouveau_grctx *ctx) 1588nv50_graph_construct_gene_unk14xx(struct nouveau_grctx *ctx)
1387{ 1589{
1388 struct drm_nouveau_private *dev_priv = ctx->dev->dev_private; 1590 struct drm_nouveau_private *dev_priv = ctx->dev->dev_private;
1389 /* middle of area 2 on pre-NVA0, beginning of area 2 on NVA0, area 7 on >NVA0 */ 1591 /* middle of area 2 on pre-NVA0, beginning of area 2 on NVA0, area 7 on >NVA0 */
1390 if (dev_priv->chipset != 0x50) { 1592 if (dev_priv->chipset != 0x50) {
1391 xf_emit(ctx, 5, 0); 1593 xf_emit(ctx, 5, 0); /* ffffffff */
1392 xf_emit(ctx, 1, 0x80c14); 1594 xf_emit(ctx, 1, 0x80c14); /* 01ffffff SEMANTIC_COLOR */
1393 xf_emit(ctx, 2, 0); 1595 xf_emit(ctx, 1, 0); /* 00000001 */
1394 xf_emit(ctx, 1, 0x804); 1596 xf_emit(ctx, 1, 0); /* 000003ff */
1395 xf_emit(ctx, 1, 0); 1597 xf_emit(ctx, 1, 0x804); /* 00000fff SEMANTIC_CLIP */
1396 xf_emit(ctx, 2, 4); 1598 xf_emit(ctx, 1, 0); /* 00000001 */
1397 xf_emit(ctx, 1, 0x8100c12); 1599 xf_emit(ctx, 2, 4); /* 7f, ff */
1600 xf_emit(ctx, 1, 0x8100c12); /* 1fffffff FP_INTERPOLANT_CTRL */
1398 } 1601 }
1399 xf_emit(ctx, 1, 0); 1602 xf_emit(ctx, 1, 0); /* ffffffff tesla UNK1A30 */
1400 xf_emit(ctx, 2, 4); 1603 xf_emit(ctx, 1, 4); /* 0000007f VP_RESULT_MAP_SIZE */
1401 xf_emit(ctx, 1, 0); 1604 xf_emit(ctx, 1, 4); /* 000000ff GP_RESULT_MAP_SIZE */
1402 xf_emit(ctx, 1, 0x10); 1605 xf_emit(ctx, 1, 0); /* 00000001 GP_ENABLE */
1403 if (dev_priv->chipset == 0x50) 1606 xf_emit(ctx, 1, 0x10); /* 7f/ff VIEW_VOLUME_CLIP_CTRL */
1404 xf_emit(ctx, 3, 0); 1607 xf_emit(ctx, 1, 0); /* 000000ff VP_CLIP_DISTANCE_ENABLE */
1405 else
1406 xf_emit(ctx, 4, 0);
1407 xf_emit(ctx, 1, 0x804);
1408 xf_emit(ctx, 1, 1);
1409 xf_emit(ctx, 1, 0x1a);
1410 if (dev_priv->chipset != 0x50) 1608 if (dev_priv->chipset != 0x50)
1411 xf_emit(ctx, 1, 0x7f); 1609 xf_emit(ctx, 1, 0); /* 3ff */
1412 xf_emit(ctx, 1, 0); 1610 xf_emit(ctx, 1, 0); /* 000000ff tesla UNK1940 */
1413 xf_emit(ctx, 1, 1); 1611 xf_emit(ctx, 1, 0); /* 00000001 tesla UNK0D7C */
1414 xf_emit(ctx, 1, 0x80c14); 1612 xf_emit(ctx, 1, 0x804); /* 00000fff SEMANTIC_CLIP */
1415 xf_emit(ctx, 1, 0); 1613 xf_emit(ctx, 1, 1); /* 00000001 VIEWPORT_TRANSFORM_EN */
1416 xf_emit(ctx, 1, 0x8100c12); 1614 xf_emit(ctx, 1, 0x1a); /* 0000001f POLYGON_MODE */
1417 xf_emit(ctx, 2, 4);
1418 xf_emit(ctx, 1, 0);
1419 xf_emit(ctx, 1, 0x10);
1420 xf_emit(ctx, 3, 0);
1421 xf_emit(ctx, 1, 1);
1422 xf_emit(ctx, 1, 0x8100c12);
1423 xf_emit(ctx, 6, 0);
1424 if (dev_priv->chipset == 0x50)
1425 xf_emit(ctx, 1, 0x3ff);
1426 else
1427 xf_emit(ctx, 1, 0x7ff);
1428 xf_emit(ctx, 1, 0x80c14);
1429 xf_emit(ctx, 0x38, 0);
1430 xf_emit(ctx, 1, 1);
1431 xf_emit(ctx, 2, 0);
1432 xf_emit(ctx, 1, 0x10);
1433 xf_emit(ctx, 0x38, 0);
1434 xf_emit(ctx, 2, 0x88);
1435 xf_emit(ctx, 2, 0);
1436 xf_emit(ctx, 1, 4);
1437 xf_emit(ctx, 0x16, 0);
1438 xf_emit(ctx, 1, 0x26);
1439 xf_emit(ctx, 2, 0);
1440 xf_emit(ctx, 1, 0x3f800000);
1441 if (dev_priv->chipset > 0xa0 && dev_priv->chipset < 0xaa)
1442 xf_emit(ctx, 4, 0);
1443 else
1444 xf_emit(ctx, 3, 0);
1445 xf_emit(ctx, 1, 0x1a);
1446 xf_emit(ctx, 1, 0x10);
1447 if (dev_priv->chipset != 0x50) 1615 if (dev_priv->chipset != 0x50)
1448 xf_emit(ctx, 0x28, 0); 1616 xf_emit(ctx, 1, 0x7f); /* 000000ff tesla UNK0FFC */
1617 xf_emit(ctx, 1, 0); /* ffffffff tesla UNK1A30 */
1618 xf_emit(ctx, 1, 1); /* 00000001 SHADE_MODEL */
1619 xf_emit(ctx, 1, 0x80c14); /* 01ffffff SEMANTIC_COLOR */
1620 xf_emit(ctx, 1, 0); /* 00000001 tesla UNK1900 */
1621 xf_emit(ctx, 1, 0x8100c12); /* 1fffffff FP_INTERPOLANT_CTRL */
1622 xf_emit(ctx, 1, 4); /* 0000007f VP_RESULT_MAP_SIZE */
1623 xf_emit(ctx, 1, 4); /* 000000ff GP_RESULT_MAP_SIZE */
1624 xf_emit(ctx, 1, 0); /* 00000001 GP_ENABLE */
1625 xf_emit(ctx, 1, 0x10); /* 7f/ff VIEW_VOLUME_CLIP_CTRL */
1626 xf_emit(ctx, 1, 0); /* 00000001 tesla UNK0D7C */
1627 xf_emit(ctx, 1, 0); /* 00000001 tesla UNK0F8C */
1628 xf_emit(ctx, 1, 0); /* ffffffff tesla UNK1A30 */
1629 xf_emit(ctx, 1, 1); /* 00000001 VIEWPORT_TRANSFORM_EN */
1630 xf_emit(ctx, 1, 0x8100c12); /* 1fffffff FP_INTERPOLANT_CTRL */
1631 xf_emit(ctx, 4, 0); /* ffffffff NOPERSPECTIVE_BITMAP */
1632 xf_emit(ctx, 1, 0); /* 00000001 tesla UNK1900 */
1633 xf_emit(ctx, 1, 0); /* 0000000f */
1634 if (dev_priv->chipset == 0x50)
1635 xf_emit(ctx, 1, 0x3ff); /* 000003ff tesla UNK0D68 */
1449 else 1636 else
1450 xf_emit(ctx, 0x25, 0); 1637 xf_emit(ctx, 1, 0x7ff); /* 000007ff tesla UNK0D68 */
1451 xf_emit(ctx, 1, 0x52); 1638 xf_emit(ctx, 1, 0x80c14); /* 01ffffff SEMANTIC_COLOR */
1452 xf_emit(ctx, 1, 0); 1639 xf_emit(ctx, 1, 0); /* 00000001 VERTEX_TWO_SIDE_ENABLE */
1453 xf_emit(ctx, 1, 0x26); 1640 xf_emit(ctx, 0x30, 0); /* ffffffff VIEWPORT_SCALE: X0, Y0, Z0, X1, Y1, ... */
1454 xf_emit(ctx, 1, 0); 1641 xf_emit(ctx, 3, 0); /* f, 0, 0 */
1455 xf_emit(ctx, 2, 4); 1642 xf_emit(ctx, 3, 0); /* ffffffff last VIEWPORT_SCALE? */
1456 xf_emit(ctx, 1, 0); 1643 xf_emit(ctx, 1, 0); /* ffffffff tesla UNK1A30 */
1457 xf_emit(ctx, 1, 0x1a); 1644 xf_emit(ctx, 1, 1); /* 00000001 VIEWPORT_TRANSFORM_EN */
1458 xf_emit(ctx, 2, 0); 1645 xf_emit(ctx, 1, 0); /* 00000001 tesla UNK1900 */
1459 xf_emit(ctx, 1, 0x00ffff00); 1646 xf_emit(ctx, 1, 0); /* 00000001 tesla UNK1924 */
1460 xf_emit(ctx, 1, 0); 1647 xf_emit(ctx, 1, 0x10); /* 000000ff VIEW_VOLUME_CLIP_CTRL */
1648 xf_emit(ctx, 1, 0); /* 00000001 */
1649 xf_emit(ctx, 0x30, 0); /* ffffffff VIEWPORT_TRANSLATE */
1650 xf_emit(ctx, 3, 0); /* f, 0, 0 */
1651 xf_emit(ctx, 3, 0); /* ffffffff */
1652 xf_emit(ctx, 1, 0); /* ffffffff tesla UNK1A30 */
1653 xf_emit(ctx, 2, 0x88); /* 000001ff tesla UNK19D8 */
1654 xf_emit(ctx, 1, 0); /* 00000001 tesla UNK1924 */
1655 xf_emit(ctx, 1, 0); /* ffffffff tesla UNK1A30 */
1656 xf_emit(ctx, 1, 4); /* 0000000f CULL_MODE */
1657 xf_emit(ctx, 2, 0); /* 07ffffff SCREEN_SCISSOR */
1658 xf_emit(ctx, 2, 0); /* 00007fff WINDOW_OFFSET_XY */
1659 xf_emit(ctx, 1, 0); /* 00000003 WINDOW_ORIGIN */
1660 xf_emit(ctx, 0x10, 0); /* 00000001 SCISSOR_ENABLE */
1661 xf_emit(ctx, 1, 0); /* 0001ffff GP_BUILTIN_RESULT_EN */
1662 xf_emit(ctx, 1, 0x26); /* 000000ff SEMANTIC_LAYER */
1663 xf_emit(ctx, 1, 0); /* 00000001 tesla UNK1900 */
1664 xf_emit(ctx, 1, 0); /* 0000000f */
1665 xf_emit(ctx, 1, 0x3f800000); /* ffffffff LINE_WIDTH */
1666 xf_emit(ctx, 1, 0); /* 00000001 LINE_STIPPLE_ENABLE */
1667 xf_emit(ctx, 1, 0); /* 00000001 LINE_SMOOTH_ENABLE */
1668 xf_emit(ctx, 1, 0); /* 00000007 MULTISAMPLE_SAMPLES_LOG2 */
1669 if (IS_NVA3F(dev_priv->chipset))
1670 xf_emit(ctx, 1, 0); /* 00000001 */
1671 xf_emit(ctx, 1, 0x1a); /* 0000001f POLYGON_MODE */
1672 xf_emit(ctx, 1, 0x10); /* 000000ff VIEW_VOLUME_CLIP_CTRL */
1673 if (dev_priv->chipset != 0x50) {
1674 xf_emit(ctx, 1, 0); /* ffffffff */
1675 xf_emit(ctx, 1, 0); /* 00000001 */
1676 xf_emit(ctx, 1, 0); /* 000003ff */
1677 }
1678 xf_emit(ctx, 0x20, 0); /* 10xbits ffffffff, 3fffff. SCISSOR_* */
1679 xf_emit(ctx, 1, 0); /* f */
1680 xf_emit(ctx, 1, 0); /* 0? */
1681 xf_emit(ctx, 1, 0); /* ffffffff */
1682 xf_emit(ctx, 1, 0); /* 003fffff */
1683 xf_emit(ctx, 1, 0); /* ffffffff tesla UNK1A30 */
1684 xf_emit(ctx, 1, 0x52); /* 000001ff SEMANTIC_PTSZ */
1685 xf_emit(ctx, 1, 0); /* 0001ffff GP_BUILTIN_RESULT_EN */
1686 xf_emit(ctx, 1, 0x26); /* 000000ff SEMANTIC_LAYER */
1687 xf_emit(ctx, 1, 0); /* 00000001 tesla UNK1900 */
1688 xf_emit(ctx, 1, 4); /* 0000007f VP_RESULT_MAP_SIZE */
1689 xf_emit(ctx, 1, 4); /* 000000ff GP_RESULT_MAP_SIZE */
1690 xf_emit(ctx, 1, 0); /* 00000001 GP_ENABLE */
1691 xf_emit(ctx, 1, 0x1a); /* 0000001f POLYGON_MODE */
1692 xf_emit(ctx, 1, 0); /* 00000001 LINE_SMOOTH_ENABLE */
1693 xf_emit(ctx, 1, 0); /* 00000001 LINE_STIPPLE_ENABLE */
1694 xf_emit(ctx, 1, 0x00ffff00); /* 00ffffff LINE_STIPPLE_PATTERN */
1695 xf_emit(ctx, 1, 0); /* 0000000f */
1461} 1696}
1462 1697
1463static void 1698static void
1464nv50_graph_construct_gene_unk3(struct nouveau_grctx *ctx) 1699nv50_graph_construct_gene_zcull(struct nouveau_grctx *ctx)
1465{ 1700{
1466 struct drm_nouveau_private *dev_priv = ctx->dev->dev_private; 1701 struct drm_nouveau_private *dev_priv = ctx->dev->dev_private;
1467 /* end of area 0 on pre-NVA0, beginning of area 6 on NVAx */ 1702 /* end of strand 0 on pre-NVA0, beginning of strand 6 on NVAx */
1468 xf_emit(ctx, 1, 0x3f); 1703 /* SEEK */
1469 xf_emit(ctx, 0xa, 0); 1704 xf_emit(ctx, 1, 0x3f); /* 0000003f UNK1590 */
1470 xf_emit(ctx, 1, 2); 1705 xf_emit(ctx, 1, 0); /* 00000001 ALPHA_TEST_ENABLE */
1471 xf_emit(ctx, 2, 0x04000000); 1706 xf_emit(ctx, 1, 0); /* 00000007 MULTISAMPLE_SAMPLES_LOG2 */
1472 xf_emit(ctx, 8, 0); 1707 xf_emit(ctx, 1, 0); /* 00000001 tesla UNK1534 */
1473 xf_emit(ctx, 1, 4); 1708 xf_emit(ctx, 1, 0); /* 00000007 STENCIL_BACK_FUNC_FUNC */
1474 xf_emit(ctx, 3, 0); 1709 xf_emit(ctx, 1, 0); /* 000000ff STENCIL_BACK_FUNC_MASK */
1475 xf_emit(ctx, 1, 4); 1710 xf_emit(ctx, 1, 0); /* 000000ff STENCIL_BACK_FUNC_REF */
1476 if (dev_priv->chipset == 0x50) 1711 xf_emit(ctx, 1, 0); /* 000000ff STENCIL_BACK_MASK */
1477 xf_emit(ctx, 0x10, 0); 1712 xf_emit(ctx, 3, 0); /* 00000007 STENCIL_BACK_OP_FAIL, ZFAIL, ZPASS */
1478 else 1713 xf_emit(ctx, 1, 2); /* 00000003 tesla UNK143C */
1479 xf_emit(ctx, 0x11, 0); 1714 xf_emit(ctx, 2, 0x04000000); /* 07ffffff tesla UNK0D6C */
1480 xf_emit(ctx, 1, 1); 1715 xf_emit(ctx, 1, 0); /* ffff0ff3 */
1481 xf_emit(ctx, 1, 0x1001); 1716 xf_emit(ctx, 1, 0); /* 00000001 CLIPID_ENABLE */
1482 xf_emit(ctx, 4, 0xffff); 1717 xf_emit(ctx, 2, 0); /* ffffffff DEPTH_BOUNDS */
1483 xf_emit(ctx, 0x20, 0); 1718 xf_emit(ctx, 1, 0); /* 00000001 */
1484 xf_emit(ctx, 0x10, 0x3f800000); 1719 xf_emit(ctx, 1, 0); /* 00000007 DEPTH_TEST_FUNC */
1485 xf_emit(ctx, 1, 0x10); 1720 xf_emit(ctx, 1, 0); /* 00000001 DEPTH_TEST_ENABLE */
1486 if (dev_priv->chipset == 0x50) 1721 xf_emit(ctx, 1, 0); /* 00000001 DEPTH_WRITE_ENABLE */
1487 xf_emit(ctx, 1, 0); 1722 xf_emit(ctx, 1, 4); /* 0000000f CULL_MODE */
1488 else 1723 xf_emit(ctx, 1, 0); /* 0000ffff */
1489 xf_emit(ctx, 2, 0); 1724 xf_emit(ctx, 1, 0); /* 00000001 UNK0FB0 */
1490 xf_emit(ctx, 1, 3); 1725 xf_emit(ctx, 1, 0); /* 00000001 POLYGON_STIPPLE_ENABLE */
1491 xf_emit(ctx, 2, 0); 1726 xf_emit(ctx, 1, 4); /* 00000007 FP_CONTROL */
1727 xf_emit(ctx, 1, 0); /* ffffffff */
1728 xf_emit(ctx, 1, 0); /* 0001ffff GP_BUILTIN_RESULT_EN */
1729 xf_emit(ctx, 1, 0); /* 000000ff CLEAR_STENCIL */
1730 xf_emit(ctx, 1, 0); /* 00000007 STENCIL_FRONT_FUNC_FUNC */
1731 xf_emit(ctx, 1, 0); /* 000000ff STENCIL_FRONT_FUNC_MASK */
1732 xf_emit(ctx, 1, 0); /* 000000ff STENCIL_FRONT_FUNC_REF */
1733 xf_emit(ctx, 1, 0); /* 000000ff STENCIL_FRONT_MASK */
1734 xf_emit(ctx, 3, 0); /* 00000007 STENCIL_FRONT_OP_FAIL, ZFAIL, ZPASS */
1735 xf_emit(ctx, 1, 0); /* 00000001 STENCIL_FRONT_ENABLE */
1736 xf_emit(ctx, 1, 0); /* 00000001 STENCIL_BACK_ENABLE */
1737 xf_emit(ctx, 1, 0); /* ffffffff CLEAR_DEPTH */
1738 xf_emit(ctx, 1, 0); /* 00000007 */
1739 if (dev_priv->chipset != 0x50)
1740 xf_emit(ctx, 1, 0); /* 00000003 tesla UNK1108 */
1741 xf_emit(ctx, 1, 0); /* 00000001 SAMPLECNT_ENABLE */
1742 xf_emit(ctx, 1, 0); /* 0000000f ZETA_FORMAT */
1743 xf_emit(ctx, 1, 1); /* 00000001 ZETA_ENABLE */
1744 xf_emit(ctx, 1, 0x1001); /* 00001fff ZETA_ARRAY_MODE */
1745 /* SEEK */
1746 xf_emit(ctx, 4, 0xffff); /* 0000ffff MSAA_MASK */
1747 xf_emit(ctx, 0x10, 0); /* 00000001 SCISSOR_ENABLE */
1748 xf_emit(ctx, 0x10, 0); /* ffffffff DEPTH_RANGE_NEAR */
1749 xf_emit(ctx, 0x10, 0x3f800000); /* ffffffff DEPTH_RANGE_FAR */
1750 xf_emit(ctx, 1, 0x10); /* 7f/ff/3ff VIEW_VOLUME_CLIP_CTRL */
1751 xf_emit(ctx, 1, 0); /* 00000001 VIEWPORT_CLIP_RECTS_EN */
1752 xf_emit(ctx, 1, 3); /* 00000003 FP_CTRL_UNK196C */
1753 xf_emit(ctx, 1, 0); /* 00000003 tesla UNK1968 */
1754 if (dev_priv->chipset != 0x50)
1755 xf_emit(ctx, 1, 0); /* 0fffffff tesla UNK1104 */
1756 xf_emit(ctx, 1, 0); /* 00000001 tesla UNK151C */
1492} 1757}
1493 1758
1494static void 1759static void
1495nv50_graph_construct_gene_unk4(struct nouveau_grctx *ctx) 1760nv50_graph_construct_gene_clipid(struct nouveau_grctx *ctx)
1496{ 1761{
1497 /* middle of area 0 on pre-NVA0, middle of area 6 on NVAx */ 1762 /* middle of strand 0 on pre-NVA0 [after 24xx], middle of area 6 on NVAx */
1498 xf_emit(ctx, 2, 0x04000000); 1763 /* SEEK */
1499 xf_emit(ctx, 1, 0); 1764 xf_emit(ctx, 1, 0); /* 00000007 UNK0FB4 */
1500 xf_emit(ctx, 1, 0x80); 1765 /* SEEK */
1501 xf_emit(ctx, 3, 0); 1766 xf_emit(ctx, 4, 0); /* 07ffffff CLIPID_REGION_HORIZ */
1502 xf_emit(ctx, 1, 0x80); 1767 xf_emit(ctx, 4, 0); /* 07ffffff CLIPID_REGION_VERT */
1503 xf_emit(ctx, 1, 0); 1768 xf_emit(ctx, 2, 0); /* 07ffffff SCREEN_SCISSOR */
1769 xf_emit(ctx, 2, 0x04000000); /* 07ffffff UNK1508 */
1770 xf_emit(ctx, 1, 0); /* 00000001 CLIPID_ENABLE */
1771 xf_emit(ctx, 1, 0x80); /* 00003fff CLIPID_WIDTH */
1772 xf_emit(ctx, 1, 0); /* 000000ff CLIPID_ID */
1773 xf_emit(ctx, 1, 0); /* 000000ff CLIPID_ADDRESS_HIGH */
1774 xf_emit(ctx, 1, 0); /* ffffffff CLIPID_ADDRESS_LOW */
1775 xf_emit(ctx, 1, 0x80); /* 00003fff CLIPID_HEIGHT */
1776 xf_emit(ctx, 1, 0); /* 0000ffff DMA_CLIPID */
1504} 1777}
1505 1778
1506static void 1779static void
1507nv50_graph_construct_gene_unk5(struct nouveau_grctx *ctx) 1780nv50_graph_construct_gene_unk24xx(struct nouveau_grctx *ctx)
1508{ 1781{
1509 struct drm_nouveau_private *dev_priv = ctx->dev->dev_private; 1782 struct drm_nouveau_private *dev_priv = ctx->dev->dev_private;
1510 /* middle of area 0 on pre-NVA0 [after m2mf], end of area 2 on NVAx */ 1783 int i;
1511 xf_emit(ctx, 2, 4); 1784 /* middle of strand 0 on pre-NVA0 [after m2mf], end of strand 2 on NVAx */
1512 if (dev_priv->chipset > 0xa0 && dev_priv->chipset < 0xaa) 1785 /* SEEK */
1513 xf_emit(ctx, 0x1c4d, 0); 1786 xf_emit(ctx, 0x33, 0);
1514 else 1787 /* SEEK */
1515 xf_emit(ctx, 0x1c4b, 0); 1788 xf_emit(ctx, 2, 0);
1516 xf_emit(ctx, 2, 4); 1789 /* SEEK */
1517 xf_emit(ctx, 1, 0x8100c12); 1790 xf_emit(ctx, 1, 0); /* 00000001 GP_ENABLE */
1791 xf_emit(ctx, 1, 4); /* 0000007f VP_RESULT_MAP_SIZE */
1792 xf_emit(ctx, 1, 4); /* 000000ff GP_RESULT_MAP_SIZE */
1793 /* SEEK */
1794 if (IS_NVA3F(dev_priv->chipset)) {
1795 xf_emit(ctx, 4, 0); /* RO */
1796 xf_emit(ctx, 0xe10, 0); /* 190 * 9: 8*ffffffff, 7ff */
1797 xf_emit(ctx, 1, 0); /* 1ff */
1798 xf_emit(ctx, 8, 0); /* 0? */
1799 xf_emit(ctx, 9, 0); /* ffffffff, 7ff */
1800
1801 xf_emit(ctx, 4, 0); /* RO */
1802 xf_emit(ctx, 0xe10, 0); /* 190 * 9: 8*ffffffff, 7ff */
1803 xf_emit(ctx, 1, 0); /* 1ff */
1804 xf_emit(ctx, 8, 0); /* 0? */
1805 xf_emit(ctx, 9, 0); /* ffffffff, 7ff */
1806 } else {
1807 xf_emit(ctx, 0xc, 0); /* RO */
1808 /* SEEK */
1809 xf_emit(ctx, 0xe10, 0); /* 190 * 9: 8*ffffffff, 7ff */
1810 xf_emit(ctx, 1, 0); /* 1ff */
1811 xf_emit(ctx, 8, 0); /* 0? */
1812
1813 /* SEEK */
1814 xf_emit(ctx, 0xc, 0); /* RO */
1815 /* SEEK */
1816 xf_emit(ctx, 0xe10, 0); /* 190 * 9: 8*ffffffff, 7ff */
1817 xf_emit(ctx, 1, 0); /* 1ff */
1818 xf_emit(ctx, 8, 0); /* 0? */
1819 }
1820 /* SEEK */
1821 xf_emit(ctx, 1, 0); /* 00000001 GP_ENABLE */
1822 xf_emit(ctx, 1, 4); /* 000000ff GP_RESULT_MAP_SIZE */
1823 xf_emit(ctx, 1, 4); /* 0000007f VP_RESULT_MAP_SIZE */
1824 xf_emit(ctx, 1, 0x8100c12); /* 1fffffff FP_INTERPOLANT_CTRL */
1518 if (dev_priv->chipset != 0x50) 1825 if (dev_priv->chipset != 0x50)
1519 xf_emit(ctx, 1, 3); 1826 xf_emit(ctx, 1, 3); /* 00000003 tesla UNK1100 */
1520 xf_emit(ctx, 1, 0); 1827 /* SEEK */
1521 xf_emit(ctx, 1, 0x8100c12); 1828 xf_emit(ctx, 1, 0); /* 00000001 GP_ENABLE */
1522 xf_emit(ctx, 1, 0); 1829 xf_emit(ctx, 1, 0x8100c12); /* 1fffffff FP_INTERPOLANT_CTRL */
1523 xf_emit(ctx, 1, 0x80c14); 1830 xf_emit(ctx, 1, 0); /* 0000000f VP_GP_BUILTIN_ATTR_EN */
1524 xf_emit(ctx, 1, 1); 1831 xf_emit(ctx, 1, 0x80c14); /* 01ffffff SEMANTIC_COLOR */
1832 xf_emit(ctx, 1, 1); /* 00000001 */
1833 /* SEEK */
1525 if (dev_priv->chipset >= 0xa0) 1834 if (dev_priv->chipset >= 0xa0)
1526 xf_emit(ctx, 2, 4); 1835 xf_emit(ctx, 2, 4); /* 000000ff */
1527 xf_emit(ctx, 1, 0x80c14); 1836 xf_emit(ctx, 1, 0x80c14); /* 01ffffff SEMANTIC_COLOR */
1528 xf_emit(ctx, 2, 0); 1837 xf_emit(ctx, 1, 0); /* 00000001 VERTEX_TWO_SIDE_ENABLE */
1529 xf_emit(ctx, 1, 0x8100c12); 1838 xf_emit(ctx, 1, 0); /* 00000001 POINT_SPRITE_ENABLE */
1530 xf_emit(ctx, 1, 0x27); 1839 xf_emit(ctx, 1, 0x8100c12); /* 1fffffff FP_INTERPOLANT_CTRL */
1531 xf_emit(ctx, 2, 0); 1840 xf_emit(ctx, 1, 0x27); /* 000000ff SEMANTIC_PRIM_ID */
1532 xf_emit(ctx, 1, 1); 1841 xf_emit(ctx, 1, 0); /* 00000001 GP_ENABLE */
1533 xf_emit(ctx, 0x3c1, 0); 1842 xf_emit(ctx, 1, 0); /* 0000000f */
1534 xf_emit(ctx, 1, 1); 1843 xf_emit(ctx, 1, 1); /* 00000001 */
1535 xf_emit(ctx, 0x16, 0); 1844 for (i = 0; i < 10; i++) {
1536 xf_emit(ctx, 1, 0x8100c12); 1845 /* SEEK */
1537 xf_emit(ctx, 1, 0); 1846 xf_emit(ctx, 0x40, 0); /* ffffffff */
1847 xf_emit(ctx, 0x10, 0); /* 3, 0, 0.... */
1848 xf_emit(ctx, 0x10, 0); /* ffffffff */
1849 }
1850 /* SEEK */
1851 xf_emit(ctx, 1, 0); /* 00000001 POINT_SPRITE_CTRL */
1852 xf_emit(ctx, 1, 1); /* 00000001 */
1853 xf_emit(ctx, 1, 0); /* ffffffff */
1854 xf_emit(ctx, 4, 0); /* ffffffff NOPERSPECTIVE_BITMAP */
1855 xf_emit(ctx, 0x10, 0); /* 00ffffff POINT_COORD_REPLACE_MAP */
1856 xf_emit(ctx, 1, 0); /* 00000003 WINDOW_ORIGIN */
1857 xf_emit(ctx, 1, 0x8100c12); /* 1fffffff FP_INTERPOLANT_CTRL */
1858 if (dev_priv->chipset != 0x50)
1859 xf_emit(ctx, 1, 0); /* 000003ff */
1538} 1860}
1539 1861
1540static void 1862static void
1541nv50_graph_construct_gene_unk6(struct nouveau_grctx *ctx) 1863nv50_graph_construct_gene_vfetch(struct nouveau_grctx *ctx)
1542{ 1864{
1543 struct drm_nouveau_private *dev_priv = ctx->dev->dev_private; 1865 struct drm_nouveau_private *dev_priv = ctx->dev->dev_private;
1544 /* beginning of area 1 on pre-NVA0 [after m2mf], area 3 on NVAx */ 1866 int acnt = 0x10, rep, i;
1545 xf_emit(ctx, 4, 0); 1867 /* beginning of strand 1 on pre-NVA0, strand 3 on NVAx */
1546 xf_emit(ctx, 1, 0xf); 1868 if (IS_NVA3F(dev_priv->chipset))
1547 if (dev_priv->chipset > 0xa0 && dev_priv->chipset < 0xaa) 1869 acnt = 0x20;
1548 xf_emit(ctx, 8, 0); 1870 /* SEEK */
1549 else 1871 if (dev_priv->chipset >= 0xa0) {
1550 xf_emit(ctx, 4, 0); 1872 xf_emit(ctx, 1, 0); /* ffffffff tesla UNK13A4 */
1551 xf_emit(ctx, 1, 0x20); 1873 xf_emit(ctx, 1, 1); /* 00000fff tesla UNK1318 */
1552 if (dev_priv->chipset > 0xa0 && dev_priv->chipset < 0xaa) 1874 }
1553 xf_emit(ctx, 0x11, 0); 1875 xf_emit(ctx, 1, 0); /* ffffffff VERTEX_BUFFER_FIRST */
1876 xf_emit(ctx, 1, 0); /* 00000001 PRIMITIVE_RESTART_ENABLE */
1877 xf_emit(ctx, 1, 0); /* 00000001 UNK0DE8 */
1878 xf_emit(ctx, 1, 0); /* ffffffff PRIMITIVE_RESTART_INDEX */
1879 xf_emit(ctx, 1, 0xf); /* ffffffff VP_ATTR_EN */
1880 xf_emit(ctx, (acnt/8)-1, 0); /* ffffffff VP_ATTR_EN */
1881 xf_emit(ctx, acnt/8, 0); /* ffffffff VTX_ATR_MASK_UNK0DD0 */
1882 xf_emit(ctx, 1, 0); /* 0000000f VP_GP_BUILTIN_ATTR_EN */
1883 xf_emit(ctx, 1, 0x20); /* 0000ffff tesla UNK129C */
1884 xf_emit(ctx, 1, 0); /* 000000ff turing UNK370??? */
1885 xf_emit(ctx, 1, 0); /* 0000ffff turing USER_PARAM_COUNT */
1886 xf_emit(ctx, 1, 0); /* ffffffff tesla UNK1A30 */
1887 /* SEEK */
1888 if (IS_NVA3F(dev_priv->chipset))
1889 xf_emit(ctx, 0xb, 0); /* RO */
1554 else if (dev_priv->chipset >= 0xa0) 1890 else if (dev_priv->chipset >= 0xa0)
1555 xf_emit(ctx, 0xf, 0); 1891 xf_emit(ctx, 0x9, 0); /* RO */
1556 else 1892 else
1557 xf_emit(ctx, 0xe, 0); 1893 xf_emit(ctx, 0x8, 0); /* RO */
1558 xf_emit(ctx, 1, 0x1a); 1894 /* SEEK */
1559 xf_emit(ctx, 0xd, 0); 1895 xf_emit(ctx, 1, 0); /* 00000001 EDGE_FLAG */
1560 xf_emit(ctx, 2, 4); 1896 xf_emit(ctx, 1, 0); /* 00000001 PROVOKING_VERTEX_LAST */
1561 xf_emit(ctx, 1, 0); 1897 xf_emit(ctx, 1, 0); /* 00000001 GP_ENABLE */
1562 xf_emit(ctx, 1, 4); 1898 xf_emit(ctx, 1, 0x1a); /* 0000001f POLYGON_MODE */
1563 xf_emit(ctx, 1, 8); 1899 /* SEEK */
1564 xf_emit(ctx, 1, 0); 1900 xf_emit(ctx, 0xc, 0); /* RO */
1901 /* SEEK */
1902 xf_emit(ctx, 1, 0); /* 7f/ff */
1903 xf_emit(ctx, 1, 4); /* 7f/ff VP_REG_ALLOC_RESULT */
1904 xf_emit(ctx, 1, 4); /* 7f/ff VP_RESULT_MAP_SIZE */
1905 xf_emit(ctx, 1, 0); /* 0000000f VP_GP_BUILTIN_ATTR_EN */
1906 xf_emit(ctx, 1, 4); /* 000001ff UNK1A28 */
1907 xf_emit(ctx, 1, 8); /* 000001ff UNK0DF0 */
1908 xf_emit(ctx, 1, 0); /* 00000001 GP_ENABLE */
1565 if (dev_priv->chipset == 0x50) 1909 if (dev_priv->chipset == 0x50)
1566 xf_emit(ctx, 1, 0x3ff); 1910 xf_emit(ctx, 1, 0x3ff); /* 3ff tesla UNK0D68 */
1567 else 1911 else
1568 xf_emit(ctx, 1, 0x7ff); 1912 xf_emit(ctx, 1, 0x7ff); /* 7ff tesla UNK0D68 */
1569 if (dev_priv->chipset == 0xa8) 1913 if (dev_priv->chipset == 0xa8)
1570 xf_emit(ctx, 1, 0x1e00); 1914 xf_emit(ctx, 1, 0x1e00); /* 7fff */
1571 xf_emit(ctx, 0xc, 0); 1915 /* SEEK */
1572 xf_emit(ctx, 1, 0xf); 1916 xf_emit(ctx, 0xc, 0); /* RO or close */
1573 if (dev_priv->chipset == 0x50) 1917 /* SEEK */
1574 xf_emit(ctx, 0x125, 0); 1918 xf_emit(ctx, 1, 0xf); /* ffffffff VP_ATTR_EN */
1575 else if (dev_priv->chipset < 0xa0) 1919 xf_emit(ctx, (acnt/8)-1, 0); /* ffffffff VP_ATTR_EN */
1576 xf_emit(ctx, 0x126, 0); 1920 xf_emit(ctx, 1, 0); /* 0000000f VP_GP_BUILTIN_ATTR_EN */
1577 else if (dev_priv->chipset == 0xa0 || dev_priv->chipset >= 0xaa) 1921 if (dev_priv->chipset > 0x50 && dev_priv->chipset < 0xa0)
1578 xf_emit(ctx, 0x124, 0); 1922 xf_emit(ctx, 2, 0); /* ffffffff */
1579 else 1923 else
1580 xf_emit(ctx, 0x1f7, 0); 1924 xf_emit(ctx, 1, 0); /* ffffffff */
1581 xf_emit(ctx, 1, 0xf); 1925 xf_emit(ctx, 1, 0); /* 00000003 tesla UNK0FD8 */
1582 if (dev_priv->chipset > 0xa0 && dev_priv->chipset < 0xaa) 1926 /* SEEK */
1583 xf_emit(ctx, 3, 0); 1927 if (IS_NVA3F(dev_priv->chipset)) {
1928 xf_emit(ctx, 0x10, 0); /* 0? */
1929 xf_emit(ctx, 2, 0); /* weird... */
1930 xf_emit(ctx, 2, 0); /* RO */
1931 } else {
1932 xf_emit(ctx, 8, 0); /* 0? */
1933 xf_emit(ctx, 1, 0); /* weird... */
1934 xf_emit(ctx, 2, 0); /* RO */
1935 }
1936 /* SEEK */
1937 xf_emit(ctx, 1, 0); /* ffffffff VB_ELEMENT_BASE */
1938 xf_emit(ctx, 1, 0); /* ffffffff UNK1438 */
1939 xf_emit(ctx, acnt, 0); /* 1 tesla UNK1000 */
1940 if (dev_priv->chipset >= 0xa0)
1941 xf_emit(ctx, 1, 0); /* ffffffff tesla UNK1118? */
1942 /* SEEK */
1943 xf_emit(ctx, acnt, 0); /* ffffffff VERTEX_ARRAY_UNK90C */
1944 xf_emit(ctx, 1, 0); /* f/1f */
1945 /* SEEK */
1946 xf_emit(ctx, acnt, 0); /* ffffffff VERTEX_ARRAY_UNK90C */
1947 xf_emit(ctx, 1, 0); /* f/1f */
1948 /* SEEK */
1949 xf_emit(ctx, acnt, 0); /* RO */
1950 xf_emit(ctx, 2, 0); /* RO */
1951 /* SEEK */
1952 xf_emit(ctx, 1, 0); /* ffffffff tesla UNK111C? */
1953 xf_emit(ctx, 1, 0); /* RO */
1954 /* SEEK */
1955 xf_emit(ctx, 1, 0); /* 000000ff UNK15F4_ADDRESS_HIGH */
1956 xf_emit(ctx, 1, 0); /* ffffffff UNK15F4_ADDRESS_LOW */
1957 xf_emit(ctx, 1, 0); /* 000000ff UNK0F84_ADDRESS_HIGH */
1958 xf_emit(ctx, 1, 0); /* ffffffff UNK0F84_ADDRESS_LOW */
1959 /* SEEK */
1960 xf_emit(ctx, acnt, 0); /* 00003fff VERTEX_ARRAY_ATTRIB_OFFSET */
1961 xf_emit(ctx, 3, 0); /* f/1f */
1962 /* SEEK */
1963 xf_emit(ctx, acnt, 0); /* 00000fff VERTEX_ARRAY_STRIDE */
1964 xf_emit(ctx, 3, 0); /* f/1f */
1965 /* SEEK */
1966 xf_emit(ctx, acnt, 0); /* ffffffff VERTEX_ARRAY_LOW */
1967 xf_emit(ctx, 3, 0); /* f/1f */
1968 /* SEEK */
1969 xf_emit(ctx, acnt, 0); /* 000000ff VERTEX_ARRAY_HIGH */
1970 xf_emit(ctx, 3, 0); /* f/1f */
1971 /* SEEK */
1972 xf_emit(ctx, acnt, 0); /* ffffffff VERTEX_LIMIT_LOW */
1973 xf_emit(ctx, 3, 0); /* f/1f */
1974 /* SEEK */
1975 xf_emit(ctx, acnt, 0); /* 000000ff VERTEX_LIMIT_HIGH */
1976 xf_emit(ctx, 3, 0); /* f/1f */
1977 /* SEEK */
1978 if (IS_NVA3F(dev_priv->chipset)) {
1979 xf_emit(ctx, acnt, 0); /* f */
1980 xf_emit(ctx, 3, 0); /* f/1f */
1981 }
1982 /* SEEK */
1983 if (IS_NVA3F(dev_priv->chipset))
1984 xf_emit(ctx, 2, 0); /* RO */
1985 else
1986 xf_emit(ctx, 5, 0); /* RO */
1987 /* SEEK */
1988 xf_emit(ctx, 1, 0); /* ffff DMA_VTXBUF */
1989 /* SEEK */
1990 if (dev_priv->chipset < 0xa0) {
1991 xf_emit(ctx, 0x41, 0); /* RO */
1992 /* SEEK */
1993 xf_emit(ctx, 0x11, 0); /* RO */
1994 } else if (!IS_NVA3F(dev_priv->chipset))
1995 xf_emit(ctx, 0x50, 0); /* RO */
1584 else 1996 else
1585 xf_emit(ctx, 1, 0); 1997 xf_emit(ctx, 0x58, 0); /* RO */
1586 xf_emit(ctx, 1, 1); 1998 /* SEEK */
1587 if (dev_priv->chipset > 0xa0 && dev_priv->chipset < 0xaa) 1999 xf_emit(ctx, 1, 0xf); /* ffffffff VP_ATTR_EN */
1588 xf_emit(ctx, 0xa1, 0); 2000 xf_emit(ctx, (acnt/8)-1, 0); /* ffffffff VP_ATTR_EN */
2001 xf_emit(ctx, 1, 1); /* 1 UNK0DEC */
2002 /* SEEK */
2003 xf_emit(ctx, acnt*4, 0); /* ffffffff VTX_ATTR */
2004 xf_emit(ctx, 4, 0); /* f/1f, 0, 0, 0 */
2005 /* SEEK */
2006 if (IS_NVA3F(dev_priv->chipset))
2007 xf_emit(ctx, 0x1d, 0); /* RO */
1589 else 2008 else
1590 xf_emit(ctx, 0x5a, 0); 2009 xf_emit(ctx, 0x16, 0); /* RO */
1591 xf_emit(ctx, 1, 0xf); 2010 /* SEEK */
2011 xf_emit(ctx, 1, 0xf); /* ffffffff VP_ATTR_EN */
2012 xf_emit(ctx, (acnt/8)-1, 0); /* ffffffff VP_ATTR_EN */
2013 /* SEEK */
1592 if (dev_priv->chipset < 0xa0) 2014 if (dev_priv->chipset < 0xa0)
1593 xf_emit(ctx, 0x834, 0); 2015 xf_emit(ctx, 8, 0); /* RO */
1594 else if (dev_priv->chipset == 0xa0) 2016 else if (IS_NVA3F(dev_priv->chipset))
1595 xf_emit(ctx, 0x1873, 0); 2017 xf_emit(ctx, 0xc, 0); /* RO */
1596 else if (dev_priv->chipset > 0xa0 && dev_priv->chipset < 0xaa) 2018 else
1597 xf_emit(ctx, 0x8ba, 0); 2019 xf_emit(ctx, 7, 0); /* RO */
2020 /* SEEK */
2021 xf_emit(ctx, 0xa, 0); /* RO */
2022 if (dev_priv->chipset == 0xa0)
2023 rep = 0xc;
2024 else
2025 rep = 4;
2026 for (i = 0; i < rep; i++) {
2027 /* SEEK */
2028 if (IS_NVA3F(dev_priv->chipset))
2029 xf_emit(ctx, 0x20, 0); /* ffffffff */
2030 xf_emit(ctx, 0x200, 0); /* ffffffff */
2031 xf_emit(ctx, 4, 0); /* 7f/ff, 0, 0, 0 */
2032 xf_emit(ctx, 4, 0); /* ffffffff */
2033 }
2034 /* SEEK */
2035 xf_emit(ctx, 1, 0); /* 113/111 */
2036 xf_emit(ctx, 1, 0xf); /* ffffffff VP_ATTR_EN */
2037 xf_emit(ctx, (acnt/8)-1, 0); /* ffffffff VP_ATTR_EN */
2038 xf_emit(ctx, acnt/8, 0); /* ffffffff VTX_ATTR_MASK_UNK0DD0 */
2039 xf_emit(ctx, 1, 0); /* 0000000f VP_GP_BUILTIN_ATTR_EN */
2040 xf_emit(ctx, 1, 0); /* ffffffff tesla UNK1A30 */
2041 /* SEEK */
2042 if (IS_NVA3F(dev_priv->chipset))
2043 xf_emit(ctx, 7, 0); /* weird... */
1598 else 2044 else
1599 xf_emit(ctx, 0x833, 0); 2045 xf_emit(ctx, 5, 0); /* weird... */
1600 xf_emit(ctx, 1, 0xf);
1601 xf_emit(ctx, 0xf, 0);
1602} 2046}
1603 2047
1604static void 2048static void
1605nv50_graph_construct_gene_unk7(struct nouveau_grctx *ctx) 2049nv50_graph_construct_gene_eng2d(struct nouveau_grctx *ctx)
1606{ 2050{
1607 struct drm_nouveau_private *dev_priv = ctx->dev->dev_private; 2051 struct drm_nouveau_private *dev_priv = ctx->dev->dev_private;
1608 /* middle of area 1 on pre-NVA0 [after m2mf], middle of area 6 on NVAx */ 2052 /* middle of strand 1 on pre-NVA0 [after vfetch], middle of strand 6 on NVAx */
1609 xf_emit(ctx, 2, 0); 2053 /* SEEK */
1610 if (dev_priv->chipset == 0x50) 2054 xf_emit(ctx, 2, 0); /* 0001ffff CLIP_X, CLIP_Y */
1611 xf_emit(ctx, 2, 1); 2055 xf_emit(ctx, 2, 0); /* 0000ffff CLIP_W, CLIP_H */
1612 else 2056 xf_emit(ctx, 1, 0); /* 00000001 CLIP_ENABLE */
1613 xf_emit(ctx, 2, 0); 2057 if (dev_priv->chipset < 0xa0) {
1614 xf_emit(ctx, 1, 0); 2058 /* this is useless on everything but the original NV50,
1615 xf_emit(ctx, 1, 1); 2059 * guess they forgot to nuke it. Or just didn't bother. */
1616 xf_emit(ctx, 2, 0x100); 2060 xf_emit(ctx, 2, 0); /* 0000ffff IFC_CLIP_X, Y */
1617 xf_emit(ctx, 1, 0x11); 2061 xf_emit(ctx, 2, 1); /* 0000ffff IFC_CLIP_W, H */
1618 xf_emit(ctx, 1, 0); 2062 xf_emit(ctx, 1, 0); /* 00000001 IFC_CLIP_ENABLE */
1619 xf_emit(ctx, 1, 8); 2063 }
1620 xf_emit(ctx, 5, 0); 2064 xf_emit(ctx, 1, 1); /* 00000001 DST_LINEAR */
1621 xf_emit(ctx, 1, 1); 2065 xf_emit(ctx, 1, 0x100); /* 0001ffff DST_WIDTH */
1622 xf_emit(ctx, 1, 0); 2066 xf_emit(ctx, 1, 0x100); /* 0001ffff DST_HEIGHT */
1623 xf_emit(ctx, 3, 1); 2067 xf_emit(ctx, 1, 0x11); /* 3f[NV50]/7f[NV84+] DST_FORMAT */
1624 xf_emit(ctx, 1, 0xcf); 2068 xf_emit(ctx, 1, 0); /* 0001ffff DRAW_POINT_X */
1625 xf_emit(ctx, 1, 2); 2069 xf_emit(ctx, 1, 8); /* 0000000f DRAW_UNK58C */
1626 xf_emit(ctx, 6, 0); 2070 xf_emit(ctx, 1, 0); /* 000fffff SIFC_DST_X_FRACT */
1627 xf_emit(ctx, 1, 1); 2071 xf_emit(ctx, 1, 0); /* 0001ffff SIFC_DST_X_INT */
1628 xf_emit(ctx, 1, 0); 2072 xf_emit(ctx, 1, 0); /* 000fffff SIFC_DST_Y_FRACT */
1629 xf_emit(ctx, 3, 1); 2073 xf_emit(ctx, 1, 0); /* 0001ffff SIFC_DST_Y_INT */
1630 xf_emit(ctx, 4, 0); 2074 xf_emit(ctx, 1, 0); /* 000fffff SIFC_DX_DU_FRACT */
1631 xf_emit(ctx, 1, 4); 2075 xf_emit(ctx, 1, 1); /* 0001ffff SIFC_DX_DU_INT */
1632 xf_emit(ctx, 1, 0); 2076 xf_emit(ctx, 1, 0); /* 000fffff SIFC_DY_DV_FRACT */
1633 xf_emit(ctx, 1, 1); 2077 xf_emit(ctx, 1, 1); /* 0001ffff SIFC_DY_DV_INT */
1634 xf_emit(ctx, 1, 0x15); 2078 xf_emit(ctx, 1, 1); /* 0000ffff SIFC_WIDTH */
1635 xf_emit(ctx, 3, 0); 2079 xf_emit(ctx, 1, 1); /* 0000ffff SIFC_HEIGHT */
1636 xf_emit(ctx, 1, 0x4444480); 2080 xf_emit(ctx, 1, 0xcf); /* 000000ff SIFC_FORMAT */
1637 xf_emit(ctx, 0x37, 0); 2081 xf_emit(ctx, 1, 2); /* 00000003 SIFC_BITMAP_UNK808 */
2082 xf_emit(ctx, 1, 0); /* 00000003 SIFC_BITMAP_LINE_PACK_MODE */
2083 xf_emit(ctx, 1, 0); /* 00000001 SIFC_BITMAP_LSB_FIRST */
2084 xf_emit(ctx, 1, 0); /* 00000001 SIFC_BITMAP_ENABLE */
2085 xf_emit(ctx, 1, 0); /* 0000ffff BLIT_DST_X */
2086 xf_emit(ctx, 1, 0); /* 0000ffff BLIT_DST_Y */
2087 xf_emit(ctx, 1, 0); /* 000fffff BLIT_DU_DX_FRACT */
2088 xf_emit(ctx, 1, 1); /* 0001ffff BLIT_DU_DX_INT */
2089 xf_emit(ctx, 1, 0); /* 000fffff BLIT_DV_DY_FRACT */
2090 xf_emit(ctx, 1, 1); /* 0001ffff BLIT_DV_DY_INT */
2091 xf_emit(ctx, 1, 1); /* 0000ffff BLIT_DST_W */
2092 xf_emit(ctx, 1, 1); /* 0000ffff BLIT_DST_H */
2093 xf_emit(ctx, 1, 0); /* 000fffff BLIT_SRC_X_FRACT */
2094 xf_emit(ctx, 1, 0); /* 0001ffff BLIT_SRC_X_INT */
2095 xf_emit(ctx, 1, 0); /* 000fffff BLIT_SRC_Y_FRACT */
2096 xf_emit(ctx, 1, 0); /* 00000001 UNK888 */
2097 xf_emit(ctx, 1, 4); /* 0000003f UNK884 */
2098 xf_emit(ctx, 1, 0); /* 00000007 UNK880 */
2099 xf_emit(ctx, 1, 1); /* 0000001f tesla UNK0FB8 */
2100 xf_emit(ctx, 1, 0x15); /* 000000ff tesla UNK128C */
2101 xf_emit(ctx, 2, 0); /* 00000007, ffff0ff3 */
2102 xf_emit(ctx, 1, 0); /* 00000001 UNK260 */
2103 xf_emit(ctx, 1, 0x4444480); /* 1fffffff UNK870 */
2104 /* SEEK */
2105 xf_emit(ctx, 0x10, 0);
2106 /* SEEK */
2107 xf_emit(ctx, 0x27, 0);
1638} 2108}
1639 2109
1640static void 2110static void
1641nv50_graph_construct_gene_unk8(struct nouveau_grctx *ctx) 2111nv50_graph_construct_gene_csched(struct nouveau_grctx *ctx)
1642{ 2112{
1643 /* middle of area 1 on pre-NVA0 [after m2mf], middle of area 0 on NVAx */ 2113 struct drm_nouveau_private *dev_priv = ctx->dev->dev_private;
1644 xf_emit(ctx, 4, 0); 2114 /* middle of strand 1 on pre-NVA0 [after eng2d], middle of strand 0 on NVAx */
1645 xf_emit(ctx, 1, 0x8100c12); 2115 /* SEEK */
1646 xf_emit(ctx, 4, 0); 2116 xf_emit(ctx, 2, 0); /* 00007fff WINDOW_OFFSET_XY... what is it doing here??? */
1647 xf_emit(ctx, 1, 0x100); 2117 xf_emit(ctx, 1, 0); /* 00000001 tesla UNK1924 */
1648 xf_emit(ctx, 2, 0); 2118 xf_emit(ctx, 1, 0); /* 00000003 WINDOW_ORIGIN */
1649 xf_emit(ctx, 1, 0x10001); 2119 xf_emit(ctx, 1, 0x8100c12); /* 1fffffff FP_INTERPOLANT_CTRL */
1650 xf_emit(ctx, 1, 0); 2120 xf_emit(ctx, 1, 0); /* 000003ff */
1651 xf_emit(ctx, 1, 0x10001); 2121 /* SEEK */
1652 xf_emit(ctx, 1, 1); 2122 xf_emit(ctx, 1, 0); /* ffffffff turing UNK364 */
1653 xf_emit(ctx, 1, 0x10001); 2123 xf_emit(ctx, 1, 0); /* 0000000f turing UNK36C */
1654 xf_emit(ctx, 1, 1); 2124 xf_emit(ctx, 1, 0); /* 0000ffff USER_PARAM_COUNT */
1655 xf_emit(ctx, 1, 4); 2125 xf_emit(ctx, 1, 0x100); /* 00ffffff turing UNK384 */
1656 xf_emit(ctx, 1, 2); 2126 xf_emit(ctx, 1, 0); /* 0000000f turing UNK2A0 */
2127 xf_emit(ctx, 1, 0); /* 0000ffff GRIDID */
2128 xf_emit(ctx, 1, 0x10001); /* ffffffff GRIDDIM_XY */
2129 xf_emit(ctx, 1, 0); /* ffffffff */
2130 xf_emit(ctx, 1, 0x10001); /* ffffffff BLOCKDIM_XY */
2131 xf_emit(ctx, 1, 1); /* 0000ffff BLOCKDIM_Z */
2132 xf_emit(ctx, 1, 0x10001); /* 00ffffff BLOCK_ALLOC */
2133 xf_emit(ctx, 1, 1); /* 00000001 LANES32 */
2134 xf_emit(ctx, 1, 4); /* 000000ff FP_REG_ALLOC_TEMP */
2135 xf_emit(ctx, 1, 2); /* 00000003 REG_MODE */
2136 /* SEEK */
2137 xf_emit(ctx, 0x40, 0); /* ffffffff USER_PARAM */
2138 switch (dev_priv->chipset) {
2139 case 0x50:
2140 case 0x92:
2141 xf_emit(ctx, 8, 0); /* 7, 0, 0, 0, ... */
2142 xf_emit(ctx, 0x80, 0); /* fff */
2143 xf_emit(ctx, 2, 0); /* ff, fff */
2144 xf_emit(ctx, 0x10*2, 0); /* ffffffff, 1f */
2145 break;
2146 case 0x84:
2147 xf_emit(ctx, 8, 0); /* 7, 0, 0, 0, ... */
2148 xf_emit(ctx, 0x60, 0); /* fff */
2149 xf_emit(ctx, 2, 0); /* ff, fff */
2150 xf_emit(ctx, 0xc*2, 0); /* ffffffff, 1f */
2151 break;
2152 case 0x94:
2153 case 0x96:
2154 xf_emit(ctx, 8, 0); /* 7, 0, 0, 0, ... */
2155 xf_emit(ctx, 0x40, 0); /* fff */
2156 xf_emit(ctx, 2, 0); /* ff, fff */
2157 xf_emit(ctx, 8*2, 0); /* ffffffff, 1f */
2158 break;
2159 case 0x86:
2160 case 0x98:
2161 xf_emit(ctx, 4, 0); /* f, 0, 0, 0 */
2162 xf_emit(ctx, 0x10, 0); /* fff */
2163 xf_emit(ctx, 2, 0); /* ff, fff */
2164 xf_emit(ctx, 2*2, 0); /* ffffffff, 1f */
2165 break;
2166 case 0xa0:
2167 xf_emit(ctx, 8, 0); /* 7, 0, 0, 0, ... */
2168 xf_emit(ctx, 0xf0, 0); /* fff */
2169 xf_emit(ctx, 2, 0); /* ff, fff */
2170 xf_emit(ctx, 0x1e*2, 0); /* ffffffff, 1f */
2171 break;
2172 case 0xa3:
2173 xf_emit(ctx, 8, 0); /* 7, 0, 0, 0, ... */
2174 xf_emit(ctx, 0x60, 0); /* fff */
2175 xf_emit(ctx, 2, 0); /* ff, fff */
2176 xf_emit(ctx, 0xc*2, 0); /* ffffffff, 1f */
2177 break;
2178 case 0xa5:
2179 case 0xaf:
2180 xf_emit(ctx, 8, 0); /* 7, 0, 0, 0, ... */
2181 xf_emit(ctx, 0x30, 0); /* fff */
2182 xf_emit(ctx, 2, 0); /* ff, fff */
2183 xf_emit(ctx, 6*2, 0); /* ffffffff, 1f */
2184 break;
2185 case 0xaa:
2186 xf_emit(ctx, 0x12, 0);
2187 break;
2188 case 0xa8:
2189 case 0xac:
2190 xf_emit(ctx, 4, 0); /* f, 0, 0, 0 */
2191 xf_emit(ctx, 0x10, 0); /* fff */
2192 xf_emit(ctx, 2, 0); /* ff, fff */
2193 xf_emit(ctx, 2*2, 0); /* ffffffff, 1f */
2194 break;
2195 }
2196 xf_emit(ctx, 1, 0); /* 0000000f */
2197 xf_emit(ctx, 1, 0); /* 00000000 */
2198 xf_emit(ctx, 1, 0); /* ffffffff */
2199 xf_emit(ctx, 1, 0); /* 0000001f */
2200 xf_emit(ctx, 4, 0); /* ffffffff */
2201 xf_emit(ctx, 1, 0); /* 00000003 turing UNK35C */
2202 xf_emit(ctx, 1, 0); /* ffffffff */
2203 xf_emit(ctx, 4, 0); /* ffffffff */
2204 xf_emit(ctx, 1, 0); /* 00000003 turing UNK35C */
2205 xf_emit(ctx, 1, 0); /* ffffffff */
2206 xf_emit(ctx, 1, 0); /* 000000ff */
1657} 2207}
1658 2208
1659static void 2209static void
1660nv50_graph_construct_gene_unk9(struct nouveau_grctx *ctx) 2210nv50_graph_construct_gene_unk1cxx(struct nouveau_grctx *ctx)
1661{ 2211{
1662 struct drm_nouveau_private *dev_priv = ctx->dev->dev_private; 2212 struct drm_nouveau_private *dev_priv = ctx->dev->dev_private;
1663 /* middle of area 2 on pre-NVA0 [after m2mf], end of area 0 on NVAx */ 2213 xf_emit(ctx, 2, 0); /* 00007fff WINDOW_OFFSET_XY */
1664 xf_emit(ctx, 1, 0x3f800000); 2214 xf_emit(ctx, 1, 0x3f800000); /* ffffffff LINE_WIDTH */
1665 xf_emit(ctx, 6, 0); 2215 xf_emit(ctx, 1, 0); /* 00000001 LINE_SMOOTH_ENABLE */
1666 xf_emit(ctx, 1, 4); 2216 xf_emit(ctx, 1, 0); /* 00000001 tesla UNK1658 */
1667 xf_emit(ctx, 1, 0x1a); 2217 xf_emit(ctx, 1, 0); /* 00000001 POLYGON_SMOOTH_ENABLE */
1668 xf_emit(ctx, 2, 0); 2218 xf_emit(ctx, 3, 0); /* 00000001 POLYGON_OFFSET_*_ENABLE */
1669 xf_emit(ctx, 1, 1); 2219 xf_emit(ctx, 1, 4); /* 0000000f CULL_MODE */
1670 xf_emit(ctx, 0x12, 0); 2220 xf_emit(ctx, 1, 0x1a); /* 0000001f POLYGON_MODE */
1671 xf_emit(ctx, 1, 0x00ffff00); 2221 xf_emit(ctx, 1, 0); /* 0000000f ZETA_FORMAT */
1672 xf_emit(ctx, 6, 0); 2222 xf_emit(ctx, 1, 0); /* 00000001 POINT_SPRITE_ENABLE */
1673 xf_emit(ctx, 1, 0xf); 2223 xf_emit(ctx, 1, 1); /* 00000001 tesla UNK165C */
1674 xf_emit(ctx, 7, 0); 2224 xf_emit(ctx, 0x10, 0); /* 00000001 SCISSOR_ENABLE */
1675 xf_emit(ctx, 1, 0x0fac6881); 2225 xf_emit(ctx, 1, 0); /* 00000001 tesla UNK1534 */
1676 xf_emit(ctx, 1, 0x11); 2226 xf_emit(ctx, 1, 0); /* 00000001 LINE_STIPPLE_ENABLE */
1677 xf_emit(ctx, 0xf, 0); 2227 xf_emit(ctx, 1, 0x00ffff00); /* 00ffffff LINE_STIPPLE_PATTERN */
1678 xf_emit(ctx, 1, 4); 2228 xf_emit(ctx, 1, 0); /* ffffffff POLYGON_OFFSET_UNITS */
1679 xf_emit(ctx, 2, 0); 2229 xf_emit(ctx, 1, 0); /* ffffffff POLYGON_OFFSET_FACTOR */
1680 if (dev_priv->chipset > 0xa0 && dev_priv->chipset < 0xaa) 2230 xf_emit(ctx, 1, 0); /* 00000003 tesla UNK1668 */
1681 xf_emit(ctx, 1, 3); 2231 xf_emit(ctx, 2, 0); /* 07ffffff SCREEN_SCISSOR */
2232 xf_emit(ctx, 1, 0); /* 00000001 tesla UNK1900 */
2233 xf_emit(ctx, 1, 0xf); /* 0000000f COLOR_MASK */
2234 xf_emit(ctx, 7, 0); /* 0000000f COLOR_MASK */
2235 xf_emit(ctx, 1, 0x0fac6881); /* 0fffffff RT_CONTROL */
2236 xf_emit(ctx, 1, 0x11); /* 0000007f RT_FORMAT */
2237 xf_emit(ctx, 7, 0); /* 0000007f RT_FORMAT */
2238 xf_emit(ctx, 8, 0); /* 00000001 RT_HORIZ_LINEAR */
2239 xf_emit(ctx, 1, 4); /* 00000007 FP_CONTROL */
2240 xf_emit(ctx, 1, 0); /* 00000001 ALPHA_TEST_ENABLE */
2241 xf_emit(ctx, 1, 0); /* 00000007 ALPHA_TEST_FUNC */
2242 if (IS_NVA3F(dev_priv->chipset))
2243 xf_emit(ctx, 1, 3); /* 00000003 UNK16B4 */
1682 else if (dev_priv->chipset >= 0xa0) 2244 else if (dev_priv->chipset >= 0xa0)
1683 xf_emit(ctx, 1, 1); 2245 xf_emit(ctx, 1, 1); /* 00000001 UNK16B4 */
1684 xf_emit(ctx, 2, 0); 2246 xf_emit(ctx, 1, 0); /* 00000003 MULTISAMPLE_CTRL */
1685 xf_emit(ctx, 1, 2); 2247 xf_emit(ctx, 1, 0); /* 00000003 tesla UNK0F90 */
1686 xf_emit(ctx, 2, 0x04000000); 2248 xf_emit(ctx, 1, 2); /* 00000003 tesla UNK143C */
1687 xf_emit(ctx, 3, 0); 2249 xf_emit(ctx, 2, 0x04000000); /* 07ffffff tesla UNK0D6C */
1688 xf_emit(ctx, 1, 5); 2250 xf_emit(ctx, 1, 0); /* 000000ff STENCIL_FRONT_MASK */
1689 xf_emit(ctx, 1, 0x52); 2251 xf_emit(ctx, 1, 0); /* 00000001 DEPTH_WRITE_ENABLE */
1690 if (dev_priv->chipset == 0x50) { 2252 xf_emit(ctx, 1, 0); /* 00000001 SAMPLECNT_ENABLE */
1691 xf_emit(ctx, 0x13, 0); 2253 xf_emit(ctx, 1, 5); /* 0000000f UNK1408 */
1692 } else { 2254 xf_emit(ctx, 1, 0x52); /* 000001ff SEMANTIC_PTSZ */
1693 xf_emit(ctx, 4, 0); 2255 xf_emit(ctx, 1, 0); /* ffffffff POINT_SIZE */
1694 xf_emit(ctx, 1, 1); 2256 xf_emit(ctx, 1, 0); /* 00000001 */
1695 if (dev_priv->chipset > 0xa0 && dev_priv->chipset < 0xaa) 2257 xf_emit(ctx, 1, 0); /* 00000007 tesla UNK0FB4 */
1696 xf_emit(ctx, 0x11, 0); 2258 if (dev_priv->chipset != 0x50) {
1697 else 2259 xf_emit(ctx, 1, 0); /* 3ff */
1698 xf_emit(ctx, 0x10, 0); 2260 xf_emit(ctx, 1, 1); /* 00000001 tesla UNK1110 */
1699 } 2261 }
1700 xf_emit(ctx, 0x10, 0x3f800000); 2262 if (IS_NVA3F(dev_priv->chipset))
1701 xf_emit(ctx, 1, 0x10); 2263 xf_emit(ctx, 1, 0); /* 00000003 tesla UNK1928 */
1702 xf_emit(ctx, 0x26, 0); 2264 xf_emit(ctx, 0x10, 0); /* ffffffff DEPTH_RANGE_NEAR */
1703 xf_emit(ctx, 1, 0x8100c12); 2265 xf_emit(ctx, 0x10, 0x3f800000); /* ffffffff DEPTH_RANGE_FAR */
1704 xf_emit(ctx, 1, 5); 2266 xf_emit(ctx, 1, 0x10); /* 000000ff VIEW_VOLUME_CLIP_CTRL */
1705 xf_emit(ctx, 2, 0); 2267 xf_emit(ctx, 0x20, 0); /* 07ffffff VIEWPORT_HORIZ, then VIEWPORT_VERT. (W&0x3fff)<<13 | (X&0x1fff). */
1706 xf_emit(ctx, 1, 1); 2268 xf_emit(ctx, 1, 0); /* ffffffff tesla UNK187C */
1707 xf_emit(ctx, 1, 0); 2269 xf_emit(ctx, 1, 0); /* 00000003 WINDOW_ORIGIN */
1708 xf_emit(ctx, 4, 0xffff); 2270 xf_emit(ctx, 1, 0); /* 00000001 STENCIL_FRONT_ENABLE */
2271 xf_emit(ctx, 1, 0); /* 00000001 DEPTH_TEST_ENABLE */
2272 xf_emit(ctx, 1, 0); /* 00000001 STENCIL_BACK_ENABLE */
2273 xf_emit(ctx, 1, 0); /* 000000ff STENCIL_BACK_MASK */
2274 xf_emit(ctx, 1, 0x8100c12); /* 1fffffff FP_INTERPOLANT_CTRL */
2275 xf_emit(ctx, 1, 5); /* 0000000f tesla UNK1220 */
2276 xf_emit(ctx, 1, 0); /* 00000007 MULTISAMPLE_SAMPLES_LOG2 */
2277 xf_emit(ctx, 1, 0); /* 000000ff tesla UNK1A20 */
2278 xf_emit(ctx, 1, 1); /* 00000001 ZETA_ENABLE */
2279 xf_emit(ctx, 1, 0); /* 00000001 VERTEX_TWO_SIDE_ENABLE */
2280 xf_emit(ctx, 4, 0xffff); /* 0000ffff MSAA_MASK */
1709 if (dev_priv->chipset != 0x50) 2281 if (dev_priv->chipset != 0x50)
1710 xf_emit(ctx, 1, 3); 2282 xf_emit(ctx, 1, 3); /* 00000003 tesla UNK1100 */
1711 if (dev_priv->chipset < 0xa0) 2283 if (dev_priv->chipset < 0xa0)
1712 xf_emit(ctx, 0x1f, 0); 2284 xf_emit(ctx, 0x1c, 0); /* RO */
1713 else if (dev_priv->chipset > 0xa0 && dev_priv->chipset < 0xaa) 2285 else if (IS_NVA3F(dev_priv->chipset))
1714 xf_emit(ctx, 0xc, 0); 2286 xf_emit(ctx, 0x9, 0);
1715 else 2287 xf_emit(ctx, 1, 0); /* 00000001 UNK1534 */
1716 xf_emit(ctx, 3, 0); 2288 xf_emit(ctx, 1, 0); /* 00000001 LINE_SMOOTH_ENABLE */
1717 xf_emit(ctx, 1, 0x00ffff00); 2289 xf_emit(ctx, 1, 0); /* 00000001 LINE_STIPPLE_ENABLE */
1718 xf_emit(ctx, 1, 0x1a); 2290 xf_emit(ctx, 1, 0x00ffff00); /* 00ffffff LINE_STIPPLE_PATTERN */
2291 xf_emit(ctx, 1, 0x1a); /* 0000001f POLYGON_MODE */
2292 xf_emit(ctx, 1, 0); /* 00000003 WINDOW_ORIGIN */
1719 if (dev_priv->chipset != 0x50) { 2293 if (dev_priv->chipset != 0x50) {
1720 xf_emit(ctx, 1, 0); 2294 xf_emit(ctx, 1, 3); /* 00000003 tesla UNK1100 */
1721 xf_emit(ctx, 1, 3); 2295 xf_emit(ctx, 1, 0); /* 3ff */
1722 } 2296 }
2297 /* XXX: the following block could belong either to unk1cxx, or
2298 * to STRMOUT. Rather hard to tell. */
1723 if (dev_priv->chipset < 0xa0) 2299 if (dev_priv->chipset < 0xa0)
1724 xf_emit(ctx, 0x26, 0); 2300 xf_emit(ctx, 0x25, 0);
1725 else 2301 else
1726 xf_emit(ctx, 0x3c, 0); 2302 xf_emit(ctx, 0x3b, 0);
1727 xf_emit(ctx, 1, 0x102); 2303}
1728 xf_emit(ctx, 1, 0); 2304
1729 xf_emit(ctx, 4, 4); 2305static void
1730 if (dev_priv->chipset >= 0xa0) 2306nv50_graph_construct_gene_strmout(struct nouveau_grctx *ctx)
1731 xf_emit(ctx, 8, 0); 2307{
1732 xf_emit(ctx, 2, 4); 2308 struct drm_nouveau_private *dev_priv = ctx->dev->dev_private;
1733 xf_emit(ctx, 1, 0); 2309 xf_emit(ctx, 1, 0x102); /* 0000ffff STRMOUT_BUFFER_CTRL */
2310 xf_emit(ctx, 1, 0); /* ffffffff STRMOUT_PRIMITIVE_COUNT */
2311 xf_emit(ctx, 4, 4); /* 000000ff STRMOUT_NUM_ATTRIBS */
2312 if (dev_priv->chipset >= 0xa0) {
2313 xf_emit(ctx, 4, 0); /* ffffffff UNK1A8C */
2314 xf_emit(ctx, 4, 0); /* ffffffff UNK1780 */
2315 }
2316 xf_emit(ctx, 1, 4); /* 000000ff GP_RESULT_MAP_SIZE */
2317 xf_emit(ctx, 1, 4); /* 0000007f VP_RESULT_MAP_SIZE */
2318 xf_emit(ctx, 1, 0); /* 00000001 GP_ENABLE */
1734 if (dev_priv->chipset == 0x50) 2319 if (dev_priv->chipset == 0x50)
1735 xf_emit(ctx, 1, 0x3ff); 2320 xf_emit(ctx, 1, 0x3ff); /* 000003ff tesla UNK0D68 */
1736 else 2321 else
1737 xf_emit(ctx, 1, 0x7ff); 2322 xf_emit(ctx, 1, 0x7ff); /* 000007ff tesla UNK0D68 */
1738 xf_emit(ctx, 1, 0); 2323 xf_emit(ctx, 1, 0); /* ffffffff tesla UNK1A30 */
1739 xf_emit(ctx, 1, 0x102); 2324 /* SEEK */
1740 xf_emit(ctx, 9, 0); 2325 xf_emit(ctx, 1, 0x102); /* 0000ffff STRMOUT_BUFFER_CTRL */
1741 xf_emit(ctx, 4, 4); 2326 xf_emit(ctx, 1, 0); /* ffffffff STRMOUT_PRIMITIVE_COUNT */
1742 xf_emit(ctx, 0x2c, 0); 2327 xf_emit(ctx, 4, 0); /* 000000ff STRMOUT_ADDRESS_HIGH */
2328 xf_emit(ctx, 4, 0); /* ffffffff STRMOUT_ADDRESS_LOW */
2329 xf_emit(ctx, 4, 4); /* 000000ff STRMOUT_NUM_ATTRIBS */
2330 if (dev_priv->chipset >= 0xa0) {
2331 xf_emit(ctx, 4, 0); /* ffffffff UNK1A8C */
2332 xf_emit(ctx, 4, 0); /* ffffffff UNK1780 */
2333 }
2334 xf_emit(ctx, 1, 0); /* 0000ffff DMA_STRMOUT */
2335 xf_emit(ctx, 1, 0); /* 0000ffff DMA_QUERY */
2336 xf_emit(ctx, 1, 0); /* 000000ff QUERY_ADDRESS_HIGH */
2337 xf_emit(ctx, 2, 0); /* ffffffff QUERY_ADDRESS_LOW QUERY_COUNTER */
2338 xf_emit(ctx, 2, 0); /* ffffffff */
2339 xf_emit(ctx, 1, 0); /* ffffffff tesla UNK1A30 */
2340 /* SEEK */
2341 xf_emit(ctx, 0x20, 0); /* ffffffff STRMOUT_MAP */
2342 xf_emit(ctx, 1, 0); /* 0000000f */
2343 xf_emit(ctx, 1, 0); /* 00000000? */
2344 xf_emit(ctx, 2, 0); /* ffffffff */
2345}
2346
2347static void
2348nv50_graph_construct_gene_ropm1(struct nouveau_grctx *ctx)
2349{
2350 struct drm_nouveau_private *dev_priv = ctx->dev->dev_private;
2351 xf_emit(ctx, 1, 0x4e3bfdf); /* ffffffff UNK0D64 */
2352 xf_emit(ctx, 1, 0x4e3bfdf); /* ffffffff UNK0DF4 */
2353 xf_emit(ctx, 1, 0); /* 00000007 */
2354 xf_emit(ctx, 1, 0); /* 000003ff */
2355 if (IS_NVA3F(dev_priv->chipset))
2356 xf_emit(ctx, 1, 0x11); /* 000000ff tesla UNK1968 */
2357 xf_emit(ctx, 1, 0); /* ffffffff tesla UNK1A3C */
2358}
2359
2360static void
2361nv50_graph_construct_gene_ropm2(struct nouveau_grctx *ctx)
2362{
2363 struct drm_nouveau_private *dev_priv = ctx->dev->dev_private;
2364 /* SEEK */
2365 xf_emit(ctx, 1, 0); /* 0000ffff DMA_QUERY */
2366 xf_emit(ctx, 1, 0x0fac6881); /* 0fffffff RT_CONTROL */
2367 xf_emit(ctx, 2, 0); /* ffffffff */
2368 xf_emit(ctx, 1, 0); /* 000000ff QUERY_ADDRESS_HIGH */
2369 xf_emit(ctx, 2, 0); /* ffffffff QUERY_ADDRESS_LOW, COUNTER */
2370 xf_emit(ctx, 1, 0); /* 00000001 SAMPLECNT_ENABLE */
2371 xf_emit(ctx, 1, 0); /* 7 */
2372 /* SEEK */
2373 xf_emit(ctx, 1, 0); /* 0000ffff DMA_QUERY */
2374 xf_emit(ctx, 1, 0); /* 000000ff QUERY_ADDRESS_HIGH */
2375 xf_emit(ctx, 2, 0); /* ffffffff QUERY_ADDRESS_LOW, COUNTER */
2376 xf_emit(ctx, 1, 0x4e3bfdf); /* ffffffff UNK0D64 */
2377 xf_emit(ctx, 1, 0x4e3bfdf); /* ffffffff UNK0DF4 */
2378 xf_emit(ctx, 1, 0); /* 00000001 eng2d UNK260 */
2379 xf_emit(ctx, 1, 0); /* ff/3ff */
2380 xf_emit(ctx, 1, 0); /* 00000007 */
2381 if (IS_NVA3F(dev_priv->chipset))
2382 xf_emit(ctx, 1, 0x11); /* 000000ff tesla UNK1968 */
2383 xf_emit(ctx, 1, 0); /* ffffffff tesla UNK1A3C */
1743} 2384}
1744 2385
1745static void 2386static void
@@ -1749,443 +2390,709 @@ nv50_graph_construct_gene_ropc(struct nouveau_grctx *ctx)
1749 int magic2; 2390 int magic2;
1750 if (dev_priv->chipset == 0x50) { 2391 if (dev_priv->chipset == 0x50) {
1751 magic2 = 0x00003e60; 2392 magic2 = 0x00003e60;
1752 } else if (dev_priv->chipset <= 0xa0 || dev_priv->chipset >= 0xaa) { 2393 } else if (!IS_NVA3F(dev_priv->chipset)) {
1753 magic2 = 0x001ffe67; 2394 magic2 = 0x001ffe67;
1754 } else { 2395 } else {
1755 magic2 = 0x00087e67; 2396 magic2 = 0x00087e67;
1756 } 2397 }
1757 xf_emit(ctx, 8, 0); 2398 xf_emit(ctx, 1, 0); /* f/7 MUTISAMPLE_SAMPLES_LOG2 */
1758 xf_emit(ctx, 1, 2); 2399 xf_emit(ctx, 1, 0); /* 00000001 tesla UNK1534 */
1759 xf_emit(ctx, 1, 0); 2400 xf_emit(ctx, 1, 0); /* 00000007 STENCIL_BACK_FUNC_FUNC */
1760 xf_emit(ctx, 1, magic2); 2401 xf_emit(ctx, 1, 0); /* 000000ff STENCIL_BACK_FUNC_MASK */
1761 xf_emit(ctx, 4, 0); 2402 xf_emit(ctx, 1, 0); /* 000000ff STENCIL_BACK_MASK */
1762 if (dev_priv->chipset > 0xa0 && dev_priv->chipset < 0xaa) 2403 xf_emit(ctx, 3, 0); /* 00000007 STENCIL_BACK_OP_FAIL, ZFAIL, ZPASS */
1763 xf_emit(ctx, 1, 1); 2404 xf_emit(ctx, 1, 2); /* 00000003 tesla UNK143C */
1764 xf_emit(ctx, 7, 0); 2405 xf_emit(ctx, 1, 0); /* ffff0ff3 */
1765 if (dev_priv->chipset >= 0xa0 && dev_priv->chipset < 0xaa) 2406 xf_emit(ctx, 1, magic2); /* 001fffff tesla UNK0F78 */
1766 xf_emit(ctx, 1, 0x15); 2407 xf_emit(ctx, 1, 0); /* 00000001 DEPTH_BOUNDS_EN */
1767 xf_emit(ctx, 1, 0); 2408 xf_emit(ctx, 1, 0); /* 00000007 DEPTH_TEST_FUNC */
1768 xf_emit(ctx, 1, 1); 2409 xf_emit(ctx, 1, 0); /* 00000001 DEPTH_TEST_ENABLE */
1769 xf_emit(ctx, 1, 0x10); 2410 xf_emit(ctx, 1, 0); /* 00000001 DEPTH_WRITE_ENABLE */
1770 xf_emit(ctx, 2, 0); 2411 if (IS_NVA3F(dev_priv->chipset))
1771 xf_emit(ctx, 1, 1); 2412 xf_emit(ctx, 1, 1); /* 0000001f tesla UNK169C */
1772 xf_emit(ctx, 4, 0); 2413 xf_emit(ctx, 1, 0); /* 00000007 STENCIL_FRONT_FUNC_FUNC */
2414 xf_emit(ctx, 1, 0); /* 000000ff STENCIL_FRONT_FUNC_MASK */
2415 xf_emit(ctx, 1, 0); /* 000000ff STENCIL_FRONT_MASK */
2416 xf_emit(ctx, 3, 0); /* 00000007 STENCIL_FRONT_OP_FAIL, ZFAIL, ZPASS */
2417 xf_emit(ctx, 1, 0); /* 00000001 STENCIL_FRONT_ENABLE */
2418 if (dev_priv->chipset >= 0xa0 && !IS_NVAAF(dev_priv->chipset))
2419 xf_emit(ctx, 1, 0x15); /* 000000ff */
2420 xf_emit(ctx, 1, 0); /* 00000001 STENCIL_BACK_ENABLE */
2421 xf_emit(ctx, 1, 1); /* 00000001 tesla UNK15B4 */
2422 xf_emit(ctx, 1, 0x10); /* 3ff/ff VIEW_VOLUME_CLIP_CTRL */
2423 xf_emit(ctx, 1, 0); /* ffffffff CLEAR_DEPTH */
2424 xf_emit(ctx, 1, 0); /* 0000000f ZETA_FORMAT */
2425 xf_emit(ctx, 1, 1); /* 00000001 ZETA_ENABLE */
2426 xf_emit(ctx, 1, 0); /* ffffffff tesla UNK1A3C */
1773 if (dev_priv->chipset == 0x86 || dev_priv->chipset == 0x92 || dev_priv->chipset == 0x98 || dev_priv->chipset >= 0xa0) { 2427 if (dev_priv->chipset == 0x86 || dev_priv->chipset == 0x92 || dev_priv->chipset == 0x98 || dev_priv->chipset >= 0xa0) {
1774 xf_emit(ctx, 1, 4); 2428 xf_emit(ctx, 3, 0); /* ff, ffffffff, ffffffff */
1775 xf_emit(ctx, 1, 0x400); 2429 xf_emit(ctx, 1, 4); /* 7 */
1776 xf_emit(ctx, 1, 0x300); 2430 xf_emit(ctx, 1, 0x400); /* fffffff */
1777 xf_emit(ctx, 1, 0x1001); 2431 xf_emit(ctx, 1, 0x300); /* ffff */
2432 xf_emit(ctx, 1, 0x1001); /* 1fff */
1778 if (dev_priv->chipset != 0xa0) { 2433 if (dev_priv->chipset != 0xa0) {
1779 if (dev_priv->chipset > 0xa0 && dev_priv->chipset < 0xaa) 2434 if (IS_NVA3F(dev_priv->chipset))
1780 xf_emit(ctx, 1, 0); 2435 xf_emit(ctx, 1, 0); /* 0000000f UNK15C8 */
1781 else 2436 else
1782 xf_emit(ctx, 1, 0x15); 2437 xf_emit(ctx, 1, 0x15); /* ff */
1783 } 2438 }
1784 xf_emit(ctx, 3, 0);
1785 } 2439 }
1786 xf_emit(ctx, 2, 0); 2440 xf_emit(ctx, 1, 0); /* 00000007 MULTISAMPLE_SAMPLES_LOG2 */
1787 xf_emit(ctx, 1, 2); 2441 xf_emit(ctx, 1, 0); /* 00000001 tesla UNK1534 */
1788 xf_emit(ctx, 8, 0); 2442 xf_emit(ctx, 1, 0); /* 00000007 STENCIL_BACK_FUNC_FUNC */
1789 xf_emit(ctx, 1, 1); 2443 xf_emit(ctx, 1, 0); /* 000000ff STENCIL_BACK_FUNC_MASK */
1790 xf_emit(ctx, 1, 0x10); 2444 xf_emit(ctx, 1, 0); /* ffff0ff3 */
1791 xf_emit(ctx, 1, 0); 2445 xf_emit(ctx, 1, 2); /* 00000003 tesla UNK143C */
1792 xf_emit(ctx, 1, 1); 2446 xf_emit(ctx, 1, 0); /* 00000001 DEPTH_BOUNDS_EN */
1793 xf_emit(ctx, 0x13, 0); 2447 xf_emit(ctx, 1, 0); /* 00000007 DEPTH_TEST_FUNC */
1794 xf_emit(ctx, 1, 0x10); 2448 xf_emit(ctx, 1, 0); /* 00000001 DEPTH_TEST_ENABLE */
1795 xf_emit(ctx, 0x10, 0); 2449 xf_emit(ctx, 1, 0); /* 00000001 DEPTH_WRITE_ENABLE */
1796 xf_emit(ctx, 0x10, 0x3f800000); 2450 xf_emit(ctx, 1, 0); /* 00000007 STENCIL_FRONT_FUNC_FUNC */
1797 xf_emit(ctx, 0x19, 0); 2451 xf_emit(ctx, 1, 0); /* 000000ff STENCIL_FRONT_FUNC_MASK */
1798 xf_emit(ctx, 1, 0x10); 2452 xf_emit(ctx, 1, 0); /* 00000001 STENCIL_FRONT_ENABLE */
1799 xf_emit(ctx, 1, 0); 2453 xf_emit(ctx, 1, 0); /* 00000001 STENCIL_BACK_ENABLE */
1800 xf_emit(ctx, 1, 0x3f); 2454 xf_emit(ctx, 1, 1); /* 00000001 tesla UNK15B4 */
1801 xf_emit(ctx, 6, 0); 2455 xf_emit(ctx, 1, 0x10); /* 7f/ff VIEW_VOLUME_CLIP_CTRL */
1802 xf_emit(ctx, 1, 1); 2456 xf_emit(ctx, 1, 0); /* 0000000f ZETA_FORMAT */
1803 xf_emit(ctx, 1, 0); 2457 xf_emit(ctx, 1, 1); /* 00000001 ZETA_ENABLE */
1804 xf_emit(ctx, 1, 1); 2458 xf_emit(ctx, 1, 0); /* ffffffff tesla UNK1A3C */
1805 xf_emit(ctx, 1, 0); 2459 xf_emit(ctx, 1, 0); /* 00000001 tesla UNK1534 */
1806 xf_emit(ctx, 1, 1); 2460 xf_emit(ctx, 1, 0); /* 00000001 tesla UNK1900 */
2461 xf_emit(ctx, 1, 0); /* 00000007 STENCIL_BACK_FUNC_FUNC */
2462 xf_emit(ctx, 1, 0); /* 000000ff STENCIL_BACK_FUNC_MASK */
2463 xf_emit(ctx, 1, 0); /* 000000ff STENCIL_BACK_FUNC_REF */
2464 xf_emit(ctx, 2, 0); /* ffffffff DEPTH_BOUNDS */
2465 xf_emit(ctx, 1, 0); /* 00000001 DEPTH_BOUNDS_EN */
2466 xf_emit(ctx, 1, 0); /* 00000007 DEPTH_TEST_FUNC */
2467 xf_emit(ctx, 1, 0); /* 00000001 DEPTH_TEST_ENABLE */
2468 xf_emit(ctx, 1, 0); /* 00000001 DEPTH_WRITE_ENABLE */
2469 xf_emit(ctx, 1, 0); /* 0000000f */
2470 xf_emit(ctx, 1, 0); /* 00000001 tesla UNK0FB0 */
2471 xf_emit(ctx, 1, 0); /* 00000007 STENCIL_FRONT_FUNC_FUNC */
2472 xf_emit(ctx, 1, 0); /* 000000ff STENCIL_FRONT_FUNC_MASK */
2473 xf_emit(ctx, 1, 0); /* 000000ff STENCIL_FRONT_FUNC_REF */
2474 xf_emit(ctx, 1, 0); /* 00000001 STENCIL_FRONT_ENABLE */
2475 xf_emit(ctx, 1, 0); /* 00000001 STENCIL_BACK_ENABLE */
2476 xf_emit(ctx, 1, 0x10); /* 7f/ff VIEW_VOLUME_CLIP_CTRL */
2477 xf_emit(ctx, 0x10, 0); /* ffffffff DEPTH_RANGE_NEAR */
2478 xf_emit(ctx, 0x10, 0x3f800000); /* ffffffff DEPTH_RANGE_FAR */
2479 xf_emit(ctx, 1, 0); /* 0000000f ZETA_FORMAT */
2480 xf_emit(ctx, 1, 0); /* 00000007 MULTISAMPLE_SAMPLES_LOG2 */
2481 xf_emit(ctx, 1, 0); /* 00000007 STENCIL_BACK_FUNC_FUNC */
2482 xf_emit(ctx, 1, 0); /* 000000ff STENCIL_BACK_FUNC_MASK */
2483 xf_emit(ctx, 1, 0); /* 000000ff STENCIL_BACK_FUNC_REF */
2484 xf_emit(ctx, 1, 0); /* 000000ff STENCIL_BACK_MASK */
2485 xf_emit(ctx, 3, 0); /* 00000007 STENCIL_BACK_OP_FAIL, ZFAIL, ZPASS */
2486 xf_emit(ctx, 2, 0); /* ffffffff DEPTH_BOUNDS */
2487 xf_emit(ctx, 1, 0); /* 00000001 DEPTH_BOUNDS_EN */
2488 xf_emit(ctx, 1, 0); /* 00000007 DEPTH_TEST_FUNC */
2489 xf_emit(ctx, 1, 0); /* 00000001 DEPTH_TEST_ENABLE */
2490 xf_emit(ctx, 1, 0); /* 00000001 DEPTH_WRITE_ENABLE */
2491 xf_emit(ctx, 1, 0); /* 000000ff CLEAR_STENCIL */
2492 xf_emit(ctx, 1, 0); /* 00000007 STENCIL_FRONT_FUNC_FUNC */
2493 xf_emit(ctx, 1, 0); /* 000000ff STENCIL_FRONT_FUNC_MASK */
2494 xf_emit(ctx, 1, 0); /* 000000ff STENCIL_FRONT_FUNC_REF */
2495 xf_emit(ctx, 1, 0); /* 000000ff STENCIL_FRONT_MASK */
2496 xf_emit(ctx, 3, 0); /* 00000007 STENCIL_FRONT_OP_FAIL, ZFAIL, ZPASS */
2497 xf_emit(ctx, 1, 0); /* 00000001 STENCIL_FRONT_ENABLE */
2498 xf_emit(ctx, 1, 0); /* 00000001 STENCIL_BACK_ENABLE */
2499 xf_emit(ctx, 1, 0x10); /* 7f/ff VIEW_VOLUME_CLIP_CTRL */
2500 xf_emit(ctx, 1, 0); /* 0000000f ZETA_FORMAT */
2501 xf_emit(ctx, 1, 0x3f); /* 0000003f UNK1590 */
2502 xf_emit(ctx, 1, 0); /* 00000007 MULTISAMPLE_SAMPLES_LOG2 */
2503 xf_emit(ctx, 1, 0); /* 00000001 tesla UNK1534 */
2504 xf_emit(ctx, 2, 0); /* ffff0ff3, ffff */
2505 xf_emit(ctx, 1, 0); /* 00000001 tesla UNK0FB0 */
2506 xf_emit(ctx, 1, 0); /* 0001ffff GP_BUILTIN_RESULT_EN */
2507 xf_emit(ctx, 1, 1); /* 00000001 tesla UNK15B4 */
2508 xf_emit(ctx, 1, 0); /* 0000000f ZETA_FORMAT */
2509 xf_emit(ctx, 1, 1); /* 00000001 ZETA_ENABLE */
2510 xf_emit(ctx, 1, 0); /* ffffffff CLEAR_DEPTH */
2511 xf_emit(ctx, 1, 1); /* 00000001 tesla UNK19CC */
1807 if (dev_priv->chipset >= 0xa0) { 2512 if (dev_priv->chipset >= 0xa0) {
1808 xf_emit(ctx, 2, 0); 2513 xf_emit(ctx, 2, 0);
1809 xf_emit(ctx, 1, 0x1001); 2514 xf_emit(ctx, 1, 0x1001);
1810 xf_emit(ctx, 0xb, 0); 2515 xf_emit(ctx, 0xb, 0);
1811 } else { 2516 } else {
1812 xf_emit(ctx, 0xc, 0); 2517 xf_emit(ctx, 1, 0); /* 00000007 */
2518 xf_emit(ctx, 1, 0); /* 00000001 tesla UNK1534 */
2519 xf_emit(ctx, 1, 0); /* 00000007 MULTISAMPLE_SAMPLES_LOG2 */
2520 xf_emit(ctx, 8, 0); /* 00000001 BLEND_ENABLE */
2521 xf_emit(ctx, 1, 0); /* ffff0ff3 */
1813 } 2522 }
1814 xf_emit(ctx, 1, 0x11); 2523 xf_emit(ctx, 1, 0x11); /* 3f/7f RT_FORMAT */
1815 xf_emit(ctx, 7, 0); 2524 xf_emit(ctx, 7, 0); /* 3f/7f RT_FORMAT */
1816 xf_emit(ctx, 1, 0xf); 2525 xf_emit(ctx, 1, 0xf); /* 0000000f COLOR_MASK */
1817 xf_emit(ctx, 7, 0); 2526 xf_emit(ctx, 7, 0); /* 0000000f COLOR_MASK */
1818 xf_emit(ctx, 1, 0x11); 2527 xf_emit(ctx, 1, 0x11); /* 3f/7f */
1819 if (dev_priv->chipset == 0x50) 2528 xf_emit(ctx, 1, 0); /* 00000001 LOGIC_OP_ENABLE */
1820 xf_emit(ctx, 4, 0); 2529 if (dev_priv->chipset != 0x50) {
1821 else 2530 xf_emit(ctx, 1, 0); /* 0000000f LOGIC_OP */
1822 xf_emit(ctx, 6, 0); 2531 xf_emit(ctx, 1, 0); /* 000000ff */
1823 xf_emit(ctx, 3, 1); 2532 }
1824 xf_emit(ctx, 1, 2); 2533 xf_emit(ctx, 1, 0); /* 00000007 OPERATION */
1825 xf_emit(ctx, 1, 1); 2534 xf_emit(ctx, 1, 0); /* ff/3ff */
1826 xf_emit(ctx, 1, 2); 2535 xf_emit(ctx, 1, 0); /* 00000003 UNK0F90 */
1827 xf_emit(ctx, 1, 1); 2536 xf_emit(ctx, 2, 1); /* 00000007 BLEND_EQUATION_RGB, ALPHA */
1828 xf_emit(ctx, 1, 0); 2537 xf_emit(ctx, 1, 1); /* 00000001 UNK133C */
1829 xf_emit(ctx, 1, magic2); 2538 xf_emit(ctx, 1, 2); /* 0000001f BLEND_FUNC_SRC_RGB */
1830 xf_emit(ctx, 1, 0); 2539 xf_emit(ctx, 1, 1); /* 0000001f BLEND_FUNC_DST_RGB */
1831 xf_emit(ctx, 1, 0x0fac6881); 2540 xf_emit(ctx, 1, 2); /* 0000001f BLEND_FUNC_SRC_ALPHA */
1832 if (dev_priv->chipset > 0xa0 && dev_priv->chipset < 0xaa) { 2541 xf_emit(ctx, 1, 1); /* 0000001f BLEND_FUNC_DST_ALPHA */
1833 xf_emit(ctx, 1, 0); 2542 xf_emit(ctx, 1, 0); /* 00000001 */
1834 xf_emit(ctx, 0x18, 1); 2543 xf_emit(ctx, 1, magic2); /* 001fffff tesla UNK0F78 */
1835 xf_emit(ctx, 8, 2); 2544 xf_emit(ctx, 1, 0); /* ffffffff tesla UNK1A3C */
1836 xf_emit(ctx, 8, 1); 2545 xf_emit(ctx, 1, 0x0fac6881); /* 0fffffff RT_CONTROL */
1837 xf_emit(ctx, 8, 2); 2546 if (IS_NVA3F(dev_priv->chipset)) {
1838 xf_emit(ctx, 8, 1); 2547 xf_emit(ctx, 1, 0); /* 00000001 tesla UNK12E4 */
1839 xf_emit(ctx, 3, 0); 2548 xf_emit(ctx, 8, 1); /* 00000007 IBLEND_EQUATION_RGB */
1840 xf_emit(ctx, 1, 1); 2549 xf_emit(ctx, 8, 1); /* 00000007 IBLEND_EQUATION_ALPHA */
1841 xf_emit(ctx, 5, 0); 2550 xf_emit(ctx, 8, 1); /* 00000001 IBLEND_UNK00 */
1842 xf_emit(ctx, 1, 1); 2551 xf_emit(ctx, 8, 2); /* 0000001f IBLEND_FUNC_SRC_RGB */
1843 xf_emit(ctx, 0x16, 0); 2552 xf_emit(ctx, 8, 1); /* 0000001f IBLEND_FUNC_DST_RGB */
2553 xf_emit(ctx, 8, 2); /* 0000001f IBLEND_FUNC_SRC_ALPHA */
2554 xf_emit(ctx, 8, 1); /* 0000001f IBLEND_FUNC_DST_ALPHA */
2555 xf_emit(ctx, 1, 0); /* 00000001 tesla UNK1140 */
2556 xf_emit(ctx, 2, 0); /* 00000001 */
2557 xf_emit(ctx, 1, 1); /* 0000001f tesla UNK169C */
2558 xf_emit(ctx, 1, 0); /* 0000000f */
2559 xf_emit(ctx, 1, 0); /* 00000003 */
2560 xf_emit(ctx, 1, 0); /* ffffffff */
2561 xf_emit(ctx, 2, 0); /* 00000001 */
2562 xf_emit(ctx, 1, 1); /* 0000001f tesla UNK169C */
2563 xf_emit(ctx, 1, 0); /* 00000001 */
2564 xf_emit(ctx, 1, 0); /* 000003ff */
2565 } else if (dev_priv->chipset >= 0xa0) {
2566 xf_emit(ctx, 2, 0); /* 00000001 */
2567 xf_emit(ctx, 1, 0); /* 00000007 */
2568 xf_emit(ctx, 1, 0); /* 00000003 */
2569 xf_emit(ctx, 1, 0); /* ffffffff */
2570 xf_emit(ctx, 2, 0); /* 00000001 */
1844 } else { 2571 } else {
1845 if (dev_priv->chipset >= 0xa0) 2572 xf_emit(ctx, 1, 0); /* 00000007 MULTISAMPLE_SAMPLES_LOG2 */
1846 xf_emit(ctx, 0x1b, 0); 2573 xf_emit(ctx, 1, 0); /* 00000003 tesla UNK1430 */
1847 else 2574 xf_emit(ctx, 1, 0); /* ffffffff tesla UNK1A3C */
1848 xf_emit(ctx, 0x15, 0);
1849 } 2575 }
1850 xf_emit(ctx, 1, 1); 2576 xf_emit(ctx, 4, 0); /* ffffffff CLEAR_COLOR */
1851 xf_emit(ctx, 1, 2); 2577 xf_emit(ctx, 4, 0); /* ffffffff BLEND_COLOR A R G B */
1852 xf_emit(ctx, 2, 1); 2578 xf_emit(ctx, 1, 0); /* 00000fff eng2d UNK2B0 */
1853 xf_emit(ctx, 1, 2);
1854 xf_emit(ctx, 2, 1);
1855 if (dev_priv->chipset >= 0xa0) 2579 if (dev_priv->chipset >= 0xa0)
1856 xf_emit(ctx, 4, 0); 2580 xf_emit(ctx, 2, 0); /* 00000001 */
1857 else 2581 xf_emit(ctx, 1, 0); /* 000003ff */
1858 xf_emit(ctx, 3, 0); 2582 xf_emit(ctx, 8, 0); /* 00000001 BLEND_ENABLE */
1859 if (dev_priv->chipset > 0xa0 && dev_priv->chipset < 0xaa) { 2583 xf_emit(ctx, 1, 1); /* 00000001 UNK133C */
1860 xf_emit(ctx, 0x10, 1); 2584 xf_emit(ctx, 1, 2); /* 0000001f BLEND_FUNC_SRC_RGB */
1861 xf_emit(ctx, 8, 2); 2585 xf_emit(ctx, 1, 1); /* 0000001f BLEND_FUNC_DST_RGB */
1862 xf_emit(ctx, 0x10, 1); 2586 xf_emit(ctx, 1, 1); /* 00000007 BLEND_EQUATION_RGB */
1863 xf_emit(ctx, 8, 2); 2587 xf_emit(ctx, 1, 2); /* 0000001f BLEND_FUNC_SRC_ALPHA */
1864 xf_emit(ctx, 8, 1); 2588 xf_emit(ctx, 1, 1); /* 0000001f BLEND_FUNC_DST_ALPHA */
1865 xf_emit(ctx, 3, 0); 2589 xf_emit(ctx, 1, 1); /* 00000007 BLEND_EQUATION_ALPHA */
2590 xf_emit(ctx, 1, 0); /* 00000001 UNK19C0 */
2591 xf_emit(ctx, 1, 0); /* 00000001 LOGIC_OP_ENABLE */
2592 xf_emit(ctx, 1, 0); /* 0000000f LOGIC_OP */
2593 if (dev_priv->chipset >= 0xa0)
2594 xf_emit(ctx, 1, 0); /* 00000001 UNK12E4? NVA3+ only? */
2595 if (IS_NVA3F(dev_priv->chipset)) {
2596 xf_emit(ctx, 8, 1); /* 00000001 IBLEND_UNK00 */
2597 xf_emit(ctx, 8, 1); /* 00000007 IBLEND_EQUATION_RGB */
2598 xf_emit(ctx, 8, 2); /* 0000001f IBLEND_FUNC_SRC_RGB */
2599 xf_emit(ctx, 8, 1); /* 0000001f IBLEND_FUNC_DST_RGB */
2600 xf_emit(ctx, 8, 1); /* 00000007 IBLEND_EQUATION_ALPHA */
2601 xf_emit(ctx, 8, 2); /* 0000001f IBLEND_FUNC_SRC_ALPHA */
2602 xf_emit(ctx, 8, 1); /* 0000001f IBLEND_FUNC_DST_ALPHA */
2603 xf_emit(ctx, 1, 0); /* 00000001 tesla UNK15C4 */
2604 xf_emit(ctx, 1, 0); /* 00000001 */
2605 xf_emit(ctx, 1, 0); /* 00000001 tesla UNK1140 */
1866 } 2606 }
1867 xf_emit(ctx, 1, 0x11); 2607 xf_emit(ctx, 1, 0x11); /* 3f/7f DST_FORMAT */
1868 xf_emit(ctx, 1, 1); 2608 xf_emit(ctx, 1, 1); /* 00000001 DST_LINEAR */
1869 xf_emit(ctx, 0x5b, 0); 2609 xf_emit(ctx, 1, 0); /* 00000007 PATTERN_COLOR_FORMAT */
2610 xf_emit(ctx, 2, 0); /* ffffffff PATTERN_MONO_COLOR */
2611 xf_emit(ctx, 1, 0); /* 00000001 PATTERN_MONO_FORMAT */
2612 xf_emit(ctx, 2, 0); /* ffffffff PATTERN_MONO_BITMAP */
2613 xf_emit(ctx, 1, 0); /* 00000003 PATTERN_SELECT */
2614 xf_emit(ctx, 1, 0); /* 000000ff ROP */
2615 xf_emit(ctx, 1, 0); /* ffffffff BETA1 */
2616 xf_emit(ctx, 1, 0); /* ffffffff BETA4 */
2617 xf_emit(ctx, 1, 0); /* 00000007 OPERATION */
2618 xf_emit(ctx, 0x50, 0); /* 10x ffffff, ffffff, ffffff, ffffff, 3 PATTERN */
1870} 2619}
1871 2620
1872static void 2621static void
1873nv50_graph_construct_xfer_tp_x1(struct nouveau_grctx *ctx) 2622nv50_graph_construct_xfer_unk84xx(struct nouveau_grctx *ctx)
1874{ 2623{
1875 struct drm_nouveau_private *dev_priv = ctx->dev->dev_private; 2624 struct drm_nouveau_private *dev_priv = ctx->dev->dev_private;
1876 int magic3; 2625 int magic3;
1877 if (dev_priv->chipset == 0x50) 2626 switch (dev_priv->chipset) {
2627 case 0x50:
1878 magic3 = 0x1000; 2628 magic3 = 0x1000;
1879 else if (dev_priv->chipset == 0x86 || dev_priv->chipset == 0x98 || dev_priv->chipset >= 0xa8) 2629 break;
2630 case 0x86:
2631 case 0x98:
2632 case 0xa8:
2633 case 0xaa:
2634 case 0xac:
2635 case 0xaf:
1880 magic3 = 0x1e00; 2636 magic3 = 0x1e00;
1881 else 2637 break;
2638 default:
1882 magic3 = 0; 2639 magic3 = 0;
1883 xf_emit(ctx, 1, 0); 2640 }
1884 xf_emit(ctx, 1, 4); 2641 xf_emit(ctx, 1, 0); /* 00000001 GP_ENABLE */
1885 if (dev_priv->chipset > 0xa0 && dev_priv->chipset < 0xaa) 2642 xf_emit(ctx, 1, 4); /* 7f/ff[NVA0+] VP_REG_ALLOC_RESULT */
1886 xf_emit(ctx, 0x24, 0); 2643 xf_emit(ctx, 1, 0); /* 00000001 GP_ENABLE */
2644 xf_emit(ctx, 1, 0); /* ffffffff tesla UNK1A30 */
2645 xf_emit(ctx, 1, 0); /* 111/113[NVA0+] */
2646 if (IS_NVA3F(dev_priv->chipset))
2647 xf_emit(ctx, 0x1f, 0); /* ffffffff */
1887 else if (dev_priv->chipset >= 0xa0) 2648 else if (dev_priv->chipset >= 0xa0)
1888 xf_emit(ctx, 0x14, 0); 2649 xf_emit(ctx, 0x0f, 0); /* ffffffff */
1889 else 2650 else
1890 xf_emit(ctx, 0x15, 0); 2651 xf_emit(ctx, 0x10, 0); /* fffffff VP_RESULT_MAP_1 up */
1891 xf_emit(ctx, 2, 4); 2652 xf_emit(ctx, 2, 0); /* f/1f[NVA3], fffffff/ffffffff[NVA0+] */
2653 xf_emit(ctx, 1, 4); /* 7f/ff VP_REG_ALLOC_RESULT */
2654 xf_emit(ctx, 1, 4); /* 7f/ff VP_RESULT_MAP_SIZE */
1892 if (dev_priv->chipset >= 0xa0) 2655 if (dev_priv->chipset >= 0xa0)
1893 xf_emit(ctx, 1, 0x03020100); 2656 xf_emit(ctx, 1, 0x03020100); /* ffffffff */
1894 else 2657 else
1895 xf_emit(ctx, 1, 0x00608080); 2658 xf_emit(ctx, 1, 0x00608080); /* fffffff VP_RESULT_MAP_0 */
1896 xf_emit(ctx, 4, 0); 2659 xf_emit(ctx, 1, 0); /* 00000001 GP_ENABLE */
1897 xf_emit(ctx, 1, 4); 2660 xf_emit(ctx, 1, 0); /* ffffffff tesla UNK1A30 */
1898 xf_emit(ctx, 2, 0); 2661 xf_emit(ctx, 2, 0); /* 111/113, 7f/ff */
1899 xf_emit(ctx, 2, 4); 2662 xf_emit(ctx, 1, 4); /* 7f/ff VP_RESULT_MAP_SIZE */
1900 xf_emit(ctx, 1, 0x80); 2663 xf_emit(ctx, 1, 0); /* ffffffff tesla UNK1A30 */
2664 xf_emit(ctx, 1, 0); /* 00000001 GP_ENABLE */
2665 xf_emit(ctx, 1, 4); /* 000000ff GP_REG_ALLOC_RESULT */
2666 xf_emit(ctx, 1, 4); /* 000000ff GP_RESULT_MAP_SIZE */
2667 xf_emit(ctx, 1, 0x80); /* 0000ffff GP_VERTEX_OUTPUT_COUNT */
1901 if (magic3) 2668 if (magic3)
1902 xf_emit(ctx, 1, magic3); 2669 xf_emit(ctx, 1, magic3); /* 00007fff tesla UNK141C */
1903 xf_emit(ctx, 1, 4); 2670 xf_emit(ctx, 1, 4); /* 7f/ff VP_RESULT_MAP_SIZE */
1904 xf_emit(ctx, 0x24, 0); 2671 xf_emit(ctx, 1, 0); /* ffffffff tesla UNK1A30 */
1905 xf_emit(ctx, 1, 4); 2672 xf_emit(ctx, 1, 0); /* 111/113 */
1906 xf_emit(ctx, 1, 0x80); 2673 xf_emit(ctx, 0x1f, 0); /* ffffffff GP_RESULT_MAP_1 up */
1907 xf_emit(ctx, 1, 4); 2674 xf_emit(ctx, 1, 0); /* 0000001f */
1908 xf_emit(ctx, 1, 0x03020100); 2675 xf_emit(ctx, 1, 0); /* ffffffff */
1909 xf_emit(ctx, 1, 3); 2676 xf_emit(ctx, 1, 0); /* 00000001 GP_ENABLE */
2677 xf_emit(ctx, 1, 4); /* 000000ff GP_REG_ALLOC_RESULT */
2678 xf_emit(ctx, 1, 0x80); /* 0000ffff GP_VERTEX_OUTPUT_COUNT */
2679 xf_emit(ctx, 1, 4); /* 000000ff GP_RESULT_MAP_SIZE */
2680 xf_emit(ctx, 1, 0x03020100); /* ffffffff GP_RESULT_MAP_0 */
2681 xf_emit(ctx, 1, 3); /* 00000003 GP_OUTPUT_PRIMITIVE_TYPE */
1910 if (magic3) 2682 if (magic3)
1911 xf_emit(ctx, 1, magic3); 2683 xf_emit(ctx, 1, magic3); /* 7fff tesla UNK141C */
1912 xf_emit(ctx, 1, 4); 2684 xf_emit(ctx, 1, 4); /* 7f/ff VP_RESULT_MAP_SIZE */
1913 xf_emit(ctx, 4, 0); 2685 xf_emit(ctx, 1, 0); /* 00000001 PROVOKING_VERTEX_LAST */
1914 xf_emit(ctx, 1, 4); 2686 xf_emit(ctx, 1, 0); /* ffffffff tesla UNK1A30 */
1915 xf_emit(ctx, 1, 3); 2687 xf_emit(ctx, 1, 0); /* 111/113 */
1916 xf_emit(ctx, 3, 0); 2688 xf_emit(ctx, 1, 0); /* 00000001 GP_ENABLE */
1917 xf_emit(ctx, 1, 4); 2689 xf_emit(ctx, 1, 4); /* 000000ff GP_RESULT_MAP_SIZE */
2690 xf_emit(ctx, 1, 3); /* 00000003 GP_OUTPUT_PRIMITIVE_TYPE */
2691 xf_emit(ctx, 1, 0); /* 00000001 PROVOKING_VERTEX_LAST */
2692 xf_emit(ctx, 1, 0); /* ffffffff tesla UNK1A30 */
2693 xf_emit(ctx, 1, 0); /* 00000003 tesla UNK13A0 */
2694 xf_emit(ctx, 1, 4); /* 7f/ff VP_REG_ALLOC_RESULT */
2695 xf_emit(ctx, 1, 0); /* 00000001 GP_ENABLE */
2696 xf_emit(ctx, 1, 0); /* ffffffff tesla UNK1A30 */
2697 xf_emit(ctx, 1, 0); /* 111/113 */
1918 if (dev_priv->chipset == 0x94 || dev_priv->chipset == 0x96) 2698 if (dev_priv->chipset == 0x94 || dev_priv->chipset == 0x96)
1919 xf_emit(ctx, 0x1024, 0); 2699 xf_emit(ctx, 0x1020, 0); /* 4 x (0x400 x 0xffffffff, ff, 0, 0, 0, 4 x ffffffff) */
1920 else if (dev_priv->chipset < 0xa0) 2700 else if (dev_priv->chipset < 0xa0)
1921 xf_emit(ctx, 0xa24, 0); 2701 xf_emit(ctx, 0xa20, 0); /* 4 x (0x280 x 0xffffffff, ff, 0, 0, 0, 4 x ffffffff) */
1922 else if (dev_priv->chipset == 0xa0 || dev_priv->chipset >= 0xaa) 2702 else if (!IS_NVA3F(dev_priv->chipset))
1923 xf_emit(ctx, 0x214, 0); 2703 xf_emit(ctx, 0x210, 0); /* ffffffff */
1924 else 2704 else
1925 xf_emit(ctx, 0x414, 0); 2705 xf_emit(ctx, 0x410, 0); /* ffffffff */
1926 xf_emit(ctx, 1, 4); 2706 xf_emit(ctx, 1, 0); /* 00000001 GP_ENABLE */
1927 xf_emit(ctx, 1, 3); 2707 xf_emit(ctx, 1, 4); /* 000000ff GP_RESULT_MAP_SIZE */
1928 xf_emit(ctx, 2, 0); 2708 xf_emit(ctx, 1, 3); /* 00000003 GP_OUTPUT_PRIMITIVE_TYPE */
2709 xf_emit(ctx, 1, 0); /* 00000001 PROVOKING_VERTEX_LAST */
2710 xf_emit(ctx, 1, 0); /* ffffffff tesla UNK1A30 */
1929} 2711}
1930 2712
1931static void 2713static void
1932nv50_graph_construct_xfer_tp_x2(struct nouveau_grctx *ctx) 2714nv50_graph_construct_xfer_tprop(struct nouveau_grctx *ctx)
1933{ 2715{
1934 struct drm_nouveau_private *dev_priv = ctx->dev->dev_private; 2716 struct drm_nouveau_private *dev_priv = ctx->dev->dev_private;
1935 int magic1, magic2; 2717 int magic1, magic2;
1936 if (dev_priv->chipset == 0x50) { 2718 if (dev_priv->chipset == 0x50) {
1937 magic1 = 0x3ff; 2719 magic1 = 0x3ff;
1938 magic2 = 0x00003e60; 2720 magic2 = 0x00003e60;
1939 } else if (dev_priv->chipset <= 0xa0 || dev_priv->chipset >= 0xaa) { 2721 } else if (!IS_NVA3F(dev_priv->chipset)) {
1940 magic1 = 0x7ff; 2722 magic1 = 0x7ff;
1941 magic2 = 0x001ffe67; 2723 magic2 = 0x001ffe67;
1942 } else { 2724 } else {
1943 magic1 = 0x7ff; 2725 magic1 = 0x7ff;
1944 magic2 = 0x00087e67; 2726 magic2 = 0x00087e67;
1945 } 2727 }
1946 xf_emit(ctx, 3, 0); 2728 xf_emit(ctx, 1, 0); /* 00000007 ALPHA_TEST_FUNC */
1947 if (dev_priv->chipset > 0xa0 && dev_priv->chipset < 0xaa) 2729 xf_emit(ctx, 1, 0); /* ffffffff ALPHA_TEST_REF */
1948 xf_emit(ctx, 1, 1); 2730 xf_emit(ctx, 1, 0); /* 00000001 ALPHA_TEST_ENABLE */
1949 xf_emit(ctx, 0xc, 0); 2731 if (IS_NVA3F(dev_priv->chipset))
1950 xf_emit(ctx, 1, 0xf); 2732 xf_emit(ctx, 1, 1); /* 0000000f UNK16A0 */
1951 xf_emit(ctx, 0xb, 0); 2733 xf_emit(ctx, 1, 0); /* 7/f MULTISAMPLE_SAMPLES_LOG2 */
1952 xf_emit(ctx, 1, 4); 2734 xf_emit(ctx, 1, 0); /* 00000001 tesla UNK1534 */
1953 xf_emit(ctx, 4, 0xffff); 2735 xf_emit(ctx, 1, 0); /* 000000ff STENCIL_BACK_MASK */
1954 xf_emit(ctx, 8, 0); 2736 xf_emit(ctx, 3, 0); /* 00000007 STENCIL_BACK_OP_FAIL, ZFAIL, ZPASS */
1955 xf_emit(ctx, 1, 1); 2737 xf_emit(ctx, 4, 0); /* ffffffff BLEND_COLOR */
1956 xf_emit(ctx, 3, 0); 2738 xf_emit(ctx, 1, 0); /* 00000001 UNK19C0 */
1957 xf_emit(ctx, 1, 1); 2739 xf_emit(ctx, 1, 0); /* 00000001 UNK0FDC */
1958 xf_emit(ctx, 5, 0); 2740 xf_emit(ctx, 1, 0xf); /* 0000000f COLOR_MASK */
1959 xf_emit(ctx, 1, 1); 2741 xf_emit(ctx, 7, 0); /* 0000000f COLOR_MASK */
1960 xf_emit(ctx, 2, 0); 2742 xf_emit(ctx, 1, 0); /* 00000001 DEPTH_TEST_ENABLE */
1961 if (dev_priv->chipset > 0xa0 && dev_priv->chipset < 0xaa) { 2743 xf_emit(ctx, 1, 0); /* 00000001 DEPTH_WRITE_ENABLE */
1962 xf_emit(ctx, 1, 3); 2744 xf_emit(ctx, 1, 0); /* 00000001 LOGIC_OP_ENABLE */
1963 xf_emit(ctx, 1, 0); 2745 xf_emit(ctx, 1, 0); /* ff[NV50]/3ff[NV84+] */
1964 } else if (dev_priv->chipset >= 0xa0) 2746 xf_emit(ctx, 1, 4); /* 00000007 FP_CONTROL */
1965 xf_emit(ctx, 1, 1); 2747 xf_emit(ctx, 4, 0xffff); /* 0000ffff MSAA_MASK */
1966 xf_emit(ctx, 0xa, 0); 2748 xf_emit(ctx, 1, 0); /* 000000ff STENCIL_FRONT_MASK */
1967 xf_emit(ctx, 2, 1); 2749 xf_emit(ctx, 3, 0); /* 00000007 STENCIL_FRONT_OP_FAIL, ZFAIL, ZPASS */
1968 xf_emit(ctx, 1, 2); 2750 xf_emit(ctx, 1, 0); /* 00000001 STENCIL_FRONT_ENABLE */
1969 xf_emit(ctx, 2, 1); 2751 xf_emit(ctx, 1, 0); /* 00000001 STENCIL_BACK_ENABLE */
1970 xf_emit(ctx, 1, 2); 2752 xf_emit(ctx, 2, 0); /* 00007fff WINDOW_OFFSET_XY */
1971 if (dev_priv->chipset > 0xa0 && dev_priv->chipset < 0xaa) { 2753 xf_emit(ctx, 1, 1); /* 00000001 tesla UNK19CC */
1972 xf_emit(ctx, 1, 0); 2754 xf_emit(ctx, 1, 0); /* 7 */
1973 xf_emit(ctx, 0x18, 1); 2755 xf_emit(ctx, 1, 0); /* 00000001 SAMPLECNT_ENABLE */
1974 xf_emit(ctx, 8, 2); 2756 xf_emit(ctx, 1, 0); /* 0000000f ZETA_FORMAT */
1975 xf_emit(ctx, 8, 1); 2757 xf_emit(ctx, 1, 1); /* 00000001 ZETA_ENABLE */
1976 xf_emit(ctx, 8, 2); 2758 xf_emit(ctx, 1, 0); /* ffffffff COLOR_KEY */
1977 xf_emit(ctx, 8, 1); 2759 xf_emit(ctx, 1, 0); /* 00000001 COLOR_KEY_ENABLE */
1978 xf_emit(ctx, 1, 0); 2760 xf_emit(ctx, 1, 0); /* 00000007 COLOR_KEY_FORMAT */
2761 xf_emit(ctx, 2, 0); /* ffffffff SIFC_BITMAP_COLOR */
2762 xf_emit(ctx, 1, 1); /* 00000001 SIFC_BITMAP_WRITE_BIT0_ENABLE */
2763 xf_emit(ctx, 1, 0); /* 00000007 ALPHA_TEST_FUNC */
2764 xf_emit(ctx, 1, 0); /* 00000001 ALPHA_TEST_ENABLE */
2765 if (IS_NVA3F(dev_priv->chipset)) {
2766 xf_emit(ctx, 1, 3); /* 00000003 tesla UNK16B4 */
2767 xf_emit(ctx, 1, 0); /* 00000003 */
2768 xf_emit(ctx, 1, 0); /* 00000003 tesla UNK1298 */
2769 } else if (dev_priv->chipset >= 0xa0) {
2770 xf_emit(ctx, 1, 1); /* 00000001 tesla UNK16B4 */
2771 xf_emit(ctx, 1, 0); /* 00000003 */
2772 } else {
2773 xf_emit(ctx, 1, 0); /* 00000003 MULTISAMPLE_CTRL */
1979 } 2774 }
1980 xf_emit(ctx, 1, 1); 2775 xf_emit(ctx, 1, 0); /* 00000001 tesla UNK1534 */
1981 xf_emit(ctx, 1, 0); 2776 xf_emit(ctx, 8, 0); /* 00000001 BLEND_ENABLE */
1982 xf_emit(ctx, 1, 0x11); 2777 xf_emit(ctx, 1, 1); /* 0000001f BLEND_FUNC_DST_ALPHA */
1983 xf_emit(ctx, 7, 0); 2778 xf_emit(ctx, 1, 1); /* 00000007 BLEND_EQUATION_ALPHA */
1984 xf_emit(ctx, 1, 0x0fac6881); 2779 xf_emit(ctx, 1, 2); /* 0000001f BLEND_FUNC_SRC_ALPHA */
1985 xf_emit(ctx, 2, 0); 2780 xf_emit(ctx, 1, 1); /* 0000001f BLEND_FUNC_DST_RGB */
1986 xf_emit(ctx, 1, 4); 2781 xf_emit(ctx, 1, 1); /* 00000007 BLEND_EQUATION_RGB */
1987 xf_emit(ctx, 3, 0); 2782 xf_emit(ctx, 1, 2); /* 0000001f BLEND_FUNC_SRC_RGB */
1988 xf_emit(ctx, 1, 0x11); 2783 if (IS_NVA3F(dev_priv->chipset)) {
1989 xf_emit(ctx, 1, 1); 2784 xf_emit(ctx, 1, 0); /* 00000001 UNK12E4 */
1990 xf_emit(ctx, 1, 0); 2785 xf_emit(ctx, 8, 1); /* 00000007 IBLEND_EQUATION_RGB */
1991 xf_emit(ctx, 3, 0xcf); 2786 xf_emit(ctx, 8, 1); /* 00000007 IBLEND_EQUATION_ALPHA */
1992 if (dev_priv->chipset > 0xa0 && dev_priv->chipset < 0xaa) 2787 xf_emit(ctx, 8, 1); /* 00000001 IBLEND_UNK00 */
1993 xf_emit(ctx, 1, 1); 2788 xf_emit(ctx, 8, 2); /* 0000001f IBLEND_SRC_RGB */
1994 xf_emit(ctx, 0xa, 0); 2789 xf_emit(ctx, 8, 1); /* 0000001f IBLEND_DST_RGB */
1995 xf_emit(ctx, 2, 1); 2790 xf_emit(ctx, 8, 2); /* 0000001f IBLEND_SRC_ALPHA */
1996 xf_emit(ctx, 1, 2); 2791 xf_emit(ctx, 8, 1); /* 0000001f IBLEND_DST_ALPHA */
1997 xf_emit(ctx, 2, 1); 2792 xf_emit(ctx, 1, 0); /* 00000001 UNK1140 */
1998 xf_emit(ctx, 1, 2); 2793 }
1999 xf_emit(ctx, 1, 1); 2794 xf_emit(ctx, 1, 1); /* 00000001 UNK133C */
2000 xf_emit(ctx, 1, 0); 2795 xf_emit(ctx, 1, 0); /* ffff0ff3 */
2001 xf_emit(ctx, 8, 1); 2796 xf_emit(ctx, 1, 0x11); /* 3f/7f RT_FORMAT */
2002 xf_emit(ctx, 1, 0x11); 2797 xf_emit(ctx, 7, 0); /* 3f/7f RT_FORMAT */
2003 xf_emit(ctx, 7, 0); 2798 xf_emit(ctx, 1, 0x0fac6881); /* 0fffffff RT_CONTROL */
2004 xf_emit(ctx, 1, 0x0fac6881); 2799 xf_emit(ctx, 1, 0); /* 00000001 LOGIC_OP_ENABLE */
2005 xf_emit(ctx, 1, 0xf); 2800 xf_emit(ctx, 1, 0); /* ff/3ff */
2006 xf_emit(ctx, 7, 0); 2801 xf_emit(ctx, 1, 4); /* 00000007 FP_CONTROL */
2007 xf_emit(ctx, 1, magic2); 2802 xf_emit(ctx, 1, 0); /* 00000003 UNK0F90 */
2008 xf_emit(ctx, 2, 0); 2803 xf_emit(ctx, 1, 0); /* 00000001 FRAMEBUFFER_SRGB */
2009 xf_emit(ctx, 1, 0x11); 2804 xf_emit(ctx, 1, 0); /* 7 */
2010 if (dev_priv->chipset > 0xa0 && dev_priv->chipset < 0xaa) 2805 xf_emit(ctx, 1, 0x11); /* 3f/7f DST_FORMAT */
2011 xf_emit(ctx, 2, 1); 2806 xf_emit(ctx, 1, 1); /* 00000001 DST_LINEAR */
2012 else 2807 xf_emit(ctx, 1, 0); /* 00000007 OPERATION */
2013 xf_emit(ctx, 1, 1); 2808 xf_emit(ctx, 1, 0xcf); /* 000000ff SIFC_FORMAT */
2014 if(dev_priv->chipset == 0x50) 2809 xf_emit(ctx, 1, 0xcf); /* 000000ff DRAW_COLOR_FORMAT */
2015 xf_emit(ctx, 1, 0); 2810 xf_emit(ctx, 1, 0xcf); /* 000000ff SRC_FORMAT */
2016 else 2811 if (IS_NVA3F(dev_priv->chipset))
2017 xf_emit(ctx, 3, 0); 2812 xf_emit(ctx, 1, 1); /* 0000001f tesla UNK169C */
2018 xf_emit(ctx, 1, 4); 2813 xf_emit(ctx, 1, 0); /* ffffffff tesla UNK1A3C */
2019 xf_emit(ctx, 5, 0); 2814 xf_emit(ctx, 1, 0); /* 7/f[NVA3] MULTISAMPLE_SAMPLES_LOG2 */
2020 xf_emit(ctx, 1, 1); 2815 xf_emit(ctx, 8, 0); /* 00000001 BLEND_ENABLE */
2021 xf_emit(ctx, 4, 0); 2816 xf_emit(ctx, 1, 1); /* 0000001f BLEND_FUNC_DST_ALPHA */
2022 xf_emit(ctx, 1, 0x11); 2817 xf_emit(ctx, 1, 1); /* 00000007 BLEND_EQUATION_ALPHA */
2023 xf_emit(ctx, 7, 0); 2818 xf_emit(ctx, 1, 2); /* 0000001f BLEND_FUNC_SRC_ALPHA */
2024 xf_emit(ctx, 1, 0x0fac6881); 2819 xf_emit(ctx, 1, 1); /* 0000001f BLEND_FUNC_DST_RGB */
2025 xf_emit(ctx, 3, 0); 2820 xf_emit(ctx, 1, 1); /* 00000007 BLEND_EQUATION_RGB */
2026 xf_emit(ctx, 1, 0x11); 2821 xf_emit(ctx, 1, 2); /* 0000001f BLEND_FUNC_SRC_RGB */
2027 xf_emit(ctx, 1, 1); 2822 xf_emit(ctx, 1, 1); /* 00000001 UNK133C */
2028 xf_emit(ctx, 1, 0); 2823 xf_emit(ctx, 1, 0); /* ffff0ff3 */
2029 xf_emit(ctx, 1, 1); 2824 xf_emit(ctx, 8, 1); /* 00000001 UNK19E0 */
2030 xf_emit(ctx, 1, 0); 2825 xf_emit(ctx, 1, 0x11); /* 3f/7f RT_FORMAT */
2031 xf_emit(ctx, 1, 1); 2826 xf_emit(ctx, 7, 0); /* 3f/7f RT_FORMAT */
2032 xf_emit(ctx, 1, 0); 2827 xf_emit(ctx, 1, 0x0fac6881); /* 0fffffff RT_CONTROL */
2033 xf_emit(ctx, 1, magic1); 2828 xf_emit(ctx, 1, 0xf); /* 0000000f COLOR_MASK */
2034 xf_emit(ctx, 1, 0); 2829 xf_emit(ctx, 7, 0); /* 0000000f COLOR_MASK */
2035 xf_emit(ctx, 1, 1); 2830 xf_emit(ctx, 1, magic2); /* 001fffff tesla UNK0F78 */
2036 xf_emit(ctx, 1, 0); 2831 xf_emit(ctx, 1, 0); /* 00000001 DEPTH_BOUNDS_EN */
2037 xf_emit(ctx, 1, 1); 2832 xf_emit(ctx, 1, 0); /* 00000001 DEPTH_TEST_ENABLE */
2038 xf_emit(ctx, 2, 0); 2833 xf_emit(ctx, 1, 0x11); /* 3f/7f DST_FORMAT */
2039 if (dev_priv->chipset > 0xa0 && dev_priv->chipset < 0xaa) 2834 xf_emit(ctx, 1, 1); /* 00000001 DST_LINEAR */
2040 xf_emit(ctx, 1, 1); 2835 if (IS_NVA3F(dev_priv->chipset))
2041 xf_emit(ctx, 0x28, 0); 2836 xf_emit(ctx, 1, 1); /* 0000001f tesla UNK169C */
2042 xf_emit(ctx, 8, 8); 2837 if (dev_priv->chipset == 0x50)
2043 xf_emit(ctx, 1, 0x11); 2838 xf_emit(ctx, 1, 0); /* ff */
2044 xf_emit(ctx, 7, 0);
2045 xf_emit(ctx, 1, 0x0fac6881);
2046 xf_emit(ctx, 8, 0x400);
2047 xf_emit(ctx, 8, 0x300);
2048 xf_emit(ctx, 1, 1);
2049 xf_emit(ctx, 1, 0xf);
2050 xf_emit(ctx, 7, 0);
2051 xf_emit(ctx, 1, 0x20);
2052 xf_emit(ctx, 1, 0x11);
2053 xf_emit(ctx, 1, 0x100);
2054 xf_emit(ctx, 1, 0);
2055 xf_emit(ctx, 1, 1);
2056 xf_emit(ctx, 2, 0);
2057 xf_emit(ctx, 1, 0x40);
2058 xf_emit(ctx, 1, 0x100);
2059 xf_emit(ctx, 1, 0);
2060 xf_emit(ctx, 1, 3);
2061 xf_emit(ctx, 4, 0);
2062 if (dev_priv->chipset > 0xa0 && dev_priv->chipset < 0xaa)
2063 xf_emit(ctx, 1, 1);
2064 xf_emit(ctx, 1, magic2);
2065 xf_emit(ctx, 3, 0);
2066 xf_emit(ctx, 1, 2);
2067 xf_emit(ctx, 1, 0x0fac6881);
2068 xf_emit(ctx, 9, 0);
2069 xf_emit(ctx, 1, 1);
2070 xf_emit(ctx, 4, 0);
2071 xf_emit(ctx, 1, 4);
2072 xf_emit(ctx, 1, 0);
2073 xf_emit(ctx, 1, 1);
2074 xf_emit(ctx, 1, 0x400);
2075 xf_emit(ctx, 1, 0x300);
2076 xf_emit(ctx, 1, 0x1001);
2077 if (dev_priv->chipset > 0xa0 && dev_priv->chipset < 0xaa)
2078 xf_emit(ctx, 4, 0);
2079 else 2839 else
2080 xf_emit(ctx, 3, 0); 2840 xf_emit(ctx, 3, 0); /* 1, 7, 3ff */
2081 xf_emit(ctx, 1, 0x11); 2841 xf_emit(ctx, 1, 4); /* 00000007 FP_CONTROL */
2082 xf_emit(ctx, 7, 0); 2842 xf_emit(ctx, 1, 0); /* 00000003 UNK0F90 */
2083 xf_emit(ctx, 1, 0x0fac6881); 2843 xf_emit(ctx, 1, 0); /* 00000001 STENCIL_FRONT_ENABLE */
2084 xf_emit(ctx, 1, 0xf); 2844 xf_emit(ctx, 1, 0); /* 00000007 */
2085 if (dev_priv->chipset > 0xa0 && dev_priv->chipset < 0xaa) { 2845 xf_emit(ctx, 1, 0); /* 00000001 SAMPLECNT_ENABLE */
2086 xf_emit(ctx, 0x15, 0); 2846 xf_emit(ctx, 1, 0); /* 0000000f ZETA_FORMAT */
2087 xf_emit(ctx, 1, 1); 2847 xf_emit(ctx, 1, 1); /* 00000001 ZETA_ENABLE */
2088 xf_emit(ctx, 3, 0); 2848 xf_emit(ctx, 1, 0); /* ffffffff tesla UNK1A3C */
2089 } else 2849 xf_emit(ctx, 1, 0); /* 7/f MULTISAMPLE_SAMPLES_LOG2 */
2090 xf_emit(ctx, 0x17, 0); 2850 xf_emit(ctx, 1, 0); /* 00000001 tesla UNK1534 */
2851 xf_emit(ctx, 1, 0); /* ffff0ff3 */
2852 xf_emit(ctx, 1, 0x11); /* 3f/7f RT_FORMAT */
2853 xf_emit(ctx, 7, 0); /* 3f/7f RT_FORMAT */
2854 xf_emit(ctx, 1, 0x0fac6881); /* 0fffffff RT_CONTROL */
2855 xf_emit(ctx, 1, 0); /* 00000001 DEPTH_BOUNDS_EN */
2856 xf_emit(ctx, 1, 0); /* 00000001 DEPTH_TEST_ENABLE */
2857 xf_emit(ctx, 1, 0); /* 00000001 DEPTH_WRITE_ENABLE */
2858 xf_emit(ctx, 1, 0x11); /* 3f/7f DST_FORMAT */
2859 xf_emit(ctx, 1, 1); /* 00000001 DST_LINEAR */
2860 xf_emit(ctx, 1, 0); /* 000fffff BLIT_DU_DX_FRACT */
2861 xf_emit(ctx, 1, 1); /* 0001ffff BLIT_DU_DX_INT */
2862 xf_emit(ctx, 1, 0); /* 000fffff BLIT_DV_DY_FRACT */
2863 xf_emit(ctx, 1, 1); /* 0001ffff BLIT_DV_DY_INT */
2864 xf_emit(ctx, 1, 0); /* ff/3ff */
2865 xf_emit(ctx, 1, magic1); /* 3ff/7ff tesla UNK0D68 */
2866 xf_emit(ctx, 1, 0); /* 00000001 STENCIL_FRONT_ENABLE */
2867 xf_emit(ctx, 1, 1); /* 00000001 tesla UNK15B4 */
2868 xf_emit(ctx, 1, 0); /* 0000000f ZETA_FORMAT */
2869 xf_emit(ctx, 1, 1); /* 00000001 ZETA_ENABLE */
2870 xf_emit(ctx, 1, 0); /* 00000007 */
2871 xf_emit(ctx, 1, 0); /* ffffffff tesla UNK1A3C */
2872 if (IS_NVA3F(dev_priv->chipset))
2873 xf_emit(ctx, 1, 1); /* 0000001f tesla UNK169C */
2874 xf_emit(ctx, 8, 0); /* 0000ffff DMA_COLOR */
2875 xf_emit(ctx, 1, 0); /* 0000ffff DMA_GLOBAL */
2876 xf_emit(ctx, 1, 0); /* 0000ffff DMA_LOCAL */
2877 xf_emit(ctx, 1, 0); /* 0000ffff DMA_STACK */
2878 xf_emit(ctx, 1, 0); /* ff/3ff */
2879 xf_emit(ctx, 1, 0); /* 0000ffff DMA_DST */
2880 xf_emit(ctx, 1, 0); /* 7 */
2881 xf_emit(ctx, 1, 0); /* 7/f MULTISAMPLE_SAMPLES_LOG2 */
2882 xf_emit(ctx, 1, 0); /* ffff0ff3 */
2883 xf_emit(ctx, 8, 0); /* 000000ff RT_ADDRESS_HIGH */
2884 xf_emit(ctx, 8, 0); /* ffffffff RT_LAYER_STRIDE */
2885 xf_emit(ctx, 8, 0); /* ffffffff RT_ADDRESS_LOW */
2886 xf_emit(ctx, 8, 8); /* 0000007f RT_TILE_MODE */
2887 xf_emit(ctx, 1, 0x11); /* 3f/7f RT_FORMAT */
2888 xf_emit(ctx, 7, 0); /* 3f/7f RT_FORMAT */
2889 xf_emit(ctx, 1, 0x0fac6881); /* 0fffffff RT_CONTROL */
2890 xf_emit(ctx, 8, 0x400); /* 0fffffff RT_HORIZ */
2891 xf_emit(ctx, 8, 0x300); /* 0000ffff RT_VERT */
2892 xf_emit(ctx, 1, 1); /* 00001fff RT_ARRAY_MODE */
2893 xf_emit(ctx, 1, 0xf); /* 0000000f COLOR_MASK */
2894 xf_emit(ctx, 7, 0); /* 0000000f COLOR_MASK */
2895 xf_emit(ctx, 1, 0x20); /* 00000fff DST_TILE_MODE */
2896 xf_emit(ctx, 1, 0x11); /* 3f/7f DST_FORMAT */
2897 xf_emit(ctx, 1, 0x100); /* 0001ffff DST_HEIGHT */
2898 xf_emit(ctx, 1, 0); /* 000007ff DST_LAYER */
2899 xf_emit(ctx, 1, 1); /* 00000001 DST_LINEAR */
2900 xf_emit(ctx, 1, 0); /* ffffffff DST_ADDRESS_LOW */
2901 xf_emit(ctx, 1, 0); /* 000000ff DST_ADDRESS_HIGH */
2902 xf_emit(ctx, 1, 0x40); /* 0007ffff DST_PITCH */
2903 xf_emit(ctx, 1, 0x100); /* 0001ffff DST_WIDTH */
2904 xf_emit(ctx, 1, 0); /* 0000ffff */
2905 xf_emit(ctx, 1, 3); /* 00000003 tesla UNK15AC */
2906 xf_emit(ctx, 1, 0); /* ff/3ff */
2907 xf_emit(ctx, 1, 0); /* 0001ffff GP_BUILTIN_RESULT_EN */
2908 xf_emit(ctx, 1, 0); /* 00000003 UNK0F90 */
2909 xf_emit(ctx, 1, 0); /* 00000007 */
2910 if (IS_NVA3F(dev_priv->chipset))
2911 xf_emit(ctx, 1, 1); /* 0000001f tesla UNK169C */
2912 xf_emit(ctx, 1, magic2); /* 001fffff tesla UNK0F78 */
2913 xf_emit(ctx, 1, 0); /* 7/f MULTISAMPLE_SAMPLES_LOG2 */
2914 xf_emit(ctx, 1, 0); /* 00000001 tesla UNK1534 */
2915 xf_emit(ctx, 1, 0); /* ffff0ff3 */
2916 xf_emit(ctx, 1, 2); /* 00000003 tesla UNK143C */
2917 xf_emit(ctx, 1, 0x0fac6881); /* 0fffffff RT_CONTROL */
2918 xf_emit(ctx, 1, 0); /* 0000ffff DMA_ZETA */
2919 xf_emit(ctx, 1, 0); /* 00000001 DEPTH_BOUNDS_EN */
2920 xf_emit(ctx, 1, 0); /* 00000001 DEPTH_TEST_ENABLE */
2921 xf_emit(ctx, 1, 0); /* 00000001 DEPTH_WRITE_ENABLE */
2922 xf_emit(ctx, 2, 0); /* ffff, ff/3ff */
2923 xf_emit(ctx, 1, 0); /* 0001ffff GP_BUILTIN_RESULT_EN */
2924 xf_emit(ctx, 1, 0); /* 00000001 STENCIL_FRONT_ENABLE */
2925 xf_emit(ctx, 1, 0); /* 000000ff STENCIL_FRONT_MASK */
2926 xf_emit(ctx, 1, 1); /* 00000001 tesla UNK15B4 */
2927 xf_emit(ctx, 1, 0); /* 00000007 */
2928 xf_emit(ctx, 1, 0); /* ffffffff ZETA_LAYER_STRIDE */
2929 xf_emit(ctx, 1, 0); /* 000000ff ZETA_ADDRESS_HIGH */
2930 xf_emit(ctx, 1, 0); /* ffffffff ZETA_ADDRESS_LOW */
2931 xf_emit(ctx, 1, 4); /* 00000007 ZETA_TILE_MODE */
2932 xf_emit(ctx, 1, 0); /* 0000000f ZETA_FORMAT */
2933 xf_emit(ctx, 1, 1); /* 00000001 ZETA_ENABLE */
2934 xf_emit(ctx, 1, 0x400); /* 0fffffff ZETA_HORIZ */
2935 xf_emit(ctx, 1, 0x300); /* 0000ffff ZETA_VERT */
2936 xf_emit(ctx, 1, 0x1001); /* 00001fff ZETA_ARRAY_MODE */
2937 xf_emit(ctx, 1, 0); /* ffffffff tesla UNK1A3C */
2938 xf_emit(ctx, 1, 0); /* 7/f MULTISAMPLE_SAMPLES_LOG2 */
2939 if (IS_NVA3F(dev_priv->chipset))
2940 xf_emit(ctx, 1, 0); /* 00000001 */
2941 xf_emit(ctx, 1, 0); /* ffff0ff3 */
2942 xf_emit(ctx, 1, 0x11); /* 3f/7f RT_FORMAT */
2943 xf_emit(ctx, 7, 0); /* 3f/7f RT_FORMAT */
2944 xf_emit(ctx, 1, 0x0fac6881); /* 0fffffff RT_CONTROL */
2945 xf_emit(ctx, 1, 0xf); /* 0000000f COLOR_MASK */
2946 xf_emit(ctx, 7, 0); /* 0000000f COLOR_MASK */
2947 xf_emit(ctx, 1, 0); /* ff/3ff */
2948 xf_emit(ctx, 8, 0); /* 00000001 BLEND_ENABLE */
2949 xf_emit(ctx, 1, 0); /* 00000003 UNK0F90 */
2950 xf_emit(ctx, 1, 0); /* 00000001 FRAMEBUFFER_SRGB */
2951 xf_emit(ctx, 1, 0); /* 7 */
2952 xf_emit(ctx, 1, 0); /* 00000001 LOGIC_OP_ENABLE */
2953 if (IS_NVA3F(dev_priv->chipset)) {
2954 xf_emit(ctx, 1, 0); /* 00000001 UNK1140 */
2955 xf_emit(ctx, 1, 1); /* 0000001f tesla UNK169C */
2956 }
2957 xf_emit(ctx, 1, 0); /* 7/f MULTISAMPLE_SAMPLES_LOG2 */
2958 xf_emit(ctx, 1, 0); /* 00000001 UNK1534 */
2959 xf_emit(ctx, 1, 0); /* ffff0ff3 */
2091 if (dev_priv->chipset >= 0xa0) 2960 if (dev_priv->chipset >= 0xa0)
2092 xf_emit(ctx, 1, 0x0fac6881); 2961 xf_emit(ctx, 1, 0x0fac6881); /* fffffff */
2093 xf_emit(ctx, 1, magic2); 2962 xf_emit(ctx, 1, magic2); /* 001fffff tesla UNK0F78 */
2094 xf_emit(ctx, 3, 0); 2963 xf_emit(ctx, 1, 0); /* 00000001 DEPTH_BOUNDS_EN */
2095 xf_emit(ctx, 1, 0x11); 2964 xf_emit(ctx, 1, 0); /* 00000001 DEPTH_TEST_ENABLE */
2096 xf_emit(ctx, 2, 0); 2965 xf_emit(ctx, 1, 0); /* 00000001 DEPTH_WRITE_ENABLE */
2097 xf_emit(ctx, 1, 4); 2966 xf_emit(ctx, 1, 0x11); /* 3f/7f DST_FORMAT */
2098 xf_emit(ctx, 1, 0); 2967 xf_emit(ctx, 1, 0); /* 00000001 tesla UNK0FB0 */
2099 xf_emit(ctx, 2, 1); 2968 xf_emit(ctx, 1, 0); /* ff/3ff */
2100 xf_emit(ctx, 3, 0); 2969 xf_emit(ctx, 1, 4); /* 00000007 FP_CONTROL */
2101 if (dev_priv->chipset > 0xa0 && dev_priv->chipset < 0xaa) 2970 xf_emit(ctx, 1, 0); /* 00000001 STENCIL_FRONT_ENABLE */
2102 xf_emit(ctx, 2, 1); 2971 xf_emit(ctx, 1, 1); /* 00000001 tesla UNK15B4 */
2103 else 2972 xf_emit(ctx, 1, 1); /* 00000001 tesla UNK19CC */
2104 xf_emit(ctx, 1, 1); 2973 xf_emit(ctx, 1, 0); /* 00000007 */
2105 if (dev_priv->chipset > 0xa0 && dev_priv->chipset < 0xaa) 2974 xf_emit(ctx, 1, 0); /* 00000001 SAMPLECNT_ENABLE */
2106 xf_emit(ctx, 2, 0); 2975 xf_emit(ctx, 1, 0); /* 0000000f ZETA_FORMAT */
2107 else if (dev_priv->chipset != 0x50) 2976 xf_emit(ctx, 1, 1); /* 00000001 ZETA_ENABLE */
2108 xf_emit(ctx, 1, 0); 2977 if (IS_NVA3F(dev_priv->chipset)) {
2978 xf_emit(ctx, 1, 1); /* 0000001f tesla UNK169C */
2979 xf_emit(ctx, 1, 0); /* 0000000f tesla UNK15C8 */
2980 }
2981 xf_emit(ctx, 1, 0); /* ffffffff tesla UNK1A3C */
2982 if (dev_priv->chipset >= 0xa0) {
2983 xf_emit(ctx, 3, 0); /* 7/f, 1, ffff0ff3 */
2984 xf_emit(ctx, 1, 0xfac6881); /* fffffff */
2985 xf_emit(ctx, 4, 0); /* 1, 1, 1, 3ff */
2986 xf_emit(ctx, 1, 4); /* 7 */
2987 xf_emit(ctx, 1, 0); /* 1 */
2988 xf_emit(ctx, 2, 1); /* 1 */
2989 xf_emit(ctx, 2, 0); /* 7, f */
2990 xf_emit(ctx, 1, 1); /* 1 */
2991 xf_emit(ctx, 1, 0); /* 7/f */
2992 if (IS_NVA3F(dev_priv->chipset))
2993 xf_emit(ctx, 0x9, 0); /* 1 */
2994 else
2995 xf_emit(ctx, 0x8, 0); /* 1 */
2996 xf_emit(ctx, 1, 0); /* ffff0ff3 */
2997 xf_emit(ctx, 8, 1); /* 1 */
2998 xf_emit(ctx, 1, 0x11); /* 7f */
2999 xf_emit(ctx, 7, 0); /* 7f */
3000 xf_emit(ctx, 1, 0xfac6881); /* fffffff */
3001 xf_emit(ctx, 1, 0xf); /* f */
3002 xf_emit(ctx, 7, 0); /* f */
3003 xf_emit(ctx, 1, 0x11); /* 7f */
3004 xf_emit(ctx, 1, 1); /* 1 */
3005 xf_emit(ctx, 5, 0); /* 1, 7, 3ff, 3, 7 */
3006 if (IS_NVA3F(dev_priv->chipset)) {
3007 xf_emit(ctx, 1, 0); /* 00000001 UNK1140 */
3008 xf_emit(ctx, 1, 1); /* 0000001f tesla UNK169C */
3009 }
3010 }
2109} 3011}
2110 3012
2111static void 3013static void
2112nv50_graph_construct_xfer_tp_x3(struct nouveau_grctx *ctx) 3014nv50_graph_construct_xfer_tex(struct nouveau_grctx *ctx)
2113{ 3015{
2114 struct drm_nouveau_private *dev_priv = ctx->dev->dev_private; 3016 struct drm_nouveau_private *dev_priv = ctx->dev->dev_private;
2115 xf_emit(ctx, 3, 0); 3017 xf_emit(ctx, 2, 0); /* 1 LINKED_TSC. yes, 2. */
2116 xf_emit(ctx, 1, 1); 3018 if (dev_priv->chipset != 0x50)
2117 xf_emit(ctx, 1, 0); 3019 xf_emit(ctx, 1, 0); /* 3 */
2118 xf_emit(ctx, 1, 1); 3020 xf_emit(ctx, 1, 1); /* 1ffff BLIT_DU_DX_INT */
3021 xf_emit(ctx, 1, 0); /* fffff BLIT_DU_DX_FRACT */
3022 xf_emit(ctx, 1, 1); /* 1ffff BLIT_DV_DY_INT */
3023 xf_emit(ctx, 1, 0); /* fffff BLIT_DV_DY_FRACT */
2119 if (dev_priv->chipset == 0x50) 3024 if (dev_priv->chipset == 0x50)
2120 xf_emit(ctx, 2, 0); 3025 xf_emit(ctx, 1, 0); /* 3 BLIT_CONTROL */
2121 else 3026 else
2122 xf_emit(ctx, 3, 0); 3027 xf_emit(ctx, 2, 0); /* 3ff, 1 */
2123 xf_emit(ctx, 1, 0x2a712488); 3028 xf_emit(ctx, 1, 0x2a712488); /* ffffffff SRC_TIC_0 */
2124 xf_emit(ctx, 1, 0); 3029 xf_emit(ctx, 1, 0); /* ffffffff SRC_TIC_1 */
2125 xf_emit(ctx, 1, 0x4085c000); 3030 xf_emit(ctx, 1, 0x4085c000); /* ffffffff SRC_TIC_2 */
2126 xf_emit(ctx, 1, 0x40); 3031 xf_emit(ctx, 1, 0x40); /* ffffffff SRC_TIC_3 */
2127 xf_emit(ctx, 1, 0x100); 3032 xf_emit(ctx, 1, 0x100); /* ffffffff SRC_TIC_4 */
2128 xf_emit(ctx, 1, 0x10100); 3033 xf_emit(ctx, 1, 0x10100); /* ffffffff SRC_TIC_5 */
2129 xf_emit(ctx, 1, 0x02800000); 3034 xf_emit(ctx, 1, 0x02800000); /* ffffffff SRC_TIC_6 */
3035 xf_emit(ctx, 1, 0); /* ffffffff SRC_TIC_7 */
3036 if (dev_priv->chipset == 0x50) {
3037 xf_emit(ctx, 1, 0); /* 00000001 turing UNK358 */
3038 xf_emit(ctx, 1, 0); /* ffffffff tesla UNK1A34? */
3039 xf_emit(ctx, 1, 0); /* 00000003 turing UNK37C tesla UNK1690 */
3040 xf_emit(ctx, 1, 0); /* 00000003 BLIT_CONTROL */
3041 xf_emit(ctx, 1, 0); /* 00000001 turing UNK32C tesla UNK0F94 */
3042 } else if (!IS_NVAAF(dev_priv->chipset)) {
3043 xf_emit(ctx, 1, 0); /* ffffffff tesla UNK1A34? */
3044 xf_emit(ctx, 1, 0); /* 00000003 */
3045 xf_emit(ctx, 1, 0); /* 000003ff */
3046 xf_emit(ctx, 1, 0); /* 00000003 */
3047 xf_emit(ctx, 1, 0); /* 000003ff */
3048 xf_emit(ctx, 1, 0); /* 00000003 tesla UNK1664 / turing UNK03E8 */
3049 xf_emit(ctx, 1, 0); /* 00000003 */
3050 xf_emit(ctx, 1, 0); /* 000003ff */
3051 } else {
3052 xf_emit(ctx, 0x6, 0);
3053 }
3054 xf_emit(ctx, 1, 0); /* ffffffff tesla UNK1A34 */
3055 xf_emit(ctx, 1, 0); /* 0000ffff DMA_TEXTURE */
3056 xf_emit(ctx, 1, 0); /* 0000ffff DMA_SRC */
2130} 3057}
2131 3058
2132static void 3059static void
2133nv50_graph_construct_xfer_tp_x4(struct nouveau_grctx *ctx) 3060nv50_graph_construct_xfer_unk8cxx(struct nouveau_grctx *ctx)
2134{ 3061{
2135 struct drm_nouveau_private *dev_priv = ctx->dev->dev_private; 3062 struct drm_nouveau_private *dev_priv = ctx->dev->dev_private;
2136 xf_emit(ctx, 2, 0x04e3bfdf); 3063 xf_emit(ctx, 1, 0); /* 00000001 UNK1534 */
2137 xf_emit(ctx, 1, 1); 3064 xf_emit(ctx, 1, 0); /* 7/f MULTISAMPLE_SAMPLES_LOG2 */
2138 xf_emit(ctx, 1, 0); 3065 xf_emit(ctx, 2, 0); /* 7, ffff0ff3 */
2139 xf_emit(ctx, 1, 0x00ffff00); 3066 xf_emit(ctx, 1, 0); /* 00000001 DEPTH_TEST_ENABLE */
2140 if (dev_priv->chipset > 0xa0 && dev_priv->chipset < 0xaa) 3067 xf_emit(ctx, 1, 0); /* 00000001 DEPTH_WRITE */
2141 xf_emit(ctx, 2, 1); 3068 xf_emit(ctx, 1, 0x04e3bfdf); /* ffffffff UNK0D64 */
2142 else 3069 xf_emit(ctx, 1, 0x04e3bfdf); /* ffffffff UNK0DF4 */
2143 xf_emit(ctx, 1, 1); 3070 xf_emit(ctx, 1, 1); /* 00000001 UNK15B4 */
2144 xf_emit(ctx, 2, 0); 3071 xf_emit(ctx, 1, 0); /* 00000001 LINE_STIPPLE_ENABLE */
2145 xf_emit(ctx, 1, 0x00ffff00); 3072 xf_emit(ctx, 1, 0x00ffff00); /* 00ffffff LINE_STIPPLE_PATTERN */
2146 xf_emit(ctx, 8, 0); 3073 xf_emit(ctx, 1, 1); /* 00000001 tesla UNK0F98 */
2147 xf_emit(ctx, 1, 1); 3074 if (IS_NVA3F(dev_priv->chipset))
2148 xf_emit(ctx, 1, 0); 3075 xf_emit(ctx, 1, 1); /* 0000001f tesla UNK169C */
2149 xf_emit(ctx, 1, 1); 3076 xf_emit(ctx, 1, 0); /* 00000003 tesla UNK1668 */
2150 xf_emit(ctx, 1, 0x30201000); 3077 xf_emit(ctx, 1, 0); /* 00000001 LINE_STIPPLE_ENABLE */
2151 xf_emit(ctx, 1, 0x70605040); 3078 xf_emit(ctx, 1, 0x00ffff00); /* 00ffffff LINE_STIPPLE_PATTERN */
2152 xf_emit(ctx, 1, 0xb8a89888); 3079 xf_emit(ctx, 1, 0); /* 00000001 POLYGON_SMOOTH_ENABLE */
2153 xf_emit(ctx, 1, 0xf8e8d8c8); 3080 xf_emit(ctx, 1, 0); /* 00000001 UNK1534 */
2154 xf_emit(ctx, 1, 0); 3081 xf_emit(ctx, 1, 0); /* 7/f MULTISAMPLE_SAMPLES_LOG2 */
2155 xf_emit(ctx, 1, 0x1a); 3082 xf_emit(ctx, 1, 0); /* 00000001 tesla UNK1658 */
2156} 3083 xf_emit(ctx, 1, 0); /* 00000001 LINE_SMOOTH_ENABLE */
2157 3084 xf_emit(ctx, 1, 0); /* ffff0ff3 */
2158static void 3085 xf_emit(ctx, 1, 0); /* 00000001 DEPTH_TEST_ENABLE */
2159nv50_graph_construct_xfer_tp_x5(struct nouveau_grctx *ctx) 3086 xf_emit(ctx, 1, 0); /* 00000001 DEPTH_WRITE */
2160{ 3087 xf_emit(ctx, 1, 1); /* 00000001 UNK15B4 */
2161 struct drm_nouveau_private *dev_priv = ctx->dev->dev_private; 3088 xf_emit(ctx, 1, 0); /* 00000001 POINT_SPRITE_ENABLE */
2162 xf_emit(ctx, 3, 0); 3089 xf_emit(ctx, 1, 1); /* 00000001 tesla UNK165C */
2163 xf_emit(ctx, 1, 0xfac6881); 3090 xf_emit(ctx, 1, 0x30201000); /* ffffffff tesla UNK1670 */
2164 xf_emit(ctx, 4, 0); 3091 xf_emit(ctx, 1, 0x70605040); /* ffffffff tesla UNK1670 */
2165 xf_emit(ctx, 1, 4); 3092 xf_emit(ctx, 1, 0xb8a89888); /* ffffffff tesla UNK1670 */
2166 xf_emit(ctx, 1, 0); 3093 xf_emit(ctx, 1, 0xf8e8d8c8); /* ffffffff tesla UNK1670 */
2167 xf_emit(ctx, 2, 1); 3094 xf_emit(ctx, 1, 0); /* 00000001 VERTEX_TWO_SIDE_ENABLE */
2168 xf_emit(ctx, 2, 0); 3095 xf_emit(ctx, 1, 0x1a); /* 0000001f POLYGON_MODE */
2169 xf_emit(ctx, 1, 1);
2170 if (dev_priv->chipset > 0xa0 && dev_priv->chipset < 0xaa)
2171 xf_emit(ctx, 0xb, 0);
2172 else
2173 xf_emit(ctx, 0xa, 0);
2174 xf_emit(ctx, 8, 1);
2175 xf_emit(ctx, 1, 0x11);
2176 xf_emit(ctx, 7, 0);
2177 xf_emit(ctx, 1, 0xfac6881);
2178 xf_emit(ctx, 1, 0xf);
2179 xf_emit(ctx, 7, 0);
2180 xf_emit(ctx, 1, 0x11);
2181 xf_emit(ctx, 1, 1);
2182 if (dev_priv->chipset > 0xa0 && dev_priv->chipset < 0xaa) {
2183 xf_emit(ctx, 6, 0);
2184 xf_emit(ctx, 1, 1);
2185 xf_emit(ctx, 6, 0);
2186 } else {
2187 xf_emit(ctx, 0xb, 0);
2188 }
2189} 3096}
2190 3097
2191static void 3098static void
@@ -2193,108 +3100,136 @@ nv50_graph_construct_xfer_tp(struct nouveau_grctx *ctx)
2193{ 3100{
2194 struct drm_nouveau_private *dev_priv = ctx->dev->dev_private; 3101 struct drm_nouveau_private *dev_priv = ctx->dev->dev_private;
2195 if (dev_priv->chipset < 0xa0) { 3102 if (dev_priv->chipset < 0xa0) {
2196 nv50_graph_construct_xfer_tp_x1(ctx); 3103 nv50_graph_construct_xfer_unk84xx(ctx);
2197 nv50_graph_construct_xfer_tp_x2(ctx); 3104 nv50_graph_construct_xfer_tprop(ctx);
2198 nv50_graph_construct_xfer_tp_x3(ctx); 3105 nv50_graph_construct_xfer_tex(ctx);
2199 if (dev_priv->chipset == 0x50) 3106 nv50_graph_construct_xfer_unk8cxx(ctx);
2200 xf_emit(ctx, 0xf, 0);
2201 else
2202 xf_emit(ctx, 0x12, 0);
2203 nv50_graph_construct_xfer_tp_x4(ctx);
2204 } else { 3107 } else {
2205 nv50_graph_construct_xfer_tp_x3(ctx); 3108 nv50_graph_construct_xfer_tex(ctx);
2206 if (dev_priv->chipset < 0xaa) 3109 nv50_graph_construct_xfer_tprop(ctx);
2207 xf_emit(ctx, 0xc, 0); 3110 nv50_graph_construct_xfer_unk8cxx(ctx);
2208 else 3111 nv50_graph_construct_xfer_unk84xx(ctx);
2209 xf_emit(ctx, 0xa, 0);
2210 nv50_graph_construct_xfer_tp_x2(ctx);
2211 nv50_graph_construct_xfer_tp_x5(ctx);
2212 nv50_graph_construct_xfer_tp_x4(ctx);
2213 nv50_graph_construct_xfer_tp_x1(ctx);
2214 } 3112 }
2215} 3113}
2216 3114
2217static void 3115static void
2218nv50_graph_construct_xfer_tp2(struct nouveau_grctx *ctx) 3116nv50_graph_construct_xfer_mpc(struct nouveau_grctx *ctx)
2219{ 3117{
2220 struct drm_nouveau_private *dev_priv = ctx->dev->dev_private; 3118 struct drm_nouveau_private *dev_priv = ctx->dev->dev_private;
2221 int i, mpcnt; 3119 int i, mpcnt = 2;
2222 if (dev_priv->chipset == 0x98 || dev_priv->chipset == 0xaa) 3120 switch (dev_priv->chipset) {
2223 mpcnt = 1; 3121 case 0x98:
2224 else if (dev_priv->chipset < 0xa0 || dev_priv->chipset >= 0xa8) 3122 case 0xaa:
2225 mpcnt = 2; 3123 mpcnt = 1;
2226 else 3124 break;
2227 mpcnt = 3; 3125 case 0x50:
3126 case 0x84:
3127 case 0x86:
3128 case 0x92:
3129 case 0x94:
3130 case 0x96:
3131 case 0xa8:
3132 case 0xac:
3133 mpcnt = 2;
3134 break;
3135 case 0xa0:
3136 case 0xa3:
3137 case 0xa5:
3138 case 0xaf:
3139 mpcnt = 3;
3140 break;
3141 }
2228 for (i = 0; i < mpcnt; i++) { 3142 for (i = 0; i < mpcnt; i++) {
2229 xf_emit(ctx, 1, 0); 3143 xf_emit(ctx, 1, 0); /* ff */
2230 xf_emit(ctx, 1, 0x80); 3144 xf_emit(ctx, 1, 0x80); /* ffffffff tesla UNK1404 */
2231 xf_emit(ctx, 1, 0x80007004); 3145 xf_emit(ctx, 1, 0x80007004); /* ffffffff tesla UNK12B0 */
2232 xf_emit(ctx, 1, 0x04000400); 3146 xf_emit(ctx, 1, 0x04000400); /* ffffffff */
2233 if (dev_priv->chipset >= 0xa0) 3147 if (dev_priv->chipset >= 0xa0)
2234 xf_emit(ctx, 1, 0xc0); 3148 xf_emit(ctx, 1, 0xc0); /* 00007fff tesla UNK152C */
2235 xf_emit(ctx, 1, 0x1000); 3149 xf_emit(ctx, 1, 0x1000); /* 0000ffff tesla UNK0D60 */
2236 xf_emit(ctx, 2, 0); 3150 xf_emit(ctx, 1, 0); /* ff/3ff */
2237 if (dev_priv->chipset == 0x86 || dev_priv->chipset == 0x98 || dev_priv->chipset >= 0xa8) { 3151 xf_emit(ctx, 1, 0); /* ffffffff tesla UNK1A30 */
2238 xf_emit(ctx, 1, 0xe00); 3152 if (dev_priv->chipset == 0x86 || dev_priv->chipset == 0x98 || dev_priv->chipset == 0xa8 || IS_NVAAF(dev_priv->chipset)) {
2239 xf_emit(ctx, 1, 0x1e00); 3153 xf_emit(ctx, 1, 0xe00); /* 7fff */
3154 xf_emit(ctx, 1, 0x1e00); /* 7fff */
2240 } 3155 }
2241 xf_emit(ctx, 1, 1); 3156 xf_emit(ctx, 1, 1); /* 000000ff VP_REG_ALLOC_TEMP */
2242 xf_emit(ctx, 2, 0); 3157 xf_emit(ctx, 1, 0); /* 00000001 LINKED_TSC */
3158 xf_emit(ctx, 1, 0); /* 00000001 GP_ENABLE */
2243 if (dev_priv->chipset == 0x50) 3159 if (dev_priv->chipset == 0x50)
2244 xf_emit(ctx, 2, 0x1000); 3160 xf_emit(ctx, 2, 0x1000); /* 7fff tesla UNK141C */
2245 xf_emit(ctx, 1, 1); 3161 xf_emit(ctx, 1, 1); /* 000000ff GP_REG_ALLOC_TEMP */
2246 xf_emit(ctx, 1, 0); 3162 xf_emit(ctx, 1, 0); /* 00000001 GP_ENABLE */
2247 xf_emit(ctx, 1, 4); 3163 xf_emit(ctx, 1, 4); /* 000000ff FP_REG_ALLOC_TEMP */
2248 xf_emit(ctx, 1, 2); 3164 xf_emit(ctx, 1, 2); /* 00000003 REG_MODE */
2249 if (dev_priv->chipset >= 0xaa) 3165 if (IS_NVAAF(dev_priv->chipset))
2250 xf_emit(ctx, 0xb, 0); 3166 xf_emit(ctx, 0xb, 0); /* RO */
2251 else if (dev_priv->chipset >= 0xa0) 3167 else if (dev_priv->chipset >= 0xa0)
2252 xf_emit(ctx, 0xc, 0); 3168 xf_emit(ctx, 0xc, 0); /* RO */
2253 else 3169 else
2254 xf_emit(ctx, 0xa, 0); 3170 xf_emit(ctx, 0xa, 0); /* RO */
2255 } 3171 }
2256 xf_emit(ctx, 1, 0x08100c12); 3172 xf_emit(ctx, 1, 0x08100c12); /* 1fffffff FP_INTERPOLANT_CTRL */
2257 xf_emit(ctx, 1, 0); 3173 xf_emit(ctx, 1, 0); /* ff/3ff */
2258 if (dev_priv->chipset >= 0xa0) { 3174 if (dev_priv->chipset >= 0xa0) {
2259 xf_emit(ctx, 1, 0x1fe21); 3175 xf_emit(ctx, 1, 0x1fe21); /* 0003ffff tesla UNK0FAC */
2260 } 3176 }
2261 xf_emit(ctx, 5, 0); 3177 xf_emit(ctx, 3, 0); /* 7fff, 0, 0 */
2262 xf_emit(ctx, 4, 0xffff); 3178 xf_emit(ctx, 1, 0); /* 00000001 tesla UNK1534 */
2263 xf_emit(ctx, 1, 1); 3179 xf_emit(ctx, 1, 0); /* 7/f MULTISAMPLE_SAMPLES_LOG2 */
2264 xf_emit(ctx, 2, 0x10001); 3180 xf_emit(ctx, 4, 0xffff); /* 0000ffff MSAA_MASK */
2265 xf_emit(ctx, 1, 1); 3181 xf_emit(ctx, 1, 1); /* 00000001 LANES32 */
2266 xf_emit(ctx, 1, 0); 3182 xf_emit(ctx, 1, 0x10001); /* 00ffffff BLOCK_ALLOC */
2267 xf_emit(ctx, 1, 0x1fe21); 3183 xf_emit(ctx, 1, 0x10001); /* ffffffff BLOCKDIM_XY */
2268 xf_emit(ctx, 1, 0); 3184 xf_emit(ctx, 1, 1); /* 0000ffff BLOCKDIM_Z */
2269 if (dev_priv->chipset > 0xa0 && dev_priv->chipset < 0xaa) 3185 xf_emit(ctx, 1, 0); /* ffffffff SHARED_SIZE */
2270 xf_emit(ctx, 1, 1); 3186 xf_emit(ctx, 1, 0x1fe21); /* 1ffff/3ffff[NVA0+] tesla UNk0FAC */
2271 xf_emit(ctx, 4, 0); 3187 xf_emit(ctx, 1, 0); /* ffffffff tesla UNK1A34 */
2272 xf_emit(ctx, 1, 0x08100c12); 3188 if (IS_NVA3F(dev_priv->chipset))
2273 xf_emit(ctx, 1, 4); 3189 xf_emit(ctx, 1, 1); /* 0000001f tesla UNK169C */
2274 xf_emit(ctx, 1, 0); 3190 xf_emit(ctx, 1, 0); /* ff/3ff */
2275 xf_emit(ctx, 1, 2); 3191 xf_emit(ctx, 1, 0); /* 1 LINKED_TSC */
2276 xf_emit(ctx, 1, 0x11); 3192 xf_emit(ctx, 1, 0); /* ff FP_ADDRESS_HIGH */
2277 xf_emit(ctx, 8, 0); 3193 xf_emit(ctx, 1, 0); /* ffffffff FP_ADDRESS_LOW */
2278 xf_emit(ctx, 1, 0xfac6881); 3194 xf_emit(ctx, 1, 0x08100c12); /* 1fffffff FP_INTERPOLANT_CTRL */
2279 xf_emit(ctx, 1, 0); 3195 xf_emit(ctx, 1, 4); /* 00000007 FP_CONTROL */
2280 if (dev_priv->chipset > 0xa0 && dev_priv->chipset < 0xaa) 3196 xf_emit(ctx, 1, 0); /* 000000ff FRAG_COLOR_CLAMP_EN */
2281 xf_emit(ctx, 1, 3); 3197 xf_emit(ctx, 1, 2); /* 00000003 REG_MODE */
2282 xf_emit(ctx, 3, 0); 3198 xf_emit(ctx, 1, 0x11); /* 0000007f RT_FORMAT */
2283 xf_emit(ctx, 1, 4); 3199 xf_emit(ctx, 7, 0); /* 0000007f RT_FORMAT */
2284 xf_emit(ctx, 9, 0); 3200 xf_emit(ctx, 1, 0); /* 00000007 */
2285 xf_emit(ctx, 1, 2); 3201 xf_emit(ctx, 1, 0xfac6881); /* 0fffffff RT_CONTROL */
2286 xf_emit(ctx, 2, 1); 3202 xf_emit(ctx, 1, 0); /* 00000003 MULTISAMPLE_CTRL */
2287 xf_emit(ctx, 1, 2); 3203 if (IS_NVA3F(dev_priv->chipset))
2288 xf_emit(ctx, 3, 1); 3204 xf_emit(ctx, 1, 3); /* 00000003 tesla UNK16B4 */
2289 xf_emit(ctx, 1, 0); 3205 xf_emit(ctx, 1, 0); /* 00000001 ALPHA_TEST_ENABLE */
2290 if (dev_priv->chipset > 0xa0 && dev_priv->chipset < 0xaa) { 3206 xf_emit(ctx, 1, 0); /* 00000007 ALPHA_TEST_FUNC */
2291 xf_emit(ctx, 8, 2); 3207 xf_emit(ctx, 1, 0); /* 00000001 FRAMEBUFFER_SRGB */
2292 xf_emit(ctx, 0x10, 1); 3208 xf_emit(ctx, 1, 4); /* ffffffff tesla UNK1400 */
2293 xf_emit(ctx, 8, 2); 3209 xf_emit(ctx, 8, 0); /* 00000001 BLEND_ENABLE */
2294 xf_emit(ctx, 0x18, 1); 3210 xf_emit(ctx, 1, 0); /* 00000001 LOGIC_OP_ENABLE */
2295 xf_emit(ctx, 3, 0); 3211 xf_emit(ctx, 1, 2); /* 0000001f BLEND_FUNC_SRC_RGB */
3212 xf_emit(ctx, 1, 1); /* 0000001f BLEND_FUNC_DST_RGB */
3213 xf_emit(ctx, 1, 1); /* 00000007 BLEND_EQUATION_RGB */
3214 xf_emit(ctx, 1, 2); /* 0000001f BLEND_FUNC_SRC_ALPHA */
3215 xf_emit(ctx, 1, 1); /* 0000001f BLEND_FUNC_DST_ALPHA */
3216 xf_emit(ctx, 1, 1); /* 00000007 BLEND_EQUATION_ALPHA */
3217 xf_emit(ctx, 1, 1); /* 00000001 UNK133C */
3218 if (IS_NVA3F(dev_priv->chipset)) {
3219 xf_emit(ctx, 1, 0); /* 00000001 UNK12E4 */
3220 xf_emit(ctx, 8, 2); /* 0000001f IBLEND_FUNC_SRC_RGB */
3221 xf_emit(ctx, 8, 1); /* 0000001f IBLEND_FUNC_DST_RGB */
3222 xf_emit(ctx, 8, 1); /* 00000007 IBLEND_EQUATION_RGB */
3223 xf_emit(ctx, 8, 2); /* 0000001f IBLEND_FUNC_SRC_ALPHA */
3224 xf_emit(ctx, 8, 1); /* 0000001f IBLEND_FUNC_DST_ALPHA */
3225 xf_emit(ctx, 8, 1); /* 00000007 IBLEND_EQUATION_ALPHA */
3226 xf_emit(ctx, 8, 1); /* 00000001 IBLEND_UNK00 */
3227 xf_emit(ctx, 1, 0); /* 00000003 tesla UNK1928 */
3228 xf_emit(ctx, 1, 0); /* 00000001 UNK1140 */
2296 } 3229 }
2297 xf_emit(ctx, 1, 4); 3230 xf_emit(ctx, 1, 0); /* 00000003 tesla UNK0F90 */
3231 xf_emit(ctx, 1, 4); /* 000000ff FP_RESULT_COUNT */
3232 /* XXX: demagic this part some day */
2298 if (dev_priv->chipset == 0x50) 3233 if (dev_priv->chipset == 0x50)
2299 xf_emit(ctx, 0x3a0, 0); 3234 xf_emit(ctx, 0x3a0, 0);
2300 else if (dev_priv->chipset < 0x94) 3235 else if (dev_priv->chipset < 0x94)
@@ -2303,9 +3238,9 @@ nv50_graph_construct_xfer_tp2(struct nouveau_grctx *ctx)
2303 xf_emit(ctx, 0x39f, 0); 3238 xf_emit(ctx, 0x39f, 0);
2304 else 3239 else
2305 xf_emit(ctx, 0x3a3, 0); 3240 xf_emit(ctx, 0x3a3, 0);
2306 xf_emit(ctx, 1, 0x11); 3241 xf_emit(ctx, 1, 0x11); /* 3f/7f DST_FORMAT */
2307 xf_emit(ctx, 1, 0); 3242 xf_emit(ctx, 1, 0); /* 7 OPERATION */
2308 xf_emit(ctx, 1, 1); 3243 xf_emit(ctx, 1, 1); /* 1 DST_LINEAR */
2309 xf_emit(ctx, 0x2d, 0); 3244 xf_emit(ctx, 0x2d, 0);
2310} 3245}
2311 3246
@@ -2323,52 +3258,56 @@ nv50_graph_construct_xfer2(struct nouveau_grctx *ctx)
2323 if (dev_priv->chipset < 0xa0) { 3258 if (dev_priv->chipset < 0xa0) {
2324 for (i = 0; i < 8; i++) { 3259 for (i = 0; i < 8; i++) {
2325 ctx->ctxvals_pos = offset + i; 3260 ctx->ctxvals_pos = offset + i;
3261 /* that little bugger belongs to csched. No idea
3262 * what it's doing here. */
2326 if (i == 0) 3263 if (i == 0)
2327 xf_emit(ctx, 1, 0x08100c12); 3264 xf_emit(ctx, 1, 0x08100c12); /* FP_INTERPOLANT_CTRL */
2328 if (units & (1 << i)) 3265 if (units & (1 << i))
2329 nv50_graph_construct_xfer_tp2(ctx); 3266 nv50_graph_construct_xfer_mpc(ctx);
2330 if ((ctx->ctxvals_pos-offset)/8 > size) 3267 if ((ctx->ctxvals_pos-offset)/8 > size)
2331 size = (ctx->ctxvals_pos-offset)/8; 3268 size = (ctx->ctxvals_pos-offset)/8;
2332 } 3269 }
2333 } else { 3270 } else {
2334 /* Strand 0: TPs 0, 1 */ 3271 /* Strand 0: TPs 0, 1 */
2335 ctx->ctxvals_pos = offset; 3272 ctx->ctxvals_pos = offset;
2336 xf_emit(ctx, 1, 0x08100c12); 3273 /* that little bugger belongs to csched. No idea
3274 * what it's doing here. */
3275 xf_emit(ctx, 1, 0x08100c12); /* FP_INTERPOLANT_CTRL */
2337 if (units & (1 << 0)) 3276 if (units & (1 << 0))
2338 nv50_graph_construct_xfer_tp2(ctx); 3277 nv50_graph_construct_xfer_mpc(ctx);
2339 if (units & (1 << 1)) 3278 if (units & (1 << 1))
2340 nv50_graph_construct_xfer_tp2(ctx); 3279 nv50_graph_construct_xfer_mpc(ctx);
2341 if ((ctx->ctxvals_pos-offset)/8 > size) 3280 if ((ctx->ctxvals_pos-offset)/8 > size)
2342 size = (ctx->ctxvals_pos-offset)/8; 3281 size = (ctx->ctxvals_pos-offset)/8;
2343 3282
2344 /* Strand 0: TPs 2, 3 */ 3283 /* Strand 1: TPs 2, 3 */
2345 ctx->ctxvals_pos = offset + 1; 3284 ctx->ctxvals_pos = offset + 1;
2346 if (units & (1 << 2)) 3285 if (units & (1 << 2))
2347 nv50_graph_construct_xfer_tp2(ctx); 3286 nv50_graph_construct_xfer_mpc(ctx);
2348 if (units & (1 << 3)) 3287 if (units & (1 << 3))
2349 nv50_graph_construct_xfer_tp2(ctx); 3288 nv50_graph_construct_xfer_mpc(ctx);
2350 if ((ctx->ctxvals_pos-offset)/8 > size) 3289 if ((ctx->ctxvals_pos-offset)/8 > size)
2351 size = (ctx->ctxvals_pos-offset)/8; 3290 size = (ctx->ctxvals_pos-offset)/8;
2352 3291
2353 /* Strand 0: TPs 4, 5, 6 */ 3292 /* Strand 2: TPs 4, 5, 6 */
2354 ctx->ctxvals_pos = offset + 2; 3293 ctx->ctxvals_pos = offset + 2;
2355 if (units & (1 << 4)) 3294 if (units & (1 << 4))
2356 nv50_graph_construct_xfer_tp2(ctx); 3295 nv50_graph_construct_xfer_mpc(ctx);
2357 if (units & (1 << 5)) 3296 if (units & (1 << 5))
2358 nv50_graph_construct_xfer_tp2(ctx); 3297 nv50_graph_construct_xfer_mpc(ctx);
2359 if (units & (1 << 6)) 3298 if (units & (1 << 6))
2360 nv50_graph_construct_xfer_tp2(ctx); 3299 nv50_graph_construct_xfer_mpc(ctx);
2361 if ((ctx->ctxvals_pos-offset)/8 > size) 3300 if ((ctx->ctxvals_pos-offset)/8 > size)
2362 size = (ctx->ctxvals_pos-offset)/8; 3301 size = (ctx->ctxvals_pos-offset)/8;
2363 3302
2364 /* Strand 0: TPs 7, 8, 9 */ 3303 /* Strand 3: TPs 7, 8, 9 */
2365 ctx->ctxvals_pos = offset + 3; 3304 ctx->ctxvals_pos = offset + 3;
2366 if (units & (1 << 7)) 3305 if (units & (1 << 7))
2367 nv50_graph_construct_xfer_tp2(ctx); 3306 nv50_graph_construct_xfer_mpc(ctx);
2368 if (units & (1 << 8)) 3307 if (units & (1 << 8))
2369 nv50_graph_construct_xfer_tp2(ctx); 3308 nv50_graph_construct_xfer_mpc(ctx);
2370 if (units & (1 << 9)) 3309 if (units & (1 << 9))
2371 nv50_graph_construct_xfer_tp2(ctx); 3310 nv50_graph_construct_xfer_mpc(ctx);
2372 if ((ctx->ctxvals_pos-offset)/8 > size) 3311 if ((ctx->ctxvals_pos-offset)/8 > size)
2373 size = (ctx->ctxvals_pos-offset)/8; 3312 size = (ctx->ctxvals_pos-offset)/8;
2374 } 3313 }
diff --git a/drivers/gpu/drm/nouveau/nv50_instmem.c b/drivers/gpu/drm/nouveau/nv50_instmem.c
index 91ef93cf1f35..4f95a1e5822e 100644
--- a/drivers/gpu/drm/nouveau/nv50_instmem.c
+++ b/drivers/gpu/drm/nouveau/nv50_instmem.c
@@ -27,261 +27,206 @@
27 27
28#include "drmP.h" 28#include "drmP.h"
29#include "drm.h" 29#include "drm.h"
30
30#include "nouveau_drv.h" 31#include "nouveau_drv.h"
32#include "nouveau_vm.h"
33
34#define BAR1_VM_BASE 0x0020000000ULL
35#define BAR1_VM_SIZE pci_resource_len(dev->pdev, 1)
36#define BAR3_VM_BASE 0x0000000000ULL
37#define BAR3_VM_SIZE pci_resource_len(dev->pdev, 3)
31 38
32struct nv50_instmem_priv { 39struct nv50_instmem_priv {
33 uint32_t save1700[5]; /* 0x1700->0x1710 */ 40 uint32_t save1700[5]; /* 0x1700->0x1710 */
34 41
35 struct nouveau_gpuobj_ref *pramin_pt; 42 struct nouveau_gpuobj *bar1_dmaobj;
36 struct nouveau_gpuobj_ref *pramin_bar; 43 struct nouveau_gpuobj *bar3_dmaobj;
37 struct nouveau_gpuobj_ref *fb_bar;
38}; 44};
39 45
40#define NV50_INSTMEM_PAGE_SHIFT 12 46static void
41#define NV50_INSTMEM_PAGE_SIZE (1 << NV50_INSTMEM_PAGE_SHIFT) 47nv50_channel_del(struct nouveau_channel **pchan)
42#define NV50_INSTMEM_PT_SIZE(a) (((a) >> 12) << 3) 48{
49 struct nouveau_channel *chan;
43 50
44/*NOTE: - Assumes 0x1700 already covers the correct MiB of PRAMIN 51 chan = *pchan;
45 */ 52 *pchan = NULL;
46#define BAR0_WI32(g, o, v) do { \ 53 if (!chan)
47 uint32_t offset; \ 54 return;
48 if ((g)->im_backing) { \
49 offset = (g)->im_backing_start; \
50 } else { \
51 offset = chan->ramin->gpuobj->im_backing_start; \
52 offset += (g)->im_pramin->start; \
53 } \
54 offset += (o); \
55 nv_wr32(dev, NV_RAMIN + (offset & 0xfffff), (v)); \
56} while (0)
57 55
58int 56 nouveau_gpuobj_ref(NULL, &chan->ramfc);
59nv50_instmem_init(struct drm_device *dev) 57 nouveau_vm_ref(NULL, &chan->vm, chan->vm_pd);
58 nouveau_gpuobj_ref(NULL, &chan->vm_pd);
59 if (drm_mm_initialized(&chan->ramin_heap))
60 drm_mm_takedown(&chan->ramin_heap);
61 nouveau_gpuobj_ref(NULL, &chan->ramin);
62 kfree(chan);
63}
64
65static int
66nv50_channel_new(struct drm_device *dev, u32 size, struct nouveau_vm *vm,
67 struct nouveau_channel **pchan)
60{ 68{
61 struct drm_nouveau_private *dev_priv = dev->dev_private; 69 struct drm_nouveau_private *dev_priv = dev->dev_private;
70 u32 pgd = (dev_priv->chipset == 0x50) ? 0x1400 : 0x0200;
71 u32 fc = (dev_priv->chipset == 0x50) ? 0x0000 : 0x4200;
62 struct nouveau_channel *chan; 72 struct nouveau_channel *chan;
63 uint32_t c_offset, c_size, c_ramfc, c_vmpd, c_base, pt_size;
64 uint32_t save_nv001700;
65 uint64_t v;
66 struct nv50_instmem_priv *priv;
67 int ret, i; 73 int ret, i;
68 74
69 priv = kzalloc(sizeof(*priv), GFP_KERNEL);
70 if (!priv)
71 return -ENOMEM;
72 dev_priv->engine.instmem.priv = priv;
73
74 /* Save state, will restore at takedown. */
75 for (i = 0x1700; i <= 0x1710; i += 4)
76 priv->save1700[(i-0x1700)/4] = nv_rd32(dev, i);
77
78 /* Reserve the last MiB of VRAM, we should probably try to avoid
79 * setting up the below tables over the top of the VBIOS image at
80 * some point.
81 */
82 dev_priv->ramin_rsvd_vram = 1 << 20;
83 c_offset = dev_priv->vram_size - dev_priv->ramin_rsvd_vram;
84 c_size = 128 << 10;
85 c_vmpd = ((dev_priv->chipset & 0xf0) == 0x50) ? 0x1400 : 0x200;
86 c_ramfc = ((dev_priv->chipset & 0xf0) == 0x50) ? 0x0 : 0x20;
87 c_base = c_vmpd + 0x4000;
88 pt_size = NV50_INSTMEM_PT_SIZE(dev_priv->ramin_size);
89
90 NV_DEBUG(dev, " Rsvd VRAM base: 0x%08x\n", c_offset);
91 NV_DEBUG(dev, " VBIOS image: 0x%08x\n",
92 (nv_rd32(dev, 0x619f04) & ~0xff) << 8);
93 NV_DEBUG(dev, " Aperture size: %d MiB\n", dev_priv->ramin_size >> 20);
94 NV_DEBUG(dev, " PT size: %d KiB\n", pt_size >> 10);
95
96 /* Determine VM layout, we need to do this first to make sure
97 * we allocate enough memory for all the page tables.
98 */
99 dev_priv->vm_gart_base = roundup(NV50_VM_BLOCK, NV50_VM_BLOCK);
100 dev_priv->vm_gart_size = NV50_VM_BLOCK;
101
102 dev_priv->vm_vram_base = dev_priv->vm_gart_base + dev_priv->vm_gart_size;
103 dev_priv->vm_vram_size = dev_priv->vram_size;
104 if (dev_priv->vm_vram_size > NV50_VM_MAX_VRAM)
105 dev_priv->vm_vram_size = NV50_VM_MAX_VRAM;
106 dev_priv->vm_vram_size = roundup(dev_priv->vm_vram_size, NV50_VM_BLOCK);
107 dev_priv->vm_vram_pt_nr = dev_priv->vm_vram_size / NV50_VM_BLOCK;
108
109 dev_priv->vm_end = dev_priv->vm_vram_base + dev_priv->vm_vram_size;
110
111 NV_DEBUG(dev, "NV50VM: GART 0x%016llx-0x%016llx\n",
112 dev_priv->vm_gart_base,
113 dev_priv->vm_gart_base + dev_priv->vm_gart_size - 1);
114 NV_DEBUG(dev, "NV50VM: VRAM 0x%016llx-0x%016llx\n",
115 dev_priv->vm_vram_base,
116 dev_priv->vm_vram_base + dev_priv->vm_vram_size - 1);
117
118 c_size += dev_priv->vm_vram_pt_nr * (NV50_VM_BLOCK / 65536 * 8);
119
120 /* Map BAR0 PRAMIN aperture over the memory we want to use */
121 save_nv001700 = nv_rd32(dev, NV50_PUNK_BAR0_PRAMIN);
122 nv_wr32(dev, NV50_PUNK_BAR0_PRAMIN, (c_offset >> 16));
123
124 /* Create a fake channel, and use it as our "dummy" channels 0/127.
125 * The main reason for creating a channel is so we can use the gpuobj
126 * code. However, it's probably worth noting that NVIDIA also setup
127 * their channels 0/127 with the same values they configure here.
128 * So, there may be some other reason for doing this.
129 *
130 * Have to create the entire channel manually, as the real channel
131 * creation code assumes we have PRAMIN access, and we don't until
132 * we're done here.
133 */
134 chan = kzalloc(sizeof(*chan), GFP_KERNEL); 75 chan = kzalloc(sizeof(*chan), GFP_KERNEL);
135 if (!chan) 76 if (!chan)
136 return -ENOMEM; 77 return -ENOMEM;
137 chan->id = 0;
138 chan->dev = dev; 78 chan->dev = dev;
139 chan->file_priv = (struct drm_file *)-2;
140 dev_priv->fifos[0] = dev_priv->fifos[127] = chan;
141 79
142 INIT_LIST_HEAD(&chan->ramht_refs); 80 ret = nouveau_gpuobj_new(dev, NULL, size, 0x1000, 0, &chan->ramin);
143 81 if (ret) {
144 /* Channel's PRAMIN object + heap */ 82 nv50_channel_del(&chan);
145 ret = nouveau_gpuobj_new_fake(dev, 0, c_offset, c_size, 0,
146 NULL, &chan->ramin);
147 if (ret)
148 return ret; 83 return ret;
84 }
149 85
150 if (drm_mm_init(&chan->ramin_heap, c_base, c_size - c_base)) 86 ret = drm_mm_init(&chan->ramin_heap, 0x6000, chan->ramin->size);
151 return -ENOMEM; 87 if (ret) {
152 88 nv50_channel_del(&chan);
153 /* RAMFC + zero channel's PRAMIN up to start of VM pagedir */
154 ret = nouveau_gpuobj_new_fake(dev, c_ramfc, c_offset + c_ramfc,
155 0x4000, 0, NULL, &chan->ramfc);
156 if (ret)
157 return ret; 89 return ret;
90 }
158 91
159 for (i = 0; i < c_vmpd; i += 4) 92 ret = nouveau_gpuobj_new_fake(dev, chan->ramin->pinst == ~0 ? ~0 :
160 BAR0_WI32(chan->ramin->gpuobj, i, 0); 93 chan->ramin->pinst + pgd,
161 94 chan->ramin->vinst + pgd,
162 /* VM page directory */ 95 0x4000, NVOBJ_FLAG_ZERO_ALLOC,
163 ret = nouveau_gpuobj_new_fake(dev, c_vmpd, c_offset + c_vmpd, 96 &chan->vm_pd);
164 0x4000, 0, &chan->vm_pd, NULL); 97 if (ret) {
165 if (ret) 98 nv50_channel_del(&chan);
166 return ret; 99 return ret;
100 }
101
167 for (i = 0; i < 0x4000; i += 8) { 102 for (i = 0; i < 0x4000; i += 8) {
168 BAR0_WI32(chan->vm_pd, i + 0x00, 0x00000000); 103 nv_wo32(chan->vm_pd, i + 0, 0x00000000);
169 BAR0_WI32(chan->vm_pd, i + 0x04, 0x00000000); 104 nv_wo32(chan->vm_pd, i + 4, 0xdeadcafe);
170 } 105 }
171 106
172 /* PRAMIN page table, cheat and map into VM at 0x0000000000. 107 ret = nouveau_vm_ref(vm, &chan->vm, chan->vm_pd);
173 * We map the entire fake channel into the start of the PRAMIN BAR 108 if (ret) {
174 */ 109 nv50_channel_del(&chan);
175 ret = nouveau_gpuobj_new_ref(dev, chan, NULL, 0, pt_size, 0x1000,
176 0, &priv->pramin_pt);
177 if (ret)
178 return ret; 110 return ret;
179
180 v = c_offset | 1;
181 if (dev_priv->vram_sys_base) {
182 v += dev_priv->vram_sys_base;
183 v |= 0x30;
184 } 111 }
185 112
186 i = 0; 113 ret = nouveau_gpuobj_new_fake(dev, chan->ramin->pinst == ~0 ? ~0 :
187 while (v < dev_priv->vram_sys_base + c_offset + c_size) { 114 chan->ramin->pinst + fc,
188 BAR0_WI32(priv->pramin_pt->gpuobj, i + 0, lower_32_bits(v)); 115 chan->ramin->vinst + fc, 0x100,
189 BAR0_WI32(priv->pramin_pt->gpuobj, i + 4, upper_32_bits(v)); 116 NVOBJ_FLAG_ZERO_ALLOC, &chan->ramfc);
190 v += 0x1000; 117 if (ret) {
191 i += 8; 118 nv50_channel_del(&chan);
119 return ret;
192 } 120 }
193 121
194 while (i < pt_size) { 122 *pchan = chan;
195 BAR0_WI32(priv->pramin_pt->gpuobj, i + 0, 0x00000000); 123 return 0;
196 BAR0_WI32(priv->pramin_pt->gpuobj, i + 4, 0x00000000); 124}
197 i += 8;
198 }
199 125
200 BAR0_WI32(chan->vm_pd, 0x00, priv->pramin_pt->instance | 0x63); 126int
201 BAR0_WI32(chan->vm_pd, 0x04, 0x00000000); 127nv50_instmem_init(struct drm_device *dev)
128{
129 struct drm_nouveau_private *dev_priv = dev->dev_private;
130 struct nv50_instmem_priv *priv;
131 struct nouveau_channel *chan;
132 struct nouveau_vm *vm;
133 int ret, i;
134 u32 tmp;
202 135
203 /* VRAM page table(s), mapped into VM at +1GiB */ 136 priv = kzalloc(sizeof(*priv), GFP_KERNEL);
204 for (i = 0; i < dev_priv->vm_vram_pt_nr; i++) { 137 if (!priv)
205 ret = nouveau_gpuobj_new_ref(dev, chan, NULL, 0, 138 return -ENOMEM;
206 NV50_VM_BLOCK/65536*8, 0, 0, 139 dev_priv->engine.instmem.priv = priv;
207 &chan->vm_vram_pt[i]);
208 if (ret) {
209 NV_ERROR(dev, "Error creating VRAM page tables: %d\n",
210 ret);
211 dev_priv->vm_vram_pt_nr = i;
212 return ret;
213 }
214 dev_priv->vm_vram_pt[i] = chan->vm_vram_pt[i]->gpuobj;
215 140
216 for (v = 0; v < dev_priv->vm_vram_pt[i]->im_pramin->size; 141 /* Save state, will restore at takedown. */
217 v += 4) 142 for (i = 0x1700; i <= 0x1710; i += 4)
218 BAR0_WI32(dev_priv->vm_vram_pt[i], v, 0); 143 priv->save1700[(i-0x1700)/4] = nv_rd32(dev, i);
219 144
220 BAR0_WI32(chan->vm_pd, 0x10 + (i*8), 145 /* Global PRAMIN heap */
221 chan->vm_vram_pt[i]->instance | 0x61); 146 ret = drm_mm_init(&dev_priv->ramin_heap, 0, dev_priv->ramin_size);
222 BAR0_WI32(chan->vm_pd, 0x14 + (i*8), 0); 147 if (ret) {
148 NV_ERROR(dev, "Failed to init RAMIN heap\n");
149 goto error;
223 } 150 }
224 151
225 /* DMA object for PRAMIN BAR */ 152 /* BAR3 */
226 ret = nouveau_gpuobj_new_ref(dev, chan, chan, 0, 6*4, 16, 0, 153 ret = nouveau_vm_new(dev, BAR3_VM_BASE, BAR3_VM_SIZE, BAR3_VM_BASE,
227 &priv->pramin_bar); 154 &dev_priv->bar3_vm);
228 if (ret) 155 if (ret)
229 return ret; 156 goto error;
230 BAR0_WI32(priv->pramin_bar->gpuobj, 0x00, 0x7fc00000); 157
231 BAR0_WI32(priv->pramin_bar->gpuobj, 0x04, dev_priv->ramin_size - 1); 158 ret = nouveau_gpuobj_new(dev, NULL, (BAR3_VM_SIZE >> 12) * 8,
232 BAR0_WI32(priv->pramin_bar->gpuobj, 0x08, 0x00000000); 159 0x1000, NVOBJ_FLAG_DONT_MAP |
233 BAR0_WI32(priv->pramin_bar->gpuobj, 0x0c, 0x00000000); 160 NVOBJ_FLAG_ZERO_ALLOC,
234 BAR0_WI32(priv->pramin_bar->gpuobj, 0x10, 0x00000000); 161 &dev_priv->bar3_vm->pgt[0].obj[0]);
235 BAR0_WI32(priv->pramin_bar->gpuobj, 0x14, 0x00000000);
236
237 /* DMA object for FB BAR */
238 ret = nouveau_gpuobj_new_ref(dev, chan, chan, 0, 6*4, 16, 0,
239 &priv->fb_bar);
240 if (ret) 162 if (ret)
241 return ret; 163 goto error;
242 BAR0_WI32(priv->fb_bar->gpuobj, 0x00, 0x7fc00000); 164 dev_priv->bar3_vm->pgt[0].refcount[0] = 1;
243 BAR0_WI32(priv->fb_bar->gpuobj, 0x04, 0x40000000 +
244 pci_resource_len(dev->pdev, 1) - 1);
245 BAR0_WI32(priv->fb_bar->gpuobj, 0x08, 0x40000000);
246 BAR0_WI32(priv->fb_bar->gpuobj, 0x0c, 0x00000000);
247 BAR0_WI32(priv->fb_bar->gpuobj, 0x10, 0x00000000);
248 BAR0_WI32(priv->fb_bar->gpuobj, 0x14, 0x00000000);
249 165
250 /* Poke the relevant regs, and pray it works :) */ 166 nv50_instmem_map(dev_priv->bar3_vm->pgt[0].obj[0]);
251 nv_wr32(dev, NV50_PUNK_BAR_CFG_BASE, (chan->ramin->instance >> 12));
252 nv_wr32(dev, NV50_PUNK_UNK1710, 0);
253 nv_wr32(dev, NV50_PUNK_BAR_CFG_BASE, (chan->ramin->instance >> 12) |
254 NV50_PUNK_BAR_CFG_BASE_VALID);
255 nv_wr32(dev, NV50_PUNK_BAR1_CTXDMA, (priv->fb_bar->instance >> 4) |
256 NV50_PUNK_BAR1_CTXDMA_VALID);
257 nv_wr32(dev, NV50_PUNK_BAR3_CTXDMA, (priv->pramin_bar->instance >> 4) |
258 NV50_PUNK_BAR3_CTXDMA_VALID);
259 167
260 for (i = 0; i < 8; i++) 168 ret = nv50_channel_new(dev, 128 * 1024, dev_priv->bar3_vm, &chan);
261 nv_wr32(dev, 0x1900 + (i*4), 0); 169 if (ret)
170 goto error;
171 dev_priv->channels.ptr[0] = dev_priv->channels.ptr[127] = chan;
262 172
263 /* Assume that praying isn't enough, check that we can re-read the 173 ret = nv50_gpuobj_dma_new(chan, 0x0000, BAR3_VM_BASE, BAR3_VM_SIZE,
264 * entire fake channel back from the PRAMIN BAR */ 174 NV_MEM_TARGET_VM, NV_MEM_ACCESS_VM,
265 for (i = 0; i < c_size; i += 4) { 175 NV_MEM_TYPE_VM, NV_MEM_COMP_VM,
266 if (nv_rd32(dev, NV_RAMIN + i) != nv_ri32(dev, i)) { 176 &priv->bar3_dmaobj);
267 NV_ERROR(dev, "Error reading back PRAMIN at 0x%08x\n", 177 if (ret)
268 i); 178 goto error;
269 return -EINVAL;
270 }
271 }
272 179
273 nv_wr32(dev, NV50_PUNK_BAR0_PRAMIN, save_nv001700); 180 nv_wr32(dev, 0x001704, 0x00000000 | (chan->ramin->vinst >> 12));
181 nv_wr32(dev, 0x001704, 0x40000000 | (chan->ramin->vinst >> 12));
182 nv_wr32(dev, 0x00170c, 0x80000000 | (priv->bar3_dmaobj->cinst >> 4));
274 183
275 /* Global PRAMIN heap */ 184 dev_priv->engine.instmem.flush(dev);
276 if (drm_mm_init(&dev_priv->ramin_heap, c_size, dev_priv->ramin_size - c_size)) { 185 dev_priv->ramin_available = true;
277 NV_ERROR(dev, "Failed to init RAMIN heap\n"); 186
187 tmp = nv_ro32(chan->ramin, 0);
188 nv_wo32(chan->ramin, 0, ~tmp);
189 if (nv_ro32(chan->ramin, 0) != ~tmp) {
190 NV_ERROR(dev, "PRAMIN readback failed\n");
191 ret = -EIO;
192 goto error;
278 } 193 }
194 nv_wo32(chan->ramin, 0, tmp);
195
196 /* BAR1 */
197 ret = nouveau_vm_new(dev, BAR1_VM_BASE, BAR1_VM_SIZE, BAR1_VM_BASE, &vm);
198 if (ret)
199 goto error;
200
201 ret = nouveau_vm_ref(vm, &dev_priv->bar1_vm, chan->vm_pd);
202 if (ret)
203 goto error;
204 nouveau_vm_ref(NULL, &vm, NULL);
205
206 ret = nv50_gpuobj_dma_new(chan, 0x0000, BAR1_VM_BASE, BAR1_VM_SIZE,
207 NV_MEM_TARGET_VM, NV_MEM_ACCESS_VM,
208 NV_MEM_TYPE_VM, NV_MEM_COMP_VM,
209 &priv->bar1_dmaobj);
210 if (ret)
211 goto error;
212
213 nv_wr32(dev, 0x001708, 0x80000000 | (priv->bar1_dmaobj->cinst >> 4));
214 for (i = 0; i < 8; i++)
215 nv_wr32(dev, 0x1900 + (i*4), 0);
216
217 /* Create shared channel VM, space is reserved at the beginning
218 * to catch "NULL pointer" references
219 */
220 ret = nouveau_vm_new(dev, 0, (1ULL << 40), 0x0020000000ULL,
221 &dev_priv->chan_vm);
222 if (ret)
223 return ret;
279 224
280 /*XXX: incorrect, but needed to make hash func "work" */
281 dev_priv->ramht_offset = 0x10000;
282 dev_priv->ramht_bits = 9;
283 dev_priv->ramht_size = (1 << dev_priv->ramht_bits) * 8;
284 return 0; 225 return 0;
226
227error:
228 nv50_instmem_takedown(dev);
229 return ret;
285} 230}
286 231
287void 232void
@@ -289,7 +234,7 @@ nv50_instmem_takedown(struct drm_device *dev)
289{ 234{
290 struct drm_nouveau_private *dev_priv = dev->dev_private; 235 struct drm_nouveau_private *dev_priv = dev->dev_private;
291 struct nv50_instmem_priv *priv = dev_priv->engine.instmem.priv; 236 struct nv50_instmem_priv *priv = dev_priv->engine.instmem.priv;
292 struct nouveau_channel *chan = dev_priv->fifos[0]; 237 struct nouveau_channel *chan = dev_priv->channels.ptr[0];
293 int i; 238 int i;
294 239
295 NV_DEBUG(dev, "\n"); 240 NV_DEBUG(dev, "\n");
@@ -297,30 +242,25 @@ nv50_instmem_takedown(struct drm_device *dev)
297 if (!priv) 242 if (!priv)
298 return; 243 return;
299 244
300 /* Restore state from before init */ 245 dev_priv->ramin_available = false;
246
247 nouveau_vm_ref(NULL, &dev_priv->chan_vm, NULL);
248
301 for (i = 0x1700; i <= 0x1710; i += 4) 249 for (i = 0x1700; i <= 0x1710; i += 4)
302 nv_wr32(dev, i, priv->save1700[(i - 0x1700) / 4]); 250 nv_wr32(dev, i, priv->save1700[(i - 0x1700) / 4]);
303 251
304 nouveau_gpuobj_ref_del(dev, &priv->fb_bar); 252 nouveau_gpuobj_ref(NULL, &priv->bar3_dmaobj);
305 nouveau_gpuobj_ref_del(dev, &priv->pramin_bar); 253 nouveau_gpuobj_ref(NULL, &priv->bar1_dmaobj);
306 nouveau_gpuobj_ref_del(dev, &priv->pramin_pt);
307 254
308 /* Destroy dummy channel */ 255 nouveau_vm_ref(NULL, &dev_priv->bar1_vm, chan->vm_pd);
309 if (chan) { 256 dev_priv->channels.ptr[127] = 0;
310 for (i = 0; i < dev_priv->vm_vram_pt_nr; i++) { 257 nv50_channel_del(&dev_priv->channels.ptr[0]);
311 nouveau_gpuobj_ref_del(dev, &chan->vm_vram_pt[i]);
312 dev_priv->vm_vram_pt[i] = NULL;
313 }
314 dev_priv->vm_vram_pt_nr = 0;
315 258
316 nouveau_gpuobj_del(dev, &chan->vm_pd); 259 nouveau_gpuobj_ref(NULL, &dev_priv->bar3_vm->pgt[0].obj[0]);
317 nouveau_gpuobj_ref_del(dev, &chan->ramfc); 260 nouveau_vm_ref(NULL, &dev_priv->bar3_vm, NULL);
318 nouveau_gpuobj_ref_del(dev, &chan->ramin);
319 drm_mm_takedown(&chan->ramin_heap);
320 261
321 dev_priv->fifos[0] = dev_priv->fifos[127] = NULL; 262 if (drm_mm_initialized(&dev_priv->ramin_heap))
322 kfree(chan); 263 drm_mm_takedown(&dev_priv->ramin_heap);
323 }
324 264
325 dev_priv->engine.instmem.priv = NULL; 265 dev_priv->engine.instmem.priv = NULL;
326 kfree(priv); 266 kfree(priv);
@@ -330,16 +270,8 @@ int
330nv50_instmem_suspend(struct drm_device *dev) 270nv50_instmem_suspend(struct drm_device *dev)
331{ 271{
332 struct drm_nouveau_private *dev_priv = dev->dev_private; 272 struct drm_nouveau_private *dev_priv = dev->dev_private;
333 struct nouveau_channel *chan = dev_priv->fifos[0];
334 struct nouveau_gpuobj *ramin = chan->ramin->gpuobj;
335 int i;
336 273
337 ramin->im_backing_suspend = vmalloc(ramin->im_pramin->size); 274 dev_priv->ramin_available = false;
338 if (!ramin->im_backing_suspend)
339 return -ENOMEM;
340
341 for (i = 0; i < ramin->im_pramin->size; i += 4)
342 ramin->im_backing_suspend[i/4] = nv_ri32(dev, i);
343 return 0; 275 return 0;
344} 276}
345 277
@@ -348,164 +280,149 @@ nv50_instmem_resume(struct drm_device *dev)
348{ 280{
349 struct drm_nouveau_private *dev_priv = dev->dev_private; 281 struct drm_nouveau_private *dev_priv = dev->dev_private;
350 struct nv50_instmem_priv *priv = dev_priv->engine.instmem.priv; 282 struct nv50_instmem_priv *priv = dev_priv->engine.instmem.priv;
351 struct nouveau_channel *chan = dev_priv->fifos[0]; 283 struct nouveau_channel *chan = dev_priv->channels.ptr[0];
352 struct nouveau_gpuobj *ramin = chan->ramin->gpuobj;
353 int i; 284 int i;
354 285
355 nv_wr32(dev, NV50_PUNK_BAR0_PRAMIN, (ramin->im_backing_start >> 16));
356 for (i = 0; i < ramin->im_pramin->size; i += 4)
357 BAR0_WI32(ramin, i, ramin->im_backing_suspend[i/4]);
358 vfree(ramin->im_backing_suspend);
359 ramin->im_backing_suspend = NULL;
360
361 /* Poke the relevant regs, and pray it works :) */ 286 /* Poke the relevant regs, and pray it works :) */
362 nv_wr32(dev, NV50_PUNK_BAR_CFG_BASE, (chan->ramin->instance >> 12)); 287 nv_wr32(dev, NV50_PUNK_BAR_CFG_BASE, (chan->ramin->vinst >> 12));
363 nv_wr32(dev, NV50_PUNK_UNK1710, 0); 288 nv_wr32(dev, NV50_PUNK_UNK1710, 0);
364 nv_wr32(dev, NV50_PUNK_BAR_CFG_BASE, (chan->ramin->instance >> 12) | 289 nv_wr32(dev, NV50_PUNK_BAR_CFG_BASE, (chan->ramin->vinst >> 12) |
365 NV50_PUNK_BAR_CFG_BASE_VALID); 290 NV50_PUNK_BAR_CFG_BASE_VALID);
366 nv_wr32(dev, NV50_PUNK_BAR1_CTXDMA, (priv->fb_bar->instance >> 4) | 291 nv_wr32(dev, NV50_PUNK_BAR1_CTXDMA, (priv->bar1_dmaobj->cinst >> 4) |
367 NV50_PUNK_BAR1_CTXDMA_VALID); 292 NV50_PUNK_BAR1_CTXDMA_VALID);
368 nv_wr32(dev, NV50_PUNK_BAR3_CTXDMA, (priv->pramin_bar->instance >> 4) | 293 nv_wr32(dev, NV50_PUNK_BAR3_CTXDMA, (priv->bar3_dmaobj->cinst >> 4) |
369 NV50_PUNK_BAR3_CTXDMA_VALID); 294 NV50_PUNK_BAR3_CTXDMA_VALID);
370 295
371 for (i = 0; i < 8; i++) 296 for (i = 0; i < 8; i++)
372 nv_wr32(dev, 0x1900 + (i*4), 0); 297 nv_wr32(dev, 0x1900 + (i*4), 0);
298
299 dev_priv->ramin_available = true;
373} 300}
374 301
302struct nv50_gpuobj_node {
303 struct nouveau_mem *vram;
304 struct nouveau_vma chan_vma;
305 u32 align;
306};
307
308
375int 309int
376nv50_instmem_populate(struct drm_device *dev, struct nouveau_gpuobj *gpuobj, 310nv50_instmem_get(struct nouveau_gpuobj *gpuobj, u32 size, u32 align)
377 uint32_t *sz)
378{ 311{
312 struct drm_device *dev = gpuobj->dev;
313 struct drm_nouveau_private *dev_priv = dev->dev_private;
314 struct nouveau_vram_engine *vram = &dev_priv->engine.vram;
315 struct nv50_gpuobj_node *node = NULL;
379 int ret; 316 int ret;
380 317
381 if (gpuobj->im_backing) 318 node = kzalloc(sizeof(*node), GFP_KERNEL);
382 return -EINVAL; 319 if (!node)
320 return -ENOMEM;
321 node->align = align;
383 322
384 *sz = ALIGN(*sz, NV50_INSTMEM_PAGE_SIZE); 323 size = (size + 4095) & ~4095;
385 if (*sz == 0) 324 align = max(align, (u32)4096);
386 return -EINVAL;
387 325
388 ret = nouveau_bo_new(dev, NULL, *sz, 0, TTM_PL_FLAG_VRAM, 0, 0x0000, 326 ret = vram->get(dev, size, align, 0, 0, &node->vram);
389 true, false, &gpuobj->im_backing);
390 if (ret) { 327 if (ret) {
391 NV_ERROR(dev, "error getting PRAMIN backing pages: %d\n", ret); 328 kfree(node);
392 return ret; 329 return ret;
393 } 330 }
394 331
395 ret = nouveau_bo_pin(gpuobj->im_backing, TTM_PL_FLAG_VRAM); 332 gpuobj->vinst = node->vram->offset;
396 if (ret) {
397 NV_ERROR(dev, "error pinning PRAMIN backing VRAM: %d\n", ret);
398 nouveau_bo_ref(NULL, &gpuobj->im_backing);
399 return ret;
400 }
401 333
402 gpuobj->im_backing_start = gpuobj->im_backing->bo.mem.mm_node->start; 334 if (gpuobj->flags & NVOBJ_FLAG_VM) {
403 gpuobj->im_backing_start <<= PAGE_SHIFT; 335 u32 flags = NV_MEM_ACCESS_RW;
336 if (!(gpuobj->flags & NVOBJ_FLAG_VM_USER))
337 flags |= NV_MEM_ACCESS_SYS;
404 338
339 ret = nouveau_vm_get(dev_priv->chan_vm, size, 12, flags,
340 &node->chan_vma);
341 if (ret) {
342 vram->put(dev, &node->vram);
343 kfree(node);
344 return ret;
345 }
346
347 nouveau_vm_map(&node->chan_vma, node->vram);
348 gpuobj->vinst = node->chan_vma.offset;
349 }
350
351 gpuobj->size = size;
352 gpuobj->node = node;
405 return 0; 353 return 0;
406} 354}
407 355
408void 356void
409nv50_instmem_clear(struct drm_device *dev, struct nouveau_gpuobj *gpuobj) 357nv50_instmem_put(struct nouveau_gpuobj *gpuobj)
410{ 358{
359 struct drm_device *dev = gpuobj->dev;
411 struct drm_nouveau_private *dev_priv = dev->dev_private; 360 struct drm_nouveau_private *dev_priv = dev->dev_private;
361 struct nouveau_vram_engine *vram = &dev_priv->engine.vram;
362 struct nv50_gpuobj_node *node;
363
364 node = gpuobj->node;
365 gpuobj->node = NULL;
412 366
413 if (gpuobj && gpuobj->im_backing) { 367 if (node->chan_vma.node) {
414 if (gpuobj->im_bound) 368 nouveau_vm_unmap(&node->chan_vma);
415 dev_priv->engine.instmem.unbind(dev, gpuobj); 369 nouveau_vm_put(&node->chan_vma);
416 nouveau_bo_unpin(gpuobj->im_backing);
417 nouveau_bo_ref(NULL, &gpuobj->im_backing);
418 gpuobj->im_backing = NULL;
419 } 370 }
371 vram->put(dev, &node->vram);
372 kfree(node);
420} 373}
421 374
422int 375int
423nv50_instmem_bind(struct drm_device *dev, struct nouveau_gpuobj *gpuobj) 376nv50_instmem_map(struct nouveau_gpuobj *gpuobj)
424{ 377{
425 struct drm_nouveau_private *dev_priv = dev->dev_private; 378 struct drm_nouveau_private *dev_priv = gpuobj->dev->dev_private;
426 struct nv50_instmem_priv *priv = dev_priv->engine.instmem.priv; 379 struct nv50_gpuobj_node *node = gpuobj->node;
427 struct nouveau_gpuobj *pramin_pt = priv->pramin_pt->gpuobj; 380 int ret;
428 uint32_t pte, pte_end;
429 uint64_t vram;
430
431 if (!gpuobj->im_backing || !gpuobj->im_pramin || gpuobj->im_bound)
432 return -EINVAL;
433
434 NV_DEBUG(dev, "st=0x%lx sz=0x%lx\n",
435 gpuobj->im_pramin->start, gpuobj->im_pramin->size);
436
437 pte = (gpuobj->im_pramin->start >> 12) << 1;
438 pte_end = ((gpuobj->im_pramin->size >> 12) << 1) + pte;
439 vram = gpuobj->im_backing_start;
440
441 NV_DEBUG(dev, "pramin=0x%lx, pte=%d, pte_end=%d\n",
442 gpuobj->im_pramin->start, pte, pte_end);
443 NV_DEBUG(dev, "first vram page: 0x%08x\n", gpuobj->im_backing_start);
444
445 vram |= 1;
446 if (dev_priv->vram_sys_base) {
447 vram += dev_priv->vram_sys_base;
448 vram |= 0x30;
449 }
450
451 while (pte < pte_end) {
452 nv_wo32(dev, pramin_pt, pte++, lower_32_bits(vram));
453 nv_wo32(dev, pramin_pt, pte++, upper_32_bits(vram));
454 vram += NV50_INSTMEM_PAGE_SIZE;
455 }
456 dev_priv->engine.instmem.flush(dev);
457 381
458 nv50_vm_flush(dev, 4); 382 ret = nouveau_vm_get(dev_priv->bar3_vm, gpuobj->size, 12,
459 nv50_vm_flush(dev, 6); 383 NV_MEM_ACCESS_RW, &node->vram->bar_vma);
384 if (ret)
385 return ret;
460 386
461 gpuobj->im_bound = 1; 387 nouveau_vm_map(&node->vram->bar_vma, node->vram);
388 gpuobj->pinst = node->vram->bar_vma.offset;
462 return 0; 389 return 0;
463} 390}
464 391
465int 392void
466nv50_instmem_unbind(struct drm_device *dev, struct nouveau_gpuobj *gpuobj) 393nv50_instmem_unmap(struct nouveau_gpuobj *gpuobj)
467{ 394{
468 struct drm_nouveau_private *dev_priv = dev->dev_private; 395 struct nv50_gpuobj_node *node = gpuobj->node;
469 struct nv50_instmem_priv *priv = dev_priv->engine.instmem.priv;
470 uint32_t pte, pte_end;
471
472 if (gpuobj->im_bound == 0)
473 return -EINVAL;
474
475 pte = (gpuobj->im_pramin->start >> 12) << 1;
476 pte_end = ((gpuobj->im_pramin->size >> 12) << 1) + pte;
477 396
478 while (pte < pte_end) { 397 if (node->vram->bar_vma.node) {
479 nv_wo32(dev, priv->pramin_pt->gpuobj, pte++, 0x00000000); 398 nouveau_vm_unmap(&node->vram->bar_vma);
480 nv_wo32(dev, priv->pramin_pt->gpuobj, pte++, 0x00000000); 399 nouveau_vm_put(&node->vram->bar_vma);
481 } 400 }
482 dev_priv->engine.instmem.flush(dev);
483
484 gpuobj->im_bound = 0;
485 return 0;
486} 401}
487 402
488void 403void
489nv50_instmem_flush(struct drm_device *dev) 404nv50_instmem_flush(struct drm_device *dev)
490{ 405{
406 struct drm_nouveau_private *dev_priv = dev->dev_private;
407 unsigned long flags;
408
409 spin_lock_irqsave(&dev_priv->vm_lock, flags);
491 nv_wr32(dev, 0x00330c, 0x00000001); 410 nv_wr32(dev, 0x00330c, 0x00000001);
492 if (!nv_wait(0x00330c, 0x00000002, 0x00000000)) 411 if (!nv_wait(dev, 0x00330c, 0x00000002, 0x00000000))
493 NV_ERROR(dev, "PRAMIN flush timeout\n"); 412 NV_ERROR(dev, "PRAMIN flush timeout\n");
413 spin_unlock_irqrestore(&dev_priv->vm_lock, flags);
494} 414}
495 415
496void 416void
497nv84_instmem_flush(struct drm_device *dev) 417nv84_instmem_flush(struct drm_device *dev)
498{ 418{
419 struct drm_nouveau_private *dev_priv = dev->dev_private;
420 unsigned long flags;
421
422 spin_lock_irqsave(&dev_priv->vm_lock, flags);
499 nv_wr32(dev, 0x070000, 0x00000001); 423 nv_wr32(dev, 0x070000, 0x00000001);
500 if (!nv_wait(0x070000, 0x00000002, 0x00000000)) 424 if (!nv_wait(dev, 0x070000, 0x00000002, 0x00000000))
501 NV_ERROR(dev, "PRAMIN flush timeout\n"); 425 NV_ERROR(dev, "PRAMIN flush timeout\n");
502} 426 spin_unlock_irqrestore(&dev_priv->vm_lock, flags);
503
504void
505nv50_vm_flush(struct drm_device *dev, int engine)
506{
507 nv_wr32(dev, 0x100c80, (engine << 16) | 1);
508 if (!nv_wait(0x100c80, 0x00000001, 0x00000000))
509 NV_ERROR(dev, "vm flush timeout: engine %d\n", engine);
510} 427}
511 428
diff --git a/drivers/gpu/drm/nouveau/nv50_mpeg.c b/drivers/gpu/drm/nouveau/nv50_mpeg.c
new file mode 100644
index 000000000000..1dc5913f78c5
--- /dev/null
+++ b/drivers/gpu/drm/nouveau/nv50_mpeg.c
@@ -0,0 +1,256 @@
1/*
2 * Copyright 2011 Red Hat 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: Ben Skeggs
23 */
24
25#include "drmP.h"
26#include "nouveau_drv.h"
27#include "nouveau_ramht.h"
28
29struct nv50_mpeg_engine {
30 struct nouveau_exec_engine base;
31};
32
33static inline u32
34CTX_PTR(struct drm_device *dev, u32 offset)
35{
36 struct drm_nouveau_private *dev_priv = dev->dev_private;
37
38 if (dev_priv->chipset == 0x50)
39 offset += 0x0260;
40 else
41 offset += 0x0060;
42
43 return offset;
44}
45
46static int
47nv50_mpeg_context_new(struct nouveau_channel *chan, int engine)
48{
49 struct drm_device *dev = chan->dev;
50 struct drm_nouveau_private *dev_priv = dev->dev_private;
51 struct nouveau_gpuobj *ramin = chan->ramin;
52 struct nouveau_gpuobj *ctx = NULL;
53 int ret;
54
55 NV_DEBUG(dev, "ch%d\n", chan->id);
56
57 ret = nouveau_gpuobj_new(dev, chan, 128 * 4, 0, NVOBJ_FLAG_ZERO_ALLOC |
58 NVOBJ_FLAG_ZERO_FREE, &ctx);
59 if (ret)
60 return ret;
61
62 nv_wo32(ramin, CTX_PTR(dev, 0x00), 0x80190002);
63 nv_wo32(ramin, CTX_PTR(dev, 0x04), ctx->vinst + ctx->size - 1);
64 nv_wo32(ramin, CTX_PTR(dev, 0x08), ctx->vinst);
65 nv_wo32(ramin, CTX_PTR(dev, 0x0c), 0);
66 nv_wo32(ramin, CTX_PTR(dev, 0x10), 0);
67 nv_wo32(ramin, CTX_PTR(dev, 0x14), 0x00010000);
68
69 nv_wo32(ctx, 0x70, 0x00801ec1);
70 nv_wo32(ctx, 0x7c, 0x0000037c);
71 dev_priv->engine.instmem.flush(dev);
72
73 chan->engctx[engine] = ctx;
74 return 0;
75}
76
77static void
78nv50_mpeg_context_del(struct nouveau_channel *chan, int engine)
79{
80 struct drm_nouveau_private *dev_priv = chan->dev->dev_private;
81 struct nouveau_gpuobj *ctx = chan->engctx[engine];
82 struct drm_device *dev = chan->dev;
83 unsigned long flags;
84 u32 inst, i;
85
86 if (!chan->ramin)
87 return;
88
89 inst = chan->ramin->vinst >> 12;
90 inst |= 0x80000000;
91
92 spin_lock_irqsave(&dev_priv->context_switch_lock, flags);
93 nv_mask(dev, 0x00b32c, 0x00000001, 0x00000000);
94 if (nv_rd32(dev, 0x00b318) == inst)
95 nv_mask(dev, 0x00b318, 0x80000000, 0x00000000);
96 nv_mask(dev, 0x00b32c, 0x00000001, 0x00000001);
97 spin_unlock_irqrestore(&dev_priv->context_switch_lock, flags);
98
99 for (i = 0x00; i <= 0x14; i += 4)
100 nv_wo32(chan->ramin, CTX_PTR(dev, i), 0x00000000);
101 nouveau_gpuobj_ref(NULL, &ctx);
102 chan->engctx[engine] = NULL;
103}
104
105static int
106nv50_mpeg_object_new(struct nouveau_channel *chan, int engine,
107 u32 handle, u16 class)
108{
109 struct drm_device *dev = chan->dev;
110 struct drm_nouveau_private *dev_priv = dev->dev_private;
111 struct nouveau_gpuobj *obj = NULL;
112 int ret;
113
114 ret = nouveau_gpuobj_new(dev, chan, 16, 16, NVOBJ_FLAG_ZERO_FREE, &obj);
115 if (ret)
116 return ret;
117 obj->engine = 2;
118 obj->class = class;
119
120 nv_wo32(obj, 0x00, class);
121 nv_wo32(obj, 0x04, 0x00000000);
122 nv_wo32(obj, 0x08, 0x00000000);
123 nv_wo32(obj, 0x0c, 0x00000000);
124 dev_priv->engine.instmem.flush(dev);
125
126 ret = nouveau_ramht_insert(chan, handle, obj);
127 nouveau_gpuobj_ref(NULL, &obj);
128 return ret;
129}
130
131static void
132nv50_mpeg_tlb_flush(struct drm_device *dev, int engine)
133{
134 nv50_vm_flush_engine(dev, 0x08);
135}
136
137static int
138nv50_mpeg_init(struct drm_device *dev, int engine)
139{
140 nv_wr32(dev, 0x00b32c, 0x00000000);
141 nv_wr32(dev, 0x00b314, 0x00000100);
142 nv_wr32(dev, 0x00b0e0, 0x0000001a);
143
144 nv_wr32(dev, 0x00b220, 0x00000044);
145 nv_wr32(dev, 0x00b300, 0x00801ec1);
146 nv_wr32(dev, 0x00b390, 0x00000000);
147 nv_wr32(dev, 0x00b394, 0x00000000);
148 nv_wr32(dev, 0x00b398, 0x00000000);
149 nv_mask(dev, 0x00b32c, 0x00000001, 0x00000001);
150
151 nv_wr32(dev, 0x00b100, 0xffffffff);
152 nv_wr32(dev, 0x00b140, 0xffffffff);
153
154 if (!nv_wait(dev, 0x00b200, 0x00000001, 0x00000000)) {
155 NV_ERROR(dev, "PMPEG init: 0x%08x\n", nv_rd32(dev, 0x00b200));
156 return -EBUSY;
157 }
158
159 return 0;
160}
161
162static int
163nv50_mpeg_fini(struct drm_device *dev, int engine)
164{
165 /*XXX: context save for s/r */
166 nv_mask(dev, 0x00b32c, 0x00000001, 0x00000000);
167 nv_wr32(dev, 0x00b140, 0x00000000);
168 return 0;
169}
170
171static void
172nv50_mpeg_isr(struct drm_device *dev)
173{
174 u32 stat = nv_rd32(dev, 0x00b100);
175 u32 type = nv_rd32(dev, 0x00b230);
176 u32 mthd = nv_rd32(dev, 0x00b234);
177 u32 data = nv_rd32(dev, 0x00b238);
178 u32 show = stat;
179
180 if (stat & 0x01000000) {
181 /* happens on initial binding of the object */
182 if (type == 0x00000020 && mthd == 0x0000) {
183 nv_wr32(dev, 0x00b308, 0x00000100);
184 show &= ~0x01000000;
185 }
186 }
187
188 if (show && nouveau_ratelimit()) {
189 NV_INFO(dev, "PMPEG - 0x%08x 0x%08x 0x%08x 0x%08x\n",
190 stat, type, mthd, data);
191 }
192
193 nv_wr32(dev, 0x00b100, stat);
194 nv_wr32(dev, 0x00b230, 0x00000001);
195 nv50_fb_vm_trap(dev, 1);
196}
197
198static void
199nv50_vpe_isr(struct drm_device *dev)
200{
201 if (nv_rd32(dev, 0x00b100))
202 nv50_mpeg_isr(dev);
203
204 if (nv_rd32(dev, 0x00b800)) {
205 u32 stat = nv_rd32(dev, 0x00b800);
206 NV_INFO(dev, "PMSRCH: 0x%08x\n", stat);
207 nv_wr32(dev, 0xb800, stat);
208 }
209}
210
211static void
212nv50_mpeg_destroy(struct drm_device *dev, int engine)
213{
214 struct nv50_mpeg_engine *pmpeg = nv_engine(dev, engine);
215
216 nouveau_irq_unregister(dev, 0);
217
218 NVOBJ_ENGINE_DEL(dev, MPEG);
219 kfree(pmpeg);
220}
221
222int
223nv50_mpeg_create(struct drm_device *dev)
224{
225 struct drm_nouveau_private *dev_priv = dev->dev_private;
226 struct nv50_mpeg_engine *pmpeg;
227
228 pmpeg = kzalloc(sizeof(*pmpeg), GFP_KERNEL);
229 if (!pmpeg)
230 return -ENOMEM;
231
232 pmpeg->base.destroy = nv50_mpeg_destroy;
233 pmpeg->base.init = nv50_mpeg_init;
234 pmpeg->base.fini = nv50_mpeg_fini;
235 pmpeg->base.context_new = nv50_mpeg_context_new;
236 pmpeg->base.context_del = nv50_mpeg_context_del;
237 pmpeg->base.object_new = nv50_mpeg_object_new;
238 pmpeg->base.tlb_flush = nv50_mpeg_tlb_flush;
239
240 if (dev_priv->chipset == 0x50) {
241 nouveau_irq_register(dev, 0, nv50_vpe_isr);
242 NVOBJ_ENGINE_ADD(dev, MPEG, &pmpeg->base);
243 NVOBJ_CLASS(dev, 0x3174, MPEG);
244#if 0
245 NVOBJ_ENGINE_ADD(dev, ME, &pme->base);
246 NVOBJ_CLASS(dev, 0x4075, ME);
247#endif
248 } else {
249 nouveau_irq_register(dev, 0, nv50_mpeg_isr);
250 NVOBJ_ENGINE_ADD(dev, MPEG, &pmpeg->base);
251 NVOBJ_CLASS(dev, 0x8274, MPEG);
252 }
253
254 return 0;
255
256}
diff --git a/drivers/gpu/drm/nouveau/nv50_pm.c b/drivers/gpu/drm/nouveau/nv50_pm.c
new file mode 100644
index 000000000000..8a2810011bda
--- /dev/null
+++ b/drivers/gpu/drm/nouveau/nv50_pm.c
@@ -0,0 +1,146 @@
1/*
2 * Copyright 2010 Red Hat 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: Ben Skeggs
23 */
24
25#include "drmP.h"
26#include "nouveau_drv.h"
27#include "nouveau_bios.h"
28#include "nouveau_pm.h"
29
30struct nv50_pm_state {
31 struct nouveau_pm_level *perflvl;
32 struct pll_lims pll;
33 enum pll_types type;
34 int N, M, P;
35};
36
37int
38nv50_pm_clock_get(struct drm_device *dev, u32 id)
39{
40 struct pll_lims pll;
41 int P, N, M, ret;
42 u32 reg0, reg1;
43
44 ret = get_pll_limits(dev, id, &pll);
45 if (ret)
46 return ret;
47
48 reg0 = nv_rd32(dev, pll.reg + 0);
49 reg1 = nv_rd32(dev, pll.reg + 4);
50
51 if ((reg0 & 0x80000000) == 0) {
52 if (id == PLL_SHADER) {
53 NV_DEBUG(dev, "Shader PLL is disabled. "
54 "Shader clock is twice the core\n");
55 ret = nv50_pm_clock_get(dev, PLL_CORE);
56 if (ret > 0)
57 return ret << 1;
58 } else if (id == PLL_MEMORY) {
59 NV_DEBUG(dev, "Memory PLL is disabled. "
60 "Memory clock is equal to the ref_clk\n");
61 return pll.refclk;
62 }
63 }
64
65 P = (reg0 & 0x00070000) >> 16;
66 N = (reg1 & 0x0000ff00) >> 8;
67 M = (reg1 & 0x000000ff);
68
69 return ((pll.refclk * N / M) >> P);
70}
71
72void *
73nv50_pm_clock_pre(struct drm_device *dev, struct nouveau_pm_level *perflvl,
74 u32 id, int khz)
75{
76 struct nv50_pm_state *state;
77 int dummy, ret;
78
79 state = kzalloc(sizeof(*state), GFP_KERNEL);
80 if (!state)
81 return ERR_PTR(-ENOMEM);
82 state->type = id;
83 state->perflvl = perflvl;
84
85 ret = get_pll_limits(dev, id, &state->pll);
86 if (ret < 0) {
87 kfree(state);
88 return (ret == -ENOENT) ? NULL : ERR_PTR(ret);
89 }
90
91 ret = nv50_calc_pll(dev, &state->pll, khz, &state->N, &state->M,
92 &dummy, &dummy, &state->P);
93 if (ret < 0) {
94 kfree(state);
95 return ERR_PTR(ret);
96 }
97
98 return state;
99}
100
101void
102nv50_pm_clock_set(struct drm_device *dev, void *pre_state)
103{
104 struct nv50_pm_state *state = pre_state;
105 struct nouveau_pm_level *perflvl = state->perflvl;
106 u32 reg = state->pll.reg, tmp;
107 struct bit_entry BIT_M;
108 u16 script;
109 int N = state->N;
110 int M = state->M;
111 int P = state->P;
112
113 if (state->type == PLL_MEMORY && perflvl->memscript &&
114 bit_table(dev, 'M', &BIT_M) == 0 &&
115 BIT_M.version == 1 && BIT_M.length >= 0x0b) {
116 script = ROM16(BIT_M.data[0x05]);
117 if (script)
118 nouveau_bios_run_init_table(dev, script, NULL);
119 script = ROM16(BIT_M.data[0x07]);
120 if (script)
121 nouveau_bios_run_init_table(dev, script, NULL);
122 script = ROM16(BIT_M.data[0x09]);
123 if (script)
124 nouveau_bios_run_init_table(dev, script, NULL);
125
126 nouveau_bios_run_init_table(dev, perflvl->memscript, NULL);
127 }
128
129 if (state->type == PLL_MEMORY) {
130 nv_wr32(dev, 0x100210, 0);
131 nv_wr32(dev, 0x1002dc, 1);
132 }
133
134 tmp = nv_rd32(dev, reg + 0) & 0xfff8ffff;
135 tmp |= 0x80000000 | (P << 16);
136 nv_wr32(dev, reg + 0, tmp);
137 nv_wr32(dev, reg + 4, (N << 8) | M);
138
139 if (state->type == PLL_MEMORY) {
140 nv_wr32(dev, 0x1002dc, 0);
141 nv_wr32(dev, 0x100210, 0x80000000);
142 }
143
144 kfree(state);
145}
146
diff --git a/drivers/gpu/drm/nouveau/nv50_sor.c b/drivers/gpu/drm/nouveau/nv50_sor.c
index bcd4cf84a7e6..c25c59386420 100644
--- a/drivers/gpu/drm/nouveau/nv50_sor.c
+++ b/drivers/gpu/drm/nouveau/nv50_sor.c
@@ -41,8 +41,7 @@ nv50_sor_disconnect(struct drm_encoder *encoder)
41{ 41{
42 struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder); 42 struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder);
43 struct drm_device *dev = encoder->dev; 43 struct drm_device *dev = encoder->dev;
44 struct drm_nouveau_private *dev_priv = dev->dev_private; 44 struct nouveau_channel *evo = nv50_display(dev)->master;
45 struct nouveau_channel *evo = dev_priv->evo;
46 int ret; 45 int ret;
47 46
48 if (!nv_encoder->crtc) 47 if (!nv_encoder->crtc)
@@ -92,7 +91,7 @@ nv50_sor_dpms(struct drm_encoder *encoder, int mode)
92 } 91 }
93 92
94 /* wait for it to be done */ 93 /* wait for it to be done */
95 if (!nv_wait(NV50_PDISPLAY_SOR_DPMS_CTRL(or), 94 if (!nv_wait(dev, NV50_PDISPLAY_SOR_DPMS_CTRL(or),
96 NV50_PDISPLAY_SOR_DPMS_CTRL_PENDING, 0)) { 95 NV50_PDISPLAY_SOR_DPMS_CTRL_PENDING, 0)) {
97 NV_ERROR(dev, "timeout: SOR_DPMS_CTRL_PENDING(%d) == 0\n", or); 96 NV_ERROR(dev, "timeout: SOR_DPMS_CTRL_PENDING(%d) == 0\n", or);
98 NV_ERROR(dev, "SOR_DPMS_CTRL(%d) = 0x%08x\n", or, 97 NV_ERROR(dev, "SOR_DPMS_CTRL(%d) = 0x%08x\n", or,
@@ -108,7 +107,7 @@ nv50_sor_dpms(struct drm_encoder *encoder, int mode)
108 107
109 nv_wr32(dev, NV50_PDISPLAY_SOR_DPMS_CTRL(or), val | 108 nv_wr32(dev, NV50_PDISPLAY_SOR_DPMS_CTRL(or), val |
110 NV50_PDISPLAY_SOR_DPMS_CTRL_PENDING); 109 NV50_PDISPLAY_SOR_DPMS_CTRL_PENDING);
111 if (!nv_wait(NV50_PDISPLAY_SOR_DPMS_STATE(or), 110 if (!nv_wait(dev, NV50_PDISPLAY_SOR_DPMS_STATE(or),
112 NV50_PDISPLAY_SOR_DPMS_STATE_WAIT, 0)) { 111 NV50_PDISPLAY_SOR_DPMS_STATE_WAIT, 0)) {
113 NV_ERROR(dev, "timeout: SOR_DPMS_STATE_WAIT(%d) == 0\n", or); 112 NV_ERROR(dev, "timeout: SOR_DPMS_STATE_WAIT(%d) == 0\n", or);
114 NV_ERROR(dev, "SOR_DPMS_STATE(%d) = 0x%08x\n", or, 113 NV_ERROR(dev, "SOR_DPMS_STATE(%d) = 0x%08x\n", or,
@@ -184,8 +183,7 @@ static void
184nv50_sor_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode, 183nv50_sor_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode,
185 struct drm_display_mode *adjusted_mode) 184 struct drm_display_mode *adjusted_mode)
186{ 185{
187 struct drm_nouveau_private *dev_priv = encoder->dev->dev_private; 186 struct nouveau_channel *evo = nv50_display(encoder->dev)->master;
188 struct nouveau_channel *evo = dev_priv->evo;
189 struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder); 187 struct nouveau_encoder *nv_encoder = nouveau_encoder(encoder);
190 struct drm_device *dev = encoder->dev; 188 struct drm_device *dev = encoder->dev;
191 struct nouveau_crtc *crtc = nouveau_crtc(encoder->crtc); 189 struct nouveau_crtc *crtc = nouveau_crtc(encoder->crtc);
diff --git a/drivers/gpu/drm/nouveau/nv50_vm.c b/drivers/gpu/drm/nouveau/nv50_vm.c
new file mode 100644
index 000000000000..1a0dd491a0e4
--- /dev/null
+++ b/drivers/gpu/drm/nouveau/nv50_vm.c
@@ -0,0 +1,182 @@
1/*
2 * Copyright 2010 Red Hat 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: Ben Skeggs
23 */
24
25#include "drmP.h"
26
27#include "nouveau_drv.h"
28#include "nouveau_vm.h"
29
30void
31nv50_vm_map_pgt(struct nouveau_gpuobj *pgd, u32 pde,
32 struct nouveau_gpuobj *pgt[2])
33{
34 u64 phys = 0xdeadcafe00000000ULL;
35 u32 coverage = 0;
36
37 if (pgt[0]) {
38 phys = 0x00000003 | pgt[0]->vinst; /* present, 4KiB pages */
39 coverage = (pgt[0]->size >> 3) << 12;
40 } else
41 if (pgt[1]) {
42 phys = 0x00000001 | pgt[1]->vinst; /* present */
43 coverage = (pgt[1]->size >> 3) << 16;
44 }
45
46 if (phys & 1) {
47 if (coverage <= 32 * 1024 * 1024)
48 phys |= 0x60;
49 else if (coverage <= 64 * 1024 * 1024)
50 phys |= 0x40;
51 else if (coverage < 128 * 1024 * 1024)
52 phys |= 0x20;
53 }
54
55 nv_wo32(pgd, (pde * 8) + 0, lower_32_bits(phys));
56 nv_wo32(pgd, (pde * 8) + 4, upper_32_bits(phys));
57}
58
59static inline u64
60nv50_vm_addr(struct nouveau_vma *vma, u64 phys, u32 memtype, u32 target)
61{
62 struct drm_nouveau_private *dev_priv = vma->vm->dev->dev_private;
63
64 phys |= 1; /* present */
65 phys |= (u64)memtype << 40;
66
67 /* IGPs don't have real VRAM, re-target to stolen system memory */
68 if (target == 0 && dev_priv->vram_sys_base) {
69 phys += dev_priv->vram_sys_base;
70 target = 3;
71 }
72
73 phys |= target << 4;
74
75 if (vma->access & NV_MEM_ACCESS_SYS)
76 phys |= (1 << 6);
77
78 if (!(vma->access & NV_MEM_ACCESS_WO))
79 phys |= (1 << 3);
80
81 return phys;
82}
83
84void
85nv50_vm_map(struct nouveau_vma *vma, struct nouveau_gpuobj *pgt,
86 struct nouveau_mem *mem, u32 pte, u32 cnt, u64 phys, u64 delta)
87{
88 u32 comp = (mem->memtype & 0x180) >> 7;
89 u32 block;
90 int i;
91
92 phys = nv50_vm_addr(vma, phys, mem->memtype, 0);
93 pte <<= 3;
94 cnt <<= 3;
95
96 while (cnt) {
97 u32 offset_h = upper_32_bits(phys);
98 u32 offset_l = lower_32_bits(phys);
99
100 for (i = 7; i >= 0; i--) {
101 block = 1 << (i + 3);
102 if (cnt >= block && !(pte & (block - 1)))
103 break;
104 }
105 offset_l |= (i << 7);
106
107 phys += block << (vma->node->type - 3);
108 cnt -= block;
109 if (comp) {
110 u32 tag = mem->tag->start + ((delta >> 16) * comp);
111 offset_h |= (tag << 17);
112 delta += block << (vma->node->type - 3);
113 }
114
115 while (block) {
116 nv_wo32(pgt, pte + 0, offset_l);
117 nv_wo32(pgt, pte + 4, offset_h);
118 pte += 8;
119 block -= 8;
120 }
121 }
122}
123
124void
125nv50_vm_map_sg(struct nouveau_vma *vma, struct nouveau_gpuobj *pgt,
126 struct nouveau_mem *mem, u32 pte, u32 cnt, dma_addr_t *list)
127{
128 pte <<= 3;
129 while (cnt--) {
130 u64 phys = nv50_vm_addr(vma, (u64)*list++, mem->memtype, 2);
131 nv_wo32(pgt, pte + 0, lower_32_bits(phys));
132 nv_wo32(pgt, pte + 4, upper_32_bits(phys));
133 pte += 8;
134 }
135}
136
137void
138nv50_vm_unmap(struct nouveau_gpuobj *pgt, u32 pte, u32 cnt)
139{
140 pte <<= 3;
141 while (cnt--) {
142 nv_wo32(pgt, pte + 0, 0x00000000);
143 nv_wo32(pgt, pte + 4, 0x00000000);
144 pte += 8;
145 }
146}
147
148void
149nv50_vm_flush(struct nouveau_vm *vm)
150{
151 struct drm_nouveau_private *dev_priv = vm->dev->dev_private;
152 struct nouveau_instmem_engine *pinstmem = &dev_priv->engine.instmem;
153 struct nouveau_fifo_engine *pfifo = &dev_priv->engine.fifo;
154 int i;
155
156 pinstmem->flush(vm->dev);
157
158 /* BAR */
159 if (vm != dev_priv->chan_vm) {
160 nv50_vm_flush_engine(vm->dev, 6);
161 return;
162 }
163
164 pfifo->tlb_flush(vm->dev);
165 for (i = 0; i < NVOBJ_ENGINE_NR; i++) {
166 if (atomic_read(&vm->engref[i]))
167 dev_priv->eng[i]->tlb_flush(vm->dev, i);
168 }
169}
170
171void
172nv50_vm_flush_engine(struct drm_device *dev, int engine)
173{
174 struct drm_nouveau_private *dev_priv = dev->dev_private;
175 unsigned long flags;
176
177 spin_lock_irqsave(&dev_priv->vm_lock, flags);
178 nv_wr32(dev, 0x100c80, (engine << 16) | 1);
179 if (!nv_wait(dev, 0x100c80, 0x00000001, 0x00000000))
180 NV_ERROR(dev, "vm flush timeout: engine %d\n", engine);
181 spin_unlock_irqrestore(&dev_priv->vm_lock, flags);
182}
diff --git a/drivers/gpu/drm/nouveau/nv50_vram.c b/drivers/gpu/drm/nouveau/nv50_vram.c
new file mode 100644
index 000000000000..ffbc3d8cf5be
--- /dev/null
+++ b/drivers/gpu/drm/nouveau/nv50_vram.c
@@ -0,0 +1,211 @@
1/*
2 * Copyright 2010 Red Hat 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: Ben Skeggs
23 */
24
25#include "drmP.h"
26#include "nouveau_drv.h"
27#include "nouveau_mm.h"
28
29static int types[0x80] = {
30 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
31 1, 1, 1, 1, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0,
32 1, 1, 1, 1, 1, 1, 1, 0, 2, 2, 2, 2, 2, 2, 2, 0,
33 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
34 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 0, 0,
35 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
36 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 2, 2, 2, 2,
37 1, 0, 2, 0, 1, 0, 2, 0, 1, 1, 2, 2, 1, 1, 0, 0
38};
39
40bool
41nv50_vram_flags_valid(struct drm_device *dev, u32 tile_flags)
42{
43 int type = (tile_flags & NOUVEAU_GEM_TILE_LAYOUT_MASK) >> 8;
44
45 if (likely(type < ARRAY_SIZE(types) && types[type]))
46 return true;
47 return false;
48}
49
50void
51nv50_vram_del(struct drm_device *dev, struct nouveau_mem **pmem)
52{
53 struct drm_nouveau_private *dev_priv = dev->dev_private;
54 struct ttm_bo_device *bdev = &dev_priv->ttm.bdev;
55 struct ttm_mem_type_manager *man = &bdev->man[TTM_PL_VRAM];
56 struct nouveau_mm *mm = man->priv;
57 struct nouveau_mm_node *this;
58 struct nouveau_mem *mem;
59
60 mem = *pmem;
61 *pmem = NULL;
62 if (unlikely(mem == NULL))
63 return;
64
65 mutex_lock(&mm->mutex);
66 while (!list_empty(&mem->regions)) {
67 this = list_first_entry(&mem->regions, struct nouveau_mm_node, rl_entry);
68
69 list_del(&this->rl_entry);
70 nouveau_mm_put(mm, this);
71 }
72
73 if (mem->tag) {
74 drm_mm_put_block(mem->tag);
75 mem->tag = NULL;
76 }
77 mutex_unlock(&mm->mutex);
78
79 kfree(mem);
80}
81
82int
83nv50_vram_new(struct drm_device *dev, u64 size, u32 align, u32 size_nc,
84 u32 memtype, struct nouveau_mem **pmem)
85{
86 struct drm_nouveau_private *dev_priv = dev->dev_private;
87 struct ttm_bo_device *bdev = &dev_priv->ttm.bdev;
88 struct ttm_mem_type_manager *man = &bdev->man[TTM_PL_VRAM];
89 struct nouveau_mm *mm = man->priv;
90 struct nouveau_mm_node *r;
91 struct nouveau_mem *mem;
92 int comp = (memtype & 0x300) >> 8;
93 int type = (memtype & 0x07f);
94 int ret;
95
96 if (!types[type])
97 return -EINVAL;
98 size >>= 12;
99 align >>= 12;
100 size_nc >>= 12;
101
102 mem = kzalloc(sizeof(*mem), GFP_KERNEL);
103 if (!mem)
104 return -ENOMEM;
105
106 mutex_lock(&mm->mutex);
107 if (comp) {
108 if (align == 16) {
109 struct nouveau_fb_engine *pfb = &dev_priv->engine.fb;
110 int n = (size >> 4) * comp;
111
112 mem->tag = drm_mm_search_free(&pfb->tag_heap, n, 0, 0);
113 if (mem->tag)
114 mem->tag = drm_mm_get_block(mem->tag, n, 0);
115 }
116
117 if (unlikely(!mem->tag))
118 comp = 0;
119 }
120
121 INIT_LIST_HEAD(&mem->regions);
122 mem->dev = dev_priv->dev;
123 mem->memtype = (comp << 7) | type;
124 mem->size = size;
125
126 do {
127 ret = nouveau_mm_get(mm, types[type], size, size_nc, align, &r);
128 if (ret) {
129 mutex_unlock(&mm->mutex);
130 nv50_vram_del(dev, &mem);
131 return ret;
132 }
133
134 list_add_tail(&r->rl_entry, &mem->regions);
135 size -= r->length;
136 } while (size);
137 mutex_unlock(&mm->mutex);
138
139 r = list_first_entry(&mem->regions, struct nouveau_mm_node, rl_entry);
140 mem->offset = (u64)r->offset << 12;
141 *pmem = mem;
142 return 0;
143}
144
145static u32
146nv50_vram_rblock(struct drm_device *dev)
147{
148 struct drm_nouveau_private *dev_priv = dev->dev_private;
149 int i, parts, colbits, rowbitsa, rowbitsb, banks;
150 u64 rowsize, predicted;
151 u32 r0, r4, rt, ru, rblock_size;
152
153 r0 = nv_rd32(dev, 0x100200);
154 r4 = nv_rd32(dev, 0x100204);
155 rt = nv_rd32(dev, 0x100250);
156 ru = nv_rd32(dev, 0x001540);
157 NV_DEBUG(dev, "memcfg 0x%08x 0x%08x 0x%08x 0x%08x\n", r0, r4, rt, ru);
158
159 for (i = 0, parts = 0; i < 8; i++) {
160 if (ru & (0x00010000 << i))
161 parts++;
162 }
163
164 colbits = (r4 & 0x0000f000) >> 12;
165 rowbitsa = ((r4 & 0x000f0000) >> 16) + 8;
166 rowbitsb = ((r4 & 0x00f00000) >> 20) + 8;
167 banks = ((r4 & 0x01000000) ? 8 : 4);
168
169 rowsize = parts * banks * (1 << colbits) * 8;
170 predicted = rowsize << rowbitsa;
171 if (r0 & 0x00000004)
172 predicted += rowsize << rowbitsb;
173
174 if (predicted != dev_priv->vram_size) {
175 NV_WARN(dev, "memory controller reports %dMiB VRAM\n",
176 (u32)(dev_priv->vram_size >> 20));
177 NV_WARN(dev, "we calculated %dMiB VRAM\n",
178 (u32)(predicted >> 20));
179 }
180
181 rblock_size = rowsize;
182 if (rt & 1)
183 rblock_size *= 3;
184
185 NV_DEBUG(dev, "rblock %d bytes\n", rblock_size);
186 return rblock_size;
187}
188
189int
190nv50_vram_init(struct drm_device *dev)
191{
192 struct drm_nouveau_private *dev_priv = dev->dev_private;
193
194 dev_priv->vram_size = nv_rd32(dev, 0x10020c);
195 dev_priv->vram_size |= (dev_priv->vram_size & 0xff) << 32;
196 dev_priv->vram_size &= 0xffffffff00ULL;
197
198 switch (dev_priv->chipset) {
199 case 0xaa:
200 case 0xac:
201 case 0xaf:
202 dev_priv->vram_sys_base = (u64)nv_rd32(dev, 0x100e10) << 12;
203 dev_priv->vram_rblock_size = 4096;
204 break;
205 default:
206 dev_priv->vram_rblock_size = nv50_vram_rblock(dev);
207 break;
208 }
209
210 return 0;
211}
diff --git a/drivers/gpu/drm/nouveau/nv84_crypt.c b/drivers/gpu/drm/nouveau/nv84_crypt.c
new file mode 100644
index 000000000000..75b809a51748
--- /dev/null
+++ b/drivers/gpu/drm/nouveau/nv84_crypt.c
@@ -0,0 +1,193 @@
1/*
2 * Copyright 2010 Red Hat 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: Ben Skeggs
23 */
24
25#include "drmP.h"
26#include "nouveau_drv.h"
27#include "nouveau_util.h"
28#include "nouveau_vm.h"
29#include "nouveau_ramht.h"
30
31struct nv84_crypt_engine {
32 struct nouveau_exec_engine base;
33};
34
35static int
36nv84_crypt_context_new(struct nouveau_channel *chan, int engine)
37{
38 struct drm_device *dev = chan->dev;
39 struct drm_nouveau_private *dev_priv = dev->dev_private;
40 struct nouveau_gpuobj *ramin = chan->ramin;
41 struct nouveau_gpuobj *ctx;
42 int ret;
43
44 NV_DEBUG(dev, "ch%d\n", chan->id);
45
46 ret = nouveau_gpuobj_new(dev, chan, 256, 0, NVOBJ_FLAG_ZERO_ALLOC |
47 NVOBJ_FLAG_ZERO_FREE, &ctx);
48 if (ret)
49 return ret;
50
51 nv_wo32(ramin, 0xa0, 0x00190000);
52 nv_wo32(ramin, 0xa4, ctx->vinst + ctx->size - 1);
53 nv_wo32(ramin, 0xa8, ctx->vinst);
54 nv_wo32(ramin, 0xac, 0);
55 nv_wo32(ramin, 0xb0, 0);
56 nv_wo32(ramin, 0xb4, 0);
57 dev_priv->engine.instmem.flush(dev);
58
59 atomic_inc(&chan->vm->engref[engine]);
60 chan->engctx[engine] = ctx;
61 return 0;
62}
63
64static void
65nv84_crypt_context_del(struct nouveau_channel *chan, int engine)
66{
67 struct nouveau_gpuobj *ctx = chan->engctx[engine];
68 struct drm_device *dev = chan->dev;
69 u32 inst;
70
71 inst = (chan->ramin->vinst >> 12);
72 inst |= 0x80000000;
73
74 /* mark context as invalid if still on the hardware, not
75 * doing this causes issues the next time PCRYPT is used,
76 * unsurprisingly :)
77 */
78 nv_wr32(dev, 0x10200c, 0x00000000);
79 if (nv_rd32(dev, 0x102188) == inst)
80 nv_mask(dev, 0x102188, 0x80000000, 0x00000000);
81 if (nv_rd32(dev, 0x10218c) == inst)
82 nv_mask(dev, 0x10218c, 0x80000000, 0x00000000);
83 nv_wr32(dev, 0x10200c, 0x00000010);
84
85 nouveau_gpuobj_ref(NULL, &ctx);
86
87 atomic_dec(&chan->vm->engref[engine]);
88 chan->engctx[engine] = NULL;
89}
90
91static int
92nv84_crypt_object_new(struct nouveau_channel *chan, int engine,
93 u32 handle, u16 class)
94{
95 struct drm_device *dev = chan->dev;
96 struct drm_nouveau_private *dev_priv = dev->dev_private;
97 struct nouveau_gpuobj *obj = NULL;
98 int ret;
99
100 ret = nouveau_gpuobj_new(dev, chan, 16, 16, NVOBJ_FLAG_ZERO_FREE, &obj);
101 if (ret)
102 return ret;
103 obj->engine = 5;
104 obj->class = class;
105
106 nv_wo32(obj, 0x00, class);
107 dev_priv->engine.instmem.flush(dev);
108
109 ret = nouveau_ramht_insert(chan, handle, obj);
110 nouveau_gpuobj_ref(NULL, &obj);
111 return ret;
112}
113
114static void
115nv84_crypt_tlb_flush(struct drm_device *dev, int engine)
116{
117 nv50_vm_flush_engine(dev, 0x0a);
118}
119
120static void
121nv84_crypt_isr(struct drm_device *dev)
122{
123 u32 stat = nv_rd32(dev, 0x102130);
124 u32 mthd = nv_rd32(dev, 0x102190);
125 u32 data = nv_rd32(dev, 0x102194);
126 u32 inst = nv_rd32(dev, 0x102188) & 0x7fffffff;
127 int show = nouveau_ratelimit();
128
129 if (show) {
130 NV_INFO(dev, "PCRYPT_INTR: 0x%08x 0x%08x 0x%08x 0x%08x\n",
131 stat, mthd, data, inst);
132 }
133
134 nv_wr32(dev, 0x102130, stat);
135 nv_wr32(dev, 0x10200c, 0x10);
136
137 nv50_fb_vm_trap(dev, show);
138}
139
140static int
141nv84_crypt_fini(struct drm_device *dev, int engine)
142{
143 nv_wr32(dev, 0x102140, 0x00000000);
144 return 0;
145}
146
147static int
148nv84_crypt_init(struct drm_device *dev, int engine)
149{
150 nv_mask(dev, 0x000200, 0x00004000, 0x00000000);
151 nv_mask(dev, 0x000200, 0x00004000, 0x00004000);
152
153 nv_wr32(dev, 0x102130, 0xffffffff);
154 nv_wr32(dev, 0x102140, 0xffffffbf);
155
156 nv_wr32(dev, 0x10200c, 0x00000010);
157 return 0;
158}
159
160static void
161nv84_crypt_destroy(struct drm_device *dev, int engine)
162{
163 struct nv84_crypt_engine *pcrypt = nv_engine(dev, engine);
164
165 NVOBJ_ENGINE_DEL(dev, CRYPT);
166
167 nouveau_irq_unregister(dev, 14);
168 kfree(pcrypt);
169}
170
171int
172nv84_crypt_create(struct drm_device *dev)
173{
174 struct nv84_crypt_engine *pcrypt;
175
176 pcrypt = kzalloc(sizeof(*pcrypt), GFP_KERNEL);
177 if (!pcrypt)
178 return -ENOMEM;
179
180 pcrypt->base.destroy = nv84_crypt_destroy;
181 pcrypt->base.init = nv84_crypt_init;
182 pcrypt->base.fini = nv84_crypt_fini;
183 pcrypt->base.context_new = nv84_crypt_context_new;
184 pcrypt->base.context_del = nv84_crypt_context_del;
185 pcrypt->base.object_new = nv84_crypt_object_new;
186 pcrypt->base.tlb_flush = nv84_crypt_tlb_flush;
187
188 nouveau_irq_register(dev, 14, nv84_crypt_isr);
189
190 NVOBJ_ENGINE_ADD(dev, CRYPT, &pcrypt->base);
191 NVOBJ_CLASS (dev, 0x74c1, CRYPT);
192 return 0;
193}
diff --git a/drivers/gpu/drm/nouveau/nva3_copy.c b/drivers/gpu/drm/nouveau/nva3_copy.c
new file mode 100644
index 000000000000..b86820a61220
--- /dev/null
+++ b/drivers/gpu/drm/nouveau/nva3_copy.c
@@ -0,0 +1,226 @@
1/*
2 * Copyright 2011 Red Hat 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: Ben Skeggs
23 */
24
25#include <linux/firmware.h>
26#include "drmP.h"
27#include "nouveau_drv.h"
28#include "nouveau_util.h"
29#include "nouveau_vm.h"
30#include "nouveau_ramht.h"
31#include "nva3_copy.fuc.h"
32
33struct nva3_copy_engine {
34 struct nouveau_exec_engine base;
35};
36
37static int
38nva3_copy_context_new(struct nouveau_channel *chan, int engine)
39{
40 struct drm_device *dev = chan->dev;
41 struct drm_nouveau_private *dev_priv = dev->dev_private;
42 struct nouveau_gpuobj *ramin = chan->ramin;
43 struct nouveau_gpuobj *ctx = NULL;
44 int ret;
45
46 NV_DEBUG(dev, "ch%d\n", chan->id);
47
48 ret = nouveau_gpuobj_new(dev, chan, 256, 0, NVOBJ_FLAG_ZERO_ALLOC |
49 NVOBJ_FLAG_ZERO_FREE, &ctx);
50 if (ret)
51 return ret;
52
53 nv_wo32(ramin, 0xc0, 0x00190000);
54 nv_wo32(ramin, 0xc4, ctx->vinst + ctx->size - 1);
55 nv_wo32(ramin, 0xc8, ctx->vinst);
56 nv_wo32(ramin, 0xcc, 0x00000000);
57 nv_wo32(ramin, 0xd0, 0x00000000);
58 nv_wo32(ramin, 0xd4, 0x00000000);
59 dev_priv->engine.instmem.flush(dev);
60
61 atomic_inc(&chan->vm->engref[engine]);
62 chan->engctx[engine] = ctx;
63 return 0;
64}
65
66static int
67nva3_copy_object_new(struct nouveau_channel *chan, int engine,
68 u32 handle, u16 class)
69{
70 struct nouveau_gpuobj *ctx = chan->engctx[engine];
71
72 /* fuc engine doesn't need an object, our ramht code does.. */
73 ctx->engine = 3;
74 ctx->class = class;
75 return nouveau_ramht_insert(chan, handle, ctx);
76}
77
78static void
79nva3_copy_context_del(struct nouveau_channel *chan, int engine)
80{
81 struct nouveau_gpuobj *ctx = chan->engctx[engine];
82 struct drm_device *dev = chan->dev;
83 u32 inst;
84
85 inst = (chan->ramin->vinst >> 12);
86 inst |= 0x40000000;
87
88 /* disable fifo access */
89 nv_wr32(dev, 0x104048, 0x00000000);
90 /* mark channel as unloaded if it's currently active */
91 if (nv_rd32(dev, 0x104050) == inst)
92 nv_mask(dev, 0x104050, 0x40000000, 0x00000000);
93 /* mark next channel as invalid if it's about to be loaded */
94 if (nv_rd32(dev, 0x104054) == inst)
95 nv_mask(dev, 0x104054, 0x40000000, 0x00000000);
96 /* restore fifo access */
97 nv_wr32(dev, 0x104048, 0x00000003);
98
99 for (inst = 0xc0; inst <= 0xd4; inst += 4)
100 nv_wo32(chan->ramin, inst, 0x00000000);
101
102 nouveau_gpuobj_ref(NULL, &ctx);
103
104 atomic_dec(&chan->vm->engref[engine]);
105 chan->engctx[engine] = ctx;
106}
107
108static void
109nva3_copy_tlb_flush(struct drm_device *dev, int engine)
110{
111 nv50_vm_flush_engine(dev, 0x0d);
112}
113
114static int
115nva3_copy_init(struct drm_device *dev, int engine)
116{
117 int i;
118
119 nv_mask(dev, 0x000200, 0x00002000, 0x00000000);
120 nv_mask(dev, 0x000200, 0x00002000, 0x00002000);
121 nv_wr32(dev, 0x104014, 0xffffffff); /* disable all interrupts */
122
123 /* upload ucode */
124 nv_wr32(dev, 0x1041c0, 0x01000000);
125 for (i = 0; i < sizeof(nva3_pcopy_data) / 4; i++)
126 nv_wr32(dev, 0x1041c4, nva3_pcopy_data[i]);
127
128 nv_wr32(dev, 0x104180, 0x01000000);
129 for (i = 0; i < sizeof(nva3_pcopy_code) / 4; i++) {
130 if ((i & 0x3f) == 0)
131 nv_wr32(dev, 0x104188, i >> 6);
132 nv_wr32(dev, 0x104184, nva3_pcopy_code[i]);
133 }
134
135 /* start it running */
136 nv_wr32(dev, 0x10410c, 0x00000000);
137 nv_wr32(dev, 0x104104, 0x00000000); /* ENTRY */
138 nv_wr32(dev, 0x104100, 0x00000002); /* TRIGGER */
139 return 0;
140}
141
142static int
143nva3_copy_fini(struct drm_device *dev, int engine)
144{
145 nv_mask(dev, 0x104048, 0x00000003, 0x00000000);
146
147 /* trigger fuc context unload */
148 nv_wait(dev, 0x104008, 0x0000000c, 0x00000000);
149 nv_mask(dev, 0x104054, 0x40000000, 0x00000000);
150 nv_wr32(dev, 0x104000, 0x00000008);
151 nv_wait(dev, 0x104008, 0x00000008, 0x00000000);
152
153 nv_wr32(dev, 0x104014, 0xffffffff);
154 return 0;
155}
156
157static struct nouveau_enum nva3_copy_isr_error_name[] = {
158 { 0x0001, "ILLEGAL_MTHD" },
159 { 0x0002, "INVALID_ENUM" },
160 { 0x0003, "INVALID_BITFIELD" },
161 {}
162};
163
164static void
165nva3_copy_isr(struct drm_device *dev)
166{
167 u32 dispatch = nv_rd32(dev, 0x10401c);
168 u32 stat = nv_rd32(dev, 0x104008) & dispatch & ~(dispatch >> 16);
169 u32 inst = nv_rd32(dev, 0x104050) & 0x3fffffff;
170 u32 ssta = nv_rd32(dev, 0x104040) & 0x0000ffff;
171 u32 addr = nv_rd32(dev, 0x104040) >> 16;
172 u32 mthd = (addr & 0x07ff) << 2;
173 u32 subc = (addr & 0x3800) >> 11;
174 u32 data = nv_rd32(dev, 0x104044);
175 int chid = nv50_graph_isr_chid(dev, inst);
176
177 if (stat & 0x00000040) {
178 NV_INFO(dev, "PCOPY: DISPATCH_ERROR [");
179 nouveau_enum_print(nva3_copy_isr_error_name, ssta);
180 printk("] ch %d [0x%08x] subc %d mthd 0x%04x data 0x%08x\n",
181 chid, inst, subc, mthd, data);
182 nv_wr32(dev, 0x104004, 0x00000040);
183 stat &= ~0x00000040;
184 }
185
186 if (stat) {
187 NV_INFO(dev, "PCOPY: unhandled intr 0x%08x\n", stat);
188 nv_wr32(dev, 0x104004, stat);
189 }
190 nv50_fb_vm_trap(dev, 1);
191}
192
193static void
194nva3_copy_destroy(struct drm_device *dev, int engine)
195{
196 struct nva3_copy_engine *pcopy = nv_engine(dev, engine);
197
198 nouveau_irq_unregister(dev, 22);
199
200 NVOBJ_ENGINE_DEL(dev, COPY0);
201 kfree(pcopy);
202}
203
204int
205nva3_copy_create(struct drm_device *dev)
206{
207 struct nva3_copy_engine *pcopy;
208
209 pcopy = kzalloc(sizeof(*pcopy), GFP_KERNEL);
210 if (!pcopy)
211 return -ENOMEM;
212
213 pcopy->base.destroy = nva3_copy_destroy;
214 pcopy->base.init = nva3_copy_init;
215 pcopy->base.fini = nva3_copy_fini;
216 pcopy->base.context_new = nva3_copy_context_new;
217 pcopy->base.context_del = nva3_copy_context_del;
218 pcopy->base.object_new = nva3_copy_object_new;
219 pcopy->base.tlb_flush = nva3_copy_tlb_flush;
220
221 nouveau_irq_register(dev, 22, nva3_copy_isr);
222
223 NVOBJ_ENGINE_ADD(dev, COPY0, &pcopy->base);
224 NVOBJ_CLASS(dev, 0x85b5, COPY0);
225 return 0;
226}
diff --git a/drivers/gpu/drm/nouveau/nva3_copy.fuc b/drivers/gpu/drm/nouveau/nva3_copy.fuc
new file mode 100644
index 000000000000..eaf35f8321ee
--- /dev/null
+++ b/drivers/gpu/drm/nouveau/nva3_copy.fuc
@@ -0,0 +1,870 @@
1/* fuc microcode for copy engine on nva3- chipsets
2 *
3 * Copyright 2011 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 shall be included in
13 * all copies or substantial portions of the 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) OR AUTHOR(S) 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
21 * OTHER DEALINGS IN THE SOFTWARE.
22 *
23 * Authors: Ben Skeggs
24 */
25
26/* To build for nva3:nvc0
27 * m4 -DNVA3 nva3_copy.fuc | envyas -a -w -m fuc -V nva3 -o nva3_copy.fuc.h
28 *
29 * To build for nvc0-
30 * m4 -DNVC0 nva3_copy.fuc | envyas -a -w -m fuc -V nva3 -o nvc0_copy.fuc.h
31 */
32
33ifdef(`NVA3',
34.section nva3_pcopy_data,
35.section nvc0_pcopy_data
36)
37
38ctx_object: .b32 0
39ifdef(`NVA3',
40ctx_dma:
41ctx_dma_query: .b32 0
42ctx_dma_src: .b32 0
43ctx_dma_dst: .b32 0
44,)
45.equ ctx_dma_count 3
46ctx_query_address_high: .b32 0
47ctx_query_address_low: .b32 0
48ctx_query_counter: .b32 0
49ctx_src_address_high: .b32 0
50ctx_src_address_low: .b32 0
51ctx_src_pitch: .b32 0
52ctx_src_tile_mode: .b32 0
53ctx_src_xsize: .b32 0
54ctx_src_ysize: .b32 0
55ctx_src_zsize: .b32 0
56ctx_src_zoff: .b32 0
57ctx_src_xoff: .b32 0
58ctx_src_yoff: .b32 0
59ctx_src_cpp: .b32 0
60ctx_dst_address_high: .b32 0
61ctx_dst_address_low: .b32 0
62ctx_dst_pitch: .b32 0
63ctx_dst_tile_mode: .b32 0
64ctx_dst_xsize: .b32 0
65ctx_dst_ysize: .b32 0
66ctx_dst_zsize: .b32 0
67ctx_dst_zoff: .b32 0
68ctx_dst_xoff: .b32 0
69ctx_dst_yoff: .b32 0
70ctx_dst_cpp: .b32 0
71ctx_format: .b32 0
72ctx_swz_const0: .b32 0
73ctx_swz_const1: .b32 0
74ctx_xcnt: .b32 0
75ctx_ycnt: .b32 0
76.align 256
77
78dispatch_table:
79// mthd 0x0000, NAME
80.b16 0x000 1
81.b32 ctx_object ~0xffffffff
82// mthd 0x0100, NOP
83.b16 0x040 1
84.b32 0x00010000 + cmd_nop ~0xffffffff
85// mthd 0x0140, PM_TRIGGER
86.b16 0x050 1
87.b32 0x00010000 + cmd_pm_trigger ~0xffffffff
88ifdef(`NVA3', `
89// mthd 0x0180-0x018c, DMA_
90.b16 0x060 ctx_dma_count
91dispatch_dma:
92.b32 0x00010000 + cmd_dma ~0xffffffff
93.b32 0x00010000 + cmd_dma ~0xffffffff
94.b32 0x00010000 + cmd_dma ~0xffffffff
95',)
96// mthd 0x0200-0x0218, SRC_TILE
97.b16 0x80 7
98.b32 ctx_src_tile_mode ~0x00000fff
99.b32 ctx_src_xsize ~0x0007ffff
100.b32 ctx_src_ysize ~0x00001fff
101.b32 ctx_src_zsize ~0x000007ff
102.b32 ctx_src_zoff ~0x00000fff
103.b32 ctx_src_xoff ~0x0007ffff
104.b32 ctx_src_yoff ~0x00001fff
105// mthd 0x0220-0x0238, DST_TILE
106.b16 0x88 7
107.b32 ctx_dst_tile_mode ~0x00000fff
108.b32 ctx_dst_xsize ~0x0007ffff
109.b32 ctx_dst_ysize ~0x00001fff
110.b32 ctx_dst_zsize ~0x000007ff
111.b32 ctx_dst_zoff ~0x00000fff
112.b32 ctx_dst_xoff ~0x0007ffff
113.b32 ctx_dst_yoff ~0x00001fff
114// mthd 0x0300-0x0304, EXEC, WRCACHE_FLUSH
115.b16 0xc0 2
116.b32 0x00010000 + cmd_exec ~0xffffffff
117.b32 0x00010000 + cmd_wrcache_flush ~0xffffffff
118// mthd 0x030c-0x0340, various stuff
119.b16 0xc3 14
120.b32 ctx_src_address_high ~0x000000ff
121.b32 ctx_src_address_low ~0xfffffff0
122.b32 ctx_dst_address_high ~0x000000ff
123.b32 ctx_dst_address_low ~0xfffffff0
124.b32 ctx_src_pitch ~0x0007ffff
125.b32 ctx_dst_pitch ~0x0007ffff
126.b32 ctx_xcnt ~0x0000ffff
127.b32 ctx_ycnt ~0x00001fff
128.b32 ctx_format ~0x0333ffff
129.b32 ctx_swz_const0 ~0xffffffff
130.b32 ctx_swz_const1 ~0xffffffff
131.b32 ctx_query_address_high ~0x000000ff
132.b32 ctx_query_address_low ~0xffffffff
133.b32 ctx_query_counter ~0xffffffff
134.b16 0x800 0
135
136ifdef(`NVA3',
137.section nva3_pcopy_code,
138.section nvc0_pcopy_code
139)
140
141main:
142 clear b32 $r0
143 mov $sp $r0
144
145 // setup i0 handler and route fifo and ctxswitch to it
146 mov $r1 ih
147 mov $iv0 $r1
148 mov $r1 0x400
149 movw $r2 0xfff3
150 sethi $r2 0
151 iowr I[$r2 + 0x300] $r2
152
153 // enable interrupts
154 or $r2 0xc
155 iowr I[$r1] $r2
156 bset $flags ie0
157
158 // enable fifo access and context switching
159 mov $r1 0x1200
160 mov $r2 3
161 iowr I[$r1] $r2
162
163 // sleep forever, waking for interrupts
164 bset $flags $p0
165 spin:
166 sleep $p0
167 bra spin
168
169// i0 handler
170ih:
171 iord $r1 I[$r0 + 0x200]
172
173 and $r2 $r1 0x00000008
174 bra e ih_no_chsw
175 call chsw
176 ih_no_chsw:
177 and $r2 $r1 0x00000004
178 bra e ih_no_cmd
179 call dispatch
180
181 ih_no_cmd:
182 and $r1 $r1 0x0000000c
183 iowr I[$r0 + 0x100] $r1
184 iret
185
186// $p1 direction (0 = unload, 1 = load)
187// $r3 channel
188swctx:
189 mov $r4 0x7700
190 mov $xtargets $r4
191ifdef(`NVA3', `
192 // target 7 hardcoded to ctx dma object
193 mov $xdbase $r0
194', ` // NVC0
195 // read SCRATCH3 to decide if we are PCOPY0 or PCOPY1
196 mov $r4 0x2100
197 iord $r4 I[$r4 + 0]
198 and $r4 1
199 shl b32 $r4 4
200 add b32 $r4 0x30
201
202 // channel is in vram
203 mov $r15 0x61c
204 shl b32 $r15 6
205 mov $r5 0x114
206 iowrs I[$r15] $r5
207
208 // read 16-byte PCOPYn info, containing context pointer, from channel
209 shl b32 $r5 $r3 4
210 add b32 $r5 2
211 mov $xdbase $r5
212 mov $r5 $sp
213 // get a chunk of stack space, aligned to 256 byte boundary
214 sub b32 $r5 0x100
215 mov $r6 0xff
216 not b32 $r6
217 and $r5 $r6
218 sethi $r5 0x00020000
219 xdld $r4 $r5
220 xdwait
221 sethi $r5 0
222
223 // set context pointer, from within channel VM
224 mov $r14 0
225 iowrs I[$r15] $r14
226 ld b32 $r4 D[$r5 + 0]
227 shr b32 $r4 8
228 ld b32 $r6 D[$r5 + 4]
229 shl b32 $r6 24
230 or $r4 $r6
231 mov $xdbase $r4
232')
233 // 256-byte context, at start of data segment
234 mov b32 $r4 $r0
235 sethi $r4 0x60000
236
237 // swap!
238 bra $p1 swctx_load
239 xdst $r0 $r4
240 bra swctx_done
241 swctx_load:
242 xdld $r0 $r4
243 swctx_done:
244 xdwait
245 ret
246
247chsw:
248 // read current channel
249 mov $r2 0x1400
250 iord $r3 I[$r2]
251
252 // if it's active, unload it and return
253 xbit $r15 $r3 0x1e
254 bra e chsw_no_unload
255 bclr $flags $p1
256 call swctx
257 bclr $r3 0x1e
258 iowr I[$r2] $r3
259 mov $r4 1
260 iowr I[$r2 + 0x200] $r4
261 ret
262
263 // read next channel
264 chsw_no_unload:
265 iord $r3 I[$r2 + 0x100]
266
267 // is there a channel waiting to be loaded?
268 xbit $r13 $r3 0x1e
269 bra e chsw_finish_load
270 bset $flags $p1
271 call swctx
272ifdef(`NVA3',
273 // load dma objects back into TARGET regs
274 mov $r5 ctx_dma
275 mov $r6 ctx_dma_count
276 chsw_load_ctx_dma:
277 ld b32 $r7 D[$r5 + $r6 * 4]
278 add b32 $r8 $r6 0x180
279 shl b32 $r8 8
280 iowr I[$r8] $r7
281 sub b32 $r6 1
282 bra nc chsw_load_ctx_dma
283,)
284
285 chsw_finish_load:
286 mov $r3 2
287 iowr I[$r2 + 0x200] $r3
288 ret
289
290dispatch:
291 // read incoming fifo command
292 mov $r3 0x1900
293 iord $r2 I[$r3 + 0x100]
294 iord $r3 I[$r3 + 0x000]
295 and $r4 $r2 0x7ff
296 // $r2 will be used to store exception data
297 shl b32 $r2 0x10
298
299 // lookup method in the dispatch table, ILLEGAL_MTHD if not found
300 mov $r5 dispatch_table
301 clear b32 $r6
302 clear b32 $r7
303 dispatch_loop:
304 ld b16 $r6 D[$r5 + 0]
305 ld b16 $r7 D[$r5 + 2]
306 add b32 $r5 4
307 cmpu b32 $r4 $r6
308 bra c dispatch_illegal_mthd
309 add b32 $r7 $r6
310 cmpu b32 $r4 $r7
311 bra c dispatch_valid_mthd
312 sub b32 $r7 $r6
313 shl b32 $r7 3
314 add b32 $r5 $r7
315 bra dispatch_loop
316
317 // ensure no bits set in reserved fields, INVALID_BITFIELD
318 dispatch_valid_mthd:
319 sub b32 $r4 $r6
320 shl b32 $r4 3
321 add b32 $r4 $r5
322 ld b32 $r5 D[$r4 + 4]
323 and $r5 $r3
324 cmpu b32 $r5 0
325 bra ne dispatch_invalid_bitfield
326
327 // depending on dispatch flags: execute method, or save data as state
328 ld b16 $r5 D[$r4 + 0]
329 ld b16 $r6 D[$r4 + 2]
330 cmpu b32 $r6 0
331 bra ne dispatch_cmd
332 st b32 D[$r5] $r3
333 bra dispatch_done
334 dispatch_cmd:
335 bclr $flags $p1
336 call $r5
337 bra $p1 dispatch_error
338 bra dispatch_done
339
340 dispatch_invalid_bitfield:
341 or $r2 2
342 dispatch_illegal_mthd:
343 or $r2 1
344
345 // store exception data in SCRATCH0/SCRATCH1, signal hostirq
346 dispatch_error:
347 mov $r4 0x1000
348 iowr I[$r4 + 0x000] $r2
349 iowr I[$r4 + 0x100] $r3
350 mov $r2 0x40
351 iowr I[$r0] $r2
352 hostirq_wait:
353 iord $r2 I[$r0 + 0x200]
354 and $r2 0x40
355 cmpu b32 $r2 0
356 bra ne hostirq_wait
357
358 dispatch_done:
359 mov $r2 0x1d00
360 mov $r3 1
361 iowr I[$r2] $r3
362 ret
363
364// No-operation
365//
366// Inputs:
367// $r1: irqh state
368// $r2: hostirq state
369// $r3: data
370// $r4: dispatch table entry
371// Outputs:
372// $r1: irqh state
373// $p1: set on error
374// $r2: hostirq state
375// $r3: data
376cmd_nop:
377 ret
378
379// PM_TRIGGER
380//
381// Inputs:
382// $r1: irqh state
383// $r2: hostirq state
384// $r3: data
385// $r4: dispatch table entry
386// Outputs:
387// $r1: irqh state
388// $p1: set on error
389// $r2: hostirq state
390// $r3: data
391cmd_pm_trigger:
392 mov $r2 0x2200
393 clear b32 $r3
394 sethi $r3 0x20000
395 iowr I[$r2] $r3
396 ret
397
398ifdef(`NVA3',
399// SET_DMA_* method handler
400//
401// Inputs:
402// $r1: irqh state
403// $r2: hostirq state
404// $r3: data
405// $r4: dispatch table entry
406// Outputs:
407// $r1: irqh state
408// $p1: set on error
409// $r2: hostirq state
410// $r3: data
411cmd_dma:
412 sub b32 $r4 dispatch_dma
413 shr b32 $r4 1
414 bset $r3 0x1e
415 st b32 D[$r4 + ctx_dma] $r3
416 add b32 $r4 0x600
417 shl b32 $r4 6
418 iowr I[$r4] $r3
419 ret
420,)
421
422// Calculates the hw swizzle mask and adjusts the surface's xcnt to match
423//
424cmd_exec_set_format:
425 // zero out a chunk of the stack to store the swizzle into
426 add $sp -0x10
427 st b32 D[$sp + 0x00] $r0
428 st b32 D[$sp + 0x04] $r0
429 st b32 D[$sp + 0x08] $r0
430 st b32 D[$sp + 0x0c] $r0
431
432 // extract cpp, src_ncomp and dst_ncomp from FORMAT
433 ld b32 $r4 D[$r0 + ctx_format]
434 extr $r5 $r4 16:17
435 add b32 $r5 1
436 extr $r6 $r4 20:21
437 add b32 $r6 1
438 extr $r7 $r4 24:25
439 add b32 $r7 1
440
441 // convert FORMAT swizzle mask to hw swizzle mask
442 bclr $flags $p2
443 clear b32 $r8
444 clear b32 $r9
445 ncomp_loop:
446 and $r10 $r4 0xf
447 shr b32 $r4 4
448 clear b32 $r11
449 bpc_loop:
450 cmpu b8 $r10 4
451 bra nc cmp_c0
452 mulu $r12 $r10 $r5
453 add b32 $r12 $r11
454 bset $flags $p2
455 bra bpc_next
456 cmp_c0:
457 bra ne cmp_c1
458 mov $r12 0x10
459 add b32 $r12 $r11
460 bra bpc_next
461 cmp_c1:
462 cmpu b8 $r10 6
463 bra nc cmp_zero
464 mov $r12 0x14
465 add b32 $r12 $r11
466 bra bpc_next
467 cmp_zero:
468 mov $r12 0x80
469 bpc_next:
470 st b8 D[$sp + $r8] $r12
471 add b32 $r8 1
472 add b32 $r11 1
473 cmpu b32 $r11 $r5
474 bra c bpc_loop
475 add b32 $r9 1
476 cmpu b32 $r9 $r7
477 bra c ncomp_loop
478
479 // SRC_XCNT = (xcnt * src_cpp), or 0 if no src ref in swz (hw will hang)
480 mulu $r6 $r5
481 st b32 D[$r0 + ctx_src_cpp] $r6
482 ld b32 $r8 D[$r0 + ctx_xcnt]
483 mulu $r6 $r8
484 bra $p2 dst_xcnt
485 clear b32 $r6
486
487 dst_xcnt:
488 mulu $r7 $r5
489 st b32 D[$r0 + ctx_dst_cpp] $r7
490 mulu $r7 $r8
491
492 mov $r5 0x810
493 shl b32 $r5 6
494 iowr I[$r5 + 0x000] $r6
495 iowr I[$r5 + 0x100] $r7
496 add b32 $r5 0x800
497 ld b32 $r6 D[$r0 + ctx_dst_cpp]
498 sub b32 $r6 1
499 shl b32 $r6 8
500 ld b32 $r7 D[$r0 + ctx_src_cpp]
501 sub b32 $r7 1
502 or $r6 $r7
503 iowr I[$r5 + 0x000] $r6
504 add b32 $r5 0x100
505 ld b32 $r6 D[$sp + 0x00]
506 iowr I[$r5 + 0x000] $r6
507 ld b32 $r6 D[$sp + 0x04]
508 iowr I[$r5 + 0x100] $r6
509 ld b32 $r6 D[$sp + 0x08]
510 iowr I[$r5 + 0x200] $r6
511 ld b32 $r6 D[$sp + 0x0c]
512 iowr I[$r5 + 0x300] $r6
513 add b32 $r5 0x400
514 ld b32 $r6 D[$r0 + ctx_swz_const0]
515 iowr I[$r5 + 0x000] $r6
516 ld b32 $r6 D[$r0 + ctx_swz_const1]
517 iowr I[$r5 + 0x100] $r6
518 add $sp 0x10
519 ret
520
521// Setup to handle a tiled surface
522//
523// Calculates a number of parameters the hardware requires in order
524// to correctly handle tiling.
525//
526// Offset calculation is performed as follows (Tp/Th/Td from TILE_MODE):
527// nTx = round_up(w * cpp, 1 << Tp) >> Tp
528// nTy = round_up(h, 1 << Th) >> Th
529// Txo = (x * cpp) & ((1 << Tp) - 1)
530// Tx = (x * cpp) >> Tp
531// Tyo = y & ((1 << Th) - 1)
532// Ty = y >> Th
533// Tzo = z & ((1 << Td) - 1)
534// Tz = z >> Td
535//
536// off = (Tzo << Tp << Th) + (Tyo << Tp) + Txo
537// off += ((Tz * nTy * nTx)) + (Ty * nTx) + Tx) << Td << Th << Tp;
538//
539// Inputs:
540// $r4: hw command (0x104800)
541// $r5: ctx offset adjustment for src/dst selection
542// $p2: set if dst surface
543//
544cmd_exec_set_surface_tiled:
545 // translate TILE_MODE into Tp, Th, Td shift values
546 ld b32 $r7 D[$r5 + ctx_src_tile_mode]
547 extr $r9 $r7 8:11
548 extr $r8 $r7 4:7
549ifdef(`NVA3',
550 add b32 $r8 2
551,
552 add b32 $r8 3
553)
554 extr $r7 $r7 0:3
555 cmp b32 $r7 0xe
556 bra ne xtile64
557 mov $r7 4
558 bra xtileok
559 xtile64:
560 xbit $r7 $flags $p2
561 add b32 $r7 17
562 bset $r4 $r7
563 mov $r7 6
564 xtileok:
565
566 // Op = (x * cpp) & ((1 << Tp) - 1)
567 // Tx = (x * cpp) >> Tp
568 ld b32 $r10 D[$r5 + ctx_src_xoff]
569 ld b32 $r11 D[$r5 + ctx_src_cpp]
570 mulu $r10 $r11
571 mov $r11 1
572 shl b32 $r11 $r7
573 sub b32 $r11 1
574 and $r12 $r10 $r11
575 shr b32 $r10 $r7
576
577 // Tyo = y & ((1 << Th) - 1)
578 // Ty = y >> Th
579 ld b32 $r13 D[$r5 + ctx_src_yoff]
580 mov $r14 1
581 shl b32 $r14 $r8
582 sub b32 $r14 1
583 and $r11 $r13 $r14
584 shr b32 $r13 $r8
585
586 // YTILE = ((1 << Th) << 12) | ((1 << Th) - Tyo)
587 add b32 $r14 1
588 shl b32 $r15 $r14 12
589 sub b32 $r14 $r11
590 or $r15 $r14
591 xbit $r6 $flags $p2
592 add b32 $r6 0x208
593 shl b32 $r6 8
594 iowr I[$r6 + 0x000] $r15
595
596 // Op += Tyo << Tp
597 shl b32 $r11 $r7
598 add b32 $r12 $r11
599
600 // nTx = ((w * cpp) + ((1 << Tp) - 1) >> Tp)
601 ld b32 $r15 D[$r5 + ctx_src_xsize]
602 ld b32 $r11 D[$r5 + ctx_src_cpp]
603 mulu $r15 $r11
604 mov $r11 1
605 shl b32 $r11 $r7
606 sub b32 $r11 1
607 add b32 $r15 $r11
608 shr b32 $r15 $r7
609 push $r15
610
611 // nTy = (h + ((1 << Th) - 1)) >> Th
612 ld b32 $r15 D[$r5 + ctx_src_ysize]
613 mov $r11 1
614 shl b32 $r11 $r8
615 sub b32 $r11 1
616 add b32 $r15 $r11
617 shr b32 $r15 $r8
618 push $r15
619
620 // Tys = Tp + Th
621 // CFG_YZ_TILE_SIZE = ((1 << Th) >> 2) << Td
622 add b32 $r7 $r8
623 sub b32 $r8 2
624 mov $r11 1
625 shl b32 $r11 $r8
626 shl b32 $r11 $r9
627
628 // Tzo = z & ((1 << Td) - 1)
629 // Tz = z >> Td
630 // Op += Tzo << Tys
631 // Ts = Tys + Td
632 ld b32 $r8 D[$r5 + ctx_src_zoff]
633 mov $r14 1
634 shl b32 $r14 $r9
635 sub b32 $r14 1
636 and $r15 $r8 $r14
637 shl b32 $r15 $r7
638 add b32 $r12 $r15
639 add b32 $r7 $r9
640 shr b32 $r8 $r9
641
642 // Ot = ((Tz * nTy * nTx) + (Ty * nTx) + Tx) << Ts
643 pop $r15
644 pop $r9
645 mulu $r13 $r9
646 add b32 $r10 $r13
647 mulu $r8 $r9
648 mulu $r8 $r15
649 add b32 $r10 $r8
650 shl b32 $r10 $r7
651
652 // PITCH = (nTx - 1) << Ts
653 sub b32 $r9 1
654 shl b32 $r9 $r7
655 iowr I[$r6 + 0x200] $r9
656
657 // SRC_ADDRESS_LOW = (Ot + Op) & 0xffffffff
658 // CFG_ADDRESS_HIGH |= ((Ot + Op) >> 32) << 16
659 ld b32 $r7 D[$r5 + ctx_src_address_low]
660 ld b32 $r8 D[$r5 + ctx_src_address_high]
661 add b32 $r10 $r12
662 add b32 $r7 $r10
663 adc b32 $r8 0
664 shl b32 $r8 16
665 or $r8 $r11
666 sub b32 $r6 0x600
667 iowr I[$r6 + 0x000] $r7
668 add b32 $r6 0x400
669 iowr I[$r6 + 0x000] $r8
670 ret
671
672// Setup to handle a linear surface
673//
674// Nothing to see here.. Sets ADDRESS and PITCH, pretty non-exciting
675//
676cmd_exec_set_surface_linear:
677 xbit $r6 $flags $p2
678 add b32 $r6 0x202
679 shl b32 $r6 8
680 ld b32 $r7 D[$r5 + ctx_src_address_low]
681 iowr I[$r6 + 0x000] $r7
682 add b32 $r6 0x400
683 ld b32 $r7 D[$r5 + ctx_src_address_high]
684 shl b32 $r7 16
685 iowr I[$r6 + 0x000] $r7
686 add b32 $r6 0x400
687 ld b32 $r7 D[$r5 + ctx_src_pitch]
688 iowr I[$r6 + 0x000] $r7
689 ret
690
691// wait for regs to be available for use
692cmd_exec_wait:
693 push $r0
694 push $r1
695 mov $r0 0x800
696 shl b32 $r0 6
697 loop:
698 iord $r1 I[$r0]
699 and $r1 1
700 bra ne loop
701 pop $r1
702 pop $r0
703 ret
704
705cmd_exec_query:
706 // if QUERY_SHORT not set, write out { -, 0, TIME_LO, TIME_HI }
707 xbit $r4 $r3 13
708 bra ne query_counter
709 call cmd_exec_wait
710 mov $r4 0x80c
711 shl b32 $r4 6
712 ld b32 $r5 D[$r0 + ctx_query_address_low]
713 add b32 $r5 4
714 iowr I[$r4 + 0x000] $r5
715 iowr I[$r4 + 0x100] $r0
716 mov $r5 0xc
717 iowr I[$r4 + 0x200] $r5
718 add b32 $r4 0x400
719 ld b32 $r5 D[$r0 + ctx_query_address_high]
720 shl b32 $r5 16
721 iowr I[$r4 + 0x000] $r5
722 add b32 $r4 0x500
723 mov $r5 0x00000b00
724 sethi $r5 0x00010000
725 iowr I[$r4 + 0x000] $r5
726 mov $r5 0x00004040
727 shl b32 $r5 1
728 sethi $r5 0x80800000
729 iowr I[$r4 + 0x100] $r5
730 mov $r5 0x00001110
731 sethi $r5 0x13120000
732 iowr I[$r4 + 0x200] $r5
733 mov $r5 0x00001514
734 sethi $r5 0x17160000
735 iowr I[$r4 + 0x300] $r5
736 mov $r5 0x00002601
737 sethi $r5 0x00010000
738 mov $r4 0x800
739 shl b32 $r4 6
740 iowr I[$r4 + 0x000] $r5
741
742 // write COUNTER
743 query_counter:
744 call cmd_exec_wait
745 mov $r4 0x80c
746 shl b32 $r4 6
747 ld b32 $r5 D[$r0 + ctx_query_address_low]
748 iowr I[$r4 + 0x000] $r5
749 iowr I[$r4 + 0x100] $r0
750 mov $r5 0x4
751 iowr I[$r4 + 0x200] $r5
752 add b32 $r4 0x400
753 ld b32 $r5 D[$r0 + ctx_query_address_high]
754 shl b32 $r5 16
755 iowr I[$r4 + 0x000] $r5
756 add b32 $r4 0x500
757 mov $r5 0x00000300
758 iowr I[$r4 + 0x000] $r5
759 mov $r5 0x00001110
760 sethi $r5 0x13120000
761 iowr I[$r4 + 0x100] $r5
762 ld b32 $r5 D[$r0 + ctx_query_counter]
763 add b32 $r4 0x500
764 iowr I[$r4 + 0x000] $r5
765 mov $r5 0x00002601
766 sethi $r5 0x00010000
767 mov $r4 0x800
768 shl b32 $r4 6
769 iowr I[$r4 + 0x000] $r5
770 ret
771
772// Execute a copy operation
773//
774// Inputs:
775// $r1: irqh state
776// $r2: hostirq state
777// $r3: data
778// 000002000 QUERY_SHORT
779// 000001000 QUERY
780// 000000100 DST_LINEAR
781// 000000010 SRC_LINEAR
782// 000000001 FORMAT
783// $r4: dispatch table entry
784// Outputs:
785// $r1: irqh state
786// $p1: set on error
787// $r2: hostirq state
788// $r3: data
789cmd_exec:
790 call cmd_exec_wait
791
792 // if format requested, call function to calculate it, otherwise
793 // fill in cpp/xcnt for both surfaces as if (cpp == 1)
794 xbit $r15 $r3 0
795 bra e cmd_exec_no_format
796 call cmd_exec_set_format
797 mov $r4 0x200
798 bra cmd_exec_init_src_surface
799 cmd_exec_no_format:
800 mov $r6 0x810
801 shl b32 $r6 6
802 mov $r7 1
803 st b32 D[$r0 + ctx_src_cpp] $r7
804 st b32 D[$r0 + ctx_dst_cpp] $r7
805 ld b32 $r7 D[$r0 + ctx_xcnt]
806 iowr I[$r6 + 0x000] $r7
807 iowr I[$r6 + 0x100] $r7
808 clear b32 $r4
809
810 cmd_exec_init_src_surface:
811 bclr $flags $p2
812 clear b32 $r5
813 xbit $r15 $r3 4
814 bra e src_tiled
815 call cmd_exec_set_surface_linear
816 bra cmd_exec_init_dst_surface
817 src_tiled:
818 call cmd_exec_set_surface_tiled
819 bset $r4 7
820
821 cmd_exec_init_dst_surface:
822 bset $flags $p2
823 mov $r5 ctx_dst_address_high - ctx_src_address_high
824 xbit $r15 $r3 8
825 bra e dst_tiled
826 call cmd_exec_set_surface_linear
827 bra cmd_exec_kick
828 dst_tiled:
829 call cmd_exec_set_surface_tiled
830 bset $r4 8
831
832 cmd_exec_kick:
833 mov $r5 0x800
834 shl b32 $r5 6
835 ld b32 $r6 D[$r0 + ctx_ycnt]
836 iowr I[$r5 + 0x100] $r6
837 mov $r6 0x0041
838 // SRC_TARGET = 1, DST_TARGET = 2
839 sethi $r6 0x44000000
840 or $r4 $r6
841 iowr I[$r5] $r4
842
843 // if requested, queue up a QUERY write after the copy has completed
844 xbit $r15 $r3 12
845 bra e cmd_exec_done
846 call cmd_exec_query
847
848 cmd_exec_done:
849 ret
850
851// Flush write cache
852//
853// Inputs:
854// $r1: irqh state
855// $r2: hostirq state
856// $r3: data
857// $r4: dispatch table entry
858// Outputs:
859// $r1: irqh state
860// $p1: set on error
861// $r2: hostirq state
862// $r3: data
863cmd_wrcache_flush:
864 mov $r2 0x2200
865 clear b32 $r3
866 sethi $r3 0x10000
867 iowr I[$r2] $r3
868 ret
869
870.align 0x100
diff --git a/drivers/gpu/drm/nouveau/nva3_copy.fuc.h b/drivers/gpu/drm/nouveau/nva3_copy.fuc.h
new file mode 100644
index 000000000000..2731de22ebe9
--- /dev/null
+++ b/drivers/gpu/drm/nouveau/nva3_copy.fuc.h
@@ -0,0 +1,534 @@
1uint32_t nva3_pcopy_data[] = {
2 0x00000000,
3 0x00000000,
4 0x00000000,
5 0x00000000,
6 0x00000000,
7 0x00000000,
8 0x00000000,
9 0x00000000,
10 0x00000000,
11 0x00000000,
12 0x00000000,
13 0x00000000,
14 0x00000000,
15 0x00000000,
16 0x00000000,
17 0x00000000,
18 0x00000000,
19 0x00000000,
20 0x00000000,
21 0x00000000,
22 0x00000000,
23 0x00000000,
24 0x00000000,
25 0x00000000,
26 0x00000000,
27 0x00000000,
28 0x00000000,
29 0x00000000,
30 0x00000000,
31 0x00000000,
32 0x00000000,
33 0x00000000,
34 0x00000000,
35 0x00000000,
36 0x00000000,
37 0x00000000,
38 0x00000000,
39 0x00000000,
40 0x00000000,
41 0x00000000,
42 0x00000000,
43 0x00000000,
44 0x00000000,
45 0x00000000,
46 0x00000000,
47 0x00000000,
48 0x00000000,
49 0x00000000,
50 0x00000000,
51 0x00000000,
52 0x00000000,
53 0x00000000,
54 0x00000000,
55 0x00000000,
56 0x00000000,
57 0x00000000,
58 0x00000000,
59 0x00000000,
60 0x00000000,
61 0x00000000,
62 0x00000000,
63 0x00000000,
64 0x00000000,
65 0x00000000,
66 0x00010000,
67 0x00000000,
68 0x00000000,
69 0x00010040,
70 0x00010160,
71 0x00000000,
72 0x00010050,
73 0x00010162,
74 0x00000000,
75 0x00030060,
76 0x00010170,
77 0x00000000,
78 0x00010170,
79 0x00000000,
80 0x00010170,
81 0x00000000,
82 0x00070080,
83 0x00000028,
84 0xfffff000,
85 0x0000002c,
86 0xfff80000,
87 0x00000030,
88 0xffffe000,
89 0x00000034,
90 0xfffff800,
91 0x00000038,
92 0xfffff000,
93 0x0000003c,
94 0xfff80000,
95 0x00000040,
96 0xffffe000,
97 0x00070088,
98 0x00000054,
99 0xfffff000,
100 0x00000058,
101 0xfff80000,
102 0x0000005c,
103 0xffffe000,
104 0x00000060,
105 0xfffff800,
106 0x00000064,
107 0xfffff000,
108 0x00000068,
109 0xfff80000,
110 0x0000006c,
111 0xffffe000,
112 0x000200c0,
113 0x00010492,
114 0x00000000,
115 0x0001051b,
116 0x00000000,
117 0x000e00c3,
118 0x0000001c,
119 0xffffff00,
120 0x00000020,
121 0x0000000f,
122 0x00000048,
123 0xffffff00,
124 0x0000004c,
125 0x0000000f,
126 0x00000024,
127 0xfff80000,
128 0x00000050,
129 0xfff80000,
130 0x00000080,
131 0xffff0000,
132 0x00000084,
133 0xffffe000,
134 0x00000074,
135 0xfccc0000,
136 0x00000078,
137 0x00000000,
138 0x0000007c,
139 0x00000000,
140 0x00000010,
141 0xffffff00,
142 0x00000014,
143 0x00000000,
144 0x00000018,
145 0x00000000,
146 0x00000800,
147};
148
149uint32_t nva3_pcopy_code[] = {
150 0x04fe04bd,
151 0x3517f000,
152 0xf10010fe,
153 0xf1040017,
154 0xf0fff327,
155 0x22d00023,
156 0x0c25f0c0,
157 0xf40012d0,
158 0x17f11031,
159 0x27f01200,
160 0x0012d003,
161 0xf40031f4,
162 0x0ef40028,
163 0x8001cffd,
164 0xf40812c4,
165 0x21f4060b,
166 0x0412c472,
167 0xf4060bf4,
168 0x11c4c321,
169 0x4001d00c,
170 0x47f101f8,
171 0x4bfe7700,
172 0x0007fe00,
173 0xf00204b9,
174 0x01f40643,
175 0x0604fa09,
176 0xfa060ef4,
177 0x03f80504,
178 0x27f100f8,
179 0x23cf1400,
180 0x1e3fc800,
181 0xf4170bf4,
182 0x21f40132,
183 0x1e3af052,
184 0xf00023d0,
185 0x24d00147,
186 0xcf00f880,
187 0x3dc84023,
188 0x220bf41e,
189 0xf40131f4,
190 0x57f05221,
191 0x0367f004,
192 0xa07856bc,
193 0xb6018068,
194 0x87d00884,
195 0x0162b600,
196 0xf0f018f4,
197 0x23d00237,
198 0xf100f880,
199 0xcf190037,
200 0x33cf4032,
201 0xff24e400,
202 0x1024b607,
203 0x010057f1,
204 0x74bd64bd,
205 0x58005658,
206 0x50b60157,
207 0x0446b804,
208 0xbb4d08f4,
209 0x47b80076,
210 0x0f08f404,
211 0xb60276bb,
212 0x57bb0374,
213 0xdf0ef400,
214 0xb60246bb,
215 0x45bb0344,
216 0x01459800,
217 0xb00453fd,
218 0x1bf40054,
219 0x00455820,
220 0xb0014658,
221 0x1bf40064,
222 0x00538009,
223 0xf4300ef4,
224 0x55f90132,
225 0xf40c01f4,
226 0x25f0250e,
227 0x0125f002,
228 0x100047f1,
229 0xd00042d0,
230 0x27f04043,
231 0x0002d040,
232 0xf08002cf,
233 0x24b04024,
234 0xf71bf400,
235 0x1d0027f1,
236 0xd00137f0,
237 0x00f80023,
238 0x27f100f8,
239 0x34bd2200,
240 0xd00233f0,
241 0x00f80023,
242 0x012842b7,
243 0xf00145b6,
244 0x43801e39,
245 0x0040b701,
246 0x0644b606,
247 0xf80043d0,
248 0xf030f400,
249 0xb00001b0,
250 0x01b00101,
251 0x0301b002,
252 0xc71d0498,
253 0x50b63045,
254 0x3446c701,
255 0xc70160b6,
256 0x70b63847,
257 0x0232f401,
258 0x94bd84bd,
259 0xb60f4ac4,
260 0xb4bd0445,
261 0xf404a430,
262 0xa5ff0f18,
263 0x00cbbbc0,
264 0xf40231f4,
265 0x1bf4220e,
266 0x10c7f00c,
267 0xf400cbbb,
268 0xa430160e,
269 0x0c18f406,
270 0xbb14c7f0,
271 0x0ef400cb,
272 0x80c7f107,
273 0x01c83800,
274 0xb60180b6,
275 0xb5b801b0,
276 0xc308f404,
277 0xb80190b6,
278 0x08f40497,
279 0x0065fdb2,
280 0x98110680,
281 0x68fd2008,
282 0x0502f400,
283 0x75fd64bd,
284 0x1c078000,
285 0xf10078fd,
286 0xb6081057,
287 0x56d00654,
288 0x4057d000,
289 0x080050b7,
290 0xb61c0698,
291 0x64b60162,
292 0x11079808,
293 0xfd0172b6,
294 0x56d00567,
295 0x0050b700,
296 0x0060b401,
297 0xb40056d0,
298 0x56d00160,
299 0x0260b440,
300 0xb48056d0,
301 0x56d00360,
302 0x0050b7c0,
303 0x1e069804,
304 0x980056d0,
305 0x56d01f06,
306 0x1030f440,
307 0x579800f8,
308 0x6879c70a,
309 0xb66478c7,
310 0x77c70280,
311 0x0e76b060,
312 0xf0091bf4,
313 0x0ef40477,
314 0x027cf00f,
315 0xfd1170b6,
316 0x77f00947,
317 0x0f5a9806,
318 0xfd115b98,
319 0xb7f000ab,
320 0x04b7bb01,
321 0xff01b2b6,
322 0xa7bbc4ab,
323 0x105d9805,
324 0xbb01e7f0,
325 0xe2b604e8,
326 0xb4deff01,
327 0xb605d8bb,
328 0xef9401e0,
329 0x02ebbb0c,
330 0xf005fefd,
331 0x60b7026c,
332 0x64b60208,
333 0x006fd008,
334 0xbb04b7bb,
335 0x5f9800cb,
336 0x115b980b,
337 0xf000fbfd,
338 0xb7bb01b7,
339 0x01b2b604,
340 0xbb00fbbb,
341 0xf0f905f7,
342 0xf00c5f98,
343 0xb8bb01b7,
344 0x01b2b604,
345 0xbb00fbbb,
346 0xf0f905f8,
347 0xb60078bb,
348 0xb7f00282,
349 0x04b8bb01,
350 0x9804b9bb,
351 0xe7f00e58,
352 0x04e9bb01,
353 0xff01e2b6,
354 0xf7bbf48e,
355 0x00cfbb04,
356 0xbb0079bb,
357 0xf0fc0589,
358 0xd9fd90fc,
359 0x00adbb00,
360 0xfd0089fd,
361 0xa8bb008f,
362 0x04a7bb00,
363 0xbb0192b6,
364 0x69d00497,
365 0x08579880,
366 0xbb075898,
367 0x7abb00ac,
368 0x0081b600,
369 0xfd1084b6,
370 0x62b7058b,
371 0x67d00600,
372 0x0060b700,
373 0x0068d004,
374 0x6cf000f8,
375 0x0260b702,
376 0x0864b602,
377 0xd0085798,
378 0x60b70067,
379 0x57980400,
380 0x1074b607,
381 0xb70067d0,
382 0x98040060,
383 0x67d00957,
384 0xf900f800,
385 0xf110f900,
386 0xb6080007,
387 0x01cf0604,
388 0x0114f000,
389 0xfcfa1bf4,
390 0xf800fc10,
391 0x0d34c800,
392 0xf5701bf4,
393 0xf103ab21,
394 0xb6080c47,
395 0x05980644,
396 0x0450b605,
397 0xd00045d0,
398 0x57f04040,
399 0x8045d00c,
400 0x040040b7,
401 0xb6040598,
402 0x45d01054,
403 0x0040b700,
404 0x0057f105,
405 0x0153f00b,
406 0xf10045d0,
407 0xb6404057,
408 0x53f10154,
409 0x45d08080,
410 0x1057f140,
411 0x1253f111,
412 0x8045d013,
413 0x151457f1,
414 0x171653f1,
415 0xf1c045d0,
416 0xf0260157,
417 0x47f10153,
418 0x44b60800,
419 0x0045d006,
420 0x03ab21f5,
421 0x080c47f1,
422 0x980644b6,
423 0x45d00505,
424 0x4040d000,
425 0xd00457f0,
426 0x40b78045,
427 0x05980400,
428 0x1054b604,
429 0xb70045d0,
430 0xf1050040,
431 0xd0030057,
432 0x57f10045,
433 0x53f11110,
434 0x45d01312,
435 0x06059840,
436 0x050040b7,
437 0xf10045d0,
438 0xf0260157,
439 0x47f10153,
440 0x44b60800,
441 0x0045d006,
442 0x21f500f8,
443 0x3fc803ab,
444 0x0e0bf400,
445 0x018921f5,
446 0x020047f1,
447 0xf11e0ef4,
448 0xb6081067,
449 0x77f00664,
450 0x11078001,
451 0x981c0780,
452 0x67d02007,
453 0x4067d000,
454 0x32f444bd,
455 0xc854bd02,
456 0x0bf4043f,
457 0x8221f50a,
458 0x0a0ef403,
459 0x027621f5,
460 0xf40749f0,
461 0x57f00231,
462 0x083fc82c,
463 0xf50a0bf4,
464 0xf4038221,
465 0x21f50a0e,
466 0x49f00276,
467 0x0057f108,
468 0x0654b608,
469 0xd0210698,
470 0x67f04056,
471 0x0063f141,
472 0x0546fd44,
473 0xc80054d0,
474 0x0bf40c3f,
475 0xc521f507,
476 0xf100f803,
477 0xbd220027,
478 0x0133f034,
479 0xf80023d0,
480 0x00000000,
481 0x00000000,
482 0x00000000,
483 0x00000000,
484 0x00000000,
485 0x00000000,
486 0x00000000,
487 0x00000000,
488 0x00000000,
489 0x00000000,
490 0x00000000,
491 0x00000000,
492 0x00000000,
493 0x00000000,
494 0x00000000,
495 0x00000000,
496 0x00000000,
497 0x00000000,
498 0x00000000,
499 0x00000000,
500 0x00000000,
501 0x00000000,
502 0x00000000,
503 0x00000000,
504 0x00000000,
505 0x00000000,
506 0x00000000,
507 0x00000000,
508 0x00000000,
509 0x00000000,
510 0x00000000,
511 0x00000000,
512 0x00000000,
513 0x00000000,
514 0x00000000,
515 0x00000000,
516 0x00000000,
517 0x00000000,
518 0x00000000,
519 0x00000000,
520 0x00000000,
521 0x00000000,
522 0x00000000,
523 0x00000000,
524 0x00000000,
525 0x00000000,
526 0x00000000,
527 0x00000000,
528 0x00000000,
529 0x00000000,
530 0x00000000,
531 0x00000000,
532 0x00000000,
533 0x00000000,
534};
diff --git a/drivers/gpu/drm/nouveau/nva3_pm.c b/drivers/gpu/drm/nouveau/nva3_pm.c
new file mode 100644
index 000000000000..e4b2b9e934b2
--- /dev/null
+++ b/drivers/gpu/drm/nouveau/nva3_pm.c
@@ -0,0 +1,204 @@
1/*
2 * Copyright 2010 Red Hat 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: Ben Skeggs
23 */
24
25#include "drmP.h"
26#include "nouveau_drv.h"
27#include "nouveau_bios.h"
28#include "nouveau_pm.h"
29
30/* This is actually a lot more complex than it appears here, but hopefully
31 * this should be able to deal with what the VBIOS leaves for us..
32 *
33 * If not, well, I'll jump off that bridge when I come to it.
34 */
35
36struct nva3_pm_state {
37 enum pll_types type;
38 u32 src0;
39 u32 src1;
40 u32 ctrl;
41 u32 coef;
42 u32 old_pnm;
43 u32 new_pnm;
44 u32 new_div;
45};
46
47static int
48nva3_pm_pll_offset(u32 id)
49{
50 static const u32 pll_map[] = {
51 0x00, PLL_CORE,
52 0x01, PLL_SHADER,
53 0x02, PLL_MEMORY,
54 0x00, 0x00
55 };
56 const u32 *map = pll_map;
57
58 while (map[1]) {
59 if (id == map[1])
60 return map[0];
61 map += 2;
62 }
63
64 return -ENOENT;
65}
66
67int
68nva3_pm_clock_get(struct drm_device *dev, u32 id)
69{
70 u32 src0, src1, ctrl, coef;
71 struct pll_lims pll;
72 int ret, off;
73 int P, N, M;
74
75 ret = get_pll_limits(dev, id, &pll);
76 if (ret)
77 return ret;
78
79 off = nva3_pm_pll_offset(id);
80 if (off < 0)
81 return off;
82
83 src0 = nv_rd32(dev, 0x4120 + (off * 4));
84 src1 = nv_rd32(dev, 0x4160 + (off * 4));
85 ctrl = nv_rd32(dev, pll.reg + 0);
86 coef = nv_rd32(dev, pll.reg + 4);
87 NV_DEBUG(dev, "PLL %02x: 0x%08x 0x%08x 0x%08x 0x%08x\n",
88 id, src0, src1, ctrl, coef);
89
90 if (ctrl & 0x00000008) {
91 u32 div = ((src1 & 0x003c0000) >> 18) + 1;
92 return (pll.refclk * 2) / div;
93 }
94
95 P = (coef & 0x003f0000) >> 16;
96 N = (coef & 0x0000ff00) >> 8;
97 M = (coef & 0x000000ff);
98 return pll.refclk * N / M / P;
99}
100
101void *
102nva3_pm_clock_pre(struct drm_device *dev, struct nouveau_pm_level *perflvl,
103 u32 id, int khz)
104{
105 struct nva3_pm_state *pll;
106 struct pll_lims limits;
107 int N, M, P, diff;
108 int ret, off;
109
110 ret = get_pll_limits(dev, id, &limits);
111 if (ret < 0)
112 return (ret == -ENOENT) ? NULL : ERR_PTR(ret);
113
114 off = nva3_pm_pll_offset(id);
115 if (id < 0)
116 return ERR_PTR(-EINVAL);
117
118
119 pll = kzalloc(sizeof(*pll), GFP_KERNEL);
120 if (!pll)
121 return ERR_PTR(-ENOMEM);
122 pll->type = id;
123 pll->src0 = 0x004120 + (off * 4);
124 pll->src1 = 0x004160 + (off * 4);
125 pll->ctrl = limits.reg + 0;
126 pll->coef = limits.reg + 4;
127
128 /* If target clock is within [-2, 3) MHz of a divisor, we'll
129 * use that instead of calculating MNP values
130 */
131 pll->new_div = min((limits.refclk * 2) / (khz - 2999), 16);
132 if (pll->new_div) {
133 diff = khz - ((limits.refclk * 2) / pll->new_div);
134 if (diff < -2000 || diff >= 3000)
135 pll->new_div = 0;
136 }
137
138 if (!pll->new_div) {
139 ret = nva3_calc_pll(dev, &limits, khz, &N, NULL, &M, &P);
140 if (ret < 0)
141 return ERR_PTR(ret);
142
143 pll->new_pnm = (P << 16) | (N << 8) | M;
144 pll->new_div = 2 - 1;
145 } else {
146 pll->new_pnm = 0;
147 pll->new_div--;
148 }
149
150 if ((nv_rd32(dev, pll->src1) & 0x00000101) != 0x00000101)
151 pll->old_pnm = nv_rd32(dev, pll->coef);
152 return pll;
153}
154
155void
156nva3_pm_clock_set(struct drm_device *dev, void *pre_state)
157{
158 struct nva3_pm_state *pll = pre_state;
159 u32 ctrl = 0;
160
161 /* For the memory clock, NVIDIA will build a "script" describing
162 * the reclocking process and ask PDAEMON to execute it.
163 */
164 if (pll->type == PLL_MEMORY) {
165 nv_wr32(dev, 0x100210, 0);
166 nv_wr32(dev, 0x1002dc, 1);
167 nv_wr32(dev, 0x004018, 0x00001000);
168 ctrl = 0x18000100;
169 }
170
171 if (pll->old_pnm || !pll->new_pnm) {
172 nv_mask(dev, pll->src1, 0x003c0101, 0x00000101 |
173 (pll->new_div << 18));
174 nv_wr32(dev, pll->ctrl, 0x0001001d | ctrl);
175 nv_mask(dev, pll->ctrl, 0x00000001, 0x00000000);
176 }
177
178 if (pll->new_pnm) {
179 nv_mask(dev, pll->src0, 0x00000101, 0x00000101);
180 nv_wr32(dev, pll->coef, pll->new_pnm);
181 nv_wr32(dev, pll->ctrl, 0x0001001d | ctrl);
182 nv_mask(dev, pll->ctrl, 0x00000010, 0x00000000);
183 nv_mask(dev, pll->ctrl, 0x00020010, 0x00020010);
184 nv_wr32(dev, pll->ctrl, 0x00010015 | ctrl);
185 nv_mask(dev, pll->src1, 0x00000100, 0x00000000);
186 nv_mask(dev, pll->src1, 0x00000001, 0x00000000);
187 if (pll->type == PLL_MEMORY)
188 nv_wr32(dev, 0x4018, 0x10005000);
189 } else {
190 nv_mask(dev, pll->ctrl, 0x00000001, 0x00000000);
191 nv_mask(dev, pll->src0, 0x00000100, 0x00000000);
192 nv_mask(dev, pll->src0, 0x00000001, 0x00000000);
193 if (pll->type == PLL_MEMORY)
194 nv_wr32(dev, 0x4018, 0x1000d000);
195 }
196
197 if (pll->type == PLL_MEMORY) {
198 nv_wr32(dev, 0x1002dc, 0);
199 nv_wr32(dev, 0x100210, 0x80000000);
200 }
201
202 kfree(pll);
203}
204
diff --git a/drivers/gpu/drm/nouveau/nvc0_copy.c b/drivers/gpu/drm/nouveau/nvc0_copy.c
new file mode 100644
index 000000000000..208fa7ab3f42
--- /dev/null
+++ b/drivers/gpu/drm/nouveau/nvc0_copy.c
@@ -0,0 +1,243 @@
1/*
2 * Copyright 2011 Red Hat 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: Ben Skeggs
23 */
24
25#include <linux/firmware.h>
26#include "drmP.h"
27#include "nouveau_drv.h"
28#include "nouveau_util.h"
29#include "nouveau_vm.h"
30#include "nouveau_ramht.h"
31#include "nvc0_copy.fuc.h"
32
33struct nvc0_copy_engine {
34 struct nouveau_exec_engine base;
35 u32 irq;
36 u32 pmc;
37 u32 fuc;
38 u32 ctx;
39};
40
41static int
42nvc0_copy_context_new(struct nouveau_channel *chan, int engine)
43{
44 struct nvc0_copy_engine *pcopy = nv_engine(chan->dev, engine);
45 struct drm_device *dev = chan->dev;
46 struct drm_nouveau_private *dev_priv = dev->dev_private;
47 struct nouveau_gpuobj *ramin = chan->ramin;
48 struct nouveau_gpuobj *ctx = NULL;
49 int ret;
50
51 ret = nouveau_gpuobj_new(dev, NULL, 256, 256,
52 NVOBJ_FLAG_VM | NVOBJ_FLAG_VM_USER |
53 NVOBJ_FLAG_ZERO_ALLOC, &ctx);
54 if (ret)
55 return ret;
56
57 nv_wo32(ramin, pcopy->ctx + 0, lower_32_bits(ctx->vinst));
58 nv_wo32(ramin, pcopy->ctx + 4, upper_32_bits(ctx->vinst));
59 dev_priv->engine.instmem.flush(dev);
60
61 chan->engctx[engine] = ctx;
62 return 0;
63}
64
65static int
66nvc0_copy_object_new(struct nouveau_channel *chan, int engine,
67 u32 handle, u16 class)
68{
69 return 0;
70}
71
72static void
73nvc0_copy_context_del(struct nouveau_channel *chan, int engine)
74{
75 struct nvc0_copy_engine *pcopy = nv_engine(chan->dev, engine);
76 struct nouveau_gpuobj *ctx = chan->engctx[engine];
77 struct drm_device *dev = chan->dev;
78 u32 inst;
79
80 inst = (chan->ramin->vinst >> 12);
81 inst |= 0x40000000;
82
83 /* disable fifo access */
84 nv_wr32(dev, pcopy->fuc + 0x048, 0x00000000);
85 /* mark channel as unloaded if it's currently active */
86 if (nv_rd32(dev, pcopy->fuc + 0x050) == inst)
87 nv_mask(dev, pcopy->fuc + 0x050, 0x40000000, 0x00000000);
88 /* mark next channel as invalid if it's about to be loaded */
89 if (nv_rd32(dev, pcopy->fuc + 0x054) == inst)
90 nv_mask(dev, pcopy->fuc + 0x054, 0x40000000, 0x00000000);
91 /* restore fifo access */
92 nv_wr32(dev, pcopy->fuc + 0x048, 0x00000003);
93
94 nv_wo32(chan->ramin, pcopy->ctx + 0, 0x00000000);
95 nv_wo32(chan->ramin, pcopy->ctx + 4, 0x00000000);
96 nouveau_gpuobj_ref(NULL, &ctx);
97
98 chan->engctx[engine] = ctx;
99}
100
101static int
102nvc0_copy_init(struct drm_device *dev, int engine)
103{
104 struct nvc0_copy_engine *pcopy = nv_engine(dev, engine);
105 int i;
106
107 nv_mask(dev, 0x000200, pcopy->pmc, 0x00000000);
108 nv_mask(dev, 0x000200, pcopy->pmc, pcopy->pmc);
109 nv_wr32(dev, pcopy->fuc + 0x014, 0xffffffff);
110
111 nv_wr32(dev, pcopy->fuc + 0x1c0, 0x01000000);
112 for (i = 0; i < sizeof(nvc0_pcopy_data) / 4; i++)
113 nv_wr32(dev, pcopy->fuc + 0x1c4, nvc0_pcopy_data[i]);
114
115 nv_wr32(dev, pcopy->fuc + 0x180, 0x01000000);
116 for (i = 0; i < sizeof(nvc0_pcopy_code) / 4; i++) {
117 if ((i & 0x3f) == 0)
118 nv_wr32(dev, pcopy->fuc + 0x188, i >> 6);
119 nv_wr32(dev, pcopy->fuc + 0x184, nvc0_pcopy_code[i]);
120 }
121
122 nv_wr32(dev, pcopy->fuc + 0x084, engine - NVOBJ_ENGINE_COPY0);
123 nv_wr32(dev, pcopy->fuc + 0x10c, 0x00000000);
124 nv_wr32(dev, pcopy->fuc + 0x104, 0x00000000); /* ENTRY */
125 nv_wr32(dev, pcopy->fuc + 0x100, 0x00000002); /* TRIGGER */
126 return 0;
127}
128
129static int
130nvc0_copy_fini(struct drm_device *dev, int engine)
131{
132 struct nvc0_copy_engine *pcopy = nv_engine(dev, engine);
133
134 nv_mask(dev, pcopy->fuc + 0x048, 0x00000003, 0x00000000);
135
136 /* trigger fuc context unload */
137 nv_wait(dev, pcopy->fuc + 0x008, 0x0000000c, 0x00000000);
138 nv_mask(dev, pcopy->fuc + 0x054, 0x40000000, 0x00000000);
139 nv_wr32(dev, pcopy->fuc + 0x000, 0x00000008);
140 nv_wait(dev, pcopy->fuc + 0x008, 0x00000008, 0x00000000);
141
142 nv_wr32(dev, pcopy->fuc + 0x014, 0xffffffff);
143 return 0;
144}
145
146static struct nouveau_enum nvc0_copy_isr_error_name[] = {
147 { 0x0001, "ILLEGAL_MTHD" },
148 { 0x0002, "INVALID_ENUM" },
149 { 0x0003, "INVALID_BITFIELD" },
150 {}
151};
152
153static void
154nvc0_copy_isr(struct drm_device *dev, int engine)
155{
156 struct nvc0_copy_engine *pcopy = nv_engine(dev, engine);
157 u32 disp = nv_rd32(dev, pcopy->fuc + 0x01c);
158 u32 stat = nv_rd32(dev, pcopy->fuc + 0x008) & disp & ~(disp >> 16);
159 u64 inst = (u64)(nv_rd32(dev, pcopy->fuc + 0x050) & 0x0fffffff) << 12;
160 u32 chid = nvc0_graph_isr_chid(dev, inst);
161 u32 ssta = nv_rd32(dev, pcopy->fuc + 0x040) & 0x0000ffff;
162 u32 addr = nv_rd32(dev, pcopy->fuc + 0x040) >> 16;
163 u32 mthd = (addr & 0x07ff) << 2;
164 u32 subc = (addr & 0x3800) >> 11;
165 u32 data = nv_rd32(dev, pcopy->fuc + 0x044);
166
167 if (stat & 0x00000040) {
168 NV_INFO(dev, "PCOPY: DISPATCH_ERROR [");
169 nouveau_enum_print(nvc0_copy_isr_error_name, ssta);
170 printk("] ch %d [0x%010llx] subc %d mthd 0x%04x data 0x%08x\n",
171 chid, inst, subc, mthd, data);
172 nv_wr32(dev, pcopy->fuc + 0x004, 0x00000040);
173 stat &= ~0x00000040;
174 }
175
176 if (stat) {
177 NV_INFO(dev, "PCOPY: unhandled intr 0x%08x\n", stat);
178 nv_wr32(dev, pcopy->fuc + 0x004, stat);
179 }
180}
181
182static void
183nvc0_copy_isr_0(struct drm_device *dev)
184{
185 nvc0_copy_isr(dev, NVOBJ_ENGINE_COPY0);
186}
187
188static void
189nvc0_copy_isr_1(struct drm_device *dev)
190{
191 nvc0_copy_isr(dev, NVOBJ_ENGINE_COPY1);
192}
193
194static void
195nvc0_copy_destroy(struct drm_device *dev, int engine)
196{
197 struct nvc0_copy_engine *pcopy = nv_engine(dev, engine);
198
199 nouveau_irq_unregister(dev, pcopy->irq);
200
201 if (engine == NVOBJ_ENGINE_COPY0)
202 NVOBJ_ENGINE_DEL(dev, COPY0);
203 else
204 NVOBJ_ENGINE_DEL(dev, COPY1);
205 kfree(pcopy);
206}
207
208int
209nvc0_copy_create(struct drm_device *dev, int engine)
210{
211 struct nvc0_copy_engine *pcopy;
212
213 pcopy = kzalloc(sizeof(*pcopy), GFP_KERNEL);
214 if (!pcopy)
215 return -ENOMEM;
216
217 pcopy->base.destroy = nvc0_copy_destroy;
218 pcopy->base.init = nvc0_copy_init;
219 pcopy->base.fini = nvc0_copy_fini;
220 pcopy->base.context_new = nvc0_copy_context_new;
221 pcopy->base.context_del = nvc0_copy_context_del;
222 pcopy->base.object_new = nvc0_copy_object_new;
223
224 if (engine == 0) {
225 pcopy->irq = 5;
226 pcopy->pmc = 0x00000040;
227 pcopy->fuc = 0x104000;
228 pcopy->ctx = 0x0230;
229 nouveau_irq_register(dev, pcopy->irq, nvc0_copy_isr_0);
230 NVOBJ_ENGINE_ADD(dev, COPY0, &pcopy->base);
231 NVOBJ_CLASS(dev, 0x90b5, COPY0);
232 } else {
233 pcopy->irq = 6;
234 pcopy->pmc = 0x00000080;
235 pcopy->fuc = 0x105000;
236 pcopy->ctx = 0x0240;
237 nouveau_irq_register(dev, pcopy->irq, nvc0_copy_isr_1);
238 NVOBJ_ENGINE_ADD(dev, COPY1, &pcopy->base);
239 NVOBJ_CLASS(dev, 0x90b8, COPY1);
240 }
241
242 return 0;
243}
diff --git a/drivers/gpu/drm/nouveau/nvc0_copy.fuc.h b/drivers/gpu/drm/nouveau/nvc0_copy.fuc.h
new file mode 100644
index 000000000000..419903880e9d
--- /dev/null
+++ b/drivers/gpu/drm/nouveau/nvc0_copy.fuc.h
@@ -0,0 +1,527 @@
1uint32_t nvc0_pcopy_data[] = {
2 0x00000000,
3 0x00000000,
4 0x00000000,
5 0x00000000,
6 0x00000000,
7 0x00000000,
8 0x00000000,
9 0x00000000,
10 0x00000000,
11 0x00000000,
12 0x00000000,
13 0x00000000,
14 0x00000000,
15 0x00000000,
16 0x00000000,
17 0x00000000,
18 0x00000000,
19 0x00000000,
20 0x00000000,
21 0x00000000,
22 0x00000000,
23 0x00000000,
24 0x00000000,
25 0x00000000,
26 0x00000000,
27 0x00000000,
28 0x00000000,
29 0x00000000,
30 0x00000000,
31 0x00000000,
32 0x00000000,
33 0x00000000,
34 0x00000000,
35 0x00000000,
36 0x00000000,
37 0x00000000,
38 0x00000000,
39 0x00000000,
40 0x00000000,
41 0x00000000,
42 0x00000000,
43 0x00000000,
44 0x00000000,
45 0x00000000,
46 0x00000000,
47 0x00000000,
48 0x00000000,
49 0x00000000,
50 0x00000000,
51 0x00000000,
52 0x00000000,
53 0x00000000,
54 0x00000000,
55 0x00000000,
56 0x00000000,
57 0x00000000,
58 0x00000000,
59 0x00000000,
60 0x00000000,
61 0x00000000,
62 0x00000000,
63 0x00000000,
64 0x00000000,
65 0x00000000,
66 0x00010000,
67 0x00000000,
68 0x00000000,
69 0x00010040,
70 0x0001019f,
71 0x00000000,
72 0x00010050,
73 0x000101a1,
74 0x00000000,
75 0x00070080,
76 0x0000001c,
77 0xfffff000,
78 0x00000020,
79 0xfff80000,
80 0x00000024,
81 0xffffe000,
82 0x00000028,
83 0xfffff800,
84 0x0000002c,
85 0xfffff000,
86 0x00000030,
87 0xfff80000,
88 0x00000034,
89 0xffffe000,
90 0x00070088,
91 0x00000048,
92 0xfffff000,
93 0x0000004c,
94 0xfff80000,
95 0x00000050,
96 0xffffe000,
97 0x00000054,
98 0xfffff800,
99 0x00000058,
100 0xfffff000,
101 0x0000005c,
102 0xfff80000,
103 0x00000060,
104 0xffffe000,
105 0x000200c0,
106 0x000104b8,
107 0x00000000,
108 0x00010541,
109 0x00000000,
110 0x000e00c3,
111 0x00000010,
112 0xffffff00,
113 0x00000014,
114 0x0000000f,
115 0x0000003c,
116 0xffffff00,
117 0x00000040,
118 0x0000000f,
119 0x00000018,
120 0xfff80000,
121 0x00000044,
122 0xfff80000,
123 0x00000074,
124 0xffff0000,
125 0x00000078,
126 0xffffe000,
127 0x00000068,
128 0xfccc0000,
129 0x0000006c,
130 0x00000000,
131 0x00000070,
132 0x00000000,
133 0x00000004,
134 0xffffff00,
135 0x00000008,
136 0x00000000,
137 0x0000000c,
138 0x00000000,
139 0x00000800,
140};
141
142uint32_t nvc0_pcopy_code[] = {
143 0x04fe04bd,
144 0x3517f000,
145 0xf10010fe,
146 0xf1040017,
147 0xf0fff327,
148 0x22d00023,
149 0x0c25f0c0,
150 0xf40012d0,
151 0x17f11031,
152 0x27f01200,
153 0x0012d003,
154 0xf40031f4,
155 0x0ef40028,
156 0x8001cffd,
157 0xf40812c4,
158 0x21f4060b,
159 0x0412c4ca,
160 0xf5070bf4,
161 0xc4010221,
162 0x01d00c11,
163 0xf101f840,
164 0xfe770047,
165 0x47f1004b,
166 0x44cf2100,
167 0x0144f000,
168 0xb60444b6,
169 0xf7f13040,
170 0xf4b6061c,
171 0x1457f106,
172 0x00f5d101,
173 0xb6043594,
174 0x57fe0250,
175 0x0145fe00,
176 0x010052b7,
177 0x00ff67f1,
178 0x56fd60bd,
179 0x0253f004,
180 0xf80545fa,
181 0x0053f003,
182 0xd100e7f0,
183 0x549800fe,
184 0x0845b600,
185 0xb6015698,
186 0x46fd1864,
187 0x0047fe05,
188 0xf00204b9,
189 0x01f40643,
190 0x0604fa09,
191 0xfa060ef4,
192 0x03f80504,
193 0x27f100f8,
194 0x23cf1400,
195 0x1e3fc800,
196 0xf4170bf4,
197 0x21f40132,
198 0x1e3af053,
199 0xf00023d0,
200 0x24d00147,
201 0xcf00f880,
202 0x3dc84023,
203 0x090bf41e,
204 0xf40131f4,
205 0x37f05321,
206 0x8023d002,
207 0x37f100f8,
208 0x32cf1900,
209 0x0033cf40,
210 0x07ff24e4,
211 0xf11024b6,
212 0xbd010057,
213 0x5874bd64,
214 0x57580056,
215 0x0450b601,
216 0xf40446b8,
217 0x76bb4d08,
218 0x0447b800,
219 0xbb0f08f4,
220 0x74b60276,
221 0x0057bb03,
222 0xbbdf0ef4,
223 0x44b60246,
224 0x0045bb03,
225 0xfd014598,
226 0x54b00453,
227 0x201bf400,
228 0x58004558,
229 0x64b00146,
230 0x091bf400,
231 0xf4005380,
232 0x32f4300e,
233 0xf455f901,
234 0x0ef40c01,
235 0x0225f025,
236 0xf10125f0,
237 0xd0100047,
238 0x43d00042,
239 0x4027f040,
240 0xcf0002d0,
241 0x24f08002,
242 0x0024b040,
243 0xf1f71bf4,
244 0xf01d0027,
245 0x23d00137,
246 0xf800f800,
247 0x0027f100,
248 0xf034bd22,
249 0x23d00233,
250 0xf400f800,
251 0x01b0f030,
252 0x0101b000,
253 0xb00201b0,
254 0x04980301,
255 0x3045c71a,
256 0xc70150b6,
257 0x60b63446,
258 0x3847c701,
259 0xf40170b6,
260 0x84bd0232,
261 0x4ac494bd,
262 0x0445b60f,
263 0xa430b4bd,
264 0x0f18f404,
265 0xbbc0a5ff,
266 0x31f400cb,
267 0x220ef402,
268 0xf00c1bf4,
269 0xcbbb10c7,
270 0x160ef400,
271 0xf406a430,
272 0xc7f00c18,
273 0x00cbbb14,
274 0xf1070ef4,
275 0x380080c7,
276 0x80b601c8,
277 0x01b0b601,
278 0xf404b5b8,
279 0x90b6c308,
280 0x0497b801,
281 0xfdb208f4,
282 0x06800065,
283 0x1d08980e,
284 0xf40068fd,
285 0x64bd0502,
286 0x800075fd,
287 0x78fd1907,
288 0x1057f100,
289 0x0654b608,
290 0xd00056d0,
291 0x50b74057,
292 0x06980800,
293 0x0162b619,
294 0x980864b6,
295 0x72b60e07,
296 0x0567fd01,
297 0xb70056d0,
298 0xb4010050,
299 0x56d00060,
300 0x0160b400,
301 0xb44056d0,
302 0x56d00260,
303 0x0360b480,
304 0xb7c056d0,
305 0x98040050,
306 0x56d01b06,
307 0x1c069800,
308 0xf44056d0,
309 0x00f81030,
310 0xc7075798,
311 0x78c76879,
312 0x0380b664,
313 0xb06077c7,
314 0x1bf40e76,
315 0x0477f009,
316 0xf00f0ef4,
317 0x70b6027c,
318 0x0947fd11,
319 0x980677f0,
320 0x5b980c5a,
321 0x00abfd0e,
322 0xbb01b7f0,
323 0xb2b604b7,
324 0xc4abff01,
325 0x9805a7bb,
326 0xe7f00d5d,
327 0x04e8bb01,
328 0xff01e2b6,
329 0xd8bbb4de,
330 0x01e0b605,
331 0xbb0cef94,
332 0xfefd02eb,
333 0x026cf005,
334 0x020860b7,
335 0xd00864b6,
336 0xb7bb006f,
337 0x00cbbb04,
338 0x98085f98,
339 0xfbfd0e5b,
340 0x01b7f000,
341 0xb604b7bb,
342 0xfbbb01b2,
343 0x05f7bb00,
344 0x5f98f0f9,
345 0x01b7f009,
346 0xb604b8bb,
347 0xfbbb01b2,
348 0x05f8bb00,
349 0x78bbf0f9,
350 0x0282b600,
351 0xbb01b7f0,
352 0xb9bb04b8,
353 0x0b589804,
354 0xbb01e7f0,
355 0xe2b604e9,
356 0xf48eff01,
357 0xbb04f7bb,
358 0x79bb00cf,
359 0x0589bb00,
360 0x90fcf0fc,
361 0xbb00d9fd,
362 0x89fd00ad,
363 0x008ffd00,
364 0xbb00a8bb,
365 0x92b604a7,
366 0x0497bb01,
367 0x988069d0,
368 0x58980557,
369 0x00acbb04,
370 0xb6007abb,
371 0x84b60081,
372 0x058bfd10,
373 0x060062b7,
374 0xb70067d0,
375 0xd0040060,
376 0x00f80068,
377 0xb7026cf0,
378 0xb6020260,
379 0x57980864,
380 0x0067d005,
381 0x040060b7,
382 0xb6045798,
383 0x67d01074,
384 0x0060b700,
385 0x06579804,
386 0xf80067d0,
387 0xf900f900,
388 0x0007f110,
389 0x0604b608,
390 0xf00001cf,
391 0x1bf40114,
392 0xfc10fcfa,
393 0xc800f800,
394 0x1bf40d34,
395 0xd121f570,
396 0x0c47f103,
397 0x0644b608,
398 0xb6020598,
399 0x45d00450,
400 0x4040d000,
401 0xd00c57f0,
402 0x40b78045,
403 0x05980400,
404 0x1054b601,
405 0xb70045d0,
406 0xf1050040,
407 0xf00b0057,
408 0x45d00153,
409 0x4057f100,
410 0x0154b640,
411 0x808053f1,
412 0xf14045d0,
413 0xf1111057,
414 0xd0131253,
415 0x57f18045,
416 0x53f11514,
417 0x45d01716,
418 0x0157f1c0,
419 0x0153f026,
420 0x080047f1,
421 0xd00644b6,
422 0x21f50045,
423 0x47f103d1,
424 0x44b6080c,
425 0x02059806,
426 0xd00045d0,
427 0x57f04040,
428 0x8045d004,
429 0x040040b7,
430 0xb6010598,
431 0x45d01054,
432 0x0040b700,
433 0x0057f105,
434 0x0045d003,
435 0x111057f1,
436 0x131253f1,
437 0x984045d0,
438 0x40b70305,
439 0x45d00500,
440 0x0157f100,
441 0x0153f026,
442 0x080047f1,
443 0xd00644b6,
444 0x00f80045,
445 0x03d121f5,
446 0xf4003fc8,
447 0x21f50e0b,
448 0x47f101af,
449 0x0ef40200,
450 0x1067f11e,
451 0x0664b608,
452 0x800177f0,
453 0x07800e07,
454 0x1d079819,
455 0xd00067d0,
456 0x44bd4067,
457 0xbd0232f4,
458 0x043fc854,
459 0xf50a0bf4,
460 0xf403a821,
461 0x21f50a0e,
462 0x49f0029c,
463 0x0231f407,
464 0xc82c57f0,
465 0x0bf4083f,
466 0xa821f50a,
467 0x0a0ef403,
468 0x029c21f5,
469 0xf10849f0,
470 0xb6080057,
471 0x06980654,
472 0x4056d01e,
473 0xf14167f0,
474 0xfd440063,
475 0x54d00546,
476 0x0c3fc800,
477 0xf5070bf4,
478 0xf803eb21,
479 0x0027f100,
480 0xf034bd22,
481 0x23d00133,
482 0x0000f800,
483 0x00000000,
484 0x00000000,
485 0x00000000,
486 0x00000000,
487 0x00000000,
488 0x00000000,
489 0x00000000,
490 0x00000000,
491 0x00000000,
492 0x00000000,
493 0x00000000,
494 0x00000000,
495 0x00000000,
496 0x00000000,
497 0x00000000,
498 0x00000000,
499 0x00000000,
500 0x00000000,
501 0x00000000,
502 0x00000000,
503 0x00000000,
504 0x00000000,
505 0x00000000,
506 0x00000000,
507 0x00000000,
508 0x00000000,
509 0x00000000,
510 0x00000000,
511 0x00000000,
512 0x00000000,
513 0x00000000,
514 0x00000000,
515 0x00000000,
516 0x00000000,
517 0x00000000,
518 0x00000000,
519 0x00000000,
520 0x00000000,
521 0x00000000,
522 0x00000000,
523 0x00000000,
524 0x00000000,
525 0x00000000,
526 0x00000000,
527};
diff --git a/drivers/gpu/drm/nouveau/nvc0_fbcon.c b/drivers/gpu/drm/nouveau/nvc0_fbcon.c
new file mode 100644
index 000000000000..fa5d4c234383
--- /dev/null
+++ b/drivers/gpu/drm/nouveau/nvc0_fbcon.c
@@ -0,0 +1,269 @@
1/*
2 * Copyright 2010 Red Hat 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: Ben Skeggs
23 */
24
25#include "drmP.h"
26#include "nouveau_drv.h"
27#include "nouveau_dma.h"
28#include "nouveau_ramht.h"
29#include "nouveau_fbcon.h"
30#include "nouveau_mm.h"
31
32int
33nvc0_fbcon_fillrect(struct fb_info *info, const struct fb_fillrect *rect)
34{
35 struct nouveau_fbdev *nfbdev = info->par;
36 struct drm_device *dev = nfbdev->dev;
37 struct drm_nouveau_private *dev_priv = dev->dev_private;
38 struct nouveau_channel *chan = dev_priv->channel;
39 int ret;
40
41 ret = RING_SPACE(chan, rect->rop == ROP_COPY ? 7 : 11);
42 if (ret)
43 return ret;
44
45 if (rect->rop != ROP_COPY) {
46 BEGIN_NVC0(chan, 2, NvSub2D, 0x02ac, 1);
47 OUT_RING (chan, 1);
48 }
49 BEGIN_NVC0(chan, 2, NvSub2D, 0x0588, 1);
50 if (info->fix.visual == FB_VISUAL_TRUECOLOR ||
51 info->fix.visual == FB_VISUAL_DIRECTCOLOR)
52 OUT_RING (chan, ((uint32_t *)info->pseudo_palette)[rect->color]);
53 else
54 OUT_RING (chan, rect->color);
55 BEGIN_NVC0(chan, 2, NvSub2D, 0x0600, 4);
56 OUT_RING (chan, rect->dx);
57 OUT_RING (chan, rect->dy);
58 OUT_RING (chan, rect->dx + rect->width);
59 OUT_RING (chan, rect->dy + rect->height);
60 if (rect->rop != ROP_COPY) {
61 BEGIN_NVC0(chan, 2, NvSub2D, 0x02ac, 1);
62 OUT_RING (chan, 3);
63 }
64 FIRE_RING(chan);
65 return 0;
66}
67
68int
69nvc0_fbcon_copyarea(struct fb_info *info, const struct fb_copyarea *region)
70{
71 struct nouveau_fbdev *nfbdev = info->par;
72 struct drm_device *dev = nfbdev->dev;
73 struct drm_nouveau_private *dev_priv = dev->dev_private;
74 struct nouveau_channel *chan = dev_priv->channel;
75 int ret;
76
77 ret = RING_SPACE(chan, 12);
78 if (ret)
79 return ret;
80
81 BEGIN_NVC0(chan, 2, NvSub2D, 0x0110, 1);
82 OUT_RING (chan, 0);
83 BEGIN_NVC0(chan, 2, NvSub2D, 0x08b0, 4);
84 OUT_RING (chan, region->dx);
85 OUT_RING (chan, region->dy);
86 OUT_RING (chan, region->width);
87 OUT_RING (chan, region->height);
88 BEGIN_NVC0(chan, 2, NvSub2D, 0x08d0, 4);
89 OUT_RING (chan, 0);
90 OUT_RING (chan, region->sx);
91 OUT_RING (chan, 0);
92 OUT_RING (chan, region->sy);
93 FIRE_RING(chan);
94 return 0;
95}
96
97int
98nvc0_fbcon_imageblit(struct fb_info *info, const struct fb_image *image)
99{
100 struct nouveau_fbdev *nfbdev = info->par;
101 struct drm_device *dev = nfbdev->dev;
102 struct drm_nouveau_private *dev_priv = dev->dev_private;
103 struct nouveau_channel *chan = dev_priv->channel;
104 uint32_t width, dwords, *data = (uint32_t *)image->data;
105 uint32_t mask = ~(~0 >> (32 - info->var.bits_per_pixel));
106 uint32_t *palette = info->pseudo_palette;
107 int ret;
108
109 if (image->depth != 1)
110 return -ENODEV;
111
112 ret = RING_SPACE(chan, 11);
113 if (ret)
114 return ret;
115
116 width = ALIGN(image->width, 32);
117 dwords = (width * image->height) >> 5;
118
119 BEGIN_NVC0(chan, 2, NvSub2D, 0x0814, 2);
120 if (info->fix.visual == FB_VISUAL_TRUECOLOR ||
121 info->fix.visual == FB_VISUAL_DIRECTCOLOR) {
122 OUT_RING (chan, palette[image->bg_color] | mask);
123 OUT_RING (chan, palette[image->fg_color] | mask);
124 } else {
125 OUT_RING (chan, image->bg_color);
126 OUT_RING (chan, image->fg_color);
127 }
128 BEGIN_NVC0(chan, 2, NvSub2D, 0x0838, 2);
129 OUT_RING (chan, image->width);
130 OUT_RING (chan, image->height);
131 BEGIN_NVC0(chan, 2, NvSub2D, 0x0850, 4);
132 OUT_RING (chan, 0);
133 OUT_RING (chan, image->dx);
134 OUT_RING (chan, 0);
135 OUT_RING (chan, image->dy);
136
137 while (dwords) {
138 int push = dwords > 2047 ? 2047 : dwords;
139
140 ret = RING_SPACE(chan, push + 1);
141 if (ret)
142 return ret;
143
144 dwords -= push;
145
146 BEGIN_NVC0(chan, 6, NvSub2D, 0x0860, push);
147 OUT_RINGp(chan, data, push);
148 data += push;
149 }
150
151 FIRE_RING(chan);
152 return 0;
153}
154
155int
156nvc0_fbcon_accel_init(struct fb_info *info)
157{
158 struct nouveau_fbdev *nfbdev = info->par;
159 struct drm_device *dev = nfbdev->dev;
160 struct drm_nouveau_private *dev_priv = dev->dev_private;
161 struct nouveau_channel *chan = dev_priv->channel;
162 struct nouveau_bo *nvbo = nfbdev->nouveau_fb.nvbo;
163 int ret, format;
164
165 ret = nouveau_gpuobj_gr_new(chan, 0x902d, 0x902d);
166 if (ret)
167 return ret;
168
169 switch (info->var.bits_per_pixel) {
170 case 8:
171 format = 0xf3;
172 break;
173 case 15:
174 format = 0xf8;
175 break;
176 case 16:
177 format = 0xe8;
178 break;
179 case 32:
180 switch (info->var.transp.length) {
181 case 0: /* depth 24 */
182 case 8: /* depth 32, just use 24.. */
183 format = 0xe6;
184 break;
185 case 2: /* depth 30 */
186 format = 0xd1;
187 break;
188 default:
189 return -EINVAL;
190 }
191 break;
192 default:
193 return -EINVAL;
194 }
195
196 ret = RING_SPACE(chan, 60);
197 if (ret) {
198 WARN_ON(1);
199 nouveau_fbcon_gpu_lockup(info);
200 return ret;
201 }
202
203 BEGIN_NVC0(chan, 2, NvSub2D, 0x0000, 1);
204 OUT_RING (chan, 0x0000902d);
205 BEGIN_NVC0(chan, 2, NvSub2D, 0x0104, 2);
206 OUT_RING (chan, upper_32_bits(chan->notifier_bo->bo.offset));
207 OUT_RING (chan, lower_32_bits(chan->notifier_bo->bo.offset));
208 BEGIN_NVC0(chan, 2, NvSub2D, 0x0290, 1);
209 OUT_RING (chan, 0);
210 BEGIN_NVC0(chan, 2, NvSub2D, 0x0888, 1);
211 OUT_RING (chan, 1);
212 BEGIN_NVC0(chan, 2, NvSub2D, 0x02ac, 1);
213 OUT_RING (chan, 3);
214 BEGIN_NVC0(chan, 2, NvSub2D, 0x02a0, 1);
215 OUT_RING (chan, 0x55);
216 BEGIN_NVC0(chan, 2, NvSub2D, 0x08c0, 4);
217 OUT_RING (chan, 0);
218 OUT_RING (chan, 1);
219 OUT_RING (chan, 0);
220 OUT_RING (chan, 1);
221 BEGIN_NVC0(chan, 2, NvSub2D, 0x0580, 2);
222 OUT_RING (chan, 4);
223 OUT_RING (chan, format);
224 BEGIN_NVC0(chan, 2, NvSub2D, 0x02e8, 2);
225 OUT_RING (chan, 2);
226 OUT_RING (chan, 1);
227
228 BEGIN_NVC0(chan, 2, NvSub2D, 0x0804, 1);
229 OUT_RING (chan, format);
230 BEGIN_NVC0(chan, 2, NvSub2D, 0x0800, 1);
231 OUT_RING (chan, 1);
232 BEGIN_NVC0(chan, 2, NvSub2D, 0x0808, 3);
233 OUT_RING (chan, 0);
234 OUT_RING (chan, 0);
235 OUT_RING (chan, 1);
236 BEGIN_NVC0(chan, 2, NvSub2D, 0x081c, 1);
237 OUT_RING (chan, 1);
238 BEGIN_NVC0(chan, 2, NvSub2D, 0x0840, 4);
239 OUT_RING (chan, 0);
240 OUT_RING (chan, 1);
241 OUT_RING (chan, 0);
242 OUT_RING (chan, 1);
243 BEGIN_NVC0(chan, 2, NvSub2D, 0x0200, 10);
244 OUT_RING (chan, format);
245 OUT_RING (chan, 1);
246 OUT_RING (chan, 0);
247 OUT_RING (chan, 1);
248 OUT_RING (chan, 0);
249 OUT_RING (chan, info->fix.line_length);
250 OUT_RING (chan, info->var.xres_virtual);
251 OUT_RING (chan, info->var.yres_virtual);
252 OUT_RING (chan, upper_32_bits(nvbo->vma.offset));
253 OUT_RING (chan, lower_32_bits(nvbo->vma.offset));
254 BEGIN_NVC0(chan, 2, NvSub2D, 0x0230, 10);
255 OUT_RING (chan, format);
256 OUT_RING (chan, 1);
257 OUT_RING (chan, 0);
258 OUT_RING (chan, 1);
259 OUT_RING (chan, 0);
260 OUT_RING (chan, info->fix.line_length);
261 OUT_RING (chan, info->var.xres_virtual);
262 OUT_RING (chan, info->var.yres_virtual);
263 OUT_RING (chan, upper_32_bits(nvbo->vma.offset));
264 OUT_RING (chan, lower_32_bits(nvbo->vma.offset));
265 FIRE_RING (chan);
266
267 return 0;
268}
269
diff --git a/drivers/gpu/drm/nouveau/nvc0_fifo.c b/drivers/gpu/drm/nouveau/nvc0_fifo.c
index d64375871979..fb4f5943e01b 100644
--- a/drivers/gpu/drm/nouveau/nvc0_fifo.c
+++ b/drivers/gpu/drm/nouveau/nvc0_fifo.c
@@ -25,6 +25,49 @@
25#include "drmP.h" 25#include "drmP.h"
26 26
27#include "nouveau_drv.h" 27#include "nouveau_drv.h"
28#include "nouveau_mm.h"
29
30static void nvc0_fifo_isr(struct drm_device *);
31
32struct nvc0_fifo_priv {
33 struct nouveau_gpuobj *playlist[2];
34 int cur_playlist;
35 struct nouveau_vma user_vma;
36 int spoon_nr;
37};
38
39struct nvc0_fifo_chan {
40 struct nouveau_gpuobj *user;
41 struct nouveau_gpuobj *ramfc;
42};
43
44static void
45nvc0_fifo_playlist_update(struct drm_device *dev)
46{
47 struct drm_nouveau_private *dev_priv = dev->dev_private;
48 struct nouveau_instmem_engine *pinstmem = &dev_priv->engine.instmem;
49 struct nouveau_fifo_engine *pfifo = &dev_priv->engine.fifo;
50 struct nvc0_fifo_priv *priv = pfifo->priv;
51 struct nouveau_gpuobj *cur;
52 int i, p;
53
54 cur = priv->playlist[priv->cur_playlist];
55 priv->cur_playlist = !priv->cur_playlist;
56
57 for (i = 0, p = 0; i < 128; i++) {
58 if (!(nv_rd32(dev, 0x3004 + (i * 8)) & 1))
59 continue;
60 nv_wo32(cur, p + 0, i);
61 nv_wo32(cur, p + 4, 0x00000004);
62 p += 8;
63 }
64 pinstmem->flush(dev);
65
66 nv_wr32(dev, 0x002270, cur->vinst >> 12);
67 nv_wr32(dev, 0x002274, 0x01f00000 | (p >> 3));
68 if (!nv_wait(dev, 0x00227c, 0x00100000, 0x00000000))
69 NV_ERROR(dev, "PFIFO - playlist update failed\n");
70}
28 71
29void 72void
30nvc0_fifo_disable(struct drm_device *dev) 73nvc0_fifo_disable(struct drm_device *dev)
@@ -43,12 +86,6 @@ nvc0_fifo_reassign(struct drm_device *dev, bool enable)
43} 86}
44 87
45bool 88bool
46nvc0_fifo_cache_flush(struct drm_device *dev)
47{
48 return true;
49}
50
51bool
52nvc0_fifo_cache_pull(struct drm_device *dev, bool enable) 89nvc0_fifo_cache_pull(struct drm_device *dev, bool enable)
53{ 90{
54 return false; 91 return false;
@@ -63,12 +100,102 @@ nvc0_fifo_channel_id(struct drm_device *dev)
63int 100int
64nvc0_fifo_create_context(struct nouveau_channel *chan) 101nvc0_fifo_create_context(struct nouveau_channel *chan)
65{ 102{
103 struct drm_device *dev = chan->dev;
104 struct drm_nouveau_private *dev_priv = dev->dev_private;
105 struct nouveau_instmem_engine *pinstmem = &dev_priv->engine.instmem;
106 struct nouveau_fifo_engine *pfifo = &dev_priv->engine.fifo;
107 struct nvc0_fifo_priv *priv = pfifo->priv;
108 struct nvc0_fifo_chan *fifoch;
109 u64 ib_virt = chan->pushbuf_base + chan->dma.ib_base * 4;
110 int ret;
111
112 chan->fifo_priv = kzalloc(sizeof(*fifoch), GFP_KERNEL);
113 if (!chan->fifo_priv)
114 return -ENOMEM;
115 fifoch = chan->fifo_priv;
116
117 /* allocate vram for control regs, map into polling area */
118 ret = nouveau_gpuobj_new(dev, NULL, 0x1000, 0x1000,
119 NVOBJ_FLAG_ZERO_ALLOC, &fifoch->user);
120 if (ret)
121 goto error;
122
123 nouveau_vm_map_at(&priv->user_vma, chan->id * 0x1000,
124 *(struct nouveau_mem **)fifoch->user->node);
125
126 chan->user = ioremap_wc(pci_resource_start(dev->pdev, 1) +
127 priv->user_vma.offset + (chan->id * 0x1000),
128 PAGE_SIZE);
129 if (!chan->user) {
130 ret = -ENOMEM;
131 goto error;
132 }
133
134 /* ramfc */
135 ret = nouveau_gpuobj_new_fake(dev, chan->ramin->pinst,
136 chan->ramin->vinst, 0x100,
137 NVOBJ_FLAG_ZERO_ALLOC, &fifoch->ramfc);
138 if (ret)
139 goto error;
140
141 nv_wo32(fifoch->ramfc, 0x08, lower_32_bits(fifoch->user->vinst));
142 nv_wo32(fifoch->ramfc, 0x0c, upper_32_bits(fifoch->user->vinst));
143 nv_wo32(fifoch->ramfc, 0x10, 0x0000face);
144 nv_wo32(fifoch->ramfc, 0x30, 0xfffff902);
145 nv_wo32(fifoch->ramfc, 0x48, lower_32_bits(ib_virt));
146 nv_wo32(fifoch->ramfc, 0x4c, drm_order(chan->dma.ib_max + 1) << 16 |
147 upper_32_bits(ib_virt));
148 nv_wo32(fifoch->ramfc, 0x54, 0x00000002);
149 nv_wo32(fifoch->ramfc, 0x84, 0x20400000);
150 nv_wo32(fifoch->ramfc, 0x94, 0x30000001);
151 nv_wo32(fifoch->ramfc, 0x9c, 0x00000100);
152 nv_wo32(fifoch->ramfc, 0xa4, 0x1f1f1f1f);
153 nv_wo32(fifoch->ramfc, 0xa8, 0x1f1f1f1f);
154 nv_wo32(fifoch->ramfc, 0xac, 0x0000001f);
155 nv_wo32(fifoch->ramfc, 0xb8, 0xf8000000);
156 nv_wo32(fifoch->ramfc, 0xf8, 0x10003080); /* 0x002310 */
157 nv_wo32(fifoch->ramfc, 0xfc, 0x10000010); /* 0x002350 */
158 pinstmem->flush(dev);
159
160 nv_wr32(dev, 0x003000 + (chan->id * 8), 0xc0000000 |
161 (chan->ramin->vinst >> 12));
162 nv_wr32(dev, 0x003004 + (chan->id * 8), 0x001f0001);
163 nvc0_fifo_playlist_update(dev);
66 return 0; 164 return 0;
165
166error:
167 pfifo->destroy_context(chan);
168 return ret;
67} 169}
68 170
69void 171void
70nvc0_fifo_destroy_context(struct nouveau_channel *chan) 172nvc0_fifo_destroy_context(struct nouveau_channel *chan)
71{ 173{
174 struct drm_device *dev = chan->dev;
175 struct nvc0_fifo_chan *fifoch;
176
177 nv_mask(dev, 0x003004 + (chan->id * 8), 0x00000001, 0x00000000);
178 nv_wr32(dev, 0x002634, chan->id);
179 if (!nv_wait(dev, 0x0002634, 0xffffffff, chan->id))
180 NV_WARN(dev, "0x2634 != chid: 0x%08x\n", nv_rd32(dev, 0x2634));
181
182 nvc0_fifo_playlist_update(dev);
183
184 nv_wr32(dev, 0x003000 + (chan->id * 8), 0x00000000);
185
186 if (chan->user) {
187 iounmap(chan->user);
188 chan->user = NULL;
189 }
190
191 fifoch = chan->fifo_priv;
192 chan->fifo_priv = NULL;
193 if (!fifoch)
194 return;
195
196 nouveau_gpuobj_ref(NULL, &fifoch->ramfc);
197 nouveau_gpuobj_ref(NULL, &fifoch->user);
198 kfree(fifoch);
72} 199}
73 200
74int 201int
@@ -80,17 +207,302 @@ nvc0_fifo_load_context(struct nouveau_channel *chan)
80int 207int
81nvc0_fifo_unload_context(struct drm_device *dev) 208nvc0_fifo_unload_context(struct drm_device *dev)
82{ 209{
210 int i;
211
212 for (i = 0; i < 128; i++) {
213 if (!(nv_rd32(dev, 0x003004 + (i * 4)) & 1))
214 continue;
215
216 nv_mask(dev, 0x003004 + (i * 4), 0x00000001, 0x00000000);
217 nv_wr32(dev, 0x002634, i);
218 if (!nv_wait(dev, 0x002634, 0xffffffff, i)) {
219 NV_INFO(dev, "PFIFO: kick ch %d failed: 0x%08x\n",
220 i, nv_rd32(dev, 0x002634));
221 return -EBUSY;
222 }
223 }
224
83 return 0; 225 return 0;
84} 226}
85 227
228static void
229nvc0_fifo_destroy(struct drm_device *dev)
230{
231 struct drm_nouveau_private *dev_priv = dev->dev_private;
232 struct nouveau_fifo_engine *pfifo = &dev_priv->engine.fifo;
233 struct nvc0_fifo_priv *priv;
234
235 priv = pfifo->priv;
236 if (!priv)
237 return;
238
239 nouveau_vm_put(&priv->user_vma);
240 nouveau_gpuobj_ref(NULL, &priv->playlist[1]);
241 nouveau_gpuobj_ref(NULL, &priv->playlist[0]);
242 kfree(priv);
243}
244
86void 245void
87nvc0_fifo_takedown(struct drm_device *dev) 246nvc0_fifo_takedown(struct drm_device *dev)
88{ 247{
248 nv_wr32(dev, 0x002140, 0x00000000);
249 nvc0_fifo_destroy(dev);
250}
251
252static int
253nvc0_fifo_create(struct drm_device *dev)
254{
255 struct drm_nouveau_private *dev_priv = dev->dev_private;
256 struct nouveau_fifo_engine *pfifo = &dev_priv->engine.fifo;
257 struct nvc0_fifo_priv *priv;
258 int ret;
259
260 priv = kzalloc(sizeof(*priv), GFP_KERNEL);
261 if (!priv)
262 return -ENOMEM;
263 pfifo->priv = priv;
264
265 ret = nouveau_gpuobj_new(dev, NULL, 0x1000, 0x1000, 0,
266 &priv->playlist[0]);
267 if (ret)
268 goto error;
269
270 ret = nouveau_gpuobj_new(dev, NULL, 0x1000, 0x1000, 0,
271 &priv->playlist[1]);
272 if (ret)
273 goto error;
274
275 ret = nouveau_vm_get(dev_priv->bar1_vm, pfifo->channels * 0x1000,
276 12, NV_MEM_ACCESS_RW, &priv->user_vma);
277 if (ret)
278 goto error;
279
280 nouveau_irq_register(dev, 8, nvc0_fifo_isr);
281 NVOBJ_CLASS(dev, 0x506e, SW); /* nvsw */
282 return 0;
283
284error:
285 nvc0_fifo_destroy(dev);
286 return ret;
89} 287}
90 288
91int 289int
92nvc0_fifo_init(struct drm_device *dev) 290nvc0_fifo_init(struct drm_device *dev)
93{ 291{
292 struct drm_nouveau_private *dev_priv = dev->dev_private;
293 struct nouveau_fifo_engine *pfifo = &dev_priv->engine.fifo;
294 struct nouveau_channel *chan;
295 struct nvc0_fifo_priv *priv;
296 int ret, i;
297
298 if (!pfifo->priv) {
299 ret = nvc0_fifo_create(dev);
300 if (ret)
301 return ret;
302 }
303 priv = pfifo->priv;
304
305 /* reset PFIFO, enable all available PSUBFIFO areas */
306 nv_mask(dev, 0x000200, 0x00000100, 0x00000000);
307 nv_mask(dev, 0x000200, 0x00000100, 0x00000100);
308 nv_wr32(dev, 0x000204, 0xffffffff);
309 nv_wr32(dev, 0x002204, 0xffffffff);
310
311 priv->spoon_nr = hweight32(nv_rd32(dev, 0x002204));
312 NV_DEBUG(dev, "PFIFO: %d subfifo(s)\n", priv->spoon_nr);
313
314 /* assign engines to subfifos */
315 if (priv->spoon_nr >= 3) {
316 nv_wr32(dev, 0x002208, ~(1 << 0)); /* PGRAPH */
317 nv_wr32(dev, 0x00220c, ~(1 << 1)); /* PVP */
318 nv_wr32(dev, 0x002210, ~(1 << 1)); /* PPP */
319 nv_wr32(dev, 0x002214, ~(1 << 1)); /* PBSP */
320 nv_wr32(dev, 0x002218, ~(1 << 2)); /* PCE0 */
321 nv_wr32(dev, 0x00221c, ~(1 << 1)); /* PCE1 */
322 }
323
324 /* PSUBFIFO[n] */
325 for (i = 0; i < 3; i++) {
326 nv_mask(dev, 0x04013c + (i * 0x2000), 0x10000100, 0x00000000);
327 nv_wr32(dev, 0x040108 + (i * 0x2000), 0xffffffff); /* INTR */
328 nv_wr32(dev, 0x04010c + (i * 0x2000), 0xfffffeff); /* INTR_EN */
329 }
330
331 nv_mask(dev, 0x002200, 0x00000001, 0x00000001);
332 nv_wr32(dev, 0x002254, 0x10000000 | priv->user_vma.offset >> 12);
333
334 nv_wr32(dev, 0x002a00, 0xffffffff); /* clears PFIFO.INTR bit 30 */
335 nv_wr32(dev, 0x002100, 0xffffffff);
336 nv_wr32(dev, 0x002140, 0xbfffffff);
337
338 /* restore PFIFO context table */
339 for (i = 0; i < 128; i++) {
340 chan = dev_priv->channels.ptr[i];
341 if (!chan || !chan->fifo_priv)
342 continue;
343
344 nv_wr32(dev, 0x003000 + (i * 8), 0xc0000000 |
345 (chan->ramin->vinst >> 12));
346 nv_wr32(dev, 0x003004 + (i * 8), 0x001f0001);
347 }
348 nvc0_fifo_playlist_update(dev);
349
94 return 0; 350 return 0;
95} 351}
96 352
353struct nouveau_enum nvc0_fifo_fault_unit[] = {
354 { 0x00, "PGRAPH" },
355 { 0x03, "PEEPHOLE" },
356 { 0x04, "BAR1" },
357 { 0x05, "BAR3" },
358 { 0x07, "PFIFO" },
359 { 0x10, "PBSP" },
360 { 0x11, "PPPP" },
361 { 0x13, "PCOUNTER" },
362 { 0x14, "PVP" },
363 { 0x15, "PCOPY0" },
364 { 0x16, "PCOPY1" },
365 { 0x17, "PDAEMON" },
366 {}
367};
368
369struct nouveau_enum nvc0_fifo_fault_reason[] = {
370 { 0x00, "PT_NOT_PRESENT" },
371 { 0x01, "PT_TOO_SHORT" },
372 { 0x02, "PAGE_NOT_PRESENT" },
373 { 0x03, "VM_LIMIT_EXCEEDED" },
374 { 0x04, "NO_CHANNEL" },
375 { 0x05, "PAGE_SYSTEM_ONLY" },
376 { 0x06, "PAGE_READ_ONLY" },
377 { 0x0a, "COMPRESSED_SYSRAM" },
378 { 0x0c, "INVALID_STORAGE_TYPE" },
379 {}
380};
381
382struct nouveau_enum nvc0_fifo_fault_hubclient[] = {
383 { 0x01, "PCOPY0" },
384 { 0x02, "PCOPY1" },
385 { 0x04, "DISPATCH" },
386 { 0x05, "CTXCTL" },
387 { 0x06, "PFIFO" },
388 { 0x07, "BAR_READ" },
389 { 0x08, "BAR_WRITE" },
390 { 0x0b, "PVP" },
391 { 0x0c, "PPPP" },
392 { 0x0d, "PBSP" },
393 { 0x11, "PCOUNTER" },
394 { 0x12, "PDAEMON" },
395 { 0x14, "CCACHE" },
396 { 0x15, "CCACHE_POST" },
397 {}
398};
399
400struct nouveau_enum nvc0_fifo_fault_gpcclient[] = {
401 { 0x01, "TEX" },
402 { 0x0c, "ESETUP" },
403 { 0x0e, "CTXCTL" },
404 { 0x0f, "PROP" },
405 {}
406};
407
408struct nouveau_bitfield nvc0_fifo_subfifo_intr[] = {
409/* { 0x00008000, "" } seen with null ib push */
410 { 0x00200000, "ILLEGAL_MTHD" },
411 { 0x00800000, "EMPTY_SUBC" },
412 {}
413};
414
415static void
416nvc0_fifo_isr_vm_fault(struct drm_device *dev, int unit)
417{
418 u32 inst = nv_rd32(dev, 0x2800 + (unit * 0x10));
419 u32 valo = nv_rd32(dev, 0x2804 + (unit * 0x10));
420 u32 vahi = nv_rd32(dev, 0x2808 + (unit * 0x10));
421 u32 stat = nv_rd32(dev, 0x280c + (unit * 0x10));
422 u32 client = (stat & 0x00001f00) >> 8;
423
424 NV_INFO(dev, "PFIFO: %s fault at 0x%010llx [",
425 (stat & 0x00000080) ? "write" : "read", (u64)vahi << 32 | valo);
426 nouveau_enum_print(nvc0_fifo_fault_reason, stat & 0x0000000f);
427 printk("] from ");
428 nouveau_enum_print(nvc0_fifo_fault_unit, unit);
429 if (stat & 0x00000040) {
430 printk("/");
431 nouveau_enum_print(nvc0_fifo_fault_hubclient, client);
432 } else {
433 printk("/GPC%d/", (stat & 0x1f000000) >> 24);
434 nouveau_enum_print(nvc0_fifo_fault_gpcclient, client);
435 }
436 printk(" on channel 0x%010llx\n", (u64)inst << 12);
437}
438
439static void
440nvc0_fifo_isr_subfifo_intr(struct drm_device *dev, int unit)
441{
442 u32 stat = nv_rd32(dev, 0x040108 + (unit * 0x2000));
443 u32 addr = nv_rd32(dev, 0x0400c0 + (unit * 0x2000));
444 u32 data = nv_rd32(dev, 0x0400c4 + (unit * 0x2000));
445 u32 chid = nv_rd32(dev, 0x040120 + (unit * 0x2000)) & 0x7f;
446 u32 subc = (addr & 0x00070000);
447 u32 mthd = (addr & 0x00003ffc);
448
449 NV_INFO(dev, "PSUBFIFO %d:", unit);
450 nouveau_bitfield_print(nvc0_fifo_subfifo_intr, stat);
451 NV_INFO(dev, "PSUBFIFO %d: ch %d subc %d mthd 0x%04x data 0x%08x\n",
452 unit, chid, subc, mthd, data);
453
454 nv_wr32(dev, 0x0400c0 + (unit * 0x2000), 0x80600008);
455 nv_wr32(dev, 0x040108 + (unit * 0x2000), stat);
456}
457
458static void
459nvc0_fifo_isr(struct drm_device *dev)
460{
461 u32 stat = nv_rd32(dev, 0x002100);
462
463 if (stat & 0x00000100) {
464 NV_INFO(dev, "PFIFO: unknown status 0x00000100\n");
465 nv_wr32(dev, 0x002100, 0x00000100);
466 stat &= ~0x00000100;
467 }
468
469 if (stat & 0x10000000) {
470 u32 units = nv_rd32(dev, 0x00259c);
471 u32 u = units;
472
473 while (u) {
474 int i = ffs(u) - 1;
475 nvc0_fifo_isr_vm_fault(dev, i);
476 u &= ~(1 << i);
477 }
478
479 nv_wr32(dev, 0x00259c, units);
480 stat &= ~0x10000000;
481 }
482
483 if (stat & 0x20000000) {
484 u32 units = nv_rd32(dev, 0x0025a0);
485 u32 u = units;
486
487 while (u) {
488 int i = ffs(u) - 1;
489 nvc0_fifo_isr_subfifo_intr(dev, i);
490 u &= ~(1 << i);
491 }
492
493 nv_wr32(dev, 0x0025a0, units);
494 stat &= ~0x20000000;
495 }
496
497 if (stat & 0x40000000) {
498 NV_INFO(dev, "PFIFO: unknown status 0x40000000\n");
499 nv_mask(dev, 0x002a00, 0x00000000, 0x00000000);
500 stat &= ~0x40000000;
501 }
502
503 if (stat) {
504 NV_INFO(dev, "PFIFO: unhandled status 0x%08x\n", stat);
505 nv_wr32(dev, 0x002100, stat);
506 nv_wr32(dev, 0x002140, 0);
507 }
508}
diff --git a/drivers/gpu/drm/nouveau/nvc0_graph.c b/drivers/gpu/drm/nouveau/nvc0_graph.c
index 717a5177a8d8..ca6db204d644 100644
--- a/drivers/gpu/drm/nouveau/nvc0_graph.c
+++ b/drivers/gpu/drm/nouveau/nvc0_graph.c
@@ -22,54 +22,775 @@
22 * Authors: Ben Skeggs 22 * Authors: Ben Skeggs
23 */ 23 */
24 24
25#include <linux/firmware.h>
26
25#include "drmP.h" 27#include "drmP.h"
26 28
27#include "nouveau_drv.h" 29#include "nouveau_drv.h"
30#include "nouveau_mm.h"
31#include "nvc0_graph.h"
28 32
29void 33static int
30nvc0_graph_fifo_access(struct drm_device *dev, bool enabled) 34nvc0_graph_load_context(struct nouveau_channel *chan)
31{ 35{
36 struct drm_device *dev = chan->dev;
37
38 nv_wr32(dev, 0x409840, 0x00000030);
39 nv_wr32(dev, 0x409500, 0x80000000 | chan->ramin->vinst >> 12);
40 nv_wr32(dev, 0x409504, 0x00000003);
41 if (!nv_wait(dev, 0x409800, 0x00000010, 0x00000010))
42 NV_ERROR(dev, "PGRAPH: load_ctx timeout\n");
43
44 return 0;
32} 45}
33 46
34struct nouveau_channel * 47static int
35nvc0_graph_channel(struct drm_device *dev) 48nvc0_graph_unload_context_to(struct drm_device *dev, u64 chan)
36{ 49{
37 return NULL; 50 nv_wr32(dev, 0x409840, 0x00000003);
51 nv_wr32(dev, 0x409500, 0x80000000 | chan >> 12);
52 nv_wr32(dev, 0x409504, 0x00000009);
53 if (!nv_wait(dev, 0x409800, 0x00000001, 0x00000000)) {
54 NV_ERROR(dev, "PGRAPH: unload_ctx timeout\n");
55 return -EBUSY;
56 }
57
58 return 0;
38} 59}
39 60
40int 61static int
41nvc0_graph_create_context(struct nouveau_channel *chan) 62nvc0_graph_construct_context(struct nouveau_channel *chan)
42{ 63{
64 struct drm_nouveau_private *dev_priv = chan->dev->dev_private;
65 struct nvc0_graph_priv *priv = nv_engine(chan->dev, NVOBJ_ENGINE_GR);
66 struct nvc0_graph_chan *grch = chan->engctx[NVOBJ_ENGINE_GR];
67 struct drm_device *dev = chan->dev;
68 int ret, i;
69 u32 *ctx;
70
71 ctx = kmalloc(priv->grctx_size, GFP_KERNEL);
72 if (!ctx)
73 return -ENOMEM;
74
75 nvc0_graph_load_context(chan);
76
77 nv_wo32(grch->grctx, 0x1c, 1);
78 nv_wo32(grch->grctx, 0x20, 0);
79 nv_wo32(grch->grctx, 0x28, 0);
80 nv_wo32(grch->grctx, 0x2c, 0);
81 dev_priv->engine.instmem.flush(dev);
82
83 ret = nvc0_grctx_generate(chan);
84 if (ret) {
85 kfree(ctx);
86 return ret;
87 }
88
89 ret = nvc0_graph_unload_context_to(dev, chan->ramin->vinst);
90 if (ret) {
91 kfree(ctx);
92 return ret;
93 }
94
95 for (i = 0; i < priv->grctx_size; i += 4)
96 ctx[i / 4] = nv_ro32(grch->grctx, i);
97
98 priv->grctx_vals = ctx;
43 return 0; 99 return 0;
44} 100}
45 101
46void 102static int
47nvc0_graph_destroy_context(struct nouveau_channel *chan) 103nvc0_graph_create_context_mmio_list(struct nouveau_channel *chan)
48{ 104{
105 struct nvc0_graph_priv *priv = nv_engine(chan->dev, NVOBJ_ENGINE_GR);
106 struct nvc0_graph_chan *grch = chan->engctx[NVOBJ_ENGINE_GR];
107 struct drm_device *dev = chan->dev;
108 int i = 0, gpc, tp, ret;
109 u32 magic;
110
111 ret = nouveau_gpuobj_new(dev, NULL, 0x2000, 256, NVOBJ_FLAG_VM,
112 &grch->unk408004);
113 if (ret)
114 return ret;
115
116 ret = nouveau_gpuobj_new(dev, NULL, 0x8000, 256, NVOBJ_FLAG_VM,
117 &grch->unk40800c);
118 if (ret)
119 return ret;
120
121 ret = nouveau_gpuobj_new(dev, NULL, 384 * 1024, 4096,
122 NVOBJ_FLAG_VM | NVOBJ_FLAG_VM_USER,
123 &grch->unk418810);
124 if (ret)
125 return ret;
126
127 ret = nouveau_gpuobj_new(dev, NULL, 0x1000, 0, NVOBJ_FLAG_VM,
128 &grch->mmio);
129 if (ret)
130 return ret;
131
132
133 nv_wo32(grch->mmio, i++ * 4, 0x00408004);
134 nv_wo32(grch->mmio, i++ * 4, grch->unk408004->vinst >> 8);
135 nv_wo32(grch->mmio, i++ * 4, 0x00408008);
136 nv_wo32(grch->mmio, i++ * 4, 0x80000018);
137
138 nv_wo32(grch->mmio, i++ * 4, 0x0040800c);
139 nv_wo32(grch->mmio, i++ * 4, grch->unk40800c->vinst >> 8);
140 nv_wo32(grch->mmio, i++ * 4, 0x00408010);
141 nv_wo32(grch->mmio, i++ * 4, 0x80000000);
142
143 nv_wo32(grch->mmio, i++ * 4, 0x00418810);
144 nv_wo32(grch->mmio, i++ * 4, 0x80000000 | grch->unk418810->vinst >> 12);
145 nv_wo32(grch->mmio, i++ * 4, 0x00419848);
146 nv_wo32(grch->mmio, i++ * 4, 0x10000000 | grch->unk418810->vinst >> 12);
147
148 nv_wo32(grch->mmio, i++ * 4, 0x00419004);
149 nv_wo32(grch->mmio, i++ * 4, grch->unk40800c->vinst >> 8);
150 nv_wo32(grch->mmio, i++ * 4, 0x00419008);
151 nv_wo32(grch->mmio, i++ * 4, 0x00000000);
152
153 nv_wo32(grch->mmio, i++ * 4, 0x00418808);
154 nv_wo32(grch->mmio, i++ * 4, grch->unk408004->vinst >> 8);
155 nv_wo32(grch->mmio, i++ * 4, 0x0041880c);
156 nv_wo32(grch->mmio, i++ * 4, 0x80000018);
157
158 magic = 0x02180000;
159 nv_wo32(grch->mmio, i++ * 4, 0x00405830);
160 nv_wo32(grch->mmio, i++ * 4, magic);
161 for (gpc = 0; gpc < priv->gpc_nr; gpc++) {
162 for (tp = 0; tp < priv->tp_nr[gpc]; tp++, magic += 0x02fc) {
163 u32 reg = 0x504520 + (gpc * 0x8000) + (tp * 0x0800);
164 nv_wo32(grch->mmio, i++ * 4, reg);
165 nv_wo32(grch->mmio, i++ * 4, magic);
166 }
167 }
168
169 grch->mmio_nr = i / 2;
170 return 0;
49} 171}
50 172
51int 173static int
52nvc0_graph_load_context(struct nouveau_channel *chan) 174nvc0_graph_context_new(struct nouveau_channel *chan, int engine)
53{ 175{
176 struct drm_device *dev = chan->dev;
177 struct drm_nouveau_private *dev_priv = dev->dev_private;
178 struct nouveau_instmem_engine *pinstmem = &dev_priv->engine.instmem;
179 struct nvc0_graph_priv *priv = nv_engine(dev, engine);
180 struct nvc0_graph_chan *grch;
181 struct nouveau_gpuobj *grctx;
182 int ret, i;
183
184 grch = kzalloc(sizeof(*grch), GFP_KERNEL);
185 if (!grch)
186 return -ENOMEM;
187 chan->engctx[NVOBJ_ENGINE_GR] = grch;
188
189 ret = nouveau_gpuobj_new(dev, NULL, priv->grctx_size, 256,
190 NVOBJ_FLAG_VM | NVOBJ_FLAG_ZERO_ALLOC,
191 &grch->grctx);
192 if (ret)
193 goto error;
194 grctx = grch->grctx;
195
196 ret = nvc0_graph_create_context_mmio_list(chan);
197 if (ret)
198 goto error;
199
200 nv_wo32(chan->ramin, 0x0210, lower_32_bits(grctx->vinst) | 4);
201 nv_wo32(chan->ramin, 0x0214, upper_32_bits(grctx->vinst));
202 pinstmem->flush(dev);
203
204 if (!priv->grctx_vals) {
205 ret = nvc0_graph_construct_context(chan);
206 if (ret)
207 goto error;
208 }
209
210 for (i = 0; i < priv->grctx_size; i += 4)
211 nv_wo32(grctx, i, priv->grctx_vals[i / 4]);
212
213 nv_wo32(grctx, 0xf4, 0);
214 nv_wo32(grctx, 0xf8, 0);
215 nv_wo32(grctx, 0x10, grch->mmio_nr);
216 nv_wo32(grctx, 0x14, lower_32_bits(grch->mmio->vinst));
217 nv_wo32(grctx, 0x18, upper_32_bits(grch->mmio->vinst));
218 nv_wo32(grctx, 0x1c, 1);
219 nv_wo32(grctx, 0x20, 0);
220 nv_wo32(grctx, 0x28, 0);
221 nv_wo32(grctx, 0x2c, 0);
222 pinstmem->flush(dev);
54 return 0; 223 return 0;
224
225error:
226 priv->base.context_del(chan, engine);
227 return ret;
55} 228}
56 229
57int 230static void
58nvc0_graph_unload_context(struct drm_device *dev) 231nvc0_graph_context_del(struct nouveau_channel *chan, int engine)
232{
233 struct nvc0_graph_chan *grch = chan->engctx[engine];
234
235 nouveau_gpuobj_ref(NULL, &grch->mmio);
236 nouveau_gpuobj_ref(NULL, &grch->unk418810);
237 nouveau_gpuobj_ref(NULL, &grch->unk40800c);
238 nouveau_gpuobj_ref(NULL, &grch->unk408004);
239 nouveau_gpuobj_ref(NULL, &grch->grctx);
240 chan->engctx[engine] = NULL;
241}
242
243static int
244nvc0_graph_object_new(struct nouveau_channel *chan, int engine,
245 u32 handle, u16 class)
246{
247 return 0;
248}
249
250static int
251nvc0_graph_fini(struct drm_device *dev, int engine)
252{
253 return 0;
254}
255
256static int
257nvc0_graph_mthd_page_flip(struct nouveau_channel *chan,
258 u32 class, u32 mthd, u32 data)
259{
260 nouveau_finish_page_flip(chan, NULL);
261 return 0;
262}
263
264static void
265nvc0_graph_init_obj418880(struct drm_device *dev)
266{
267 struct nvc0_graph_priv *priv = nv_engine(dev, NVOBJ_ENGINE_GR);
268 int i;
269
270 nv_wr32(dev, GPC_BCAST(0x0880), 0x00000000);
271 nv_wr32(dev, GPC_BCAST(0x08a4), 0x00000000);
272 for (i = 0; i < 4; i++)
273 nv_wr32(dev, GPC_BCAST(0x0888) + (i * 4), 0x00000000);
274 nv_wr32(dev, GPC_BCAST(0x08b4), priv->unk4188b4->vinst >> 8);
275 nv_wr32(dev, GPC_BCAST(0x08b8), priv->unk4188b8->vinst >> 8);
276}
277
278static void
279nvc0_graph_init_regs(struct drm_device *dev)
280{
281 nv_wr32(dev, 0x400080, 0x003083c2);
282 nv_wr32(dev, 0x400088, 0x00006fe7);
283 nv_wr32(dev, 0x40008c, 0x00000000);
284 nv_wr32(dev, 0x400090, 0x00000030);
285 nv_wr32(dev, 0x40013c, 0x013901f7);
286 nv_wr32(dev, 0x400140, 0x00000100);
287 nv_wr32(dev, 0x400144, 0x00000000);
288 nv_wr32(dev, 0x400148, 0x00000110);
289 nv_wr32(dev, 0x400138, 0x00000000);
290 nv_wr32(dev, 0x400130, 0x00000000);
291 nv_wr32(dev, 0x400134, 0x00000000);
292 nv_wr32(dev, 0x400124, 0x00000002);
293}
294
295static void
296nvc0_graph_init_gpc_0(struct drm_device *dev)
297{
298 struct nvc0_graph_priv *priv = nv_engine(dev, NVOBJ_ENGINE_GR);
299 u32 data[TP_MAX / 8];
300 u8 tpnr[GPC_MAX];
301 int i, gpc, tpc;
302
303 /*
304 * TP ROP UNKVAL(magic_not_rop_nr)
305 * 450: 4/0/0/0 2 3
306 * 460: 3/4/0/0 4 1
307 * 465: 3/4/4/0 4 7
308 * 470: 3/3/4/4 5 5
309 * 480: 3/4/4/4 6 6
310 *
311 * magicgpc918
312 * 450: 00200000 00000000001000000000000000000000
313 * 460: 00124925 00000000000100100100100100100101
314 * 465: 000ba2e9 00000000000010111010001011101001
315 * 470: 00092493 00000000000010010010010010010011
316 * 480: 00088889 00000000000010001000100010001001
317 */
318
319 memset(data, 0x00, sizeof(data));
320 memcpy(tpnr, priv->tp_nr, sizeof(priv->tp_nr));
321 for (i = 0, gpc = -1; i < priv->tp_total; i++) {
322 do {
323 gpc = (gpc + 1) % priv->gpc_nr;
324 } while (!tpnr[gpc]);
325 tpc = priv->tp_nr[gpc] - tpnr[gpc]--;
326
327 data[i / 8] |= tpc << ((i % 8) * 4);
328 }
329
330 nv_wr32(dev, GPC_BCAST(0x0980), data[0]);
331 nv_wr32(dev, GPC_BCAST(0x0984), data[1]);
332 nv_wr32(dev, GPC_BCAST(0x0988), data[2]);
333 nv_wr32(dev, GPC_BCAST(0x098c), data[3]);
334
335 for (gpc = 0; gpc < priv->gpc_nr; gpc++) {
336 nv_wr32(dev, GPC_UNIT(gpc, 0x0914), priv->magic_not_rop_nr << 8 |
337 priv->tp_nr[gpc]);
338 nv_wr32(dev, GPC_UNIT(gpc, 0x0910), 0x00040000 | priv->tp_total);
339 nv_wr32(dev, GPC_UNIT(gpc, 0x0918), priv->magicgpc918);
340 }
341
342 nv_wr32(dev, GPC_BCAST(0x1bd4), priv->magicgpc918);
343 nv_wr32(dev, GPC_BCAST(0x08ac), priv->rop_nr);
344}
345
346static void
347nvc0_graph_init_units(struct drm_device *dev)
348{
349 nv_wr32(dev, 0x409c24, 0x000f0000);
350 nv_wr32(dev, 0x404000, 0xc0000000); /* DISPATCH */
351 nv_wr32(dev, 0x404600, 0xc0000000); /* M2MF */
352 nv_wr32(dev, 0x408030, 0xc0000000);
353 nv_wr32(dev, 0x40601c, 0xc0000000);
354 nv_wr32(dev, 0x404490, 0xc0000000); /* MACRO */
355 nv_wr32(dev, 0x406018, 0xc0000000);
356 nv_wr32(dev, 0x405840, 0xc0000000);
357 nv_wr32(dev, 0x405844, 0x00ffffff);
358 nv_mask(dev, 0x419cc0, 0x00000008, 0x00000008);
359 nv_mask(dev, 0x419eb4, 0x00001000, 0x00001000);
360}
361
362static void
363nvc0_graph_init_gpc_1(struct drm_device *dev)
364{
365 struct nvc0_graph_priv *priv = nv_engine(dev, NVOBJ_ENGINE_GR);
366 int gpc, tp;
367
368 for (gpc = 0; gpc < priv->gpc_nr; gpc++) {
369 nv_wr32(dev, GPC_UNIT(gpc, 0x0420), 0xc0000000);
370 nv_wr32(dev, GPC_UNIT(gpc, 0x0900), 0xc0000000);
371 nv_wr32(dev, GPC_UNIT(gpc, 0x1028), 0xc0000000);
372 nv_wr32(dev, GPC_UNIT(gpc, 0x0824), 0xc0000000);
373 for (tp = 0; tp < priv->tp_nr[gpc]; tp++) {
374 nv_wr32(dev, TP_UNIT(gpc, tp, 0x508), 0xffffffff);
375 nv_wr32(dev, TP_UNIT(gpc, tp, 0x50c), 0xffffffff);
376 nv_wr32(dev, TP_UNIT(gpc, tp, 0x224), 0xc0000000);
377 nv_wr32(dev, TP_UNIT(gpc, tp, 0x48c), 0xc0000000);
378 nv_wr32(dev, TP_UNIT(gpc, tp, 0x084), 0xc0000000);
379 nv_wr32(dev, TP_UNIT(gpc, tp, 0x644), 0x001ffffe);
380 nv_wr32(dev, TP_UNIT(gpc, tp, 0x64c), 0x0000000f);
381 }
382 nv_wr32(dev, GPC_UNIT(gpc, 0x2c90), 0xffffffff);
383 nv_wr32(dev, GPC_UNIT(gpc, 0x2c94), 0xffffffff);
384 }
385}
386
387static void
388nvc0_graph_init_rop(struct drm_device *dev)
59{ 389{
390 struct nvc0_graph_priv *priv = nv_engine(dev, NVOBJ_ENGINE_GR);
391 int rop;
392
393 for (rop = 0; rop < priv->rop_nr; rop++) {
394 nv_wr32(dev, ROP_UNIT(rop, 0x144), 0xc0000000);
395 nv_wr32(dev, ROP_UNIT(rop, 0x070), 0xc0000000);
396 nv_wr32(dev, ROP_UNIT(rop, 0x204), 0xffffffff);
397 nv_wr32(dev, ROP_UNIT(rop, 0x208), 0xffffffff);
398 }
399}
400
401static void
402nvc0_graph_init_fuc(struct drm_device *dev, u32 fuc_base,
403 struct nvc0_graph_fuc *code, struct nvc0_graph_fuc *data)
404{
405 int i;
406
407 nv_wr32(dev, fuc_base + 0x01c0, 0x01000000);
408 for (i = 0; i < data->size / 4; i++)
409 nv_wr32(dev, fuc_base + 0x01c4, data->data[i]);
410
411 nv_wr32(dev, fuc_base + 0x0180, 0x01000000);
412 for (i = 0; i < code->size / 4; i++) {
413 if ((i & 0x3f) == 0)
414 nv_wr32(dev, fuc_base + 0x0188, i >> 6);
415 nv_wr32(dev, fuc_base + 0x0184, code->data[i]);
416 }
417}
418
419static int
420nvc0_graph_init_ctxctl(struct drm_device *dev)
421{
422 struct nvc0_graph_priv *priv = nv_engine(dev, NVOBJ_ENGINE_GR);
423 u32 r000260;
424
425 /* load fuc microcode */
426 r000260 = nv_mask(dev, 0x000260, 0x00000001, 0x00000000);
427 nvc0_graph_init_fuc(dev, 0x409000, &priv->fuc409c, &priv->fuc409d);
428 nvc0_graph_init_fuc(dev, 0x41a000, &priv->fuc41ac, &priv->fuc41ad);
429 nv_wr32(dev, 0x000260, r000260);
430
431 /* start both of them running */
432 nv_wr32(dev, 0x409840, 0xffffffff);
433 nv_wr32(dev, 0x41a10c, 0x00000000);
434 nv_wr32(dev, 0x40910c, 0x00000000);
435 nv_wr32(dev, 0x41a100, 0x00000002);
436 nv_wr32(dev, 0x409100, 0x00000002);
437 if (!nv_wait(dev, 0x409800, 0x00000001, 0x00000001))
438 NV_INFO(dev, "0x409800 wait failed\n");
439
440 nv_wr32(dev, 0x409840, 0xffffffff);
441 nv_wr32(dev, 0x409500, 0x7fffffff);
442 nv_wr32(dev, 0x409504, 0x00000021);
443
444 nv_wr32(dev, 0x409840, 0xffffffff);
445 nv_wr32(dev, 0x409500, 0x00000000);
446 nv_wr32(dev, 0x409504, 0x00000010);
447 if (!nv_wait_ne(dev, 0x409800, 0xffffffff, 0x00000000)) {
448 NV_ERROR(dev, "fuc09 req 0x10 timeout\n");
449 return -EBUSY;
450 }
451 priv->grctx_size = nv_rd32(dev, 0x409800);
452
453 nv_wr32(dev, 0x409840, 0xffffffff);
454 nv_wr32(dev, 0x409500, 0x00000000);
455 nv_wr32(dev, 0x409504, 0x00000016);
456 if (!nv_wait_ne(dev, 0x409800, 0xffffffff, 0x00000000)) {
457 NV_ERROR(dev, "fuc09 req 0x16 timeout\n");
458 return -EBUSY;
459 }
460
461 nv_wr32(dev, 0x409840, 0xffffffff);
462 nv_wr32(dev, 0x409500, 0x00000000);
463 nv_wr32(dev, 0x409504, 0x00000025);
464 if (!nv_wait_ne(dev, 0x409800, 0xffffffff, 0x00000000)) {
465 NV_ERROR(dev, "fuc09 req 0x25 timeout\n");
466 return -EBUSY;
467 }
468
60 return 0; 469 return 0;
61} 470}
62 471
63void 472static int
64nvc0_graph_takedown(struct drm_device *dev) 473nvc0_graph_init(struct drm_device *dev, int engine)
65{ 474{
475 int ret;
476
477 nv_mask(dev, 0x000200, 0x18001000, 0x00000000);
478 nv_mask(dev, 0x000200, 0x18001000, 0x18001000);
479
480 nvc0_graph_init_obj418880(dev);
481 nvc0_graph_init_regs(dev);
482 /*nvc0_graph_init_unitplemented_magics(dev);*/
483 nvc0_graph_init_gpc_0(dev);
484 /*nvc0_graph_init_unitplemented_c242(dev);*/
485
486 nv_wr32(dev, 0x400500, 0x00010001);
487 nv_wr32(dev, 0x400100, 0xffffffff);
488 nv_wr32(dev, 0x40013c, 0xffffffff);
489
490 nvc0_graph_init_units(dev);
491 nvc0_graph_init_gpc_1(dev);
492 nvc0_graph_init_rop(dev);
493
494 nv_wr32(dev, 0x400108, 0xffffffff);
495 nv_wr32(dev, 0x400138, 0xffffffff);
496 nv_wr32(dev, 0x400118, 0xffffffff);
497 nv_wr32(dev, 0x400130, 0xffffffff);
498 nv_wr32(dev, 0x40011c, 0xffffffff);
499 nv_wr32(dev, 0x400134, 0xffffffff);
500 nv_wr32(dev, 0x400054, 0x34ce3464);
501
502 ret = nvc0_graph_init_ctxctl(dev);
503 if (ret)
504 return ret;
505
506 return 0;
66} 507}
67 508
68int 509int
69nvc0_graph_init(struct drm_device *dev) 510nvc0_graph_isr_chid(struct drm_device *dev, u64 inst)
70{ 511{
71 struct drm_nouveau_private *dev_priv = dev->dev_private; 512 struct drm_nouveau_private *dev_priv = dev->dev_private;
72 dev_priv->engine.graph.accel_blocked = true; 513 struct nouveau_channel *chan;
514 unsigned long flags;
515 int i;
516
517 spin_lock_irqsave(&dev_priv->channels.lock, flags);
518 for (i = 0; i < dev_priv->engine.fifo.channels; i++) {
519 chan = dev_priv->channels.ptr[i];
520 if (!chan || !chan->ramin)
521 continue;
522
523 if (inst == chan->ramin->vinst)
524 break;
525 }
526 spin_unlock_irqrestore(&dev_priv->channels.lock, flags);
527 return i;
528}
529
530static void
531nvc0_graph_isr(struct drm_device *dev)
532{
533 u64 inst = (u64)(nv_rd32(dev, 0x409b00) & 0x0fffffff) << 12;
534 u32 chid = nvc0_graph_isr_chid(dev, inst);
535 u32 stat = nv_rd32(dev, 0x400100);
536 u32 addr = nv_rd32(dev, 0x400704);
537 u32 mthd = (addr & 0x00003ffc);
538 u32 subc = (addr & 0x00070000) >> 16;
539 u32 data = nv_rd32(dev, 0x400708);
540 u32 code = nv_rd32(dev, 0x400110);
541 u32 class = nv_rd32(dev, 0x404200 + (subc * 4));
542
543 if (stat & 0x00000010) {
544 if (nouveau_gpuobj_mthd_call2(dev, chid, class, mthd, data)) {
545 NV_INFO(dev, "PGRAPH: ILLEGAL_MTHD ch %d [0x%010llx] "
546 "subc %d class 0x%04x mthd 0x%04x "
547 "data 0x%08x\n",
548 chid, inst, subc, class, mthd, data);
549 }
550 nv_wr32(dev, 0x400100, 0x00000010);
551 stat &= ~0x00000010;
552 }
553
554 if (stat & 0x00000020) {
555 NV_INFO(dev, "PGRAPH: ILLEGAL_CLASS ch %d [0x%010llx] subc %d "
556 "class 0x%04x mthd 0x%04x data 0x%08x\n",
557 chid, inst, subc, class, mthd, data);
558 nv_wr32(dev, 0x400100, 0x00000020);
559 stat &= ~0x00000020;
560 }
561
562 if (stat & 0x00100000) {
563 NV_INFO(dev, "PGRAPH: DATA_ERROR [");
564 nouveau_enum_print(nv50_data_error_names, code);
565 printk("] ch %d [0x%010llx] subc %d class 0x%04x "
566 "mthd 0x%04x data 0x%08x\n",
567 chid, inst, subc, class, mthd, data);
568 nv_wr32(dev, 0x400100, 0x00100000);
569 stat &= ~0x00100000;
570 }
571
572 if (stat & 0x00200000) {
573 u32 trap = nv_rd32(dev, 0x400108);
574 NV_INFO(dev, "PGRAPH: TRAP ch %d status 0x%08x\n", chid, trap);
575 nv_wr32(dev, 0x400108, trap);
576 nv_wr32(dev, 0x400100, 0x00200000);
577 stat &= ~0x00200000;
578 }
579
580 if (stat & 0x00080000) {
581 u32 ustat = nv_rd32(dev, 0x409c18);
582
583 NV_INFO(dev, "PGRAPH: CTXCTRL ustat 0x%08x\n", ustat);
584
585 nv_wr32(dev, 0x409c20, ustat);
586 nv_wr32(dev, 0x400100, 0x00080000);
587 stat &= ~0x00080000;
588 }
589
590 if (stat) {
591 NV_INFO(dev, "PGRAPH: unknown stat 0x%08x\n", stat);
592 nv_wr32(dev, 0x400100, stat);
593 }
594
595 nv_wr32(dev, 0x400500, 0x00010001);
596}
597
598static void
599nvc0_runk140_isr(struct drm_device *dev)
600{
601 u32 units = nv_rd32(dev, 0x00017c) & 0x1f;
602
603 while (units) {
604 u32 unit = ffs(units) - 1;
605 u32 reg = 0x140000 + unit * 0x2000;
606 u32 st0 = nv_mask(dev, reg + 0x1020, 0, 0);
607 u32 st1 = nv_mask(dev, reg + 0x1420, 0, 0);
608
609 NV_INFO(dev, "PRUNK140: %d 0x%08x 0x%08x\n", unit, st0, st1);
610 units &= ~(1 << unit);
611 }
612}
613
614static int
615nvc0_graph_create_fw(struct drm_device *dev, const char *fwname,
616 struct nvc0_graph_fuc *fuc)
617{
618 struct drm_nouveau_private *dev_priv = dev->dev_private;
619 const struct firmware *fw;
620 char f[32];
621 int ret;
622
623 snprintf(f, sizeof(f), "nouveau/nv%02x_%s", dev_priv->chipset, fwname);
624 ret = request_firmware(&fw, f, &dev->pdev->dev);
625 if (ret) {
626 snprintf(f, sizeof(f), "nouveau/%s", fwname);
627 ret = request_firmware(&fw, f, &dev->pdev->dev);
628 if (ret) {
629 NV_ERROR(dev, "failed to load %s\n", fwname);
630 return ret;
631 }
632 }
633
634 fuc->size = fw->size;
635 fuc->data = kmemdup(fw->data, fuc->size, GFP_KERNEL);
636 release_firmware(fw);
637 return (fuc->data != NULL) ? 0 : -ENOMEM;
638}
639
640static void
641nvc0_graph_destroy_fw(struct nvc0_graph_fuc *fuc)
642{
643 if (fuc->data) {
644 kfree(fuc->data);
645 fuc->data = NULL;
646 }
647}
648
649static void
650nvc0_graph_destroy(struct drm_device *dev, int engine)
651{
652 struct nvc0_graph_priv *priv = nv_engine(dev, engine);
653
654 nvc0_graph_destroy_fw(&priv->fuc409c);
655 nvc0_graph_destroy_fw(&priv->fuc409d);
656 nvc0_graph_destroy_fw(&priv->fuc41ac);
657 nvc0_graph_destroy_fw(&priv->fuc41ad);
658
659 nouveau_irq_unregister(dev, 12);
660 nouveau_irq_unregister(dev, 25);
661
662 nouveau_gpuobj_ref(NULL, &priv->unk4188b8);
663 nouveau_gpuobj_ref(NULL, &priv->unk4188b4);
664
665 if (priv->grctx_vals)
666 kfree(priv->grctx_vals);
667
668 NVOBJ_ENGINE_DEL(dev, GR);
669 kfree(priv);
670}
671
672int
673nvc0_graph_create(struct drm_device *dev)
674{
675 struct drm_nouveau_private *dev_priv = dev->dev_private;
676 struct nvc0_graph_priv *priv;
677 int ret, gpc, i;
678
679 switch (dev_priv->chipset) {
680 case 0xc0:
681 case 0xc3:
682 case 0xc4:
683 break;
684 default:
685 NV_ERROR(dev, "PGRAPH: unsupported chipset, please report!\n");
686 return 0;
687 }
688
689 priv = kzalloc(sizeof(*priv), GFP_KERNEL);
690 if (!priv)
691 return -ENOMEM;
692
693 priv->base.destroy = nvc0_graph_destroy;
694 priv->base.init = nvc0_graph_init;
695 priv->base.fini = nvc0_graph_fini;
696 priv->base.context_new = nvc0_graph_context_new;
697 priv->base.context_del = nvc0_graph_context_del;
698 priv->base.object_new = nvc0_graph_object_new;
699
700 NVOBJ_ENGINE_ADD(dev, GR, &priv->base);
701 nouveau_irq_register(dev, 12, nvc0_graph_isr);
702 nouveau_irq_register(dev, 25, nvc0_runk140_isr);
703
704 if (nvc0_graph_create_fw(dev, "fuc409c", &priv->fuc409c) ||
705 nvc0_graph_create_fw(dev, "fuc409d", &priv->fuc409d) ||
706 nvc0_graph_create_fw(dev, "fuc41ac", &priv->fuc41ac) ||
707 nvc0_graph_create_fw(dev, "fuc41ad", &priv->fuc41ad)) {
708 ret = 0;
709 goto error;
710 }
711
712
713 ret = nouveau_gpuobj_new(dev, NULL, 0x1000, 256, 0, &priv->unk4188b4);
714 if (ret)
715 goto error;
716
717 ret = nouveau_gpuobj_new(dev, NULL, 0x1000, 256, 0, &priv->unk4188b8);
718 if (ret)
719 goto error;
720
721 for (i = 0; i < 0x1000; i += 4) {
722 nv_wo32(priv->unk4188b4, i, 0x00000010);
723 nv_wo32(priv->unk4188b8, i, 0x00000010);
724 }
725
726 priv->gpc_nr = nv_rd32(dev, 0x409604) & 0x0000001f;
727 priv->rop_nr = (nv_rd32(dev, 0x409604) & 0x001f0000) >> 16;
728 for (gpc = 0; gpc < priv->gpc_nr; gpc++) {
729 priv->tp_nr[gpc] = nv_rd32(dev, GPC_UNIT(gpc, 0x2608));
730 priv->tp_total += priv->tp_nr[gpc];
731 }
732
733 /*XXX: these need figuring out... */
734 switch (dev_priv->chipset) {
735 case 0xc0:
736 if (priv->tp_total == 11) { /* 465, 3/4/4/0, 4 */
737 priv->magic_not_rop_nr = 0x07;
738 /* filled values up to tp_total, the rest 0 */
739 priv->magicgpc918 = 0x000ba2e9;
740 } else
741 if (priv->tp_total == 14) { /* 470, 3/3/4/4, 5 */
742 priv->magic_not_rop_nr = 0x05;
743 priv->magicgpc918 = 0x00092493;
744 } else
745 if (priv->tp_total == 15) { /* 480, 3/4/4/4, 6 */
746 priv->magic_not_rop_nr = 0x06;
747 priv->magicgpc918 = 0x00088889;
748 }
749 break;
750 case 0xc3: /* 450, 4/0/0/0, 2 */
751 priv->magic_not_rop_nr = 0x03;
752 priv->magicgpc918 = 0x00200000;
753 break;
754 case 0xc4: /* 460, 3/4/0/0, 4 */
755 priv->magic_not_rop_nr = 0x01;
756 priv->magicgpc918 = 0x00124925;
757 break;
758 }
759
760 if (!priv->magic_not_rop_nr) {
761 NV_ERROR(dev, "PGRAPH: unknown config: %d/%d/%d/%d, %d\n",
762 priv->tp_nr[0], priv->tp_nr[1], priv->tp_nr[2],
763 priv->tp_nr[3], priv->rop_nr);
764 /* use 0xc3's values... */
765 priv->magic_not_rop_nr = 0x03;
766 priv->magicgpc918 = 0x00200000;
767 }
768
769 NVOBJ_CLASS(dev, 0x902d, GR); /* 2D */
770 NVOBJ_CLASS(dev, 0x9039, GR); /* M2MF */
771 NVOBJ_MTHD (dev, 0x9039, 0x0500, nvc0_graph_mthd_page_flip);
772 NVOBJ_CLASS(dev, 0x9097, GR); /* 3D */
773 NVOBJ_CLASS(dev, 0x90c0, GR); /* COMPUTE */
73 return 0; 774 return 0;
775
776error:
777 nvc0_graph_destroy(dev, NVOBJ_ENGINE_GR);
778 return ret;
74} 779}
75 780
781MODULE_FIRMWARE("nouveau/nvc0_fuc409c");
782MODULE_FIRMWARE("nouveau/nvc0_fuc409d");
783MODULE_FIRMWARE("nouveau/nvc0_fuc41ac");
784MODULE_FIRMWARE("nouveau/nvc0_fuc41ad");
785MODULE_FIRMWARE("nouveau/nvc3_fuc409c");
786MODULE_FIRMWARE("nouveau/nvc3_fuc409d");
787MODULE_FIRMWARE("nouveau/nvc3_fuc41ac");
788MODULE_FIRMWARE("nouveau/nvc3_fuc41ad");
789MODULE_FIRMWARE("nouveau/nvc4_fuc409c");
790MODULE_FIRMWARE("nouveau/nvc4_fuc409d");
791MODULE_FIRMWARE("nouveau/nvc4_fuc41ac");
792MODULE_FIRMWARE("nouveau/nvc4_fuc41ad");
793MODULE_FIRMWARE("nouveau/fuc409c");
794MODULE_FIRMWARE("nouveau/fuc409d");
795MODULE_FIRMWARE("nouveau/fuc41ac");
796MODULE_FIRMWARE("nouveau/fuc41ad");
diff --git a/drivers/gpu/drm/nouveau/nvc0_graph.h b/drivers/gpu/drm/nouveau/nvc0_graph.h
new file mode 100644
index 000000000000..f5d184e0689d
--- /dev/null
+++ b/drivers/gpu/drm/nouveau/nvc0_graph.h
@@ -0,0 +1,75 @@
1/*
2 * Copyright 2010 Red Hat 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: Ben Skeggs
23 */
24
25#ifndef __NVC0_GRAPH_H__
26#define __NVC0_GRAPH_H__
27
28#define GPC_MAX 4
29#define TP_MAX 32
30
31#define ROP_BCAST(r) (0x408800 + (r))
32#define ROP_UNIT(u, r) (0x410000 + (u) * 0x400 + (r))
33#define GPC_BCAST(r) (0x418000 + (r))
34#define GPC_UNIT(t, r) (0x500000 + (t) * 0x8000 + (r))
35#define TP_UNIT(t, m, r) (0x504000 + (t) * 0x8000 + (m) * 0x800 + (r))
36
37struct nvc0_graph_fuc {
38 u32 *data;
39 u32 size;
40};
41
42struct nvc0_graph_priv {
43 struct nouveau_exec_engine base;
44
45 struct nvc0_graph_fuc fuc409c;
46 struct nvc0_graph_fuc fuc409d;
47 struct nvc0_graph_fuc fuc41ac;
48 struct nvc0_graph_fuc fuc41ad;
49
50 u8 gpc_nr;
51 u8 rop_nr;
52 u8 tp_nr[GPC_MAX];
53 u8 tp_total;
54
55 u32 grctx_size;
56 u32 *grctx_vals;
57 struct nouveau_gpuobj *unk4188b4;
58 struct nouveau_gpuobj *unk4188b8;
59
60 u8 magic_not_rop_nr;
61 u32 magicgpc918;
62};
63
64struct nvc0_graph_chan {
65 struct nouveau_gpuobj *grctx;
66 struct nouveau_gpuobj *unk408004; /* 0x418810 too */
67 struct nouveau_gpuobj *unk40800c; /* 0x419004 too */
68 struct nouveau_gpuobj *unk418810; /* 0x419848 too */
69 struct nouveau_gpuobj *mmio;
70 int mmio_nr;
71};
72
73int nvc0_grctx_generate(struct nouveau_channel *);
74
75#endif
diff --git a/drivers/gpu/drm/nouveau/nvc0_grctx.c b/drivers/gpu/drm/nouveau/nvc0_grctx.c
new file mode 100644
index 000000000000..6df066114133
--- /dev/null
+++ b/drivers/gpu/drm/nouveau/nvc0_grctx.c
@@ -0,0 +1,2874 @@
1/*
2 * Copyright 2010 Red Hat 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: Ben Skeggs
23 */
24
25#include "drmP.h"
26#include "nouveau_drv.h"
27#include "nouveau_mm.h"
28#include "nvc0_graph.h"
29
30static void
31nv_icmd(struct drm_device *dev, u32 icmd, u32 data)
32{
33 nv_wr32(dev, 0x400204, data);
34 nv_wr32(dev, 0x400200, icmd);
35 while (nv_rd32(dev, 0x400700) & 2) {}
36}
37
38static void
39nv_mthd(struct drm_device *dev, u32 class, u32 mthd, u32 data)
40{
41 nv_wr32(dev, 0x40448c, data);
42 nv_wr32(dev, 0x404488, 0x80000000 | (mthd << 14) | class);
43}
44
45static void
46nvc0_grctx_generate_9097(struct drm_device *dev)
47{
48 nv_mthd(dev, 0x9097, 0x0800, 0x00000000);
49 nv_mthd(dev, 0x9097, 0x0840, 0x00000000);
50 nv_mthd(dev, 0x9097, 0x0880, 0x00000000);
51 nv_mthd(dev, 0x9097, 0x08c0, 0x00000000);
52 nv_mthd(dev, 0x9097, 0x0900, 0x00000000);
53 nv_mthd(dev, 0x9097, 0x0940, 0x00000000);
54 nv_mthd(dev, 0x9097, 0x0980, 0x00000000);
55 nv_mthd(dev, 0x9097, 0x09c0, 0x00000000);
56 nv_mthd(dev, 0x9097, 0x0804, 0x00000000);
57 nv_mthd(dev, 0x9097, 0x0844, 0x00000000);
58 nv_mthd(dev, 0x9097, 0x0884, 0x00000000);
59 nv_mthd(dev, 0x9097, 0x08c4, 0x00000000);
60 nv_mthd(dev, 0x9097, 0x0904, 0x00000000);
61 nv_mthd(dev, 0x9097, 0x0944, 0x00000000);
62 nv_mthd(dev, 0x9097, 0x0984, 0x00000000);
63 nv_mthd(dev, 0x9097, 0x09c4, 0x00000000);
64 nv_mthd(dev, 0x9097, 0x0808, 0x00000400);
65 nv_mthd(dev, 0x9097, 0x0848, 0x00000400);
66 nv_mthd(dev, 0x9097, 0x0888, 0x00000400);
67 nv_mthd(dev, 0x9097, 0x08c8, 0x00000400);
68 nv_mthd(dev, 0x9097, 0x0908, 0x00000400);
69 nv_mthd(dev, 0x9097, 0x0948, 0x00000400);
70 nv_mthd(dev, 0x9097, 0x0988, 0x00000400);
71 nv_mthd(dev, 0x9097, 0x09c8, 0x00000400);
72 nv_mthd(dev, 0x9097, 0x080c, 0x00000300);
73 nv_mthd(dev, 0x9097, 0x084c, 0x00000300);
74 nv_mthd(dev, 0x9097, 0x088c, 0x00000300);
75 nv_mthd(dev, 0x9097, 0x08cc, 0x00000300);
76 nv_mthd(dev, 0x9097, 0x090c, 0x00000300);
77 nv_mthd(dev, 0x9097, 0x094c, 0x00000300);
78 nv_mthd(dev, 0x9097, 0x098c, 0x00000300);
79 nv_mthd(dev, 0x9097, 0x09cc, 0x00000300);
80 nv_mthd(dev, 0x9097, 0x0810, 0x000000cf);
81 nv_mthd(dev, 0x9097, 0x0850, 0x00000000);
82 nv_mthd(dev, 0x9097, 0x0890, 0x00000000);
83 nv_mthd(dev, 0x9097, 0x08d0, 0x00000000);
84 nv_mthd(dev, 0x9097, 0x0910, 0x00000000);
85 nv_mthd(dev, 0x9097, 0x0950, 0x00000000);
86 nv_mthd(dev, 0x9097, 0x0990, 0x00000000);
87 nv_mthd(dev, 0x9097, 0x09d0, 0x00000000);
88 nv_mthd(dev, 0x9097, 0x0814, 0x00000040);
89 nv_mthd(dev, 0x9097, 0x0854, 0x00000040);
90 nv_mthd(dev, 0x9097, 0x0894, 0x00000040);
91 nv_mthd(dev, 0x9097, 0x08d4, 0x00000040);
92 nv_mthd(dev, 0x9097, 0x0914, 0x00000040);
93 nv_mthd(dev, 0x9097, 0x0954, 0x00000040);
94 nv_mthd(dev, 0x9097, 0x0994, 0x00000040);
95 nv_mthd(dev, 0x9097, 0x09d4, 0x00000040);
96 nv_mthd(dev, 0x9097, 0x0818, 0x00000001);
97 nv_mthd(dev, 0x9097, 0x0858, 0x00000001);
98 nv_mthd(dev, 0x9097, 0x0898, 0x00000001);
99 nv_mthd(dev, 0x9097, 0x08d8, 0x00000001);
100 nv_mthd(dev, 0x9097, 0x0918, 0x00000001);
101 nv_mthd(dev, 0x9097, 0x0958, 0x00000001);
102 nv_mthd(dev, 0x9097, 0x0998, 0x00000001);
103 nv_mthd(dev, 0x9097, 0x09d8, 0x00000001);
104 nv_mthd(dev, 0x9097, 0x081c, 0x00000000);
105 nv_mthd(dev, 0x9097, 0x085c, 0x00000000);
106 nv_mthd(dev, 0x9097, 0x089c, 0x00000000);
107 nv_mthd(dev, 0x9097, 0x08dc, 0x00000000);
108 nv_mthd(dev, 0x9097, 0x091c, 0x00000000);
109 nv_mthd(dev, 0x9097, 0x095c, 0x00000000);
110 nv_mthd(dev, 0x9097, 0x099c, 0x00000000);
111 nv_mthd(dev, 0x9097, 0x09dc, 0x00000000);
112 nv_mthd(dev, 0x9097, 0x0820, 0x00000000);
113 nv_mthd(dev, 0x9097, 0x0860, 0x00000000);
114 nv_mthd(dev, 0x9097, 0x08a0, 0x00000000);
115 nv_mthd(dev, 0x9097, 0x08e0, 0x00000000);
116 nv_mthd(dev, 0x9097, 0x0920, 0x00000000);
117 nv_mthd(dev, 0x9097, 0x0960, 0x00000000);
118 nv_mthd(dev, 0x9097, 0x09a0, 0x00000000);
119 nv_mthd(dev, 0x9097, 0x09e0, 0x00000000);
120 nv_mthd(dev, 0x9097, 0x2700, 0x00000000);
121 nv_mthd(dev, 0x9097, 0x2720, 0x00000000);
122 nv_mthd(dev, 0x9097, 0x2740, 0x00000000);
123 nv_mthd(dev, 0x9097, 0x2760, 0x00000000);
124 nv_mthd(dev, 0x9097, 0x2780, 0x00000000);
125 nv_mthd(dev, 0x9097, 0x27a0, 0x00000000);
126 nv_mthd(dev, 0x9097, 0x27c0, 0x00000000);
127 nv_mthd(dev, 0x9097, 0x27e0, 0x00000000);
128 nv_mthd(dev, 0x9097, 0x2704, 0x00000000);
129 nv_mthd(dev, 0x9097, 0x2724, 0x00000000);
130 nv_mthd(dev, 0x9097, 0x2744, 0x00000000);
131 nv_mthd(dev, 0x9097, 0x2764, 0x00000000);
132 nv_mthd(dev, 0x9097, 0x2784, 0x00000000);
133 nv_mthd(dev, 0x9097, 0x27a4, 0x00000000);
134 nv_mthd(dev, 0x9097, 0x27c4, 0x00000000);
135 nv_mthd(dev, 0x9097, 0x27e4, 0x00000000);
136 nv_mthd(dev, 0x9097, 0x2708, 0x00000000);
137 nv_mthd(dev, 0x9097, 0x2728, 0x00000000);
138 nv_mthd(dev, 0x9097, 0x2748, 0x00000000);
139 nv_mthd(dev, 0x9097, 0x2768, 0x00000000);
140 nv_mthd(dev, 0x9097, 0x2788, 0x00000000);
141 nv_mthd(dev, 0x9097, 0x27a8, 0x00000000);
142 nv_mthd(dev, 0x9097, 0x27c8, 0x00000000);
143 nv_mthd(dev, 0x9097, 0x27e8, 0x00000000);
144 nv_mthd(dev, 0x9097, 0x270c, 0x00000000);
145 nv_mthd(dev, 0x9097, 0x272c, 0x00000000);
146 nv_mthd(dev, 0x9097, 0x274c, 0x00000000);
147 nv_mthd(dev, 0x9097, 0x276c, 0x00000000);
148 nv_mthd(dev, 0x9097, 0x278c, 0x00000000);
149 nv_mthd(dev, 0x9097, 0x27ac, 0x00000000);
150 nv_mthd(dev, 0x9097, 0x27cc, 0x00000000);
151 nv_mthd(dev, 0x9097, 0x27ec, 0x00000000);
152 nv_mthd(dev, 0x9097, 0x2710, 0x00014000);
153 nv_mthd(dev, 0x9097, 0x2730, 0x00014000);
154 nv_mthd(dev, 0x9097, 0x2750, 0x00014000);
155 nv_mthd(dev, 0x9097, 0x2770, 0x00014000);
156 nv_mthd(dev, 0x9097, 0x2790, 0x00014000);
157 nv_mthd(dev, 0x9097, 0x27b0, 0x00014000);
158 nv_mthd(dev, 0x9097, 0x27d0, 0x00014000);
159 nv_mthd(dev, 0x9097, 0x27f0, 0x00014000);
160 nv_mthd(dev, 0x9097, 0x2714, 0x00000040);
161 nv_mthd(dev, 0x9097, 0x2734, 0x00000040);
162 nv_mthd(dev, 0x9097, 0x2754, 0x00000040);
163 nv_mthd(dev, 0x9097, 0x2774, 0x00000040);
164 nv_mthd(dev, 0x9097, 0x2794, 0x00000040);
165 nv_mthd(dev, 0x9097, 0x27b4, 0x00000040);
166 nv_mthd(dev, 0x9097, 0x27d4, 0x00000040);
167 nv_mthd(dev, 0x9097, 0x27f4, 0x00000040);
168 nv_mthd(dev, 0x9097, 0x1c00, 0x00000000);
169 nv_mthd(dev, 0x9097, 0x1c10, 0x00000000);
170 nv_mthd(dev, 0x9097, 0x1c20, 0x00000000);
171 nv_mthd(dev, 0x9097, 0x1c30, 0x00000000);
172 nv_mthd(dev, 0x9097, 0x1c40, 0x00000000);
173 nv_mthd(dev, 0x9097, 0x1c50, 0x00000000);
174 nv_mthd(dev, 0x9097, 0x1c60, 0x00000000);
175 nv_mthd(dev, 0x9097, 0x1c70, 0x00000000);
176 nv_mthd(dev, 0x9097, 0x1c80, 0x00000000);
177 nv_mthd(dev, 0x9097, 0x1c90, 0x00000000);
178 nv_mthd(dev, 0x9097, 0x1ca0, 0x00000000);
179 nv_mthd(dev, 0x9097, 0x1cb0, 0x00000000);
180 nv_mthd(dev, 0x9097, 0x1cc0, 0x00000000);
181 nv_mthd(dev, 0x9097, 0x1cd0, 0x00000000);
182 nv_mthd(dev, 0x9097, 0x1ce0, 0x00000000);
183 nv_mthd(dev, 0x9097, 0x1cf0, 0x00000000);
184 nv_mthd(dev, 0x9097, 0x1c04, 0x00000000);
185 nv_mthd(dev, 0x9097, 0x1c14, 0x00000000);
186 nv_mthd(dev, 0x9097, 0x1c24, 0x00000000);
187 nv_mthd(dev, 0x9097, 0x1c34, 0x00000000);
188 nv_mthd(dev, 0x9097, 0x1c44, 0x00000000);
189 nv_mthd(dev, 0x9097, 0x1c54, 0x00000000);
190 nv_mthd(dev, 0x9097, 0x1c64, 0x00000000);
191 nv_mthd(dev, 0x9097, 0x1c74, 0x00000000);
192 nv_mthd(dev, 0x9097, 0x1c84, 0x00000000);
193 nv_mthd(dev, 0x9097, 0x1c94, 0x00000000);
194 nv_mthd(dev, 0x9097, 0x1ca4, 0x00000000);
195 nv_mthd(dev, 0x9097, 0x1cb4, 0x00000000);
196 nv_mthd(dev, 0x9097, 0x1cc4, 0x00000000);
197 nv_mthd(dev, 0x9097, 0x1cd4, 0x00000000);
198 nv_mthd(dev, 0x9097, 0x1ce4, 0x00000000);
199 nv_mthd(dev, 0x9097, 0x1cf4, 0x00000000);
200 nv_mthd(dev, 0x9097, 0x1c08, 0x00000000);
201 nv_mthd(dev, 0x9097, 0x1c18, 0x00000000);
202 nv_mthd(dev, 0x9097, 0x1c28, 0x00000000);
203 nv_mthd(dev, 0x9097, 0x1c38, 0x00000000);
204 nv_mthd(dev, 0x9097, 0x1c48, 0x00000000);
205 nv_mthd(dev, 0x9097, 0x1c58, 0x00000000);
206 nv_mthd(dev, 0x9097, 0x1c68, 0x00000000);
207 nv_mthd(dev, 0x9097, 0x1c78, 0x00000000);
208 nv_mthd(dev, 0x9097, 0x1c88, 0x00000000);
209 nv_mthd(dev, 0x9097, 0x1c98, 0x00000000);
210 nv_mthd(dev, 0x9097, 0x1ca8, 0x00000000);
211 nv_mthd(dev, 0x9097, 0x1cb8, 0x00000000);
212 nv_mthd(dev, 0x9097, 0x1cc8, 0x00000000);
213 nv_mthd(dev, 0x9097, 0x1cd8, 0x00000000);
214 nv_mthd(dev, 0x9097, 0x1ce8, 0x00000000);
215 nv_mthd(dev, 0x9097, 0x1cf8, 0x00000000);
216 nv_mthd(dev, 0x9097, 0x1c0c, 0x00000000);
217 nv_mthd(dev, 0x9097, 0x1c1c, 0x00000000);
218 nv_mthd(dev, 0x9097, 0x1c2c, 0x00000000);
219 nv_mthd(dev, 0x9097, 0x1c3c, 0x00000000);
220 nv_mthd(dev, 0x9097, 0x1c4c, 0x00000000);
221 nv_mthd(dev, 0x9097, 0x1c5c, 0x00000000);
222 nv_mthd(dev, 0x9097, 0x1c6c, 0x00000000);
223 nv_mthd(dev, 0x9097, 0x1c7c, 0x00000000);
224 nv_mthd(dev, 0x9097, 0x1c8c, 0x00000000);
225 nv_mthd(dev, 0x9097, 0x1c9c, 0x00000000);
226 nv_mthd(dev, 0x9097, 0x1cac, 0x00000000);
227 nv_mthd(dev, 0x9097, 0x1cbc, 0x00000000);
228 nv_mthd(dev, 0x9097, 0x1ccc, 0x00000000);
229 nv_mthd(dev, 0x9097, 0x1cdc, 0x00000000);
230 nv_mthd(dev, 0x9097, 0x1cec, 0x00000000);
231 nv_mthd(dev, 0x9097, 0x1cfc, 0x00000000);
232 nv_mthd(dev, 0x9097, 0x1d00, 0x00000000);
233 nv_mthd(dev, 0x9097, 0x1d10, 0x00000000);
234 nv_mthd(dev, 0x9097, 0x1d20, 0x00000000);
235 nv_mthd(dev, 0x9097, 0x1d30, 0x00000000);
236 nv_mthd(dev, 0x9097, 0x1d40, 0x00000000);
237 nv_mthd(dev, 0x9097, 0x1d50, 0x00000000);
238 nv_mthd(dev, 0x9097, 0x1d60, 0x00000000);
239 nv_mthd(dev, 0x9097, 0x1d70, 0x00000000);
240 nv_mthd(dev, 0x9097, 0x1d80, 0x00000000);
241 nv_mthd(dev, 0x9097, 0x1d90, 0x00000000);
242 nv_mthd(dev, 0x9097, 0x1da0, 0x00000000);
243 nv_mthd(dev, 0x9097, 0x1db0, 0x00000000);
244 nv_mthd(dev, 0x9097, 0x1dc0, 0x00000000);
245 nv_mthd(dev, 0x9097, 0x1dd0, 0x00000000);
246 nv_mthd(dev, 0x9097, 0x1de0, 0x00000000);
247 nv_mthd(dev, 0x9097, 0x1df0, 0x00000000);
248 nv_mthd(dev, 0x9097, 0x1d04, 0x00000000);
249 nv_mthd(dev, 0x9097, 0x1d14, 0x00000000);
250 nv_mthd(dev, 0x9097, 0x1d24, 0x00000000);
251 nv_mthd(dev, 0x9097, 0x1d34, 0x00000000);
252 nv_mthd(dev, 0x9097, 0x1d44, 0x00000000);
253 nv_mthd(dev, 0x9097, 0x1d54, 0x00000000);
254 nv_mthd(dev, 0x9097, 0x1d64, 0x00000000);
255 nv_mthd(dev, 0x9097, 0x1d74, 0x00000000);
256 nv_mthd(dev, 0x9097, 0x1d84, 0x00000000);
257 nv_mthd(dev, 0x9097, 0x1d94, 0x00000000);
258 nv_mthd(dev, 0x9097, 0x1da4, 0x00000000);
259 nv_mthd(dev, 0x9097, 0x1db4, 0x00000000);
260 nv_mthd(dev, 0x9097, 0x1dc4, 0x00000000);
261 nv_mthd(dev, 0x9097, 0x1dd4, 0x00000000);
262 nv_mthd(dev, 0x9097, 0x1de4, 0x00000000);
263 nv_mthd(dev, 0x9097, 0x1df4, 0x00000000);
264 nv_mthd(dev, 0x9097, 0x1d08, 0x00000000);
265 nv_mthd(dev, 0x9097, 0x1d18, 0x00000000);
266 nv_mthd(dev, 0x9097, 0x1d28, 0x00000000);
267 nv_mthd(dev, 0x9097, 0x1d38, 0x00000000);
268 nv_mthd(dev, 0x9097, 0x1d48, 0x00000000);
269 nv_mthd(dev, 0x9097, 0x1d58, 0x00000000);
270 nv_mthd(dev, 0x9097, 0x1d68, 0x00000000);
271 nv_mthd(dev, 0x9097, 0x1d78, 0x00000000);
272 nv_mthd(dev, 0x9097, 0x1d88, 0x00000000);
273 nv_mthd(dev, 0x9097, 0x1d98, 0x00000000);
274 nv_mthd(dev, 0x9097, 0x1da8, 0x00000000);
275 nv_mthd(dev, 0x9097, 0x1db8, 0x00000000);
276 nv_mthd(dev, 0x9097, 0x1dc8, 0x00000000);
277 nv_mthd(dev, 0x9097, 0x1dd8, 0x00000000);
278 nv_mthd(dev, 0x9097, 0x1de8, 0x00000000);
279 nv_mthd(dev, 0x9097, 0x1df8, 0x00000000);
280 nv_mthd(dev, 0x9097, 0x1d0c, 0x00000000);
281 nv_mthd(dev, 0x9097, 0x1d1c, 0x00000000);
282 nv_mthd(dev, 0x9097, 0x1d2c, 0x00000000);
283 nv_mthd(dev, 0x9097, 0x1d3c, 0x00000000);
284 nv_mthd(dev, 0x9097, 0x1d4c, 0x00000000);
285 nv_mthd(dev, 0x9097, 0x1d5c, 0x00000000);
286 nv_mthd(dev, 0x9097, 0x1d6c, 0x00000000);
287 nv_mthd(dev, 0x9097, 0x1d7c, 0x00000000);
288 nv_mthd(dev, 0x9097, 0x1d8c, 0x00000000);
289 nv_mthd(dev, 0x9097, 0x1d9c, 0x00000000);
290 nv_mthd(dev, 0x9097, 0x1dac, 0x00000000);
291 nv_mthd(dev, 0x9097, 0x1dbc, 0x00000000);
292 nv_mthd(dev, 0x9097, 0x1dcc, 0x00000000);
293 nv_mthd(dev, 0x9097, 0x1ddc, 0x00000000);
294 nv_mthd(dev, 0x9097, 0x1dec, 0x00000000);
295 nv_mthd(dev, 0x9097, 0x1dfc, 0x00000000);
296 nv_mthd(dev, 0x9097, 0x1f00, 0x00000000);
297 nv_mthd(dev, 0x9097, 0x1f08, 0x00000000);
298 nv_mthd(dev, 0x9097, 0x1f10, 0x00000000);
299 nv_mthd(dev, 0x9097, 0x1f18, 0x00000000);
300 nv_mthd(dev, 0x9097, 0x1f20, 0x00000000);
301 nv_mthd(dev, 0x9097, 0x1f28, 0x00000000);
302 nv_mthd(dev, 0x9097, 0x1f30, 0x00000000);
303 nv_mthd(dev, 0x9097, 0x1f38, 0x00000000);
304 nv_mthd(dev, 0x9097, 0x1f40, 0x00000000);
305 nv_mthd(dev, 0x9097, 0x1f48, 0x00000000);
306 nv_mthd(dev, 0x9097, 0x1f50, 0x00000000);
307 nv_mthd(dev, 0x9097, 0x1f58, 0x00000000);
308 nv_mthd(dev, 0x9097, 0x1f60, 0x00000000);
309 nv_mthd(dev, 0x9097, 0x1f68, 0x00000000);
310 nv_mthd(dev, 0x9097, 0x1f70, 0x00000000);
311 nv_mthd(dev, 0x9097, 0x1f78, 0x00000000);
312 nv_mthd(dev, 0x9097, 0x1f04, 0x00000000);
313 nv_mthd(dev, 0x9097, 0x1f0c, 0x00000000);
314 nv_mthd(dev, 0x9097, 0x1f14, 0x00000000);
315 nv_mthd(dev, 0x9097, 0x1f1c, 0x00000000);
316 nv_mthd(dev, 0x9097, 0x1f24, 0x00000000);
317 nv_mthd(dev, 0x9097, 0x1f2c, 0x00000000);
318 nv_mthd(dev, 0x9097, 0x1f34, 0x00000000);
319 nv_mthd(dev, 0x9097, 0x1f3c, 0x00000000);
320 nv_mthd(dev, 0x9097, 0x1f44, 0x00000000);
321 nv_mthd(dev, 0x9097, 0x1f4c, 0x00000000);
322 nv_mthd(dev, 0x9097, 0x1f54, 0x00000000);
323 nv_mthd(dev, 0x9097, 0x1f5c, 0x00000000);
324 nv_mthd(dev, 0x9097, 0x1f64, 0x00000000);
325 nv_mthd(dev, 0x9097, 0x1f6c, 0x00000000);
326 nv_mthd(dev, 0x9097, 0x1f74, 0x00000000);
327 nv_mthd(dev, 0x9097, 0x1f7c, 0x00000000);
328 nv_mthd(dev, 0x9097, 0x1f80, 0x00000000);
329 nv_mthd(dev, 0x9097, 0x1f88, 0x00000000);
330 nv_mthd(dev, 0x9097, 0x1f90, 0x00000000);
331 nv_mthd(dev, 0x9097, 0x1f98, 0x00000000);
332 nv_mthd(dev, 0x9097, 0x1fa0, 0x00000000);
333 nv_mthd(dev, 0x9097, 0x1fa8, 0x00000000);
334 nv_mthd(dev, 0x9097, 0x1fb0, 0x00000000);
335 nv_mthd(dev, 0x9097, 0x1fb8, 0x00000000);
336 nv_mthd(dev, 0x9097, 0x1fc0, 0x00000000);
337 nv_mthd(dev, 0x9097, 0x1fc8, 0x00000000);
338 nv_mthd(dev, 0x9097, 0x1fd0, 0x00000000);
339 nv_mthd(dev, 0x9097, 0x1fd8, 0x00000000);
340 nv_mthd(dev, 0x9097, 0x1fe0, 0x00000000);
341 nv_mthd(dev, 0x9097, 0x1fe8, 0x00000000);
342 nv_mthd(dev, 0x9097, 0x1ff0, 0x00000000);
343 nv_mthd(dev, 0x9097, 0x1ff8, 0x00000000);
344 nv_mthd(dev, 0x9097, 0x1f84, 0x00000000);
345 nv_mthd(dev, 0x9097, 0x1f8c, 0x00000000);
346 nv_mthd(dev, 0x9097, 0x1f94, 0x00000000);
347 nv_mthd(dev, 0x9097, 0x1f9c, 0x00000000);
348 nv_mthd(dev, 0x9097, 0x1fa4, 0x00000000);
349 nv_mthd(dev, 0x9097, 0x1fac, 0x00000000);
350 nv_mthd(dev, 0x9097, 0x1fb4, 0x00000000);
351 nv_mthd(dev, 0x9097, 0x1fbc, 0x00000000);
352 nv_mthd(dev, 0x9097, 0x1fc4, 0x00000000);
353 nv_mthd(dev, 0x9097, 0x1fcc, 0x00000000);
354 nv_mthd(dev, 0x9097, 0x1fd4, 0x00000000);
355 nv_mthd(dev, 0x9097, 0x1fdc, 0x00000000);
356 nv_mthd(dev, 0x9097, 0x1fe4, 0x00000000);
357 nv_mthd(dev, 0x9097, 0x1fec, 0x00000000);
358 nv_mthd(dev, 0x9097, 0x1ff4, 0x00000000);
359 nv_mthd(dev, 0x9097, 0x1ffc, 0x00000000);
360 nv_mthd(dev, 0x9097, 0x2200, 0x00000022);
361 nv_mthd(dev, 0x9097, 0x2210, 0x00000022);
362 nv_mthd(dev, 0x9097, 0x2220, 0x00000022);
363 nv_mthd(dev, 0x9097, 0x2230, 0x00000022);
364 nv_mthd(dev, 0x9097, 0x2240, 0x00000022);
365 nv_mthd(dev, 0x9097, 0x2000, 0x00000000);
366 nv_mthd(dev, 0x9097, 0x2040, 0x00000011);
367 nv_mthd(dev, 0x9097, 0x2080, 0x00000020);
368 nv_mthd(dev, 0x9097, 0x20c0, 0x00000030);
369 nv_mthd(dev, 0x9097, 0x2100, 0x00000040);
370 nv_mthd(dev, 0x9097, 0x2140, 0x00000051);
371 nv_mthd(dev, 0x9097, 0x200c, 0x00000001);
372 nv_mthd(dev, 0x9097, 0x204c, 0x00000001);
373 nv_mthd(dev, 0x9097, 0x208c, 0x00000001);
374 nv_mthd(dev, 0x9097, 0x20cc, 0x00000001);
375 nv_mthd(dev, 0x9097, 0x210c, 0x00000001);
376 nv_mthd(dev, 0x9097, 0x214c, 0x00000001);
377 nv_mthd(dev, 0x9097, 0x2010, 0x00000000);
378 nv_mthd(dev, 0x9097, 0x2050, 0x00000000);
379 nv_mthd(dev, 0x9097, 0x2090, 0x00000001);
380 nv_mthd(dev, 0x9097, 0x20d0, 0x00000002);
381 nv_mthd(dev, 0x9097, 0x2110, 0x00000003);
382 nv_mthd(dev, 0x9097, 0x2150, 0x00000004);
383 nv_mthd(dev, 0x9097, 0x0380, 0x00000000);
384 nv_mthd(dev, 0x9097, 0x03a0, 0x00000000);
385 nv_mthd(dev, 0x9097, 0x03c0, 0x00000000);
386 nv_mthd(dev, 0x9097, 0x03e0, 0x00000000);
387 nv_mthd(dev, 0x9097, 0x0384, 0x00000000);
388 nv_mthd(dev, 0x9097, 0x03a4, 0x00000000);
389 nv_mthd(dev, 0x9097, 0x03c4, 0x00000000);
390 nv_mthd(dev, 0x9097, 0x03e4, 0x00000000);
391 nv_mthd(dev, 0x9097, 0x0388, 0x00000000);
392 nv_mthd(dev, 0x9097, 0x03a8, 0x00000000);
393 nv_mthd(dev, 0x9097, 0x03c8, 0x00000000);
394 nv_mthd(dev, 0x9097, 0x03e8, 0x00000000);
395 nv_mthd(dev, 0x9097, 0x038c, 0x00000000);
396 nv_mthd(dev, 0x9097, 0x03ac, 0x00000000);
397 nv_mthd(dev, 0x9097, 0x03cc, 0x00000000);
398 nv_mthd(dev, 0x9097, 0x03ec, 0x00000000);
399 nv_mthd(dev, 0x9097, 0x0700, 0x00000000);
400 nv_mthd(dev, 0x9097, 0x0710, 0x00000000);
401 nv_mthd(dev, 0x9097, 0x0720, 0x00000000);
402 nv_mthd(dev, 0x9097, 0x0730, 0x00000000);
403 nv_mthd(dev, 0x9097, 0x0704, 0x00000000);
404 nv_mthd(dev, 0x9097, 0x0714, 0x00000000);
405 nv_mthd(dev, 0x9097, 0x0724, 0x00000000);
406 nv_mthd(dev, 0x9097, 0x0734, 0x00000000);
407 nv_mthd(dev, 0x9097, 0x0708, 0x00000000);
408 nv_mthd(dev, 0x9097, 0x0718, 0x00000000);
409 nv_mthd(dev, 0x9097, 0x0728, 0x00000000);
410 nv_mthd(dev, 0x9097, 0x0738, 0x00000000);
411 nv_mthd(dev, 0x9097, 0x2800, 0x00000000);
412 nv_mthd(dev, 0x9097, 0x2804, 0x00000000);
413 nv_mthd(dev, 0x9097, 0x2808, 0x00000000);
414 nv_mthd(dev, 0x9097, 0x280c, 0x00000000);
415 nv_mthd(dev, 0x9097, 0x2810, 0x00000000);
416 nv_mthd(dev, 0x9097, 0x2814, 0x00000000);
417 nv_mthd(dev, 0x9097, 0x2818, 0x00000000);
418 nv_mthd(dev, 0x9097, 0x281c, 0x00000000);
419 nv_mthd(dev, 0x9097, 0x2820, 0x00000000);
420 nv_mthd(dev, 0x9097, 0x2824, 0x00000000);
421 nv_mthd(dev, 0x9097, 0x2828, 0x00000000);
422 nv_mthd(dev, 0x9097, 0x282c, 0x00000000);
423 nv_mthd(dev, 0x9097, 0x2830, 0x00000000);
424 nv_mthd(dev, 0x9097, 0x2834, 0x00000000);
425 nv_mthd(dev, 0x9097, 0x2838, 0x00000000);
426 nv_mthd(dev, 0x9097, 0x283c, 0x00000000);
427 nv_mthd(dev, 0x9097, 0x2840, 0x00000000);
428 nv_mthd(dev, 0x9097, 0x2844, 0x00000000);
429 nv_mthd(dev, 0x9097, 0x2848, 0x00000000);
430 nv_mthd(dev, 0x9097, 0x284c, 0x00000000);
431 nv_mthd(dev, 0x9097, 0x2850, 0x00000000);
432 nv_mthd(dev, 0x9097, 0x2854, 0x00000000);
433 nv_mthd(dev, 0x9097, 0x2858, 0x00000000);
434 nv_mthd(dev, 0x9097, 0x285c, 0x00000000);
435 nv_mthd(dev, 0x9097, 0x2860, 0x00000000);
436 nv_mthd(dev, 0x9097, 0x2864, 0x00000000);
437 nv_mthd(dev, 0x9097, 0x2868, 0x00000000);
438 nv_mthd(dev, 0x9097, 0x286c, 0x00000000);
439 nv_mthd(dev, 0x9097, 0x2870, 0x00000000);
440 nv_mthd(dev, 0x9097, 0x2874, 0x00000000);
441 nv_mthd(dev, 0x9097, 0x2878, 0x00000000);
442 nv_mthd(dev, 0x9097, 0x287c, 0x00000000);
443 nv_mthd(dev, 0x9097, 0x2880, 0x00000000);
444 nv_mthd(dev, 0x9097, 0x2884, 0x00000000);
445 nv_mthd(dev, 0x9097, 0x2888, 0x00000000);
446 nv_mthd(dev, 0x9097, 0x288c, 0x00000000);
447 nv_mthd(dev, 0x9097, 0x2890, 0x00000000);
448 nv_mthd(dev, 0x9097, 0x2894, 0x00000000);
449 nv_mthd(dev, 0x9097, 0x2898, 0x00000000);
450 nv_mthd(dev, 0x9097, 0x289c, 0x00000000);
451 nv_mthd(dev, 0x9097, 0x28a0, 0x00000000);
452 nv_mthd(dev, 0x9097, 0x28a4, 0x00000000);
453 nv_mthd(dev, 0x9097, 0x28a8, 0x00000000);
454 nv_mthd(dev, 0x9097, 0x28ac, 0x00000000);
455 nv_mthd(dev, 0x9097, 0x28b0, 0x00000000);
456 nv_mthd(dev, 0x9097, 0x28b4, 0x00000000);
457 nv_mthd(dev, 0x9097, 0x28b8, 0x00000000);
458 nv_mthd(dev, 0x9097, 0x28bc, 0x00000000);
459 nv_mthd(dev, 0x9097, 0x28c0, 0x00000000);
460 nv_mthd(dev, 0x9097, 0x28c4, 0x00000000);
461 nv_mthd(dev, 0x9097, 0x28c8, 0x00000000);
462 nv_mthd(dev, 0x9097, 0x28cc, 0x00000000);
463 nv_mthd(dev, 0x9097, 0x28d0, 0x00000000);
464 nv_mthd(dev, 0x9097, 0x28d4, 0x00000000);
465 nv_mthd(dev, 0x9097, 0x28d8, 0x00000000);
466 nv_mthd(dev, 0x9097, 0x28dc, 0x00000000);
467 nv_mthd(dev, 0x9097, 0x28e0, 0x00000000);
468 nv_mthd(dev, 0x9097, 0x28e4, 0x00000000);
469 nv_mthd(dev, 0x9097, 0x28e8, 0x00000000);
470 nv_mthd(dev, 0x9097, 0x28ec, 0x00000000);
471 nv_mthd(dev, 0x9097, 0x28f0, 0x00000000);
472 nv_mthd(dev, 0x9097, 0x28f4, 0x00000000);
473 nv_mthd(dev, 0x9097, 0x28f8, 0x00000000);
474 nv_mthd(dev, 0x9097, 0x28fc, 0x00000000);
475 nv_mthd(dev, 0x9097, 0x2900, 0x00000000);
476 nv_mthd(dev, 0x9097, 0x2904, 0x00000000);
477 nv_mthd(dev, 0x9097, 0x2908, 0x00000000);
478 nv_mthd(dev, 0x9097, 0x290c, 0x00000000);
479 nv_mthd(dev, 0x9097, 0x2910, 0x00000000);
480 nv_mthd(dev, 0x9097, 0x2914, 0x00000000);
481 nv_mthd(dev, 0x9097, 0x2918, 0x00000000);
482 nv_mthd(dev, 0x9097, 0x291c, 0x00000000);
483 nv_mthd(dev, 0x9097, 0x2920, 0x00000000);
484 nv_mthd(dev, 0x9097, 0x2924, 0x00000000);
485 nv_mthd(dev, 0x9097, 0x2928, 0x00000000);
486 nv_mthd(dev, 0x9097, 0x292c, 0x00000000);
487 nv_mthd(dev, 0x9097, 0x2930, 0x00000000);
488 nv_mthd(dev, 0x9097, 0x2934, 0x00000000);
489 nv_mthd(dev, 0x9097, 0x2938, 0x00000000);
490 nv_mthd(dev, 0x9097, 0x293c, 0x00000000);
491 nv_mthd(dev, 0x9097, 0x2940, 0x00000000);
492 nv_mthd(dev, 0x9097, 0x2944, 0x00000000);
493 nv_mthd(dev, 0x9097, 0x2948, 0x00000000);
494 nv_mthd(dev, 0x9097, 0x294c, 0x00000000);
495 nv_mthd(dev, 0x9097, 0x2950, 0x00000000);
496 nv_mthd(dev, 0x9097, 0x2954, 0x00000000);
497 nv_mthd(dev, 0x9097, 0x2958, 0x00000000);
498 nv_mthd(dev, 0x9097, 0x295c, 0x00000000);
499 nv_mthd(dev, 0x9097, 0x2960, 0x00000000);
500 nv_mthd(dev, 0x9097, 0x2964, 0x00000000);
501 nv_mthd(dev, 0x9097, 0x2968, 0x00000000);
502 nv_mthd(dev, 0x9097, 0x296c, 0x00000000);
503 nv_mthd(dev, 0x9097, 0x2970, 0x00000000);
504 nv_mthd(dev, 0x9097, 0x2974, 0x00000000);
505 nv_mthd(dev, 0x9097, 0x2978, 0x00000000);
506 nv_mthd(dev, 0x9097, 0x297c, 0x00000000);
507 nv_mthd(dev, 0x9097, 0x2980, 0x00000000);
508 nv_mthd(dev, 0x9097, 0x2984, 0x00000000);
509 nv_mthd(dev, 0x9097, 0x2988, 0x00000000);
510 nv_mthd(dev, 0x9097, 0x298c, 0x00000000);
511 nv_mthd(dev, 0x9097, 0x2990, 0x00000000);
512 nv_mthd(dev, 0x9097, 0x2994, 0x00000000);
513 nv_mthd(dev, 0x9097, 0x2998, 0x00000000);
514 nv_mthd(dev, 0x9097, 0x299c, 0x00000000);
515 nv_mthd(dev, 0x9097, 0x29a0, 0x00000000);
516 nv_mthd(dev, 0x9097, 0x29a4, 0x00000000);
517 nv_mthd(dev, 0x9097, 0x29a8, 0x00000000);
518 nv_mthd(dev, 0x9097, 0x29ac, 0x00000000);
519 nv_mthd(dev, 0x9097, 0x29b0, 0x00000000);
520 nv_mthd(dev, 0x9097, 0x29b4, 0x00000000);
521 nv_mthd(dev, 0x9097, 0x29b8, 0x00000000);
522 nv_mthd(dev, 0x9097, 0x29bc, 0x00000000);
523 nv_mthd(dev, 0x9097, 0x29c0, 0x00000000);
524 nv_mthd(dev, 0x9097, 0x29c4, 0x00000000);
525 nv_mthd(dev, 0x9097, 0x29c8, 0x00000000);
526 nv_mthd(dev, 0x9097, 0x29cc, 0x00000000);
527 nv_mthd(dev, 0x9097, 0x29d0, 0x00000000);
528 nv_mthd(dev, 0x9097, 0x29d4, 0x00000000);
529 nv_mthd(dev, 0x9097, 0x29d8, 0x00000000);
530 nv_mthd(dev, 0x9097, 0x29dc, 0x00000000);
531 nv_mthd(dev, 0x9097, 0x29e0, 0x00000000);
532 nv_mthd(dev, 0x9097, 0x29e4, 0x00000000);
533 nv_mthd(dev, 0x9097, 0x29e8, 0x00000000);
534 nv_mthd(dev, 0x9097, 0x29ec, 0x00000000);
535 nv_mthd(dev, 0x9097, 0x29f0, 0x00000000);
536 nv_mthd(dev, 0x9097, 0x29f4, 0x00000000);
537 nv_mthd(dev, 0x9097, 0x29f8, 0x00000000);
538 nv_mthd(dev, 0x9097, 0x29fc, 0x00000000);
539 nv_mthd(dev, 0x9097, 0x0a00, 0x00000000);
540 nv_mthd(dev, 0x9097, 0x0a20, 0x00000000);
541 nv_mthd(dev, 0x9097, 0x0a40, 0x00000000);
542 nv_mthd(dev, 0x9097, 0x0a60, 0x00000000);
543 nv_mthd(dev, 0x9097, 0x0a80, 0x00000000);
544 nv_mthd(dev, 0x9097, 0x0aa0, 0x00000000);
545 nv_mthd(dev, 0x9097, 0x0ac0, 0x00000000);
546 nv_mthd(dev, 0x9097, 0x0ae0, 0x00000000);
547 nv_mthd(dev, 0x9097, 0x0b00, 0x00000000);
548 nv_mthd(dev, 0x9097, 0x0b20, 0x00000000);
549 nv_mthd(dev, 0x9097, 0x0b40, 0x00000000);
550 nv_mthd(dev, 0x9097, 0x0b60, 0x00000000);
551 nv_mthd(dev, 0x9097, 0x0b80, 0x00000000);
552 nv_mthd(dev, 0x9097, 0x0ba0, 0x00000000);
553 nv_mthd(dev, 0x9097, 0x0bc0, 0x00000000);
554 nv_mthd(dev, 0x9097, 0x0be0, 0x00000000);
555 nv_mthd(dev, 0x9097, 0x0a04, 0x00000000);
556 nv_mthd(dev, 0x9097, 0x0a24, 0x00000000);
557 nv_mthd(dev, 0x9097, 0x0a44, 0x00000000);
558 nv_mthd(dev, 0x9097, 0x0a64, 0x00000000);
559 nv_mthd(dev, 0x9097, 0x0a84, 0x00000000);
560 nv_mthd(dev, 0x9097, 0x0aa4, 0x00000000);
561 nv_mthd(dev, 0x9097, 0x0ac4, 0x00000000);
562 nv_mthd(dev, 0x9097, 0x0ae4, 0x00000000);
563 nv_mthd(dev, 0x9097, 0x0b04, 0x00000000);
564 nv_mthd(dev, 0x9097, 0x0b24, 0x00000000);
565 nv_mthd(dev, 0x9097, 0x0b44, 0x00000000);
566 nv_mthd(dev, 0x9097, 0x0b64, 0x00000000);
567 nv_mthd(dev, 0x9097, 0x0b84, 0x00000000);
568 nv_mthd(dev, 0x9097, 0x0ba4, 0x00000000);
569 nv_mthd(dev, 0x9097, 0x0bc4, 0x00000000);
570 nv_mthd(dev, 0x9097, 0x0be4, 0x00000000);
571 nv_mthd(dev, 0x9097, 0x0a08, 0x00000000);
572 nv_mthd(dev, 0x9097, 0x0a28, 0x00000000);
573 nv_mthd(dev, 0x9097, 0x0a48, 0x00000000);
574 nv_mthd(dev, 0x9097, 0x0a68, 0x00000000);
575 nv_mthd(dev, 0x9097, 0x0a88, 0x00000000);
576 nv_mthd(dev, 0x9097, 0x0aa8, 0x00000000);
577 nv_mthd(dev, 0x9097, 0x0ac8, 0x00000000);
578 nv_mthd(dev, 0x9097, 0x0ae8, 0x00000000);
579 nv_mthd(dev, 0x9097, 0x0b08, 0x00000000);
580 nv_mthd(dev, 0x9097, 0x0b28, 0x00000000);
581 nv_mthd(dev, 0x9097, 0x0b48, 0x00000000);
582 nv_mthd(dev, 0x9097, 0x0b68, 0x00000000);
583 nv_mthd(dev, 0x9097, 0x0b88, 0x00000000);
584 nv_mthd(dev, 0x9097, 0x0ba8, 0x00000000);
585 nv_mthd(dev, 0x9097, 0x0bc8, 0x00000000);
586 nv_mthd(dev, 0x9097, 0x0be8, 0x00000000);
587 nv_mthd(dev, 0x9097, 0x0a0c, 0x00000000);
588 nv_mthd(dev, 0x9097, 0x0a2c, 0x00000000);
589 nv_mthd(dev, 0x9097, 0x0a4c, 0x00000000);
590 nv_mthd(dev, 0x9097, 0x0a6c, 0x00000000);
591 nv_mthd(dev, 0x9097, 0x0a8c, 0x00000000);
592 nv_mthd(dev, 0x9097, 0x0aac, 0x00000000);
593 nv_mthd(dev, 0x9097, 0x0acc, 0x00000000);
594 nv_mthd(dev, 0x9097, 0x0aec, 0x00000000);
595 nv_mthd(dev, 0x9097, 0x0b0c, 0x00000000);
596 nv_mthd(dev, 0x9097, 0x0b2c, 0x00000000);
597 nv_mthd(dev, 0x9097, 0x0b4c, 0x00000000);
598 nv_mthd(dev, 0x9097, 0x0b6c, 0x00000000);
599 nv_mthd(dev, 0x9097, 0x0b8c, 0x00000000);
600 nv_mthd(dev, 0x9097, 0x0bac, 0x00000000);
601 nv_mthd(dev, 0x9097, 0x0bcc, 0x00000000);
602 nv_mthd(dev, 0x9097, 0x0bec, 0x00000000);
603 nv_mthd(dev, 0x9097, 0x0a10, 0x00000000);
604 nv_mthd(dev, 0x9097, 0x0a30, 0x00000000);
605 nv_mthd(dev, 0x9097, 0x0a50, 0x00000000);
606 nv_mthd(dev, 0x9097, 0x0a70, 0x00000000);
607 nv_mthd(dev, 0x9097, 0x0a90, 0x00000000);
608 nv_mthd(dev, 0x9097, 0x0ab0, 0x00000000);
609 nv_mthd(dev, 0x9097, 0x0ad0, 0x00000000);
610 nv_mthd(dev, 0x9097, 0x0af0, 0x00000000);
611 nv_mthd(dev, 0x9097, 0x0b10, 0x00000000);
612 nv_mthd(dev, 0x9097, 0x0b30, 0x00000000);
613 nv_mthd(dev, 0x9097, 0x0b50, 0x00000000);
614 nv_mthd(dev, 0x9097, 0x0b70, 0x00000000);
615 nv_mthd(dev, 0x9097, 0x0b90, 0x00000000);
616 nv_mthd(dev, 0x9097, 0x0bb0, 0x00000000);
617 nv_mthd(dev, 0x9097, 0x0bd0, 0x00000000);
618 nv_mthd(dev, 0x9097, 0x0bf0, 0x00000000);
619 nv_mthd(dev, 0x9097, 0x0a14, 0x00000000);
620 nv_mthd(dev, 0x9097, 0x0a34, 0x00000000);
621 nv_mthd(dev, 0x9097, 0x0a54, 0x00000000);
622 nv_mthd(dev, 0x9097, 0x0a74, 0x00000000);
623 nv_mthd(dev, 0x9097, 0x0a94, 0x00000000);
624 nv_mthd(dev, 0x9097, 0x0ab4, 0x00000000);
625 nv_mthd(dev, 0x9097, 0x0ad4, 0x00000000);
626 nv_mthd(dev, 0x9097, 0x0af4, 0x00000000);
627 nv_mthd(dev, 0x9097, 0x0b14, 0x00000000);
628 nv_mthd(dev, 0x9097, 0x0b34, 0x00000000);
629 nv_mthd(dev, 0x9097, 0x0b54, 0x00000000);
630 nv_mthd(dev, 0x9097, 0x0b74, 0x00000000);
631 nv_mthd(dev, 0x9097, 0x0b94, 0x00000000);
632 nv_mthd(dev, 0x9097, 0x0bb4, 0x00000000);
633 nv_mthd(dev, 0x9097, 0x0bd4, 0x00000000);
634 nv_mthd(dev, 0x9097, 0x0bf4, 0x00000000);
635 nv_mthd(dev, 0x9097, 0x0c00, 0x00000000);
636 nv_mthd(dev, 0x9097, 0x0c10, 0x00000000);
637 nv_mthd(dev, 0x9097, 0x0c20, 0x00000000);
638 nv_mthd(dev, 0x9097, 0x0c30, 0x00000000);
639 nv_mthd(dev, 0x9097, 0x0c40, 0x00000000);
640 nv_mthd(dev, 0x9097, 0x0c50, 0x00000000);
641 nv_mthd(dev, 0x9097, 0x0c60, 0x00000000);
642 nv_mthd(dev, 0x9097, 0x0c70, 0x00000000);
643 nv_mthd(dev, 0x9097, 0x0c80, 0x00000000);
644 nv_mthd(dev, 0x9097, 0x0c90, 0x00000000);
645 nv_mthd(dev, 0x9097, 0x0ca0, 0x00000000);
646 nv_mthd(dev, 0x9097, 0x0cb0, 0x00000000);
647 nv_mthd(dev, 0x9097, 0x0cc0, 0x00000000);
648 nv_mthd(dev, 0x9097, 0x0cd0, 0x00000000);
649 nv_mthd(dev, 0x9097, 0x0ce0, 0x00000000);
650 nv_mthd(dev, 0x9097, 0x0cf0, 0x00000000);
651 nv_mthd(dev, 0x9097, 0x0c04, 0x00000000);
652 nv_mthd(dev, 0x9097, 0x0c14, 0x00000000);
653 nv_mthd(dev, 0x9097, 0x0c24, 0x00000000);
654 nv_mthd(dev, 0x9097, 0x0c34, 0x00000000);
655 nv_mthd(dev, 0x9097, 0x0c44, 0x00000000);
656 nv_mthd(dev, 0x9097, 0x0c54, 0x00000000);
657 nv_mthd(dev, 0x9097, 0x0c64, 0x00000000);
658 nv_mthd(dev, 0x9097, 0x0c74, 0x00000000);
659 nv_mthd(dev, 0x9097, 0x0c84, 0x00000000);
660 nv_mthd(dev, 0x9097, 0x0c94, 0x00000000);
661 nv_mthd(dev, 0x9097, 0x0ca4, 0x00000000);
662 nv_mthd(dev, 0x9097, 0x0cb4, 0x00000000);
663 nv_mthd(dev, 0x9097, 0x0cc4, 0x00000000);
664 nv_mthd(dev, 0x9097, 0x0cd4, 0x00000000);
665 nv_mthd(dev, 0x9097, 0x0ce4, 0x00000000);
666 nv_mthd(dev, 0x9097, 0x0cf4, 0x00000000);
667 nv_mthd(dev, 0x9097, 0x0c08, 0x00000000);
668 nv_mthd(dev, 0x9097, 0x0c18, 0x00000000);
669 nv_mthd(dev, 0x9097, 0x0c28, 0x00000000);
670 nv_mthd(dev, 0x9097, 0x0c38, 0x00000000);
671 nv_mthd(dev, 0x9097, 0x0c48, 0x00000000);
672 nv_mthd(dev, 0x9097, 0x0c58, 0x00000000);
673 nv_mthd(dev, 0x9097, 0x0c68, 0x00000000);
674 nv_mthd(dev, 0x9097, 0x0c78, 0x00000000);
675 nv_mthd(dev, 0x9097, 0x0c88, 0x00000000);
676 nv_mthd(dev, 0x9097, 0x0c98, 0x00000000);
677 nv_mthd(dev, 0x9097, 0x0ca8, 0x00000000);
678 nv_mthd(dev, 0x9097, 0x0cb8, 0x00000000);
679 nv_mthd(dev, 0x9097, 0x0cc8, 0x00000000);
680 nv_mthd(dev, 0x9097, 0x0cd8, 0x00000000);
681 nv_mthd(dev, 0x9097, 0x0ce8, 0x00000000);
682 nv_mthd(dev, 0x9097, 0x0cf8, 0x00000000);
683 nv_mthd(dev, 0x9097, 0x0c0c, 0x3f800000);
684 nv_mthd(dev, 0x9097, 0x0c1c, 0x3f800000);
685 nv_mthd(dev, 0x9097, 0x0c2c, 0x3f800000);
686 nv_mthd(dev, 0x9097, 0x0c3c, 0x3f800000);
687 nv_mthd(dev, 0x9097, 0x0c4c, 0x3f800000);
688 nv_mthd(dev, 0x9097, 0x0c5c, 0x3f800000);
689 nv_mthd(dev, 0x9097, 0x0c6c, 0x3f800000);
690 nv_mthd(dev, 0x9097, 0x0c7c, 0x3f800000);
691 nv_mthd(dev, 0x9097, 0x0c8c, 0x3f800000);
692 nv_mthd(dev, 0x9097, 0x0c9c, 0x3f800000);
693 nv_mthd(dev, 0x9097, 0x0cac, 0x3f800000);
694 nv_mthd(dev, 0x9097, 0x0cbc, 0x3f800000);
695 nv_mthd(dev, 0x9097, 0x0ccc, 0x3f800000);
696 nv_mthd(dev, 0x9097, 0x0cdc, 0x3f800000);
697 nv_mthd(dev, 0x9097, 0x0cec, 0x3f800000);
698 nv_mthd(dev, 0x9097, 0x0cfc, 0x3f800000);
699 nv_mthd(dev, 0x9097, 0x0d00, 0xffff0000);
700 nv_mthd(dev, 0x9097, 0x0d08, 0xffff0000);
701 nv_mthd(dev, 0x9097, 0x0d10, 0xffff0000);
702 nv_mthd(dev, 0x9097, 0x0d18, 0xffff0000);
703 nv_mthd(dev, 0x9097, 0x0d20, 0xffff0000);
704 nv_mthd(dev, 0x9097, 0x0d28, 0xffff0000);
705 nv_mthd(dev, 0x9097, 0x0d30, 0xffff0000);
706 nv_mthd(dev, 0x9097, 0x0d38, 0xffff0000);
707 nv_mthd(dev, 0x9097, 0x0d04, 0xffff0000);
708 nv_mthd(dev, 0x9097, 0x0d0c, 0xffff0000);
709 nv_mthd(dev, 0x9097, 0x0d14, 0xffff0000);
710 nv_mthd(dev, 0x9097, 0x0d1c, 0xffff0000);
711 nv_mthd(dev, 0x9097, 0x0d24, 0xffff0000);
712 nv_mthd(dev, 0x9097, 0x0d2c, 0xffff0000);
713 nv_mthd(dev, 0x9097, 0x0d34, 0xffff0000);
714 nv_mthd(dev, 0x9097, 0x0d3c, 0xffff0000);
715 nv_mthd(dev, 0x9097, 0x0e00, 0x00000000);
716 nv_mthd(dev, 0x9097, 0x0e10, 0x00000000);
717 nv_mthd(dev, 0x9097, 0x0e20, 0x00000000);
718 nv_mthd(dev, 0x9097, 0x0e30, 0x00000000);
719 nv_mthd(dev, 0x9097, 0x0e40, 0x00000000);
720 nv_mthd(dev, 0x9097, 0x0e50, 0x00000000);
721 nv_mthd(dev, 0x9097, 0x0e60, 0x00000000);
722 nv_mthd(dev, 0x9097, 0x0e70, 0x00000000);
723 nv_mthd(dev, 0x9097, 0x0e80, 0x00000000);
724 nv_mthd(dev, 0x9097, 0x0e90, 0x00000000);
725 nv_mthd(dev, 0x9097, 0x0ea0, 0x00000000);
726 nv_mthd(dev, 0x9097, 0x0eb0, 0x00000000);
727 nv_mthd(dev, 0x9097, 0x0ec0, 0x00000000);
728 nv_mthd(dev, 0x9097, 0x0ed0, 0x00000000);
729 nv_mthd(dev, 0x9097, 0x0ee0, 0x00000000);
730 nv_mthd(dev, 0x9097, 0x0ef0, 0x00000000);
731 nv_mthd(dev, 0x9097, 0x0e04, 0xffff0000);
732 nv_mthd(dev, 0x9097, 0x0e14, 0xffff0000);
733 nv_mthd(dev, 0x9097, 0x0e24, 0xffff0000);
734 nv_mthd(dev, 0x9097, 0x0e34, 0xffff0000);
735 nv_mthd(dev, 0x9097, 0x0e44, 0xffff0000);
736 nv_mthd(dev, 0x9097, 0x0e54, 0xffff0000);
737 nv_mthd(dev, 0x9097, 0x0e64, 0xffff0000);
738 nv_mthd(dev, 0x9097, 0x0e74, 0xffff0000);
739 nv_mthd(dev, 0x9097, 0x0e84, 0xffff0000);
740 nv_mthd(dev, 0x9097, 0x0e94, 0xffff0000);
741 nv_mthd(dev, 0x9097, 0x0ea4, 0xffff0000);
742 nv_mthd(dev, 0x9097, 0x0eb4, 0xffff0000);
743 nv_mthd(dev, 0x9097, 0x0ec4, 0xffff0000);
744 nv_mthd(dev, 0x9097, 0x0ed4, 0xffff0000);
745 nv_mthd(dev, 0x9097, 0x0ee4, 0xffff0000);
746 nv_mthd(dev, 0x9097, 0x0ef4, 0xffff0000);
747 nv_mthd(dev, 0x9097, 0x0e08, 0xffff0000);
748 nv_mthd(dev, 0x9097, 0x0e18, 0xffff0000);
749 nv_mthd(dev, 0x9097, 0x0e28, 0xffff0000);
750 nv_mthd(dev, 0x9097, 0x0e38, 0xffff0000);
751 nv_mthd(dev, 0x9097, 0x0e48, 0xffff0000);
752 nv_mthd(dev, 0x9097, 0x0e58, 0xffff0000);
753 nv_mthd(dev, 0x9097, 0x0e68, 0xffff0000);
754 nv_mthd(dev, 0x9097, 0x0e78, 0xffff0000);
755 nv_mthd(dev, 0x9097, 0x0e88, 0xffff0000);
756 nv_mthd(dev, 0x9097, 0x0e98, 0xffff0000);
757 nv_mthd(dev, 0x9097, 0x0ea8, 0xffff0000);
758 nv_mthd(dev, 0x9097, 0x0eb8, 0xffff0000);
759 nv_mthd(dev, 0x9097, 0x0ec8, 0xffff0000);
760 nv_mthd(dev, 0x9097, 0x0ed8, 0xffff0000);
761 nv_mthd(dev, 0x9097, 0x0ee8, 0xffff0000);
762 nv_mthd(dev, 0x9097, 0x0ef8, 0xffff0000);
763 nv_mthd(dev, 0x9097, 0x0d40, 0x00000000);
764 nv_mthd(dev, 0x9097, 0x0d48, 0x00000000);
765 nv_mthd(dev, 0x9097, 0x0d50, 0x00000000);
766 nv_mthd(dev, 0x9097, 0x0d58, 0x00000000);
767 nv_mthd(dev, 0x9097, 0x0d44, 0x00000000);
768 nv_mthd(dev, 0x9097, 0x0d4c, 0x00000000);
769 nv_mthd(dev, 0x9097, 0x0d54, 0x00000000);
770 nv_mthd(dev, 0x9097, 0x0d5c, 0x00000000);
771 nv_mthd(dev, 0x9097, 0x1e00, 0x00000001);
772 nv_mthd(dev, 0x9097, 0x1e20, 0x00000001);
773 nv_mthd(dev, 0x9097, 0x1e40, 0x00000001);
774 nv_mthd(dev, 0x9097, 0x1e60, 0x00000001);
775 nv_mthd(dev, 0x9097, 0x1e80, 0x00000001);
776 nv_mthd(dev, 0x9097, 0x1ea0, 0x00000001);
777 nv_mthd(dev, 0x9097, 0x1ec0, 0x00000001);
778 nv_mthd(dev, 0x9097, 0x1ee0, 0x00000001);
779 nv_mthd(dev, 0x9097, 0x1e04, 0x00000001);
780 nv_mthd(dev, 0x9097, 0x1e24, 0x00000001);
781 nv_mthd(dev, 0x9097, 0x1e44, 0x00000001);
782 nv_mthd(dev, 0x9097, 0x1e64, 0x00000001);
783 nv_mthd(dev, 0x9097, 0x1e84, 0x00000001);
784 nv_mthd(dev, 0x9097, 0x1ea4, 0x00000001);
785 nv_mthd(dev, 0x9097, 0x1ec4, 0x00000001);
786 nv_mthd(dev, 0x9097, 0x1ee4, 0x00000001);
787 nv_mthd(dev, 0x9097, 0x1e08, 0x00000002);
788 nv_mthd(dev, 0x9097, 0x1e28, 0x00000002);
789 nv_mthd(dev, 0x9097, 0x1e48, 0x00000002);
790 nv_mthd(dev, 0x9097, 0x1e68, 0x00000002);
791 nv_mthd(dev, 0x9097, 0x1e88, 0x00000002);
792 nv_mthd(dev, 0x9097, 0x1ea8, 0x00000002);
793 nv_mthd(dev, 0x9097, 0x1ec8, 0x00000002);
794 nv_mthd(dev, 0x9097, 0x1ee8, 0x00000002);
795 nv_mthd(dev, 0x9097, 0x1e0c, 0x00000001);
796 nv_mthd(dev, 0x9097, 0x1e2c, 0x00000001);
797 nv_mthd(dev, 0x9097, 0x1e4c, 0x00000001);
798 nv_mthd(dev, 0x9097, 0x1e6c, 0x00000001);
799 nv_mthd(dev, 0x9097, 0x1e8c, 0x00000001);
800 nv_mthd(dev, 0x9097, 0x1eac, 0x00000001);
801 nv_mthd(dev, 0x9097, 0x1ecc, 0x00000001);
802 nv_mthd(dev, 0x9097, 0x1eec, 0x00000001);
803 nv_mthd(dev, 0x9097, 0x1e10, 0x00000001);
804 nv_mthd(dev, 0x9097, 0x1e30, 0x00000001);
805 nv_mthd(dev, 0x9097, 0x1e50, 0x00000001);
806 nv_mthd(dev, 0x9097, 0x1e70, 0x00000001);
807 nv_mthd(dev, 0x9097, 0x1e90, 0x00000001);
808 nv_mthd(dev, 0x9097, 0x1eb0, 0x00000001);
809 nv_mthd(dev, 0x9097, 0x1ed0, 0x00000001);
810 nv_mthd(dev, 0x9097, 0x1ef0, 0x00000001);
811 nv_mthd(dev, 0x9097, 0x1e14, 0x00000002);
812 nv_mthd(dev, 0x9097, 0x1e34, 0x00000002);
813 nv_mthd(dev, 0x9097, 0x1e54, 0x00000002);
814 nv_mthd(dev, 0x9097, 0x1e74, 0x00000002);
815 nv_mthd(dev, 0x9097, 0x1e94, 0x00000002);
816 nv_mthd(dev, 0x9097, 0x1eb4, 0x00000002);
817 nv_mthd(dev, 0x9097, 0x1ed4, 0x00000002);
818 nv_mthd(dev, 0x9097, 0x1ef4, 0x00000002);
819 nv_mthd(dev, 0x9097, 0x1e18, 0x00000001);
820 nv_mthd(dev, 0x9097, 0x1e38, 0x00000001);
821 nv_mthd(dev, 0x9097, 0x1e58, 0x00000001);
822 nv_mthd(dev, 0x9097, 0x1e78, 0x00000001);
823 nv_mthd(dev, 0x9097, 0x1e98, 0x00000001);
824 nv_mthd(dev, 0x9097, 0x1eb8, 0x00000001);
825 nv_mthd(dev, 0x9097, 0x1ed8, 0x00000001);
826 nv_mthd(dev, 0x9097, 0x1ef8, 0x00000001);
827 nv_mthd(dev, 0x9097, 0x3400, 0x00000000);
828 nv_mthd(dev, 0x9097, 0x3404, 0x00000000);
829 nv_mthd(dev, 0x9097, 0x3408, 0x00000000);
830 nv_mthd(dev, 0x9097, 0x340c, 0x00000000);
831 nv_mthd(dev, 0x9097, 0x3410, 0x00000000);
832 nv_mthd(dev, 0x9097, 0x3414, 0x00000000);
833 nv_mthd(dev, 0x9097, 0x3418, 0x00000000);
834 nv_mthd(dev, 0x9097, 0x341c, 0x00000000);
835 nv_mthd(dev, 0x9097, 0x3420, 0x00000000);
836 nv_mthd(dev, 0x9097, 0x3424, 0x00000000);
837 nv_mthd(dev, 0x9097, 0x3428, 0x00000000);
838 nv_mthd(dev, 0x9097, 0x342c, 0x00000000);
839 nv_mthd(dev, 0x9097, 0x3430, 0x00000000);
840 nv_mthd(dev, 0x9097, 0x3434, 0x00000000);
841 nv_mthd(dev, 0x9097, 0x3438, 0x00000000);
842 nv_mthd(dev, 0x9097, 0x343c, 0x00000000);
843 nv_mthd(dev, 0x9097, 0x3440, 0x00000000);
844 nv_mthd(dev, 0x9097, 0x3444, 0x00000000);
845 nv_mthd(dev, 0x9097, 0x3448, 0x00000000);
846 nv_mthd(dev, 0x9097, 0x344c, 0x00000000);
847 nv_mthd(dev, 0x9097, 0x3450, 0x00000000);
848 nv_mthd(dev, 0x9097, 0x3454, 0x00000000);
849 nv_mthd(dev, 0x9097, 0x3458, 0x00000000);
850 nv_mthd(dev, 0x9097, 0x345c, 0x00000000);
851 nv_mthd(dev, 0x9097, 0x3460, 0x00000000);
852 nv_mthd(dev, 0x9097, 0x3464, 0x00000000);
853 nv_mthd(dev, 0x9097, 0x3468, 0x00000000);
854 nv_mthd(dev, 0x9097, 0x346c, 0x00000000);
855 nv_mthd(dev, 0x9097, 0x3470, 0x00000000);
856 nv_mthd(dev, 0x9097, 0x3474, 0x00000000);
857 nv_mthd(dev, 0x9097, 0x3478, 0x00000000);
858 nv_mthd(dev, 0x9097, 0x347c, 0x00000000);
859 nv_mthd(dev, 0x9097, 0x3480, 0x00000000);
860 nv_mthd(dev, 0x9097, 0x3484, 0x00000000);
861 nv_mthd(dev, 0x9097, 0x3488, 0x00000000);
862 nv_mthd(dev, 0x9097, 0x348c, 0x00000000);
863 nv_mthd(dev, 0x9097, 0x3490, 0x00000000);
864 nv_mthd(dev, 0x9097, 0x3494, 0x00000000);
865 nv_mthd(dev, 0x9097, 0x3498, 0x00000000);
866 nv_mthd(dev, 0x9097, 0x349c, 0x00000000);
867 nv_mthd(dev, 0x9097, 0x34a0, 0x00000000);
868 nv_mthd(dev, 0x9097, 0x34a4, 0x00000000);
869 nv_mthd(dev, 0x9097, 0x34a8, 0x00000000);
870 nv_mthd(dev, 0x9097, 0x34ac, 0x00000000);
871 nv_mthd(dev, 0x9097, 0x34b0, 0x00000000);
872 nv_mthd(dev, 0x9097, 0x34b4, 0x00000000);
873 nv_mthd(dev, 0x9097, 0x34b8, 0x00000000);
874 nv_mthd(dev, 0x9097, 0x34bc, 0x00000000);
875 nv_mthd(dev, 0x9097, 0x34c0, 0x00000000);
876 nv_mthd(dev, 0x9097, 0x34c4, 0x00000000);
877 nv_mthd(dev, 0x9097, 0x34c8, 0x00000000);
878 nv_mthd(dev, 0x9097, 0x34cc, 0x00000000);
879 nv_mthd(dev, 0x9097, 0x34d0, 0x00000000);
880 nv_mthd(dev, 0x9097, 0x34d4, 0x00000000);
881 nv_mthd(dev, 0x9097, 0x34d8, 0x00000000);
882 nv_mthd(dev, 0x9097, 0x34dc, 0x00000000);
883 nv_mthd(dev, 0x9097, 0x34e0, 0x00000000);
884 nv_mthd(dev, 0x9097, 0x34e4, 0x00000000);
885 nv_mthd(dev, 0x9097, 0x34e8, 0x00000000);
886 nv_mthd(dev, 0x9097, 0x34ec, 0x00000000);
887 nv_mthd(dev, 0x9097, 0x34f0, 0x00000000);
888 nv_mthd(dev, 0x9097, 0x34f4, 0x00000000);
889 nv_mthd(dev, 0x9097, 0x34f8, 0x00000000);
890 nv_mthd(dev, 0x9097, 0x34fc, 0x00000000);
891 nv_mthd(dev, 0x9097, 0x3500, 0x00000000);
892 nv_mthd(dev, 0x9097, 0x3504, 0x00000000);
893 nv_mthd(dev, 0x9097, 0x3508, 0x00000000);
894 nv_mthd(dev, 0x9097, 0x350c, 0x00000000);
895 nv_mthd(dev, 0x9097, 0x3510, 0x00000000);
896 nv_mthd(dev, 0x9097, 0x3514, 0x00000000);
897 nv_mthd(dev, 0x9097, 0x3518, 0x00000000);
898 nv_mthd(dev, 0x9097, 0x351c, 0x00000000);
899 nv_mthd(dev, 0x9097, 0x3520, 0x00000000);
900 nv_mthd(dev, 0x9097, 0x3524, 0x00000000);
901 nv_mthd(dev, 0x9097, 0x3528, 0x00000000);
902 nv_mthd(dev, 0x9097, 0x352c, 0x00000000);
903 nv_mthd(dev, 0x9097, 0x3530, 0x00000000);
904 nv_mthd(dev, 0x9097, 0x3534, 0x00000000);
905 nv_mthd(dev, 0x9097, 0x3538, 0x00000000);
906 nv_mthd(dev, 0x9097, 0x353c, 0x00000000);
907 nv_mthd(dev, 0x9097, 0x3540, 0x00000000);
908 nv_mthd(dev, 0x9097, 0x3544, 0x00000000);
909 nv_mthd(dev, 0x9097, 0x3548, 0x00000000);
910 nv_mthd(dev, 0x9097, 0x354c, 0x00000000);
911 nv_mthd(dev, 0x9097, 0x3550, 0x00000000);
912 nv_mthd(dev, 0x9097, 0x3554, 0x00000000);
913 nv_mthd(dev, 0x9097, 0x3558, 0x00000000);
914 nv_mthd(dev, 0x9097, 0x355c, 0x00000000);
915 nv_mthd(dev, 0x9097, 0x3560, 0x00000000);
916 nv_mthd(dev, 0x9097, 0x3564, 0x00000000);
917 nv_mthd(dev, 0x9097, 0x3568, 0x00000000);
918 nv_mthd(dev, 0x9097, 0x356c, 0x00000000);
919 nv_mthd(dev, 0x9097, 0x3570, 0x00000000);
920 nv_mthd(dev, 0x9097, 0x3574, 0x00000000);
921 nv_mthd(dev, 0x9097, 0x3578, 0x00000000);
922 nv_mthd(dev, 0x9097, 0x357c, 0x00000000);
923 nv_mthd(dev, 0x9097, 0x3580, 0x00000000);
924 nv_mthd(dev, 0x9097, 0x3584, 0x00000000);
925 nv_mthd(dev, 0x9097, 0x3588, 0x00000000);
926 nv_mthd(dev, 0x9097, 0x358c, 0x00000000);
927 nv_mthd(dev, 0x9097, 0x3590, 0x00000000);
928 nv_mthd(dev, 0x9097, 0x3594, 0x00000000);
929 nv_mthd(dev, 0x9097, 0x3598, 0x00000000);
930 nv_mthd(dev, 0x9097, 0x359c, 0x00000000);
931 nv_mthd(dev, 0x9097, 0x35a0, 0x00000000);
932 nv_mthd(dev, 0x9097, 0x35a4, 0x00000000);
933 nv_mthd(dev, 0x9097, 0x35a8, 0x00000000);
934 nv_mthd(dev, 0x9097, 0x35ac, 0x00000000);
935 nv_mthd(dev, 0x9097, 0x35b0, 0x00000000);
936 nv_mthd(dev, 0x9097, 0x35b4, 0x00000000);
937 nv_mthd(dev, 0x9097, 0x35b8, 0x00000000);
938 nv_mthd(dev, 0x9097, 0x35bc, 0x00000000);
939 nv_mthd(dev, 0x9097, 0x35c0, 0x00000000);
940 nv_mthd(dev, 0x9097, 0x35c4, 0x00000000);
941 nv_mthd(dev, 0x9097, 0x35c8, 0x00000000);
942 nv_mthd(dev, 0x9097, 0x35cc, 0x00000000);
943 nv_mthd(dev, 0x9097, 0x35d0, 0x00000000);
944 nv_mthd(dev, 0x9097, 0x35d4, 0x00000000);
945 nv_mthd(dev, 0x9097, 0x35d8, 0x00000000);
946 nv_mthd(dev, 0x9097, 0x35dc, 0x00000000);
947 nv_mthd(dev, 0x9097, 0x35e0, 0x00000000);
948 nv_mthd(dev, 0x9097, 0x35e4, 0x00000000);
949 nv_mthd(dev, 0x9097, 0x35e8, 0x00000000);
950 nv_mthd(dev, 0x9097, 0x35ec, 0x00000000);
951 nv_mthd(dev, 0x9097, 0x35f0, 0x00000000);
952 nv_mthd(dev, 0x9097, 0x35f4, 0x00000000);
953 nv_mthd(dev, 0x9097, 0x35f8, 0x00000000);
954 nv_mthd(dev, 0x9097, 0x35fc, 0x00000000);
955 nv_mthd(dev, 0x9097, 0x030c, 0x00000001);
956 nv_mthd(dev, 0x9097, 0x1944, 0x00000000);
957 nv_mthd(dev, 0x9097, 0x1514, 0x00000000);
958 nv_mthd(dev, 0x9097, 0x0d68, 0x0000ffff);
959 nv_mthd(dev, 0x9097, 0x121c, 0x0fac6881);
960 nv_mthd(dev, 0x9097, 0x0fac, 0x00000001);
961 nv_mthd(dev, 0x9097, 0x1538, 0x00000001);
962 nv_mthd(dev, 0x9097, 0x0fe0, 0x00000000);
963 nv_mthd(dev, 0x9097, 0x0fe4, 0x00000000);
964 nv_mthd(dev, 0x9097, 0x0fe8, 0x00000014);
965 nv_mthd(dev, 0x9097, 0x0fec, 0x00000040);
966 nv_mthd(dev, 0x9097, 0x0ff0, 0x00000000);
967 nv_mthd(dev, 0x9097, 0x179c, 0x00000000);
968 nv_mthd(dev, 0x9097, 0x1228, 0x00000400);
969 nv_mthd(dev, 0x9097, 0x122c, 0x00000300);
970 nv_mthd(dev, 0x9097, 0x1230, 0x00010001);
971 nv_mthd(dev, 0x9097, 0x07f8, 0x00000000);
972 nv_mthd(dev, 0x9097, 0x15b4, 0x00000001);
973 nv_mthd(dev, 0x9097, 0x15cc, 0x00000000);
974 nv_mthd(dev, 0x9097, 0x1534, 0x00000000);
975 nv_mthd(dev, 0x9097, 0x0fb0, 0x00000000);
976 nv_mthd(dev, 0x9097, 0x15d0, 0x00000000);
977 nv_mthd(dev, 0x9097, 0x153c, 0x00000000);
978 nv_mthd(dev, 0x9097, 0x16b4, 0x00000003);
979 nv_mthd(dev, 0x9097, 0x0fbc, 0x0000ffff);
980 nv_mthd(dev, 0x9097, 0x0fc0, 0x0000ffff);
981 nv_mthd(dev, 0x9097, 0x0fc4, 0x0000ffff);
982 nv_mthd(dev, 0x9097, 0x0fc8, 0x0000ffff);
983 nv_mthd(dev, 0x9097, 0x0df8, 0x00000000);
984 nv_mthd(dev, 0x9097, 0x0dfc, 0x00000000);
985 nv_mthd(dev, 0x9097, 0x1948, 0x00000000);
986 nv_mthd(dev, 0x9097, 0x1970, 0x00000001);
987 nv_mthd(dev, 0x9097, 0x161c, 0x000009f0);
988 nv_mthd(dev, 0x9097, 0x0dcc, 0x00000010);
989 nv_mthd(dev, 0x9097, 0x163c, 0x00000000);
990 nv_mthd(dev, 0x9097, 0x15e4, 0x00000000);
991 nv_mthd(dev, 0x9097, 0x1160, 0x25e00040);
992 nv_mthd(dev, 0x9097, 0x1164, 0x25e00040);
993 nv_mthd(dev, 0x9097, 0x1168, 0x25e00040);
994 nv_mthd(dev, 0x9097, 0x116c, 0x25e00040);
995 nv_mthd(dev, 0x9097, 0x1170, 0x25e00040);
996 nv_mthd(dev, 0x9097, 0x1174, 0x25e00040);
997 nv_mthd(dev, 0x9097, 0x1178, 0x25e00040);
998 nv_mthd(dev, 0x9097, 0x117c, 0x25e00040);
999 nv_mthd(dev, 0x9097, 0x1180, 0x25e00040);
1000 nv_mthd(dev, 0x9097, 0x1184, 0x25e00040);
1001 nv_mthd(dev, 0x9097, 0x1188, 0x25e00040);
1002 nv_mthd(dev, 0x9097, 0x118c, 0x25e00040);
1003 nv_mthd(dev, 0x9097, 0x1190, 0x25e00040);
1004 nv_mthd(dev, 0x9097, 0x1194, 0x25e00040);
1005 nv_mthd(dev, 0x9097, 0x1198, 0x25e00040);
1006 nv_mthd(dev, 0x9097, 0x119c, 0x25e00040);
1007 nv_mthd(dev, 0x9097, 0x11a0, 0x25e00040);
1008 nv_mthd(dev, 0x9097, 0x11a4, 0x25e00040);
1009 nv_mthd(dev, 0x9097, 0x11a8, 0x25e00040);
1010 nv_mthd(dev, 0x9097, 0x11ac, 0x25e00040);
1011 nv_mthd(dev, 0x9097, 0x11b0, 0x25e00040);
1012 nv_mthd(dev, 0x9097, 0x11b4, 0x25e00040);
1013 nv_mthd(dev, 0x9097, 0x11b8, 0x25e00040);
1014 nv_mthd(dev, 0x9097, 0x11bc, 0x25e00040);
1015 nv_mthd(dev, 0x9097, 0x11c0, 0x25e00040);
1016 nv_mthd(dev, 0x9097, 0x11c4, 0x25e00040);
1017 nv_mthd(dev, 0x9097, 0x11c8, 0x25e00040);
1018 nv_mthd(dev, 0x9097, 0x11cc, 0x25e00040);
1019 nv_mthd(dev, 0x9097, 0x11d0, 0x25e00040);
1020 nv_mthd(dev, 0x9097, 0x11d4, 0x25e00040);
1021 nv_mthd(dev, 0x9097, 0x11d8, 0x25e00040);
1022 nv_mthd(dev, 0x9097, 0x11dc, 0x25e00040);
1023 nv_mthd(dev, 0x9097, 0x1880, 0x00000000);
1024 nv_mthd(dev, 0x9097, 0x1884, 0x00000000);
1025 nv_mthd(dev, 0x9097, 0x1888, 0x00000000);
1026 nv_mthd(dev, 0x9097, 0x188c, 0x00000000);
1027 nv_mthd(dev, 0x9097, 0x1890, 0x00000000);
1028 nv_mthd(dev, 0x9097, 0x1894, 0x00000000);
1029 nv_mthd(dev, 0x9097, 0x1898, 0x00000000);
1030 nv_mthd(dev, 0x9097, 0x189c, 0x00000000);
1031 nv_mthd(dev, 0x9097, 0x18a0, 0x00000000);
1032 nv_mthd(dev, 0x9097, 0x18a4, 0x00000000);
1033 nv_mthd(dev, 0x9097, 0x18a8, 0x00000000);
1034 nv_mthd(dev, 0x9097, 0x18ac, 0x00000000);
1035 nv_mthd(dev, 0x9097, 0x18b0, 0x00000000);
1036 nv_mthd(dev, 0x9097, 0x18b4, 0x00000000);
1037 nv_mthd(dev, 0x9097, 0x18b8, 0x00000000);
1038 nv_mthd(dev, 0x9097, 0x18bc, 0x00000000);
1039 nv_mthd(dev, 0x9097, 0x18c0, 0x00000000);
1040 nv_mthd(dev, 0x9097, 0x18c4, 0x00000000);
1041 nv_mthd(dev, 0x9097, 0x18c8, 0x00000000);
1042 nv_mthd(dev, 0x9097, 0x18cc, 0x00000000);
1043 nv_mthd(dev, 0x9097, 0x18d0, 0x00000000);
1044 nv_mthd(dev, 0x9097, 0x18d4, 0x00000000);
1045 nv_mthd(dev, 0x9097, 0x18d8, 0x00000000);
1046 nv_mthd(dev, 0x9097, 0x18dc, 0x00000000);
1047 nv_mthd(dev, 0x9097, 0x18e0, 0x00000000);
1048 nv_mthd(dev, 0x9097, 0x18e4, 0x00000000);
1049 nv_mthd(dev, 0x9097, 0x18e8, 0x00000000);
1050 nv_mthd(dev, 0x9097, 0x18ec, 0x00000000);
1051 nv_mthd(dev, 0x9097, 0x18f0, 0x00000000);
1052 nv_mthd(dev, 0x9097, 0x18f4, 0x00000000);
1053 nv_mthd(dev, 0x9097, 0x18f8, 0x00000000);
1054 nv_mthd(dev, 0x9097, 0x18fc, 0x00000000);
1055 nv_mthd(dev, 0x9097, 0x0f84, 0x00000000);
1056 nv_mthd(dev, 0x9097, 0x0f88, 0x00000000);
1057 nv_mthd(dev, 0x9097, 0x17c8, 0x00000000);
1058 nv_mthd(dev, 0x9097, 0x17cc, 0x00000000);
1059 nv_mthd(dev, 0x9097, 0x17d0, 0x000000ff);
1060 nv_mthd(dev, 0x9097, 0x17d4, 0xffffffff);
1061 nv_mthd(dev, 0x9097, 0x17d8, 0x00000002);
1062 nv_mthd(dev, 0x9097, 0x17dc, 0x00000000);
1063 nv_mthd(dev, 0x9097, 0x15f4, 0x00000000);
1064 nv_mthd(dev, 0x9097, 0x15f8, 0x00000000);
1065 nv_mthd(dev, 0x9097, 0x1434, 0x00000000);
1066 nv_mthd(dev, 0x9097, 0x1438, 0x00000000);
1067 nv_mthd(dev, 0x9097, 0x0d74, 0x00000000);
1068 nv_mthd(dev, 0x9097, 0x0dec, 0x00000001);
1069 nv_mthd(dev, 0x9097, 0x13a4, 0x00000000);
1070 nv_mthd(dev, 0x9097, 0x1318, 0x00000001);
1071 nv_mthd(dev, 0x9097, 0x1644, 0x00000000);
1072 nv_mthd(dev, 0x9097, 0x0748, 0x00000000);
1073 nv_mthd(dev, 0x9097, 0x0de8, 0x00000000);
1074 nv_mthd(dev, 0x9097, 0x1648, 0x00000000);
1075 nv_mthd(dev, 0x9097, 0x12a4, 0x00000000);
1076 nv_mthd(dev, 0x9097, 0x1120, 0x00000000);
1077 nv_mthd(dev, 0x9097, 0x1124, 0x00000000);
1078 nv_mthd(dev, 0x9097, 0x1128, 0x00000000);
1079 nv_mthd(dev, 0x9097, 0x112c, 0x00000000);
1080 nv_mthd(dev, 0x9097, 0x1118, 0x00000000);
1081 nv_mthd(dev, 0x9097, 0x164c, 0x00000000);
1082 nv_mthd(dev, 0x9097, 0x1658, 0x00000000);
1083 nv_mthd(dev, 0x9097, 0x1910, 0x00000290);
1084 nv_mthd(dev, 0x9097, 0x1518, 0x00000000);
1085 nv_mthd(dev, 0x9097, 0x165c, 0x00000001);
1086 nv_mthd(dev, 0x9097, 0x1520, 0x00000000);
1087 nv_mthd(dev, 0x9097, 0x1604, 0x00000000);
1088 nv_mthd(dev, 0x9097, 0x1570, 0x00000000);
1089 nv_mthd(dev, 0x9097, 0x13b0, 0x3f800000);
1090 nv_mthd(dev, 0x9097, 0x13b4, 0x3f800000);
1091 nv_mthd(dev, 0x9097, 0x020c, 0x00000000);
1092 nv_mthd(dev, 0x9097, 0x1670, 0x30201000);
1093 nv_mthd(dev, 0x9097, 0x1674, 0x70605040);
1094 nv_mthd(dev, 0x9097, 0x1678, 0xb8a89888);
1095 nv_mthd(dev, 0x9097, 0x167c, 0xf8e8d8c8);
1096 nv_mthd(dev, 0x9097, 0x166c, 0x00000000);
1097 nv_mthd(dev, 0x9097, 0x1680, 0x00ffff00);
1098 nv_mthd(dev, 0x9097, 0x12d0, 0x00000003);
1099 nv_mthd(dev, 0x9097, 0x12d4, 0x00000002);
1100 nv_mthd(dev, 0x9097, 0x1684, 0x00000000);
1101 nv_mthd(dev, 0x9097, 0x1688, 0x00000000);
1102 nv_mthd(dev, 0x9097, 0x0dac, 0x00001b02);
1103 nv_mthd(dev, 0x9097, 0x0db0, 0x00001b02);
1104 nv_mthd(dev, 0x9097, 0x0db4, 0x00000000);
1105 nv_mthd(dev, 0x9097, 0x168c, 0x00000000);
1106 nv_mthd(dev, 0x9097, 0x15bc, 0x00000000);
1107 nv_mthd(dev, 0x9097, 0x156c, 0x00000000);
1108 nv_mthd(dev, 0x9097, 0x187c, 0x00000000);
1109 nv_mthd(dev, 0x9097, 0x1110, 0x00000001);
1110 nv_mthd(dev, 0x9097, 0x0dc0, 0x00000000);
1111 nv_mthd(dev, 0x9097, 0x0dc4, 0x00000000);
1112 nv_mthd(dev, 0x9097, 0x0dc8, 0x00000000);
1113 nv_mthd(dev, 0x9097, 0x1234, 0x00000000);
1114 nv_mthd(dev, 0x9097, 0x1690, 0x00000000);
1115 nv_mthd(dev, 0x9097, 0x12ac, 0x00000001);
1116 nv_mthd(dev, 0x9097, 0x02c4, 0x00000000);
1117 nv_mthd(dev, 0x9097, 0x0790, 0x00000000);
1118 nv_mthd(dev, 0x9097, 0x0794, 0x00000000);
1119 nv_mthd(dev, 0x9097, 0x0798, 0x00000000);
1120 nv_mthd(dev, 0x9097, 0x079c, 0x00000000);
1121 nv_mthd(dev, 0x9097, 0x07a0, 0x00000000);
1122 nv_mthd(dev, 0x9097, 0x077c, 0x00000000);
1123 nv_mthd(dev, 0x9097, 0x1000, 0x00000010);
1124 nv_mthd(dev, 0x9097, 0x10fc, 0x00000000);
1125 nv_mthd(dev, 0x9097, 0x1290, 0x00000000);
1126 nv_mthd(dev, 0x9097, 0x0218, 0x00000010);
1127 nv_mthd(dev, 0x9097, 0x12d8, 0x00000000);
1128 nv_mthd(dev, 0x9097, 0x12dc, 0x00000010);
1129 nv_mthd(dev, 0x9097, 0x0d94, 0x00000001);
1130 nv_mthd(dev, 0x9097, 0x155c, 0x00000000);
1131 nv_mthd(dev, 0x9097, 0x1560, 0x00000000);
1132 nv_mthd(dev, 0x9097, 0x1564, 0x00001fff);
1133 nv_mthd(dev, 0x9097, 0x1574, 0x00000000);
1134 nv_mthd(dev, 0x9097, 0x1578, 0x00000000);
1135 nv_mthd(dev, 0x9097, 0x157c, 0x003fffff);
1136 nv_mthd(dev, 0x9097, 0x1354, 0x00000000);
1137 nv_mthd(dev, 0x9097, 0x1664, 0x00000000);
1138 nv_mthd(dev, 0x9097, 0x1610, 0x00000012);
1139 nv_mthd(dev, 0x9097, 0x1608, 0x00000000);
1140 nv_mthd(dev, 0x9097, 0x160c, 0x00000000);
1141 nv_mthd(dev, 0x9097, 0x162c, 0x00000003);
1142 nv_mthd(dev, 0x9097, 0x0210, 0x00000000);
1143 nv_mthd(dev, 0x9097, 0x0320, 0x00000000);
1144 nv_mthd(dev, 0x9097, 0x0324, 0x3f800000);
1145 nv_mthd(dev, 0x9097, 0x0328, 0x3f800000);
1146 nv_mthd(dev, 0x9097, 0x032c, 0x3f800000);
1147 nv_mthd(dev, 0x9097, 0x0330, 0x3f800000);
1148 nv_mthd(dev, 0x9097, 0x0334, 0x3f800000);
1149 nv_mthd(dev, 0x9097, 0x0338, 0x3f800000);
1150 nv_mthd(dev, 0x9097, 0x0750, 0x00000000);
1151 nv_mthd(dev, 0x9097, 0x0760, 0x39291909);
1152 nv_mthd(dev, 0x9097, 0x0764, 0x79695949);
1153 nv_mthd(dev, 0x9097, 0x0768, 0xb9a99989);
1154 nv_mthd(dev, 0x9097, 0x076c, 0xf9e9d9c9);
1155 nv_mthd(dev, 0x9097, 0x0770, 0x30201000);
1156 nv_mthd(dev, 0x9097, 0x0774, 0x70605040);
1157 nv_mthd(dev, 0x9097, 0x0778, 0x00009080);
1158 nv_mthd(dev, 0x9097, 0x0780, 0x39291909);
1159 nv_mthd(dev, 0x9097, 0x0784, 0x79695949);
1160 nv_mthd(dev, 0x9097, 0x0788, 0xb9a99989);
1161 nv_mthd(dev, 0x9097, 0x078c, 0xf9e9d9c9);
1162 nv_mthd(dev, 0x9097, 0x07d0, 0x30201000);
1163 nv_mthd(dev, 0x9097, 0x07d4, 0x70605040);
1164 nv_mthd(dev, 0x9097, 0x07d8, 0x00009080);
1165 nv_mthd(dev, 0x9097, 0x037c, 0x00000001);
1166 nv_mthd(dev, 0x9097, 0x0740, 0x00000000);
1167 nv_mthd(dev, 0x9097, 0x0744, 0x00000000);
1168 nv_mthd(dev, 0x9097, 0x2600, 0x00000000);
1169 nv_mthd(dev, 0x9097, 0x1918, 0x00000000);
1170 nv_mthd(dev, 0x9097, 0x191c, 0x00000900);
1171 nv_mthd(dev, 0x9097, 0x1920, 0x00000405);
1172 nv_mthd(dev, 0x9097, 0x1308, 0x00000001);
1173 nv_mthd(dev, 0x9097, 0x1924, 0x00000000);
1174 nv_mthd(dev, 0x9097, 0x13ac, 0x00000000);
1175 nv_mthd(dev, 0x9097, 0x192c, 0x00000001);
1176 nv_mthd(dev, 0x9097, 0x193c, 0x00002c1c);
1177 nv_mthd(dev, 0x9097, 0x0d7c, 0x00000000);
1178 nv_mthd(dev, 0x9097, 0x0f8c, 0x00000000);
1179 nv_mthd(dev, 0x9097, 0x02c0, 0x00000001);
1180 nv_mthd(dev, 0x9097, 0x1510, 0x00000000);
1181 nv_mthd(dev, 0x9097, 0x1940, 0x00000000);
1182 nv_mthd(dev, 0x9097, 0x0ff4, 0x00000000);
1183 nv_mthd(dev, 0x9097, 0x0ff8, 0x00000000);
1184 nv_mthd(dev, 0x9097, 0x194c, 0x00000000);
1185 nv_mthd(dev, 0x9097, 0x1950, 0x00000000);
1186 nv_mthd(dev, 0x9097, 0x1968, 0x00000000);
1187 nv_mthd(dev, 0x9097, 0x1590, 0x0000003f);
1188 nv_mthd(dev, 0x9097, 0x07e8, 0x00000000);
1189 nv_mthd(dev, 0x9097, 0x07ec, 0x00000000);
1190 nv_mthd(dev, 0x9097, 0x07f0, 0x00000000);
1191 nv_mthd(dev, 0x9097, 0x07f4, 0x00000000);
1192 nv_mthd(dev, 0x9097, 0x196c, 0x00000011);
1193 nv_mthd(dev, 0x9097, 0x197c, 0x00000000);
1194 nv_mthd(dev, 0x9097, 0x0fcc, 0x00000000);
1195 nv_mthd(dev, 0x9097, 0x0fd0, 0x00000000);
1196 nv_mthd(dev, 0x9097, 0x02d8, 0x00000040);
1197 nv_mthd(dev, 0x9097, 0x1980, 0x00000080);
1198 nv_mthd(dev, 0x9097, 0x1504, 0x00000080);
1199 nv_mthd(dev, 0x9097, 0x1984, 0x00000000);
1200 nv_mthd(dev, 0x9097, 0x0300, 0x00000001);
1201 nv_mthd(dev, 0x9097, 0x13a8, 0x00000000);
1202 nv_mthd(dev, 0x9097, 0x12ec, 0x00000000);
1203 nv_mthd(dev, 0x9097, 0x1310, 0x00000000);
1204 nv_mthd(dev, 0x9097, 0x1314, 0x00000001);
1205 nv_mthd(dev, 0x9097, 0x1380, 0x00000000);
1206 nv_mthd(dev, 0x9097, 0x1384, 0x00000001);
1207 nv_mthd(dev, 0x9097, 0x1388, 0x00000001);
1208 nv_mthd(dev, 0x9097, 0x138c, 0x00000001);
1209 nv_mthd(dev, 0x9097, 0x1390, 0x00000001);
1210 nv_mthd(dev, 0x9097, 0x1394, 0x00000000);
1211 nv_mthd(dev, 0x9097, 0x139c, 0x00000000);
1212 nv_mthd(dev, 0x9097, 0x1398, 0x00000000);
1213 nv_mthd(dev, 0x9097, 0x1594, 0x00000000);
1214 nv_mthd(dev, 0x9097, 0x1598, 0x00000001);
1215 nv_mthd(dev, 0x9097, 0x159c, 0x00000001);
1216 nv_mthd(dev, 0x9097, 0x15a0, 0x00000001);
1217 nv_mthd(dev, 0x9097, 0x15a4, 0x00000001);
1218 nv_mthd(dev, 0x9097, 0x0f54, 0x00000000);
1219 nv_mthd(dev, 0x9097, 0x0f58, 0x00000000);
1220 nv_mthd(dev, 0x9097, 0x0f5c, 0x00000000);
1221 nv_mthd(dev, 0x9097, 0x19bc, 0x00000000);
1222 nv_mthd(dev, 0x9097, 0x0f9c, 0x00000000);
1223 nv_mthd(dev, 0x9097, 0x0fa0, 0x00000000);
1224 nv_mthd(dev, 0x9097, 0x12cc, 0x00000000);
1225 nv_mthd(dev, 0x9097, 0x12e8, 0x00000000);
1226 nv_mthd(dev, 0x9097, 0x130c, 0x00000001);
1227 nv_mthd(dev, 0x9097, 0x1360, 0x00000000);
1228 nv_mthd(dev, 0x9097, 0x1364, 0x00000000);
1229 nv_mthd(dev, 0x9097, 0x1368, 0x00000000);
1230 nv_mthd(dev, 0x9097, 0x136c, 0x00000000);
1231 nv_mthd(dev, 0x9097, 0x1370, 0x00000000);
1232 nv_mthd(dev, 0x9097, 0x1374, 0x00000000);
1233 nv_mthd(dev, 0x9097, 0x1378, 0x00000000);
1234 nv_mthd(dev, 0x9097, 0x137c, 0x00000000);
1235 nv_mthd(dev, 0x9097, 0x133c, 0x00000001);
1236 nv_mthd(dev, 0x9097, 0x1340, 0x00000001);
1237 nv_mthd(dev, 0x9097, 0x1344, 0x00000002);
1238 nv_mthd(dev, 0x9097, 0x1348, 0x00000001);
1239 nv_mthd(dev, 0x9097, 0x134c, 0x00000001);
1240 nv_mthd(dev, 0x9097, 0x1350, 0x00000002);
1241 nv_mthd(dev, 0x9097, 0x1358, 0x00000001);
1242 nv_mthd(dev, 0x9097, 0x12e4, 0x00000000);
1243 nv_mthd(dev, 0x9097, 0x131c, 0x00000000);
1244 nv_mthd(dev, 0x9097, 0x1320, 0x00000000);
1245 nv_mthd(dev, 0x9097, 0x1324, 0x00000000);
1246 nv_mthd(dev, 0x9097, 0x1328, 0x00000000);
1247 nv_mthd(dev, 0x9097, 0x19c0, 0x00000000);
1248 nv_mthd(dev, 0x9097, 0x1140, 0x00000000);
1249 nv_mthd(dev, 0x9097, 0x19c4, 0x00000000);
1250 nv_mthd(dev, 0x9097, 0x19c8, 0x00001500);
1251 nv_mthd(dev, 0x9097, 0x135c, 0x00000000);
1252 nv_mthd(dev, 0x9097, 0x0f90, 0x00000000);
1253 nv_mthd(dev, 0x9097, 0x19e0, 0x00000001);
1254 nv_mthd(dev, 0x9097, 0x19e4, 0x00000001);
1255 nv_mthd(dev, 0x9097, 0x19e8, 0x00000001);
1256 nv_mthd(dev, 0x9097, 0x19ec, 0x00000001);
1257 nv_mthd(dev, 0x9097, 0x19f0, 0x00000001);
1258 nv_mthd(dev, 0x9097, 0x19f4, 0x00000001);
1259 nv_mthd(dev, 0x9097, 0x19f8, 0x00000001);
1260 nv_mthd(dev, 0x9097, 0x19fc, 0x00000001);
1261 nv_mthd(dev, 0x9097, 0x19cc, 0x00000001);
1262 nv_mthd(dev, 0x9097, 0x15b8, 0x00000000);
1263 nv_mthd(dev, 0x9097, 0x1a00, 0x00001111);
1264 nv_mthd(dev, 0x9097, 0x1a04, 0x00000000);
1265 nv_mthd(dev, 0x9097, 0x1a08, 0x00000000);
1266 nv_mthd(dev, 0x9097, 0x1a0c, 0x00000000);
1267 nv_mthd(dev, 0x9097, 0x1a10, 0x00000000);
1268 nv_mthd(dev, 0x9097, 0x1a14, 0x00000000);
1269 nv_mthd(dev, 0x9097, 0x1a18, 0x00000000);
1270 nv_mthd(dev, 0x9097, 0x1a1c, 0x00000000);
1271 nv_mthd(dev, 0x9097, 0x0d6c, 0xffff0000);
1272 nv_mthd(dev, 0x9097, 0x0d70, 0xffff0000);
1273 nv_mthd(dev, 0x9097, 0x10f8, 0x00001010);
1274 nv_mthd(dev, 0x9097, 0x0d80, 0x00000000);
1275 nv_mthd(dev, 0x9097, 0x0d84, 0x00000000);
1276 nv_mthd(dev, 0x9097, 0x0d88, 0x00000000);
1277 nv_mthd(dev, 0x9097, 0x0d8c, 0x00000000);
1278 nv_mthd(dev, 0x9097, 0x0d90, 0x00000000);
1279 nv_mthd(dev, 0x9097, 0x0da0, 0x00000000);
1280 nv_mthd(dev, 0x9097, 0x1508, 0x80000000);
1281 nv_mthd(dev, 0x9097, 0x150c, 0x40000000);
1282 nv_mthd(dev, 0x9097, 0x1668, 0x00000000);
1283 nv_mthd(dev, 0x9097, 0x0318, 0x00000008);
1284 nv_mthd(dev, 0x9097, 0x031c, 0x00000008);
1285 nv_mthd(dev, 0x9097, 0x0d9c, 0x00000001);
1286 nv_mthd(dev, 0x9097, 0x07dc, 0x00000000);
1287 nv_mthd(dev, 0x9097, 0x074c, 0x00000055);
1288 nv_mthd(dev, 0x9097, 0x1420, 0x00000003);
1289 nv_mthd(dev, 0x9097, 0x17bc, 0x00000000);
1290 nv_mthd(dev, 0x9097, 0x17c0, 0x00000000);
1291 nv_mthd(dev, 0x9097, 0x17c4, 0x00000001);
1292 nv_mthd(dev, 0x9097, 0x1008, 0x00000008);
1293 nv_mthd(dev, 0x9097, 0x100c, 0x00000040);
1294 nv_mthd(dev, 0x9097, 0x1010, 0x0000012c);
1295 nv_mthd(dev, 0x9097, 0x0d60, 0x00000040);
1296 nv_mthd(dev, 0x9097, 0x075c, 0x00000003);
1297 nv_mthd(dev, 0x9097, 0x1018, 0x00000020);
1298 nv_mthd(dev, 0x9097, 0x101c, 0x00000001);
1299 nv_mthd(dev, 0x9097, 0x1020, 0x00000020);
1300 nv_mthd(dev, 0x9097, 0x1024, 0x00000001);
1301 nv_mthd(dev, 0x9097, 0x1444, 0x00000000);
1302 nv_mthd(dev, 0x9097, 0x1448, 0x00000000);
1303 nv_mthd(dev, 0x9097, 0x144c, 0x00000000);
1304 nv_mthd(dev, 0x9097, 0x0360, 0x20164010);
1305 nv_mthd(dev, 0x9097, 0x0364, 0x00000020);
1306 nv_mthd(dev, 0x9097, 0x0368, 0x00000000);
1307 nv_mthd(dev, 0x9097, 0x0de4, 0x00000000);
1308 nv_mthd(dev, 0x9097, 0x0204, 0x00000006);
1309 nv_mthd(dev, 0x9097, 0x0208, 0x00000000);
1310 nv_mthd(dev, 0x9097, 0x02cc, 0x003fffff);
1311 nv_mthd(dev, 0x9097, 0x02d0, 0x00000c48);
1312 nv_mthd(dev, 0x9097, 0x1220, 0x00000005);
1313 nv_mthd(dev, 0x9097, 0x0fdc, 0x00000000);
1314 nv_mthd(dev, 0x9097, 0x0f98, 0x00300008);
1315 nv_mthd(dev, 0x9097, 0x1284, 0x04000080);
1316 nv_mthd(dev, 0x9097, 0x1450, 0x00300008);
1317 nv_mthd(dev, 0x9097, 0x1454, 0x04000080);
1318 nv_mthd(dev, 0x9097, 0x0214, 0x00000000);
1319 /* in trace, right after 0x90c0, not here */
1320 nv_mthd(dev, 0x9097, 0x3410, 0x80002006);
1321}
1322
1323static void
1324nvc0_grctx_generate_902d(struct drm_device *dev)
1325{
1326 nv_mthd(dev, 0x902d, 0x0200, 0x000000cf);
1327 nv_mthd(dev, 0x902d, 0x0204, 0x00000001);
1328 nv_mthd(dev, 0x902d, 0x0208, 0x00000020);
1329 nv_mthd(dev, 0x902d, 0x020c, 0x00000001);
1330 nv_mthd(dev, 0x902d, 0x0210, 0x00000000);
1331 nv_mthd(dev, 0x902d, 0x0214, 0x00000080);
1332 nv_mthd(dev, 0x902d, 0x0218, 0x00000100);
1333 nv_mthd(dev, 0x902d, 0x021c, 0x00000100);
1334 nv_mthd(dev, 0x902d, 0x0220, 0x00000000);
1335 nv_mthd(dev, 0x902d, 0x0224, 0x00000000);
1336 nv_mthd(dev, 0x902d, 0x0230, 0x000000cf);
1337 nv_mthd(dev, 0x902d, 0x0234, 0x00000001);
1338 nv_mthd(dev, 0x902d, 0x0238, 0x00000020);
1339 nv_mthd(dev, 0x902d, 0x023c, 0x00000001);
1340 nv_mthd(dev, 0x902d, 0x0244, 0x00000080);
1341 nv_mthd(dev, 0x902d, 0x0248, 0x00000100);
1342 nv_mthd(dev, 0x902d, 0x024c, 0x00000100);
1343}
1344
1345static void
1346nvc0_grctx_generate_9039(struct drm_device *dev)
1347{
1348 nv_mthd(dev, 0x9039, 0x030c, 0x00000000);
1349 nv_mthd(dev, 0x9039, 0x0310, 0x00000000);
1350 nv_mthd(dev, 0x9039, 0x0314, 0x00000000);
1351 nv_mthd(dev, 0x9039, 0x0320, 0x00000000);
1352 nv_mthd(dev, 0x9039, 0x0238, 0x00000000);
1353 nv_mthd(dev, 0x9039, 0x023c, 0x00000000);
1354 nv_mthd(dev, 0x9039, 0x0318, 0x00000000);
1355 nv_mthd(dev, 0x9039, 0x031c, 0x00000000);
1356}
1357
1358static void
1359nvc0_grctx_generate_90c0(struct drm_device *dev)
1360{
1361 nv_mthd(dev, 0x90c0, 0x270c, 0x00000000);
1362 nv_mthd(dev, 0x90c0, 0x272c, 0x00000000);
1363 nv_mthd(dev, 0x90c0, 0x274c, 0x00000000);
1364 nv_mthd(dev, 0x90c0, 0x276c, 0x00000000);
1365 nv_mthd(dev, 0x90c0, 0x278c, 0x00000000);
1366 nv_mthd(dev, 0x90c0, 0x27ac, 0x00000000);
1367 nv_mthd(dev, 0x90c0, 0x27cc, 0x00000000);
1368 nv_mthd(dev, 0x90c0, 0x27ec, 0x00000000);
1369 nv_mthd(dev, 0x90c0, 0x030c, 0x00000001);
1370 nv_mthd(dev, 0x90c0, 0x1944, 0x00000000);
1371 nv_mthd(dev, 0x90c0, 0x0758, 0x00000100);
1372 nv_mthd(dev, 0x90c0, 0x02c4, 0x00000000);
1373 nv_mthd(dev, 0x90c0, 0x0790, 0x00000000);
1374 nv_mthd(dev, 0x90c0, 0x0794, 0x00000000);
1375 nv_mthd(dev, 0x90c0, 0x0798, 0x00000000);
1376 nv_mthd(dev, 0x90c0, 0x079c, 0x00000000);
1377 nv_mthd(dev, 0x90c0, 0x07a0, 0x00000000);
1378 nv_mthd(dev, 0x90c0, 0x077c, 0x00000000);
1379 nv_mthd(dev, 0x90c0, 0x0204, 0x00000000);
1380 nv_mthd(dev, 0x90c0, 0x0208, 0x00000000);
1381 nv_mthd(dev, 0x90c0, 0x020c, 0x00000000);
1382 nv_mthd(dev, 0x90c0, 0x0214, 0x00000000);
1383 nv_mthd(dev, 0x90c0, 0x024c, 0x00000000);
1384 nv_mthd(dev, 0x90c0, 0x0d94, 0x00000001);
1385 nv_mthd(dev, 0x90c0, 0x1608, 0x00000000);
1386 nv_mthd(dev, 0x90c0, 0x160c, 0x00000000);
1387 nv_mthd(dev, 0x90c0, 0x1664, 0x00000000);
1388}
1389
1390static void
1391nvc0_grctx_generate_dispatch(struct drm_device *dev)
1392{
1393 int i;
1394
1395 nv_wr32(dev, 0x404004, 0x00000000);
1396 nv_wr32(dev, 0x404008, 0x00000000);
1397 nv_wr32(dev, 0x40400c, 0x00000000);
1398 nv_wr32(dev, 0x404010, 0x00000000);
1399 nv_wr32(dev, 0x404014, 0x00000000);
1400 nv_wr32(dev, 0x404018, 0x00000000);
1401 nv_wr32(dev, 0x40401c, 0x00000000);
1402 nv_wr32(dev, 0x404020, 0x00000000);
1403 nv_wr32(dev, 0x404024, 0x00000000);
1404 nv_wr32(dev, 0x404028, 0x00000000);
1405 nv_wr32(dev, 0x40402c, 0x00000000);
1406 nv_wr32(dev, 0x404044, 0x00000000);
1407 nv_wr32(dev, 0x404094, 0x00000000);
1408 nv_wr32(dev, 0x404098, 0x00000000);
1409 nv_wr32(dev, 0x40409c, 0x00000000);
1410 nv_wr32(dev, 0x4040a0, 0x00000000);
1411 nv_wr32(dev, 0x4040a4, 0x00000000);
1412 nv_wr32(dev, 0x4040a8, 0x00000000);
1413 nv_wr32(dev, 0x4040ac, 0x00000000);
1414 nv_wr32(dev, 0x4040b0, 0x00000000);
1415 nv_wr32(dev, 0x4040b4, 0x00000000);
1416 nv_wr32(dev, 0x4040b8, 0x00000000);
1417 nv_wr32(dev, 0x4040bc, 0x00000000);
1418 nv_wr32(dev, 0x4040c0, 0x00000000);
1419 nv_wr32(dev, 0x4040c4, 0x00000000);
1420 nv_wr32(dev, 0x4040c8, 0xf0000087);
1421 nv_wr32(dev, 0x4040d4, 0x00000000);
1422 nv_wr32(dev, 0x4040d8, 0x00000000);
1423 nv_wr32(dev, 0x4040dc, 0x00000000);
1424 nv_wr32(dev, 0x4040e0, 0x00000000);
1425 nv_wr32(dev, 0x4040e4, 0x00000000);
1426 nv_wr32(dev, 0x4040e8, 0x00001000);
1427 nv_wr32(dev, 0x4040f8, 0x00000000);
1428 nv_wr32(dev, 0x404130, 0x00000000);
1429 nv_wr32(dev, 0x404134, 0x00000000);
1430 nv_wr32(dev, 0x404138, 0x20000040);
1431 nv_wr32(dev, 0x404150, 0x0000002e);
1432 nv_wr32(dev, 0x404154, 0x00000400);
1433 nv_wr32(dev, 0x404158, 0x00000200);
1434 nv_wr32(dev, 0x404164, 0x00000055);
1435 nv_wr32(dev, 0x404168, 0x00000000);
1436 nv_wr32(dev, 0x404174, 0x00000000);
1437 nv_wr32(dev, 0x404178, 0x00000000);
1438 nv_wr32(dev, 0x40417c, 0x00000000);
1439 for (i = 0; i < 8; i++)
1440 nv_wr32(dev, 0x404200 + (i * 4), 0x00000000); /* subc */
1441}
1442
1443static void
1444nvc0_grctx_generate_macro(struct drm_device *dev)
1445{
1446 nv_wr32(dev, 0x404404, 0x00000000);
1447 nv_wr32(dev, 0x404408, 0x00000000);
1448 nv_wr32(dev, 0x40440c, 0x00000000);
1449 nv_wr32(dev, 0x404410, 0x00000000);
1450 nv_wr32(dev, 0x404414, 0x00000000);
1451 nv_wr32(dev, 0x404418, 0x00000000);
1452 nv_wr32(dev, 0x40441c, 0x00000000);
1453 nv_wr32(dev, 0x404420, 0x00000000);
1454 nv_wr32(dev, 0x404424, 0x00000000);
1455 nv_wr32(dev, 0x404428, 0x00000000);
1456 nv_wr32(dev, 0x40442c, 0x00000000);
1457 nv_wr32(dev, 0x404430, 0x00000000);
1458 nv_wr32(dev, 0x404434, 0x00000000);
1459 nv_wr32(dev, 0x404438, 0x00000000);
1460 nv_wr32(dev, 0x404460, 0x00000000);
1461 nv_wr32(dev, 0x404464, 0x00000000);
1462 nv_wr32(dev, 0x404468, 0x00ffffff);
1463 nv_wr32(dev, 0x40446c, 0x00000000);
1464 nv_wr32(dev, 0x404480, 0x00000001);
1465 nv_wr32(dev, 0x404498, 0x00000001);
1466}
1467
1468static void
1469nvc0_grctx_generate_m2mf(struct drm_device *dev)
1470{
1471 nv_wr32(dev, 0x404604, 0x00000015);
1472 nv_wr32(dev, 0x404608, 0x00000000);
1473 nv_wr32(dev, 0x40460c, 0x00002e00);
1474 nv_wr32(dev, 0x404610, 0x00000100);
1475 nv_wr32(dev, 0x404618, 0x00000000);
1476 nv_wr32(dev, 0x40461c, 0x00000000);
1477 nv_wr32(dev, 0x404620, 0x00000000);
1478 nv_wr32(dev, 0x404624, 0x00000000);
1479 nv_wr32(dev, 0x404628, 0x00000000);
1480 nv_wr32(dev, 0x40462c, 0x00000000);
1481 nv_wr32(dev, 0x404630, 0x00000000);
1482 nv_wr32(dev, 0x404634, 0x00000000);
1483 nv_wr32(dev, 0x404638, 0x00000004);
1484 nv_wr32(dev, 0x40463c, 0x00000000);
1485 nv_wr32(dev, 0x404640, 0x00000000);
1486 nv_wr32(dev, 0x404644, 0x00000000);
1487 nv_wr32(dev, 0x404648, 0x00000000);
1488 nv_wr32(dev, 0x40464c, 0x00000000);
1489 nv_wr32(dev, 0x404650, 0x00000000);
1490 nv_wr32(dev, 0x404654, 0x00000000);
1491 nv_wr32(dev, 0x404658, 0x00000000);
1492 nv_wr32(dev, 0x40465c, 0x007f0100);
1493 nv_wr32(dev, 0x404660, 0x00000000);
1494 nv_wr32(dev, 0x404664, 0x00000000);
1495 nv_wr32(dev, 0x404668, 0x00000000);
1496 nv_wr32(dev, 0x40466c, 0x00000000);
1497 nv_wr32(dev, 0x404670, 0x00000000);
1498 nv_wr32(dev, 0x404674, 0x00000000);
1499 nv_wr32(dev, 0x404678, 0x00000000);
1500 nv_wr32(dev, 0x40467c, 0x00000002);
1501 nv_wr32(dev, 0x404680, 0x00000000);
1502 nv_wr32(dev, 0x404684, 0x00000000);
1503 nv_wr32(dev, 0x404688, 0x00000000);
1504 nv_wr32(dev, 0x40468c, 0x00000000);
1505 nv_wr32(dev, 0x404690, 0x00000000);
1506 nv_wr32(dev, 0x404694, 0x00000000);
1507 nv_wr32(dev, 0x404698, 0x00000000);
1508 nv_wr32(dev, 0x40469c, 0x00000000);
1509 nv_wr32(dev, 0x4046a0, 0x007f0080);
1510 nv_wr32(dev, 0x4046a4, 0x00000000);
1511 nv_wr32(dev, 0x4046a8, 0x00000000);
1512 nv_wr32(dev, 0x4046ac, 0x00000000);
1513 nv_wr32(dev, 0x4046b0, 0x00000000);
1514 nv_wr32(dev, 0x4046b4, 0x00000000);
1515 nv_wr32(dev, 0x4046b8, 0x00000000);
1516 nv_wr32(dev, 0x4046bc, 0x00000000);
1517 nv_wr32(dev, 0x4046c0, 0x00000000);
1518 nv_wr32(dev, 0x4046c4, 0x00000000);
1519 nv_wr32(dev, 0x4046c8, 0x00000000);
1520 nv_wr32(dev, 0x4046cc, 0x00000000);
1521 nv_wr32(dev, 0x4046d0, 0x00000000);
1522 nv_wr32(dev, 0x4046d4, 0x00000000);
1523 nv_wr32(dev, 0x4046d8, 0x00000000);
1524 nv_wr32(dev, 0x4046dc, 0x00000000);
1525 nv_wr32(dev, 0x4046e0, 0x00000000);
1526 nv_wr32(dev, 0x4046e4, 0x00000000);
1527 nv_wr32(dev, 0x4046e8, 0x00000000);
1528 nv_wr32(dev, 0x4046f0, 0x00000000);
1529 nv_wr32(dev, 0x4046f4, 0x00000000);
1530}
1531
1532static void
1533nvc0_grctx_generate_unk47xx(struct drm_device *dev)
1534{
1535 nv_wr32(dev, 0x404700, 0x00000000);
1536 nv_wr32(dev, 0x404704, 0x00000000);
1537 nv_wr32(dev, 0x404708, 0x00000000);
1538 nv_wr32(dev, 0x40470c, 0x00000000);
1539 nv_wr32(dev, 0x404710, 0x00000000);
1540 nv_wr32(dev, 0x404714, 0x00000000);
1541 nv_wr32(dev, 0x404718, 0x00000000);
1542 nv_wr32(dev, 0x40471c, 0x00000000);
1543 nv_wr32(dev, 0x404720, 0x00000000);
1544 nv_wr32(dev, 0x404724, 0x00000000);
1545 nv_wr32(dev, 0x404728, 0x00000000);
1546 nv_wr32(dev, 0x40472c, 0x00000000);
1547 nv_wr32(dev, 0x404730, 0x00000000);
1548 nv_wr32(dev, 0x404734, 0x00000100);
1549 nv_wr32(dev, 0x404738, 0x00000000);
1550 nv_wr32(dev, 0x40473c, 0x00000000);
1551 nv_wr32(dev, 0x404740, 0x00000000);
1552 nv_wr32(dev, 0x404744, 0x00000000);
1553 nv_wr32(dev, 0x404748, 0x00000000);
1554 nv_wr32(dev, 0x40474c, 0x00000000);
1555 nv_wr32(dev, 0x404750, 0x00000000);
1556 nv_wr32(dev, 0x404754, 0x00000000);
1557}
1558
1559static void
1560nvc0_grctx_generate_shaders(struct drm_device *dev)
1561{
1562 nv_wr32(dev, 0x405800, 0x078000bf);
1563 nv_wr32(dev, 0x405830, 0x02180000);
1564 nv_wr32(dev, 0x405834, 0x00000000);
1565 nv_wr32(dev, 0x405838, 0x00000000);
1566 nv_wr32(dev, 0x405854, 0x00000000);
1567 nv_wr32(dev, 0x405870, 0x00000001);
1568 nv_wr32(dev, 0x405874, 0x00000001);
1569 nv_wr32(dev, 0x405878, 0x00000001);
1570 nv_wr32(dev, 0x40587c, 0x00000001);
1571 nv_wr32(dev, 0x405a00, 0x00000000);
1572 nv_wr32(dev, 0x405a04, 0x00000000);
1573 nv_wr32(dev, 0x405a18, 0x00000000);
1574}
1575
1576static void
1577nvc0_grctx_generate_unk60xx(struct drm_device *dev)
1578{
1579 nv_wr32(dev, 0x406020, 0x000103c1);
1580 nv_wr32(dev, 0x406028, 0x00000001);
1581 nv_wr32(dev, 0x40602c, 0x00000001);
1582 nv_wr32(dev, 0x406030, 0x00000001);
1583 nv_wr32(dev, 0x406034, 0x00000001);
1584}
1585
1586static void
1587nvc0_grctx_generate_unk64xx(struct drm_device *dev)
1588{
1589 nv_wr32(dev, 0x4064a8, 0x00000000);
1590 nv_wr32(dev, 0x4064ac, 0x00003fff);
1591 nv_wr32(dev, 0x4064b4, 0x00000000);
1592 nv_wr32(dev, 0x4064b8, 0x00000000);
1593}
1594
1595static void
1596nvc0_grctx_generate_tpbus(struct drm_device *dev)
1597{
1598 nv_wr32(dev, 0x407804, 0x00000023);
1599 nv_wr32(dev, 0x40780c, 0x0a418820);
1600 nv_wr32(dev, 0x407810, 0x062080e6);
1601 nv_wr32(dev, 0x407814, 0x020398a4);
1602 nv_wr32(dev, 0x407818, 0x0e629062);
1603 nv_wr32(dev, 0x40781c, 0x0a418820);
1604 nv_wr32(dev, 0x407820, 0x000000e6);
1605 nv_wr32(dev, 0x4078bc, 0x00000103);
1606}
1607
1608static void
1609nvc0_grctx_generate_ccache(struct drm_device *dev)
1610{
1611 nv_wr32(dev, 0x408000, 0x00000000);
1612 nv_wr32(dev, 0x408004, 0x00000000);
1613 nv_wr32(dev, 0x408008, 0x00000018);
1614 nv_wr32(dev, 0x40800c, 0x00000000);
1615 nv_wr32(dev, 0x408010, 0x00000000);
1616 nv_wr32(dev, 0x408014, 0x00000069);
1617 nv_wr32(dev, 0x408018, 0xe100e100);
1618 nv_wr32(dev, 0x408064, 0x00000000);
1619}
1620
1621static void
1622nvc0_grctx_generate_rop(struct drm_device *dev)
1623{
1624 struct drm_nouveau_private *dev_priv = dev->dev_private;
1625
1626 /* ROPC_BROADCAST */
1627 nv_wr32(dev, 0x408800, 0x02802a3c);
1628 nv_wr32(dev, 0x408804, 0x00000040);
1629 nv_wr32(dev, 0x408808, 0x0003e00d);
1630 switch (dev_priv->chipset) {
1631 case 0xc0:
1632 nv_wr32(dev, 0x408900, 0x0080b801);
1633 break;
1634 case 0xc3:
1635 case 0xc4:
1636 nv_wr32(dev, 0x408900, 0x3080b801);
1637 break;
1638 }
1639 nv_wr32(dev, 0x408904, 0x02000001);
1640 nv_wr32(dev, 0x408908, 0x00c80929);
1641 nv_wr32(dev, 0x40890c, 0x00000000);
1642 nv_wr32(dev, 0x408980, 0x0000011d);
1643}
1644
1645static void
1646nvc0_grctx_generate_gpc(struct drm_device *dev)
1647{
1648 int i;
1649
1650 /* GPC_BROADCAST */
1651 nv_wr32(dev, 0x418380, 0x00000016);
1652 nv_wr32(dev, 0x418400, 0x38004e00);
1653 nv_wr32(dev, 0x418404, 0x71e0ffff);
1654 nv_wr32(dev, 0x418408, 0x00000000);
1655 nv_wr32(dev, 0x41840c, 0x00001008);
1656 nv_wr32(dev, 0x418410, 0x0fff0fff);
1657 nv_wr32(dev, 0x418414, 0x00200fff);
1658 nv_wr32(dev, 0x418450, 0x00000000);
1659 nv_wr32(dev, 0x418454, 0x00000000);
1660 nv_wr32(dev, 0x418458, 0x00000000);
1661 nv_wr32(dev, 0x41845c, 0x00000000);
1662 nv_wr32(dev, 0x418460, 0x00000000);
1663 nv_wr32(dev, 0x418464, 0x00000000);
1664 nv_wr32(dev, 0x418468, 0x00000001);
1665 nv_wr32(dev, 0x41846c, 0x00000000);
1666 nv_wr32(dev, 0x418470, 0x00000000);
1667 nv_wr32(dev, 0x418600, 0x0000001f);
1668 nv_wr32(dev, 0x418684, 0x0000000f);
1669 nv_wr32(dev, 0x418700, 0x00000002);
1670 nv_wr32(dev, 0x418704, 0x00000080);
1671 nv_wr32(dev, 0x418708, 0x00000000);
1672 nv_wr32(dev, 0x41870c, 0x07c80000);
1673 nv_wr32(dev, 0x418710, 0x00000000);
1674 nv_wr32(dev, 0x418800, 0x0006860a);
1675 nv_wr32(dev, 0x418808, 0x00000000);
1676 nv_wr32(dev, 0x41880c, 0x00000000);
1677 nv_wr32(dev, 0x418810, 0x00000000);
1678 nv_wr32(dev, 0x418828, 0x00008442);
1679 nv_wr32(dev, 0x418830, 0x00000001);
1680 nv_wr32(dev, 0x4188d8, 0x00000008);
1681 nv_wr32(dev, 0x4188e0, 0x01000000);
1682 nv_wr32(dev, 0x4188e8, 0x00000000);
1683 nv_wr32(dev, 0x4188ec, 0x00000000);
1684 nv_wr32(dev, 0x4188f0, 0x00000000);
1685 nv_wr32(dev, 0x4188f4, 0x00000000);
1686 nv_wr32(dev, 0x4188f8, 0x00000000);
1687 nv_wr32(dev, 0x4188fc, 0x00100000);
1688 nv_wr32(dev, 0x41891c, 0x00ff00ff);
1689 nv_wr32(dev, 0x418924, 0x00000000);
1690 nv_wr32(dev, 0x418928, 0x00ffff00);
1691 nv_wr32(dev, 0x41892c, 0x0000ff00);
1692 for (i = 0; i < 8; i++) {
1693 nv_wr32(dev, 0x418a00 + (i * 0x20), 0x00000000);
1694 nv_wr32(dev, 0x418a04 + (i * 0x20), 0x00000000);
1695 nv_wr32(dev, 0x418a08 + (i * 0x20), 0x00000000);
1696 nv_wr32(dev, 0x418a0c + (i * 0x20), 0x00010000);
1697 nv_wr32(dev, 0x418a10 + (i * 0x20), 0x00000000);
1698 nv_wr32(dev, 0x418a14 + (i * 0x20), 0x00000000);
1699 nv_wr32(dev, 0x418a18 + (i * 0x20), 0x00000000);
1700 }
1701 nv_wr32(dev, 0x418b00, 0x00000000);
1702 nv_wr32(dev, 0x418b08, 0x0a418820);
1703 nv_wr32(dev, 0x418b0c, 0x062080e6);
1704 nv_wr32(dev, 0x418b10, 0x020398a4);
1705 nv_wr32(dev, 0x418b14, 0x0e629062);
1706 nv_wr32(dev, 0x418b18, 0x0a418820);
1707 nv_wr32(dev, 0x418b1c, 0x000000e6);
1708 nv_wr32(dev, 0x418bb8, 0x00000103);
1709 nv_wr32(dev, 0x418c08, 0x00000001);
1710 nv_wr32(dev, 0x418c10, 0x00000000);
1711 nv_wr32(dev, 0x418c14, 0x00000000);
1712 nv_wr32(dev, 0x418c18, 0x00000000);
1713 nv_wr32(dev, 0x418c1c, 0x00000000);
1714 nv_wr32(dev, 0x418c20, 0x00000000);
1715 nv_wr32(dev, 0x418c24, 0x00000000);
1716 nv_wr32(dev, 0x418c28, 0x00000000);
1717 nv_wr32(dev, 0x418c2c, 0x00000000);
1718 nv_wr32(dev, 0x418c80, 0x20200004);
1719 nv_wr32(dev, 0x418c8c, 0x00000001);
1720 nv_wr32(dev, 0x419000, 0x00000780);
1721 nv_wr32(dev, 0x419004, 0x00000000);
1722 nv_wr32(dev, 0x419008, 0x00000000);
1723 nv_wr32(dev, 0x419014, 0x00000004);
1724}
1725
1726static void
1727nvc0_grctx_generate_tp(struct drm_device *dev)
1728{
1729 struct drm_nouveau_private *dev_priv = dev->dev_private;
1730
1731 /* GPC_BROADCAST.TP_BROADCAST */
1732 nv_wr32(dev, 0x419848, 0x00000000);
1733 nv_wr32(dev, 0x419864, 0x0000012a);
1734 nv_wr32(dev, 0x419888, 0x00000000);
1735 nv_wr32(dev, 0x419a00, 0x000001f0);
1736 nv_wr32(dev, 0x419a04, 0x00000001);
1737 nv_wr32(dev, 0x419a08, 0x00000023);
1738 nv_wr32(dev, 0x419a0c, 0x00020000);
1739 nv_wr32(dev, 0x419a10, 0x00000000);
1740 nv_wr32(dev, 0x419a14, 0x00000200);
1741 nv_wr32(dev, 0x419a1c, 0x00000000);
1742 nv_wr32(dev, 0x419a20, 0x00000800);
1743 if (dev_priv->chipset != 0xc0)
1744 nv_wr32(dev, 0x00419ac4, 0x0007f440); /* 0xc3 */
1745 nv_wr32(dev, 0x419b00, 0x0a418820);
1746 nv_wr32(dev, 0x419b04, 0x062080e6);
1747 nv_wr32(dev, 0x419b08, 0x020398a4);
1748 nv_wr32(dev, 0x419b0c, 0x0e629062);
1749 nv_wr32(dev, 0x419b10, 0x0a418820);
1750 nv_wr32(dev, 0x419b14, 0x000000e6);
1751 nv_wr32(dev, 0x419bd0, 0x00900103);
1752 nv_wr32(dev, 0x419be0, 0x00000001);
1753 nv_wr32(dev, 0x419be4, 0x00000000);
1754 nv_wr32(dev, 0x419c00, 0x00000002);
1755 nv_wr32(dev, 0x419c04, 0x00000006);
1756 nv_wr32(dev, 0x419c08, 0x00000002);
1757 nv_wr32(dev, 0x419c20, 0x00000000);
1758 nv_wr32(dev, 0x419cbc, 0x28137606);
1759 nv_wr32(dev, 0x419ce8, 0x00000000);
1760 nv_wr32(dev, 0x419cf4, 0x00000183);
1761 nv_wr32(dev, 0x419d20, 0x02180000);
1762 nv_wr32(dev, 0x419d24, 0x00001fff);
1763 nv_wr32(dev, 0x419e04, 0x00000000);
1764 nv_wr32(dev, 0x419e08, 0x00000000);
1765 nv_wr32(dev, 0x419e0c, 0x00000000);
1766 nv_wr32(dev, 0x419e10, 0x00000002);
1767 nv_wr32(dev, 0x419e44, 0x001beff2);
1768 nv_wr32(dev, 0x419e48, 0x00000000);
1769 nv_wr32(dev, 0x419e4c, 0x0000000f);
1770 nv_wr32(dev, 0x419e50, 0x00000000);
1771 nv_wr32(dev, 0x419e54, 0x00000000);
1772 nv_wr32(dev, 0x419e58, 0x00000000);
1773 nv_wr32(dev, 0x419e5c, 0x00000000);
1774 nv_wr32(dev, 0x419e60, 0x00000000);
1775 nv_wr32(dev, 0x419e64, 0x00000000);
1776 nv_wr32(dev, 0x419e68, 0x00000000);
1777 nv_wr32(dev, 0x419e6c, 0x00000000);
1778 nv_wr32(dev, 0x419e70, 0x00000000);
1779 nv_wr32(dev, 0x419e74, 0x00000000);
1780 nv_wr32(dev, 0x419e78, 0x00000000);
1781 nv_wr32(dev, 0x419e7c, 0x00000000);
1782 nv_wr32(dev, 0x419e80, 0x00000000);
1783 nv_wr32(dev, 0x419e84, 0x00000000);
1784 nv_wr32(dev, 0x419e88, 0x00000000);
1785 nv_wr32(dev, 0x419e8c, 0x00000000);
1786 nv_wr32(dev, 0x419e90, 0x00000000);
1787 nv_wr32(dev, 0x419e98, 0x00000000);
1788 if (dev_priv->chipset != 0xc0)
1789 nv_wr32(dev, 0x419ee0, 0x00011110);
1790 nv_wr32(dev, 0x419f50, 0x00000000);
1791 nv_wr32(dev, 0x419f54, 0x00000000);
1792 if (dev_priv->chipset != 0xc0)
1793 nv_wr32(dev, 0x419f58, 0x00000000);
1794}
1795
1796int
1797nvc0_grctx_generate(struct nouveau_channel *chan)
1798{
1799 struct drm_nouveau_private *dev_priv = chan->dev->dev_private;
1800 struct nvc0_graph_priv *priv = nv_engine(chan->dev, NVOBJ_ENGINE_GR);
1801 struct nvc0_graph_chan *grch = chan->engctx[NVOBJ_ENGINE_GR];
1802 struct drm_device *dev = chan->dev;
1803 int i, gpc, tp, id;
1804 u32 r000260, tmp;
1805
1806 r000260 = nv_rd32(dev, 0x000260);
1807 nv_wr32(dev, 0x000260, r000260 & ~1);
1808 nv_wr32(dev, 0x400208, 0x00000000);
1809
1810 nvc0_grctx_generate_dispatch(dev);
1811 nvc0_grctx_generate_macro(dev);
1812 nvc0_grctx_generate_m2mf(dev);
1813 nvc0_grctx_generate_unk47xx(dev);
1814 nvc0_grctx_generate_shaders(dev);
1815 nvc0_grctx_generate_unk60xx(dev);
1816 nvc0_grctx_generate_unk64xx(dev);
1817 nvc0_grctx_generate_tpbus(dev);
1818 nvc0_grctx_generate_ccache(dev);
1819 nvc0_grctx_generate_rop(dev);
1820 nvc0_grctx_generate_gpc(dev);
1821 nvc0_grctx_generate_tp(dev);
1822
1823 nv_wr32(dev, 0x404154, 0x00000000);
1824
1825 /* fuc "mmio list" writes */
1826 for (i = 0; i < grch->mmio_nr * 8; i += 8) {
1827 u32 reg = nv_ro32(grch->mmio, i + 0);
1828 nv_wr32(dev, reg, nv_ro32(grch->mmio, i + 4));
1829 }
1830
1831 for (tp = 0, id = 0; tp < 4; tp++) {
1832 for (gpc = 0; gpc < priv->gpc_nr; gpc++) {
1833 if (tp < priv->tp_nr[gpc]) {
1834 nv_wr32(dev, TP_UNIT(gpc, tp, 0x698), id);
1835 nv_wr32(dev, TP_UNIT(gpc, tp, 0x4e8), id);
1836 nv_wr32(dev, GPC_UNIT(gpc, 0x0c10 + tp * 4), id);
1837 nv_wr32(dev, TP_UNIT(gpc, tp, 0x088), id);
1838 id++;
1839 }
1840
1841 nv_wr32(dev, GPC_UNIT(gpc, 0x0c08), priv->tp_nr[gpc]);
1842 nv_wr32(dev, GPC_UNIT(gpc, 0x0c8c), priv->tp_nr[gpc]);
1843 }
1844 }
1845
1846 tmp = 0;
1847 for (i = 0; i < priv->gpc_nr; i++)
1848 tmp |= priv->tp_nr[i] << (i * 4);
1849 nv_wr32(dev, 0x406028, tmp);
1850 nv_wr32(dev, 0x405870, tmp);
1851
1852 nv_wr32(dev, 0x40602c, 0x00000000);
1853 nv_wr32(dev, 0x405874, 0x00000000);
1854 nv_wr32(dev, 0x406030, 0x00000000);
1855 nv_wr32(dev, 0x405878, 0x00000000);
1856 nv_wr32(dev, 0x406034, 0x00000000);
1857 nv_wr32(dev, 0x40587c, 0x00000000);
1858
1859 if (1) {
1860 const u8 chipset_tp_max[] = { 16, 0, 0, 4, 8 };
1861 u8 max = chipset_tp_max[dev_priv->chipset & 0x0f];
1862 u8 tpnr[GPC_MAX];
1863 u8 data[32];
1864
1865 memcpy(tpnr, priv->tp_nr, sizeof(priv->tp_nr));
1866 memset(data, 0x1f, sizeof(data));
1867
1868 gpc = -1;
1869 for (tp = 0; tp < priv->tp_total; tp++) {
1870 do {
1871 gpc = (gpc + 1) % priv->gpc_nr;
1872 } while (!tpnr[gpc]);
1873 tpnr[gpc]--;
1874 data[tp] = gpc;
1875 }
1876
1877 for (i = 0; i < max / 4; i++)
1878 nv_wr32(dev, 0x4060a8 + (i * 4), ((u32 *)data)[i]);
1879 }
1880
1881 if (1) {
1882 u32 data[6] = {}, data2[2] = {};
1883 u8 tpnr[GPC_MAX];
1884 u8 shift, ntpcv;
1885
1886 /* calculate first set of magics */
1887 memcpy(tpnr, priv->tp_nr, sizeof(priv->tp_nr));
1888
1889 for (tp = 0; tp < priv->tp_total; tp++) {
1890 do {
1891 gpc = (gpc + 1) % priv->gpc_nr;
1892 } while (!tpnr[gpc]);
1893 tpnr[gpc]--;
1894
1895 data[tp / 6] |= gpc << ((tp % 6) * 5);
1896 }
1897
1898 for (; tp < 32; tp++)
1899 data[tp / 6] |= 7 << ((tp % 6) * 5);
1900
1901 /* and the second... */
1902 shift = 0;
1903 ntpcv = priv->tp_total;
1904 while (!(ntpcv & (1 << 4))) {
1905 ntpcv <<= 1;
1906 shift++;
1907 }
1908
1909 data2[0] = (ntpcv << 16);
1910 data2[0] |= (shift << 21);
1911 data2[0] |= (((1 << (0 + 5)) % ntpcv) << 24);
1912 for (i = 1; i < 7; i++)
1913 data2[1] |= ((1 << (i + 5)) % ntpcv) << ((i - 1) * 5);
1914
1915 /* GPC_BROADCAST */
1916 nv_wr32(dev, 0x418bb8, (priv->tp_total << 8) |
1917 priv->magic_not_rop_nr);
1918 for (i = 0; i < 6; i++)
1919 nv_wr32(dev, 0x418b08 + (i * 4), data[i]);
1920
1921 /* GPC_BROADCAST.TP_BROADCAST */
1922 nv_wr32(dev, 0x419bd0, (priv->tp_total << 8) |
1923 priv->magic_not_rop_nr |
1924 data2[0]);
1925 nv_wr32(dev, 0x419be4, data2[1]);
1926 for (i = 0; i < 6; i++)
1927 nv_wr32(dev, 0x419b00 + (i * 4), data[i]);
1928
1929 /* UNK78xx */
1930 nv_wr32(dev, 0x4078bc, (priv->tp_total << 8) |
1931 priv->magic_not_rop_nr);
1932 for (i = 0; i < 6; i++)
1933 nv_wr32(dev, 0x40780c + (i * 4), data[i]);
1934 }
1935
1936 if (1) {
1937 u32 tp_mask = 0, tp_set = 0;
1938 u8 tpnr[GPC_MAX];
1939
1940 memcpy(tpnr, priv->tp_nr, sizeof(priv->tp_nr));
1941 for (gpc = 0; gpc < priv->gpc_nr; gpc++)
1942 tp_mask |= ((1 << priv->tp_nr[gpc]) - 1) << (gpc * 8);
1943
1944 gpc = -1;
1945 for (i = 0, gpc = -1; i < 32; i++) {
1946 int ltp = i * (priv->tp_total - 1) / 32;
1947
1948 do {
1949 gpc = (gpc + 1) % priv->gpc_nr;
1950 } while (!tpnr[gpc]);
1951 tp = priv->tp_nr[gpc] - tpnr[gpc]--;
1952
1953 tp_set |= 1 << ((gpc * 8) + tp);
1954
1955 do {
1956 nv_wr32(dev, 0x406800 + (i * 0x20), tp_set);
1957 tp_set ^= tp_mask;
1958 nv_wr32(dev, 0x406c00 + (i * 0x20), tp_set);
1959 tp_set ^= tp_mask;
1960 } while (ltp == (++i * (priv->tp_total - 1) / 32));
1961 i--;
1962 }
1963 }
1964
1965 nv_wr32(dev, 0x400208, 0x80000000);
1966
1967 nv_icmd(dev, 0x00001000, 0x00000004);
1968 nv_icmd(dev, 0x000000a9, 0x0000ffff);
1969 nv_icmd(dev, 0x00000038, 0x0fac6881);
1970 nv_icmd(dev, 0x0000003d, 0x00000001);
1971 nv_icmd(dev, 0x000000e8, 0x00000400);
1972 nv_icmd(dev, 0x000000e9, 0x00000400);
1973 nv_icmd(dev, 0x000000ea, 0x00000400);
1974 nv_icmd(dev, 0x000000eb, 0x00000400);
1975 nv_icmd(dev, 0x000000ec, 0x00000400);
1976 nv_icmd(dev, 0x000000ed, 0x00000400);
1977 nv_icmd(dev, 0x000000ee, 0x00000400);
1978 nv_icmd(dev, 0x000000ef, 0x00000400);
1979 nv_icmd(dev, 0x00000078, 0x00000300);
1980 nv_icmd(dev, 0x00000079, 0x00000300);
1981 nv_icmd(dev, 0x0000007a, 0x00000300);
1982 nv_icmd(dev, 0x0000007b, 0x00000300);
1983 nv_icmd(dev, 0x0000007c, 0x00000300);
1984 nv_icmd(dev, 0x0000007d, 0x00000300);
1985 nv_icmd(dev, 0x0000007e, 0x00000300);
1986 nv_icmd(dev, 0x0000007f, 0x00000300);
1987 nv_icmd(dev, 0x00000050, 0x00000011);
1988 nv_icmd(dev, 0x00000058, 0x00000008);
1989 nv_icmd(dev, 0x00000059, 0x00000008);
1990 nv_icmd(dev, 0x0000005a, 0x00000008);
1991 nv_icmd(dev, 0x0000005b, 0x00000008);
1992 nv_icmd(dev, 0x0000005c, 0x00000008);
1993 nv_icmd(dev, 0x0000005d, 0x00000008);
1994 nv_icmd(dev, 0x0000005e, 0x00000008);
1995 nv_icmd(dev, 0x0000005f, 0x00000008);
1996 nv_icmd(dev, 0x00000208, 0x00000001);
1997 nv_icmd(dev, 0x00000209, 0x00000001);
1998 nv_icmd(dev, 0x0000020a, 0x00000001);
1999 nv_icmd(dev, 0x0000020b, 0x00000001);
2000 nv_icmd(dev, 0x0000020c, 0x00000001);
2001 nv_icmd(dev, 0x0000020d, 0x00000001);
2002 nv_icmd(dev, 0x0000020e, 0x00000001);
2003 nv_icmd(dev, 0x0000020f, 0x00000001);
2004 nv_icmd(dev, 0x00000081, 0x00000001);
2005 nv_icmd(dev, 0x00000085, 0x00000004);
2006 nv_icmd(dev, 0x00000088, 0x00000400);
2007 nv_icmd(dev, 0x00000090, 0x00000300);
2008 nv_icmd(dev, 0x00000098, 0x00001001);
2009 nv_icmd(dev, 0x000000e3, 0x00000001);
2010 nv_icmd(dev, 0x000000da, 0x00000001);
2011 nv_icmd(dev, 0x000000f8, 0x00000003);
2012 nv_icmd(dev, 0x000000fa, 0x00000001);
2013 nv_icmd(dev, 0x0000009f, 0x0000ffff);
2014 nv_icmd(dev, 0x000000a0, 0x0000ffff);
2015 nv_icmd(dev, 0x000000a1, 0x0000ffff);
2016 nv_icmd(dev, 0x000000a2, 0x0000ffff);
2017 nv_icmd(dev, 0x000000b1, 0x00000001);
2018 nv_icmd(dev, 0x000000b2, 0x00000000);
2019 nv_icmd(dev, 0x000000b3, 0x00000000);
2020 nv_icmd(dev, 0x000000b4, 0x00000000);
2021 nv_icmd(dev, 0x000000b5, 0x00000000);
2022 nv_icmd(dev, 0x000000b6, 0x00000000);
2023 nv_icmd(dev, 0x000000b7, 0x00000000);
2024 nv_icmd(dev, 0x000000b8, 0x00000000);
2025 nv_icmd(dev, 0x000000b9, 0x00000000);
2026 nv_icmd(dev, 0x000000ba, 0x00000000);
2027 nv_icmd(dev, 0x000000bb, 0x00000000);
2028 nv_icmd(dev, 0x000000bc, 0x00000000);
2029 nv_icmd(dev, 0x000000bd, 0x00000000);
2030 nv_icmd(dev, 0x000000be, 0x00000000);
2031 nv_icmd(dev, 0x000000bf, 0x00000000);
2032 nv_icmd(dev, 0x000000c0, 0x00000000);
2033 nv_icmd(dev, 0x000000c1, 0x00000000);
2034 nv_icmd(dev, 0x000000c2, 0x00000000);
2035 nv_icmd(dev, 0x000000c3, 0x00000000);
2036 nv_icmd(dev, 0x000000c4, 0x00000000);
2037 nv_icmd(dev, 0x000000c5, 0x00000000);
2038 nv_icmd(dev, 0x000000c6, 0x00000000);
2039 nv_icmd(dev, 0x000000c7, 0x00000000);
2040 nv_icmd(dev, 0x000000c8, 0x00000000);
2041 nv_icmd(dev, 0x000000c9, 0x00000000);
2042 nv_icmd(dev, 0x000000ca, 0x00000000);
2043 nv_icmd(dev, 0x000000cb, 0x00000000);
2044 nv_icmd(dev, 0x000000cc, 0x00000000);
2045 nv_icmd(dev, 0x000000cd, 0x00000000);
2046 nv_icmd(dev, 0x000000ce, 0x00000000);
2047 nv_icmd(dev, 0x000000cf, 0x00000000);
2048 nv_icmd(dev, 0x000000d0, 0x00000000);
2049 nv_icmd(dev, 0x000000d1, 0x00000000);
2050 nv_icmd(dev, 0x000000d2, 0x00000000);
2051 nv_icmd(dev, 0x000000d3, 0x00000000);
2052 nv_icmd(dev, 0x000000d4, 0x00000000);
2053 nv_icmd(dev, 0x000000d5, 0x00000000);
2054 nv_icmd(dev, 0x000000d6, 0x00000000);
2055 nv_icmd(dev, 0x000000d7, 0x00000000);
2056 nv_icmd(dev, 0x000000d8, 0x00000000);
2057 nv_icmd(dev, 0x000000d9, 0x00000000);
2058 nv_icmd(dev, 0x00000210, 0x00000040);
2059 nv_icmd(dev, 0x00000211, 0x00000040);
2060 nv_icmd(dev, 0x00000212, 0x00000040);
2061 nv_icmd(dev, 0x00000213, 0x00000040);
2062 nv_icmd(dev, 0x00000214, 0x00000040);
2063 nv_icmd(dev, 0x00000215, 0x00000040);
2064 nv_icmd(dev, 0x00000216, 0x00000040);
2065 nv_icmd(dev, 0x00000217, 0x00000040);
2066 nv_icmd(dev, 0x00000218, 0x0000c080);
2067 nv_icmd(dev, 0x00000219, 0x0000c080);
2068 nv_icmd(dev, 0x0000021a, 0x0000c080);
2069 nv_icmd(dev, 0x0000021b, 0x0000c080);
2070 nv_icmd(dev, 0x0000021c, 0x0000c080);
2071 nv_icmd(dev, 0x0000021d, 0x0000c080);
2072 nv_icmd(dev, 0x0000021e, 0x0000c080);
2073 nv_icmd(dev, 0x0000021f, 0x0000c080);
2074 nv_icmd(dev, 0x000000ad, 0x0000013e);
2075 nv_icmd(dev, 0x000000e1, 0x00000010);
2076 nv_icmd(dev, 0x00000290, 0x00000000);
2077 nv_icmd(dev, 0x00000291, 0x00000000);
2078 nv_icmd(dev, 0x00000292, 0x00000000);
2079 nv_icmd(dev, 0x00000293, 0x00000000);
2080 nv_icmd(dev, 0x00000294, 0x00000000);
2081 nv_icmd(dev, 0x00000295, 0x00000000);
2082 nv_icmd(dev, 0x00000296, 0x00000000);
2083 nv_icmd(dev, 0x00000297, 0x00000000);
2084 nv_icmd(dev, 0x00000298, 0x00000000);
2085 nv_icmd(dev, 0x00000299, 0x00000000);
2086 nv_icmd(dev, 0x0000029a, 0x00000000);
2087 nv_icmd(dev, 0x0000029b, 0x00000000);
2088 nv_icmd(dev, 0x0000029c, 0x00000000);
2089 nv_icmd(dev, 0x0000029d, 0x00000000);
2090 nv_icmd(dev, 0x0000029e, 0x00000000);
2091 nv_icmd(dev, 0x0000029f, 0x00000000);
2092 nv_icmd(dev, 0x000003b0, 0x00000000);
2093 nv_icmd(dev, 0x000003b1, 0x00000000);
2094 nv_icmd(dev, 0x000003b2, 0x00000000);
2095 nv_icmd(dev, 0x000003b3, 0x00000000);
2096 nv_icmd(dev, 0x000003b4, 0x00000000);
2097 nv_icmd(dev, 0x000003b5, 0x00000000);
2098 nv_icmd(dev, 0x000003b6, 0x00000000);
2099 nv_icmd(dev, 0x000003b7, 0x00000000);
2100 nv_icmd(dev, 0x000003b8, 0x00000000);
2101 nv_icmd(dev, 0x000003b9, 0x00000000);
2102 nv_icmd(dev, 0x000003ba, 0x00000000);
2103 nv_icmd(dev, 0x000003bb, 0x00000000);
2104 nv_icmd(dev, 0x000003bc, 0x00000000);
2105 nv_icmd(dev, 0x000003bd, 0x00000000);
2106 nv_icmd(dev, 0x000003be, 0x00000000);
2107 nv_icmd(dev, 0x000003bf, 0x00000000);
2108 nv_icmd(dev, 0x000002a0, 0x00000000);
2109 nv_icmd(dev, 0x000002a1, 0x00000000);
2110 nv_icmd(dev, 0x000002a2, 0x00000000);
2111 nv_icmd(dev, 0x000002a3, 0x00000000);
2112 nv_icmd(dev, 0x000002a4, 0x00000000);
2113 nv_icmd(dev, 0x000002a5, 0x00000000);
2114 nv_icmd(dev, 0x000002a6, 0x00000000);
2115 nv_icmd(dev, 0x000002a7, 0x00000000);
2116 nv_icmd(dev, 0x000002a8, 0x00000000);
2117 nv_icmd(dev, 0x000002a9, 0x00000000);
2118 nv_icmd(dev, 0x000002aa, 0x00000000);
2119 nv_icmd(dev, 0x000002ab, 0x00000000);
2120 nv_icmd(dev, 0x000002ac, 0x00000000);
2121 nv_icmd(dev, 0x000002ad, 0x00000000);
2122 nv_icmd(dev, 0x000002ae, 0x00000000);
2123 nv_icmd(dev, 0x000002af, 0x00000000);
2124 nv_icmd(dev, 0x00000420, 0x00000000);
2125 nv_icmd(dev, 0x00000421, 0x00000000);
2126 nv_icmd(dev, 0x00000422, 0x00000000);
2127 nv_icmd(dev, 0x00000423, 0x00000000);
2128 nv_icmd(dev, 0x00000424, 0x00000000);
2129 nv_icmd(dev, 0x00000425, 0x00000000);
2130 nv_icmd(dev, 0x00000426, 0x00000000);
2131 nv_icmd(dev, 0x00000427, 0x00000000);
2132 nv_icmd(dev, 0x00000428, 0x00000000);
2133 nv_icmd(dev, 0x00000429, 0x00000000);
2134 nv_icmd(dev, 0x0000042a, 0x00000000);
2135 nv_icmd(dev, 0x0000042b, 0x00000000);
2136 nv_icmd(dev, 0x0000042c, 0x00000000);
2137 nv_icmd(dev, 0x0000042d, 0x00000000);
2138 nv_icmd(dev, 0x0000042e, 0x00000000);
2139 nv_icmd(dev, 0x0000042f, 0x00000000);
2140 nv_icmd(dev, 0x000002b0, 0x00000000);
2141 nv_icmd(dev, 0x000002b1, 0x00000000);
2142 nv_icmd(dev, 0x000002b2, 0x00000000);
2143 nv_icmd(dev, 0x000002b3, 0x00000000);
2144 nv_icmd(dev, 0x000002b4, 0x00000000);
2145 nv_icmd(dev, 0x000002b5, 0x00000000);
2146 nv_icmd(dev, 0x000002b6, 0x00000000);
2147 nv_icmd(dev, 0x000002b7, 0x00000000);
2148 nv_icmd(dev, 0x000002b8, 0x00000000);
2149 nv_icmd(dev, 0x000002b9, 0x00000000);
2150 nv_icmd(dev, 0x000002ba, 0x00000000);
2151 nv_icmd(dev, 0x000002bb, 0x00000000);
2152 nv_icmd(dev, 0x000002bc, 0x00000000);
2153 nv_icmd(dev, 0x000002bd, 0x00000000);
2154 nv_icmd(dev, 0x000002be, 0x00000000);
2155 nv_icmd(dev, 0x000002bf, 0x00000000);
2156 nv_icmd(dev, 0x00000430, 0x00000000);
2157 nv_icmd(dev, 0x00000431, 0x00000000);
2158 nv_icmd(dev, 0x00000432, 0x00000000);
2159 nv_icmd(dev, 0x00000433, 0x00000000);
2160 nv_icmd(dev, 0x00000434, 0x00000000);
2161 nv_icmd(dev, 0x00000435, 0x00000000);
2162 nv_icmd(dev, 0x00000436, 0x00000000);
2163 nv_icmd(dev, 0x00000437, 0x00000000);
2164 nv_icmd(dev, 0x00000438, 0x00000000);
2165 nv_icmd(dev, 0x00000439, 0x00000000);
2166 nv_icmd(dev, 0x0000043a, 0x00000000);
2167 nv_icmd(dev, 0x0000043b, 0x00000000);
2168 nv_icmd(dev, 0x0000043c, 0x00000000);
2169 nv_icmd(dev, 0x0000043d, 0x00000000);
2170 nv_icmd(dev, 0x0000043e, 0x00000000);
2171 nv_icmd(dev, 0x0000043f, 0x00000000);
2172 nv_icmd(dev, 0x000002c0, 0x00000000);
2173 nv_icmd(dev, 0x000002c1, 0x00000000);
2174 nv_icmd(dev, 0x000002c2, 0x00000000);
2175 nv_icmd(dev, 0x000002c3, 0x00000000);
2176 nv_icmd(dev, 0x000002c4, 0x00000000);
2177 nv_icmd(dev, 0x000002c5, 0x00000000);
2178 nv_icmd(dev, 0x000002c6, 0x00000000);
2179 nv_icmd(dev, 0x000002c7, 0x00000000);
2180 nv_icmd(dev, 0x000002c8, 0x00000000);
2181 nv_icmd(dev, 0x000002c9, 0x00000000);
2182 nv_icmd(dev, 0x000002ca, 0x00000000);
2183 nv_icmd(dev, 0x000002cb, 0x00000000);
2184 nv_icmd(dev, 0x000002cc, 0x00000000);
2185 nv_icmd(dev, 0x000002cd, 0x00000000);
2186 nv_icmd(dev, 0x000002ce, 0x00000000);
2187 nv_icmd(dev, 0x000002cf, 0x00000000);
2188 nv_icmd(dev, 0x000004d0, 0x00000000);
2189 nv_icmd(dev, 0x000004d1, 0x00000000);
2190 nv_icmd(dev, 0x000004d2, 0x00000000);
2191 nv_icmd(dev, 0x000004d3, 0x00000000);
2192 nv_icmd(dev, 0x000004d4, 0x00000000);
2193 nv_icmd(dev, 0x000004d5, 0x00000000);
2194 nv_icmd(dev, 0x000004d6, 0x00000000);
2195 nv_icmd(dev, 0x000004d7, 0x00000000);
2196 nv_icmd(dev, 0x000004d8, 0x00000000);
2197 nv_icmd(dev, 0x000004d9, 0x00000000);
2198 nv_icmd(dev, 0x000004da, 0x00000000);
2199 nv_icmd(dev, 0x000004db, 0x00000000);
2200 nv_icmd(dev, 0x000004dc, 0x00000000);
2201 nv_icmd(dev, 0x000004dd, 0x00000000);
2202 nv_icmd(dev, 0x000004de, 0x00000000);
2203 nv_icmd(dev, 0x000004df, 0x00000000);
2204 nv_icmd(dev, 0x00000720, 0x00000000);
2205 nv_icmd(dev, 0x00000721, 0x00000000);
2206 nv_icmd(dev, 0x00000722, 0x00000000);
2207 nv_icmd(dev, 0x00000723, 0x00000000);
2208 nv_icmd(dev, 0x00000724, 0x00000000);
2209 nv_icmd(dev, 0x00000725, 0x00000000);
2210 nv_icmd(dev, 0x00000726, 0x00000000);
2211 nv_icmd(dev, 0x00000727, 0x00000000);
2212 nv_icmd(dev, 0x00000728, 0x00000000);
2213 nv_icmd(dev, 0x00000729, 0x00000000);
2214 nv_icmd(dev, 0x0000072a, 0x00000000);
2215 nv_icmd(dev, 0x0000072b, 0x00000000);
2216 nv_icmd(dev, 0x0000072c, 0x00000000);
2217 nv_icmd(dev, 0x0000072d, 0x00000000);
2218 nv_icmd(dev, 0x0000072e, 0x00000000);
2219 nv_icmd(dev, 0x0000072f, 0x00000000);
2220 nv_icmd(dev, 0x000008c0, 0x00000000);
2221 nv_icmd(dev, 0x000008c1, 0x00000000);
2222 nv_icmd(dev, 0x000008c2, 0x00000000);
2223 nv_icmd(dev, 0x000008c3, 0x00000000);
2224 nv_icmd(dev, 0x000008c4, 0x00000000);
2225 nv_icmd(dev, 0x000008c5, 0x00000000);
2226 nv_icmd(dev, 0x000008c6, 0x00000000);
2227 nv_icmd(dev, 0x000008c7, 0x00000000);
2228 nv_icmd(dev, 0x000008c8, 0x00000000);
2229 nv_icmd(dev, 0x000008c9, 0x00000000);
2230 nv_icmd(dev, 0x000008ca, 0x00000000);
2231 nv_icmd(dev, 0x000008cb, 0x00000000);
2232 nv_icmd(dev, 0x000008cc, 0x00000000);
2233 nv_icmd(dev, 0x000008cd, 0x00000000);
2234 nv_icmd(dev, 0x000008ce, 0x00000000);
2235 nv_icmd(dev, 0x000008cf, 0x00000000);
2236 nv_icmd(dev, 0x00000890, 0x00000000);
2237 nv_icmd(dev, 0x00000891, 0x00000000);
2238 nv_icmd(dev, 0x00000892, 0x00000000);
2239 nv_icmd(dev, 0x00000893, 0x00000000);
2240 nv_icmd(dev, 0x00000894, 0x00000000);
2241 nv_icmd(dev, 0x00000895, 0x00000000);
2242 nv_icmd(dev, 0x00000896, 0x00000000);
2243 nv_icmd(dev, 0x00000897, 0x00000000);
2244 nv_icmd(dev, 0x00000898, 0x00000000);
2245 nv_icmd(dev, 0x00000899, 0x00000000);
2246 nv_icmd(dev, 0x0000089a, 0x00000000);
2247 nv_icmd(dev, 0x0000089b, 0x00000000);
2248 nv_icmd(dev, 0x0000089c, 0x00000000);
2249 nv_icmd(dev, 0x0000089d, 0x00000000);
2250 nv_icmd(dev, 0x0000089e, 0x00000000);
2251 nv_icmd(dev, 0x0000089f, 0x00000000);
2252 nv_icmd(dev, 0x000008e0, 0x00000000);
2253 nv_icmd(dev, 0x000008e1, 0x00000000);
2254 nv_icmd(dev, 0x000008e2, 0x00000000);
2255 nv_icmd(dev, 0x000008e3, 0x00000000);
2256 nv_icmd(dev, 0x000008e4, 0x00000000);
2257 nv_icmd(dev, 0x000008e5, 0x00000000);
2258 nv_icmd(dev, 0x000008e6, 0x00000000);
2259 nv_icmd(dev, 0x000008e7, 0x00000000);
2260 nv_icmd(dev, 0x000008e8, 0x00000000);
2261 nv_icmd(dev, 0x000008e9, 0x00000000);
2262 nv_icmd(dev, 0x000008ea, 0x00000000);
2263 nv_icmd(dev, 0x000008eb, 0x00000000);
2264 nv_icmd(dev, 0x000008ec, 0x00000000);
2265 nv_icmd(dev, 0x000008ed, 0x00000000);
2266 nv_icmd(dev, 0x000008ee, 0x00000000);
2267 nv_icmd(dev, 0x000008ef, 0x00000000);
2268 nv_icmd(dev, 0x000008a0, 0x00000000);
2269 nv_icmd(dev, 0x000008a1, 0x00000000);
2270 nv_icmd(dev, 0x000008a2, 0x00000000);
2271 nv_icmd(dev, 0x000008a3, 0x00000000);
2272 nv_icmd(dev, 0x000008a4, 0x00000000);
2273 nv_icmd(dev, 0x000008a5, 0x00000000);
2274 nv_icmd(dev, 0x000008a6, 0x00000000);
2275 nv_icmd(dev, 0x000008a7, 0x00000000);
2276 nv_icmd(dev, 0x000008a8, 0x00000000);
2277 nv_icmd(dev, 0x000008a9, 0x00000000);
2278 nv_icmd(dev, 0x000008aa, 0x00000000);
2279 nv_icmd(dev, 0x000008ab, 0x00000000);
2280 nv_icmd(dev, 0x000008ac, 0x00000000);
2281 nv_icmd(dev, 0x000008ad, 0x00000000);
2282 nv_icmd(dev, 0x000008ae, 0x00000000);
2283 nv_icmd(dev, 0x000008af, 0x00000000);
2284 nv_icmd(dev, 0x000008f0, 0x00000000);
2285 nv_icmd(dev, 0x000008f1, 0x00000000);
2286 nv_icmd(dev, 0x000008f2, 0x00000000);
2287 nv_icmd(dev, 0x000008f3, 0x00000000);
2288 nv_icmd(dev, 0x000008f4, 0x00000000);
2289 nv_icmd(dev, 0x000008f5, 0x00000000);
2290 nv_icmd(dev, 0x000008f6, 0x00000000);
2291 nv_icmd(dev, 0x000008f7, 0x00000000);
2292 nv_icmd(dev, 0x000008f8, 0x00000000);
2293 nv_icmd(dev, 0x000008f9, 0x00000000);
2294 nv_icmd(dev, 0x000008fa, 0x00000000);
2295 nv_icmd(dev, 0x000008fb, 0x00000000);
2296 nv_icmd(dev, 0x000008fc, 0x00000000);
2297 nv_icmd(dev, 0x000008fd, 0x00000000);
2298 nv_icmd(dev, 0x000008fe, 0x00000000);
2299 nv_icmd(dev, 0x000008ff, 0x00000000);
2300 nv_icmd(dev, 0x0000094c, 0x000000ff);
2301 nv_icmd(dev, 0x0000094d, 0xffffffff);
2302 nv_icmd(dev, 0x0000094e, 0x00000002);
2303 nv_icmd(dev, 0x000002ec, 0x00000001);
2304 nv_icmd(dev, 0x00000303, 0x00000001);
2305 nv_icmd(dev, 0x000002e6, 0x00000001);
2306 nv_icmd(dev, 0x00000466, 0x00000052);
2307 nv_icmd(dev, 0x00000301, 0x3f800000);
2308 nv_icmd(dev, 0x00000304, 0x30201000);
2309 nv_icmd(dev, 0x00000305, 0x70605040);
2310 nv_icmd(dev, 0x00000306, 0xb8a89888);
2311 nv_icmd(dev, 0x00000307, 0xf8e8d8c8);
2312 nv_icmd(dev, 0x0000030a, 0x00ffff00);
2313 nv_icmd(dev, 0x0000030b, 0x0000001a);
2314 nv_icmd(dev, 0x0000030c, 0x00000001);
2315 nv_icmd(dev, 0x00000318, 0x00000001);
2316 nv_icmd(dev, 0x00000340, 0x00000000);
2317 nv_icmd(dev, 0x00000375, 0x00000001);
2318 nv_icmd(dev, 0x00000351, 0x00000100);
2319 nv_icmd(dev, 0x0000037d, 0x00000006);
2320 nv_icmd(dev, 0x000003a0, 0x00000002);
2321 nv_icmd(dev, 0x000003aa, 0x00000001);
2322 nv_icmd(dev, 0x000003a9, 0x00000001);
2323 nv_icmd(dev, 0x00000380, 0x00000001);
2324 nv_icmd(dev, 0x00000360, 0x00000040);
2325 nv_icmd(dev, 0x00000366, 0x00000000);
2326 nv_icmd(dev, 0x00000367, 0x00000000);
2327 nv_icmd(dev, 0x00000368, 0x00001fff);
2328 nv_icmd(dev, 0x00000370, 0x00000000);
2329 nv_icmd(dev, 0x00000371, 0x00000000);
2330 nv_icmd(dev, 0x00000372, 0x003fffff);
2331 nv_icmd(dev, 0x0000037a, 0x00000012);
2332 nv_icmd(dev, 0x000005e0, 0x00000022);
2333 nv_icmd(dev, 0x000005e1, 0x00000022);
2334 nv_icmd(dev, 0x000005e2, 0x00000022);
2335 nv_icmd(dev, 0x000005e3, 0x00000022);
2336 nv_icmd(dev, 0x000005e4, 0x00000022);
2337 nv_icmd(dev, 0x00000619, 0x00000003);
2338 nv_icmd(dev, 0x00000811, 0x00000003);
2339 nv_icmd(dev, 0x00000812, 0x00000004);
2340 nv_icmd(dev, 0x00000813, 0x00000006);
2341 nv_icmd(dev, 0x00000814, 0x00000008);
2342 nv_icmd(dev, 0x00000815, 0x0000000b);
2343 nv_icmd(dev, 0x00000800, 0x00000001);
2344 nv_icmd(dev, 0x00000801, 0x00000001);
2345 nv_icmd(dev, 0x00000802, 0x00000001);
2346 nv_icmd(dev, 0x00000803, 0x00000001);
2347 nv_icmd(dev, 0x00000804, 0x00000001);
2348 nv_icmd(dev, 0x00000805, 0x00000001);
2349 nv_icmd(dev, 0x00000632, 0x00000001);
2350 nv_icmd(dev, 0x00000633, 0x00000002);
2351 nv_icmd(dev, 0x00000634, 0x00000003);
2352 nv_icmd(dev, 0x00000635, 0x00000004);
2353 nv_icmd(dev, 0x00000654, 0x3f800000);
2354 nv_icmd(dev, 0x00000657, 0x3f800000);
2355 nv_icmd(dev, 0x00000655, 0x3f800000);
2356 nv_icmd(dev, 0x00000656, 0x3f800000);
2357 nv_icmd(dev, 0x000006cd, 0x3f800000);
2358 nv_icmd(dev, 0x000007f5, 0x3f800000);
2359 nv_icmd(dev, 0x000007dc, 0x39291909);
2360 nv_icmd(dev, 0x000007dd, 0x79695949);
2361 nv_icmd(dev, 0x000007de, 0xb9a99989);
2362 nv_icmd(dev, 0x000007df, 0xf9e9d9c9);
2363 nv_icmd(dev, 0x000007e8, 0x00003210);
2364 nv_icmd(dev, 0x000007e9, 0x00007654);
2365 nv_icmd(dev, 0x000007ea, 0x00000098);
2366 nv_icmd(dev, 0x000007ec, 0x39291909);
2367 nv_icmd(dev, 0x000007ed, 0x79695949);
2368 nv_icmd(dev, 0x000007ee, 0xb9a99989);
2369 nv_icmd(dev, 0x000007ef, 0xf9e9d9c9);
2370 nv_icmd(dev, 0x000007f0, 0x00003210);
2371 nv_icmd(dev, 0x000007f1, 0x00007654);
2372 nv_icmd(dev, 0x000007f2, 0x00000098);
2373 nv_icmd(dev, 0x000005a5, 0x00000001);
2374 nv_icmd(dev, 0x00000980, 0x00000000);
2375 nv_icmd(dev, 0x00000981, 0x00000000);
2376 nv_icmd(dev, 0x00000982, 0x00000000);
2377 nv_icmd(dev, 0x00000983, 0x00000000);
2378 nv_icmd(dev, 0x00000984, 0x00000000);
2379 nv_icmd(dev, 0x00000985, 0x00000000);
2380 nv_icmd(dev, 0x00000986, 0x00000000);
2381 nv_icmd(dev, 0x00000987, 0x00000000);
2382 nv_icmd(dev, 0x00000988, 0x00000000);
2383 nv_icmd(dev, 0x00000989, 0x00000000);
2384 nv_icmd(dev, 0x0000098a, 0x00000000);
2385 nv_icmd(dev, 0x0000098b, 0x00000000);
2386 nv_icmd(dev, 0x0000098c, 0x00000000);
2387 nv_icmd(dev, 0x0000098d, 0x00000000);
2388 nv_icmd(dev, 0x0000098e, 0x00000000);
2389 nv_icmd(dev, 0x0000098f, 0x00000000);
2390 nv_icmd(dev, 0x00000990, 0x00000000);
2391 nv_icmd(dev, 0x00000991, 0x00000000);
2392 nv_icmd(dev, 0x00000992, 0x00000000);
2393 nv_icmd(dev, 0x00000993, 0x00000000);
2394 nv_icmd(dev, 0x00000994, 0x00000000);
2395 nv_icmd(dev, 0x00000995, 0x00000000);
2396 nv_icmd(dev, 0x00000996, 0x00000000);
2397 nv_icmd(dev, 0x00000997, 0x00000000);
2398 nv_icmd(dev, 0x00000998, 0x00000000);
2399 nv_icmd(dev, 0x00000999, 0x00000000);
2400 nv_icmd(dev, 0x0000099a, 0x00000000);
2401 nv_icmd(dev, 0x0000099b, 0x00000000);
2402 nv_icmd(dev, 0x0000099c, 0x00000000);
2403 nv_icmd(dev, 0x0000099d, 0x00000000);
2404 nv_icmd(dev, 0x0000099e, 0x00000000);
2405 nv_icmd(dev, 0x0000099f, 0x00000000);
2406 nv_icmd(dev, 0x000009a0, 0x00000000);
2407 nv_icmd(dev, 0x000009a1, 0x00000000);
2408 nv_icmd(dev, 0x000009a2, 0x00000000);
2409 nv_icmd(dev, 0x000009a3, 0x00000000);
2410 nv_icmd(dev, 0x000009a4, 0x00000000);
2411 nv_icmd(dev, 0x000009a5, 0x00000000);
2412 nv_icmd(dev, 0x000009a6, 0x00000000);
2413 nv_icmd(dev, 0x000009a7, 0x00000000);
2414 nv_icmd(dev, 0x000009a8, 0x00000000);
2415 nv_icmd(dev, 0x000009a9, 0x00000000);
2416 nv_icmd(dev, 0x000009aa, 0x00000000);
2417 nv_icmd(dev, 0x000009ab, 0x00000000);
2418 nv_icmd(dev, 0x000009ac, 0x00000000);
2419 nv_icmd(dev, 0x000009ad, 0x00000000);
2420 nv_icmd(dev, 0x000009ae, 0x00000000);
2421 nv_icmd(dev, 0x000009af, 0x00000000);
2422 nv_icmd(dev, 0x000009b0, 0x00000000);
2423 nv_icmd(dev, 0x000009b1, 0x00000000);
2424 nv_icmd(dev, 0x000009b2, 0x00000000);
2425 nv_icmd(dev, 0x000009b3, 0x00000000);
2426 nv_icmd(dev, 0x000009b4, 0x00000000);
2427 nv_icmd(dev, 0x000009b5, 0x00000000);
2428 nv_icmd(dev, 0x000009b6, 0x00000000);
2429 nv_icmd(dev, 0x000009b7, 0x00000000);
2430 nv_icmd(dev, 0x000009b8, 0x00000000);
2431 nv_icmd(dev, 0x000009b9, 0x00000000);
2432 nv_icmd(dev, 0x000009ba, 0x00000000);
2433 nv_icmd(dev, 0x000009bb, 0x00000000);
2434 nv_icmd(dev, 0x000009bc, 0x00000000);
2435 nv_icmd(dev, 0x000009bd, 0x00000000);
2436 nv_icmd(dev, 0x000009be, 0x00000000);
2437 nv_icmd(dev, 0x000009bf, 0x00000000);
2438 nv_icmd(dev, 0x000009c0, 0x00000000);
2439 nv_icmd(dev, 0x000009c1, 0x00000000);
2440 nv_icmd(dev, 0x000009c2, 0x00000000);
2441 nv_icmd(dev, 0x000009c3, 0x00000000);
2442 nv_icmd(dev, 0x000009c4, 0x00000000);
2443 nv_icmd(dev, 0x000009c5, 0x00000000);
2444 nv_icmd(dev, 0x000009c6, 0x00000000);
2445 nv_icmd(dev, 0x000009c7, 0x00000000);
2446 nv_icmd(dev, 0x000009c8, 0x00000000);
2447 nv_icmd(dev, 0x000009c9, 0x00000000);
2448 nv_icmd(dev, 0x000009ca, 0x00000000);
2449 nv_icmd(dev, 0x000009cb, 0x00000000);
2450 nv_icmd(dev, 0x000009cc, 0x00000000);
2451 nv_icmd(dev, 0x000009cd, 0x00000000);
2452 nv_icmd(dev, 0x000009ce, 0x00000000);
2453 nv_icmd(dev, 0x000009cf, 0x00000000);
2454 nv_icmd(dev, 0x000009d0, 0x00000000);
2455 nv_icmd(dev, 0x000009d1, 0x00000000);
2456 nv_icmd(dev, 0x000009d2, 0x00000000);
2457 nv_icmd(dev, 0x000009d3, 0x00000000);
2458 nv_icmd(dev, 0x000009d4, 0x00000000);
2459 nv_icmd(dev, 0x000009d5, 0x00000000);
2460 nv_icmd(dev, 0x000009d6, 0x00000000);
2461 nv_icmd(dev, 0x000009d7, 0x00000000);
2462 nv_icmd(dev, 0x000009d8, 0x00000000);
2463 nv_icmd(dev, 0x000009d9, 0x00000000);
2464 nv_icmd(dev, 0x000009da, 0x00000000);
2465 nv_icmd(dev, 0x000009db, 0x00000000);
2466 nv_icmd(dev, 0x000009dc, 0x00000000);
2467 nv_icmd(dev, 0x000009dd, 0x00000000);
2468 nv_icmd(dev, 0x000009de, 0x00000000);
2469 nv_icmd(dev, 0x000009df, 0x00000000);
2470 nv_icmd(dev, 0x000009e0, 0x00000000);
2471 nv_icmd(dev, 0x000009e1, 0x00000000);
2472 nv_icmd(dev, 0x000009e2, 0x00000000);
2473 nv_icmd(dev, 0x000009e3, 0x00000000);
2474 nv_icmd(dev, 0x000009e4, 0x00000000);
2475 nv_icmd(dev, 0x000009e5, 0x00000000);
2476 nv_icmd(dev, 0x000009e6, 0x00000000);
2477 nv_icmd(dev, 0x000009e7, 0x00000000);
2478 nv_icmd(dev, 0x000009e8, 0x00000000);
2479 nv_icmd(dev, 0x000009e9, 0x00000000);
2480 nv_icmd(dev, 0x000009ea, 0x00000000);
2481 nv_icmd(dev, 0x000009eb, 0x00000000);
2482 nv_icmd(dev, 0x000009ec, 0x00000000);
2483 nv_icmd(dev, 0x000009ed, 0x00000000);
2484 nv_icmd(dev, 0x000009ee, 0x00000000);
2485 nv_icmd(dev, 0x000009ef, 0x00000000);
2486 nv_icmd(dev, 0x000009f0, 0x00000000);
2487 nv_icmd(dev, 0x000009f1, 0x00000000);
2488 nv_icmd(dev, 0x000009f2, 0x00000000);
2489 nv_icmd(dev, 0x000009f3, 0x00000000);
2490 nv_icmd(dev, 0x000009f4, 0x00000000);
2491 nv_icmd(dev, 0x000009f5, 0x00000000);
2492 nv_icmd(dev, 0x000009f6, 0x00000000);
2493 nv_icmd(dev, 0x000009f7, 0x00000000);
2494 nv_icmd(dev, 0x000009f8, 0x00000000);
2495 nv_icmd(dev, 0x000009f9, 0x00000000);
2496 nv_icmd(dev, 0x000009fa, 0x00000000);
2497 nv_icmd(dev, 0x000009fb, 0x00000000);
2498 nv_icmd(dev, 0x000009fc, 0x00000000);
2499 nv_icmd(dev, 0x000009fd, 0x00000000);
2500 nv_icmd(dev, 0x000009fe, 0x00000000);
2501 nv_icmd(dev, 0x000009ff, 0x00000000);
2502 nv_icmd(dev, 0x00000468, 0x00000004);
2503 nv_icmd(dev, 0x0000046c, 0x00000001);
2504 nv_icmd(dev, 0x00000470, 0x00000000);
2505 nv_icmd(dev, 0x00000471, 0x00000000);
2506 nv_icmd(dev, 0x00000472, 0x00000000);
2507 nv_icmd(dev, 0x00000473, 0x00000000);
2508 nv_icmd(dev, 0x00000474, 0x00000000);
2509 nv_icmd(dev, 0x00000475, 0x00000000);
2510 nv_icmd(dev, 0x00000476, 0x00000000);
2511 nv_icmd(dev, 0x00000477, 0x00000000);
2512 nv_icmd(dev, 0x00000478, 0x00000000);
2513 nv_icmd(dev, 0x00000479, 0x00000000);
2514 nv_icmd(dev, 0x0000047a, 0x00000000);
2515 nv_icmd(dev, 0x0000047b, 0x00000000);
2516 nv_icmd(dev, 0x0000047c, 0x00000000);
2517 nv_icmd(dev, 0x0000047d, 0x00000000);
2518 nv_icmd(dev, 0x0000047e, 0x00000000);
2519 nv_icmd(dev, 0x0000047f, 0x00000000);
2520 nv_icmd(dev, 0x00000480, 0x00000000);
2521 nv_icmd(dev, 0x00000481, 0x00000000);
2522 nv_icmd(dev, 0x00000482, 0x00000000);
2523 nv_icmd(dev, 0x00000483, 0x00000000);
2524 nv_icmd(dev, 0x00000484, 0x00000000);
2525 nv_icmd(dev, 0x00000485, 0x00000000);
2526 nv_icmd(dev, 0x00000486, 0x00000000);
2527 nv_icmd(dev, 0x00000487, 0x00000000);
2528 nv_icmd(dev, 0x00000488, 0x00000000);
2529 nv_icmd(dev, 0x00000489, 0x00000000);
2530 nv_icmd(dev, 0x0000048a, 0x00000000);
2531 nv_icmd(dev, 0x0000048b, 0x00000000);
2532 nv_icmd(dev, 0x0000048c, 0x00000000);
2533 nv_icmd(dev, 0x0000048d, 0x00000000);
2534 nv_icmd(dev, 0x0000048e, 0x00000000);
2535 nv_icmd(dev, 0x0000048f, 0x00000000);
2536 nv_icmd(dev, 0x00000490, 0x00000000);
2537 nv_icmd(dev, 0x00000491, 0x00000000);
2538 nv_icmd(dev, 0x00000492, 0x00000000);
2539 nv_icmd(dev, 0x00000493, 0x00000000);
2540 nv_icmd(dev, 0x00000494, 0x00000000);
2541 nv_icmd(dev, 0x00000495, 0x00000000);
2542 nv_icmd(dev, 0x00000496, 0x00000000);
2543 nv_icmd(dev, 0x00000497, 0x00000000);
2544 nv_icmd(dev, 0x00000498, 0x00000000);
2545 nv_icmd(dev, 0x00000499, 0x00000000);
2546 nv_icmd(dev, 0x0000049a, 0x00000000);
2547 nv_icmd(dev, 0x0000049b, 0x00000000);
2548 nv_icmd(dev, 0x0000049c, 0x00000000);
2549 nv_icmd(dev, 0x0000049d, 0x00000000);
2550 nv_icmd(dev, 0x0000049e, 0x00000000);
2551 nv_icmd(dev, 0x0000049f, 0x00000000);
2552 nv_icmd(dev, 0x000004a0, 0x00000000);
2553 nv_icmd(dev, 0x000004a1, 0x00000000);
2554 nv_icmd(dev, 0x000004a2, 0x00000000);
2555 nv_icmd(dev, 0x000004a3, 0x00000000);
2556 nv_icmd(dev, 0x000004a4, 0x00000000);
2557 nv_icmd(dev, 0x000004a5, 0x00000000);
2558 nv_icmd(dev, 0x000004a6, 0x00000000);
2559 nv_icmd(dev, 0x000004a7, 0x00000000);
2560 nv_icmd(dev, 0x000004a8, 0x00000000);
2561 nv_icmd(dev, 0x000004a9, 0x00000000);
2562 nv_icmd(dev, 0x000004aa, 0x00000000);
2563 nv_icmd(dev, 0x000004ab, 0x00000000);
2564 nv_icmd(dev, 0x000004ac, 0x00000000);
2565 nv_icmd(dev, 0x000004ad, 0x00000000);
2566 nv_icmd(dev, 0x000004ae, 0x00000000);
2567 nv_icmd(dev, 0x000004af, 0x00000000);
2568 nv_icmd(dev, 0x000004b0, 0x00000000);
2569 nv_icmd(dev, 0x000004b1, 0x00000000);
2570 nv_icmd(dev, 0x000004b2, 0x00000000);
2571 nv_icmd(dev, 0x000004b3, 0x00000000);
2572 nv_icmd(dev, 0x000004b4, 0x00000000);
2573 nv_icmd(dev, 0x000004b5, 0x00000000);
2574 nv_icmd(dev, 0x000004b6, 0x00000000);
2575 nv_icmd(dev, 0x000004b7, 0x00000000);
2576 nv_icmd(dev, 0x000004b8, 0x00000000);
2577 nv_icmd(dev, 0x000004b9, 0x00000000);
2578 nv_icmd(dev, 0x000004ba, 0x00000000);
2579 nv_icmd(dev, 0x000004bb, 0x00000000);
2580 nv_icmd(dev, 0x000004bc, 0x00000000);
2581 nv_icmd(dev, 0x000004bd, 0x00000000);
2582 nv_icmd(dev, 0x000004be, 0x00000000);
2583 nv_icmd(dev, 0x000004bf, 0x00000000);
2584 nv_icmd(dev, 0x000004c0, 0x00000000);
2585 nv_icmd(dev, 0x000004c1, 0x00000000);
2586 nv_icmd(dev, 0x000004c2, 0x00000000);
2587 nv_icmd(dev, 0x000004c3, 0x00000000);
2588 nv_icmd(dev, 0x000004c4, 0x00000000);
2589 nv_icmd(dev, 0x000004c5, 0x00000000);
2590 nv_icmd(dev, 0x000004c6, 0x00000000);
2591 nv_icmd(dev, 0x000004c7, 0x00000000);
2592 nv_icmd(dev, 0x000004c8, 0x00000000);
2593 nv_icmd(dev, 0x000004c9, 0x00000000);
2594 nv_icmd(dev, 0x000004ca, 0x00000000);
2595 nv_icmd(dev, 0x000004cb, 0x00000000);
2596 nv_icmd(dev, 0x000004cc, 0x00000000);
2597 nv_icmd(dev, 0x000004cd, 0x00000000);
2598 nv_icmd(dev, 0x000004ce, 0x00000000);
2599 nv_icmd(dev, 0x000004cf, 0x00000000);
2600 nv_icmd(dev, 0x00000510, 0x3f800000);
2601 nv_icmd(dev, 0x00000511, 0x3f800000);
2602 nv_icmd(dev, 0x00000512, 0x3f800000);
2603 nv_icmd(dev, 0x00000513, 0x3f800000);
2604 nv_icmd(dev, 0x00000514, 0x3f800000);
2605 nv_icmd(dev, 0x00000515, 0x3f800000);
2606 nv_icmd(dev, 0x00000516, 0x3f800000);
2607 nv_icmd(dev, 0x00000517, 0x3f800000);
2608 nv_icmd(dev, 0x00000518, 0x3f800000);
2609 nv_icmd(dev, 0x00000519, 0x3f800000);
2610 nv_icmd(dev, 0x0000051a, 0x3f800000);
2611 nv_icmd(dev, 0x0000051b, 0x3f800000);
2612 nv_icmd(dev, 0x0000051c, 0x3f800000);
2613 nv_icmd(dev, 0x0000051d, 0x3f800000);
2614 nv_icmd(dev, 0x0000051e, 0x3f800000);
2615 nv_icmd(dev, 0x0000051f, 0x3f800000);
2616 nv_icmd(dev, 0x00000520, 0x000002b6);
2617 nv_icmd(dev, 0x00000529, 0x00000001);
2618 nv_icmd(dev, 0x00000530, 0xffff0000);
2619 nv_icmd(dev, 0x00000531, 0xffff0000);
2620 nv_icmd(dev, 0x00000532, 0xffff0000);
2621 nv_icmd(dev, 0x00000533, 0xffff0000);
2622 nv_icmd(dev, 0x00000534, 0xffff0000);
2623 nv_icmd(dev, 0x00000535, 0xffff0000);
2624 nv_icmd(dev, 0x00000536, 0xffff0000);
2625 nv_icmd(dev, 0x00000537, 0xffff0000);
2626 nv_icmd(dev, 0x00000538, 0xffff0000);
2627 nv_icmd(dev, 0x00000539, 0xffff0000);
2628 nv_icmd(dev, 0x0000053a, 0xffff0000);
2629 nv_icmd(dev, 0x0000053b, 0xffff0000);
2630 nv_icmd(dev, 0x0000053c, 0xffff0000);
2631 nv_icmd(dev, 0x0000053d, 0xffff0000);
2632 nv_icmd(dev, 0x0000053e, 0xffff0000);
2633 nv_icmd(dev, 0x0000053f, 0xffff0000);
2634 nv_icmd(dev, 0x00000585, 0x0000003f);
2635 nv_icmd(dev, 0x00000576, 0x00000003);
2636 nv_icmd(dev, 0x00000586, 0x00000040);
2637 nv_icmd(dev, 0x00000582, 0x00000080);
2638 nv_icmd(dev, 0x00000583, 0x00000080);
2639 nv_icmd(dev, 0x000005c2, 0x00000001);
2640 nv_icmd(dev, 0x00000638, 0x00000001);
2641 nv_icmd(dev, 0x00000639, 0x00000001);
2642 nv_icmd(dev, 0x0000063a, 0x00000002);
2643 nv_icmd(dev, 0x0000063b, 0x00000001);
2644 nv_icmd(dev, 0x0000063c, 0x00000001);
2645 nv_icmd(dev, 0x0000063d, 0x00000002);
2646 nv_icmd(dev, 0x0000063e, 0x00000001);
2647 nv_icmd(dev, 0x000008b8, 0x00000001);
2648 nv_icmd(dev, 0x000008b9, 0x00000001);
2649 nv_icmd(dev, 0x000008ba, 0x00000001);
2650 nv_icmd(dev, 0x000008bb, 0x00000001);
2651 nv_icmd(dev, 0x000008bc, 0x00000001);
2652 nv_icmd(dev, 0x000008bd, 0x00000001);
2653 nv_icmd(dev, 0x000008be, 0x00000001);
2654 nv_icmd(dev, 0x000008bf, 0x00000001);
2655 nv_icmd(dev, 0x00000900, 0x00000001);
2656 nv_icmd(dev, 0x00000901, 0x00000001);
2657 nv_icmd(dev, 0x00000902, 0x00000001);
2658 nv_icmd(dev, 0x00000903, 0x00000001);
2659 nv_icmd(dev, 0x00000904, 0x00000001);
2660 nv_icmd(dev, 0x00000905, 0x00000001);
2661 nv_icmd(dev, 0x00000906, 0x00000001);
2662 nv_icmd(dev, 0x00000907, 0x00000001);
2663 nv_icmd(dev, 0x00000908, 0x00000002);
2664 nv_icmd(dev, 0x00000909, 0x00000002);
2665 nv_icmd(dev, 0x0000090a, 0x00000002);
2666 nv_icmd(dev, 0x0000090b, 0x00000002);
2667 nv_icmd(dev, 0x0000090c, 0x00000002);
2668 nv_icmd(dev, 0x0000090d, 0x00000002);
2669 nv_icmd(dev, 0x0000090e, 0x00000002);
2670 nv_icmd(dev, 0x0000090f, 0x00000002);
2671 nv_icmd(dev, 0x00000910, 0x00000001);
2672 nv_icmd(dev, 0x00000911, 0x00000001);
2673 nv_icmd(dev, 0x00000912, 0x00000001);
2674 nv_icmd(dev, 0x00000913, 0x00000001);
2675 nv_icmd(dev, 0x00000914, 0x00000001);
2676 nv_icmd(dev, 0x00000915, 0x00000001);
2677 nv_icmd(dev, 0x00000916, 0x00000001);
2678 nv_icmd(dev, 0x00000917, 0x00000001);
2679 nv_icmd(dev, 0x00000918, 0x00000001);
2680 nv_icmd(dev, 0x00000919, 0x00000001);
2681 nv_icmd(dev, 0x0000091a, 0x00000001);
2682 nv_icmd(dev, 0x0000091b, 0x00000001);
2683 nv_icmd(dev, 0x0000091c, 0x00000001);
2684 nv_icmd(dev, 0x0000091d, 0x00000001);
2685 nv_icmd(dev, 0x0000091e, 0x00000001);
2686 nv_icmd(dev, 0x0000091f, 0x00000001);
2687 nv_icmd(dev, 0x00000920, 0x00000002);
2688 nv_icmd(dev, 0x00000921, 0x00000002);
2689 nv_icmd(dev, 0x00000922, 0x00000002);
2690 nv_icmd(dev, 0x00000923, 0x00000002);
2691 nv_icmd(dev, 0x00000924, 0x00000002);
2692 nv_icmd(dev, 0x00000925, 0x00000002);
2693 nv_icmd(dev, 0x00000926, 0x00000002);
2694 nv_icmd(dev, 0x00000927, 0x00000002);
2695 nv_icmd(dev, 0x00000928, 0x00000001);
2696 nv_icmd(dev, 0x00000929, 0x00000001);
2697 nv_icmd(dev, 0x0000092a, 0x00000001);
2698 nv_icmd(dev, 0x0000092b, 0x00000001);
2699 nv_icmd(dev, 0x0000092c, 0x00000001);
2700 nv_icmd(dev, 0x0000092d, 0x00000001);
2701 nv_icmd(dev, 0x0000092e, 0x00000001);
2702 nv_icmd(dev, 0x0000092f, 0x00000001);
2703 nv_icmd(dev, 0x00000648, 0x00000001);
2704 nv_icmd(dev, 0x00000649, 0x00000001);
2705 nv_icmd(dev, 0x0000064a, 0x00000001);
2706 nv_icmd(dev, 0x0000064b, 0x00000001);
2707 nv_icmd(dev, 0x0000064c, 0x00000001);
2708 nv_icmd(dev, 0x0000064d, 0x00000001);
2709 nv_icmd(dev, 0x0000064e, 0x00000001);
2710 nv_icmd(dev, 0x0000064f, 0x00000001);
2711 nv_icmd(dev, 0x00000650, 0x00000001);
2712 nv_icmd(dev, 0x00000658, 0x0000000f);
2713 nv_icmd(dev, 0x000007ff, 0x0000000a);
2714 nv_icmd(dev, 0x0000066a, 0x40000000);
2715 nv_icmd(dev, 0x0000066b, 0x10000000);
2716 nv_icmd(dev, 0x0000066c, 0xffff0000);
2717 nv_icmd(dev, 0x0000066d, 0xffff0000);
2718 nv_icmd(dev, 0x000007af, 0x00000008);
2719 nv_icmd(dev, 0x000007b0, 0x00000008);
2720 nv_icmd(dev, 0x000007f6, 0x00000001);
2721 nv_icmd(dev, 0x000006b2, 0x00000055);
2722 nv_icmd(dev, 0x000007ad, 0x00000003);
2723 nv_icmd(dev, 0x00000937, 0x00000001);
2724 nv_icmd(dev, 0x00000971, 0x00000008);
2725 nv_icmd(dev, 0x00000972, 0x00000040);
2726 nv_icmd(dev, 0x00000973, 0x0000012c);
2727 nv_icmd(dev, 0x0000097c, 0x00000040);
2728 nv_icmd(dev, 0x00000979, 0x00000003);
2729 nv_icmd(dev, 0x00000975, 0x00000020);
2730 nv_icmd(dev, 0x00000976, 0x00000001);
2731 nv_icmd(dev, 0x00000977, 0x00000020);
2732 nv_icmd(dev, 0x00000978, 0x00000001);
2733 nv_icmd(dev, 0x00000957, 0x00000003);
2734 nv_icmd(dev, 0x0000095e, 0x20164010);
2735 nv_icmd(dev, 0x0000095f, 0x00000020);
2736 nv_icmd(dev, 0x00000683, 0x00000006);
2737 nv_icmd(dev, 0x00000685, 0x003fffff);
2738 nv_icmd(dev, 0x00000687, 0x00000c48);
2739 nv_icmd(dev, 0x000006a0, 0x00000005);
2740 nv_icmd(dev, 0x00000840, 0x00300008);
2741 nv_icmd(dev, 0x00000841, 0x04000080);
2742 nv_icmd(dev, 0x00000842, 0x00300008);
2743 nv_icmd(dev, 0x00000843, 0x04000080);
2744 nv_icmd(dev, 0x00000818, 0x00000000);
2745 nv_icmd(dev, 0x00000819, 0x00000000);
2746 nv_icmd(dev, 0x0000081a, 0x00000000);
2747 nv_icmd(dev, 0x0000081b, 0x00000000);
2748 nv_icmd(dev, 0x0000081c, 0x00000000);
2749 nv_icmd(dev, 0x0000081d, 0x00000000);
2750 nv_icmd(dev, 0x0000081e, 0x00000000);
2751 nv_icmd(dev, 0x0000081f, 0x00000000);
2752 nv_icmd(dev, 0x00000848, 0x00000000);
2753 nv_icmd(dev, 0x00000849, 0x00000000);
2754 nv_icmd(dev, 0x0000084a, 0x00000000);
2755 nv_icmd(dev, 0x0000084b, 0x00000000);
2756 nv_icmd(dev, 0x0000084c, 0x00000000);
2757 nv_icmd(dev, 0x0000084d, 0x00000000);
2758 nv_icmd(dev, 0x0000084e, 0x00000000);
2759 nv_icmd(dev, 0x0000084f, 0x00000000);
2760 nv_icmd(dev, 0x00000850, 0x00000000);
2761 nv_icmd(dev, 0x00000851, 0x00000000);
2762 nv_icmd(dev, 0x00000852, 0x00000000);
2763 nv_icmd(dev, 0x00000853, 0x00000000);
2764 nv_icmd(dev, 0x00000854, 0x00000000);
2765 nv_icmd(dev, 0x00000855, 0x00000000);
2766 nv_icmd(dev, 0x00000856, 0x00000000);
2767 nv_icmd(dev, 0x00000857, 0x00000000);
2768 nv_icmd(dev, 0x00000738, 0x00000000);
2769 nv_icmd(dev, 0x000006aa, 0x00000001);
2770 nv_icmd(dev, 0x000006ab, 0x00000002);
2771 nv_icmd(dev, 0x000006ac, 0x00000080);
2772 nv_icmd(dev, 0x000006ad, 0x00000100);
2773 nv_icmd(dev, 0x000006ae, 0x00000100);
2774 nv_icmd(dev, 0x000006b1, 0x00000011);
2775 nv_icmd(dev, 0x000006bb, 0x000000cf);
2776 nv_icmd(dev, 0x000006ce, 0x2a712488);
2777 nv_icmd(dev, 0x00000739, 0x4085c000);
2778 nv_icmd(dev, 0x0000073a, 0x00000080);
2779 nv_icmd(dev, 0x00000786, 0x80000100);
2780 nv_icmd(dev, 0x0000073c, 0x00010100);
2781 nv_icmd(dev, 0x0000073d, 0x02800000);
2782 nv_icmd(dev, 0x00000787, 0x000000cf);
2783 nv_icmd(dev, 0x0000078c, 0x00000008);
2784 nv_icmd(dev, 0x00000792, 0x00000001);
2785 nv_icmd(dev, 0x00000794, 0x00000001);
2786 nv_icmd(dev, 0x00000795, 0x00000001);
2787 nv_icmd(dev, 0x00000796, 0x00000001);
2788 nv_icmd(dev, 0x00000797, 0x000000cf);
2789 nv_icmd(dev, 0x00000836, 0x00000001);
2790 nv_icmd(dev, 0x0000079a, 0x00000002);
2791 nv_icmd(dev, 0x00000833, 0x04444480);
2792 nv_icmd(dev, 0x000007a1, 0x00000001);
2793 nv_icmd(dev, 0x000007a3, 0x00000001);
2794 nv_icmd(dev, 0x000007a4, 0x00000001);
2795 nv_icmd(dev, 0x000007a5, 0x00000001);
2796 nv_icmd(dev, 0x00000831, 0x00000004);
2797 nv_icmd(dev, 0x0000080c, 0x00000002);
2798 nv_icmd(dev, 0x0000080d, 0x00000100);
2799 nv_icmd(dev, 0x0000080e, 0x00000100);
2800 nv_icmd(dev, 0x0000080f, 0x00000001);
2801 nv_icmd(dev, 0x00000823, 0x00000002);
2802 nv_icmd(dev, 0x00000824, 0x00000100);
2803 nv_icmd(dev, 0x00000825, 0x00000100);
2804 nv_icmd(dev, 0x00000826, 0x00000001);
2805 nv_icmd(dev, 0x0000095d, 0x00000001);
2806 nv_icmd(dev, 0x0000082b, 0x00000004);
2807 nv_icmd(dev, 0x00000942, 0x00010001);
2808 nv_icmd(dev, 0x00000943, 0x00000001);
2809 nv_icmd(dev, 0x00000944, 0x00000022);
2810 nv_icmd(dev, 0x000007c5, 0x00010001);
2811 nv_icmd(dev, 0x00000834, 0x00000001);
2812 nv_icmd(dev, 0x000007c7, 0x00000001);
2813 nv_icmd(dev, 0x0000c1b0, 0x0000000f);
2814 nv_icmd(dev, 0x0000c1b1, 0x0000000f);
2815 nv_icmd(dev, 0x0000c1b2, 0x0000000f);
2816 nv_icmd(dev, 0x0000c1b3, 0x0000000f);
2817 nv_icmd(dev, 0x0000c1b4, 0x0000000f);
2818 nv_icmd(dev, 0x0000c1b5, 0x0000000f);
2819 nv_icmd(dev, 0x0000c1b6, 0x0000000f);
2820 nv_icmd(dev, 0x0000c1b7, 0x0000000f);
2821 nv_icmd(dev, 0x0000c1b8, 0x0fac6881);
2822 nv_icmd(dev, 0x0000c1b9, 0x00fac688);
2823 nv_icmd(dev, 0x0001e100, 0x00000001);
2824 nv_icmd(dev, 0x00001000, 0x00000002);
2825 nv_icmd(dev, 0x000006aa, 0x00000001);
2826 nv_icmd(dev, 0x000006ad, 0x00000100);
2827 nv_icmd(dev, 0x000006ae, 0x00000100);
2828 nv_icmd(dev, 0x000006b1, 0x00000011);
2829 nv_icmd(dev, 0x0000078c, 0x00000008);
2830 nv_icmd(dev, 0x00000792, 0x00000001);
2831 nv_icmd(dev, 0x00000794, 0x00000001);
2832 nv_icmd(dev, 0x00000795, 0x00000001);
2833 nv_icmd(dev, 0x00000796, 0x00000001);
2834 nv_icmd(dev, 0x00000797, 0x000000cf);
2835 nv_icmd(dev, 0x0000079a, 0x00000002);
2836 nv_icmd(dev, 0x00000833, 0x04444480);
2837 nv_icmd(dev, 0x000007a1, 0x00000001);
2838 nv_icmd(dev, 0x000007a3, 0x00000001);
2839 nv_icmd(dev, 0x000007a4, 0x00000001);
2840 nv_icmd(dev, 0x000007a5, 0x00000001);
2841 nv_icmd(dev, 0x00000831, 0x00000004);
2842 nv_icmd(dev, 0x0001e100, 0x00000001);
2843 nv_icmd(dev, 0x00001000, 0x00000014);
2844 nv_icmd(dev, 0x00000351, 0x00000100);
2845 nv_icmd(dev, 0x00000957, 0x00000003);
2846 nv_icmd(dev, 0x0000095d, 0x00000001);
2847 nv_icmd(dev, 0x0000082b, 0x00000004);
2848 nv_icmd(dev, 0x00000942, 0x00010001);
2849 nv_icmd(dev, 0x00000943, 0x00000001);
2850 nv_icmd(dev, 0x000007c5, 0x00010001);
2851 nv_icmd(dev, 0x00000834, 0x00000001);
2852 nv_icmd(dev, 0x000007c7, 0x00000001);
2853 nv_icmd(dev, 0x0001e100, 0x00000001);
2854 nv_icmd(dev, 0x00001000, 0x00000001);
2855 nv_icmd(dev, 0x0000080c, 0x00000002);
2856 nv_icmd(dev, 0x0000080d, 0x00000100);
2857 nv_icmd(dev, 0x0000080e, 0x00000100);
2858 nv_icmd(dev, 0x0000080f, 0x00000001);
2859 nv_icmd(dev, 0x00000823, 0x00000002);
2860 nv_icmd(dev, 0x00000824, 0x00000100);
2861 nv_icmd(dev, 0x00000825, 0x00000100);
2862 nv_icmd(dev, 0x00000826, 0x00000001);
2863 nv_icmd(dev, 0x0001e100, 0x00000001);
2864 nv_wr32(dev, 0x400208, 0x00000000);
2865 nv_wr32(dev, 0x404154, 0x00000400);
2866
2867 nvc0_grctx_generate_9097(dev);
2868 nvc0_grctx_generate_902d(dev);
2869 nvc0_grctx_generate_9039(dev);
2870 nvc0_grctx_generate_90c0(dev);
2871
2872 nv_wr32(dev, 0x000260, r000260);
2873 return 0;
2874}
diff --git a/drivers/gpu/drm/nouveau/nvc0_instmem.c b/drivers/gpu/drm/nouveau/nvc0_instmem.c
index 6b451f864783..82357d2df1f4 100644
--- a/drivers/gpu/drm/nouveau/nvc0_instmem.c
+++ b/drivers/gpu/drm/nouveau/nvc0_instmem.c
@@ -25,211 +25,207 @@
25#include "drmP.h" 25#include "drmP.h"
26 26
27#include "nouveau_drv.h" 27#include "nouveau_drv.h"
28#include "nouveau_vm.h"
29
30struct nvc0_instmem_priv {
31 struct nouveau_gpuobj *bar1_pgd;
32 struct nouveau_channel *bar1;
33 struct nouveau_gpuobj *bar3_pgd;
34 struct nouveau_channel *bar3;
35 struct nouveau_gpuobj *chan_pgd;
36};
28 37
29int 38int
30nvc0_instmem_populate(struct drm_device *dev, struct nouveau_gpuobj *gpuobj, 39nvc0_instmem_suspend(struct drm_device *dev)
31 uint32_t *size)
32{ 40{
33 int ret; 41 struct drm_nouveau_private *dev_priv = dev->dev_private;
34
35 *size = ALIGN(*size, 4096);
36 if (*size == 0)
37 return -EINVAL;
38
39 ret = nouveau_bo_new(dev, NULL, *size, 0, TTM_PL_FLAG_VRAM, 0, 0x0000,
40 true, false, &gpuobj->im_backing);
41 if (ret) {
42 NV_ERROR(dev, "error getting PRAMIN backing pages: %d\n", ret);
43 return ret;
44 }
45
46 ret = nouveau_bo_pin(gpuobj->im_backing, TTM_PL_FLAG_VRAM);
47 if (ret) {
48 NV_ERROR(dev, "error pinning PRAMIN backing VRAM: %d\n", ret);
49 nouveau_bo_ref(NULL, &gpuobj->im_backing);
50 return ret;
51 }
52 42
53 gpuobj->im_backing_start = gpuobj->im_backing->bo.mem.mm_node->start; 43 dev_priv->ramin_available = false;
54 gpuobj->im_backing_start <<= PAGE_SHIFT;
55 return 0; 44 return 0;
56} 45}
57 46
58void 47void
59nvc0_instmem_clear(struct drm_device *dev, struct nouveau_gpuobj *gpuobj) 48nvc0_instmem_resume(struct drm_device *dev)
60{ 49{
61 struct drm_nouveau_private *dev_priv = dev->dev_private; 50 struct drm_nouveau_private *dev_priv = dev->dev_private;
51 struct nvc0_instmem_priv *priv = dev_priv->engine.instmem.priv;
62 52
63 if (gpuobj && gpuobj->im_backing) { 53 nv_mask(dev, 0x100c80, 0x00000001, 0x00000000);
64 if (gpuobj->im_bound) 54 nv_wr32(dev, 0x001704, 0x80000000 | priv->bar1->ramin->vinst >> 12);
65 dev_priv->engine.instmem.unbind(dev, gpuobj); 55 nv_wr32(dev, 0x001714, 0xc0000000 | priv->bar3->ramin->vinst >> 12);
66 nouveau_bo_unpin(gpuobj->im_backing); 56 dev_priv->ramin_available = true;
67 nouveau_bo_ref(NULL, &gpuobj->im_backing);
68 gpuobj->im_backing = NULL;
69 }
70} 57}
71 58
72int 59static void
73nvc0_instmem_bind(struct drm_device *dev, struct nouveau_gpuobj *gpuobj) 60nvc0_channel_del(struct nouveau_channel **pchan)
74{ 61{
75 struct drm_nouveau_private *dev_priv = dev->dev_private; 62 struct nouveau_channel *chan;
76 uint32_t pte, pte_end; 63
77 uint64_t vram; 64 chan = *pchan;
78 65 *pchan = NULL;
79 if (!gpuobj->im_backing || !gpuobj->im_pramin || gpuobj->im_bound) 66 if (!chan)
80 return -EINVAL; 67 return;
81 68
82 NV_DEBUG(dev, "st=0x%lx sz=0x%lx\n", 69 nouveau_vm_ref(NULL, &chan->vm, NULL);
83 gpuobj->im_pramin->start, gpuobj->im_pramin->size); 70 if (drm_mm_initialized(&chan->ramin_heap))
71 drm_mm_takedown(&chan->ramin_heap);
72 nouveau_gpuobj_ref(NULL, &chan->ramin);
73 kfree(chan);
74}
84 75
85 pte = gpuobj->im_pramin->start >> 12; 76static int
86 pte_end = (gpuobj->im_pramin->size >> 12) + pte; 77nvc0_channel_new(struct drm_device *dev, u32 size, struct nouveau_vm *vm,
87 vram = gpuobj->im_backing_start; 78 struct nouveau_channel **pchan,
79 struct nouveau_gpuobj *pgd, u64 vm_size)
80{
81 struct nouveau_channel *chan;
82 int ret;
88 83
89 NV_DEBUG(dev, "pramin=0x%lx, pte=%d, pte_end=%d\n", 84 chan = kzalloc(sizeof(*chan), GFP_KERNEL);
90 gpuobj->im_pramin->start, pte, pte_end); 85 if (!chan)
91 NV_DEBUG(dev, "first vram page: 0x%08x\n", gpuobj->im_backing_start); 86 return -ENOMEM;
87 chan->dev = dev;
92 88
93 while (pte < pte_end) { 89 ret = nouveau_gpuobj_new(dev, NULL, size, 0x1000, 0, &chan->ramin);
94 nv_wr32(dev, 0x702000 + (pte * 8), (vram >> 8) | 1); 90 if (ret) {
95 nv_wr32(dev, 0x702004 + (pte * 8), 0); 91 nvc0_channel_del(&chan);
96 vram += 4096; 92 return ret;
97 pte++;
98 } 93 }
99 dev_priv->engine.instmem.flush(dev);
100 94
101 if (1) { 95 ret = drm_mm_init(&chan->ramin_heap, 0x1000, size - 0x1000);
102 u32 chan = nv_rd32(dev, 0x1700) << 16; 96 if (ret) {
103 nv_wr32(dev, 0x100cb8, (chan + 0x1000) >> 8); 97 nvc0_channel_del(&chan);
104 nv_wr32(dev, 0x100cbc, 0x80000005); 98 return ret;
105 } 99 }
106 100
107 gpuobj->im_bound = 1; 101 ret = nouveau_vm_ref(vm, &chan->vm, NULL);
108 return 0; 102 if (ret) {
109} 103 nvc0_channel_del(&chan);
110 104 return ret;
111int
112nvc0_instmem_unbind(struct drm_device *dev, struct nouveau_gpuobj *gpuobj)
113{
114 struct drm_nouveau_private *dev_priv = dev->dev_private;
115 uint32_t pte, pte_end;
116
117 if (gpuobj->im_bound == 0)
118 return -EINVAL;
119
120 pte = gpuobj->im_pramin->start >> 12;
121 pte_end = (gpuobj->im_pramin->size >> 12) + pte;
122 while (pte < pte_end) {
123 nv_wr32(dev, 0x702000 + (pte * 8), 0);
124 nv_wr32(dev, 0x702004 + (pte * 8), 0);
125 pte++;
126 } 105 }
127 dev_priv->engine.instmem.flush(dev);
128 106
129 gpuobj->im_bound = 0; 107 nv_wo32(chan->ramin, 0x0200, lower_32_bits(pgd->vinst));
130 return 0; 108 nv_wo32(chan->ramin, 0x0204, upper_32_bits(pgd->vinst));
131} 109 nv_wo32(chan->ramin, 0x0208, lower_32_bits(vm_size - 1));
110 nv_wo32(chan->ramin, 0x020c, upper_32_bits(vm_size - 1));
132 111
133void 112 *pchan = chan;
134nvc0_instmem_flush(struct drm_device *dev) 113 return 0;
135{
136 nv_wr32(dev, 0x070000, 1);
137 if (!nv_wait(0x070000, 0x00000002, 0x00000000))
138 NV_ERROR(dev, "PRAMIN flush timeout\n");
139} 114}
140 115
141int 116int
142nvc0_instmem_suspend(struct drm_device *dev) 117nvc0_instmem_init(struct drm_device *dev)
143{ 118{
144 struct drm_nouveau_private *dev_priv = dev->dev_private; 119 struct drm_nouveau_private *dev_priv = dev->dev_private;
145 u32 *buf; 120 struct nouveau_instmem_engine *pinstmem = &dev_priv->engine.instmem;
146 int i; 121 struct pci_dev *pdev = dev->pdev;
122 struct nvc0_instmem_priv *priv;
123 struct nouveau_vm *vm = NULL;
124 int ret;
147 125
148 dev_priv->susres.ramin_copy = vmalloc(65536); 126 priv = kzalloc(sizeof(*priv), GFP_KERNEL);
149 if (!dev_priv->susres.ramin_copy) 127 if (!priv)
150 return -ENOMEM; 128 return -ENOMEM;
151 buf = dev_priv->susres.ramin_copy; 129 pinstmem->priv = priv;
152 130
153 for (i = 0; i < 65536; i += 4) 131 /* BAR3 VM */
154 buf[i/4] = nv_rd32(dev, NV04_PRAMIN + i); 132 ret = nouveau_vm_new(dev, 0, pci_resource_len(pdev, 3), 0,
133 &dev_priv->bar3_vm);
134 if (ret)
135 goto error;
136
137 ret = nouveau_gpuobj_new(dev, NULL,
138 (pci_resource_len(pdev, 3) >> 12) * 8, 0,
139 NVOBJ_FLAG_DONT_MAP |
140 NVOBJ_FLAG_ZERO_ALLOC,
141 &dev_priv->bar3_vm->pgt[0].obj[0]);
142 if (ret)
143 goto error;
144 dev_priv->bar3_vm->pgt[0].refcount[0] = 1;
145
146 nv50_instmem_map(dev_priv->bar3_vm->pgt[0].obj[0]);
147
148 ret = nouveau_gpuobj_new(dev, NULL, 0x8000, 4096,
149 NVOBJ_FLAG_ZERO_ALLOC, &priv->bar3_pgd);
150 if (ret)
151 goto error;
152
153 ret = nouveau_vm_ref(dev_priv->bar3_vm, &vm, priv->bar3_pgd);
154 if (ret)
155 goto error;
156 nouveau_vm_ref(NULL, &vm, NULL);
157
158 ret = nvc0_channel_new(dev, 8192, dev_priv->bar3_vm, &priv->bar3,
159 priv->bar3_pgd, pci_resource_len(dev->pdev, 3));
160 if (ret)
161 goto error;
162
163 /* BAR1 VM */
164 ret = nouveau_vm_new(dev, 0, pci_resource_len(pdev, 1), 0, &vm);
165 if (ret)
166 goto error;
167
168 ret = nouveau_gpuobj_new(dev, NULL, 0x8000, 4096,
169 NVOBJ_FLAG_ZERO_ALLOC, &priv->bar1_pgd);
170 if (ret)
171 goto error;
172
173 ret = nouveau_vm_ref(vm, &dev_priv->bar1_vm, priv->bar1_pgd);
174 if (ret)
175 goto error;
176 nouveau_vm_ref(NULL, &vm, NULL);
177
178 ret = nvc0_channel_new(dev, 8192, dev_priv->bar1_vm, &priv->bar1,
179 priv->bar1_pgd, pci_resource_len(dev->pdev, 1));
180 if (ret)
181 goto error;
182
183 /* channel vm */
184 ret = nouveau_vm_new(dev, 0, (1ULL << 40), 0x0008000000ULL, &vm);
185 if (ret)
186 goto error;
187
188 ret = nouveau_gpuobj_new(dev, NULL, 0x8000, 4096, 0, &priv->chan_pgd);
189 if (ret)
190 goto error;
191
192 nouveau_vm_ref(vm, &dev_priv->chan_vm, priv->chan_pgd);
193 nouveau_vm_ref(NULL, &vm, NULL);
194
195 nvc0_instmem_resume(dev);
155 return 0; 196 return 0;
197error:
198 nvc0_instmem_takedown(dev);
199 return ret;
156} 200}
157 201
158void 202void
159nvc0_instmem_resume(struct drm_device *dev) 203nvc0_instmem_takedown(struct drm_device *dev)
160{ 204{
161 struct drm_nouveau_private *dev_priv = dev->dev_private; 205 struct drm_nouveau_private *dev_priv = dev->dev_private;
162 u32 *buf = dev_priv->susres.ramin_copy; 206 struct nvc0_instmem_priv *priv = dev_priv->engine.instmem.priv;
163 u64 chan; 207 struct nouveau_vm *vm = NULL;
164 int i;
165 208
166 chan = dev_priv->vram_size - dev_priv->ramin_rsvd_vram; 209 nvc0_instmem_suspend(dev);
167 nv_wr32(dev, 0x001700, chan >> 16);
168 210
169 for (i = 0; i < 65536; i += 4) 211 nv_wr32(dev, 0x1704, 0x00000000);
170 nv_wr32(dev, NV04_PRAMIN + i, buf[i/4]); 212 nv_wr32(dev, 0x1714, 0x00000000);
171 vfree(dev_priv->susres.ramin_copy);
172 dev_priv->susres.ramin_copy = NULL;
173 213
174 nv_wr32(dev, 0x001714, 0xc0000000 | (chan >> 12)); 214 nouveau_vm_ref(NULL, &dev_priv->chan_vm, priv->chan_pgd);
175} 215 nouveau_gpuobj_ref(NULL, &priv->chan_pgd);
176 216
177int 217 nvc0_channel_del(&priv->bar1);
178nvc0_instmem_init(struct drm_device *dev) 218 nouveau_vm_ref(NULL, &dev_priv->bar1_vm, priv->bar1_pgd);
179{ 219 nouveau_gpuobj_ref(NULL, &priv->bar1_pgd);
180 struct drm_nouveau_private *dev_priv = dev->dev_private;
181 u64 chan, pgt3, imem, lim3 = dev_priv->ramin_size - 1;
182 int ret, i;
183
184 dev_priv->ramin_rsvd_vram = 1 * 1024 * 1024;
185 chan = dev_priv->vram_size - dev_priv->ramin_rsvd_vram;
186 imem = 4096 + 4096 + 32768;
187
188 nv_wr32(dev, 0x001700, chan >> 16);
189
190 /* channel setup */
191 nv_wr32(dev, 0x700200, lower_32_bits(chan + 0x1000));
192 nv_wr32(dev, 0x700204, upper_32_bits(chan + 0x1000));
193 nv_wr32(dev, 0x700208, lower_32_bits(lim3));
194 nv_wr32(dev, 0x70020c, upper_32_bits(lim3));
195
196 /* point pgd -> pgt */
197 nv_wr32(dev, 0x701000, 0);
198 nv_wr32(dev, 0x701004, ((chan + 0x2000) >> 8) | 1);
199
200 /* point pgt -> physical vram for channel */
201 pgt3 = 0x2000;
202 for (i = 0; i < dev_priv->ramin_rsvd_vram; i += 4096, pgt3 += 8) {
203 nv_wr32(dev, 0x700000 + pgt3, ((chan + i) >> 8) | 1);
204 nv_wr32(dev, 0x700004 + pgt3, 0);
205 }
206
207 /* clear rest of pgt */
208 for (; i < dev_priv->ramin_size; i += 4096, pgt3 += 8) {
209 nv_wr32(dev, 0x700000 + pgt3, 0);
210 nv_wr32(dev, 0x700004 + pgt3, 0);
211 }
212
213 /* point bar3 at the channel */
214 nv_wr32(dev, 0x001714, 0xc0000000 | (chan >> 12));
215
216 /* Global PRAMIN heap */
217 ret = drm_mm_init(&dev_priv->ramin_heap, imem,
218 dev_priv->ramin_size - imem);
219 if (ret) {
220 NV_ERROR(dev, "Failed to init RAMIN heap\n");
221 return -ENOMEM;
222 }
223 220
224 /*XXX: incorrect, but needed to make hash func "work" */ 221 nvc0_channel_del(&priv->bar3);
225 dev_priv->ramht_offset = 0x10000; 222 nouveau_vm_ref(dev_priv->bar3_vm, &vm, NULL);
226 dev_priv->ramht_bits = 9; 223 nouveau_vm_ref(NULL, &vm, priv->bar3_pgd);
227 dev_priv->ramht_size = (1 << dev_priv->ramht_bits) * 8; 224 nouveau_gpuobj_ref(NULL, &priv->bar3_pgd);
228 return 0; 225 nouveau_gpuobj_ref(NULL, &dev_priv->bar3_vm->pgt[0].obj[0]);
229} 226 nouveau_vm_ref(NULL, &dev_priv->bar3_vm, NULL);
230 227
231void 228 dev_priv->engine.instmem.priv = NULL;
232nvc0_instmem_takedown(struct drm_device *dev) 229 kfree(priv);
233{
234} 230}
235 231
diff --git a/drivers/gpu/drm/nouveau/nvc0_vm.c b/drivers/gpu/drm/nouveau/nvc0_vm.c
new file mode 100644
index 000000000000..a179e6c55afb
--- /dev/null
+++ b/drivers/gpu/drm/nouveau/nvc0_vm.c
@@ -0,0 +1,130 @@
1/*
2 * Copyright 2010 Red Hat 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: Ben Skeggs
23 */
24
25#include "drmP.h"
26
27#include "nouveau_drv.h"
28#include "nouveau_vm.h"
29
30void
31nvc0_vm_map_pgt(struct nouveau_gpuobj *pgd, u32 index,
32 struct nouveau_gpuobj *pgt[2])
33{
34 u32 pde[2] = { 0, 0 };
35
36 if (pgt[0])
37 pde[1] = 0x00000001 | (pgt[0]->vinst >> 8);
38 if (pgt[1])
39 pde[0] = 0x00000001 | (pgt[1]->vinst >> 8);
40
41 nv_wo32(pgd, (index * 8) + 0, pde[0]);
42 nv_wo32(pgd, (index * 8) + 4, pde[1]);
43}
44
45static inline u64
46nvc0_vm_addr(struct nouveau_vma *vma, u64 phys, u32 memtype, u32 target)
47{
48 phys >>= 8;
49
50 phys |= 0x00000001; /* present */
51 if (vma->access & NV_MEM_ACCESS_SYS)
52 phys |= 0x00000002;
53
54 phys |= ((u64)target << 32);
55 phys |= ((u64)memtype << 36);
56
57 return phys;
58}
59
60void
61nvc0_vm_map(struct nouveau_vma *vma, struct nouveau_gpuobj *pgt,
62 struct nouveau_mem *mem, u32 pte, u32 cnt, u64 phys, u64 delta)
63{
64 u32 next = 1 << (vma->node->type - 8);
65
66 phys = nvc0_vm_addr(vma, phys, mem->memtype, 0);
67 pte <<= 3;
68 while (cnt--) {
69 nv_wo32(pgt, pte + 0, lower_32_bits(phys));
70 nv_wo32(pgt, pte + 4, upper_32_bits(phys));
71 phys += next;
72 pte += 8;
73 }
74}
75
76void
77nvc0_vm_map_sg(struct nouveau_vma *vma, struct nouveau_gpuobj *pgt,
78 struct nouveau_mem *mem, u32 pte, u32 cnt, dma_addr_t *list)
79{
80 pte <<= 3;
81 while (cnt--) {
82 u64 phys = nvc0_vm_addr(vma, *list++, mem->memtype, 5);
83 nv_wo32(pgt, pte + 0, lower_32_bits(phys));
84 nv_wo32(pgt, pte + 4, upper_32_bits(phys));
85 pte += 8;
86 }
87}
88
89void
90nvc0_vm_unmap(struct nouveau_gpuobj *pgt, u32 pte, u32 cnt)
91{
92 pte <<= 3;
93 while (cnt--) {
94 nv_wo32(pgt, pte + 0, 0x00000000);
95 nv_wo32(pgt, pte + 4, 0x00000000);
96 pte += 8;
97 }
98}
99
100void
101nvc0_vm_flush(struct nouveau_vm *vm)
102{
103 struct drm_nouveau_private *dev_priv = vm->dev->dev_private;
104 struct nouveau_instmem_engine *pinstmem = &dev_priv->engine.instmem;
105 struct drm_device *dev = vm->dev;
106 struct nouveau_vm_pgd *vpgd;
107 unsigned long flags;
108 u32 engine = (dev_priv->chan_vm == vm) ? 1 : 5;
109
110 pinstmem->flush(vm->dev);
111
112 spin_lock_irqsave(&dev_priv->vm_lock, flags);
113 list_for_each_entry(vpgd, &vm->pgd_list, head) {
114 /* looks like maybe a "free flush slots" counter, the
115 * faster you write to 0x100cbc to more it decreases
116 */
117 if (!nv_wait_ne(dev, 0x100c80, 0x00ff0000, 0x00000000)) {
118 NV_ERROR(dev, "vm timeout 0: 0x%08x %d\n",
119 nv_rd32(dev, 0x100c80), engine);
120 }
121 nv_wr32(dev, 0x100cb8, vpgd->obj->vinst >> 8);
122 nv_wr32(dev, 0x100cbc, 0x80000000 | engine);
123 /* wait for flush to be queued? */
124 if (!nv_wait(dev, 0x100c80, 0x00008000, 0x00008000)) {
125 NV_ERROR(dev, "vm timeout 1: 0x%08x %d\n",
126 nv_rd32(dev, 0x100c80), engine);
127 }
128 }
129 spin_unlock_irqrestore(&dev_priv->vm_lock, flags);
130}
diff --git a/drivers/gpu/drm/nouveau/nvc0_vram.c b/drivers/gpu/drm/nouveau/nvc0_vram.c
new file mode 100644
index 000000000000..67c6ec6f34ea
--- /dev/null
+++ b/drivers/gpu/drm/nouveau/nvc0_vram.c
@@ -0,0 +1,113 @@
1/*
2 * Copyright 2010 Red Hat 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: Ben Skeggs
23 */
24
25#include "drmP.h"
26#include "nouveau_drv.h"
27#include "nouveau_mm.h"
28
29/* 0 = unsupported
30 * 1 = non-compressed
31 * 3 = compressed
32 */
33static const u8 types[256] = {
34 1, 1, 3, 3, 3, 3, 0, 3, 3, 3, 3, 0, 0, 0, 0, 0,
35 0, 1, 0, 0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0, 0, 0,
36 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
37 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3,
38 3, 3, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
39 0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
40 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
41 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
42 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 0, 1, 1, 1, 1, 0,
43 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
44 0, 0, 0, 3, 3, 3, 3, 1, 1, 1, 1, 0, 0, 0, 0, 0,
45 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
46 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3,
47 3, 3, 0, 0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 3, 0, 3,
48 3, 0, 3, 3, 3, 3, 3, 0, 0, 3, 0, 3, 0, 3, 3, 0,
49 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 1, 1, 0
50};
51
52bool
53nvc0_vram_flags_valid(struct drm_device *dev, u32 tile_flags)
54{
55 u8 memtype = (tile_flags & NOUVEAU_GEM_TILE_LAYOUT_MASK) >> 8;
56 return likely((types[memtype] == 1));
57}
58
59int
60nvc0_vram_new(struct drm_device *dev, u64 size, u32 align, u32 ncmin,
61 u32 type, struct nouveau_mem **pmem)
62{
63 struct drm_nouveau_private *dev_priv = dev->dev_private;
64 struct ttm_bo_device *bdev = &dev_priv->ttm.bdev;
65 struct ttm_mem_type_manager *man = &bdev->man[TTM_PL_VRAM];
66 struct nouveau_mm *mm = man->priv;
67 struct nouveau_mm_node *r;
68 struct nouveau_mem *mem;
69 int ret;
70
71 size >>= 12;
72 align >>= 12;
73 ncmin >>= 12;
74
75 mem = kzalloc(sizeof(*mem), GFP_KERNEL);
76 if (!mem)
77 return -ENOMEM;
78
79 INIT_LIST_HEAD(&mem->regions);
80 mem->dev = dev_priv->dev;
81 mem->memtype = (type & 0xff);
82 mem->size = size;
83
84 mutex_lock(&mm->mutex);
85 do {
86 ret = nouveau_mm_get(mm, 1, size, ncmin, align, &r);
87 if (ret) {
88 mutex_unlock(&mm->mutex);
89 nv50_vram_del(dev, &mem);
90 return ret;
91 }
92
93 list_add_tail(&r->rl_entry, &mem->regions);
94 size -= r->length;
95 } while (size);
96 mutex_unlock(&mm->mutex);
97
98 r = list_first_entry(&mem->regions, struct nouveau_mm_node, rl_entry);
99 mem->offset = (u64)r->offset << 12;
100 *pmem = mem;
101 return 0;
102}
103
104int
105nvc0_vram_init(struct drm_device *dev)
106{
107 struct drm_nouveau_private *dev_priv = dev->dev_private;
108
109 dev_priv->vram_size = nv_rd32(dev, 0x10f20c) << 20;
110 dev_priv->vram_size *= nv_rd32(dev, 0x121c74);
111 dev_priv->vram_rblock_size = 4096;
112 return 0;
113}
diff --git a/drivers/gpu/drm/nouveau/nvreg.h b/drivers/gpu/drm/nouveau/nvreg.h
index ad64673ace1f..bbfb1a68fb11 100644
--- a/drivers/gpu/drm/nouveau/nvreg.h
+++ b/drivers/gpu/drm/nouveau/nvreg.h
@@ -153,7 +153,8 @@
153#define NV_PCRTC_START 0x00600800 153#define NV_PCRTC_START 0x00600800
154#define NV_PCRTC_CONFIG 0x00600804 154#define NV_PCRTC_CONFIG 0x00600804
155# define NV_PCRTC_CONFIG_START_ADDRESS_NON_VGA (1 << 0) 155# define NV_PCRTC_CONFIG_START_ADDRESS_NON_VGA (1 << 0)
156# define NV_PCRTC_CONFIG_START_ADDRESS_HSYNC (2 << 0) 156# define NV04_PCRTC_CONFIG_START_ADDRESS_HSYNC (4 << 0)
157# define NV10_PCRTC_CONFIG_START_ADDRESS_HSYNC (2 << 0)
157#define NV_PCRTC_CURSOR_CONFIG 0x00600810 158#define NV_PCRTC_CURSOR_CONFIG 0x00600810
158# define NV_PCRTC_CURSOR_CONFIG_ENABLE_ENABLE (1 << 0) 159# define NV_PCRTC_CURSOR_CONFIG_ENABLE_ENABLE (1 << 0)
159# define NV_PCRTC_CURSOR_CONFIG_DOUBLE_SCAN_ENABLE (1 << 4) 160# define NV_PCRTC_CURSOR_CONFIG_DOUBLE_SCAN_ENABLE (1 << 4)
@@ -263,6 +264,7 @@
263# define NV_CIO_CRE_HCUR_ADDR1_ADR 7:2 264# define NV_CIO_CRE_HCUR_ADDR1_ADR 7:2
264# define NV_CIO_CRE_LCD__INDEX 0x33 265# define NV_CIO_CRE_LCD__INDEX 0x33
265# define NV_CIO_CRE_LCD_LCD_SELECT 0:0 266# define NV_CIO_CRE_LCD_LCD_SELECT 0:0
267# define NV_CIO_CRE_LCD_ROUTE_MASK 0x3b
266# define NV_CIO_CRE_DDC0_STATUS__INDEX 0x36 268# define NV_CIO_CRE_DDC0_STATUS__INDEX 0x36
267# define NV_CIO_CRE_DDC0_WR__INDEX 0x37 269# define NV_CIO_CRE_DDC0_WR__INDEX 0x37
268# define NV_CIO_CRE_ILACE__INDEX 0x39 /* interlace */ 270# define NV_CIO_CRE_ILACE__INDEX 0x39 /* interlace */
@@ -275,6 +277,8 @@
275# define NV_CIO_CRE_EBR_VDE_11 2:2 277# define NV_CIO_CRE_EBR_VDE_11 2:2
276# define NV_CIO_CRE_EBR_VRS_11 4:4 278# define NV_CIO_CRE_EBR_VRS_11 4:4
277# define NV_CIO_CRE_EBR_VBS_11 6:6 279# define NV_CIO_CRE_EBR_VBS_11 6:6
280# define NV_CIO_CRE_42 0x42
281# define NV_CIO_CRE_42_OFFSET_11 6:6
278# define NV_CIO_CRE_43 0x43 282# define NV_CIO_CRE_43 0x43
279# define NV_CIO_CRE_44 0x44 /* head control */ 283# define NV_CIO_CRE_44 0x44 /* head control */
280# define NV_CIO_CRE_CSB 0x45 /* colour saturation boost */ 284# define NV_CIO_CRE_CSB 0x45 /* colour saturation boost */
diff --git a/drivers/gpu/drm/r128/r128_drv.c b/drivers/gpu/drm/r128/r128_drv.c
index 1e2971f13aa1..b9e8efd2b754 100644
--- a/drivers/gpu/drm/r128/r128_drv.c
+++ b/drivers/gpu/drm/r128/r128_drv.c
@@ -56,8 +56,6 @@ static struct drm_driver driver = {
56 .irq_uninstall = r128_driver_irq_uninstall, 56 .irq_uninstall = r128_driver_irq_uninstall,
57 .irq_handler = r128_driver_irq_handler, 57 .irq_handler = r128_driver_irq_handler,
58 .reclaim_buffers = drm_core_reclaim_buffers, 58 .reclaim_buffers = drm_core_reclaim_buffers,
59 .get_map_ofs = drm_core_get_map_ofs,
60 .get_reg_ofs = drm_core_get_reg_ofs,
61 .ioctls = r128_ioctls, 59 .ioctls = r128_ioctls,
62 .dma_ioctl = r128_cce_buffers, 60 .dma_ioctl = r128_cce_buffers,
63 .fops = { 61 .fops = {
@@ -71,11 +69,9 @@ static struct drm_driver driver = {
71#ifdef CONFIG_COMPAT 69#ifdef CONFIG_COMPAT
72 .compat_ioctl = r128_compat_ioctl, 70 .compat_ioctl = r128_compat_ioctl,
73#endif 71#endif
72 .llseek = noop_llseek,
74 }, 73 },
75 .pci_driver = { 74
76 .name = DRIVER_NAME,
77 .id_table = pciidlist,
78 },
79 75
80 .name = DRIVER_NAME, 76 .name = DRIVER_NAME,
81 .desc = DRIVER_DESC, 77 .desc = DRIVER_DESC,
@@ -90,16 +86,21 @@ int r128_driver_load(struct drm_device *dev, unsigned long flags)
90 return drm_vblank_init(dev, 1); 86 return drm_vblank_init(dev, 1);
91} 87}
92 88
89static struct pci_driver r128_pci_driver = {
90 .name = DRIVER_NAME,
91 .id_table = pciidlist,
92};
93
93static int __init r128_init(void) 94static int __init r128_init(void)
94{ 95{
95 driver.num_ioctls = r128_max_ioctl; 96 driver.num_ioctls = r128_max_ioctl;
96 97
97 return drm_init(&driver); 98 return drm_pci_init(&driver, &r128_pci_driver);
98} 99}
99 100
100static void __exit r128_exit(void) 101static void __exit r128_exit(void)
101{ 102{
102 drm_exit(&driver); 103 drm_pci_exit(&driver, &r128_pci_driver);
103} 104}
104 105
105module_init(r128_init); 106module_init(r128_init);
diff --git a/drivers/gpu/drm/radeon/Kconfig b/drivers/gpu/drm/radeon/Kconfig
index 1c02d23f6fcc..ea92bbe3ed37 100644
--- a/drivers/gpu/drm/radeon/Kconfig
+++ b/drivers/gpu/drm/radeon/Kconfig
@@ -1,6 +1,7 @@
1config DRM_RADEON_KMS 1config DRM_RADEON_KMS
2 bool "Enable modesetting on radeon by default - NEW DRIVER" 2 bool "Enable modesetting on radeon by default - NEW DRIVER"
3 depends on DRM_RADEON 3 depends on DRM_RADEON
4 select BACKLIGHT_CLASS_DEVICE
4 help 5 help
5 Choose this option if you want kernel modesetting enabled by default. 6 Choose this option if you want kernel modesetting enabled by default.
6 7
@@ -27,11 +28,4 @@ config DRM_RADEON_KMS
27 The kernel will also perform security check on command stream 28 The kernel will also perform security check on command stream
28 provided by the user, we want to catch and forbid any illegal use 29 provided by the user, we want to catch and forbid any illegal use
29 of the GPU such as DMA into random system memory or into memory 30 of the GPU such as DMA into random system memory or into memory
30 not owned by the process supplying the command stream. This part 31 not owned by the process supplying the command stream.
31 of the code is still incomplete and this why we propose that patch
32 as a staging driver addition, future security might forbid current
33 experimental userspace to run.
34
35 This code support the following hardware : R1XX,R2XX,R3XX,R4XX,R5XX
36 (radeon up to X1950). Works is underway to provide support for R6XX,
37 R7XX and newer hardware (radeon from HD2XXX to HD4XXX).
diff --git a/drivers/gpu/drm/radeon/Makefile b/drivers/gpu/drm/radeon/Makefile
index aebe00875041..3896ef811102 100644
--- a/drivers/gpu/drm/radeon/Makefile
+++ b/drivers/gpu/drm/radeon/Makefile
@@ -36,6 +36,9 @@ $(obj)/r600_reg_safe.h: $(src)/reg_srcs/r600 $(obj)/mkregtable
36$(obj)/evergreen_reg_safe.h: $(src)/reg_srcs/evergreen $(obj)/mkregtable 36$(obj)/evergreen_reg_safe.h: $(src)/reg_srcs/evergreen $(obj)/mkregtable
37 $(call if_changed,mkregtable) 37 $(call if_changed,mkregtable)
38 38
39$(obj)/cayman_reg_safe.h: $(src)/reg_srcs/cayman $(obj)/mkregtable
40 $(call if_changed,mkregtable)
41
39$(obj)/r100.o: $(obj)/r100_reg_safe.h $(obj)/rn50_reg_safe.h 42$(obj)/r100.o: $(obj)/r100_reg_safe.h $(obj)/rn50_reg_safe.h
40 43
41$(obj)/r200.o: $(obj)/r200_reg_safe.h 44$(obj)/r200.o: $(obj)/r200_reg_safe.h
@@ -50,7 +53,7 @@ $(obj)/rs600.o: $(obj)/rs600_reg_safe.h
50 53
51$(obj)/r600_cs.o: $(obj)/r600_reg_safe.h 54$(obj)/r600_cs.o: $(obj)/r600_reg_safe.h
52 55
53$(obj)/evergreen_cs.o: $(obj)/evergreen_reg_safe.h 56$(obj)/evergreen_cs.o: $(obj)/evergreen_reg_safe.h $(obj)/cayman_reg_safe.h
54 57
55radeon-y := radeon_drv.o radeon_cp.o radeon_state.o radeon_mem.o \ 58radeon-y := radeon_drv.o radeon_cp.o radeon_state.o radeon_mem.o \
56 radeon_irq.o r300_cmdbuf.o r600_cp.o 59 radeon_irq.o r300_cmdbuf.o r600_cp.o
@@ -65,10 +68,13 @@ radeon-y += radeon_device.o radeon_asic.o radeon_kms.o \
65 rs400.o rs600.o rs690.o rv515.o r520.o r600.o rv770.o radeon_test.o \ 68 rs400.o rs600.o rs690.o rv515.o r520.o r600.o rv770.o radeon_test.o \
66 r200.o radeon_legacy_tv.o r600_cs.o r600_blit.o r600_blit_shaders.o \ 69 r200.o radeon_legacy_tv.o r600_cs.o r600_blit.o r600_blit_shaders.o \
67 r600_blit_kms.o radeon_pm.o atombios_dp.o r600_audio.o r600_hdmi.o \ 70 r600_blit_kms.o radeon_pm.o atombios_dp.o r600_audio.o r600_hdmi.o \
68 evergreen.o evergreen_cs.o 71 evergreen.o evergreen_cs.o evergreen_blit_shaders.o evergreen_blit_kms.o \
72 radeon_trace_points.o ni.o cayman_blit_shaders.o
69 73
70radeon-$(CONFIG_COMPAT) += radeon_ioc32.o 74radeon-$(CONFIG_COMPAT) += radeon_ioc32.o
71radeon-$(CONFIG_VGA_SWITCHEROO) += radeon_atpx_handler.o 75radeon-$(CONFIG_VGA_SWITCHEROO) += radeon_atpx_handler.o
72radeon-$(CONFIG_ACPI) += radeon_acpi.o 76radeon-$(CONFIG_ACPI) += radeon_acpi.o
73 77
74obj-$(CONFIG_DRM_RADEON)+= radeon.o 78obj-$(CONFIG_DRM_RADEON)+= radeon.o
79
80CFLAGS_radeon_trace_points.o := -I$(src) \ No newline at end of file
diff --git a/drivers/gpu/drm/radeon/ObjectID.h b/drivers/gpu/drm/radeon/ObjectID.h
index c714179d1bfa..c61c3fe9fb98 100644
--- a/drivers/gpu/drm/radeon/ObjectID.h
+++ b/drivers/gpu/drm/radeon/ObjectID.h
@@ -37,6 +37,8 @@
37#define GRAPH_OBJECT_TYPE_CONNECTOR 0x3 37#define GRAPH_OBJECT_TYPE_CONNECTOR 0x3
38#define GRAPH_OBJECT_TYPE_ROUTER 0x4 38#define GRAPH_OBJECT_TYPE_ROUTER 0x4
39/* deleted */ 39/* deleted */
40#define GRAPH_OBJECT_TYPE_DISPLAY_PATH 0x6
41#define GRAPH_OBJECT_TYPE_GENERIC 0x7
40 42
41/****************************************************/ 43/****************************************************/
42/* Encoder Object ID Definition */ 44/* Encoder Object ID Definition */
@@ -64,6 +66,9 @@
64#define ENCODER_OBJECT_ID_VT1623 0x10 66#define ENCODER_OBJECT_ID_VT1623 0x10
65#define ENCODER_OBJECT_ID_HDMI_SI1930 0x11 67#define ENCODER_OBJECT_ID_HDMI_SI1930 0x11
66#define ENCODER_OBJECT_ID_HDMI_INTERNAL 0x12 68#define ENCODER_OBJECT_ID_HDMI_INTERNAL 0x12
69#define ENCODER_OBJECT_ID_ALMOND 0x22
70#define ENCODER_OBJECT_ID_TRAVIS 0x23
71#define ENCODER_OBJECT_ID_NUTMEG 0x22
67/* Kaleidoscope (KLDSCP) Class Display Hardware (internal) */ 72/* Kaleidoscope (KLDSCP) Class Display Hardware (internal) */
68#define ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1 0x13 73#define ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1 0x13
69#define ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1 0x14 74#define ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1 0x14
@@ -108,6 +113,7 @@
108#define CONNECTOR_OBJECT_ID_DISPLAYPORT 0x13 113#define CONNECTOR_OBJECT_ID_DISPLAYPORT 0x13
109#define CONNECTOR_OBJECT_ID_eDP 0x14 114#define CONNECTOR_OBJECT_ID_eDP 0x14
110#define CONNECTOR_OBJECT_ID_MXM 0x15 115#define CONNECTOR_OBJECT_ID_MXM 0x15
116#define CONNECTOR_OBJECT_ID_LVDS_eDP 0x16
111 117
112/* deleted */ 118/* deleted */
113 119
@@ -124,6 +130,7 @@
124#define GENERIC_OBJECT_ID_GLSYNC 0x01 130#define GENERIC_OBJECT_ID_GLSYNC 0x01
125#define GENERIC_OBJECT_ID_PX2_NON_DRIVABLE 0x02 131#define GENERIC_OBJECT_ID_PX2_NON_DRIVABLE 0x02
126#define GENERIC_OBJECT_ID_MXM_OPM 0x03 132#define GENERIC_OBJECT_ID_MXM_OPM 0x03
133#define GENERIC_OBJECT_ID_STEREO_PIN 0x04 //This object could show up from Misc Object table, it follows ATOM_OBJECT format, and contains one ATOM_OBJECT_GPIO_CNTL_RECORD for the stereo pin
127 134
128/****************************************************/ 135/****************************************************/
129/* Graphics Object ENUM ID Definition */ 136/* Graphics Object ENUM ID Definition */
@@ -360,6 +367,26 @@
360 GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 367 GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\
361 ENCODER_OBJECT_ID_GENERAL_EXTERNAL_DVO << OBJECT_ID_SHIFT) 368 ENCODER_OBJECT_ID_GENERAL_EXTERNAL_DVO << OBJECT_ID_SHIFT)
362 369
370#define ENCODER_ALMOND_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\
371 GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\
372 ENCODER_OBJECT_ID_ALMOND << OBJECT_ID_SHIFT)
373
374#define ENCODER_ALMOND_ENUM_ID2 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\
375 GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\
376 ENCODER_OBJECT_ID_ALMOND << OBJECT_ID_SHIFT)
377
378#define ENCODER_TRAVIS_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\
379 GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\
380 ENCODER_OBJECT_ID_TRAVIS << OBJECT_ID_SHIFT)
381
382#define ENCODER_TRAVIS_ENUM_ID2 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\
383 GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\
384 ENCODER_OBJECT_ID_TRAVIS << OBJECT_ID_SHIFT)
385
386#define ENCODER_NUTMEG_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\
387 GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\
388 ENCODER_OBJECT_ID_NUTMEG << OBJECT_ID_SHIFT)
389
363/****************************************************/ 390/****************************************************/
364/* Connector Object ID definition - Shared with BIOS */ 391/* Connector Object ID definition - Shared with BIOS */
365/****************************************************/ 392/****************************************************/
@@ -421,6 +448,14 @@
421 GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ 448 GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\
422 CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_D << OBJECT_ID_SHIFT) 449 CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_D << OBJECT_ID_SHIFT)
423 450
451#define CONNECTOR_SINGLE_LINK_DVI_D_ENUM_ID3 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\
452 GRAPH_OBJECT_ENUM_ID3 << ENUM_ID_SHIFT |\
453 CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_D << OBJECT_ID_SHIFT)
454
455#define CONNECTOR_SINGLE_LINK_DVI_D_ENUM_ID4 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\
456 GRAPH_OBJECT_ENUM_ID4 << ENUM_ID_SHIFT |\
457 CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_D << OBJECT_ID_SHIFT)
458
424#define CONNECTOR_DUAL_LINK_DVI_D_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 459#define CONNECTOR_DUAL_LINK_DVI_D_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\
425 GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 460 GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\
426 CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D << OBJECT_ID_SHIFT) 461 CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D << OBJECT_ID_SHIFT)
@@ -512,6 +547,7 @@
512#define CONNECTOR_7PIN_DIN_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 547#define CONNECTOR_7PIN_DIN_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\
513 GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 548 GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\
514 CONNECTOR_OBJECT_ID_7PIN_DIN << OBJECT_ID_SHIFT) 549 CONNECTOR_OBJECT_ID_7PIN_DIN << OBJECT_ID_SHIFT)
550
515#define CONNECTOR_7PIN_DIN_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ 551#define CONNECTOR_7PIN_DIN_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\
516 GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ 552 GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\
517 CONNECTOR_OBJECT_ID_7PIN_DIN << OBJECT_ID_SHIFT) 553 CONNECTOR_OBJECT_ID_7PIN_DIN << OBJECT_ID_SHIFT)
@@ -593,6 +629,14 @@
593 GRAPH_OBJECT_ENUM_ID7 << ENUM_ID_SHIFT |\ 629 GRAPH_OBJECT_ENUM_ID7 << ENUM_ID_SHIFT |\
594 CONNECTOR_OBJECT_ID_MXM << OBJECT_ID_SHIFT) //Mapping to MXM_DAC 630 CONNECTOR_OBJECT_ID_MXM << OBJECT_ID_SHIFT) //Mapping to MXM_DAC
595 631
632#define CONNECTOR_LVDS_eDP_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\
633 GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\
634 CONNECTOR_OBJECT_ID_LVDS_eDP << OBJECT_ID_SHIFT)
635
636#define CONNECTOR_LVDS_eDP_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\
637 GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\
638 CONNECTOR_OBJECT_ID_LVDS_eDP << OBJECT_ID_SHIFT)
639
596/****************************************************/ 640/****************************************************/
597/* Router Object ID definition - Shared with BIOS */ 641/* Router Object ID definition - Shared with BIOS */
598/****************************************************/ 642/****************************************************/
@@ -621,6 +665,10 @@
621 GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 665 GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\
622 GENERIC_OBJECT_ID_MXM_OPM << OBJECT_ID_SHIFT) 666 GENERIC_OBJECT_ID_MXM_OPM << OBJECT_ID_SHIFT)
623 667
668#define GENERICOBJECT_STEREO_PIN_ENUM_ID1 (GRAPH_OBJECT_TYPE_GENERIC << OBJECT_TYPE_SHIFT |\
669 GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\
670 GENERIC_OBJECT_ID_STEREO_PIN << OBJECT_ID_SHIFT)
671
624/****************************************************/ 672/****************************************************/
625/* Object Cap definition - Shared with BIOS */ 673/* Object Cap definition - Shared with BIOS */
626/****************************************************/ 674/****************************************************/
diff --git a/drivers/gpu/drm/radeon/atom.c b/drivers/gpu/drm/radeon/atom.c
index 8e421f644a54..ebdb0fdb8348 100644
--- a/drivers/gpu/drm/radeon/atom.c
+++ b/drivers/gpu/drm/radeon/atom.c
@@ -32,6 +32,7 @@
32#include "atom.h" 32#include "atom.h"
33#include "atom-names.h" 33#include "atom-names.h"
34#include "atom-bits.h" 34#include "atom-bits.h"
35#include "radeon.h"
35 36
36#define ATOM_COND_ABOVE 0 37#define ATOM_COND_ABOVE 0
37#define ATOM_COND_ABOVEOREQUAL 1 38#define ATOM_COND_ABOVEOREQUAL 1
@@ -101,7 +102,9 @@ static void debug_print_spaces(int n)
101static uint32_t atom_iio_execute(struct atom_context *ctx, int base, 102static uint32_t atom_iio_execute(struct atom_context *ctx, int base,
102 uint32_t index, uint32_t data) 103 uint32_t index, uint32_t data)
103{ 104{
105 struct radeon_device *rdev = ctx->card->dev->dev_private;
104 uint32_t temp = 0xCDCDCDCD; 106 uint32_t temp = 0xCDCDCDCD;
107
105 while (1) 108 while (1)
106 switch (CU8(base)) { 109 switch (CU8(base)) {
107 case ATOM_IIO_NOP: 110 case ATOM_IIO_NOP:
@@ -112,6 +115,8 @@ static uint32_t atom_iio_execute(struct atom_context *ctx, int base,
112 base += 3; 115 base += 3;
113 break; 116 break;
114 case ATOM_IIO_WRITE: 117 case ATOM_IIO_WRITE:
118 if (rdev->family == CHIP_RV515)
119 (void)ctx->card->ioreg_read(ctx->card, CU16(base + 1));
115 ctx->card->ioreg_write(ctx->card, CU16(base + 1), temp); 120 ctx->card->ioreg_write(ctx->card, CU16(base + 1), temp);
116 base += 3; 121 base += 3;
117 break; 122 break;
@@ -130,7 +135,7 @@ static uint32_t atom_iio_execute(struct atom_context *ctx, int base,
130 case ATOM_IIO_MOVE_INDEX: 135 case ATOM_IIO_MOVE_INDEX:
131 temp &= 136 temp &=
132 ~((0xFFFFFFFF >> (32 - CU8(base + 1))) << 137 ~((0xFFFFFFFF >> (32 - CU8(base + 1))) <<
133 CU8(base + 2)); 138 CU8(base + 3));
134 temp |= 139 temp |=
135 ((index >> CU8(base + 2)) & 140 ((index >> CU8(base + 2)) &
136 (0xFFFFFFFF >> (32 - CU8(base + 1)))) << CU8(base + 141 (0xFFFFFFFF >> (32 - CU8(base + 1)))) << CU8(base +
@@ -140,7 +145,7 @@ static uint32_t atom_iio_execute(struct atom_context *ctx, int base,
140 case ATOM_IIO_MOVE_DATA: 145 case ATOM_IIO_MOVE_DATA:
141 temp &= 146 temp &=
142 ~((0xFFFFFFFF >> (32 - CU8(base + 1))) << 147 ~((0xFFFFFFFF >> (32 - CU8(base + 1))) <<
143 CU8(base + 2)); 148 CU8(base + 3));
144 temp |= 149 temp |=
145 ((data >> CU8(base + 2)) & 150 ((data >> CU8(base + 2)) &
146 (0xFFFFFFFF >> (32 - CU8(base + 1)))) << CU8(base + 151 (0xFFFFFFFF >> (32 - CU8(base + 1)))) << CU8(base +
@@ -150,7 +155,7 @@ static uint32_t atom_iio_execute(struct atom_context *ctx, int base,
150 case ATOM_IIO_MOVE_ATTR: 155 case ATOM_IIO_MOVE_ATTR:
151 temp &= 156 temp &=
152 ~((0xFFFFFFFF >> (32 - CU8(base + 1))) << 157 ~((0xFFFFFFFF >> (32 - CU8(base + 1))) <<
153 CU8(base + 2)); 158 CU8(base + 3));
154 temp |= 159 temp |=
155 ((ctx-> 160 ((ctx->
156 io_attr >> CU8(base + 2)) & (0xFFFFFFFF >> (32 - 161 io_attr >> CU8(base + 2)) & (0xFFFFFFFF >> (32 -
@@ -647,12 +652,12 @@ static void atom_op_compare(atom_exec_context *ctx, int *ptr, int arg)
647 652
648static void atom_op_delay(atom_exec_context *ctx, int *ptr, int arg) 653static void atom_op_delay(atom_exec_context *ctx, int *ptr, int arg)
649{ 654{
650 uint8_t count = U8((*ptr)++); 655 unsigned count = U8((*ptr)++);
651 SDEBUG(" count: %d\n", count); 656 SDEBUG(" count: %d\n", count);
652 if (arg == ATOM_UNIT_MICROSEC) 657 if (arg == ATOM_UNIT_MICROSEC)
653 udelay(count); 658 udelay(count);
654 else 659 else
655 schedule_timeout_uninterruptible(msecs_to_jiffies(count)); 660 msleep(count);
656} 661}
657 662
658static void atom_op_div(atom_exec_context *ctx, int *ptr, int arg) 663static void atom_op_div(atom_exec_context *ctx, int *ptr, int arg)
@@ -733,16 +738,16 @@ static void atom_op_jump(atom_exec_context *ctx, int *ptr, int arg)
733static void atom_op_mask(atom_exec_context *ctx, int *ptr, int arg) 738static void atom_op_mask(atom_exec_context *ctx, int *ptr, int arg)
734{ 739{
735 uint8_t attr = U8((*ptr)++); 740 uint8_t attr = U8((*ptr)++);
736 uint32_t dst, src1, src2, saved; 741 uint32_t dst, mask, src, saved;
737 int dptr = *ptr; 742 int dptr = *ptr;
738 SDEBUG(" dst: "); 743 SDEBUG(" dst: ");
739 dst = atom_get_dst(ctx, arg, attr, ptr, &saved, 1); 744 dst = atom_get_dst(ctx, arg, attr, ptr, &saved, 1);
740 SDEBUG(" src1: "); 745 mask = atom_get_src_direct(ctx, ((attr >> 3) & 7), ptr);
741 src1 = atom_get_src_direct(ctx, ((attr >> 3) & 7), ptr); 746 SDEBUG(" mask: 0x%08x", mask);
742 SDEBUG(" src2: "); 747 SDEBUG(" src: ");
743 src2 = atom_get_src(ctx, attr, ptr); 748 src = atom_get_src(ctx, attr, ptr);
744 dst &= src1; 749 dst &= mask;
745 dst |= src2; 750 dst |= src;
746 SDEBUG(" dst: "); 751 SDEBUG(" dst: ");
747 atom_put_dst(ctx, arg, attr, &dptr, dst, saved); 752 atom_put_dst(ctx, arg, attr, &dptr, dst, saved);
748} 753}
diff --git a/drivers/gpu/drm/radeon/atombios.h b/drivers/gpu/drm/radeon/atombios.h
index fe359a239df3..1b50ad8919d5 100644
--- a/drivers/gpu/drm/radeon/atombios.h
+++ b/drivers/gpu/drm/radeon/atombios.h
@@ -73,8 +73,18 @@
73#define ATOM_PPLL1 0 73#define ATOM_PPLL1 0
74#define ATOM_PPLL2 1 74#define ATOM_PPLL2 1
75#define ATOM_DCPLL 2 75#define ATOM_DCPLL 2
76#define ATOM_PPLL0 2
77#define ATOM_EXT_PLL1 8
78#define ATOM_EXT_PLL2 9
79#define ATOM_EXT_CLOCK 10
76#define ATOM_PPLL_INVALID 0xFF 80#define ATOM_PPLL_INVALID 0xFF
77 81
82#define ENCODER_REFCLK_SRC_P1PLL 0
83#define ENCODER_REFCLK_SRC_P2PLL 1
84#define ENCODER_REFCLK_SRC_DCPLL 2
85#define ENCODER_REFCLK_SRC_EXTCLK 3
86#define ENCODER_REFCLK_SRC_INVALID 0xFF
87
78#define ATOM_SCALER1 0 88#define ATOM_SCALER1 0
79#define ATOM_SCALER2 1 89#define ATOM_SCALER2 1
80 90
@@ -192,6 +202,9 @@ typedef struct _ATOM_COMMON_TABLE_HEADER
192 /*Image can't be updated, while Driver needs to carry the new table! */ 202 /*Image can't be updated, while Driver needs to carry the new table! */
193}ATOM_COMMON_TABLE_HEADER; 203}ATOM_COMMON_TABLE_HEADER;
194 204
205/****************************************************************************/
206// Structure stores the ROM header.
207/****************************************************************************/
195typedef struct _ATOM_ROM_HEADER 208typedef struct _ATOM_ROM_HEADER
196{ 209{
197 ATOM_COMMON_TABLE_HEADER sHeader; 210 ATOM_COMMON_TABLE_HEADER sHeader;
@@ -221,6 +234,9 @@ typedef struct _ATOM_ROM_HEADER
221 #define USHORT void* 234 #define USHORT void*
222#endif 235#endif
223 236
237/****************************************************************************/
238// Structures used in Command.mtb
239/****************************************************************************/
224typedef struct _ATOM_MASTER_LIST_OF_COMMAND_TABLES{ 240typedef struct _ATOM_MASTER_LIST_OF_COMMAND_TABLES{
225 USHORT ASIC_Init; //Function Table, used by various SW components,latest version 1.1 241 USHORT ASIC_Init; //Function Table, used by various SW components,latest version 1.1
226 USHORT GetDisplaySurfaceSize; //Atomic Table, Used by Bios when enabling HW ICON 242 USHORT GetDisplaySurfaceSize; //Atomic Table, Used by Bios when enabling HW ICON
@@ -312,6 +328,7 @@ typedef struct _ATOM_MASTER_LIST_OF_COMMAND_TABLES{
312#define SetUniphyInstance ASIC_StaticPwrMgtStatusChange 328#define SetUniphyInstance ASIC_StaticPwrMgtStatusChange
313#define HPDInterruptService ReadHWAssistedI2CStatus 329#define HPDInterruptService ReadHWAssistedI2CStatus
314#define EnableVGA_Access GetSCLKOverMCLKRatio 330#define EnableVGA_Access GetSCLKOverMCLKRatio
331#define GetDispObjectInfo EnableYUV
315 332
316typedef struct _ATOM_MASTER_COMMAND_TABLE 333typedef struct _ATOM_MASTER_COMMAND_TABLE
317{ 334{
@@ -357,6 +374,24 @@ typedef struct _ATOM_COMMON_ROM_COMMAND_TABLE_HEADER
357/****************************************************************************/ 374/****************************************************************************/
358#define COMPUTE_MEMORY_PLL_PARAM 1 375#define COMPUTE_MEMORY_PLL_PARAM 1
359#define COMPUTE_ENGINE_PLL_PARAM 2 376#define COMPUTE_ENGINE_PLL_PARAM 2
377#define ADJUST_MC_SETTING_PARAM 3
378
379/****************************************************************************/
380// Structures used by AdjustMemoryControllerTable
381/****************************************************************************/
382typedef struct _ATOM_ADJUST_MEMORY_CLOCK_FREQ
383{
384#if ATOM_BIG_ENDIAN
385 ULONG ulPointerReturnFlag:1; // BYTE_3[7]=1 - Return the pointer to the right Data Block; BYTE_3[7]=0 - Program the right Data Block
386 ULONG ulMemoryModuleNumber:7; // BYTE_3[6:0]
387 ULONG ulClockFreq:24;
388#else
389 ULONG ulClockFreq:24;
390 ULONG ulMemoryModuleNumber:7; // BYTE_3[6:0]
391 ULONG ulPointerReturnFlag:1; // BYTE_3[7]=1 - Return the pointer to the right Data Block; BYTE_3[7]=0 - Program the right Data Block
392#endif
393}ATOM_ADJUST_MEMORY_CLOCK_FREQ;
394#define POINTER_RETURN_FLAG 0x80
360 395
361typedef struct _COMPUTE_MEMORY_ENGINE_PLL_PARAMETERS 396typedef struct _COMPUTE_MEMORY_ENGINE_PLL_PARAMETERS
362{ 397{
@@ -440,6 +475,26 @@ typedef struct _COMPUTE_MEMORY_ENGINE_PLL_PARAMETERS_V4
440#endif 475#endif
441}COMPUTE_MEMORY_ENGINE_PLL_PARAMETERS_V4; 476}COMPUTE_MEMORY_ENGINE_PLL_PARAMETERS_V4;
442 477
478typedef struct _COMPUTE_MEMORY_ENGINE_PLL_PARAMETERS_V5
479{
480 union
481 {
482 ATOM_COMPUTE_CLOCK_FREQ ulClock; //Input Parameter
483 ATOM_S_MPLL_FB_DIVIDER ulFbDiv; //Output Parameter
484 };
485 UCHAR ucRefDiv; //Output Parameter
486 UCHAR ucPostDiv; //Output Parameter
487 union
488 {
489 UCHAR ucCntlFlag; //Output Flags
490 UCHAR ucInputFlag; //Input Flags. ucInputFlag[0] - Strobe(1)/Performance(0) mode
491 };
492 UCHAR ucReserved;
493}COMPUTE_MEMORY_ENGINE_PLL_PARAMETERS_V5;
494
495// ucInputFlag
496#define ATOM_PLL_INPUT_FLAG_PLL_STROBE_MODE_EN 1 // 1-StrobeMode, 0-PerformanceMode
497
443typedef struct _DYNAMICE_MEMORY_SETTINGS_PARAMETER 498typedef struct _DYNAMICE_MEMORY_SETTINGS_PARAMETER
444{ 499{
445 ATOM_COMPUTE_CLOCK_FREQ ulClock; 500 ATOM_COMPUTE_CLOCK_FREQ ulClock;
@@ -583,6 +638,7 @@ typedef struct _DIG_ENCODER_CONTROL_PARAMETERS
583#define ATOM_ENCODER_CONFIG_DPLINKRATE_MASK 0x01 638#define ATOM_ENCODER_CONFIG_DPLINKRATE_MASK 0x01
584#define ATOM_ENCODER_CONFIG_DPLINKRATE_1_62GHZ 0x00 639#define ATOM_ENCODER_CONFIG_DPLINKRATE_1_62GHZ 0x00
585#define ATOM_ENCODER_CONFIG_DPLINKRATE_2_70GHZ 0x01 640#define ATOM_ENCODER_CONFIG_DPLINKRATE_2_70GHZ 0x01
641#define ATOM_ENCODER_CONFIG_DPLINKRATE_5_40GHZ 0x02
586#define ATOM_ENCODER_CONFIG_LINK_SEL_MASK 0x04 642#define ATOM_ENCODER_CONFIG_LINK_SEL_MASK 0x04
587#define ATOM_ENCODER_CONFIG_LINKA 0x00 643#define ATOM_ENCODER_CONFIG_LINKA 0x00
588#define ATOM_ENCODER_CONFIG_LINKB 0x04 644#define ATOM_ENCODER_CONFIG_LINKB 0x04
@@ -608,6 +664,9 @@ typedef struct _DIG_ENCODER_CONTROL_PARAMETERS
608#define ATOM_ENCODER_MODE_TV 13 664#define ATOM_ENCODER_MODE_TV 13
609#define ATOM_ENCODER_MODE_CV 14 665#define ATOM_ENCODER_MODE_CV 14
610#define ATOM_ENCODER_MODE_CRT 15 666#define ATOM_ENCODER_MODE_CRT 15
667#define ATOM_ENCODER_MODE_DVO 16
668#define ATOM_ENCODER_MODE_DP_SST ATOM_ENCODER_MODE_DP // For DP1.2
669#define ATOM_ENCODER_MODE_DP_MST 5 // For DP1.2
611 670
612typedef struct _ATOM_DIG_ENCODER_CONFIG_V2 671typedef struct _ATOM_DIG_ENCODER_CONFIG_V2
613{ 672{
@@ -661,52 +720,126 @@ typedef struct _DIG_ENCODER_CONTROL_PARAMETERS_V2
661#define ATOM_ENCODER_CMD_DP_LINK_TRAINING_START 0x08 720#define ATOM_ENCODER_CMD_DP_LINK_TRAINING_START 0x08
662#define ATOM_ENCODER_CMD_DP_LINK_TRAINING_PATTERN1 0x09 721#define ATOM_ENCODER_CMD_DP_LINK_TRAINING_PATTERN1 0x09
663#define ATOM_ENCODER_CMD_DP_LINK_TRAINING_PATTERN2 0x0a 722#define ATOM_ENCODER_CMD_DP_LINK_TRAINING_PATTERN2 0x0a
723#define ATOM_ENCODER_CMD_DP_LINK_TRAINING_PATTERN3 0x13
664#define ATOM_ENCODER_CMD_DP_LINK_TRAINING_COMPLETE 0x0b 724#define ATOM_ENCODER_CMD_DP_LINK_TRAINING_COMPLETE 0x0b
665#define ATOM_ENCODER_CMD_DP_VIDEO_OFF 0x0c 725#define ATOM_ENCODER_CMD_DP_VIDEO_OFF 0x0c
666#define ATOM_ENCODER_CMD_DP_VIDEO_ON 0x0d 726#define ATOM_ENCODER_CMD_DP_VIDEO_ON 0x0d
667#define ATOM_ENCODER_CMD_QUERY_DP_LINK_TRAINING_STATUS 0x0e 727#define ATOM_ENCODER_CMD_QUERY_DP_LINK_TRAINING_STATUS 0x0e
668#define ATOM_ENCODER_CMD_SETUP 0x0f 728#define ATOM_ENCODER_CMD_SETUP 0x0f
729#define ATOM_ENCODER_CMD_SETUP_PANEL_MODE 0x10
669 730
670// ucStatus 731// ucStatus
671#define ATOM_ENCODER_STATUS_LINK_TRAINING_COMPLETE 0x10 732#define ATOM_ENCODER_STATUS_LINK_TRAINING_COMPLETE 0x10
672#define ATOM_ENCODER_STATUS_LINK_TRAINING_INCOMPLETE 0x00 733#define ATOM_ENCODER_STATUS_LINK_TRAINING_INCOMPLETE 0x00
673 734
735//ucTableFormatRevision=1
736//ucTableContentRevision=3
674// Following function ENABLE sub-function will be used by driver when TMDS/HDMI/LVDS is used, disable function will be used by driver 737// Following function ENABLE sub-function will be used by driver when TMDS/HDMI/LVDS is used, disable function will be used by driver
675typedef struct _ATOM_DIG_ENCODER_CONFIG_V3 738typedef struct _ATOM_DIG_ENCODER_CONFIG_V3
676{ 739{
677#if ATOM_BIG_ENDIAN 740#if ATOM_BIG_ENDIAN
678 UCHAR ucReserved1:1; 741 UCHAR ucReserved1:1;
679 UCHAR ucDigSel:3; // =0: DIGA/B/C/D/E/F 742 UCHAR ucDigSel:3; // =0/1/2/3/4/5: DIG0/1/2/3/4/5 (In register spec also referred as DIGA/B/C/D/E/F)
680 UCHAR ucReserved:3; 743 UCHAR ucReserved:3;
681 UCHAR ucDPLinkRate:1; // =0: 1.62Ghz, =1: 2.7Ghz 744 UCHAR ucDPLinkRate:1; // =0: 1.62Ghz, =1: 2.7Ghz
682#else 745#else
683 UCHAR ucDPLinkRate:1; // =0: 1.62Ghz, =1: 2.7Ghz 746 UCHAR ucDPLinkRate:1; // =0: 1.62Ghz, =1: 2.7Ghz
684 UCHAR ucReserved:3; 747 UCHAR ucReserved:3;
685 UCHAR ucDigSel:3; // =0: DIGA/B/C/D/E/F 748 UCHAR ucDigSel:3; // =0/1/2/3/4/5: DIG0/1/2/3/4/5 (In register spec also referred as DIGA/B/C/D/E/F)
686 UCHAR ucReserved1:1; 749 UCHAR ucReserved1:1;
687#endif 750#endif
688}ATOM_DIG_ENCODER_CONFIG_V3; 751}ATOM_DIG_ENCODER_CONFIG_V3;
689 752
753#define ATOM_ENCODER_CONFIG_V3_DPLINKRATE_MASK 0x03
754#define ATOM_ENCODER_CONFIG_V3_DPLINKRATE_1_62GHZ 0x00
755#define ATOM_ENCODER_CONFIG_V3_DPLINKRATE_2_70GHZ 0x01
690#define ATOM_ENCODER_CONFIG_V3_ENCODER_SEL 0x70 756#define ATOM_ENCODER_CONFIG_V3_ENCODER_SEL 0x70
691 757#define ATOM_ENCODER_CONFIG_V3_DIG0_ENCODER 0x00
758#define ATOM_ENCODER_CONFIG_V3_DIG1_ENCODER 0x10
759#define ATOM_ENCODER_CONFIG_V3_DIG2_ENCODER 0x20
760#define ATOM_ENCODER_CONFIG_V3_DIG3_ENCODER 0x30
761#define ATOM_ENCODER_CONFIG_V3_DIG4_ENCODER 0x40
762#define ATOM_ENCODER_CONFIG_V3_DIG5_ENCODER 0x50
692 763
693typedef struct _DIG_ENCODER_CONTROL_PARAMETERS_V3 764typedef struct _DIG_ENCODER_CONTROL_PARAMETERS_V3
694{ 765{
695 USHORT usPixelClock; // in 10KHz; for bios convenient 766 USHORT usPixelClock; // in 10KHz; for bios convenient
696 ATOM_DIG_ENCODER_CONFIG_V3 acConfig; 767 ATOM_DIG_ENCODER_CONFIG_V3 acConfig;
697 UCHAR ucAction; 768 UCHAR ucAction;
698 UCHAR ucEncoderMode; 769 union {
770 UCHAR ucEncoderMode;
699 // =0: DP encoder 771 // =0: DP encoder
700 // =1: LVDS encoder 772 // =1: LVDS encoder
701 // =2: DVI encoder 773 // =2: DVI encoder
702 // =3: HDMI encoder 774 // =3: HDMI encoder
703 // =4: SDVO encoder 775 // =4: SDVO encoder
704 // =5: DP audio 776 // =5: DP audio
777 UCHAR ucPanelMode; // only valid when ucAction == ATOM_ENCODER_CMD_SETUP_PANEL_MODE
778 // =0: external DP
779 // =1: internal DP2
780 // =0x11: internal DP1 for NutMeg/Travis DP translator
781 };
705 UCHAR ucLaneNum; // how many lanes to enable 782 UCHAR ucLaneNum; // how many lanes to enable
706 UCHAR ucBitPerColor; // only valid for DP mode when ucAction = ATOM_ENCODER_CMD_SETUP 783 UCHAR ucBitPerColor; // only valid for DP mode when ucAction = ATOM_ENCODER_CMD_SETUP
707 UCHAR ucReserved; 784 UCHAR ucReserved;
708}DIG_ENCODER_CONTROL_PARAMETERS_V3; 785}DIG_ENCODER_CONTROL_PARAMETERS_V3;
709 786
787//ucTableFormatRevision=1
788//ucTableContentRevision=4
789// start from NI
790// Following function ENABLE sub-function will be used by driver when TMDS/HDMI/LVDS is used, disable function will be used by driver
791typedef struct _ATOM_DIG_ENCODER_CONFIG_V4
792{
793#if ATOM_BIG_ENDIAN
794 UCHAR ucReserved1:1;
795 UCHAR ucDigSel:3; // =0/1/2/3/4/5: DIG0/1/2/3/4/5 (In register spec also referred as DIGA/B/C/D/E/F)
796 UCHAR ucReserved:2;
797 UCHAR ucDPLinkRate:2; // =0: 1.62Ghz, =1: 2.7Ghz, 2=5.4Ghz <= Changed comparing to previous version
798#else
799 UCHAR ucDPLinkRate:2; // =0: 1.62Ghz, =1: 2.7Ghz, 2=5.4Ghz <= Changed comparing to previous version
800 UCHAR ucReserved:2;
801 UCHAR ucDigSel:3; // =0/1/2/3/4/5: DIG0/1/2/3/4/5 (In register spec also referred as DIGA/B/C/D/E/F)
802 UCHAR ucReserved1:1;
803#endif
804}ATOM_DIG_ENCODER_CONFIG_V4;
805
806#define ATOM_ENCODER_CONFIG_V4_DPLINKRATE_MASK 0x03
807#define ATOM_ENCODER_CONFIG_V4_DPLINKRATE_1_62GHZ 0x00
808#define ATOM_ENCODER_CONFIG_V4_DPLINKRATE_2_70GHZ 0x01
809#define ATOM_ENCODER_CONFIG_V4_DPLINKRATE_5_40GHZ 0x02
810#define ATOM_ENCODER_CONFIG_V4_ENCODER_SEL 0x70
811#define ATOM_ENCODER_CONFIG_V4_DIG0_ENCODER 0x00
812#define ATOM_ENCODER_CONFIG_V4_DIG1_ENCODER 0x10
813#define ATOM_ENCODER_CONFIG_V4_DIG2_ENCODER 0x20
814#define ATOM_ENCODER_CONFIG_V4_DIG3_ENCODER 0x30
815#define ATOM_ENCODER_CONFIG_V4_DIG4_ENCODER 0x40
816#define ATOM_ENCODER_CONFIG_V4_DIG5_ENCODER 0x50
817
818typedef struct _DIG_ENCODER_CONTROL_PARAMETERS_V4
819{
820 USHORT usPixelClock; // in 10KHz; for bios convenient
821 union{
822 ATOM_DIG_ENCODER_CONFIG_V4 acConfig;
823 UCHAR ucConfig;
824 };
825 UCHAR ucAction;
826 union {
827 UCHAR ucEncoderMode;
828 // =0: DP encoder
829 // =1: LVDS encoder
830 // =2: DVI encoder
831 // =3: HDMI encoder
832 // =4: SDVO encoder
833 // =5: DP audio
834 UCHAR ucPanelMode; // only valid when ucAction == ATOM_ENCODER_CMD_SETUP_PANEL_MODE
835 // =0: external DP
836 // =1: internal DP2
837 // =0x11: internal DP1 for NutMeg/Travis DP translator
838 };
839 UCHAR ucLaneNum; // how many lanes to enable
840 UCHAR ucBitPerColor; // only valid for DP mode when ucAction = ATOM_ENCODER_CMD_SETUP
841 UCHAR ucHPD_ID; // HPD ID (1-6). =0 means to skip HDP programming. New comparing to previous version
842}DIG_ENCODER_CONTROL_PARAMETERS_V4;
710 843
711// define ucBitPerColor: 844// define ucBitPerColor:
712#define PANEL_BPC_UNDEFINE 0x00 845#define PANEL_BPC_UNDEFINE 0x00
@@ -716,6 +849,11 @@ typedef struct _DIG_ENCODER_CONTROL_PARAMETERS_V3
716#define PANEL_12BIT_PER_COLOR 0x04 849#define PANEL_12BIT_PER_COLOR 0x04
717#define PANEL_16BIT_PER_COLOR 0x05 850#define PANEL_16BIT_PER_COLOR 0x05
718 851
852//define ucPanelMode
853#define DP_PANEL_MODE_EXTERNAL_DP_MODE 0x00
854#define DP_PANEL_MODE_INTERNAL_DP2_MODE 0x01
855#define DP_PANEL_MODE_INTERNAL_DP1_MODE 0x11
856
719/****************************************************************************/ 857/****************************************************************************/
720// Structures used by UNIPHYTransmitterControlTable 858// Structures used by UNIPHYTransmitterControlTable
721// LVTMATransmitterControlTable 859// LVTMATransmitterControlTable
@@ -893,6 +1031,7 @@ typedef struct _ATOM_DIG_TRANSMITTER_CONFIG_V3
893#endif 1031#endif
894}ATOM_DIG_TRANSMITTER_CONFIG_V3; 1032}ATOM_DIG_TRANSMITTER_CONFIG_V3;
895 1033
1034
896typedef struct _DIG_TRANSMITTER_CONTROL_PARAMETERS_V3 1035typedef struct _DIG_TRANSMITTER_CONTROL_PARAMETERS_V3
897{ 1036{
898 union 1037 union
@@ -936,6 +1075,150 @@ typedef struct _DIG_TRANSMITTER_CONTROL_PARAMETERS_V3
936#define ATOM_TRANSMITTER_CONFIG_V3_TRANSMITTER2 0x40 //CD 1075#define ATOM_TRANSMITTER_CONFIG_V3_TRANSMITTER2 0x40 //CD
937#define ATOM_TRANSMITTER_CONFIG_V3_TRANSMITTER3 0x80 //EF 1076#define ATOM_TRANSMITTER_CONFIG_V3_TRANSMITTER3 0x80 //EF
938 1077
1078
1079/****************************************************************************/
1080// Structures used by UNIPHYTransmitterControlTable V1.4
1081// ASIC Families: NI
1082// ucTableFormatRevision=1
1083// ucTableContentRevision=4
1084/****************************************************************************/
1085typedef struct _ATOM_DP_VS_MODE_V4
1086{
1087 UCHAR ucLaneSel;
1088 union
1089 {
1090 UCHAR ucLaneSet;
1091 struct {
1092#if ATOM_BIG_ENDIAN
1093 UCHAR ucPOST_CURSOR2:2; //Bit[7:6] Post Cursor2 Level <= New in V4
1094 UCHAR ucPRE_EMPHASIS:3; //Bit[5:3] Pre-emphasis Level
1095 UCHAR ucVOLTAGE_SWING:3; //Bit[2:0] Voltage Swing Level
1096#else
1097 UCHAR ucVOLTAGE_SWING:3; //Bit[2:0] Voltage Swing Level
1098 UCHAR ucPRE_EMPHASIS:3; //Bit[5:3] Pre-emphasis Level
1099 UCHAR ucPOST_CURSOR2:2; //Bit[7:6] Post Cursor2 Level <= New in V4
1100#endif
1101 };
1102 };
1103}ATOM_DP_VS_MODE_V4;
1104
1105typedef struct _ATOM_DIG_TRANSMITTER_CONFIG_V4
1106{
1107#if ATOM_BIG_ENDIAN
1108 UCHAR ucTransmitterSel:2; //bit7:6: =0 Dig Transmitter 1 ( Uniphy AB )
1109 // =1 Dig Transmitter 2 ( Uniphy CD )
1110 // =2 Dig Transmitter 3 ( Uniphy EF )
1111 UCHAR ucRefClkSource:2; //bit5:4: PPLL1 =0, PPLL2=1, DCPLL=2, EXT_CLK=3 <= New
1112 UCHAR ucEncoderSel:1; //bit3=0: Data/Clk path source from DIGA/C/E. =1: Data/clk path source from DIGB/D/F
1113 UCHAR ucLinkSel:1; //bit2=0: Uniphy LINKA or C or E when fDualLinkConnector=0. when fDualLinkConnector=1, it means master link of dual link is A or C or E
1114 // =1: Uniphy LINKB or D or F when fDualLinkConnector=0. when fDualLinkConnector=1, it means master link of dual link is B or D or F
1115 UCHAR fCoherentMode:1; //bit1=1: Coherent Mode ( for DVI/HDMI mode )
1116 UCHAR fDualLinkConnector:1; //bit0=1: Dual Link DVI connector
1117#else
1118 UCHAR fDualLinkConnector:1; //bit0=1: Dual Link DVI connector
1119 UCHAR fCoherentMode:1; //bit1=1: Coherent Mode ( for DVI/HDMI mode )
1120 UCHAR ucLinkSel:1; //bit2=0: Uniphy LINKA or C or E when fDualLinkConnector=0. when fDualLinkConnector=1, it means master link of dual link is A or C or E
1121 // =1: Uniphy LINKB or D or F when fDualLinkConnector=0. when fDualLinkConnector=1, it means master link of dual link is B or D or F
1122 UCHAR ucEncoderSel:1; //bit3=0: Data/Clk path source from DIGA/C/E. =1: Data/clk path source from DIGB/D/F
1123 UCHAR ucRefClkSource:2; //bit5:4: PPLL1 =0, PPLL2=1, DCPLL=2, EXT_CLK=3 <= New
1124 UCHAR ucTransmitterSel:2; //bit7:6: =0 Dig Transmitter 1 ( Uniphy AB )
1125 // =1 Dig Transmitter 2 ( Uniphy CD )
1126 // =2 Dig Transmitter 3 ( Uniphy EF )
1127#endif
1128}ATOM_DIG_TRANSMITTER_CONFIG_V4;
1129
1130typedef struct _DIG_TRANSMITTER_CONTROL_PARAMETERS_V4
1131{
1132 union
1133 {
1134 USHORT usPixelClock; // in 10KHz; for bios convenient
1135 USHORT usInitInfo; // when init uniphy,lower 8bit is used for connector type defined in objectid.h
1136 ATOM_DP_VS_MODE_V4 asMode; // DP Voltage swing mode Redefined comparing to previous version
1137 };
1138 union
1139 {
1140 ATOM_DIG_TRANSMITTER_CONFIG_V4 acConfig;
1141 UCHAR ucConfig;
1142 };
1143 UCHAR ucAction; // define as ATOM_TRANSMITER_ACTION_XXX
1144 UCHAR ucLaneNum;
1145 UCHAR ucReserved[3];
1146}DIG_TRANSMITTER_CONTROL_PARAMETERS_V4;
1147
1148//ucConfig
1149//Bit0
1150#define ATOM_TRANSMITTER_CONFIG_V4_DUAL_LINK_CONNECTOR 0x01
1151//Bit1
1152#define ATOM_TRANSMITTER_CONFIG_V4_COHERENT 0x02
1153//Bit2
1154#define ATOM_TRANSMITTER_CONFIG_V4_LINK_SEL_MASK 0x04
1155#define ATOM_TRANSMITTER_CONFIG_V4_LINKA 0x00
1156#define ATOM_TRANSMITTER_CONFIG_V4_LINKB 0x04
1157// Bit3
1158#define ATOM_TRANSMITTER_CONFIG_V4_ENCODER_SEL_MASK 0x08
1159#define ATOM_TRANSMITTER_CONFIG_V4_DIG1_ENCODER 0x00
1160#define ATOM_TRANSMITTER_CONFIG_V4_DIG2_ENCODER 0x08
1161// Bit5:4
1162#define ATOM_TRANSMITTER_CONFIG_V4_REFCLK_SEL_MASK 0x30
1163#define ATOM_TRANSMITTER_CONFIG_V4_P1PLL 0x00
1164#define ATOM_TRANSMITTER_CONFIG_V4_P2PLL 0x10
1165#define ATOM_TRANSMITTER_CONFIG_V4_DCPLL 0x20 // New in _V4
1166#define ATOM_TRANSMITTER_CONFIG_V4_REFCLK_SRC_EXT 0x30 // Changed comparing to V3
1167// Bit7:6
1168#define ATOM_TRANSMITTER_CONFIG_V4_TRANSMITTER_SEL_MASK 0xC0
1169#define ATOM_TRANSMITTER_CONFIG_V4_TRANSMITTER1 0x00 //AB
1170#define ATOM_TRANSMITTER_CONFIG_V4_TRANSMITTER2 0x40 //CD
1171#define ATOM_TRANSMITTER_CONFIG_V4_TRANSMITTER3 0x80 //EF
1172
1173
1174/****************************************************************************/
1175// Structures used by ExternalEncoderControlTable V1.3
1176// ASIC Families: Evergreen, Llano, NI
1177// ucTableFormatRevision=1
1178// ucTableContentRevision=3
1179/****************************************************************************/
1180
1181typedef struct _EXTERNAL_ENCODER_CONTROL_PARAMETERS_V3
1182{
1183 union{
1184 USHORT usPixelClock; // pixel clock in 10Khz, valid when ucAction=SETUP/ENABLE_OUTPUT
1185 USHORT usConnectorId; // connector id, valid when ucAction = INIT
1186 };
1187 UCHAR ucConfig; // indicate which encoder, and DP link rate when ucAction = SETUP/ENABLE_OUTPUT
1188 UCHAR ucAction; //
1189 UCHAR ucEncoderMode; // encoder mode, only used when ucAction = SETUP/ENABLE_OUTPUT
1190 UCHAR ucLaneNum; // lane number, only used when ucAction = SETUP/ENABLE_OUTPUT
1191 UCHAR ucBitPerColor; // output bit per color, only valid when ucAction = SETUP/ENABLE_OUTPUT and ucEncodeMode= DP
1192 UCHAR ucReserved;
1193}EXTERNAL_ENCODER_CONTROL_PARAMETERS_V3;
1194
1195// ucAction
1196#define EXTERNAL_ENCODER_ACTION_V3_DISABLE_OUTPUT 0x00
1197#define EXTERNAL_ENCODER_ACTION_V3_ENABLE_OUTPUT 0x01
1198#define EXTERNAL_ENCODER_ACTION_V3_ENCODER_INIT 0x07
1199#define EXTERNAL_ENCODER_ACTION_V3_ENCODER_SETUP 0x0f
1200#define EXTERNAL_ENCODER_ACTION_V3_ENCODER_BLANKING_OFF 0x10
1201#define EXTERNAL_ENCODER_ACTION_V3_ENCODER_BLANKING 0x11
1202#define EXTERNAL_ENCODER_ACTION_V3_DACLOAD_DETECTION 0x12
1203#define EXTERNAL_ENCODER_ACTION_V3_DDC_SETUP 0x14
1204
1205// ucConfig
1206#define EXTERNAL_ENCODER_CONFIG_V3_DPLINKRATE_MASK 0x03
1207#define EXTERNAL_ENCODER_CONFIG_V3_DPLINKRATE_1_62GHZ 0x00
1208#define EXTERNAL_ENCODER_CONFIG_V3_DPLINKRATE_2_70GHZ 0x01
1209#define EXTERNAL_ENCODER_CONFIG_V3_DPLINKRATE_5_40GHZ 0x02
1210#define EXTERNAL_ENCODER_CONFIG_V3_ENCODER_SEL_MASK 0x70
1211#define EXTERNAL_ENCODER_CONFIG_V3_ENCODER1 0x00
1212#define EXTERNAL_ENCODER_CONFIG_V3_ENCODER2 0x10
1213#define EXTERNAL_ENCODER_CONFIG_V3_ENCODER3 0x20
1214
1215typedef struct _EXTERNAL_ENCODER_CONTROL_PS_ALLOCATION_V3
1216{
1217 EXTERNAL_ENCODER_CONTROL_PARAMETERS_V3 sExtEncoder;
1218 ULONG ulReserved[2];
1219}EXTERNAL_ENCODER_CONTROL_PS_ALLOCATION_V3;
1220
1221
939/****************************************************************************/ 1222/****************************************************************************/
940// Structures used by DAC1OuputControlTable 1223// Structures used by DAC1OuputControlTable
941// DAC2OuputControlTable 1224// DAC2OuputControlTable
@@ -1142,6 +1425,7 @@ typedef struct _PIXEL_CLOCK_PARAMETERS_V2
1142#define PIXEL_CLOCK_V4_MISC_SS_ENABLE 0x10 1425#define PIXEL_CLOCK_V4_MISC_SS_ENABLE 0x10
1143#define PIXEL_CLOCK_V4_MISC_COHERENT_MODE 0x20 1426#define PIXEL_CLOCK_V4_MISC_COHERENT_MODE 0x20
1144 1427
1428
1145typedef struct _PIXEL_CLOCK_PARAMETERS_V3 1429typedef struct _PIXEL_CLOCK_PARAMETERS_V3
1146{ 1430{
1147 USHORT usPixelClock; // in 10kHz unit; for bios convenient = (RefClk*FB_Div)/(Ref_Div*Post_Div) 1431 USHORT usPixelClock; // in 10kHz unit; for bios convenient = (RefClk*FB_Div)/(Ref_Div*Post_Div)
@@ -1202,6 +1486,55 @@ typedef struct _PIXEL_CLOCK_PARAMETERS_V5
1202#define PIXEL_CLOCK_V5_MISC_HDMI_32BPP 0x08 1486#define PIXEL_CLOCK_V5_MISC_HDMI_32BPP 0x08
1203#define PIXEL_CLOCK_V5_MISC_REF_DIV_SRC 0x10 1487#define PIXEL_CLOCK_V5_MISC_REF_DIV_SRC 0x10
1204 1488
1489typedef struct _CRTC_PIXEL_CLOCK_FREQ
1490{
1491#if ATOM_BIG_ENDIAN
1492 ULONG ucCRTC:8; // ATOM_CRTC1~6, indicate the CRTC controller to
1493 // drive the pixel clock. not used for DCPLL case.
1494 ULONG ulPixelClock:24; // target the pixel clock to drive the CRTC timing.
1495 // 0 means disable PPLL/DCPLL. Expanded to 24 bits comparing to previous version.
1496#else
1497 ULONG ulPixelClock:24; // target the pixel clock to drive the CRTC timing.
1498 // 0 means disable PPLL/DCPLL. Expanded to 24 bits comparing to previous version.
1499 ULONG ucCRTC:8; // ATOM_CRTC1~6, indicate the CRTC controller to
1500 // drive the pixel clock. not used for DCPLL case.
1501#endif
1502}CRTC_PIXEL_CLOCK_FREQ;
1503
1504typedef struct _PIXEL_CLOCK_PARAMETERS_V6
1505{
1506 union{
1507 CRTC_PIXEL_CLOCK_FREQ ulCrtcPclkFreq; // pixel clock and CRTC id frequency
1508 ULONG ulDispEngClkFreq; // dispclk frequency
1509 };
1510 USHORT usFbDiv; // feedback divider integer part.
1511 UCHAR ucPostDiv; // post divider.
1512 UCHAR ucRefDiv; // Reference divider
1513 UCHAR ucPpll; // ATOM_PPLL1/ATOM_PPLL2/ATOM_DCPLL
1514 UCHAR ucTransmitterID; // ASIC encoder id defined in objectId.h,
1515 // indicate which graphic encoder will be used.
1516 UCHAR ucEncoderMode; // Encoder mode:
1517 UCHAR ucMiscInfo; // bit[0]= Force program PPLL
1518 // bit[1]= when VGA timing is used.
1519 // bit[3:2]= HDMI panel bit depth: =0: 24bpp =1:30bpp, =2:32bpp
1520 // bit[4]= RefClock source for PPLL.
1521 // =0: XTLAIN( default mode )
1522 // =1: other external clock source, which is pre-defined
1523 // by VBIOS depend on the feature required.
1524 // bit[7:5]: reserved.
1525 ULONG ulFbDivDecFrac; // 20 bit feedback divider decimal fraction part, range from 1~999999 ( 0.000001 to 0.999999 )
1526
1527}PIXEL_CLOCK_PARAMETERS_V6;
1528
1529#define PIXEL_CLOCK_V6_MISC_FORCE_PROG_PPLL 0x01
1530#define PIXEL_CLOCK_V6_MISC_VGA_MODE 0x02
1531#define PIXEL_CLOCK_V6_MISC_HDMI_BPP_MASK 0x0c
1532#define PIXEL_CLOCK_V6_MISC_HDMI_24BPP 0x00
1533#define PIXEL_CLOCK_V6_MISC_HDMI_36BPP 0x04
1534#define PIXEL_CLOCK_V6_MISC_HDMI_30BPP 0x08
1535#define PIXEL_CLOCK_V6_MISC_HDMI_48BPP 0x0c
1536#define PIXEL_CLOCK_V6_MISC_REF_DIV_SRC 0x10
1537
1205typedef struct _GET_DISP_PLL_STATUS_INPUT_PARAMETERS_V2 1538typedef struct _GET_DISP_PLL_STATUS_INPUT_PARAMETERS_V2
1206{ 1539{
1207 PIXEL_CLOCK_PARAMETERS_V3 sDispClkInput; 1540 PIXEL_CLOCK_PARAMETERS_V3 sDispClkInput;
@@ -1241,10 +1574,11 @@ typedef struct _ADJUST_DISPLAY_PLL_PARAMETERS
1241typedef struct _ADJUST_DISPLAY_PLL_INPUT_PARAMETERS_V3 1574typedef struct _ADJUST_DISPLAY_PLL_INPUT_PARAMETERS_V3
1242{ 1575{
1243 USHORT usPixelClock; // target pixel clock 1576 USHORT usPixelClock; // target pixel clock
1244 UCHAR ucTransmitterID; // transmitter id defined in objectid.h 1577 UCHAR ucTransmitterID; // GPU transmitter id defined in objectid.h
1245 UCHAR ucEncodeMode; // encoder mode: CRT, LVDS, DP, TMDS or HDMI 1578 UCHAR ucEncodeMode; // encoder mode: CRT, LVDS, DP, TMDS or HDMI
1246 UCHAR ucDispPllConfig; // display pll configure parameter defined as following DISPPLL_CONFIG_XXXX 1579 UCHAR ucDispPllConfig; // display pll configure parameter defined as following DISPPLL_CONFIG_XXXX
1247 UCHAR ucReserved[3]; 1580 UCHAR ucExtTransmitterID; // external encoder id.
1581 UCHAR ucReserved[2];
1248}ADJUST_DISPLAY_PLL_INPUT_PARAMETERS_V3; 1582}ADJUST_DISPLAY_PLL_INPUT_PARAMETERS_V3;
1249 1583
1250// usDispPllConfig v1.2 for RoadRunner 1584// usDispPllConfig v1.2 for RoadRunner
@@ -1314,7 +1648,7 @@ typedef struct _GET_ENGINE_CLOCK_PARAMETERS
1314typedef struct _READ_EDID_FROM_HW_I2C_DATA_PARAMETERS 1648typedef struct _READ_EDID_FROM_HW_I2C_DATA_PARAMETERS
1315{ 1649{
1316 USHORT usPrescale; //Ratio between Engine clock and I2C clock 1650 USHORT usPrescale; //Ratio between Engine clock and I2C clock
1317 USHORT usVRAMAddress; //Adress in Frame Buffer where to pace raw EDID 1651 USHORT usVRAMAddress; //Address in Frame Buffer where to pace raw EDID
1318 USHORT usStatus; //When use output: lower byte EDID checksum, high byte hardware status 1652 USHORT usStatus; //When use output: lower byte EDID checksum, high byte hardware status
1319 //WHen use input: lower byte as 'byte to read':currently limited to 128byte or 1byte 1653 //WHen use input: lower byte as 'byte to read':currently limited to 128byte or 1byte
1320 UCHAR ucSlaveAddr; //Read from which slave 1654 UCHAR ucSlaveAddr; //Read from which slave
@@ -1358,6 +1692,7 @@ typedef struct _SET_UP_HW_I2C_DATA_PARAMETERS
1358/**************************************************************************/ 1692/**************************************************************************/
1359#define SPEED_FAN_CONTROL_PS_ALLOCATION WRITE_ONE_BYTE_HW_I2C_DATA_PARAMETERS 1693#define SPEED_FAN_CONTROL_PS_ALLOCATION WRITE_ONE_BYTE_HW_I2C_DATA_PARAMETERS
1360 1694
1695
1361/****************************************************************************/ 1696/****************************************************************************/
1362// Structures used by PowerConnectorDetectionTable 1697// Structures used by PowerConnectorDetectionTable
1363/****************************************************************************/ 1698/****************************************************************************/
@@ -1438,6 +1773,31 @@ typedef struct _ENABLE_SPREAD_SPECTRUM_ON_PPLL_V2
1438#define ATOM_PPLL_SS_AMOUNT_V2_NFRAC_MASK 0x0F00 1773#define ATOM_PPLL_SS_AMOUNT_V2_NFRAC_MASK 0x0F00
1439#define ATOM_PPLL_SS_AMOUNT_V2_NFRAC_SHIFT 8 1774#define ATOM_PPLL_SS_AMOUNT_V2_NFRAC_SHIFT 8
1440 1775
1776// Used by DCE5.0
1777 typedef struct _ENABLE_SPREAD_SPECTRUM_ON_PPLL_V3
1778{
1779 USHORT usSpreadSpectrumAmountFrac; // SS_AMOUNT_DSFRAC New in DCE5.0
1780 UCHAR ucSpreadSpectrumType; // Bit[0]: 0-Down Spread,1-Center Spread.
1781 // Bit[1]: 1-Ext. 0-Int.
1782 // Bit[3:2]: =0 P1PLL =1 P2PLL =2 DCPLL
1783 // Bits[7:4] reserved
1784 UCHAR ucEnable; // ATOM_ENABLE or ATOM_DISABLE
1785 USHORT usSpreadSpectrumAmount; // Includes SS_AMOUNT_FBDIV[7:0] and SS_AMOUNT_NFRAC_SLIP[11:8]
1786 USHORT usSpreadSpectrumStep; // SS_STEP_SIZE_DSFRAC
1787}ENABLE_SPREAD_SPECTRUM_ON_PPLL_V3;
1788
1789#define ATOM_PPLL_SS_TYPE_V3_DOWN_SPREAD 0x00
1790#define ATOM_PPLL_SS_TYPE_V3_CENTRE_SPREAD 0x01
1791#define ATOM_PPLL_SS_TYPE_V3_EXT_SPREAD 0x02
1792#define ATOM_PPLL_SS_TYPE_V3_PPLL_SEL_MASK 0x0c
1793#define ATOM_PPLL_SS_TYPE_V3_P1PLL 0x00
1794#define ATOM_PPLL_SS_TYPE_V3_P2PLL 0x04
1795#define ATOM_PPLL_SS_TYPE_V3_DCPLL 0x08
1796#define ATOM_PPLL_SS_AMOUNT_V3_FBDIV_MASK 0x00FF
1797#define ATOM_PPLL_SS_AMOUNT_V3_FBDIV_SHIFT 0
1798#define ATOM_PPLL_SS_AMOUNT_V3_NFRAC_MASK 0x0F00
1799#define ATOM_PPLL_SS_AMOUNT_V3_NFRAC_SHIFT 8
1800
1441#define ENABLE_SPREAD_SPECTRUM_ON_PPLL_PS_ALLOCATION ENABLE_SPREAD_SPECTRUM_ON_PPLL 1801#define ENABLE_SPREAD_SPECTRUM_ON_PPLL_PS_ALLOCATION ENABLE_SPREAD_SPECTRUM_ON_PPLL
1442 1802
1443/**************************************************************************/ 1803/**************************************************************************/
@@ -1706,7 +2066,7 @@ typedef struct _ATOM_MASTER_LIST_OF_DATA_TABLES
1706 USHORT StandardVESA_Timing; // Only used by Bios 2066 USHORT StandardVESA_Timing; // Only used by Bios
1707 USHORT FirmwareInfo; // Shared by various SW components,latest version 1.4 2067 USHORT FirmwareInfo; // Shared by various SW components,latest version 1.4
1708 USHORT DAC_Info; // Will be obsolete from R600 2068 USHORT DAC_Info; // Will be obsolete from R600
1709 USHORT LVDS_Info; // Shared by various SW components,latest version 1.1 2069 USHORT LCD_Info; // Shared by various SW components,latest version 1.3, was called LVDS_Info
1710 USHORT TMDS_Info; // Will be obsolete from R600 2070 USHORT TMDS_Info; // Will be obsolete from R600
1711 USHORT AnalogTV_Info; // Shared by various SW components,latest version 1.1 2071 USHORT AnalogTV_Info; // Shared by various SW components,latest version 1.1
1712 USHORT SupportedDevicesInfo; // Will be obsolete from R600 2072 USHORT SupportedDevicesInfo; // Will be obsolete from R600
@@ -1736,12 +2096,16 @@ typedef struct _ATOM_MASTER_LIST_OF_DATA_TABLES
1736 USHORT PowerSourceInfo; // Shared by various SW components, latest versoin 1.1 2096 USHORT PowerSourceInfo; // Shared by various SW components, latest versoin 1.1
1737}ATOM_MASTER_LIST_OF_DATA_TABLES; 2097}ATOM_MASTER_LIST_OF_DATA_TABLES;
1738 2098
2099// For backward compatible
2100#define LVDS_Info LCD_Info
2101
1739typedef struct _ATOM_MASTER_DATA_TABLE 2102typedef struct _ATOM_MASTER_DATA_TABLE
1740{ 2103{
1741 ATOM_COMMON_TABLE_HEADER sHeader; 2104 ATOM_COMMON_TABLE_HEADER sHeader;
1742 ATOM_MASTER_LIST_OF_DATA_TABLES ListOfDataTables; 2105 ATOM_MASTER_LIST_OF_DATA_TABLES ListOfDataTables;
1743}ATOM_MASTER_DATA_TABLE; 2106}ATOM_MASTER_DATA_TABLE;
1744 2107
2108
1745/****************************************************************************/ 2109/****************************************************************************/
1746// Structure used in MultimediaCapabilityInfoTable 2110// Structure used in MultimediaCapabilityInfoTable
1747/****************************************************************************/ 2111/****************************************************************************/
@@ -1776,11 +2140,12 @@ typedef struct _ATOM_MULTIMEDIA_CONFIG_INFO
1776 UCHAR ucVideoInput4Info;// Video Input 4 Type (1:0) F/B setting (2) physical connector ID (5:3) reserved (7:6) 2140 UCHAR ucVideoInput4Info;// Video Input 4 Type (1:0) F/B setting (2) physical connector ID (5:3) reserved (7:6)
1777}ATOM_MULTIMEDIA_CONFIG_INFO; 2141}ATOM_MULTIMEDIA_CONFIG_INFO;
1778 2142
2143
1779/****************************************************************************/ 2144/****************************************************************************/
1780// Structures used in FirmwareInfoTable 2145// Structures used in FirmwareInfoTable
1781/****************************************************************************/ 2146/****************************************************************************/
1782 2147
1783// usBIOSCapability Defintion: 2148// usBIOSCapability Definition:
1784// Bit 0 = 0: Bios image is not Posted, =1:Bios image is Posted; 2149// Bit 0 = 0: Bios image is not Posted, =1:Bios image is Posted;
1785// Bit 1 = 0: Dual CRTC is not supported, =1: Dual CRTC is supported; 2150// Bit 1 = 0: Dual CRTC is not supported, =1: Dual CRTC is supported;
1786// Bit 2 = 0: Extended Desktop is not supported, =1: Extended Desktop is supported; 2151// Bit 2 = 0: Extended Desktop is not supported, =1: Extended Desktop is supported;
@@ -2031,8 +2396,47 @@ typedef struct _ATOM_FIRMWARE_INFO_V2_1
2031 UCHAR ucReserved4[3]; 2396 UCHAR ucReserved4[3];
2032}ATOM_FIRMWARE_INFO_V2_1; 2397}ATOM_FIRMWARE_INFO_V2_1;
2033 2398
2399//the structure below to be used from NI
2400//ucTableFormatRevision=2
2401//ucTableContentRevision=2
2402typedef struct _ATOM_FIRMWARE_INFO_V2_2
2403{
2404 ATOM_COMMON_TABLE_HEADER sHeader;
2405 ULONG ulFirmwareRevision;
2406 ULONG ulDefaultEngineClock; //In 10Khz unit
2407 ULONG ulDefaultMemoryClock; //In 10Khz unit
2408 ULONG ulReserved[2];
2409 ULONG ulReserved1; //Was ulMaxEngineClockPLL_Output; //In 10Khz unit*
2410 ULONG ulReserved2; //Was ulMaxMemoryClockPLL_Output; //In 10Khz unit*
2411 ULONG ulMaxPixelClockPLL_Output; //In 10Khz unit
2412 ULONG ulBinaryAlteredInfo; //Was ulASICMaxEngineClock ?
2413 ULONG ulDefaultDispEngineClkFreq; //In 10Khz unit. This is the frequency before DCDTO, corresponding to usBootUpVDDCVoltage.
2414 UCHAR ucReserved3; //Was ucASICMaxTemperature;
2415 UCHAR ucMinAllowedBL_Level;
2416 USHORT usBootUpVDDCVoltage; //In MV unit
2417 USHORT usLcdMinPixelClockPLL_Output; // In MHz unit
2418 USHORT usLcdMaxPixelClockPLL_Output; // In MHz unit
2419 ULONG ulReserved4; //Was ulAsicMaximumVoltage
2420 ULONG ulMinPixelClockPLL_Output; //In 10Khz unit
2421 ULONG ulReserved5; //Was usMinEngineClockPLL_Input and usMaxEngineClockPLL_Input
2422 ULONG ulReserved6; //Was usMinEngineClockPLL_Output and usMinMemoryClockPLL_Input
2423 ULONG ulReserved7; //Was usMaxMemoryClockPLL_Input and usMinMemoryClockPLL_Output
2424 USHORT usReserved11; //Was usMaxPixelClock; //In 10Khz unit, Max. Pclk used only for DAC
2425 USHORT usMinPixelClockPLL_Input; //In 10Khz unit
2426 USHORT usMaxPixelClockPLL_Input; //In 10Khz unit
2427 USHORT usBootUpVDDCIVoltage; //In unit of mv; Was usMinPixelClockPLL_Output;
2428 ATOM_FIRMWARE_CAPABILITY_ACCESS usFirmwareCapability;
2429 USHORT usCoreReferenceClock; //In 10Khz unit
2430 USHORT usMemoryReferenceClock; //In 10Khz unit
2431 USHORT usUniphyDPModeExtClkFreq; //In 10Khz unit, if it is 0, In DP Mode Uniphy Input clock from internal PPLL, otherwise Input clock from external Spread clock
2432 UCHAR ucMemoryModule_ID; //Indicate what is the board design
2433 UCHAR ucReserved9[3];
2434 USHORT usBootUpMVDDCVoltage; //In unit of mv; Was usMinPixelClockPLL_Output;
2435 USHORT usReserved12;
2436 ULONG ulReserved10[3]; // New added comparing to previous version
2437}ATOM_FIRMWARE_INFO_V2_2;
2034 2438
2035#define ATOM_FIRMWARE_INFO_LAST ATOM_FIRMWARE_INFO_V2_1 2439#define ATOM_FIRMWARE_INFO_LAST ATOM_FIRMWARE_INFO_V2_2
2036 2440
2037/****************************************************************************/ 2441/****************************************************************************/
2038// Structures used in IntegratedSystemInfoTable 2442// Structures used in IntegratedSystemInfoTable
@@ -2212,7 +2616,7 @@ ulDockingPinCFGInfo: [15:0]-Bus/Device/Function # to CFG to read this Docking Pi
2212ucDockingPinBit: which bit in this register to read the pin status; 2616ucDockingPinBit: which bit in this register to read the pin status;
2213ucDockingPinPolarity:Polarity of the pin when docked; 2617ucDockingPinPolarity:Polarity of the pin when docked;
2214 2618
2215ulCPUCapInfo: [7:0]=1:Griffin;[7:0]=2:Greyhound;[7:0]=3:K8, other bits reserved for now and must be 0x0 2619ulCPUCapInfo: [7:0]=1:Griffin;[7:0]=2:Greyhound;[7:0]=3:K8, [7:0]=4:Pharaoh, other bits reserved for now and must be 0x0
2216 2620
2217usNumberOfCyclesInPeriod:Indicate how many cycles when PWM duty is 100%. 2621usNumberOfCyclesInPeriod:Indicate how many cycles when PWM duty is 100%.
2218 2622
@@ -2250,6 +2654,14 @@ usMinUpStreamHTLinkWidth: Asymmetric link width support in the future, to rep
2250usMinDownStreamHTLinkWidth: same as above. 2654usMinDownStreamHTLinkWidth: same as above.
2251*/ 2655*/
2252 2656
2657// ATOM_INTEGRATED_SYSTEM_INFO::ulCPUCapInfo - CPU type definition
2658#define INTEGRATED_SYSTEM_INFO__UNKNOWN_CPU 0
2659#define INTEGRATED_SYSTEM_INFO__AMD_CPU__GRIFFIN 1
2660#define INTEGRATED_SYSTEM_INFO__AMD_CPU__GREYHOUND 2
2661#define INTEGRATED_SYSTEM_INFO__AMD_CPU__K8 3
2662#define INTEGRATED_SYSTEM_INFO__AMD_CPU__PHARAOH 4
2663
2664#define INTEGRATED_SYSTEM_INFO__AMD_CPU__MAX_CODE INTEGRATED_SYSTEM_INFO__AMD_CPU__PHARAOH // this deff reflects max defined CPU code
2253 2665
2254#define SYSTEM_CONFIG_POWEREXPRESS_ENABLE 0x00000001 2666#define SYSTEM_CONFIG_POWEREXPRESS_ENABLE 0x00000001
2255#define SYSTEM_CONFIG_RUN_AT_OVERDRIVE_ENGINE 0x00000002 2667#define SYSTEM_CONFIG_RUN_AT_OVERDRIVE_ENGINE 0x00000002
@@ -2778,8 +3190,88 @@ typedef struct _ATOM_LVDS_INFO_V12
2778#define PANEL_RANDOM_DITHER 0x80 3190#define PANEL_RANDOM_DITHER 0x80
2779#define PANEL_RANDOM_DITHER_MASK 0x80 3191#define PANEL_RANDOM_DITHER_MASK 0x80
2780 3192
3193#define ATOM_LVDS_INFO_LAST ATOM_LVDS_INFO_V12 // no need to change this
3194
3195/****************************************************************************/
3196// Structures used by LCD_InfoTable V1.3 Note: previous version was called ATOM_LVDS_INFO_V12
3197// ASIC Families: NI
3198// ucTableFormatRevision=1
3199// ucTableContentRevision=3
3200/****************************************************************************/
3201typedef struct _ATOM_LCD_INFO_V13
3202{
3203 ATOM_COMMON_TABLE_HEADER sHeader;
3204 ATOM_DTD_FORMAT sLCDTiming;
3205 USHORT usExtInfoTableOffset;
3206 USHORT usSupportedRefreshRate; //Refer to panel info table in ATOMBIOS extension Spec.
3207 ULONG ulReserved0;
3208 UCHAR ucLCD_Misc; // Reorganized in V13
3209 // Bit0: {=0:single, =1:dual},
3210 // Bit1: {=0:LDI format for RGB888, =1 FPDI format for RGB888} // was {=0:666RGB, =1:888RGB},
3211 // Bit3:2: {Grey level}
3212 // Bit6:4 Color Bit Depth definition (see below definition in EDID V1.4 @BYTE 14h)
3213 // Bit7 Reserved. was for ATOM_PANEL_MISC_API_ENABLED, still need it?
3214 UCHAR ucPanelDefaultRefreshRate;
3215 UCHAR ucPanelIdentification;
3216 UCHAR ucSS_Id;
3217 USHORT usLCDVenderID;
3218 USHORT usLCDProductID;
3219 UCHAR ucLCDPanel_SpecialHandlingCap; // Reorganized in V13
3220 // Bit0: Once DAL sees this CAP is set, it will read EDID from LCD on its own
3221 // Bit1: See LCDPANEL_CAP_DRR_SUPPORTED
3222 // Bit2: a quick reference whether an embadded panel (LCD1 ) is LVDS (0) or eDP (1)
3223 // Bit7-3: Reserved
3224 UCHAR ucPanelInfoSize; // start from ATOM_DTD_FORMAT to end of panel info, include ExtInfoTable
3225 USHORT usBacklightPWM; // Backlight PWM in Hz. New in _V13
3226
3227 UCHAR ucPowerSequenceDIGONtoDE_in4Ms;
3228 UCHAR ucPowerSequenceDEtoVARY_BL_in4Ms;
3229 UCHAR ucPowerSequenceDEtoDIGON_in4Ms;
3230 UCHAR ucPowerSequenceVARY_BLtoDE_in4Ms;
3231
3232 UCHAR ucOffDelay_in4Ms;
3233 UCHAR ucPowerSequenceVARY_BLtoBLON_in4Ms;
3234 UCHAR ucPowerSequenceBLONtoVARY_BL_in4Ms;
3235 UCHAR ucReserved1;
3236
3237 ULONG ulReserved[4];
3238}ATOM_LCD_INFO_V13;
3239
3240#define ATOM_LCD_INFO_LAST ATOM_LCD_INFO_V13
3241
3242//Definitions for ucLCD_Misc
3243#define ATOM_PANEL_MISC_V13_DUAL 0x00000001
3244#define ATOM_PANEL_MISC_V13_FPDI 0x00000002
3245#define ATOM_PANEL_MISC_V13_GREY_LEVEL 0x0000000C
3246#define ATOM_PANEL_MISC_V13_GREY_LEVEL_SHIFT 2
3247#define ATOM_PANEL_MISC_V13_COLOR_BIT_DEPTH_MASK 0x70
3248#define ATOM_PANEL_MISC_V13_6BIT_PER_COLOR 0x10
3249#define ATOM_PANEL_MISC_V13_8BIT_PER_COLOR 0x20
3250
3251//Color Bit Depth definition in EDID V1.4 @BYTE 14h
3252//Bit 6 5 4
3253 // 0 0 0 - Color bit depth is undefined
3254 // 0 0 1 - 6 Bits per Primary Color
3255 // 0 1 0 - 8 Bits per Primary Color
3256 // 0 1 1 - 10 Bits per Primary Color
3257 // 1 0 0 - 12 Bits per Primary Color
3258 // 1 0 1 - 14 Bits per Primary Color
3259 // 1 1 0 - 16 Bits per Primary Color
3260 // 1 1 1 - Reserved
3261
3262//Definitions for ucLCDPanel_SpecialHandlingCap:
3263
3264//Once DAL sees this CAP is set, it will read EDID from LCD on its own instead of using sLCDTiming in ATOM_LVDS_INFO_V12.
3265//Other entries in ATOM_LVDS_INFO_V12 are still valid/useful to DAL
3266#define LCDPANEL_CAP_V13_READ_EDID 0x1 // = LCDPANEL_CAP_READ_EDID no change comparing to previous version
3267
3268//If a design supports DRR (dynamic refresh rate) on internal panels (LVDS or EDP), this cap is set in ucLCDPanel_SpecialHandlingCap together
3269//with multiple supported refresh rates@usSupportedRefreshRate. This cap should not be set when only slow refresh rate is supported (static
3270//refresh rate switch by SW. This is only valid from ATOM_LVDS_INFO_V12
3271#define LCDPANEL_CAP_V13_DRR_SUPPORTED 0x2 // = LCDPANEL_CAP_DRR_SUPPORTED no change comparing to previous version
2781 3272
2782#define ATOM_LVDS_INFO_LAST ATOM_LVDS_INFO_V12 3273//Use this cap bit for a quick reference whether an embadded panel (LCD1 ) is LVDS or eDP.
3274#define LCDPANEL_CAP_V13_eDP 0x4 // = LCDPANEL_CAP_eDP no change comparing to previous version
2783 3275
2784typedef struct _ATOM_PATCH_RECORD_MODE 3276typedef struct _ATOM_PATCH_RECORD_MODE
2785{ 3277{
@@ -2868,7 +3360,7 @@ typedef struct _ATOM_SPREAD_SPECTRUM_INFO
2868/****************************************************************************/ 3360/****************************************************************************/
2869// Structure used in AnalogTV_InfoTable (Top level) 3361// Structure used in AnalogTV_InfoTable (Top level)
2870/****************************************************************************/ 3362/****************************************************************************/
2871//ucTVBootUpDefaultStd definiton: 3363//ucTVBootUpDefaultStd definition:
2872 3364
2873//ATOM_TV_NTSC 1 3365//ATOM_TV_NTSC 1
2874//ATOM_TV_NTSCJ 2 3366//ATOM_TV_NTSCJ 2
@@ -2944,9 +3436,9 @@ typedef struct _ATOM_DPCD_INFO
2944#define MAX_DTD_MODE_IN_VRAM 6 3436#define MAX_DTD_MODE_IN_VRAM 6
2945#define ATOM_DTD_MODE_SUPPORT_TBL_SIZE (MAX_DTD_MODE_IN_VRAM*28) //28= (SIZEOF ATOM_DTD_FORMAT) 3437#define ATOM_DTD_MODE_SUPPORT_TBL_SIZE (MAX_DTD_MODE_IN_VRAM*28) //28= (SIZEOF ATOM_DTD_FORMAT)
2946#define ATOM_STD_MODE_SUPPORT_TBL_SIZE 32*8 //32 is a predefined number,8= (SIZEOF ATOM_STD_FORMAT) 3438#define ATOM_STD_MODE_SUPPORT_TBL_SIZE 32*8 //32 is a predefined number,8= (SIZEOF ATOM_STD_FORMAT)
2947#define DFP_ENCODER_TYPE_OFFSET 0x80 3439//20 bytes for Encoder Type and DPCD in STD EDID area
2948#define DP_ENCODER_LANE_NUM_OFFSET 0x84 3440#define DFP_ENCODER_TYPE_OFFSET (ATOM_EDID_RAW_DATASIZE + ATOM_DTD_MODE_SUPPORT_TBL_SIZE + ATOM_STD_MODE_SUPPORT_TBL_SIZE - 20)
2949#define DP_ENCODER_LINK_RATE_OFFSET 0x88 3441#define ATOM_DP_DPCD_OFFSET (DFP_ENCODER_TYPE_OFFSET + 4 )
2950 3442
2951#define ATOM_HWICON1_SURFACE_ADDR 0 3443#define ATOM_HWICON1_SURFACE_ADDR 0
2952#define ATOM_HWICON2_SURFACE_ADDR (ATOM_HWICON1_SURFACE_ADDR + ATOM_HWICON_SURFACE_SIZE) 3444#define ATOM_HWICON2_SURFACE_ADDR (ATOM_HWICON1_SURFACE_ADDR + ATOM_HWICON_SURFACE_SIZE)
@@ -2997,14 +3489,16 @@ typedef struct _ATOM_DPCD_INFO
2997#define ATOM_DFP5_DTD_MODE_TBL_ADDR (ATOM_DFP5_EDID_ADDR + ATOM_EDID_RAW_DATASIZE) 3489#define ATOM_DFP5_DTD_MODE_TBL_ADDR (ATOM_DFP5_EDID_ADDR + ATOM_EDID_RAW_DATASIZE)
2998#define ATOM_DFP5_STD_MODE_TBL_ADDR (ATOM_DFP5_DTD_MODE_TBL_ADDR + ATOM_DTD_MODE_SUPPORT_TBL_SIZE) 3490#define ATOM_DFP5_STD_MODE_TBL_ADDR (ATOM_DFP5_DTD_MODE_TBL_ADDR + ATOM_DTD_MODE_SUPPORT_TBL_SIZE)
2999 3491
3000#define ATOM_DP_TRAINING_TBL_ADDR (ATOM_DFP5_STD_MODE_TBL_ADDR+ATOM_STD_MODE_SUPPORT_TBL_SIZE) 3492#define ATOM_DP_TRAINING_TBL_ADDR (ATOM_DFP5_STD_MODE_TBL_ADDR + ATOM_STD_MODE_SUPPORT_TBL_SIZE)
3001 3493
3002#define ATOM_STACK_STORAGE_START (ATOM_DP_TRAINING_TBL_ADDR+256) 3494#define ATOM_STACK_STORAGE_START (ATOM_DP_TRAINING_TBL_ADDR + 1024)
3003#define ATOM_STACK_STORAGE_END ATOM_STACK_STORAGE_START+512 3495#define ATOM_STACK_STORAGE_END ATOM_STACK_STORAGE_START + 512
3004 3496
3005//The size below is in Kb! 3497//The size below is in Kb!
3006#define ATOM_VRAM_RESERVE_SIZE ((((ATOM_STACK_STORAGE_END - ATOM_HWICON1_SURFACE_ADDR)>>10)+4)&0xFFFC) 3498#define ATOM_VRAM_RESERVE_SIZE ((((ATOM_STACK_STORAGE_END - ATOM_HWICON1_SURFACE_ADDR)>>10)+4)&0xFFFC)
3007 3499
3500#define ATOM_VRAM_RESERVE_V2_SIZE 32
3501
3008#define ATOM_VRAM_OPERATION_FLAGS_MASK 0xC0000000L 3502#define ATOM_VRAM_OPERATION_FLAGS_MASK 0xC0000000L
3009#define ATOM_VRAM_OPERATION_FLAGS_SHIFT 30 3503#define ATOM_VRAM_OPERATION_FLAGS_SHIFT 30
3010#define ATOM_VRAM_BLOCK_NEEDS_NO_RESERVATION 0x1 3504#define ATOM_VRAM_BLOCK_NEEDS_NO_RESERVATION 0x1
@@ -3206,6 +3700,15 @@ typedef struct _ATOM_DISPLAY_OBJECT_PATH
3206 USHORT usGraphicObjIds[1]; //1st Encoder Obj source from GPU to last Graphic Obj destinate to connector. 3700 USHORT usGraphicObjIds[1]; //1st Encoder Obj source from GPU to last Graphic Obj destinate to connector.
3207}ATOM_DISPLAY_OBJECT_PATH; 3701}ATOM_DISPLAY_OBJECT_PATH;
3208 3702
3703typedef struct _ATOM_DISPLAY_EXTERNAL_OBJECT_PATH
3704{
3705 USHORT usDeviceTag; //supported device
3706 USHORT usSize; //the size of ATOM_DISPLAY_OBJECT_PATH
3707 USHORT usConnObjectId; //Connector Object ID
3708 USHORT usGPUObjectId; //GPU ID
3709 USHORT usGraphicObjIds[2]; //usGraphicObjIds[0]= GPU internal encoder, usGraphicObjIds[1]= external encoder
3710}ATOM_DISPLAY_EXTERNAL_OBJECT_PATH;
3711
3209typedef struct _ATOM_DISPLAY_OBJECT_PATH_TABLE 3712typedef struct _ATOM_DISPLAY_OBJECT_PATH_TABLE
3210{ 3713{
3211 UCHAR ucNumOfDispPath; 3714 UCHAR ucNumOfDispPath;
@@ -3261,6 +3764,47 @@ typedef struct _ATOM_SRC_DST_TABLE_FOR_ONE_OBJECT //usSrcDstTableOffset
3261#define EXT_AUXDDC_LUTINDEX_7 7 3764#define EXT_AUXDDC_LUTINDEX_7 7
3262#define MAX_NUMBER_OF_EXT_AUXDDC_LUT_ENTRIES (EXT_AUXDDC_LUTINDEX_7+1) 3765#define MAX_NUMBER_OF_EXT_AUXDDC_LUT_ENTRIES (EXT_AUXDDC_LUTINDEX_7+1)
3263 3766
3767//ucChannelMapping are defined as following
3768//for DP connector, eDP, DP to VGA/LVDS
3769//Bit[1:0]: Define which pin connect to DP connector DP_Lane0, =0: source from GPU pin TX0, =1: from GPU pin TX1, =2: from GPU pin TX2, =3 from GPU pin TX3
3770//Bit[3:2]: Define which pin connect to DP connector DP_Lane1, =0: source from GPU pin TX0, =1: from GPU pin TX1, =2: from GPU pin TX2, =3 from GPU pin TX3
3771//Bit[5:4]: Define which pin connect to DP connector DP_Lane2, =0: source from GPU pin TX0, =1: from GPU pin TX1, =2: from GPU pin TX2, =3 from GPU pin TX3
3772//Bit[7:6]: Define which pin connect to DP connector DP_Lane3, =0: source from GPU pin TX0, =1: from GPU pin TX1, =2: from GPU pin TX2, =3 from GPU pin TX3
3773typedef struct _ATOM_DP_CONN_CHANNEL_MAPPING
3774{
3775#if ATOM_BIG_ENDIAN
3776 UCHAR ucDP_Lane3_Source:2;
3777 UCHAR ucDP_Lane2_Source:2;
3778 UCHAR ucDP_Lane1_Source:2;
3779 UCHAR ucDP_Lane0_Source:2;
3780#else
3781 UCHAR ucDP_Lane0_Source:2;
3782 UCHAR ucDP_Lane1_Source:2;
3783 UCHAR ucDP_Lane2_Source:2;
3784 UCHAR ucDP_Lane3_Source:2;
3785#endif
3786}ATOM_DP_CONN_CHANNEL_MAPPING;
3787
3788//for DVI/HDMI, in dual link case, both links have to have same mapping.
3789//Bit[1:0]: Define which pin connect to DVI connector data Lane2, =0: source from GPU pin TX0, =1: from GPU pin TX1, =2: from GPU pin TX2, =3 from GPU pin TX3
3790//Bit[3:2]: Define which pin connect to DVI connector data Lane1, =0: source from GPU pin TX0, =1: from GPU pin TX1, =2: from GPU pin TX2, =3 from GPU pin TX3
3791//Bit[5:4]: Define which pin connect to DVI connector data Lane0, =0: source from GPU pin TX0, =1: from GPU pin TX1, =2: from GPU pin TX2, =3 from GPU pin TX3
3792//Bit[7:6]: Define which pin connect to DVI connector clock lane, =0: source from GPU pin TX0, =1: from GPU pin TX1, =2: from GPU pin TX2, =3 from GPU pin TX3
3793typedef struct _ATOM_DVI_CONN_CHANNEL_MAPPING
3794{
3795#if ATOM_BIG_ENDIAN
3796 UCHAR ucDVI_CLK_Source:2;
3797 UCHAR ucDVI_DATA0_Source:2;
3798 UCHAR ucDVI_DATA1_Source:2;
3799 UCHAR ucDVI_DATA2_Source:2;
3800#else
3801 UCHAR ucDVI_DATA2_Source:2;
3802 UCHAR ucDVI_DATA1_Source:2;
3803 UCHAR ucDVI_DATA0_Source:2;
3804 UCHAR ucDVI_CLK_Source:2;
3805#endif
3806}ATOM_DVI_CONN_CHANNEL_MAPPING;
3807
3264typedef struct _EXT_DISPLAY_PATH 3808typedef struct _EXT_DISPLAY_PATH
3265{ 3809{
3266 USHORT usDeviceTag; //A bit vector to show what devices are supported 3810 USHORT usDeviceTag; //A bit vector to show what devices are supported
@@ -3269,7 +3813,13 @@ typedef struct _EXT_DISPLAY_PATH
3269 UCHAR ucExtAUXDDCLutIndex; //An index into external AUX/DDC channel LUT 3813 UCHAR ucExtAUXDDCLutIndex; //An index into external AUX/DDC channel LUT
3270 UCHAR ucExtHPDPINLutIndex; //An index into external HPD pin LUT 3814 UCHAR ucExtHPDPINLutIndex; //An index into external HPD pin LUT
3271 USHORT usExtEncoderObjId; //external encoder object id 3815 USHORT usExtEncoderObjId; //external encoder object id
3272 USHORT usReserved[3]; 3816 union{
3817 UCHAR ucChannelMapping; // if ucChannelMapping=0, using default one to one mapping
3818 ATOM_DP_CONN_CHANNEL_MAPPING asDPMapping;
3819 ATOM_DVI_CONN_CHANNEL_MAPPING asDVIMapping;
3820 };
3821 UCHAR ucReserved;
3822 USHORT usReserved[2];
3273}EXT_DISPLAY_PATH; 3823}EXT_DISPLAY_PATH;
3274 3824
3275#define NUMBER_OF_UCHAR_FOR_GUID 16 3825#define NUMBER_OF_UCHAR_FOR_GUID 16
@@ -3281,10 +3831,11 @@ typedef struct _ATOM_EXTERNAL_DISPLAY_CONNECTION_INFO
3281 UCHAR ucGuid [NUMBER_OF_UCHAR_FOR_GUID]; // a GUID is a 16 byte long string 3831 UCHAR ucGuid [NUMBER_OF_UCHAR_FOR_GUID]; // a GUID is a 16 byte long string
3282 EXT_DISPLAY_PATH sPath[MAX_NUMBER_OF_EXT_DISPLAY_PATH]; // total of fixed 7 entries. 3832 EXT_DISPLAY_PATH sPath[MAX_NUMBER_OF_EXT_DISPLAY_PATH]; // total of fixed 7 entries.
3283 UCHAR ucChecksum; // a simple Checksum of the sum of whole structure equal to 0x0. 3833 UCHAR ucChecksum; // a simple Checksum of the sum of whole structure equal to 0x0.
3284 UCHAR Reserved [7]; // for potential expansion 3834 UCHAR uc3DStereoPinId; // use for eDP panel
3835 UCHAR Reserved [6]; // for potential expansion
3285}ATOM_EXTERNAL_DISPLAY_CONNECTION_INFO; 3836}ATOM_EXTERNAL_DISPLAY_CONNECTION_INFO;
3286 3837
3287//Related definitions, all records are differnt but they have a commond header 3838//Related definitions, all records are different but they have a commond header
3288typedef struct _ATOM_COMMON_RECORD_HEADER 3839typedef struct _ATOM_COMMON_RECORD_HEADER
3289{ 3840{
3290 UCHAR ucRecordType; //An emun to indicate the record type 3841 UCHAR ucRecordType; //An emun to indicate the record type
@@ -3311,10 +3862,11 @@ typedef struct _ATOM_COMMON_RECORD_HEADER
3311#define ATOM_CONNECTOR_AUXDDC_LUT_RECORD_TYPE 17 //This is for the case when connectors are not known to object table 3862#define ATOM_CONNECTOR_AUXDDC_LUT_RECORD_TYPE 17 //This is for the case when connectors are not known to object table
3312#define ATOM_OBJECT_LINK_RECORD_TYPE 18 //Once this record is present under one object, it indicats the oobject is linked to another obj described by the record 3863#define ATOM_OBJECT_LINK_RECORD_TYPE 18 //Once this record is present under one object, it indicats the oobject is linked to another obj described by the record
3313#define ATOM_CONNECTOR_REMOTE_CAP_RECORD_TYPE 19 3864#define ATOM_CONNECTOR_REMOTE_CAP_RECORD_TYPE 19
3865#define ATOM_ENCODER_CAP_RECORD_TYPE 20
3314 3866
3315 3867
3316//Must be updated when new record type is added,equal to that record definition! 3868//Must be updated when new record type is added,equal to that record definition!
3317#define ATOM_MAX_OBJECT_RECORD_NUMBER ATOM_CONNECTOR_REMOTE_CAP_RECORD_TYPE 3869#define ATOM_MAX_OBJECT_RECORD_NUMBER ATOM_ENCODER_CAP_RECORD_TYPE
3318 3870
3319typedef struct _ATOM_I2C_RECORD 3871typedef struct _ATOM_I2C_RECORD
3320{ 3872{
@@ -3441,6 +3993,26 @@ typedef struct _ATOM_ENCODER_DVO_CF_RECORD
3441 UCHAR ucPadding[2]; 3993 UCHAR ucPadding[2];
3442}ATOM_ENCODER_DVO_CF_RECORD; 3994}ATOM_ENCODER_DVO_CF_RECORD;
3443 3995
3996// Bit maps for ATOM_ENCODER_CAP_RECORD.ucEncoderCap
3997#define ATOM_ENCODER_CAP_RECORD_HBR2 0x01 // DP1.2 HBR2 is supported by this path
3998
3999typedef struct _ATOM_ENCODER_CAP_RECORD
4000{
4001 ATOM_COMMON_RECORD_HEADER sheader;
4002 union {
4003 USHORT usEncoderCap;
4004 struct {
4005#if ATOM_BIG_ENDIAN
4006 USHORT usReserved:15; // Bit1-15 may be defined for other capability in future
4007 USHORT usHBR2Cap:1; // Bit0 is for DP1.2 HBR2 capability.
4008#else
4009 USHORT usHBR2Cap:1; // Bit0 is for DP1.2 HBR2 capability.
4010 USHORT usReserved:15; // Bit1-15 may be defined for other capability in future
4011#endif
4012 };
4013 };
4014}ATOM_ENCODER_CAP_RECORD;
4015
3444// value for ATOM_CONNECTOR_CF_RECORD.ucConnectedDvoBundle 4016// value for ATOM_CONNECTOR_CF_RECORD.ucConnectedDvoBundle
3445#define ATOM_CONNECTOR_CF_RECORD_CONNECTED_UPPER12BITBUNDLEA 1 4017#define ATOM_CONNECTOR_CF_RECORD_CONNECTED_UPPER12BITBUNDLEA 1
3446#define ATOM_CONNECTOR_CF_RECORD_CONNECTED_LOWER12BITBUNDLEB 2 4018#define ATOM_CONNECTOR_CF_RECORD_CONNECTED_LOWER12BITBUNDLEB 2
@@ -3580,6 +4152,11 @@ typedef struct _ATOM_VOLTAGE_CONTROL
3580#define VOLTAGE_CONTROL_ID_DAC 0x02 //I2C control, used for R5xx/R6xx MVDDC,MVDDQ or VDDCI 4152#define VOLTAGE_CONTROL_ID_DAC 0x02 //I2C control, used for R5xx/R6xx MVDDC,MVDDQ or VDDCI
3581#define VOLTAGE_CONTROL_ID_VT116xM 0x03 //I2C control, used for R6xx Core Voltage 4153#define VOLTAGE_CONTROL_ID_VT116xM 0x03 //I2C control, used for R6xx Core Voltage
3582#define VOLTAGE_CONTROL_ID_DS4402 0x04 4154#define VOLTAGE_CONTROL_ID_DS4402 0x04
4155#define VOLTAGE_CONTROL_ID_UP6266 0x05
4156#define VOLTAGE_CONTROL_ID_SCORPIO 0x06
4157#define VOLTAGE_CONTROL_ID_VT1556M 0x07
4158#define VOLTAGE_CONTROL_ID_CHL822x 0x08
4159#define VOLTAGE_CONTROL_ID_VT1586M 0x09
3583 4160
3584typedef struct _ATOM_VOLTAGE_OBJECT 4161typedef struct _ATOM_VOLTAGE_OBJECT
3585{ 4162{
@@ -3670,66 +4247,157 @@ typedef struct _ATOM_POWER_SOURCE_INFO
3670#define POWER_SENSOR_GPIO 0x01 4247#define POWER_SENSOR_GPIO 0x01
3671#define POWER_SENSOR_I2C 0x02 4248#define POWER_SENSOR_I2C 0x02
3672 4249
4250typedef struct _ATOM_CLK_VOLT_CAPABILITY
4251{
4252 ULONG ulVoltageIndex; // The Voltage Index indicated by FUSE, same voltage index shared with SCLK DPM fuse table
4253 ULONG ulMaximumSupportedCLK; // Maximum clock supported with specified voltage index, unit in 10kHz
4254}ATOM_CLK_VOLT_CAPABILITY;
4255
4256typedef struct _ATOM_AVAILABLE_SCLK_LIST
4257{
4258 ULONG ulSupportedSCLK; // Maximum clock supported with specified voltage index, unit in 10kHz
4259 USHORT usVoltageIndex; // The Voltage Index indicated by FUSE for specified SCLK
4260 USHORT usVoltageID; // The Voltage ID indicated by FUSE for specified SCLK
4261}ATOM_AVAILABLE_SCLK_LIST;
4262
4263// ATOM_INTEGRATED_SYSTEM_INFO_V6 ulSystemConfig cap definition
4264#define ATOM_IGP_INFO_V6_SYSTEM_CONFIG__PCIE_POWER_GATING_ENABLE 1 // refer to ulSystemConfig bit[0]
4265
4266// this IntegrateSystemInfoTable is used for Liano/Ontario APU
3673typedef struct _ATOM_INTEGRATED_SYSTEM_INFO_V6 4267typedef struct _ATOM_INTEGRATED_SYSTEM_INFO_V6
3674{ 4268{
3675 ATOM_COMMON_TABLE_HEADER sHeader; 4269 ATOM_COMMON_TABLE_HEADER sHeader;
3676 ULONG ulBootUpEngineClock; 4270 ULONG ulBootUpEngineClock;
3677 ULONG ulDentistVCOFreq; 4271 ULONG ulDentistVCOFreq;
3678 ULONG ulBootUpUMAClock; 4272 ULONG ulBootUpUMAClock;
3679 ULONG ulReserved1[8]; 4273 ATOM_CLK_VOLT_CAPABILITY sDISPCLK_Voltage[4];
3680 ULONG ulBootUpReqDisplayVector; 4274 ULONG ulBootUpReqDisplayVector;
3681 ULONG ulOtherDisplayMisc; 4275 ULONG ulOtherDisplayMisc;
3682 ULONG ulGPUCapInfo; 4276 ULONG ulGPUCapInfo;
3683 ULONG ulReserved2[3]; 4277 ULONG ulSB_MMIO_Base_Addr;
4278 USHORT usRequestedPWMFreqInHz;
4279 UCHAR ucHtcTmpLmt;
4280 UCHAR ucHtcHystLmt;
4281 ULONG ulMinEngineClock;
3684 ULONG ulSystemConfig; 4282 ULONG ulSystemConfig;
3685 ULONG ulCPUCapInfo; 4283 ULONG ulCPUCapInfo;
3686 USHORT usMaxNBVoltage; 4284 USHORT usNBP0Voltage;
3687 USHORT usMinNBVoltage; 4285 USHORT usNBP1Voltage;
3688 USHORT usBootUpNBVoltage; 4286 USHORT usBootUpNBVoltage;
3689 USHORT usExtDispConnInfoOffset; 4287 USHORT usExtDispConnInfoOffset;
3690 UCHAR ucHtcTmpLmt; 4288 USHORT usPanelRefreshRateRange;
3691 UCHAR ucTjOffset;
3692 UCHAR ucMemoryType; 4289 UCHAR ucMemoryType;
3693 UCHAR ucUMAChannelNumber; 4290 UCHAR ucUMAChannelNumber;
3694 ULONG ulCSR_M3_ARB_CNTL_DEFAULT[10]; 4291 ULONG ulCSR_M3_ARB_CNTL_DEFAULT[10];
3695 ULONG ulCSR_M3_ARB_CNTL_UVD[10]; 4292 ULONG ulCSR_M3_ARB_CNTL_UVD[10];
3696 ULONG ulCSR_M3_ARB_CNTL_FS3D[10]; 4293 ULONG ulCSR_M3_ARB_CNTL_FS3D[10];
3697 ULONG ulReserved3[42]; 4294 ATOM_AVAILABLE_SCLK_LIST sAvail_SCLK[5];
4295 ULONG ulGMCRestoreResetTime;
4296 ULONG ulMinimumNClk;
4297 ULONG ulIdleNClk;
4298 ULONG ulDDR_DLL_PowerUpTime;
4299 ULONG ulDDR_PLL_PowerUpTime;
4300 USHORT usPCIEClkSSPercentage;
4301 USHORT usPCIEClkSSType;
4302 USHORT usLvdsSSPercentage;
4303 USHORT usLvdsSSpreadRateIn10Hz;
4304 USHORT usHDMISSPercentage;
4305 USHORT usHDMISSpreadRateIn10Hz;
4306 USHORT usDVISSPercentage;
4307 USHORT usDVISSpreadRateIn10Hz;
4308 ULONG ulReserved3[21];
3698 ATOM_EXTERNAL_DISPLAY_CONNECTION_INFO sExtDispConnInfo; 4309 ATOM_EXTERNAL_DISPLAY_CONNECTION_INFO sExtDispConnInfo;
3699}ATOM_INTEGRATED_SYSTEM_INFO_V6; 4310}ATOM_INTEGRATED_SYSTEM_INFO_V6;
3700 4311
4312// ulGPUCapInfo
4313#define INTEGRATED_SYSTEM_INFO_V6_GPUCAPINFO__TMDSHDMI_COHERENT_SINGLEPLL_MODE 0x01
4314#define INTEGRATED_SYSTEM_INFO_V6_GPUCAPINFO__DISABLE_AUX_HW_MODE_DETECTION 0x08
4315
4316// ulOtherDisplayMisc
4317#define INTEGRATED_SYSTEM_INFO__GET_EDID_CALLBACK_FUNC_SUPPORT 0x01
4318
4319
3701/********************************************************************************************************************** 4320/**********************************************************************************************************************
3702// ATOM_INTEGRATED_SYSTEM_INFO_V6 Description 4321 ATOM_INTEGRATED_SYSTEM_INFO_V6 Description
3703//ulBootUpEngineClock: VBIOS bootup Engine clock frequency, in 10kHz unit. 4322ulBootUpEngineClock: VBIOS bootup Engine clock frequency, in 10kHz unit. if it is equal 0, then VBIOS use pre-defined bootup engine clock
3704//ulDentistVCOFreq: Dentist VCO clock in 10kHz unit. 4323ulDentistVCOFreq: Dentist VCO clock in 10kHz unit.
3705//ulBootUpUMAClock: System memory boot up clock frequency in 10Khz unit. 4324ulBootUpUMAClock: System memory boot up clock frequency in 10Khz unit.
3706//ulReserved1[8] Reserved by now, must be 0x0. 4325sDISPCLK_Voltage: Report Display clock voltage requirement.
3707//ulBootUpReqDisplayVector VBIOS boot up display IDs 4326
3708// ATOM_DEVICE_CRT1_SUPPORT 0x0001 4327ulBootUpReqDisplayVector: VBIOS boot up display IDs, following are supported devices in Liano/Ontaio projects:
3709// ATOM_DEVICE_CRT2_SUPPORT 0x0010 4328 ATOM_DEVICE_CRT1_SUPPORT 0x0001
3710// ATOM_DEVICE_DFP1_SUPPORT 0x0008 4329 ATOM_DEVICE_CRT2_SUPPORT 0x0010
3711// ATOM_DEVICE_DFP6_SUPPORT 0x0040 4330 ATOM_DEVICE_DFP1_SUPPORT 0x0008
3712// ATOM_DEVICE_DFP2_SUPPORT 0x0080 4331 ATOM_DEVICE_DFP6_SUPPORT 0x0040
3713// ATOM_DEVICE_DFP3_SUPPORT 0x0200 4332 ATOM_DEVICE_DFP2_SUPPORT 0x0080
3714// ATOM_DEVICE_DFP4_SUPPORT 0x0400 4333 ATOM_DEVICE_DFP3_SUPPORT 0x0200
3715// ATOM_DEVICE_DFP5_SUPPORT 0x0800 4334 ATOM_DEVICE_DFP4_SUPPORT 0x0400
3716// ATOM_DEVICE_LCD1_SUPPORT 0x0002 4335 ATOM_DEVICE_DFP5_SUPPORT 0x0800
3717//ulOtherDisplayMisc Other display related flags, not defined yet. 4336 ATOM_DEVICE_LCD1_SUPPORT 0x0002
3718//ulGPUCapInfo TBD 4337ulOtherDisplayMisc: Other display related flags, not defined yet.
3719//ulReserved2[3] must be 0x0 for the reserved. 4338ulGPUCapInfo: bit[0]=0: TMDS/HDMI Coherent Mode use cascade PLL mode.
3720//ulSystemConfig TBD 4339 =1: TMDS/HDMI Coherent Mode use signel PLL mode.
3721//ulCPUCapInfo TBD 4340 bit[3]=0: Enable HW AUX mode detection logic
3722//usMaxNBVoltage High NB voltage in unit of mv, calculated using current VDDNB (D24F2xDC) and VDDNB offset fuse. 4341 =1: Disable HW AUX mode dettion logic
3723//usMinNBVoltage Low NB voltage in unit of mv, calculated using current VDDNB (D24F2xDC) and VDDNB offset fuse. 4342ulSB_MMIO_Base_Addr: Physical Base address to SB MMIO space. Driver needs to initialize it for SMU usage.
3724//usBootUpNBVoltage Boot up NB voltage in unit of mv. 4343
3725//ucHtcTmpLmt Bit [22:16] of D24F3x64 Thermal Control (HTC) Register. 4344usRequestedPWMFreqInHz: When it's set to 0x0 by SBIOS: the LCD BackLight is not controlled by GPU(SW).
3726//ucTjOffset Bit [28:22] of D24F3xE4 Thermtrip Status Register,may not be needed. 4345 Any attempt to change BL using VBIOS function or enable VariBri from PP table is not effective since ATOM_BIOS_INFO_BL_CONTROLLED_BY_GPU==0;
3727//ucMemoryType [3:0]=1:DDR1;=2:DDR2;=3:DDR3.[7:4] is reserved. 4346
3728//ucUMAChannelNumber System memory channel numbers. 4347 When it's set to a non-zero frequency, the BackLight is controlled by GPU (SW) in one of two ways below:
3729//usExtDispConnectionInfoOffset ATOM_EXTERNAL_DISPLAY_CONNECTION_INFO offset relative to beginning of this table. 4348 1. SW uses the GPU BL PWM output to control the BL, in chis case, this non-zero frequency determines what freq GPU should use;
3730//ulCSR_M3_ARB_CNTL_DEFAULT[10] Arrays with values for CSR M3 arbiter for default 4349 VBIOS will set up proper PWM frequency and ATOM_BIOS_INFO_BL_CONTROLLED_BY_GPU==1,as the result,
3731//ulCSR_M3_ARB_CNTL_UVD[10] Arrays with values for CSR M3 arbiter for UVD playback. 4350 Changing BL using VBIOS function is functional in both driver and non-driver present environment;
3732//ulCSR_M3_ARB_CNTL_FS3D[10] Arrays with values for CSR M3 arbiter for Full Screen 3D applications. 4351 and enabling VariBri under the driver environment from PP table is optional.
4352
4353 2. SW uses other means to control BL (like DPCD),this non-zero frequency serves as a flag only indicating
4354 that BL control from GPU is expected.
4355 VBIOS will NOT set up PWM frequency but make ATOM_BIOS_INFO_BL_CONTROLLED_BY_GPU==1
4356 Changing BL using VBIOS function could be functional in both driver and non-driver present environment,but
4357 it's per platform
4358 and enabling VariBri under the driver environment from PP table is optional.
4359
4360ucHtcTmpLmt: Refer to D18F3x64 bit[22:16], HtcTmpLmt.
4361 Threshold on value to enter HTC_active state.
4362ucHtcHystLmt: Refer to D18F3x64 bit[27:24], HtcHystLmt.
4363 To calculate threshold off value to exit HTC_active state, which is Threshold on vlaue minus ucHtcHystLmt.
4364ulMinEngineClock: Minimum SCLK allowed in 10kHz unit. This is calculated based on WRCK Fuse settings.
4365ulSystemConfig: Bit[0]=0: PCIE Power Gating Disabled
4366 =1: PCIE Power Gating Enabled
4367 Bit[1]=0: DDR-DLL shut-down feature disabled.
4368 1: DDR-DLL shut-down feature enabled.
4369 Bit[2]=0: DDR-PLL Power down feature disabled.
4370 1: DDR-PLL Power down feature enabled.
4371ulCPUCapInfo: TBD
4372usNBP0Voltage: VID for voltage on NB P0 State
4373usNBP1Voltage: VID for voltage on NB P1 State
4374usBootUpNBVoltage: Voltage Index of GNB voltage configured by SBIOS, which is suffcient to support VBIOS DISPCLK requirement.
4375usExtDispConnInfoOffset: Offset to sExtDispConnInfo inside the structure
4376usPanelRefreshRateRange: Bit vector for LCD supported refresh rate range. If DRR is requestd by the platform, at least two bits need to be set
4377 to indicate a range.
4378 SUPPORTED_LCD_REFRESHRATE_30Hz 0x0004
4379 SUPPORTED_LCD_REFRESHRATE_40Hz 0x0008
4380 SUPPORTED_LCD_REFRESHRATE_50Hz 0x0010
4381 SUPPORTED_LCD_REFRESHRATE_60Hz 0x0020
4382ucMemoryType: [3:0]=1:DDR1;=2:DDR2;=3:DDR3.[7:4] is reserved.
4383ucUMAChannelNumber: System memory channel numbers.
4384ulCSR_M3_ARB_CNTL_DEFAULT[10]: Arrays with values for CSR M3 arbiter for default
4385ulCSR_M3_ARB_CNTL_UVD[10]: Arrays with values for CSR M3 arbiter for UVD playback.
4386ulCSR_M3_ARB_CNTL_FS3D[10]: Arrays with values for CSR M3 arbiter for Full Screen 3D applications.
4387sAvail_SCLK[5]: Arrays to provide available list of SLCK and corresponding voltage, order from low to high
4388ulGMCRestoreResetTime: GMC power restore and GMC reset time to calculate data reconnection latency. Unit in ns.
4389ulMinimumNClk: Minimum NCLK speed among all NB-Pstates to calcualte data reconnection latency. Unit in 10kHz.
4390ulIdleNClk: NCLK speed while memory runs in self-refresh state. Unit in 10kHz.
4391ulDDR_DLL_PowerUpTime: DDR PHY DLL power up time. Unit in ns.
4392ulDDR_PLL_PowerUpTime: DDR PHY PLL power up time. Unit in ns.
4393usPCIEClkSSPercentage: PCIE Clock Spread Spectrum Percentage in unit 0.01%; 100 mean 1%.
4394usPCIEClkSSType: PCIE Clock Spread Spectrum Type. 0 for Down spread(default); 1 for Center spread.
4395usLvdsSSPercentage: LVDS panel ( not include eDP ) Spread Spectrum Percentage in unit of 0.01%, =0, use VBIOS default setting.
4396usLvdsSSpreadRateIn10Hz: LVDS panel ( not include eDP ) Spread Spectrum frequency in unit of 10Hz, =0, use VBIOS default setting.
4397usHDMISSPercentage: HDMI Spread Spectrum Percentage in unit 0.01%; 100 mean 1%, =0, use VBIOS default setting.
4398usHDMISSpreadRateIn10Hz: HDMI Spread Spectrum frequency in unit of 10Hz, =0, use VBIOS default setting.
4399usDVISSPercentage: DVI Spread Spectrum Percentage in unit 0.01%; 100 mean 1%, =0, use VBIOS default setting.
4400usDVISSpreadRateIn10Hz: DVI Spread Spectrum frequency in unit of 10Hz, =0, use VBIOS default setting.
3733**********************************************************************************************************************/ 4401**********************************************************************************************************************/
3734 4402
3735/**************************************************************************/ 4403/**************************************************************************/
@@ -3790,6 +4458,7 @@ typedef struct _ATOM_ASIC_SS_ASSIGNMENT
3790#define ASIC_INTERNAL_SS_ON_LVDS 6 4458#define ASIC_INTERNAL_SS_ON_LVDS 6
3791#define ASIC_INTERNAL_SS_ON_DP 7 4459#define ASIC_INTERNAL_SS_ON_DP 7
3792#define ASIC_INTERNAL_SS_ON_DCPLL 8 4460#define ASIC_INTERNAL_SS_ON_DCPLL 8
4461#define ASIC_EXTERNAL_SS_ON_DP_CLOCK 9
3793 4462
3794typedef struct _ATOM_ASIC_SS_ASSIGNMENT_V2 4463typedef struct _ATOM_ASIC_SS_ASSIGNMENT_V2
3795{ 4464{
@@ -3903,8 +4572,9 @@ typedef struct _ATOM_ASIC_INTERNAL_SS_INFO_V3
3903#define ATOM_S0_SYSTEM_POWER_STATE_VALUE_AC 1 4572#define ATOM_S0_SYSTEM_POWER_STATE_VALUE_AC 1
3904#define ATOM_S0_SYSTEM_POWER_STATE_VALUE_DC 2 4573#define ATOM_S0_SYSTEM_POWER_STATE_VALUE_DC 2
3905#define ATOM_S0_SYSTEM_POWER_STATE_VALUE_LITEAC 3 4574#define ATOM_S0_SYSTEM_POWER_STATE_VALUE_LITEAC 3
4575#define ATOM_S0_SYSTEM_POWER_STATE_VALUE_LIT2AC 4
3906 4576
3907//Byte aligned defintion for BIOS usage 4577//Byte aligned definition for BIOS usage
3908#define ATOM_S0_CRT1_MONOb0 0x01 4578#define ATOM_S0_CRT1_MONOb0 0x01
3909#define ATOM_S0_CRT1_COLORb0 0x02 4579#define ATOM_S0_CRT1_COLORb0 0x02
3910#define ATOM_S0_CRT1_MASKb0 (ATOM_S0_CRT1_MONOb0+ATOM_S0_CRT1_COLORb0) 4580#define ATOM_S0_CRT1_MASKb0 (ATOM_S0_CRT1_MONOb0+ATOM_S0_CRT1_COLORb0)
@@ -3970,7 +4640,7 @@ typedef struct _ATOM_ASIC_INTERNAL_SS_INFO_V3
3970#define ATOM_S2_DISPLAY_ROTATION_ANGLE_MASK 0xC0000000L 4640#define ATOM_S2_DISPLAY_ROTATION_ANGLE_MASK 0xC0000000L
3971 4641
3972 4642
3973//Byte aligned defintion for BIOS usage 4643//Byte aligned definition for BIOS usage
3974#define ATOM_S2_TV1_STANDARD_MASKb0 0x0F 4644#define ATOM_S2_TV1_STANDARD_MASKb0 0x0F
3975#define ATOM_S2_CURRENT_BL_LEVEL_MASKb1 0xFF 4645#define ATOM_S2_CURRENT_BL_LEVEL_MASKb1 0xFF
3976#define ATOM_S2_DEVICE_DPMS_STATEb2 0x01 4646#define ATOM_S2_DEVICE_DPMS_STATEb2 0x01
@@ -4020,7 +4690,7 @@ typedef struct _ATOM_ASIC_INTERNAL_SS_INFO_V3
4020#define ATOM_S3_ALLOW_FAST_PWR_SWITCH 0x40000000L 4690#define ATOM_S3_ALLOW_FAST_PWR_SWITCH 0x40000000L
4021#define ATOM_S3_RQST_GPU_USE_MIN_PWR 0x80000000L 4691#define ATOM_S3_RQST_GPU_USE_MIN_PWR 0x80000000L
4022 4692
4023//Byte aligned defintion for BIOS usage 4693//Byte aligned definition for BIOS usage
4024#define ATOM_S3_CRT1_ACTIVEb0 0x01 4694#define ATOM_S3_CRT1_ACTIVEb0 0x01
4025#define ATOM_S3_LCD1_ACTIVEb0 0x02 4695#define ATOM_S3_LCD1_ACTIVEb0 0x02
4026#define ATOM_S3_TV1_ACTIVEb0 0x04 4696#define ATOM_S3_TV1_ACTIVEb0 0x04
@@ -4056,7 +4726,7 @@ typedef struct _ATOM_ASIC_INTERNAL_SS_INFO_V3
4056#define ATOM_S4_LCD1_REFRESH_MASK 0x0000FF00L 4726#define ATOM_S4_LCD1_REFRESH_MASK 0x0000FF00L
4057#define ATOM_S4_LCD1_REFRESH_SHIFT 8 4727#define ATOM_S4_LCD1_REFRESH_SHIFT 8
4058 4728
4059//Byte aligned defintion for BIOS usage 4729//Byte aligned definition for BIOS usage
4060#define ATOM_S4_LCD1_PANEL_ID_MASKb0 0x0FF 4730#define ATOM_S4_LCD1_PANEL_ID_MASKb0 0x0FF
4061#define ATOM_S4_LCD1_REFRESH_MASKb1 ATOM_S4_LCD1_PANEL_ID_MASKb0 4731#define ATOM_S4_LCD1_REFRESH_MASKb1 ATOM_S4_LCD1_PANEL_ID_MASKb0
4062#define ATOM_S4_VRAM_INFO_MASKb2 ATOM_S4_LCD1_PANEL_ID_MASKb0 4732#define ATOM_S4_VRAM_INFO_MASKb2 ATOM_S4_LCD1_PANEL_ID_MASKb0
@@ -4135,7 +4805,7 @@ typedef struct _ATOM_ASIC_INTERNAL_SS_INFO_V3
4135#define ATOM_S6_VRI_BRIGHTNESS_CHANGE 0x40000000L 4805#define ATOM_S6_VRI_BRIGHTNESS_CHANGE 0x40000000L
4136#define ATOM_S6_CONFIG_DISPLAY_CHANGE_MASK 0x80000000L 4806#define ATOM_S6_CONFIG_DISPLAY_CHANGE_MASK 0x80000000L
4137 4807
4138//Byte aligned defintion for BIOS usage 4808//Byte aligned definition for BIOS usage
4139#define ATOM_S6_DEVICE_CHANGEb0 0x01 4809#define ATOM_S6_DEVICE_CHANGEb0 0x01
4140#define ATOM_S6_SCALER_CHANGEb0 0x02 4810#define ATOM_S6_SCALER_CHANGEb0 0x02
4141#define ATOM_S6_LID_CHANGEb0 0x04 4811#define ATOM_S6_LID_CHANGEb0 0x04
@@ -4376,7 +5046,7 @@ typedef struct _ENABLE_GRAPH_SURFACE_PS_ALLOCATION
4376 5046
4377typedef struct _MEMORY_CLEAN_UP_PARAMETERS 5047typedef struct _MEMORY_CLEAN_UP_PARAMETERS
4378{ 5048{
4379 USHORT usMemoryStart; //in 8Kb boundry, offset from memory base address 5049 USHORT usMemoryStart; //in 8Kb boundary, offset from memory base address
4380 USHORT usMemorySize; //8Kb blocks aligned 5050 USHORT usMemorySize; //8Kb blocks aligned
4381}MEMORY_CLEAN_UP_PARAMETERS; 5051}MEMORY_CLEAN_UP_PARAMETERS;
4382#define MEMORY_CLEAN_UP_PS_ALLOCATION MEMORY_CLEAN_UP_PARAMETERS 5052#define MEMORY_CLEAN_UP_PS_ALLOCATION MEMORY_CLEAN_UP_PARAMETERS
@@ -4529,7 +5199,8 @@ typedef struct _ATOM_INIT_REG_BLOCK{
4529#define INDEX_ACCESS_RANGE_BEGIN (VALUE_DWORD + 1) 5199#define INDEX_ACCESS_RANGE_BEGIN (VALUE_DWORD + 1)
4530#define INDEX_ACCESS_RANGE_END (INDEX_ACCESS_RANGE_BEGIN + 1) 5200#define INDEX_ACCESS_RANGE_END (INDEX_ACCESS_RANGE_BEGIN + 1)
4531#define VALUE_INDEX_ACCESS_SINGLE (INDEX_ACCESS_RANGE_END + 1) 5201#define VALUE_INDEX_ACCESS_SINGLE (INDEX_ACCESS_RANGE_END + 1)
4532 5202//#define ACCESS_MCIODEBUGIND 0x40 //defined in BIOS code
5203#define ACCESS_PLACEHOLDER 0x80
4533 5204
4534typedef struct _ATOM_MC_INIT_PARAM_TABLE 5205typedef struct _ATOM_MC_INIT_PARAM_TABLE
4535{ 5206{
@@ -4554,6 +5225,10 @@ typedef struct _ATOM_MC_INIT_PARAM_TABLE
4554#define _32Mx32 0x33 5225#define _32Mx32 0x33
4555#define _64Mx8 0x41 5226#define _64Mx8 0x41
4556#define _64Mx16 0x42 5227#define _64Mx16 0x42
5228#define _64Mx32 0x43
5229#define _128Mx8 0x51
5230#define _128Mx16 0x52
5231#define _256Mx8 0x61
4557 5232
4558#define SAMSUNG 0x1 5233#define SAMSUNG 0x1
4559#define INFINEON 0x2 5234#define INFINEON 0x2
@@ -4569,10 +5244,11 @@ typedef struct _ATOM_MC_INIT_PARAM_TABLE
4569#define QIMONDA INFINEON 5244#define QIMONDA INFINEON
4570#define PROMOS MOSEL 5245#define PROMOS MOSEL
4571#define KRETON INFINEON 5246#define KRETON INFINEON
5247#define ELIXIR NANYA
4572 5248
4573/////////////Support for GDDR5 MC uCode to reside in upper 64K of ROM///////////// 5249/////////////Support for GDDR5 MC uCode to reside in upper 64K of ROM/////////////
4574 5250
4575#define UCODE_ROM_START_ADDRESS 0x1c000 5251#define UCODE_ROM_START_ADDRESS 0x1b800
4576#define UCODE_SIGNATURE 0x4375434d // 'MCuC' - MC uCode 5252#define UCODE_SIGNATURE 0x4375434d // 'MCuC' - MC uCode
4577 5253
4578//uCode block header for reference 5254//uCode block header for reference
@@ -4903,7 +5579,34 @@ typedef struct _ATOM_VRAM_MODULE_V6
4903 ATOM_MEMORY_TIMING_FORMAT_V2 asMemTiming[5];//Memory Timing block sort from lower clock to higher clock 5579 ATOM_MEMORY_TIMING_FORMAT_V2 asMemTiming[5];//Memory Timing block sort from lower clock to higher clock
4904}ATOM_VRAM_MODULE_V6; 5580}ATOM_VRAM_MODULE_V6;
4905 5581
4906 5582typedef struct _ATOM_VRAM_MODULE_V7
5583{
5584// Design Specific Values
5585 ULONG ulChannelMapCfg; // mmMC_SHARED_CHREMAP
5586 USHORT usModuleSize; // Size of ATOM_VRAM_MODULE_V7
5587 USHORT usPrivateReserved; // MC_ARB_RAMCFG (includes NOOFBANK,NOOFRANKS,NOOFROWS,NOOFCOLS)
5588 USHORT usReserved;
5589 UCHAR ucExtMemoryID; // Current memory module ID
5590 UCHAR ucMemoryType; // MEM_TYPE_DDR2/DDR3/GDDR3/GDDR5
5591 UCHAR ucChannelNum; // Number of mem. channels supported in this module
5592 UCHAR ucChannelWidth; // CHANNEL_16BIT/CHANNEL_32BIT/CHANNEL_64BIT
5593 UCHAR ucDensity; // _8Mx32, _16Mx32, _16Mx16, _32Mx16
5594 UCHAR ucReserve; // Former container for Mx_FLAGS like DBI_AC_MODE_ENABLE_ASIC for GDDR4. Not used now.
5595 UCHAR ucMisc; // RANK_OF_THISMEMORY etc.
5596 UCHAR ucVREFI; // Not used.
5597 UCHAR ucNPL_RT; // Round trip delay (MC_SEQ_CAS_TIMING [28:24]:TCL=CL+NPL_RT-2). Always 2.
5598 UCHAR ucPreamble; // [7:4] Write Preamble, [3:0] Read Preamble
5599 UCHAR ucMemorySize; // Total memory size in unit of 16MB for CONFIG_MEMSIZE - bit[23:0] zeros
5600 UCHAR ucReserved[3];
5601// Memory Module specific values
5602 USHORT usEMRS2Value; // EMRS2/MR2 Value.
5603 USHORT usEMRS3Value; // EMRS3/MR3 Value.
5604 UCHAR ucMemoryVenderID; // [7:4] Revision, [3:0] Vendor code
5605 UCHAR ucRefreshRateFactor; // [1:0]=RefreshFactor (00=8ms, 01=16ms, 10=32ms,11=64ms)
5606 UCHAR ucFIFODepth; // FIFO depth can be detected during vendor detection, here is hardcoded per memory
5607 UCHAR ucCDR_Bandwidth; // [0:3]=Read CDR bandwidth, [4:7] - Write CDR Bandwidth
5608 char strMemPNString[20]; // part number end with '0'.
5609}ATOM_VRAM_MODULE_V7;
4907 5610
4908typedef struct _ATOM_VRAM_INFO_V2 5611typedef struct _ATOM_VRAM_INFO_V2
4909{ 5612{
@@ -4942,6 +5645,20 @@ typedef struct _ATOM_VRAM_INFO_V4
4942 // ATOM_INIT_REG_BLOCK aMemAdjust; 5645 // ATOM_INIT_REG_BLOCK aMemAdjust;
4943}ATOM_VRAM_INFO_V4; 5646}ATOM_VRAM_INFO_V4;
4944 5647
5648typedef struct _ATOM_VRAM_INFO_HEADER_V2_1
5649{
5650 ATOM_COMMON_TABLE_HEADER sHeader;
5651 USHORT usMemAdjustTblOffset; // offset of ATOM_INIT_REG_BLOCK structure for memory vendor specific MC adjust setting
5652 USHORT usMemClkPatchTblOffset; // offset of ATOM_INIT_REG_BLOCK structure for memory clock specific MC setting
5653 USHORT usReserved[4];
5654 UCHAR ucNumOfVRAMModule; // indicate number of VRAM module
5655 UCHAR ucMemoryClkPatchTblVer; // version of memory AC timing register list
5656 UCHAR ucVramModuleVer; // indicate ATOM_VRAM_MODUE version
5657 UCHAR ucReserved;
5658 ATOM_VRAM_MODULE_V7 aVramInfo[ATOM_MAX_NUMBER_OF_VRAM_MODULE]; // just for allocation, real number of blocks is in ucNumOfVRAMModule;
5659}ATOM_VRAM_INFO_HEADER_V2_1;
5660
5661
4945typedef struct _ATOM_VRAM_GPIO_DETECTION_INFO 5662typedef struct _ATOM_VRAM_GPIO_DETECTION_INFO
4946{ 5663{
4947 ATOM_COMMON_TABLE_HEADER sHeader; 5664 ATOM_COMMON_TABLE_HEADER sHeader;
@@ -5182,6 +5899,16 @@ typedef struct _ASIC_TRANSMITTER_INFO
5182 UCHAR ucReserved; 5899 UCHAR ucReserved;
5183}ASIC_TRANSMITTER_INFO; 5900}ASIC_TRANSMITTER_INFO;
5184 5901
5902#define ASIC_TRANSMITTER_INFO_CONFIG__DVO_SDR_MODE 0x01
5903#define ASIC_TRANSMITTER_INFO_CONFIG__COHERENT_MODE 0x02
5904#define ASIC_TRANSMITTER_INFO_CONFIG__ENCODEROBJ_ID_MASK 0xc4
5905#define ASIC_TRANSMITTER_INFO_CONFIG__ENCODER_A 0x00
5906#define ASIC_TRANSMITTER_INFO_CONFIG__ENCODER_B 0x04
5907#define ASIC_TRANSMITTER_INFO_CONFIG__ENCODER_C 0x40
5908#define ASIC_TRANSMITTER_INFO_CONFIG__ENCODER_D 0x44
5909#define ASIC_TRANSMITTER_INFO_CONFIG__ENCODER_E 0x80
5910#define ASIC_TRANSMITTER_INFO_CONFIG__ENCODER_F 0x84
5911
5185typedef struct _ASIC_ENCODER_INFO 5912typedef struct _ASIC_ENCODER_INFO
5186{ 5913{
5187 UCHAR ucEncoderID; 5914 UCHAR ucEncoderID;
@@ -5284,6 +6011,28 @@ typedef struct _DP_ENCODER_SERVICE_PARAMETERS
5284/* /obselete */ 6011/* /obselete */
5285#define DP_ENCODER_SERVICE_PS_ALLOCATION WRITE_ONE_BYTE_HW_I2C_DATA_PARAMETERS 6012#define DP_ENCODER_SERVICE_PS_ALLOCATION WRITE_ONE_BYTE_HW_I2C_DATA_PARAMETERS
5286 6013
6014
6015typedef struct _DP_ENCODER_SERVICE_PARAMETERS_V2
6016{
6017 USHORT usExtEncoderObjId; // External Encoder Object Id, output parameter only, use when ucAction = DP_SERVICE_V2_ACTION_DET_EXT_CONNECTION
6018 UCHAR ucAuxId;
6019 UCHAR ucAction;
6020 UCHAR ucSinkType; // Iput and Output parameters.
6021 UCHAR ucHPDId; // Input parameter, used when ucAction = DP_SERVICE_V2_ACTION_DET_EXT_CONNECTION
6022 UCHAR ucReserved[2];
6023}DP_ENCODER_SERVICE_PARAMETERS_V2;
6024
6025typedef struct _DP_ENCODER_SERVICE_PS_ALLOCATION_V2
6026{
6027 DP_ENCODER_SERVICE_PARAMETERS_V2 asDPServiceParam;
6028 PROCESS_AUX_CHANNEL_TRANSACTION_PARAMETERS_V2 asAuxParam;
6029}DP_ENCODER_SERVICE_PS_ALLOCATION_V2;
6030
6031// ucAction
6032#define DP_SERVICE_V2_ACTION_GET_SINK_TYPE 0x01
6033#define DP_SERVICE_V2_ACTION_DET_LCD_CONNECTION 0x02
6034
6035
5287// DP_TRAINING_TABLE 6036// DP_TRAINING_TABLE
5288#define DPCD_SET_LINKRATE_LANENUM_PATTERN1_TBL_ADDR ATOM_DP_TRAINING_TBL_ADDR 6037#define DPCD_SET_LINKRATE_LANENUM_PATTERN1_TBL_ADDR ATOM_DP_TRAINING_TBL_ADDR
5289#define DPCD_SET_SS_CNTL_TBL_ADDR (ATOM_DP_TRAINING_TBL_ADDR + 8 ) 6038#define DPCD_SET_SS_CNTL_TBL_ADDR (ATOM_DP_TRAINING_TBL_ADDR + 8 )
@@ -5339,6 +6088,7 @@ typedef struct _SET_HWBLOCK_INSTANCE_PARAMETER_V2
5339#define SELECT_DCIO_IMPCAL 4 6088#define SELECT_DCIO_IMPCAL 4
5340#define SELECT_DCIO_DIG 6 6089#define SELECT_DCIO_DIG 6
5341#define SELECT_CRTC_PIXEL_RATE 7 6090#define SELECT_CRTC_PIXEL_RATE 7
6091#define SELECT_VGA_BLK 8
5342 6092
5343/****************************************************************************/ 6093/****************************************************************************/
5344//Portion VI: Definitinos for vbios MC scratch registers that driver used 6094//Portion VI: Definitinos for vbios MC scratch registers that driver used
@@ -5744,7 +6494,17 @@ typedef struct _ATOM_PPLIB_THERMALCONTROLLER
5744#define ATOM_PP_THERMALCONTROLLER_ADT7473 9 6494#define ATOM_PP_THERMALCONTROLLER_ADT7473 9
5745#define ATOM_PP_THERMALCONTROLLER_EXTERNAL_GPIO 11 6495#define ATOM_PP_THERMALCONTROLLER_EXTERNAL_GPIO 11
5746#define ATOM_PP_THERMALCONTROLLER_EVERGREEN 12 6496#define ATOM_PP_THERMALCONTROLLER_EVERGREEN 12
6497#define ATOM_PP_THERMALCONTROLLER_EMC2103 13 /* 0x0D */ // Only fan control will be implemented, do NOT show this in PPGen.
6498#define ATOM_PP_THERMALCONTROLLER_SUMO 14 /* 0x0E */ // Sumo type, used internally
6499#define ATOM_PP_THERMALCONTROLLER_NISLANDS 15
6500
6501// Thermal controller 'combo type' to use an external controller for Fan control and an internal controller for thermal.
6502// We probably should reserve the bit 0x80 for this use.
6503// 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).
6504// The driver can pick the correct internal controller based on the ASIC.
6505
5747#define ATOM_PP_THERMALCONTROLLER_ADT7473_WITH_INTERNAL 0x89 // ADT7473 Fan Control + Internal Thermal Controller 6506#define ATOM_PP_THERMALCONTROLLER_ADT7473_WITH_INTERNAL 0x89 // ADT7473 Fan Control + Internal Thermal Controller
6507#define ATOM_PP_THERMALCONTROLLER_EMC2103_WITH_INTERNAL 0x8D // EMC2103 Fan Control + Internal Thermal Controller
5748 6508
5749typedef struct _ATOM_PPLIB_STATE 6509typedef struct _ATOM_PPLIB_STATE
5750{ 6510{
@@ -5841,6 +6601,29 @@ typedef struct _ATOM_PPLIB_POWERPLAYTABLE3
5841 USHORT usExtendendedHeaderOffset; 6601 USHORT usExtendendedHeaderOffset;
5842} ATOM_PPLIB_POWERPLAYTABLE3, *LPATOM_PPLIB_POWERPLAYTABLE3; 6602} ATOM_PPLIB_POWERPLAYTABLE3, *LPATOM_PPLIB_POWERPLAYTABLE3;
5843 6603
6604typedef struct _ATOM_PPLIB_POWERPLAYTABLE4
6605{
6606 ATOM_PPLIB_POWERPLAYTABLE3 basicTable3;
6607 ULONG ulGoldenPPID; // PPGen use only
6608 ULONG ulGoldenRevision; // PPGen use only
6609 USHORT usVddcDependencyOnSCLKOffset;
6610 USHORT usVddciDependencyOnMCLKOffset;
6611 USHORT usVddcDependencyOnMCLKOffset;
6612 USHORT usMaxClockVoltageOnDCOffset;
6613 USHORT usReserved[2];
6614} ATOM_PPLIB_POWERPLAYTABLE4, *LPATOM_PPLIB_POWERPLAYTABLE4;
6615
6616typedef struct _ATOM_PPLIB_POWERPLAYTABLE5
6617{
6618 ATOM_PPLIB_POWERPLAYTABLE4 basicTable4;
6619 ULONG ulTDPLimit;
6620 ULONG ulNearTDPLimit;
6621 ULONG ulSQRampingThreshold;
6622 USHORT usCACLeakageTableOffset; // Points to ATOM_PPLIB_CAC_Leakage_Table
6623 ULONG ulCACLeakage; // TBD, this parameter is still under discussion. Change to ulReserved if not needed.
6624 ULONG ulReserved;
6625} ATOM_PPLIB_POWERPLAYTABLE5, *LPATOM_PPLIB_POWERPLAYTABLE5;
6626
5844//// ATOM_PPLIB_NONCLOCK_INFO::usClassification 6627//// ATOM_PPLIB_NONCLOCK_INFO::usClassification
5845#define ATOM_PPLIB_CLASSIFICATION_UI_MASK 0x0007 6628#define ATOM_PPLIB_CLASSIFICATION_UI_MASK 0x0007
5846#define ATOM_PPLIB_CLASSIFICATION_UI_SHIFT 0 6629#define ATOM_PPLIB_CLASSIFICATION_UI_SHIFT 0
@@ -5864,6 +6647,10 @@ typedef struct _ATOM_PPLIB_POWERPLAYTABLE3
5864#define ATOM_PPLIB_CLASSIFICATION_HDSTATE 0x4000 6647#define ATOM_PPLIB_CLASSIFICATION_HDSTATE 0x4000
5865#define ATOM_PPLIB_CLASSIFICATION_SDSTATE 0x8000 6648#define ATOM_PPLIB_CLASSIFICATION_SDSTATE 0x8000
5866 6649
6650//// ATOM_PPLIB_NONCLOCK_INFO::usClassification2
6651#define ATOM_PPLIB_CLASSIFICATION2_LIMITEDPOWERSOURCE_2 0x0001
6652#define ATOM_PPLIB_CLASSIFICATION2_ULV 0x0002
6653
5867//// ATOM_PPLIB_NONCLOCK_INFO::ulCapsAndSettings 6654//// ATOM_PPLIB_NONCLOCK_INFO::ulCapsAndSettings
5868#define ATOM_PPLIB_SINGLE_DISPLAY_ONLY 0x00000001 6655#define ATOM_PPLIB_SINGLE_DISPLAY_ONLY 0x00000001
5869#define ATOM_PPLIB_SUPPORTS_VIDEO_PLAYBACK 0x00000002 6656#define ATOM_PPLIB_SUPPORTS_VIDEO_PLAYBACK 0x00000002
@@ -5896,9 +6683,21 @@ typedef struct _ATOM_PPLIB_POWERPLAYTABLE3
5896#define ATOM_PPLIB_M3ARB_MASK 0x00060000 6683#define ATOM_PPLIB_M3ARB_MASK 0x00060000
5897#define ATOM_PPLIB_M3ARB_SHIFT 17 6684#define ATOM_PPLIB_M3ARB_SHIFT 17
5898 6685
6686#define ATOM_PPLIB_ENABLE_DRR 0x00080000
6687
6688// remaining 16 bits are reserved
6689typedef struct _ATOM_PPLIB_THERMAL_STATE
6690{
6691 UCHAR ucMinTemperature;
6692 UCHAR ucMaxTemperature;
6693 UCHAR ucThermalAction;
6694}ATOM_PPLIB_THERMAL_STATE, *LPATOM_PPLIB_THERMAL_STATE;
6695
5899// Contained in an array starting at the offset 6696// Contained in an array starting at the offset
5900// in ATOM_PPLIB_POWERPLAYTABLE::usNonClockInfoArrayOffset. 6697// in ATOM_PPLIB_POWERPLAYTABLE::usNonClockInfoArrayOffset.
5901// referenced from ATOM_PPLIB_STATE_INFO::ucNonClockStateIndex 6698// referenced from ATOM_PPLIB_STATE_INFO::ucNonClockStateIndex
6699#define ATOM_PPLIB_NONCLOCKINFO_VER1 12
6700#define ATOM_PPLIB_NONCLOCKINFO_VER2 24
5902typedef struct _ATOM_PPLIB_NONCLOCK_INFO 6701typedef struct _ATOM_PPLIB_NONCLOCK_INFO
5903{ 6702{
5904 USHORT usClassification; 6703 USHORT usClassification;
@@ -5906,15 +6705,15 @@ typedef struct _ATOM_PPLIB_NONCLOCK_INFO
5906 UCHAR ucMaxTemperature; 6705 UCHAR ucMaxTemperature;
5907 ULONG ulCapsAndSettings; 6706 ULONG ulCapsAndSettings;
5908 UCHAR ucRequiredPower; 6707 UCHAR ucRequiredPower;
5909 UCHAR ucUnused1[3]; 6708 USHORT usClassification2;
6709 ULONG ulVCLK;
6710 ULONG ulDCLK;
6711 UCHAR ucUnused[5];
5910} ATOM_PPLIB_NONCLOCK_INFO; 6712} ATOM_PPLIB_NONCLOCK_INFO;
5911 6713
5912// Contained in an array starting at the offset 6714// Contained in an array starting at the offset
5913// in ATOM_PPLIB_POWERPLAYTABLE::usClockInfoArrayOffset. 6715// in ATOM_PPLIB_POWERPLAYTABLE::usClockInfoArrayOffset.
5914// referenced from ATOM_PPLIB_STATE::ucClockStateIndices 6716// referenced from ATOM_PPLIB_STATE::ucClockStateIndices
5915#define ATOM_PPLIB_NONCLOCKINFO_VER1 12
5916#define ATOM_PPLIB_NONCLOCKINFO_VER2 24
5917
5918typedef struct _ATOM_PPLIB_R600_CLOCK_INFO 6717typedef struct _ATOM_PPLIB_R600_CLOCK_INFO
5919{ 6718{
5920 USHORT usEngineClockLow; 6719 USHORT usEngineClockLow;
@@ -5985,10 +6784,97 @@ typedef struct _ATOM_PPLIB_RS780_CLOCK_INFO
5985#define ATOM_PPLIB_RS780_HTLINKFREQ_LOW 1 6784#define ATOM_PPLIB_RS780_HTLINKFREQ_LOW 1
5986#define ATOM_PPLIB_RS780_HTLINKFREQ_HIGH 2 6785#define ATOM_PPLIB_RS780_HTLINKFREQ_HIGH 2
5987 6786
6787typedef struct _ATOM_PPLIB_SUMO_CLOCK_INFO{
6788 USHORT usEngineClockLow; //clockfrequency & 0xFFFF. The unit is in 10khz
6789 UCHAR ucEngineClockHigh; //clockfrequency >> 16.
6790 UCHAR vddcIndex; //2-bit vddc index;
6791 UCHAR leakage; //please use 8-bit absolute value, not the 6-bit % value
6792 //please initalize to 0
6793 UCHAR rsv;
6794 //please initalize to 0
6795 USHORT rsv1;
6796 //please initialize to 0s
6797 ULONG rsv2[2];
6798}ATOM_PPLIB_SUMO_CLOCK_INFO;
6799
6800
6801
6802typedef struct _ATOM_PPLIB_STATE_V2
6803{
6804 //number of valid dpm levels in this state; Driver uses it to calculate the whole
6805 //size of the state: sizeof(ATOM_PPLIB_STATE_V2) + (ucNumDPMLevels - 1) * sizeof(UCHAR)
6806 UCHAR ucNumDPMLevels;
6807
6808 //a index to the array of nonClockInfos
6809 UCHAR nonClockInfoIndex;
6810 /**
6811 * Driver will read the first ucNumDPMLevels in this array
6812 */
6813 UCHAR clockInfoIndex[1];
6814} ATOM_PPLIB_STATE_V2;
6815
6816typedef struct StateArray{
6817 //how many states we have
6818 UCHAR ucNumEntries;
6819
6820 ATOM_PPLIB_STATE_V2 states[1];
6821}StateArray;
6822
6823
6824typedef struct ClockInfoArray{
6825 //how many clock levels we have
6826 UCHAR ucNumEntries;
6827
6828 //sizeof(ATOM_PPLIB_SUMO_CLOCK_INFO)
6829 UCHAR ucEntrySize;
6830
6831 //this is for Sumo
6832 ATOM_PPLIB_SUMO_CLOCK_INFO clockInfo[1];
6833}ClockInfoArray;
6834
6835typedef struct NonClockInfoArray{
6836
6837 //how many non-clock levels we have. normally should be same as number of states
6838 UCHAR ucNumEntries;
6839 //sizeof(ATOM_PPLIB_NONCLOCK_INFO)
6840 UCHAR ucEntrySize;
6841
6842 ATOM_PPLIB_NONCLOCK_INFO nonClockInfo[1];
6843}NonClockInfoArray;
6844
6845typedef struct _ATOM_PPLIB_Clock_Voltage_Dependency_Record
6846{
6847 USHORT usClockLow;
6848 UCHAR ucClockHigh;
6849 USHORT usVoltage;
6850}ATOM_PPLIB_Clock_Voltage_Dependency_Record;
6851
6852typedef struct _ATOM_PPLIB_Clock_Voltage_Dependency_Table
6853{
6854 UCHAR ucNumEntries; // Number of entries.
6855 ATOM_PPLIB_Clock_Voltage_Dependency_Record entries[1]; // Dynamically allocate entries.
6856}ATOM_PPLIB_Clock_Voltage_Dependency_Table;
6857
6858typedef struct _ATOM_PPLIB_Clock_Voltage_Limit_Record
6859{
6860 USHORT usSclkLow;
6861 UCHAR ucSclkHigh;
6862 USHORT usMclkLow;
6863 UCHAR ucMclkHigh;
6864 USHORT usVddc;
6865 USHORT usVddci;
6866}ATOM_PPLIB_Clock_Voltage_Limit_Record;
6867
6868typedef struct _ATOM_PPLIB_Clock_Voltage_Limit_Table
6869{
6870 UCHAR ucNumEntries; // Number of entries.
6871 ATOM_PPLIB_Clock_Voltage_Limit_Record entries[1]; // Dynamically allocate entries.
6872}ATOM_PPLIB_Clock_Voltage_Limit_Table;
6873
5988/**************************************************************************/ 6874/**************************************************************************/
5989 6875
5990 6876
5991// Following definitions are for compatiblity issue in different SW components. 6877// Following definitions are for compatibility issue in different SW components.
5992#define ATOM_MASTER_DATA_TABLE_REVISION 0x01 6878#define ATOM_MASTER_DATA_TABLE_REVISION 0x01
5993#define Object_Info Object_Header 6879#define Object_Info Object_Header
5994#define AdjustARB_SEQ MC_InitParameter 6880#define AdjustARB_SEQ MC_InitParameter
diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c
index cd0290f946cf..9541995e4b21 100644
--- a/drivers/gpu/drm/radeon/atombios_crtc.c
+++ b/drivers/gpu/drm/radeon/atombios_crtc.c
@@ -48,29 +48,29 @@ static void atombios_overscan_setup(struct drm_crtc *crtc,
48 48
49 switch (radeon_crtc->rmx_type) { 49 switch (radeon_crtc->rmx_type) {
50 case RMX_CENTER: 50 case RMX_CENTER:
51 args.usOverscanTop = (adjusted_mode->crtc_vdisplay - mode->crtc_vdisplay) / 2; 51 args.usOverscanTop = cpu_to_le16((adjusted_mode->crtc_vdisplay - mode->crtc_vdisplay) / 2);
52 args.usOverscanBottom = (adjusted_mode->crtc_vdisplay - mode->crtc_vdisplay) / 2; 52 args.usOverscanBottom = cpu_to_le16((adjusted_mode->crtc_vdisplay - mode->crtc_vdisplay) / 2);
53 args.usOverscanLeft = (adjusted_mode->crtc_hdisplay - mode->crtc_hdisplay) / 2; 53 args.usOverscanLeft = cpu_to_le16((adjusted_mode->crtc_hdisplay - mode->crtc_hdisplay) / 2);
54 args.usOverscanRight = (adjusted_mode->crtc_hdisplay - mode->crtc_hdisplay) / 2; 54 args.usOverscanRight = cpu_to_le16((adjusted_mode->crtc_hdisplay - mode->crtc_hdisplay) / 2);
55 break; 55 break;
56 case RMX_ASPECT: 56 case RMX_ASPECT:
57 a1 = mode->crtc_vdisplay * adjusted_mode->crtc_hdisplay; 57 a1 = mode->crtc_vdisplay * adjusted_mode->crtc_hdisplay;
58 a2 = adjusted_mode->crtc_vdisplay * mode->crtc_hdisplay; 58 a2 = adjusted_mode->crtc_vdisplay * mode->crtc_hdisplay;
59 59
60 if (a1 > a2) { 60 if (a1 > a2) {
61 args.usOverscanLeft = (adjusted_mode->crtc_hdisplay - (a2 / mode->crtc_vdisplay)) / 2; 61 args.usOverscanLeft = cpu_to_le16((adjusted_mode->crtc_hdisplay - (a2 / mode->crtc_vdisplay)) / 2);
62 args.usOverscanRight = (adjusted_mode->crtc_hdisplay - (a2 / mode->crtc_vdisplay)) / 2; 62 args.usOverscanRight = cpu_to_le16((adjusted_mode->crtc_hdisplay - (a2 / mode->crtc_vdisplay)) / 2);
63 } else if (a2 > a1) { 63 } else if (a2 > a1) {
64 args.usOverscanLeft = (adjusted_mode->crtc_vdisplay - (a1 / mode->crtc_hdisplay)) / 2; 64 args.usOverscanTop = cpu_to_le16((adjusted_mode->crtc_vdisplay - (a1 / mode->crtc_hdisplay)) / 2);
65 args.usOverscanRight = (adjusted_mode->crtc_vdisplay - (a1 / mode->crtc_hdisplay)) / 2; 65 args.usOverscanBottom = cpu_to_le16((adjusted_mode->crtc_vdisplay - (a1 / mode->crtc_hdisplay)) / 2);
66 } 66 }
67 break; 67 break;
68 case RMX_FULL: 68 case RMX_FULL:
69 default: 69 default:
70 args.usOverscanRight = radeon_crtc->h_border; 70 args.usOverscanRight = cpu_to_le16(radeon_crtc->h_border);
71 args.usOverscanLeft = radeon_crtc->h_border; 71 args.usOverscanLeft = cpu_to_le16(radeon_crtc->h_border);
72 args.usOverscanBottom = radeon_crtc->v_border; 72 args.usOverscanBottom = cpu_to_le16(radeon_crtc->v_border);
73 args.usOverscanTop = radeon_crtc->v_border; 73 args.usOverscanTop = cpu_to_le16(radeon_crtc->v_border);
74 break; 74 break;
75 } 75 }
76 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 76 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
@@ -253,7 +253,8 @@ void atombios_crtc_dpms(struct drm_crtc *crtc, int mode)
253 case DRM_MODE_DPMS_SUSPEND: 253 case DRM_MODE_DPMS_SUSPEND:
254 case DRM_MODE_DPMS_OFF: 254 case DRM_MODE_DPMS_OFF:
255 drm_vblank_pre_modeset(dev, radeon_crtc->crtc_id); 255 drm_vblank_pre_modeset(dev, radeon_crtc->crtc_id);
256 atombios_blank_crtc(crtc, ATOM_ENABLE); 256 if (radeon_crtc->enabled)
257 atombios_blank_crtc(crtc, ATOM_ENABLE);
257 if (ASIC_IS_DCE3(rdev)) 258 if (ASIC_IS_DCE3(rdev))
258 atombios_enable_crtc_memreq(crtc, ATOM_DISABLE); 259 atombios_enable_crtc_memreq(crtc, ATOM_DISABLE);
259 atombios_enable_crtc(crtc, ATOM_DISABLE); 260 atombios_enable_crtc(crtc, ATOM_DISABLE);
@@ -398,65 +399,106 @@ static void atombios_disable_ss(struct drm_crtc *crtc)
398 399
399 400
400union atom_enable_ss { 401union atom_enable_ss {
401 ENABLE_LVDS_SS_PARAMETERS legacy; 402 ENABLE_LVDS_SS_PARAMETERS lvds_ss;
403 ENABLE_LVDS_SS_PARAMETERS_V2 lvds_ss_2;
402 ENABLE_SPREAD_SPECTRUM_ON_PPLL_PS_ALLOCATION v1; 404 ENABLE_SPREAD_SPECTRUM_ON_PPLL_PS_ALLOCATION v1;
405 ENABLE_SPREAD_SPECTRUM_ON_PPLL_V2 v2;
406 ENABLE_SPREAD_SPECTRUM_ON_PPLL_V3 v3;
403}; 407};
404 408
405static void atombios_enable_ss(struct drm_crtc *crtc) 409static void atombios_crtc_program_ss(struct drm_crtc *crtc,
410 int enable,
411 int pll_id,
412 struct radeon_atom_ss *ss)
406{ 413{
407 struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
408 struct drm_device *dev = crtc->dev; 414 struct drm_device *dev = crtc->dev;
409 struct radeon_device *rdev = dev->dev_private; 415 struct radeon_device *rdev = dev->dev_private;
410 struct drm_encoder *encoder = NULL;
411 struct radeon_encoder *radeon_encoder = NULL;
412 struct radeon_encoder_atom_dig *dig = NULL;
413 int index = GetIndexIntoMasterTable(COMMAND, EnableSpreadSpectrumOnPPLL); 416 int index = GetIndexIntoMasterTable(COMMAND, EnableSpreadSpectrumOnPPLL);
414 union atom_enable_ss args; 417 union atom_enable_ss args;
415 uint16_t percentage = 0;
416 uint8_t type = 0, step = 0, delay = 0, range = 0;
417 418
418 /* XXX add ss support for DCE4 */ 419 memset(&args, 0, sizeof(args));
419 if (ASIC_IS_DCE4(rdev))
420 return;
421 420
422 list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { 421 if (ASIC_IS_DCE5(rdev)) {
423 if (encoder->crtc == crtc) { 422 args.v3.usSpreadSpectrumAmountFrac = cpu_to_le16(0);
424 radeon_encoder = to_radeon_encoder(encoder); 423 args.v3.ucSpreadSpectrumType = ss->type & ATOM_SS_CENTRE_SPREAD_MODE_MASK;
425 /* only enable spread spectrum on LVDS */ 424 switch (pll_id) {
426 if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) { 425 case ATOM_PPLL1:
427 dig = radeon_encoder->enc_priv; 426 args.v3.ucSpreadSpectrumType |= ATOM_PPLL_SS_TYPE_V3_P1PLL;
428 if (dig && dig->ss) { 427 args.v3.usSpreadSpectrumAmount = cpu_to_le16(ss->amount);
429 percentage = dig->ss->percentage; 428 args.v3.usSpreadSpectrumStep = cpu_to_le16(ss->step);
430 type = dig->ss->type; 429 break;
431 step = dig->ss->step; 430 case ATOM_PPLL2:
432 delay = dig->ss->delay; 431 args.v3.ucSpreadSpectrumType |= ATOM_PPLL_SS_TYPE_V3_P2PLL;
433 range = dig->ss->range; 432 args.v3.usSpreadSpectrumAmount = cpu_to_le16(ss->amount);
434 } else 433 args.v3.usSpreadSpectrumStep = cpu_to_le16(ss->step);
435 return; 434 break;
436 } else 435 case ATOM_DCPLL:
437 return; 436 args.v3.ucSpreadSpectrumType |= ATOM_PPLL_SS_TYPE_V3_DCPLL;
437 args.v3.usSpreadSpectrumAmount = cpu_to_le16(0);
438 args.v3.usSpreadSpectrumStep = cpu_to_le16(0);
438 break; 439 break;
440 case ATOM_PPLL_INVALID:
441 return;
439 } 442 }
440 } 443 args.v3.ucEnable = enable;
441 444 if ((ss->percentage == 0) || (ss->type & ATOM_EXTERNAL_SS_MASK))
442 if (!radeon_encoder) 445 args.v3.ucEnable = ATOM_DISABLE;
443 return; 446 } else if (ASIC_IS_DCE4(rdev)) {
444 447 args.v2.usSpreadSpectrumPercentage = cpu_to_le16(ss->percentage);
445 memset(&args, 0, sizeof(args)); 448 args.v2.ucSpreadSpectrumType = ss->type & ATOM_SS_CENTRE_SPREAD_MODE_MASK;
446 if (ASIC_IS_AVIVO(rdev)) { 449 switch (pll_id) {
447 args.v1.usSpreadSpectrumPercentage = cpu_to_le16(percentage); 450 case ATOM_PPLL1:
448 args.v1.ucSpreadSpectrumType = type; 451 args.v2.ucSpreadSpectrumType |= ATOM_PPLL_SS_TYPE_V2_P1PLL;
449 args.v1.ucSpreadSpectrumStep = step; 452 args.v2.usSpreadSpectrumAmount = cpu_to_le16(ss->amount);
450 args.v1.ucSpreadSpectrumDelay = delay; 453 args.v2.usSpreadSpectrumStep = cpu_to_le16(ss->step);
451 args.v1.ucSpreadSpectrumRange = range; 454 break;
452 args.v1.ucPpll = radeon_crtc->crtc_id ? ATOM_PPLL2 : ATOM_PPLL1; 455 case ATOM_PPLL2:
453 args.v1.ucEnable = ATOM_ENABLE; 456 args.v2.ucSpreadSpectrumType |= ATOM_PPLL_SS_TYPE_V2_P2PLL;
457 args.v2.usSpreadSpectrumAmount = cpu_to_le16(ss->amount);
458 args.v2.usSpreadSpectrumStep = cpu_to_le16(ss->step);
459 break;
460 case ATOM_DCPLL:
461 args.v2.ucSpreadSpectrumType |= ATOM_PPLL_SS_TYPE_V2_DCPLL;
462 args.v2.usSpreadSpectrumAmount = cpu_to_le16(0);
463 args.v2.usSpreadSpectrumStep = cpu_to_le16(0);
464 break;
465 case ATOM_PPLL_INVALID:
466 return;
467 }
468 args.v2.ucEnable = enable;
469 if ((ss->percentage == 0) || (ss->type & ATOM_EXTERNAL_SS_MASK))
470 args.v2.ucEnable = ATOM_DISABLE;
471 } else if (ASIC_IS_DCE3(rdev)) {
472 args.v1.usSpreadSpectrumPercentage = cpu_to_le16(ss->percentage);
473 args.v1.ucSpreadSpectrumType = ss->type & ATOM_SS_CENTRE_SPREAD_MODE_MASK;
474 args.v1.ucSpreadSpectrumStep = ss->step;
475 args.v1.ucSpreadSpectrumDelay = ss->delay;
476 args.v1.ucSpreadSpectrumRange = ss->range;
477 args.v1.ucPpll = pll_id;
478 args.v1.ucEnable = enable;
479 } else if (ASIC_IS_AVIVO(rdev)) {
480 if ((enable == ATOM_DISABLE) || (ss->percentage == 0) ||
481 (ss->type & ATOM_EXTERNAL_SS_MASK)) {
482 atombios_disable_ss(crtc);
483 return;
484 }
485 args.lvds_ss_2.usSpreadSpectrumPercentage = cpu_to_le16(ss->percentage);
486 args.lvds_ss_2.ucSpreadSpectrumType = ss->type & ATOM_SS_CENTRE_SPREAD_MODE_MASK;
487 args.lvds_ss_2.ucSpreadSpectrumStep = ss->step;
488 args.lvds_ss_2.ucSpreadSpectrumDelay = ss->delay;
489 args.lvds_ss_2.ucSpreadSpectrumRange = ss->range;
490 args.lvds_ss_2.ucEnable = enable;
454 } else { 491 } else {
455 args.legacy.usSpreadSpectrumPercentage = cpu_to_le16(percentage); 492 if ((enable == ATOM_DISABLE) || (ss->percentage == 0) ||
456 args.legacy.ucSpreadSpectrumType = type; 493 (ss->type & ATOM_EXTERNAL_SS_MASK)) {
457 args.legacy.ucSpreadSpectrumStepSize_Delay = (step & 3) << 2; 494 atombios_disable_ss(crtc);
458 args.legacy.ucSpreadSpectrumStepSize_Delay |= (delay & 7) << 4; 495 return;
459 args.legacy.ucEnable = ATOM_ENABLE; 496 }
497 args.lvds_ss.usSpreadSpectrumPercentage = cpu_to_le16(ss->percentage);
498 args.lvds_ss.ucSpreadSpectrumType = ss->type & ATOM_SS_CENTRE_SPREAD_MODE_MASK;
499 args.lvds_ss.ucSpreadSpectrumStepSize_Delay = (ss->step & 3) << 2;
500 args.lvds_ss.ucSpreadSpectrumStepSize_Delay |= (ss->delay & 7) << 4;
501 args.lvds_ss.ucEnable = enable;
460 } 502 }
461 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 503 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
462} 504}
@@ -468,12 +510,15 @@ union adjust_pixel_clock {
468 510
469static u32 atombios_adjust_pll(struct drm_crtc *crtc, 511static u32 atombios_adjust_pll(struct drm_crtc *crtc,
470 struct drm_display_mode *mode, 512 struct drm_display_mode *mode,
471 struct radeon_pll *pll) 513 struct radeon_pll *pll,
514 bool ss_enabled,
515 struct radeon_atom_ss *ss)
472{ 516{
473 struct drm_device *dev = crtc->dev; 517 struct drm_device *dev = crtc->dev;
474 struct radeon_device *rdev = dev->dev_private; 518 struct radeon_device *rdev = dev->dev_private;
475 struct drm_encoder *encoder = NULL; 519 struct drm_encoder *encoder = NULL;
476 struct radeon_encoder *radeon_encoder = NULL; 520 struct radeon_encoder *radeon_encoder = NULL;
521 struct drm_connector *connector = NULL;
477 u32 adjusted_clock = mode->clock; 522 u32 adjusted_clock = mode->clock;
478 int encoder_mode = 0; 523 int encoder_mode = 0;
479 u32 dp_clock = mode->clock; 524 u32 dp_clock = mode->clock;
@@ -482,19 +527,6 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc,
482 /* reset the pll flags */ 527 /* reset the pll flags */
483 pll->flags = 0; 528 pll->flags = 0;
484 529
485 /* select the PLL algo */
486 if (ASIC_IS_AVIVO(rdev)) {
487 if (radeon_new_pll == 0)
488 pll->algo = PLL_ALGO_LEGACY;
489 else
490 pll->algo = PLL_ALGO_NEW;
491 } else {
492 if (radeon_new_pll == 1)
493 pll->algo = PLL_ALGO_NEW;
494 else
495 pll->algo = PLL_ALGO_LEGACY;
496 }
497
498 if (ASIC_IS_AVIVO(rdev)) { 530 if (ASIC_IS_AVIVO(rdev)) {
499 if ((rdev->family == CHIP_RS600) || 531 if ((rdev->family == CHIP_RS600) ||
500 (rdev->family == CHIP_RS690) || 532 (rdev->family == CHIP_RS690) ||
@@ -506,6 +538,9 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc,
506 pll->flags |= RADEON_PLL_PREFER_HIGH_FB_DIV; 538 pll->flags |= RADEON_PLL_PREFER_HIGH_FB_DIV;
507 else 539 else
508 pll->flags |= RADEON_PLL_PREFER_LOW_REF_DIV; 540 pll->flags |= RADEON_PLL_PREFER_LOW_REF_DIV;
541
542 if (rdev->family < CHIP_RV770)
543 pll->flags |= RADEON_PLL_PREFER_MINM_OVER_MAXP;
509 } else { 544 } else {
510 pll->flags |= RADEON_PLL_LEGACY; 545 pll->flags |= RADEON_PLL_LEGACY;
511 546
@@ -513,15 +548,17 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc,
513 pll->flags |= RADEON_PLL_PREFER_HIGH_FB_DIV; 548 pll->flags |= RADEON_PLL_PREFER_HIGH_FB_DIV;
514 else 549 else
515 pll->flags |= RADEON_PLL_PREFER_LOW_REF_DIV; 550 pll->flags |= RADEON_PLL_PREFER_LOW_REF_DIV;
516
517 } 551 }
518 552
519 list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { 553 list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
520 if (encoder->crtc == crtc) { 554 if (encoder->crtc == crtc) {
521 radeon_encoder = to_radeon_encoder(encoder); 555 radeon_encoder = to_radeon_encoder(encoder);
556 connector = radeon_get_connector_for_encoder(encoder);
557 if (connector)
558 bpc = connector->display_info.bpc;
522 encoder_mode = atombios_get_encoder_mode(encoder); 559 encoder_mode = atombios_get_encoder_mode(encoder);
523 if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT | ATOM_DEVICE_DFP_SUPPORT)) { 560 if ((radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT | ATOM_DEVICE_DFP_SUPPORT)) ||
524 struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); 561 radeon_encoder_is_dp_bridge(encoder)) {
525 if (connector) { 562 if (connector) {
526 struct radeon_connector *radeon_connector = to_radeon_connector(connector); 563 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
527 struct radeon_connector_atom_dig *dig_connector = 564 struct radeon_connector_atom_dig *dig_connector =
@@ -531,29 +568,26 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc,
531 } 568 }
532 } 569 }
533 570
571 /* use recommended ref_div for ss */
572 if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) {
573 if (ss_enabled) {
574 if (ss->refdiv) {
575 pll->flags |= RADEON_PLL_USE_REF_DIV;
576 pll->reference_div = ss->refdiv;
577 if (ASIC_IS_AVIVO(rdev))
578 pll->flags |= RADEON_PLL_USE_FRAC_FB_DIV;
579 }
580 }
581 }
582
534 if (ASIC_IS_AVIVO(rdev)) { 583 if (ASIC_IS_AVIVO(rdev)) {
535 /* DVO wants 2x pixel clock if the DVO chip is in 12 bit mode */ 584 /* DVO wants 2x pixel clock if the DVO chip is in 12 bit mode */
536 if (radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1) 585 if (radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1)
537 adjusted_clock = mode->clock * 2; 586 adjusted_clock = mode->clock * 2;
538 if (radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT)) { 587 if (radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT))
539 pll->algo = PLL_ALGO_LEGACY;
540 pll->flags |= RADEON_PLL_PREFER_CLOSEST_LOWER; 588 pll->flags |= RADEON_PLL_PREFER_CLOSEST_LOWER;
541 } 589 if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT))
542 /* There is some evidence (often anecdotal) that RV515/RV620 LVDS 590 pll->flags |= RADEON_PLL_IS_LCD;
543 * (on some boards at least) prefers the legacy algo. I'm not
544 * sure whether this should handled generically or on a
545 * case-by-case quirk basis. Both algos should work fine in the
546 * majority of cases.
547 */
548 if ((radeon_encoder->active_device & (ATOM_DEVICE_LCD_SUPPORT)) &&
549 ((rdev->family == CHIP_RV515) ||
550 (rdev->family == CHIP_RV620))) {
551 /* allow the user to overrride just in case */
552 if (radeon_new_pll == 1)
553 pll->algo = PLL_ALGO_NEW;
554 else
555 pll->algo = PLL_ALGO_LEGACY;
556 }
557 } else { 591 } else {
558 if (encoder->encoder_type != DRM_MODE_ENCODER_DAC) 592 if (encoder->encoder_type != DRM_MODE_ENCODER_DAC)
559 pll->flags |= RADEON_PLL_NO_ODD_POST_DIV; 593 pll->flags |= RADEON_PLL_NO_ODD_POST_DIV;
@@ -588,14 +622,9 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc,
588 args.v1.usPixelClock = cpu_to_le16(mode->clock / 10); 622 args.v1.usPixelClock = cpu_to_le16(mode->clock / 10);
589 args.v1.ucTransmitterID = radeon_encoder->encoder_id; 623 args.v1.ucTransmitterID = radeon_encoder->encoder_id;
590 args.v1.ucEncodeMode = encoder_mode; 624 args.v1.ucEncodeMode = encoder_mode;
591 if (encoder_mode == ATOM_ENCODER_MODE_DP) { 625 if (ss_enabled && ss->percentage)
592 /* may want to enable SS on DP eventually */
593 /* args.v1.ucConfig |=
594 ADJUST_DISPLAY_CONFIG_SS_ENABLE;*/
595 } else if (encoder_mode == ATOM_ENCODER_MODE_LVDS) {
596 args.v1.ucConfig |= 626 args.v1.ucConfig |=
597 ADJUST_DISPLAY_CONFIG_SS_ENABLE; 627 ADJUST_DISPLAY_CONFIG_SS_ENABLE;
598 }
599 628
600 atom_execute_table(rdev->mode_info.atom_context, 629 atom_execute_table(rdev->mode_info.atom_context,
601 index, (uint32_t *)&args); 630 index, (uint32_t *)&args);
@@ -606,13 +635,13 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc,
606 args.v3.sInput.ucTransmitterID = radeon_encoder->encoder_id; 635 args.v3.sInput.ucTransmitterID = radeon_encoder->encoder_id;
607 args.v3.sInput.ucEncodeMode = encoder_mode; 636 args.v3.sInput.ucEncodeMode = encoder_mode;
608 args.v3.sInput.ucDispPllConfig = 0; 637 args.v3.sInput.ucDispPllConfig = 0;
609 if (radeon_encoder->devices & (ATOM_DEVICE_DFP_SUPPORT)) { 638 if (ss_enabled && ss->percentage)
639 args.v3.sInput.ucDispPllConfig |=
640 DISPPLL_CONFIG_SS_ENABLE;
641 if (radeon_encoder->devices & (ATOM_DEVICE_DFP_SUPPORT) ||
642 radeon_encoder_is_dp_bridge(encoder)) {
610 struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; 643 struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
611
612 if (encoder_mode == ATOM_ENCODER_MODE_DP) { 644 if (encoder_mode == ATOM_ENCODER_MODE_DP) {
613 /* may want to enable SS on DP/eDP eventually */
614 /*args.v3.sInput.ucDispPllConfig |=
615 DISPPLL_CONFIG_SS_ENABLE;*/
616 args.v3.sInput.ucDispPllConfig |= 645 args.v3.sInput.ucDispPllConfig |=
617 DISPPLL_CONFIG_COHERENT_MODE; 646 DISPPLL_CONFIG_COHERENT_MODE;
618 /* 16200 or 27000 */ 647 /* 16200 or 27000 */
@@ -632,31 +661,33 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc,
632 } 661 }
633 } else if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) { 662 } else if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) {
634 if (encoder_mode == ATOM_ENCODER_MODE_DP) { 663 if (encoder_mode == ATOM_ENCODER_MODE_DP) {
635 /* may want to enable SS on DP/eDP eventually */
636 /*args.v3.sInput.ucDispPllConfig |=
637 DISPPLL_CONFIG_SS_ENABLE;*/
638 args.v3.sInput.ucDispPllConfig |= 664 args.v3.sInput.ucDispPllConfig |=
639 DISPPLL_CONFIG_COHERENT_MODE; 665 DISPPLL_CONFIG_COHERENT_MODE;
640 /* 16200 or 27000 */ 666 /* 16200 or 27000 */
641 args.v3.sInput.usPixelClock = cpu_to_le16(dp_clock / 10); 667 args.v3.sInput.usPixelClock = cpu_to_le16(dp_clock / 10);
642 } else if (encoder_mode == ATOM_ENCODER_MODE_LVDS) { 668 } else if (encoder_mode != ATOM_ENCODER_MODE_LVDS) {
643 /* want to enable SS on LVDS eventually */
644 /*args.v3.sInput.ucDispPllConfig |=
645 DISPPLL_CONFIG_SS_ENABLE;*/
646 } else {
647 if (mode->clock > 165000) 669 if (mode->clock > 165000)
648 args.v3.sInput.ucDispPllConfig |= 670 args.v3.sInput.ucDispPllConfig |=
649 DISPPLL_CONFIG_DUAL_LINK; 671 DISPPLL_CONFIG_DUAL_LINK;
650 } 672 }
651 } 673 }
674 if (radeon_encoder_is_dp_bridge(encoder)) {
675 struct drm_encoder *ext_encoder = radeon_atom_get_external_encoder(encoder);
676 struct radeon_encoder *ext_radeon_encoder = to_radeon_encoder(ext_encoder);
677 args.v3.sInput.ucExtTransmitterID = ext_radeon_encoder->encoder_id;
678 } else
679 args.v3.sInput.ucExtTransmitterID = 0;
680
652 atom_execute_table(rdev->mode_info.atom_context, 681 atom_execute_table(rdev->mode_info.atom_context,
653 index, (uint32_t *)&args); 682 index, (uint32_t *)&args);
654 adjusted_clock = le32_to_cpu(args.v3.sOutput.ulDispPllFreq) * 10; 683 adjusted_clock = le32_to_cpu(args.v3.sOutput.ulDispPllFreq) * 10;
655 if (args.v3.sOutput.ucRefDiv) { 684 if (args.v3.sOutput.ucRefDiv) {
685 pll->flags |= RADEON_PLL_USE_FRAC_FB_DIV;
656 pll->flags |= RADEON_PLL_USE_REF_DIV; 686 pll->flags |= RADEON_PLL_USE_REF_DIV;
657 pll->reference_div = args.v3.sOutput.ucRefDiv; 687 pll->reference_div = args.v3.sOutput.ucRefDiv;
658 } 688 }
659 if (args.v3.sOutput.ucPostDiv) { 689 if (args.v3.sOutput.ucPostDiv) {
690 pll->flags |= RADEON_PLL_USE_FRAC_FB_DIV;
660 pll->flags |= RADEON_PLL_USE_POST_DIV; 691 pll->flags |= RADEON_PLL_USE_POST_DIV;
661 pll->post_div = args.v3.sOutput.ucPostDiv; 692 pll->post_div = args.v3.sOutput.ucPostDiv;
662 } 693 }
@@ -680,9 +711,14 @@ union set_pixel_clock {
680 PIXEL_CLOCK_PARAMETERS_V2 v2; 711 PIXEL_CLOCK_PARAMETERS_V2 v2;
681 PIXEL_CLOCK_PARAMETERS_V3 v3; 712 PIXEL_CLOCK_PARAMETERS_V3 v3;
682 PIXEL_CLOCK_PARAMETERS_V5 v5; 713 PIXEL_CLOCK_PARAMETERS_V5 v5;
714 PIXEL_CLOCK_PARAMETERS_V6 v6;
683}; 715};
684 716
685static void atombios_crtc_set_dcpll(struct drm_crtc *crtc) 717/* on DCE5, make sure the voltage is high enough to support the
718 * required disp clk.
719 */
720static void atombios_crtc_set_dcpll(struct drm_crtc *crtc,
721 u32 dispclk)
686{ 722{
687 struct drm_device *dev = crtc->dev; 723 struct drm_device *dev = crtc->dev;
688 struct radeon_device *rdev = dev->dev_private; 724 struct radeon_device *rdev = dev->dev_private;
@@ -705,9 +741,16 @@ static void atombios_crtc_set_dcpll(struct drm_crtc *crtc)
705 * SetPixelClock provides the dividers 741 * SetPixelClock provides the dividers
706 */ 742 */
707 args.v5.ucCRTC = ATOM_CRTC_INVALID; 743 args.v5.ucCRTC = ATOM_CRTC_INVALID;
708 args.v5.usPixelClock = rdev->clock.default_dispclk; 744 args.v5.usPixelClock = cpu_to_le16(dispclk);
709 args.v5.ucPpll = ATOM_DCPLL; 745 args.v5.ucPpll = ATOM_DCPLL;
710 break; 746 break;
747 case 6:
748 /* if the default dcpll clock is specified,
749 * SetPixelClock provides the dividers
750 */
751 args.v6.ulDispEngClkFreq = cpu_to_le32(dispclk);
752 args.v6.ucPpll = ATOM_DCPLL;
753 break;
711 default: 754 default:
712 DRM_ERROR("Unknown table version %d %d\n", frev, crev); 755 DRM_ERROR("Unknown table version %d %d\n", frev, crev);
713 return; 756 return;
@@ -729,7 +772,10 @@ static void atombios_crtc_program_pll(struct drm_crtc *crtc,
729 u32 ref_div, 772 u32 ref_div,
730 u32 fb_div, 773 u32 fb_div,
731 u32 frac_fb_div, 774 u32 frac_fb_div,
732 u32 post_div) 775 u32 post_div,
776 int bpc,
777 bool ss_enabled,
778 struct radeon_atom_ss *ss)
733{ 779{
734 struct drm_device *dev = crtc->dev; 780 struct drm_device *dev = crtc->dev;
735 struct radeon_device *rdev = dev->dev_private; 781 struct radeon_device *rdev = dev->dev_private;
@@ -776,6 +822,8 @@ static void atombios_crtc_program_pll(struct drm_crtc *crtc,
776 args.v3.ucPostDiv = post_div; 822 args.v3.ucPostDiv = post_div;
777 args.v3.ucPpll = pll_id; 823 args.v3.ucPpll = pll_id;
778 args.v3.ucMiscInfo = (pll_id << 2); 824 args.v3.ucMiscInfo = (pll_id << 2);
825 if (ss_enabled && (ss->type & ATOM_EXTERNAL_SS_MASK))
826 args.v3.ucMiscInfo |= PIXEL_CLOCK_MISC_REF_DIV_SRC;
779 args.v3.ucTransmitterId = encoder_id; 827 args.v3.ucTransmitterId = encoder_id;
780 args.v3.ucEncoderMode = encoder_mode; 828 args.v3.ucEncoderMode = encoder_mode;
781 break; 829 break;
@@ -787,10 +835,50 @@ static void atombios_crtc_program_pll(struct drm_crtc *crtc,
787 args.v5.ulFbDivDecFrac = cpu_to_le32(frac_fb_div * 100000); 835 args.v5.ulFbDivDecFrac = cpu_to_le32(frac_fb_div * 100000);
788 args.v5.ucPostDiv = post_div; 836 args.v5.ucPostDiv = post_div;
789 args.v5.ucMiscInfo = 0; /* HDMI depth, etc. */ 837 args.v5.ucMiscInfo = 0; /* HDMI depth, etc. */
838 if (ss_enabled && (ss->type & ATOM_EXTERNAL_SS_MASK))
839 args.v5.ucMiscInfo |= PIXEL_CLOCK_V5_MISC_REF_DIV_SRC;
840 switch (bpc) {
841 case 8:
842 default:
843 args.v5.ucMiscInfo |= PIXEL_CLOCK_V5_MISC_HDMI_24BPP;
844 break;
845 case 10:
846 args.v5.ucMiscInfo |= PIXEL_CLOCK_V5_MISC_HDMI_30BPP;
847 break;
848 }
790 args.v5.ucTransmitterID = encoder_id; 849 args.v5.ucTransmitterID = encoder_id;
791 args.v5.ucEncoderMode = encoder_mode; 850 args.v5.ucEncoderMode = encoder_mode;
792 args.v5.ucPpll = pll_id; 851 args.v5.ucPpll = pll_id;
793 break; 852 break;
853 case 6:
854 args.v6.ulCrtcPclkFreq.ucCRTC = crtc_id;
855 args.v6.ulCrtcPclkFreq.ulPixelClock = cpu_to_le32(clock / 10);
856 args.v6.ucRefDiv = ref_div;
857 args.v6.usFbDiv = cpu_to_le16(fb_div);
858 args.v6.ulFbDivDecFrac = cpu_to_le32(frac_fb_div * 100000);
859 args.v6.ucPostDiv = post_div;
860 args.v6.ucMiscInfo = 0; /* HDMI depth, etc. */
861 if (ss_enabled && (ss->type & ATOM_EXTERNAL_SS_MASK))
862 args.v6.ucMiscInfo |= PIXEL_CLOCK_V6_MISC_REF_DIV_SRC;
863 switch (bpc) {
864 case 8:
865 default:
866 args.v6.ucMiscInfo |= PIXEL_CLOCK_V6_MISC_HDMI_24BPP;
867 break;
868 case 10:
869 args.v6.ucMiscInfo |= PIXEL_CLOCK_V6_MISC_HDMI_30BPP;
870 break;
871 case 12:
872 args.v6.ucMiscInfo |= PIXEL_CLOCK_V6_MISC_HDMI_36BPP;
873 break;
874 case 16:
875 args.v6.ucMiscInfo |= PIXEL_CLOCK_V6_MISC_HDMI_48BPP;
876 break;
877 }
878 args.v6.ucTransmitterID = encoder_id;
879 args.v6.ucEncoderMode = encoder_mode;
880 args.v6.ucPpll = pll_id;
881 break;
794 default: 882 default:
795 DRM_ERROR("Unknown table version %d %d\n", frev, crev); 883 DRM_ERROR("Unknown table version %d %d\n", frev, crev);
796 return; 884 return;
@@ -816,6 +904,9 @@ static void atombios_crtc_set_pll(struct drm_crtc *crtc, struct drm_display_mode
816 struct radeon_pll *pll; 904 struct radeon_pll *pll;
817 u32 adjusted_clock; 905 u32 adjusted_clock;
818 int encoder_mode = 0; 906 int encoder_mode = 0;
907 struct radeon_atom_ss ss;
908 bool ss_enabled = false;
909 int bpc = 8;
819 910
820 list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { 911 list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
821 if (encoder->crtc == crtc) { 912 if (encoder->crtc == crtc) {
@@ -842,54 +933,166 @@ static void atombios_crtc_set_pll(struct drm_crtc *crtc, struct drm_display_mode
842 break; 933 break;
843 } 934 }
844 935
936 if (radeon_encoder->active_device &
937 (ATOM_DEVICE_LCD_SUPPORT | ATOM_DEVICE_DFP_SUPPORT)) {
938 struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
939 struct drm_connector *connector =
940 radeon_get_connector_for_encoder(encoder);
941 struct radeon_connector *radeon_connector =
942 to_radeon_connector(connector);
943 struct radeon_connector_atom_dig *dig_connector =
944 radeon_connector->con_priv;
945 int dp_clock;
946 bpc = connector->display_info.bpc;
947
948 switch (encoder_mode) {
949 case ATOM_ENCODER_MODE_DP:
950 /* DP/eDP */
951 dp_clock = dig_connector->dp_clock / 10;
952 if (ASIC_IS_DCE4(rdev))
953 ss_enabled =
954 radeon_atombios_get_asic_ss_info(rdev, &ss,
955 ASIC_INTERNAL_SS_ON_DP,
956 dp_clock);
957 else {
958 if (dp_clock == 16200) {
959 ss_enabled =
960 radeon_atombios_get_ppll_ss_info(rdev, &ss,
961 ATOM_DP_SS_ID2);
962 if (!ss_enabled)
963 ss_enabled =
964 radeon_atombios_get_ppll_ss_info(rdev, &ss,
965 ATOM_DP_SS_ID1);
966 } else
967 ss_enabled =
968 radeon_atombios_get_ppll_ss_info(rdev, &ss,
969 ATOM_DP_SS_ID1);
970 }
971 break;
972 case ATOM_ENCODER_MODE_LVDS:
973 if (ASIC_IS_DCE4(rdev))
974 ss_enabled = radeon_atombios_get_asic_ss_info(rdev, &ss,
975 dig->lcd_ss_id,
976 mode->clock / 10);
977 else
978 ss_enabled = radeon_atombios_get_ppll_ss_info(rdev, &ss,
979 dig->lcd_ss_id);
980 break;
981 case ATOM_ENCODER_MODE_DVI:
982 if (ASIC_IS_DCE4(rdev))
983 ss_enabled =
984 radeon_atombios_get_asic_ss_info(rdev, &ss,
985 ASIC_INTERNAL_SS_ON_TMDS,
986 mode->clock / 10);
987 break;
988 case ATOM_ENCODER_MODE_HDMI:
989 if (ASIC_IS_DCE4(rdev))
990 ss_enabled =
991 radeon_atombios_get_asic_ss_info(rdev, &ss,
992 ASIC_INTERNAL_SS_ON_HDMI,
993 mode->clock / 10);
994 break;
995 default:
996 break;
997 }
998 }
999
845 /* adjust pixel clock as needed */ 1000 /* adjust pixel clock as needed */
846 adjusted_clock = atombios_adjust_pll(crtc, mode, pll); 1001 adjusted_clock = atombios_adjust_pll(crtc, mode, pll, ss_enabled, &ss);
1002
1003 if (radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT))
1004 /* TV seems to prefer the legacy algo on some boards */
1005 radeon_compute_pll_legacy(pll, adjusted_clock, &pll_clock, &fb_div, &frac_fb_div,
1006 &ref_div, &post_div);
1007 else if (ASIC_IS_AVIVO(rdev))
1008 radeon_compute_pll_avivo(pll, adjusted_clock, &pll_clock, &fb_div, &frac_fb_div,
1009 &ref_div, &post_div);
1010 else
1011 radeon_compute_pll_legacy(pll, adjusted_clock, &pll_clock, &fb_div, &frac_fb_div,
1012 &ref_div, &post_div);
847 1013
848 radeon_compute_pll(pll, adjusted_clock, &pll_clock, &fb_div, &frac_fb_div, 1014 atombios_crtc_program_ss(crtc, ATOM_DISABLE, radeon_crtc->pll_id, &ss);
849 &ref_div, &post_div);
850 1015
851 atombios_crtc_program_pll(crtc, radeon_crtc->crtc_id, radeon_crtc->pll_id, 1016 atombios_crtc_program_pll(crtc, radeon_crtc->crtc_id, radeon_crtc->pll_id,
852 encoder_mode, radeon_encoder->encoder_id, mode->clock, 1017 encoder_mode, radeon_encoder->encoder_id, mode->clock,
853 ref_div, fb_div, frac_fb_div, post_div); 1018 ref_div, fb_div, frac_fb_div, post_div, bpc, ss_enabled, &ss);
1019
1020 if (ss_enabled) {
1021 /* calculate ss amount and step size */
1022 if (ASIC_IS_DCE4(rdev)) {
1023 u32 step_size;
1024 u32 amount = (((fb_div * 10) + frac_fb_div) * ss.percentage) / 10000;
1025 ss.amount = (amount / 10) & ATOM_PPLL_SS_AMOUNT_V2_FBDIV_MASK;
1026 ss.amount |= ((amount - (amount / 10)) << ATOM_PPLL_SS_AMOUNT_V2_NFRAC_SHIFT) &
1027 ATOM_PPLL_SS_AMOUNT_V2_NFRAC_MASK;
1028 if (ss.type & ATOM_PPLL_SS_TYPE_V2_CENTRE_SPREAD)
1029 step_size = (4 * amount * ref_div * (ss.rate * 2048)) /
1030 (125 * 25 * pll->reference_freq / 100);
1031 else
1032 step_size = (2 * amount * ref_div * (ss.rate * 2048)) /
1033 (125 * 25 * pll->reference_freq / 100);
1034 ss.step = step_size;
1035 }
854 1036
1037 atombios_crtc_program_ss(crtc, ATOM_ENABLE, radeon_crtc->pll_id, &ss);
1038 }
855} 1039}
856 1040
857static int evergreen_crtc_set_base(struct drm_crtc *crtc, int x, int y, 1041static int dce4_crtc_do_set_base(struct drm_crtc *crtc,
858 struct drm_framebuffer *old_fb) 1042 struct drm_framebuffer *fb,
1043 int x, int y, int atomic)
859{ 1044{
860 struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); 1045 struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
861 struct drm_device *dev = crtc->dev; 1046 struct drm_device *dev = crtc->dev;
862 struct radeon_device *rdev = dev->dev_private; 1047 struct radeon_device *rdev = dev->dev_private;
863 struct radeon_framebuffer *radeon_fb; 1048 struct radeon_framebuffer *radeon_fb;
1049 struct drm_framebuffer *target_fb;
864 struct drm_gem_object *obj; 1050 struct drm_gem_object *obj;
865 struct radeon_bo *rbo; 1051 struct radeon_bo *rbo;
866 uint64_t fb_location; 1052 uint64_t fb_location;
867 uint32_t fb_format, fb_pitch_pixels, tiling_flags; 1053 uint32_t fb_format, fb_pitch_pixels, tiling_flags;
1054 u32 fb_swap = EVERGREEN_GRPH_ENDIAN_SWAP(EVERGREEN_GRPH_ENDIAN_NONE);
1055 u32 tmp, viewport_w, viewport_h;
868 int r; 1056 int r;
869 1057
870 /* no fb bound */ 1058 /* no fb bound */
871 if (!crtc->fb) { 1059 if (!atomic && !crtc->fb) {
872 DRM_DEBUG_KMS("No FB bound\n"); 1060 DRM_DEBUG_KMS("No FB bound\n");
873 return 0; 1061 return 0;
874 } 1062 }
875 1063
876 radeon_fb = to_radeon_framebuffer(crtc->fb); 1064 if (atomic) {
1065 radeon_fb = to_radeon_framebuffer(fb);
1066 target_fb = fb;
1067 }
1068 else {
1069 radeon_fb = to_radeon_framebuffer(crtc->fb);
1070 target_fb = crtc->fb;
1071 }
877 1072
878 /* Pin framebuffer & get tilling informations */ 1073 /* If atomic, assume fb object is pinned & idle & fenced and
1074 * just update base pointers
1075 */
879 obj = radeon_fb->obj; 1076 obj = radeon_fb->obj;
880 rbo = obj->driver_private; 1077 rbo = gem_to_radeon_bo(obj);
881 r = radeon_bo_reserve(rbo, false); 1078 r = radeon_bo_reserve(rbo, false);
882 if (unlikely(r != 0)) 1079 if (unlikely(r != 0))
883 return r; 1080 return r;
884 r = radeon_bo_pin(rbo, RADEON_GEM_DOMAIN_VRAM, &fb_location); 1081
885 if (unlikely(r != 0)) { 1082 if (atomic)
886 radeon_bo_unreserve(rbo); 1083 fb_location = radeon_bo_gpu_offset(rbo);
887 return -EINVAL; 1084 else {
1085 r = radeon_bo_pin(rbo, RADEON_GEM_DOMAIN_VRAM, &fb_location);
1086 if (unlikely(r != 0)) {
1087 radeon_bo_unreserve(rbo);
1088 return -EINVAL;
1089 }
888 } 1090 }
1091
889 radeon_bo_get_tiling_flags(rbo, &tiling_flags, NULL); 1092 radeon_bo_get_tiling_flags(rbo, &tiling_flags, NULL);
890 radeon_bo_unreserve(rbo); 1093 radeon_bo_unreserve(rbo);
891 1094
892 switch (crtc->fb->bits_per_pixel) { 1095 switch (target_fb->bits_per_pixel) {
893 case 8: 1096 case 8:
894 fb_format = (EVERGREEN_GRPH_DEPTH(EVERGREEN_GRPH_DEPTH_8BPP) | 1097 fb_format = (EVERGREEN_GRPH_DEPTH(EVERGREEN_GRPH_DEPTH_8BPP) |
895 EVERGREEN_GRPH_FORMAT(EVERGREEN_GRPH_FORMAT_INDEXED)); 1098 EVERGREEN_GRPH_FORMAT(EVERGREEN_GRPH_FORMAT_INDEXED));
@@ -901,15 +1104,21 @@ static int evergreen_crtc_set_base(struct drm_crtc *crtc, int x, int y,
901 case 16: 1104 case 16:
902 fb_format = (EVERGREEN_GRPH_DEPTH(EVERGREEN_GRPH_DEPTH_16BPP) | 1105 fb_format = (EVERGREEN_GRPH_DEPTH(EVERGREEN_GRPH_DEPTH_16BPP) |
903 EVERGREEN_GRPH_FORMAT(EVERGREEN_GRPH_FORMAT_ARGB565)); 1106 EVERGREEN_GRPH_FORMAT(EVERGREEN_GRPH_FORMAT_ARGB565));
1107#ifdef __BIG_ENDIAN
1108 fb_swap = EVERGREEN_GRPH_ENDIAN_SWAP(EVERGREEN_GRPH_ENDIAN_8IN16);
1109#endif
904 break; 1110 break;
905 case 24: 1111 case 24:
906 case 32: 1112 case 32:
907 fb_format = (EVERGREEN_GRPH_DEPTH(EVERGREEN_GRPH_DEPTH_32BPP) | 1113 fb_format = (EVERGREEN_GRPH_DEPTH(EVERGREEN_GRPH_DEPTH_32BPP) |
908 EVERGREEN_GRPH_FORMAT(EVERGREEN_GRPH_FORMAT_ARGB8888)); 1114 EVERGREEN_GRPH_FORMAT(EVERGREEN_GRPH_FORMAT_ARGB8888));
1115#ifdef __BIG_ENDIAN
1116 fb_swap = EVERGREEN_GRPH_ENDIAN_SWAP(EVERGREEN_GRPH_ENDIAN_8IN32);
1117#endif
909 break; 1118 break;
910 default: 1119 default:
911 DRM_ERROR("Unsupported screen depth %d\n", 1120 DRM_ERROR("Unsupported screen depth %d\n",
912 crtc->fb->bits_per_pixel); 1121 target_fb->bits_per_pixel);
913 return -EINVAL; 1122 return -EINVAL;
914 } 1123 }
915 1124
@@ -950,15 +1159,16 @@ static int evergreen_crtc_set_base(struct drm_crtc *crtc, int x, int y,
950 WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset, 1159 WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset,
951 (u32) fb_location & EVERGREEN_GRPH_SURFACE_ADDRESS_MASK); 1160 (u32) fb_location & EVERGREEN_GRPH_SURFACE_ADDRESS_MASK);
952 WREG32(EVERGREEN_GRPH_CONTROL + radeon_crtc->crtc_offset, fb_format); 1161 WREG32(EVERGREEN_GRPH_CONTROL + radeon_crtc->crtc_offset, fb_format);
1162 WREG32(EVERGREEN_GRPH_SWAP_CONTROL + radeon_crtc->crtc_offset, fb_swap);
953 1163
954 WREG32(EVERGREEN_GRPH_SURFACE_OFFSET_X + radeon_crtc->crtc_offset, 0); 1164 WREG32(EVERGREEN_GRPH_SURFACE_OFFSET_X + radeon_crtc->crtc_offset, 0);
955 WREG32(EVERGREEN_GRPH_SURFACE_OFFSET_Y + radeon_crtc->crtc_offset, 0); 1165 WREG32(EVERGREEN_GRPH_SURFACE_OFFSET_Y + radeon_crtc->crtc_offset, 0);
956 WREG32(EVERGREEN_GRPH_X_START + radeon_crtc->crtc_offset, 0); 1166 WREG32(EVERGREEN_GRPH_X_START + radeon_crtc->crtc_offset, 0);
957 WREG32(EVERGREEN_GRPH_Y_START + radeon_crtc->crtc_offset, 0); 1167 WREG32(EVERGREEN_GRPH_Y_START + radeon_crtc->crtc_offset, 0);
958 WREG32(EVERGREEN_GRPH_X_END + radeon_crtc->crtc_offset, crtc->fb->width); 1168 WREG32(EVERGREEN_GRPH_X_END + radeon_crtc->crtc_offset, target_fb->width);
959 WREG32(EVERGREEN_GRPH_Y_END + radeon_crtc->crtc_offset, crtc->fb->height); 1169 WREG32(EVERGREEN_GRPH_Y_END + radeon_crtc->crtc_offset, target_fb->height);
960 1170
961 fb_pitch_pixels = crtc->fb->pitch / (crtc->fb->bits_per_pixel / 8); 1171 fb_pitch_pixels = target_fb->pitch / (target_fb->bits_per_pixel / 8);
962 WREG32(EVERGREEN_GRPH_PITCH + radeon_crtc->crtc_offset, fb_pitch_pixels); 1172 WREG32(EVERGREEN_GRPH_PITCH + radeon_crtc->crtc_offset, fb_pitch_pixels);
963 WREG32(EVERGREEN_GRPH_ENABLE + radeon_crtc->crtc_offset, 1); 1173 WREG32(EVERGREEN_GRPH_ENABLE + radeon_crtc->crtc_offset, 1);
964 1174
@@ -968,18 +1178,23 @@ static int evergreen_crtc_set_base(struct drm_crtc *crtc, int x, int y,
968 y &= ~1; 1178 y &= ~1;
969 WREG32(EVERGREEN_VIEWPORT_START + radeon_crtc->crtc_offset, 1179 WREG32(EVERGREEN_VIEWPORT_START + radeon_crtc->crtc_offset,
970 (x << 16) | y); 1180 (x << 16) | y);
1181 viewport_w = crtc->mode.hdisplay;
1182 viewport_h = (crtc->mode.vdisplay + 1) & ~1;
971 WREG32(EVERGREEN_VIEWPORT_SIZE + radeon_crtc->crtc_offset, 1183 WREG32(EVERGREEN_VIEWPORT_SIZE + radeon_crtc->crtc_offset,
972 (crtc->mode.hdisplay << 16) | crtc->mode.vdisplay); 1184 (viewport_w << 16) | viewport_h);
973 1185
974 if (crtc->mode.flags & DRM_MODE_FLAG_INTERLACE) 1186 /* pageflip setup */
975 WREG32(EVERGREEN_DATA_FORMAT + radeon_crtc->crtc_offset, 1187 /* make sure flip is at vb rather than hb */
976 EVERGREEN_INTERLEAVE_EN); 1188 tmp = RREG32(EVERGREEN_GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset);
977 else 1189 tmp &= ~EVERGREEN_GRPH_SURFACE_UPDATE_H_RETRACE_EN;
978 WREG32(EVERGREEN_DATA_FORMAT + radeon_crtc->crtc_offset, 0); 1190 WREG32(EVERGREEN_GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset, tmp);
1191
1192 /* set pageflip to happen anywhere in vblank interval */
1193 WREG32(EVERGREEN_MASTER_UPDATE_MODE + radeon_crtc->crtc_offset, 0);
979 1194
980 if (old_fb && old_fb != crtc->fb) { 1195 if (!atomic && fb && fb != crtc->fb) {
981 radeon_fb = to_radeon_framebuffer(old_fb); 1196 radeon_fb = to_radeon_framebuffer(fb);
982 rbo = radeon_fb->obj->driver_private; 1197 rbo = gem_to_radeon_bo(radeon_fb->obj);
983 r = radeon_bo_reserve(rbo, false); 1198 r = radeon_bo_reserve(rbo, false);
984 if (unlikely(r != 0)) 1199 if (unlikely(r != 0))
985 return r; 1200 return r;
@@ -993,8 +1208,9 @@ static int evergreen_crtc_set_base(struct drm_crtc *crtc, int x, int y,
993 return 0; 1208 return 0;
994} 1209}
995 1210
996static int avivo_crtc_set_base(struct drm_crtc *crtc, int x, int y, 1211static int avivo_crtc_do_set_base(struct drm_crtc *crtc,
997 struct drm_framebuffer *old_fb) 1212 struct drm_framebuffer *fb,
1213 int x, int y, int atomic)
998{ 1214{
999 struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); 1215 struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
1000 struct drm_device *dev = crtc->dev; 1216 struct drm_device *dev = crtc->dev;
@@ -1002,33 +1218,50 @@ static int avivo_crtc_set_base(struct drm_crtc *crtc, int x, int y,
1002 struct radeon_framebuffer *radeon_fb; 1218 struct radeon_framebuffer *radeon_fb;
1003 struct drm_gem_object *obj; 1219 struct drm_gem_object *obj;
1004 struct radeon_bo *rbo; 1220 struct radeon_bo *rbo;
1221 struct drm_framebuffer *target_fb;
1005 uint64_t fb_location; 1222 uint64_t fb_location;
1006 uint32_t fb_format, fb_pitch_pixels, tiling_flags; 1223 uint32_t fb_format, fb_pitch_pixels, tiling_flags;
1224 u32 fb_swap = R600_D1GRPH_SWAP_ENDIAN_NONE;
1225 u32 tmp, viewport_w, viewport_h;
1007 int r; 1226 int r;
1008 1227
1009 /* no fb bound */ 1228 /* no fb bound */
1010 if (!crtc->fb) { 1229 if (!atomic && !crtc->fb) {
1011 DRM_DEBUG_KMS("No FB bound\n"); 1230 DRM_DEBUG_KMS("No FB bound\n");
1012 return 0; 1231 return 0;
1013 } 1232 }
1014 1233
1015 radeon_fb = to_radeon_framebuffer(crtc->fb); 1234 if (atomic) {
1235 radeon_fb = to_radeon_framebuffer(fb);
1236 target_fb = fb;
1237 }
1238 else {
1239 radeon_fb = to_radeon_framebuffer(crtc->fb);
1240 target_fb = crtc->fb;
1241 }
1016 1242
1017 /* Pin framebuffer & get tilling informations */
1018 obj = radeon_fb->obj; 1243 obj = radeon_fb->obj;
1019 rbo = obj->driver_private; 1244 rbo = gem_to_radeon_bo(obj);
1020 r = radeon_bo_reserve(rbo, false); 1245 r = radeon_bo_reserve(rbo, false);
1021 if (unlikely(r != 0)) 1246 if (unlikely(r != 0))
1022 return r; 1247 return r;
1023 r = radeon_bo_pin(rbo, RADEON_GEM_DOMAIN_VRAM, &fb_location); 1248
1024 if (unlikely(r != 0)) { 1249 /* If atomic, assume fb object is pinned & idle & fenced and
1025 radeon_bo_unreserve(rbo); 1250 * just update base pointers
1026 return -EINVAL; 1251 */
1252 if (atomic)
1253 fb_location = radeon_bo_gpu_offset(rbo);
1254 else {
1255 r = radeon_bo_pin(rbo, RADEON_GEM_DOMAIN_VRAM, &fb_location);
1256 if (unlikely(r != 0)) {
1257 radeon_bo_unreserve(rbo);
1258 return -EINVAL;
1259 }
1027 } 1260 }
1028 radeon_bo_get_tiling_flags(rbo, &tiling_flags, NULL); 1261 radeon_bo_get_tiling_flags(rbo, &tiling_flags, NULL);
1029 radeon_bo_unreserve(rbo); 1262 radeon_bo_unreserve(rbo);
1030 1263
1031 switch (crtc->fb->bits_per_pixel) { 1264 switch (target_fb->bits_per_pixel) {
1032 case 8: 1265 case 8:
1033 fb_format = 1266 fb_format =
1034 AVIVO_D1GRPH_CONTROL_DEPTH_8BPP | 1267 AVIVO_D1GRPH_CONTROL_DEPTH_8BPP |
@@ -1043,16 +1276,22 @@ static int avivo_crtc_set_base(struct drm_crtc *crtc, int x, int y,
1043 fb_format = 1276 fb_format =
1044 AVIVO_D1GRPH_CONTROL_DEPTH_16BPP | 1277 AVIVO_D1GRPH_CONTROL_DEPTH_16BPP |
1045 AVIVO_D1GRPH_CONTROL_16BPP_RGB565; 1278 AVIVO_D1GRPH_CONTROL_16BPP_RGB565;
1279#ifdef __BIG_ENDIAN
1280 fb_swap = R600_D1GRPH_SWAP_ENDIAN_16BIT;
1281#endif
1046 break; 1282 break;
1047 case 24: 1283 case 24:
1048 case 32: 1284 case 32:
1049 fb_format = 1285 fb_format =
1050 AVIVO_D1GRPH_CONTROL_DEPTH_32BPP | 1286 AVIVO_D1GRPH_CONTROL_DEPTH_32BPP |
1051 AVIVO_D1GRPH_CONTROL_32BPP_ARGB8888; 1287 AVIVO_D1GRPH_CONTROL_32BPP_ARGB8888;
1288#ifdef __BIG_ENDIAN
1289 fb_swap = R600_D1GRPH_SWAP_ENDIAN_32BIT;
1290#endif
1052 break; 1291 break;
1053 default: 1292 default:
1054 DRM_ERROR("Unsupported screen depth %d\n", 1293 DRM_ERROR("Unsupported screen depth %d\n",
1055 crtc->fb->bits_per_pixel); 1294 target_fb->bits_per_pixel);
1056 return -EINVAL; 1295 return -EINVAL;
1057 } 1296 }
1058 1297
@@ -1088,15 +1327,17 @@ static int avivo_crtc_set_base(struct drm_crtc *crtc, int x, int y,
1088 WREG32(AVIVO_D1GRPH_SECONDARY_SURFACE_ADDRESS + 1327 WREG32(AVIVO_D1GRPH_SECONDARY_SURFACE_ADDRESS +
1089 radeon_crtc->crtc_offset, (u32) fb_location); 1328 radeon_crtc->crtc_offset, (u32) fb_location);
1090 WREG32(AVIVO_D1GRPH_CONTROL + radeon_crtc->crtc_offset, fb_format); 1329 WREG32(AVIVO_D1GRPH_CONTROL + radeon_crtc->crtc_offset, fb_format);
1330 if (rdev->family >= CHIP_R600)
1331 WREG32(R600_D1GRPH_SWAP_CONTROL + radeon_crtc->crtc_offset, fb_swap);
1091 1332
1092 WREG32(AVIVO_D1GRPH_SURFACE_OFFSET_X + radeon_crtc->crtc_offset, 0); 1333 WREG32(AVIVO_D1GRPH_SURFACE_OFFSET_X + radeon_crtc->crtc_offset, 0);
1093 WREG32(AVIVO_D1GRPH_SURFACE_OFFSET_Y + radeon_crtc->crtc_offset, 0); 1334 WREG32(AVIVO_D1GRPH_SURFACE_OFFSET_Y + radeon_crtc->crtc_offset, 0);
1094 WREG32(AVIVO_D1GRPH_X_START + radeon_crtc->crtc_offset, 0); 1335 WREG32(AVIVO_D1GRPH_X_START + radeon_crtc->crtc_offset, 0);
1095 WREG32(AVIVO_D1GRPH_Y_START + radeon_crtc->crtc_offset, 0); 1336 WREG32(AVIVO_D1GRPH_Y_START + radeon_crtc->crtc_offset, 0);
1096 WREG32(AVIVO_D1GRPH_X_END + radeon_crtc->crtc_offset, crtc->fb->width); 1337 WREG32(AVIVO_D1GRPH_X_END + radeon_crtc->crtc_offset, target_fb->width);
1097 WREG32(AVIVO_D1GRPH_Y_END + radeon_crtc->crtc_offset, crtc->fb->height); 1338 WREG32(AVIVO_D1GRPH_Y_END + radeon_crtc->crtc_offset, target_fb->height);
1098 1339
1099 fb_pitch_pixels = crtc->fb->pitch / (crtc->fb->bits_per_pixel / 8); 1340 fb_pitch_pixels = target_fb->pitch / (target_fb->bits_per_pixel / 8);
1100 WREG32(AVIVO_D1GRPH_PITCH + radeon_crtc->crtc_offset, fb_pitch_pixels); 1341 WREG32(AVIVO_D1GRPH_PITCH + radeon_crtc->crtc_offset, fb_pitch_pixels);
1101 WREG32(AVIVO_D1GRPH_ENABLE + radeon_crtc->crtc_offset, 1); 1342 WREG32(AVIVO_D1GRPH_ENABLE + radeon_crtc->crtc_offset, 1);
1102 1343
@@ -1106,18 +1347,23 @@ static int avivo_crtc_set_base(struct drm_crtc *crtc, int x, int y,
1106 y &= ~1; 1347 y &= ~1;
1107 WREG32(AVIVO_D1MODE_VIEWPORT_START + radeon_crtc->crtc_offset, 1348 WREG32(AVIVO_D1MODE_VIEWPORT_START + radeon_crtc->crtc_offset,
1108 (x << 16) | y); 1349 (x << 16) | y);
1350 viewport_w = crtc->mode.hdisplay;
1351 viewport_h = (crtc->mode.vdisplay + 1) & ~1;
1109 WREG32(AVIVO_D1MODE_VIEWPORT_SIZE + radeon_crtc->crtc_offset, 1352 WREG32(AVIVO_D1MODE_VIEWPORT_SIZE + radeon_crtc->crtc_offset,
1110 (crtc->mode.hdisplay << 16) | crtc->mode.vdisplay); 1353 (viewport_w << 16) | viewport_h);
1111 1354
1112 if (crtc->mode.flags & DRM_MODE_FLAG_INTERLACE) 1355 /* pageflip setup */
1113 WREG32(AVIVO_D1MODE_DATA_FORMAT + radeon_crtc->crtc_offset, 1356 /* make sure flip is at vb rather than hb */
1114 AVIVO_D1MODE_INTERLEAVE_EN); 1357 tmp = RREG32(AVIVO_D1GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset);
1115 else 1358 tmp &= ~AVIVO_D1GRPH_SURFACE_UPDATE_H_RETRACE_EN;
1116 WREG32(AVIVO_D1MODE_DATA_FORMAT + radeon_crtc->crtc_offset, 0); 1359 WREG32(AVIVO_D1GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset, tmp);
1117 1360
1118 if (old_fb && old_fb != crtc->fb) { 1361 /* set pageflip to happen anywhere in vblank interval */
1119 radeon_fb = to_radeon_framebuffer(old_fb); 1362 WREG32(AVIVO_D1MODE_MASTER_UPDATE_MODE + radeon_crtc->crtc_offset, 0);
1120 rbo = radeon_fb->obj->driver_private; 1363
1364 if (!atomic && fb && fb != crtc->fb) {
1365 radeon_fb = to_radeon_framebuffer(fb);
1366 rbo = gem_to_radeon_bo(radeon_fb->obj);
1121 r = radeon_bo_reserve(rbo, false); 1367 r = radeon_bo_reserve(rbo, false);
1122 if (unlikely(r != 0)) 1368 if (unlikely(r != 0))
1123 return r; 1369 return r;
@@ -1138,11 +1384,26 @@ int atombios_crtc_set_base(struct drm_crtc *crtc, int x, int y,
1138 struct radeon_device *rdev = dev->dev_private; 1384 struct radeon_device *rdev = dev->dev_private;
1139 1385
1140 if (ASIC_IS_DCE4(rdev)) 1386 if (ASIC_IS_DCE4(rdev))
1141 return evergreen_crtc_set_base(crtc, x, y, old_fb); 1387 return dce4_crtc_do_set_base(crtc, old_fb, x, y, 0);
1142 else if (ASIC_IS_AVIVO(rdev)) 1388 else if (ASIC_IS_AVIVO(rdev))
1143 return avivo_crtc_set_base(crtc, x, y, old_fb); 1389 return avivo_crtc_do_set_base(crtc, old_fb, x, y, 0);
1144 else 1390 else
1145 return radeon_crtc_set_base(crtc, x, y, old_fb); 1391 return radeon_crtc_do_set_base(crtc, old_fb, x, y, 0);
1392}
1393
1394int atombios_crtc_set_base_atomic(struct drm_crtc *crtc,
1395 struct drm_framebuffer *fb,
1396 int x, int y, enum mode_set_atomic state)
1397{
1398 struct drm_device *dev = crtc->dev;
1399 struct radeon_device *rdev = dev->dev_private;
1400
1401 if (ASIC_IS_DCE4(rdev))
1402 return dce4_crtc_do_set_base(crtc, fb, x, y, 1);
1403 else if (ASIC_IS_AVIVO(rdev))
1404 return avivo_crtc_do_set_base(crtc, fb, x, y, 1);
1405 else
1406 return radeon_crtc_do_set_base(crtc, fb, x, y, 1);
1146} 1407}
1147 1408
1148/* properly set additional regs when using atombios */ 1409/* properly set additional regs when using atombios */
@@ -1179,11 +1440,19 @@ static int radeon_atom_pick_pll(struct drm_crtc *crtc)
1179 uint32_t pll_in_use = 0; 1440 uint32_t pll_in_use = 0;
1180 1441
1181 if (ASIC_IS_DCE4(rdev)) { 1442 if (ASIC_IS_DCE4(rdev)) {
1182 /* if crtc is driving DP and we have an ext clock, use that */
1183 list_for_each_entry(test_encoder, &dev->mode_config.encoder_list, head) { 1443 list_for_each_entry(test_encoder, &dev->mode_config.encoder_list, head) {
1184 if (test_encoder->crtc && (test_encoder->crtc == crtc)) { 1444 if (test_encoder->crtc && (test_encoder->crtc == crtc)) {
1445 /* in DP mode, the DP ref clock can come from PPLL, DCPLL, or ext clock,
1446 * depending on the asic:
1447 * DCE4: PPLL or ext clock
1448 * DCE5: DCPLL or ext clock
1449 *
1450 * Setting ATOM_PPLL_INVALID will cause SetPixelClock to skip
1451 * PPLL/DCPLL programming and only program the DP DTO for the
1452 * crtc virtual pixel clock.
1453 */
1185 if (atombios_get_encoder_mode(test_encoder) == ATOM_ENCODER_MODE_DP) { 1454 if (atombios_get_encoder_mode(test_encoder) == ATOM_ENCODER_MODE_DP) {
1186 if (rdev->clock.dp_extclk) 1455 if (ASIC_IS_DCE5(rdev) || rdev->clock.dp_extclk)
1187 return ATOM_PPLL_INVALID; 1456 return ATOM_PPLL_INVALID;
1188 } 1457 }
1189 } 1458 }
@@ -1230,12 +1499,20 @@ int atombios_crtc_mode_set(struct drm_crtc *crtc,
1230 } 1499 }
1231 } 1500 }
1232 1501
1233 atombios_disable_ss(crtc);
1234 /* always set DCPLL */ 1502 /* always set DCPLL */
1235 if (ASIC_IS_DCE4(rdev)) 1503 if (ASIC_IS_DCE4(rdev)) {
1236 atombios_crtc_set_dcpll(crtc); 1504 struct radeon_atom_ss ss;
1505 bool ss_enabled = radeon_atombios_get_asic_ss_info(rdev, &ss,
1506 ASIC_INTERNAL_SS_ON_DCPLL,
1507 rdev->clock.default_dispclk);
1508 if (ss_enabled)
1509 atombios_crtc_program_ss(crtc, ATOM_DISABLE, ATOM_DCPLL, &ss);
1510 /* XXX: DCE5, make sure voltage, dispclk is high enough */
1511 atombios_crtc_set_dcpll(crtc, rdev->clock.default_dispclk);
1512 if (ss_enabled)
1513 atombios_crtc_program_ss(crtc, ATOM_ENABLE, ATOM_DCPLL, &ss);
1514 }
1237 atombios_crtc_set_pll(crtc, adjusted_mode); 1515 atombios_crtc_set_pll(crtc, adjusted_mode);
1238 atombios_enable_ss(crtc);
1239 1516
1240 if (ASIC_IS_DCE4(rdev)) 1517 if (ASIC_IS_DCE4(rdev))
1241 atombios_set_crtc_dtd_timing(crtc, adjusted_mode); 1518 atombios_set_crtc_dtd_timing(crtc, adjusted_mode);
@@ -1291,6 +1568,8 @@ static void atombios_crtc_commit(struct drm_crtc *crtc)
1291static void atombios_crtc_disable(struct drm_crtc *crtc) 1568static void atombios_crtc_disable(struct drm_crtc *crtc)
1292{ 1569{
1293 struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); 1570 struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
1571 struct radeon_atom_ss ss;
1572
1294 atombios_crtc_dpms(crtc, DRM_MODE_DPMS_OFF); 1573 atombios_crtc_dpms(crtc, DRM_MODE_DPMS_OFF);
1295 1574
1296 switch (radeon_crtc->pll_id) { 1575 switch (radeon_crtc->pll_id) {
@@ -1298,7 +1577,7 @@ static void atombios_crtc_disable(struct drm_crtc *crtc)
1298 case ATOM_PPLL2: 1577 case ATOM_PPLL2:
1299 /* disable the ppll */ 1578 /* disable the ppll */
1300 atombios_crtc_program_pll(crtc, radeon_crtc->crtc_id, radeon_crtc->pll_id, 1579 atombios_crtc_program_pll(crtc, radeon_crtc->crtc_id, radeon_crtc->pll_id,
1301 0, 0, ATOM_DISABLE, 0, 0, 0, 0); 1580 0, 0, ATOM_DISABLE, 0, 0, 0, 0, 0, false, &ss);
1302 break; 1581 break;
1303 default: 1582 default:
1304 break; 1583 break;
@@ -1311,6 +1590,7 @@ static const struct drm_crtc_helper_funcs atombios_helper_funcs = {
1311 .mode_fixup = atombios_crtc_mode_fixup, 1590 .mode_fixup = atombios_crtc_mode_fixup,
1312 .mode_set = atombios_crtc_mode_set, 1591 .mode_set = atombios_crtc_mode_set,
1313 .mode_set_base = atombios_crtc_set_base, 1592 .mode_set_base = atombios_crtc_set_base,
1593 .mode_set_base_atomic = atombios_crtc_set_base_atomic,
1314 .prepare = atombios_crtc_prepare, 1594 .prepare = atombios_crtc_prepare,
1315 .commit = atombios_crtc_commit, 1595 .commit = atombios_crtc_commit,
1316 .load_lut = radeon_crtc_load_lut, 1596 .load_lut = radeon_crtc_load_lut,
diff --git a/drivers/gpu/drm/radeon/atombios_dp.c b/drivers/gpu/drm/radeon/atombios_dp.c
index 4e7778d44b8d..8c0f9e36ff8e 100644
--- a/drivers/gpu/drm/radeon/atombios_dp.c
+++ b/drivers/gpu/drm/radeon/atombios_dp.c
@@ -43,158 +43,242 @@ static char *pre_emph_names[] = {
43 "0dB", "3.5dB", "6dB", "9.5dB" 43 "0dB", "3.5dB", "6dB", "9.5dB"
44}; 44};
45 45
46static const int dp_clocks[] = { 46/***** radeon AUX functions *****/
47 54000, /* 1 lane, 1.62 Ghz */ 47union aux_channel_transaction {
48 90000, /* 1 lane, 2.70 Ghz */ 48 PROCESS_AUX_CHANNEL_TRANSACTION_PS_ALLOCATION v1;
49 108000, /* 2 lane, 1.62 Ghz */ 49 PROCESS_AUX_CHANNEL_TRANSACTION_PARAMETERS_V2 v2;
50 180000, /* 2 lane, 2.70 Ghz */
51 216000, /* 4 lane, 1.62 Ghz */
52 360000, /* 4 lane, 2.70 Ghz */
53}; 50};
54 51
55static const int num_dp_clocks = sizeof(dp_clocks) / sizeof(int); 52static int radeon_process_aux_ch(struct radeon_i2c_chan *chan,
53 u8 *send, int send_bytes,
54 u8 *recv, int recv_size,
55 u8 delay, u8 *ack)
56{
57 struct drm_device *dev = chan->dev;
58 struct radeon_device *rdev = dev->dev_private;
59 union aux_channel_transaction args;
60 int index = GetIndexIntoMasterTable(COMMAND, ProcessAuxChannelTransaction);
61 unsigned char *base;
62 int recv_bytes;
63
64 memset(&args, 0, sizeof(args));
56 65
57/* common helper functions */ 66 base = (unsigned char *)rdev->mode_info.atom_context->scratch;
58static int dp_lanes_for_mode_clock(u8 dpcd[DP_DPCD_SIZE], int mode_clock) 67
68 memcpy(base, send, send_bytes);
69
70 args.v1.lpAuxRequest = 0;
71 args.v1.lpDataOut = 16;
72 args.v1.ucDataOutLen = 0;
73 args.v1.ucChannelID = chan->rec.i2c_id;
74 args.v1.ucDelay = delay / 10;
75 if (ASIC_IS_DCE4(rdev))
76 args.v2.ucHPD_ID = chan->rec.hpd;
77
78 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
79
80 *ack = args.v1.ucReplyStatus;
81
82 /* timeout */
83 if (args.v1.ucReplyStatus == 1) {
84 DRM_DEBUG_KMS("dp_aux_ch timeout\n");
85 return -ETIMEDOUT;
86 }
87
88 /* flags not zero */
89 if (args.v1.ucReplyStatus == 2) {
90 DRM_DEBUG_KMS("dp_aux_ch flags not zero\n");
91 return -EBUSY;
92 }
93
94 /* error */
95 if (args.v1.ucReplyStatus == 3) {
96 DRM_DEBUG_KMS("dp_aux_ch error\n");
97 return -EIO;
98 }
99
100 recv_bytes = args.v1.ucDataOutLen;
101 if (recv_bytes > recv_size)
102 recv_bytes = recv_size;
103
104 if (recv && recv_size)
105 memcpy(recv, base + 16, recv_bytes);
106
107 return recv_bytes;
108}
109
110static int radeon_dp_aux_native_write(struct radeon_connector *radeon_connector,
111 u16 address, u8 *send, u8 send_bytes, u8 delay)
59{ 112{
60 int i; 113 struct radeon_connector_atom_dig *dig_connector = radeon_connector->con_priv;
61 u8 max_link_bw; 114 int ret;
62 u8 max_lane_count; 115 u8 msg[20];
116 int msg_bytes = send_bytes + 4;
117 u8 ack;
63 118
64 if (!dpcd) 119 if (send_bytes > 16)
65 return 0; 120 return -1;
66 121
67 max_link_bw = dpcd[DP_MAX_LINK_RATE]; 122 msg[0] = address;
68 max_lane_count = dpcd[DP_MAX_LANE_COUNT] & DP_MAX_LANE_COUNT_MASK; 123 msg[1] = address >> 8;
124 msg[2] = AUX_NATIVE_WRITE << 4;
125 msg[3] = (msg_bytes << 4) | (send_bytes - 1);
126 memcpy(&msg[4], send, send_bytes);
69 127
70 switch (max_link_bw) { 128 while (1) {
71 case DP_LINK_BW_1_62: 129 ret = radeon_process_aux_ch(dig_connector->dp_i2c_bus,
72 default: 130 msg, msg_bytes, NULL, 0, delay, &ack);
73 for (i = 0; i < num_dp_clocks; i++) { 131 if (ret < 0)
74 if (i % 2) 132 return ret;
75 continue; 133 if ((ack & AUX_NATIVE_REPLY_MASK) == AUX_NATIVE_REPLY_ACK)
76 switch (max_lane_count) { 134 break;
77 case 1: 135 else if ((ack & AUX_NATIVE_REPLY_MASK) == AUX_NATIVE_REPLY_DEFER)
78 if (i > 1) 136 udelay(400);
79 return 0; 137 else
80 break; 138 return -EIO;
81 case 2:
82 if (i > 3)
83 return 0;
84 break;
85 case 4:
86 default:
87 break;
88 }
89 if (dp_clocks[i] > mode_clock) {
90 if (i < 2)
91 return 1;
92 else if (i < 4)
93 return 2;
94 else
95 return 4;
96 }
97 }
98 break;
99 case DP_LINK_BW_2_7:
100 for (i = 0; i < num_dp_clocks; i++) {
101 switch (max_lane_count) {
102 case 1:
103 if (i > 1)
104 return 0;
105 break;
106 case 2:
107 if (i > 3)
108 return 0;
109 break;
110 case 4:
111 default:
112 break;
113 }
114 if (dp_clocks[i] > mode_clock) {
115 if (i < 2)
116 return 1;
117 else if (i < 4)
118 return 2;
119 else
120 return 4;
121 }
122 }
123 break;
124 } 139 }
125 140
126 return 0; 141 return send_bytes;
127} 142}
128 143
129static int dp_link_clock_for_mode_clock(u8 dpcd[DP_DPCD_SIZE], int mode_clock) 144static int radeon_dp_aux_native_read(struct radeon_connector *radeon_connector,
145 u16 address, u8 *recv, int recv_bytes, u8 delay)
130{ 146{
131 int i; 147 struct radeon_connector_atom_dig *dig_connector = radeon_connector->con_priv;
132 u8 max_link_bw; 148 u8 msg[4];
133 u8 max_lane_count; 149 int msg_bytes = 4;
150 u8 ack;
151 int ret;
134 152
135 if (!dpcd) 153 msg[0] = address;
136 return 0; 154 msg[1] = address >> 8;
155 msg[2] = AUX_NATIVE_READ << 4;
156 msg[3] = (msg_bytes << 4) | (recv_bytes - 1);
157
158 while (1) {
159 ret = radeon_process_aux_ch(dig_connector->dp_i2c_bus,
160 msg, msg_bytes, recv, recv_bytes, delay, &ack);
161 if (ret == 0)
162 return -EPROTO;
163 if (ret < 0)
164 return ret;
165 if ((ack & AUX_NATIVE_REPLY_MASK) == AUX_NATIVE_REPLY_ACK)
166 return ret;
167 else if ((ack & AUX_NATIVE_REPLY_MASK) == AUX_NATIVE_REPLY_DEFER)
168 udelay(400);
169 else
170 return -EIO;
171 }
172}
137 173
138 max_link_bw = dpcd[DP_MAX_LINK_RATE]; 174static void radeon_write_dpcd_reg(struct radeon_connector *radeon_connector,
139 max_lane_count = dpcd[DP_MAX_LANE_COUNT] & DP_MAX_LANE_COUNT_MASK; 175 u16 reg, u8 val)
176{
177 radeon_dp_aux_native_write(radeon_connector, reg, &val, 1, 0);
178}
140 179
141 switch (max_link_bw) { 180static u8 radeon_read_dpcd_reg(struct radeon_connector *radeon_connector,
142 case DP_LINK_BW_1_62: 181 u16 reg)
182{
183 u8 val = 0;
184
185 radeon_dp_aux_native_read(radeon_connector, reg, &val, 1, 0);
186
187 return val;
188}
189
190int radeon_dp_i2c_aux_ch(struct i2c_adapter *adapter, int mode,
191 u8 write_byte, u8 *read_byte)
192{
193 struct i2c_algo_dp_aux_data *algo_data = adapter->algo_data;
194 struct radeon_i2c_chan *auxch = (struct radeon_i2c_chan *)adapter;
195 u16 address = algo_data->address;
196 u8 msg[5];
197 u8 reply[2];
198 unsigned retry;
199 int msg_bytes;
200 int reply_bytes = 1;
201 int ret;
202 u8 ack;
203
204 /* Set up the command byte */
205 if (mode & MODE_I2C_READ)
206 msg[2] = AUX_I2C_READ << 4;
207 else
208 msg[2] = AUX_I2C_WRITE << 4;
209
210 if (!(mode & MODE_I2C_STOP))
211 msg[2] |= AUX_I2C_MOT << 4;
212
213 msg[0] = address;
214 msg[1] = address >> 8;
215
216 switch (mode) {
217 case MODE_I2C_WRITE:
218 msg_bytes = 5;
219 msg[3] = msg_bytes << 4;
220 msg[4] = write_byte;
221 break;
222 case MODE_I2C_READ:
223 msg_bytes = 4;
224 msg[3] = msg_bytes << 4;
225 break;
143 default: 226 default:
144 for (i = 0; i < num_dp_clocks; i++) { 227 msg_bytes = 4;
145 if (i % 2) 228 msg[3] = 3 << 4;
146 continue;
147 switch (max_lane_count) {
148 case 1:
149 if (i > 1)
150 return 0;
151 break;
152 case 2:
153 if (i > 3)
154 return 0;
155 break;
156 case 4:
157 default:
158 break;
159 }
160 if (dp_clocks[i] > mode_clock)
161 return 162000;
162 }
163 break; 229 break;
164 case DP_LINK_BW_2_7:
165 for (i = 0; i < num_dp_clocks; i++) {
166 switch (max_lane_count) {
167 case 1:
168 if (i > 1)
169 return 0;
170 break;
171 case 2:
172 if (i > 3)
173 return 0;
174 break;
175 case 4:
176 default:
177 break;
178 }
179 if (dp_clocks[i] > mode_clock)
180 return (i % 2) ? 270000 : 162000;
181 }
182 } 230 }
183 231
184 return 0; 232 for (retry = 0; retry < 4; retry++) {
185} 233 ret = radeon_process_aux_ch(auxch,
234 msg, msg_bytes, reply, reply_bytes, 0, &ack);
235 if (ret < 0) {
236 DRM_DEBUG_KMS("aux_ch failed %d\n", ret);
237 return ret;
238 }
186 239
187int dp_mode_valid(u8 dpcd[DP_DPCD_SIZE], int mode_clock) 240 switch (ack & AUX_NATIVE_REPLY_MASK) {
188{ 241 case AUX_NATIVE_REPLY_ACK:
189 int lanes = dp_lanes_for_mode_clock(dpcd, mode_clock); 242 /* I2C-over-AUX Reply field is only valid
190 int bw = dp_lanes_for_mode_clock(dpcd, mode_clock); 243 * when paired with AUX ACK.
244 */
245 break;
246 case AUX_NATIVE_REPLY_NACK:
247 DRM_DEBUG_KMS("aux_ch native nack\n");
248 return -EREMOTEIO;
249 case AUX_NATIVE_REPLY_DEFER:
250 DRM_DEBUG_KMS("aux_ch native defer\n");
251 udelay(400);
252 continue;
253 default:
254 DRM_ERROR("aux_ch invalid native reply 0x%02x\n", ack);
255 return -EREMOTEIO;
256 }
191 257
192 if ((lanes == 0) || (bw == 0)) 258 switch (ack & AUX_I2C_REPLY_MASK) {
193 return MODE_CLOCK_HIGH; 259 case AUX_I2C_REPLY_ACK:
260 if (mode == MODE_I2C_READ)
261 *read_byte = reply[0];
262 return ret;
263 case AUX_I2C_REPLY_NACK:
264 DRM_DEBUG_KMS("aux_i2c nack\n");
265 return -EREMOTEIO;
266 case AUX_I2C_REPLY_DEFER:
267 DRM_DEBUG_KMS("aux_i2c defer\n");
268 udelay(400);
269 break;
270 default:
271 DRM_ERROR("aux_i2c invalid reply 0x%02x\n", ack);
272 return -EREMOTEIO;
273 }
274 }
194 275
195 return MODE_OK; 276 DRM_ERROR("aux i2c too many retries, giving up\n");
277 return -EREMOTEIO;
196} 278}
197 279
280/***** general DP utility functions *****/
281
198static u8 dp_link_status(u8 link_status[DP_LINK_STATUS_SIZE], int r) 282static u8 dp_link_status(u8 link_status[DP_LINK_STATUS_SIZE], int r)
199{ 283{
200 return link_status[r - DP_LANE0_1_STATUS]; 284 return link_status[r - DP_LANE0_1_STATUS];
@@ -242,7 +326,7 @@ static bool dp_channel_eq_ok(u8 link_status[DP_LINK_STATUS_SIZE],
242 return true; 326 return true;
243} 327}
244 328
245static u8 dp_get_adjust_request_voltage(uint8_t link_status[DP_LINK_STATUS_SIZE], 329static u8 dp_get_adjust_request_voltage(u8 link_status[DP_LINK_STATUS_SIZE],
246 int lane) 330 int lane)
247 331
248{ 332{
@@ -255,7 +339,7 @@ static u8 dp_get_adjust_request_voltage(uint8_t link_status[DP_LINK_STATUS_SIZE]
255 return ((l >> s) & 0x3) << DP_TRAIN_VOLTAGE_SWING_SHIFT; 339 return ((l >> s) & 0x3) << DP_TRAIN_VOLTAGE_SWING_SHIFT;
256} 340}
257 341
258static u8 dp_get_adjust_request_pre_emphasis(uint8_t link_status[DP_LINK_STATUS_SIZE], 342static u8 dp_get_adjust_request_pre_emphasis(u8 link_status[DP_LINK_STATUS_SIZE],
259 int lane) 343 int lane)
260{ 344{
261 int i = DP_ADJUST_REQUEST_LANE0_1 + (lane >> 1); 345 int i = DP_ADJUST_REQUEST_LANE0_1 + (lane >> 1);
@@ -267,22 +351,8 @@ static u8 dp_get_adjust_request_pre_emphasis(uint8_t link_status[DP_LINK_STATUS_
267 return ((l >> s) & 0x3) << DP_TRAIN_PRE_EMPHASIS_SHIFT; 351 return ((l >> s) & 0x3) << DP_TRAIN_PRE_EMPHASIS_SHIFT;
268} 352}
269 353
270/* XXX fix me -- chip specific */
271#define DP_VOLTAGE_MAX DP_TRAIN_VOLTAGE_SWING_1200 354#define DP_VOLTAGE_MAX DP_TRAIN_VOLTAGE_SWING_1200
272static u8 dp_pre_emphasis_max(u8 voltage_swing) 355#define DP_PRE_EMPHASIS_MAX DP_TRAIN_PRE_EMPHASIS_9_5
273{
274 switch (voltage_swing & DP_TRAIN_VOLTAGE_SWING_MASK) {
275 case DP_TRAIN_VOLTAGE_SWING_400:
276 return DP_TRAIN_PRE_EMPHASIS_6;
277 case DP_TRAIN_VOLTAGE_SWING_600:
278 return DP_TRAIN_PRE_EMPHASIS_6;
279 case DP_TRAIN_VOLTAGE_SWING_800:
280 return DP_TRAIN_PRE_EMPHASIS_3_5;
281 case DP_TRAIN_VOLTAGE_SWING_1200:
282 default:
283 return DP_TRAIN_PRE_EMPHASIS_0;
284 }
285}
286 356
287static void dp_get_adjust_train(u8 link_status[DP_LINK_STATUS_SIZE], 357static void dp_get_adjust_train(u8 link_status[DP_LINK_STATUS_SIZE],
288 int lane_count, 358 int lane_count,
@@ -308,10 +378,10 @@ static void dp_get_adjust_train(u8 link_status[DP_LINK_STATUS_SIZE],
308 } 378 }
309 379
310 if (v >= DP_VOLTAGE_MAX) 380 if (v >= DP_VOLTAGE_MAX)
311 v = DP_VOLTAGE_MAX | DP_TRAIN_MAX_SWING_REACHED; 381 v |= DP_TRAIN_MAX_SWING_REACHED;
312 382
313 if (p >= dp_pre_emphasis_max(v)) 383 if (p >= DP_PRE_EMPHASIS_MAX)
314 p = dp_pre_emphasis_max(v) | DP_TRAIN_MAX_PRE_EMPHASIS_REACHED; 384 p |= DP_TRAIN_MAX_PRE_EMPHASIS_REACHED;
315 385
316 DRM_DEBUG_KMS("using signal parameters: voltage %s pre_emph %s\n", 386 DRM_DEBUG_KMS("using signal parameters: voltage %s pre_emph %s\n",
317 voltage_names[(v & DP_TRAIN_VOLTAGE_SWING_MASK) >> DP_TRAIN_VOLTAGE_SWING_SHIFT], 387 voltage_names[(v & DP_TRAIN_VOLTAGE_SWING_MASK) >> DP_TRAIN_VOLTAGE_SWING_SHIFT],
@@ -321,110 +391,109 @@ static void dp_get_adjust_train(u8 link_status[DP_LINK_STATUS_SIZE],
321 train_set[lane] = v | p; 391 train_set[lane] = v | p;
322} 392}
323 393
324union aux_channel_transaction { 394/* convert bits per color to bits per pixel */
325 PROCESS_AUX_CHANNEL_TRANSACTION_PS_ALLOCATION v1; 395/* get bpc from the EDID */
326 PROCESS_AUX_CHANNEL_TRANSACTION_PARAMETERS_V2 v2; 396static int convert_bpc_to_bpp(int bpc)
327};
328
329/* radeon aux chan functions */
330bool radeon_process_aux_ch(struct radeon_i2c_chan *chan, u8 *req_bytes,
331 int num_bytes, u8 *read_byte,
332 u8 read_buf_len, u8 delay)
333{ 397{
334 struct drm_device *dev = chan->dev; 398 if (bpc == 0)
335 struct radeon_device *rdev = dev->dev_private; 399 return 24;
336 union aux_channel_transaction args; 400 else
337 int index = GetIndexIntoMasterTable(COMMAND, ProcessAuxChannelTransaction); 401 return bpc * 3;
338 unsigned char *base; 402}
339 int retry_count = 0;
340
341 memset(&args, 0, sizeof(args));
342
343 base = (unsigned char *)rdev->mode_info.atom_context->scratch;
344
345retry:
346 memcpy(base, req_bytes, num_bytes);
347
348 args.v1.lpAuxRequest = 0;
349 args.v1.lpDataOut = 16;
350 args.v1.ucDataOutLen = 0;
351 args.v1.ucChannelID = chan->rec.i2c_id;
352 args.v1.ucDelay = delay / 10;
353 if (ASIC_IS_DCE4(rdev))
354 args.v2.ucHPD_ID = chan->rec.hpd;
355 403
356 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 404/* get the max pix clock supported by the link rate and lane num */
405static int dp_get_max_dp_pix_clock(int link_rate,
406 int lane_num,
407 int bpp)
408{
409 return (link_rate * lane_num * 8) / bpp;
410}
357 411
358 if (args.v1.ucReplyStatus && !args.v1.ucDataOutLen) { 412static int dp_get_max_link_rate(u8 dpcd[DP_DPCD_SIZE])
359 if (args.v1.ucReplyStatus == 0x20 && retry_count++ < 10) 413{
360 goto retry; 414 switch (dpcd[DP_MAX_LINK_RATE]) {
361 DRM_DEBUG_KMS("failed to get auxch %02x%02x %02x %02x 0x%02x %02x after %d retries\n", 415 case DP_LINK_BW_1_62:
362 req_bytes[1], req_bytes[0], req_bytes[2], req_bytes[3], 416 default:
363 chan->rec.i2c_id, args.v1.ucReplyStatus, retry_count); 417 return 162000;
364 return false; 418 case DP_LINK_BW_2_7:
419 return 270000;
420 case DP_LINK_BW_5_4:
421 return 540000;
365 } 422 }
423}
366 424
367 if (args.v1.ucDataOutLen && read_byte && read_buf_len) { 425static u8 dp_get_max_lane_number(u8 dpcd[DP_DPCD_SIZE])
368 if (read_buf_len < args.v1.ucDataOutLen) { 426{
369 DRM_ERROR("Buffer to small for return answer %d %d\n", 427 return dpcd[DP_MAX_LANE_COUNT] & DP_MAX_LANE_COUNT_MASK;
370 read_buf_len, args.v1.ucDataOutLen);
371 return false;
372 }
373 {
374 int len = min(read_buf_len, args.v1.ucDataOutLen);
375 memcpy(read_byte, base + 16, len);
376 }
377 }
378 return true;
379} 428}
380 429
381bool radeon_dp_aux_native_write(struct radeon_connector *radeon_connector, uint16_t address, 430static u8 dp_get_dp_link_rate_coded(int link_rate)
382 uint8_t send_bytes, uint8_t *send)
383{ 431{
384 struct radeon_connector_atom_dig *dig_connector = radeon_connector->con_priv; 432 switch (link_rate) {
385 u8 msg[20]; 433 case 162000:
386 u8 msg_len, dp_msg_len; 434 default:
387 bool ret; 435 return DP_LINK_BW_1_62;
436 case 270000:
437 return DP_LINK_BW_2_7;
438 case 540000:
439 return DP_LINK_BW_5_4;
440 }
441}
388 442
389 dp_msg_len = 4; 443/***** radeon specific DP functions *****/
390 msg[0] = address;
391 msg[1] = address >> 8;
392 msg[2] = AUX_NATIVE_WRITE << 4;
393 dp_msg_len += send_bytes;
394 msg[3] = (dp_msg_len << 4) | (send_bytes - 1);
395 444
396 if (send_bytes > 16) 445/* First get the min lane# when low rate is used according to pixel clock
397 return false; 446 * (prefer low rate), second check max lane# supported by DP panel,
447 * if the max lane# < low rate lane# then use max lane# instead.
448 */
449static int radeon_dp_get_dp_lane_number(struct drm_connector *connector,
450 u8 dpcd[DP_DPCD_SIZE],
451 int pix_clock)
452{
453 int bpp = convert_bpc_to_bpp(connector->display_info.bpc);
454 int max_link_rate = dp_get_max_link_rate(dpcd);
455 int max_lane_num = dp_get_max_lane_number(dpcd);
456 int lane_num;
457 int max_dp_pix_clock;
458
459 for (lane_num = 1; lane_num < max_lane_num; lane_num <<= 1) {
460 max_dp_pix_clock = dp_get_max_dp_pix_clock(max_link_rate, lane_num, bpp);
461 if (pix_clock <= max_dp_pix_clock)
462 break;
463 }
398 464
399 memcpy(&msg[4], send, send_bytes); 465 return lane_num;
400 msg_len = 4 + send_bytes;
401 ret = radeon_process_aux_ch(dig_connector->dp_i2c_bus, msg, msg_len, NULL, 0, 0);
402 return ret;
403} 466}
404 467
405bool radeon_dp_aux_native_read(struct radeon_connector *radeon_connector, uint16_t address, 468static int radeon_dp_get_dp_link_clock(struct drm_connector *connector,
406 uint8_t delay, uint8_t expected_bytes, 469 u8 dpcd[DP_DPCD_SIZE],
407 uint8_t *read_p) 470 int pix_clock)
408{ 471{
409 struct radeon_connector_atom_dig *dig_connector = radeon_connector->con_priv; 472 int bpp = convert_bpc_to_bpp(connector->display_info.bpc);
410 u8 msg[20]; 473 int lane_num, max_pix_clock;
411 u8 msg_len, dp_msg_len; 474
412 bool ret = false; 475 if (radeon_connector_encoder_is_dp_bridge(connector))
413 msg_len = 4; 476 return 270000;
414 dp_msg_len = 4; 477
415 msg[0] = address; 478 lane_num = radeon_dp_get_dp_lane_number(connector, dpcd, pix_clock);
416 msg[1] = address >> 8; 479 max_pix_clock = dp_get_max_dp_pix_clock(162000, lane_num, bpp);
417 msg[2] = AUX_NATIVE_READ << 4; 480 if (pix_clock <= max_pix_clock)
418 msg[3] = (dp_msg_len) << 4; 481 return 162000;
419 msg[3] |= expected_bytes - 1; 482 max_pix_clock = dp_get_max_dp_pix_clock(270000, lane_num, bpp);
483 if (pix_clock <= max_pix_clock)
484 return 270000;
485 if (radeon_connector_is_dp12_capable(connector)) {
486 max_pix_clock = dp_get_max_dp_pix_clock(540000, lane_num, bpp);
487 if (pix_clock <= max_pix_clock)
488 return 540000;
489 }
420 490
421 ret = radeon_process_aux_ch(dig_connector->dp_i2c_bus, msg, msg_len, read_p, expected_bytes, delay); 491 return dp_get_max_link_rate(dpcd);
422 return ret;
423} 492}
424 493
425/* radeon dp functions */ 494static u8 radeon_dp_encoder_service(struct radeon_device *rdev,
426static u8 radeon_dp_encoder_service(struct radeon_device *rdev, int action, int dp_clock, 495 int action, int dp_clock,
427 uint8_t ucconfig, uint8_t lane_num) 496 u8 ucconfig, u8 lane_num)
428{ 497{
429 DP_ENCODER_SERVICE_PARAMETERS args; 498 DP_ENCODER_SERVICE_PARAMETERS args;
430 int index = GetIndexIntoMasterTable(COMMAND, DPEncoderService); 499 int index = GetIndexIntoMasterTable(COMMAND, DPEncoderService);
@@ -454,60 +523,86 @@ bool radeon_dp_getdpcd(struct radeon_connector *radeon_connector)
454{ 523{
455 struct radeon_connector_atom_dig *dig_connector = radeon_connector->con_priv; 524 struct radeon_connector_atom_dig *dig_connector = radeon_connector->con_priv;
456 u8 msg[25]; 525 u8 msg[25];
457 int ret; 526 int ret, i;
458 527
459 ret = radeon_dp_aux_native_read(radeon_connector, DP_DPCD_REV, 0, 8, msg); 528 ret = radeon_dp_aux_native_read(radeon_connector, DP_DPCD_REV, msg, 8, 0);
460 if (ret) { 529 if (ret > 0) {
461 memcpy(dig_connector->dpcd, msg, 8); 530 memcpy(dig_connector->dpcd, msg, 8);
462 { 531 DRM_DEBUG_KMS("DPCD: ");
463 int i; 532 for (i = 0; i < 8; i++)
464 DRM_DEBUG_KMS("DPCD: "); 533 DRM_DEBUG_KMS("%02x ", msg[i]);
465 for (i = 0; i < 8; i++) 534 DRM_DEBUG_KMS("\n");
466 DRM_DEBUG_KMS("%02x ", msg[i]);
467 DRM_DEBUG_KMS("\n");
468 }
469 return true; 535 return true;
470 } 536 }
471 dig_connector->dpcd[0] = 0; 537 dig_connector->dpcd[0] = 0;
472 return false; 538 return false;
473} 539}
474 540
541static void radeon_dp_set_panel_mode(struct drm_encoder *encoder,
542 struct drm_connector *connector)
543{
544 struct drm_device *dev = encoder->dev;
545 struct radeon_device *rdev = dev->dev_private;
546 int panel_mode = DP_PANEL_MODE_EXTERNAL_DP_MODE;
547
548 if (!ASIC_IS_DCE4(rdev))
549 return;
550
551 if (radeon_connector_encoder_is_dp_bridge(connector))
552 panel_mode = DP_PANEL_MODE_INTERNAL_DP1_MODE;
553
554 atombios_dig_encoder_setup(encoder,
555 ATOM_ENCODER_CMD_SETUP_PANEL_MODE,
556 panel_mode);
557}
558
475void radeon_dp_set_link_config(struct drm_connector *connector, 559void radeon_dp_set_link_config(struct drm_connector *connector,
476 struct drm_display_mode *mode) 560 struct drm_display_mode *mode)
477{ 561{
478 struct radeon_connector *radeon_connector; 562 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
479 struct radeon_connector_atom_dig *dig_connector; 563 struct radeon_connector_atom_dig *dig_connector;
480 564
481 if ((connector->connector_type != DRM_MODE_CONNECTOR_DisplayPort) &&
482 (connector->connector_type != DRM_MODE_CONNECTOR_eDP))
483 return;
484
485 radeon_connector = to_radeon_connector(connector);
486 if (!radeon_connector->con_priv) 565 if (!radeon_connector->con_priv)
487 return; 566 return;
488 dig_connector = radeon_connector->con_priv; 567 dig_connector = radeon_connector->con_priv;
489 568
490 dig_connector->dp_clock = 569 if ((dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) ||
491 dp_link_clock_for_mode_clock(dig_connector->dpcd, mode->clock); 570 (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP)) {
492 dig_connector->dp_lane_count = 571 dig_connector->dp_clock =
493 dp_lanes_for_mode_clock(dig_connector->dpcd, mode->clock); 572 radeon_dp_get_dp_link_clock(connector, dig_connector->dpcd, mode->clock);
573 dig_connector->dp_lane_count =
574 radeon_dp_get_dp_lane_number(connector, dig_connector->dpcd, mode->clock);
575 }
494} 576}
495 577
496int radeon_dp_mode_valid_helper(struct radeon_connector *radeon_connector, 578int radeon_dp_mode_valid_helper(struct drm_connector *connector,
497 struct drm_display_mode *mode) 579 struct drm_display_mode *mode)
498{ 580{
499 struct radeon_connector_atom_dig *dig_connector = radeon_connector->con_priv; 581 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
582 struct radeon_connector_atom_dig *dig_connector;
583 int dp_clock;
584
585 if (!radeon_connector->con_priv)
586 return MODE_CLOCK_HIGH;
587 dig_connector = radeon_connector->con_priv;
588
589 dp_clock =
590 radeon_dp_get_dp_link_clock(connector, dig_connector->dpcd, mode->clock);
591
592 if ((dp_clock == 540000) &&
593 (!radeon_connector_is_dp12_capable(connector)))
594 return MODE_CLOCK_HIGH;
500 595
501 return dp_mode_valid(dig_connector->dpcd, mode->clock); 596 return MODE_OK;
502} 597}
503 598
504static bool atom_dp_get_link_status(struct radeon_connector *radeon_connector, 599static bool radeon_dp_get_link_status(struct radeon_connector *radeon_connector,
505 u8 link_status[DP_LINK_STATUS_SIZE]) 600 u8 link_status[DP_LINK_STATUS_SIZE])
506{ 601{
507 int ret; 602 int ret;
508 ret = radeon_dp_aux_native_read(radeon_connector, DP_LANE0_1_STATUS, 100, 603 ret = radeon_dp_aux_native_read(radeon_connector, DP_LANE0_1_STATUS,
509 DP_LINK_STATUS_SIZE, link_status); 604 link_status, DP_LINK_STATUS_SIZE, 100);
510 if (!ret) { 605 if (ret <= 0) {
511 DRM_ERROR("displayport link status failed\n"); 606 DRM_ERROR("displayport link status failed\n");
512 return false; 607 return false;
513 } 608 }
@@ -518,292 +613,309 @@ static bool atom_dp_get_link_status(struct radeon_connector *radeon_connector,
518 return true; 613 return true;
519} 614}
520 615
521bool radeon_dp_needs_link_train(struct radeon_connector *radeon_connector) 616struct radeon_dp_link_train_info {
522{ 617 struct radeon_device *rdev;
523 struct radeon_connector_atom_dig *dig_connector = radeon_connector->con_priv; 618 struct drm_encoder *encoder;
619 struct drm_connector *connector;
620 struct radeon_connector *radeon_connector;
621 int enc_id;
622 int dp_clock;
623 int dp_lane_count;
624 int rd_interval;
625 bool tp3_supported;
626 u8 dpcd[8];
627 u8 train_set[4];
524 u8 link_status[DP_LINK_STATUS_SIZE]; 628 u8 link_status[DP_LINK_STATUS_SIZE];
629 u8 tries;
630};
525 631
526 if (!atom_dp_get_link_status(radeon_connector, link_status)) 632static void radeon_dp_update_vs_emph(struct radeon_dp_link_train_info *dp_info)
527 return false; 633{
528 if (dp_channel_eq_ok(link_status, dig_connector->dp_lane_count)) 634 /* set the initial vs/emph on the source */
529 return false; 635 atombios_dig_transmitter_setup(dp_info->encoder,
530 return true; 636 ATOM_TRANSMITTER_ACTION_SETUP_VSEMPH,
637 0, dp_info->train_set[0]); /* sets all lanes at once */
638
639 /* set the vs/emph on the sink */
640 radeon_dp_aux_native_write(dp_info->radeon_connector, DP_TRAINING_LANE0_SET,
641 dp_info->train_set, dp_info->dp_lane_count, 0);
531} 642}
532 643
533static void dp_set_power(struct radeon_connector *radeon_connector, u8 power_state) 644static void radeon_dp_set_tp(struct radeon_dp_link_train_info *dp_info, int tp)
534{ 645{
535 struct radeon_connector_atom_dig *dig_connector = radeon_connector->con_priv; 646 int rtp = 0;
536 647
537 if (dig_connector->dpcd[0] >= 0x11) { 648 /* set training pattern on the source */
538 radeon_dp_aux_native_write(radeon_connector, DP_SET_POWER, 1, 649 if (ASIC_IS_DCE4(dp_info->rdev)) {
539 &power_state); 650 switch (tp) {
651 case DP_TRAINING_PATTERN_1:
652 rtp = ATOM_ENCODER_CMD_DP_LINK_TRAINING_PATTERN1;
653 break;
654 case DP_TRAINING_PATTERN_2:
655 rtp = ATOM_ENCODER_CMD_DP_LINK_TRAINING_PATTERN2;
656 break;
657 case DP_TRAINING_PATTERN_3:
658 rtp = ATOM_ENCODER_CMD_DP_LINK_TRAINING_PATTERN3;
659 break;
660 }
661 atombios_dig_encoder_setup(dp_info->encoder, rtp, 0);
662 } else {
663 switch (tp) {
664 case DP_TRAINING_PATTERN_1:
665 rtp = 0;
666 break;
667 case DP_TRAINING_PATTERN_2:
668 rtp = 1;
669 break;
670 }
671 radeon_dp_encoder_service(dp_info->rdev, ATOM_DP_ACTION_TRAINING_PATTERN_SEL,
672 dp_info->dp_clock, dp_info->enc_id, rtp);
540 } 673 }
541}
542 674
543static void dp_set_downspread(struct radeon_connector *radeon_connector, u8 downspread) 675 /* enable training pattern on the sink */
544{ 676 radeon_write_dpcd_reg(dp_info->radeon_connector, DP_TRAINING_PATTERN_SET, tp);
545 radeon_dp_aux_native_write(radeon_connector, DP_DOWNSPREAD_CTRL, 1,
546 &downspread);
547} 677}
548 678
549static void dp_set_link_bw_lanes(struct radeon_connector *radeon_connector, 679static int radeon_dp_link_train_init(struct radeon_dp_link_train_info *dp_info)
550 u8 link_configuration[DP_LINK_CONFIGURATION_SIZE])
551{ 680{
552 radeon_dp_aux_native_write(radeon_connector, DP_LINK_BW_SET, 2, 681 u8 tmp;
553 link_configuration);
554}
555 682
556static void dp_update_dpvs_emph(struct radeon_connector *radeon_connector, 683 /* power up the sink */
557 struct drm_encoder *encoder, 684 if (dp_info->dpcd[0] >= 0x11)
558 u8 train_set[4]) 685 radeon_write_dpcd_reg(dp_info->radeon_connector,
559{ 686 DP_SET_POWER, DP_SET_POWER_D0);
560 struct radeon_connector_atom_dig *dig_connector = radeon_connector->con_priv; 687
561 int i; 688 /* possibly enable downspread on the sink */
689 if (dp_info->dpcd[3] & 0x1)
690 radeon_write_dpcd_reg(dp_info->radeon_connector,
691 DP_DOWNSPREAD_CTRL, DP_SPREAD_AMP_0_5);
692 else
693 radeon_write_dpcd_reg(dp_info->radeon_connector,
694 DP_DOWNSPREAD_CTRL, 0);
562 695
563 for (i = 0; i < dig_connector->dp_lane_count; i++) 696 radeon_dp_set_panel_mode(dp_info->encoder, dp_info->connector);
564 atombios_dig_transmitter_setup(encoder,
565 ATOM_TRANSMITTER_ACTION_SETUP_VSEMPH,
566 i, train_set[i]);
567 697
568 radeon_dp_aux_native_write(radeon_connector, DP_TRAINING_LANE0_SET, 698 /* set the lane count on the sink */
569 dig_connector->dp_lane_count, train_set); 699 tmp = dp_info->dp_lane_count;
570} 700 if (dp_info->dpcd[0] >= 0x11)
701 tmp |= DP_LANE_COUNT_ENHANCED_FRAME_EN;
702 radeon_write_dpcd_reg(dp_info->radeon_connector, DP_LANE_COUNT_SET, tmp);
571 703
572static void dp_set_training(struct radeon_connector *radeon_connector, 704 /* set the link rate on the sink */
573 u8 training) 705 tmp = dp_get_dp_link_rate_coded(dp_info->dp_clock);
574{ 706 radeon_write_dpcd_reg(dp_info->radeon_connector, DP_LINK_BW_SET, tmp);
575 radeon_dp_aux_native_write(radeon_connector, DP_TRAINING_PATTERN_SET,
576 1, &training);
577}
578 707
579void dp_link_train(struct drm_encoder *encoder, 708 /* start training on the source */
580 struct drm_connector *connector) 709 if (ASIC_IS_DCE4(dp_info->rdev))
581{ 710 atombios_dig_encoder_setup(dp_info->encoder,
582 struct drm_device *dev = encoder->dev; 711 ATOM_ENCODER_CMD_DP_LINK_TRAINING_START, 0);
583 struct radeon_device *rdev = dev->dev_private; 712 else
584 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 713 radeon_dp_encoder_service(dp_info->rdev, ATOM_DP_ACTION_TRAINING_START,
585 struct radeon_encoder_atom_dig *dig; 714 dp_info->dp_clock, dp_info->enc_id, 0);
586 struct radeon_connector *radeon_connector;
587 struct radeon_connector_atom_dig *dig_connector;
588 int enc_id = 0;
589 bool clock_recovery, channel_eq;
590 u8 link_status[DP_LINK_STATUS_SIZE];
591 u8 link_configuration[DP_LINK_CONFIGURATION_SIZE];
592 u8 tries, voltage;
593 u8 train_set[4];
594 int i;
595 715
596 if ((connector->connector_type != DRM_MODE_CONNECTOR_DisplayPort) && 716 /* disable the training pattern on the sink */
597 (connector->connector_type != DRM_MODE_CONNECTOR_eDP)) 717 radeon_write_dpcd_reg(dp_info->radeon_connector,
598 return; 718 DP_TRAINING_PATTERN_SET,
719 DP_TRAINING_PATTERN_DISABLE);
599 720
600 if (!radeon_encoder->enc_priv) 721 return 0;
601 return; 722}
602 dig = radeon_encoder->enc_priv;
603 723
604 radeon_connector = to_radeon_connector(connector); 724static int radeon_dp_link_train_finish(struct radeon_dp_link_train_info *dp_info)
605 if (!radeon_connector->con_priv) 725{
606 return; 726 udelay(400);
607 dig_connector = radeon_connector->con_priv;
608 727
609 if (dig->dig_encoder) 728 /* disable the training pattern on the sink */
610 enc_id |= ATOM_DP_CONFIG_DIG2_ENCODER; 729 radeon_write_dpcd_reg(dp_info->radeon_connector,
611 else 730 DP_TRAINING_PATTERN_SET,
612 enc_id |= ATOM_DP_CONFIG_DIG1_ENCODER; 731 DP_TRAINING_PATTERN_DISABLE);
613 if (dig->linkb)
614 enc_id |= ATOM_DP_CONFIG_LINK_B;
615 else
616 enc_id |= ATOM_DP_CONFIG_LINK_A;
617 732
618 memset(link_configuration, 0, DP_LINK_CONFIGURATION_SIZE); 733 /* disable the training pattern on the source */
619 if (dig_connector->dp_clock == 270000) 734 if (ASIC_IS_DCE4(dp_info->rdev))
620 link_configuration[0] = DP_LINK_BW_2_7; 735 atombios_dig_encoder_setup(dp_info->encoder,
736 ATOM_ENCODER_CMD_DP_LINK_TRAINING_COMPLETE, 0);
621 else 737 else
622 link_configuration[0] = DP_LINK_BW_1_62; 738 radeon_dp_encoder_service(dp_info->rdev, ATOM_DP_ACTION_TRAINING_COMPLETE,
623 link_configuration[1] = dig_connector->dp_lane_count; 739 dp_info->dp_clock, dp_info->enc_id, 0);
624 if (dig_connector->dpcd[0] >= 0x11)
625 link_configuration[1] |= DP_LANE_COUNT_ENHANCED_FRAME_EN;
626 740
627 /* power up the sink */ 741 return 0;
628 dp_set_power(radeon_connector, DP_SET_POWER_D0); 742}
629 /* disable the training pattern on the sink */
630 dp_set_training(radeon_connector, DP_TRAINING_PATTERN_DISABLE);
631 /* set link bw and lanes on the sink */
632 dp_set_link_bw_lanes(radeon_connector, link_configuration);
633 /* disable downspread on the sink */
634 dp_set_downspread(radeon_connector, 0);
635 if (ASIC_IS_DCE4(rdev)) {
636 /* start training on the source */
637 atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_DP_LINK_TRAINING_START);
638 /* set training pattern 1 on the source */
639 atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_DP_LINK_TRAINING_PATTERN1);
640 } else {
641 /* start training on the source */
642 radeon_dp_encoder_service(rdev, ATOM_DP_ACTION_TRAINING_START,
643 dig_connector->dp_clock, enc_id, 0);
644 /* set training pattern 1 on the source */
645 radeon_dp_encoder_service(rdev, ATOM_DP_ACTION_TRAINING_PATTERN_SEL,
646 dig_connector->dp_clock, enc_id, 0);
647 }
648 743
649 /* set initial vs/emph */ 744static int radeon_dp_link_train_cr(struct radeon_dp_link_train_info *dp_info)
650 memset(train_set, 0, 4); 745{
651 udelay(400); 746 bool clock_recovery;
652 /* set training pattern 1 on the sink */ 747 u8 voltage;
653 dp_set_training(radeon_connector, DP_TRAINING_PATTERN_1); 748 int i;
654 749
655 dp_update_dpvs_emph(radeon_connector, encoder, train_set); 750 radeon_dp_set_tp(dp_info, DP_TRAINING_PATTERN_1);
751 memset(dp_info->train_set, 0, 4);
752 radeon_dp_update_vs_emph(dp_info);
753
754 udelay(400);
656 755
657 /* clock recovery loop */ 756 /* clock recovery loop */
658 clock_recovery = false; 757 clock_recovery = false;
659 tries = 0; 758 dp_info->tries = 0;
660 voltage = 0xff; 759 voltage = 0xff;
661 for (;;) { 760 while (1) {
662 udelay(100); 761 if (dp_info->rd_interval == 0)
663 if (!atom_dp_get_link_status(radeon_connector, link_status)) 762 udelay(100);
763 else
764 mdelay(dp_info->rd_interval * 4);
765
766 if (!radeon_dp_get_link_status(dp_info->radeon_connector, dp_info->link_status))
664 break; 767 break;
665 768
666 if (dp_clock_recovery_ok(link_status, dig_connector->dp_lane_count)) { 769 if (dp_clock_recovery_ok(dp_info->link_status, dp_info->dp_lane_count)) {
667 clock_recovery = true; 770 clock_recovery = true;
668 break; 771 break;
669 } 772 }
670 773
671 for (i = 0; i < dig_connector->dp_lane_count; i++) { 774 for (i = 0; i < dp_info->dp_lane_count; i++) {
672 if ((train_set[i] & DP_TRAIN_MAX_SWING_REACHED) == 0) 775 if ((dp_info->train_set[i] & DP_TRAIN_MAX_SWING_REACHED) == 0)
673 break; 776 break;
674 } 777 }
675 if (i == dig_connector->dp_lane_count) { 778 if (i == dp_info->dp_lane_count) {
676 DRM_ERROR("clock recovery reached max voltage\n"); 779 DRM_ERROR("clock recovery reached max voltage\n");
677 break; 780 break;
678 } 781 }
679 782
680 if ((train_set[0] & DP_TRAIN_VOLTAGE_SWING_MASK) == voltage) { 783 if ((dp_info->train_set[0] & DP_TRAIN_VOLTAGE_SWING_MASK) == voltage) {
681 ++tries; 784 ++dp_info->tries;
682 if (tries == 5) { 785 if (dp_info->tries == 5) {
683 DRM_ERROR("clock recovery tried 5 times\n"); 786 DRM_ERROR("clock recovery tried 5 times\n");
684 break; 787 break;
685 } 788 }
686 } else 789 } else
687 tries = 0; 790 dp_info->tries = 0;
688 791
689 voltage = train_set[0] & DP_TRAIN_VOLTAGE_SWING_MASK; 792 voltage = dp_info->train_set[0] & DP_TRAIN_VOLTAGE_SWING_MASK;
690 793
691 /* Compute new train_set as requested by sink */ 794 /* Compute new train_set as requested by sink */
692 dp_get_adjust_train(link_status, dig_connector->dp_lane_count, train_set); 795 dp_get_adjust_train(dp_info->link_status, dp_info->dp_lane_count, dp_info->train_set);
693 dp_update_dpvs_emph(radeon_connector, encoder, train_set); 796
797 radeon_dp_update_vs_emph(dp_info);
694 } 798 }
695 if (!clock_recovery) 799 if (!clock_recovery) {
696 DRM_ERROR("clock recovery failed\n"); 800 DRM_ERROR("clock recovery failed\n");
697 else 801 return -1;
802 } else {
698 DRM_DEBUG_KMS("clock recovery at voltage %d pre-emphasis %d\n", 803 DRM_DEBUG_KMS("clock recovery at voltage %d pre-emphasis %d\n",
699 train_set[0] & DP_TRAIN_VOLTAGE_SWING_MASK, 804 dp_info->train_set[0] & DP_TRAIN_VOLTAGE_SWING_MASK,
700 (train_set[0] & DP_TRAIN_PRE_EMPHASIS_MASK) >> 805 (dp_info->train_set[0] & DP_TRAIN_PRE_EMPHASIS_MASK) >>
701 DP_TRAIN_PRE_EMPHASIS_SHIFT); 806 DP_TRAIN_PRE_EMPHASIS_SHIFT);
807 return 0;
808 }
809}
702 810
811static int radeon_dp_link_train_ce(struct radeon_dp_link_train_info *dp_info)
812{
813 bool channel_eq;
703 814
704 /* set training pattern 2 on the sink */ 815 if (dp_info->tp3_supported)
705 dp_set_training(radeon_connector, DP_TRAINING_PATTERN_2); 816 radeon_dp_set_tp(dp_info, DP_TRAINING_PATTERN_3);
706 /* set training pattern 2 on the source */
707 if (ASIC_IS_DCE4(rdev))
708 atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_DP_LINK_TRAINING_PATTERN2);
709 else 817 else
710 radeon_dp_encoder_service(rdev, ATOM_DP_ACTION_TRAINING_PATTERN_SEL, 818 radeon_dp_set_tp(dp_info, DP_TRAINING_PATTERN_2);
711 dig_connector->dp_clock, enc_id, 1);
712 819
713 /* channel equalization loop */ 820 /* channel equalization loop */
714 tries = 0; 821 dp_info->tries = 0;
715 channel_eq = false; 822 channel_eq = false;
716 for (;;) { 823 while (1) {
717 udelay(400); 824 if (dp_info->rd_interval == 0)
718 if (!atom_dp_get_link_status(radeon_connector, link_status)) 825 udelay(400);
826 else
827 mdelay(dp_info->rd_interval * 4);
828
829 if (!radeon_dp_get_link_status(dp_info->radeon_connector, dp_info->link_status))
719 break; 830 break;
720 831
721 if (dp_channel_eq_ok(link_status, dig_connector->dp_lane_count)) { 832 if (dp_channel_eq_ok(dp_info->link_status, dp_info->dp_lane_count)) {
722 channel_eq = true; 833 channel_eq = true;
723 break; 834 break;
724 } 835 }
725 836
726 /* Try 5 times */ 837 /* Try 5 times */
727 if (tries > 5) { 838 if (dp_info->tries > 5) {
728 DRM_ERROR("channel eq failed: 5 tries\n"); 839 DRM_ERROR("channel eq failed: 5 tries\n");
729 break; 840 break;
730 } 841 }
731 842
732 /* Compute new train_set as requested by sink */ 843 /* Compute new train_set as requested by sink */
733 dp_get_adjust_train(link_status, dig_connector->dp_lane_count, train_set); 844 dp_get_adjust_train(dp_info->link_status, dp_info->dp_lane_count, dp_info->train_set);
734 dp_update_dpvs_emph(radeon_connector, encoder, train_set);
735 845
736 tries++; 846 radeon_dp_update_vs_emph(dp_info);
847 dp_info->tries++;
737 } 848 }
738 849
739 if (!channel_eq) 850 if (!channel_eq) {
740 DRM_ERROR("channel eq failed\n"); 851 DRM_ERROR("channel eq failed\n");
741 else 852 return -1;
853 } else {
742 DRM_DEBUG_KMS("channel eq at voltage %d pre-emphasis %d\n", 854 DRM_DEBUG_KMS("channel eq at voltage %d pre-emphasis %d\n",
743 train_set[0] & DP_TRAIN_VOLTAGE_SWING_MASK, 855 dp_info->train_set[0] & DP_TRAIN_VOLTAGE_SWING_MASK,
744 (train_set[0] & DP_TRAIN_PRE_EMPHASIS_MASK) 856 (dp_info->train_set[0] & DP_TRAIN_PRE_EMPHASIS_MASK)
745 >> DP_TRAIN_PRE_EMPHASIS_SHIFT); 857 >> DP_TRAIN_PRE_EMPHASIS_SHIFT);
746 858 return 0;
747 /* disable the training pattern on the sink */ 859 }
748 dp_set_training(radeon_connector, DP_TRAINING_PATTERN_DISABLE);
749
750 /* disable the training pattern on the source */
751 if (ASIC_IS_DCE4(rdev))
752 atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_DP_LINK_TRAINING_COMPLETE);
753 else
754 radeon_dp_encoder_service(rdev, ATOM_DP_ACTION_TRAINING_COMPLETE,
755 dig_connector->dp_clock, enc_id, 0);
756} 860}
757 861
758int radeon_dp_i2c_aux_ch(struct i2c_adapter *adapter, int mode, 862void radeon_dp_link_train(struct drm_encoder *encoder,
759 uint8_t write_byte, uint8_t *read_byte) 863 struct drm_connector *connector)
760{ 864{
761 struct i2c_algo_dp_aux_data *algo_data = adapter->algo_data; 865 struct drm_device *dev = encoder->dev;
762 struct radeon_i2c_chan *auxch = (struct radeon_i2c_chan *)adapter; 866 struct radeon_device *rdev = dev->dev_private;
763 int ret = 0; 867 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
764 uint16_t address = algo_data->address; 868 struct radeon_encoder_atom_dig *dig;
765 uint8_t msg[5]; 869 struct radeon_connector *radeon_connector;
766 uint8_t reply[2]; 870 struct radeon_connector_atom_dig *dig_connector;
767 int msg_len, dp_msg_len; 871 struct radeon_dp_link_train_info dp_info;
768 int reply_bytes; 872 u8 tmp;
769
770 /* Set up the command byte */
771 if (mode & MODE_I2C_READ)
772 msg[2] = AUX_I2C_READ << 4;
773 else
774 msg[2] = AUX_I2C_WRITE << 4;
775
776 if (!(mode & MODE_I2C_STOP))
777 msg[2] |= AUX_I2C_MOT << 4;
778 873
779 msg[0] = address; 874 if (!radeon_encoder->enc_priv)
780 msg[1] = address >> 8; 875 return;
876 dig = radeon_encoder->enc_priv;
781 877
782 reply_bytes = 1; 878 radeon_connector = to_radeon_connector(connector);
879 if (!radeon_connector->con_priv)
880 return;
881 dig_connector = radeon_connector->con_priv;
783 882
784 msg_len = 4; 883 if ((dig_connector->dp_sink_type != CONNECTOR_OBJECT_ID_DISPLAYPORT) &&
785 dp_msg_len = 3; 884 (dig_connector->dp_sink_type != CONNECTOR_OBJECT_ID_eDP))
786 switch (mode) { 885 return;
787 case MODE_I2C_WRITE:
788 msg[4] = write_byte;
789 msg_len++;
790 dp_msg_len += 2;
791 break;
792 case MODE_I2C_READ:
793 dp_msg_len += 1;
794 break;
795 default:
796 break;
797 }
798 886
799 msg[3] = (dp_msg_len) << 4; 887 dp_info.enc_id = 0;
800 ret = radeon_process_aux_ch(auxch, msg, msg_len, reply, reply_bytes, 0); 888 if (dig->dig_encoder)
889 dp_info.enc_id |= ATOM_DP_CONFIG_DIG2_ENCODER;
890 else
891 dp_info.enc_id |= ATOM_DP_CONFIG_DIG1_ENCODER;
892 if (dig->linkb)
893 dp_info.enc_id |= ATOM_DP_CONFIG_LINK_B;
894 else
895 dp_info.enc_id |= ATOM_DP_CONFIG_LINK_A;
801 896
802 if (ret) { 897 dp_info.rd_interval = radeon_read_dpcd_reg(radeon_connector, DP_TRAINING_AUX_RD_INTERVAL);
803 if (read_byte) 898 tmp = radeon_read_dpcd_reg(radeon_connector, DP_MAX_LANE_COUNT);
804 *read_byte = reply[0]; 899 if (ASIC_IS_DCE5(rdev) && (tmp & DP_TPS3_SUPPORTED))
805 return reply_bytes; 900 dp_info.tp3_supported = true;
806 } 901 else
807 return -EREMOTEIO; 902 dp_info.tp3_supported = false;
903
904 memcpy(dp_info.dpcd, dig_connector->dpcd, 8);
905 dp_info.rdev = rdev;
906 dp_info.encoder = encoder;
907 dp_info.connector = connector;
908 dp_info.radeon_connector = radeon_connector;
909 dp_info.dp_lane_count = dig_connector->dp_lane_count;
910 dp_info.dp_clock = dig_connector->dp_clock;
911
912 if (radeon_dp_link_train_init(&dp_info))
913 goto done;
914 if (radeon_dp_link_train_cr(&dp_info))
915 goto done;
916 if (radeon_dp_link_train_ce(&dp_info))
917 goto done;
918done:
919 if (radeon_dp_link_train_finish(&dp_info))
920 return;
808} 921}
809
diff --git a/drivers/gpu/drm/radeon/cayman_blit_shaders.c b/drivers/gpu/drm/radeon/cayman_blit_shaders.c
new file mode 100644
index 000000000000..7b4eeb7b4a8c
--- /dev/null
+++ b/drivers/gpu/drm/radeon/cayman_blit_shaders.c
@@ -0,0 +1,373 @@
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 <linux/types.h>
28#include <linux/kernel.h>
29
30/*
31 * evergreen cards need to use the 3D engine to blit data which requires
32 * quite a bit of hw state setup. Rather than pull the whole 3D driver
33 * (which normally generates the 3D state) into the DRM, we opt to use
34 * statically generated state tables. The regsiter state and shaders
35 * were hand generated to support blitting functionality. See the 3D
36 * driver or documentation for descriptions of the registers and
37 * shader instructions.
38 */
39
40const u32 cayman_default_state[] =
41{
42 0xc0066900,
43 0x00000000,
44 0x00000060, /* DB_RENDER_CONTROL */
45 0x00000000, /* DB_COUNT_CONTROL */
46 0x00000000, /* DB_DEPTH_VIEW */
47 0x0000002a, /* DB_RENDER_OVERRIDE */
48 0x00000000, /* DB_RENDER_OVERRIDE2 */
49 0x00000000, /* DB_HTILE_DATA_BASE */
50
51 0xc0026900,
52 0x0000000a,
53 0x00000000, /* DB_STENCIL_CLEAR */
54 0x00000000, /* DB_DEPTH_CLEAR */
55
56 0xc0036900,
57 0x0000000f,
58 0x00000000, /* DB_DEPTH_INFO */
59 0x00000000, /* DB_Z_INFO */
60 0x00000000, /* DB_STENCIL_INFO */
61
62 0xc0016900,
63 0x00000080,
64 0x00000000, /* PA_SC_WINDOW_OFFSET */
65
66 0xc00d6900,
67 0x00000083,
68 0x0000ffff, /* PA_SC_CLIPRECT_RULE */
69 0x00000000, /* PA_SC_CLIPRECT_0_TL */
70 0x20002000, /* PA_SC_CLIPRECT_0_BR */
71 0x00000000,
72 0x20002000,
73 0x00000000,
74 0x20002000,
75 0x00000000,
76 0x20002000,
77 0xaaaaaaaa, /* PA_SC_EDGERULE */
78 0x00000000, /* PA_SU_HARDWARE_SCREEN_OFFSET */
79 0x0000000f, /* CB_TARGET_MASK */
80 0x0000000f, /* CB_SHADER_MASK */
81
82 0xc0226900,
83 0x00000094,
84 0x80000000, /* PA_SC_VPORT_SCISSOR_0_TL */
85 0x20002000, /* PA_SC_VPORT_SCISSOR_0_BR */
86 0x80000000,
87 0x20002000,
88 0x80000000,
89 0x20002000,
90 0x80000000,
91 0x20002000,
92 0x80000000,
93 0x20002000,
94 0x80000000,
95 0x20002000,
96 0x80000000,
97 0x20002000,
98 0x80000000,
99 0x20002000,
100 0x80000000,
101 0x20002000,
102 0x80000000,
103 0x20002000,
104 0x80000000,
105 0x20002000,
106 0x80000000,
107 0x20002000,
108 0x80000000,
109 0x20002000,
110 0x80000000,
111 0x20002000,
112 0x80000000,
113 0x20002000,
114 0x80000000,
115 0x20002000,
116 0x00000000, /* PA_SC_VPORT_ZMIN_0 */
117 0x3f800000, /* PA_SC_VPORT_ZMAX_0 */
118
119 0xc0016900,
120 0x000000d4,
121 0x00000000, /* SX_MISC */
122
123 0xc0026900,
124 0x000000d9,
125 0x00000000, /* CP_RINGID */
126 0x00000000, /* CP_VMID */
127
128 0xc0096900,
129 0x00000100,
130 0x00ffffff, /* VGT_MAX_VTX_INDX */
131 0x00000000, /* VGT_MIN_VTX_INDX */
132 0x00000000, /* VGT_INDX_OFFSET */
133 0x00000000, /* VGT_MULTI_PRIM_IB_RESET_INDX */
134 0x00000000, /* SX_ALPHA_TEST_CONTROL */
135 0x00000000, /* CB_BLEND_RED */
136 0x00000000, /* CB_BLEND_GREEN */
137 0x00000000, /* CB_BLEND_BLUE */
138 0x00000000, /* CB_BLEND_ALPHA */
139
140 0xc0016900,
141 0x00000187,
142 0x00000100, /* SPI_VS_OUT_ID_0 */
143
144 0xc0026900,
145 0x00000191,
146 0x00000100, /* SPI_PS_INPUT_CNTL_0 */
147 0x00000101, /* SPI_PS_INPUT_CNTL_1 */
148
149 0xc0016900,
150 0x000001b1,
151 0x00000000, /* SPI_VS_OUT_CONFIG */
152
153 0xc0106900,
154 0x000001b3,
155 0x20000001, /* SPI_PS_IN_CONTROL_0 */
156 0x00000000, /* SPI_PS_IN_CONTROL_1 */
157 0x00000000, /* SPI_INTERP_CONTROL_0 */
158 0x00000000, /* SPI_INPUT_Z */
159 0x00000000, /* SPI_FOG_CNTL */
160 0x00100000, /* SPI_BARYC_CNTL */
161 0x00000000, /* SPI_PS_IN_CONTROL_2 */
162 0x00000000, /* SPI_COMPUTE_INPUT_CNTL */
163 0x00000000, /* SPI_COMPUTE_NUM_THREAD_X */
164 0x00000000, /* SPI_COMPUTE_NUM_THREAD_Y */
165 0x00000000, /* SPI_COMPUTE_NUM_THREAD_Z */
166 0x00000000, /* SPI_GPR_MGMT */
167 0x00000000, /* SPI_LDS_MGMT */
168 0x00000000, /* SPI_STACK_MGMT */
169 0x00000000, /* SPI_WAVE_MGMT_1 */
170 0x00000000, /* SPI_WAVE_MGMT_2 */
171
172 0xc0016900,
173 0x000001e0,
174 0x00000000, /* CB_BLEND0_CONTROL */
175
176 0xc00e6900,
177 0x00000200,
178 0x00000000, /* DB_DEPTH_CONTROL */
179 0x00000000, /* DB_EQAA */
180 0x00cc0010, /* CB_COLOR_CONTROL */
181 0x00000210, /* DB_SHADER_CONTROL */
182 0x00010000, /* PA_CL_CLIP_CNTL */
183 0x00000004, /* PA_SU_SC_MODE_CNTL */
184 0x00000100, /* PA_CL_VTE_CNTL */
185 0x00000000, /* PA_CL_VS_OUT_CNTL */
186 0x00000000, /* PA_CL_NANINF_CNTL */
187 0x00000000, /* PA_SU_LINE_STIPPLE_CNTL */
188 0x00000000, /* PA_SU_LINE_STIPPLE_SCALE */
189 0x00000000, /* PA_SU_PRIM_FILTER_CNTL */
190 0x00000000, /* */
191 0x00000000, /* */
192
193 0xc0026900,
194 0x00000229,
195 0x00000000, /* SQ_PGM_START_FS */
196 0x00000000,
197
198 0xc0016900,
199 0x0000023b,
200 0x00000000, /* SQ_LDS_ALLOC_PS */
201
202 0xc0066900,
203 0x00000240,
204 0x00000000, /* SQ_ESGS_RING_ITEMSIZE */
205 0x00000000,
206 0x00000000,
207 0x00000000,
208 0x00000000,
209 0x00000000,
210
211 0xc0046900,
212 0x00000247,
213 0x00000000, /* SQ_GS_VERT_ITEMSIZE */
214 0x00000000,
215 0x00000000,
216 0x00000000,
217
218 0xc0116900,
219 0x00000280,
220 0x00000000, /* PA_SU_POINT_SIZE */
221 0x00000000, /* PA_SU_POINT_MINMAX */
222 0x00000008, /* PA_SU_LINE_CNTL */
223 0x00000000, /* PA_SC_LINE_STIPPLE */
224 0x00000000, /* VGT_OUTPUT_PATH_CNTL */
225 0x00000000, /* VGT_HOS_CNTL */
226 0x00000000,
227 0x00000000,
228 0x00000000,
229 0x00000000,
230 0x00000000,
231 0x00000000,
232 0x00000000,
233 0x00000000,
234 0x00000000,
235 0x00000000,
236 0x00000000, /* VGT_GS_MODE */
237
238 0xc0026900,
239 0x00000292,
240 0x00000000, /* PA_SC_MODE_CNTL_0 */
241 0x00000000, /* PA_SC_MODE_CNTL_1 */
242
243 0xc0016900,
244 0x000002a1,
245 0x00000000, /* VGT_PRIMITIVEID_EN */
246
247 0xc0016900,
248 0x000002a5,
249 0x00000000, /* VGT_MULTI_PRIM_IB_RESET_EN */
250
251 0xc0026900,
252 0x000002a8,
253 0x00000000, /* VGT_INSTANCE_STEP_RATE_0 */
254 0x00000000,
255
256 0xc0026900,
257 0x000002ad,
258 0x00000000, /* VGT_REUSE_OFF */
259 0x00000000,
260
261 0xc0016900,
262 0x000002d5,
263 0x00000000, /* VGT_SHADER_STAGES_EN */
264
265 0xc0016900,
266 0x000002dc,
267 0x0000aa00, /* DB_ALPHA_TO_MASK */
268
269 0xc0066900,
270 0x000002de,
271 0x00000000, /* PA_SU_POLY_OFFSET_DB_FMT_CNTL */
272 0x00000000,
273 0x00000000,
274 0x00000000,
275 0x00000000,
276 0x00000000,
277
278 0xc0026900,
279 0x000002e5,
280 0x00000000, /* VGT_STRMOUT_CONFIG */
281 0x00000000,
282
283 0xc01b6900,
284 0x000002f5,
285 0x76543210, /* PA_SC_CENTROID_PRIORITY_0 */
286 0xfedcba98, /* PA_SC_CENTROID_PRIORITY_1 */
287 0x00000000, /* PA_SC_LINE_CNTL */
288 0x00000000, /* PA_SC_AA_CONFIG */
289 0x00000005, /* PA_SU_VTX_CNTL */
290 0x3f800000, /* PA_CL_GB_VERT_CLIP_ADJ */
291 0x3f800000, /* PA_CL_GB_VERT_DISC_ADJ */
292 0x3f800000, /* PA_CL_GB_HORZ_CLIP_ADJ */
293 0x3f800000, /* PA_CL_GB_HORZ_DISC_ADJ */
294 0x00000000, /* PA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y0_0 */
295 0x00000000,
296 0x00000000,
297 0x00000000,
298 0x00000000,
299 0x00000000,
300 0x00000000,
301 0x00000000,
302 0x00000000,
303 0x00000000,
304 0x00000000,
305 0x00000000,
306 0x00000000,
307 0x00000000,
308 0x00000000,
309 0x00000000,
310 0xffffffff, /* PA_SC_AA_MASK_X0Y0_X1Y0 */
311 0xffffffff,
312
313 0xc0026900,
314 0x00000316,
315 0x0000000e, /* VGT_VERTEX_REUSE_BLOCK_CNTL */
316 0x00000010, /* */
317};
318
319const u32 cayman_vs[] =
320{
321 0x00000004,
322 0x80400400,
323 0x0000a03c,
324 0x95000688,
325 0x00004000,
326 0x15000688,
327 0x00000000,
328 0x88000000,
329 0x04000000,
330 0x67961001,
331#ifdef __BIG_ENDIAN
332 0x00020000,
333#else
334 0x00000000,
335#endif
336 0x00000000,
337 0x04000000,
338 0x67961000,
339#ifdef __BIG_ENDIAN
340 0x00020008,
341#else
342 0x00000008,
343#endif
344 0x00000000,
345};
346
347const u32 cayman_ps[] =
348{
349 0x00000004,
350 0xa00c0000,
351 0x00000008,
352 0x80400000,
353 0x00000000,
354 0x95000688,
355 0x00000000,
356 0x88000000,
357 0x00380400,
358 0x00146b10,
359 0x00380000,
360 0x20146b10,
361 0x00380400,
362 0x40146b00,
363 0x80380000,
364 0x60146b00,
365 0x00000010,
366 0x000d1000,
367 0xb0800000,
368 0x00000000,
369};
370
371const u32 cayman_ps_size = ARRAY_SIZE(cayman_ps);
372const u32 cayman_vs_size = ARRAY_SIZE(cayman_vs);
373const u32 cayman_default_size = ARRAY_SIZE(cayman_default_state);
diff --git a/drivers/gpu/drm/radeon/cayman_blit_shaders.h b/drivers/gpu/drm/radeon/cayman_blit_shaders.h
new file mode 100644
index 000000000000..f5d0e9a60267
--- /dev/null
+++ b/drivers/gpu/drm/radeon/cayman_blit_shaders.h
@@ -0,0 +1,35 @@
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 */
24
25#ifndef CAYMAN_BLIT_SHADERS_H
26#define CAYMAN_BLIT_SHADERS_H
27
28extern const u32 cayman_ps[];
29extern const u32 cayman_vs[];
30extern const u32 cayman_default_state[];
31
32extern const u32 cayman_ps_size, cayman_vs_size;
33extern const u32 cayman_default_size;
34
35#endif
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c
index 2f93d46ae69a..15bd0477a3e8 100644
--- a/drivers/gpu/drm/radeon/evergreen.c
+++ b/drivers/gpu/drm/radeon/evergreen.c
@@ -32,26 +32,102 @@
32#include "atom.h" 32#include "atom.h"
33#include "avivod.h" 33#include "avivod.h"
34#include "evergreen_reg.h" 34#include "evergreen_reg.h"
35#include "evergreen_blit_shaders.h"
35 36
36#define EVERGREEN_PFP_UCODE_SIZE 1120 37#define EVERGREEN_PFP_UCODE_SIZE 1120
37#define EVERGREEN_PM4_UCODE_SIZE 1376 38#define EVERGREEN_PM4_UCODE_SIZE 1376
38 39
39static void evergreen_gpu_init(struct radeon_device *rdev); 40static void evergreen_gpu_init(struct radeon_device *rdev);
40void evergreen_fini(struct radeon_device *rdev); 41void evergreen_fini(struct radeon_device *rdev);
42static void evergreen_pcie_gen2_enable(struct radeon_device *rdev);
43
44void evergreen_pre_page_flip(struct radeon_device *rdev, int crtc)
45{
46 /* enable the pflip int */
47 radeon_irq_kms_pflip_irq_get(rdev, crtc);
48}
49
50void evergreen_post_page_flip(struct radeon_device *rdev, int crtc)
51{
52 /* disable the pflip int */
53 radeon_irq_kms_pflip_irq_put(rdev, crtc);
54}
55
56u32 evergreen_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base)
57{
58 struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id];
59 u32 tmp = RREG32(EVERGREEN_GRPH_UPDATE + radeon_crtc->crtc_offset);
60
61 /* Lock the graphics update lock */
62 tmp |= EVERGREEN_GRPH_UPDATE_LOCK;
63 WREG32(EVERGREEN_GRPH_UPDATE + radeon_crtc->crtc_offset, tmp);
64
65 /* update the scanout addresses */
66 WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH + radeon_crtc->crtc_offset,
67 upper_32_bits(crtc_base));
68 WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset,
69 (u32)crtc_base);
70
71 WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH + radeon_crtc->crtc_offset,
72 upper_32_bits(crtc_base));
73 WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset,
74 (u32)crtc_base);
75
76 /* Wait for update_pending to go high. */
77 while (!(RREG32(EVERGREEN_GRPH_UPDATE + radeon_crtc->crtc_offset) & EVERGREEN_GRPH_SURFACE_UPDATE_PENDING));
78 DRM_DEBUG("Update pending now high. Unlocking vupdate_lock.\n");
79
80 /* Unlock the lock, so double-buffering can take place inside vblank */
81 tmp &= ~EVERGREEN_GRPH_UPDATE_LOCK;
82 WREG32(EVERGREEN_GRPH_UPDATE + radeon_crtc->crtc_offset, tmp);
83
84 /* Return current update_pending status: */
85 return RREG32(EVERGREEN_GRPH_UPDATE + radeon_crtc->crtc_offset) & EVERGREEN_GRPH_SURFACE_UPDATE_PENDING;
86}
41 87
42/* get temperature in millidegrees */ 88/* get temperature in millidegrees */
43u32 evergreen_get_temp(struct radeon_device *rdev) 89int evergreen_get_temp(struct radeon_device *rdev)
44{ 90{
45 u32 temp = (RREG32(CG_MULT_THERMAL_STATUS) & ASIC_T_MASK) >> 91 u32 temp, toffset;
46 ASIC_T_SHIFT; 92 int actual_temp = 0;
47 u32 actual_temp = 0; 93
48 94 if (rdev->family == CHIP_JUNIPER) {
49 if ((temp >> 10) & 1) 95 toffset = (RREG32(CG_THERMAL_CTRL) & TOFFSET_MASK) >>
50 actual_temp = 0; 96 TOFFSET_SHIFT;
51 else if ((temp >> 9) & 1) 97 temp = (RREG32(CG_TS0_STATUS) & TS0_ADC_DOUT_MASK) >>
52 actual_temp = 255; 98 TS0_ADC_DOUT_SHIFT;
53 else 99
54 actual_temp = (temp >> 1) & 0xff; 100 if (toffset & 0x100)
101 actual_temp = temp / 2 - (0x200 - toffset);
102 else
103 actual_temp = temp / 2 + toffset;
104
105 actual_temp = actual_temp * 1000;
106
107 } else {
108 temp = (RREG32(CG_MULT_THERMAL_STATUS) & ASIC_T_MASK) >>
109 ASIC_T_SHIFT;
110
111 if (temp & 0x400)
112 actual_temp = -256;
113 else if (temp & 0x200)
114 actual_temp = 255;
115 else if (temp & 0x100) {
116 actual_temp = temp & 0x1ff;
117 actual_temp |= ~0x1ff;
118 } else
119 actual_temp = temp & 0xff;
120
121 actual_temp = (actual_temp * 1000) / 2;
122 }
123
124 return actual_temp;
125}
126
127int sumo_get_temp(struct radeon_device *rdev)
128{
129 u32 temp = RREG32(CG_THERMAL_STATUS) & 0xff;
130 int actual_temp = temp - 49;
55 131
56 return actual_temp * 1000; 132 return actual_temp * 1000;
57} 133}
@@ -63,11 +139,22 @@ void evergreen_pm_misc(struct radeon_device *rdev)
63 struct radeon_power_state *ps = &rdev->pm.power_state[req_ps_idx]; 139 struct radeon_power_state *ps = &rdev->pm.power_state[req_ps_idx];
64 struct radeon_voltage *voltage = &ps->clock_info[req_cm_idx].voltage; 140 struct radeon_voltage *voltage = &ps->clock_info[req_cm_idx].voltage;
65 141
66 if ((voltage->type == VOLTAGE_SW) && voltage->voltage) { 142 if (voltage->type == VOLTAGE_SW) {
67 if (voltage->voltage != rdev->pm.current_vddc) { 143 /* 0xff01 is a flag rather then an actual voltage */
68 radeon_atom_set_voltage(rdev, voltage->voltage); 144 if (voltage->voltage == 0xff01)
145 return;
146 if (voltage->voltage && (voltage->voltage != rdev->pm.current_vddc)) {
147 radeon_atom_set_voltage(rdev, voltage->voltage, SET_VOLTAGE_TYPE_ASIC_VDDC);
69 rdev->pm.current_vddc = voltage->voltage; 148 rdev->pm.current_vddc = voltage->voltage;
70 DRM_DEBUG("Setting: v: %d\n", voltage->voltage); 149 DRM_DEBUG("Setting: vddc: %d\n", voltage->voltage);
150 }
151 /* 0xff01 is a flag rather then an actual voltage */
152 if (voltage->vddci == 0xff01)
153 return;
154 if (voltage->vddci && (voltage->vddci != rdev->pm.current_vddci)) {
155 radeon_atom_set_voltage(rdev, voltage->vddci, SET_VOLTAGE_TYPE_ASIC_VDDCI);
156 rdev->pm.current_vddci = voltage->vddci;
157 DRM_DEBUG("Setting: vddci: %d\n", voltage->vddci);
71 } 158 }
72 } 159 }
73} 160}
@@ -284,12 +371,458 @@ void evergreen_hpd_fini(struct radeon_device *rdev)
284 } 371 }
285} 372}
286 373
374/* watermark setup */
375
376static u32 evergreen_line_buffer_adjust(struct radeon_device *rdev,
377 struct radeon_crtc *radeon_crtc,
378 struct drm_display_mode *mode,
379 struct drm_display_mode *other_mode)
380{
381 u32 tmp;
382 /*
383 * Line Buffer Setup
384 * There are 3 line buffers, each one shared by 2 display controllers.
385 * DC_LB_MEMORY_SPLIT controls how that line buffer is shared between
386 * the display controllers. The paritioning is done via one of four
387 * preset allocations specified in bits 2:0:
388 * first display controller
389 * 0 - first half of lb (3840 * 2)
390 * 1 - first 3/4 of lb (5760 * 2)
391 * 2 - whole lb (7680 * 2), other crtc must be disabled
392 * 3 - first 1/4 of lb (1920 * 2)
393 * second display controller
394 * 4 - second half of lb (3840 * 2)
395 * 5 - second 3/4 of lb (5760 * 2)
396 * 6 - whole lb (7680 * 2), other crtc must be disabled
397 * 7 - last 1/4 of lb (1920 * 2)
398 */
399 /* this can get tricky if we have two large displays on a paired group
400 * of crtcs. Ideally for multiple large displays we'd assign them to
401 * non-linked crtcs for maximum line buffer allocation.
402 */
403 if (radeon_crtc->base.enabled && mode) {
404 if (other_mode)
405 tmp = 0; /* 1/2 */
406 else
407 tmp = 2; /* whole */
408 } else
409 tmp = 0;
410
411 /* second controller of the pair uses second half of the lb */
412 if (radeon_crtc->crtc_id % 2)
413 tmp += 4;
414 WREG32(DC_LB_MEMORY_SPLIT + radeon_crtc->crtc_offset, tmp);
415
416 if (radeon_crtc->base.enabled && mode) {
417 switch (tmp) {
418 case 0:
419 case 4:
420 default:
421 if (ASIC_IS_DCE5(rdev))
422 return 4096 * 2;
423 else
424 return 3840 * 2;
425 case 1:
426 case 5:
427 if (ASIC_IS_DCE5(rdev))
428 return 6144 * 2;
429 else
430 return 5760 * 2;
431 case 2:
432 case 6:
433 if (ASIC_IS_DCE5(rdev))
434 return 8192 * 2;
435 else
436 return 7680 * 2;
437 case 3:
438 case 7:
439 if (ASIC_IS_DCE5(rdev))
440 return 2048 * 2;
441 else
442 return 1920 * 2;
443 }
444 }
445
446 /* controller not enabled, so no lb used */
447 return 0;
448}
449
450static u32 evergreen_get_number_of_dram_channels(struct radeon_device *rdev)
451{
452 u32 tmp = RREG32(MC_SHARED_CHMAP);
453
454 switch ((tmp & NOOFCHAN_MASK) >> NOOFCHAN_SHIFT) {
455 case 0:
456 default:
457 return 1;
458 case 1:
459 return 2;
460 case 2:
461 return 4;
462 case 3:
463 return 8;
464 }
465}
466
467struct evergreen_wm_params {
468 u32 dram_channels; /* number of dram channels */
469 u32 yclk; /* bandwidth per dram data pin in kHz */
470 u32 sclk; /* engine clock in kHz */
471 u32 disp_clk; /* display clock in kHz */
472 u32 src_width; /* viewport width */
473 u32 active_time; /* active display time in ns */
474 u32 blank_time; /* blank time in ns */
475 bool interlaced; /* mode is interlaced */
476 fixed20_12 vsc; /* vertical scale ratio */
477 u32 num_heads; /* number of active crtcs */
478 u32 bytes_per_pixel; /* bytes per pixel display + overlay */
479 u32 lb_size; /* line buffer allocated to pipe */
480 u32 vtaps; /* vertical scaler taps */
481};
482
483static u32 evergreen_dram_bandwidth(struct evergreen_wm_params *wm)
484{
485 /* Calculate DRAM Bandwidth and the part allocated to display. */
486 fixed20_12 dram_efficiency; /* 0.7 */
487 fixed20_12 yclk, dram_channels, bandwidth;
488 fixed20_12 a;
489
490 a.full = dfixed_const(1000);
491 yclk.full = dfixed_const(wm->yclk);
492 yclk.full = dfixed_div(yclk, a);
493 dram_channels.full = dfixed_const(wm->dram_channels * 4);
494 a.full = dfixed_const(10);
495 dram_efficiency.full = dfixed_const(7);
496 dram_efficiency.full = dfixed_div(dram_efficiency, a);
497 bandwidth.full = dfixed_mul(dram_channels, yclk);
498 bandwidth.full = dfixed_mul(bandwidth, dram_efficiency);
499
500 return dfixed_trunc(bandwidth);
501}
502
503static u32 evergreen_dram_bandwidth_for_display(struct evergreen_wm_params *wm)
504{
505 /* Calculate DRAM Bandwidth and the part allocated to display. */
506 fixed20_12 disp_dram_allocation; /* 0.3 to 0.7 */
507 fixed20_12 yclk, dram_channels, bandwidth;
508 fixed20_12 a;
509
510 a.full = dfixed_const(1000);
511 yclk.full = dfixed_const(wm->yclk);
512 yclk.full = dfixed_div(yclk, a);
513 dram_channels.full = dfixed_const(wm->dram_channels * 4);
514 a.full = dfixed_const(10);
515 disp_dram_allocation.full = dfixed_const(3); /* XXX worse case value 0.3 */
516 disp_dram_allocation.full = dfixed_div(disp_dram_allocation, a);
517 bandwidth.full = dfixed_mul(dram_channels, yclk);
518 bandwidth.full = dfixed_mul(bandwidth, disp_dram_allocation);
519
520 return dfixed_trunc(bandwidth);
521}
522
523static u32 evergreen_data_return_bandwidth(struct evergreen_wm_params *wm)
524{
525 /* Calculate the display Data return Bandwidth */
526 fixed20_12 return_efficiency; /* 0.8 */
527 fixed20_12 sclk, bandwidth;
528 fixed20_12 a;
529
530 a.full = dfixed_const(1000);
531 sclk.full = dfixed_const(wm->sclk);
532 sclk.full = dfixed_div(sclk, a);
533 a.full = dfixed_const(10);
534 return_efficiency.full = dfixed_const(8);
535 return_efficiency.full = dfixed_div(return_efficiency, a);
536 a.full = dfixed_const(32);
537 bandwidth.full = dfixed_mul(a, sclk);
538 bandwidth.full = dfixed_mul(bandwidth, return_efficiency);
539
540 return dfixed_trunc(bandwidth);
541}
542
543static u32 evergreen_dmif_request_bandwidth(struct evergreen_wm_params *wm)
544{
545 /* Calculate the DMIF Request Bandwidth */
546 fixed20_12 disp_clk_request_efficiency; /* 0.8 */
547 fixed20_12 disp_clk, bandwidth;
548 fixed20_12 a;
549
550 a.full = dfixed_const(1000);
551 disp_clk.full = dfixed_const(wm->disp_clk);
552 disp_clk.full = dfixed_div(disp_clk, a);
553 a.full = dfixed_const(10);
554 disp_clk_request_efficiency.full = dfixed_const(8);
555 disp_clk_request_efficiency.full = dfixed_div(disp_clk_request_efficiency, a);
556 a.full = dfixed_const(32);
557 bandwidth.full = dfixed_mul(a, disp_clk);
558 bandwidth.full = dfixed_mul(bandwidth, disp_clk_request_efficiency);
559
560 return dfixed_trunc(bandwidth);
561}
562
563static u32 evergreen_available_bandwidth(struct evergreen_wm_params *wm)
564{
565 /* Calculate the Available bandwidth. Display can use this temporarily but not in average. */
566 u32 dram_bandwidth = evergreen_dram_bandwidth(wm);
567 u32 data_return_bandwidth = evergreen_data_return_bandwidth(wm);
568 u32 dmif_req_bandwidth = evergreen_dmif_request_bandwidth(wm);
569
570 return min(dram_bandwidth, min(data_return_bandwidth, dmif_req_bandwidth));
571}
572
573static u32 evergreen_average_bandwidth(struct evergreen_wm_params *wm)
574{
575 /* Calculate the display mode Average Bandwidth
576 * DisplayMode should contain the source and destination dimensions,
577 * timing, etc.
578 */
579 fixed20_12 bpp;
580 fixed20_12 line_time;
581 fixed20_12 src_width;
582 fixed20_12 bandwidth;
583 fixed20_12 a;
584
585 a.full = dfixed_const(1000);
586 line_time.full = dfixed_const(wm->active_time + wm->blank_time);
587 line_time.full = dfixed_div(line_time, a);
588 bpp.full = dfixed_const(wm->bytes_per_pixel);
589 src_width.full = dfixed_const(wm->src_width);
590 bandwidth.full = dfixed_mul(src_width, bpp);
591 bandwidth.full = dfixed_mul(bandwidth, wm->vsc);
592 bandwidth.full = dfixed_div(bandwidth, line_time);
593
594 return dfixed_trunc(bandwidth);
595}
596
597static u32 evergreen_latency_watermark(struct evergreen_wm_params *wm)
598{
599 /* First calcualte the latency in ns */
600 u32 mc_latency = 2000; /* 2000 ns. */
601 u32 available_bandwidth = evergreen_available_bandwidth(wm);
602 u32 worst_chunk_return_time = (512 * 8 * 1000) / available_bandwidth;
603 u32 cursor_line_pair_return_time = (128 * 4 * 1000) / available_bandwidth;
604 u32 dc_latency = 40000000 / wm->disp_clk; /* dc pipe latency */
605 u32 other_heads_data_return_time = ((wm->num_heads + 1) * worst_chunk_return_time) +
606 (wm->num_heads * cursor_line_pair_return_time);
607 u32 latency = mc_latency + other_heads_data_return_time + dc_latency;
608 u32 max_src_lines_per_dst_line, lb_fill_bw, line_fill_time;
609 fixed20_12 a, b, c;
610
611 if (wm->num_heads == 0)
612 return 0;
613
614 a.full = dfixed_const(2);
615 b.full = dfixed_const(1);
616 if ((wm->vsc.full > a.full) ||
617 ((wm->vsc.full > b.full) && (wm->vtaps >= 3)) ||
618 (wm->vtaps >= 5) ||
619 ((wm->vsc.full >= a.full) && wm->interlaced))
620 max_src_lines_per_dst_line = 4;
621 else
622 max_src_lines_per_dst_line = 2;
623
624 a.full = dfixed_const(available_bandwidth);
625 b.full = dfixed_const(wm->num_heads);
626 a.full = dfixed_div(a, b);
627
628 b.full = dfixed_const(1000);
629 c.full = dfixed_const(wm->disp_clk);
630 b.full = dfixed_div(c, b);
631 c.full = dfixed_const(wm->bytes_per_pixel);
632 b.full = dfixed_mul(b, c);
633
634 lb_fill_bw = min(dfixed_trunc(a), dfixed_trunc(b));
635
636 a.full = dfixed_const(max_src_lines_per_dst_line * wm->src_width * wm->bytes_per_pixel);
637 b.full = dfixed_const(1000);
638 c.full = dfixed_const(lb_fill_bw);
639 b.full = dfixed_div(c, b);
640 a.full = dfixed_div(a, b);
641 line_fill_time = dfixed_trunc(a);
642
643 if (line_fill_time < wm->active_time)
644 return latency;
645 else
646 return latency + (line_fill_time - wm->active_time);
647
648}
649
650static bool evergreen_average_bandwidth_vs_dram_bandwidth_for_display(struct evergreen_wm_params *wm)
651{
652 if (evergreen_average_bandwidth(wm) <=
653 (evergreen_dram_bandwidth_for_display(wm) / wm->num_heads))
654 return true;
655 else
656 return false;
657};
658
659static bool evergreen_average_bandwidth_vs_available_bandwidth(struct evergreen_wm_params *wm)
660{
661 if (evergreen_average_bandwidth(wm) <=
662 (evergreen_available_bandwidth(wm) / wm->num_heads))
663 return true;
664 else
665 return false;
666};
667
668static bool evergreen_check_latency_hiding(struct evergreen_wm_params *wm)
669{
670 u32 lb_partitions = wm->lb_size / wm->src_width;
671 u32 line_time = wm->active_time + wm->blank_time;
672 u32 latency_tolerant_lines;
673 u32 latency_hiding;
674 fixed20_12 a;
675
676 a.full = dfixed_const(1);
677 if (wm->vsc.full > a.full)
678 latency_tolerant_lines = 1;
679 else {
680 if (lb_partitions <= (wm->vtaps + 1))
681 latency_tolerant_lines = 1;
682 else
683 latency_tolerant_lines = 2;
684 }
685
686 latency_hiding = (latency_tolerant_lines * line_time + wm->blank_time);
687
688 if (evergreen_latency_watermark(wm) <= latency_hiding)
689 return true;
690 else
691 return false;
692}
693
694static void evergreen_program_watermarks(struct radeon_device *rdev,
695 struct radeon_crtc *radeon_crtc,
696 u32 lb_size, u32 num_heads)
697{
698 struct drm_display_mode *mode = &radeon_crtc->base.mode;
699 struct evergreen_wm_params wm;
700 u32 pixel_period;
701 u32 line_time = 0;
702 u32 latency_watermark_a = 0, latency_watermark_b = 0;
703 u32 priority_a_mark = 0, priority_b_mark = 0;
704 u32 priority_a_cnt = PRIORITY_OFF;
705 u32 priority_b_cnt = PRIORITY_OFF;
706 u32 pipe_offset = radeon_crtc->crtc_id * 16;
707 u32 tmp, arb_control3;
708 fixed20_12 a, b, c;
709
710 if (radeon_crtc->base.enabled && num_heads && mode) {
711 pixel_period = 1000000 / (u32)mode->clock;
712 line_time = min((u32)mode->crtc_htotal * pixel_period, (u32)65535);
713 priority_a_cnt = 0;
714 priority_b_cnt = 0;
715
716 wm.yclk = rdev->pm.current_mclk * 10;
717 wm.sclk = rdev->pm.current_sclk * 10;
718 wm.disp_clk = mode->clock;
719 wm.src_width = mode->crtc_hdisplay;
720 wm.active_time = mode->crtc_hdisplay * pixel_period;
721 wm.blank_time = line_time - wm.active_time;
722 wm.interlaced = false;
723 if (mode->flags & DRM_MODE_FLAG_INTERLACE)
724 wm.interlaced = true;
725 wm.vsc = radeon_crtc->vsc;
726 wm.vtaps = 1;
727 if (radeon_crtc->rmx_type != RMX_OFF)
728 wm.vtaps = 2;
729 wm.bytes_per_pixel = 4; /* XXX: get this from fb config */
730 wm.lb_size = lb_size;
731 wm.dram_channels = evergreen_get_number_of_dram_channels(rdev);
732 wm.num_heads = num_heads;
733
734 /* set for high clocks */
735 latency_watermark_a = min(evergreen_latency_watermark(&wm), (u32)65535);
736 /* set for low clocks */
737 /* wm.yclk = low clk; wm.sclk = low clk */
738 latency_watermark_b = min(evergreen_latency_watermark(&wm), (u32)65535);
739
740 /* possibly force display priority to high */
741 /* should really do this at mode validation time... */
742 if (!evergreen_average_bandwidth_vs_dram_bandwidth_for_display(&wm) ||
743 !evergreen_average_bandwidth_vs_available_bandwidth(&wm) ||
744 !evergreen_check_latency_hiding(&wm) ||
745 (rdev->disp_priority == 2)) {
746 DRM_INFO("force priority to high\n");
747 priority_a_cnt |= PRIORITY_ALWAYS_ON;
748 priority_b_cnt |= PRIORITY_ALWAYS_ON;
749 }
750
751 a.full = dfixed_const(1000);
752 b.full = dfixed_const(mode->clock);
753 b.full = dfixed_div(b, a);
754 c.full = dfixed_const(latency_watermark_a);
755 c.full = dfixed_mul(c, b);
756 c.full = dfixed_mul(c, radeon_crtc->hsc);
757 c.full = dfixed_div(c, a);
758 a.full = dfixed_const(16);
759 c.full = dfixed_div(c, a);
760 priority_a_mark = dfixed_trunc(c);
761 priority_a_cnt |= priority_a_mark & PRIORITY_MARK_MASK;
762
763 a.full = dfixed_const(1000);
764 b.full = dfixed_const(mode->clock);
765 b.full = dfixed_div(b, a);
766 c.full = dfixed_const(latency_watermark_b);
767 c.full = dfixed_mul(c, b);
768 c.full = dfixed_mul(c, radeon_crtc->hsc);
769 c.full = dfixed_div(c, a);
770 a.full = dfixed_const(16);
771 c.full = dfixed_div(c, a);
772 priority_b_mark = dfixed_trunc(c);
773 priority_b_cnt |= priority_b_mark & PRIORITY_MARK_MASK;
774 }
775
776 /* select wm A */
777 arb_control3 = RREG32(PIPE0_ARBITRATION_CONTROL3 + pipe_offset);
778 tmp = arb_control3;
779 tmp &= ~LATENCY_WATERMARK_MASK(3);
780 tmp |= LATENCY_WATERMARK_MASK(1);
781 WREG32(PIPE0_ARBITRATION_CONTROL3 + pipe_offset, tmp);
782 WREG32(PIPE0_LATENCY_CONTROL + pipe_offset,
783 (LATENCY_LOW_WATERMARK(latency_watermark_a) |
784 LATENCY_HIGH_WATERMARK(line_time)));
785 /* select wm B */
786 tmp = RREG32(PIPE0_ARBITRATION_CONTROL3 + pipe_offset);
787 tmp &= ~LATENCY_WATERMARK_MASK(3);
788 tmp |= LATENCY_WATERMARK_MASK(2);
789 WREG32(PIPE0_ARBITRATION_CONTROL3 + pipe_offset, tmp);
790 WREG32(PIPE0_LATENCY_CONTROL + pipe_offset,
791 (LATENCY_LOW_WATERMARK(latency_watermark_b) |
792 LATENCY_HIGH_WATERMARK(line_time)));
793 /* restore original selection */
794 WREG32(PIPE0_ARBITRATION_CONTROL3 + pipe_offset, arb_control3);
795
796 /* write the priority marks */
797 WREG32(PRIORITY_A_CNT + radeon_crtc->crtc_offset, priority_a_cnt);
798 WREG32(PRIORITY_B_CNT + radeon_crtc->crtc_offset, priority_b_cnt);
799
800}
801
287void evergreen_bandwidth_update(struct radeon_device *rdev) 802void evergreen_bandwidth_update(struct radeon_device *rdev)
288{ 803{
289 /* XXX */ 804 struct drm_display_mode *mode0 = NULL;
805 struct drm_display_mode *mode1 = NULL;
806 u32 num_heads = 0, lb_size;
807 int i;
808
809 radeon_update_display_priority(rdev);
810
811 for (i = 0; i < rdev->num_crtc; i++) {
812 if (rdev->mode_info.crtcs[i]->base.enabled)
813 num_heads++;
814 }
815 for (i = 0; i < rdev->num_crtc; i += 2) {
816 mode0 = &rdev->mode_info.crtcs[i]->base.mode;
817 mode1 = &rdev->mode_info.crtcs[i+1]->base.mode;
818 lb_size = evergreen_line_buffer_adjust(rdev, rdev->mode_info.crtcs[i], mode0, mode1);
819 evergreen_program_watermarks(rdev, rdev->mode_info.crtcs[i], lb_size, num_heads);
820 lb_size = evergreen_line_buffer_adjust(rdev, rdev->mode_info.crtcs[i+1], mode1, mode0);
821 evergreen_program_watermarks(rdev, rdev->mode_info.crtcs[i+1], lb_size, num_heads);
822 }
290} 823}
291 824
292static int evergreen_mc_wait_for_idle(struct radeon_device *rdev) 825int evergreen_mc_wait_for_idle(struct radeon_device *rdev)
293{ 826{
294 unsigned i; 827 unsigned i;
295 u32 tmp; 828 u32 tmp;
@@ -312,6 +845,8 @@ void evergreen_pcie_gart_tlb_flush(struct radeon_device *rdev)
312 unsigned i; 845 unsigned i;
313 u32 tmp; 846 u32 tmp;
314 847
848 WREG32(HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1);
849
315 WREG32(VM_CONTEXT0_REQUEST_RESPONSE, REQUEST_TYPE(1)); 850 WREG32(VM_CONTEXT0_REQUEST_RESPONSE, REQUEST_TYPE(1));
316 for (i = 0; i < rdev->usec_timeout; i++) { 851 for (i = 0; i < rdev->usec_timeout; i++) {
317 /* read MC_STATUS */ 852 /* read MC_STATUS */
@@ -352,9 +887,15 @@ int evergreen_pcie_gart_enable(struct radeon_device *rdev)
352 SYSTEM_ACCESS_MODE_NOT_IN_SYS | 887 SYSTEM_ACCESS_MODE_NOT_IN_SYS |
353 SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU | 888 SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU |
354 EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5); 889 EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5);
355 WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp); 890 if (rdev->flags & RADEON_IS_IGP) {
356 WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp); 891 WREG32(FUS_MC_VM_MD_L1_TLB0_CNTL, tmp);
357 WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp); 892 WREG32(FUS_MC_VM_MD_L1_TLB1_CNTL, tmp);
893 WREG32(FUS_MC_VM_MD_L1_TLB2_CNTL, tmp);
894 } else {
895 WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp);
896 WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp);
897 WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp);
898 }
358 WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp); 899 WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp);
359 WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp); 900 WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp);
360 WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp); 901 WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp);
@@ -440,53 +981,73 @@ void evergreen_agp_enable(struct radeon_device *rdev)
440 WREG32(VM_CONTEXT1_CNTL, 0); 981 WREG32(VM_CONTEXT1_CNTL, 0);
441} 982}
442 983
443static void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_save *save) 984void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_save *save)
444{ 985{
445 save->vga_control[0] = RREG32(D1VGA_CONTROL); 986 save->vga_control[0] = RREG32(D1VGA_CONTROL);
446 save->vga_control[1] = RREG32(D2VGA_CONTROL); 987 save->vga_control[1] = RREG32(D2VGA_CONTROL);
447 save->vga_control[2] = RREG32(EVERGREEN_D3VGA_CONTROL);
448 save->vga_control[3] = RREG32(EVERGREEN_D4VGA_CONTROL);
449 save->vga_control[4] = RREG32(EVERGREEN_D5VGA_CONTROL);
450 save->vga_control[5] = RREG32(EVERGREEN_D6VGA_CONTROL);
451 save->vga_render_control = RREG32(VGA_RENDER_CONTROL); 988 save->vga_render_control = RREG32(VGA_RENDER_CONTROL);
452 save->vga_hdp_control = RREG32(VGA_HDP_CONTROL); 989 save->vga_hdp_control = RREG32(VGA_HDP_CONTROL);
453 save->crtc_control[0] = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET); 990 save->crtc_control[0] = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET);
454 save->crtc_control[1] = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET); 991 save->crtc_control[1] = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET);
455 save->crtc_control[2] = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET); 992 if (rdev->num_crtc >= 4) {
456 save->crtc_control[3] = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET); 993 save->vga_control[2] = RREG32(EVERGREEN_D3VGA_CONTROL);
457 save->crtc_control[4] = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET); 994 save->vga_control[3] = RREG32(EVERGREEN_D4VGA_CONTROL);
458 save->crtc_control[5] = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET); 995 save->crtc_control[2] = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET);
996 save->crtc_control[3] = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET);
997 }
998 if (rdev->num_crtc >= 6) {
999 save->vga_control[4] = RREG32(EVERGREEN_D5VGA_CONTROL);
1000 save->vga_control[5] = RREG32(EVERGREEN_D6VGA_CONTROL);
1001 save->crtc_control[4] = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET);
1002 save->crtc_control[5] = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET);
1003 }
459 1004
460 /* Stop all video */ 1005 /* Stop all video */
461 WREG32(VGA_RENDER_CONTROL, 0); 1006 WREG32(VGA_RENDER_CONTROL, 0);
462 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC0_REGISTER_OFFSET, 1); 1007 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC0_REGISTER_OFFSET, 1);
463 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC1_REGISTER_OFFSET, 1); 1008 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC1_REGISTER_OFFSET, 1);
464 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC2_REGISTER_OFFSET, 1); 1009 if (rdev->num_crtc >= 4) {
465 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC3_REGISTER_OFFSET, 1); 1010 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC2_REGISTER_OFFSET, 1);
466 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC4_REGISTER_OFFSET, 1); 1011 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC3_REGISTER_OFFSET, 1);
467 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC5_REGISTER_OFFSET, 1); 1012 }
1013 if (rdev->num_crtc >= 6) {
1014 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC4_REGISTER_OFFSET, 1);
1015 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC5_REGISTER_OFFSET, 1);
1016 }
468 WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, 0); 1017 WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, 0);
469 WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, 0); 1018 WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, 0);
470 WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, 0); 1019 if (rdev->num_crtc >= 4) {
471 WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, 0); 1020 WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, 0);
472 WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, 0); 1021 WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, 0);
473 WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, 0); 1022 }
1023 if (rdev->num_crtc >= 6) {
1024 WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, 0);
1025 WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, 0);
1026 }
474 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC0_REGISTER_OFFSET, 0); 1027 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC0_REGISTER_OFFSET, 0);
475 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC1_REGISTER_OFFSET, 0); 1028 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC1_REGISTER_OFFSET, 0);
476 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC2_REGISTER_OFFSET, 0); 1029 if (rdev->num_crtc >= 4) {
477 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC3_REGISTER_OFFSET, 0); 1030 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC2_REGISTER_OFFSET, 0);
478 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC4_REGISTER_OFFSET, 0); 1031 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC3_REGISTER_OFFSET, 0);
479 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC5_REGISTER_OFFSET, 0); 1032 }
1033 if (rdev->num_crtc >= 6) {
1034 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC4_REGISTER_OFFSET, 0);
1035 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC5_REGISTER_OFFSET, 0);
1036 }
480 1037
481 WREG32(D1VGA_CONTROL, 0); 1038 WREG32(D1VGA_CONTROL, 0);
482 WREG32(D2VGA_CONTROL, 0); 1039 WREG32(D2VGA_CONTROL, 0);
483 WREG32(EVERGREEN_D3VGA_CONTROL, 0); 1040 if (rdev->num_crtc >= 4) {
484 WREG32(EVERGREEN_D4VGA_CONTROL, 0); 1041 WREG32(EVERGREEN_D3VGA_CONTROL, 0);
485 WREG32(EVERGREEN_D5VGA_CONTROL, 0); 1042 WREG32(EVERGREEN_D4VGA_CONTROL, 0);
486 WREG32(EVERGREEN_D6VGA_CONTROL, 0); 1043 }
1044 if (rdev->num_crtc >= 6) {
1045 WREG32(EVERGREEN_D5VGA_CONTROL, 0);
1046 WREG32(EVERGREEN_D6VGA_CONTROL, 0);
1047 }
487} 1048}
488 1049
489static void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *save) 1050void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *save)
490{ 1051{
491 WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH + EVERGREEN_CRTC0_REGISTER_OFFSET, 1052 WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH + EVERGREEN_CRTC0_REGISTER_OFFSET,
492 upper_32_bits(rdev->mc.vram_start)); 1053 upper_32_bits(rdev->mc.vram_start));
@@ -506,41 +1067,44 @@ static void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_
506 WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS + EVERGREEN_CRTC1_REGISTER_OFFSET, 1067 WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS + EVERGREEN_CRTC1_REGISTER_OFFSET,
507 (u32)rdev->mc.vram_start); 1068 (u32)rdev->mc.vram_start);
508 1069
509 WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH + EVERGREEN_CRTC2_REGISTER_OFFSET, 1070 if (rdev->num_crtc >= 4) {
510 upper_32_bits(rdev->mc.vram_start)); 1071 WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH + EVERGREEN_CRTC2_REGISTER_OFFSET,
511 WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH + EVERGREEN_CRTC2_REGISTER_OFFSET, 1072 upper_32_bits(rdev->mc.vram_start));
512 upper_32_bits(rdev->mc.vram_start)); 1073 WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH + EVERGREEN_CRTC2_REGISTER_OFFSET,
513 WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS + EVERGREEN_CRTC2_REGISTER_OFFSET, 1074 upper_32_bits(rdev->mc.vram_start));
514 (u32)rdev->mc.vram_start); 1075 WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS + EVERGREEN_CRTC2_REGISTER_OFFSET,
515 WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS + EVERGREEN_CRTC2_REGISTER_OFFSET, 1076 (u32)rdev->mc.vram_start);
516 (u32)rdev->mc.vram_start); 1077 WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS + EVERGREEN_CRTC2_REGISTER_OFFSET,
517 1078 (u32)rdev->mc.vram_start);
518 WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH + EVERGREEN_CRTC3_REGISTER_OFFSET, 1079
519 upper_32_bits(rdev->mc.vram_start)); 1080 WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH + EVERGREEN_CRTC3_REGISTER_OFFSET,
520 WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH + EVERGREEN_CRTC3_REGISTER_OFFSET, 1081 upper_32_bits(rdev->mc.vram_start));
521 upper_32_bits(rdev->mc.vram_start)); 1082 WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH + EVERGREEN_CRTC3_REGISTER_OFFSET,
522 WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS + EVERGREEN_CRTC3_REGISTER_OFFSET, 1083 upper_32_bits(rdev->mc.vram_start));
523 (u32)rdev->mc.vram_start); 1084 WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS + EVERGREEN_CRTC3_REGISTER_OFFSET,
524 WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS + EVERGREEN_CRTC3_REGISTER_OFFSET, 1085 (u32)rdev->mc.vram_start);
525 (u32)rdev->mc.vram_start); 1086 WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS + EVERGREEN_CRTC3_REGISTER_OFFSET,
526 1087 (u32)rdev->mc.vram_start);
527 WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH + EVERGREEN_CRTC4_REGISTER_OFFSET, 1088 }
528 upper_32_bits(rdev->mc.vram_start)); 1089 if (rdev->num_crtc >= 6) {
529 WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH + EVERGREEN_CRTC4_REGISTER_OFFSET, 1090 WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH + EVERGREEN_CRTC4_REGISTER_OFFSET,
530 upper_32_bits(rdev->mc.vram_start)); 1091 upper_32_bits(rdev->mc.vram_start));
531 WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS + EVERGREEN_CRTC4_REGISTER_OFFSET, 1092 WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH + EVERGREEN_CRTC4_REGISTER_OFFSET,
532 (u32)rdev->mc.vram_start); 1093 upper_32_bits(rdev->mc.vram_start));
533 WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS + EVERGREEN_CRTC4_REGISTER_OFFSET, 1094 WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS + EVERGREEN_CRTC4_REGISTER_OFFSET,
534 (u32)rdev->mc.vram_start); 1095 (u32)rdev->mc.vram_start);
535 1096 WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS + EVERGREEN_CRTC4_REGISTER_OFFSET,
536 WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH + EVERGREEN_CRTC5_REGISTER_OFFSET, 1097 (u32)rdev->mc.vram_start);
537 upper_32_bits(rdev->mc.vram_start)); 1098
538 WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH + EVERGREEN_CRTC5_REGISTER_OFFSET, 1099 WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH + EVERGREEN_CRTC5_REGISTER_OFFSET,
539 upper_32_bits(rdev->mc.vram_start)); 1100 upper_32_bits(rdev->mc.vram_start));
540 WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS + EVERGREEN_CRTC5_REGISTER_OFFSET, 1101 WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH + EVERGREEN_CRTC5_REGISTER_OFFSET,
541 (u32)rdev->mc.vram_start); 1102 upper_32_bits(rdev->mc.vram_start));
542 WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS + EVERGREEN_CRTC5_REGISTER_OFFSET, 1103 WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS + EVERGREEN_CRTC5_REGISTER_OFFSET,
543 (u32)rdev->mc.vram_start); 1104 (u32)rdev->mc.vram_start);
1105 WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS + EVERGREEN_CRTC5_REGISTER_OFFSET,
1106 (u32)rdev->mc.vram_start);
1107 }
544 1108
545 WREG32(EVERGREEN_VGA_MEMORY_BASE_ADDRESS_HIGH, upper_32_bits(rdev->mc.vram_start)); 1109 WREG32(EVERGREEN_VGA_MEMORY_BASE_ADDRESS_HIGH, upper_32_bits(rdev->mc.vram_start));
546 WREG32(EVERGREEN_VGA_MEMORY_BASE_ADDRESS, (u32)rdev->mc.vram_start); 1110 WREG32(EVERGREEN_VGA_MEMORY_BASE_ADDRESS, (u32)rdev->mc.vram_start);
@@ -550,32 +1114,48 @@ static void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_
550 /* Restore video state */ 1114 /* Restore video state */
551 WREG32(D1VGA_CONTROL, save->vga_control[0]); 1115 WREG32(D1VGA_CONTROL, save->vga_control[0]);
552 WREG32(D2VGA_CONTROL, save->vga_control[1]); 1116 WREG32(D2VGA_CONTROL, save->vga_control[1]);
553 WREG32(EVERGREEN_D3VGA_CONTROL, save->vga_control[2]); 1117 if (rdev->num_crtc >= 4) {
554 WREG32(EVERGREEN_D4VGA_CONTROL, save->vga_control[3]); 1118 WREG32(EVERGREEN_D3VGA_CONTROL, save->vga_control[2]);
555 WREG32(EVERGREEN_D5VGA_CONTROL, save->vga_control[4]); 1119 WREG32(EVERGREEN_D4VGA_CONTROL, save->vga_control[3]);
556 WREG32(EVERGREEN_D6VGA_CONTROL, save->vga_control[5]); 1120 }
1121 if (rdev->num_crtc >= 6) {
1122 WREG32(EVERGREEN_D5VGA_CONTROL, save->vga_control[4]);
1123 WREG32(EVERGREEN_D6VGA_CONTROL, save->vga_control[5]);
1124 }
557 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC0_REGISTER_OFFSET, 1); 1125 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC0_REGISTER_OFFSET, 1);
558 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC1_REGISTER_OFFSET, 1); 1126 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC1_REGISTER_OFFSET, 1);
559 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC2_REGISTER_OFFSET, 1); 1127 if (rdev->num_crtc >= 4) {
560 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC3_REGISTER_OFFSET, 1); 1128 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC2_REGISTER_OFFSET, 1);
561 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC4_REGISTER_OFFSET, 1); 1129 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC3_REGISTER_OFFSET, 1);
562 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC5_REGISTER_OFFSET, 1); 1130 }
1131 if (rdev->num_crtc >= 6) {
1132 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC4_REGISTER_OFFSET, 1);
1133 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC5_REGISTER_OFFSET, 1);
1134 }
563 WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, save->crtc_control[0]); 1135 WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, save->crtc_control[0]);
564 WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, save->crtc_control[1]); 1136 WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, save->crtc_control[1]);
565 WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, save->crtc_control[2]); 1137 if (rdev->num_crtc >= 4) {
566 WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, save->crtc_control[3]); 1138 WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, save->crtc_control[2]);
567 WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, save->crtc_control[4]); 1139 WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, save->crtc_control[3]);
568 WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, save->crtc_control[5]); 1140 }
1141 if (rdev->num_crtc >= 6) {
1142 WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, save->crtc_control[4]);
1143 WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, save->crtc_control[5]);
1144 }
569 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC0_REGISTER_OFFSET, 0); 1145 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC0_REGISTER_OFFSET, 0);
570 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC1_REGISTER_OFFSET, 0); 1146 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC1_REGISTER_OFFSET, 0);
571 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC2_REGISTER_OFFSET, 0); 1147 if (rdev->num_crtc >= 4) {
572 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC3_REGISTER_OFFSET, 0); 1148 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC2_REGISTER_OFFSET, 0);
573 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC4_REGISTER_OFFSET, 0); 1149 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC3_REGISTER_OFFSET, 0);
574 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC5_REGISTER_OFFSET, 0); 1150 }
1151 if (rdev->num_crtc >= 6) {
1152 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC4_REGISTER_OFFSET, 0);
1153 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC5_REGISTER_OFFSET, 0);
1154 }
575 WREG32(VGA_RENDER_CONTROL, save->vga_render_control); 1155 WREG32(VGA_RENDER_CONTROL, save->vga_render_control);
576} 1156}
577 1157
578static void evergreen_mc_program(struct radeon_device *rdev) 1158void evergreen_mc_program(struct radeon_device *rdev)
579{ 1159{
580 struct evergreen_mc_save save; 1160 struct evergreen_mc_save save;
581 u32 tmp; 1161 u32 tmp;
@@ -619,11 +1199,17 @@ static void evergreen_mc_program(struct radeon_device *rdev)
619 rdev->mc.vram_end >> 12); 1199 rdev->mc.vram_end >> 12);
620 } 1200 }
621 WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR, 0); 1201 WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR, 0);
1202 if (rdev->flags & RADEON_IS_IGP) {
1203 tmp = RREG32(MC_FUS_VM_FB_OFFSET) & 0x000FFFFF;
1204 tmp |= ((rdev->mc.vram_end >> 20) & 0xF) << 24;
1205 tmp |= ((rdev->mc.vram_start >> 20) & 0xF) << 20;
1206 WREG32(MC_FUS_VM_FB_OFFSET, tmp);
1207 }
622 tmp = ((rdev->mc.vram_end >> 24) & 0xFFFF) << 16; 1208 tmp = ((rdev->mc.vram_end >> 24) & 0xFFFF) << 16;
623 tmp |= ((rdev->mc.vram_start >> 24) & 0xFFFF); 1209 tmp |= ((rdev->mc.vram_start >> 24) & 0xFFFF);
624 WREG32(MC_VM_FB_LOCATION, tmp); 1210 WREG32(MC_VM_FB_LOCATION, tmp);
625 WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8)); 1211 WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8));
626 WREG32(HDP_NONSURFACE_INFO, (2 << 7)); 1212 WREG32(HDP_NONSURFACE_INFO, (2 << 7) | (1 << 30));
627 WREG32(HDP_NONSURFACE_SIZE, 0x3FFFFFFF); 1213 WREG32(HDP_NONSURFACE_SIZE, 0x3FFFFFFF);
628 if (rdev->flags & RADEON_IS_AGP) { 1214 if (rdev->flags & RADEON_IS_AGP) {
629 WREG32(MC_VM_AGP_TOP, rdev->mc.gtt_end >> 16); 1215 WREG32(MC_VM_AGP_TOP, rdev->mc.gtt_end >> 16);
@@ -646,6 +1232,22 @@ static void evergreen_mc_program(struct radeon_device *rdev)
646/* 1232/*
647 * CP. 1233 * CP.
648 */ 1234 */
1235void evergreen_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib)
1236{
1237 /* set to DX10/11 mode */
1238 radeon_ring_write(rdev, PACKET3(PACKET3_MODE_CONTROL, 0));
1239 radeon_ring_write(rdev, 1);
1240 /* FIXME: implement */
1241 radeon_ring_write(rdev, PACKET3(PACKET3_INDIRECT_BUFFER, 2));
1242 radeon_ring_write(rdev,
1243#ifdef __BIG_ENDIAN
1244 (2 << 0) |
1245#endif
1246 (ib->gpu_addr & 0xFFFFFFFC));
1247 radeon_ring_write(rdev, upper_32_bits(ib->gpu_addr) & 0xFF);
1248 radeon_ring_write(rdev, ib->length_dw);
1249}
1250
649 1251
650static int evergreen_cp_load_microcode(struct radeon_device *rdev) 1252static int evergreen_cp_load_microcode(struct radeon_device *rdev)
651{ 1253{
@@ -656,7 +1258,11 @@ static int evergreen_cp_load_microcode(struct radeon_device *rdev)
656 return -EINVAL; 1258 return -EINVAL;
657 1259
658 r700_cp_stop(rdev); 1260 r700_cp_stop(rdev);
659 WREG32(CP_RB_CNTL, RB_NO_UPDATE | (15 << 8) | (3 << 0)); 1261 WREG32(CP_RB_CNTL,
1262#ifdef __BIG_ENDIAN
1263 BUF_SWAP_32BIT |
1264#endif
1265 RB_NO_UPDATE | RB_BLKSZ(15) | RB_BUFSZ(3));
660 1266
661 fw_data = (const __be32 *)rdev->pfp_fw->data; 1267 fw_data = (const __be32 *)rdev->pfp_fw->data;
662 WREG32(CP_PFP_UCODE_ADDR, 0); 1268 WREG32(CP_PFP_UCODE_ADDR, 0);
@@ -677,7 +1283,7 @@ static int evergreen_cp_load_microcode(struct radeon_device *rdev)
677 1283
678static int evergreen_cp_start(struct radeon_device *rdev) 1284static int evergreen_cp_start(struct radeon_device *rdev)
679{ 1285{
680 int r; 1286 int r, i;
681 uint32_t cp_me; 1287 uint32_t cp_me;
682 1288
683 r = radeon_ring_lock(rdev, 7); 1289 r = radeon_ring_lock(rdev, 7);
@@ -697,16 +1303,44 @@ static int evergreen_cp_start(struct radeon_device *rdev)
697 cp_me = 0xff; 1303 cp_me = 0xff;
698 WREG32(CP_ME_CNTL, cp_me); 1304 WREG32(CP_ME_CNTL, cp_me);
699 1305
700 r = radeon_ring_lock(rdev, 4); 1306 r = radeon_ring_lock(rdev, evergreen_default_size + 19);
701 if (r) { 1307 if (r) {
702 DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r); 1308 DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r);
703 return r; 1309 return r;
704 } 1310 }
705 /* init some VGT regs */ 1311
706 radeon_ring_write(rdev, PACKET3(PACKET3_SET_CONTEXT_REG, 2)); 1312 /* setup clear context state */
707 radeon_ring_write(rdev, (VGT_VERTEX_REUSE_BLOCK_CNTL - PACKET3_SET_CONTEXT_REG_START) >> 2); 1313 radeon_ring_write(rdev, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
708 radeon_ring_write(rdev, 0xe); 1314 radeon_ring_write(rdev, PACKET3_PREAMBLE_BEGIN_CLEAR_STATE);
709 radeon_ring_write(rdev, 0x10); 1315
1316 for (i = 0; i < evergreen_default_size; i++)
1317 radeon_ring_write(rdev, evergreen_default_state[i]);
1318
1319 radeon_ring_write(rdev, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
1320 radeon_ring_write(rdev, PACKET3_PREAMBLE_END_CLEAR_STATE);
1321
1322 /* set clear context state */
1323 radeon_ring_write(rdev, PACKET3(PACKET3_CLEAR_STATE, 0));
1324 radeon_ring_write(rdev, 0);
1325
1326 /* SQ_VTX_BASE_VTX_LOC */
1327 radeon_ring_write(rdev, 0xc0026f00);
1328 radeon_ring_write(rdev, 0x00000000);
1329 radeon_ring_write(rdev, 0x00000000);
1330 radeon_ring_write(rdev, 0x00000000);
1331
1332 /* Clear consts */
1333 radeon_ring_write(rdev, 0xc0036f00);
1334 radeon_ring_write(rdev, 0x00000bc4);
1335 radeon_ring_write(rdev, 0xffffffff);
1336 radeon_ring_write(rdev, 0xffffffff);
1337 radeon_ring_write(rdev, 0xffffffff);
1338
1339 radeon_ring_write(rdev, 0xc0026900);
1340 radeon_ring_write(rdev, 0x00000316);
1341 radeon_ring_write(rdev, 0x0000000e); /* VGT_VERTEX_REUSE_BLOCK_CNTL */
1342 radeon_ring_write(rdev, 0x00000010); /* */
1343
710 radeon_ring_unlock_commit(rdev); 1344 radeon_ring_unlock_commit(rdev);
711 1345
712 return 0; 1346 return 0;
@@ -731,7 +1365,7 @@ int evergreen_cp_resume(struct radeon_device *rdev)
731 1365
732 /* Set ring buffer size */ 1366 /* Set ring buffer size */
733 rb_bufsz = drm_order(rdev->cp.ring_size / 8); 1367 rb_bufsz = drm_order(rdev->cp.ring_size / 8);
734 tmp = RB_NO_UPDATE | (drm_order(RADEON_GPU_PAGE_SIZE/8) << 8) | rb_bufsz; 1368 tmp = (drm_order(RADEON_GPU_PAGE_SIZE/8) << 8) | rb_bufsz;
735#ifdef __BIG_ENDIAN 1369#ifdef __BIG_ENDIAN
736 tmp |= BUF_SWAP_32BIT; 1370 tmp |= BUF_SWAP_32BIT;
737#endif 1371#endif
@@ -745,8 +1379,23 @@ int evergreen_cp_resume(struct radeon_device *rdev)
745 WREG32(CP_RB_CNTL, tmp | RB_RPTR_WR_ENA); 1379 WREG32(CP_RB_CNTL, tmp | RB_RPTR_WR_ENA);
746 WREG32(CP_RB_RPTR_WR, 0); 1380 WREG32(CP_RB_RPTR_WR, 0);
747 WREG32(CP_RB_WPTR, 0); 1381 WREG32(CP_RB_WPTR, 0);
748 WREG32(CP_RB_RPTR_ADDR, rdev->cp.gpu_addr & 0xFFFFFFFF); 1382
749 WREG32(CP_RB_RPTR_ADDR_HI, upper_32_bits(rdev->cp.gpu_addr)); 1383 /* set the wb address wether it's enabled or not */
1384 WREG32(CP_RB_RPTR_ADDR,
1385#ifdef __BIG_ENDIAN
1386 RB_RPTR_SWAP(2) |
1387#endif
1388 ((rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFFFFFFFC));
1389 WREG32(CP_RB_RPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFF);
1390 WREG32(SCRATCH_ADDR, ((rdev->wb.gpu_addr + RADEON_WB_SCRATCH_OFFSET) >> 8) & 0xFFFFFFFF);
1391
1392 if (rdev->wb.enabled)
1393 WREG32(SCRATCH_UMSK, 0xff);
1394 else {
1395 tmp |= RB_NO_UPDATE;
1396 WREG32(SCRATCH_UMSK, 0);
1397 }
1398
750 mdelay(1); 1399 mdelay(1);
751 WREG32(CP_RB_CNTL, tmp); 1400 WREG32(CP_RB_CNTL, tmp);
752 1401
@@ -813,11 +1462,17 @@ static u32 evergreen_get_tile_pipe_to_backend_map(struct radeon_device *rdev,
813 switch (rdev->family) { 1462 switch (rdev->family) {
814 case CHIP_CEDAR: 1463 case CHIP_CEDAR:
815 case CHIP_REDWOOD: 1464 case CHIP_REDWOOD:
1465 case CHIP_PALM:
1466 case CHIP_SUMO:
1467 case CHIP_SUMO2:
1468 case CHIP_TURKS:
1469 case CHIP_CAICOS:
816 force_no_swizzle = false; 1470 force_no_swizzle = false;
817 break; 1471 break;
818 case CHIP_CYPRESS: 1472 case CHIP_CYPRESS:
819 case CHIP_HEMLOCK: 1473 case CHIP_HEMLOCK:
820 case CHIP_JUNIPER: 1474 case CHIP_JUNIPER:
1475 case CHIP_BARTS:
821 default: 1476 default:
822 force_no_swizzle = true; 1477 force_no_swizzle = true;
823 break; 1478 break;
@@ -912,6 +1567,48 @@ static u32 evergreen_get_tile_pipe_to_backend_map(struct radeon_device *rdev,
912 return backend_map; 1567 return backend_map;
913} 1568}
914 1569
1570static void evergreen_program_channel_remap(struct radeon_device *rdev)
1571{
1572 u32 tcp_chan_steer_lo, tcp_chan_steer_hi, mc_shared_chremap, tmp;
1573
1574 tmp = RREG32(MC_SHARED_CHMAP);
1575 switch ((tmp & NOOFCHAN_MASK) >> NOOFCHAN_SHIFT) {
1576 case 0:
1577 case 1:
1578 case 2:
1579 case 3:
1580 default:
1581 /* default mapping */
1582 mc_shared_chremap = 0x00fac688;
1583 break;
1584 }
1585
1586 switch (rdev->family) {
1587 case CHIP_HEMLOCK:
1588 case CHIP_CYPRESS:
1589 case CHIP_BARTS:
1590 tcp_chan_steer_lo = 0x54763210;
1591 tcp_chan_steer_hi = 0x0000ba98;
1592 break;
1593 case CHIP_JUNIPER:
1594 case CHIP_REDWOOD:
1595 case CHIP_CEDAR:
1596 case CHIP_PALM:
1597 case CHIP_SUMO:
1598 case CHIP_SUMO2:
1599 case CHIP_TURKS:
1600 case CHIP_CAICOS:
1601 default:
1602 tcp_chan_steer_lo = 0x76543210;
1603 tcp_chan_steer_hi = 0x0000ba98;
1604 break;
1605 }
1606
1607 WREG32(TCP_CHAN_STEER_LO, tcp_chan_steer_lo);
1608 WREG32(TCP_CHAN_STEER_HI, tcp_chan_steer_hi);
1609 WREG32(MC_SHARED_CHREMAP, mc_shared_chremap);
1610}
1611
915static void evergreen_gpu_init(struct radeon_device *rdev) 1612static void evergreen_gpu_init(struct radeon_device *rdev)
916{ 1613{
917 u32 cc_rb_backend_disable = 0; 1614 u32 cc_rb_backend_disable = 0;
@@ -933,7 +1630,7 @@ static void evergreen_gpu_init(struct radeon_device *rdev)
933 u32 sq_stack_resource_mgmt_2; 1630 u32 sq_stack_resource_mgmt_2;
934 u32 sq_stack_resource_mgmt_3; 1631 u32 sq_stack_resource_mgmt_3;
935 u32 vgt_cache_invalidation; 1632 u32 vgt_cache_invalidation;
936 u32 hdp_host_path_cntl; 1633 u32 hdp_host_path_cntl, tmp;
937 int i, j, num_shader_engines, ps_thread_count; 1634 int i, j, num_shader_engines, ps_thread_count;
938 1635
939 switch (rdev->family) { 1636 switch (rdev->family) {
@@ -1023,6 +1720,138 @@ static void evergreen_gpu_init(struct radeon_device *rdev)
1023 rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; 1720 rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
1024 rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; 1721 rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
1025 break; 1722 break;
1723 case CHIP_PALM:
1724 rdev->config.evergreen.num_ses = 1;
1725 rdev->config.evergreen.max_pipes = 2;
1726 rdev->config.evergreen.max_tile_pipes = 2;
1727 rdev->config.evergreen.max_simds = 2;
1728 rdev->config.evergreen.max_backends = 1 * rdev->config.evergreen.num_ses;
1729 rdev->config.evergreen.max_gprs = 256;
1730 rdev->config.evergreen.max_threads = 192;
1731 rdev->config.evergreen.max_gs_threads = 16;
1732 rdev->config.evergreen.max_stack_entries = 256;
1733 rdev->config.evergreen.sx_num_of_sets = 4;
1734 rdev->config.evergreen.sx_max_export_size = 128;
1735 rdev->config.evergreen.sx_max_export_pos_size = 32;
1736 rdev->config.evergreen.sx_max_export_smx_size = 96;
1737 rdev->config.evergreen.max_hw_contexts = 4;
1738 rdev->config.evergreen.sq_num_cf_insts = 1;
1739
1740 rdev->config.evergreen.sc_prim_fifo_size = 0x40;
1741 rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
1742 rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
1743 break;
1744 case CHIP_SUMO:
1745 rdev->config.evergreen.num_ses = 1;
1746 rdev->config.evergreen.max_pipes = 4;
1747 rdev->config.evergreen.max_tile_pipes = 2;
1748 if (rdev->pdev->device == 0x9648)
1749 rdev->config.evergreen.max_simds = 3;
1750 else if ((rdev->pdev->device == 0x9647) ||
1751 (rdev->pdev->device == 0x964a))
1752 rdev->config.evergreen.max_simds = 4;
1753 else
1754 rdev->config.evergreen.max_simds = 5;
1755 rdev->config.evergreen.max_backends = 2 * rdev->config.evergreen.num_ses;
1756 rdev->config.evergreen.max_gprs = 256;
1757 rdev->config.evergreen.max_threads = 248;
1758 rdev->config.evergreen.max_gs_threads = 32;
1759 rdev->config.evergreen.max_stack_entries = 256;
1760 rdev->config.evergreen.sx_num_of_sets = 4;
1761 rdev->config.evergreen.sx_max_export_size = 256;
1762 rdev->config.evergreen.sx_max_export_pos_size = 64;
1763 rdev->config.evergreen.sx_max_export_smx_size = 192;
1764 rdev->config.evergreen.max_hw_contexts = 8;
1765 rdev->config.evergreen.sq_num_cf_insts = 2;
1766
1767 rdev->config.evergreen.sc_prim_fifo_size = 0x40;
1768 rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
1769 rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
1770 break;
1771 case CHIP_SUMO2:
1772 rdev->config.evergreen.num_ses = 1;
1773 rdev->config.evergreen.max_pipes = 4;
1774 rdev->config.evergreen.max_tile_pipes = 4;
1775 rdev->config.evergreen.max_simds = 2;
1776 rdev->config.evergreen.max_backends = 1 * rdev->config.evergreen.num_ses;
1777 rdev->config.evergreen.max_gprs = 256;
1778 rdev->config.evergreen.max_threads = 248;
1779 rdev->config.evergreen.max_gs_threads = 32;
1780 rdev->config.evergreen.max_stack_entries = 512;
1781 rdev->config.evergreen.sx_num_of_sets = 4;
1782 rdev->config.evergreen.sx_max_export_size = 256;
1783 rdev->config.evergreen.sx_max_export_pos_size = 64;
1784 rdev->config.evergreen.sx_max_export_smx_size = 192;
1785 rdev->config.evergreen.max_hw_contexts = 8;
1786 rdev->config.evergreen.sq_num_cf_insts = 2;
1787
1788 rdev->config.evergreen.sc_prim_fifo_size = 0x40;
1789 rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
1790 rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
1791 break;
1792 case CHIP_BARTS:
1793 rdev->config.evergreen.num_ses = 2;
1794 rdev->config.evergreen.max_pipes = 4;
1795 rdev->config.evergreen.max_tile_pipes = 8;
1796 rdev->config.evergreen.max_simds = 7;
1797 rdev->config.evergreen.max_backends = 4 * rdev->config.evergreen.num_ses;
1798 rdev->config.evergreen.max_gprs = 256;
1799 rdev->config.evergreen.max_threads = 248;
1800 rdev->config.evergreen.max_gs_threads = 32;
1801 rdev->config.evergreen.max_stack_entries = 512;
1802 rdev->config.evergreen.sx_num_of_sets = 4;
1803 rdev->config.evergreen.sx_max_export_size = 256;
1804 rdev->config.evergreen.sx_max_export_pos_size = 64;
1805 rdev->config.evergreen.sx_max_export_smx_size = 192;
1806 rdev->config.evergreen.max_hw_contexts = 8;
1807 rdev->config.evergreen.sq_num_cf_insts = 2;
1808
1809 rdev->config.evergreen.sc_prim_fifo_size = 0x100;
1810 rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
1811 rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
1812 break;
1813 case CHIP_TURKS:
1814 rdev->config.evergreen.num_ses = 1;
1815 rdev->config.evergreen.max_pipes = 4;
1816 rdev->config.evergreen.max_tile_pipes = 4;
1817 rdev->config.evergreen.max_simds = 6;
1818 rdev->config.evergreen.max_backends = 2 * rdev->config.evergreen.num_ses;
1819 rdev->config.evergreen.max_gprs = 256;
1820 rdev->config.evergreen.max_threads = 248;
1821 rdev->config.evergreen.max_gs_threads = 32;
1822 rdev->config.evergreen.max_stack_entries = 256;
1823 rdev->config.evergreen.sx_num_of_sets = 4;
1824 rdev->config.evergreen.sx_max_export_size = 256;
1825 rdev->config.evergreen.sx_max_export_pos_size = 64;
1826 rdev->config.evergreen.sx_max_export_smx_size = 192;
1827 rdev->config.evergreen.max_hw_contexts = 8;
1828 rdev->config.evergreen.sq_num_cf_insts = 2;
1829
1830 rdev->config.evergreen.sc_prim_fifo_size = 0x100;
1831 rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
1832 rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
1833 break;
1834 case CHIP_CAICOS:
1835 rdev->config.evergreen.num_ses = 1;
1836 rdev->config.evergreen.max_pipes = 4;
1837 rdev->config.evergreen.max_tile_pipes = 2;
1838 rdev->config.evergreen.max_simds = 2;
1839 rdev->config.evergreen.max_backends = 1 * rdev->config.evergreen.num_ses;
1840 rdev->config.evergreen.max_gprs = 256;
1841 rdev->config.evergreen.max_threads = 192;
1842 rdev->config.evergreen.max_gs_threads = 16;
1843 rdev->config.evergreen.max_stack_entries = 256;
1844 rdev->config.evergreen.sx_num_of_sets = 4;
1845 rdev->config.evergreen.sx_max_export_size = 128;
1846 rdev->config.evergreen.sx_max_export_pos_size = 32;
1847 rdev->config.evergreen.sx_max_export_smx_size = 96;
1848 rdev->config.evergreen.max_hw_contexts = 4;
1849 rdev->config.evergreen.sq_num_cf_insts = 1;
1850
1851 rdev->config.evergreen.sc_prim_fifo_size = 0x40;
1852 rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30;
1853 rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130;
1854 break;
1026 } 1855 }
1027 1856
1028 /* Initialize HDP */ 1857 /* Initialize HDP */
@@ -1051,7 +1880,10 @@ static void evergreen_gpu_init(struct radeon_device *rdev)
1051 1880
1052 1881
1053 mc_shared_chmap = RREG32(MC_SHARED_CHMAP); 1882 mc_shared_chmap = RREG32(MC_SHARED_CHMAP);
1054 mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG); 1883 if (rdev->flags & RADEON_IS_IGP)
1884 mc_arb_ramcfg = RREG32(FUS_MC_ARB_RAMCFG);
1885 else
1886 mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG);
1055 1887
1056 switch (rdev->config.evergreen.max_tile_pipes) { 1888 switch (rdev->config.evergreen.max_tile_pipes) {
1057 case 1: 1889 case 1:
@@ -1164,10 +1996,11 @@ static void evergreen_gpu_init(struct radeon_device *rdev)
1164 switch (rdev->family) { 1996 switch (rdev->family) {
1165 case CHIP_CYPRESS: 1997 case CHIP_CYPRESS:
1166 case CHIP_HEMLOCK: 1998 case CHIP_HEMLOCK:
1999 case CHIP_BARTS:
1167 gb_backend_map = 0x66442200; 2000 gb_backend_map = 0x66442200;
1168 break; 2001 break;
1169 case CHIP_JUNIPER: 2002 case CHIP_JUNIPER:
1170 gb_backend_map = 0x00006420; 2003 gb_backend_map = 0x00002200;
1171 break; 2004 break;
1172 default: 2005 default:
1173 gb_backend_map = 2006 gb_backend_map =
@@ -1180,12 +2013,47 @@ static void evergreen_gpu_init(struct radeon_device *rdev)
1180 } 2013 }
1181 } 2014 }
1182 2015
1183 rdev->config.evergreen.tile_config = gb_addr_config; 2016 /* setup tiling info dword. gb_addr_config is not adequate since it does
2017 * not have bank info, so create a custom tiling dword.
2018 * bits 3:0 num_pipes
2019 * bits 7:4 num_banks
2020 * bits 11:8 group_size
2021 * bits 15:12 row_size
2022 */
2023 rdev->config.evergreen.tile_config = 0;
2024 switch (rdev->config.evergreen.max_tile_pipes) {
2025 case 1:
2026 default:
2027 rdev->config.evergreen.tile_config |= (0 << 0);
2028 break;
2029 case 2:
2030 rdev->config.evergreen.tile_config |= (1 << 0);
2031 break;
2032 case 4:
2033 rdev->config.evergreen.tile_config |= (2 << 0);
2034 break;
2035 case 8:
2036 rdev->config.evergreen.tile_config |= (3 << 0);
2037 break;
2038 }
2039 /* num banks is 8 on all fusion asics. 0 = 4, 1 = 8, 2 = 16 */
2040 if (rdev->flags & RADEON_IS_IGP)
2041 rdev->config.evergreen.tile_config |= 1 << 4;
2042 else
2043 rdev->config.evergreen.tile_config |=
2044 ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) << 4;
2045 rdev->config.evergreen.tile_config |=
2046 ((mc_arb_ramcfg & BURSTLENGTH_MASK) >> BURSTLENGTH_SHIFT) << 8;
2047 rdev->config.evergreen.tile_config |=
2048 ((gb_addr_config & 0x30000000) >> 28) << 12;
2049
1184 WREG32(GB_BACKEND_MAP, gb_backend_map); 2050 WREG32(GB_BACKEND_MAP, gb_backend_map);
1185 WREG32(GB_ADDR_CONFIG, gb_addr_config); 2051 WREG32(GB_ADDR_CONFIG, gb_addr_config);
1186 WREG32(DMIF_ADDR_CONFIG, gb_addr_config); 2052 WREG32(DMIF_ADDR_CONFIG, gb_addr_config);
1187 WREG32(HDP_ADDR_CONFIG, gb_addr_config); 2053 WREG32(HDP_ADDR_CONFIG, gb_addr_config);
1188 2054
2055 evergreen_program_channel_remap(rdev);
2056
1189 num_shader_engines = ((RREG32(GB_ADDR_CONFIG) & NUM_SHADER_ENGINES(3)) >> 12) + 1; 2057 num_shader_engines = ((RREG32(GB_ADDR_CONFIG) & NUM_SHADER_ENGINES(3)) >> 12) + 1;
1190 grbm_gfx_index = INSTANCE_BROADCAST_WRITES; 2058 grbm_gfx_index = INSTANCE_BROADCAST_WRITES;
1191 2059
@@ -1268,9 +2136,18 @@ static void evergreen_gpu_init(struct radeon_device *rdev)
1268 GS_PRIO(2) | 2136 GS_PRIO(2) |
1269 ES_PRIO(3)); 2137 ES_PRIO(3));
1270 2138
1271 if (rdev->family == CHIP_CEDAR) 2139 switch (rdev->family) {
2140 case CHIP_CEDAR:
2141 case CHIP_PALM:
2142 case CHIP_SUMO:
2143 case CHIP_SUMO2:
2144 case CHIP_CAICOS:
1272 /* no vertex cache */ 2145 /* no vertex cache */
1273 sq_config &= ~VC_ENABLE; 2146 sq_config &= ~VC_ENABLE;
2147 break;
2148 default:
2149 break;
2150 }
1274 2151
1275 sq_lds_resource_mgmt = RREG32(SQ_LDS_RESOURCE_MGMT); 2152 sq_lds_resource_mgmt = RREG32(SQ_LDS_RESOURCE_MGMT);
1276 2153
@@ -1282,10 +2159,17 @@ static void evergreen_gpu_init(struct radeon_device *rdev)
1282 sq_gpr_resource_mgmt_3 = NUM_HS_GPRS((rdev->config.evergreen.max_gprs - (4 * 2)) * 3 / 32); 2159 sq_gpr_resource_mgmt_3 = NUM_HS_GPRS((rdev->config.evergreen.max_gprs - (4 * 2)) * 3 / 32);
1283 sq_gpr_resource_mgmt_3 |= NUM_LS_GPRS((rdev->config.evergreen.max_gprs - (4 * 2)) * 3 / 32); 2160 sq_gpr_resource_mgmt_3 |= NUM_LS_GPRS((rdev->config.evergreen.max_gprs - (4 * 2)) * 3 / 32);
1284 2161
1285 if (rdev->family == CHIP_CEDAR) 2162 switch (rdev->family) {
2163 case CHIP_CEDAR:
2164 case CHIP_PALM:
2165 case CHIP_SUMO:
2166 case CHIP_SUMO2:
1286 ps_thread_count = 96; 2167 ps_thread_count = 96;
1287 else 2168 break;
2169 default:
1288 ps_thread_count = 128; 2170 ps_thread_count = 128;
2171 break;
2172 }
1289 2173
1290 sq_thread_resource_mgmt = NUM_PS_THREADS(ps_thread_count); 2174 sq_thread_resource_mgmt = NUM_PS_THREADS(ps_thread_count);
1291 sq_thread_resource_mgmt |= NUM_VS_THREADS((((rdev->config.evergreen.max_threads - ps_thread_count) / 6) / 8) * 8); 2175 sq_thread_resource_mgmt |= NUM_VS_THREADS((((rdev->config.evergreen.max_threads - ps_thread_count) / 6) / 8) * 8);
@@ -1316,14 +2200,23 @@ static void evergreen_gpu_init(struct radeon_device *rdev)
1316 WREG32(PA_SC_FORCE_EOV_MAX_CNTS, (FORCE_EOV_MAX_CLK_CNT(4095) | 2200 WREG32(PA_SC_FORCE_EOV_MAX_CNTS, (FORCE_EOV_MAX_CLK_CNT(4095) |
1317 FORCE_EOV_MAX_REZ_CNT(255))); 2201 FORCE_EOV_MAX_REZ_CNT(255)));
1318 2202
1319 if (rdev->family == CHIP_CEDAR) 2203 switch (rdev->family) {
2204 case CHIP_CEDAR:
2205 case CHIP_PALM:
2206 case CHIP_SUMO:
2207 case CHIP_SUMO2:
2208 case CHIP_CAICOS:
1320 vgt_cache_invalidation = CACHE_INVALIDATION(TC_ONLY); 2209 vgt_cache_invalidation = CACHE_INVALIDATION(TC_ONLY);
1321 else 2210 break;
2211 default:
1322 vgt_cache_invalidation = CACHE_INVALIDATION(VC_AND_TC); 2212 vgt_cache_invalidation = CACHE_INVALIDATION(VC_AND_TC);
2213 break;
2214 }
1323 vgt_cache_invalidation |= AUTO_INVLD_EN(ES_AND_GS_AUTO); 2215 vgt_cache_invalidation |= AUTO_INVLD_EN(ES_AND_GS_AUTO);
1324 WREG32(VGT_CACHE_INVALIDATION, vgt_cache_invalidation); 2216 WREG32(VGT_CACHE_INVALIDATION, vgt_cache_invalidation);
1325 2217
1326 WREG32(VGT_GS_VERTEX_REUSE, 16); 2218 WREG32(VGT_GS_VERTEX_REUSE, 16);
2219 WREG32(PA_SU_LINE_STIPPLE_VALUE, 0);
1327 WREG32(PA_SC_LINE_STIPPLE_STATE, 0); 2220 WREG32(PA_SC_LINE_STIPPLE_STATE, 0);
1328 2221
1329 WREG32(VGT_VERTEX_REUSE_BLOCK_CNTL, 14); 2222 WREG32(VGT_VERTEX_REUSE_BLOCK_CNTL, 14);
@@ -1358,6 +2251,10 @@ static void evergreen_gpu_init(struct radeon_device *rdev)
1358 for (i = SQ_ALU_CONST_BUFFER_SIZE_HS_0; i < 0x29000; i += 4) 2251 for (i = SQ_ALU_CONST_BUFFER_SIZE_HS_0; i < 0x29000; i += 4)
1359 WREG32(i, 0); 2252 WREG32(i, 0);
1360 2253
2254 tmp = RREG32(HDP_MISC_CNTL);
2255 tmp |= HDP_FLUSH_INVALIDATE_CACHE;
2256 WREG32(HDP_MISC_CNTL, tmp);
2257
1361 hdp_host_path_cntl = RREG32(HDP_HOST_PATH_CNTL); 2258 hdp_host_path_cntl = RREG32(HDP_HOST_PATH_CNTL);
1362 WREG32(HDP_HOST_PATH_CNTL, hdp_host_path_cntl); 2259 WREG32(HDP_HOST_PATH_CNTL, hdp_host_path_cntl);
1363 2260
@@ -1374,7 +2271,10 @@ int evergreen_mc_init(struct radeon_device *rdev)
1374 2271
1375 /* Get VRAM informations */ 2272 /* Get VRAM informations */
1376 rdev->mc.vram_is_ddr = true; 2273 rdev->mc.vram_is_ddr = true;
1377 tmp = RREG32(MC_ARB_RAMCFG); 2274 if (rdev->flags & RADEON_IS_IGP)
2275 tmp = RREG32(FUS_MC_ARB_RAMCFG);
2276 else
2277 tmp = RREG32(MC_ARB_RAMCFG);
1378 if (tmp & CHANSIZE_OVERRIDE) { 2278 if (tmp & CHANSIZE_OVERRIDE) {
1379 chansize = 16; 2279 chansize = 16;
1380 } else if (tmp & CHANSIZE_MASK) { 2280 } else if (tmp & CHANSIZE_MASK) {
@@ -1403,12 +2303,17 @@ int evergreen_mc_init(struct radeon_device *rdev)
1403 rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0); 2303 rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0);
1404 rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0); 2304 rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0);
1405 /* Setup GPU memory space */ 2305 /* Setup GPU memory space */
1406 /* size in MB on evergreen */ 2306 if (rdev->flags & RADEON_IS_IGP) {
1407 rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024; 2307 /* size in bytes on fusion */
1408 rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024; 2308 rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE);
2309 rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE);
2310 } else {
2311 /* size in MB on evergreen */
2312 rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024;
2313 rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024;
2314 }
1409 rdev->mc.visible_vram_size = rdev->mc.aper_size; 2315 rdev->mc.visible_vram_size = rdev->mc.aper_size;
1410 rdev->mc.active_vram_size = rdev->mc.visible_vram_size; 2316 r700_vram_gtt_location(rdev, &rdev->mc);
1411 r600_vram_gtt_location(rdev, &rdev->mc);
1412 radeon_update_bandwidth_info(rdev); 2317 radeon_update_bandwidth_info(rdev);
1413 2318
1414 return 0; 2319 return 0;
@@ -1416,16 +2321,40 @@ int evergreen_mc_init(struct radeon_device *rdev)
1416 2321
1417bool evergreen_gpu_is_lockup(struct radeon_device *rdev) 2322bool evergreen_gpu_is_lockup(struct radeon_device *rdev)
1418{ 2323{
1419 /* FIXME: implement for evergreen */ 2324 u32 srbm_status;
1420 return false; 2325 u32 grbm_status;
2326 u32 grbm_status_se0, grbm_status_se1;
2327 struct r100_gpu_lockup *lockup = &rdev->config.evergreen.lockup;
2328 int r;
2329
2330 srbm_status = RREG32(SRBM_STATUS);
2331 grbm_status = RREG32(GRBM_STATUS);
2332 grbm_status_se0 = RREG32(GRBM_STATUS_SE0);
2333 grbm_status_se1 = RREG32(GRBM_STATUS_SE1);
2334 if (!(grbm_status & GUI_ACTIVE)) {
2335 r100_gpu_lockup_update(lockup, &rdev->cp);
2336 return false;
2337 }
2338 /* force CP activities */
2339 r = radeon_ring_lock(rdev, 2);
2340 if (!r) {
2341 /* PACKET2 NOP */
2342 radeon_ring_write(rdev, 0x80000000);
2343 radeon_ring_write(rdev, 0x80000000);
2344 radeon_ring_unlock_commit(rdev);
2345 }
2346 rdev->cp.rptr = RREG32(CP_RB_RPTR);
2347 return r100_gpu_cp_is_lockup(rdev, lockup, &rdev->cp);
1421} 2348}
1422 2349
1423static int evergreen_gpu_soft_reset(struct radeon_device *rdev) 2350static int evergreen_gpu_soft_reset(struct radeon_device *rdev)
1424{ 2351{
1425 struct evergreen_mc_save save; 2352 struct evergreen_mc_save save;
1426 u32 srbm_reset = 0;
1427 u32 grbm_reset = 0; 2353 u32 grbm_reset = 0;
1428 2354
2355 if (!(RREG32(GRBM_STATUS) & GUI_ACTIVE))
2356 return 0;
2357
1429 dev_info(rdev->dev, "GPU softreset \n"); 2358 dev_info(rdev->dev, "GPU softreset \n");
1430 dev_info(rdev->dev, " GRBM_STATUS=0x%08X\n", 2359 dev_info(rdev->dev, " GRBM_STATUS=0x%08X\n",
1431 RREG32(GRBM_STATUS)); 2360 RREG32(GRBM_STATUS));
@@ -1462,16 +2391,6 @@ static int evergreen_gpu_soft_reset(struct radeon_device *rdev)
1462 udelay(50); 2391 udelay(50);
1463 WREG32(GRBM_SOFT_RESET, 0); 2392 WREG32(GRBM_SOFT_RESET, 0);
1464 (void)RREG32(GRBM_SOFT_RESET); 2393 (void)RREG32(GRBM_SOFT_RESET);
1465
1466 /* reset all the system blocks */
1467 srbm_reset = SRBM_SOFT_RESET_ALL_MASK;
1468
1469 dev_info(rdev->dev, " SRBM_SOFT_RESET=0x%08X\n", srbm_reset);
1470 WREG32(SRBM_SOFT_RESET, srbm_reset);
1471 (void)RREG32(SRBM_SOFT_RESET);
1472 udelay(50);
1473 WREG32(SRBM_SOFT_RESET, 0);
1474 (void)RREG32(SRBM_SOFT_RESET);
1475 /* Wait a little for things to settle down */ 2394 /* Wait a little for things to settle down */
1476 udelay(50); 2395 udelay(50);
1477 dev_info(rdev->dev, " GRBM_STATUS=0x%08X\n", 2396 dev_info(rdev->dev, " GRBM_STATUS=0x%08X\n",
@@ -1482,10 +2401,6 @@ static int evergreen_gpu_soft_reset(struct radeon_device *rdev)
1482 RREG32(GRBM_STATUS_SE1)); 2401 RREG32(GRBM_STATUS_SE1));
1483 dev_info(rdev->dev, " SRBM_STATUS=0x%08X\n", 2402 dev_info(rdev->dev, " SRBM_STATUS=0x%08X\n",
1484 RREG32(SRBM_STATUS)); 2403 RREG32(SRBM_STATUS));
1485 /* After reset we need to reinit the asic as GPU often endup in an
1486 * incoherent state.
1487 */
1488 atom_asic_init(rdev->mode_info.atom_context);
1489 evergreen_mc_resume(rdev, &save); 2404 evergreen_mc_resume(rdev, &save);
1490 return 0; 2405 return 0;
1491} 2406}
@@ -1525,17 +2440,25 @@ void evergreen_disable_interrupt_state(struct radeon_device *rdev)
1525 WREG32(GRBM_INT_CNTL, 0); 2440 WREG32(GRBM_INT_CNTL, 0);
1526 WREG32(INT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, 0); 2441 WREG32(INT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, 0);
1527 WREG32(INT_MASK + EVERGREEN_CRTC1_REGISTER_OFFSET, 0); 2442 WREG32(INT_MASK + EVERGREEN_CRTC1_REGISTER_OFFSET, 0);
1528 WREG32(INT_MASK + EVERGREEN_CRTC2_REGISTER_OFFSET, 0); 2443 if (rdev->num_crtc >= 4) {
1529 WREG32(INT_MASK + EVERGREEN_CRTC3_REGISTER_OFFSET, 0); 2444 WREG32(INT_MASK + EVERGREEN_CRTC2_REGISTER_OFFSET, 0);
1530 WREG32(INT_MASK + EVERGREEN_CRTC4_REGISTER_OFFSET, 0); 2445 WREG32(INT_MASK + EVERGREEN_CRTC3_REGISTER_OFFSET, 0);
1531 WREG32(INT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, 0); 2446 }
2447 if (rdev->num_crtc >= 6) {
2448 WREG32(INT_MASK + EVERGREEN_CRTC4_REGISTER_OFFSET, 0);
2449 WREG32(INT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, 0);
2450 }
1532 2451
1533 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, 0); 2452 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, 0);
1534 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, 0); 2453 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, 0);
1535 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, 0); 2454 if (rdev->num_crtc >= 4) {
1536 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, 0); 2455 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, 0);
1537 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, 0); 2456 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, 0);
1538 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, 0); 2457 }
2458 if (rdev->num_crtc >= 6) {
2459 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, 0);
2460 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, 0);
2461 }
1539 2462
1540 WREG32(DACA_AUTODETECT_INT_CONTROL, 0); 2463 WREG32(DACA_AUTODETECT_INT_CONTROL, 0);
1541 WREG32(DACB_AUTODETECT_INT_CONTROL, 0); 2464 WREG32(DACB_AUTODETECT_INT_CONTROL, 0);
@@ -1561,9 +2484,10 @@ int evergreen_irq_set(struct radeon_device *rdev)
1561 u32 crtc1 = 0, crtc2 = 0, crtc3 = 0, crtc4 = 0, crtc5 = 0, crtc6 = 0; 2484 u32 crtc1 = 0, crtc2 = 0, crtc3 = 0, crtc4 = 0, crtc5 = 0, crtc6 = 0;
1562 u32 hpd1, hpd2, hpd3, hpd4, hpd5, hpd6; 2485 u32 hpd1, hpd2, hpd3, hpd4, hpd5, hpd6;
1563 u32 grbm_int_cntl = 0; 2486 u32 grbm_int_cntl = 0;
2487 u32 grph1 = 0, grph2 = 0, grph3 = 0, grph4 = 0, grph5 = 0, grph6 = 0;
1564 2488
1565 if (!rdev->irq.installed) { 2489 if (!rdev->irq.installed) {
1566 WARN(1, "Can't enable IRQ/MSI because no handler is installed.\n"); 2490 WARN(1, "Can't enable IRQ/MSI because no handler is installed\n");
1567 return -EINVAL; 2491 return -EINVAL;
1568 } 2492 }
1569 /* don't enable anything if the ih is disabled */ 2493 /* don't enable anything if the ih is disabled */
@@ -1584,28 +2508,35 @@ int evergreen_irq_set(struct radeon_device *rdev)
1584 if (rdev->irq.sw_int) { 2508 if (rdev->irq.sw_int) {
1585 DRM_DEBUG("evergreen_irq_set: sw int\n"); 2509 DRM_DEBUG("evergreen_irq_set: sw int\n");
1586 cp_int_cntl |= RB_INT_ENABLE; 2510 cp_int_cntl |= RB_INT_ENABLE;
2511 cp_int_cntl |= TIME_STAMP_INT_ENABLE;
1587 } 2512 }
1588 if (rdev->irq.crtc_vblank_int[0]) { 2513 if (rdev->irq.crtc_vblank_int[0] ||
2514 rdev->irq.pflip[0]) {
1589 DRM_DEBUG("evergreen_irq_set: vblank 0\n"); 2515 DRM_DEBUG("evergreen_irq_set: vblank 0\n");
1590 crtc1 |= VBLANK_INT_MASK; 2516 crtc1 |= VBLANK_INT_MASK;
1591 } 2517 }
1592 if (rdev->irq.crtc_vblank_int[1]) { 2518 if (rdev->irq.crtc_vblank_int[1] ||
2519 rdev->irq.pflip[1]) {
1593 DRM_DEBUG("evergreen_irq_set: vblank 1\n"); 2520 DRM_DEBUG("evergreen_irq_set: vblank 1\n");
1594 crtc2 |= VBLANK_INT_MASK; 2521 crtc2 |= VBLANK_INT_MASK;
1595 } 2522 }
1596 if (rdev->irq.crtc_vblank_int[2]) { 2523 if (rdev->irq.crtc_vblank_int[2] ||
2524 rdev->irq.pflip[2]) {
1597 DRM_DEBUG("evergreen_irq_set: vblank 2\n"); 2525 DRM_DEBUG("evergreen_irq_set: vblank 2\n");
1598 crtc3 |= VBLANK_INT_MASK; 2526 crtc3 |= VBLANK_INT_MASK;
1599 } 2527 }
1600 if (rdev->irq.crtc_vblank_int[3]) { 2528 if (rdev->irq.crtc_vblank_int[3] ||
2529 rdev->irq.pflip[3]) {
1601 DRM_DEBUG("evergreen_irq_set: vblank 3\n"); 2530 DRM_DEBUG("evergreen_irq_set: vblank 3\n");
1602 crtc4 |= VBLANK_INT_MASK; 2531 crtc4 |= VBLANK_INT_MASK;
1603 } 2532 }
1604 if (rdev->irq.crtc_vblank_int[4]) { 2533 if (rdev->irq.crtc_vblank_int[4] ||
2534 rdev->irq.pflip[4]) {
1605 DRM_DEBUG("evergreen_irq_set: vblank 4\n"); 2535 DRM_DEBUG("evergreen_irq_set: vblank 4\n");
1606 crtc5 |= VBLANK_INT_MASK; 2536 crtc5 |= VBLANK_INT_MASK;
1607 } 2537 }
1608 if (rdev->irq.crtc_vblank_int[5]) { 2538 if (rdev->irq.crtc_vblank_int[5] ||
2539 rdev->irq.pflip[5]) {
1609 DRM_DEBUG("evergreen_irq_set: vblank 5\n"); 2540 DRM_DEBUG("evergreen_irq_set: vblank 5\n");
1610 crtc6 |= VBLANK_INT_MASK; 2541 crtc6 |= VBLANK_INT_MASK;
1611 } 2542 }
@@ -1643,10 +2574,25 @@ int evergreen_irq_set(struct radeon_device *rdev)
1643 2574
1644 WREG32(INT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, crtc1); 2575 WREG32(INT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, crtc1);
1645 WREG32(INT_MASK + EVERGREEN_CRTC1_REGISTER_OFFSET, crtc2); 2576 WREG32(INT_MASK + EVERGREEN_CRTC1_REGISTER_OFFSET, crtc2);
1646 WREG32(INT_MASK + EVERGREEN_CRTC2_REGISTER_OFFSET, crtc3); 2577 if (rdev->num_crtc >= 4) {
1647 WREG32(INT_MASK + EVERGREEN_CRTC3_REGISTER_OFFSET, crtc4); 2578 WREG32(INT_MASK + EVERGREEN_CRTC2_REGISTER_OFFSET, crtc3);
1648 WREG32(INT_MASK + EVERGREEN_CRTC4_REGISTER_OFFSET, crtc5); 2579 WREG32(INT_MASK + EVERGREEN_CRTC3_REGISTER_OFFSET, crtc4);
1649 WREG32(INT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, crtc6); 2580 }
2581 if (rdev->num_crtc >= 6) {
2582 WREG32(INT_MASK + EVERGREEN_CRTC4_REGISTER_OFFSET, crtc5);
2583 WREG32(INT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, crtc6);
2584 }
2585
2586 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, grph1);
2587 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, grph2);
2588 if (rdev->num_crtc >= 4) {
2589 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, grph3);
2590 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, grph4);
2591 }
2592 if (rdev->num_crtc >= 6) {
2593 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, grph5);
2594 WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, grph6);
2595 }
1650 2596
1651 WREG32(DC_HPD1_INT_CONTROL, hpd1); 2597 WREG32(DC_HPD1_INT_CONTROL, hpd1);
1652 WREG32(DC_HPD2_INT_CONTROL, hpd2); 2598 WREG32(DC_HPD2_INT_CONTROL, hpd2);
@@ -1658,79 +2604,96 @@ int evergreen_irq_set(struct radeon_device *rdev)
1658 return 0; 2604 return 0;
1659} 2605}
1660 2606
1661static inline void evergreen_irq_ack(struct radeon_device *rdev, 2607static inline void evergreen_irq_ack(struct radeon_device *rdev)
1662 u32 *disp_int,
1663 u32 *disp_int_cont,
1664 u32 *disp_int_cont2,
1665 u32 *disp_int_cont3,
1666 u32 *disp_int_cont4,
1667 u32 *disp_int_cont5)
1668{ 2608{
1669 u32 tmp; 2609 u32 tmp;
1670 2610
1671 *disp_int = RREG32(DISP_INTERRUPT_STATUS); 2611 rdev->irq.stat_regs.evergreen.disp_int = RREG32(DISP_INTERRUPT_STATUS);
1672 *disp_int_cont = RREG32(DISP_INTERRUPT_STATUS_CONTINUE); 2612 rdev->irq.stat_regs.evergreen.disp_int_cont = RREG32(DISP_INTERRUPT_STATUS_CONTINUE);
1673 *disp_int_cont2 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE2); 2613 rdev->irq.stat_regs.evergreen.disp_int_cont2 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE2);
1674 *disp_int_cont3 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE3); 2614 rdev->irq.stat_regs.evergreen.disp_int_cont3 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE3);
1675 *disp_int_cont4 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE4); 2615 rdev->irq.stat_regs.evergreen.disp_int_cont4 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE4);
1676 *disp_int_cont5 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE5); 2616 rdev->irq.stat_regs.evergreen.disp_int_cont5 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE5);
1677 2617 rdev->irq.stat_regs.evergreen.d1grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET);
1678 if (*disp_int & LB_D1_VBLANK_INTERRUPT) 2618 rdev->irq.stat_regs.evergreen.d2grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET);
2619 if (rdev->num_crtc >= 4) {
2620 rdev->irq.stat_regs.evergreen.d3grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET);
2621 rdev->irq.stat_regs.evergreen.d4grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET);
2622 }
2623 if (rdev->num_crtc >= 6) {
2624 rdev->irq.stat_regs.evergreen.d5grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET);
2625 rdev->irq.stat_regs.evergreen.d6grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET);
2626 }
2627
2628 if (rdev->irq.stat_regs.evergreen.d1grph_int & GRPH_PFLIP_INT_OCCURRED)
2629 WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR);
2630 if (rdev->irq.stat_regs.evergreen.d2grph_int & GRPH_PFLIP_INT_OCCURRED)
2631 WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR);
2632 if (rdev->irq.stat_regs.evergreen.disp_int & LB_D1_VBLANK_INTERRUPT)
1679 WREG32(VBLANK_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET, VBLANK_ACK); 2633 WREG32(VBLANK_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET, VBLANK_ACK);
1680 if (*disp_int & LB_D1_VLINE_INTERRUPT) 2634 if (rdev->irq.stat_regs.evergreen.disp_int & LB_D1_VLINE_INTERRUPT)
1681 WREG32(VLINE_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET, VLINE_ACK); 2635 WREG32(VLINE_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET, VLINE_ACK);
1682 2636 if (rdev->irq.stat_regs.evergreen.disp_int_cont & LB_D2_VBLANK_INTERRUPT)
1683 if (*disp_int_cont & LB_D2_VBLANK_INTERRUPT)
1684 WREG32(VBLANK_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET, VBLANK_ACK); 2637 WREG32(VBLANK_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET, VBLANK_ACK);
1685 if (*disp_int_cont & LB_D2_VLINE_INTERRUPT) 2638 if (rdev->irq.stat_regs.evergreen.disp_int_cont & LB_D2_VLINE_INTERRUPT)
1686 WREG32(VLINE_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET, VLINE_ACK); 2639 WREG32(VLINE_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET, VLINE_ACK);
1687 2640
1688 if (*disp_int_cont2 & LB_D3_VBLANK_INTERRUPT) 2641 if (rdev->num_crtc >= 4) {
1689 WREG32(VBLANK_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, VBLANK_ACK); 2642 if (rdev->irq.stat_regs.evergreen.d3grph_int & GRPH_PFLIP_INT_OCCURRED)
1690 if (*disp_int_cont2 & LB_D3_VLINE_INTERRUPT) 2643 WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR);
1691 WREG32(VLINE_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, VLINE_ACK); 2644 if (rdev->irq.stat_regs.evergreen.d4grph_int & GRPH_PFLIP_INT_OCCURRED)
1692 2645 WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR);
1693 if (*disp_int_cont3 & LB_D4_VBLANK_INTERRUPT) 2646 if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & LB_D3_VBLANK_INTERRUPT)
1694 WREG32(VBLANK_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET, VBLANK_ACK); 2647 WREG32(VBLANK_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, VBLANK_ACK);
1695 if (*disp_int_cont3 & LB_D4_VLINE_INTERRUPT) 2648 if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & LB_D3_VLINE_INTERRUPT)
1696 WREG32(VLINE_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET, VLINE_ACK); 2649 WREG32(VLINE_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, VLINE_ACK);
1697 2650 if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & LB_D4_VBLANK_INTERRUPT)
1698 if (*disp_int_cont4 & LB_D5_VBLANK_INTERRUPT) 2651 WREG32(VBLANK_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET, VBLANK_ACK);
1699 WREG32(VBLANK_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, VBLANK_ACK); 2652 if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & LB_D4_VLINE_INTERRUPT)
1700 if (*disp_int_cont4 & LB_D5_VLINE_INTERRUPT) 2653 WREG32(VLINE_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET, VLINE_ACK);
1701 WREG32(VLINE_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, VLINE_ACK); 2654 }
1702 2655
1703 if (*disp_int_cont5 & LB_D6_VBLANK_INTERRUPT) 2656 if (rdev->num_crtc >= 6) {
1704 WREG32(VBLANK_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET, VBLANK_ACK); 2657 if (rdev->irq.stat_regs.evergreen.d5grph_int & GRPH_PFLIP_INT_OCCURRED)
1705 if (*disp_int_cont5 & LB_D6_VLINE_INTERRUPT) 2658 WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR);
1706 WREG32(VLINE_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET, VLINE_ACK); 2659 if (rdev->irq.stat_regs.evergreen.d6grph_int & GRPH_PFLIP_INT_OCCURRED)
1707 2660 WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR);
1708 if (*disp_int & DC_HPD1_INTERRUPT) { 2661 if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & LB_D5_VBLANK_INTERRUPT)
2662 WREG32(VBLANK_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, VBLANK_ACK);
2663 if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & LB_D5_VLINE_INTERRUPT)
2664 WREG32(VLINE_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, VLINE_ACK);
2665 if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & LB_D6_VBLANK_INTERRUPT)
2666 WREG32(VBLANK_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET, VBLANK_ACK);
2667 if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & LB_D6_VLINE_INTERRUPT)
2668 WREG32(VLINE_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET, VLINE_ACK);
2669 }
2670
2671 if (rdev->irq.stat_regs.evergreen.disp_int & DC_HPD1_INTERRUPT) {
1709 tmp = RREG32(DC_HPD1_INT_CONTROL); 2672 tmp = RREG32(DC_HPD1_INT_CONTROL);
1710 tmp |= DC_HPDx_INT_ACK; 2673 tmp |= DC_HPDx_INT_ACK;
1711 WREG32(DC_HPD1_INT_CONTROL, tmp); 2674 WREG32(DC_HPD1_INT_CONTROL, tmp);
1712 } 2675 }
1713 if (*disp_int_cont & DC_HPD2_INTERRUPT) { 2676 if (rdev->irq.stat_regs.evergreen.disp_int_cont & DC_HPD2_INTERRUPT) {
1714 tmp = RREG32(DC_HPD2_INT_CONTROL); 2677 tmp = RREG32(DC_HPD2_INT_CONTROL);
1715 tmp |= DC_HPDx_INT_ACK; 2678 tmp |= DC_HPDx_INT_ACK;
1716 WREG32(DC_HPD2_INT_CONTROL, tmp); 2679 WREG32(DC_HPD2_INT_CONTROL, tmp);
1717 } 2680 }
1718 if (*disp_int_cont2 & DC_HPD3_INTERRUPT) { 2681 if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & DC_HPD3_INTERRUPT) {
1719 tmp = RREG32(DC_HPD3_INT_CONTROL); 2682 tmp = RREG32(DC_HPD3_INT_CONTROL);
1720 tmp |= DC_HPDx_INT_ACK; 2683 tmp |= DC_HPDx_INT_ACK;
1721 WREG32(DC_HPD3_INT_CONTROL, tmp); 2684 WREG32(DC_HPD3_INT_CONTROL, tmp);
1722 } 2685 }
1723 if (*disp_int_cont3 & DC_HPD4_INTERRUPT) { 2686 if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & DC_HPD4_INTERRUPT) {
1724 tmp = RREG32(DC_HPD4_INT_CONTROL); 2687 tmp = RREG32(DC_HPD4_INT_CONTROL);
1725 tmp |= DC_HPDx_INT_ACK; 2688 tmp |= DC_HPDx_INT_ACK;
1726 WREG32(DC_HPD4_INT_CONTROL, tmp); 2689 WREG32(DC_HPD4_INT_CONTROL, tmp);
1727 } 2690 }
1728 if (*disp_int_cont4 & DC_HPD5_INTERRUPT) { 2691 if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & DC_HPD5_INTERRUPT) {
1729 tmp = RREG32(DC_HPD5_INT_CONTROL); 2692 tmp = RREG32(DC_HPD5_INT_CONTROL);
1730 tmp |= DC_HPDx_INT_ACK; 2693 tmp |= DC_HPDx_INT_ACK;
1731 WREG32(DC_HPD5_INT_CONTROL, tmp); 2694 WREG32(DC_HPD5_INT_CONTROL, tmp);
1732 } 2695 }
1733 if (*disp_int_cont5 & DC_HPD6_INTERRUPT) { 2696 if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & DC_HPD6_INTERRUPT) {
1734 tmp = RREG32(DC_HPD5_INT_CONTROL); 2697 tmp = RREG32(DC_HPD5_INT_CONTROL);
1735 tmp |= DC_HPDx_INT_ACK; 2698 tmp |= DC_HPDx_INT_ACK;
1736 WREG32(DC_HPD6_INT_CONTROL, tmp); 2699 WREG32(DC_HPD6_INT_CONTROL, tmp);
@@ -1739,18 +2702,14 @@ static inline void evergreen_irq_ack(struct radeon_device *rdev,
1739 2702
1740void evergreen_irq_disable(struct radeon_device *rdev) 2703void evergreen_irq_disable(struct radeon_device *rdev)
1741{ 2704{
1742 u32 disp_int, disp_int_cont, disp_int_cont2;
1743 u32 disp_int_cont3, disp_int_cont4, disp_int_cont5;
1744
1745 r600_disable_interrupts(rdev); 2705 r600_disable_interrupts(rdev);
1746 /* Wait and acknowledge irq */ 2706 /* Wait and acknowledge irq */
1747 mdelay(1); 2707 mdelay(1);
1748 evergreen_irq_ack(rdev, &disp_int, &disp_int_cont, &disp_int_cont2, 2708 evergreen_irq_ack(rdev);
1749 &disp_int_cont3, &disp_int_cont4, &disp_int_cont5);
1750 evergreen_disable_interrupt_state(rdev); 2709 evergreen_disable_interrupt_state(rdev);
1751} 2710}
1752 2711
1753static void evergreen_irq_suspend(struct radeon_device *rdev) 2712void evergreen_irq_suspend(struct radeon_device *rdev)
1754{ 2713{
1755 evergreen_irq_disable(rdev); 2714 evergreen_irq_disable(rdev);
1756 r600_rlc_stop(rdev); 2715 r600_rlc_stop(rdev);
@@ -1760,8 +2719,10 @@ static inline u32 evergreen_get_ih_wptr(struct radeon_device *rdev)
1760{ 2719{
1761 u32 wptr, tmp; 2720 u32 wptr, tmp;
1762 2721
1763 /* XXX use writeback */ 2722 if (rdev->wb.enabled)
1764 wptr = RREG32(IH_RB_WPTR); 2723 wptr = le32_to_cpu(rdev->wb.wb[R600_WB_IH_WPTR_OFFSET/4]);
2724 else
2725 wptr = RREG32(IH_RB_WPTR);
1765 2726
1766 if (wptr & RB_OVERFLOW) { 2727 if (wptr & RB_OVERFLOW) {
1767 /* When a ring buffer overflow happen start parsing interrupt 2728 /* When a ring buffer overflow happen start parsing interrupt
@@ -1780,56 +2741,55 @@ static inline u32 evergreen_get_ih_wptr(struct radeon_device *rdev)
1780 2741
1781int evergreen_irq_process(struct radeon_device *rdev) 2742int evergreen_irq_process(struct radeon_device *rdev)
1782{ 2743{
1783 u32 wptr = evergreen_get_ih_wptr(rdev); 2744 u32 wptr;
1784 u32 rptr = rdev->ih.rptr; 2745 u32 rptr;
1785 u32 src_id, src_data; 2746 u32 src_id, src_data;
1786 u32 ring_index; 2747 u32 ring_index;
1787 u32 disp_int, disp_int_cont, disp_int_cont2;
1788 u32 disp_int_cont3, disp_int_cont4, disp_int_cont5;
1789 unsigned long flags; 2748 unsigned long flags;
1790 bool queue_hotplug = false; 2749 bool queue_hotplug = false;
1791 2750
1792 DRM_DEBUG("r600_irq_process start: rptr %d, wptr %d\n", rptr, wptr); 2751 if (!rdev->ih.enabled || rdev->shutdown)
1793 if (!rdev->ih.enabled)
1794 return IRQ_NONE; 2752 return IRQ_NONE;
1795 2753
1796 spin_lock_irqsave(&rdev->ih.lock, flags); 2754 wptr = evergreen_get_ih_wptr(rdev);
2755 rptr = rdev->ih.rptr;
2756 DRM_DEBUG("r600_irq_process start: rptr %d, wptr %d\n", rptr, wptr);
1797 2757
2758 spin_lock_irqsave(&rdev->ih.lock, flags);
1798 if (rptr == wptr) { 2759 if (rptr == wptr) {
1799 spin_unlock_irqrestore(&rdev->ih.lock, flags); 2760 spin_unlock_irqrestore(&rdev->ih.lock, flags);
1800 return IRQ_NONE; 2761 return IRQ_NONE;
1801 } 2762 }
1802 if (rdev->shutdown) {
1803 spin_unlock_irqrestore(&rdev->ih.lock, flags);
1804 return IRQ_NONE;
1805 }
1806
1807restart_ih: 2763restart_ih:
1808 /* display interrupts */ 2764 /* display interrupts */
1809 evergreen_irq_ack(rdev, &disp_int, &disp_int_cont, &disp_int_cont2, 2765 evergreen_irq_ack(rdev);
1810 &disp_int_cont3, &disp_int_cont4, &disp_int_cont5);
1811 2766
1812 rdev->ih.wptr = wptr; 2767 rdev->ih.wptr = wptr;
1813 while (rptr != wptr) { 2768 while (rptr != wptr) {
1814 /* wptr/rptr are in bytes! */ 2769 /* wptr/rptr are in bytes! */
1815 ring_index = rptr / 4; 2770 ring_index = rptr / 4;
1816 src_id = rdev->ih.ring[ring_index] & 0xff; 2771 src_id = le32_to_cpu(rdev->ih.ring[ring_index]) & 0xff;
1817 src_data = rdev->ih.ring[ring_index + 1] & 0xfffffff; 2772 src_data = le32_to_cpu(rdev->ih.ring[ring_index + 1]) & 0xfffffff;
1818 2773
1819 switch (src_id) { 2774 switch (src_id) {
1820 case 1: /* D1 vblank/vline */ 2775 case 1: /* D1 vblank/vline */
1821 switch (src_data) { 2776 switch (src_data) {
1822 case 0: /* D1 vblank */ 2777 case 0: /* D1 vblank */
1823 if (disp_int & LB_D1_VBLANK_INTERRUPT) { 2778 if (rdev->irq.stat_regs.evergreen.disp_int & LB_D1_VBLANK_INTERRUPT) {
1824 drm_handle_vblank(rdev->ddev, 0); 2779 if (rdev->irq.crtc_vblank_int[0]) {
1825 wake_up(&rdev->irq.vblank_queue); 2780 drm_handle_vblank(rdev->ddev, 0);
1826 disp_int &= ~LB_D1_VBLANK_INTERRUPT; 2781 rdev->pm.vblank_sync = true;
2782 wake_up(&rdev->irq.vblank_queue);
2783 }
2784 if (rdev->irq.pflip[0])
2785 radeon_crtc_handle_flip(rdev, 0);
2786 rdev->irq.stat_regs.evergreen.disp_int &= ~LB_D1_VBLANK_INTERRUPT;
1827 DRM_DEBUG("IH: D1 vblank\n"); 2787 DRM_DEBUG("IH: D1 vblank\n");
1828 } 2788 }
1829 break; 2789 break;
1830 case 1: /* D1 vline */ 2790 case 1: /* D1 vline */
1831 if (disp_int & LB_D1_VLINE_INTERRUPT) { 2791 if (rdev->irq.stat_regs.evergreen.disp_int & LB_D1_VLINE_INTERRUPT) {
1832 disp_int &= ~LB_D1_VLINE_INTERRUPT; 2792 rdev->irq.stat_regs.evergreen.disp_int &= ~LB_D1_VLINE_INTERRUPT;
1833 DRM_DEBUG("IH: D1 vline\n"); 2793 DRM_DEBUG("IH: D1 vline\n");
1834 } 2794 }
1835 break; 2795 break;
@@ -1841,16 +2801,21 @@ restart_ih:
1841 case 2: /* D2 vblank/vline */ 2801 case 2: /* D2 vblank/vline */
1842 switch (src_data) { 2802 switch (src_data) {
1843 case 0: /* D2 vblank */ 2803 case 0: /* D2 vblank */
1844 if (disp_int_cont & LB_D2_VBLANK_INTERRUPT) { 2804 if (rdev->irq.stat_regs.evergreen.disp_int_cont & LB_D2_VBLANK_INTERRUPT) {
1845 drm_handle_vblank(rdev->ddev, 1); 2805 if (rdev->irq.crtc_vblank_int[1]) {
1846 wake_up(&rdev->irq.vblank_queue); 2806 drm_handle_vblank(rdev->ddev, 1);
1847 disp_int_cont &= ~LB_D2_VBLANK_INTERRUPT; 2807 rdev->pm.vblank_sync = true;
2808 wake_up(&rdev->irq.vblank_queue);
2809 }
2810 if (rdev->irq.pflip[1])
2811 radeon_crtc_handle_flip(rdev, 1);
2812 rdev->irq.stat_regs.evergreen.disp_int_cont &= ~LB_D2_VBLANK_INTERRUPT;
1848 DRM_DEBUG("IH: D2 vblank\n"); 2813 DRM_DEBUG("IH: D2 vblank\n");
1849 } 2814 }
1850 break; 2815 break;
1851 case 1: /* D2 vline */ 2816 case 1: /* D2 vline */
1852 if (disp_int_cont & LB_D2_VLINE_INTERRUPT) { 2817 if (rdev->irq.stat_regs.evergreen.disp_int_cont & LB_D2_VLINE_INTERRUPT) {
1853 disp_int_cont &= ~LB_D2_VLINE_INTERRUPT; 2818 rdev->irq.stat_regs.evergreen.disp_int_cont &= ~LB_D2_VLINE_INTERRUPT;
1854 DRM_DEBUG("IH: D2 vline\n"); 2819 DRM_DEBUG("IH: D2 vline\n");
1855 } 2820 }
1856 break; 2821 break;
@@ -1862,16 +2827,21 @@ restart_ih:
1862 case 3: /* D3 vblank/vline */ 2827 case 3: /* D3 vblank/vline */
1863 switch (src_data) { 2828 switch (src_data) {
1864 case 0: /* D3 vblank */ 2829 case 0: /* D3 vblank */
1865 if (disp_int_cont2 & LB_D3_VBLANK_INTERRUPT) { 2830 if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & LB_D3_VBLANK_INTERRUPT) {
1866 drm_handle_vblank(rdev->ddev, 2); 2831 if (rdev->irq.crtc_vblank_int[2]) {
1867 wake_up(&rdev->irq.vblank_queue); 2832 drm_handle_vblank(rdev->ddev, 2);
1868 disp_int_cont2 &= ~LB_D3_VBLANK_INTERRUPT; 2833 rdev->pm.vblank_sync = true;
2834 wake_up(&rdev->irq.vblank_queue);
2835 }
2836 if (rdev->irq.pflip[2])
2837 radeon_crtc_handle_flip(rdev, 2);
2838 rdev->irq.stat_regs.evergreen.disp_int_cont2 &= ~LB_D3_VBLANK_INTERRUPT;
1869 DRM_DEBUG("IH: D3 vblank\n"); 2839 DRM_DEBUG("IH: D3 vblank\n");
1870 } 2840 }
1871 break; 2841 break;
1872 case 1: /* D3 vline */ 2842 case 1: /* D3 vline */
1873 if (disp_int_cont2 & LB_D3_VLINE_INTERRUPT) { 2843 if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & LB_D3_VLINE_INTERRUPT) {
1874 disp_int_cont2 &= ~LB_D3_VLINE_INTERRUPT; 2844 rdev->irq.stat_regs.evergreen.disp_int_cont2 &= ~LB_D3_VLINE_INTERRUPT;
1875 DRM_DEBUG("IH: D3 vline\n"); 2845 DRM_DEBUG("IH: D3 vline\n");
1876 } 2846 }
1877 break; 2847 break;
@@ -1883,16 +2853,21 @@ restart_ih:
1883 case 4: /* D4 vblank/vline */ 2853 case 4: /* D4 vblank/vline */
1884 switch (src_data) { 2854 switch (src_data) {
1885 case 0: /* D4 vblank */ 2855 case 0: /* D4 vblank */
1886 if (disp_int_cont3 & LB_D4_VBLANK_INTERRUPT) { 2856 if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & LB_D4_VBLANK_INTERRUPT) {
1887 drm_handle_vblank(rdev->ddev, 3); 2857 if (rdev->irq.crtc_vblank_int[3]) {
1888 wake_up(&rdev->irq.vblank_queue); 2858 drm_handle_vblank(rdev->ddev, 3);
1889 disp_int_cont3 &= ~LB_D4_VBLANK_INTERRUPT; 2859 rdev->pm.vblank_sync = true;
2860 wake_up(&rdev->irq.vblank_queue);
2861 }
2862 if (rdev->irq.pflip[3])
2863 radeon_crtc_handle_flip(rdev, 3);
2864 rdev->irq.stat_regs.evergreen.disp_int_cont3 &= ~LB_D4_VBLANK_INTERRUPT;
1890 DRM_DEBUG("IH: D4 vblank\n"); 2865 DRM_DEBUG("IH: D4 vblank\n");
1891 } 2866 }
1892 break; 2867 break;
1893 case 1: /* D4 vline */ 2868 case 1: /* D4 vline */
1894 if (disp_int_cont3 & LB_D4_VLINE_INTERRUPT) { 2869 if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & LB_D4_VLINE_INTERRUPT) {
1895 disp_int_cont3 &= ~LB_D4_VLINE_INTERRUPT; 2870 rdev->irq.stat_regs.evergreen.disp_int_cont3 &= ~LB_D4_VLINE_INTERRUPT;
1896 DRM_DEBUG("IH: D4 vline\n"); 2871 DRM_DEBUG("IH: D4 vline\n");
1897 } 2872 }
1898 break; 2873 break;
@@ -1904,16 +2879,21 @@ restart_ih:
1904 case 5: /* D5 vblank/vline */ 2879 case 5: /* D5 vblank/vline */
1905 switch (src_data) { 2880 switch (src_data) {
1906 case 0: /* D5 vblank */ 2881 case 0: /* D5 vblank */
1907 if (disp_int_cont4 & LB_D5_VBLANK_INTERRUPT) { 2882 if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & LB_D5_VBLANK_INTERRUPT) {
1908 drm_handle_vblank(rdev->ddev, 4); 2883 if (rdev->irq.crtc_vblank_int[4]) {
1909 wake_up(&rdev->irq.vblank_queue); 2884 drm_handle_vblank(rdev->ddev, 4);
1910 disp_int_cont4 &= ~LB_D5_VBLANK_INTERRUPT; 2885 rdev->pm.vblank_sync = true;
2886 wake_up(&rdev->irq.vblank_queue);
2887 }
2888 if (rdev->irq.pflip[4])
2889 radeon_crtc_handle_flip(rdev, 4);
2890 rdev->irq.stat_regs.evergreen.disp_int_cont4 &= ~LB_D5_VBLANK_INTERRUPT;
1911 DRM_DEBUG("IH: D5 vblank\n"); 2891 DRM_DEBUG("IH: D5 vblank\n");
1912 } 2892 }
1913 break; 2893 break;
1914 case 1: /* D5 vline */ 2894 case 1: /* D5 vline */
1915 if (disp_int_cont4 & LB_D5_VLINE_INTERRUPT) { 2895 if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & LB_D5_VLINE_INTERRUPT) {
1916 disp_int_cont4 &= ~LB_D5_VLINE_INTERRUPT; 2896 rdev->irq.stat_regs.evergreen.disp_int_cont4 &= ~LB_D5_VLINE_INTERRUPT;
1917 DRM_DEBUG("IH: D5 vline\n"); 2897 DRM_DEBUG("IH: D5 vline\n");
1918 } 2898 }
1919 break; 2899 break;
@@ -1925,16 +2905,21 @@ restart_ih:
1925 case 6: /* D6 vblank/vline */ 2905 case 6: /* D6 vblank/vline */
1926 switch (src_data) { 2906 switch (src_data) {
1927 case 0: /* D6 vblank */ 2907 case 0: /* D6 vblank */
1928 if (disp_int_cont5 & LB_D6_VBLANK_INTERRUPT) { 2908 if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & LB_D6_VBLANK_INTERRUPT) {
1929 drm_handle_vblank(rdev->ddev, 5); 2909 if (rdev->irq.crtc_vblank_int[5]) {
1930 wake_up(&rdev->irq.vblank_queue); 2910 drm_handle_vblank(rdev->ddev, 5);
1931 disp_int_cont5 &= ~LB_D6_VBLANK_INTERRUPT; 2911 rdev->pm.vblank_sync = true;
2912 wake_up(&rdev->irq.vblank_queue);
2913 }
2914 if (rdev->irq.pflip[5])
2915 radeon_crtc_handle_flip(rdev, 5);
2916 rdev->irq.stat_regs.evergreen.disp_int_cont5 &= ~LB_D6_VBLANK_INTERRUPT;
1932 DRM_DEBUG("IH: D6 vblank\n"); 2917 DRM_DEBUG("IH: D6 vblank\n");
1933 } 2918 }
1934 break; 2919 break;
1935 case 1: /* D6 vline */ 2920 case 1: /* D6 vline */
1936 if (disp_int_cont5 & LB_D6_VLINE_INTERRUPT) { 2921 if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & LB_D6_VLINE_INTERRUPT) {
1937 disp_int_cont5 &= ~LB_D6_VLINE_INTERRUPT; 2922 rdev->irq.stat_regs.evergreen.disp_int_cont5 &= ~LB_D6_VLINE_INTERRUPT;
1938 DRM_DEBUG("IH: D6 vline\n"); 2923 DRM_DEBUG("IH: D6 vline\n");
1939 } 2924 }
1940 break; 2925 break;
@@ -1946,43 +2931,43 @@ restart_ih:
1946 case 42: /* HPD hotplug */ 2931 case 42: /* HPD hotplug */
1947 switch (src_data) { 2932 switch (src_data) {
1948 case 0: 2933 case 0:
1949 if (disp_int & DC_HPD1_INTERRUPT) { 2934 if (rdev->irq.stat_regs.evergreen.disp_int & DC_HPD1_INTERRUPT) {
1950 disp_int &= ~DC_HPD1_INTERRUPT; 2935 rdev->irq.stat_regs.evergreen.disp_int &= ~DC_HPD1_INTERRUPT;
1951 queue_hotplug = true; 2936 queue_hotplug = true;
1952 DRM_DEBUG("IH: HPD1\n"); 2937 DRM_DEBUG("IH: HPD1\n");
1953 } 2938 }
1954 break; 2939 break;
1955 case 1: 2940 case 1:
1956 if (disp_int_cont & DC_HPD2_INTERRUPT) { 2941 if (rdev->irq.stat_regs.evergreen.disp_int_cont & DC_HPD2_INTERRUPT) {
1957 disp_int_cont &= ~DC_HPD2_INTERRUPT; 2942 rdev->irq.stat_regs.evergreen.disp_int_cont &= ~DC_HPD2_INTERRUPT;
1958 queue_hotplug = true; 2943 queue_hotplug = true;
1959 DRM_DEBUG("IH: HPD2\n"); 2944 DRM_DEBUG("IH: HPD2\n");
1960 } 2945 }
1961 break; 2946 break;
1962 case 2: 2947 case 2:
1963 if (disp_int_cont2 & DC_HPD3_INTERRUPT) { 2948 if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & DC_HPD3_INTERRUPT) {
1964 disp_int_cont2 &= ~DC_HPD3_INTERRUPT; 2949 rdev->irq.stat_regs.evergreen.disp_int_cont2 &= ~DC_HPD3_INTERRUPT;
1965 queue_hotplug = true; 2950 queue_hotplug = true;
1966 DRM_DEBUG("IH: HPD3\n"); 2951 DRM_DEBUG("IH: HPD3\n");
1967 } 2952 }
1968 break; 2953 break;
1969 case 3: 2954 case 3:
1970 if (disp_int_cont3 & DC_HPD4_INTERRUPT) { 2955 if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & DC_HPD4_INTERRUPT) {
1971 disp_int_cont3 &= ~DC_HPD4_INTERRUPT; 2956 rdev->irq.stat_regs.evergreen.disp_int_cont3 &= ~DC_HPD4_INTERRUPT;
1972 queue_hotplug = true; 2957 queue_hotplug = true;
1973 DRM_DEBUG("IH: HPD4\n"); 2958 DRM_DEBUG("IH: HPD4\n");
1974 } 2959 }
1975 break; 2960 break;
1976 case 4: 2961 case 4:
1977 if (disp_int_cont4 & DC_HPD5_INTERRUPT) { 2962 if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & DC_HPD5_INTERRUPT) {
1978 disp_int_cont4 &= ~DC_HPD5_INTERRUPT; 2963 rdev->irq.stat_regs.evergreen.disp_int_cont4 &= ~DC_HPD5_INTERRUPT;
1979 queue_hotplug = true; 2964 queue_hotplug = true;
1980 DRM_DEBUG("IH: HPD5\n"); 2965 DRM_DEBUG("IH: HPD5\n");
1981 } 2966 }
1982 break; 2967 break;
1983 case 5: 2968 case 5:
1984 if (disp_int_cont5 & DC_HPD6_INTERRUPT) { 2969 if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & DC_HPD6_INTERRUPT) {
1985 disp_int_cont5 &= ~DC_HPD6_INTERRUPT; 2970 rdev->irq.stat_regs.evergreen.disp_int_cont5 &= ~DC_HPD6_INTERRUPT;
1986 queue_hotplug = true; 2971 queue_hotplug = true;
1987 DRM_DEBUG("IH: HPD6\n"); 2972 DRM_DEBUG("IH: HPD6\n");
1988 } 2973 }
@@ -2000,9 +2985,10 @@ restart_ih:
2000 break; 2985 break;
2001 case 181: /* CP EOP event */ 2986 case 181: /* CP EOP event */
2002 DRM_DEBUG("IH: CP EOP\n"); 2987 DRM_DEBUG("IH: CP EOP\n");
2988 radeon_fence_process(rdev);
2003 break; 2989 break;
2004 case 233: /* GUI IDLE */ 2990 case 233: /* GUI IDLE */
2005 DRM_DEBUG("IH: CP EOP\n"); 2991 DRM_DEBUG("IH: GUI idle\n");
2006 rdev->pm.gui_idle = true; 2992 rdev->pm.gui_idle = true;
2007 wake_up(&rdev->irq.idle_queue); 2993 wake_up(&rdev->irq.idle_queue);
2008 break; 2994 break;
@@ -2020,7 +3006,7 @@ restart_ih:
2020 if (wptr != rdev->ih.wptr) 3006 if (wptr != rdev->ih.wptr)
2021 goto restart_ih; 3007 goto restart_ih;
2022 if (queue_hotplug) 3008 if (queue_hotplug)
2023 queue_work(rdev->wq, &rdev->hotplug_work); 3009 schedule_work(&rdev->hotplug_work);
2024 rdev->ih.rptr = rptr; 3010 rdev->ih.rptr = rptr;
2025 WREG32(IH_RB_RPTR, rdev->ih.rptr); 3011 WREG32(IH_RB_RPTR, rdev->ih.rptr);
2026 spin_unlock_irqrestore(&rdev->ih.lock, flags); 3012 spin_unlock_irqrestore(&rdev->ih.lock, flags);
@@ -2031,12 +3017,31 @@ static int evergreen_startup(struct radeon_device *rdev)
2031{ 3017{
2032 int r; 3018 int r;
2033 3019
2034 if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) { 3020 /* enable pcie gen2 link */
2035 r = r600_init_microcode(rdev); 3021 if (!ASIC_IS_DCE5(rdev))
3022 evergreen_pcie_gen2_enable(rdev);
3023
3024 if (ASIC_IS_DCE5(rdev)) {
3025 if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw || !rdev->mc_fw) {
3026 r = ni_init_microcode(rdev);
3027 if (r) {
3028 DRM_ERROR("Failed to load firmware!\n");
3029 return r;
3030 }
3031 }
3032 r = ni_mc_load_microcode(rdev);
2036 if (r) { 3033 if (r) {
2037 DRM_ERROR("Failed to load firmware!\n"); 3034 DRM_ERROR("Failed to load MC firmware!\n");
2038 return r; 3035 return r;
2039 } 3036 }
3037 } else {
3038 if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) {
3039 r = r600_init_microcode(rdev);
3040 if (r) {
3041 DRM_ERROR("Failed to load firmware!\n");
3042 return r;
3043 }
3044 }
2040 } 3045 }
2041 3046
2042 evergreen_mc_program(rdev); 3047 evergreen_mc_program(rdev);
@@ -2048,26 +3053,18 @@ static int evergreen_startup(struct radeon_device *rdev)
2048 return r; 3053 return r;
2049 } 3054 }
2050 evergreen_gpu_init(rdev); 3055 evergreen_gpu_init(rdev);
2051#if 0
2052 if (!rdev->r600_blit.shader_obj) {
2053 r = r600_blit_init(rdev);
2054 if (r) {
2055 DRM_ERROR("radeon: failed blitter (%d).\n", r);
2056 return r;
2057 }
2058 }
2059 3056
2060 r = radeon_bo_reserve(rdev->r600_blit.shader_obj, false); 3057 r = evergreen_blit_init(rdev);
2061 if (unlikely(r != 0))
2062 return r;
2063 r = radeon_bo_pin(rdev->r600_blit.shader_obj, RADEON_GEM_DOMAIN_VRAM,
2064 &rdev->r600_blit.shader_gpu_addr);
2065 radeon_bo_unreserve(rdev->r600_blit.shader_obj);
2066 if (r) { 3058 if (r) {
2067 DRM_ERROR("failed to pin blit object %d\n", r); 3059 evergreen_blit_fini(rdev);
2068 return r; 3060 rdev->asic->copy = NULL;
3061 dev_warn(rdev->dev, "failed blitter (%d) falling back to memcpy\n", r);
2069 } 3062 }
2070#endif 3063
3064 /* allocate wb buffer */
3065 r = radeon_wb_init(rdev);
3066 if (r)
3067 return r;
2071 3068
2072 /* Enable IRQ */ 3069 /* Enable IRQ */
2073 r = r600_irq_init(rdev); 3070 r = r600_irq_init(rdev);
@@ -2087,8 +3084,6 @@ static int evergreen_startup(struct radeon_device *rdev)
2087 r = evergreen_cp_resume(rdev); 3084 r = evergreen_cp_resume(rdev);
2088 if (r) 3085 if (r)
2089 return r; 3086 return r;
2090 /* write back buffer are not vital so don't worry about failure */
2091 r600_wb_enable(rdev);
2092 3087
2093 return 0; 3088 return 0;
2094} 3089}
@@ -2097,6 +3092,11 @@ int evergreen_resume(struct radeon_device *rdev)
2097{ 3092{
2098 int r; 3093 int r;
2099 3094
3095 /* reset the asic, the gfx blocks are often in a bad state
3096 * after the driver is unloaded or after a resume
3097 */
3098 if (radeon_asic_reset(rdev))
3099 dev_warn(rdev->dev, "GPU reset failed !\n");
2100 /* Do not reset GPU before posting, on rv770 hw unlike on r500 hw, 3100 /* Do not reset GPU before posting, on rv770 hw unlike on r500 hw,
2101 * posting will perform necessary task to bring back GPU into good 3101 * posting will perform necessary task to bring back GPU into good
2102 * shape. 3102 * shape.
@@ -2106,13 +3106,13 @@ int evergreen_resume(struct radeon_device *rdev)
2106 3106
2107 r = evergreen_startup(rdev); 3107 r = evergreen_startup(rdev);
2108 if (r) { 3108 if (r) {
2109 DRM_ERROR("r600 startup failed on resume\n"); 3109 DRM_ERROR("evergreen startup failed on resume\n");
2110 return r; 3110 return r;
2111 } 3111 }
2112 3112
2113 r = r600_ib_test(rdev); 3113 r = r600_ib_test(rdev);
2114 if (r) { 3114 if (r) {
2115 DRM_ERROR("radeon: failled testing IB (%d).\n", r); 3115 DRM_ERROR("radeon: failed testing IB (%d).\n", r);
2116 return r; 3116 return r;
2117 } 3117 }
2118 3118
@@ -2122,45 +3122,44 @@ int evergreen_resume(struct radeon_device *rdev)
2122 3122
2123int evergreen_suspend(struct radeon_device *rdev) 3123int evergreen_suspend(struct radeon_device *rdev)
2124{ 3124{
2125#if 0
2126 int r; 3125 int r;
2127#endif 3126
2128 /* FIXME: we should wait for ring to be empty */ 3127 /* FIXME: we should wait for ring to be empty */
2129 r700_cp_stop(rdev); 3128 r700_cp_stop(rdev);
2130 rdev->cp.ready = false; 3129 rdev->cp.ready = false;
2131 evergreen_irq_suspend(rdev); 3130 evergreen_irq_suspend(rdev);
2132 r600_wb_disable(rdev); 3131 radeon_wb_disable(rdev);
2133 evergreen_pcie_gart_disable(rdev); 3132 evergreen_pcie_gart_disable(rdev);
2134#if 0 3133
2135 /* unpin shaders bo */ 3134 /* unpin shaders bo */
2136 r = radeon_bo_reserve(rdev->r600_blit.shader_obj, false); 3135 r = radeon_bo_reserve(rdev->r600_blit.shader_obj, false);
2137 if (likely(r == 0)) { 3136 if (likely(r == 0)) {
2138 radeon_bo_unpin(rdev->r600_blit.shader_obj); 3137 radeon_bo_unpin(rdev->r600_blit.shader_obj);
2139 radeon_bo_unreserve(rdev->r600_blit.shader_obj); 3138 radeon_bo_unreserve(rdev->r600_blit.shader_obj);
2140 } 3139 }
2141#endif 3140
2142 return 0; 3141 return 0;
2143} 3142}
2144 3143
2145static bool evergreen_card_posted(struct radeon_device *rdev) 3144int evergreen_copy_blit(struct radeon_device *rdev,
3145 uint64_t src_offset, uint64_t dst_offset,
3146 unsigned num_pages, struct radeon_fence *fence)
2146{ 3147{
2147 u32 reg; 3148 int r;
2148
2149 /* first check CRTCs */
2150 reg = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET) |
2151 RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET) |
2152 RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET) |
2153 RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET) |
2154 RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET) |
2155 RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET);
2156 if (reg & EVERGREEN_CRTC_MASTER_EN)
2157 return true;
2158
2159 /* then check MEM_SIZE, in case the crtcs are off */
2160 if (RREG32(CONFIG_MEMSIZE))
2161 return true;
2162 3149
2163 return false; 3150 mutex_lock(&rdev->r600_blit.mutex);
3151 rdev->r600_blit.vb_ib = NULL;
3152 r = evergreen_blit_prepare_copy(rdev, num_pages * RADEON_GPU_PAGE_SIZE);
3153 if (r) {
3154 if (rdev->r600_blit.vb_ib)
3155 radeon_ib_free(rdev, &rdev->r600_blit.vb_ib);
3156 mutex_unlock(&rdev->r600_blit.mutex);
3157 return r;
3158 }
3159 evergreen_kms_blit_copy(rdev, src_offset, dst_offset, num_pages * RADEON_GPU_PAGE_SIZE);
3160 evergreen_blit_done_copy(rdev, fence);
3161 mutex_unlock(&rdev->r600_blit.mutex);
3162 return 0;
2164} 3163}
2165 3164
2166/* Plan is to move initialization in that function and use 3165/* Plan is to move initialization in that function and use
@@ -2173,9 +3172,6 @@ int evergreen_init(struct radeon_device *rdev)
2173{ 3172{
2174 int r; 3173 int r;
2175 3174
2176 r = radeon_dummy_page_init(rdev);
2177 if (r)
2178 return r;
2179 /* This don't do much */ 3175 /* This don't do much */
2180 r = radeon_gem_init(rdev); 3176 r = radeon_gem_init(rdev);
2181 if (r) 3177 if (r)
@@ -2187,14 +3183,19 @@ int evergreen_init(struct radeon_device *rdev)
2187 } 3183 }
2188 /* Must be an ATOMBIOS */ 3184 /* Must be an ATOMBIOS */
2189 if (!rdev->is_atom_bios) { 3185 if (!rdev->is_atom_bios) {
2190 dev_err(rdev->dev, "Expecting atombios for R600 GPU\n"); 3186 dev_err(rdev->dev, "Expecting atombios for evergreen GPU\n");
2191 return -EINVAL; 3187 return -EINVAL;
2192 } 3188 }
2193 r = radeon_atombios_init(rdev); 3189 r = radeon_atombios_init(rdev);
2194 if (r) 3190 if (r)
2195 return r; 3191 return r;
3192 /* reset the asic, the gfx blocks are often in a bad state
3193 * after the driver is unloaded or after a resume
3194 */
3195 if (radeon_asic_reset(rdev))
3196 dev_warn(rdev->dev, "GPU reset failed !\n");
2196 /* Post card if necessary */ 3197 /* Post card if necessary */
2197 if (!evergreen_card_posted(rdev)) { 3198 if (!radeon_card_posted(rdev)) {
2198 if (!rdev->bios) { 3199 if (!rdev->bios) {
2199 dev_err(rdev->dev, "Card not posted and no BIOS - ignoring\n"); 3200 dev_err(rdev->dev, "Card not posted and no BIOS - ignoring\n");
2200 return -EINVAL; 3201 return -EINVAL;
@@ -2246,8 +3247,8 @@ int evergreen_init(struct radeon_device *rdev)
2246 if (r) { 3247 if (r) {
2247 dev_err(rdev->dev, "disabling GPU acceleration\n"); 3248 dev_err(rdev->dev, "disabling GPU acceleration\n");
2248 r700_cp_fini(rdev); 3249 r700_cp_fini(rdev);
2249 r600_wb_fini(rdev);
2250 r600_irq_fini(rdev); 3250 r600_irq_fini(rdev);
3251 radeon_wb_fini(rdev);
2251 radeon_irq_kms_fini(rdev); 3252 radeon_irq_kms_fini(rdev);
2252 evergreen_pcie_gart_fini(rdev); 3253 evergreen_pcie_gart_fini(rdev);
2253 rdev->accel_working = false; 3254 rdev->accel_working = false;
@@ -2269,10 +3270,11 @@ int evergreen_init(struct radeon_device *rdev)
2269 3270
2270void evergreen_fini(struct radeon_device *rdev) 3271void evergreen_fini(struct radeon_device *rdev)
2271{ 3272{
2272 /*r600_blit_fini(rdev);*/ 3273 evergreen_blit_fini(rdev);
2273 r700_cp_fini(rdev); 3274 r700_cp_fini(rdev);
2274 r600_wb_fini(rdev);
2275 r600_irq_fini(rdev); 3275 r600_irq_fini(rdev);
3276 radeon_wb_fini(rdev);
3277 radeon_ib_pool_fini(rdev);
2276 radeon_irq_kms_fini(rdev); 3278 radeon_irq_kms_fini(rdev);
2277 evergreen_pcie_gart_fini(rdev); 3279 evergreen_pcie_gart_fini(rdev);
2278 radeon_gem_fini(rdev); 3280 radeon_gem_fini(rdev);
@@ -2282,5 +3284,56 @@ void evergreen_fini(struct radeon_device *rdev)
2282 radeon_atombios_fini(rdev); 3284 radeon_atombios_fini(rdev);
2283 kfree(rdev->bios); 3285 kfree(rdev->bios);
2284 rdev->bios = NULL; 3286 rdev->bios = NULL;
2285 radeon_dummy_page_fini(rdev); 3287}
3288
3289static void evergreen_pcie_gen2_enable(struct radeon_device *rdev)
3290{
3291 u32 link_width_cntl, speed_cntl;
3292
3293 if (radeon_pcie_gen2 == 0)
3294 return;
3295
3296 if (rdev->flags & RADEON_IS_IGP)
3297 return;
3298
3299 if (!(rdev->flags & RADEON_IS_PCIE))
3300 return;
3301
3302 /* x2 cards have a special sequence */
3303 if (ASIC_IS_X2(rdev))
3304 return;
3305
3306 speed_cntl = RREG32_PCIE_P(PCIE_LC_SPEED_CNTL);
3307 if ((speed_cntl & LC_OTHER_SIDE_EVER_SENT_GEN2) ||
3308 (speed_cntl & LC_OTHER_SIDE_SUPPORTS_GEN2)) {
3309
3310 link_width_cntl = RREG32_PCIE_P(PCIE_LC_LINK_WIDTH_CNTL);
3311 link_width_cntl &= ~LC_UPCONFIGURE_DIS;
3312 WREG32_PCIE_P(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
3313
3314 speed_cntl = RREG32_PCIE_P(PCIE_LC_SPEED_CNTL);
3315 speed_cntl &= ~LC_TARGET_LINK_SPEED_OVERRIDE_EN;
3316 WREG32_PCIE_P(PCIE_LC_SPEED_CNTL, speed_cntl);
3317
3318 speed_cntl = RREG32_PCIE_P(PCIE_LC_SPEED_CNTL);
3319 speed_cntl |= LC_CLR_FAILED_SPD_CHANGE_CNT;
3320 WREG32_PCIE_P(PCIE_LC_SPEED_CNTL, speed_cntl);
3321
3322 speed_cntl = RREG32_PCIE_P(PCIE_LC_SPEED_CNTL);
3323 speed_cntl &= ~LC_CLR_FAILED_SPD_CHANGE_CNT;
3324 WREG32_PCIE_P(PCIE_LC_SPEED_CNTL, speed_cntl);
3325
3326 speed_cntl = RREG32_PCIE_P(PCIE_LC_SPEED_CNTL);
3327 speed_cntl |= LC_GEN2_EN_STRAP;
3328 WREG32_PCIE_P(PCIE_LC_SPEED_CNTL, speed_cntl);
3329
3330 } else {
3331 link_width_cntl = RREG32_PCIE_P(PCIE_LC_LINK_WIDTH_CNTL);
3332 /* XXX: only disable it if gen1 bridge vendor == 0x111d or 0x1106 */
3333 if (1)
3334 link_width_cntl |= LC_UPCONFIGURE_DIS;
3335 else
3336 link_width_cntl &= ~LC_UPCONFIGURE_DIS;
3337 WREG32_PCIE_P(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
3338 }
2286} 3339}
diff --git a/drivers/gpu/drm/radeon/evergreen_blit_kms.c b/drivers/gpu/drm/radeon/evergreen_blit_kms.c
new file mode 100644
index 000000000000..2eb251858e72
--- /dev/null
+++ b/drivers/gpu/drm/radeon/evergreen_blit_kms.c
@@ -0,0 +1,988 @@
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 "drmP.h"
28#include "drm.h"
29#include "radeon_drm.h"
30#include "radeon.h"
31
32#include "evergreend.h"
33#include "evergreen_blit_shaders.h"
34#include "cayman_blit_shaders.h"
35
36#define DI_PT_RECTLIST 0x11
37#define DI_INDEX_SIZE_16_BIT 0x0
38#define DI_SRC_SEL_AUTO_INDEX 0x2
39
40#define FMT_8 0x1
41#define FMT_5_6_5 0x8
42#define FMT_8_8_8_8 0x1a
43#define COLOR_8 0x1
44#define COLOR_5_6_5 0x8
45#define COLOR_8_8_8_8 0x1a
46
47/* emits 17 */
48static void
49set_render_target(struct radeon_device *rdev, int format,
50 int w, int h, u64 gpu_addr)
51{
52 u32 cb_color_info;
53 int pitch, slice;
54
55 h = ALIGN(h, 8);
56 if (h < 8)
57 h = 8;
58
59 cb_color_info = ((format << 2) | (1 << 24) | (1 << 8));
60 pitch = (w / 8) - 1;
61 slice = ((w * h) / 64) - 1;
62
63 radeon_ring_write(rdev, PACKET3(PACKET3_SET_CONTEXT_REG, 15));
64 radeon_ring_write(rdev, (CB_COLOR0_BASE - PACKET3_SET_CONTEXT_REG_START) >> 2);
65 radeon_ring_write(rdev, gpu_addr >> 8);
66 radeon_ring_write(rdev, pitch);
67 radeon_ring_write(rdev, slice);
68 radeon_ring_write(rdev, 0);
69 radeon_ring_write(rdev, cb_color_info);
70 radeon_ring_write(rdev, (1 << 4));
71 radeon_ring_write(rdev, (w - 1) | ((h - 1) << 16));
72 radeon_ring_write(rdev, 0);
73 radeon_ring_write(rdev, 0);
74 radeon_ring_write(rdev, 0);
75 radeon_ring_write(rdev, 0);
76 radeon_ring_write(rdev, 0);
77 radeon_ring_write(rdev, 0);
78 radeon_ring_write(rdev, 0);
79 radeon_ring_write(rdev, 0);
80}
81
82/* emits 5dw */
83static void
84cp_set_surface_sync(struct radeon_device *rdev,
85 u32 sync_type, u32 size,
86 u64 mc_addr)
87{
88 u32 cp_coher_size;
89
90 if (size == 0xffffffff)
91 cp_coher_size = 0xffffffff;
92 else
93 cp_coher_size = ((size + 255) >> 8);
94
95 radeon_ring_write(rdev, PACKET3(PACKET3_SURFACE_SYNC, 3));
96 radeon_ring_write(rdev, sync_type);
97 radeon_ring_write(rdev, cp_coher_size);
98 radeon_ring_write(rdev, mc_addr >> 8);
99 radeon_ring_write(rdev, 10); /* poll interval */
100}
101
102/* emits 11dw + 1 surface sync = 16dw */
103static void
104set_shaders(struct radeon_device *rdev)
105{
106 u64 gpu_addr;
107
108 /* VS */
109 gpu_addr = rdev->r600_blit.shader_gpu_addr + rdev->r600_blit.vs_offset;
110 radeon_ring_write(rdev, PACKET3(PACKET3_SET_CONTEXT_REG, 3));
111 radeon_ring_write(rdev, (SQ_PGM_START_VS - PACKET3_SET_CONTEXT_REG_START) >> 2);
112 radeon_ring_write(rdev, gpu_addr >> 8);
113 radeon_ring_write(rdev, 2);
114 radeon_ring_write(rdev, 0);
115
116 /* PS */
117 gpu_addr = rdev->r600_blit.shader_gpu_addr + rdev->r600_blit.ps_offset;
118 radeon_ring_write(rdev, PACKET3(PACKET3_SET_CONTEXT_REG, 4));
119 radeon_ring_write(rdev, (SQ_PGM_START_PS - PACKET3_SET_CONTEXT_REG_START) >> 2);
120 radeon_ring_write(rdev, gpu_addr >> 8);
121 radeon_ring_write(rdev, 1);
122 radeon_ring_write(rdev, 0);
123 radeon_ring_write(rdev, 2);
124
125 gpu_addr = rdev->r600_blit.shader_gpu_addr + rdev->r600_blit.vs_offset;
126 cp_set_surface_sync(rdev, PACKET3_SH_ACTION_ENA, 512, gpu_addr);
127}
128
129/* emits 10 + 1 sync (5) = 15 */
130static void
131set_vtx_resource(struct radeon_device *rdev, u64 gpu_addr)
132{
133 u32 sq_vtx_constant_word2, sq_vtx_constant_word3;
134
135 /* high addr, stride */
136 sq_vtx_constant_word2 = ((upper_32_bits(gpu_addr) & 0xff) | (16 << 8));
137#ifdef __BIG_ENDIAN
138 sq_vtx_constant_word2 |= (2 << 30);
139#endif
140 /* xyzw swizzles */
141 sq_vtx_constant_word3 = (0 << 3) | (1 << 6) | (2 << 9) | (3 << 12);
142
143 radeon_ring_write(rdev, PACKET3(PACKET3_SET_RESOURCE, 8));
144 radeon_ring_write(rdev, 0x580);
145 radeon_ring_write(rdev, gpu_addr & 0xffffffff);
146 radeon_ring_write(rdev, 48 - 1); /* size */
147 radeon_ring_write(rdev, sq_vtx_constant_word2);
148 radeon_ring_write(rdev, sq_vtx_constant_word3);
149 radeon_ring_write(rdev, 0);
150 radeon_ring_write(rdev, 0);
151 radeon_ring_write(rdev, 0);
152 radeon_ring_write(rdev, SQ_TEX_VTX_VALID_BUFFER << 30);
153
154 if ((rdev->family == CHIP_CEDAR) ||
155 (rdev->family == CHIP_PALM) ||
156 (rdev->family == CHIP_SUMO) ||
157 (rdev->family == CHIP_SUMO2) ||
158 (rdev->family == CHIP_CAICOS))
159 cp_set_surface_sync(rdev,
160 PACKET3_TC_ACTION_ENA, 48, gpu_addr);
161 else
162 cp_set_surface_sync(rdev,
163 PACKET3_VC_ACTION_ENA, 48, gpu_addr);
164
165}
166
167/* emits 10 */
168static void
169set_tex_resource(struct radeon_device *rdev,
170 int format, int w, int h, int pitch,
171 u64 gpu_addr)
172{
173 u32 sq_tex_resource_word0, sq_tex_resource_word1;
174 u32 sq_tex_resource_word4, sq_tex_resource_word7;
175
176 if (h < 1)
177 h = 1;
178
179 sq_tex_resource_word0 = (1 << 0); /* 2D */
180 sq_tex_resource_word0 |= ((((pitch >> 3) - 1) << 6) |
181 ((w - 1) << 18));
182 sq_tex_resource_word1 = ((h - 1) << 0) | (1 << 28);
183 /* xyzw swizzles */
184 sq_tex_resource_word4 = (0 << 16) | (1 << 19) | (2 << 22) | (3 << 25);
185
186 sq_tex_resource_word7 = format | (SQ_TEX_VTX_VALID_TEXTURE << 30);
187
188 radeon_ring_write(rdev, PACKET3(PACKET3_SET_RESOURCE, 8));
189 radeon_ring_write(rdev, 0);
190 radeon_ring_write(rdev, sq_tex_resource_word0);
191 radeon_ring_write(rdev, sq_tex_resource_word1);
192 radeon_ring_write(rdev, gpu_addr >> 8);
193 radeon_ring_write(rdev, gpu_addr >> 8);
194 radeon_ring_write(rdev, sq_tex_resource_word4);
195 radeon_ring_write(rdev, 0);
196 radeon_ring_write(rdev, 0);
197 radeon_ring_write(rdev, sq_tex_resource_word7);
198}
199
200/* emits 12 */
201static void
202set_scissors(struct radeon_device *rdev, int x1, int y1,
203 int x2, int y2)
204{
205 /* workaround some hw bugs */
206 if (x2 == 0)
207 x1 = 1;
208 if (y2 == 0)
209 y1 = 1;
210 if (rdev->family == CHIP_CAYMAN) {
211 if ((x2 == 1) && (y2 == 1))
212 x2 = 2;
213 }
214
215 radeon_ring_write(rdev, PACKET3(PACKET3_SET_CONTEXT_REG, 2));
216 radeon_ring_write(rdev, (PA_SC_SCREEN_SCISSOR_TL - PACKET3_SET_CONTEXT_REG_START) >> 2);
217 radeon_ring_write(rdev, (x1 << 0) | (y1 << 16));
218 radeon_ring_write(rdev, (x2 << 0) | (y2 << 16));
219
220 radeon_ring_write(rdev, PACKET3(PACKET3_SET_CONTEXT_REG, 2));
221 radeon_ring_write(rdev, (PA_SC_GENERIC_SCISSOR_TL - PACKET3_SET_CONTEXT_REG_START) >> 2);
222 radeon_ring_write(rdev, (x1 << 0) | (y1 << 16) | (1 << 31));
223 radeon_ring_write(rdev, (x2 << 0) | (y2 << 16));
224
225 radeon_ring_write(rdev, PACKET3(PACKET3_SET_CONTEXT_REG, 2));
226 radeon_ring_write(rdev, (PA_SC_WINDOW_SCISSOR_TL - PACKET3_SET_CONTEXT_REG_START) >> 2);
227 radeon_ring_write(rdev, (x1 << 0) | (y1 << 16) | (1 << 31));
228 radeon_ring_write(rdev, (x2 << 0) | (y2 << 16));
229}
230
231/* emits 10 */
232static void
233draw_auto(struct radeon_device *rdev)
234{
235 radeon_ring_write(rdev, PACKET3(PACKET3_SET_CONFIG_REG, 1));
236 radeon_ring_write(rdev, (VGT_PRIMITIVE_TYPE - PACKET3_SET_CONFIG_REG_START) >> 2);
237 radeon_ring_write(rdev, DI_PT_RECTLIST);
238
239 radeon_ring_write(rdev, PACKET3(PACKET3_INDEX_TYPE, 0));
240 radeon_ring_write(rdev,
241#ifdef __BIG_ENDIAN
242 (2 << 2) |
243#endif
244 DI_INDEX_SIZE_16_BIT);
245
246 radeon_ring_write(rdev, PACKET3(PACKET3_NUM_INSTANCES, 0));
247 radeon_ring_write(rdev, 1);
248
249 radeon_ring_write(rdev, PACKET3(PACKET3_DRAW_INDEX_AUTO, 1));
250 radeon_ring_write(rdev, 3);
251 radeon_ring_write(rdev, DI_SRC_SEL_AUTO_INDEX);
252
253}
254
255/* emits 39 */
256static void
257set_default_state(struct radeon_device *rdev)
258{
259 u32 sq_config, sq_gpr_resource_mgmt_1, sq_gpr_resource_mgmt_2, sq_gpr_resource_mgmt_3;
260 u32 sq_thread_resource_mgmt, sq_thread_resource_mgmt_2;
261 u32 sq_stack_resource_mgmt_1, sq_stack_resource_mgmt_2, sq_stack_resource_mgmt_3;
262 int num_ps_gprs, num_vs_gprs, num_temp_gprs;
263 int num_gs_gprs, num_es_gprs, num_hs_gprs, num_ls_gprs;
264 int num_ps_threads, num_vs_threads, num_gs_threads, num_es_threads;
265 int num_hs_threads, num_ls_threads;
266 int num_ps_stack_entries, num_vs_stack_entries, num_gs_stack_entries, num_es_stack_entries;
267 int num_hs_stack_entries, num_ls_stack_entries;
268 u64 gpu_addr;
269 int dwords;
270
271 /* set clear context state */
272 radeon_ring_write(rdev, PACKET3(PACKET3_CLEAR_STATE, 0));
273 radeon_ring_write(rdev, 0);
274
275 if (rdev->family < CHIP_CAYMAN) {
276 switch (rdev->family) {
277 case CHIP_CEDAR:
278 default:
279 num_ps_gprs = 93;
280 num_vs_gprs = 46;
281 num_temp_gprs = 4;
282 num_gs_gprs = 31;
283 num_es_gprs = 31;
284 num_hs_gprs = 23;
285 num_ls_gprs = 23;
286 num_ps_threads = 96;
287 num_vs_threads = 16;
288 num_gs_threads = 16;
289 num_es_threads = 16;
290 num_hs_threads = 16;
291 num_ls_threads = 16;
292 num_ps_stack_entries = 42;
293 num_vs_stack_entries = 42;
294 num_gs_stack_entries = 42;
295 num_es_stack_entries = 42;
296 num_hs_stack_entries = 42;
297 num_ls_stack_entries = 42;
298 break;
299 case CHIP_REDWOOD:
300 num_ps_gprs = 93;
301 num_vs_gprs = 46;
302 num_temp_gprs = 4;
303 num_gs_gprs = 31;
304 num_es_gprs = 31;
305 num_hs_gprs = 23;
306 num_ls_gprs = 23;
307 num_ps_threads = 128;
308 num_vs_threads = 20;
309 num_gs_threads = 20;
310 num_es_threads = 20;
311 num_hs_threads = 20;
312 num_ls_threads = 20;
313 num_ps_stack_entries = 42;
314 num_vs_stack_entries = 42;
315 num_gs_stack_entries = 42;
316 num_es_stack_entries = 42;
317 num_hs_stack_entries = 42;
318 num_ls_stack_entries = 42;
319 break;
320 case CHIP_JUNIPER:
321 num_ps_gprs = 93;
322 num_vs_gprs = 46;
323 num_temp_gprs = 4;
324 num_gs_gprs = 31;
325 num_es_gprs = 31;
326 num_hs_gprs = 23;
327 num_ls_gprs = 23;
328 num_ps_threads = 128;
329 num_vs_threads = 20;
330 num_gs_threads = 20;
331 num_es_threads = 20;
332 num_hs_threads = 20;
333 num_ls_threads = 20;
334 num_ps_stack_entries = 85;
335 num_vs_stack_entries = 85;
336 num_gs_stack_entries = 85;
337 num_es_stack_entries = 85;
338 num_hs_stack_entries = 85;
339 num_ls_stack_entries = 85;
340 break;
341 case CHIP_CYPRESS:
342 case CHIP_HEMLOCK:
343 num_ps_gprs = 93;
344 num_vs_gprs = 46;
345 num_temp_gprs = 4;
346 num_gs_gprs = 31;
347 num_es_gprs = 31;
348 num_hs_gprs = 23;
349 num_ls_gprs = 23;
350 num_ps_threads = 128;
351 num_vs_threads = 20;
352 num_gs_threads = 20;
353 num_es_threads = 20;
354 num_hs_threads = 20;
355 num_ls_threads = 20;
356 num_ps_stack_entries = 85;
357 num_vs_stack_entries = 85;
358 num_gs_stack_entries = 85;
359 num_es_stack_entries = 85;
360 num_hs_stack_entries = 85;
361 num_ls_stack_entries = 85;
362 break;
363 case CHIP_PALM:
364 num_ps_gprs = 93;
365 num_vs_gprs = 46;
366 num_temp_gprs = 4;
367 num_gs_gprs = 31;
368 num_es_gprs = 31;
369 num_hs_gprs = 23;
370 num_ls_gprs = 23;
371 num_ps_threads = 96;
372 num_vs_threads = 16;
373 num_gs_threads = 16;
374 num_es_threads = 16;
375 num_hs_threads = 16;
376 num_ls_threads = 16;
377 num_ps_stack_entries = 42;
378 num_vs_stack_entries = 42;
379 num_gs_stack_entries = 42;
380 num_es_stack_entries = 42;
381 num_hs_stack_entries = 42;
382 num_ls_stack_entries = 42;
383 break;
384 case CHIP_SUMO:
385 num_ps_gprs = 93;
386 num_vs_gprs = 46;
387 num_temp_gprs = 4;
388 num_gs_gprs = 31;
389 num_es_gprs = 31;
390 num_hs_gprs = 23;
391 num_ls_gprs = 23;
392 num_ps_threads = 96;
393 num_vs_threads = 25;
394 num_gs_threads = 25;
395 num_es_threads = 25;
396 num_hs_threads = 25;
397 num_ls_threads = 25;
398 num_ps_stack_entries = 42;
399 num_vs_stack_entries = 42;
400 num_gs_stack_entries = 42;
401 num_es_stack_entries = 42;
402 num_hs_stack_entries = 42;
403 num_ls_stack_entries = 42;
404 break;
405 case CHIP_SUMO2:
406 num_ps_gprs = 93;
407 num_vs_gprs = 46;
408 num_temp_gprs = 4;
409 num_gs_gprs = 31;
410 num_es_gprs = 31;
411 num_hs_gprs = 23;
412 num_ls_gprs = 23;
413 num_ps_threads = 96;
414 num_vs_threads = 25;
415 num_gs_threads = 25;
416 num_es_threads = 25;
417 num_hs_threads = 25;
418 num_ls_threads = 25;
419 num_ps_stack_entries = 85;
420 num_vs_stack_entries = 85;
421 num_gs_stack_entries = 85;
422 num_es_stack_entries = 85;
423 num_hs_stack_entries = 85;
424 num_ls_stack_entries = 85;
425 break;
426 case CHIP_BARTS:
427 num_ps_gprs = 93;
428 num_vs_gprs = 46;
429 num_temp_gprs = 4;
430 num_gs_gprs = 31;
431 num_es_gprs = 31;
432 num_hs_gprs = 23;
433 num_ls_gprs = 23;
434 num_ps_threads = 128;
435 num_vs_threads = 20;
436 num_gs_threads = 20;
437 num_es_threads = 20;
438 num_hs_threads = 20;
439 num_ls_threads = 20;
440 num_ps_stack_entries = 85;
441 num_vs_stack_entries = 85;
442 num_gs_stack_entries = 85;
443 num_es_stack_entries = 85;
444 num_hs_stack_entries = 85;
445 num_ls_stack_entries = 85;
446 break;
447 case CHIP_TURKS:
448 num_ps_gprs = 93;
449 num_vs_gprs = 46;
450 num_temp_gprs = 4;
451 num_gs_gprs = 31;
452 num_es_gprs = 31;
453 num_hs_gprs = 23;
454 num_ls_gprs = 23;
455 num_ps_threads = 128;
456 num_vs_threads = 20;
457 num_gs_threads = 20;
458 num_es_threads = 20;
459 num_hs_threads = 20;
460 num_ls_threads = 20;
461 num_ps_stack_entries = 42;
462 num_vs_stack_entries = 42;
463 num_gs_stack_entries = 42;
464 num_es_stack_entries = 42;
465 num_hs_stack_entries = 42;
466 num_ls_stack_entries = 42;
467 break;
468 case CHIP_CAICOS:
469 num_ps_gprs = 93;
470 num_vs_gprs = 46;
471 num_temp_gprs = 4;
472 num_gs_gprs = 31;
473 num_es_gprs = 31;
474 num_hs_gprs = 23;
475 num_ls_gprs = 23;
476 num_ps_threads = 128;
477 num_vs_threads = 10;
478 num_gs_threads = 10;
479 num_es_threads = 10;
480 num_hs_threads = 10;
481 num_ls_threads = 10;
482 num_ps_stack_entries = 42;
483 num_vs_stack_entries = 42;
484 num_gs_stack_entries = 42;
485 num_es_stack_entries = 42;
486 num_hs_stack_entries = 42;
487 num_ls_stack_entries = 42;
488 break;
489 }
490
491 if ((rdev->family == CHIP_CEDAR) ||
492 (rdev->family == CHIP_PALM) ||
493 (rdev->family == CHIP_SUMO) ||
494 (rdev->family == CHIP_SUMO2) ||
495 (rdev->family == CHIP_CAICOS))
496 sq_config = 0;
497 else
498 sq_config = VC_ENABLE;
499
500 sq_config |= (EXPORT_SRC_C |
501 CS_PRIO(0) |
502 LS_PRIO(0) |
503 HS_PRIO(0) |
504 PS_PRIO(0) |
505 VS_PRIO(1) |
506 GS_PRIO(2) |
507 ES_PRIO(3));
508
509 sq_gpr_resource_mgmt_1 = (NUM_PS_GPRS(num_ps_gprs) |
510 NUM_VS_GPRS(num_vs_gprs) |
511 NUM_CLAUSE_TEMP_GPRS(num_temp_gprs));
512 sq_gpr_resource_mgmt_2 = (NUM_GS_GPRS(num_gs_gprs) |
513 NUM_ES_GPRS(num_es_gprs));
514 sq_gpr_resource_mgmt_3 = (NUM_HS_GPRS(num_hs_gprs) |
515 NUM_LS_GPRS(num_ls_gprs));
516 sq_thread_resource_mgmt = (NUM_PS_THREADS(num_ps_threads) |
517 NUM_VS_THREADS(num_vs_threads) |
518 NUM_GS_THREADS(num_gs_threads) |
519 NUM_ES_THREADS(num_es_threads));
520 sq_thread_resource_mgmt_2 = (NUM_HS_THREADS(num_hs_threads) |
521 NUM_LS_THREADS(num_ls_threads));
522 sq_stack_resource_mgmt_1 = (NUM_PS_STACK_ENTRIES(num_ps_stack_entries) |
523 NUM_VS_STACK_ENTRIES(num_vs_stack_entries));
524 sq_stack_resource_mgmt_2 = (NUM_GS_STACK_ENTRIES(num_gs_stack_entries) |
525 NUM_ES_STACK_ENTRIES(num_es_stack_entries));
526 sq_stack_resource_mgmt_3 = (NUM_HS_STACK_ENTRIES(num_hs_stack_entries) |
527 NUM_LS_STACK_ENTRIES(num_ls_stack_entries));
528
529 /* disable dyn gprs */
530 radeon_ring_write(rdev, PACKET3(PACKET3_SET_CONFIG_REG, 1));
531 radeon_ring_write(rdev, (SQ_DYN_GPR_CNTL_PS_FLUSH_REQ - PACKET3_SET_CONFIG_REG_START) >> 2);
532 radeon_ring_write(rdev, 0);
533
534 /* setup LDS */
535 radeon_ring_write(rdev, PACKET3(PACKET3_SET_CONFIG_REG, 1));
536 radeon_ring_write(rdev, (SQ_LDS_RESOURCE_MGMT - PACKET3_SET_CONFIG_REG_START) >> 2);
537 radeon_ring_write(rdev, 0x10001000);
538
539 /* SQ config */
540 radeon_ring_write(rdev, PACKET3(PACKET3_SET_CONFIG_REG, 11));
541 radeon_ring_write(rdev, (SQ_CONFIG - PACKET3_SET_CONFIG_REG_START) >> 2);
542 radeon_ring_write(rdev, sq_config);
543 radeon_ring_write(rdev, sq_gpr_resource_mgmt_1);
544 radeon_ring_write(rdev, sq_gpr_resource_mgmt_2);
545 radeon_ring_write(rdev, sq_gpr_resource_mgmt_3);
546 radeon_ring_write(rdev, 0);
547 radeon_ring_write(rdev, 0);
548 radeon_ring_write(rdev, sq_thread_resource_mgmt);
549 radeon_ring_write(rdev, sq_thread_resource_mgmt_2);
550 radeon_ring_write(rdev, sq_stack_resource_mgmt_1);
551 radeon_ring_write(rdev, sq_stack_resource_mgmt_2);
552 radeon_ring_write(rdev, sq_stack_resource_mgmt_3);
553 }
554
555 /* CONTEXT_CONTROL */
556 radeon_ring_write(rdev, 0xc0012800);
557 radeon_ring_write(rdev, 0x80000000);
558 radeon_ring_write(rdev, 0x80000000);
559
560 /* SQ_VTX_BASE_VTX_LOC */
561 radeon_ring_write(rdev, 0xc0026f00);
562 radeon_ring_write(rdev, 0x00000000);
563 radeon_ring_write(rdev, 0x00000000);
564 radeon_ring_write(rdev, 0x00000000);
565
566 /* SET_SAMPLER */
567 radeon_ring_write(rdev, 0xc0036e00);
568 radeon_ring_write(rdev, 0x00000000);
569 radeon_ring_write(rdev, 0x00000012);
570 radeon_ring_write(rdev, 0x00000000);
571 radeon_ring_write(rdev, 0x00000000);
572
573 /* set to DX10/11 mode */
574 radeon_ring_write(rdev, PACKET3(PACKET3_MODE_CONTROL, 0));
575 radeon_ring_write(rdev, 1);
576
577 /* emit an IB pointing at default state */
578 dwords = ALIGN(rdev->r600_blit.state_len, 0x10);
579 gpu_addr = rdev->r600_blit.shader_gpu_addr + rdev->r600_blit.state_offset;
580 radeon_ring_write(rdev, PACKET3(PACKET3_INDIRECT_BUFFER, 2));
581 radeon_ring_write(rdev, gpu_addr & 0xFFFFFFFC);
582 radeon_ring_write(rdev, upper_32_bits(gpu_addr) & 0xFF);
583 radeon_ring_write(rdev, dwords);
584
585}
586
587static inline uint32_t i2f(uint32_t input)
588{
589 u32 result, i, exponent, fraction;
590
591 if ((input & 0x3fff) == 0)
592 result = 0; /* 0 is a special case */
593 else {
594 exponent = 140; /* exponent biased by 127; */
595 fraction = (input & 0x3fff) << 10; /* cheat and only
596 handle numbers below 2^^15 */
597 for (i = 0; i < 14; i++) {
598 if (fraction & 0x800000)
599 break;
600 else {
601 fraction = fraction << 1; /* keep
602 shifting left until top bit = 1 */
603 exponent = exponent - 1;
604 }
605 }
606 result = exponent << 23 | (fraction & 0x7fffff); /* mask
607 off top bit; assumed 1 */
608 }
609 return result;
610}
611
612int evergreen_blit_init(struct radeon_device *rdev)
613{
614 u32 obj_size;
615 int i, r, dwords;
616 void *ptr;
617 u32 packet2s[16];
618 int num_packet2s = 0;
619
620 /* pin copy shader into vram if already initialized */
621 if (rdev->r600_blit.shader_obj)
622 goto done;
623
624 mutex_init(&rdev->r600_blit.mutex);
625 rdev->r600_blit.state_offset = 0;
626
627 if (rdev->family < CHIP_CAYMAN)
628 rdev->r600_blit.state_len = evergreen_default_size;
629 else
630 rdev->r600_blit.state_len = cayman_default_size;
631
632 dwords = rdev->r600_blit.state_len;
633 while (dwords & 0xf) {
634 packet2s[num_packet2s++] = cpu_to_le32(PACKET2(0));
635 dwords++;
636 }
637
638 obj_size = dwords * 4;
639 obj_size = ALIGN(obj_size, 256);
640
641 rdev->r600_blit.vs_offset = obj_size;
642 if (rdev->family < CHIP_CAYMAN)
643 obj_size += evergreen_vs_size * 4;
644 else
645 obj_size += cayman_vs_size * 4;
646 obj_size = ALIGN(obj_size, 256);
647
648 rdev->r600_blit.ps_offset = obj_size;
649 if (rdev->family < CHIP_CAYMAN)
650 obj_size += evergreen_ps_size * 4;
651 else
652 obj_size += cayman_ps_size * 4;
653 obj_size = ALIGN(obj_size, 256);
654
655 r = radeon_bo_create(rdev, obj_size, PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM,
656 &rdev->r600_blit.shader_obj);
657 if (r) {
658 DRM_ERROR("evergreen failed to allocate shader\n");
659 return r;
660 }
661
662 DRM_DEBUG("evergreen blit allocated bo %08x vs %08x ps %08x\n",
663 obj_size,
664 rdev->r600_blit.vs_offset, rdev->r600_blit.ps_offset);
665
666 r = radeon_bo_reserve(rdev->r600_blit.shader_obj, false);
667 if (unlikely(r != 0))
668 return r;
669 r = radeon_bo_kmap(rdev->r600_blit.shader_obj, &ptr);
670 if (r) {
671 DRM_ERROR("failed to map blit object %d\n", r);
672 return r;
673 }
674
675 if (rdev->family < CHIP_CAYMAN) {
676 memcpy_toio(ptr + rdev->r600_blit.state_offset,
677 evergreen_default_state, rdev->r600_blit.state_len * 4);
678
679 if (num_packet2s)
680 memcpy_toio(ptr + rdev->r600_blit.state_offset + (rdev->r600_blit.state_len * 4),
681 packet2s, num_packet2s * 4);
682 for (i = 0; i < evergreen_vs_size; i++)
683 *(u32 *)((unsigned long)ptr + rdev->r600_blit.vs_offset + i * 4) = cpu_to_le32(evergreen_vs[i]);
684 for (i = 0; i < evergreen_ps_size; i++)
685 *(u32 *)((unsigned long)ptr + rdev->r600_blit.ps_offset + i * 4) = cpu_to_le32(evergreen_ps[i]);
686 } else {
687 memcpy_toio(ptr + rdev->r600_blit.state_offset,
688 cayman_default_state, rdev->r600_blit.state_len * 4);
689
690 if (num_packet2s)
691 memcpy_toio(ptr + rdev->r600_blit.state_offset + (rdev->r600_blit.state_len * 4),
692 packet2s, num_packet2s * 4);
693 for (i = 0; i < cayman_vs_size; i++)
694 *(u32 *)((unsigned long)ptr + rdev->r600_blit.vs_offset + i * 4) = cpu_to_le32(cayman_vs[i]);
695 for (i = 0; i < cayman_ps_size; i++)
696 *(u32 *)((unsigned long)ptr + rdev->r600_blit.ps_offset + i * 4) = cpu_to_le32(cayman_ps[i]);
697 }
698 radeon_bo_kunmap(rdev->r600_blit.shader_obj);
699 radeon_bo_unreserve(rdev->r600_blit.shader_obj);
700
701done:
702 r = radeon_bo_reserve(rdev->r600_blit.shader_obj, false);
703 if (unlikely(r != 0))
704 return r;
705 r = radeon_bo_pin(rdev->r600_blit.shader_obj, RADEON_GEM_DOMAIN_VRAM,
706 &rdev->r600_blit.shader_gpu_addr);
707 radeon_bo_unreserve(rdev->r600_blit.shader_obj);
708 if (r) {
709 dev_err(rdev->dev, "(%d) pin blit object failed\n", r);
710 return r;
711 }
712 radeon_ttm_set_active_vram_size(rdev, rdev->mc.real_vram_size);
713 return 0;
714}
715
716void evergreen_blit_fini(struct radeon_device *rdev)
717{
718 int r;
719
720 radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
721 if (rdev->r600_blit.shader_obj == NULL)
722 return;
723 /* If we can't reserve the bo, unref should be enough to destroy
724 * it when it becomes idle.
725 */
726 r = radeon_bo_reserve(rdev->r600_blit.shader_obj, false);
727 if (!r) {
728 radeon_bo_unpin(rdev->r600_blit.shader_obj);
729 radeon_bo_unreserve(rdev->r600_blit.shader_obj);
730 }
731 radeon_bo_unref(&rdev->r600_blit.shader_obj);
732}
733
734static int evergreen_vb_ib_get(struct radeon_device *rdev)
735{
736 int r;
737 r = radeon_ib_get(rdev, &rdev->r600_blit.vb_ib);
738 if (r) {
739 DRM_ERROR("failed to get IB for vertex buffer\n");
740 return r;
741 }
742
743 rdev->r600_blit.vb_total = 64*1024;
744 rdev->r600_blit.vb_used = 0;
745 return 0;
746}
747
748static void evergreen_vb_ib_put(struct radeon_device *rdev)
749{
750 radeon_fence_emit(rdev, rdev->r600_blit.vb_ib->fence);
751 radeon_ib_free(rdev, &rdev->r600_blit.vb_ib);
752}
753
754int evergreen_blit_prepare_copy(struct radeon_device *rdev, int size_bytes)
755{
756 int r;
757 int ring_size, line_size;
758 int max_size;
759 /* loops of emits + fence emit possible */
760 int dwords_per_loop = 74, num_loops;
761
762 r = evergreen_vb_ib_get(rdev);
763 if (r)
764 return r;
765
766 /* 8 bpp vs 32 bpp for xfer unit */
767 if (size_bytes & 3)
768 line_size = 8192;
769 else
770 line_size = 8192 * 4;
771
772 max_size = 8192 * line_size;
773
774 /* major loops cover the max size transfer */
775 num_loops = ((size_bytes + max_size) / max_size);
776 /* minor loops cover the extra non aligned bits */
777 num_loops += ((size_bytes % line_size) ? 1 : 0);
778 /* calculate number of loops correctly */
779 ring_size = num_loops * dwords_per_loop;
780 /* set default + shaders */
781 ring_size += 55; /* shaders + def state */
782 ring_size += 10; /* fence emit for VB IB */
783 ring_size += 5; /* done copy */
784 ring_size += 10; /* fence emit for done copy */
785 r = radeon_ring_lock(rdev, ring_size);
786 if (r)
787 return r;
788
789 set_default_state(rdev); /* 36 */
790 set_shaders(rdev); /* 16 */
791 return 0;
792}
793
794void evergreen_blit_done_copy(struct radeon_device *rdev, struct radeon_fence *fence)
795{
796 int r;
797
798 if (rdev->r600_blit.vb_ib)
799 evergreen_vb_ib_put(rdev);
800
801 if (fence)
802 r = radeon_fence_emit(rdev, fence);
803
804 radeon_ring_unlock_commit(rdev);
805}
806
807void evergreen_kms_blit_copy(struct radeon_device *rdev,
808 u64 src_gpu_addr, u64 dst_gpu_addr,
809 int size_bytes)
810{
811 int max_bytes;
812 u64 vb_gpu_addr;
813 u32 *vb;
814
815 DRM_DEBUG("emitting copy %16llx %16llx %d %d\n", src_gpu_addr, dst_gpu_addr,
816 size_bytes, rdev->r600_blit.vb_used);
817 vb = (u32 *)(rdev->r600_blit.vb_ib->ptr + rdev->r600_blit.vb_used);
818 if ((size_bytes & 3) || (src_gpu_addr & 3) || (dst_gpu_addr & 3)) {
819 max_bytes = 8192;
820
821 while (size_bytes) {
822 int cur_size = size_bytes;
823 int src_x = src_gpu_addr & 255;
824 int dst_x = dst_gpu_addr & 255;
825 int h = 1;
826 src_gpu_addr = src_gpu_addr & ~255ULL;
827 dst_gpu_addr = dst_gpu_addr & ~255ULL;
828
829 if (!src_x && !dst_x) {
830 h = (cur_size / max_bytes);
831 if (h > 8192)
832 h = 8192;
833 if (h == 0)
834 h = 1;
835 else
836 cur_size = max_bytes;
837 } else {
838 if (cur_size > max_bytes)
839 cur_size = max_bytes;
840 if (cur_size > (max_bytes - dst_x))
841 cur_size = (max_bytes - dst_x);
842 if (cur_size > (max_bytes - src_x))
843 cur_size = (max_bytes - src_x);
844 }
845
846 if ((rdev->r600_blit.vb_used + 48) > rdev->r600_blit.vb_total) {
847 WARN_ON(1);
848 }
849
850 vb[0] = i2f(dst_x);
851 vb[1] = 0;
852 vb[2] = i2f(src_x);
853 vb[3] = 0;
854
855 vb[4] = i2f(dst_x);
856 vb[5] = i2f(h);
857 vb[6] = i2f(src_x);
858 vb[7] = i2f(h);
859
860 vb[8] = i2f(dst_x + cur_size);
861 vb[9] = i2f(h);
862 vb[10] = i2f(src_x + cur_size);
863 vb[11] = i2f(h);
864
865 /* src 10 */
866 set_tex_resource(rdev, FMT_8,
867 src_x + cur_size, h, src_x + cur_size,
868 src_gpu_addr);
869
870 /* 5 */
871 cp_set_surface_sync(rdev,
872 PACKET3_TC_ACTION_ENA, (src_x + cur_size * h), src_gpu_addr);
873
874
875 /* dst 17 */
876 set_render_target(rdev, COLOR_8,
877 dst_x + cur_size, h,
878 dst_gpu_addr);
879
880 /* scissors 12 */
881 set_scissors(rdev, dst_x, 0, dst_x + cur_size, h);
882
883 /* 15 */
884 vb_gpu_addr = rdev->r600_blit.vb_ib->gpu_addr + rdev->r600_blit.vb_used;
885 set_vtx_resource(rdev, vb_gpu_addr);
886
887 /* draw 10 */
888 draw_auto(rdev);
889
890 /* 5 */
891 cp_set_surface_sync(rdev,
892 PACKET3_CB_ACTION_ENA | PACKET3_CB0_DEST_BASE_ENA,
893 cur_size * h, dst_gpu_addr);
894
895 vb += 12;
896 rdev->r600_blit.vb_used += 12 * 4;
897
898 src_gpu_addr += cur_size * h;
899 dst_gpu_addr += cur_size * h;
900 size_bytes -= cur_size * h;
901 }
902 } else {
903 max_bytes = 8192 * 4;
904
905 while (size_bytes) {
906 int cur_size = size_bytes;
907 int src_x = (src_gpu_addr & 255);
908 int dst_x = (dst_gpu_addr & 255);
909 int h = 1;
910 src_gpu_addr = src_gpu_addr & ~255ULL;
911 dst_gpu_addr = dst_gpu_addr & ~255ULL;
912
913 if (!src_x && !dst_x) {
914 h = (cur_size / max_bytes);
915 if (h > 8192)
916 h = 8192;
917 if (h == 0)
918 h = 1;
919 else
920 cur_size = max_bytes;
921 } else {
922 if (cur_size > max_bytes)
923 cur_size = max_bytes;
924 if (cur_size > (max_bytes - dst_x))
925 cur_size = (max_bytes - dst_x);
926 if (cur_size > (max_bytes - src_x))
927 cur_size = (max_bytes - src_x);
928 }
929
930 if ((rdev->r600_blit.vb_used + 48) > rdev->r600_blit.vb_total) {
931 WARN_ON(1);
932 }
933
934 vb[0] = i2f(dst_x / 4);
935 vb[1] = 0;
936 vb[2] = i2f(src_x / 4);
937 vb[3] = 0;
938
939 vb[4] = i2f(dst_x / 4);
940 vb[5] = i2f(h);
941 vb[6] = i2f(src_x / 4);
942 vb[7] = i2f(h);
943
944 vb[8] = i2f((dst_x + cur_size) / 4);
945 vb[9] = i2f(h);
946 vb[10] = i2f((src_x + cur_size) / 4);
947 vb[11] = i2f(h);
948
949 /* src 10 */
950 set_tex_resource(rdev, FMT_8_8_8_8,
951 (src_x + cur_size) / 4,
952 h, (src_x + cur_size) / 4,
953 src_gpu_addr);
954 /* 5 */
955 cp_set_surface_sync(rdev,
956 PACKET3_TC_ACTION_ENA, (src_x + cur_size * h), src_gpu_addr);
957
958 /* dst 17 */
959 set_render_target(rdev, COLOR_8_8_8_8,
960 (dst_x + cur_size) / 4, h,
961 dst_gpu_addr);
962
963 /* scissors 12 */
964 set_scissors(rdev, (dst_x / 4), 0, (dst_x + cur_size / 4), h);
965
966 /* Vertex buffer setup 15 */
967 vb_gpu_addr = rdev->r600_blit.vb_ib->gpu_addr + rdev->r600_blit.vb_used;
968 set_vtx_resource(rdev, vb_gpu_addr);
969
970 /* draw 10 */
971 draw_auto(rdev);
972
973 /* 5 */
974 cp_set_surface_sync(rdev,
975 PACKET3_CB_ACTION_ENA | PACKET3_CB0_DEST_BASE_ENA,
976 cur_size * h, dst_gpu_addr);
977
978 /* 74 ring dwords per loop */
979 vb += 12;
980 rdev->r600_blit.vb_used += 12 * 4;
981
982 src_gpu_addr += cur_size * h;
983 dst_gpu_addr += cur_size * h;
984 size_bytes -= cur_size * h;
985 }
986 }
987}
988
diff --git a/drivers/gpu/drm/radeon/evergreen_blit_shaders.c b/drivers/gpu/drm/radeon/evergreen_blit_shaders.c
new file mode 100644
index 000000000000..3a10399e0066
--- /dev/null
+++ b/drivers/gpu/drm/radeon/evergreen_blit_shaders.c
@@ -0,0 +1,356 @@
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 <linux/types.h>
28#include <linux/kernel.h>
29
30/*
31 * evergreen cards need to use the 3D engine to blit data which requires
32 * quite a bit of hw state setup. Rather than pull the whole 3D driver
33 * (which normally generates the 3D state) into the DRM, we opt to use
34 * statically generated state tables. The regsiter state and shaders
35 * were hand generated to support blitting functionality. See the 3D
36 * driver or documentation for descriptions of the registers and
37 * shader instructions.
38 */
39
40const u32 evergreen_default_state[] =
41{
42 0xc0016900,
43 0x0000023b,
44 0x00000000, /* SQ_LDS_ALLOC_PS */
45
46 0xc0066900,
47 0x00000240,
48 0x00000000, /* SQ_ESGS_RING_ITEMSIZE */
49 0x00000000,
50 0x00000000,
51 0x00000000,
52 0x00000000,
53 0x00000000,
54
55 0xc0046900,
56 0x00000247,
57 0x00000000, /* SQ_GS_VERT_ITEMSIZE */
58 0x00000000,
59 0x00000000,
60 0x00000000,
61
62 0xc0026900,
63 0x00000010,
64 0x00000000, /* DB_Z_INFO */
65 0x00000000, /* DB_STENCIL_INFO */
66
67 0xc0016900,
68 0x00000200,
69 0x00000000, /* DB_DEPTH_CONTROL */
70
71 0xc0066900,
72 0x00000000,
73 0x00000060, /* DB_RENDER_CONTROL */
74 0x00000000, /* DB_COUNT_CONTROL */
75 0x00000000, /* DB_DEPTH_VIEW */
76 0x0000002a, /* DB_RENDER_OVERRIDE */
77 0x00000000, /* DB_RENDER_OVERRIDE2 */
78 0x00000000, /* DB_HTILE_DATA_BASE */
79
80 0xc0026900,
81 0x0000000a,
82 0x00000000, /* DB_STENCIL_CLEAR */
83 0x00000000, /* DB_DEPTH_CLEAR */
84
85 0xc0016900,
86 0x000002dc,
87 0x0000aa00, /* DB_ALPHA_TO_MASK */
88
89 0xc0016900,
90 0x00000080,
91 0x00000000, /* PA_SC_WINDOW_OFFSET */
92
93 0xc00d6900,
94 0x00000083,
95 0x0000ffff, /* PA_SC_CLIPRECT_RULE */
96 0x00000000, /* PA_SC_CLIPRECT_0_TL */
97 0x20002000, /* PA_SC_CLIPRECT_0_BR */
98 0x00000000,
99 0x20002000,
100 0x00000000,
101 0x20002000,
102 0x00000000,
103 0x20002000,
104 0xaaaaaaaa, /* PA_SC_EDGERULE */
105 0x00000000, /* PA_SU_HARDWARE_SCREEN_OFFSET */
106 0x0000000f, /* CB_TARGET_MASK */
107 0x0000000f, /* CB_SHADER_MASK */
108
109 0xc0226900,
110 0x00000094,
111 0x80000000, /* PA_SC_VPORT_SCISSOR_0_TL */
112 0x20002000, /* PA_SC_VPORT_SCISSOR_0_BR */
113 0x80000000,
114 0x20002000,
115 0x80000000,
116 0x20002000,
117 0x80000000,
118 0x20002000,
119 0x80000000,
120 0x20002000,
121 0x80000000,
122 0x20002000,
123 0x80000000,
124 0x20002000,
125 0x80000000,
126 0x20002000,
127 0x80000000,
128 0x20002000,
129 0x80000000,
130 0x20002000,
131 0x80000000,
132 0x20002000,
133 0x80000000,
134 0x20002000,
135 0x80000000,
136 0x20002000,
137 0x80000000,
138 0x20002000,
139 0x80000000,
140 0x20002000,
141 0x80000000,
142 0x20002000,
143 0x00000000, /* PA_SC_VPORT_ZMIN_0 */
144 0x3f800000, /* PA_SC_VPORT_ZMAX_0 */
145
146 0xc0016900,
147 0x000000d4,
148 0x00000000, /* SX_MISC */
149
150 0xc0026900,
151 0x00000292,
152 0x00000000, /* PA_SC_MODE_CNTL_0 */
153 0x00000000, /* PA_SC_MODE_CNTL_1 */
154
155 0xc0106900,
156 0x00000300,
157 0x00000000, /* PA_SC_LINE_CNTL */
158 0x00000000, /* PA_SC_AA_CONFIG */
159 0x00000005, /* PA_SU_VTX_CNTL */
160 0x3f800000, /* PA_CL_GB_VERT_CLIP_ADJ */
161 0x3f800000, /* PA_CL_GB_VERT_DISC_ADJ */
162 0x3f800000, /* PA_CL_GB_HORZ_CLIP_ADJ */
163 0x3f800000, /* PA_CL_GB_HORZ_DISC_ADJ */
164 0x00000000, /* PA_SC_AA_SAMPLE_LOCS_0 */
165 0x00000000, /* */
166 0x00000000, /* */
167 0x00000000, /* */
168 0x00000000, /* */
169 0x00000000, /* */
170 0x00000000, /* */
171 0x00000000, /* PA_SC_AA_SAMPLE_LOCS_7 */
172 0xffffffff, /* PA_SC_AA_MASK */
173
174 0xc00d6900,
175 0x00000202,
176 0x00cc0010, /* CB_COLOR_CONTROL */
177 0x00000210, /* DB_SHADER_CONTROL */
178 0x00010000, /* PA_CL_CLIP_CNTL */
179 0x00000004, /* PA_SU_SC_MODE_CNTL */
180 0x00000100, /* PA_CL_VTE_CNTL */
181 0x00000000, /* PA_CL_VS_OUT_CNTL */
182 0x00000000, /* PA_CL_NANINF_CNTL */
183 0x00000000, /* PA_SU_LINE_STIPPLE_CNTL */
184 0x00000000, /* PA_SU_LINE_STIPPLE_SCALE */
185 0x00000000, /* PA_SU_PRIM_FILTER_CNTL */
186 0x00000000, /* */
187 0x00000000, /* */
188 0x00000000, /* SQ_DYN_GPR_RESOURCE_LIMIT_1 */
189
190 0xc0066900,
191 0x000002de,
192 0x00000000, /* PA_SU_POLY_OFFSET_DB_FMT_CNTL */
193 0x00000000, /* */
194 0x00000000, /* */
195 0x00000000, /* */
196 0x00000000, /* */
197 0x00000000, /* */
198
199 0xc0016900,
200 0x00000229,
201 0x00000000, /* SQ_PGM_START_FS */
202
203 0xc0016900,
204 0x0000022a,
205 0x00000000, /* SQ_PGM_RESOURCES_FS */
206
207 0xc0096900,
208 0x00000100,
209 0x00ffffff, /* VGT_MAX_VTX_INDX */
210 0x00000000, /* */
211 0x00000000, /* */
212 0x00000000, /* */
213 0x00000000, /* SX_ALPHA_TEST_CONTROL */
214 0x00000000, /* CB_BLEND_RED */
215 0x00000000, /* CB_BLEND_GREEN */
216 0x00000000, /* CB_BLEND_BLUE */
217 0x00000000, /* CB_BLEND_ALPHA */
218
219 0xc0026900,
220 0x000002a8,
221 0x00000000, /* VGT_INSTANCE_STEP_RATE_0 */
222 0x00000000, /* */
223
224 0xc0026900,
225 0x000002ad,
226 0x00000000, /* VGT_REUSE_OFF */
227 0x00000000, /* */
228
229 0xc0116900,
230 0x00000280,
231 0x00000000, /* PA_SU_POINT_SIZE */
232 0x00000000, /* PA_SU_POINT_MINMAX */
233 0x00000008, /* PA_SU_LINE_CNTL */
234 0x00000000, /* PA_SC_LINE_STIPPLE */
235 0x00000000, /* VGT_OUTPUT_PATH_CNTL */
236 0x00000000, /* VGT_HOS_CNTL */
237 0x00000000, /* */
238 0x00000000, /* */
239 0x00000000, /* */
240 0x00000000, /* */
241 0x00000000, /* */
242 0x00000000, /* */
243 0x00000000, /* */
244 0x00000000, /* */
245 0x00000000, /* */
246 0x00000000, /* */
247 0x00000000, /* VGT_GS_MODE */
248
249 0xc0016900,
250 0x000002a1,
251 0x00000000, /* VGT_PRIMITIVEID_EN */
252
253 0xc0016900,
254 0x000002a5,
255 0x00000000, /* VGT_MULTI_PRIM_IB_RESET_EN */
256
257 0xc0016900,
258 0x000002d5,
259 0x00000000, /* VGT_SHADER_STAGES_EN */
260
261 0xc0026900,
262 0x000002e5,
263 0x00000000, /* VGT_STRMOUT_CONFIG */
264 0x00000000, /* */
265
266 0xc0016900,
267 0x000001e0,
268 0x00000000, /* CB_BLEND0_CONTROL */
269
270 0xc0016900,
271 0x000001b1,
272 0x00000000, /* SPI_VS_OUT_CONFIG */
273
274 0xc0016900,
275 0x00000187,
276 0x00000000, /* SPI_VS_OUT_ID_0 */
277
278 0xc0016900,
279 0x00000191,
280 0x00000100, /* SPI_PS_INPUT_CNTL_0 */
281
282 0xc00b6900,
283 0x000001b3,
284 0x20000001, /* SPI_PS_IN_CONTROL_0 */
285 0x00000000, /* SPI_PS_IN_CONTROL_1 */
286 0x00000000, /* SPI_INTERP_CONTROL_0 */
287 0x00000000, /* SPI_INPUT_Z */
288 0x00000000, /* SPI_FOG_CNTL */
289 0x00100000, /* SPI_BARYC_CNTL */
290 0x00000000, /* SPI_PS_IN_CONTROL_2 */
291 0x00000000, /* */
292 0x00000000, /* */
293 0x00000000, /* */
294 0x00000000, /* */
295
296 0xc0026900,
297 0x00000316,
298 0x0000000e, /* VGT_VERTEX_REUSE_BLOCK_CNTL */
299 0x00000010, /* */
300};
301
302const u32 evergreen_vs[] =
303{
304 0x00000004,
305 0x80800400,
306 0x0000a03c,
307 0x95000688,
308 0x00004000,
309 0x15200688,
310 0x00000000,
311 0x00000000,
312 0x3c000000,
313 0x67961001,
314#ifdef __BIG_ENDIAN
315 0x000a0000,
316#else
317 0x00080000,
318#endif
319 0x00000000,
320 0x1c000000,
321 0x67961000,
322#ifdef __BIG_ENDIAN
323 0x00020008,
324#else
325 0x00000008,
326#endif
327 0x00000000,
328};
329
330const u32 evergreen_ps[] =
331{
332 0x00000003,
333 0xa00c0000,
334 0x00000008,
335 0x80400000,
336 0x00000000,
337 0x95200688,
338 0x00380400,
339 0x00146b10,
340 0x00380000,
341 0x20146b10,
342 0x00380400,
343 0x40146b00,
344 0x80380000,
345 0x60146b00,
346 0x00000000,
347 0x00000000,
348 0x00000010,
349 0x000d1000,
350 0xb0800000,
351 0x00000000,
352};
353
354const u32 evergreen_ps_size = ARRAY_SIZE(evergreen_ps);
355const u32 evergreen_vs_size = ARRAY_SIZE(evergreen_vs);
356const u32 evergreen_default_size = ARRAY_SIZE(evergreen_default_state);
diff --git a/drivers/gpu/drm/radeon/evergreen_blit_shaders.h b/drivers/gpu/drm/radeon/evergreen_blit_shaders.h
new file mode 100644
index 000000000000..bb8d6c751595
--- /dev/null
+++ b/drivers/gpu/drm/radeon/evergreen_blit_shaders.h
@@ -0,0 +1,35 @@
1/*
2 * Copyright 2009 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 */
24
25#ifndef EVERGREEN_BLIT_SHADERS_H
26#define EVERGREEN_BLIT_SHADERS_H
27
28extern const u32 evergreen_ps[];
29extern const u32 evergreen_vs[];
30extern const u32 evergreen_default_state[];
31
32extern const u32 evergreen_ps_size, evergreen_vs_size;
33extern const u32 evergreen_default_size;
34
35#endif
diff --git a/drivers/gpu/drm/radeon/evergreen_cs.c b/drivers/gpu/drm/radeon/evergreen_cs.c
index 345a75a03c96..23d36417158d 100644
--- a/drivers/gpu/drm/radeon/evergreen_cs.c
+++ b/drivers/gpu/drm/radeon/evergreen_cs.c
@@ -29,6 +29,7 @@
29#include "radeon.h" 29#include "radeon.h"
30#include "evergreend.h" 30#include "evergreend.h"
31#include "evergreen_reg_safe.h" 31#include "evergreen_reg_safe.h"
32#include "cayman_reg_safe.h"
32 33
33static int evergreen_cs_packet_next_reloc(struct radeon_cs_parser *p, 34static int evergreen_cs_packet_next_reloc(struct radeon_cs_parser *p,
34 struct radeon_cs_reloc **cs_reloc); 35 struct radeon_cs_reloc **cs_reloc);
@@ -292,33 +293,28 @@ static int evergreen_cs_packet_parse_vline(struct radeon_cs_parser *p)
292 if (wait_reg_mem.type != PACKET_TYPE3 || 293 if (wait_reg_mem.type != PACKET_TYPE3 ||
293 wait_reg_mem.opcode != PACKET3_WAIT_REG_MEM) { 294 wait_reg_mem.opcode != PACKET3_WAIT_REG_MEM) {
294 DRM_ERROR("vline wait missing WAIT_REG_MEM segment\n"); 295 DRM_ERROR("vline wait missing WAIT_REG_MEM segment\n");
295 r = -EINVAL; 296 return -EINVAL;
296 return r;
297 } 297 }
298 298
299 wait_reg_mem_info = radeon_get_ib_value(p, wait_reg_mem.idx + 1); 299 wait_reg_mem_info = radeon_get_ib_value(p, wait_reg_mem.idx + 1);
300 /* bit 4 is reg (0) or mem (1) */ 300 /* bit 4 is reg (0) or mem (1) */
301 if (wait_reg_mem_info & 0x10) { 301 if (wait_reg_mem_info & 0x10) {
302 DRM_ERROR("vline WAIT_REG_MEM waiting on MEM rather than REG\n"); 302 DRM_ERROR("vline WAIT_REG_MEM waiting on MEM rather than REG\n");
303 r = -EINVAL; 303 return -EINVAL;
304 return r;
305 } 304 }
306 /* waiting for value to be equal */ 305 /* waiting for value to be equal */
307 if ((wait_reg_mem_info & 0x7) != 0x3) { 306 if ((wait_reg_mem_info & 0x7) != 0x3) {
308 DRM_ERROR("vline WAIT_REG_MEM function not equal\n"); 307 DRM_ERROR("vline WAIT_REG_MEM function not equal\n");
309 r = -EINVAL; 308 return -EINVAL;
310 return r;
311 } 309 }
312 if ((radeon_get_ib_value(p, wait_reg_mem.idx + 2) << 2) != EVERGREEN_VLINE_STATUS) { 310 if ((radeon_get_ib_value(p, wait_reg_mem.idx + 2) << 2) != EVERGREEN_VLINE_STATUS) {
313 DRM_ERROR("vline WAIT_REG_MEM bad reg\n"); 311 DRM_ERROR("vline WAIT_REG_MEM bad reg\n");
314 r = -EINVAL; 312 return -EINVAL;
315 return r;
316 } 313 }
317 314
318 if (radeon_get_ib_value(p, wait_reg_mem.idx + 5) != EVERGREEN_VLINE_STAT) { 315 if (radeon_get_ib_value(p, wait_reg_mem.idx + 5) != EVERGREEN_VLINE_STAT) {
319 DRM_ERROR("vline WAIT_REG_MEM bad bit mask\n"); 316 DRM_ERROR("vline WAIT_REG_MEM bad bit mask\n");
320 r = -EINVAL; 317 return -EINVAL;
321 return r;
322 } 318 }
323 319
324 /* jump over the NOP */ 320 /* jump over the NOP */
@@ -336,8 +332,7 @@ static int evergreen_cs_packet_parse_vline(struct radeon_cs_parser *p)
336 obj = drm_mode_object_find(p->rdev->ddev, crtc_id, DRM_MODE_OBJECT_CRTC); 332 obj = drm_mode_object_find(p->rdev->ddev, crtc_id, DRM_MODE_OBJECT_CRTC);
337 if (!obj) { 333 if (!obj) {
338 DRM_ERROR("cannot find crtc %d\n", crtc_id); 334 DRM_ERROR("cannot find crtc %d\n", crtc_id);
339 r = -EINVAL; 335 return -EINVAL;
340 goto out;
341 } 336 }
342 crtc = obj_to_crtc(obj); 337 crtc = obj_to_crtc(obj);
343 radeon_crtc = to_radeon_crtc(crtc); 338 radeon_crtc = to_radeon_crtc(crtc);
@@ -362,12 +357,10 @@ static int evergreen_cs_packet_parse_vline(struct radeon_cs_parser *p)
362 break; 357 break;
363 default: 358 default:
364 DRM_ERROR("unknown crtc reloc\n"); 359 DRM_ERROR("unknown crtc reloc\n");
365 r = -EINVAL; 360 return -EINVAL;
366 goto out;
367 } 361 }
368 } 362 }
369out: 363 return 0;
370 return r;
371} 364}
372 365
373static int evergreen_packet0_check(struct radeon_cs_parser *p, 366static int evergreen_packet0_check(struct radeon_cs_parser *p,
@@ -425,21 +418,31 @@ static inline int evergreen_cs_check_reg(struct radeon_cs_parser *p, u32 reg, u3
425{ 418{
426 struct evergreen_cs_track *track = (struct evergreen_cs_track *)p->track; 419 struct evergreen_cs_track *track = (struct evergreen_cs_track *)p->track;
427 struct radeon_cs_reloc *reloc; 420 struct radeon_cs_reloc *reloc;
428 u32 last_reg = ARRAY_SIZE(evergreen_reg_safe_bm); 421 u32 last_reg;
429 u32 m, i, tmp, *ib; 422 u32 m, i, tmp, *ib;
430 int r; 423 int r;
431 424
425 if (p->rdev->family >= CHIP_CAYMAN)
426 last_reg = ARRAY_SIZE(cayman_reg_safe_bm);
427 else
428 last_reg = ARRAY_SIZE(evergreen_reg_safe_bm);
429
432 i = (reg >> 7); 430 i = (reg >> 7);
433 if (i > last_reg) { 431 if (i > last_reg) {
434 dev_warn(p->dev, "forbidden register 0x%08x at %d\n", reg, idx); 432 dev_warn(p->dev, "forbidden register 0x%08x at %d\n", reg, idx);
435 return -EINVAL; 433 return -EINVAL;
436 } 434 }
437 m = 1 << ((reg >> 2) & 31); 435 m = 1 << ((reg >> 2) & 31);
438 if (!(evergreen_reg_safe_bm[i] & m)) 436 if (p->rdev->family >= CHIP_CAYMAN) {
439 return 0; 437 if (!(cayman_reg_safe_bm[i] & m))
438 return 0;
439 } else {
440 if (!(evergreen_reg_safe_bm[i] & m))
441 return 0;
442 }
440 ib = p->ib->ptr; 443 ib = p->ib->ptr;
441 switch (reg) { 444 switch (reg) {
442 /* force following reg to 0 in an attemp to disable out buffer 445 /* force following reg to 0 in an attempt to disable out buffer
443 * which will need us to better understand how it works to perform 446 * which will need us to better understand how it works to perform
444 * security check on it (Jerome) 447 * security check on it (Jerome)
445 */ 448 */
@@ -468,12 +471,42 @@ static inline int evergreen_cs_check_reg(struct radeon_cs_parser *p, u32 reg, u3
468 case SQ_VSTMP_RING_ITEMSIZE: 471 case SQ_VSTMP_RING_ITEMSIZE:
469 case VGT_TF_RING_SIZE: 472 case VGT_TF_RING_SIZE:
470 /* get value to populate the IB don't remove */ 473 /* get value to populate the IB don't remove */
471 tmp =radeon_get_ib_value(p, idx); 474 /*tmp =radeon_get_ib_value(p, idx);
472 ib[idx] = 0; 475 ib[idx] = 0;*/
476 break;
477 case SQ_ESGS_RING_BASE:
478 case SQ_GSVS_RING_BASE:
479 case SQ_ESTMP_RING_BASE:
480 case SQ_GSTMP_RING_BASE:
481 case SQ_HSTMP_RING_BASE:
482 case SQ_LSTMP_RING_BASE:
483 case SQ_PSTMP_RING_BASE:
484 case SQ_VSTMP_RING_BASE:
485 r = evergreen_cs_packet_next_reloc(p, &reloc);
486 if (r) {
487 dev_warn(p->dev, "bad SET_CONTEXT_REG "
488 "0x%04X\n", reg);
489 return -EINVAL;
490 }
491 ib[idx] += (u32)((reloc->lobj.gpu_offset >> 8) & 0xffffffff);
473 break; 492 break;
474 case DB_DEPTH_CONTROL: 493 case DB_DEPTH_CONTROL:
475 track->db_depth_control = radeon_get_ib_value(p, idx); 494 track->db_depth_control = radeon_get_ib_value(p, idx);
476 break; 495 break;
496 case CAYMAN_DB_EQAA:
497 if (p->rdev->family < CHIP_CAYMAN) {
498 dev_warn(p->dev, "bad SET_CONTEXT_REG "
499 "0x%04X\n", reg);
500 return -EINVAL;
501 }
502 break;
503 case CAYMAN_DB_DEPTH_INFO:
504 if (p->rdev->family < CHIP_CAYMAN) {
505 dev_warn(p->dev, "bad SET_CONTEXT_REG "
506 "0x%04X\n", reg);
507 return -EINVAL;
508 }
509 break;
477 case DB_Z_INFO: 510 case DB_Z_INFO:
478 r = evergreen_cs_packet_next_reloc(p, &reloc); 511 r = evergreen_cs_packet_next_reloc(p, &reloc);
479 if (r) { 512 if (r) {
@@ -559,9 +592,23 @@ static inline int evergreen_cs_check_reg(struct radeon_cs_parser *p, u32 reg, u3
559 track->cb_shader_mask = radeon_get_ib_value(p, idx); 592 track->cb_shader_mask = radeon_get_ib_value(p, idx);
560 break; 593 break;
561 case PA_SC_AA_CONFIG: 594 case PA_SC_AA_CONFIG:
595 if (p->rdev->family >= CHIP_CAYMAN) {
596 dev_warn(p->dev, "bad SET_CONTEXT_REG "
597 "0x%04X\n", reg);
598 return -EINVAL;
599 }
562 tmp = radeon_get_ib_value(p, idx) & MSAA_NUM_SAMPLES_MASK; 600 tmp = radeon_get_ib_value(p, idx) & MSAA_NUM_SAMPLES_MASK;
563 track->nsamples = 1 << tmp; 601 track->nsamples = 1 << tmp;
564 break; 602 break;
603 case CAYMAN_PA_SC_AA_CONFIG:
604 if (p->rdev->family < CHIP_CAYMAN) {
605 dev_warn(p->dev, "bad SET_CONTEXT_REG "
606 "0x%04X\n", reg);
607 return -EINVAL;
608 }
609 tmp = radeon_get_ib_value(p, idx) & CAYMAN_MSAA_NUM_SAMPLES_MASK;
610 track->nsamples = 1 << tmp;
611 break;
565 case CB_COLOR0_VIEW: 612 case CB_COLOR0_VIEW:
566 case CB_COLOR1_VIEW: 613 case CB_COLOR1_VIEW:
567 case CB_COLOR2_VIEW: 614 case CB_COLOR2_VIEW:
@@ -942,6 +989,37 @@ static int evergreen_packet3_check(struct radeon_cs_parser *p,
942 idx_value = radeon_get_ib_value(p, idx); 989 idx_value = radeon_get_ib_value(p, idx);
943 990
944 switch (pkt->opcode) { 991 switch (pkt->opcode) {
992 case PACKET3_SET_PREDICATION:
993 {
994 int pred_op;
995 int tmp;
996 if (pkt->count != 1) {
997 DRM_ERROR("bad SET PREDICATION\n");
998 return -EINVAL;
999 }
1000
1001 tmp = radeon_get_ib_value(p, idx + 1);
1002 pred_op = (tmp >> 16) & 0x7;
1003
1004 /* for the clear predicate operation */
1005 if (pred_op == 0)
1006 return 0;
1007
1008 if (pred_op > 2) {
1009 DRM_ERROR("bad SET PREDICATION operation %d\n", pred_op);
1010 return -EINVAL;
1011 }
1012
1013 r = evergreen_cs_packet_next_reloc(p, &reloc);
1014 if (r) {
1015 DRM_ERROR("bad SET PREDICATION\n");
1016 return -EINVAL;
1017 }
1018
1019 ib[idx + 0] = idx_value + (u32)(reloc->lobj.gpu_offset & 0xffffffff);
1020 ib[idx + 1] = tmp + (upper_32_bits(reloc->lobj.gpu_offset) & 0xff);
1021 }
1022 break;
945 case PACKET3_CONTEXT_CONTROL: 1023 case PACKET3_CONTEXT_CONTROL:
946 if (pkt->count != 1) { 1024 if (pkt->count != 1) {
947 DRM_ERROR("bad CONTEXT_CONTROL\n"); 1025 DRM_ERROR("bad CONTEXT_CONTROL\n");
@@ -956,6 +1034,16 @@ static int evergreen_packet3_check(struct radeon_cs_parser *p,
956 return -EINVAL; 1034 return -EINVAL;
957 } 1035 }
958 break; 1036 break;
1037 case CAYMAN_PACKET3_DEALLOC_STATE:
1038 if (p->rdev->family < CHIP_CAYMAN) {
1039 DRM_ERROR("bad PACKET3_DEALLOC_STATE\n");
1040 return -EINVAL;
1041 }
1042 if (pkt->count) {
1043 DRM_ERROR("bad INDEX_TYPE/NUM_INSTANCES/CLEAR_STATE\n");
1044 return -EINVAL;
1045 }
1046 break;
959 case PACKET3_INDEX_BASE: 1047 case PACKET3_INDEX_BASE:
960 if (pkt->count != 1) { 1048 if (pkt->count != 1) {
961 DRM_ERROR("bad INDEX_BASE\n"); 1049 DRM_ERROR("bad INDEX_BASE\n");
diff --git a/drivers/gpu/drm/radeon/evergreen_reg.h b/drivers/gpu/drm/radeon/evergreen_reg.h
index 2330f3a36fd5..c781c92c3451 100644
--- a/drivers/gpu/drm/radeon/evergreen_reg.h
+++ b/drivers/gpu/drm/radeon/evergreen_reg.h
@@ -105,6 +105,11 @@
105#define EVERGREEN_GRPH_Y_START 0x6830 105#define EVERGREEN_GRPH_Y_START 0x6830
106#define EVERGREEN_GRPH_X_END 0x6834 106#define EVERGREEN_GRPH_X_END 0x6834
107#define EVERGREEN_GRPH_Y_END 0x6838 107#define EVERGREEN_GRPH_Y_END 0x6838
108#define EVERGREEN_GRPH_UPDATE 0x6844
109# define EVERGREEN_GRPH_SURFACE_UPDATE_PENDING (1 << 2)
110# define EVERGREEN_GRPH_UPDATE_LOCK (1 << 16)
111#define EVERGREEN_GRPH_FLIP_CONTROL 0x6848
112# define EVERGREEN_GRPH_SURFACE_UPDATE_H_RETRACE_EN (1 << 0)
108 113
109/* CUR blocks at 0x6998, 0x7598, 0x10198, 0x10d98, 0x11998, 0x12598 */ 114/* CUR blocks at 0x6998, 0x7598, 0x10198, 0x10d98, 0x11998, 0x12598 */
110#define EVERGREEN_CUR_CONTROL 0x6998 115#define EVERGREEN_CUR_CONTROL 0x6998
@@ -178,6 +183,7 @@
178# define EVERGREEN_CRTC_DISP_READ_REQUEST_DISABLE (1 << 24) 183# define EVERGREEN_CRTC_DISP_READ_REQUEST_DISABLE (1 << 24)
179#define EVERGREEN_CRTC_STATUS 0x6e8c 184#define EVERGREEN_CRTC_STATUS 0x6e8c
180#define EVERGREEN_CRTC_STATUS_POSITION 0x6e90 185#define EVERGREEN_CRTC_STATUS_POSITION 0x6e90
186#define EVERGREEN_MASTER_UPDATE_MODE 0x6ef8
181#define EVERGREEN_CRTC_UPDATE_LOCK 0x6ed4 187#define EVERGREEN_CRTC_UPDATE_LOCK 0x6ed4
182 188
183#define EVERGREEN_DC_GPIO_HPD_MASK 0x64b0 189#define EVERGREEN_DC_GPIO_HPD_MASK 0x64b0
diff --git a/drivers/gpu/drm/radeon/evergreend.h b/drivers/gpu/drm/radeon/evergreend.h
index 9b7532dd30f7..b7b2714f0b32 100644
--- a/drivers/gpu/drm/radeon/evergreend.h
+++ b/drivers/gpu/drm/radeon/evergreend.h
@@ -64,6 +64,8 @@
64#define GB_BACKEND_MAP 0x98FC 64#define GB_BACKEND_MAP 0x98FC
65#define DMIF_ADDR_CONFIG 0xBD4 65#define DMIF_ADDR_CONFIG 0xBD4
66#define HDP_ADDR_CONFIG 0x2F48 66#define HDP_ADDR_CONFIG 0x2F48
67#define HDP_MISC_CNTL 0x2F4C
68#define HDP_FLUSH_INVALIDATE_CACHE (1 << 0)
67 69
68#define CC_SYS_RB_BACKEND_DISABLE 0x3F88 70#define CC_SYS_RB_BACKEND_DISABLE 0x3F88
69#define GC_USER_RB_BACKEND_DISABLE 0x9B7C 71#define GC_USER_RB_BACKEND_DISABLE 0x9B7C
@@ -98,6 +100,7 @@
98#define BUF_SWAP_32BIT (2 << 16) 100#define BUF_SWAP_32BIT (2 << 16)
99#define CP_RB_RPTR 0x8700 101#define CP_RB_RPTR 0x8700
100#define CP_RB_RPTR_ADDR 0xC10C 102#define CP_RB_RPTR_ADDR 0xC10C
103#define RB_RPTR_SWAP(x) ((x) << 0)
101#define CP_RB_RPTR_ADDR_HI 0xC110 104#define CP_RB_RPTR_ADDR_HI 0xC110
102#define CP_RB_RPTR_WR 0xC108 105#define CP_RB_RPTR_WR 0xC108
103#define CP_RB_WPTR 0xC114 106#define CP_RB_WPTR 0xC114
@@ -164,22 +167,32 @@
164#define SE_SC_BUSY (1 << 29) 167#define SE_SC_BUSY (1 << 29)
165#define SE_DB_BUSY (1 << 30) 168#define SE_DB_BUSY (1 << 30)
166#define SE_CB_BUSY (1 << 31) 169#define SE_CB_BUSY (1 << 31)
167 170/* evergreen */
171#define CG_THERMAL_CTRL 0x72c
172#define TOFFSET_MASK 0x00003FE0
173#define TOFFSET_SHIFT 5
168#define CG_MULT_THERMAL_STATUS 0x740 174#define CG_MULT_THERMAL_STATUS 0x740
169#define ASIC_T(x) ((x) << 16) 175#define ASIC_T(x) ((x) << 16)
170#define ASIC_T_MASK 0x7FF0000 176#define ASIC_T_MASK 0x07FF0000
171#define ASIC_T_SHIFT 16 177#define ASIC_T_SHIFT 16
178#define CG_TS0_STATUS 0x760
179#define TS0_ADC_DOUT_MASK 0x000003FF
180#define TS0_ADC_DOUT_SHIFT 0
181/* APU */
182#define CG_THERMAL_STATUS 0x678
172 183
173#define HDP_HOST_PATH_CNTL 0x2C00 184#define HDP_HOST_PATH_CNTL 0x2C00
174#define HDP_NONSURFACE_BASE 0x2C04 185#define HDP_NONSURFACE_BASE 0x2C04
175#define HDP_NONSURFACE_INFO 0x2C08 186#define HDP_NONSURFACE_INFO 0x2C08
176#define HDP_NONSURFACE_SIZE 0x2C0C 187#define HDP_NONSURFACE_SIZE 0x2C0C
188#define HDP_MEM_COHERENCY_FLUSH_CNTL 0x5480
177#define HDP_REG_COHERENCY_FLUSH_CNTL 0x54A0 189#define HDP_REG_COHERENCY_FLUSH_CNTL 0x54A0
178#define HDP_TILING_CONFIG 0x2F3C 190#define HDP_TILING_CONFIG 0x2F3C
179 191
180#define MC_SHARED_CHMAP 0x2004 192#define MC_SHARED_CHMAP 0x2004
181#define NOOFCHAN_SHIFT 12 193#define NOOFCHAN_SHIFT 12
182#define NOOFCHAN_MASK 0x00003000 194#define NOOFCHAN_MASK 0x00003000
195#define MC_SHARED_CHREMAP 0x2008
183 196
184#define MC_ARB_RAMCFG 0x2760 197#define MC_ARB_RAMCFG 0x2760
185#define NOOFBANK_SHIFT 0 198#define NOOFBANK_SHIFT 0
@@ -195,10 +208,12 @@
195#define BURSTLENGTH_SHIFT 9 208#define BURSTLENGTH_SHIFT 9
196#define BURSTLENGTH_MASK 0x00000200 209#define BURSTLENGTH_MASK 0x00000200
197#define CHANSIZE_OVERRIDE (1 << 11) 210#define CHANSIZE_OVERRIDE (1 << 11)
211#define FUS_MC_ARB_RAMCFG 0x2768
198#define MC_VM_AGP_TOP 0x2028 212#define MC_VM_AGP_TOP 0x2028
199#define MC_VM_AGP_BOT 0x202C 213#define MC_VM_AGP_BOT 0x202C
200#define MC_VM_AGP_BASE 0x2030 214#define MC_VM_AGP_BASE 0x2030
201#define MC_VM_FB_LOCATION 0x2024 215#define MC_VM_FB_LOCATION 0x2024
216#define MC_FUS_VM_FB_OFFSET 0x2898
202#define MC_VM_MB_L1_TLB0_CNTL 0x2234 217#define MC_VM_MB_L1_TLB0_CNTL 0x2234
203#define MC_VM_MB_L1_TLB1_CNTL 0x2238 218#define MC_VM_MB_L1_TLB1_CNTL 0x2238
204#define MC_VM_MB_L1_TLB2_CNTL 0x223C 219#define MC_VM_MB_L1_TLB2_CNTL 0x223C
@@ -215,6 +230,11 @@
215#define MC_VM_MD_L1_TLB0_CNTL 0x2654 230#define MC_VM_MD_L1_TLB0_CNTL 0x2654
216#define MC_VM_MD_L1_TLB1_CNTL 0x2658 231#define MC_VM_MD_L1_TLB1_CNTL 0x2658
217#define MC_VM_MD_L1_TLB2_CNTL 0x265C 232#define MC_VM_MD_L1_TLB2_CNTL 0x265C
233
234#define FUS_MC_VM_MD_L1_TLB0_CNTL 0x265C
235#define FUS_MC_VM_MD_L1_TLB1_CNTL 0x2660
236#define FUS_MC_VM_MD_L1_TLB2_CNTL 0x2664
237
218#define MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR 0x203C 238#define MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR 0x203C
219#define MC_VM_SYSTEM_APERTURE_HIGH_ADDR 0x2038 239#define MC_VM_SYSTEM_APERTURE_HIGH_ADDR 0x2038
220#define MC_VM_SYSTEM_APERTURE_LOW_ADDR 0x2034 240#define MC_VM_SYSTEM_APERTURE_LOW_ADDR 0x2034
@@ -235,6 +255,7 @@
235#define FORCE_EOV_MAX_CLK_CNT(x) ((x) << 0) 255#define FORCE_EOV_MAX_CLK_CNT(x) ((x) << 0)
236#define FORCE_EOV_MAX_REZ_CNT(x) ((x) << 16) 256#define FORCE_EOV_MAX_REZ_CNT(x) ((x) << 16)
237#define PA_SC_LINE_STIPPLE 0x28A0C 257#define PA_SC_LINE_STIPPLE 0x28A0C
258#define PA_SU_LINE_STIPPLE_VALUE 0x8A60
238#define PA_SC_LINE_STIPPLE_STATE 0x8B10 259#define PA_SC_LINE_STIPPLE_STATE 0x8B10
239 260
240#define SCRATCH_REG0 0x8500 261#define SCRATCH_REG0 0x8500
@@ -348,6 +369,9 @@
348#define SYNC_WALKER (1 << 25) 369#define SYNC_WALKER (1 << 25)
349#define SYNC_ALIGNER (1 << 26) 370#define SYNC_ALIGNER (1 << 26)
350 371
372#define TCP_CHAN_STEER_LO 0x960c
373#define TCP_CHAN_STEER_HI 0x9610
374
351#define VGT_CACHE_INVALIDATION 0x88C4 375#define VGT_CACHE_INVALIDATION 0x88C4
352#define CACHE_INVALIDATION(x) ((x) << 0) 376#define CACHE_INVALIDATION(x) ((x) << 0)
353#define VC_ONLY 0 377#define VC_ONLY 0
@@ -412,6 +436,19 @@
412#define SOFT_RESET_REGBB (1 << 22) 436#define SOFT_RESET_REGBB (1 << 22)
413#define SOFT_RESET_ORB (1 << 23) 437#define SOFT_RESET_ORB (1 << 23)
414 438
439/* display watermarks */
440#define DC_LB_MEMORY_SPLIT 0x6b0c
441#define PRIORITY_A_CNT 0x6b18
442#define PRIORITY_MARK_MASK 0x7fff
443#define PRIORITY_OFF (1 << 16)
444#define PRIORITY_ALWAYS_ON (1 << 20)
445#define PRIORITY_B_CNT 0x6b1c
446#define PIPE0_ARBITRATION_CONTROL3 0x0bf0
447# define LATENCY_WATERMARK_MASK(x) ((x) << 16)
448#define PIPE0_LATENCY_CONTROL 0x0bf4
449# define LATENCY_LOW_WATERMARK(x) ((x) << 0)
450# define LATENCY_HIGH_WATERMARK(x) ((x) << 16)
451
415#define IH_RB_CNTL 0x3e00 452#define IH_RB_CNTL 0x3e00
416# define IH_RB_ENABLE (1 << 0) 453# define IH_RB_ENABLE (1 << 0)
417# define IH_IB_SIZE(x) ((x) << 1) /* log2 */ 454# define IH_IB_SIZE(x) ((x) << 1) /* log2 */
@@ -429,7 +466,7 @@
429#define IH_RB_WPTR_ADDR_LO 0x3e14 466#define IH_RB_WPTR_ADDR_LO 0x3e14
430#define IH_CNTL 0x3e18 467#define IH_CNTL 0x3e18
431# define ENABLE_INTR (1 << 0) 468# define ENABLE_INTR (1 << 0)
432# define IH_MC_SWAP(x) ((x) << 2) 469# define IH_MC_SWAP(x) ((x) << 1)
433# define IH_MC_SWAP_NONE 0 470# define IH_MC_SWAP_NONE 0
434# define IH_MC_SWAP_16BIT 1 471# define IH_MC_SWAP_16BIT 1
435# define IH_MC_SWAP_32BIT 2 472# define IH_MC_SWAP_32BIT 2
@@ -510,7 +547,7 @@
510# define LB_D5_VBLANK_INTERRUPT (1 << 3) 547# define LB_D5_VBLANK_INTERRUPT (1 << 3)
511# define DC_HPD5_INTERRUPT (1 << 17) 548# define DC_HPD5_INTERRUPT (1 << 17)
512# define DC_HPD5_RX_INTERRUPT (1 << 18) 549# define DC_HPD5_RX_INTERRUPT (1 << 18)
513#define DISP_INTERRUPT_STATUS_CONTINUE5 0x6050 550#define DISP_INTERRUPT_STATUS_CONTINUE5 0x6150
514# define LB_D6_VLINE_INTERRUPT (1 << 2) 551# define LB_D6_VLINE_INTERRUPT (1 << 2)
515# define LB_D6_VBLANK_INTERRUPT (1 << 3) 552# define LB_D6_VBLANK_INTERRUPT (1 << 3)
516# define DC_HPD6_INTERRUPT (1 << 17) 553# define DC_HPD6_INTERRUPT (1 << 17)
@@ -560,6 +597,44 @@
560# define DC_HPDx_RX_INT_TIMER(x) ((x) << 16) 597# define DC_HPDx_RX_INT_TIMER(x) ((x) << 16)
561# define DC_HPDx_EN (1 << 28) 598# define DC_HPDx_EN (1 << 28)
562 599
600/* PCIE link stuff */
601#define PCIE_LC_TRAINING_CNTL 0xa1 /* PCIE_P */
602#define PCIE_LC_LINK_WIDTH_CNTL 0xa2 /* PCIE_P */
603# define LC_LINK_WIDTH_SHIFT 0
604# define LC_LINK_WIDTH_MASK 0x7
605# define LC_LINK_WIDTH_X0 0
606# define LC_LINK_WIDTH_X1 1
607# define LC_LINK_WIDTH_X2 2
608# define LC_LINK_WIDTH_X4 3
609# define LC_LINK_WIDTH_X8 4
610# define LC_LINK_WIDTH_X16 6
611# define LC_LINK_WIDTH_RD_SHIFT 4
612# define LC_LINK_WIDTH_RD_MASK 0x70
613# define LC_RECONFIG_ARC_MISSING_ESCAPE (1 << 7)
614# define LC_RECONFIG_NOW (1 << 8)
615# define LC_RENEGOTIATION_SUPPORT (1 << 9)
616# define LC_RENEGOTIATE_EN (1 << 10)
617# define LC_SHORT_RECONFIG_EN (1 << 11)
618# define LC_UPCONFIGURE_SUPPORT (1 << 12)
619# define LC_UPCONFIGURE_DIS (1 << 13)
620#define PCIE_LC_SPEED_CNTL 0xa4 /* PCIE_P */
621# define LC_GEN2_EN_STRAP (1 << 0)
622# define LC_TARGET_LINK_SPEED_OVERRIDE_EN (1 << 1)
623# define LC_FORCE_EN_HW_SPEED_CHANGE (1 << 5)
624# define LC_FORCE_DIS_HW_SPEED_CHANGE (1 << 6)
625# define LC_SPEED_CHANGE_ATTEMPTS_ALLOWED_MASK (0x3 << 8)
626# define LC_SPEED_CHANGE_ATTEMPTS_ALLOWED_SHIFT 3
627# define LC_CURRENT_DATA_RATE (1 << 11)
628# define LC_VOLTAGE_TIMER_SEL_MASK (0xf << 14)
629# define LC_CLR_FAILED_SPD_CHANGE_CNT (1 << 21)
630# define LC_OTHER_SIDE_EVER_SENT_GEN2 (1 << 23)
631# define LC_OTHER_SIDE_SUPPORTS_GEN2 (1 << 24)
632#define MM_CFGREGS_CNTL 0x544c
633# define MM_WR_TO_CFG_EN (1 << 3)
634#define LINK_CNTL2 0x88 /* F0 */
635# define TARGET_LINK_SPEED_MASK (0xf << 0)
636# define SELECTABLE_DEEMPHASIS (1 << 6)
637
563/* 638/*
564 * PM4 639 * PM4
565 */ 640 */
@@ -589,10 +664,11 @@
589#define PACKET3_NOP 0x10 664#define PACKET3_NOP 0x10
590#define PACKET3_SET_BASE 0x11 665#define PACKET3_SET_BASE 0x11
591#define PACKET3_CLEAR_STATE 0x12 666#define PACKET3_CLEAR_STATE 0x12
592#define PACKET3_INDIRECT_BUFFER_SIZE 0x13 667#define PACKET3_INDEX_BUFFER_SIZE 0x13
593#define PACKET3_DISPATCH_DIRECT 0x15 668#define PACKET3_DISPATCH_DIRECT 0x15
594#define PACKET3_DISPATCH_INDIRECT 0x16 669#define PACKET3_DISPATCH_INDIRECT 0x16
595#define PACKET3_INDIRECT_BUFFER_END 0x17 670#define PACKET3_INDIRECT_BUFFER_END 0x17
671#define PACKET3_MODE_CONTROL 0x18
596#define PACKET3_SET_PREDICATION 0x20 672#define PACKET3_SET_PREDICATION 0x20
597#define PACKET3_REG_RMW 0x21 673#define PACKET3_REG_RMW 0x21
598#define PACKET3_COND_EXEC 0x22 674#define PACKET3_COND_EXEC 0x22
@@ -630,14 +706,14 @@
630# define PACKET3_CB8_DEST_BASE_ENA (1 << 15) 706# define PACKET3_CB8_DEST_BASE_ENA (1 << 15)
631# define PACKET3_CB9_DEST_BASE_ENA (1 << 16) 707# define PACKET3_CB9_DEST_BASE_ENA (1 << 16)
632# define PACKET3_CB10_DEST_BASE_ENA (1 << 17) 708# define PACKET3_CB10_DEST_BASE_ENA (1 << 17)
633# define PACKET3_CB11_DEST_BASE_ENA (1 << 17) 709# define PACKET3_CB11_DEST_BASE_ENA (1 << 18)
634# define PACKET3_FULL_CACHE_ENA (1 << 20) 710# define PACKET3_FULL_CACHE_ENA (1 << 20)
635# define PACKET3_TC_ACTION_ENA (1 << 23) 711# define PACKET3_TC_ACTION_ENA (1 << 23)
636# define PACKET3_VC_ACTION_ENA (1 << 24) 712# define PACKET3_VC_ACTION_ENA (1 << 24)
637# define PACKET3_CB_ACTION_ENA (1 << 25) 713# define PACKET3_CB_ACTION_ENA (1 << 25)
638# define PACKET3_DB_ACTION_ENA (1 << 26) 714# define PACKET3_DB_ACTION_ENA (1 << 26)
639# define PACKET3_SH_ACTION_ENA (1 << 27) 715# define PACKET3_SH_ACTION_ENA (1 << 27)
640# define PACKET3_SMX_ACTION_ENA (1 << 28) 716# define PACKET3_SX_ACTION_ENA (1 << 28)
641#define PACKET3_ME_INITIALIZE 0x44 717#define PACKET3_ME_INITIALIZE 0x44
642#define PACKET3_ME_INITIALIZE_DEVICE_ID(x) ((x) << 16) 718#define PACKET3_ME_INITIALIZE_DEVICE_ID(x) ((x) << 16)
643#define PACKET3_COND_WRITE 0x45 719#define PACKET3_COND_WRITE 0x45
@@ -645,6 +721,8 @@
645#define PACKET3_EVENT_WRITE_EOP 0x47 721#define PACKET3_EVENT_WRITE_EOP 0x47
646#define PACKET3_EVENT_WRITE_EOS 0x48 722#define PACKET3_EVENT_WRITE_EOS 0x48
647#define PACKET3_PREAMBLE_CNTL 0x4A 723#define PACKET3_PREAMBLE_CNTL 0x4A
724# define PACKET3_PREAMBLE_BEGIN_CLEAR_STATE (2 << 28)
725# define PACKET3_PREAMBLE_END_CLEAR_STATE (3 << 28)
648#define PACKET3_RB_OFFSET 0x4B 726#define PACKET3_RB_OFFSET 0x4B
649#define PACKET3_ALU_PS_CONST_BUFFER_COPY 0x4C 727#define PACKET3_ALU_PS_CONST_BUFFER_COPY 0x4C
650#define PACKET3_ALU_VS_CONST_BUFFER_COPY 0x4D 728#define PACKET3_ALU_VS_CONST_BUFFER_COPY 0x4D
@@ -691,13 +769,21 @@
691 769
692#define SQ_CONST_MEM_BASE 0x8df8 770#define SQ_CONST_MEM_BASE 0x8df8
693 771
772#define SQ_ESGS_RING_BASE 0x8c40
694#define SQ_ESGS_RING_SIZE 0x8c44 773#define SQ_ESGS_RING_SIZE 0x8c44
774#define SQ_GSVS_RING_BASE 0x8c48
695#define SQ_GSVS_RING_SIZE 0x8c4c 775#define SQ_GSVS_RING_SIZE 0x8c4c
776#define SQ_ESTMP_RING_BASE 0x8c50
696#define SQ_ESTMP_RING_SIZE 0x8c54 777#define SQ_ESTMP_RING_SIZE 0x8c54
778#define SQ_GSTMP_RING_BASE 0x8c58
697#define SQ_GSTMP_RING_SIZE 0x8c5c 779#define SQ_GSTMP_RING_SIZE 0x8c5c
780#define SQ_VSTMP_RING_BASE 0x8c60
698#define SQ_VSTMP_RING_SIZE 0x8c64 781#define SQ_VSTMP_RING_SIZE 0x8c64
782#define SQ_PSTMP_RING_BASE 0x8c68
699#define SQ_PSTMP_RING_SIZE 0x8c6c 783#define SQ_PSTMP_RING_SIZE 0x8c6c
784#define SQ_LSTMP_RING_BASE 0x8e10
700#define SQ_LSTMP_RING_SIZE 0x8e14 785#define SQ_LSTMP_RING_SIZE 0x8e14
786#define SQ_HSTMP_RING_BASE 0x8e18
701#define SQ_HSTMP_RING_SIZE 0x8e1c 787#define SQ_HSTMP_RING_SIZE 0x8e1c
702#define VGT_TF_RING_SIZE 0x8988 788#define VGT_TF_RING_SIZE 0x8988
703 789
@@ -802,6 +888,11 @@
802#define SQ_ALU_CONST_CACHE_LS_14 0x28f78 888#define SQ_ALU_CONST_CACHE_LS_14 0x28f78
803#define SQ_ALU_CONST_CACHE_LS_15 0x28f7c 889#define SQ_ALU_CONST_CACHE_LS_15 0x28f7c
804 890
891#define PA_SC_SCREEN_SCISSOR_TL 0x28030
892#define PA_SC_GENERIC_SCISSOR_TL 0x28240
893#define PA_SC_WINDOW_SCISSOR_TL 0x28204
894#define VGT_PRIMITIVE_TYPE 0x8958
895
805#define DB_DEPTH_CONTROL 0x28800 896#define DB_DEPTH_CONTROL 0x28800
806#define DB_DEPTH_VIEW 0x28008 897#define DB_DEPTH_VIEW 0x28008
807#define DB_HTILE_DATA_BASE 0x28014 898#define DB_HTILE_DATA_BASE 0x28014
@@ -1024,5 +1115,14 @@
1024#define SQ_TEX_RESOURCE_WORD6_0 0x30018 1115#define SQ_TEX_RESOURCE_WORD6_0 0x30018
1025#define SQ_TEX_RESOURCE_WORD7_0 0x3001c 1116#define SQ_TEX_RESOURCE_WORD7_0 0x3001c
1026 1117
1118/* cayman 3D regs */
1119#define CAYMAN_VGT_OFFCHIP_LDS_BASE 0x89B0
1120#define CAYMAN_DB_EQAA 0x28804
1121#define CAYMAN_DB_DEPTH_INFO 0x2803C
1122#define CAYMAN_PA_SC_AA_CONFIG 0x28BE0
1123#define CAYMAN_MSAA_NUM_SAMPLES_SHIFT 0
1124#define CAYMAN_MSAA_NUM_SAMPLES_MASK 0x7
1125/* cayman packet3 addition */
1126#define CAYMAN_PACKET3_DEALLOC_STATE 0x14
1027 1127
1028#endif 1128#endif
diff --git a/drivers/gpu/drm/radeon/mkregtable.c b/drivers/gpu/drm/radeon/mkregtable.c
index 607241c6a8a9..5a82b6b75849 100644
--- a/drivers/gpu/drm/radeon/mkregtable.c
+++ b/drivers/gpu/drm/radeon/mkregtable.c
@@ -673,8 +673,10 @@ static int parser_auth(struct table *t, const char *filename)
673 last_reg = strtol(last_reg_s, NULL, 16); 673 last_reg = strtol(last_reg_s, NULL, 16);
674 674
675 do { 675 do {
676 if (fgets(buf, 1024, file) == NULL) 676 if (fgets(buf, 1024, file) == NULL) {
677 fclose(file);
677 return -1; 678 return -1;
679 }
678 len = strlen(buf); 680 len = strlen(buf);
679 if (ftell(file) == end) 681 if (ftell(file) == end)
680 done = 1; 682 done = 1;
@@ -685,6 +687,7 @@ static int parser_auth(struct table *t, const char *filename)
685 fprintf(stderr, 687 fprintf(stderr,
686 "Error matching regular expression %d in %s\n", 688 "Error matching regular expression %d in %s\n",
687 r, filename); 689 r, filename);
690 fclose(file);
688 return -1; 691 return -1;
689 } else { 692 } else {
690 buf[match[0].rm_eo] = 0; 693 buf[match[0].rm_eo] = 0;
diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c
new file mode 100644
index 000000000000..559dbd412906
--- /dev/null
+++ b/drivers/gpu/drm/radeon/ni.c
@@ -0,0 +1,1594 @@
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 <linux/firmware.h>
25#include <linux/platform_device.h>
26#include <linux/slab.h>
27#include "drmP.h"
28#include "radeon.h"
29#include "radeon_asic.h"
30#include "radeon_drm.h"
31#include "nid.h"
32#include "atom.h"
33#include "ni_reg.h"
34#include "cayman_blit_shaders.h"
35
36extern void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_save *save);
37extern void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *save);
38extern int evergreen_mc_wait_for_idle(struct radeon_device *rdev);
39extern void evergreen_mc_program(struct radeon_device *rdev);
40extern void evergreen_irq_suspend(struct radeon_device *rdev);
41extern int evergreen_mc_init(struct radeon_device *rdev);
42
43#define EVERGREEN_PFP_UCODE_SIZE 1120
44#define EVERGREEN_PM4_UCODE_SIZE 1376
45#define EVERGREEN_RLC_UCODE_SIZE 768
46#define BTC_MC_UCODE_SIZE 6024
47
48#define CAYMAN_PFP_UCODE_SIZE 2176
49#define CAYMAN_PM4_UCODE_SIZE 2176
50#define CAYMAN_RLC_UCODE_SIZE 1024
51#define CAYMAN_MC_UCODE_SIZE 6037
52
53/* Firmware Names */
54MODULE_FIRMWARE("radeon/BARTS_pfp.bin");
55MODULE_FIRMWARE("radeon/BARTS_me.bin");
56MODULE_FIRMWARE("radeon/BARTS_mc.bin");
57MODULE_FIRMWARE("radeon/BTC_rlc.bin");
58MODULE_FIRMWARE("radeon/TURKS_pfp.bin");
59MODULE_FIRMWARE("radeon/TURKS_me.bin");
60MODULE_FIRMWARE("radeon/TURKS_mc.bin");
61MODULE_FIRMWARE("radeon/CAICOS_pfp.bin");
62MODULE_FIRMWARE("radeon/CAICOS_me.bin");
63MODULE_FIRMWARE("radeon/CAICOS_mc.bin");
64MODULE_FIRMWARE("radeon/CAYMAN_pfp.bin");
65MODULE_FIRMWARE("radeon/CAYMAN_me.bin");
66MODULE_FIRMWARE("radeon/CAYMAN_mc.bin");
67MODULE_FIRMWARE("radeon/CAYMAN_rlc.bin");
68
69#define BTC_IO_MC_REGS_SIZE 29
70
71static const u32 barts_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = {
72 {0x00000077, 0xff010100},
73 {0x00000078, 0x00000000},
74 {0x00000079, 0x00001434},
75 {0x0000007a, 0xcc08ec08},
76 {0x0000007b, 0x00040000},
77 {0x0000007c, 0x000080c0},
78 {0x0000007d, 0x09000000},
79 {0x0000007e, 0x00210404},
80 {0x00000081, 0x08a8e800},
81 {0x00000082, 0x00030444},
82 {0x00000083, 0x00000000},
83 {0x00000085, 0x00000001},
84 {0x00000086, 0x00000002},
85 {0x00000087, 0x48490000},
86 {0x00000088, 0x20244647},
87 {0x00000089, 0x00000005},
88 {0x0000008b, 0x66030000},
89 {0x0000008c, 0x00006603},
90 {0x0000008d, 0x00000100},
91 {0x0000008f, 0x00001c0a},
92 {0x00000090, 0xff000001},
93 {0x00000094, 0x00101101},
94 {0x00000095, 0x00000fff},
95 {0x00000096, 0x00116fff},
96 {0x00000097, 0x60010000},
97 {0x00000098, 0x10010000},
98 {0x00000099, 0x00006000},
99 {0x0000009a, 0x00001000},
100 {0x0000009f, 0x00946a00}
101};
102
103static const u32 turks_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = {
104 {0x00000077, 0xff010100},
105 {0x00000078, 0x00000000},
106 {0x00000079, 0x00001434},
107 {0x0000007a, 0xcc08ec08},
108 {0x0000007b, 0x00040000},
109 {0x0000007c, 0x000080c0},
110 {0x0000007d, 0x09000000},
111 {0x0000007e, 0x00210404},
112 {0x00000081, 0x08a8e800},
113 {0x00000082, 0x00030444},
114 {0x00000083, 0x00000000},
115 {0x00000085, 0x00000001},
116 {0x00000086, 0x00000002},
117 {0x00000087, 0x48490000},
118 {0x00000088, 0x20244647},
119 {0x00000089, 0x00000005},
120 {0x0000008b, 0x66030000},
121 {0x0000008c, 0x00006603},
122 {0x0000008d, 0x00000100},
123 {0x0000008f, 0x00001c0a},
124 {0x00000090, 0xff000001},
125 {0x00000094, 0x00101101},
126 {0x00000095, 0x00000fff},
127 {0x00000096, 0x00116fff},
128 {0x00000097, 0x60010000},
129 {0x00000098, 0x10010000},
130 {0x00000099, 0x00006000},
131 {0x0000009a, 0x00001000},
132 {0x0000009f, 0x00936a00}
133};
134
135static const u32 caicos_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = {
136 {0x00000077, 0xff010100},
137 {0x00000078, 0x00000000},
138 {0x00000079, 0x00001434},
139 {0x0000007a, 0xcc08ec08},
140 {0x0000007b, 0x00040000},
141 {0x0000007c, 0x000080c0},
142 {0x0000007d, 0x09000000},
143 {0x0000007e, 0x00210404},
144 {0x00000081, 0x08a8e800},
145 {0x00000082, 0x00030444},
146 {0x00000083, 0x00000000},
147 {0x00000085, 0x00000001},
148 {0x00000086, 0x00000002},
149 {0x00000087, 0x48490000},
150 {0x00000088, 0x20244647},
151 {0x00000089, 0x00000005},
152 {0x0000008b, 0x66030000},
153 {0x0000008c, 0x00006603},
154 {0x0000008d, 0x00000100},
155 {0x0000008f, 0x00001c0a},
156 {0x00000090, 0xff000001},
157 {0x00000094, 0x00101101},
158 {0x00000095, 0x00000fff},
159 {0x00000096, 0x00116fff},
160 {0x00000097, 0x60010000},
161 {0x00000098, 0x10010000},
162 {0x00000099, 0x00006000},
163 {0x0000009a, 0x00001000},
164 {0x0000009f, 0x00916a00}
165};
166
167static const u32 cayman_io_mc_regs[BTC_IO_MC_REGS_SIZE][2] = {
168 {0x00000077, 0xff010100},
169 {0x00000078, 0x00000000},
170 {0x00000079, 0x00001434},
171 {0x0000007a, 0xcc08ec08},
172 {0x0000007b, 0x00040000},
173 {0x0000007c, 0x000080c0},
174 {0x0000007d, 0x09000000},
175 {0x0000007e, 0x00210404},
176 {0x00000081, 0x08a8e800},
177 {0x00000082, 0x00030444},
178 {0x00000083, 0x00000000},
179 {0x00000085, 0x00000001},
180 {0x00000086, 0x00000002},
181 {0x00000087, 0x48490000},
182 {0x00000088, 0x20244647},
183 {0x00000089, 0x00000005},
184 {0x0000008b, 0x66030000},
185 {0x0000008c, 0x00006603},
186 {0x0000008d, 0x00000100},
187 {0x0000008f, 0x00001c0a},
188 {0x00000090, 0xff000001},
189 {0x00000094, 0x00101101},
190 {0x00000095, 0x00000fff},
191 {0x00000096, 0x00116fff},
192 {0x00000097, 0x60010000},
193 {0x00000098, 0x10010000},
194 {0x00000099, 0x00006000},
195 {0x0000009a, 0x00001000},
196 {0x0000009f, 0x00976b00}
197};
198
199int ni_mc_load_microcode(struct radeon_device *rdev)
200{
201 const __be32 *fw_data;
202 u32 mem_type, running, blackout = 0;
203 u32 *io_mc_regs;
204 int i, ucode_size, regs_size;
205
206 if (!rdev->mc_fw)
207 return -EINVAL;
208
209 switch (rdev->family) {
210 case CHIP_BARTS:
211 io_mc_regs = (u32 *)&barts_io_mc_regs;
212 ucode_size = BTC_MC_UCODE_SIZE;
213 regs_size = BTC_IO_MC_REGS_SIZE;
214 break;
215 case CHIP_TURKS:
216 io_mc_regs = (u32 *)&turks_io_mc_regs;
217 ucode_size = BTC_MC_UCODE_SIZE;
218 regs_size = BTC_IO_MC_REGS_SIZE;
219 break;
220 case CHIP_CAICOS:
221 default:
222 io_mc_regs = (u32 *)&caicos_io_mc_regs;
223 ucode_size = BTC_MC_UCODE_SIZE;
224 regs_size = BTC_IO_MC_REGS_SIZE;
225 break;
226 case CHIP_CAYMAN:
227 io_mc_regs = (u32 *)&cayman_io_mc_regs;
228 ucode_size = CAYMAN_MC_UCODE_SIZE;
229 regs_size = BTC_IO_MC_REGS_SIZE;
230 break;
231 }
232
233 mem_type = (RREG32(MC_SEQ_MISC0) & MC_SEQ_MISC0_GDDR5_MASK) >> MC_SEQ_MISC0_GDDR5_SHIFT;
234 running = RREG32(MC_SEQ_SUP_CNTL) & RUN_MASK;
235
236 if ((mem_type == MC_SEQ_MISC0_GDDR5_VALUE) && (running == 0)) {
237 if (running) {
238 blackout = RREG32(MC_SHARED_BLACKOUT_CNTL);
239 WREG32(MC_SHARED_BLACKOUT_CNTL, 1);
240 }
241
242 /* reset the engine and set to writable */
243 WREG32(MC_SEQ_SUP_CNTL, 0x00000008);
244 WREG32(MC_SEQ_SUP_CNTL, 0x00000010);
245
246 /* load mc io regs */
247 for (i = 0; i < regs_size; i++) {
248 WREG32(MC_SEQ_IO_DEBUG_INDEX, io_mc_regs[(i << 1)]);
249 WREG32(MC_SEQ_IO_DEBUG_DATA, io_mc_regs[(i << 1) + 1]);
250 }
251 /* load the MC ucode */
252 fw_data = (const __be32 *)rdev->mc_fw->data;
253 for (i = 0; i < ucode_size; i++)
254 WREG32(MC_SEQ_SUP_PGM, be32_to_cpup(fw_data++));
255
256 /* put the engine back into the active state */
257 WREG32(MC_SEQ_SUP_CNTL, 0x00000008);
258 WREG32(MC_SEQ_SUP_CNTL, 0x00000004);
259 WREG32(MC_SEQ_SUP_CNTL, 0x00000001);
260
261 /* wait for training to complete */
262 while (!(RREG32(MC_IO_PAD_CNTL_D0) & MEM_FALL_OUT_CMD))
263 udelay(10);
264
265 if (running)
266 WREG32(MC_SHARED_BLACKOUT_CNTL, blackout);
267 }
268
269 return 0;
270}
271
272int ni_init_microcode(struct radeon_device *rdev)
273{
274 struct platform_device *pdev;
275 const char *chip_name;
276 const char *rlc_chip_name;
277 size_t pfp_req_size, me_req_size, rlc_req_size, mc_req_size;
278 char fw_name[30];
279 int err;
280
281 DRM_DEBUG("\n");
282
283 pdev = platform_device_register_simple("radeon_cp", 0, NULL, 0);
284 err = IS_ERR(pdev);
285 if (err) {
286 printk(KERN_ERR "radeon_cp: Failed to register firmware\n");
287 return -EINVAL;
288 }
289
290 switch (rdev->family) {
291 case CHIP_BARTS:
292 chip_name = "BARTS";
293 rlc_chip_name = "BTC";
294 pfp_req_size = EVERGREEN_PFP_UCODE_SIZE * 4;
295 me_req_size = EVERGREEN_PM4_UCODE_SIZE * 4;
296 rlc_req_size = EVERGREEN_RLC_UCODE_SIZE * 4;
297 mc_req_size = BTC_MC_UCODE_SIZE * 4;
298 break;
299 case CHIP_TURKS:
300 chip_name = "TURKS";
301 rlc_chip_name = "BTC";
302 pfp_req_size = EVERGREEN_PFP_UCODE_SIZE * 4;
303 me_req_size = EVERGREEN_PM4_UCODE_SIZE * 4;
304 rlc_req_size = EVERGREEN_RLC_UCODE_SIZE * 4;
305 mc_req_size = BTC_MC_UCODE_SIZE * 4;
306 break;
307 case CHIP_CAICOS:
308 chip_name = "CAICOS";
309 rlc_chip_name = "BTC";
310 pfp_req_size = EVERGREEN_PFP_UCODE_SIZE * 4;
311 me_req_size = EVERGREEN_PM4_UCODE_SIZE * 4;
312 rlc_req_size = EVERGREEN_RLC_UCODE_SIZE * 4;
313 mc_req_size = BTC_MC_UCODE_SIZE * 4;
314 break;
315 case CHIP_CAYMAN:
316 chip_name = "CAYMAN";
317 rlc_chip_name = "CAYMAN";
318 pfp_req_size = CAYMAN_PFP_UCODE_SIZE * 4;
319 me_req_size = CAYMAN_PM4_UCODE_SIZE * 4;
320 rlc_req_size = CAYMAN_RLC_UCODE_SIZE * 4;
321 mc_req_size = CAYMAN_MC_UCODE_SIZE * 4;
322 break;
323 default: BUG();
324 }
325
326 DRM_INFO("Loading %s Microcode\n", chip_name);
327
328 snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", chip_name);
329 err = request_firmware(&rdev->pfp_fw, fw_name, &pdev->dev);
330 if (err)
331 goto out;
332 if (rdev->pfp_fw->size != pfp_req_size) {
333 printk(KERN_ERR
334 "ni_cp: Bogus length %zu in firmware \"%s\"\n",
335 rdev->pfp_fw->size, fw_name);
336 err = -EINVAL;
337 goto out;
338 }
339
340 snprintf(fw_name, sizeof(fw_name), "radeon/%s_me.bin", chip_name);
341 err = request_firmware(&rdev->me_fw, fw_name, &pdev->dev);
342 if (err)
343 goto out;
344 if (rdev->me_fw->size != me_req_size) {
345 printk(KERN_ERR
346 "ni_cp: Bogus length %zu in firmware \"%s\"\n",
347 rdev->me_fw->size, fw_name);
348 err = -EINVAL;
349 }
350
351 snprintf(fw_name, sizeof(fw_name), "radeon/%s_rlc.bin", rlc_chip_name);
352 err = request_firmware(&rdev->rlc_fw, fw_name, &pdev->dev);
353 if (err)
354 goto out;
355 if (rdev->rlc_fw->size != rlc_req_size) {
356 printk(KERN_ERR
357 "ni_rlc: Bogus length %zu in firmware \"%s\"\n",
358 rdev->rlc_fw->size, fw_name);
359 err = -EINVAL;
360 }
361
362 snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name);
363 err = request_firmware(&rdev->mc_fw, fw_name, &pdev->dev);
364 if (err)
365 goto out;
366 if (rdev->mc_fw->size != mc_req_size) {
367 printk(KERN_ERR
368 "ni_mc: Bogus length %zu in firmware \"%s\"\n",
369 rdev->mc_fw->size, fw_name);
370 err = -EINVAL;
371 }
372out:
373 platform_device_unregister(pdev);
374
375 if (err) {
376 if (err != -EINVAL)
377 printk(KERN_ERR
378 "ni_cp: Failed to load firmware \"%s\"\n",
379 fw_name);
380 release_firmware(rdev->pfp_fw);
381 rdev->pfp_fw = NULL;
382 release_firmware(rdev->me_fw);
383 rdev->me_fw = NULL;
384 release_firmware(rdev->rlc_fw);
385 rdev->rlc_fw = NULL;
386 release_firmware(rdev->mc_fw);
387 rdev->mc_fw = NULL;
388 }
389 return err;
390}
391
392/*
393 * Core functions
394 */
395static u32 cayman_get_tile_pipe_to_backend_map(struct radeon_device *rdev,
396 u32 num_tile_pipes,
397 u32 num_backends_per_asic,
398 u32 *backend_disable_mask_per_asic,
399 u32 num_shader_engines)
400{
401 u32 backend_map = 0;
402 u32 enabled_backends_mask = 0;
403 u32 enabled_backends_count = 0;
404 u32 num_backends_per_se;
405 u32 cur_pipe;
406 u32 swizzle_pipe[CAYMAN_MAX_PIPES];
407 u32 cur_backend = 0;
408 u32 i;
409 bool force_no_swizzle;
410
411 /* force legal values */
412 if (num_tile_pipes < 1)
413 num_tile_pipes = 1;
414 if (num_tile_pipes > rdev->config.cayman.max_tile_pipes)
415 num_tile_pipes = rdev->config.cayman.max_tile_pipes;
416 if (num_shader_engines < 1)
417 num_shader_engines = 1;
418 if (num_shader_engines > rdev->config.cayman.max_shader_engines)
419 num_shader_engines = rdev->config.cayman.max_shader_engines;
420 if (num_backends_per_asic < num_shader_engines)
421 num_backends_per_asic = num_shader_engines;
422 if (num_backends_per_asic > (rdev->config.cayman.max_backends_per_se * num_shader_engines))
423 num_backends_per_asic = rdev->config.cayman.max_backends_per_se * num_shader_engines;
424
425 /* make sure we have the same number of backends per se */
426 num_backends_per_asic = ALIGN(num_backends_per_asic, num_shader_engines);
427 /* set up the number of backends per se */
428 num_backends_per_se = num_backends_per_asic / num_shader_engines;
429 if (num_backends_per_se > rdev->config.cayman.max_backends_per_se) {
430 num_backends_per_se = rdev->config.cayman.max_backends_per_se;
431 num_backends_per_asic = num_backends_per_se * num_shader_engines;
432 }
433
434 /* create enable mask and count for enabled backends */
435 for (i = 0; i < CAYMAN_MAX_BACKENDS; ++i) {
436 if (((*backend_disable_mask_per_asic >> i) & 1) == 0) {
437 enabled_backends_mask |= (1 << i);
438 ++enabled_backends_count;
439 }
440 if (enabled_backends_count == num_backends_per_asic)
441 break;
442 }
443
444 /* force the backends mask to match the current number of backends */
445 if (enabled_backends_count != num_backends_per_asic) {
446 u32 this_backend_enabled;
447 u32 shader_engine;
448 u32 backend_per_se;
449
450 enabled_backends_mask = 0;
451 enabled_backends_count = 0;
452 *backend_disable_mask_per_asic = CAYMAN_MAX_BACKENDS_MASK;
453 for (i = 0; i < CAYMAN_MAX_BACKENDS; ++i) {
454 /* calc the current se */
455 shader_engine = i / rdev->config.cayman.max_backends_per_se;
456 /* calc the backend per se */
457 backend_per_se = i % rdev->config.cayman.max_backends_per_se;
458 /* default to not enabled */
459 this_backend_enabled = 0;
460 if ((shader_engine < num_shader_engines) &&
461 (backend_per_se < num_backends_per_se))
462 this_backend_enabled = 1;
463 if (this_backend_enabled) {
464 enabled_backends_mask |= (1 << i);
465 *backend_disable_mask_per_asic &= ~(1 << i);
466 ++enabled_backends_count;
467 }
468 }
469 }
470
471
472 memset((uint8_t *)&swizzle_pipe[0], 0, sizeof(u32) * CAYMAN_MAX_PIPES);
473 switch (rdev->family) {
474 case CHIP_CAYMAN:
475 force_no_swizzle = true;
476 break;
477 default:
478 force_no_swizzle = false;
479 break;
480 }
481 if (force_no_swizzle) {
482 bool last_backend_enabled = false;
483
484 force_no_swizzle = false;
485 for (i = 0; i < CAYMAN_MAX_BACKENDS; ++i) {
486 if (((enabled_backends_mask >> i) & 1) == 1) {
487 if (last_backend_enabled)
488 force_no_swizzle = true;
489 last_backend_enabled = true;
490 } else
491 last_backend_enabled = false;
492 }
493 }
494
495 switch (num_tile_pipes) {
496 case 1:
497 case 3:
498 case 5:
499 case 7:
500 DRM_ERROR("odd number of pipes!\n");
501 break;
502 case 2:
503 swizzle_pipe[0] = 0;
504 swizzle_pipe[1] = 1;
505 break;
506 case 4:
507 if (force_no_swizzle) {
508 swizzle_pipe[0] = 0;
509 swizzle_pipe[1] = 1;
510 swizzle_pipe[2] = 2;
511 swizzle_pipe[3] = 3;
512 } else {
513 swizzle_pipe[0] = 0;
514 swizzle_pipe[1] = 2;
515 swizzle_pipe[2] = 1;
516 swizzle_pipe[3] = 3;
517 }
518 break;
519 case 6:
520 if (force_no_swizzle) {
521 swizzle_pipe[0] = 0;
522 swizzle_pipe[1] = 1;
523 swizzle_pipe[2] = 2;
524 swizzle_pipe[3] = 3;
525 swizzle_pipe[4] = 4;
526 swizzle_pipe[5] = 5;
527 } else {
528 swizzle_pipe[0] = 0;
529 swizzle_pipe[1] = 2;
530 swizzle_pipe[2] = 4;
531 swizzle_pipe[3] = 1;
532 swizzle_pipe[4] = 3;
533 swizzle_pipe[5] = 5;
534 }
535 break;
536 case 8:
537 if (force_no_swizzle) {
538 swizzle_pipe[0] = 0;
539 swizzle_pipe[1] = 1;
540 swizzle_pipe[2] = 2;
541 swizzle_pipe[3] = 3;
542 swizzle_pipe[4] = 4;
543 swizzle_pipe[5] = 5;
544 swizzle_pipe[6] = 6;
545 swizzle_pipe[7] = 7;
546 } else {
547 swizzle_pipe[0] = 0;
548 swizzle_pipe[1] = 2;
549 swizzle_pipe[2] = 4;
550 swizzle_pipe[3] = 6;
551 swizzle_pipe[4] = 1;
552 swizzle_pipe[5] = 3;
553 swizzle_pipe[6] = 5;
554 swizzle_pipe[7] = 7;
555 }
556 break;
557 }
558
559 for (cur_pipe = 0; cur_pipe < num_tile_pipes; ++cur_pipe) {
560 while (((1 << cur_backend) & enabled_backends_mask) == 0)
561 cur_backend = (cur_backend + 1) % CAYMAN_MAX_BACKENDS;
562
563 backend_map |= (((cur_backend & 0xf) << (swizzle_pipe[cur_pipe] * 4)));
564
565 cur_backend = (cur_backend + 1) % CAYMAN_MAX_BACKENDS;
566 }
567
568 return backend_map;
569}
570
571static void cayman_program_channel_remap(struct radeon_device *rdev)
572{
573 u32 tcp_chan_steer_lo, tcp_chan_steer_hi, mc_shared_chremap, tmp;
574
575 tmp = RREG32(MC_SHARED_CHMAP);
576 switch ((tmp & NOOFCHAN_MASK) >> NOOFCHAN_SHIFT) {
577 case 0:
578 case 1:
579 case 2:
580 case 3:
581 default:
582 /* default mapping */
583 mc_shared_chremap = 0x00fac688;
584 break;
585 }
586
587 switch (rdev->family) {
588 case CHIP_CAYMAN:
589 default:
590 //tcp_chan_steer_lo = 0x54763210
591 tcp_chan_steer_lo = 0x76543210;
592 tcp_chan_steer_hi = 0x0000ba98;
593 break;
594 }
595
596 WREG32(TCP_CHAN_STEER_LO, tcp_chan_steer_lo);
597 WREG32(TCP_CHAN_STEER_HI, tcp_chan_steer_hi);
598 WREG32(MC_SHARED_CHREMAP, mc_shared_chremap);
599}
600
601static u32 cayman_get_disable_mask_per_asic(struct radeon_device *rdev,
602 u32 disable_mask_per_se,
603 u32 max_disable_mask_per_se,
604 u32 num_shader_engines)
605{
606 u32 disable_field_width_per_se = r600_count_pipe_bits(disable_mask_per_se);
607 u32 disable_mask_per_asic = disable_mask_per_se & max_disable_mask_per_se;
608
609 if (num_shader_engines == 1)
610 return disable_mask_per_asic;
611 else if (num_shader_engines == 2)
612 return disable_mask_per_asic | (disable_mask_per_asic << disable_field_width_per_se);
613 else
614 return 0xffffffff;
615}
616
617static void cayman_gpu_init(struct radeon_device *rdev)
618{
619 u32 cc_rb_backend_disable = 0;
620 u32 cc_gc_shader_pipe_config;
621 u32 gb_addr_config = 0;
622 u32 mc_shared_chmap, mc_arb_ramcfg;
623 u32 gb_backend_map;
624 u32 cgts_tcc_disable;
625 u32 sx_debug_1;
626 u32 smx_dc_ctl0;
627 u32 gc_user_shader_pipe_config;
628 u32 gc_user_rb_backend_disable;
629 u32 cgts_user_tcc_disable;
630 u32 cgts_sm_ctrl_reg;
631 u32 hdp_host_path_cntl;
632 u32 tmp;
633 int i, j;
634
635 switch (rdev->family) {
636 case CHIP_CAYMAN:
637 default:
638 rdev->config.cayman.max_shader_engines = 2;
639 rdev->config.cayman.max_pipes_per_simd = 4;
640 rdev->config.cayman.max_tile_pipes = 8;
641 rdev->config.cayman.max_simds_per_se = 12;
642 rdev->config.cayman.max_backends_per_se = 4;
643 rdev->config.cayman.max_texture_channel_caches = 8;
644 rdev->config.cayman.max_gprs = 256;
645 rdev->config.cayman.max_threads = 256;
646 rdev->config.cayman.max_gs_threads = 32;
647 rdev->config.cayman.max_stack_entries = 512;
648 rdev->config.cayman.sx_num_of_sets = 8;
649 rdev->config.cayman.sx_max_export_size = 256;
650 rdev->config.cayman.sx_max_export_pos_size = 64;
651 rdev->config.cayman.sx_max_export_smx_size = 192;
652 rdev->config.cayman.max_hw_contexts = 8;
653 rdev->config.cayman.sq_num_cf_insts = 2;
654
655 rdev->config.cayman.sc_prim_fifo_size = 0x100;
656 rdev->config.cayman.sc_hiz_tile_fifo_size = 0x30;
657 rdev->config.cayman.sc_earlyz_tile_fifo_size = 0x130;
658 break;
659 }
660
661 /* Initialize HDP */
662 for (i = 0, j = 0; i < 32; i++, j += 0x18) {
663 WREG32((0x2c14 + j), 0x00000000);
664 WREG32((0x2c18 + j), 0x00000000);
665 WREG32((0x2c1c + j), 0x00000000);
666 WREG32((0x2c20 + j), 0x00000000);
667 WREG32((0x2c24 + j), 0x00000000);
668 }
669
670 WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff));
671
672 mc_shared_chmap = RREG32(MC_SHARED_CHMAP);
673 mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG);
674
675 cc_rb_backend_disable = RREG32(CC_RB_BACKEND_DISABLE);
676 cc_gc_shader_pipe_config = RREG32(CC_GC_SHADER_PIPE_CONFIG);
677 cgts_tcc_disable = 0xff000000;
678 gc_user_rb_backend_disable = RREG32(GC_USER_RB_BACKEND_DISABLE);
679 gc_user_shader_pipe_config = RREG32(GC_USER_SHADER_PIPE_CONFIG);
680 cgts_user_tcc_disable = RREG32(CGTS_USER_TCC_DISABLE);
681
682 rdev->config.cayman.num_shader_engines = rdev->config.cayman.max_shader_engines;
683 tmp = ((~gc_user_shader_pipe_config) & INACTIVE_QD_PIPES_MASK) >> INACTIVE_QD_PIPES_SHIFT;
684 rdev->config.cayman.num_shader_pipes_per_simd = r600_count_pipe_bits(tmp);
685 rdev->config.cayman.num_tile_pipes = rdev->config.cayman.max_tile_pipes;
686 tmp = ((~gc_user_shader_pipe_config) & INACTIVE_SIMDS_MASK) >> INACTIVE_SIMDS_SHIFT;
687 rdev->config.cayman.num_simds_per_se = r600_count_pipe_bits(tmp);
688 tmp = ((~gc_user_rb_backend_disable) & BACKEND_DISABLE_MASK) >> BACKEND_DISABLE_SHIFT;
689 rdev->config.cayman.num_backends_per_se = r600_count_pipe_bits(tmp);
690 tmp = (gc_user_rb_backend_disable & BACKEND_DISABLE_MASK) >> BACKEND_DISABLE_SHIFT;
691 rdev->config.cayman.backend_disable_mask_per_asic =
692 cayman_get_disable_mask_per_asic(rdev, tmp, CAYMAN_MAX_BACKENDS_PER_SE_MASK,
693 rdev->config.cayman.num_shader_engines);
694 rdev->config.cayman.backend_map =
695 cayman_get_tile_pipe_to_backend_map(rdev, rdev->config.cayman.num_tile_pipes,
696 rdev->config.cayman.num_backends_per_se *
697 rdev->config.cayman.num_shader_engines,
698 &rdev->config.cayman.backend_disable_mask_per_asic,
699 rdev->config.cayman.num_shader_engines);
700 tmp = ((~cgts_user_tcc_disable) & TCC_DISABLE_MASK) >> TCC_DISABLE_SHIFT;
701 rdev->config.cayman.num_texture_channel_caches = r600_count_pipe_bits(tmp);
702 tmp = (mc_arb_ramcfg & BURSTLENGTH_MASK) >> BURSTLENGTH_SHIFT;
703 rdev->config.cayman.mem_max_burst_length_bytes = (tmp + 1) * 256;
704 if (rdev->config.cayman.mem_max_burst_length_bytes > 512)
705 rdev->config.cayman.mem_max_burst_length_bytes = 512;
706 tmp = (mc_arb_ramcfg & NOOFCOLS_MASK) >> NOOFCOLS_SHIFT;
707 rdev->config.cayman.mem_row_size_in_kb = (4 * (1 << (8 + tmp))) / 1024;
708 if (rdev->config.cayman.mem_row_size_in_kb > 4)
709 rdev->config.cayman.mem_row_size_in_kb = 4;
710 /* XXX use MC settings? */
711 rdev->config.cayman.shader_engine_tile_size = 32;
712 rdev->config.cayman.num_gpus = 1;
713 rdev->config.cayman.multi_gpu_tile_size = 64;
714
715 //gb_addr_config = 0x02011003
716#if 0
717 gb_addr_config = RREG32(GB_ADDR_CONFIG);
718#else
719 gb_addr_config = 0;
720 switch (rdev->config.cayman.num_tile_pipes) {
721 case 1:
722 default:
723 gb_addr_config |= NUM_PIPES(0);
724 break;
725 case 2:
726 gb_addr_config |= NUM_PIPES(1);
727 break;
728 case 4:
729 gb_addr_config |= NUM_PIPES(2);
730 break;
731 case 8:
732 gb_addr_config |= NUM_PIPES(3);
733 break;
734 }
735
736 tmp = (rdev->config.cayman.mem_max_burst_length_bytes / 256) - 1;
737 gb_addr_config |= PIPE_INTERLEAVE_SIZE(tmp);
738 gb_addr_config |= NUM_SHADER_ENGINES(rdev->config.cayman.num_shader_engines - 1);
739 tmp = (rdev->config.cayman.shader_engine_tile_size / 16) - 1;
740 gb_addr_config |= SHADER_ENGINE_TILE_SIZE(tmp);
741 switch (rdev->config.cayman.num_gpus) {
742 case 1:
743 default:
744 gb_addr_config |= NUM_GPUS(0);
745 break;
746 case 2:
747 gb_addr_config |= NUM_GPUS(1);
748 break;
749 case 4:
750 gb_addr_config |= NUM_GPUS(2);
751 break;
752 }
753 switch (rdev->config.cayman.multi_gpu_tile_size) {
754 case 16:
755 gb_addr_config |= MULTI_GPU_TILE_SIZE(0);
756 break;
757 case 32:
758 default:
759 gb_addr_config |= MULTI_GPU_TILE_SIZE(1);
760 break;
761 case 64:
762 gb_addr_config |= MULTI_GPU_TILE_SIZE(2);
763 break;
764 case 128:
765 gb_addr_config |= MULTI_GPU_TILE_SIZE(3);
766 break;
767 }
768 switch (rdev->config.cayman.mem_row_size_in_kb) {
769 case 1:
770 default:
771 gb_addr_config |= ROW_SIZE(0);
772 break;
773 case 2:
774 gb_addr_config |= ROW_SIZE(1);
775 break;
776 case 4:
777 gb_addr_config |= ROW_SIZE(2);
778 break;
779 }
780#endif
781
782 tmp = (gb_addr_config & NUM_PIPES_MASK) >> NUM_PIPES_SHIFT;
783 rdev->config.cayman.num_tile_pipes = (1 << tmp);
784 tmp = (gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT;
785 rdev->config.cayman.mem_max_burst_length_bytes = (tmp + 1) * 256;
786 tmp = (gb_addr_config & NUM_SHADER_ENGINES_MASK) >> NUM_SHADER_ENGINES_SHIFT;
787 rdev->config.cayman.num_shader_engines = tmp + 1;
788 tmp = (gb_addr_config & NUM_GPUS_MASK) >> NUM_GPUS_SHIFT;
789 rdev->config.cayman.num_gpus = tmp + 1;
790 tmp = (gb_addr_config & MULTI_GPU_TILE_SIZE_MASK) >> MULTI_GPU_TILE_SIZE_SHIFT;
791 rdev->config.cayman.multi_gpu_tile_size = 1 << tmp;
792 tmp = (gb_addr_config & ROW_SIZE_MASK) >> ROW_SIZE_SHIFT;
793 rdev->config.cayman.mem_row_size_in_kb = 1 << tmp;
794
795 //gb_backend_map = 0x76541032;
796#if 0
797 gb_backend_map = RREG32(GB_BACKEND_MAP);
798#else
799 gb_backend_map =
800 cayman_get_tile_pipe_to_backend_map(rdev, rdev->config.cayman.num_tile_pipes,
801 rdev->config.cayman.num_backends_per_se *
802 rdev->config.cayman.num_shader_engines,
803 &rdev->config.cayman.backend_disable_mask_per_asic,
804 rdev->config.cayman.num_shader_engines);
805#endif
806 /* setup tiling info dword. gb_addr_config is not adequate since it does
807 * not have bank info, so create a custom tiling dword.
808 * bits 3:0 num_pipes
809 * bits 7:4 num_banks
810 * bits 11:8 group_size
811 * bits 15:12 row_size
812 */
813 rdev->config.cayman.tile_config = 0;
814 switch (rdev->config.cayman.num_tile_pipes) {
815 case 1:
816 default:
817 rdev->config.cayman.tile_config |= (0 << 0);
818 break;
819 case 2:
820 rdev->config.cayman.tile_config |= (1 << 0);
821 break;
822 case 4:
823 rdev->config.cayman.tile_config |= (2 << 0);
824 break;
825 case 8:
826 rdev->config.cayman.tile_config |= (3 << 0);
827 break;
828 }
829 rdev->config.cayman.tile_config |=
830 ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) << 4;
831 rdev->config.cayman.tile_config |=
832 ((gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT) << 8;
833 rdev->config.cayman.tile_config |=
834 ((gb_addr_config & ROW_SIZE_MASK) >> ROW_SIZE_SHIFT) << 12;
835
836 WREG32(GB_BACKEND_MAP, gb_backend_map);
837 WREG32(GB_ADDR_CONFIG, gb_addr_config);
838 WREG32(DMIF_ADDR_CONFIG, gb_addr_config);
839 WREG32(HDP_ADDR_CONFIG, gb_addr_config);
840
841 cayman_program_channel_remap(rdev);
842
843 /* primary versions */
844 WREG32(CC_RB_BACKEND_DISABLE, cc_rb_backend_disable);
845 WREG32(CC_SYS_RB_BACKEND_DISABLE, cc_rb_backend_disable);
846 WREG32(CC_GC_SHADER_PIPE_CONFIG, cc_gc_shader_pipe_config);
847
848 WREG32(CGTS_TCC_DISABLE, cgts_tcc_disable);
849 WREG32(CGTS_SYS_TCC_DISABLE, cgts_tcc_disable);
850
851 /* user versions */
852 WREG32(GC_USER_RB_BACKEND_DISABLE, cc_rb_backend_disable);
853 WREG32(GC_USER_SYS_RB_BACKEND_DISABLE, cc_rb_backend_disable);
854 WREG32(GC_USER_SHADER_PIPE_CONFIG, cc_gc_shader_pipe_config);
855
856 WREG32(CGTS_USER_SYS_TCC_DISABLE, cgts_tcc_disable);
857 WREG32(CGTS_USER_TCC_DISABLE, cgts_tcc_disable);
858
859 /* reprogram the shader complex */
860 cgts_sm_ctrl_reg = RREG32(CGTS_SM_CTRL_REG);
861 for (i = 0; i < 16; i++)
862 WREG32(CGTS_SM_CTRL_REG, OVERRIDE);
863 WREG32(CGTS_SM_CTRL_REG, cgts_sm_ctrl_reg);
864
865 /* set HW defaults for 3D engine */
866 WREG32(CP_MEQ_THRESHOLDS, MEQ1_START(0x30) | MEQ2_START(0x60));
867
868 sx_debug_1 = RREG32(SX_DEBUG_1);
869 sx_debug_1 |= ENABLE_NEW_SMX_ADDRESS;
870 WREG32(SX_DEBUG_1, sx_debug_1);
871
872 smx_dc_ctl0 = RREG32(SMX_DC_CTL0);
873 smx_dc_ctl0 &= ~NUMBER_OF_SETS(0x1ff);
874 smx_dc_ctl0 |= NUMBER_OF_SETS(rdev->config.cayman.sx_num_of_sets);
875 WREG32(SMX_DC_CTL0, smx_dc_ctl0);
876
877 WREG32(SPI_CONFIG_CNTL_1, VTX_DONE_DELAY(4) | CRC_SIMD_ID_WADDR_DISABLE);
878
879 /* need to be explicitly zero-ed */
880 WREG32(VGT_OFFCHIP_LDS_BASE, 0);
881 WREG32(SQ_LSTMP_RING_BASE, 0);
882 WREG32(SQ_HSTMP_RING_BASE, 0);
883 WREG32(SQ_ESTMP_RING_BASE, 0);
884 WREG32(SQ_GSTMP_RING_BASE, 0);
885 WREG32(SQ_VSTMP_RING_BASE, 0);
886 WREG32(SQ_PSTMP_RING_BASE, 0);
887
888 WREG32(TA_CNTL_AUX, DISABLE_CUBE_ANISO);
889
890 WREG32(SX_EXPORT_BUFFER_SIZES, (COLOR_BUFFER_SIZE((rdev->config.cayman.sx_max_export_size / 4) - 1) |
891 POSITION_BUFFER_SIZE((rdev->config.cayman.sx_max_export_pos_size / 4) - 1) |
892 SMX_BUFFER_SIZE((rdev->config.cayman.sx_max_export_smx_size / 4) - 1)));
893
894 WREG32(PA_SC_FIFO_SIZE, (SC_PRIM_FIFO_SIZE(rdev->config.cayman.sc_prim_fifo_size) |
895 SC_HIZ_TILE_FIFO_SIZE(rdev->config.cayman.sc_hiz_tile_fifo_size) |
896 SC_EARLYZ_TILE_FIFO_SIZE(rdev->config.cayman.sc_earlyz_tile_fifo_size)));
897
898
899 WREG32(VGT_NUM_INSTANCES, 1);
900
901 WREG32(CP_PERFMON_CNTL, 0);
902
903 WREG32(SQ_MS_FIFO_SIZES, (CACHE_FIFO_SIZE(16 * rdev->config.cayman.sq_num_cf_insts) |
904 FETCH_FIFO_HIWATER(0x4) |
905 DONE_FIFO_HIWATER(0xe0) |
906 ALU_UPDATE_FIFO_HIWATER(0x8)));
907
908 WREG32(SQ_GPR_RESOURCE_MGMT_1, NUM_CLAUSE_TEMP_GPRS(4));
909 WREG32(SQ_CONFIG, (VC_ENABLE |
910 EXPORT_SRC_C |
911 GFX_PRIO(0) |
912 CS1_PRIO(0) |
913 CS2_PRIO(1)));
914 WREG32(SQ_DYN_GPR_CNTL_PS_FLUSH_REQ, DYN_GPR_ENABLE);
915
916 WREG32(PA_SC_FORCE_EOV_MAX_CNTS, (FORCE_EOV_MAX_CLK_CNT(4095) |
917 FORCE_EOV_MAX_REZ_CNT(255)));
918
919 WREG32(VGT_CACHE_INVALIDATION, CACHE_INVALIDATION(VC_AND_TC) |
920 AUTO_INVLD_EN(ES_AND_GS_AUTO));
921
922 WREG32(VGT_GS_VERTEX_REUSE, 16);
923 WREG32(PA_SC_LINE_STIPPLE_STATE, 0);
924
925 WREG32(CB_PERF_CTR0_SEL_0, 0);
926 WREG32(CB_PERF_CTR0_SEL_1, 0);
927 WREG32(CB_PERF_CTR1_SEL_0, 0);
928 WREG32(CB_PERF_CTR1_SEL_1, 0);
929 WREG32(CB_PERF_CTR2_SEL_0, 0);
930 WREG32(CB_PERF_CTR2_SEL_1, 0);
931 WREG32(CB_PERF_CTR3_SEL_0, 0);
932 WREG32(CB_PERF_CTR3_SEL_1, 0);
933
934 tmp = RREG32(HDP_MISC_CNTL);
935 tmp |= HDP_FLUSH_INVALIDATE_CACHE;
936 WREG32(HDP_MISC_CNTL, tmp);
937
938 hdp_host_path_cntl = RREG32(HDP_HOST_PATH_CNTL);
939 WREG32(HDP_HOST_PATH_CNTL, hdp_host_path_cntl);
940
941 WREG32(PA_CL_ENHANCE, CLIP_VTX_REORDER_ENA | NUM_CLIP_SEQ(3));
942
943 udelay(50);
944}
945
946/*
947 * GART
948 */
949void cayman_pcie_gart_tlb_flush(struct radeon_device *rdev)
950{
951 /* flush hdp cache */
952 WREG32(HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1);
953
954 /* bits 0-7 are the VM contexts0-7 */
955 WREG32(VM_INVALIDATE_REQUEST, 1);
956}
957
958int cayman_pcie_gart_enable(struct radeon_device *rdev)
959{
960 int r;
961
962 if (rdev->gart.table.vram.robj == NULL) {
963 dev_err(rdev->dev, "No VRAM object for PCIE GART.\n");
964 return -EINVAL;
965 }
966 r = radeon_gart_table_vram_pin(rdev);
967 if (r)
968 return r;
969 radeon_gart_restore(rdev);
970 /* Setup TLB control */
971 WREG32(MC_VM_MX_L1_TLB_CNTL, ENABLE_L1_TLB |
972 ENABLE_L1_FRAGMENT_PROCESSING |
973 SYSTEM_ACCESS_MODE_NOT_IN_SYS |
974 SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU);
975 /* Setup L2 cache */
976 WREG32(VM_L2_CNTL, ENABLE_L2_CACHE |
977 ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
978 ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE |
979 EFFECTIVE_L2_QUEUE_SIZE(7) |
980 CONTEXT1_IDENTITY_ACCESS_MODE(1));
981 WREG32(VM_L2_CNTL2, INVALIDATE_ALL_L1_TLBS | INVALIDATE_L2_CACHE);
982 WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY |
983 L2_CACHE_BIGK_FRAGMENT_SIZE(6));
984 /* setup context0 */
985 WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12);
986 WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12);
987 WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12);
988 WREG32(VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR,
989 (u32)(rdev->dummy_page.addr >> 12));
990 WREG32(VM_CONTEXT0_CNTL2, 0);
991 WREG32(VM_CONTEXT0_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) |
992 RANGE_PROTECTION_FAULT_ENABLE_DEFAULT);
993 /* disable context1-7 */
994 WREG32(VM_CONTEXT1_CNTL2, 0);
995 WREG32(VM_CONTEXT1_CNTL, 0);
996
997 cayman_pcie_gart_tlb_flush(rdev);
998 rdev->gart.ready = true;
999 return 0;
1000}
1001
1002void cayman_pcie_gart_disable(struct radeon_device *rdev)
1003{
1004 int r;
1005
1006 /* Disable all tables */
1007 WREG32(VM_CONTEXT0_CNTL, 0);
1008 WREG32(VM_CONTEXT1_CNTL, 0);
1009 /* Setup TLB control */
1010 WREG32(MC_VM_MX_L1_TLB_CNTL, ENABLE_L1_FRAGMENT_PROCESSING |
1011 SYSTEM_ACCESS_MODE_NOT_IN_SYS |
1012 SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU);
1013 /* Setup L2 cache */
1014 WREG32(VM_L2_CNTL, ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
1015 ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE |
1016 EFFECTIVE_L2_QUEUE_SIZE(7) |
1017 CONTEXT1_IDENTITY_ACCESS_MODE(1));
1018 WREG32(VM_L2_CNTL2, 0);
1019 WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY |
1020 L2_CACHE_BIGK_FRAGMENT_SIZE(6));
1021 if (rdev->gart.table.vram.robj) {
1022 r = radeon_bo_reserve(rdev->gart.table.vram.robj, false);
1023 if (likely(r == 0)) {
1024 radeon_bo_kunmap(rdev->gart.table.vram.robj);
1025 radeon_bo_unpin(rdev->gart.table.vram.robj);
1026 radeon_bo_unreserve(rdev->gart.table.vram.robj);
1027 }
1028 }
1029}
1030
1031void cayman_pcie_gart_fini(struct radeon_device *rdev)
1032{
1033 cayman_pcie_gart_disable(rdev);
1034 radeon_gart_table_vram_free(rdev);
1035 radeon_gart_fini(rdev);
1036}
1037
1038/*
1039 * CP.
1040 */
1041static void cayman_cp_enable(struct radeon_device *rdev, bool enable)
1042{
1043 if (enable)
1044 WREG32(CP_ME_CNTL, 0);
1045 else {
1046 radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
1047 WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT));
1048 WREG32(SCRATCH_UMSK, 0);
1049 }
1050}
1051
1052static int cayman_cp_load_microcode(struct radeon_device *rdev)
1053{
1054 const __be32 *fw_data;
1055 int i;
1056
1057 if (!rdev->me_fw || !rdev->pfp_fw)
1058 return -EINVAL;
1059
1060 cayman_cp_enable(rdev, false);
1061
1062 fw_data = (const __be32 *)rdev->pfp_fw->data;
1063 WREG32(CP_PFP_UCODE_ADDR, 0);
1064 for (i = 0; i < CAYMAN_PFP_UCODE_SIZE; i++)
1065 WREG32(CP_PFP_UCODE_DATA, be32_to_cpup(fw_data++));
1066 WREG32(CP_PFP_UCODE_ADDR, 0);
1067
1068 fw_data = (const __be32 *)rdev->me_fw->data;
1069 WREG32(CP_ME_RAM_WADDR, 0);
1070 for (i = 0; i < CAYMAN_PM4_UCODE_SIZE; i++)
1071 WREG32(CP_ME_RAM_DATA, be32_to_cpup(fw_data++));
1072
1073 WREG32(CP_PFP_UCODE_ADDR, 0);
1074 WREG32(CP_ME_RAM_WADDR, 0);
1075 WREG32(CP_ME_RAM_RADDR, 0);
1076 return 0;
1077}
1078
1079static int cayman_cp_start(struct radeon_device *rdev)
1080{
1081 int r, i;
1082
1083 r = radeon_ring_lock(rdev, 7);
1084 if (r) {
1085 DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r);
1086 return r;
1087 }
1088 radeon_ring_write(rdev, PACKET3(PACKET3_ME_INITIALIZE, 5));
1089 radeon_ring_write(rdev, 0x1);
1090 radeon_ring_write(rdev, 0x0);
1091 radeon_ring_write(rdev, rdev->config.cayman.max_hw_contexts - 1);
1092 radeon_ring_write(rdev, PACKET3_ME_INITIALIZE_DEVICE_ID(1));
1093 radeon_ring_write(rdev, 0);
1094 radeon_ring_write(rdev, 0);
1095 radeon_ring_unlock_commit(rdev);
1096
1097 cayman_cp_enable(rdev, true);
1098
1099 r = radeon_ring_lock(rdev, cayman_default_size + 19);
1100 if (r) {
1101 DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r);
1102 return r;
1103 }
1104
1105 /* setup clear context state */
1106 radeon_ring_write(rdev, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
1107 radeon_ring_write(rdev, PACKET3_PREAMBLE_BEGIN_CLEAR_STATE);
1108
1109 for (i = 0; i < cayman_default_size; i++)
1110 radeon_ring_write(rdev, cayman_default_state[i]);
1111
1112 radeon_ring_write(rdev, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
1113 radeon_ring_write(rdev, PACKET3_PREAMBLE_END_CLEAR_STATE);
1114
1115 /* set clear context state */
1116 radeon_ring_write(rdev, PACKET3(PACKET3_CLEAR_STATE, 0));
1117 radeon_ring_write(rdev, 0);
1118
1119 /* SQ_VTX_BASE_VTX_LOC */
1120 radeon_ring_write(rdev, 0xc0026f00);
1121 radeon_ring_write(rdev, 0x00000000);
1122 radeon_ring_write(rdev, 0x00000000);
1123 radeon_ring_write(rdev, 0x00000000);
1124
1125 /* Clear consts */
1126 radeon_ring_write(rdev, 0xc0036f00);
1127 radeon_ring_write(rdev, 0x00000bc4);
1128 radeon_ring_write(rdev, 0xffffffff);
1129 radeon_ring_write(rdev, 0xffffffff);
1130 radeon_ring_write(rdev, 0xffffffff);
1131
1132 radeon_ring_write(rdev, 0xc0026900);
1133 radeon_ring_write(rdev, 0x00000316);
1134 radeon_ring_write(rdev, 0x0000000e); /* VGT_VERTEX_REUSE_BLOCK_CNTL */
1135 radeon_ring_write(rdev, 0x00000010); /* */
1136
1137 radeon_ring_unlock_commit(rdev);
1138
1139 /* XXX init other rings */
1140
1141 return 0;
1142}
1143
1144static void cayman_cp_fini(struct radeon_device *rdev)
1145{
1146 cayman_cp_enable(rdev, false);
1147 radeon_ring_fini(rdev);
1148}
1149
1150int cayman_cp_resume(struct radeon_device *rdev)
1151{
1152 u32 tmp;
1153 u32 rb_bufsz;
1154 int r;
1155
1156 /* Reset cp; if cp is reset, then PA, SH, VGT also need to be reset */
1157 WREG32(GRBM_SOFT_RESET, (SOFT_RESET_CP |
1158 SOFT_RESET_PA |
1159 SOFT_RESET_SH |
1160 SOFT_RESET_VGT |
1161 SOFT_RESET_SX));
1162 RREG32(GRBM_SOFT_RESET);
1163 mdelay(15);
1164 WREG32(GRBM_SOFT_RESET, 0);
1165 RREG32(GRBM_SOFT_RESET);
1166
1167 WREG32(CP_SEM_WAIT_TIMER, 0x4);
1168
1169 /* Set the write pointer delay */
1170 WREG32(CP_RB_WPTR_DELAY, 0);
1171
1172 WREG32(CP_DEBUG, (1 << 27));
1173
1174 /* ring 0 - compute and gfx */
1175 /* Set ring buffer size */
1176 rb_bufsz = drm_order(rdev->cp.ring_size / 8);
1177 tmp = (drm_order(RADEON_GPU_PAGE_SIZE/8) << 8) | rb_bufsz;
1178#ifdef __BIG_ENDIAN
1179 tmp |= BUF_SWAP_32BIT;
1180#endif
1181 WREG32(CP_RB0_CNTL, tmp);
1182
1183 /* Initialize the ring buffer's read and write pointers */
1184 WREG32(CP_RB0_CNTL, tmp | RB_RPTR_WR_ENA);
1185 WREG32(CP_RB0_WPTR, 0);
1186
1187 /* set the wb address wether it's enabled or not */
1188 WREG32(CP_RB0_RPTR_ADDR, (rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFFFFFFFC);
1189 WREG32(CP_RB0_RPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFF);
1190 WREG32(SCRATCH_ADDR, ((rdev->wb.gpu_addr + RADEON_WB_SCRATCH_OFFSET) >> 8) & 0xFFFFFFFF);
1191
1192 if (rdev->wb.enabled)
1193 WREG32(SCRATCH_UMSK, 0xff);
1194 else {
1195 tmp |= RB_NO_UPDATE;
1196 WREG32(SCRATCH_UMSK, 0);
1197 }
1198
1199 mdelay(1);
1200 WREG32(CP_RB0_CNTL, tmp);
1201
1202 WREG32(CP_RB0_BASE, rdev->cp.gpu_addr >> 8);
1203
1204 rdev->cp.rptr = RREG32(CP_RB0_RPTR);
1205 rdev->cp.wptr = RREG32(CP_RB0_WPTR);
1206
1207 /* ring1 - compute only */
1208 /* Set ring buffer size */
1209 rb_bufsz = drm_order(rdev->cp1.ring_size / 8);
1210 tmp = (drm_order(RADEON_GPU_PAGE_SIZE/8) << 8) | rb_bufsz;
1211#ifdef __BIG_ENDIAN
1212 tmp |= BUF_SWAP_32BIT;
1213#endif
1214 WREG32(CP_RB1_CNTL, tmp);
1215
1216 /* Initialize the ring buffer's read and write pointers */
1217 WREG32(CP_RB1_CNTL, tmp | RB_RPTR_WR_ENA);
1218 WREG32(CP_RB1_WPTR, 0);
1219
1220 /* set the wb address wether it's enabled or not */
1221 WREG32(CP_RB1_RPTR_ADDR, (rdev->wb.gpu_addr + RADEON_WB_CP1_RPTR_OFFSET) & 0xFFFFFFFC);
1222 WREG32(CP_RB1_RPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + RADEON_WB_CP1_RPTR_OFFSET) & 0xFF);
1223
1224 mdelay(1);
1225 WREG32(CP_RB1_CNTL, tmp);
1226
1227 WREG32(CP_RB1_BASE, rdev->cp1.gpu_addr >> 8);
1228
1229 rdev->cp1.rptr = RREG32(CP_RB1_RPTR);
1230 rdev->cp1.wptr = RREG32(CP_RB1_WPTR);
1231
1232 /* ring2 - compute only */
1233 /* Set ring buffer size */
1234 rb_bufsz = drm_order(rdev->cp2.ring_size / 8);
1235 tmp = (drm_order(RADEON_GPU_PAGE_SIZE/8) << 8) | rb_bufsz;
1236#ifdef __BIG_ENDIAN
1237 tmp |= BUF_SWAP_32BIT;
1238#endif
1239 WREG32(CP_RB2_CNTL, tmp);
1240
1241 /* Initialize the ring buffer's read and write pointers */
1242 WREG32(CP_RB2_CNTL, tmp | RB_RPTR_WR_ENA);
1243 WREG32(CP_RB2_WPTR, 0);
1244
1245 /* set the wb address wether it's enabled or not */
1246 WREG32(CP_RB2_RPTR_ADDR, (rdev->wb.gpu_addr + RADEON_WB_CP2_RPTR_OFFSET) & 0xFFFFFFFC);
1247 WREG32(CP_RB2_RPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + RADEON_WB_CP2_RPTR_OFFSET) & 0xFF);
1248
1249 mdelay(1);
1250 WREG32(CP_RB2_CNTL, tmp);
1251
1252 WREG32(CP_RB2_BASE, rdev->cp2.gpu_addr >> 8);
1253
1254 rdev->cp2.rptr = RREG32(CP_RB2_RPTR);
1255 rdev->cp2.wptr = RREG32(CP_RB2_WPTR);
1256
1257 /* start the rings */
1258 cayman_cp_start(rdev);
1259 rdev->cp.ready = true;
1260 rdev->cp1.ready = true;
1261 rdev->cp2.ready = true;
1262 /* this only test cp0 */
1263 r = radeon_ring_test(rdev);
1264 if (r) {
1265 rdev->cp.ready = false;
1266 rdev->cp1.ready = false;
1267 rdev->cp2.ready = false;
1268 return r;
1269 }
1270
1271 return 0;
1272}
1273
1274bool cayman_gpu_is_lockup(struct radeon_device *rdev)
1275{
1276 u32 srbm_status;
1277 u32 grbm_status;
1278 u32 grbm_status_se0, grbm_status_se1;
1279 struct r100_gpu_lockup *lockup = &rdev->config.cayman.lockup;
1280 int r;
1281
1282 srbm_status = RREG32(SRBM_STATUS);
1283 grbm_status = RREG32(GRBM_STATUS);
1284 grbm_status_se0 = RREG32(GRBM_STATUS_SE0);
1285 grbm_status_se1 = RREG32(GRBM_STATUS_SE1);
1286 if (!(grbm_status & GUI_ACTIVE)) {
1287 r100_gpu_lockup_update(lockup, &rdev->cp);
1288 return false;
1289 }
1290 /* force CP activities */
1291 r = radeon_ring_lock(rdev, 2);
1292 if (!r) {
1293 /* PACKET2 NOP */
1294 radeon_ring_write(rdev, 0x80000000);
1295 radeon_ring_write(rdev, 0x80000000);
1296 radeon_ring_unlock_commit(rdev);
1297 }
1298 /* XXX deal with CP0,1,2 */
1299 rdev->cp.rptr = RREG32(CP_RB0_RPTR);
1300 return r100_gpu_cp_is_lockup(rdev, lockup, &rdev->cp);
1301}
1302
1303static int cayman_gpu_soft_reset(struct radeon_device *rdev)
1304{
1305 struct evergreen_mc_save save;
1306 u32 grbm_reset = 0;
1307
1308 if (!(RREG32(GRBM_STATUS) & GUI_ACTIVE))
1309 return 0;
1310
1311 dev_info(rdev->dev, "GPU softreset \n");
1312 dev_info(rdev->dev, " GRBM_STATUS=0x%08X\n",
1313 RREG32(GRBM_STATUS));
1314 dev_info(rdev->dev, " GRBM_STATUS_SE0=0x%08X\n",
1315 RREG32(GRBM_STATUS_SE0));
1316 dev_info(rdev->dev, " GRBM_STATUS_SE1=0x%08X\n",
1317 RREG32(GRBM_STATUS_SE1));
1318 dev_info(rdev->dev, " SRBM_STATUS=0x%08X\n",
1319 RREG32(SRBM_STATUS));
1320 evergreen_mc_stop(rdev, &save);
1321 if (evergreen_mc_wait_for_idle(rdev)) {
1322 dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
1323 }
1324 /* Disable CP parsing/prefetching */
1325 WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT);
1326
1327 /* reset all the gfx blocks */
1328 grbm_reset = (SOFT_RESET_CP |
1329 SOFT_RESET_CB |
1330 SOFT_RESET_DB |
1331 SOFT_RESET_GDS |
1332 SOFT_RESET_PA |
1333 SOFT_RESET_SC |
1334 SOFT_RESET_SPI |
1335 SOFT_RESET_SH |
1336 SOFT_RESET_SX |
1337 SOFT_RESET_TC |
1338 SOFT_RESET_TA |
1339 SOFT_RESET_VGT |
1340 SOFT_RESET_IA);
1341
1342 dev_info(rdev->dev, " GRBM_SOFT_RESET=0x%08X\n", grbm_reset);
1343 WREG32(GRBM_SOFT_RESET, grbm_reset);
1344 (void)RREG32(GRBM_SOFT_RESET);
1345 udelay(50);
1346 WREG32(GRBM_SOFT_RESET, 0);
1347 (void)RREG32(GRBM_SOFT_RESET);
1348 /* Wait a little for things to settle down */
1349 udelay(50);
1350 dev_info(rdev->dev, " GRBM_STATUS=0x%08X\n",
1351 RREG32(GRBM_STATUS));
1352 dev_info(rdev->dev, " GRBM_STATUS_SE0=0x%08X\n",
1353 RREG32(GRBM_STATUS_SE0));
1354 dev_info(rdev->dev, " GRBM_STATUS_SE1=0x%08X\n",
1355 RREG32(GRBM_STATUS_SE1));
1356 dev_info(rdev->dev, " SRBM_STATUS=0x%08X\n",
1357 RREG32(SRBM_STATUS));
1358 evergreen_mc_resume(rdev, &save);
1359 return 0;
1360}
1361
1362int cayman_asic_reset(struct radeon_device *rdev)
1363{
1364 return cayman_gpu_soft_reset(rdev);
1365}
1366
1367static int cayman_startup(struct radeon_device *rdev)
1368{
1369 int r;
1370
1371 if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw || !rdev->mc_fw) {
1372 r = ni_init_microcode(rdev);
1373 if (r) {
1374 DRM_ERROR("Failed to load firmware!\n");
1375 return r;
1376 }
1377 }
1378 r = ni_mc_load_microcode(rdev);
1379 if (r) {
1380 DRM_ERROR("Failed to load MC firmware!\n");
1381 return r;
1382 }
1383
1384 evergreen_mc_program(rdev);
1385 r = cayman_pcie_gart_enable(rdev);
1386 if (r)
1387 return r;
1388 cayman_gpu_init(rdev);
1389
1390 r = evergreen_blit_init(rdev);
1391 if (r) {
1392 evergreen_blit_fini(rdev);
1393 rdev->asic->copy = NULL;
1394 dev_warn(rdev->dev, "failed blitter (%d) falling back to memcpy\n", r);
1395 }
1396
1397 /* allocate wb buffer */
1398 r = radeon_wb_init(rdev);
1399 if (r)
1400 return r;
1401
1402 /* Enable IRQ */
1403 r = r600_irq_init(rdev);
1404 if (r) {
1405 DRM_ERROR("radeon: IH init failed (%d).\n", r);
1406 radeon_irq_kms_fini(rdev);
1407 return r;
1408 }
1409 evergreen_irq_set(rdev);
1410
1411 r = radeon_ring_init(rdev, rdev->cp.ring_size);
1412 if (r)
1413 return r;
1414 r = cayman_cp_load_microcode(rdev);
1415 if (r)
1416 return r;
1417 r = cayman_cp_resume(rdev);
1418 if (r)
1419 return r;
1420
1421 return 0;
1422}
1423
1424int cayman_resume(struct radeon_device *rdev)
1425{
1426 int r;
1427
1428 /* Do not reset GPU before posting, on rv770 hw unlike on r500 hw,
1429 * posting will perform necessary task to bring back GPU into good
1430 * shape.
1431 */
1432 /* post card */
1433 atom_asic_init(rdev->mode_info.atom_context);
1434
1435 r = cayman_startup(rdev);
1436 if (r) {
1437 DRM_ERROR("cayman startup failed on resume\n");
1438 return r;
1439 }
1440
1441 r = r600_ib_test(rdev);
1442 if (r) {
1443 DRM_ERROR("radeon: failled testing IB (%d).\n", r);
1444 return r;
1445 }
1446
1447 return r;
1448
1449}
1450
1451int cayman_suspend(struct radeon_device *rdev)
1452{
1453 int r;
1454
1455 /* FIXME: we should wait for ring to be empty */
1456 cayman_cp_enable(rdev, false);
1457 rdev->cp.ready = false;
1458 evergreen_irq_suspend(rdev);
1459 radeon_wb_disable(rdev);
1460 cayman_pcie_gart_disable(rdev);
1461
1462 /* unpin shaders bo */
1463 r = radeon_bo_reserve(rdev->r600_blit.shader_obj, false);
1464 if (likely(r == 0)) {
1465 radeon_bo_unpin(rdev->r600_blit.shader_obj);
1466 radeon_bo_unreserve(rdev->r600_blit.shader_obj);
1467 }
1468
1469 return 0;
1470}
1471
1472/* Plan is to move initialization in that function and use
1473 * helper function so that radeon_device_init pretty much
1474 * do nothing more than calling asic specific function. This
1475 * should also allow to remove a bunch of callback function
1476 * like vram_info.
1477 */
1478int cayman_init(struct radeon_device *rdev)
1479{
1480 int r;
1481
1482 /* This don't do much */
1483 r = radeon_gem_init(rdev);
1484 if (r)
1485 return r;
1486 /* Read BIOS */
1487 if (!radeon_get_bios(rdev)) {
1488 if (ASIC_IS_AVIVO(rdev))
1489 return -EINVAL;
1490 }
1491 /* Must be an ATOMBIOS */
1492 if (!rdev->is_atom_bios) {
1493 dev_err(rdev->dev, "Expecting atombios for cayman GPU\n");
1494 return -EINVAL;
1495 }
1496 r = radeon_atombios_init(rdev);
1497 if (r)
1498 return r;
1499
1500 /* Post card if necessary */
1501 if (!radeon_card_posted(rdev)) {
1502 if (!rdev->bios) {
1503 dev_err(rdev->dev, "Card not posted and no BIOS - ignoring\n");
1504 return -EINVAL;
1505 }
1506 DRM_INFO("GPU not posted. posting now...\n");
1507 atom_asic_init(rdev->mode_info.atom_context);
1508 }
1509 /* Initialize scratch registers */
1510 r600_scratch_init(rdev);
1511 /* Initialize surface registers */
1512 radeon_surface_init(rdev);
1513 /* Initialize clocks */
1514 radeon_get_clock_info(rdev->ddev);
1515 /* Fence driver */
1516 r = radeon_fence_driver_init(rdev);
1517 if (r)
1518 return r;
1519 /* initialize memory controller */
1520 r = evergreen_mc_init(rdev);
1521 if (r)
1522 return r;
1523 /* Memory manager */
1524 r = radeon_bo_init(rdev);
1525 if (r)
1526 return r;
1527
1528 r = radeon_irq_kms_init(rdev);
1529 if (r)
1530 return r;
1531
1532 rdev->cp.ring_obj = NULL;
1533 r600_ring_init(rdev, 1024 * 1024);
1534
1535 rdev->ih.ring_obj = NULL;
1536 r600_ih_ring_init(rdev, 64 * 1024);
1537
1538 r = r600_pcie_gart_init(rdev);
1539 if (r)
1540 return r;
1541
1542 rdev->accel_working = true;
1543 r = cayman_startup(rdev);
1544 if (r) {
1545 dev_err(rdev->dev, "disabling GPU acceleration\n");
1546 cayman_cp_fini(rdev);
1547 r600_irq_fini(rdev);
1548 radeon_wb_fini(rdev);
1549 radeon_irq_kms_fini(rdev);
1550 cayman_pcie_gart_fini(rdev);
1551 rdev->accel_working = false;
1552 }
1553 if (rdev->accel_working) {
1554 r = radeon_ib_pool_init(rdev);
1555 if (r) {
1556 DRM_ERROR("radeon: failed initializing IB pool (%d).\n", r);
1557 rdev->accel_working = false;
1558 }
1559 r = r600_ib_test(rdev);
1560 if (r) {
1561 DRM_ERROR("radeon: failed testing IB (%d).\n", r);
1562 rdev->accel_working = false;
1563 }
1564 }
1565
1566 /* Don't start up if the MC ucode is missing.
1567 * The default clocks and voltages before the MC ucode
1568 * is loaded are not suffient for advanced operations.
1569 */
1570 if (!rdev->mc_fw) {
1571 DRM_ERROR("radeon: MC ucode required for NI+.\n");
1572 return -EINVAL;
1573 }
1574
1575 return 0;
1576}
1577
1578void cayman_fini(struct radeon_device *rdev)
1579{
1580 evergreen_blit_fini(rdev);
1581 cayman_cp_fini(rdev);
1582 r600_irq_fini(rdev);
1583 radeon_wb_fini(rdev);
1584 radeon_ib_pool_fini(rdev);
1585 radeon_irq_kms_fini(rdev);
1586 cayman_pcie_gart_fini(rdev);
1587 radeon_gem_fini(rdev);
1588 radeon_fence_driver_fini(rdev);
1589 radeon_bo_fini(rdev);
1590 radeon_atombios_fini(rdev);
1591 kfree(rdev->bios);
1592 rdev->bios = NULL;
1593}
1594
diff --git a/drivers/gpu/drm/radeon/ni_reg.h b/drivers/gpu/drm/radeon/ni_reg.h
new file mode 100644
index 000000000000..5db7b7d6feb0
--- /dev/null
+++ b/drivers/gpu/drm/radeon/ni_reg.h
@@ -0,0 +1,86 @@
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#ifndef __NI_REG_H__
25#define __NI_REG_H__
26
27/* northern islands - DCE5 */
28
29#define NI_INPUT_GAMMA_CONTROL 0x6840
30# define NI_GRPH_INPUT_GAMMA_MODE(x) (((x) & 0x3) << 0)
31# define NI_INPUT_GAMMA_USE_LUT 0
32# define NI_INPUT_GAMMA_BYPASS 1
33# define NI_INPUT_GAMMA_SRGB_24 2
34# define NI_INPUT_GAMMA_XVYCC_222 3
35# define NI_OVL_INPUT_GAMMA_MODE(x) (((x) & 0x3) << 4)
36
37#define NI_PRESCALE_GRPH_CONTROL 0x68b4
38# define NI_GRPH_PRESCALE_BYPASS (1 << 4)
39
40#define NI_PRESCALE_OVL_CONTROL 0x68c4
41# define NI_OVL_PRESCALE_BYPASS (1 << 4)
42
43#define NI_INPUT_CSC_CONTROL 0x68d4
44# define NI_INPUT_CSC_GRPH_MODE(x) (((x) & 0x3) << 0)
45# define NI_INPUT_CSC_BYPASS 0
46# define NI_INPUT_CSC_PROG_COEFF 1
47# define NI_INPUT_CSC_PROG_SHARED_MATRIXA 2
48# define NI_INPUT_CSC_OVL_MODE(x) (((x) & 0x3) << 4)
49
50#define NI_OUTPUT_CSC_CONTROL 0x68f0
51# define NI_OUTPUT_CSC_GRPH_MODE(x) (((x) & 0x7) << 0)
52# define NI_OUTPUT_CSC_BYPASS 0
53# define NI_OUTPUT_CSC_TV_RGB 1
54# define NI_OUTPUT_CSC_YCBCR_601 2
55# define NI_OUTPUT_CSC_YCBCR_709 3
56# define NI_OUTPUT_CSC_PROG_COEFF 4
57# define NI_OUTPUT_CSC_PROG_SHARED_MATRIXB 5
58# define NI_OUTPUT_CSC_OVL_MODE(x) (((x) & 0x7) << 4)
59
60#define NI_DEGAMMA_CONTROL 0x6960
61# define NI_GRPH_DEGAMMA_MODE(x) (((x) & 0x3) << 0)
62# define NI_DEGAMMA_BYPASS 0
63# define NI_DEGAMMA_SRGB_24 1
64# define NI_DEGAMMA_XVYCC_222 2
65# define NI_OVL_DEGAMMA_MODE(x) (((x) & 0x3) << 4)
66# define NI_ICON_DEGAMMA_MODE(x) (((x) & 0x3) << 8)
67# define NI_CURSOR_DEGAMMA_MODE(x) (((x) & 0x3) << 12)
68
69#define NI_GAMUT_REMAP_CONTROL 0x6964
70# define NI_GRPH_GAMUT_REMAP_MODE(x) (((x) & 0x3) << 0)
71# define NI_GAMUT_REMAP_BYPASS 0
72# define NI_GAMUT_REMAP_PROG_COEFF 1
73# define NI_GAMUT_REMAP_PROG_SHARED_MATRIXA 2
74# define NI_GAMUT_REMAP_PROG_SHARED_MATRIXB 3
75# define NI_OVL_GAMUT_REMAP_MODE(x) (((x) & 0x3) << 4)
76
77#define NI_REGAMMA_CONTROL 0x6a80
78# define NI_GRPH_REGAMMA_MODE(x) (((x) & 0x7) << 0)
79# define NI_REGAMMA_BYPASS 0
80# define NI_REGAMMA_SRGB_24 1
81# define NI_REGAMMA_XVYCC_222 2
82# define NI_REGAMMA_PROG_A 3
83# define NI_REGAMMA_PROG_B 4
84# define NI_OVL_REGAMMA_MODE(x) (((x) & 0x7) << 4)
85
86#endif
diff --git a/drivers/gpu/drm/radeon/nid.h b/drivers/gpu/drm/radeon/nid.h
new file mode 100644
index 000000000000..4672869cdb26
--- /dev/null
+++ b/drivers/gpu/drm/radeon/nid.h
@@ -0,0 +1,538 @@
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#ifndef NI_H
25#define NI_H
26
27#define CAYMAN_MAX_SH_GPRS 256
28#define CAYMAN_MAX_TEMP_GPRS 16
29#define CAYMAN_MAX_SH_THREADS 256
30#define CAYMAN_MAX_SH_STACK_ENTRIES 4096
31#define CAYMAN_MAX_FRC_EOV_CNT 16384
32#define CAYMAN_MAX_BACKENDS 8
33#define CAYMAN_MAX_BACKENDS_MASK 0xFF
34#define CAYMAN_MAX_BACKENDS_PER_SE_MASK 0xF
35#define CAYMAN_MAX_SIMDS 16
36#define CAYMAN_MAX_SIMDS_MASK 0xFFFF
37#define CAYMAN_MAX_SIMDS_PER_SE_MASK 0xFFF
38#define CAYMAN_MAX_PIPES 8
39#define CAYMAN_MAX_PIPES_MASK 0xFF
40#define CAYMAN_MAX_LDS_NUM 0xFFFF
41#define CAYMAN_MAX_TCC 16
42#define CAYMAN_MAX_TCC_MASK 0xFF
43
44#define DMIF_ADDR_CONFIG 0xBD4
45#define SRBM_STATUS 0x0E50
46
47#define VM_CONTEXT0_REQUEST_RESPONSE 0x1470
48#define REQUEST_TYPE(x) (((x) & 0xf) << 0)
49#define RESPONSE_TYPE_MASK 0x000000F0
50#define RESPONSE_TYPE_SHIFT 4
51#define VM_L2_CNTL 0x1400
52#define ENABLE_L2_CACHE (1 << 0)
53#define ENABLE_L2_FRAGMENT_PROCESSING (1 << 1)
54#define ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE (1 << 9)
55#define ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE (1 << 10)
56#define EFFECTIVE_L2_QUEUE_SIZE(x) (((x) & 7) << 14)
57#define CONTEXT1_IDENTITY_ACCESS_MODE(x) (((x) & 3) << 18)
58/* CONTEXT1_IDENTITY_ACCESS_MODE
59 * 0 physical = logical
60 * 1 logical via context1 page table
61 * 2 inside identity aperture use translation, outside physical = logical
62 * 3 inside identity aperture physical = logical, outside use translation
63 */
64#define VM_L2_CNTL2 0x1404
65#define INVALIDATE_ALL_L1_TLBS (1 << 0)
66#define INVALIDATE_L2_CACHE (1 << 1)
67#define VM_L2_CNTL3 0x1408
68#define BANK_SELECT(x) ((x) << 0)
69#define CACHE_UPDATE_MODE(x) ((x) << 6)
70#define L2_CACHE_BIGK_ASSOCIATIVITY (1 << 20)
71#define L2_CACHE_BIGK_FRAGMENT_SIZE(x) ((x) << 15)
72#define VM_L2_STATUS 0x140C
73#define L2_BUSY (1 << 0)
74#define VM_CONTEXT0_CNTL 0x1410
75#define ENABLE_CONTEXT (1 << 0)
76#define PAGE_TABLE_DEPTH(x) (((x) & 3) << 1)
77#define RANGE_PROTECTION_FAULT_ENABLE_DEFAULT (1 << 4)
78#define VM_CONTEXT1_CNTL 0x1414
79#define VM_CONTEXT0_CNTL2 0x1430
80#define VM_CONTEXT1_CNTL2 0x1434
81#define VM_INVALIDATE_REQUEST 0x1478
82#define VM_INVALIDATE_RESPONSE 0x147c
83#define VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR 0x1518
84#define VM_CONTEXT1_PROTECTION_FAULT_DEFAULT_ADDR 0x151c
85#define VM_CONTEXT0_PAGE_TABLE_BASE_ADDR 0x153C
86#define VM_CONTEXT0_PAGE_TABLE_START_ADDR 0x155C
87#define VM_CONTEXT0_PAGE_TABLE_END_ADDR 0x157C
88
89#define MC_SHARED_CHMAP 0x2004
90#define NOOFCHAN_SHIFT 12
91#define NOOFCHAN_MASK 0x00003000
92#define MC_SHARED_CHREMAP 0x2008
93
94#define MC_VM_SYSTEM_APERTURE_LOW_ADDR 0x2034
95#define MC_VM_SYSTEM_APERTURE_HIGH_ADDR 0x2038
96#define MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR 0x203C
97#define MC_VM_MX_L1_TLB_CNTL 0x2064
98#define ENABLE_L1_TLB (1 << 0)
99#define ENABLE_L1_FRAGMENT_PROCESSING (1 << 1)
100#define SYSTEM_ACCESS_MODE_PA_ONLY (0 << 3)
101#define SYSTEM_ACCESS_MODE_USE_SYS_MAP (1 << 3)
102#define SYSTEM_ACCESS_MODE_IN_SYS (2 << 3)
103#define SYSTEM_ACCESS_MODE_NOT_IN_SYS (3 << 3)
104#define SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU (0 << 5)
105#define ENABLE_ADVANCED_DRIVER_MODEL (1 << 6)
106
107#define MC_SHARED_BLACKOUT_CNTL 0x20ac
108#define MC_ARB_RAMCFG 0x2760
109#define NOOFBANK_SHIFT 0
110#define NOOFBANK_MASK 0x00000003
111#define NOOFRANK_SHIFT 2
112#define NOOFRANK_MASK 0x00000004
113#define NOOFROWS_SHIFT 3
114#define NOOFROWS_MASK 0x00000038
115#define NOOFCOLS_SHIFT 6
116#define NOOFCOLS_MASK 0x000000C0
117#define CHANSIZE_SHIFT 8
118#define CHANSIZE_MASK 0x00000100
119#define BURSTLENGTH_SHIFT 9
120#define BURSTLENGTH_MASK 0x00000200
121#define CHANSIZE_OVERRIDE (1 << 11)
122#define MC_SEQ_SUP_CNTL 0x28c8
123#define RUN_MASK (1 << 0)
124#define MC_SEQ_SUP_PGM 0x28cc
125#define MC_IO_PAD_CNTL_D0 0x29d0
126#define MEM_FALL_OUT_CMD (1 << 8)
127#define MC_SEQ_MISC0 0x2a00
128#define MC_SEQ_MISC0_GDDR5_SHIFT 28
129#define MC_SEQ_MISC0_GDDR5_MASK 0xf0000000
130#define MC_SEQ_MISC0_GDDR5_VALUE 5
131#define MC_SEQ_IO_DEBUG_INDEX 0x2a44
132#define MC_SEQ_IO_DEBUG_DATA 0x2a48
133
134#define HDP_HOST_PATH_CNTL 0x2C00
135#define HDP_NONSURFACE_BASE 0x2C04
136#define HDP_NONSURFACE_INFO 0x2C08
137#define HDP_NONSURFACE_SIZE 0x2C0C
138#define HDP_ADDR_CONFIG 0x2F48
139#define HDP_MISC_CNTL 0x2F4C
140#define HDP_FLUSH_INVALIDATE_CACHE (1 << 0)
141
142#define CC_SYS_RB_BACKEND_DISABLE 0x3F88
143#define GC_USER_SYS_RB_BACKEND_DISABLE 0x3F8C
144#define CGTS_SYS_TCC_DISABLE 0x3F90
145#define CGTS_USER_SYS_TCC_DISABLE 0x3F94
146
147#define CONFIG_MEMSIZE 0x5428
148
149#define HDP_MEM_COHERENCY_FLUSH_CNTL 0x5480
150#define HDP_REG_COHERENCY_FLUSH_CNTL 0x54A0
151
152#define GRBM_CNTL 0x8000
153#define GRBM_READ_TIMEOUT(x) ((x) << 0)
154#define GRBM_STATUS 0x8010
155#define CMDFIFO_AVAIL_MASK 0x0000000F
156#define RING2_RQ_PENDING (1 << 4)
157#define SRBM_RQ_PENDING (1 << 5)
158#define RING1_RQ_PENDING (1 << 6)
159#define CF_RQ_PENDING (1 << 7)
160#define PF_RQ_PENDING (1 << 8)
161#define GDS_DMA_RQ_PENDING (1 << 9)
162#define GRBM_EE_BUSY (1 << 10)
163#define SX_CLEAN (1 << 11)
164#define DB_CLEAN (1 << 12)
165#define CB_CLEAN (1 << 13)
166#define TA_BUSY (1 << 14)
167#define GDS_BUSY (1 << 15)
168#define VGT_BUSY_NO_DMA (1 << 16)
169#define VGT_BUSY (1 << 17)
170#define IA_BUSY_NO_DMA (1 << 18)
171#define IA_BUSY (1 << 19)
172#define SX_BUSY (1 << 20)
173#define SH_BUSY (1 << 21)
174#define SPI_BUSY (1 << 22)
175#define SC_BUSY (1 << 24)
176#define PA_BUSY (1 << 25)
177#define DB_BUSY (1 << 26)
178#define CP_COHERENCY_BUSY (1 << 28)
179#define CP_BUSY (1 << 29)
180#define CB_BUSY (1 << 30)
181#define GUI_ACTIVE (1 << 31)
182#define GRBM_STATUS_SE0 0x8014
183#define GRBM_STATUS_SE1 0x8018
184#define SE_SX_CLEAN (1 << 0)
185#define SE_DB_CLEAN (1 << 1)
186#define SE_CB_CLEAN (1 << 2)
187#define SE_VGT_BUSY (1 << 23)
188#define SE_PA_BUSY (1 << 24)
189#define SE_TA_BUSY (1 << 25)
190#define SE_SX_BUSY (1 << 26)
191#define SE_SPI_BUSY (1 << 27)
192#define SE_SH_BUSY (1 << 28)
193#define SE_SC_BUSY (1 << 29)
194#define SE_DB_BUSY (1 << 30)
195#define SE_CB_BUSY (1 << 31)
196#define GRBM_SOFT_RESET 0x8020
197#define SOFT_RESET_CP (1 << 0)
198#define SOFT_RESET_CB (1 << 1)
199#define SOFT_RESET_DB (1 << 3)
200#define SOFT_RESET_GDS (1 << 4)
201#define SOFT_RESET_PA (1 << 5)
202#define SOFT_RESET_SC (1 << 6)
203#define SOFT_RESET_SPI (1 << 8)
204#define SOFT_RESET_SH (1 << 9)
205#define SOFT_RESET_SX (1 << 10)
206#define SOFT_RESET_TC (1 << 11)
207#define SOFT_RESET_TA (1 << 12)
208#define SOFT_RESET_VGT (1 << 14)
209#define SOFT_RESET_IA (1 << 15)
210
211#define SCRATCH_REG0 0x8500
212#define SCRATCH_REG1 0x8504
213#define SCRATCH_REG2 0x8508
214#define SCRATCH_REG3 0x850C
215#define SCRATCH_REG4 0x8510
216#define SCRATCH_REG5 0x8514
217#define SCRATCH_REG6 0x8518
218#define SCRATCH_REG7 0x851C
219#define SCRATCH_UMSK 0x8540
220#define SCRATCH_ADDR 0x8544
221#define CP_SEM_WAIT_TIMER 0x85BC
222#define CP_ME_CNTL 0x86D8
223#define CP_ME_HALT (1 << 28)
224#define CP_PFP_HALT (1 << 26)
225#define CP_RB2_RPTR 0x86f8
226#define CP_RB1_RPTR 0x86fc
227#define CP_RB0_RPTR 0x8700
228#define CP_RB_WPTR_DELAY 0x8704
229#define CP_MEQ_THRESHOLDS 0x8764
230#define MEQ1_START(x) ((x) << 0)
231#define MEQ2_START(x) ((x) << 8)
232#define CP_PERFMON_CNTL 0x87FC
233
234#define VGT_CACHE_INVALIDATION 0x88C4
235#define CACHE_INVALIDATION(x) ((x) << 0)
236#define VC_ONLY 0
237#define TC_ONLY 1
238#define VC_AND_TC 2
239#define AUTO_INVLD_EN(x) ((x) << 6)
240#define NO_AUTO 0
241#define ES_AUTO 1
242#define GS_AUTO 2
243#define ES_AND_GS_AUTO 3
244#define VGT_GS_VERTEX_REUSE 0x88D4
245
246#define CC_GC_SHADER_PIPE_CONFIG 0x8950
247#define GC_USER_SHADER_PIPE_CONFIG 0x8954
248#define INACTIVE_QD_PIPES(x) ((x) << 8)
249#define INACTIVE_QD_PIPES_MASK 0x0000FF00
250#define INACTIVE_QD_PIPES_SHIFT 8
251#define INACTIVE_SIMDS(x) ((x) << 16)
252#define INACTIVE_SIMDS_MASK 0xFFFF0000
253#define INACTIVE_SIMDS_SHIFT 16
254
255#define VGT_PRIMITIVE_TYPE 0x8958
256#define VGT_NUM_INSTANCES 0x8974
257#define VGT_TF_RING_SIZE 0x8988
258#define VGT_OFFCHIP_LDS_BASE 0x89b4
259
260#define PA_SC_LINE_STIPPLE_STATE 0x8B10
261#define PA_CL_ENHANCE 0x8A14
262#define CLIP_VTX_REORDER_ENA (1 << 0)
263#define NUM_CLIP_SEQ(x) ((x) << 1)
264#define PA_SC_FIFO_SIZE 0x8BCC
265#define SC_PRIM_FIFO_SIZE(x) ((x) << 0)
266#define SC_HIZ_TILE_FIFO_SIZE(x) ((x) << 12)
267#define SC_EARLYZ_TILE_FIFO_SIZE(x) ((x) << 20)
268#define PA_SC_FORCE_EOV_MAX_CNTS 0x8B24
269#define FORCE_EOV_MAX_CLK_CNT(x) ((x) << 0)
270#define FORCE_EOV_MAX_REZ_CNT(x) ((x) << 16)
271
272#define SQ_CONFIG 0x8C00
273#define VC_ENABLE (1 << 0)
274#define EXPORT_SRC_C (1 << 1)
275#define GFX_PRIO(x) ((x) << 2)
276#define CS1_PRIO(x) ((x) << 4)
277#define CS2_PRIO(x) ((x) << 6)
278#define SQ_GPR_RESOURCE_MGMT_1 0x8C04
279#define NUM_PS_GPRS(x) ((x) << 0)
280#define NUM_VS_GPRS(x) ((x) << 16)
281#define NUM_CLAUSE_TEMP_GPRS(x) ((x) << 28)
282#define SQ_ESGS_RING_SIZE 0x8c44
283#define SQ_GSVS_RING_SIZE 0x8c4c
284#define SQ_ESTMP_RING_BASE 0x8c50
285#define SQ_ESTMP_RING_SIZE 0x8c54
286#define SQ_GSTMP_RING_BASE 0x8c58
287#define SQ_GSTMP_RING_SIZE 0x8c5c
288#define SQ_VSTMP_RING_BASE 0x8c60
289#define SQ_VSTMP_RING_SIZE 0x8c64
290#define SQ_PSTMP_RING_BASE 0x8c68
291#define SQ_PSTMP_RING_SIZE 0x8c6c
292#define SQ_MS_FIFO_SIZES 0x8CF0
293#define CACHE_FIFO_SIZE(x) ((x) << 0)
294#define FETCH_FIFO_HIWATER(x) ((x) << 8)
295#define DONE_FIFO_HIWATER(x) ((x) << 16)
296#define ALU_UPDATE_FIFO_HIWATER(x) ((x) << 24)
297#define SQ_LSTMP_RING_BASE 0x8e10
298#define SQ_LSTMP_RING_SIZE 0x8e14
299#define SQ_HSTMP_RING_BASE 0x8e18
300#define SQ_HSTMP_RING_SIZE 0x8e1c
301#define SQ_DYN_GPR_CNTL_PS_FLUSH_REQ 0x8D8C
302#define DYN_GPR_ENABLE (1 << 8)
303#define SQ_CONST_MEM_BASE 0x8df8
304
305#define SX_EXPORT_BUFFER_SIZES 0x900C
306#define COLOR_BUFFER_SIZE(x) ((x) << 0)
307#define POSITION_BUFFER_SIZE(x) ((x) << 8)
308#define SMX_BUFFER_SIZE(x) ((x) << 16)
309#define SX_DEBUG_1 0x9058
310#define ENABLE_NEW_SMX_ADDRESS (1 << 16)
311
312#define SPI_CONFIG_CNTL 0x9100
313#define GPR_WRITE_PRIORITY(x) ((x) << 0)
314#define SPI_CONFIG_CNTL_1 0x913C
315#define VTX_DONE_DELAY(x) ((x) << 0)
316#define INTERP_ONE_PRIM_PER_ROW (1 << 4)
317#define CRC_SIMD_ID_WADDR_DISABLE (1 << 8)
318
319#define CGTS_TCC_DISABLE 0x9148
320#define CGTS_USER_TCC_DISABLE 0x914C
321#define TCC_DISABLE_MASK 0xFFFF0000
322#define TCC_DISABLE_SHIFT 16
323#define CGTS_SM_CTRL_REG 0x9150
324#define OVERRIDE (1 << 21)
325
326#define TA_CNTL_AUX 0x9508
327#define DISABLE_CUBE_WRAP (1 << 0)
328#define DISABLE_CUBE_ANISO (1 << 1)
329
330#define TCP_CHAN_STEER_LO 0x960c
331#define TCP_CHAN_STEER_HI 0x9610
332
333#define CC_RB_BACKEND_DISABLE 0x98F4
334#define BACKEND_DISABLE(x) ((x) << 16)
335#define GB_ADDR_CONFIG 0x98F8
336#define NUM_PIPES(x) ((x) << 0)
337#define NUM_PIPES_MASK 0x00000007
338#define NUM_PIPES_SHIFT 0
339#define PIPE_INTERLEAVE_SIZE(x) ((x) << 4)
340#define PIPE_INTERLEAVE_SIZE_MASK 0x00000070
341#define PIPE_INTERLEAVE_SIZE_SHIFT 4
342#define BANK_INTERLEAVE_SIZE(x) ((x) << 8)
343#define NUM_SHADER_ENGINES(x) ((x) << 12)
344#define NUM_SHADER_ENGINES_MASK 0x00003000
345#define NUM_SHADER_ENGINES_SHIFT 12
346#define SHADER_ENGINE_TILE_SIZE(x) ((x) << 16)
347#define SHADER_ENGINE_TILE_SIZE_MASK 0x00070000
348#define SHADER_ENGINE_TILE_SIZE_SHIFT 16
349#define NUM_GPUS(x) ((x) << 20)
350#define NUM_GPUS_MASK 0x00700000
351#define NUM_GPUS_SHIFT 20
352#define MULTI_GPU_TILE_SIZE(x) ((x) << 24)
353#define MULTI_GPU_TILE_SIZE_MASK 0x03000000
354#define MULTI_GPU_TILE_SIZE_SHIFT 24
355#define ROW_SIZE(x) ((x) << 28)
356#define ROW_SIZE_MASK 0x30000000
357#define ROW_SIZE_SHIFT 28
358#define NUM_LOWER_PIPES(x) ((x) << 30)
359#define NUM_LOWER_PIPES_MASK 0x40000000
360#define NUM_LOWER_PIPES_SHIFT 30
361#define GB_BACKEND_MAP 0x98FC
362
363#define CB_PERF_CTR0_SEL_0 0x9A20
364#define CB_PERF_CTR0_SEL_1 0x9A24
365#define CB_PERF_CTR1_SEL_0 0x9A28
366#define CB_PERF_CTR1_SEL_1 0x9A2C
367#define CB_PERF_CTR2_SEL_0 0x9A30
368#define CB_PERF_CTR2_SEL_1 0x9A34
369#define CB_PERF_CTR3_SEL_0 0x9A38
370#define CB_PERF_CTR3_SEL_1 0x9A3C
371
372#define GC_USER_RB_BACKEND_DISABLE 0x9B7C
373#define BACKEND_DISABLE_MASK 0x00FF0000
374#define BACKEND_DISABLE_SHIFT 16
375
376#define SMX_DC_CTL0 0xA020
377#define USE_HASH_FUNCTION (1 << 0)
378#define NUMBER_OF_SETS(x) ((x) << 1)
379#define FLUSH_ALL_ON_EVENT (1 << 10)
380#define STALL_ON_EVENT (1 << 11)
381#define SMX_EVENT_CTL 0xA02C
382#define ES_FLUSH_CTL(x) ((x) << 0)
383#define GS_FLUSH_CTL(x) ((x) << 3)
384#define ACK_FLUSH_CTL(x) ((x) << 6)
385#define SYNC_FLUSH_CTL (1 << 8)
386
387#define CP_RB0_BASE 0xC100
388#define CP_RB0_CNTL 0xC104
389#define RB_BUFSZ(x) ((x) << 0)
390#define RB_BLKSZ(x) ((x) << 8)
391#define RB_NO_UPDATE (1 << 27)
392#define RB_RPTR_WR_ENA (1 << 31)
393#define BUF_SWAP_32BIT (2 << 16)
394#define CP_RB0_RPTR_ADDR 0xC10C
395#define CP_RB0_RPTR_ADDR_HI 0xC110
396#define CP_RB0_WPTR 0xC114
397#define CP_RB1_BASE 0xC180
398#define CP_RB1_CNTL 0xC184
399#define CP_RB1_RPTR_ADDR 0xC188
400#define CP_RB1_RPTR_ADDR_HI 0xC18C
401#define CP_RB1_WPTR 0xC190
402#define CP_RB2_BASE 0xC194
403#define CP_RB2_CNTL 0xC198
404#define CP_RB2_RPTR_ADDR 0xC19C
405#define CP_RB2_RPTR_ADDR_HI 0xC1A0
406#define CP_RB2_WPTR 0xC1A4
407#define CP_PFP_UCODE_ADDR 0xC150
408#define CP_PFP_UCODE_DATA 0xC154
409#define CP_ME_RAM_RADDR 0xC158
410#define CP_ME_RAM_WADDR 0xC15C
411#define CP_ME_RAM_DATA 0xC160
412#define CP_DEBUG 0xC1FC
413
414/*
415 * PM4
416 */
417#define PACKET_TYPE0 0
418#define PACKET_TYPE1 1
419#define PACKET_TYPE2 2
420#define PACKET_TYPE3 3
421
422#define CP_PACKET_GET_TYPE(h) (((h) >> 30) & 3)
423#define CP_PACKET_GET_COUNT(h) (((h) >> 16) & 0x3FFF)
424#define CP_PACKET0_GET_REG(h) (((h) & 0xFFFF) << 2)
425#define CP_PACKET3_GET_OPCODE(h) (((h) >> 8) & 0xFF)
426#define PACKET0(reg, n) ((PACKET_TYPE0 << 30) | \
427 (((reg) >> 2) & 0xFFFF) | \
428 ((n) & 0x3FFF) << 16)
429#define CP_PACKET2 0x80000000
430#define PACKET2_PAD_SHIFT 0
431#define PACKET2_PAD_MASK (0x3fffffff << 0)
432
433#define PACKET2(v) (CP_PACKET2 | REG_SET(PACKET2_PAD, (v)))
434
435#define PACKET3(op, n) ((PACKET_TYPE3 << 30) | \
436 (((op) & 0xFF) << 8) | \
437 ((n) & 0x3FFF) << 16)
438
439/* Packet 3 types */
440#define PACKET3_NOP 0x10
441#define PACKET3_SET_BASE 0x11
442#define PACKET3_CLEAR_STATE 0x12
443#define PACKET3_INDEX_BUFFER_SIZE 0x13
444#define PACKET3_DEALLOC_STATE 0x14
445#define PACKET3_DISPATCH_DIRECT 0x15
446#define PACKET3_DISPATCH_INDIRECT 0x16
447#define PACKET3_INDIRECT_BUFFER_END 0x17
448#define PACKET3_SET_PREDICATION 0x20
449#define PACKET3_REG_RMW 0x21
450#define PACKET3_COND_EXEC 0x22
451#define PACKET3_PRED_EXEC 0x23
452#define PACKET3_DRAW_INDIRECT 0x24
453#define PACKET3_DRAW_INDEX_INDIRECT 0x25
454#define PACKET3_INDEX_BASE 0x26
455#define PACKET3_DRAW_INDEX_2 0x27
456#define PACKET3_CONTEXT_CONTROL 0x28
457#define PACKET3_DRAW_INDEX_OFFSET 0x29
458#define PACKET3_INDEX_TYPE 0x2A
459#define PACKET3_DRAW_INDEX 0x2B
460#define PACKET3_DRAW_INDEX_AUTO 0x2D
461#define PACKET3_DRAW_INDEX_IMMD 0x2E
462#define PACKET3_NUM_INSTANCES 0x2F
463#define PACKET3_DRAW_INDEX_MULTI_AUTO 0x30
464#define PACKET3_INDIRECT_BUFFER 0x32
465#define PACKET3_STRMOUT_BUFFER_UPDATE 0x34
466#define PACKET3_DRAW_INDEX_OFFSET_2 0x35
467#define PACKET3_DRAW_INDEX_MULTI_ELEMENT 0x36
468#define PACKET3_WRITE_DATA 0x37
469#define PACKET3_MEM_SEMAPHORE 0x39
470#define PACKET3_MPEG_INDEX 0x3A
471#define PACKET3_WAIT_REG_MEM 0x3C
472#define PACKET3_MEM_WRITE 0x3D
473#define PACKET3_SURFACE_SYNC 0x43
474# define PACKET3_CB0_DEST_BASE_ENA (1 << 6)
475# define PACKET3_CB1_DEST_BASE_ENA (1 << 7)
476# define PACKET3_CB2_DEST_BASE_ENA (1 << 8)
477# define PACKET3_CB3_DEST_BASE_ENA (1 << 9)
478# define PACKET3_CB4_DEST_BASE_ENA (1 << 10)
479# define PACKET3_CB5_DEST_BASE_ENA (1 << 11)
480# define PACKET3_CB6_DEST_BASE_ENA (1 << 12)
481# define PACKET3_CB7_DEST_BASE_ENA (1 << 13)
482# define PACKET3_DB_DEST_BASE_ENA (1 << 14)
483# define PACKET3_CB8_DEST_BASE_ENA (1 << 15)
484# define PACKET3_CB9_DEST_BASE_ENA (1 << 16)
485# define PACKET3_CB10_DEST_BASE_ENA (1 << 17)
486# define PACKET3_CB11_DEST_BASE_ENA (1 << 18)
487# define PACKET3_FULL_CACHE_ENA (1 << 20)
488# define PACKET3_TC_ACTION_ENA (1 << 23)
489# define PACKET3_CB_ACTION_ENA (1 << 25)
490# define PACKET3_DB_ACTION_ENA (1 << 26)
491# define PACKET3_SH_ACTION_ENA (1 << 27)
492# define PACKET3_SX_ACTION_ENA (1 << 28)
493#define PACKET3_ME_INITIALIZE 0x44
494#define PACKET3_ME_INITIALIZE_DEVICE_ID(x) ((x) << 16)
495#define PACKET3_COND_WRITE 0x45
496#define PACKET3_EVENT_WRITE 0x46
497#define PACKET3_EVENT_WRITE_EOP 0x47
498#define PACKET3_EVENT_WRITE_EOS 0x48
499#define PACKET3_PREAMBLE_CNTL 0x4A
500# define PACKET3_PREAMBLE_BEGIN_CLEAR_STATE (2 << 28)
501# define PACKET3_PREAMBLE_END_CLEAR_STATE (3 << 28)
502#define PACKET3_ALU_PS_CONST_BUFFER_COPY 0x4C
503#define PACKET3_ALU_VS_CONST_BUFFER_COPY 0x4D
504#define PACKET3_ALU_PS_CONST_UPDATE 0x4E
505#define PACKET3_ALU_VS_CONST_UPDATE 0x4F
506#define PACKET3_ONE_REG_WRITE 0x57
507#define PACKET3_SET_CONFIG_REG 0x68
508#define PACKET3_SET_CONFIG_REG_START 0x00008000
509#define PACKET3_SET_CONFIG_REG_END 0x0000ac00
510#define PACKET3_SET_CONTEXT_REG 0x69
511#define PACKET3_SET_CONTEXT_REG_START 0x00028000
512#define PACKET3_SET_CONTEXT_REG_END 0x00029000
513#define PACKET3_SET_ALU_CONST 0x6A
514/* alu const buffers only; no reg file */
515#define PACKET3_SET_BOOL_CONST 0x6B
516#define PACKET3_SET_BOOL_CONST_START 0x0003a500
517#define PACKET3_SET_BOOL_CONST_END 0x0003a518
518#define PACKET3_SET_LOOP_CONST 0x6C
519#define PACKET3_SET_LOOP_CONST_START 0x0003a200
520#define PACKET3_SET_LOOP_CONST_END 0x0003a500
521#define PACKET3_SET_RESOURCE 0x6D
522#define PACKET3_SET_RESOURCE_START 0x00030000
523#define PACKET3_SET_RESOURCE_END 0x00038000
524#define PACKET3_SET_SAMPLER 0x6E
525#define PACKET3_SET_SAMPLER_START 0x0003c000
526#define PACKET3_SET_SAMPLER_END 0x0003c600
527#define PACKET3_SET_CTL_CONST 0x6F
528#define PACKET3_SET_CTL_CONST_START 0x0003cff0
529#define PACKET3_SET_CTL_CONST_END 0x0003ff0c
530#define PACKET3_SET_RESOURCE_OFFSET 0x70
531#define PACKET3_SET_ALU_CONST_VS 0x71
532#define PACKET3_SET_ALU_CONST_DI 0x72
533#define PACKET3_SET_CONTEXT_REG_INDIRECT 0x73
534#define PACKET3_SET_RESOURCE_INDIRECT 0x74
535#define PACKET3_SET_APPEND_CNT 0x75
536
537#endif
538
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c
index e59422320bb6..f2204cb1ccdf 100644
--- a/drivers/gpu/drm/radeon/r100.c
+++ b/drivers/gpu/drm/radeon/r100.c
@@ -68,6 +68,39 @@ MODULE_FIRMWARE(FIRMWARE_R520);
68 * r100,rv100,rs100,rv200,rs200,r200,rv250,rs300,rv280 68 * r100,rv100,rs100,rv200,rs200,r200,rv250,rs300,rv280
69 */ 69 */
70 70
71void r100_pre_page_flip(struct radeon_device *rdev, int crtc)
72{
73 /* enable the pflip int */
74 radeon_irq_kms_pflip_irq_get(rdev, crtc);
75}
76
77void r100_post_page_flip(struct radeon_device *rdev, int crtc)
78{
79 /* disable the pflip int */
80 radeon_irq_kms_pflip_irq_put(rdev, crtc);
81}
82
83u32 r100_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base)
84{
85 struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id];
86 u32 tmp = ((u32)crtc_base) | RADEON_CRTC_OFFSET__OFFSET_LOCK;
87
88 /* Lock the graphics update lock */
89 /* update the scanout addresses */
90 WREG32(RADEON_CRTC_OFFSET + radeon_crtc->crtc_offset, tmp);
91
92 /* Wait for update_pending to go high. */
93 while (!(RREG32(RADEON_CRTC_OFFSET + radeon_crtc->crtc_offset) & RADEON_CRTC_OFFSET__GUI_TRIG_OFFSET));
94 DRM_DEBUG("Update pending now high. Unlocking vupdate_lock.\n");
95
96 /* Unlock the lock, so double-buffering can take place inside vblank */
97 tmp &= ~RADEON_CRTC_OFFSET__OFFSET_LOCK;
98 WREG32(RADEON_CRTC_OFFSET + radeon_crtc->crtc_offset, tmp);
99
100 /* Return current update_pending status: */
101 return RREG32(RADEON_CRTC_OFFSET + radeon_crtc->crtc_offset) & RADEON_CRTC_OFFSET__GUI_TRIG_OFFSET;
102}
103
71void r100_pm_get_dynpm_state(struct radeon_device *rdev) 104void r100_pm_get_dynpm_state(struct radeon_device *rdev)
72{ 105{
73 int i; 106 int i;
@@ -442,7 +475,7 @@ int r100_pci_gart_init(struct radeon_device *rdev)
442 int r; 475 int r;
443 476
444 if (rdev->gart.table.ram.ptr) { 477 if (rdev->gart.table.ram.ptr) {
445 WARN(1, "R100 PCI GART already initialized.\n"); 478 WARN(1, "R100 PCI GART already initialized\n");
446 return 0; 479 return 0;
447 } 480 }
448 /* Initialize common gart structure */ 481 /* Initialize common gart structure */
@@ -516,7 +549,7 @@ int r100_irq_set(struct radeon_device *rdev)
516 uint32_t tmp = 0; 549 uint32_t tmp = 0;
517 550
518 if (!rdev->irq.installed) { 551 if (!rdev->irq.installed) {
519 WARN(1, "Can't enable IRQ/MSI because no handler is installed.\n"); 552 WARN(1, "Can't enable IRQ/MSI because no handler is installed\n");
520 WREG32(R_000040_GEN_INT_CNTL, 0); 553 WREG32(R_000040_GEN_INT_CNTL, 0);
521 return -EINVAL; 554 return -EINVAL;
522 } 555 }
@@ -526,10 +559,12 @@ int r100_irq_set(struct radeon_device *rdev)
526 if (rdev->irq.gui_idle) { 559 if (rdev->irq.gui_idle) {
527 tmp |= RADEON_GUI_IDLE_MASK; 560 tmp |= RADEON_GUI_IDLE_MASK;
528 } 561 }
529 if (rdev->irq.crtc_vblank_int[0]) { 562 if (rdev->irq.crtc_vblank_int[0] ||
563 rdev->irq.pflip[0]) {
530 tmp |= RADEON_CRTC_VBLANK_MASK; 564 tmp |= RADEON_CRTC_VBLANK_MASK;
531 } 565 }
532 if (rdev->irq.crtc_vblank_int[1]) { 566 if (rdev->irq.crtc_vblank_int[1] ||
567 rdev->irq.pflip[1]) {
533 tmp |= RADEON_CRTC2_VBLANK_MASK; 568 tmp |= RADEON_CRTC2_VBLANK_MASK;
534 } 569 }
535 if (rdev->irq.hpd[0]) { 570 if (rdev->irq.hpd[0]) {
@@ -600,14 +635,22 @@ int r100_irq_process(struct radeon_device *rdev)
600 } 635 }
601 /* Vertical blank interrupts */ 636 /* Vertical blank interrupts */
602 if (status & RADEON_CRTC_VBLANK_STAT) { 637 if (status & RADEON_CRTC_VBLANK_STAT) {
603 drm_handle_vblank(rdev->ddev, 0); 638 if (rdev->irq.crtc_vblank_int[0]) {
604 rdev->pm.vblank_sync = true; 639 drm_handle_vblank(rdev->ddev, 0);
605 wake_up(&rdev->irq.vblank_queue); 640 rdev->pm.vblank_sync = true;
641 wake_up(&rdev->irq.vblank_queue);
642 }
643 if (rdev->irq.pflip[0])
644 radeon_crtc_handle_flip(rdev, 0);
606 } 645 }
607 if (status & RADEON_CRTC2_VBLANK_STAT) { 646 if (status & RADEON_CRTC2_VBLANK_STAT) {
608 drm_handle_vblank(rdev->ddev, 1); 647 if (rdev->irq.crtc_vblank_int[1]) {
609 rdev->pm.vblank_sync = true; 648 drm_handle_vblank(rdev->ddev, 1);
610 wake_up(&rdev->irq.vblank_queue); 649 rdev->pm.vblank_sync = true;
650 wake_up(&rdev->irq.vblank_queue);
651 }
652 if (rdev->irq.pflip[1])
653 radeon_crtc_handle_flip(rdev, 1);
611 } 654 }
612 if (status & RADEON_FP_DETECT_STAT) { 655 if (status & RADEON_FP_DETECT_STAT) {
613 queue_hotplug = true; 656 queue_hotplug = true;
@@ -622,7 +665,7 @@ int r100_irq_process(struct radeon_device *rdev)
622 /* reset gui idle ack. the status bit is broken */ 665 /* reset gui idle ack. the status bit is broken */
623 rdev->irq.gui_idle_acked = false; 666 rdev->irq.gui_idle_acked = false;
624 if (queue_hotplug) 667 if (queue_hotplug)
625 queue_work(rdev->wq, &rdev->hotplug_work); 668 schedule_work(&rdev->hotplug_work);
626 if (rdev->msi_enabled) { 669 if (rdev->msi_enabled) {
627 switch (rdev->family) { 670 switch (rdev->family) {
628 case CHIP_RS400: 671 case CHIP_RS400:
@@ -675,67 +718,6 @@ void r100_fence_ring_emit(struct radeon_device *rdev,
675 radeon_ring_write(rdev, RADEON_SW_INT_FIRE); 718 radeon_ring_write(rdev, RADEON_SW_INT_FIRE);
676} 719}
677 720
678int r100_wb_init(struct radeon_device *rdev)
679{
680 int r;
681
682 if (rdev->wb.wb_obj == NULL) {
683 r = radeon_bo_create(rdev, NULL, RADEON_GPU_PAGE_SIZE, true,
684 RADEON_GEM_DOMAIN_GTT,
685 &rdev->wb.wb_obj);
686 if (r) {
687 dev_err(rdev->dev, "(%d) create WB buffer failed\n", r);
688 return r;
689 }
690 r = radeon_bo_reserve(rdev->wb.wb_obj, false);
691 if (unlikely(r != 0))
692 return r;
693 r = radeon_bo_pin(rdev->wb.wb_obj, RADEON_GEM_DOMAIN_GTT,
694 &rdev->wb.gpu_addr);
695 if (r) {
696 dev_err(rdev->dev, "(%d) pin WB buffer failed\n", r);
697 radeon_bo_unreserve(rdev->wb.wb_obj);
698 return r;
699 }
700 r = radeon_bo_kmap(rdev->wb.wb_obj, (void **)&rdev->wb.wb);
701 radeon_bo_unreserve(rdev->wb.wb_obj);
702 if (r) {
703 dev_err(rdev->dev, "(%d) map WB buffer failed\n", r);
704 return r;
705 }
706 }
707 WREG32(R_000774_SCRATCH_ADDR, rdev->wb.gpu_addr);
708 WREG32(R_00070C_CP_RB_RPTR_ADDR,
709 S_00070C_RB_RPTR_ADDR((rdev->wb.gpu_addr + 1024) >> 2));
710 WREG32(R_000770_SCRATCH_UMSK, 0xff);
711 return 0;
712}
713
714void r100_wb_disable(struct radeon_device *rdev)
715{
716 WREG32(R_000770_SCRATCH_UMSK, 0);
717}
718
719void r100_wb_fini(struct radeon_device *rdev)
720{
721 int r;
722
723 r100_wb_disable(rdev);
724 if (rdev->wb.wb_obj) {
725 r = radeon_bo_reserve(rdev->wb.wb_obj, false);
726 if (unlikely(r != 0)) {
727 dev_err(rdev->dev, "(%d) can't finish WB\n", r);
728 return;
729 }
730 radeon_bo_kunmap(rdev->wb.wb_obj);
731 radeon_bo_unpin(rdev->wb.wb_obj);
732 radeon_bo_unreserve(rdev->wb.wb_obj);
733 radeon_bo_unref(&rdev->wb.wb_obj);
734 rdev->wb.wb = NULL;
735 rdev->wb.wb_obj = NULL;
736 }
737}
738
739int r100_copy_blit(struct radeon_device *rdev, 721int r100_copy_blit(struct radeon_device *rdev,
740 uint64_t src_offset, 722 uint64_t src_offset,
741 uint64_t dst_offset, 723 uint64_t dst_offset,
@@ -996,20 +978,32 @@ int r100_cp_init(struct radeon_device *rdev, unsigned ring_size)
996 WREG32(0x718, pre_write_timer | (pre_write_limit << 28)); 978 WREG32(0x718, pre_write_timer | (pre_write_limit << 28));
997 tmp = (REG_SET(RADEON_RB_BUFSZ, rb_bufsz) | 979 tmp = (REG_SET(RADEON_RB_BUFSZ, rb_bufsz) |
998 REG_SET(RADEON_RB_BLKSZ, rb_blksz) | 980 REG_SET(RADEON_RB_BLKSZ, rb_blksz) |
999 REG_SET(RADEON_MAX_FETCH, max_fetch) | 981 REG_SET(RADEON_MAX_FETCH, max_fetch));
1000 RADEON_RB_NO_UPDATE);
1001#ifdef __BIG_ENDIAN 982#ifdef __BIG_ENDIAN
1002 tmp |= RADEON_BUF_SWAP_32BIT; 983 tmp |= RADEON_BUF_SWAP_32BIT;
1003#endif 984#endif
1004 WREG32(RADEON_CP_RB_CNTL, tmp); 985 WREG32(RADEON_CP_RB_CNTL, tmp | RADEON_RB_NO_UPDATE);
1005 986
1006 /* Set ring address */ 987 /* Set ring address */
1007 DRM_INFO("radeon: ring at 0x%016lX\n", (unsigned long)rdev->cp.gpu_addr); 988 DRM_INFO("radeon: ring at 0x%016lX\n", (unsigned long)rdev->cp.gpu_addr);
1008 WREG32(RADEON_CP_RB_BASE, rdev->cp.gpu_addr); 989 WREG32(RADEON_CP_RB_BASE, rdev->cp.gpu_addr);
1009 /* Force read & write ptr to 0 */ 990 /* Force read & write ptr to 0 */
1010 WREG32(RADEON_CP_RB_CNTL, tmp | RADEON_RB_RPTR_WR_ENA); 991 WREG32(RADEON_CP_RB_CNTL, tmp | RADEON_RB_RPTR_WR_ENA | RADEON_RB_NO_UPDATE);
1011 WREG32(RADEON_CP_RB_RPTR_WR, 0); 992 WREG32(RADEON_CP_RB_RPTR_WR, 0);
1012 WREG32(RADEON_CP_RB_WPTR, 0); 993 WREG32(RADEON_CP_RB_WPTR, 0);
994
995 /* set the wb address whether it's enabled or not */
996 WREG32(R_00070C_CP_RB_RPTR_ADDR,
997 S_00070C_RB_RPTR_ADDR((rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) >> 2));
998 WREG32(R_000774_SCRATCH_ADDR, rdev->wb.gpu_addr + RADEON_WB_SCRATCH_OFFSET);
999
1000 if (rdev->wb.enabled)
1001 WREG32(R_000770_SCRATCH_UMSK, 0xff);
1002 else {
1003 tmp |= RADEON_RB_NO_UPDATE;
1004 WREG32(R_000770_SCRATCH_UMSK, 0);
1005 }
1006
1013 WREG32(RADEON_CP_RB_CNTL, tmp); 1007 WREG32(RADEON_CP_RB_CNTL, tmp);
1014 udelay(10); 1008 udelay(10);
1015 rdev->cp.rptr = RREG32(RADEON_CP_RB_RPTR); 1009 rdev->cp.rptr = RREG32(RADEON_CP_RB_RPTR);
@@ -1020,8 +1014,8 @@ int r100_cp_init(struct radeon_device *rdev, unsigned ring_size)
1020 WREG32(RADEON_CP_CSQ_MODE, 1014 WREG32(RADEON_CP_CSQ_MODE,
1021 REG_SET(RADEON_INDIRECT2_START, indirect2_start) | 1015 REG_SET(RADEON_INDIRECT2_START, indirect2_start) |
1022 REG_SET(RADEON_INDIRECT1_START, indirect1_start)); 1016 REG_SET(RADEON_INDIRECT1_START, indirect1_start));
1023 WREG32(0x718, 0); 1017 WREG32(RADEON_CP_RB_WPTR_DELAY, 0);
1024 WREG32(0x744, 0x00004D4D); 1018 WREG32(RADEON_CP_CSQ_MODE, 0x00004D4D);
1025 WREG32(RADEON_CP_CSQ_CNTL, RADEON_CSQ_PRIBM_INDBM); 1019 WREG32(RADEON_CP_CSQ_CNTL, RADEON_CSQ_PRIBM_INDBM);
1026 radeon_ring_start(rdev); 1020 radeon_ring_start(rdev);
1027 r = radeon_ring_test(rdev); 1021 r = radeon_ring_test(rdev);
@@ -1030,7 +1024,7 @@ int r100_cp_init(struct radeon_device *rdev, unsigned ring_size)
1030 return r; 1024 return r;
1031 } 1025 }
1032 rdev->cp.ready = true; 1026 rdev->cp.ready = true;
1033 rdev->mc.active_vram_size = rdev->mc.real_vram_size; 1027 radeon_ttm_set_active_vram_size(rdev, rdev->mc.real_vram_size);
1034 return 0; 1028 return 0;
1035} 1029}
1036 1030
@@ -1048,10 +1042,11 @@ void r100_cp_fini(struct radeon_device *rdev)
1048void r100_cp_disable(struct radeon_device *rdev) 1042void r100_cp_disable(struct radeon_device *rdev)
1049{ 1043{
1050 /* Disable ring */ 1044 /* Disable ring */
1051 rdev->mc.active_vram_size = rdev->mc.visible_vram_size; 1045 radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
1052 rdev->cp.ready = false; 1046 rdev->cp.ready = false;
1053 WREG32(RADEON_CP_CSQ_MODE, 0); 1047 WREG32(RADEON_CP_CSQ_MODE, 0);
1054 WREG32(RADEON_CP_CSQ_CNTL, 0); 1048 WREG32(RADEON_CP_CSQ_CNTL, 0);
1049 WREG32(R_000770_SCRATCH_UMSK, 0);
1055 if (r100_gui_wait_for_idle(rdev)) { 1050 if (r100_gui_wait_for_idle(rdev)) {
1056 printk(KERN_WARNING "Failed to wait GUI idle while " 1051 printk(KERN_WARNING "Failed to wait GUI idle while "
1057 "programming pipes. Bad things might happen.\n"); 1052 "programming pipes. Bad things might happen.\n");
@@ -1210,14 +1205,12 @@ int r100_cs_packet_parse_vline(struct radeon_cs_parser *p)
1210 if (waitreloc.reg != RADEON_WAIT_UNTIL || 1205 if (waitreloc.reg != RADEON_WAIT_UNTIL ||
1211 waitreloc.count != 0) { 1206 waitreloc.count != 0) {
1212 DRM_ERROR("vline wait had illegal wait until segment\n"); 1207 DRM_ERROR("vline wait had illegal wait until segment\n");
1213 r = -EINVAL; 1208 return -EINVAL;
1214 return r;
1215 } 1209 }
1216 1210
1217 if (radeon_get_ib_value(p, waitreloc.idx + 1) != RADEON_WAIT_CRTC_VLINE) { 1211 if (radeon_get_ib_value(p, waitreloc.idx + 1) != RADEON_WAIT_CRTC_VLINE) {
1218 DRM_ERROR("vline wait had illegal wait until\n"); 1212 DRM_ERROR("vline wait had illegal wait until\n");
1219 r = -EINVAL; 1213 return -EINVAL;
1220 return r;
1221 } 1214 }
1222 1215
1223 /* jump over the NOP */ 1216 /* jump over the NOP */
@@ -1235,8 +1228,7 @@ int r100_cs_packet_parse_vline(struct radeon_cs_parser *p)
1235 obj = drm_mode_object_find(p->rdev->ddev, crtc_id, DRM_MODE_OBJECT_CRTC); 1228 obj = drm_mode_object_find(p->rdev->ddev, crtc_id, DRM_MODE_OBJECT_CRTC);
1236 if (!obj) { 1229 if (!obj) {
1237 DRM_ERROR("cannot find crtc %d\n", crtc_id); 1230 DRM_ERROR("cannot find crtc %d\n", crtc_id);
1238 r = -EINVAL; 1231 return -EINVAL;
1239 goto out;
1240 } 1232 }
1241 crtc = obj_to_crtc(obj); 1233 crtc = obj_to_crtc(obj);
1242 radeon_crtc = to_radeon_crtc(crtc); 1234 radeon_crtc = to_radeon_crtc(crtc);
@@ -1258,14 +1250,13 @@ int r100_cs_packet_parse_vline(struct radeon_cs_parser *p)
1258 break; 1250 break;
1259 default: 1251 default:
1260 DRM_ERROR("unknown crtc reloc\n"); 1252 DRM_ERROR("unknown crtc reloc\n");
1261 r = -EINVAL; 1253 return -EINVAL;
1262 goto out;
1263 } 1254 }
1264 ib[h_idx] = header; 1255 ib[h_idx] = header;
1265 ib[h_idx + 3] |= RADEON_ENG_DISPLAY_SELECT_CRTC1; 1256 ib[h_idx + 3] |= RADEON_ENG_DISPLAY_SELECT_CRTC1;
1266 } 1257 }
1267out: 1258
1268 return r; 1259 return 0;
1269} 1260}
1270 1261
1271/** 1262/**
@@ -1415,6 +1406,7 @@ static int r100_packet0_check(struct radeon_cs_parser *p,
1415 } 1406 }
1416 track->zb.robj = reloc->robj; 1407 track->zb.robj = reloc->robj;
1417 track->zb.offset = idx_value; 1408 track->zb.offset = idx_value;
1409 track->zb_dirty = true;
1418 ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); 1410 ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset);
1419 break; 1411 break;
1420 case RADEON_RB3D_COLOROFFSET: 1412 case RADEON_RB3D_COLOROFFSET:
@@ -1427,6 +1419,7 @@ static int r100_packet0_check(struct radeon_cs_parser *p,
1427 } 1419 }
1428 track->cb[0].robj = reloc->robj; 1420 track->cb[0].robj = reloc->robj;
1429 track->cb[0].offset = idx_value; 1421 track->cb[0].offset = idx_value;
1422 track->cb_dirty = true;
1430 ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); 1423 ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset);
1431 break; 1424 break;
1432 case RADEON_PP_TXOFFSET_0: 1425 case RADEON_PP_TXOFFSET_0:
@@ -1442,6 +1435,7 @@ static int r100_packet0_check(struct radeon_cs_parser *p,
1442 } 1435 }
1443 ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); 1436 ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset);
1444 track->textures[i].robj = reloc->robj; 1437 track->textures[i].robj = reloc->robj;
1438 track->tex_dirty = true;
1445 break; 1439 break;
1446 case RADEON_PP_CUBIC_OFFSET_T0_0: 1440 case RADEON_PP_CUBIC_OFFSET_T0_0:
1447 case RADEON_PP_CUBIC_OFFSET_T0_1: 1441 case RADEON_PP_CUBIC_OFFSET_T0_1:
@@ -1459,6 +1453,7 @@ static int r100_packet0_check(struct radeon_cs_parser *p,
1459 track->textures[0].cube_info[i].offset = idx_value; 1453 track->textures[0].cube_info[i].offset = idx_value;
1460 ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); 1454 ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset);
1461 track->textures[0].cube_info[i].robj = reloc->robj; 1455 track->textures[0].cube_info[i].robj = reloc->robj;
1456 track->tex_dirty = true;
1462 break; 1457 break;
1463 case RADEON_PP_CUBIC_OFFSET_T1_0: 1458 case RADEON_PP_CUBIC_OFFSET_T1_0:
1464 case RADEON_PP_CUBIC_OFFSET_T1_1: 1459 case RADEON_PP_CUBIC_OFFSET_T1_1:
@@ -1476,6 +1471,7 @@ static int r100_packet0_check(struct radeon_cs_parser *p,
1476 track->textures[1].cube_info[i].offset = idx_value; 1471 track->textures[1].cube_info[i].offset = idx_value;
1477 ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); 1472 ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset);
1478 track->textures[1].cube_info[i].robj = reloc->robj; 1473 track->textures[1].cube_info[i].robj = reloc->robj;
1474 track->tex_dirty = true;
1479 break; 1475 break;
1480 case RADEON_PP_CUBIC_OFFSET_T2_0: 1476 case RADEON_PP_CUBIC_OFFSET_T2_0:
1481 case RADEON_PP_CUBIC_OFFSET_T2_1: 1477 case RADEON_PP_CUBIC_OFFSET_T2_1:
@@ -1493,9 +1489,12 @@ static int r100_packet0_check(struct radeon_cs_parser *p,
1493 track->textures[2].cube_info[i].offset = idx_value; 1489 track->textures[2].cube_info[i].offset = idx_value;
1494 ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); 1490 ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset);
1495 track->textures[2].cube_info[i].robj = reloc->robj; 1491 track->textures[2].cube_info[i].robj = reloc->robj;
1492 track->tex_dirty = true;
1496 break; 1493 break;
1497 case RADEON_RE_WIDTH_HEIGHT: 1494 case RADEON_RE_WIDTH_HEIGHT:
1498 track->maxy = ((idx_value >> 16) & 0x7FF); 1495 track->maxy = ((idx_value >> 16) & 0x7FF);
1496 track->cb_dirty = true;
1497 track->zb_dirty = true;
1499 break; 1498 break;
1500 case RADEON_RB3D_COLORPITCH: 1499 case RADEON_RB3D_COLORPITCH:
1501 r = r100_cs_packet_next_reloc(p, &reloc); 1500 r = r100_cs_packet_next_reloc(p, &reloc);
@@ -1516,9 +1515,11 @@ static int r100_packet0_check(struct radeon_cs_parser *p,
1516 ib[idx] = tmp; 1515 ib[idx] = tmp;
1517 1516
1518 track->cb[0].pitch = idx_value & RADEON_COLORPITCH_MASK; 1517 track->cb[0].pitch = idx_value & RADEON_COLORPITCH_MASK;
1518 track->cb_dirty = true;
1519 break; 1519 break;
1520 case RADEON_RB3D_DEPTHPITCH: 1520 case RADEON_RB3D_DEPTHPITCH:
1521 track->zb.pitch = idx_value & RADEON_DEPTHPITCH_MASK; 1521 track->zb.pitch = idx_value & RADEON_DEPTHPITCH_MASK;
1522 track->zb_dirty = true;
1522 break; 1523 break;
1523 case RADEON_RB3D_CNTL: 1524 case RADEON_RB3D_CNTL:
1524 switch ((idx_value >> RADEON_RB3D_COLOR_FORMAT_SHIFT) & 0x1f) { 1525 switch ((idx_value >> RADEON_RB3D_COLOR_FORMAT_SHIFT) & 0x1f) {
@@ -1543,6 +1544,8 @@ static int r100_packet0_check(struct radeon_cs_parser *p,
1543 return -EINVAL; 1544 return -EINVAL;
1544 } 1545 }
1545 track->z_enabled = !!(idx_value & RADEON_Z_ENABLE); 1546 track->z_enabled = !!(idx_value & RADEON_Z_ENABLE);
1547 track->cb_dirty = true;
1548 track->zb_dirty = true;
1546 break; 1549 break;
1547 case RADEON_RB3D_ZSTENCILCNTL: 1550 case RADEON_RB3D_ZSTENCILCNTL:
1548 switch (idx_value & 0xf) { 1551 switch (idx_value & 0xf) {
@@ -1560,6 +1563,7 @@ static int r100_packet0_check(struct radeon_cs_parser *p,
1560 default: 1563 default:
1561 break; 1564 break;
1562 } 1565 }
1566 track->zb_dirty = true;
1563 break; 1567 break;
1564 case RADEON_RB3D_ZPASS_ADDR: 1568 case RADEON_RB3D_ZPASS_ADDR:
1565 r = r100_cs_packet_next_reloc(p, &reloc); 1569 r = r100_cs_packet_next_reloc(p, &reloc);
@@ -1576,6 +1580,7 @@ static int r100_packet0_check(struct radeon_cs_parser *p,
1576 uint32_t temp = idx_value >> 4; 1580 uint32_t temp = idx_value >> 4;
1577 for (i = 0; i < track->num_texture; i++) 1581 for (i = 0; i < track->num_texture; i++)
1578 track->textures[i].enabled = !!(temp & (1 << i)); 1582 track->textures[i].enabled = !!(temp & (1 << i));
1583 track->tex_dirty = true;
1579 } 1584 }
1580 break; 1585 break;
1581 case RADEON_SE_VF_CNTL: 1586 case RADEON_SE_VF_CNTL:
@@ -1590,12 +1595,14 @@ static int r100_packet0_check(struct radeon_cs_parser *p,
1590 i = (reg - RADEON_PP_TEX_SIZE_0) / 8; 1595 i = (reg - RADEON_PP_TEX_SIZE_0) / 8;
1591 track->textures[i].width = (idx_value & RADEON_TEX_USIZE_MASK) + 1; 1596 track->textures[i].width = (idx_value & RADEON_TEX_USIZE_MASK) + 1;
1592 track->textures[i].height = ((idx_value & RADEON_TEX_VSIZE_MASK) >> RADEON_TEX_VSIZE_SHIFT) + 1; 1597 track->textures[i].height = ((idx_value & RADEON_TEX_VSIZE_MASK) >> RADEON_TEX_VSIZE_SHIFT) + 1;
1598 track->tex_dirty = true;
1593 break; 1599 break;
1594 case RADEON_PP_TEX_PITCH_0: 1600 case RADEON_PP_TEX_PITCH_0:
1595 case RADEON_PP_TEX_PITCH_1: 1601 case RADEON_PP_TEX_PITCH_1:
1596 case RADEON_PP_TEX_PITCH_2: 1602 case RADEON_PP_TEX_PITCH_2:
1597 i = (reg - RADEON_PP_TEX_PITCH_0) / 8; 1603 i = (reg - RADEON_PP_TEX_PITCH_0) / 8;
1598 track->textures[i].pitch = idx_value + 32; 1604 track->textures[i].pitch = idx_value + 32;
1605 track->tex_dirty = true;
1599 break; 1606 break;
1600 case RADEON_PP_TXFILTER_0: 1607 case RADEON_PP_TXFILTER_0:
1601 case RADEON_PP_TXFILTER_1: 1608 case RADEON_PP_TXFILTER_1:
@@ -1609,6 +1616,7 @@ static int r100_packet0_check(struct radeon_cs_parser *p,
1609 tmp = (idx_value >> 27) & 0x7; 1616 tmp = (idx_value >> 27) & 0x7;
1610 if (tmp == 2 || tmp == 6) 1617 if (tmp == 2 || tmp == 6)
1611 track->textures[i].roundup_h = false; 1618 track->textures[i].roundup_h = false;
1619 track->tex_dirty = true;
1612 break; 1620 break;
1613 case RADEON_PP_TXFORMAT_0: 1621 case RADEON_PP_TXFORMAT_0:
1614 case RADEON_PP_TXFORMAT_1: 1622 case RADEON_PP_TXFORMAT_1:
@@ -1661,6 +1669,7 @@ static int r100_packet0_check(struct radeon_cs_parser *p,
1661 } 1669 }
1662 track->textures[i].cube_info[4].width = 1 << ((idx_value >> 16) & 0xf); 1670 track->textures[i].cube_info[4].width = 1 << ((idx_value >> 16) & 0xf);
1663 track->textures[i].cube_info[4].height = 1 << ((idx_value >> 20) & 0xf); 1671 track->textures[i].cube_info[4].height = 1 << ((idx_value >> 20) & 0xf);
1672 track->tex_dirty = true;
1664 break; 1673 break;
1665 case RADEON_PP_CUBIC_FACES_0: 1674 case RADEON_PP_CUBIC_FACES_0:
1666 case RADEON_PP_CUBIC_FACES_1: 1675 case RADEON_PP_CUBIC_FACES_1:
@@ -1671,6 +1680,7 @@ static int r100_packet0_check(struct radeon_cs_parser *p,
1671 track->textures[i].cube_info[face].width = 1 << ((tmp >> (face * 8)) & 0xf); 1680 track->textures[i].cube_info[face].width = 1 << ((tmp >> (face * 8)) & 0xf);
1672 track->textures[i].cube_info[face].height = 1 << ((tmp >> ((face * 8) + 4)) & 0xf); 1681 track->textures[i].cube_info[face].height = 1 << ((tmp >> ((face * 8) + 4)) & 0xf);
1673 } 1682 }
1683 track->tex_dirty = true;
1674 break; 1684 break;
1675 default: 1685 default:
1676 printk(KERN_ERR "Forbidden register 0x%04X in cs at %d\n", 1686 printk(KERN_ERR "Forbidden register 0x%04X in cs at %d\n",
@@ -2074,12 +2084,13 @@ int r100_asic_reset(struct radeon_device *rdev)
2074{ 2084{
2075 struct r100_mc_save save; 2085 struct r100_mc_save save;
2076 u32 status, tmp; 2086 u32 status, tmp;
2087 int ret = 0;
2077 2088
2078 r100_mc_stop(rdev, &save);
2079 status = RREG32(R_000E40_RBBM_STATUS); 2089 status = RREG32(R_000E40_RBBM_STATUS);
2080 if (!G_000E40_GUI_ACTIVE(status)) { 2090 if (!G_000E40_GUI_ACTIVE(status)) {
2081 return 0; 2091 return 0;
2082 } 2092 }
2093 r100_mc_stop(rdev, &save);
2083 status = RREG32(R_000E40_RBBM_STATUS); 2094 status = RREG32(R_000E40_RBBM_STATUS);
2084 dev_info(rdev->dev, "(%s:%d) RBBM_STATUS=0x%08X\n", __func__, __LINE__, status); 2095 dev_info(rdev->dev, "(%s:%d) RBBM_STATUS=0x%08X\n", __func__, __LINE__, status);
2085 /* stop CP */ 2096 /* stop CP */
@@ -2119,11 +2130,11 @@ int r100_asic_reset(struct radeon_device *rdev)
2119 G_000E40_TAM_BUSY(status) || G_000E40_PB_BUSY(status)) { 2130 G_000E40_TAM_BUSY(status) || G_000E40_PB_BUSY(status)) {
2120 dev_err(rdev->dev, "failed to reset GPU\n"); 2131 dev_err(rdev->dev, "failed to reset GPU\n");
2121 rdev->gpu_lockup = true; 2132 rdev->gpu_lockup = true;
2122 return -1; 2133 ret = -1;
2123 } 2134 } else
2135 dev_info(rdev->dev, "GPU reset succeed\n");
2124 r100_mc_resume(rdev, &save); 2136 r100_mc_resume(rdev, &save);
2125 dev_info(rdev->dev, "GPU reset succeed\n"); 2137 return ret;
2126 return 0;
2127} 2138}
2128 2139
2129void r100_set_common_regs(struct radeon_device *rdev) 2140void r100_set_common_regs(struct radeon_device *rdev)
@@ -2297,7 +2308,6 @@ void r100_vram_init_sizes(struct radeon_device *rdev)
2297 /* FIXME we don't use the second aperture yet when we could use it */ 2308 /* FIXME we don't use the second aperture yet when we could use it */
2298 if (rdev->mc.visible_vram_size > rdev->mc.aper_size) 2309 if (rdev->mc.visible_vram_size > rdev->mc.aper_size)
2299 rdev->mc.visible_vram_size = rdev->mc.aper_size; 2310 rdev->mc.visible_vram_size = rdev->mc.aper_size;
2300 rdev->mc.active_vram_size = rdev->mc.visible_vram_size;
2301 config_aper_size = RREG32(RADEON_CONFIG_APER_SIZE); 2311 config_aper_size = RREG32(RADEON_CONFIG_APER_SIZE);
2302 if (rdev->flags & RADEON_IS_IGP) { 2312 if (rdev->flags & RADEON_IS_IGP) {
2303 uint32_t tom; 2313 uint32_t tom;
@@ -2318,6 +2328,9 @@ void r100_vram_init_sizes(struct radeon_device *rdev)
2318 /* Fix for RN50, M6, M7 with 8/16/32(??) MBs of VRAM - 2328 /* Fix for RN50, M6, M7 with 8/16/32(??) MBs of VRAM -
2319 * Novell bug 204882 + along with lots of ubuntu ones 2329 * Novell bug 204882 + along with lots of ubuntu ones
2320 */ 2330 */
2331 if (rdev->mc.aper_size > config_aper_size)
2332 config_aper_size = rdev->mc.aper_size;
2333
2321 if (config_aper_size > rdev->mc.real_vram_size) 2334 if (config_aper_size > rdev->mc.real_vram_size)
2322 rdev->mc.mc_vram_size = config_aper_size; 2335 rdev->mc.mc_vram_size = config_aper_size;
2323 else 2336 else
@@ -2331,10 +2344,10 @@ void r100_vga_set_state(struct radeon_device *rdev, bool state)
2331 2344
2332 temp = RREG32(RADEON_CONFIG_CNTL); 2345 temp = RREG32(RADEON_CONFIG_CNTL);
2333 if (state == false) { 2346 if (state == false) {
2334 temp &= ~(1<<8); 2347 temp &= ~RADEON_CFG_VGA_RAM_EN;
2335 temp |= (1<<9); 2348 temp |= RADEON_CFG_VGA_IO_DIS;
2336 } else { 2349 } else {
2337 temp &= ~(1<<9); 2350 temp &= ~RADEON_CFG_VGA_IO_DIS;
2338 } 2351 }
2339 WREG32(RADEON_CONFIG_CNTL, temp); 2352 WREG32(RADEON_CONFIG_CNTL, temp);
2340} 2353}
@@ -3225,6 +3238,8 @@ static int r100_cs_track_texture_check(struct radeon_device *rdev,
3225 for (u = 0; u < track->num_texture; u++) { 3238 for (u = 0; u < track->num_texture; u++) {
3226 if (!track->textures[u].enabled) 3239 if (!track->textures[u].enabled)
3227 continue; 3240 continue;
3241 if (track->textures[u].lookup_disable)
3242 continue;
3228 robj = track->textures[u].robj; 3243 robj = track->textures[u].robj;
3229 if (robj == NULL) { 3244 if (robj == NULL) {
3230 DRM_ERROR("No texture bound to unit %u\n", u); 3245 DRM_ERROR("No texture bound to unit %u\n", u);
@@ -3300,9 +3315,9 @@ int r100_cs_track_check(struct radeon_device *rdev, struct r100_cs_track *track)
3300 unsigned long size; 3315 unsigned long size;
3301 unsigned prim_walk; 3316 unsigned prim_walk;
3302 unsigned nverts; 3317 unsigned nverts;
3303 unsigned num_cb = track->num_cb; 3318 unsigned num_cb = track->cb_dirty ? track->num_cb : 0;
3304 3319
3305 if (!track->zb_cb_clear && !track->color_channel_mask && 3320 if (num_cb && !track->zb_cb_clear && !track->color_channel_mask &&
3306 !track->blend_read_enable) 3321 !track->blend_read_enable)
3307 num_cb = 0; 3322 num_cb = 0;
3308 3323
@@ -3323,7 +3338,9 @@ int r100_cs_track_check(struct radeon_device *rdev, struct r100_cs_track *track)
3323 return -EINVAL; 3338 return -EINVAL;
3324 } 3339 }
3325 } 3340 }
3326 if (track->z_enabled) { 3341 track->cb_dirty = false;
3342
3343 if (track->zb_dirty && track->z_enabled) {
3327 if (track->zb.robj == NULL) { 3344 if (track->zb.robj == NULL) {
3328 DRM_ERROR("[drm] No buffer for z buffer !\n"); 3345 DRM_ERROR("[drm] No buffer for z buffer !\n");
3329 return -EINVAL; 3346 return -EINVAL;
@@ -3340,6 +3357,28 @@ int r100_cs_track_check(struct radeon_device *rdev, struct r100_cs_track *track)
3340 return -EINVAL; 3357 return -EINVAL;
3341 } 3358 }
3342 } 3359 }
3360 track->zb_dirty = false;
3361
3362 if (track->aa_dirty && track->aaresolve) {
3363 if (track->aa.robj == NULL) {
3364 DRM_ERROR("[drm] No buffer for AA resolve buffer %d !\n", i);
3365 return -EINVAL;
3366 }
3367 /* I believe the format comes from colorbuffer0. */
3368 size = track->aa.pitch * track->cb[0].cpp * track->maxy;
3369 size += track->aa.offset;
3370 if (size > radeon_bo_size(track->aa.robj)) {
3371 DRM_ERROR("[drm] Buffer too small for AA resolve buffer %d "
3372 "(need %lu have %lu) !\n", i, size,
3373 radeon_bo_size(track->aa.robj));
3374 DRM_ERROR("[drm] AA resolve buffer %d (%u %u %u %u)\n",
3375 i, track->aa.pitch, track->cb[0].cpp,
3376 track->aa.offset, track->maxy);
3377 return -EINVAL;
3378 }
3379 }
3380 track->aa_dirty = false;
3381
3343 prim_walk = (track->vap_vf_cntl >> 4) & 0x3; 3382 prim_walk = (track->vap_vf_cntl >> 4) & 0x3;
3344 if (track->vap_vf_cntl & (1 << 14)) { 3383 if (track->vap_vf_cntl & (1 << 14)) {
3345 nverts = track->vap_alt_nverts; 3384 nverts = track->vap_alt_nverts;
@@ -3399,13 +3438,23 @@ int r100_cs_track_check(struct radeon_device *rdev, struct r100_cs_track *track)
3399 prim_walk); 3438 prim_walk);
3400 return -EINVAL; 3439 return -EINVAL;
3401 } 3440 }
3402 return r100_cs_track_texture_check(rdev, track); 3441
3442 if (track->tex_dirty) {
3443 track->tex_dirty = false;
3444 return r100_cs_track_texture_check(rdev, track);
3445 }
3446 return 0;
3403} 3447}
3404 3448
3405void r100_cs_track_clear(struct radeon_device *rdev, struct r100_cs_track *track) 3449void r100_cs_track_clear(struct radeon_device *rdev, struct r100_cs_track *track)
3406{ 3450{
3407 unsigned i, face; 3451 unsigned i, face;
3408 3452
3453 track->cb_dirty = true;
3454 track->zb_dirty = true;
3455 track->tex_dirty = true;
3456 track->aa_dirty = true;
3457
3409 if (rdev->family < CHIP_R300) { 3458 if (rdev->family < CHIP_R300) {
3410 track->num_cb = 1; 3459 track->num_cb = 1;
3411 if (rdev->family <= CHIP_RS200) 3460 if (rdev->family <= CHIP_RS200)
@@ -3419,6 +3468,8 @@ void r100_cs_track_clear(struct radeon_device *rdev, struct r100_cs_track *track
3419 track->num_texture = 16; 3468 track->num_texture = 16;
3420 track->maxy = 4096; 3469 track->maxy = 4096;
3421 track->separate_cube = 0; 3470 track->separate_cube = 0;
3471 track->aaresolve = false;
3472 track->aa.robj = NULL;
3422 } 3473 }
3423 3474
3424 for (i = 0; i < track->num_cb; i++) { 3475 for (i = 0; i < track->num_cb; i++) {
@@ -3459,6 +3510,7 @@ void r100_cs_track_clear(struct radeon_device *rdev, struct r100_cs_track *track
3459 track->textures[i].robj = NULL; 3510 track->textures[i].robj = NULL;
3460 /* CS IB emission code makes sure texture unit are disabled */ 3511 /* CS IB emission code makes sure texture unit are disabled */
3461 track->textures[i].enabled = false; 3512 track->textures[i].enabled = false;
3513 track->textures[i].lookup_disable = false;
3462 track->textures[i].roundup_w = true; 3514 track->textures[i].roundup_w = true;
3463 track->textures[i].roundup_h = true; 3515 track->textures[i].roundup_h = true;
3464 if (track->separate_cube) 3516 if (track->separate_cube)
@@ -3503,7 +3555,7 @@ int r100_ring_test(struct radeon_device *rdev)
3503 if (i < rdev->usec_timeout) { 3555 if (i < rdev->usec_timeout) {
3504 DRM_INFO("ring test succeeded in %d usecs\n", i); 3556 DRM_INFO("ring test succeeded in %d usecs\n", i);
3505 } else { 3557 } else {
3506 DRM_ERROR("radeon: ring test failed (sracth(0x%04X)=0x%08X)\n", 3558 DRM_ERROR("radeon: ring test failed (scratch(0x%04X)=0x%08X)\n",
3507 scratch, tmp); 3559 scratch, tmp);
3508 r = -EINVAL; 3560 r = -EINVAL;
3509 } 3561 }
@@ -3565,7 +3617,7 @@ int r100_ib_test(struct radeon_device *rdev)
3565 if (i < rdev->usec_timeout) { 3617 if (i < rdev->usec_timeout) {
3566 DRM_INFO("ib test succeeded in %u usecs\n", i); 3618 DRM_INFO("ib test succeeded in %u usecs\n", i);
3567 } else { 3619 } else {
3568 DRM_ERROR("radeon: ib test failed (sracth(0x%04X)=0x%08X)\n", 3620 DRM_ERROR("radeon: ib test failed (scratch(0x%04X)=0x%08X)\n",
3569 scratch, tmp); 3621 scratch, tmp);
3570 r = -EINVAL; 3622 r = -EINVAL;
3571 } 3623 }
@@ -3585,13 +3637,13 @@ int r100_ib_init(struct radeon_device *rdev)
3585 3637
3586 r = radeon_ib_pool_init(rdev); 3638 r = radeon_ib_pool_init(rdev);
3587 if (r) { 3639 if (r) {
3588 dev_err(rdev->dev, "failled initializing IB pool (%d).\n", r); 3640 dev_err(rdev->dev, "failed initializing IB pool (%d).\n", r);
3589 r100_ib_fini(rdev); 3641 r100_ib_fini(rdev);
3590 return r; 3642 return r;
3591 } 3643 }
3592 r = r100_ib_test(rdev); 3644 r = r100_ib_test(rdev);
3593 if (r) { 3645 if (r) {
3594 dev_err(rdev->dev, "failled testing IB (%d).\n", r); 3646 dev_err(rdev->dev, "failed testing IB (%d).\n", r);
3595 r100_ib_fini(rdev); 3647 r100_ib_fini(rdev);
3596 return r; 3648 return r;
3597 } 3649 }
@@ -3727,8 +3779,6 @@ static int r100_startup(struct radeon_device *rdev)
3727 r100_mc_program(rdev); 3779 r100_mc_program(rdev);
3728 /* Resume clock */ 3780 /* Resume clock */
3729 r100_clock_startup(rdev); 3781 r100_clock_startup(rdev);
3730 /* Initialize GPU configuration (# pipes, ...) */
3731// r100_gpu_init(rdev);
3732 /* Initialize GART (initialize after TTM so we can allocate 3782 /* Initialize GART (initialize after TTM so we can allocate
3733 * memory through TTM but finalize after TTM) */ 3783 * memory through TTM but finalize after TTM) */
3734 r100_enable_bm(rdev); 3784 r100_enable_bm(rdev);
@@ -3737,21 +3787,24 @@ static int r100_startup(struct radeon_device *rdev)
3737 if (r) 3787 if (r)
3738 return r; 3788 return r;
3739 } 3789 }
3790
3791 /* allocate wb buffer */
3792 r = radeon_wb_init(rdev);
3793 if (r)
3794 return r;
3795
3740 /* Enable IRQ */ 3796 /* Enable IRQ */
3741 r100_irq_set(rdev); 3797 r100_irq_set(rdev);
3742 rdev->config.r100.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); 3798 rdev->config.r100.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL);
3743 /* 1M ring buffer */ 3799 /* 1M ring buffer */
3744 r = r100_cp_init(rdev, 1024 * 1024); 3800 r = r100_cp_init(rdev, 1024 * 1024);
3745 if (r) { 3801 if (r) {
3746 dev_err(rdev->dev, "failled initializing CP (%d).\n", r); 3802 dev_err(rdev->dev, "failed initializing CP (%d).\n", r);
3747 return r; 3803 return r;
3748 } 3804 }
3749 r = r100_wb_init(rdev);
3750 if (r)
3751 dev_err(rdev->dev, "failled initializing WB (%d).\n", r);
3752 r = r100_ib_init(rdev); 3805 r = r100_ib_init(rdev);
3753 if (r) { 3806 if (r) {
3754 dev_err(rdev->dev, "failled initializing IB (%d).\n", r); 3807 dev_err(rdev->dev, "failed initializing IB (%d).\n", r);
3755 return r; 3808 return r;
3756 } 3809 }
3757 return 0; 3810 return 0;
@@ -3782,7 +3835,7 @@ int r100_resume(struct radeon_device *rdev)
3782int r100_suspend(struct radeon_device *rdev) 3835int r100_suspend(struct radeon_device *rdev)
3783{ 3836{
3784 r100_cp_disable(rdev); 3837 r100_cp_disable(rdev);
3785 r100_wb_disable(rdev); 3838 radeon_wb_disable(rdev);
3786 r100_irq_disable(rdev); 3839 r100_irq_disable(rdev);
3787 if (rdev->flags & RADEON_IS_PCI) 3840 if (rdev->flags & RADEON_IS_PCI)
3788 r100_pci_gart_disable(rdev); 3841 r100_pci_gart_disable(rdev);
@@ -3792,7 +3845,7 @@ int r100_suspend(struct radeon_device *rdev)
3792void r100_fini(struct radeon_device *rdev) 3845void r100_fini(struct radeon_device *rdev)
3793{ 3846{
3794 r100_cp_fini(rdev); 3847 r100_cp_fini(rdev);
3795 r100_wb_fini(rdev); 3848 radeon_wb_fini(rdev);
3796 r100_ib_fini(rdev); 3849 r100_ib_fini(rdev);
3797 radeon_gem_fini(rdev); 3850 radeon_gem_fini(rdev);
3798 if (rdev->flags & RADEON_IS_PCI) 3851 if (rdev->flags & RADEON_IS_PCI)
@@ -3905,7 +3958,7 @@ int r100_init(struct radeon_device *rdev)
3905 /* Somethings want wront with the accel init stop accel */ 3958 /* Somethings want wront with the accel init stop accel */
3906 dev_err(rdev->dev, "Disabling GPU acceleration\n"); 3959 dev_err(rdev->dev, "Disabling GPU acceleration\n");
3907 r100_cp_fini(rdev); 3960 r100_cp_fini(rdev);
3908 r100_wb_fini(rdev); 3961 radeon_wb_fini(rdev);
3909 r100_ib_fini(rdev); 3962 r100_ib_fini(rdev);
3910 radeon_irq_kms_fini(rdev); 3963 radeon_irq_kms_fini(rdev);
3911 if (rdev->flags & RADEON_IS_PCI) 3964 if (rdev->flags & RADEON_IS_PCI)
diff --git a/drivers/gpu/drm/radeon/r100_track.h b/drivers/gpu/drm/radeon/r100_track.h
index f47cdca1c004..686f9dc5d4bd 100644
--- a/drivers/gpu/drm/radeon/r100_track.h
+++ b/drivers/gpu/drm/radeon/r100_track.h
@@ -46,19 +46,13 @@ struct r100_cs_track_texture {
46 unsigned height_11; 46 unsigned height_11;
47 bool use_pitch; 47 bool use_pitch;
48 bool enabled; 48 bool enabled;
49 bool lookup_disable;
49 bool roundup_w; 50 bool roundup_w;
50 bool roundup_h; 51 bool roundup_h;
51 unsigned compress_format; 52 unsigned compress_format;
52}; 53};
53 54
54struct r100_cs_track_limits {
55 unsigned num_cb;
56 unsigned num_texture;
57 unsigned max_levels;
58};
59
60struct r100_cs_track { 55struct r100_cs_track {
61 struct radeon_device *rdev;
62 unsigned num_cb; 56 unsigned num_cb;
63 unsigned num_texture; 57 unsigned num_texture;
64 unsigned maxy; 58 unsigned maxy;
@@ -69,14 +63,20 @@ struct r100_cs_track {
69 unsigned num_arrays; 63 unsigned num_arrays;
70 unsigned max_indx; 64 unsigned max_indx;
71 unsigned color_channel_mask; 65 unsigned color_channel_mask;
72 struct r100_cs_track_array arrays[11]; 66 struct r100_cs_track_array arrays[16];
73 struct r100_cs_track_cb cb[R300_MAX_CB]; 67 struct r100_cs_track_cb cb[R300_MAX_CB];
74 struct r100_cs_track_cb zb; 68 struct r100_cs_track_cb zb;
69 struct r100_cs_track_cb aa;
75 struct r100_cs_track_texture textures[R300_TRACK_MAX_TEXTURE]; 70 struct r100_cs_track_texture textures[R300_TRACK_MAX_TEXTURE];
76 bool z_enabled; 71 bool z_enabled;
77 bool separate_cube; 72 bool separate_cube;
78 bool zb_cb_clear; 73 bool zb_cb_clear;
79 bool blend_read_enable; 74 bool blend_read_enable;
75 bool cb_dirty;
76 bool zb_dirty;
77 bool tex_dirty;
78 bool aa_dirty;
79 bool aaresolve;
80}; 80};
81 81
82int r100_cs_track_check(struct radeon_device *rdev, struct r100_cs_track *track); 82int r100_cs_track_check(struct radeon_device *rdev, struct r100_cs_track *track);
@@ -146,6 +146,12 @@ static inline int r100_packet3_load_vbpntr(struct radeon_cs_parser *p,
146 ib = p->ib->ptr; 146 ib = p->ib->ptr;
147 track = (struct r100_cs_track *)p->track; 147 track = (struct r100_cs_track *)p->track;
148 c = radeon_get_ib_value(p, idx++) & 0x1F; 148 c = radeon_get_ib_value(p, idx++) & 0x1F;
149 if (c > 16) {
150 DRM_ERROR("Only 16 vertex buffers are allowed %d\n",
151 pkt->opcode);
152 r100_cs_dump_packet(p, pkt);
153 return -EINVAL;
154 }
149 track->num_arrays = c; 155 track->num_arrays = c;
150 for (i = 0; i < (c - 1); i+=2, idx+=3) { 156 for (i = 0; i < (c - 1); i+=2, idx+=3) {
151 r = r100_cs_packet_next_reloc(p, &reloc); 157 r = r100_cs_packet_next_reloc(p, &reloc);
diff --git a/drivers/gpu/drm/radeon/r100d.h b/drivers/gpu/drm/radeon/r100d.h
index b121b6c678d4..eab91760fae0 100644
--- a/drivers/gpu/drm/radeon/r100d.h
+++ b/drivers/gpu/drm/radeon/r100d.h
@@ -551,7 +551,7 @@
551#define S_000360_CUR2_LOCK(x) (((x) & 0x1) << 31) 551#define S_000360_CUR2_LOCK(x) (((x) & 0x1) << 31)
552#define G_000360_CUR2_LOCK(x) (((x) >> 31) & 0x1) 552#define G_000360_CUR2_LOCK(x) (((x) >> 31) & 0x1)
553#define C_000360_CUR2_LOCK 0x7FFFFFFF 553#define C_000360_CUR2_LOCK 0x7FFFFFFF
554#define R_0003C2_GENMO_WT 0x0003C0 554#define R_0003C2_GENMO_WT 0x0003C2
555#define S_0003C2_GENMO_MONO_ADDRESS_B(x) (((x) & 0x1) << 0) 555#define S_0003C2_GENMO_MONO_ADDRESS_B(x) (((x) & 0x1) << 0)
556#define G_0003C2_GENMO_MONO_ADDRESS_B(x) (((x) >> 0) & 0x1) 556#define G_0003C2_GENMO_MONO_ADDRESS_B(x) (((x) >> 0) & 0x1)
557#define C_0003C2_GENMO_MONO_ADDRESS_B 0xFE 557#define C_0003C2_GENMO_MONO_ADDRESS_B 0xFE
diff --git a/drivers/gpu/drm/radeon/r200.c b/drivers/gpu/drm/radeon/r200.c
index 0266d72e0a4c..f24058300413 100644
--- a/drivers/gpu/drm/radeon/r200.c
+++ b/drivers/gpu/drm/radeon/r200.c
@@ -184,6 +184,7 @@ int r200_packet0_check(struct radeon_cs_parser *p,
184 } 184 }
185 track->zb.robj = reloc->robj; 185 track->zb.robj = reloc->robj;
186 track->zb.offset = idx_value; 186 track->zb.offset = idx_value;
187 track->zb_dirty = true;
187 ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); 188 ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset);
188 break; 189 break;
189 case RADEON_RB3D_COLOROFFSET: 190 case RADEON_RB3D_COLOROFFSET:
@@ -196,6 +197,7 @@ int r200_packet0_check(struct radeon_cs_parser *p,
196 } 197 }
197 track->cb[0].robj = reloc->robj; 198 track->cb[0].robj = reloc->robj;
198 track->cb[0].offset = idx_value; 199 track->cb[0].offset = idx_value;
200 track->cb_dirty = true;
199 ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); 201 ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset);
200 break; 202 break;
201 case R200_PP_TXOFFSET_0: 203 case R200_PP_TXOFFSET_0:
@@ -214,6 +216,7 @@ int r200_packet0_check(struct radeon_cs_parser *p,
214 } 216 }
215 ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); 217 ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset);
216 track->textures[i].robj = reloc->robj; 218 track->textures[i].robj = reloc->robj;
219 track->tex_dirty = true;
217 break; 220 break;
218 case R200_PP_CUBIC_OFFSET_F1_0: 221 case R200_PP_CUBIC_OFFSET_F1_0:
219 case R200_PP_CUBIC_OFFSET_F2_0: 222 case R200_PP_CUBIC_OFFSET_F2_0:
@@ -257,9 +260,12 @@ int r200_packet0_check(struct radeon_cs_parser *p,
257 track->textures[i].cube_info[face - 1].offset = idx_value; 260 track->textures[i].cube_info[face - 1].offset = idx_value;
258 ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); 261 ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset);
259 track->textures[i].cube_info[face - 1].robj = reloc->robj; 262 track->textures[i].cube_info[face - 1].robj = reloc->robj;
263 track->tex_dirty = true;
260 break; 264 break;
261 case RADEON_RE_WIDTH_HEIGHT: 265 case RADEON_RE_WIDTH_HEIGHT:
262 track->maxy = ((idx_value >> 16) & 0x7FF); 266 track->maxy = ((idx_value >> 16) & 0x7FF);
267 track->cb_dirty = true;
268 track->zb_dirty = true;
263 break; 269 break;
264 case RADEON_RB3D_COLORPITCH: 270 case RADEON_RB3D_COLORPITCH:
265 r = r100_cs_packet_next_reloc(p, &reloc); 271 r = r100_cs_packet_next_reloc(p, &reloc);
@@ -280,9 +286,11 @@ int r200_packet0_check(struct radeon_cs_parser *p,
280 ib[idx] = tmp; 286 ib[idx] = tmp;
281 287
282 track->cb[0].pitch = idx_value & RADEON_COLORPITCH_MASK; 288 track->cb[0].pitch = idx_value & RADEON_COLORPITCH_MASK;
289 track->cb_dirty = true;
283 break; 290 break;
284 case RADEON_RB3D_DEPTHPITCH: 291 case RADEON_RB3D_DEPTHPITCH:
285 track->zb.pitch = idx_value & RADEON_DEPTHPITCH_MASK; 292 track->zb.pitch = idx_value & RADEON_DEPTHPITCH_MASK;
293 track->zb_dirty = true;
286 break; 294 break;
287 case RADEON_RB3D_CNTL: 295 case RADEON_RB3D_CNTL:
288 switch ((idx_value >> RADEON_RB3D_COLOR_FORMAT_SHIFT) & 0x1f) { 296 switch ((idx_value >> RADEON_RB3D_COLOR_FORMAT_SHIFT) & 0x1f) {
@@ -312,6 +320,8 @@ int r200_packet0_check(struct radeon_cs_parser *p,
312 } 320 }
313 321
314 track->z_enabled = !!(idx_value & RADEON_Z_ENABLE); 322 track->z_enabled = !!(idx_value & RADEON_Z_ENABLE);
323 track->cb_dirty = true;
324 track->zb_dirty = true;
315 break; 325 break;
316 case RADEON_RB3D_ZSTENCILCNTL: 326 case RADEON_RB3D_ZSTENCILCNTL:
317 switch (idx_value & 0xf) { 327 switch (idx_value & 0xf) {
@@ -329,6 +339,7 @@ int r200_packet0_check(struct radeon_cs_parser *p,
329 default: 339 default:
330 break; 340 break;
331 } 341 }
342 track->zb_dirty = true;
332 break; 343 break;
333 case RADEON_RB3D_ZPASS_ADDR: 344 case RADEON_RB3D_ZPASS_ADDR:
334 r = r100_cs_packet_next_reloc(p, &reloc); 345 r = r100_cs_packet_next_reloc(p, &reloc);
@@ -345,6 +356,7 @@ int r200_packet0_check(struct radeon_cs_parser *p,
345 uint32_t temp = idx_value >> 4; 356 uint32_t temp = idx_value >> 4;
346 for (i = 0; i < track->num_texture; i++) 357 for (i = 0; i < track->num_texture; i++)
347 track->textures[i].enabled = !!(temp & (1 << i)); 358 track->textures[i].enabled = !!(temp & (1 << i));
359 track->tex_dirty = true;
348 } 360 }
349 break; 361 break;
350 case RADEON_SE_VF_CNTL: 362 case RADEON_SE_VF_CNTL:
@@ -369,6 +381,7 @@ int r200_packet0_check(struct radeon_cs_parser *p,
369 i = (reg - R200_PP_TXSIZE_0) / 32; 381 i = (reg - R200_PP_TXSIZE_0) / 32;
370 track->textures[i].width = (idx_value & RADEON_TEX_USIZE_MASK) + 1; 382 track->textures[i].width = (idx_value & RADEON_TEX_USIZE_MASK) + 1;
371 track->textures[i].height = ((idx_value & RADEON_TEX_VSIZE_MASK) >> RADEON_TEX_VSIZE_SHIFT) + 1; 383 track->textures[i].height = ((idx_value & RADEON_TEX_VSIZE_MASK) >> RADEON_TEX_VSIZE_SHIFT) + 1;
384 track->tex_dirty = true;
372 break; 385 break;
373 case R200_PP_TXPITCH_0: 386 case R200_PP_TXPITCH_0:
374 case R200_PP_TXPITCH_1: 387 case R200_PP_TXPITCH_1:
@@ -378,6 +391,7 @@ int r200_packet0_check(struct radeon_cs_parser *p,
378 case R200_PP_TXPITCH_5: 391 case R200_PP_TXPITCH_5:
379 i = (reg - R200_PP_TXPITCH_0) / 32; 392 i = (reg - R200_PP_TXPITCH_0) / 32;
380 track->textures[i].pitch = idx_value + 32; 393 track->textures[i].pitch = idx_value + 32;
394 track->tex_dirty = true;
381 break; 395 break;
382 case R200_PP_TXFILTER_0: 396 case R200_PP_TXFILTER_0:
383 case R200_PP_TXFILTER_1: 397 case R200_PP_TXFILTER_1:
@@ -394,6 +408,7 @@ int r200_packet0_check(struct radeon_cs_parser *p,
394 tmp = (idx_value >> 27) & 0x7; 408 tmp = (idx_value >> 27) & 0x7;
395 if (tmp == 2 || tmp == 6) 409 if (tmp == 2 || tmp == 6)
396 track->textures[i].roundup_h = false; 410 track->textures[i].roundup_h = false;
411 track->tex_dirty = true;
397 break; 412 break;
398 case R200_PP_TXMULTI_CTL_0: 413 case R200_PP_TXMULTI_CTL_0:
399 case R200_PP_TXMULTI_CTL_1: 414 case R200_PP_TXMULTI_CTL_1:
@@ -432,6 +447,7 @@ int r200_packet0_check(struct radeon_cs_parser *p,
432 track->textures[i].tex_coord_type = 1; 447 track->textures[i].tex_coord_type = 1;
433 break; 448 break;
434 } 449 }
450 track->tex_dirty = true;
435 break; 451 break;
436 case R200_PP_TXFORMAT_0: 452 case R200_PP_TXFORMAT_0:
437 case R200_PP_TXFORMAT_1: 453 case R200_PP_TXFORMAT_1:
@@ -447,6 +463,8 @@ int r200_packet0_check(struct radeon_cs_parser *p,
447 track->textures[i].width = 1 << ((idx_value >> RADEON_TXFORMAT_WIDTH_SHIFT) & RADEON_TXFORMAT_WIDTH_MASK); 463 track->textures[i].width = 1 << ((idx_value >> RADEON_TXFORMAT_WIDTH_SHIFT) & RADEON_TXFORMAT_WIDTH_MASK);
448 track->textures[i].height = 1 << ((idx_value >> RADEON_TXFORMAT_HEIGHT_SHIFT) & RADEON_TXFORMAT_HEIGHT_MASK); 464 track->textures[i].height = 1 << ((idx_value >> RADEON_TXFORMAT_HEIGHT_SHIFT) & RADEON_TXFORMAT_HEIGHT_MASK);
449 } 465 }
466 if (idx_value & R200_TXFORMAT_LOOKUP_DISABLE)
467 track->textures[i].lookup_disable = true;
450 switch ((idx_value & RADEON_TXFORMAT_FORMAT_MASK)) { 468 switch ((idx_value & RADEON_TXFORMAT_FORMAT_MASK)) {
451 case R200_TXFORMAT_I8: 469 case R200_TXFORMAT_I8:
452 case R200_TXFORMAT_RGB332: 470 case R200_TXFORMAT_RGB332:
@@ -486,6 +504,7 @@ int r200_packet0_check(struct radeon_cs_parser *p,
486 } 504 }
487 track->textures[i].cube_info[4].width = 1 << ((idx_value >> 16) & 0xf); 505 track->textures[i].cube_info[4].width = 1 << ((idx_value >> 16) & 0xf);
488 track->textures[i].cube_info[4].height = 1 << ((idx_value >> 20) & 0xf); 506 track->textures[i].cube_info[4].height = 1 << ((idx_value >> 20) & 0xf);
507 track->tex_dirty = true;
489 break; 508 break;
490 case R200_PP_CUBIC_FACES_0: 509 case R200_PP_CUBIC_FACES_0:
491 case R200_PP_CUBIC_FACES_1: 510 case R200_PP_CUBIC_FACES_1:
@@ -499,6 +518,7 @@ int r200_packet0_check(struct radeon_cs_parser *p,
499 track->textures[i].cube_info[face].width = 1 << ((tmp >> (face * 8)) & 0xf); 518 track->textures[i].cube_info[face].width = 1 << ((tmp >> (face * 8)) & 0xf);
500 track->textures[i].cube_info[face].height = 1 << ((tmp >> ((face * 8) + 4)) & 0xf); 519 track->textures[i].cube_info[face].height = 1 << ((tmp >> ((face * 8) + 4)) & 0xf);
501 } 520 }
521 track->tex_dirty = true;
502 break; 522 break;
503 default: 523 default:
504 printk(KERN_ERR "Forbidden register 0x%04X in cs at %d\n", 524 printk(KERN_ERR "Forbidden register 0x%04X in cs at %d\n",
diff --git a/drivers/gpu/drm/radeon/r300.c b/drivers/gpu/drm/radeon/r300.c
index c827738ad7dd..55a7f190027e 100644
--- a/drivers/gpu/drm/radeon/r300.c
+++ b/drivers/gpu/drm/radeon/r300.c
@@ -69,6 +69,9 @@ void rv370_pcie_gart_tlb_flush(struct radeon_device *rdev)
69 mb(); 69 mb();
70} 70}
71 71
72#define R300_PTE_WRITEABLE (1 << 2)
73#define R300_PTE_READABLE (1 << 3)
74
72int rv370_pcie_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr) 75int rv370_pcie_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr)
73{ 76{
74 void __iomem *ptr = (void *)rdev->gart.table.vram.ptr; 77 void __iomem *ptr = (void *)rdev->gart.table.vram.ptr;
@@ -78,7 +81,7 @@ int rv370_pcie_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr)
78 } 81 }
79 addr = (lower_32_bits(addr) >> 8) | 82 addr = (lower_32_bits(addr) >> 8) |
80 ((upper_32_bits(addr) & 0xff) << 24) | 83 ((upper_32_bits(addr) & 0xff) << 24) |
81 0xc; 84 R300_PTE_WRITEABLE | R300_PTE_READABLE;
82 /* on x86 we want this to be CPU endian, on powerpc 85 /* on x86 we want this to be CPU endian, on powerpc
83 * on powerpc without HW swappers, it'll get swapped on way 86 * on powerpc without HW swappers, it'll get swapped on way
84 * into VRAM - so no need for cpu_to_le32 on VRAM tables */ 87 * into VRAM - so no need for cpu_to_le32 on VRAM tables */
@@ -91,7 +94,7 @@ int rv370_pcie_gart_init(struct radeon_device *rdev)
91 int r; 94 int r;
92 95
93 if (rdev->gart.table.vram.robj) { 96 if (rdev->gart.table.vram.robj) {
94 WARN(1, "RV370 PCIE GART already initialized.\n"); 97 WARN(1, "RV370 PCIE GART already initialized\n");
95 return 0; 98 return 0;
96 } 99 }
97 /* Initialize common gart structure */ 100 /* Initialize common gart structure */
@@ -135,7 +138,7 @@ int rv370_pcie_gart_enable(struct radeon_device *rdev)
135 WREG32_PCIE(RADEON_PCIE_TX_DISCARD_RD_ADDR_LO, rdev->mc.vram_start); 138 WREG32_PCIE(RADEON_PCIE_TX_DISCARD_RD_ADDR_LO, rdev->mc.vram_start);
136 WREG32_PCIE(RADEON_PCIE_TX_DISCARD_RD_ADDR_HI, 0); 139 WREG32_PCIE(RADEON_PCIE_TX_DISCARD_RD_ADDR_HI, 0);
137 /* Clear error */ 140 /* Clear error */
138 WREG32_PCIE(0x18, 0); 141 WREG32_PCIE(RADEON_PCIE_TX_GART_ERROR, 0);
139 tmp = RREG32_PCIE(RADEON_PCIE_TX_GART_CNTL); 142 tmp = RREG32_PCIE(RADEON_PCIE_TX_GART_CNTL);
140 tmp |= RADEON_PCIE_TX_GART_EN; 143 tmp |= RADEON_PCIE_TX_GART_EN;
141 tmp |= RADEON_PCIE_TX_GART_UNMAPPED_ACCESS_DISCARD; 144 tmp |= RADEON_PCIE_TX_GART_UNMAPPED_ACCESS_DISCARD;
@@ -405,12 +408,13 @@ int r300_asic_reset(struct radeon_device *rdev)
405{ 408{
406 struct r100_mc_save save; 409 struct r100_mc_save save;
407 u32 status, tmp; 410 u32 status, tmp;
411 int ret = 0;
408 412
409 r100_mc_stop(rdev, &save);
410 status = RREG32(R_000E40_RBBM_STATUS); 413 status = RREG32(R_000E40_RBBM_STATUS);
411 if (!G_000E40_GUI_ACTIVE(status)) { 414 if (!G_000E40_GUI_ACTIVE(status)) {
412 return 0; 415 return 0;
413 } 416 }
417 r100_mc_stop(rdev, &save);
414 status = RREG32(R_000E40_RBBM_STATUS); 418 status = RREG32(R_000E40_RBBM_STATUS);
415 dev_info(rdev->dev, "(%s:%d) RBBM_STATUS=0x%08X\n", __func__, __LINE__, status); 419 dev_info(rdev->dev, "(%s:%d) RBBM_STATUS=0x%08X\n", __func__, __LINE__, status);
416 /* stop CP */ 420 /* stop CP */
@@ -433,7 +437,7 @@ int r300_asic_reset(struct radeon_device *rdev)
433 status = RREG32(R_000E40_RBBM_STATUS); 437 status = RREG32(R_000E40_RBBM_STATUS);
434 dev_info(rdev->dev, "(%s:%d) RBBM_STATUS=0x%08X\n", __func__, __LINE__, status); 438 dev_info(rdev->dev, "(%s:%d) RBBM_STATUS=0x%08X\n", __func__, __LINE__, status);
435 /* resetting the CP seems to be problematic sometimes it end up 439 /* resetting the CP seems to be problematic sometimes it end up
436 * hard locking the computer, but it's necessary for successfull 440 * hard locking the computer, but it's necessary for successful
437 * reset more test & playing is needed on R3XX/R4XX to find a 441 * reset more test & playing is needed on R3XX/R4XX to find a
438 * reliable (if any solution) 442 * reliable (if any solution)
439 */ 443 */
@@ -451,11 +455,11 @@ int r300_asic_reset(struct radeon_device *rdev)
451 if (G_000E40_GA_BUSY(status) || G_000E40_VAP_BUSY(status)) { 455 if (G_000E40_GA_BUSY(status) || G_000E40_VAP_BUSY(status)) {
452 dev_err(rdev->dev, "failed to reset GPU\n"); 456 dev_err(rdev->dev, "failed to reset GPU\n");
453 rdev->gpu_lockup = true; 457 rdev->gpu_lockup = true;
454 return -1; 458 ret = -1;
455 } 459 } else
460 dev_info(rdev->dev, "GPU reset succeed\n");
456 r100_mc_resume(rdev, &save); 461 r100_mc_resume(rdev, &save);
457 dev_info(rdev->dev, "GPU reset succeed\n"); 462 return ret;
458 return 0;
459} 463}
460 464
461/* 465/*
@@ -558,10 +562,7 @@ int rv370_get_pcie_lanes(struct radeon_device *rdev)
558 562
559 /* FIXME wait for idle */ 563 /* FIXME wait for idle */
560 564
561 if (rdev->family < CHIP_R600) 565 link_width_cntl = RREG32_PCIE(RADEON_PCIE_LC_LINK_WIDTH_CNTL);
562 link_width_cntl = RREG32_PCIE(RADEON_PCIE_LC_LINK_WIDTH_CNTL);
563 else
564 link_width_cntl = RREG32_PCIE_P(RADEON_PCIE_LC_LINK_WIDTH_CNTL);
565 566
566 switch ((link_width_cntl & RADEON_PCIE_LC_LINK_WIDTH_RD_MASK) >> RADEON_PCIE_LC_LINK_WIDTH_RD_SHIFT) { 567 switch ((link_width_cntl & RADEON_PCIE_LC_LINK_WIDTH_RD_MASK) >> RADEON_PCIE_LC_LINK_WIDTH_RD_SHIFT) {
567 case RADEON_PCIE_LC_LINK_WIDTH_X0: 568 case RADEON_PCIE_LC_LINK_WIDTH_X0:
@@ -666,6 +667,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p,
666 } 667 }
667 track->cb[i].robj = reloc->robj; 668 track->cb[i].robj = reloc->robj;
668 track->cb[i].offset = idx_value; 669 track->cb[i].offset = idx_value;
670 track->cb_dirty = true;
669 ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); 671 ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset);
670 break; 672 break;
671 case R300_ZB_DEPTHOFFSET: 673 case R300_ZB_DEPTHOFFSET:
@@ -678,6 +680,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p,
678 } 680 }
679 track->zb.robj = reloc->robj; 681 track->zb.robj = reloc->robj;
680 track->zb.offset = idx_value; 682 track->zb.offset = idx_value;
683 track->zb_dirty = true;
681 ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); 684 ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset);
682 break; 685 break;
683 case R300_TX_OFFSET_0: 686 case R300_TX_OFFSET_0:
@@ -716,6 +719,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p,
716 tmp |= tile_flags; 719 tmp |= tile_flags;
717 ib[idx] = tmp; 720 ib[idx] = tmp;
718 track->textures[i].robj = reloc->robj; 721 track->textures[i].robj = reloc->robj;
722 track->tex_dirty = true;
719 break; 723 break;
720 /* Tracked registers */ 724 /* Tracked registers */
721 case 0x2084: 725 case 0x2084:
@@ -742,10 +746,18 @@ static int r300_packet0_check(struct radeon_cs_parser *p,
742 if (p->rdev->family < CHIP_RV515) { 746 if (p->rdev->family < CHIP_RV515) {
743 track->maxy -= 1440; 747 track->maxy -= 1440;
744 } 748 }
749 track->cb_dirty = true;
750 track->zb_dirty = true;
745 break; 751 break;
746 case 0x4E00: 752 case 0x4E00:
747 /* RB3D_CCTL */ 753 /* RB3D_CCTL */
754 if ((idx_value & (1 << 10)) && /* CMASK_ENABLE */
755 p->rdev->cmask_filp != p->filp) {
756 DRM_ERROR("Invalid RB3D_CCTL: Cannot enable CMASK.\n");
757 return -EINVAL;
758 }
748 track->num_cb = ((idx_value >> 5) & 0x3) + 1; 759 track->num_cb = ((idx_value >> 5) & 0x3) + 1;
760 track->cb_dirty = true;
749 break; 761 break;
750 case 0x4E38: 762 case 0x4E38:
751 case 0x4E3C: 763 case 0x4E3C:
@@ -787,6 +799,13 @@ static int r300_packet0_check(struct radeon_cs_parser *p,
787 case 15: 799 case 15:
788 track->cb[i].cpp = 2; 800 track->cb[i].cpp = 2;
789 break; 801 break;
802 case 5:
803 if (p->rdev->family < CHIP_RV515) {
804 DRM_ERROR("Invalid color buffer format (%d)!\n",
805 ((idx_value >> 21) & 0xF));
806 return -EINVAL;
807 }
808 /* Pass through. */
790 case 6: 809 case 6:
791 track->cb[i].cpp = 4; 810 track->cb[i].cpp = 4;
792 break; 811 break;
@@ -801,6 +820,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p,
801 ((idx_value >> 21) & 0xF)); 820 ((idx_value >> 21) & 0xF));
802 return -EINVAL; 821 return -EINVAL;
803 } 822 }
823 track->cb_dirty = true;
804 break; 824 break;
805 case 0x4F00: 825 case 0x4F00:
806 /* ZB_CNTL */ 826 /* ZB_CNTL */
@@ -809,6 +829,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p,
809 } else { 829 } else {
810 track->z_enabled = false; 830 track->z_enabled = false;
811 } 831 }
832 track->zb_dirty = true;
812 break; 833 break;
813 case 0x4F10: 834 case 0x4F10:
814 /* ZB_FORMAT */ 835 /* ZB_FORMAT */
@@ -825,6 +846,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p,
825 (idx_value & 0xF)); 846 (idx_value & 0xF));
826 return -EINVAL; 847 return -EINVAL;
827 } 848 }
849 track->zb_dirty = true;
828 break; 850 break;
829 case 0x4F24: 851 case 0x4F24:
830 /* ZB_DEPTHPITCH */ 852 /* ZB_DEPTHPITCH */
@@ -848,14 +870,17 @@ static int r300_packet0_check(struct radeon_cs_parser *p,
848 ib[idx] = tmp; 870 ib[idx] = tmp;
849 871
850 track->zb.pitch = idx_value & 0x3FFC; 872 track->zb.pitch = idx_value & 0x3FFC;
873 track->zb_dirty = true;
851 break; 874 break;
852 case 0x4104: 875 case 0x4104:
876 /* TX_ENABLE */
853 for (i = 0; i < 16; i++) { 877 for (i = 0; i < 16; i++) {
854 bool enabled; 878 bool enabled;
855 879
856 enabled = !!(idx_value & (1 << i)); 880 enabled = !!(idx_value & (1 << i));
857 track->textures[i].enabled = enabled; 881 track->textures[i].enabled = enabled;
858 } 882 }
883 track->tex_dirty = true;
859 break; 884 break;
860 case 0x44C0: 885 case 0x44C0:
861 case 0x44C4: 886 case 0x44C4:
@@ -885,6 +910,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p,
885 track->textures[i].compress_format = R100_TRACK_COMP_NONE; 910 track->textures[i].compress_format = R100_TRACK_COMP_NONE;
886 break; 911 break;
887 case R300_TX_FORMAT_X16: 912 case R300_TX_FORMAT_X16:
913 case R300_TX_FORMAT_FL_I16:
888 case R300_TX_FORMAT_Y8X8: 914 case R300_TX_FORMAT_Y8X8:
889 case R300_TX_FORMAT_Z5Y6X5: 915 case R300_TX_FORMAT_Z5Y6X5:
890 case R300_TX_FORMAT_Z6Y5X5: 916 case R300_TX_FORMAT_Z6Y5X5:
@@ -897,6 +923,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p,
897 track->textures[i].compress_format = R100_TRACK_COMP_NONE; 923 track->textures[i].compress_format = R100_TRACK_COMP_NONE;
898 break; 924 break;
899 case R300_TX_FORMAT_Y16X16: 925 case R300_TX_FORMAT_Y16X16:
926 case R300_TX_FORMAT_FL_I16A16:
900 case R300_TX_FORMAT_Z11Y11X10: 927 case R300_TX_FORMAT_Z11Y11X10:
901 case R300_TX_FORMAT_Z10Y11X11: 928 case R300_TX_FORMAT_Z10Y11X11:
902 case R300_TX_FORMAT_W8Z8Y8X8: 929 case R300_TX_FORMAT_W8Z8Y8X8:
@@ -938,8 +965,8 @@ static int r300_packet0_check(struct radeon_cs_parser *p,
938 DRM_ERROR("Invalid texture format %u\n", 965 DRM_ERROR("Invalid texture format %u\n",
939 (idx_value & 0x1F)); 966 (idx_value & 0x1F));
940 return -EINVAL; 967 return -EINVAL;
941 break;
942 } 968 }
969 track->tex_dirty = true;
943 break; 970 break;
944 case 0x4400: 971 case 0x4400:
945 case 0x4404: 972 case 0x4404:
@@ -967,6 +994,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p,
967 if (tmp == 2 || tmp == 4 || tmp == 6) { 994 if (tmp == 2 || tmp == 4 || tmp == 6) {
968 track->textures[i].roundup_h = false; 995 track->textures[i].roundup_h = false;
969 } 996 }
997 track->tex_dirty = true;
970 break; 998 break;
971 case 0x4500: 999 case 0x4500:
972 case 0x4504: 1000 case 0x4504:
@@ -1004,6 +1032,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p,
1004 DRM_ERROR("Forbidden bit TXFORMAT_MSB\n"); 1032 DRM_ERROR("Forbidden bit TXFORMAT_MSB\n");
1005 return -EINVAL; 1033 return -EINVAL;
1006 } 1034 }
1035 track->tex_dirty = true;
1007 break; 1036 break;
1008 case 0x4480: 1037 case 0x4480:
1009 case 0x4484: 1038 case 0x4484:
@@ -1033,6 +1062,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p,
1033 track->textures[i].use_pitch = !!tmp; 1062 track->textures[i].use_pitch = !!tmp;
1034 tmp = (idx_value >> 22) & 0xF; 1063 tmp = (idx_value >> 22) & 0xF;
1035 track->textures[i].txdepth = tmp; 1064 track->textures[i].txdepth = tmp;
1065 track->tex_dirty = true;
1036 break; 1066 break;
1037 case R300_ZB_ZPASS_ADDR: 1067 case R300_ZB_ZPASS_ADDR:
1038 r = r100_cs_packet_next_reloc(p, &reloc); 1068 r = r100_cs_packet_next_reloc(p, &reloc);
@@ -1047,6 +1077,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p,
1047 case 0x4e0c: 1077 case 0x4e0c:
1048 /* RB3D_COLOR_CHANNEL_MASK */ 1078 /* RB3D_COLOR_CHANNEL_MASK */
1049 track->color_channel_mask = idx_value; 1079 track->color_channel_mask = idx_value;
1080 track->cb_dirty = true;
1050 break; 1081 break;
1051 case 0x43a4: 1082 case 0x43a4:
1052 /* SC_HYPERZ_EN */ 1083 /* SC_HYPERZ_EN */
@@ -1060,6 +1091,8 @@ static int r300_packet0_check(struct radeon_cs_parser *p,
1060 case 0x4f1c: 1091 case 0x4f1c:
1061 /* ZB_BW_CNTL */ 1092 /* ZB_BW_CNTL */
1062 track->zb_cb_clear = !!(idx_value & (1 << 5)); 1093 track->zb_cb_clear = !!(idx_value & (1 << 5));
1094 track->cb_dirty = true;
1095 track->zb_dirty = true;
1063 if (p->rdev->hyperz_filp != p->filp) { 1096 if (p->rdev->hyperz_filp != p->filp) {
1064 if (idx_value & (R300_HIZ_ENABLE | 1097 if (idx_value & (R300_HIZ_ENABLE |
1065 R300_RD_COMP_ENABLE | 1098 R300_RD_COMP_ENABLE |
@@ -1071,8 +1104,28 @@ static int r300_packet0_check(struct radeon_cs_parser *p,
1071 case 0x4e04: 1104 case 0x4e04:
1072 /* RB3D_BLENDCNTL */ 1105 /* RB3D_BLENDCNTL */
1073 track->blend_read_enable = !!(idx_value & (1 << 2)); 1106 track->blend_read_enable = !!(idx_value & (1 << 2));
1107 track->cb_dirty = true;
1108 break;
1109 case R300_RB3D_AARESOLVE_OFFSET:
1110 r = r100_cs_packet_next_reloc(p, &reloc);
1111 if (r) {
1112 DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
1113 idx, reg);
1114 r100_cs_dump_packet(p, pkt);
1115 return r;
1116 }
1117 track->aa.robj = reloc->robj;
1118 track->aa.offset = idx_value;
1119 track->aa_dirty = true;
1120 ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset);
1121 break;
1122 case R300_RB3D_AARESOLVE_PITCH:
1123 track->aa.pitch = idx_value & 0x3FFE;
1124 track->aa_dirty = true;
1074 break; 1125 break;
1075 case 0x4f28: /* ZB_DEPTHCLEARVALUE */ 1126 case R300_RB3D_AARESOLVE_CTL:
1127 track->aaresolve = idx_value & 0x1;
1128 track->aa_dirty = true;
1076 break; 1129 break;
1077 case 0x4f30: /* ZB_MASK_OFFSET */ 1130 case 0x4f30: /* ZB_MASK_OFFSET */
1078 case 0x4f34: /* ZB_ZMASK_PITCH */ 1131 case 0x4f34: /* ZB_ZMASK_PITCH */
@@ -1199,6 +1252,10 @@ static int r300_packet3_check(struct radeon_cs_parser *p,
1199 if (p->rdev->hyperz_filp != p->filp) 1252 if (p->rdev->hyperz_filp != p->filp)
1200 return -EINVAL; 1253 return -EINVAL;
1201 break; 1254 break;
1255 case PACKET3_3D_CLEAR_CMASK:
1256 if (p->rdev->cmask_filp != p->filp)
1257 return -EINVAL;
1258 break;
1202 case PACKET3_NOP: 1259 case PACKET3_NOP:
1203 break; 1260 break;
1204 default: 1261 default:
@@ -1332,21 +1389,24 @@ static int r300_startup(struct radeon_device *rdev)
1332 if (r) 1389 if (r)
1333 return r; 1390 return r;
1334 } 1391 }
1392
1393 /* allocate wb buffer */
1394 r = radeon_wb_init(rdev);
1395 if (r)
1396 return r;
1397
1335 /* Enable IRQ */ 1398 /* Enable IRQ */
1336 r100_irq_set(rdev); 1399 r100_irq_set(rdev);
1337 rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); 1400 rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL);
1338 /* 1M ring buffer */ 1401 /* 1M ring buffer */
1339 r = r100_cp_init(rdev, 1024 * 1024); 1402 r = r100_cp_init(rdev, 1024 * 1024);
1340 if (r) { 1403 if (r) {
1341 dev_err(rdev->dev, "failled initializing CP (%d).\n", r); 1404 dev_err(rdev->dev, "failed initializing CP (%d).\n", r);
1342 return r; 1405 return r;
1343 } 1406 }
1344 r = r100_wb_init(rdev);
1345 if (r)
1346 dev_err(rdev->dev, "failled initializing WB (%d).\n", r);
1347 r = r100_ib_init(rdev); 1407 r = r100_ib_init(rdev);
1348 if (r) { 1408 if (r) {
1349 dev_err(rdev->dev, "failled initializing IB (%d).\n", r); 1409 dev_err(rdev->dev, "failed initializing IB (%d).\n", r);
1350 return r; 1410 return r;
1351 } 1411 }
1352 return 0; 1412 return 0;
@@ -1379,7 +1439,7 @@ int r300_resume(struct radeon_device *rdev)
1379int r300_suspend(struct radeon_device *rdev) 1439int r300_suspend(struct radeon_device *rdev)
1380{ 1440{
1381 r100_cp_disable(rdev); 1441 r100_cp_disable(rdev);
1382 r100_wb_disable(rdev); 1442 radeon_wb_disable(rdev);
1383 r100_irq_disable(rdev); 1443 r100_irq_disable(rdev);
1384 if (rdev->flags & RADEON_IS_PCIE) 1444 if (rdev->flags & RADEON_IS_PCIE)
1385 rv370_pcie_gart_disable(rdev); 1445 rv370_pcie_gart_disable(rdev);
@@ -1391,7 +1451,7 @@ int r300_suspend(struct radeon_device *rdev)
1391void r300_fini(struct radeon_device *rdev) 1451void r300_fini(struct radeon_device *rdev)
1392{ 1452{
1393 r100_cp_fini(rdev); 1453 r100_cp_fini(rdev);
1394 r100_wb_fini(rdev); 1454 radeon_wb_fini(rdev);
1395 r100_ib_fini(rdev); 1455 r100_ib_fini(rdev);
1396 radeon_gem_fini(rdev); 1456 radeon_gem_fini(rdev);
1397 if (rdev->flags & RADEON_IS_PCIE) 1457 if (rdev->flags & RADEON_IS_PCIE)
@@ -1484,7 +1544,7 @@ int r300_init(struct radeon_device *rdev)
1484 /* Somethings want wront with the accel init stop accel */ 1544 /* Somethings want wront with the accel init stop accel */
1485 dev_err(rdev->dev, "Disabling GPU acceleration\n"); 1545 dev_err(rdev->dev, "Disabling GPU acceleration\n");
1486 r100_cp_fini(rdev); 1546 r100_cp_fini(rdev);
1487 r100_wb_fini(rdev); 1547 radeon_wb_fini(rdev);
1488 r100_ib_fini(rdev); 1548 r100_ib_fini(rdev);
1489 radeon_irq_kms_fini(rdev); 1549 radeon_irq_kms_fini(rdev);
1490 if (rdev->flags & RADEON_IS_PCIE) 1550 if (rdev->flags & RADEON_IS_PCIE)
diff --git a/drivers/gpu/drm/radeon/r300_reg.h b/drivers/gpu/drm/radeon/r300_reg.h
index 1a0d5362cd79..00c0d2ba22d3 100644
--- a/drivers/gpu/drm/radeon/r300_reg.h
+++ b/drivers/gpu/drm/radeon/r300_reg.h
@@ -608,7 +608,7 @@
608 * My guess is that there are two bits for each zbias primitive 608 * My guess is that there are two bits for each zbias primitive
609 * (FILL, LINE, POINT). 609 * (FILL, LINE, POINT).
610 * One to enable depth test and one for depth write. 610 * One to enable depth test and one for depth write.
611 * Yet this doesnt explain why depth writes work ... 611 * Yet this doesn't explain why depth writes work ...
612 */ 612 */
613#define R300_RE_OCCLUSION_CNTL 0x42B4 613#define R300_RE_OCCLUSION_CNTL 0x42B4
614# define R300_OCCLUSION_ON (1<<1) 614# define R300_OCCLUSION_ON (1<<1)
@@ -817,7 +817,7 @@
817# define R300_TX_MIN_FILTER_LINEAR_MIP_NEAREST (6 << 11) 817# define R300_TX_MIN_FILTER_LINEAR_MIP_NEAREST (6 << 11)
818# define R300_TX_MIN_FILTER_LINEAR_MIP_LINEAR (10 << 11) 818# define R300_TX_MIN_FILTER_LINEAR_MIP_LINEAR (10 << 11)
819 819
820/* NOTE: NEAREST doesnt seem to exist. 820/* NOTE: NEAREST doesn't seem to exist.
821 * Im not seting MAG_FILTER_MASK and (3 << 11) on for all 821 * Im not seting MAG_FILTER_MASK and (3 << 11) on for all
822 * anisotropy modes because that would void selected mag filter 822 * anisotropy modes because that would void selected mag filter
823 */ 823 */
@@ -1371,6 +1371,8 @@
1371#define R300_RB3D_COLORPITCH2 0x4E40 /* GUESS */ 1371#define R300_RB3D_COLORPITCH2 0x4E40 /* GUESS */
1372#define R300_RB3D_COLORPITCH3 0x4E44 /* GUESS */ 1372#define R300_RB3D_COLORPITCH3 0x4E44 /* GUESS */
1373 1373
1374#define R300_RB3D_AARESOLVE_OFFSET 0x4E80
1375#define R300_RB3D_AARESOLVE_PITCH 0x4E84
1374#define R300_RB3D_AARESOLVE_CTL 0x4E88 1376#define R300_RB3D_AARESOLVE_CTL 0x4E88
1375/* gap */ 1377/* gap */
1376 1378
diff --git a/drivers/gpu/drm/radeon/r300d.h b/drivers/gpu/drm/radeon/r300d.h
index 0c036c60d9df..1f519a5ffb8c 100644
--- a/drivers/gpu/drm/radeon/r300d.h
+++ b/drivers/gpu/drm/radeon/r300d.h
@@ -54,6 +54,7 @@
54#define PACKET3_3D_DRAW_IMMD_2 0x35 54#define PACKET3_3D_DRAW_IMMD_2 0x35
55#define PACKET3_3D_DRAW_INDX_2 0x36 55#define PACKET3_3D_DRAW_INDX_2 0x36
56#define PACKET3_3D_CLEAR_HIZ 0x37 56#define PACKET3_3D_CLEAR_HIZ 0x37
57#define PACKET3_3D_CLEAR_CMASK 0x38
57#define PACKET3_BITBLT_MULTI 0x9B 58#define PACKET3_BITBLT_MULTI 0x9B
58 59
59#define PACKET0(reg, n) (CP_PACKET0 | \ 60#define PACKET0(reg, n) (CP_PACKET0 | \
diff --git a/drivers/gpu/drm/radeon/r420.c b/drivers/gpu/drm/radeon/r420.c
index 59f7bccc5be0..417fab81812f 100644
--- a/drivers/gpu/drm/radeon/r420.c
+++ b/drivers/gpu/drm/radeon/r420.c
@@ -96,7 +96,7 @@ void r420_pipes_init(struct radeon_device *rdev)
96 "programming pipes. Bad things might happen.\n"); 96 "programming pipes. Bad things might happen.\n");
97 } 97 }
98 /* get max number of pipes */ 98 /* get max number of pipes */
99 gb_pipe_select = RREG32(0x402C); 99 gb_pipe_select = RREG32(R400_GB_PIPE_SELECT);
100 num_pipes = ((gb_pipe_select >> 12) & 3) + 1; 100 num_pipes = ((gb_pipe_select >> 12) & 3) + 1;
101 101
102 /* SE chips have 1 pipe */ 102 /* SE chips have 1 pipe */
@@ -248,23 +248,25 @@ static int r420_startup(struct radeon_device *rdev)
248 return r; 248 return r;
249 } 249 }
250 r420_pipes_init(rdev); 250 r420_pipes_init(rdev);
251
252 /* allocate wb buffer */
253 r = radeon_wb_init(rdev);
254 if (r)
255 return r;
256
251 /* Enable IRQ */ 257 /* Enable IRQ */
252 r100_irq_set(rdev); 258 r100_irq_set(rdev);
253 rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); 259 rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL);
254 /* 1M ring buffer */ 260 /* 1M ring buffer */
255 r = r100_cp_init(rdev, 1024 * 1024); 261 r = r100_cp_init(rdev, 1024 * 1024);
256 if (r) { 262 if (r) {
257 dev_err(rdev->dev, "failled initializing CP (%d).\n", r); 263 dev_err(rdev->dev, "failed initializing CP (%d).\n", r);
258 return r; 264 return r;
259 } 265 }
260 r420_cp_errata_init(rdev); 266 r420_cp_errata_init(rdev);
261 r = r100_wb_init(rdev);
262 if (r) {
263 dev_err(rdev->dev, "failled initializing WB (%d).\n", r);
264 }
265 r = r100_ib_init(rdev); 267 r = r100_ib_init(rdev);
266 if (r) { 268 if (r) {
267 dev_err(rdev->dev, "failled initializing IB (%d).\n", r); 269 dev_err(rdev->dev, "failed initializing IB (%d).\n", r);
268 return r; 270 return r;
269 } 271 }
270 return 0; 272 return 0;
@@ -302,7 +304,7 @@ int r420_suspend(struct radeon_device *rdev)
302{ 304{
303 r420_cp_errata_fini(rdev); 305 r420_cp_errata_fini(rdev);
304 r100_cp_disable(rdev); 306 r100_cp_disable(rdev);
305 r100_wb_disable(rdev); 307 radeon_wb_disable(rdev);
306 r100_irq_disable(rdev); 308 r100_irq_disable(rdev);
307 if (rdev->flags & RADEON_IS_PCIE) 309 if (rdev->flags & RADEON_IS_PCIE)
308 rv370_pcie_gart_disable(rdev); 310 rv370_pcie_gart_disable(rdev);
@@ -314,7 +316,7 @@ int r420_suspend(struct radeon_device *rdev)
314void r420_fini(struct radeon_device *rdev) 316void r420_fini(struct radeon_device *rdev)
315{ 317{
316 r100_cp_fini(rdev); 318 r100_cp_fini(rdev);
317 r100_wb_fini(rdev); 319 radeon_wb_fini(rdev);
318 r100_ib_fini(rdev); 320 r100_ib_fini(rdev);
319 radeon_gem_fini(rdev); 321 radeon_gem_fini(rdev);
320 if (rdev->flags & RADEON_IS_PCIE) 322 if (rdev->flags & RADEON_IS_PCIE)
@@ -418,7 +420,7 @@ int r420_init(struct radeon_device *rdev)
418 /* Somethings want wront with the accel init stop accel */ 420 /* Somethings want wront with the accel init stop accel */
419 dev_err(rdev->dev, "Disabling GPU acceleration\n"); 421 dev_err(rdev->dev, "Disabling GPU acceleration\n");
420 r100_cp_fini(rdev); 422 r100_cp_fini(rdev);
421 r100_wb_fini(rdev); 423 radeon_wb_fini(rdev);
422 r100_ib_fini(rdev); 424 r100_ib_fini(rdev);
423 radeon_irq_kms_fini(rdev); 425 radeon_irq_kms_fini(rdev);
424 if (rdev->flags & RADEON_IS_PCIE) 426 if (rdev->flags & RADEON_IS_PCIE)
diff --git a/drivers/gpu/drm/radeon/r500_reg.h b/drivers/gpu/drm/radeon/r500_reg.h
index 6ac1f604e29b..fc437059918f 100644
--- a/drivers/gpu/drm/radeon/r500_reg.h
+++ b/drivers/gpu/drm/radeon/r500_reg.h
@@ -355,6 +355,8 @@
355#define AVIVO_D1CRTC_FRAME_COUNT 0x60a4 355#define AVIVO_D1CRTC_FRAME_COUNT 0x60a4
356#define AVIVO_D1CRTC_STEREO_CONTROL 0x60c4 356#define AVIVO_D1CRTC_STEREO_CONTROL 0x60c4
357 357
358#define AVIVO_D1MODE_MASTER_UPDATE_MODE 0x60e4
359
358/* master controls */ 360/* master controls */
359#define AVIVO_DC_CRTC_MASTER_EN 0x60f8 361#define AVIVO_DC_CRTC_MASTER_EN 0x60f8
360#define AVIVO_DC_CRTC_TV_CONTROL 0x60fc 362#define AVIVO_DC_CRTC_TV_CONTROL 0x60fc
@@ -409,8 +411,10 @@
409#define AVIVO_D1GRPH_X_END 0x6134 411#define AVIVO_D1GRPH_X_END 0x6134
410#define AVIVO_D1GRPH_Y_END 0x6138 412#define AVIVO_D1GRPH_Y_END 0x6138
411#define AVIVO_D1GRPH_UPDATE 0x6144 413#define AVIVO_D1GRPH_UPDATE 0x6144
414# define AVIVO_D1GRPH_SURFACE_UPDATE_PENDING (1 << 2)
412# define AVIVO_D1GRPH_UPDATE_LOCK (1 << 16) 415# define AVIVO_D1GRPH_UPDATE_LOCK (1 << 16)
413#define AVIVO_D1GRPH_FLIP_CONTROL 0x6148 416#define AVIVO_D1GRPH_FLIP_CONTROL 0x6148
417# define AVIVO_D1GRPH_SURFACE_UPDATE_H_RETRACE_EN (1 << 0)
414 418
415#define AVIVO_D1CUR_CONTROL 0x6400 419#define AVIVO_D1CUR_CONTROL 0x6400
416# define AVIVO_D1CURSOR_EN (1 << 0) 420# define AVIVO_D1CURSOR_EN (1 << 0)
diff --git a/drivers/gpu/drm/radeon/r520.c b/drivers/gpu/drm/radeon/r520.c
index 1458dee902dd..3081d07f8de5 100644
--- a/drivers/gpu/drm/radeon/r520.c
+++ b/drivers/gpu/drm/radeon/r520.c
@@ -79,8 +79,8 @@ static void r520_gpu_init(struct radeon_device *rdev)
79 WREG32(0x4128, 0xFF); 79 WREG32(0x4128, 0xFF);
80 } 80 }
81 r420_pipes_init(rdev); 81 r420_pipes_init(rdev);
82 gb_pipe_select = RREG32(0x402C); 82 gb_pipe_select = RREG32(R400_GB_PIPE_SELECT);
83 tmp = RREG32(0x170C); 83 tmp = RREG32(R300_DST_PIPE_CONFIG);
84 pipe_select_current = (tmp >> 2) & 3; 84 pipe_select_current = (tmp >> 2) & 3;
85 tmp = (1 << pipe_select_current) | 85 tmp = (1 << pipe_select_current) |
86 (((gb_pipe_select >> 8) & 0xF) << 4); 86 (((gb_pipe_select >> 8) & 0xF) << 4);
@@ -181,21 +181,24 @@ static int r520_startup(struct radeon_device *rdev)
181 if (r) 181 if (r)
182 return r; 182 return r;
183 } 183 }
184
185 /* allocate wb buffer */
186 r = radeon_wb_init(rdev);
187 if (r)
188 return r;
189
184 /* Enable IRQ */ 190 /* Enable IRQ */
185 rs600_irq_set(rdev); 191 rs600_irq_set(rdev);
186 rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); 192 rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL);
187 /* 1M ring buffer */ 193 /* 1M ring buffer */
188 r = r100_cp_init(rdev, 1024 * 1024); 194 r = r100_cp_init(rdev, 1024 * 1024);
189 if (r) { 195 if (r) {
190 dev_err(rdev->dev, "failled initializing CP (%d).\n", r); 196 dev_err(rdev->dev, "failed initializing CP (%d).\n", r);
191 return r; 197 return r;
192 } 198 }
193 r = r100_wb_init(rdev);
194 if (r)
195 dev_err(rdev->dev, "failled initializing WB (%d).\n", r);
196 r = r100_ib_init(rdev); 199 r = r100_ib_init(rdev);
197 if (r) { 200 if (r) {
198 dev_err(rdev->dev, "failled initializing IB (%d).\n", r); 201 dev_err(rdev->dev, "failed initializing IB (%d).\n", r);
199 return r; 202 return r;
200 } 203 }
201 return 0; 204 return 0;
@@ -295,7 +298,7 @@ int r520_init(struct radeon_device *rdev)
295 /* Somethings want wront with the accel init stop accel */ 298 /* Somethings want wront with the accel init stop accel */
296 dev_err(rdev->dev, "Disabling GPU acceleration\n"); 299 dev_err(rdev->dev, "Disabling GPU acceleration\n");
297 r100_cp_fini(rdev); 300 r100_cp_fini(rdev);
298 r100_wb_fini(rdev); 301 radeon_wb_fini(rdev);
299 r100_ib_fini(rdev); 302 r100_ib_fini(rdev);
300 radeon_irq_kms_fini(rdev); 303 radeon_irq_kms_fini(rdev);
301 rv370_pcie_gart_fini(rdev); 304 rv370_pcie_gart_fini(rdev);
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
index 7b65e4efe8af..bc54b26cb32f 100644
--- a/drivers/gpu/drm/radeon/r600.c
+++ b/drivers/gpu/drm/radeon/r600.c
@@ -47,6 +47,7 @@
47#define EVERGREEN_PFP_UCODE_SIZE 1120 47#define EVERGREEN_PFP_UCODE_SIZE 1120
48#define EVERGREEN_PM4_UCODE_SIZE 1376 48#define EVERGREEN_PM4_UCODE_SIZE 1376
49#define EVERGREEN_RLC_UCODE_SIZE 768 49#define EVERGREEN_RLC_UCODE_SIZE 768
50#define CAYMAN_RLC_UCODE_SIZE 1024
50 51
51/* Firmware Names */ 52/* Firmware Names */
52MODULE_FIRMWARE("radeon/R600_pfp.bin"); 53MODULE_FIRMWARE("radeon/R600_pfp.bin");
@@ -83,6 +84,13 @@ MODULE_FIRMWARE("radeon/JUNIPER_rlc.bin");
83MODULE_FIRMWARE("radeon/CYPRESS_pfp.bin"); 84MODULE_FIRMWARE("radeon/CYPRESS_pfp.bin");
84MODULE_FIRMWARE("radeon/CYPRESS_me.bin"); 85MODULE_FIRMWARE("radeon/CYPRESS_me.bin");
85MODULE_FIRMWARE("radeon/CYPRESS_rlc.bin"); 86MODULE_FIRMWARE("radeon/CYPRESS_rlc.bin");
87MODULE_FIRMWARE("radeon/PALM_pfp.bin");
88MODULE_FIRMWARE("radeon/PALM_me.bin");
89MODULE_FIRMWARE("radeon/SUMO_rlc.bin");
90MODULE_FIRMWARE("radeon/SUMO_pfp.bin");
91MODULE_FIRMWARE("radeon/SUMO_me.bin");
92MODULE_FIRMWARE("radeon/SUMO2_pfp.bin");
93MODULE_FIRMWARE("radeon/SUMO2_me.bin");
86 94
87int r600_debugfs_mc_info_init(struct radeon_device *rdev); 95int r600_debugfs_mc_info_init(struct radeon_device *rdev);
88 96
@@ -91,18 +99,17 @@ int r600_mc_wait_for_idle(struct radeon_device *rdev);
91void r600_gpu_init(struct radeon_device *rdev); 99void r600_gpu_init(struct radeon_device *rdev);
92void r600_fini(struct radeon_device *rdev); 100void r600_fini(struct radeon_device *rdev);
93void r600_irq_disable(struct radeon_device *rdev); 101void r600_irq_disable(struct radeon_device *rdev);
102static void r600_pcie_gen2_enable(struct radeon_device *rdev);
94 103
95/* get temperature in millidegrees */ 104/* get temperature in millidegrees */
96u32 rv6xx_get_temp(struct radeon_device *rdev) 105int rv6xx_get_temp(struct radeon_device *rdev)
97{ 106{
98 u32 temp = (RREG32(CG_THERMAL_STATUS) & ASIC_T_MASK) >> 107 u32 temp = (RREG32(CG_THERMAL_STATUS) & ASIC_T_MASK) >>
99 ASIC_T_SHIFT; 108 ASIC_T_SHIFT;
100 u32 actual_temp = 0; 109 int actual_temp = temp & 0xff;
101 110
102 if ((temp >> 7) & 1) 111 if (temp & 0x100)
103 actual_temp = 0; 112 actual_temp -= 256;
104 else
105 actual_temp = (temp >> 1) & 0xff;
106 113
107 return actual_temp * 1000; 114 return actual_temp * 1000;
108} 115}
@@ -583,8 +590,11 @@ void r600_pm_misc(struct radeon_device *rdev)
583 struct radeon_voltage *voltage = &ps->clock_info[req_cm_idx].voltage; 590 struct radeon_voltage *voltage = &ps->clock_info[req_cm_idx].voltage;
584 591
585 if ((voltage->type == VOLTAGE_SW) && voltage->voltage) { 592 if ((voltage->type == VOLTAGE_SW) && voltage->voltage) {
593 /* 0xff01 is a flag rather then an actual voltage */
594 if (voltage->voltage == 0xff01)
595 return;
586 if (voltage->voltage != rdev->pm.current_vddc) { 596 if (voltage->voltage != rdev->pm.current_vddc) {
587 radeon_atom_set_voltage(rdev, voltage->voltage); 597 radeon_atom_set_voltage(rdev, voltage->voltage, SET_VOLTAGE_TYPE_ASIC_VDDC);
588 rdev->pm.current_vddc = voltage->voltage; 598 rdev->pm.current_vddc = voltage->voltage;
589 DRM_DEBUG_DRIVER("Setting: v: %d\n", voltage->voltage); 599 DRM_DEBUG_DRIVER("Setting: v: %d\n", voltage->voltage);
590 } 600 }
@@ -884,12 +894,15 @@ void r600_pcie_gart_tlb_flush(struct radeon_device *rdev)
884 u32 tmp; 894 u32 tmp;
885 895
886 /* flush hdp cache so updates hit vram */ 896 /* flush hdp cache so updates hit vram */
887 if ((rdev->family >= CHIP_RV770) && (rdev->family <= CHIP_RV740)) { 897 if ((rdev->family >= CHIP_RV770) && (rdev->family <= CHIP_RV740) &&
898 !(rdev->flags & RADEON_IS_AGP)) {
888 void __iomem *ptr = (void *)rdev->gart.table.vram.ptr; 899 void __iomem *ptr = (void *)rdev->gart.table.vram.ptr;
889 u32 tmp; 900 u32 tmp;
890 901
891 /* r7xx hw bug. write to HDP_DEBUG1 followed by fb read 902 /* r7xx hw bug. write to HDP_DEBUG1 followed by fb read
892 * rather than write to HDP_REG_COHERENCY_FLUSH_CNTL 903 * rather than write to HDP_REG_COHERENCY_FLUSH_CNTL
904 * This seems to cause problems on some AGP cards. Just use the old
905 * method for them.
893 */ 906 */
894 WREG32(HDP_DEBUG1, 0); 907 WREG32(HDP_DEBUG1, 0);
895 tmp = readl((void __iomem *)ptr); 908 tmp = readl((void __iomem *)ptr);
@@ -919,7 +932,7 @@ int r600_pcie_gart_init(struct radeon_device *rdev)
919 int r; 932 int r;
920 933
921 if (rdev->gart.table.vram.robj) { 934 if (rdev->gart.table.vram.robj) {
922 WARN(1, "R600 PCIE GART already initialized.\n"); 935 WARN(1, "R600 PCIE GART already initialized\n");
923 return 0; 936 return 0;
924 } 937 }
925 /* Initialize common gart structure */ 938 /* Initialize common gart structure */
@@ -1167,7 +1180,7 @@ static void r600_mc_program(struct radeon_device *rdev)
1167 * Note: GTT start, end, size should be initialized before calling this 1180 * Note: GTT start, end, size should be initialized before calling this
1168 * function on AGP platform. 1181 * function on AGP platform.
1169 */ 1182 */
1170void r600_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc) 1183static void r600_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc)
1171{ 1184{
1172 u64 size_bf, size_af; 1185 u64 size_bf, size_af;
1173 1186
@@ -1201,8 +1214,10 @@ void r600_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc)
1201 mc->vram_end, mc->real_vram_size >> 20); 1214 mc->vram_end, mc->real_vram_size >> 20);
1202 } else { 1215 } else {
1203 u64 base = 0; 1216 u64 base = 0;
1204 if (rdev->flags & RADEON_IS_IGP) 1217 if (rdev->flags & RADEON_IS_IGP) {
1205 base = (RREG32(MC_VM_FB_LOCATION) & 0xFFFF) << 24; 1218 base = RREG32(MC_VM_FB_LOCATION) & 0xFFFF;
1219 base <<= 24;
1220 }
1206 radeon_vram_location(rdev, &rdev->mc, base); 1221 radeon_vram_location(rdev, &rdev->mc, base);
1207 rdev->mc.gtt_base_align = 0; 1222 rdev->mc.gtt_base_align = 0;
1208 radeon_gtt_location(rdev, mc); 1223 radeon_gtt_location(rdev, mc);
@@ -1248,7 +1263,6 @@ int r600_mc_init(struct radeon_device *rdev)
1248 rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE); 1263 rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE);
1249 rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE); 1264 rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE);
1250 rdev->mc.visible_vram_size = rdev->mc.aper_size; 1265 rdev->mc.visible_vram_size = rdev->mc.aper_size;
1251 rdev->mc.active_vram_size = rdev->mc.visible_vram_size;
1252 r600_vram_gtt_location(rdev, &rdev->mc); 1266 r600_vram_gtt_location(rdev, &rdev->mc);
1253 1267
1254 if (rdev->flags & RADEON_IS_IGP) { 1268 if (rdev->flags & RADEON_IS_IGP) {
@@ -1284,6 +1298,9 @@ int r600_gpu_soft_reset(struct radeon_device *rdev)
1284 S_008014_CB2_BUSY(1) | S_008014_CB3_BUSY(1); 1298 S_008014_CB2_BUSY(1) | S_008014_CB3_BUSY(1);
1285 u32 tmp; 1299 u32 tmp;
1286 1300
1301 if (!(RREG32(GRBM_STATUS) & GUI_ACTIVE))
1302 return 0;
1303
1287 dev_info(rdev->dev, "GPU softreset \n"); 1304 dev_info(rdev->dev, "GPU softreset \n");
1288 dev_info(rdev->dev, " R_008010_GRBM_STATUS=0x%08X\n", 1305 dev_info(rdev->dev, " R_008010_GRBM_STATUS=0x%08X\n",
1289 RREG32(R_008010_GRBM_STATUS)); 1306 RREG32(R_008010_GRBM_STATUS));
@@ -1343,13 +1360,19 @@ bool r600_gpu_is_lockup(struct radeon_device *rdev)
1343 u32 srbm_status; 1360 u32 srbm_status;
1344 u32 grbm_status; 1361 u32 grbm_status;
1345 u32 grbm_status2; 1362 u32 grbm_status2;
1363 struct r100_gpu_lockup *lockup;
1346 int r; 1364 int r;
1347 1365
1366 if (rdev->family >= CHIP_RV770)
1367 lockup = &rdev->config.rv770.lockup;
1368 else
1369 lockup = &rdev->config.r600.lockup;
1370
1348 srbm_status = RREG32(R_000E50_SRBM_STATUS); 1371 srbm_status = RREG32(R_000E50_SRBM_STATUS);
1349 grbm_status = RREG32(R_008010_GRBM_STATUS); 1372 grbm_status = RREG32(R_008010_GRBM_STATUS);
1350 grbm_status2 = RREG32(R_008014_GRBM_STATUS2); 1373 grbm_status2 = RREG32(R_008014_GRBM_STATUS2);
1351 if (!G_008010_GUI_ACTIVE(grbm_status)) { 1374 if (!G_008010_GUI_ACTIVE(grbm_status)) {
1352 r100_gpu_lockup_update(&rdev->config.r300.lockup, &rdev->cp); 1375 r100_gpu_lockup_update(lockup, &rdev->cp);
1353 return false; 1376 return false;
1354 } 1377 }
1355 /* force CP activities */ 1378 /* force CP activities */
@@ -1361,7 +1384,7 @@ bool r600_gpu_is_lockup(struct radeon_device *rdev)
1361 radeon_ring_unlock_commit(rdev); 1384 radeon_ring_unlock_commit(rdev);
1362 } 1385 }
1363 rdev->cp.rptr = RREG32(R600_CP_RB_RPTR); 1386 rdev->cp.rptr = RREG32(R600_CP_RB_RPTR);
1364 return r100_gpu_cp_is_lockup(rdev, &rdev->config.r300.lockup, &rdev->cp); 1387 return r100_gpu_cp_is_lockup(rdev, lockup, &rdev->cp);
1365} 1388}
1366 1389
1367int r600_asic_reset(struct radeon_device *rdev) 1390int r600_asic_reset(struct radeon_device *rdev)
@@ -1608,8 +1631,11 @@ void r600_gpu_init(struct radeon_device *rdev)
1608 rdev->config.r600.tiling_npipes = rdev->config.r600.max_tile_pipes; 1631 rdev->config.r600.tiling_npipes = rdev->config.r600.max_tile_pipes;
1609 rdev->config.r600.tiling_nbanks = 4 << ((ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT); 1632 rdev->config.r600.tiling_nbanks = 4 << ((ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT);
1610 tiling_config |= BANK_TILING((ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT); 1633 tiling_config |= BANK_TILING((ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT);
1611 tiling_config |= GROUP_SIZE(0); 1634 tiling_config |= GROUP_SIZE((ramcfg & BURSTLENGTH_MASK) >> BURSTLENGTH_SHIFT);
1612 rdev->config.r600.tiling_group_size = 256; 1635 if ((ramcfg & BURSTLENGTH_MASK) >> BURSTLENGTH_SHIFT)
1636 rdev->config.r600.tiling_group_size = 512;
1637 else
1638 rdev->config.r600.tiling_group_size = 256;
1613 tmp = (ramcfg & NOOFROWS_MASK) >> NOOFROWS_SHIFT; 1639 tmp = (ramcfg & NOOFROWS_MASK) >> NOOFROWS_SHIFT;
1614 if (tmp > 3) { 1640 if (tmp > 3) {
1615 tiling_config |= ROW_TILING(3); 1641 tiling_config |= ROW_TILING(3);
@@ -1918,8 +1944,9 @@ void r600_pciep_wreg(struct radeon_device *rdev, u32 reg, u32 v)
1918 */ 1944 */
1919void r600_cp_stop(struct radeon_device *rdev) 1945void r600_cp_stop(struct radeon_device *rdev)
1920{ 1946{
1921 rdev->mc.active_vram_size = rdev->mc.visible_vram_size; 1947 radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
1922 WREG32(R_0086D8_CP_ME_CNTL, S_0086D8_CP_ME_HALT(1)); 1948 WREG32(R_0086D8_CP_ME_CNTL, S_0086D8_CP_ME_HALT(1));
1949 WREG32(SCRATCH_UMSK, 0);
1923} 1950}
1924 1951
1925int r600_init_microcode(struct radeon_device *rdev) 1952int r600_init_microcode(struct radeon_device *rdev)
@@ -2000,6 +2027,18 @@ int r600_init_microcode(struct radeon_device *rdev)
2000 chip_name = "CYPRESS"; 2027 chip_name = "CYPRESS";
2001 rlc_chip_name = "CYPRESS"; 2028 rlc_chip_name = "CYPRESS";
2002 break; 2029 break;
2030 case CHIP_PALM:
2031 chip_name = "PALM";
2032 rlc_chip_name = "SUMO";
2033 break;
2034 case CHIP_SUMO:
2035 chip_name = "SUMO";
2036 rlc_chip_name = "SUMO";
2037 break;
2038 case CHIP_SUMO2:
2039 chip_name = "SUMO2";
2040 rlc_chip_name = "SUMO";
2041 break;
2003 default: BUG(); 2042 default: BUG();
2004 } 2043 }
2005 2044
@@ -2081,7 +2120,11 @@ static int r600_cp_load_microcode(struct radeon_device *rdev)
2081 2120
2082 r600_cp_stop(rdev); 2121 r600_cp_stop(rdev);
2083 2122
2084 WREG32(CP_RB_CNTL, RB_NO_UPDATE | RB_BLKSZ(15) | RB_BUFSZ(3)); 2123 WREG32(CP_RB_CNTL,
2124#ifdef __BIG_ENDIAN
2125 BUF_SWAP_32BIT |
2126#endif
2127 RB_NO_UPDATE | RB_BLKSZ(15) | RB_BUFSZ(3));
2085 2128
2086 /* Reset cp */ 2129 /* Reset cp */
2087 WREG32(GRBM_SOFT_RESET, SOFT_RESET_CP); 2130 WREG32(GRBM_SOFT_RESET, SOFT_RESET_CP);
@@ -2152,7 +2195,7 @@ int r600_cp_resume(struct radeon_device *rdev)
2152 2195
2153 /* Set ring buffer size */ 2196 /* Set ring buffer size */
2154 rb_bufsz = drm_order(rdev->cp.ring_size / 8); 2197 rb_bufsz = drm_order(rdev->cp.ring_size / 8);
2155 tmp = RB_NO_UPDATE | (drm_order(RADEON_GPU_PAGE_SIZE/8) << 8) | rb_bufsz; 2198 tmp = (drm_order(RADEON_GPU_PAGE_SIZE/8) << 8) | rb_bufsz;
2156#ifdef __BIG_ENDIAN 2199#ifdef __BIG_ENDIAN
2157 tmp |= BUF_SWAP_32BIT; 2200 tmp |= BUF_SWAP_32BIT;
2158#endif 2201#endif
@@ -2166,8 +2209,23 @@ int r600_cp_resume(struct radeon_device *rdev)
2166 WREG32(CP_RB_CNTL, tmp | RB_RPTR_WR_ENA); 2209 WREG32(CP_RB_CNTL, tmp | RB_RPTR_WR_ENA);
2167 WREG32(CP_RB_RPTR_WR, 0); 2210 WREG32(CP_RB_RPTR_WR, 0);
2168 WREG32(CP_RB_WPTR, 0); 2211 WREG32(CP_RB_WPTR, 0);
2169 WREG32(CP_RB_RPTR_ADDR, rdev->cp.gpu_addr & 0xFFFFFFFF); 2212
2170 WREG32(CP_RB_RPTR_ADDR_HI, upper_32_bits(rdev->cp.gpu_addr)); 2213 /* set the wb address whether it's enabled or not */
2214 WREG32(CP_RB_RPTR_ADDR,
2215#ifdef __BIG_ENDIAN
2216 RB_RPTR_SWAP(2) |
2217#endif
2218 ((rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFFFFFFFC));
2219 WREG32(CP_RB_RPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFF);
2220 WREG32(SCRATCH_ADDR, ((rdev->wb.gpu_addr + RADEON_WB_SCRATCH_OFFSET) >> 8) & 0xFFFFFFFF);
2221
2222 if (rdev->wb.enabled)
2223 WREG32(SCRATCH_UMSK, 0xff);
2224 else {
2225 tmp |= RB_NO_UPDATE;
2226 WREG32(SCRATCH_UMSK, 0);
2227 }
2228
2171 mdelay(1); 2229 mdelay(1);
2172 WREG32(CP_RB_CNTL, tmp); 2230 WREG32(CP_RB_CNTL, tmp);
2173 2231
@@ -2219,9 +2277,10 @@ void r600_scratch_init(struct radeon_device *rdev)
2219 int i; 2277 int i;
2220 2278
2221 rdev->scratch.num_reg = 7; 2279 rdev->scratch.num_reg = 7;
2280 rdev->scratch.reg_base = SCRATCH_REG0;
2222 for (i = 0; i < rdev->scratch.num_reg; i++) { 2281 for (i = 0; i < rdev->scratch.num_reg; i++) {
2223 rdev->scratch.free[i] = true; 2282 rdev->scratch.free[i] = true;
2224 rdev->scratch.reg[i] = SCRATCH_REG0 + (i * 4); 2283 rdev->scratch.reg[i] = rdev->scratch.reg_base + (i * 4);
2225 } 2284 }
2226} 2285}
2227 2286
@@ -2265,88 +2324,34 @@ int r600_ring_test(struct radeon_device *rdev)
2265 return r; 2324 return r;
2266} 2325}
2267 2326
2268void r600_wb_disable(struct radeon_device *rdev)
2269{
2270 int r;
2271
2272 WREG32(SCRATCH_UMSK, 0);
2273 if (rdev->wb.wb_obj) {
2274 r = radeon_bo_reserve(rdev->wb.wb_obj, false);
2275 if (unlikely(r != 0))
2276 return;
2277 radeon_bo_kunmap(rdev->wb.wb_obj);
2278 radeon_bo_unpin(rdev->wb.wb_obj);
2279 radeon_bo_unreserve(rdev->wb.wb_obj);
2280 }
2281}
2282
2283void r600_wb_fini(struct radeon_device *rdev)
2284{
2285 r600_wb_disable(rdev);
2286 if (rdev->wb.wb_obj) {
2287 radeon_bo_unref(&rdev->wb.wb_obj);
2288 rdev->wb.wb = NULL;
2289 rdev->wb.wb_obj = NULL;
2290 }
2291}
2292
2293int r600_wb_enable(struct radeon_device *rdev)
2294{
2295 int r;
2296
2297 if (rdev->wb.wb_obj == NULL) {
2298 r = radeon_bo_create(rdev, NULL, RADEON_GPU_PAGE_SIZE, true,
2299 RADEON_GEM_DOMAIN_GTT, &rdev->wb.wb_obj);
2300 if (r) {
2301 dev_warn(rdev->dev, "(%d) create WB bo failed\n", r);
2302 return r;
2303 }
2304 r = radeon_bo_reserve(rdev->wb.wb_obj, false);
2305 if (unlikely(r != 0)) {
2306 r600_wb_fini(rdev);
2307 return r;
2308 }
2309 r = radeon_bo_pin(rdev->wb.wb_obj, RADEON_GEM_DOMAIN_GTT,
2310 &rdev->wb.gpu_addr);
2311 if (r) {
2312 radeon_bo_unreserve(rdev->wb.wb_obj);
2313 dev_warn(rdev->dev, "(%d) pin WB bo failed\n", r);
2314 r600_wb_fini(rdev);
2315 return r;
2316 }
2317 r = radeon_bo_kmap(rdev->wb.wb_obj, (void **)&rdev->wb.wb);
2318 radeon_bo_unreserve(rdev->wb.wb_obj);
2319 if (r) {
2320 dev_warn(rdev->dev, "(%d) map WB bo failed\n", r);
2321 r600_wb_fini(rdev);
2322 return r;
2323 }
2324 }
2325 WREG32(SCRATCH_ADDR, (rdev->wb.gpu_addr >> 8) & 0xFFFFFFFF);
2326 WREG32(CP_RB_RPTR_ADDR, (rdev->wb.gpu_addr + 1024) & 0xFFFFFFFC);
2327 WREG32(CP_RB_RPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + 1024) & 0xFF);
2328 WREG32(SCRATCH_UMSK, 0xff);
2329 return 0;
2330}
2331
2332void r600_fence_ring_emit(struct radeon_device *rdev, 2327void r600_fence_ring_emit(struct radeon_device *rdev,
2333 struct radeon_fence *fence) 2328 struct radeon_fence *fence)
2334{ 2329{
2335 /* Also consider EVENT_WRITE_EOP. it handles the interrupts + timestamps + events */ 2330 if (rdev->wb.use_event) {
2336 2331 u64 addr = rdev->wb.gpu_addr + R600_WB_EVENT_OFFSET +
2337 radeon_ring_write(rdev, PACKET3(PACKET3_EVENT_WRITE, 0)); 2332 (u64)(rdev->fence_drv.scratch_reg - rdev->scratch.reg_base);
2338 radeon_ring_write(rdev, CACHE_FLUSH_AND_INV_EVENT); 2333 /* EVENT_WRITE_EOP - flush caches, send int */
2339 /* wait for 3D idle clean */ 2334 radeon_ring_write(rdev, PACKET3(PACKET3_EVENT_WRITE_EOP, 4));
2340 radeon_ring_write(rdev, PACKET3(PACKET3_SET_CONFIG_REG, 1)); 2335 radeon_ring_write(rdev, EVENT_TYPE(CACHE_FLUSH_AND_INV_EVENT_TS) | EVENT_INDEX(5));
2341 radeon_ring_write(rdev, (WAIT_UNTIL - PACKET3_SET_CONFIG_REG_OFFSET) >> 2); 2336 radeon_ring_write(rdev, addr & 0xffffffff);
2342 radeon_ring_write(rdev, WAIT_3D_IDLE_bit | WAIT_3D_IDLECLEAN_bit); 2337 radeon_ring_write(rdev, (upper_32_bits(addr) & 0xff) | DATA_SEL(1) | INT_SEL(2));
2343 /* Emit fence sequence & fire IRQ */ 2338 radeon_ring_write(rdev, fence->seq);
2344 radeon_ring_write(rdev, PACKET3(PACKET3_SET_CONFIG_REG, 1)); 2339 radeon_ring_write(rdev, 0);
2345 radeon_ring_write(rdev, ((rdev->fence_drv.scratch_reg - PACKET3_SET_CONFIG_REG_OFFSET) >> 2)); 2340 } else {
2346 radeon_ring_write(rdev, fence->seq); 2341 radeon_ring_write(rdev, PACKET3(PACKET3_EVENT_WRITE, 0));
2347 /* CP_INTERRUPT packet 3 no longer exists, use packet 0 */ 2342 radeon_ring_write(rdev, EVENT_TYPE(CACHE_FLUSH_AND_INV_EVENT) | EVENT_INDEX(0));
2348 radeon_ring_write(rdev, PACKET0(CP_INT_STATUS, 0)); 2343 /* wait for 3D idle clean */
2349 radeon_ring_write(rdev, RB_INT_STAT); 2344 radeon_ring_write(rdev, PACKET3(PACKET3_SET_CONFIG_REG, 1));
2345 radeon_ring_write(rdev, (WAIT_UNTIL - PACKET3_SET_CONFIG_REG_OFFSET) >> 2);
2346 radeon_ring_write(rdev, WAIT_3D_IDLE_bit | WAIT_3D_IDLECLEAN_bit);
2347 /* Emit fence sequence & fire IRQ */
2348 radeon_ring_write(rdev, PACKET3(PACKET3_SET_CONFIG_REG, 1));
2349 radeon_ring_write(rdev, ((rdev->fence_drv.scratch_reg - PACKET3_SET_CONFIG_REG_OFFSET) >> 2));
2350 radeon_ring_write(rdev, fence->seq);
2351 /* CP_INTERRUPT packet 3 no longer exists, use packet 0 */
2352 radeon_ring_write(rdev, PACKET0(CP_INT_STATUS, 0));
2353 radeon_ring_write(rdev, RB_INT_STAT);
2354 }
2350} 2355}
2351 2356
2352int r600_copy_blit(struct radeon_device *rdev, 2357int r600_copy_blit(struct radeon_device *rdev,
@@ -2383,28 +2388,13 @@ void r600_clear_surface_reg(struct radeon_device *rdev, int reg)
2383 /* FIXME: implement */ 2388 /* FIXME: implement */
2384} 2389}
2385 2390
2386
2387bool r600_card_posted(struct radeon_device *rdev)
2388{
2389 uint32_t reg;
2390
2391 /* first check CRTCs */
2392 reg = RREG32(D1CRTC_CONTROL) |
2393 RREG32(D2CRTC_CONTROL);
2394 if (reg & CRTC_EN)
2395 return true;
2396
2397 /* then check MEM_SIZE, in case the crtcs are off */
2398 if (RREG32(CONFIG_MEMSIZE))
2399 return true;
2400
2401 return false;
2402}
2403
2404int r600_startup(struct radeon_device *rdev) 2391int r600_startup(struct radeon_device *rdev)
2405{ 2392{
2406 int r; 2393 int r;
2407 2394
2395 /* enable pcie gen2 link */
2396 r600_pcie_gen2_enable(rdev);
2397
2408 if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) { 2398 if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) {
2409 r = r600_init_microcode(rdev); 2399 r = r600_init_microcode(rdev);
2410 if (r) { 2400 if (r) {
@@ -2428,19 +2418,12 @@ int r600_startup(struct radeon_device *rdev)
2428 rdev->asic->copy = NULL; 2418 rdev->asic->copy = NULL;
2429 dev_warn(rdev->dev, "failed blitter (%d) falling back to memcpy\n", r); 2419 dev_warn(rdev->dev, "failed blitter (%d) falling back to memcpy\n", r);
2430 } 2420 }
2431 /* pin copy shader into vram */ 2421
2432 if (rdev->r600_blit.shader_obj) { 2422 /* allocate wb buffer */
2433 r = radeon_bo_reserve(rdev->r600_blit.shader_obj, false); 2423 r = radeon_wb_init(rdev);
2434 if (unlikely(r != 0)) 2424 if (r)
2435 return r; 2425 return r;
2436 r = radeon_bo_pin(rdev->r600_blit.shader_obj, RADEON_GEM_DOMAIN_VRAM, 2426
2437 &rdev->r600_blit.shader_gpu_addr);
2438 radeon_bo_unreserve(rdev->r600_blit.shader_obj);
2439 if (r) {
2440 dev_err(rdev->dev, "(%d) pin blit object failed\n", r);
2441 return r;
2442 }
2443 }
2444 /* Enable IRQ */ 2427 /* Enable IRQ */
2445 r = r600_irq_init(rdev); 2428 r = r600_irq_init(rdev);
2446 if (r) { 2429 if (r) {
@@ -2459,8 +2442,7 @@ int r600_startup(struct radeon_device *rdev)
2459 r = r600_cp_resume(rdev); 2442 r = r600_cp_resume(rdev);
2460 if (r) 2443 if (r)
2461 return r; 2444 return r;
2462 /* write back buffer are not vital so don't worry about failure */ 2445
2463 r600_wb_enable(rdev);
2464 return 0; 2446 return 0;
2465} 2447}
2466 2448
@@ -2497,7 +2479,7 @@ int r600_resume(struct radeon_device *rdev)
2497 2479
2498 r = r600_ib_test(rdev); 2480 r = r600_ib_test(rdev);
2499 if (r) { 2481 if (r) {
2500 DRM_ERROR("radeon: failled testing IB (%d).\n", r); 2482 DRM_ERROR("radeon: failed testing IB (%d).\n", r);
2501 return r; 2483 return r;
2502 } 2484 }
2503 2485
@@ -2519,7 +2501,7 @@ int r600_suspend(struct radeon_device *rdev)
2519 r600_cp_stop(rdev); 2501 r600_cp_stop(rdev);
2520 rdev->cp.ready = false; 2502 rdev->cp.ready = false;
2521 r600_irq_suspend(rdev); 2503 r600_irq_suspend(rdev);
2522 r600_wb_disable(rdev); 2504 radeon_wb_disable(rdev);
2523 r600_pcie_gart_disable(rdev); 2505 r600_pcie_gart_disable(rdev);
2524 /* unpin shaders bo */ 2506 /* unpin shaders bo */
2525 if (rdev->r600_blit.shader_obj) { 2507 if (rdev->r600_blit.shader_obj) {
@@ -2542,9 +2524,6 @@ int r600_init(struct radeon_device *rdev)
2542{ 2524{
2543 int r; 2525 int r;
2544 2526
2545 r = radeon_dummy_page_init(rdev);
2546 if (r)
2547 return r;
2548 if (r600_debugfs_mc_info_init(rdev)) { 2527 if (r600_debugfs_mc_info_init(rdev)) {
2549 DRM_ERROR("Failed to register debugfs file for mc !\n"); 2528 DRM_ERROR("Failed to register debugfs file for mc !\n");
2550 } 2529 }
@@ -2566,7 +2545,7 @@ int r600_init(struct radeon_device *rdev)
2566 if (r) 2545 if (r)
2567 return r; 2546 return r;
2568 /* Post card if necessary */ 2547 /* Post card if necessary */
2569 if (!r600_card_posted(rdev)) { 2548 if (!radeon_card_posted(rdev)) {
2570 if (!rdev->bios) { 2549 if (!rdev->bios) {
2571 dev_err(rdev->dev, "Card not posted and no BIOS - ignoring\n"); 2550 dev_err(rdev->dev, "Card not posted and no BIOS - ignoring\n");
2572 return -EINVAL; 2551 return -EINVAL;
@@ -2616,8 +2595,8 @@ int r600_init(struct radeon_device *rdev)
2616 if (r) { 2595 if (r) {
2617 dev_err(rdev->dev, "disabling GPU acceleration\n"); 2596 dev_err(rdev->dev, "disabling GPU acceleration\n");
2618 r600_cp_fini(rdev); 2597 r600_cp_fini(rdev);
2619 r600_wb_fini(rdev);
2620 r600_irq_fini(rdev); 2598 r600_irq_fini(rdev);
2599 radeon_wb_fini(rdev);
2621 radeon_irq_kms_fini(rdev); 2600 radeon_irq_kms_fini(rdev);
2622 r600_pcie_gart_fini(rdev); 2601 r600_pcie_gart_fini(rdev);
2623 rdev->accel_working = false; 2602 rdev->accel_working = false;
@@ -2647,8 +2626,9 @@ void r600_fini(struct radeon_device *rdev)
2647 r600_audio_fini(rdev); 2626 r600_audio_fini(rdev);
2648 r600_blit_fini(rdev); 2627 r600_blit_fini(rdev);
2649 r600_cp_fini(rdev); 2628 r600_cp_fini(rdev);
2650 r600_wb_fini(rdev);
2651 r600_irq_fini(rdev); 2629 r600_irq_fini(rdev);
2630 radeon_wb_fini(rdev);
2631 radeon_ib_pool_fini(rdev);
2652 radeon_irq_kms_fini(rdev); 2632 radeon_irq_kms_fini(rdev);
2653 r600_pcie_gart_fini(rdev); 2633 r600_pcie_gart_fini(rdev);
2654 radeon_agp_fini(rdev); 2634 radeon_agp_fini(rdev);
@@ -2658,7 +2638,6 @@ void r600_fini(struct radeon_device *rdev)
2658 radeon_atombios_fini(rdev); 2638 radeon_atombios_fini(rdev);
2659 kfree(rdev->bios); 2639 kfree(rdev->bios);
2660 rdev->bios = NULL; 2640 rdev->bios = NULL;
2661 radeon_dummy_page_fini(rdev);
2662} 2641}
2663 2642
2664 2643
@@ -2669,7 +2648,11 @@ void r600_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib)
2669{ 2648{
2670 /* FIXME: implement */ 2649 /* FIXME: implement */
2671 radeon_ring_write(rdev, PACKET3(PACKET3_INDIRECT_BUFFER, 2)); 2650 radeon_ring_write(rdev, PACKET3(PACKET3_INDIRECT_BUFFER, 2));
2672 radeon_ring_write(rdev, ib->gpu_addr & 0xFFFFFFFC); 2651 radeon_ring_write(rdev,
2652#ifdef __BIG_ENDIAN
2653 (2 << 0) |
2654#endif
2655 (ib->gpu_addr & 0xFFFFFFFC));
2673 radeon_ring_write(rdev, upper_32_bits(ib->gpu_addr) & 0xFF); 2656 radeon_ring_write(rdev, upper_32_bits(ib->gpu_addr) & 0xFF);
2674 radeon_ring_write(rdev, ib->length_dw); 2657 radeon_ring_write(rdev, ib->length_dw);
2675} 2658}
@@ -2769,8 +2752,8 @@ static int r600_ih_ring_alloc(struct radeon_device *rdev)
2769 2752
2770 /* Allocate ring buffer */ 2753 /* Allocate ring buffer */
2771 if (rdev->ih.ring_obj == NULL) { 2754 if (rdev->ih.ring_obj == NULL) {
2772 r = radeon_bo_create(rdev, NULL, rdev->ih.ring_size, 2755 r = radeon_bo_create(rdev, rdev->ih.ring_size,
2773 true, 2756 PAGE_SIZE, true,
2774 RADEON_GEM_DOMAIN_GTT, 2757 RADEON_GEM_DOMAIN_GTT,
2775 &rdev->ih.ring_obj); 2758 &rdev->ih.ring_obj);
2776 if (r) { 2759 if (r) {
@@ -2850,13 +2833,20 @@ static int r600_rlc_init(struct radeon_device *rdev)
2850 WREG32(RLC_HB_CNTL, 0); 2833 WREG32(RLC_HB_CNTL, 0);
2851 WREG32(RLC_HB_RPTR, 0); 2834 WREG32(RLC_HB_RPTR, 0);
2852 WREG32(RLC_HB_WPTR, 0); 2835 WREG32(RLC_HB_WPTR, 0);
2853 WREG32(RLC_HB_WPTR_LSB_ADDR, 0); 2836 if (rdev->family <= CHIP_CAICOS) {
2854 WREG32(RLC_HB_WPTR_MSB_ADDR, 0); 2837 WREG32(RLC_HB_WPTR_LSB_ADDR, 0);
2838 WREG32(RLC_HB_WPTR_MSB_ADDR, 0);
2839 }
2855 WREG32(RLC_MC_CNTL, 0); 2840 WREG32(RLC_MC_CNTL, 0);
2856 WREG32(RLC_UCODE_CNTL, 0); 2841 WREG32(RLC_UCODE_CNTL, 0);
2857 2842
2858 fw_data = (const __be32 *)rdev->rlc_fw->data; 2843 fw_data = (const __be32 *)rdev->rlc_fw->data;
2859 if (rdev->family >= CHIP_CEDAR) { 2844 if (rdev->family >= CHIP_CAYMAN) {
2845 for (i = 0; i < CAYMAN_RLC_UCODE_SIZE; i++) {
2846 WREG32(RLC_UCODE_ADDR, i);
2847 WREG32(RLC_UCODE_DATA, be32_to_cpup(fw_data++));
2848 }
2849 } else if (rdev->family >= CHIP_CEDAR) {
2860 for (i = 0; i < EVERGREEN_RLC_UCODE_SIZE; i++) { 2850 for (i = 0; i < EVERGREEN_RLC_UCODE_SIZE; i++) {
2861 WREG32(RLC_UCODE_ADDR, i); 2851 WREG32(RLC_UCODE_ADDR, i);
2862 WREG32(RLC_UCODE_DATA, be32_to_cpup(fw_data++)); 2852 WREG32(RLC_UCODE_DATA, be32_to_cpup(fw_data++));
@@ -2915,6 +2905,8 @@ static void r600_disable_interrupt_state(struct radeon_device *rdev)
2915 WREG32(CP_INT_CNTL, CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE); 2905 WREG32(CP_INT_CNTL, CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
2916 WREG32(GRBM_INT_CNTL, 0); 2906 WREG32(GRBM_INT_CNTL, 0);
2917 WREG32(DxMODE_INT_MASK, 0); 2907 WREG32(DxMODE_INT_MASK, 0);
2908 WREG32(D1GRPH_INTERRUPT_CONTROL, 0);
2909 WREG32(D2GRPH_INTERRUPT_CONTROL, 0);
2918 if (ASIC_IS_DCE3(rdev)) { 2910 if (ASIC_IS_DCE3(rdev)) {
2919 WREG32(DCE3_DACA_AUTODETECT_INT_CONTROL, 0); 2911 WREG32(DCE3_DACA_AUTODETECT_INT_CONTROL, 0);
2920 WREG32(DCE3_DACB_AUTODETECT_INT_CONTROL, 0); 2912 WREG32(DCE3_DACB_AUTODETECT_INT_CONTROL, 0);
@@ -2983,10 +2975,13 @@ int r600_irq_init(struct radeon_device *rdev)
2983 ih_rb_cntl = (IH_WPTR_OVERFLOW_ENABLE | 2975 ih_rb_cntl = (IH_WPTR_OVERFLOW_ENABLE |
2984 IH_WPTR_OVERFLOW_CLEAR | 2976 IH_WPTR_OVERFLOW_CLEAR |
2985 (rb_bufsz << 1)); 2977 (rb_bufsz << 1));
2986 /* WPTR writeback, not yet */ 2978
2987 /*ih_rb_cntl |= IH_WPTR_WRITEBACK_ENABLE;*/ 2979 if (rdev->wb.enabled)
2988 WREG32(IH_RB_WPTR_ADDR_LO, 0); 2980 ih_rb_cntl |= IH_WPTR_WRITEBACK_ENABLE;
2989 WREG32(IH_RB_WPTR_ADDR_HI, 0); 2981
2982 /* set the writeback address whether it's enabled or not */
2983 WREG32(IH_RB_WPTR_ADDR_LO, (rdev->wb.gpu_addr + R600_WB_IH_WPTR_OFFSET) & 0xFFFFFFFC);
2984 WREG32(IH_RB_WPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + R600_WB_IH_WPTR_OFFSET) & 0xFF);
2990 2985
2991 WREG32(IH_RB_CNTL, ih_rb_cntl); 2986 WREG32(IH_RB_CNTL, ih_rb_cntl);
2992 2987
@@ -3036,9 +3031,10 @@ int r600_irq_set(struct radeon_device *rdev)
3036 u32 hpd1, hpd2, hpd3, hpd4 = 0, hpd5 = 0, hpd6 = 0; 3031 u32 hpd1, hpd2, hpd3, hpd4 = 0, hpd5 = 0, hpd6 = 0;
3037 u32 grbm_int_cntl = 0; 3032 u32 grbm_int_cntl = 0;
3038 u32 hdmi1, hdmi2; 3033 u32 hdmi1, hdmi2;
3034 u32 d1grph = 0, d2grph = 0;
3039 3035
3040 if (!rdev->irq.installed) { 3036 if (!rdev->irq.installed) {
3041 WARN(1, "Can't enable IRQ/MSI because no handler is installed.\n"); 3037 WARN(1, "Can't enable IRQ/MSI because no handler is installed\n");
3042 return -EINVAL; 3038 return -EINVAL;
3043 } 3039 }
3044 /* don't enable anything if the ih is disabled */ 3040 /* don't enable anything if the ih is disabled */
@@ -3070,12 +3066,15 @@ int r600_irq_set(struct radeon_device *rdev)
3070 if (rdev->irq.sw_int) { 3066 if (rdev->irq.sw_int) {
3071 DRM_DEBUG("r600_irq_set: sw int\n"); 3067 DRM_DEBUG("r600_irq_set: sw int\n");
3072 cp_int_cntl |= RB_INT_ENABLE; 3068 cp_int_cntl |= RB_INT_ENABLE;
3069 cp_int_cntl |= TIME_STAMP_INT_ENABLE;
3073 } 3070 }
3074 if (rdev->irq.crtc_vblank_int[0]) { 3071 if (rdev->irq.crtc_vblank_int[0] ||
3072 rdev->irq.pflip[0]) {
3075 DRM_DEBUG("r600_irq_set: vblank 0\n"); 3073 DRM_DEBUG("r600_irq_set: vblank 0\n");
3076 mode_int |= D1MODE_VBLANK_INT_MASK; 3074 mode_int |= D1MODE_VBLANK_INT_MASK;
3077 } 3075 }
3078 if (rdev->irq.crtc_vblank_int[1]) { 3076 if (rdev->irq.crtc_vblank_int[1] ||
3077 rdev->irq.pflip[1]) {
3079 DRM_DEBUG("r600_irq_set: vblank 1\n"); 3078 DRM_DEBUG("r600_irq_set: vblank 1\n");
3080 mode_int |= D2MODE_VBLANK_INT_MASK; 3079 mode_int |= D2MODE_VBLANK_INT_MASK;
3081 } 3080 }
@@ -3118,6 +3117,8 @@ int r600_irq_set(struct radeon_device *rdev)
3118 3117
3119 WREG32(CP_INT_CNTL, cp_int_cntl); 3118 WREG32(CP_INT_CNTL, cp_int_cntl);
3120 WREG32(DxMODE_INT_MASK, mode_int); 3119 WREG32(DxMODE_INT_MASK, mode_int);
3120 WREG32(D1GRPH_INTERRUPT_CONTROL, d1grph);
3121 WREG32(D2GRPH_INTERRUPT_CONTROL, d2grph);
3121 WREG32(GRBM_INT_CNTL, grbm_int_cntl); 3122 WREG32(GRBM_INT_CNTL, grbm_int_cntl);
3122 WREG32(R600_HDMI_BLOCK1 + R600_HDMI_CNTL, hdmi1); 3123 WREG32(R600_HDMI_BLOCK1 + R600_HDMI_CNTL, hdmi1);
3123 if (ASIC_IS_DCE3(rdev)) { 3124 if (ASIC_IS_DCE3(rdev)) {
@@ -3140,32 +3141,35 @@ int r600_irq_set(struct radeon_device *rdev)
3140 return 0; 3141 return 0;
3141} 3142}
3142 3143
3143static inline void r600_irq_ack(struct radeon_device *rdev, 3144static inline void r600_irq_ack(struct radeon_device *rdev)
3144 u32 *disp_int,
3145 u32 *disp_int_cont,
3146 u32 *disp_int_cont2)
3147{ 3145{
3148 u32 tmp; 3146 u32 tmp;
3149 3147
3150 if (ASIC_IS_DCE3(rdev)) { 3148 if (ASIC_IS_DCE3(rdev)) {
3151 *disp_int = RREG32(DCE3_DISP_INTERRUPT_STATUS); 3149 rdev->irq.stat_regs.r600.disp_int = RREG32(DCE3_DISP_INTERRUPT_STATUS);
3152 *disp_int_cont = RREG32(DCE3_DISP_INTERRUPT_STATUS_CONTINUE); 3150 rdev->irq.stat_regs.r600.disp_int_cont = RREG32(DCE3_DISP_INTERRUPT_STATUS_CONTINUE);
3153 *disp_int_cont2 = RREG32(DCE3_DISP_INTERRUPT_STATUS_CONTINUE2); 3151 rdev->irq.stat_regs.r600.disp_int_cont2 = RREG32(DCE3_DISP_INTERRUPT_STATUS_CONTINUE2);
3154 } else { 3152 } else {
3155 *disp_int = RREG32(DISP_INTERRUPT_STATUS); 3153 rdev->irq.stat_regs.r600.disp_int = RREG32(DISP_INTERRUPT_STATUS);
3156 *disp_int_cont = RREG32(DISP_INTERRUPT_STATUS_CONTINUE); 3154 rdev->irq.stat_regs.r600.disp_int_cont = RREG32(DISP_INTERRUPT_STATUS_CONTINUE);
3157 *disp_int_cont2 = 0; 3155 rdev->irq.stat_regs.r600.disp_int_cont2 = 0;
3158 } 3156 }
3159 3157 rdev->irq.stat_regs.r600.d1grph_int = RREG32(D1GRPH_INTERRUPT_STATUS);
3160 if (*disp_int & LB_D1_VBLANK_INTERRUPT) 3158 rdev->irq.stat_regs.r600.d2grph_int = RREG32(D2GRPH_INTERRUPT_STATUS);
3159
3160 if (rdev->irq.stat_regs.r600.d1grph_int & DxGRPH_PFLIP_INT_OCCURRED)
3161 WREG32(D1GRPH_INTERRUPT_STATUS, DxGRPH_PFLIP_INT_CLEAR);
3162 if (rdev->irq.stat_regs.r600.d2grph_int & DxGRPH_PFLIP_INT_OCCURRED)
3163 WREG32(D2GRPH_INTERRUPT_STATUS, DxGRPH_PFLIP_INT_CLEAR);
3164 if (rdev->irq.stat_regs.r600.disp_int & LB_D1_VBLANK_INTERRUPT)
3161 WREG32(D1MODE_VBLANK_STATUS, DxMODE_VBLANK_ACK); 3165 WREG32(D1MODE_VBLANK_STATUS, DxMODE_VBLANK_ACK);
3162 if (*disp_int & LB_D1_VLINE_INTERRUPT) 3166 if (rdev->irq.stat_regs.r600.disp_int & LB_D1_VLINE_INTERRUPT)
3163 WREG32(D1MODE_VLINE_STATUS, DxMODE_VLINE_ACK); 3167 WREG32(D1MODE_VLINE_STATUS, DxMODE_VLINE_ACK);
3164 if (*disp_int & LB_D2_VBLANK_INTERRUPT) 3168 if (rdev->irq.stat_regs.r600.disp_int & LB_D2_VBLANK_INTERRUPT)
3165 WREG32(D2MODE_VBLANK_STATUS, DxMODE_VBLANK_ACK); 3169 WREG32(D2MODE_VBLANK_STATUS, DxMODE_VBLANK_ACK);
3166 if (*disp_int & LB_D2_VLINE_INTERRUPT) 3170 if (rdev->irq.stat_regs.r600.disp_int & LB_D2_VLINE_INTERRUPT)
3167 WREG32(D2MODE_VLINE_STATUS, DxMODE_VLINE_ACK); 3171 WREG32(D2MODE_VLINE_STATUS, DxMODE_VLINE_ACK);
3168 if (*disp_int & DC_HPD1_INTERRUPT) { 3172 if (rdev->irq.stat_regs.r600.disp_int & DC_HPD1_INTERRUPT) {
3169 if (ASIC_IS_DCE3(rdev)) { 3173 if (ASIC_IS_DCE3(rdev)) {
3170 tmp = RREG32(DC_HPD1_INT_CONTROL); 3174 tmp = RREG32(DC_HPD1_INT_CONTROL);
3171 tmp |= DC_HPDx_INT_ACK; 3175 tmp |= DC_HPDx_INT_ACK;
@@ -3176,7 +3180,7 @@ static inline void r600_irq_ack(struct radeon_device *rdev,
3176 WREG32(DC_HOT_PLUG_DETECT1_INT_CONTROL, tmp); 3180 WREG32(DC_HOT_PLUG_DETECT1_INT_CONTROL, tmp);
3177 } 3181 }
3178 } 3182 }
3179 if (*disp_int & DC_HPD2_INTERRUPT) { 3183 if (rdev->irq.stat_regs.r600.disp_int & DC_HPD2_INTERRUPT) {
3180 if (ASIC_IS_DCE3(rdev)) { 3184 if (ASIC_IS_DCE3(rdev)) {
3181 tmp = RREG32(DC_HPD2_INT_CONTROL); 3185 tmp = RREG32(DC_HPD2_INT_CONTROL);
3182 tmp |= DC_HPDx_INT_ACK; 3186 tmp |= DC_HPDx_INT_ACK;
@@ -3187,7 +3191,7 @@ static inline void r600_irq_ack(struct radeon_device *rdev,
3187 WREG32(DC_HOT_PLUG_DETECT2_INT_CONTROL, tmp); 3191 WREG32(DC_HOT_PLUG_DETECT2_INT_CONTROL, tmp);
3188 } 3192 }
3189 } 3193 }
3190 if (*disp_int_cont & DC_HPD3_INTERRUPT) { 3194 if (rdev->irq.stat_regs.r600.disp_int_cont & DC_HPD3_INTERRUPT) {
3191 if (ASIC_IS_DCE3(rdev)) { 3195 if (ASIC_IS_DCE3(rdev)) {
3192 tmp = RREG32(DC_HPD3_INT_CONTROL); 3196 tmp = RREG32(DC_HPD3_INT_CONTROL);
3193 tmp |= DC_HPDx_INT_ACK; 3197 tmp |= DC_HPDx_INT_ACK;
@@ -3198,18 +3202,18 @@ static inline void r600_irq_ack(struct radeon_device *rdev,
3198 WREG32(DC_HOT_PLUG_DETECT3_INT_CONTROL, tmp); 3202 WREG32(DC_HOT_PLUG_DETECT3_INT_CONTROL, tmp);
3199 } 3203 }
3200 } 3204 }
3201 if (*disp_int_cont & DC_HPD4_INTERRUPT) { 3205 if (rdev->irq.stat_regs.r600.disp_int_cont & DC_HPD4_INTERRUPT) {
3202 tmp = RREG32(DC_HPD4_INT_CONTROL); 3206 tmp = RREG32(DC_HPD4_INT_CONTROL);
3203 tmp |= DC_HPDx_INT_ACK; 3207 tmp |= DC_HPDx_INT_ACK;
3204 WREG32(DC_HPD4_INT_CONTROL, tmp); 3208 WREG32(DC_HPD4_INT_CONTROL, tmp);
3205 } 3209 }
3206 if (ASIC_IS_DCE32(rdev)) { 3210 if (ASIC_IS_DCE32(rdev)) {
3207 if (*disp_int_cont2 & DC_HPD5_INTERRUPT) { 3211 if (rdev->irq.stat_regs.r600.disp_int_cont2 & DC_HPD5_INTERRUPT) {
3208 tmp = RREG32(DC_HPD5_INT_CONTROL); 3212 tmp = RREG32(DC_HPD5_INT_CONTROL);
3209 tmp |= DC_HPDx_INT_ACK; 3213 tmp |= DC_HPDx_INT_ACK;
3210 WREG32(DC_HPD5_INT_CONTROL, tmp); 3214 WREG32(DC_HPD5_INT_CONTROL, tmp);
3211 } 3215 }
3212 if (*disp_int_cont2 & DC_HPD6_INTERRUPT) { 3216 if (rdev->irq.stat_regs.r600.disp_int_cont2 & DC_HPD6_INTERRUPT) {
3213 tmp = RREG32(DC_HPD5_INT_CONTROL); 3217 tmp = RREG32(DC_HPD5_INT_CONTROL);
3214 tmp |= DC_HPDx_INT_ACK; 3218 tmp |= DC_HPDx_INT_ACK;
3215 WREG32(DC_HPD6_INT_CONTROL, tmp); 3219 WREG32(DC_HPD6_INT_CONTROL, tmp);
@@ -3231,12 +3235,10 @@ static inline void r600_irq_ack(struct radeon_device *rdev,
3231 3235
3232void r600_irq_disable(struct radeon_device *rdev) 3236void r600_irq_disable(struct radeon_device *rdev)
3233{ 3237{
3234 u32 disp_int, disp_int_cont, disp_int_cont2;
3235
3236 r600_disable_interrupts(rdev); 3238 r600_disable_interrupts(rdev);
3237 /* Wait and acknowledge irq */ 3239 /* Wait and acknowledge irq */
3238 mdelay(1); 3240 mdelay(1);
3239 r600_irq_ack(rdev, &disp_int, &disp_int_cont, &disp_int_cont2); 3241 r600_irq_ack(rdev);
3240 r600_disable_interrupt_state(rdev); 3242 r600_disable_interrupt_state(rdev);
3241} 3243}
3242 3244
@@ -3244,8 +3246,10 @@ static inline u32 r600_get_ih_wptr(struct radeon_device *rdev)
3244{ 3246{
3245 u32 wptr, tmp; 3247 u32 wptr, tmp;
3246 3248
3247 /* XXX use writeback */ 3249 if (rdev->wb.enabled)
3248 wptr = RREG32(IH_RB_WPTR); 3250 wptr = le32_to_cpu(rdev->wb.wb[R600_WB_IH_WPTR_OFFSET/4]);
3251 else
3252 wptr = RREG32(IH_RB_WPTR);
3249 3253
3250 if (wptr & RB_OVERFLOW) { 3254 if (wptr & RB_OVERFLOW) {
3251 /* When a ring buffer overflow happen start parsing interrupt 3255 /* When a ring buffer overflow happen start parsing interrupt
@@ -3294,54 +3298,57 @@ static inline u32 r600_get_ih_wptr(struct radeon_device *rdev)
3294 3298
3295int r600_irq_process(struct radeon_device *rdev) 3299int r600_irq_process(struct radeon_device *rdev)
3296{ 3300{
3297 u32 wptr = r600_get_ih_wptr(rdev); 3301 u32 wptr;
3298 u32 rptr = rdev->ih.rptr; 3302 u32 rptr;
3299 u32 src_id, src_data; 3303 u32 src_id, src_data;
3300 u32 ring_index, disp_int, disp_int_cont, disp_int_cont2; 3304 u32 ring_index;
3301 unsigned long flags; 3305 unsigned long flags;
3302 bool queue_hotplug = false; 3306 bool queue_hotplug = false;
3303 3307
3304 DRM_DEBUG("r600_irq_process start: rptr %d, wptr %d\n", rptr, wptr); 3308 if (!rdev->ih.enabled || rdev->shutdown)
3305 if (!rdev->ih.enabled)
3306 return IRQ_NONE; 3309 return IRQ_NONE;
3307 3310
3311 wptr = r600_get_ih_wptr(rdev);
3312 rptr = rdev->ih.rptr;
3313 DRM_DEBUG("r600_irq_process start: rptr %d, wptr %d\n", rptr, wptr);
3314
3308 spin_lock_irqsave(&rdev->ih.lock, flags); 3315 spin_lock_irqsave(&rdev->ih.lock, flags);
3309 3316
3310 if (rptr == wptr) { 3317 if (rptr == wptr) {
3311 spin_unlock_irqrestore(&rdev->ih.lock, flags); 3318 spin_unlock_irqrestore(&rdev->ih.lock, flags);
3312 return IRQ_NONE; 3319 return IRQ_NONE;
3313 } 3320 }
3314 if (rdev->shutdown) {
3315 spin_unlock_irqrestore(&rdev->ih.lock, flags);
3316 return IRQ_NONE;
3317 }
3318 3321
3319restart_ih: 3322restart_ih:
3320 /* display interrupts */ 3323 /* display interrupts */
3321 r600_irq_ack(rdev, &disp_int, &disp_int_cont, &disp_int_cont2); 3324 r600_irq_ack(rdev);
3322 3325
3323 rdev->ih.wptr = wptr; 3326 rdev->ih.wptr = wptr;
3324 while (rptr != wptr) { 3327 while (rptr != wptr) {
3325 /* wptr/rptr are in bytes! */ 3328 /* wptr/rptr are in bytes! */
3326 ring_index = rptr / 4; 3329 ring_index = rptr / 4;
3327 src_id = rdev->ih.ring[ring_index] & 0xff; 3330 src_id = le32_to_cpu(rdev->ih.ring[ring_index]) & 0xff;
3328 src_data = rdev->ih.ring[ring_index + 1] & 0xfffffff; 3331 src_data = le32_to_cpu(rdev->ih.ring[ring_index + 1]) & 0xfffffff;
3329 3332
3330 switch (src_id) { 3333 switch (src_id) {
3331 case 1: /* D1 vblank/vline */ 3334 case 1: /* D1 vblank/vline */
3332 switch (src_data) { 3335 switch (src_data) {
3333 case 0: /* D1 vblank */ 3336 case 0: /* D1 vblank */
3334 if (disp_int & LB_D1_VBLANK_INTERRUPT) { 3337 if (rdev->irq.stat_regs.r600.disp_int & LB_D1_VBLANK_INTERRUPT) {
3335 drm_handle_vblank(rdev->ddev, 0); 3338 if (rdev->irq.crtc_vblank_int[0]) {
3336 rdev->pm.vblank_sync = true; 3339 drm_handle_vblank(rdev->ddev, 0);
3337 wake_up(&rdev->irq.vblank_queue); 3340 rdev->pm.vblank_sync = true;
3338 disp_int &= ~LB_D1_VBLANK_INTERRUPT; 3341 wake_up(&rdev->irq.vblank_queue);
3342 }
3343 if (rdev->irq.pflip[0])
3344 radeon_crtc_handle_flip(rdev, 0);
3345 rdev->irq.stat_regs.r600.disp_int &= ~LB_D1_VBLANK_INTERRUPT;
3339 DRM_DEBUG("IH: D1 vblank\n"); 3346 DRM_DEBUG("IH: D1 vblank\n");
3340 } 3347 }
3341 break; 3348 break;
3342 case 1: /* D1 vline */ 3349 case 1: /* D1 vline */
3343 if (disp_int & LB_D1_VLINE_INTERRUPT) { 3350 if (rdev->irq.stat_regs.r600.disp_int & LB_D1_VLINE_INTERRUPT) {
3344 disp_int &= ~LB_D1_VLINE_INTERRUPT; 3351 rdev->irq.stat_regs.r600.disp_int &= ~LB_D1_VLINE_INTERRUPT;
3345 DRM_DEBUG("IH: D1 vline\n"); 3352 DRM_DEBUG("IH: D1 vline\n");
3346 } 3353 }
3347 break; 3354 break;
@@ -3353,17 +3360,21 @@ restart_ih:
3353 case 5: /* D2 vblank/vline */ 3360 case 5: /* D2 vblank/vline */
3354 switch (src_data) { 3361 switch (src_data) {
3355 case 0: /* D2 vblank */ 3362 case 0: /* D2 vblank */
3356 if (disp_int & LB_D2_VBLANK_INTERRUPT) { 3363 if (rdev->irq.stat_regs.r600.disp_int & LB_D2_VBLANK_INTERRUPT) {
3357 drm_handle_vblank(rdev->ddev, 1); 3364 if (rdev->irq.crtc_vblank_int[1]) {
3358 rdev->pm.vblank_sync = true; 3365 drm_handle_vblank(rdev->ddev, 1);
3359 wake_up(&rdev->irq.vblank_queue); 3366 rdev->pm.vblank_sync = true;
3360 disp_int &= ~LB_D2_VBLANK_INTERRUPT; 3367 wake_up(&rdev->irq.vblank_queue);
3368 }
3369 if (rdev->irq.pflip[1])
3370 radeon_crtc_handle_flip(rdev, 1);
3371 rdev->irq.stat_regs.r600.disp_int &= ~LB_D2_VBLANK_INTERRUPT;
3361 DRM_DEBUG("IH: D2 vblank\n"); 3372 DRM_DEBUG("IH: D2 vblank\n");
3362 } 3373 }
3363 break; 3374 break;
3364 case 1: /* D1 vline */ 3375 case 1: /* D1 vline */
3365 if (disp_int & LB_D2_VLINE_INTERRUPT) { 3376 if (rdev->irq.stat_regs.r600.disp_int & LB_D2_VLINE_INTERRUPT) {
3366 disp_int &= ~LB_D2_VLINE_INTERRUPT; 3377 rdev->irq.stat_regs.r600.disp_int &= ~LB_D2_VLINE_INTERRUPT;
3367 DRM_DEBUG("IH: D2 vline\n"); 3378 DRM_DEBUG("IH: D2 vline\n");
3368 } 3379 }
3369 break; 3380 break;
@@ -3375,43 +3386,43 @@ restart_ih:
3375 case 19: /* HPD/DAC hotplug */ 3386 case 19: /* HPD/DAC hotplug */
3376 switch (src_data) { 3387 switch (src_data) {
3377 case 0: 3388 case 0:
3378 if (disp_int & DC_HPD1_INTERRUPT) { 3389 if (rdev->irq.stat_regs.r600.disp_int & DC_HPD1_INTERRUPT) {
3379 disp_int &= ~DC_HPD1_INTERRUPT; 3390 rdev->irq.stat_regs.r600.disp_int &= ~DC_HPD1_INTERRUPT;
3380 queue_hotplug = true; 3391 queue_hotplug = true;
3381 DRM_DEBUG("IH: HPD1\n"); 3392 DRM_DEBUG("IH: HPD1\n");
3382 } 3393 }
3383 break; 3394 break;
3384 case 1: 3395 case 1:
3385 if (disp_int & DC_HPD2_INTERRUPT) { 3396 if (rdev->irq.stat_regs.r600.disp_int & DC_HPD2_INTERRUPT) {
3386 disp_int &= ~DC_HPD2_INTERRUPT; 3397 rdev->irq.stat_regs.r600.disp_int &= ~DC_HPD2_INTERRUPT;
3387 queue_hotplug = true; 3398 queue_hotplug = true;
3388 DRM_DEBUG("IH: HPD2\n"); 3399 DRM_DEBUG("IH: HPD2\n");
3389 } 3400 }
3390 break; 3401 break;
3391 case 4: 3402 case 4:
3392 if (disp_int_cont & DC_HPD3_INTERRUPT) { 3403 if (rdev->irq.stat_regs.r600.disp_int_cont & DC_HPD3_INTERRUPT) {
3393 disp_int_cont &= ~DC_HPD3_INTERRUPT; 3404 rdev->irq.stat_regs.r600.disp_int_cont &= ~DC_HPD3_INTERRUPT;
3394 queue_hotplug = true; 3405 queue_hotplug = true;
3395 DRM_DEBUG("IH: HPD3\n"); 3406 DRM_DEBUG("IH: HPD3\n");
3396 } 3407 }
3397 break; 3408 break;
3398 case 5: 3409 case 5:
3399 if (disp_int_cont & DC_HPD4_INTERRUPT) { 3410 if (rdev->irq.stat_regs.r600.disp_int_cont & DC_HPD4_INTERRUPT) {
3400 disp_int_cont &= ~DC_HPD4_INTERRUPT; 3411 rdev->irq.stat_regs.r600.disp_int_cont &= ~DC_HPD4_INTERRUPT;
3401 queue_hotplug = true; 3412 queue_hotplug = true;
3402 DRM_DEBUG("IH: HPD4\n"); 3413 DRM_DEBUG("IH: HPD4\n");
3403 } 3414 }
3404 break; 3415 break;
3405 case 10: 3416 case 10:
3406 if (disp_int_cont2 & DC_HPD5_INTERRUPT) { 3417 if (rdev->irq.stat_regs.r600.disp_int_cont2 & DC_HPD5_INTERRUPT) {
3407 disp_int_cont2 &= ~DC_HPD5_INTERRUPT; 3418 rdev->irq.stat_regs.r600.disp_int_cont2 &= ~DC_HPD5_INTERRUPT;
3408 queue_hotplug = true; 3419 queue_hotplug = true;
3409 DRM_DEBUG("IH: HPD5\n"); 3420 DRM_DEBUG("IH: HPD5\n");
3410 } 3421 }
3411 break; 3422 break;
3412 case 12: 3423 case 12:
3413 if (disp_int_cont2 & DC_HPD6_INTERRUPT) { 3424 if (rdev->irq.stat_regs.r600.disp_int_cont2 & DC_HPD6_INTERRUPT) {
3414 disp_int_cont2 &= ~DC_HPD6_INTERRUPT; 3425 rdev->irq.stat_regs.r600.disp_int_cont2 &= ~DC_HPD6_INTERRUPT;
3415 queue_hotplug = true; 3426 queue_hotplug = true;
3416 DRM_DEBUG("IH: HPD6\n"); 3427 DRM_DEBUG("IH: HPD6\n");
3417 } 3428 }
@@ -3433,9 +3444,10 @@ restart_ih:
3433 break; 3444 break;
3434 case 181: /* CP EOP event */ 3445 case 181: /* CP EOP event */
3435 DRM_DEBUG("IH: CP EOP\n"); 3446 DRM_DEBUG("IH: CP EOP\n");
3447 radeon_fence_process(rdev);
3436 break; 3448 break;
3437 case 233: /* GUI IDLE */ 3449 case 233: /* GUI IDLE */
3438 DRM_DEBUG("IH: CP EOP\n"); 3450 DRM_DEBUG("IH: GUI idle\n");
3439 rdev->pm.gui_idle = true; 3451 rdev->pm.gui_idle = true;
3440 wake_up(&rdev->irq.idle_queue); 3452 wake_up(&rdev->irq.idle_queue);
3441 break; 3453 break;
@@ -3453,7 +3465,7 @@ restart_ih:
3453 if (wptr != rdev->ih.wptr) 3465 if (wptr != rdev->ih.wptr)
3454 goto restart_ih; 3466 goto restart_ih;
3455 if (queue_hotplug) 3467 if (queue_hotplug)
3456 queue_work(rdev->wq, &rdev->hotplug_work); 3468 schedule_work(&rdev->hotplug_work);
3457 rdev->ih.rptr = rptr; 3469 rdev->ih.rptr = rptr;
3458 WREG32(IH_RB_RPTR, rdev->ih.rptr); 3470 WREG32(IH_RB_RPTR, rdev->ih.rptr);
3459 spin_unlock_irqrestore(&rdev->ih.lock, flags); 3471 spin_unlock_irqrestore(&rdev->ih.lock, flags);
@@ -3528,10 +3540,12 @@ int r600_debugfs_mc_info_init(struct radeon_device *rdev)
3528void r600_ioctl_wait_idle(struct radeon_device *rdev, struct radeon_bo *bo) 3540void r600_ioctl_wait_idle(struct radeon_device *rdev, struct radeon_bo *bo)
3529{ 3541{
3530 /* r7xx hw bug. write to HDP_DEBUG1 followed by fb read 3542 /* r7xx hw bug. write to HDP_DEBUG1 followed by fb read
3531 * rather than write to HDP_REG_COHERENCY_FLUSH_CNTL 3543 * rather than write to HDP_REG_COHERENCY_FLUSH_CNTL.
3544 * This seems to cause problems on some AGP cards. Just use the old
3545 * method for them.
3532 */ 3546 */
3533 if ((rdev->family >= CHIP_RV770) && (rdev->family <= CHIP_RV740) && 3547 if ((rdev->family >= CHIP_RV770) && (rdev->family <= CHIP_RV740) &&
3534 rdev->vram_scratch.ptr) { 3548 rdev->vram_scratch.ptr && !(rdev->flags & RADEON_IS_AGP)) {
3535 void __iomem *ptr = (void *)rdev->vram_scratch.ptr; 3549 void __iomem *ptr = (void *)rdev->vram_scratch.ptr;
3536 u32 tmp; 3550 u32 tmp;
3537 3551
@@ -3540,3 +3554,222 @@ void r600_ioctl_wait_idle(struct radeon_device *rdev, struct radeon_bo *bo)
3540 } else 3554 } else
3541 WREG32(R_005480_HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1); 3555 WREG32(R_005480_HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1);
3542} 3556}
3557
3558void r600_set_pcie_lanes(struct radeon_device *rdev, int lanes)
3559{
3560 u32 link_width_cntl, mask, target_reg;
3561
3562 if (rdev->flags & RADEON_IS_IGP)
3563 return;
3564
3565 if (!(rdev->flags & RADEON_IS_PCIE))
3566 return;
3567
3568 /* x2 cards have a special sequence */
3569 if (ASIC_IS_X2(rdev))
3570 return;
3571
3572 /* FIXME wait for idle */
3573
3574 switch (lanes) {
3575 case 0:
3576 mask = RADEON_PCIE_LC_LINK_WIDTH_X0;
3577 break;
3578 case 1:
3579 mask = RADEON_PCIE_LC_LINK_WIDTH_X1;
3580 break;
3581 case 2:
3582 mask = RADEON_PCIE_LC_LINK_WIDTH_X2;
3583 break;
3584 case 4:
3585 mask = RADEON_PCIE_LC_LINK_WIDTH_X4;
3586 break;
3587 case 8:
3588 mask = RADEON_PCIE_LC_LINK_WIDTH_X8;
3589 break;
3590 case 12:
3591 mask = RADEON_PCIE_LC_LINK_WIDTH_X12;
3592 break;
3593 case 16:
3594 default:
3595 mask = RADEON_PCIE_LC_LINK_WIDTH_X16;
3596 break;
3597 }
3598
3599 link_width_cntl = RREG32_PCIE_P(RADEON_PCIE_LC_LINK_WIDTH_CNTL);
3600
3601 if ((link_width_cntl & RADEON_PCIE_LC_LINK_WIDTH_RD_MASK) ==
3602 (mask << RADEON_PCIE_LC_LINK_WIDTH_RD_SHIFT))
3603 return;
3604
3605 if (link_width_cntl & R600_PCIE_LC_UPCONFIGURE_DIS)
3606 return;
3607
3608 link_width_cntl &= ~(RADEON_PCIE_LC_LINK_WIDTH_MASK |
3609 RADEON_PCIE_LC_RECONFIG_NOW |
3610 R600_PCIE_LC_RENEGOTIATE_EN |
3611 R600_PCIE_LC_RECONFIG_ARC_MISSING_ESCAPE);
3612 link_width_cntl |= mask;
3613
3614 WREG32_PCIE_P(RADEON_PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
3615
3616 /* some northbridges can renegotiate the link rather than requiring
3617 * a complete re-config.
3618 * e.g., AMD 780/790 northbridges (pci ids: 0x5956, 0x5957, 0x5958, etc.)
3619 */
3620 if (link_width_cntl & R600_PCIE_LC_RENEGOTIATION_SUPPORT)
3621 link_width_cntl |= R600_PCIE_LC_RENEGOTIATE_EN | R600_PCIE_LC_UPCONFIGURE_SUPPORT;
3622 else
3623 link_width_cntl |= R600_PCIE_LC_RECONFIG_ARC_MISSING_ESCAPE;
3624
3625 WREG32_PCIE_P(RADEON_PCIE_LC_LINK_WIDTH_CNTL, (link_width_cntl |
3626 RADEON_PCIE_LC_RECONFIG_NOW));
3627
3628 if (rdev->family >= CHIP_RV770)
3629 target_reg = R700_TARGET_AND_CURRENT_PROFILE_INDEX;
3630 else
3631 target_reg = R600_TARGET_AND_CURRENT_PROFILE_INDEX;
3632
3633 /* wait for lane set to complete */
3634 link_width_cntl = RREG32(target_reg);
3635 while (link_width_cntl == 0xffffffff)
3636 link_width_cntl = RREG32(target_reg);
3637
3638}
3639
3640int r600_get_pcie_lanes(struct radeon_device *rdev)
3641{
3642 u32 link_width_cntl;
3643
3644 if (rdev->flags & RADEON_IS_IGP)
3645 return 0;
3646
3647 if (!(rdev->flags & RADEON_IS_PCIE))
3648 return 0;
3649
3650 /* x2 cards have a special sequence */
3651 if (ASIC_IS_X2(rdev))
3652 return 0;
3653
3654 /* FIXME wait for idle */
3655
3656 link_width_cntl = RREG32_PCIE_P(RADEON_PCIE_LC_LINK_WIDTH_CNTL);
3657
3658 switch ((link_width_cntl & RADEON_PCIE_LC_LINK_WIDTH_RD_MASK) >> RADEON_PCIE_LC_LINK_WIDTH_RD_SHIFT) {
3659 case RADEON_PCIE_LC_LINK_WIDTH_X0:
3660 return 0;
3661 case RADEON_PCIE_LC_LINK_WIDTH_X1:
3662 return 1;
3663 case RADEON_PCIE_LC_LINK_WIDTH_X2:
3664 return 2;
3665 case RADEON_PCIE_LC_LINK_WIDTH_X4:
3666 return 4;
3667 case RADEON_PCIE_LC_LINK_WIDTH_X8:
3668 return 8;
3669 case RADEON_PCIE_LC_LINK_WIDTH_X16:
3670 default:
3671 return 16;
3672 }
3673}
3674
3675static void r600_pcie_gen2_enable(struct radeon_device *rdev)
3676{
3677 u32 link_width_cntl, lanes, speed_cntl, training_cntl, tmp;
3678 u16 link_cntl2;
3679
3680 if (radeon_pcie_gen2 == 0)
3681 return;
3682
3683 if (rdev->flags & RADEON_IS_IGP)
3684 return;
3685
3686 if (!(rdev->flags & RADEON_IS_PCIE))
3687 return;
3688
3689 /* x2 cards have a special sequence */
3690 if (ASIC_IS_X2(rdev))
3691 return;
3692
3693 /* only RV6xx+ chips are supported */
3694 if (rdev->family <= CHIP_R600)
3695 return;
3696
3697 /* 55 nm r6xx asics */
3698 if ((rdev->family == CHIP_RV670) ||
3699 (rdev->family == CHIP_RV620) ||
3700 (rdev->family == CHIP_RV635)) {
3701 /* advertise upconfig capability */
3702 link_width_cntl = RREG32_PCIE_P(PCIE_LC_LINK_WIDTH_CNTL);
3703 link_width_cntl &= ~LC_UPCONFIGURE_DIS;
3704 WREG32_PCIE_P(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
3705 link_width_cntl = RREG32_PCIE_P(PCIE_LC_LINK_WIDTH_CNTL);
3706 if (link_width_cntl & LC_RENEGOTIATION_SUPPORT) {
3707 lanes = (link_width_cntl & LC_LINK_WIDTH_RD_MASK) >> LC_LINK_WIDTH_RD_SHIFT;
3708 link_width_cntl &= ~(LC_LINK_WIDTH_MASK |
3709 LC_RECONFIG_ARC_MISSING_ESCAPE);
3710 link_width_cntl |= lanes | LC_RECONFIG_NOW | LC_RENEGOTIATE_EN;
3711 WREG32_PCIE_P(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
3712 } else {
3713 link_width_cntl |= LC_UPCONFIGURE_DIS;
3714 WREG32_PCIE_P(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
3715 }
3716 }
3717
3718 speed_cntl = RREG32_PCIE_P(PCIE_LC_SPEED_CNTL);
3719 if ((speed_cntl & LC_OTHER_SIDE_EVER_SENT_GEN2) &&
3720 (speed_cntl & LC_OTHER_SIDE_SUPPORTS_GEN2)) {
3721
3722 /* 55 nm r6xx asics */
3723 if ((rdev->family == CHIP_RV670) ||
3724 (rdev->family == CHIP_RV620) ||
3725 (rdev->family == CHIP_RV635)) {
3726 WREG32(MM_CFGREGS_CNTL, 0x8);
3727 link_cntl2 = RREG32(0x4088);
3728 WREG32(MM_CFGREGS_CNTL, 0);
3729 /* not supported yet */
3730 if (link_cntl2 & SELECTABLE_DEEMPHASIS)
3731 return;
3732 }
3733
3734 speed_cntl &= ~LC_SPEED_CHANGE_ATTEMPTS_ALLOWED_MASK;
3735 speed_cntl |= (0x3 << LC_SPEED_CHANGE_ATTEMPTS_ALLOWED_SHIFT);
3736 speed_cntl &= ~LC_VOLTAGE_TIMER_SEL_MASK;
3737 speed_cntl &= ~LC_FORCE_DIS_HW_SPEED_CHANGE;
3738 speed_cntl |= LC_FORCE_EN_HW_SPEED_CHANGE;
3739 WREG32_PCIE_P(PCIE_LC_SPEED_CNTL, speed_cntl);
3740
3741 tmp = RREG32(0x541c);
3742 WREG32(0x541c, tmp | 0x8);
3743 WREG32(MM_CFGREGS_CNTL, MM_WR_TO_CFG_EN);
3744 link_cntl2 = RREG16(0x4088);
3745 link_cntl2 &= ~TARGET_LINK_SPEED_MASK;
3746 link_cntl2 |= 0x2;
3747 WREG16(0x4088, link_cntl2);
3748 WREG32(MM_CFGREGS_CNTL, 0);
3749
3750 if ((rdev->family == CHIP_RV670) ||
3751 (rdev->family == CHIP_RV620) ||
3752 (rdev->family == CHIP_RV635)) {
3753 training_cntl = RREG32_PCIE_P(PCIE_LC_TRAINING_CNTL);
3754 training_cntl &= ~LC_POINT_7_PLUS_EN;
3755 WREG32_PCIE_P(PCIE_LC_TRAINING_CNTL, training_cntl);
3756 } else {
3757 speed_cntl = RREG32_PCIE_P(PCIE_LC_SPEED_CNTL);
3758 speed_cntl &= ~LC_TARGET_LINK_SPEED_OVERRIDE_EN;
3759 WREG32_PCIE_P(PCIE_LC_SPEED_CNTL, speed_cntl);
3760 }
3761
3762 speed_cntl = RREG32_PCIE_P(PCIE_LC_SPEED_CNTL);
3763 speed_cntl |= LC_GEN2_EN_STRAP;
3764 WREG32_PCIE_P(PCIE_LC_SPEED_CNTL, speed_cntl);
3765
3766 } else {
3767 link_width_cntl = RREG32_PCIE_P(PCIE_LC_LINK_WIDTH_CNTL);
3768 /* XXX: only disable it if gen1 bridge vendor == 0x111d or 0x1106 */
3769 if (1)
3770 link_width_cntl |= LC_UPCONFIGURE_DIS;
3771 else
3772 link_width_cntl &= ~LC_UPCONFIGURE_DIS;
3773 WREG32_PCIE_P(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
3774 }
3775}
diff --git a/drivers/gpu/drm/radeon/r600_audio.c b/drivers/gpu/drm/radeon/r600_audio.c
index b5443fe1c1d1..846fae576399 100644
--- a/drivers/gpu/drm/radeon/r600_audio.c
+++ b/drivers/gpu/drm/radeon/r600_audio.c
@@ -26,6 +26,7 @@
26#include "drmP.h" 26#include "drmP.h"
27#include "radeon.h" 27#include "radeon.h"
28#include "radeon_reg.h" 28#include "radeon_reg.h"
29#include "radeon_asic.h"
29#include "atom.h" 30#include "atom.h"
30 31
31#define AUDIO_TIMER_INTERVALL 100 /* 1/10 sekund should be enough */ 32#define AUDIO_TIMER_INTERVALL 100 /* 1/10 sekund should be enough */
diff --git a/drivers/gpu/drm/radeon/r600_blit.c b/drivers/gpu/drm/radeon/r600_blit.c
index ca5c29f70779..7f1043448d25 100644
--- a/drivers/gpu/drm/radeon/r600_blit.c
+++ b/drivers/gpu/drm/radeon/r600_blit.c
@@ -137,9 +137,9 @@ set_shaders(struct drm_device *dev)
137 ps = (u32 *) ((char *)dev->agp_buffer_map->handle + dev_priv->blit_vb->offset + 256); 137 ps = (u32 *) ((char *)dev->agp_buffer_map->handle + dev_priv->blit_vb->offset + 256);
138 138
139 for (i = 0; i < r6xx_vs_size; i++) 139 for (i = 0; i < r6xx_vs_size; i++)
140 vs[i] = r6xx_vs[i]; 140 vs[i] = cpu_to_le32(r6xx_vs[i]);
141 for (i = 0; i < r6xx_ps_size; i++) 141 for (i = 0; i < r6xx_ps_size; i++)
142 ps[i] = r6xx_ps[i]; 142 ps[i] = cpu_to_le32(r6xx_ps[i]);
143 143
144 dev_priv->blit_vb->used = 512; 144 dev_priv->blit_vb->used = 512;
145 145
@@ -192,6 +192,9 @@ set_vtx_resource(drm_radeon_private_t *dev_priv, u64 gpu_addr)
192 DRM_DEBUG("\n"); 192 DRM_DEBUG("\n");
193 193
194 sq_vtx_constant_word2 = (((gpu_addr >> 32) & 0xff) | (16 << 8)); 194 sq_vtx_constant_word2 = (((gpu_addr >> 32) & 0xff) | (16 << 8));
195#ifdef __BIG_ENDIAN
196 sq_vtx_constant_word2 |= (2 << 30);
197#endif
195 198
196 BEGIN_RING(9); 199 BEGIN_RING(9);
197 OUT_RING(CP_PACKET3(R600_IT_SET_RESOURCE, 7)); 200 OUT_RING(CP_PACKET3(R600_IT_SET_RESOURCE, 7));
@@ -291,7 +294,11 @@ draw_auto(drm_radeon_private_t *dev_priv)
291 OUT_RING(DI_PT_RECTLIST); 294 OUT_RING(DI_PT_RECTLIST);
292 295
293 OUT_RING(CP_PACKET3(R600_IT_INDEX_TYPE, 0)); 296 OUT_RING(CP_PACKET3(R600_IT_INDEX_TYPE, 0));
297#ifdef __BIG_ENDIAN
298 OUT_RING((2 << 2) | DI_INDEX_SIZE_16_BIT);
299#else
294 OUT_RING(DI_INDEX_SIZE_16_BIT); 300 OUT_RING(DI_INDEX_SIZE_16_BIT);
301#endif
295 302
296 OUT_RING(CP_PACKET3(R600_IT_NUM_INSTANCES, 0)); 303 OUT_RING(CP_PACKET3(R600_IT_NUM_INSTANCES, 0));
297 OUT_RING(1); 304 OUT_RING(1);
diff --git a/drivers/gpu/drm/radeon/r600_blit_kms.c b/drivers/gpu/drm/radeon/r600_blit_kms.c
index 3473c00781ff..9aa74c3f8cb6 100644
--- a/drivers/gpu/drm/radeon/r600_blit_kms.c
+++ b/drivers/gpu/drm/radeon/r600_blit_kms.c
@@ -54,7 +54,7 @@ set_render_target(struct radeon_device *rdev, int format,
54 if (h < 8) 54 if (h < 8)
55 h = 8; 55 h = 8;
56 56
57 cb_color_info = ((format << 2) | (1 << 27)); 57 cb_color_info = ((format << 2) | (1 << 27) | (1 << 8));
58 pitch = (w / 8) - 1; 58 pitch = (w / 8) - 1;
59 slice = ((w * h) / 64) - 1; 59 slice = ((w * h) / 64) - 1;
60 60
@@ -165,6 +165,9 @@ set_vtx_resource(struct radeon_device *rdev, u64 gpu_addr)
165 u32 sq_vtx_constant_word2; 165 u32 sq_vtx_constant_word2;
166 166
167 sq_vtx_constant_word2 = ((upper_32_bits(gpu_addr) & 0xff) | (16 << 8)); 167 sq_vtx_constant_word2 = ((upper_32_bits(gpu_addr) & 0xff) | (16 << 8));
168#ifdef __BIG_ENDIAN
169 sq_vtx_constant_word2 |= (2 << 30);
170#endif
168 171
169 radeon_ring_write(rdev, PACKET3(PACKET3_SET_RESOURCE, 7)); 172 radeon_ring_write(rdev, PACKET3(PACKET3_SET_RESOURCE, 7));
170 radeon_ring_write(rdev, 0x460); 173 radeon_ring_write(rdev, 0x460);
@@ -199,7 +202,7 @@ set_tex_resource(struct radeon_device *rdev,
199 if (h < 1) 202 if (h < 1)
200 h = 1; 203 h = 1;
201 204
202 sq_tex_resource_word0 = (1 << 0); 205 sq_tex_resource_word0 = (1 << 0) | (1 << 3);
203 sq_tex_resource_word0 |= ((((pitch >> 3) - 1) << 8) | 206 sq_tex_resource_word0 |= ((((pitch >> 3) - 1) << 8) |
204 ((w - 1) << 19)); 207 ((w - 1) << 19));
205 208
@@ -253,7 +256,11 @@ draw_auto(struct radeon_device *rdev)
253 radeon_ring_write(rdev, DI_PT_RECTLIST); 256 radeon_ring_write(rdev, DI_PT_RECTLIST);
254 257
255 radeon_ring_write(rdev, PACKET3(PACKET3_INDEX_TYPE, 0)); 258 radeon_ring_write(rdev, PACKET3(PACKET3_INDEX_TYPE, 0));
256 radeon_ring_write(rdev, DI_INDEX_SIZE_16_BIT); 259 radeon_ring_write(rdev,
260#ifdef __BIG_ENDIAN
261 (2 << 2) |
262#endif
263 DI_INDEX_SIZE_16_BIT);
257 264
258 radeon_ring_write(rdev, PACKET3(PACKET3_NUM_INSTANCES, 0)); 265 radeon_ring_write(rdev, PACKET3(PACKET3_NUM_INSTANCES, 0));
259 radeon_ring_write(rdev, 1); 266 radeon_ring_write(rdev, 1);
@@ -424,7 +431,11 @@ set_default_state(struct radeon_device *rdev)
424 dwords = ALIGN(rdev->r600_blit.state_len, 0x10); 431 dwords = ALIGN(rdev->r600_blit.state_len, 0x10);
425 gpu_addr = rdev->r600_blit.shader_gpu_addr + rdev->r600_blit.state_offset; 432 gpu_addr = rdev->r600_blit.shader_gpu_addr + rdev->r600_blit.state_offset;
426 radeon_ring_write(rdev, PACKET3(PACKET3_INDIRECT_BUFFER, 2)); 433 radeon_ring_write(rdev, PACKET3(PACKET3_INDIRECT_BUFFER, 2));
427 radeon_ring_write(rdev, gpu_addr & 0xFFFFFFFC); 434 radeon_ring_write(rdev,
435#ifdef __BIG_ENDIAN
436 (2 << 0) |
437#endif
438 (gpu_addr & 0xFFFFFFFC));
428 radeon_ring_write(rdev, upper_32_bits(gpu_addr) & 0xFF); 439 radeon_ring_write(rdev, upper_32_bits(gpu_addr) & 0xFF);
429 radeon_ring_write(rdev, dwords); 440 radeon_ring_write(rdev, dwords);
430 441
@@ -467,14 +478,15 @@ static inline uint32_t i2f(uint32_t input)
467int r600_blit_init(struct radeon_device *rdev) 478int r600_blit_init(struct radeon_device *rdev)
468{ 479{
469 u32 obj_size; 480 u32 obj_size;
470 int r, dwords; 481 int i, r, dwords;
471 void *ptr; 482 void *ptr;
472 u32 packet2s[16]; 483 u32 packet2s[16];
473 int num_packet2s = 0; 484 int num_packet2s = 0;
474 485
475 /* don't reinitialize blit */ 486 /* pin copy shader into vram if already initialized */
476 if (rdev->r600_blit.shader_obj) 487 if (rdev->r600_blit.shader_obj)
477 return 0; 488 goto done;
489
478 mutex_init(&rdev->r600_blit.mutex); 490 mutex_init(&rdev->r600_blit.mutex);
479 rdev->r600_blit.state_offset = 0; 491 rdev->r600_blit.state_offset = 0;
480 492
@@ -485,7 +497,7 @@ int r600_blit_init(struct radeon_device *rdev)
485 497
486 dwords = rdev->r600_blit.state_len; 498 dwords = rdev->r600_blit.state_len;
487 while (dwords & 0xf) { 499 while (dwords & 0xf) {
488 packet2s[num_packet2s++] = PACKET2(0); 500 packet2s[num_packet2s++] = cpu_to_le32(PACKET2(0));
489 dwords++; 501 dwords++;
490 } 502 }
491 503
@@ -500,7 +512,7 @@ int r600_blit_init(struct radeon_device *rdev)
500 obj_size += r6xx_ps_size * 4; 512 obj_size += r6xx_ps_size * 4;
501 obj_size = ALIGN(obj_size, 256); 513 obj_size = ALIGN(obj_size, 256);
502 514
503 r = radeon_bo_create(rdev, NULL, obj_size, true, RADEON_GEM_DOMAIN_VRAM, 515 r = radeon_bo_create(rdev, obj_size, PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM,
504 &rdev->r600_blit.shader_obj); 516 &rdev->r600_blit.shader_obj);
505 if (r) { 517 if (r) {
506 DRM_ERROR("r600 failed to allocate shader\n"); 518 DRM_ERROR("r600 failed to allocate shader\n");
@@ -528,11 +540,25 @@ int r600_blit_init(struct radeon_device *rdev)
528 if (num_packet2s) 540 if (num_packet2s)
529 memcpy_toio(ptr + rdev->r600_blit.state_offset + (rdev->r600_blit.state_len * 4), 541 memcpy_toio(ptr + rdev->r600_blit.state_offset + (rdev->r600_blit.state_len * 4),
530 packet2s, num_packet2s * 4); 542 packet2s, num_packet2s * 4);
531 memcpy(ptr + rdev->r600_blit.vs_offset, r6xx_vs, r6xx_vs_size * 4); 543 for (i = 0; i < r6xx_vs_size; i++)
532 memcpy(ptr + rdev->r600_blit.ps_offset, r6xx_ps, r6xx_ps_size * 4); 544 *(u32 *)((unsigned long)ptr + rdev->r600_blit.vs_offset + i * 4) = cpu_to_le32(r6xx_vs[i]);
545 for (i = 0; i < r6xx_ps_size; i++)
546 *(u32 *)((unsigned long)ptr + rdev->r600_blit.ps_offset + i * 4) = cpu_to_le32(r6xx_ps[i]);
533 radeon_bo_kunmap(rdev->r600_blit.shader_obj); 547 radeon_bo_kunmap(rdev->r600_blit.shader_obj);
534 radeon_bo_unreserve(rdev->r600_blit.shader_obj); 548 radeon_bo_unreserve(rdev->r600_blit.shader_obj);
535 rdev->mc.active_vram_size = rdev->mc.real_vram_size; 549
550done:
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 radeon_ttm_set_active_vram_size(rdev, rdev->mc.real_vram_size);
536 return 0; 562 return 0;
537} 563}
538 564
@@ -540,7 +566,7 @@ void r600_blit_fini(struct radeon_device *rdev)
540{ 566{
541 int r; 567 int r;
542 568
543 rdev->mc.active_vram_size = rdev->mc.visible_vram_size; 569 radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
544 if (rdev->r600_blit.shader_obj == NULL) 570 if (rdev->r600_blit.shader_obj == NULL)
545 return; 571 return;
546 /* If we can't reserve the bo, unref should be enough to destroy 572 /* If we can't reserve the bo, unref should be enough to destroy
@@ -554,7 +580,7 @@ void r600_blit_fini(struct radeon_device *rdev)
554 radeon_bo_unref(&rdev->r600_blit.shader_obj); 580 radeon_bo_unref(&rdev->r600_blit.shader_obj);
555} 581}
556 582
557int r600_vb_ib_get(struct radeon_device *rdev) 583static int r600_vb_ib_get(struct radeon_device *rdev)
558{ 584{
559 int r; 585 int r;
560 r = radeon_ib_get(rdev, &rdev->r600_blit.vb_ib); 586 r = radeon_ib_get(rdev, &rdev->r600_blit.vb_ib);
@@ -568,7 +594,7 @@ int r600_vb_ib_get(struct radeon_device *rdev)
568 return 0; 594 return 0;
569} 595}
570 596
571void r600_vb_ib_put(struct radeon_device *rdev) 597static void r600_vb_ib_put(struct radeon_device *rdev)
572{ 598{
573 radeon_fence_emit(rdev, rdev->r600_blit.vb_ib->fence); 599 radeon_fence_emit(rdev, rdev->r600_blit.vb_ib->fence);
574 radeon_ib_free(rdev, &rdev->r600_blit.vb_ib); 600 radeon_ib_free(rdev, &rdev->r600_blit.vb_ib);
@@ -650,8 +676,8 @@ void r600_kms_blit_copy(struct radeon_device *rdev,
650 int src_x = src_gpu_addr & 255; 676 int src_x = src_gpu_addr & 255;
651 int dst_x = dst_gpu_addr & 255; 677 int dst_x = dst_gpu_addr & 255;
652 int h = 1; 678 int h = 1;
653 src_gpu_addr = src_gpu_addr & ~255; 679 src_gpu_addr = src_gpu_addr & ~255ULL;
654 dst_gpu_addr = dst_gpu_addr & ~255; 680 dst_gpu_addr = dst_gpu_addr & ~255ULL;
655 681
656 if (!src_x && !dst_x) { 682 if (!src_x && !dst_x) {
657 h = (cur_size / max_bytes); 683 h = (cur_size / max_bytes);
@@ -672,17 +698,6 @@ void r600_kms_blit_copy(struct radeon_device *rdev,
672 698
673 if ((rdev->r600_blit.vb_used + 48) > rdev->r600_blit.vb_total) { 699 if ((rdev->r600_blit.vb_used + 48) > rdev->r600_blit.vb_total) {
674 WARN_ON(1); 700 WARN_ON(1);
675
676#if 0
677 r600_vb_ib_put(rdev);
678
679 r600_nomm_put_vb(dev);
680 r600_nomm_get_vb(dev);
681 if (!dev_priv->blit_vb)
682 return;
683 set_shaders(dev);
684 vb = r600_nomm_get_vb_ptr(dev);
685#endif
686 } 701 }
687 702
688 vb[0] = i2f(dst_x); 703 vb[0] = i2f(dst_x);
@@ -744,8 +759,8 @@ void r600_kms_blit_copy(struct radeon_device *rdev,
744 int src_x = (src_gpu_addr & 255); 759 int src_x = (src_gpu_addr & 255);
745 int dst_x = (dst_gpu_addr & 255); 760 int dst_x = (dst_gpu_addr & 255);
746 int h = 1; 761 int h = 1;
747 src_gpu_addr = src_gpu_addr & ~255; 762 src_gpu_addr = src_gpu_addr & ~255ULL;
748 dst_gpu_addr = dst_gpu_addr & ~255; 763 dst_gpu_addr = dst_gpu_addr & ~255ULL;
749 764
750 if (!src_x && !dst_x) { 765 if (!src_x && !dst_x) {
751 h = (cur_size / max_bytes); 766 h = (cur_size / max_bytes);
@@ -767,17 +782,6 @@ void r600_kms_blit_copy(struct radeon_device *rdev,
767 if ((rdev->r600_blit.vb_used + 48) > rdev->r600_blit.vb_total) { 782 if ((rdev->r600_blit.vb_used + 48) > rdev->r600_blit.vb_total) {
768 WARN_ON(1); 783 WARN_ON(1);
769 } 784 }
770#if 0
771 if ((rdev->blit_vb->used + 48) > rdev->blit_vb->total) {
772 r600_nomm_put_vb(dev);
773 r600_nomm_get_vb(dev);
774 if (!rdev->blit_vb)
775 return;
776
777 set_shaders(dev);
778 vb = r600_nomm_get_vb_ptr(dev);
779 }
780#endif
781 785
782 vb[0] = i2f(dst_x / 4); 786 vb[0] = i2f(dst_x / 4);
783 vb[1] = 0; 787 vb[1] = 0;
diff --git a/drivers/gpu/drm/radeon/r600_blit_shaders.c b/drivers/gpu/drm/radeon/r600_blit_shaders.c
index e8151c1d55b2..2d1f6c5ee2a7 100644
--- a/drivers/gpu/drm/radeon/r600_blit_shaders.c
+++ b/drivers/gpu/drm/radeon/r600_blit_shaders.c
@@ -684,7 +684,11 @@ const u32 r6xx_vs[] =
684 0x00000000, 684 0x00000000,
685 0x3c000000, 685 0x3c000000,
686 0x68cd1000, 686 0x68cd1000,
687#ifdef __BIG_ENDIAN
688 0x000a0000,
689#else
687 0x00080000, 690 0x00080000,
691#endif
688 0x00000000, 692 0x00000000,
689}; 693};
690 694
diff --git a/drivers/gpu/drm/radeon/r600_cp.c b/drivers/gpu/drm/radeon/r600_cp.c
index 4f4cd8b286d5..c3ab959bdc7c 100644
--- a/drivers/gpu/drm/radeon/r600_cp.c
+++ b/drivers/gpu/drm/radeon/r600_cp.c
@@ -396,6 +396,9 @@ static void r600_cp_load_microcode(drm_radeon_private_t *dev_priv)
396 r600_do_cp_stop(dev_priv); 396 r600_do_cp_stop(dev_priv);
397 397
398 RADEON_WRITE(R600_CP_RB_CNTL, 398 RADEON_WRITE(R600_CP_RB_CNTL,
399#ifdef __BIG_ENDIAN
400 R600_BUF_SWAP_32BIT |
401#endif
399 R600_RB_NO_UPDATE | 402 R600_RB_NO_UPDATE |
400 R600_RB_BLKSZ(15) | 403 R600_RB_BLKSZ(15) |
401 R600_RB_BUFSZ(3)); 404 R600_RB_BUFSZ(3));
@@ -486,9 +489,12 @@ static void r700_cp_load_microcode(drm_radeon_private_t *dev_priv)
486 r600_do_cp_stop(dev_priv); 489 r600_do_cp_stop(dev_priv);
487 490
488 RADEON_WRITE(R600_CP_RB_CNTL, 491 RADEON_WRITE(R600_CP_RB_CNTL,
492#ifdef __BIG_ENDIAN
493 R600_BUF_SWAP_32BIT |
494#endif
489 R600_RB_NO_UPDATE | 495 R600_RB_NO_UPDATE |
490 (15 << 8) | 496 R600_RB_BLKSZ(15) |
491 (3 << 0)); 497 R600_RB_BUFSZ(3));
492 498
493 RADEON_WRITE(R600_GRBM_SOFT_RESET, R600_SOFT_RESET_CP); 499 RADEON_WRITE(R600_GRBM_SOFT_RESET, R600_SOFT_RESET_CP);
494 RADEON_READ(R600_GRBM_SOFT_RESET); 500 RADEON_READ(R600_GRBM_SOFT_RESET);
@@ -550,8 +556,12 @@ static void r600_test_writeback(drm_radeon_private_t *dev_priv)
550 556
551 if (!dev_priv->writeback_works) { 557 if (!dev_priv->writeback_works) {
552 /* Disable writeback to avoid unnecessary bus master transfer */ 558 /* Disable writeback to avoid unnecessary bus master transfer */
553 RADEON_WRITE(R600_CP_RB_CNTL, RADEON_READ(R600_CP_RB_CNTL) | 559 RADEON_WRITE(R600_CP_RB_CNTL,
554 RADEON_RB_NO_UPDATE); 560#ifdef __BIG_ENDIAN
561 R600_BUF_SWAP_32BIT |
562#endif
563 RADEON_READ(R600_CP_RB_CNTL) |
564 R600_RB_NO_UPDATE);
555 RADEON_WRITE(R600_SCRATCH_UMSK, 0); 565 RADEON_WRITE(R600_SCRATCH_UMSK, 0);
556 } 566 }
557} 567}
@@ -575,7 +585,11 @@ int r600_do_engine_reset(struct drm_device *dev)
575 585
576 RADEON_WRITE(R600_CP_RB_WPTR_DELAY, 0); 586 RADEON_WRITE(R600_CP_RB_WPTR_DELAY, 0);
577 cp_rb_cntl = RADEON_READ(R600_CP_RB_CNTL); 587 cp_rb_cntl = RADEON_READ(R600_CP_RB_CNTL);
578 RADEON_WRITE(R600_CP_RB_CNTL, R600_RB_RPTR_WR_ENA); 588 RADEON_WRITE(R600_CP_RB_CNTL,
589#ifdef __BIG_ENDIAN
590 R600_BUF_SWAP_32BIT |
591#endif
592 R600_RB_RPTR_WR_ENA);
579 593
580 RADEON_WRITE(R600_CP_RB_RPTR_WR, cp_ptr); 594 RADEON_WRITE(R600_CP_RB_RPTR_WR, cp_ptr);
581 RADEON_WRITE(R600_CP_RB_WPTR, cp_ptr); 595 RADEON_WRITE(R600_CP_RB_WPTR, cp_ptr);
@@ -1838,7 +1852,10 @@ static void r600_cp_init_ring_buffer(struct drm_device *dev,
1838 + dev_priv->gart_vm_start; 1852 + dev_priv->gart_vm_start;
1839 } 1853 }
1840 RADEON_WRITE(R600_CP_RB_RPTR_ADDR, 1854 RADEON_WRITE(R600_CP_RB_RPTR_ADDR,
1841 rptr_addr & 0xffffffff); 1855#ifdef __BIG_ENDIAN
1856 (2 << 0) |
1857#endif
1858 (rptr_addr & 0xfffffffc));
1842 RADEON_WRITE(R600_CP_RB_RPTR_ADDR_HI, 1859 RADEON_WRITE(R600_CP_RB_RPTR_ADDR_HI,
1843 upper_32_bits(rptr_addr)); 1860 upper_32_bits(rptr_addr));
1844 1861
@@ -1889,7 +1906,7 @@ static void r600_cp_init_ring_buffer(struct drm_device *dev,
1889 { 1906 {
1890 u64 scratch_addr; 1907 u64 scratch_addr;
1891 1908
1892 scratch_addr = RADEON_READ(R600_CP_RB_RPTR_ADDR); 1909 scratch_addr = RADEON_READ(R600_CP_RB_RPTR_ADDR) & 0xFFFFFFFC;
1893 scratch_addr |= ((u64)RADEON_READ(R600_CP_RB_RPTR_ADDR_HI)) << 32; 1910 scratch_addr |= ((u64)RADEON_READ(R600_CP_RB_RPTR_ADDR_HI)) << 32;
1894 scratch_addr += R600_SCRATCH_REG_OFFSET; 1911 scratch_addr += R600_SCRATCH_REG_OFFSET;
1895 scratch_addr >>= 8; 1912 scratch_addr >>= 8;
diff --git a/drivers/gpu/drm/radeon/r600_cs.c b/drivers/gpu/drm/radeon/r600_cs.c
index 250a3a918193..909bda8dd550 100644
--- a/drivers/gpu/drm/radeon/r600_cs.c
+++ b/drivers/gpu/drm/radeon/r600_cs.c
@@ -50,6 +50,7 @@ struct r600_cs_track {
50 u32 nsamples; 50 u32 nsamples;
51 u32 cb_color_base_last[8]; 51 u32 cb_color_base_last[8];
52 struct radeon_bo *cb_color_bo[8]; 52 struct radeon_bo *cb_color_bo[8];
53 u64 cb_color_bo_mc[8];
53 u32 cb_color_bo_offset[8]; 54 u32 cb_color_bo_offset[8];
54 struct radeon_bo *cb_color_frag_bo[8]; 55 struct radeon_bo *cb_color_frag_bo[8];
55 struct radeon_bo *cb_color_tile_bo[8]; 56 struct radeon_bo *cb_color_tile_bo[8];
@@ -67,76 +68,239 @@ struct r600_cs_track {
67 u32 db_depth_size; 68 u32 db_depth_size;
68 u32 db_offset; 69 u32 db_offset;
69 struct radeon_bo *db_bo; 70 struct radeon_bo *db_bo;
71 u64 db_bo_mc;
70}; 72};
71 73
74#define FMT_8_BIT(fmt, vc) [fmt] = { 1, 1, 1, vc, CHIP_R600 }
75#define FMT_16_BIT(fmt, vc) [fmt] = { 1, 1, 2, vc, CHIP_R600 }
76#define FMT_24_BIT(fmt) [fmt] = { 1, 1, 3, 0, CHIP_R600 }
77#define FMT_32_BIT(fmt, vc) [fmt] = { 1, 1, 4, vc, CHIP_R600 }
78#define FMT_48_BIT(fmt) [fmt] = { 1, 1, 6, 0, CHIP_R600 }
79#define FMT_64_BIT(fmt, vc) [fmt] = { 1, 1, 8, vc, CHIP_R600 }
80#define FMT_96_BIT(fmt) [fmt] = { 1, 1, 12, 0, CHIP_R600 }
81#define FMT_128_BIT(fmt, vc) [fmt] = { 1, 1, 16,vc, CHIP_R600 }
82
83struct gpu_formats {
84 unsigned blockwidth;
85 unsigned blockheight;
86 unsigned blocksize;
87 unsigned valid_color;
88 enum radeon_family min_family;
89};
90
91static const struct gpu_formats color_formats_table[] = {
92 /* 8 bit */
93 FMT_8_BIT(V_038004_COLOR_8, 1),
94 FMT_8_BIT(V_038004_COLOR_4_4, 1),
95 FMT_8_BIT(V_038004_COLOR_3_3_2, 1),
96 FMT_8_BIT(V_038004_FMT_1, 0),
97
98 /* 16-bit */
99 FMT_16_BIT(V_038004_COLOR_16, 1),
100 FMT_16_BIT(V_038004_COLOR_16_FLOAT, 1),
101 FMT_16_BIT(V_038004_COLOR_8_8, 1),
102 FMT_16_BIT(V_038004_COLOR_5_6_5, 1),
103 FMT_16_BIT(V_038004_COLOR_6_5_5, 1),
104 FMT_16_BIT(V_038004_COLOR_1_5_5_5, 1),
105 FMT_16_BIT(V_038004_COLOR_4_4_4_4, 1),
106 FMT_16_BIT(V_038004_COLOR_5_5_5_1, 1),
107
108 /* 24-bit */
109 FMT_24_BIT(V_038004_FMT_8_8_8),
110
111 /* 32-bit */
112 FMT_32_BIT(V_038004_COLOR_32, 1),
113 FMT_32_BIT(V_038004_COLOR_32_FLOAT, 1),
114 FMT_32_BIT(V_038004_COLOR_16_16, 1),
115 FMT_32_BIT(V_038004_COLOR_16_16_FLOAT, 1),
116 FMT_32_BIT(V_038004_COLOR_8_24, 1),
117 FMT_32_BIT(V_038004_COLOR_8_24_FLOAT, 1),
118 FMT_32_BIT(V_038004_COLOR_24_8, 1),
119 FMT_32_BIT(V_038004_COLOR_24_8_FLOAT, 1),
120 FMT_32_BIT(V_038004_COLOR_10_11_11, 1),
121 FMT_32_BIT(V_038004_COLOR_10_11_11_FLOAT, 1),
122 FMT_32_BIT(V_038004_COLOR_11_11_10, 1),
123 FMT_32_BIT(V_038004_COLOR_11_11_10_FLOAT, 1),
124 FMT_32_BIT(V_038004_COLOR_2_10_10_10, 1),
125 FMT_32_BIT(V_038004_COLOR_8_8_8_8, 1),
126 FMT_32_BIT(V_038004_COLOR_10_10_10_2, 1),
127 FMT_32_BIT(V_038004_FMT_5_9_9_9_SHAREDEXP, 0),
128 FMT_32_BIT(V_038004_FMT_32_AS_8, 0),
129 FMT_32_BIT(V_038004_FMT_32_AS_8_8, 0),
130
131 /* 48-bit */
132 FMT_48_BIT(V_038004_FMT_16_16_16),
133 FMT_48_BIT(V_038004_FMT_16_16_16_FLOAT),
134
135 /* 64-bit */
136 FMT_64_BIT(V_038004_COLOR_X24_8_32_FLOAT, 1),
137 FMT_64_BIT(V_038004_COLOR_32_32, 1),
138 FMT_64_BIT(V_038004_COLOR_32_32_FLOAT, 1),
139 FMT_64_BIT(V_038004_COLOR_16_16_16_16, 1),
140 FMT_64_BIT(V_038004_COLOR_16_16_16_16_FLOAT, 1),
141
142 FMT_96_BIT(V_038004_FMT_32_32_32),
143 FMT_96_BIT(V_038004_FMT_32_32_32_FLOAT),
144
145 /* 128-bit */
146 FMT_128_BIT(V_038004_COLOR_32_32_32_32, 1),
147 FMT_128_BIT(V_038004_COLOR_32_32_32_32_FLOAT, 1),
148
149 [V_038004_FMT_GB_GR] = { 2, 1, 4, 0 },
150 [V_038004_FMT_BG_RG] = { 2, 1, 4, 0 },
151
152 /* block compressed formats */
153 [V_038004_FMT_BC1] = { 4, 4, 8, 0 },
154 [V_038004_FMT_BC2] = { 4, 4, 16, 0 },
155 [V_038004_FMT_BC3] = { 4, 4, 16, 0 },
156 [V_038004_FMT_BC4] = { 4, 4, 8, 0 },
157 [V_038004_FMT_BC5] = { 4, 4, 16, 0},
158 [V_038004_FMT_BC6] = { 4, 4, 16, 0, CHIP_CEDAR}, /* Evergreen-only */
159 [V_038004_FMT_BC7] = { 4, 4, 16, 0, CHIP_CEDAR}, /* Evergreen-only */
160
161 /* The other Evergreen formats */
162 [V_038004_FMT_32_AS_32_32_32_32] = { 1, 1, 4, 0, CHIP_CEDAR},
163};
164
165static inline bool fmt_is_valid_color(u32 format)
166{
167 if (format >= ARRAY_SIZE(color_formats_table))
168 return false;
169
170 if (color_formats_table[format].valid_color)
171 return true;
172
173 return false;
174}
175
176static inline bool fmt_is_valid_texture(u32 format, enum radeon_family family)
177{
178 if (format >= ARRAY_SIZE(color_formats_table))
179 return false;
180
181 if (family < color_formats_table[format].min_family)
182 return false;
183
184 if (color_formats_table[format].blockwidth > 0)
185 return true;
186
187 return false;
188}
189
190static inline int fmt_get_blocksize(u32 format)
191{
192 if (format >= ARRAY_SIZE(color_formats_table))
193 return 0;
194
195 return color_formats_table[format].blocksize;
196}
197
198static inline int fmt_get_nblocksx(u32 format, u32 w)
199{
200 unsigned bw;
201
202 if (format >= ARRAY_SIZE(color_formats_table))
203 return 0;
204
205 bw = color_formats_table[format].blockwidth;
206 if (bw == 0)
207 return 0;
208
209 return (w + bw - 1) / bw;
210}
211
212static inline int fmt_get_nblocksy(u32 format, u32 h)
213{
214 unsigned bh;
215
216 if (format >= ARRAY_SIZE(color_formats_table))
217 return 0;
218
219 bh = color_formats_table[format].blockheight;
220 if (bh == 0)
221 return 0;
222
223 return (h + bh - 1) / bh;
224}
225
72static inline int r600_bpe_from_format(u32 *bpe, u32 format) 226static inline int r600_bpe_from_format(u32 *bpe, u32 format)
73{ 227{
74 switch (format) { 228 unsigned res;
75 case V_038004_COLOR_8: 229
76 case V_038004_COLOR_4_4: 230 if (format >= ARRAY_SIZE(color_formats_table))
77 case V_038004_COLOR_3_3_2: 231 goto fail;
78 case V_038004_FMT_1: 232
79 *bpe = 1; 233 res = color_formats_table[format].blocksize;
80 break; 234 if (res == 0)
81 case V_038004_COLOR_16: 235 goto fail;
82 case V_038004_COLOR_16_FLOAT: 236
83 case V_038004_COLOR_8_8: 237 *bpe = res;
84 case V_038004_COLOR_5_6_5: 238 return 0;
85 case V_038004_COLOR_6_5_5: 239
86 case V_038004_COLOR_1_5_5_5: 240fail:
87 case V_038004_COLOR_4_4_4_4: 241 *bpe = 16;
88 case V_038004_COLOR_5_5_5_1: 242 return -EINVAL;
89 *bpe = 2; 243}
90 break; 244
91 case V_038004_FMT_8_8_8: 245struct array_mode_checker {
92 *bpe = 3; 246 int array_mode;
93 break; 247 u32 group_size;
94 case V_038004_COLOR_32: 248 u32 nbanks;
95 case V_038004_COLOR_32_FLOAT: 249 u32 npipes;
96 case V_038004_COLOR_16_16: 250 u32 nsamples;
97 case V_038004_COLOR_16_16_FLOAT: 251 u32 blocksize;
98 case V_038004_COLOR_8_24: 252};
99 case V_038004_COLOR_8_24_FLOAT: 253
100 case V_038004_COLOR_24_8: 254/* returns alignment in pixels for pitch/height/depth and bytes for base */
101 case V_038004_COLOR_24_8_FLOAT: 255static inline int r600_get_array_mode_alignment(struct array_mode_checker *values,
102 case V_038004_COLOR_10_11_11: 256 u32 *pitch_align,
103 case V_038004_COLOR_10_11_11_FLOAT: 257 u32 *height_align,
104 case V_038004_COLOR_11_11_10: 258 u32 *depth_align,
105 case V_038004_COLOR_11_11_10_FLOAT: 259 u64 *base_align)
106 case V_038004_COLOR_2_10_10_10: 260{
107 case V_038004_COLOR_8_8_8_8: 261 u32 tile_width = 8;
108 case V_038004_COLOR_10_10_10_2: 262 u32 tile_height = 8;
109 case V_038004_FMT_5_9_9_9_SHAREDEXP: 263 u32 macro_tile_width = values->nbanks;
110 case V_038004_FMT_32_AS_8: 264 u32 macro_tile_height = values->npipes;
111 case V_038004_FMT_32_AS_8_8: 265 u32 tile_bytes = tile_width * tile_height * values->blocksize * values->nsamples;
112 *bpe = 4; 266 u32 macro_tile_bytes = macro_tile_width * macro_tile_height * tile_bytes;
113 break; 267
114 case V_038004_COLOR_X24_8_32_FLOAT: 268 switch (values->array_mode) {
115 case V_038004_COLOR_32_32: 269 case ARRAY_LINEAR_GENERAL:
116 case V_038004_COLOR_32_32_FLOAT: 270 /* technically tile_width/_height for pitch/height */
117 case V_038004_COLOR_16_16_16_16: 271 *pitch_align = 1; /* tile_width */
118 case V_038004_COLOR_16_16_16_16_FLOAT: 272 *height_align = 1; /* tile_height */
119 *bpe = 8; 273 *depth_align = 1;
274 *base_align = 1;
120 break; 275 break;
121 case V_038004_FMT_16_16_16: 276 case ARRAY_LINEAR_ALIGNED:
122 case V_038004_FMT_16_16_16_FLOAT: 277 *pitch_align = max((u32)64, (u32)(values->group_size / values->blocksize));
123 *bpe = 6; 278 *height_align = tile_height;
279 *depth_align = 1;
280 *base_align = values->group_size;
124 break; 281 break;
125 case V_038004_FMT_32_32_32: 282 case ARRAY_1D_TILED_THIN1:
126 case V_038004_FMT_32_32_32_FLOAT: 283 *pitch_align = max((u32)tile_width,
127 *bpe = 12; 284 (u32)(values->group_size /
285 (tile_height * values->blocksize * values->nsamples)));
286 *height_align = tile_height;
287 *depth_align = 1;
288 *base_align = values->group_size;
128 break; 289 break;
129 case V_038004_COLOR_32_32_32_32: 290 case ARRAY_2D_TILED_THIN1:
130 case V_038004_COLOR_32_32_32_32_FLOAT: 291 *pitch_align = max((u32)macro_tile_width,
131 *bpe = 16; 292 (u32)(((values->group_size / tile_height) /
293 (values->blocksize * values->nsamples)) *
294 values->nbanks)) * tile_width;
295 *height_align = macro_tile_height * tile_height;
296 *depth_align = 1;
297 *base_align = max(macro_tile_bytes,
298 (*pitch_align) * values->blocksize * (*height_align) * values->nsamples);
132 break; 299 break;
133 case V_038004_FMT_GB_GR:
134 case V_038004_FMT_BG_RG:
135 case V_038004_COLOR_INVALID:
136 default: 300 default:
137 *bpe = 16;
138 return -EINVAL; 301 return -EINVAL;
139 } 302 }
303
140 return 0; 304 return 0;
141} 305}
142 306
@@ -153,10 +317,12 @@ static void r600_cs_track_init(struct r600_cs_track *track)
153 track->cb_color_info[i] = 0; 317 track->cb_color_info[i] = 0;
154 track->cb_color_bo[i] = NULL; 318 track->cb_color_bo[i] = NULL;
155 track->cb_color_bo_offset[i] = 0xFFFFFFFF; 319 track->cb_color_bo_offset[i] = 0xFFFFFFFF;
320 track->cb_color_bo_mc[i] = 0xFFFFFFFF;
156 } 321 }
157 track->cb_target_mask = 0xFFFFFFFF; 322 track->cb_target_mask = 0xFFFFFFFF;
158 track->cb_shader_mask = 0xFFFFFFFF; 323 track->cb_shader_mask = 0xFFFFFFFF;
159 track->db_bo = NULL; 324 track->db_bo = NULL;
325 track->db_bo_mc = 0xFFFFFFFF;
160 /* assume the biggest format and that htile is enabled */ 326 /* assume the biggest format and that htile is enabled */
161 track->db_depth_info = 7 | (1 << 25); 327 track->db_depth_info = 7 | (1 << 25);
162 track->db_depth_view = 0xFFFFC000; 328 track->db_depth_view = 0xFFFFC000;
@@ -168,71 +334,59 @@ static void r600_cs_track_init(struct r600_cs_track *track)
168static inline int r600_cs_track_validate_cb(struct radeon_cs_parser *p, int i) 334static inline int r600_cs_track_validate_cb(struct radeon_cs_parser *p, int i)
169{ 335{
170 struct r600_cs_track *track = p->track; 336 struct r600_cs_track *track = p->track;
171 u32 bpe = 0, pitch, slice_tile_max, size, tmp, height, pitch_align; 337 u32 slice_tile_max, size, tmp;
338 u32 height, height_align, pitch, pitch_align, depth_align;
339 u64 base_offset, base_align;
340 struct array_mode_checker array_check;
172 volatile u32 *ib = p->ib->ptr; 341 volatile u32 *ib = p->ib->ptr;
173 342 unsigned array_mode;
343 u32 format;
174 if (G_0280A0_TILE_MODE(track->cb_color_info[i])) { 344 if (G_0280A0_TILE_MODE(track->cb_color_info[i])) {
175 dev_warn(p->dev, "FMASK or CMASK buffer are not supported by this kernel\n"); 345 dev_warn(p->dev, "FMASK or CMASK buffer are not supported by this kernel\n");
176 return -EINVAL; 346 return -EINVAL;
177 } 347 }
178 size = radeon_bo_size(track->cb_color_bo[i]) - track->cb_color_bo_offset[i]; 348 size = radeon_bo_size(track->cb_color_bo[i]) - track->cb_color_bo_offset[i];
179 if (r600_bpe_from_format(&bpe, G_0280A0_FORMAT(track->cb_color_info[i]))) { 349 format = G_0280A0_FORMAT(track->cb_color_info[i]);
350 if (!fmt_is_valid_color(format)) {
180 dev_warn(p->dev, "%s:%d cb invalid format %d for %d (0x%08X)\n", 351 dev_warn(p->dev, "%s:%d cb invalid format %d for %d (0x%08X)\n",
181 __func__, __LINE__, G_0280A0_FORMAT(track->cb_color_info[i]), 352 __func__, __LINE__, format,
182 i, track->cb_color_info[i]); 353 i, track->cb_color_info[i]);
183 return -EINVAL; 354 return -EINVAL;
184 } 355 }
185 /* pitch is the number of 8x8 tiles per row */ 356 /* pitch in pixels */
186 pitch = G_028060_PITCH_TILE_MAX(track->cb_color_size[i]) + 1; 357 pitch = (G_028060_PITCH_TILE_MAX(track->cb_color_size[i]) + 1) * 8;
187 slice_tile_max = G_028060_SLICE_TILE_MAX(track->cb_color_size[i]) + 1; 358 slice_tile_max = G_028060_SLICE_TILE_MAX(track->cb_color_size[i]) + 1;
188 height = size / (pitch * 8 * bpe); 359 slice_tile_max *= 64;
360 height = slice_tile_max / pitch;
189 if (height > 8192) 361 if (height > 8192)
190 height = 8192; 362 height = 8192;
191 if (height > 7) 363 array_mode = G_0280A0_ARRAY_MODE(track->cb_color_info[i]);
192 height &= ~0x7; 364
193 switch (G_0280A0_ARRAY_MODE(track->cb_color_info[i])) { 365 base_offset = track->cb_color_bo_mc[i] + track->cb_color_bo_offset[i];
366 array_check.array_mode = array_mode;
367 array_check.group_size = track->group_size;
368 array_check.nbanks = track->nbanks;
369 array_check.npipes = track->npipes;
370 array_check.nsamples = track->nsamples;
371 array_check.blocksize = fmt_get_blocksize(format);
372 if (r600_get_array_mode_alignment(&array_check,
373 &pitch_align, &height_align, &depth_align, &base_align)) {
374 dev_warn(p->dev, "%s invalid tiling %d for %d (0x%08X)\n", __func__,
375 G_0280A0_ARRAY_MODE(track->cb_color_info[i]), i,
376 track->cb_color_info[i]);
377 return -EINVAL;
378 }
379 switch (array_mode) {
194 case V_0280A0_ARRAY_LINEAR_GENERAL: 380 case V_0280A0_ARRAY_LINEAR_GENERAL:
195 /* technically height & 0x7 */
196 break; 381 break;
197 case V_0280A0_ARRAY_LINEAR_ALIGNED: 382 case V_0280A0_ARRAY_LINEAR_ALIGNED:
198 pitch_align = max((u32)64, (u32)(track->group_size / bpe)) / 8;
199 if (!IS_ALIGNED(pitch, pitch_align)) {
200 dev_warn(p->dev, "%s:%d cb pitch (%d) invalid\n",
201 __func__, __LINE__, pitch);
202 return -EINVAL;
203 }
204 if (!IS_ALIGNED(height, 8)) {
205 dev_warn(p->dev, "%s:%d cb height (%d) invalid\n",
206 __func__, __LINE__, height);
207 return -EINVAL;
208 }
209 break; 383 break;
210 case V_0280A0_ARRAY_1D_TILED_THIN1: 384 case V_0280A0_ARRAY_1D_TILED_THIN1:
211 pitch_align = max((u32)8, (u32)(track->group_size / (8 * bpe * track->nsamples))) / 8; 385 /* avoid breaking userspace */
212 if (!IS_ALIGNED(pitch, pitch_align)) { 386 if (height > 7)
213 dev_warn(p->dev, "%s:%d cb pitch (%d) invalid\n", 387 height &= ~0x7;
214 __func__, __LINE__, pitch);
215 return -EINVAL;
216 }
217 if (!IS_ALIGNED(height, 8)) {
218 dev_warn(p->dev, "%s:%d cb height (%d) invalid\n",
219 __func__, __LINE__, height);
220 return -EINVAL;
221 }
222 break; 388 break;
223 case V_0280A0_ARRAY_2D_TILED_THIN1: 389 case V_0280A0_ARRAY_2D_TILED_THIN1:
224 pitch_align = max((u32)track->nbanks,
225 (u32)(((track->group_size / 8) / (bpe * track->nsamples)) * track->nbanks));
226 if (!IS_ALIGNED(pitch, pitch_align)) {
227 dev_warn(p->dev, "%s:%d cb pitch (%d) invalid\n",
228 __func__, __LINE__, pitch);
229 return -EINVAL;
230 }
231 if (!IS_ALIGNED((height / 8), track->nbanks)) {
232 dev_warn(p->dev, "%s:%d cb height (%d) invalid\n",
233 __func__, __LINE__, height);
234 return -EINVAL;
235 }
236 break; 390 break;
237 default: 391 default:
238 dev_warn(p->dev, "%s invalid tiling %d for %d (0x%08X)\n", __func__, 392 dev_warn(p->dev, "%s invalid tiling %d for %d (0x%08X)\n", __func__,
@@ -240,21 +394,46 @@ static inline int r600_cs_track_validate_cb(struct radeon_cs_parser *p, int i)
240 track->cb_color_info[i]); 394 track->cb_color_info[i]);
241 return -EINVAL; 395 return -EINVAL;
242 } 396 }
243 /* check offset */ 397
244 tmp = height * pitch * 8 * bpe; 398 if (!IS_ALIGNED(pitch, pitch_align)) {
245 if ((tmp + track->cb_color_bo_offset[i]) > radeon_bo_size(track->cb_color_bo[i])) { 399 dev_warn(p->dev, "%s:%d cb pitch (%d, 0x%x, %d) invalid\n",
246 dev_warn(p->dev, "%s offset[%d] %d too big\n", __func__, i, track->cb_color_bo_offset[i]); 400 __func__, __LINE__, pitch, pitch_align, array_mode);
247 return -EINVAL; 401 return -EINVAL;
248 } 402 }
249 if (!IS_ALIGNED(track->cb_color_bo_offset[i], track->group_size)) { 403 if (!IS_ALIGNED(height, height_align)) {
250 dev_warn(p->dev, "%s offset[%d] %d not aligned\n", __func__, i, track->cb_color_bo_offset[i]); 404 dev_warn(p->dev, "%s:%d cb height (%d, 0x%x, %d) invalid\n",
405 __func__, __LINE__, height, height_align, array_mode);
251 return -EINVAL; 406 return -EINVAL;
252 } 407 }
408 if (!IS_ALIGNED(base_offset, base_align)) {
409 dev_warn(p->dev, "%s offset[%d] 0x%llx 0x%llx, %d not aligned\n", __func__, i,
410 base_offset, base_align, array_mode);
411 return -EINVAL;
412 }
413
414 /* check offset */
415 tmp = fmt_get_nblocksy(format, height) * fmt_get_nblocksx(format, pitch) * fmt_get_blocksize(format);
416 if ((tmp + track->cb_color_bo_offset[i]) > radeon_bo_size(track->cb_color_bo[i])) {
417 if (array_mode == V_0280A0_ARRAY_LINEAR_GENERAL) {
418 /* the initial DDX does bad things with the CB size occasionally */
419 /* it rounds up height too far for slice tile max but the BO is smaller */
420 /* r600c,g also seem to flush at bad times in some apps resulting in
421 * bogus values here. So for linear just allow anything to avoid breaking
422 * broken userspace.
423 */
424 } else {
425 dev_warn(p->dev, "%s offset[%d] %d %d %d %lu too big\n", __func__, i,
426 array_mode,
427 track->cb_color_bo_offset[i], tmp,
428 radeon_bo_size(track->cb_color_bo[i]));
429 return -EINVAL;
430 }
431 }
253 /* limit max tile */ 432 /* limit max tile */
254 tmp = (height * pitch * 8) >> 6; 433 tmp = (height * pitch) >> 6;
255 if (tmp < slice_tile_max) 434 if (tmp < slice_tile_max)
256 slice_tile_max = tmp; 435 slice_tile_max = tmp;
257 tmp = S_028060_PITCH_TILE_MAX(pitch - 1) | 436 tmp = S_028060_PITCH_TILE_MAX((pitch / 8) - 1) |
258 S_028060_SLICE_TILE_MAX(slice_tile_max - 1); 437 S_028060_SLICE_TILE_MAX(slice_tile_max - 1);
259 ib[track->cb_color_size_idx[i]] = tmp; 438 ib[track->cb_color_size_idx[i]] = tmp;
260 return 0; 439 return 0;
@@ -296,7 +475,12 @@ static int r600_cs_track_check(struct radeon_cs_parser *p)
296 /* Check depth buffer */ 475 /* Check depth buffer */
297 if (G_028800_STENCIL_ENABLE(track->db_depth_control) || 476 if (G_028800_STENCIL_ENABLE(track->db_depth_control) ||
298 G_028800_Z_ENABLE(track->db_depth_control)) { 477 G_028800_Z_ENABLE(track->db_depth_control)) {
299 u32 nviews, bpe, ntiles, pitch, pitch_align, height, size; 478 u32 nviews, bpe, ntiles, size, slice_tile_max;
479 u32 height, height_align, pitch, pitch_align, depth_align;
480 u64 base_offset, base_align;
481 struct array_mode_checker array_check;
482 int array_mode;
483
300 if (track->db_bo == NULL) { 484 if (track->db_bo == NULL) {
301 dev_warn(p->dev, "z/stencil with no depth buffer\n"); 485 dev_warn(p->dev, "z/stencil with no depth buffer\n");
302 return -EINVAL; 486 return -EINVAL;
@@ -339,39 +523,34 @@ static int r600_cs_track_check(struct radeon_cs_parser *p)
339 ib[track->db_depth_size_idx] = S_028000_SLICE_TILE_MAX(tmp - 1) | (track->db_depth_size & 0x3FF); 523 ib[track->db_depth_size_idx] = S_028000_SLICE_TILE_MAX(tmp - 1) | (track->db_depth_size & 0x3FF);
340 } else { 524 } else {
341 size = radeon_bo_size(track->db_bo); 525 size = radeon_bo_size(track->db_bo);
342 pitch = G_028000_PITCH_TILE_MAX(track->db_depth_size) + 1; 526 /* pitch in pixels */
343 height = size / (pitch * 8 * bpe); 527 pitch = (G_028000_PITCH_TILE_MAX(track->db_depth_size) + 1) * 8;
344 height &= ~0x7; 528 slice_tile_max = G_028000_SLICE_TILE_MAX(track->db_depth_size) + 1;
345 if (!height) 529 slice_tile_max *= 64;
346 height = 8; 530 height = slice_tile_max / pitch;
347 531 if (height > 8192)
348 switch (G_028010_ARRAY_MODE(track->db_depth_info)) { 532 height = 8192;
533 base_offset = track->db_bo_mc + track->db_offset;
534 array_mode = G_028010_ARRAY_MODE(track->db_depth_info);
535 array_check.array_mode = array_mode;
536 array_check.group_size = track->group_size;
537 array_check.nbanks = track->nbanks;
538 array_check.npipes = track->npipes;
539 array_check.nsamples = track->nsamples;
540 array_check.blocksize = bpe;
541 if (r600_get_array_mode_alignment(&array_check,
542 &pitch_align, &height_align, &depth_align, &base_align)) {
543 dev_warn(p->dev, "%s invalid tiling %d (0x%08X)\n", __func__,
544 G_028010_ARRAY_MODE(track->db_depth_info),
545 track->db_depth_info);
546 return -EINVAL;
547 }
548 switch (array_mode) {
349 case V_028010_ARRAY_1D_TILED_THIN1: 549 case V_028010_ARRAY_1D_TILED_THIN1:
350 pitch_align = (max((u32)8, (u32)(track->group_size / (8 * bpe))) / 8); 550 /* don't break userspace */
351 if (!IS_ALIGNED(pitch, pitch_align)) { 551 height &= ~0x7;
352 dev_warn(p->dev, "%s:%d db pitch (%d) invalid\n",
353 __func__, __LINE__, pitch);
354 return -EINVAL;
355 }
356 if (!IS_ALIGNED(height, 8)) {
357 dev_warn(p->dev, "%s:%d db height (%d) invalid\n",
358 __func__, __LINE__, height);
359 return -EINVAL;
360 }
361 break; 552 break;
362 case V_028010_ARRAY_2D_TILED_THIN1: 553 case V_028010_ARRAY_2D_TILED_THIN1:
363 pitch_align = max((u32)track->nbanks,
364 (u32)(((track->group_size / 8) / bpe) * track->nbanks));
365 if (!IS_ALIGNED(pitch, pitch_align)) {
366 dev_warn(p->dev, "%s:%d db pitch (%d) invalid\n",
367 __func__, __LINE__, pitch);
368 return -EINVAL;
369 }
370 if ((height / 8) & (track->nbanks - 1)) {
371 dev_warn(p->dev, "%s:%d db height (%d) invalid\n",
372 __func__, __LINE__, height);
373 return -EINVAL;
374 }
375 break; 554 break;
376 default: 555 default:
377 dev_warn(p->dev, "%s invalid tiling %d (0x%08X)\n", __func__, 556 dev_warn(p->dev, "%s invalid tiling %d (0x%08X)\n", __func__,
@@ -379,17 +558,31 @@ static int r600_cs_track_check(struct radeon_cs_parser *p)
379 track->db_depth_info); 558 track->db_depth_info);
380 return -EINVAL; 559 return -EINVAL;
381 } 560 }
382 if (!IS_ALIGNED(track->db_offset, track->group_size)) { 561
383 dev_warn(p->dev, "%s offset[%d] %d not aligned\n", __func__, i, track->db_offset); 562 if (!IS_ALIGNED(pitch, pitch_align)) {
563 dev_warn(p->dev, "%s:%d db pitch (%d, 0x%x, %d) invalid\n",
564 __func__, __LINE__, pitch, pitch_align, array_mode);
384 return -EINVAL; 565 return -EINVAL;
385 } 566 }
567 if (!IS_ALIGNED(height, height_align)) {
568 dev_warn(p->dev, "%s:%d db height (%d, 0x%x, %d) invalid\n",
569 __func__, __LINE__, height, height_align, array_mode);
570 return -EINVAL;
571 }
572 if (!IS_ALIGNED(base_offset, base_align)) {
573 dev_warn(p->dev, "%s offset[%d] 0x%llx, 0x%llx, %d not aligned\n", __func__, i,
574 base_offset, base_align, array_mode);
575 return -EINVAL;
576 }
577
386 ntiles = G_028000_SLICE_TILE_MAX(track->db_depth_size) + 1; 578 ntiles = G_028000_SLICE_TILE_MAX(track->db_depth_size) + 1;
387 nviews = G_028004_SLICE_MAX(track->db_depth_view) + 1; 579 nviews = G_028004_SLICE_MAX(track->db_depth_view) + 1;
388 tmp = ntiles * bpe * 64 * nviews; 580 tmp = ntiles * bpe * 64 * nviews;
389 if ((tmp + track->db_offset) > radeon_bo_size(track->db_bo)) { 581 if ((tmp + track->db_offset) > radeon_bo_size(track->db_bo)) {
390 dev_warn(p->dev, "z/stencil buffer too small (0x%08X %d %d %d -> %d have %ld)\n", 582 dev_warn(p->dev, "z/stencil buffer (%d) too small (0x%08X %d %d %d -> %u have %lu)\n",
391 track->db_depth_size, ntiles, nviews, bpe, tmp + track->db_offset, 583 array_mode,
392 radeon_bo_size(track->db_bo)); 584 track->db_depth_size, ntiles, nviews, bpe, tmp + track->db_offset,
585 radeon_bo_size(track->db_bo));
393 return -EINVAL; 586 return -EINVAL;
394 } 587 }
395 } 588 }
@@ -595,33 +788,28 @@ static int r600_cs_packet_parse_vline(struct radeon_cs_parser *p)
595 if (wait_reg_mem.type != PACKET_TYPE3 || 788 if (wait_reg_mem.type != PACKET_TYPE3 ||
596 wait_reg_mem.opcode != PACKET3_WAIT_REG_MEM) { 789 wait_reg_mem.opcode != PACKET3_WAIT_REG_MEM) {
597 DRM_ERROR("vline wait missing WAIT_REG_MEM segment\n"); 790 DRM_ERROR("vline wait missing WAIT_REG_MEM segment\n");
598 r = -EINVAL; 791 return -EINVAL;
599 return r;
600 } 792 }
601 793
602 wait_reg_mem_info = radeon_get_ib_value(p, wait_reg_mem.idx + 1); 794 wait_reg_mem_info = radeon_get_ib_value(p, wait_reg_mem.idx + 1);
603 /* bit 4 is reg (0) or mem (1) */ 795 /* bit 4 is reg (0) or mem (1) */
604 if (wait_reg_mem_info & 0x10) { 796 if (wait_reg_mem_info & 0x10) {
605 DRM_ERROR("vline WAIT_REG_MEM waiting on MEM rather than REG\n"); 797 DRM_ERROR("vline WAIT_REG_MEM waiting on MEM rather than REG\n");
606 r = -EINVAL; 798 return -EINVAL;
607 return r;
608 } 799 }
609 /* waiting for value to be equal */ 800 /* waiting for value to be equal */
610 if ((wait_reg_mem_info & 0x7) != 0x3) { 801 if ((wait_reg_mem_info & 0x7) != 0x3) {
611 DRM_ERROR("vline WAIT_REG_MEM function not equal\n"); 802 DRM_ERROR("vline WAIT_REG_MEM function not equal\n");
612 r = -EINVAL; 803 return -EINVAL;
613 return r;
614 } 804 }
615 if ((radeon_get_ib_value(p, wait_reg_mem.idx + 2) << 2) != AVIVO_D1MODE_VLINE_STATUS) { 805 if ((radeon_get_ib_value(p, wait_reg_mem.idx + 2) << 2) != AVIVO_D1MODE_VLINE_STATUS) {
616 DRM_ERROR("vline WAIT_REG_MEM bad reg\n"); 806 DRM_ERROR("vline WAIT_REG_MEM bad reg\n");
617 r = -EINVAL; 807 return -EINVAL;
618 return r;
619 } 808 }
620 809
621 if (radeon_get_ib_value(p, wait_reg_mem.idx + 5) != AVIVO_D1MODE_VLINE_STAT) { 810 if (radeon_get_ib_value(p, wait_reg_mem.idx + 5) != AVIVO_D1MODE_VLINE_STAT) {
622 DRM_ERROR("vline WAIT_REG_MEM bad bit mask\n"); 811 DRM_ERROR("vline WAIT_REG_MEM bad bit mask\n");
623 r = -EINVAL; 812 return -EINVAL;
624 return r;
625 } 813 }
626 814
627 /* jump over the NOP */ 815 /* jump over the NOP */
@@ -640,8 +828,7 @@ static int r600_cs_packet_parse_vline(struct radeon_cs_parser *p)
640 obj = drm_mode_object_find(p->rdev->ddev, crtc_id, DRM_MODE_OBJECT_CRTC); 828 obj = drm_mode_object_find(p->rdev->ddev, crtc_id, DRM_MODE_OBJECT_CRTC);
641 if (!obj) { 829 if (!obj) {
642 DRM_ERROR("cannot find crtc %d\n", crtc_id); 830 DRM_ERROR("cannot find crtc %d\n", crtc_id);
643 r = -EINVAL; 831 return -EINVAL;
644 goto out;
645 } 832 }
646 crtc = obj_to_crtc(obj); 833 crtc = obj_to_crtc(obj);
647 radeon_crtc = to_radeon_crtc(crtc); 834 radeon_crtc = to_radeon_crtc(crtc);
@@ -664,14 +851,13 @@ static int r600_cs_packet_parse_vline(struct radeon_cs_parser *p)
664 break; 851 break;
665 default: 852 default:
666 DRM_ERROR("unknown crtc reloc\n"); 853 DRM_ERROR("unknown crtc reloc\n");
667 r = -EINVAL; 854 return -EINVAL;
668 goto out;
669 } 855 }
670 ib[h_idx] = header; 856 ib[h_idx] = header;
671 ib[h_idx + 4] = AVIVO_D2MODE_VLINE_STATUS >> 2; 857 ib[h_idx + 4] = AVIVO_D2MODE_VLINE_STATUS >> 2;
672 } 858 }
673out: 859
674 return r; 860 return 0;
675} 861}
676 862
677static int r600_packet0_check(struct radeon_cs_parser *p, 863static int r600_packet0_check(struct radeon_cs_parser *p,
@@ -743,7 +929,7 @@ static inline int r600_cs_check_reg(struct radeon_cs_parser *p, u32 reg, u32 idx
743 return 0; 929 return 0;
744 ib = p->ib->ptr; 930 ib = p->ib->ptr;
745 switch (reg) { 931 switch (reg) {
746 /* force following reg to 0 in an attemp to disable out buffer 932 /* force following reg to 0 in an attempt to disable out buffer
747 * which will need us to better understand how it works to perform 933 * which will need us to better understand how it works to perform
748 * security check on it (Jerome) 934 * security check on it (Jerome)
749 */ 935 */
@@ -938,6 +1124,7 @@ static inline int r600_cs_check_reg(struct radeon_cs_parser *p, u32 reg, u32 idx
938 ib[idx] += (u32)((reloc->lobj.gpu_offset >> 8) & 0xffffffff); 1124 ib[idx] += (u32)((reloc->lobj.gpu_offset >> 8) & 0xffffffff);
939 track->cb_color_base_last[tmp] = ib[idx]; 1125 track->cb_color_base_last[tmp] = ib[idx];
940 track->cb_color_bo[tmp] = reloc->robj; 1126 track->cb_color_bo[tmp] = reloc->robj;
1127 track->cb_color_bo_mc[tmp] = reloc->lobj.gpu_offset;
941 break; 1128 break;
942 case DB_DEPTH_BASE: 1129 case DB_DEPTH_BASE:
943 r = r600_cs_packet_next_reloc(p, &reloc); 1130 r = r600_cs_packet_next_reloc(p, &reloc);
@@ -949,6 +1136,7 @@ static inline int r600_cs_check_reg(struct radeon_cs_parser *p, u32 reg, u32 idx
949 track->db_offset = radeon_get_ib_value(p, idx) << 8; 1136 track->db_offset = radeon_get_ib_value(p, idx) << 8;
950 ib[idx] += (u32)((reloc->lobj.gpu_offset >> 8) & 0xffffffff); 1137 ib[idx] += (u32)((reloc->lobj.gpu_offset >> 8) & 0xffffffff);
951 track->db_bo = reloc->robj; 1138 track->db_bo = reloc->robj;
1139 track->db_bo_mc = reloc->lobj.gpu_offset;
952 break; 1140 break;
953 case DB_HTILE_DATA_BASE: 1141 case DB_HTILE_DATA_BASE:
954 case SQ_PGM_START_FS: 1142 case SQ_PGM_START_FS:
@@ -1019,39 +1207,61 @@ static inline int r600_cs_check_reg(struct radeon_cs_parser *p, u32 reg, u32 idx
1019 return 0; 1207 return 0;
1020} 1208}
1021 1209
1022static inline unsigned minify(unsigned size, unsigned levels) 1210static inline unsigned mip_minify(unsigned size, unsigned level)
1023{ 1211{
1024 size = size >> levels; 1212 unsigned val;
1025 if (size < 1) 1213
1026 size = 1; 1214 val = max(1U, size >> level);
1027 return size; 1215 if (level > 0)
1216 val = roundup_pow_of_two(val);
1217 return val;
1028} 1218}
1029 1219
1030static void r600_texture_size(unsigned nfaces, unsigned blevel, unsigned nlevels, 1220static void r600_texture_size(unsigned nfaces, unsigned blevel, unsigned llevel,
1031 unsigned w0, unsigned h0, unsigned d0, unsigned bpe, 1221 unsigned w0, unsigned h0, unsigned d0, unsigned format,
1032 unsigned pitch_align, 1222 unsigned block_align, unsigned height_align, unsigned base_align,
1033 unsigned *l0_size, unsigned *mipmap_size) 1223 unsigned *l0_size, unsigned *mipmap_size)
1034{ 1224{
1035 unsigned offset, i, level, face; 1225 unsigned offset, i, level;
1036 unsigned width, height, depth, rowstride, size; 1226 unsigned width, height, depth, size;
1227 unsigned blocksize;
1228 unsigned nbx, nby;
1229 unsigned nlevels = llevel - blevel + 1;
1037 1230
1038 w0 = minify(w0, 0); 1231 *l0_size = -1;
1039 h0 = minify(h0, 0); 1232 blocksize = fmt_get_blocksize(format);
1040 d0 = minify(d0, 0); 1233
1234 w0 = mip_minify(w0, 0);
1235 h0 = mip_minify(h0, 0);
1236 d0 = mip_minify(d0, 0);
1041 for(i = 0, offset = 0, level = blevel; i < nlevels; i++, level++) { 1237 for(i = 0, offset = 0, level = blevel; i < nlevels; i++, level++) {
1042 width = minify(w0, i); 1238 width = mip_minify(w0, i);
1043 height = minify(h0, i); 1239 nbx = fmt_get_nblocksx(format, width);
1044 depth = minify(d0, i); 1240
1045 for(face = 0; face < nfaces; face++) { 1241 nbx = round_up(nbx, block_align);
1046 rowstride = ALIGN((width * bpe), pitch_align); 1242
1047 size = height * rowstride * depth; 1243 height = mip_minify(h0, i);
1048 offset += size; 1244 nby = fmt_get_nblocksy(format, height);
1049 offset = (offset + 0x1f) & ~0x1f; 1245 nby = round_up(nby, height_align);
1050 } 1246
1247 depth = mip_minify(d0, i);
1248
1249 size = nbx * nby * blocksize;
1250 if (nfaces)
1251 size *= nfaces;
1252 else
1253 size *= depth;
1254
1255 if (i == 0)
1256 *l0_size = size;
1257
1258 if (i == 0 || i == 1)
1259 offset = round_up(offset, base_align);
1260
1261 offset += size;
1051 } 1262 }
1052 *l0_size = ALIGN((w0 * bpe), pitch_align) * h0 * d0;
1053 *mipmap_size = offset; 1263 *mipmap_size = offset;
1054 if (!nlevels) 1264 if (llevel == 0)
1055 *mipmap_size = *l0_size; 1265 *mipmap_size = *l0_size;
1056 if (!blevel) 1266 if (!blevel)
1057 *mipmap_size -= *l0_size; 1267 *mipmap_size -= *l0_size;
@@ -1070,16 +1280,27 @@ static void r600_texture_size(unsigned nfaces, unsigned blevel, unsigned nlevels
1070static inline int r600_check_texture_resource(struct radeon_cs_parser *p, u32 idx, 1280static inline int r600_check_texture_resource(struct radeon_cs_parser *p, u32 idx,
1071 struct radeon_bo *texture, 1281 struct radeon_bo *texture,
1072 struct radeon_bo *mipmap, 1282 struct radeon_bo *mipmap,
1283 u64 base_offset,
1284 u64 mip_offset,
1073 u32 tiling_flags) 1285 u32 tiling_flags)
1074{ 1286{
1075 struct r600_cs_track *track = p->track; 1287 struct r600_cs_track *track = p->track;
1076 u32 nfaces, nlevels, blevel, w0, h0, d0, bpe = 0; 1288 u32 nfaces, llevel, blevel, w0, h0, d0;
1077 u32 word0, word1, l0_size, mipmap_size, pitch, pitch_align; 1289 u32 word0, word1, l0_size, mipmap_size, word2, word3;
1290 u32 height_align, pitch, pitch_align, depth_align;
1291 u32 array, barray, larray;
1292 u64 base_align;
1293 struct array_mode_checker array_check;
1294 u32 format;
1078 1295
1079 /* on legacy kernel we don't perform advanced check */ 1296 /* on legacy kernel we don't perform advanced check */
1080 if (p->rdev == NULL) 1297 if (p->rdev == NULL)
1081 return 0; 1298 return 0;
1082 1299
1300 /* convert to bytes */
1301 base_offset <<= 8;
1302 mip_offset <<= 8;
1303
1083 word0 = radeon_get_ib_value(p, idx + 0); 1304 word0 = radeon_get_ib_value(p, idx + 0);
1084 if (tiling_flags & RADEON_TILING_MACRO) 1305 if (tiling_flags & RADEON_TILING_MACRO)
1085 word0 |= S_038000_TILE_MODE(V_038000_ARRAY_2D_TILED_THIN1); 1306 word0 |= S_038000_TILE_MODE(V_038000_ARRAY_2D_TILED_THIN1);
@@ -1096,82 +1317,89 @@ static inline int r600_check_texture_resource(struct radeon_cs_parser *p, u32 i
1096 case V_038000_SQ_TEX_DIM_3D: 1317 case V_038000_SQ_TEX_DIM_3D:
1097 break; 1318 break;
1098 case V_038000_SQ_TEX_DIM_CUBEMAP: 1319 case V_038000_SQ_TEX_DIM_CUBEMAP:
1099 nfaces = 6; 1320 if (p->family >= CHIP_RV770)
1321 nfaces = 8;
1322 else
1323 nfaces = 6;
1100 break; 1324 break;
1101 case V_038000_SQ_TEX_DIM_1D_ARRAY: 1325 case V_038000_SQ_TEX_DIM_1D_ARRAY:
1102 case V_038000_SQ_TEX_DIM_2D_ARRAY: 1326 case V_038000_SQ_TEX_DIM_2D_ARRAY:
1327 array = 1;
1328 break;
1103 case V_038000_SQ_TEX_DIM_2D_MSAA: 1329 case V_038000_SQ_TEX_DIM_2D_MSAA:
1104 case V_038000_SQ_TEX_DIM_2D_ARRAY_MSAA: 1330 case V_038000_SQ_TEX_DIM_2D_ARRAY_MSAA:
1105 default: 1331 default:
1106 dev_warn(p->dev, "this kernel doesn't support %d texture dim\n", G_038000_DIM(word0)); 1332 dev_warn(p->dev, "this kernel doesn't support %d texture dim\n", G_038000_DIM(word0));
1107 return -EINVAL; 1333 return -EINVAL;
1108 } 1334 }
1109 if (r600_bpe_from_format(&bpe, G_038004_DATA_FORMAT(word1))) { 1335 format = G_038004_DATA_FORMAT(word1);
1336 if (!fmt_is_valid_texture(format, p->family)) {
1110 dev_warn(p->dev, "%s:%d texture invalid format %d\n", 1337 dev_warn(p->dev, "%s:%d texture invalid format %d\n",
1111 __func__, __LINE__, G_038004_DATA_FORMAT(word1)); 1338 __func__, __LINE__, format);
1112 return -EINVAL; 1339 return -EINVAL;
1113 } 1340 }
1114 1341
1115 pitch = G_038000_PITCH(word0) + 1; 1342 /* pitch in texels */
1116 switch (G_038000_TILE_MODE(word0)) { 1343 pitch = (G_038000_PITCH(word0) + 1) * 8;
1117 case V_038000_ARRAY_LINEAR_GENERAL: 1344 array_check.array_mode = G_038000_TILE_MODE(word0);
1118 pitch_align = 1; 1345 array_check.group_size = track->group_size;
1119 /* XXX check height align */ 1346 array_check.nbanks = track->nbanks;
1120 break; 1347 array_check.npipes = track->npipes;
1121 case V_038000_ARRAY_LINEAR_ALIGNED: 1348 array_check.nsamples = 1;
1122 pitch_align = max((u32)64, (u32)(track->group_size / bpe)) / 8; 1349 array_check.blocksize = fmt_get_blocksize(format);
1123 if (!IS_ALIGNED(pitch, pitch_align)) { 1350 if (r600_get_array_mode_alignment(&array_check,
1124 dev_warn(p->dev, "%s:%d tex pitch (%d) invalid\n", 1351 &pitch_align, &height_align, &depth_align, &base_align)) {
1125 __func__, __LINE__, pitch); 1352 dev_warn(p->dev, "%s:%d tex array mode (%d) invalid\n",
1126 return -EINVAL; 1353 __func__, __LINE__, G_038000_TILE_MODE(word0));
1127 } 1354 return -EINVAL;
1128 /* XXX check height align */ 1355 }
1129 break; 1356
1130 case V_038000_ARRAY_1D_TILED_THIN1: 1357 /* XXX check height as well... */
1131 pitch_align = max((u32)8, (u32)(track->group_size / (8 * bpe))) / 8; 1358
1132 if (!IS_ALIGNED(pitch, pitch_align)) { 1359 if (!IS_ALIGNED(pitch, pitch_align)) {
1133 dev_warn(p->dev, "%s:%d tex pitch (%d) invalid\n", 1360 dev_warn(p->dev, "%s:%d tex pitch (%d, 0x%x, %d) invalid\n",
1134 __func__, __LINE__, pitch); 1361 __func__, __LINE__, pitch, pitch_align, G_038000_TILE_MODE(word0));
1135 return -EINVAL; 1362 return -EINVAL;
1136 } 1363 }
1137 /* XXX check height align */ 1364 if (!IS_ALIGNED(base_offset, base_align)) {
1138 break; 1365 dev_warn(p->dev, "%s:%d tex base offset (0x%llx, 0x%llx, %d) invalid\n",
1139 case V_038000_ARRAY_2D_TILED_THIN1: 1366 __func__, __LINE__, base_offset, base_align, G_038000_TILE_MODE(word0));
1140 pitch_align = max((u32)track->nbanks, 1367 return -EINVAL;
1141 (u32)(((track->group_size / 8) / bpe) * track->nbanks)); 1368 }
1142 if (!IS_ALIGNED(pitch, pitch_align)) { 1369 if (!IS_ALIGNED(mip_offset, base_align)) {
1143 dev_warn(p->dev, "%s:%d tex pitch (%d) invalid\n", 1370 dev_warn(p->dev, "%s:%d tex mip offset (0x%llx, 0x%llx, %d) invalid\n",
1144 __func__, __LINE__, pitch); 1371 __func__, __LINE__, mip_offset, base_align, G_038000_TILE_MODE(word0));
1145 return -EINVAL;
1146 }
1147 /* XXX check height align */
1148 break;
1149 default:
1150 dev_warn(p->dev, "%s invalid tiling %d (0x%08X)\n", __func__,
1151 G_038000_TILE_MODE(word0), word0);
1152 return -EINVAL; 1372 return -EINVAL;
1153 } 1373 }
1154 /* XXX check offset align */ 1374
1375 word2 = radeon_get_ib_value(p, idx + 2) << 8;
1376 word3 = radeon_get_ib_value(p, idx + 3) << 8;
1155 1377
1156 word0 = radeon_get_ib_value(p, idx + 4); 1378 word0 = radeon_get_ib_value(p, idx + 4);
1157 word1 = radeon_get_ib_value(p, idx + 5); 1379 word1 = radeon_get_ib_value(p, idx + 5);
1158 blevel = G_038010_BASE_LEVEL(word0); 1380 blevel = G_038010_BASE_LEVEL(word0);
1159 nlevels = G_038014_LAST_LEVEL(word1); 1381 llevel = G_038014_LAST_LEVEL(word1);
1160 r600_texture_size(nfaces, blevel, nlevels, w0, h0, d0, bpe, 1382 if (array == 1) {
1161 (pitch_align * bpe), 1383 barray = G_038014_BASE_ARRAY(word1);
1384 larray = G_038014_LAST_ARRAY(word1);
1385
1386 nfaces = larray - barray + 1;
1387 }
1388 r600_texture_size(nfaces, blevel, llevel, w0, h0, d0, format,
1389 pitch_align, height_align, base_align,
1162 &l0_size, &mipmap_size); 1390 &l0_size, &mipmap_size);
1163 /* using get ib will give us the offset into the texture bo */ 1391 /* using get ib will give us the offset into the texture bo */
1164 word0 = radeon_get_ib_value(p, idx + 2) << 8; 1392 if ((l0_size + word2) > radeon_bo_size(texture)) {
1165 if ((l0_size + word0) > radeon_bo_size(texture)) {
1166 dev_warn(p->dev, "texture bo too small (%d %d %d %d -> %d have %ld)\n", 1393 dev_warn(p->dev, "texture bo too small (%d %d %d %d -> %d have %ld)\n",
1167 w0, h0, bpe, word0, l0_size, radeon_bo_size(texture)); 1394 w0, h0, format, word2, l0_size, radeon_bo_size(texture));
1395 dev_warn(p->dev, "alignments %d %d %d %lld\n", pitch, pitch_align, height_align, base_align);
1168 return -EINVAL; 1396 return -EINVAL;
1169 } 1397 }
1170 /* using get ib will give us the offset into the mipmap bo */ 1398 /* using get ib will give us the offset into the mipmap bo */
1171 word0 = radeon_get_ib_value(p, idx + 3) << 8; 1399 word3 = radeon_get_ib_value(p, idx + 3) << 8;
1172 if ((mipmap_size + word0) > radeon_bo_size(mipmap)) { 1400 if ((mipmap_size + word3) > radeon_bo_size(mipmap)) {
1173 /*dev_warn(p->dev, "mipmap bo too small (%d %d %d %d %d %d -> %d have %ld)\n", 1401 /*dev_warn(p->dev, "mipmap bo too small (%d %d %d %d %d %d -> %d have %ld)\n",
1174 w0, h0, bpe, blevel, nlevels, word0, mipmap_size, radeon_bo_size(texture));*/ 1402 w0, h0, format, blevel, nlevels, word3, mipmap_size, radeon_bo_size(texture));*/
1175 } 1403 }
1176 return 0; 1404 return 0;
1177} 1405}
@@ -1194,6 +1422,38 @@ static int r600_packet3_check(struct radeon_cs_parser *p,
1194 idx_value = radeon_get_ib_value(p, idx); 1422 idx_value = radeon_get_ib_value(p, idx);
1195 1423
1196 switch (pkt->opcode) { 1424 switch (pkt->opcode) {
1425 case PACKET3_SET_PREDICATION:
1426 {
1427 int pred_op;
1428 int tmp;
1429 if (pkt->count != 1) {
1430 DRM_ERROR("bad SET PREDICATION\n");
1431 return -EINVAL;
1432 }
1433
1434 tmp = radeon_get_ib_value(p, idx + 1);
1435 pred_op = (tmp >> 16) & 0x7;
1436
1437 /* for the clear predicate operation */
1438 if (pred_op == 0)
1439 return 0;
1440
1441 if (pred_op > 2) {
1442 DRM_ERROR("bad SET PREDICATION operation %d\n", pred_op);
1443 return -EINVAL;
1444 }
1445
1446 r = r600_cs_packet_next_reloc(p, &reloc);
1447 if (r) {
1448 DRM_ERROR("bad SET PREDICATION\n");
1449 return -EINVAL;
1450 }
1451
1452 ib[idx + 0] = idx_value + (u32)(reloc->lobj.gpu_offset & 0xffffffff);
1453 ib[idx + 1] = tmp + (upper_32_bits(reloc->lobj.gpu_offset) & 0xff);
1454 }
1455 break;
1456
1197 case PACKET3_START_3D_CMDBUF: 1457 case PACKET3_START_3D_CMDBUF:
1198 if (p->family >= CHIP_RV770 || pkt->count) { 1458 if (p->family >= CHIP_RV770 || pkt->count) {
1199 DRM_ERROR("bad START_3D\n"); 1459 DRM_ERROR("bad START_3D\n");
@@ -1386,7 +1646,10 @@ static int r600_packet3_check(struct radeon_cs_parser *p,
1386 mip_offset = (u32)((reloc->lobj.gpu_offset >> 8) & 0xffffffff); 1646 mip_offset = (u32)((reloc->lobj.gpu_offset >> 8) & 0xffffffff);
1387 mipmap = reloc->robj; 1647 mipmap = reloc->robj;
1388 r = r600_check_texture_resource(p, idx+(i*7)+1, 1648 r = r600_check_texture_resource(p, idx+(i*7)+1,
1389 texture, mipmap, reloc->lobj.tiling_flags); 1649 texture, mipmap,
1650 base_offset + radeon_get_ib_value(p, idx+1+(i*7)+2),
1651 mip_offset + radeon_get_ib_value(p, idx+1+(i*7)+3),
1652 reloc->lobj.tiling_flags);
1390 if (r) 1653 if (r)
1391 return r; 1654 return r;
1392 ib[idx+1+(i*7)+2] += base_offset; 1655 ib[idx+1+(i*7)+2] += base_offset;
diff --git a/drivers/gpu/drm/radeon/r600_hdmi.c b/drivers/gpu/drm/radeon/r600_hdmi.c
index e6a58ed48dcf..f5ac7e788d81 100644
--- a/drivers/gpu/drm/radeon/r600_hdmi.c
+++ b/drivers/gpu/drm/radeon/r600_hdmi.c
@@ -26,6 +26,7 @@
26#include "drmP.h" 26#include "drmP.h"
27#include "radeon_drm.h" 27#include "radeon_drm.h"
28#include "radeon.h" 28#include "radeon.h"
29#include "radeon_asic.h"
29#include "atom.h" 30#include "atom.h"
30 31
31/* 32/*
@@ -333,7 +334,7 @@ void r600_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode *mod
333 r600_hdmi_videoinfoframe(encoder, RGB, 0, 0, 0, 0, 334 r600_hdmi_videoinfoframe(encoder, RGB, 0, 0, 0, 0,
334 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); 335 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
335 336
336 /* it's unknown what these bits do excatly, but it's indeed quite usefull for debugging */ 337 /* it's unknown what these bits do excatly, but it's indeed quite useful for debugging */
337 WREG32(offset+R600_HDMI_AUDIO_DEBUG_0, 0x00FFFFFF); 338 WREG32(offset+R600_HDMI_AUDIO_DEBUG_0, 0x00FFFFFF);
338 WREG32(offset+R600_HDMI_AUDIO_DEBUG_1, 0x007FFFFF); 339 WREG32(offset+R600_HDMI_AUDIO_DEBUG_1, 0x007FFFFF);
339 WREG32(offset+R600_HDMI_AUDIO_DEBUG_2, 0x00000001); 340 WREG32(offset+R600_HDMI_AUDIO_DEBUG_2, 0x00000001);
diff --git a/drivers/gpu/drm/radeon/r600_reg.h b/drivers/gpu/drm/radeon/r600_reg.h
index d84612ae47e0..f869897c7456 100644
--- a/drivers/gpu/drm/radeon/r600_reg.h
+++ b/drivers/gpu/drm/radeon/r600_reg.h
@@ -81,11 +81,16 @@
81#define R600_MEDIUM_VID_LOWER_GPIO_CNTL 0x720 81#define R600_MEDIUM_VID_LOWER_GPIO_CNTL 0x720
82#define R600_LOW_VID_LOWER_GPIO_CNTL 0x724 82#define R600_LOW_VID_LOWER_GPIO_CNTL 0x724
83 83
84 84#define R600_D1GRPH_SWAP_CONTROL 0x610C
85# define R600_D1GRPH_SWAP_ENDIAN_NONE (0 << 0)
86# define R600_D1GRPH_SWAP_ENDIAN_16BIT (1 << 0)
87# define R600_D1GRPH_SWAP_ENDIAN_32BIT (2 << 0)
88# define R600_D1GRPH_SWAP_ENDIAN_64BIT (3 << 0)
85 89
86#define R600_HDP_NONSURFACE_BASE 0x2c04 90#define R600_HDP_NONSURFACE_BASE 0x2c04
87 91
88#define R600_BUS_CNTL 0x5420 92#define R600_BUS_CNTL 0x5420
93# define R600_BIOS_ROM_DIS (1 << 1)
89#define R600_CONFIG_CNTL 0x5424 94#define R600_CONFIG_CNTL 0x5424
90#define R600_CONFIG_MEMSIZE 0x5428 95#define R600_CONFIG_MEMSIZE 0x5428
91#define R600_CONFIG_F0_BASE 0x542C 96#define R600_CONFIG_F0_BASE 0x542C
diff --git a/drivers/gpu/drm/radeon/r600d.h b/drivers/gpu/drm/radeon/r600d.h
index 858a1920c0d7..0245ae6c204e 100644
--- a/drivers/gpu/drm/radeon/r600d.h
+++ b/drivers/gpu/drm/radeon/r600d.h
@@ -51,6 +51,12 @@
51#define PTE_READABLE (1 << 5) 51#define PTE_READABLE (1 << 5)
52#define PTE_WRITEABLE (1 << 6) 52#define PTE_WRITEABLE (1 << 6)
53 53
54/* tiling bits */
55#define ARRAY_LINEAR_GENERAL 0x00000000
56#define ARRAY_LINEAR_ALIGNED 0x00000001
57#define ARRAY_1D_TILED_THIN1 0x00000002
58#define ARRAY_2D_TILED_THIN1 0x00000004
59
54/* Registers */ 60/* Registers */
55#define ARB_POP 0x2418 61#define ARB_POP 0x2418
56#define ENABLE_TC128 (1 << 30) 62#define ENABLE_TC128 (1 << 30)
@@ -148,13 +154,14 @@
148#define ROQ_IB2_START(x) ((x) << 8) 154#define ROQ_IB2_START(x) ((x) << 8)
149#define CP_RB_BASE 0xC100 155#define CP_RB_BASE 0xC100
150#define CP_RB_CNTL 0xC104 156#define CP_RB_CNTL 0xC104
151#define RB_BUFSZ(x) ((x)<<0) 157#define RB_BUFSZ(x) ((x) << 0)
152#define RB_BLKSZ(x) ((x)<<8) 158#define RB_BLKSZ(x) ((x) << 8)
153#define RB_NO_UPDATE (1<<27) 159#define RB_NO_UPDATE (1 << 27)
154#define RB_RPTR_WR_ENA (1<<31) 160#define RB_RPTR_WR_ENA (1 << 31)
155#define BUF_SWAP_32BIT (2 << 16) 161#define BUF_SWAP_32BIT (2 << 16)
156#define CP_RB_RPTR 0x8700 162#define CP_RB_RPTR 0x8700
157#define CP_RB_RPTR_ADDR 0xC10C 163#define CP_RB_RPTR_ADDR 0xC10C
164#define RB_RPTR_SWAP(x) ((x) << 0)
158#define CP_RB_RPTR_ADDR_HI 0xC110 165#define CP_RB_RPTR_ADDR_HI 0xC110
159#define CP_RB_RPTR_WR 0xC108 166#define CP_RB_RPTR_WR 0xC108
160#define CP_RB_WPTR 0xC114 167#define CP_RB_WPTR 0xC114
@@ -474,6 +481,7 @@
474#define VGT_VERTEX_REUSE_BLOCK_CNTL 0x28C58 481#define VGT_VERTEX_REUSE_BLOCK_CNTL 0x28C58
475#define VTX_REUSE_DEPTH_MASK 0x000000FF 482#define VTX_REUSE_DEPTH_MASK 0x000000FF
476#define VGT_EVENT_INITIATOR 0x28a90 483#define VGT_EVENT_INITIATOR 0x28a90
484# define CACHE_FLUSH_AND_INV_EVENT_TS (0x14 << 0)
477# define CACHE_FLUSH_AND_INV_EVENT (0x16 << 0) 485# define CACHE_FLUSH_AND_INV_EVENT (0x16 << 0)
478 486
479#define VM_CONTEXT0_CNTL 0x1410 487#define VM_CONTEXT0_CNTL 0x1410
@@ -528,7 +536,7 @@
528#define IH_RB_WPTR_ADDR_LO 0x3e14 536#define IH_RB_WPTR_ADDR_LO 0x3e14
529#define IH_CNTL 0x3e18 537#define IH_CNTL 0x3e18
530# define ENABLE_INTR (1 << 0) 538# define ENABLE_INTR (1 << 0)
531# define IH_MC_SWAP(x) ((x) << 2) 539# define IH_MC_SWAP(x) ((x) << 1)
532# define IH_MC_SWAP_NONE 0 540# define IH_MC_SWAP_NONE 0
533# define IH_MC_SWAP_16BIT 1 541# define IH_MC_SWAP_16BIT 1
534# define IH_MC_SWAP_32BIT 2 542# define IH_MC_SWAP_32BIT 2
@@ -721,6 +729,54 @@
721/* DCE 3.2 */ 729/* DCE 3.2 */
722# define DC_HPDx_EN (1 << 28) 730# define DC_HPDx_EN (1 << 28)
723 731
732#define D1GRPH_INTERRUPT_STATUS 0x6158
733#define D2GRPH_INTERRUPT_STATUS 0x6958
734# define DxGRPH_PFLIP_INT_OCCURRED (1 << 0)
735# define DxGRPH_PFLIP_INT_CLEAR (1 << 8)
736#define D1GRPH_INTERRUPT_CONTROL 0x615c
737#define D2GRPH_INTERRUPT_CONTROL 0x695c
738# define DxGRPH_PFLIP_INT_MASK (1 << 0)
739# define DxGRPH_PFLIP_INT_TYPE (1 << 8)
740
741/* PCIE link stuff */
742#define PCIE_LC_TRAINING_CNTL 0xa1 /* PCIE_P */
743# define LC_POINT_7_PLUS_EN (1 << 6)
744#define PCIE_LC_LINK_WIDTH_CNTL 0xa2 /* PCIE_P */
745# define LC_LINK_WIDTH_SHIFT 0
746# define LC_LINK_WIDTH_MASK 0x7
747# define LC_LINK_WIDTH_X0 0
748# define LC_LINK_WIDTH_X1 1
749# define LC_LINK_WIDTH_X2 2
750# define LC_LINK_WIDTH_X4 3
751# define LC_LINK_WIDTH_X8 4
752# define LC_LINK_WIDTH_X16 6
753# define LC_LINK_WIDTH_RD_SHIFT 4
754# define LC_LINK_WIDTH_RD_MASK 0x70
755# define LC_RECONFIG_ARC_MISSING_ESCAPE (1 << 7)
756# define LC_RECONFIG_NOW (1 << 8)
757# define LC_RENEGOTIATION_SUPPORT (1 << 9)
758# define LC_RENEGOTIATE_EN (1 << 10)
759# define LC_SHORT_RECONFIG_EN (1 << 11)
760# define LC_UPCONFIGURE_SUPPORT (1 << 12)
761# define LC_UPCONFIGURE_DIS (1 << 13)
762#define PCIE_LC_SPEED_CNTL 0xa4 /* PCIE_P */
763# define LC_GEN2_EN_STRAP (1 << 0)
764# define LC_TARGET_LINK_SPEED_OVERRIDE_EN (1 << 1)
765# define LC_FORCE_EN_HW_SPEED_CHANGE (1 << 5)
766# define LC_FORCE_DIS_HW_SPEED_CHANGE (1 << 6)
767# define LC_SPEED_CHANGE_ATTEMPTS_ALLOWED_MASK (0x3 << 8)
768# define LC_SPEED_CHANGE_ATTEMPTS_ALLOWED_SHIFT 3
769# define LC_CURRENT_DATA_RATE (1 << 11)
770# define LC_VOLTAGE_TIMER_SEL_MASK (0xf << 14)
771# define LC_CLR_FAILED_SPD_CHANGE_CNT (1 << 21)
772# define LC_OTHER_SIDE_EVER_SENT_GEN2 (1 << 23)
773# define LC_OTHER_SIDE_SUPPORTS_GEN2 (1 << 24)
774#define MM_CFGREGS_CNTL 0x544c
775# define MM_WR_TO_CFG_EN (1 << 3)
776#define LINK_CNTL2 0x88 /* F0 */
777# define TARGET_LINK_SPEED_MASK (0xf << 0)
778# define SELECTABLE_DEEMPHASIS (1 << 6)
779
724/* 780/*
725 * PM4 781 * PM4
726 */ 782 */
@@ -775,7 +831,27 @@
775#define PACKET3_ME_INITIALIZE_DEVICE_ID(x) ((x) << 16) 831#define PACKET3_ME_INITIALIZE_DEVICE_ID(x) ((x) << 16)
776#define PACKET3_COND_WRITE 0x45 832#define PACKET3_COND_WRITE 0x45
777#define PACKET3_EVENT_WRITE 0x46 833#define PACKET3_EVENT_WRITE 0x46
834#define EVENT_TYPE(x) ((x) << 0)
835#define EVENT_INDEX(x) ((x) << 8)
836 /* 0 - any non-TS event
837 * 1 - ZPASS_DONE
838 * 2 - SAMPLE_PIPELINESTAT
839 * 3 - SAMPLE_STREAMOUTSTAT*
840 * 4 - *S_PARTIAL_FLUSH
841 * 5 - TS events
842 */
778#define PACKET3_EVENT_WRITE_EOP 0x47 843#define PACKET3_EVENT_WRITE_EOP 0x47
844#define DATA_SEL(x) ((x) << 29)
845 /* 0 - discard
846 * 1 - send low 32bit data
847 * 2 - send 64bit data
848 * 3 - send 64bit counter value
849 */
850#define INT_SEL(x) ((x) << 24)
851 /* 0 - none
852 * 1 - interrupt only (DATA_SEL = 0)
853 * 2 - interrupt when data write is confirmed
854 */
779#define PACKET3_ONE_REG_WRITE 0x57 855#define PACKET3_ONE_REG_WRITE 0x57
780#define PACKET3_SET_CONFIG_REG 0x68 856#define PACKET3_SET_CONFIG_REG 0x68
781#define PACKET3_SET_CONFIG_REG_OFFSET 0x00008000 857#define PACKET3_SET_CONFIG_REG_OFFSET 0x00008000
@@ -1228,6 +1304,14 @@
1228#define V_038004_FMT_16_16_16_FLOAT 0x0000002E 1304#define V_038004_FMT_16_16_16_FLOAT 0x0000002E
1229#define V_038004_FMT_32_32_32 0x0000002F 1305#define V_038004_FMT_32_32_32 0x0000002F
1230#define V_038004_FMT_32_32_32_FLOAT 0x00000030 1306#define V_038004_FMT_32_32_32_FLOAT 0x00000030
1307#define V_038004_FMT_BC1 0x00000031
1308#define V_038004_FMT_BC2 0x00000032
1309#define V_038004_FMT_BC3 0x00000033
1310#define V_038004_FMT_BC4 0x00000034
1311#define V_038004_FMT_BC5 0x00000035
1312#define V_038004_FMT_BC6 0x00000036
1313#define V_038004_FMT_BC7 0x00000037
1314#define V_038004_FMT_32_AS_32_32_32_32 0x00000038
1231#define R_038010_SQ_TEX_RESOURCE_WORD4_0 0x038010 1315#define R_038010_SQ_TEX_RESOURCE_WORD4_0 0x038010
1232#define S_038010_FORMAT_COMP_X(x) (((x) & 0x3) << 0) 1316#define S_038010_FORMAT_COMP_X(x) (((x) & 0x3) << 0)
1233#define G_038010_FORMAT_COMP_X(x) (((x) >> 0) & 0x3) 1317#define G_038010_FORMAT_COMP_X(x) (((x) >> 0) & 0x3)
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index 9ff38c99a6ea..ef0e0e016914 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -69,6 +69,7 @@
69#include <ttm/ttm_bo_driver.h> 69#include <ttm/ttm_bo_driver.h>
70#include <ttm/ttm_placement.h> 70#include <ttm/ttm_placement.h>
71#include <ttm/ttm_module.h> 71#include <ttm/ttm_module.h>
72#include <ttm/ttm_execbuf_util.h>
72 73
73#include "radeon_family.h" 74#include "radeon_family.h"
74#include "radeon_mode.h" 75#include "radeon_mode.h"
@@ -88,10 +89,10 @@ extern int radeon_benchmarking;
88extern int radeon_testing; 89extern int radeon_testing;
89extern int radeon_connector_table; 90extern int radeon_connector_table;
90extern int radeon_tv; 91extern int radeon_tv;
91extern int radeon_new_pll;
92extern int radeon_audio; 92extern int radeon_audio;
93extern int radeon_disp_priority; 93extern int radeon_disp_priority;
94extern int radeon_hw_i2c; 94extern int radeon_hw_i2c;
95extern int radeon_pcie_gen2;
95 96
96/* 97/*
97 * Copy from radeon_drv.h so we don't have to include both and have conflicting 98 * Copy from radeon_drv.h so we don't have to include both and have conflicting
@@ -164,6 +165,7 @@ struct radeon_clock {
164 uint32_t default_sclk; 165 uint32_t default_sclk;
165 uint32_t default_dispclk; 166 uint32_t default_dispclk;
166 uint32_t dp_extclk; 167 uint32_t dp_extclk;
168 uint32_t max_pixel_clock;
167}; 169};
168 170
169/* 171/*
@@ -176,11 +178,13 @@ void radeon_pm_suspend(struct radeon_device *rdev);
176void radeon_pm_resume(struct radeon_device *rdev); 178void radeon_pm_resume(struct radeon_device *rdev);
177void radeon_combios_get_power_modes(struct radeon_device *rdev); 179void radeon_combios_get_power_modes(struct radeon_device *rdev);
178void radeon_atombios_get_power_modes(struct radeon_device *rdev); 180void radeon_atombios_get_power_modes(struct radeon_device *rdev);
179void radeon_atom_set_voltage(struct radeon_device *rdev, u16 level); 181void radeon_atom_set_voltage(struct radeon_device *rdev, u16 voltage_level, u8 voltage_type);
182int radeon_atom_get_max_vddc(struct radeon_device *rdev, u16 *voltage);
180void rs690_pm_info(struct radeon_device *rdev); 183void rs690_pm_info(struct radeon_device *rdev);
181extern u32 rv6xx_get_temp(struct radeon_device *rdev); 184extern int rv6xx_get_temp(struct radeon_device *rdev);
182extern u32 rv770_get_temp(struct radeon_device *rdev); 185extern int rv770_get_temp(struct radeon_device *rdev);
183extern u32 evergreen_get_temp(struct radeon_device *rdev); 186extern int evergreen_get_temp(struct radeon_device *rdev);
187extern int sumo_get_temp(struct radeon_device *rdev);
184 188
185/* 189/*
186 * Fences. 190 * Fences.
@@ -256,17 +260,17 @@ struct radeon_bo {
256 int surface_reg; 260 int surface_reg;
257 /* Constant after initialization */ 261 /* Constant after initialization */
258 struct radeon_device *rdev; 262 struct radeon_device *rdev;
259 struct drm_gem_object *gobj; 263 struct drm_gem_object gem_base;
260}; 264};
265#define gem_to_radeon_bo(gobj) container_of((gobj), struct radeon_bo, gem_base)
261 266
262struct radeon_bo_list { 267struct radeon_bo_list {
263 struct list_head list; 268 struct ttm_validate_buffer tv;
264 struct radeon_bo *bo; 269 struct radeon_bo *bo;
265 uint64_t gpu_offset; 270 uint64_t gpu_offset;
266 unsigned rdomain; 271 unsigned rdomain;
267 unsigned wdomain; 272 unsigned wdomain;
268 u32 tiling_flags; 273 u32 tiling_flags;
269 bool reserved;
270}; 274};
271 275
272/* 276/*
@@ -287,6 +291,15 @@ int radeon_gem_object_pin(struct drm_gem_object *obj, uint32_t pin_domain,
287 uint64_t *gpu_addr); 291 uint64_t *gpu_addr);
288void radeon_gem_object_unpin(struct drm_gem_object *obj); 292void radeon_gem_object_unpin(struct drm_gem_object *obj);
289 293
294int radeon_mode_dumb_create(struct drm_file *file_priv,
295 struct drm_device *dev,
296 struct drm_mode_create_dumb *args);
297int radeon_mode_dumb_mmap(struct drm_file *filp,
298 struct drm_device *dev,
299 uint32_t handle, uint64_t *offset_p);
300int radeon_mode_dumb_destroy(struct drm_file *file_priv,
301 struct drm_device *dev,
302 uint32_t handle);
290 303
291/* 304/*
292 * GART structures, functions & helpers 305 * GART structures, functions & helpers
@@ -318,6 +331,7 @@ struct radeon_gart {
318 union radeon_gart_table table; 331 union radeon_gart_table table;
319 struct page **pages; 332 struct page **pages;
320 dma_addr_t *pages_addr; 333 dma_addr_t *pages_addr;
334 bool *ttm_alloced;
321 bool ready; 335 bool ready;
322}; 336};
323 337
@@ -330,7 +344,8 @@ void radeon_gart_fini(struct radeon_device *rdev);
330void radeon_gart_unbind(struct radeon_device *rdev, unsigned offset, 344void radeon_gart_unbind(struct radeon_device *rdev, unsigned offset,
331 int pages); 345 int pages);
332int radeon_gart_bind(struct radeon_device *rdev, unsigned offset, 346int radeon_gart_bind(struct radeon_device *rdev, unsigned offset,
333 int pages, struct page **pagelist); 347 int pages, struct page **pagelist,
348 dma_addr_t *dma_addr);
334 349
335 350
336/* 351/*
@@ -344,7 +359,6 @@ struct radeon_mc {
344 * about vram size near mc fb location */ 359 * about vram size near mc fb location */
345 u64 mc_vram_size; 360 u64 mc_vram_size;
346 u64 visible_vram_size; 361 u64 visible_vram_size;
347 u64 active_vram_size;
348 u64 gtt_size; 362 u64 gtt_size;
349 u64 gtt_start; 363 u64 gtt_start;
350 u64 gtt_end; 364 u64 gtt_end;
@@ -366,6 +380,7 @@ bool radeon_atombios_sideport_present(struct radeon_device *rdev);
366 */ 380 */
367struct radeon_scratch { 381struct radeon_scratch {
368 unsigned num_reg; 382 unsigned num_reg;
383 uint32_t reg_base;
369 bool free[32]; 384 bool free[32];
370 uint32_t reg[32]; 385 uint32_t reg[32];
371}; 386};
@@ -377,11 +392,56 @@ void radeon_scratch_free(struct radeon_device *rdev, uint32_t reg);
377/* 392/*
378 * IRQS. 393 * IRQS.
379 */ 394 */
395
396struct radeon_unpin_work {
397 struct work_struct work;
398 struct radeon_device *rdev;
399 int crtc_id;
400 struct radeon_fence *fence;
401 struct drm_pending_vblank_event *event;
402 struct radeon_bo *old_rbo;
403 u64 new_crtc_base;
404};
405
406struct r500_irq_stat_regs {
407 u32 disp_int;
408};
409
410struct r600_irq_stat_regs {
411 u32 disp_int;
412 u32 disp_int_cont;
413 u32 disp_int_cont2;
414 u32 d1grph_int;
415 u32 d2grph_int;
416};
417
418struct evergreen_irq_stat_regs {
419 u32 disp_int;
420 u32 disp_int_cont;
421 u32 disp_int_cont2;
422 u32 disp_int_cont3;
423 u32 disp_int_cont4;
424 u32 disp_int_cont5;
425 u32 d1grph_int;
426 u32 d2grph_int;
427 u32 d3grph_int;
428 u32 d4grph_int;
429 u32 d5grph_int;
430 u32 d6grph_int;
431};
432
433union radeon_irq_stat_regs {
434 struct r500_irq_stat_regs r500;
435 struct r600_irq_stat_regs r600;
436 struct evergreen_irq_stat_regs evergreen;
437};
438
380struct radeon_irq { 439struct radeon_irq {
381 bool installed; 440 bool installed;
382 bool sw_int; 441 bool sw_int;
383 /* FIXME: use a define max crtc rather than hardcode it */ 442 /* FIXME: use a define max crtc rather than hardcode it */
384 bool crtc_vblank_int[6]; 443 bool crtc_vblank_int[6];
444 bool pflip[6];
385 wait_queue_head_t vblank_queue; 445 wait_queue_head_t vblank_queue;
386 /* FIXME: use defines for max hpd/dacs */ 446 /* FIXME: use defines for max hpd/dacs */
387 bool hpd[6]; 447 bool hpd[6];
@@ -392,12 +452,17 @@ struct radeon_irq {
392 bool hdmi[2]; 452 bool hdmi[2];
393 spinlock_t sw_lock; 453 spinlock_t sw_lock;
394 int sw_refcount; 454 int sw_refcount;
455 union radeon_irq_stat_regs stat_regs;
456 spinlock_t pflip_lock[6];
457 int pflip_refcount[6];
395}; 458};
396 459
397int radeon_irq_kms_init(struct radeon_device *rdev); 460int radeon_irq_kms_init(struct radeon_device *rdev);
398void radeon_irq_kms_fini(struct radeon_device *rdev); 461void radeon_irq_kms_fini(struct radeon_device *rdev);
399void radeon_irq_kms_sw_irq_get(struct radeon_device *rdev); 462void radeon_irq_kms_sw_irq_get(struct radeon_device *rdev);
400void radeon_irq_kms_sw_irq_put(struct radeon_device *rdev); 463void radeon_irq_kms_sw_irq_put(struct radeon_device *rdev);
464void radeon_irq_kms_pflip_irq_get(struct radeon_device *rdev, int crtc);
465void radeon_irq_kms_pflip_irq_put(struct radeon_device *rdev, int crtc);
401 466
402/* 467/*
403 * CP & ring. 468 * CP & ring.
@@ -594,8 +659,17 @@ struct radeon_wb {
594 struct radeon_bo *wb_obj; 659 struct radeon_bo *wb_obj;
595 volatile uint32_t *wb; 660 volatile uint32_t *wb;
596 uint64_t gpu_addr; 661 uint64_t gpu_addr;
662 bool enabled;
663 bool use_event;
597}; 664};
598 665
666#define RADEON_WB_SCRATCH_OFFSET 0
667#define RADEON_WB_CP_RPTR_OFFSET 1024
668#define RADEON_WB_CP1_RPTR_OFFSET 1280
669#define RADEON_WB_CP2_RPTR_OFFSET 1536
670#define R600_WB_IH_WPTR_OFFSET 2048
671#define R600_WB_EVENT_OFFSET 3072
672
599/** 673/**
600 * struct radeon_pm - power management datas 674 * struct radeon_pm - power management datas
601 * @max_bandwidth: maximum bandwidth the gpu has (MByte/s) 675 * @max_bandwidth: maximum bandwidth the gpu has (MByte/s)
@@ -607,11 +681,11 @@ struct radeon_wb {
607 * @sideport_bandwidth: sideport bandwidth the gpu has (MByte/s) (IGP) 681 * @sideport_bandwidth: sideport bandwidth the gpu has (MByte/s) (IGP)
608 * @ht_bandwidth: ht bandwidth the gpu has (MByte/s) (IGP) 682 * @ht_bandwidth: ht bandwidth the gpu has (MByte/s) (IGP)
609 * @core_bandwidth: core GPU bandwidth the gpu has (MByte/s) (IGP) 683 * @core_bandwidth: core GPU bandwidth the gpu has (MByte/s) (IGP)
610 * @sclk: GPU clock Mhz (core bandwith depends of this clock) 684 * @sclk: GPU clock Mhz (core bandwidth depends of this clock)
611 * @needed_bandwidth: current bandwidth needs 685 * @needed_bandwidth: current bandwidth needs
612 * 686 *
613 * It keeps track of various data needed to take powermanagement decision. 687 * It keeps track of various data needed to take powermanagement decision.
614 * Bandwith need is used to determine minimun clock of the GPU and memory. 688 * Bandwidth need is used to determine minimun clock of the GPU and memory.
615 * Equation between gpu/memory clock and available bandwidth is hw dependent 689 * Equation between gpu/memory clock and available bandwidth is hw dependent
616 * (type of memory, bus size, efficiency, ...) 690 * (type of memory, bus size, efficiency, ...)
617 */ 691 */
@@ -680,6 +754,8 @@ enum radeon_int_thermal_type {
680 THERMAL_TYPE_RV6XX, 754 THERMAL_TYPE_RV6XX,
681 THERMAL_TYPE_RV770, 755 THERMAL_TYPE_RV770,
682 THERMAL_TYPE_EVERGREEN, 756 THERMAL_TYPE_EVERGREEN,
757 THERMAL_TYPE_SUMO,
758 THERMAL_TYPE_NI,
683}; 759};
684 760
685struct radeon_voltage { 761struct radeon_voltage {
@@ -693,7 +769,9 @@ struct radeon_voltage {
693 u8 vddci_id; /* index into vddci voltage table */ 769 u8 vddci_id; /* index into vddci voltage table */
694 bool vddci_enabled; 770 bool vddci_enabled;
695 /* r6xx+ sw */ 771 /* r6xx+ sw */
696 u32 voltage; 772 u16 voltage;
773 /* evergreen+ vddci */
774 u16 vddci;
697}; 775};
698 776
699/* clock mode flags */ 777/* clock mode flags */
@@ -751,8 +829,7 @@ struct radeon_pm {
751 fixed20_12 sclk; 829 fixed20_12 sclk;
752 fixed20_12 mclk; 830 fixed20_12 mclk;
753 fixed20_12 needed_bandwidth; 831 fixed20_12 needed_bandwidth;
754 /* XXX: use a define for num power modes */ 832 struct radeon_power_state *power_state;
755 struct radeon_power_state power_state[8];
756 /* number of valid power states */ 833 /* number of valid power states */
757 int num_power_states; 834 int num_power_states;
758 int current_power_state_index; 835 int current_power_state_index;
@@ -762,7 +839,12 @@ struct radeon_pm {
762 int default_power_state_index; 839 int default_power_state_index;
763 u32 current_sclk; 840 u32 current_sclk;
764 u32 current_mclk; 841 u32 current_mclk;
765 u32 current_vddc; 842 u16 current_vddc;
843 u16 current_vddci;
844 u32 default_sclk;
845 u32 default_mclk;
846 u16 default_vddc;
847 u16 default_vddci;
766 struct radeon_i2c_chan *i2c_bus; 848 struct radeon_i2c_chan *i2c_bus;
767 /* selected pm method */ 849 /* selected pm method */
768 enum radeon_pm_method pm_method; 850 enum radeon_pm_method pm_method;
@@ -874,6 +956,10 @@ struct radeon_asic {
874 void (*pm_finish)(struct radeon_device *rdev); 956 void (*pm_finish)(struct radeon_device *rdev);
875 void (*pm_init_profile)(struct radeon_device *rdev); 957 void (*pm_init_profile)(struct radeon_device *rdev);
876 void (*pm_get_dynpm_state)(struct radeon_device *rdev); 958 void (*pm_get_dynpm_state)(struct radeon_device *rdev);
959 /* pageflipping */
960 void (*pre_page_flip)(struct radeon_device *rdev, int crtc);
961 u32 (*page_flip)(struct radeon_device *rdev, int crtc, u64 crtc_base);
962 void (*post_page_flip)(struct radeon_device *rdev, int crtc);
877}; 963};
878 964
879/* 965/*
@@ -968,6 +1054,46 @@ struct evergreen_asic {
968 unsigned tiling_npipes; 1054 unsigned tiling_npipes;
969 unsigned tiling_group_size; 1055 unsigned tiling_group_size;
970 unsigned tile_config; 1056 unsigned tile_config;
1057 struct r100_gpu_lockup lockup;
1058};
1059
1060struct cayman_asic {
1061 unsigned max_shader_engines;
1062 unsigned max_pipes_per_simd;
1063 unsigned max_tile_pipes;
1064 unsigned max_simds_per_se;
1065 unsigned max_backends_per_se;
1066 unsigned max_texture_channel_caches;
1067 unsigned max_gprs;
1068 unsigned max_threads;
1069 unsigned max_gs_threads;
1070 unsigned max_stack_entries;
1071 unsigned sx_num_of_sets;
1072 unsigned sx_max_export_size;
1073 unsigned sx_max_export_pos_size;
1074 unsigned sx_max_export_smx_size;
1075 unsigned max_hw_contexts;
1076 unsigned sq_num_cf_insts;
1077 unsigned sc_prim_fifo_size;
1078 unsigned sc_hiz_tile_fifo_size;
1079 unsigned sc_earlyz_tile_fifo_size;
1080
1081 unsigned num_shader_engines;
1082 unsigned num_shader_pipes_per_simd;
1083 unsigned num_tile_pipes;
1084 unsigned num_simds_per_se;
1085 unsigned num_backends_per_se;
1086 unsigned backend_disable_mask_per_asic;
1087 unsigned backend_map;
1088 unsigned num_texture_channel_caches;
1089 unsigned mem_max_burst_length_bytes;
1090 unsigned mem_row_size_in_kb;
1091 unsigned shader_engine_tile_size;
1092 unsigned num_gpus;
1093 unsigned multi_gpu_tile_size;
1094
1095 unsigned tile_config;
1096 struct r100_gpu_lockup lockup;
971}; 1097};
972 1098
973union radeon_asic_config { 1099union radeon_asic_config {
@@ -976,6 +1102,7 @@ union radeon_asic_config {
976 struct r600_asic r600; 1102 struct r600_asic r600;
977 struct rv770_asic rv770; 1103 struct rv770_asic rv770;
978 struct evergreen_asic evergreen; 1104 struct evergreen_asic evergreen;
1105 struct cayman_asic cayman;
979}; 1106};
980 1107
981/* 1108/*
@@ -1066,6 +1193,9 @@ struct radeon_device {
1066 struct radeon_mman mman; 1193 struct radeon_mman mman;
1067 struct radeon_fence_driver fence_drv; 1194 struct radeon_fence_driver fence_drv;
1068 struct radeon_cp cp; 1195 struct radeon_cp cp;
1196 /* cayman compute rings */
1197 struct radeon_cp cp1;
1198 struct radeon_cp cp2;
1069 struct radeon_ib_pool ib_pool; 1199 struct radeon_ib_pool ib_pool;
1070 struct radeon_irq irq; 1200 struct radeon_irq irq;
1071 struct radeon_asic *asic; 1201 struct radeon_asic *asic;
@@ -1084,11 +1214,11 @@ struct radeon_device {
1084 const struct firmware *me_fw; /* all family ME firmware */ 1214 const struct firmware *me_fw; /* all family ME firmware */
1085 const struct firmware *pfp_fw; /* r6/700 PFP firmware */ 1215 const struct firmware *pfp_fw; /* r6/700 PFP firmware */
1086 const struct firmware *rlc_fw; /* r6/700 RLC firmware */ 1216 const struct firmware *rlc_fw; /* r6/700 RLC firmware */
1217 const struct firmware *mc_fw; /* NI MC firmware */
1087 struct r600_blit r600_blit; 1218 struct r600_blit r600_blit;
1088 struct r700_vram_scratch vram_scratch; 1219 struct r700_vram_scratch vram_scratch;
1089 int msi_enabled; /* msi enabled */ 1220 int msi_enabled; /* msi enabled */
1090 struct r600_ih ih; /* r6/700 interrupt ring */ 1221 struct r600_ih ih; /* r6/700 interrupt ring */
1091 struct workqueue_struct *wq;
1092 struct work_struct hotplug_work; 1222 struct work_struct hotplug_work;
1093 int num_crtc; /* number of crtcs */ 1223 int num_crtc; /* number of crtcs */
1094 struct mutex dc_hw_i2c_mutex; /* display controller hw i2c mutex */ 1224 struct mutex dc_hw_i2c_mutex; /* display controller hw i2c mutex */
@@ -1103,10 +1233,10 @@ struct radeon_device {
1103 uint8_t audio_status_bits; 1233 uint8_t audio_status_bits;
1104 uint8_t audio_category_code; 1234 uint8_t audio_category_code;
1105 1235
1106 bool powered_down;
1107 struct notifier_block acpi_nb; 1236 struct notifier_block acpi_nb;
1108 /* only one userspace can use Hyperz features at a time */ 1237 /* only one userspace can use Hyperz features or CMASK at a time */
1109 struct drm_file *hyperz_filp; 1238 struct drm_file *hyperz_filp;
1239 struct drm_file *cmask_filp;
1110 /* i2c buses */ 1240 /* i2c buses */
1111 struct radeon_i2c_chan *i2c_bus[RADEON_MAX_I2C_BUS]; 1241 struct radeon_i2c_chan *i2c_bus[RADEON_MAX_I2C_BUS];
1112}; 1242};
@@ -1118,13 +1248,6 @@ int radeon_device_init(struct radeon_device *rdev,
1118void radeon_device_fini(struct radeon_device *rdev); 1248void radeon_device_fini(struct radeon_device *rdev);
1119int radeon_gpu_wait_for_idle(struct radeon_device *rdev); 1249int radeon_gpu_wait_for_idle(struct radeon_device *rdev);
1120 1250
1121/* r600 blit */
1122int r600_blit_prepare_copy(struct radeon_device *rdev, int size_bytes);
1123void r600_blit_done_copy(struct radeon_device *rdev, struct radeon_fence *fence);
1124void r600_kms_blit_copy(struct radeon_device *rdev,
1125 u64 src_gpu_addr, u64 dst_gpu_addr,
1126 int size_bytes);
1127
1128static inline uint32_t r100_mm_rreg(struct radeon_device *rdev, uint32_t reg) 1251static inline uint32_t r100_mm_rreg(struct radeon_device *rdev, uint32_t reg)
1129{ 1252{
1130 if (reg < rdev->rmmio_size) 1253 if (reg < rdev->rmmio_size)
@@ -1175,6 +1298,8 @@ static inline void r100_io_wreg(struct radeon_device *rdev, u32 reg, u32 v)
1175 */ 1298 */
1176#define RREG8(reg) readb(((void __iomem *)rdev->rmmio) + (reg)) 1299#define RREG8(reg) readb(((void __iomem *)rdev->rmmio) + (reg))
1177#define WREG8(reg, v) writeb(v, ((void __iomem *)rdev->rmmio) + (reg)) 1300#define WREG8(reg, v) writeb(v, ((void __iomem *)rdev->rmmio) + (reg))
1301#define RREG16(reg) readw(((void __iomem *)rdev->rmmio) + (reg))
1302#define WREG16(reg, v) writew(v, ((void __iomem *)rdev->rmmio) + (reg))
1178#define RREG32(reg) r100_mm_rreg(rdev, (reg)) 1303#define RREG32(reg) r100_mm_rreg(rdev, (reg))
1179#define DREG32(reg) printk(KERN_INFO "REGISTER: " #reg " : 0x%08X\n", r100_mm_rreg(rdev, (reg))) 1304#define DREG32(reg) printk(KERN_INFO "REGISTER: " #reg " : 0x%08X\n", r100_mm_rreg(rdev, (reg)))
1180#define WREG32(reg, v) r100_mm_wreg(rdev, (reg), (v)) 1305#define WREG32(reg, v) r100_mm_wreg(rdev, (reg), (v))
@@ -1248,10 +1373,25 @@ void r100_pll_errata_after_index(struct radeon_device *rdev);
1248 (rdev->family == CHIP_RV410) || \ 1373 (rdev->family == CHIP_RV410) || \
1249 (rdev->family == CHIP_RS400) || \ 1374 (rdev->family == CHIP_RS400) || \
1250 (rdev->family == CHIP_RS480)) 1375 (rdev->family == CHIP_RS480))
1376#define ASIC_IS_X2(rdev) ((rdev->ddev->pdev->device == 0x9441) || \
1377 (rdev->ddev->pdev->device == 0x9443) || \
1378 (rdev->ddev->pdev->device == 0x944B) || \
1379 (rdev->ddev->pdev->device == 0x9506) || \
1380 (rdev->ddev->pdev->device == 0x9509) || \
1381 (rdev->ddev->pdev->device == 0x950F) || \
1382 (rdev->ddev->pdev->device == 0x689C) || \
1383 (rdev->ddev->pdev->device == 0x689D))
1251#define ASIC_IS_AVIVO(rdev) ((rdev->family >= CHIP_RS600)) 1384#define ASIC_IS_AVIVO(rdev) ((rdev->family >= CHIP_RS600))
1385#define ASIC_IS_DCE2(rdev) ((rdev->family == CHIP_RS600) || \
1386 (rdev->family == CHIP_RS690) || \
1387 (rdev->family == CHIP_RS740) || \
1388 (rdev->family >= CHIP_R600))
1252#define ASIC_IS_DCE3(rdev) ((rdev->family >= CHIP_RV620)) 1389#define ASIC_IS_DCE3(rdev) ((rdev->family >= CHIP_RV620))
1253#define ASIC_IS_DCE32(rdev) ((rdev->family >= CHIP_RV730)) 1390#define ASIC_IS_DCE32(rdev) ((rdev->family >= CHIP_RV730))
1254#define ASIC_IS_DCE4(rdev) ((rdev->family >= CHIP_CEDAR)) 1391#define ASIC_IS_DCE4(rdev) ((rdev->family >= CHIP_CEDAR))
1392#define ASIC_IS_DCE41(rdev) ((rdev->family >= CHIP_PALM) && \
1393 (rdev->flags & RADEON_IS_IGP))
1394#define ASIC_IS_DCE5(rdev) ((rdev->family >= CHIP_BARTS))
1255 1395
1256/* 1396/*
1257 * BIOS helpers. 1397 * BIOS helpers.
@@ -1327,6 +1467,9 @@ static inline void radeon_ring_write(struct radeon_device *rdev, uint32_t v)
1327#define radeon_pm_finish(rdev) (rdev)->asic->pm_finish((rdev)) 1467#define radeon_pm_finish(rdev) (rdev)->asic->pm_finish((rdev))
1328#define radeon_pm_init_profile(rdev) (rdev)->asic->pm_init_profile((rdev)) 1468#define radeon_pm_init_profile(rdev) (rdev)->asic->pm_init_profile((rdev))
1329#define radeon_pm_get_dynpm_state(rdev) (rdev)->asic->pm_get_dynpm_state((rdev)) 1469#define radeon_pm_get_dynpm_state(rdev) (rdev)->asic->pm_get_dynpm_state((rdev))
1470#define radeon_pre_page_flip(rdev, crtc) rdev->asic->pre_page_flip((rdev), (crtc))
1471#define radeon_page_flip(rdev, crtc, base) rdev->asic->page_flip((rdev), (crtc), (base))
1472#define radeon_post_page_flip(rdev, crtc) rdev->asic->post_page_flip((rdev), (crtc))
1330 1473
1331/* Common functions */ 1474/* Common functions */
1332/* AGP */ 1475/* AGP */
@@ -1341,6 +1484,9 @@ extern void radeon_update_bandwidth_info(struct radeon_device *rdev);
1341extern void radeon_update_display_priority(struct radeon_device *rdev); 1484extern void radeon_update_display_priority(struct radeon_device *rdev);
1342extern bool radeon_boot_test_post_card(struct radeon_device *rdev); 1485extern bool radeon_boot_test_post_card(struct radeon_device *rdev);
1343extern void radeon_scratch_init(struct radeon_device *rdev); 1486extern void radeon_scratch_init(struct radeon_device *rdev);
1487extern void radeon_wb_fini(struct radeon_device *rdev);
1488extern int radeon_wb_init(struct radeon_device *rdev);
1489extern void radeon_wb_disable(struct radeon_device *rdev);
1344extern void radeon_surface_init(struct radeon_device *rdev); 1490extern void radeon_surface_init(struct radeon_device *rdev);
1345extern int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data); 1491extern int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data);
1346extern void radeon_legacy_set_clock_gating(struct radeon_device *rdev, int enable); 1492extern void radeon_legacy_set_clock_gating(struct radeon_device *rdev, int enable);
@@ -1351,120 +1497,17 @@ extern void radeon_vram_location(struct radeon_device *rdev, struct radeon_mc *m
1351extern void radeon_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc); 1497extern void radeon_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc);
1352extern int radeon_resume_kms(struct drm_device *dev); 1498extern int radeon_resume_kms(struct drm_device *dev);
1353extern int radeon_suspend_kms(struct drm_device *dev, pm_message_t state); 1499extern int radeon_suspend_kms(struct drm_device *dev, pm_message_t state);
1500extern void radeon_ttm_set_active_vram_size(struct radeon_device *rdev, u64 size);
1354 1501
1355/* r100,rv100,rs100,rv200,rs200,r200,rv250,rs300,rv280 */ 1502/*
1356extern void r100_gpu_lockup_update(struct r100_gpu_lockup *lockup, struct radeon_cp *cp); 1503 * r600 functions used by radeon_encoder.c
1357extern bool r100_gpu_cp_is_lockup(struct radeon_device *rdev, struct r100_gpu_lockup *lockup, struct radeon_cp *cp); 1504 */
1358
1359/* rv200,rv250,rv280 */
1360extern void r200_set_safe_registers(struct radeon_device *rdev);
1361
1362/* r300,r350,rv350,rv370,rv380 */
1363extern void r300_set_reg_safe(struct radeon_device *rdev);
1364extern void r300_mc_program(struct radeon_device *rdev);
1365extern void r300_mc_init(struct radeon_device *rdev);
1366extern void r300_clock_startup(struct radeon_device *rdev);
1367extern int r300_mc_wait_for_idle(struct radeon_device *rdev);
1368extern int rv370_pcie_gart_init(struct radeon_device *rdev);
1369extern void rv370_pcie_gart_fini(struct radeon_device *rdev);
1370extern int rv370_pcie_gart_enable(struct radeon_device *rdev);
1371extern void rv370_pcie_gart_disable(struct radeon_device *rdev);
1372
1373/* r420,r423,rv410 */
1374extern u32 r420_mc_rreg(struct radeon_device *rdev, u32 reg);
1375extern void r420_mc_wreg(struct radeon_device *rdev, u32 reg, u32 v);
1376extern int r420_debugfs_pipes_info_init(struct radeon_device *rdev);
1377extern void r420_pipes_init(struct radeon_device *rdev);
1378
1379/* rv515 */
1380struct rv515_mc_save {
1381 u32 d1vga_control;
1382 u32 d2vga_control;
1383 u32 vga_render_control;
1384 u32 vga_hdp_control;
1385 u32 d1crtc_control;
1386 u32 d2crtc_control;
1387};
1388extern void rv515_bandwidth_avivo_update(struct radeon_device *rdev);
1389extern void rv515_vga_render_disable(struct radeon_device *rdev);
1390extern void rv515_set_safe_registers(struct radeon_device *rdev);
1391extern void rv515_mc_stop(struct radeon_device *rdev, struct rv515_mc_save *save);
1392extern void rv515_mc_resume(struct radeon_device *rdev, struct rv515_mc_save *save);
1393extern void rv515_clock_startup(struct radeon_device *rdev);
1394extern void rv515_debugfs(struct radeon_device *rdev);
1395extern int rv515_suspend(struct radeon_device *rdev);
1396
1397/* rs400 */
1398extern int rs400_gart_init(struct radeon_device *rdev);
1399extern int rs400_gart_enable(struct radeon_device *rdev);
1400extern void rs400_gart_adjust_size(struct radeon_device *rdev);
1401extern void rs400_gart_disable(struct radeon_device *rdev);
1402extern void rs400_gart_fini(struct radeon_device *rdev);
1403
1404/* rs600 */
1405extern void rs600_set_safe_registers(struct radeon_device *rdev);
1406extern int rs600_irq_set(struct radeon_device *rdev);
1407extern void rs600_irq_disable(struct radeon_device *rdev);
1408
1409/* rs690, rs740 */
1410extern void rs690_line_buffer_adjust(struct radeon_device *rdev,
1411 struct drm_display_mode *mode1,
1412 struct drm_display_mode *mode2);
1413
1414/* r600, rv610, rv630, rv620, rv635, rv670, rs780, rs880 */
1415extern void r600_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc);
1416extern bool r600_card_posted(struct radeon_device *rdev);
1417extern void r600_cp_stop(struct radeon_device *rdev);
1418extern int r600_cp_start(struct radeon_device *rdev);
1419extern void r600_ring_init(struct radeon_device *rdev, unsigned ring_size);
1420extern int r600_cp_resume(struct radeon_device *rdev);
1421extern void r600_cp_fini(struct radeon_device *rdev);
1422extern int r600_count_pipe_bits(uint32_t val);
1423extern int r600_mc_wait_for_idle(struct radeon_device *rdev);
1424extern int r600_pcie_gart_init(struct radeon_device *rdev);
1425extern void r600_pcie_gart_tlb_flush(struct radeon_device *rdev);
1426extern int r600_ib_test(struct radeon_device *rdev);
1427extern int r600_ring_test(struct radeon_device *rdev);
1428extern void r600_wb_fini(struct radeon_device *rdev);
1429extern int r600_wb_enable(struct radeon_device *rdev);
1430extern void r600_wb_disable(struct radeon_device *rdev);
1431extern void r600_scratch_init(struct radeon_device *rdev);
1432extern int r600_blit_init(struct radeon_device *rdev);
1433extern void r600_blit_fini(struct radeon_device *rdev);
1434extern int r600_init_microcode(struct radeon_device *rdev);
1435extern int r600_asic_reset(struct radeon_device *rdev);
1436/* r600 irq */
1437extern int r600_irq_init(struct radeon_device *rdev);
1438extern void r600_irq_fini(struct radeon_device *rdev);
1439extern void r600_ih_ring_init(struct radeon_device *rdev, unsigned ring_size);
1440extern int r600_irq_set(struct radeon_device *rdev);
1441extern void r600_irq_suspend(struct radeon_device *rdev);
1442extern void r600_disable_interrupts(struct radeon_device *rdev);
1443extern void r600_rlc_stop(struct radeon_device *rdev);
1444/* r600 audio */
1445extern int r600_audio_init(struct radeon_device *rdev);
1446extern int r600_audio_tmds_index(struct drm_encoder *encoder);
1447extern void r600_audio_set_clock(struct drm_encoder *encoder, int clock);
1448extern int r600_audio_channels(struct radeon_device *rdev);
1449extern int r600_audio_bits_per_sample(struct radeon_device *rdev);
1450extern int r600_audio_rate(struct radeon_device *rdev);
1451extern uint8_t r600_audio_status_bits(struct radeon_device *rdev);
1452extern uint8_t r600_audio_category_code(struct radeon_device *rdev);
1453extern void r600_audio_schedule_polling(struct radeon_device *rdev);
1454extern void r600_audio_enable_polling(struct drm_encoder *encoder);
1455extern void r600_audio_disable_polling(struct drm_encoder *encoder);
1456extern void r600_audio_fini(struct radeon_device *rdev);
1457extern void r600_hdmi_init(struct drm_encoder *encoder);
1458extern void r600_hdmi_enable(struct drm_encoder *encoder); 1505extern void r600_hdmi_enable(struct drm_encoder *encoder);
1459extern void r600_hdmi_disable(struct drm_encoder *encoder); 1506extern void r600_hdmi_disable(struct drm_encoder *encoder);
1460extern void r600_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode *mode); 1507extern void r600_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode *mode);
1461extern int r600_hdmi_buffer_status_changed(struct drm_encoder *encoder);
1462extern void r600_hdmi_update_audio_settings(struct drm_encoder *encoder);
1463 1508
1464extern void r700_cp_stop(struct radeon_device *rdev); 1509extern int ni_init_microcode(struct radeon_device *rdev);
1465extern void r700_cp_fini(struct radeon_device *rdev); 1510extern int ni_mc_load_microcode(struct radeon_device *rdev);
1466extern void evergreen_disable_interrupt_state(struct radeon_device *rdev);
1467extern int evergreen_irq_set(struct radeon_device *rdev);
1468 1511
1469/* radeon_acpi.c */ 1512/* radeon_acpi.c */
1470#if defined(CONFIG_ACPI) 1513#if defined(CONFIG_ACPI)
@@ -1473,14 +1516,6 @@ extern int radeon_acpi_init(struct radeon_device *rdev);
1473static inline int radeon_acpi_init(struct radeon_device *rdev) { return 0; } 1516static inline int radeon_acpi_init(struct radeon_device *rdev) { return 0; }
1474#endif 1517#endif
1475 1518
1476/* evergreen */
1477struct evergreen_mc_save {
1478 u32 vga_control[6];
1479 u32 vga_render_control;
1480 u32 vga_hdp_control;
1481 u32 crtc_control[6];
1482};
1483
1484#include "radeon_object.h" 1519#include "radeon_object.h"
1485 1520
1486#endif 1521#endif
diff --git a/drivers/gpu/drm/radeon/radeon_asic.c b/drivers/gpu/drm/radeon/radeon_asic.c
index 25e1dd197791..b2449629537d 100644
--- a/drivers/gpu/drm/radeon/radeon_asic.c
+++ b/drivers/gpu/drm/radeon/radeon_asic.c
@@ -94,7 +94,7 @@ static void radeon_register_accessor_init(struct radeon_device *rdev)
94 rdev->mc_rreg = &rs600_mc_rreg; 94 rdev->mc_rreg = &rs600_mc_rreg;
95 rdev->mc_wreg = &rs600_mc_wreg; 95 rdev->mc_wreg = &rs600_mc_wreg;
96 } 96 }
97 if ((rdev->family >= CHIP_R600) && (rdev->family <= CHIP_RV740)) { 97 if (rdev->family >= CHIP_R600) {
98 rdev->pciep_rreg = &r600_pciep_rreg; 98 rdev->pciep_rreg = &r600_pciep_rreg;
99 rdev->pciep_wreg = &r600_pciep_wreg; 99 rdev->pciep_wreg = &r600_pciep_wreg;
100 } 100 }
@@ -171,6 +171,9 @@ static struct radeon_asic r100_asic = {
171 .pm_finish = &r100_pm_finish, 171 .pm_finish = &r100_pm_finish,
172 .pm_init_profile = &r100_pm_init_profile, 172 .pm_init_profile = &r100_pm_init_profile,
173 .pm_get_dynpm_state = &r100_pm_get_dynpm_state, 173 .pm_get_dynpm_state = &r100_pm_get_dynpm_state,
174 .pre_page_flip = &r100_pre_page_flip,
175 .page_flip = &r100_page_flip,
176 .post_page_flip = &r100_post_page_flip,
174}; 177};
175 178
176static struct radeon_asic r200_asic = { 179static struct radeon_asic r200_asic = {
@@ -215,6 +218,9 @@ static struct radeon_asic r200_asic = {
215 .pm_finish = &r100_pm_finish, 218 .pm_finish = &r100_pm_finish,
216 .pm_init_profile = &r100_pm_init_profile, 219 .pm_init_profile = &r100_pm_init_profile,
217 .pm_get_dynpm_state = &r100_pm_get_dynpm_state, 220 .pm_get_dynpm_state = &r100_pm_get_dynpm_state,
221 .pre_page_flip = &r100_pre_page_flip,
222 .page_flip = &r100_page_flip,
223 .post_page_flip = &r100_post_page_flip,
218}; 224};
219 225
220static struct radeon_asic r300_asic = { 226static struct radeon_asic r300_asic = {
@@ -260,6 +266,9 @@ static struct radeon_asic r300_asic = {
260 .pm_finish = &r100_pm_finish, 266 .pm_finish = &r100_pm_finish,
261 .pm_init_profile = &r100_pm_init_profile, 267 .pm_init_profile = &r100_pm_init_profile,
262 .pm_get_dynpm_state = &r100_pm_get_dynpm_state, 268 .pm_get_dynpm_state = &r100_pm_get_dynpm_state,
269 .pre_page_flip = &r100_pre_page_flip,
270 .page_flip = &r100_page_flip,
271 .post_page_flip = &r100_post_page_flip,
263}; 272};
264 273
265static struct radeon_asic r300_asic_pcie = { 274static struct radeon_asic r300_asic_pcie = {
@@ -304,6 +313,9 @@ static struct radeon_asic r300_asic_pcie = {
304 .pm_finish = &r100_pm_finish, 313 .pm_finish = &r100_pm_finish,
305 .pm_init_profile = &r100_pm_init_profile, 314 .pm_init_profile = &r100_pm_init_profile,
306 .pm_get_dynpm_state = &r100_pm_get_dynpm_state, 315 .pm_get_dynpm_state = &r100_pm_get_dynpm_state,
316 .pre_page_flip = &r100_pre_page_flip,
317 .page_flip = &r100_page_flip,
318 .post_page_flip = &r100_post_page_flip,
307}; 319};
308 320
309static struct radeon_asic r420_asic = { 321static struct radeon_asic r420_asic = {
@@ -349,6 +361,9 @@ static struct radeon_asic r420_asic = {
349 .pm_finish = &r100_pm_finish, 361 .pm_finish = &r100_pm_finish,
350 .pm_init_profile = &r420_pm_init_profile, 362 .pm_init_profile = &r420_pm_init_profile,
351 .pm_get_dynpm_state = &r100_pm_get_dynpm_state, 363 .pm_get_dynpm_state = &r100_pm_get_dynpm_state,
364 .pre_page_flip = &r100_pre_page_flip,
365 .page_flip = &r100_page_flip,
366 .post_page_flip = &r100_post_page_flip,
352}; 367};
353 368
354static struct radeon_asic rs400_asic = { 369static struct radeon_asic rs400_asic = {
@@ -394,6 +409,9 @@ static struct radeon_asic rs400_asic = {
394 .pm_finish = &r100_pm_finish, 409 .pm_finish = &r100_pm_finish,
395 .pm_init_profile = &r100_pm_init_profile, 410 .pm_init_profile = &r100_pm_init_profile,
396 .pm_get_dynpm_state = &r100_pm_get_dynpm_state, 411 .pm_get_dynpm_state = &r100_pm_get_dynpm_state,
412 .pre_page_flip = &r100_pre_page_flip,
413 .page_flip = &r100_page_flip,
414 .post_page_flip = &r100_post_page_flip,
397}; 415};
398 416
399static struct radeon_asic rs600_asic = { 417static struct radeon_asic rs600_asic = {
@@ -439,6 +457,9 @@ static struct radeon_asic rs600_asic = {
439 .pm_finish = &rs600_pm_finish, 457 .pm_finish = &rs600_pm_finish,
440 .pm_init_profile = &r420_pm_init_profile, 458 .pm_init_profile = &r420_pm_init_profile,
441 .pm_get_dynpm_state = &r100_pm_get_dynpm_state, 459 .pm_get_dynpm_state = &r100_pm_get_dynpm_state,
460 .pre_page_flip = &rs600_pre_page_flip,
461 .page_flip = &rs600_page_flip,
462 .post_page_flip = &rs600_post_page_flip,
442}; 463};
443 464
444static struct radeon_asic rs690_asic = { 465static struct radeon_asic rs690_asic = {
@@ -484,6 +505,9 @@ static struct radeon_asic rs690_asic = {
484 .pm_finish = &rs600_pm_finish, 505 .pm_finish = &rs600_pm_finish,
485 .pm_init_profile = &r420_pm_init_profile, 506 .pm_init_profile = &r420_pm_init_profile,
486 .pm_get_dynpm_state = &r100_pm_get_dynpm_state, 507 .pm_get_dynpm_state = &r100_pm_get_dynpm_state,
508 .pre_page_flip = &rs600_pre_page_flip,
509 .page_flip = &rs600_page_flip,
510 .post_page_flip = &rs600_post_page_flip,
487}; 511};
488 512
489static struct radeon_asic rv515_asic = { 513static struct radeon_asic rv515_asic = {
@@ -529,6 +553,9 @@ static struct radeon_asic rv515_asic = {
529 .pm_finish = &rs600_pm_finish, 553 .pm_finish = &rs600_pm_finish,
530 .pm_init_profile = &r420_pm_init_profile, 554 .pm_init_profile = &r420_pm_init_profile,
531 .pm_get_dynpm_state = &r100_pm_get_dynpm_state, 555 .pm_get_dynpm_state = &r100_pm_get_dynpm_state,
556 .pre_page_flip = &rs600_pre_page_flip,
557 .page_flip = &rs600_page_flip,
558 .post_page_flip = &rs600_post_page_flip,
532}; 559};
533 560
534static struct radeon_asic r520_asic = { 561static struct radeon_asic r520_asic = {
@@ -574,6 +601,9 @@ static struct radeon_asic r520_asic = {
574 .pm_finish = &rs600_pm_finish, 601 .pm_finish = &rs600_pm_finish,
575 .pm_init_profile = &r420_pm_init_profile, 602 .pm_init_profile = &r420_pm_init_profile,
576 .pm_get_dynpm_state = &r100_pm_get_dynpm_state, 603 .pm_get_dynpm_state = &r100_pm_get_dynpm_state,
604 .pre_page_flip = &rs600_pre_page_flip,
605 .page_flip = &rs600_page_flip,
606 .post_page_flip = &rs600_post_page_flip,
577}; 607};
578 608
579static struct radeon_asic r600_asic = { 609static struct radeon_asic r600_asic = {
@@ -601,8 +631,8 @@ static struct radeon_asic r600_asic = {
601 .set_engine_clock = &radeon_atom_set_engine_clock, 631 .set_engine_clock = &radeon_atom_set_engine_clock,
602 .get_memory_clock = &radeon_atom_get_memory_clock, 632 .get_memory_clock = &radeon_atom_get_memory_clock,
603 .set_memory_clock = &radeon_atom_set_memory_clock, 633 .set_memory_clock = &radeon_atom_set_memory_clock,
604 .get_pcie_lanes = &rv370_get_pcie_lanes, 634 .get_pcie_lanes = &r600_get_pcie_lanes,
605 .set_pcie_lanes = NULL, 635 .set_pcie_lanes = &r600_set_pcie_lanes,
606 .set_clock_gating = NULL, 636 .set_clock_gating = NULL,
607 .set_surface_reg = r600_set_surface_reg, 637 .set_surface_reg = r600_set_surface_reg,
608 .clear_surface_reg = r600_clear_surface_reg, 638 .clear_surface_reg = r600_clear_surface_reg,
@@ -618,6 +648,9 @@ static struct radeon_asic r600_asic = {
618 .pm_finish = &rs600_pm_finish, 648 .pm_finish = &rs600_pm_finish,
619 .pm_init_profile = &r600_pm_init_profile, 649 .pm_init_profile = &r600_pm_init_profile,
620 .pm_get_dynpm_state = &r600_pm_get_dynpm_state, 650 .pm_get_dynpm_state = &r600_pm_get_dynpm_state,
651 .pre_page_flip = &rs600_pre_page_flip,
652 .page_flip = &rs600_page_flip,
653 .post_page_flip = &rs600_post_page_flip,
621}; 654};
622 655
623static struct radeon_asic rs780_asic = { 656static struct radeon_asic rs780_asic = {
@@ -662,6 +695,9 @@ static struct radeon_asic rs780_asic = {
662 .pm_finish = &rs600_pm_finish, 695 .pm_finish = &rs600_pm_finish,
663 .pm_init_profile = &rs780_pm_init_profile, 696 .pm_init_profile = &rs780_pm_init_profile,
664 .pm_get_dynpm_state = &r600_pm_get_dynpm_state, 697 .pm_get_dynpm_state = &r600_pm_get_dynpm_state,
698 .pre_page_flip = &rs600_pre_page_flip,
699 .page_flip = &rs600_page_flip,
700 .post_page_flip = &rs600_post_page_flip,
665}; 701};
666 702
667static struct radeon_asic rv770_asic = { 703static struct radeon_asic rv770_asic = {
@@ -689,8 +725,8 @@ static struct radeon_asic rv770_asic = {
689 .set_engine_clock = &radeon_atom_set_engine_clock, 725 .set_engine_clock = &radeon_atom_set_engine_clock,
690 .get_memory_clock = &radeon_atom_get_memory_clock, 726 .get_memory_clock = &radeon_atom_get_memory_clock,
691 .set_memory_clock = &radeon_atom_set_memory_clock, 727 .set_memory_clock = &radeon_atom_set_memory_clock,
692 .get_pcie_lanes = &rv370_get_pcie_lanes, 728 .get_pcie_lanes = &r600_get_pcie_lanes,
693 .set_pcie_lanes = NULL, 729 .set_pcie_lanes = &r600_set_pcie_lanes,
694 .set_clock_gating = &radeon_atom_set_clock_gating, 730 .set_clock_gating = &radeon_atom_set_clock_gating,
695 .set_surface_reg = r600_set_surface_reg, 731 .set_surface_reg = r600_set_surface_reg,
696 .clear_surface_reg = r600_clear_surface_reg, 732 .clear_surface_reg = r600_clear_surface_reg,
@@ -706,6 +742,9 @@ static struct radeon_asic rv770_asic = {
706 .pm_finish = &rs600_pm_finish, 742 .pm_finish = &rs600_pm_finish,
707 .pm_init_profile = &r600_pm_init_profile, 743 .pm_init_profile = &r600_pm_init_profile,
708 .pm_get_dynpm_state = &r600_pm_get_dynpm_state, 744 .pm_get_dynpm_state = &r600_pm_get_dynpm_state,
745 .pre_page_flip = &rs600_pre_page_flip,
746 .page_flip = &rv770_page_flip,
747 .post_page_flip = &rs600_post_page_flip,
709}; 748};
710 749
711static struct radeon_asic evergreen_asic = { 750static struct radeon_asic evergreen_asic = {
@@ -720,19 +759,66 @@ static struct radeon_asic evergreen_asic = {
720 .gart_tlb_flush = &evergreen_pcie_gart_tlb_flush, 759 .gart_tlb_flush = &evergreen_pcie_gart_tlb_flush,
721 .gart_set_page = &rs600_gart_set_page, 760 .gart_set_page = &rs600_gart_set_page,
722 .ring_test = &r600_ring_test, 761 .ring_test = &r600_ring_test,
723 .ring_ib_execute = &r600_ring_ib_execute, 762 .ring_ib_execute = &evergreen_ring_ib_execute,
724 .irq_set = &evergreen_irq_set, 763 .irq_set = &evergreen_irq_set,
725 .irq_process = &evergreen_irq_process, 764 .irq_process = &evergreen_irq_process,
726 .get_vblank_counter = &evergreen_get_vblank_counter, 765 .get_vblank_counter = &evergreen_get_vblank_counter,
727 .fence_ring_emit = &r600_fence_ring_emit, 766 .fence_ring_emit = &r600_fence_ring_emit,
728 .cs_parse = &evergreen_cs_parse, 767 .cs_parse = &evergreen_cs_parse,
729 .copy_blit = NULL, 768 .copy_blit = &evergreen_copy_blit,
730 .copy_dma = NULL, 769 .copy_dma = &evergreen_copy_blit,
731 .copy = NULL, 770 .copy = &evergreen_copy_blit,
732 .get_engine_clock = &radeon_atom_get_engine_clock, 771 .get_engine_clock = &radeon_atom_get_engine_clock,
733 .set_engine_clock = &radeon_atom_set_engine_clock, 772 .set_engine_clock = &radeon_atom_set_engine_clock,
734 .get_memory_clock = &radeon_atom_get_memory_clock, 773 .get_memory_clock = &radeon_atom_get_memory_clock,
735 .set_memory_clock = &radeon_atom_set_memory_clock, 774 .set_memory_clock = &radeon_atom_set_memory_clock,
775 .get_pcie_lanes = &r600_get_pcie_lanes,
776 .set_pcie_lanes = &r600_set_pcie_lanes,
777 .set_clock_gating = NULL,
778 .set_surface_reg = r600_set_surface_reg,
779 .clear_surface_reg = r600_clear_surface_reg,
780 .bandwidth_update = &evergreen_bandwidth_update,
781 .hpd_init = &evergreen_hpd_init,
782 .hpd_fini = &evergreen_hpd_fini,
783 .hpd_sense = &evergreen_hpd_sense,
784 .hpd_set_polarity = &evergreen_hpd_set_polarity,
785 .ioctl_wait_idle = r600_ioctl_wait_idle,
786 .gui_idle = &r600_gui_idle,
787 .pm_misc = &evergreen_pm_misc,
788 .pm_prepare = &evergreen_pm_prepare,
789 .pm_finish = &evergreen_pm_finish,
790 .pm_init_profile = &r600_pm_init_profile,
791 .pm_get_dynpm_state = &r600_pm_get_dynpm_state,
792 .pre_page_flip = &evergreen_pre_page_flip,
793 .page_flip = &evergreen_page_flip,
794 .post_page_flip = &evergreen_post_page_flip,
795};
796
797static struct radeon_asic sumo_asic = {
798 .init = &evergreen_init,
799 .fini = &evergreen_fini,
800 .suspend = &evergreen_suspend,
801 .resume = &evergreen_resume,
802 .cp_commit = &r600_cp_commit,
803 .gpu_is_lockup = &evergreen_gpu_is_lockup,
804 .asic_reset = &evergreen_asic_reset,
805 .vga_set_state = &r600_vga_set_state,
806 .gart_tlb_flush = &evergreen_pcie_gart_tlb_flush,
807 .gart_set_page = &rs600_gart_set_page,
808 .ring_test = &r600_ring_test,
809 .ring_ib_execute = &evergreen_ring_ib_execute,
810 .irq_set = &evergreen_irq_set,
811 .irq_process = &evergreen_irq_process,
812 .get_vblank_counter = &evergreen_get_vblank_counter,
813 .fence_ring_emit = &r600_fence_ring_emit,
814 .cs_parse = &evergreen_cs_parse,
815 .copy_blit = &evergreen_copy_blit,
816 .copy_dma = &evergreen_copy_blit,
817 .copy = &evergreen_copy_blit,
818 .get_engine_clock = &radeon_atom_get_engine_clock,
819 .set_engine_clock = &radeon_atom_set_engine_clock,
820 .get_memory_clock = NULL,
821 .set_memory_clock = NULL,
736 .get_pcie_lanes = NULL, 822 .get_pcie_lanes = NULL,
737 .set_pcie_lanes = NULL, 823 .set_pcie_lanes = NULL,
738 .set_clock_gating = NULL, 824 .set_clock_gating = NULL,
@@ -743,17 +829,122 @@ static struct radeon_asic evergreen_asic = {
743 .hpd_fini = &evergreen_hpd_fini, 829 .hpd_fini = &evergreen_hpd_fini,
744 .hpd_sense = &evergreen_hpd_sense, 830 .hpd_sense = &evergreen_hpd_sense,
745 .hpd_set_polarity = &evergreen_hpd_set_polarity, 831 .hpd_set_polarity = &evergreen_hpd_set_polarity,
832 .ioctl_wait_idle = r600_ioctl_wait_idle,
833 .gui_idle = &r600_gui_idle,
834 .pm_misc = &evergreen_pm_misc,
835 .pm_prepare = &evergreen_pm_prepare,
836 .pm_finish = &evergreen_pm_finish,
837 .pm_init_profile = &rs780_pm_init_profile,
838 .pm_get_dynpm_state = &r600_pm_get_dynpm_state,
839 .pre_page_flip = &evergreen_pre_page_flip,
840 .page_flip = &evergreen_page_flip,
841 .post_page_flip = &evergreen_post_page_flip,
842};
843
844static struct radeon_asic btc_asic = {
845 .init = &evergreen_init,
846 .fini = &evergreen_fini,
847 .suspend = &evergreen_suspend,
848 .resume = &evergreen_resume,
849 .cp_commit = &r600_cp_commit,
850 .gpu_is_lockup = &evergreen_gpu_is_lockup,
851 .asic_reset = &evergreen_asic_reset,
852 .vga_set_state = &r600_vga_set_state,
853 .gart_tlb_flush = &evergreen_pcie_gart_tlb_flush,
854 .gart_set_page = &rs600_gart_set_page,
855 .ring_test = &r600_ring_test,
856 .ring_ib_execute = &evergreen_ring_ib_execute,
857 .irq_set = &evergreen_irq_set,
858 .irq_process = &evergreen_irq_process,
859 .get_vblank_counter = &evergreen_get_vblank_counter,
860 .fence_ring_emit = &r600_fence_ring_emit,
861 .cs_parse = &evergreen_cs_parse,
862 .copy_blit = &evergreen_copy_blit,
863 .copy_dma = &evergreen_copy_blit,
864 .copy = &evergreen_copy_blit,
865 .get_engine_clock = &radeon_atom_get_engine_clock,
866 .set_engine_clock = &radeon_atom_set_engine_clock,
867 .get_memory_clock = &radeon_atom_get_memory_clock,
868 .set_memory_clock = &radeon_atom_set_memory_clock,
869 .get_pcie_lanes = NULL,
870 .set_pcie_lanes = NULL,
871 .set_clock_gating = NULL,
872 .set_surface_reg = r600_set_surface_reg,
873 .clear_surface_reg = r600_clear_surface_reg,
874 .bandwidth_update = &evergreen_bandwidth_update,
875 .hpd_init = &evergreen_hpd_init,
876 .hpd_fini = &evergreen_hpd_fini,
877 .hpd_sense = &evergreen_hpd_sense,
878 .hpd_set_polarity = &evergreen_hpd_set_polarity,
879 .ioctl_wait_idle = r600_ioctl_wait_idle,
746 .gui_idle = &r600_gui_idle, 880 .gui_idle = &r600_gui_idle,
747 .pm_misc = &evergreen_pm_misc, 881 .pm_misc = &evergreen_pm_misc,
748 .pm_prepare = &evergreen_pm_prepare, 882 .pm_prepare = &evergreen_pm_prepare,
749 .pm_finish = &evergreen_pm_finish, 883 .pm_finish = &evergreen_pm_finish,
750 .pm_init_profile = &r600_pm_init_profile, 884 .pm_init_profile = &r600_pm_init_profile,
751 .pm_get_dynpm_state = &r600_pm_get_dynpm_state, 885 .pm_get_dynpm_state = &r600_pm_get_dynpm_state,
886 .pre_page_flip = &evergreen_pre_page_flip,
887 .page_flip = &evergreen_page_flip,
888 .post_page_flip = &evergreen_post_page_flip,
889};
890
891static struct radeon_asic cayman_asic = {
892 .init = &cayman_init,
893 .fini = &cayman_fini,
894 .suspend = &cayman_suspend,
895 .resume = &cayman_resume,
896 .cp_commit = &r600_cp_commit,
897 .gpu_is_lockup = &cayman_gpu_is_lockup,
898 .asic_reset = &cayman_asic_reset,
899 .vga_set_state = &r600_vga_set_state,
900 .gart_tlb_flush = &cayman_pcie_gart_tlb_flush,
901 .gart_set_page = &rs600_gart_set_page,
902 .ring_test = &r600_ring_test,
903 .ring_ib_execute = &evergreen_ring_ib_execute,
904 .irq_set = &evergreen_irq_set,
905 .irq_process = &evergreen_irq_process,
906 .get_vblank_counter = &evergreen_get_vblank_counter,
907 .fence_ring_emit = &r600_fence_ring_emit,
908 .cs_parse = &evergreen_cs_parse,
909 .copy_blit = &evergreen_copy_blit,
910 .copy_dma = &evergreen_copy_blit,
911 .copy = &evergreen_copy_blit,
912 .get_engine_clock = &radeon_atom_get_engine_clock,
913 .set_engine_clock = &radeon_atom_set_engine_clock,
914 .get_memory_clock = &radeon_atom_get_memory_clock,
915 .set_memory_clock = &radeon_atom_set_memory_clock,
916 .get_pcie_lanes = NULL,
917 .set_pcie_lanes = NULL,
918 .set_clock_gating = NULL,
919 .set_surface_reg = r600_set_surface_reg,
920 .clear_surface_reg = r600_clear_surface_reg,
921 .bandwidth_update = &evergreen_bandwidth_update,
922 .hpd_init = &evergreen_hpd_init,
923 .hpd_fini = &evergreen_hpd_fini,
924 .hpd_sense = &evergreen_hpd_sense,
925 .hpd_set_polarity = &evergreen_hpd_set_polarity,
926 .ioctl_wait_idle = r600_ioctl_wait_idle,
927 .gui_idle = &r600_gui_idle,
928 .pm_misc = &evergreen_pm_misc,
929 .pm_prepare = &evergreen_pm_prepare,
930 .pm_finish = &evergreen_pm_finish,
931 .pm_init_profile = &r600_pm_init_profile,
932 .pm_get_dynpm_state = &r600_pm_get_dynpm_state,
933 .pre_page_flip = &evergreen_pre_page_flip,
934 .page_flip = &evergreen_page_flip,
935 .post_page_flip = &evergreen_post_page_flip,
752}; 936};
753 937
754int radeon_asic_init(struct radeon_device *rdev) 938int radeon_asic_init(struct radeon_device *rdev)
755{ 939{
756 radeon_register_accessor_init(rdev); 940 radeon_register_accessor_init(rdev);
941
942 /* set the number of crtcs */
943 if (rdev->flags & RADEON_SINGLE_CRTC)
944 rdev->num_crtc = 1;
945 else
946 rdev->num_crtc = 2;
947
757 switch (rdev->family) { 948 switch (rdev->family) {
758 case CHIP_R100: 949 case CHIP_R100:
759 case CHIP_RV100: 950 case CHIP_RV100:
@@ -833,8 +1024,33 @@ int radeon_asic_init(struct radeon_device *rdev)
833 case CHIP_JUNIPER: 1024 case CHIP_JUNIPER:
834 case CHIP_CYPRESS: 1025 case CHIP_CYPRESS:
835 case CHIP_HEMLOCK: 1026 case CHIP_HEMLOCK:
1027 /* set num crtcs */
1028 if (rdev->family == CHIP_CEDAR)
1029 rdev->num_crtc = 4;
1030 else
1031 rdev->num_crtc = 6;
836 rdev->asic = &evergreen_asic; 1032 rdev->asic = &evergreen_asic;
837 break; 1033 break;
1034 case CHIP_PALM:
1035 case CHIP_SUMO:
1036 case CHIP_SUMO2:
1037 rdev->asic = &sumo_asic;
1038 break;
1039 case CHIP_BARTS:
1040 case CHIP_TURKS:
1041 case CHIP_CAICOS:
1042 /* set num crtcs */
1043 if (rdev->family == CHIP_CAICOS)
1044 rdev->num_crtc = 4;
1045 else
1046 rdev->num_crtc = 6;
1047 rdev->asic = &btc_asic;
1048 break;
1049 case CHIP_CAYMAN:
1050 rdev->asic = &cayman_asic;
1051 /* set num crtcs */
1052 rdev->num_crtc = 6;
1053 break;
838 default: 1054 default:
839 /* FIXME: not supported yet */ 1055 /* FIXME: not supported yet */
840 return -EINVAL; 1056 return -EINVAL;
@@ -845,16 +1061,6 @@ int radeon_asic_init(struct radeon_device *rdev)
845 rdev->asic->set_memory_clock = NULL; 1061 rdev->asic->set_memory_clock = NULL;
846 } 1062 }
847 1063
848 /* set the number of crtcs */
849 if (rdev->flags & RADEON_SINGLE_CRTC)
850 rdev->num_crtc = 1;
851 else {
852 if (ASIC_IS_DCE4(rdev))
853 rdev->num_crtc = 6;
854 else
855 rdev->num_crtc = 2;
856 }
857
858 return 0; 1064 return 0;
859} 1065}
860 1066
diff --git a/drivers/gpu/drm/radeon/radeon_asic.h b/drivers/gpu/drm/radeon/radeon_asic.h
index a5aff755f0d2..3d7a0d7c6a9a 100644
--- a/drivers/gpu/drm/radeon/radeon_asic.h
+++ b/drivers/gpu/drm/radeon/radeon_asic.h
@@ -57,8 +57,6 @@ int r100_init(struct radeon_device *rdev);
57void r100_fini(struct radeon_device *rdev); 57void r100_fini(struct radeon_device *rdev);
58int r100_suspend(struct radeon_device *rdev); 58int r100_suspend(struct radeon_device *rdev);
59int r100_resume(struct radeon_device *rdev); 59int r100_resume(struct radeon_device *rdev);
60uint32_t r100_mm_rreg(struct radeon_device *rdev, uint32_t reg);
61void r100_mm_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v);
62void r100_vga_set_state(struct radeon_device *rdev, bool state); 60void r100_vga_set_state(struct radeon_device *rdev, bool state);
63bool r100_gpu_is_lockup(struct radeon_device *rdev); 61bool r100_gpu_is_lockup(struct radeon_device *rdev);
64int r100_asic_reset(struct radeon_device *rdev); 62int r100_asic_reset(struct radeon_device *rdev);
@@ -102,15 +100,17 @@ int r100_pci_gart_enable(struct radeon_device *rdev);
102void r100_pci_gart_disable(struct radeon_device *rdev); 100void r100_pci_gart_disable(struct radeon_device *rdev);
103int r100_debugfs_mc_info_init(struct radeon_device *rdev); 101int r100_debugfs_mc_info_init(struct radeon_device *rdev);
104int r100_gui_wait_for_idle(struct radeon_device *rdev); 102int r100_gui_wait_for_idle(struct radeon_device *rdev);
103void r100_gpu_lockup_update(struct r100_gpu_lockup *lockup,
104 struct radeon_cp *cp);
105bool r100_gpu_cp_is_lockup(struct radeon_device *rdev,
106 struct r100_gpu_lockup *lockup,
107 struct radeon_cp *cp);
105void r100_ib_fini(struct radeon_device *rdev); 108void r100_ib_fini(struct radeon_device *rdev);
106int r100_ib_init(struct radeon_device *rdev); 109int r100_ib_init(struct radeon_device *rdev);
107void r100_irq_disable(struct radeon_device *rdev); 110void r100_irq_disable(struct radeon_device *rdev);
108void r100_mc_stop(struct radeon_device *rdev, struct r100_mc_save *save); 111void r100_mc_stop(struct radeon_device *rdev, struct r100_mc_save *save);
109void r100_mc_resume(struct radeon_device *rdev, struct r100_mc_save *save); 112void r100_mc_resume(struct radeon_device *rdev, struct r100_mc_save *save);
110void r100_vram_init_sizes(struct radeon_device *rdev); 113void r100_vram_init_sizes(struct radeon_device *rdev);
111void r100_wb_disable(struct radeon_device *rdev);
112void r100_wb_fini(struct radeon_device *rdev);
113int r100_wb_init(struct radeon_device *rdev);
114int r100_cp_reset(struct radeon_device *rdev); 114int r100_cp_reset(struct radeon_device *rdev);
115void r100_vga_render_disable(struct radeon_device *rdev); 115void r100_vga_render_disable(struct radeon_device *rdev);
116void r100_restore_sanity(struct radeon_device *rdev); 116void r100_restore_sanity(struct radeon_device *rdev);
@@ -133,15 +133,19 @@ extern void r100_pm_prepare(struct radeon_device *rdev);
133extern void r100_pm_finish(struct radeon_device *rdev); 133extern void r100_pm_finish(struct radeon_device *rdev);
134extern void r100_pm_init_profile(struct radeon_device *rdev); 134extern void r100_pm_init_profile(struct radeon_device *rdev);
135extern void r100_pm_get_dynpm_state(struct radeon_device *rdev); 135extern void r100_pm_get_dynpm_state(struct radeon_device *rdev);
136extern void r100_pre_page_flip(struct radeon_device *rdev, int crtc);
137extern u32 r100_page_flip(struct radeon_device *rdev, int crtc, u64 crtc_base);
138extern void r100_post_page_flip(struct radeon_device *rdev, int crtc);
136 139
137/* 140/*
138 * r200,rv250,rs300,rv280 141 * r200,rv250,rs300,rv280
139 */ 142 */
140extern int r200_copy_dma(struct radeon_device *rdev, 143extern int r200_copy_dma(struct radeon_device *rdev,
141 uint64_t src_offset, 144 uint64_t src_offset,
142 uint64_t dst_offset, 145 uint64_t dst_offset,
143 unsigned num_pages, 146 unsigned num_pages,
144 struct radeon_fence *fence); 147 struct radeon_fence *fence);
148void r200_set_safe_registers(struct radeon_device *rdev);
145 149
146/* 150/*
147 * r300,r350,rv350,rv380 151 * r300,r350,rv350,rv380
@@ -158,10 +162,17 @@ extern void r300_fence_ring_emit(struct radeon_device *rdev,
158extern int r300_cs_parse(struct radeon_cs_parser *p); 162extern int r300_cs_parse(struct radeon_cs_parser *p);
159extern void rv370_pcie_gart_tlb_flush(struct radeon_device *rdev); 163extern void rv370_pcie_gart_tlb_flush(struct radeon_device *rdev);
160extern int rv370_pcie_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr); 164extern int rv370_pcie_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr);
161extern uint32_t rv370_pcie_rreg(struct radeon_device *rdev, uint32_t reg);
162extern void rv370_pcie_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v);
163extern void rv370_set_pcie_lanes(struct radeon_device *rdev, int lanes); 165extern void rv370_set_pcie_lanes(struct radeon_device *rdev, int lanes);
164extern int rv370_get_pcie_lanes(struct radeon_device *rdev); 166extern int rv370_get_pcie_lanes(struct radeon_device *rdev);
167extern void r300_set_reg_safe(struct radeon_device *rdev);
168extern void r300_mc_program(struct radeon_device *rdev);
169extern void r300_mc_init(struct radeon_device *rdev);
170extern void r300_clock_startup(struct radeon_device *rdev);
171extern int r300_mc_wait_for_idle(struct radeon_device *rdev);
172extern int rv370_pcie_gart_init(struct radeon_device *rdev);
173extern void rv370_pcie_gart_fini(struct radeon_device *rdev);
174extern int rv370_pcie_gart_enable(struct radeon_device *rdev);
175extern void rv370_pcie_gart_disable(struct radeon_device *rdev);
165 176
166/* 177/*
167 * r420,r423,rv410 178 * r420,r423,rv410
@@ -171,6 +182,10 @@ extern void r420_fini(struct radeon_device *rdev);
171extern int r420_suspend(struct radeon_device *rdev); 182extern int r420_suspend(struct radeon_device *rdev);
172extern int r420_resume(struct radeon_device *rdev); 183extern int r420_resume(struct radeon_device *rdev);
173extern void r420_pm_init_profile(struct radeon_device *rdev); 184extern void r420_pm_init_profile(struct radeon_device *rdev);
185extern u32 r420_mc_rreg(struct radeon_device *rdev, u32 reg);
186extern void r420_mc_wreg(struct radeon_device *rdev, u32 reg, u32 v);
187extern int r420_debugfs_pipes_info_init(struct radeon_device *rdev);
188extern void r420_pipes_init(struct radeon_device *rdev);
174 189
175/* 190/*
176 * rs400,rs480 191 * rs400,rs480
@@ -183,6 +198,11 @@ void rs400_gart_tlb_flush(struct radeon_device *rdev);
183int rs400_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr); 198int rs400_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr);
184uint32_t rs400_mc_rreg(struct radeon_device *rdev, uint32_t reg); 199uint32_t rs400_mc_rreg(struct radeon_device *rdev, uint32_t reg);
185void rs400_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); 200void rs400_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v);
201int rs400_gart_init(struct radeon_device *rdev);
202int rs400_gart_enable(struct radeon_device *rdev);
203void rs400_gart_adjust_size(struct radeon_device *rdev);
204void rs400_gart_disable(struct radeon_device *rdev);
205void rs400_gart_fini(struct radeon_device *rdev);
186 206
187/* 207/*
188 * rs600. 208 * rs600.
@@ -194,6 +214,7 @@ extern int rs600_suspend(struct radeon_device *rdev);
194extern int rs600_resume(struct radeon_device *rdev); 214extern int rs600_resume(struct radeon_device *rdev);
195int rs600_irq_set(struct radeon_device *rdev); 215int rs600_irq_set(struct radeon_device *rdev);
196int rs600_irq_process(struct radeon_device *rdev); 216int rs600_irq_process(struct radeon_device *rdev);
217void rs600_irq_disable(struct radeon_device *rdev);
197u32 rs600_get_vblank_counter(struct radeon_device *rdev, int crtc); 218u32 rs600_get_vblank_counter(struct radeon_device *rdev, int crtc);
198void rs600_gart_tlb_flush(struct radeon_device *rdev); 219void rs600_gart_tlb_flush(struct radeon_device *rdev);
199int rs600_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr); 220int rs600_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr);
@@ -208,6 +229,11 @@ void rs600_hpd_set_polarity(struct radeon_device *rdev,
208extern void rs600_pm_misc(struct radeon_device *rdev); 229extern void rs600_pm_misc(struct radeon_device *rdev);
209extern void rs600_pm_prepare(struct radeon_device *rdev); 230extern void rs600_pm_prepare(struct radeon_device *rdev);
210extern void rs600_pm_finish(struct radeon_device *rdev); 231extern void rs600_pm_finish(struct radeon_device *rdev);
232extern void rs600_pre_page_flip(struct radeon_device *rdev, int crtc);
233extern u32 rs600_page_flip(struct radeon_device *rdev, int crtc, u64 crtc_base);
234extern void rs600_post_page_flip(struct radeon_device *rdev, int crtc);
235void rs600_set_safe_registers(struct radeon_device *rdev);
236
211 237
212/* 238/*
213 * rs690,rs740 239 * rs690,rs740
@@ -219,20 +245,37 @@ int rs690_suspend(struct radeon_device *rdev);
219uint32_t rs690_mc_rreg(struct radeon_device *rdev, uint32_t reg); 245uint32_t rs690_mc_rreg(struct radeon_device *rdev, uint32_t reg);
220void rs690_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); 246void rs690_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v);
221void rs690_bandwidth_update(struct radeon_device *rdev); 247void rs690_bandwidth_update(struct radeon_device *rdev);
248void rs690_line_buffer_adjust(struct radeon_device *rdev,
249 struct drm_display_mode *mode1,
250 struct drm_display_mode *mode2);
222 251
223/* 252/*
224 * rv515 253 * rv515
225 */ 254 */
255struct rv515_mc_save {
256 u32 d1vga_control;
257 u32 d2vga_control;
258 u32 vga_render_control;
259 u32 vga_hdp_control;
260 u32 d1crtc_control;
261 u32 d2crtc_control;
262};
226int rv515_init(struct radeon_device *rdev); 263int rv515_init(struct radeon_device *rdev);
227void rv515_fini(struct radeon_device *rdev); 264void rv515_fini(struct radeon_device *rdev);
228uint32_t rv515_mc_rreg(struct radeon_device *rdev, uint32_t reg); 265uint32_t rv515_mc_rreg(struct radeon_device *rdev, uint32_t reg);
229void rv515_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); 266void rv515_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v);
230void rv515_ring_start(struct radeon_device *rdev); 267void rv515_ring_start(struct radeon_device *rdev);
231uint32_t rv515_pcie_rreg(struct radeon_device *rdev, uint32_t reg);
232void rv515_pcie_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v);
233void rv515_bandwidth_update(struct radeon_device *rdev); 268void rv515_bandwidth_update(struct radeon_device *rdev);
234int rv515_resume(struct radeon_device *rdev); 269int rv515_resume(struct radeon_device *rdev);
235int rv515_suspend(struct radeon_device *rdev); 270int rv515_suspend(struct radeon_device *rdev);
271void rv515_bandwidth_avivo_update(struct radeon_device *rdev);
272void rv515_vga_render_disable(struct radeon_device *rdev);
273void rv515_set_safe_registers(struct radeon_device *rdev);
274void rv515_mc_stop(struct radeon_device *rdev, struct rv515_mc_save *save);
275void rv515_mc_resume(struct radeon_device *rdev, struct rv515_mc_save *save);
276void rv515_clock_startup(struct radeon_device *rdev);
277void rv515_debugfs(struct radeon_device *rdev);
278
236 279
237/* 280/*
238 * r520,rv530,rv560,rv570,r580 281 * r520,rv530,rv560,rv570,r580
@@ -257,19 +300,13 @@ void r600_pciep_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v);
257int r600_cs_parse(struct radeon_cs_parser *p); 300int r600_cs_parse(struct radeon_cs_parser *p);
258void r600_fence_ring_emit(struct radeon_device *rdev, 301void r600_fence_ring_emit(struct radeon_device *rdev,
259 struct radeon_fence *fence); 302 struct radeon_fence *fence);
260int r600_copy_dma(struct radeon_device *rdev,
261 uint64_t src_offset,
262 uint64_t dst_offset,
263 unsigned num_pages,
264 struct radeon_fence *fence);
265int r600_irq_process(struct radeon_device *rdev);
266int r600_irq_set(struct radeon_device *rdev);
267bool r600_gpu_is_lockup(struct radeon_device *rdev); 303bool r600_gpu_is_lockup(struct radeon_device *rdev);
268int r600_asic_reset(struct radeon_device *rdev); 304int r600_asic_reset(struct radeon_device *rdev);
269int r600_set_surface_reg(struct radeon_device *rdev, int reg, 305int r600_set_surface_reg(struct radeon_device *rdev, int reg,
270 uint32_t tiling_flags, uint32_t pitch, 306 uint32_t tiling_flags, uint32_t pitch,
271 uint32_t offset, uint32_t obj_size); 307 uint32_t offset, uint32_t obj_size);
272void r600_clear_surface_reg(struct radeon_device *rdev, int reg); 308void r600_clear_surface_reg(struct radeon_device *rdev, int reg);
309int r600_ib_test(struct radeon_device *rdev);
273void r600_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib); 310void r600_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib);
274int r600_ring_test(struct radeon_device *rdev); 311int r600_ring_test(struct radeon_device *rdev);
275int r600_copy_blit(struct radeon_device *rdev, 312int r600_copy_blit(struct radeon_device *rdev,
@@ -286,6 +323,52 @@ extern void r600_pm_misc(struct radeon_device *rdev);
286extern void r600_pm_init_profile(struct radeon_device *rdev); 323extern void r600_pm_init_profile(struct radeon_device *rdev);
287extern void rs780_pm_init_profile(struct radeon_device *rdev); 324extern void rs780_pm_init_profile(struct radeon_device *rdev);
288extern void r600_pm_get_dynpm_state(struct radeon_device *rdev); 325extern void r600_pm_get_dynpm_state(struct radeon_device *rdev);
326extern void r600_set_pcie_lanes(struct radeon_device *rdev, int lanes);
327extern int r600_get_pcie_lanes(struct radeon_device *rdev);
328bool r600_card_posted(struct radeon_device *rdev);
329void r600_cp_stop(struct radeon_device *rdev);
330int r600_cp_start(struct radeon_device *rdev);
331void r600_ring_init(struct radeon_device *rdev, unsigned ring_size);
332int r600_cp_resume(struct radeon_device *rdev);
333void r600_cp_fini(struct radeon_device *rdev);
334int r600_count_pipe_bits(uint32_t val);
335int r600_mc_wait_for_idle(struct radeon_device *rdev);
336int r600_pcie_gart_init(struct radeon_device *rdev);
337void r600_scratch_init(struct radeon_device *rdev);
338int r600_blit_init(struct radeon_device *rdev);
339void r600_blit_fini(struct radeon_device *rdev);
340int r600_init_microcode(struct radeon_device *rdev);
341/* r600 irq */
342int r600_irq_process(struct radeon_device *rdev);
343int r600_irq_init(struct radeon_device *rdev);
344void r600_irq_fini(struct radeon_device *rdev);
345void r600_ih_ring_init(struct radeon_device *rdev, unsigned ring_size);
346int r600_irq_set(struct radeon_device *rdev);
347void r600_irq_suspend(struct radeon_device *rdev);
348void r600_disable_interrupts(struct radeon_device *rdev);
349void r600_rlc_stop(struct radeon_device *rdev);
350/* r600 audio */
351int r600_audio_init(struct radeon_device *rdev);
352int r600_audio_tmds_index(struct drm_encoder *encoder);
353void r600_audio_set_clock(struct drm_encoder *encoder, int clock);
354int r600_audio_channels(struct radeon_device *rdev);
355int r600_audio_bits_per_sample(struct radeon_device *rdev);
356int r600_audio_rate(struct radeon_device *rdev);
357uint8_t r600_audio_status_bits(struct radeon_device *rdev);
358uint8_t r600_audio_category_code(struct radeon_device *rdev);
359void r600_audio_schedule_polling(struct radeon_device *rdev);
360void r600_audio_enable_polling(struct drm_encoder *encoder);
361void r600_audio_disable_polling(struct drm_encoder *encoder);
362void r600_audio_fini(struct radeon_device *rdev);
363void r600_hdmi_init(struct drm_encoder *encoder);
364int r600_hdmi_buffer_status_changed(struct drm_encoder *encoder);
365void r600_hdmi_update_audio_settings(struct drm_encoder *encoder);
366/* r600 blit */
367int r600_blit_prepare_copy(struct radeon_device *rdev, int size_bytes);
368void r600_blit_done_copy(struct radeon_device *rdev, struct radeon_fence *fence);
369void r600_kms_blit_copy(struct radeon_device *rdev,
370 u64 src_gpu_addr, u64 dst_gpu_addr,
371 int size_bytes);
289 372
290/* 373/*
291 * rv770,rv730,rv710,rv740 374 * rv770,rv730,rv710,rv740
@@ -294,11 +377,21 @@ int rv770_init(struct radeon_device *rdev);
294void rv770_fini(struct radeon_device *rdev); 377void rv770_fini(struct radeon_device *rdev);
295int rv770_suspend(struct radeon_device *rdev); 378int rv770_suspend(struct radeon_device *rdev);
296int rv770_resume(struct radeon_device *rdev); 379int rv770_resume(struct radeon_device *rdev);
297extern void rv770_pm_misc(struct radeon_device *rdev); 380void rv770_pm_misc(struct radeon_device *rdev);
381u32 rv770_page_flip(struct radeon_device *rdev, int crtc, u64 crtc_base);
382void r700_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc);
383void r700_cp_stop(struct radeon_device *rdev);
384void r700_cp_fini(struct radeon_device *rdev);
298 385
299/* 386/*
300 * evergreen 387 * evergreen
301 */ 388 */
389struct evergreen_mc_save {
390 u32 vga_control[6];
391 u32 vga_render_control;
392 u32 vga_hdp_control;
393 u32 crtc_control[6];
394};
302void evergreen_pcie_gart_tlb_flush(struct radeon_device *rdev); 395void evergreen_pcie_gart_tlb_flush(struct radeon_device *rdev);
303int evergreen_init(struct radeon_device *rdev); 396int evergreen_init(struct radeon_device *rdev);
304void evergreen_fini(struct radeon_device *rdev); 397void evergreen_fini(struct radeon_device *rdev);
@@ -307,6 +400,10 @@ int evergreen_resume(struct radeon_device *rdev);
307bool evergreen_gpu_is_lockup(struct radeon_device *rdev); 400bool evergreen_gpu_is_lockup(struct radeon_device *rdev);
308int evergreen_asic_reset(struct radeon_device *rdev); 401int evergreen_asic_reset(struct radeon_device *rdev);
309void evergreen_bandwidth_update(struct radeon_device *rdev); 402void evergreen_bandwidth_update(struct radeon_device *rdev);
403void evergreen_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib);
404int evergreen_copy_blit(struct radeon_device *rdev,
405 uint64_t src_offset, uint64_t dst_offset,
406 unsigned num_pages, struct radeon_fence *fence);
310void evergreen_hpd_init(struct radeon_device *rdev); 407void evergreen_hpd_init(struct radeon_device *rdev);
311void evergreen_hpd_fini(struct radeon_device *rdev); 408void evergreen_hpd_fini(struct radeon_device *rdev);
312bool evergreen_hpd_sense(struct radeon_device *rdev, enum radeon_hpd_id hpd); 409bool evergreen_hpd_sense(struct radeon_device *rdev, enum radeon_hpd_id hpd);
@@ -319,5 +416,28 @@ extern int evergreen_cs_parse(struct radeon_cs_parser *p);
319extern void evergreen_pm_misc(struct radeon_device *rdev); 416extern void evergreen_pm_misc(struct radeon_device *rdev);
320extern void evergreen_pm_prepare(struct radeon_device *rdev); 417extern void evergreen_pm_prepare(struct radeon_device *rdev);
321extern void evergreen_pm_finish(struct radeon_device *rdev); 418extern void evergreen_pm_finish(struct radeon_device *rdev);
419extern void evergreen_pre_page_flip(struct radeon_device *rdev, int crtc);
420extern u32 evergreen_page_flip(struct radeon_device *rdev, int crtc, u64 crtc_base);
421extern void evergreen_post_page_flip(struct radeon_device *rdev, int crtc);
422void evergreen_disable_interrupt_state(struct radeon_device *rdev);
423int evergreen_blit_init(struct radeon_device *rdev);
424void evergreen_blit_fini(struct radeon_device *rdev);
425/* evergreen blit */
426int evergreen_blit_prepare_copy(struct radeon_device *rdev, int size_bytes);
427void evergreen_blit_done_copy(struct radeon_device *rdev, struct radeon_fence *fence);
428void evergreen_kms_blit_copy(struct radeon_device *rdev,
429 u64 src_gpu_addr, u64 dst_gpu_addr,
430 int size_bytes);
431
432/*
433 * cayman
434 */
435void cayman_pcie_gart_tlb_flush(struct radeon_device *rdev);
436int cayman_init(struct radeon_device *rdev);
437void cayman_fini(struct radeon_device *rdev);
438int cayman_suspend(struct radeon_device *rdev);
439int cayman_resume(struct radeon_device *rdev);
440bool cayman_gpu_is_lockup(struct radeon_device *rdev);
441int cayman_asic_reset(struct radeon_device *rdev);
322 442
323#endif 443#endif
diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c
index 8e43ddae70cc..bf2b61584cdb 100644
--- a/drivers/gpu/drm/radeon/radeon_atombios.c
+++ b/drivers/gpu/drm/radeon/radeon_atombios.c
@@ -37,7 +37,7 @@ radeon_get_encoder_enum(struct drm_device *dev, uint32_t supported_device,
37extern void radeon_link_encoder_connector(struct drm_device *dev); 37extern void radeon_link_encoder_connector(struct drm_device *dev);
38extern void 38extern void
39radeon_add_atom_encoder(struct drm_device *dev, uint32_t encoder_enum, 39radeon_add_atom_encoder(struct drm_device *dev, uint32_t encoder_enum,
40 uint32_t supported_device); 40 uint32_t supported_device, u16 caps);
41 41
42/* from radeon_connector.c */ 42/* from radeon_connector.c */
43extern void 43extern void
@@ -88,7 +88,7 @@ static inline struct radeon_i2c_bus_rec radeon_lookup_i2c_gpio(struct radeon_dev
88 /* some evergreen boards have bad data for this entry */ 88 /* some evergreen boards have bad data for this entry */
89 if (ASIC_IS_DCE4(rdev)) { 89 if (ASIC_IS_DCE4(rdev)) {
90 if ((i == 7) && 90 if ((i == 7) &&
91 (gpio->usClkMaskRegisterIndex == 0x1936) && 91 (le16_to_cpu(gpio->usClkMaskRegisterIndex) == 0x1936) &&
92 (gpio->sucI2cId.ucAccess == 0)) { 92 (gpio->sucI2cId.ucAccess == 0)) {
93 gpio->sucI2cId.ucAccess = 0x97; 93 gpio->sucI2cId.ucAccess = 0x97;
94 gpio->ucDataMaskShift = 8; 94 gpio->ucDataMaskShift = 8;
@@ -98,6 +98,14 @@ static inline struct radeon_i2c_bus_rec radeon_lookup_i2c_gpio(struct radeon_dev
98 } 98 }
99 } 99 }
100 100
101 /* some DCE3 boards have bad data for this entry */
102 if (ASIC_IS_DCE3(rdev)) {
103 if ((i == 4) &&
104 (le16_to_cpu(gpio->usClkMaskRegisterIndex) == 0x1fda) &&
105 (gpio->sucI2cId.ucAccess == 0x94))
106 gpio->sucI2cId.ucAccess = 0x14;
107 }
108
101 if (gpio->sucI2cId.ucAccess == id) { 109 if (gpio->sucI2cId.ucAccess == id) {
102 i2c.mask_clk_reg = le16_to_cpu(gpio->usClkMaskRegisterIndex) * 4; 110 i2c.mask_clk_reg = le16_to_cpu(gpio->usClkMaskRegisterIndex) * 4;
103 i2c.mask_data_reg = le16_to_cpu(gpio->usDataMaskRegisterIndex) * 4; 111 i2c.mask_data_reg = le16_to_cpu(gpio->usDataMaskRegisterIndex) * 4;
@@ -164,7 +172,7 @@ void radeon_atombios_i2c_init(struct radeon_device *rdev)
164 /* some evergreen boards have bad data for this entry */ 172 /* some evergreen boards have bad data for this entry */
165 if (ASIC_IS_DCE4(rdev)) { 173 if (ASIC_IS_DCE4(rdev)) {
166 if ((i == 7) && 174 if ((i == 7) &&
167 (gpio->usClkMaskRegisterIndex == 0x1936) && 175 (le16_to_cpu(gpio->usClkMaskRegisterIndex) == 0x1936) &&
168 (gpio->sucI2cId.ucAccess == 0)) { 176 (gpio->sucI2cId.ucAccess == 0)) {
169 gpio->sucI2cId.ucAccess = 0x97; 177 gpio->sucI2cId.ucAccess = 0x97;
170 gpio->ucDataMaskShift = 8; 178 gpio->ucDataMaskShift = 8;
@@ -174,6 +182,14 @@ void radeon_atombios_i2c_init(struct radeon_device *rdev)
174 } 182 }
175 } 183 }
176 184
185 /* some DCE3 boards have bad data for this entry */
186 if (ASIC_IS_DCE3(rdev)) {
187 if ((i == 4) &&
188 (le16_to_cpu(gpio->usClkMaskRegisterIndex) == 0x1fda) &&
189 (gpio->sucI2cId.ucAccess == 0x94))
190 gpio->sucI2cId.ucAccess = 0x14;
191 }
192
177 i2c.mask_clk_reg = le16_to_cpu(gpio->usClkMaskRegisterIndex) * 4; 193 i2c.mask_clk_reg = le16_to_cpu(gpio->usClkMaskRegisterIndex) * 4;
178 i2c.mask_data_reg = le16_to_cpu(gpio->usDataMaskRegisterIndex) * 4; 194 i2c.mask_data_reg = le16_to_cpu(gpio->usDataMaskRegisterIndex) * 4;
179 i2c.en_clk_reg = le16_to_cpu(gpio->usClkEnRegisterIndex) * 4; 195 i2c.en_clk_reg = le16_to_cpu(gpio->usClkEnRegisterIndex) * 4;
@@ -236,7 +252,7 @@ static inline struct radeon_gpio_rec radeon_lookup_gpio(struct radeon_device *rd
236 pin = &gpio_info->asGPIO_Pin[i]; 252 pin = &gpio_info->asGPIO_Pin[i];
237 if (id == pin->ucGPIO_ID) { 253 if (id == pin->ucGPIO_ID) {
238 gpio.id = pin->ucGPIO_ID; 254 gpio.id = pin->ucGPIO_ID;
239 gpio.reg = pin->usGpioPin_AIndex * 4; 255 gpio.reg = le16_to_cpu(pin->usGpioPin_AIndex) * 4;
240 gpio.mask = (1 << pin->ucGpioPinBitShift); 256 gpio.mask = (1 << pin->ucGpioPinBitShift);
241 gpio.valid = true; 257 gpio.valid = true;
242 break; 258 break;
@@ -297,7 +313,6 @@ static bool radeon_atom_apply_quirks(struct drm_device *dev,
297 uint16_t *line_mux, 313 uint16_t *line_mux,
298 struct radeon_hpd *hpd) 314 struct radeon_hpd *hpd)
299{ 315{
300 struct radeon_device *rdev = dev->dev_private;
301 316
302 /* Asus M2A-VM HDMI board lists the DVI port as HDMI */ 317 /* Asus M2A-VM HDMI board lists the DVI port as HDMI */
303 if ((dev->pdev->device == 0x791e) && 318 if ((dev->pdev->device == 0x791e) &&
@@ -372,6 +387,13 @@ static bool radeon_atom_apply_quirks(struct drm_device *dev,
372 *line_mux = 0x90; 387 *line_mux = 0x90;
373 } 388 }
374 389
390 /* mac rv630, rv730, others */
391 if ((supported_device == ATOM_DEVICE_TV1_SUPPORT) &&
392 (*connector_type == DRM_MODE_CONNECTOR_DVII)) {
393 *connector_type = DRM_MODE_CONNECTOR_9PinDIN;
394 *line_mux = CONNECTOR_7PIN_DIN_ENUM_ID1;
395 }
396
375 /* ASUS HD 3600 XT board lists the DVI port as HDMI */ 397 /* ASUS HD 3600 XT board lists the DVI port as HDMI */
376 if ((dev->pdev->device == 0x9598) && 398 if ((dev->pdev->device == 0x9598) &&
377 (dev->pdev->subsystem_vendor == 0x1043) && 399 (dev->pdev->subsystem_vendor == 0x1043) &&
@@ -409,21 +431,23 @@ static bool radeon_atom_apply_quirks(struct drm_device *dev,
409 } 431 }
410 } 432 }
411 433
412 /* Acer laptop reports DVI-D as DVI-I and hpd pins reversed */ 434 /* Acer laptop (Acer TravelMate 5730/5730G) has an HDMI port
413 if ((dev->pdev->device == 0x95c4) && 435 * on the laptop and a DVI port on the docking station and
436 * both share the same encoder, hpd pin, and ddc line.
437 * So while the bios table is technically correct,
438 * we drop the DVI port here since xrandr has no concept of
439 * encoders and will try and drive both connectors
440 * with different crtcs which isn't possible on the hardware
441 * side and leaves no crtcs for LVDS or VGA.
442 */
443 if (((dev->pdev->device == 0x95c4) || (dev->pdev->device == 0x9591)) &&
414 (dev->pdev->subsystem_vendor == 0x1025) && 444 (dev->pdev->subsystem_vendor == 0x1025) &&
415 (dev->pdev->subsystem_device == 0x013c)) { 445 (dev->pdev->subsystem_device == 0x013c)) {
416 struct radeon_gpio_rec gpio;
417
418 if ((*connector_type == DRM_MODE_CONNECTOR_DVII) && 446 if ((*connector_type == DRM_MODE_CONNECTOR_DVII) &&
419 (supported_device == ATOM_DEVICE_DFP1_SUPPORT)) { 447 (supported_device == ATOM_DEVICE_DFP1_SUPPORT)) {
420 gpio = radeon_lookup_gpio(rdev, 6); 448 /* actually it's a DVI-D port not DVI-I */
421 *hpd = radeon_atom_get_hpd_info_from_gpio(rdev, &gpio);
422 *connector_type = DRM_MODE_CONNECTOR_DVID; 449 *connector_type = DRM_MODE_CONNECTOR_DVID;
423 } else if ((*connector_type == DRM_MODE_CONNECTOR_HDMIA) && 450 return false;
424 (supported_device == ATOM_DEVICE_DFP1_SUPPORT)) {
425 gpio = radeon_lookup_gpio(rdev, 7);
426 *hpd = radeon_atom_get_hpd_info_from_gpio(rdev, &gpio);
427 } 451 }
428 } 452 }
429 453
@@ -509,6 +533,7 @@ bool radeon_get_atom_connector_info_from_object_table(struct drm_device *dev)
509 u16 size, data_offset; 533 u16 size, data_offset;
510 u8 frev, crev; 534 u8 frev, crev;
511 ATOM_CONNECTOR_OBJECT_TABLE *con_obj; 535 ATOM_CONNECTOR_OBJECT_TABLE *con_obj;
536 ATOM_ENCODER_OBJECT_TABLE *enc_obj;
512 ATOM_OBJECT_TABLE *router_obj; 537 ATOM_OBJECT_TABLE *router_obj;
513 ATOM_DISPLAY_OBJECT_PATH_TABLE *path_obj; 538 ATOM_DISPLAY_OBJECT_PATH_TABLE *path_obj;
514 ATOM_OBJECT_HEADER *obj_header; 539 ATOM_OBJECT_HEADER *obj_header;
@@ -526,8 +551,6 @@ bool radeon_get_atom_connector_info_from_object_table(struct drm_device *dev)
526 if (crev < 2) 551 if (crev < 2)
527 return false; 552 return false;
528 553
529 router.valid = false;
530
531 obj_header = (ATOM_OBJECT_HEADER *) (ctx->bios + data_offset); 554 obj_header = (ATOM_OBJECT_HEADER *) (ctx->bios + data_offset);
532 path_obj = (ATOM_DISPLAY_OBJECT_PATH_TABLE *) 555 path_obj = (ATOM_DISPLAY_OBJECT_PATH_TABLE *)
533 (ctx->bios + data_offset + 556 (ctx->bios + data_offset +
@@ -535,6 +558,9 @@ bool radeon_get_atom_connector_info_from_object_table(struct drm_device *dev)
535 con_obj = (ATOM_CONNECTOR_OBJECT_TABLE *) 558 con_obj = (ATOM_CONNECTOR_OBJECT_TABLE *)
536 (ctx->bios + data_offset + 559 (ctx->bios + data_offset +
537 le16_to_cpu(obj_header->usConnectorObjectTableOffset)); 560 le16_to_cpu(obj_header->usConnectorObjectTableOffset));
561 enc_obj = (ATOM_ENCODER_OBJECT_TABLE *)
562 (ctx->bios + data_offset +
563 le16_to_cpu(obj_header->usEncoderObjectTableOffset));
538 router_obj = (ATOM_OBJECT_TABLE *) 564 router_obj = (ATOM_OBJECT_TABLE *)
539 (ctx->bios + data_offset + 565 (ctx->bios + data_offset +
540 le16_to_cpu(obj_header->usRouterObjectTableOffset)); 566 le16_to_cpu(obj_header->usRouterObjectTableOffset));
@@ -624,6 +650,8 @@ bool radeon_get_atom_connector_info_from_object_table(struct drm_device *dev)
624 if (connector_type == DRM_MODE_CONNECTOR_Unknown) 650 if (connector_type == DRM_MODE_CONNECTOR_Unknown)
625 continue; 651 continue;
626 652
653 router.ddc_valid = false;
654 router.cd_valid = false;
627 for (j = 0; j < ((le16_to_cpu(path->usSize) - 8) / 2); j++) { 655 for (j = 0; j < ((le16_to_cpu(path->usSize) - 8) / 2); j++) {
628 uint8_t grph_obj_id, grph_obj_num, grph_obj_type; 656 uint8_t grph_obj_id, grph_obj_num, grph_obj_type;
629 657
@@ -638,18 +666,39 @@ bool radeon_get_atom_connector_info_from_object_table(struct drm_device *dev)
638 OBJECT_TYPE_MASK) >> OBJECT_TYPE_SHIFT; 666 OBJECT_TYPE_MASK) >> OBJECT_TYPE_SHIFT;
639 667
640 if (grph_obj_type == GRAPH_OBJECT_TYPE_ENCODER) { 668 if (grph_obj_type == GRAPH_OBJECT_TYPE_ENCODER) {
641 u16 encoder_obj = le16_to_cpu(path->usGraphicObjIds[j]); 669 for (k = 0; k < enc_obj->ucNumberOfObjects; k++) {
642 670 u16 encoder_obj = le16_to_cpu(enc_obj->asObjects[k].usObjectID);
643 radeon_add_atom_encoder(dev, 671 if (le16_to_cpu(path->usGraphicObjIds[j]) == encoder_obj) {
644 encoder_obj, 672 ATOM_COMMON_RECORD_HEADER *record = (ATOM_COMMON_RECORD_HEADER *)
645 le16_to_cpu 673 (ctx->bios + data_offset +
646 (path-> 674 le16_to_cpu(enc_obj->asObjects[k].usRecordOffset));
647 usDeviceTag)); 675 ATOM_ENCODER_CAP_RECORD *cap_record;
676 u16 caps = 0;
648 677
678 while (record->ucRecordSize > 0 &&
679 record->ucRecordType > 0 &&
680 record->ucRecordType <= ATOM_MAX_OBJECT_RECORD_NUMBER) {
681 switch (record->ucRecordType) {
682 case ATOM_ENCODER_CAP_RECORD_TYPE:
683 cap_record =(ATOM_ENCODER_CAP_RECORD *)
684 record;
685 caps = le16_to_cpu(cap_record->usEncoderCap);
686 break;
687 }
688 record = (ATOM_COMMON_RECORD_HEADER *)
689 ((char *)record + record->ucRecordSize);
690 }
691 radeon_add_atom_encoder(dev,
692 encoder_obj,
693 le16_to_cpu
694 (path->
695 usDeviceTag),
696 caps);
697 }
698 }
649 } else if (grph_obj_type == GRAPH_OBJECT_TYPE_ROUTER) { 699 } else if (grph_obj_type == GRAPH_OBJECT_TYPE_ROUTER) {
650 router.valid = false;
651 for (k = 0; k < router_obj->ucNumberOfObjects; k++) { 700 for (k = 0; k < router_obj->ucNumberOfObjects; k++) {
652 u16 router_obj_id = le16_to_cpu(router_obj->asObjects[j].usObjectID); 701 u16 router_obj_id = le16_to_cpu(router_obj->asObjects[k].usObjectID);
653 if (le16_to_cpu(path->usGraphicObjIds[j]) == router_obj_id) { 702 if (le16_to_cpu(path->usGraphicObjIds[j]) == router_obj_id) {
654 ATOM_COMMON_RECORD_HEADER *record = (ATOM_COMMON_RECORD_HEADER *) 703 ATOM_COMMON_RECORD_HEADER *record = (ATOM_COMMON_RECORD_HEADER *)
655 (ctx->bios + data_offset + 704 (ctx->bios + data_offset +
@@ -657,6 +706,7 @@ bool radeon_get_atom_connector_info_from_object_table(struct drm_device *dev)
657 ATOM_I2C_RECORD *i2c_record; 706 ATOM_I2C_RECORD *i2c_record;
658 ATOM_I2C_ID_CONFIG_ACCESS *i2c_config; 707 ATOM_I2C_ID_CONFIG_ACCESS *i2c_config;
659 ATOM_ROUTER_DDC_PATH_SELECT_RECORD *ddc_path; 708 ATOM_ROUTER_DDC_PATH_SELECT_RECORD *ddc_path;
709 ATOM_ROUTER_DATA_CLOCK_PATH_SELECT_RECORD *cd_path;
660 ATOM_SRC_DST_TABLE_FOR_ONE_OBJECT *router_src_dst_table = 710 ATOM_SRC_DST_TABLE_FOR_ONE_OBJECT *router_src_dst_table =
661 (ATOM_SRC_DST_TABLE_FOR_ONE_OBJECT *) 711 (ATOM_SRC_DST_TABLE_FOR_ONE_OBJECT *)
662 (ctx->bios + data_offset + 712 (ctx->bios + data_offset +
@@ -671,7 +721,8 @@ bool radeon_get_atom_connector_info_from_object_table(struct drm_device *dev)
671 break; 721 break;
672 } 722 }
673 723
674 while (record->ucRecordType > 0 && 724 while (record->ucRecordSize > 0 &&
725 record->ucRecordType > 0 &&
675 record->ucRecordType <= ATOM_MAX_OBJECT_RECORD_NUMBER) { 726 record->ucRecordType <= ATOM_MAX_OBJECT_RECORD_NUMBER) {
676 switch (record->ucRecordType) { 727 switch (record->ucRecordType) {
677 case ATOM_I2C_RECORD_TYPE: 728 case ATOM_I2C_RECORD_TYPE:
@@ -690,10 +741,18 @@ bool radeon_get_atom_connector_info_from_object_table(struct drm_device *dev)
690 case ATOM_ROUTER_DDC_PATH_SELECT_RECORD_TYPE: 741 case ATOM_ROUTER_DDC_PATH_SELECT_RECORD_TYPE:
691 ddc_path = (ATOM_ROUTER_DDC_PATH_SELECT_RECORD *) 742 ddc_path = (ATOM_ROUTER_DDC_PATH_SELECT_RECORD *)
692 record; 743 record;
693 router.valid = true; 744 router.ddc_valid = true;
694 router.mux_type = ddc_path->ucMuxType; 745 router.ddc_mux_type = ddc_path->ucMuxType;
695 router.mux_control_pin = ddc_path->ucMuxControlPin; 746 router.ddc_mux_control_pin = ddc_path->ucMuxControlPin;
696 router.mux_state = ddc_path->ucMuxState[enum_id]; 747 router.ddc_mux_state = ddc_path->ucMuxState[enum_id];
748 break;
749 case ATOM_ROUTER_DATA_CLOCK_PATH_SELECT_RECORD_TYPE:
750 cd_path = (ATOM_ROUTER_DATA_CLOCK_PATH_SELECT_RECORD *)
751 record;
752 router.cd_valid = true;
753 router.cd_mux_type = cd_path->ucMuxType;
754 router.cd_mux_control_pin = cd_path->ucMuxControlPin;
755 router.cd_mux_state = cd_path->ucMuxState[enum_id];
697 break; 756 break;
698 } 757 }
699 record = (ATOM_COMMON_RECORD_HEADER *) 758 record = (ATOM_COMMON_RECORD_HEADER *)
@@ -725,10 +784,9 @@ bool radeon_get_atom_connector_info_from_object_table(struct drm_device *dev)
725 ATOM_HPD_INT_RECORD *hpd_record; 784 ATOM_HPD_INT_RECORD *hpd_record;
726 ATOM_I2C_ID_CONFIG_ACCESS *i2c_config; 785 ATOM_I2C_ID_CONFIG_ACCESS *i2c_config;
727 786
728 while (record->ucRecordType > 0 787 while (record->ucRecordSize > 0 &&
729 && record-> 788 record->ucRecordType > 0 &&
730 ucRecordType <= 789 record->ucRecordType <= ATOM_MAX_OBJECT_RECORD_NUMBER) {
731 ATOM_MAX_OBJECT_RECORD_NUMBER) {
732 switch (record->ucRecordType) { 790 switch (record->ucRecordType) {
733 case ATOM_I2C_RECORD_TYPE: 791 case ATOM_I2C_RECORD_TYPE:
734 i2c_record = 792 i2c_record =
@@ -860,7 +918,8 @@ bool radeon_get_atom_connector_info_from_supported_devices_table(struct
860 size_t bc_size = sizeof(*bios_connectors) * ATOM_MAX_SUPPORTED_DEVICE; 918 size_t bc_size = sizeof(*bios_connectors) * ATOM_MAX_SUPPORTED_DEVICE;
861 struct radeon_router router; 919 struct radeon_router router;
862 920
863 router.valid = false; 921 router.ddc_valid = false;
922 router.cd_valid = false;
864 923
865 bios_connectors = kzalloc(bc_size, GFP_KERNEL); 924 bios_connectors = kzalloc(bc_size, GFP_KERNEL);
866 if (!bios_connectors) 925 if (!bios_connectors)
@@ -970,7 +1029,8 @@ bool radeon_get_atom_connector_info_from_supported_devices_table(struct
970 radeon_get_encoder_enum(dev, 1029 radeon_get_encoder_enum(dev,
971 (1 << i), 1030 (1 << i),
972 dac), 1031 dac),
973 (1 << i)); 1032 (1 << i),
1033 0);
974 else 1034 else
975 radeon_add_legacy_encoder(dev, 1035 radeon_add_legacy_encoder(dev,
976 radeon_get_encoder_enum(dev, 1036 radeon_get_encoder_enum(dev,
@@ -1049,6 +1109,7 @@ union firmware_info {
1049 ATOM_FIRMWARE_INFO_V1_3 info_13; 1109 ATOM_FIRMWARE_INFO_V1_3 info_13;
1050 ATOM_FIRMWARE_INFO_V1_4 info_14; 1110 ATOM_FIRMWARE_INFO_V1_4 info_14;
1051 ATOM_FIRMWARE_INFO_V2_1 info_21; 1111 ATOM_FIRMWARE_INFO_V2_1 info_21;
1112 ATOM_FIRMWARE_INFO_V2_2 info_22;
1052}; 1113};
1053 1114
1054bool radeon_atom_get_clock_info(struct drm_device *dev) 1115bool radeon_atom_get_clock_info(struct drm_device *dev)
@@ -1103,17 +1164,6 @@ bool radeon_atom_get_clock_info(struct drm_device *dev)
1103 p1pll->pll_out_min = 64800; 1164 p1pll->pll_out_min = 64800;
1104 else 1165 else
1105 p1pll->pll_out_min = 20000; 1166 p1pll->pll_out_min = 20000;
1106 } else if (p1pll->pll_out_min > 64800) {
1107 /* Limiting the pll output range is a good thing generally as
1108 * it limits the number of possible pll combinations for a given
1109 * frequency presumably to the ones that work best on each card.
1110 * However, certain duallink DVI monitors seem to like
1111 * pll combinations that would be limited by this at least on
1112 * pre-DCE 3.0 r6xx hardware. This might need to be adjusted per
1113 * family.
1114 */
1115 if (!radeon_new_pll)
1116 p1pll->pll_out_min = 64800;
1117 } 1167 }
1118 1168
1119 p1pll->pll_in_min = 1169 p1pll->pll_in_min =
@@ -1124,8 +1174,12 @@ bool radeon_atom_get_clock_info(struct drm_device *dev)
1124 *p2pll = *p1pll; 1174 *p2pll = *p1pll;
1125 1175
1126 /* system clock */ 1176 /* system clock */
1127 spll->reference_freq = 1177 if (ASIC_IS_DCE4(rdev))
1128 le16_to_cpu(firmware_info->info.usReferenceClock); 1178 spll->reference_freq =
1179 le16_to_cpu(firmware_info->info_21.usCoreReferenceClock);
1180 else
1181 spll->reference_freq =
1182 le16_to_cpu(firmware_info->info.usReferenceClock);
1129 spll->reference_div = 0; 1183 spll->reference_div = 0;
1130 1184
1131 spll->pll_out_min = 1185 spll->pll_out_min =
@@ -1147,8 +1201,12 @@ bool radeon_atom_get_clock_info(struct drm_device *dev)
1147 le16_to_cpu(firmware_info->info.usMaxEngineClockPLL_Input); 1201 le16_to_cpu(firmware_info->info.usMaxEngineClockPLL_Input);
1148 1202
1149 /* memory clock */ 1203 /* memory clock */
1150 mpll->reference_freq = 1204 if (ASIC_IS_DCE4(rdev))
1151 le16_to_cpu(firmware_info->info.usReferenceClock); 1205 mpll->reference_freq =
1206 le16_to_cpu(firmware_info->info_21.usMemoryReferenceClock);
1207 else
1208 mpll->reference_freq =
1209 le16_to_cpu(firmware_info->info.usReferenceClock);
1152 mpll->reference_div = 0; 1210 mpll->reference_div = 0;
1153 1211
1154 mpll->pll_out_min = 1212 mpll->pll_out_min =
@@ -1177,13 +1235,21 @@ bool radeon_atom_get_clock_info(struct drm_device *dev)
1177 if (ASIC_IS_DCE4(rdev)) { 1235 if (ASIC_IS_DCE4(rdev)) {
1178 rdev->clock.default_dispclk = 1236 rdev->clock.default_dispclk =
1179 le32_to_cpu(firmware_info->info_21.ulDefaultDispEngineClkFreq); 1237 le32_to_cpu(firmware_info->info_21.ulDefaultDispEngineClkFreq);
1180 if (rdev->clock.default_dispclk == 0) 1238 if (rdev->clock.default_dispclk == 0) {
1181 rdev->clock.default_dispclk = 60000; /* 600 Mhz */ 1239 if (ASIC_IS_DCE5(rdev))
1240 rdev->clock.default_dispclk = 54000; /* 540 Mhz */
1241 else
1242 rdev->clock.default_dispclk = 60000; /* 600 Mhz */
1243 }
1182 rdev->clock.dp_extclk = 1244 rdev->clock.dp_extclk =
1183 le16_to_cpu(firmware_info->info_21.usUniphyDPModeExtClkFreq); 1245 le16_to_cpu(firmware_info->info_21.usUniphyDPModeExtClkFreq);
1184 } 1246 }
1185 *dcpll = *p1pll; 1247 *dcpll = *p1pll;
1186 1248
1249 rdev->clock.max_pixel_clock = le16_to_cpu(firmware_info->info.usMaxPixelClock);
1250 if (rdev->clock.max_pixel_clock == 0)
1251 rdev->clock.max_pixel_clock = 40000;
1252
1187 return true; 1253 return true;
1188 } 1254 }
1189 1255
@@ -1213,11 +1279,11 @@ bool radeon_atombios_sideport_present(struct radeon_device *rdev)
1213 data_offset); 1279 data_offset);
1214 switch (crev) { 1280 switch (crev) {
1215 case 1: 1281 case 1:
1216 if (igp_info->info.ulBootUpMemoryClock) 1282 if (le32_to_cpu(igp_info->info.ulBootUpMemoryClock))
1217 return true; 1283 return true;
1218 break; 1284 break;
1219 case 2: 1285 case 2:
1220 if (igp_info->info_2.ulBootUpSidePortClock) 1286 if (le32_to_cpu(igp_info->info_2.ulBootUpSidePortClock))
1221 return true; 1287 return true;
1222 break; 1288 break;
1223 default: 1289 default:
@@ -1277,36 +1343,27 @@ bool radeon_atombios_get_tmds_info(struct radeon_encoder *encoder,
1277 return false; 1343 return false;
1278} 1344}
1279 1345
1280static struct radeon_atom_ss *radeon_atombios_get_ss_info(struct 1346bool radeon_atombios_get_ppll_ss_info(struct radeon_device *rdev,
1281 radeon_encoder 1347 struct radeon_atom_ss *ss,
1282 *encoder, 1348 int id)
1283 int id)
1284{ 1349{
1285 struct drm_device *dev = encoder->base.dev;
1286 struct radeon_device *rdev = dev->dev_private;
1287 struct radeon_mode_info *mode_info = &rdev->mode_info; 1350 struct radeon_mode_info *mode_info = &rdev->mode_info;
1288 int index = GetIndexIntoMasterTable(DATA, PPLL_SS_Info); 1351 int index = GetIndexIntoMasterTable(DATA, PPLL_SS_Info);
1289 uint16_t data_offset; 1352 uint16_t data_offset, size;
1290 struct _ATOM_SPREAD_SPECTRUM_INFO *ss_info; 1353 struct _ATOM_SPREAD_SPECTRUM_INFO *ss_info;
1291 uint8_t frev, crev; 1354 uint8_t frev, crev;
1292 struct radeon_atom_ss *ss = NULL; 1355 int i, num_indices;
1293 int i;
1294
1295 if (id > ATOM_MAX_SS_ENTRY)
1296 return NULL;
1297 1356
1298 if (atom_parse_data_header(mode_info->atom_context, index, NULL, 1357 memset(ss, 0, sizeof(struct radeon_atom_ss));
1358 if (atom_parse_data_header(mode_info->atom_context, index, &size,
1299 &frev, &crev, &data_offset)) { 1359 &frev, &crev, &data_offset)) {
1300 ss_info = 1360 ss_info =
1301 (struct _ATOM_SPREAD_SPECTRUM_INFO *)(mode_info->atom_context->bios + data_offset); 1361 (struct _ATOM_SPREAD_SPECTRUM_INFO *)(mode_info->atom_context->bios + data_offset);
1302 1362
1303 ss = 1363 num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) /
1304 kzalloc(sizeof(struct radeon_atom_ss), GFP_KERNEL); 1364 sizeof(ATOM_SPREAD_SPECTRUM_ASSIGNMENT);
1305
1306 if (!ss)
1307 return NULL;
1308 1365
1309 for (i = 0; i < ATOM_MAX_SS_ENTRY; i++) { 1366 for (i = 0; i < num_indices; i++) {
1310 if (ss_info->asSS_Info[i].ucSS_Id == id) { 1367 if (ss_info->asSS_Info[i].ucSS_Id == id) {
1311 ss->percentage = 1368 ss->percentage =
1312 le16_to_cpu(ss_info->asSS_Info[i].usSpreadSpectrumPercentage); 1369 le16_to_cpu(ss_info->asSS_Info[i].usSpreadSpectrumPercentage);
@@ -1315,11 +1372,127 @@ static struct radeon_atom_ss *radeon_atombios_get_ss_info(struct
1315 ss->delay = ss_info->asSS_Info[i].ucSS_Delay; 1372 ss->delay = ss_info->asSS_Info[i].ucSS_Delay;
1316 ss->range = ss_info->asSS_Info[i].ucSS_Range; 1373 ss->range = ss_info->asSS_Info[i].ucSS_Range;
1317 ss->refdiv = ss_info->asSS_Info[i].ucRecommendedRef_Div; 1374 ss->refdiv = ss_info->asSS_Info[i].ucRecommendedRef_Div;
1318 break; 1375 return true;
1376 }
1377 }
1378 }
1379 return false;
1380}
1381
1382static void radeon_atombios_get_igp_ss_overrides(struct radeon_device *rdev,
1383 struct radeon_atom_ss *ss,
1384 int id)
1385{
1386 struct radeon_mode_info *mode_info = &rdev->mode_info;
1387 int index = GetIndexIntoMasterTable(DATA, IntegratedSystemInfo);
1388 u16 data_offset, size;
1389 struct _ATOM_INTEGRATED_SYSTEM_INFO_V6 *igp_info;
1390 u8 frev, crev;
1391 u16 percentage = 0, rate = 0;
1392
1393 /* get any igp specific overrides */
1394 if (atom_parse_data_header(mode_info->atom_context, index, &size,
1395 &frev, &crev, &data_offset)) {
1396 igp_info = (struct _ATOM_INTEGRATED_SYSTEM_INFO_V6 *)
1397 (mode_info->atom_context->bios + data_offset);
1398 switch (id) {
1399 case ASIC_INTERNAL_SS_ON_TMDS:
1400 percentage = le16_to_cpu(igp_info->usDVISSPercentage);
1401 rate = le16_to_cpu(igp_info->usDVISSpreadRateIn10Hz);
1402 break;
1403 case ASIC_INTERNAL_SS_ON_HDMI:
1404 percentage = le16_to_cpu(igp_info->usHDMISSPercentage);
1405 rate = le16_to_cpu(igp_info->usHDMISSpreadRateIn10Hz);
1406 break;
1407 case ASIC_INTERNAL_SS_ON_LVDS:
1408 percentage = le16_to_cpu(igp_info->usLvdsSSPercentage);
1409 rate = le16_to_cpu(igp_info->usLvdsSSpreadRateIn10Hz);
1410 break;
1411 }
1412 if (percentage)
1413 ss->percentage = percentage;
1414 if (rate)
1415 ss->rate = rate;
1416 }
1417}
1418
1419union asic_ss_info {
1420 struct _ATOM_ASIC_INTERNAL_SS_INFO info;
1421 struct _ATOM_ASIC_INTERNAL_SS_INFO_V2 info_2;
1422 struct _ATOM_ASIC_INTERNAL_SS_INFO_V3 info_3;
1423};
1424
1425bool radeon_atombios_get_asic_ss_info(struct radeon_device *rdev,
1426 struct radeon_atom_ss *ss,
1427 int id, u32 clock)
1428{
1429 struct radeon_mode_info *mode_info = &rdev->mode_info;
1430 int index = GetIndexIntoMasterTable(DATA, ASIC_InternalSS_Info);
1431 uint16_t data_offset, size;
1432 union asic_ss_info *ss_info;
1433 uint8_t frev, crev;
1434 int i, num_indices;
1435
1436 memset(ss, 0, sizeof(struct radeon_atom_ss));
1437 if (atom_parse_data_header(mode_info->atom_context, index, &size,
1438 &frev, &crev, &data_offset)) {
1439
1440 ss_info =
1441 (union asic_ss_info *)(mode_info->atom_context->bios + data_offset);
1442
1443 switch (frev) {
1444 case 1:
1445 num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) /
1446 sizeof(ATOM_ASIC_SS_ASSIGNMENT);
1447
1448 for (i = 0; i < num_indices; i++) {
1449 if ((ss_info->info.asSpreadSpectrum[i].ucClockIndication == id) &&
1450 (clock <= le32_to_cpu(ss_info->info.asSpreadSpectrum[i].ulTargetClockRange))) {
1451 ss->percentage =
1452 le16_to_cpu(ss_info->info.asSpreadSpectrum[i].usSpreadSpectrumPercentage);
1453 ss->type = ss_info->info.asSpreadSpectrum[i].ucSpreadSpectrumMode;
1454 ss->rate = le16_to_cpu(ss_info->info.asSpreadSpectrum[i].usSpreadRateInKhz);
1455 return true;
1456 }
1457 }
1458 break;
1459 case 2:
1460 num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) /
1461 sizeof(ATOM_ASIC_SS_ASSIGNMENT_V2);
1462 for (i = 0; i < num_indices; i++) {
1463 if ((ss_info->info_2.asSpreadSpectrum[i].ucClockIndication == id) &&
1464 (clock <= le32_to_cpu(ss_info->info_2.asSpreadSpectrum[i].ulTargetClockRange))) {
1465 ss->percentage =
1466 le16_to_cpu(ss_info->info_2.asSpreadSpectrum[i].usSpreadSpectrumPercentage);
1467 ss->type = ss_info->info_2.asSpreadSpectrum[i].ucSpreadSpectrumMode;
1468 ss->rate = le16_to_cpu(ss_info->info_2.asSpreadSpectrum[i].usSpreadRateIn10Hz);
1469 return true;
1470 }
1471 }
1472 break;
1473 case 3:
1474 num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) /
1475 sizeof(ATOM_ASIC_SS_ASSIGNMENT_V3);
1476 for (i = 0; i < num_indices; i++) {
1477 if ((ss_info->info_3.asSpreadSpectrum[i].ucClockIndication == id) &&
1478 (clock <= le32_to_cpu(ss_info->info_3.asSpreadSpectrum[i].ulTargetClockRange))) {
1479 ss->percentage =
1480 le16_to_cpu(ss_info->info_3.asSpreadSpectrum[i].usSpreadSpectrumPercentage);
1481 ss->type = ss_info->info_3.asSpreadSpectrum[i].ucSpreadSpectrumMode;
1482 ss->rate = le16_to_cpu(ss_info->info_3.asSpreadSpectrum[i].usSpreadRateIn10Hz);
1483 if (rdev->flags & RADEON_IS_IGP)
1484 radeon_atombios_get_igp_ss_overrides(rdev, ss, id);
1485 return true;
1486 }
1319 } 1487 }
1488 break;
1489 default:
1490 DRM_ERROR("Unsupported ASIC_InternalSS_Info table: %d %d\n", frev, crev);
1491 break;
1320 } 1492 }
1493
1321 } 1494 }
1322 return ss; 1495 return false;
1323} 1496}
1324 1497
1325union lvds_info { 1498union lvds_info {
@@ -1371,7 +1544,7 @@ struct radeon_encoder_atom_dig *radeon_atombios_get_lvds_info(struct
1371 le16_to_cpu(lvds_info->info.sLCDTiming.usVSyncWidth); 1544 le16_to_cpu(lvds_info->info.sLCDTiming.usVSyncWidth);
1372 lvds->panel_pwr_delay = 1545 lvds->panel_pwr_delay =
1373 le16_to_cpu(lvds_info->info.usOffDelayInMs); 1546 le16_to_cpu(lvds_info->info.usOffDelayInMs);
1374 lvds->lvds_misc = lvds_info->info.ucLVDS_Misc; 1547 lvds->lcd_misc = lvds_info->info.ucLVDS_Misc;
1375 1548
1376 misc = le16_to_cpu(lvds_info->info.sLCDTiming.susModeMiscInfo.usAccess); 1549 misc = le16_to_cpu(lvds_info->info.sLCDTiming.susModeMiscInfo.usAccess);
1377 if (misc & ATOM_VSYNC_POLARITY) 1550 if (misc & ATOM_VSYNC_POLARITY)
@@ -1385,22 +1558,13 @@ struct radeon_encoder_atom_dig *radeon_atombios_get_lvds_info(struct
1385 if (misc & ATOM_DOUBLE_CLOCK_MODE) 1558 if (misc & ATOM_DOUBLE_CLOCK_MODE)
1386 lvds->native_mode.flags |= DRM_MODE_FLAG_DBLSCAN; 1559 lvds->native_mode.flags |= DRM_MODE_FLAG_DBLSCAN;
1387 1560
1561 lvds->native_mode.width_mm = le16_to_cpu(lvds_info->info.sLCDTiming.usImageHSize);
1562 lvds->native_mode.height_mm = le16_to_cpu(lvds_info->info.sLCDTiming.usImageVSize);
1563
1388 /* set crtc values */ 1564 /* set crtc values */
1389 drm_mode_set_crtcinfo(&lvds->native_mode, CRTC_INTERLACE_HALVE_V); 1565 drm_mode_set_crtcinfo(&lvds->native_mode, CRTC_INTERLACE_HALVE_V);
1390 1566
1391 lvds->ss = radeon_atombios_get_ss_info(encoder, lvds_info->info.ucSS_Id); 1567 lvds->lcd_ss_id = lvds_info->info.ucSS_Id;
1392
1393 if (ASIC_IS_AVIVO(rdev)) {
1394 if (radeon_new_pll == 0)
1395 lvds->pll_algo = PLL_ALGO_LEGACY;
1396 else
1397 lvds->pll_algo = PLL_ALGO_NEW;
1398 } else {
1399 if (radeon_new_pll == 1)
1400 lvds->pll_algo = PLL_ALGO_NEW;
1401 else
1402 lvds->pll_algo = PLL_ALGO_LEGACY;
1403 }
1404 1568
1405 encoder->native_mode = lvds->native_mode; 1569 encoder->native_mode = lvds->native_mode;
1406 1570
@@ -1409,6 +1573,68 @@ struct radeon_encoder_atom_dig *radeon_atombios_get_lvds_info(struct
1409 else 1573 else
1410 lvds->linkb = false; 1574 lvds->linkb = false;
1411 1575
1576 /* parse the lcd record table */
1577 if (le16_to_cpu(lvds_info->info.usModePatchTableOffset)) {
1578 ATOM_FAKE_EDID_PATCH_RECORD *fake_edid_record;
1579 ATOM_PANEL_RESOLUTION_PATCH_RECORD *panel_res_record;
1580 bool bad_record = false;
1581 u8 *record;
1582
1583 if ((frev == 1) && (crev < 2))
1584 /* absolute */
1585 record = (u8 *)(mode_info->atom_context->bios +
1586 le16_to_cpu(lvds_info->info.usModePatchTableOffset));
1587 else
1588 /* relative */
1589 record = (u8 *)(mode_info->atom_context->bios +
1590 data_offset +
1591 le16_to_cpu(lvds_info->info.usModePatchTableOffset));
1592 while (*record != ATOM_RECORD_END_TYPE) {
1593 switch (*record) {
1594 case LCD_MODE_PATCH_RECORD_MODE_TYPE:
1595 record += sizeof(ATOM_PATCH_RECORD_MODE);
1596 break;
1597 case LCD_RTS_RECORD_TYPE:
1598 record += sizeof(ATOM_LCD_RTS_RECORD);
1599 break;
1600 case LCD_CAP_RECORD_TYPE:
1601 record += sizeof(ATOM_LCD_MODE_CONTROL_CAP);
1602 break;
1603 case LCD_FAKE_EDID_PATCH_RECORD_TYPE:
1604 fake_edid_record = (ATOM_FAKE_EDID_PATCH_RECORD *)record;
1605 if (fake_edid_record->ucFakeEDIDLength) {
1606 struct edid *edid;
1607 int edid_size =
1608 max((int)EDID_LENGTH, (int)fake_edid_record->ucFakeEDIDLength);
1609 edid = kmalloc(edid_size, GFP_KERNEL);
1610 if (edid) {
1611 memcpy((u8 *)edid, (u8 *)&fake_edid_record->ucFakeEDIDString[0],
1612 fake_edid_record->ucFakeEDIDLength);
1613
1614 if (drm_edid_is_valid(edid)) {
1615 rdev->mode_info.bios_hardcoded_edid = edid;
1616 rdev->mode_info.bios_hardcoded_edid_size = edid_size;
1617 } else
1618 kfree(edid);
1619 }
1620 }
1621 record += sizeof(ATOM_FAKE_EDID_PATCH_RECORD);
1622 break;
1623 case LCD_PANEL_RESOLUTION_RECORD_TYPE:
1624 panel_res_record = (ATOM_PANEL_RESOLUTION_PATCH_RECORD *)record;
1625 lvds->native_mode.width_mm = panel_res_record->usHSize;
1626 lvds->native_mode.height_mm = panel_res_record->usVSize;
1627 record += sizeof(ATOM_PANEL_RESOLUTION_PATCH_RECORD);
1628 break;
1629 default:
1630 DRM_ERROR("Bad LCD record %d\n", *record);
1631 bad_record = true;
1632 break;
1633 }
1634 if (bad_record)
1635 break;
1636 }
1637 }
1412 } 1638 }
1413 return lvds; 1639 return lvds;
1414} 1640}
@@ -1660,510 +1886,658 @@ static const char *pp_lib_thermal_controller_names[] = {
1660 "RV6xx", 1886 "RV6xx",
1661 "RV770", 1887 "RV770",
1662 "adt7473", 1888 "adt7473",
1889 "NONE",
1663 "External GPIO", 1890 "External GPIO",
1664 "Evergreen", 1891 "Evergreen",
1665 "adt7473 with internal", 1892 "emc2103",
1666 1893 "Sumo",
1894 "Northern Islands",
1667}; 1895};
1668 1896
1669union power_info { 1897union power_info {
1670 struct _ATOM_POWERPLAY_INFO info; 1898 struct _ATOM_POWERPLAY_INFO info;
1671 struct _ATOM_POWERPLAY_INFO_V2 info_2; 1899 struct _ATOM_POWERPLAY_INFO_V2 info_2;
1672 struct _ATOM_POWERPLAY_INFO_V3 info_3; 1900 struct _ATOM_POWERPLAY_INFO_V3 info_3;
1673 struct _ATOM_PPLIB_POWERPLAYTABLE info_4; 1901 struct _ATOM_PPLIB_POWERPLAYTABLE pplib;
1902 struct _ATOM_PPLIB_POWERPLAYTABLE2 pplib2;
1903 struct _ATOM_PPLIB_POWERPLAYTABLE3 pplib3;
1674}; 1904};
1675 1905
1676void radeon_atombios_get_power_modes(struct radeon_device *rdev) 1906union pplib_clock_info {
1907 struct _ATOM_PPLIB_R600_CLOCK_INFO r600;
1908 struct _ATOM_PPLIB_RS780_CLOCK_INFO rs780;
1909 struct _ATOM_PPLIB_EVERGREEN_CLOCK_INFO evergreen;
1910 struct _ATOM_PPLIB_SUMO_CLOCK_INFO sumo;
1911};
1912
1913union pplib_power_state {
1914 struct _ATOM_PPLIB_STATE v1;
1915 struct _ATOM_PPLIB_STATE_V2 v2;
1916};
1917
1918static void radeon_atombios_parse_misc_flags_1_3(struct radeon_device *rdev,
1919 int state_index,
1920 u32 misc, u32 misc2)
1921{
1922 rdev->pm.power_state[state_index].misc = misc;
1923 rdev->pm.power_state[state_index].misc2 = misc2;
1924 /* order matters! */
1925 if (misc & ATOM_PM_MISCINFO_POWER_SAVING_MODE)
1926 rdev->pm.power_state[state_index].type =
1927 POWER_STATE_TYPE_POWERSAVE;
1928 if (misc & ATOM_PM_MISCINFO_DEFAULT_DC_STATE_ENTRY_TRUE)
1929 rdev->pm.power_state[state_index].type =
1930 POWER_STATE_TYPE_BATTERY;
1931 if (misc & ATOM_PM_MISCINFO_DEFAULT_LOW_DC_STATE_ENTRY_TRUE)
1932 rdev->pm.power_state[state_index].type =
1933 POWER_STATE_TYPE_BATTERY;
1934 if (misc & ATOM_PM_MISCINFO_LOAD_BALANCE_EN)
1935 rdev->pm.power_state[state_index].type =
1936 POWER_STATE_TYPE_BALANCED;
1937 if (misc & ATOM_PM_MISCINFO_3D_ACCELERATION_EN) {
1938 rdev->pm.power_state[state_index].type =
1939 POWER_STATE_TYPE_PERFORMANCE;
1940 rdev->pm.power_state[state_index].flags &=
1941 ~RADEON_PM_STATE_SINGLE_DISPLAY_ONLY;
1942 }
1943 if (misc2 & ATOM_PM_MISCINFO2_SYSTEM_AC_LITE_MODE)
1944 rdev->pm.power_state[state_index].type =
1945 POWER_STATE_TYPE_BALANCED;
1946 if (misc & ATOM_PM_MISCINFO_DRIVER_DEFAULT_MODE) {
1947 rdev->pm.power_state[state_index].type =
1948 POWER_STATE_TYPE_DEFAULT;
1949 rdev->pm.default_power_state_index = state_index;
1950 rdev->pm.power_state[state_index].default_clock_mode =
1951 &rdev->pm.power_state[state_index].clock_info[0];
1952 } else if (state_index == 0) {
1953 rdev->pm.power_state[state_index].clock_info[0].flags |=
1954 RADEON_PM_MODE_NO_DISPLAY;
1955 }
1956}
1957
1958static int radeon_atombios_parse_power_table_1_3(struct radeon_device *rdev)
1677{ 1959{
1678 struct radeon_mode_info *mode_info = &rdev->mode_info; 1960 struct radeon_mode_info *mode_info = &rdev->mode_info;
1961 u32 misc, misc2 = 0;
1962 int num_modes = 0, i;
1963 int state_index = 0;
1964 struct radeon_i2c_bus_rec i2c_bus;
1965 union power_info *power_info;
1679 int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo); 1966 int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo);
1680 u16 data_offset; 1967 u16 data_offset;
1681 u8 frev, crev; 1968 u8 frev, crev;
1682 u32 misc, misc2 = 0, sclk, mclk;
1683 union power_info *power_info;
1684 struct _ATOM_PPLIB_NONCLOCK_INFO *non_clock_info;
1685 struct _ATOM_PPLIB_STATE *power_state;
1686 int num_modes = 0, i, j;
1687 int state_index = 0, mode_index = 0;
1688 struct radeon_i2c_bus_rec i2c_bus;
1689 1969
1690 rdev->pm.default_power_state_index = -1; 1970 if (!atom_parse_data_header(mode_info->atom_context, index, NULL,
1691 1971 &frev, &crev, &data_offset))
1692 if (atom_parse_data_header(mode_info->atom_context, index, NULL, 1972 return state_index;
1693 &frev, &crev, &data_offset)) { 1973 power_info = (union power_info *)(mode_info->atom_context->bios + data_offset);
1694 power_info = (union power_info *)(mode_info->atom_context->bios + data_offset); 1974
1695 if (frev < 4) { 1975 /* add the i2c bus for thermal/fan chip */
1696 /* add the i2c bus for thermal/fan chip */ 1976 if (power_info->info.ucOverdriveThermalController > 0) {
1697 if (power_info->info.ucOverdriveThermalController > 0) { 1977 DRM_INFO("Possible %s thermal controller at 0x%02x\n",
1698 DRM_INFO("Possible %s thermal controller at 0x%02x\n", 1978 thermal_controller_names[power_info->info.ucOverdriveThermalController],
1699 thermal_controller_names[power_info->info.ucOverdriveThermalController], 1979 power_info->info.ucOverdriveControllerAddress >> 1);
1700 power_info->info.ucOverdriveControllerAddress >> 1); 1980 i2c_bus = radeon_lookup_i2c_gpio(rdev, power_info->info.ucOverdriveI2cLine);
1701 i2c_bus = radeon_lookup_i2c_gpio(rdev, power_info->info.ucOverdriveI2cLine); 1981 rdev->pm.i2c_bus = radeon_i2c_lookup(rdev, &i2c_bus);
1702 rdev->pm.i2c_bus = radeon_i2c_lookup(rdev, &i2c_bus); 1982 if (rdev->pm.i2c_bus) {
1703 if (rdev->pm.i2c_bus) { 1983 struct i2c_board_info info = { };
1704 struct i2c_board_info info = { }; 1984 const char *name = thermal_controller_names[power_info->info.
1705 const char *name = thermal_controller_names[power_info->info. 1985 ucOverdriveThermalController];
1706 ucOverdriveThermalController]; 1986 info.addr = power_info->info.ucOverdriveControllerAddress >> 1;
1707 info.addr = power_info->info.ucOverdriveControllerAddress >> 1; 1987 strlcpy(info.type, name, sizeof(info.type));
1708 strlcpy(info.type, name, sizeof(info.type)); 1988 i2c_new_device(&rdev->pm.i2c_bus->adapter, &info);
1709 i2c_new_device(&rdev->pm.i2c_bus->adapter, &info); 1989 }
1710 } 1990 }
1991 num_modes = power_info->info.ucNumOfPowerModeEntries;
1992 if (num_modes > ATOM_MAX_NUMBEROF_POWER_BLOCK)
1993 num_modes = ATOM_MAX_NUMBEROF_POWER_BLOCK;
1994 rdev->pm.power_state = kzalloc(sizeof(struct radeon_power_state) * num_modes, GFP_KERNEL);
1995 if (!rdev->pm.power_state)
1996 return state_index;
1997 /* last mode is usually default, array is low to high */
1998 for (i = 0; i < num_modes; i++) {
1999 rdev->pm.power_state[state_index].clock_info[0].voltage.type = VOLTAGE_NONE;
2000 switch (frev) {
2001 case 1:
2002 rdev->pm.power_state[state_index].num_clock_modes = 1;
2003 rdev->pm.power_state[state_index].clock_info[0].mclk =
2004 le16_to_cpu(power_info->info.asPowerPlayInfo[i].usMemoryClock);
2005 rdev->pm.power_state[state_index].clock_info[0].sclk =
2006 le16_to_cpu(power_info->info.asPowerPlayInfo[i].usEngineClock);
2007 /* skip invalid modes */
2008 if ((rdev->pm.power_state[state_index].clock_info[0].mclk == 0) ||
2009 (rdev->pm.power_state[state_index].clock_info[0].sclk == 0))
2010 continue;
2011 rdev->pm.power_state[state_index].pcie_lanes =
2012 power_info->info.asPowerPlayInfo[i].ucNumPciELanes;
2013 misc = le32_to_cpu(power_info->info.asPowerPlayInfo[i].ulMiscInfo);
2014 if ((misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_SUPPORT) ||
2015 (misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_ACTIVE_HIGH)) {
2016 rdev->pm.power_state[state_index].clock_info[0].voltage.type =
2017 VOLTAGE_GPIO;
2018 rdev->pm.power_state[state_index].clock_info[0].voltage.gpio =
2019 radeon_lookup_gpio(rdev,
2020 power_info->info.asPowerPlayInfo[i].ucVoltageDropIndex);
2021 if (misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_ACTIVE_HIGH)
2022 rdev->pm.power_state[state_index].clock_info[0].voltage.active_high =
2023 true;
2024 else
2025 rdev->pm.power_state[state_index].clock_info[0].voltage.active_high =
2026 false;
2027 } else if (misc & ATOM_PM_MISCINFO_PROGRAM_VOLTAGE) {
2028 rdev->pm.power_state[state_index].clock_info[0].voltage.type =
2029 VOLTAGE_VDDC;
2030 rdev->pm.power_state[state_index].clock_info[0].voltage.vddc_id =
2031 power_info->info.asPowerPlayInfo[i].ucVoltageDropIndex;
1711 } 2032 }
1712 num_modes = power_info->info.ucNumOfPowerModeEntries; 2033 rdev->pm.power_state[state_index].flags = RADEON_PM_STATE_SINGLE_DISPLAY_ONLY;
1713 if (num_modes > ATOM_MAX_NUMBEROF_POWER_BLOCK) 2034 radeon_atombios_parse_misc_flags_1_3(rdev, state_index, misc, 0);
1714 num_modes = ATOM_MAX_NUMBEROF_POWER_BLOCK; 2035 state_index++;
1715 /* last mode is usually default, array is low to high */ 2036 break;
1716 for (i = 0; i < num_modes; i++) { 2037 case 2:
1717 rdev->pm.power_state[state_index].clock_info[0].voltage.type = VOLTAGE_NONE; 2038 rdev->pm.power_state[state_index].num_clock_modes = 1;
1718 switch (frev) { 2039 rdev->pm.power_state[state_index].clock_info[0].mclk =
1719 case 1: 2040 le32_to_cpu(power_info->info_2.asPowerPlayInfo[i].ulMemoryClock);
1720 rdev->pm.power_state[state_index].num_clock_modes = 1; 2041 rdev->pm.power_state[state_index].clock_info[0].sclk =
1721 rdev->pm.power_state[state_index].clock_info[0].mclk = 2042 le32_to_cpu(power_info->info_2.asPowerPlayInfo[i].ulEngineClock);
1722 le16_to_cpu(power_info->info.asPowerPlayInfo[i].usMemoryClock); 2043 /* skip invalid modes */
1723 rdev->pm.power_state[state_index].clock_info[0].sclk = 2044 if ((rdev->pm.power_state[state_index].clock_info[0].mclk == 0) ||
1724 le16_to_cpu(power_info->info.asPowerPlayInfo[i].usEngineClock); 2045 (rdev->pm.power_state[state_index].clock_info[0].sclk == 0))
1725 /* skip invalid modes */ 2046 continue;
1726 if ((rdev->pm.power_state[state_index].clock_info[0].mclk == 0) || 2047 rdev->pm.power_state[state_index].pcie_lanes =
1727 (rdev->pm.power_state[state_index].clock_info[0].sclk == 0)) 2048 power_info->info_2.asPowerPlayInfo[i].ucNumPciELanes;
1728 continue; 2049 misc = le32_to_cpu(power_info->info_2.asPowerPlayInfo[i].ulMiscInfo);
1729 rdev->pm.power_state[state_index].pcie_lanes = 2050 misc2 = le32_to_cpu(power_info->info_2.asPowerPlayInfo[i].ulMiscInfo2);
1730 power_info->info.asPowerPlayInfo[i].ucNumPciELanes; 2051 if ((misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_SUPPORT) ||
1731 misc = le32_to_cpu(power_info->info.asPowerPlayInfo[i].ulMiscInfo); 2052 (misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_ACTIVE_HIGH)) {
1732 if ((misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_SUPPORT) || 2053 rdev->pm.power_state[state_index].clock_info[0].voltage.type =
1733 (misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_ACTIVE_HIGH)) { 2054 VOLTAGE_GPIO;
1734 rdev->pm.power_state[state_index].clock_info[0].voltage.type = 2055 rdev->pm.power_state[state_index].clock_info[0].voltage.gpio =
1735 VOLTAGE_GPIO; 2056 radeon_lookup_gpio(rdev,
1736 rdev->pm.power_state[state_index].clock_info[0].voltage.gpio = 2057 power_info->info_2.asPowerPlayInfo[i].ucVoltageDropIndex);
1737 radeon_lookup_gpio(rdev, 2058 if (misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_ACTIVE_HIGH)
1738 power_info->info.asPowerPlayInfo[i].ucVoltageDropIndex); 2059 rdev->pm.power_state[state_index].clock_info[0].voltage.active_high =
1739 if (misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_ACTIVE_HIGH) 2060 true;
1740 rdev->pm.power_state[state_index].clock_info[0].voltage.active_high = 2061 else
1741 true; 2062 rdev->pm.power_state[state_index].clock_info[0].voltage.active_high =
1742 else 2063 false;
1743 rdev->pm.power_state[state_index].clock_info[0].voltage.active_high = 2064 } else if (misc & ATOM_PM_MISCINFO_PROGRAM_VOLTAGE) {
1744 false; 2065 rdev->pm.power_state[state_index].clock_info[0].voltage.type =
1745 } else if (misc & ATOM_PM_MISCINFO_PROGRAM_VOLTAGE) { 2066 VOLTAGE_VDDC;
1746 rdev->pm.power_state[state_index].clock_info[0].voltage.type = 2067 rdev->pm.power_state[state_index].clock_info[0].voltage.vddc_id =
1747 VOLTAGE_VDDC; 2068 power_info->info_2.asPowerPlayInfo[i].ucVoltageDropIndex;
1748 rdev->pm.power_state[state_index].clock_info[0].voltage.vddc_id =
1749 power_info->info.asPowerPlayInfo[i].ucVoltageDropIndex;
1750 }
1751 rdev->pm.power_state[state_index].flags = RADEON_PM_STATE_SINGLE_DISPLAY_ONLY;
1752 rdev->pm.power_state[state_index].misc = misc;
1753 /* order matters! */
1754 if (misc & ATOM_PM_MISCINFO_POWER_SAVING_MODE)
1755 rdev->pm.power_state[state_index].type =
1756 POWER_STATE_TYPE_POWERSAVE;
1757 if (misc & ATOM_PM_MISCINFO_DEFAULT_DC_STATE_ENTRY_TRUE)
1758 rdev->pm.power_state[state_index].type =
1759 POWER_STATE_TYPE_BATTERY;
1760 if (misc & ATOM_PM_MISCINFO_DEFAULT_LOW_DC_STATE_ENTRY_TRUE)
1761 rdev->pm.power_state[state_index].type =
1762 POWER_STATE_TYPE_BATTERY;
1763 if (misc & ATOM_PM_MISCINFO_LOAD_BALANCE_EN)
1764 rdev->pm.power_state[state_index].type =
1765 POWER_STATE_TYPE_BALANCED;
1766 if (misc & ATOM_PM_MISCINFO_3D_ACCELERATION_EN) {
1767 rdev->pm.power_state[state_index].type =
1768 POWER_STATE_TYPE_PERFORMANCE;
1769 rdev->pm.power_state[state_index].flags &=
1770 ~RADEON_PM_STATE_SINGLE_DISPLAY_ONLY;
1771 }
1772 if (misc & ATOM_PM_MISCINFO_DRIVER_DEFAULT_MODE) {
1773 rdev->pm.power_state[state_index].type =
1774 POWER_STATE_TYPE_DEFAULT;
1775 rdev->pm.default_power_state_index = state_index;
1776 rdev->pm.power_state[state_index].default_clock_mode =
1777 &rdev->pm.power_state[state_index].clock_info[0];
1778 rdev->pm.power_state[state_index].flags &=
1779 ~RADEON_PM_STATE_SINGLE_DISPLAY_ONLY;
1780 } else if (state_index == 0) {
1781 rdev->pm.power_state[state_index].clock_info[0].flags |=
1782 RADEON_PM_MODE_NO_DISPLAY;
1783 }
1784 state_index++;
1785 break;
1786 case 2:
1787 rdev->pm.power_state[state_index].num_clock_modes = 1;
1788 rdev->pm.power_state[state_index].clock_info[0].mclk =
1789 le32_to_cpu(power_info->info_2.asPowerPlayInfo[i].ulMemoryClock);
1790 rdev->pm.power_state[state_index].clock_info[0].sclk =
1791 le32_to_cpu(power_info->info_2.asPowerPlayInfo[i].ulEngineClock);
1792 /* skip invalid modes */
1793 if ((rdev->pm.power_state[state_index].clock_info[0].mclk == 0) ||
1794 (rdev->pm.power_state[state_index].clock_info[0].sclk == 0))
1795 continue;
1796 rdev->pm.power_state[state_index].pcie_lanes =
1797 power_info->info_2.asPowerPlayInfo[i].ucNumPciELanes;
1798 misc = le32_to_cpu(power_info->info_2.asPowerPlayInfo[i].ulMiscInfo);
1799 misc2 = le32_to_cpu(power_info->info_2.asPowerPlayInfo[i].ulMiscInfo2);
1800 if ((misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_SUPPORT) ||
1801 (misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_ACTIVE_HIGH)) {
1802 rdev->pm.power_state[state_index].clock_info[0].voltage.type =
1803 VOLTAGE_GPIO;
1804 rdev->pm.power_state[state_index].clock_info[0].voltage.gpio =
1805 radeon_lookup_gpio(rdev,
1806 power_info->info_2.asPowerPlayInfo[i].ucVoltageDropIndex);
1807 if (misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_ACTIVE_HIGH)
1808 rdev->pm.power_state[state_index].clock_info[0].voltage.active_high =
1809 true;
1810 else
1811 rdev->pm.power_state[state_index].clock_info[0].voltage.active_high =
1812 false;
1813 } else if (misc & ATOM_PM_MISCINFO_PROGRAM_VOLTAGE) {
1814 rdev->pm.power_state[state_index].clock_info[0].voltage.type =
1815 VOLTAGE_VDDC;
1816 rdev->pm.power_state[state_index].clock_info[0].voltage.vddc_id =
1817 power_info->info_2.asPowerPlayInfo[i].ucVoltageDropIndex;
1818 }
1819 rdev->pm.power_state[state_index].flags = RADEON_PM_STATE_SINGLE_DISPLAY_ONLY;
1820 rdev->pm.power_state[state_index].misc = misc;
1821 rdev->pm.power_state[state_index].misc2 = misc2;
1822 /* order matters! */
1823 if (misc & ATOM_PM_MISCINFO_POWER_SAVING_MODE)
1824 rdev->pm.power_state[state_index].type =
1825 POWER_STATE_TYPE_POWERSAVE;
1826 if (misc & ATOM_PM_MISCINFO_DEFAULT_DC_STATE_ENTRY_TRUE)
1827 rdev->pm.power_state[state_index].type =
1828 POWER_STATE_TYPE_BATTERY;
1829 if (misc & ATOM_PM_MISCINFO_DEFAULT_LOW_DC_STATE_ENTRY_TRUE)
1830 rdev->pm.power_state[state_index].type =
1831 POWER_STATE_TYPE_BATTERY;
1832 if (misc & ATOM_PM_MISCINFO_LOAD_BALANCE_EN)
1833 rdev->pm.power_state[state_index].type =
1834 POWER_STATE_TYPE_BALANCED;
1835 if (misc & ATOM_PM_MISCINFO_3D_ACCELERATION_EN) {
1836 rdev->pm.power_state[state_index].type =
1837 POWER_STATE_TYPE_PERFORMANCE;
1838 rdev->pm.power_state[state_index].flags &=
1839 ~RADEON_PM_STATE_SINGLE_DISPLAY_ONLY;
1840 }
1841 if (misc2 & ATOM_PM_MISCINFO2_SYSTEM_AC_LITE_MODE)
1842 rdev->pm.power_state[state_index].type =
1843 POWER_STATE_TYPE_BALANCED;
1844 if (misc2 & ATOM_PM_MISCINFO2_MULTI_DISPLAY_SUPPORT)
1845 rdev->pm.power_state[state_index].flags &=
1846 ~RADEON_PM_STATE_SINGLE_DISPLAY_ONLY;
1847 if (misc & ATOM_PM_MISCINFO_DRIVER_DEFAULT_MODE) {
1848 rdev->pm.power_state[state_index].type =
1849 POWER_STATE_TYPE_DEFAULT;
1850 rdev->pm.default_power_state_index = state_index;
1851 rdev->pm.power_state[state_index].default_clock_mode =
1852 &rdev->pm.power_state[state_index].clock_info[0];
1853 rdev->pm.power_state[state_index].flags &=
1854 ~RADEON_PM_STATE_SINGLE_DISPLAY_ONLY;
1855 } else if (state_index == 0) {
1856 rdev->pm.power_state[state_index].clock_info[0].flags |=
1857 RADEON_PM_MODE_NO_DISPLAY;
1858 }
1859 state_index++;
1860 break;
1861 case 3:
1862 rdev->pm.power_state[state_index].num_clock_modes = 1;
1863 rdev->pm.power_state[state_index].clock_info[0].mclk =
1864 le32_to_cpu(power_info->info_3.asPowerPlayInfo[i].ulMemoryClock);
1865 rdev->pm.power_state[state_index].clock_info[0].sclk =
1866 le32_to_cpu(power_info->info_3.asPowerPlayInfo[i].ulEngineClock);
1867 /* skip invalid modes */
1868 if ((rdev->pm.power_state[state_index].clock_info[0].mclk == 0) ||
1869 (rdev->pm.power_state[state_index].clock_info[0].sclk == 0))
1870 continue;
1871 rdev->pm.power_state[state_index].pcie_lanes =
1872 power_info->info_3.asPowerPlayInfo[i].ucNumPciELanes;
1873 misc = le32_to_cpu(power_info->info_3.asPowerPlayInfo[i].ulMiscInfo);
1874 misc2 = le32_to_cpu(power_info->info_3.asPowerPlayInfo[i].ulMiscInfo2);
1875 if ((misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_SUPPORT) ||
1876 (misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_ACTIVE_HIGH)) {
1877 rdev->pm.power_state[state_index].clock_info[0].voltage.type =
1878 VOLTAGE_GPIO;
1879 rdev->pm.power_state[state_index].clock_info[0].voltage.gpio =
1880 radeon_lookup_gpio(rdev,
1881 power_info->info_3.asPowerPlayInfo[i].ucVoltageDropIndex);
1882 if (misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_ACTIVE_HIGH)
1883 rdev->pm.power_state[state_index].clock_info[0].voltage.active_high =
1884 true;
1885 else
1886 rdev->pm.power_state[state_index].clock_info[0].voltage.active_high =
1887 false;
1888 } else if (misc & ATOM_PM_MISCINFO_PROGRAM_VOLTAGE) {
1889 rdev->pm.power_state[state_index].clock_info[0].voltage.type =
1890 VOLTAGE_VDDC;
1891 rdev->pm.power_state[state_index].clock_info[0].voltage.vddc_id =
1892 power_info->info_3.asPowerPlayInfo[i].ucVoltageDropIndex;
1893 if (misc2 & ATOM_PM_MISCINFO2_VDDCI_DYNAMIC_VOLTAGE_EN) {
1894 rdev->pm.power_state[state_index].clock_info[0].voltage.vddci_enabled =
1895 true;
1896 rdev->pm.power_state[state_index].clock_info[0].voltage.vddci_id =
1897 power_info->info_3.asPowerPlayInfo[i].ucVDDCI_VoltageDropIndex;
1898 }
1899 }
1900 rdev->pm.power_state[state_index].flags = RADEON_PM_STATE_SINGLE_DISPLAY_ONLY;
1901 rdev->pm.power_state[state_index].misc = misc;
1902 rdev->pm.power_state[state_index].misc2 = misc2;
1903 /* order matters! */
1904 if (misc & ATOM_PM_MISCINFO_POWER_SAVING_MODE)
1905 rdev->pm.power_state[state_index].type =
1906 POWER_STATE_TYPE_POWERSAVE;
1907 if (misc & ATOM_PM_MISCINFO_DEFAULT_DC_STATE_ENTRY_TRUE)
1908 rdev->pm.power_state[state_index].type =
1909 POWER_STATE_TYPE_BATTERY;
1910 if (misc & ATOM_PM_MISCINFO_DEFAULT_LOW_DC_STATE_ENTRY_TRUE)
1911 rdev->pm.power_state[state_index].type =
1912 POWER_STATE_TYPE_BATTERY;
1913 if (misc & ATOM_PM_MISCINFO_LOAD_BALANCE_EN)
1914 rdev->pm.power_state[state_index].type =
1915 POWER_STATE_TYPE_BALANCED;
1916 if (misc & ATOM_PM_MISCINFO_3D_ACCELERATION_EN) {
1917 rdev->pm.power_state[state_index].type =
1918 POWER_STATE_TYPE_PERFORMANCE;
1919 rdev->pm.power_state[state_index].flags &=
1920 ~RADEON_PM_STATE_SINGLE_DISPLAY_ONLY;
1921 }
1922 if (misc2 & ATOM_PM_MISCINFO2_SYSTEM_AC_LITE_MODE)
1923 rdev->pm.power_state[state_index].type =
1924 POWER_STATE_TYPE_BALANCED;
1925 if (misc & ATOM_PM_MISCINFO_DRIVER_DEFAULT_MODE) {
1926 rdev->pm.power_state[state_index].type =
1927 POWER_STATE_TYPE_DEFAULT;
1928 rdev->pm.default_power_state_index = state_index;
1929 rdev->pm.power_state[state_index].default_clock_mode =
1930 &rdev->pm.power_state[state_index].clock_info[0];
1931 } else if (state_index == 0) {
1932 rdev->pm.power_state[state_index].clock_info[0].flags |=
1933 RADEON_PM_MODE_NO_DISPLAY;
1934 }
1935 state_index++;
1936 break;
1937 }
1938 } 2069 }
1939 /* last mode is usually default */ 2070 rdev->pm.power_state[state_index].flags = RADEON_PM_STATE_SINGLE_DISPLAY_ONLY;
1940 if (rdev->pm.default_power_state_index == -1) { 2071 radeon_atombios_parse_misc_flags_1_3(rdev, state_index, misc, misc2);
1941 rdev->pm.power_state[state_index - 1].type = 2072 state_index++;
1942 POWER_STATE_TYPE_DEFAULT; 2073 break;
1943 rdev->pm.default_power_state_index = state_index - 1; 2074 case 3:
1944 rdev->pm.power_state[state_index - 1].default_clock_mode = 2075 rdev->pm.power_state[state_index].num_clock_modes = 1;
1945 &rdev->pm.power_state[state_index - 1].clock_info[0]; 2076 rdev->pm.power_state[state_index].clock_info[0].mclk =
1946 rdev->pm.power_state[state_index].flags &= 2077 le32_to_cpu(power_info->info_3.asPowerPlayInfo[i].ulMemoryClock);
1947 ~RADEON_PM_STATE_SINGLE_DISPLAY_ONLY; 2078 rdev->pm.power_state[state_index].clock_info[0].sclk =
1948 rdev->pm.power_state[state_index].misc = 0; 2079 le32_to_cpu(power_info->info_3.asPowerPlayInfo[i].ulEngineClock);
1949 rdev->pm.power_state[state_index].misc2 = 0; 2080 /* skip invalid modes */
2081 if ((rdev->pm.power_state[state_index].clock_info[0].mclk == 0) ||
2082 (rdev->pm.power_state[state_index].clock_info[0].sclk == 0))
2083 continue;
2084 rdev->pm.power_state[state_index].pcie_lanes =
2085 power_info->info_3.asPowerPlayInfo[i].ucNumPciELanes;
2086 misc = le32_to_cpu(power_info->info_3.asPowerPlayInfo[i].ulMiscInfo);
2087 misc2 = le32_to_cpu(power_info->info_3.asPowerPlayInfo[i].ulMiscInfo2);
2088 if ((misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_SUPPORT) ||
2089 (misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_ACTIVE_HIGH)) {
2090 rdev->pm.power_state[state_index].clock_info[0].voltage.type =
2091 VOLTAGE_GPIO;
2092 rdev->pm.power_state[state_index].clock_info[0].voltage.gpio =
2093 radeon_lookup_gpio(rdev,
2094 power_info->info_3.asPowerPlayInfo[i].ucVoltageDropIndex);
2095 if (misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_ACTIVE_HIGH)
2096 rdev->pm.power_state[state_index].clock_info[0].voltage.active_high =
2097 true;
2098 else
2099 rdev->pm.power_state[state_index].clock_info[0].voltage.active_high =
2100 false;
2101 } else if (misc & ATOM_PM_MISCINFO_PROGRAM_VOLTAGE) {
2102 rdev->pm.power_state[state_index].clock_info[0].voltage.type =
2103 VOLTAGE_VDDC;
2104 rdev->pm.power_state[state_index].clock_info[0].voltage.vddc_id =
2105 power_info->info_3.asPowerPlayInfo[i].ucVoltageDropIndex;
2106 if (misc2 & ATOM_PM_MISCINFO2_VDDCI_DYNAMIC_VOLTAGE_EN) {
2107 rdev->pm.power_state[state_index].clock_info[0].voltage.vddci_enabled =
2108 true;
2109 rdev->pm.power_state[state_index].clock_info[0].voltage.vddci_id =
2110 power_info->info_3.asPowerPlayInfo[i].ucVDDCI_VoltageDropIndex;
2111 }
1950 } 2112 }
2113 rdev->pm.power_state[state_index].flags = RADEON_PM_STATE_SINGLE_DISPLAY_ONLY;
2114 radeon_atombios_parse_misc_flags_1_3(rdev, state_index, misc, misc2);
2115 state_index++;
2116 break;
2117 }
2118 }
2119 /* last mode is usually default */
2120 if (rdev->pm.default_power_state_index == -1) {
2121 rdev->pm.power_state[state_index - 1].type =
2122 POWER_STATE_TYPE_DEFAULT;
2123 rdev->pm.default_power_state_index = state_index - 1;
2124 rdev->pm.power_state[state_index - 1].default_clock_mode =
2125 &rdev->pm.power_state[state_index - 1].clock_info[0];
2126 rdev->pm.power_state[state_index].flags &=
2127 ~RADEON_PM_STATE_SINGLE_DISPLAY_ONLY;
2128 rdev->pm.power_state[state_index].misc = 0;
2129 rdev->pm.power_state[state_index].misc2 = 0;
2130 }
2131 return state_index;
2132}
2133
2134static void radeon_atombios_add_pplib_thermal_controller(struct radeon_device *rdev,
2135 ATOM_PPLIB_THERMALCONTROLLER *controller)
2136{
2137 struct radeon_i2c_bus_rec i2c_bus;
2138
2139 /* add the i2c bus for thermal/fan chip */
2140 if (controller->ucType > 0) {
2141 if (controller->ucType == ATOM_PP_THERMALCONTROLLER_RV6xx) {
2142 DRM_INFO("Internal thermal controller %s fan control\n",
2143 (controller->ucFanParameters &
2144 ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
2145 rdev->pm.int_thermal_type = THERMAL_TYPE_RV6XX;
2146 } else if (controller->ucType == ATOM_PP_THERMALCONTROLLER_RV770) {
2147 DRM_INFO("Internal thermal controller %s fan control\n",
2148 (controller->ucFanParameters &
2149 ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
2150 rdev->pm.int_thermal_type = THERMAL_TYPE_RV770;
2151 } else if (controller->ucType == ATOM_PP_THERMALCONTROLLER_EVERGREEN) {
2152 DRM_INFO("Internal thermal controller %s fan control\n",
2153 (controller->ucFanParameters &
2154 ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
2155 rdev->pm.int_thermal_type = THERMAL_TYPE_EVERGREEN;
2156 } else if (controller->ucType == ATOM_PP_THERMALCONTROLLER_SUMO) {
2157 DRM_INFO("Internal thermal controller %s fan control\n",
2158 (controller->ucFanParameters &
2159 ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
2160 rdev->pm.int_thermal_type = THERMAL_TYPE_SUMO;
2161 } else if (controller->ucType == ATOM_PP_THERMALCONTROLLER_NISLANDS) {
2162 DRM_INFO("Internal thermal controller %s fan control\n",
2163 (controller->ucFanParameters &
2164 ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
2165 rdev->pm.int_thermal_type = THERMAL_TYPE_NI;
2166 } else if ((controller->ucType ==
2167 ATOM_PP_THERMALCONTROLLER_EXTERNAL_GPIO) ||
2168 (controller->ucType ==
2169 ATOM_PP_THERMALCONTROLLER_ADT7473_WITH_INTERNAL) ||
2170 (controller->ucType ==
2171 ATOM_PP_THERMALCONTROLLER_EMC2103_WITH_INTERNAL)) {
2172 DRM_INFO("Special thermal controller config\n");
1951 } else { 2173 } else {
1952 int fw_index = GetIndexIntoMasterTable(DATA, FirmwareInfo); 2174 DRM_INFO("Possible %s thermal controller at 0x%02x %s fan control\n",
1953 uint8_t fw_frev, fw_crev; 2175 pp_lib_thermal_controller_names[controller->ucType],
1954 uint16_t fw_data_offset, vddc = 0; 2176 controller->ucI2cAddress >> 1,
1955 union firmware_info *firmware_info; 2177 (controller->ucFanParameters &
1956 ATOM_PPLIB_THERMALCONTROLLER *controller = &power_info->info_4.sThermalController; 2178 ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
1957 2179 i2c_bus = radeon_lookup_i2c_gpio(rdev, controller->ucI2cLine);
1958 if (atom_parse_data_header(mode_info->atom_context, fw_index, NULL, 2180 rdev->pm.i2c_bus = radeon_i2c_lookup(rdev, &i2c_bus);
1959 &fw_frev, &fw_crev, &fw_data_offset)) { 2181 if (rdev->pm.i2c_bus) {
1960 firmware_info = 2182 struct i2c_board_info info = { };
1961 (union firmware_info *)(mode_info->atom_context->bios + 2183 const char *name = pp_lib_thermal_controller_names[controller->ucType];
1962 fw_data_offset); 2184 info.addr = controller->ucI2cAddress >> 1;
1963 vddc = firmware_info->info_14.usBootUpVDDCVoltage; 2185 strlcpy(info.type, name, sizeof(info.type));
2186 i2c_new_device(&rdev->pm.i2c_bus->adapter, &info);
1964 } 2187 }
2188 }
2189 }
2190}
1965 2191
1966 /* add the i2c bus for thermal/fan chip */ 2192static void radeon_atombios_get_default_voltages(struct radeon_device *rdev,
1967 if (controller->ucType > 0) { 2193 u16 *vddc, u16 *vddci)
1968 if (controller->ucType == ATOM_PP_THERMALCONTROLLER_RV6xx) { 2194{
1969 DRM_INFO("Internal thermal controller %s fan control\n", 2195 struct radeon_mode_info *mode_info = &rdev->mode_info;
1970 (controller->ucFanParameters & 2196 int index = GetIndexIntoMasterTable(DATA, FirmwareInfo);
1971 ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with"); 2197 u8 frev, crev;
1972 rdev->pm.int_thermal_type = THERMAL_TYPE_RV6XX; 2198 u16 data_offset;
1973 } else if (controller->ucType == ATOM_PP_THERMALCONTROLLER_RV770) { 2199 union firmware_info *firmware_info;
1974 DRM_INFO("Internal thermal controller %s fan control\n",
1975 (controller->ucFanParameters &
1976 ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
1977 rdev->pm.int_thermal_type = THERMAL_TYPE_RV770;
1978 } else if (controller->ucType == ATOM_PP_THERMALCONTROLLER_EVERGREEN) {
1979 DRM_INFO("Internal thermal controller %s fan control\n",
1980 (controller->ucFanParameters &
1981 ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
1982 rdev->pm.int_thermal_type = THERMAL_TYPE_EVERGREEN;
1983 } else if ((controller->ucType ==
1984 ATOM_PP_THERMALCONTROLLER_EXTERNAL_GPIO) ||
1985 (controller->ucType ==
1986 ATOM_PP_THERMALCONTROLLER_ADT7473_WITH_INTERNAL)) {
1987 DRM_INFO("Special thermal controller config\n");
1988 } else {
1989 DRM_INFO("Possible %s thermal controller at 0x%02x %s fan control\n",
1990 pp_lib_thermal_controller_names[controller->ucType],
1991 controller->ucI2cAddress >> 1,
1992 (controller->ucFanParameters &
1993 ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
1994 i2c_bus = radeon_lookup_i2c_gpio(rdev, controller->ucI2cLine);
1995 rdev->pm.i2c_bus = radeon_i2c_lookup(rdev, &i2c_bus);
1996 if (rdev->pm.i2c_bus) {
1997 struct i2c_board_info info = { };
1998 const char *name = pp_lib_thermal_controller_names[controller->ucType];
1999 info.addr = controller->ucI2cAddress >> 1;
2000 strlcpy(info.type, name, sizeof(info.type));
2001 i2c_new_device(&rdev->pm.i2c_bus->adapter, &info);
2002 }
2003 2200
2004 } 2201 *vddc = 0;
2005 } 2202 *vddci = 0;
2006 /* first mode is usually default, followed by low to high */ 2203
2007 for (i = 0; i < power_info->info_4.ucNumStates; i++) { 2204 if (atom_parse_data_header(mode_info->atom_context, index, NULL,
2008 mode_index = 0; 2205 &frev, &crev, &data_offset)) {
2009 power_state = (struct _ATOM_PPLIB_STATE *) 2206 firmware_info =
2010 (mode_info->atom_context->bios + 2207 (union firmware_info *)(mode_info->atom_context->bios +
2011 data_offset + 2208 data_offset);
2012 le16_to_cpu(power_info->info_4.usStateArrayOffset) + 2209 *vddc = le16_to_cpu(firmware_info->info_14.usBootUpVDDCVoltage);
2013 i * power_info->info_4.ucStateEntrySize); 2210 if ((frev == 2) && (crev >= 2))
2014 non_clock_info = (struct _ATOM_PPLIB_NONCLOCK_INFO *) 2211 *vddci = le16_to_cpu(firmware_info->info_22.usBootUpVDDCIVoltage);
2015 (mode_info->atom_context->bios + 2212 }
2016 data_offset + 2213}
2017 le16_to_cpu(power_info->info_4.usNonClockInfoArrayOffset) + 2214
2018 (power_state->ucNonClockStateIndex * 2215static void radeon_atombios_parse_pplib_non_clock_info(struct radeon_device *rdev,
2019 power_info->info_4.ucNonClockSize)); 2216 int state_index, int mode_index,
2020 for (j = 0; j < (power_info->info_4.ucStateEntrySize - 1); j++) { 2217 struct _ATOM_PPLIB_NONCLOCK_INFO *non_clock_info)
2021 if (rdev->flags & RADEON_IS_IGP) { 2218{
2022 struct _ATOM_PPLIB_RS780_CLOCK_INFO *clock_info = 2219 int j;
2023 (struct _ATOM_PPLIB_RS780_CLOCK_INFO *) 2220 u32 misc = le32_to_cpu(non_clock_info->ulCapsAndSettings);
2024 (mode_info->atom_context->bios + 2221 u32 misc2 = le16_to_cpu(non_clock_info->usClassification);
2025 data_offset + 2222 u16 vddc, vddci;
2026 le16_to_cpu(power_info->info_4.usClockInfoArrayOffset) + 2223
2027 (power_state->ucClockStateIndices[j] * 2224 radeon_atombios_get_default_voltages(rdev, &vddc, &vddci);
2028 power_info->info_4.ucClockInfoSize)); 2225
2029 sclk = le16_to_cpu(clock_info->usLowEngineClockLow); 2226 rdev->pm.power_state[state_index].misc = misc;
2030 sclk |= clock_info->ucLowEngineClockHigh << 16; 2227 rdev->pm.power_state[state_index].misc2 = misc2;
2031 rdev->pm.power_state[state_index].clock_info[mode_index].sclk = sclk; 2228 rdev->pm.power_state[state_index].pcie_lanes =
2032 /* skip invalid modes */ 2229 ((misc & ATOM_PPLIB_PCIE_LINK_WIDTH_MASK) >>
2033 if (rdev->pm.power_state[state_index].clock_info[mode_index].sclk == 0) 2230 ATOM_PPLIB_PCIE_LINK_WIDTH_SHIFT) + 1;
2034 continue; 2231 switch (misc2 & ATOM_PPLIB_CLASSIFICATION_UI_MASK) {
2035 /* voltage works differently on IGPs */ 2232 case ATOM_PPLIB_CLASSIFICATION_UI_BATTERY:
2036 mode_index++; 2233 rdev->pm.power_state[state_index].type =
2037 } else if (ASIC_IS_DCE4(rdev)) { 2234 POWER_STATE_TYPE_BATTERY;
2038 struct _ATOM_PPLIB_EVERGREEN_CLOCK_INFO *clock_info = 2235 break;
2039 (struct _ATOM_PPLIB_EVERGREEN_CLOCK_INFO *) 2236 case ATOM_PPLIB_CLASSIFICATION_UI_BALANCED:
2040 (mode_info->atom_context->bios + 2237 rdev->pm.power_state[state_index].type =
2041 data_offset + 2238 POWER_STATE_TYPE_BALANCED;
2042 le16_to_cpu(power_info->info_4.usClockInfoArrayOffset) + 2239 break;
2043 (power_state->ucClockStateIndices[j] * 2240 case ATOM_PPLIB_CLASSIFICATION_UI_PERFORMANCE:
2044 power_info->info_4.ucClockInfoSize)); 2241 rdev->pm.power_state[state_index].type =
2045 sclk = le16_to_cpu(clock_info->usEngineClockLow); 2242 POWER_STATE_TYPE_PERFORMANCE;
2046 sclk |= clock_info->ucEngineClockHigh << 16; 2243 break;
2047 mclk = le16_to_cpu(clock_info->usMemoryClockLow); 2244 case ATOM_PPLIB_CLASSIFICATION_UI_NONE:
2048 mclk |= clock_info->ucMemoryClockHigh << 16; 2245 if (misc2 & ATOM_PPLIB_CLASSIFICATION_3DPERFORMANCE)
2049 rdev->pm.power_state[state_index].clock_info[mode_index].mclk = mclk; 2246 rdev->pm.power_state[state_index].type =
2050 rdev->pm.power_state[state_index].clock_info[mode_index].sclk = sclk; 2247 POWER_STATE_TYPE_PERFORMANCE;
2051 /* skip invalid modes */ 2248 break;
2052 if ((rdev->pm.power_state[state_index].clock_info[mode_index].mclk == 0) || 2249 }
2053 (rdev->pm.power_state[state_index].clock_info[mode_index].sclk == 0)) 2250 rdev->pm.power_state[state_index].flags = 0;
2054 continue; 2251 if (misc & ATOM_PPLIB_SINGLE_DISPLAY_ONLY)
2055 rdev->pm.power_state[state_index].clock_info[mode_index].voltage.type = 2252 rdev->pm.power_state[state_index].flags |=
2056 VOLTAGE_SW; 2253 RADEON_PM_STATE_SINGLE_DISPLAY_ONLY;
2057 rdev->pm.power_state[state_index].clock_info[mode_index].voltage.voltage = 2254 if (misc2 & ATOM_PPLIB_CLASSIFICATION_BOOT) {
2058 clock_info->usVDDC; 2255 rdev->pm.power_state[state_index].type =
2059 /* XXX usVDDCI */ 2256 POWER_STATE_TYPE_DEFAULT;
2060 mode_index++; 2257 rdev->pm.default_power_state_index = state_index;
2061 } else { 2258 rdev->pm.power_state[state_index].default_clock_mode =
2062 struct _ATOM_PPLIB_R600_CLOCK_INFO *clock_info = 2259 &rdev->pm.power_state[state_index].clock_info[mode_index - 1];
2063 (struct _ATOM_PPLIB_R600_CLOCK_INFO *) 2260 if (ASIC_IS_DCE5(rdev)) {
2064 (mode_info->atom_context->bios + 2261 /* NI chips post without MC ucode, so default clocks are strobe mode only */
2065 data_offset + 2262 rdev->pm.default_sclk = rdev->pm.power_state[state_index].clock_info[0].sclk;
2066 le16_to_cpu(power_info->info_4.usClockInfoArrayOffset) + 2263 rdev->pm.default_mclk = rdev->pm.power_state[state_index].clock_info[0].mclk;
2067 (power_state->ucClockStateIndices[j] * 2264 rdev->pm.default_vddc = rdev->pm.power_state[state_index].clock_info[0].voltage.voltage;
2068 power_info->info_4.ucClockInfoSize)); 2265 rdev->pm.default_vddci = rdev->pm.power_state[state_index].clock_info[0].voltage.vddci;
2069 sclk = le16_to_cpu(clock_info->usEngineClockLow); 2266 } else {
2070 sclk |= clock_info->ucEngineClockHigh << 16; 2267 /* patch the table values with the default slck/mclk from firmware info */
2071 mclk = le16_to_cpu(clock_info->usMemoryClockLow); 2268 for (j = 0; j < mode_index; j++) {
2072 mclk |= clock_info->ucMemoryClockHigh << 16; 2269 rdev->pm.power_state[state_index].clock_info[j].mclk =
2073 rdev->pm.power_state[state_index].clock_info[mode_index].mclk = mclk; 2270 rdev->clock.default_mclk;
2074 rdev->pm.power_state[state_index].clock_info[mode_index].sclk = sclk; 2271 rdev->pm.power_state[state_index].clock_info[j].sclk =
2075 /* skip invalid modes */ 2272 rdev->clock.default_sclk;
2076 if ((rdev->pm.power_state[state_index].clock_info[mode_index].mclk == 0) || 2273 if (vddc)
2077 (rdev->pm.power_state[state_index].clock_info[mode_index].sclk == 0)) 2274 rdev->pm.power_state[state_index].clock_info[j].voltage.voltage =
2078 continue; 2275 vddc;
2079 rdev->pm.power_state[state_index].clock_info[mode_index].voltage.type =
2080 VOLTAGE_SW;
2081 rdev->pm.power_state[state_index].clock_info[mode_index].voltage.voltage =
2082 clock_info->usVDDC;
2083 mode_index++;
2084 }
2085 }
2086 rdev->pm.power_state[state_index].num_clock_modes = mode_index;
2087 if (mode_index) {
2088 misc = le32_to_cpu(non_clock_info->ulCapsAndSettings);
2089 misc2 = le16_to_cpu(non_clock_info->usClassification);
2090 rdev->pm.power_state[state_index].misc = misc;
2091 rdev->pm.power_state[state_index].misc2 = misc2;
2092 rdev->pm.power_state[state_index].pcie_lanes =
2093 ((misc & ATOM_PPLIB_PCIE_LINK_WIDTH_MASK) >>
2094 ATOM_PPLIB_PCIE_LINK_WIDTH_SHIFT) + 1;
2095 switch (misc2 & ATOM_PPLIB_CLASSIFICATION_UI_MASK) {
2096 case ATOM_PPLIB_CLASSIFICATION_UI_BATTERY:
2097 rdev->pm.power_state[state_index].type =
2098 POWER_STATE_TYPE_BATTERY;
2099 break;
2100 case ATOM_PPLIB_CLASSIFICATION_UI_BALANCED:
2101 rdev->pm.power_state[state_index].type =
2102 POWER_STATE_TYPE_BALANCED;
2103 break;
2104 case ATOM_PPLIB_CLASSIFICATION_UI_PERFORMANCE:
2105 rdev->pm.power_state[state_index].type =
2106 POWER_STATE_TYPE_PERFORMANCE;
2107 break;
2108 case ATOM_PPLIB_CLASSIFICATION_UI_NONE:
2109 if (misc2 & ATOM_PPLIB_CLASSIFICATION_3DPERFORMANCE)
2110 rdev->pm.power_state[state_index].type =
2111 POWER_STATE_TYPE_PERFORMANCE;
2112 break;
2113 }
2114 rdev->pm.power_state[state_index].flags = 0;
2115 if (misc & ATOM_PPLIB_SINGLE_DISPLAY_ONLY)
2116 rdev->pm.power_state[state_index].flags |=
2117 RADEON_PM_STATE_SINGLE_DISPLAY_ONLY;
2118 if (misc2 & ATOM_PPLIB_CLASSIFICATION_BOOT) {
2119 rdev->pm.power_state[state_index].type =
2120 POWER_STATE_TYPE_DEFAULT;
2121 rdev->pm.default_power_state_index = state_index;
2122 rdev->pm.power_state[state_index].default_clock_mode =
2123 &rdev->pm.power_state[state_index].clock_info[mode_index - 1];
2124 /* patch the table values with the default slck/mclk from firmware info */
2125 for (j = 0; j < mode_index; j++) {
2126 rdev->pm.power_state[state_index].clock_info[j].mclk =
2127 rdev->clock.default_mclk;
2128 rdev->pm.power_state[state_index].clock_info[j].sclk =
2129 rdev->clock.default_sclk;
2130 if (vddc)
2131 rdev->pm.power_state[state_index].clock_info[j].voltage.voltage =
2132 vddc;
2133 }
2134 }
2135 state_index++;
2136 }
2137 }
2138 /* if multiple clock modes, mark the lowest as no display */
2139 for (i = 0; i < state_index; i++) {
2140 if (rdev->pm.power_state[i].num_clock_modes > 1)
2141 rdev->pm.power_state[i].clock_info[0].flags |=
2142 RADEON_PM_MODE_NO_DISPLAY;
2143 }
2144 /* first mode is usually default */
2145 if (rdev->pm.default_power_state_index == -1) {
2146 rdev->pm.power_state[0].type =
2147 POWER_STATE_TYPE_DEFAULT;
2148 rdev->pm.default_power_state_index = 0;
2149 rdev->pm.power_state[0].default_clock_mode =
2150 &rdev->pm.power_state[0].clock_info[0];
2151 } 2276 }
2152 } 2277 }
2278 }
2279}
2280
2281static bool radeon_atombios_parse_pplib_clock_info(struct radeon_device *rdev,
2282 int state_index, int mode_index,
2283 union pplib_clock_info *clock_info)
2284{
2285 u32 sclk, mclk;
2286
2287 if (rdev->flags & RADEON_IS_IGP) {
2288 if (rdev->family >= CHIP_PALM) {
2289 sclk = le16_to_cpu(clock_info->sumo.usEngineClockLow);
2290 sclk |= clock_info->sumo.ucEngineClockHigh << 16;
2291 rdev->pm.power_state[state_index].clock_info[mode_index].sclk = sclk;
2292 } else {
2293 sclk = le16_to_cpu(clock_info->rs780.usLowEngineClockLow);
2294 sclk |= clock_info->rs780.ucLowEngineClockHigh << 16;
2295 rdev->pm.power_state[state_index].clock_info[mode_index].sclk = sclk;
2296 }
2297 } else if (ASIC_IS_DCE4(rdev)) {
2298 sclk = le16_to_cpu(clock_info->evergreen.usEngineClockLow);
2299 sclk |= clock_info->evergreen.ucEngineClockHigh << 16;
2300 mclk = le16_to_cpu(clock_info->evergreen.usMemoryClockLow);
2301 mclk |= clock_info->evergreen.ucMemoryClockHigh << 16;
2302 rdev->pm.power_state[state_index].clock_info[mode_index].mclk = mclk;
2303 rdev->pm.power_state[state_index].clock_info[mode_index].sclk = sclk;
2304 rdev->pm.power_state[state_index].clock_info[mode_index].voltage.type =
2305 VOLTAGE_SW;
2306 rdev->pm.power_state[state_index].clock_info[mode_index].voltage.voltage =
2307 le16_to_cpu(clock_info->evergreen.usVDDC);
2308 rdev->pm.power_state[state_index].clock_info[mode_index].voltage.vddci =
2309 le16_to_cpu(clock_info->evergreen.usVDDCI);
2153 } else { 2310 } else {
2154 /* add the default mode */ 2311 sclk = le16_to_cpu(clock_info->r600.usEngineClockLow);
2155 rdev->pm.power_state[state_index].type = 2312 sclk |= clock_info->r600.ucEngineClockHigh << 16;
2313 mclk = le16_to_cpu(clock_info->r600.usMemoryClockLow);
2314 mclk |= clock_info->r600.ucMemoryClockHigh << 16;
2315 rdev->pm.power_state[state_index].clock_info[mode_index].mclk = mclk;
2316 rdev->pm.power_state[state_index].clock_info[mode_index].sclk = sclk;
2317 rdev->pm.power_state[state_index].clock_info[mode_index].voltage.type =
2318 VOLTAGE_SW;
2319 rdev->pm.power_state[state_index].clock_info[mode_index].voltage.voltage =
2320 le16_to_cpu(clock_info->r600.usVDDC);
2321 }
2322
2323 /* patch up vddc if necessary */
2324 if (rdev->pm.power_state[state_index].clock_info[mode_index].voltage.voltage == 0xff01) {
2325 u16 vddc;
2326
2327 if (radeon_atom_get_max_vddc(rdev, &vddc) == 0)
2328 rdev->pm.power_state[state_index].clock_info[mode_index].voltage.voltage = vddc;
2329 }
2330
2331 if (rdev->flags & RADEON_IS_IGP) {
2332 /* skip invalid modes */
2333 if (rdev->pm.power_state[state_index].clock_info[mode_index].sclk == 0)
2334 return false;
2335 } else {
2336 /* skip invalid modes */
2337 if ((rdev->pm.power_state[state_index].clock_info[mode_index].mclk == 0) ||
2338 (rdev->pm.power_state[state_index].clock_info[mode_index].sclk == 0))
2339 return false;
2340 }
2341 return true;
2342}
2343
2344static int radeon_atombios_parse_power_table_4_5(struct radeon_device *rdev)
2345{
2346 struct radeon_mode_info *mode_info = &rdev->mode_info;
2347 struct _ATOM_PPLIB_NONCLOCK_INFO *non_clock_info;
2348 union pplib_power_state *power_state;
2349 int i, j;
2350 int state_index = 0, mode_index = 0;
2351 union pplib_clock_info *clock_info;
2352 bool valid;
2353 union power_info *power_info;
2354 int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo);
2355 u16 data_offset;
2356 u8 frev, crev;
2357
2358 if (!atom_parse_data_header(mode_info->atom_context, index, NULL,
2359 &frev, &crev, &data_offset))
2360 return state_index;
2361 power_info = (union power_info *)(mode_info->atom_context->bios + data_offset);
2362
2363 radeon_atombios_add_pplib_thermal_controller(rdev, &power_info->pplib.sThermalController);
2364 rdev->pm.power_state = kzalloc(sizeof(struct radeon_power_state) *
2365 power_info->pplib.ucNumStates, GFP_KERNEL);
2366 if (!rdev->pm.power_state)
2367 return state_index;
2368 /* first mode is usually default, followed by low to high */
2369 for (i = 0; i < power_info->pplib.ucNumStates; i++) {
2370 mode_index = 0;
2371 power_state = (union pplib_power_state *)
2372 (mode_info->atom_context->bios + data_offset +
2373 le16_to_cpu(power_info->pplib.usStateArrayOffset) +
2374 i * power_info->pplib.ucStateEntrySize);
2375 non_clock_info = (struct _ATOM_PPLIB_NONCLOCK_INFO *)
2376 (mode_info->atom_context->bios + data_offset +
2377 le16_to_cpu(power_info->pplib.usNonClockInfoArrayOffset) +
2378 (power_state->v1.ucNonClockStateIndex *
2379 power_info->pplib.ucNonClockSize));
2380 for (j = 0; j < (power_info->pplib.ucStateEntrySize - 1); j++) {
2381 clock_info = (union pplib_clock_info *)
2382 (mode_info->atom_context->bios + data_offset +
2383 le16_to_cpu(power_info->pplib.usClockInfoArrayOffset) +
2384 (power_state->v1.ucClockStateIndices[j] *
2385 power_info->pplib.ucClockInfoSize));
2386 valid = radeon_atombios_parse_pplib_clock_info(rdev,
2387 state_index, mode_index,
2388 clock_info);
2389 if (valid)
2390 mode_index++;
2391 }
2392 rdev->pm.power_state[state_index].num_clock_modes = mode_index;
2393 if (mode_index) {
2394 radeon_atombios_parse_pplib_non_clock_info(rdev, state_index, mode_index,
2395 non_clock_info);
2396 state_index++;
2397 }
2398 }
2399 /* if multiple clock modes, mark the lowest as no display */
2400 for (i = 0; i < state_index; i++) {
2401 if (rdev->pm.power_state[i].num_clock_modes > 1)
2402 rdev->pm.power_state[i].clock_info[0].flags |=
2403 RADEON_PM_MODE_NO_DISPLAY;
2404 }
2405 /* first mode is usually default */
2406 if (rdev->pm.default_power_state_index == -1) {
2407 rdev->pm.power_state[0].type =
2156 POWER_STATE_TYPE_DEFAULT; 2408 POWER_STATE_TYPE_DEFAULT;
2157 rdev->pm.power_state[state_index].num_clock_modes = 1; 2409 rdev->pm.default_power_state_index = 0;
2158 rdev->pm.power_state[state_index].clock_info[0].mclk = rdev->clock.default_mclk; 2410 rdev->pm.power_state[0].default_clock_mode =
2159 rdev->pm.power_state[state_index].clock_info[0].sclk = rdev->clock.default_sclk; 2411 &rdev->pm.power_state[0].clock_info[0];
2160 rdev->pm.power_state[state_index].default_clock_mode = 2412 }
2161 &rdev->pm.power_state[state_index].clock_info[0]; 2413 return state_index;
2162 rdev->pm.power_state[state_index].clock_info[0].voltage.type = VOLTAGE_NONE; 2414}
2163 rdev->pm.power_state[state_index].pcie_lanes = 16; 2415
2164 rdev->pm.default_power_state_index = state_index; 2416static int radeon_atombios_parse_power_table_6(struct radeon_device *rdev)
2165 rdev->pm.power_state[state_index].flags = 0; 2417{
2166 state_index++; 2418 struct radeon_mode_info *mode_info = &rdev->mode_info;
2419 struct _ATOM_PPLIB_NONCLOCK_INFO *non_clock_info;
2420 union pplib_power_state *power_state;
2421 int i, j, non_clock_array_index, clock_array_index;
2422 int state_index = 0, mode_index = 0;
2423 union pplib_clock_info *clock_info;
2424 struct StateArray *state_array;
2425 struct ClockInfoArray *clock_info_array;
2426 struct NonClockInfoArray *non_clock_info_array;
2427 bool valid;
2428 union power_info *power_info;
2429 int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo);
2430 u16 data_offset;
2431 u8 frev, crev;
2432
2433 if (!atom_parse_data_header(mode_info->atom_context, index, NULL,
2434 &frev, &crev, &data_offset))
2435 return state_index;
2436 power_info = (union power_info *)(mode_info->atom_context->bios + data_offset);
2437
2438 radeon_atombios_add_pplib_thermal_controller(rdev, &power_info->pplib.sThermalController);
2439 state_array = (struct StateArray *)
2440 (mode_info->atom_context->bios + data_offset +
2441 le16_to_cpu(power_info->pplib.usStateArrayOffset));
2442 clock_info_array = (struct ClockInfoArray *)
2443 (mode_info->atom_context->bios + data_offset +
2444 le16_to_cpu(power_info->pplib.usClockInfoArrayOffset));
2445 non_clock_info_array = (struct NonClockInfoArray *)
2446 (mode_info->atom_context->bios + data_offset +
2447 le16_to_cpu(power_info->pplib.usNonClockInfoArrayOffset));
2448 rdev->pm.power_state = kzalloc(sizeof(struct radeon_power_state) *
2449 state_array->ucNumEntries, GFP_KERNEL);
2450 if (!rdev->pm.power_state)
2451 return state_index;
2452 for (i = 0; i < state_array->ucNumEntries; i++) {
2453 mode_index = 0;
2454 power_state = (union pplib_power_state *)&state_array->states[i];
2455 /* XXX this might be an inagua bug... */
2456 non_clock_array_index = i; /* power_state->v2.nonClockInfoIndex */
2457 non_clock_info = (struct _ATOM_PPLIB_NONCLOCK_INFO *)
2458 &non_clock_info_array->nonClockInfo[non_clock_array_index];
2459 for (j = 0; j < power_state->v2.ucNumDPMLevels; j++) {
2460 clock_array_index = power_state->v2.clockInfoIndex[j];
2461 /* XXX this might be an inagua bug... */
2462 if (clock_array_index >= clock_info_array->ucNumEntries)
2463 continue;
2464 clock_info = (union pplib_clock_info *)
2465 &clock_info_array->clockInfo[clock_array_index];
2466 valid = radeon_atombios_parse_pplib_clock_info(rdev,
2467 state_index, mode_index,
2468 clock_info);
2469 if (valid)
2470 mode_index++;
2471 }
2472 rdev->pm.power_state[state_index].num_clock_modes = mode_index;
2473 if (mode_index) {
2474 radeon_atombios_parse_pplib_non_clock_info(rdev, state_index, mode_index,
2475 non_clock_info);
2476 state_index++;
2477 }
2478 }
2479 /* if multiple clock modes, mark the lowest as no display */
2480 for (i = 0; i < state_index; i++) {
2481 if (rdev->pm.power_state[i].num_clock_modes > 1)
2482 rdev->pm.power_state[i].clock_info[0].flags |=
2483 RADEON_PM_MODE_NO_DISPLAY;
2484 }
2485 /* first mode is usually default */
2486 if (rdev->pm.default_power_state_index == -1) {
2487 rdev->pm.power_state[0].type =
2488 POWER_STATE_TYPE_DEFAULT;
2489 rdev->pm.default_power_state_index = 0;
2490 rdev->pm.power_state[0].default_clock_mode =
2491 &rdev->pm.power_state[0].clock_info[0];
2492 }
2493 return state_index;
2494}
2495
2496void radeon_atombios_get_power_modes(struct radeon_device *rdev)
2497{
2498 struct radeon_mode_info *mode_info = &rdev->mode_info;
2499 int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo);
2500 u16 data_offset;
2501 u8 frev, crev;
2502 int state_index = 0;
2503
2504 rdev->pm.default_power_state_index = -1;
2505
2506 if (atom_parse_data_header(mode_info->atom_context, index, NULL,
2507 &frev, &crev, &data_offset)) {
2508 switch (frev) {
2509 case 1:
2510 case 2:
2511 case 3:
2512 state_index = radeon_atombios_parse_power_table_1_3(rdev);
2513 break;
2514 case 4:
2515 case 5:
2516 state_index = radeon_atombios_parse_power_table_4_5(rdev);
2517 break;
2518 case 6:
2519 state_index = radeon_atombios_parse_power_table_6(rdev);
2520 break;
2521 default:
2522 break;
2523 }
2524 } else {
2525 rdev->pm.power_state = kzalloc(sizeof(struct radeon_power_state), GFP_KERNEL);
2526 if (rdev->pm.power_state) {
2527 /* add the default mode */
2528 rdev->pm.power_state[state_index].type =
2529 POWER_STATE_TYPE_DEFAULT;
2530 rdev->pm.power_state[state_index].num_clock_modes = 1;
2531 rdev->pm.power_state[state_index].clock_info[0].mclk = rdev->clock.default_mclk;
2532 rdev->pm.power_state[state_index].clock_info[0].sclk = rdev->clock.default_sclk;
2533 rdev->pm.power_state[state_index].default_clock_mode =
2534 &rdev->pm.power_state[state_index].clock_info[0];
2535 rdev->pm.power_state[state_index].clock_info[0].voltage.type = VOLTAGE_NONE;
2536 rdev->pm.power_state[state_index].pcie_lanes = 16;
2537 rdev->pm.default_power_state_index = state_index;
2538 rdev->pm.power_state[state_index].flags = 0;
2539 state_index++;
2540 }
2167 } 2541 }
2168 2542
2169 rdev->pm.num_power_states = state_index; 2543 rdev->pm.num_power_states = state_index;
@@ -2189,7 +2563,7 @@ uint32_t radeon_atom_get_engine_clock(struct radeon_device *rdev)
2189 int index = GetIndexIntoMasterTable(COMMAND, GetEngineClock); 2563 int index = GetIndexIntoMasterTable(COMMAND, GetEngineClock);
2190 2564
2191 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 2565 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2192 return args.ulReturnEngineClock; 2566 return le32_to_cpu(args.ulReturnEngineClock);
2193} 2567}
2194 2568
2195uint32_t radeon_atom_get_memory_clock(struct radeon_device *rdev) 2569uint32_t radeon_atom_get_memory_clock(struct radeon_device *rdev)
@@ -2198,7 +2572,7 @@ uint32_t radeon_atom_get_memory_clock(struct radeon_device *rdev)
2198 int index = GetIndexIntoMasterTable(COMMAND, GetMemoryClock); 2572 int index = GetIndexIntoMasterTable(COMMAND, GetMemoryClock);
2199 2573
2200 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 2574 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2201 return args.ulReturnMemoryClock; 2575 return le32_to_cpu(args.ulReturnMemoryClock);
2202} 2576}
2203 2577
2204void radeon_atom_set_engine_clock(struct radeon_device *rdev, 2578void radeon_atom_set_engine_clock(struct radeon_device *rdev,
@@ -2207,7 +2581,7 @@ void radeon_atom_set_engine_clock(struct radeon_device *rdev,
2207 SET_ENGINE_CLOCK_PS_ALLOCATION args; 2581 SET_ENGINE_CLOCK_PS_ALLOCATION args;
2208 int index = GetIndexIntoMasterTable(COMMAND, SetEngineClock); 2582 int index = GetIndexIntoMasterTable(COMMAND, SetEngineClock);
2209 2583
2210 args.ulTargetEngineClock = eng_clock; /* 10 khz */ 2584 args.ulTargetEngineClock = cpu_to_le32(eng_clock); /* 10 khz */
2211 2585
2212 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 2586 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2213} 2587}
@@ -2221,7 +2595,7 @@ void radeon_atom_set_memory_clock(struct radeon_device *rdev,
2221 if (rdev->flags & RADEON_IS_IGP) 2595 if (rdev->flags & RADEON_IS_IGP)
2222 return; 2596 return;
2223 2597
2224 args.ulTargetMemoryClock = mem_clock; /* 10 khz */ 2598 args.ulTargetMemoryClock = cpu_to_le32(mem_clock); /* 10 khz */
2225 2599
2226 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 2600 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2227} 2601}
@@ -2232,25 +2606,29 @@ union set_voltage {
2232 struct _SET_VOLTAGE_PARAMETERS_V2 v2; 2606 struct _SET_VOLTAGE_PARAMETERS_V2 v2;
2233}; 2607};
2234 2608
2235void radeon_atom_set_voltage(struct radeon_device *rdev, u16 level) 2609void radeon_atom_set_voltage(struct radeon_device *rdev, u16 voltage_level, u8 voltage_type)
2236{ 2610{
2237 union set_voltage args; 2611 union set_voltage args;
2238 int index = GetIndexIntoMasterTable(COMMAND, SetVoltage); 2612 int index = GetIndexIntoMasterTable(COMMAND, SetVoltage);
2239 u8 frev, crev, volt_index = level; 2613 u8 frev, crev, volt_index = voltage_level;
2240 2614
2241 if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev)) 2615 if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev))
2242 return; 2616 return;
2243 2617
2618 /* 0xff01 is a flag rather then an actual voltage */
2619 if (voltage_level == 0xff01)
2620 return;
2621
2244 switch (crev) { 2622 switch (crev) {
2245 case 1: 2623 case 1:
2246 args.v1.ucVoltageType = SET_VOLTAGE_TYPE_ASIC_VDDC; 2624 args.v1.ucVoltageType = voltage_type;
2247 args.v1.ucVoltageMode = SET_ASIC_VOLTAGE_MODE_ALL_SOURCE; 2625 args.v1.ucVoltageMode = SET_ASIC_VOLTAGE_MODE_ALL_SOURCE;
2248 args.v1.ucVoltageIndex = volt_index; 2626 args.v1.ucVoltageIndex = volt_index;
2249 break; 2627 break;
2250 case 2: 2628 case 2:
2251 args.v2.ucVoltageType = SET_VOLTAGE_TYPE_ASIC_VDDC; 2629 args.v2.ucVoltageType = voltage_type;
2252 args.v2.ucVoltageMode = SET_ASIC_VOLTAGE_MODE_SET_VOLTAGE; 2630 args.v2.ucVoltageMode = SET_ASIC_VOLTAGE_MODE_SET_VOLTAGE;
2253 args.v2.usVoltageLevel = cpu_to_le16(level); 2631 args.v2.usVoltageLevel = cpu_to_le16(voltage_level);
2254 break; 2632 break;
2255 default: 2633 default:
2256 DRM_ERROR("Unknown table version %d, %d\n", frev, crev); 2634 DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
@@ -2260,7 +2638,35 @@ void radeon_atom_set_voltage(struct radeon_device *rdev, u16 level)
2260 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 2638 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2261} 2639}
2262 2640
2641int radeon_atom_get_max_vddc(struct radeon_device *rdev,
2642 u16 *voltage)
2643{
2644 union set_voltage args;
2645 int index = GetIndexIntoMasterTable(COMMAND, SetVoltage);
2646 u8 frev, crev;
2647
2648 if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev))
2649 return -EINVAL;
2650
2651 switch (crev) {
2652 case 1:
2653 return -EINVAL;
2654 case 2:
2655 args.v2.ucVoltageType = SET_VOLTAGE_GET_MAX_VOLTAGE;
2656 args.v2.ucVoltageMode = 0;
2657 args.v2.usVoltageLevel = 0;
2263 2658
2659 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2660
2661 *voltage = le16_to_cpu(args.v2.usVoltageLevel);
2662 break;
2663 default:
2664 DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
2665 return -EINVAL;
2666 }
2667
2668 return 0;
2669}
2264 2670
2265void radeon_atom_initialize_bios_scratch_regs(struct drm_device *dev) 2671void radeon_atom_initialize_bios_scratch_regs(struct drm_device *dev)
2266{ 2672{
@@ -2279,7 +2685,7 @@ void radeon_atom_initialize_bios_scratch_regs(struct drm_device *dev)
2279 bios_2_scratch &= ~ATOM_S2_VRI_BRIGHT_ENABLE; 2685 bios_2_scratch &= ~ATOM_S2_VRI_BRIGHT_ENABLE;
2280 2686
2281 /* tell the bios not to handle mode switching */ 2687 /* tell the bios not to handle mode switching */
2282 bios_6_scratch |= (ATOM_S6_ACC_BLOCK_DISPLAY_SWITCH | ATOM_S6_ACC_MODE); 2688 bios_6_scratch |= ATOM_S6_ACC_BLOCK_DISPLAY_SWITCH;
2283 2689
2284 if (rdev->family >= CHIP_R600) { 2690 if (rdev->family >= CHIP_R600) {
2285 WREG32(R600_BIOS_2_SCRATCH, bios_2_scratch); 2691 WREG32(R600_BIOS_2_SCRATCH, bios_2_scratch);
@@ -2330,10 +2736,13 @@ void radeon_atom_output_lock(struct drm_encoder *encoder, bool lock)
2330 else 2736 else
2331 bios_6_scratch = RREG32(RADEON_BIOS_6_SCRATCH); 2737 bios_6_scratch = RREG32(RADEON_BIOS_6_SCRATCH);
2332 2738
2333 if (lock) 2739 if (lock) {
2334 bios_6_scratch |= ATOM_S6_CRITICAL_STATE; 2740 bios_6_scratch |= ATOM_S6_CRITICAL_STATE;
2335 else 2741 bios_6_scratch &= ~ATOM_S6_ACC_MODE;
2742 } else {
2336 bios_6_scratch &= ~ATOM_S6_CRITICAL_STATE; 2743 bios_6_scratch &= ~ATOM_S6_CRITICAL_STATE;
2744 bios_6_scratch |= ATOM_S6_ACC_MODE;
2745 }
2337 2746
2338 if (rdev->family >= CHIP_R600) 2747 if (rdev->family >= CHIP_R600)
2339 WREG32(R600_BIOS_6_SCRATCH, bios_6_scratch); 2748 WREG32(R600_BIOS_6_SCRATCH, bios_6_scratch);
diff --git a/drivers/gpu/drm/radeon/radeon_atpx_handler.c b/drivers/gpu/drm/radeon/radeon_atpx_handler.c
index ed5dfe58f29c..9d95792bea3e 100644
--- a/drivers/gpu/drm/radeon/radeon_atpx_handler.c
+++ b/drivers/gpu/drm/radeon/radeon_atpx_handler.c
@@ -15,6 +15,9 @@
15#define ATPX_VERSION 0 15#define ATPX_VERSION 0
16#define ATPX_GPU_PWR 2 16#define ATPX_GPU_PWR 2
17#define ATPX_MUX_SELECT 3 17#define ATPX_MUX_SELECT 3
18#define ATPX_I2C_MUX_SELECT 4
19#define ATPX_SWITCH_START 5
20#define ATPX_SWITCH_END 6
18 21
19#define ATPX_INTEGRATED 0 22#define ATPX_INTEGRATED 0
20#define ATPX_DISCRETE 1 23#define ATPX_DISCRETE 1
@@ -149,13 +152,35 @@ static int radeon_atpx_switch_mux(acpi_handle handle, int mux_id)
149 return radeon_atpx_execute(handle, ATPX_MUX_SELECT, mux_id); 152 return radeon_atpx_execute(handle, ATPX_MUX_SELECT, mux_id);
150} 153}
151 154
155static int radeon_atpx_switch_i2c_mux(acpi_handle handle, int mux_id)
156{
157 return radeon_atpx_execute(handle, ATPX_I2C_MUX_SELECT, mux_id);
158}
159
160static int radeon_atpx_switch_start(acpi_handle handle, int gpu_id)
161{
162 return radeon_atpx_execute(handle, ATPX_SWITCH_START, gpu_id);
163}
164
165static int radeon_atpx_switch_end(acpi_handle handle, int gpu_id)
166{
167 return radeon_atpx_execute(handle, ATPX_SWITCH_END, gpu_id);
168}
152 169
153static int radeon_atpx_switchto(enum vga_switcheroo_client_id id) 170static int radeon_atpx_switchto(enum vga_switcheroo_client_id id)
154{ 171{
172 int gpu_id;
173
155 if (id == VGA_SWITCHEROO_IGD) 174 if (id == VGA_SWITCHEROO_IGD)
156 radeon_atpx_switch_mux(radeon_atpx_priv.atpx_handle, 0); 175 gpu_id = ATPX_INTEGRATED;
157 else 176 else
158 radeon_atpx_switch_mux(radeon_atpx_priv.atpx_handle, 1); 177 gpu_id = ATPX_DISCRETE;
178
179 radeon_atpx_switch_start(radeon_atpx_priv.atpx_handle, gpu_id);
180 radeon_atpx_switch_mux(radeon_atpx_priv.atpx_handle, gpu_id);
181 radeon_atpx_switch_i2c_mux(radeon_atpx_priv.atpx_handle, gpu_id);
182 radeon_atpx_switch_end(radeon_atpx_priv.atpx_handle, gpu_id);
183
159 return 0; 184 return 0;
160} 185}
161 186
diff --git a/drivers/gpu/drm/radeon/radeon_benchmark.c b/drivers/gpu/drm/radeon/radeon_benchmark.c
index 7932dc4d6b90..10191d9372d8 100644
--- a/drivers/gpu/drm/radeon/radeon_benchmark.c
+++ b/drivers/gpu/drm/radeon/radeon_benchmark.c
@@ -41,7 +41,7 @@ void radeon_benchmark_move(struct radeon_device *rdev, unsigned bsize,
41 41
42 size = bsize; 42 size = bsize;
43 n = 1024; 43 n = 1024;
44 r = radeon_bo_create(rdev, NULL, size, true, sdomain, &sobj); 44 r = radeon_bo_create(rdev, size, PAGE_SIZE, true, sdomain, &sobj);
45 if (r) { 45 if (r) {
46 goto out_cleanup; 46 goto out_cleanup;
47 } 47 }
@@ -53,7 +53,7 @@ void radeon_benchmark_move(struct radeon_device *rdev, unsigned bsize,
53 if (r) { 53 if (r) {
54 goto out_cleanup; 54 goto out_cleanup;
55 } 55 }
56 r = radeon_bo_create(rdev, NULL, size, true, ddomain, &dobj); 56 r = radeon_bo_create(rdev, size, PAGE_SIZE, true, ddomain, &dobj);
57 if (r) { 57 if (r) {
58 goto out_cleanup; 58 goto out_cleanup;
59 } 59 }
diff --git a/drivers/gpu/drm/radeon/radeon_bios.c b/drivers/gpu/drm/radeon/radeon_bios.c
index 654787ec43f4..229a20f10e2b 100644
--- a/drivers/gpu/drm/radeon/radeon_bios.c
+++ b/drivers/gpu/drm/radeon/radeon_bios.c
@@ -104,7 +104,7 @@ static bool radeon_read_bios(struct radeon_device *rdev)
104static bool radeon_atrm_get_bios(struct radeon_device *rdev) 104static bool radeon_atrm_get_bios(struct radeon_device *rdev)
105{ 105{
106 int ret; 106 int ret;
107 int size = 64 * 1024; 107 int size = 256 * 1024;
108 int i; 108 int i;
109 109
110 if (!radeon_atrm_supported(rdev->pdev)) 110 if (!radeon_atrm_supported(rdev->pdev))
@@ -130,6 +130,46 @@ static bool radeon_atrm_get_bios(struct radeon_device *rdev)
130 } 130 }
131 return true; 131 return true;
132} 132}
133
134static bool ni_read_disabled_bios(struct radeon_device *rdev)
135{
136 u32 bus_cntl;
137 u32 d1vga_control;
138 u32 d2vga_control;
139 u32 vga_render_control;
140 u32 rom_cntl;
141 bool r;
142
143 bus_cntl = RREG32(R600_BUS_CNTL);
144 d1vga_control = RREG32(AVIVO_D1VGA_CONTROL);
145 d2vga_control = RREG32(AVIVO_D2VGA_CONTROL);
146 vga_render_control = RREG32(AVIVO_VGA_RENDER_CONTROL);
147 rom_cntl = RREG32(R600_ROM_CNTL);
148
149 /* enable the rom */
150 WREG32(R600_BUS_CNTL, (bus_cntl & ~R600_BIOS_ROM_DIS));
151 /* Disable VGA mode */
152 WREG32(AVIVO_D1VGA_CONTROL,
153 (d1vga_control & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE |
154 AVIVO_DVGA_CONTROL_TIMING_SELECT)));
155 WREG32(AVIVO_D2VGA_CONTROL,
156 (d2vga_control & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE |
157 AVIVO_DVGA_CONTROL_TIMING_SELECT)));
158 WREG32(AVIVO_VGA_RENDER_CONTROL,
159 (vga_render_control & ~AVIVO_VGA_VSTATUS_CNTL_MASK));
160 WREG32(R600_ROM_CNTL, rom_cntl | R600_SCK_OVERWRITE);
161
162 r = radeon_read_bios(rdev);
163
164 /* restore regs */
165 WREG32(R600_BUS_CNTL, bus_cntl);
166 WREG32(AVIVO_D1VGA_CONTROL, d1vga_control);
167 WREG32(AVIVO_D2VGA_CONTROL, d2vga_control);
168 WREG32(AVIVO_VGA_RENDER_CONTROL, vga_render_control);
169 WREG32(R600_ROM_CNTL, rom_cntl);
170 return r;
171}
172
133static bool r700_read_disabled_bios(struct radeon_device *rdev) 173static bool r700_read_disabled_bios(struct radeon_device *rdev)
134{ 174{
135 uint32_t viph_control; 175 uint32_t viph_control;
@@ -143,7 +183,7 @@ static bool r700_read_disabled_bios(struct radeon_device *rdev)
143 bool r; 183 bool r;
144 184
145 viph_control = RREG32(RADEON_VIPH_CONTROL); 185 viph_control = RREG32(RADEON_VIPH_CONTROL);
146 bus_cntl = RREG32(RADEON_BUS_CNTL); 186 bus_cntl = RREG32(R600_BUS_CNTL);
147 d1vga_control = RREG32(AVIVO_D1VGA_CONTROL); 187 d1vga_control = RREG32(AVIVO_D1VGA_CONTROL);
148 d2vga_control = RREG32(AVIVO_D2VGA_CONTROL); 188 d2vga_control = RREG32(AVIVO_D2VGA_CONTROL);
149 vga_render_control = RREG32(AVIVO_VGA_RENDER_CONTROL); 189 vga_render_control = RREG32(AVIVO_VGA_RENDER_CONTROL);
@@ -152,7 +192,7 @@ static bool r700_read_disabled_bios(struct radeon_device *rdev)
152 /* disable VIP */ 192 /* disable VIP */
153 WREG32(RADEON_VIPH_CONTROL, (viph_control & ~RADEON_VIPH_EN)); 193 WREG32(RADEON_VIPH_CONTROL, (viph_control & ~RADEON_VIPH_EN));
154 /* enable the rom */ 194 /* enable the rom */
155 WREG32(RADEON_BUS_CNTL, (bus_cntl & ~RADEON_BUS_BIOS_DIS_ROM)); 195 WREG32(R600_BUS_CNTL, (bus_cntl & ~R600_BIOS_ROM_DIS));
156 /* Disable VGA mode */ 196 /* Disable VGA mode */
157 WREG32(AVIVO_D1VGA_CONTROL, 197 WREG32(AVIVO_D1VGA_CONTROL,
158 (d1vga_control & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE | 198 (d1vga_control & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE |
@@ -191,7 +231,7 @@ static bool r700_read_disabled_bios(struct radeon_device *rdev)
191 cg_spll_status = RREG32(R600_CG_SPLL_STATUS); 231 cg_spll_status = RREG32(R600_CG_SPLL_STATUS);
192 } 232 }
193 WREG32(RADEON_VIPH_CONTROL, viph_control); 233 WREG32(RADEON_VIPH_CONTROL, viph_control);
194 WREG32(RADEON_BUS_CNTL, bus_cntl); 234 WREG32(R600_BUS_CNTL, bus_cntl);
195 WREG32(AVIVO_D1VGA_CONTROL, d1vga_control); 235 WREG32(AVIVO_D1VGA_CONTROL, d1vga_control);
196 WREG32(AVIVO_D2VGA_CONTROL, d2vga_control); 236 WREG32(AVIVO_D2VGA_CONTROL, d2vga_control);
197 WREG32(AVIVO_VGA_RENDER_CONTROL, vga_render_control); 237 WREG32(AVIVO_VGA_RENDER_CONTROL, vga_render_control);
@@ -216,7 +256,7 @@ static bool r600_read_disabled_bios(struct radeon_device *rdev)
216 bool r; 256 bool r;
217 257
218 viph_control = RREG32(RADEON_VIPH_CONTROL); 258 viph_control = RREG32(RADEON_VIPH_CONTROL);
219 bus_cntl = RREG32(RADEON_BUS_CNTL); 259 bus_cntl = RREG32(R600_BUS_CNTL);
220 d1vga_control = RREG32(AVIVO_D1VGA_CONTROL); 260 d1vga_control = RREG32(AVIVO_D1VGA_CONTROL);
221 d2vga_control = RREG32(AVIVO_D2VGA_CONTROL); 261 d2vga_control = RREG32(AVIVO_D2VGA_CONTROL);
222 vga_render_control = RREG32(AVIVO_VGA_RENDER_CONTROL); 262 vga_render_control = RREG32(AVIVO_VGA_RENDER_CONTROL);
@@ -231,7 +271,7 @@ static bool r600_read_disabled_bios(struct radeon_device *rdev)
231 /* disable VIP */ 271 /* disable VIP */
232 WREG32(RADEON_VIPH_CONTROL, (viph_control & ~RADEON_VIPH_EN)); 272 WREG32(RADEON_VIPH_CONTROL, (viph_control & ~RADEON_VIPH_EN));
233 /* enable the rom */ 273 /* enable the rom */
234 WREG32(RADEON_BUS_CNTL, (bus_cntl & ~RADEON_BUS_BIOS_DIS_ROM)); 274 WREG32(R600_BUS_CNTL, (bus_cntl & ~R600_BIOS_ROM_DIS));
235 /* Disable VGA mode */ 275 /* Disable VGA mode */
236 WREG32(AVIVO_D1VGA_CONTROL, 276 WREG32(AVIVO_D1VGA_CONTROL,
237 (d1vga_control & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE | 277 (d1vga_control & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE |
@@ -262,7 +302,7 @@ static bool r600_read_disabled_bios(struct radeon_device *rdev)
262 302
263 /* restore regs */ 303 /* restore regs */
264 WREG32(RADEON_VIPH_CONTROL, viph_control); 304 WREG32(RADEON_VIPH_CONTROL, viph_control);
265 WREG32(RADEON_BUS_CNTL, bus_cntl); 305 WREG32(R600_BUS_CNTL, bus_cntl);
266 WREG32(AVIVO_D1VGA_CONTROL, d1vga_control); 306 WREG32(AVIVO_D1VGA_CONTROL, d1vga_control);
267 WREG32(AVIVO_D2VGA_CONTROL, d2vga_control); 307 WREG32(AVIVO_D2VGA_CONTROL, d2vga_control);
268 WREG32(AVIVO_VGA_RENDER_CONTROL, vga_render_control); 308 WREG32(AVIVO_VGA_RENDER_CONTROL, vga_render_control);
@@ -291,7 +331,7 @@ static bool avivo_read_disabled_bios(struct radeon_device *rdev)
291 331
292 seprom_cntl1 = RREG32(RADEON_SEPROM_CNTL1); 332 seprom_cntl1 = RREG32(RADEON_SEPROM_CNTL1);
293 viph_control = RREG32(RADEON_VIPH_CONTROL); 333 viph_control = RREG32(RADEON_VIPH_CONTROL);
294 bus_cntl = RREG32(RADEON_BUS_CNTL); 334 bus_cntl = RREG32(RV370_BUS_CNTL);
295 d1vga_control = RREG32(AVIVO_D1VGA_CONTROL); 335 d1vga_control = RREG32(AVIVO_D1VGA_CONTROL);
296 d2vga_control = RREG32(AVIVO_D2VGA_CONTROL); 336 d2vga_control = RREG32(AVIVO_D2VGA_CONTROL);
297 vga_render_control = RREG32(AVIVO_VGA_RENDER_CONTROL); 337 vga_render_control = RREG32(AVIVO_VGA_RENDER_CONTROL);
@@ -310,7 +350,7 @@ static bool avivo_read_disabled_bios(struct radeon_device *rdev)
310 WREG32(RADEON_VIPH_CONTROL, (viph_control & ~RADEON_VIPH_EN)); 350 WREG32(RADEON_VIPH_CONTROL, (viph_control & ~RADEON_VIPH_EN));
311 351
312 /* enable the rom */ 352 /* enable the rom */
313 WREG32(RADEON_BUS_CNTL, (bus_cntl & ~RADEON_BUS_BIOS_DIS_ROM)); 353 WREG32(RV370_BUS_CNTL, (bus_cntl & ~RV370_BUS_BIOS_DIS_ROM));
314 354
315 /* Disable VGA mode */ 355 /* Disable VGA mode */
316 WREG32(AVIVO_D1VGA_CONTROL, 356 WREG32(AVIVO_D1VGA_CONTROL,
@@ -327,7 +367,7 @@ static bool avivo_read_disabled_bios(struct radeon_device *rdev)
327 /* restore regs */ 367 /* restore regs */
328 WREG32(RADEON_SEPROM_CNTL1, seprom_cntl1); 368 WREG32(RADEON_SEPROM_CNTL1, seprom_cntl1);
329 WREG32(RADEON_VIPH_CONTROL, viph_control); 369 WREG32(RADEON_VIPH_CONTROL, viph_control);
330 WREG32(RADEON_BUS_CNTL, bus_cntl); 370 WREG32(RV370_BUS_CNTL, bus_cntl);
331 WREG32(AVIVO_D1VGA_CONTROL, d1vga_control); 371 WREG32(AVIVO_D1VGA_CONTROL, d1vga_control);
332 WREG32(AVIVO_D2VGA_CONTROL, d2vga_control); 372 WREG32(AVIVO_D2VGA_CONTROL, d2vga_control);
333 WREG32(AVIVO_VGA_RENDER_CONTROL, vga_render_control); 373 WREG32(AVIVO_VGA_RENDER_CONTROL, vga_render_control);
@@ -350,7 +390,10 @@ static bool legacy_read_disabled_bios(struct radeon_device *rdev)
350 390
351 seprom_cntl1 = RREG32(RADEON_SEPROM_CNTL1); 391 seprom_cntl1 = RREG32(RADEON_SEPROM_CNTL1);
352 viph_control = RREG32(RADEON_VIPH_CONTROL); 392 viph_control = RREG32(RADEON_VIPH_CONTROL);
353 bus_cntl = RREG32(RADEON_BUS_CNTL); 393 if (rdev->flags & RADEON_IS_PCIE)
394 bus_cntl = RREG32(RV370_BUS_CNTL);
395 else
396 bus_cntl = RREG32(RADEON_BUS_CNTL);
354 crtc_gen_cntl = RREG32(RADEON_CRTC_GEN_CNTL); 397 crtc_gen_cntl = RREG32(RADEON_CRTC_GEN_CNTL);
355 crtc2_gen_cntl = 0; 398 crtc2_gen_cntl = 0;
356 crtc_ext_cntl = RREG32(RADEON_CRTC_EXT_CNTL); 399 crtc_ext_cntl = RREG32(RADEON_CRTC_EXT_CNTL);
@@ -372,7 +415,10 @@ static bool legacy_read_disabled_bios(struct radeon_device *rdev)
372 WREG32(RADEON_VIPH_CONTROL, (viph_control & ~RADEON_VIPH_EN)); 415 WREG32(RADEON_VIPH_CONTROL, (viph_control & ~RADEON_VIPH_EN));
373 416
374 /* enable the rom */ 417 /* enable the rom */
375 WREG32(RADEON_BUS_CNTL, (bus_cntl & ~RADEON_BUS_BIOS_DIS_ROM)); 418 if (rdev->flags & RADEON_IS_PCIE)
419 WREG32(RV370_BUS_CNTL, (bus_cntl & ~RV370_BUS_BIOS_DIS_ROM));
420 else
421 WREG32(RADEON_BUS_CNTL, (bus_cntl & ~RADEON_BUS_BIOS_DIS_ROM));
376 422
377 /* Turn off mem requests and CRTC for both controllers */ 423 /* Turn off mem requests and CRTC for both controllers */
378 WREG32(RADEON_CRTC_GEN_CNTL, 424 WREG32(RADEON_CRTC_GEN_CNTL,
@@ -399,7 +445,10 @@ static bool legacy_read_disabled_bios(struct radeon_device *rdev)
399 /* restore regs */ 445 /* restore regs */
400 WREG32(RADEON_SEPROM_CNTL1, seprom_cntl1); 446 WREG32(RADEON_SEPROM_CNTL1, seprom_cntl1);
401 WREG32(RADEON_VIPH_CONTROL, viph_control); 447 WREG32(RADEON_VIPH_CONTROL, viph_control);
402 WREG32(RADEON_BUS_CNTL, bus_cntl); 448 if (rdev->flags & RADEON_IS_PCIE)
449 WREG32(RV370_BUS_CNTL, bus_cntl);
450 else
451 WREG32(RADEON_BUS_CNTL, bus_cntl);
403 WREG32(RADEON_CRTC_GEN_CNTL, crtc_gen_cntl); 452 WREG32(RADEON_CRTC_GEN_CNTL, crtc_gen_cntl);
404 if (!(rdev->flags & RADEON_SINGLE_CRTC)) { 453 if (!(rdev->flags & RADEON_SINGLE_CRTC)) {
405 WREG32(RADEON_CRTC2_GEN_CNTL, crtc2_gen_cntl); 454 WREG32(RADEON_CRTC2_GEN_CNTL, crtc2_gen_cntl);
@@ -415,6 +464,8 @@ static bool radeon_read_disabled_bios(struct radeon_device *rdev)
415{ 464{
416 if (rdev->flags & RADEON_IS_IGP) 465 if (rdev->flags & RADEON_IS_IGP)
417 return igp_read_bios_from_vram(rdev); 466 return igp_read_bios_from_vram(rdev);
467 else if (rdev->family >= CHIP_BARTS)
468 return ni_read_disabled_bios(rdev);
418 else if (rdev->family >= CHIP_RV770) 469 else if (rdev->family >= CHIP_RV770)
419 return r700_read_disabled_bios(rdev); 470 return r700_read_disabled_bios(rdev);
420 else if (rdev->family >= CHIP_R600) 471 else if (rdev->family >= CHIP_R600)
diff --git a/drivers/gpu/drm/radeon/radeon_clocks.c b/drivers/gpu/drm/radeon/radeon_clocks.c
index 5249af8931e6..2d48e7a1474b 100644
--- a/drivers/gpu/drm/radeon/radeon_clocks.c
+++ b/drivers/gpu/drm/radeon/radeon_clocks.c
@@ -117,7 +117,7 @@ static bool __devinit radeon_read_clocks_OF(struct drm_device *dev)
117 p1pll->reference_div = RREG32_PLL(RADEON_PPLL_REF_DIV) & 0x3ff; 117 p1pll->reference_div = RREG32_PLL(RADEON_PPLL_REF_DIV) & 0x3ff;
118 if (p1pll->reference_div < 2) 118 if (p1pll->reference_div < 2)
119 p1pll->reference_div = 12; 119 p1pll->reference_div = 12;
120 p2pll->reference_div = p1pll->reference_div; 120 p2pll->reference_div = p1pll->reference_div;
121 121
122 /* These aren't in the device-tree */ 122 /* These aren't in the device-tree */
123 if (rdev->family >= CHIP_R420) { 123 if (rdev->family >= CHIP_R420) {
@@ -139,6 +139,8 @@ static bool __devinit radeon_read_clocks_OF(struct drm_device *dev)
139 p2pll->pll_out_min = 12500; 139 p2pll->pll_out_min = 12500;
140 p2pll->pll_out_max = 35000; 140 p2pll->pll_out_max = 35000;
141 } 141 }
142 /* not sure what the max should be in all cases */
143 rdev->clock.max_pixel_clock = 35000;
142 144
143 spll->reference_freq = mpll->reference_freq = p1pll->reference_freq; 145 spll->reference_freq = mpll->reference_freq = p1pll->reference_freq;
144 spll->reference_div = mpll->reference_div = 146 spll->reference_div = mpll->reference_div =
@@ -151,7 +153,7 @@ static bool __devinit radeon_read_clocks_OF(struct drm_device *dev)
151 else 153 else
152 rdev->clock.default_sclk = 154 rdev->clock.default_sclk =
153 radeon_legacy_get_engine_clock(rdev); 155 radeon_legacy_get_engine_clock(rdev);
154 156
155 val = of_get_property(dp, "ATY,MCLK", NULL); 157 val = of_get_property(dp, "ATY,MCLK", NULL);
156 if (val && *val) 158 if (val && *val)
157 rdev->clock.default_mclk = (*val) / 10; 159 rdev->clock.default_mclk = (*val) / 10;
@@ -160,7 +162,7 @@ static bool __devinit radeon_read_clocks_OF(struct drm_device *dev)
160 radeon_legacy_get_memory_clock(rdev); 162 radeon_legacy_get_memory_clock(rdev);
161 163
162 DRM_INFO("Using device-tree clock info\n"); 164 DRM_INFO("Using device-tree clock info\n");
163 165
164 return true; 166 return true;
165} 167}
166#else 168#else
diff --git a/drivers/gpu/drm/radeon/radeon_combios.c b/drivers/gpu/drm/radeon/radeon_combios.c
index 7b7ea269549c..e4594676a07c 100644
--- a/drivers/gpu/drm/radeon/radeon_combios.c
+++ b/drivers/gpu/drm/radeon/radeon_combios.c
@@ -448,7 +448,7 @@ static uint16_t combios_get_table_offset(struct drm_device *dev,
448 448
449bool radeon_combios_check_hardcoded_edid(struct radeon_device *rdev) 449bool radeon_combios_check_hardcoded_edid(struct radeon_device *rdev)
450{ 450{
451 int edid_info; 451 int edid_info, size;
452 struct edid *edid; 452 struct edid *edid;
453 unsigned char *raw; 453 unsigned char *raw;
454 edid_info = combios_get_table_offset(rdev->ddev, COMBIOS_HARDCODED_EDID_TABLE); 454 edid_info = combios_get_table_offset(rdev->ddev, COMBIOS_HARDCODED_EDID_TABLE);
@@ -456,11 +456,12 @@ bool radeon_combios_check_hardcoded_edid(struct radeon_device *rdev)
456 return false; 456 return false;
457 457
458 raw = rdev->bios + edid_info; 458 raw = rdev->bios + edid_info;
459 edid = kmalloc(EDID_LENGTH * (raw[0x7e] + 1), GFP_KERNEL); 459 size = EDID_LENGTH * (raw[0x7e] + 1);
460 edid = kmalloc(size, GFP_KERNEL);
460 if (edid == NULL) 461 if (edid == NULL)
461 return false; 462 return false;
462 463
463 memcpy((unsigned char *)edid, raw, EDID_LENGTH * (raw[0x7e] + 1)); 464 memcpy((unsigned char *)edid, raw, size);
464 465
465 if (!drm_edid_is_valid(edid)) { 466 if (!drm_edid_is_valid(edid)) {
466 kfree(edid); 467 kfree(edid);
@@ -468,14 +469,25 @@ bool radeon_combios_check_hardcoded_edid(struct radeon_device *rdev)
468 } 469 }
469 470
470 rdev->mode_info.bios_hardcoded_edid = edid; 471 rdev->mode_info.bios_hardcoded_edid = edid;
472 rdev->mode_info.bios_hardcoded_edid_size = size;
471 return true; 473 return true;
472} 474}
473 475
476/* this is used for atom LCDs as well */
474struct edid * 477struct edid *
475radeon_combios_get_hardcoded_edid(struct radeon_device *rdev) 478radeon_bios_get_hardcoded_edid(struct radeon_device *rdev)
476{ 479{
477 if (rdev->mode_info.bios_hardcoded_edid) 480 struct edid *edid;
478 return rdev->mode_info.bios_hardcoded_edid; 481
482 if (rdev->mode_info.bios_hardcoded_edid) {
483 edid = kmalloc(rdev->mode_info.bios_hardcoded_edid_size, GFP_KERNEL);
484 if (edid) {
485 memcpy((unsigned char *)edid,
486 (unsigned char *)rdev->mode_info.bios_hardcoded_edid,
487 rdev->mode_info.bios_hardcoded_edid_size);
488 return edid;
489 }
490 }
479 return NULL; 491 return NULL;
480} 492}
481 493
@@ -493,12 +505,18 @@ static struct radeon_i2c_bus_rec combios_setup_i2c_bus(struct radeon_device *rde
493 * DDC_VGA = RADEON_GPIO_VGA_DDC 505 * DDC_VGA = RADEON_GPIO_VGA_DDC
494 * DDC_LCD = RADEON_GPIOPAD_MASK 506 * DDC_LCD = RADEON_GPIOPAD_MASK
495 * DDC_GPIO = RADEON_MDGPIO_MASK 507 * DDC_GPIO = RADEON_MDGPIO_MASK
496 * r1xx/r2xx 508 * r1xx
497 * DDC_MONID = RADEON_GPIO_MONID 509 * DDC_MONID = RADEON_GPIO_MONID
498 * DDC_CRT2 = RADEON_GPIO_CRT2_DDC 510 * DDC_CRT2 = RADEON_GPIO_CRT2_DDC
499 * r3xx 511 * r200
500 * DDC_MONID = RADEON_GPIO_MONID 512 * DDC_MONID = RADEON_GPIO_MONID
501 * DDC_CRT2 = RADEON_GPIO_DVI_DDC 513 * DDC_CRT2 = RADEON_GPIO_DVI_DDC
514 * r300/r350
515 * DDC_MONID = RADEON_GPIO_DVI_DDC
516 * DDC_CRT2 = RADEON_GPIO_DVI_DDC
517 * rv2xx/rv3xx
518 * DDC_MONID = RADEON_GPIO_MONID
519 * DDC_CRT2 = RADEON_GPIO_MONID
502 * rs3xx/rs4xx 520 * rs3xx/rs4xx
503 * DDC_MONID = RADEON_GPIOPAD_MASK 521 * DDC_MONID = RADEON_GPIOPAD_MASK
504 * DDC_CRT2 = RADEON_GPIO_MONID 522 * DDC_CRT2 = RADEON_GPIO_MONID
@@ -525,17 +543,26 @@ static struct radeon_i2c_bus_rec combios_setup_i2c_bus(struct radeon_device *rde
525 rdev->family == CHIP_RS400 || 543 rdev->family == CHIP_RS400 ||
526 rdev->family == CHIP_RS480) 544 rdev->family == CHIP_RS480)
527 ddc_line = RADEON_GPIOPAD_MASK; 545 ddc_line = RADEON_GPIOPAD_MASK;
528 else 546 else if (rdev->family == CHIP_R300 ||
547 rdev->family == CHIP_R350) {
548 ddc_line = RADEON_GPIO_DVI_DDC;
549 ddc = DDC_DVI;
550 } else
529 ddc_line = RADEON_GPIO_MONID; 551 ddc_line = RADEON_GPIO_MONID;
530 break; 552 break;
531 case DDC_CRT2: 553 case DDC_CRT2:
532 if (rdev->family == CHIP_RS300 || 554 if (rdev->family == CHIP_R200 ||
533 rdev->family == CHIP_RS400 || 555 rdev->family == CHIP_R300 ||
534 rdev->family == CHIP_RS480) 556 rdev->family == CHIP_R350) {
535 ddc_line = RADEON_GPIO_MONID;
536 else if (rdev->family >= CHIP_R300) {
537 ddc_line = RADEON_GPIO_DVI_DDC; 557 ddc_line = RADEON_GPIO_DVI_DDC;
538 ddc = DDC_DVI; 558 ddc = DDC_DVI;
559 } else if (rdev->family == CHIP_RS300 ||
560 rdev->family == CHIP_RS400 ||
561 rdev->family == CHIP_RS480)
562 ddc_line = RADEON_GPIO_MONID;
563 else if (rdev->family >= CHIP_RV350) {
564 ddc_line = RADEON_GPIO_MONID;
565 ddc = DDC_MONID;
539 } else 566 } else
540 ddc_line = RADEON_GPIO_CRT2_DDC; 567 ddc_line = RADEON_GPIO_CRT2_DDC;
541 break; 568 break;
@@ -571,6 +598,7 @@ static struct radeon_i2c_bus_rec combios_setup_i2c_bus(struct radeon_device *rde
571 } 598 }
572 599
573 if (clk_mask && data_mask) { 600 if (clk_mask && data_mask) {
601 /* system specific masks */
574 i2c.mask_clk_mask = clk_mask; 602 i2c.mask_clk_mask = clk_mask;
575 i2c.mask_data_mask = data_mask; 603 i2c.mask_data_mask = data_mask;
576 i2c.a_clk_mask = clk_mask; 604 i2c.a_clk_mask = clk_mask;
@@ -579,7 +607,19 @@ static struct radeon_i2c_bus_rec combios_setup_i2c_bus(struct radeon_device *rde
579 i2c.en_data_mask = data_mask; 607 i2c.en_data_mask = data_mask;
580 i2c.y_clk_mask = clk_mask; 608 i2c.y_clk_mask = clk_mask;
581 i2c.y_data_mask = data_mask; 609 i2c.y_data_mask = data_mask;
610 } else if ((ddc_line == RADEON_GPIOPAD_MASK) ||
611 (ddc_line == RADEON_MDGPIO_MASK)) {
612 /* default gpiopad masks */
613 i2c.mask_clk_mask = (0x20 << 8);
614 i2c.mask_data_mask = 0x80;
615 i2c.a_clk_mask = (0x20 << 8);
616 i2c.a_data_mask = 0x80;
617 i2c.en_clk_mask = (0x20 << 8);
618 i2c.en_data_mask = 0x80;
619 i2c.y_clk_mask = (0x20 << 8);
620 i2c.y_data_mask = 0x80;
582 } else { 621 } else {
622 /* default masks for ddc pads */
583 i2c.mask_clk_mask = RADEON_GPIO_EN_1; 623 i2c.mask_clk_mask = RADEON_GPIO_EN_1;
584 i2c.mask_data_mask = RADEON_GPIO_EN_0; 624 i2c.mask_data_mask = RADEON_GPIO_EN_0;
585 i2c.a_clk_mask = RADEON_GPIO_A_1; 625 i2c.a_clk_mask = RADEON_GPIO_A_1;
@@ -684,26 +724,42 @@ void radeon_combios_i2c_init(struct radeon_device *rdev)
684 struct drm_device *dev = rdev->ddev; 724 struct drm_device *dev = rdev->ddev;
685 struct radeon_i2c_bus_rec i2c; 725 struct radeon_i2c_bus_rec i2c;
686 726
727 /* actual hw pads
728 * r1xx/rs2xx/rs3xx
729 * 0x60, 0x64, 0x68, 0x6c, gpiopads, mm
730 * r200
731 * 0x60, 0x64, 0x68, mm
732 * r300/r350
733 * 0x60, 0x64, mm
734 * rv2xx/rv3xx/rs4xx
735 * 0x60, 0x64, 0x68, gpiopads, mm
736 */
687 737
738 /* 0x60 */
688 i2c = combios_setup_i2c_bus(rdev, DDC_DVI, 0, 0); 739 i2c = combios_setup_i2c_bus(rdev, DDC_DVI, 0, 0);
689 rdev->i2c_bus[0] = radeon_i2c_create(dev, &i2c, "DVI_DDC"); 740 rdev->i2c_bus[0] = radeon_i2c_create(dev, &i2c, "DVI_DDC");
690 741 /* 0x64 */
691 i2c = combios_setup_i2c_bus(rdev, DDC_VGA, 0, 0); 742 i2c = combios_setup_i2c_bus(rdev, DDC_VGA, 0, 0);
692 rdev->i2c_bus[1] = radeon_i2c_create(dev, &i2c, "VGA_DDC"); 743 rdev->i2c_bus[1] = radeon_i2c_create(dev, &i2c, "VGA_DDC");
693 744
745 /* mm i2c */
694 i2c.valid = true; 746 i2c.valid = true;
695 i2c.hw_capable = true; 747 i2c.hw_capable = true;
696 i2c.mm_i2c = true; 748 i2c.mm_i2c = true;
697 i2c.i2c_id = 0xa0; 749 i2c.i2c_id = 0xa0;
698 rdev->i2c_bus[2] = radeon_i2c_create(dev, &i2c, "MM_I2C"); 750 rdev->i2c_bus[2] = radeon_i2c_create(dev, &i2c, "MM_I2C");
699 751
700 if (rdev->family == CHIP_RS300 || 752 if (rdev->family == CHIP_R300 ||
701 rdev->family == CHIP_RS400 || 753 rdev->family == CHIP_R350) {
702 rdev->family == CHIP_RS480) { 754 /* only 2 sw i2c pads */
755 } else if (rdev->family == CHIP_RS300 ||
756 rdev->family == CHIP_RS400 ||
757 rdev->family == CHIP_RS480) {
703 u16 offset; 758 u16 offset;
704 u8 id, blocks, clk, data; 759 u8 id, blocks, clk, data;
705 int i; 760 int i;
706 761
762 /* 0x68 */
707 i2c = combios_setup_i2c_bus(rdev, DDC_CRT2, 0, 0); 763 i2c = combios_setup_i2c_bus(rdev, DDC_CRT2, 0, 0);
708 rdev->i2c_bus[3] = radeon_i2c_create(dev, &i2c, "MONID"); 764 rdev->i2c_bus[3] = radeon_i2c_create(dev, &i2c, "MONID");
709 765
@@ -715,21 +771,23 @@ void radeon_combios_i2c_init(struct radeon_device *rdev)
715 if (id == 136) { 771 if (id == 136) {
716 clk = RBIOS8(offset + 3 + (i * 5) + 3); 772 clk = RBIOS8(offset + 3 + (i * 5) + 3);
717 data = RBIOS8(offset + 3 + (i * 5) + 4); 773 data = RBIOS8(offset + 3 + (i * 5) + 4);
774 /* gpiopad */
718 i2c = combios_setup_i2c_bus(rdev, DDC_MONID, 775 i2c = combios_setup_i2c_bus(rdev, DDC_MONID,
719 clk, data); 776 (1 << clk), (1 << data));
720 rdev->i2c_bus[4] = radeon_i2c_create(dev, &i2c, "GPIOPAD_MASK"); 777 rdev->i2c_bus[4] = radeon_i2c_create(dev, &i2c, "GPIOPAD_MASK");
721 break; 778 break;
722 } 779 }
723 } 780 }
724 } 781 }
725 782 } else if (rdev->family >= CHIP_R200) {
726 } else if (rdev->family >= CHIP_R300) { 783 /* 0x68 */
727 i2c = combios_setup_i2c_bus(rdev, DDC_MONID, 0, 0); 784 i2c = combios_setup_i2c_bus(rdev, DDC_MONID, 0, 0);
728 rdev->i2c_bus[3] = radeon_i2c_create(dev, &i2c, "MONID"); 785 rdev->i2c_bus[3] = radeon_i2c_create(dev, &i2c, "MONID");
729 } else { 786 } else {
787 /* 0x68 */
730 i2c = combios_setup_i2c_bus(rdev, DDC_MONID, 0, 0); 788 i2c = combios_setup_i2c_bus(rdev, DDC_MONID, 0, 0);
731 rdev->i2c_bus[3] = radeon_i2c_create(dev, &i2c, "MONID"); 789 rdev->i2c_bus[3] = radeon_i2c_create(dev, &i2c, "MONID");
732 790 /* 0x6c */
733 i2c = combios_setup_i2c_bus(rdev, DDC_CRT2, 0, 0); 791 i2c = combios_setup_i2c_bus(rdev, DDC_CRT2, 0, 0);
734 rdev->i2c_bus[4] = radeon_i2c_create(dev, &i2c, "CRT2_DDC"); 792 rdev->i2c_bus[4] = radeon_i2c_create(dev, &i2c, "CRT2_DDC");
735 } 793 }
@@ -808,6 +866,11 @@ bool radeon_combios_get_clock_info(struct drm_device *dev)
808 rdev->clock.default_sclk = sclk; 866 rdev->clock.default_sclk = sclk;
809 rdev->clock.default_mclk = mclk; 867 rdev->clock.default_mclk = mclk;
810 868
869 if (RBIOS32(pll_info + 0x16))
870 rdev->clock.max_pixel_clock = RBIOS32(pll_info + 0x16);
871 else
872 rdev->clock.max_pixel_clock = 35000; /* might need something asic specific */
873
811 return true; 874 return true;
812 } 875 }
813 return false; 876 return false;
@@ -1490,6 +1553,13 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
1490 (rdev->pdev->subsystem_device == 0x4a48)) { 1553 (rdev->pdev->subsystem_device == 0x4a48)) {
1491 /* Mac X800 */ 1554 /* Mac X800 */
1492 rdev->mode_info.connector_table = CT_MAC_X800; 1555 rdev->mode_info.connector_table = CT_MAC_X800;
1556 } else if ((of_machine_is_compatible("PowerMac7,2") ||
1557 of_machine_is_compatible("PowerMac7,3")) &&
1558 (rdev->pdev->device == 0x4150) &&
1559 (rdev->pdev->subsystem_vendor == 0x1002) &&
1560 (rdev->pdev->subsystem_device == 0x4150)) {
1561 /* Mac G5 tower 9600 */
1562 rdev->mode_info.connector_table = CT_MAC_G5_9600;
1493 } else 1563 } else
1494#endif /* CONFIG_PPC_PMAC */ 1564#endif /* CONFIG_PPC_PMAC */
1495#ifdef CONFIG_PPC64 1565#ifdef CONFIG_PPC64
@@ -2008,6 +2078,61 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
2008 CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_I, 2078 CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_I,
2009 &hpd); 2079 &hpd);
2010 break; 2080 break;
2081 case CT_MAC_G5_9600:
2082 DRM_INFO("Connector Table: %d (mac g5 9600)\n",
2083 rdev->mode_info.connector_table);
2084 /* DVI - tv dac, dvo */
2085 ddc_i2c = combios_setup_i2c_bus(rdev, DDC_DVI, 0, 0);
2086 hpd.hpd = RADEON_HPD_1; /* ??? */
2087 radeon_add_legacy_encoder(dev,
2088 radeon_get_encoder_enum(dev,
2089 ATOM_DEVICE_DFP2_SUPPORT,
2090 0),
2091 ATOM_DEVICE_DFP2_SUPPORT);
2092 radeon_add_legacy_encoder(dev,
2093 radeon_get_encoder_enum(dev,
2094 ATOM_DEVICE_CRT2_SUPPORT,
2095 2),
2096 ATOM_DEVICE_CRT2_SUPPORT);
2097 radeon_add_legacy_connector(dev, 0,
2098 ATOM_DEVICE_DFP2_SUPPORT |
2099 ATOM_DEVICE_CRT2_SUPPORT,
2100 DRM_MODE_CONNECTOR_DVII, &ddc_i2c,
2101 CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I,
2102 &hpd);
2103 /* ADC - primary dac, internal tmds */
2104 ddc_i2c = combios_setup_i2c_bus(rdev, DDC_VGA, 0, 0);
2105 hpd.hpd = RADEON_HPD_2; /* ??? */
2106 radeon_add_legacy_encoder(dev,
2107 radeon_get_encoder_enum(dev,
2108 ATOM_DEVICE_DFP1_SUPPORT,
2109 0),
2110 ATOM_DEVICE_DFP1_SUPPORT);
2111 radeon_add_legacy_encoder(dev,
2112 radeon_get_encoder_enum(dev,
2113 ATOM_DEVICE_CRT1_SUPPORT,
2114 1),
2115 ATOM_DEVICE_CRT1_SUPPORT);
2116 radeon_add_legacy_connector(dev, 1,
2117 ATOM_DEVICE_DFP1_SUPPORT |
2118 ATOM_DEVICE_CRT1_SUPPORT,
2119 DRM_MODE_CONNECTOR_DVII, &ddc_i2c,
2120 CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I,
2121 &hpd);
2122 /* TV - TV DAC */
2123 ddc_i2c.valid = false;
2124 hpd.hpd = RADEON_HPD_NONE;
2125 radeon_add_legacy_encoder(dev,
2126 radeon_get_encoder_enum(dev,
2127 ATOM_DEVICE_TV1_SUPPORT,
2128 2),
2129 ATOM_DEVICE_TV1_SUPPORT);
2130 radeon_add_legacy_connector(dev, 2, ATOM_DEVICE_TV1_SUPPORT,
2131 DRM_MODE_CONNECTOR_SVIDEO,
2132 &ddc_i2c,
2133 CONNECTOR_OBJECT_ID_SVIDEO,
2134 &hpd);
2135 break;
2011 default: 2136 default:
2012 DRM_INFO("Connector table: %d (invalid)\n", 2137 DRM_INFO("Connector table: %d (invalid)\n",
2013 rdev->mode_info.connector_table); 2138 rdev->mode_info.connector_table);
@@ -2419,6 +2544,12 @@ bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev)
2419 return true; 2544 return true;
2420} 2545}
2421 2546
2547static const char *thermal_controller_names[] = {
2548 "NONE",
2549 "lm63",
2550 "adm1032",
2551};
2552
2422void radeon_combios_get_power_modes(struct radeon_device *rdev) 2553void radeon_combios_get_power_modes(struct radeon_device *rdev)
2423{ 2554{
2424 struct drm_device *dev = rdev->ddev; 2555 struct drm_device *dev = rdev->ddev;
@@ -2428,6 +2559,65 @@ void radeon_combios_get_power_modes(struct radeon_device *rdev)
2428 2559
2429 rdev->pm.default_power_state_index = -1; 2560 rdev->pm.default_power_state_index = -1;
2430 2561
2562 /* allocate 2 power states */
2563 rdev->pm.power_state = kzalloc(sizeof(struct radeon_power_state) * 2, GFP_KERNEL);
2564 if (!rdev->pm.power_state) {
2565 rdev->pm.default_power_state_index = state_index;
2566 rdev->pm.num_power_states = 0;
2567
2568 rdev->pm.current_power_state_index = rdev->pm.default_power_state_index;
2569 rdev->pm.current_clock_mode_index = 0;
2570 return;
2571 }
2572
2573 /* check for a thermal chip */
2574 offset = combios_get_table_offset(dev, COMBIOS_OVERDRIVE_INFO_TABLE);
2575 if (offset) {
2576 u8 thermal_controller = 0, gpio = 0, i2c_addr = 0, clk_bit = 0, data_bit = 0;
2577 struct radeon_i2c_bus_rec i2c_bus;
2578
2579 rev = RBIOS8(offset);
2580
2581 if (rev == 0) {
2582 thermal_controller = RBIOS8(offset + 3);
2583 gpio = RBIOS8(offset + 4) & 0x3f;
2584 i2c_addr = RBIOS8(offset + 5);
2585 } else if (rev == 1) {
2586 thermal_controller = RBIOS8(offset + 4);
2587 gpio = RBIOS8(offset + 5) & 0x3f;
2588 i2c_addr = RBIOS8(offset + 6);
2589 } else if (rev == 2) {
2590 thermal_controller = RBIOS8(offset + 4);
2591 gpio = RBIOS8(offset + 5) & 0x3f;
2592 i2c_addr = RBIOS8(offset + 6);
2593 clk_bit = RBIOS8(offset + 0xa);
2594 data_bit = RBIOS8(offset + 0xb);
2595 }
2596 if ((thermal_controller > 0) && (thermal_controller < 3)) {
2597 DRM_INFO("Possible %s thermal controller at 0x%02x\n",
2598 thermal_controller_names[thermal_controller],
2599 i2c_addr >> 1);
2600 if (gpio == DDC_LCD) {
2601 /* MM i2c */
2602 i2c_bus.valid = true;
2603 i2c_bus.hw_capable = true;
2604 i2c_bus.mm_i2c = true;
2605 i2c_bus.i2c_id = 0xa0;
2606 } else if (gpio == DDC_GPIO)
2607 i2c_bus = combios_setup_i2c_bus(rdev, gpio, 1 << clk_bit, 1 << data_bit);
2608 else
2609 i2c_bus = combios_setup_i2c_bus(rdev, gpio, 0, 0);
2610 rdev->pm.i2c_bus = radeon_i2c_lookup(rdev, &i2c_bus);
2611 if (rdev->pm.i2c_bus) {
2612 struct i2c_board_info info = { };
2613 const char *name = thermal_controller_names[thermal_controller];
2614 info.addr = i2c_addr >> 1;
2615 strlcpy(info.type, name, sizeof(info.type));
2616 i2c_new_device(&rdev->pm.i2c_bus->adapter, &info);
2617 }
2618 }
2619 }
2620
2431 if (rdev->flags & RADEON_IS_MOBILITY) { 2621 if (rdev->flags & RADEON_IS_MOBILITY) {
2432 offset = combios_get_table_offset(dev, COMBIOS_POWERPLAY_INFO_TABLE); 2622 offset = combios_get_table_offset(dev, COMBIOS_POWERPLAY_INFO_TABLE);
2433 if (offset) { 2623 if (offset) {
diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c
index ecc1a8fafbfd..9792d4ffdc86 100644
--- a/drivers/gpu/drm/radeon/radeon_connectors.c
+++ b/drivers/gpu/drm/radeon/radeon_connectors.c
@@ -40,26 +40,39 @@ radeon_atombios_connected_scratch_regs(struct drm_connector *connector,
40 struct drm_encoder *encoder, 40 struct drm_encoder *encoder,
41 bool connected); 41 bool connected);
42 42
43extern void
44radeon_legacy_backlight_init(struct radeon_encoder *radeon_encoder,
45 struct drm_connector *drm_connector);
46
47bool radeon_connector_encoder_is_dp_bridge(struct drm_connector *connector);
48
43void radeon_connector_hotplug(struct drm_connector *connector) 49void radeon_connector_hotplug(struct drm_connector *connector)
44{ 50{
45 struct drm_device *dev = connector->dev; 51 struct drm_device *dev = connector->dev;
46 struct radeon_device *rdev = dev->dev_private; 52 struct radeon_device *rdev = dev->dev_private;
47 struct radeon_connector *radeon_connector = to_radeon_connector(connector); 53 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
48 54
49 if (radeon_connector->hpd.hpd != RADEON_HPD_NONE) 55 /* bail if the connector does not have hpd pin, e.g.,
50 radeon_hpd_set_polarity(rdev, radeon_connector->hpd.hpd); 56 * VGA, TV, etc.
57 */
58 if (radeon_connector->hpd.hpd == RADEON_HPD_NONE)
59 return;
51 60
52 if ((connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort) || 61 radeon_hpd_set_polarity(rdev, radeon_connector->hpd.hpd);
53 (connector->connector_type == DRM_MODE_CONNECTOR_eDP)) { 62
54 if ((radeon_dp_getsinktype(radeon_connector) == CONNECTOR_OBJECT_ID_DISPLAYPORT) || 63 /* powering up/down the eDP panel generates hpd events which
55 (radeon_dp_getsinktype(radeon_connector) == CONNECTOR_OBJECT_ID_eDP)) { 64 * can interfere with modesetting.
56 if (radeon_dp_needs_link_train(radeon_connector)) { 65 */
57 if (connector->encoder) 66 if (connector->connector_type == DRM_MODE_CONNECTOR_eDP)
58 dp_link_train(connector->encoder, connector); 67 return;
59 }
60 }
61 }
62 68
69 /* pre-r600 did not always have the hpd pins mapped accurately to connectors */
70 if (rdev->family >= CHIP_R600) {
71 if (radeon_hpd_sense(rdev, radeon_connector->hpd.hpd))
72 drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON);
73 else
74 drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF);
75 }
63} 76}
64 77
65static void radeon_property_change_mode(struct drm_encoder *encoder) 78static void radeon_property_change_mode(struct drm_encoder *encoder)
@@ -183,13 +196,13 @@ radeon_connector_analog_encoder_conflict_solve(struct drm_connector *connector,
183 continue; 196 continue;
184 197
185 if (priority == true) { 198 if (priority == true) {
186 DRM_INFO("1: conflicting encoders switching off %s\n", drm_get_connector_name(conflict)); 199 DRM_DEBUG_KMS("1: conflicting encoders switching off %s\n", drm_get_connector_name(conflict));
187 DRM_INFO("in favor of %s\n", drm_get_connector_name(connector)); 200 DRM_DEBUG_KMS("in favor of %s\n", drm_get_connector_name(connector));
188 conflict->status = connector_status_disconnected; 201 conflict->status = connector_status_disconnected;
189 radeon_connector_update_scratch_regs(conflict, connector_status_disconnected); 202 radeon_connector_update_scratch_regs(conflict, connector_status_disconnected);
190 } else { 203 } else {
191 DRM_INFO("2: conflicting encoders switching off %s\n", drm_get_connector_name(connector)); 204 DRM_DEBUG_KMS("2: conflicting encoders switching off %s\n", drm_get_connector_name(connector));
192 DRM_INFO("in favor of %s\n", drm_get_connector_name(conflict)); 205 DRM_DEBUG_KMS("in favor of %s\n", drm_get_connector_name(conflict));
193 current_status = connector_status_disconnected; 206 current_status = connector_status_disconnected;
194 } 207 }
195 break; 208 break;
@@ -326,6 +339,34 @@ int radeon_connector_set_property(struct drm_connector *connector, struct drm_pr
326 } 339 }
327 } 340 }
328 341
342 if (property == rdev->mode_info.underscan_hborder_property) {
343 /* need to find digital encoder on connector */
344 encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TMDS);
345 if (!encoder)
346 return 0;
347
348 radeon_encoder = to_radeon_encoder(encoder);
349
350 if (radeon_encoder->underscan_hborder != val) {
351 radeon_encoder->underscan_hborder = val;
352 radeon_property_change_mode(&radeon_encoder->base);
353 }
354 }
355
356 if (property == rdev->mode_info.underscan_vborder_property) {
357 /* need to find digital encoder on connector */
358 encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TMDS);
359 if (!encoder)
360 return 0;
361
362 radeon_encoder = to_radeon_encoder(encoder);
363
364 if (radeon_encoder->underscan_vborder != val) {
365 radeon_encoder->underscan_vborder = val;
366 radeon_property_change_mode(&radeon_encoder->base);
367 }
368 }
369
329 if (property == rdev->mode_info.tv_std_property) { 370 if (property == rdev->mode_info.tv_std_property) {
330 encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TVDAC); 371 encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TVDAC);
331 if (!encoder) { 372 if (!encoder) {
@@ -404,13 +445,13 @@ static void radeon_fixup_lvds_native_mode(struct drm_encoder *encoder,
404 mode->vdisplay == native_mode->vdisplay) { 445 mode->vdisplay == native_mode->vdisplay) {
405 *native_mode = *mode; 446 *native_mode = *mode;
406 drm_mode_set_crtcinfo(native_mode, CRTC_INTERLACE_HALVE_V); 447 drm_mode_set_crtcinfo(native_mode, CRTC_INTERLACE_HALVE_V);
407 DRM_INFO("Determined LVDS native mode details from EDID\n"); 448 DRM_DEBUG_KMS("Determined LVDS native mode details from EDID\n");
408 break; 449 break;
409 } 450 }
410 } 451 }
411 } 452 }
412 if (!native_mode->clock) { 453 if (!native_mode->clock) {
413 DRM_INFO("No LVDS native mode details, disabling RMX\n"); 454 DRM_DEBUG_KMS("No LVDS native mode details, disabling RMX\n");
414 radeon_encoder->rmx_type = RMX_OFF; 455 radeon_encoder->rmx_type = RMX_OFF;
415 } 456 }
416} 457}
@@ -444,6 +485,9 @@ static int radeon_lvds_get_modes(struct drm_connector *connector)
444 if (mode) { 485 if (mode) {
445 ret = 1; 486 ret = 1;
446 drm_mode_probed_add(connector, mode); 487 drm_mode_probed_add(connector, mode);
488 /* add the width/height from vbios tables if available */
489 connector->display_info.width_mm = mode->width_mm;
490 connector->display_info.height_mm = mode->height_mm;
447 /* add scaled modes */ 491 /* add scaled modes */
448 radeon_add_common_modes(encoder, connector); 492 radeon_add_common_modes(encoder, connector);
449 } 493 }
@@ -590,14 +634,22 @@ static int radeon_vga_get_modes(struct drm_connector *connector)
590static int radeon_vga_mode_valid(struct drm_connector *connector, 634static int radeon_vga_mode_valid(struct drm_connector *connector,
591 struct drm_display_mode *mode) 635 struct drm_display_mode *mode)
592{ 636{
637 struct drm_device *dev = connector->dev;
638 struct radeon_device *rdev = dev->dev_private;
639
593 /* XXX check mode bandwidth */ 640 /* XXX check mode bandwidth */
594 /* XXX verify against max DAC output frequency */ 641
642 if ((mode->clock / 10) > rdev->clock.max_pixel_clock)
643 return MODE_CLOCK_HIGH;
644
595 return MODE_OK; 645 return MODE_OK;
596} 646}
597 647
598static enum drm_connector_status 648static enum drm_connector_status
599radeon_vga_detect(struct drm_connector *connector, bool force) 649radeon_vga_detect(struct drm_connector *connector, bool force)
600{ 650{
651 struct drm_device *dev = connector->dev;
652 struct radeon_device *rdev = dev->dev_private;
601 struct radeon_connector *radeon_connector = to_radeon_connector(connector); 653 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
602 struct drm_encoder *encoder; 654 struct drm_encoder *encoder;
603 struct drm_encoder_helper_funcs *encoder_funcs; 655 struct drm_encoder_helper_funcs *encoder_funcs;
@@ -635,6 +687,11 @@ radeon_vga_detect(struct drm_connector *connector, bool force)
635 ret = connector_status_connected; 687 ret = connector_status_connected;
636 } 688 }
637 } else { 689 } else {
690
691 /* if we aren't forcing don't do destructive polling */
692 if (!force)
693 return connector->status;
694
638 if (radeon_connector->dac_load_detect && encoder) { 695 if (radeon_connector->dac_load_detect && encoder) {
639 encoder_funcs = encoder->helper_private; 696 encoder_funcs = encoder->helper_private;
640 ret = encoder_funcs->detect(encoder, connector); 697 ret = encoder_funcs->detect(encoder, connector);
@@ -643,6 +700,17 @@ radeon_vga_detect(struct drm_connector *connector, bool force)
643 700
644 if (ret == connector_status_connected) 701 if (ret == connector_status_connected)
645 ret = radeon_connector_analog_encoder_conflict_solve(connector, encoder, ret, true); 702 ret = radeon_connector_analog_encoder_conflict_solve(connector, encoder, ret, true);
703
704 /* RN50 and some RV100 asics in servers often have a hardcoded EDID in the
705 * vbios to deal with KVMs. If we have one and are not able to detect a monitor
706 * by other means, assume the CRT is connected and use that EDID.
707 */
708 if ((!rdev->is_atom_bios) &&
709 (ret == connector_status_disconnected) &&
710 rdev->mode_info.bios_hardcoded_edid_size) {
711 ret = connector_status_connected;
712 }
713
646 radeon_connector_update_scratch_regs(connector, ret); 714 radeon_connector_update_scratch_regs(connector, ret);
647 return ret; 715 return ret;
648} 716}
@@ -754,6 +822,8 @@ static int radeon_dvi_get_modes(struct drm_connector *connector)
754static enum drm_connector_status 822static enum drm_connector_status
755radeon_dvi_detect(struct drm_connector *connector, bool force) 823radeon_dvi_detect(struct drm_connector *connector, bool force)
756{ 824{
825 struct drm_device *dev = connector->dev;
826 struct radeon_device *rdev = dev->dev_private;
757 struct radeon_connector *radeon_connector = to_radeon_connector(connector); 827 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
758 struct drm_encoder *encoder = NULL; 828 struct drm_encoder *encoder = NULL;
759 struct drm_encoder_helper_funcs *encoder_funcs; 829 struct drm_encoder_helper_funcs *encoder_funcs;
@@ -774,6 +844,13 @@ radeon_dvi_detect(struct drm_connector *connector, bool force)
774 if (!radeon_connector->edid) { 844 if (!radeon_connector->edid) {
775 DRM_ERROR("%s: probed a monitor but no|invalid EDID\n", 845 DRM_ERROR("%s: probed a monitor but no|invalid EDID\n",
776 drm_get_connector_name(connector)); 846 drm_get_connector_name(connector));
847 /* rs690 seems to have a problem with connectors not existing and always
848 * return a block of 0's. If we see this just stop polling on this output */
849 if ((rdev->family == CHIP_RS690 || rdev->family == CHIP_RS740) && radeon_connector->base.null_edid_counter) {
850 ret = connector_status_disconnected;
851 DRM_ERROR("%s: detected RS690 floating bus bug, stopping ddc detect\n", drm_get_connector_name(connector));
852 radeon_connector->ddc_bus = NULL;
853 }
777 } else { 854 } else {
778 radeon_connector->use_digital = !!(radeon_connector->edid->input & DRM_EDID_INPUT_DIGITAL); 855 radeon_connector->use_digital = !!(radeon_connector->edid->input & DRM_EDID_INPUT_DIGITAL);
779 856
@@ -793,8 +870,6 @@ radeon_dvi_detect(struct drm_connector *connector, bool force)
793 * you don't really know what's connected to which port as both are digital. 870 * you don't really know what's connected to which port as both are digital.
794 */ 871 */
795 if (radeon_connector->shared_ddc && (ret == connector_status_connected)) { 872 if (radeon_connector->shared_ddc && (ret == connector_status_connected)) {
796 struct drm_device *dev = connector->dev;
797 struct radeon_device *rdev = dev->dev_private;
798 struct drm_connector *list_connector; 873 struct drm_connector *list_connector;
799 struct radeon_connector *list_radeon_connector; 874 struct radeon_connector *list_radeon_connector;
800 list_for_each_entry(list_connector, &dev->mode_config.connector_list, head) { 875 list_for_each_entry(list_connector, &dev->mode_config.connector_list, head) {
@@ -822,6 +897,11 @@ radeon_dvi_detect(struct drm_connector *connector, bool force)
822 if ((ret == connector_status_connected) && (radeon_connector->use_digital == true)) 897 if ((ret == connector_status_connected) && (radeon_connector->use_digital == true))
823 goto out; 898 goto out;
824 899
900 if (!force) {
901 ret = connector->status;
902 goto out;
903 }
904
825 /* find analog encoder */ 905 /* find analog encoder */
826 if (radeon_connector->dac_load_detect) { 906 if (radeon_connector->dac_load_detect) {
827 for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) { 907 for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
@@ -854,6 +934,19 @@ radeon_dvi_detect(struct drm_connector *connector, bool force)
854 ret = radeon_connector_analog_encoder_conflict_solve(connector, encoder, ret, true); 934 ret = radeon_connector_analog_encoder_conflict_solve(connector, encoder, ret, true);
855 } 935 }
856 936
937 /* RN50 and some RV100 asics in servers often have a hardcoded EDID in the
938 * vbios to deal with KVMs. If we have one and are not able to detect a monitor
939 * by other means, assume the DFP is connected and use that EDID. In most
940 * cases the DVI port is actually a virtual KVM port connected to the service
941 * processor.
942 */
943 if ((!rdev->is_atom_bios) &&
944 (ret == connector_status_disconnected) &&
945 rdev->mode_info.bios_hardcoded_edid_size) {
946 radeon_connector->use_digital = true;
947 ret = connector_status_connected;
948 }
949
857out: 950out:
858 /* updated in get modes as well since we need to know if it's analog or digital */ 951 /* updated in get modes as well since we need to know if it's analog or digital */
859 radeon_connector_update_scratch_regs(connector, ret); 952 radeon_connector_update_scratch_regs(connector, ret);
@@ -931,9 +1024,23 @@ static int radeon_dvi_mode_valid(struct drm_connector *connector,
931 (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D) || 1024 (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D) ||
932 (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_HDMI_TYPE_B)) 1025 (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_HDMI_TYPE_B))
933 return MODE_OK; 1026 return MODE_OK;
934 else 1027 else if (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_HDMI_TYPE_A) {
1028 if (ASIC_IS_DCE3(rdev)) {
1029 /* HDMI 1.3+ supports max clock of 340 Mhz */
1030 if (mode->clock > 340000)
1031 return MODE_CLOCK_HIGH;
1032 else
1033 return MODE_OK;
1034 } else
1035 return MODE_CLOCK_HIGH;
1036 } else
935 return MODE_CLOCK_HIGH; 1037 return MODE_CLOCK_HIGH;
936 } 1038 }
1039
1040 /* check against the max pixel clock */
1041 if ((mode->clock / 10) > rdev->clock.max_pixel_clock)
1042 return MODE_CLOCK_HIGH;
1043
937 return MODE_OK; 1044 return MODE_OK;
938} 1045}
939 1046
@@ -970,37 +1077,193 @@ static void radeon_dp_connector_destroy(struct drm_connector *connector)
970static int radeon_dp_get_modes(struct drm_connector *connector) 1077static int radeon_dp_get_modes(struct drm_connector *connector)
971{ 1078{
972 struct radeon_connector *radeon_connector = to_radeon_connector(connector); 1079 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
1080 struct radeon_connector_atom_dig *radeon_dig_connector = radeon_connector->con_priv;
1081 struct drm_encoder *encoder = radeon_best_single_encoder(connector);
973 int ret; 1082 int ret;
974 1083
975 ret = radeon_ddc_get_modes(radeon_connector); 1084 if ((connector->connector_type == DRM_MODE_CONNECTOR_eDP) ||
1085 (connector->connector_type == DRM_MODE_CONNECTOR_LVDS)) {
1086 struct drm_display_mode *mode;
1087
1088 if (!radeon_dig_connector->edp_on)
1089 atombios_set_edp_panel_power(connector,
1090 ATOM_TRANSMITTER_ACTION_POWER_ON);
1091 ret = radeon_ddc_get_modes(radeon_connector);
1092 if (!radeon_dig_connector->edp_on)
1093 atombios_set_edp_panel_power(connector,
1094 ATOM_TRANSMITTER_ACTION_POWER_OFF);
1095
1096 if (ret > 0) {
1097 if (encoder) {
1098 radeon_fixup_lvds_native_mode(encoder, connector);
1099 /* add scaled modes */
1100 radeon_add_common_modes(encoder, connector);
1101 }
1102 return ret;
1103 }
1104
1105 encoder = radeon_best_single_encoder(connector);
1106 if (!encoder)
1107 return 0;
1108
1109 /* we have no EDID modes */
1110 mode = radeon_fp_native_mode(encoder);
1111 if (mode) {
1112 ret = 1;
1113 drm_mode_probed_add(connector, mode);
1114 /* add the width/height from vbios tables if available */
1115 connector->display_info.width_mm = mode->width_mm;
1116 connector->display_info.height_mm = mode->height_mm;
1117 /* add scaled modes */
1118 radeon_add_common_modes(encoder, connector);
1119 }
1120 } else {
1121 /* need to setup ddc on the bridge */
1122 if (radeon_connector_encoder_is_dp_bridge(connector)) {
1123 if (encoder)
1124 radeon_atom_ext_encoder_setup_ddc(encoder);
1125 }
1126 ret = radeon_ddc_get_modes(radeon_connector);
1127 }
1128
976 return ret; 1129 return ret;
977} 1130}
978 1131
1132bool radeon_connector_encoder_is_dp_bridge(struct drm_connector *connector)
1133{
1134 struct drm_mode_object *obj;
1135 struct drm_encoder *encoder;
1136 struct radeon_encoder *radeon_encoder;
1137 int i;
1138 bool found = false;
1139
1140 for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
1141 if (connector->encoder_ids[i] == 0)
1142 break;
1143
1144 obj = drm_mode_object_find(connector->dev, connector->encoder_ids[i], DRM_MODE_OBJECT_ENCODER);
1145 if (!obj)
1146 continue;
1147
1148 encoder = obj_to_encoder(obj);
1149 radeon_encoder = to_radeon_encoder(encoder);
1150
1151 switch (radeon_encoder->encoder_id) {
1152 case ENCODER_OBJECT_ID_TRAVIS:
1153 case ENCODER_OBJECT_ID_NUTMEG:
1154 found = true;
1155 break;
1156 default:
1157 break;
1158 }
1159 }
1160
1161 return found;
1162}
1163
1164bool radeon_connector_encoder_is_hbr2(struct drm_connector *connector)
1165{
1166 struct drm_mode_object *obj;
1167 struct drm_encoder *encoder;
1168 struct radeon_encoder *radeon_encoder;
1169 int i;
1170 bool found = false;
1171
1172 for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
1173 if (connector->encoder_ids[i] == 0)
1174 break;
1175
1176 obj = drm_mode_object_find(connector->dev, connector->encoder_ids[i], DRM_MODE_OBJECT_ENCODER);
1177 if (!obj)
1178 continue;
1179
1180 encoder = obj_to_encoder(obj);
1181 radeon_encoder = to_radeon_encoder(encoder);
1182 if (radeon_encoder->caps & ATOM_ENCODER_CAP_RECORD_HBR2)
1183 found = true;
1184 }
1185
1186 return found;
1187}
1188
1189bool radeon_connector_is_dp12_capable(struct drm_connector *connector)
1190{
1191 struct drm_device *dev = connector->dev;
1192 struct radeon_device *rdev = dev->dev_private;
1193
1194 if (ASIC_IS_DCE5(rdev) &&
1195 (rdev->clock.dp_extclk >= 53900) &&
1196 radeon_connector_encoder_is_hbr2(connector)) {
1197 return true;
1198 }
1199
1200 return false;
1201}
1202
979static enum drm_connector_status 1203static enum drm_connector_status
980radeon_dp_detect(struct drm_connector *connector, bool force) 1204radeon_dp_detect(struct drm_connector *connector, bool force)
981{ 1205{
1206 struct drm_device *dev = connector->dev;
1207 struct radeon_device *rdev = dev->dev_private;
982 struct radeon_connector *radeon_connector = to_radeon_connector(connector); 1208 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
983 enum drm_connector_status ret = connector_status_disconnected; 1209 enum drm_connector_status ret = connector_status_disconnected;
984 struct radeon_connector_atom_dig *radeon_dig_connector = radeon_connector->con_priv; 1210 struct radeon_connector_atom_dig *radeon_dig_connector = radeon_connector->con_priv;
1211 struct drm_encoder *encoder = radeon_best_single_encoder(connector);
985 1212
986 if (radeon_connector->edid) { 1213 if (radeon_connector->edid) {
987 kfree(radeon_connector->edid); 1214 kfree(radeon_connector->edid);
988 radeon_connector->edid = NULL; 1215 radeon_connector->edid = NULL;
989 } 1216 }
990 1217
991 if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) { 1218 if ((connector->connector_type == DRM_MODE_CONNECTOR_eDP) ||
1219 (connector->connector_type == DRM_MODE_CONNECTOR_LVDS)) {
1220 if (encoder) {
1221 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
1222 struct drm_display_mode *native_mode = &radeon_encoder->native_mode;
1223
1224 /* check if panel is valid */
1225 if (native_mode->hdisplay >= 320 && native_mode->vdisplay >= 240)
1226 ret = connector_status_connected;
1227 }
992 /* eDP is always DP */ 1228 /* eDP is always DP */
993 radeon_dig_connector->dp_sink_type = CONNECTOR_OBJECT_ID_DISPLAYPORT; 1229 radeon_dig_connector->dp_sink_type = CONNECTOR_OBJECT_ID_DISPLAYPORT;
1230 if (!radeon_dig_connector->edp_on)
1231 atombios_set_edp_panel_power(connector,
1232 ATOM_TRANSMITTER_ACTION_POWER_ON);
994 if (radeon_dp_getdpcd(radeon_connector)) 1233 if (radeon_dp_getdpcd(radeon_connector))
995 ret = connector_status_connected; 1234 ret = connector_status_connected;
1235 if (!radeon_dig_connector->edp_on)
1236 atombios_set_edp_panel_power(connector,
1237 ATOM_TRANSMITTER_ACTION_POWER_OFF);
996 } else { 1238 } else {
1239 /* need to setup ddc on the bridge */
1240 if (radeon_connector_encoder_is_dp_bridge(connector)) {
1241 if (encoder)
1242 radeon_atom_ext_encoder_setup_ddc(encoder);
1243 }
997 radeon_dig_connector->dp_sink_type = radeon_dp_getsinktype(radeon_connector); 1244 radeon_dig_connector->dp_sink_type = radeon_dp_getsinktype(radeon_connector);
998 if (radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) { 1245 if (radeon_hpd_sense(rdev, radeon_connector->hpd.hpd)) {
999 if (radeon_dp_getdpcd(radeon_connector)) 1246 ret = connector_status_connected;
1000 ret = connector_status_connected; 1247 if (radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT)
1248 radeon_dp_getdpcd(radeon_connector);
1001 } else { 1249 } else {
1002 if (radeon_ddc_probe(radeon_connector)) 1250 if (radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) {
1003 ret = connector_status_connected; 1251 if (radeon_dp_getdpcd(radeon_connector))
1252 ret = connector_status_connected;
1253 } else {
1254 if (radeon_ddc_probe(radeon_connector))
1255 ret = connector_status_connected;
1256 }
1257 }
1258
1259 if ((ret == connector_status_disconnected) &&
1260 radeon_connector->dac_load_detect) {
1261 struct drm_encoder *encoder = radeon_best_single_encoder(connector);
1262 struct drm_encoder_helper_funcs *encoder_funcs;
1263 if (encoder) {
1264 encoder_funcs = encoder->helper_private;
1265 ret = encoder_funcs->detect(encoder, connector);
1266 }
1004 } 1267 }
1005 } 1268 }
1006 1269
@@ -1016,11 +1279,39 @@ static int radeon_dp_mode_valid(struct drm_connector *connector,
1016 1279
1017 /* XXX check mode bandwidth */ 1280 /* XXX check mode bandwidth */
1018 1281
1019 if ((radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) || 1282 if ((connector->connector_type == DRM_MODE_CONNECTOR_eDP) ||
1020 (radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP)) 1283 (connector->connector_type == DRM_MODE_CONNECTOR_LVDS)) {
1021 return radeon_dp_mode_valid_helper(radeon_connector, mode); 1284 struct drm_encoder *encoder = radeon_best_single_encoder(connector);
1022 else 1285
1286 if ((mode->hdisplay < 320) || (mode->vdisplay < 240))
1287 return MODE_PANEL;
1288
1289 if (encoder) {
1290 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
1291 struct drm_display_mode *native_mode = &radeon_encoder->native_mode;
1292
1293 /* AVIVO hardware supports downscaling modes larger than the panel
1294 * to the panel size, but I'm not sure this is desirable.
1295 */
1296 if ((mode->hdisplay > native_mode->hdisplay) ||
1297 (mode->vdisplay > native_mode->vdisplay))
1298 return MODE_PANEL;
1299
1300 /* if scaling is disabled, block non-native modes */
1301 if (radeon_encoder->rmx_type == RMX_OFF) {
1302 if ((mode->hdisplay != native_mode->hdisplay) ||
1303 (mode->vdisplay != native_mode->vdisplay))
1304 return MODE_PANEL;
1305 }
1306 }
1023 return MODE_OK; 1307 return MODE_OK;
1308 } else {
1309 if ((radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) ||
1310 (radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP))
1311 return radeon_dp_mode_valid_helper(connector, mode);
1312 else
1313 return MODE_OK;
1314 }
1024} 1315}
1025 1316
1026struct drm_connector_helper_funcs radeon_dp_connector_helper_funcs = { 1317struct drm_connector_helper_funcs radeon_dp_connector_helper_funcs = {
@@ -1053,8 +1344,11 @@ radeon_add_atom_connector(struct drm_device *dev,
1053 struct drm_connector *connector; 1344 struct drm_connector *connector;
1054 struct radeon_connector *radeon_connector; 1345 struct radeon_connector *radeon_connector;
1055 struct radeon_connector_atom_dig *radeon_dig_connector; 1346 struct radeon_connector_atom_dig *radeon_dig_connector;
1347 struct drm_encoder *encoder;
1348 struct radeon_encoder *radeon_encoder;
1056 uint32_t subpixel_order = SubPixelNone; 1349 uint32_t subpixel_order = SubPixelNone;
1057 bool shared_ddc = false; 1350 bool shared_ddc = false;
1351 bool is_dp_bridge = false;
1058 1352
1059 if (connector_type == DRM_MODE_CONNECTOR_Unknown) 1353 if (connector_type == DRM_MODE_CONNECTOR_Unknown)
1060 return; 1354 return;
@@ -1078,7 +1372,7 @@ radeon_add_atom_connector(struct drm_device *dev,
1078 radeon_connector->shared_ddc = true; 1372 radeon_connector->shared_ddc = true;
1079 shared_ddc = true; 1373 shared_ddc = true;
1080 } 1374 }
1081 if (radeon_connector->router_bus && router->valid && 1375 if (radeon_connector->router_bus && router->ddc_valid &&
1082 (radeon_connector->router.router_id == router->router_id)) { 1376 (radeon_connector->router.router_id == router->router_id)) {
1083 radeon_connector->shared_ddc = false; 1377 radeon_connector->shared_ddc = false;
1084 shared_ddc = false; 1378 shared_ddc = false;
@@ -1086,6 +1380,21 @@ radeon_add_atom_connector(struct drm_device *dev,
1086 } 1380 }
1087 } 1381 }
1088 1382
1383 /* check if it's a dp bridge */
1384 list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
1385 radeon_encoder = to_radeon_encoder(encoder);
1386 if (radeon_encoder->devices & supported_device) {
1387 switch (radeon_encoder->encoder_id) {
1388 case ENCODER_OBJECT_ID_TRAVIS:
1389 case ENCODER_OBJECT_ID_NUTMEG:
1390 is_dp_bridge = true;
1391 break;
1392 default:
1393 break;
1394 }
1395 }
1396 }
1397
1089 radeon_connector = kzalloc(sizeof(struct radeon_connector), GFP_KERNEL); 1398 radeon_connector = kzalloc(sizeof(struct radeon_connector), GFP_KERNEL);
1090 if (!radeon_connector) 1399 if (!radeon_connector)
1091 return; 1400 return;
@@ -1098,158 +1407,291 @@ radeon_add_atom_connector(struct drm_device *dev,
1098 radeon_connector->connector_object_id = connector_object_id; 1407 radeon_connector->connector_object_id = connector_object_id;
1099 radeon_connector->hpd = *hpd; 1408 radeon_connector->hpd = *hpd;
1100 radeon_connector->router = *router; 1409 radeon_connector->router = *router;
1101 if (router->valid) { 1410 if (router->ddc_valid || router->cd_valid) {
1102 radeon_connector->router_bus = radeon_i2c_lookup(rdev, &router->i2c_info); 1411 radeon_connector->router_bus = radeon_i2c_lookup(rdev, &router->i2c_info);
1103 if (!radeon_connector->router_bus) 1412 if (!radeon_connector->router_bus)
1104 goto failed; 1413 DRM_ERROR("Failed to assign router i2c bus! Check dmesg for i2c errors.\n");
1105 } 1414 }
1106 switch (connector_type) { 1415
1107 case DRM_MODE_CONNECTOR_VGA: 1416 if (is_dp_bridge) {
1108 drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type);
1109 drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs);
1110 if (i2c_bus->valid) {
1111 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
1112 if (!radeon_connector->ddc_bus)
1113 goto failed;
1114 }
1115 radeon_connector->dac_load_detect = true;
1116 drm_connector_attach_property(&radeon_connector->base,
1117 rdev->mode_info.load_detect_property,
1118 1);
1119 /* no HPD on analog connectors */
1120 radeon_connector->hpd.hpd = RADEON_HPD_NONE;
1121 connector->polled = DRM_CONNECTOR_POLL_CONNECT;
1122 break;
1123 case DRM_MODE_CONNECTOR_DVIA:
1124 drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type);
1125 drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs);
1126 if (i2c_bus->valid) {
1127 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
1128 if (!radeon_connector->ddc_bus)
1129 goto failed;
1130 }
1131 radeon_connector->dac_load_detect = true;
1132 drm_connector_attach_property(&radeon_connector->base,
1133 rdev->mode_info.load_detect_property,
1134 1);
1135 /* no HPD on analog connectors */
1136 radeon_connector->hpd.hpd = RADEON_HPD_NONE;
1137 break;
1138 case DRM_MODE_CONNECTOR_DVII:
1139 case DRM_MODE_CONNECTOR_DVID:
1140 radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL); 1417 radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL);
1141 if (!radeon_dig_connector) 1418 if (!radeon_dig_connector)
1142 goto failed; 1419 goto failed;
1143 radeon_dig_connector->igp_lane_info = igp_lane_info; 1420 radeon_dig_connector->igp_lane_info = igp_lane_info;
1144 radeon_connector->con_priv = radeon_dig_connector; 1421 radeon_connector->con_priv = radeon_dig_connector;
1145 drm_connector_init(dev, &radeon_connector->base, &radeon_dvi_connector_funcs, connector_type); 1422 drm_connector_init(dev, &radeon_connector->base, &radeon_dp_connector_funcs, connector_type);
1146 drm_connector_helper_add(&radeon_connector->base, &radeon_dvi_connector_helper_funcs); 1423 drm_connector_helper_add(&radeon_connector->base, &radeon_dp_connector_helper_funcs);
1147 if (i2c_bus->valid) { 1424 if (i2c_bus->valid) {
1425 /* add DP i2c bus */
1426 if (connector_type == DRM_MODE_CONNECTOR_eDP)
1427 radeon_dig_connector->dp_i2c_bus = radeon_i2c_create_dp(dev, i2c_bus, "eDP-auxch");
1428 else
1429 radeon_dig_connector->dp_i2c_bus = radeon_i2c_create_dp(dev, i2c_bus, "DP-auxch");
1430 if (!radeon_dig_connector->dp_i2c_bus)
1431 DRM_ERROR("DP: Failed to assign dp ddc bus! Check dmesg for i2c errors.\n");
1148 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); 1432 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
1149 if (!radeon_connector->ddc_bus) 1433 if (!radeon_connector->ddc_bus)
1150 goto failed; 1434 DRM_ERROR("DP: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1151 } 1435 }
1152 subpixel_order = SubPixelHorizontalRGB; 1436 switch (connector_type) {
1153 drm_connector_attach_property(&radeon_connector->base, 1437 case DRM_MODE_CONNECTOR_VGA:
1154 rdev->mode_info.coherent_mode_property, 1438 case DRM_MODE_CONNECTOR_DVIA:
1155 1); 1439 default:
1156 if (ASIC_IS_AVIVO(rdev)) 1440 connector->interlace_allowed = true;
1441 connector->doublescan_allowed = true;
1442 radeon_connector->dac_load_detect = true;
1443 drm_connector_attach_property(&radeon_connector->base,
1444 rdev->mode_info.load_detect_property,
1445 1);
1446 break;
1447 case DRM_MODE_CONNECTOR_DVII:
1448 case DRM_MODE_CONNECTOR_DVID:
1449 case DRM_MODE_CONNECTOR_HDMIA:
1450 case DRM_MODE_CONNECTOR_HDMIB:
1451 case DRM_MODE_CONNECTOR_DisplayPort:
1157 drm_connector_attach_property(&radeon_connector->base, 1452 drm_connector_attach_property(&radeon_connector->base,
1158 rdev->mode_info.underscan_property, 1453 rdev->mode_info.underscan_property,
1159 UNDERSCAN_AUTO); 1454 UNDERSCAN_OFF);
1160 if (connector_type == DRM_MODE_CONNECTOR_DVII) { 1455 drm_connector_attach_property(&radeon_connector->base,
1456 rdev->mode_info.underscan_hborder_property,
1457 0);
1458 drm_connector_attach_property(&radeon_connector->base,
1459 rdev->mode_info.underscan_vborder_property,
1460 0);
1461 subpixel_order = SubPixelHorizontalRGB;
1462 connector->interlace_allowed = true;
1463 if (connector_type == DRM_MODE_CONNECTOR_HDMIB)
1464 connector->doublescan_allowed = true;
1465 else
1466 connector->doublescan_allowed = false;
1467 if (connector_type == DRM_MODE_CONNECTOR_DVII) {
1468 radeon_connector->dac_load_detect = true;
1469 drm_connector_attach_property(&radeon_connector->base,
1470 rdev->mode_info.load_detect_property,
1471 1);
1472 }
1473 break;
1474 case DRM_MODE_CONNECTOR_LVDS:
1475 case DRM_MODE_CONNECTOR_eDP:
1476 drm_connector_attach_property(&radeon_connector->base,
1477 dev->mode_config.scaling_mode_property,
1478 DRM_MODE_SCALE_FULLSCREEN);
1479 subpixel_order = SubPixelHorizontalRGB;
1480 connector->interlace_allowed = false;
1481 connector->doublescan_allowed = false;
1482 break;
1483 }
1484 } else {
1485 switch (connector_type) {
1486 case DRM_MODE_CONNECTOR_VGA:
1487 drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type);
1488 drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs);
1489 if (i2c_bus->valid) {
1490 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
1491 if (!radeon_connector->ddc_bus)
1492 DRM_ERROR("VGA: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1493 }
1161 radeon_connector->dac_load_detect = true; 1494 radeon_connector->dac_load_detect = true;
1162 drm_connector_attach_property(&radeon_connector->base, 1495 drm_connector_attach_property(&radeon_connector->base,
1163 rdev->mode_info.load_detect_property, 1496 rdev->mode_info.load_detect_property,
1164 1); 1497 1);
1165 } 1498 /* no HPD on analog connectors */
1166 break; 1499 radeon_connector->hpd.hpd = RADEON_HPD_NONE;
1167 case DRM_MODE_CONNECTOR_HDMIA: 1500 connector->polled = DRM_CONNECTOR_POLL_CONNECT;
1168 case DRM_MODE_CONNECTOR_HDMIB: 1501 connector->interlace_allowed = true;
1169 radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL); 1502 connector->doublescan_allowed = true;
1170 if (!radeon_dig_connector) 1503 break;
1171 goto failed; 1504 case DRM_MODE_CONNECTOR_DVIA:
1172 radeon_dig_connector->igp_lane_info = igp_lane_info; 1505 drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type);
1173 radeon_connector->con_priv = radeon_dig_connector; 1506 drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs);
1174 drm_connector_init(dev, &radeon_connector->base, &radeon_dvi_connector_funcs, connector_type); 1507 if (i2c_bus->valid) {
1175 drm_connector_helper_add(&radeon_connector->base, &radeon_dvi_connector_helper_funcs); 1508 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
1176 if (i2c_bus->valid) { 1509 if (!radeon_connector->ddc_bus)
1177 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); 1510 DRM_ERROR("DVIA: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1178 if (!radeon_connector->ddc_bus) 1511 }
1512 radeon_connector->dac_load_detect = true;
1513 drm_connector_attach_property(&radeon_connector->base,
1514 rdev->mode_info.load_detect_property,
1515 1);
1516 /* no HPD on analog connectors */
1517 radeon_connector->hpd.hpd = RADEON_HPD_NONE;
1518 connector->interlace_allowed = true;
1519 connector->doublescan_allowed = true;
1520 break;
1521 case DRM_MODE_CONNECTOR_DVII:
1522 case DRM_MODE_CONNECTOR_DVID:
1523 radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL);
1524 if (!radeon_dig_connector)
1179 goto failed; 1525 goto failed;
1180 } 1526 radeon_dig_connector->igp_lane_info = igp_lane_info;
1181 drm_connector_attach_property(&radeon_connector->base, 1527 radeon_connector->con_priv = radeon_dig_connector;
1182 rdev->mode_info.coherent_mode_property, 1528 drm_connector_init(dev, &radeon_connector->base, &radeon_dvi_connector_funcs, connector_type);
1183 1); 1529 drm_connector_helper_add(&radeon_connector->base, &radeon_dvi_connector_helper_funcs);
1184 if (ASIC_IS_AVIVO(rdev)) 1530 if (i2c_bus->valid) {
1531 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
1532 if (!radeon_connector->ddc_bus)
1533 DRM_ERROR("DVI: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1534 }
1535 subpixel_order = SubPixelHorizontalRGB;
1185 drm_connector_attach_property(&radeon_connector->base, 1536 drm_connector_attach_property(&radeon_connector->base,
1186 rdev->mode_info.underscan_property, 1537 rdev->mode_info.coherent_mode_property,
1187 UNDERSCAN_AUTO); 1538 1);
1188 subpixel_order = SubPixelHorizontalRGB; 1539 if (ASIC_IS_AVIVO(rdev)) {
1189 break; 1540 drm_connector_attach_property(&radeon_connector->base,
1190 case DRM_MODE_CONNECTOR_DisplayPort: 1541 rdev->mode_info.underscan_property,
1191 case DRM_MODE_CONNECTOR_eDP: 1542 UNDERSCAN_OFF);
1192 radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL); 1543 drm_connector_attach_property(&radeon_connector->base,
1193 if (!radeon_dig_connector) 1544 rdev->mode_info.underscan_hborder_property,
1194 goto failed; 1545 0);
1195 radeon_dig_connector->igp_lane_info = igp_lane_info; 1546 drm_connector_attach_property(&radeon_connector->base,
1196 radeon_connector->con_priv = radeon_dig_connector; 1547 rdev->mode_info.underscan_vborder_property,
1197 drm_connector_init(dev, &radeon_connector->base, &radeon_dp_connector_funcs, connector_type); 1548 0);
1198 drm_connector_helper_add(&radeon_connector->base, &radeon_dp_connector_helper_funcs); 1549 }
1199 if (i2c_bus->valid) { 1550 if (connector_type == DRM_MODE_CONNECTOR_DVII) {
1200 /* add DP i2c bus */ 1551 radeon_connector->dac_load_detect = true;
1201 if (connector_type == DRM_MODE_CONNECTOR_eDP) 1552 drm_connector_attach_property(&radeon_connector->base,
1202 radeon_dig_connector->dp_i2c_bus = radeon_i2c_create_dp(dev, i2c_bus, "eDP-auxch"); 1553 rdev->mode_info.load_detect_property,
1554 1);
1555 }
1556 connector->interlace_allowed = true;
1557 if (connector_type == DRM_MODE_CONNECTOR_DVII)
1558 connector->doublescan_allowed = true;
1203 else 1559 else
1204 radeon_dig_connector->dp_i2c_bus = radeon_i2c_create_dp(dev, i2c_bus, "DP-auxch"); 1560 connector->doublescan_allowed = false;
1205 if (!radeon_dig_connector->dp_i2c_bus) 1561 break;
1562 case DRM_MODE_CONNECTOR_HDMIA:
1563 case DRM_MODE_CONNECTOR_HDMIB:
1564 radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL);
1565 if (!radeon_dig_connector)
1206 goto failed; 1566 goto failed;
1207 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); 1567 radeon_dig_connector->igp_lane_info = igp_lane_info;
1208 if (!radeon_connector->ddc_bus) 1568 radeon_connector->con_priv = radeon_dig_connector;
1569 drm_connector_init(dev, &radeon_connector->base, &radeon_dvi_connector_funcs, connector_type);
1570 drm_connector_helper_add(&radeon_connector->base, &radeon_dvi_connector_helper_funcs);
1571 if (i2c_bus->valid) {
1572 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
1573 if (!radeon_connector->ddc_bus)
1574 DRM_ERROR("HDMI: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1575 }
1576 drm_connector_attach_property(&radeon_connector->base,
1577 rdev->mode_info.coherent_mode_property,
1578 1);
1579 if (ASIC_IS_AVIVO(rdev)) {
1580 drm_connector_attach_property(&radeon_connector->base,
1581 rdev->mode_info.underscan_property,
1582 UNDERSCAN_OFF);
1583 drm_connector_attach_property(&radeon_connector->base,
1584 rdev->mode_info.underscan_hborder_property,
1585 0);
1586 drm_connector_attach_property(&radeon_connector->base,
1587 rdev->mode_info.underscan_vborder_property,
1588 0);
1589 }
1590 subpixel_order = SubPixelHorizontalRGB;
1591 connector->interlace_allowed = true;
1592 if (connector_type == DRM_MODE_CONNECTOR_HDMIB)
1593 connector->doublescan_allowed = true;
1594 else
1595 connector->doublescan_allowed = false;
1596 break;
1597 case DRM_MODE_CONNECTOR_DisplayPort:
1598 radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL);
1599 if (!radeon_dig_connector)
1209 goto failed; 1600 goto failed;
1210 } 1601 radeon_dig_connector->igp_lane_info = igp_lane_info;
1211 subpixel_order = SubPixelHorizontalRGB; 1602 radeon_connector->con_priv = radeon_dig_connector;
1212 drm_connector_attach_property(&radeon_connector->base, 1603 drm_connector_init(dev, &radeon_connector->base, &radeon_dp_connector_funcs, connector_type);
1213 rdev->mode_info.coherent_mode_property, 1604 drm_connector_helper_add(&radeon_connector->base, &radeon_dp_connector_helper_funcs);
1214 1); 1605 if (i2c_bus->valid) {
1215 if (ASIC_IS_AVIVO(rdev)) 1606 /* add DP i2c bus */
1607 radeon_dig_connector->dp_i2c_bus = radeon_i2c_create_dp(dev, i2c_bus, "DP-auxch");
1608 if (!radeon_dig_connector->dp_i2c_bus)
1609 DRM_ERROR("DP: Failed to assign dp ddc bus! Check dmesg for i2c errors.\n");
1610 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
1611 if (!radeon_connector->ddc_bus)
1612 DRM_ERROR("DP: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1613 }
1614 subpixel_order = SubPixelHorizontalRGB;
1216 drm_connector_attach_property(&radeon_connector->base, 1615 drm_connector_attach_property(&radeon_connector->base,
1217 rdev->mode_info.underscan_property, 1616 rdev->mode_info.coherent_mode_property,
1218 UNDERSCAN_AUTO); 1617 1);
1219 break; 1618 if (ASIC_IS_AVIVO(rdev)) {
1220 case DRM_MODE_CONNECTOR_SVIDEO: 1619 drm_connector_attach_property(&radeon_connector->base,
1221 case DRM_MODE_CONNECTOR_Composite: 1620 rdev->mode_info.underscan_property,
1222 case DRM_MODE_CONNECTOR_9PinDIN: 1621 UNDERSCAN_OFF);
1223 drm_connector_init(dev, &radeon_connector->base, &radeon_tv_connector_funcs, connector_type); 1622 drm_connector_attach_property(&radeon_connector->base,
1224 drm_connector_helper_add(&radeon_connector->base, &radeon_tv_connector_helper_funcs); 1623 rdev->mode_info.underscan_hborder_property,
1225 radeon_connector->dac_load_detect = true; 1624 0);
1226 drm_connector_attach_property(&radeon_connector->base, 1625 drm_connector_attach_property(&radeon_connector->base,
1227 rdev->mode_info.load_detect_property, 1626 rdev->mode_info.underscan_vborder_property,
1228 1); 1627 0);
1229 drm_connector_attach_property(&radeon_connector->base, 1628 }
1230 rdev->mode_info.tv_std_property, 1629 connector->interlace_allowed = true;
1231 radeon_atombios_get_tv_info(rdev)); 1630 /* in theory with a DP to VGA converter... */
1232 /* no HPD on analog connectors */ 1631 connector->doublescan_allowed = false;
1233 radeon_connector->hpd.hpd = RADEON_HPD_NONE; 1632 break;
1234 break; 1633 case DRM_MODE_CONNECTOR_eDP:
1235 case DRM_MODE_CONNECTOR_LVDS: 1634 radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL);
1236 radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL); 1635 if (!radeon_dig_connector)
1237 if (!radeon_dig_connector)
1238 goto failed;
1239 radeon_dig_connector->igp_lane_info = igp_lane_info;
1240 radeon_connector->con_priv = radeon_dig_connector;
1241 drm_connector_init(dev, &radeon_connector->base, &radeon_lvds_connector_funcs, connector_type);
1242 drm_connector_helper_add(&radeon_connector->base, &radeon_lvds_connector_helper_funcs);
1243 if (i2c_bus->valid) {
1244 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
1245 if (!radeon_connector->ddc_bus)
1246 goto failed; 1636 goto failed;
1637 radeon_dig_connector->igp_lane_info = igp_lane_info;
1638 radeon_connector->con_priv = radeon_dig_connector;
1639 drm_connector_init(dev, &radeon_connector->base, &radeon_dp_connector_funcs, connector_type);
1640 drm_connector_helper_add(&radeon_connector->base, &radeon_dp_connector_helper_funcs);
1641 if (i2c_bus->valid) {
1642 /* add DP i2c bus */
1643 radeon_dig_connector->dp_i2c_bus = radeon_i2c_create_dp(dev, i2c_bus, "eDP-auxch");
1644 if (!radeon_dig_connector->dp_i2c_bus)
1645 DRM_ERROR("DP: Failed to assign dp ddc bus! Check dmesg for i2c errors.\n");
1646 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
1647 if (!radeon_connector->ddc_bus)
1648 DRM_ERROR("DP: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1649 }
1650 drm_connector_attach_property(&radeon_connector->base,
1651 dev->mode_config.scaling_mode_property,
1652 DRM_MODE_SCALE_FULLSCREEN);
1653 subpixel_order = SubPixelHorizontalRGB;
1654 connector->interlace_allowed = false;
1655 connector->doublescan_allowed = false;
1656 break;
1657 case DRM_MODE_CONNECTOR_SVIDEO:
1658 case DRM_MODE_CONNECTOR_Composite:
1659 case DRM_MODE_CONNECTOR_9PinDIN:
1660 drm_connector_init(dev, &radeon_connector->base, &radeon_tv_connector_funcs, connector_type);
1661 drm_connector_helper_add(&radeon_connector->base, &radeon_tv_connector_helper_funcs);
1662 radeon_connector->dac_load_detect = true;
1663 drm_connector_attach_property(&radeon_connector->base,
1664 rdev->mode_info.load_detect_property,
1665 1);
1666 drm_connector_attach_property(&radeon_connector->base,
1667 rdev->mode_info.tv_std_property,
1668 radeon_atombios_get_tv_info(rdev));
1669 /* no HPD on analog connectors */
1670 radeon_connector->hpd.hpd = RADEON_HPD_NONE;
1671 connector->interlace_allowed = false;
1672 connector->doublescan_allowed = false;
1673 break;
1674 case DRM_MODE_CONNECTOR_LVDS:
1675 radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL);
1676 if (!radeon_dig_connector)
1677 goto failed;
1678 radeon_dig_connector->igp_lane_info = igp_lane_info;
1679 radeon_connector->con_priv = radeon_dig_connector;
1680 drm_connector_init(dev, &radeon_connector->base, &radeon_lvds_connector_funcs, connector_type);
1681 drm_connector_helper_add(&radeon_connector->base, &radeon_lvds_connector_helper_funcs);
1682 if (i2c_bus->valid) {
1683 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
1684 if (!radeon_connector->ddc_bus)
1685 DRM_ERROR("LVDS: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1686 }
1687 drm_connector_attach_property(&radeon_connector->base,
1688 dev->mode_config.scaling_mode_property,
1689 DRM_MODE_SCALE_FULLSCREEN);
1690 subpixel_order = SubPixelHorizontalRGB;
1691 connector->interlace_allowed = false;
1692 connector->doublescan_allowed = false;
1693 break;
1247 } 1694 }
1248 drm_connector_attach_property(&radeon_connector->base,
1249 dev->mode_config.scaling_mode_property,
1250 DRM_MODE_SCALE_FULLSCREEN);
1251 subpixel_order = SubPixelHorizontalRGB;
1252 break;
1253 } 1695 }
1254 1696
1255 if (radeon_connector->hpd.hpd == RADEON_HPD_NONE) { 1697 if (radeon_connector->hpd.hpd == RADEON_HPD_NONE) {
@@ -1317,7 +1759,7 @@ radeon_add_legacy_connector(struct drm_device *dev,
1317 if (i2c_bus->valid) { 1759 if (i2c_bus->valid) {
1318 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); 1760 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
1319 if (!radeon_connector->ddc_bus) 1761 if (!radeon_connector->ddc_bus)
1320 goto failed; 1762 DRM_ERROR("VGA: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1321 } 1763 }
1322 radeon_connector->dac_load_detect = true; 1764 radeon_connector->dac_load_detect = true;
1323 drm_connector_attach_property(&radeon_connector->base, 1765 drm_connector_attach_property(&radeon_connector->base,
@@ -1326,6 +1768,8 @@ radeon_add_legacy_connector(struct drm_device *dev,
1326 /* no HPD on analog connectors */ 1768 /* no HPD on analog connectors */
1327 radeon_connector->hpd.hpd = RADEON_HPD_NONE; 1769 radeon_connector->hpd.hpd = RADEON_HPD_NONE;
1328 connector->polled = DRM_CONNECTOR_POLL_CONNECT; 1770 connector->polled = DRM_CONNECTOR_POLL_CONNECT;
1771 connector->interlace_allowed = true;
1772 connector->doublescan_allowed = true;
1329 break; 1773 break;
1330 case DRM_MODE_CONNECTOR_DVIA: 1774 case DRM_MODE_CONNECTOR_DVIA:
1331 drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type); 1775 drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type);
@@ -1333,7 +1777,7 @@ radeon_add_legacy_connector(struct drm_device *dev,
1333 if (i2c_bus->valid) { 1777 if (i2c_bus->valid) {
1334 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); 1778 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
1335 if (!radeon_connector->ddc_bus) 1779 if (!radeon_connector->ddc_bus)
1336 goto failed; 1780 DRM_ERROR("DVIA: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1337 } 1781 }
1338 radeon_connector->dac_load_detect = true; 1782 radeon_connector->dac_load_detect = true;
1339 drm_connector_attach_property(&radeon_connector->base, 1783 drm_connector_attach_property(&radeon_connector->base,
@@ -1341,6 +1785,8 @@ radeon_add_legacy_connector(struct drm_device *dev,
1341 1); 1785 1);
1342 /* no HPD on analog connectors */ 1786 /* no HPD on analog connectors */
1343 radeon_connector->hpd.hpd = RADEON_HPD_NONE; 1787 radeon_connector->hpd.hpd = RADEON_HPD_NONE;
1788 connector->interlace_allowed = true;
1789 connector->doublescan_allowed = true;
1344 break; 1790 break;
1345 case DRM_MODE_CONNECTOR_DVII: 1791 case DRM_MODE_CONNECTOR_DVII:
1346 case DRM_MODE_CONNECTOR_DVID: 1792 case DRM_MODE_CONNECTOR_DVID:
@@ -1349,7 +1795,7 @@ radeon_add_legacy_connector(struct drm_device *dev,
1349 if (i2c_bus->valid) { 1795 if (i2c_bus->valid) {
1350 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); 1796 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
1351 if (!radeon_connector->ddc_bus) 1797 if (!radeon_connector->ddc_bus)
1352 goto failed; 1798 DRM_ERROR("DVI: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1353 } 1799 }
1354 if (connector_type == DRM_MODE_CONNECTOR_DVII) { 1800 if (connector_type == DRM_MODE_CONNECTOR_DVII) {
1355 radeon_connector->dac_load_detect = true; 1801 radeon_connector->dac_load_detect = true;
@@ -1358,6 +1804,11 @@ radeon_add_legacy_connector(struct drm_device *dev,
1358 1); 1804 1);
1359 } 1805 }
1360 subpixel_order = SubPixelHorizontalRGB; 1806 subpixel_order = SubPixelHorizontalRGB;
1807 connector->interlace_allowed = true;
1808 if (connector_type == DRM_MODE_CONNECTOR_DVII)
1809 connector->doublescan_allowed = true;
1810 else
1811 connector->doublescan_allowed = false;
1361 break; 1812 break;
1362 case DRM_MODE_CONNECTOR_SVIDEO: 1813 case DRM_MODE_CONNECTOR_SVIDEO:
1363 case DRM_MODE_CONNECTOR_Composite: 1814 case DRM_MODE_CONNECTOR_Composite:
@@ -1380,6 +1831,8 @@ radeon_add_legacy_connector(struct drm_device *dev,
1380 radeon_combios_get_tv_info(rdev)); 1831 radeon_combios_get_tv_info(rdev));
1381 /* no HPD on analog connectors */ 1832 /* no HPD on analog connectors */
1382 radeon_connector->hpd.hpd = RADEON_HPD_NONE; 1833 radeon_connector->hpd.hpd = RADEON_HPD_NONE;
1834 connector->interlace_allowed = false;
1835 connector->doublescan_allowed = false;
1383 break; 1836 break;
1384 case DRM_MODE_CONNECTOR_LVDS: 1837 case DRM_MODE_CONNECTOR_LVDS:
1385 drm_connector_init(dev, &radeon_connector->base, &radeon_lvds_connector_funcs, connector_type); 1838 drm_connector_init(dev, &radeon_connector->base, &radeon_lvds_connector_funcs, connector_type);
@@ -1387,12 +1840,14 @@ radeon_add_legacy_connector(struct drm_device *dev,
1387 if (i2c_bus->valid) { 1840 if (i2c_bus->valid) {
1388 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); 1841 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
1389 if (!radeon_connector->ddc_bus) 1842 if (!radeon_connector->ddc_bus)
1390 goto failed; 1843 DRM_ERROR("LVDS: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1391 } 1844 }
1392 drm_connector_attach_property(&radeon_connector->base, 1845 drm_connector_attach_property(&radeon_connector->base,
1393 dev->mode_config.scaling_mode_property, 1846 dev->mode_config.scaling_mode_property,
1394 DRM_MODE_SCALE_FULLSCREEN); 1847 DRM_MODE_SCALE_FULLSCREEN);
1395 subpixel_order = SubPixelHorizontalRGB; 1848 subpixel_order = SubPixelHorizontalRGB;
1849 connector->interlace_allowed = false;
1850 connector->doublescan_allowed = false;
1396 break; 1851 break;
1397 } 1852 }
1398 1853
@@ -1403,9 +1858,15 @@ radeon_add_legacy_connector(struct drm_device *dev,
1403 connector->polled = DRM_CONNECTOR_POLL_HPD; 1858 connector->polled = DRM_CONNECTOR_POLL_HPD;
1404 connector->display_info.subpixel_order = subpixel_order; 1859 connector->display_info.subpixel_order = subpixel_order;
1405 drm_sysfs_connector_add(connector); 1860 drm_sysfs_connector_add(connector);
1406 return; 1861 if (connector_type == DRM_MODE_CONNECTOR_LVDS) {
1862 struct drm_encoder *drm_encoder;
1407 1863
1408failed: 1864 list_for_each_entry(drm_encoder, &dev->mode_config.encoder_list, head) {
1409 drm_connector_cleanup(connector); 1865 struct radeon_encoder *radeon_encoder;
1410 kfree(connector); 1866
1867 radeon_encoder = to_radeon_encoder(drm_encoder);
1868 if (radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_LVDS)
1869 radeon_legacy_backlight_init(radeon_encoder, connector);
1870 }
1871 }
1411} 1872}
diff --git a/drivers/gpu/drm/radeon/radeon_cp.c b/drivers/gpu/drm/radeon/radeon_cp.c
index eb6b9eed7349..75867792a4e2 100644
--- a/drivers/gpu/drm/radeon/radeon_cp.c
+++ b/drivers/gpu/drm/radeon/radeon_cp.c
@@ -244,7 +244,7 @@ void radeon_write_agp_base(drm_radeon_private_t *dev_priv, u64 agp_base)
244 u32 agp_base_lo = agp_base & 0xffffffff; 244 u32 agp_base_lo = agp_base & 0xffffffff;
245 u32 r6xx_agp_base = (agp_base >> 22) & 0x3ffff; 245 u32 r6xx_agp_base = (agp_base >> 22) & 0x3ffff;
246 246
247 /* R6xx/R7xx must be aligned to a 4MB boundry */ 247 /* R6xx/R7xx must be aligned to a 4MB boundary */
248 if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RV770) 248 if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RV770)
249 RADEON_WRITE(R700_MC_VM_AGP_BASE, r6xx_agp_base); 249 RADEON_WRITE(R700_MC_VM_AGP_BASE, r6xx_agp_base);
250 else if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600) 250 else if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600)
@@ -2113,9 +2113,9 @@ int radeon_driver_load(struct drm_device *dev, unsigned long flags)
2113 break; 2113 break;
2114 } 2114 }
2115 2115
2116 if (drm_device_is_agp(dev)) 2116 if (drm_pci_device_is_agp(dev))
2117 dev_priv->flags |= RADEON_IS_AGP; 2117 dev_priv->flags |= RADEON_IS_AGP;
2118 else if (drm_device_is_pcie(dev)) 2118 else if (drm_pci_device_is_pcie(dev))
2119 dev_priv->flags |= RADEON_IS_PCIE; 2119 dev_priv->flags |= RADEON_IS_PCIE;
2120 else 2120 else
2121 dev_priv->flags |= RADEON_IS_PCI; 2121 dev_priv->flags |= RADEON_IS_PCI;
diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c
index fcc79b5d22d1..fae00c0d75aa 100644
--- a/drivers/gpu/drm/radeon/radeon_cs.c
+++ b/drivers/gpu/drm/radeon/radeon_cs.c
@@ -75,15 +75,15 @@ int radeon_cs_parser_relocs(struct radeon_cs_parser *p)
75 return -ENOENT; 75 return -ENOENT;
76 } 76 }
77 p->relocs_ptr[i] = &p->relocs[i]; 77 p->relocs_ptr[i] = &p->relocs[i];
78 p->relocs[i].robj = p->relocs[i].gobj->driver_private; 78 p->relocs[i].robj = gem_to_radeon_bo(p->relocs[i].gobj);
79 p->relocs[i].lobj.bo = p->relocs[i].robj; 79 p->relocs[i].lobj.bo = p->relocs[i].robj;
80 p->relocs[i].lobj.rdomain = r->read_domains;
81 p->relocs[i].lobj.wdomain = r->write_domain; 80 p->relocs[i].lobj.wdomain = r->write_domain;
81 p->relocs[i].lobj.rdomain = r->read_domains;
82 p->relocs[i].lobj.tv.bo = &p->relocs[i].robj->tbo;
82 p->relocs[i].handle = r->handle; 83 p->relocs[i].handle = r->handle;
83 p->relocs[i].flags = r->flags; 84 p->relocs[i].flags = r->flags;
84 INIT_LIST_HEAD(&p->relocs[i].lobj.list);
85 radeon_bo_list_add_object(&p->relocs[i].lobj, 85 radeon_bo_list_add_object(&p->relocs[i].lobj,
86 &p->validated); 86 &p->validated);
87 } 87 }
88 } 88 }
89 return radeon_bo_list_validate(&p->validated); 89 return radeon_bo_list_validate(&p->validated);
@@ -189,10 +189,13 @@ static void radeon_cs_parser_fini(struct radeon_cs_parser *parser, int error)
189{ 189{
190 unsigned i; 190 unsigned i;
191 191
192 if (!error && parser->ib) { 192
193 radeon_bo_list_fence(&parser->validated, parser->ib->fence); 193 if (!error && parser->ib)
194 } 194 ttm_eu_fence_buffer_objects(&parser->validated,
195 radeon_bo_list_unreserve(&parser->validated); 195 parser->ib->fence);
196 else
197 ttm_eu_backoff_reservation(&parser->validated);
198
196 if (parser->relocs != NULL) { 199 if (parser->relocs != NULL) {
197 for (i = 0; i < parser->nrelocs; i++) { 200 for (i = 0; i < parser->nrelocs; i++) {
198 if (parser->relocs[i].gobj) 201 if (parser->relocs[i].gobj)
@@ -225,6 +228,7 @@ int radeon_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
225 parser.filp = filp; 228 parser.filp = filp;
226 parser.rdev = rdev; 229 parser.rdev = rdev;
227 parser.dev = rdev->dev; 230 parser.dev = rdev->dev;
231 parser.family = rdev->family;
228 r = radeon_cs_parser_init(&parser, data); 232 r = radeon_cs_parser_init(&parser, data);
229 if (r) { 233 if (r) {
230 DRM_ERROR("Failed to initialize parser !\n"); 234 DRM_ERROR("Failed to initialize parser !\n");
@@ -268,7 +272,7 @@ int radeon_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
268 } 272 }
269 r = radeon_ib_schedule(rdev, parser.ib); 273 r = radeon_ib_schedule(rdev, parser.ib);
270 if (r) { 274 if (r) {
271 DRM_ERROR("Faild to schedule IB !\n"); 275 DRM_ERROR("Failed to schedule IB !\n");
272 } 276 }
273 radeon_cs_parser_fini(&parser, r); 277 radeon_cs_parser_fini(&parser, r);
274 mutex_unlock(&rdev->cs_mutex); 278 mutex_unlock(&rdev->cs_mutex);
diff --git a/drivers/gpu/drm/radeon/radeon_cursor.c b/drivers/gpu/drm/radeon/radeon_cursor.c
index 3eef567b0421..3189a7efb2e9 100644
--- a/drivers/gpu/drm/radeon/radeon_cursor.c
+++ b/drivers/gpu/drm/radeon/radeon_cursor.c
@@ -118,22 +118,25 @@ static void radeon_show_cursor(struct drm_crtc *crtc)
118} 118}
119 119
120static void radeon_set_cursor(struct drm_crtc *crtc, struct drm_gem_object *obj, 120static void radeon_set_cursor(struct drm_crtc *crtc, struct drm_gem_object *obj,
121 uint32_t gpu_addr) 121 uint64_t gpu_addr)
122{ 122{
123 struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); 123 struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
124 struct radeon_device *rdev = crtc->dev->dev_private; 124 struct radeon_device *rdev = crtc->dev->dev_private;
125 125
126 if (ASIC_IS_DCE4(rdev)) { 126 if (ASIC_IS_DCE4(rdev)) {
127 WREG32(EVERGREEN_CUR_SURFACE_ADDRESS_HIGH + radeon_crtc->crtc_offset, 0); 127 WREG32(EVERGREEN_CUR_SURFACE_ADDRESS_HIGH + radeon_crtc->crtc_offset,
128 WREG32(EVERGREEN_CUR_SURFACE_ADDRESS + radeon_crtc->crtc_offset, gpu_addr); 128 upper_32_bits(gpu_addr));
129 WREG32(EVERGREEN_CUR_SURFACE_ADDRESS + radeon_crtc->crtc_offset,
130 gpu_addr & 0xffffffff);
129 } else if (ASIC_IS_AVIVO(rdev)) { 131 } else if (ASIC_IS_AVIVO(rdev)) {
130 if (rdev->family >= CHIP_RV770) { 132 if (rdev->family >= CHIP_RV770) {
131 if (radeon_crtc->crtc_id) 133 if (radeon_crtc->crtc_id)
132 WREG32(R700_D2CUR_SURFACE_ADDRESS_HIGH, 0); 134 WREG32(R700_D2CUR_SURFACE_ADDRESS_HIGH, upper_32_bits(gpu_addr));
133 else 135 else
134 WREG32(R700_D1CUR_SURFACE_ADDRESS_HIGH, 0); 136 WREG32(R700_D1CUR_SURFACE_ADDRESS_HIGH, upper_32_bits(gpu_addr));
135 } 137 }
136 WREG32(AVIVO_D1CUR_SURFACE_ADDRESS + radeon_crtc->crtc_offset, gpu_addr); 138 WREG32(AVIVO_D1CUR_SURFACE_ADDRESS + radeon_crtc->crtc_offset,
139 gpu_addr & 0xffffffff);
137 } else { 140 } else {
138 radeon_crtc->legacy_cursor_offset = gpu_addr - radeon_crtc->legacy_display_base_addr; 141 radeon_crtc->legacy_cursor_offset = gpu_addr - radeon_crtc->legacy_display_base_addr;
139 /* offset is from DISP(2)_BASE_ADDRESS */ 142 /* offset is from DISP(2)_BASE_ADDRESS */
@@ -164,9 +167,6 @@ int radeon_crtc_cursor_set(struct drm_crtc *crtc,
164 return -EINVAL; 167 return -EINVAL;
165 } 168 }
166 169
167 radeon_crtc->cursor_width = width;
168 radeon_crtc->cursor_height = height;
169
170 obj = drm_gem_object_lookup(crtc->dev, file_priv, handle); 170 obj = drm_gem_object_lookup(crtc->dev, file_priv, handle);
171 if (!obj) { 171 if (!obj) {
172 DRM_ERROR("Cannot find cursor object %x for crtc %d\n", handle, radeon_crtc->crtc_id); 172 DRM_ERROR("Cannot find cursor object %x for crtc %d\n", handle, radeon_crtc->crtc_id);
@@ -177,6 +177,9 @@ int radeon_crtc_cursor_set(struct drm_crtc *crtc,
177 if (ret) 177 if (ret)
178 goto fail; 178 goto fail;
179 179
180 radeon_crtc->cursor_width = width;
181 radeon_crtc->cursor_height = height;
182
180 radeon_lock_cursor(crtc, true); 183 radeon_lock_cursor(crtc, true);
181 /* XXX only 27 bit offset for legacy cursor */ 184 /* XXX only 27 bit offset for legacy cursor */
182 radeon_set_cursor(crtc, obj, gpu_addr); 185 radeon_set_cursor(crtc, obj, gpu_addr);
@@ -223,7 +226,7 @@ int radeon_crtc_cursor_move(struct drm_crtc *crtc,
223 y += crtc->y; 226 y += crtc->y;
224 DRM_DEBUG("x %d y %d c->x %d c->y %d\n", x, y, crtc->x, crtc->y); 227 DRM_DEBUG("x %d y %d c->x %d c->y %d\n", x, y, crtc->x, crtc->y);
225 228
226 /* avivo cursor image can't end on 128 pixel boundry or 229 /* avivo cursor image can't end on 128 pixel boundary or
227 * go past the end of the frame if both crtcs are enabled 230 * go past the end of the frame if both crtcs are enabled
228 */ 231 */
229 list_for_each_entry(crtc_p, &crtc->dev->mode_config.crtc_list, head) { 232 list_for_each_entry(crtc_p, &crtc->dev->mode_config.crtc_list, head) {
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c
index 256d204a6d24..7cfaa7e2f3b5 100644
--- a/drivers/gpu/drm/radeon/radeon_device.c
+++ b/drivers/gpu/drm/radeon/radeon_device.c
@@ -81,6 +81,13 @@ static const char radeon_family_name[][16] = {
81 "JUNIPER", 81 "JUNIPER",
82 "CYPRESS", 82 "CYPRESS",
83 "HEMLOCK", 83 "HEMLOCK",
84 "PALM",
85 "SUMO",
86 "SUMO2",
87 "BARTS",
88 "TURKS",
89 "CAICOS",
90 "CAYMAN",
84 "LAST", 91 "LAST",
85}; 92};
86 93
@@ -117,9 +124,10 @@ void radeon_scratch_init(struct radeon_device *rdev)
117 } else { 124 } else {
118 rdev->scratch.num_reg = 7; 125 rdev->scratch.num_reg = 7;
119 } 126 }
127 rdev->scratch.reg_base = RADEON_SCRATCH_REG0;
120 for (i = 0; i < rdev->scratch.num_reg; i++) { 128 for (i = 0; i < rdev->scratch.num_reg; i++) {
121 rdev->scratch.free[i] = true; 129 rdev->scratch.free[i] = true;
122 rdev->scratch.reg[i] = RADEON_SCRATCH_REG0 + (i * 4); 130 rdev->scratch.reg[i] = rdev->scratch.reg_base + (i * 4);
123 } 131 }
124} 132}
125 133
@@ -149,6 +157,93 @@ void radeon_scratch_free(struct radeon_device *rdev, uint32_t reg)
149 } 157 }
150} 158}
151 159
160void radeon_wb_disable(struct radeon_device *rdev)
161{
162 int r;
163
164 if (rdev->wb.wb_obj) {
165 r = radeon_bo_reserve(rdev->wb.wb_obj, false);
166 if (unlikely(r != 0))
167 return;
168 radeon_bo_kunmap(rdev->wb.wb_obj);
169 radeon_bo_unpin(rdev->wb.wb_obj);
170 radeon_bo_unreserve(rdev->wb.wb_obj);
171 }
172 rdev->wb.enabled = false;
173}
174
175void radeon_wb_fini(struct radeon_device *rdev)
176{
177 radeon_wb_disable(rdev);
178 if (rdev->wb.wb_obj) {
179 radeon_bo_unref(&rdev->wb.wb_obj);
180 rdev->wb.wb = NULL;
181 rdev->wb.wb_obj = NULL;
182 }
183}
184
185int radeon_wb_init(struct radeon_device *rdev)
186{
187 int r;
188
189 if (rdev->wb.wb_obj == NULL) {
190 r = radeon_bo_create(rdev, RADEON_GPU_PAGE_SIZE, PAGE_SIZE, true,
191 RADEON_GEM_DOMAIN_GTT, &rdev->wb.wb_obj);
192 if (r) {
193 dev_warn(rdev->dev, "(%d) create WB bo failed\n", r);
194 return r;
195 }
196 }
197 r = radeon_bo_reserve(rdev->wb.wb_obj, false);
198 if (unlikely(r != 0)) {
199 radeon_wb_fini(rdev);
200 return r;
201 }
202 r = radeon_bo_pin(rdev->wb.wb_obj, RADEON_GEM_DOMAIN_GTT,
203 &rdev->wb.gpu_addr);
204 if (r) {
205 radeon_bo_unreserve(rdev->wb.wb_obj);
206 dev_warn(rdev->dev, "(%d) pin WB bo failed\n", r);
207 radeon_wb_fini(rdev);
208 return r;
209 }
210 r = radeon_bo_kmap(rdev->wb.wb_obj, (void **)&rdev->wb.wb);
211 radeon_bo_unreserve(rdev->wb.wb_obj);
212 if (r) {
213 dev_warn(rdev->dev, "(%d) map WB bo failed\n", r);
214 radeon_wb_fini(rdev);
215 return r;
216 }
217
218 /* clear wb memory */
219 memset((char *)rdev->wb.wb, 0, RADEON_GPU_PAGE_SIZE);
220 /* disable event_write fences */
221 rdev->wb.use_event = false;
222 /* disabled via module param */
223 if (radeon_no_wb == 1)
224 rdev->wb.enabled = false;
225 else {
226 /* often unreliable on AGP */
227 if (rdev->flags & RADEON_IS_AGP) {
228 rdev->wb.enabled = false;
229 } else {
230 rdev->wb.enabled = true;
231 /* event_write fences are only available on r600+ */
232 if (rdev->family >= CHIP_R600)
233 rdev->wb.use_event = true;
234 }
235 }
236 /* always use writeback/events on NI */
237 if (ASIC_IS_DCE5(rdev)) {
238 rdev->wb.enabled = true;
239 rdev->wb.use_event = true;
240 }
241
242 dev_info(rdev->dev, "WB %sabled\n", rdev->wb.enabled ? "en" : "dis");
243
244 return 0;
245}
246
152/** 247/**
153 * radeon_vram_location - try to find VRAM location 248 * radeon_vram_location - try to find VRAM location
154 * @rdev: radeon device structure holding all necessary informations 249 * @rdev: radeon device structure holding all necessary informations
@@ -171,7 +266,7 @@ void radeon_scratch_free(struct radeon_device *rdev, uint32_t reg)
171 * Note: GTT start, end, size should be initialized before calling this 266 * Note: GTT start, end, size should be initialized before calling this
172 * function on AGP platform. 267 * function on AGP platform.
173 * 268 *
174 * Note: We don't explictly enforce VRAM start to be aligned on VRAM size, 269 * Note: We don't explicitly enforce VRAM start to be aligned on VRAM size,
175 * this shouldn't be a problem as we are using the PCI aperture as a reference. 270 * this shouldn't be a problem as we are using the PCI aperture as a reference.
176 * Otherwise this would be needed for rv280, all r3xx, and all r4xx, but 271 * Otherwise this would be needed for rv280, all r3xx, and all r4xx, but
177 * not IGP. 272 * not IGP.
@@ -205,7 +300,7 @@ void radeon_vram_location(struct radeon_device *rdev, struct radeon_mc *mc, u64
205 mc->mc_vram_size = mc->aper_size; 300 mc->mc_vram_size = mc->aper_size;
206 } 301 }
207 mc->vram_end = mc->vram_start + mc->mc_vram_size - 1; 302 mc->vram_end = mc->vram_start + mc->mc_vram_size - 1;
208 dev_info(rdev->dev, "VRAM: %lluM 0x%08llX - 0x%08llX (%lluM used)\n", 303 dev_info(rdev->dev, "VRAM: %lluM 0x%016llX - 0x%016llX (%lluM used)\n",
209 mc->mc_vram_size >> 20, mc->vram_start, 304 mc->mc_vram_size >> 20, mc->vram_start,
210 mc->vram_end, mc->real_vram_size >> 20); 305 mc->vram_end, mc->real_vram_size >> 20);
211} 306}
@@ -242,7 +337,7 @@ void radeon_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc)
242 mc->gtt_start = (mc->vram_end + 1 + mc->gtt_base_align) & ~mc->gtt_base_align; 337 mc->gtt_start = (mc->vram_end + 1 + mc->gtt_base_align) & ~mc->gtt_base_align;
243 } 338 }
244 mc->gtt_end = mc->gtt_start + mc->gtt_size - 1; 339 mc->gtt_end = mc->gtt_start + mc->gtt_size - 1;
245 dev_info(rdev->dev, "GTT: %lluM 0x%08llX - 0x%08llX\n", 340 dev_info(rdev->dev, "GTT: %lluM 0x%016llX - 0x%016llX\n",
246 mc->gtt_size >> 20, mc->gtt_start, mc->gtt_end); 341 mc->gtt_size >> 20, mc->gtt_start, mc->gtt_end);
247} 342}
248 343
@@ -254,7 +349,12 @@ bool radeon_card_posted(struct radeon_device *rdev)
254 uint32_t reg; 349 uint32_t reg;
255 350
256 /* first check CRTCs */ 351 /* first check CRTCs */
257 if (ASIC_IS_DCE4(rdev)) { 352 if (ASIC_IS_DCE41(rdev)) {
353 reg = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET) |
354 RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET);
355 if (reg & EVERGREEN_CRTC_MASTER_EN)
356 return true;
357 } else if (ASIC_IS_DCE4(rdev)) {
258 reg = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET) | 358 reg = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET) |
259 RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET) | 359 RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET) |
260 RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET) | 360 RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET) |
@@ -555,20 +655,20 @@ void radeon_check_arguments(struct radeon_device *rdev)
555static void radeon_switcheroo_set_state(struct pci_dev *pdev, enum vga_switcheroo_state state) 655static void radeon_switcheroo_set_state(struct pci_dev *pdev, enum vga_switcheroo_state state)
556{ 656{
557 struct drm_device *dev = pci_get_drvdata(pdev); 657 struct drm_device *dev = pci_get_drvdata(pdev);
558 struct radeon_device *rdev = dev->dev_private;
559 pm_message_t pmm = { .event = PM_EVENT_SUSPEND }; 658 pm_message_t pmm = { .event = PM_EVENT_SUSPEND };
560 if (state == VGA_SWITCHEROO_ON) { 659 if (state == VGA_SWITCHEROO_ON) {
561 printk(KERN_INFO "radeon: switched on\n"); 660 printk(KERN_INFO "radeon: switched on\n");
562 /* don't suspend or resume card normally */ 661 /* don't suspend or resume card normally */
563 rdev->powered_down = false; 662 dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;
564 radeon_resume_kms(dev); 663 radeon_resume_kms(dev);
664 dev->switch_power_state = DRM_SWITCH_POWER_ON;
565 drm_kms_helper_poll_enable(dev); 665 drm_kms_helper_poll_enable(dev);
566 } else { 666 } else {
567 printk(KERN_INFO "radeon: switched off\n"); 667 printk(KERN_INFO "radeon: switched off\n");
568 drm_kms_helper_poll_disable(dev); 668 drm_kms_helper_poll_disable(dev);
669 dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;
569 radeon_suspend_kms(dev, pmm); 670 radeon_suspend_kms(dev, pmm);
570 /* don't suspend or resume card normally */ 671 dev->switch_power_state = DRM_SWITCH_POWER_OFF;
571 rdev->powered_down = true;
572 } 672 }
573} 673}
574 674
@@ -623,11 +723,6 @@ int radeon_device_init(struct radeon_device *rdev,
623 init_waitqueue_head(&rdev->irq.vblank_queue); 723 init_waitqueue_head(&rdev->irq.vblank_queue);
624 init_waitqueue_head(&rdev->irq.idle_queue); 724 init_waitqueue_head(&rdev->irq.idle_queue);
625 725
626 /* setup workqueue */
627 rdev->wq = create_workqueue("radeon");
628 if (rdev->wq == NULL)
629 return -ENOMEM;
630
631 /* Set asic functions */ 726 /* Set asic functions */
632 r = radeon_asic_init(rdev); 727 r = radeon_asic_init(rdev);
633 if (r) 728 if (r)
@@ -661,6 +756,7 @@ int radeon_device_init(struct radeon_device *rdev,
661 dma_bits = rdev->need_dma32 ? 32 : 40; 756 dma_bits = rdev->need_dma32 ? 32 : 40;
662 r = pci_set_dma_mask(rdev->pdev, DMA_BIT_MASK(dma_bits)); 757 r = pci_set_dma_mask(rdev->pdev, DMA_BIT_MASK(dma_bits));
663 if (r) { 758 if (r) {
759 rdev->need_dma32 = true;
664 printk(KERN_WARNING "radeon: No suitable DMA available.\n"); 760 printk(KERN_WARNING "radeon: No suitable DMA available.\n");
665 } 761 }
666 762
@@ -692,6 +788,7 @@ int radeon_device_init(struct radeon_device *rdev,
692 vga_client_register(rdev->pdev, rdev, NULL, radeon_vga_set_decode); 788 vga_client_register(rdev->pdev, rdev, NULL, radeon_vga_set_decode);
693 vga_switcheroo_register_client(rdev->pdev, 789 vga_switcheroo_register_client(rdev->pdev,
694 radeon_switcheroo_set_state, 790 radeon_switcheroo_set_state,
791 NULL,
695 radeon_switcheroo_can_switch); 792 radeon_switcheroo_can_switch);
696 793
697 r = radeon_init(rdev); 794 r = radeon_init(rdev);
@@ -725,7 +822,6 @@ void radeon_device_fini(struct radeon_device *rdev)
725 /* evict vram memory */ 822 /* evict vram memory */
726 radeon_bo_evict_vram(rdev); 823 radeon_bo_evict_vram(rdev);
727 radeon_fini(rdev); 824 radeon_fini(rdev);
728 destroy_workqueue(rdev->wq);
729 vga_switcheroo_unregister_client(rdev->pdev); 825 vga_switcheroo_unregister_client(rdev->pdev);
730 vga_client_register(rdev->pdev, NULL, NULL, NULL); 826 vga_client_register(rdev->pdev, NULL, NULL, NULL);
731 if (rdev->rio_mem) 827 if (rdev->rio_mem)
@@ -754,7 +850,7 @@ int radeon_suspend_kms(struct drm_device *dev, pm_message_t state)
754 } 850 }
755 rdev = dev->dev_private; 851 rdev = dev->dev_private;
756 852
757 if (rdev->powered_down) 853 if (dev->switch_power_state == DRM_SWITCH_POWER_OFF)
758 return 0; 854 return 0;
759 855
760 /* turn off display hw */ 856 /* turn off display hw */
@@ -770,7 +866,7 @@ int radeon_suspend_kms(struct drm_device *dev, pm_message_t state)
770 if (rfb == NULL || rfb->obj == NULL) { 866 if (rfb == NULL || rfb->obj == NULL) {
771 continue; 867 continue;
772 } 868 }
773 robj = rfb->obj->driver_private; 869 robj = gem_to_radeon_bo(rfb->obj);
774 /* don't unpin kernel fb objects */ 870 /* don't unpin kernel fb objects */
775 if (!radeon_fbdev_robj_is_fb(rdev, robj)) { 871 if (!radeon_fbdev_robj_is_fb(rdev, robj)) {
776 r = radeon_bo_reserve(robj, false); 872 r = radeon_bo_reserve(robj, false);
@@ -801,9 +897,9 @@ int radeon_suspend_kms(struct drm_device *dev, pm_message_t state)
801 pci_disable_device(dev->pdev); 897 pci_disable_device(dev->pdev);
802 pci_set_power_state(dev->pdev, PCI_D3hot); 898 pci_set_power_state(dev->pdev, PCI_D3hot);
803 } 899 }
804 acquire_console_sem(); 900 console_lock();
805 radeon_fbdev_set_suspend(rdev, 1); 901 radeon_fbdev_set_suspend(rdev, 1);
806 release_console_sem(); 902 console_unlock();
807 return 0; 903 return 0;
808} 904}
809 905
@@ -812,14 +908,14 @@ int radeon_resume_kms(struct drm_device *dev)
812 struct drm_connector *connector; 908 struct drm_connector *connector;
813 struct radeon_device *rdev = dev->dev_private; 909 struct radeon_device *rdev = dev->dev_private;
814 910
815 if (rdev->powered_down) 911 if (dev->switch_power_state == DRM_SWITCH_POWER_OFF)
816 return 0; 912 return 0;
817 913
818 acquire_console_sem(); 914 console_lock();
819 pci_set_power_state(dev->pdev, PCI_D0); 915 pci_set_power_state(dev->pdev, PCI_D0);
820 pci_restore_state(dev->pdev); 916 pci_restore_state(dev->pdev);
821 if (pci_enable_device(dev->pdev)) { 917 if (pci_enable_device(dev->pdev)) {
822 release_console_sem(); 918 console_unlock();
823 return -1; 919 return -1;
824 } 920 }
825 pci_set_master(dev->pdev); 921 pci_set_master(dev->pdev);
@@ -829,26 +925,31 @@ int radeon_resume_kms(struct drm_device *dev)
829 radeon_pm_resume(rdev); 925 radeon_pm_resume(rdev);
830 radeon_restore_bios_scratch_regs(rdev); 926 radeon_restore_bios_scratch_regs(rdev);
831 927
832 /* turn on display hw */
833 list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
834 drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON);
835 }
836
837 radeon_fbdev_set_suspend(rdev, 0); 928 radeon_fbdev_set_suspend(rdev, 0);
838 release_console_sem(); 929 console_unlock();
839 930
931 /* init dig PHYs */
932 if (rdev->is_atom_bios)
933 radeon_atom_encoder_init(rdev);
840 /* reset hpd state */ 934 /* reset hpd state */
841 radeon_hpd_init(rdev); 935 radeon_hpd_init(rdev);
842 /* blat the mode back in */ 936 /* blat the mode back in */
843 drm_helper_resume_force_mode(dev); 937 drm_helper_resume_force_mode(dev);
938 /* turn on display hw */
939 list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
940 drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON);
941 }
844 return 0; 942 return 0;
845} 943}
846 944
847int radeon_gpu_reset(struct radeon_device *rdev) 945int radeon_gpu_reset(struct radeon_device *rdev)
848{ 946{
849 int r; 947 int r;
948 int resched;
850 949
851 radeon_save_bios_scratch_regs(rdev); 950 radeon_save_bios_scratch_regs(rdev);
951 /* block TTM */
952 resched = ttm_bo_lock_delayed_workqueue(&rdev->mman.bdev);
852 radeon_suspend(rdev); 953 radeon_suspend(rdev);
853 954
854 r = radeon_asic_reset(rdev); 955 r = radeon_asic_reset(rdev);
@@ -857,6 +958,7 @@ int radeon_gpu_reset(struct radeon_device *rdev)
857 radeon_resume(rdev); 958 radeon_resume(rdev);
858 radeon_restore_bios_scratch_regs(rdev); 959 radeon_restore_bios_scratch_regs(rdev);
859 drm_helper_resume_force_mode(rdev->ddev); 960 drm_helper_resume_force_mode(rdev->ddev);
961 ttm_bo_unlock_delayed_workqueue(&rdev->mman.bdev, resched);
860 return 0; 962 return 0;
861 } 963 }
862 /* bad news, how to tell it to userspace ? */ 964 /* bad news, how to tell it to userspace ? */
diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c
index b92d2f2fcbed..292f73f0ddbd 100644
--- a/drivers/gpu/drm/radeon/radeon_display.c
+++ b/drivers/gpu/drm/radeon/radeon_display.c
@@ -68,7 +68,7 @@ static void avivo_crtc_load_lut(struct drm_crtc *crtc)
68 WREG32(AVIVO_D1GRPH_LUT_SEL + radeon_crtc->crtc_offset, radeon_crtc->crtc_id); 68 WREG32(AVIVO_D1GRPH_LUT_SEL + radeon_crtc->crtc_offset, radeon_crtc->crtc_id);
69} 69}
70 70
71static void evergreen_crtc_load_lut(struct drm_crtc *crtc) 71static void dce4_crtc_load_lut(struct drm_crtc *crtc)
72{ 72{
73 struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); 73 struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
74 struct drm_device *dev = crtc->dev; 74 struct drm_device *dev = crtc->dev;
@@ -98,6 +98,66 @@ static void evergreen_crtc_load_lut(struct drm_crtc *crtc)
98 } 98 }
99} 99}
100 100
101static void dce5_crtc_load_lut(struct drm_crtc *crtc)
102{
103 struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
104 struct drm_device *dev = crtc->dev;
105 struct radeon_device *rdev = dev->dev_private;
106 int i;
107
108 DRM_DEBUG_KMS("%d\n", radeon_crtc->crtc_id);
109
110 WREG32(NI_INPUT_CSC_CONTROL + radeon_crtc->crtc_offset,
111 (NI_INPUT_CSC_GRPH_MODE(NI_INPUT_CSC_BYPASS) |
112 NI_INPUT_CSC_OVL_MODE(NI_INPUT_CSC_BYPASS)));
113 WREG32(NI_PRESCALE_GRPH_CONTROL + radeon_crtc->crtc_offset,
114 NI_GRPH_PRESCALE_BYPASS);
115 WREG32(NI_PRESCALE_OVL_CONTROL + radeon_crtc->crtc_offset,
116 NI_OVL_PRESCALE_BYPASS);
117 WREG32(NI_INPUT_GAMMA_CONTROL + radeon_crtc->crtc_offset,
118 (NI_GRPH_INPUT_GAMMA_MODE(NI_INPUT_GAMMA_USE_LUT) |
119 NI_OVL_INPUT_GAMMA_MODE(NI_INPUT_GAMMA_USE_LUT)));
120
121 WREG32(EVERGREEN_DC_LUT_CONTROL + radeon_crtc->crtc_offset, 0);
122
123 WREG32(EVERGREEN_DC_LUT_BLACK_OFFSET_BLUE + radeon_crtc->crtc_offset, 0);
124 WREG32(EVERGREEN_DC_LUT_BLACK_OFFSET_GREEN + radeon_crtc->crtc_offset, 0);
125 WREG32(EVERGREEN_DC_LUT_BLACK_OFFSET_RED + radeon_crtc->crtc_offset, 0);
126
127 WREG32(EVERGREEN_DC_LUT_WHITE_OFFSET_BLUE + radeon_crtc->crtc_offset, 0xffff);
128 WREG32(EVERGREEN_DC_LUT_WHITE_OFFSET_GREEN + radeon_crtc->crtc_offset, 0xffff);
129 WREG32(EVERGREEN_DC_LUT_WHITE_OFFSET_RED + radeon_crtc->crtc_offset, 0xffff);
130
131 WREG32(EVERGREEN_DC_LUT_RW_MODE + radeon_crtc->crtc_offset, 0);
132 WREG32(EVERGREEN_DC_LUT_WRITE_EN_MASK + radeon_crtc->crtc_offset, 0x00000007);
133
134 WREG32(EVERGREEN_DC_LUT_RW_INDEX + radeon_crtc->crtc_offset, 0);
135 for (i = 0; i < 256; i++) {
136 WREG32(EVERGREEN_DC_LUT_30_COLOR + radeon_crtc->crtc_offset,
137 (radeon_crtc->lut_r[i] << 20) |
138 (radeon_crtc->lut_g[i] << 10) |
139 (radeon_crtc->lut_b[i] << 0));
140 }
141
142 WREG32(NI_DEGAMMA_CONTROL + radeon_crtc->crtc_offset,
143 (NI_GRPH_DEGAMMA_MODE(NI_DEGAMMA_BYPASS) |
144 NI_OVL_DEGAMMA_MODE(NI_DEGAMMA_BYPASS) |
145 NI_ICON_DEGAMMA_MODE(NI_DEGAMMA_BYPASS) |
146 NI_CURSOR_DEGAMMA_MODE(NI_DEGAMMA_BYPASS)));
147 WREG32(NI_GAMUT_REMAP_CONTROL + radeon_crtc->crtc_offset,
148 (NI_GRPH_GAMUT_REMAP_MODE(NI_GAMUT_REMAP_BYPASS) |
149 NI_OVL_GAMUT_REMAP_MODE(NI_GAMUT_REMAP_BYPASS)));
150 WREG32(NI_REGAMMA_CONTROL + radeon_crtc->crtc_offset,
151 (NI_GRPH_REGAMMA_MODE(NI_REGAMMA_BYPASS) |
152 NI_OVL_REGAMMA_MODE(NI_REGAMMA_BYPASS)));
153 WREG32(NI_OUTPUT_CSC_CONTROL + radeon_crtc->crtc_offset,
154 (NI_OUTPUT_CSC_GRPH_MODE(NI_OUTPUT_CSC_BYPASS) |
155 NI_OUTPUT_CSC_OVL_MODE(NI_OUTPUT_CSC_BYPASS)));
156 /* XXX match this to the depth of the crtc fmt block, move to modeset? */
157 WREG32(0x6940 + radeon_crtc->crtc_offset, 0);
158
159}
160
101static void legacy_crtc_load_lut(struct drm_crtc *crtc) 161static void legacy_crtc_load_lut(struct drm_crtc *crtc)
102{ 162{
103 struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); 163 struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
@@ -130,8 +190,10 @@ void radeon_crtc_load_lut(struct drm_crtc *crtc)
130 if (!crtc->enabled) 190 if (!crtc->enabled)
131 return; 191 return;
132 192
133 if (ASIC_IS_DCE4(rdev)) 193 if (ASIC_IS_DCE5(rdev))
134 evergreen_crtc_load_lut(crtc); 194 dce5_crtc_load_lut(crtc);
195 else if (ASIC_IS_DCE4(rdev))
196 dce4_crtc_load_lut(crtc);
135 else if (ASIC_IS_AVIVO(rdev)) 197 else if (ASIC_IS_AVIVO(rdev))
136 avivo_crtc_load_lut(crtc); 198 avivo_crtc_load_lut(crtc);
137 else 199 else
@@ -183,12 +245,275 @@ static void radeon_crtc_destroy(struct drm_crtc *crtc)
183 kfree(radeon_crtc); 245 kfree(radeon_crtc);
184} 246}
185 247
248/*
249 * Handle unpin events outside the interrupt handler proper.
250 */
251static void radeon_unpin_work_func(struct work_struct *__work)
252{
253 struct radeon_unpin_work *work =
254 container_of(__work, struct radeon_unpin_work, work);
255 int r;
256
257 /* unpin of the old buffer */
258 r = radeon_bo_reserve(work->old_rbo, false);
259 if (likely(r == 0)) {
260 r = radeon_bo_unpin(work->old_rbo);
261 if (unlikely(r != 0)) {
262 DRM_ERROR("failed to unpin buffer after flip\n");
263 }
264 radeon_bo_unreserve(work->old_rbo);
265 } else
266 DRM_ERROR("failed to reserve buffer after flip\n");
267
268 drm_gem_object_unreference_unlocked(&work->old_rbo->gem_base);
269 kfree(work);
270}
271
272void radeon_crtc_handle_flip(struct radeon_device *rdev, int crtc_id)
273{
274 struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id];
275 struct radeon_unpin_work *work;
276 struct drm_pending_vblank_event *e;
277 struct timeval now;
278 unsigned long flags;
279 u32 update_pending;
280 int vpos, hpos;
281
282 spin_lock_irqsave(&rdev->ddev->event_lock, flags);
283 work = radeon_crtc->unpin_work;
284 if (work == NULL ||
285 !radeon_fence_signaled(work->fence)) {
286 spin_unlock_irqrestore(&rdev->ddev->event_lock, flags);
287 return;
288 }
289 /* New pageflip, or just completion of a previous one? */
290 if (!radeon_crtc->deferred_flip_completion) {
291 /* do the flip (mmio) */
292 update_pending = radeon_page_flip(rdev, crtc_id, work->new_crtc_base);
293 } else {
294 /* This is just a completion of a flip queued in crtc
295 * at last invocation. Make sure we go directly to
296 * completion routine.
297 */
298 update_pending = 0;
299 radeon_crtc->deferred_flip_completion = 0;
300 }
301
302 /* Has the pageflip already completed in crtc, or is it certain
303 * to complete in this vblank?
304 */
305 if (update_pending &&
306 (DRM_SCANOUTPOS_VALID & radeon_get_crtc_scanoutpos(rdev->ddev, crtc_id,
307 &vpos, &hpos)) &&
308 (vpos >=0) &&
309 (vpos < (99 * rdev->mode_info.crtcs[crtc_id]->base.hwmode.crtc_vdisplay)/100)) {
310 /* crtc didn't flip in this target vblank interval,
311 * but flip is pending in crtc. It will complete it
312 * in next vblank interval, so complete the flip at
313 * next vblank irq.
314 */
315 radeon_crtc->deferred_flip_completion = 1;
316 spin_unlock_irqrestore(&rdev->ddev->event_lock, flags);
317 return;
318 }
319
320 /* Pageflip (will be) certainly completed in this vblank. Clean up. */
321 radeon_crtc->unpin_work = NULL;
322
323 /* wakeup userspace */
324 if (work->event) {
325 e = work->event;
326 e->event.sequence = drm_vblank_count_and_time(rdev->ddev, crtc_id, &now);
327 e->event.tv_sec = now.tv_sec;
328 e->event.tv_usec = now.tv_usec;
329 list_add_tail(&e->base.link, &e->base.file_priv->event_list);
330 wake_up_interruptible(&e->base.file_priv->event_wait);
331 }
332 spin_unlock_irqrestore(&rdev->ddev->event_lock, flags);
333
334 drm_vblank_put(rdev->ddev, radeon_crtc->crtc_id);
335 radeon_fence_unref(&work->fence);
336 radeon_post_page_flip(work->rdev, work->crtc_id);
337 schedule_work(&work->work);
338}
339
340static int radeon_crtc_page_flip(struct drm_crtc *crtc,
341 struct drm_framebuffer *fb,
342 struct drm_pending_vblank_event *event)
343{
344 struct drm_device *dev = crtc->dev;
345 struct radeon_device *rdev = dev->dev_private;
346 struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
347 struct radeon_framebuffer *old_radeon_fb;
348 struct radeon_framebuffer *new_radeon_fb;
349 struct drm_gem_object *obj;
350 struct radeon_bo *rbo;
351 struct radeon_fence *fence;
352 struct radeon_unpin_work *work;
353 unsigned long flags;
354 u32 tiling_flags, pitch_pixels;
355 u64 base;
356 int r;
357
358 work = kzalloc(sizeof *work, GFP_KERNEL);
359 if (work == NULL)
360 return -ENOMEM;
361
362 r = radeon_fence_create(rdev, &fence);
363 if (unlikely(r != 0)) {
364 kfree(work);
365 DRM_ERROR("flip queue: failed to create fence.\n");
366 return -ENOMEM;
367 }
368 work->event = event;
369 work->rdev = rdev;
370 work->crtc_id = radeon_crtc->crtc_id;
371 work->fence = radeon_fence_ref(fence);
372 old_radeon_fb = to_radeon_framebuffer(crtc->fb);
373 new_radeon_fb = to_radeon_framebuffer(fb);
374 /* schedule unpin of the old buffer */
375 obj = old_radeon_fb->obj;
376 /* take a reference to the old object */
377 drm_gem_object_reference(obj);
378 rbo = gem_to_radeon_bo(obj);
379 work->old_rbo = rbo;
380 INIT_WORK(&work->work, radeon_unpin_work_func);
381
382 /* We borrow the event spin lock for protecting unpin_work */
383 spin_lock_irqsave(&dev->event_lock, flags);
384 if (radeon_crtc->unpin_work) {
385 DRM_DEBUG_DRIVER("flip queue: crtc already busy\n");
386 r = -EBUSY;
387 goto unlock_free;
388 }
389 radeon_crtc->unpin_work = work;
390 radeon_crtc->deferred_flip_completion = 0;
391 spin_unlock_irqrestore(&dev->event_lock, flags);
392
393 /* pin the new buffer */
394 obj = new_radeon_fb->obj;
395 rbo = gem_to_radeon_bo(obj);
396
397 DRM_DEBUG_DRIVER("flip-ioctl() cur_fbo = %p, cur_bbo = %p\n",
398 work->old_rbo, rbo);
399
400 r = radeon_bo_reserve(rbo, false);
401 if (unlikely(r != 0)) {
402 DRM_ERROR("failed to reserve new rbo buffer before flip\n");
403 goto pflip_cleanup;
404 }
405 r = radeon_bo_pin(rbo, RADEON_GEM_DOMAIN_VRAM, &base);
406 if (unlikely(r != 0)) {
407 radeon_bo_unreserve(rbo);
408 r = -EINVAL;
409 DRM_ERROR("failed to pin new rbo buffer before flip\n");
410 goto pflip_cleanup;
411 }
412 radeon_bo_get_tiling_flags(rbo, &tiling_flags, NULL);
413 radeon_bo_unreserve(rbo);
414
415 if (!ASIC_IS_AVIVO(rdev)) {
416 /* crtc offset is from display base addr not FB location */
417 base -= radeon_crtc->legacy_display_base_addr;
418 pitch_pixels = fb->pitch / (fb->bits_per_pixel / 8);
419
420 if (tiling_flags & RADEON_TILING_MACRO) {
421 if (ASIC_IS_R300(rdev)) {
422 base &= ~0x7ff;
423 } else {
424 int byteshift = fb->bits_per_pixel >> 4;
425 int tile_addr = (((crtc->y >> 3) * pitch_pixels + crtc->x) >> (8 - byteshift)) << 11;
426 base += tile_addr + ((crtc->x << byteshift) % 256) + ((crtc->y % 8) << 8);
427 }
428 } else {
429 int offset = crtc->y * pitch_pixels + crtc->x;
430 switch (fb->bits_per_pixel) {
431 case 8:
432 default:
433 offset *= 1;
434 break;
435 case 15:
436 case 16:
437 offset *= 2;
438 break;
439 case 24:
440 offset *= 3;
441 break;
442 case 32:
443 offset *= 4;
444 break;
445 }
446 base += offset;
447 }
448 base &= ~7;
449 }
450
451 spin_lock_irqsave(&dev->event_lock, flags);
452 work->new_crtc_base = base;
453 spin_unlock_irqrestore(&dev->event_lock, flags);
454
455 /* update crtc fb */
456 crtc->fb = fb;
457
458 r = drm_vblank_get(dev, radeon_crtc->crtc_id);
459 if (r) {
460 DRM_ERROR("failed to get vblank before flip\n");
461 goto pflip_cleanup1;
462 }
463
464 /* 32 ought to cover us */
465 r = radeon_ring_lock(rdev, 32);
466 if (r) {
467 DRM_ERROR("failed to lock the ring before flip\n");
468 goto pflip_cleanup2;
469 }
470
471 /* emit the fence */
472 radeon_fence_emit(rdev, fence);
473 /* set the proper interrupt */
474 radeon_pre_page_flip(rdev, radeon_crtc->crtc_id);
475 /* fire the ring */
476 radeon_ring_unlock_commit(rdev);
477
478 return 0;
479
480pflip_cleanup2:
481 drm_vblank_put(dev, radeon_crtc->crtc_id);
482
483pflip_cleanup1:
484 r = radeon_bo_reserve(rbo, false);
485 if (unlikely(r != 0)) {
486 DRM_ERROR("failed to reserve new rbo in error path\n");
487 goto pflip_cleanup;
488 }
489 r = radeon_bo_unpin(rbo);
490 if (unlikely(r != 0)) {
491 radeon_bo_unreserve(rbo);
492 r = -EINVAL;
493 DRM_ERROR("failed to unpin new rbo in error path\n");
494 goto pflip_cleanup;
495 }
496 radeon_bo_unreserve(rbo);
497
498pflip_cleanup:
499 spin_lock_irqsave(&dev->event_lock, flags);
500 radeon_crtc->unpin_work = NULL;
501unlock_free:
502 drm_gem_object_unreference_unlocked(old_radeon_fb->obj);
503 spin_unlock_irqrestore(&dev->event_lock, flags);
504 radeon_fence_unref(&fence);
505 kfree(work);
506
507 return r;
508}
509
186static const struct drm_crtc_funcs radeon_crtc_funcs = { 510static const struct drm_crtc_funcs radeon_crtc_funcs = {
187 .cursor_set = radeon_crtc_cursor_set, 511 .cursor_set = radeon_crtc_cursor_set,
188 .cursor_move = radeon_crtc_cursor_move, 512 .cursor_move = radeon_crtc_cursor_move,
189 .gamma_set = radeon_crtc_gamma_set, 513 .gamma_set = radeon_crtc_gamma_set,
190 .set_config = drm_crtc_helper_set_config, 514 .set_config = drm_crtc_helper_set_config,
191 .destroy = radeon_crtc_destroy, 515 .destroy = radeon_crtc_destroy,
516 .page_flip = radeon_crtc_page_flip,
192}; 517};
193 518
194static void radeon_crtc_init(struct drm_device *dev, int index) 519static void radeon_crtc_init(struct drm_device *dev, int index)
@@ -225,7 +550,7 @@ static void radeon_crtc_init(struct drm_device *dev, int index)
225 radeon_legacy_init_crtc(dev, radeon_crtc); 550 radeon_legacy_init_crtc(dev, radeon_crtc);
226} 551}
227 552
228static const char *encoder_names[34] = { 553static const char *encoder_names[36] = {
229 "NONE", 554 "NONE",
230 "INTERNAL_LVDS", 555 "INTERNAL_LVDS",
231 "INTERNAL_TMDS1", 556 "INTERNAL_TMDS1",
@@ -260,6 +585,8 @@ static const char *encoder_names[34] = {
260 "INTERNAL_KLDSCP_LVTMA", 585 "INTERNAL_KLDSCP_LVTMA",
261 "INTERNAL_UNIPHY1", 586 "INTERNAL_UNIPHY1",
262 "INTERNAL_UNIPHY2", 587 "INTERNAL_UNIPHY2",
588 "NUTMEG",
589 "TRAVIS",
263}; 590};
264 591
265static const char *connector_names[15] = { 592static const char *connector_names[15] = {
@@ -315,10 +642,14 @@ static void radeon_print_display_setup(struct drm_device *dev)
315 radeon_connector->ddc_bus->rec.en_data_reg, 642 radeon_connector->ddc_bus->rec.en_data_reg,
316 radeon_connector->ddc_bus->rec.y_clk_reg, 643 radeon_connector->ddc_bus->rec.y_clk_reg,
317 radeon_connector->ddc_bus->rec.y_data_reg); 644 radeon_connector->ddc_bus->rec.y_data_reg);
318 if (radeon_connector->router_bus) 645 if (radeon_connector->router.ddc_valid)
319 DRM_INFO(" DDC Router 0x%x/0x%x\n", 646 DRM_INFO(" DDC Router 0x%x/0x%x\n",
320 radeon_connector->router.mux_control_pin, 647 radeon_connector->router.ddc_mux_control_pin,
321 radeon_connector->router.mux_state); 648 radeon_connector->router.ddc_mux_state);
649 if (radeon_connector->router.cd_valid)
650 DRM_INFO(" Clock/Data Router 0x%x/0x%x\n",
651 radeon_connector->router.cd_mux_control_pin,
652 radeon_connector->router.cd_mux_state);
322 } else { 653 } else {
323 if (connector->connector_type == DRM_MODE_CONNECTOR_VGA || 654 if (connector->connector_type == DRM_MODE_CONNECTOR_VGA ||
324 connector->connector_type == DRM_MODE_CONNECTOR_DVII || 655 connector->connector_type == DRM_MODE_CONNECTOR_DVII ||
@@ -398,8 +729,8 @@ int radeon_ddc_get_modes(struct radeon_connector *radeon_connector)
398 int ret = 0; 729 int ret = 0;
399 730
400 /* on hw with routers, select right port */ 731 /* on hw with routers, select right port */
401 if (radeon_connector->router.valid) 732 if (radeon_connector->router.ddc_valid)
402 radeon_router_select_port(radeon_connector); 733 radeon_router_select_ddc_port(radeon_connector);
403 734
404 if ((radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_DisplayPort) || 735 if ((radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_DisplayPort) ||
405 (radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_eDP)) { 736 (radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_eDP)) {
@@ -413,9 +744,17 @@ int radeon_ddc_get_modes(struct radeon_connector *radeon_connector)
413 if (!radeon_connector->edid) { 744 if (!radeon_connector->edid) {
414 radeon_connector->edid = drm_get_edid(&radeon_connector->base, &radeon_connector->ddc_bus->adapter); 745 radeon_connector->edid = drm_get_edid(&radeon_connector->base, &radeon_connector->ddc_bus->adapter);
415 } 746 }
416 /* some servers provide a hardcoded edid in rom for KVMs */ 747
417 if (!radeon_connector->edid) 748 if (!radeon_connector->edid) {
418 radeon_connector->edid = radeon_combios_get_hardcoded_edid(rdev); 749 if (rdev->is_atom_bios) {
750 /* some laptops provide a hardcoded edid in rom for LCDs */
751 if (((radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_LVDS) ||
752 (radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_eDP)))
753 radeon_connector->edid = radeon_bios_get_hardcoded_edid(rdev);
754 } else
755 /* some servers provide a hardcoded edid in rom for KVMs */
756 radeon_connector->edid = radeon_bios_get_hardcoded_edid(rdev);
757 }
419 if (radeon_connector->edid) { 758 if (radeon_connector->edid) {
420 drm_mode_connector_update_edid_property(&radeon_connector->base, radeon_connector->edid); 759 drm_mode_connector_update_edid_property(&radeon_connector->base, radeon_connector->edid);
421 ret = drm_add_edid_modes(&radeon_connector->base, radeon_connector->edid); 760 ret = drm_add_edid_modes(&radeon_connector->base, radeon_connector->edid);
@@ -432,8 +771,8 @@ static int radeon_ddc_dump(struct drm_connector *connector)
432 int ret = 0; 771 int ret = 0;
433 772
434 /* on hw with routers, select right port */ 773 /* on hw with routers, select right port */
435 if (radeon_connector->router.valid) 774 if (radeon_connector->router.ddc_valid)
436 radeon_router_select_port(radeon_connector); 775 radeon_router_select_ddc_port(radeon_connector);
437 776
438 if (!radeon_connector->ddc_bus) 777 if (!radeon_connector->ddc_bus)
439 return -1; 778 return -1;
@@ -444,6 +783,125 @@ static int radeon_ddc_dump(struct drm_connector *connector)
444 return ret; 783 return ret;
445} 784}
446 785
786/* avivo */
787static void avivo_get_fb_div(struct radeon_pll *pll,
788 u32 target_clock,
789 u32 post_div,
790 u32 ref_div,
791 u32 *fb_div,
792 u32 *frac_fb_div)
793{
794 u32 tmp = post_div * ref_div;
795
796 tmp *= target_clock;
797 *fb_div = tmp / pll->reference_freq;
798 *frac_fb_div = tmp % pll->reference_freq;
799
800 if (*fb_div > pll->max_feedback_div)
801 *fb_div = pll->max_feedback_div;
802 else if (*fb_div < pll->min_feedback_div)
803 *fb_div = pll->min_feedback_div;
804}
805
806static u32 avivo_get_post_div(struct radeon_pll *pll,
807 u32 target_clock)
808{
809 u32 vco, post_div, tmp;
810
811 if (pll->flags & RADEON_PLL_USE_POST_DIV)
812 return pll->post_div;
813
814 if (pll->flags & RADEON_PLL_PREFER_MINM_OVER_MAXP) {
815 if (pll->flags & RADEON_PLL_IS_LCD)
816 vco = pll->lcd_pll_out_min;
817 else
818 vco = pll->pll_out_min;
819 } else {
820 if (pll->flags & RADEON_PLL_IS_LCD)
821 vco = pll->lcd_pll_out_max;
822 else
823 vco = pll->pll_out_max;
824 }
825
826 post_div = vco / target_clock;
827 tmp = vco % target_clock;
828
829 if (pll->flags & RADEON_PLL_PREFER_MINM_OVER_MAXP) {
830 if (tmp)
831 post_div++;
832 } else {
833 if (!tmp)
834 post_div--;
835 }
836
837 if (post_div > pll->max_post_div)
838 post_div = pll->max_post_div;
839 else if (post_div < pll->min_post_div)
840 post_div = pll->min_post_div;
841
842 return post_div;
843}
844
845#define MAX_TOLERANCE 10
846
847void radeon_compute_pll_avivo(struct radeon_pll *pll,
848 u32 freq,
849 u32 *dot_clock_p,
850 u32 *fb_div_p,
851 u32 *frac_fb_div_p,
852 u32 *ref_div_p,
853 u32 *post_div_p)
854{
855 u32 target_clock = freq / 10;
856 u32 post_div = avivo_get_post_div(pll, target_clock);
857 u32 ref_div = pll->min_ref_div;
858 u32 fb_div = 0, frac_fb_div = 0, tmp;
859
860 if (pll->flags & RADEON_PLL_USE_REF_DIV)
861 ref_div = pll->reference_div;
862
863 if (pll->flags & RADEON_PLL_USE_FRAC_FB_DIV) {
864 avivo_get_fb_div(pll, target_clock, post_div, ref_div, &fb_div, &frac_fb_div);
865 frac_fb_div = (100 * frac_fb_div) / pll->reference_freq;
866 if (frac_fb_div >= 5) {
867 frac_fb_div -= 5;
868 frac_fb_div = frac_fb_div / 10;
869 frac_fb_div++;
870 }
871 if (frac_fb_div >= 10) {
872 fb_div++;
873 frac_fb_div = 0;
874 }
875 } else {
876 while (ref_div <= pll->max_ref_div) {
877 avivo_get_fb_div(pll, target_clock, post_div, ref_div,
878 &fb_div, &frac_fb_div);
879 if (frac_fb_div >= (pll->reference_freq / 2))
880 fb_div++;
881 frac_fb_div = 0;
882 tmp = (pll->reference_freq * fb_div) / (post_div * ref_div);
883 tmp = (tmp * 10000) / target_clock;
884
885 if (tmp > (10000 + MAX_TOLERANCE))
886 ref_div++;
887 else if (tmp >= (10000 - MAX_TOLERANCE))
888 break;
889 else
890 ref_div++;
891 }
892 }
893
894 *dot_clock_p = ((pll->reference_freq * fb_div * 10) + (pll->reference_freq * frac_fb_div)) /
895 (ref_div * post_div * 10);
896 *fb_div_p = fb_div;
897 *frac_fb_div_p = frac_fb_div;
898 *ref_div_p = ref_div;
899 *post_div_p = post_div;
900 DRM_DEBUG_KMS("%d, pll dividers - fb: %d.%d ref: %d, post %d\n",
901 *dot_clock_p, fb_div, frac_fb_div, ref_div, post_div);
902}
903
904/* pre-avivo */
447static inline uint32_t radeon_div(uint64_t n, uint32_t d) 905static inline uint32_t radeon_div(uint64_t n, uint32_t d)
448{ 906{
449 uint64_t mod; 907 uint64_t mod;
@@ -454,13 +912,13 @@ static inline uint32_t radeon_div(uint64_t n, uint32_t d)
454 return n; 912 return n;
455} 913}
456 914
457static void radeon_compute_pll_legacy(struct radeon_pll *pll, 915void radeon_compute_pll_legacy(struct radeon_pll *pll,
458 uint64_t freq, 916 uint64_t freq,
459 uint32_t *dot_clock_p, 917 uint32_t *dot_clock_p,
460 uint32_t *fb_div_p, 918 uint32_t *fb_div_p,
461 uint32_t *frac_fb_div_p, 919 uint32_t *frac_fb_div_p,
462 uint32_t *ref_div_p, 920 uint32_t *ref_div_p,
463 uint32_t *post_div_p) 921 uint32_t *post_div_p)
464{ 922{
465 uint32_t min_ref_div = pll->min_ref_div; 923 uint32_t min_ref_div = pll->min_ref_div;
466 uint32_t max_ref_div = pll->max_ref_div; 924 uint32_t max_ref_div = pll->max_ref_div;
@@ -490,6 +948,9 @@ static void radeon_compute_pll_legacy(struct radeon_pll *pll,
490 pll_out_max = pll->pll_out_max; 948 pll_out_max = pll->pll_out_max;
491 } 949 }
492 950
951 if (pll_out_min > 64800)
952 pll_out_min = 64800;
953
493 if (pll->flags & RADEON_PLL_USE_REF_DIV) 954 if (pll->flags & RADEON_PLL_USE_REF_DIV)
494 min_ref_div = max_ref_div = pll->reference_div; 955 min_ref_div = max_ref_div = pll->reference_div;
495 else { 956 else {
@@ -513,7 +974,7 @@ static void radeon_compute_pll_legacy(struct radeon_pll *pll,
513 max_fractional_feed_div = pll->max_frac_feedback_div; 974 max_fractional_feed_div = pll->max_frac_feedback_div;
514 } 975 }
515 976
516 for (post_div = min_post_div; post_div <= max_post_div; ++post_div) { 977 for (post_div = max_post_div; post_div >= min_post_div; --post_div) {
517 uint32_t ref_div; 978 uint32_t ref_div;
518 979
519 if ((pll->flags & RADEON_PLL_NO_ODD_POST_DIV) && (post_div & 1)) 980 if ((pll->flags & RADEON_PLL_NO_ODD_POST_DIV) && (post_div & 1))
@@ -629,214 +1090,11 @@ static void radeon_compute_pll_legacy(struct radeon_pll *pll,
629 *frac_fb_div_p = best_frac_feedback_div; 1090 *frac_fb_div_p = best_frac_feedback_div;
630 *ref_div_p = best_ref_div; 1091 *ref_div_p = best_ref_div;
631 *post_div_p = best_post_div; 1092 *post_div_p = best_post_div;
632} 1093 DRM_DEBUG_KMS("%lld %d, pll dividers - fb: %d.%d ref: %d, post %d\n",
633 1094 (long long)freq,
634static bool 1095 best_freq / 1000, best_feedback_div, best_frac_feedback_div,
635calc_fb_div(struct radeon_pll *pll, 1096 best_ref_div, best_post_div);
636 uint32_t freq,
637 uint32_t post_div,
638 uint32_t ref_div,
639 uint32_t *fb_div,
640 uint32_t *fb_div_frac)
641{
642 fixed20_12 feedback_divider, a, b;
643 u32 vco_freq;
644
645 vco_freq = freq * post_div;
646 /* feedback_divider = vco_freq * ref_div / pll->reference_freq; */
647 a.full = dfixed_const(pll->reference_freq);
648 feedback_divider.full = dfixed_const(vco_freq);
649 feedback_divider.full = dfixed_div(feedback_divider, a);
650 a.full = dfixed_const(ref_div);
651 feedback_divider.full = dfixed_mul(feedback_divider, a);
652
653 if (pll->flags & RADEON_PLL_USE_FRAC_FB_DIV) {
654 /* feedback_divider = floor((feedback_divider * 10.0) + 0.5) * 0.1; */
655 a.full = dfixed_const(10);
656 feedback_divider.full = dfixed_mul(feedback_divider, a);
657 feedback_divider.full += dfixed_const_half(0);
658 feedback_divider.full = dfixed_floor(feedback_divider);
659 feedback_divider.full = dfixed_div(feedback_divider, a);
660
661 /* *fb_div = floor(feedback_divider); */
662 a.full = dfixed_floor(feedback_divider);
663 *fb_div = dfixed_trunc(a);
664 /* *fb_div_frac = fmod(feedback_divider, 1.0) * 10.0; */
665 a.full = dfixed_const(10);
666 b.full = dfixed_mul(feedback_divider, a);
667
668 feedback_divider.full = dfixed_floor(feedback_divider);
669 feedback_divider.full = dfixed_mul(feedback_divider, a);
670 feedback_divider.full = b.full - feedback_divider.full;
671 *fb_div_frac = dfixed_trunc(feedback_divider);
672 } else {
673 /* *fb_div = floor(feedback_divider + 0.5); */
674 feedback_divider.full += dfixed_const_half(0);
675 feedback_divider.full = dfixed_floor(feedback_divider);
676
677 *fb_div = dfixed_trunc(feedback_divider);
678 *fb_div_frac = 0;
679 }
680
681 if (((*fb_div) < pll->min_feedback_div) || ((*fb_div) > pll->max_feedback_div))
682 return false;
683 else
684 return true;
685}
686
687static bool
688calc_fb_ref_div(struct radeon_pll *pll,
689 uint32_t freq,
690 uint32_t post_div,
691 uint32_t *fb_div,
692 uint32_t *fb_div_frac,
693 uint32_t *ref_div)
694{
695 fixed20_12 ffreq, max_error, error, pll_out, a;
696 u32 vco;
697 u32 pll_out_min, pll_out_max;
698
699 if (pll->flags & RADEON_PLL_IS_LCD) {
700 pll_out_min = pll->lcd_pll_out_min;
701 pll_out_max = pll->lcd_pll_out_max;
702 } else {
703 pll_out_min = pll->pll_out_min;
704 pll_out_max = pll->pll_out_max;
705 }
706
707 ffreq.full = dfixed_const(freq);
708 /* max_error = ffreq * 0.0025; */
709 a.full = dfixed_const(400);
710 max_error.full = dfixed_div(ffreq, a);
711
712 for ((*ref_div) = pll->min_ref_div; (*ref_div) < pll->max_ref_div; ++(*ref_div)) {
713 if (calc_fb_div(pll, freq, post_div, (*ref_div), fb_div, fb_div_frac)) {
714 vco = pll->reference_freq * (((*fb_div) * 10) + (*fb_div_frac));
715 vco = vco / ((*ref_div) * 10);
716
717 if ((vco < pll_out_min) || (vco > pll_out_max))
718 continue;
719
720 /* pll_out = vco / post_div; */
721 a.full = dfixed_const(post_div);
722 pll_out.full = dfixed_const(vco);
723 pll_out.full = dfixed_div(pll_out, a);
724
725 if (pll_out.full >= ffreq.full) {
726 error.full = pll_out.full - ffreq.full;
727 if (error.full <= max_error.full)
728 return true;
729 }
730 }
731 }
732 return false;
733}
734
735static void radeon_compute_pll_new(struct radeon_pll *pll,
736 uint64_t freq,
737 uint32_t *dot_clock_p,
738 uint32_t *fb_div_p,
739 uint32_t *frac_fb_div_p,
740 uint32_t *ref_div_p,
741 uint32_t *post_div_p)
742{
743 u32 fb_div = 0, fb_div_frac = 0, post_div = 0, ref_div = 0;
744 u32 best_freq = 0, vco_frequency;
745 u32 pll_out_min, pll_out_max;
746
747 if (pll->flags & RADEON_PLL_IS_LCD) {
748 pll_out_min = pll->lcd_pll_out_min;
749 pll_out_max = pll->lcd_pll_out_max;
750 } else {
751 pll_out_min = pll->pll_out_min;
752 pll_out_max = pll->pll_out_max;
753 }
754
755 /* freq = freq / 10; */
756 do_div(freq, 10);
757
758 if (pll->flags & RADEON_PLL_USE_POST_DIV) {
759 post_div = pll->post_div;
760 if ((post_div < pll->min_post_div) || (post_div > pll->max_post_div))
761 goto done;
762
763 vco_frequency = freq * post_div;
764 if ((vco_frequency < pll_out_min) || (vco_frequency > pll_out_max))
765 goto done;
766
767 if (pll->flags & RADEON_PLL_USE_REF_DIV) {
768 ref_div = pll->reference_div;
769 if ((ref_div < pll->min_ref_div) || (ref_div > pll->max_ref_div))
770 goto done;
771 if (!calc_fb_div(pll, freq, post_div, ref_div, &fb_div, &fb_div_frac))
772 goto done;
773 }
774 } else {
775 for (post_div = pll->max_post_div; post_div >= pll->min_post_div; --post_div) {
776 if (pll->flags & RADEON_PLL_LEGACY) {
777 if ((post_div == 5) ||
778 (post_div == 7) ||
779 (post_div == 9) ||
780 (post_div == 10) ||
781 (post_div == 11))
782 continue;
783 }
784 1097
785 if ((pll->flags & RADEON_PLL_NO_ODD_POST_DIV) && (post_div & 1))
786 continue;
787
788 vco_frequency = freq * post_div;
789 if ((vco_frequency < pll_out_min) || (vco_frequency > pll_out_max))
790 continue;
791 if (pll->flags & RADEON_PLL_USE_REF_DIV) {
792 ref_div = pll->reference_div;
793 if ((ref_div < pll->min_ref_div) || (ref_div > pll->max_ref_div))
794 goto done;
795 if (calc_fb_div(pll, freq, post_div, ref_div, &fb_div, &fb_div_frac))
796 break;
797 } else {
798 if (calc_fb_ref_div(pll, freq, post_div, &fb_div, &fb_div_frac, &ref_div))
799 break;
800 }
801 }
802 }
803
804 best_freq = pll->reference_freq * 10 * fb_div;
805 best_freq += pll->reference_freq * fb_div_frac;
806 best_freq = best_freq / (ref_div * post_div);
807
808done:
809 if (best_freq == 0)
810 DRM_ERROR("Couldn't find valid PLL dividers\n");
811
812 *dot_clock_p = best_freq / 10;
813 *fb_div_p = fb_div;
814 *frac_fb_div_p = fb_div_frac;
815 *ref_div_p = ref_div;
816 *post_div_p = post_div;
817
818 DRM_DEBUG_KMS("%u %d.%d, %d, %d\n", *dot_clock_p, *fb_div_p, *frac_fb_div_p, *ref_div_p, *post_div_p);
819}
820
821void radeon_compute_pll(struct radeon_pll *pll,
822 uint64_t freq,
823 uint32_t *dot_clock_p,
824 uint32_t *fb_div_p,
825 uint32_t *frac_fb_div_p,
826 uint32_t *ref_div_p,
827 uint32_t *post_div_p)
828{
829 switch (pll->algo) {
830 case PLL_ALGO_NEW:
831 radeon_compute_pll_new(pll, freq, dot_clock_p, fb_div_p,
832 frac_fb_div_p, ref_div_p, post_div_p);
833 break;
834 case PLL_ALGO_LEGACY:
835 default:
836 radeon_compute_pll_legacy(pll, freq, dot_clock_p, fb_div_p,
837 frac_fb_div_p, ref_div_p, post_div_p);
838 break;
839 }
840} 1098}
841 1099
842static void radeon_user_framebuffer_destroy(struct drm_framebuffer *fb) 1100static void radeon_user_framebuffer_destroy(struct drm_framebuffer *fb)
@@ -1002,6 +1260,24 @@ static int radeon_modeset_create_props(struct radeon_device *rdev)
1002 radeon_underscan_enum_list[i].name); 1260 radeon_underscan_enum_list[i].name);
1003 } 1261 }
1004 1262
1263 rdev->mode_info.underscan_hborder_property =
1264 drm_property_create(rdev->ddev,
1265 DRM_MODE_PROP_RANGE,
1266 "underscan hborder", 2);
1267 if (!rdev->mode_info.underscan_hborder_property)
1268 return -ENOMEM;
1269 rdev->mode_info.underscan_hborder_property->values[0] = 0;
1270 rdev->mode_info.underscan_hborder_property->values[1] = 128;
1271
1272 rdev->mode_info.underscan_vborder_property =
1273 drm_property_create(rdev->ddev,
1274 DRM_MODE_PROP_RANGE,
1275 "underscan vborder", 2);
1276 if (!rdev->mode_info.underscan_vborder_property)
1277 return -ENOMEM;
1278 rdev->mode_info.underscan_vborder_property->values[0] = 0;
1279 rdev->mode_info.underscan_vborder_property->values[1] = 128;
1280
1005 return 0; 1281 return 0;
1006} 1282}
1007 1283
@@ -1035,7 +1311,10 @@ int radeon_modeset_init(struct radeon_device *rdev)
1035 1311
1036 rdev->ddev->mode_config.funcs = (void *)&radeon_mode_funcs; 1312 rdev->ddev->mode_config.funcs = (void *)&radeon_mode_funcs;
1037 1313
1038 if (ASIC_IS_AVIVO(rdev)) { 1314 if (ASIC_IS_DCE5(rdev)) {
1315 rdev->ddev->mode_config.max_width = 16384;
1316 rdev->ddev->mode_config.max_height = 16384;
1317 } else if (ASIC_IS_AVIVO(rdev)) {
1039 rdev->ddev->mode_config.max_width = 8192; 1318 rdev->ddev->mode_config.max_width = 8192;
1040 rdev->ddev->mode_config.max_height = 8192; 1319 rdev->ddev->mode_config.max_height = 8192;
1041 } else { 1320 } else {
@@ -1069,6 +1348,11 @@ int radeon_modeset_init(struct radeon_device *rdev)
1069 if (!ret) { 1348 if (!ret) {
1070 return ret; 1349 return ret;
1071 } 1350 }
1351
1352 /* init dig PHYs */
1353 if (rdev->is_atom_bios)
1354 radeon_atom_encoder_init(rdev);
1355
1072 /* initialize hpd */ 1356 /* initialize hpd */
1073 radeon_hpd_init(rdev); 1357 radeon_hpd_init(rdev);
1074 1358
@@ -1159,8 +1443,14 @@ bool radeon_crtc_scaling_mode_fixup(struct drm_crtc *crtc,
1159 ((radeon_encoder->underscan_type == UNDERSCAN_AUTO) && 1443 ((radeon_encoder->underscan_type == UNDERSCAN_AUTO) &&
1160 drm_detect_hdmi_monitor(radeon_connector->edid) && 1444 drm_detect_hdmi_monitor(radeon_connector->edid) &&
1161 is_hdtv_mode(mode)))) { 1445 is_hdtv_mode(mode)))) {
1162 radeon_crtc->h_border = (mode->hdisplay >> 5) + 16; 1446 if (radeon_encoder->underscan_hborder != 0)
1163 radeon_crtc->v_border = (mode->vdisplay >> 5) + 16; 1447 radeon_crtc->h_border = radeon_encoder->underscan_hborder;
1448 else
1449 radeon_crtc->h_border = (mode->hdisplay >> 5) + 16;
1450 if (radeon_encoder->underscan_vborder != 0)
1451 radeon_crtc->v_border = radeon_encoder->underscan_vborder;
1452 else
1453 radeon_crtc->v_border = (mode->vdisplay >> 5) + 16;
1164 radeon_crtc->rmx_type = RMX_FULL; 1454 radeon_crtc->rmx_type = RMX_FULL;
1165 src_v = crtc->mode.vdisplay; 1455 src_v = crtc->mode.vdisplay;
1166 dst_v = crtc->mode.vdisplay - (radeon_crtc->v_border * 2); 1456 dst_v = crtc->mode.vdisplay - (radeon_crtc->v_border * 2);
@@ -1195,3 +1485,158 @@ bool radeon_crtc_scaling_mode_fixup(struct drm_crtc *crtc,
1195 } 1485 }
1196 return true; 1486 return true;
1197} 1487}
1488
1489/*
1490 * Retrieve current video scanout position of crtc on a given gpu.
1491 *
1492 * \param dev Device to query.
1493 * \param crtc Crtc to query.
1494 * \param *vpos Location where vertical scanout position should be stored.
1495 * \param *hpos Location where horizontal scanout position should go.
1496 *
1497 * Returns vpos as a positive number while in active scanout area.
1498 * Returns vpos as a negative number inside vblank, counting the number
1499 * of scanlines to go until end of vblank, e.g., -1 means "one scanline
1500 * until start of active scanout / end of vblank."
1501 *
1502 * \return Flags, or'ed together as follows:
1503 *
1504 * DRM_SCANOUTPOS_VALID = Query successful.
1505 * DRM_SCANOUTPOS_INVBL = Inside vblank.
1506 * DRM_SCANOUTPOS_ACCURATE = Returned position is accurate. A lack of
1507 * this flag means that returned position may be offset by a constant but
1508 * unknown small number of scanlines wrt. real scanout position.
1509 *
1510 */
1511int radeon_get_crtc_scanoutpos(struct drm_device *dev, int crtc, int *vpos, int *hpos)
1512{
1513 u32 stat_crtc = 0, vbl = 0, position = 0;
1514 int vbl_start, vbl_end, vtotal, ret = 0;
1515 bool in_vbl = true;
1516
1517 struct radeon_device *rdev = dev->dev_private;
1518
1519 if (ASIC_IS_DCE4(rdev)) {
1520 if (crtc == 0) {
1521 vbl = RREG32(EVERGREEN_CRTC_V_BLANK_START_END +
1522 EVERGREEN_CRTC0_REGISTER_OFFSET);
1523 position = RREG32(EVERGREEN_CRTC_STATUS_POSITION +
1524 EVERGREEN_CRTC0_REGISTER_OFFSET);
1525 ret |= DRM_SCANOUTPOS_VALID;
1526 }
1527 if (crtc == 1) {
1528 vbl = RREG32(EVERGREEN_CRTC_V_BLANK_START_END +
1529 EVERGREEN_CRTC1_REGISTER_OFFSET);
1530 position = RREG32(EVERGREEN_CRTC_STATUS_POSITION +
1531 EVERGREEN_CRTC1_REGISTER_OFFSET);
1532 ret |= DRM_SCANOUTPOS_VALID;
1533 }
1534 if (crtc == 2) {
1535 vbl = RREG32(EVERGREEN_CRTC_V_BLANK_START_END +
1536 EVERGREEN_CRTC2_REGISTER_OFFSET);
1537 position = RREG32(EVERGREEN_CRTC_STATUS_POSITION +
1538 EVERGREEN_CRTC2_REGISTER_OFFSET);
1539 ret |= DRM_SCANOUTPOS_VALID;
1540 }
1541 if (crtc == 3) {
1542 vbl = RREG32(EVERGREEN_CRTC_V_BLANK_START_END +
1543 EVERGREEN_CRTC3_REGISTER_OFFSET);
1544 position = RREG32(EVERGREEN_CRTC_STATUS_POSITION +
1545 EVERGREEN_CRTC3_REGISTER_OFFSET);
1546 ret |= DRM_SCANOUTPOS_VALID;
1547 }
1548 if (crtc == 4) {
1549 vbl = RREG32(EVERGREEN_CRTC_V_BLANK_START_END +
1550 EVERGREEN_CRTC4_REGISTER_OFFSET);
1551 position = RREG32(EVERGREEN_CRTC_STATUS_POSITION +
1552 EVERGREEN_CRTC4_REGISTER_OFFSET);
1553 ret |= DRM_SCANOUTPOS_VALID;
1554 }
1555 if (crtc == 5) {
1556 vbl = RREG32(EVERGREEN_CRTC_V_BLANK_START_END +
1557 EVERGREEN_CRTC5_REGISTER_OFFSET);
1558 position = RREG32(EVERGREEN_CRTC_STATUS_POSITION +
1559 EVERGREEN_CRTC5_REGISTER_OFFSET);
1560 ret |= DRM_SCANOUTPOS_VALID;
1561 }
1562 } else if (ASIC_IS_AVIVO(rdev)) {
1563 if (crtc == 0) {
1564 vbl = RREG32(AVIVO_D1CRTC_V_BLANK_START_END);
1565 position = RREG32(AVIVO_D1CRTC_STATUS_POSITION);
1566 ret |= DRM_SCANOUTPOS_VALID;
1567 }
1568 if (crtc == 1) {
1569 vbl = RREG32(AVIVO_D2CRTC_V_BLANK_START_END);
1570 position = RREG32(AVIVO_D2CRTC_STATUS_POSITION);
1571 ret |= DRM_SCANOUTPOS_VALID;
1572 }
1573 } else {
1574 /* Pre-AVIVO: Different encoding of scanout pos and vblank interval. */
1575 if (crtc == 0) {
1576 /* Assume vbl_end == 0, get vbl_start from
1577 * upper 16 bits.
1578 */
1579 vbl = (RREG32(RADEON_CRTC_V_TOTAL_DISP) &
1580 RADEON_CRTC_V_DISP) >> RADEON_CRTC_V_DISP_SHIFT;
1581 /* Only retrieve vpos from upper 16 bits, set hpos == 0. */
1582 position = (RREG32(RADEON_CRTC_VLINE_CRNT_VLINE) >> 16) & RADEON_CRTC_V_TOTAL;
1583 stat_crtc = RREG32(RADEON_CRTC_STATUS);
1584 if (!(stat_crtc & 1))
1585 in_vbl = false;
1586
1587 ret |= DRM_SCANOUTPOS_VALID;
1588 }
1589 if (crtc == 1) {
1590 vbl = (RREG32(RADEON_CRTC2_V_TOTAL_DISP) &
1591 RADEON_CRTC_V_DISP) >> RADEON_CRTC_V_DISP_SHIFT;
1592 position = (RREG32(RADEON_CRTC2_VLINE_CRNT_VLINE) >> 16) & RADEON_CRTC_V_TOTAL;
1593 stat_crtc = RREG32(RADEON_CRTC2_STATUS);
1594 if (!(stat_crtc & 1))
1595 in_vbl = false;
1596
1597 ret |= DRM_SCANOUTPOS_VALID;
1598 }
1599 }
1600
1601 /* Decode into vertical and horizontal scanout position. */
1602 *vpos = position & 0x1fff;
1603 *hpos = (position >> 16) & 0x1fff;
1604
1605 /* Valid vblank area boundaries from gpu retrieved? */
1606 if (vbl > 0) {
1607 /* Yes: Decode. */
1608 ret |= DRM_SCANOUTPOS_ACCURATE;
1609 vbl_start = vbl & 0x1fff;
1610 vbl_end = (vbl >> 16) & 0x1fff;
1611 }
1612 else {
1613 /* No: Fake something reasonable which gives at least ok results. */
1614 vbl_start = rdev->mode_info.crtcs[crtc]->base.hwmode.crtc_vdisplay;
1615 vbl_end = 0;
1616 }
1617
1618 /* Test scanout position against vblank region. */
1619 if ((*vpos < vbl_start) && (*vpos >= vbl_end))
1620 in_vbl = false;
1621
1622 /* Check if inside vblank area and apply corrective offsets:
1623 * vpos will then be >=0 in video scanout area, but negative
1624 * within vblank area, counting down the number of lines until
1625 * start of scanout.
1626 */
1627
1628 /* Inside "upper part" of vblank area? Apply corrective offset if so: */
1629 if (in_vbl && (*vpos >= vbl_start)) {
1630 vtotal = rdev->mode_info.crtcs[crtc]->base.hwmode.crtc_vtotal;
1631 *vpos = *vpos - vtotal;
1632 }
1633
1634 /* Correct for shifted end of vbl at vbl_end. */
1635 *vpos = *vpos - vbl_end;
1636
1637 /* In vblank? */
1638 if (in_vbl)
1639 ret |= DRM_SCANOUTPOS_INVBL;
1640
1641 return ret;
1642}
diff --git a/drivers/gpu/drm/radeon/radeon_drv.c b/drivers/gpu/drm/radeon/radeon_drv.c
index 795403b0e2cd..73dfbe8e5f9e 100644
--- a/drivers/gpu/drm/radeon/radeon_drv.c
+++ b/drivers/gpu/drm/radeon/radeon_drv.c
@@ -47,9 +47,13 @@
47 * - 2.4.0 - add crtc id query 47 * - 2.4.0 - add crtc id query
48 * - 2.5.0 - add get accel 2 to work around ddx breakage for evergreen 48 * - 2.5.0 - add get accel 2 to work around ddx breakage for evergreen
49 * - 2.6.0 - add tiling config query (r6xx+), add initial HiZ support (r300->r500) 49 * - 2.6.0 - add tiling config query (r6xx+), add initial HiZ support (r300->r500)
50 * 2.7.0 - fixups for r600 2D tiling support. (no external ABI change), add eg dyn gpr regs
51 * 2.8.0 - pageflip support, r500 US_FORMAT regs. r500 ARGB2101010 colorbuf, r300->r500 CMASK, clock crystal query
52 * 2.9.0 - r600 tiling (s3tc,rgtc) working, SET_PREDICATION packet 3 on r600 + eg, backend query
53 * 2.10.0 - fusion 2D tiling
50 */ 54 */
51#define KMS_DRIVER_MAJOR 2 55#define KMS_DRIVER_MAJOR 2
52#define KMS_DRIVER_MINOR 6 56#define KMS_DRIVER_MINOR 10
53#define KMS_DRIVER_PATCHLEVEL 0 57#define KMS_DRIVER_PATCHLEVEL 0
54int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags); 58int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags);
55int radeon_driver_unload_kms(struct drm_device *dev); 59int radeon_driver_unload_kms(struct drm_device *dev);
@@ -65,6 +69,10 @@ int radeon_resume_kms(struct drm_device *dev);
65u32 radeon_get_vblank_counter_kms(struct drm_device *dev, int crtc); 69u32 radeon_get_vblank_counter_kms(struct drm_device *dev, int crtc);
66int radeon_enable_vblank_kms(struct drm_device *dev, int crtc); 70int radeon_enable_vblank_kms(struct drm_device *dev, int crtc);
67void radeon_disable_vblank_kms(struct drm_device *dev, int crtc); 71void radeon_disable_vblank_kms(struct drm_device *dev, int crtc);
72int radeon_get_vblank_timestamp_kms(struct drm_device *dev, int crtc,
73 int *max_error,
74 struct timeval *vblank_time,
75 unsigned flags);
68void radeon_driver_irq_preinstall_kms(struct drm_device *dev); 76void radeon_driver_irq_preinstall_kms(struct drm_device *dev);
69int radeon_driver_irq_postinstall_kms(struct drm_device *dev); 77int radeon_driver_irq_postinstall_kms(struct drm_device *dev);
70void radeon_driver_irq_uninstall_kms(struct drm_device *dev); 78void radeon_driver_irq_uninstall_kms(struct drm_device *dev);
@@ -73,9 +81,21 @@ int radeon_dma_ioctl_kms(struct drm_device *dev, void *data,
73 struct drm_file *file_priv); 81 struct drm_file *file_priv);
74int radeon_gem_object_init(struct drm_gem_object *obj); 82int radeon_gem_object_init(struct drm_gem_object *obj);
75void radeon_gem_object_free(struct drm_gem_object *obj); 83void radeon_gem_object_free(struct drm_gem_object *obj);
84extern int radeon_get_crtc_scanoutpos(struct drm_device *dev, int crtc,
85 int *vpos, int *hpos);
76extern struct drm_ioctl_desc radeon_ioctls_kms[]; 86extern struct drm_ioctl_desc radeon_ioctls_kms[];
77extern int radeon_max_kms_ioctl; 87extern int radeon_max_kms_ioctl;
78int radeon_mmap(struct file *filp, struct vm_area_struct *vma); 88int radeon_mmap(struct file *filp, struct vm_area_struct *vma);
89int radeon_mode_dumb_mmap(struct drm_file *filp,
90 struct drm_device *dev,
91 uint32_t handle, uint64_t *offset_p);
92int radeon_mode_dumb_create(struct drm_file *file_priv,
93 struct drm_device *dev,
94 struct drm_mode_create_dumb *args);
95int radeon_mode_dumb_destroy(struct drm_file *file_priv,
96 struct drm_device *dev,
97 uint32_t handle);
98
79#if defined(CONFIG_DEBUG_FS) 99#if defined(CONFIG_DEBUG_FS)
80int radeon_debugfs_init(struct drm_minor *minor); 100int radeon_debugfs_init(struct drm_minor *minor);
81void radeon_debugfs_cleanup(struct drm_minor *minor); 101void radeon_debugfs_cleanup(struct drm_minor *minor);
@@ -93,10 +113,10 @@ int radeon_benchmarking = 0;
93int radeon_testing = 0; 113int radeon_testing = 0;
94int radeon_connector_table = 0; 114int radeon_connector_table = 0;
95int radeon_tv = 1; 115int radeon_tv = 1;
96int radeon_new_pll = -1; 116int radeon_audio = 0;
97int radeon_audio = 1;
98int radeon_disp_priority = 0; 117int radeon_disp_priority = 0;
99int radeon_hw_i2c = 0; 118int radeon_hw_i2c = 0;
119int radeon_pcie_gen2 = 0;
100 120
101MODULE_PARM_DESC(no_wb, "Disable AGP writeback for scratch registers"); 121MODULE_PARM_DESC(no_wb, "Disable AGP writeback for scratch registers");
102module_param_named(no_wb, radeon_no_wb, int, 0444); 122module_param_named(no_wb, radeon_no_wb, int, 0444);
@@ -131,10 +151,7 @@ module_param_named(connector_table, radeon_connector_table, int, 0444);
131MODULE_PARM_DESC(tv, "TV enable (0 = disable)"); 151MODULE_PARM_DESC(tv, "TV enable (0 = disable)");
132module_param_named(tv, radeon_tv, int, 0444); 152module_param_named(tv, radeon_tv, int, 0444);
133 153
134MODULE_PARM_DESC(new_pll, "Select new PLL code"); 154MODULE_PARM_DESC(audio, "Audio enable (1 = enable)");
135module_param_named(new_pll, radeon_new_pll, int, 0444);
136
137MODULE_PARM_DESC(audio, "Audio enable (0 = disable)");
138module_param_named(audio, radeon_audio, int, 0444); 155module_param_named(audio, radeon_audio, int, 0444);
139 156
140MODULE_PARM_DESC(disp_priority, "Display Priority (0 = auto, 1 = normal, 2 = high)"); 157MODULE_PARM_DESC(disp_priority, "Display Priority (0 = auto, 1 = normal, 2 = high)");
@@ -143,6 +160,9 @@ module_param_named(disp_priority, radeon_disp_priority, int, 0444);
143MODULE_PARM_DESC(hw_i2c, "hw i2c engine enable (0 = disable)"); 160MODULE_PARM_DESC(hw_i2c, "hw i2c engine enable (0 = disable)");
144module_param_named(hw_i2c, radeon_hw_i2c, int, 0444); 161module_param_named(hw_i2c, radeon_hw_i2c, int, 0444);
145 162
163MODULE_PARM_DESC(pcie_gen2, "PCIE Gen2 mode (1 = enable)");
164module_param_named(pcie_gen2, radeon_pcie_gen2, int, 0444);
165
146static int radeon_suspend(struct drm_device *dev, pm_message_t state) 166static int radeon_suspend(struct drm_device *dev, pm_message_t state)
147{ 167{
148 drm_radeon_private_t *dev_priv = dev->dev_private; 168 drm_radeon_private_t *dev_priv = dev->dev_private;
@@ -203,8 +223,6 @@ static struct drm_driver driver_old = {
203 .irq_uninstall = radeon_driver_irq_uninstall, 223 .irq_uninstall = radeon_driver_irq_uninstall,
204 .irq_handler = radeon_driver_irq_handler, 224 .irq_handler = radeon_driver_irq_handler,
205 .reclaim_buffers = drm_core_reclaim_buffers, 225 .reclaim_buffers = drm_core_reclaim_buffers,
206 .get_map_ofs = drm_core_get_map_ofs,
207 .get_reg_ofs = drm_core_get_reg_ofs,
208 .ioctls = radeon_ioctls, 226 .ioctls = radeon_ioctls,
209 .dma_ioctl = radeon_cp_buffers, 227 .dma_ioctl = radeon_cp_buffers,
210 .fops = { 228 .fops = {
@@ -219,11 +237,7 @@ static struct drm_driver driver_old = {
219#ifdef CONFIG_COMPAT 237#ifdef CONFIG_COMPAT
220 .compat_ioctl = radeon_compat_ioctl, 238 .compat_ioctl = radeon_compat_ioctl,
221#endif 239#endif
222 }, 240 .llseek = noop_llseek,
223
224 .pci_driver = {
225 .name = DRIVER_NAME,
226 .id_table = pciidlist,
227 }, 241 },
228 242
229 .name = DRIVER_NAME, 243 .name = DRIVER_NAME,
@@ -236,9 +250,28 @@ static struct drm_driver driver_old = {
236 250
237static struct drm_driver kms_driver; 251static struct drm_driver kms_driver;
238 252
253static void radeon_kick_out_firmware_fb(struct pci_dev *pdev)
254{
255 struct apertures_struct *ap;
256 bool primary = false;
257
258 ap = alloc_apertures(1);
259 ap->ranges[0].base = pci_resource_start(pdev, 0);
260 ap->ranges[0].size = pci_resource_len(pdev, 0);
261
262#ifdef CONFIG_X86
263 primary = pdev->resource[PCI_ROM_RESOURCE].flags & IORESOURCE_ROM_SHADOW;
264#endif
265 remove_conflicting_framebuffers(ap, "radeondrmfb", primary);
266 kfree(ap);
267}
268
239static int __devinit 269static int __devinit
240radeon_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) 270radeon_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
241{ 271{
272 /* Get rid of things like offb */
273 radeon_kick_out_firmware_fb(pdev);
274
242 return drm_get_pci_dev(pdev, ent, &kms_driver); 275 return drm_get_pci_dev(pdev, ent, &kms_driver);
243} 276}
244 277
@@ -281,6 +314,8 @@ static struct drm_driver kms_driver = {
281 .get_vblank_counter = radeon_get_vblank_counter_kms, 314 .get_vblank_counter = radeon_get_vblank_counter_kms,
282 .enable_vblank = radeon_enable_vblank_kms, 315 .enable_vblank = radeon_enable_vblank_kms,
283 .disable_vblank = radeon_disable_vblank_kms, 316 .disable_vblank = radeon_disable_vblank_kms,
317 .get_vblank_timestamp = radeon_get_vblank_timestamp_kms,
318 .get_scanout_position = radeon_get_crtc_scanoutpos,
284#if defined(CONFIG_DEBUG_FS) 319#if defined(CONFIG_DEBUG_FS)
285 .debugfs_init = radeon_debugfs_init, 320 .debugfs_init = radeon_debugfs_init,
286 .debugfs_cleanup = radeon_debugfs_cleanup, 321 .debugfs_cleanup = radeon_debugfs_cleanup,
@@ -290,12 +325,13 @@ static struct drm_driver kms_driver = {
290 .irq_uninstall = radeon_driver_irq_uninstall_kms, 325 .irq_uninstall = radeon_driver_irq_uninstall_kms,
291 .irq_handler = radeon_driver_irq_handler_kms, 326 .irq_handler = radeon_driver_irq_handler_kms,
292 .reclaim_buffers = drm_core_reclaim_buffers, 327 .reclaim_buffers = drm_core_reclaim_buffers,
293 .get_map_ofs = drm_core_get_map_ofs,
294 .get_reg_ofs = drm_core_get_reg_ofs,
295 .ioctls = radeon_ioctls_kms, 328 .ioctls = radeon_ioctls_kms,
296 .gem_init_object = radeon_gem_object_init, 329 .gem_init_object = radeon_gem_object_init,
297 .gem_free_object = radeon_gem_object_free, 330 .gem_free_object = radeon_gem_object_free,
298 .dma_ioctl = radeon_dma_ioctl_kms, 331 .dma_ioctl = radeon_dma_ioctl_kms,
332 .dumb_create = radeon_mode_dumb_create,
333 .dumb_map_offset = radeon_mode_dumb_mmap,
334 .dumb_destroy = radeon_mode_dumb_destroy,
299 .fops = { 335 .fops = {
300 .owner = THIS_MODULE, 336 .owner = THIS_MODULE,
301 .open = drm_open, 337 .open = drm_open,
@@ -310,15 +346,6 @@ static struct drm_driver kms_driver = {
310#endif 346#endif
311 }, 347 },
312 348
313 .pci_driver = {
314 .name = DRIVER_NAME,
315 .id_table = pciidlist,
316 .probe = radeon_pci_probe,
317 .remove = radeon_pci_remove,
318 .suspend = radeon_pci_suspend,
319 .resume = radeon_pci_resume,
320 },
321
322 .name = DRIVER_NAME, 349 .name = DRIVER_NAME,
323 .desc = DRIVER_DESC, 350 .desc = DRIVER_DESC,
324 .date = DRIVER_DATE, 351 .date = DRIVER_DATE,
@@ -328,15 +355,32 @@ static struct drm_driver kms_driver = {
328}; 355};
329 356
330static struct drm_driver *driver; 357static struct drm_driver *driver;
358static struct pci_driver *pdriver;
359
360static struct pci_driver radeon_pci_driver = {
361 .name = DRIVER_NAME,
362 .id_table = pciidlist,
363};
364
365static struct pci_driver radeon_kms_pci_driver = {
366 .name = DRIVER_NAME,
367 .id_table = pciidlist,
368 .probe = radeon_pci_probe,
369 .remove = radeon_pci_remove,
370 .suspend = radeon_pci_suspend,
371 .resume = radeon_pci_resume,
372};
331 373
332static int __init radeon_init(void) 374static int __init radeon_init(void)
333{ 375{
334 driver = &driver_old; 376 driver = &driver_old;
377 pdriver = &radeon_pci_driver;
335 driver->num_ioctls = radeon_max_ioctl; 378 driver->num_ioctls = radeon_max_ioctl;
336#ifdef CONFIG_VGA_CONSOLE 379#ifdef CONFIG_VGA_CONSOLE
337 if (vgacon_text_force() && radeon_modeset == -1) { 380 if (vgacon_text_force() && radeon_modeset == -1) {
338 DRM_INFO("VGACON disable radeon kernel modesetting.\n"); 381 DRM_INFO("VGACON disable radeon kernel modesetting.\n");
339 driver = &driver_old; 382 driver = &driver_old;
383 pdriver = &radeon_pci_driver;
340 driver->driver_features &= ~DRIVER_MODESET; 384 driver->driver_features &= ~DRIVER_MODESET;
341 radeon_modeset = 0; 385 radeon_modeset = 0;
342 } 386 }
@@ -354,18 +398,19 @@ static int __init radeon_init(void)
354 if (radeon_modeset == 1) { 398 if (radeon_modeset == 1) {
355 DRM_INFO("radeon kernel modesetting enabled.\n"); 399 DRM_INFO("radeon kernel modesetting enabled.\n");
356 driver = &kms_driver; 400 driver = &kms_driver;
401 pdriver = &radeon_kms_pci_driver;
357 driver->driver_features |= DRIVER_MODESET; 402 driver->driver_features |= DRIVER_MODESET;
358 driver->num_ioctls = radeon_max_kms_ioctl; 403 driver->num_ioctls = radeon_max_kms_ioctl;
359 radeon_register_atpx_handler(); 404 radeon_register_atpx_handler();
360 } 405 }
361 /* if the vga console setting is enabled still 406 /* if the vga console setting is enabled still
362 * let modprobe override it */ 407 * let modprobe override it */
363 return drm_init(driver); 408 return drm_pci_init(driver, pdriver);
364} 409}
365 410
366static void __exit radeon_exit(void) 411static void __exit radeon_exit(void)
367{ 412{
368 drm_exit(driver); 413 drm_pci_exit(driver, pdriver);
369 radeon_unregister_atpx_handler(); 414 radeon_unregister_atpx_handler();
370} 415}
371 416
diff --git a/drivers/gpu/drm/radeon/radeon_drv.h b/drivers/gpu/drm/radeon/radeon_drv.h
index 448eba89d1e6..a1b59ca96d01 100644
--- a/drivers/gpu/drm/radeon/radeon_drv.h
+++ b/drivers/gpu/drm/radeon/radeon_drv.h
@@ -271,7 +271,7 @@ typedef struct drm_radeon_private {
271 271
272 int have_z_offset; 272 int have_z_offset;
273 273
274 /* starting from here on, data is preserved accross an open */ 274 /* starting from here on, data is preserved across an open */
275 uint32_t flags; /* see radeon_chip_flags */ 275 uint32_t flags; /* see radeon_chip_flags */
276 resource_size_t fb_aper_offset; 276 resource_size_t fb_aper_offset;
277 277
@@ -1524,6 +1524,7 @@ extern u32 radeon_get_scratch(drm_radeon_private_t *dev_priv, int index);
1524#define R600_CP_RB_CNTL 0xc104 1524#define R600_CP_RB_CNTL 0xc104
1525# define R600_RB_BUFSZ(x) ((x) << 0) 1525# define R600_RB_BUFSZ(x) ((x) << 0)
1526# define R600_RB_BLKSZ(x) ((x) << 8) 1526# define R600_RB_BLKSZ(x) ((x) << 8)
1527# define R600_BUF_SWAP_32BIT (2 << 16)
1527# define R600_RB_NO_UPDATE (1 << 27) 1528# define R600_RB_NO_UPDATE (1 << 27)
1528# define R600_RB_RPTR_WR_ENA (1 << 31) 1529# define R600_RB_RPTR_WR_ENA (1 << 31)
1529#define R600_CP_RB_RPTR_WR 0xc108 1530#define R600_CP_RB_RPTR_WR 0xc108
diff --git a/drivers/gpu/drm/radeon/radeon_encoders.c b/drivers/gpu/drm/radeon/radeon_encoders.c
index 2c293e8304d6..b293487e5aa3 100644
--- a/drivers/gpu/drm/radeon/radeon_encoders.c
+++ b/drivers/gpu/drm/radeon/radeon_encoders.c
@@ -176,6 +176,7 @@ static inline bool radeon_encoder_is_digital(struct drm_encoder *encoder)
176 return false; 176 return false;
177 } 177 }
178} 178}
179
179void 180void
180radeon_link_encoder_connector(struct drm_device *dev) 181radeon_link_encoder_connector(struct drm_device *dev)
181{ 182{
@@ -228,6 +229,62 @@ radeon_get_connector_for_encoder(struct drm_encoder *encoder)
228 return NULL; 229 return NULL;
229} 230}
230 231
232static struct drm_connector *
233radeon_get_connector_for_encoder_init(struct drm_encoder *encoder)
234{
235 struct drm_device *dev = encoder->dev;
236 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
237 struct drm_connector *connector;
238 struct radeon_connector *radeon_connector;
239
240 list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
241 radeon_connector = to_radeon_connector(connector);
242 if (radeon_encoder->devices & radeon_connector->devices)
243 return connector;
244 }
245 return NULL;
246}
247
248struct drm_encoder *radeon_atom_get_external_encoder(struct drm_encoder *encoder)
249{
250 struct drm_device *dev = encoder->dev;
251 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
252 struct drm_encoder *other_encoder;
253 struct radeon_encoder *other_radeon_encoder;
254
255 if (radeon_encoder->is_ext_encoder)
256 return NULL;
257
258 list_for_each_entry(other_encoder, &dev->mode_config.encoder_list, head) {
259 if (other_encoder == encoder)
260 continue;
261 other_radeon_encoder = to_radeon_encoder(other_encoder);
262 if (other_radeon_encoder->is_ext_encoder &&
263 (radeon_encoder->devices & other_radeon_encoder->devices))
264 return other_encoder;
265 }
266 return NULL;
267}
268
269bool radeon_encoder_is_dp_bridge(struct drm_encoder *encoder)
270{
271 struct drm_encoder *other_encoder = radeon_atom_get_external_encoder(encoder);
272
273 if (other_encoder) {
274 struct radeon_encoder *radeon_encoder = to_radeon_encoder(other_encoder);
275
276 switch (radeon_encoder->encoder_id) {
277 case ENCODER_OBJECT_ID_TRAVIS:
278 case ENCODER_OBJECT_ID_NUTMEG:
279 return true;
280 default:
281 return false;
282 }
283 }
284
285 return false;
286}
287
231void radeon_panel_mode_fixup(struct drm_encoder *encoder, 288void radeon_panel_mode_fixup(struct drm_encoder *encoder,
232 struct drm_display_mode *adjusted_mode) 289 struct drm_display_mode *adjusted_mode)
233{ 290{
@@ -310,7 +367,8 @@ static bool radeon_atom_mode_fixup(struct drm_encoder *encoder,
310 } 367 }
311 368
312 if (ASIC_IS_DCE3(rdev) && 369 if (ASIC_IS_DCE3(rdev) &&
313 (radeon_encoder->active_device & (ATOM_DEVICE_DFP_SUPPORT | ATOM_DEVICE_LCD_SUPPORT))) { 370 ((radeon_encoder->active_device & (ATOM_DEVICE_DFP_SUPPORT | ATOM_DEVICE_LCD_SUPPORT)) ||
371 radeon_encoder_is_dp_bridge(encoder))) {
314 struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); 372 struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);
315 radeon_dp_set_link_config(connector, mode); 373 radeon_dp_set_link_config(connector, mode);
316 } 374 }
@@ -426,52 +484,49 @@ atombios_tv_setup(struct drm_encoder *encoder, int action)
426 484
427} 485}
428 486
429void 487union dvo_encoder_control {
430atombios_external_tmds_setup(struct drm_encoder *encoder, int action) 488 ENABLE_EXTERNAL_TMDS_ENCODER_PS_ALLOCATION ext_tmds;
431{ 489 DVO_ENCODER_CONTROL_PS_ALLOCATION dvo;
432 struct drm_device *dev = encoder->dev; 490 DVO_ENCODER_CONTROL_PS_ALLOCATION_V3 dvo_v3;
433 struct radeon_device *rdev = dev->dev_private; 491};
434 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
435 ENABLE_EXTERNAL_TMDS_ENCODER_PS_ALLOCATION args;
436 int index = 0;
437
438 memset(&args, 0, sizeof(args));
439
440 index = GetIndexIntoMasterTable(COMMAND, DVOEncoderControl);
441
442 args.sXTmdsEncoder.ucEnable = action;
443
444 if (radeon_encoder->pixel_clock > 165000)
445 args.sXTmdsEncoder.ucMisc = PANEL_ENCODER_MISC_DUAL;
446
447 /*if (pScrn->rgbBits == 8)*/
448 args.sXTmdsEncoder.ucMisc |= (1 << 1);
449
450 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
451
452}
453 492
454static void 493void
455atombios_ddia_setup(struct drm_encoder *encoder, int action) 494atombios_dvo_setup(struct drm_encoder *encoder, int action)
456{ 495{
457 struct drm_device *dev = encoder->dev; 496 struct drm_device *dev = encoder->dev;
458 struct radeon_device *rdev = dev->dev_private; 497 struct radeon_device *rdev = dev->dev_private;
459 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 498 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
460 DVO_ENCODER_CONTROL_PS_ALLOCATION args; 499 union dvo_encoder_control args;
461 int index = 0; 500 int index = GetIndexIntoMasterTable(COMMAND, DVOEncoderControl);
462 501
463 memset(&args, 0, sizeof(args)); 502 memset(&args, 0, sizeof(args));
464 503
465 index = GetIndexIntoMasterTable(COMMAND, DVOEncoderControl); 504 if (ASIC_IS_DCE3(rdev)) {
505 /* DCE3+ */
506 args.dvo_v3.ucAction = action;
507 args.dvo_v3.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10);
508 args.dvo_v3.ucDVOConfig = 0; /* XXX */
509 } else if (ASIC_IS_DCE2(rdev)) {
510 /* DCE2 (pre-DCE3 R6xx, RS600/690/740 */
511 args.dvo.sDVOEncoder.ucAction = action;
512 args.dvo.sDVOEncoder.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10);
513 /* DFP1, CRT1, TV1 depending on the type of port */
514 args.dvo.sDVOEncoder.ucDeviceType = ATOM_DEVICE_DFP1_INDEX;
515
516 if (radeon_encoder->pixel_clock > 165000)
517 args.dvo.sDVOEncoder.usDevAttr.sDigAttrib.ucAttribute |= PANEL_ENCODER_MISC_DUAL;
518 } else {
519 /* R4xx, R5xx */
520 args.ext_tmds.sXTmdsEncoder.ucEnable = action;
466 521
467 args.sDVOEncoder.ucAction = action; 522 if (radeon_encoder->pixel_clock > 165000)
468 args.sDVOEncoder.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10); 523 args.ext_tmds.sXTmdsEncoder.ucMisc |= PANEL_ENCODER_MISC_DUAL;
469 524
470 if (radeon_encoder->pixel_clock > 165000) 525 /*if (pScrn->rgbBits == 8)*/
471 args.sDVOEncoder.usDevAttr.sDigAttrib.ucAttribute = PANEL_ENCODER_MISC_DUAL; 526 args.ext_tmds.sXTmdsEncoder.ucMisc |= ATOM_PANEL_MISC_888RGB;
527 }
472 528
473 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 529 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
474
475} 530}
476 531
477union lvds_encoder_control { 532union lvds_encoder_control {
@@ -529,17 +584,17 @@ atombios_digital_setup(struct drm_encoder *encoder, int action)
529 args.v1.ucMisc |= PANEL_ENCODER_MISC_HDMI_TYPE; 584 args.v1.ucMisc |= PANEL_ENCODER_MISC_HDMI_TYPE;
530 args.v1.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10); 585 args.v1.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10);
531 if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) { 586 if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) {
532 if (dig->lvds_misc & ATOM_PANEL_MISC_DUAL) 587 if (dig->lcd_misc & ATOM_PANEL_MISC_DUAL)
533 args.v1.ucMisc |= PANEL_ENCODER_MISC_DUAL; 588 args.v1.ucMisc |= PANEL_ENCODER_MISC_DUAL;
534 if (dig->lvds_misc & ATOM_PANEL_MISC_888RGB) 589 if (dig->lcd_misc & ATOM_PANEL_MISC_888RGB)
535 args.v1.ucMisc |= (1 << 1); 590 args.v1.ucMisc |= ATOM_PANEL_MISC_888RGB;
536 } else { 591 } else {
537 if (dig->linkb) 592 if (dig->linkb)
538 args.v1.ucMisc |= PANEL_ENCODER_MISC_TMDS_LINKB; 593 args.v1.ucMisc |= PANEL_ENCODER_MISC_TMDS_LINKB;
539 if (radeon_encoder->pixel_clock > 165000) 594 if (radeon_encoder->pixel_clock > 165000)
540 args.v1.ucMisc |= PANEL_ENCODER_MISC_DUAL; 595 args.v1.ucMisc |= PANEL_ENCODER_MISC_DUAL;
541 /*if (pScrn->rgbBits == 8) */ 596 /*if (pScrn->rgbBits == 8) */
542 args.v1.ucMisc |= (1 << 1); 597 args.v1.ucMisc |= ATOM_PANEL_MISC_888RGB;
543 } 598 }
544 break; 599 break;
545 case 2: 600 case 2:
@@ -558,18 +613,18 @@ atombios_digital_setup(struct drm_encoder *encoder, int action)
558 args.v2.ucTemporal = 0; 613 args.v2.ucTemporal = 0;
559 args.v2.ucFRC = 0; 614 args.v2.ucFRC = 0;
560 if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) { 615 if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) {
561 if (dig->lvds_misc & ATOM_PANEL_MISC_DUAL) 616 if (dig->lcd_misc & ATOM_PANEL_MISC_DUAL)
562 args.v2.ucMisc |= PANEL_ENCODER_MISC_DUAL; 617 args.v2.ucMisc |= PANEL_ENCODER_MISC_DUAL;
563 if (dig->lvds_misc & ATOM_PANEL_MISC_SPATIAL) { 618 if (dig->lcd_misc & ATOM_PANEL_MISC_SPATIAL) {
564 args.v2.ucSpatial = PANEL_ENCODER_SPATIAL_DITHER_EN; 619 args.v2.ucSpatial = PANEL_ENCODER_SPATIAL_DITHER_EN;
565 if (dig->lvds_misc & ATOM_PANEL_MISC_888RGB) 620 if (dig->lcd_misc & ATOM_PANEL_MISC_888RGB)
566 args.v2.ucSpatial |= PANEL_ENCODER_SPATIAL_DITHER_DEPTH; 621 args.v2.ucSpatial |= PANEL_ENCODER_SPATIAL_DITHER_DEPTH;
567 } 622 }
568 if (dig->lvds_misc & ATOM_PANEL_MISC_TEMPORAL) { 623 if (dig->lcd_misc & ATOM_PANEL_MISC_TEMPORAL) {
569 args.v2.ucTemporal = PANEL_ENCODER_TEMPORAL_DITHER_EN; 624 args.v2.ucTemporal = PANEL_ENCODER_TEMPORAL_DITHER_EN;
570 if (dig->lvds_misc & ATOM_PANEL_MISC_888RGB) 625 if (dig->lcd_misc & ATOM_PANEL_MISC_888RGB)
571 args.v2.ucTemporal |= PANEL_ENCODER_TEMPORAL_DITHER_DEPTH; 626 args.v2.ucTemporal |= PANEL_ENCODER_TEMPORAL_DITHER_DEPTH;
572 if (((dig->lvds_misc >> ATOM_PANEL_MISC_GREY_LEVEL_SHIFT) & 0x3) == 2) 627 if (((dig->lcd_misc >> ATOM_PANEL_MISC_GREY_LEVEL_SHIFT) & 0x3) == 2)
573 args.v2.ucTemporal |= PANEL_ENCODER_TEMPORAL_LEVEL_4; 628 args.v2.ucTemporal |= PANEL_ENCODER_TEMPORAL_LEVEL_4;
574 } 629 }
575 } else { 630 } else {
@@ -595,22 +650,33 @@ atombios_digital_setup(struct drm_encoder *encoder, int action)
595int 650int
596atombios_get_encoder_mode(struct drm_encoder *encoder) 651atombios_get_encoder_mode(struct drm_encoder *encoder)
597{ 652{
653 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
598 struct drm_device *dev = encoder->dev; 654 struct drm_device *dev = encoder->dev;
599 struct radeon_device *rdev = dev->dev_private; 655 struct radeon_device *rdev = dev->dev_private;
600 struct drm_connector *connector; 656 struct drm_connector *connector;
601 struct radeon_connector *radeon_connector; 657 struct radeon_connector *radeon_connector;
602 struct radeon_connector_atom_dig *dig_connector; 658 struct radeon_connector_atom_dig *dig_connector;
603 659
660 /* dp bridges are always DP */
661 if (radeon_encoder_is_dp_bridge(encoder))
662 return ATOM_ENCODER_MODE_DP;
663
664 /* DVO is always DVO */
665 if (radeon_encoder->encoder_id == ATOM_ENCODER_MODE_DVO)
666 return ATOM_ENCODER_MODE_DVO;
667
604 connector = radeon_get_connector_for_encoder(encoder); 668 connector = radeon_get_connector_for_encoder(encoder);
669 /* if we don't have an active device yet, just use one of
670 * the connectors tied to the encoder.
671 */
605 if (!connector) 672 if (!connector)
606 return 0; 673 connector = radeon_get_connector_for_encoder_init(encoder);
607
608 radeon_connector = to_radeon_connector(connector); 674 radeon_connector = to_radeon_connector(connector);
609 675
610 switch (connector->connector_type) { 676 switch (connector->connector_type) {
611 case DRM_MODE_CONNECTOR_DVII: 677 case DRM_MODE_CONNECTOR_DVII:
612 case DRM_MODE_CONNECTOR_HDMIB: /* HDMI-B is basically DL-DVI; analog works fine */ 678 case DRM_MODE_CONNECTOR_HDMIB: /* HDMI-B is basically DL-DVI; analog works fine */
613 if (drm_detect_hdmi_monitor(radeon_connector->edid)) { 679 if (drm_detect_monitor_audio(radeon_connector->edid) && radeon_audio) {
614 /* fix me */ 680 /* fix me */
615 if (ASIC_IS_DCE4(rdev)) 681 if (ASIC_IS_DCE4(rdev))
616 return ATOM_ENCODER_MODE_DVI; 682 return ATOM_ENCODER_MODE_DVI;
@@ -624,7 +690,7 @@ atombios_get_encoder_mode(struct drm_encoder *encoder)
624 case DRM_MODE_CONNECTOR_DVID: 690 case DRM_MODE_CONNECTOR_DVID:
625 case DRM_MODE_CONNECTOR_HDMIA: 691 case DRM_MODE_CONNECTOR_HDMIA:
626 default: 692 default:
627 if (drm_detect_hdmi_monitor(radeon_connector->edid)) { 693 if (drm_detect_monitor_audio(radeon_connector->edid) && radeon_audio) {
628 /* fix me */ 694 /* fix me */
629 if (ASIC_IS_DCE4(rdev)) 695 if (ASIC_IS_DCE4(rdev))
630 return ATOM_ENCODER_MODE_DVI; 696 return ATOM_ENCODER_MODE_DVI;
@@ -637,12 +703,11 @@ atombios_get_encoder_mode(struct drm_encoder *encoder)
637 return ATOM_ENCODER_MODE_LVDS; 703 return ATOM_ENCODER_MODE_LVDS;
638 break; 704 break;
639 case DRM_MODE_CONNECTOR_DisplayPort: 705 case DRM_MODE_CONNECTOR_DisplayPort:
640 case DRM_MODE_CONNECTOR_eDP:
641 dig_connector = radeon_connector->con_priv; 706 dig_connector = radeon_connector->con_priv;
642 if ((dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) || 707 if ((dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) ||
643 (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP)) 708 (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP))
644 return ATOM_ENCODER_MODE_DP; 709 return ATOM_ENCODER_MODE_DP;
645 else if (drm_detect_hdmi_monitor(radeon_connector->edid)) { 710 else if (drm_detect_monitor_audio(radeon_connector->edid) && radeon_audio) {
646 /* fix me */ 711 /* fix me */
647 if (ASIC_IS_DCE4(rdev)) 712 if (ASIC_IS_DCE4(rdev))
648 return ATOM_ENCODER_MODE_DVI; 713 return ATOM_ENCODER_MODE_DVI;
@@ -651,6 +716,8 @@ atombios_get_encoder_mode(struct drm_encoder *encoder)
651 } else 716 } else
652 return ATOM_ENCODER_MODE_DVI; 717 return ATOM_ENCODER_MODE_DVI;
653 break; 718 break;
719 case DRM_MODE_CONNECTOR_eDP:
720 return ATOM_ENCODER_MODE_DP;
654 case DRM_MODE_CONNECTOR_DVIA: 721 case DRM_MODE_CONNECTOR_DVIA:
655 case DRM_MODE_CONNECTOR_VGA: 722 case DRM_MODE_CONNECTOR_VGA:
656 return ATOM_ENCODER_MODE_CRT; 723 return ATOM_ENCODER_MODE_CRT;
@@ -681,8 +748,8 @@ atombios_get_encoder_mode(struct drm_encoder *encoder)
681 * - 2 DIG encoder blocks. 748 * - 2 DIG encoder blocks.
682 * DIG1/2 can drive UNIPHY0/1/2 link A or link B 749 * DIG1/2 can drive UNIPHY0/1/2 link A or link B
683 * 750 *
684 * DCE 4.0 751 * DCE 4.0/5.0
685 * - 3 DIG transmitter blocks UNPHY0/1/2 (links A and B). 752 * - 3 DIG transmitter blocks UNIPHY0/1/2 (links A and B).
686 * Supports up to 6 digital outputs 753 * Supports up to 6 digital outputs
687 * - 6 DIG encoder blocks. 754 * - 6 DIG encoder blocks.
688 * - DIG to PHY mapping is hardcoded 755 * - DIG to PHY mapping is hardcoded
@@ -693,6 +760,12 @@ atombios_get_encoder_mode(struct drm_encoder *encoder)
693 * DIG5 drives UNIPHY2 link A, A+B 760 * DIG5 drives UNIPHY2 link A, A+B
694 * DIG6 drives UNIPHY2 link B 761 * DIG6 drives UNIPHY2 link B
695 * 762 *
763 * DCE 4.1
764 * - 3 DIG transmitter blocks UNIPHY0/1/2 (links A and B).
765 * Supports up to 6 digital outputs
766 * - 2 DIG encoder blocks.
767 * DIG1/2 can drive UNIPHY0/1/2 link A or link B
768 *
696 * Routing 769 * Routing
697 * crtc -> dig encoder -> UNIPHY/LVTMA (1 or 2 links) 770 * crtc -> dig encoder -> UNIPHY/LVTMA (1 or 2 links)
698 * Examples: 771 * Examples:
@@ -706,10 +779,11 @@ union dig_encoder_control {
706 DIG_ENCODER_CONTROL_PS_ALLOCATION v1; 779 DIG_ENCODER_CONTROL_PS_ALLOCATION v1;
707 DIG_ENCODER_CONTROL_PARAMETERS_V2 v2; 780 DIG_ENCODER_CONTROL_PARAMETERS_V2 v2;
708 DIG_ENCODER_CONTROL_PARAMETERS_V3 v3; 781 DIG_ENCODER_CONTROL_PARAMETERS_V3 v3;
782 DIG_ENCODER_CONTROL_PARAMETERS_V4 v4;
709}; 783};
710 784
711void 785void
712atombios_dig_encoder_setup(struct drm_encoder *encoder, int action) 786atombios_dig_encoder_setup(struct drm_encoder *encoder, int action, int panel_mode)
713{ 787{
714 struct drm_device *dev = encoder->dev; 788 struct drm_device *dev = encoder->dev;
715 struct radeon_device *rdev = dev->dev_private; 789 struct radeon_device *rdev = dev->dev_private;
@@ -721,6 +795,8 @@ atombios_dig_encoder_setup(struct drm_encoder *encoder, int action)
721 uint8_t frev, crev; 795 uint8_t frev, crev;
722 int dp_clock = 0; 796 int dp_clock = 0;
723 int dp_lane_count = 0; 797 int dp_lane_count = 0;
798 int hpd_id = RADEON_HPD_NONE;
799 int bpc = 8;
724 800
725 if (connector) { 801 if (connector) {
726 struct radeon_connector *radeon_connector = to_radeon_connector(connector); 802 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
@@ -729,6 +805,8 @@ atombios_dig_encoder_setup(struct drm_encoder *encoder, int action)
729 805
730 dp_clock = dig_connector->dp_clock; 806 dp_clock = dig_connector->dp_clock;
731 dp_lane_count = dig_connector->dp_lane_count; 807 dp_lane_count = dig_connector->dp_lane_count;
808 hpd_id = radeon_connector->hpd.hpd;
809 bpc = connector->display_info.bpc;
732 } 810 }
733 811
734 /* no dig encoder assigned */ 812 /* no dig encoder assigned */
@@ -751,21 +829,81 @@ atombios_dig_encoder_setup(struct drm_encoder *encoder, int action)
751 829
752 args.v1.ucAction = action; 830 args.v1.ucAction = action;
753 args.v1.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10); 831 args.v1.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10);
754 args.v1.ucEncoderMode = atombios_get_encoder_mode(encoder); 832 if (action == ATOM_ENCODER_CMD_SETUP_PANEL_MODE)
833 args.v3.ucPanelMode = panel_mode;
834 else
835 args.v1.ucEncoderMode = atombios_get_encoder_mode(encoder);
755 836
756 if (args.v1.ucEncoderMode == ATOM_ENCODER_MODE_DP) { 837 if ((args.v1.ucEncoderMode == ATOM_ENCODER_MODE_DP) ||
757 if (dp_clock == 270000) 838 (args.v1.ucEncoderMode == ATOM_ENCODER_MODE_DP_MST))
758 args.v1.ucConfig |= ATOM_ENCODER_CONFIG_DPLINKRATE_2_70GHZ;
759 args.v1.ucLaneNum = dp_lane_count; 839 args.v1.ucLaneNum = dp_lane_count;
760 } else if (radeon_encoder->pixel_clock > 165000) 840 else if (radeon_encoder->pixel_clock > 165000)
761 args.v1.ucLaneNum = 8; 841 args.v1.ucLaneNum = 8;
762 else 842 else
763 args.v1.ucLaneNum = 4; 843 args.v1.ucLaneNum = 4;
764 844
765 if (ASIC_IS_DCE4(rdev)) { 845 if (ASIC_IS_DCE5(rdev)) {
846 if ((args.v1.ucEncoderMode == ATOM_ENCODER_MODE_DP) ||
847 (args.v1.ucEncoderMode == ATOM_ENCODER_MODE_DP_MST)) {
848 if (dp_clock == 270000)
849 args.v1.ucConfig |= ATOM_ENCODER_CONFIG_V4_DPLINKRATE_2_70GHZ;
850 else if (dp_clock == 540000)
851 args.v1.ucConfig |= ATOM_ENCODER_CONFIG_V4_DPLINKRATE_5_40GHZ;
852 }
853 args.v4.acConfig.ucDigSel = dig->dig_encoder;
854 switch (bpc) {
855 case 0:
856 args.v4.ucBitPerColor = PANEL_BPC_UNDEFINE;
857 break;
858 case 6:
859 args.v4.ucBitPerColor = PANEL_6BIT_PER_COLOR;
860 break;
861 case 8:
862 default:
863 args.v4.ucBitPerColor = PANEL_8BIT_PER_COLOR;
864 break;
865 case 10:
866 args.v4.ucBitPerColor = PANEL_10BIT_PER_COLOR;
867 break;
868 case 12:
869 args.v4.ucBitPerColor = PANEL_12BIT_PER_COLOR;
870 break;
871 case 16:
872 args.v4.ucBitPerColor = PANEL_16BIT_PER_COLOR;
873 break;
874 }
875 if (hpd_id == RADEON_HPD_NONE)
876 args.v4.ucHPD_ID = 0;
877 else
878 args.v4.ucHPD_ID = hpd_id + 1;
879 } else if (ASIC_IS_DCE4(rdev)) {
880 if ((args.v1.ucEncoderMode == ATOM_ENCODER_MODE_DP) && (dp_clock == 270000))
881 args.v1.ucConfig |= ATOM_ENCODER_CONFIG_V3_DPLINKRATE_2_70GHZ;
766 args.v3.acConfig.ucDigSel = dig->dig_encoder; 882 args.v3.acConfig.ucDigSel = dig->dig_encoder;
767 args.v3.ucBitPerColor = PANEL_8BIT_PER_COLOR; 883 switch (bpc) {
884 case 0:
885 args.v3.ucBitPerColor = PANEL_BPC_UNDEFINE;
886 break;
887 case 6:
888 args.v3.ucBitPerColor = PANEL_6BIT_PER_COLOR;
889 break;
890 case 8:
891 default:
892 args.v3.ucBitPerColor = PANEL_8BIT_PER_COLOR;
893 break;
894 case 10:
895 args.v3.ucBitPerColor = PANEL_10BIT_PER_COLOR;
896 break;
897 case 12:
898 args.v3.ucBitPerColor = PANEL_12BIT_PER_COLOR;
899 break;
900 case 16:
901 args.v3.ucBitPerColor = PANEL_16BIT_PER_COLOR;
902 break;
903 }
768 } else { 904 } else {
905 if ((args.v1.ucEncoderMode == ATOM_ENCODER_MODE_DP) && (dp_clock == 270000))
906 args.v1.ucConfig |= ATOM_ENCODER_CONFIG_DPLINKRATE_2_70GHZ;
769 switch (radeon_encoder->encoder_id) { 907 switch (radeon_encoder->encoder_id) {
770 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY: 908 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
771 args.v1.ucConfig = ATOM_ENCODER_CONFIG_V2_TRANSMITTER1; 909 args.v1.ucConfig = ATOM_ENCODER_CONFIG_V2_TRANSMITTER1;
@@ -792,6 +930,7 @@ union dig_transmitter_control {
792 DIG_TRANSMITTER_CONTROL_PS_ALLOCATION v1; 930 DIG_TRANSMITTER_CONTROL_PS_ALLOCATION v1;
793 DIG_TRANSMITTER_CONTROL_PARAMETERS_V2 v2; 931 DIG_TRANSMITTER_CONTROL_PARAMETERS_V2 v2;
794 DIG_TRANSMITTER_CONTROL_PARAMETERS_V3 v3; 932 DIG_TRANSMITTER_CONTROL_PARAMETERS_V3 v3;
933 DIG_TRANSMITTER_CONTROL_PARAMETERS_V4 v4;
795}; 934};
796 935
797void 936void
@@ -801,7 +940,7 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t
801 struct radeon_device *rdev = dev->dev_private; 940 struct radeon_device *rdev = dev->dev_private;
802 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 941 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
803 struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; 942 struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
804 struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); 943 struct drm_connector *connector;
805 union dig_transmitter_control args; 944 union dig_transmitter_control args;
806 int index = 0; 945 int index = 0;
807 uint8_t frev, crev; 946 uint8_t frev, crev;
@@ -811,6 +950,16 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t
811 int dp_lane_count = 0; 950 int dp_lane_count = 0;
812 int connector_object_id = 0; 951 int connector_object_id = 0;
813 int igp_lane_info = 0; 952 int igp_lane_info = 0;
953 int dig_encoder = dig->dig_encoder;
954
955 if (action == ATOM_TRANSMITTER_ACTION_INIT) {
956 connector = radeon_get_connector_for_encoder_init(encoder);
957 /* just needed to avoid bailing in the encoder check. the encoder
958 * isn't used for init
959 */
960 dig_encoder = 0;
961 } else
962 connector = radeon_get_connector_for_encoder(encoder);
814 963
815 if (connector) { 964 if (connector) {
816 struct radeon_connector *radeon_connector = to_radeon_connector(connector); 965 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
@@ -825,7 +974,7 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t
825 } 974 }
826 975
827 /* no dig encoder assigned */ 976 /* no dig encoder assigned */
828 if (dig->dig_encoder == -1) 977 if (dig_encoder == -1)
829 return; 978 return;
830 979
831 if (atombios_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_DP) 980 if (atombios_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_DP)
@@ -834,6 +983,9 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t
834 memset(&args, 0, sizeof(args)); 983 memset(&args, 0, sizeof(args));
835 984
836 switch (radeon_encoder->encoder_id) { 985 switch (radeon_encoder->encoder_id) {
986 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1:
987 index = GetIndexIntoMasterTable(COMMAND, DVOOutputControl);
988 break;
837 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY: 989 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
838 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: 990 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
839 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: 991 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
@@ -849,7 +1001,7 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t
849 1001
850 args.v1.ucAction = action; 1002 args.v1.ucAction = action;
851 if (action == ATOM_TRANSMITTER_ACTION_INIT) { 1003 if (action == ATOM_TRANSMITTER_ACTION_INIT) {
852 args.v1.usInitInfo = connector_object_id; 1004 args.v1.usInitInfo = cpu_to_le16(connector_object_id);
853 } else if (action == ATOM_TRANSMITTER_ACTION_SETUP_VSEMPH) { 1005 } else if (action == ATOM_TRANSMITTER_ACTION_SETUP_VSEMPH) {
854 args.v1.asMode.ucLaneSel = lane_num; 1006 args.v1.asMode.ucLaneSel = lane_num;
855 args.v1.asMode.ucLaneSet = lane_set; 1007 args.v1.asMode.ucLaneSet = lane_set;
@@ -870,10 +1022,10 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t
870 else 1022 else
871 args.v3.ucLaneNum = 4; 1023 args.v3.ucLaneNum = 4;
872 1024
873 if (dig->linkb) { 1025 if (dig->linkb)
874 args.v3.acConfig.ucLinkSel = 1; 1026 args.v3.acConfig.ucLinkSel = 1;
1027 if (dig_encoder & 1)
875 args.v3.acConfig.ucEncoderSel = 1; 1028 args.v3.acConfig.ucEncoderSel = 1;
876 }
877 1029
878 /* Select the PLL for the PHY 1030 /* Select the PLL for the PHY
879 * DP PHY should be clocked from external src if there is 1031 * DP PHY should be clocked from external src if there is
@@ -883,10 +1035,23 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t
883 struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc); 1035 struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc);
884 pll_id = radeon_crtc->pll_id; 1036 pll_id = radeon_crtc->pll_id;
885 } 1037 }
886 if (is_dp && rdev->clock.dp_extclk) 1038
887 args.v3.acConfig.ucRefClkSource = 2; /* external src */ 1039 if (ASIC_IS_DCE5(rdev)) {
888 else 1040 /* On DCE5 DCPLL usually generates the DP ref clock */
889 args.v3.acConfig.ucRefClkSource = pll_id; 1041 if (is_dp) {
1042 if (rdev->clock.dp_extclk)
1043 args.v4.acConfig.ucRefClkSource = ENCODER_REFCLK_SRC_EXTCLK;
1044 else
1045 args.v4.acConfig.ucRefClkSource = ENCODER_REFCLK_SRC_DCPLL;
1046 } else
1047 args.v4.acConfig.ucRefClkSource = pll_id;
1048 } else {
1049 /* On DCE4, if there is an external clock, it generates the DP ref clock */
1050 if (is_dp && rdev->clock.dp_extclk)
1051 args.v3.acConfig.ucRefClkSource = 2; /* external src */
1052 else
1053 args.v3.acConfig.ucRefClkSource = pll_id;
1054 }
890 1055
891 switch (radeon_encoder->encoder_id) { 1056 switch (radeon_encoder->encoder_id) {
892 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY: 1057 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
@@ -909,7 +1074,7 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t
909 args.v3.acConfig.fDualLinkConnector = 1; 1074 args.v3.acConfig.fDualLinkConnector = 1;
910 } 1075 }
911 } else if (ASIC_IS_DCE32(rdev)) { 1076 } else if (ASIC_IS_DCE32(rdev)) {
912 args.v2.acConfig.ucEncoderSel = dig->dig_encoder; 1077 args.v2.acConfig.ucEncoderSel = dig_encoder;
913 if (dig->linkb) 1078 if (dig->linkb)
914 args.v2.acConfig.ucLinkSel = 1; 1079 args.v2.acConfig.ucLinkSel = 1;
915 1080
@@ -925,9 +1090,10 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t
925 break; 1090 break;
926 } 1091 }
927 1092
928 if (is_dp) 1093 if (is_dp) {
929 args.v2.acConfig.fCoherentMode = 1; 1094 args.v2.acConfig.fCoherentMode = 1;
930 else if (radeon_encoder->devices & (ATOM_DEVICE_DFP_SUPPORT)) { 1095 args.v2.acConfig.fDPConnector = 1;
1096 } else if (radeon_encoder->devices & (ATOM_DEVICE_DFP_SUPPORT)) {
931 if (dig->coherent_mode) 1097 if (dig->coherent_mode)
932 args.v2.acConfig.fCoherentMode = 1; 1098 args.v2.acConfig.fCoherentMode = 1;
933 if (radeon_encoder->pixel_clock > 165000) 1099 if (radeon_encoder->pixel_clock > 165000)
@@ -936,7 +1102,7 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t
936 } else { 1102 } else {
937 args.v1.ucConfig = ATOM_TRANSMITTER_CONFIG_CLKSRC_PPLL; 1103 args.v1.ucConfig = ATOM_TRANSMITTER_CONFIG_CLKSRC_PPLL;
938 1104
939 if (dig->dig_encoder) 1105 if (dig_encoder)
940 args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_DIG2_ENCODER; 1106 args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_DIG2_ENCODER;
941 else 1107 else
942 args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_DIG1_ENCODER; 1108 args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_DIG1_ENCODER;
@@ -978,6 +1144,180 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t
978 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 1144 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
979} 1145}
980 1146
1147bool
1148atombios_set_edp_panel_power(struct drm_connector *connector, int action)
1149{
1150 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
1151 struct drm_device *dev = radeon_connector->base.dev;
1152 struct radeon_device *rdev = dev->dev_private;
1153 union dig_transmitter_control args;
1154 int index = GetIndexIntoMasterTable(COMMAND, UNIPHYTransmitterControl);
1155 uint8_t frev, crev;
1156
1157 if (connector->connector_type != DRM_MODE_CONNECTOR_eDP)
1158 goto done;
1159
1160 if (!ASIC_IS_DCE4(rdev))
1161 goto done;
1162
1163 if ((action != ATOM_TRANSMITTER_ACTION_POWER_ON) &&
1164 (action != ATOM_TRANSMITTER_ACTION_POWER_OFF))
1165 goto done;
1166
1167 if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev))
1168 goto done;
1169
1170 memset(&args, 0, sizeof(args));
1171
1172 args.v1.ucAction = action;
1173
1174 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
1175
1176 /* wait for the panel to power up */
1177 if (action == ATOM_TRANSMITTER_ACTION_POWER_ON) {
1178 int i;
1179
1180 for (i = 0; i < 300; i++) {
1181 if (radeon_hpd_sense(rdev, radeon_connector->hpd.hpd))
1182 return true;
1183 mdelay(1);
1184 }
1185 return false;
1186 }
1187done:
1188 return true;
1189}
1190
1191union external_encoder_control {
1192 EXTERNAL_ENCODER_CONTROL_PS_ALLOCATION v1;
1193 EXTERNAL_ENCODER_CONTROL_PS_ALLOCATION_V3 v3;
1194};
1195
1196static void
1197atombios_external_encoder_setup(struct drm_encoder *encoder,
1198 struct drm_encoder *ext_encoder,
1199 int action)
1200{
1201 struct drm_device *dev = encoder->dev;
1202 struct radeon_device *rdev = dev->dev_private;
1203 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
1204 struct radeon_encoder *ext_radeon_encoder = to_radeon_encoder(ext_encoder);
1205 union external_encoder_control args;
1206 struct drm_connector *connector;
1207 int index = GetIndexIntoMasterTable(COMMAND, ExternalEncoderControl);
1208 u8 frev, crev;
1209 int dp_clock = 0;
1210 int dp_lane_count = 0;
1211 int connector_object_id = 0;
1212 u32 ext_enum = (ext_radeon_encoder->encoder_enum & ENUM_ID_MASK) >> ENUM_ID_SHIFT;
1213 int bpc = 8;
1214
1215 if (action == EXTERNAL_ENCODER_ACTION_V3_ENCODER_INIT)
1216 connector = radeon_get_connector_for_encoder_init(encoder);
1217 else
1218 connector = radeon_get_connector_for_encoder(encoder);
1219
1220 if (connector) {
1221 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
1222 struct radeon_connector_atom_dig *dig_connector =
1223 radeon_connector->con_priv;
1224
1225 dp_clock = dig_connector->dp_clock;
1226 dp_lane_count = dig_connector->dp_lane_count;
1227 connector_object_id =
1228 (radeon_connector->connector_object_id & OBJECT_ID_MASK) >> OBJECT_ID_SHIFT;
1229 bpc = connector->display_info.bpc;
1230 }
1231
1232 memset(&args, 0, sizeof(args));
1233
1234 if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev))
1235 return;
1236
1237 switch (frev) {
1238 case 1:
1239 /* no params on frev 1 */
1240 break;
1241 case 2:
1242 switch (crev) {
1243 case 1:
1244 case 2:
1245 args.v1.sDigEncoder.ucAction = action;
1246 args.v1.sDigEncoder.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10);
1247 args.v1.sDigEncoder.ucEncoderMode = atombios_get_encoder_mode(encoder);
1248
1249 if (args.v1.sDigEncoder.ucEncoderMode == ATOM_ENCODER_MODE_DP) {
1250 if (dp_clock == 270000)
1251 args.v1.sDigEncoder.ucConfig |= ATOM_ENCODER_CONFIG_DPLINKRATE_2_70GHZ;
1252 args.v1.sDigEncoder.ucLaneNum = dp_lane_count;
1253 } else if (radeon_encoder->pixel_clock > 165000)
1254 args.v1.sDigEncoder.ucLaneNum = 8;
1255 else
1256 args.v1.sDigEncoder.ucLaneNum = 4;
1257 break;
1258 case 3:
1259 args.v3.sExtEncoder.ucAction = action;
1260 if (action == EXTERNAL_ENCODER_ACTION_V3_ENCODER_INIT)
1261 args.v3.sExtEncoder.usConnectorId = cpu_to_le16(connector_object_id);
1262 else
1263 args.v3.sExtEncoder.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10);
1264 args.v3.sExtEncoder.ucEncoderMode = atombios_get_encoder_mode(encoder);
1265
1266 if (args.v3.sExtEncoder.ucEncoderMode == ATOM_ENCODER_MODE_DP) {
1267 if (dp_clock == 270000)
1268 args.v3.sExtEncoder.ucConfig |= EXTERNAL_ENCODER_CONFIG_V3_DPLINKRATE_2_70GHZ;
1269 else if (dp_clock == 540000)
1270 args.v3.sExtEncoder.ucConfig |= EXTERNAL_ENCODER_CONFIG_V3_DPLINKRATE_5_40GHZ;
1271 args.v3.sExtEncoder.ucLaneNum = dp_lane_count;
1272 } else if (radeon_encoder->pixel_clock > 165000)
1273 args.v3.sExtEncoder.ucLaneNum = 8;
1274 else
1275 args.v3.sExtEncoder.ucLaneNum = 4;
1276 switch (ext_enum) {
1277 case GRAPH_OBJECT_ENUM_ID1:
1278 args.v3.sExtEncoder.ucConfig |= EXTERNAL_ENCODER_CONFIG_V3_ENCODER1;
1279 break;
1280 case GRAPH_OBJECT_ENUM_ID2:
1281 args.v3.sExtEncoder.ucConfig |= EXTERNAL_ENCODER_CONFIG_V3_ENCODER2;
1282 break;
1283 case GRAPH_OBJECT_ENUM_ID3:
1284 args.v3.sExtEncoder.ucConfig |= EXTERNAL_ENCODER_CONFIG_V3_ENCODER3;
1285 break;
1286 }
1287 switch (bpc) {
1288 case 0:
1289 args.v3.sExtEncoder.ucBitPerColor = PANEL_BPC_UNDEFINE;
1290 break;
1291 case 6:
1292 args.v3.sExtEncoder.ucBitPerColor = PANEL_6BIT_PER_COLOR;
1293 break;
1294 case 8:
1295 default:
1296 args.v3.sExtEncoder.ucBitPerColor = PANEL_8BIT_PER_COLOR;
1297 break;
1298 case 10:
1299 args.v3.sExtEncoder.ucBitPerColor = PANEL_10BIT_PER_COLOR;
1300 break;
1301 case 12:
1302 args.v3.sExtEncoder.ucBitPerColor = PANEL_12BIT_PER_COLOR;
1303 break;
1304 case 16:
1305 args.v3.sExtEncoder.ucBitPerColor = PANEL_16BIT_PER_COLOR;
1306 break;
1307 }
1308 break;
1309 default:
1310 DRM_ERROR("Unknown table version: %d, %d\n", frev, crev);
1311 return;
1312 }
1313 break;
1314 default:
1315 DRM_ERROR("Unknown table version: %d, %d\n", frev, crev);
1316 return;
1317 }
1318 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
1319}
1320
981static void 1321static void
982atombios_yuv_setup(struct drm_encoder *encoder, bool enable) 1322atombios_yuv_setup(struct drm_encoder *encoder, bool enable)
983{ 1323{
@@ -1021,9 +1361,12 @@ radeon_atom_encoder_dpms(struct drm_encoder *encoder, int mode)
1021 struct drm_device *dev = encoder->dev; 1361 struct drm_device *dev = encoder->dev;
1022 struct radeon_device *rdev = dev->dev_private; 1362 struct radeon_device *rdev = dev->dev_private;
1023 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 1363 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
1364 struct drm_encoder *ext_encoder = radeon_atom_get_external_encoder(encoder);
1024 DISPLAY_DEVICE_OUTPUT_CONTROL_PS_ALLOCATION args; 1365 DISPLAY_DEVICE_OUTPUT_CONTROL_PS_ALLOCATION args;
1025 int index = 0; 1366 int index = 0;
1026 bool is_dig = false; 1367 bool is_dig = false;
1368 bool is_dce5_dac = false;
1369 bool is_dce5_dvo = false;
1027 1370
1028 memset(&args, 0, sizeof(args)); 1371 memset(&args, 0, sizeof(args));
1029 1372
@@ -1043,9 +1386,16 @@ radeon_atom_encoder_dpms(struct drm_encoder *encoder, int mode)
1043 break; 1386 break;
1044 case ENCODER_OBJECT_ID_INTERNAL_DVO1: 1387 case ENCODER_OBJECT_ID_INTERNAL_DVO1:
1045 case ENCODER_OBJECT_ID_INTERNAL_DDI: 1388 case ENCODER_OBJECT_ID_INTERNAL_DDI:
1046 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1:
1047 index = GetIndexIntoMasterTable(COMMAND, DVOOutputControl); 1389 index = GetIndexIntoMasterTable(COMMAND, DVOOutputControl);
1048 break; 1390 break;
1391 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1:
1392 if (ASIC_IS_DCE5(rdev))
1393 is_dce5_dvo = true;
1394 else if (ASIC_IS_DCE3(rdev))
1395 is_dig = true;
1396 else
1397 index = GetIndexIntoMasterTable(COMMAND, DVOOutputControl);
1398 break;
1049 case ENCODER_OBJECT_ID_INTERNAL_LVDS: 1399 case ENCODER_OBJECT_ID_INTERNAL_LVDS:
1050 index = GetIndexIntoMasterTable(COMMAND, LCD1OutputControl); 1400 index = GetIndexIntoMasterTable(COMMAND, LCD1OutputControl);
1051 break; 1401 break;
@@ -1057,12 +1407,16 @@ radeon_atom_encoder_dpms(struct drm_encoder *encoder, int mode)
1057 break; 1407 break;
1058 case ENCODER_OBJECT_ID_INTERNAL_DAC1: 1408 case ENCODER_OBJECT_ID_INTERNAL_DAC1:
1059 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1: 1409 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1:
1060 if (radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT)) 1410 if (ASIC_IS_DCE5(rdev))
1061 index = GetIndexIntoMasterTable(COMMAND, TV1OutputControl); 1411 is_dce5_dac = true;
1062 else if (radeon_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT)) 1412 else {
1063 index = GetIndexIntoMasterTable(COMMAND, CV1OutputControl); 1413 if (radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT))
1064 else 1414 index = GetIndexIntoMasterTable(COMMAND, TV1OutputControl);
1065 index = GetIndexIntoMasterTable(COMMAND, DAC1OutputControl); 1415 else if (radeon_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT))
1416 index = GetIndexIntoMasterTable(COMMAND, CV1OutputControl);
1417 else
1418 index = GetIndexIntoMasterTable(COMMAND, DAC1OutputControl);
1419 }
1066 break; 1420 break;
1067 case ENCODER_OBJECT_ID_INTERNAL_DAC2: 1421 case ENCODER_OBJECT_ID_INTERNAL_DAC2:
1068 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2: 1422 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2:
@@ -1078,38 +1432,126 @@ radeon_atom_encoder_dpms(struct drm_encoder *encoder, int mode)
1078 if (is_dig) { 1432 if (is_dig) {
1079 switch (mode) { 1433 switch (mode) {
1080 case DRM_MODE_DPMS_ON: 1434 case DRM_MODE_DPMS_ON:
1081 atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE_OUTPUT, 0, 0); 1435 /* some early dce3.2 boards have a bug in their transmitter control table */
1436 if ((rdev->family == CHIP_RV710) || (rdev->family == CHIP_RV730))
1437 atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE, 0, 0);
1438 else
1439 atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE_OUTPUT, 0, 0);
1082 if (atombios_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_DP) { 1440 if (atombios_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_DP) {
1083 struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); 1441 struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);
1084 1442
1085 dp_link_train(encoder, connector); 1443 if (connector &&
1444 (connector->connector_type == DRM_MODE_CONNECTOR_eDP)) {
1445 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
1446 struct radeon_connector_atom_dig *radeon_dig_connector =
1447 radeon_connector->con_priv;
1448 atombios_set_edp_panel_power(connector,
1449 ATOM_TRANSMITTER_ACTION_POWER_ON);
1450 radeon_dig_connector->edp_on = true;
1451 }
1086 if (ASIC_IS_DCE4(rdev)) 1452 if (ASIC_IS_DCE4(rdev))
1087 atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_DP_VIDEO_ON); 1453 atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_DP_VIDEO_OFF, 0);
1454 radeon_dp_link_train(encoder, connector);
1455 if (ASIC_IS_DCE4(rdev))
1456 atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_DP_VIDEO_ON, 0);
1088 } 1457 }
1458 if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT))
1459 atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_LCD_BLON, 0, 0);
1089 break; 1460 break;
1090 case DRM_MODE_DPMS_STANDBY: 1461 case DRM_MODE_DPMS_STANDBY:
1091 case DRM_MODE_DPMS_SUSPEND: 1462 case DRM_MODE_DPMS_SUSPEND:
1092 case DRM_MODE_DPMS_OFF: 1463 case DRM_MODE_DPMS_OFF:
1093 atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE_OUTPUT, 0, 0); 1464 atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE_OUTPUT, 0, 0);
1094 if (atombios_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_DP) { 1465 if (atombios_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_DP) {
1466 struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);
1467
1095 if (ASIC_IS_DCE4(rdev)) 1468 if (ASIC_IS_DCE4(rdev))
1096 atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_DP_VIDEO_OFF); 1469 atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_DP_VIDEO_OFF, 0);
1470 if (connector &&
1471 (connector->connector_type == DRM_MODE_CONNECTOR_eDP)) {
1472 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
1473 struct radeon_connector_atom_dig *radeon_dig_connector =
1474 radeon_connector->con_priv;
1475 atombios_set_edp_panel_power(connector,
1476 ATOM_TRANSMITTER_ACTION_POWER_OFF);
1477 radeon_dig_connector->edp_on = false;
1478 }
1097 } 1479 }
1480 if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT))
1481 atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_LCD_BLOFF, 0, 0);
1482 break;
1483 }
1484 } else if (is_dce5_dac) {
1485 switch (mode) {
1486 case DRM_MODE_DPMS_ON:
1487 atombios_dac_setup(encoder, ATOM_ENABLE);
1488 break;
1489 case DRM_MODE_DPMS_STANDBY:
1490 case DRM_MODE_DPMS_SUSPEND:
1491 case DRM_MODE_DPMS_OFF:
1492 atombios_dac_setup(encoder, ATOM_DISABLE);
1493 break;
1494 }
1495 } else if (is_dce5_dvo) {
1496 switch (mode) {
1497 case DRM_MODE_DPMS_ON:
1498 atombios_dvo_setup(encoder, ATOM_ENABLE);
1499 break;
1500 case DRM_MODE_DPMS_STANDBY:
1501 case DRM_MODE_DPMS_SUSPEND:
1502 case DRM_MODE_DPMS_OFF:
1503 atombios_dvo_setup(encoder, ATOM_DISABLE);
1098 break; 1504 break;
1099 } 1505 }
1100 } else { 1506 } else {
1101 switch (mode) { 1507 switch (mode) {
1102 case DRM_MODE_DPMS_ON: 1508 case DRM_MODE_DPMS_ON:
1103 args.ucAction = ATOM_ENABLE; 1509 args.ucAction = ATOM_ENABLE;
1510 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
1511 if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) {
1512 args.ucAction = ATOM_LCD_BLON;
1513 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
1514 }
1104 break; 1515 break;
1105 case DRM_MODE_DPMS_STANDBY: 1516 case DRM_MODE_DPMS_STANDBY:
1106 case DRM_MODE_DPMS_SUSPEND: 1517 case DRM_MODE_DPMS_SUSPEND:
1107 case DRM_MODE_DPMS_OFF: 1518 case DRM_MODE_DPMS_OFF:
1108 args.ucAction = ATOM_DISABLE; 1519 args.ucAction = ATOM_DISABLE;
1520 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
1521 if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) {
1522 args.ucAction = ATOM_LCD_BLOFF;
1523 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
1524 }
1109 break; 1525 break;
1110 } 1526 }
1111 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
1112 } 1527 }
1528
1529 if (ext_encoder) {
1530 switch (mode) {
1531 case DRM_MODE_DPMS_ON:
1532 default:
1533 if (ASIC_IS_DCE41(rdev)) {
1534 atombios_external_encoder_setup(encoder, ext_encoder,
1535 EXTERNAL_ENCODER_ACTION_V3_ENABLE_OUTPUT);
1536 atombios_external_encoder_setup(encoder, ext_encoder,
1537 EXTERNAL_ENCODER_ACTION_V3_ENCODER_BLANKING_OFF);
1538 } else
1539 atombios_external_encoder_setup(encoder, ext_encoder, ATOM_ENABLE);
1540 break;
1541 case DRM_MODE_DPMS_STANDBY:
1542 case DRM_MODE_DPMS_SUSPEND:
1543 case DRM_MODE_DPMS_OFF:
1544 if (ASIC_IS_DCE41(rdev)) {
1545 atombios_external_encoder_setup(encoder, ext_encoder,
1546 EXTERNAL_ENCODER_ACTION_V3_ENCODER_BLANKING);
1547 atombios_external_encoder_setup(encoder, ext_encoder,
1548 EXTERNAL_ENCODER_ACTION_V3_DISABLE_OUTPUT);
1549 } else
1550 atombios_external_encoder_setup(encoder, ext_encoder, ATOM_DISABLE);
1551 break;
1552 }
1553 }
1554
1113 radeon_atombios_encoder_dpms_scratch_regs(encoder, (mode == DRM_MODE_DPMS_ON) ? true : false); 1555 radeon_atombios_encoder_dpms_scratch_regs(encoder, (mode == DRM_MODE_DPMS_ON) ? true : false);
1114 1556
1115} 1557}
@@ -1242,7 +1684,7 @@ atombios_set_encoder_crtc_source(struct drm_encoder *encoder)
1242 break; 1684 break;
1243 default: 1685 default:
1244 DRM_ERROR("Unknown table version: %d, %d\n", frev, crev); 1686 DRM_ERROR("Unknown table version: %d, %d\n", frev, crev);
1245 break; 1687 return;
1246 } 1688 }
1247 1689
1248 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 1690 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
@@ -1275,11 +1717,21 @@ atombios_apply_encoder_quirks(struct drm_encoder *encoder,
1275 } 1717 }
1276 1718
1277 /* set scaler clears this on some chips */ 1719 /* set scaler clears this on some chips */
1278 /* XXX check DCE4 */ 1720 if (ASIC_IS_AVIVO(rdev) &&
1279 if (!(radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT))) { 1721 (!(radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT)))) {
1280 if (ASIC_IS_AVIVO(rdev) && (mode->flags & DRM_MODE_FLAG_INTERLACE)) 1722 if (ASIC_IS_DCE4(rdev)) {
1281 WREG32(AVIVO_D1MODE_DATA_FORMAT + radeon_crtc->crtc_offset, 1723 if (mode->flags & DRM_MODE_FLAG_INTERLACE)
1282 AVIVO_D1MODE_INTERLEAVE_EN); 1724 WREG32(EVERGREEN_DATA_FORMAT + radeon_crtc->crtc_offset,
1725 EVERGREEN_INTERLEAVE_EN);
1726 else
1727 WREG32(EVERGREEN_DATA_FORMAT + radeon_crtc->crtc_offset, 0);
1728 } else {
1729 if (mode->flags & DRM_MODE_FLAG_INTERLACE)
1730 WREG32(AVIVO_D1MODE_DATA_FORMAT + radeon_crtc->crtc_offset,
1731 AVIVO_D1MODE_INTERLEAVE_EN);
1732 else
1733 WREG32(AVIVO_D1MODE_DATA_FORMAT + radeon_crtc->crtc_offset, 0);
1734 }
1283 } 1735 }
1284} 1736}
1285 1737
@@ -1293,27 +1745,32 @@ static int radeon_atom_pick_dig_encoder(struct drm_encoder *encoder)
1293 struct radeon_encoder_atom_dig *dig; 1745 struct radeon_encoder_atom_dig *dig;
1294 uint32_t dig_enc_in_use = 0; 1746 uint32_t dig_enc_in_use = 0;
1295 1747
1748 /* DCE4/5 */
1296 if (ASIC_IS_DCE4(rdev)) { 1749 if (ASIC_IS_DCE4(rdev)) {
1297 dig = radeon_encoder->enc_priv; 1750 dig = radeon_encoder->enc_priv;
1298 switch (radeon_encoder->encoder_id) { 1751 if (ASIC_IS_DCE41(rdev))
1299 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY: 1752 return radeon_crtc->crtc_id;
1300 if (dig->linkb) 1753 else {
1301 return 1; 1754 switch (radeon_encoder->encoder_id) {
1302 else 1755 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
1303 return 0; 1756 if (dig->linkb)
1304 break; 1757 return 1;
1305 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: 1758 else
1306 if (dig->linkb) 1759 return 0;
1307 return 3; 1760 break;
1308 else 1761 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
1309 return 2; 1762 if (dig->linkb)
1310 break; 1763 return 3;
1311 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: 1764 else
1312 if (dig->linkb) 1765 return 2;
1313 return 5; 1766 break;
1314 else 1767 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
1315 return 4; 1768 if (dig->linkb)
1316 break; 1769 return 5;
1770 else
1771 return 4;
1772 break;
1773 }
1317 } 1774 }
1318 } 1775 }
1319 1776
@@ -1349,6 +1806,34 @@ static int radeon_atom_pick_dig_encoder(struct drm_encoder *encoder)
1349 return 1; 1806 return 1;
1350} 1807}
1351 1808
1809/* This only needs to be called once at startup */
1810void
1811radeon_atom_encoder_init(struct radeon_device *rdev)
1812{
1813 struct drm_device *dev = rdev->ddev;
1814 struct drm_encoder *encoder;
1815
1816 list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
1817 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
1818 struct drm_encoder *ext_encoder = radeon_atom_get_external_encoder(encoder);
1819
1820 switch (radeon_encoder->encoder_id) {
1821 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
1822 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
1823 case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
1824 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
1825 atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_INIT, 0, 0);
1826 break;
1827 default:
1828 break;
1829 }
1830
1831 if (ext_encoder && ASIC_IS_DCE41(rdev))
1832 atombios_external_encoder_setup(encoder, ext_encoder,
1833 EXTERNAL_ENCODER_ACTION_V3_ENCODER_INIT);
1834 }
1835}
1836
1352static void 1837static void
1353radeon_atom_encoder_mode_set(struct drm_encoder *encoder, 1838radeon_atom_encoder_mode_set(struct drm_encoder *encoder,
1354 struct drm_display_mode *mode, 1839 struct drm_display_mode *mode,
@@ -1357,6 +1842,7 @@ radeon_atom_encoder_mode_set(struct drm_encoder *encoder,
1357 struct drm_device *dev = encoder->dev; 1842 struct drm_device *dev = encoder->dev;
1358 struct radeon_device *rdev = dev->dev_private; 1843 struct radeon_device *rdev = dev->dev_private;
1359 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 1844 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
1845 struct drm_encoder *ext_encoder = radeon_atom_get_external_encoder(encoder);
1360 1846
1361 radeon_encoder->pixel_clock = adjusted_mode->clock; 1847 radeon_encoder->pixel_clock = adjusted_mode->clock;
1362 1848
@@ -1382,29 +1868,25 @@ radeon_atom_encoder_mode_set(struct drm_encoder *encoder,
1382 /* disable the transmitter */ 1868 /* disable the transmitter */
1383 atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE, 0, 0); 1869 atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE, 0, 0);
1384 /* setup and enable the encoder */ 1870 /* setup and enable the encoder */
1385 atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_SETUP); 1871 atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_SETUP, 0);
1386 1872
1387 /* init and enable the transmitter */ 1873 /* enable the transmitter */
1388 atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_INIT, 0, 0);
1389 atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE, 0, 0); 1874 atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE, 0, 0);
1390 } else { 1875 } else {
1391 /* disable the encoder and transmitter */ 1876 /* disable the encoder and transmitter */
1392 atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE, 0, 0); 1877 atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE, 0, 0);
1393 atombios_dig_encoder_setup(encoder, ATOM_DISABLE); 1878 atombios_dig_encoder_setup(encoder, ATOM_DISABLE, 0);
1394 1879
1395 /* setup and enable the encoder and transmitter */ 1880 /* setup and enable the encoder and transmitter */
1396 atombios_dig_encoder_setup(encoder, ATOM_ENABLE); 1881 atombios_dig_encoder_setup(encoder, ATOM_ENABLE, 0);
1397 atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_INIT, 0, 0);
1398 atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_SETUP, 0, 0); 1882 atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_SETUP, 0, 0);
1399 atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE, 0, 0); 1883 atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE, 0, 0);
1400 } 1884 }
1401 break; 1885 break;
1402 case ENCODER_OBJECT_ID_INTERNAL_DDI: 1886 case ENCODER_OBJECT_ID_INTERNAL_DDI:
1403 atombios_ddia_setup(encoder, ATOM_ENABLE);
1404 break;
1405 case ENCODER_OBJECT_ID_INTERNAL_DVO1: 1887 case ENCODER_OBJECT_ID_INTERNAL_DVO1:
1406 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1: 1888 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1:
1407 atombios_external_tmds_setup(encoder, ATOM_ENABLE); 1889 atombios_dvo_setup(encoder, ATOM_ENABLE);
1408 break; 1890 break;
1409 case ENCODER_OBJECT_ID_INTERNAL_DAC1: 1891 case ENCODER_OBJECT_ID_INTERNAL_DAC1:
1410 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1: 1892 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1:
@@ -1419,6 +1901,15 @@ radeon_atom_encoder_mode_set(struct drm_encoder *encoder,
1419 } 1901 }
1420 break; 1902 break;
1421 } 1903 }
1904
1905 if (ext_encoder) {
1906 if (ASIC_IS_DCE41(rdev))
1907 atombios_external_encoder_setup(encoder, ext_encoder,
1908 EXTERNAL_ENCODER_ACTION_V3_ENCODER_SETUP);
1909 else
1910 atombios_external_encoder_setup(encoder, ext_encoder, ATOM_ENABLE);
1911 }
1912
1422 atombios_apply_encoder_quirks(encoder, adjusted_mode); 1913 atombios_apply_encoder_quirks(encoder, adjusted_mode);
1423 1914
1424 if (atombios_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_HDMI) { 1915 if (atombios_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_HDMI) {
@@ -1517,12 +2008,73 @@ radeon_atom_dac_detect(struct drm_encoder *encoder, struct drm_connector *connec
1517 return connector_status_disconnected; 2008 return connector_status_disconnected;
1518} 2009}
1519 2010
2011static enum drm_connector_status
2012radeon_atom_dig_detect(struct drm_encoder *encoder, struct drm_connector *connector)
2013{
2014 struct drm_device *dev = encoder->dev;
2015 struct radeon_device *rdev = dev->dev_private;
2016 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
2017 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
2018 struct drm_encoder *ext_encoder = radeon_atom_get_external_encoder(encoder);
2019 u32 bios_0_scratch;
2020
2021 if (!ASIC_IS_DCE4(rdev))
2022 return connector_status_unknown;
2023
2024 if (!ext_encoder)
2025 return connector_status_unknown;
2026
2027 if ((radeon_connector->devices & ATOM_DEVICE_CRT_SUPPORT) == 0)
2028 return connector_status_unknown;
2029
2030 /* load detect on the dp bridge */
2031 atombios_external_encoder_setup(encoder, ext_encoder,
2032 EXTERNAL_ENCODER_ACTION_V3_DACLOAD_DETECTION);
2033
2034 bios_0_scratch = RREG32(R600_BIOS_0_SCRATCH);
2035
2036 DRM_DEBUG_KMS("Bios 0 scratch %x %08x\n", bios_0_scratch, radeon_encoder->devices);
2037 if (radeon_connector->devices & ATOM_DEVICE_CRT1_SUPPORT) {
2038 if (bios_0_scratch & ATOM_S0_CRT1_MASK)
2039 return connector_status_connected;
2040 }
2041 if (radeon_connector->devices & ATOM_DEVICE_CRT2_SUPPORT) {
2042 if (bios_0_scratch & ATOM_S0_CRT2_MASK)
2043 return connector_status_connected;
2044 }
2045 if (radeon_connector->devices & ATOM_DEVICE_CV_SUPPORT) {
2046 if (bios_0_scratch & (ATOM_S0_CV_MASK|ATOM_S0_CV_MASK_A))
2047 return connector_status_connected;
2048 }
2049 if (radeon_connector->devices & ATOM_DEVICE_TV1_SUPPORT) {
2050 if (bios_0_scratch & (ATOM_S0_TV1_COMPOSITE | ATOM_S0_TV1_COMPOSITE_A))
2051 return connector_status_connected; /* CTV */
2052 else if (bios_0_scratch & (ATOM_S0_TV1_SVIDEO | ATOM_S0_TV1_SVIDEO_A))
2053 return connector_status_connected; /* STV */
2054 }
2055 return connector_status_disconnected;
2056}
2057
2058void
2059radeon_atom_ext_encoder_setup_ddc(struct drm_encoder *encoder)
2060{
2061 struct drm_encoder *ext_encoder = radeon_atom_get_external_encoder(encoder);
2062
2063 if (ext_encoder)
2064 /* ddc_setup on the dp bridge */
2065 atombios_external_encoder_setup(encoder, ext_encoder,
2066 EXTERNAL_ENCODER_ACTION_V3_DDC_SETUP);
2067
2068}
2069
1520static void radeon_atom_encoder_prepare(struct drm_encoder *encoder) 2070static void radeon_atom_encoder_prepare(struct drm_encoder *encoder)
1521{ 2071{
1522 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 2072 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
2073 struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);
1523 2074
1524 if (radeon_encoder->active_device & 2075 if ((radeon_encoder->active_device &
1525 (ATOM_DEVICE_DFP_SUPPORT | ATOM_DEVICE_LCD_SUPPORT)) { 2076 (ATOM_DEVICE_DFP_SUPPORT | ATOM_DEVICE_LCD_SUPPORT)) ||
2077 radeon_encoder_is_dp_bridge(encoder)) {
1526 struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; 2078 struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
1527 if (dig) 2079 if (dig)
1528 dig->dig_encoder = radeon_atom_pick_dig_encoder(encoder); 2080 dig->dig_encoder = radeon_atom_pick_dig_encoder(encoder);
@@ -1531,6 +2083,19 @@ static void radeon_atom_encoder_prepare(struct drm_encoder *encoder)
1531 radeon_atom_output_lock(encoder, true); 2083 radeon_atom_output_lock(encoder, true);
1532 radeon_atom_encoder_dpms(encoder, DRM_MODE_DPMS_OFF); 2084 radeon_atom_encoder_dpms(encoder, DRM_MODE_DPMS_OFF);
1533 2085
2086 if (connector) {
2087 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
2088
2089 /* select the clock/data port if it uses a router */
2090 if (radeon_connector->router.cd_valid)
2091 radeon_router_select_cd_port(radeon_connector);
2092
2093 /* turn eDP panel on for mode set */
2094 if (connector->connector_type == DRM_MODE_CONNECTOR_eDP)
2095 atombios_set_edp_panel_power(connector,
2096 ATOM_TRANSMITTER_ACTION_POWER_ON);
2097 }
2098
1534 /* this is needed for the pll/ss setup to work correctly in some cases */ 2099 /* this is needed for the pll/ss setup to work correctly in some cases */
1535 atombios_set_encoder_crtc_source(encoder); 2100 atombios_set_encoder_crtc_source(encoder);
1536} 2101}
@@ -1547,6 +2112,23 @@ static void radeon_atom_encoder_disable(struct drm_encoder *encoder)
1547 struct radeon_device *rdev = dev->dev_private; 2112 struct radeon_device *rdev = dev->dev_private;
1548 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 2113 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
1549 struct radeon_encoder_atom_dig *dig; 2114 struct radeon_encoder_atom_dig *dig;
2115
2116 /* check for pre-DCE3 cards with shared encoders;
2117 * can't really use the links individually, so don't disable
2118 * the encoder if it's in use by another connector
2119 */
2120 if (!ASIC_IS_DCE3(rdev)) {
2121 struct drm_encoder *other_encoder;
2122 struct radeon_encoder *other_radeon_encoder;
2123
2124 list_for_each_entry(other_encoder, &dev->mode_config.encoder_list, head) {
2125 other_radeon_encoder = to_radeon_encoder(other_encoder);
2126 if ((radeon_encoder->encoder_id == other_radeon_encoder->encoder_id) &&
2127 drm_helper_encoder_in_use(other_encoder))
2128 goto disable_done;
2129 }
2130 }
2131
1550 radeon_atom_encoder_dpms(encoder, DRM_MODE_DPMS_OFF); 2132 radeon_atom_encoder_dpms(encoder, DRM_MODE_DPMS_OFF);
1551 2133
1552 switch (radeon_encoder->encoder_id) { 2134 switch (radeon_encoder->encoder_id) {
@@ -1566,15 +2148,13 @@ static void radeon_atom_encoder_disable(struct drm_encoder *encoder)
1566 else { 2148 else {
1567 /* disable the encoder and transmitter */ 2149 /* disable the encoder and transmitter */
1568 atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE, 0, 0); 2150 atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE, 0, 0);
1569 atombios_dig_encoder_setup(encoder, ATOM_DISABLE); 2151 atombios_dig_encoder_setup(encoder, ATOM_DISABLE, 0);
1570 } 2152 }
1571 break; 2153 break;
1572 case ENCODER_OBJECT_ID_INTERNAL_DDI: 2154 case ENCODER_OBJECT_ID_INTERNAL_DDI:
1573 atombios_ddia_setup(encoder, ATOM_DISABLE);
1574 break;
1575 case ENCODER_OBJECT_ID_INTERNAL_DVO1: 2155 case ENCODER_OBJECT_ID_INTERNAL_DVO1:
1576 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1: 2156 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1:
1577 atombios_external_tmds_setup(encoder, ATOM_DISABLE); 2157 atombios_dvo_setup(encoder, ATOM_DISABLE);
1578 break; 2158 break;
1579 case ENCODER_OBJECT_ID_INTERNAL_DAC1: 2159 case ENCODER_OBJECT_ID_INTERNAL_DAC1:
1580 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1: 2160 case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1:
@@ -1586,6 +2166,7 @@ static void radeon_atom_encoder_disable(struct drm_encoder *encoder)
1586 break; 2166 break;
1587 } 2167 }
1588 2168
2169disable_done:
1589 if (radeon_encoder_is_digital(encoder)) { 2170 if (radeon_encoder_is_digital(encoder)) {
1590 if (atombios_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_HDMI) 2171 if (atombios_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_HDMI)
1591 r600_hdmi_disable(encoder); 2172 r600_hdmi_disable(encoder);
@@ -1595,6 +2176,53 @@ static void radeon_atom_encoder_disable(struct drm_encoder *encoder)
1595 radeon_encoder->active_device = 0; 2176 radeon_encoder->active_device = 0;
1596} 2177}
1597 2178
2179/* these are handled by the primary encoders */
2180static void radeon_atom_ext_prepare(struct drm_encoder *encoder)
2181{
2182
2183}
2184
2185static void radeon_atom_ext_commit(struct drm_encoder *encoder)
2186{
2187
2188}
2189
2190static void
2191radeon_atom_ext_mode_set(struct drm_encoder *encoder,
2192 struct drm_display_mode *mode,
2193 struct drm_display_mode *adjusted_mode)
2194{
2195
2196}
2197
2198static void radeon_atom_ext_disable(struct drm_encoder *encoder)
2199{
2200
2201}
2202
2203static void
2204radeon_atom_ext_dpms(struct drm_encoder *encoder, int mode)
2205{
2206
2207}
2208
2209static bool radeon_atom_ext_mode_fixup(struct drm_encoder *encoder,
2210 struct drm_display_mode *mode,
2211 struct drm_display_mode *adjusted_mode)
2212{
2213 return true;
2214}
2215
2216static const struct drm_encoder_helper_funcs radeon_atom_ext_helper_funcs = {
2217 .dpms = radeon_atom_ext_dpms,
2218 .mode_fixup = radeon_atom_ext_mode_fixup,
2219 .prepare = radeon_atom_ext_prepare,
2220 .mode_set = radeon_atom_ext_mode_set,
2221 .commit = radeon_atom_ext_commit,
2222 .disable = radeon_atom_ext_disable,
2223 /* no detect for TMDS/LVDS yet */
2224};
2225
1598static const struct drm_encoder_helper_funcs radeon_atom_dig_helper_funcs = { 2226static const struct drm_encoder_helper_funcs radeon_atom_dig_helper_funcs = {
1599 .dpms = radeon_atom_encoder_dpms, 2227 .dpms = radeon_atom_encoder_dpms,
1600 .mode_fixup = radeon_atom_mode_fixup, 2228 .mode_fixup = radeon_atom_mode_fixup,
@@ -1602,7 +2230,7 @@ static const struct drm_encoder_helper_funcs radeon_atom_dig_helper_funcs = {
1602 .mode_set = radeon_atom_encoder_mode_set, 2230 .mode_set = radeon_atom_encoder_mode_set,
1603 .commit = radeon_atom_encoder_commit, 2231 .commit = radeon_atom_encoder_commit,
1604 .disable = radeon_atom_encoder_disable, 2232 .disable = radeon_atom_encoder_disable,
1605 /* no detect for TMDS/LVDS yet */ 2233 .detect = radeon_atom_dig_detect,
1606}; 2234};
1607 2235
1608static const struct drm_encoder_helper_funcs radeon_atom_dac_helper_funcs = { 2236static const struct drm_encoder_helper_funcs radeon_atom_dac_helper_funcs = {
@@ -1662,7 +2290,10 @@ radeon_atombios_set_dig_info(struct radeon_encoder *radeon_encoder)
1662} 2290}
1663 2291
1664void 2292void
1665radeon_add_atom_encoder(struct drm_device *dev, uint32_t encoder_enum, uint32_t supported_device) 2293radeon_add_atom_encoder(struct drm_device *dev,
2294 uint32_t encoder_enum,
2295 uint32_t supported_device,
2296 u16 caps)
1666{ 2297{
1667 struct radeon_device *rdev = dev->dev_private; 2298 struct radeon_device *rdev = dev->dev_private;
1668 struct drm_encoder *encoder; 2299 struct drm_encoder *encoder;
@@ -1704,6 +2335,8 @@ radeon_add_atom_encoder(struct drm_device *dev, uint32_t encoder_enum, uint32_t
1704 radeon_encoder->devices = supported_device; 2335 radeon_encoder->devices = supported_device;
1705 radeon_encoder->rmx_type = RMX_OFF; 2336 radeon_encoder->rmx_type = RMX_OFF;
1706 radeon_encoder->underscan_type = UNDERSCAN_OFF; 2337 radeon_encoder->underscan_type = UNDERSCAN_OFF;
2338 radeon_encoder->is_ext_encoder = false;
2339 radeon_encoder->caps = caps;
1707 2340
1708 switch (radeon_encoder->encoder_id) { 2341 switch (radeon_encoder->encoder_id) {
1709 case ENCODER_OBJECT_ID_INTERNAL_LVDS: 2342 case ENCODER_OBJECT_ID_INTERNAL_LVDS:
@@ -1717,8 +2350,6 @@ radeon_add_atom_encoder(struct drm_device *dev, uint32_t encoder_enum, uint32_t
1717 } else { 2350 } else {
1718 drm_encoder_init(dev, encoder, &radeon_atom_enc_funcs, DRM_MODE_ENCODER_TMDS); 2351 drm_encoder_init(dev, encoder, &radeon_atom_enc_funcs, DRM_MODE_ENCODER_TMDS);
1719 radeon_encoder->enc_priv = radeon_atombios_set_dig_info(radeon_encoder); 2352 radeon_encoder->enc_priv = radeon_atombios_set_dig_info(radeon_encoder);
1720 if (ASIC_IS_AVIVO(rdev))
1721 radeon_encoder->underscan_type = UNDERSCAN_AUTO;
1722 } 2353 }
1723 drm_encoder_helper_add(encoder, &radeon_atom_dig_helper_funcs); 2354 drm_encoder_helper_add(encoder, &radeon_atom_dig_helper_funcs);
1724 break; 2355 break;
@@ -1745,13 +2376,33 @@ radeon_add_atom_encoder(struct drm_device *dev, uint32_t encoder_enum, uint32_t
1745 radeon_encoder->rmx_type = RMX_FULL; 2376 radeon_encoder->rmx_type = RMX_FULL;
1746 drm_encoder_init(dev, encoder, &radeon_atom_enc_funcs, DRM_MODE_ENCODER_LVDS); 2377 drm_encoder_init(dev, encoder, &radeon_atom_enc_funcs, DRM_MODE_ENCODER_LVDS);
1747 radeon_encoder->enc_priv = radeon_atombios_get_lvds_info(radeon_encoder); 2378 radeon_encoder->enc_priv = radeon_atombios_get_lvds_info(radeon_encoder);
2379 } else if (radeon_encoder->devices & (ATOM_DEVICE_CRT_SUPPORT)) {
2380 drm_encoder_init(dev, encoder, &radeon_atom_enc_funcs, DRM_MODE_ENCODER_DAC);
2381 radeon_encoder->enc_priv = radeon_atombios_set_dig_info(radeon_encoder);
1748 } else { 2382 } else {
1749 drm_encoder_init(dev, encoder, &radeon_atom_enc_funcs, DRM_MODE_ENCODER_TMDS); 2383 drm_encoder_init(dev, encoder, &radeon_atom_enc_funcs, DRM_MODE_ENCODER_TMDS);
1750 radeon_encoder->enc_priv = radeon_atombios_set_dig_info(radeon_encoder); 2384 radeon_encoder->enc_priv = radeon_atombios_set_dig_info(radeon_encoder);
1751 if (ASIC_IS_AVIVO(rdev))
1752 radeon_encoder->underscan_type = UNDERSCAN_AUTO;
1753 } 2385 }
1754 drm_encoder_helper_add(encoder, &radeon_atom_dig_helper_funcs); 2386 drm_encoder_helper_add(encoder, &radeon_atom_dig_helper_funcs);
1755 break; 2387 break;
2388 case ENCODER_OBJECT_ID_SI170B:
2389 case ENCODER_OBJECT_ID_CH7303:
2390 case ENCODER_OBJECT_ID_EXTERNAL_SDVOA:
2391 case ENCODER_OBJECT_ID_EXTERNAL_SDVOB:
2392 case ENCODER_OBJECT_ID_TITFP513:
2393 case ENCODER_OBJECT_ID_VT1623:
2394 case ENCODER_OBJECT_ID_HDMI_SI1930:
2395 case ENCODER_OBJECT_ID_TRAVIS:
2396 case ENCODER_OBJECT_ID_NUTMEG:
2397 /* these are handled by the primary encoders */
2398 radeon_encoder->is_ext_encoder = true;
2399 if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT))
2400 drm_encoder_init(dev, encoder, &radeon_atom_enc_funcs, DRM_MODE_ENCODER_LVDS);
2401 else if (radeon_encoder->devices & (ATOM_DEVICE_CRT_SUPPORT))
2402 drm_encoder_init(dev, encoder, &radeon_atom_enc_funcs, DRM_MODE_ENCODER_DAC);
2403 else
2404 drm_encoder_init(dev, encoder, &radeon_atom_enc_funcs, DRM_MODE_ENCODER_TMDS);
2405 drm_encoder_helper_add(encoder, &radeon_atom_ext_helper_funcs);
2406 break;
1756 } 2407 }
1757} 2408}
diff --git a/drivers/gpu/drm/radeon/radeon_family.h b/drivers/gpu/drm/radeon/radeon_family.h
index e329066dcabd..ec2f1ea84f81 100644
--- a/drivers/gpu/drm/radeon/radeon_family.h
+++ b/drivers/gpu/drm/radeon/radeon_family.h
@@ -80,6 +80,13 @@ enum radeon_family {
80 CHIP_JUNIPER, 80 CHIP_JUNIPER,
81 CHIP_CYPRESS, 81 CHIP_CYPRESS,
82 CHIP_HEMLOCK, 82 CHIP_HEMLOCK,
83 CHIP_PALM,
84 CHIP_SUMO,
85 CHIP_SUMO2,
86 CHIP_BARTS,
87 CHIP_TURKS,
88 CHIP_CAICOS,
89 CHIP_CAYMAN,
83 CHIP_LAST, 90 CHIP_LAST,
84}; 91};
85 92
diff --git a/drivers/gpu/drm/radeon/radeon_fb.c b/drivers/gpu/drm/radeon/radeon_fb.c
index 40b0c087b592..0b7b486c97e8 100644
--- a/drivers/gpu/drm/radeon/radeon_fb.c
+++ b/drivers/gpu/drm/radeon/radeon_fb.c
@@ -59,10 +59,12 @@ static struct fb_ops radeonfb_ops = {
59 .fb_pan_display = drm_fb_helper_pan_display, 59 .fb_pan_display = drm_fb_helper_pan_display,
60 .fb_blank = drm_fb_helper_blank, 60 .fb_blank = drm_fb_helper_blank,
61 .fb_setcmap = drm_fb_helper_setcmap, 61 .fb_setcmap = drm_fb_helper_setcmap,
62 .fb_debug_enter = drm_fb_helper_debug_enter,
63 .fb_debug_leave = drm_fb_helper_debug_leave,
62}; 64};
63 65
64 66
65static int radeon_align_pitch(struct radeon_device *rdev, int width, int bpp, bool tiled) 67int radeon_align_pitch(struct radeon_device *rdev, int width, int bpp, bool tiled)
66{ 68{
67 int aligned = width; 69 int aligned = width;
68 int align_large = (ASIC_IS_AVIVO(rdev)) || tiled; 70 int align_large = (ASIC_IS_AVIVO(rdev)) || tiled;
@@ -88,7 +90,7 @@ static int radeon_align_pitch(struct radeon_device *rdev, int width, int bpp, bo
88 90
89static void radeonfb_destroy_pinned_object(struct drm_gem_object *gobj) 91static void radeonfb_destroy_pinned_object(struct drm_gem_object *gobj)
90{ 92{
91 struct radeon_bo *rbo = gobj->driver_private; 93 struct radeon_bo *rbo = gem_to_radeon_bo(gobj);
92 int ret; 94 int ret;
93 95
94 ret = radeon_bo_reserve(rbo, false); 96 ret = radeon_bo_reserve(rbo, false);
@@ -111,11 +113,14 @@ static int radeonfb_create_pinned_object(struct radeon_fbdev *rfbdev,
111 u32 tiling_flags = 0; 113 u32 tiling_flags = 0;
112 int ret; 114 int ret;
113 int aligned_size, size; 115 int aligned_size, size;
116 int height = mode_cmd->height;
114 117
115 /* need to align pitch with crtc limits */ 118 /* need to align pitch with crtc limits */
116 mode_cmd->pitch = radeon_align_pitch(rdev, mode_cmd->width, mode_cmd->bpp, fb_tiled) * ((mode_cmd->bpp + 1) / 8); 119 mode_cmd->pitch = radeon_align_pitch(rdev, mode_cmd->width, mode_cmd->bpp, fb_tiled) * ((mode_cmd->bpp + 1) / 8);
117 120
118 size = mode_cmd->pitch * mode_cmd->height; 121 if (rdev->family >= CHIP_R600)
122 height = ALIGN(mode_cmd->height, 8);
123 size = mode_cmd->pitch * height;
119 aligned_size = ALIGN(size, PAGE_SIZE); 124 aligned_size = ALIGN(size, PAGE_SIZE);
120 ret = radeon_gem_object_create(rdev, aligned_size, 0, 125 ret = radeon_gem_object_create(rdev, aligned_size, 0,
121 RADEON_GEM_DOMAIN_VRAM, 126 RADEON_GEM_DOMAIN_VRAM,
@@ -126,7 +131,7 @@ static int radeonfb_create_pinned_object(struct radeon_fbdev *rfbdev,
126 aligned_size); 131 aligned_size);
127 return -ENOMEM; 132 return -ENOMEM;
128 } 133 }
129 rbo = gobj->driver_private; 134 rbo = gem_to_radeon_bo(gobj);
130 135
131 if (fb_tiled) 136 if (fb_tiled)
132 tiling_flags = RADEON_TILING_MACRO; 137 tiling_flags = RADEON_TILING_MACRO;
@@ -200,7 +205,7 @@ static int radeonfb_create(struct radeon_fbdev *rfbdev,
200 mode_cmd.depth = sizes->surface_depth; 205 mode_cmd.depth = sizes->surface_depth;
201 206
202 ret = radeonfb_create_pinned_object(rfbdev, &mode_cmd, &gobj); 207 ret = radeonfb_create_pinned_object(rfbdev, &mode_cmd, &gobj);
203 rbo = gobj->driver_private; 208 rbo = gem_to_radeon_bo(gobj);
204 209
205 /* okay we have an object now allocate the framebuffer */ 210 /* okay we have an object now allocate the framebuffer */
206 info = framebuffer_alloc(0, device); 211 info = framebuffer_alloc(0, device);
@@ -243,10 +248,8 @@ static int radeonfb_create(struct radeon_fbdev *rfbdev,
243 goto out_unref; 248 goto out_unref;
244 } 249 }
245 info->apertures->ranges[0].base = rdev->ddev->mode_config.fb_base; 250 info->apertures->ranges[0].base = rdev->ddev->mode_config.fb_base;
246 info->apertures->ranges[0].size = rdev->mc.real_vram_size; 251 info->apertures->ranges[0].size = rdev->mc.aper_size;
247 252
248 info->fix.mmio_start = 0;
249 info->fix.mmio_len = 0;
250 info->pixmap.size = 64*1024; 253 info->pixmap.size = 64*1024;
251 info->pixmap.buf_align = 8; 254 info->pixmap.buf_align = 8;
252 info->pixmap.access_align = 32; 255 info->pixmap.access_align = 32;
@@ -403,14 +406,14 @@ int radeon_fbdev_total_size(struct radeon_device *rdev)
403 struct radeon_bo *robj; 406 struct radeon_bo *robj;
404 int size = 0; 407 int size = 0;
405 408
406 robj = rdev->mode_info.rfbdev->rfb.obj->driver_private; 409 robj = gem_to_radeon_bo(rdev->mode_info.rfbdev->rfb.obj);
407 size += radeon_bo_size(robj); 410 size += radeon_bo_size(robj);
408 return size; 411 return size;
409} 412}
410 413
411bool radeon_fbdev_robj_is_fb(struct radeon_device *rdev, struct radeon_bo *robj) 414bool radeon_fbdev_robj_is_fb(struct radeon_device *rdev, struct radeon_bo *robj)
412{ 415{
413 if (robj == rdev->mode_info.rfbdev->rfb.obj->driver_private) 416 if (robj == gem_to_radeon_bo(rdev->mode_info.rfbdev->rfb.obj))
414 return true; 417 return true;
415 return false; 418 return false;
416} 419}
diff --git a/drivers/gpu/drm/radeon/radeon_fence.c b/drivers/gpu/drm/radeon/radeon_fence.c
index b1f9a81b5d1d..021d2b6b556f 100644
--- a/drivers/gpu/drm/radeon/radeon_fence.c
+++ b/drivers/gpu/drm/radeon/radeon_fence.c
@@ -38,6 +38,36 @@
38#include "drm.h" 38#include "drm.h"
39#include "radeon_reg.h" 39#include "radeon_reg.h"
40#include "radeon.h" 40#include "radeon.h"
41#include "radeon_trace.h"
42
43static void radeon_fence_write(struct radeon_device *rdev, u32 seq)
44{
45 if (rdev->wb.enabled) {
46 u32 scratch_index;
47 if (rdev->wb.use_event)
48 scratch_index = R600_WB_EVENT_OFFSET + rdev->fence_drv.scratch_reg - rdev->scratch.reg_base;
49 else
50 scratch_index = RADEON_WB_SCRATCH_OFFSET + rdev->fence_drv.scratch_reg - rdev->scratch.reg_base;
51 rdev->wb.wb[scratch_index/4] = cpu_to_le32(seq);;
52 } else
53 WREG32(rdev->fence_drv.scratch_reg, seq);
54}
55
56static u32 radeon_fence_read(struct radeon_device *rdev)
57{
58 u32 seq;
59
60 if (rdev->wb.enabled) {
61 u32 scratch_index;
62 if (rdev->wb.use_event)
63 scratch_index = R600_WB_EVENT_OFFSET + rdev->fence_drv.scratch_reg - rdev->scratch.reg_base;
64 else
65 scratch_index = RADEON_WB_SCRATCH_OFFSET + rdev->fence_drv.scratch_reg - rdev->scratch.reg_base;
66 seq = le32_to_cpu(rdev->wb.wb[scratch_index/4]);
67 } else
68 seq = RREG32(rdev->fence_drv.scratch_reg);
69 return seq;
70}
41 71
42int radeon_fence_emit(struct radeon_device *rdev, struct radeon_fence *fence) 72int radeon_fence_emit(struct radeon_device *rdev, struct radeon_fence *fence)
43{ 73{
@@ -49,17 +79,17 @@ int radeon_fence_emit(struct radeon_device *rdev, struct radeon_fence *fence)
49 return 0; 79 return 0;
50 } 80 }
51 fence->seq = atomic_add_return(1, &rdev->fence_drv.seq); 81 fence->seq = atomic_add_return(1, &rdev->fence_drv.seq);
52 if (!rdev->cp.ready) { 82 if (!rdev->cp.ready)
53 /* FIXME: cp is not running assume everythings is done right 83 /* FIXME: cp is not running assume everythings is done right
54 * away 84 * away
55 */ 85 */
56 WREG32(rdev->fence_drv.scratch_reg, fence->seq); 86 radeon_fence_write(rdev, fence->seq);
57 } else 87 else
58 radeon_fence_ring_emit(rdev, fence); 88 radeon_fence_ring_emit(rdev, fence);
59 89
90 trace_radeon_fence_emit(rdev->ddev, fence->seq);
60 fence->emited = true; 91 fence->emited = true;
61 list_del(&fence->list); 92 list_move_tail(&fence->list, &rdev->fence_drv.emited);
62 list_add_tail(&fence->list, &rdev->fence_drv.emited);
63 write_unlock_irqrestore(&rdev->fence_drv.lock, irq_flags); 93 write_unlock_irqrestore(&rdev->fence_drv.lock, irq_flags);
64 return 0; 94 return 0;
65} 95}
@@ -72,7 +102,7 @@ static bool radeon_fence_poll_locked(struct radeon_device *rdev)
72 bool wake = false; 102 bool wake = false;
73 unsigned long cjiffies; 103 unsigned long cjiffies;
74 104
75 seq = RREG32(rdev->fence_drv.scratch_reg); 105 seq = radeon_fence_read(rdev);
76 if (seq != rdev->fence_drv.last_seq) { 106 if (seq != rdev->fence_drv.last_seq) {
77 rdev->fence_drv.last_seq = seq; 107 rdev->fence_drv.last_seq = seq;
78 rdev->fence_drv.last_jiffies = jiffies; 108 rdev->fence_drv.last_jiffies = jiffies;
@@ -111,8 +141,7 @@ static bool radeon_fence_poll_locked(struct radeon_device *rdev)
111 i = n; 141 i = n;
112 do { 142 do {
113 n = i->prev; 143 n = i->prev;
114 list_del(i); 144 list_move_tail(i, &rdev->fence_drv.signaled);
115 list_add_tail(i, &rdev->fence_drv.signaled);
116 fence = list_entry(i, struct radeon_fence, list); 145 fence = list_entry(i, struct radeon_fence, list);
117 fence->signaled = true; 146 fence->signaled = true;
118 i = n; 147 i = n;
@@ -205,6 +234,7 @@ int radeon_fence_wait(struct radeon_fence *fence, bool intr)
205retry: 234retry:
206 /* save current sequence used to check for GPU lockup */ 235 /* save current sequence used to check for GPU lockup */
207 seq = rdev->fence_drv.last_seq; 236 seq = rdev->fence_drv.last_seq;
237 trace_radeon_fence_wait_begin(rdev->ddev, seq);
208 if (intr) { 238 if (intr) {
209 radeon_irq_kms_sw_irq_get(rdev); 239 radeon_irq_kms_sw_irq_get(rdev);
210 r = wait_event_interruptible_timeout(rdev->fence_drv.queue, 240 r = wait_event_interruptible_timeout(rdev->fence_drv.queue,
@@ -219,6 +249,7 @@ retry:
219 radeon_fence_signaled(fence), timeout); 249 radeon_fence_signaled(fence), timeout);
220 radeon_irq_kms_sw_irq_put(rdev); 250 radeon_irq_kms_sw_irq_put(rdev);
221 } 251 }
252 trace_radeon_fence_wait_end(rdev->ddev, seq);
222 if (unlikely(!radeon_fence_signaled(fence))) { 253 if (unlikely(!radeon_fence_signaled(fence))) {
223 /* we were interrupted for some reason and fence isn't 254 /* we were interrupted for some reason and fence isn't
224 * isn't signaled yet, resume wait 255 * isn't signaled yet, resume wait
@@ -232,7 +263,8 @@ retry:
232 */ 263 */
233 if (seq == rdev->fence_drv.last_seq && radeon_gpu_is_lockup(rdev)) { 264 if (seq == rdev->fence_drv.last_seq && radeon_gpu_is_lockup(rdev)) {
234 /* good news we believe it's a lockup */ 265 /* good news we believe it's a lockup */
235 WARN(1, "GPU lockup (waiting for 0x%08X last fence id 0x%08X)\n", fence->seq, seq); 266 WARN(1, "GPU lockup (waiting for 0x%08X last fence id 0x%08X)\n",
267 fence->seq, seq);
236 /* FIXME: what should we do ? marking everyone 268 /* FIXME: what should we do ? marking everyone
237 * as signaled for now 269 * as signaled for now
238 */ 270 */
@@ -240,7 +272,7 @@ retry:
240 r = radeon_gpu_reset(rdev); 272 r = radeon_gpu_reset(rdev);
241 if (r) 273 if (r)
242 return r; 274 return r;
243 WREG32(rdev->fence_drv.scratch_reg, fence->seq); 275 radeon_fence_write(rdev, fence->seq);
244 rdev->gpu_lockup = false; 276 rdev->gpu_lockup = false;
245 } 277 }
246 timeout = RADEON_FENCE_JIFFIES_TIMEOUT; 278 timeout = RADEON_FENCE_JIFFIES_TIMEOUT;
@@ -311,7 +343,7 @@ void radeon_fence_unref(struct radeon_fence **fence)
311 343
312 *fence = NULL; 344 *fence = NULL;
313 if (tmp) { 345 if (tmp) {
314 kref_put(&tmp->kref, &radeon_fence_destroy); 346 kref_put(&tmp->kref, radeon_fence_destroy);
315 } 347 }
316} 348}
317 349
@@ -340,7 +372,7 @@ int radeon_fence_driver_init(struct radeon_device *rdev)
340 write_unlock_irqrestore(&rdev->fence_drv.lock, irq_flags); 372 write_unlock_irqrestore(&rdev->fence_drv.lock, irq_flags);
341 return r; 373 return r;
342 } 374 }
343 WREG32(rdev->fence_drv.scratch_reg, 0); 375 radeon_fence_write(rdev, 0);
344 atomic_set(&rdev->fence_drv.seq, 0); 376 atomic_set(&rdev->fence_drv.seq, 0);
345 INIT_LIST_HEAD(&rdev->fence_drv.created); 377 INIT_LIST_HEAD(&rdev->fence_drv.created);
346 INIT_LIST_HEAD(&rdev->fence_drv.emited); 378 INIT_LIST_HEAD(&rdev->fence_drv.emited);
@@ -380,7 +412,7 @@ static int radeon_debugfs_fence_info(struct seq_file *m, void *data)
380 struct radeon_fence *fence; 412 struct radeon_fence *fence;
381 413
382 seq_printf(m, "Last signaled fence 0x%08X\n", 414 seq_printf(m, "Last signaled fence 0x%08X\n",
383 RREG32(rdev->fence_drv.scratch_reg)); 415 radeon_fence_read(rdev));
384 if (!list_empty(&rdev->fence_drv.emited)) { 416 if (!list_empty(&rdev->fence_drv.emited)) {
385 fence = list_entry(rdev->fence_drv.emited.prev, 417 fence = list_entry(rdev->fence_drv.emited.prev,
386 struct radeon_fence, list); 418 struct radeon_fence, list);
diff --git a/drivers/gpu/drm/radeon/radeon_gart.c b/drivers/gpu/drm/radeon/radeon_gart.c
index e65b90317fab..a533f52fd163 100644
--- a/drivers/gpu/drm/radeon/radeon_gart.c
+++ b/drivers/gpu/drm/radeon/radeon_gart.c
@@ -78,9 +78,9 @@ int radeon_gart_table_vram_alloc(struct radeon_device *rdev)
78 int r; 78 int r;
79 79
80 if (rdev->gart.table.vram.robj == NULL) { 80 if (rdev->gart.table.vram.robj == NULL) {
81 r = radeon_bo_create(rdev, NULL, rdev->gart.table_size, 81 r = radeon_bo_create(rdev, rdev->gart.table_size,
82 true, RADEON_GEM_DOMAIN_VRAM, 82 PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM,
83 &rdev->gart.table.vram.robj); 83 &rdev->gart.table.vram.robj);
84 if (r) { 84 if (r) {
85 return r; 85 return r;
86 } 86 }
@@ -149,8 +149,9 @@ void radeon_gart_unbind(struct radeon_device *rdev, unsigned offset,
149 p = t / (PAGE_SIZE / RADEON_GPU_PAGE_SIZE); 149 p = t / (PAGE_SIZE / RADEON_GPU_PAGE_SIZE);
150 for (i = 0; i < pages; i++, p++) { 150 for (i = 0; i < pages; i++, p++) {
151 if (rdev->gart.pages[p]) { 151 if (rdev->gart.pages[p]) {
152 pci_unmap_page(rdev->pdev, rdev->gart.pages_addr[p], 152 if (!rdev->gart.ttm_alloced[p])
153 PAGE_SIZE, PCI_DMA_BIDIRECTIONAL); 153 pci_unmap_page(rdev->pdev, rdev->gart.pages_addr[p],
154 PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);
154 rdev->gart.pages[p] = NULL; 155 rdev->gart.pages[p] = NULL;
155 rdev->gart.pages_addr[p] = rdev->dummy_page.addr; 156 rdev->gart.pages_addr[p] = rdev->dummy_page.addr;
156 page_base = rdev->gart.pages_addr[p]; 157 page_base = rdev->gart.pages_addr[p];
@@ -165,7 +166,7 @@ void radeon_gart_unbind(struct radeon_device *rdev, unsigned offset,
165} 166}
166 167
167int radeon_gart_bind(struct radeon_device *rdev, unsigned offset, 168int radeon_gart_bind(struct radeon_device *rdev, unsigned offset,
168 int pages, struct page **pagelist) 169 int pages, struct page **pagelist, dma_addr_t *dma_addr)
169{ 170{
170 unsigned t; 171 unsigned t;
171 unsigned p; 172 unsigned p;
@@ -180,15 +181,22 @@ int radeon_gart_bind(struct radeon_device *rdev, unsigned offset,
180 p = t / (PAGE_SIZE / RADEON_GPU_PAGE_SIZE); 181 p = t / (PAGE_SIZE / RADEON_GPU_PAGE_SIZE);
181 182
182 for (i = 0; i < pages; i++, p++) { 183 for (i = 0; i < pages; i++, p++) {
183 /* we need to support large memory configurations */ 184 /* we reverted the patch using dma_addr in TTM for now but this
184 /* assume that unbind have already been call on the range */ 185 * code stops building on alpha so just comment it out for now */
185 rdev->gart.pages_addr[p] = pci_map_page(rdev->pdev, pagelist[i], 186 if (0) { /*dma_addr[i] != DMA_ERROR_CODE) */
187 rdev->gart.ttm_alloced[p] = true;
188 rdev->gart.pages_addr[p] = dma_addr[i];
189 } else {
190 /* we need to support large memory configurations */
191 /* assume that unbind have already been call on the range */
192 rdev->gart.pages_addr[p] = pci_map_page(rdev->pdev, pagelist[i],
186 0, PAGE_SIZE, 193 0, PAGE_SIZE,
187 PCI_DMA_BIDIRECTIONAL); 194 PCI_DMA_BIDIRECTIONAL);
188 if (pci_dma_mapping_error(rdev->pdev, rdev->gart.pages_addr[p])) { 195 if (pci_dma_mapping_error(rdev->pdev, rdev->gart.pages_addr[p])) {
189 /* FIXME: failed to map page (return -ENOMEM?) */ 196 /* FIXME: failed to map page (return -ENOMEM?) */
190 radeon_gart_unbind(rdev, offset, pages); 197 radeon_gart_unbind(rdev, offset, pages);
191 return -ENOMEM; 198 return -ENOMEM;
199 }
192 } 200 }
193 rdev->gart.pages[p] = pagelist[i]; 201 rdev->gart.pages[p] = pagelist[i];
194 page_base = rdev->gart.pages_addr[p]; 202 page_base = rdev->gart.pages_addr[p];
@@ -251,6 +259,12 @@ int radeon_gart_init(struct radeon_device *rdev)
251 radeon_gart_fini(rdev); 259 radeon_gart_fini(rdev);
252 return -ENOMEM; 260 return -ENOMEM;
253 } 261 }
262 rdev->gart.ttm_alloced = kzalloc(sizeof(bool) *
263 rdev->gart.num_cpu_pages, GFP_KERNEL);
264 if (rdev->gart.ttm_alloced == NULL) {
265 radeon_gart_fini(rdev);
266 return -ENOMEM;
267 }
254 /* set GART entry to point to the dummy page by default */ 268 /* set GART entry to point to the dummy page by default */
255 for (i = 0; i < rdev->gart.num_cpu_pages; i++) { 269 for (i = 0; i < rdev->gart.num_cpu_pages; i++) {
256 rdev->gart.pages_addr[i] = rdev->dummy_page.addr; 270 rdev->gart.pages_addr[i] = rdev->dummy_page.addr;
@@ -267,6 +281,10 @@ void radeon_gart_fini(struct radeon_device *rdev)
267 rdev->gart.ready = false; 281 rdev->gart.ready = false;
268 kfree(rdev->gart.pages); 282 kfree(rdev->gart.pages);
269 kfree(rdev->gart.pages_addr); 283 kfree(rdev->gart.pages_addr);
284 kfree(rdev->gart.ttm_alloced);
270 rdev->gart.pages = NULL; 285 rdev->gart.pages = NULL;
271 rdev->gart.pages_addr = NULL; 286 rdev->gart.pages_addr = NULL;
287 rdev->gart.ttm_alloced = NULL;
288
289 radeon_dummy_page_fini(rdev);
272} 290}
diff --git a/drivers/gpu/drm/radeon/radeon_gem.c b/drivers/gpu/drm/radeon/radeon_gem.c
index d1e595d91723..aa1ca2dea42f 100644
--- a/drivers/gpu/drm/radeon/radeon_gem.c
+++ b/drivers/gpu/drm/radeon/radeon_gem.c
@@ -32,21 +32,18 @@
32 32
33int radeon_gem_object_init(struct drm_gem_object *obj) 33int radeon_gem_object_init(struct drm_gem_object *obj)
34{ 34{
35 /* we do nothings here */ 35 BUG();
36
36 return 0; 37 return 0;
37} 38}
38 39
39void radeon_gem_object_free(struct drm_gem_object *gobj) 40void radeon_gem_object_free(struct drm_gem_object *gobj)
40{ 41{
41 struct radeon_bo *robj = gobj->driver_private; 42 struct radeon_bo *robj = gem_to_radeon_bo(gobj);
42 43
43 gobj->driver_private = NULL;
44 if (robj) { 44 if (robj) {
45 radeon_bo_unref(&robj); 45 radeon_bo_unref(&robj);
46 } 46 }
47
48 drm_gem_object_release(gobj);
49 kfree(gobj);
50} 47}
51 48
52int radeon_gem_object_create(struct radeon_device *rdev, int size, 49int radeon_gem_object_create(struct radeon_device *rdev, int size,
@@ -54,36 +51,34 @@ int radeon_gem_object_create(struct radeon_device *rdev, int size,
54 bool discardable, bool kernel, 51 bool discardable, bool kernel,
55 struct drm_gem_object **obj) 52 struct drm_gem_object **obj)
56{ 53{
57 struct drm_gem_object *gobj;
58 struct radeon_bo *robj; 54 struct radeon_bo *robj;
59 int r; 55 int r;
60 56
61 *obj = NULL; 57 *obj = NULL;
62 gobj = drm_gem_object_alloc(rdev->ddev, size);
63 if (!gobj) {
64 return -ENOMEM;
65 }
66 /* At least align on page size */ 58 /* At least align on page size */
67 if (alignment < PAGE_SIZE) { 59 if (alignment < PAGE_SIZE) {
68 alignment = PAGE_SIZE; 60 alignment = PAGE_SIZE;
69 } 61 }
70 r = radeon_bo_create(rdev, gobj, size, kernel, initial_domain, &robj); 62 r = radeon_bo_create(rdev, size, alignment, kernel, initial_domain, &robj);
71 if (r) { 63 if (r) {
72 if (r != -ERESTARTSYS) 64 if (r != -ERESTARTSYS)
73 DRM_ERROR("Failed to allocate GEM object (%d, %d, %u, %d)\n", 65 DRM_ERROR("Failed to allocate GEM object (%d, %d, %u, %d)\n",
74 size, initial_domain, alignment, r); 66 size, initial_domain, alignment, r);
75 drm_gem_object_unreference_unlocked(gobj);
76 return r; 67 return r;
77 } 68 }
78 gobj->driver_private = robj; 69 *obj = &robj->gem_base;
79 *obj = gobj; 70
71 mutex_lock(&rdev->gem.mutex);
72 list_add_tail(&robj->list, &rdev->gem.objects);
73 mutex_unlock(&rdev->gem.mutex);
74
80 return 0; 75 return 0;
81} 76}
82 77
83int radeon_gem_object_pin(struct drm_gem_object *obj, uint32_t pin_domain, 78int radeon_gem_object_pin(struct drm_gem_object *obj, uint32_t pin_domain,
84 uint64_t *gpu_addr) 79 uint64_t *gpu_addr)
85{ 80{
86 struct radeon_bo *robj = obj->driver_private; 81 struct radeon_bo *robj = gem_to_radeon_bo(obj);
87 int r; 82 int r;
88 83
89 r = radeon_bo_reserve(robj, false); 84 r = radeon_bo_reserve(robj, false);
@@ -96,7 +91,7 @@ int radeon_gem_object_pin(struct drm_gem_object *obj, uint32_t pin_domain,
96 91
97void radeon_gem_object_unpin(struct drm_gem_object *obj) 92void radeon_gem_object_unpin(struct drm_gem_object *obj)
98{ 93{
99 struct radeon_bo *robj = obj->driver_private; 94 struct radeon_bo *robj = gem_to_radeon_bo(obj);
100 int r; 95 int r;
101 96
102 r = radeon_bo_reserve(robj, false); 97 r = radeon_bo_reserve(robj, false);
@@ -114,7 +109,7 @@ int radeon_gem_set_domain(struct drm_gem_object *gobj,
114 int r; 109 int r;
115 110
116 /* FIXME: reeimplement */ 111 /* FIXME: reeimplement */
117 robj = gobj->driver_private; 112 robj = gem_to_radeon_bo(gobj);
118 /* work out where to validate the buffer to */ 113 /* work out where to validate the buffer to */
119 domain = wdomain; 114 domain = wdomain;
120 if (!domain) { 115 if (!domain) {
@@ -156,9 +151,12 @@ int radeon_gem_info_ioctl(struct drm_device *dev, void *data,
156{ 151{
157 struct radeon_device *rdev = dev->dev_private; 152 struct radeon_device *rdev = dev->dev_private;
158 struct drm_radeon_gem_info *args = data; 153 struct drm_radeon_gem_info *args = data;
154 struct ttm_mem_type_manager *man;
155
156 man = &rdev->mman.bdev.man[TTM_PL_VRAM];
159 157
160 args->vram_size = rdev->mc.real_vram_size; 158 args->vram_size = rdev->mc.real_vram_size;
161 args->vram_visible = rdev->mc.real_vram_size; 159 args->vram_visible = (u64)man->size << PAGE_SHIFT;
162 if (rdev->stollen_vga_memory) 160 if (rdev->stollen_vga_memory)
163 args->vram_visible -= radeon_bo_size(rdev->stollen_vga_memory); 161 args->vram_visible -= radeon_bo_size(rdev->stollen_vga_memory);
164 args->vram_visible -= radeon_fbdev_total_size(rdev); 162 args->vram_visible -= radeon_fbdev_total_size(rdev);
@@ -228,7 +226,7 @@ int radeon_gem_set_domain_ioctl(struct drm_device *dev, void *data,
228 if (gobj == NULL) { 226 if (gobj == NULL) {
229 return -ENOENT; 227 return -ENOENT;
230 } 228 }
231 robj = gobj->driver_private; 229 robj = gem_to_radeon_bo(gobj);
232 230
233 r = radeon_gem_set_domain(gobj, args->read_domains, args->write_domain); 231 r = radeon_gem_set_domain(gobj, args->read_domains, args->write_domain);
234 232
@@ -236,23 +234,31 @@ int radeon_gem_set_domain_ioctl(struct drm_device *dev, void *data,
236 return r; 234 return r;
237} 235}
238 236
239int radeon_gem_mmap_ioctl(struct drm_device *dev, void *data, 237int radeon_mode_dumb_mmap(struct drm_file *filp,
240 struct drm_file *filp) 238 struct drm_device *dev,
239 uint32_t handle, uint64_t *offset_p)
241{ 240{
242 struct drm_radeon_gem_mmap *args = data;
243 struct drm_gem_object *gobj; 241 struct drm_gem_object *gobj;
244 struct radeon_bo *robj; 242 struct radeon_bo *robj;
245 243
246 gobj = drm_gem_object_lookup(dev, filp, args->handle); 244 gobj = drm_gem_object_lookup(dev, filp, handle);
247 if (gobj == NULL) { 245 if (gobj == NULL) {
248 return -ENOENT; 246 return -ENOENT;
249 } 247 }
250 robj = gobj->driver_private; 248 robj = gem_to_radeon_bo(gobj);
251 args->addr_ptr = radeon_bo_mmap_offset(robj); 249 *offset_p = radeon_bo_mmap_offset(robj);
252 drm_gem_object_unreference_unlocked(gobj); 250 drm_gem_object_unreference_unlocked(gobj);
253 return 0; 251 return 0;
254} 252}
255 253
254int radeon_gem_mmap_ioctl(struct drm_device *dev, void *data,
255 struct drm_file *filp)
256{
257 struct drm_radeon_gem_mmap *args = data;
258
259 return radeon_mode_dumb_mmap(filp, dev, args->handle, &args->addr_ptr);
260}
261
256int radeon_gem_busy_ioctl(struct drm_device *dev, void *data, 262int radeon_gem_busy_ioctl(struct drm_device *dev, void *data,
257 struct drm_file *filp) 263 struct drm_file *filp)
258{ 264{
@@ -266,7 +272,7 @@ int radeon_gem_busy_ioctl(struct drm_device *dev, void *data,
266 if (gobj == NULL) { 272 if (gobj == NULL) {
267 return -ENOENT; 273 return -ENOENT;
268 } 274 }
269 robj = gobj->driver_private; 275 robj = gem_to_radeon_bo(gobj);
270 r = radeon_bo_wait(robj, &cur_placement, true); 276 r = radeon_bo_wait(robj, &cur_placement, true);
271 switch (cur_placement) { 277 switch (cur_placement) {
272 case TTM_PL_VRAM: 278 case TTM_PL_VRAM:
@@ -296,7 +302,7 @@ int radeon_gem_wait_idle_ioctl(struct drm_device *dev, void *data,
296 if (gobj == NULL) { 302 if (gobj == NULL) {
297 return -ENOENT; 303 return -ENOENT;
298 } 304 }
299 robj = gobj->driver_private; 305 robj = gem_to_radeon_bo(gobj);
300 r = radeon_bo_wait(robj, NULL, false); 306 r = radeon_bo_wait(robj, NULL, false);
301 /* callback hw specific functions if any */ 307 /* callback hw specific functions if any */
302 if (robj->rdev->asic->ioctl_wait_idle) 308 if (robj->rdev->asic->ioctl_wait_idle)
@@ -317,7 +323,7 @@ int radeon_gem_set_tiling_ioctl(struct drm_device *dev, void *data,
317 gobj = drm_gem_object_lookup(dev, filp, args->handle); 323 gobj = drm_gem_object_lookup(dev, filp, args->handle);
318 if (gobj == NULL) 324 if (gobj == NULL)
319 return -ENOENT; 325 return -ENOENT;
320 robj = gobj->driver_private; 326 robj = gem_to_radeon_bo(gobj);
321 r = radeon_bo_set_tiling_flags(robj, args->tiling_flags, args->pitch); 327 r = radeon_bo_set_tiling_flags(robj, args->tiling_flags, args->pitch);
322 drm_gem_object_unreference_unlocked(gobj); 328 drm_gem_object_unreference_unlocked(gobj);
323 return r; 329 return r;
@@ -335,7 +341,7 @@ int radeon_gem_get_tiling_ioctl(struct drm_device *dev, void *data,
335 gobj = drm_gem_object_lookup(dev, filp, args->handle); 341 gobj = drm_gem_object_lookup(dev, filp, args->handle);
336 if (gobj == NULL) 342 if (gobj == NULL)
337 return -ENOENT; 343 return -ENOENT;
338 rbo = gobj->driver_private; 344 rbo = gem_to_radeon_bo(gobj);
339 r = radeon_bo_reserve(rbo, false); 345 r = radeon_bo_reserve(rbo, false);
340 if (unlikely(r != 0)) 346 if (unlikely(r != 0))
341 goto out; 347 goto out;
@@ -345,3 +351,40 @@ out:
345 drm_gem_object_unreference_unlocked(gobj); 351 drm_gem_object_unreference_unlocked(gobj);
346 return r; 352 return r;
347} 353}
354
355int radeon_mode_dumb_create(struct drm_file *file_priv,
356 struct drm_device *dev,
357 struct drm_mode_create_dumb *args)
358{
359 struct radeon_device *rdev = dev->dev_private;
360 struct drm_gem_object *gobj;
361 uint32_t handle;
362 int r;
363
364 args->pitch = radeon_align_pitch(rdev, args->width, args->bpp, 0) * ((args->bpp + 1) / 8);
365 args->size = args->pitch * args->height;
366 args->size = ALIGN(args->size, PAGE_SIZE);
367
368 r = radeon_gem_object_create(rdev, args->size, 0,
369 RADEON_GEM_DOMAIN_VRAM,
370 false, ttm_bo_type_device,
371 &gobj);
372 if (r)
373 return -ENOMEM;
374
375 r = drm_gem_handle_create(file_priv, gobj, &handle);
376 /* drop reference from allocate - handle holds it now */
377 drm_gem_object_unreference_unlocked(gobj);
378 if (r) {
379 return r;
380 }
381 args->handle = handle;
382 return 0;
383}
384
385int radeon_mode_dumb_destroy(struct drm_file *file_priv,
386 struct drm_device *dev,
387 uint32_t handle)
388{
389 return drm_gem_handle_delete(file_priv, handle);
390}
diff --git a/drivers/gpu/drm/radeon/radeon_i2c.c b/drivers/gpu/drm/radeon/radeon_i2c.c
index 6a13ee38a5b9..781196db792f 100644
--- a/drivers/gpu/drm/radeon/radeon_i2c.c
+++ b/drivers/gpu/drm/radeon/radeon_i2c.c
@@ -53,8 +53,8 @@ bool radeon_ddc_probe(struct radeon_connector *radeon_connector)
53 }; 53 };
54 54
55 /* on hw with routers, select right port */ 55 /* on hw with routers, select right port */
56 if (radeon_connector->router.valid) 56 if (radeon_connector->router.ddc_valid)
57 radeon_router_select_port(radeon_connector); 57 radeon_router_select_ddc_port(radeon_connector);
58 58
59 ret = i2c_transfer(&radeon_connector->ddc_bus->adapter, msgs, 2); 59 ret = i2c_transfer(&radeon_connector->ddc_bus->adapter, msgs, 2);
60 if (ret == 2) 60 if (ret == 2)
@@ -888,6 +888,7 @@ struct radeon_i2c_chan *radeon_i2c_create(struct drm_device *dev,
888 888
889 i2c->rec = *rec; 889 i2c->rec = *rec;
890 i2c->adapter.owner = THIS_MODULE; 890 i2c->adapter.owner = THIS_MODULE;
891 i2c->adapter.class = I2C_CLASS_DDC;
891 i2c->dev = dev; 892 i2c->dev = dev;
892 i2c_set_adapdata(&i2c->adapter, i2c); 893 i2c_set_adapdata(&i2c->adapter, i2c);
893 if (rec->mm_i2c || 894 if (rec->mm_i2c ||
@@ -896,7 +897,8 @@ struct radeon_i2c_chan *radeon_i2c_create(struct drm_device *dev,
896 ((rdev->family <= CHIP_RS480) || 897 ((rdev->family <= CHIP_RS480) ||
897 ((rdev->family >= CHIP_RV515) && (rdev->family <= CHIP_R580))))) { 898 ((rdev->family >= CHIP_RV515) && (rdev->family <= CHIP_R580))))) {
898 /* set the radeon hw i2c adapter */ 899 /* set the radeon hw i2c adapter */
899 sprintf(i2c->adapter.name, "Radeon i2c hw bus %s", name); 900 snprintf(i2c->adapter.name, sizeof(i2c->adapter.name),
901 "Radeon i2c hw bus %s", name);
900 i2c->adapter.algo = &radeon_i2c_algo; 902 i2c->adapter.algo = &radeon_i2c_algo;
901 ret = i2c_add_adapter(&i2c->adapter); 903 ret = i2c_add_adapter(&i2c->adapter);
902 if (ret) { 904 if (ret) {
@@ -905,7 +907,8 @@ struct radeon_i2c_chan *radeon_i2c_create(struct drm_device *dev,
905 } 907 }
906 } else { 908 } else {
907 /* set the radeon bit adapter */ 909 /* set the radeon bit adapter */
908 sprintf(i2c->adapter.name, "Radeon i2c bit bus %s", name); 910 snprintf(i2c->adapter.name, sizeof(i2c->adapter.name),
911 "Radeon i2c bit bus %s", name);
909 i2c->adapter.algo_data = &i2c->algo.bit; 912 i2c->adapter.algo_data = &i2c->algo.bit;
910 i2c->algo.bit.pre_xfer = pre_xfer; 913 i2c->algo.bit.pre_xfer = pre_xfer;
911 i2c->algo.bit.post_xfer = post_xfer; 914 i2c->algo.bit.post_xfer = post_xfer;
@@ -945,7 +948,10 @@ struct radeon_i2c_chan *radeon_i2c_create_dp(struct drm_device *dev,
945 948
946 i2c->rec = *rec; 949 i2c->rec = *rec;
947 i2c->adapter.owner = THIS_MODULE; 950 i2c->adapter.owner = THIS_MODULE;
951 i2c->adapter.class = I2C_CLASS_DDC;
948 i2c->dev = dev; 952 i2c->dev = dev;
953 snprintf(i2c->adapter.name, sizeof(i2c->adapter.name),
954 "Radeon aux bus %s", name);
949 i2c_set_adapdata(&i2c->adapter, i2c); 955 i2c_set_adapdata(&i2c->adapter, i2c);
950 i2c->adapter.algo_data = &i2c->algo.dp; 956 i2c->adapter.algo_data = &i2c->algo.dp;
951 i2c->algo.dp.aux_ch = radeon_dp_i2c_aux_ch; 957 i2c->algo.dp.aux_ch = radeon_dp_i2c_aux_ch;
@@ -1058,7 +1064,7 @@ void radeon_i2c_get_byte(struct radeon_i2c_chan *i2c_bus,
1058 *val = in_buf[0]; 1064 *val = in_buf[0];
1059 DRM_DEBUG("val = 0x%02x\n", *val); 1065 DRM_DEBUG("val = 0x%02x\n", *val);
1060 } else { 1066 } else {
1061 DRM_ERROR("i2c 0x%02x 0x%02x read failed\n", 1067 DRM_DEBUG("i2c 0x%02x 0x%02x read failed\n",
1062 addr, *val); 1068 addr, *val);
1063 } 1069 }
1064} 1070}
@@ -1080,30 +1086,61 @@ void radeon_i2c_put_byte(struct radeon_i2c_chan *i2c_bus,
1080 out_buf[1] = val; 1086 out_buf[1] = val;
1081 1087
1082 if (i2c_transfer(&i2c_bus->adapter, &msg, 1) != 1) 1088 if (i2c_transfer(&i2c_bus->adapter, &msg, 1) != 1)
1083 DRM_ERROR("i2c 0x%02x 0x%02x write failed\n", 1089 DRM_DEBUG("i2c 0x%02x 0x%02x write failed\n",
1084 addr, val); 1090 addr, val);
1085} 1091}
1086 1092
1087/* router switching */ 1093/* ddc router switching */
1088void radeon_router_select_port(struct radeon_connector *radeon_connector) 1094void radeon_router_select_ddc_port(struct radeon_connector *radeon_connector)
1089{ 1095{
1090 u8 val; 1096 u8 val;
1091 1097
1092 if (!radeon_connector->router.valid) 1098 if (!radeon_connector->router.ddc_valid)
1099 return;
1100
1101 if (!radeon_connector->router_bus)
1102 return;
1103
1104 radeon_i2c_get_byte(radeon_connector->router_bus,
1105 radeon_connector->router.i2c_addr,
1106 0x3, &val);
1107 val &= ~radeon_connector->router.ddc_mux_control_pin;
1108 radeon_i2c_put_byte(radeon_connector->router_bus,
1109 radeon_connector->router.i2c_addr,
1110 0x3, val);
1111 radeon_i2c_get_byte(radeon_connector->router_bus,
1112 radeon_connector->router.i2c_addr,
1113 0x1, &val);
1114 val &= ~radeon_connector->router.ddc_mux_control_pin;
1115 val |= radeon_connector->router.ddc_mux_state;
1116 radeon_i2c_put_byte(radeon_connector->router_bus,
1117 radeon_connector->router.i2c_addr,
1118 0x1, val);
1119}
1120
1121/* clock/data router switching */
1122void radeon_router_select_cd_port(struct radeon_connector *radeon_connector)
1123{
1124 u8 val;
1125
1126 if (!radeon_connector->router.cd_valid)
1127 return;
1128
1129 if (!radeon_connector->router_bus)
1093 return; 1130 return;
1094 1131
1095 radeon_i2c_get_byte(radeon_connector->router_bus, 1132 radeon_i2c_get_byte(radeon_connector->router_bus,
1096 radeon_connector->router.i2c_addr, 1133 radeon_connector->router.i2c_addr,
1097 0x3, &val); 1134 0x3, &val);
1098 val &= radeon_connector->router.mux_control_pin; 1135 val &= ~radeon_connector->router.cd_mux_control_pin;
1099 radeon_i2c_put_byte(radeon_connector->router_bus, 1136 radeon_i2c_put_byte(radeon_connector->router_bus,
1100 radeon_connector->router.i2c_addr, 1137 radeon_connector->router.i2c_addr,
1101 0x3, val); 1138 0x3, val);
1102 radeon_i2c_get_byte(radeon_connector->router_bus, 1139 radeon_i2c_get_byte(radeon_connector->router_bus,
1103 radeon_connector->router.i2c_addr, 1140 radeon_connector->router.i2c_addr,
1104 0x1, &val); 1141 0x1, &val);
1105 val &= radeon_connector->router.mux_control_pin; 1142 val &= ~radeon_connector->router.cd_mux_control_pin;
1106 val |= radeon_connector->router.mux_state; 1143 val |= radeon_connector->router.cd_mux_state;
1107 radeon_i2c_put_byte(radeon_connector->router_bus, 1144 radeon_i2c_put_byte(radeon_connector->router_bus,
1108 radeon_connector->router.i2c_addr, 1145 radeon_connector->router.i2c_addr,
1109 0x1, val); 1146 0x1, val);
diff --git a/drivers/gpu/drm/radeon/radeon_irq.c b/drivers/gpu/drm/radeon/radeon_irq.c
index 2f349a300195..465746bd51b7 100644
--- a/drivers/gpu/drm/radeon/radeon_irq.c
+++ b/drivers/gpu/drm/radeon/radeon_irq.c
@@ -76,7 +76,7 @@ int radeon_enable_vblank(struct drm_device *dev, int crtc)
76 default: 76 default:
77 DRM_ERROR("tried to enable vblank on non-existent crtc %d\n", 77 DRM_ERROR("tried to enable vblank on non-existent crtc %d\n",
78 crtc); 78 crtc);
79 return EINVAL; 79 return -EINVAL;
80 } 80 }
81 } else { 81 } else {
82 switch (crtc) { 82 switch (crtc) {
@@ -89,7 +89,7 @@ int radeon_enable_vblank(struct drm_device *dev, int crtc)
89 default: 89 default:
90 DRM_ERROR("tried to enable vblank on non-existent crtc %d\n", 90 DRM_ERROR("tried to enable vblank on non-existent crtc %d\n",
91 crtc); 91 crtc);
92 return EINVAL; 92 return -EINVAL;
93 } 93 }
94 } 94 }
95 95
diff --git a/drivers/gpu/drm/radeon/radeon_irq_kms.c b/drivers/gpu/drm/radeon/radeon_irq_kms.c
index a108c7ed14f5..9ec830c77af0 100644
--- a/drivers/gpu/drm/radeon/radeon_irq_kms.c
+++ b/drivers/gpu/drm/radeon/radeon_irq_kms.c
@@ -64,15 +64,15 @@ void radeon_driver_irq_preinstall_kms(struct drm_device *dev)
64 struct radeon_device *rdev = dev->dev_private; 64 struct radeon_device *rdev = dev->dev_private;
65 unsigned i; 65 unsigned i;
66 66
67 INIT_WORK(&rdev->hotplug_work, radeon_hotplug_work_func);
68
69 /* Disable *all* interrupts */ 67 /* Disable *all* interrupts */
70 rdev->irq.sw_int = false; 68 rdev->irq.sw_int = false;
71 rdev->irq.gui_idle = false; 69 rdev->irq.gui_idle = false;
72 for (i = 0; i < rdev->num_crtc; i++) 70 for (i = 0; i < rdev->num_crtc; i++)
73 rdev->irq.crtc_vblank_int[i] = false; 71 rdev->irq.crtc_vblank_int[i] = false;
74 for (i = 0; i < 6; i++) 72 for (i = 0; i < 6; i++) {
75 rdev->irq.hpd[i] = false; 73 rdev->irq.hpd[i] = false;
74 rdev->irq.pflip[i] = false;
75 }
76 radeon_irq_set(rdev); 76 radeon_irq_set(rdev);
77 /* Clear bits */ 77 /* Clear bits */
78 radeon_irq_process(rdev); 78 radeon_irq_process(rdev);
@@ -101,16 +101,23 @@ void radeon_driver_irq_uninstall_kms(struct drm_device *dev)
101 rdev->irq.gui_idle = false; 101 rdev->irq.gui_idle = false;
102 for (i = 0; i < rdev->num_crtc; i++) 102 for (i = 0; i < rdev->num_crtc; i++)
103 rdev->irq.crtc_vblank_int[i] = false; 103 rdev->irq.crtc_vblank_int[i] = false;
104 for (i = 0; i < 6; i++) 104 for (i = 0; i < 6; i++) {
105 rdev->irq.hpd[i] = false; 105 rdev->irq.hpd[i] = false;
106 rdev->irq.pflip[i] = false;
107 }
106 radeon_irq_set(rdev); 108 radeon_irq_set(rdev);
107} 109}
108 110
109int radeon_irq_kms_init(struct radeon_device *rdev) 111int radeon_irq_kms_init(struct radeon_device *rdev)
110{ 112{
113 int i;
111 int r = 0; 114 int r = 0;
112 115
116 INIT_WORK(&rdev->hotplug_work, radeon_hotplug_work_func);
117
113 spin_lock_init(&rdev->irq.sw_lock); 118 spin_lock_init(&rdev->irq.sw_lock);
119 for (i = 0; i < rdev->num_crtc; i++)
120 spin_lock_init(&rdev->irq.pflip_lock[i]);
114 r = drm_vblank_init(rdev->ddev, rdev->num_crtc); 121 r = drm_vblank_init(rdev->ddev, rdev->num_crtc);
115 if (r) { 122 if (r) {
116 return r; 123 return r;
@@ -121,7 +128,7 @@ int radeon_irq_kms_init(struct radeon_device *rdev)
121 * chips. Disable MSI on them for now. 128 * chips. Disable MSI on them for now.
122 */ 129 */
123 if ((rdev->family >= CHIP_RV380) && 130 if ((rdev->family >= CHIP_RV380) &&
124 (!(rdev->flags & RADEON_IS_IGP)) && 131 ((!(rdev->flags & RADEON_IS_IGP)) || (rdev->family >= CHIP_PALM)) &&
125 (!(rdev->flags & RADEON_IS_AGP))) { 132 (!(rdev->flags & RADEON_IS_AGP))) {
126 int ret = pci_enable_msi(rdev->pdev); 133 int ret = pci_enable_msi(rdev->pdev);
127 if (!ret) { 134 if (!ret) {
@@ -148,6 +155,7 @@ void radeon_irq_kms_fini(struct radeon_device *rdev)
148 if (rdev->msi_enabled) 155 if (rdev->msi_enabled)
149 pci_disable_msi(rdev->pdev); 156 pci_disable_msi(rdev->pdev);
150 } 157 }
158 flush_work_sync(&rdev->hotplug_work);
151} 159}
152 160
153void radeon_irq_kms_sw_irq_get(struct radeon_device *rdev) 161void radeon_irq_kms_sw_irq_get(struct radeon_device *rdev)
@@ -175,3 +183,34 @@ void radeon_irq_kms_sw_irq_put(struct radeon_device *rdev)
175 spin_unlock_irqrestore(&rdev->irq.sw_lock, irqflags); 183 spin_unlock_irqrestore(&rdev->irq.sw_lock, irqflags);
176} 184}
177 185
186void radeon_irq_kms_pflip_irq_get(struct radeon_device *rdev, int crtc)
187{
188 unsigned long irqflags;
189
190 if (crtc < 0 || crtc >= rdev->num_crtc)
191 return;
192
193 spin_lock_irqsave(&rdev->irq.pflip_lock[crtc], irqflags);
194 if (rdev->ddev->irq_enabled && (++rdev->irq.pflip_refcount[crtc] == 1)) {
195 rdev->irq.pflip[crtc] = true;
196 radeon_irq_set(rdev);
197 }
198 spin_unlock_irqrestore(&rdev->irq.pflip_lock[crtc], irqflags);
199}
200
201void radeon_irq_kms_pflip_irq_put(struct radeon_device *rdev, int crtc)
202{
203 unsigned long irqflags;
204
205 if (crtc < 0 || crtc >= rdev->num_crtc)
206 return;
207
208 spin_lock_irqsave(&rdev->irq.pflip_lock[crtc], irqflags);
209 BUG_ON(rdev->ddev->irq_enabled && rdev->irq.pflip_refcount[crtc] <= 0);
210 if (rdev->ddev->irq_enabled && (--rdev->irq.pflip_refcount[crtc] == 0)) {
211 rdev->irq.pflip[crtc] = false;
212 radeon_irq_set(rdev);
213 }
214 spin_unlock_irqrestore(&rdev->irq.pflip_lock[crtc], irqflags);
215}
216
diff --git a/drivers/gpu/drm/radeon/radeon_kms.c b/drivers/gpu/drm/radeon/radeon_kms.c
index 8fbbe1c6ebbd..bd58af658581 100644
--- a/drivers/gpu/drm/radeon/radeon_kms.c
+++ b/drivers/gpu/drm/radeon/radeon_kms.c
@@ -58,9 +58,9 @@ int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags)
58 dev->dev_private = (void *)rdev; 58 dev->dev_private = (void *)rdev;
59 59
60 /* update BUS flag */ 60 /* update BUS flag */
61 if (drm_device_is_agp(dev)) { 61 if (drm_pci_device_is_agp(dev)) {
62 flags |= RADEON_IS_AGP; 62 flags |= RADEON_IS_AGP;
63 } else if (drm_device_is_pcie(dev)) { 63 } else if (drm_pci_device_is_pcie(dev)) {
64 flags |= RADEON_IS_PCIE; 64 flags |= RADEON_IS_PCIE;
65 } else { 65 } else {
66 flags |= RADEON_IS_PCI; 66 flags |= RADEON_IS_PCI;
@@ -96,9 +96,27 @@ out:
96 return r; 96 return r;
97} 97}
98 98
99static void radeon_set_filp_rights(struct drm_device *dev,
100 struct drm_file **owner,
101 struct drm_file *applier,
102 uint32_t *value)
103{
104 mutex_lock(&dev->struct_mutex);
105 if (*value == 1) {
106 /* wants rights */
107 if (!*owner)
108 *owner = applier;
109 } else if (*value == 0) {
110 /* revokes rights */
111 if (*owner == applier)
112 *owner = NULL;
113 }
114 *value = *owner == applier ? 1 : 0;
115 mutex_unlock(&dev->struct_mutex);
116}
99 117
100/* 118/*
101 * Userspace get informations ioctl 119 * Userspace get information ioctl
102 */ 120 */
103int radeon_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) 121int radeon_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
104{ 122{
@@ -151,7 +169,9 @@ int radeon_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
151 value = rdev->accel_working; 169 value = rdev->accel_working;
152 break; 170 break;
153 case RADEON_INFO_TILING_CONFIG: 171 case RADEON_INFO_TILING_CONFIG:
154 if (rdev->family >= CHIP_CEDAR) 172 if (rdev->family >= CHIP_CAYMAN)
173 value = rdev->config.cayman.tile_config;
174 else if (rdev->family >= CHIP_CEDAR)
155 value = rdev->config.evergreen.tile_config; 175 value = rdev->config.evergreen.tile_config;
156 else if (rdev->family >= CHIP_RV770) 176 else if (rdev->family >= CHIP_RV770)
157 value = rdev->config.rv770.tile_config; 177 value = rdev->config.rv770.tile_config;
@@ -173,18 +193,49 @@ int radeon_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
173 DRM_DEBUG_KMS("WANT_HYPERZ: invalid value %d\n", value); 193 DRM_DEBUG_KMS("WANT_HYPERZ: invalid value %d\n", value);
174 return -EINVAL; 194 return -EINVAL;
175 } 195 }
176 mutex_lock(&dev->struct_mutex); 196 radeon_set_filp_rights(dev, &rdev->hyperz_filp, filp, &value);
177 if (value == 1) { 197 break;
178 /* wants hyper-z */ 198 case RADEON_INFO_WANT_CMASK:
179 if (!rdev->hyperz_filp) 199 /* The same logic as Hyper-Z. */
180 rdev->hyperz_filp = filp; 200 if (value >= 2) {
181 } else if (value == 0) { 201 DRM_DEBUG_KMS("WANT_CMASK: invalid value %d\n", value);
182 /* revokes hyper-z */ 202 return -EINVAL;
183 if (rdev->hyperz_filp == filp) 203 }
184 rdev->hyperz_filp = NULL; 204 radeon_set_filp_rights(dev, &rdev->cmask_filp, filp, &value);
205 break;
206 case RADEON_INFO_CLOCK_CRYSTAL_FREQ:
207 /* return clock value in KHz */
208 value = rdev->clock.spll.reference_freq * 10;
209 break;
210 case RADEON_INFO_NUM_BACKENDS:
211 if (rdev->family >= CHIP_CAYMAN)
212 value = rdev->config.cayman.max_backends_per_se *
213 rdev->config.cayman.max_shader_engines;
214 else if (rdev->family >= CHIP_CEDAR)
215 value = rdev->config.evergreen.max_backends;
216 else if (rdev->family >= CHIP_RV770)
217 value = rdev->config.rv770.max_backends;
218 else if (rdev->family >= CHIP_R600)
219 value = rdev->config.r600.max_backends;
220 else {
221 return -EINVAL;
222 }
223 break;
224 case RADEON_INFO_NUM_TILE_PIPES:
225 if (rdev->family >= CHIP_CAYMAN)
226 value = rdev->config.cayman.max_tile_pipes;
227 else if (rdev->family >= CHIP_CEDAR)
228 value = rdev->config.evergreen.max_tile_pipes;
229 else if (rdev->family >= CHIP_RV770)
230 value = rdev->config.rv770.max_tile_pipes;
231 else if (rdev->family >= CHIP_R600)
232 value = rdev->config.r600.max_tile_pipes;
233 else {
234 return -EINVAL;
185 } 235 }
186 value = rdev->hyperz_filp == filp ? 1 : 0; 236 break;
187 mutex_unlock(&dev->struct_mutex); 237 case RADEON_INFO_FUSION_GART_WORKING:
238 value = 1;
188 break; 239 break;
189 default: 240 default:
190 DRM_DEBUG_KMS("Invalid request %d\n", info->request); 241 DRM_DEBUG_KMS("Invalid request %d\n", info->request);
@@ -203,10 +254,6 @@ int radeon_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
203 */ 254 */
204int radeon_driver_firstopen_kms(struct drm_device *dev) 255int radeon_driver_firstopen_kms(struct drm_device *dev)
205{ 256{
206 struct radeon_device *rdev = dev->dev_private;
207
208 if (rdev->powered_down)
209 return -EINVAL;
210 return 0; 257 return 0;
211} 258}
212 259
@@ -232,6 +279,8 @@ void radeon_driver_preclose_kms(struct drm_device *dev,
232 struct radeon_device *rdev = dev->dev_private; 279 struct radeon_device *rdev = dev->dev_private;
233 if (rdev->hyperz_filp == file_priv) 280 if (rdev->hyperz_filp == file_priv)
234 rdev->hyperz_filp = NULL; 281 rdev->hyperz_filp = NULL;
282 if (rdev->cmask_filp == file_priv)
283 rdev->cmask_filp = NULL;
235} 284}
236 285
237/* 286/*
@@ -277,6 +326,27 @@ void radeon_disable_vblank_kms(struct drm_device *dev, int crtc)
277 radeon_irq_set(rdev); 326 radeon_irq_set(rdev);
278} 327}
279 328
329int radeon_get_vblank_timestamp_kms(struct drm_device *dev, int crtc,
330 int *max_error,
331 struct timeval *vblank_time,
332 unsigned flags)
333{
334 struct drm_crtc *drmcrtc;
335 struct radeon_device *rdev = dev->dev_private;
336
337 if (crtc < 0 || crtc >= dev->num_crtcs) {
338 DRM_ERROR("Invalid crtc %d\n", crtc);
339 return -EINVAL;
340 }
341
342 /* Get associated drm_crtc: */
343 drmcrtc = &rdev->mode_info.crtcs[crtc]->base;
344
345 /* Helper routine in DRM core does all the work: */
346 return drm_calc_vbltimestamp_from_scanoutpos(dev, crtc, max_error,
347 vblank_time, flags,
348 drmcrtc);
349}
280 350
281/* 351/*
282 * IOCTL. 352 * IOCTL.
diff --git a/drivers/gpu/drm/radeon/radeon_legacy_crtc.c b/drivers/gpu/drm/radeon/radeon_legacy_crtc.c
index 305049afde15..41a5d48e657b 100644
--- a/drivers/gpu/drm/radeon/radeon_legacy_crtc.c
+++ b/drivers/gpu/drm/radeon/radeon_legacy_crtc.c
@@ -348,10 +348,25 @@ void radeon_crtc_dpms(struct drm_crtc *crtc, int mode)
348int radeon_crtc_set_base(struct drm_crtc *crtc, int x, int y, 348int radeon_crtc_set_base(struct drm_crtc *crtc, int x, int y,
349 struct drm_framebuffer *old_fb) 349 struct drm_framebuffer *old_fb)
350{ 350{
351 return radeon_crtc_do_set_base(crtc, old_fb, x, y, 0);
352}
353
354int radeon_crtc_set_base_atomic(struct drm_crtc *crtc,
355 struct drm_framebuffer *fb,
356 int x, int y, enum mode_set_atomic state)
357{
358 return radeon_crtc_do_set_base(crtc, fb, x, y, 1);
359}
360
361int radeon_crtc_do_set_base(struct drm_crtc *crtc,
362 struct drm_framebuffer *fb,
363 int x, int y, int atomic)
364{
351 struct drm_device *dev = crtc->dev; 365 struct drm_device *dev = crtc->dev;
352 struct radeon_device *rdev = dev->dev_private; 366 struct radeon_device *rdev = dev->dev_private;
353 struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); 367 struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
354 struct radeon_framebuffer *radeon_fb; 368 struct radeon_framebuffer *radeon_fb;
369 struct drm_framebuffer *target_fb;
355 struct drm_gem_object *obj; 370 struct drm_gem_object *obj;
356 struct radeon_bo *rbo; 371 struct radeon_bo *rbo;
357 uint64_t base; 372 uint64_t base;
@@ -364,14 +379,21 @@ int radeon_crtc_set_base(struct drm_crtc *crtc, int x, int y,
364 379
365 DRM_DEBUG_KMS("\n"); 380 DRM_DEBUG_KMS("\n");
366 /* no fb bound */ 381 /* no fb bound */
367 if (!crtc->fb) { 382 if (!atomic && !crtc->fb) {
368 DRM_DEBUG_KMS("No FB bound\n"); 383 DRM_DEBUG_KMS("No FB bound\n");
369 return 0; 384 return 0;
370 } 385 }
371 386
372 radeon_fb = to_radeon_framebuffer(crtc->fb); 387 if (atomic) {
388 radeon_fb = to_radeon_framebuffer(fb);
389 target_fb = fb;
390 }
391 else {
392 radeon_fb = to_radeon_framebuffer(crtc->fb);
393 target_fb = crtc->fb;
394 }
373 395
374 switch (crtc->fb->bits_per_pixel) { 396 switch (target_fb->bits_per_pixel) {
375 case 8: 397 case 8:
376 format = 2; 398 format = 2;
377 break; 399 break;
@@ -393,7 +415,7 @@ int radeon_crtc_set_base(struct drm_crtc *crtc, int x, int y,
393 415
394 /* Pin framebuffer & get tilling informations */ 416 /* Pin framebuffer & get tilling informations */
395 obj = radeon_fb->obj; 417 obj = radeon_fb->obj;
396 rbo = obj->driver_private; 418 rbo = gem_to_radeon_bo(obj);
397 r = radeon_bo_reserve(rbo, false); 419 r = radeon_bo_reserve(rbo, false);
398 if (unlikely(r != 0)) 420 if (unlikely(r != 0))
399 return r; 421 return r;
@@ -415,13 +437,13 @@ int radeon_crtc_set_base(struct drm_crtc *crtc, int x, int y,
415 437
416 crtc_offset_cntl = 0; 438 crtc_offset_cntl = 0;
417 439
418 pitch_pixels = crtc->fb->pitch / (crtc->fb->bits_per_pixel / 8); 440 pitch_pixels = target_fb->pitch / (target_fb->bits_per_pixel / 8);
419 crtc_pitch = (((pitch_pixels * crtc->fb->bits_per_pixel) + 441 crtc_pitch = (((pitch_pixels * target_fb->bits_per_pixel) +
420 ((crtc->fb->bits_per_pixel * 8) - 1)) / 442 ((target_fb->bits_per_pixel * 8) - 1)) /
421 (crtc->fb->bits_per_pixel * 8)); 443 (target_fb->bits_per_pixel * 8));
422 crtc_pitch |= crtc_pitch << 16; 444 crtc_pitch |= crtc_pitch << 16;
423 445
424 446 crtc_offset_cntl |= RADEON_CRTC_GUI_TRIG_OFFSET_LEFT_EN;
425 if (tiling_flags & RADEON_TILING_MACRO) { 447 if (tiling_flags & RADEON_TILING_MACRO) {
426 if (ASIC_IS_R300(rdev)) 448 if (ASIC_IS_R300(rdev))
427 crtc_offset_cntl |= (R300_CRTC_X_Y_MODE_EN | 449 crtc_offset_cntl |= (R300_CRTC_X_Y_MODE_EN |
@@ -443,14 +465,14 @@ int radeon_crtc_set_base(struct drm_crtc *crtc, int x, int y,
443 crtc_tile_x0_y0 = x | (y << 16); 465 crtc_tile_x0_y0 = x | (y << 16);
444 base &= ~0x7ff; 466 base &= ~0x7ff;
445 } else { 467 } else {
446 int byteshift = crtc->fb->bits_per_pixel >> 4; 468 int byteshift = target_fb->bits_per_pixel >> 4;
447 int tile_addr = (((y >> 3) * pitch_pixels + x) >> (8 - byteshift)) << 11; 469 int tile_addr = (((y >> 3) * pitch_pixels + x) >> (8 - byteshift)) << 11;
448 base += tile_addr + ((x << byteshift) % 256) + ((y % 8) << 8); 470 base += tile_addr + ((x << byteshift) % 256) + ((y % 8) << 8);
449 crtc_offset_cntl |= (y % 16); 471 crtc_offset_cntl |= (y % 16);
450 } 472 }
451 } else { 473 } else {
452 int offset = y * pitch_pixels + x; 474 int offset = y * pitch_pixels + x;
453 switch (crtc->fb->bits_per_pixel) { 475 switch (target_fb->bits_per_pixel) {
454 case 8: 476 case 8:
455 offset *= 1; 477 offset *= 1;
456 break; 478 break;
@@ -480,6 +502,7 @@ int radeon_crtc_set_base(struct drm_crtc *crtc, int x, int y,
480 gen_cntl_val = RREG32(gen_cntl_reg); 502 gen_cntl_val = RREG32(gen_cntl_reg);
481 gen_cntl_val &= ~(0xf << 8); 503 gen_cntl_val &= ~(0xf << 8);
482 gen_cntl_val |= (format << 8); 504 gen_cntl_val |= (format << 8);
505 gen_cntl_val &= ~RADEON_CRTC_VSTAT_MODE_MASK;
483 WREG32(gen_cntl_reg, gen_cntl_val); 506 WREG32(gen_cntl_reg, gen_cntl_val);
484 507
485 crtc_offset = (u32)base; 508 crtc_offset = (u32)base;
@@ -496,9 +519,9 @@ int radeon_crtc_set_base(struct drm_crtc *crtc, int x, int y,
496 WREG32(RADEON_CRTC_OFFSET + radeon_crtc->crtc_offset, crtc_offset); 519 WREG32(RADEON_CRTC_OFFSET + radeon_crtc->crtc_offset, crtc_offset);
497 WREG32(RADEON_CRTC_PITCH + radeon_crtc->crtc_offset, crtc_pitch); 520 WREG32(RADEON_CRTC_PITCH + radeon_crtc->crtc_offset, crtc_pitch);
498 521
499 if (old_fb && old_fb != crtc->fb) { 522 if (!atomic && fb && fb != crtc->fb) {
500 radeon_fb = to_radeon_framebuffer(old_fb); 523 radeon_fb = to_radeon_framebuffer(fb);
501 rbo = radeon_fb->obj->driver_private; 524 rbo = gem_to_radeon_bo(radeon_fb->obj);
502 r = radeon_bo_reserve(rbo, false); 525 r = radeon_bo_reserve(rbo, false);
503 if (unlikely(r != 0)) 526 if (unlikely(r != 0))
504 return r; 527 return r;
@@ -717,10 +740,6 @@ static void radeon_set_pll(struct drm_crtc *crtc, struct drm_display_mode *mode)
717 pll = &rdev->clock.p1pll; 740 pll = &rdev->clock.p1pll;
718 741
719 pll->flags = RADEON_PLL_LEGACY; 742 pll->flags = RADEON_PLL_LEGACY;
720 if (radeon_new_pll == 1)
721 pll->algo = PLL_ALGO_NEW;
722 else
723 pll->algo = PLL_ALGO_LEGACY;
724 743
725 if (mode->clock > 200000) /* range limits??? */ 744 if (mode->clock > 200000) /* range limits??? */
726 pll->flags |= RADEON_PLL_PREFER_HIGH_FB_DIV; 745 pll->flags |= RADEON_PLL_PREFER_HIGH_FB_DIV;
@@ -760,9 +779,9 @@ static void radeon_set_pll(struct drm_crtc *crtc, struct drm_display_mode *mode)
760 DRM_DEBUG_KMS("\n"); 779 DRM_DEBUG_KMS("\n");
761 780
762 if (!use_bios_divs) { 781 if (!use_bios_divs) {
763 radeon_compute_pll(pll, mode->clock, 782 radeon_compute_pll_legacy(pll, mode->clock,
764 &freq, &feedback_div, &frac_fb_div, 783 &freq, &feedback_div, &frac_fb_div,
765 &reference_div, &post_divider); 784 &reference_div, &post_divider);
766 785
767 for (post_div = &post_divs[0]; post_div->divider; ++post_div) { 786 for (post_div = &post_divs[0]; post_div->divider; ++post_div) {
768 if (post_div->divider == post_divider) 787 if (post_div->divider == post_divider)
@@ -870,7 +889,7 @@ static void radeon_set_pll(struct drm_crtc *crtc, struct drm_display_mode *mode)
870 } 889 }
871 890
872 if (rdev->flags & RADEON_IS_MOBILITY) { 891 if (rdev->flags & RADEON_IS_MOBILITY) {
873 /* A temporal workaround for the occational blanking on certain laptop panels. 892 /* A temporal workaround for the occasional blanking on certain laptop panels.
874 This appears to related to the PLL divider registers (fail to lock?). 893 This appears to related to the PLL divider registers (fail to lock?).
875 It occurs even when all dividers are the same with their old settings. 894 It occurs even when all dividers are the same with their old settings.
876 In this case we really don't need to fiddle with PLL registers. 895 In this case we really don't need to fiddle with PLL registers.
@@ -1040,6 +1059,7 @@ static const struct drm_crtc_helper_funcs legacy_helper_funcs = {
1040 .mode_fixup = radeon_crtc_mode_fixup, 1059 .mode_fixup = radeon_crtc_mode_fixup,
1041 .mode_set = radeon_crtc_mode_set, 1060 .mode_set = radeon_crtc_mode_set,
1042 .mode_set_base = radeon_crtc_set_base, 1061 .mode_set_base = radeon_crtc_set_base,
1062 .mode_set_base_atomic = radeon_crtc_set_base_atomic,
1043 .prepare = radeon_crtc_prepare, 1063 .prepare = radeon_crtc_prepare,
1044 .commit = radeon_crtc_commit, 1064 .commit = radeon_crtc_commit,
1045 .load_lut = radeon_crtc_load_lut, 1065 .load_lut = radeon_crtc_load_lut,
diff --git a/drivers/gpu/drm/radeon/radeon_legacy_encoders.c b/drivers/gpu/drm/radeon/radeon_legacy_encoders.c
index 0b8397000f4c..2f46e0c8df53 100644
--- a/drivers/gpu/drm/radeon/radeon_legacy_encoders.c
+++ b/drivers/gpu/drm/radeon/radeon_legacy_encoders.c
@@ -28,6 +28,10 @@
28#include "radeon_drm.h" 28#include "radeon_drm.h"
29#include "radeon.h" 29#include "radeon.h"
30#include "atom.h" 30#include "atom.h"
31#include <linux/backlight.h>
32#ifdef CONFIG_PMAC_BACKLIGHT
33#include <asm/backlight.h>
34#endif
31 35
32static void radeon_legacy_encoder_disable(struct drm_encoder *encoder) 36static void radeon_legacy_encoder_disable(struct drm_encoder *encoder)
33{ 37{
@@ -39,7 +43,7 @@ static void radeon_legacy_encoder_disable(struct drm_encoder *encoder)
39 radeon_encoder->active_device = 0; 43 radeon_encoder->active_device = 0;
40} 44}
41 45
42static void radeon_legacy_lvds_dpms(struct drm_encoder *encoder, int mode) 46static void radeon_legacy_lvds_update(struct drm_encoder *encoder, int mode)
43{ 47{
44 struct drm_device *dev = encoder->dev; 48 struct drm_device *dev = encoder->dev;
45 struct radeon_device *rdev = dev->dev_private; 49 struct radeon_device *rdev = dev->dev_private;
@@ -47,15 +51,23 @@ static void radeon_legacy_lvds_dpms(struct drm_encoder *encoder, int mode)
47 uint32_t lvds_gen_cntl, lvds_pll_cntl, pixclks_cntl, disp_pwr_man; 51 uint32_t lvds_gen_cntl, lvds_pll_cntl, pixclks_cntl, disp_pwr_man;
48 int panel_pwr_delay = 2000; 52 int panel_pwr_delay = 2000;
49 bool is_mac = false; 53 bool is_mac = false;
54 uint8_t backlight_level;
50 DRM_DEBUG_KMS("\n"); 55 DRM_DEBUG_KMS("\n");
51 56
57 lvds_gen_cntl = RREG32(RADEON_LVDS_GEN_CNTL);
58 backlight_level = (lvds_gen_cntl >> RADEON_LVDS_BL_MOD_LEVEL_SHIFT) & 0xff;
59
52 if (radeon_encoder->enc_priv) { 60 if (radeon_encoder->enc_priv) {
53 if (rdev->is_atom_bios) { 61 if (rdev->is_atom_bios) {
54 struct radeon_encoder_atom_dig *lvds = radeon_encoder->enc_priv; 62 struct radeon_encoder_atom_dig *lvds = radeon_encoder->enc_priv;
55 panel_pwr_delay = lvds->panel_pwr_delay; 63 panel_pwr_delay = lvds->panel_pwr_delay;
64 if (lvds->bl_dev)
65 backlight_level = lvds->backlight_level;
56 } else { 66 } else {
57 struct radeon_encoder_lvds *lvds = radeon_encoder->enc_priv; 67 struct radeon_encoder_lvds *lvds = radeon_encoder->enc_priv;
58 panel_pwr_delay = lvds->panel_pwr_delay; 68 panel_pwr_delay = lvds->panel_pwr_delay;
69 if (lvds->bl_dev)
70 backlight_level = lvds->backlight_level;
59 } 71 }
60 } 72 }
61 73
@@ -82,11 +94,13 @@ static void radeon_legacy_lvds_dpms(struct drm_encoder *encoder, int mode)
82 lvds_pll_cntl &= ~RADEON_LVDS_PLL_RESET; 94 lvds_pll_cntl &= ~RADEON_LVDS_PLL_RESET;
83 WREG32(RADEON_LVDS_PLL_CNTL, lvds_pll_cntl); 95 WREG32(RADEON_LVDS_PLL_CNTL, lvds_pll_cntl);
84 96
85 lvds_gen_cntl = RREG32(RADEON_LVDS_GEN_CNTL); 97 lvds_gen_cntl &= ~(RADEON_LVDS_DISPLAY_DIS |
86 lvds_gen_cntl |= (RADEON_LVDS_ON | RADEON_LVDS_EN | RADEON_LVDS_DIGON | RADEON_LVDS_BLON); 98 RADEON_LVDS_BL_MOD_LEVEL_MASK);
99 lvds_gen_cntl |= (RADEON_LVDS_ON | RADEON_LVDS_EN |
100 RADEON_LVDS_DIGON | RADEON_LVDS_BLON |
101 (backlight_level << RADEON_LVDS_BL_MOD_LEVEL_SHIFT));
87 if (is_mac) 102 if (is_mac)
88 lvds_gen_cntl |= RADEON_LVDS_BL_MOD_EN; 103 lvds_gen_cntl |= RADEON_LVDS_BL_MOD_EN;
89 lvds_gen_cntl &= ~(RADEON_LVDS_DISPLAY_DIS);
90 udelay(panel_pwr_delay * 1000); 104 udelay(panel_pwr_delay * 1000);
91 WREG32(RADEON_LVDS_GEN_CNTL, lvds_gen_cntl); 105 WREG32(RADEON_LVDS_GEN_CNTL, lvds_gen_cntl);
92 break; 106 break;
@@ -95,7 +109,6 @@ static void radeon_legacy_lvds_dpms(struct drm_encoder *encoder, int mode)
95 case DRM_MODE_DPMS_OFF: 109 case DRM_MODE_DPMS_OFF:
96 pixclks_cntl = RREG32_PLL(RADEON_PIXCLKS_CNTL); 110 pixclks_cntl = RREG32_PLL(RADEON_PIXCLKS_CNTL);
97 WREG32_PLL_P(RADEON_PIXCLKS_CNTL, 0, ~RADEON_PIXCLK_LVDS_ALWAYS_ONb); 111 WREG32_PLL_P(RADEON_PIXCLKS_CNTL, 0, ~RADEON_PIXCLK_LVDS_ALWAYS_ONb);
98 lvds_gen_cntl = RREG32(RADEON_LVDS_GEN_CNTL);
99 lvds_gen_cntl |= RADEON_LVDS_DISPLAY_DIS; 112 lvds_gen_cntl |= RADEON_LVDS_DISPLAY_DIS;
100 if (is_mac) { 113 if (is_mac) {
101 lvds_gen_cntl &= ~RADEON_LVDS_BL_MOD_EN; 114 lvds_gen_cntl &= ~RADEON_LVDS_BL_MOD_EN;
@@ -119,6 +132,25 @@ static void radeon_legacy_lvds_dpms(struct drm_encoder *encoder, int mode)
119 132
120} 133}
121 134
135static void radeon_legacy_lvds_dpms(struct drm_encoder *encoder, int mode)
136{
137 struct radeon_device *rdev = encoder->dev->dev_private;
138 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
139 DRM_DEBUG("\n");
140
141 if (radeon_encoder->enc_priv) {
142 if (rdev->is_atom_bios) {
143 struct radeon_encoder_atom_dig *lvds = radeon_encoder->enc_priv;
144 lvds->dpms_mode = mode;
145 } else {
146 struct radeon_encoder_lvds *lvds = radeon_encoder->enc_priv;
147 lvds->dpms_mode = mode;
148 }
149 }
150
151 radeon_legacy_lvds_update(encoder, mode);
152}
153
122static void radeon_legacy_lvds_prepare(struct drm_encoder *encoder) 154static void radeon_legacy_lvds_prepare(struct drm_encoder *encoder)
123{ 155{
124 struct radeon_device *rdev = encoder->dev->dev_private; 156 struct radeon_device *rdev = encoder->dev->dev_private;
@@ -237,9 +269,222 @@ static const struct drm_encoder_helper_funcs radeon_legacy_lvds_helper_funcs = {
237 .disable = radeon_legacy_encoder_disable, 269 .disable = radeon_legacy_encoder_disable,
238}; 270};
239 271
272#if defined(CONFIG_BACKLIGHT_CLASS_DEVICE) || defined(CONFIG_BACKLIGHT_CLASS_DEVICE_MODULE)
273
274#define MAX_RADEON_LEVEL 0xFF
275
276struct radeon_backlight_privdata {
277 struct radeon_encoder *encoder;
278 uint8_t negative;
279};
280
281static uint8_t radeon_legacy_lvds_level(struct backlight_device *bd)
282{
283 struct radeon_backlight_privdata *pdata = bl_get_data(bd);
284 uint8_t level;
285
286 /* Convert brightness to hardware level */
287 if (bd->props.brightness < 0)
288 level = 0;
289 else if (bd->props.brightness > MAX_RADEON_LEVEL)
290 level = MAX_RADEON_LEVEL;
291 else
292 level = bd->props.brightness;
293
294 if (pdata->negative)
295 level = MAX_RADEON_LEVEL - level;
296
297 return level;
298}
299
300static int radeon_legacy_backlight_update_status(struct backlight_device *bd)
301{
302 struct radeon_backlight_privdata *pdata = bl_get_data(bd);
303 struct radeon_encoder *radeon_encoder = pdata->encoder;
304 struct drm_device *dev = radeon_encoder->base.dev;
305 struct radeon_device *rdev = dev->dev_private;
306 int dpms_mode = DRM_MODE_DPMS_ON;
307
308 if (radeon_encoder->enc_priv) {
309 if (rdev->is_atom_bios) {
310 struct radeon_encoder_atom_dig *lvds = radeon_encoder->enc_priv;
311 dpms_mode = lvds->dpms_mode;
312 lvds->backlight_level = radeon_legacy_lvds_level(bd);
313 } else {
314 struct radeon_encoder_lvds *lvds = radeon_encoder->enc_priv;
315 dpms_mode = lvds->dpms_mode;
316 lvds->backlight_level = radeon_legacy_lvds_level(bd);
317 }
318 }
319
320 if (bd->props.brightness > 0)
321 radeon_legacy_lvds_update(&radeon_encoder->base, dpms_mode);
322 else
323 radeon_legacy_lvds_update(&radeon_encoder->base, DRM_MODE_DPMS_OFF);
324
325 return 0;
326}
327
328static int radeon_legacy_backlight_get_brightness(struct backlight_device *bd)
329{
330 struct radeon_backlight_privdata *pdata = bl_get_data(bd);
331 struct radeon_encoder *radeon_encoder = pdata->encoder;
332 struct drm_device *dev = radeon_encoder->base.dev;
333 struct radeon_device *rdev = dev->dev_private;
334 uint8_t backlight_level;
335
336 backlight_level = (RREG32(RADEON_LVDS_GEN_CNTL) >>
337 RADEON_LVDS_BL_MOD_LEVEL_SHIFT) & 0xff;
338
339 return pdata->negative ? MAX_RADEON_LEVEL - backlight_level : backlight_level;
340}
341
342static const struct backlight_ops radeon_backlight_ops = {
343 .get_brightness = radeon_legacy_backlight_get_brightness,
344 .update_status = radeon_legacy_backlight_update_status,
345};
346
347void radeon_legacy_backlight_init(struct radeon_encoder *radeon_encoder,
348 struct drm_connector *drm_connector)
349{
350 struct drm_device *dev = radeon_encoder->base.dev;
351 struct radeon_device *rdev = dev->dev_private;
352 struct backlight_device *bd;
353 struct backlight_properties props;
354 struct radeon_backlight_privdata *pdata;
355 uint8_t backlight_level;
356
357 if (!radeon_encoder->enc_priv)
358 return;
359
360#ifdef CONFIG_PMAC_BACKLIGHT
361 if (!pmac_has_backlight_type("ati") &&
362 !pmac_has_backlight_type("mnca"))
363 return;
364#endif
365
366 pdata = kmalloc(sizeof(struct radeon_backlight_privdata), GFP_KERNEL);
367 if (!pdata) {
368 DRM_ERROR("Memory allocation failed\n");
369 goto error;
370 }
371
372 props.max_brightness = MAX_RADEON_LEVEL;
373 props.type = BACKLIGHT_RAW;
374 bd = backlight_device_register("radeon_bl", &drm_connector->kdev,
375 pdata, &radeon_backlight_ops, &props);
376 if (IS_ERR(bd)) {
377 DRM_ERROR("Backlight registration failed\n");
378 goto error;
379 }
380
381 pdata->encoder = radeon_encoder;
382
383 backlight_level = (RREG32(RADEON_LVDS_GEN_CNTL) >>
384 RADEON_LVDS_BL_MOD_LEVEL_SHIFT) & 0xff;
385
386 /* First, try to detect backlight level sense based on the assumption
387 * that firmware set it up at full brightness
388 */
389 if (backlight_level == 0)
390 pdata->negative = true;
391 else if (backlight_level == 0xff)
392 pdata->negative = false;
393 else {
394 /* XXX hack... maybe some day we can figure out in what direction
395 * backlight should work on a given panel?
396 */
397 pdata->negative = (rdev->family != CHIP_RV200 &&
398 rdev->family != CHIP_RV250 &&
399 rdev->family != CHIP_RV280 &&
400 rdev->family != CHIP_RV350);
401
402#ifdef CONFIG_PMAC_BACKLIGHT
403 pdata->negative = (pdata->negative ||
404 of_machine_is_compatible("PowerBook4,3") ||
405 of_machine_is_compatible("PowerBook6,3") ||
406 of_machine_is_compatible("PowerBook6,5"));
407#endif
408 }
409
410 if (rdev->is_atom_bios) {
411 struct radeon_encoder_atom_dig *lvds = radeon_encoder->enc_priv;
412 lvds->bl_dev = bd;
413 } else {
414 struct radeon_encoder_lvds *lvds = radeon_encoder->enc_priv;
415 lvds->bl_dev = bd;
416 }
417
418 bd->props.brightness = radeon_legacy_backlight_get_brightness(bd);
419 bd->props.power = FB_BLANK_UNBLANK;
420 backlight_update_status(bd);
421
422 DRM_INFO("radeon legacy LVDS backlight initialized\n");
423
424 return;
425
426error:
427 kfree(pdata);
428 return;
429}
430
431static void radeon_legacy_backlight_exit(struct radeon_encoder *radeon_encoder)
432{
433 struct drm_device *dev = radeon_encoder->base.dev;
434 struct radeon_device *rdev = dev->dev_private;
435 struct backlight_device *bd = NULL;
436
437 if (!radeon_encoder->enc_priv)
438 return;
439
440 if (rdev->is_atom_bios) {
441 struct radeon_encoder_atom_dig *lvds = radeon_encoder->enc_priv;
442 bd = lvds->bl_dev;
443 lvds->bl_dev = NULL;
444 } else {
445 struct radeon_encoder_lvds *lvds = radeon_encoder->enc_priv;
446 bd = lvds->bl_dev;
447 lvds->bl_dev = NULL;
448 }
449
450 if (bd) {
451 struct radeon_legacy_backlight_privdata *pdata;
452
453 pdata = bl_get_data(bd);
454 backlight_device_unregister(bd);
455 kfree(pdata);
456
457 DRM_INFO("radeon legacy LVDS backlight unloaded\n");
458 }
459}
460
461#else /* !CONFIG_BACKLIGHT_CLASS_DEVICE */
462
463void radeon_legacy_backlight_init(struct radeon_encoder *encoder)
464{
465}
466
467static void radeon_legacy_backlight_exit(struct radeon_encoder *encoder)
468{
469}
470
471#endif
472
473
474static void radeon_lvds_enc_destroy(struct drm_encoder *encoder)
475{
476 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
477
478 if (radeon_encoder->enc_priv) {
479 radeon_legacy_backlight_exit(radeon_encoder);
480 kfree(radeon_encoder->enc_priv);
481 }
482 drm_encoder_cleanup(encoder);
483 kfree(radeon_encoder);
484}
240 485
241static const struct drm_encoder_funcs radeon_legacy_lvds_enc_funcs = { 486static const struct drm_encoder_funcs radeon_legacy_lvds_enc_funcs = {
242 .destroy = radeon_enc_destroy, 487 .destroy = radeon_lvds_enc_destroy,
243}; 488};
244 489
245static void radeon_legacy_primary_dac_dpms(struct drm_encoder *encoder, int mode) 490static void radeon_legacy_primary_dac_dpms(struct drm_encoder *encoder, int mode)
@@ -670,7 +915,7 @@ static void radeon_legacy_tmds_ext_mode_set(struct drm_encoder *encoder,
670 915
671 if (rdev->is_atom_bios) { 916 if (rdev->is_atom_bios) {
672 radeon_encoder->pixel_clock = adjusted_mode->clock; 917 radeon_encoder->pixel_clock = adjusted_mode->clock;
673 atombios_external_tmds_setup(encoder, ATOM_ENABLE); 918 atombios_dvo_setup(encoder, ATOM_ENABLE);
674 fp2_gen_cntl = RREG32(RADEON_FP2_GEN_CNTL); 919 fp2_gen_cntl = RREG32(RADEON_FP2_GEN_CNTL);
675 } else { 920 } else {
676 fp2_gen_cntl = RREG32(RADEON_FP2_GEN_CNTL); 921 fp2_gen_cntl = RREG32(RADEON_FP2_GEN_CNTL);
diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h
index 17a6602b5885..6df4e3cec0c2 100644
--- a/drivers/gpu/drm/radeon/radeon_mode.h
+++ b/drivers/gpu/drm/radeon/radeon_mode.h
@@ -35,8 +35,8 @@
35#include <drm_edid.h> 35#include <drm_edid.h>
36#include <drm_dp_helper.h> 36#include <drm_dp_helper.h>
37#include <drm_fixed.h> 37#include <drm_fixed.h>
38#include <drm_crtc_helper.h>
38#include <linux/i2c.h> 39#include <linux/i2c.h>
39#include <linux/i2c-id.h>
40#include <linux/i2c-algo-bit.h> 40#include <linux/i2c-algo-bit.h>
41 41
42struct radeon_bo; 42struct radeon_bo;
@@ -149,12 +149,7 @@ struct radeon_tmds_pll {
149#define RADEON_PLL_PREFER_CLOSEST_LOWER (1 << 11) 149#define RADEON_PLL_PREFER_CLOSEST_LOWER (1 << 11)
150#define RADEON_PLL_USE_POST_DIV (1 << 12) 150#define RADEON_PLL_USE_POST_DIV (1 << 12)
151#define RADEON_PLL_IS_LCD (1 << 13) 151#define RADEON_PLL_IS_LCD (1 << 13)
152 152#define RADEON_PLL_PREFER_MINM_OVER_MAXP (1 << 14)
153/* pll algo */
154enum radeon_pll_algo {
155 PLL_ALGO_LEGACY,
156 PLL_ALGO_NEW
157};
158 153
159struct radeon_pll { 154struct radeon_pll {
160 /* reference frequency */ 155 /* reference frequency */
@@ -188,8 +183,6 @@ struct radeon_pll {
188 183
189 /* pll id */ 184 /* pll id */
190 uint32_t id; 185 uint32_t id;
191 /* pll algo */
192 enum radeon_pll_algo algo;
193}; 186};
194 187
195struct radeon_i2c_chan { 188struct radeon_i2c_chan {
@@ -216,6 +209,7 @@ enum radeon_connector_table {
216 CT_EMAC, 209 CT_EMAC,
217 CT_RN50_POWER, 210 CT_RN50_POWER,
218 CT_MAC_X800, 211 CT_MAC_X800,
212 CT_MAC_G5_9600,
219}; 213};
220 214
221enum radeon_dvo_chip { 215enum radeon_dvo_chip {
@@ -241,8 +235,11 @@ struct radeon_mode_info {
241 struct drm_property *tmds_pll_property; 235 struct drm_property *tmds_pll_property;
242 /* underscan */ 236 /* underscan */
243 struct drm_property *underscan_property; 237 struct drm_property *underscan_property;
238 struct drm_property *underscan_hborder_property;
239 struct drm_property *underscan_vborder_property;
244 /* hardcoded DFP edid from BIOS */ 240 /* hardcoded DFP edid from BIOS */
245 struct edid *bios_hardcoded_edid; 241 struct edid *bios_hardcoded_edid;
242 int bios_hardcoded_edid_size;
246 243
247 /* pointer to fbdev info structure */ 244 /* pointer to fbdev info structure */
248 struct radeon_fbdev *rfbdev; 245 struct radeon_fbdev *rfbdev;
@@ -283,6 +280,9 @@ struct radeon_crtc {
283 fixed20_12 hsc; 280 fixed20_12 hsc;
284 struct drm_display_mode native_mode; 281 struct drm_display_mode native_mode;
285 int pll_id; 282 int pll_id;
283 /* page flipping */
284 struct radeon_unpin_work *unpin_work;
285 int deferred_flip_completion;
286}; 286};
287 287
288struct radeon_encoder_primary_dac { 288struct radeon_encoder_primary_dac {
@@ -303,6 +303,9 @@ struct radeon_encoder_lvds {
303 uint32_t lvds_gen_cntl; 303 uint32_t lvds_gen_cntl;
304 /* panel mode */ 304 /* panel mode */
305 struct drm_display_mode native_mode; 305 struct drm_display_mode native_mode;
306 struct backlight_device *bl_dev;
307 int dpms_mode;
308 uint8_t backlight_level;
306}; 309};
307 310
308struct radeon_encoder_tv_dac { 311struct radeon_encoder_tv_dac {
@@ -336,24 +339,29 @@ struct radeon_encoder_ext_tmds {
336struct radeon_atom_ss { 339struct radeon_atom_ss {
337 uint16_t percentage; 340 uint16_t percentage;
338 uint8_t type; 341 uint8_t type;
339 uint8_t step; 342 uint16_t step;
340 uint8_t delay; 343 uint8_t delay;
341 uint8_t range; 344 uint8_t range;
342 uint8_t refdiv; 345 uint8_t refdiv;
346 /* asic_ss */
347 uint16_t rate;
348 uint16_t amount;
343}; 349};
344 350
345struct radeon_encoder_atom_dig { 351struct radeon_encoder_atom_dig {
346 bool linkb; 352 bool linkb;
347 /* atom dig */ 353 /* atom dig */
348 bool coherent_mode; 354 bool coherent_mode;
349 int dig_encoder; /* -1 disabled, 0 DIGA, 1 DIGB */ 355 int dig_encoder; /* -1 disabled, 0 DIGA, 1 DIGB, etc. */
350 /* atom lvds */ 356 /* atom lvds/edp */
351 uint32_t lvds_misc; 357 uint32_t lcd_misc;
352 uint16_t panel_pwr_delay; 358 uint16_t panel_pwr_delay;
353 enum radeon_pll_algo pll_algo; 359 uint32_t lcd_ss_id;
354 struct radeon_atom_ss *ss;
355 /* panel mode */ 360 /* panel mode */
356 struct drm_display_mode native_mode; 361 struct drm_display_mode native_mode;
362 struct backlight_device *bl_dev;
363 int dpms_mode;
364 uint8_t backlight_level;
357}; 365};
358 366
359struct radeon_encoder_atom_dac { 367struct radeon_encoder_atom_dac {
@@ -370,6 +378,8 @@ struct radeon_encoder {
370 uint32_t pixel_clock; 378 uint32_t pixel_clock;
371 enum radeon_rmx_type rmx_type; 379 enum radeon_rmx_type rmx_type;
372 enum radeon_underscan_type underscan_type; 380 enum radeon_underscan_type underscan_type;
381 uint32_t underscan_hborder;
382 uint32_t underscan_vborder;
373 struct drm_display_mode native_mode; 383 struct drm_display_mode native_mode;
374 void *enc_priv; 384 void *enc_priv;
375 int audio_polling_active; 385 int audio_polling_active;
@@ -377,6 +387,8 @@ struct radeon_encoder {
377 int hdmi_config_offset; 387 int hdmi_config_offset;
378 int hdmi_audio_workaround; 388 int hdmi_audio_workaround;
379 int hdmi_buffer_status; 389 int hdmi_buffer_status;
390 bool is_ext_encoder;
391 u16 caps;
380}; 392};
381 393
382struct radeon_connector_atom_dig { 394struct radeon_connector_atom_dig {
@@ -387,6 +399,7 @@ struct radeon_connector_atom_dig {
387 u8 dp_sink_type; 399 u8 dp_sink_type;
388 int dp_clock; 400 int dp_clock;
389 int dp_lane_count; 401 int dp_lane_count;
402 bool edp_on;
390}; 403};
391 404
392struct radeon_gpio_rec { 405struct radeon_gpio_rec {
@@ -403,13 +416,19 @@ struct radeon_hpd {
403}; 416};
404 417
405struct radeon_router { 418struct radeon_router {
406 bool valid;
407 u32 router_id; 419 u32 router_id;
408 struct radeon_i2c_bus_rec i2c_info; 420 struct radeon_i2c_bus_rec i2c_info;
409 u8 i2c_addr; 421 u8 i2c_addr;
410 u8 mux_type; 422 /* i2c mux */
411 u8 mux_control_pin; 423 bool ddc_valid;
412 u8 mux_state; 424 u8 ddc_mux_type;
425 u8 ddc_mux_control_pin;
426 u8 ddc_mux_state;
427 /* clock/data mux */
428 bool cd_valid;
429 u8 cd_mux_type;
430 u8 cd_mux_control_pin;
431 u8 cd_mux_state;
413}; 432};
414 433
415struct radeon_connector { 434struct radeon_connector {
@@ -436,6 +455,7 @@ struct radeon_framebuffer {
436 struct drm_gem_object *obj; 455 struct drm_gem_object *obj;
437}; 456};
438 457
458
439extern enum radeon_tv_std 459extern enum radeon_tv_std
440radeon_combios_get_tv_info(struct radeon_device *rdev); 460radeon_combios_get_tv_info(struct radeon_device *rdev);
441extern enum radeon_tv_std 461extern enum radeon_tv_std
@@ -444,22 +464,29 @@ radeon_atombios_get_tv_info(struct radeon_device *rdev);
444extern struct drm_connector * 464extern struct drm_connector *
445radeon_get_connector_for_encoder(struct drm_encoder *encoder); 465radeon_get_connector_for_encoder(struct drm_encoder *encoder);
446 466
467extern bool radeon_encoder_is_dp_bridge(struct drm_encoder *encoder);
468extern bool radeon_connector_encoder_is_dp_bridge(struct drm_connector *connector);
469extern bool radeon_connector_encoder_is_hbr2(struct drm_connector *connector);
470extern bool radeon_connector_is_dp12_capable(struct drm_connector *connector);
471
447extern void radeon_connector_hotplug(struct drm_connector *connector); 472extern void radeon_connector_hotplug(struct drm_connector *connector);
448extern bool radeon_dp_needs_link_train(struct radeon_connector *radeon_connector); 473extern int radeon_dp_mode_valid_helper(struct drm_connector *connector,
449extern int radeon_dp_mode_valid_helper(struct radeon_connector *radeon_connector,
450 struct drm_display_mode *mode); 474 struct drm_display_mode *mode);
451extern void radeon_dp_set_link_config(struct drm_connector *connector, 475extern void radeon_dp_set_link_config(struct drm_connector *connector,
452 struct drm_display_mode *mode); 476 struct drm_display_mode *mode);
453extern void dp_link_train(struct drm_encoder *encoder, 477extern void radeon_dp_link_train(struct drm_encoder *encoder,
454 struct drm_connector *connector); 478 struct drm_connector *connector);
455extern u8 radeon_dp_getsinktype(struct radeon_connector *radeon_connector); 479extern u8 radeon_dp_getsinktype(struct radeon_connector *radeon_connector);
456extern bool radeon_dp_getdpcd(struct radeon_connector *radeon_connector); 480extern bool radeon_dp_getdpcd(struct radeon_connector *radeon_connector);
457extern void atombios_dig_encoder_setup(struct drm_encoder *encoder, int action); 481extern void atombios_dig_encoder_setup(struct drm_encoder *encoder, int action, int panel_mode);
482extern void radeon_atom_encoder_init(struct radeon_device *rdev);
458extern void atombios_dig_transmitter_setup(struct drm_encoder *encoder, 483extern void atombios_dig_transmitter_setup(struct drm_encoder *encoder,
459 int action, uint8_t lane_num, 484 int action, uint8_t lane_num,
460 uint8_t lane_set); 485 uint8_t lane_set);
486extern void radeon_atom_ext_encoder_setup_ddc(struct drm_encoder *encoder);
487extern struct drm_encoder *radeon_atom_get_external_encoder(struct drm_encoder *encoder);
461extern int radeon_dp_i2c_aux_ch(struct i2c_adapter *adapter, int mode, 488extern int radeon_dp_i2c_aux_ch(struct i2c_adapter *adapter, int mode,
462 uint8_t write_byte, uint8_t *read_byte); 489 u8 write_byte, u8 *read_byte);
463 490
464extern void radeon_i2c_init(struct radeon_device *rdev); 491extern void radeon_i2c_init(struct radeon_device *rdev);
465extern void radeon_i2c_fini(struct radeon_device *rdev); 492extern void radeon_i2c_fini(struct radeon_device *rdev);
@@ -485,19 +512,35 @@ extern void radeon_i2c_put_byte(struct radeon_i2c_chan *i2c,
485 u8 slave_addr, 512 u8 slave_addr,
486 u8 addr, 513 u8 addr,
487 u8 val); 514 u8 val);
488extern void radeon_router_select_port(struct radeon_connector *radeon_connector); 515extern void radeon_router_select_ddc_port(struct radeon_connector *radeon_connector);
516extern void radeon_router_select_cd_port(struct radeon_connector *radeon_connector);
489extern bool radeon_ddc_probe(struct radeon_connector *radeon_connector); 517extern bool radeon_ddc_probe(struct radeon_connector *radeon_connector);
490extern int radeon_ddc_get_modes(struct radeon_connector *radeon_connector); 518extern int radeon_ddc_get_modes(struct radeon_connector *radeon_connector);
491 519
492extern struct drm_encoder *radeon_best_encoder(struct drm_connector *connector); 520extern struct drm_encoder *radeon_best_encoder(struct drm_connector *connector);
493 521
494extern void radeon_compute_pll(struct radeon_pll *pll, 522extern bool radeon_atombios_get_ppll_ss_info(struct radeon_device *rdev,
495 uint64_t freq, 523 struct radeon_atom_ss *ss,
496 uint32_t *dot_clock_p, 524 int id);
497 uint32_t *fb_div_p, 525extern bool radeon_atombios_get_asic_ss_info(struct radeon_device *rdev,
498 uint32_t *frac_fb_div_p, 526 struct radeon_atom_ss *ss,
499 uint32_t *ref_div_p, 527 int id, u32 clock);
500 uint32_t *post_div_p); 528
529extern void radeon_compute_pll_legacy(struct radeon_pll *pll,
530 uint64_t freq,
531 uint32_t *dot_clock_p,
532 uint32_t *fb_div_p,
533 uint32_t *frac_fb_div_p,
534 uint32_t *ref_div_p,
535 uint32_t *post_div_p);
536
537extern void radeon_compute_pll_avivo(struct radeon_pll *pll,
538 u32 freq,
539 u32 *dot_clock_p,
540 u32 *fb_div_p,
541 u32 *frac_fb_div_p,
542 u32 *ref_div_p,
543 u32 *post_div_p);
501 544
502extern void radeon_setup_encoder_clones(struct drm_device *dev); 545extern void radeon_setup_encoder_clones(struct drm_device *dev);
503 546
@@ -506,14 +549,19 @@ struct drm_encoder *radeon_encoder_legacy_primary_dac_add(struct drm_device *dev
506struct drm_encoder *radeon_encoder_legacy_tv_dac_add(struct drm_device *dev, int bios_index, int with_tv); 549struct drm_encoder *radeon_encoder_legacy_tv_dac_add(struct drm_device *dev, int bios_index, int with_tv);
507struct drm_encoder *radeon_encoder_legacy_tmds_int_add(struct drm_device *dev, int bios_index); 550struct drm_encoder *radeon_encoder_legacy_tmds_int_add(struct drm_device *dev, int bios_index);
508struct drm_encoder *radeon_encoder_legacy_tmds_ext_add(struct drm_device *dev, int bios_index); 551struct drm_encoder *radeon_encoder_legacy_tmds_ext_add(struct drm_device *dev, int bios_index);
509extern void atombios_external_tmds_setup(struct drm_encoder *encoder, int action); 552extern void atombios_dvo_setup(struct drm_encoder *encoder, int action);
510extern void atombios_digital_setup(struct drm_encoder *encoder, int action); 553extern void atombios_digital_setup(struct drm_encoder *encoder, int action);
511extern int atombios_get_encoder_mode(struct drm_encoder *encoder); 554extern int atombios_get_encoder_mode(struct drm_encoder *encoder);
555extern bool atombios_set_edp_panel_power(struct drm_connector *connector, int action);
512extern void radeon_encoder_set_active_device(struct drm_encoder *encoder); 556extern void radeon_encoder_set_active_device(struct drm_encoder *encoder);
513 557
514extern void radeon_crtc_load_lut(struct drm_crtc *crtc); 558extern void radeon_crtc_load_lut(struct drm_crtc *crtc);
515extern int atombios_crtc_set_base(struct drm_crtc *crtc, int x, int y, 559extern int atombios_crtc_set_base(struct drm_crtc *crtc, int x, int y,
516 struct drm_framebuffer *old_fb); 560 struct drm_framebuffer *old_fb);
561extern int atombios_crtc_set_base_atomic(struct drm_crtc *crtc,
562 struct drm_framebuffer *fb,
563 int x, int y,
564 enum mode_set_atomic state);
517extern int atombios_crtc_mode_set(struct drm_crtc *crtc, 565extern int atombios_crtc_mode_set(struct drm_crtc *crtc,
518 struct drm_display_mode *mode, 566 struct drm_display_mode *mode,
519 struct drm_display_mode *adjusted_mode, 567 struct drm_display_mode *adjusted_mode,
@@ -523,7 +571,13 @@ extern void atombios_crtc_dpms(struct drm_crtc *crtc, int mode);
523 571
524extern int radeon_crtc_set_base(struct drm_crtc *crtc, int x, int y, 572extern int radeon_crtc_set_base(struct drm_crtc *crtc, int x, int y,
525 struct drm_framebuffer *old_fb); 573 struct drm_framebuffer *old_fb);
526 574extern int radeon_crtc_set_base_atomic(struct drm_crtc *crtc,
575 struct drm_framebuffer *fb,
576 int x, int y,
577 enum mode_set_atomic state);
578extern int radeon_crtc_do_set_base(struct drm_crtc *crtc,
579 struct drm_framebuffer *fb,
580 int x, int y, int atomic);
527extern int radeon_crtc_cursor_set(struct drm_crtc *crtc, 581extern int radeon_crtc_cursor_set(struct drm_crtc *crtc,
528 struct drm_file *file_priv, 582 struct drm_file *file_priv,
529 uint32_t handle, 583 uint32_t handle,
@@ -532,9 +586,12 @@ extern int radeon_crtc_cursor_set(struct drm_crtc *crtc,
532extern int radeon_crtc_cursor_move(struct drm_crtc *crtc, 586extern int radeon_crtc_cursor_move(struct drm_crtc *crtc,
533 int x, int y); 587 int x, int y);
534 588
589extern int radeon_get_crtc_scanoutpos(struct drm_device *dev, int crtc,
590 int *vpos, int *hpos);
591
535extern bool radeon_combios_check_hardcoded_edid(struct radeon_device *rdev); 592extern bool radeon_combios_check_hardcoded_edid(struct radeon_device *rdev);
536extern struct edid * 593extern struct edid *
537radeon_combios_get_hardcoded_edid(struct radeon_device *rdev); 594radeon_bios_get_hardcoded_edid(struct radeon_device *rdev);
538extern bool radeon_atom_get_clock_info(struct drm_device *dev); 595extern bool radeon_atom_get_clock_info(struct drm_device *dev);
539extern bool radeon_combios_get_clock_info(struct drm_device *dev); 596extern bool radeon_combios_get_clock_info(struct drm_device *dev);
540extern struct radeon_encoder_atom_dig * 597extern struct radeon_encoder_atom_dig *
@@ -630,4 +687,8 @@ int radeon_fbdev_total_size(struct radeon_device *rdev);
630bool radeon_fbdev_robj_is_fb(struct radeon_device *rdev, struct radeon_bo *robj); 687bool radeon_fbdev_robj_is_fb(struct radeon_device *rdev, struct radeon_bo *robj);
631 688
632void radeon_fb_output_poll_changed(struct radeon_device *rdev); 689void radeon_fb_output_poll_changed(struct radeon_device *rdev);
690
691void radeon_crtc_handle_flip(struct radeon_device *rdev, int crtc_id);
692
693int radeon_align_pitch(struct radeon_device *rdev, int width, int bpp, bool tiled);
633#endif 694#endif
diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c
index b3b5306bb578..976c3b1b1b6e 100644
--- a/drivers/gpu/drm/radeon/radeon_object.c
+++ b/drivers/gpu/drm/radeon/radeon_object.c
@@ -34,6 +34,7 @@
34#include <drm/drmP.h> 34#include <drm/drmP.h>
35#include "radeon_drm.h" 35#include "radeon_drm.h"
36#include "radeon.h" 36#include "radeon.h"
37#include "radeon_trace.h"
37 38
38 39
39int radeon_ttm_init(struct radeon_device *rdev); 40int radeon_ttm_init(struct radeon_device *rdev);
@@ -54,6 +55,7 @@ static void radeon_ttm_bo_destroy(struct ttm_buffer_object *tbo)
54 list_del_init(&bo->list); 55 list_del_init(&bo->list);
55 mutex_unlock(&bo->rdev->gem.mutex); 56 mutex_unlock(&bo->rdev->gem.mutex);
56 radeon_bo_clear_surface_reg(bo); 57 radeon_bo_clear_surface_reg(bo);
58 drm_gem_object_release(&bo->gem_base);
57 kfree(bo); 59 kfree(bo);
58} 60}
59 61
@@ -69,7 +71,7 @@ void radeon_ttm_placement_from_domain(struct radeon_bo *rbo, u32 domain)
69 u32 c = 0; 71 u32 c = 0;
70 72
71 rbo->placement.fpfn = 0; 73 rbo->placement.fpfn = 0;
72 rbo->placement.lpfn = rbo->rdev->mc.active_vram_size >> PAGE_SHIFT; 74 rbo->placement.lpfn = 0;
73 rbo->placement.placement = rbo->placements; 75 rbo->placement.placement = rbo->placements;
74 rbo->placement.busy_placement = rbo->placements; 76 rbo->placement.busy_placement = rbo->placements;
75 if (domain & RADEON_GEM_DOMAIN_VRAM) 77 if (domain & RADEON_GEM_DOMAIN_VRAM)
@@ -85,14 +87,18 @@ void radeon_ttm_placement_from_domain(struct radeon_bo *rbo, u32 domain)
85 rbo->placement.num_busy_placement = c; 87 rbo->placement.num_busy_placement = c;
86} 88}
87 89
88int radeon_bo_create(struct radeon_device *rdev, struct drm_gem_object *gobj, 90int radeon_bo_create(struct radeon_device *rdev,
89 unsigned long size, bool kernel, u32 domain, 91 unsigned long size, int byte_align, bool kernel, u32 domain,
90 struct radeon_bo **bo_ptr) 92 struct radeon_bo **bo_ptr)
91{ 93{
92 struct radeon_bo *bo; 94 struct radeon_bo *bo;
93 enum ttm_bo_type type; 95 enum ttm_bo_type type;
96 unsigned long page_align = roundup(byte_align, PAGE_SIZE) >> PAGE_SHIFT;
97 unsigned long max_size = 0;
94 int r; 98 int r;
95 99
100 size = ALIGN(size, PAGE_SIZE);
101
96 if (unlikely(rdev->mman.bdev.dev_mapping == NULL)) { 102 if (unlikely(rdev->mman.bdev.dev_mapping == NULL)) {
97 rdev->mman.bdev.dev_mapping = rdev->ddev->dev_mapping; 103 rdev->mman.bdev.dev_mapping = rdev->ddev->dev_mapping;
98 } 104 }
@@ -102,20 +108,33 @@ int radeon_bo_create(struct radeon_device *rdev, struct drm_gem_object *gobj,
102 type = ttm_bo_type_device; 108 type = ttm_bo_type_device;
103 } 109 }
104 *bo_ptr = NULL; 110 *bo_ptr = NULL;
111
112 /* maximun bo size is the minimun btw visible vram and gtt size */
113 max_size = min(rdev->mc.visible_vram_size, rdev->mc.gtt_size);
114 if ((page_align << PAGE_SHIFT) >= max_size) {
115 printk(KERN_WARNING "%s:%d alloc size %ldM bigger than %ldMb limit\n",
116 __func__, __LINE__, page_align >> (20 - PAGE_SHIFT), max_size >> 20);
117 return -ENOMEM;
118 }
119
120retry:
105 bo = kzalloc(sizeof(struct radeon_bo), GFP_KERNEL); 121 bo = kzalloc(sizeof(struct radeon_bo), GFP_KERNEL);
106 if (bo == NULL) 122 if (bo == NULL)
107 return -ENOMEM; 123 return -ENOMEM;
124 r = drm_gem_object_init(rdev->ddev, &bo->gem_base, size);
125 if (unlikely(r)) {
126 kfree(bo);
127 return r;
128 }
108 bo->rdev = rdev; 129 bo->rdev = rdev;
109 bo->gobj = gobj; 130 bo->gem_base.driver_private = NULL;
110 bo->surface_reg = -1; 131 bo->surface_reg = -1;
111 INIT_LIST_HEAD(&bo->list); 132 INIT_LIST_HEAD(&bo->list);
112
113retry:
114 radeon_ttm_placement_from_domain(bo, domain); 133 radeon_ttm_placement_from_domain(bo, domain);
115 /* Kernel allocation are uninterruptible */ 134 /* Kernel allocation are uninterruptible */
116 mutex_lock(&rdev->vram_mutex); 135 mutex_lock(&rdev->vram_mutex);
117 r = ttm_bo_init(&rdev->mman.bdev, &bo->tbo, size, type, 136 r = ttm_bo_init(&rdev->mman.bdev, &bo->tbo, size, type,
118 &bo->placement, 0, 0, !kernel, NULL, size, 137 &bo->placement, page_align, 0, !kernel, NULL, size,
119 &radeon_ttm_bo_destroy); 138 &radeon_ttm_bo_destroy);
120 mutex_unlock(&rdev->vram_mutex); 139 mutex_unlock(&rdev->vram_mutex);
121 if (unlikely(r != 0)) { 140 if (unlikely(r != 0)) {
@@ -131,11 +150,9 @@ retry:
131 return r; 150 return r;
132 } 151 }
133 *bo_ptr = bo; 152 *bo_ptr = bo;
134 if (gobj) { 153
135 mutex_lock(&bo->rdev->gem.mutex); 154 trace_radeon_bo_create(bo);
136 list_add_tail(&bo->list, &rdev->gem.objects); 155
137 mutex_unlock(&bo->rdev->gem.mutex);
138 }
139 return 0; 156 return 0;
140} 157}
141 158
@@ -248,7 +265,6 @@ int radeon_bo_evict_vram(struct radeon_device *rdev)
248void radeon_bo_force_delete(struct radeon_device *rdev) 265void radeon_bo_force_delete(struct radeon_device *rdev)
249{ 266{
250 struct radeon_bo *bo, *n; 267 struct radeon_bo *bo, *n;
251 struct drm_gem_object *gobj;
252 268
253 if (list_empty(&rdev->gem.objects)) { 269 if (list_empty(&rdev->gem.objects)) {
254 return; 270 return;
@@ -256,16 +272,14 @@ void radeon_bo_force_delete(struct radeon_device *rdev)
256 dev_err(rdev->dev, "Userspace still has active objects !\n"); 272 dev_err(rdev->dev, "Userspace still has active objects !\n");
257 list_for_each_entry_safe(bo, n, &rdev->gem.objects, list) { 273 list_for_each_entry_safe(bo, n, &rdev->gem.objects, list) {
258 mutex_lock(&rdev->ddev->struct_mutex); 274 mutex_lock(&rdev->ddev->struct_mutex);
259 gobj = bo->gobj;
260 dev_err(rdev->dev, "%p %p %lu %lu force free\n", 275 dev_err(rdev->dev, "%p %p %lu %lu force free\n",
261 gobj, bo, (unsigned long)gobj->size, 276 &bo->gem_base, bo, (unsigned long)bo->gem_base.size,
262 *((unsigned long *)&gobj->refcount)); 277 *((unsigned long *)&bo->gem_base.refcount));
263 mutex_lock(&bo->rdev->gem.mutex); 278 mutex_lock(&bo->rdev->gem.mutex);
264 list_del_init(&bo->list); 279 list_del_init(&bo->list);
265 mutex_unlock(&bo->rdev->gem.mutex); 280 mutex_unlock(&bo->rdev->gem.mutex);
266 radeon_bo_unref(&bo); 281 /* this should unref the ttm bo */
267 gobj->driver_private = NULL; 282 drm_gem_object_unreference(&bo->gem_base);
268 drm_gem_object_unreference(gobj);
269 mutex_unlock(&rdev->ddev->struct_mutex); 283 mutex_unlock(&rdev->ddev->struct_mutex);
270 } 284 }
271} 285}
@@ -292,34 +306,9 @@ void radeon_bo_list_add_object(struct radeon_bo_list *lobj,
292 struct list_head *head) 306 struct list_head *head)
293{ 307{
294 if (lobj->wdomain) { 308 if (lobj->wdomain) {
295 list_add(&lobj->list, head); 309 list_add(&lobj->tv.head, head);
296 } else { 310 } else {
297 list_add_tail(&lobj->list, head); 311 list_add_tail(&lobj->tv.head, head);
298 }
299}
300
301int radeon_bo_list_reserve(struct list_head *head)
302{
303 struct radeon_bo_list *lobj;
304 int r;
305
306 list_for_each_entry(lobj, head, list){
307 r = radeon_bo_reserve(lobj->bo, false);
308 if (unlikely(r != 0))
309 return r;
310 lobj->reserved = true;
311 }
312 return 0;
313}
314
315void radeon_bo_list_unreserve(struct list_head *head)
316{
317 struct radeon_bo_list *lobj;
318
319 list_for_each_entry(lobj, head, list) {
320 /* only unreserve object we successfully reserved */
321 if (lobj->reserved && radeon_bo_is_reserved(lobj->bo))
322 radeon_bo_unreserve(lobj->bo);
323 } 312 }
324} 313}
325 314
@@ -330,14 +319,11 @@ int radeon_bo_list_validate(struct list_head *head)
330 u32 domain; 319 u32 domain;
331 int r; 320 int r;
332 321
333 list_for_each_entry(lobj, head, list) { 322 r = ttm_eu_reserve_buffers(head);
334 lobj->reserved = false;
335 }
336 r = radeon_bo_list_reserve(head);
337 if (unlikely(r != 0)) { 323 if (unlikely(r != 0)) {
338 return r; 324 return r;
339 } 325 }
340 list_for_each_entry(lobj, head, list) { 326 list_for_each_entry(lobj, head, tv.head) {
341 bo = lobj->bo; 327 bo = lobj->bo;
342 if (!bo->pin_count) { 328 if (!bo->pin_count) {
343 domain = lobj->wdomain ? lobj->wdomain : lobj->rdomain; 329 domain = lobj->wdomain ? lobj->wdomain : lobj->rdomain;
@@ -360,25 +346,6 @@ int radeon_bo_list_validate(struct list_head *head)
360 return 0; 346 return 0;
361} 347}
362 348
363void radeon_bo_list_fence(struct list_head *head, void *fence)
364{
365 struct radeon_bo_list *lobj;
366 struct radeon_bo *bo;
367 struct radeon_fence *old_fence = NULL;
368
369 list_for_each_entry(lobj, head, list) {
370 bo = lobj->bo;
371 spin_lock(&bo->tbo.lock);
372 old_fence = (struct radeon_fence *)bo->tbo.sync_obj;
373 bo->tbo.sync_obj = radeon_fence_ref(fence);
374 bo->tbo.sync_obj_arg = NULL;
375 spin_unlock(&bo->tbo.lock);
376 if (old_fence) {
377 radeon_fence_unref(&old_fence);
378 }
379 }
380}
381
382int radeon_bo_fbdev_mmap(struct radeon_bo *bo, 349int radeon_bo_fbdev_mmap(struct radeon_bo *bo,
383 struct vm_area_struct *vma) 350 struct vm_area_struct *vma)
384{ 351{
@@ -435,7 +402,7 @@ int radeon_bo_get_surface_reg(struct radeon_bo *bo)
435 402
436out: 403out:
437 radeon_set_surface_reg(rdev, i, bo->tiling_flags, bo->pitch, 404 radeon_set_surface_reg(rdev, i, bo->tiling_flags, bo->pitch,
438 bo->tbo.mem.mm_node->start << PAGE_SHIFT, 405 bo->tbo.mem.start << PAGE_SHIFT,
439 bo->tbo.num_pages << PAGE_SHIFT); 406 bo->tbo.num_pages << PAGE_SHIFT);
440 return 0; 407 return 0;
441} 408}
@@ -532,7 +499,7 @@ int radeon_bo_fault_reserve_notify(struct ttm_buffer_object *bo)
532 rdev = rbo->rdev; 499 rdev = rbo->rdev;
533 if (bo->mem.mem_type == TTM_PL_VRAM) { 500 if (bo->mem.mem_type == TTM_PL_VRAM) {
534 size = bo->mem.num_pages << PAGE_SHIFT; 501 size = bo->mem.num_pages << PAGE_SHIFT;
535 offset = bo->mem.mm_node->start << PAGE_SHIFT; 502 offset = bo->mem.start << PAGE_SHIFT;
536 if ((offset + size) > rdev->mc.visible_vram_size) { 503 if ((offset + size) > rdev->mc.visible_vram_size) {
537 /* hurrah the memory is not visible ! */ 504 /* hurrah the memory is not visible ! */
538 radeon_ttm_placement_from_domain(rbo, RADEON_GEM_DOMAIN_VRAM); 505 radeon_ttm_placement_from_domain(rbo, RADEON_GEM_DOMAIN_VRAM);
@@ -540,7 +507,7 @@ int radeon_bo_fault_reserve_notify(struct ttm_buffer_object *bo)
540 r = ttm_bo_validate(bo, &rbo->placement, false, true, false); 507 r = ttm_bo_validate(bo, &rbo->placement, false, true, false);
541 if (unlikely(r != 0)) 508 if (unlikely(r != 0))
542 return r; 509 return r;
543 offset = bo->mem.mm_node->start << PAGE_SHIFT; 510 offset = bo->mem.start << PAGE_SHIFT;
544 /* this should not happen */ 511 /* this should not happen */
545 if ((offset + size) > rdev->mc.visible_vram_size) 512 if ((offset + size) > rdev->mc.visible_vram_size)
546 return -EINVAL; 513 return -EINVAL;
diff --git a/drivers/gpu/drm/radeon/radeon_object.h b/drivers/gpu/drm/radeon/radeon_object.h
index 3481bc7f6f58..ede6c13628f2 100644
--- a/drivers/gpu/drm/radeon/radeon_object.h
+++ b/drivers/gpu/drm/radeon/radeon_object.h
@@ -87,7 +87,7 @@ static inline void radeon_bo_unreserve(struct radeon_bo *bo)
87 * Returns current GPU offset of the object. 87 * Returns current GPU offset of the object.
88 * 88 *
89 * Note: object should either be pinned or reserved when calling this 89 * Note: object should either be pinned or reserved when calling this
90 * function, it might be usefull to add check for this for debugging. 90 * function, it might be useful to add check for this for debugging.
91 */ 91 */
92static inline u64 radeon_bo_gpu_offset(struct radeon_bo *bo) 92static inline u64 radeon_bo_gpu_offset(struct radeon_bo *bo)
93{ 93{
@@ -126,18 +126,18 @@ static inline int radeon_bo_wait(struct radeon_bo *bo, u32 *mem_type,
126 r = ttm_bo_reserve(&bo->tbo, true, no_wait, false, 0); 126 r = ttm_bo_reserve(&bo->tbo, true, no_wait, false, 0);
127 if (unlikely(r != 0)) 127 if (unlikely(r != 0))
128 return r; 128 return r;
129 spin_lock(&bo->tbo.lock); 129 spin_lock(&bo->tbo.bdev->fence_lock);
130 if (mem_type) 130 if (mem_type)
131 *mem_type = bo->tbo.mem.mem_type; 131 *mem_type = bo->tbo.mem.mem_type;
132 if (bo->tbo.sync_obj) 132 if (bo->tbo.sync_obj)
133 r = ttm_bo_wait(&bo->tbo, true, true, no_wait); 133 r = ttm_bo_wait(&bo->tbo, true, true, no_wait);
134 spin_unlock(&bo->tbo.lock); 134 spin_unlock(&bo->tbo.bdev->fence_lock);
135 ttm_bo_unreserve(&bo->tbo); 135 ttm_bo_unreserve(&bo->tbo);
136 return r; 136 return r;
137} 137}
138 138
139extern int radeon_bo_create(struct radeon_device *rdev, 139extern int radeon_bo_create(struct radeon_device *rdev,
140 struct drm_gem_object *gobj, unsigned long size, 140 unsigned long size, int byte_align,
141 bool kernel, u32 domain, 141 bool kernel, u32 domain,
142 struct radeon_bo **bo_ptr); 142 struct radeon_bo **bo_ptr);
143extern int radeon_bo_kmap(struct radeon_bo *bo, void **ptr); 143extern int radeon_bo_kmap(struct radeon_bo *bo, void **ptr);
@@ -151,10 +151,7 @@ extern int radeon_bo_init(struct radeon_device *rdev);
151extern void radeon_bo_fini(struct radeon_device *rdev); 151extern void radeon_bo_fini(struct radeon_device *rdev);
152extern void radeon_bo_list_add_object(struct radeon_bo_list *lobj, 152extern void radeon_bo_list_add_object(struct radeon_bo_list *lobj,
153 struct list_head *head); 153 struct list_head *head);
154extern int radeon_bo_list_reserve(struct list_head *head);
155extern void radeon_bo_list_unreserve(struct list_head *head);
156extern int radeon_bo_list_validate(struct list_head *head); 154extern int radeon_bo_list_validate(struct list_head *head);
157extern void radeon_bo_list_fence(struct list_head *head, void *fence);
158extern int radeon_bo_fbdev_mmap(struct radeon_bo *bo, 155extern int radeon_bo_fbdev_mmap(struct radeon_bo *bo,
159 struct vm_area_struct *vma); 156 struct vm_area_struct *vma);
160extern int radeon_bo_set_tiling_flags(struct radeon_bo *bo, 157extern int radeon_bo_set_tiling_flags(struct radeon_bo *bo,
diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c
index f87efec76236..aaa19dc418a0 100644
--- a/drivers/gpu/drm/radeon/radeon_pm.c
+++ b/drivers/gpu/drm/radeon/radeon_pm.c
@@ -23,6 +23,7 @@
23#include "drmP.h" 23#include "drmP.h"
24#include "radeon.h" 24#include "radeon.h"
25#include "avivod.h" 25#include "avivod.h"
26#include "atom.h"
26#ifdef CONFIG_ACPI 27#ifdef CONFIG_ACPI
27#include <linux/acpi.h> 28#include <linux/acpi.h>
28#endif 29#endif
@@ -167,13 +168,13 @@ static void radeon_set_power_state(struct radeon_device *rdev)
167 if (radeon_gui_idle(rdev)) { 168 if (radeon_gui_idle(rdev)) {
168 sclk = rdev->pm.power_state[rdev->pm.requested_power_state_index]. 169 sclk = rdev->pm.power_state[rdev->pm.requested_power_state_index].
169 clock_info[rdev->pm.requested_clock_mode_index].sclk; 170 clock_info[rdev->pm.requested_clock_mode_index].sclk;
170 if (sclk > rdev->clock.default_sclk) 171 if (sclk > rdev->pm.default_sclk)
171 sclk = rdev->clock.default_sclk; 172 sclk = rdev->pm.default_sclk;
172 173
173 mclk = rdev->pm.power_state[rdev->pm.requested_power_state_index]. 174 mclk = rdev->pm.power_state[rdev->pm.requested_power_state_index].
174 clock_info[rdev->pm.requested_clock_mode_index].mclk; 175 clock_info[rdev->pm.requested_clock_mode_index].mclk;
175 if (mclk > rdev->clock.default_mclk) 176 if (mclk > rdev->pm.default_mclk)
176 mclk = rdev->clock.default_mclk; 177 mclk = rdev->pm.default_mclk;
177 178
178 /* upvolt before raising clocks, downvolt after lowering clocks */ 179 /* upvolt before raising clocks, downvolt after lowering clocks */
179 if (sclk < rdev->pm.current_sclk) 180 if (sclk < rdev->pm.current_sclk)
@@ -365,12 +366,14 @@ static ssize_t radeon_set_pm_profile(struct device *dev,
365 else if (strncmp("high", buf, strlen("high")) == 0) 366 else if (strncmp("high", buf, strlen("high")) == 0)
366 rdev->pm.profile = PM_PROFILE_HIGH; 367 rdev->pm.profile = PM_PROFILE_HIGH;
367 else { 368 else {
368 DRM_ERROR("invalid power profile!\n"); 369 count = -EINVAL;
369 goto fail; 370 goto fail;
370 } 371 }
371 radeon_pm_update_profile(rdev); 372 radeon_pm_update_profile(rdev);
372 radeon_pm_set_clocks(rdev); 373 radeon_pm_set_clocks(rdev);
373 } 374 } else
375 count = -EINVAL;
376
374fail: 377fail:
375 mutex_unlock(&rdev->pm.mutex); 378 mutex_unlock(&rdev->pm.mutex);
376 379
@@ -405,22 +408,15 @@ static ssize_t radeon_set_pm_method(struct device *dev,
405 rdev->pm.dynpm_planned_action = DYNPM_ACTION_DEFAULT; 408 rdev->pm.dynpm_planned_action = DYNPM_ACTION_DEFAULT;
406 mutex_unlock(&rdev->pm.mutex); 409 mutex_unlock(&rdev->pm.mutex);
407 } else if (strncmp("profile", buf, strlen("profile")) == 0) { 410 } else if (strncmp("profile", buf, strlen("profile")) == 0) {
408 bool flush_wq = false;
409
410 mutex_lock(&rdev->pm.mutex); 411 mutex_lock(&rdev->pm.mutex);
411 if (rdev->pm.pm_method == PM_METHOD_DYNPM) {
412 cancel_delayed_work(&rdev->pm.dynpm_idle_work);
413 flush_wq = true;
414 }
415 /* disable dynpm */ 412 /* disable dynpm */
416 rdev->pm.dynpm_state = DYNPM_STATE_DISABLED; 413 rdev->pm.dynpm_state = DYNPM_STATE_DISABLED;
417 rdev->pm.dynpm_planned_action = DYNPM_ACTION_NONE; 414 rdev->pm.dynpm_planned_action = DYNPM_ACTION_NONE;
418 rdev->pm.pm_method = PM_METHOD_PROFILE; 415 rdev->pm.pm_method = PM_METHOD_PROFILE;
419 mutex_unlock(&rdev->pm.mutex); 416 mutex_unlock(&rdev->pm.mutex);
420 if (flush_wq) 417 cancel_delayed_work_sync(&rdev->pm.dynpm_idle_work);
421 flush_workqueue(rdev->wq);
422 } else { 418 } else {
423 DRM_ERROR("invalid power method!\n"); 419 count = -EINVAL;
424 goto fail; 420 goto fail;
425 } 421 }
426 radeon_pm_compute_clocks(rdev); 422 radeon_pm_compute_clocks(rdev);
@@ -437,7 +433,7 @@ static ssize_t radeon_hwmon_show_temp(struct device *dev,
437{ 433{
438 struct drm_device *ddev = pci_get_drvdata(to_pci_dev(dev)); 434 struct drm_device *ddev = pci_get_drvdata(to_pci_dev(dev));
439 struct radeon_device *rdev = ddev->dev_private; 435 struct radeon_device *rdev = ddev->dev_private;
440 u32 temp; 436 int temp;
441 437
442 switch (rdev->pm.int_thermal_type) { 438 switch (rdev->pm.int_thermal_type) {
443 case THERMAL_TYPE_RV6XX: 439 case THERMAL_TYPE_RV6XX:
@@ -447,8 +443,12 @@ static ssize_t radeon_hwmon_show_temp(struct device *dev,
447 temp = rv770_get_temp(rdev); 443 temp = rv770_get_temp(rdev);
448 break; 444 break;
449 case THERMAL_TYPE_EVERGREEN: 445 case THERMAL_TYPE_EVERGREEN:
446 case THERMAL_TYPE_NI:
450 temp = evergreen_get_temp(rdev); 447 temp = evergreen_get_temp(rdev);
451 break; 448 break;
449 case THERMAL_TYPE_SUMO:
450 temp = sumo_get_temp(rdev);
451 break;
452 default: 452 default:
453 temp = 0; 453 temp = 0;
454 break; 454 break;
@@ -487,6 +487,8 @@ static int radeon_hwmon_init(struct radeon_device *rdev)
487 case THERMAL_TYPE_RV6XX: 487 case THERMAL_TYPE_RV6XX:
488 case THERMAL_TYPE_RV770: 488 case THERMAL_TYPE_RV770:
489 case THERMAL_TYPE_EVERGREEN: 489 case THERMAL_TYPE_EVERGREEN:
490 case THERMAL_TYPE_NI:
491 case THERMAL_TYPE_SUMO:
490 rdev->pm.int_hwmon_dev = hwmon_device_register(rdev->dev); 492 rdev->pm.int_hwmon_dev = hwmon_device_register(rdev->dev);
491 if (IS_ERR(rdev->pm.int_hwmon_dev)) { 493 if (IS_ERR(rdev->pm.int_hwmon_dev)) {
492 err = PTR_ERR(rdev->pm.int_hwmon_dev); 494 err = PTR_ERR(rdev->pm.int_hwmon_dev);
@@ -520,34 +522,44 @@ static void radeon_hwmon_fini(struct radeon_device *rdev)
520 522
521void radeon_pm_suspend(struct radeon_device *rdev) 523void radeon_pm_suspend(struct radeon_device *rdev)
522{ 524{
523 bool flush_wq = false;
524
525 mutex_lock(&rdev->pm.mutex); 525 mutex_lock(&rdev->pm.mutex);
526 if (rdev->pm.pm_method == PM_METHOD_DYNPM) { 526 if (rdev->pm.pm_method == PM_METHOD_DYNPM) {
527 cancel_delayed_work(&rdev->pm.dynpm_idle_work);
528 if (rdev->pm.dynpm_state == DYNPM_STATE_ACTIVE) 527 if (rdev->pm.dynpm_state == DYNPM_STATE_ACTIVE)
529 rdev->pm.dynpm_state = DYNPM_STATE_SUSPENDED; 528 rdev->pm.dynpm_state = DYNPM_STATE_SUSPENDED;
530 flush_wq = true;
531 } 529 }
532 mutex_unlock(&rdev->pm.mutex); 530 mutex_unlock(&rdev->pm.mutex);
533 if (flush_wq) 531
534 flush_workqueue(rdev->wq); 532 cancel_delayed_work_sync(&rdev->pm.dynpm_idle_work);
535} 533}
536 534
537void radeon_pm_resume(struct radeon_device *rdev) 535void radeon_pm_resume(struct radeon_device *rdev)
538{ 536{
537 /* set up the default clocks if the MC ucode is loaded */
538 if (ASIC_IS_DCE5(rdev) && rdev->mc_fw) {
539 if (rdev->pm.default_vddc)
540 radeon_atom_set_voltage(rdev, rdev->pm.default_vddc,
541 SET_VOLTAGE_TYPE_ASIC_VDDC);
542 if (rdev->pm.default_vddci)
543 radeon_atom_set_voltage(rdev, rdev->pm.default_vddci,
544 SET_VOLTAGE_TYPE_ASIC_VDDCI);
545 if (rdev->pm.default_sclk)
546 radeon_set_engine_clock(rdev, rdev->pm.default_sclk);
547 if (rdev->pm.default_mclk)
548 radeon_set_memory_clock(rdev, rdev->pm.default_mclk);
549 }
539 /* asic init will reset the default power state */ 550 /* asic init will reset the default power state */
540 mutex_lock(&rdev->pm.mutex); 551 mutex_lock(&rdev->pm.mutex);
541 rdev->pm.current_power_state_index = rdev->pm.default_power_state_index; 552 rdev->pm.current_power_state_index = rdev->pm.default_power_state_index;
542 rdev->pm.current_clock_mode_index = 0; 553 rdev->pm.current_clock_mode_index = 0;
543 rdev->pm.current_sclk = rdev->clock.default_sclk; 554 rdev->pm.current_sclk = rdev->pm.default_sclk;
544 rdev->pm.current_mclk = rdev->clock.default_mclk; 555 rdev->pm.current_mclk = rdev->pm.default_mclk;
545 rdev->pm.current_vddc = rdev->pm.power_state[rdev->pm.default_power_state_index].clock_info[0].voltage.voltage; 556 rdev->pm.current_vddc = rdev->pm.power_state[rdev->pm.default_power_state_index].clock_info[0].voltage.voltage;
557 rdev->pm.current_vddci = rdev->pm.power_state[rdev->pm.default_power_state_index].clock_info[0].voltage.vddci;
546 if (rdev->pm.pm_method == PM_METHOD_DYNPM 558 if (rdev->pm.pm_method == PM_METHOD_DYNPM
547 && rdev->pm.dynpm_state == DYNPM_STATE_SUSPENDED) { 559 && rdev->pm.dynpm_state == DYNPM_STATE_SUSPENDED) {
548 rdev->pm.dynpm_state = DYNPM_STATE_ACTIVE; 560 rdev->pm.dynpm_state = DYNPM_STATE_ACTIVE;
549 queue_delayed_work(rdev->wq, &rdev->pm.dynpm_idle_work, 561 schedule_delayed_work(&rdev->pm.dynpm_idle_work,
550 msecs_to_jiffies(RADEON_IDLE_LOOP_MS)); 562 msecs_to_jiffies(RADEON_IDLE_LOOP_MS));
551 } 563 }
552 mutex_unlock(&rdev->pm.mutex); 564 mutex_unlock(&rdev->pm.mutex);
553 radeon_pm_compute_clocks(rdev); 565 radeon_pm_compute_clocks(rdev);
@@ -564,6 +576,8 @@ int radeon_pm_init(struct radeon_device *rdev)
564 rdev->pm.dynpm_planned_action = DYNPM_ACTION_NONE; 576 rdev->pm.dynpm_planned_action = DYNPM_ACTION_NONE;
565 rdev->pm.dynpm_can_upclock = true; 577 rdev->pm.dynpm_can_upclock = true;
566 rdev->pm.dynpm_can_downclock = true; 578 rdev->pm.dynpm_can_downclock = true;
579 rdev->pm.default_sclk = rdev->clock.default_sclk;
580 rdev->pm.default_mclk = rdev->clock.default_mclk;
567 rdev->pm.current_sclk = rdev->clock.default_sclk; 581 rdev->pm.current_sclk = rdev->clock.default_sclk;
568 rdev->pm.current_mclk = rdev->clock.default_mclk; 582 rdev->pm.current_mclk = rdev->clock.default_mclk;
569 rdev->pm.int_thermal_type = THERMAL_TYPE_NONE; 583 rdev->pm.int_thermal_type = THERMAL_TYPE_NONE;
@@ -575,12 +589,25 @@ int radeon_pm_init(struct radeon_device *rdev)
575 radeon_combios_get_power_modes(rdev); 589 radeon_combios_get_power_modes(rdev);
576 radeon_pm_print_states(rdev); 590 radeon_pm_print_states(rdev);
577 radeon_pm_init_profile(rdev); 591 radeon_pm_init_profile(rdev);
592 /* set up the default clocks if the MC ucode is loaded */
593 if (ASIC_IS_DCE5(rdev) && rdev->mc_fw) {
594 if (rdev->pm.default_vddc)
595 radeon_atom_set_voltage(rdev, rdev->pm.default_vddc,
596 SET_VOLTAGE_TYPE_ASIC_VDDC);
597 if (rdev->pm.default_sclk)
598 radeon_set_engine_clock(rdev, rdev->pm.default_sclk);
599 if (rdev->pm.default_mclk)
600 radeon_set_memory_clock(rdev, rdev->pm.default_mclk);
601 }
578 } 602 }
579 603
580 /* set up the internal thermal sensor if applicable */ 604 /* set up the internal thermal sensor if applicable */
581 ret = radeon_hwmon_init(rdev); 605 ret = radeon_hwmon_init(rdev);
582 if (ret) 606 if (ret)
583 return ret; 607 return ret;
608
609 INIT_DELAYED_WORK(&rdev->pm.dynpm_idle_work, radeon_dynpm_idle_work_handler);
610
584 if (rdev->pm.num_power_states > 1) { 611 if (rdev->pm.num_power_states > 1) {
585 /* where's the best place to put these? */ 612 /* where's the best place to put these? */
586 ret = device_create_file(rdev->dev, &dev_attr_power_profile); 613 ret = device_create_file(rdev->dev, &dev_attr_power_profile);
@@ -594,8 +621,6 @@ int radeon_pm_init(struct radeon_device *rdev)
594 rdev->acpi_nb.notifier_call = radeon_acpi_event; 621 rdev->acpi_nb.notifier_call = radeon_acpi_event;
595 register_acpi_notifier(&rdev->acpi_nb); 622 register_acpi_notifier(&rdev->acpi_nb);
596#endif 623#endif
597 INIT_DELAYED_WORK(&rdev->pm.dynpm_idle_work, radeon_dynpm_idle_work_handler);
598
599 if (radeon_debugfs_pm_init(rdev)) { 624 if (radeon_debugfs_pm_init(rdev)) {
600 DRM_ERROR("Failed to register debugfs file for PM!\n"); 625 DRM_ERROR("Failed to register debugfs file for PM!\n");
601 } 626 }
@@ -609,25 +634,20 @@ int radeon_pm_init(struct radeon_device *rdev)
609void radeon_pm_fini(struct radeon_device *rdev) 634void radeon_pm_fini(struct radeon_device *rdev)
610{ 635{
611 if (rdev->pm.num_power_states > 1) { 636 if (rdev->pm.num_power_states > 1) {
612 bool flush_wq = false;
613
614 mutex_lock(&rdev->pm.mutex); 637 mutex_lock(&rdev->pm.mutex);
615 if (rdev->pm.pm_method == PM_METHOD_PROFILE) { 638 if (rdev->pm.pm_method == PM_METHOD_PROFILE) {
616 rdev->pm.profile = PM_PROFILE_DEFAULT; 639 rdev->pm.profile = PM_PROFILE_DEFAULT;
617 radeon_pm_update_profile(rdev); 640 radeon_pm_update_profile(rdev);
618 radeon_pm_set_clocks(rdev); 641 radeon_pm_set_clocks(rdev);
619 } else if (rdev->pm.pm_method == PM_METHOD_DYNPM) { 642 } else if (rdev->pm.pm_method == PM_METHOD_DYNPM) {
620 /* cancel work */
621 cancel_delayed_work(&rdev->pm.dynpm_idle_work);
622 flush_wq = true;
623 /* reset default clocks */ 643 /* reset default clocks */
624 rdev->pm.dynpm_state = DYNPM_STATE_DISABLED; 644 rdev->pm.dynpm_state = DYNPM_STATE_DISABLED;
625 rdev->pm.dynpm_planned_action = DYNPM_ACTION_DEFAULT; 645 rdev->pm.dynpm_planned_action = DYNPM_ACTION_DEFAULT;
626 radeon_pm_set_clocks(rdev); 646 radeon_pm_set_clocks(rdev);
627 } 647 }
628 mutex_unlock(&rdev->pm.mutex); 648 mutex_unlock(&rdev->pm.mutex);
629 if (flush_wq) 649
630 flush_workqueue(rdev->wq); 650 cancel_delayed_work_sync(&rdev->pm.dynpm_idle_work);
631 651
632 device_remove_file(rdev->dev, &dev_attr_power_profile); 652 device_remove_file(rdev->dev, &dev_attr_power_profile);
633 device_remove_file(rdev->dev, &dev_attr_power_method); 653 device_remove_file(rdev->dev, &dev_attr_power_method);
@@ -636,6 +656,9 @@ void radeon_pm_fini(struct radeon_device *rdev)
636#endif 656#endif
637 } 657 }
638 658
659 if (rdev->pm.power_state)
660 kfree(rdev->pm.power_state);
661
639 radeon_hwmon_fini(rdev); 662 radeon_hwmon_fini(rdev);
640} 663}
641 664
@@ -686,12 +709,12 @@ void radeon_pm_compute_clocks(struct radeon_device *rdev)
686 radeon_pm_get_dynpm_state(rdev); 709 radeon_pm_get_dynpm_state(rdev);
687 radeon_pm_set_clocks(rdev); 710 radeon_pm_set_clocks(rdev);
688 711
689 queue_delayed_work(rdev->wq, &rdev->pm.dynpm_idle_work, 712 schedule_delayed_work(&rdev->pm.dynpm_idle_work,
690 msecs_to_jiffies(RADEON_IDLE_LOOP_MS)); 713 msecs_to_jiffies(RADEON_IDLE_LOOP_MS));
691 } else if (rdev->pm.dynpm_state == DYNPM_STATE_PAUSED) { 714 } else if (rdev->pm.dynpm_state == DYNPM_STATE_PAUSED) {
692 rdev->pm.dynpm_state = DYNPM_STATE_ACTIVE; 715 rdev->pm.dynpm_state = DYNPM_STATE_ACTIVE;
693 queue_delayed_work(rdev->wq, &rdev->pm.dynpm_idle_work, 716 schedule_delayed_work(&rdev->pm.dynpm_idle_work,
694 msecs_to_jiffies(RADEON_IDLE_LOOP_MS)); 717 msecs_to_jiffies(RADEON_IDLE_LOOP_MS));
695 DRM_DEBUG_DRIVER("radeon: dynamic power management activated\n"); 718 DRM_DEBUG_DRIVER("radeon: dynamic power management activated\n");
696 } 719 }
697 } else { /* count == 0 */ 720 } else { /* count == 0 */
@@ -712,73 +735,21 @@ void radeon_pm_compute_clocks(struct radeon_device *rdev)
712 735
713static bool radeon_pm_in_vbl(struct radeon_device *rdev) 736static bool radeon_pm_in_vbl(struct radeon_device *rdev)
714{ 737{
715 u32 stat_crtc = 0, vbl = 0, position = 0; 738 int crtc, vpos, hpos, vbl_status;
716 bool in_vbl = true; 739 bool in_vbl = true;
717 740
718 if (ASIC_IS_DCE4(rdev)) { 741 /* Iterate over all active crtc's. All crtc's must be in vblank,
719 if (rdev->pm.active_crtcs & (1 << 0)) { 742 * otherwise return in_vbl == false.
720 vbl = RREG32(EVERGREEN_CRTC_V_BLANK_START_END + 743 */
721 EVERGREEN_CRTC0_REGISTER_OFFSET) & 0xfff; 744 for (crtc = 0; (crtc < rdev->num_crtc) && in_vbl; crtc++) {
722 position = RREG32(EVERGREEN_CRTC_STATUS_POSITION + 745 if (rdev->pm.active_crtcs & (1 << crtc)) {
723 EVERGREEN_CRTC0_REGISTER_OFFSET) & 0xfff; 746 vbl_status = radeon_get_crtc_scanoutpos(rdev->ddev, crtc, &vpos, &hpos);
724 } 747 if ((vbl_status & DRM_SCANOUTPOS_VALID) &&
725 if (rdev->pm.active_crtcs & (1 << 1)) { 748 !(vbl_status & DRM_SCANOUTPOS_INVBL))
726 vbl = RREG32(EVERGREEN_CRTC_V_BLANK_START_END +
727 EVERGREEN_CRTC1_REGISTER_OFFSET) & 0xfff;
728 position = RREG32(EVERGREEN_CRTC_STATUS_POSITION +
729 EVERGREEN_CRTC1_REGISTER_OFFSET) & 0xfff;
730 }
731 if (rdev->pm.active_crtcs & (1 << 2)) {
732 vbl = RREG32(EVERGREEN_CRTC_V_BLANK_START_END +
733 EVERGREEN_CRTC2_REGISTER_OFFSET) & 0xfff;
734 position = RREG32(EVERGREEN_CRTC_STATUS_POSITION +
735 EVERGREEN_CRTC2_REGISTER_OFFSET) & 0xfff;
736 }
737 if (rdev->pm.active_crtcs & (1 << 3)) {
738 vbl = RREG32(EVERGREEN_CRTC_V_BLANK_START_END +
739 EVERGREEN_CRTC3_REGISTER_OFFSET) & 0xfff;
740 position = RREG32(EVERGREEN_CRTC_STATUS_POSITION +
741 EVERGREEN_CRTC3_REGISTER_OFFSET) & 0xfff;
742 }
743 if (rdev->pm.active_crtcs & (1 << 4)) {
744 vbl = RREG32(EVERGREEN_CRTC_V_BLANK_START_END +
745 EVERGREEN_CRTC4_REGISTER_OFFSET) & 0xfff;
746 position = RREG32(EVERGREEN_CRTC_STATUS_POSITION +
747 EVERGREEN_CRTC4_REGISTER_OFFSET) & 0xfff;
748 }
749 if (rdev->pm.active_crtcs & (1 << 5)) {
750 vbl = RREG32(EVERGREEN_CRTC_V_BLANK_START_END +
751 EVERGREEN_CRTC5_REGISTER_OFFSET) & 0xfff;
752 position = RREG32(EVERGREEN_CRTC_STATUS_POSITION +
753 EVERGREEN_CRTC5_REGISTER_OFFSET) & 0xfff;
754 }
755 } else if (ASIC_IS_AVIVO(rdev)) {
756 if (rdev->pm.active_crtcs & (1 << 0)) {
757 vbl = RREG32(AVIVO_D1CRTC_V_BLANK_START_END) & 0xfff;
758 position = RREG32(AVIVO_D1CRTC_STATUS_POSITION) & 0xfff;
759 }
760 if (rdev->pm.active_crtcs & (1 << 1)) {
761 vbl = RREG32(AVIVO_D2CRTC_V_BLANK_START_END) & 0xfff;
762 position = RREG32(AVIVO_D2CRTC_STATUS_POSITION) & 0xfff;
763 }
764 if (position < vbl && position > 1)
765 in_vbl = false;
766 } else {
767 if (rdev->pm.active_crtcs & (1 << 0)) {
768 stat_crtc = RREG32(RADEON_CRTC_STATUS);
769 if (!(stat_crtc & 1))
770 in_vbl = false;
771 }
772 if (rdev->pm.active_crtcs & (1 << 1)) {
773 stat_crtc = RREG32(RADEON_CRTC2_STATUS);
774 if (!(stat_crtc & 1))
775 in_vbl = false; 749 in_vbl = false;
776 } 750 }
777 } 751 }
778 752
779 if (position < vbl && position > 1)
780 in_vbl = false;
781
782 return in_vbl; 753 return in_vbl;
783} 754}
784 755
@@ -848,8 +819,8 @@ static void radeon_dynpm_idle_work_handler(struct work_struct *work)
848 radeon_pm_set_clocks(rdev); 819 radeon_pm_set_clocks(rdev);
849 } 820 }
850 821
851 queue_delayed_work(rdev->wq, &rdev->pm.dynpm_idle_work, 822 schedule_delayed_work(&rdev->pm.dynpm_idle_work,
852 msecs_to_jiffies(RADEON_IDLE_LOOP_MS)); 823 msecs_to_jiffies(RADEON_IDLE_LOOP_MS));
853 } 824 }
854 mutex_unlock(&rdev->pm.mutex); 825 mutex_unlock(&rdev->pm.mutex);
855 ttm_bo_unlock_delayed_workqueue(&rdev->mman.bdev, resched); 826 ttm_bo_unlock_delayed_workqueue(&rdev->mman.bdev, resched);
@@ -866,9 +837,9 @@ static int radeon_debugfs_pm_info(struct seq_file *m, void *data)
866 struct drm_device *dev = node->minor->dev; 837 struct drm_device *dev = node->minor->dev;
867 struct radeon_device *rdev = dev->dev_private; 838 struct radeon_device *rdev = dev->dev_private;
868 839
869 seq_printf(m, "default engine clock: %u0 kHz\n", rdev->clock.default_sclk); 840 seq_printf(m, "default engine clock: %u0 kHz\n", rdev->pm.default_sclk);
870 seq_printf(m, "current engine clock: %u0 kHz\n", radeon_get_engine_clock(rdev)); 841 seq_printf(m, "current engine clock: %u0 kHz\n", radeon_get_engine_clock(rdev));
871 seq_printf(m, "default memory clock: %u0 kHz\n", rdev->clock.default_mclk); 842 seq_printf(m, "default memory clock: %u0 kHz\n", rdev->pm.default_mclk);
872 if (rdev->asic->get_memory_clock) 843 if (rdev->asic->get_memory_clock)
873 seq_printf(m, "current memory clock: %u0 kHz\n", radeon_get_memory_clock(rdev)); 844 seq_printf(m, "current memory clock: %u0 kHz\n", radeon_get_memory_clock(rdev));
874 if (rdev->pm.current_vddc) 845 if (rdev->pm.current_vddc)
diff --git a/drivers/gpu/drm/radeon/radeon_reg.h b/drivers/gpu/drm/radeon/radeon_reg.h
index c332f46340d5..bc44a3d35ec6 100644
--- a/drivers/gpu/drm/radeon/radeon_reg.h
+++ b/drivers/gpu/drm/radeon/radeon_reg.h
@@ -55,6 +55,7 @@
55#include "r500_reg.h" 55#include "r500_reg.h"
56#include "r600_reg.h" 56#include "r600_reg.h"
57#include "evergreen_reg.h" 57#include "evergreen_reg.h"
58#include "ni_reg.h"
58 59
59#define RADEON_MC_AGP_LOCATION 0x014c 60#define RADEON_MC_AGP_LOCATION 0x014c
60#define RADEON_MC_AGP_START_MASK 0x0000FFFF 61#define RADEON_MC_AGP_START_MASK 0x0000FFFF
@@ -299,6 +300,8 @@
299# define RADEON_BUS_READ_BURST (1 << 30) 300# define RADEON_BUS_READ_BURST (1 << 30)
300#define RADEON_BUS_CNTL1 0x0034 301#define RADEON_BUS_CNTL1 0x0034
301# define RADEON_BUS_WAIT_ON_LOCK_EN (1 << 4) 302# define RADEON_BUS_WAIT_ON_LOCK_EN (1 << 4)
303#define RV370_BUS_CNTL 0x004c
304# define RV370_BUS_BIOS_DIS_ROM (1 << 2)
302/* rv370/rv380, rv410, r423/r430/r480, r5xx */ 305/* rv370/rv380, rv410, r423/r430/r480, r5xx */
303#define RADEON_MSI_REARM_EN 0x0160 306#define RADEON_MSI_REARM_EN 0x0160
304# define RV370_MSI_REARM_EN (1 << 0) 307# define RV370_MSI_REARM_EN (1 << 0)
@@ -320,6 +323,15 @@
320# define RADEON_PCIE_LC_RECONFIG_NOW (1 << 8) 323# define RADEON_PCIE_LC_RECONFIG_NOW (1 << 8)
321# define RADEON_PCIE_LC_RECONFIG_LATER (1 << 9) 324# define RADEON_PCIE_LC_RECONFIG_LATER (1 << 9)
322# define RADEON_PCIE_LC_SHORT_RECONFIG_EN (1 << 10) 325# define RADEON_PCIE_LC_SHORT_RECONFIG_EN (1 << 10)
326# define R600_PCIE_LC_RECONFIG_ARC_MISSING_ESCAPE (1 << 7)
327# define R600_PCIE_LC_RENEGOTIATION_SUPPORT (1 << 9)
328# define R600_PCIE_LC_RENEGOTIATE_EN (1 << 10)
329# define R600_PCIE_LC_SHORT_RECONFIG_EN (1 << 11)
330# define R600_PCIE_LC_UPCONFIGURE_SUPPORT (1 << 12)
331# define R600_PCIE_LC_UPCONFIGURE_DIS (1 << 13)
332
333#define R600_TARGET_AND_CURRENT_PROFILE_INDEX 0x70c
334#define R700_TARGET_AND_CURRENT_PROFILE_INDEX 0x66c
323 335
324#define RADEON_CACHE_CNTL 0x1724 336#define RADEON_CACHE_CNTL 0x1724
325#define RADEON_CACHE_LINE 0x0f0c /* PCI */ 337#define RADEON_CACHE_LINE 0x0f0c /* PCI */
@@ -365,6 +377,8 @@
365#define RADEON_CONFIG_APER_SIZE 0x0108 377#define RADEON_CONFIG_APER_SIZE 0x0108
366#define RADEON_CONFIG_BONDS 0x00e8 378#define RADEON_CONFIG_BONDS 0x00e8
367#define RADEON_CONFIG_CNTL 0x00e0 379#define RADEON_CONFIG_CNTL 0x00e0
380# define RADEON_CFG_VGA_RAM_EN (1 << 8)
381# define RADEON_CFG_VGA_IO_DIS (1 << 9)
368# define RADEON_CFG_ATI_REV_A11 (0 << 16) 382# define RADEON_CFG_ATI_REV_A11 (0 << 16)
369# define RADEON_CFG_ATI_REV_A12 (1 << 16) 383# define RADEON_CFG_ATI_REV_A12 (1 << 16)
370# define RADEON_CFG_ATI_REV_A13 (2 << 16) 384# define RADEON_CFG_ATI_REV_A13 (2 << 16)
@@ -422,6 +436,7 @@
422# define RADEON_CRTC_CSYNC_EN (1 << 4) 436# define RADEON_CRTC_CSYNC_EN (1 << 4)
423# define RADEON_CRTC_ICON_EN (1 << 15) 437# define RADEON_CRTC_ICON_EN (1 << 15)
424# define RADEON_CRTC_CUR_EN (1 << 16) 438# define RADEON_CRTC_CUR_EN (1 << 16)
439# define RADEON_CRTC_VSTAT_MODE_MASK (3 << 17)
425# define RADEON_CRTC_CUR_MODE_MASK (7 << 20) 440# define RADEON_CRTC_CUR_MODE_MASK (7 << 20)
426# define RADEON_CRTC_CUR_MODE_SHIFT 20 441# define RADEON_CRTC_CUR_MODE_SHIFT 20
427# define RADEON_CRTC_CUR_MODE_MONO 0 442# define RADEON_CRTC_CUR_MODE_MONO 0
@@ -509,6 +524,8 @@
509# define RADEON_CRTC_TILE_EN (1 << 15) 524# define RADEON_CRTC_TILE_EN (1 << 15)
510# define RADEON_CRTC_OFFSET_FLIP_CNTL (1 << 16) 525# define RADEON_CRTC_OFFSET_FLIP_CNTL (1 << 16)
511# define RADEON_CRTC_STEREO_OFFSET_EN (1 << 17) 526# define RADEON_CRTC_STEREO_OFFSET_EN (1 << 17)
527# define RADEON_CRTC_GUI_TRIG_OFFSET_LEFT_EN (1 << 28)
528# define RADEON_CRTC_GUI_TRIG_OFFSET_RIGHT_EN (1 << 29)
512 529
513#define R300_CRTC_TILE_X0_Y0 0x0350 530#define R300_CRTC_TILE_X0_Y0 0x0350
514#define R300_CRTC2_TILE_X0_Y0 0x0358 531#define R300_CRTC2_TILE_X0_Y0 0x0358
@@ -2836,6 +2853,7 @@
2836# define R200_TXFORMAT_ST_ROUTE_STQ5 (5 << 24) 2853# define R200_TXFORMAT_ST_ROUTE_STQ5 (5 << 24)
2837# define R200_TXFORMAT_ST_ROUTE_MASK (7 << 24) 2854# define R200_TXFORMAT_ST_ROUTE_MASK (7 << 24)
2838# define R200_TXFORMAT_ST_ROUTE_SHIFT 24 2855# define R200_TXFORMAT_ST_ROUTE_SHIFT 24
2856# define R200_TXFORMAT_LOOKUP_DISABLE (1 << 27)
2839# define R200_TXFORMAT_ALPHA_MASK_ENABLE (1 << 28) 2857# define R200_TXFORMAT_ALPHA_MASK_ENABLE (1 << 28)
2840# define R200_TXFORMAT_CHROMA_KEY_ENABLE (1 << 29) 2858# define R200_TXFORMAT_CHROMA_KEY_ENABLE (1 << 29)
2841# define R200_TXFORMAT_CUBIC_MAP_ENABLE (1 << 30) 2859# define R200_TXFORMAT_CUBIC_MAP_ENABLE (1 << 30)
diff --git a/drivers/gpu/drm/radeon/radeon_ring.c b/drivers/gpu/drm/radeon/radeon_ring.c
index 261e98a276db..08c0233db1b8 100644
--- a/drivers/gpu/drm/radeon/radeon_ring.c
+++ b/drivers/gpu/drm/radeon/radeon_ring.c
@@ -151,7 +151,7 @@ int radeon_ib_schedule(struct radeon_device *rdev, struct radeon_ib *ib)
151 /* 64 dwords should be enough for fence too */ 151 /* 64 dwords should be enough for fence too */
152 r = radeon_ring_lock(rdev, 64); 152 r = radeon_ring_lock(rdev, 64);
153 if (r) { 153 if (r) {
154 DRM_ERROR("radeon: scheduling IB failled (%d).\n", r); 154 DRM_ERROR("radeon: scheduling IB failed (%d).\n", r);
155 return r; 155 return r;
156 } 156 }
157 radeon_ring_ib_execute(rdev, ib); 157 radeon_ring_ib_execute(rdev, ib);
@@ -175,9 +175,9 @@ int radeon_ib_pool_init(struct radeon_device *rdev)
175 return 0; 175 return 0;
176 INIT_LIST_HEAD(&rdev->ib_pool.bogus_ib); 176 INIT_LIST_HEAD(&rdev->ib_pool.bogus_ib);
177 /* Allocate 1M object buffer */ 177 /* Allocate 1M object buffer */
178 r = radeon_bo_create(rdev, NULL, RADEON_IB_POOL_SIZE*64*1024, 178 r = radeon_bo_create(rdev, RADEON_IB_POOL_SIZE*64*1024,
179 true, RADEON_GEM_DOMAIN_GTT, 179 PAGE_SIZE, true, RADEON_GEM_DOMAIN_GTT,
180 &rdev->ib_pool.robj); 180 &rdev->ib_pool.robj);
181 if (r) { 181 if (r) {
182 DRM_ERROR("radeon: failed to ib pool (%d).\n", r); 182 DRM_ERROR("radeon: failed to ib pool (%d).\n", r);
183 return r; 183 return r;
@@ -194,7 +194,7 @@ int radeon_ib_pool_init(struct radeon_device *rdev)
194 r = radeon_bo_kmap(rdev->ib_pool.robj, &ptr); 194 r = radeon_bo_kmap(rdev->ib_pool.robj, &ptr);
195 radeon_bo_unreserve(rdev->ib_pool.robj); 195 radeon_bo_unreserve(rdev->ib_pool.robj);
196 if (r) { 196 if (r) {
197 DRM_ERROR("radeon: failed to map ib poll (%d).\n", r); 197 DRM_ERROR("radeon: failed to map ib pool (%d).\n", r);
198 return r; 198 return r;
199 } 199 }
200 for (i = 0; i < RADEON_IB_POOL_SIZE; i++) { 200 for (i = 0; i < RADEON_IB_POOL_SIZE; i++) {
@@ -247,10 +247,14 @@ void radeon_ib_pool_fini(struct radeon_device *rdev)
247 */ 247 */
248void radeon_ring_free_size(struct radeon_device *rdev) 248void radeon_ring_free_size(struct radeon_device *rdev)
249{ 249{
250 if (rdev->family >= CHIP_R600) 250 if (rdev->wb.enabled)
251 rdev->cp.rptr = RREG32(R600_CP_RB_RPTR); 251 rdev->cp.rptr = le32_to_cpu(rdev->wb.wb[RADEON_WB_CP_RPTR_OFFSET/4]);
252 else 252 else {
253 rdev->cp.rptr = RREG32(RADEON_CP_RB_RPTR); 253 if (rdev->family >= CHIP_R600)
254 rdev->cp.rptr = RREG32(R600_CP_RB_RPTR);
255 else
256 rdev->cp.rptr = RREG32(RADEON_CP_RB_RPTR);
257 }
254 /* This works because ring_size is a power of 2 */ 258 /* This works because ring_size is a power of 2 */
255 rdev->cp.ring_free_dw = (rdev->cp.rptr + (rdev->cp.ring_size / 4)); 259 rdev->cp.ring_free_dw = (rdev->cp.rptr + (rdev->cp.ring_size / 4));
256 rdev->cp.ring_free_dw -= rdev->cp.wptr; 260 rdev->cp.ring_free_dw -= rdev->cp.wptr;
@@ -328,7 +332,7 @@ int radeon_ring_init(struct radeon_device *rdev, unsigned ring_size)
328 rdev->cp.ring_size = ring_size; 332 rdev->cp.ring_size = ring_size;
329 /* Allocate ring buffer */ 333 /* Allocate ring buffer */
330 if (rdev->cp.ring_obj == NULL) { 334 if (rdev->cp.ring_obj == NULL) {
331 r = radeon_bo_create(rdev, NULL, rdev->cp.ring_size, true, 335 r = radeon_bo_create(rdev, rdev->cp.ring_size, PAGE_SIZE, true,
332 RADEON_GEM_DOMAIN_GTT, 336 RADEON_GEM_DOMAIN_GTT,
333 &rdev->cp.ring_obj); 337 &rdev->cp.ring_obj);
334 if (r) { 338 if (r) {
diff --git a/drivers/gpu/drm/radeon/radeon_state.c b/drivers/gpu/drm/radeon/radeon_state.c
index 4ae5a3d1074e..92e7ea73b7c5 100644
--- a/drivers/gpu/drm/radeon/radeon_state.c
+++ b/drivers/gpu/drm/radeon/radeon_state.c
@@ -980,7 +980,7 @@ static void radeon_cp_dispatch_clear(struct drm_device * dev,
980 } 980 }
981 981
982 /* hyper z clear */ 982 /* hyper z clear */
983 /* no docs available, based on reverse engeneering by Stephane Marchesin */ 983 /* no docs available, based on reverse engineering by Stephane Marchesin */
984 if ((flags & (RADEON_DEPTH | RADEON_STENCIL)) 984 if ((flags & (RADEON_DEPTH | RADEON_STENCIL))
985 && (flags & RADEON_CLEAR_FASTZ)) { 985 && (flags & RADEON_CLEAR_FASTZ)) {
986 986
diff --git a/drivers/gpu/drm/radeon/radeon_test.c b/drivers/gpu/drm/radeon/radeon_test.c
index 313c96bc09da..dee4a0c1b4b2 100644
--- a/drivers/gpu/drm/radeon/radeon_test.c
+++ b/drivers/gpu/drm/radeon/radeon_test.c
@@ -52,7 +52,7 @@ void radeon_test_moves(struct radeon_device *rdev)
52 goto out_cleanup; 52 goto out_cleanup;
53 } 53 }
54 54
55 r = radeon_bo_create(rdev, NULL, size, true, RADEON_GEM_DOMAIN_VRAM, 55 r = radeon_bo_create(rdev, size, PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM,
56 &vram_obj); 56 &vram_obj);
57 if (r) { 57 if (r) {
58 DRM_ERROR("Failed to create VRAM object\n"); 58 DRM_ERROR("Failed to create VRAM object\n");
@@ -71,7 +71,7 @@ void radeon_test_moves(struct radeon_device *rdev)
71 void **gtt_start, **gtt_end; 71 void **gtt_start, **gtt_end;
72 void **vram_start, **vram_end; 72 void **vram_start, **vram_end;
73 73
74 r = radeon_bo_create(rdev, NULL, size, true, 74 r = radeon_bo_create(rdev, size, PAGE_SIZE, true,
75 RADEON_GEM_DOMAIN_GTT, gtt_obj + i); 75 RADEON_GEM_DOMAIN_GTT, gtt_obj + i);
76 if (r) { 76 if (r) {
77 DRM_ERROR("Failed to create GTT object %d\n", i); 77 DRM_ERROR("Failed to create GTT object %d\n", i);
diff --git a/drivers/gpu/drm/radeon/radeon_trace.h b/drivers/gpu/drm/radeon/radeon_trace.h
new file mode 100644
index 000000000000..eafd8160a155
--- /dev/null
+++ b/drivers/gpu/drm/radeon/radeon_trace.h
@@ -0,0 +1,82 @@
1#if !defined(_RADEON_TRACE_H) || defined(TRACE_HEADER_MULTI_READ)
2#define _RADEON_TRACE_H_
3
4#include <linux/stringify.h>
5#include <linux/types.h>
6#include <linux/tracepoint.h>
7
8#include <drm/drmP.h>
9
10#undef TRACE_SYSTEM
11#define TRACE_SYSTEM radeon
12#define TRACE_SYSTEM_STRING __stringify(TRACE_SYSTEM)
13#define TRACE_INCLUDE_FILE radeon_trace
14
15TRACE_EVENT(radeon_bo_create,
16 TP_PROTO(struct radeon_bo *bo),
17 TP_ARGS(bo),
18 TP_STRUCT__entry(
19 __field(struct radeon_bo *, bo)
20 __field(u32, pages)
21 ),
22
23 TP_fast_assign(
24 __entry->bo = bo;
25 __entry->pages = bo->tbo.num_pages;
26 ),
27 TP_printk("bo=%p, pages=%u", __entry->bo, __entry->pages)
28);
29
30DECLARE_EVENT_CLASS(radeon_fence_request,
31
32 TP_PROTO(struct drm_device *dev, u32 seqno),
33
34 TP_ARGS(dev, seqno),
35
36 TP_STRUCT__entry(
37 __field(u32, dev)
38 __field(u32, seqno)
39 ),
40
41 TP_fast_assign(
42 __entry->dev = dev->primary->index;
43 __entry->seqno = seqno;
44 ),
45
46 TP_printk("dev=%u, seqno=%u", __entry->dev, __entry->seqno)
47);
48
49DEFINE_EVENT(radeon_fence_request, radeon_fence_emit,
50
51 TP_PROTO(struct drm_device *dev, u32 seqno),
52
53 TP_ARGS(dev, seqno)
54);
55
56DEFINE_EVENT(radeon_fence_request, radeon_fence_retire,
57
58 TP_PROTO(struct drm_device *dev, u32 seqno),
59
60 TP_ARGS(dev, seqno)
61);
62
63DEFINE_EVENT(radeon_fence_request, radeon_fence_wait_begin,
64
65 TP_PROTO(struct drm_device *dev, u32 seqno),
66
67 TP_ARGS(dev, seqno)
68);
69
70DEFINE_EVENT(radeon_fence_request, radeon_fence_wait_end,
71
72 TP_PROTO(struct drm_device *dev, u32 seqno),
73
74 TP_ARGS(dev, seqno)
75);
76
77#endif
78
79/* This part must be outside protection */
80#undef TRACE_INCLUDE_PATH
81#define TRACE_INCLUDE_PATH .
82#include <trace/define_trace.h>
diff --git a/drivers/gpu/drm/radeon/radeon_trace_points.c b/drivers/gpu/drm/radeon/radeon_trace_points.c
new file mode 100644
index 000000000000..8175993df84d
--- /dev/null
+++ b/drivers/gpu/drm/radeon/radeon_trace_points.c
@@ -0,0 +1,9 @@
1/* Copyright Red Hat Inc 2010.
2 * Author : Dave Airlie <airlied@redhat.com>
3 */
4#include <drm/drmP.h>
5#include "radeon_drm.h"
6#include "radeon.h"
7
8#define CREATE_TRACE_POINTS
9#include "radeon_trace.h"
diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c
index 84c53e41a88f..60125ddba1e9 100644
--- a/drivers/gpu/drm/radeon/radeon_ttm.c
+++ b/drivers/gpu/drm/radeon/radeon_ttm.c
@@ -152,6 +152,7 @@ static int radeon_init_mem_type(struct ttm_bo_device *bdev, uint32_t type,
152 man->default_caching = TTM_PL_FLAG_CACHED; 152 man->default_caching = TTM_PL_FLAG_CACHED;
153 break; 153 break;
154 case TTM_PL_TT: 154 case TTM_PL_TT:
155 man->func = &ttm_bo_manager_func;
155 man->gpu_offset = rdev->mc.gtt_start; 156 man->gpu_offset = rdev->mc.gtt_start;
156 man->available_caching = TTM_PL_MASK_CACHING; 157 man->available_caching = TTM_PL_MASK_CACHING;
157 man->default_caching = TTM_PL_FLAG_CACHED; 158 man->default_caching = TTM_PL_FLAG_CACHED;
@@ -173,6 +174,7 @@ static int radeon_init_mem_type(struct ttm_bo_device *bdev, uint32_t type,
173 break; 174 break;
174 case TTM_PL_VRAM: 175 case TTM_PL_VRAM:
175 /* "On-card" video ram */ 176 /* "On-card" video ram */
177 man->func = &ttm_bo_manager_func;
176 man->gpu_offset = rdev->mc.vram_start; 178 man->gpu_offset = rdev->mc.vram_start;
177 man->flags = TTM_MEMTYPE_FLAG_FIXED | 179 man->flags = TTM_MEMTYPE_FLAG_FIXED |
178 TTM_MEMTYPE_FLAG_MAPPABLE; 180 TTM_MEMTYPE_FLAG_MAPPABLE;
@@ -246,8 +248,8 @@ static int radeon_move_blit(struct ttm_buffer_object *bo,
246 if (unlikely(r)) { 248 if (unlikely(r)) {
247 return r; 249 return r;
248 } 250 }
249 old_start = old_mem->mm_node->start << PAGE_SHIFT; 251 old_start = old_mem->start << PAGE_SHIFT;
250 new_start = new_mem->mm_node->start << PAGE_SHIFT; 252 new_start = new_mem->start << PAGE_SHIFT;
251 253
252 switch (old_mem->mem_type) { 254 switch (old_mem->mem_type) {
253 case TTM_PL_VRAM: 255 case TTM_PL_VRAM:
@@ -326,14 +328,7 @@ static int radeon_move_vram_ram(struct ttm_buffer_object *bo,
326 } 328 }
327 r = ttm_bo_move_ttm(bo, true, no_wait_reserve, no_wait_gpu, new_mem); 329 r = ttm_bo_move_ttm(bo, true, no_wait_reserve, no_wait_gpu, new_mem);
328out_cleanup: 330out_cleanup:
329 if (tmp_mem.mm_node) { 331 ttm_bo_mem_put(bo, &tmp_mem);
330 struct ttm_bo_global *glob = rdev->mman.bdev.glob;
331
332 spin_lock(&glob->lru_lock);
333 drm_mm_put_block(tmp_mem.mm_node);
334 spin_unlock(&glob->lru_lock);
335 return r;
336 }
337 return r; 332 return r;
338} 333}
339 334
@@ -372,14 +367,7 @@ static int radeon_move_ram_vram(struct ttm_buffer_object *bo,
372 goto out_cleanup; 367 goto out_cleanup;
373 } 368 }
374out_cleanup: 369out_cleanup:
375 if (tmp_mem.mm_node) { 370 ttm_bo_mem_put(bo, &tmp_mem);
376 struct ttm_bo_global *glob = rdev->mman.bdev.glob;
377
378 spin_lock(&glob->lru_lock);
379 drm_mm_put_block(tmp_mem.mm_node);
380 spin_unlock(&glob->lru_lock);
381 return r;
382 }
383 return r; 371 return r;
384} 372}
385 373
@@ -449,14 +437,14 @@ static int radeon_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_mem_
449#if __OS_HAS_AGP 437#if __OS_HAS_AGP
450 if (rdev->flags & RADEON_IS_AGP) { 438 if (rdev->flags & RADEON_IS_AGP) {
451 /* RADEON_IS_AGP is set only if AGP is active */ 439 /* RADEON_IS_AGP is set only if AGP is active */
452 mem->bus.offset = mem->mm_node->start << PAGE_SHIFT; 440 mem->bus.offset = mem->start << PAGE_SHIFT;
453 mem->bus.base = rdev->mc.agp_base; 441 mem->bus.base = rdev->mc.agp_base;
454 mem->bus.is_iomem = !rdev->ddev->agp->cant_use_aperture; 442 mem->bus.is_iomem = !rdev->ddev->agp->cant_use_aperture;
455 } 443 }
456#endif 444#endif
457 break; 445 break;
458 case TTM_PL_VRAM: 446 case TTM_PL_VRAM:
459 mem->bus.offset = mem->mm_node->start << PAGE_SHIFT; 447 mem->bus.offset = mem->start << PAGE_SHIFT;
460 /* check if it's visible */ 448 /* check if it's visible */
461 if ((mem->bus.offset + mem->bus.size) > rdev->mc.visible_vram_size) 449 if ((mem->bus.offset + mem->bus.size) > rdev->mc.visible_vram_size)
462 return -EINVAL; 450 return -EINVAL;
@@ -541,7 +529,7 @@ int radeon_ttm_init(struct radeon_device *rdev)
541 DRM_ERROR("Failed initializing VRAM heap.\n"); 529 DRM_ERROR("Failed initializing VRAM heap.\n");
542 return r; 530 return r;
543 } 531 }
544 r = radeon_bo_create(rdev, NULL, 256 * 1024, true, 532 r = radeon_bo_create(rdev, 256 * 1024, PAGE_SIZE, true,
545 RADEON_GEM_DOMAIN_VRAM, 533 RADEON_GEM_DOMAIN_VRAM,
546 &rdev->stollen_vga_memory); 534 &rdev->stollen_vga_memory);
547 if (r) { 535 if (r) {
@@ -601,6 +589,20 @@ void radeon_ttm_fini(struct radeon_device *rdev)
601 DRM_INFO("radeon: ttm finalized\n"); 589 DRM_INFO("radeon: ttm finalized\n");
602} 590}
603 591
592/* this should only be called at bootup or when userspace
593 * isn't running */
594void radeon_ttm_set_active_vram_size(struct radeon_device *rdev, u64 size)
595{
596 struct ttm_mem_type_manager *man;
597
598 if (!rdev->mman.initialized)
599 return;
600
601 man = &rdev->mman.bdev.man[TTM_PL_VRAM];
602 /* this just adjusts TTM size idea, which sets lpfn to the correct value */
603 man->size = size >> PAGE_SHIFT;
604}
605
604static struct vm_operations_struct radeon_ttm_vm_ops; 606static struct vm_operations_struct radeon_ttm_vm_ops;
605static const struct vm_operations_struct *ttm_vm_ops = NULL; 607static const struct vm_operations_struct *ttm_vm_ops = NULL;
606 608
@@ -631,7 +633,7 @@ int radeon_mmap(struct file *filp, struct vm_area_struct *vma)
631 return drm_mmap(filp, vma); 633 return drm_mmap(filp, vma);
632 } 634 }
633 635
634 file_priv = (struct drm_file *)filp->private_data; 636 file_priv = filp->private_data;
635 rdev = file_priv->minor->dev->dev_private; 637 rdev = file_priv->minor->dev->dev_private;
636 if (rdev == NULL) { 638 if (rdev == NULL) {
637 return -EINVAL; 639 return -EINVAL;
@@ -659,6 +661,7 @@ struct radeon_ttm_backend {
659 unsigned long num_pages; 661 unsigned long num_pages;
660 struct page **pages; 662 struct page **pages;
661 struct page *dummy_read_page; 663 struct page *dummy_read_page;
664 dma_addr_t *dma_addrs;
662 bool populated; 665 bool populated;
663 bool bound; 666 bool bound;
664 unsigned offset; 667 unsigned offset;
@@ -667,12 +670,14 @@ struct radeon_ttm_backend {
667static int radeon_ttm_backend_populate(struct ttm_backend *backend, 670static int radeon_ttm_backend_populate(struct ttm_backend *backend,
668 unsigned long num_pages, 671 unsigned long num_pages,
669 struct page **pages, 672 struct page **pages,
670 struct page *dummy_read_page) 673 struct page *dummy_read_page,
674 dma_addr_t *dma_addrs)
671{ 675{
672 struct radeon_ttm_backend *gtt; 676 struct radeon_ttm_backend *gtt;
673 677
674 gtt = container_of(backend, struct radeon_ttm_backend, backend); 678 gtt = container_of(backend, struct radeon_ttm_backend, backend);
675 gtt->pages = pages; 679 gtt->pages = pages;
680 gtt->dma_addrs = dma_addrs;
676 gtt->num_pages = num_pages; 681 gtt->num_pages = num_pages;
677 gtt->dummy_read_page = dummy_read_page; 682 gtt->dummy_read_page = dummy_read_page;
678 gtt->populated = true; 683 gtt->populated = true;
@@ -685,6 +690,7 @@ static void radeon_ttm_backend_clear(struct ttm_backend *backend)
685 690
686 gtt = container_of(backend, struct radeon_ttm_backend, backend); 691 gtt = container_of(backend, struct radeon_ttm_backend, backend);
687 gtt->pages = NULL; 692 gtt->pages = NULL;
693 gtt->dma_addrs = NULL;
688 gtt->num_pages = 0; 694 gtt->num_pages = 0;
689 gtt->dummy_read_page = NULL; 695 gtt->dummy_read_page = NULL;
690 gtt->populated = false; 696 gtt->populated = false;
@@ -699,12 +705,13 @@ static int radeon_ttm_backend_bind(struct ttm_backend *backend,
699 int r; 705 int r;
700 706
701 gtt = container_of(backend, struct radeon_ttm_backend, backend); 707 gtt = container_of(backend, struct radeon_ttm_backend, backend);
702 gtt->offset = bo_mem->mm_node->start << PAGE_SHIFT; 708 gtt->offset = bo_mem->start << PAGE_SHIFT;
703 if (!gtt->num_pages) { 709 if (!gtt->num_pages) {
704 WARN(1, "nothing to bind %lu pages for mreg %p back %p!\n", gtt->num_pages, bo_mem, backend); 710 WARN(1, "nothing to bind %lu pages for mreg %p back %p!\n",
711 gtt->num_pages, bo_mem, backend);
705 } 712 }
706 r = radeon_gart_bind(gtt->rdev, gtt->offset, 713 r = radeon_gart_bind(gtt->rdev, gtt->offset,
707 gtt->num_pages, gtt->pages); 714 gtt->num_pages, gtt->pages, gtt->dma_addrs);
708 if (r) { 715 if (r) {
709 DRM_ERROR("failed to bind %lu pages at 0x%08X\n", 716 DRM_ERROR("failed to bind %lu pages at 0x%08X\n",
710 gtt->num_pages, gtt->offset); 717 gtt->num_pages, gtt->offset);
@@ -798,9 +805,9 @@ static int radeon_ttm_debugfs_init(struct radeon_device *rdev)
798 radeon_mem_types_list[i].show = &radeon_mm_dump_table; 805 radeon_mem_types_list[i].show = &radeon_mm_dump_table;
799 radeon_mem_types_list[i].driver_features = 0; 806 radeon_mem_types_list[i].driver_features = 0;
800 if (i == 0) 807 if (i == 0)
801 radeon_mem_types_list[i].data = &rdev->mman.bdev.man[TTM_PL_VRAM].manager; 808 radeon_mem_types_list[i].data = rdev->mman.bdev.man[TTM_PL_VRAM].priv;
802 else 809 else
803 radeon_mem_types_list[i].data = &rdev->mman.bdev.man[TTM_PL_TT].manager; 810 radeon_mem_types_list[i].data = rdev->mman.bdev.man[TTM_PL_TT].priv;
804 811
805 } 812 }
806 /* Add ttm page pool to debugfs */ 813 /* Add ttm page pool to debugfs */
diff --git a/drivers/gpu/drm/radeon/reg_srcs/cayman b/drivers/gpu/drm/radeon/reg_srcs/cayman
new file mode 100644
index 000000000000..0aa8e85a9457
--- /dev/null
+++ b/drivers/gpu/drm/radeon/reg_srcs/cayman
@@ -0,0 +1,620 @@
1cayman 0x9400
20x0000802C GRBM_GFX_INDEX
30x000088B0 VGT_VTX_VECT_EJECT_REG
40x000088C4 VGT_CACHE_INVALIDATION
50x000088D4 VGT_GS_VERTEX_REUSE
60x00008958 VGT_PRIMITIVE_TYPE
70x0000895C VGT_INDEX_TYPE
80x00008970 VGT_NUM_INDICES
90x00008974 VGT_NUM_INSTANCES
100x00008990 VGT_COMPUTE_DIM_X
110x00008994 VGT_COMPUTE_DIM_Y
120x00008998 VGT_COMPUTE_DIM_Z
130x0000899C VGT_COMPUTE_START_X
140x000089A0 VGT_COMPUTE_START_Y
150x000089A4 VGT_COMPUTE_START_Z
160x000089A8 VGT_COMPUTE_INDEX
170x000089AC VGT_COMPUTE_THREAD_GOURP_SIZE
180x000089B0 VGT_HS_OFFCHIP_PARAM
190x00008A14 PA_CL_ENHANCE
200x00008A60 PA_SC_LINE_STIPPLE_VALUE
210x00008B10 PA_SC_LINE_STIPPLE_STATE
220x00008BF0 PA_SC_ENHANCE
230x00008D8C SQ_DYN_GPR_CNTL_PS_FLUSH_REQ
240x00008D94 SQ_DYN_GPR_SIMD_LOCK_EN
250x00008C00 SQ_CONFIG
260x00008C04 SQ_GPR_RESOURCE_MGMT_1
270x00008C10 SQ_GLOBAL_GPR_RESOURCE_MGMT_1
280x00008C14 SQ_GLOBAL_GPR_RESOURCE_MGMT_2
290x00008DF8 SQ_CONST_MEM_BASE
300x00008E20 SQ_STATIC_THREAD_MGMT_1
310x00008E24 SQ_STATIC_THREAD_MGMT_2
320x00008E28 SQ_STATIC_THREAD_MGMT_3
330x00008E48 SQ_EX_ALLOC_TABLE_SLOTS
340x00009100 SPI_CONFIG_CNTL
350x0000913C SPI_CONFIG_CNTL_1
360x00009508 TA_CNTL_AUX
370x00009830 DB_DEBUG
380x00009834 DB_DEBUG2
390x00009838 DB_DEBUG3
400x0000983C DB_DEBUG4
410x00009854 DB_WATERMARKS
420x0000A400 TD_PS_BORDER_COLOR_INDEX
430x0000A404 TD_PS_BORDER_COLOR_RED
440x0000A408 TD_PS_BORDER_COLOR_GREEN
450x0000A40C TD_PS_BORDER_COLOR_BLUE
460x0000A410 TD_PS_BORDER_COLOR_ALPHA
470x0000A414 TD_VS_BORDER_COLOR_INDEX
480x0000A418 TD_VS_BORDER_COLOR_RED
490x0000A41C TD_VS_BORDER_COLOR_GREEN
500x0000A420 TD_VS_BORDER_COLOR_BLUE
510x0000A424 TD_VS_BORDER_COLOR_ALPHA
520x0000A428 TD_GS_BORDER_COLOR_INDEX
530x0000A42C TD_GS_BORDER_COLOR_RED
540x0000A430 TD_GS_BORDER_COLOR_GREEN
550x0000A434 TD_GS_BORDER_COLOR_BLUE
560x0000A438 TD_GS_BORDER_COLOR_ALPHA
570x0000A43C TD_HS_BORDER_COLOR_INDEX
580x0000A440 TD_HS_BORDER_COLOR_RED
590x0000A444 TD_HS_BORDER_COLOR_GREEN
600x0000A448 TD_HS_BORDER_COLOR_BLUE
610x0000A44C TD_HS_BORDER_COLOR_ALPHA
620x0000A450 TD_LS_BORDER_COLOR_INDEX
630x0000A454 TD_LS_BORDER_COLOR_RED
640x0000A458 TD_LS_BORDER_COLOR_GREEN
650x0000A45C TD_LS_BORDER_COLOR_BLUE
660x0000A460 TD_LS_BORDER_COLOR_ALPHA
670x0000A464 TD_CS_BORDER_COLOR_INDEX
680x0000A468 TD_CS_BORDER_COLOR_RED
690x0000A46C TD_CS_BORDER_COLOR_GREEN
700x0000A470 TD_CS_BORDER_COLOR_BLUE
710x0000A474 TD_CS_BORDER_COLOR_ALPHA
720x00028000 DB_RENDER_CONTROL
730x00028004 DB_COUNT_CONTROL
740x0002800C DB_RENDER_OVERRIDE
750x00028010 DB_RENDER_OVERRIDE2
760x00028028 DB_STENCIL_CLEAR
770x0002802C DB_DEPTH_CLEAR
780x00028030 PA_SC_SCREEN_SCISSOR_TL
790x00028034 PA_SC_SCREEN_SCISSOR_BR
800x0002805C DB_DEPTH_SLICE
810x00028140 SQ_ALU_CONST_BUFFER_SIZE_PS_0
820x00028144 SQ_ALU_CONST_BUFFER_SIZE_PS_1
830x00028148 SQ_ALU_CONST_BUFFER_SIZE_PS_2
840x0002814C SQ_ALU_CONST_BUFFER_SIZE_PS_3
850x00028150 SQ_ALU_CONST_BUFFER_SIZE_PS_4
860x00028154 SQ_ALU_CONST_BUFFER_SIZE_PS_5
870x00028158 SQ_ALU_CONST_BUFFER_SIZE_PS_6
880x0002815C SQ_ALU_CONST_BUFFER_SIZE_PS_7
890x00028160 SQ_ALU_CONST_BUFFER_SIZE_PS_8
900x00028164 SQ_ALU_CONST_BUFFER_SIZE_PS_9
910x00028168 SQ_ALU_CONST_BUFFER_SIZE_PS_10
920x0002816C SQ_ALU_CONST_BUFFER_SIZE_PS_11
930x00028170 SQ_ALU_CONST_BUFFER_SIZE_PS_12
940x00028174 SQ_ALU_CONST_BUFFER_SIZE_PS_13
950x00028178 SQ_ALU_CONST_BUFFER_SIZE_PS_14
960x0002817C SQ_ALU_CONST_BUFFER_SIZE_PS_15
970x00028180 SQ_ALU_CONST_BUFFER_SIZE_VS_0
980x00028184 SQ_ALU_CONST_BUFFER_SIZE_VS_1
990x00028188 SQ_ALU_CONST_BUFFER_SIZE_VS_2
1000x0002818C SQ_ALU_CONST_BUFFER_SIZE_VS_3
1010x00028190 SQ_ALU_CONST_BUFFER_SIZE_VS_4
1020x00028194 SQ_ALU_CONST_BUFFER_SIZE_VS_5
1030x00028198 SQ_ALU_CONST_BUFFER_SIZE_VS_6
1040x0002819C SQ_ALU_CONST_BUFFER_SIZE_VS_7
1050x000281A0 SQ_ALU_CONST_BUFFER_SIZE_VS_8
1060x000281A4 SQ_ALU_CONST_BUFFER_SIZE_VS_9
1070x000281A8 SQ_ALU_CONST_BUFFER_SIZE_VS_10
1080x000281AC SQ_ALU_CONST_BUFFER_SIZE_VS_11
1090x000281B0 SQ_ALU_CONST_BUFFER_SIZE_VS_12
1100x000281B4 SQ_ALU_CONST_BUFFER_SIZE_VS_13
1110x000281B8 SQ_ALU_CONST_BUFFER_SIZE_VS_14
1120x000281BC SQ_ALU_CONST_BUFFER_SIZE_VS_15
1130x000281C0 SQ_ALU_CONST_BUFFER_SIZE_GS_0
1140x000281C4 SQ_ALU_CONST_BUFFER_SIZE_GS_1
1150x000281C8 SQ_ALU_CONST_BUFFER_SIZE_GS_2
1160x000281CC SQ_ALU_CONST_BUFFER_SIZE_GS_3
1170x000281D0 SQ_ALU_CONST_BUFFER_SIZE_GS_4
1180x000281D4 SQ_ALU_CONST_BUFFER_SIZE_GS_5
1190x000281D8 SQ_ALU_CONST_BUFFER_SIZE_GS_6
1200x000281DC SQ_ALU_CONST_BUFFER_SIZE_GS_7
1210x000281E0 SQ_ALU_CONST_BUFFER_SIZE_GS_8
1220x000281E4 SQ_ALU_CONST_BUFFER_SIZE_GS_9
1230x000281E8 SQ_ALU_CONST_BUFFER_SIZE_GS_10
1240x000281EC SQ_ALU_CONST_BUFFER_SIZE_GS_11
1250x000281F0 SQ_ALU_CONST_BUFFER_SIZE_GS_12
1260x000281F4 SQ_ALU_CONST_BUFFER_SIZE_GS_13
1270x000281F8 SQ_ALU_CONST_BUFFER_SIZE_GS_14
1280x000281FC SQ_ALU_CONST_BUFFER_SIZE_GS_15
1290x00028200 PA_SC_WINDOW_OFFSET
1300x00028204 PA_SC_WINDOW_SCISSOR_TL
1310x00028208 PA_SC_WINDOW_SCISSOR_BR
1320x0002820C PA_SC_CLIPRECT_RULE
1330x00028210 PA_SC_CLIPRECT_0_TL
1340x00028214 PA_SC_CLIPRECT_0_BR
1350x00028218 PA_SC_CLIPRECT_1_TL
1360x0002821C PA_SC_CLIPRECT_1_BR
1370x00028220 PA_SC_CLIPRECT_2_TL
1380x00028224 PA_SC_CLIPRECT_2_BR
1390x00028228 PA_SC_CLIPRECT_3_TL
1400x0002822C PA_SC_CLIPRECT_3_BR
1410x00028230 PA_SC_EDGERULE
1420x00028234 PA_SU_HARDWARE_SCREEN_OFFSET
1430x00028240 PA_SC_GENERIC_SCISSOR_TL
1440x00028244 PA_SC_GENERIC_SCISSOR_BR
1450x00028250 PA_SC_VPORT_SCISSOR_0_TL
1460x00028254 PA_SC_VPORT_SCISSOR_0_BR
1470x00028258 PA_SC_VPORT_SCISSOR_1_TL
1480x0002825C PA_SC_VPORT_SCISSOR_1_BR
1490x00028260 PA_SC_VPORT_SCISSOR_2_TL
1500x00028264 PA_SC_VPORT_SCISSOR_2_BR
1510x00028268 PA_SC_VPORT_SCISSOR_3_TL
1520x0002826C PA_SC_VPORT_SCISSOR_3_BR
1530x00028270 PA_SC_VPORT_SCISSOR_4_TL
1540x00028274 PA_SC_VPORT_SCISSOR_4_BR
1550x00028278 PA_SC_VPORT_SCISSOR_5_TL
1560x0002827C PA_SC_VPORT_SCISSOR_5_BR
1570x00028280 PA_SC_VPORT_SCISSOR_6_TL
1580x00028284 PA_SC_VPORT_SCISSOR_6_BR
1590x00028288 PA_SC_VPORT_SCISSOR_7_TL
1600x0002828C PA_SC_VPORT_SCISSOR_7_BR
1610x00028290 PA_SC_VPORT_SCISSOR_8_TL
1620x00028294 PA_SC_VPORT_SCISSOR_8_BR
1630x00028298 PA_SC_VPORT_SCISSOR_9_TL
1640x0002829C PA_SC_VPORT_SCISSOR_9_BR
1650x000282A0 PA_SC_VPORT_SCISSOR_10_TL
1660x000282A4 PA_SC_VPORT_SCISSOR_10_BR
1670x000282A8 PA_SC_VPORT_SCISSOR_11_TL
1680x000282AC PA_SC_VPORT_SCISSOR_11_BR
1690x000282B0 PA_SC_VPORT_SCISSOR_12_TL
1700x000282B4 PA_SC_VPORT_SCISSOR_12_BR
1710x000282B8 PA_SC_VPORT_SCISSOR_13_TL
1720x000282BC PA_SC_VPORT_SCISSOR_13_BR
1730x000282C0 PA_SC_VPORT_SCISSOR_14_TL
1740x000282C4 PA_SC_VPORT_SCISSOR_14_BR
1750x000282C8 PA_SC_VPORT_SCISSOR_15_TL
1760x000282CC PA_SC_VPORT_SCISSOR_15_BR
1770x000282D0 PA_SC_VPORT_ZMIN_0
1780x000282D4 PA_SC_VPORT_ZMAX_0
1790x000282D8 PA_SC_VPORT_ZMIN_1
1800x000282DC PA_SC_VPORT_ZMAX_1
1810x000282E0 PA_SC_VPORT_ZMIN_2
1820x000282E4 PA_SC_VPORT_ZMAX_2
1830x000282E8 PA_SC_VPORT_ZMIN_3
1840x000282EC PA_SC_VPORT_ZMAX_3
1850x000282F0 PA_SC_VPORT_ZMIN_4
1860x000282F4 PA_SC_VPORT_ZMAX_4
1870x000282F8 PA_SC_VPORT_ZMIN_5
1880x000282FC PA_SC_VPORT_ZMAX_5
1890x00028300 PA_SC_VPORT_ZMIN_6
1900x00028304 PA_SC_VPORT_ZMAX_6
1910x00028308 PA_SC_VPORT_ZMIN_7
1920x0002830C PA_SC_VPORT_ZMAX_7
1930x00028310 PA_SC_VPORT_ZMIN_8
1940x00028314 PA_SC_VPORT_ZMAX_8
1950x00028318 PA_SC_VPORT_ZMIN_9
1960x0002831C PA_SC_VPORT_ZMAX_9
1970x00028320 PA_SC_VPORT_ZMIN_10
1980x00028324 PA_SC_VPORT_ZMAX_10
1990x00028328 PA_SC_VPORT_ZMIN_11
2000x0002832C PA_SC_VPORT_ZMAX_11
2010x00028330 PA_SC_VPORT_ZMIN_12
2020x00028334 PA_SC_VPORT_ZMAX_12
2030x00028338 PA_SC_VPORT_ZMIN_13
2040x0002833C PA_SC_VPORT_ZMAX_13
2050x00028340 PA_SC_VPORT_ZMIN_14
2060x00028344 PA_SC_VPORT_ZMAX_14
2070x00028348 PA_SC_VPORT_ZMIN_15
2080x0002834C PA_SC_VPORT_ZMAX_15
2090x00028350 SX_MISC
2100x00028354 SX_SURFACE_SYNC
2110x00028380 SQ_VTX_SEMANTIC_0
2120x00028384 SQ_VTX_SEMANTIC_1
2130x00028388 SQ_VTX_SEMANTIC_2
2140x0002838C SQ_VTX_SEMANTIC_3
2150x00028390 SQ_VTX_SEMANTIC_4
2160x00028394 SQ_VTX_SEMANTIC_5
2170x00028398 SQ_VTX_SEMANTIC_6
2180x0002839C SQ_VTX_SEMANTIC_7
2190x000283A0 SQ_VTX_SEMANTIC_8
2200x000283A4 SQ_VTX_SEMANTIC_9
2210x000283A8 SQ_VTX_SEMANTIC_10
2220x000283AC SQ_VTX_SEMANTIC_11
2230x000283B0 SQ_VTX_SEMANTIC_12
2240x000283B4 SQ_VTX_SEMANTIC_13
2250x000283B8 SQ_VTX_SEMANTIC_14
2260x000283BC SQ_VTX_SEMANTIC_15
2270x000283C0 SQ_VTX_SEMANTIC_16
2280x000283C4 SQ_VTX_SEMANTIC_17
2290x000283C8 SQ_VTX_SEMANTIC_18
2300x000283CC SQ_VTX_SEMANTIC_19
2310x000283D0 SQ_VTX_SEMANTIC_20
2320x000283D4 SQ_VTX_SEMANTIC_21
2330x000283D8 SQ_VTX_SEMANTIC_22
2340x000283DC SQ_VTX_SEMANTIC_23
2350x000283E0 SQ_VTX_SEMANTIC_24
2360x000283E4 SQ_VTX_SEMANTIC_25
2370x000283E8 SQ_VTX_SEMANTIC_26
2380x000283EC SQ_VTX_SEMANTIC_27
2390x000283F0 SQ_VTX_SEMANTIC_28
2400x000283F4 SQ_VTX_SEMANTIC_29
2410x000283F8 SQ_VTX_SEMANTIC_30
2420x000283FC SQ_VTX_SEMANTIC_31
2430x00028400 VGT_MAX_VTX_INDX
2440x00028404 VGT_MIN_VTX_INDX
2450x00028408 VGT_INDX_OFFSET
2460x0002840C VGT_MULTI_PRIM_IB_RESET_INDX
2470x00028410 SX_ALPHA_TEST_CONTROL
2480x00028414 CB_BLEND_RED
2490x00028418 CB_BLEND_GREEN
2500x0002841C CB_BLEND_BLUE
2510x00028420 CB_BLEND_ALPHA
2520x00028430 DB_STENCILREFMASK
2530x00028434 DB_STENCILREFMASK_BF
2540x00028438 SX_ALPHA_REF
2550x0002843C PA_CL_VPORT_XSCALE_0
2560x00028440 PA_CL_VPORT_XOFFSET_0
2570x00028444 PA_CL_VPORT_YSCALE_0
2580x00028448 PA_CL_VPORT_YOFFSET_0
2590x0002844C PA_CL_VPORT_ZSCALE_0
2600x00028450 PA_CL_VPORT_ZOFFSET_0
2610x00028454 PA_CL_VPORT_XSCALE_1
2620x00028458 PA_CL_VPORT_XOFFSET_1
2630x0002845C PA_CL_VPORT_YSCALE_1
2640x00028460 PA_CL_VPORT_YOFFSET_1
2650x00028464 PA_CL_VPORT_ZSCALE_1
2660x00028468 PA_CL_VPORT_ZOFFSET_1
2670x0002846C PA_CL_VPORT_XSCALE_2
2680x00028470 PA_CL_VPORT_XOFFSET_2
2690x00028474 PA_CL_VPORT_YSCALE_2
2700x00028478 PA_CL_VPORT_YOFFSET_2
2710x0002847C PA_CL_VPORT_ZSCALE_2
2720x00028480 PA_CL_VPORT_ZOFFSET_2
2730x00028484 PA_CL_VPORT_XSCALE_3
2740x00028488 PA_CL_VPORT_XOFFSET_3
2750x0002848C PA_CL_VPORT_YSCALE_3
2760x00028490 PA_CL_VPORT_YOFFSET_3
2770x00028494 PA_CL_VPORT_ZSCALE_3
2780x00028498 PA_CL_VPORT_ZOFFSET_3
2790x0002849C PA_CL_VPORT_XSCALE_4
2800x000284A0 PA_CL_VPORT_XOFFSET_4
2810x000284A4 PA_CL_VPORT_YSCALE_4
2820x000284A8 PA_CL_VPORT_YOFFSET_4
2830x000284AC PA_CL_VPORT_ZSCALE_4
2840x000284B0 PA_CL_VPORT_ZOFFSET_4
2850x000284B4 PA_CL_VPORT_XSCALE_5
2860x000284B8 PA_CL_VPORT_XOFFSET_5
2870x000284BC PA_CL_VPORT_YSCALE_5
2880x000284C0 PA_CL_VPORT_YOFFSET_5
2890x000284C4 PA_CL_VPORT_ZSCALE_5
2900x000284C8 PA_CL_VPORT_ZOFFSET_5
2910x000284CC PA_CL_VPORT_XSCALE_6
2920x000284D0 PA_CL_VPORT_XOFFSET_6
2930x000284D4 PA_CL_VPORT_YSCALE_6
2940x000284D8 PA_CL_VPORT_YOFFSET_6
2950x000284DC PA_CL_VPORT_ZSCALE_6
2960x000284E0 PA_CL_VPORT_ZOFFSET_6
2970x000284E4 PA_CL_VPORT_XSCALE_7
2980x000284E8 PA_CL_VPORT_XOFFSET_7
2990x000284EC PA_CL_VPORT_YSCALE_7
3000x000284F0 PA_CL_VPORT_YOFFSET_7
3010x000284F4 PA_CL_VPORT_ZSCALE_7
3020x000284F8 PA_CL_VPORT_ZOFFSET_7
3030x000284FC PA_CL_VPORT_XSCALE_8
3040x00028500 PA_CL_VPORT_XOFFSET_8
3050x00028504 PA_CL_VPORT_YSCALE_8
3060x00028508 PA_CL_VPORT_YOFFSET_8
3070x0002850C PA_CL_VPORT_ZSCALE_8
3080x00028510 PA_CL_VPORT_ZOFFSET_8
3090x00028514 PA_CL_VPORT_XSCALE_9
3100x00028518 PA_CL_VPORT_XOFFSET_9
3110x0002851C PA_CL_VPORT_YSCALE_9
3120x00028520 PA_CL_VPORT_YOFFSET_9
3130x00028524 PA_CL_VPORT_ZSCALE_9
3140x00028528 PA_CL_VPORT_ZOFFSET_9
3150x0002852C PA_CL_VPORT_XSCALE_10
3160x00028530 PA_CL_VPORT_XOFFSET_10
3170x00028534 PA_CL_VPORT_YSCALE_10
3180x00028538 PA_CL_VPORT_YOFFSET_10
3190x0002853C PA_CL_VPORT_ZSCALE_10
3200x00028540 PA_CL_VPORT_ZOFFSET_10
3210x00028544 PA_CL_VPORT_XSCALE_11
3220x00028548 PA_CL_VPORT_XOFFSET_11
3230x0002854C PA_CL_VPORT_YSCALE_11
3240x00028550 PA_CL_VPORT_YOFFSET_11
3250x00028554 PA_CL_VPORT_ZSCALE_11
3260x00028558 PA_CL_VPORT_ZOFFSET_11
3270x0002855C PA_CL_VPORT_XSCALE_12
3280x00028560 PA_CL_VPORT_XOFFSET_12
3290x00028564 PA_CL_VPORT_YSCALE_12
3300x00028568 PA_CL_VPORT_YOFFSET_12
3310x0002856C PA_CL_VPORT_ZSCALE_12
3320x00028570 PA_CL_VPORT_ZOFFSET_12
3330x00028574 PA_CL_VPORT_XSCALE_13
3340x00028578 PA_CL_VPORT_XOFFSET_13
3350x0002857C PA_CL_VPORT_YSCALE_13
3360x00028580 PA_CL_VPORT_YOFFSET_13
3370x00028584 PA_CL_VPORT_ZSCALE_13
3380x00028588 PA_CL_VPORT_ZOFFSET_13
3390x0002858C PA_CL_VPORT_XSCALE_14
3400x00028590 PA_CL_VPORT_XOFFSET_14
3410x00028594 PA_CL_VPORT_YSCALE_14
3420x00028598 PA_CL_VPORT_YOFFSET_14
3430x0002859C PA_CL_VPORT_ZSCALE_14
3440x000285A0 PA_CL_VPORT_ZOFFSET_14
3450x000285A4 PA_CL_VPORT_XSCALE_15
3460x000285A8 PA_CL_VPORT_XOFFSET_15
3470x000285AC PA_CL_VPORT_YSCALE_15
3480x000285B0 PA_CL_VPORT_YOFFSET_15
3490x000285B4 PA_CL_VPORT_ZSCALE_15
3500x000285B8 PA_CL_VPORT_ZOFFSET_15
3510x000285BC PA_CL_UCP_0_X
3520x000285C0 PA_CL_UCP_0_Y
3530x000285C4 PA_CL_UCP_0_Z
3540x000285C8 PA_CL_UCP_0_W
3550x000285CC PA_CL_UCP_1_X
3560x000285D0 PA_CL_UCP_1_Y
3570x000285D4 PA_CL_UCP_1_Z
3580x000285D8 PA_CL_UCP_1_W
3590x000285DC PA_CL_UCP_2_X
3600x000285E0 PA_CL_UCP_2_Y
3610x000285E4 PA_CL_UCP_2_Z
3620x000285E8 PA_CL_UCP_2_W
3630x000285EC PA_CL_UCP_3_X
3640x000285F0 PA_CL_UCP_3_Y
3650x000285F4 PA_CL_UCP_3_Z
3660x000285F8 PA_CL_UCP_3_W
3670x000285FC PA_CL_UCP_4_X
3680x00028600 PA_CL_UCP_4_Y
3690x00028604 PA_CL_UCP_4_Z
3700x00028608 PA_CL_UCP_4_W
3710x0002860C PA_CL_UCP_5_X
3720x00028610 PA_CL_UCP_5_Y
3730x00028614 PA_CL_UCP_5_Z
3740x00028618 PA_CL_UCP_5_W
3750x0002861C SPI_VS_OUT_ID_0
3760x00028620 SPI_VS_OUT_ID_1
3770x00028624 SPI_VS_OUT_ID_2
3780x00028628 SPI_VS_OUT_ID_3
3790x0002862C SPI_VS_OUT_ID_4
3800x00028630 SPI_VS_OUT_ID_5
3810x00028634 SPI_VS_OUT_ID_6
3820x00028638 SPI_VS_OUT_ID_7
3830x0002863C SPI_VS_OUT_ID_8
3840x00028640 SPI_VS_OUT_ID_9
3850x00028644 SPI_PS_INPUT_CNTL_0
3860x00028648 SPI_PS_INPUT_CNTL_1
3870x0002864C SPI_PS_INPUT_CNTL_2
3880x00028650 SPI_PS_INPUT_CNTL_3
3890x00028654 SPI_PS_INPUT_CNTL_4
3900x00028658 SPI_PS_INPUT_CNTL_5
3910x0002865C SPI_PS_INPUT_CNTL_6
3920x00028660 SPI_PS_INPUT_CNTL_7
3930x00028664 SPI_PS_INPUT_CNTL_8
3940x00028668 SPI_PS_INPUT_CNTL_9
3950x0002866C SPI_PS_INPUT_CNTL_10
3960x00028670 SPI_PS_INPUT_CNTL_11
3970x00028674 SPI_PS_INPUT_CNTL_12
3980x00028678 SPI_PS_INPUT_CNTL_13
3990x0002867C SPI_PS_INPUT_CNTL_14
4000x00028680 SPI_PS_INPUT_CNTL_15
4010x00028684 SPI_PS_INPUT_CNTL_16
4020x00028688 SPI_PS_INPUT_CNTL_17
4030x0002868C SPI_PS_INPUT_CNTL_18
4040x00028690 SPI_PS_INPUT_CNTL_19
4050x00028694 SPI_PS_INPUT_CNTL_20
4060x00028698 SPI_PS_INPUT_CNTL_21
4070x0002869C SPI_PS_INPUT_CNTL_22
4080x000286A0 SPI_PS_INPUT_CNTL_23
4090x000286A4 SPI_PS_INPUT_CNTL_24
4100x000286A8 SPI_PS_INPUT_CNTL_25
4110x000286AC SPI_PS_INPUT_CNTL_26
4120x000286B0 SPI_PS_INPUT_CNTL_27
4130x000286B4 SPI_PS_INPUT_CNTL_28
4140x000286B8 SPI_PS_INPUT_CNTL_29
4150x000286BC SPI_PS_INPUT_CNTL_30
4160x000286C0 SPI_PS_INPUT_CNTL_31
4170x000286C4 SPI_VS_OUT_CONFIG
4180x000286C8 SPI_THREAD_GROUPING
4190x000286CC SPI_PS_IN_CONTROL_0
4200x000286D0 SPI_PS_IN_CONTROL_1
4210x000286D4 SPI_INTERP_CONTROL_0
4220x000286D8 SPI_INPUT_Z
4230x000286DC SPI_FOG_CNTL
4240x000286E0 SPI_BARYC_CNTL
4250x000286E4 SPI_PS_IN_CONTROL_2
4260x000286E8 SPI_COMPUTE_INPUT_CNTL
4270x000286EC SPI_COMPUTE_NUM_THREAD_X
4280x000286F0 SPI_COMPUTE_NUM_THREAD_Y
4290x000286F4 SPI_COMPUTE_NUM_THREAD_Z
4300x000286F8 SPI_GPR_MGMT
4310x000286FC SPI_LDS_MGMT
4320x00028700 SPI_STACK_MGMT
4330x00028704 SPI_WAVE_MGMT_1
4340x00028708 SPI_WAVE_MGMT_2
4350x00028724 GDS_ADDR_SIZE
4360x00028780 CB_BLEND0_CONTROL
4370x00028784 CB_BLEND1_CONTROL
4380x00028788 CB_BLEND2_CONTROL
4390x0002878C CB_BLEND3_CONTROL
4400x00028790 CB_BLEND4_CONTROL
4410x00028794 CB_BLEND5_CONTROL
4420x00028798 CB_BLEND6_CONTROL
4430x0002879C CB_BLEND7_CONTROL
4440x000287CC CS_COPY_STATE
4450x000287D0 GFX_COPY_STATE
4460x000287D4 PA_CL_POINT_X_RAD
4470x000287D8 PA_CL_POINT_Y_RAD
4480x000287DC PA_CL_POINT_SIZE
4490x000287E0 PA_CL_POINT_CULL_RAD
4500x00028808 CB_COLOR_CONTROL
4510x0002880C DB_SHADER_CONTROL
4520x00028810 PA_CL_CLIP_CNTL
4530x00028814 PA_SU_SC_MODE_CNTL
4540x00028818 PA_CL_VTE_CNTL
4550x0002881C PA_CL_VS_OUT_CNTL
4560x00028820 PA_CL_NANINF_CNTL
4570x00028824 PA_SU_LINE_STIPPLE_CNTL
4580x00028828 PA_SU_LINE_STIPPLE_SCALE
4590x0002882C PA_SU_PRIM_FILTER_CNTL
4600x00028844 SQ_PGM_RESOURCES_PS
4610x00028848 SQ_PGM_RESOURCES_2_PS
4620x0002884C SQ_PGM_EXPORTS_PS
4630x00028860 SQ_PGM_RESOURCES_VS
4640x00028864 SQ_PGM_RESOURCES_2_VS
4650x00028878 SQ_PGM_RESOURCES_GS
4660x0002887C SQ_PGM_RESOURCES_2_GS
4670x00028890 SQ_PGM_RESOURCES_ES
4680x00028894 SQ_PGM_RESOURCES_2_ES
4690x000288A8 SQ_PGM_RESOURCES_FS
4700x000288BC SQ_PGM_RESOURCES_HS
4710x000288C0 SQ_PGM_RESOURCES_2_HS
4720x000288D4 SQ_PGM_RESOURCES_LS
4730x000288D8 SQ_PGM_RESOURCES_2_LS
4740x000288E8 SQ_LDS_ALLOC
4750x000288EC SQ_LDS_ALLOC_PS
4760x000288F0 SQ_VTX_SEMANTIC_CLEAR
4770x00028A00 PA_SU_POINT_SIZE
4780x00028A04 PA_SU_POINT_MINMAX
4790x00028A08 PA_SU_LINE_CNTL
4800x00028A0C PA_SC_LINE_STIPPLE
4810x00028A10 VGT_OUTPUT_PATH_CNTL
4820x00028A14 VGT_HOS_CNTL
4830x00028A18 VGT_HOS_MAX_TESS_LEVEL
4840x00028A1C VGT_HOS_MIN_TESS_LEVEL
4850x00028A20 VGT_HOS_REUSE_DEPTH
4860x00028A24 VGT_GROUP_PRIM_TYPE
4870x00028A28 VGT_GROUP_FIRST_DECR
4880x00028A2C VGT_GROUP_DECR
4890x00028A30 VGT_GROUP_VECT_0_CNTL
4900x00028A34 VGT_GROUP_VECT_1_CNTL
4910x00028A38 VGT_GROUP_VECT_0_FMT_CNTL
4920x00028A3C VGT_GROUP_VECT_1_FMT_CNTL
4930x00028A40 VGT_GS_MODE
4940x00028A48 PA_SC_MODE_CNTL_0
4950x00028A4C PA_SC_MODE_CNTL_1
4960x00028A50 VGT_ENHANCE
4970x00028A54 VGT_GS_PER_ES
4980x00028A58 VGT_ES_PER_GS
4990x00028A5C VGT_GS_PER_VS
5000x00028A6C VGT_GS_OUT_PRIM_TYPE
5010x00028A70 IA_ENHANCE
5020x00028A84 VGT_PRIMITIVEID_EN
5030x00028A94 VGT_MULTI_PRIM_IB_RESET_EN
5040x00028AA0 VGT_INSTANCE_STEP_RATE_0
5050x00028AA4 VGT_INSTANCE_STEP_RATE_1
5060x00028AA8 IA_MULTI_VGT_PARAM
5070x00028AB4 VGT_REUSE_OFF
5080x00028AB8 VGT_VTX_CNT_EN
5090x00028ABC DB_HTILE_SURFACE
5100x00028AC0 DB_SRESULTS_COMPARE_STATE0
5110x00028AC4 DB_SRESULTS_COMPARE_STATE1
5120x00028AC8 DB_PRELOAD_CONTROL
5130x00028B38 VGT_GS_MAX_VERT_OUT
5140x00028B54 VGT_SHADER_STAGES_EN
5150x00028B58 VGT_LS_HS_CONFIG
5160x00028B6C VGT_TF_PARAM
5170x00028B70 DB_ALPHA_TO_MASK
5180x00028B74 VGT_DISPATCH_INITIATOR
5190x00028B78 PA_SU_POLY_OFFSET_DB_FMT_CNTL
5200x00028B7C PA_SU_POLY_OFFSET_CLAMP
5210x00028B80 PA_SU_POLY_OFFSET_FRONT_SCALE
5220x00028B84 PA_SU_POLY_OFFSET_FRONT_OFFSET
5230x00028B88 PA_SU_POLY_OFFSET_BACK_SCALE
5240x00028B8C PA_SU_POLY_OFFSET_BACK_OFFSET
5250x00028B74 VGT_GS_INSTANCE_CNT
5260x00028BD4 PA_SC_CENTROID_PRIORITY_0
5270x00028BD8 PA_SC_CENTROID_PRIORITY_1
5280x00028BDC PA_SC_LINE_CNTL
5290x00028BE4 PA_SU_VTX_CNTL
5300x00028BE8 PA_CL_GB_VERT_CLIP_ADJ
5310x00028BEC PA_CL_GB_VERT_DISC_ADJ
5320x00028BF0 PA_CL_GB_HORZ_CLIP_ADJ
5330x00028BF4 PA_CL_GB_HORZ_DISC_ADJ
5340x00028BF8 PA_SC_AA_SAMPLE_LOCS_PIXEL_X0_Y0_0
5350x00028BFC PA_SC_AA_SAMPLE_LOCS_PIXEL_X0_Y0_1
5360x00028C00 PA_SC_AA_SAMPLE_LOCS_PIXEL_X0_Y0_2
5370x00028C04 PA_SC_AA_SAMPLE_LOCS_PIXEL_X0_Y0_3
5380x00028C08 PA_SC_AA_SAMPLE_LOCS_PIXEL_X1_Y0_0
5390x00028C0C PA_SC_AA_SAMPLE_LOCS_PIXEL_X1_Y0_1
5400x00028C10 PA_SC_AA_SAMPLE_LOCS_PIXEL_X1_Y0_2
5410x00028C14 PA_SC_AA_SAMPLE_LOCS_PIXEL_X1_Y0_3
5420x00028C18 PA_SC_AA_SAMPLE_LOCS_PIXEL_X0_Y1_0
5430x00028C1C PA_SC_AA_SAMPLE_LOCS_PIXEL_X0_Y1_1
5440x00028C20 PA_SC_AA_SAMPLE_LOCS_PIXEL_X0_Y1_2
5450x00028C24 PA_SC_AA_SAMPLE_LOCS_PIXEL_X0_Y1_3
5460x00028C28 PA_SC_AA_SAMPLE_LOCS_PIXEL_X1_Y1_0
5470x00028C2C PA_SC_AA_SAMPLE_LOCS_PIXEL_X1_Y1_1
5480x00028C30 PA_SC_AA_SAMPLE_LOCS_PIXEL_X1_Y1_2
5490x00028C34 PA_SC_AA_SAMPLE_LOCS_PIXEL_X1_Y1_3
5500x00028C38 PA_SC_AA_MASK_X0_Y0_X1_Y0
5510x00028C3C PA_SC_AA_MASK_X0_Y1_X1_Y1
5520x00028C8C CB_COLOR0_CLEAR_WORD0
5530x00028C90 CB_COLOR0_CLEAR_WORD1
5540x00028C94 CB_COLOR0_CLEAR_WORD2
5550x00028C98 CB_COLOR0_CLEAR_WORD3
5560x00028CC8 CB_COLOR1_CLEAR_WORD0
5570x00028CCC CB_COLOR1_CLEAR_WORD1
5580x00028CD0 CB_COLOR1_CLEAR_WORD2
5590x00028CD4 CB_COLOR1_CLEAR_WORD3
5600x00028D04 CB_COLOR2_CLEAR_WORD0
5610x00028D08 CB_COLOR2_CLEAR_WORD1
5620x00028D0C CB_COLOR2_CLEAR_WORD2
5630x00028D10 CB_COLOR2_CLEAR_WORD3
5640x00028D40 CB_COLOR3_CLEAR_WORD0
5650x00028D44 CB_COLOR3_CLEAR_WORD1
5660x00028D48 CB_COLOR3_CLEAR_WORD2
5670x00028D4C CB_COLOR3_CLEAR_WORD3
5680x00028D7C CB_COLOR4_CLEAR_WORD0
5690x00028D80 CB_COLOR4_CLEAR_WORD1
5700x00028D84 CB_COLOR4_CLEAR_WORD2
5710x00028D88 CB_COLOR4_CLEAR_WORD3
5720x00028DB8 CB_COLOR5_CLEAR_WORD0
5730x00028DBC CB_COLOR5_CLEAR_WORD1
5740x00028DC0 CB_COLOR5_CLEAR_WORD2
5750x00028DC4 CB_COLOR5_CLEAR_WORD3
5760x00028DF4 CB_COLOR6_CLEAR_WORD0
5770x00028DF8 CB_COLOR6_CLEAR_WORD1
5780x00028DFC CB_COLOR6_CLEAR_WORD2
5790x00028E00 CB_COLOR6_CLEAR_WORD3
5800x00028E30 CB_COLOR7_CLEAR_WORD0
5810x00028E34 CB_COLOR7_CLEAR_WORD1
5820x00028E38 CB_COLOR7_CLEAR_WORD2
5830x00028E3C CB_COLOR7_CLEAR_WORD3
5840x00028F80 SQ_ALU_CONST_BUFFER_SIZE_HS_0
5850x00028F84 SQ_ALU_CONST_BUFFER_SIZE_HS_1
5860x00028F88 SQ_ALU_CONST_BUFFER_SIZE_HS_2
5870x00028F8C SQ_ALU_CONST_BUFFER_SIZE_HS_3
5880x00028F90 SQ_ALU_CONST_BUFFER_SIZE_HS_4
5890x00028F94 SQ_ALU_CONST_BUFFER_SIZE_HS_5
5900x00028F98 SQ_ALU_CONST_BUFFER_SIZE_HS_6
5910x00028F9C SQ_ALU_CONST_BUFFER_SIZE_HS_7
5920x00028FA0 SQ_ALU_CONST_BUFFER_SIZE_HS_8
5930x00028FA4 SQ_ALU_CONST_BUFFER_SIZE_HS_9
5940x00028FA8 SQ_ALU_CONST_BUFFER_SIZE_HS_10
5950x00028FAC SQ_ALU_CONST_BUFFER_SIZE_HS_11
5960x00028FB0 SQ_ALU_CONST_BUFFER_SIZE_HS_12
5970x00028FB4 SQ_ALU_CONST_BUFFER_SIZE_HS_13
5980x00028FB8 SQ_ALU_CONST_BUFFER_SIZE_HS_14
5990x00028FBC SQ_ALU_CONST_BUFFER_SIZE_HS_15
6000x00028FC0 SQ_ALU_CONST_BUFFER_SIZE_LS_0
6010x00028FC4 SQ_ALU_CONST_BUFFER_SIZE_LS_1
6020x00028FC8 SQ_ALU_CONST_BUFFER_SIZE_LS_2
6030x00028FCC SQ_ALU_CONST_BUFFER_SIZE_LS_3
6040x00028FD0 SQ_ALU_CONST_BUFFER_SIZE_LS_4
6050x00028FD4 SQ_ALU_CONST_BUFFER_SIZE_LS_5
6060x00028FD8 SQ_ALU_CONST_BUFFER_SIZE_LS_6
6070x00028FDC SQ_ALU_CONST_BUFFER_SIZE_LS_7
6080x00028FE0 SQ_ALU_CONST_BUFFER_SIZE_LS_8
6090x00028FE4 SQ_ALU_CONST_BUFFER_SIZE_LS_9
6100x00028FE8 SQ_ALU_CONST_BUFFER_SIZE_LS_10
6110x00028FEC SQ_ALU_CONST_BUFFER_SIZE_LS_11
6120x00028FF0 SQ_ALU_CONST_BUFFER_SIZE_LS_12
6130x00028FF4 SQ_ALU_CONST_BUFFER_SIZE_LS_13
6140x00028FF8 SQ_ALU_CONST_BUFFER_SIZE_LS_14
6150x00028FFC SQ_ALU_CONST_BUFFER_SIZE_LS_15
6160x0003CFF0 SQ_VTX_BASE_VTX_LOC
6170x0003CFF4 SQ_VTX_START_INST_LOC
6180x0003FF00 SQ_TEX_SAMPLER_CLEAR
6190x0003FF04 SQ_TEX_RESOURCE_CLEAR
6200x0003FF08 SQ_LOOP_BOOL_CLEAR
diff --git a/drivers/gpu/drm/radeon/reg_srcs/evergreen b/drivers/gpu/drm/radeon/reg_srcs/evergreen
index f78fd592544d..0e28cae7ea43 100644
--- a/drivers/gpu/drm/radeon/reg_srcs/evergreen
+++ b/drivers/gpu/drm/radeon/reg_srcs/evergreen
@@ -1,4 +1,5 @@
1evergreen 0x9400 1evergreen 0x9400
20x0000802C GRBM_GFX_INDEX
20x00008040 WAIT_UNTIL 30x00008040 WAIT_UNTIL
30x00008044 WAIT_UNTIL_POLL_CNTL 40x00008044 WAIT_UNTIL_POLL_CNTL
40x00008048 WAIT_UNTIL_POLL_MASK 50x00008048 WAIT_UNTIL_POLL_MASK
@@ -22,6 +23,10 @@ evergreen 0x9400
220x00008B10 PA_SC_LINE_STIPPLE_STATE 230x00008B10 PA_SC_LINE_STIPPLE_STATE
230x00008BF0 PA_SC_ENHANCE 240x00008BF0 PA_SC_ENHANCE
240x00008D8C SQ_DYN_GPR_CNTL_PS_FLUSH_REQ 250x00008D8C SQ_DYN_GPR_CNTL_PS_FLUSH_REQ
260x00008D90 SQ_DYN_GPR_OPTIMIZATION
270x00008D94 SQ_DYN_GPR_SIMD_LOCK_EN
280x00008D98 SQ_DYN_GPR_THREAD_LIMIT
290x00008D9C SQ_DYN_GPR_LDS_LIMIT
250x00008C00 SQ_CONFIG 300x00008C00 SQ_CONFIG
260x00008C04 SQ_GPR_RESOURCE_MGMT_1 310x00008C04 SQ_GPR_RESOURCE_MGMT_1
270x00008C08 SQ_GPR_RESOURCE_MGMT_2 320x00008C08 SQ_GPR_RESOURCE_MGMT_2
@@ -34,9 +39,14 @@ evergreen 0x9400
340x00008C24 SQ_STACK_RESOURCE_MGMT_2 390x00008C24 SQ_STACK_RESOURCE_MGMT_2
350x00008C28 SQ_STACK_RESOURCE_MGMT_3 400x00008C28 SQ_STACK_RESOURCE_MGMT_3
360x00008DF8 SQ_CONST_MEM_BASE 410x00008DF8 SQ_CONST_MEM_BASE
420x00008E20 SQ_STATIC_THREAD_MGMT_1
430x00008E24 SQ_STATIC_THREAD_MGMT_2
440x00008E28 SQ_STATIC_THREAD_MGMT_3
450x00008E2C SQ_LDS_RESOURCE_MGMT
370x00008E48 SQ_EX_ALLOC_TABLE_SLOTS 460x00008E48 SQ_EX_ALLOC_TABLE_SLOTS
380x00009100 SPI_CONFIG_CNTL 470x00009100 SPI_CONFIG_CNTL
390x0000913C SPI_CONFIG_CNTL_1 480x0000913C SPI_CONFIG_CNTL_1
490x00009508 TA_CNTL_AUX
400x00009700 VC_CNTL 500x00009700 VC_CNTL
410x00009714 VC_ENHANCE 510x00009714 VC_ENHANCE
420x00009830 DB_DEBUG 520x00009830 DB_DEBUG
@@ -212,6 +222,7 @@ evergreen 0x9400
2120x00028348 PA_SC_VPORT_ZMIN_15 2220x00028348 PA_SC_VPORT_ZMIN_15
2130x0002834C PA_SC_VPORT_ZMAX_15 2230x0002834C PA_SC_VPORT_ZMAX_15
2140x00028350 SX_MISC 2240x00028350 SX_MISC
2250x00028354 SX_SURFACE_SYNC
2150x00028380 SQ_VTX_SEMANTIC_0 2260x00028380 SQ_VTX_SEMANTIC_0
2160x00028384 SQ_VTX_SEMANTIC_1 2270x00028384 SQ_VTX_SEMANTIC_1
2170x00028388 SQ_VTX_SEMANTIC_2 2280x00028388 SQ_VTX_SEMANTIC_2
@@ -431,7 +442,7 @@ evergreen 0x9400
4310x000286EC SPI_COMPUTE_NUM_THREAD_X 4420x000286EC SPI_COMPUTE_NUM_THREAD_X
4320x000286F0 SPI_COMPUTE_NUM_THREAD_Y 4430x000286F0 SPI_COMPUTE_NUM_THREAD_Y
4330x000286F4 SPI_COMPUTE_NUM_THREAD_Z 4440x000286F4 SPI_COMPUTE_NUM_THREAD_Z
4340x000286F8 GDS_ADDR_SIZE 4450x00028724 GDS_ADDR_SIZE
4350x00028780 CB_BLEND0_CONTROL 4460x00028780 CB_BLEND0_CONTROL
4360x00028784 CB_BLEND1_CONTROL 4470x00028784 CB_BLEND1_CONTROL
4370x00028788 CB_BLEND2_CONTROL 4480x00028788 CB_BLEND2_CONTROL
diff --git a/drivers/gpu/drm/radeon/reg_srcs/r300 b/drivers/gpu/drm/radeon/reg_srcs/r300
index b506ec1cab4b..e8a1786b6426 100644
--- a/drivers/gpu/drm/radeon/reg_srcs/r300
+++ b/drivers/gpu/drm/radeon/reg_srcs/r300
@@ -683,9 +683,7 @@ r300 0x4f60
6830x4DF4 US_ALU_CONST_G_31 6830x4DF4 US_ALU_CONST_G_31
6840x4DF8 US_ALU_CONST_B_31 6840x4DF8 US_ALU_CONST_B_31
6850x4DFC US_ALU_CONST_A_31 6850x4DFC US_ALU_CONST_A_31
6860x4E04 RB3D_BLENDCNTL_R3
6870x4E08 RB3D_ABLENDCNTL_R3 6860x4E08 RB3D_ABLENDCNTL_R3
6880x4E0C RB3D_COLOR_CHANNEL_MASK
6890x4E10 RB3D_CONSTANT_COLOR 6870x4E10 RB3D_CONSTANT_COLOR
6900x4E14 RB3D_COLOR_CLEAR_VALUE 6880x4E14 RB3D_COLOR_CLEAR_VALUE
6910x4E18 RB3D_ROPCNTL_R3 6890x4E18 RB3D_ROPCNTL_R3
@@ -706,13 +704,11 @@ r300 0x4f60
7060x4E74 RB3D_CMASK_WRINDEX 7040x4E74 RB3D_CMASK_WRINDEX
7070x4E78 RB3D_CMASK_DWORD 7050x4E78 RB3D_CMASK_DWORD
7080x4E7C RB3D_CMASK_RDINDEX 7060x4E7C RB3D_CMASK_RDINDEX
7090x4E80 RB3D_AARESOLVE_OFFSET
7100x4E84 RB3D_AARESOLVE_PITCH
7110x4E88 RB3D_AARESOLVE_CTL
7120x4EA0 RB3D_DISCARD_SRC_PIXEL_LTE_THRESHOLD 7070x4EA0 RB3D_DISCARD_SRC_PIXEL_LTE_THRESHOLD
7130x4EA4 RB3D_DISCARD_SRC_PIXEL_GTE_THRESHOLD 7080x4EA4 RB3D_DISCARD_SRC_PIXEL_GTE_THRESHOLD
7140x4F04 ZB_ZSTENCILCNTL 7090x4F04 ZB_ZSTENCILCNTL
7150x4F08 ZB_STENCILREFMASK 7100x4F08 ZB_STENCILREFMASK
7160x4F14 ZB_ZTOP 7110x4F14 ZB_ZTOP
7170x4F18 ZB_ZCACHE_CTLSTAT 7120x4F18 ZB_ZCACHE_CTLSTAT
7130x4F28 ZB_DEPTHCLEARVALUE
7180x4F58 ZB_ZPASS_DATA 7140x4F58 ZB_ZPASS_DATA
diff --git a/drivers/gpu/drm/radeon/reg_srcs/r420 b/drivers/gpu/drm/radeon/reg_srcs/r420
index 8c1214c2390f..722074e21e2f 100644
--- a/drivers/gpu/drm/radeon/reg_srcs/r420
+++ b/drivers/gpu/drm/radeon/reg_srcs/r420
@@ -130,7 +130,6 @@ r420 0x4f60
1300x401C GB_SELECT 1300x401C GB_SELECT
1310x4020 GB_AA_CONFIG 1310x4020 GB_AA_CONFIG
1320x4024 GB_FIFO_SIZE 1320x4024 GB_FIFO_SIZE
1330x4028 GB_Z_PEQ_CONFIG
1340x4100 TX_INVALTAGS 1330x4100 TX_INVALTAGS
1350x4200 GA_POINT_S0 1340x4200 GA_POINT_S0
1360x4204 GA_POINT_T0 1350x4204 GA_POINT_T0
@@ -750,9 +749,7 @@ r420 0x4f60
7500x4DF4 US_ALU_CONST_G_31 7490x4DF4 US_ALU_CONST_G_31
7510x4DF8 US_ALU_CONST_B_31 7500x4DF8 US_ALU_CONST_B_31
7520x4DFC US_ALU_CONST_A_31 7510x4DFC US_ALU_CONST_A_31
7530x4E04 RB3D_BLENDCNTL_R3
7540x4E08 RB3D_ABLENDCNTL_R3 7520x4E08 RB3D_ABLENDCNTL_R3
7550x4E0C RB3D_COLOR_CHANNEL_MASK
7560x4E10 RB3D_CONSTANT_COLOR 7530x4E10 RB3D_CONSTANT_COLOR
7570x4E14 RB3D_COLOR_CLEAR_VALUE 7540x4E14 RB3D_COLOR_CLEAR_VALUE
7580x4E18 RB3D_ROPCNTL_R3 7550x4E18 RB3D_ROPCNTL_R3
@@ -773,13 +770,11 @@ r420 0x4f60
7730x4E74 RB3D_CMASK_WRINDEX 7700x4E74 RB3D_CMASK_WRINDEX
7740x4E78 RB3D_CMASK_DWORD 7710x4E78 RB3D_CMASK_DWORD
7750x4E7C RB3D_CMASK_RDINDEX 7720x4E7C RB3D_CMASK_RDINDEX
7760x4E80 RB3D_AARESOLVE_OFFSET
7770x4E84 RB3D_AARESOLVE_PITCH
7780x4E88 RB3D_AARESOLVE_CTL
7790x4EA0 RB3D_DISCARD_SRC_PIXEL_LTE_THRESHOLD 7730x4EA0 RB3D_DISCARD_SRC_PIXEL_LTE_THRESHOLD
7800x4EA4 RB3D_DISCARD_SRC_PIXEL_GTE_THRESHOLD 7740x4EA4 RB3D_DISCARD_SRC_PIXEL_GTE_THRESHOLD
7810x4F04 ZB_ZSTENCILCNTL 7750x4F04 ZB_ZSTENCILCNTL
7820x4F08 ZB_STENCILREFMASK 7760x4F08 ZB_STENCILREFMASK
7830x4F14 ZB_ZTOP 7770x4F14 ZB_ZTOP
7840x4F18 ZB_ZCACHE_CTLSTAT 7780x4F18 ZB_ZCACHE_CTLSTAT
7790x4F28 ZB_DEPTHCLEARVALUE
7850x4F58 ZB_ZPASS_DATA 7800x4F58 ZB_ZPASS_DATA
diff --git a/drivers/gpu/drm/radeon/reg_srcs/r600 b/drivers/gpu/drm/radeon/reg_srcs/r600
index af0da4ae3f55..ea49752ee99c 100644
--- a/drivers/gpu/drm/radeon/reg_srcs/r600
+++ b/drivers/gpu/drm/radeon/reg_srcs/r600
@@ -708,6 +708,7 @@ r600 0x9400
7080x00028D0C DB_RENDER_CONTROL 7080x00028D0C DB_RENDER_CONTROL
7090x00028D10 DB_RENDER_OVERRIDE 7090x00028D10 DB_RENDER_OVERRIDE
7100x0002880C DB_SHADER_CONTROL 7100x0002880C DB_SHADER_CONTROL
7110x00028D28 DB_SRESULTS_COMPARE_STATE0
7110x00028D2C DB_SRESULTS_COMPARE_STATE1 7120x00028D2C DB_SRESULTS_COMPARE_STATE1
7120x00028430 DB_STENCILREFMASK 7130x00028430 DB_STENCILREFMASK
7130x00028434 DB_STENCILREFMASK_BF 7140x00028434 DB_STENCILREFMASK_BF
@@ -757,6 +758,5 @@ r600 0x9400
7570x00009714 VC_ENHANCE 7580x00009714 VC_ENHANCE
7580x00009830 DB_DEBUG 7590x00009830 DB_DEBUG
7590x00009838 DB_WATERMARKS 7600x00009838 DB_WATERMARKS
7600x00028D28 DB_SRESULTS_COMPARE_STATE0
7610x00028D44 DB_ALPHA_TO_MASK 7610x00028D44 DB_ALPHA_TO_MASK
7620x00009700 VC_CNTL 7620x00009700 VC_CNTL
diff --git a/drivers/gpu/drm/radeon/reg_srcs/rs600 b/drivers/gpu/drm/radeon/reg_srcs/rs600
index 0828d80396f2..d9f62866bbc1 100644
--- a/drivers/gpu/drm/radeon/reg_srcs/rs600
+++ b/drivers/gpu/drm/radeon/reg_srcs/rs600
@@ -749,9 +749,7 @@ rs600 0x6d40
7490x4DF4 US_ALU_CONST_G_31 7490x4DF4 US_ALU_CONST_G_31
7500x4DF8 US_ALU_CONST_B_31 7500x4DF8 US_ALU_CONST_B_31
7510x4DFC US_ALU_CONST_A_31 7510x4DFC US_ALU_CONST_A_31
7520x4E04 RB3D_BLENDCNTL_R3
7530x4E08 RB3D_ABLENDCNTL_R3 7520x4E08 RB3D_ABLENDCNTL_R3
7540x4E0C RB3D_COLOR_CHANNEL_MASK
7550x4E10 RB3D_CONSTANT_COLOR 7530x4E10 RB3D_CONSTANT_COLOR
7560x4E14 RB3D_COLOR_CLEAR_VALUE 7540x4E14 RB3D_COLOR_CLEAR_VALUE
7570x4E18 RB3D_ROPCNTL_R3 7550x4E18 RB3D_ROPCNTL_R3
@@ -772,13 +770,11 @@ rs600 0x6d40
7720x4E74 RB3D_CMASK_WRINDEX 7700x4E74 RB3D_CMASK_WRINDEX
7730x4E78 RB3D_CMASK_DWORD 7710x4E78 RB3D_CMASK_DWORD
7740x4E7C RB3D_CMASK_RDINDEX 7720x4E7C RB3D_CMASK_RDINDEX
7750x4E80 RB3D_AARESOLVE_OFFSET
7760x4E84 RB3D_AARESOLVE_PITCH
7770x4E88 RB3D_AARESOLVE_CTL
7780x4EA0 RB3D_DISCARD_SRC_PIXEL_LTE_THRESHOLD 7730x4EA0 RB3D_DISCARD_SRC_PIXEL_LTE_THRESHOLD
7790x4EA4 RB3D_DISCARD_SRC_PIXEL_GTE_THRESHOLD 7740x4EA4 RB3D_DISCARD_SRC_PIXEL_GTE_THRESHOLD
7800x4F04 ZB_ZSTENCILCNTL 7750x4F04 ZB_ZSTENCILCNTL
7810x4F08 ZB_STENCILREFMASK 7760x4F08 ZB_STENCILREFMASK
7820x4F14 ZB_ZTOP 7770x4F14 ZB_ZTOP
7830x4F18 ZB_ZCACHE_CTLSTAT 7780x4F18 ZB_ZCACHE_CTLSTAT
7790x4F28 ZB_DEPTHCLEARVALUE
7840x4F58 ZB_ZPASS_DATA 7800x4F58 ZB_ZPASS_DATA
diff --git a/drivers/gpu/drm/radeon/reg_srcs/rv515 b/drivers/gpu/drm/radeon/reg_srcs/rv515
index b3f9f1d92005..911a8fbd32bb 100644
--- a/drivers/gpu/drm/radeon/reg_srcs/rv515
+++ b/drivers/gpu/drm/radeon/reg_srcs/rv515
@@ -164,7 +164,6 @@ rv515 0x6d40
1640x401C GB_SELECT 1640x401C GB_SELECT
1650x4020 GB_AA_CONFIG 1650x4020 GB_AA_CONFIG
1660x4024 GB_FIFO_SIZE 1660x4024 GB_FIFO_SIZE
1670x4028 GB_Z_PEQ_CONFIG
1680x4100 TX_INVALTAGS 1670x4100 TX_INVALTAGS
1690x4114 SU_TEX_WRAP_PS3 1680x4114 SU_TEX_WRAP_PS3
1700x4118 PS3_ENABLE 1690x4118 PS3_ENABLE
@@ -304,6 +303,22 @@ rv515 0x6d40
3040x4630 US_CODE_ADDR 3030x4630 US_CODE_ADDR
3050x4634 US_CODE_RANGE 3040x4634 US_CODE_RANGE
3060x4638 US_CODE_OFFSET 3050x4638 US_CODE_OFFSET
3060x4640 US_FORMAT0_0
3070x4644 US_FORMAT0_1
3080x4648 US_FORMAT0_2
3090x464C US_FORMAT0_3
3100x4650 US_FORMAT0_4
3110x4654 US_FORMAT0_5
3120x4658 US_FORMAT0_6
3130x465C US_FORMAT0_7
3140x4660 US_FORMAT0_8
3150x4664 US_FORMAT0_9
3160x4668 US_FORMAT0_10
3170x466C US_FORMAT0_11
3180x4670 US_FORMAT0_12
3190x4674 US_FORMAT0_13
3200x4678 US_FORMAT0_14
3210x467C US_FORMAT0_15
3070x46A4 US_OUT_FMT_0 3220x46A4 US_OUT_FMT_0
3080x46A8 US_OUT_FMT_1 3230x46A8 US_OUT_FMT_1
3090x46AC US_OUT_FMT_2 3240x46AC US_OUT_FMT_2
@@ -445,9 +460,7 @@ rv515 0x6d40
4450x4DF4 US_ALU_CONST_G_31 4600x4DF4 US_ALU_CONST_G_31
4460x4DF8 US_ALU_CONST_B_31 4610x4DF8 US_ALU_CONST_B_31
4470x4DFC US_ALU_CONST_A_31 4620x4DFC US_ALU_CONST_A_31
4480x4E04 RB3D_BLENDCNTL_R3
4490x4E08 RB3D_ABLENDCNTL_R3 4630x4E08 RB3D_ABLENDCNTL_R3
4500x4E0C RB3D_COLOR_CHANNEL_MASK
4510x4E10 RB3D_CONSTANT_COLOR 4640x4E10 RB3D_CONSTANT_COLOR
4520x4E14 RB3D_COLOR_CLEAR_VALUE 4650x4E14 RB3D_COLOR_CLEAR_VALUE
4530x4E18 RB3D_ROPCNTL_R3 4660x4E18 RB3D_ROPCNTL_R3
@@ -468,9 +481,6 @@ rv515 0x6d40
4680x4E74 RB3D_CMASK_WRINDEX 4810x4E74 RB3D_CMASK_WRINDEX
4690x4E78 RB3D_CMASK_DWORD 4820x4E78 RB3D_CMASK_DWORD
4700x4E7C RB3D_CMASK_RDINDEX 4830x4E7C RB3D_CMASK_RDINDEX
4710x4E80 RB3D_AARESOLVE_OFFSET
4720x4E84 RB3D_AARESOLVE_PITCH
4730x4E88 RB3D_AARESOLVE_CTL
4740x4EA0 RB3D_DISCARD_SRC_PIXEL_LTE_THRESHOLD 4840x4EA0 RB3D_DISCARD_SRC_PIXEL_LTE_THRESHOLD
4750x4EA4 RB3D_DISCARD_SRC_PIXEL_GTE_THRESHOLD 4850x4EA4 RB3D_DISCARD_SRC_PIXEL_GTE_THRESHOLD
4760x4EF8 RB3D_CONSTANT_COLOR_AR 4860x4EF8 RB3D_CONSTANT_COLOR_AR
@@ -480,4 +490,5 @@ rv515 0x6d40
4800x4F14 ZB_ZTOP 4900x4F14 ZB_ZTOP
4810x4F18 ZB_ZCACHE_CTLSTAT 4910x4F18 ZB_ZCACHE_CTLSTAT
4820x4F58 ZB_ZPASS_DATA 4920x4F58 ZB_ZPASS_DATA
4930x4F28 ZB_DEPTHCLEARVALUE
4830x4FD4 ZB_STENCILREFMASK_BF 4940x4FD4 ZB_STENCILREFMASK_BF
diff --git a/drivers/gpu/drm/radeon/rs400.c b/drivers/gpu/drm/radeon/rs400.c
index ae2b76b9a388..aa6a66eeb4ec 100644
--- a/drivers/gpu/drm/radeon/rs400.c
+++ b/drivers/gpu/drm/radeon/rs400.c
@@ -78,7 +78,7 @@ int rs400_gart_init(struct radeon_device *rdev)
78 int r; 78 int r;
79 79
80 if (rdev->gart.table.ram.ptr) { 80 if (rdev->gart.table.ram.ptr) {
81 WARN(1, "RS400 GART already initialized.\n"); 81 WARN(1, "RS400 GART already initialized\n");
82 return 0; 82 return 0;
83 } 83 }
84 /* Check gart size */ 84 /* Check gart size */
@@ -203,6 +203,9 @@ void rs400_gart_fini(struct radeon_device *rdev)
203 radeon_gart_table_ram_free(rdev); 203 radeon_gart_table_ram_free(rdev);
204} 204}
205 205
206#define RS400_PTE_WRITEABLE (1 << 2)
207#define RS400_PTE_READABLE (1 << 3)
208
206int rs400_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr) 209int rs400_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr)
207{ 210{
208 uint32_t entry; 211 uint32_t entry;
@@ -213,7 +216,7 @@ int rs400_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr)
213 216
214 entry = (lower_32_bits(addr) & PAGE_MASK) | 217 entry = (lower_32_bits(addr) & PAGE_MASK) |
215 ((upper_32_bits(addr) & 0xff) << 4) | 218 ((upper_32_bits(addr) & 0xff) << 4) |
216 0xc; 219 RS400_PTE_WRITEABLE | RS400_PTE_READABLE;
217 entry = cpu_to_le32(entry); 220 entry = cpu_to_le32(entry);
218 rdev->gart.table.ram.ptr[i] = entry; 221 rdev->gart.table.ram.ptr[i] = entry;
219 return 0; 222 return 0;
@@ -226,8 +229,8 @@ int rs400_mc_wait_for_idle(struct radeon_device *rdev)
226 229
227 for (i = 0; i < rdev->usec_timeout; i++) { 230 for (i = 0; i < rdev->usec_timeout; i++) {
228 /* read MC_STATUS */ 231 /* read MC_STATUS */
229 tmp = RREG32(0x0150); 232 tmp = RREG32(RADEON_MC_STATUS);
230 if (tmp & (1 << 2)) { 233 if (tmp & RADEON_MC_IDLE) {
231 return 0; 234 return 0;
232 } 235 }
233 DRM_UDELAY(1); 236 DRM_UDELAY(1);
@@ -241,7 +244,7 @@ void rs400_gpu_init(struct radeon_device *rdev)
241 r420_pipes_init(rdev); 244 r420_pipes_init(rdev);
242 if (rs400_mc_wait_for_idle(rdev)) { 245 if (rs400_mc_wait_for_idle(rdev)) {
243 printk(KERN_WARNING "rs400: Failed to wait MC idle while " 246 printk(KERN_WARNING "rs400: Failed to wait MC idle while "
244 "programming pipes. Bad things might happen. %08x\n", RREG32(0x150)); 247 "programming pipes. Bad things might happen. %08x\n", RREG32(RADEON_MC_STATUS));
245 } 248 }
246} 249}
247 250
@@ -300,9 +303,9 @@ static int rs400_debugfs_gart_info(struct seq_file *m, void *data)
300 seq_printf(m, "MCCFG_AGP_BASE_2 0x%08x\n", tmp); 303 seq_printf(m, "MCCFG_AGP_BASE_2 0x%08x\n", tmp);
301 tmp = RREG32_MC(RS690_MCCFG_AGP_LOCATION); 304 tmp = RREG32_MC(RS690_MCCFG_AGP_LOCATION);
302 seq_printf(m, "MCCFG_AGP_LOCATION 0x%08x\n", tmp); 305 seq_printf(m, "MCCFG_AGP_LOCATION 0x%08x\n", tmp);
303 tmp = RREG32_MC(0x100); 306 tmp = RREG32_MC(RS690_MCCFG_FB_LOCATION);
304 seq_printf(m, "MCCFG_FB_LOCATION 0x%08x\n", tmp); 307 seq_printf(m, "MCCFG_FB_LOCATION 0x%08x\n", tmp);
305 tmp = RREG32(0x134); 308 tmp = RREG32(RS690_HDP_FB_LOCATION);
306 seq_printf(m, "HDP_FB_LOCATION 0x%08x\n", tmp); 309 seq_printf(m, "HDP_FB_LOCATION 0x%08x\n", tmp);
307 } else { 310 } else {
308 tmp = RREG32(RADEON_AGP_BASE); 311 tmp = RREG32(RADEON_AGP_BASE);
@@ -397,21 +400,24 @@ static int rs400_startup(struct radeon_device *rdev)
397 r = rs400_gart_enable(rdev); 400 r = rs400_gart_enable(rdev);
398 if (r) 401 if (r)
399 return r; 402 return r;
403
404 /* allocate wb buffer */
405 r = radeon_wb_init(rdev);
406 if (r)
407 return r;
408
400 /* Enable IRQ */ 409 /* Enable IRQ */
401 r100_irq_set(rdev); 410 r100_irq_set(rdev);
402 rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); 411 rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL);
403 /* 1M ring buffer */ 412 /* 1M ring buffer */
404 r = r100_cp_init(rdev, 1024 * 1024); 413 r = r100_cp_init(rdev, 1024 * 1024);
405 if (r) { 414 if (r) {
406 dev_err(rdev->dev, "failled initializing CP (%d).\n", r); 415 dev_err(rdev->dev, "failed initializing CP (%d).\n", r);
407 return r; 416 return r;
408 } 417 }
409 r = r100_wb_init(rdev);
410 if (r)
411 dev_err(rdev->dev, "failled initializing WB (%d).\n", r);
412 r = r100_ib_init(rdev); 418 r = r100_ib_init(rdev);
413 if (r) { 419 if (r) {
414 dev_err(rdev->dev, "failled initializing IB (%d).\n", r); 420 dev_err(rdev->dev, "failed initializing IB (%d).\n", r);
415 return r; 421 return r;
416 } 422 }
417 return 0; 423 return 0;
@@ -443,7 +449,7 @@ int rs400_resume(struct radeon_device *rdev)
443int rs400_suspend(struct radeon_device *rdev) 449int rs400_suspend(struct radeon_device *rdev)
444{ 450{
445 r100_cp_disable(rdev); 451 r100_cp_disable(rdev);
446 r100_wb_disable(rdev); 452 radeon_wb_disable(rdev);
447 r100_irq_disable(rdev); 453 r100_irq_disable(rdev);
448 rs400_gart_disable(rdev); 454 rs400_gart_disable(rdev);
449 return 0; 455 return 0;
@@ -452,7 +458,7 @@ int rs400_suspend(struct radeon_device *rdev)
452void rs400_fini(struct radeon_device *rdev) 458void rs400_fini(struct radeon_device *rdev)
453{ 459{
454 r100_cp_fini(rdev); 460 r100_cp_fini(rdev);
455 r100_wb_fini(rdev); 461 radeon_wb_fini(rdev);
456 r100_ib_fini(rdev); 462 r100_ib_fini(rdev);
457 radeon_gem_fini(rdev); 463 radeon_gem_fini(rdev);
458 rs400_gart_fini(rdev); 464 rs400_gart_fini(rdev);
@@ -526,7 +532,7 @@ int rs400_init(struct radeon_device *rdev)
526 /* Somethings want wront with the accel init stop accel */ 532 /* Somethings want wront with the accel init stop accel */
527 dev_err(rdev->dev, "Disabling GPU acceleration\n"); 533 dev_err(rdev->dev, "Disabling GPU acceleration\n");
528 r100_cp_fini(rdev); 534 r100_cp_fini(rdev);
529 r100_wb_fini(rdev); 535 radeon_wb_fini(rdev);
530 r100_ib_fini(rdev); 536 r100_ib_fini(rdev);
531 rs400_gart_fini(rdev); 537 rs400_gart_fini(rdev);
532 radeon_irq_kms_fini(rdev); 538 radeon_irq_kms_fini(rdev);
diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c
index 51d5f7b5ab21..1f5850e473cc 100644
--- a/drivers/gpu/drm/radeon/rs600.c
+++ b/drivers/gpu/drm/radeon/rs600.c
@@ -46,6 +46,45 @@
46void rs600_gpu_init(struct radeon_device *rdev); 46void rs600_gpu_init(struct radeon_device *rdev);
47int rs600_mc_wait_for_idle(struct radeon_device *rdev); 47int rs600_mc_wait_for_idle(struct radeon_device *rdev);
48 48
49void rs600_pre_page_flip(struct radeon_device *rdev, int crtc)
50{
51 /* enable the pflip int */
52 radeon_irq_kms_pflip_irq_get(rdev, crtc);
53}
54
55void rs600_post_page_flip(struct radeon_device *rdev, int crtc)
56{
57 /* disable the pflip int */
58 radeon_irq_kms_pflip_irq_put(rdev, crtc);
59}
60
61u32 rs600_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base)
62{
63 struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id];
64 u32 tmp = RREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset);
65
66 /* Lock the graphics update lock */
67 tmp |= AVIVO_D1GRPH_UPDATE_LOCK;
68 WREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset, tmp);
69
70 /* update the scanout addresses */
71 WREG32(AVIVO_D1GRPH_SECONDARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset,
72 (u32)crtc_base);
73 WREG32(AVIVO_D1GRPH_PRIMARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset,
74 (u32)crtc_base);
75
76 /* Wait for update_pending to go high. */
77 while (!(RREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset) & AVIVO_D1GRPH_SURFACE_UPDATE_PENDING));
78 DRM_DEBUG("Update pending now high. Unlocking vupdate_lock.\n");
79
80 /* Unlock the lock, so double-buffering can take place inside vblank */
81 tmp &= ~AVIVO_D1GRPH_UPDATE_LOCK;
82 WREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset, tmp);
83
84 /* Return current update_pending status: */
85 return RREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset) & AVIVO_D1GRPH_SURFACE_UPDATE_PENDING;
86}
87
49void rs600_pm_misc(struct radeon_device *rdev) 88void rs600_pm_misc(struct radeon_device *rdev)
50{ 89{
51 int requested_index = rdev->pm.requested_power_state_index; 90 int requested_index = rdev->pm.requested_power_state_index;
@@ -75,7 +114,7 @@ void rs600_pm_misc(struct radeon_device *rdev)
75 udelay(voltage->delay); 114 udelay(voltage->delay);
76 } 115 }
77 } else if (voltage->type == VOLTAGE_VDDC) 116 } else if (voltage->type == VOLTAGE_VDDC)
78 radeon_atom_set_voltage(rdev, voltage->vddc_id); 117 radeon_atom_set_voltage(rdev, voltage->vddc_id, SET_VOLTAGE_TYPE_ASIC_VDDC);
79 118
80 dyn_pwrmgt_sclk_length = RREG32_PLL(DYN_PWRMGT_SCLK_LENGTH); 119 dyn_pwrmgt_sclk_length = RREG32_PLL(DYN_PWRMGT_SCLK_LENGTH);
81 dyn_pwrmgt_sclk_length &= ~REDUCED_POWER_SCLK_HILEN(0xf); 120 dyn_pwrmgt_sclk_length &= ~REDUCED_POWER_SCLK_HILEN(0xf);
@@ -289,16 +328,16 @@ void rs600_bm_disable(struct radeon_device *rdev)
289 328
290int rs600_asic_reset(struct radeon_device *rdev) 329int rs600_asic_reset(struct radeon_device *rdev)
291{ 330{
292 u32 status, tmp;
293
294 struct rv515_mc_save save; 331 struct rv515_mc_save save;
332 u32 status, tmp;
333 int ret = 0;
295 334
296 /* Stops all mc clients */
297 rv515_mc_stop(rdev, &save);
298 status = RREG32(R_000E40_RBBM_STATUS); 335 status = RREG32(R_000E40_RBBM_STATUS);
299 if (!G_000E40_GUI_ACTIVE(status)) { 336 if (!G_000E40_GUI_ACTIVE(status)) {
300 return 0; 337 return 0;
301 } 338 }
339 /* Stops all mc clients */
340 rv515_mc_stop(rdev, &save);
302 status = RREG32(R_000E40_RBBM_STATUS); 341 status = RREG32(R_000E40_RBBM_STATUS);
303 dev_info(rdev->dev, "(%s:%d) RBBM_STATUS=0x%08X\n", __func__, __LINE__, status); 342 dev_info(rdev->dev, "(%s:%d) RBBM_STATUS=0x%08X\n", __func__, __LINE__, status);
304 /* stop CP */ 343 /* stop CP */
@@ -342,11 +381,11 @@ int rs600_asic_reset(struct radeon_device *rdev)
342 if (G_000E40_GA_BUSY(status) || G_000E40_VAP_BUSY(status)) { 381 if (G_000E40_GA_BUSY(status) || G_000E40_VAP_BUSY(status)) {
343 dev_err(rdev->dev, "failed to reset GPU\n"); 382 dev_err(rdev->dev, "failed to reset GPU\n");
344 rdev->gpu_lockup = true; 383 rdev->gpu_lockup = true;
345 return -1; 384 ret = -1;
346 } 385 } else
386 dev_info(rdev->dev, "GPU reset succeed\n");
347 rv515_mc_resume(rdev, &save); 387 rv515_mc_resume(rdev, &save);
348 dev_info(rdev->dev, "GPU reset succeed\n"); 388 return ret;
349 return 0;
350} 389}
351 390
352/* 391/*
@@ -375,7 +414,7 @@ int rs600_gart_init(struct radeon_device *rdev)
375 int r; 414 int r;
376 415
377 if (rdev->gart.table.vram.robj) { 416 if (rdev->gart.table.vram.robj) {
378 WARN(1, "RS600 GART already initialized.\n"); 417 WARN(1, "RS600 GART already initialized\n");
379 return 0; 418 return 0;
380 } 419 }
381 /* Initialize common gart structure */ 420 /* Initialize common gart structure */
@@ -387,7 +426,7 @@ int rs600_gart_init(struct radeon_device *rdev)
387 return radeon_gart_table_vram_alloc(rdev); 426 return radeon_gart_table_vram_alloc(rdev);
388} 427}
389 428
390int rs600_gart_enable(struct radeon_device *rdev) 429static int rs600_gart_enable(struct radeon_device *rdev)
391{ 430{
392 u32 tmp; 431 u32 tmp;
393 int r, i; 432 int r, i;
@@ -401,8 +440,8 @@ int rs600_gart_enable(struct radeon_device *rdev)
401 return r; 440 return r;
402 radeon_gart_restore(rdev); 441 radeon_gart_restore(rdev);
403 /* Enable bus master */ 442 /* Enable bus master */
404 tmp = RREG32(R_00004C_BUS_CNTL) & C_00004C_BUS_MASTER_DIS; 443 tmp = RREG32(RADEON_BUS_CNTL) & ~RS600_BUS_MASTER_DIS;
405 WREG32(R_00004C_BUS_CNTL, tmp); 444 WREG32(RADEON_BUS_CNTL, tmp);
406 /* FIXME: setup default page */ 445 /* FIXME: setup default page */
407 WREG32_MC(R_000100_MC_PT0_CNTL, 446 WREG32_MC(R_000100_MC_PT0_CNTL,
408 (S_000100_EFFECTIVE_L2_CACHE_SIZE(6) | 447 (S_000100_EFFECTIVE_L2_CACHE_SIZE(6) |
@@ -505,7 +544,7 @@ int rs600_irq_set(struct radeon_device *rdev)
505 ~S_007D18_DC_HOT_PLUG_DETECT2_INT_EN(1); 544 ~S_007D18_DC_HOT_PLUG_DETECT2_INT_EN(1);
506 545
507 if (!rdev->irq.installed) { 546 if (!rdev->irq.installed) {
508 WARN(1, "Can't enable IRQ/MSI because no handler is installed.\n"); 547 WARN(1, "Can't enable IRQ/MSI because no handler is installed\n");
509 WREG32(R_000040_GEN_INT_CNTL, 0); 548 WREG32(R_000040_GEN_INT_CNTL, 0);
510 return -EINVAL; 549 return -EINVAL;
511 } 550 }
@@ -515,10 +554,12 @@ int rs600_irq_set(struct radeon_device *rdev)
515 if (rdev->irq.gui_idle) { 554 if (rdev->irq.gui_idle) {
516 tmp |= S_000040_GUI_IDLE(1); 555 tmp |= S_000040_GUI_IDLE(1);
517 } 556 }
518 if (rdev->irq.crtc_vblank_int[0]) { 557 if (rdev->irq.crtc_vblank_int[0] ||
558 rdev->irq.pflip[0]) {
519 mode_int |= S_006540_D1MODE_VBLANK_INT_MASK(1); 559 mode_int |= S_006540_D1MODE_VBLANK_INT_MASK(1);
520 } 560 }
521 if (rdev->irq.crtc_vblank_int[1]) { 561 if (rdev->irq.crtc_vblank_int[1] ||
562 rdev->irq.pflip[1]) {
522 mode_int |= S_006540_D2MODE_VBLANK_INT_MASK(1); 563 mode_int |= S_006540_D2MODE_VBLANK_INT_MASK(1);
523 } 564 }
524 if (rdev->irq.hpd[0]) { 565 if (rdev->irq.hpd[0]) {
@@ -534,7 +575,7 @@ int rs600_irq_set(struct radeon_device *rdev)
534 return 0; 575 return 0;
535} 576}
536 577
537static inline uint32_t rs600_irq_ack(struct radeon_device *rdev, u32 *r500_disp_int) 578static inline u32 rs600_irq_ack(struct radeon_device *rdev)
538{ 579{
539 uint32_t irqs = RREG32(R_000044_GEN_INT_STATUS); 580 uint32_t irqs = RREG32(R_000044_GEN_INT_STATUS);
540 uint32_t irq_mask = S_000044_SW_INT(1); 581 uint32_t irq_mask = S_000044_SW_INT(1);
@@ -547,27 +588,27 @@ static inline uint32_t rs600_irq_ack(struct radeon_device *rdev, u32 *r500_disp_
547 } 588 }
548 589
549 if (G_000044_DISPLAY_INT_STAT(irqs)) { 590 if (G_000044_DISPLAY_INT_STAT(irqs)) {
550 *r500_disp_int = RREG32(R_007EDC_DISP_INTERRUPT_STATUS); 591 rdev->irq.stat_regs.r500.disp_int = RREG32(R_007EDC_DISP_INTERRUPT_STATUS);
551 if (G_007EDC_LB_D1_VBLANK_INTERRUPT(*r500_disp_int)) { 592 if (G_007EDC_LB_D1_VBLANK_INTERRUPT(rdev->irq.stat_regs.r500.disp_int)) {
552 WREG32(R_006534_D1MODE_VBLANK_STATUS, 593 WREG32(R_006534_D1MODE_VBLANK_STATUS,
553 S_006534_D1MODE_VBLANK_ACK(1)); 594 S_006534_D1MODE_VBLANK_ACK(1));
554 } 595 }
555 if (G_007EDC_LB_D2_VBLANK_INTERRUPT(*r500_disp_int)) { 596 if (G_007EDC_LB_D2_VBLANK_INTERRUPT(rdev->irq.stat_regs.r500.disp_int)) {
556 WREG32(R_006D34_D2MODE_VBLANK_STATUS, 597 WREG32(R_006D34_D2MODE_VBLANK_STATUS,
557 S_006D34_D2MODE_VBLANK_ACK(1)); 598 S_006D34_D2MODE_VBLANK_ACK(1));
558 } 599 }
559 if (G_007EDC_DC_HOT_PLUG_DETECT1_INTERRUPT(*r500_disp_int)) { 600 if (G_007EDC_DC_HOT_PLUG_DETECT1_INTERRUPT(rdev->irq.stat_regs.r500.disp_int)) {
560 tmp = RREG32(R_007D08_DC_HOT_PLUG_DETECT1_INT_CONTROL); 601 tmp = RREG32(R_007D08_DC_HOT_PLUG_DETECT1_INT_CONTROL);
561 tmp |= S_007D08_DC_HOT_PLUG_DETECT1_INT_ACK(1); 602 tmp |= S_007D08_DC_HOT_PLUG_DETECT1_INT_ACK(1);
562 WREG32(R_007D08_DC_HOT_PLUG_DETECT1_INT_CONTROL, tmp); 603 WREG32(R_007D08_DC_HOT_PLUG_DETECT1_INT_CONTROL, tmp);
563 } 604 }
564 if (G_007EDC_DC_HOT_PLUG_DETECT2_INTERRUPT(*r500_disp_int)) { 605 if (G_007EDC_DC_HOT_PLUG_DETECT2_INTERRUPT(rdev->irq.stat_regs.r500.disp_int)) {
565 tmp = RREG32(R_007D18_DC_HOT_PLUG_DETECT2_INT_CONTROL); 606 tmp = RREG32(R_007D18_DC_HOT_PLUG_DETECT2_INT_CONTROL);
566 tmp |= S_007D18_DC_HOT_PLUG_DETECT2_INT_ACK(1); 607 tmp |= S_007D18_DC_HOT_PLUG_DETECT2_INT_ACK(1);
567 WREG32(R_007D18_DC_HOT_PLUG_DETECT2_INT_CONTROL, tmp); 608 WREG32(R_007D18_DC_HOT_PLUG_DETECT2_INT_CONTROL, tmp);
568 } 609 }
569 } else { 610 } else {
570 *r500_disp_int = 0; 611 rdev->irq.stat_regs.r500.disp_int = 0;
571 } 612 }
572 613
573 if (irqs) { 614 if (irqs) {
@@ -578,32 +619,30 @@ static inline uint32_t rs600_irq_ack(struct radeon_device *rdev, u32 *r500_disp_
578 619
579void rs600_irq_disable(struct radeon_device *rdev) 620void rs600_irq_disable(struct radeon_device *rdev)
580{ 621{
581 u32 tmp;
582
583 WREG32(R_000040_GEN_INT_CNTL, 0); 622 WREG32(R_000040_GEN_INT_CNTL, 0);
584 WREG32(R_006540_DxMODE_INT_MASK, 0); 623 WREG32(R_006540_DxMODE_INT_MASK, 0);
585 /* Wait and acknowledge irq */ 624 /* Wait and acknowledge irq */
586 mdelay(1); 625 mdelay(1);
587 rs600_irq_ack(rdev, &tmp); 626 rs600_irq_ack(rdev);
588} 627}
589 628
590int rs600_irq_process(struct radeon_device *rdev) 629int rs600_irq_process(struct radeon_device *rdev)
591{ 630{
592 uint32_t status, msi_rearm; 631 u32 status, msi_rearm;
593 uint32_t r500_disp_int;
594 bool queue_hotplug = false; 632 bool queue_hotplug = false;
595 633
596 /* reset gui idle ack. the status bit is broken */ 634 /* reset gui idle ack. the status bit is broken */
597 rdev->irq.gui_idle_acked = false; 635 rdev->irq.gui_idle_acked = false;
598 636
599 status = rs600_irq_ack(rdev, &r500_disp_int); 637 status = rs600_irq_ack(rdev);
600 if (!status && !r500_disp_int) { 638 if (!status && !rdev->irq.stat_regs.r500.disp_int) {
601 return IRQ_NONE; 639 return IRQ_NONE;
602 } 640 }
603 while (status || r500_disp_int) { 641 while (status || rdev->irq.stat_regs.r500.disp_int) {
604 /* SW interrupt */ 642 /* SW interrupt */
605 if (G_000044_SW_INT(status)) 643 if (G_000044_SW_INT(status)) {
606 radeon_fence_process(rdev); 644 radeon_fence_process(rdev);
645 }
607 /* GUI idle */ 646 /* GUI idle */
608 if (G_000040_GUI_IDLE(status)) { 647 if (G_000040_GUI_IDLE(status)) {
609 rdev->irq.gui_idle_acked = true; 648 rdev->irq.gui_idle_acked = true;
@@ -611,30 +650,38 @@ int rs600_irq_process(struct radeon_device *rdev)
611 wake_up(&rdev->irq.idle_queue); 650 wake_up(&rdev->irq.idle_queue);
612 } 651 }
613 /* Vertical blank interrupts */ 652 /* Vertical blank interrupts */
614 if (G_007EDC_LB_D1_VBLANK_INTERRUPT(r500_disp_int)) { 653 if (G_007EDC_LB_D1_VBLANK_INTERRUPT(rdev->irq.stat_regs.r500.disp_int)) {
615 drm_handle_vblank(rdev->ddev, 0); 654 if (rdev->irq.crtc_vblank_int[0]) {
616 rdev->pm.vblank_sync = true; 655 drm_handle_vblank(rdev->ddev, 0);
617 wake_up(&rdev->irq.vblank_queue); 656 rdev->pm.vblank_sync = true;
657 wake_up(&rdev->irq.vblank_queue);
658 }
659 if (rdev->irq.pflip[0])
660 radeon_crtc_handle_flip(rdev, 0);
618 } 661 }
619 if (G_007EDC_LB_D2_VBLANK_INTERRUPT(r500_disp_int)) { 662 if (G_007EDC_LB_D2_VBLANK_INTERRUPT(rdev->irq.stat_regs.r500.disp_int)) {
620 drm_handle_vblank(rdev->ddev, 1); 663 if (rdev->irq.crtc_vblank_int[1]) {
621 rdev->pm.vblank_sync = true; 664 drm_handle_vblank(rdev->ddev, 1);
622 wake_up(&rdev->irq.vblank_queue); 665 rdev->pm.vblank_sync = true;
666 wake_up(&rdev->irq.vblank_queue);
667 }
668 if (rdev->irq.pflip[1])
669 radeon_crtc_handle_flip(rdev, 1);
623 } 670 }
624 if (G_007EDC_DC_HOT_PLUG_DETECT1_INTERRUPT(r500_disp_int)) { 671 if (G_007EDC_DC_HOT_PLUG_DETECT1_INTERRUPT(rdev->irq.stat_regs.r500.disp_int)) {
625 queue_hotplug = true; 672 queue_hotplug = true;
626 DRM_DEBUG("HPD1\n"); 673 DRM_DEBUG("HPD1\n");
627 } 674 }
628 if (G_007EDC_DC_HOT_PLUG_DETECT2_INTERRUPT(r500_disp_int)) { 675 if (G_007EDC_DC_HOT_PLUG_DETECT2_INTERRUPT(rdev->irq.stat_regs.r500.disp_int)) {
629 queue_hotplug = true; 676 queue_hotplug = true;
630 DRM_DEBUG("HPD2\n"); 677 DRM_DEBUG("HPD2\n");
631 } 678 }
632 status = rs600_irq_ack(rdev, &r500_disp_int); 679 status = rs600_irq_ack(rdev);
633 } 680 }
634 /* reset gui idle ack. the status bit is broken */ 681 /* reset gui idle ack. the status bit is broken */
635 rdev->irq.gui_idle_acked = false; 682 rdev->irq.gui_idle_acked = false;
636 if (queue_hotplug) 683 if (queue_hotplug)
637 queue_work(rdev->wq, &rdev->hotplug_work); 684 schedule_work(&rdev->hotplug_work);
638 if (rdev->msi_enabled) { 685 if (rdev->msi_enabled) {
639 switch (rdev->family) { 686 switch (rdev->family) {
640 case CHIP_RS600: 687 case CHIP_RS600:
@@ -693,7 +740,6 @@ void rs600_mc_init(struct radeon_device *rdev)
693 rdev->mc.real_vram_size = RREG32(RADEON_CONFIG_MEMSIZE); 740 rdev->mc.real_vram_size = RREG32(RADEON_CONFIG_MEMSIZE);
694 rdev->mc.mc_vram_size = rdev->mc.real_vram_size; 741 rdev->mc.mc_vram_size = rdev->mc.real_vram_size;
695 rdev->mc.visible_vram_size = rdev->mc.aper_size; 742 rdev->mc.visible_vram_size = rdev->mc.aper_size;
696 rdev->mc.active_vram_size = rdev->mc.visible_vram_size;
697 rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev); 743 rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev);
698 base = RREG32_MC(R_000004_MC_FB_LOCATION); 744 base = RREG32_MC(R_000004_MC_FB_LOCATION);
699 base = G_000004_MC_FB_START(base) << 16; 745 base = G_000004_MC_FB_START(base) << 16;
@@ -796,21 +842,24 @@ static int rs600_startup(struct radeon_device *rdev)
796 r = rs600_gart_enable(rdev); 842 r = rs600_gart_enable(rdev);
797 if (r) 843 if (r)
798 return r; 844 return r;
845
846 /* allocate wb buffer */
847 r = radeon_wb_init(rdev);
848 if (r)
849 return r;
850
799 /* Enable IRQ */ 851 /* Enable IRQ */
800 rs600_irq_set(rdev); 852 rs600_irq_set(rdev);
801 rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); 853 rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL);
802 /* 1M ring buffer */ 854 /* 1M ring buffer */
803 r = r100_cp_init(rdev, 1024 * 1024); 855 r = r100_cp_init(rdev, 1024 * 1024);
804 if (r) { 856 if (r) {
805 dev_err(rdev->dev, "failled initializing CP (%d).\n", r); 857 dev_err(rdev->dev, "failed initializing CP (%d).\n", r);
806 return r; 858 return r;
807 } 859 }
808 r = r100_wb_init(rdev);
809 if (r)
810 dev_err(rdev->dev, "failled initializing WB (%d).\n", r);
811 r = r100_ib_init(rdev); 860 r = r100_ib_init(rdev);
812 if (r) { 861 if (r) {
813 dev_err(rdev->dev, "failled initializing IB (%d).\n", r); 862 dev_err(rdev->dev, "failed initializing IB (%d).\n", r);
814 return r; 863 return r;
815 } 864 }
816 865
@@ -848,7 +897,7 @@ int rs600_suspend(struct radeon_device *rdev)
848{ 897{
849 r600_audio_fini(rdev); 898 r600_audio_fini(rdev);
850 r100_cp_disable(rdev); 899 r100_cp_disable(rdev);
851 r100_wb_disable(rdev); 900 radeon_wb_disable(rdev);
852 rs600_irq_disable(rdev); 901 rs600_irq_disable(rdev);
853 rs600_gart_disable(rdev); 902 rs600_gart_disable(rdev);
854 return 0; 903 return 0;
@@ -858,7 +907,7 @@ void rs600_fini(struct radeon_device *rdev)
858{ 907{
859 r600_audio_fini(rdev); 908 r600_audio_fini(rdev);
860 r100_cp_fini(rdev); 909 r100_cp_fini(rdev);
861 r100_wb_fini(rdev); 910 radeon_wb_fini(rdev);
862 r100_ib_fini(rdev); 911 r100_ib_fini(rdev);
863 radeon_gem_fini(rdev); 912 radeon_gem_fini(rdev);
864 rs600_gart_fini(rdev); 913 rs600_gart_fini(rdev);
@@ -932,7 +981,7 @@ int rs600_init(struct radeon_device *rdev)
932 /* Somethings want wront with the accel init stop accel */ 981 /* Somethings want wront with the accel init stop accel */
933 dev_err(rdev->dev, "Disabling GPU acceleration\n"); 982 dev_err(rdev->dev, "Disabling GPU acceleration\n");
934 r100_cp_fini(rdev); 983 r100_cp_fini(rdev);
935 r100_wb_fini(rdev); 984 radeon_wb_fini(rdev);
936 r100_ib_fini(rdev); 985 r100_ib_fini(rdev);
937 rs600_gart_fini(rdev); 986 rs600_gart_fini(rdev);
938 radeon_irq_kms_fini(rdev); 987 radeon_irq_kms_fini(rdev);
diff --git a/drivers/gpu/drm/radeon/rs690.c b/drivers/gpu/drm/radeon/rs690.c
index 4dc2a87ea680..a9049ed1a519 100644
--- a/drivers/gpu/drm/radeon/rs690.c
+++ b/drivers/gpu/drm/radeon/rs690.c
@@ -77,9 +77,9 @@ void rs690_pm_info(struct radeon_device *rdev)
77 switch (crev) { 77 switch (crev) {
78 case 1: 78 case 1:
79 tmp.full = dfixed_const(100); 79 tmp.full = dfixed_const(100);
80 rdev->pm.igp_sideport_mclk.full = dfixed_const(info->info.ulBootUpMemoryClock); 80 rdev->pm.igp_sideport_mclk.full = dfixed_const(le32_to_cpu(info->info.ulBootUpMemoryClock));
81 rdev->pm.igp_sideport_mclk.full = dfixed_div(rdev->pm.igp_sideport_mclk, tmp); 81 rdev->pm.igp_sideport_mclk.full = dfixed_div(rdev->pm.igp_sideport_mclk, tmp);
82 if (info->info.usK8MemoryClock) 82 if (le16_to_cpu(info->info.usK8MemoryClock))
83 rdev->pm.igp_system_mclk.full = dfixed_const(le16_to_cpu(info->info.usK8MemoryClock)); 83 rdev->pm.igp_system_mclk.full = dfixed_const(le16_to_cpu(info->info.usK8MemoryClock));
84 else if (rdev->clock.default_mclk) { 84 else if (rdev->clock.default_mclk) {
85 rdev->pm.igp_system_mclk.full = dfixed_const(rdev->clock.default_mclk); 85 rdev->pm.igp_system_mclk.full = dfixed_const(rdev->clock.default_mclk);
@@ -91,16 +91,16 @@ void rs690_pm_info(struct radeon_device *rdev)
91 break; 91 break;
92 case 2: 92 case 2:
93 tmp.full = dfixed_const(100); 93 tmp.full = dfixed_const(100);
94 rdev->pm.igp_sideport_mclk.full = dfixed_const(info->info_v2.ulBootUpSidePortClock); 94 rdev->pm.igp_sideport_mclk.full = dfixed_const(le32_to_cpu(info->info_v2.ulBootUpSidePortClock));
95 rdev->pm.igp_sideport_mclk.full = dfixed_div(rdev->pm.igp_sideport_mclk, tmp); 95 rdev->pm.igp_sideport_mclk.full = dfixed_div(rdev->pm.igp_sideport_mclk, tmp);
96 if (info->info_v2.ulBootUpUMAClock) 96 if (le32_to_cpu(info->info_v2.ulBootUpUMAClock))
97 rdev->pm.igp_system_mclk.full = dfixed_const(info->info_v2.ulBootUpUMAClock); 97 rdev->pm.igp_system_mclk.full = dfixed_const(le32_to_cpu(info->info_v2.ulBootUpUMAClock));
98 else if (rdev->clock.default_mclk) 98 else if (rdev->clock.default_mclk)
99 rdev->pm.igp_system_mclk.full = dfixed_const(rdev->clock.default_mclk); 99 rdev->pm.igp_system_mclk.full = dfixed_const(rdev->clock.default_mclk);
100 else 100 else
101 rdev->pm.igp_system_mclk.full = dfixed_const(66700); 101 rdev->pm.igp_system_mclk.full = dfixed_const(66700);
102 rdev->pm.igp_system_mclk.full = dfixed_div(rdev->pm.igp_system_mclk, tmp); 102 rdev->pm.igp_system_mclk.full = dfixed_div(rdev->pm.igp_system_mclk, tmp);
103 rdev->pm.igp_ht_link_clk.full = dfixed_const(info->info_v2.ulHTLinkFreq); 103 rdev->pm.igp_ht_link_clk.full = dfixed_const(le32_to_cpu(info->info_v2.ulHTLinkFreq));
104 rdev->pm.igp_ht_link_clk.full = dfixed_div(rdev->pm.igp_ht_link_clk, tmp); 104 rdev->pm.igp_ht_link_clk.full = dfixed_div(rdev->pm.igp_ht_link_clk, tmp);
105 rdev->pm.igp_ht_link_width.full = dfixed_const(le16_to_cpu(info->info_v2.usMinHTLinkWidth)); 105 rdev->pm.igp_ht_link_width.full = dfixed_const(le16_to_cpu(info->info_v2.usMinHTLinkWidth));
106 break; 106 break;
@@ -157,7 +157,6 @@ void rs690_mc_init(struct radeon_device *rdev)
157 rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0); 157 rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0);
158 rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0); 158 rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0);
159 rdev->mc.visible_vram_size = rdev->mc.aper_size; 159 rdev->mc.visible_vram_size = rdev->mc.aper_size;
160 rdev->mc.active_vram_size = rdev->mc.visible_vram_size;
161 base = RREG32_MC(R_000100_MCCFG_FB_LOCATION); 160 base = RREG32_MC(R_000100_MCCFG_FB_LOCATION);
162 base = G_000100_MC_FB_START(base) << 16; 161 base = G_000100_MC_FB_START(base) << 16;
163 rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev); 162 rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev);
@@ -616,21 +615,24 @@ static int rs690_startup(struct radeon_device *rdev)
616 r = rs400_gart_enable(rdev); 615 r = rs400_gart_enable(rdev);
617 if (r) 616 if (r)
618 return r; 617 return r;
618
619 /* allocate wb buffer */
620 r = radeon_wb_init(rdev);
621 if (r)
622 return r;
623
619 /* Enable IRQ */ 624 /* Enable IRQ */
620 rs600_irq_set(rdev); 625 rs600_irq_set(rdev);
621 rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); 626 rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL);
622 /* 1M ring buffer */ 627 /* 1M ring buffer */
623 r = r100_cp_init(rdev, 1024 * 1024); 628 r = r100_cp_init(rdev, 1024 * 1024);
624 if (r) { 629 if (r) {
625 dev_err(rdev->dev, "failled initializing CP (%d).\n", r); 630 dev_err(rdev->dev, "failed initializing CP (%d).\n", r);
626 return r; 631 return r;
627 } 632 }
628 r = r100_wb_init(rdev);
629 if (r)
630 dev_err(rdev->dev, "failled initializing WB (%d).\n", r);
631 r = r100_ib_init(rdev); 633 r = r100_ib_init(rdev);
632 if (r) { 634 if (r) {
633 dev_err(rdev->dev, "failled initializing IB (%d).\n", r); 635 dev_err(rdev->dev, "failed initializing IB (%d).\n", r);
634 return r; 636 return r;
635 } 637 }
636 638
@@ -668,7 +670,7 @@ int rs690_suspend(struct radeon_device *rdev)
668{ 670{
669 r600_audio_fini(rdev); 671 r600_audio_fini(rdev);
670 r100_cp_disable(rdev); 672 r100_cp_disable(rdev);
671 r100_wb_disable(rdev); 673 radeon_wb_disable(rdev);
672 rs600_irq_disable(rdev); 674 rs600_irq_disable(rdev);
673 rs400_gart_disable(rdev); 675 rs400_gart_disable(rdev);
674 return 0; 676 return 0;
@@ -678,7 +680,7 @@ void rs690_fini(struct radeon_device *rdev)
678{ 680{
679 r600_audio_fini(rdev); 681 r600_audio_fini(rdev);
680 r100_cp_fini(rdev); 682 r100_cp_fini(rdev);
681 r100_wb_fini(rdev); 683 radeon_wb_fini(rdev);
682 r100_ib_fini(rdev); 684 r100_ib_fini(rdev);
683 radeon_gem_fini(rdev); 685 radeon_gem_fini(rdev);
684 rs400_gart_fini(rdev); 686 rs400_gart_fini(rdev);
@@ -753,7 +755,7 @@ int rs690_init(struct radeon_device *rdev)
753 /* Somethings want wront with the accel init stop accel */ 755 /* Somethings want wront with the accel init stop accel */
754 dev_err(rdev->dev, "Disabling GPU acceleration\n"); 756 dev_err(rdev->dev, "Disabling GPU acceleration\n");
755 r100_cp_fini(rdev); 757 r100_cp_fini(rdev);
756 r100_wb_fini(rdev); 758 radeon_wb_fini(rdev);
757 r100_ib_fini(rdev); 759 r100_ib_fini(rdev);
758 rs400_gart_fini(rdev); 760 rs400_gart_fini(rdev);
759 radeon_irq_kms_fini(rdev); 761 radeon_irq_kms_fini(rdev);
diff --git a/drivers/gpu/drm/radeon/rv515.c b/drivers/gpu/drm/radeon/rv515.c
index 4d6e86041a9f..6613ee9ecca3 100644
--- a/drivers/gpu/drm/radeon/rv515.c
+++ b/drivers/gpu/drm/radeon/rv515.c
@@ -69,13 +69,13 @@ void rv515_ring_start(struct radeon_device *rdev)
69 ISYNC_CPSCRATCH_IDLEGUI); 69 ISYNC_CPSCRATCH_IDLEGUI);
70 radeon_ring_write(rdev, PACKET0(WAIT_UNTIL, 0)); 70 radeon_ring_write(rdev, PACKET0(WAIT_UNTIL, 0));
71 radeon_ring_write(rdev, WAIT_2D_IDLECLEAN | WAIT_3D_IDLECLEAN); 71 radeon_ring_write(rdev, WAIT_2D_IDLECLEAN | WAIT_3D_IDLECLEAN);
72 radeon_ring_write(rdev, PACKET0(0x170C, 0)); 72 radeon_ring_write(rdev, PACKET0(R300_DST_PIPE_CONFIG, 0));
73 radeon_ring_write(rdev, 1 << 31); 73 radeon_ring_write(rdev, R300_PIPE_AUTO_CONFIG);
74 radeon_ring_write(rdev, PACKET0(GB_SELECT, 0)); 74 radeon_ring_write(rdev, PACKET0(GB_SELECT, 0));
75 radeon_ring_write(rdev, 0); 75 radeon_ring_write(rdev, 0);
76 radeon_ring_write(rdev, PACKET0(GB_ENABLE, 0)); 76 radeon_ring_write(rdev, PACKET0(GB_ENABLE, 0));
77 radeon_ring_write(rdev, 0); 77 radeon_ring_write(rdev, 0);
78 radeon_ring_write(rdev, PACKET0(0x42C8, 0)); 78 radeon_ring_write(rdev, PACKET0(R500_SU_REG_DEST, 0));
79 radeon_ring_write(rdev, (1 << rdev->num_gb_pipes) - 1); 79 radeon_ring_write(rdev, (1 << rdev->num_gb_pipes) - 1);
80 radeon_ring_write(rdev, PACKET0(VAP_INDEX_OFFSET, 0)); 80 radeon_ring_write(rdev, PACKET0(VAP_INDEX_OFFSET, 0));
81 radeon_ring_write(rdev, 0); 81 radeon_ring_write(rdev, 0);
@@ -153,8 +153,8 @@ void rv515_gpu_init(struct radeon_device *rdev)
153 } 153 }
154 rv515_vga_render_disable(rdev); 154 rv515_vga_render_disable(rdev);
155 r420_pipes_init(rdev); 155 r420_pipes_init(rdev);
156 gb_pipe_select = RREG32(0x402C); 156 gb_pipe_select = RREG32(R400_GB_PIPE_SELECT);
157 tmp = RREG32(0x170C); 157 tmp = RREG32(R300_DST_PIPE_CONFIG);
158 pipe_select_current = (tmp >> 2) & 3; 158 pipe_select_current = (tmp >> 2) & 3;
159 tmp = (1 << pipe_select_current) | 159 tmp = (1 << pipe_select_current) |
160 (((gb_pipe_select >> 8) & 0xF) << 4); 160 (((gb_pipe_select >> 8) & 0xF) << 4);
@@ -386,21 +386,24 @@ static int rv515_startup(struct radeon_device *rdev)
386 if (r) 386 if (r)
387 return r; 387 return r;
388 } 388 }
389
390 /* allocate wb buffer */
391 r = radeon_wb_init(rdev);
392 if (r)
393 return r;
394
389 /* Enable IRQ */ 395 /* Enable IRQ */
390 rs600_irq_set(rdev); 396 rs600_irq_set(rdev);
391 rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); 397 rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL);
392 /* 1M ring buffer */ 398 /* 1M ring buffer */
393 r = r100_cp_init(rdev, 1024 * 1024); 399 r = r100_cp_init(rdev, 1024 * 1024);
394 if (r) { 400 if (r) {
395 dev_err(rdev->dev, "failled initializing CP (%d).\n", r); 401 dev_err(rdev->dev, "failed initializing CP (%d).\n", r);
396 return r; 402 return r;
397 } 403 }
398 r = r100_wb_init(rdev);
399 if (r)
400 dev_err(rdev->dev, "failled initializing WB (%d).\n", r);
401 r = r100_ib_init(rdev); 404 r = r100_ib_init(rdev);
402 if (r) { 405 if (r) {
403 dev_err(rdev->dev, "failled initializing IB (%d).\n", r); 406 dev_err(rdev->dev, "failed initializing IB (%d).\n", r);
404 return r; 407 return r;
405 } 408 }
406 return 0; 409 return 0;
@@ -431,7 +434,7 @@ int rv515_resume(struct radeon_device *rdev)
431int rv515_suspend(struct radeon_device *rdev) 434int rv515_suspend(struct radeon_device *rdev)
432{ 435{
433 r100_cp_disable(rdev); 436 r100_cp_disable(rdev);
434 r100_wb_disable(rdev); 437 radeon_wb_disable(rdev);
435 rs600_irq_disable(rdev); 438 rs600_irq_disable(rdev);
436 if (rdev->flags & RADEON_IS_PCIE) 439 if (rdev->flags & RADEON_IS_PCIE)
437 rv370_pcie_gart_disable(rdev); 440 rv370_pcie_gart_disable(rdev);
@@ -447,7 +450,7 @@ void rv515_set_safe_registers(struct radeon_device *rdev)
447void rv515_fini(struct radeon_device *rdev) 450void rv515_fini(struct radeon_device *rdev)
448{ 451{
449 r100_cp_fini(rdev); 452 r100_cp_fini(rdev);
450 r100_wb_fini(rdev); 453 radeon_wb_fini(rdev);
451 r100_ib_fini(rdev); 454 r100_ib_fini(rdev);
452 radeon_gem_fini(rdev); 455 radeon_gem_fini(rdev);
453 rv370_pcie_gart_fini(rdev); 456 rv370_pcie_gart_fini(rdev);
@@ -527,7 +530,7 @@ int rv515_init(struct radeon_device *rdev)
527 /* Somethings want wront with the accel init stop accel */ 530 /* Somethings want wront with the accel init stop accel */
528 dev_err(rdev->dev, "Disabling GPU acceleration\n"); 531 dev_err(rdev->dev, "Disabling GPU acceleration\n");
529 r100_cp_fini(rdev); 532 r100_cp_fini(rdev);
530 r100_wb_fini(rdev); 533 radeon_wb_fini(rdev);
531 r100_ib_fini(rdev); 534 r100_ib_fini(rdev);
532 radeon_irq_kms_fini(rdev); 535 radeon_irq_kms_fini(rdev);
533 rv370_pcie_gart_fini(rdev); 536 rv370_pcie_gart_fini(rdev);
diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c
index 9490da700749..4de51891aa6d 100644
--- a/drivers/gpu/drm/radeon/rv770.c
+++ b/drivers/gpu/drm/radeon/rv770.c
@@ -41,20 +41,60 @@
41 41
42static void rv770_gpu_init(struct radeon_device *rdev); 42static void rv770_gpu_init(struct radeon_device *rdev);
43void rv770_fini(struct radeon_device *rdev); 43void rv770_fini(struct radeon_device *rdev);
44static void rv770_pcie_gen2_enable(struct radeon_device *rdev);
45
46u32 rv770_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base)
47{
48 struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id];
49 u32 tmp = RREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset);
50
51 /* Lock the graphics update lock */
52 tmp |= AVIVO_D1GRPH_UPDATE_LOCK;
53 WREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset, tmp);
54
55 /* update the scanout addresses */
56 if (radeon_crtc->crtc_id) {
57 WREG32(D2GRPH_SECONDARY_SURFACE_ADDRESS_HIGH, upper_32_bits(crtc_base));
58 WREG32(D2GRPH_PRIMARY_SURFACE_ADDRESS_HIGH, upper_32_bits(crtc_base));
59 } else {
60 WREG32(D1GRPH_SECONDARY_SURFACE_ADDRESS_HIGH, upper_32_bits(crtc_base));
61 WREG32(D1GRPH_PRIMARY_SURFACE_ADDRESS_HIGH, upper_32_bits(crtc_base));
62 }
63 WREG32(D1GRPH_SECONDARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset,
64 (u32)crtc_base);
65 WREG32(D1GRPH_PRIMARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset,
66 (u32)crtc_base);
67
68 /* Wait for update_pending to go high. */
69 while (!(RREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset) & AVIVO_D1GRPH_SURFACE_UPDATE_PENDING));
70 DRM_DEBUG("Update pending now high. Unlocking vupdate_lock.\n");
71
72 /* Unlock the lock, so double-buffering can take place inside vblank */
73 tmp &= ~AVIVO_D1GRPH_UPDATE_LOCK;
74 WREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset, tmp);
75
76 /* Return current update_pending status: */
77 return RREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset) & AVIVO_D1GRPH_SURFACE_UPDATE_PENDING;
78}
44 79
45/* get temperature in millidegrees */ 80/* get temperature in millidegrees */
46u32 rv770_get_temp(struct radeon_device *rdev) 81int rv770_get_temp(struct radeon_device *rdev)
47{ 82{
48 u32 temp = (RREG32(CG_MULT_THERMAL_STATUS) & ASIC_T_MASK) >> 83 u32 temp = (RREG32(CG_MULT_THERMAL_STATUS) & ASIC_T_MASK) >>
49 ASIC_T_SHIFT; 84 ASIC_T_SHIFT;
50 u32 actual_temp = 0; 85 int actual_temp;
51 86
52 if ((temp >> 9) & 1) 87 if (temp & 0x400)
53 actual_temp = 0; 88 actual_temp = -256;
54 else 89 else if (temp & 0x200)
55 actual_temp = (temp >> 1) & 0xff; 90 actual_temp = 255;
56 91 else if (temp & 0x100) {
57 return actual_temp * 1000; 92 actual_temp = temp & 0x1ff;
93 actual_temp |= ~0x1ff;
94 } else
95 actual_temp = temp & 0xff;
96
97 return (actual_temp * 1000) / 2;
58} 98}
59 99
60void rv770_pm_misc(struct radeon_device *rdev) 100void rv770_pm_misc(struct radeon_device *rdev)
@@ -65,8 +105,11 @@ void rv770_pm_misc(struct radeon_device *rdev)
65 struct radeon_voltage *voltage = &ps->clock_info[req_cm_idx].voltage; 105 struct radeon_voltage *voltage = &ps->clock_info[req_cm_idx].voltage;
66 106
67 if ((voltage->type == VOLTAGE_SW) && voltage->voltage) { 107 if ((voltage->type == VOLTAGE_SW) && voltage->voltage) {
108 /* 0xff01 is a flag rather then an actual voltage */
109 if (voltage->voltage == 0xff01)
110 return;
68 if (voltage->voltage != rdev->pm.current_vddc) { 111 if (voltage->voltage != rdev->pm.current_vddc) {
69 radeon_atom_set_voltage(rdev, voltage->voltage); 112 radeon_atom_set_voltage(rdev, voltage->voltage, SET_VOLTAGE_TYPE_ASIC_VDDC);
70 rdev->pm.current_vddc = voltage->voltage; 113 rdev->pm.current_vddc = voltage->voltage;
71 DRM_DEBUG("Setting: v: %d\n", voltage->voltage); 114 DRM_DEBUG("Setting: v: %d\n", voltage->voltage);
72 } 115 }
@@ -267,8 +310,9 @@ static void rv770_mc_program(struct radeon_device *rdev)
267 */ 310 */
268void r700_cp_stop(struct radeon_device *rdev) 311void r700_cp_stop(struct radeon_device *rdev)
269{ 312{
270 rdev->mc.active_vram_size = rdev->mc.visible_vram_size; 313 radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
271 WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT)); 314 WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT));
315 WREG32(SCRATCH_UMSK, 0);
272} 316}
273 317
274static int rv770_cp_load_microcode(struct radeon_device *rdev) 318static int rv770_cp_load_microcode(struct radeon_device *rdev)
@@ -280,7 +324,11 @@ static int rv770_cp_load_microcode(struct radeon_device *rdev)
280 return -EINVAL; 324 return -EINVAL;
281 325
282 r700_cp_stop(rdev); 326 r700_cp_stop(rdev);
283 WREG32(CP_RB_CNTL, RB_NO_UPDATE | (15 << 8) | (3 << 0)); 327 WREG32(CP_RB_CNTL,
328#ifdef __BIG_ENDIAN
329 BUF_SWAP_32BIT |
330#endif
331 RB_NO_UPDATE | RB_BLKSZ(15) | RB_BUFSZ(3));
284 332
285 /* Reset cp */ 333 /* Reset cp */
286 WREG32(GRBM_SOFT_RESET, SOFT_RESET_CP); 334 WREG32(GRBM_SOFT_RESET, SOFT_RESET_CP);
@@ -488,6 +536,55 @@ static u32 r700_get_tile_pipe_to_backend_map(struct radeon_device *rdev,
488 return backend_map; 536 return backend_map;
489} 537}
490 538
539static void rv770_program_channel_remap(struct radeon_device *rdev)
540{
541 u32 tcp_chan_steer, mc_shared_chremap, tmp;
542 bool force_no_swizzle;
543
544 switch (rdev->family) {
545 case CHIP_RV770:
546 case CHIP_RV730:
547 force_no_swizzle = false;
548 break;
549 case CHIP_RV710:
550 case CHIP_RV740:
551 default:
552 force_no_swizzle = true;
553 break;
554 }
555
556 tmp = RREG32(MC_SHARED_CHMAP);
557 switch ((tmp & NOOFCHAN_MASK) >> NOOFCHAN_SHIFT) {
558 case 0:
559 case 1:
560 default:
561 /* default mapping */
562 mc_shared_chremap = 0x00fac688;
563 break;
564 case 2:
565 case 3:
566 if (force_no_swizzle)
567 mc_shared_chremap = 0x00fac688;
568 else
569 mc_shared_chremap = 0x00bbc298;
570 break;
571 }
572
573 if (rdev->family == CHIP_RV740)
574 tcp_chan_steer = 0x00ef2a60;
575 else
576 tcp_chan_steer = 0x00fac688;
577
578 /* RV770 CE has special chremap setup */
579 if (rdev->pdev->device == 0x944e) {
580 tcp_chan_steer = 0x00b08b08;
581 mc_shared_chremap = 0x00b08b08;
582 }
583
584 WREG32(TCP_CHAN_STEER, tcp_chan_steer);
585 WREG32(MC_SHARED_CHREMAP, mc_shared_chremap);
586}
587
491static void rv770_gpu_init(struct radeon_device *rdev) 588static void rv770_gpu_init(struct radeon_device *rdev)
492{ 589{
493 int i, j, num_qd_pipes; 590 int i, j, num_qd_pipes;
@@ -643,10 +740,11 @@ static void rv770_gpu_init(struct radeon_device *rdev)
643 else 740 else
644 gb_tiling_config |= BANK_TILING((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT); 741 gb_tiling_config |= BANK_TILING((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT);
645 rdev->config.rv770.tiling_nbanks = 4 << ((gb_tiling_config >> 4) & 0x3); 742 rdev->config.rv770.tiling_nbanks = 4 << ((gb_tiling_config >> 4) & 0x3);
646 743 gb_tiling_config |= GROUP_SIZE((mc_arb_ramcfg & BURSTLENGTH_MASK) >> BURSTLENGTH_SHIFT);
647 gb_tiling_config |= GROUP_SIZE(0); 744 if ((mc_arb_ramcfg & BURSTLENGTH_MASK) >> BURSTLENGTH_SHIFT)
648 rdev->config.rv770.tiling_group_size = 256; 745 rdev->config.rv770.tiling_group_size = 512;
649 746 else
747 rdev->config.rv770.tiling_group_size = 256;
650 if (((mc_arb_ramcfg & NOOFROWS_MASK) >> NOOFROWS_SHIFT) > 3) { 748 if (((mc_arb_ramcfg & NOOFROWS_MASK) >> NOOFROWS_SHIFT) > 3) {
651 gb_tiling_config |= ROW_TILING(3); 749 gb_tiling_config |= ROW_TILING(3);
652 gb_tiling_config |= SAMPLE_SPLIT(3); 750 gb_tiling_config |= SAMPLE_SPLIT(3);
@@ -686,6 +784,8 @@ static void rv770_gpu_init(struct radeon_device *rdev)
686 WREG32(DCP_TILING_CONFIG, (gb_tiling_config & 0xffff)); 784 WREG32(DCP_TILING_CONFIG, (gb_tiling_config & 0xffff));
687 WREG32(HDP_TILING_CONFIG, (gb_tiling_config & 0xffff)); 785 WREG32(HDP_TILING_CONFIG, (gb_tiling_config & 0xffff));
688 786
787 rv770_program_channel_remap(rdev);
788
689 WREG32(CC_RB_BACKEND_DISABLE, cc_rb_backend_disable); 789 WREG32(CC_RB_BACKEND_DISABLE, cc_rb_backend_disable);
690 WREG32(CC_GC_SHADER_PIPE_CONFIG, cc_gc_shader_pipe_config); 790 WREG32(CC_GC_SHADER_PIPE_CONFIG, cc_gc_shader_pipe_config);
691 WREG32(GC_USER_SHADER_PIPE_CONFIG, cc_gc_shader_pipe_config); 791 WREG32(GC_USER_SHADER_PIPE_CONFIG, cc_gc_shader_pipe_config);
@@ -912,9 +1012,9 @@ static int rv770_vram_scratch_init(struct radeon_device *rdev)
912 u64 gpu_addr; 1012 u64 gpu_addr;
913 1013
914 if (rdev->vram_scratch.robj == NULL) { 1014 if (rdev->vram_scratch.robj == NULL) {
915 r = radeon_bo_create(rdev, NULL, RADEON_GPU_PAGE_SIZE, 1015 r = radeon_bo_create(rdev, RADEON_GPU_PAGE_SIZE,
916 true, RADEON_GEM_DOMAIN_VRAM, 1016 PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM,
917 &rdev->vram_scratch.robj); 1017 &rdev->vram_scratch.robj);
918 if (r) { 1018 if (r) {
919 return r; 1019 return r;
920 } 1020 }
@@ -954,6 +1054,45 @@ static void rv770_vram_scratch_fini(struct radeon_device *rdev)
954 radeon_bo_unref(&rdev->vram_scratch.robj); 1054 radeon_bo_unref(&rdev->vram_scratch.robj);
955} 1055}
956 1056
1057void r700_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc)
1058{
1059 u64 size_bf, size_af;
1060
1061 if (mc->mc_vram_size > 0xE0000000) {
1062 /* leave room for at least 512M GTT */
1063 dev_warn(rdev->dev, "limiting VRAM\n");
1064 mc->real_vram_size = 0xE0000000;
1065 mc->mc_vram_size = 0xE0000000;
1066 }
1067 if (rdev->flags & RADEON_IS_AGP) {
1068 size_bf = mc->gtt_start;
1069 size_af = 0xFFFFFFFF - mc->gtt_end + 1;
1070 if (size_bf > size_af) {
1071 if (mc->mc_vram_size > size_bf) {
1072 dev_warn(rdev->dev, "limiting VRAM\n");
1073 mc->real_vram_size = size_bf;
1074 mc->mc_vram_size = size_bf;
1075 }
1076 mc->vram_start = mc->gtt_start - mc->mc_vram_size;
1077 } else {
1078 if (mc->mc_vram_size > size_af) {
1079 dev_warn(rdev->dev, "limiting VRAM\n");
1080 mc->real_vram_size = size_af;
1081 mc->mc_vram_size = size_af;
1082 }
1083 mc->vram_start = mc->gtt_end;
1084 }
1085 mc->vram_end = mc->vram_start + mc->mc_vram_size - 1;
1086 dev_info(rdev->dev, "VRAM: %lluM 0x%08llX - 0x%08llX (%lluM used)\n",
1087 mc->mc_vram_size >> 20, mc->vram_start,
1088 mc->vram_end, mc->real_vram_size >> 20);
1089 } else {
1090 radeon_vram_location(rdev, &rdev->mc, 0);
1091 rdev->mc.gtt_base_align = 0;
1092 radeon_gtt_location(rdev, mc);
1093 }
1094}
1095
957int rv770_mc_init(struct radeon_device *rdev) 1096int rv770_mc_init(struct radeon_device *rdev)
958{ 1097{
959 u32 tmp; 1098 u32 tmp;
@@ -993,8 +1132,7 @@ int rv770_mc_init(struct radeon_device *rdev)
993 rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE); 1132 rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE);
994 rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE); 1133 rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE);
995 rdev->mc.visible_vram_size = rdev->mc.aper_size; 1134 rdev->mc.visible_vram_size = rdev->mc.aper_size;
996 rdev->mc.active_vram_size = rdev->mc.visible_vram_size; 1135 r700_vram_gtt_location(rdev, &rdev->mc);
997 r600_vram_gtt_location(rdev, &rdev->mc);
998 radeon_update_bandwidth_info(rdev); 1136 radeon_update_bandwidth_info(rdev);
999 1137
1000 return 0; 1138 return 0;
@@ -1004,6 +1142,9 @@ static int rv770_startup(struct radeon_device *rdev)
1004{ 1142{
1005 int r; 1143 int r;
1006 1144
1145 /* enable pcie gen2 link */
1146 rv770_pcie_gen2_enable(rdev);
1147
1007 if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) { 1148 if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) {
1008 r = r600_init_microcode(rdev); 1149 r = r600_init_microcode(rdev);
1009 if (r) { 1150 if (r) {
@@ -1030,19 +1171,12 @@ static int rv770_startup(struct radeon_device *rdev)
1030 rdev->asic->copy = NULL; 1171 rdev->asic->copy = NULL;
1031 dev_warn(rdev->dev, "failed blitter (%d) falling back to memcpy\n", r); 1172 dev_warn(rdev->dev, "failed blitter (%d) falling back to memcpy\n", r);
1032 } 1173 }
1033 /* pin copy shader into vram */ 1174
1034 if (rdev->r600_blit.shader_obj) { 1175 /* allocate wb buffer */
1035 r = radeon_bo_reserve(rdev->r600_blit.shader_obj, false); 1176 r = radeon_wb_init(rdev);
1036 if (unlikely(r != 0)) 1177 if (r)
1037 return r; 1178 return r;
1038 r = radeon_bo_pin(rdev->r600_blit.shader_obj, RADEON_GEM_DOMAIN_VRAM, 1179
1039 &rdev->r600_blit.shader_gpu_addr);
1040 radeon_bo_unreserve(rdev->r600_blit.shader_obj);
1041 if (r) {
1042 DRM_ERROR("failed to pin blit object %d\n", r);
1043 return r;
1044 }
1045 }
1046 /* Enable IRQ */ 1180 /* Enable IRQ */
1047 r = r600_irq_init(rdev); 1181 r = r600_irq_init(rdev);
1048 if (r) { 1182 if (r) {
@@ -1061,8 +1195,7 @@ static int rv770_startup(struct radeon_device *rdev)
1061 r = r600_cp_resume(rdev); 1195 r = r600_cp_resume(rdev);
1062 if (r) 1196 if (r)
1063 return r; 1197 return r;
1064 /* write back buffer are not vital so don't worry about failure */ 1198
1065 r600_wb_enable(rdev);
1066 return 0; 1199 return 0;
1067} 1200}
1068 1201
@@ -1085,7 +1218,7 @@ int rv770_resume(struct radeon_device *rdev)
1085 1218
1086 r = r600_ib_test(rdev); 1219 r = r600_ib_test(rdev);
1087 if (r) { 1220 if (r) {
1088 DRM_ERROR("radeon: failled testing IB (%d).\n", r); 1221 DRM_ERROR("radeon: failed testing IB (%d).\n", r);
1089 return r; 1222 return r;
1090 } 1223 }
1091 1224
@@ -1108,7 +1241,7 @@ int rv770_suspend(struct radeon_device *rdev)
1108 r700_cp_stop(rdev); 1241 r700_cp_stop(rdev);
1109 rdev->cp.ready = false; 1242 rdev->cp.ready = false;
1110 r600_irq_suspend(rdev); 1243 r600_irq_suspend(rdev);
1111 r600_wb_disable(rdev); 1244 radeon_wb_disable(rdev);
1112 rv770_pcie_gart_disable(rdev); 1245 rv770_pcie_gart_disable(rdev);
1113 /* unpin shaders bo */ 1246 /* unpin shaders bo */
1114 if (rdev->r600_blit.shader_obj) { 1247 if (rdev->r600_blit.shader_obj) {
@@ -1131,9 +1264,6 @@ int rv770_init(struct radeon_device *rdev)
1131{ 1264{
1132 int r; 1265 int r;
1133 1266
1134 r = radeon_dummy_page_init(rdev);
1135 if (r)
1136 return r;
1137 /* This don't do much */ 1267 /* This don't do much */
1138 r = radeon_gem_init(rdev); 1268 r = radeon_gem_init(rdev);
1139 if (r) 1269 if (r)
@@ -1152,7 +1282,7 @@ int rv770_init(struct radeon_device *rdev)
1152 if (r) 1282 if (r)
1153 return r; 1283 return r;
1154 /* Post card if necessary */ 1284 /* Post card if necessary */
1155 if (!r600_card_posted(rdev)) { 1285 if (!radeon_card_posted(rdev)) {
1156 if (!rdev->bios) { 1286 if (!rdev->bios) {
1157 dev_err(rdev->dev, "Card not posted and no BIOS - ignoring\n"); 1287 dev_err(rdev->dev, "Card not posted and no BIOS - ignoring\n");
1158 return -EINVAL; 1288 return -EINVAL;
@@ -1203,8 +1333,8 @@ int rv770_init(struct radeon_device *rdev)
1203 if (r) { 1333 if (r) {
1204 dev_err(rdev->dev, "disabling GPU acceleration\n"); 1334 dev_err(rdev->dev, "disabling GPU acceleration\n");
1205 r700_cp_fini(rdev); 1335 r700_cp_fini(rdev);
1206 r600_wb_fini(rdev);
1207 r600_irq_fini(rdev); 1336 r600_irq_fini(rdev);
1337 radeon_wb_fini(rdev);
1208 radeon_irq_kms_fini(rdev); 1338 radeon_irq_kms_fini(rdev);
1209 rv770_pcie_gart_fini(rdev); 1339 rv770_pcie_gart_fini(rdev);
1210 rdev->accel_working = false; 1340 rdev->accel_working = false;
@@ -1236,8 +1366,9 @@ void rv770_fini(struct radeon_device *rdev)
1236{ 1366{
1237 r600_blit_fini(rdev); 1367 r600_blit_fini(rdev);
1238 r700_cp_fini(rdev); 1368 r700_cp_fini(rdev);
1239 r600_wb_fini(rdev);
1240 r600_irq_fini(rdev); 1369 r600_irq_fini(rdev);
1370 radeon_wb_fini(rdev);
1371 radeon_ib_pool_fini(rdev);
1241 radeon_irq_kms_fini(rdev); 1372 radeon_irq_kms_fini(rdev);
1242 rv770_pcie_gart_fini(rdev); 1373 rv770_pcie_gart_fini(rdev);
1243 rv770_vram_scratch_fini(rdev); 1374 rv770_vram_scratch_fini(rdev);
@@ -1248,5 +1379,79 @@ void rv770_fini(struct radeon_device *rdev)
1248 radeon_atombios_fini(rdev); 1379 radeon_atombios_fini(rdev);
1249 kfree(rdev->bios); 1380 kfree(rdev->bios);
1250 rdev->bios = NULL; 1381 rdev->bios = NULL;
1251 radeon_dummy_page_fini(rdev); 1382}
1383
1384static void rv770_pcie_gen2_enable(struct radeon_device *rdev)
1385{
1386 u32 link_width_cntl, lanes, speed_cntl, tmp;
1387 u16 link_cntl2;
1388
1389 if (radeon_pcie_gen2 == 0)
1390 return;
1391
1392 if (rdev->flags & RADEON_IS_IGP)
1393 return;
1394
1395 if (!(rdev->flags & RADEON_IS_PCIE))
1396 return;
1397
1398 /* x2 cards have a special sequence */
1399 if (ASIC_IS_X2(rdev))
1400 return;
1401
1402 /* advertise upconfig capability */
1403 link_width_cntl = RREG32_PCIE_P(PCIE_LC_LINK_WIDTH_CNTL);
1404 link_width_cntl &= ~LC_UPCONFIGURE_DIS;
1405 WREG32_PCIE_P(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
1406 link_width_cntl = RREG32_PCIE_P(PCIE_LC_LINK_WIDTH_CNTL);
1407 if (link_width_cntl & LC_RENEGOTIATION_SUPPORT) {
1408 lanes = (link_width_cntl & LC_LINK_WIDTH_RD_MASK) >> LC_LINK_WIDTH_RD_SHIFT;
1409 link_width_cntl &= ~(LC_LINK_WIDTH_MASK |
1410 LC_RECONFIG_ARC_MISSING_ESCAPE);
1411 link_width_cntl |= lanes | LC_RECONFIG_NOW |
1412 LC_RENEGOTIATE_EN | LC_UPCONFIGURE_SUPPORT;
1413 WREG32_PCIE_P(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
1414 } else {
1415 link_width_cntl |= LC_UPCONFIGURE_DIS;
1416 WREG32_PCIE_P(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
1417 }
1418
1419 speed_cntl = RREG32_PCIE_P(PCIE_LC_SPEED_CNTL);
1420 if ((speed_cntl & LC_OTHER_SIDE_EVER_SENT_GEN2) &&
1421 (speed_cntl & LC_OTHER_SIDE_SUPPORTS_GEN2)) {
1422
1423 tmp = RREG32(0x541c);
1424 WREG32(0x541c, tmp | 0x8);
1425 WREG32(MM_CFGREGS_CNTL, MM_WR_TO_CFG_EN);
1426 link_cntl2 = RREG16(0x4088);
1427 link_cntl2 &= ~TARGET_LINK_SPEED_MASK;
1428 link_cntl2 |= 0x2;
1429 WREG16(0x4088, link_cntl2);
1430 WREG32(MM_CFGREGS_CNTL, 0);
1431
1432 speed_cntl = RREG32_PCIE_P(PCIE_LC_SPEED_CNTL);
1433 speed_cntl &= ~LC_TARGET_LINK_SPEED_OVERRIDE_EN;
1434 WREG32_PCIE_P(PCIE_LC_SPEED_CNTL, speed_cntl);
1435
1436 speed_cntl = RREG32_PCIE_P(PCIE_LC_SPEED_CNTL);
1437 speed_cntl |= LC_CLR_FAILED_SPD_CHANGE_CNT;
1438 WREG32_PCIE_P(PCIE_LC_SPEED_CNTL, speed_cntl);
1439
1440 speed_cntl = RREG32_PCIE_P(PCIE_LC_SPEED_CNTL);
1441 speed_cntl &= ~LC_CLR_FAILED_SPD_CHANGE_CNT;
1442 WREG32_PCIE_P(PCIE_LC_SPEED_CNTL, speed_cntl);
1443
1444 speed_cntl = RREG32_PCIE_P(PCIE_LC_SPEED_CNTL);
1445 speed_cntl |= LC_GEN2_EN_STRAP;
1446 WREG32_PCIE_P(PCIE_LC_SPEED_CNTL, speed_cntl);
1447
1448 } else {
1449 link_width_cntl = RREG32_PCIE_P(PCIE_LC_LINK_WIDTH_CNTL);
1450 /* XXX: only disable it if gen1 bridge vendor == 0x111d or 0x1106 */
1451 if (1)
1452 link_width_cntl |= LC_UPCONFIGURE_DIS;
1453 else
1454 link_width_cntl &= ~LC_UPCONFIGURE_DIS;
1455 WREG32_PCIE_P(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
1456 }
1252} 1457}
diff --git a/drivers/gpu/drm/radeon/rv770d.h b/drivers/gpu/drm/radeon/rv770d.h
index b7a5a20e81dc..79fa588e9ed5 100644
--- a/drivers/gpu/drm/radeon/rv770d.h
+++ b/drivers/gpu/drm/radeon/rv770d.h
@@ -76,10 +76,10 @@
76#define ROQ_IB1_START(x) ((x) << 0) 76#define ROQ_IB1_START(x) ((x) << 0)
77#define ROQ_IB2_START(x) ((x) << 8) 77#define ROQ_IB2_START(x) ((x) << 8)
78#define CP_RB_CNTL 0xC104 78#define CP_RB_CNTL 0xC104
79#define RB_BUFSZ(x) ((x)<<0) 79#define RB_BUFSZ(x) ((x) << 0)
80#define RB_BLKSZ(x) ((x)<<8) 80#define RB_BLKSZ(x) ((x) << 8)
81#define RB_NO_UPDATE (1<<27) 81#define RB_NO_UPDATE (1 << 27)
82#define RB_RPTR_WR_ENA (1<<31) 82#define RB_RPTR_WR_ENA (1 << 31)
83#define BUF_SWAP_32BIT (2 << 16) 83#define BUF_SWAP_32BIT (2 << 16)
84#define CP_RB_RPTR 0x8700 84#define CP_RB_RPTR 0x8700
85#define CP_RB_RPTR_ADDR 0xC10C 85#define CP_RB_RPTR_ADDR 0xC10C
@@ -138,6 +138,7 @@
138#define MC_SHARED_CHMAP 0x2004 138#define MC_SHARED_CHMAP 0x2004
139#define NOOFCHAN_SHIFT 12 139#define NOOFCHAN_SHIFT 12
140#define NOOFCHAN_MASK 0x00003000 140#define NOOFCHAN_MASK 0x00003000
141#define MC_SHARED_CHREMAP 0x2008
141 142
142#define MC_ARB_RAMCFG 0x2760 143#define MC_ARB_RAMCFG 0x2760
143#define NOOFBANK_SHIFT 0 144#define NOOFBANK_SHIFT 0
@@ -303,6 +304,7 @@
303#define BILINEAR_PRECISION_8_BIT (1 << 31) 304#define BILINEAR_PRECISION_8_BIT (1 << 31)
304 305
305#define TCP_CNTL 0x9610 306#define TCP_CNTL 0x9610
307#define TCP_CHAN_STEER 0x9614
306 308
307#define VGT_CACHE_INVALIDATION 0x88C4 309#define VGT_CACHE_INVALIDATION 0x88C4
308#define CACHE_INVALIDATION(x) ((x)<<0) 310#define CACHE_INVALIDATION(x) ((x)<<0)
@@ -351,4 +353,49 @@
351 353
352#define SRBM_STATUS 0x0E50 354#define SRBM_STATUS 0x0E50
353 355
356#define D1GRPH_PRIMARY_SURFACE_ADDRESS 0x6110
357#define D1GRPH_PRIMARY_SURFACE_ADDRESS_HIGH 0x6914
358#define D2GRPH_PRIMARY_SURFACE_ADDRESS_HIGH 0x6114
359#define D1GRPH_SECONDARY_SURFACE_ADDRESS 0x6118
360#define D1GRPH_SECONDARY_SURFACE_ADDRESS_HIGH 0x691c
361#define D2GRPH_SECONDARY_SURFACE_ADDRESS_HIGH 0x611c
362
363/* PCIE link stuff */
364#define PCIE_LC_TRAINING_CNTL 0xa1 /* PCIE_P */
365#define PCIE_LC_LINK_WIDTH_CNTL 0xa2 /* PCIE_P */
366# define LC_LINK_WIDTH_SHIFT 0
367# define LC_LINK_WIDTH_MASK 0x7
368# define LC_LINK_WIDTH_X0 0
369# define LC_LINK_WIDTH_X1 1
370# define LC_LINK_WIDTH_X2 2
371# define LC_LINK_WIDTH_X4 3
372# define LC_LINK_WIDTH_X8 4
373# define LC_LINK_WIDTH_X16 6
374# define LC_LINK_WIDTH_RD_SHIFT 4
375# define LC_LINK_WIDTH_RD_MASK 0x70
376# define LC_RECONFIG_ARC_MISSING_ESCAPE (1 << 7)
377# define LC_RECONFIG_NOW (1 << 8)
378# define LC_RENEGOTIATION_SUPPORT (1 << 9)
379# define LC_RENEGOTIATE_EN (1 << 10)
380# define LC_SHORT_RECONFIG_EN (1 << 11)
381# define LC_UPCONFIGURE_SUPPORT (1 << 12)
382# define LC_UPCONFIGURE_DIS (1 << 13)
383#define PCIE_LC_SPEED_CNTL 0xa4 /* PCIE_P */
384# define LC_GEN2_EN_STRAP (1 << 0)
385# define LC_TARGET_LINK_SPEED_OVERRIDE_EN (1 << 1)
386# define LC_FORCE_EN_HW_SPEED_CHANGE (1 << 5)
387# define LC_FORCE_DIS_HW_SPEED_CHANGE (1 << 6)
388# define LC_SPEED_CHANGE_ATTEMPTS_ALLOWED_MASK (0x3 << 8)
389# define LC_SPEED_CHANGE_ATTEMPTS_ALLOWED_SHIFT 3
390# define LC_CURRENT_DATA_RATE (1 << 11)
391# define LC_VOLTAGE_TIMER_SEL_MASK (0xf << 14)
392# define LC_CLR_FAILED_SPD_CHANGE_CNT (1 << 21)
393# define LC_OTHER_SIDE_EVER_SENT_GEN2 (1 << 23)
394# define LC_OTHER_SIDE_SUPPORTS_GEN2 (1 << 24)
395#define MM_CFGREGS_CNTL 0x544c
396# define MM_WR_TO_CFG_EN (1 << 3)
397#define LINK_CNTL2 0x88 /* F0 */
398# define TARGET_LINK_SPEED_MASK (0xf << 0)
399# define SELECTABLE_DEEMPHASIS (1 << 6)
400
354#endif 401#endif
diff --git a/drivers/gpu/drm/savage/savage_bci.c b/drivers/gpu/drm/savage/savage_bci.c
index bf5f83ea14fe..cb1ee4e0050a 100644
--- a/drivers/gpu/drm/savage/savage_bci.c
+++ b/drivers/gpu/drm/savage/savage_bci.c
@@ -647,9 +647,6 @@ int savage_driver_firstopen(struct drm_device *dev)
647 ret = drm_addmap(dev, aperture_base, SAVAGE_APERTURE_SIZE, 647 ret = drm_addmap(dev, aperture_base, SAVAGE_APERTURE_SIZE,
648 _DRM_FRAME_BUFFER, _DRM_WRITE_COMBINING, 648 _DRM_FRAME_BUFFER, _DRM_WRITE_COMBINING,
649 &dev_priv->aperture); 649 &dev_priv->aperture);
650 if (ret)
651 return ret;
652
653 return ret; 650 return ret;
654} 651}
655 652
diff --git a/drivers/gpu/drm/savage/savage_drv.c b/drivers/gpu/drm/savage/savage_drv.c
index 021de44c15ab..6464490b240b 100644
--- a/drivers/gpu/drm/savage/savage_drv.c
+++ b/drivers/gpu/drm/savage/savage_drv.c
@@ -42,8 +42,6 @@ static struct drm_driver driver = {
42 .lastclose = savage_driver_lastclose, 42 .lastclose = savage_driver_lastclose,
43 .unload = savage_driver_unload, 43 .unload = savage_driver_unload,
44 .reclaim_buffers = savage_reclaim_buffers, 44 .reclaim_buffers = savage_reclaim_buffers,
45 .get_map_ofs = drm_core_get_map_ofs,
46 .get_reg_ofs = drm_core_get_reg_ofs,
47 .ioctls = savage_ioctls, 45 .ioctls = savage_ioctls,
48 .dma_ioctl = savage_bci_buffers, 46 .dma_ioctl = savage_bci_buffers,
49 .fops = { 47 .fops = {
@@ -54,11 +52,7 @@ static struct drm_driver driver = {
54 .mmap = drm_mmap, 52 .mmap = drm_mmap,
55 .poll = drm_poll, 53 .poll = drm_poll,
56 .fasync = drm_fasync, 54 .fasync = drm_fasync,
57 }, 55 .llseek = noop_llseek,
58
59 .pci_driver = {
60 .name = DRIVER_NAME,
61 .id_table = pciidlist,
62 }, 56 },
63 57
64 .name = DRIVER_NAME, 58 .name = DRIVER_NAME,
@@ -69,15 +63,20 @@ static struct drm_driver driver = {
69 .patchlevel = DRIVER_PATCHLEVEL, 63 .patchlevel = DRIVER_PATCHLEVEL,
70}; 64};
71 65
66static struct pci_driver savage_pci_driver = {
67 .name = DRIVER_NAME,
68 .id_table = pciidlist,
69};
70
72static int __init savage_init(void) 71static int __init savage_init(void)
73{ 72{
74 driver.num_ioctls = savage_max_ioctl; 73 driver.num_ioctls = savage_max_ioctl;
75 return drm_init(&driver); 74 return drm_pci_init(&driver, &savage_pci_driver);
76} 75}
77 76
78static void __exit savage_exit(void) 77static void __exit savage_exit(void)
79{ 78{
80 drm_exit(&driver); 79 drm_pci_exit(&driver, &savage_pci_driver);
81} 80}
82 81
83module_init(savage_init); 82module_init(savage_init);
diff --git a/drivers/gpu/drm/sis/sis_drv.c b/drivers/gpu/drm/sis/sis_drv.c
index 776bf9e9ea1a..46d5be6e97e5 100644
--- a/drivers/gpu/drm/sis/sis_drv.c
+++ b/drivers/gpu/drm/sis/sis_drv.c
@@ -67,13 +67,10 @@ static struct drm_driver driver = {
67 .driver_features = DRIVER_USE_AGP | DRIVER_USE_MTRR, 67 .driver_features = DRIVER_USE_AGP | DRIVER_USE_MTRR,
68 .load = sis_driver_load, 68 .load = sis_driver_load,
69 .unload = sis_driver_unload, 69 .unload = sis_driver_unload,
70 .context_dtor = NULL,
71 .dma_quiescent = sis_idle, 70 .dma_quiescent = sis_idle,
72 .reclaim_buffers = NULL, 71 .reclaim_buffers = NULL,
73 .reclaim_buffers_idlelocked = sis_reclaim_buffers_locked, 72 .reclaim_buffers_idlelocked = sis_reclaim_buffers_locked,
74 .lastclose = sis_lastclose, 73 .lastclose = sis_lastclose,
75 .get_map_ofs = drm_core_get_map_ofs,
76 .get_reg_ofs = drm_core_get_reg_ofs,
77 .ioctls = sis_ioctls, 74 .ioctls = sis_ioctls,
78 .fops = { 75 .fops = {
79 .owner = THIS_MODULE, 76 .owner = THIS_MODULE,
@@ -83,10 +80,7 @@ static struct drm_driver driver = {
83 .mmap = drm_mmap, 80 .mmap = drm_mmap,
84 .poll = drm_poll, 81 .poll = drm_poll,
85 .fasync = drm_fasync, 82 .fasync = drm_fasync,
86 }, 83 .llseek = noop_llseek,
87 .pci_driver = {
88 .name = DRIVER_NAME,
89 .id_table = pciidlist,
90 }, 84 },
91 85
92 .name = DRIVER_NAME, 86 .name = DRIVER_NAME,
@@ -97,15 +91,20 @@ static struct drm_driver driver = {
97 .patchlevel = DRIVER_PATCHLEVEL, 91 .patchlevel = DRIVER_PATCHLEVEL,
98}; 92};
99 93
94static struct pci_driver sis_pci_driver = {
95 .name = DRIVER_NAME,
96 .id_table = pciidlist,
97};
98
100static int __init sis_init(void) 99static int __init sis_init(void)
101{ 100{
102 driver.num_ioctls = sis_max_ioctl; 101 driver.num_ioctls = sis_max_ioctl;
103 return drm_init(&driver); 102 return drm_pci_init(&driver, &sis_pci_driver);
104} 103}
105 104
106static void __exit sis_exit(void) 105static void __exit sis_exit(void)
107{ 106{
108 drm_exit(&driver); 107 drm_pci_exit(&driver, &sis_pci_driver);
109} 108}
110 109
111module_init(sis_init); 110module_init(sis_init);
diff --git a/drivers/gpu/drm/tdfx/tdfx_drv.c b/drivers/gpu/drm/tdfx/tdfx_drv.c
index ec5a43e65722..8bf98810a8d6 100644
--- a/drivers/gpu/drm/tdfx/tdfx_drv.c
+++ b/drivers/gpu/drm/tdfx/tdfx_drv.c
@@ -42,8 +42,6 @@ static struct pci_device_id pciidlist[] = {
42static struct drm_driver driver = { 42static struct drm_driver driver = {
43 .driver_features = DRIVER_USE_MTRR, 43 .driver_features = DRIVER_USE_MTRR,
44 .reclaim_buffers = drm_core_reclaim_buffers, 44 .reclaim_buffers = drm_core_reclaim_buffers,
45 .get_map_ofs = drm_core_get_map_ofs,
46 .get_reg_ofs = drm_core_get_reg_ofs,
47 .fops = { 45 .fops = {
48 .owner = THIS_MODULE, 46 .owner = THIS_MODULE,
49 .open = drm_open, 47 .open = drm_open,
@@ -52,10 +50,7 @@ static struct drm_driver driver = {
52 .mmap = drm_mmap, 50 .mmap = drm_mmap,
53 .poll = drm_poll, 51 .poll = drm_poll,
54 .fasync = drm_fasync, 52 .fasync = drm_fasync,
55 }, 53 .llseek = noop_llseek,
56 .pci_driver = {
57 .name = DRIVER_NAME,
58 .id_table = pciidlist,
59 }, 54 },
60 55
61 .name = DRIVER_NAME, 56 .name = DRIVER_NAME,
@@ -66,14 +61,19 @@ static struct drm_driver driver = {
66 .patchlevel = DRIVER_PATCHLEVEL, 61 .patchlevel = DRIVER_PATCHLEVEL,
67}; 62};
68 63
64static struct pci_driver tdfx_pci_driver = {
65 .name = DRIVER_NAME,
66 .id_table = pciidlist,
67};
68
69static int __init tdfx_init(void) 69static int __init tdfx_init(void)
70{ 70{
71 return drm_init(&driver); 71 return drm_pci_init(&driver, &tdfx_pci_driver);
72} 72}
73 73
74static void __exit tdfx_exit(void) 74static void __exit tdfx_exit(void)
75{ 75{
76 drm_exit(&driver); 76 drm_pci_exit(&driver, &tdfx_pci_driver);
77} 77}
78 78
79module_init(tdfx_init); 79module_init(tdfx_init);
diff --git a/drivers/gpu/drm/ttm/Makefile b/drivers/gpu/drm/ttm/Makefile
index b256d4adfafe..f3cf6f02c997 100644
--- a/drivers/gpu/drm/ttm/Makefile
+++ b/drivers/gpu/drm/ttm/Makefile
@@ -4,6 +4,7 @@
4ccflags-y := -Iinclude/drm 4ccflags-y := -Iinclude/drm
5ttm-y := ttm_agp_backend.o ttm_memory.o ttm_tt.o ttm_bo.o \ 5ttm-y := ttm_agp_backend.o ttm_memory.o ttm_tt.o ttm_bo.o \
6 ttm_bo_util.o ttm_bo_vm.o ttm_module.o \ 6 ttm_bo_util.o ttm_bo_vm.o ttm_module.o \
7 ttm_object.o ttm_lock.o ttm_execbuf_util.o ttm_page_alloc.o 7 ttm_object.o ttm_lock.o ttm_execbuf_util.o ttm_page_alloc.o \
8 ttm_bo_manager.o
8 9
9obj-$(CONFIG_DRM_TTM) += ttm.o 10obj-$(CONFIG_DRM_TTM) += ttm.o
diff --git a/drivers/gpu/drm/ttm/ttm_agp_backend.c b/drivers/gpu/drm/ttm/ttm_agp_backend.c
index 4bf69c404491..1c4a72f681c1 100644
--- a/drivers/gpu/drm/ttm/ttm_agp_backend.c
+++ b/drivers/gpu/drm/ttm/ttm_agp_backend.c
@@ -47,7 +47,8 @@ struct ttm_agp_backend {
47 47
48static int ttm_agp_populate(struct ttm_backend *backend, 48static int ttm_agp_populate(struct ttm_backend *backend,
49 unsigned long num_pages, struct page **pages, 49 unsigned long num_pages, struct page **pages,
50 struct page *dummy_read_page) 50 struct page *dummy_read_page,
51 dma_addr_t *dma_addrs)
51{ 52{
52 struct ttm_agp_backend *agp_be = 53 struct ttm_agp_backend *agp_be =
53 container_of(backend, struct ttm_agp_backend, backend); 54 container_of(backend, struct ttm_agp_backend, backend);
@@ -74,6 +75,7 @@ static int ttm_agp_bind(struct ttm_backend *backend, struct ttm_mem_reg *bo_mem)
74{ 75{
75 struct ttm_agp_backend *agp_be = 76 struct ttm_agp_backend *agp_be =
76 container_of(backend, struct ttm_agp_backend, backend); 77 container_of(backend, struct ttm_agp_backend, backend);
78 struct drm_mm_node *node = bo_mem->mm_node;
77 struct agp_memory *mem = agp_be->mem; 79 struct agp_memory *mem = agp_be->mem;
78 int cached = (bo_mem->placement & TTM_PL_FLAG_CACHED); 80 int cached = (bo_mem->placement & TTM_PL_FLAG_CACHED);
79 int ret; 81 int ret;
@@ -81,7 +83,7 @@ static int ttm_agp_bind(struct ttm_backend *backend, struct ttm_mem_reg *bo_mem)
81 mem->is_flushed = 1; 83 mem->is_flushed = 1;
82 mem->type = (cached) ? AGP_USER_CACHED_MEMORY : AGP_USER_MEMORY; 84 mem->type = (cached) ? AGP_USER_CACHED_MEMORY : AGP_USER_MEMORY;
83 85
84 ret = agp_bind_memory(mem, bo_mem->mm_node->start); 86 ret = agp_bind_memory(mem, node->start);
85 if (ret) 87 if (ret)
86 printk(KERN_ERR TTM_PFX "AGP Bind memory failed.\n"); 88 printk(KERN_ERR TTM_PFX "AGP Bind memory failed.\n");
87 89
diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
index db809e034cc4..2e618b5ac465 100644
--- a/drivers/gpu/drm/ttm/ttm_bo.c
+++ b/drivers/gpu/drm/ttm/ttm_bo.c
@@ -27,14 +27,6 @@
27/* 27/*
28 * Authors: Thomas Hellstrom <thellstrom-at-vmware-dot-com> 28 * Authors: Thomas Hellstrom <thellstrom-at-vmware-dot-com>
29 */ 29 */
30/* Notes:
31 *
32 * We store bo pointer in drm_mm_node struct so we know which bo own a
33 * specific node. There is no protection on the pointer, thus to make
34 * sure things don't go berserk you have to access this pointer while
35 * holding the global lru lock and make sure anytime you free a node you
36 * reset the pointer to NULL.
37 */
38 30
39#include "ttm/ttm_module.h" 31#include "ttm/ttm_module.h"
40#include "ttm/ttm_bo_driver.h" 32#include "ttm/ttm_bo_driver.h"
@@ -45,6 +37,7 @@
45#include <linux/mm.h> 37#include <linux/mm.h>
46#include <linux/file.h> 38#include <linux/file.h>
47#include <linux/module.h> 39#include <linux/module.h>
40#include <asm/atomic.h>
48 41
49#define TTM_ASSERT_LOCKED(param) 42#define TTM_ASSERT_LOCKED(param)
50#define TTM_DEBUG(fmt, arg...) 43#define TTM_DEBUG(fmt, arg...)
@@ -84,11 +77,8 @@ static void ttm_mem_type_debug(struct ttm_bo_device *bdev, int mem_type)
84 man->available_caching); 77 man->available_caching);
85 printk(KERN_ERR TTM_PFX " default_caching: 0x%08X\n", 78 printk(KERN_ERR TTM_PFX " default_caching: 0x%08X\n",
86 man->default_caching); 79 man->default_caching);
87 if (mem_type != TTM_PL_SYSTEM) { 80 if (mem_type != TTM_PL_SYSTEM)
88 spin_lock(&bdev->glob->lru_lock); 81 (*man->func->debug)(man, TTM_PFX);
89 drm_mm_debug_table(&man->manager, TTM_PFX);
90 spin_unlock(&bdev->glob->lru_lock);
91 }
92} 82}
93 83
94static void ttm_bo_mem_space_debug(struct ttm_buffer_object *bo, 84static void ttm_bo_mem_space_debug(struct ttm_buffer_object *bo,
@@ -169,22 +159,17 @@ static void ttm_bo_release_list(struct kref *list_kref)
169 159
170int ttm_bo_wait_unreserved(struct ttm_buffer_object *bo, bool interruptible) 160int ttm_bo_wait_unreserved(struct ttm_buffer_object *bo, bool interruptible)
171{ 161{
172
173 if (interruptible) { 162 if (interruptible) {
174 int ret = 0; 163 return wait_event_interruptible(bo->event_queue,
175
176 ret = wait_event_interruptible(bo->event_queue,
177 atomic_read(&bo->reserved) == 0); 164 atomic_read(&bo->reserved) == 0);
178 if (unlikely(ret != 0))
179 return ret;
180 } else { 165 } else {
181 wait_event(bo->event_queue, atomic_read(&bo->reserved) == 0); 166 wait_event(bo->event_queue, atomic_read(&bo->reserved) == 0);
167 return 0;
182 } 168 }
183 return 0;
184} 169}
185EXPORT_SYMBOL(ttm_bo_wait_unreserved); 170EXPORT_SYMBOL(ttm_bo_wait_unreserved);
186 171
187static void ttm_bo_add_to_lru(struct ttm_buffer_object *bo) 172void ttm_bo_add_to_lru(struct ttm_buffer_object *bo)
188{ 173{
189 struct ttm_bo_device *bdev = bo->bdev; 174 struct ttm_bo_device *bdev = bo->bdev;
190 struct ttm_mem_type_manager *man; 175 struct ttm_mem_type_manager *man;
@@ -206,11 +191,7 @@ static void ttm_bo_add_to_lru(struct ttm_buffer_object *bo)
206 } 191 }
207} 192}
208 193
209/** 194int ttm_bo_del_from_lru(struct ttm_buffer_object *bo)
210 * Call with the lru_lock held.
211 */
212
213static int ttm_bo_del_from_lru(struct ttm_buffer_object *bo)
214{ 195{
215 int put_count = 0; 196 int put_count = 0;
216 197
@@ -239,9 +220,21 @@ int ttm_bo_reserve_locked(struct ttm_buffer_object *bo,
239 int ret; 220 int ret;
240 221
241 while (unlikely(atomic_cmpxchg(&bo->reserved, 0, 1) != 0)) { 222 while (unlikely(atomic_cmpxchg(&bo->reserved, 0, 1) != 0)) {
242 if (use_sequence && bo->seq_valid && 223 /**
243 (sequence - bo->val_seq < (1 << 31))) { 224 * Deadlock avoidance for multi-bo reserving.
244 return -EAGAIN; 225 */
226 if (use_sequence && bo->seq_valid) {
227 /**
228 * We've already reserved this one.
229 */
230 if (unlikely(sequence == bo->val_seq))
231 return -EDEADLK;
232 /**
233 * Already reserved by a thread that will not back
234 * off for us. We need to back off.
235 */
236 if (unlikely(sequence - bo->val_seq < (1 << 31)))
237 return -EAGAIN;
245 } 238 }
246 239
247 if (no_wait) 240 if (no_wait)
@@ -256,6 +249,14 @@ int ttm_bo_reserve_locked(struct ttm_buffer_object *bo,
256 } 249 }
257 250
258 if (use_sequence) { 251 if (use_sequence) {
252 /**
253 * Wake up waiters that may need to recheck for deadlock,
254 * if we decreased the sequence number.
255 */
256 if (unlikely((bo->val_seq - sequence < (1 << 31))
257 || !bo->seq_valid))
258 wake_up_all(&bo->event_queue);
259
259 bo->val_seq = sequence; 260 bo->val_seq = sequence;
260 bo->seq_valid = true; 261 bo->seq_valid = true;
261 } else { 262 } else {
@@ -271,6 +272,13 @@ static void ttm_bo_ref_bug(struct kref *list_kref)
271 BUG(); 272 BUG();
272} 273}
273 274
275void ttm_bo_list_ref_sub(struct ttm_buffer_object *bo, int count,
276 bool never_free)
277{
278 kref_sub(&bo->list_kref, count,
279 (never_free) ? ttm_bo_ref_bug : ttm_bo_release_list);
280}
281
274int ttm_bo_reserve(struct ttm_buffer_object *bo, 282int ttm_bo_reserve(struct ttm_buffer_object *bo,
275 bool interruptible, 283 bool interruptible,
276 bool no_wait, bool use_sequence, uint32_t sequence) 284 bool no_wait, bool use_sequence, uint32_t sequence)
@@ -286,20 +294,24 @@ int ttm_bo_reserve(struct ttm_buffer_object *bo,
286 put_count = ttm_bo_del_from_lru(bo); 294 put_count = ttm_bo_del_from_lru(bo);
287 spin_unlock(&glob->lru_lock); 295 spin_unlock(&glob->lru_lock);
288 296
289 while (put_count--) 297 ttm_bo_list_ref_sub(bo, put_count, true);
290 kref_put(&bo->list_kref, ttm_bo_ref_bug);
291 298
292 return ret; 299 return ret;
293} 300}
294 301
302void ttm_bo_unreserve_locked(struct ttm_buffer_object *bo)
303{
304 ttm_bo_add_to_lru(bo);
305 atomic_set(&bo->reserved, 0);
306 wake_up_all(&bo->event_queue);
307}
308
295void ttm_bo_unreserve(struct ttm_buffer_object *bo) 309void ttm_bo_unreserve(struct ttm_buffer_object *bo)
296{ 310{
297 struct ttm_bo_global *glob = bo->glob; 311 struct ttm_bo_global *glob = bo->glob;
298 312
299 spin_lock(&glob->lru_lock); 313 spin_lock(&glob->lru_lock);
300 ttm_bo_add_to_lru(bo); 314 ttm_bo_unreserve_locked(bo);
301 atomic_set(&bo->reserved, 0);
302 wake_up_all(&bo->event_queue);
303 spin_unlock(&glob->lru_lock); 315 spin_unlock(&glob->lru_lock);
304} 316}
305EXPORT_SYMBOL(ttm_bo_unreserve); 317EXPORT_SYMBOL(ttm_bo_unreserve);
@@ -366,8 +378,13 @@ static int ttm_bo_handle_move_mem(struct ttm_buffer_object *bo,
366 int ret = 0; 378 int ret = 0;
367 379
368 if (old_is_pci || new_is_pci || 380 if (old_is_pci || new_is_pci ||
369 ((mem->placement & bo->mem.placement & TTM_PL_MASK_CACHING) == 0)) 381 ((mem->placement & bo->mem.placement & TTM_PL_MASK_CACHING) == 0)) {
370 ttm_bo_unmap_virtual(bo); 382 ret = ttm_mem_io_lock(old_man, true);
383 if (unlikely(ret != 0))
384 goto out_err;
385 ttm_bo_unmap_virtual_locked(bo);
386 ttm_mem_io_unlock(old_man);
387 }
371 388
372 /* 389 /*
373 * Create and bind a ttm if required. 390 * Create and bind a ttm if required.
@@ -389,11 +406,12 @@ static int ttm_bo_handle_move_mem(struct ttm_buffer_object *bo,
389 } 406 }
390 407
391 if (bo->mem.mem_type == TTM_PL_SYSTEM) { 408 if (bo->mem.mem_type == TTM_PL_SYSTEM) {
409 if (bdev->driver->move_notify)
410 bdev->driver->move_notify(bo, mem);
392 bo->mem = *mem; 411 bo->mem = *mem;
393 mem->mm_node = NULL; 412 mem->mm_node = NULL;
394 goto moved; 413 goto moved;
395 } 414 }
396
397 } 415 }
398 416
399 if (bdev->driver->move_notify) 417 if (bdev->driver->move_notify)
@@ -420,11 +438,9 @@ moved:
420 } 438 }
421 439
422 if (bo->mem.mm_node) { 440 if (bo->mem.mm_node) {
423 spin_lock(&bo->lock); 441 bo->offset = (bo->mem.start << PAGE_SHIFT) +
424 bo->offset = (bo->mem.mm_node->start << PAGE_SHIFT) +
425 bdev->man[bo->mem.mem_type].gpu_offset; 442 bdev->man[bo->mem.mem_type].gpu_offset;
426 bo->cur_placement = bo->mem.placement; 443 bo->cur_placement = bo->mem.placement;
427 spin_unlock(&bo->lock);
428 } else 444 } else
429 bo->offset = 0; 445 bo->offset = 0;
430 446
@@ -442,135 +458,150 @@ out_err:
442} 458}
443 459
444/** 460/**
445 * Call bo::reserved and with the lru lock held. 461 * Call bo::reserved.
446 * Will release GPU memory type usage on destruction. 462 * Will release GPU memory type usage on destruction.
447 * This is the place to put in driver specific hooks. 463 * This is the place to put in driver specific hooks to release
448 * Will release the bo::reserved lock and the 464 * driver private resources.
449 * lru lock on exit. 465 * Will release the bo::reserved lock.
450 */ 466 */
451 467
452static void ttm_bo_cleanup_memtype_use(struct ttm_buffer_object *bo) 468static void ttm_bo_cleanup_memtype_use(struct ttm_buffer_object *bo)
453{ 469{
454 struct ttm_bo_global *glob = bo->glob;
455
456 if (bo->ttm) { 470 if (bo->ttm) {
457
458 /**
459 * Release the lru_lock, since we don't want to have
460 * an atomic requirement on ttm_tt[unbind|destroy].
461 */
462
463 spin_unlock(&glob->lru_lock);
464 ttm_tt_unbind(bo->ttm); 471 ttm_tt_unbind(bo->ttm);
465 ttm_tt_destroy(bo->ttm); 472 ttm_tt_destroy(bo->ttm);
466 bo->ttm = NULL; 473 bo->ttm = NULL;
467 spin_lock(&glob->lru_lock);
468 }
469
470 if (bo->mem.mm_node) {
471 drm_mm_put_block(bo->mem.mm_node);
472 bo->mem.mm_node = NULL;
473 } 474 }
475 ttm_bo_mem_put(bo, &bo->mem);
474 476
475 atomic_set(&bo->reserved, 0); 477 atomic_set(&bo->reserved, 0);
478
479 /*
480 * Make processes trying to reserve really pick it up.
481 */
482 smp_mb__after_atomic_dec();
476 wake_up_all(&bo->event_queue); 483 wake_up_all(&bo->event_queue);
477 spin_unlock(&glob->lru_lock);
478} 484}
479 485
480 486static void ttm_bo_cleanup_refs_or_queue(struct ttm_buffer_object *bo)
481/**
482 * If bo idle, remove from delayed- and lru lists, and unref.
483 * If not idle, and already on delayed list, do nothing.
484 * If not idle, and not on delayed list, put on delayed list,
485 * up the list_kref and schedule a delayed list check.
486 */
487
488static int ttm_bo_cleanup_refs(struct ttm_buffer_object *bo, bool remove_all)
489{ 487{
490 struct ttm_bo_device *bdev = bo->bdev; 488 struct ttm_bo_device *bdev = bo->bdev;
491 struct ttm_bo_global *glob = bo->glob; 489 struct ttm_bo_global *glob = bo->glob;
492 struct ttm_bo_driver *driver = bdev->driver; 490 struct ttm_bo_driver *driver;
491 void *sync_obj = NULL;
492 void *sync_obj_arg;
493 int put_count;
493 int ret; 494 int ret;
494 495
495 spin_lock(&bo->lock); 496 spin_lock(&bdev->fence_lock);
496retry: 497 (void) ttm_bo_wait(bo, false, false, true);
497 (void) ttm_bo_wait(bo, false, false, !remove_all);
498
499 if (!bo->sync_obj) { 498 if (!bo->sync_obj) {
500 int put_count;
501
502 spin_unlock(&bo->lock);
503 499
504 spin_lock(&glob->lru_lock); 500 spin_lock(&glob->lru_lock);
505 ret = ttm_bo_reserve_locked(bo, false, !remove_all, false, 0);
506 501
507 /** 502 /**
508 * Someone else has the object reserved. Bail and retry. 503 * Lock inversion between bo:reserve and bdev::fence_lock here,
504 * but that's OK, since we're only trylocking.
509 */ 505 */
510 506
511 if (unlikely(ret == -EBUSY)) { 507 ret = ttm_bo_reserve_locked(bo, false, true, false, 0);
512 spin_unlock(&glob->lru_lock);
513 spin_lock(&bo->lock);
514 goto requeue;
515 }
516
517 /**
518 * We can re-check for sync object without taking
519 * the bo::lock since setting the sync object requires
520 * also bo::reserved. A busy object at this point may
521 * be caused by another thread starting an accelerated
522 * eviction.
523 */
524 508
525 if (unlikely(bo->sync_obj)) { 509 if (unlikely(ret == -EBUSY))
526 atomic_set(&bo->reserved, 0); 510 goto queue;
527 wake_up_all(&bo->event_queue);
528 spin_unlock(&glob->lru_lock);
529 spin_lock(&bo->lock);
530 if (remove_all)
531 goto retry;
532 else
533 goto requeue;
534 }
535 511
512 spin_unlock(&bdev->fence_lock);
536 put_count = ttm_bo_del_from_lru(bo); 513 put_count = ttm_bo_del_from_lru(bo);
537 514
538 if (!list_empty(&bo->ddestroy)) { 515 spin_unlock(&glob->lru_lock);
539 list_del_init(&bo->ddestroy);
540 ++put_count;
541 }
542
543 ttm_bo_cleanup_memtype_use(bo); 516 ttm_bo_cleanup_memtype_use(bo);
544 517
545 while (put_count--) 518 ttm_bo_list_ref_sub(bo, put_count, true);
546 kref_put(&bo->list_kref, ttm_bo_ref_bug);
547 519
548 return 0; 520 return;
521 } else {
522 spin_lock(&glob->lru_lock);
523 }
524queue:
525 driver = bdev->driver;
526 if (bo->sync_obj)
527 sync_obj = driver->sync_obj_ref(bo->sync_obj);
528 sync_obj_arg = bo->sync_obj_arg;
529
530 kref_get(&bo->list_kref);
531 list_add_tail(&bo->ddestroy, &bdev->ddestroy);
532 spin_unlock(&glob->lru_lock);
533 spin_unlock(&bdev->fence_lock);
534
535 if (sync_obj) {
536 driver->sync_obj_flush(sync_obj, sync_obj_arg);
537 driver->sync_obj_unref(&sync_obj);
549 } 538 }
550requeue: 539 schedule_delayed_work(&bdev->wq,
540 ((HZ / 100) < 1) ? 1 : HZ / 100);
541}
542
543/**
544 * function ttm_bo_cleanup_refs
545 * If bo idle, remove from delayed- and lru lists, and unref.
546 * If not idle, do nothing.
547 *
548 * @interruptible Any sleeps should occur interruptibly.
549 * @no_wait_reserve Never wait for reserve. Return -EBUSY instead.
550 * @no_wait_gpu Never wait for gpu. Return -EBUSY instead.
551 */
552
553static int ttm_bo_cleanup_refs(struct ttm_buffer_object *bo,
554 bool interruptible,
555 bool no_wait_reserve,
556 bool no_wait_gpu)
557{
558 struct ttm_bo_device *bdev = bo->bdev;
559 struct ttm_bo_global *glob = bo->glob;
560 int put_count;
561 int ret = 0;
562
563retry:
564 spin_lock(&bdev->fence_lock);
565 ret = ttm_bo_wait(bo, false, interruptible, no_wait_gpu);
566 spin_unlock(&bdev->fence_lock);
567
568 if (unlikely(ret != 0))
569 return ret;
570
551 spin_lock(&glob->lru_lock); 571 spin_lock(&glob->lru_lock);
552 if (list_empty(&bo->ddestroy)) { 572 ret = ttm_bo_reserve_locked(bo, interruptible,
553 void *sync_obj = bo->sync_obj; 573 no_wait_reserve, false, 0);
554 void *sync_obj_arg = bo->sync_obj_arg;
555 574
556 kref_get(&bo->list_kref); 575 if (unlikely(ret != 0) || list_empty(&bo->ddestroy)) {
557 list_add_tail(&bo->ddestroy, &bdev->ddestroy);
558 spin_unlock(&glob->lru_lock); 576 spin_unlock(&glob->lru_lock);
559 spin_unlock(&bo->lock); 577 return ret;
578 }
560 579
561 if (sync_obj) 580 /**
562 driver->sync_obj_flush(sync_obj, sync_obj_arg); 581 * We can re-check for sync object without taking
563 schedule_delayed_work(&bdev->wq, 582 * the bo::lock since setting the sync object requires
564 ((HZ / 100) < 1) ? 1 : HZ / 100); 583 * also bo::reserved. A busy object at this point may
565 ret = 0; 584 * be caused by another thread recently starting an accelerated
585 * eviction.
586 */
566 587
567 } else { 588 if (unlikely(bo->sync_obj)) {
589 atomic_set(&bo->reserved, 0);
590 wake_up_all(&bo->event_queue);
568 spin_unlock(&glob->lru_lock); 591 spin_unlock(&glob->lru_lock);
569 spin_unlock(&bo->lock); 592 goto retry;
570 ret = -EBUSY;
571 } 593 }
572 594
573 return ret; 595 put_count = ttm_bo_del_from_lru(bo);
596 list_del_init(&bo->ddestroy);
597 ++put_count;
598
599 spin_unlock(&glob->lru_lock);
600 ttm_bo_cleanup_memtype_use(bo);
601
602 ttm_bo_list_ref_sub(bo, put_count, true);
603
604 return 0;
574} 605}
575 606
576/** 607/**
@@ -602,7 +633,8 @@ static int ttm_bo_delayed_delete(struct ttm_bo_device *bdev, bool remove_all)
602 } 633 }
603 634
604 spin_unlock(&glob->lru_lock); 635 spin_unlock(&glob->lru_lock);
605 ret = ttm_bo_cleanup_refs(entry, remove_all); 636 ret = ttm_bo_cleanup_refs(entry, false, !remove_all,
637 !remove_all);
606 kref_put(&entry->list_kref, ttm_bo_release_list); 638 kref_put(&entry->list_kref, ttm_bo_release_list);
607 entry = nentry; 639 entry = nentry;
608 640
@@ -638,6 +670,7 @@ static void ttm_bo_release(struct kref *kref)
638 struct ttm_buffer_object *bo = 670 struct ttm_buffer_object *bo =
639 container_of(kref, struct ttm_buffer_object, kref); 671 container_of(kref, struct ttm_buffer_object, kref);
640 struct ttm_bo_device *bdev = bo->bdev; 672 struct ttm_bo_device *bdev = bo->bdev;
673 struct ttm_mem_type_manager *man = &bdev->man[bo->mem.mem_type];
641 674
642 if (likely(bo->vm_node != NULL)) { 675 if (likely(bo->vm_node != NULL)) {
643 rb_erase(&bo->vm_rb, &bdev->addr_space_rb); 676 rb_erase(&bo->vm_rb, &bdev->addr_space_rb);
@@ -645,7 +678,10 @@ static void ttm_bo_release(struct kref *kref)
645 bo->vm_node = NULL; 678 bo->vm_node = NULL;
646 } 679 }
647 write_unlock(&bdev->vm_lock); 680 write_unlock(&bdev->vm_lock);
648 ttm_bo_cleanup_refs(bo, false); 681 ttm_mem_io_lock(man, false);
682 ttm_mem_io_free_vm(bo);
683 ttm_mem_io_unlock(man);
684 ttm_bo_cleanup_refs_or_queue(bo);
649 kref_put(&bo->list_kref, ttm_bo_release_list); 685 kref_put(&bo->list_kref, ttm_bo_release_list);
650 write_lock(&bdev->vm_lock); 686 write_lock(&bdev->vm_lock);
651} 687}
@@ -680,14 +716,13 @@ static int ttm_bo_evict(struct ttm_buffer_object *bo, bool interruptible,
680 bool no_wait_reserve, bool no_wait_gpu) 716 bool no_wait_reserve, bool no_wait_gpu)
681{ 717{
682 struct ttm_bo_device *bdev = bo->bdev; 718 struct ttm_bo_device *bdev = bo->bdev;
683 struct ttm_bo_global *glob = bo->glob;
684 struct ttm_mem_reg evict_mem; 719 struct ttm_mem_reg evict_mem;
685 struct ttm_placement placement; 720 struct ttm_placement placement;
686 int ret = 0; 721 int ret = 0;
687 722
688 spin_lock(&bo->lock); 723 spin_lock(&bdev->fence_lock);
689 ret = ttm_bo_wait(bo, false, interruptible, no_wait_gpu); 724 ret = ttm_bo_wait(bo, false, interruptible, no_wait_gpu);
690 spin_unlock(&bo->lock); 725 spin_unlock(&bdev->fence_lock);
691 726
692 if (unlikely(ret != 0)) { 727 if (unlikely(ret != 0)) {
693 if (ret != -ERESTARTSYS) { 728 if (ret != -ERESTARTSYS) {
@@ -702,7 +737,8 @@ static int ttm_bo_evict(struct ttm_buffer_object *bo, bool interruptible,
702 737
703 evict_mem = bo->mem; 738 evict_mem = bo->mem;
704 evict_mem.mm_node = NULL; 739 evict_mem.mm_node = NULL;
705 evict_mem.bus.io_reserved = false; 740 evict_mem.bus.io_reserved_vm = false;
741 evict_mem.bus.io_reserved_count = 0;
706 742
707 placement.fpfn = 0; 743 placement.fpfn = 0;
708 placement.lpfn = 0; 744 placement.lpfn = 0;
@@ -726,12 +762,7 @@ static int ttm_bo_evict(struct ttm_buffer_object *bo, bool interruptible,
726 if (ret) { 762 if (ret) {
727 if (ret != -ERESTARTSYS) 763 if (ret != -ERESTARTSYS)
728 printk(KERN_ERR TTM_PFX "Buffer eviction failed\n"); 764 printk(KERN_ERR TTM_PFX "Buffer eviction failed\n");
729 spin_lock(&glob->lru_lock); 765 ttm_bo_mem_put(bo, &evict_mem);
730 if (evict_mem.mm_node) {
731 drm_mm_put_block(evict_mem.mm_node);
732 evict_mem.mm_node = NULL;
733 }
734 spin_unlock(&glob->lru_lock);
735 goto out; 766 goto out;
736 } 767 }
737 bo->evicted = true; 768 bo->evicted = true;
@@ -759,6 +790,18 @@ retry:
759 bo = list_first_entry(&man->lru, struct ttm_buffer_object, lru); 790 bo = list_first_entry(&man->lru, struct ttm_buffer_object, lru);
760 kref_get(&bo->list_kref); 791 kref_get(&bo->list_kref);
761 792
793 if (!list_empty(&bo->ddestroy)) {
794 spin_unlock(&glob->lru_lock);
795 ret = ttm_bo_cleanup_refs(bo, interruptible,
796 no_wait_reserve, no_wait_gpu);
797 kref_put(&bo->list_kref, ttm_bo_release_list);
798
799 if (likely(ret == 0 || ret == -ERESTARTSYS))
800 return ret;
801
802 goto retry;
803 }
804
762 ret = ttm_bo_reserve_locked(bo, false, no_wait_reserve, false, 0); 805 ret = ttm_bo_reserve_locked(bo, false, no_wait_reserve, false, 0);
763 806
764 if (unlikely(ret == -EBUSY)) { 807 if (unlikely(ret == -EBUSY)) {
@@ -782,8 +825,7 @@ retry:
782 825
783 BUG_ON(ret != 0); 826 BUG_ON(ret != 0);
784 827
785 while (put_count--) 828 ttm_bo_list_ref_sub(bo, put_count, true);
786 kref_put(&bo->list_kref, ttm_bo_ref_bug);
787 829
788 ret = ttm_bo_evict(bo, interruptible, no_wait_reserve, no_wait_gpu); 830 ret = ttm_bo_evict(bo, interruptible, no_wait_reserve, no_wait_gpu);
789 ttm_bo_unreserve(bo); 831 ttm_bo_unreserve(bo);
@@ -792,41 +834,14 @@ retry:
792 return ret; 834 return ret;
793} 835}
794 836
795static int ttm_bo_man_get_node(struct ttm_buffer_object *bo, 837void ttm_bo_mem_put(struct ttm_buffer_object *bo, struct ttm_mem_reg *mem)
796 struct ttm_mem_type_manager *man,
797 struct ttm_placement *placement,
798 struct ttm_mem_reg *mem,
799 struct drm_mm_node **node)
800{ 838{
801 struct ttm_bo_global *glob = bo->glob; 839 struct ttm_mem_type_manager *man = &bo->bdev->man[mem->mem_type];
802 unsigned long lpfn;
803 int ret;
804
805 lpfn = placement->lpfn;
806 if (!lpfn)
807 lpfn = man->size;
808 *node = NULL;
809 do {
810 ret = drm_mm_pre_get(&man->manager);
811 if (unlikely(ret))
812 return ret;
813 840
814 spin_lock(&glob->lru_lock); 841 if (mem->mm_node)
815 *node = drm_mm_search_free_in_range(&man->manager, 842 (*man->func->put_node)(man, mem);
816 mem->num_pages, mem->page_alignment,
817 placement->fpfn, lpfn, 1);
818 if (unlikely(*node == NULL)) {
819 spin_unlock(&glob->lru_lock);
820 return 0;
821 }
822 *node = drm_mm_get_block_atomic_range(*node, mem->num_pages,
823 mem->page_alignment,
824 placement->fpfn,
825 lpfn);
826 spin_unlock(&glob->lru_lock);
827 } while (*node == NULL);
828 return 0;
829} 843}
844EXPORT_SYMBOL(ttm_bo_mem_put);
830 845
831/** 846/**
832 * Repeatedly evict memory from the LRU for @mem_type until we create enough 847 * Repeatedly evict memory from the LRU for @mem_type until we create enough
@@ -841,31 +856,22 @@ static int ttm_bo_mem_force_space(struct ttm_buffer_object *bo,
841 bool no_wait_gpu) 856 bool no_wait_gpu)
842{ 857{
843 struct ttm_bo_device *bdev = bo->bdev; 858 struct ttm_bo_device *bdev = bo->bdev;
844 struct ttm_bo_global *glob = bdev->glob;
845 struct ttm_mem_type_manager *man = &bdev->man[mem_type]; 859 struct ttm_mem_type_manager *man = &bdev->man[mem_type];
846 struct drm_mm_node *node;
847 int ret; 860 int ret;
848 861
849 do { 862 do {
850 ret = ttm_bo_man_get_node(bo, man, placement, mem, &node); 863 ret = (*man->func->get_node)(man, bo, placement, mem);
851 if (unlikely(ret != 0)) 864 if (unlikely(ret != 0))
852 return ret; 865 return ret;
853 if (node) 866 if (mem->mm_node)
854 break;
855 spin_lock(&glob->lru_lock);
856 if (list_empty(&man->lru)) {
857 spin_unlock(&glob->lru_lock);
858 break; 867 break;
859 }
860 spin_unlock(&glob->lru_lock);
861 ret = ttm_mem_evict_first(bdev, mem_type, interruptible, 868 ret = ttm_mem_evict_first(bdev, mem_type, interruptible,
862 no_wait_reserve, no_wait_gpu); 869 no_wait_reserve, no_wait_gpu);
863 if (unlikely(ret != 0)) 870 if (unlikely(ret != 0))
864 return ret; 871 return ret;
865 } while (1); 872 } while (1);
866 if (node == NULL) 873 if (mem->mm_node == NULL)
867 return -ENOMEM; 874 return -ENOMEM;
868 mem->mm_node = node;
869 mem->mem_type = mem_type; 875 mem->mem_type = mem_type;
870 return 0; 876 return 0;
871} 877}
@@ -939,7 +945,6 @@ int ttm_bo_mem_space(struct ttm_buffer_object *bo,
939 bool type_found = false; 945 bool type_found = false;
940 bool type_ok = false; 946 bool type_ok = false;
941 bool has_erestartsys = false; 947 bool has_erestartsys = false;
942 struct drm_mm_node *node = NULL;
943 int i, ret; 948 int i, ret;
944 949
945 mem->mm_node = NULL; 950 mem->mm_node = NULL;
@@ -973,17 +978,15 @@ int ttm_bo_mem_space(struct ttm_buffer_object *bo,
973 978
974 if (man->has_type && man->use_type) { 979 if (man->has_type && man->use_type) {
975 type_found = true; 980 type_found = true;
976 ret = ttm_bo_man_get_node(bo, man, placement, mem, 981 ret = (*man->func->get_node)(man, bo, placement, mem);
977 &node);
978 if (unlikely(ret)) 982 if (unlikely(ret))
979 return ret; 983 return ret;
980 } 984 }
981 if (node) 985 if (mem->mm_node)
982 break; 986 break;
983 } 987 }
984 988
985 if ((type_ok && (mem_type == TTM_PL_SYSTEM)) || node) { 989 if ((type_ok && (mem_type == TTM_PL_SYSTEM)) || mem->mm_node) {
986 mem->mm_node = node;
987 mem->mem_type = mem_type; 990 mem->mem_type = mem_type;
988 mem->placement = cur_flags; 991 mem->placement = cur_flags;
989 return 0; 992 return 0;
@@ -1053,9 +1056,9 @@ int ttm_bo_move_buffer(struct ttm_buffer_object *bo,
1053 bool interruptible, bool no_wait_reserve, 1056 bool interruptible, bool no_wait_reserve,
1054 bool no_wait_gpu) 1057 bool no_wait_gpu)
1055{ 1058{
1056 struct ttm_bo_global *glob = bo->glob;
1057 int ret = 0; 1059 int ret = 0;
1058 struct ttm_mem_reg mem; 1060 struct ttm_mem_reg mem;
1061 struct ttm_bo_device *bdev = bo->bdev;
1059 1062
1060 BUG_ON(!atomic_read(&bo->reserved)); 1063 BUG_ON(!atomic_read(&bo->reserved));
1061 1064
@@ -1064,15 +1067,16 @@ int ttm_bo_move_buffer(struct ttm_buffer_object *bo,
1064 * Have the driver move function wait for idle when necessary, 1067 * Have the driver move function wait for idle when necessary,
1065 * instead of doing it here. 1068 * instead of doing it here.
1066 */ 1069 */
1067 spin_lock(&bo->lock); 1070 spin_lock(&bdev->fence_lock);
1068 ret = ttm_bo_wait(bo, false, interruptible, no_wait_gpu); 1071 ret = ttm_bo_wait(bo, false, interruptible, no_wait_gpu);
1069 spin_unlock(&bo->lock); 1072 spin_unlock(&bdev->fence_lock);
1070 if (ret) 1073 if (ret)
1071 return ret; 1074 return ret;
1072 mem.num_pages = bo->num_pages; 1075 mem.num_pages = bo->num_pages;
1073 mem.size = mem.num_pages << PAGE_SHIFT; 1076 mem.size = mem.num_pages << PAGE_SHIFT;
1074 mem.page_alignment = bo->mem.page_alignment; 1077 mem.page_alignment = bo->mem.page_alignment;
1075 mem.bus.io_reserved = false; 1078 mem.bus.io_reserved_vm = false;
1079 mem.bus.io_reserved_count = 0;
1076 /* 1080 /*
1077 * Determine where to move the buffer. 1081 * Determine where to move the buffer.
1078 */ 1082 */
@@ -1081,11 +1085,8 @@ int ttm_bo_move_buffer(struct ttm_buffer_object *bo,
1081 goto out_unlock; 1085 goto out_unlock;
1082 ret = ttm_bo_handle_move_mem(bo, &mem, false, interruptible, no_wait_reserve, no_wait_gpu); 1086 ret = ttm_bo_handle_move_mem(bo, &mem, false, interruptible, no_wait_reserve, no_wait_gpu);
1083out_unlock: 1087out_unlock:
1084 if (ret && mem.mm_node) { 1088 if (ret && mem.mm_node)
1085 spin_lock(&glob->lru_lock); 1089 ttm_bo_mem_put(bo, &mem);
1086 drm_mm_put_block(mem.mm_node);
1087 spin_unlock(&glob->lru_lock);
1088 }
1089 return ret; 1090 return ret;
1090} 1091}
1091 1092
@@ -1093,11 +1094,10 @@ static int ttm_bo_mem_compat(struct ttm_placement *placement,
1093 struct ttm_mem_reg *mem) 1094 struct ttm_mem_reg *mem)
1094{ 1095{
1095 int i; 1096 int i;
1096 struct drm_mm_node *node = mem->mm_node;
1097 1097
1098 if (node && placement->lpfn != 0 && 1098 if (mem->mm_node && placement->lpfn != 0 &&
1099 (node->start < placement->fpfn || 1099 (mem->start < placement->fpfn ||
1100 node->start + node->size > placement->lpfn)) 1100 mem->start + mem->num_pages > placement->lpfn))
1101 return -1; 1101 return -1;
1102 1102
1103 for (i = 0; i < placement->num_placement; i++) { 1103 for (i = 0; i < placement->num_placement; i++) {
@@ -1154,35 +1154,9 @@ EXPORT_SYMBOL(ttm_bo_validate);
1154int ttm_bo_check_placement(struct ttm_buffer_object *bo, 1154int ttm_bo_check_placement(struct ttm_buffer_object *bo,
1155 struct ttm_placement *placement) 1155 struct ttm_placement *placement)
1156{ 1156{
1157 int i; 1157 BUG_ON((placement->fpfn || placement->lpfn) &&
1158 (bo->mem.num_pages > (placement->lpfn - placement->fpfn)));
1158 1159
1159 if (placement->fpfn || placement->lpfn) {
1160 if (bo->mem.num_pages > (placement->lpfn - placement->fpfn)) {
1161 printk(KERN_ERR TTM_PFX "Page number range to small "
1162 "Need %lu pages, range is [%u, %u]\n",
1163 bo->mem.num_pages, placement->fpfn,
1164 placement->lpfn);
1165 return -EINVAL;
1166 }
1167 }
1168 for (i = 0; i < placement->num_placement; i++) {
1169 if (!capable(CAP_SYS_ADMIN)) {
1170 if (placement->placement[i] & TTM_PL_FLAG_NO_EVICT) {
1171 printk(KERN_ERR TTM_PFX "Need to be root to "
1172 "modify NO_EVICT status.\n");
1173 return -EINVAL;
1174 }
1175 }
1176 }
1177 for (i = 0; i < placement->num_busy_placement; i++) {
1178 if (!capable(CAP_SYS_ADMIN)) {
1179 if (placement->busy_placement[i] & TTM_PL_FLAG_NO_EVICT) {
1180 printk(KERN_ERR TTM_PFX "Need to be root to "
1181 "modify NO_EVICT status.\n");
1182 return -EINVAL;
1183 }
1184 }
1185 }
1186 return 0; 1160 return 0;
1187} 1161}
1188 1162
@@ -1194,7 +1168,7 @@ int ttm_bo_init(struct ttm_bo_device *bdev,
1194 uint32_t page_alignment, 1168 uint32_t page_alignment,
1195 unsigned long buffer_start, 1169 unsigned long buffer_start,
1196 bool interruptible, 1170 bool interruptible,
1197 struct file *persistant_swap_storage, 1171 struct file *persistent_swap_storage,
1198 size_t acc_size, 1172 size_t acc_size,
1199 void (*destroy) (struct ttm_buffer_object *)) 1173 void (*destroy) (struct ttm_buffer_object *))
1200{ 1174{
@@ -1205,11 +1179,14 @@ int ttm_bo_init(struct ttm_bo_device *bdev,
1205 num_pages = (size + PAGE_SIZE - 1) >> PAGE_SHIFT; 1179 num_pages = (size + PAGE_SIZE - 1) >> PAGE_SHIFT;
1206 if (num_pages == 0) { 1180 if (num_pages == 0) {
1207 printk(KERN_ERR TTM_PFX "Illegal buffer object size.\n"); 1181 printk(KERN_ERR TTM_PFX "Illegal buffer object size.\n");
1182 if (destroy)
1183 (*destroy)(bo);
1184 else
1185 kfree(bo);
1208 return -EINVAL; 1186 return -EINVAL;
1209 } 1187 }
1210 bo->destroy = destroy; 1188 bo->destroy = destroy;
1211 1189
1212 spin_lock_init(&bo->lock);
1213 kref_init(&bo->kref); 1190 kref_init(&bo->kref);
1214 kref_init(&bo->list_kref); 1191 kref_init(&bo->list_kref);
1215 atomic_set(&bo->cpu_writers, 0); 1192 atomic_set(&bo->cpu_writers, 0);
@@ -1218,6 +1195,7 @@ int ttm_bo_init(struct ttm_bo_device *bdev,
1218 INIT_LIST_HEAD(&bo->lru); 1195 INIT_LIST_HEAD(&bo->lru);
1219 INIT_LIST_HEAD(&bo->ddestroy); 1196 INIT_LIST_HEAD(&bo->ddestroy);
1220 INIT_LIST_HEAD(&bo->swap); 1197 INIT_LIST_HEAD(&bo->swap);
1198 INIT_LIST_HEAD(&bo->io_reserve_lru);
1221 bo->bdev = bdev; 1199 bo->bdev = bdev;
1222 bo->glob = bdev->glob; 1200 bo->glob = bdev->glob;
1223 bo->type = type; 1201 bo->type = type;
@@ -1227,12 +1205,13 @@ int ttm_bo_init(struct ttm_bo_device *bdev,
1227 bo->mem.num_pages = bo->num_pages; 1205 bo->mem.num_pages = bo->num_pages;
1228 bo->mem.mm_node = NULL; 1206 bo->mem.mm_node = NULL;
1229 bo->mem.page_alignment = page_alignment; 1207 bo->mem.page_alignment = page_alignment;
1230 bo->mem.bus.io_reserved = false; 1208 bo->mem.bus.io_reserved_vm = false;
1209 bo->mem.bus.io_reserved_count = 0;
1231 bo->buffer_start = buffer_start & PAGE_MASK; 1210 bo->buffer_start = buffer_start & PAGE_MASK;
1232 bo->priv_flags = 0; 1211 bo->priv_flags = 0;
1233 bo->mem.placement = (TTM_PL_FLAG_SYSTEM | TTM_PL_FLAG_CACHED); 1212 bo->mem.placement = (TTM_PL_FLAG_SYSTEM | TTM_PL_FLAG_CACHED);
1234 bo->seq_valid = false; 1213 bo->seq_valid = false;
1235 bo->persistant_swap_storage = persistant_swap_storage; 1214 bo->persistent_swap_storage = persistent_swap_storage;
1236 bo->acc_size = acc_size; 1215 bo->acc_size = acc_size;
1237 atomic_inc(&bo->glob->bo_count); 1216 atomic_inc(&bo->glob->bo_count);
1238 1217
@@ -1281,7 +1260,7 @@ int ttm_bo_create(struct ttm_bo_device *bdev,
1281 uint32_t page_alignment, 1260 uint32_t page_alignment,
1282 unsigned long buffer_start, 1261 unsigned long buffer_start,
1283 bool interruptible, 1262 bool interruptible,
1284 struct file *persistant_swap_storage, 1263 struct file *persistent_swap_storage,
1285 struct ttm_buffer_object **p_bo) 1264 struct ttm_buffer_object **p_bo)
1286{ 1265{
1287 struct ttm_buffer_object *bo; 1266 struct ttm_buffer_object *bo;
@@ -1303,7 +1282,7 @@ int ttm_bo_create(struct ttm_bo_device *bdev,
1303 1282
1304 ret = ttm_bo_init(bdev, bo, size, type, placement, page_alignment, 1283 ret = ttm_bo_init(bdev, bo, size, type, placement, page_alignment,
1305 buffer_start, interruptible, 1284 buffer_start, interruptible,
1306 persistant_swap_storage, acc_size, NULL); 1285 persistent_swap_storage, acc_size, NULL);
1307 if (likely(ret == 0)) 1286 if (likely(ret == 0))
1308 *p_bo = bo; 1287 *p_bo = bo;
1309 1288
@@ -1341,7 +1320,6 @@ static int ttm_bo_force_list_clean(struct ttm_bo_device *bdev,
1341 1320
1342int ttm_bo_clean_mm(struct ttm_bo_device *bdev, unsigned mem_type) 1321int ttm_bo_clean_mm(struct ttm_bo_device *bdev, unsigned mem_type)
1343{ 1322{
1344 struct ttm_bo_global *glob = bdev->glob;
1345 struct ttm_mem_type_manager *man; 1323 struct ttm_mem_type_manager *man;
1346 int ret = -EINVAL; 1324 int ret = -EINVAL;
1347 1325
@@ -1364,13 +1342,7 @@ int ttm_bo_clean_mm(struct ttm_bo_device *bdev, unsigned mem_type)
1364 if (mem_type > 0) { 1342 if (mem_type > 0) {
1365 ttm_bo_force_list_clean(bdev, mem_type, false); 1343 ttm_bo_force_list_clean(bdev, mem_type, false);
1366 1344
1367 spin_lock(&glob->lru_lock); 1345 ret = (*man->func->takedown)(man);
1368 if (drm_mm_clean(&man->manager))
1369 drm_mm_takedown(&man->manager);
1370 else
1371 ret = -EBUSY;
1372
1373 spin_unlock(&glob->lru_lock);
1374 } 1346 }
1375 1347
1376 return ret; 1348 return ret;
@@ -1405,32 +1377,22 @@ int ttm_bo_init_mm(struct ttm_bo_device *bdev, unsigned type,
1405 int ret = -EINVAL; 1377 int ret = -EINVAL;
1406 struct ttm_mem_type_manager *man; 1378 struct ttm_mem_type_manager *man;
1407 1379
1408 if (type >= TTM_NUM_MEM_TYPES) { 1380 BUG_ON(type >= TTM_NUM_MEM_TYPES);
1409 printk(KERN_ERR TTM_PFX "Illegal memory type %d\n", type);
1410 return ret;
1411 }
1412
1413 man = &bdev->man[type]; 1381 man = &bdev->man[type];
1414 if (man->has_type) { 1382 BUG_ON(man->has_type);
1415 printk(KERN_ERR TTM_PFX 1383 man->io_reserve_fastpath = true;
1416 "Memory manager already initialized for type %d\n", 1384 man->use_io_reserve_lru = false;
1417 type); 1385 mutex_init(&man->io_reserve_mutex);
1418 return ret; 1386 INIT_LIST_HEAD(&man->io_reserve_lru);
1419 }
1420 1387
1421 ret = bdev->driver->init_mem_type(bdev, type, man); 1388 ret = bdev->driver->init_mem_type(bdev, type, man);
1422 if (ret) 1389 if (ret)
1423 return ret; 1390 return ret;
1391 man->bdev = bdev;
1424 1392
1425 ret = 0; 1393 ret = 0;
1426 if (type != TTM_PL_SYSTEM) { 1394 if (type != TTM_PL_SYSTEM) {
1427 if (!p_size) { 1395 ret = (*man->func->init)(man, p_size);
1428 printk(KERN_ERR TTM_PFX
1429 "Zero size memory manager type %d\n",
1430 type);
1431 return ret;
1432 }
1433 ret = drm_mm_init(&man->manager, 0, p_size);
1434 if (ret) 1396 if (ret)
1435 return ret; 1397 return ret;
1436 } 1398 }
@@ -1539,8 +1501,7 @@ int ttm_bo_device_release(struct ttm_bo_device *bdev)
1539 list_del(&bdev->device_list); 1501 list_del(&bdev->device_list);
1540 mutex_unlock(&glob->device_list_mutex); 1502 mutex_unlock(&glob->device_list_mutex);
1541 1503
1542 if (!cancel_delayed_work(&bdev->wq)) 1504 cancel_delayed_work_sync(&bdev->wq);
1543 flush_scheduled_work();
1544 1505
1545 while (ttm_bo_delayed_delete(bdev, true)) 1506 while (ttm_bo_delayed_delete(bdev, true))
1546 ; 1507 ;
@@ -1594,7 +1555,8 @@ int ttm_bo_device_init(struct ttm_bo_device *bdev,
1594 bdev->dev_mapping = NULL; 1555 bdev->dev_mapping = NULL;
1595 bdev->glob = glob; 1556 bdev->glob = glob;
1596 bdev->need_dma32 = need_dma32; 1557 bdev->need_dma32 = need_dma32;
1597 1558 bdev->val_seq = 0;
1559 spin_lock_init(&bdev->fence_lock);
1598 mutex_lock(&glob->device_list_mutex); 1560 mutex_lock(&glob->device_list_mutex);
1599 list_add_tail(&bdev->device_list, &glob->device_list); 1561 list_add_tail(&bdev->device_list, &glob->device_list);
1600 mutex_unlock(&glob->device_list_mutex); 1562 mutex_unlock(&glob->device_list_mutex);
@@ -1628,7 +1590,7 @@ bool ttm_mem_reg_is_pci(struct ttm_bo_device *bdev, struct ttm_mem_reg *mem)
1628 return true; 1590 return true;
1629} 1591}
1630 1592
1631void ttm_bo_unmap_virtual(struct ttm_buffer_object *bo) 1593void ttm_bo_unmap_virtual_locked(struct ttm_buffer_object *bo)
1632{ 1594{
1633 struct ttm_bo_device *bdev = bo->bdev; 1595 struct ttm_bo_device *bdev = bo->bdev;
1634 loff_t offset = (loff_t) bo->addr_space_offset; 1596 loff_t offset = (loff_t) bo->addr_space_offset;
@@ -1637,8 +1599,20 @@ void ttm_bo_unmap_virtual(struct ttm_buffer_object *bo)
1637 if (!bdev->dev_mapping) 1599 if (!bdev->dev_mapping)
1638 return; 1600 return;
1639 unmap_mapping_range(bdev->dev_mapping, offset, holelen, 1); 1601 unmap_mapping_range(bdev->dev_mapping, offset, holelen, 1);
1640 ttm_mem_io_free(bdev, &bo->mem); 1602 ttm_mem_io_free_vm(bo);
1603}
1604
1605void ttm_bo_unmap_virtual(struct ttm_buffer_object *bo)
1606{
1607 struct ttm_bo_device *bdev = bo->bdev;
1608 struct ttm_mem_type_manager *man = &bdev->man[bo->mem.mem_type];
1609
1610 ttm_mem_io_lock(man, false);
1611 ttm_bo_unmap_virtual_locked(bo);
1612 ttm_mem_io_unlock(man);
1641} 1613}
1614
1615
1642EXPORT_SYMBOL(ttm_bo_unmap_virtual); 1616EXPORT_SYMBOL(ttm_bo_unmap_virtual);
1643 1617
1644static void ttm_bo_vm_insert_rb(struct ttm_buffer_object *bo) 1618static void ttm_bo_vm_insert_rb(struct ttm_buffer_object *bo)
@@ -1718,6 +1692,7 @@ int ttm_bo_wait(struct ttm_buffer_object *bo,
1718 bool lazy, bool interruptible, bool no_wait) 1692 bool lazy, bool interruptible, bool no_wait)
1719{ 1693{
1720 struct ttm_bo_driver *driver = bo->bdev->driver; 1694 struct ttm_bo_driver *driver = bo->bdev->driver;
1695 struct ttm_bo_device *bdev = bo->bdev;
1721 void *sync_obj; 1696 void *sync_obj;
1722 void *sync_obj_arg; 1697 void *sync_obj_arg;
1723 int ret = 0; 1698 int ret = 0;
@@ -1731,9 +1706,9 @@ int ttm_bo_wait(struct ttm_buffer_object *bo,
1731 void *tmp_obj = bo->sync_obj; 1706 void *tmp_obj = bo->sync_obj;
1732 bo->sync_obj = NULL; 1707 bo->sync_obj = NULL;
1733 clear_bit(TTM_BO_PRIV_FLAG_MOVING, &bo->priv_flags); 1708 clear_bit(TTM_BO_PRIV_FLAG_MOVING, &bo->priv_flags);
1734 spin_unlock(&bo->lock); 1709 spin_unlock(&bdev->fence_lock);
1735 driver->sync_obj_unref(&tmp_obj); 1710 driver->sync_obj_unref(&tmp_obj);
1736 spin_lock(&bo->lock); 1711 spin_lock(&bdev->fence_lock);
1737 continue; 1712 continue;
1738 } 1713 }
1739 1714
@@ -1742,29 +1717,29 @@ int ttm_bo_wait(struct ttm_buffer_object *bo,
1742 1717
1743 sync_obj = driver->sync_obj_ref(bo->sync_obj); 1718 sync_obj = driver->sync_obj_ref(bo->sync_obj);
1744 sync_obj_arg = bo->sync_obj_arg; 1719 sync_obj_arg = bo->sync_obj_arg;
1745 spin_unlock(&bo->lock); 1720 spin_unlock(&bdev->fence_lock);
1746 ret = driver->sync_obj_wait(sync_obj, sync_obj_arg, 1721 ret = driver->sync_obj_wait(sync_obj, sync_obj_arg,
1747 lazy, interruptible); 1722 lazy, interruptible);
1748 if (unlikely(ret != 0)) { 1723 if (unlikely(ret != 0)) {
1749 driver->sync_obj_unref(&sync_obj); 1724 driver->sync_obj_unref(&sync_obj);
1750 spin_lock(&bo->lock); 1725 spin_lock(&bdev->fence_lock);
1751 return ret; 1726 return ret;
1752 } 1727 }
1753 spin_lock(&bo->lock); 1728 spin_lock(&bdev->fence_lock);
1754 if (likely(bo->sync_obj == sync_obj && 1729 if (likely(bo->sync_obj == sync_obj &&
1755 bo->sync_obj_arg == sync_obj_arg)) { 1730 bo->sync_obj_arg == sync_obj_arg)) {
1756 void *tmp_obj = bo->sync_obj; 1731 void *tmp_obj = bo->sync_obj;
1757 bo->sync_obj = NULL; 1732 bo->sync_obj = NULL;
1758 clear_bit(TTM_BO_PRIV_FLAG_MOVING, 1733 clear_bit(TTM_BO_PRIV_FLAG_MOVING,
1759 &bo->priv_flags); 1734 &bo->priv_flags);
1760 spin_unlock(&bo->lock); 1735 spin_unlock(&bdev->fence_lock);
1761 driver->sync_obj_unref(&sync_obj); 1736 driver->sync_obj_unref(&sync_obj);
1762 driver->sync_obj_unref(&tmp_obj); 1737 driver->sync_obj_unref(&tmp_obj);
1763 spin_lock(&bo->lock); 1738 spin_lock(&bdev->fence_lock);
1764 } else { 1739 } else {
1765 spin_unlock(&bo->lock); 1740 spin_unlock(&bdev->fence_lock);
1766 driver->sync_obj_unref(&sync_obj); 1741 driver->sync_obj_unref(&sync_obj);
1767 spin_lock(&bo->lock); 1742 spin_lock(&bdev->fence_lock);
1768 } 1743 }
1769 } 1744 }
1770 return 0; 1745 return 0;
@@ -1773,6 +1748,7 @@ EXPORT_SYMBOL(ttm_bo_wait);
1773 1748
1774int ttm_bo_synccpu_write_grab(struct ttm_buffer_object *bo, bool no_wait) 1749int ttm_bo_synccpu_write_grab(struct ttm_buffer_object *bo, bool no_wait)
1775{ 1750{
1751 struct ttm_bo_device *bdev = bo->bdev;
1776 int ret = 0; 1752 int ret = 0;
1777 1753
1778 /* 1754 /*
@@ -1782,9 +1758,9 @@ int ttm_bo_synccpu_write_grab(struct ttm_buffer_object *bo, bool no_wait)
1782 ret = ttm_bo_reserve(bo, true, no_wait, false, 0); 1758 ret = ttm_bo_reserve(bo, true, no_wait, false, 0);
1783 if (unlikely(ret != 0)) 1759 if (unlikely(ret != 0))
1784 return ret; 1760 return ret;
1785 spin_lock(&bo->lock); 1761 spin_lock(&bdev->fence_lock);
1786 ret = ttm_bo_wait(bo, false, true, no_wait); 1762 ret = ttm_bo_wait(bo, false, true, no_wait);
1787 spin_unlock(&bo->lock); 1763 spin_unlock(&bdev->fence_lock);
1788 if (likely(ret == 0)) 1764 if (likely(ret == 0))
1789 atomic_inc(&bo->cpu_writers); 1765 atomic_inc(&bo->cpu_writers);
1790 ttm_bo_unreserve(bo); 1766 ttm_bo_unreserve(bo);
@@ -1824,6 +1800,13 @@ static int ttm_bo_swapout(struct ttm_mem_shrink *shrink)
1824 struct ttm_buffer_object, swap); 1800 struct ttm_buffer_object, swap);
1825 kref_get(&bo->list_kref); 1801 kref_get(&bo->list_kref);
1826 1802
1803 if (!list_empty(&bo->ddestroy)) {
1804 spin_unlock(&glob->lru_lock);
1805 (void) ttm_bo_cleanup_refs(bo, false, false, false);
1806 kref_put(&bo->list_kref, ttm_bo_release_list);
1807 continue;
1808 }
1809
1827 /** 1810 /**
1828 * Reserve buffer. Since we unlock while sleeping, we need 1811 * Reserve buffer. Since we unlock while sleeping, we need
1829 * to re-check that nobody removed us from the swap-list while 1812 * to re-check that nobody removed us from the swap-list while
@@ -1843,16 +1826,15 @@ static int ttm_bo_swapout(struct ttm_mem_shrink *shrink)
1843 put_count = ttm_bo_del_from_lru(bo); 1826 put_count = ttm_bo_del_from_lru(bo);
1844 spin_unlock(&glob->lru_lock); 1827 spin_unlock(&glob->lru_lock);
1845 1828
1846 while (put_count--) 1829 ttm_bo_list_ref_sub(bo, put_count, true);
1847 kref_put(&bo->list_kref, ttm_bo_ref_bug);
1848 1830
1849 /** 1831 /**
1850 * Wait for GPU, then move to system cached. 1832 * Wait for GPU, then move to system cached.
1851 */ 1833 */
1852 1834
1853 spin_lock(&bo->lock); 1835 spin_lock(&bo->bdev->fence_lock);
1854 ret = ttm_bo_wait(bo, false, false, false); 1836 ret = ttm_bo_wait(bo, false, false, false);
1855 spin_unlock(&bo->lock); 1837 spin_unlock(&bo->bdev->fence_lock);
1856 1838
1857 if (unlikely(ret != 0)) 1839 if (unlikely(ret != 0))
1858 goto out; 1840 goto out;
@@ -1881,7 +1863,7 @@ static int ttm_bo_swapout(struct ttm_mem_shrink *shrink)
1881 if (bo->bdev->driver->swap_notify) 1863 if (bo->bdev->driver->swap_notify)
1882 bo->bdev->driver->swap_notify(bo); 1864 bo->bdev->driver->swap_notify(bo);
1883 1865
1884 ret = ttm_tt_swapout(bo->ttm, bo->persistant_swap_storage); 1866 ret = ttm_tt_swapout(bo->ttm, bo->persistent_swap_storage);
1885out: 1867out:
1886 1868
1887 /** 1869 /**
diff --git a/drivers/gpu/drm/ttm/ttm_bo_manager.c b/drivers/gpu/drm/ttm/ttm_bo_manager.c
new file mode 100644
index 000000000000..038e947d00f9
--- /dev/null
+++ b/drivers/gpu/drm/ttm/ttm_bo_manager.c
@@ -0,0 +1,157 @@
1/**************************************************************************
2 *
3 * Copyright (c) 2007-2010 VMware, Inc., Palo Alto, CA., USA
4 * All Rights Reserved.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sub license, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
13 *
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial portions
16 * of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
21 * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
22 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
23 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
24 * USE OR OTHER DEALINGS IN THE SOFTWARE.
25 *
26 **************************************************************************/
27/*
28 * Authors: Thomas Hellstrom <thellstrom-at-vmware-dot-com>
29 */
30
31#include "ttm/ttm_module.h"
32#include "ttm/ttm_bo_driver.h"
33#include "ttm/ttm_placement.h"
34#include "drm_mm.h"
35#include <linux/slab.h>
36#include <linux/spinlock.h>
37#include <linux/module.h>
38
39/**
40 * Currently we use a spinlock for the lock, but a mutex *may* be
41 * more appropriate to reduce scheduling latency if the range manager
42 * ends up with very fragmented allocation patterns.
43 */
44
45struct ttm_range_manager {
46 struct drm_mm mm;
47 spinlock_t lock;
48};
49
50static int ttm_bo_man_get_node(struct ttm_mem_type_manager *man,
51 struct ttm_buffer_object *bo,
52 struct ttm_placement *placement,
53 struct ttm_mem_reg *mem)
54{
55 struct ttm_range_manager *rman = (struct ttm_range_manager *) man->priv;
56 struct drm_mm *mm = &rman->mm;
57 struct drm_mm_node *node = NULL;
58 unsigned long lpfn;
59 int ret;
60
61 lpfn = placement->lpfn;
62 if (!lpfn)
63 lpfn = man->size;
64 do {
65 ret = drm_mm_pre_get(mm);
66 if (unlikely(ret))
67 return ret;
68
69 spin_lock(&rman->lock);
70 node = drm_mm_search_free_in_range(mm,
71 mem->num_pages, mem->page_alignment,
72 placement->fpfn, lpfn, 1);
73 if (unlikely(node == NULL)) {
74 spin_unlock(&rman->lock);
75 return 0;
76 }
77 node = drm_mm_get_block_atomic_range(node, mem->num_pages,
78 mem->page_alignment,
79 placement->fpfn,
80 lpfn);
81 spin_unlock(&rman->lock);
82 } while (node == NULL);
83
84 mem->mm_node = node;
85 mem->start = node->start;
86 return 0;
87}
88
89static void ttm_bo_man_put_node(struct ttm_mem_type_manager *man,
90 struct ttm_mem_reg *mem)
91{
92 struct ttm_range_manager *rman = (struct ttm_range_manager *) man->priv;
93
94 if (mem->mm_node) {
95 spin_lock(&rman->lock);
96 drm_mm_put_block(mem->mm_node);
97 spin_unlock(&rman->lock);
98 mem->mm_node = NULL;
99 }
100}
101
102static int ttm_bo_man_init(struct ttm_mem_type_manager *man,
103 unsigned long p_size)
104{
105 struct ttm_range_manager *rman;
106 int ret;
107
108 rman = kzalloc(sizeof(*rman), GFP_KERNEL);
109 if (!rman)
110 return -ENOMEM;
111
112 ret = drm_mm_init(&rman->mm, 0, p_size);
113 if (ret) {
114 kfree(rman);
115 return ret;
116 }
117
118 spin_lock_init(&rman->lock);
119 man->priv = rman;
120 return 0;
121}
122
123static int ttm_bo_man_takedown(struct ttm_mem_type_manager *man)
124{
125 struct ttm_range_manager *rman = (struct ttm_range_manager *) man->priv;
126 struct drm_mm *mm = &rman->mm;
127
128 spin_lock(&rman->lock);
129 if (drm_mm_clean(mm)) {
130 drm_mm_takedown(mm);
131 spin_unlock(&rman->lock);
132 kfree(rman);
133 man->priv = NULL;
134 return 0;
135 }
136 spin_unlock(&rman->lock);
137 return -EBUSY;
138}
139
140static void ttm_bo_man_debug(struct ttm_mem_type_manager *man,
141 const char *prefix)
142{
143 struct ttm_range_manager *rman = (struct ttm_range_manager *) man->priv;
144
145 spin_lock(&rman->lock);
146 drm_mm_debug_table(&rman->mm, prefix);
147 spin_unlock(&rman->lock);
148}
149
150const struct ttm_mem_type_manager_func ttm_bo_manager_func = {
151 ttm_bo_man_init,
152 ttm_bo_man_takedown,
153 ttm_bo_man_get_node,
154 ttm_bo_man_put_node,
155 ttm_bo_man_debug
156};
157EXPORT_SYMBOL(ttm_bo_manager_func);
diff --git a/drivers/gpu/drm/ttm/ttm_bo_util.c b/drivers/gpu/drm/ttm/ttm_bo_util.c
index 3451a82adba7..77dbf408c0d0 100644
--- a/drivers/gpu/drm/ttm/ttm_bo_util.c
+++ b/drivers/gpu/drm/ttm/ttm_bo_util.c
@@ -39,14 +39,7 @@
39 39
40void ttm_bo_free_old_node(struct ttm_buffer_object *bo) 40void ttm_bo_free_old_node(struct ttm_buffer_object *bo)
41{ 41{
42 struct ttm_mem_reg *old_mem = &bo->mem; 42 ttm_bo_mem_put(bo, &bo->mem);
43
44 if (old_mem->mm_node) {
45 spin_lock(&bo->glob->lru_lock);
46 drm_mm_put_block(old_mem->mm_node);
47 spin_unlock(&bo->glob->lru_lock);
48 }
49 old_mem->mm_node = NULL;
50} 43}
51 44
52int ttm_bo_move_ttm(struct ttm_buffer_object *bo, 45int ttm_bo_move_ttm(struct ttm_buffer_object *bo,
@@ -82,37 +75,123 @@ int ttm_bo_move_ttm(struct ttm_buffer_object *bo,
82} 75}
83EXPORT_SYMBOL(ttm_bo_move_ttm); 76EXPORT_SYMBOL(ttm_bo_move_ttm);
84 77
85int ttm_mem_io_reserve(struct ttm_bo_device *bdev, struct ttm_mem_reg *mem) 78int ttm_mem_io_lock(struct ttm_mem_type_manager *man, bool interruptible)
86{ 79{
87 int ret; 80 if (likely(man->io_reserve_fastpath))
81 return 0;
82
83 if (interruptible)
84 return mutex_lock_interruptible(&man->io_reserve_mutex);
85
86 mutex_lock(&man->io_reserve_mutex);
87 return 0;
88}
89
90void ttm_mem_io_unlock(struct ttm_mem_type_manager *man)
91{
92 if (likely(man->io_reserve_fastpath))
93 return;
94
95 mutex_unlock(&man->io_reserve_mutex);
96}
97
98static int ttm_mem_io_evict(struct ttm_mem_type_manager *man)
99{
100 struct ttm_buffer_object *bo;
101
102 if (!man->use_io_reserve_lru || list_empty(&man->io_reserve_lru))
103 return -EAGAIN;
104
105 bo = list_first_entry(&man->io_reserve_lru,
106 struct ttm_buffer_object,
107 io_reserve_lru);
108 list_del_init(&bo->io_reserve_lru);
109 ttm_bo_unmap_virtual_locked(bo);
110
111 return 0;
112}
113
114static int ttm_mem_io_reserve(struct ttm_bo_device *bdev,
115 struct ttm_mem_reg *mem)
116{
117 struct ttm_mem_type_manager *man = &bdev->man[mem->mem_type];
118 int ret = 0;
119
120 if (!bdev->driver->io_mem_reserve)
121 return 0;
122 if (likely(man->io_reserve_fastpath))
123 return bdev->driver->io_mem_reserve(bdev, mem);
88 124
89 if (!mem->bus.io_reserved) { 125 if (bdev->driver->io_mem_reserve &&
90 mem->bus.io_reserved = true; 126 mem->bus.io_reserved_count++ == 0) {
127retry:
91 ret = bdev->driver->io_mem_reserve(bdev, mem); 128 ret = bdev->driver->io_mem_reserve(bdev, mem);
129 if (ret == -EAGAIN) {
130 ret = ttm_mem_io_evict(man);
131 if (ret == 0)
132 goto retry;
133 }
134 }
135 return ret;
136}
137
138static void ttm_mem_io_free(struct ttm_bo_device *bdev,
139 struct ttm_mem_reg *mem)
140{
141 struct ttm_mem_type_manager *man = &bdev->man[mem->mem_type];
142
143 if (likely(man->io_reserve_fastpath))
144 return;
145
146 if (bdev->driver->io_mem_reserve &&
147 --mem->bus.io_reserved_count == 0 &&
148 bdev->driver->io_mem_free)
149 bdev->driver->io_mem_free(bdev, mem);
150
151}
152
153int ttm_mem_io_reserve_vm(struct ttm_buffer_object *bo)
154{
155 struct ttm_mem_reg *mem = &bo->mem;
156 int ret;
157
158 if (!mem->bus.io_reserved_vm) {
159 struct ttm_mem_type_manager *man =
160 &bo->bdev->man[mem->mem_type];
161
162 ret = ttm_mem_io_reserve(bo->bdev, mem);
92 if (unlikely(ret != 0)) 163 if (unlikely(ret != 0))
93 return ret; 164 return ret;
165 mem->bus.io_reserved_vm = true;
166 if (man->use_io_reserve_lru)
167 list_add_tail(&bo->io_reserve_lru,
168 &man->io_reserve_lru);
94 } 169 }
95 return 0; 170 return 0;
96} 171}
97 172
98void ttm_mem_io_free(struct ttm_bo_device *bdev, struct ttm_mem_reg *mem) 173void ttm_mem_io_free_vm(struct ttm_buffer_object *bo)
99{ 174{
100 if (bdev->driver->io_mem_reserve) { 175 struct ttm_mem_reg *mem = &bo->mem;
101 if (mem->bus.io_reserved) { 176
102 mem->bus.io_reserved = false; 177 if (mem->bus.io_reserved_vm) {
103 bdev->driver->io_mem_free(bdev, mem); 178 mem->bus.io_reserved_vm = false;
104 } 179 list_del_init(&bo->io_reserve_lru);
180 ttm_mem_io_free(bo->bdev, mem);
105 } 181 }
106} 182}
107 183
108int ttm_mem_reg_ioremap(struct ttm_bo_device *bdev, struct ttm_mem_reg *mem, 184int ttm_mem_reg_ioremap(struct ttm_bo_device *bdev, struct ttm_mem_reg *mem,
109 void **virtual) 185 void **virtual)
110{ 186{
187 struct ttm_mem_type_manager *man = &bdev->man[mem->mem_type];
111 int ret; 188 int ret;
112 void *addr; 189 void *addr;
113 190
114 *virtual = NULL; 191 *virtual = NULL;
192 (void) ttm_mem_io_lock(man, false);
115 ret = ttm_mem_io_reserve(bdev, mem); 193 ret = ttm_mem_io_reserve(bdev, mem);
194 ttm_mem_io_unlock(man);
116 if (ret || !mem->bus.is_iomem) 195 if (ret || !mem->bus.is_iomem)
117 return ret; 196 return ret;
118 197
@@ -124,7 +203,9 @@ int ttm_mem_reg_ioremap(struct ttm_bo_device *bdev, struct ttm_mem_reg *mem,
124 else 203 else
125 addr = ioremap_nocache(mem->bus.base + mem->bus.offset, mem->bus.size); 204 addr = ioremap_nocache(mem->bus.base + mem->bus.offset, mem->bus.size);
126 if (!addr) { 205 if (!addr) {
206 (void) ttm_mem_io_lock(man, false);
127 ttm_mem_io_free(bdev, mem); 207 ttm_mem_io_free(bdev, mem);
208 ttm_mem_io_unlock(man);
128 return -ENOMEM; 209 return -ENOMEM;
129 } 210 }
130 } 211 }
@@ -141,7 +222,9 @@ void ttm_mem_reg_iounmap(struct ttm_bo_device *bdev, struct ttm_mem_reg *mem,
141 222
142 if (virtual && mem->bus.addr == NULL) 223 if (virtual && mem->bus.addr == NULL)
143 iounmap(virtual); 224 iounmap(virtual);
225 (void) ttm_mem_io_lock(man, false);
144 ttm_mem_io_free(bdev, mem); 226 ttm_mem_io_free(bdev, mem);
227 ttm_mem_io_unlock(man);
145} 228}
146 229
147static int ttm_copy_io_page(void *dst, void *src, unsigned long page) 230static int ttm_copy_io_page(void *dst, void *src, unsigned long page)
@@ -170,7 +253,7 @@ static int ttm_copy_io_ttm_page(struct ttm_tt *ttm, void *src,
170 src = (void *)((unsigned long)src + (page << PAGE_SHIFT)); 253 src = (void *)((unsigned long)src + (page << PAGE_SHIFT));
171 254
172#ifdef CONFIG_X86 255#ifdef CONFIG_X86
173 dst = kmap_atomic_prot(d, KM_USER0, prot); 256 dst = kmap_atomic_prot(d, prot);
174#else 257#else
175 if (pgprot_val(prot) != pgprot_val(PAGE_KERNEL)) 258 if (pgprot_val(prot) != pgprot_val(PAGE_KERNEL))
176 dst = vmap(&d, 1, 0, prot); 259 dst = vmap(&d, 1, 0, prot);
@@ -183,7 +266,7 @@ static int ttm_copy_io_ttm_page(struct ttm_tt *ttm, void *src,
183 memcpy_fromio(dst, src, PAGE_SIZE); 266 memcpy_fromio(dst, src, PAGE_SIZE);
184 267
185#ifdef CONFIG_X86 268#ifdef CONFIG_X86
186 kunmap_atomic(dst, KM_USER0); 269 kunmap_atomic(dst);
187#else 270#else
188 if (pgprot_val(prot) != pgprot_val(PAGE_KERNEL)) 271 if (pgprot_val(prot) != pgprot_val(PAGE_KERNEL))
189 vunmap(dst); 272 vunmap(dst);
@@ -206,7 +289,7 @@ static int ttm_copy_ttm_io_page(struct ttm_tt *ttm, void *dst,
206 289
207 dst = (void *)((unsigned long)dst + (page << PAGE_SHIFT)); 290 dst = (void *)((unsigned long)dst + (page << PAGE_SHIFT));
208#ifdef CONFIG_X86 291#ifdef CONFIG_X86
209 src = kmap_atomic_prot(s, KM_USER0, prot); 292 src = kmap_atomic_prot(s, prot);
210#else 293#else
211 if (pgprot_val(prot) != pgprot_val(PAGE_KERNEL)) 294 if (pgprot_val(prot) != pgprot_val(PAGE_KERNEL))
212 src = vmap(&s, 1, 0, prot); 295 src = vmap(&s, 1, 0, prot);
@@ -219,7 +302,7 @@ static int ttm_copy_ttm_io_page(struct ttm_tt *ttm, void *dst,
219 memcpy_toio(dst, src, PAGE_SIZE); 302 memcpy_toio(dst, src, PAGE_SIZE);
220 303
221#ifdef CONFIG_X86 304#ifdef CONFIG_X86
222 kunmap_atomic(src, KM_USER0); 305 kunmap_atomic(src);
223#else 306#else
224 if (pgprot_val(prot) != pgprot_val(PAGE_KERNEL)) 307 if (pgprot_val(prot) != pgprot_val(PAGE_KERNEL))
225 vunmap(src); 308 vunmap(src);
@@ -238,7 +321,7 @@ int ttm_bo_move_memcpy(struct ttm_buffer_object *bo,
238 struct ttm_mem_type_manager *man = &bdev->man[new_mem->mem_type]; 321 struct ttm_mem_type_manager *man = &bdev->man[new_mem->mem_type];
239 struct ttm_tt *ttm = bo->ttm; 322 struct ttm_tt *ttm = bo->ttm;
240 struct ttm_mem_reg *old_mem = &bo->mem; 323 struct ttm_mem_reg *old_mem = &bo->mem;
241 struct ttm_mem_reg old_copy = *old_mem; 324 struct ttm_mem_reg old_copy;
242 void *old_iomap; 325 void *old_iomap;
243 void *new_iomap; 326 void *new_iomap;
244 int ret; 327 int ret;
@@ -263,8 +346,7 @@ int ttm_bo_move_memcpy(struct ttm_buffer_object *bo,
263 dir = 1; 346 dir = 1;
264 347
265 if ((old_mem->mem_type == new_mem->mem_type) && 348 if ((old_mem->mem_type == new_mem->mem_type) &&
266 (new_mem->mm_node->start < 349 (new_mem->start < old_mem->start + old_mem->size)) {
267 old_mem->mm_node->start + old_mem->mm_node->size)) {
268 dir = -1; 350 dir = -1;
269 add = new_mem->num_pages - 1; 351 add = new_mem->num_pages - 1;
270 } 352 }
@@ -288,8 +370,7 @@ int ttm_bo_move_memcpy(struct ttm_buffer_object *bo,
288 } 370 }
289 mb(); 371 mb();
290out2: 372out2:
291 ttm_bo_free_old_node(bo); 373 old_copy = *old_mem;
292
293 *old_mem = *new_mem; 374 *old_mem = *new_mem;
294 new_mem->mm_node = NULL; 375 new_mem->mm_node = NULL;
295 376
@@ -300,9 +381,10 @@ out2:
300 } 381 }
301 382
302out1: 383out1:
303 ttm_mem_reg_iounmap(bdev, new_mem, new_iomap); 384 ttm_mem_reg_iounmap(bdev, old_mem, new_iomap);
304out: 385out:
305 ttm_mem_reg_iounmap(bdev, &old_copy, old_iomap); 386 ttm_mem_reg_iounmap(bdev, &old_copy, old_iomap);
387 ttm_bo_mem_put(bo, &old_copy);
306 return ret; 388 return ret;
307} 389}
308EXPORT_SYMBOL(ttm_bo_move_memcpy); 390EXPORT_SYMBOL(ttm_bo_move_memcpy);
@@ -345,11 +427,11 @@ static int ttm_buffer_object_transfer(struct ttm_buffer_object *bo,
345 * TODO: Explicit member copy would probably be better here. 427 * TODO: Explicit member copy would probably be better here.
346 */ 428 */
347 429
348 spin_lock_init(&fbo->lock);
349 init_waitqueue_head(&fbo->event_queue); 430 init_waitqueue_head(&fbo->event_queue);
350 INIT_LIST_HEAD(&fbo->ddestroy); 431 INIT_LIST_HEAD(&fbo->ddestroy);
351 INIT_LIST_HEAD(&fbo->lru); 432 INIT_LIST_HEAD(&fbo->lru);
352 INIT_LIST_HEAD(&fbo->swap); 433 INIT_LIST_HEAD(&fbo->swap);
434 INIT_LIST_HEAD(&fbo->io_reserve_lru);
353 fbo->vm_node = NULL; 435 fbo->vm_node = NULL;
354 atomic_set(&fbo->cpu_writers, 0); 436 atomic_set(&fbo->cpu_writers, 0);
355 437
@@ -461,6 +543,8 @@ int ttm_bo_kmap(struct ttm_buffer_object *bo,
461 unsigned long start_page, unsigned long num_pages, 543 unsigned long start_page, unsigned long num_pages,
462 struct ttm_bo_kmap_obj *map) 544 struct ttm_bo_kmap_obj *map)
463{ 545{
546 struct ttm_mem_type_manager *man =
547 &bo->bdev->man[bo->mem.mem_type];
464 unsigned long offset, size; 548 unsigned long offset, size;
465 int ret; 549 int ret;
466 550
@@ -475,7 +559,9 @@ int ttm_bo_kmap(struct ttm_buffer_object *bo,
475 if (num_pages > 1 && !DRM_SUSER(DRM_CURPROC)) 559 if (num_pages > 1 && !DRM_SUSER(DRM_CURPROC))
476 return -EPERM; 560 return -EPERM;
477#endif 561#endif
562 (void) ttm_mem_io_lock(man, false);
478 ret = ttm_mem_io_reserve(bo->bdev, &bo->mem); 563 ret = ttm_mem_io_reserve(bo->bdev, &bo->mem);
564 ttm_mem_io_unlock(man);
479 if (ret) 565 if (ret)
480 return ret; 566 return ret;
481 if (!bo->mem.bus.is_iomem) { 567 if (!bo->mem.bus.is_iomem) {
@@ -490,12 +576,15 @@ EXPORT_SYMBOL(ttm_bo_kmap);
490 576
491void ttm_bo_kunmap(struct ttm_bo_kmap_obj *map) 577void ttm_bo_kunmap(struct ttm_bo_kmap_obj *map)
492{ 578{
579 struct ttm_buffer_object *bo = map->bo;
580 struct ttm_mem_type_manager *man =
581 &bo->bdev->man[bo->mem.mem_type];
582
493 if (!map->virtual) 583 if (!map->virtual)
494 return; 584 return;
495 switch (map->bo_kmap_type) { 585 switch (map->bo_kmap_type) {
496 case ttm_bo_map_iomap: 586 case ttm_bo_map_iomap:
497 iounmap(map->virtual); 587 iounmap(map->virtual);
498 ttm_mem_io_free(map->bo->bdev, &map->bo->mem);
499 break; 588 break;
500 case ttm_bo_map_vmap: 589 case ttm_bo_map_vmap:
501 vunmap(map->virtual); 590 vunmap(map->virtual);
@@ -508,6 +597,9 @@ void ttm_bo_kunmap(struct ttm_bo_kmap_obj *map)
508 default: 597 default:
509 BUG(); 598 BUG();
510 } 599 }
600 (void) ttm_mem_io_lock(man, false);
601 ttm_mem_io_free(map->bo->bdev, &map->bo->mem);
602 ttm_mem_io_unlock(man);
511 map->virtual = NULL; 603 map->virtual = NULL;
512 map->page = NULL; 604 map->page = NULL;
513} 605}
@@ -528,7 +620,7 @@ int ttm_bo_move_accel_cleanup(struct ttm_buffer_object *bo,
528 struct ttm_buffer_object *ghost_obj; 620 struct ttm_buffer_object *ghost_obj;
529 void *tmp_obj = NULL; 621 void *tmp_obj = NULL;
530 622
531 spin_lock(&bo->lock); 623 spin_lock(&bdev->fence_lock);
532 if (bo->sync_obj) { 624 if (bo->sync_obj) {
533 tmp_obj = bo->sync_obj; 625 tmp_obj = bo->sync_obj;
534 bo->sync_obj = NULL; 626 bo->sync_obj = NULL;
@@ -537,7 +629,7 @@ int ttm_bo_move_accel_cleanup(struct ttm_buffer_object *bo,
537 bo->sync_obj_arg = sync_obj_arg; 629 bo->sync_obj_arg = sync_obj_arg;
538 if (evict) { 630 if (evict) {
539 ret = ttm_bo_wait(bo, false, false, false); 631 ret = ttm_bo_wait(bo, false, false, false);
540 spin_unlock(&bo->lock); 632 spin_unlock(&bdev->fence_lock);
541 if (tmp_obj) 633 if (tmp_obj)
542 driver->sync_obj_unref(&tmp_obj); 634 driver->sync_obj_unref(&tmp_obj);
543 if (ret) 635 if (ret)
@@ -560,7 +652,7 @@ int ttm_bo_move_accel_cleanup(struct ttm_buffer_object *bo,
560 */ 652 */
561 653
562 set_bit(TTM_BO_PRIV_FLAG_MOVING, &bo->priv_flags); 654 set_bit(TTM_BO_PRIV_FLAG_MOVING, &bo->priv_flags);
563 spin_unlock(&bo->lock); 655 spin_unlock(&bdev->fence_lock);
564 if (tmp_obj) 656 if (tmp_obj)
565 driver->sync_obj_unref(&tmp_obj); 657 driver->sync_obj_unref(&tmp_obj);
566 658
diff --git a/drivers/gpu/drm/ttm/ttm_bo_vm.c b/drivers/gpu/drm/ttm/ttm_bo_vm.c
index fe6cb77899f4..221b924acebe 100644
--- a/drivers/gpu/drm/ttm/ttm_bo_vm.c
+++ b/drivers/gpu/drm/ttm/ttm_bo_vm.c
@@ -83,6 +83,8 @@ static int ttm_bo_vm_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
83 int i; 83 int i;
84 unsigned long address = (unsigned long)vmf->virtual_address; 84 unsigned long address = (unsigned long)vmf->virtual_address;
85 int retval = VM_FAULT_NOPAGE; 85 int retval = VM_FAULT_NOPAGE;
86 struct ttm_mem_type_manager *man =
87 &bdev->man[bo->mem.mem_type];
86 88
87 /* 89 /*
88 * Work around locking order reversal in fault / nopfn 90 * Work around locking order reversal in fault / nopfn
@@ -118,24 +120,28 @@ static int ttm_bo_vm_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
118 * move. 120 * move.
119 */ 121 */
120 122
121 spin_lock(&bo->lock); 123 spin_lock(&bdev->fence_lock);
122 if (test_bit(TTM_BO_PRIV_FLAG_MOVING, &bo->priv_flags)) { 124 if (test_bit(TTM_BO_PRIV_FLAG_MOVING, &bo->priv_flags)) {
123 ret = ttm_bo_wait(bo, false, true, false); 125 ret = ttm_bo_wait(bo, false, true, false);
124 spin_unlock(&bo->lock); 126 spin_unlock(&bdev->fence_lock);
125 if (unlikely(ret != 0)) { 127 if (unlikely(ret != 0)) {
126 retval = (ret != -ERESTARTSYS) ? 128 retval = (ret != -ERESTARTSYS) ?
127 VM_FAULT_SIGBUS : VM_FAULT_NOPAGE; 129 VM_FAULT_SIGBUS : VM_FAULT_NOPAGE;
128 goto out_unlock; 130 goto out_unlock;
129 } 131 }
130 } else 132 } else
131 spin_unlock(&bo->lock); 133 spin_unlock(&bdev->fence_lock);
132 134
133 135 ret = ttm_mem_io_lock(man, true);
134 ret = ttm_mem_io_reserve(bdev, &bo->mem); 136 if (unlikely(ret != 0)) {
135 if (ret) { 137 retval = VM_FAULT_NOPAGE;
136 retval = VM_FAULT_SIGBUS;
137 goto out_unlock; 138 goto out_unlock;
138 } 139 }
140 ret = ttm_mem_io_reserve_vm(bo);
141 if (unlikely(ret != 0)) {
142 retval = VM_FAULT_SIGBUS;
143 goto out_io_unlock;
144 }
139 145
140 page_offset = ((address - vma->vm_start) >> PAGE_SHIFT) + 146 page_offset = ((address - vma->vm_start) >> PAGE_SHIFT) +
141 bo->vm_node->start - vma->vm_pgoff; 147 bo->vm_node->start - vma->vm_pgoff;
@@ -144,7 +150,7 @@ static int ttm_bo_vm_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
144 150
145 if (unlikely(page_offset >= bo->num_pages)) { 151 if (unlikely(page_offset >= bo->num_pages)) {
146 retval = VM_FAULT_SIGBUS; 152 retval = VM_FAULT_SIGBUS;
147 goto out_unlock; 153 goto out_io_unlock;
148 } 154 }
149 155
150 /* 156 /*
@@ -182,7 +188,7 @@ static int ttm_bo_vm_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
182 page = ttm_tt_get_page(ttm, page_offset); 188 page = ttm_tt_get_page(ttm, page_offset);
183 if (unlikely(!page && i == 0)) { 189 if (unlikely(!page && i == 0)) {
184 retval = VM_FAULT_OOM; 190 retval = VM_FAULT_OOM;
185 goto out_unlock; 191 goto out_io_unlock;
186 } else if (unlikely(!page)) { 192 } else if (unlikely(!page)) {
187 break; 193 break;
188 } 194 }
@@ -200,14 +206,15 @@ static int ttm_bo_vm_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
200 else if (unlikely(ret != 0)) { 206 else if (unlikely(ret != 0)) {
201 retval = 207 retval =
202 (ret == -ENOMEM) ? VM_FAULT_OOM : VM_FAULT_SIGBUS; 208 (ret == -ENOMEM) ? VM_FAULT_OOM : VM_FAULT_SIGBUS;
203 goto out_unlock; 209 goto out_io_unlock;
204 } 210 }
205 211
206 address += PAGE_SIZE; 212 address += PAGE_SIZE;
207 if (unlikely(++page_offset >= page_last)) 213 if (unlikely(++page_offset >= page_last))
208 break; 214 break;
209 } 215 }
210 216out_io_unlock:
217 ttm_mem_io_unlock(man);
211out_unlock: 218out_unlock:
212 ttm_bo_unreserve(bo); 219 ttm_bo_unreserve(bo);
213 return retval; 220 return retval;
diff --git a/drivers/gpu/drm/ttm/ttm_execbuf_util.c b/drivers/gpu/drm/ttm/ttm_execbuf_util.c
index c285c2902d15..3832fe10b4df 100644
--- a/drivers/gpu/drm/ttm/ttm_execbuf_util.c
+++ b/drivers/gpu/drm/ttm/ttm_execbuf_util.c
@@ -32,7 +32,7 @@
32#include <linux/sched.h> 32#include <linux/sched.h>
33#include <linux/module.h> 33#include <linux/module.h>
34 34
35void ttm_eu_backoff_reservation(struct list_head *list) 35static void ttm_eu_backoff_reservation_locked(struct list_head *list)
36{ 36{
37 struct ttm_validate_buffer *entry; 37 struct ttm_validate_buffer *entry;
38 38
@@ -41,10 +41,77 @@ void ttm_eu_backoff_reservation(struct list_head *list)
41 if (!entry->reserved) 41 if (!entry->reserved)
42 continue; 42 continue;
43 43
44 if (entry->removed) {
45 ttm_bo_add_to_lru(bo);
46 entry->removed = false;
47
48 }
44 entry->reserved = false; 49 entry->reserved = false;
45 ttm_bo_unreserve(bo); 50 atomic_set(&bo->reserved, 0);
51 wake_up_all(&bo->event_queue);
52 }
53}
54
55static void ttm_eu_del_from_lru_locked(struct list_head *list)
56{
57 struct ttm_validate_buffer *entry;
58
59 list_for_each_entry(entry, list, head) {
60 struct ttm_buffer_object *bo = entry->bo;
61 if (!entry->reserved)
62 continue;
63
64 if (!entry->removed) {
65 entry->put_count = ttm_bo_del_from_lru(bo);
66 entry->removed = true;
67 }
46 } 68 }
47} 69}
70
71static void ttm_eu_list_ref_sub(struct list_head *list)
72{
73 struct ttm_validate_buffer *entry;
74
75 list_for_each_entry(entry, list, head) {
76 struct ttm_buffer_object *bo = entry->bo;
77
78 if (entry->put_count) {
79 ttm_bo_list_ref_sub(bo, entry->put_count, true);
80 entry->put_count = 0;
81 }
82 }
83}
84
85static int ttm_eu_wait_unreserved_locked(struct list_head *list,
86 struct ttm_buffer_object *bo)
87{
88 struct ttm_bo_global *glob = bo->glob;
89 int ret;
90
91 ttm_eu_del_from_lru_locked(list);
92 spin_unlock(&glob->lru_lock);
93 ret = ttm_bo_wait_unreserved(bo, true);
94 spin_lock(&glob->lru_lock);
95 if (unlikely(ret != 0))
96 ttm_eu_backoff_reservation_locked(list);
97 return ret;
98}
99
100
101void ttm_eu_backoff_reservation(struct list_head *list)
102{
103 struct ttm_validate_buffer *entry;
104 struct ttm_bo_global *glob;
105
106 if (list_empty(list))
107 return;
108
109 entry = list_first_entry(list, struct ttm_validate_buffer, head);
110 glob = entry->bo->glob;
111 spin_lock(&glob->lru_lock);
112 ttm_eu_backoff_reservation_locked(list);
113 spin_unlock(&glob->lru_lock);
114}
48EXPORT_SYMBOL(ttm_eu_backoff_reservation); 115EXPORT_SYMBOL(ttm_eu_backoff_reservation);
49 116
50/* 117/*
@@ -59,37 +126,76 @@ EXPORT_SYMBOL(ttm_eu_backoff_reservation);
59 * buffers in different orders. 126 * buffers in different orders.
60 */ 127 */
61 128
62int ttm_eu_reserve_buffers(struct list_head *list, uint32_t val_seq) 129int ttm_eu_reserve_buffers(struct list_head *list)
63{ 130{
131 struct ttm_bo_global *glob;
64 struct ttm_validate_buffer *entry; 132 struct ttm_validate_buffer *entry;
65 int ret; 133 int ret;
134 uint32_t val_seq;
135
136 if (list_empty(list))
137 return 0;
138
139 list_for_each_entry(entry, list, head) {
140 entry->reserved = false;
141 entry->put_count = 0;
142 entry->removed = false;
143 }
144
145 entry = list_first_entry(list, struct ttm_validate_buffer, head);
146 glob = entry->bo->glob;
66 147
67retry: 148retry:
149 spin_lock(&glob->lru_lock);
150 val_seq = entry->bo->bdev->val_seq++;
151
68 list_for_each_entry(entry, list, head) { 152 list_for_each_entry(entry, list, head) {
69 struct ttm_buffer_object *bo = entry->bo; 153 struct ttm_buffer_object *bo = entry->bo;
70 154
71 entry->reserved = false; 155retry_this_bo:
72 ret = ttm_bo_reserve(bo, true, false, true, val_seq); 156 ret = ttm_bo_reserve_locked(bo, true, true, true, val_seq);
73 if (ret != 0) { 157 switch (ret) {
74 ttm_eu_backoff_reservation(list); 158 case 0:
75 if (ret == -EAGAIN) { 159 break;
76 ret = ttm_bo_wait_unreserved(bo, true); 160 case -EBUSY:
77 if (unlikely(ret != 0)) 161 ret = ttm_eu_wait_unreserved_locked(list, bo);
78 return ret; 162 if (unlikely(ret != 0)) {
79 goto retry; 163 spin_unlock(&glob->lru_lock);
80 } else 164 ttm_eu_list_ref_sub(list);
81 return ret; 165 return ret;
166 }
167 goto retry_this_bo;
168 case -EAGAIN:
169 ttm_eu_backoff_reservation_locked(list);
170 spin_unlock(&glob->lru_lock);
171 ttm_eu_list_ref_sub(list);
172 ret = ttm_bo_wait_unreserved(bo, true);
173 if (unlikely(ret != 0))
174 return ret;
175 goto retry;
176 default:
177 ttm_eu_backoff_reservation_locked(list);
178 spin_unlock(&glob->lru_lock);
179 ttm_eu_list_ref_sub(list);
180 return ret;
82 } 181 }
83 182
84 entry->reserved = true; 183 entry->reserved = true;
85 if (unlikely(atomic_read(&bo->cpu_writers) > 0)) { 184 if (unlikely(atomic_read(&bo->cpu_writers) > 0)) {
86 ttm_eu_backoff_reservation(list); 185 ttm_eu_backoff_reservation_locked(list);
186 spin_unlock(&glob->lru_lock);
187 ttm_eu_list_ref_sub(list);
87 ret = ttm_bo_wait_cpu(bo, false); 188 ret = ttm_bo_wait_cpu(bo, false);
88 if (ret) 189 if (ret)
89 return ret; 190 return ret;
90 goto retry; 191 goto retry;
91 } 192 }
92 } 193 }
194
195 ttm_eu_del_from_lru_locked(list);
196 spin_unlock(&glob->lru_lock);
197 ttm_eu_list_ref_sub(list);
198
93 return 0; 199 return 0;
94} 200}
95EXPORT_SYMBOL(ttm_eu_reserve_buffers); 201EXPORT_SYMBOL(ttm_eu_reserve_buffers);
@@ -97,21 +203,36 @@ EXPORT_SYMBOL(ttm_eu_reserve_buffers);
97void ttm_eu_fence_buffer_objects(struct list_head *list, void *sync_obj) 203void ttm_eu_fence_buffer_objects(struct list_head *list, void *sync_obj)
98{ 204{
99 struct ttm_validate_buffer *entry; 205 struct ttm_validate_buffer *entry;
206 struct ttm_buffer_object *bo;
207 struct ttm_bo_global *glob;
208 struct ttm_bo_device *bdev;
209 struct ttm_bo_driver *driver;
100 210
101 list_for_each_entry(entry, list, head) { 211 if (list_empty(list))
102 struct ttm_buffer_object *bo = entry->bo; 212 return;
103 struct ttm_bo_driver *driver = bo->bdev->driver; 213
104 void *old_sync_obj; 214 bo = list_first_entry(list, struct ttm_validate_buffer, head)->bo;
215 bdev = bo->bdev;
216 driver = bdev->driver;
217 glob = bo->glob;
105 218
106 spin_lock(&bo->lock); 219 spin_lock(&bdev->fence_lock);
107 old_sync_obj = bo->sync_obj; 220 spin_lock(&glob->lru_lock);
221
222 list_for_each_entry(entry, list, head) {
223 bo = entry->bo;
224 entry->old_sync_obj = bo->sync_obj;
108 bo->sync_obj = driver->sync_obj_ref(sync_obj); 225 bo->sync_obj = driver->sync_obj_ref(sync_obj);
109 bo->sync_obj_arg = entry->new_sync_obj_arg; 226 bo->sync_obj_arg = entry->new_sync_obj_arg;
110 spin_unlock(&bo->lock); 227 ttm_bo_unreserve_locked(bo);
111 ttm_bo_unreserve(bo);
112 entry->reserved = false; 228 entry->reserved = false;
113 if (old_sync_obj) 229 }
114 driver->sync_obj_unref(&old_sync_obj); 230 spin_unlock(&glob->lru_lock);
231 spin_unlock(&bdev->fence_lock);
232
233 list_for_each_entry(entry, list, head) {
234 if (entry->old_sync_obj)
235 driver->sync_obj_unref(&entry->old_sync_obj);
115 } 236 }
116} 237}
117EXPORT_SYMBOL(ttm_eu_fence_buffer_objects); 238EXPORT_SYMBOL(ttm_eu_fence_buffer_objects);
diff --git a/drivers/gpu/drm/ttm/ttm_object.c b/drivers/gpu/drm/ttm/ttm_object.c
index 75e9d6f86ba4..ebddd443d91a 100644
--- a/drivers/gpu/drm/ttm/ttm_object.c
+++ b/drivers/gpu/drm/ttm/ttm_object.c
@@ -206,7 +206,7 @@ void ttm_base_object_unref(struct ttm_base_object **p_base)
206 */ 206 */
207 207
208 write_lock(&tdev->object_lock); 208 write_lock(&tdev->object_lock);
209 (void)kref_put(&base->refcount, &ttm_release_base); 209 kref_put(&base->refcount, ttm_release_base);
210 write_unlock(&tdev->object_lock); 210 write_unlock(&tdev->object_lock);
211} 211}
212EXPORT_SYMBOL(ttm_base_object_unref); 212EXPORT_SYMBOL(ttm_base_object_unref);
diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc.c b/drivers/gpu/drm/ttm/ttm_page_alloc.c
index b1e02fffd3cc..d948575717bf 100644
--- a/drivers/gpu/drm/ttm/ttm_page_alloc.c
+++ b/drivers/gpu/drm/ttm/ttm_page_alloc.c
@@ -38,6 +38,7 @@
38#include <linux/mm.h> 38#include <linux/mm.h>
39#include <linux/seq_file.h> /* for seq_printf */ 39#include <linux/seq_file.h> /* for seq_printf */
40#include <linux/slab.h> 40#include <linux/slab.h>
41#include <linux/dma-mapping.h>
41 42
42#include <asm/atomic.h> 43#include <asm/atomic.h>
43 44
@@ -394,12 +395,14 @@ static int ttm_pool_get_num_unused_pages(void)
394/** 395/**
395 * Callback for mm to request pool to reduce number of page held. 396 * Callback for mm to request pool to reduce number of page held.
396 */ 397 */
397static int ttm_pool_mm_shrink(struct shrinker *shrink, int shrink_pages, gfp_t gfp_mask) 398static int ttm_pool_mm_shrink(struct shrinker *shrink,
399 struct shrink_control *sc)
398{ 400{
399 static atomic_t start_pool = ATOMIC_INIT(0); 401 static atomic_t start_pool = ATOMIC_INIT(0);
400 unsigned i; 402 unsigned i;
401 unsigned pool_offset = atomic_add_return(1, &start_pool); 403 unsigned pool_offset = atomic_add_return(1, &start_pool);
402 struct ttm_page_pool *pool; 404 struct ttm_page_pool *pool;
405 int shrink_pages = sc->nr_to_scan;
403 406
404 pool_offset = pool_offset % NUM_POOLS; 407 pool_offset = pool_offset % NUM_POOLS;
405 /* select start pool in round robin fashion */ 408 /* select start pool in round robin fashion */
@@ -662,7 +665,8 @@ out:
662 * cached pages. 665 * cached pages.
663 */ 666 */
664int ttm_get_pages(struct list_head *pages, int flags, 667int ttm_get_pages(struct list_head *pages, int flags,
665 enum ttm_caching_state cstate, unsigned count) 668 enum ttm_caching_state cstate, unsigned count,
669 dma_addr_t *dma_address)
666{ 670{
667 struct ttm_page_pool *pool = ttm_get_pool(flags, cstate); 671 struct ttm_page_pool *pool = ttm_get_pool(flags, cstate);
668 struct page *p = NULL; 672 struct page *p = NULL;
@@ -720,7 +724,7 @@ int ttm_get_pages(struct list_head *pages, int flags,
720 printk(KERN_ERR TTM_PFX 724 printk(KERN_ERR TTM_PFX
721 "Failed to allocate extra pages " 725 "Failed to allocate extra pages "
722 "for large request."); 726 "for large request.");
723 ttm_put_pages(pages, 0, flags, cstate); 727 ttm_put_pages(pages, 0, flags, cstate, NULL);
724 return r; 728 return r;
725 } 729 }
726 } 730 }
@@ -731,7 +735,7 @@ int ttm_get_pages(struct list_head *pages, int flags,
731 735
732/* Put all pages in pages list to correct pool to wait for reuse */ 736/* Put all pages in pages list to correct pool to wait for reuse */
733void ttm_put_pages(struct list_head *pages, unsigned page_count, int flags, 737void ttm_put_pages(struct list_head *pages, unsigned page_count, int flags,
734 enum ttm_caching_state cstate) 738 enum ttm_caching_state cstate, dma_addr_t *dma_address)
735{ 739{
736 unsigned long irq_flags; 740 unsigned long irq_flags;
737 struct ttm_page_pool *pool = ttm_get_pool(flags, cstate); 741 struct ttm_page_pool *pool = ttm_get_pool(flags, cstate);
diff --git a/drivers/gpu/drm/ttm/ttm_tt.c b/drivers/gpu/drm/ttm/ttm_tt.c
index a7bab87a548b..58c271ebc0f7 100644
--- a/drivers/gpu/drm/ttm/ttm_tt.c
+++ b/drivers/gpu/drm/ttm/ttm_tt.c
@@ -31,6 +31,7 @@
31#include <linux/sched.h> 31#include <linux/sched.h>
32#include <linux/highmem.h> 32#include <linux/highmem.h>
33#include <linux/pagemap.h> 33#include <linux/pagemap.h>
34#include <linux/shmem_fs.h>
34#include <linux/file.h> 35#include <linux/file.h>
35#include <linux/swap.h> 36#include <linux/swap.h>
36#include <linux/slab.h> 37#include <linux/slab.h>
@@ -49,12 +50,16 @@ static int ttm_tt_swapin(struct ttm_tt *ttm);
49static void ttm_tt_alloc_page_directory(struct ttm_tt *ttm) 50static void ttm_tt_alloc_page_directory(struct ttm_tt *ttm)
50{ 51{
51 ttm->pages = drm_calloc_large(ttm->num_pages, sizeof(*ttm->pages)); 52 ttm->pages = drm_calloc_large(ttm->num_pages, sizeof(*ttm->pages));
53 ttm->dma_address = drm_calloc_large(ttm->num_pages,
54 sizeof(*ttm->dma_address));
52} 55}
53 56
54static void ttm_tt_free_page_directory(struct ttm_tt *ttm) 57static void ttm_tt_free_page_directory(struct ttm_tt *ttm)
55{ 58{
56 drm_free_large(ttm->pages); 59 drm_free_large(ttm->pages);
57 ttm->pages = NULL; 60 ttm->pages = NULL;
61 drm_free_large(ttm->dma_address);
62 ttm->dma_address = NULL;
58} 63}
59 64
60static void ttm_tt_free_user_pages(struct ttm_tt *ttm) 65static void ttm_tt_free_user_pages(struct ttm_tt *ttm)
@@ -105,7 +110,8 @@ static struct page *__ttm_tt_get_page(struct ttm_tt *ttm, int index)
105 110
106 INIT_LIST_HEAD(&h); 111 INIT_LIST_HEAD(&h);
107 112
108 ret = ttm_get_pages(&h, ttm->page_flags, ttm->caching_state, 1); 113 ret = ttm_get_pages(&h, ttm->page_flags, ttm->caching_state, 1,
114 &ttm->dma_address[index]);
109 115
110 if (ret != 0) 116 if (ret != 0)
111 return NULL; 117 return NULL;
@@ -164,7 +170,7 @@ int ttm_tt_populate(struct ttm_tt *ttm)
164 } 170 }
165 171
166 be->func->populate(be, ttm->num_pages, ttm->pages, 172 be->func->populate(be, ttm->num_pages, ttm->pages,
167 ttm->dummy_read_page); 173 ttm->dummy_read_page, ttm->dma_address);
168 ttm->state = tt_unbound; 174 ttm->state = tt_unbound;
169 return 0; 175 return 0;
170} 176}
@@ -298,7 +304,8 @@ static void ttm_tt_free_alloced_pages(struct ttm_tt *ttm)
298 count++; 304 count++;
299 } 305 }
300 } 306 }
301 ttm_put_pages(&h, count, ttm->page_flags, ttm->caching_state); 307 ttm_put_pages(&h, count, ttm->page_flags, ttm->caching_state,
308 ttm->dma_address);
302 ttm->state = tt_unpopulated; 309 ttm->state = tt_unpopulated;
303 ttm->first_himem_page = ttm->num_pages; 310 ttm->first_himem_page = ttm->num_pages;
304 ttm->last_lomem_page = -1; 311 ttm->last_lomem_page = -1;
@@ -326,7 +333,7 @@ void ttm_tt_destroy(struct ttm_tt *ttm)
326 ttm_tt_free_page_directory(ttm); 333 ttm_tt_free_page_directory(ttm);
327 } 334 }
328 335
329 if (!(ttm->page_flags & TTM_PAGE_FLAG_PERSISTANT_SWAP) && 336 if (!(ttm->page_flags & TTM_PAGE_FLAG_PERSISTENT_SWAP) &&
330 ttm->swap_storage) 337 ttm->swap_storage)
331 fput(ttm->swap_storage); 338 fput(ttm->swap_storage);
332 339
@@ -440,10 +447,8 @@ int ttm_tt_bind(struct ttm_tt *ttm, struct ttm_mem_reg *bo_mem)
440 return ret; 447 return ret;
441 448
442 ret = be->func->bind(be, bo_mem); 449 ret = be->func->bind(be, bo_mem);
443 if (ret) { 450 if (unlikely(ret != 0))
444 printk(KERN_ERR TTM_PFX "Couldn't bind backend.\n");
445 return ret; 451 return ret;
446 }
447 452
448 ttm->state = tt_bound; 453 ttm->state = tt_bound;
449 454
@@ -480,7 +485,7 @@ static int ttm_tt_swapin(struct ttm_tt *ttm)
480 swap_space = swap_storage->f_path.dentry->d_inode->i_mapping; 485 swap_space = swap_storage->f_path.dentry->d_inode->i_mapping;
481 486
482 for (i = 0; i < ttm->num_pages; ++i) { 487 for (i = 0; i < ttm->num_pages; ++i) {
483 from_page = read_mapping_page(swap_space, i, NULL); 488 from_page = shmem_read_mapping_page(swap_space, i);
484 if (IS_ERR(from_page)) { 489 if (IS_ERR(from_page)) {
485 ret = PTR_ERR(from_page); 490 ret = PTR_ERR(from_page);
486 goto out_err; 491 goto out_err;
@@ -499,7 +504,7 @@ static int ttm_tt_swapin(struct ttm_tt *ttm)
499 page_cache_release(from_page); 504 page_cache_release(from_page);
500 } 505 }
501 506
502 if (!(ttm->page_flags & TTM_PAGE_FLAG_PERSISTANT_SWAP)) 507 if (!(ttm->page_flags & TTM_PAGE_FLAG_PERSISTENT_SWAP))
503 fput(swap_storage); 508 fput(swap_storage);
504 ttm->swap_storage = NULL; 509 ttm->swap_storage = NULL;
505 ttm->page_flags &= ~TTM_PAGE_FLAG_SWAPPED; 510 ttm->page_flags &= ~TTM_PAGE_FLAG_SWAPPED;
@@ -510,7 +515,7 @@ out_err:
510 return ret; 515 return ret;
511} 516}
512 517
513int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistant_swap_storage) 518int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistent_swap_storage)
514{ 519{
515 struct address_space *swap_space; 520 struct address_space *swap_space;
516 struct file *swap_storage; 521 struct file *swap_storage;
@@ -536,7 +541,7 @@ int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistant_swap_storage)
536 return 0; 541 return 0;
537 } 542 }
538 543
539 if (!persistant_swap_storage) { 544 if (!persistent_swap_storage) {
540 swap_storage = shmem_file_setup("ttm swap", 545 swap_storage = shmem_file_setup("ttm swap",
541 ttm->num_pages << PAGE_SHIFT, 546 ttm->num_pages << PAGE_SHIFT,
542 0); 547 0);
@@ -545,7 +550,7 @@ int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistant_swap_storage)
545 return PTR_ERR(swap_storage); 550 return PTR_ERR(swap_storage);
546 } 551 }
547 } else 552 } else
548 swap_storage = persistant_swap_storage; 553 swap_storage = persistent_swap_storage;
549 554
550 swap_space = swap_storage->f_path.dentry->d_inode->i_mapping; 555 swap_space = swap_storage->f_path.dentry->d_inode->i_mapping;
551 556
@@ -553,7 +558,7 @@ int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistant_swap_storage)
553 from_page = ttm->pages[i]; 558 from_page = ttm->pages[i];
554 if (unlikely(from_page == NULL)) 559 if (unlikely(from_page == NULL))
555 continue; 560 continue;
556 to_page = read_mapping_page(swap_space, i, NULL); 561 to_page = shmem_read_mapping_page(swap_space, i);
557 if (unlikely(IS_ERR(to_page))) { 562 if (unlikely(IS_ERR(to_page))) {
558 ret = PTR_ERR(to_page); 563 ret = PTR_ERR(to_page);
559 goto out_err; 564 goto out_err;
@@ -573,12 +578,12 @@ int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistant_swap_storage)
573 ttm_tt_free_alloced_pages(ttm); 578 ttm_tt_free_alloced_pages(ttm);
574 ttm->swap_storage = swap_storage; 579 ttm->swap_storage = swap_storage;
575 ttm->page_flags |= TTM_PAGE_FLAG_SWAPPED; 580 ttm->page_flags |= TTM_PAGE_FLAG_SWAPPED;
576 if (persistant_swap_storage) 581 if (persistent_swap_storage)
577 ttm->page_flags |= TTM_PAGE_FLAG_PERSISTANT_SWAP; 582 ttm->page_flags |= TTM_PAGE_FLAG_PERSISTENT_SWAP;
578 583
579 return 0; 584 return 0;
580out_err: 585out_err:
581 if (!persistant_swap_storage) 586 if (!persistent_swap_storage)
582 fput(swap_storage); 587 fput(swap_storage);
583 588
584 return ret; 589 return ret;
diff --git a/drivers/gpu/drm/via/via_dmablit.c b/drivers/gpu/drm/via/via_dmablit.c
index 9b5b4d9dd62c..3e038a394c51 100644
--- a/drivers/gpu/drm/via/via_dmablit.c
+++ b/drivers/gpu/drm/via/via_dmablit.c
@@ -235,9 +235,9 @@ via_lock_all_dma_pages(drm_via_sg_info_t *vsg, drm_via_dmablit_t *xfer)
235 vsg->num_pages = VIA_PFN(xfer->mem_addr + (xfer->num_lines * xfer->mem_stride - 1)) - 235 vsg->num_pages = VIA_PFN(xfer->mem_addr + (xfer->num_lines * xfer->mem_stride - 1)) -
236 first_pfn + 1; 236 first_pfn + 1;
237 237
238 if (NULL == (vsg->pages = vmalloc(sizeof(struct page *) * vsg->num_pages))) 238 vsg->pages = vzalloc(sizeof(struct page *) * vsg->num_pages);
239 if (NULL == vsg->pages)
239 return -ENOMEM; 240 return -ENOMEM;
240 memset(vsg->pages, 0, sizeof(struct page *) * vsg->num_pages);
241 down_read(&current->mm->mmap_sem); 241 down_read(&current->mm->mmap_sem);
242 ret = get_user_pages(current, current->mm, 242 ret = get_user_pages(current, current->mm,
243 (unsigned long)xfer->mem_addr, 243 (unsigned long)xfer->mem_addr,
diff --git a/drivers/gpu/drm/via/via_drv.c b/drivers/gpu/drm/via/via_drv.c
index 7a1b210401e0..920a55214bcf 100644
--- a/drivers/gpu/drm/via/via_drv.c
+++ b/drivers/gpu/drm/via/via_drv.c
@@ -51,8 +51,6 @@ static struct drm_driver driver = {
51 .reclaim_buffers_locked = NULL, 51 .reclaim_buffers_locked = NULL,
52 .reclaim_buffers_idlelocked = via_reclaim_buffers_locked, 52 .reclaim_buffers_idlelocked = via_reclaim_buffers_locked,
53 .lastclose = via_lastclose, 53 .lastclose = via_lastclose,
54 .get_map_ofs = drm_core_get_map_ofs,
55 .get_reg_ofs = drm_core_get_reg_ofs,
56 .ioctls = via_ioctls, 54 .ioctls = via_ioctls,
57 .fops = { 55 .fops = {
58 .owner = THIS_MODULE, 56 .owner = THIS_MODULE,
@@ -62,11 +60,8 @@ static struct drm_driver driver = {
62 .mmap = drm_mmap, 60 .mmap = drm_mmap,
63 .poll = drm_poll, 61 .poll = drm_poll,
64 .fasync = drm_fasync, 62 .fasync = drm_fasync,
63 .llseek = noop_llseek,
65 }, 64 },
66 .pci_driver = {
67 .name = DRIVER_NAME,
68 .id_table = pciidlist,
69 },
70 65
71 .name = DRIVER_NAME, 66 .name = DRIVER_NAME,
72 .desc = DRIVER_DESC, 67 .desc = DRIVER_DESC,
@@ -76,16 +71,21 @@ static struct drm_driver driver = {
76 .patchlevel = DRIVER_PATCHLEVEL, 71 .patchlevel = DRIVER_PATCHLEVEL,
77}; 72};
78 73
74static struct pci_driver via_pci_driver = {
75 .name = DRIVER_NAME,
76 .id_table = pciidlist,
77};
78
79static int __init via_init(void) 79static int __init via_init(void)
80{ 80{
81 driver.num_ioctls = via_max_ioctl; 81 driver.num_ioctls = via_max_ioctl;
82 via_init_command_verifier(); 82 via_init_command_verifier();
83 return drm_init(&driver); 83 return drm_pci_init(&driver, &via_pci_driver);
84} 84}
85 85
86static void __exit via_exit(void) 86static void __exit via_exit(void)
87{ 87{
88 drm_exit(&driver); 88 drm_pci_exit(&driver, &via_pci_driver);
89} 89}
90 90
91module_init(via_init); 91module_init(via_init);
diff --git a/drivers/gpu/drm/vmwgfx/Makefile b/drivers/gpu/drm/vmwgfx/Makefile
index 4505e17df3f5..c9281a1b1d3b 100644
--- a/drivers/gpu/drm/vmwgfx/Makefile
+++ b/drivers/gpu/drm/vmwgfx/Makefile
@@ -4,6 +4,6 @@ ccflags-y := -Iinclude/drm
4vmwgfx-y := vmwgfx_execbuf.o vmwgfx_gmr.o vmwgfx_kms.o vmwgfx_drv.o \ 4vmwgfx-y := vmwgfx_execbuf.o vmwgfx_gmr.o vmwgfx_kms.o vmwgfx_drv.o \
5 vmwgfx_fb.o vmwgfx_ioctl.o vmwgfx_resource.o vmwgfx_buffer.o \ 5 vmwgfx_fb.o vmwgfx_ioctl.o vmwgfx_resource.o vmwgfx_buffer.o \
6 vmwgfx_fifo.o vmwgfx_irq.o vmwgfx_ldu.o vmwgfx_ttm_glue.o \ 6 vmwgfx_fifo.o vmwgfx_irq.o vmwgfx_ldu.o vmwgfx_ttm_glue.o \
7 vmwgfx_overlay.o vmwgfx_fence.o 7 vmwgfx_overlay.o vmwgfx_fence.o vmwgfx_gmrid_manager.o
8 8
9obj-$(CONFIG_DRM_VMWGFX) := vmwgfx.o 9obj-$(CONFIG_DRM_VMWGFX) := vmwgfx.o
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c b/drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c
index c4f5114aee7c..87e43e0733bf 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c
@@ -39,6 +39,9 @@ static uint32_t vram_ne_placement_flags = TTM_PL_FLAG_VRAM |
39static uint32_t sys_placement_flags = TTM_PL_FLAG_SYSTEM | 39static uint32_t sys_placement_flags = TTM_PL_FLAG_SYSTEM |
40 TTM_PL_FLAG_CACHED; 40 TTM_PL_FLAG_CACHED;
41 41
42static uint32_t gmr_placement_flags = VMW_PL_FLAG_GMR |
43 TTM_PL_FLAG_CACHED;
44
42struct ttm_placement vmw_vram_placement = { 45struct ttm_placement vmw_vram_placement = {
43 .fpfn = 0, 46 .fpfn = 0,
44 .lpfn = 0, 47 .lpfn = 0,
@@ -48,6 +51,20 @@ struct ttm_placement vmw_vram_placement = {
48 .busy_placement = &vram_placement_flags 51 .busy_placement = &vram_placement_flags
49}; 52};
50 53
54static uint32_t vram_gmr_placement_flags[] = {
55 TTM_PL_FLAG_VRAM | TTM_PL_FLAG_CACHED,
56 VMW_PL_FLAG_GMR | TTM_PL_FLAG_CACHED
57};
58
59struct ttm_placement vmw_vram_gmr_placement = {
60 .fpfn = 0,
61 .lpfn = 0,
62 .num_placement = 2,
63 .placement = vram_gmr_placement_flags,
64 .num_busy_placement = 1,
65 .busy_placement = &gmr_placement_flags
66};
67
51struct ttm_placement vmw_vram_sys_placement = { 68struct ttm_placement vmw_vram_sys_placement = {
52 .fpfn = 0, 69 .fpfn = 0,
53 .lpfn = 0, 70 .lpfn = 0,
@@ -77,27 +94,53 @@ struct ttm_placement vmw_sys_placement = {
77 94
78struct vmw_ttm_backend { 95struct vmw_ttm_backend {
79 struct ttm_backend backend; 96 struct ttm_backend backend;
97 struct page **pages;
98 unsigned long num_pages;
99 struct vmw_private *dev_priv;
100 int gmr_id;
80}; 101};
81 102
82static int vmw_ttm_populate(struct ttm_backend *backend, 103static int vmw_ttm_populate(struct ttm_backend *backend,
83 unsigned long num_pages, struct page **pages, 104 unsigned long num_pages, struct page **pages,
84 struct page *dummy_read_page) 105 struct page *dummy_read_page,
106 dma_addr_t *dma_addrs)
85{ 107{
108 struct vmw_ttm_backend *vmw_be =
109 container_of(backend, struct vmw_ttm_backend, backend);
110
111 vmw_be->pages = pages;
112 vmw_be->num_pages = num_pages;
113
86 return 0; 114 return 0;
87} 115}
88 116
89static int vmw_ttm_bind(struct ttm_backend *backend, struct ttm_mem_reg *bo_mem) 117static int vmw_ttm_bind(struct ttm_backend *backend, struct ttm_mem_reg *bo_mem)
90{ 118{
91 return 0; 119 struct vmw_ttm_backend *vmw_be =
120 container_of(backend, struct vmw_ttm_backend, backend);
121
122 vmw_be->gmr_id = bo_mem->start;
123
124 return vmw_gmr_bind(vmw_be->dev_priv, vmw_be->pages,
125 vmw_be->num_pages, vmw_be->gmr_id);
92} 126}
93 127
94static int vmw_ttm_unbind(struct ttm_backend *backend) 128static int vmw_ttm_unbind(struct ttm_backend *backend)
95{ 129{
130 struct vmw_ttm_backend *vmw_be =
131 container_of(backend, struct vmw_ttm_backend, backend);
132
133 vmw_gmr_unbind(vmw_be->dev_priv, vmw_be->gmr_id);
96 return 0; 134 return 0;
97} 135}
98 136
99static void vmw_ttm_clear(struct ttm_backend *backend) 137static void vmw_ttm_clear(struct ttm_backend *backend)
100{ 138{
139 struct vmw_ttm_backend *vmw_be =
140 container_of(backend, struct vmw_ttm_backend, backend);
141
142 vmw_be->pages = NULL;
143 vmw_be->num_pages = 0;
101} 144}
102 145
103static void vmw_ttm_destroy(struct ttm_backend *backend) 146static void vmw_ttm_destroy(struct ttm_backend *backend)
@@ -125,6 +168,7 @@ struct ttm_backend *vmw_ttm_backend_init(struct ttm_bo_device *bdev)
125 return NULL; 168 return NULL;
126 169
127 vmw_be->backend.func = &vmw_ttm_func; 170 vmw_be->backend.func = &vmw_ttm_func;
171 vmw_be->dev_priv = container_of(bdev, struct vmw_private, bdev);
128 172
129 return &vmw_be->backend; 173 return &vmw_be->backend;
130} 174}
@@ -142,15 +186,28 @@ int vmw_init_mem_type(struct ttm_bo_device *bdev, uint32_t type,
142 /* System memory */ 186 /* System memory */
143 187
144 man->flags = TTM_MEMTYPE_FLAG_MAPPABLE; 188 man->flags = TTM_MEMTYPE_FLAG_MAPPABLE;
145 man->available_caching = TTM_PL_MASK_CACHING; 189 man->available_caching = TTM_PL_FLAG_CACHED;
146 man->default_caching = TTM_PL_FLAG_CACHED; 190 man->default_caching = TTM_PL_FLAG_CACHED;
147 break; 191 break;
148 case TTM_PL_VRAM: 192 case TTM_PL_VRAM:
149 /* "On-card" video ram */ 193 /* "On-card" video ram */
194 man->func = &ttm_bo_manager_func;
150 man->gpu_offset = 0; 195 man->gpu_offset = 0;
151 man->flags = TTM_MEMTYPE_FLAG_FIXED | TTM_MEMTYPE_FLAG_MAPPABLE; 196 man->flags = TTM_MEMTYPE_FLAG_FIXED | TTM_MEMTYPE_FLAG_MAPPABLE;
152 man->available_caching = TTM_PL_MASK_CACHING; 197 man->available_caching = TTM_PL_FLAG_CACHED;
153 man->default_caching = TTM_PL_FLAG_WC; 198 man->default_caching = TTM_PL_FLAG_CACHED;
199 break;
200 case VMW_PL_GMR:
201 /*
202 * "Guest Memory Regions" is an aperture like feature with
203 * one slot per bo. There is an upper limit of the number of
204 * slots as well as the bo size.
205 */
206 man->func = &vmw_gmrid_manager_func;
207 man->gpu_offset = 0;
208 man->flags = TTM_MEMTYPE_FLAG_CMA | TTM_MEMTYPE_FLAG_MAPPABLE;
209 man->available_caching = TTM_PL_FLAG_CACHED;
210 man->default_caching = TTM_PL_FLAG_CACHED;
154 break; 211 break;
155 default: 212 default:
156 DRM_ERROR("Unsupported memory type %u\n", (unsigned)type); 213 DRM_ERROR("Unsupported memory type %u\n", (unsigned)type);
@@ -174,18 +231,6 @@ static int vmw_verify_access(struct ttm_buffer_object *bo, struct file *filp)
174 return 0; 231 return 0;
175} 232}
176 233
177static void vmw_move_notify(struct ttm_buffer_object *bo,
178 struct ttm_mem_reg *new_mem)
179{
180 if (new_mem->mem_type != TTM_PL_SYSTEM)
181 vmw_dmabuf_gmr_unbind(bo);
182}
183
184static void vmw_swap_notify(struct ttm_buffer_object *bo)
185{
186 vmw_dmabuf_gmr_unbind(bo);
187}
188
189static int vmw_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_mem_reg *mem) 234static int vmw_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_mem_reg *mem)
190{ 235{
191 struct ttm_mem_type_manager *man = &bdev->man[mem->mem_type]; 236 struct ttm_mem_type_manager *man = &bdev->man[mem->mem_type];
@@ -200,10 +245,10 @@ static int vmw_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_mem_reg
200 return -EINVAL; 245 return -EINVAL;
201 switch (mem->mem_type) { 246 switch (mem->mem_type) {
202 case TTM_PL_SYSTEM: 247 case TTM_PL_SYSTEM:
203 /* System memory */ 248 case VMW_PL_GMR:
204 return 0; 249 return 0;
205 case TTM_PL_VRAM: 250 case TTM_PL_VRAM:
206 mem->bus.offset = mem->mm_node->start << PAGE_SHIFT; 251 mem->bus.offset = mem->start << PAGE_SHIFT;
207 mem->bus.base = dev_priv->vram_start; 252 mem->bus.base = dev_priv->vram_start;
208 mem->bus.is_iomem = true; 253 mem->bus.is_iomem = true;
209 break; 254 break;
@@ -276,8 +321,8 @@ struct ttm_bo_driver vmw_bo_driver = {
276 .sync_obj_flush = vmw_sync_obj_flush, 321 .sync_obj_flush = vmw_sync_obj_flush,
277 .sync_obj_unref = vmw_sync_obj_unref, 322 .sync_obj_unref = vmw_sync_obj_unref,
278 .sync_obj_ref = vmw_sync_obj_ref, 323 .sync_obj_ref = vmw_sync_obj_ref,
279 .move_notify = vmw_move_notify, 324 .move_notify = NULL,
280 .swap_notify = vmw_swap_notify, 325 .swap_notify = NULL,
281 .fault_reserve_notify = &vmw_ttm_fault_reserve_notify, 326 .fault_reserve_notify = &vmw_ttm_fault_reserve_notify,
282 .io_mem_reserve = &vmw_ttm_io_mem_reserve, 327 .io_mem_reserve = &vmw_ttm_io_mem_reserve,
283 .io_mem_free = &vmw_ttm_io_mem_free, 328 .io_mem_free = &vmw_ttm_io_mem_free,
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
index a96ed6d9d010..96949b93d920 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
@@ -260,13 +260,11 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
260 idr_init(&dev_priv->context_idr); 260 idr_init(&dev_priv->context_idr);
261 idr_init(&dev_priv->surface_idr); 261 idr_init(&dev_priv->surface_idr);
262 idr_init(&dev_priv->stream_idr); 262 idr_init(&dev_priv->stream_idr);
263 ida_init(&dev_priv->gmr_ida);
264 mutex_init(&dev_priv->init_mutex); 263 mutex_init(&dev_priv->init_mutex);
265 init_waitqueue_head(&dev_priv->fence_queue); 264 init_waitqueue_head(&dev_priv->fence_queue);
266 init_waitqueue_head(&dev_priv->fifo_queue); 265 init_waitqueue_head(&dev_priv->fifo_queue);
267 atomic_set(&dev_priv->fence_queue_waiters, 0); 266 atomic_set(&dev_priv->fence_queue_waiters, 0);
268 atomic_set(&dev_priv->fifo_queue_waiters, 0); 267 atomic_set(&dev_priv->fifo_queue_waiters, 0);
269 INIT_LIST_HEAD(&dev_priv->gmr_lru);
270 268
271 dev_priv->io_start = pci_resource_start(dev->pdev, 0); 269 dev_priv->io_start = pci_resource_start(dev->pdev, 0);
272 dev_priv->vram_start = pci_resource_start(dev->pdev, 1); 270 dev_priv->vram_start = pci_resource_start(dev->pdev, 1);
@@ -341,6 +339,14 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
341 goto out_err2; 339 goto out_err2;
342 } 340 }
343 341
342 dev_priv->has_gmr = true;
343 if (ttm_bo_init_mm(&dev_priv->bdev, VMW_PL_GMR,
344 dev_priv->max_gmr_ids) != 0) {
345 DRM_INFO("No GMR memory available. "
346 "Graphics memory resources are very limited.\n");
347 dev_priv->has_gmr = false;
348 }
349
344 dev_priv->mmio_mtrr = drm_mtrr_add(dev_priv->mmio_start, 350 dev_priv->mmio_mtrr = drm_mtrr_add(dev_priv->mmio_start,
345 dev_priv->mmio_size, DRM_MTRR_WC); 351 dev_priv->mmio_size, DRM_MTRR_WC);
346 352
@@ -440,13 +446,14 @@ out_err4:
440out_err3: 446out_err3:
441 drm_mtrr_del(dev_priv->mmio_mtrr, dev_priv->mmio_start, 447 drm_mtrr_del(dev_priv->mmio_mtrr, dev_priv->mmio_start,
442 dev_priv->mmio_size, DRM_MTRR_WC); 448 dev_priv->mmio_size, DRM_MTRR_WC);
449 if (dev_priv->has_gmr)
450 (void) ttm_bo_clean_mm(&dev_priv->bdev, VMW_PL_GMR);
443 (void)ttm_bo_clean_mm(&dev_priv->bdev, TTM_PL_VRAM); 451 (void)ttm_bo_clean_mm(&dev_priv->bdev, TTM_PL_VRAM);
444out_err2: 452out_err2:
445 (void)ttm_bo_device_release(&dev_priv->bdev); 453 (void)ttm_bo_device_release(&dev_priv->bdev);
446out_err1: 454out_err1:
447 vmw_ttm_global_release(dev_priv); 455 vmw_ttm_global_release(dev_priv);
448out_err0: 456out_err0:
449 ida_destroy(&dev_priv->gmr_ida);
450 idr_destroy(&dev_priv->surface_idr); 457 idr_destroy(&dev_priv->surface_idr);
451 idr_destroy(&dev_priv->context_idr); 458 idr_destroy(&dev_priv->context_idr);
452 idr_destroy(&dev_priv->stream_idr); 459 idr_destroy(&dev_priv->stream_idr);
@@ -478,10 +485,11 @@ static int vmw_driver_unload(struct drm_device *dev)
478 iounmap(dev_priv->mmio_virt); 485 iounmap(dev_priv->mmio_virt);
479 drm_mtrr_del(dev_priv->mmio_mtrr, dev_priv->mmio_start, 486 drm_mtrr_del(dev_priv->mmio_mtrr, dev_priv->mmio_start,
480 dev_priv->mmio_size, DRM_MTRR_WC); 487 dev_priv->mmio_size, DRM_MTRR_WC);
488 if (dev_priv->has_gmr)
489 (void)ttm_bo_clean_mm(&dev_priv->bdev, VMW_PL_GMR);
481 (void)ttm_bo_clean_mm(&dev_priv->bdev, TTM_PL_VRAM); 490 (void)ttm_bo_clean_mm(&dev_priv->bdev, TTM_PL_VRAM);
482 (void)ttm_bo_device_release(&dev_priv->bdev); 491 (void)ttm_bo_device_release(&dev_priv->bdev);
483 vmw_ttm_global_release(dev_priv); 492 vmw_ttm_global_release(dev_priv);
484 ida_destroy(&dev_priv->gmr_ida);
485 idr_destroy(&dev_priv->surface_idr); 493 idr_destroy(&dev_priv->surface_idr);
486 idr_destroy(&dev_priv->context_idr); 494 idr_destroy(&dev_priv->context_idr);
487 idr_destroy(&dev_priv->stream_idr); 495 idr_destroy(&dev_priv->stream_idr);
@@ -597,6 +605,8 @@ static void vmw_lastclose(struct drm_device *dev)
597static void vmw_master_init(struct vmw_master *vmaster) 605static void vmw_master_init(struct vmw_master *vmaster)
598{ 606{
599 ttm_lock_init(&vmaster->lock); 607 ttm_lock_init(&vmaster->lock);
608 INIT_LIST_HEAD(&vmaster->fb_surf);
609 mutex_init(&vmaster->fb_surf_mutex);
600} 610}
601 611
602static int vmw_master_create(struct drm_device *dev, 612static int vmw_master_create(struct drm_device *dev,
@@ -608,7 +618,7 @@ static int vmw_master_create(struct drm_device *dev,
608 if (unlikely(vmaster == NULL)) 618 if (unlikely(vmaster == NULL))
609 return -ENOMEM; 619 return -ENOMEM;
610 620
611 ttm_lock_init(&vmaster->lock); 621 vmw_master_init(vmaster);
612 ttm_lock_set_kill(&vmaster->lock, true, SIGTERM); 622 ttm_lock_set_kill(&vmaster->lock, true, SIGTERM);
613 master->driver_priv = vmaster; 623 master->driver_priv = vmaster;
614 624
@@ -699,6 +709,7 @@ static void vmw_master_drop(struct drm_device *dev,
699 709
700 vmw_fp->locked_master = drm_master_get(file_priv->master); 710 vmw_fp->locked_master = drm_master_get(file_priv->master);
701 ret = ttm_vt_lock(&vmaster->lock, false, vmw_fp->tfile); 711 ret = ttm_vt_lock(&vmaster->lock, false, vmw_fp->tfile);
712 vmw_kms_idle_workqueues(vmaster);
702 713
703 if (unlikely((ret != 0))) { 714 if (unlikely((ret != 0))) {
704 DRM_ERROR("Unable to lock TTM at VT switch.\n"); 715 DRM_ERROR("Unable to lock TTM at VT switch.\n");
@@ -751,15 +762,16 @@ static int vmwgfx_pm_notifier(struct notifier_block *nb, unsigned long val,
751 * Buffer contents is moved to swappable memory. 762 * Buffer contents is moved to swappable memory.
752 */ 763 */
753 ttm_bo_swapout_all(&dev_priv->bdev); 764 ttm_bo_swapout_all(&dev_priv->bdev);
765
754 break; 766 break;
755 case PM_POST_HIBERNATION: 767 case PM_POST_HIBERNATION:
756 case PM_POST_SUSPEND: 768 case PM_POST_SUSPEND:
769 case PM_POST_RESTORE:
757 ttm_suspend_unlock(&vmaster->lock); 770 ttm_suspend_unlock(&vmaster->lock);
771
758 break; 772 break;
759 case PM_RESTORE_PREPARE: 773 case PM_RESTORE_PREPARE:
760 break; 774 break;
761 case PM_POST_RESTORE:
762 break;
763 default: 775 default:
764 break; 776 break;
765 } 777 }
@@ -770,21 +782,98 @@ static int vmwgfx_pm_notifier(struct notifier_block *nb, unsigned long val,
770 * These might not be needed with the virtual SVGA device. 782 * These might not be needed with the virtual SVGA device.
771 */ 783 */
772 784
773int vmw_pci_suspend(struct pci_dev *pdev, pm_message_t state) 785static int vmw_pci_suspend(struct pci_dev *pdev, pm_message_t state)
774{ 786{
787 struct drm_device *dev = pci_get_drvdata(pdev);
788 struct vmw_private *dev_priv = vmw_priv(dev);
789
790 if (dev_priv->num_3d_resources != 0) {
791 DRM_INFO("Can't suspend or hibernate "
792 "while 3D resources are active.\n");
793 return -EBUSY;
794 }
795
775 pci_save_state(pdev); 796 pci_save_state(pdev);
776 pci_disable_device(pdev); 797 pci_disable_device(pdev);
777 pci_set_power_state(pdev, PCI_D3hot); 798 pci_set_power_state(pdev, PCI_D3hot);
778 return 0; 799 return 0;
779} 800}
780 801
781int vmw_pci_resume(struct pci_dev *pdev) 802static int vmw_pci_resume(struct pci_dev *pdev)
782{ 803{
783 pci_set_power_state(pdev, PCI_D0); 804 pci_set_power_state(pdev, PCI_D0);
784 pci_restore_state(pdev); 805 pci_restore_state(pdev);
785 return pci_enable_device(pdev); 806 return pci_enable_device(pdev);
786} 807}
787 808
809static int vmw_pm_suspend(struct device *kdev)
810{
811 struct pci_dev *pdev = to_pci_dev(kdev);
812 struct pm_message dummy;
813
814 dummy.event = 0;
815
816 return vmw_pci_suspend(pdev, dummy);
817}
818
819static int vmw_pm_resume(struct device *kdev)
820{
821 struct pci_dev *pdev = to_pci_dev(kdev);
822
823 return vmw_pci_resume(pdev);
824}
825
826static int vmw_pm_prepare(struct device *kdev)
827{
828 struct pci_dev *pdev = to_pci_dev(kdev);
829 struct drm_device *dev = pci_get_drvdata(pdev);
830 struct vmw_private *dev_priv = vmw_priv(dev);
831
832 /**
833 * Release 3d reference held by fbdev and potentially
834 * stop fifo.
835 */
836 dev_priv->suspended = true;
837 if (dev_priv->enable_fb)
838 vmw_3d_resource_dec(dev_priv);
839
840 if (dev_priv->num_3d_resources != 0) {
841
842 DRM_INFO("Can't suspend or hibernate "
843 "while 3D resources are active.\n");
844
845 if (dev_priv->enable_fb)
846 vmw_3d_resource_inc(dev_priv);
847 dev_priv->suspended = false;
848 return -EBUSY;
849 }
850
851 return 0;
852}
853
854static void vmw_pm_complete(struct device *kdev)
855{
856 struct pci_dev *pdev = to_pci_dev(kdev);
857 struct drm_device *dev = pci_get_drvdata(pdev);
858 struct vmw_private *dev_priv = vmw_priv(dev);
859
860 /**
861 * Reclaim 3d reference held by fbdev and potentially
862 * start fifo.
863 */
864 if (dev_priv->enable_fb)
865 vmw_3d_resource_inc(dev_priv);
866
867 dev_priv->suspended = false;
868}
869
870static const struct dev_pm_ops vmw_pm_ops = {
871 .prepare = vmw_pm_prepare,
872 .complete = vmw_pm_complete,
873 .suspend = vmw_pm_suspend,
874 .resume = vmw_pm_resume,
875};
876
788static struct drm_driver driver = { 877static struct drm_driver driver = {
789 .driver_features = DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED | 878 .driver_features = DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED |
790 DRIVER_MODESET, 879 DRIVER_MODESET,
@@ -798,8 +887,6 @@ static struct drm_driver driver = {
798 .irq_handler = vmw_irq_handler, 887 .irq_handler = vmw_irq_handler,
799 .get_vblank_counter = vmw_get_vblank_counter, 888 .get_vblank_counter = vmw_get_vblank_counter,
800 .reclaim_buffers_locked = NULL, 889 .reclaim_buffers_locked = NULL,
801 .get_map_ofs = drm_core_get_map_ofs,
802 .get_reg_ofs = drm_core_get_reg_ofs,
803 .ioctls = vmw_ioctls, 890 .ioctls = vmw_ioctls,
804 .num_ioctls = DRM_ARRAY_SIZE(vmw_ioctls), 891 .num_ioctls = DRM_ARRAY_SIZE(vmw_ioctls),
805 .dma_quiescent = NULL, /*vmw_dma_quiescent, */ 892 .dma_quiescent = NULL, /*vmw_dma_quiescent, */
@@ -820,15 +907,8 @@ static struct drm_driver driver = {
820#if defined(CONFIG_COMPAT) 907#if defined(CONFIG_COMPAT)
821 .compat_ioctl = drm_compat_ioctl, 908 .compat_ioctl = drm_compat_ioctl,
822#endif 909#endif
823 }, 910 .llseek = noop_llseek,
824 .pci_driver = { 911 },
825 .name = VMWGFX_DRIVER_NAME,
826 .id_table = vmw_pci_id_list,
827 .probe = vmw_probe,
828 .remove = vmw_remove,
829 .suspend = vmw_pci_suspend,
830 .resume = vmw_pci_resume
831 },
832 .name = VMWGFX_DRIVER_NAME, 912 .name = VMWGFX_DRIVER_NAME,
833 .desc = VMWGFX_DRIVER_DESC, 913 .desc = VMWGFX_DRIVER_DESC,
834 .date = VMWGFX_DRIVER_DATE, 914 .date = VMWGFX_DRIVER_DATE,
@@ -837,6 +917,16 @@ static struct drm_driver driver = {
837 .patchlevel = VMWGFX_DRIVER_PATCHLEVEL 917 .patchlevel = VMWGFX_DRIVER_PATCHLEVEL
838}; 918};
839 919
920static struct pci_driver vmw_pci_driver = {
921 .name = VMWGFX_DRIVER_NAME,
922 .id_table = vmw_pci_id_list,
923 .probe = vmw_probe,
924 .remove = vmw_remove,
925 .driver = {
926 .pm = &vmw_pm_ops
927 }
928};
929
840static int vmw_probe(struct pci_dev *pdev, const struct pci_device_id *ent) 930static int vmw_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
841{ 931{
842 return drm_get_pci_dev(pdev, ent, &driver); 932 return drm_get_pci_dev(pdev, ent, &driver);
@@ -845,7 +935,7 @@ static int vmw_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
845static int __init vmwgfx_init(void) 935static int __init vmwgfx_init(void)
846{ 936{
847 int ret; 937 int ret;
848 ret = drm_init(&driver); 938 ret = drm_pci_init(&driver, &vmw_pci_driver);
849 if (ret) 939 if (ret)
850 DRM_ERROR("Failed initializing DRM.\n"); 940 DRM_ERROR("Failed initializing DRM.\n");
851 return ret; 941 return ret;
@@ -853,7 +943,7 @@ static int __init vmwgfx_init(void)
853 943
854static void __exit vmwgfx_exit(void) 944static void __exit vmwgfx_exit(void)
855{ 945{
856 drm_exit(&driver); 946 drm_pci_exit(&driver, &vmw_pci_driver);
857} 947}
858 948
859module_init(vmwgfx_init); 949module_init(vmwgfx_init);
@@ -862,3 +952,7 @@ module_exit(vmwgfx_exit);
862MODULE_AUTHOR("VMware Inc. and others"); 952MODULE_AUTHOR("VMware Inc. and others");
863MODULE_DESCRIPTION("Standalone drm driver for the VMware SVGA device"); 953MODULE_DESCRIPTION("Standalone drm driver for the VMware SVGA device");
864MODULE_LICENSE("GPL and additional rights"); 954MODULE_LICENSE("GPL and additional rights");
955MODULE_VERSION(__stringify(VMWGFX_DRIVER_MAJOR) "."
956 __stringify(VMWGFX_DRIVER_MINOR) "."
957 __stringify(VMWGFX_DRIVER_PATCHLEVEL) "."
958 "0");
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
index 58de6393f611..10fc01f69c40 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
@@ -39,9 +39,9 @@
39#include "ttm/ttm_execbuf_util.h" 39#include "ttm/ttm_execbuf_util.h"
40#include "ttm/ttm_module.h" 40#include "ttm/ttm_module.h"
41 41
42#define VMWGFX_DRIVER_DATE "20100209" 42#define VMWGFX_DRIVER_DATE "20100927"
43#define VMWGFX_DRIVER_MAJOR 1 43#define VMWGFX_DRIVER_MAJOR 1
44#define VMWGFX_DRIVER_MINOR 2 44#define VMWGFX_DRIVER_MINOR 4
45#define VMWGFX_DRIVER_PATCHLEVEL 0 45#define VMWGFX_DRIVER_PATCHLEVEL 0
46#define VMWGFX_FILE_PAGE_OFFSET 0x00100000 46#define VMWGFX_FILE_PAGE_OFFSET 0x00100000
47#define VMWGFX_FIFO_STATIC_SIZE (1024*1024) 47#define VMWGFX_FIFO_STATIC_SIZE (1024*1024)
@@ -49,6 +49,9 @@
49#define VMWGFX_MAX_GMRS 2048 49#define VMWGFX_MAX_GMRS 2048
50#define VMWGFX_MAX_DISPLAYS 16 50#define VMWGFX_MAX_DISPLAYS 16
51 51
52#define VMW_PL_GMR TTM_PL_PRIV0
53#define VMW_PL_FLAG_GMR TTM_PL_FLAG_PRIV0
54
52struct vmw_fpriv { 55struct vmw_fpriv {
53 struct drm_master *locked_master; 56 struct drm_master *locked_master;
54 struct ttm_object_file *tfile; 57 struct ttm_object_file *tfile;
@@ -57,8 +60,6 @@ struct vmw_fpriv {
57struct vmw_dma_buffer { 60struct vmw_dma_buffer {
58 struct ttm_buffer_object base; 61 struct ttm_buffer_object base;
59 struct list_head validate_list; 62 struct list_head validate_list;
60 struct list_head gmr_lru;
61 uint32_t gmr_id;
62 bool gmr_bound; 63 bool gmr_bound;
63 uint32_t cur_validate_node; 64 uint32_t cur_validate_node;
64 bool on_validate_list; 65 bool on_validate_list;
@@ -151,6 +152,8 @@ struct vmw_overlay;
151 152
152struct vmw_master { 153struct vmw_master {
153 struct ttm_lock lock; 154 struct ttm_lock lock;
155 struct mutex fb_surf_mutex;
156 struct list_head fb_surf;
154}; 157};
155 158
156struct vmw_vga_topology_state { 159struct vmw_vga_topology_state {
@@ -182,6 +185,7 @@ struct vmw_private {
182 uint32_t capabilities; 185 uint32_t capabilities;
183 uint32_t max_gmr_descriptors; 186 uint32_t max_gmr_descriptors;
184 uint32_t max_gmr_ids; 187 uint32_t max_gmr_ids;
188 bool has_gmr;
185 struct mutex hw_mutex; 189 struct mutex hw_mutex;
186 190
187 /* 191 /*
@@ -260,18 +264,9 @@ struct vmw_private {
260 */ 264 */
261 265
262 struct vmw_sw_context ctx; 266 struct vmw_sw_context ctx;
263 uint32_t val_seq;
264 struct mutex cmdbuf_mutex; 267 struct mutex cmdbuf_mutex;
265 268
266 /** 269 /**
267 * GMR management. Protected by the lru spinlock.
268 */
269
270 struct ida gmr_ida;
271 struct list_head gmr_lru;
272
273
274 /**
275 * Operating mode. 270 * Operating mode.
276 */ 271 */
277 272
@@ -286,6 +281,7 @@ struct vmw_private {
286 struct vmw_master *active_master; 281 struct vmw_master *active_master;
287 struct vmw_master fbdev_master; 282 struct vmw_master fbdev_master;
288 struct notifier_block pm_nb; 283 struct notifier_block pm_nb;
284 bool suspended;
289 285
290 struct mutex release_mutex; 286 struct mutex release_mutex;
291 uint32_t num_3d_resources; 287 uint32_t num_3d_resources;
@@ -331,7 +327,9 @@ void vmw_3d_resource_dec(struct vmw_private *dev_priv);
331 */ 327 */
332 328
333extern int vmw_gmr_bind(struct vmw_private *dev_priv, 329extern int vmw_gmr_bind(struct vmw_private *dev_priv,
334 struct ttm_buffer_object *bo); 330 struct page *pages[],
331 unsigned long num_pages,
332 int gmr_id);
335extern void vmw_gmr_unbind(struct vmw_private *dev_priv, int gmr_id); 333extern void vmw_gmr_unbind(struct vmw_private *dev_priv, int gmr_id);
336 334
337/** 335/**
@@ -380,14 +378,10 @@ extern uint32_t vmw_dmabuf_validate_node(struct ttm_buffer_object *bo,
380extern void vmw_dmabuf_validate_clear(struct ttm_buffer_object *bo); 378extern void vmw_dmabuf_validate_clear(struct ttm_buffer_object *bo);
381extern int vmw_user_dmabuf_lookup(struct ttm_object_file *tfile, 379extern int vmw_user_dmabuf_lookup(struct ttm_object_file *tfile,
382 uint32_t id, struct vmw_dma_buffer **out); 380 uint32_t id, struct vmw_dma_buffer **out);
383extern uint32_t vmw_dmabuf_gmr(struct ttm_buffer_object *bo);
384extern void vmw_dmabuf_set_gmr(struct ttm_buffer_object *bo, uint32_t id);
385extern int vmw_gmr_id_alloc(struct vmw_private *dev_priv, uint32_t *p_id);
386extern int vmw_dmabuf_to_start_of_vram(struct vmw_private *vmw_priv, 381extern int vmw_dmabuf_to_start_of_vram(struct vmw_private *vmw_priv,
387 struct vmw_dma_buffer *bo); 382 struct vmw_dma_buffer *bo);
388extern int vmw_dmabuf_from_vram(struct vmw_private *vmw_priv, 383extern int vmw_dmabuf_from_vram(struct vmw_private *vmw_priv,
389 struct vmw_dma_buffer *bo); 384 struct vmw_dma_buffer *bo);
390extern void vmw_dmabuf_gmr_unbind(struct ttm_buffer_object *bo);
391extern int vmw_stream_claim_ioctl(struct drm_device *dev, void *data, 385extern int vmw_stream_claim_ioctl(struct drm_device *dev, void *data,
392 struct drm_file *file_priv); 386 struct drm_file *file_priv);
393extern int vmw_stream_unref_ioctl(struct drm_device *dev, void *data, 387extern int vmw_stream_unref_ioctl(struct drm_device *dev, void *data,
@@ -439,6 +433,7 @@ extern int vmw_mmap(struct file *filp, struct vm_area_struct *vma);
439extern struct ttm_placement vmw_vram_placement; 433extern struct ttm_placement vmw_vram_placement;
440extern struct ttm_placement vmw_vram_ne_placement; 434extern struct ttm_placement vmw_vram_ne_placement;
441extern struct ttm_placement vmw_vram_sys_placement; 435extern struct ttm_placement vmw_vram_sys_placement;
436extern struct ttm_placement vmw_vram_gmr_placement;
442extern struct ttm_placement vmw_sys_placement; 437extern struct ttm_placement vmw_sys_placement;
443extern struct ttm_bo_driver vmw_bo_driver; 438extern struct ttm_bo_driver vmw_bo_driver;
444extern int vmw_dma_quiescent(struct drm_device *dev); 439extern int vmw_dma_quiescent(struct drm_device *dev);
@@ -518,6 +513,10 @@ void vmw_kms_write_svga(struct vmw_private *vmw_priv,
518 unsigned bbp, unsigned depth); 513 unsigned bbp, unsigned depth);
519int vmw_kms_update_layout_ioctl(struct drm_device *dev, void *data, 514int vmw_kms_update_layout_ioctl(struct drm_device *dev, void *data,
520 struct drm_file *file_priv); 515 struct drm_file *file_priv);
516void vmw_kms_idle_workqueues(struct vmw_master *vmaster);
517bool vmw_kms_validate_mode_vram(struct vmw_private *dev_priv,
518 uint32_t pitch,
519 uint32_t height);
521u32 vmw_get_vblank_counter(struct drm_device *dev, int crtc); 520u32 vmw_get_vblank_counter(struct drm_device *dev, int crtc);
522 521
523/** 522/**
@@ -537,6 +536,12 @@ int vmw_overlay_num_overlays(struct vmw_private *dev_priv);
537int vmw_overlay_num_free_overlays(struct vmw_private *dev_priv); 536int vmw_overlay_num_free_overlays(struct vmw_private *dev_priv);
538 537
539/** 538/**
539 * GMR Id manager
540 */
541
542extern const struct ttm_mem_type_manager_func vmw_gmrid_manager_func;
543
544/**
540 * Inline helper functions 545 * Inline helper functions
541 */ 546 */
542 547
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c b/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c
index 8e396850513c..41b95ed6dbcd 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c
@@ -538,8 +538,11 @@ static void vmw_apply_relocations(struct vmw_sw_context *sw_context)
538 reloc = &sw_context->relocs[i]; 538 reloc = &sw_context->relocs[i];
539 validate = &sw_context->val_bufs[reloc->index]; 539 validate = &sw_context->val_bufs[reloc->index];
540 bo = validate->bo; 540 bo = validate->bo;
541 reloc->location->offset += bo->offset; 541 if (bo->mem.mem_type == TTM_PL_VRAM) {
542 reloc->location->gmrId = vmw_dmabuf_gmr(bo); 542 reloc->location->offset += bo->offset;
543 reloc->location->gmrId = SVGA_GMR_FRAMEBUFFER;
544 } else
545 reloc->location->gmrId = bo->mem.start;
543 } 546 }
544 vmw_free_relocations(sw_context); 547 vmw_free_relocations(sw_context);
545} 548}
@@ -563,25 +566,14 @@ static int vmw_validate_single_buffer(struct vmw_private *dev_priv,
563{ 566{
564 int ret; 567 int ret;
565 568
566 if (vmw_dmabuf_gmr(bo) != SVGA_GMR_NULL)
567 return 0;
568
569 /** 569 /**
570 * Put BO in VRAM, only if there is space. 570 * Put BO in VRAM if there is space, otherwise as a GMR.
571 * If there is no space in VRAM and GMR ids are all used up,
572 * start evicting GMRs to make room. If the DMA buffer can't be
573 * used as a GMR, this will return -ENOMEM.
571 */ 574 */
572 575
573 ret = ttm_bo_validate(bo, &vmw_vram_sys_placement, true, false, false); 576 ret = ttm_bo_validate(bo, &vmw_vram_gmr_placement, true, false, false);
574 if (unlikely(ret == -ERESTARTSYS))
575 return ret;
576
577 /**
578 * Otherwise, set it up as GMR.
579 */
580
581 if (vmw_dmabuf_gmr(bo) != SVGA_GMR_NULL)
582 return 0;
583
584 ret = vmw_gmr_bind(dev_priv, bo);
585 if (likely(ret == 0 || ret == -ERESTARTSYS)) 577 if (likely(ret == 0 || ret == -ERESTARTSYS))
586 return ret; 578 return ret;
587 579
@@ -590,6 +582,7 @@ static int vmw_validate_single_buffer(struct vmw_private *dev_priv,
590 * previous contents. 582 * previous contents.
591 */ 583 */
592 584
585 DRM_INFO("Falling through to VRAM.\n");
593 ret = ttm_bo_validate(bo, &vmw_vram_placement, true, false, false); 586 ret = ttm_bo_validate(bo, &vmw_vram_placement, true, false, false);
594 return ret; 587 return ret;
595} 588}
@@ -660,8 +653,7 @@ int vmw_execbuf_ioctl(struct drm_device *dev, void *data,
660 ret = vmw_cmd_check_all(dev_priv, sw_context, cmd, arg->command_size); 653 ret = vmw_cmd_check_all(dev_priv, sw_context, cmd, arg->command_size);
661 if (unlikely(ret != 0)) 654 if (unlikely(ret != 0))
662 goto out_err; 655 goto out_err;
663 ret = ttm_eu_reserve_buffers(&sw_context->validate_nodes, 656 ret = ttm_eu_reserve_buffers(&sw_context->validate_nodes);
664 dev_priv->val_seq++);
665 if (unlikely(ret != 0)) 657 if (unlikely(ret != 0))
666 goto out_err; 658 goto out_err;
667 659
@@ -698,6 +690,7 @@ int vmw_execbuf_ioctl(struct drm_device *dev, void *data,
698 690
699 fence_rep.error = ret; 691 fence_rep.error = ret;
700 fence_rep.fence_seq = (uint64_t) sequence; 692 fence_rep.fence_seq = (uint64_t) sequence;
693 fence_rep.pad64 = 0;
701 694
702 user_fence_rep = (struct drm_vmw_fence_rep __user *) 695 user_fence_rep = (struct drm_vmw_fence_rep __user *)
703 (unsigned long)arg->fence_rep; 696 (unsigned long)arg->fence_rep;
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c b/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c
index 409e172f4abf..bfab60c938ac 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c
@@ -144,6 +144,13 @@ static int vmw_fb_check_var(struct fb_var_screeninfo *var,
144 return -EINVAL; 144 return -EINVAL;
145 } 145 }
146 146
147 if (!vmw_kms_validate_mode_vram(vmw_priv,
148 info->fix.line_length,
149 var->yoffset + var->yres)) {
150 DRM_ERROR("Requested geom can not fit in framebuffer\n");
151 return -EINVAL;
152 }
153
147 return 0; 154 return 0;
148} 155}
149 156
@@ -205,6 +212,9 @@ static void vmw_fb_dirty_flush(struct vmw_fb_par *par)
205 SVGAFifoCmdUpdate body; 212 SVGAFifoCmdUpdate body;
206 } *cmd; 213 } *cmd;
207 214
215 if (vmw_priv->suspended)
216 return;
217
208 spin_lock_irqsave(&par->dirty.lock, flags); 218 spin_lock_irqsave(&par->dirty.lock, flags);
209 if (!par->dirty.active) { 219 if (!par->dirty.active) {
210 spin_unlock_irqrestore(&par->dirty.lock, flags); 220 spin_unlock_irqrestore(&par->dirty.lock, flags);
@@ -470,9 +480,6 @@ int vmw_fb_init(struct vmw_private *vmw_priv)
470 info->fix.smem_start = 0; 480 info->fix.smem_start = 0;
471 info->fix.smem_len = fb_size; 481 info->fix.smem_len = fb_size;
472 482
473 info->fix.mmio_start = 0;
474 info->fix.mmio_len = 0;
475
476 info->pseudo_palette = par->pseudo_palette; 483 info->pseudo_palette = par->pseudo_palette;
477 info->screen_base = par->vmalloc; 484 info->screen_base = par->vmalloc;
478 info->screen_size = fb_size; 485 info->screen_size = fb_size;
@@ -616,7 +623,8 @@ int vmw_dmabuf_to_start_of_vram(struct vmw_private *vmw_priv,
616 goto err_unlock; 623 goto err_unlock;
617 624
618 if (bo->mem.mem_type == TTM_PL_VRAM && 625 if (bo->mem.mem_type == TTM_PL_VRAM &&
619 bo->mem.mm_node->start < bo->num_pages) 626 bo->mem.start < bo->num_pages &&
627 bo->mem.start > 0)
620 (void) ttm_bo_validate(bo, &vmw_sys_placement, false, 628 (void) ttm_bo_validate(bo, &vmw_sys_placement, false,
621 false, false); 629 false, false);
622 630
@@ -648,7 +656,7 @@ int vmw_fb_off(struct vmw_private *vmw_priv)
648 par->dirty.active = false; 656 par->dirty.active = false;
649 spin_unlock_irqrestore(&par->dirty.lock, flags); 657 spin_unlock_irqrestore(&par->dirty.lock, flags);
650 658
651 flush_scheduled_work(); 659 flush_delayed_work_sync(&info->deferred_work);
652 660
653 par->bo_ptr = NULL; 661 par->bo_ptr = NULL;
654 ttm_bo_kunmap(&par->map); 662 ttm_bo_kunmap(&par->map);
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c b/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c
index 0fe31766e4cf..635c0ffee7fe 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c
@@ -545,7 +545,7 @@ int vmw_fifo_mmap(struct file *filp, struct vm_area_struct *vma)
545 struct drm_file *file_priv; 545 struct drm_file *file_priv;
546 struct vmw_private *dev_priv; 546 struct vmw_private *dev_priv;
547 547
548 file_priv = (struct drm_file *)filp->private_data; 548 file_priv = filp->private_data;
549 dev_priv = vmw_priv(file_priv->minor->dev); 549 dev_priv = vmw_priv(file_priv->minor->dev);
550 550
551 if (vma->vm_pgoff != (dev_priv->mmio_start >> PAGE_SHIFT) || 551 if (vma->vm_pgoff != (dev_priv->mmio_start >> PAGE_SHIFT) ||
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_gmr.c b/drivers/gpu/drm/vmwgfx/vmwgfx_gmr.c
index 5f8908a5d7fd..de0c5948521d 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_gmr.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_gmr.c
@@ -146,7 +146,7 @@ static void vmw_gmr_fire_descriptors(struct vmw_private *dev_priv,
146 */ 146 */
147 147
148static unsigned long vmw_gmr_count_descriptors(struct page *pages[], 148static unsigned long vmw_gmr_count_descriptors(struct page *pages[],
149 unsigned long num_pages) 149 unsigned long num_pages)
150{ 150{
151 unsigned long prev_pfn = ~(0UL); 151 unsigned long prev_pfn = ~(0UL);
152 unsigned long pfn; 152 unsigned long pfn;
@@ -163,45 +163,33 @@ static unsigned long vmw_gmr_count_descriptors(struct page *pages[],
163} 163}
164 164
165int vmw_gmr_bind(struct vmw_private *dev_priv, 165int vmw_gmr_bind(struct vmw_private *dev_priv,
166 struct ttm_buffer_object *bo) 166 struct page *pages[],
167 unsigned long num_pages,
168 int gmr_id)
167{ 169{
168 struct ttm_tt *ttm = bo->ttm;
169 unsigned long descriptors;
170 int ret;
171 uint32_t id;
172 struct list_head desc_pages; 170 struct list_head desc_pages;
171 int ret;
173 172
174 if (!(dev_priv->capabilities & SVGA_CAP_GMR)) 173 if (unlikely(!(dev_priv->capabilities & SVGA_CAP_GMR)))
175 return -EINVAL; 174 return -EINVAL;
176 175
177 ret = ttm_tt_populate(ttm); 176 if (vmw_gmr_count_descriptors(pages, num_pages) >
178 if (unlikely(ret != 0)) 177 dev_priv->max_gmr_descriptors)
179 return ret;
180
181 descriptors = vmw_gmr_count_descriptors(ttm->pages, ttm->num_pages);
182 if (unlikely(descriptors > dev_priv->max_gmr_descriptors))
183 return -EINVAL; 178 return -EINVAL;
184 179
185 INIT_LIST_HEAD(&desc_pages); 180 INIT_LIST_HEAD(&desc_pages);
186 ret = vmw_gmr_build_descriptors(&desc_pages, ttm->pages,
187 ttm->num_pages);
188 if (unlikely(ret != 0))
189 return ret;
190 181
191 ret = vmw_gmr_id_alloc(dev_priv, &id); 182 ret = vmw_gmr_build_descriptors(&desc_pages, pages, num_pages);
192 if (unlikely(ret != 0)) 183 if (unlikely(ret != 0))
193 goto out_no_id; 184 return ret;
194 185
195 vmw_gmr_fire_descriptors(dev_priv, id, &desc_pages); 186 vmw_gmr_fire_descriptors(dev_priv, gmr_id, &desc_pages);
196 vmw_gmr_free_descriptors(&desc_pages); 187 vmw_gmr_free_descriptors(&desc_pages);
197 vmw_dmabuf_set_gmr(bo, id);
198 return 0;
199 188
200out_no_id: 189 return 0;
201 vmw_gmr_free_descriptors(&desc_pages);
202 return ret;
203} 190}
204 191
192
205void vmw_gmr_unbind(struct vmw_private *dev_priv, int gmr_id) 193void vmw_gmr_unbind(struct vmw_private *dev_priv, int gmr_id)
206{ 194{
207 mutex_lock(&dev_priv->hw_mutex); 195 mutex_lock(&dev_priv->hw_mutex);
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c b/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c
new file mode 100644
index 000000000000..ac6e0d1bd629
--- /dev/null
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c
@@ -0,0 +1,137 @@
1/**************************************************************************
2 *
3 * Copyright (c) 2007-2010 VMware, Inc., Palo Alto, CA., USA
4 * All Rights Reserved.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sub license, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
13 *
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial portions
16 * of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
21 * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
22 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
23 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
24 * USE OR OTHER DEALINGS IN THE SOFTWARE.
25 *
26 **************************************************************************/
27/*
28 * Authors: Thomas Hellstrom <thellstrom-at-vmware-dot-com>
29 */
30
31#include "vmwgfx_drv.h"
32#include "ttm/ttm_module.h"
33#include "ttm/ttm_bo_driver.h"
34#include "ttm/ttm_placement.h"
35#include <linux/idr.h>
36#include <linux/spinlock.h>
37#include <linux/kernel.h>
38
39struct vmwgfx_gmrid_man {
40 spinlock_t lock;
41 struct ida gmr_ida;
42 uint32_t max_gmr_ids;
43};
44
45static int vmw_gmrid_man_get_node(struct ttm_mem_type_manager *man,
46 struct ttm_buffer_object *bo,
47 struct ttm_placement *placement,
48 struct ttm_mem_reg *mem)
49{
50 struct vmwgfx_gmrid_man *gman =
51 (struct vmwgfx_gmrid_man *)man->priv;
52 int ret;
53 int id;
54
55 mem->mm_node = NULL;
56
57 do {
58 if (unlikely(ida_pre_get(&gman->gmr_ida, GFP_KERNEL) == 0))
59 return -ENOMEM;
60
61 spin_lock(&gman->lock);
62 ret = ida_get_new(&gman->gmr_ida, &id);
63
64 if (unlikely(ret == 0 && id >= gman->max_gmr_ids)) {
65 ida_remove(&gman->gmr_ida, id);
66 spin_unlock(&gman->lock);
67 return 0;
68 }
69
70 spin_unlock(&gman->lock);
71
72 } while (ret == -EAGAIN);
73
74 if (likely(ret == 0)) {
75 mem->mm_node = gman;
76 mem->start = id;
77 }
78
79 return ret;
80}
81
82static void vmw_gmrid_man_put_node(struct ttm_mem_type_manager *man,
83 struct ttm_mem_reg *mem)
84{
85 struct vmwgfx_gmrid_man *gman =
86 (struct vmwgfx_gmrid_man *)man->priv;
87
88 if (mem->mm_node) {
89 spin_lock(&gman->lock);
90 ida_remove(&gman->gmr_ida, mem->start);
91 spin_unlock(&gman->lock);
92 mem->mm_node = NULL;
93 }
94}
95
96static int vmw_gmrid_man_init(struct ttm_mem_type_manager *man,
97 unsigned long p_size)
98{
99 struct vmwgfx_gmrid_man *gman =
100 kzalloc(sizeof(*gman), GFP_KERNEL);
101
102 if (unlikely(gman == NULL))
103 return -ENOMEM;
104
105 spin_lock_init(&gman->lock);
106 ida_init(&gman->gmr_ida);
107 gman->max_gmr_ids = p_size;
108 man->priv = (void *) gman;
109 return 0;
110}
111
112static int vmw_gmrid_man_takedown(struct ttm_mem_type_manager *man)
113{
114 struct vmwgfx_gmrid_man *gman =
115 (struct vmwgfx_gmrid_man *)man->priv;
116
117 if (gman) {
118 ida_destroy(&gman->gmr_ida);
119 kfree(gman);
120 }
121 return 0;
122}
123
124static void vmw_gmrid_man_debug(struct ttm_mem_type_manager *man,
125 const char *prefix)
126{
127 printk(KERN_INFO "%s: No debug info available for the GMR "
128 "id manager.\n", prefix);
129}
130
131const struct ttm_mem_type_manager_func vmw_gmrid_manager_func = {
132 vmw_gmrid_man_init,
133 vmw_gmrid_man_takedown,
134 vmw_gmrid_man_get_node,
135 vmw_gmrid_man_put_node,
136 vmw_gmrid_man_debug
137};
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c b/drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c
index 1c7a316454d8..570d57775a58 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c
@@ -54,6 +54,9 @@ int vmw_getparam_ioctl(struct drm_device *dev, void *data,
54 case DRM_VMW_PARAM_FIFO_CAPS: 54 case DRM_VMW_PARAM_FIFO_CAPS:
55 param->value = dev_priv->fifo.capabilities; 55 param->value = dev_priv->fifo.capabilities;
56 break; 56 break;
57 case DRM_VMW_PARAM_MAX_FB_SIZE:
58 param->value = dev_priv->vram_size;
59 break;
57 default: 60 default:
58 DRM_ERROR("Illegal vmwgfx get param request: %d\n", 61 DRM_ERROR("Illegal vmwgfx get param request: %d\n",
59 param->param); 62 param->param);
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
index e882ba099f0c..dfe32e62bd90 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
@@ -245,7 +245,7 @@ void vmw_kms_cursor_snoop(struct vmw_surface *srf,
245 /* TODO handle none page aligned offsets */ 245 /* TODO handle none page aligned offsets */
246 /* TODO handle partial uploads and pitch != 256 */ 246 /* TODO handle partial uploads and pitch != 256 */
247 /* TODO handle more then one copy (size != 64) */ 247 /* TODO handle more then one copy (size != 64) */
248 DRM_ERROR("lazy programer, cant handle wierd stuff\n"); 248 DRM_ERROR("lazy programmer, can't handle weird stuff\n");
249 return; 249 return;
250 } 250 }
251 251
@@ -332,18 +332,55 @@ struct vmw_framebuffer_surface {
332 struct delayed_work d_work; 332 struct delayed_work d_work;
333 struct mutex work_lock; 333 struct mutex work_lock;
334 bool present_fs; 334 bool present_fs;
335 struct list_head head;
336 struct drm_master *master;
335}; 337};
336 338
339/**
340 * vmw_kms_idle_workqueues - Flush workqueues on this master
341 *
342 * @vmaster - Pointer identifying the master, for the surfaces of which
343 * we idle the dirty work queues.
344 *
345 * This function should be called with the ttm lock held in exclusive mode
346 * to idle all dirty work queues before the fifo is taken down.
347 *
348 * The work task may actually requeue itself, but after the flush returns we're
349 * sure that there's nothing to present, since the ttm lock is held in
350 * exclusive mode, so the fifo will never get used.
351 */
352
353void vmw_kms_idle_workqueues(struct vmw_master *vmaster)
354{
355 struct vmw_framebuffer_surface *entry;
356
357 mutex_lock(&vmaster->fb_surf_mutex);
358 list_for_each_entry(entry, &vmaster->fb_surf, head) {
359 if (cancel_delayed_work_sync(&entry->d_work))
360 (void) entry->d_work.work.func(&entry->d_work.work);
361
362 (void) cancel_delayed_work_sync(&entry->d_work);
363 }
364 mutex_unlock(&vmaster->fb_surf_mutex);
365}
366
337void vmw_framebuffer_surface_destroy(struct drm_framebuffer *framebuffer) 367void vmw_framebuffer_surface_destroy(struct drm_framebuffer *framebuffer)
338{ 368{
339 struct vmw_framebuffer_surface *vfb = 369 struct vmw_framebuffer_surface *vfbs =
340 vmw_framebuffer_to_vfbs(framebuffer); 370 vmw_framebuffer_to_vfbs(framebuffer);
371 struct vmw_master *vmaster = vmw_master(vfbs->master);
372
373
374 mutex_lock(&vmaster->fb_surf_mutex);
375 list_del(&vfbs->head);
376 mutex_unlock(&vmaster->fb_surf_mutex);
341 377
342 cancel_delayed_work_sync(&vfb->d_work); 378 cancel_delayed_work_sync(&vfbs->d_work);
379 drm_master_put(&vfbs->master);
343 drm_framebuffer_cleanup(framebuffer); 380 drm_framebuffer_cleanup(framebuffer);
344 vmw_surface_unreference(&vfb->surface); 381 vmw_surface_unreference(&vfbs->surface);
345 382
346 kfree(framebuffer); 383 kfree(vfbs);
347} 384}
348 385
349static void vmw_framebuffer_present_fs_callback(struct work_struct *work) 386static void vmw_framebuffer_present_fs_callback(struct work_struct *work)
@@ -362,6 +399,12 @@ static void vmw_framebuffer_present_fs_callback(struct work_struct *work)
362 SVGA3dCopyRect cr; 399 SVGA3dCopyRect cr;
363 } *cmd; 400 } *cmd;
364 401
402 /**
403 * Strictly we should take the ttm_lock in read mode before accessing
404 * the fifo, to make sure the fifo is present and up. However,
405 * instead we flush all workqueues under the ttm lock in exclusive mode
406 * before taking down the fifo.
407 */
365 mutex_lock(&vfbs->work_lock); 408 mutex_lock(&vfbs->work_lock);
366 if (!vfbs->present_fs) 409 if (!vfbs->present_fs)
367 goto out_unlock; 410 goto out_unlock;
@@ -392,17 +435,20 @@ out_unlock:
392 435
393 436
394int vmw_framebuffer_surface_dirty(struct drm_framebuffer *framebuffer, 437int vmw_framebuffer_surface_dirty(struct drm_framebuffer *framebuffer,
438 struct drm_file *file_priv,
395 unsigned flags, unsigned color, 439 unsigned flags, unsigned color,
396 struct drm_clip_rect *clips, 440 struct drm_clip_rect *clips,
397 unsigned num_clips) 441 unsigned num_clips)
398{ 442{
399 struct vmw_private *dev_priv = vmw_priv(framebuffer->dev); 443 struct vmw_private *dev_priv = vmw_priv(framebuffer->dev);
444 struct vmw_master *vmaster = vmw_master(file_priv->master);
400 struct vmw_framebuffer_surface *vfbs = 445 struct vmw_framebuffer_surface *vfbs =
401 vmw_framebuffer_to_vfbs(framebuffer); 446 vmw_framebuffer_to_vfbs(framebuffer);
402 struct vmw_surface *surf = vfbs->surface; 447 struct vmw_surface *surf = vfbs->surface;
403 struct drm_clip_rect norect; 448 struct drm_clip_rect norect;
404 SVGA3dCopyRect *cr; 449 SVGA3dCopyRect *cr;
405 int i, inc = 1; 450 int i, inc = 1;
451 int ret;
406 452
407 struct { 453 struct {
408 SVGA3dCmdHeader header; 454 SVGA3dCmdHeader header;
@@ -410,6 +456,13 @@ int vmw_framebuffer_surface_dirty(struct drm_framebuffer *framebuffer,
410 SVGA3dCopyRect cr; 456 SVGA3dCopyRect cr;
411 } *cmd; 457 } *cmd;
412 458
459 if (unlikely(vfbs->master != file_priv->master))
460 return -EINVAL;
461
462 ret = ttm_read_lock(&vmaster->lock, true);
463 if (unlikely(ret != 0))
464 return ret;
465
413 if (!num_clips || 466 if (!num_clips ||
414 !(dev_priv->fifo.capabilities & 467 !(dev_priv->fifo.capabilities &
415 SVGA_FIFO_CAP_SCREEN_OBJECT)) { 468 SVGA_FIFO_CAP_SCREEN_OBJECT)) {
@@ -425,6 +478,7 @@ int vmw_framebuffer_surface_dirty(struct drm_framebuffer *framebuffer,
425 */ 478 */
426 vmw_framebuffer_present_fs_callback(&vfbs->d_work.work); 479 vmw_framebuffer_present_fs_callback(&vfbs->d_work.work);
427 } 480 }
481 ttm_read_unlock(&vmaster->lock);
428 return 0; 482 return 0;
429 } 483 }
430 484
@@ -442,6 +496,7 @@ int vmw_framebuffer_surface_dirty(struct drm_framebuffer *framebuffer,
442 cmd = vmw_fifo_reserve(dev_priv, sizeof(*cmd) + (num_clips - 1) * sizeof(cmd->cr)); 496 cmd = vmw_fifo_reserve(dev_priv, sizeof(*cmd) + (num_clips - 1) * sizeof(cmd->cr));
443 if (unlikely(cmd == NULL)) { 497 if (unlikely(cmd == NULL)) {
444 DRM_ERROR("Fifo reserve failed.\n"); 498 DRM_ERROR("Fifo reserve failed.\n");
499 ttm_read_unlock(&vmaster->lock);
445 return -ENOMEM; 500 return -ENOMEM;
446 } 501 }
447 502
@@ -461,7 +516,7 @@ int vmw_framebuffer_surface_dirty(struct drm_framebuffer *framebuffer,
461 } 516 }
462 517
463 vmw_fifo_commit(dev_priv, sizeof(*cmd) + (num_clips - 1) * sizeof(cmd->cr)); 518 vmw_fifo_commit(dev_priv, sizeof(*cmd) + (num_clips - 1) * sizeof(cmd->cr));
464 519 ttm_read_unlock(&vmaster->lock);
465 return 0; 520 return 0;
466} 521}
467 522
@@ -471,16 +526,57 @@ static struct drm_framebuffer_funcs vmw_framebuffer_surface_funcs = {
471 .create_handle = vmw_framebuffer_create_handle, 526 .create_handle = vmw_framebuffer_create_handle,
472}; 527};
473 528
474int vmw_kms_new_framebuffer_surface(struct vmw_private *dev_priv, 529static int vmw_kms_new_framebuffer_surface(struct vmw_private *dev_priv,
475 struct vmw_surface *surface, 530 struct drm_file *file_priv,
476 struct vmw_framebuffer **out, 531 struct vmw_surface *surface,
477 unsigned width, unsigned height) 532 struct vmw_framebuffer **out,
533 const struct drm_mode_fb_cmd
534 *mode_cmd)
478 535
479{ 536{
480 struct drm_device *dev = dev_priv->dev; 537 struct drm_device *dev = dev_priv->dev;
481 struct vmw_framebuffer_surface *vfbs; 538 struct vmw_framebuffer_surface *vfbs;
539 enum SVGA3dSurfaceFormat format;
540 struct vmw_master *vmaster = vmw_master(file_priv->master);
482 int ret; 541 int ret;
483 542
543 /*
544 * Sanity checks.
545 */
546
547 if (unlikely(surface->mip_levels[0] != 1 ||
548 surface->num_sizes != 1 ||
549 surface->sizes[0].width < mode_cmd->width ||
550 surface->sizes[0].height < mode_cmd->height ||
551 surface->sizes[0].depth != 1)) {
552 DRM_ERROR("Incompatible surface dimensions "
553 "for requested mode.\n");
554 return -EINVAL;
555 }
556
557 switch (mode_cmd->depth) {
558 case 32:
559 format = SVGA3D_A8R8G8B8;
560 break;
561 case 24:
562 format = SVGA3D_X8R8G8B8;
563 break;
564 case 16:
565 format = SVGA3D_R5G6B5;
566 break;
567 case 15:
568 format = SVGA3D_A1R5G5B5;
569 break;
570 default:
571 DRM_ERROR("Invalid color depth: %d\n", mode_cmd->depth);
572 return -EINVAL;
573 }
574
575 if (unlikely(format != surface->format)) {
576 DRM_ERROR("Invalid surface format for requested mode.\n");
577 return -EINVAL;
578 }
579
484 vfbs = kzalloc(sizeof(*vfbs), GFP_KERNEL); 580 vfbs = kzalloc(sizeof(*vfbs), GFP_KERNEL);
485 if (!vfbs) { 581 if (!vfbs) {
486 ret = -ENOMEM; 582 ret = -ENOMEM;
@@ -498,16 +594,22 @@ int vmw_kms_new_framebuffer_surface(struct vmw_private *dev_priv,
498 } 594 }
499 595
500 /* XXX get the first 3 from the surface info */ 596 /* XXX get the first 3 from the surface info */
501 vfbs->base.base.bits_per_pixel = 32; 597 vfbs->base.base.bits_per_pixel = mode_cmd->bpp;
502 vfbs->base.base.pitch = width * 32 / 4; 598 vfbs->base.base.pitch = mode_cmd->pitch;
503 vfbs->base.base.depth = 24; 599 vfbs->base.base.depth = mode_cmd->depth;
504 vfbs->base.base.width = width; 600 vfbs->base.base.width = mode_cmd->width;
505 vfbs->base.base.height = height; 601 vfbs->base.base.height = mode_cmd->height;
506 vfbs->base.pin = &vmw_surface_dmabuf_pin; 602 vfbs->base.pin = &vmw_surface_dmabuf_pin;
507 vfbs->base.unpin = &vmw_surface_dmabuf_unpin; 603 vfbs->base.unpin = &vmw_surface_dmabuf_unpin;
508 vfbs->surface = surface; 604 vfbs->surface = surface;
605 vfbs->master = drm_master_get(file_priv->master);
509 mutex_init(&vfbs->work_lock); 606 mutex_init(&vfbs->work_lock);
607
608 mutex_lock(&vmaster->fb_surf_mutex);
510 INIT_DELAYED_WORK(&vfbs->d_work, &vmw_framebuffer_present_fs_callback); 609 INIT_DELAYED_WORK(&vfbs->d_work, &vmw_framebuffer_present_fs_callback);
610 list_add_tail(&vfbs->head, &vmaster->fb_surf);
611 mutex_unlock(&vmaster->fb_surf_mutex);
612
511 *out = &vfbs->base; 613 *out = &vfbs->base;
512 614
513 return 0; 615 return 0;
@@ -544,18 +646,25 @@ void vmw_framebuffer_dmabuf_destroy(struct drm_framebuffer *framebuffer)
544} 646}
545 647
546int vmw_framebuffer_dmabuf_dirty(struct drm_framebuffer *framebuffer, 648int vmw_framebuffer_dmabuf_dirty(struct drm_framebuffer *framebuffer,
649 struct drm_file *file_priv,
547 unsigned flags, unsigned color, 650 unsigned flags, unsigned color,
548 struct drm_clip_rect *clips, 651 struct drm_clip_rect *clips,
549 unsigned num_clips) 652 unsigned num_clips)
550{ 653{
551 struct vmw_private *dev_priv = vmw_priv(framebuffer->dev); 654 struct vmw_private *dev_priv = vmw_priv(framebuffer->dev);
655 struct vmw_master *vmaster = vmw_master(file_priv->master);
552 struct drm_clip_rect norect; 656 struct drm_clip_rect norect;
657 int ret;
553 struct { 658 struct {
554 uint32_t header; 659 uint32_t header;
555 SVGAFifoCmdUpdate body; 660 SVGAFifoCmdUpdate body;
556 } *cmd; 661 } *cmd;
557 int i, increment = 1; 662 int i, increment = 1;
558 663
664 ret = ttm_read_lock(&vmaster->lock, true);
665 if (unlikely(ret != 0))
666 return ret;
667
559 if (!num_clips) { 668 if (!num_clips) {
560 num_clips = 1; 669 num_clips = 1;
561 clips = &norect; 670 clips = &norect;
@@ -570,6 +679,7 @@ int vmw_framebuffer_dmabuf_dirty(struct drm_framebuffer *framebuffer,
570 cmd = vmw_fifo_reserve(dev_priv, sizeof(*cmd) * num_clips); 679 cmd = vmw_fifo_reserve(dev_priv, sizeof(*cmd) * num_clips);
571 if (unlikely(cmd == NULL)) { 680 if (unlikely(cmd == NULL)) {
572 DRM_ERROR("Fifo reserve failed.\n"); 681 DRM_ERROR("Fifo reserve failed.\n");
682 ttm_read_unlock(&vmaster->lock);
573 return -ENOMEM; 683 return -ENOMEM;
574 } 684 }
575 685
@@ -582,6 +692,7 @@ int vmw_framebuffer_dmabuf_dirty(struct drm_framebuffer *framebuffer,
582 } 692 }
583 693
584 vmw_fifo_commit(dev_priv, sizeof(*cmd) * num_clips); 694 vmw_fifo_commit(dev_priv, sizeof(*cmd) * num_clips);
695 ttm_read_unlock(&vmaster->lock);
585 696
586 return 0; 697 return 0;
587} 698}
@@ -609,6 +720,8 @@ static int vmw_surface_dmabuf_pin(struct vmw_framebuffer *vfb)
609 &vmw_vram_ne_placement, 720 &vmw_vram_ne_placement,
610 false, &vmw_dmabuf_bo_free); 721 false, &vmw_dmabuf_bo_free);
611 vmw_overlay_resume_all(dev_priv); 722 vmw_overlay_resume_all(dev_priv);
723 if (unlikely(ret != 0))
724 vfbs->buffer = NULL;
612 725
613 return ret; 726 return ret;
614} 727}
@@ -619,6 +732,9 @@ static int vmw_surface_dmabuf_unpin(struct vmw_framebuffer *vfb)
619 struct vmw_framebuffer_surface *vfbs = 732 struct vmw_framebuffer_surface *vfbs =
620 vmw_framebuffer_to_vfbs(&vfb->base); 733 vmw_framebuffer_to_vfbs(&vfb->base);
621 734
735 if (unlikely(vfbs->buffer == NULL))
736 return 0;
737
622 bo = &vfbs->buffer->base; 738 bo = &vfbs->buffer->base;
623 ttm_bo_unref(&bo); 739 ttm_bo_unref(&bo);
624 vfbs->buffer = NULL; 740 vfbs->buffer = NULL;
@@ -659,16 +775,25 @@ static int vmw_framebuffer_dmabuf_unpin(struct vmw_framebuffer *vfb)
659 return vmw_dmabuf_from_vram(dev_priv, vfbd->buffer); 775 return vmw_dmabuf_from_vram(dev_priv, vfbd->buffer);
660} 776}
661 777
662int vmw_kms_new_framebuffer_dmabuf(struct vmw_private *dev_priv, 778static int vmw_kms_new_framebuffer_dmabuf(struct vmw_private *dev_priv,
663 struct vmw_dma_buffer *dmabuf, 779 struct vmw_dma_buffer *dmabuf,
664 struct vmw_framebuffer **out, 780 struct vmw_framebuffer **out,
665 unsigned width, unsigned height) 781 const struct drm_mode_fb_cmd
782 *mode_cmd)
666 783
667{ 784{
668 struct drm_device *dev = dev_priv->dev; 785 struct drm_device *dev = dev_priv->dev;
669 struct vmw_framebuffer_dmabuf *vfbd; 786 struct vmw_framebuffer_dmabuf *vfbd;
787 unsigned int requested_size;
670 int ret; 788 int ret;
671 789
790 requested_size = mode_cmd->height * mode_cmd->pitch;
791 if (unlikely(requested_size > dmabuf->base.num_pages * PAGE_SIZE)) {
792 DRM_ERROR("Screen buffer object size is too small "
793 "for requested mode.\n");
794 return -EINVAL;
795 }
796
672 vfbd = kzalloc(sizeof(*vfbd), GFP_KERNEL); 797 vfbd = kzalloc(sizeof(*vfbd), GFP_KERNEL);
673 if (!vfbd) { 798 if (!vfbd) {
674 ret = -ENOMEM; 799 ret = -ENOMEM;
@@ -685,12 +810,11 @@ int vmw_kms_new_framebuffer_dmabuf(struct vmw_private *dev_priv,
685 goto out_err3; 810 goto out_err3;
686 } 811 }
687 812
688 /* XXX get the first 3 from the surface info */ 813 vfbd->base.base.bits_per_pixel = mode_cmd->bpp;
689 vfbd->base.base.bits_per_pixel = 32; 814 vfbd->base.base.pitch = mode_cmd->pitch;
690 vfbd->base.base.pitch = width * vfbd->base.base.bits_per_pixel / 8; 815 vfbd->base.base.depth = mode_cmd->depth;
691 vfbd->base.base.depth = 24; 816 vfbd->base.base.width = mode_cmd->width;
692 vfbd->base.base.width = width; 817 vfbd->base.base.height = mode_cmd->height;
693 vfbd->base.base.height = height;
694 vfbd->base.pin = vmw_framebuffer_dmabuf_pin; 818 vfbd->base.pin = vmw_framebuffer_dmabuf_pin;
695 vfbd->base.unpin = vmw_framebuffer_dmabuf_unpin; 819 vfbd->base.unpin = vmw_framebuffer_dmabuf_unpin;
696 vfbd->buffer = dmabuf; 820 vfbd->buffer = dmabuf;
@@ -719,8 +843,25 @@ static struct drm_framebuffer *vmw_kms_fb_create(struct drm_device *dev,
719 struct vmw_framebuffer *vfb = NULL; 843 struct vmw_framebuffer *vfb = NULL;
720 struct vmw_surface *surface = NULL; 844 struct vmw_surface *surface = NULL;
721 struct vmw_dma_buffer *bo = NULL; 845 struct vmw_dma_buffer *bo = NULL;
846 u64 required_size;
722 int ret; 847 int ret;
723 848
849 /**
850 * This code should be conditioned on Screen Objects not being used.
851 * If screen objects are used, we can allocate a GMR to hold the
852 * requested framebuffer.
853 */
854
855 required_size = mode_cmd->pitch * mode_cmd->height;
856 if (unlikely(required_size > (u64) dev_priv->vram_size)) {
857 DRM_ERROR("VRAM size is too small for requested mode.\n");
858 return NULL;
859 }
860
861 /**
862 * End conditioned code.
863 */
864
724 ret = vmw_user_surface_lookup_handle(dev_priv, tfile, 865 ret = vmw_user_surface_lookup_handle(dev_priv, tfile,
725 mode_cmd->handle, &surface); 866 mode_cmd->handle, &surface);
726 if (ret) 867 if (ret)
@@ -729,8 +870,8 @@ static struct drm_framebuffer *vmw_kms_fb_create(struct drm_device *dev,
729 if (!surface->scanout) 870 if (!surface->scanout)
730 goto err_not_scanout; 871 goto err_not_scanout;
731 872
732 ret = vmw_kms_new_framebuffer_surface(dev_priv, surface, &vfb, 873 ret = vmw_kms_new_framebuffer_surface(dev_priv, file_priv, surface,
733 mode_cmd->width, mode_cmd->height); 874 &vfb, mode_cmd);
734 875
735 /* vmw_user_surface_lookup takes one ref so does new_fb */ 876 /* vmw_user_surface_lookup takes one ref so does new_fb */
736 vmw_surface_unreference(&surface); 877 vmw_surface_unreference(&surface);
@@ -751,7 +892,7 @@ try_dmabuf:
751 } 892 }
752 893
753 ret = vmw_kms_new_framebuffer_dmabuf(dev_priv, bo, &vfb, 894 ret = vmw_kms_new_framebuffer_dmabuf(dev_priv, bo, &vfb,
754 mode_cmd->width, mode_cmd->height); 895 mode_cmd);
755 896
756 /* vmw_user_dmabuf_lookup takes one ref so does new_fb */ 897 /* vmw_user_dmabuf_lookup takes one ref so does new_fb */
757 vmw_dmabuf_unreference(&bo); 898 vmw_dmabuf_unreference(&bo);
@@ -889,6 +1030,9 @@ int vmw_kms_save_vga(struct vmw_private *vmw_priv)
889 vmw_priv->num_displays = vmw_read(vmw_priv, 1030 vmw_priv->num_displays = vmw_read(vmw_priv,
890 SVGA_REG_NUM_GUEST_DISPLAYS); 1031 SVGA_REG_NUM_GUEST_DISPLAYS);
891 1032
1033 if (vmw_priv->num_displays == 0)
1034 vmw_priv->num_displays = 1;
1035
892 for (i = 0; i < vmw_priv->num_displays; ++i) { 1036 for (i = 0; i < vmw_priv->num_displays; ++i) {
893 save = &vmw_priv->vga_save[i]; 1037 save = &vmw_priv->vga_save[i];
894 vmw_write(vmw_priv, SVGA_REG_DISPLAY_ID, i); 1038 vmw_write(vmw_priv, SVGA_REG_DISPLAY_ID, i);
@@ -997,6 +1141,13 @@ out_unlock:
997 return ret; 1141 return ret;
998} 1142}
999 1143
1144bool vmw_kms_validate_mode_vram(struct vmw_private *dev_priv,
1145 uint32_t pitch,
1146 uint32_t height)
1147{
1148 return ((u64) pitch * (u64) height) < (u64) dev_priv->vram_size;
1149}
1150
1000u32 vmw_get_vblank_counter(struct drm_device *dev, int crtc) 1151u32 vmw_get_vblank_counter(struct drm_device *dev, int crtc)
1001{ 1152{
1002 return 0; 1153 return 0;
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c b/drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c
index 11cb39e3accb..b3a2cd5118d7 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c
@@ -345,7 +345,7 @@ static enum drm_connector_status
345 return connector_status_disconnected; 345 return connector_status_disconnected;
346} 346}
347 347
348static struct drm_display_mode vmw_ldu_connector_builtin[] = { 348static const struct drm_display_mode vmw_ldu_connector_builtin[] = {
349 /* 640x480@60Hz */ 349 /* 640x480@60Hz */
350 { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 25175, 640, 656, 350 { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 25175, 640, 656,
351 752, 800, 0, 480, 489, 492, 525, 0, 351 752, 800, 0, 480, 489, 492, 525, 0,
@@ -427,6 +427,7 @@ static int vmw_ldu_connector_fill_modes(struct drm_connector *connector,
427{ 427{
428 struct vmw_legacy_display_unit *ldu = vmw_connector_to_ldu(connector); 428 struct vmw_legacy_display_unit *ldu = vmw_connector_to_ldu(connector);
429 struct drm_device *dev = connector->dev; 429 struct drm_device *dev = connector->dev;
430 struct vmw_private *dev_priv = vmw_priv(dev);
430 struct drm_display_mode *mode = NULL; 431 struct drm_display_mode *mode = NULL;
431 struct drm_display_mode prefmode = { DRM_MODE("preferred", 432 struct drm_display_mode prefmode = { DRM_MODE("preferred",
432 DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED, 433 DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED,
@@ -443,22 +444,32 @@ static int vmw_ldu_connector_fill_modes(struct drm_connector *connector,
443 mode->hdisplay = ldu->pref_width; 444 mode->hdisplay = ldu->pref_width;
444 mode->vdisplay = ldu->pref_height; 445 mode->vdisplay = ldu->pref_height;
445 mode->vrefresh = drm_mode_vrefresh(mode); 446 mode->vrefresh = drm_mode_vrefresh(mode);
446 drm_mode_probed_add(connector, mode); 447 if (vmw_kms_validate_mode_vram(dev_priv, mode->hdisplay * 2,
448 mode->vdisplay)) {
449 drm_mode_probed_add(connector, mode);
447 450
448 if (ldu->pref_mode) { 451 if (ldu->pref_mode) {
449 list_del_init(&ldu->pref_mode->head); 452 list_del_init(&ldu->pref_mode->head);
450 drm_mode_destroy(dev, ldu->pref_mode); 453 drm_mode_destroy(dev, ldu->pref_mode);
451 } 454 }
452 455
453 ldu->pref_mode = mode; 456 ldu->pref_mode = mode;
457 }
454 } 458 }
455 459
456 for (i = 0; vmw_ldu_connector_builtin[i].type != 0; i++) { 460 for (i = 0; vmw_ldu_connector_builtin[i].type != 0; i++) {
457 if (vmw_ldu_connector_builtin[i].hdisplay > max_width || 461 const struct drm_display_mode *bmode;
458 vmw_ldu_connector_builtin[i].vdisplay > max_height) 462
463 bmode = &vmw_ldu_connector_builtin[i];
464 if (bmode->hdisplay > max_width ||
465 bmode->vdisplay > max_height)
466 continue;
467
468 if (!vmw_kms_validate_mode_vram(dev_priv, bmode->hdisplay * 2,
469 bmode->vdisplay))
459 continue; 470 continue;
460 471
461 mode = drm_mode_duplicate(dev, &vmw_ldu_connector_builtin[i]); 472 mode = drm_mode_duplicate(dev, bmode);
462 if (!mode) 473 if (!mode)
463 return 0; 474 return 0;
464 mode->vrefresh = drm_mode_vrefresh(mode); 475 mode->vrefresh = drm_mode_vrefresh(mode);
@@ -547,7 +558,7 @@ int vmw_kms_init_legacy_display_system(struct vmw_private *dev_priv)
547 return -EINVAL; 558 return -EINVAL;
548 } 559 }
549 560
550 dev_priv->ldu_priv = kmalloc(GFP_KERNEL, sizeof(*dev_priv->ldu_priv)); 561 dev_priv->ldu_priv = kmalloc(sizeof(*dev_priv->ldu_priv), GFP_KERNEL);
551 562
552 if (!dev_priv->ldu_priv) 563 if (!dev_priv->ldu_priv)
553 return -ENOMEM; 564 return -ENOMEM;
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_overlay.c b/drivers/gpu/drm/vmwgfx/vmwgfx_overlay.c
index df2036ed18d5..f1a52f9e7298 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_overlay.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_overlay.c
@@ -585,7 +585,7 @@ int vmw_overlay_init(struct vmw_private *dev_priv)
585 return -ENOSYS; 585 return -ENOSYS;
586 } 586 }
587 587
588 overlay = kmalloc(GFP_KERNEL, sizeof(*overlay)); 588 overlay = kmalloc(sizeof(*overlay), GFP_KERNEL);
589 if (!overlay) 589 if (!overlay)
590 return -ENOMEM; 590 return -ENOMEM;
591 591
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c
index c8c40e9979db..5408b1b7996f 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c
@@ -765,28 +765,11 @@ static size_t vmw_dmabuf_acc_size(struct ttm_bo_global *glob,
765 return bo_user_size + page_array_size; 765 return bo_user_size + page_array_size;
766} 766}
767 767
768void vmw_dmabuf_gmr_unbind(struct ttm_buffer_object *bo)
769{
770 struct vmw_dma_buffer *vmw_bo = vmw_dma_buffer(bo);
771 struct ttm_bo_global *glob = bo->glob;
772 struct vmw_private *dev_priv =
773 container_of(bo->bdev, struct vmw_private, bdev);
774
775 if (vmw_bo->gmr_bound) {
776 vmw_gmr_unbind(dev_priv, vmw_bo->gmr_id);
777 spin_lock(&glob->lru_lock);
778 ida_remove(&dev_priv->gmr_ida, vmw_bo->gmr_id);
779 spin_unlock(&glob->lru_lock);
780 vmw_bo->gmr_bound = false;
781 }
782}
783
784void vmw_dmabuf_bo_free(struct ttm_buffer_object *bo) 768void vmw_dmabuf_bo_free(struct ttm_buffer_object *bo)
785{ 769{
786 struct vmw_dma_buffer *vmw_bo = vmw_dma_buffer(bo); 770 struct vmw_dma_buffer *vmw_bo = vmw_dma_buffer(bo);
787 struct ttm_bo_global *glob = bo->glob; 771 struct ttm_bo_global *glob = bo->glob;
788 772
789 vmw_dmabuf_gmr_unbind(bo);
790 ttm_mem_global_free(glob->mem_glob, bo->acc_size); 773 ttm_mem_global_free(glob->mem_glob, bo->acc_size);
791 kfree(vmw_bo); 774 kfree(vmw_bo);
792} 775}
@@ -818,10 +801,7 @@ int vmw_dmabuf_init(struct vmw_private *dev_priv,
818 801
819 memset(vmw_bo, 0, sizeof(*vmw_bo)); 802 memset(vmw_bo, 0, sizeof(*vmw_bo));
820 803
821 INIT_LIST_HEAD(&vmw_bo->gmr_lru);
822 INIT_LIST_HEAD(&vmw_bo->validate_list); 804 INIT_LIST_HEAD(&vmw_bo->validate_list);
823 vmw_bo->gmr_id = 0;
824 vmw_bo->gmr_bound = false;
825 805
826 ret = ttm_bo_init(bdev, &vmw_bo->base, size, 806 ret = ttm_bo_init(bdev, &vmw_bo->base, size,
827 ttm_bo_type_device, placement, 807 ttm_bo_type_device, placement,
@@ -835,7 +815,6 @@ static void vmw_user_dmabuf_destroy(struct ttm_buffer_object *bo)
835 struct vmw_user_dma_buffer *vmw_user_bo = vmw_user_dma_buffer(bo); 815 struct vmw_user_dma_buffer *vmw_user_bo = vmw_user_dma_buffer(bo);
836 struct ttm_bo_global *glob = bo->glob; 816 struct ttm_bo_global *glob = bo->glob;
837 817
838 vmw_dmabuf_gmr_unbind(bo);
839 ttm_mem_global_free(glob->mem_glob, bo->acc_size); 818 ttm_mem_global_free(glob->mem_glob, bo->acc_size);
840 kfree(vmw_user_bo); 819 kfree(vmw_user_bo);
841} 820}
@@ -883,7 +862,7 @@ int vmw_dmabuf_alloc_ioctl(struct drm_device *dev, void *data,
883 &vmw_vram_sys_placement, true, 862 &vmw_vram_sys_placement, true,
884 &vmw_user_dmabuf_destroy); 863 &vmw_user_dmabuf_destroy);
885 if (unlikely(ret != 0)) 864 if (unlikely(ret != 0))
886 return ret; 865 goto out_no_dmabuf;
887 866
888 tmp = ttm_bo_reference(&vmw_user_bo->dma.base); 867 tmp = ttm_bo_reference(&vmw_user_bo->dma.base);
889 ret = ttm_base_object_init(vmw_fpriv(file_priv)->tfile, 868 ret = ttm_base_object_init(vmw_fpriv(file_priv)->tfile,
@@ -891,19 +870,21 @@ int vmw_dmabuf_alloc_ioctl(struct drm_device *dev, void *data,
891 false, 870 false,
892 ttm_buffer_type, 871 ttm_buffer_type,
893 &vmw_user_dmabuf_release, NULL); 872 &vmw_user_dmabuf_release, NULL);
894 if (unlikely(ret != 0)) { 873 if (unlikely(ret != 0))
895 ttm_bo_unref(&tmp); 874 goto out_no_base_object;
896 } else { 875 else {
897 rep->handle = vmw_user_bo->base.hash.key; 876 rep->handle = vmw_user_bo->base.hash.key;
898 rep->map_handle = vmw_user_bo->dma.base.addr_space_offset; 877 rep->map_handle = vmw_user_bo->dma.base.addr_space_offset;
899 rep->cur_gmr_id = vmw_user_bo->base.hash.key; 878 rep->cur_gmr_id = vmw_user_bo->base.hash.key;
900 rep->cur_gmr_offset = 0; 879 rep->cur_gmr_offset = 0;
901 } 880 }
902 ttm_bo_unref(&tmp);
903 881
882out_no_base_object:
883 ttm_bo_unref(&tmp);
884out_no_dmabuf:
904 ttm_read_unlock(&vmaster->lock); 885 ttm_read_unlock(&vmaster->lock);
905 886
906 return 0; 887 return ret;
907} 888}
908 889
909int vmw_dmabuf_unref_ioctl(struct drm_device *dev, void *data, 890int vmw_dmabuf_unref_ioctl(struct drm_device *dev, void *data,
@@ -938,25 +919,6 @@ void vmw_dmabuf_validate_clear(struct ttm_buffer_object *bo)
938 vmw_bo->on_validate_list = false; 919 vmw_bo->on_validate_list = false;
939} 920}
940 921
941uint32_t vmw_dmabuf_gmr(struct ttm_buffer_object *bo)
942{
943 struct vmw_dma_buffer *vmw_bo;
944
945 if (bo->mem.mem_type == TTM_PL_VRAM)
946 return SVGA_GMR_FRAMEBUFFER;
947
948 vmw_bo = vmw_dma_buffer(bo);
949
950 return (vmw_bo->gmr_bound) ? vmw_bo->gmr_id : SVGA_GMR_NULL;
951}
952
953void vmw_dmabuf_set_gmr(struct ttm_buffer_object *bo, uint32_t id)
954{
955 struct vmw_dma_buffer *vmw_bo = vmw_dma_buffer(bo);
956 vmw_bo->gmr_bound = true;
957 vmw_bo->gmr_id = id;
958}
959
960int vmw_user_dmabuf_lookup(struct ttm_object_file *tfile, 922int vmw_user_dmabuf_lookup(struct ttm_object_file *tfile,
961 uint32_t handle, struct vmw_dma_buffer **out) 923 uint32_t handle, struct vmw_dma_buffer **out)
962{ 924{
@@ -985,41 +947,6 @@ int vmw_user_dmabuf_lookup(struct ttm_object_file *tfile,
985 return 0; 947 return 0;
986} 948}
987 949
988/**
989 * TODO: Implement a gmr id eviction mechanism. Currently we just fail
990 * when we're out of ids, causing GMR space to be allocated
991 * out of VRAM.
992 */
993
994int vmw_gmr_id_alloc(struct vmw_private *dev_priv, uint32_t *p_id)
995{
996 struct ttm_bo_global *glob = dev_priv->bdev.glob;
997 int id;
998 int ret;
999
1000 do {
1001 if (unlikely(ida_pre_get(&dev_priv->gmr_ida, GFP_KERNEL) == 0))
1002 return -ENOMEM;
1003
1004 spin_lock(&glob->lru_lock);
1005 ret = ida_get_new(&dev_priv->gmr_ida, &id);
1006 spin_unlock(&glob->lru_lock);
1007 } while (ret == -EAGAIN);
1008
1009 if (unlikely(ret != 0))
1010 return ret;
1011
1012 if (unlikely(id >= dev_priv->max_gmr_ids)) {
1013 spin_lock(&glob->lru_lock);
1014 ida_remove(&dev_priv->gmr_ida, id);
1015 spin_unlock(&glob->lru_lock);
1016 return -EBUSY;
1017 }
1018
1019 *p_id = (uint32_t) id;
1020 return 0;
1021}
1022
1023/* 950/*
1024 * Stream management 951 * Stream management
1025 */ 952 */
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c
index 83123287c60c..1e8eedd901e0 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c
@@ -39,7 +39,7 @@ int vmw_mmap(struct file *filp, struct vm_area_struct *vma)
39 return drm_mmap(filp, vma); 39 return drm_mmap(filp, vma);
40 } 40 }
41 41
42 file_priv = (struct drm_file *)filp->private_data; 42 file_priv = filp->private_data;
43 dev_priv = vmw_priv(file_priv->minor->dev); 43 dev_priv = vmw_priv(file_priv->minor->dev);
44 return ttm_bo_mmap(filp, vma, &dev_priv->bdev); 44 return ttm_bo_mmap(filp, vma, &dev_priv->bdev);
45} 45}
diff --git a/drivers/gpu/stub/Kconfig b/drivers/gpu/stub/Kconfig
new file mode 100644
index 000000000000..419917955bf6
--- /dev/null
+++ b/drivers/gpu/stub/Kconfig
@@ -0,0 +1,18 @@
1config STUB_POULSBO
2 tristate "Intel GMA500 Stub Driver"
3 depends on PCI
4 depends on NET # for THERMAL
5 # Poulsbo stub depends on ACPI_VIDEO when ACPI is enabled
6 # but for select to work, need to select ACPI_VIDEO's dependencies, ick
7 select BACKLIGHT_CLASS_DEVICE if ACPI
8 select VIDEO_OUTPUT_CONTROL if ACPI
9 select INPUT if ACPI
10 select ACPI_VIDEO if ACPI
11 select THERMAL if ACPI
12 help
13 Choose this option if you have a system that has Intel GMA500
14 (Poulsbo) integrated graphics. If M is selected, the module will
15 be called Poulsbo. This driver is a stub driver for Poulsbo that
16 will call poulsbo.ko to enable the acpi backlight control sysfs
17 entry file because there have no poulsbo native driver can support
18 intel opregion.
diff --git a/drivers/gpu/stub/Makefile b/drivers/gpu/stub/Makefile
new file mode 100644
index 000000000000..cd940cc9d36d
--- /dev/null
+++ b/drivers/gpu/stub/Makefile
@@ -0,0 +1 @@
obj-$(CONFIG_STUB_POULSBO) += poulsbo.o
diff --git a/drivers/gpu/stub/poulsbo.c b/drivers/gpu/stub/poulsbo.c
new file mode 100644
index 000000000000..7edfd27b8dee
--- /dev/null
+++ b/drivers/gpu/stub/poulsbo.c
@@ -0,0 +1,64 @@
1/*
2 * Intel Poulsbo Stub driver
3 *
4 * Copyright (C) 2010 Novell <jlee@novell.com>
5 *
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License version 2 as published by
8 * the Free Software Foundation.
9 *
10 */
11
12#include <linux/module.h>
13#include <linux/pci.h>
14#include <linux/acpi.h>
15#include <acpi/video.h>
16
17#define DRIVER_NAME "poulsbo"
18
19enum {
20 CHIP_PSB_8108 = 0,
21 CHIP_PSB_8109 = 1,
22};
23
24static DEFINE_PCI_DEVICE_TABLE(pciidlist) = {
25 {0x8086, 0x8108, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PSB_8108}, \
26 {0x8086, 0x8109, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PSB_8109}, \
27 {0, 0, 0}
28};
29
30static int poulsbo_probe(struct pci_dev *pdev, const struct pci_device_id *id)
31{
32 return acpi_video_register();
33}
34
35static void poulsbo_remove(struct pci_dev *pdev)
36{
37 acpi_video_unregister();
38}
39
40static struct pci_driver poulsbo_driver = {
41 .name = DRIVER_NAME,
42 .id_table = pciidlist,
43 .probe = poulsbo_probe,
44 .remove = poulsbo_remove,
45};
46
47static int __init poulsbo_init(void)
48{
49 return pci_register_driver(&poulsbo_driver);
50}
51
52static void __exit poulsbo_exit(void)
53{
54 pci_unregister_driver(&poulsbo_driver);
55}
56
57module_init(poulsbo_init);
58module_exit(poulsbo_exit);
59
60MODULE_AUTHOR("Lee, Chun-Yi <jlee@novell.com>");
61MODULE_DESCRIPTION("Poulsbo Stub Driver");
62MODULE_LICENSE("GPL");
63
64MODULE_DEVICE_TABLE(pci, pciidlist);
diff --git a/drivers/gpu/vga/Kconfig b/drivers/gpu/vga/Kconfig
index 8d0e31a22027..96c83a9a76bb 100644
--- a/drivers/gpu/vga/Kconfig
+++ b/drivers/gpu/vga/Kconfig
@@ -1,5 +1,5 @@
1config VGA_ARB 1config VGA_ARB
2 bool "VGA Arbitration" if EMBEDDED 2 bool "VGA Arbitration" if EXPERT
3 default y 3 default y
4 depends on PCI 4 depends on PCI
5 help 5 help
diff --git a/drivers/gpu/vga/vga_switcheroo.c b/drivers/gpu/vga/vga_switcheroo.c
index c8768f38511e..58434e804d91 100644
--- a/drivers/gpu/vga/vga_switcheroo.c
+++ b/drivers/gpu/vga/vga_switcheroo.c
@@ -33,6 +33,7 @@ struct vga_switcheroo_client {
33 struct fb_info *fb_info; 33 struct fb_info *fb_info;
34 int pwr_state; 34 int pwr_state;
35 void (*set_gpu_state)(struct pci_dev *pdev, enum vga_switcheroo_state); 35 void (*set_gpu_state)(struct pci_dev *pdev, enum vga_switcheroo_state);
36 void (*reprobe)(struct pci_dev *pdev);
36 bool (*can_switch)(struct pci_dev *pdev); 37 bool (*can_switch)(struct pci_dev *pdev);
37 int id; 38 int id;
38 bool active; 39 bool active;
@@ -103,6 +104,7 @@ static void vga_switcheroo_enable(void)
103 104
104int vga_switcheroo_register_client(struct pci_dev *pdev, 105int vga_switcheroo_register_client(struct pci_dev *pdev,
105 void (*set_gpu_state)(struct pci_dev *pdev, enum vga_switcheroo_state), 106 void (*set_gpu_state)(struct pci_dev *pdev, enum vga_switcheroo_state),
107 void (*reprobe)(struct pci_dev *pdev),
106 bool (*can_switch)(struct pci_dev *pdev)) 108 bool (*can_switch)(struct pci_dev *pdev))
107{ 109{
108 int index; 110 int index;
@@ -117,6 +119,7 @@ int vga_switcheroo_register_client(struct pci_dev *pdev,
117 vgasr_priv.clients[index].pwr_state = VGA_SWITCHEROO_ON; 119 vgasr_priv.clients[index].pwr_state = VGA_SWITCHEROO_ON;
118 vgasr_priv.clients[index].pdev = pdev; 120 vgasr_priv.clients[index].pdev = pdev;
119 vgasr_priv.clients[index].set_gpu_state = set_gpu_state; 121 vgasr_priv.clients[index].set_gpu_state = set_gpu_state;
122 vgasr_priv.clients[index].reprobe = reprobe;
120 vgasr_priv.clients[index].can_switch = can_switch; 123 vgasr_priv.clients[index].can_switch = can_switch;
121 vgasr_priv.clients[index].id = -1; 124 vgasr_priv.clients[index].id = -1;
122 if (pdev->resource[PCI_ROM_RESOURCE].flags & IORESOURCE_ROM_SHADOW) 125 if (pdev->resource[PCI_ROM_RESOURCE].flags & IORESOURCE_ROM_SHADOW)
@@ -174,7 +177,8 @@ static int vga_switcheroo_show(struct seq_file *m, void *v)
174 int i; 177 int i;
175 mutex_lock(&vgasr_mutex); 178 mutex_lock(&vgasr_mutex);
176 for (i = 0; i < VGA_SWITCHEROO_MAX_CLIENTS; i++) { 179 for (i = 0; i < VGA_SWITCHEROO_MAX_CLIENTS; i++) {
177 seq_printf(m, "%d:%c:%s:%s\n", i, 180 seq_printf(m, "%d:%s:%c:%s:%s\n", i,
181 vgasr_priv.clients[i].id == VGA_SWITCHEROO_DIS ? "DIS" : "IGD",
178 vgasr_priv.clients[i].active ? '+' : ' ', 182 vgasr_priv.clients[i].active ? '+' : ' ',
179 vgasr_priv.clients[i].pwr_state ? "Pwr" : "Off", 183 vgasr_priv.clients[i].pwr_state ? "Pwr" : "Off",
180 pci_name(vgasr_priv.clients[i].pdev)); 184 pci_name(vgasr_priv.clients[i].pdev));
@@ -190,9 +194,8 @@ static int vga_switcheroo_debugfs_open(struct inode *inode, struct file *file)
190 194
191static int vga_switchon(struct vga_switcheroo_client *client) 195static int vga_switchon(struct vga_switcheroo_client *client)
192{ 196{
193 int ret; 197 if (vgasr_priv.handler->power_state)
194 198 vgasr_priv.handler->power_state(client->id, VGA_SWITCHEROO_ON);
195 ret = vgasr_priv.handler->power_state(client->id, VGA_SWITCHEROO_ON);
196 /* call the driver callback to turn on device */ 199 /* call the driver callback to turn on device */
197 client->set_gpu_state(client->pdev, VGA_SWITCHEROO_ON); 200 client->set_gpu_state(client->pdev, VGA_SWITCHEROO_ON);
198 client->pwr_state = VGA_SWITCHEROO_ON; 201 client->pwr_state = VGA_SWITCHEROO_ON;
@@ -203,20 +206,18 @@ static int vga_switchoff(struct vga_switcheroo_client *client)
203{ 206{
204 /* call the driver callback to turn off device */ 207 /* call the driver callback to turn off device */
205 client->set_gpu_state(client->pdev, VGA_SWITCHEROO_OFF); 208 client->set_gpu_state(client->pdev, VGA_SWITCHEROO_OFF);
206 vgasr_priv.handler->power_state(client->id, VGA_SWITCHEROO_OFF); 209 if (vgasr_priv.handler->power_state)
210 vgasr_priv.handler->power_state(client->id, VGA_SWITCHEROO_OFF);
207 client->pwr_state = VGA_SWITCHEROO_OFF; 211 client->pwr_state = VGA_SWITCHEROO_OFF;
208 return 0; 212 return 0;
209} 213}
210 214
211static int vga_switchto(struct vga_switcheroo_client *new_client) 215/* stage one happens before delay */
216static int vga_switchto_stage1(struct vga_switcheroo_client *new_client)
212{ 217{
213 int ret;
214 int i; 218 int i;
215 struct vga_switcheroo_client *active = NULL; 219 struct vga_switcheroo_client *active = NULL;
216 220
217 if (new_client->active == true)
218 return 0;
219
220 for (i = 0; i < VGA_SWITCHEROO_MAX_CLIENTS; i++) { 221 for (i = 0; i < VGA_SWITCHEROO_MAX_CLIENTS; i++) {
221 if (vgasr_priv.clients[i].active == true) { 222 if (vgasr_priv.clients[i].active == true) {
222 active = &vgasr_priv.clients[i]; 223 active = &vgasr_priv.clients[i];
@@ -226,19 +227,32 @@ static int vga_switchto(struct vga_switcheroo_client *new_client)
226 if (!active) 227 if (!active)
227 return 0; 228 return 0;
228 229
229 /* power up the first device */
230 ret = pci_enable_device(new_client->pdev);
231 if (ret)
232 return ret;
233
234 if (new_client->pwr_state == VGA_SWITCHEROO_OFF) 230 if (new_client->pwr_state == VGA_SWITCHEROO_OFF)
235 vga_switchon(new_client); 231 vga_switchon(new_client);
236 232
237 /* swap shadow resource to denote boot VGA device has changed so X starts on new device */ 233 /* swap shadow resource to denote boot VGA device has changed so X starts on new device */
238 active->active = false;
239
240 active->pdev->resource[PCI_ROM_RESOURCE].flags &= ~IORESOURCE_ROM_SHADOW; 234 active->pdev->resource[PCI_ROM_RESOURCE].flags &= ~IORESOURCE_ROM_SHADOW;
241 new_client->pdev->resource[PCI_ROM_RESOURCE].flags |= IORESOURCE_ROM_SHADOW; 235 new_client->pdev->resource[PCI_ROM_RESOURCE].flags |= IORESOURCE_ROM_SHADOW;
236 return 0;
237}
238
239/* post delay */
240static int vga_switchto_stage2(struct vga_switcheroo_client *new_client)
241{
242 int ret;
243 int i;
244 struct vga_switcheroo_client *active = NULL;
245
246 for (i = 0; i < VGA_SWITCHEROO_MAX_CLIENTS; i++) {
247 if (vgasr_priv.clients[i].active == true) {
248 active = &vgasr_priv.clients[i];
249 break;
250 }
251 }
252 if (!active)
253 return 0;
254
255 active->active = false;
242 256
243 if (new_client->fb_info) { 257 if (new_client->fb_info) {
244 struct fb_event event; 258 struct fb_event event;
@@ -250,6 +264,9 @@ static int vga_switchto(struct vga_switcheroo_client *new_client)
250 if (ret) 264 if (ret)
251 return ret; 265 return ret;
252 266
267 if (new_client->reprobe)
268 new_client->reprobe(new_client->pdev);
269
253 if (active->pwr_state == VGA_SWITCHEROO_ON) 270 if (active->pwr_state == VGA_SWITCHEROO_ON)
254 vga_switchoff(active); 271 vga_switchoff(active);
255 272
@@ -265,6 +282,7 @@ vga_switcheroo_debugfs_write(struct file *filp, const char __user *ubuf,
265 const char *pdev_name; 282 const char *pdev_name;
266 int i, ret; 283 int i, ret;
267 bool delay = false, can_switch; 284 bool delay = false, can_switch;
285 bool just_mux = false;
268 int client_id = -1; 286 int client_id = -1;
269 struct vga_switcheroo_client *client = NULL; 287 struct vga_switcheroo_client *client = NULL;
270 288
@@ -319,6 +337,15 @@ vga_switcheroo_debugfs_write(struct file *filp, const char __user *ubuf,
319 if (strncmp(usercmd, "DIS", 3) == 0) 337 if (strncmp(usercmd, "DIS", 3) == 0)
320 client_id = VGA_SWITCHEROO_DIS; 338 client_id = VGA_SWITCHEROO_DIS;
321 339
340 if (strncmp(usercmd, "MIGD", 4) == 0) {
341 just_mux = true;
342 client_id = VGA_SWITCHEROO_IGD;
343 }
344 if (strncmp(usercmd, "MDIS", 4) == 0) {
345 just_mux = true;
346 client_id = VGA_SWITCHEROO_DIS;
347 }
348
322 if (client_id == -1) 349 if (client_id == -1)
323 goto out; 350 goto out;
324 351
@@ -330,6 +357,15 @@ vga_switcheroo_debugfs_write(struct file *filp, const char __user *ubuf,
330 } 357 }
331 358
332 vgasr_priv.delayed_switch_active = false; 359 vgasr_priv.delayed_switch_active = false;
360
361 if (just_mux) {
362 ret = vgasr_priv.handler->switchto(client_id);
363 goto out;
364 }
365
366 if (client->active == true)
367 goto out;
368
333 /* okay we want a switch - test if devices are willing to switch */ 369 /* okay we want a switch - test if devices are willing to switch */
334 can_switch = true; 370 can_switch = true;
335 for (i = 0; i < VGA_SWITCHEROO_MAX_CLIENTS; i++) { 371 for (i = 0; i < VGA_SWITCHEROO_MAX_CLIENTS; i++) {
@@ -345,18 +381,22 @@ vga_switcheroo_debugfs_write(struct file *filp, const char __user *ubuf,
345 381
346 if (can_switch == true) { 382 if (can_switch == true) {
347 pdev_name = pci_name(client->pdev); 383 pdev_name = pci_name(client->pdev);
348 ret = vga_switchto(client); 384 ret = vga_switchto_stage1(client);
385 if (ret)
386 printk(KERN_ERR "vga_switcheroo: switching failed stage 1 %d\n", ret);
387
388 ret = vga_switchto_stage2(client);
349 if (ret) 389 if (ret)
350 printk(KERN_ERR "vga_switcheroo: switching failed %d\n", ret); 390 printk(KERN_ERR "vga_switcheroo: switching failed stage 2 %d\n", ret);
391
351 } else { 392 } else {
352 printk(KERN_INFO "vga_switcheroo: setting delayed switch to client %d\n", client->id); 393 printk(KERN_INFO "vga_switcheroo: setting delayed switch to client %d\n", client->id);
353 vgasr_priv.delayed_switch_active = true; 394 vgasr_priv.delayed_switch_active = true;
354 vgasr_priv.delayed_client_id = client_id; 395 vgasr_priv.delayed_client_id = client_id;
355 396
356 /* we should at least power up the card to 397 ret = vga_switchto_stage1(client);
357 make the switch faster */ 398 if (ret)
358 if (client->pwr_state == VGA_SWITCHEROO_OFF) 399 printk(KERN_ERR "vga_switcheroo: delayed switching stage 1 failed %d\n", ret);
359 vga_switchon(client);
360 } 400 }
361 401
362out: 402out:
@@ -438,9 +478,9 @@ int vga_switcheroo_process_delayed_switch(void)
438 goto err; 478 goto err;
439 479
440 pdev_name = pci_name(client->pdev); 480 pdev_name = pci_name(client->pdev);
441 ret = vga_switchto(client); 481 ret = vga_switchto_stage2(client);
442 if (ret) 482 if (ret)
443 printk(KERN_ERR "vga_switcheroo: delayed switching failed %d\n", ret); 483 printk(KERN_ERR "vga_switcheroo: delayed switching failed stage 2 %d\n", ret);
444 484
445 vgasr_priv.delayed_switch_active = false; 485 vgasr_priv.delayed_switch_active = false;
446 err = 0; 486 err = 0;
diff --git a/drivers/gpu/vga/vgaarb.c b/drivers/gpu/vga/vgaarb.c
index f366f968155a..8a1021f2e319 100644
--- a/drivers/gpu/vga/vgaarb.c
+++ b/drivers/gpu/vga/vgaarb.c
@@ -61,7 +61,7 @@ struct vga_device {
61 unsigned int mem_lock_cnt; /* legacy MEM lock count */ 61 unsigned int mem_lock_cnt; /* legacy MEM lock count */
62 unsigned int io_norm_cnt; /* normal IO count */ 62 unsigned int io_norm_cnt; /* normal IO count */
63 unsigned int mem_norm_cnt; /* normal MEM count */ 63 unsigned int mem_norm_cnt; /* normal MEM count */
64 64 bool bridge_has_one_vga;
65 /* allow IRQ enable/disable hook */ 65 /* allow IRQ enable/disable hook */
66 void *cookie; 66 void *cookie;
67 void (*irq_set_state)(void *cookie, bool enable); 67 void (*irq_set_state)(void *cookie, bool enable);
@@ -151,7 +151,7 @@ static inline void vga_irq_set_state(struct vga_device *vgadev, bool state)
151static void vga_check_first_use(void) 151static void vga_check_first_use(void)
152{ 152{
153 /* we should inform all GPUs in the system that 153 /* we should inform all GPUs in the system that
154 * VGA arb has occured and to try and disable resources 154 * VGA arb has occurred and to try and disable resources
155 * if they can */ 155 * if they can */
156 if (!vga_arbiter_used) { 156 if (!vga_arbiter_used) {
157 vga_arbiter_used = true; 157 vga_arbiter_used = true;
@@ -165,6 +165,8 @@ static struct vga_device *__vga_tryget(struct vga_device *vgadev,
165 unsigned int wants, legacy_wants, match; 165 unsigned int wants, legacy_wants, match;
166 struct vga_device *conflict; 166 struct vga_device *conflict;
167 unsigned int pci_bits; 167 unsigned int pci_bits;
168 u32 flags = 0;
169
168 /* Account for "normal" resources to lock. If we decode the legacy, 170 /* Account for "normal" resources to lock. If we decode the legacy,
169 * counterpart, we need to request it as well 171 * counterpart, we need to request it as well
170 */ 172 */
@@ -237,16 +239,23 @@ static struct vga_device *__vga_tryget(struct vga_device *vgadev,
237 /* looks like he doesn't have a lock, we can steal 239 /* looks like he doesn't have a lock, we can steal
238 * them from him 240 * them from him
239 */ 241 */
240 vga_irq_set_state(conflict, false);
241 242
243 flags = 0;
242 pci_bits = 0; 244 pci_bits = 0;
243 if (lwants & (VGA_RSRC_LEGACY_MEM|VGA_RSRC_NORMAL_MEM))
244 pci_bits |= PCI_COMMAND_MEMORY;
245 if (lwants & (VGA_RSRC_LEGACY_IO|VGA_RSRC_NORMAL_IO))
246 pci_bits |= PCI_COMMAND_IO;
247 245
248 pci_set_vga_state(conflict->pdev, false, pci_bits, 246 if (!conflict->bridge_has_one_vga) {
249 change_bridge); 247 vga_irq_set_state(conflict, false);
248 flags |= PCI_VGA_STATE_CHANGE_DECODES;
249 if (lwants & (VGA_RSRC_LEGACY_MEM|VGA_RSRC_NORMAL_MEM))
250 pci_bits |= PCI_COMMAND_MEMORY;
251 if (lwants & (VGA_RSRC_LEGACY_IO|VGA_RSRC_NORMAL_IO))
252 pci_bits |= PCI_COMMAND_IO;
253 }
254
255 if (change_bridge)
256 flags |= PCI_VGA_STATE_CHANGE_BRIDGE;
257
258 pci_set_vga_state(conflict->pdev, false, pci_bits, flags);
250 conflict->owns &= ~lwants; 259 conflict->owns &= ~lwants;
251 /* If he also owned non-legacy, that is no longer the case */ 260 /* If he also owned non-legacy, that is no longer the case */
252 if (lwants & VGA_RSRC_LEGACY_MEM) 261 if (lwants & VGA_RSRC_LEGACY_MEM)
@@ -261,14 +270,24 @@ enable_them:
261 * also have in "decodes". We can lock resources we don't decode but 270 * also have in "decodes". We can lock resources we don't decode but
262 * not own them. 271 * not own them.
263 */ 272 */
273 flags = 0;
264 pci_bits = 0; 274 pci_bits = 0;
265 if (wants & (VGA_RSRC_LEGACY_MEM|VGA_RSRC_NORMAL_MEM))
266 pci_bits |= PCI_COMMAND_MEMORY;
267 if (wants & (VGA_RSRC_LEGACY_IO|VGA_RSRC_NORMAL_IO))
268 pci_bits |= PCI_COMMAND_IO;
269 pci_set_vga_state(vgadev->pdev, true, pci_bits, !!(wants & VGA_RSRC_LEGACY_MASK));
270 275
271 vga_irq_set_state(vgadev, true); 276 if (!vgadev->bridge_has_one_vga) {
277 flags |= PCI_VGA_STATE_CHANGE_DECODES;
278 if (wants & (VGA_RSRC_LEGACY_MEM|VGA_RSRC_NORMAL_MEM))
279 pci_bits |= PCI_COMMAND_MEMORY;
280 if (wants & (VGA_RSRC_LEGACY_IO|VGA_RSRC_NORMAL_IO))
281 pci_bits |= PCI_COMMAND_IO;
282 }
283 if (!!(wants & VGA_RSRC_LEGACY_MASK))
284 flags |= PCI_VGA_STATE_CHANGE_BRIDGE;
285
286 pci_set_vga_state(vgadev->pdev, true, pci_bits, flags);
287
288 if (!vgadev->bridge_has_one_vga) {
289 vga_irq_set_state(vgadev, true);
290 }
272 vgadev->owns |= (wants & vgadev->decodes); 291 vgadev->owns |= (wants & vgadev->decodes);
273lock_them: 292lock_them:
274 vgadev->locks |= (rsrc & VGA_RSRC_LEGACY_MASK); 293 vgadev->locks |= (rsrc & VGA_RSRC_LEGACY_MASK);
@@ -421,6 +440,62 @@ bail:
421} 440}
422EXPORT_SYMBOL(vga_put); 441EXPORT_SYMBOL(vga_put);
423 442
443/* Rules for using a bridge to control a VGA descendant decoding:
444 if a bridge has only one VGA descendant then it can be used
445 to control the VGA routing for that device.
446 It should always use the bridge closest to the device to control it.
447 If a bridge has a direct VGA descendant, but also have a sub-bridge
448 VGA descendant then we cannot use that bridge to control the direct VGA descendant.
449 So for every device we register, we need to iterate all its parent bridges
450 so we can invalidate any devices using them properly.
451*/
452static void vga_arbiter_check_bridge_sharing(struct vga_device *vgadev)
453{
454 struct vga_device *same_bridge_vgadev;
455 struct pci_bus *new_bus, *bus;
456 struct pci_dev *new_bridge, *bridge;
457
458 vgadev->bridge_has_one_vga = true;
459
460 if (list_empty(&vga_list))
461 return;
462
463 /* okay iterate the new devices bridge hierarachy */
464 new_bus = vgadev->pdev->bus;
465 while (new_bus) {
466 new_bridge = new_bus->self;
467
468 if (new_bridge) {
469 /* go through list of devices already registered */
470 list_for_each_entry(same_bridge_vgadev, &vga_list, list) {
471 bus = same_bridge_vgadev->pdev->bus;
472 bridge = bus->self;
473
474 /* see if the share a bridge with this device */
475 if (new_bridge == bridge) {
476 /* if their direct parent bridge is the same
477 as any bridge of this device then it can't be used
478 for that device */
479 same_bridge_vgadev->bridge_has_one_vga = false;
480 }
481
482 /* now iterate the previous devices bridge hierarchy */
483 /* if the new devices parent bridge is in the other devices
484 hierarchy then we can't use it to control this device */
485 while (bus) {
486 bridge = bus->self;
487 if (bridge) {
488 if (bridge == vgadev->pdev->bus->self)
489 vgadev->bridge_has_one_vga = false;
490 }
491 bus = bus->parent;
492 }
493 }
494 }
495 new_bus = new_bus->parent;
496 }
497}
498
424/* 499/*
425 * Currently, we assume that the "initial" setup of the system is 500 * Currently, we assume that the "initial" setup of the system is
426 * not sane, that is we come up with conflicting devices and let 501 * not sane, that is we come up with conflicting devices and let
@@ -500,6 +575,8 @@ static bool vga_arbiter_add_pci_device(struct pci_dev *pdev)
500 vga_default = pci_dev_get(pdev); 575 vga_default = pci_dev_get(pdev);
501#endif 576#endif
502 577
578 vga_arbiter_check_bridge_sharing(vgadev);
579
503 /* Add to the list */ 580 /* Add to the list */
504 list_add(&vgadev->list, &vga_list); 581 list_add(&vgadev->list, &vga_list);
505 vga_count++; 582 vga_count++;
@@ -636,7 +713,7 @@ int vga_client_register(struct pci_dev *pdev, void *cookie,
636 void (*irq_set_state)(void *cookie, bool state), 713 void (*irq_set_state)(void *cookie, bool state),
637 unsigned int (*set_vga_decode)(void *cookie, bool decode)) 714 unsigned int (*set_vga_decode)(void *cookie, bool decode))
638{ 715{
639 int ret = -1; 716 int ret = -ENODEV;
640 struct vga_device *vgadev; 717 struct vga_device *vgadev;
641 unsigned long flags; 718 unsigned long flags;
642 719
@@ -774,7 +851,7 @@ static ssize_t vga_arb_read(struct file *file, char __user * buf,
774 */ 851 */
775 spin_lock_irqsave(&vga_lock, flags); 852 spin_lock_irqsave(&vga_lock, flags);
776 853
777 /* If we are targetting the default, use it */ 854 /* If we are targeting the default, use it */
778 pdev = priv->target; 855 pdev = priv->target;
779 if (pdev == NULL || pdev == PCI_INVALID_CARD) { 856 if (pdev == NULL || pdev == PCI_INVALID_CARD) {
780 spin_unlock_irqrestore(&vga_lock, flags); 857 spin_unlock_irqrestore(&vga_lock, flags);
@@ -1211,6 +1288,7 @@ static const struct file_operations vga_arb_device_fops = {
1211 .poll = vga_arb_fpoll, 1288 .poll = vga_arb_fpoll,
1212 .open = vga_arb_open, 1289 .open = vga_arb_open,
1213 .release = vga_arb_release, 1290 .release = vga_arb_release,
1291 .llseek = noop_llseek,
1214}; 1292};
1215 1293
1216static struct miscdevice vga_arb_device = { 1294static struct miscdevice vga_arb_device = {
@@ -1221,6 +1299,7 @@ static int __init vga_arb_device_init(void)
1221{ 1299{
1222 int rc; 1300 int rc;
1223 struct pci_dev *pdev; 1301 struct pci_dev *pdev;
1302 struct vga_device *vgadev;
1224 1303
1225 rc = misc_register(&vga_arb_device); 1304 rc = misc_register(&vga_arb_device);
1226 if (rc < 0) 1305 if (rc < 0)
@@ -1237,6 +1316,13 @@ static int __init vga_arb_device_init(void)
1237 vga_arbiter_add_pci_device(pdev); 1316 vga_arbiter_add_pci_device(pdev);
1238 1317
1239 pr_info("vgaarb: loaded\n"); 1318 pr_info("vgaarb: loaded\n");
1319
1320 list_for_each_entry(vgadev, &vga_list, list) {
1321 if (vgadev->bridge_has_one_vga)
1322 pr_info("vgaarb: bridge control possible %s\n", pci_name(vgadev->pdev));
1323 else
1324 pr_info("vgaarb: no bridge control possible %s\n", pci_name(vgadev->pdev));
1325 }
1240 return rc; 1326 return rc;
1241} 1327}
1242subsys_initcall(vga_arb_device_init); 1328subsys_initcall(vga_arb_device_init);