brintos

brintos / linux-shallow public Read only

0
0
Text · 2.7 KiB · 335613a Raw
90 lines · c
1/* SPDX-License-Identifier: GPL-2.0-only */2#ifndef _WINDFARM_PID_H3#define _WINDFARM_PID_H4 5/*6 * Windfarm PowerMac thermal control. Generic PID helpers7 *8 * (c) Copyright 2005 Benjamin Herrenschmidt, IBM Corp.9 *                    <benh@kernel.crashing.org>10 *11 * This is a pair of generic PID helpers that can be used by12 * control loops. One is the basic PID implementation, the13 * other one is more specifically tailored to the loops used14 * for CPU control with 2 input sample types (temp and power)15 */16 17/*18 * *** Simple PID ***19 */20 21#define WF_PID_MAX_HISTORY	3222 23/* This parameter array is passed to the PID algorithm. Currently,24 * we don't support changing parameters on the fly as it's not needed25 * but could be implemented (with necessary adjustment of the history26 * buffer27 */28struct wf_pid_param {29	int	interval;	/* Interval between samples in seconds */30	int	history_len;	/* Size of history buffer */31	int	additive;	/* 1: target relative to previous value */32	s32	gd, gp, gr;	/* PID gains */33	s32	itarget;	/* PID input target */34	s32	min,max;	/* min and max target values */35};36 37struct wf_pid_state {38	int	first;				/* first run of the loop */39	int	index; 				/* index of current sample */40	s32	target;				/* current target value */41	s32	samples[WF_PID_MAX_HISTORY];	/* samples history buffer */42	s32	errors[WF_PID_MAX_HISTORY];	/* error history buffer */43 44	struct wf_pid_param param;45};46 47extern void wf_pid_init(struct wf_pid_state *st, struct wf_pid_param *param);48extern s32 wf_pid_run(struct wf_pid_state *st, s32 sample);49 50 51/*52 * *** CPU PID ***53 */54 55#define WF_CPU_PID_MAX_HISTORY	3256 57/* This parameter array is passed to the CPU PID algorithm. Currently,58 * we don't support changing parameters on the fly as it's not needed59 * but could be implemented (with necessary adjustment of the history60 * buffer61 */62struct wf_cpu_pid_param {63	int	interval;	/* Interval between samples in seconds */64	int	history_len;	/* Size of history buffer */65	s32	gd, gp, gr;	/* PID gains */66	s32	pmaxadj;	/* PID max power adjust */67	s32	ttarget;	/* PID input target */68	s32	tmax;		/* PID input max */69	s32	min,max;	/* min and max target values */70};71 72struct wf_cpu_pid_state {73	int	first;				/* first run of the loop */74	int	index; 				/* index of current power */75	int	tindex; 			/* index of current temp */76	s32	target;				/* current target value */77	s32	last_delta;			/* last Tactual - Ttarget */78	s32	powers[WF_PID_MAX_HISTORY];	/* power history buffer */79	s32	errors[WF_PID_MAX_HISTORY];	/* error history buffer */80	s32	temps[2];			/* temp. history buffer */81 82	struct wf_cpu_pid_param param;83};84 85extern void wf_cpu_pid_init(struct wf_cpu_pid_state *st,86			    struct wf_cpu_pid_param *param);87extern s32 wf_cpu_pid_run(struct wf_cpu_pid_state *st, s32 power, s32 temp);88 89#endif /* _WINDFARM_PID_H */90