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/] [tags/] [linux-2.6/] [linux-2.6.24_or32_unified_v2.3/] [kernel/] [irq/] [proc.c] - Blame information for rev 8

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 xianfeng
/*
2
 * linux/kernel/irq/proc.c
3
 *
4
 * Copyright (C) 1992, 1998-2004 Linus Torvalds, Ingo Molnar
5
 *
6
 * This file contains the /proc/irq/ handling code.
7
 */
8
 
9
#include <linux/irq.h>
10
#include <linux/proc_fs.h>
11
#include <linux/interrupt.h>
12
 
13
#include "internals.h"
14
 
15
static struct proc_dir_entry *root_irq_dir;
16
 
17
#ifdef CONFIG_SMP
18
 
19
static int irq_affinity_read_proc(char *page, char **start, off_t off,
20
                                  int count, int *eof, void *data)
21
{
22
        struct irq_desc *desc = irq_desc + (long)data;
23
        cpumask_t *mask = &desc->affinity;
24
        int len;
25
 
26
#ifdef CONFIG_GENERIC_PENDING_IRQ
27
        if (desc->status & IRQ_MOVE_PENDING)
28
                mask = &desc->pending_mask;
29
#endif
30
        len = cpumask_scnprintf(page, count, *mask);
31
 
32
        if (count - len < 2)
33
                return -EINVAL;
34
        len += sprintf(page + len, "\n");
35
        return len;
36
}
37
 
38
#ifndef is_affinity_mask_valid
39
#define is_affinity_mask_valid(val) 1
40
#endif
41
 
42
int no_irq_affinity;
43
static int irq_affinity_write_proc(struct file *file, const char __user *buffer,
44
                                   unsigned long count, void *data)
45
{
46
        unsigned int irq = (int)(long)data, full_count = count, err;
47
        cpumask_t new_value, tmp;
48
 
49
        if (!irq_desc[irq].chip->set_affinity || no_irq_affinity ||
50
            irq_balancing_disabled(irq))
51
                return -EIO;
52
 
53
        err = cpumask_parse_user(buffer, count, new_value);
54
        if (err)
55
                return err;
56
 
57
        if (!is_affinity_mask_valid(new_value))
58
                return -EINVAL;
59
 
60
        /*
61
         * Do not allow disabling IRQs completely - it's a too easy
62
         * way to make the system unusable accidentally :-) At least
63
         * one online CPU still has to be targeted.
64
         */
65
        cpus_and(tmp, new_value, cpu_online_map);
66
        if (cpus_empty(tmp))
67
                /* Special case for empty set - allow the architecture
68
                   code to set default SMP affinity. */
69
                return select_smp_affinity(irq) ? -EINVAL : full_count;
70
 
71
        irq_set_affinity(irq, new_value);
72
 
73
        return full_count;
74
}
75
 
76
#endif
77
 
78
#define MAX_NAMELEN 128
79
 
80
static int name_unique(unsigned int irq, struct irqaction *new_action)
81
{
82
        struct irq_desc *desc = irq_desc + irq;
83
        struct irqaction *action;
84
        unsigned long flags;
85
        int ret = 1;
86
 
87
        spin_lock_irqsave(&desc->lock, flags);
88
        for (action = desc->action ; action; action = action->next) {
89
                if ((action != new_action) && action->name &&
90
                                !strcmp(new_action->name, action->name)) {
91
                        ret = 0;
92
                        break;
93
                }
94
        }
95
        spin_unlock_irqrestore(&desc->lock, flags);
96
        return ret;
97
}
98
 
99
void register_handler_proc(unsigned int irq, struct irqaction *action)
100
{
101
        char name [MAX_NAMELEN];
102
 
103
        if (!irq_desc[irq].dir || action->dir || !action->name ||
104
                                        !name_unique(irq, action))
105
                return;
106
 
107
        memset(name, 0, MAX_NAMELEN);
108
        snprintf(name, MAX_NAMELEN, "%s", action->name);
109
 
110
        /* create /proc/irq/1234/handler/ */
111
        action->dir = proc_mkdir(name, irq_desc[irq].dir);
112
}
113
 
114
#undef MAX_NAMELEN
115
 
116
#define MAX_NAMELEN 10
117
 
118
void register_irq_proc(unsigned int irq)
119
{
120
        char name [MAX_NAMELEN];
121
 
122
        if (!root_irq_dir ||
123
                (irq_desc[irq].chip == &no_irq_chip) ||
124
                        irq_desc[irq].dir)
125
                return;
126
 
127
        memset(name, 0, MAX_NAMELEN);
128
        sprintf(name, "%d", irq);
129
 
130
        /* create /proc/irq/1234 */
131
        irq_desc[irq].dir = proc_mkdir(name, root_irq_dir);
132
 
133
#ifdef CONFIG_SMP
134
        {
135
                struct proc_dir_entry *entry;
136
 
137
                /* create /proc/irq/<irq>/smp_affinity */
138
                entry = create_proc_entry("smp_affinity", 0600, irq_desc[irq].dir);
139
 
140
                if (entry) {
141
                        entry->data = (void *)(long)irq;
142
                        entry->read_proc = irq_affinity_read_proc;
143
                        entry->write_proc = irq_affinity_write_proc;
144
                }
145
        }
146
#endif
147
}
148
 
149
#undef MAX_NAMELEN
150
 
151
void unregister_handler_proc(unsigned int irq, struct irqaction *action)
152
{
153
        if (action->dir)
154
                remove_proc_entry(action->dir->name, irq_desc[irq].dir);
155
}
156
 
157
void init_irq_proc(void)
158
{
159
        int i;
160
 
161
        /* create /proc/irq */
162
        root_irq_dir = proc_mkdir("irq", NULL);
163
        if (!root_irq_dir)
164
                return;
165
 
166
        /*
167
         * Create entries for all existing IRQs.
168
         */
169
        for (i = 0; i < NR_IRQS; i++)
170
                register_irq_proc(i);
171
}
172
 

powered by: WebSVN 2.1.0

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