linux/drivers/gpu/drm/radeon
Alex Deucher 57b35e29cf drm/radeon: work around KMS modeset limitations in PLL allocation (v2)
Since the current KMS API sets the mode independantly on
each crtc, we may end up with resource conflicts.  The PLL
allocation is one of those cases.  In the following example
we have 3 crtcs in use driving 2 DVI connectors and 1 DP
connector.  On the initial kernel modeset for fbdev, the
display topology ends up as follows:

crtc0 -> DP-0
crtc1 -> DVI-0
crtc2 -> DVI-1

Because this is the first modeset, all of the PLLs are
available as none have been assigned.  So we end up with
the following:

crtc0 uses DCPLL
crtc1 uses PPLL2
crtc2 uses PPLL1

When X starts, it assigns a different topology:

crtc0 -> DVI-0
crtc1 -> DP-0
crtc2 -> DVI-1

However, since the KMS API is per crtc, we set the mode on each
crtc independantly.  When it comes time to set the mode on crtc0,
the topology for crtc1 and crtc2 are still intact.  crtc1 and
crtc2 are already assigned PPLL2 and PPLL1 so when it comes time
to set the mode on crtc0, crtc1 and crtc2 have not been torn down
yet, so there appears to be no PLLs available.  In reality, we
are reconfiguring the entire display topology, however, since
each crtc is handled independantly, we don't know that in the
driver at each crtc mode set time.

This patch checks to see if the same connector is being driven by
another crtc, and if so, uses the PLL already associated with it.

