dce_v8_0_pick_pll(9)
π dce_v8_0_pick_pll(9) β the kernel API manual, bestie edition π
okay so this is a page from the Kernel API Manual (yes, the actual kernel, we're fancy now) and it's all about one little function that's lowkey the matchmaker of your display pipeline. let's get into it π
β¨ NAME β¨
dce_v8_0_pick_pll β allocate a PPLL for use by the crtc. that's it, that's the whole job. it finds a PLL and hands it over. king behavior honestly π
πΈ SYNOPSIS πΈ
u32 dce_v8_0_pick_pll (struct drm_crtc *crtc );
one arg, returns a u32. simple. clean. no notes. β¨
π¦ ARGUMENTS π¦
crtcβ the drm crtc. that's the whole description, bestie, the original said "drm crtc" and we're not gonna invent lore that isn't there π this is the crtc you're trying to find a PLL for.
π DESCRIPTION π
so here's the tea β β this function returns the PPLL (that's the Pixel PLL, for anyone keeping score) that the crtc should use. and the rules for who gets which PLL are genuinely kind of interesting:
- for DP monitors, a single PPLL can be used for all DP crtcs/encoders. one PLL, many friends. sharing is caring π«Ά
- for non-DP monitors, a dedicated PPLL must be used. no sharing, no borrowing, this one's yours and yours alone π
now for the edge cases, and listen up because these matter:
- if a particular board has an external DP PLL, return
ATOM_PPLL_INVALIDβ that skips PLL programming entirely, because hello? there's literally no need to program the PLL itself when the board already handles it π - if we are not able to allocate a PLL, return
ATOM_PPLL_INVALIDtoo β this skips PLL programming so we don't mess up an existing monitor. like, do no harm, y'know? π«Ά
ngl the ATOM_PPLL_INVALID return shows up in two very different situations β external DP PLL and allocation failure β so don't assume "invalid" means "something broke". sometimes it means "not needed", sometimes it means "couldn't get one", and both times the answer is: skip the programming. π
π₯ Asic specific PLL information
the deets change depending on your chip, so here's the breakdown:
β DCE 8.x KB/KV
- PPLL1, PPLL2 are available for all UNIPHY (both DP and non-DP) CI
- PPLL0, PPLL1, PPLL2 are available for all UNIPHY (both DP and non-DP) and DAC
so on KB/KV you've got the full trio PPLL0, PPLL1, PPLL2 doing UNIPHY duty and DAC duty, while the CI situation is just PPLL1 and PPLL2 on UNIPHY. iconic lineup honestly π
π SEE ALSO π
the source lives here, in the kernel file ./drivers/gpu/drm/amd/amdgpu/dce_v8_0.c β go read it, it's giving main character energy π§
and here's the whole friend group, fr fr:
dce_v8_0_page_flip(9)dce_v8_0_hpd_sense(9)dce_v8_0_hpd_set_polarity(9)dce_v8_0_hpd_init(9)dce_v8_0_hpd_fini(9)dce_v8_0_line_buffer_adjust(9)cik_get_number_of_dram_channels(9)dce_v8_0_dram_bandwidth(9)dce_v8_0_dram_bandwidth_for_display(9)dce_v8_0_data_return_bandwidth(9)dce_v8_0_dmif_request_bandwidth(9)dce_v8_0_available_bandwidth(9)dce_v8_0_average_bandwidth(9)dce_v8_0_latency_watermark(9)dce_v8_0_average_bandwidth_vs_dram_bandwidth_for_display(9)dce_v8_0_average_bandwidth_vs_available_bandwidth(9)dce_v8_0_check_latency_hiding(9)dce_v8_0_program_watermarks(9)dce_v8_0_bandwidth_update(9)
and that's the page!! π this little beauty comes to you from ./drivers/gpu/drm/amd/amdgpu, dated October 2026 β go forth and pick your PLLs responsibly, bestie πβ¨
π¦ where this page comes from
- nixpkgs unstable: linux-manual 7.3.1
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms