Hi,
hmm, I think a few review comments from Takashi were missed. See inline:
On Mon, 29 Jun 2020, Harsha Priya wrote:
--- a/sound/pci/hda/Kconfig +++ b/sound/pci/hda/Kconfig @@ -232,4 +232,20 @@ config SND_HDA_POWER_SAVE_DEFAULT
endif
+config SND_HDA_INTEL_HDMI_SILENT_STREAM
- bool "Enable Silent Stream always for HDMI"
- depends on SND_HDA_INTEL
Takashi requested to limit this to Intel hardware only, and despite the its name, SND_HDA_INTEL is not sufficient to do this.
I think best would be to take silent stream into use in intel_hsw_common_init(). That indirection would also protect against user-space modifying the module parameter value during execution (it is only evaluated in intel_hsw_common_init()).
- if (enable_silent_stream && eld->eld_valid) {
int pm_ret;
if (!monitor_prev && monitor_next && eld->eld_valid) {
pm_ret = snd_hda_power_up_pm(codec);
if (pm_ret < 0)
codec_err(codec,
"Monitor plugged-in, Failed to power up codec ret=[%d]\n",
pm_ret);
silent_stream_enable(codec, per_pin);
} else if (monitor_prev && !monitor_next && !eld->eld_valid) {
pm_ret = snd_hda_power_down_pm(codec);
if (pm_ret < 0)
codec_err(codec,
"Monitor plugged-out, Failed to power down codec ret=[%d]\n",
pm_ret);
}
- }
There a bug in above, outer "if" checks for "eld_valid" while inner "else-if" checks for "!eld_valid" -> latter can never be reached.
Takashi, I was checking older code history on the acomp interface, and at least on Intel platforms using acomp, it is sufficient to check for eld->monitor_present. I.e. in
» eld->eld_size = snd_hdac_acomp_get_eld(&codec->core, per_pin->pin_nid, » » » » per_pin->dev_id, &eld->monitor_present, » » » » eld->eld_buffer, ELD_MAX_SIZE); » eld->eld_valid = (eld->eld_size > 0);
... monitor_present will always be 0 if eld_size<0 (and eld_valid is set to 0). An error monitor_present will not be set, but sync_eld_via_acomp() initialized the value to 0 for this case.
The additional checks in the patch are thus harmless, but make the code a bit suspicious looking. If the above did not hold, you could have a sequence like
monitor_prev=0, monitor_next=1, eld_valid=1 -> power-up monitor_prev=1, monitor_next=0, eld_valid=0 -> no op monitor_prev=0, monitor_next=1, eld_valid=1 -> power-up again
.. so the refcounting would go out of sync. So I'd rather just track the two variables.
Br, Kai