aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
Diffstat (limited to 'arch')
-rw-r--r--arch/powerpc/platforms/cell/Makefile5
-rw-r--r--arch/powerpc/platforms/cell/spu_base.c51
-rw-r--r--arch/powerpc/platforms/cell/spu_priv1.c133
-rw-r--r--arch/powerpc/platforms/cell/spufs/hw_ops.c19
-rw-r--r--arch/powerpc/platforms/cell/spufs/switch.c129
5 files changed, 208 insertions, 129 deletions
diff --git a/arch/powerpc/platforms/cell/Makefile b/arch/powerpc/platforms/cell/Makefile
index ebbd1141498a..16031b565be4 100644
--- a/arch/powerpc/platforms/cell/Makefile
+++ b/arch/powerpc/platforms/cell/Makefile
@@ -2,6 +2,9 @@ obj-y += interrupt.o iommu.o setup.o spider-pic.o
2obj-y += pervasive.o 2obj-y += pervasive.o
3 3
4obj-$(CONFIG_SMP) += smp.o 4obj-$(CONFIG_SMP) += smp.o
5obj-$(CONFIG_SPU_FS) += spufs/ spu_base.o 5obj-$(CONFIG_SPU_FS) += spufs/ spu-base.o
6
7spu-base-y += spu_base.o spu_priv1.o
8
6builtin-spufs-$(CONFIG_SPU_FS) += spu_syscalls.o 9builtin-spufs-$(CONFIG_SPU_FS) += spu_syscalls.o
7obj-y += $(builtin-spufs-m) 10obj-y += $(builtin-spufs-m)
diff --git a/arch/powerpc/platforms/cell/spu_base.c b/arch/powerpc/platforms/cell/spu_base.c
index ae8354740721..081b3dcbaf14 100644
--- a/arch/powerpc/platforms/cell/spu_base.c
+++ b/arch/powerpc/platforms/cell/spu_base.c
@@ -142,8 +142,7 @@ static int __spu_trap_mailbox(struct spu *spu)
142 142
143 /* atomically disable SPU mailbox interrupts */ 143 /* atomically disable SPU mailbox interrupts */
144 spin_lock(&spu->register_lock); 144 spin_lock(&spu->register_lock);
145 out_be64(&spu->priv1->int_mask_class2_RW, 145 spu_int_mask_and(spu, 2, ~0x1);
146 in_be64(&spu->priv1->int_mask_class2_RW) & ~0x1);
147 spin_unlock(&spu->register_lock); 146 spin_unlock(&spu->register_lock);
148 return 0; 147 return 0;
149} 148}
@@ -180,8 +179,7 @@ static int __spu_trap_spubox(struct spu *spu)
180 179
181 /* atomically disable SPU mailbox interrupts */ 180 /* atomically disable SPU mailbox interrupts */
182 spin_lock(&spu->register_lock); 181 spin_lock(&spu->register_lock);
183 out_be64(&spu->priv1->int_mask_class2_RW, 182 spu_int_mask_and(spu, 2, ~0x10);
184 in_be64(&spu->priv1->int_mask_class2_RW) & ~0x10);
185 spin_unlock(&spu->register_lock); 183 spin_unlock(&spu->register_lock);
186 return 0; 184 return 0;
187} 185}
@@ -206,8 +204,8 @@ spu_irq_class_0_bottom(struct spu *spu)
206 204
207 spu->class_0_pending = 0; 205 spu->class_0_pending = 0;
208 206
209 mask = in_be64(&spu->priv1->int_mask_class0_RW); 207 mask = spu_int_mask_get(spu, 0);
210 stat = in_be64(&spu->priv1->int_stat_class0_RW); 208 stat = spu_int_stat_get(spu, 0);
211 209
212 stat &= mask; 210 stat &= mask;
213 211
@@ -220,7 +218,7 @@ spu_irq_class_0_bottom(struct spu *spu)
220 if (stat & 4) /* error on SPU */ 218 if (stat & 4) /* error on SPU */
221 __spu_trap_error(spu); 219 __spu_trap_error(spu);
222 220
223 out_be64(&spu->priv1->int_stat_class0_RW, stat); 221 spu_int_stat_clear(spu, 0, stat);
224 222
225 return (stat & 0x7) ? -EIO : 0; 223 return (stat & 0x7) ? -EIO : 0;
226} 224}
@@ -236,13 +234,13 @@ spu_irq_class_1(int irq, void *data, struct pt_regs *regs)
236 234
237 /* atomically read & clear class1 status. */ 235 /* atomically read & clear class1 status. */
238 spin_lock(&spu->register_lock); 236 spin_lock(&spu->register_lock);
239 mask = in_be64(&spu->priv1->int_mask_class1_RW); 237 mask = spu_int_mask_get(spu, 1);
240 stat = in_be64(&spu->priv1->int_stat_class1_RW) & mask; 238 stat = spu_int_stat_get(spu, 1) & mask;
241 dar = in_be64(&spu->priv1->mfc_dar_RW); 239 dar = spu_mfc_dar_get(spu);
242 dsisr = in_be64(&spu->priv1->mfc_dsisr_RW); 240 dsisr = spu_mfc_dsisr_get(spu);
243 if (stat & 2) /* mapping fault */ 241 if (stat & 2) /* mapping fault */
244 out_be64(&spu->priv1->mfc_dsisr_RW, 0UL); 242 spu_mfc_dsisr_set(spu, 0ul);
245 out_be64(&spu->priv1->int_stat_class1_RW, stat); 243 spu_int_stat_clear(spu, 1, stat);
246 spin_unlock(&spu->register_lock); 244 spin_unlock(&spu->register_lock);
247 245
248 if (stat & 1) /* segment fault */ 246 if (stat & 1) /* segment fault */
@@ -270,8 +268,8 @@ spu_irq_class_2(int irq, void *data, struct pt_regs *regs)
270 unsigned long mask; 268 unsigned long mask;
271 269
272 spu = data; 270 spu = data;
273 stat = in_be64(&spu->priv1->int_stat_class2_RW); 271 stat = spu_int_stat_get(spu, 2);
274 mask = in_be64(&spu->priv1->int_mask_class2_RW); 272 mask = spu_int_mask_get(spu, 2);
275 273
276 pr_debug("class 2 interrupt %d, %lx, %lx\n", irq, stat, mask); 274 pr_debug("class 2 interrupt %d, %lx, %lx\n", irq, stat, mask);
277 275
@@ -292,7 +290,7 @@ spu_irq_class_2(int irq, void *data, struct pt_regs *regs)
292 if (stat & 0x10) /* SPU mailbox threshold */ 290 if (stat & 0x10) /* SPU mailbox threshold */
293 __spu_trap_spubox(spu); 291 __spu_trap_spubox(spu);
294 292
295 out_be64(&spu->priv1->int_stat_class2_RW, stat); 293 spu_int_stat_clear(spu, 2, stat);
296 return stat ? IRQ_HANDLED : IRQ_NONE; 294 return stat ? IRQ_HANDLED : IRQ_NONE;
297} 295}
298 296
@@ -309,21 +307,18 @@ spu_request_irqs(struct spu *spu)
309 spu_irq_class_0, 0, spu->irq_c0, spu); 307 spu_irq_class_0, 0, spu->irq_c0, spu);
310 if (ret) 308 if (ret)
311 goto out; 309 goto out;
312 out_be64(&spu->priv1->int_mask_class0_RW, 0x7);
313 310
314 snprintf(spu->irq_c1, sizeof (spu->irq_c1), "spe%02d.1", spu->number); 311 snprintf(spu->irq_c1, sizeof (spu->irq_c1), "spe%02d.1", spu->number);
315 ret = request_irq(irq_base + IIC_CLASS_STRIDE + spu->isrc, 312 ret = request_irq(irq_base + IIC_CLASS_STRIDE + spu->isrc,
316 spu_irq_class_1, 0, spu->irq_c1, spu); 313 spu_irq_class_1, 0, spu->irq_c1, spu);
317 if (ret) 314 if (ret)
318 goto out1; 315 goto out1;
319 out_be64(&spu->priv1->int_mask_class1_RW, 0x3);
320 316
321 snprintf(spu->irq_c2, sizeof (spu->irq_c2), "spe%02d.2", spu->number); 317 snprintf(spu->irq_c2, sizeof (spu->irq_c2), "spe%02d.2", spu->number);
322 ret = request_irq(irq_base + 2*IIC_CLASS_STRIDE + spu->isrc, 318 ret = request_irq(irq_base + 2*IIC_CLASS_STRIDE + spu->isrc,
323 spu_irq_class_2, 0, spu->irq_c2, spu); 319 spu_irq_class_2, 0, spu->irq_c2, spu);
324 if (ret) 320 if (ret)
325 goto out2; 321 goto out2;
326 out_be64(&spu->priv1->int_mask_class2_RW, 0xe);
327 goto out; 322 goto out;
328 323
329out2: 324out2:
@@ -383,13 +378,6 @@ static void spu_init_channels(struct spu *spu)
383 } 378 }
384} 379}
385 380
386static void spu_init_regs(struct spu *spu)
387{
388 out_be64(&spu->priv1->int_mask_class0_RW, 0x7);
389 out_be64(&spu->priv1->int_mask_class1_RW, 0x3);
390 out_be64(&spu->priv1->int_mask_class2_RW, 0xe);
391}
392
393struct spu *spu_alloc(void) 381struct spu *spu_alloc(void)
394{ 382{
395 struct spu *spu; 383 struct spu *spu;
@@ -405,10 +393,8 @@ struct spu *spu_alloc(void)
405 } 393 }
406 up(&spu_mutex); 394 up(&spu_mutex);
407 395
408 if (spu) { 396 if (spu)
409 spu_init_channels(spu); 397 spu_init_channels(spu);
410 spu_init_regs(spu);
411 }
412 398
413 return spu; 399 return spu;
414} 400}
@@ -579,8 +565,7 @@ static int __init spu_map_device(struct spu *spu, struct device_node *spe)
579 goto out_unmap; 565 goto out_unmap;
580 566
581 spu->priv1= map_spe_prop(spe, "priv1"); 567 spu->priv1= map_spe_prop(spe, "priv1");
582 if (!spu->priv1) 568 /* priv1 is not available on a hypervisor */
583 goto out_unmap;
584 569
585 spu->priv2= map_spe_prop(spe, "priv2"); 570 spu->priv2= map_spe_prop(spe, "priv2");
586 if (!spu->priv2) 571 if (!spu->priv2)
@@ -633,8 +618,8 @@ static int __init create_spu(struct device_node *spe)
633 spu->dsisr = 0UL; 618 spu->dsisr = 0UL;
634 spin_lock_init(&spu->register_lock); 619 spin_lock_init(&spu->register_lock);
635 620
636 out_be64(&spu->priv1->mfc_sdr_RW, mfspr(SPRN_SDR1)); 621 spu_mfc_sdr_set(spu, mfspr(SPRN_SDR1));
637 out_be64(&spu->priv1->mfc_sr1_RW, 0x33); 622 spu_mfc_sr1_set(spu, 0x33);
638 623
639 spu->ibox_callback = NULL; 624 spu->ibox_callback = NULL;
640 spu->wbox_callback = NULL; 625 spu->wbox_callback = NULL;
diff --git a/arch/powerpc/platforms/cell/spu_priv1.c b/arch/powerpc/platforms/cell/spu_priv1.c
new file mode 100644
index 000000000000..b2656421c7b5
--- /dev/null
+++ b/arch/powerpc/platforms/cell/spu_priv1.c
@@ -0,0 +1,133 @@
1/*
2 * access to SPU privileged registers
3 */
4#include <linux/module.h>
5
6#include <asm/io.h>
7#include <asm/spu.h>
8
9void spu_int_mask_and(struct spu *spu, int class, u64 mask)
10{
11 u64 old_mask;
12
13 old_mask = in_be64(&spu->priv1->int_mask_RW[class]);
14 out_be64(&spu->priv1->int_mask_RW[class], old_mask & mask);
15}
16EXPORT_SYMBOL_GPL(spu_int_mask_and);
17
18void spu_int_mask_or(struct spu *spu, int class, u64 mask)
19{
20 u64 old_mask;
21
22 old_mask = in_be64(&spu->priv1->int_mask_RW[class]);
23 out_be64(&spu->priv1->int_mask_RW[class], old_mask | mask);
24}
25EXPORT_SYMBOL_GPL(spu_int_mask_or);
26
27void spu_int_mask_set(struct spu *spu, int class, u64 mask)
28{
29 out_be64(&spu->priv1->int_mask_RW[class], mask);
30}
31EXPORT_SYMBOL_GPL(spu_int_mask_set);
32
33u64 spu_int_mask_get(struct spu *spu, int class)
34{
35 return in_be64(&spu->priv1->int_mask_RW[class]);
36}
37EXPORT_SYMBOL_GPL(spu_int_mask_get);
38
39void spu_int_stat_clear(struct spu *spu, int class, u64 stat)
40{
41 out_be64(&spu->priv1->int_stat_RW[class], stat);
42}
43EXPORT_SYMBOL_GPL(spu_int_stat_clear);
44
45u64 spu_int_stat_get(struct spu *spu, int class)
46{
47 return in_be64(&spu->priv1->int_stat_RW[class]);
48}
49EXPORT_SYMBOL_GPL(spu_int_stat_get);
50
51void spu_int_route_set(struct spu *spu, u64 route)
52{
53 out_be64(&spu->priv1->int_route_RW, route);
54}
55EXPORT_SYMBOL_GPL(spu_int_route_set);
56
57u64 spu_mfc_dar_get(struct spu *spu)
58{
59 return in_be64(&spu->priv1->mfc_dar_RW);
60}
61EXPORT_SYMBOL_GPL(spu_mfc_dar_get);
62
63u64 spu_mfc_dsisr_get(struct spu *spu)
64{
65 return in_be64(&spu->priv1->mfc_dsisr_RW);
66}
67EXPORT_SYMBOL_GPL(spu_mfc_dsisr_get);
68
69void spu_mfc_dsisr_set(struct spu *spu, u64 dsisr)
70{
71 out_be64(&spu->priv1->mfc_dsisr_RW, dsisr);
72}
73EXPORT_SYMBOL_GPL(spu_mfc_dsisr_set);
74
75void spu_mfc_sdr_set(struct spu *spu, u64 sdr)
76{
77 out_be64(&spu->priv1->mfc_sdr_RW, sdr);
78}
79EXPORT_SYMBOL_GPL(spu_mfc_sdr_set);
80
81void spu_mfc_sr1_set(struct spu *spu, u64 sr1)
82{
83 out_be64(&spu->priv1->mfc_sr1_RW, sr1);
84}
85EXPORT_SYMBOL_GPL(spu_mfc_sr1_set);
86
87u64 spu_mfc_sr1_get(struct spu *spu)
88{
89 return in_be64(&spu->priv1->mfc_sr1_RW);
90}
91EXPORT_SYMBOL_GPL(spu_mfc_sr1_get);
92
93void spu_mfc_tclass_id_set(struct spu *spu, u64 tclass_id)
94{
95 out_be64(&spu->priv1->mfc_tclass_id_RW, tclass_id);
96}
97EXPORT_SYMBOL_GPL(spu_mfc_tclass_id_set);
98
99u64 spu_mfc_tclass_id_get(struct spu *spu)
100{
101 return in_be64(&spu->priv1->mfc_tclass_id_RW);
102}
103EXPORT_SYMBOL_GPL(spu_mfc_tclass_id_get);
104
105void spu_tlb_invalidate(struct spu *spu)
106{
107 out_be64(&spu->priv1->tlb_invalidate_entry_W, 0ul);
108}
109EXPORT_SYMBOL_GPL(spu_tlb_invalidate);
110
111void spu_resource_allocation_groupID_set(struct spu *spu, u64 id)
112{
113 out_be64(&spu->priv1->resource_allocation_groupID_RW, id);
114}
115EXPORT_SYMBOL_GPL(spu_resource_allocation_groupID_set);
116
117u64 spu_resource_allocation_groupID_get(struct spu *spu)
118{
119 return in_be64(&spu->priv1->resource_allocation_groupID_RW);
120}
121EXPORT_SYMBOL_GPL(spu_resource_allocation_groupID_get);
122
123void spu_resource_allocation_enable_set(struct spu *spu, u64 enable)
124{
125 out_be64(&spu->priv1->resource_allocation_enable_RW, enable);
126}
127EXPORT_SYMBOL_GPL(spu_resource_allocation_enable_set);
128
129u64 spu_resource_allocation_enable_get(struct spu *spu)
130{
131 return in_be64(&spu->priv1->resource_allocation_enable_RW);
132}
133EXPORT_SYMBOL_GPL(spu_resource_allocation_enable_get);
diff --git a/arch/powerpc/platforms/cell/spufs/hw_ops.c b/arch/powerpc/platforms/cell/spufs/hw_ops.c
index 9a53e29f9d7e..5445719bff79 100644
--- a/arch/powerpc/platforms/cell/spufs/hw_ops.c
+++ b/arch/powerpc/platforms/cell/spufs/hw_ops.c
@@ -62,7 +62,6 @@ static unsigned int spu_hw_mbox_stat_poll(struct spu_context *ctx,
62 unsigned int events) 62 unsigned int events)
63{ 63{
64 struct spu *spu = ctx->spu; 64 struct spu *spu = ctx->spu;
65 struct spu_priv1 __iomem *priv1 = spu->priv1;
66 int ret = 0; 65 int ret = 0;
67 u32 stat; 66 u32 stat;
68 67
@@ -78,18 +77,16 @@ static unsigned int spu_hw_mbox_stat_poll(struct spu_context *ctx,
78 if (stat & 0xff0000) 77 if (stat & 0xff0000)
79 ret |= POLLIN | POLLRDNORM; 78 ret |= POLLIN | POLLRDNORM;
80 else { 79 else {
81 out_be64(&priv1->int_stat_class2_RW, 0x1); 80 spu_int_stat_clear(spu, 2, 0x1);
82 out_be64(&priv1->int_mask_class2_RW, 81 spu_int_mask_or(spu, 2, 0x1);
83 in_be64(&priv1->int_mask_class2_RW) | 0x1);
84 } 82 }
85 } 83 }
86 if (events & (POLLOUT | POLLWRNORM)) { 84 if (events & (POLLOUT | POLLWRNORM)) {
87 if (stat & 0x00ff00) 85 if (stat & 0x00ff00)
88 ret = POLLOUT | POLLWRNORM; 86 ret = POLLOUT | POLLWRNORM;
89 else { 87 else {
90 out_be64(&priv1->int_stat_class2_RW, 0x10); 88 spu_int_stat_clear(spu, 2, 0x10);
91 out_be64(&priv1->int_mask_class2_RW, 89 spu_int_mask_or(spu, 2, 0x10);
92 in_be64(&priv1->int_mask_class2_RW) | 0x10);
93 } 90 }
94 } 91 }
95 spin_unlock_irq(&spu->register_lock); 92 spin_unlock_irq(&spu->register_lock);
@@ -100,7 +97,6 @@ static int spu_hw_ibox_read(struct spu_context *ctx, u32 * data)
100{ 97{
101 struct spu *spu = ctx->spu; 98 struct spu *spu = ctx->spu;
102 struct spu_problem __iomem *prob = spu->problem; 99 struct spu_problem __iomem *prob = spu->problem;
103 struct spu_priv1 __iomem *priv1 = spu->priv1;
104 struct spu_priv2 __iomem *priv2 = spu->priv2; 100 struct spu_priv2 __iomem *priv2 = spu->priv2;
105 int ret; 101 int ret;
106 102
@@ -111,8 +107,7 @@ static int spu_hw_ibox_read(struct spu_context *ctx, u32 * data)
111 ret = 4; 107 ret = 4;
112 } else { 108 } else {
113 /* make sure we get woken up by the interrupt */ 109 /* make sure we get woken up by the interrupt */
114 out_be64(&priv1->int_mask_class2_RW, 110 spu_int_mask_or(spu, 2, 0x1);
115 in_be64(&priv1->int_mask_class2_RW) | 0x1);
116 ret = 0; 111 ret = 0;
117 } 112 }
118 spin_unlock_irq(&spu->register_lock); 113 spin_unlock_irq(&spu->register_lock);
@@ -123,7 +118,6 @@ static int spu_hw_wbox_write(struct spu_context *ctx, u32 data)
123{ 118{
124 struct spu *spu = ctx->spu; 119 struct spu *spu = ctx->spu;
125 struct spu_problem __iomem *prob = spu->problem; 120 struct spu_problem __iomem *prob = spu->problem;
126 struct spu_priv1 __iomem *priv1 = spu->priv1;
127 int ret; 121 int ret;
128 122
129 spin_lock_irq(&spu->register_lock); 123 spin_lock_irq(&spu->register_lock);
@@ -134,8 +128,7 @@ static int spu_hw_wbox_write(struct spu_context *ctx, u32 data)
134 } else { 128 } else {
135 /* make sure we get woken up by the interrupt when space 129 /* make sure we get woken up by the interrupt when space
136 becomes available */ 130 becomes available */
137 out_be64(&priv1->int_mask_class2_RW, 131 spu_int_mask_or(spu, 2, 0x10);
138 in_be64(&priv1->int_mask_class2_RW) | 0x10);
139 ret = 0; 132 ret = 0;
140 } 133 }
141 spin_unlock_irq(&spu->register_lock); 134 spin_unlock_irq(&spu->register_lock);
diff --git a/arch/powerpc/platforms/cell/spufs/switch.c b/arch/powerpc/platforms/cell/spufs/switch.c
index de1ad146fc63..1061c12b2edb 100644
--- a/arch/powerpc/platforms/cell/spufs/switch.c
+++ b/arch/powerpc/platforms/cell/spufs/switch.c
@@ -108,8 +108,6 @@ static inline int check_spu_isolate(struct spu_state *csa, struct spu *spu)
108 108
109static inline void disable_interrupts(struct spu_state *csa, struct spu *spu) 109static inline void disable_interrupts(struct spu_state *csa, struct spu *spu)
110{ 110{
111 struct spu_priv1 __iomem *priv1 = spu->priv1;
112
113 /* Save, Step 3: 111 /* Save, Step 3:
114 * Restore, Step 2: 112 * Restore, Step 2:
115 * Save INT_Mask_class0 in CSA. 113 * Save INT_Mask_class0 in CSA.
@@ -121,16 +119,13 @@ static inline void disable_interrupts(struct spu_state *csa, struct spu *spu)
121 */ 119 */
122 spin_lock_irq(&spu->register_lock); 120 spin_lock_irq(&spu->register_lock);
123 if (csa) { 121 if (csa) {
124 csa->priv1.int_mask_class0_RW = 122 csa->priv1.int_mask_class0_RW = spu_int_mask_get(spu, 0);
125 in_be64(&priv1->int_mask_class0_RW); 123 csa->priv1.int_mask_class1_RW = spu_int_mask_get(spu, 1);
126 csa->priv1.int_mask_class1_RW = 124 csa->priv1.int_mask_class2_RW = spu_int_mask_get(spu, 2);
127 in_be64(&priv1->int_mask_class1_RW);
128 csa->priv1.int_mask_class2_RW =
129 in_be64(&priv1->int_mask_class2_RW);
130 } 125 }
131 out_be64(&priv1->int_mask_class0_RW, 0UL); 126 spu_int_mask_set(spu, 0, 0ul);
132 out_be64(&priv1->int_mask_class1_RW, 0UL); 127 spu_int_mask_set(spu, 1, 0ul);
133 out_be64(&priv1->int_mask_class2_RW, 0UL); 128 spu_int_mask_set(spu, 2, 0ul);
134 eieio(); 129 eieio();
135 spin_unlock_irq(&spu->register_lock); 130 spin_unlock_irq(&spu->register_lock);
136} 131}
@@ -195,12 +190,10 @@ static inline void save_spu_runcntl(struct spu_state *csa, struct spu *spu)
195 190
196static inline void save_mfc_sr1(struct spu_state *csa, struct spu *spu) 191static inline void save_mfc_sr1(struct spu_state *csa, struct spu *spu)
197{ 192{
198 struct spu_priv1 __iomem *priv1 = spu->priv1;
199
200 /* Save, Step 10: 193 /* Save, Step 10:
201 * Save MFC_SR1 in the CSA. 194 * Save MFC_SR1 in the CSA.
202 */ 195 */
203 csa->priv1.mfc_sr1_RW = in_be64(&priv1->mfc_sr1_RW); 196 csa->priv1.mfc_sr1_RW = spu_mfc_sr1_get(spu);
204} 197}
205 198
206static inline void save_spu_status(struct spu_state *csa, struct spu *spu) 199static inline void save_spu_status(struct spu_state *csa, struct spu *spu)
@@ -292,15 +285,13 @@ static inline void do_mfc_mssync(struct spu_state *csa, struct spu *spu)
292 285
293static inline void issue_mfc_tlbie(struct spu_state *csa, struct spu *spu) 286static inline void issue_mfc_tlbie(struct spu_state *csa, struct spu *spu)
294{ 287{
295 struct spu_priv1 __iomem *priv1 = spu->priv1;
296
297 /* Save, Step 17: 288 /* Save, Step 17:
298 * Restore, Step 12. 289 * Restore, Step 12.
299 * Restore, Step 48. 290 * Restore, Step 48.
300 * Write TLB_Invalidate_Entry[IS,VPN,L,Lp]=0 register. 291 * Write TLB_Invalidate_Entry[IS,VPN,L,Lp]=0 register.
301 * Then issue a PPE sync instruction. 292 * Then issue a PPE sync instruction.
302 */ 293 */
303 out_be64(&priv1->tlb_invalidate_entry_W, 0UL); 294 spu_tlb_invalidate(spu);
304 mb(); 295 mb();
305} 296}
306 297
@@ -410,25 +401,21 @@ static inline void save_mfc_csr_ato(struct spu_state *csa, struct spu *spu)
410 401
411static inline void save_mfc_tclass_id(struct spu_state *csa, struct spu *spu) 402static inline void save_mfc_tclass_id(struct spu_state *csa, struct spu *spu)
412{ 403{
413 struct spu_priv1 __iomem *priv1 = spu->priv1;
414
415 /* Save, Step 25: 404 /* Save, Step 25:
416 * Save the MFC_TCLASS_ID register in 405 * Save the MFC_TCLASS_ID register in
417 * the CSA. 406 * the CSA.
418 */ 407 */
419 csa->priv1.mfc_tclass_id_RW = in_be64(&priv1->mfc_tclass_id_RW); 408 csa->priv1.mfc_tclass_id_RW = spu_mfc_tclass_id_get(spu);
420} 409}
421 410
422static inline void set_mfc_tclass_id(struct spu_state *csa, struct spu *spu) 411static inline void set_mfc_tclass_id(struct spu_state *csa, struct spu *spu)
423{ 412{
424 struct spu_priv1 __iomem *priv1 = spu->priv1;
425
426 /* Save, Step 26: 413 /* Save, Step 26:
427 * Restore, Step 23. 414 * Restore, Step 23.
428 * Write the MFC_TCLASS_ID register with 415 * Write the MFC_TCLASS_ID register with
429 * the value 0x10000000. 416 * the value 0x10000000.
430 */ 417 */
431 out_be64(&priv1->mfc_tclass_id_RW, 0x10000000); 418 spu_mfc_tclass_id_set(spu, 0x10000000);
432 eieio(); 419 eieio();
433} 420}
434 421
@@ -458,14 +445,13 @@ static inline void wait_purge_complete(struct spu_state *csa, struct spu *spu)
458 445
459static inline void save_mfc_slbs(struct spu_state *csa, struct spu *spu) 446static inline void save_mfc_slbs(struct spu_state *csa, struct spu *spu)
460{ 447{
461 struct spu_priv1 __iomem *priv1 = spu->priv1;
462 struct spu_priv2 __iomem *priv2 = spu->priv2; 448 struct spu_priv2 __iomem *priv2 = spu->priv2;
463 int i; 449 int i;
464 450
465 /* Save, Step 29: 451 /* Save, Step 29:
466 * If MFC_SR1[R]='1', save SLBs in CSA. 452 * If MFC_SR1[R]='1', save SLBs in CSA.
467 */ 453 */
468 if (in_be64(&priv1->mfc_sr1_RW) & MFC_STATE1_RELOCATE_MASK) { 454 if (spu_mfc_sr1_get(spu) & MFC_STATE1_RELOCATE_MASK) {
469 csa->priv2.slb_index_W = in_be64(&priv2->slb_index_W); 455 csa->priv2.slb_index_W = in_be64(&priv2->slb_index_W);
470 for (i = 0; i < 8; i++) { 456 for (i = 0; i < 8; i++) {
471 out_be64(&priv2->slb_index_W, i); 457 out_be64(&priv2->slb_index_W, i);
@@ -479,8 +465,6 @@ static inline void save_mfc_slbs(struct spu_state *csa, struct spu *spu)
479 465
480static inline void setup_mfc_sr1(struct spu_state *csa, struct spu *spu) 466static inline void setup_mfc_sr1(struct spu_state *csa, struct spu *spu)
481{ 467{
482 struct spu_priv1 __iomem *priv1 = spu->priv1;
483
484 /* Save, Step 30: 468 /* Save, Step 30:
485 * Restore, Step 18: 469 * Restore, Step 18:
486 * Write MFC_SR1 with MFC_SR1[D=0,S=1] and 470 * Write MFC_SR1 with MFC_SR1[D=0,S=1] and
@@ -492,9 +476,9 @@ static inline void setup_mfc_sr1(struct spu_state *csa, struct spu *spu)
492 * MFC_SR1[Pr] bit is not set. 476 * MFC_SR1[Pr] bit is not set.
493 * 477 *
494 */ 478 */
495 out_be64(&priv1->mfc_sr1_RW, (MFC_STATE1_MASTER_RUN_CONTROL_MASK | 479 spu_mfc_sr1_set(spu, (MFC_STATE1_MASTER_RUN_CONTROL_MASK |
496 MFC_STATE1_RELOCATE_MASK | 480 MFC_STATE1_RELOCATE_MASK |
497 MFC_STATE1_BUS_TLBIE_MASK)); 481 MFC_STATE1_BUS_TLBIE_MASK));
498} 482}
499 483
500static inline void save_spu_npc(struct spu_state *csa, struct spu *spu) 484static inline void save_spu_npc(struct spu_state *csa, struct spu *spu)
@@ -571,16 +555,14 @@ static inline void save_pm_trace(struct spu_state *csa, struct spu *spu)
571 555
572static inline void save_mfc_rag(struct spu_state *csa, struct spu *spu) 556static inline void save_mfc_rag(struct spu_state *csa, struct spu *spu)
573{ 557{
574 struct spu_priv1 __iomem *priv1 = spu->priv1;
575
576 /* Save, Step 38: 558 /* Save, Step 38:
577 * Save RA_GROUP_ID register and the 559 * Save RA_GROUP_ID register and the
578 * RA_ENABLE reigster in the CSA. 560 * RA_ENABLE reigster in the CSA.
579 */ 561 */
580 csa->priv1.resource_allocation_groupID_RW = 562 csa->priv1.resource_allocation_groupID_RW =
581 in_be64(&priv1->resource_allocation_groupID_RW); 563 spu_resource_allocation_groupID_get(spu);
582 csa->priv1.resource_allocation_enable_RW = 564 csa->priv1.resource_allocation_enable_RW =
583 in_be64(&priv1->resource_allocation_enable_RW); 565 spu_resource_allocation_enable_get(spu);
584} 566}
585 567
586static inline void save_ppu_mb_stat(struct spu_state *csa, struct spu *spu) 568static inline void save_ppu_mb_stat(struct spu_state *csa, struct spu *spu)
@@ -698,14 +680,13 @@ static inline void resume_mfc_queue(struct spu_state *csa, struct spu *spu)
698 680
699static inline void invalidate_slbs(struct spu_state *csa, struct spu *spu) 681static inline void invalidate_slbs(struct spu_state *csa, struct spu *spu)
700{ 682{
701 struct spu_priv1 __iomem *priv1 = spu->priv1;
702 struct spu_priv2 __iomem *priv2 = spu->priv2; 683 struct spu_priv2 __iomem *priv2 = spu->priv2;
703 684
704 /* Save, Step 45: 685 /* Save, Step 45:
705 * Restore, Step 19: 686 * Restore, Step 19:
706 * If MFC_SR1[R]=1, write 0 to SLB_Invalidate_All. 687 * If MFC_SR1[R]=1, write 0 to SLB_Invalidate_All.
707 */ 688 */
708 if (in_be64(&priv1->mfc_sr1_RW) & MFC_STATE1_RELOCATE_MASK) { 689 if (spu_mfc_sr1_get(spu) & MFC_STATE1_RELOCATE_MASK) {
709 out_be64(&priv2->slb_invalidate_all_W, 0UL); 690 out_be64(&priv2->slb_invalidate_all_W, 0UL);
710 eieio(); 691 eieio();
711 } 692 }
@@ -774,7 +755,6 @@ static inline void set_switch_active(struct spu_state *csa, struct spu *spu)
774 755
775static inline void enable_interrupts(struct spu_state *csa, struct spu *spu) 756static inline void enable_interrupts(struct spu_state *csa, struct spu *spu)
776{ 757{
777 struct spu_priv1 __iomem *priv1 = spu->priv1;
778 unsigned long class1_mask = CLASS1_ENABLE_SEGMENT_FAULT_INTR | 758 unsigned long class1_mask = CLASS1_ENABLE_SEGMENT_FAULT_INTR |
779 CLASS1_ENABLE_STORAGE_FAULT_INTR; 759 CLASS1_ENABLE_STORAGE_FAULT_INTR;
780 760
@@ -787,12 +767,12 @@ static inline void enable_interrupts(struct spu_state *csa, struct spu *spu)
787 * (translation) interrupts. 767 * (translation) interrupts.
788 */ 768 */
789 spin_lock_irq(&spu->register_lock); 769 spin_lock_irq(&spu->register_lock);
790 out_be64(&priv1->int_stat_class0_RW, ~(0UL)); 770 spu_int_stat_clear(spu, 0, ~0ul);
791 out_be64(&priv1->int_stat_class1_RW, ~(0UL)); 771 spu_int_stat_clear(spu, 1, ~0ul);
792 out_be64(&priv1->int_stat_class2_RW, ~(0UL)); 772 spu_int_stat_clear(spu, 2, ~0ul);
793 out_be64(&priv1->int_mask_class0_RW, 0UL); 773 spu_int_mask_set(spu, 0, 0ul);
794 out_be64(&priv1->int_mask_class1_RW, class1_mask); 774 spu_int_mask_set(spu, 1, class1_mask);
795 out_be64(&priv1->int_mask_class2_RW, 0UL); 775 spu_int_mask_set(spu, 2, 0ul);
796 spin_unlock_irq(&spu->register_lock); 776 spin_unlock_irq(&spu->register_lock);
797} 777}
798 778
@@ -930,7 +910,6 @@ static inline void set_ppu_querymask(struct spu_state *csa, struct spu *spu)
930 910
931static inline void wait_tag_complete(struct spu_state *csa, struct spu *spu) 911static inline void wait_tag_complete(struct spu_state *csa, struct spu *spu)
932{ 912{
933 struct spu_priv1 __iomem *priv1 = spu->priv1;
934 struct spu_problem __iomem *prob = spu->problem; 913 struct spu_problem __iomem *prob = spu->problem;
935 u32 mask = MFC_TAGID_TO_TAGMASK(0); 914 u32 mask = MFC_TAGID_TO_TAGMASK(0);
936 unsigned long flags; 915 unsigned long flags;
@@ -947,14 +926,13 @@ static inline void wait_tag_complete(struct spu_state *csa, struct spu *spu)
947 POLL_WHILE_FALSE(in_be32(&prob->dma_tagstatus_R) & mask); 926 POLL_WHILE_FALSE(in_be32(&prob->dma_tagstatus_R) & mask);
948 927
949 local_irq_save(flags); 928 local_irq_save(flags);
950 out_be64(&priv1->int_stat_class0_RW, ~(0UL)); 929 spu_int_stat_clear(spu, 0, ~(0ul));
951 out_be64(&priv1->int_stat_class2_RW, ~(0UL)); 930 spu_int_stat_clear(spu, 2, ~(0ul));
952 local_irq_restore(flags); 931 local_irq_restore(flags);
953} 932}
954 933
955static inline void wait_spu_stopped(struct spu_state *csa, struct spu *spu) 934static inline void wait_spu_stopped(struct spu_state *csa, struct spu *spu)
956{ 935{
957 struct spu_priv1 __iomem *priv1 = spu->priv1;
958 struct spu_problem __iomem *prob = spu->problem; 936 struct spu_problem __iomem *prob = spu->problem;
959 unsigned long flags; 937 unsigned long flags;
960 938
@@ -967,8 +945,8 @@ static inline void wait_spu_stopped(struct spu_state *csa, struct spu *spu)
967 POLL_WHILE_TRUE(in_be32(&prob->spu_status_R) & SPU_STATUS_RUNNING); 945 POLL_WHILE_TRUE(in_be32(&prob->spu_status_R) & SPU_STATUS_RUNNING);
968 946
969 local_irq_save(flags); 947 local_irq_save(flags);
970 out_be64(&priv1->int_stat_class0_RW, ~(0UL)); 948 spu_int_stat_clear(spu, 0, ~(0ul));
971 out_be64(&priv1->int_stat_class2_RW, ~(0UL)); 949 spu_int_stat_clear(spu, 2, ~(0ul));
972 local_irq_restore(flags); 950 local_irq_restore(flags);
973} 951}
974 952
@@ -1067,7 +1045,6 @@ static inline int suspend_spe(struct spu_state *csa, struct spu *spu)
1067static inline void clear_spu_status(struct spu_state *csa, struct spu *spu) 1045static inline void clear_spu_status(struct spu_state *csa, struct spu *spu)
1068{ 1046{
1069 struct spu_problem __iomem *prob = spu->problem; 1047 struct spu_problem __iomem *prob = spu->problem;
1070 struct spu_priv1 __iomem *priv1 = spu->priv1;
1071 1048
1072 /* Restore, Step 10: 1049 /* Restore, Step 10:
1073 * If SPU_Status[R]=0 and SPU_Status[E,L,IS]=1, 1050 * If SPU_Status[R]=0 and SPU_Status[E,L,IS]=1,
@@ -1076,8 +1053,8 @@ static inline void clear_spu_status(struct spu_state *csa, struct spu *spu)
1076 if (!(in_be32(&prob->spu_status_R) & SPU_STATUS_RUNNING)) { 1053 if (!(in_be32(&prob->spu_status_R) & SPU_STATUS_RUNNING)) {
1077 if (in_be32(&prob->spu_status_R) & 1054 if (in_be32(&prob->spu_status_R) &
1078 SPU_STATUS_ISOLATED_EXIT_STAUTUS) { 1055 SPU_STATUS_ISOLATED_EXIT_STAUTUS) {
1079 out_be64(&priv1->mfc_sr1_RW, 1056 spu_mfc_sr1_set(spu,
1080 MFC_STATE1_MASTER_RUN_CONTROL_MASK); 1057 MFC_STATE1_MASTER_RUN_CONTROL_MASK);
1081 eieio(); 1058 eieio();
1082 out_be32(&prob->spu_runcntl_RW, SPU_RUNCNTL_RUNNABLE); 1059 out_be32(&prob->spu_runcntl_RW, SPU_RUNCNTL_RUNNABLE);
1083 eieio(); 1060 eieio();
@@ -1088,8 +1065,8 @@ static inline void clear_spu_status(struct spu_state *csa, struct spu *spu)
1088 SPU_STATUS_ISOLATED_LOAD_STAUTUS) 1065 SPU_STATUS_ISOLATED_LOAD_STAUTUS)
1089 || (in_be32(&prob->spu_status_R) & 1066 || (in_be32(&prob->spu_status_R) &
1090 SPU_STATUS_ISOLATED_STATE)) { 1067 SPU_STATUS_ISOLATED_STATE)) {
1091 out_be64(&priv1->mfc_sr1_RW, 1068 spu_mfc_sr1_set(spu,
1092 MFC_STATE1_MASTER_RUN_CONTROL_MASK); 1069 MFC_STATE1_MASTER_RUN_CONTROL_MASK);
1093 eieio(); 1070 eieio();
1094 out_be32(&prob->spu_runcntl_RW, 0x2); 1071 out_be32(&prob->spu_runcntl_RW, 0x2);
1095 eieio(); 1072 eieio();
@@ -1257,16 +1234,14 @@ static inline void setup_spu_status_part2(struct spu_state *csa,
1257 1234
1258static inline void restore_mfc_rag(struct spu_state *csa, struct spu *spu) 1235static inline void restore_mfc_rag(struct spu_state *csa, struct spu *spu)
1259{ 1236{
1260 struct spu_priv1 __iomem *priv1 = spu->priv1;
1261
1262 /* Restore, Step 29: 1237 /* Restore, Step 29:
1263 * Restore RA_GROUP_ID register and the 1238 * Restore RA_GROUP_ID register and the
1264 * RA_ENABLE reigster from the CSA. 1239 * RA_ENABLE reigster from the CSA.
1265 */ 1240 */
1266 out_be64(&priv1->resource_allocation_groupID_RW, 1241 spu_resource_allocation_groupID_set(spu,
1267 csa->priv1.resource_allocation_groupID_RW); 1242 csa->priv1.resource_allocation_groupID_RW);
1268 out_be64(&priv1->resource_allocation_enable_RW, 1243 spu_resource_allocation_enable_set(spu,
1269 csa->priv1.resource_allocation_enable_RW); 1244 csa->priv1.resource_allocation_enable_RW);
1270} 1245}
1271 1246
1272static inline void send_restore_code(struct spu_state *csa, struct spu *spu) 1247static inline void send_restore_code(struct spu_state *csa, struct spu *spu)
@@ -1409,8 +1384,6 @@ static inline void restore_ls_16kb(struct spu_state *csa, struct spu *spu)
1409 1384
1410static inline void clear_interrupts(struct spu_state *csa, struct spu *spu) 1385static inline void clear_interrupts(struct spu_state *csa, struct spu *spu)
1411{ 1386{
1412 struct spu_priv1 __iomem *priv1 = spu->priv1;
1413
1414 /* Restore, Step 49: 1387 /* Restore, Step 49:
1415 * Write INT_MASK_class0 with value of 0. 1388 * Write INT_MASK_class0 with value of 0.
1416 * Write INT_MASK_class1 with value of 0. 1389 * Write INT_MASK_class1 with value of 0.
@@ -1420,12 +1393,12 @@ static inline void clear_interrupts(struct spu_state *csa, struct spu *spu)
1420 * Write INT_STAT_class2 with value of -1. 1393 * Write INT_STAT_class2 with value of -1.
1421 */ 1394 */
1422 spin_lock_irq(&spu->register_lock); 1395 spin_lock_irq(&spu->register_lock);
1423 out_be64(&priv1->int_mask_class0_RW, 0UL); 1396 spu_int_mask_set(spu, 0, 0ul);
1424 out_be64(&priv1->int_mask_class1_RW, 0UL); 1397 spu_int_mask_set(spu, 1, 0ul);
1425 out_be64(&priv1->int_mask_class2_RW, 0UL); 1398 spu_int_mask_set(spu, 2, 0ul);
1426 out_be64(&priv1->int_stat_class0_RW, ~(0UL)); 1399 spu_int_stat_clear(spu, 0, ~0ul);
1427 out_be64(&priv1->int_stat_class1_RW, ~(0UL)); 1400 spu_int_stat_clear(spu, 1, ~0ul);
1428 out_be64(&priv1->int_stat_class2_RW, ~(0UL)); 1401 spu_int_stat_clear(spu, 2, ~0ul);
1429 spin_unlock_irq(&spu->register_lock); 1402 spin_unlock_irq(&spu->register_lock);
1430} 1403}
1431 1404
@@ -1522,12 +1495,10 @@ static inline void restore_mfc_csr_ato(struct spu_state *csa, struct spu *spu)
1522 1495
1523static inline void restore_mfc_tclass_id(struct spu_state *csa, struct spu *spu) 1496static inline void restore_mfc_tclass_id(struct spu_state *csa, struct spu *spu)
1524{ 1497{
1525 struct spu_priv1 __iomem *priv1 = spu->priv1;
1526
1527 /* Restore, Step 56: 1498 /* Restore, Step 56:
1528 * Restore the MFC_TCLASS_ID register from CSA. 1499 * Restore the MFC_TCLASS_ID register from CSA.
1529 */ 1500 */
1530 out_be64(&priv1->mfc_tclass_id_RW, csa->priv1.mfc_tclass_id_RW); 1501 spu_mfc_tclass_id_set(spu, csa->priv1.mfc_tclass_id_RW);
1531 eieio(); 1502 eieio();
1532} 1503}
1533 1504
@@ -1689,7 +1660,6 @@ static inline void check_ppu_mb_stat(struct spu_state *csa, struct spu *spu)
1689 1660
1690static inline void check_ppuint_mb_stat(struct spu_state *csa, struct spu *spu) 1661static inline void check_ppuint_mb_stat(struct spu_state *csa, struct spu *spu)
1691{ 1662{
1692 struct spu_priv1 __iomem *priv1 = spu->priv1;
1693 struct spu_priv2 __iomem *priv2 = spu->priv2; 1663 struct spu_priv2 __iomem *priv2 = spu->priv2;
1694 u64 dummy = 0UL; 1664 u64 dummy = 0UL;
1695 1665
@@ -1700,8 +1670,7 @@ static inline void check_ppuint_mb_stat(struct spu_state *csa, struct spu *spu)
1700 if ((csa->prob.mb_stat_R & 0xFF0000) == 0) { 1670 if ((csa->prob.mb_stat_R & 0xFF0000) == 0) {
1701 dummy = in_be64(&priv2->puint_mb_R); 1671 dummy = in_be64(&priv2->puint_mb_R);
1702 eieio(); 1672 eieio();
1703 out_be64(&priv1->int_stat_class2_RW, 1673 spu_int_stat_clear(spu, 2, CLASS2_ENABLE_MAILBOX_INTR);
1704 CLASS2_ENABLE_MAILBOX_INTR);
1705 eieio(); 1674 eieio();
1706 } 1675 }
1707} 1676}
@@ -1729,12 +1698,10 @@ static inline void restore_mfc_slbs(struct spu_state *csa, struct spu *spu)
1729 1698
1730static inline void restore_mfc_sr1(struct spu_state *csa, struct spu *spu) 1699static inline void restore_mfc_sr1(struct spu_state *csa, struct spu *spu)
1731{ 1700{
1732 struct spu_priv1 __iomem *priv1 = spu->priv1;
1733
1734 /* Restore, Step 69: 1701 /* Restore, Step 69:
1735 * Restore the MFC_SR1 register from CSA. 1702 * Restore the MFC_SR1 register from CSA.
1736 */ 1703 */
1737 out_be64(&priv1->mfc_sr1_RW, csa->priv1.mfc_sr1_RW); 1704 spu_mfc_sr1_set(spu, csa->priv1.mfc_sr1_RW);
1738 eieio(); 1705 eieio();
1739} 1706}
1740 1707
@@ -1792,15 +1759,13 @@ static inline void reset_switch_active(struct spu_state *csa, struct spu *spu)
1792 1759
1793static inline void reenable_interrupts(struct spu_state *csa, struct spu *spu) 1760static inline void reenable_interrupts(struct spu_state *csa, struct spu *spu)
1794{ 1761{
1795 struct spu_priv1 __iomem *priv1 = spu->priv1;
1796
1797 /* Restore, Step 75: 1762 /* Restore, Step 75:
1798 * Re-enable SPU interrupts. 1763 * Re-enable SPU interrupts.
1799 */ 1764 */
1800 spin_lock_irq(&spu->register_lock); 1765 spin_lock_irq(&spu->register_lock);
1801 out_be64(&priv1->int_mask_class0_RW, csa->priv1.int_mask_class0_RW); 1766 spu_int_mask_set(spu, 0, csa->priv1.int_mask_class0_RW);
1802 out_be64(&priv1->int_mask_class1_RW, csa->priv1.int_mask_class1_RW); 1767 spu_int_mask_set(spu, 1, csa->priv1.int_mask_class1_RW);
1803 out_be64(&priv1->int_mask_class2_RW, csa->priv1.int_mask_class2_RW); 1768 spu_int_mask_set(spu, 2, csa->priv1.int_mask_class2_RW);
1804 spin_unlock_irq(&spu->register_lock); 1769 spin_unlock_irq(&spu->register_lock);
1805} 1770}
1806 1771