Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/Linux/drivers/devfreq/   (Open Source Betriebssystem Version 6.17.9©)  Datei vom 24.10.2025 mit Größe 3 kB image not shown  

Quelle  governor_simpleondemand.c   Sprache: C

 
// SPDX-License-Identifier: GPL-2.0-only
/*
 *  linux/drivers/devfreq/governor_simpleondemand.c
 *
 *  Copyright (C) 2011 Samsung Electronics
 * MyungJoo Ham <myungjoo.ham@samsung.com>
 */


#include <linux/errno.h>
#include <linux/module.h>
#include <linux/devfreq.h>
#include <linux/math64.h>
#include "governor.h"

/* Default constants for DevFreq-Simple-Ondemand (DFSO) */
#define DFSO_UPTHRESHOLD (90)
#define DFSO_DOWNDIFFERENCTIAL (5)
static int devfreq_simple_ondemand_func(struct devfreq *df,
     unsigned long *freq)
{
 int err;
 struct devfreq_dev_status *stat;
 unsigned long long a, b;
 unsigned int dfso_upthreshold = DFSO_UPTHRESHOLD;
 unsigned int dfso_downdifferential = DFSO_DOWNDIFFERENCTIAL;
 struct devfreq_simple_ondemand_data *data = df->data;

 err = devfreq_update_stats(df);
 if (err)
  return err;

 stat = &df->last_status;

 if (data) {
  if (data->upthreshold)
   dfso_upthreshold = data->upthreshold;
  if (data->downdifferential)
   dfso_downdifferential = data->downdifferential;
 }
 if (dfso_upthreshold > 100 ||
     dfso_upthreshold < dfso_downdifferential)
  return -EINVAL;

 /* Assume MAX if it is going to be divided by zero */
 if (stat->total_time == 0) {
  *freq = DEVFREQ_MAX_FREQ;
  return 0;
 }

 /* Prevent overflow */
 if (stat->busy_time >= (1 << 24) || stat->total_time >= (1 << 24)) {
  stat->busy_time >>= 7;
  stat->total_time >>= 7;
 }

 /* Set MAX if it's busy enough */
 if (stat->busy_time * 100 >
     stat->total_time * dfso_upthreshold) {
  *freq = DEVFREQ_MAX_FREQ;
  return 0;
 }

 /* Set MAX if we do not know the initial frequency */
 if (stat->current_frequency == 0) {
  *freq = DEVFREQ_MAX_FREQ;
  return 0;
 }

 /* Keep the current frequency */
 if (stat->busy_time * 100 >
     stat->total_time * (dfso_upthreshold - dfso_downdifferential)) {
  *freq = stat->current_frequency;
  return 0;
 }

 /* Set the desired frequency based on the load */
 a = stat->busy_time;
 a *= stat->current_frequency;
 b = div_u64(a, stat->total_time);
 b *= 100;
 b = div_u64(b, (dfso_upthreshold - dfso_downdifferential / 2));
 *freq = (unsigned long) b;

 return 0;
}

static int devfreq_simple_ondemand_handler(struct devfreq *devfreq,
    unsigned int event, void *data)
{
 switch (event) {
 case DEVFREQ_GOV_START:
  devfreq_monitor_start(devfreq);
  break;

 case DEVFREQ_GOV_STOP:
  devfreq_monitor_stop(devfreq);
  break;

 case DEVFREQ_GOV_UPDATE_INTERVAL:
  devfreq_update_interval(devfreq, (unsigned int *)data);
  break;

 case DEVFREQ_GOV_SUSPEND:
  devfreq_monitor_suspend(devfreq);
  break;

 case DEVFREQ_GOV_RESUME:
  devfreq_monitor_resume(devfreq);
  break;

 default:
  break;
 }

 return 0;
}

static struct devfreq_governor devfreq_simple_ondemand = {
 .name = DEVFREQ_GOV_SIMPLE_ONDEMAND,
 .attrs = DEVFREQ_GOV_ATTR_POLLING_INTERVAL
  | DEVFREQ_GOV_ATTR_TIMER,
 .get_target_freq = devfreq_simple_ondemand_func,
 .event_handler = devfreq_simple_ondemand_handler,
};

static int __init devfreq_simple_ondemand_init(void)
{
 return devfreq_add_governor(&devfreq_simple_ondemand);
}
subsys_initcall(devfreq_simple_ondemand_init);

static void __exit devfreq_simple_ondemand_exit(void)
{
 int ret;

 ret = devfreq_remove_governor(&devfreq_simple_ondemand);
 if (ret)
  pr_err("%s: failed remove governor %d\n", __func__, ret);

 return;
}
module_exit(devfreq_simple_ondemand_exit);
MODULE_DESCRIPTION("DEVFREQ Simple On-demand governor");
MODULE_LICENSE("GPL");

Messung V0.5
C=91 H=90 G=90

¤ Dauer der Verarbeitung: 0.3 Sekunden  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.