OpenCores
URL https://opencores.org/ocsvn/or1k_soc_on_altera_embedded_dev_kit/or1k_soc_on_altera_embedded_dev_kit/trunk

Subversion Repositories or1k_soc_on_altera_embedded_dev_kit

[/] [or1k_soc_on_altera_embedded_dev_kit/] [trunk/] [linux-2.6/] [linux-2.6.24/] [arch/] [x86/] [mach-voyager/] [voyager_thread.c] - Blame information for rev 3

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 xianfeng
/* -*- mode: c; c-basic-offset: 8 -*- */
2
 
3
/* Copyright (C) 2001
4
 *
5
 * Author: J.E.J.Bottomley@HansenPartnership.com
6
 *
7
 * linux/arch/i386/kernel/voyager_thread.c
8
 *
9
 * This module provides the machine status monitor thread for the
10
 * voyager architecture.  This allows us to monitor the machine
11
 * environment (temp, voltage, fan function) and the front panel and
12
 * internal UPS.  If a fault is detected, this thread takes corrective
13
 * action (usually just informing init)
14
 * */
15
 
16
#include <linux/module.h>
17
#include <linux/mm.h>
18
#include <linux/kernel_stat.h>
19
#include <linux/delay.h>
20
#include <linux/mc146818rtc.h>
21
#include <linux/init.h>
22
#include <linux/bootmem.h>
23
#include <linux/kmod.h>
24
#include <linux/completion.h>
25
#include <linux/sched.h>
26
#include <linux/kthread.h>
27
#include <asm/desc.h>
28
#include <asm/voyager.h>
29
#include <asm/vic.h>
30
#include <asm/mtrr.h>
31
#include <asm/msr.h>
32
 
33
 
34
struct task_struct *voyager_thread;
35
static __u8 set_timeout;
36
 
37
static int
38
execute(const char *string)
39
{
40
        int ret;
41
 
42
        char *envp[] = {
43
                "HOME=/",
44
                "TERM=linux",
45
                "PATH=/sbin:/usr/sbin:/bin:/usr/bin",
46
                NULL,
47
        };
48
        char *argv[] = {
49
                "/bin/bash",
50
                "-c",
51
                (char *)string,
52
                NULL,
53
        };
54
 
55
        if ((ret = call_usermodehelper(argv[0], argv, envp, UMH_WAIT_PROC)) != 0) {
56
                printk(KERN_ERR "Voyager failed to run \"%s\": %i\n",
57
                       string, ret);
58
        }
59
        return ret;
60
}
61
 
62
static void
63
check_from_kernel(void)
64
{
65
        if(voyager_status.switch_off) {
66
 
67
                /* FIXME: This should be configurable via proc */
68
                execute("umask 600; echo 0 > /etc/initrunlvl; kill -HUP 1");
69
        } else if(voyager_status.power_fail) {
70
                VDEBUG(("Voyager daemon detected AC power failure\n"));
71
 
72
                /* FIXME: This should be configureable via proc */
73
                execute("umask 600; echo F > /etc/powerstatus; kill -PWR 1");
74
                set_timeout = 1;
75
        }
76
}
77
 
78
static void
79
check_continuing_condition(void)
80
{
81
        if(voyager_status.power_fail) {
82
                __u8 data;
83
                voyager_cat_psi(VOYAGER_PSI_SUBREAD,
84
                                VOYAGER_PSI_AC_FAIL_REG, &data);
85
                if((data & 0x1f) == 0) {
86
                        /* all power restored */
87
                        printk(KERN_NOTICE "VOYAGER AC power restored, cancelling shutdown\n");
88
                        /* FIXME: should be user configureable */
89
                        execute("umask 600; echo O > /etc/powerstatus; kill -PWR 1");
90
                        set_timeout = 0;
91
                }
92
        }
93
}
94
 
95
static int
96
thread(void *unused)
97
{
98
        printk(KERN_NOTICE "Voyager starting monitor thread\n");
99
 
100
        for (;;) {
101
                set_current_state(TASK_INTERRUPTIBLE);
102
                schedule_timeout(set_timeout ? HZ : MAX_SCHEDULE_TIMEOUT);
103
 
104
                VDEBUG(("Voyager Daemon awoken\n"));
105
                if(voyager_status.request_from_kernel == 0) {
106
                        /* probably awoken from timeout */
107
                        check_continuing_condition();
108
                } else {
109
                        check_from_kernel();
110
                        voyager_status.request_from_kernel = 0;
111
                }
112
        }
113
}
114
 
115
static int __init
116
voyager_thread_start(void)
117
{
118
        voyager_thread = kthread_run(thread, NULL, "kvoyagerd");
119
        if (IS_ERR(voyager_thread)) {
120
                printk(KERN_ERR "Voyager: Failed to create system monitor thread.\n");
121
                return PTR_ERR(voyager_thread);
122
        }
123
        return 0;
124
}
125
 
126
 
127
static void __exit
128
voyager_thread_stop(void)
129
{
130
        kthread_stop(voyager_thread);
131
}
132
 
133
module_init(voyager_thread_start);
134
module_exit(voyager_thread_stop);

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.