Display PLLs¶
Display PLLs used for driving outputs vary by platform. While some have per-pipe or per-encoder dedicated PLLs, others allow the use of any PLL from a pool. In the latter scenario, it is possible that multiple pipes share a PLL if their configurations match.
This file provides an abstraction over display PLLs. The function
intel_dpll_init() initializes the PLLs for the given platform. The
users of a PLL are tracked and that tracking is integrated with the atomic
modset interface. During an atomic operation, required PLLs can be reserved
for a given CRTC and encoder configuration by calling
intel_dpll_reserve() and previously reserved PLLs can be released
with intel_dpll_release().
Changes to the users are first staged in the atomic state, and then made
effective by calling intel_dpll_swap_state() during the atomic
commit phase.
-
struct intel_dpll *intel_get_dpll_by_id(struct intel_display *display, enum intel_dpll_id id)¶
get a DPLL given its id
參數
struct intel_display *displayintel_display device instance
enum intel_dpll_id idpll id
Return
A pointer to the DPLL with id
-
void intel_dpll_enable(const struct intel_crtc_state *crtc_state)¶
enable a CRTC's DPLL
參數
const struct intel_crtc_state *crtc_stateCRTC, and its state, which has a DPLL
描述
Enable DPLL used by crtc.
-
void intel_dpll_disable(const struct intel_crtc_state *crtc_state)¶
disable a CRTC's shared DPLL
參數
const struct intel_crtc_state *crtc_stateCRTC, and its state, which has a shared DPLL
描述
Disable DPLL used by crtc.
-
void intel_dpll_crtc_get(const struct intel_crtc *crtc, const struct intel_dpll *pll, struct intel_dpll_state *dpll_state)¶
Get a DPLL reference for a CRTC
參數
const struct intel_crtc *crtcCRTC on which behalf the reference is taken
const struct intel_dpll *pllDPLL for which the reference is taken
struct intel_dpll_state *dpll_statethe DPLL atomic state in which the reference is tracked
描述
Take a reference for pll tracking the use of it by crtc.
-
void intel_dpll_crtc_put(const struct intel_crtc *crtc, const struct intel_dpll *pll, struct intel_dpll_state *dpll_state)¶
Drop a DPLL reference for a CRTC
參數
const struct intel_crtc *crtcCRTC on which behalf the reference is dropped
const struct intel_dpll *pllDPLL for which the reference is dropped
struct intel_dpll_state *dpll_statethe DPLL atomic state in which the reference is tracked
描述
Drop a reference for pll tracking the end of use of it by crtc.
-
void intel_dpll_swap_state(struct intel_atomic_state *state)¶
make atomic DPLL configuration effective
參數
struct intel_atomic_state *stateatomic state
描述
This is the dpll version of drm_atomic_helper_swap_state() since the
helper does not handle driver-specific global state.
For consistency with atomic helpers this function does a complete swap, i.e. it also puts the current state into state, even though there is no need for that at this moment.
-
void icl_set_active_port_dpll(struct intel_crtc_state *crtc_state, enum icl_port_dpll_id port_dpll_id)¶
select the active port DPLL for a given CRTC
參數
struct intel_crtc_state *crtc_statestate for the CRTC to select the DPLL for
enum icl_port_dpll_id port_dpll_idthe active port_dpll_id to select
描述
Select the given port_dpll_id instance from the DPLLs reserved for the CRTC.
-
void intel_dpll_init(struct intel_display *display)¶
Initialize DPLLs
參數
struct intel_display *displayintel_display device
描述
Initialize DPLLs for display.
-
int intel_dpll_compute(struct intel_atomic_state *state, struct intel_crtc *crtc, struct intel_encoder *encoder)¶
compute DPLL state CRTC and encoder combination
參數
struct intel_atomic_state *stateatomic state
struct intel_crtc *crtcCRTC to compute DPLLs for
struct intel_encoder *encoderencoder
描述
This function computes the DPLL state for the given CRTC and encoder.
The new configuration in the atomic commit state is made effective by
calling intel_dpll_swap_state().
Return
0 on success, negative error code on failure.
-
int intel_dpll_reserve(struct intel_atomic_state *state, struct intel_crtc *crtc, struct intel_encoder *encoder)¶
reserve DPLLs for CRTC and encoder combination
參數
struct intel_atomic_state *stateatomic state
struct intel_crtc *crtcCRTC to reserve DPLLs for
struct intel_encoder *encoderencoder
描述
This function reserves all required DPLLs for the given CRTC and encoder combination in the current atomic commit state and the new crtc atomic state.
The new configuration in the atomic commit state is made effective by
calling intel_dpll_swap_state().
The reserved DPLLs should be released by calling
intel_dpll_release().
Return
0 if all required DPLLs were successfully reserved, negative error code otherwise.
-
void intel_dpll_release(struct intel_atomic_state *state, struct intel_crtc *crtc)¶
end use of DPLLs by CRTC in atomic state
參數
struct intel_atomic_state *stateatomic state
struct intel_crtc *crtccrtc from which the DPLLs are to be released
描述
This function releases all DPLLs reserved by intel_dpll_reserve()
from the current atomic commit state and the old crtc atomic state.
The new configuration in the atomic commit state is made effective by
calling intel_dpll_swap_state().
-
void intel_dpll_update_active(struct intel_atomic_state *state, struct intel_crtc *crtc, struct intel_encoder *encoder)¶
update the active DPLL for a CRTC/encoder
參數
struct intel_atomic_state *stateatomic state
struct intel_crtc *crtcthe CRTC for which to update the active DPLL
struct intel_encoder *encoderencoder determining the type of port DPLL
描述
Update the active DPLL for the given crtc/encoder in crtc's atomic state,
from the port DPLLs reserved previously by intel_dpll_reserve(). The
DPLL selected will be based on the current mode of the encoder's port.
-
int intel_dpll_get_freq(struct intel_display *display, const struct intel_dpll *pll, const struct intel_dpll_hw_state *dpll_hw_state)¶
calculate the DPLL's output frequency
參數
struct intel_display *displayintel_display device
const struct intel_dpll *pllDPLL for which to calculate the output frequency
const struct intel_dpll_hw_state *dpll_hw_stateDPLL state from which to calculate the output frequency
描述
Return the output frequency corresponding to pll's passed in dpll_hw_state.
-
bool intel_dpll_get_hw_state(struct intel_display *display, struct intel_dpll *pll, struct intel_dpll_hw_state *dpll_hw_state)¶
readout the DPLL's hardware state
參數
struct intel_display *displayintel_display device instance
struct intel_dpll *pllDPLL for which to calculate the output frequency
struct intel_dpll_hw_state *dpll_hw_stateDPLL's hardware state
描述
Read out pll's hardware state into dpll_hw_state.
-
void intel_dpll_dump_hw_state(struct intel_display *display, struct drm_printer *p, const struct intel_dpll_hw_state *dpll_hw_state)¶
dump hw_state
參數
struct intel_display *displayintel_display structure
struct drm_printer *pwhere to print the state to
const struct intel_dpll_hw_state *dpll_hw_statehw state to be dumped
描述
Dumo out the relevant values in dpll_hw_state.
-
bool intel_dpll_compare_hw_state(struct intel_display *display, const struct intel_dpll_hw_state *a, const struct intel_dpll_hw_state *b)¶
compare the two states
參數
struct intel_display *displayintel_display structure
const struct intel_dpll_hw_state *afirst DPLL hw state
const struct intel_dpll_hw_state *bsecond DPLL hw state
描述
Compare DPLL hw states a and b.
Return
true if the states are equal, false if the differ
-
enum intel_dpll_id¶
possible DPLL ids
Constants
DPLL_ID_PRIVATEnon-shared dpll in use
DPLL_ID_PCH_PLL_ADPLL A in ILK, SNB and IVB
DPLL_ID_PCH_PLL_BDPLL B in ILK, SNB and IVB
DPLL_ID_WRPLL1HSW and BDW WRPLL1
DPLL_ID_WRPLL2HSW and BDW WRPLL2
DPLL_ID_SPLLHSW and BDW SPLL
DPLL_ID_LCPLL_810HSW and BDW 0.81 GHz LCPLL
DPLL_ID_LCPLL_1350HSW and BDW 1.35 GHz LCPLL
DPLL_ID_LCPLL_2700HSW and BDW 2.7 GHz LCPLL
DPLL_ID_SKL_DPLL0SKL and later DPLL0
DPLL_ID_SKL_DPLL1SKL and later DPLL1
DPLL_ID_SKL_DPLL2SKL and later DPLL2
DPLL_ID_SKL_DPLL3SKL and later DPLL3
DPLL_ID_ICL_DPLL0ICL/TGL combo PHY DPLL0
DPLL_ID_ICL_DPLL1ICL/TGL combo PHY DPLL1
DPLL_ID_EHL_DPLL4EHL combo PHY DPLL4
DPLL_ID_ICL_TBTPLLICL/TGL TBT PLL
DPLL_ID_ICL_MGPLL1- ICL MG PLL 1 port 1 (C),
TGL TC PLL 1 port 1 (TC1)
DPLL_ID_ICL_MGPLL2- ICL MG PLL 1 port 2 (D)
TGL TC PLL 1 port 2 (TC2)
DPLL_ID_ICL_MGPLL3- ICL MG PLL 1 port 3 (E)
TGL TC PLL 1 port 3 (TC3)
DPLL_ID_ICL_MGPLL4- ICL MG PLL 1 port 4 (F)
TGL TC PLL 1 port 4 (TC4)
DPLL_ID_TGL_MGPLL5TGL TC PLL port 5 (TC5)
DPLL_ID_TGL_MGPLL6TGL TC PLL port 6 (TC6)
DPLL_ID_DG1_DPLL0DG1 combo PHY DPLL0
DPLL_ID_DG1_DPLL1DG1 combo PHY DPLL1
DPLL_ID_DG1_DPLL2DG1 combo PHY DPLL2
DPLL_ID_DG1_DPLL3DG1 combo PHY DPLL3
描述
Enumeration of possible IDs for a DPLL. Real shared dpll ids must be >= 0.
-
struct intel_dpll_state¶
hold the DPLL atomic state
Definition:
struct intel_dpll_state {
u8 pipe_mask;
struct intel_dpll_hw_state hw_state;
};
Members
pipe_maskmask of pipes using this DPLL, active or not
hw_statehardware configuration for the DPLL stored in struct
intel_dpll_hw_state.
描述
This structure holds an atomic state for the DPLL, that can represent
either its current state (in struct intel_shared_dpll) or a desired
future state which would be applied by an atomic mode set (stored in
a struct intel_atomic_state).
See also intel_reserve_shared_dplls() and intel_release_shared_dplls().
-
struct dpll_info¶
display PLL platform specific info
Definition:
struct dpll_info {
const char *name;
const struct intel_dpll_funcs *funcs;
enum intel_dpll_id id;
enum intel_display_power_domain power_domain;
bool always_on;
bool is_alt_port_dpll;
};
Members
nameDPLL name; used for logging
funcsplatform specific hooks
idunique identifier for this DPLL
power_domainextra power domain required by the DPLL
always_onInform the state checker that the DPLL is kept enabled even if not in use by any CRTC.
is_alt_port_dpllInform the state checker that the DPLL can be used as a fallback (for TC->TBT fallback).
-
struct intel_dpll¶
display PLL with tracked state and users
Definition:
struct intel_dpll {
struct intel_dpll_state state;
u8 index;
u8 active_mask;
bool on;
const struct dpll_info *info;
struct ref_tracker *wakeref;
};
Members
stateStore the state for the pll, including its hw state and CRTCs using it.
indexindex for atomic state
active_maskmask of active pipes (i.e. DPMS on) using this DPLL
onis the PLL actually active? Disabled during modeset
infoplatform specific info
wakerefIn some platforms a device-level runtime pm reference may need to be grabbed to disable DC states while this DPLL is enabled