drivers/gpu/drm/i915/i915_drm_client.c

Source file repositories/reference/linux-study-clean/drivers/gpu/drm/i915/i915_drm_client.c

File Facts

System
Linux kernel
Corpus path
drivers/gpu/drm/i915/i915_drm_client.c
Extension
.c
Size
5631 bytes
Lines
221
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.

Dependency Surface

Detected Declarations

Annotated Snippet

// SPDX-License-Identifier: MIT
/*
 * Copyright © 2020 Intel Corporation
 */

#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/types.h>

#include <uapi/drm/i915_drm.h>

#include <drm/drm_print.h>

#include "gem/i915_gem_context.h"
#include "i915_drm_client.h"
#include "i915_file_private.h"
#include "i915_gem.h"
#include "i915_utils.h"

struct i915_drm_client *i915_drm_client_alloc(void)
{
	struct i915_drm_client *client;

	client = kzalloc_obj(*client);
	if (!client)
		return NULL;

	kref_init(&client->kref);
	spin_lock_init(&client->ctx_lock);
	INIT_LIST_HEAD(&client->ctx_list);
#ifdef CONFIG_PROC_FS
	spin_lock_init(&client->objects_lock);
	INIT_LIST_HEAD(&client->objects_list);
#endif

	return client;
}

void __i915_drm_client_free(struct kref *kref)
{
	struct i915_drm_client *client =
		container_of(kref, typeof(*client), kref);

	kfree(client);
}

#ifdef CONFIG_PROC_FS
static void
obj_meminfo(struct drm_i915_gem_object *obj,
	    struct drm_memory_stats stats[INTEL_REGION_UNKNOWN])
{
	const enum intel_region_id id = obj->mm.region ?
					obj->mm.region->id : INTEL_REGION_SMEM;
	const u64 sz = obj->base.size;

	if (drm_gem_object_is_shared_for_memory_stats(&obj->base))
		stats[id].shared += sz;
	else
		stats[id].private += sz;

	if (i915_gem_object_has_pages(obj)) {
		stats[id].resident += sz;

		if (!dma_resv_test_signaled(obj->base.resv,
					    DMA_RESV_USAGE_BOOKKEEP))
			stats[id].active += sz;
		else if (i915_gem_object_is_shrinkable(obj) &&
			 obj->mm.madv == I915_MADV_DONTNEED)
			stats[id].purgeable += sz;
	}
}

static void show_meminfo(struct drm_printer *p, struct drm_file *file)
{
	struct drm_memory_stats stats[INTEL_REGION_UNKNOWN] = {};
	struct drm_i915_file_private *fpriv = file->driver_priv;
	struct i915_drm_client *client = fpriv->client;
	struct drm_i915_private *i915 = fpriv->i915;
	struct drm_i915_gem_object *obj;
	struct intel_memory_region *mr;
	struct list_head __rcu *pos;
	unsigned int id;

	/* Public objects. */
	spin_lock(&file->table_lock);
	idr_for_each_entry(&file->object_idr, obj, id)
		obj_meminfo(obj, stats);
	spin_unlock(&file->table_lock);

	/* Internal objects. */

Annotation

Implementation Notes