drivers/gpu/drm/vkms/vkms_crtc.c
Source file repositories/reference/linux-study-clean/drivers/gpu/drm/vkms/vkms_crtc.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/gpu/drm/vkms/vkms_crtc.c- Extension
.c- Size
- 6554 bytes
- Lines
- 242
- 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.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/dma-fence.hdrm/drm_atomic.hdrm/drm_atomic_helper.hdrm/drm_blend.hdrm/drm_managed.hdrm/drm_print.hdrm/drm_probe_helper.hdrm/drm_vblank.hdrm/drm_vblank_helper.hvkms_drv.h
Detected Declarations
function vkms_crtc_handle_vblank_timeoutfunction vkms_atomic_crtc_duplicate_statefunction vkms_atomic_crtc_destroy_statefunction vkms_atomic_crtc_resetfunction vkms_crtc_atomic_checkfunction drm_for_each_plane_maskfunction vkms_crtc_atomic_beginfunction vkms_crtc_atomic_flush
Annotated Snippet
// SPDX-License-Identifier: GPL-2.0+
#include <linux/dma-fence.h>
#include <drm/drm_atomic.h>
#include <drm/drm_atomic_helper.h>
#include <drm/drm_blend.h>
#include <drm/drm_managed.h>
#include <drm/drm_print.h>
#include <drm/drm_probe_helper.h>
#include <drm/drm_vblank.h>
#include <drm/drm_vblank_helper.h>
#include "vkms_drv.h"
static bool vkms_crtc_handle_vblank_timeout(struct drm_crtc *crtc)
{
struct vkms_output *output = drm_crtc_to_vkms_output(crtc);
struct vkms_crtc_state *state;
bool ret, fence_cookie;
fence_cookie = dma_fence_begin_signalling();
spin_lock(&output->lock);
ret = drm_crtc_handle_vblank(crtc);
if (!ret)
DRM_ERROR("vkms failure on handling vblank");
state = output->composer_state;
spin_unlock(&output->lock);
if (state && output->composer_enabled) {
u64 frame = drm_crtc_accurate_vblank_count(crtc);
/* update frame_start only if a queued vkms_composer_worker()
* has read the data
*/
spin_lock(&output->composer_lock);
if (!state->crc_pending)
state->frame_start = frame;
else
DRM_DEBUG_DRIVER("crc worker falling behind, frame_start: %llu, frame_end: %llu\n",
state->frame_start, frame);
state->frame_end = frame;
state->crc_pending = true;
spin_unlock(&output->composer_lock);
ret = queue_work(output->composer_workq, &state->composer_work);
if (!ret)
DRM_DEBUG_DRIVER("Composer worker already queued\n");
}
dma_fence_end_signalling(fence_cookie);
return true;
}
static struct drm_crtc_state *
vkms_atomic_crtc_duplicate_state(struct drm_crtc *crtc)
{
struct vkms_crtc_state *vkms_state;
if (WARN_ON(!crtc->state))
return NULL;
vkms_state = kzalloc_obj(*vkms_state);
if (!vkms_state)
return NULL;
__drm_atomic_helper_crtc_duplicate_state(crtc, &vkms_state->base);
INIT_WORK(&vkms_state->composer_work, vkms_composer_worker);
return &vkms_state->base;
}
static void vkms_atomic_crtc_destroy_state(struct drm_crtc *crtc,
struct drm_crtc_state *state)
{
struct vkms_crtc_state *vkms_state = to_vkms_crtc_state(state);
__drm_atomic_helper_crtc_destroy_state(state);
WARN_ON(work_pending(&vkms_state->composer_work));
kfree(vkms_state->active_planes);
kfree(vkms_state);
}
static void vkms_atomic_crtc_reset(struct drm_crtc *crtc)
{
Annotation
- Immediate include surface: `linux/dma-fence.h`, `drm/drm_atomic.h`, `drm/drm_atomic_helper.h`, `drm/drm_blend.h`, `drm/drm_managed.h`, `drm/drm_print.h`, `drm/drm_probe_helper.h`, `drm/drm_vblank.h`.
- Detected declarations: `function vkms_crtc_handle_vblank_timeout`, `function vkms_atomic_crtc_duplicate_state`, `function vkms_atomic_crtc_destroy_state`, `function vkms_atomic_crtc_reset`, `function vkms_crtc_atomic_check`, `function drm_for_each_plane_mask`, `function vkms_crtc_atomic_begin`, `function vkms_crtc_atomic_flush`.
- Atlas domain: Driver Families / drivers/gpu.
- Implementation status: source implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
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.