v2: store connector in the radeon crtc struct, simplify checking.

Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
2012-09-27 10:22:40 -04:00
..
reg_srcs drm/radeon: add proper checking of RESOLVE_BOX command for r600-r700 2012-08-29 12:11:00 -04:00
.gitignore
atom-bits.h
atom-names.h
atom-types.h
atom.c drm/radeon/kms: fix fans after resume 2012-04-02 11:07:42 +01:00
atom.h drm/radeon/kms: fix fans after resume 2012-04-02 11:07:42 +01:00
atombios_crtc.c drm/radeon: work around KMS modeset limitations in PLL allocation (v2) 2012-09-27 10:22:40 -04:00
atombios_dp.c drm/radeon: rework panel mode setup 2012-08-29 12:11:01 -04:00
atombios_encoders.c drm/radeon: fix typo in atombios_get_encoder_mode 2012-09-20 13:10:43 -04:00
atombios_i2c.c drm/radeon/kms/dce3+: add support for hw i2c using atom 2012-02-03 09:38:05 +00:00
atombios.h drm/radeon/kms: upstream power table updates 2012-03-21 06:55:50 +00:00
avivod.h
cayman_blit_shaders.c bug.h: add include of it to various implicit C users 2012-02-29 17:15:08 -05:00
cayman_blit_shaders.h drm/radeon/kms: add blit support for cayman (v2) 2011-05-26 09:19:31 +10:00
evergreen_blit_kms.c drm/radeon: remove r600_blit_suspend 2012-07-17 10:32:48 +02:00
evergreen_blit_shaders.c bug.h: add include of it to various implicit C users 2012-02-29 17:15:08 -05:00
evergreen_blit_shaders.h
evergreen_cs.c drm/radeon: Mark all possible functions / structs as static 2012-09-20 13:10:41 -04:00
evergreen_hdmi.c drm/radeon: enable HDMI on DCE5 (AKA NI excluding Aruba) 2012-06-16 11:21:19 +01:00
evergreen_reg.h drm/radeon: properly handle mc_stop/mc_resume on evergreen+ (v2) 2012-09-20 13:10:33 -04:00
evergreen.c drm/radeon: Mark all possible functions / structs as static 2012-09-20 13:10:41 -04:00
evergreend.h drm/radeon: properly handle mc_stop/mc_resume on evergreen+ (v2) 2012-09-20 13:10:33 -04:00
Kconfig drm/radeon/kms: clean up the radeon kms Kconfig 2011-05-26 09:22:05 +10:00
Makefile drm/radeon: add PRIME support (v2) 2012-05-23 10:47:11 +01:00
mkregtable.c radeon mkregtable: Add missing fclose() calls 2011-02-14 09:22:54 +10:00
ni_reg.h drm/radeon/kms: add ni_reg.h 2011-01-07 14:11:38 +10:00
ni.c drm/radeon: Mark all possible functions / structs as static 2012-09-20 13:10:41 -04:00
nid.h drm/radeon: make page table updates async v2 2012-09-20 13:10:40 -04:00
ObjectID.h drm/radeon/kms: Upstream ObjectID.h updates 2012-03-21 06:55:49 +00:00
r100_track.h drm/radeon: Remove more bogus inlines in the radeon driver. 2011-10-18 09:44:52 +01:00
r100.c drm/radeon: Remove unused functions 2012-09-20 13:10:41 -04:00
r100d.h drm/radeon: Definition of R_0003C2_GENMO_WT seems wrong 2010-12-21 12:55:33 +10:00
r200.c drm/radeon: remove radeon_fence_create 2012-06-21 09:38:35 +02:00
r300_cmdbuf.c drm/radeon: Move more code out of line 2011-10-18 09:53:05 +01:00
r300_reg.h Fix common misspellings 2011-03-31 11:26:23 -03:00
r300.c drm/radeon: Mark all possible functions / structs as static 2012-09-20 13:10:41 -04:00
r300d.h drm/radeon/kms: manage r300 CMASK RAM access and allow CMASK clear 2011-01-06 13:00:45 +10:00
r420.c drm/radeon: move radeon_ib_ring_tests out of chipset code 2012-07-17 10:33:01 +02:00
r420d.h
r500_reg.h drm/radeon/kms: add wait_for_vblank asic callback 2012-02-27 14:46:13 +00:00
r520.c drm/radeon: Mark all possible functions / structs as static 2012-09-20 13:10:41 -04:00
r520d.h
r600_audio.c drm/radeon: enable HDMI on DCE5 (AKA NI excluding Aruba) 2012-06-16 11:21:19 +01:00
r600_blit_kms.c Rename i2f() to int2float(), and make it global so one copy can be removed. 2012-09-20 13:10:33 -04:00
r600_blit_shaders.c The following text was taken from the original review request: 2012-03-24 10:08:39 -07:00
r600_blit_shaders.h Annotate int2float() as being a pure function. 2012-09-20 13:10:34 -04:00
r600_blit.c Annotate int2float() as being a pure function. 2012-09-20 13:10:34 -04:00
r600_cp.c drm/radeon: replace udelay with mdelay for long timeouts 2012-04-10 10:21:00 +01:00
r600_cs.c drm/radeon: Mark all possible functions / structs as static 2012-09-20 13:10:41 -04:00
r600_hdmi.c drm/radeon: Mark all possible functions / structs as static 2012-09-20 13:10:41 -04:00
r600_reg.h drm/radeon/hdmi: store info about all AFMT blocks 2012-05-17 12:15:40 +01:00
r600.c drm/radeon: Mark all possible functions / structs as static 2012-09-20 13:10:41 -04:00
r600d.h drm/radeon: add proper checking of RESOLVE_BOX command for r600-r700 2012-08-29 12:11:00 -04:00
radeon_acpi.c drm/radeon: rework the backlight control to be an asic callback 2012-09-20 13:10:37 -04:00
radeon_acpi.h drm/radeon: implement handler for ACPI event 2012-09-20 13:10:36 -04:00
radeon_agp.c
radeon_asic.c drm/radeon: make page table updates async v2 2012-09-20 13:10:40 -04:00
radeon_asic.h drm/radeon: remove dead function def 2012-09-20 13:10:40 -04:00
radeon_atombios.c drm/radeon: implement bounds checking on thermal controller lookup 2012-09-20 13:10:40 -04:00
radeon_atpx_handler.c drm/radeon: document radeon_atpx_handler.c (v2) 2012-09-20 13:10:37 -04:00
radeon_benchmark.c drm/radeon: remove radeon_fence_create 2012-06-21 09:38:35 +02:00
radeon_bios.c drm/radeon: split ATRM support out from the ATPX handler (v3) 2012-08-20 11:13:05 -04:00
radeon_blit_common.h drm/radeon/kms: common definitions for blit copy code 2012-02-03 09:31:14 +00:00
radeon_clocks.c drm/radeon: replace udelay with mdelay for long timeouts 2012-04-10 10:21:00 +01:00
radeon_combios.c drm/radeon: Remove unused functions 2012-09-20 13:10:41 -04:00
radeon_connectors.c drm/radeon: Mark all possible functions / structs as static 2012-09-20 13:10:41 -04:00
radeon_cp.c radeon_cp: Remove unneeded tests for NULL before calling release_firmware() 2012-04-30 13:15:31 +02:00
radeon_cs.c drm/radeon: fix VM syncing with multiple rings 2012-09-20 13:10:41 -04:00
radeon_cursor.c drm/radeon/dce4+: set a more reasonable cursor watermark 2012-08-13 10:50:49 -04:00
radeon_device.c drm/radeon: Mark all possible functions / structs as static 2012-09-20 13:10:41 -04:00
radeon_display.c drm: Make the .mode_fixup() operations mode argument a const pointer 2012-07-19 21:52:38 -04:00
radeon_drv.c drm/radeon: add proper checking of RESOLVE_BOX command for r600-r700 2012-08-29 12:11:00 -04:00
radeon_drv.h Fix common misspellings 2011-03-31 11:26:23 -03:00
radeon_encoders.c drm/radeon: add backlight control for atom devices (v2) 2012-09-20 13:10:35 -04:00
radeon_family.h drm/radeon/kms: add trinity (TN) chip family 2012-03-21 06:55:55 +00:00
radeon_fb.c drm/radeon: Remove unused functions 2012-09-20 13:10:41 -04:00
radeon_fence.c drm/radeon: Mark all possible functions / structs as static 2012-09-20 13:10:41 -04:00
radeon_gart.c drm/radeon: rework the VM code a bit more (v2) 2012-09-20 13:10:42 -04:00
radeon_gem.c drm/radeon: rework the VM code a bit more (v2) 2012-09-20 13:10:42 -04:00
radeon_i2c.c drm/radeon: only add the mm i2c bus if the hw_i2c module param is set 2012-04-11 09:36:53 +01:00
radeon_ioc32.c drm/radeon: Mark all possible functions / structs as static 2012-09-20 13:10:41 -04:00
radeon_irq_kms.c drm/radeon: remove gui_idle interrupt infrastructure 2012-09-20 13:10:33 -04:00
radeon_irq.c drm/radeon: Move more code out of line 2011-10-18 09:53:05 +01:00
radeon_kms.c drm/radeon: re-organize the acpi notifier callback 2012-09-20 13:10:36 -04:00
radeon_legacy_crtc.c drm/radeon: Remove unused functions 2012-09-20 13:10:41 -04:00
radeon_legacy_encoders.c drm/radeon: rework the backlight control to be an asic callback 2012-09-20 13:10:37 -04:00
radeon_legacy_tv.c drm/radeon: Move more code out of line 2011-10-18 09:53:05 +01:00
radeon_mem.c drivers: use kzalloc/kcalloc instead of 'kmalloc+memset', where possible 2011-07-25 20:57:13 -07:00
radeon_mode.h drm/radeon: work around KMS modeset limitations in PLL allocation (v2) 2012-09-27 10:22:40 -04:00
radeon_object.c drm/radeon: rework the VM code a bit more (v2) 2012-09-20 13:10:42 -04:00
radeon_object.h drm/radeon: let bo_reserve take no_intr instead of no_wait param 2012-09-20 13:10:42 -04:00
radeon_pm.c drm/radeon: re-organize the acpi notifier callback 2012-09-20 13:10:36 -04:00
radeon_prime.c drm/radeon/prime: reserve/unreserve around pin 2012-06-16 11:14:05 +01:00
radeon_reg.h drm/radeon/kms: fix up atom HPD gpio parsing for DCE6 2012-03-21 06:55:50 +00:00
radeon_ring.c drm/radeon: move IB pool to 1MB offset 2012-09-20 13:10:42 -04:00
radeon_sa.c drm/radeon: rework VM page table handling 2012-09-20 13:10:39 -04:00
radeon_semaphore.c drm/radeon: rework ring syncing code 2012-06-21 09:38:40 +02:00
radeon_state.c drm/radeon: Move more code out of line 2011-10-18 09:53:05 +01:00
radeon_test.c drm/radeon: Mark all possible functions / structs as static 2012-09-20 13:10:41 -04:00
radeon_trace_points.c
radeon_trace.h
radeon_ttm.c drm/radeon: Mark all possible functions / structs as static 2012-09-20 13:10:41 -04:00
radeon.h drm/radeon: rework the VM code a bit more (v2) 2012-09-20 13:10:42 -04:00
rs100d.h
rs400.c drm/radeon: Mark all possible functions / structs as static 2012-09-20 13:10:41 -04:00
rs400d.h
rs600.c drm/radeon: Mark all possible functions / structs as static 2012-09-20 13:10:41 -04:00
rs600d.h drm/radeon/kms: add register definitions for audio 2012-04-24 09:50:13 +01:00
rs690.c drm/radeon: Mark all possible functions / structs as static 2012-09-20 13:10:41 -04:00
rs690d.h
rv200d.h
rv250d.h
rv350d.h
rv515.c drm/radeon: Mark all possible functions / structs as static 2012-09-20 13:10:41 -04:00
rv515d.h
rv770.c drm/radeon: Mark all possible functions / structs as static 2012-09-20 13:10:41 -04:00
rv770d.h drm/radeon: add some additional 6xx/7xx/EG register init 2012-06-16 14:30:47 +01:00
si_blit_shaders.c The following text was taken from the original review request: 2012-03-24 10:08:39 -07:00
si_blit_shaders.h drm/radeon/kms: add support for CP setup on SI 2012-03-21 06:55:54 +00:00
si_reg.h drm/radeon: SI tiling fixes for display 2012-06-20 19:55:56 +01:00
si.c drm/radeon: Mark all possible functions / structs as static 2012-09-20 13:10:41 -04:00
sid.h drm/radeon/kms: implement timestamp userspace query (v2) 2012-08-13 10:50:56 -04:00