drivers/gpu/drm/i915/gt/selftest_slpc.c

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

File Facts

System
Linux kernel
Corpus path
drivers/gpu/drm/i915/gt/selftest_slpc.c
Extension
.c
Size
11993 bytes
Lines
558
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

struct slpc_thread {
	struct kthread_worker *worker;
	struct kthread_work work;
	struct intel_gt *gt;
	int result;
};

static int slpc_set_min_freq(struct intel_guc_slpc *slpc, u32 freq)
{
	int ret;

	ret = intel_guc_slpc_set_min_freq(slpc, freq);
	if (ret)
		pr_err("Could not set min frequency to [%u]\n", freq);
	else /* Delay to ensure h2g completes */
		delay_for_h2g();

	return ret;
}

static int slpc_set_max_freq(struct intel_guc_slpc *slpc, u32 freq)
{
	int ret;

	ret = intel_guc_slpc_set_max_freq(slpc, freq);
	if (ret)
		pr_err("Could not set maximum frequency [%u]\n",
		       freq);
	else /* Delay to ensure h2g completes */
		delay_for_h2g();

	return ret;
}

static int slpc_set_freq(struct intel_gt *gt, u32 freq)
{
	int err;
	struct intel_guc_slpc *slpc = &gt_to_guc(gt)->slpc;

	err = slpc_set_max_freq(slpc, freq);
	if (err) {
		pr_err("Unable to update max freq");
		return err;
	}

	err = slpc_set_min_freq(slpc, freq);
	if (err) {
		pr_err("Unable to update min freq");
		return err;
	}

	return err;
}

static int slpc_restore_freq(struct intel_guc_slpc *slpc, u32 min, u32 max)
{
	int err;

	err = slpc_set_max_freq(slpc, max);
	if (err) {
		pr_err("Unable to restore max freq");
		return err;
	}

	err = slpc_set_min_freq(slpc, min);
	if (err) {
		pr_err("Unable to restore min freq");
		return err;
	}

	err = intel_guc_slpc_set_ignore_eff_freq(slpc, false);
	if (err) {
		pr_err("Unable to restore efficient freq");
		return err;
	}

	return 0;
}

static u64 slpc_measure_power(struct intel_rps *rps, int *freq)
{
	u64 x[5];
	int i;

	for (i = 0; i < 5; i++)
		x[i] = __measure_power(5);

	*freq = (*freq + intel_rps_read_actual_frequency(rps)) / 2;

	/* A simple triangle filter for better result stability */

Annotation

Implementation Notes