Lines Matching refs:spu

3  *  PS3 Platform spu routines.
17 #include <asm/spu.h>
116 static struct spu_pdata *spu_pdata(struct spu *spu)
118 return spu->pdata;
150 static int __init construct_spu(struct spu *spu)
159 &spu_pdata(spu)->priv2_addr, &problem_phys,
161 &spu_pdata(spu)->shadow_addr,
162 &spu_pdata(spu)->spe_id);
163 spu->problem_phys = problem_phys;
164 spu->local_store_phys = local_store_phys;
175 static void spu_unmap(struct spu *spu)
177 iounmap(spu->priv2);
178 iounmap(spu->problem);
179 iounmap((__force u8 __iomem *)spu->local_store);
180 iounmap(spu_pdata(spu)->shadow);
184 * setup_areas - Map the spu regions into the address space.
186 * The current HV requires the spu shadow regs to be mapped with the
190 static int __init setup_areas(struct spu *spu)
195 spu_pdata(spu)->shadow = ioremap_prot(spu_pdata(spu)->shadow_addr,
197 if (!spu_pdata(spu)->shadow) {
202 spu->local_store = (__force void *)ioremap_wc(spu->local_store_phys, LS_SIZE);
204 if (!spu->local_store) {
210 spu->problem = ioremap(spu->problem_phys,
213 if (!spu->problem) {
218 spu->priv2 = ioremap(spu_pdata(spu)->priv2_addr,
221 if (!spu->priv2) {
226 dump_areas(spu_pdata(spu)->spe_id, spu_pdata(spu)->priv2_addr,
227 spu->problem_phys, spu->local_store_phys,
228 spu_pdata(spu)->shadow_addr);
229 dump_areas(spu_pdata(spu)->spe_id, (unsigned long)spu->priv2,
230 (unsigned long)spu->problem, (unsigned long)spu->local_store,
231 (unsigned long)spu_pdata(spu)->shadow);
236 spu_unmap(spu);
241 static int __init setup_interrupts(struct spu *spu)
245 result = ps3_spe_irq_setup(PS3_BINDING_CPU_ANY, spu_pdata(spu)->spe_id,
246 0, &spu->irqs[0]);
251 result = ps3_spe_irq_setup(PS3_BINDING_CPU_ANY, spu_pdata(spu)->spe_id,
252 1, &spu->irqs[1]);
257 result = ps3_spe_irq_setup(PS3_BINDING_CPU_ANY, spu_pdata(spu)->spe_id,
258 2, &spu->irqs[2]);
266 ps3_spe_irq_destroy(spu->irqs[1]);
268 ps3_spe_irq_destroy(spu->irqs[0]);
270 spu->irqs[0] = spu->irqs[1] = spu->irqs[2] = 0;
274 static int __init enable_spu(struct spu *spu)
278 result = lv1_enable_logical_spe(spu_pdata(spu)->spe_id,
279 spu_pdata(spu)->resource_id);
287 result = setup_areas(spu);
292 result = setup_interrupts(spu);
300 spu_unmap(spu);
302 lv1_disable_logical_spe(spu_pdata(spu)->spe_id, 0);
307 static int ps3_destroy_spu(struct spu *spu)
311 pr_debug("%s:%d spu_%d\n", __func__, __LINE__, spu->number);
313 result = lv1_disable_logical_spe(spu_pdata(spu)->spe_id, 0);
316 ps3_spe_irq_destroy(spu->irqs[2]);
317 ps3_spe_irq_destroy(spu->irqs[1]);
318 ps3_spe_irq_destroy(spu->irqs[0]);
320 spu->irqs[0] = spu->irqs[1] = spu->irqs[2] = 0;
322 spu_unmap(spu);
324 result = lv1_destruct_logical_spe(spu_pdata(spu)->spe_id);
327 kfree(spu->pdata);
328 spu->pdata = NULL;
333 static int __init ps3_create_spu(struct spu *spu, void *data)
337 pr_debug("%s:%d spu_%d\n", __func__, __LINE__, spu->number);
339 spu->pdata = kzalloc(sizeof(struct spu_pdata),
342 if (!spu->pdata) {
347 spu_pdata(spu)->resource_id = (unsigned long)data;
351 spu_pdata(spu)->cache.sr1 = 0x33;
353 result = construct_spu(spu);
360 result = enable_spu(spu);
365 /* Make sure the spu is in SPE_EX_STATE_EXECUTED. */
368 while (in_be64(&spu_pdata(spu)->shadow->spe_execution_status)
376 ps3_destroy_spu(spu);
433 * for incorrect access to the spu problem state when the spu context is
434 * disabled. This check could be implemented with a flag added to the spu
436 * to unmap spu problem state pages. When the spu is enabled with
438 * and when the spu is disabled with ps3_disable_spu() the flag would be
462 static void int_mask_and(struct spu *spu, int class, u64 mask)
467 old_mask = spu_int_mask_get(spu, class);
468 spu_int_mask_set(spu, class, old_mask & mask);
471 static void int_mask_or(struct spu *spu, int class, u64 mask)
475 old_mask = spu_int_mask_get(spu, class);
476 spu_int_mask_set(spu, class, old_mask | mask);
479 static void int_mask_set(struct spu *spu, int class, u64 mask)
481 spu_pdata(spu)->cache.masks[class] = mask;
482 lv1_set_spe_interrupt_mask(spu_pdata(spu)->spe_id, class,
483 spu_pdata(spu)->cache.masks[class]);
486 static u64 int_mask_get(struct spu *spu, int class)
488 return spu_pdata(spu)->cache.masks[class];
491 static void int_stat_clear(struct spu *spu, int class, u64 stat)
495 lv1_clear_spe_interrupt_status(spu_pdata(spu)->spe_id, class,
499 static u64 int_stat_get(struct spu *spu, int class)
503 lv1_get_spe_interrupt_status(spu_pdata(spu)->spe_id, class, &stat);
507 static void cpu_affinity_set(struct spu *spu, int cpu)
512 static u64 mfc_dar_get(struct spu *spu)
514 return in_be64(&spu_pdata(spu)->shadow->mfc_dar_RW);
517 static void mfc_dsisr_set(struct spu *spu, u64 dsisr)
522 static u64 mfc_dsisr_get(struct spu *spu)
524 return in_be64(&spu_pdata(spu)->shadow->mfc_dsisr_RW);
527 static void mfc_sdr_setup(struct spu *spu)
532 static void mfc_sr1_set(struct spu *spu, u64 sr1)
539 BUG_ON((sr1 & allowed) != (spu_pdata(spu)->cache.sr1 & allowed));
541 spu_pdata(spu)->cache.sr1 = sr1;
543 spu_pdata(spu)->spe_id,
545 spu_pdata(spu)->cache.sr1);
548 static u64 mfc_sr1_get(struct spu *spu)
550 return spu_pdata(spu)->cache.sr1;
553 static void mfc_tclass_id_set(struct spu *spu, u64 tclass_id)
555 spu_pdata(spu)->cache.tclass_id = tclass_id;
557 spu_pdata(spu)->spe_id,
559 spu_pdata(spu)->cache.tclass_id);
562 static u64 mfc_tclass_id_get(struct spu *spu)
564 return spu_pdata(spu)->cache.tclass_id;
567 static void tlb_invalidate(struct spu *spu)
572 static void resource_allocation_groupID_set(struct spu *spu, u64 id)
577 static u64 resource_allocation_groupID_get(struct spu *spu)
582 static void resource_allocation_enable_set(struct spu *spu, u64 enable)
587 static u64 resource_allocation_enable_get(struct spu *spu)