drivers/gpu/drm/amd/display/dc/dcn31/dcn31_apg.c
Source file repositories/reference/linux-study-clean/drivers/gpu/drm/amd/display/dc/dcn31/dcn31_apg.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/gpu/drm/amd/display/dc/dcn31/dcn31_apg.c- Extension
.c- Size
- 3265 bytes
- Lines
- 121
- 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.
- 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.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
dc_bios_types.hhw_shared.hdcn31_apg.hreg_helper.h
Detected Declarations
function filesfunction apg31_disablefunction apg31_se_audio_setupfunction apg31_construct
Annotated Snippet
#include "dc_bios_types.h"
#include "hw_shared.h"
#include "dcn31_apg.h"
#include "reg_helper.h"
#define DC_LOGGER \
apg31->base.ctx->logger
#define REG(reg)\
(apg31->regs->reg)
#undef FN
#define FN(reg_name, field_name) \
apg31->apg_shift->field_name, apg31->apg_mask->field_name
#define CTX \
apg31->base.ctx
static void apg31_enable(
struct apg *apg)
{
struct dcn31_apg *apg31 = DCN31_APG_FROM_APG(apg);
/* Reset APG */
REG_UPDATE(APG_CONTROL, APG_RESET, 1);
REG_WAIT(APG_CONTROL,
APG_RESET_DONE, 1,
1, 10);
REG_UPDATE(APG_CONTROL, APG_RESET, 0);
REG_WAIT(APG_CONTROL,
APG_RESET_DONE, 0,
1, 10);
/* Enable APG */
REG_UPDATE(APG_CONTROL2, APG_ENABLE, 1);
}
static void apg31_disable(
struct apg *apg)
{
struct dcn31_apg *apg31 = DCN31_APG_FROM_APG(apg);
/* Disable APG */
REG_UPDATE(APG_CONTROL2, APG_ENABLE, 0);
}
static void apg31_se_audio_setup(
struct apg *apg,
unsigned int az_inst,
struct audio_info *audio_info)
{
(void)az_inst;
struct dcn31_apg *apg31 = DCN31_APG_FROM_APG(apg);
ASSERT(audio_info);
/* This should not happen.it does so we don't get BSOD*/
if (audio_info == NULL)
return;
/* DisplayPort only allows for one audio stream with stream ID 0 */
REG_UPDATE(APG_CONTROL2, APG_DP_AUDIO_STREAM_ID, 0);
/* When running in "pair mode", pairs of audio channels have their own enable
* this is for really old audio drivers */
REG_UPDATE(APG_DBG_GEN_CONTROL, APG_DBG_AUDIO_CHANNEL_ENABLE, 0xFF);
/* Disable forced mem power off */
REG_UPDATE(APG_MEM_PWR, APG_MEM_PWR_FORCE, 0);
}
static struct apg_funcs dcn31_apg_funcs = {
.se_audio_setup = apg31_se_audio_setup,
.enable_apg = apg31_enable,
.disable_apg = apg31_disable,
};
void apg31_construct(struct dcn31_apg *apg31,
struct dc_context *ctx,
uint32_t inst,
const struct dcn31_apg_registers *apg_regs,
const struct dcn31_apg_shift *apg_shift,
const struct dcn31_apg_mask *apg_mask)
{
apg31->base.ctx = ctx;
apg31->base.inst = inst;
apg31->base.funcs = &dcn31_apg_funcs;
Annotation
- Immediate include surface: `dc_bios_types.h`, `hw_shared.h`, `dcn31_apg.h`, `reg_helper.h`.
- Detected declarations: `function files`, `function apg31_disable`, `function apg31_se_audio_setup`, `function apg31_construct`.
- Atlas domain: Driver Families / drivers/gpu.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.