~ubuntu-branches/ubuntu/precise/linux-ti-omap4/precise

« back to all changes in this revision

Viewing changes to arch/ia64/kernel/msi_ia64.c

  • Committer: Bazaar Package Importer
  • Author(s): Paolo Pisati
  • Date: 2011-06-29 15:23:51 UTC
  • mfrom: (26.1.1 natty-proposed)
  • Revision ID: james.westby@ubuntu.com-20110629152351-xs96tm303d95rpbk
Tags: 3.0.0-1200.2
* Rebased against 3.0.0-6.7
* BSP from TI based on 3.0.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
12
12
static struct irq_chip  ia64_msi_chip;
13
13
 
14
14
#ifdef CONFIG_SMP
15
 
static int ia64_set_msi_irq_affinity(unsigned int irq,
16
 
                                      const cpumask_t *cpu_mask)
 
15
static int ia64_set_msi_irq_affinity(struct irq_data *idata,
 
16
                                     const cpumask_t *cpu_mask, bool force)
17
17
{
18
18
        struct msi_msg msg;
19
19
        u32 addr, data;
20
20
        int cpu = first_cpu(*cpu_mask);
 
21
        unsigned int irq = idata->irq;
21
22
 
22
23
        if (!cpu_online(cpu))
23
24
                return -1;
38
39
        msg.data = data;
39
40
 
40
41
        write_msi_msg(irq, &msg);
41
 
        cpumask_copy(irq_desc[irq].affinity, cpumask_of(cpu));
 
42
        cpumask_copy(idata->affinity, cpumask_of(cpu));
42
43
 
43
44
        return 0;
44
45
}
55
56
        if (irq < 0)
56
57
                return irq;
57
58
 
58
 
        set_irq_msi(irq, desc);
 
59
        irq_set_msi_desc(irq, desc);
59
60
        cpus_and(mask, irq_to_domain(irq), cpu_online_map);
60
61
        dest_phys_id = cpu_physical_id(first_cpu(mask));
61
62
        vector = irq_to_vector(irq);
74
75
                MSI_DATA_VECTOR(vector);
75
76
 
76
77
        write_msi_msg(irq, &msg);
77
 
        set_irq_chip_and_handler(irq, &ia64_msi_chip, handle_edge_irq);
 
78
        irq_set_chip_and_handler(irq, &ia64_msi_chip, handle_edge_irq);
78
79
 
79
80
        return 0;
80
81
}
84
85
        destroy_irq(irq);
85
86
}
86
87
 
87
 
static void ia64_ack_msi_irq(unsigned int irq)
 
88
static void ia64_ack_msi_irq(struct irq_data *data)
88
89
{
89
 
        irq_complete_move(irq);
90
 
        move_native_irq(irq);
 
90
        irq_complete_move(data->irq);
 
91
        irq_move_irq(data);
91
92
        ia64_eoi();
92
93
}
93
94
 
94
 
static int ia64_msi_retrigger_irq(unsigned int irq)
 
95
static int ia64_msi_retrigger_irq(struct irq_data *data)
95
96
{
96
 
        unsigned int vector = irq_to_vector(irq);
 
97
        unsigned int vector = irq_to_vector(data->irq);
97
98
        ia64_resend_irq(vector);
98
99
 
99
100
        return 1;
103
104
 * Generic ops used on most IA64 platforms.
104
105
 */
105
106
static struct irq_chip ia64_msi_chip = {
106
 
        .name           = "PCI-MSI",
107
 
        .irq_mask       = mask_msi_irq,
108
 
        .irq_unmask     = unmask_msi_irq,
109
 
        .ack            = ia64_ack_msi_irq,
 
107
        .name                   = "PCI-MSI",
 
108
        .irq_mask               = mask_msi_irq,
 
109
        .irq_unmask             = unmask_msi_irq,
 
110
        .irq_ack                = ia64_ack_msi_irq,
110
111
#ifdef CONFIG_SMP
111
 
        .set_affinity   = ia64_set_msi_irq_affinity,
 
112
        .irq_set_affinity       = ia64_set_msi_irq_affinity,
112
113
#endif
113
 
        .retrigger      = ia64_msi_retrigger_irq,
 
114
        .irq_retrigger          = ia64_msi_retrigger_irq,
114
115
};
115
116
 
116
117
 
132
133
 
133
134
#ifdef CONFIG_DMAR
134
135
#ifdef CONFIG_SMP
135
 
static int dmar_msi_set_affinity(unsigned int irq, const struct cpumask *mask)
 
136
static int dmar_msi_set_affinity(struct irq_data *data,
 
137
                                 const struct cpumask *mask, bool force)
136
138
{
 
139
        unsigned int irq = data->irq;
137
140
        struct irq_cfg *cfg = irq_cfg + irq;
138
141
        struct msi_msg msg;
139
142
        int cpu = cpumask_first(mask);
152
155
        msg.address_lo |= MSI_ADDR_DEST_ID_CPU(cpu_physical_id(cpu));
153
156
 
154
157
        dmar_msi_write(irq, &msg);
155
 
        cpumask_copy(irq_desc[irq].affinity, mask);
 
158
        cpumask_copy(data->affinity, mask);
156
159
 
157
160
        return 0;
158
161
}
162
165
        .name = "DMAR_MSI",
163
166
        .irq_unmask = dmar_msi_unmask,
164
167
        .irq_mask = dmar_msi_mask,
165
 
        .ack = ia64_ack_msi_irq,
 
168
        .irq_ack = ia64_ack_msi_irq,
166
169
#ifdef CONFIG_SMP
167
 
        .set_affinity = dmar_msi_set_affinity,
 
170
        .irq_set_affinity = dmar_msi_set_affinity,
168
171
#endif
169
 
        .retrigger = ia64_msi_retrigger_irq,
 
172
        .irq_retrigger = ia64_msi_retrigger_irq,
170
173
};
171
174
 
172
175
static int
203
206
        if (ret < 0)
204
207
                return ret;
205
208
        dmar_msi_write(irq, &msg);
206
 
        set_irq_chip_and_handler_name(irq, &dmar_msi_type, handle_edge_irq,
207
 
                "edge");
 
209
        irq_set_chip_and_handler_name(irq, &dmar_msi_type, handle_edge_irq,
 
210
                                      "edge");
208
211
        return 0;
209
212
}
210
213
#endif /* CONFIG_DMAR */