Dear Wu,
I hope that is your first name.
Am Sonntag, den 04.09.2011, 05:15 +0800 schrieb Wu Fengguang:
Changes from v4: remove a debug call to dump_stack(). Thanks to Bossart for catching this!
His first name is Pierre-Louis. I do not know how you address people at Intel though.
I think your format will confuse `git am`. Please always put that under the »---« under the Signed-off-by lines.
Add ELD support for Intel Eaglelake, IbexPeak/Ironlake, SandyBridge/CougarPoint and IvyBridge/PantherPoint chips.
ELD (EDID-Like Data) describes to the HDMI/DP audio driver the audio capabilities of the plugged monitor. It's built and passed to audio driver in 2 steps:
(1) at get_modes time, parse EDID and save ELD to drm_connector.eld[]
(2) at mode_set time, write drm_connector.eld[] to the Transcoder's hw ELD buffer and set the ELD_valid bit to inform HDMI/DP audio driver
ELD selection policy: it's possible for one encoder to be associated with multiple connectors (ie. monitors), in which case the first found ELD will be used. This policy may not be suitable for all users, but let's start it simple first.
The impact of ELD selection policy: assume there are two monitors, one supports stereo playback and the other has 8-channel output; cloned display mode is used, so that the two monitors are associated with the same internal encoder. If only the stereo playback capability is reported, the user won't be able to start 8-channel playback; if the 8-channel ELD is reported, then user space applications may send 8-channel samples down, however the user may actually be listening to the 2-channel monitor and not connecting speakers to the 8-channel monitor. Overall, it's more safe to report maximum profiles to the user space, so that the user can at least be able to do 8-channel playback if he want to.
s'he's/he'
This patch is tested OK on G45/HDMI, IbexPeak/HDMI and IvyBridge/HDMI+DP.
What is the correct way to test this patch. Just plug in the HDMI monitor and it should work out of the box?
Minor imperfection: the GEN6_AUD_CNTL_ST/DIP_Port_Select field always reads 0 (reserved). Without knowing the port number, I worked it around by setting the ELD_valid bit for ALL the three ports. It's tested to not be a problem, because the audio driver will find invalid ELD data and hence rightfully abort, even when it sees the ELD_valid indicator.
Thanks to Zhenyu and Bossart for a lot of valuable help and testing.
Again the first name is Pierre-Louis or put Mr in front of it.
CC: Zhao Yakui yakui.zhao@intel.com CC: Wang Zhenyu zhenyu.z.wang@intel.com CC: Jeremy Bush contractfrombelow@gmail.com CC: Christopher White c.white@pulseforce.com CC: "Bossart, Pierre-louis" pierre-louis.bossart@intel.com
Pierre-Louis Bossart
Signed-off-by: Ben Skeggs bskeggs@redhat.com Signed-off-by: Wu Fengguang fengguang.wu@intel.com
drivers/gpu/drm/drm_edid.c | 171 +++++++++++++++++++++++++ drivers/gpu/drm/i915/i915_drv.h | 2 drivers/gpu/drm/i915/i915_reg.h | 25 +++ drivers/gpu/drm/i915/intel_display.c | 131 +++++++++++++++++++ drivers/gpu/drm/i915/intel_dp.c | 6 drivers/gpu/drm/i915/intel_drv.h | 2 drivers/gpu/drm/i915/intel_hdmi.c | 3 drivers/gpu/drm/i915/intel_modes.c | 2 include/drm/drm_crtc.h | 9 + include/drm/drm_edid.h | 9 + 10 files changed, 358 insertions(+), 2 deletions(-)
Some more style things follow.
[…]
+/**
- drm_av_sync_delay - HDMI/DP sink audio-video sync delay in milli-seconds
- @connector: connector associated with the HDMI/DP sink
- @mode: the display mode
- */
+int drm_av_sync_delay(struct drm_connector *connector,
struct drm_display_mode *mode)
+{
- int i = !!(mode->flags & DRM_MODE_FLAG_INTERLACE);
- int a, v;
- if (!connector->latency_present[0])
return 0;
- if (!connector->latency_present[1])
i = 0;
- a = connector->audio_latency[i];
- v = connector->video_latency[i];
- /*
* HDMI/DP sink doesn't support audio or video?
*/
- if (a == 255 || v == 255)
return 0;
- /*
* Convert raw edid values to milli-seconds.
s/edid/EDID/ (nitpick) s/milli-seconds/millisecond/
http://www.merriam-webster.com/dictionary/millisecond
* Treat unknown latency as 0ms.
*/
- if (a)
a = min(2 * (a - 1), 500);
- if (v)
v = min(2 * (v - 1), 500);
- return max(v - a, 0);
+} +EXPORT_SYMBOL(drm_av_sync_delay);
[…]
--- linux-next.orig/drivers/gpu/drm/i915/i915_reg.h 2011-09-02 15:59:31.000000000 +0800 +++ linux-next/drivers/gpu/drm/i915/i915_reg.h 2011-09-02 15:59:40.000000000 +0800 @@ -3470,4 +3470,29 @@ #define GEN6_PCODE_DATA 0x138128 #define GEN6_PCODE_FREQ_IA_RATIO_SHIFT 8
+#define G4X_AUD_VID_DID 0x62020 +#define INTEL_AUDIO_DEVCL 0x808629FB
Alignment two lines above. Separate clean up patch to fix alignment to send before?
+#define INTEL_AUDIO_DEVBLC 0x80862801 +#define INTEL_AUDIO_DEVCTG 0x80862802
+#define G4X_AUD_CNTL_ST 0x620B4
Alignment?
+#define G4X_ELDV_DEVCL_DEVBLC (1 << 13) +#define G4X_ELDV_DEVCTG (1 << 14)
Dito?
+#define G4X_ELD_ADDR (0xf << 5) +#define G4X_ELD_ACK (1 << 4) +#define G4X_HDMIW_HDMIEDID 0x6210C
+#define GEN6_HDMIW_HDMIEDID_A 0xE2050 +#define GEN6_AUD_CNTL_ST_A 0xE20B4 +#define GEN6_ELD_BUFFER_SIZE (0x1f << 10) +#define GEN6_ELD_ADDRESS (0x1f << 5) +#define GEN6_ELD_ACK (1 << 4) +#define GEN6_AUD_CNTL_ST2 0xE20C0 +#define GEN6_ELD_VALIDB (1 << 0)
Dito?
+#define GEN6_CP_READYB (1 << 1)
+#define GEN7_HDMIW_HDMIEDID_A 0xE5050 +#define GEN7_AUD_CNTRL_ST_A 0xE50B4 +#define GEN7_AUD_CNTRL_ST2 0xE50C0
#endif /* _I915_REG_H_ */
[…]
Thanks,
Paul