drivers/platform/x86/amd/pmf/sps.c

Source file repositories/reference/linux-study-clean/drivers/platform/x86/amd/pmf/sps.c

File Facts

System
Linux kernel
Corpus path
drivers/platform/x86/amd/pmf/sps.c
Extension
.c
Size
13062 bytes
Lines
445
Domain
Driver Families
Bucket
drivers/platform
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

static void amd_pmf_dump_sps_defaults(struct amd_pmf_static_slider_granular *data) {}
static void amd_pmf_dump_sps_defaults_v2(struct amd_pmf_static_slider_granular_v2 *data) {}
static void amd_pmf_dump_apts_sps_defaults(struct amd_pmf_apts_granular *info) {}
#endif

static void amd_pmf_load_apts_defaults_sps_v2(struct amd_pmf_dev *pdev)
{
	struct amd_pmf_apts_granular_output output;
	struct amd_pmf_apts_output *ps;
	int i;

	memset(&apts_config_store, 0, sizeof(apts_config_store));

	ps = apts_config_store.val;

	for (i = 0; i < APTS_MAX_STATES; i++) {
		apts_get_static_slider_granular_v2(pdev, &output, i);
		ps[i].table_version = output.val.table_version;
		ps[i].fan_table_idx = output.val.fan_table_idx;
		ps[i].pmf_ppt = output.val.pmf_ppt;
		ps[i].ppt_pmf_apu_only = output.val.ppt_pmf_apu_only;
		ps[i].stt_min_limit = output.val.stt_min_limit;
		ps[i].stt_skin_temp_limit_apu = output.val.stt_skin_temp_limit_apu;
		ps[i].stt_skin_temp_limit_hs2 = output.val.stt_skin_temp_limit_hs2;
	}

	amd_pmf_dump_apts_sps_defaults(&apts_config_store);
}

static void amd_pmf_load_defaults_sps_v2(struct amd_pmf_dev *dev)
{
	struct apmf_static_slider_granular_output_v2 output;
	unsigned int i, j;

	memset(&config_store_v2, 0, sizeof(config_store_v2));
	apmf_get_static_slider_granular_v2(dev, &output);

	config_store_v2.size = output.size;

	for (i = 0; i < POWER_SOURCE_MAX; i++)
		for (j = 0; j < POWER_MODE_V2_MAX; j++)
			config_store_v2.sps_idx.power_states[i][j] =
							output.sps_idx.power_states[i][j];

	amd_pmf_dump_sps_defaults_v2(&config_store_v2);
}

static void amd_pmf_load_defaults_sps(struct amd_pmf_dev *dev)
{
	struct apmf_static_slider_granular_output output;
	int i, j, idx = 0;

	memset(&config_store, 0, sizeof(config_store));
	apmf_get_static_slider_granular(dev, &output);

	for (i = 0; i < POWER_SOURCE_MAX; i++) {
		for (j = 0; j < POWER_MODE_MAX; j++) {
			config_store.prop[i][j].spl = output.prop[idx].spl;
			config_store.prop[i][j].sppt = output.prop[idx].sppt;
			config_store.prop[i][j].sppt_apu_only =
						output.prop[idx].sppt_apu_only;
			config_store.prop[i][j].fppt = output.prop[idx].fppt;
			config_store.prop[i][j].stt_min = output.prop[idx].stt_min;
			config_store.prop[i][j].stt_skin_temp[STT_TEMP_APU] =
					output.prop[idx].stt_skin_temp[STT_TEMP_APU];
			config_store.prop[i][j].stt_skin_temp[STT_TEMP_HS2] =
					output.prop[idx].stt_skin_temp[STT_TEMP_HS2];
			config_store.prop[i][j].fan_id = output.prop[idx].fan_id;
			idx++;
		}
	}
	amd_pmf_dump_sps_defaults(&config_store);
}

static void amd_pmf_update_slider_v2(struct amd_pmf_dev *dev, int idx)
{
	amd_pmf_send_cmd(dev, SET_PMF_PPT, SET_CMD, apts_config_store.val[idx].pmf_ppt, NULL);
	amd_pmf_send_cmd(dev, SET_PMF_PPT_APU_ONLY, SET_CMD,
			 apts_config_store.val[idx].ppt_pmf_apu_only, NULL);
	amd_pmf_send_cmd(dev, SET_STT_MIN_LIMIT, SET_CMD,
			 apts_config_store.val[idx].stt_min_limit, NULL);
	amd_pmf_send_cmd(dev, SET_STT_LIMIT_APU, SET_CMD,
			 fixp_q88_fromint(apts_config_store.val[idx].stt_skin_temp_limit_apu),
			 NULL);
	amd_pmf_send_cmd(dev, SET_STT_LIMIT_HS2, SET_CMD,
			 fixp_q88_fromint(apts_config_store.val[idx].stt_skin_temp_limit_hs2),
			 NULL);
}

void amd_pmf_update_slider(struct amd_pmf_dev *dev, bool op, int idx,

Annotation

Implementation Notes