⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dpm-core-2.6.16.patch

📁 Linus Dynamic Power Management Soruce code
💻 PATCH
📖 第 1 页 / 共 5 页
字号:
+static ssize_t policy_state ## index ## _store(struct kobject * kobj, \+					       const char * buf, \+			      size_t n) \+{ \+	struct dpm_policy *policy = to_policy(kobj); \+	struct dpm_classopt old_classopt; \+	int ret; \+ \+	dpm_lock(); \+	old_classopt = policy->classopt[index]; \+	if ((ret = dpm_map_policy_state(policy,index,(char *)buf))) \+		policy->classopt[index] = old_classopt; \+	dpm_unlock(); \+	return ret ? -EINVAL : n; \+} \+static struct dpm_policy_attribute policy_state ## index ## _attr = { \+        .attr   = { \+                .mode = 0644, \+        }, \+        .show   = policy_state ## index ## _show, \+        .store  = policy_state ## index ## _store, \+}; \++#define MAX_POLICY_STATES 20+POLICY_STATE_ATTR(0);+POLICY_STATE_ATTR(1);+POLICY_STATE_ATTR(2);+POLICY_STATE_ATTR(3);+POLICY_STATE_ATTR(4);+POLICY_STATE_ATTR(5);+POLICY_STATE_ATTR(6);+POLICY_STATE_ATTR(7);+POLICY_STATE_ATTR(8);+POLICY_STATE_ATTR(9);+POLICY_STATE_ATTR(10);+POLICY_STATE_ATTR(11);+POLICY_STATE_ATTR(12);+POLICY_STATE_ATTR(13);+POLICY_STATE_ATTR(14);+POLICY_STATE_ATTR(15);+POLICY_STATE_ATTR(16);+POLICY_STATE_ATTR(17);+POLICY_STATE_ATTR(18);+POLICY_STATE_ATTR(19);++static struct dpm_policy_attribute *policy_state_attr[MAX_POLICY_STATES] = {+	&policy_state0_attr,+	&policy_state1_attr,+	&policy_state2_attr,+	&policy_state3_attr,+	&policy_state4_attr,+	&policy_state5_attr,+	&policy_state6_attr,+	&policy_state7_attr,+	&policy_state8_attr,+	&policy_state9_attr,+	&policy_state10_attr,+	&policy_state11_attr,+	&policy_state12_attr,+	&policy_state13_attr,+	&policy_state14_attr,+	&policy_state15_attr,+	&policy_state16_attr,+	&policy_state17_attr,+	&policy_state18_attr,+	&policy_state19_attr,+};++static ssize_t+policy_attr_show(struct kobject * kobj, struct attribute * attr, char * buf)+{+	struct dpm_policy_attribute * policy_attr = to_policy_attr(attr);+	ssize_t ret = 0;++	if (policy_attr->show)+		ret = policy_attr->show(kobj,buf);+	return ret;+}++static ssize_t+policy_attr_store(struct kobject * kobj, struct attribute * attr,+		  const char * buf, size_t count)+{+	struct dpm_policy_attribute * policy_attr = to_policy_attr(attr);+	ssize_t ret = 0;++	if (policy_attr->store)+		ret = policy_attr->store(kobj,buf,count);+	return ret;+}++static struct dpm_policy_attribute a_policy_control_attr = {+        .attr   = {+                .name = "control",+                .mode = 0644,+        },+        .show   = a_policy_control_show,+        .store  = a_policy_control_store,+};++static struct sysfs_ops policy_sysfs_ops = {+	.show	= policy_attr_show,+	.store	= policy_attr_store,+};++static struct attribute * policy_default_attrs[] = {+	&a_policy_control_attr.attr,+	NULL,+};++static struct kobj_type ktype_policy = {+	.release        = dpm_kobj_release,+	.sysfs_ops	= &policy_sysfs_ops,+	.default_attrs	= policy_default_attrs,+};++void dpm_sysfs_new_policy(struct dpm_policy *policy)+{+	int i;++	memset(&policy->kobj, 0, sizeof(struct kobject));+	policy->kobj.kset = &dpm_subsys.kset,+	kobject_set_name(&policy->kobj,policy->name);+	policy->kobj.parent = &dpm_policy_kobj;+	policy->kobj.ktype = &ktype_policy;+	kobject_register(&policy->kobj);++	for (i = 0; (i < DPM_STATES) && (i < MAX_POLICY_STATES); i++) {+		policy_state_attr[i]->attr.name = dpm_state_names[i];+		sysfs_create_file(&policy->kobj, &policy_state_attr[i]->attr);+	}++	return;+}++void dpm_sysfs_destroy_policy(struct dpm_policy *policy)+{+	kobject_unregister(&policy->kobj);+	return;+}++/*+ * class+ */++struct dpm_class_attribute {+        struct attribute        attr;+        ssize_t (*show)(struct kobject * kobj, char * buf);+        ssize_t (*store)(struct kobject * kobj, const char * buf, size_t count);+};++#define to_class(obj) container_of(obj,struct dpm_class,kobj)+#define to_class_attr(_attr) container_of(_attr,struct dpm_class_attribute,attr)++static ssize_t class_control_show(struct subsystem * subsys, char * buf)+{+	ssize_t len = 0;+	struct list_head  * p;++	len += sprintf(buf + len, "classes: ");++	list_for_each(p, &dpm_classes) {+		len += sprintf(buf + len, "%s ",+			       ((struct dpm_class *)+				list_entry(p, struct dpm_class, list))->name);+	}++	len += sprintf(buf + len, "\nactive: %s\n",+		       (dpm_enabled && dpm_active_class) ?+		       dpm_active_class->name : "[none]");+	return len;+}++static ssize_t class_control_store(struct subsystem * subsys, const char * buf,+				   size_t n)+{+	int error = 0;+	char *tbuf = NULL;+	char *token[MAXTOKENS];+	int ntoks = tokenizer(&tbuf, buf, n, (char **) &token, MAXTOKENS);++	if (ntoks <= 0) {+		error = ntoks;+		goto out;+	}++	if (strcmp(token[0],"create") == 0) {+		if (ntoks < 3)+			printk("dpm: class create requires 1 name and at least one operating point argument\n");+		else+			error = dpm_create_class(token[1], &token[2], ntoks-2);+	} else+		error = -EINVAL;++ out:+	if (tbuf)+		kfree(tbuf);+        return error ? error : n;+}++static struct kobject dpm_class_kobj = {+	.kset = &dpm_subsys.kset,+};++dpm_attr(control,class_control);++static ssize_t a_class_control_show(struct kobject * kobj, char * buf)+{+	ssize_t len = 0;+	struct dpm_class *class = to_class(kobj);+	int i;++	len += sprintf(buf + len, "ops: ");++	for (i = 0; i < class->nops; i++)+		len += sprintf(buf + len, "%s ", class->ops[i]->name);+++	len += sprintf(buf + len, "\n");+	return len;+}++static ssize_t a_class_control_store(struct kobject * kobj, const char * buf,+				      size_t n)+{+	return n;+}++static ssize_t+class_attr_show(struct kobject * kobj, struct attribute * attr, char * buf)+{+	struct dpm_class_attribute * class_attr = to_class_attr(attr);+	ssize_t ret = 0;++	if (class_attr->show)+		ret = class_attr->show(kobj,buf);+	return ret;+}++static ssize_t+class_attr_store(struct kobject * kobj, struct attribute * attr,+		 const char * buf, size_t count)+{+	struct dpm_class_attribute * class_attr = to_class_attr(attr);+	ssize_t ret = 0;++	if (class_attr->store)+		ret = class_attr->store(kobj,buf,count);+	return ret;+}++static struct dpm_class_attribute a_class_control_attr = {+        .attr   = {+                .name = "control",+                .mode = 0644,+        },+        .show   = a_class_control_show,+        .store  = a_class_control_store,+};++static struct sysfs_ops class_sysfs_ops = {+	.show	= class_attr_show,+	.store	= class_attr_store,+};++static struct attribute * class_default_attrs[] = {+	&a_class_control_attr.attr,+	NULL,+};++static struct kobj_type ktype_class = {+	.release        = dpm_kobj_release,+	.sysfs_ops	= &class_sysfs_ops,+	.default_attrs	= class_default_attrs,+};++void dpm_sysfs_new_class(struct dpm_class *class)+{+	memset(&class->kobj, 0, sizeof(struct kobject));+	class->kobj.kset = &dpm_subsys.kset,+	kobject_set_name(&class->kobj,class->name);+	class->kobj.parent = &dpm_class_kobj;+	class->kobj.ktype = &ktype_class;+	kobject_register(&class->kobj);+	return;+}++void dpm_sysfs_destroy_class(struct dpm_class *class)+{+	kobject_unregister(&class->kobj);+	return;+}+++/*+ * op+ */++struct dpm_op_attribute {+        struct attribute        attr;+        ssize_t (*show)(struct kobject * kobj, char * buf);+        ssize_t (*store)(struct kobject * kobj, const char * buf, size_t count);+};++#define to_op(obj) container_of(obj,struct dpm_opt,kobj)+#define to_op_attr(_attr) container_of(_attr,struct dpm_op_attribute,attr)++static ssize_t op_control_show(struct subsystem * subsys, char * buf)+{+	unsigned long flags;+	ssize_t len = 0;++	if (dpm_lock_interruptible())+		return -ERESTARTSYS;++	len += sprintf(buf + len, "active: ");++	if (!dpm_enabled) {+		len += sprintf(buf + len, "[none]\n");+	} else {+		spin_lock_irqsave(&dpm_policy_lock, flags);+		len += sprintf(buf + len,"%s\n",+			       dpm_active_opt ? dpm_active_opt->name : "[none]");+		spin_unlock_irqrestore(&dpm_policy_lock, flags);+	}++	dpm_unlock();++	len += sprintf(buf + len, "params: %d\n", DPM_PP_NBR);+	return len;+}++static ssize_t op_control_store(struct subsystem * subsys, const char * buf,+				size_t n)+{+	int error = 0;+	char *tbuf = NULL;+	char *token[MAXTOKENS];+	int ntoks = tokenizer(&tbuf, buf, n, (char **) &token, MAXTOKENS);++	if (ntoks <= 0) {+		error = ntoks;+		goto out;+	}++	if ((strcmp(token[0],"create") == 0) && (ntoks >= 2)) {+		dpm_md_pp_t pp[DPM_PP_NBR];+		int i;++		for (i = 0; i < DPM_PP_NBR; i++) {+			if (i >= ntoks - 2)+				pp[i] = -1;+			else+				pp[i] = simple_strtol(token[i + 2],+						      NULL, 0);+		}++		error = dpm_create_opt(token[1], pp, DPM_PP_NBR);+	} else+		error = -EINVAL;++ out:+	if (tbuf)+		kfree(tbuf);+        return error ? error : n;++}++dpm_attr(control,op_control);++#ifdef CONFIG_DPM_STATS+static ssize_t op_stats_show(struct subsystem * subsys, char * buf)+{+	int len = 0;+	struct dpm_opt *opt;+	struct list_head *p;+	unsigned long long total_time;++	if (dpm_lock_interruptible())+		return -ERESTARTSYS;++	if (!dpm_enabled) {+		dpm_unlock();+		len += sprintf(buf + len, "DPM IS DISABLED\n");+		return len;+	}++	for (p = dpm_opts.next; p != &dpm_opts; p = p->next) {+		opt = list_entry(p, struct dpm_opt, list);+		len += sprintf(buf + len, "op: %s", opt->name);+		total_time = opt->stats.total_time;+		if (opt == dpm_active_opt)+			total_time += (unsigned long long) dpm_time() -+				opt->stats.start_time;+		len += sprintf(buf + len, " ticks: %Lu times: %lu\n",+			       (unsigned long long) dpm_time_to_usec(total_time),+			       opt->stats.count);+	}++	dpm_unlock();+	return len;+}++static ssize_t op_stats_store(struct subsystem * subsys, const char * buf,+			      size_t n)+{+	return n;+}++dpm_attr(stats, op_stats);+#endif /* CONFIG_DPM_STATS */+++static struct kobject dpm_op_kobj = {+	.kset = &dpm_subsys.kset,+};++static ssize_t an_op_control_show(struct kobject * kobj, char * buf)+{+	ssize_t len = 0;+	// struct dpm_opt *opt = to_op(kobj);++	len += sprintf(buf + len, "\n");+	return len;+}++static ssize_t an_op_control_store(struct kobject * kobj, const char * buf,+				   size_t n)+{+	return n;+}++static struct dpm_op_attribute an_op_control_attr = {+        .attr   = {+                .name = "control",+                .mode = 0644,+        },+        .show   = an_op_control_show,+        .store  = an_op_control_store,+};++static ssize_t op_force_show(struct kobject * kobj, char * buf)+{+	ssize_t len = 0;+	struct dpm_opt *opt = to_op(kobj);++	len += sprintf(buf + len, "%d\n", opt->flags & DPM_OP_FORCE ? 1 : 0);+	return len;+}++static ssize_t op_force_store(struct kobject * kobj, const char * buf,+			      size_t n)+{+	struct dpm_opt *opt = to_op(kobj);++	opt->flags = (opt->flags & ~DPM_OP_FORCE) |+		(simple_strtol(buf, NULL, 0) ? DPM_OP_FORCE : 0);+	return n;+}++static struct dpm_op_attribute op_force_attr = {+        .attr   = {+                .name = "force",+                .mode = 0644,+        },+        .show   = op_force_show,+        .store  = op_force_store,+};++#define OP_PARAM_ATTR(index) \+static ssize_t op_param ## index ## _show(struct kobject * kobj, char * buf) \+{ \+	ssize_t len = 0; \+	struct dpm_opt *opt = to_op(kobj); \+	len += sprintf(buf + len, "%d\n", opt->pp[index]); \+	return len; \+} \+static ssize_t op_param ## index ## _store(struct kobject * kobj, const char * buf, \+			      size_t n) \+{ \+	struct dpm_opt *opt = to_op(kobj); \+	int ret, oldval; \+ \+	oldval = opt->pp[index]; \+	opt->pp[index] = simple_strtol(buf, NULL, 0); \+	ret = dpm_md_init_opt(opt); \+	if (ret) \+		opt->pp[index] = oldval; \+	return ret ? ret : n; \+} \+static struct dpm_op_attribute op_param ## index ## _attr = { \+        .attr   = { \+                .mode = 0644, \+        }, \+        .show   = op_param ## index ## _show, \+        .store  = op_param ## index ## _store, \+}; \++#define MAX_OP_PARAMS 20+OP_PARAM_ATTR(0);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -