|
Packit |
577717 |
/* $Id: init.c,v 1.83 2007/10/06 13:02:07 mikpe Exp $
|
|
Packit |
577717 |
* Performance-monitoring counters driver.
|
|
Packit |
577717 |
* Top-level initialisation code.
|
|
Packit |
577717 |
*
|
|
Packit |
577717 |
* Copyright (C) 1999-2007 Mikael Pettersson
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
#include <linux/version.h>
|
|
Packit |
577717 |
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)
|
|
Packit |
577717 |
#include <linux/config.h>
|
|
Packit |
577717 |
#endif
|
|
Packit |
577717 |
#include <linux/fs.h>
|
|
Packit |
577717 |
#include <linux/init.h>
|
|
Packit |
577717 |
#include <linux/sched.h>
|
|
Packit |
577717 |
#include <linux/device.h>
|
|
Packit |
577717 |
#include <linux/perfctr.h>
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#include "cpumask.h"
|
|
Packit |
577717 |
#include "virtual.h"
|
|
Packit |
577717 |
#include "version.h"
|
|
Packit |
577717 |
|
|
Packit |
577717 |
struct perfctr_info perfctr_info;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static ssize_t
|
|
Packit |
577717 |
driver_version_show(struct class *class, char *buf)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
return sprintf(buf, "%s\n", VERSION);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static ssize_t
|
|
Packit |
577717 |
cpu_features_show(struct class *class, char *buf)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
return sprintf(buf, "%#x\n", perfctr_info.cpu_features);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static ssize_t
|
|
Packit |
577717 |
cpu_khz_show(struct class *class, char *buf)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
return sprintf(buf, "%u\n", perfctr_info.cpu_khz);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static ssize_t
|
|
Packit |
577717 |
tsc_to_cpu_mult_show(struct class *class, char *buf)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
return sprintf(buf, "%u\n", perfctr_info.tsc_to_cpu_mult);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static ssize_t
|
|
Packit |
577717 |
state_user_offset_show(struct class *class, char *buf)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
return sprintf(buf, "%u\n", (unsigned int)offsetof(struct perfctr_cpu_state, user));
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static ssize_t
|
|
Packit |
577717 |
cpus_online_show(struct class *class, char *buf)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
int ret = cpumask_scnprintf(buf, PAGE_SIZE-1, cpu_online_map);
|
|
Packit |
577717 |
buf[ret++] = '\n';
|
|
Packit |
577717 |
return ret;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static ssize_t
|
|
Packit |
577717 |
cpus_forbidden_show(struct class *class, char *buf)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
int ret = cpumask_scnprintf(buf, PAGE_SIZE-1, perfctr_cpus_forbidden_mask);
|
|
Packit |
577717 |
buf[ret++] = '\n';
|
|
Packit |
577717 |
return ret;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static struct class_attribute perfctr_class_attrs[] = {
|
|
Packit |
577717 |
__ATTR_RO(driver_version),
|
|
Packit |
577717 |
__ATTR_RO(cpu_features),
|
|
Packit |
577717 |
__ATTR_RO(cpu_khz),
|
|
Packit |
577717 |
__ATTR_RO(tsc_to_cpu_mult),
|
|
Packit |
577717 |
__ATTR_RO(state_user_offset),
|
|
Packit |
577717 |
__ATTR_RO(cpus_online),
|
|
Packit |
577717 |
__ATTR_RO(cpus_forbidden),
|
|
Packit |
577717 |
__ATTR_NULL
|
|
Packit |
577717 |
};
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static struct class perfctr_class = {
|
|
Packit |
577717 |
.name = "perfctr",
|
|
Packit |
577717 |
.class_attrs = perfctr_class_attrs,
|
|
Packit |
577717 |
};
|
|
Packit |
577717 |
|
|
Packit |
577717 |
char *perfctr_cpu_name __initdata;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static int __init perfctr_init(void)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
int err;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
err = perfctr_cpu_init();
|
|
Packit |
577717 |
if (err) {
|
|
Packit |
577717 |
printk(KERN_INFO "perfctr: not supported by this processor\n");
|
|
Packit |
577717 |
return err;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
err = vperfctr_init();
|
|
Packit |
577717 |
if (err)
|
|
Packit |
577717 |
return err;
|
|
Packit |
577717 |
err = class_register(&perfctr_class);
|
|
Packit |
577717 |
if (err) {
|
|
Packit |
577717 |
printk(KERN_ERR "perfctr: class initialisation failed\n");
|
|
Packit |
577717 |
return err;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
printk(KERN_INFO "perfctr: driver %s, cpu type %s at %u kHz\n",
|
|
Packit |
577717 |
VERSION,
|
|
Packit |
577717 |
perfctr_cpu_name,
|
|
Packit |
577717 |
perfctr_info.cpu_khz);
|
|
Packit |
577717 |
return 0;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static void __exit perfctr_exit(void)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
vperfctr_exit();
|
|
Packit |
577717 |
perfctr_cpu_exit();
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
module_init(perfctr_init)
|
|
Packit |
577717 |
module_exit(perfctr_exit)
|