예제 #1
0
static void slots_fan_tick(void)
{
	s32 power;
	int speed;
	int err;

	if (!slots_fan || !slots_power)
		return;
	if (!slots_started) {
		/* first time; initialize things */
;
		wf_pid_init(&slots_pid, &slots_param);
		slots_started = 1;
	}

	err = slots_power->ops->get_value(slots_power, &power);
	if (err) {
//		printk(KERN_WARNING "windfarm: slots power sensor error %d\n",
;
		failure_state |= FAILURE_SENSOR;
		wf_control_set_max(slots_fan);
		return;
	}
	speed = wf_pid_run(&slots_pid, power);
	DBG_LOTS("slots PID power=%d.%.3d speed=%d\n",
		 FIX32TOPRINT(power), speed);

	err = slots_fan->ops->set_value(slots_fan, speed);
	if (err) {
;
		failure_state |= FAILURE_FAN;
	}
}
static void backside_setup_pid(void)
{
    /* first time initialize things */
    s32 fmin = wf_control_get_min(backside_fan);
    s32 fmax = wf_control_get_max(backside_fan);
    struct wf_pid_param param;
    struct device_node *u3;
    int u3h = 1; /* conservative by default */

    u3 = of_find_node_by_path("/u3@0,f8000000");
    if (u3 != NULL) {
        const u32 *vers = of_get_property(u3, "device-rev", NULL);
        if (vers)
            if (((*vers) & 0x3f) < 0x34)
                u3h = 0;
        of_node_put(u3);
    }

    param = u3h ? backside_u3h_param : backside_u3_param;

    param.min = max(param.min, fmin);
    param.max = min(param.max, fmax);
    wf_pid_init(&backside_pid, &param);
    backside_tick = 1;

    pr_info("wf_pm72: Backside control loop started.\n");
}
예제 #3
0
static void backside_setup_pid(void)
{
	/* first time initialize things */
	s32 fmin = wf_control_get_min(backside_fan);
	s32 fmax = wf_control_get_max(backside_fan);
	struct wf_pid_param param;

	param = backside_param;
	param.min = max(param.min, fmin);
	param.max = min(param.max, fmax);
	wf_pid_init(&backside_pid, &param);

	param = dimms_param;
	wf_pid_init(&dimms_pid, &param);

	backside_tick = 1;

	pr_info("wf_rm31: Backside control loop started.\n");
}
예제 #4
0
static void slots_setup_pid(void)
{
	/* first time initialize things */
	s32 fmin = wf_control_get_min(slots_fan);
	s32 fmax = wf_control_get_max(slots_fan);
	struct wf_pid_param param = slots_param;

	param.min = max(param.min, fmin);
	param.max = min(param.max, fmax);
	wf_pid_init(&slots_pid, &param);
	slots_tick = 1;

	pr_info("wf_rm31: Slots control loop started.\n");
}
static void drives_setup_pid(void)
{
    /* first time initialize things */
    s32 fmin = wf_control_get_min(drives_fan);
    s32 fmax = wf_control_get_max(drives_fan);
    struct wf_pid_param param = drives_param;

    param.min = max(param.min, fmin);
    param.max = min(param.max, fmax);
    wf_pid_init(&drives_pid, &param);
    drives_tick = 1;

    pr_info("wf_pm72: Drive bay control loop started.\n");
}
예제 #6
0
static void drive_bay_fan_tick(void)
{
	s32 temp;
	int speed;
	int err;

	if (!drive_bay_fan || !hd_temp)
		return;
	if (!drive_bay_tick) {
		/* first time; initialize things */
;
		drive_bay_prm.min = drive_bay_fan->ops->get_min(drive_bay_fan);
		drive_bay_prm.max = drive_bay_fan->ops->get_max(drive_bay_fan);
		wf_pid_init(&drive_bay_pid, &drive_bay_prm);
		drive_bay_tick = 1;
	}
	if (--drive_bay_tick > 0)
		return;
	drive_bay_tick = drive_bay_pid.param.interval;

	err = hd_temp->ops->get_value(hd_temp, &temp);
	if (err) {
//		printk(KERN_WARNING "windfarm: drive bay temp sensor "
;
		failure_state |= FAILURE_SENSOR;
		wf_control_set_max(drive_bay_fan);
		return;
	}
	speed = wf_pid_run(&drive_bay_pid, temp);
	DBG_LOTS("drive_bay PID temp=%d.%.3d speed=%d\n",
		 FIX32TOPRINT(temp), speed);

	err = drive_bay_fan->ops->set_value(drive_bay_fan, speed);
	if (err) {
;
		failure_state |= FAILURE_FAN;
	}
}
예제 #7
0
static void backside_fan_tick(void)
{
	s32 temp;
	int speed;
	int err;

	if (!backside_fan || !u4_temp)
		return;
	if (!backside_tick) {
		/* first time; initialize things */
;
		backside_param.min = backside_fan->ops->get_min(backside_fan);
		backside_param.max = backside_fan->ops->get_max(backside_fan);
		wf_pid_init(&backside_pid, &backside_param);
		backside_tick = 1;
	}
	if (--backside_tick > 0)
		return;
	backside_tick = backside_pid.param.interval;

	err = u4_temp->ops->get_value(u4_temp, &temp);
	if (err) {
//		printk(KERN_WARNING "windfarm: U4 temp sensor error %d\n",
;
		failure_state |= FAILURE_SENSOR;
		wf_control_set_max(backside_fan);
		return;
	}
	speed = wf_pid_run(&backside_pid, temp);
	DBG_LOTS("backside PID temp=%d.%.3d speed=%d\n",
		 FIX32TOPRINT(temp), speed);

	err = backside_fan->ops->set_value(backside_fan, speed);
	if (err) {
;
		failure_state |= FAILURE_FAN;
	}
}
static void wf_smu_create_slots_fans(void)
{
    struct wf_pid_param param = {
        .interval	= 1,
        .history_len	= 8,
        .gd		= 0x00000000,
        .gp		= 0x00000000,
        .gr		= 0x00020000,
        .itarget	= 0x00000000
    };

    /* Alloc & initialize state */
    wf_smu_slots_fans = kmalloc(sizeof(struct wf_smu_slots_fans_state),
                                GFP_KERNEL);
    if (wf_smu_slots_fans == NULL) {
        printk(KERN_WARNING "windfarm: Memory allocation error"
               " max fan speed\n");
        goto fail;
    }
    wf_smu_slots_fans->ticks = 1;

    /* Fill PID params */
    param.additive = (fan_slots->type == WF_CONTROL_RPM_FAN);
    param.min = fan_slots->ops->get_min(fan_slots);
    param.max = fan_slots->ops->get_max(fan_slots);
    wf_pid_init(&wf_smu_slots_fans->pid, &param);

    DBG("wf: Slots Fan control initialized.\n");
    DBG("    itarged=%d.%03d, min=%d RPM, max=%d RPM\n",
        FIX32TOPRINT(param.itarget), param.min, param.max);
    return;

fail:
    if (fan_slots)
        wf_control_set_max(fan_slots);
}

static void wf_smu_slots_fans_tick(struct wf_smu_slots_fans_state *st)
{
    s32 new_setpoint, power;
    int rc;

    if (--st->ticks != 0) {
        if (wf_smu_readjust)
            goto readjust;
        return;
    }
    st->ticks = st->pid.param.interval;

    rc = sensor_slots_power->ops->get_value(sensor_slots_power, &power);
    if (rc) {
        printk(KERN_WARNING "windfarm: Slots power sensor error %d\n",
               rc);
        wf_smu_failure_state |= FAILURE_SENSOR;
        return;
    }

    DBG("wf_smu: Slots Fans tick ! Slots power: %d.%03d\n",
        FIX32TOPRINT(power));

#if 0 /* Check what makes a good overtemp condition */
    if (power > (st->pid.param.itarget + 0x50000))
        wf_smu_failure_state |= FAILURE_OVERTEMP;
#endif

    new_setpoint = wf_pid_run(&st->pid, power);

    DBG("wf_smu: new_setpoint: %d\n", (int)new_setpoint);

    if (st->setpoint == new_setpoint)
        return;
    st->setpoint = new_setpoint;
readjust:
    if (fan_slots && wf_smu_failure_state == 0) {
        rc = fan_slots->ops->set_value(fan_slots, st->setpoint);
        if (rc) {
            printk(KERN_WARNING "windfarm: Slots fan error %d\n",
                   rc);
            wf_smu_failure_state |= FAILURE_FAN;
        }
    }
}
static void wf_smu_create_drive_fans(void)
{
    struct wf_pid_param param = {
        .interval	= 5,
        .history_len	= 2,
        .gd		= 0x01e00000,
        .gp		= 0x00500000,
        .gr		= 0x00000000,
        .itarget	= 0x00200000,
    };

    /* Alloc & initialize state */
    wf_smu_drive_fans = kmalloc(sizeof(struct wf_smu_drive_fans_state),
                                GFP_KERNEL);
    if (wf_smu_drive_fans == NULL) {
        printk(KERN_WARNING "windfarm: Memory allocation error"
               " max fan speed\n");
        goto fail;
    }
    wf_smu_drive_fans->ticks = 1;

    /* Fill PID params */
    param.additive = (fan_hd->type == WF_CONTROL_RPM_FAN);
    param.min = fan_hd->ops->get_min(fan_hd);
    param.max = fan_hd->ops->get_max(fan_hd);
    wf_pid_init(&wf_smu_drive_fans->pid, &param);

    DBG("wf: Drive Fan control initialized.\n");
    DBG("    itarged=%d.%03d, min=%d RPM, max=%d RPM\n",
        FIX32TOPRINT(param.itarget), param.min, param.max);
    return;

fail:
    if (fan_hd)
        wf_control_set_max(fan_hd);
}

static void wf_smu_drive_fans_tick(struct wf_smu_drive_fans_state *st)
{
    s32 new_setpoint, temp;
    int rc;

    if (--st->ticks != 0) {
        if (wf_smu_readjust)
            goto readjust;
        return;
    }
    st->ticks = st->pid.param.interval;

    rc = sensor_hd_temp->ops->get_value(sensor_hd_temp, &temp);
    if (rc) {
        printk(KERN_WARNING "windfarm: HD temp sensor error %d\n",
               rc);
        wf_smu_failure_state |= FAILURE_SENSOR;
        return;
    }

    DBG("wf_smu: Drive Fans tick ! HD temp: %d.%03d\n",
        FIX32TOPRINT(temp));

    if (temp > (st->pid.param.itarget + 0x50000))
        wf_smu_failure_state |= FAILURE_OVERTEMP;

    new_setpoint = wf_pid_run(&st->pid, temp);

    DBG("wf_smu: new_setpoint: %d\n", (int)new_setpoint);

    if (st->setpoint == new_setpoint)
        return;
    st->setpoint = new_setpoint;
readjust:
    if (fan_hd && wf_smu_failure_state == 0) {
        rc = fan_hd->ops->set_value(fan_hd, st->setpoint);
        if (rc) {
            printk(KERN_WARNING "windfarm: HD fan error %d\n",
                   rc);
            wf_smu_failure_state |= FAILURE_FAN;
        }
    }
}