drivers/media/platform/qcom/iris/iris_vpu_common.c
Source file repositories/reference/linux-study-clean/drivers/media/platform/qcom/iris/iris_vpu_common.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/media/platform/qcom/iris/iris_vpu_common.c- Extension
.c- Size
- 14132 bytes
- Lines
- 508
- Domain
- Driver Families
- Bucket
- drivers/media
- 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
linux/iopoll.hlinux/pm_opp.hlinux/reset.hiris_core.hiris_instance.hiris_vpu_common.hiris_vpu_register_defines.h
Detected Declarations
function Copyrightfunction iris_vpu_setup_ucregion_memory_mapfunction iris_vpu_boot_firmwarefunction iris_vpu_raise_interruptfunction iris_vpu_clear_interruptfunction iris_vpu_watchdogfunction iris_vpu_prepare_pcfunction iris_vpu_power_off_controllerfunction iris_vpu_power_off_hwfunction iris_vpu_power_offfunction iris_vpu_power_on_controllerfunction iris_vpu_power_on_hwfunction iris_vpu_set_hwmodefunction iris_vpu_switch_to_hwmodefunction iris_vpu35_vpu4x_power_off_controllerfunction iris_vpu35_vpu4x_power_on_controllerfunction iris_vpu35_vpu4x_program_bootup_registersfunction iris_vpu3x_vpu4x_calculate_frequencyfunction iris_vpu_power_onfunction iris_vpu_set_preset_registers
Annotated Snippet
if ((ctrl_status & CTRL_ERROR_STATUS__M) == 0x4) {
dev_err(core->dev, "invalid setting for uc_region\n");
break;
}
usleep_range(50, 100);
count++;
}
if (count >= max_tries) {
dev_err(core->dev, "error booting up iris firmware\n");
return -ETIME;
}
writel(HOST2XTENSA_INTR_ENABLE, core->reg_base + CPU_CS_H2XSOFTINTEN);
writel(0x0, core->reg_base + CPU_CS_X2RPMH);
return 0;
}
void iris_vpu_raise_interrupt(struct iris_core *core)
{
writel(1 << CPU_IC_SOFTINT_H2A_SHFT, core->reg_base + CPU_IC_SOFTINT);
}
void iris_vpu_clear_interrupt(struct iris_core *core)
{
u32 intr_status, mask;
intr_status = readl(core->reg_base + WRAPPER_INTR_STATUS);
mask = (WRAPPER_INTR_STATUS_A2H_BMSK |
WRAPPER_INTR_STATUS_A2HWD_BMSK |
CTRL_INIT_IDLE_MSG_BMSK);
if (intr_status & mask)
core->intr_status |= intr_status;
writel(CLEAR_XTENSA2HOST_INTR, core->reg_base + CPU_CS_A2HSOFTINTCLR);
}
int iris_vpu_watchdog(struct iris_core *core, u32 intr_status)
{
if (intr_status & WRAPPER_INTR_STATUS_A2HWD_BMSK) {
dev_err(core->dev, "received watchdog interrupt\n");
return -ETIME;
}
return 0;
}
int iris_vpu_prepare_pc(struct iris_core *core)
{
u32 wfi_status, idle_status, pc_ready;
u32 ctrl_status, val = 0;
int ret;
ctrl_status = readl(core->reg_base + CTRL_STATUS);
pc_ready = ctrl_status & CTRL_STATUS_PC_READY;
idle_status = ctrl_status & BIT(30);
if (pc_ready)
return 0;
wfi_status = readl(core->reg_base + WRAPPER_TZ_CPU_STATUS);
wfi_status &= BIT(0);
if (!wfi_status || !idle_status)
goto skip_power_off;
ret = core->hfi_sys_ops->sys_pc_prep(core);
if (ret)
goto skip_power_off;
ret = readl_poll_timeout(core->reg_base + CTRL_STATUS, val,
val & CTRL_STATUS_PC_READY, 250, 2500);
if (ret)
goto skip_power_off;
ret = readl_poll_timeout(core->reg_base + WRAPPER_TZ_CPU_STATUS,
val, val & BIT(0), 250, 2500);
if (ret)
goto skip_power_off;
return 0;
skip_power_off:
ctrl_status = readl(core->reg_base + CTRL_STATUS);
wfi_status = readl(core->reg_base + WRAPPER_TZ_CPU_STATUS);
wfi_status &= BIT(0);
dev_err(core->dev, "skip power collapse, wfi=%#x, idle=%#x, pcr=%#x, ctrl=%#x)\n",
wfi_status, idle_status, pc_ready, ctrl_status);
Annotation
- Immediate include surface: `linux/iopoll.h`, `linux/pm_opp.h`, `linux/reset.h`, `iris_core.h`, `iris_instance.h`, `iris_vpu_common.h`, `iris_vpu_register_defines.h`.
- Detected declarations: `function Copyright`, `function iris_vpu_setup_ucregion_memory_map`, `function iris_vpu_boot_firmware`, `function iris_vpu_raise_interrupt`, `function iris_vpu_clear_interrupt`, `function iris_vpu_watchdog`, `function iris_vpu_prepare_pc`, `function iris_vpu_power_off_controller`, `function iris_vpu_power_off_hw`, `function iris_vpu_power_off`.
- Atlas domain: Driver Families / drivers/media.
- 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.