Skip to content

Commit

Permalink
drm/i915: Iterate through the initialized DDIs to prepare their buffers
Browse files Browse the repository at this point in the history
Not every DDIs is necessarily connected can be strapped off and, in the
future, we'll have platforms with a different number of default DDI
ports. So, let's only call intel_prepare_ddi_buffers() on DDI ports that
are actually detected.

We also use the opportunity to give a struct intel_digital_port to
intel_prepare_ddi_buffers() as we'll need it in a following patch to
query if the port supports HMDI or not.

On my HSW machine this removes the initialization of a couple of
(unused) DDIs.

Signed-off-by: Damien Lespiau <damien.lespiau@intel.com>
Reviewed-by: Sivakumar Thulasimani <sivakumar.thulasimani@intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
  • Loading branch information
Damien Lespiau authored and Daniel Vetter committed Apr 16, 2015
1 parent 5036040 commit b403745
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 4 deletions.
4 changes: 4 additions & 0 deletions drivers/gpu/drm/i915/i915_drv.h
Original file line number Diff line number Diff line change
Expand Up @@ -251,6 +251,10 @@ enum hpd_pin {
&dev->mode_config.connector_list, \
base.head)

#define for_each_digital_port(dev, digital_port) \
list_for_each_entry(digital_port, \
&dev->mode_config.encoder_list, \
base.base.head)

#define for_each_encoder_on_crtc(dev, __crtc, intel_encoder) \
list_for_each_entry((intel_encoder), &(dev)->mode_config.encoder_list, base.head) \
Expand Down
16 changes: 12 additions & 4 deletions drivers/gpu/drm/i915/intel_ddi.c
Original file line number Diff line number Diff line change
Expand Up @@ -198,10 +198,12 @@ enum port intel_ddi_get_encoder_port(struct intel_encoder *intel_encoder)
* in either FDI or DP modes only, as HDMI connections will work with both
* of those
*/
static void intel_prepare_ddi_buffers(struct drm_device *dev, enum port port)
static void intel_prepare_ddi_buffers(struct drm_device *dev,
struct intel_digital_port *intel_dig_port)
{
struct drm_i915_private *dev_priv = dev->dev_private;
u32 reg;
int port = intel_dig_port->port;
int i, n_hdmi_entries, n_dp_entries, n_edp_entries, hdmi_default_entry,
size;
int hdmi_level = dev_priv->vbt.ddi_port_info[port].hdmi_level_shift;
Expand Down Expand Up @@ -309,13 +311,19 @@ static void intel_prepare_ddi_buffers(struct drm_device *dev, enum port port)
*/
void intel_prepare_ddi(struct drm_device *dev)
{
int port;
struct intel_digital_port *intel_dig_port;
bool visited[I915_MAX_PORTS] = { 0, };

if (!HAS_DDI(dev))
return;

for (port = PORT_A; port <= PORT_E; port++)
intel_prepare_ddi_buffers(dev, port);
for_each_digital_port(dev, intel_dig_port) {
if (visited[intel_dig_port->port])
continue;

intel_prepare_ddi_buffers(dev, intel_dig_port);
visited[intel_dig_port->port] = true;
}
}

static void intel_wait_ddi_buf_idle(struct drm_i915_private *dev_priv,
Expand Down

0 comments on commit b403745

Please sign in to comment.