drivers/gpu/drm/imagination/pvr_job.c
Source file repositories/reference/linux-study-clean/drivers/gpu/drm/imagination/pvr_job.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/gpu/drm/imagination/pvr_job.c- Extension
.c- Size
- 19636 bytes
- Lines
- 784
- 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.
- 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
pvr_context.hpvr_device.hpvr_drv.hpvr_gem.hpvr_hwrt.hpvr_job.hpvr_mmu.hpvr_power.hpvr_rogue_fwif.hpvr_rogue_fwif_client.hpvr_stream.hpvr_stream_defs.hpvr_sync.hpvr_trace.hdrm/drm_exec.hdrm/drm_gem.hlinux/types.huapi/drm/pvr_drm.h
Detected Declarations
struct pvr_job_datafunction pvr_job_releasefunction pvr_job_putfunction pvr_job_process_streamfunction pvr_fw_cmd_initfunction convert_geom_flagsfunction convert_frag_flagsfunction pvr_geom_job_fw_cmd_initfunction pvr_frag_job_fw_cmd_initfunction convert_compute_flagsfunction pvr_compute_job_fw_cmd_initfunction convert_transfer_flagsfunction pvr_transfer_job_fw_cmd_initfunction pvr_job_fw_cmd_initfunction prepare_job_syncsfunction prepare_job_syncs_for_eachfunction create_jobfunction pvr_job_data_finifunction pvr_job_data_initfunction push_jobsfunction prepare_fw_obj_resvfunction jobs_lock_all_objsfunction prepare_job_resvs_for_eachfunction update_job_resvsfunction update_job_resvs_for_eachfunction can_combine_jobsfunction get_last_queued_job_scheduled_fencefunction pvr_jobs_link_geom_fragfunction pvr_submit_jobs
Annotated Snippet
struct pvr_job_data {
/** @job: Pointer to the job. */
struct pvr_job *job;
/** @sync_ops: Pointer to the sync_ops associated with @job. */
struct drm_pvr_sync_op *sync_ops;
/** @sync_op_count: Number of members of @sync_ops. */
u32 sync_op_count;
};
/**
* prepare_job_syncs() - Prepare all sync objects for a single job.
* @pvr_file: PowerVR file.
* @job_data: Precreated job and sync_ops array.
* @signal_array: xarray to receive signal sync objects.
*
* Returns:
* * 0 on success, or
* * Any error code returned by pvr_sync_signal_array_collect_ops(),
* pvr_sync_add_deps_to_job(), drm_sched_job_add_resv_dependencies() or
* pvr_sync_signal_array_update_fences().
*/
static int
prepare_job_syncs(struct pvr_file *pvr_file,
struct pvr_job_data *job_data,
struct xarray *signal_array)
{
struct dma_fence *finished_fence;
int err = pvr_sync_signal_array_collect_ops(signal_array,
from_pvr_file(pvr_file),
job_data->sync_op_count,
job_data->sync_ops);
if (err)
return err;
err = pvr_sync_add_deps_to_job(pvr_file, &job_data->job->base,
job_data->sync_op_count,
job_data->sync_ops, signal_array);
if (err)
return err;
if (job_data->job->hwrt) {
/* The geometry job writes the HWRT region headers, which are
* then read by the fragment job.
*/
struct drm_gem_object *obj =
gem_from_pvr_gem(job_data->job->hwrt->fw_obj->gem);
enum dma_resv_usage usage =
dma_resv_usage_rw(job_data->job->type ==
DRM_PVR_JOB_TYPE_GEOMETRY);
dma_resv_lock(obj->resv, NULL);
err = drm_sched_job_add_resv_dependencies(&job_data->job->base,
obj->resv, usage);
dma_resv_unlock(obj->resv);
if (err)
return err;
}
/* We need to arm the job to get the job finished fence. */
finished_fence = pvr_queue_job_arm(job_data->job);
err = pvr_sync_signal_array_update_fences(signal_array,
job_data->sync_op_count,
job_data->sync_ops,
finished_fence);
return err;
}
/**
* prepare_job_syncs_for_each() - Prepare all sync objects for an array of jobs.
* @pvr_file: PowerVR file.
* @job_data: Array of precreated jobs and their sync_ops.
* @job_count: Number of jobs.
* @signal_array: xarray to receive signal sync objects.
*
* Returns:
* * 0 on success, or
* * Any error code returned by pvr_vm_bind_job_prepare_syncs().
*/
static int
prepare_job_syncs_for_each(struct pvr_file *pvr_file,
struct pvr_job_data *job_data,
u32 *job_count,
struct xarray *signal_array)
{
for (u32 i = 0; i < *job_count; i++) {
int err = prepare_job_syncs(pvr_file, &job_data[i],
Annotation
- Immediate include surface: `pvr_context.h`, `pvr_device.h`, `pvr_drv.h`, `pvr_gem.h`, `pvr_hwrt.h`, `pvr_job.h`, `pvr_mmu.h`, `pvr_power.h`.
- Detected declarations: `struct pvr_job_data`, `function pvr_job_release`, `function pvr_job_put`, `function pvr_job_process_stream`, `function pvr_fw_cmd_init`, `function convert_geom_flags`, `function convert_frag_flags`, `function pvr_geom_job_fw_cmd_init`, `function pvr_frag_job_fw_cmd_init`, `function convert_compute_flags`.
- 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.