drivers/gpu/drm/i915/display/intel_fdi.c

Source file repositories/reference/linux-study-clean/drivers/gpu/drm/i915/display/intel_fdi.c

File Facts

System
Linux kernel
Corpus path
drivers/gpu/drm/i915/display/intel_fdi.c
Extension
.c
Size
32988 bytes
Lines
1119
Domain
Driver Families
Bucket
drivers/gpu
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

struct intel_fdi_funcs {
	void (*fdi_link_train)(struct intel_crtc *crtc,
			       const struct intel_crtc_state *crtc_state);
};

static void assert_fdi_tx(struct intel_display *display,
			  enum pipe pipe, bool state)
{
	bool cur_state;

	if (HAS_DDI(display)) {
		/*
		 * DDI does not have a specific FDI_TX register.
		 *
		 * FDI is never fed from EDP transcoder
		 * so pipe->transcoder cast is fine here.
		 */
		enum transcoder cpu_transcoder = (enum transcoder)pipe;
		cur_state = intel_de_read(display,
					  TRANS_DDI_FUNC_CTL(display, cpu_transcoder)) & TRANS_DDI_FUNC_ENABLE;
	} else {
		cur_state = intel_de_read(display, FDI_TX_CTL(pipe)) & FDI_TX_ENABLE;
	}
	INTEL_DISPLAY_STATE_WARN(display, cur_state != state,
				 "FDI TX state assertion failure (expected %s, current %s)\n",
				 str_on_off(state), str_on_off(cur_state));
}

void assert_fdi_tx_enabled(struct intel_display *display, enum pipe pipe)
{
	assert_fdi_tx(display, pipe, true);
}

void assert_fdi_tx_disabled(struct intel_display *display, enum pipe pipe)
{
	assert_fdi_tx(display, pipe, false);
}

static void assert_fdi_rx(struct intel_display *display,
			  enum pipe pipe, bool state)
{
	bool cur_state;

	cur_state = intel_de_read(display, FDI_RX_CTL(pipe)) & FDI_RX_ENABLE;
	INTEL_DISPLAY_STATE_WARN(display, cur_state != state,
				 "FDI RX state assertion failure (expected %s, current %s)\n",
				 str_on_off(state), str_on_off(cur_state));
}

void assert_fdi_rx_enabled(struct intel_display *display, enum pipe pipe)
{
	assert_fdi_rx(display, pipe, true);
}

void assert_fdi_rx_disabled(struct intel_display *display, enum pipe pipe)
{
	assert_fdi_rx(display, pipe, false);
}

void assert_fdi_tx_pll_enabled(struct intel_display *display, enum pipe pipe)
{
	bool cur_state;

	/* ILK FDI PLL is always enabled */
	if (display->platform.ironlake)
		return;

	/* On Haswell, DDI ports are responsible for the FDI PLL setup */
	if (HAS_DDI(display))
		return;

	cur_state = intel_de_read(display, FDI_TX_CTL(pipe)) & FDI_TX_PLL_ENABLE;
	INTEL_DISPLAY_STATE_WARN(display, !cur_state,
				 "FDI TX PLL assertion failure, should be active but is disabled\n");
}

static void assert_fdi_rx_pll(struct intel_display *display,
			      enum pipe pipe, bool state)
{
	bool cur_state;

	cur_state = intel_de_read(display, FDI_RX_CTL(pipe)) & FDI_RX_PLL_ENABLE;
	INTEL_DISPLAY_STATE_WARN(display, cur_state != state,
				 "FDI RX PLL assertion failure (expected %s, current %s)\n",
				 str_on_off(state), str_on_off(cur_state));
}

void assert_fdi_rx_pll_enabled(struct intel_display *display, enum pipe pipe)
{
	assert_fdi_rx_pll(display, pipe, true);

Annotation

Implementation Notes