1 /* 2 * spu_switch.c 3 * 4 * (C) Copyright IBM Corp. 2005 5 * 6 * Author: Mark Nutter <mnutter@us.ibm.com> 7 * 8 * Host-side part of SPU context switch sequence outlined in 9 * Synergistic Processor Element, Book IV. 10 * 11 * A fully premptive switch of an SPE is very expensive in terms 12 * of time and system resources. SPE Book IV indicates that SPE 13 * allocation should follow a "serially reusable device" model, 14 * in which the SPE is assigned a task until it completes. When 15 * this is not possible, this sequence may be used to premptively 16 * save, and then later (optionally) restore the context of a 17 * program executing on an SPE. 18 * 19 * 20 * This program is free software; you can redistribute it and/or modify 21 * it under the terms of the GNU General Public License as published by 22 * the Free Software Foundation; either version 2, or (at your option) 23 * any later version. 24 * 25 * This program is distributed in the hope that it will be useful, 26 * but WITHOUT ANY WARRANTY; without even the implied warranty of 27 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 28 * GNU General Public License for more details. 29 * 30 * You should have received a copy of the GNU General Public License 31 * along with this program; if not, write to the Free Software 32 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 33 */ 34 35 #include <linux/export.h> 36 #include <linux/errno.h> 37 #include <linux/hardirq.h> 38 #include <linux/sched.h> 39 #include <linux/kernel.h> 40 #include <linux/mm.h> 41 #include <linux/vmalloc.h> 42 #include <linux/smp.h> 43 #include <linux/stddef.h> 44 #include <linux/unistd.h> 45 46 #include <asm/io.h> 47 #include <asm/spu.h> 48 #include <asm/spu_priv1.h> 49 #include <asm/spu_csa.h> 50 #include <asm/mmu_context.h> 51 52 #include "spufs.h" 53 54 #include "spu_save_dump.h" 55 #include "spu_restore_dump.h" 56 57 #if 0 58 #define POLL_WHILE_TRUE(_c) { \ 59 do { \ 60 } while (_c); \ 61 } 62 #else 63 #define RELAX_SPIN_COUNT 1000 64 #define POLL_WHILE_TRUE(_c) { \ 65 do { \ 66 int _i; \ 67 for (_i=0; _i<RELAX_SPIN_COUNT && (_c); _i++) { \ 68 cpu_relax(); \ 69 } \ 70 if (unlikely(_c)) yield(); \ 71 else break; \ 72 } while (_c); \ 73 } 74 #endif /* debug */ 75 76 #define POLL_WHILE_FALSE(_c) POLL_WHILE_TRUE(!(_c)) 77 78 static inline void acquire_spu_lock(struct spu *spu) 79 { 80 /* Save, Step 1: 81 * Restore, Step 1: 82 * Acquire SPU-specific mutual exclusion lock. 83 * TBD. 84 */ 85 } 86 87 static inline void release_spu_lock(struct spu *spu) 88 { 89 /* Restore, Step 76: 90 * Release SPU-specific mutual exclusion lock. 91 * TBD. 92 */ 93 } 94 95 static inline int check_spu_isolate(struct spu_state *csa, struct spu *spu) 96 { 97 struct spu_problem __iomem *prob = spu->problem; 98 u32 isolate_state; 99 100 /* Save, Step 2: 101 * Save, Step 6: 102 * If SPU_Status[E,L,IS] any field is '1', this 103 * SPU is in isolate state and cannot be context 104 * saved at this time. 105 */ 106 isolate_state = SPU_STATUS_ISOLATED_STATE | 107 SPU_STATUS_ISOLATED_LOAD_STATUS | SPU_STATUS_ISOLATED_EXIT_STATUS; 108 return (in_be32(&prob->spu_status_R) & isolate_state) ? 1 : 0; 109 } 110 111 static inline void disable_interrupts(struct spu_state *csa, struct spu *spu) 112 { 113 /* Save, Step 3: 114 * Restore, Step 2: 115 * Save INT_Mask_class0 in CSA. 116 * Write INT_MASK_class0 with value of 0. 117 * Save INT_Mask_class1 in CSA. 118 * Write INT_MASK_class1 with value of 0. 119 * Save INT_Mask_class2 in CSA. 120 * Write INT_MASK_class2 with value of 0. 121 * Synchronize all three interrupts to be sure 122 * we no longer execute a handler on another CPU. 123 */ 124 spin_lock_irq(&spu->register_lock); 125 if (csa) { 126 csa->priv1.int_mask_class0_RW = spu_int_mask_get(spu, 0); 127 csa->priv1.int_mask_class1_RW = spu_int_mask_get(spu, 1); 128 csa->priv1.int_mask_class2_RW = spu_int_mask_get(spu, 2); 129 } 130 spu_int_mask_set(spu, 0, 0ul); 131 spu_int_mask_set(spu, 1, 0ul); 132 spu_int_mask_set(spu, 2, 0ul); 133 eieio(); 134 spin_unlock_irq(&spu->register_lock); 135 136 /* 137 * This flag needs to be set before calling synchronize_irq so 138 * that the update will be visible to the relevant handlers 139 * via a simple load. 140 */ 141 set_bit(SPU_CONTEXT_SWITCH_PENDING, &spu->flags); 142 clear_bit(SPU_CONTEXT_FAULT_PENDING, &spu->flags); 143 synchronize_irq(spu->irqs[0]); 144 synchronize_irq(spu->irqs[1]); 145 synchronize_irq(spu->irqs[2]); 146 } 147 148 static inline void set_watchdog_timer(struct spu_state *csa, struct spu *spu) 149 { 150 /* Save, Step 4: 151 * Restore, Step 25. 152 * Set a software watchdog timer, which specifies the 153 * maximum allowable time for a context save sequence. 154 * 155 * For present, this implementation will not set a global 156 * watchdog timer, as virtualization & variable system load 157 * may cause unpredictable execution times. 158 */ 159 } 160 161 static inline void inhibit_user_access(struct spu_state *csa, struct spu *spu) 162 { 163 /* Save, Step 5: 164 * Restore, Step 3: 165 * Inhibit user-space access (if provided) to this 166 * SPU by unmapping the virtual pages assigned to 167 * the SPU memory-mapped I/O (MMIO) for problem 168 * state. TBD. 169 */ 170 } 171 172 static inline void set_switch_pending(struct spu_state *csa, struct spu *spu) 173 { 174 /* Save, Step 7: 175 * Restore, Step 5: 176 * Set a software context switch pending flag. 177 * Done above in Step 3 - disable_interrupts(). 178 */ 179 } 180 181 static inline void save_mfc_cntl(struct spu_state *csa, struct spu *spu) 182 { 183 struct spu_priv2 __iomem *priv2 = spu->priv2; 184 185 /* Save, Step 8: 186 * Suspend DMA and save MFC_CNTL. 187 */ 188 switch (in_be64(&priv2->mfc_control_RW) & 189 MFC_CNTL_SUSPEND_DMA_STATUS_MASK) { 190 case MFC_CNTL_SUSPEND_IN_PROGRESS: 191 POLL_WHILE_FALSE((in_be64(&priv2->mfc_control_RW) & 192 MFC_CNTL_SUSPEND_DMA_STATUS_MASK) == 193 MFC_CNTL_SUSPEND_COMPLETE); 194 /* fall through */ 195 case MFC_CNTL_SUSPEND_COMPLETE: 196 if (csa) 197 csa->priv2.mfc_control_RW = 198 in_be64(&priv2->mfc_control_RW) | 199 MFC_CNTL_SUSPEND_DMA_QUEUE; 200 break; 201 case MFC_CNTL_NORMAL_DMA_QUEUE_OPERATION: 202 out_be64(&priv2->mfc_control_RW, MFC_CNTL_SUSPEND_DMA_QUEUE); 203 POLL_WHILE_FALSE((in_be64(&priv2->mfc_control_RW) & 204 MFC_CNTL_SUSPEND_DMA_STATUS_MASK) == 205 MFC_CNTL_SUSPEND_COMPLETE); 206 if (csa) 207 csa->priv2.mfc_control_RW = 208 in_be64(&priv2->mfc_control_RW) & 209 ~MFC_CNTL_SUSPEND_DMA_QUEUE & 210 ~MFC_CNTL_SUSPEND_MASK; 211 break; 212 } 213 } 214 215 static inline void save_spu_runcntl(struct spu_state *csa, struct spu *spu) 216 { 217 struct spu_problem __iomem *prob = spu->problem; 218 219 /* Save, Step 9: 220 * Save SPU_Runcntl in the CSA. This value contains 221 * the "Application Desired State". 222 */ 223 csa->prob.spu_runcntl_RW = in_be32(&prob->spu_runcntl_RW); 224 } 225 226 static inline void save_mfc_sr1(struct spu_state *csa, struct spu *spu) 227 { 228 /* Save, Step 10: 229 * Save MFC_SR1 in the CSA. 230 */ 231 csa->priv1.mfc_sr1_RW = spu_mfc_sr1_get(spu); 232 } 233 234 static inline void save_spu_status(struct spu_state *csa, struct spu *spu) 235 { 236 struct spu_problem __iomem *prob = spu->problem; 237 238 /* Save, Step 11: 239 * Read SPU_Status[R], and save to CSA. 240 */ 241 if ((in_be32(&prob->spu_status_R) & SPU_STATUS_RUNNING) == 0) { 242 csa->prob.spu_status_R = in_be32(&prob->spu_status_R); 243 } else { 244 u32 stopped; 245 246 out_be32(&prob->spu_runcntl_RW, SPU_RUNCNTL_STOP); 247 eieio(); 248 POLL_WHILE_TRUE(in_be32(&prob->spu_status_R) & 249 SPU_STATUS_RUNNING); 250 stopped = 251 SPU_STATUS_INVALID_INSTR | SPU_STATUS_SINGLE_STEP | 252 SPU_STATUS_STOPPED_BY_HALT | SPU_STATUS_STOPPED_BY_STOP; 253 if ((in_be32(&prob->spu_status_R) & stopped) == 0) 254 csa->prob.spu_status_R = SPU_STATUS_RUNNING; 255 else 256 csa->prob.spu_status_R = in_be32(&prob->spu_status_R); 257 } 258 } 259 260 static inline void save_mfc_stopped_status(struct spu_state *csa, 261 struct spu *spu) 262 { 263 struct spu_priv2 __iomem *priv2 = spu->priv2; 264 const u64 mask = MFC_CNTL_DECREMENTER_RUNNING | 265 MFC_CNTL_DMA_QUEUES_EMPTY; 266 267 /* Save, Step 12: 268 * Read MFC_CNTL[Ds]. Update saved copy of 269 * CSA.MFC_CNTL[Ds]. 270 * 271 * update: do the same with MFC_CNTL[Q]. 272 */ 273 csa->priv2.mfc_control_RW &= ~mask; 274 csa->priv2.mfc_control_RW |= in_be64(&priv2->mfc_control_RW) & mask; 275 } 276 277 static inline void halt_mfc_decr(struct spu_state *csa, struct spu *spu) 278 { 279 struct spu_priv2 __iomem *priv2 = spu->priv2; 280 281 /* Save, Step 13: 282 * Write MFC_CNTL[Dh] set to a '1' to halt 283 * the decrementer. 284 */ 285 out_be64(&priv2->mfc_control_RW, 286 MFC_CNTL_DECREMENTER_HALTED | MFC_CNTL_SUSPEND_MASK); 287 eieio(); 288 } 289 290 static inline void save_timebase(struct spu_state *csa, struct spu *spu) 291 { 292 /* Save, Step 14: 293 * Read PPE Timebase High and Timebase low registers 294 * and save in CSA. TBD. 295 */ 296 csa->suspend_time = get_cycles(); 297 } 298 299 static inline void remove_other_spu_access(struct spu_state *csa, 300 struct spu *spu) 301 { 302 /* Save, Step 15: 303 * Remove other SPU access to this SPU by unmapping 304 * this SPU's pages from their address space. TBD. 305 */ 306 } 307 308 static inline void do_mfc_mssync(struct spu_state *csa, struct spu *spu) 309 { 310 struct spu_problem __iomem *prob = spu->problem; 311 312 /* Save, Step 16: 313 * Restore, Step 11. 314 * Write SPU_MSSync register. Poll SPU_MSSync[P] 315 * for a value of 0. 316 */ 317 out_be64(&prob->spc_mssync_RW, 1UL); 318 POLL_WHILE_TRUE(in_be64(&prob->spc_mssync_RW) & MS_SYNC_PENDING); 319 } 320 321 static inline void issue_mfc_tlbie(struct spu_state *csa, struct spu *spu) 322 { 323 /* Save, Step 17: 324 * Restore, Step 12. 325 * Restore, Step 48. 326 * Write TLB_Invalidate_Entry[IS,VPN,L,Lp]=0 register. 327 * Then issue a PPE sync instruction. 328 */ 329 spu_tlb_invalidate(spu); 330 mb(); 331 } 332 333 static inline void handle_pending_interrupts(struct spu_state *csa, 334 struct spu *spu) 335 { 336 /* Save, Step 18: 337 * Handle any pending interrupts from this SPU 338 * here. This is OS or hypervisor specific. One 339 * option is to re-enable interrupts to handle any 340 * pending interrupts, with the interrupt handlers 341 * recognizing the software Context Switch Pending 342 * flag, to ensure the SPU execution or MFC command 343 * queue is not restarted. TBD. 344 */ 345 } 346 347 static inline void save_mfc_queues(struct spu_state *csa, struct spu *spu) 348 { 349 struct spu_priv2 __iomem *priv2 = spu->priv2; 350 int i; 351 352 /* Save, Step 19: 353 * If MFC_Cntl[Se]=0 then save 354 * MFC command queues. 355 */ 356 if ((in_be64(&priv2->mfc_control_RW) & MFC_CNTL_DMA_QUEUES_EMPTY) == 0) { 357 for (i = 0; i < 8; i++) { 358 csa->priv2.puq[i].mfc_cq_data0_RW = 359 in_be64(&priv2->puq[i].mfc_cq_data0_RW); 360 csa->priv2.puq[i].mfc_cq_data1_RW = 361 in_be64(&priv2->puq[i].mfc_cq_data1_RW); 362 csa->priv2.puq[i].mfc_cq_data2_RW = 363 in_be64(&priv2->puq[i].mfc_cq_data2_RW); 364 csa->priv2.puq[i].mfc_cq_data3_RW = 365 in_be64(&priv2->puq[i].mfc_cq_data3_RW); 366 } 367 for (i = 0; i < 16; i++) { 368 csa->priv2.spuq[i].mfc_cq_data0_RW = 369 in_be64(&priv2->spuq[i].mfc_cq_data0_RW); 370 csa->priv2.spuq[i].mfc_cq_data1_RW = 371 in_be64(&priv2->spuq[i].mfc_cq_data1_RW); 372 csa->priv2.spuq[i].mfc_cq_data2_RW = 373 in_be64(&priv2->spuq[i].mfc_cq_data2_RW); 374 csa->priv2.spuq[i].mfc_cq_data3_RW = 375 in_be64(&priv2->spuq[i].mfc_cq_data3_RW); 376 } 377 } 378 } 379 380 static inline void save_ppu_querymask(struct spu_state *csa, struct spu *spu) 381 { 382 struct spu_problem __iomem *prob = spu->problem; 383 384 /* Save, Step 20: 385 * Save the PPU_QueryMask register 386 * in the CSA. 387 */ 388 csa->prob.dma_querymask_RW = in_be32(&prob->dma_querymask_RW); 389 } 390 391 static inline void save_ppu_querytype(struct spu_state *csa, struct spu *spu) 392 { 393 struct spu_problem __iomem *prob = spu->problem; 394 395 /* Save, Step 21: 396 * Save the PPU_QueryType register 397 * in the CSA. 398 */ 399 csa->prob.dma_querytype_RW = in_be32(&prob->dma_querytype_RW); 400 } 401 402 static inline void save_ppu_tagstatus(struct spu_state *csa, struct spu *spu) 403 { 404 struct spu_problem __iomem *prob = spu->problem; 405 406 /* Save the Prxy_TagStatus register in the CSA. 407 * 408 * It is unnecessary to restore dma_tagstatus_R, however, 409 * dma_tagstatus_R in the CSA is accessed via backing_ops, so 410 * we must save it. 411 */ 412 csa->prob.dma_tagstatus_R = in_be32(&prob->dma_tagstatus_R); 413 } 414 415 static inline void save_mfc_csr_tsq(struct spu_state *csa, struct spu *spu) 416 { 417 struct spu_priv2 __iomem *priv2 = spu->priv2; 418 419 /* Save, Step 22: 420 * Save the MFC_CSR_TSQ register 421 * in the LSCSA. 422 */ 423 csa->priv2.spu_tag_status_query_RW = 424 in_be64(&priv2->spu_tag_status_query_RW); 425 } 426 427 static inline void save_mfc_csr_cmd(struct spu_state *csa, struct spu *spu) 428 { 429 struct spu_priv2 __iomem *priv2 = spu->priv2; 430 431 /* Save, Step 23: 432 * Save the MFC_CSR_CMD1 and MFC_CSR_CMD2 433 * registers in the CSA. 434 */ 435 csa->priv2.spu_cmd_buf1_RW = in_be64(&priv2->spu_cmd_buf1_RW); 436 csa->priv2.spu_cmd_buf2_RW = in_be64(&priv2->spu_cmd_buf2_RW); 437 } 438 439 static inline void save_mfc_csr_ato(struct spu_state *csa, struct spu *spu) 440 { 441 struct spu_priv2 __iomem *priv2 = spu->priv2; 442 443 /* Save, Step 24: 444 * Save the MFC_CSR_ATO register in 445 * the CSA. 446 */ 447 csa->priv2.spu_atomic_status_RW = in_be64(&priv2->spu_atomic_status_RW); 448 } 449 450 static inline void save_mfc_tclass_id(struct spu_state *csa, struct spu *spu) 451 { 452 /* Save, Step 25: 453 * Save the MFC_TCLASS_ID register in 454 * the CSA. 455 */ 456 csa->priv1.mfc_tclass_id_RW = spu_mfc_tclass_id_get(spu); 457 } 458 459 static inline void set_mfc_tclass_id(struct spu_state *csa, struct spu *spu) 460 { 461 /* Save, Step 26: 462 * Restore, Step 23. 463 * Write the MFC_TCLASS_ID register with 464 * the value 0x10000000. 465 */ 466 spu_mfc_tclass_id_set(spu, 0x10000000); 467 eieio(); 468 } 469 470 static inline void purge_mfc_queue(struct spu_state *csa, struct spu *spu) 471 { 472 struct spu_priv2 __iomem *priv2 = spu->priv2; 473 474 /* Save, Step 27: 475 * Restore, Step 14. 476 * Write MFC_CNTL[Pc]=1 (purge queue). 477 */ 478 out_be64(&priv2->mfc_control_RW, 479 MFC_CNTL_PURGE_DMA_REQUEST | 480 MFC_CNTL_SUSPEND_MASK); 481 eieio(); 482 } 483 484 static inline void wait_purge_complete(struct spu_state *csa, struct spu *spu) 485 { 486 struct spu_priv2 __iomem *priv2 = spu->priv2; 487 488 /* Save, Step 28: 489 * Poll MFC_CNTL[Ps] until value '11' is read 490 * (purge complete). 491 */ 492 POLL_WHILE_FALSE((in_be64(&priv2->mfc_control_RW) & 493 MFC_CNTL_PURGE_DMA_STATUS_MASK) == 494 MFC_CNTL_PURGE_DMA_COMPLETE); 495 } 496 497 static inline void setup_mfc_sr1(struct spu_state *csa, struct spu *spu) 498 { 499 /* Save, Step 30: 500 * Restore, Step 18: 501 * Write MFC_SR1 with MFC_SR1[D=0,S=1] and 502 * MFC_SR1[TL,R,Pr,T] set correctly for the 503 * OS specific environment. 504 * 505 * Implementation note: The SPU-side code 506 * for save/restore is privileged, so the 507 * MFC_SR1[Pr] bit is not set. 508 * 509 */ 510 spu_mfc_sr1_set(spu, (MFC_STATE1_MASTER_RUN_CONTROL_MASK | 511 MFC_STATE1_RELOCATE_MASK | 512 MFC_STATE1_BUS_TLBIE_MASK)); 513 } 514 515 static inline void save_spu_npc(struct spu_state *csa, struct spu *spu) 516 { 517 struct spu_problem __iomem *prob = spu->problem; 518 519 /* Save, Step 31: 520 * Save SPU_NPC in the CSA. 521 */ 522 csa->prob.spu_npc_RW = in_be32(&prob->spu_npc_RW); 523 } 524 525 static inline void save_spu_privcntl(struct spu_state *csa, struct spu *spu) 526 { 527 struct spu_priv2 __iomem *priv2 = spu->priv2; 528 529 /* Save, Step 32: 530 * Save SPU_PrivCntl in the CSA. 531 */ 532 csa->priv2.spu_privcntl_RW = in_be64(&priv2->spu_privcntl_RW); 533 } 534 535 static inline void reset_spu_privcntl(struct spu_state *csa, struct spu *spu) 536 { 537 struct spu_priv2 __iomem *priv2 = spu->priv2; 538 539 /* Save, Step 33: 540 * Restore, Step 16: 541 * Write SPU_PrivCntl[S,Le,A] fields reset to 0. 542 */ 543 out_be64(&priv2->spu_privcntl_RW, 0UL); 544 eieio(); 545 } 546 547 static inline void save_spu_lslr(struct spu_state *csa, struct spu *spu) 548 { 549 struct spu_priv2 __iomem *priv2 = spu->priv2; 550 551 /* Save, Step 34: 552 * Save SPU_LSLR in the CSA. 553 */ 554 csa->priv2.spu_lslr_RW = in_be64(&priv2->spu_lslr_RW); 555 } 556 557 static inline void reset_spu_lslr(struct spu_state *csa, struct spu *spu) 558 { 559 struct spu_priv2 __iomem *priv2 = spu->priv2; 560 561 /* Save, Step 35: 562 * Restore, Step 17. 563 * Reset SPU_LSLR. 564 */ 565 out_be64(&priv2->spu_lslr_RW, LS_ADDR_MASK); 566 eieio(); 567 } 568 569 static inline void save_spu_cfg(struct spu_state *csa, struct spu *spu) 570 { 571 struct spu_priv2 __iomem *priv2 = spu->priv2; 572 573 /* Save, Step 36: 574 * Save SPU_Cfg in the CSA. 575 */ 576 csa->priv2.spu_cfg_RW = in_be64(&priv2->spu_cfg_RW); 577 } 578 579 static inline void save_pm_trace(struct spu_state *csa, struct spu *spu) 580 { 581 /* Save, Step 37: 582 * Save PM_Trace_Tag_Wait_Mask in the CSA. 583 * Not performed by this implementation. 584 */ 585 } 586 587 static inline void save_mfc_rag(struct spu_state *csa, struct spu *spu) 588 { 589 /* Save, Step 38: 590 * Save RA_GROUP_ID register and the 591 * RA_ENABLE reigster in the CSA. 592 */ 593 csa->priv1.resource_allocation_groupID_RW = 594 spu_resource_allocation_groupID_get(spu); 595 csa->priv1.resource_allocation_enable_RW = 596 spu_resource_allocation_enable_get(spu); 597 } 598 599 static inline void save_ppu_mb_stat(struct spu_state *csa, struct spu *spu) 600 { 601 struct spu_problem __iomem *prob = spu->problem; 602 603 /* Save, Step 39: 604 * Save MB_Stat register in the CSA. 605 */ 606 csa->prob.mb_stat_R = in_be32(&prob->mb_stat_R); 607 } 608 609 static inline void save_ppu_mb(struct spu_state *csa, struct spu *spu) 610 { 611 struct spu_problem __iomem *prob = spu->problem; 612 613 /* Save, Step 40: 614 * Save the PPU_MB register in the CSA. 615 */ 616 csa->prob.pu_mb_R = in_be32(&prob->pu_mb_R); 617 } 618 619 static inline void save_ppuint_mb(struct spu_state *csa, struct spu *spu) 620 { 621 struct spu_priv2 __iomem *priv2 = spu->priv2; 622 623 /* Save, Step 41: 624 * Save the PPUINT_MB register in the CSA. 625 */ 626 csa->priv2.puint_mb_R = in_be64(&priv2->puint_mb_R); 627 } 628 629 static inline void save_ch_part1(struct spu_state *csa, struct spu *spu) 630 { 631 struct spu_priv2 __iomem *priv2 = spu->priv2; 632 u64 idx, ch_indices[] = { 0UL, 3UL, 4UL, 24UL, 25UL, 27UL }; 633 int i; 634 635 /* Save, Step 42: 636 */ 637 638 /* Save CH 1, without channel count */ 639 out_be64(&priv2->spu_chnlcntptr_RW, 1); 640 csa->spu_chnldata_RW[1] = in_be64(&priv2->spu_chnldata_RW); 641 642 /* Save the following CH: [0,3,4,24,25,27] */ 643 for (i = 0; i < ARRAY_SIZE(ch_indices); i++) { 644 idx = ch_indices[i]; 645 out_be64(&priv2->spu_chnlcntptr_RW, idx); 646 eieio(); 647 csa->spu_chnldata_RW[idx] = in_be64(&priv2->spu_chnldata_RW); 648 csa->spu_chnlcnt_RW[idx] = in_be64(&priv2->spu_chnlcnt_RW); 649 out_be64(&priv2->spu_chnldata_RW, 0UL); 650 out_be64(&priv2->spu_chnlcnt_RW, 0UL); 651 eieio(); 652 } 653 } 654 655 static inline void save_spu_mb(struct spu_state *csa, struct spu *spu) 656 { 657 struct spu_priv2 __iomem *priv2 = spu->priv2; 658 int i; 659 660 /* Save, Step 43: 661 * Save SPU Read Mailbox Channel. 662 */ 663 out_be64(&priv2->spu_chnlcntptr_RW, 29UL); 664 eieio(); 665 csa->spu_chnlcnt_RW[29] = in_be64(&priv2->spu_chnlcnt_RW); 666 for (i = 0; i < 4; i++) { 667 csa->spu_mailbox_data[i] = in_be64(&priv2->spu_chnldata_RW); 668 } 669 out_be64(&priv2->spu_chnlcnt_RW, 0UL); 670 eieio(); 671 } 672 673 static inline void save_mfc_cmd(struct spu_state *csa, struct spu *spu) 674 { 675 struct spu_priv2 __iomem *priv2 = spu->priv2; 676 677 /* Save, Step 44: 678 * Save MFC_CMD Channel. 679 */ 680 out_be64(&priv2->spu_chnlcntptr_RW, 21UL); 681 eieio(); 682 csa->spu_chnlcnt_RW[21] = in_be64(&priv2->spu_chnlcnt_RW); 683 eieio(); 684 } 685 686 static inline void reset_ch(struct spu_state *csa, struct spu *spu) 687 { 688 struct spu_priv2 __iomem *priv2 = spu->priv2; 689 u64 ch_indices[4] = { 21UL, 23UL, 28UL, 30UL }; 690 u64 ch_counts[4] = { 16UL, 1UL, 1UL, 1UL }; 691 u64 idx; 692 int i; 693 694 /* Save, Step 45: 695 * Reset the following CH: [21, 23, 28, 30] 696 */ 697 for (i = 0; i < 4; i++) { 698 idx = ch_indices[i]; 699 out_be64(&priv2->spu_chnlcntptr_RW, idx); 700 eieio(); 701 out_be64(&priv2->spu_chnlcnt_RW, ch_counts[i]); 702 eieio(); 703 } 704 } 705 706 static inline void resume_mfc_queue(struct spu_state *csa, struct spu *spu) 707 { 708 struct spu_priv2 __iomem *priv2 = spu->priv2; 709 710 /* Save, Step 46: 711 * Restore, Step 25. 712 * Write MFC_CNTL[Sc]=0 (resume queue processing). 713 */ 714 out_be64(&priv2->mfc_control_RW, MFC_CNTL_RESUME_DMA_QUEUE); 715 } 716 717 static inline void setup_mfc_slbs(struct spu_state *csa, struct spu *spu, 718 unsigned int *code, int code_size) 719 { 720 /* Save, Step 47: 721 * Restore, Step 30. 722 * If MFC_SR1[R]=1, write 0 to SLB_Invalidate_All 723 * register, then initialize SLB_VSID and SLB_ESID 724 * to provide access to SPU context save code and 725 * LSCSA. 726 * 727 * This implementation places both the context 728 * switch code and LSCSA in kernel address space. 729 * 730 * Further this implementation assumes that the 731 * MFC_SR1[R]=1 (in other words, assume that 732 * translation is desired by OS environment). 733 */ 734 spu_invalidate_slbs(spu); 735 spu_setup_kernel_slbs(spu, csa->lscsa, code, code_size); 736 } 737 738 static inline void set_switch_active(struct spu_state *csa, struct spu *spu) 739 { 740 /* Save, Step 48: 741 * Restore, Step 23. 742 * Change the software context switch pending flag 743 * to context switch active. This implementation does 744 * not uses a switch active flag. 745 * 746 * Now that we have saved the mfc in the csa, we can add in the 747 * restart command if an exception occurred. 748 */ 749 if (test_bit(SPU_CONTEXT_FAULT_PENDING, &spu->flags)) 750 csa->priv2.mfc_control_RW |= MFC_CNTL_RESTART_DMA_COMMAND; 751 clear_bit(SPU_CONTEXT_SWITCH_PENDING, &spu->flags); 752 mb(); 753 } 754 755 static inline void enable_interrupts(struct spu_state *csa, struct spu *spu) 756 { 757 unsigned long class1_mask = CLASS1_ENABLE_SEGMENT_FAULT_INTR | 758 CLASS1_ENABLE_STORAGE_FAULT_INTR; 759 760 /* Save, Step 49: 761 * Restore, Step 22: 762 * Reset and then enable interrupts, as 763 * needed by OS. 764 * 765 * This implementation enables only class1 766 * (translation) interrupts. 767 */ 768 spin_lock_irq(&spu->register_lock); 769 spu_int_stat_clear(spu, 0, CLASS0_INTR_MASK); 770 spu_int_stat_clear(spu, 1, CLASS1_INTR_MASK); 771 spu_int_stat_clear(spu, 2, CLASS2_INTR_MASK); 772 spu_int_mask_set(spu, 0, 0ul); 773 spu_int_mask_set(spu, 1, class1_mask); 774 spu_int_mask_set(spu, 2, 0ul); 775 spin_unlock_irq(&spu->register_lock); 776 } 777 778 static inline int send_mfc_dma(struct spu *spu, unsigned long ea, 779 unsigned int ls_offset, unsigned int size, 780 unsigned int tag, unsigned int rclass, 781 unsigned int cmd) 782 { 783 struct spu_problem __iomem *prob = spu->problem; 784 union mfc_tag_size_class_cmd command; 785 unsigned int transfer_size; 786 volatile unsigned int status = 0x0; 787 788 while (size > 0) { 789 transfer_size = 790 (size > MFC_MAX_DMA_SIZE) ? MFC_MAX_DMA_SIZE : size; 791 command.u.mfc_size = transfer_size; 792 command.u.mfc_tag = tag; 793 command.u.mfc_rclassid = rclass; 794 command.u.mfc_cmd = cmd; 795 do { 796 out_be32(&prob->mfc_lsa_W, ls_offset); 797 out_be64(&prob->mfc_ea_W, ea); 798 out_be64(&prob->mfc_union_W.all64, command.all64); 799 status = 800 in_be32(&prob->mfc_union_W.by32.mfc_class_cmd32); 801 if (unlikely(status & 0x2)) { 802 cpu_relax(); 803 } 804 } while (status & 0x3); 805 size -= transfer_size; 806 ea += transfer_size; 807 ls_offset += transfer_size; 808 } 809 return 0; 810 } 811 812 static inline void save_ls_16kb(struct spu_state *csa, struct spu *spu) 813 { 814 unsigned long addr = (unsigned long)&csa->lscsa->ls[0]; 815 unsigned int ls_offset = 0x0; 816 unsigned int size = 16384; 817 unsigned int tag = 0; 818 unsigned int rclass = 0; 819 unsigned int cmd = MFC_PUT_CMD; 820 821 /* Save, Step 50: 822 * Issue a DMA command to copy the first 16K bytes 823 * of local storage to the CSA. 824 */ 825 send_mfc_dma(spu, addr, ls_offset, size, tag, rclass, cmd); 826 } 827 828 static inline void set_spu_npc(struct spu_state *csa, struct spu *spu) 829 { 830 struct spu_problem __iomem *prob = spu->problem; 831 832 /* Save, Step 51: 833 * Restore, Step 31. 834 * Write SPU_NPC[IE]=0 and SPU_NPC[LSA] to entry 835 * point address of context save code in local 836 * storage. 837 * 838 * This implementation uses SPU-side save/restore 839 * programs with entry points at LSA of 0. 840 */ 841 out_be32(&prob->spu_npc_RW, 0); 842 eieio(); 843 } 844 845 static inline void set_signot1(struct spu_state *csa, struct spu *spu) 846 { 847 struct spu_problem __iomem *prob = spu->problem; 848 union { 849 u64 ull; 850 u32 ui[2]; 851 } addr64; 852 853 /* Save, Step 52: 854 * Restore, Step 32: 855 * Write SPU_Sig_Notify_1 register with upper 32-bits 856 * of the CSA.LSCSA effective address. 857 */ 858 addr64.ull = (u64) csa->lscsa; 859 out_be32(&prob->signal_notify1, addr64.ui[0]); 860 eieio(); 861 } 862 863 static inline void set_signot2(struct spu_state *csa, struct spu *spu) 864 { 865 struct spu_problem __iomem *prob = spu->problem; 866 union { 867 u64 ull; 868 u32 ui[2]; 869 } addr64; 870 871 /* Save, Step 53: 872 * Restore, Step 33: 873 * Write SPU_Sig_Notify_2 register with lower 32-bits 874 * of the CSA.LSCSA effective address. 875 */ 876 addr64.ull = (u64) csa->lscsa; 877 out_be32(&prob->signal_notify2, addr64.ui[1]); 878 eieio(); 879 } 880 881 static inline void send_save_code(struct spu_state *csa, struct spu *spu) 882 { 883 unsigned long addr = (unsigned long)&spu_save_code[0]; 884 unsigned int ls_offset = 0x0; 885 unsigned int size = sizeof(spu_save_code); 886 unsigned int tag = 0; 887 unsigned int rclass = 0; 888 unsigned int cmd = MFC_GETFS_CMD; 889 890 /* Save, Step 54: 891 * Issue a DMA command to copy context save code 892 * to local storage and start SPU. 893 */ 894 send_mfc_dma(spu, addr, ls_offset, size, tag, rclass, cmd); 895 } 896 897 static inline void set_ppu_querymask(struct spu_state *csa, struct spu *spu) 898 { 899 struct spu_problem __iomem *prob = spu->problem; 900 901 /* Save, Step 55: 902 * Restore, Step 38. 903 * Write PPU_QueryMask=1 (enable Tag Group 0) 904 * and issue eieio instruction. 905 */ 906 out_be32(&prob->dma_querymask_RW, MFC_TAGID_TO_TAGMASK(0)); 907 eieio(); 908 } 909 910 static inline void wait_tag_complete(struct spu_state *csa, struct spu *spu) 911 { 912 struct spu_problem __iomem *prob = spu->problem; 913 u32 mask = MFC_TAGID_TO_TAGMASK(0); 914 unsigned long flags; 915 916 /* Save, Step 56: 917 * Restore, Step 39. 918 * Restore, Step 39. 919 * Restore, Step 46. 920 * Poll PPU_TagStatus[gn] until 01 (Tag group 0 complete) 921 * or write PPU_QueryType[TS]=01 and wait for Tag Group 922 * Complete Interrupt. Write INT_Stat_Class0 or 923 * INT_Stat_Class2 with value of 'handled'. 924 */ 925 POLL_WHILE_FALSE(in_be32(&prob->dma_tagstatus_R) & mask); 926 927 local_irq_save(flags); 928 spu_int_stat_clear(spu, 0, CLASS0_INTR_MASK); 929 spu_int_stat_clear(spu, 2, CLASS2_INTR_MASK); 930 local_irq_restore(flags); 931 } 932 933 static inline void wait_spu_stopped(struct spu_state *csa, struct spu *spu) 934 { 935 struct spu_problem __iomem *prob = spu->problem; 936 unsigned long flags; 937 938 /* Save, Step 57: 939 * Restore, Step 40. 940 * Poll until SPU_Status[R]=0 or wait for SPU Class 0 941 * or SPU Class 2 interrupt. Write INT_Stat_class0 942 * or INT_Stat_class2 with value of handled. 943 */ 944 POLL_WHILE_TRUE(in_be32(&prob->spu_status_R) & SPU_STATUS_RUNNING); 945 946 local_irq_save(flags); 947 spu_int_stat_clear(spu, 0, CLASS0_INTR_MASK); 948 spu_int_stat_clear(spu, 2, CLASS2_INTR_MASK); 949 local_irq_restore(flags); 950 } 951 952 static inline int check_save_status(struct spu_state *csa, struct spu *spu) 953 { 954 struct spu_problem __iomem *prob = spu->problem; 955 u32 complete; 956 957 /* Save, Step 54: 958 * If SPU_Status[P]=1 and SPU_Status[SC] = "success", 959 * context save succeeded, otherwise context save 960 * failed. 961 */ 962 complete = ((SPU_SAVE_COMPLETE << SPU_STOP_STATUS_SHIFT) | 963 SPU_STATUS_STOPPED_BY_STOP); 964 return (in_be32(&prob->spu_status_R) != complete) ? 1 : 0; 965 } 966 967 static inline void terminate_spu_app(struct spu_state *csa, struct spu *spu) 968 { 969 /* Restore, Step 4: 970 * If required, notify the "using application" that 971 * the SPU task has been terminated. TBD. 972 */ 973 } 974 975 static inline void suspend_mfc_and_halt_decr(struct spu_state *csa, 976 struct spu *spu) 977 { 978 struct spu_priv2 __iomem *priv2 = spu->priv2; 979 980 /* Restore, Step 7: 981 * Write MFC_Cntl[Dh,Sc,Sm]='1','1','0' to suspend 982 * the queue and halt the decrementer. 983 */ 984 out_be64(&priv2->mfc_control_RW, MFC_CNTL_SUSPEND_DMA_QUEUE | 985 MFC_CNTL_DECREMENTER_HALTED); 986 eieio(); 987 } 988 989 static inline void wait_suspend_mfc_complete(struct spu_state *csa, 990 struct spu *spu) 991 { 992 struct spu_priv2 __iomem *priv2 = spu->priv2; 993 994 /* Restore, Step 8: 995 * Restore, Step 47. 996 * Poll MFC_CNTL[Ss] until 11 is returned. 997 */ 998 POLL_WHILE_FALSE((in_be64(&priv2->mfc_control_RW) & 999 MFC_CNTL_SUSPEND_DMA_STATUS_MASK) == 1000 MFC_CNTL_SUSPEND_COMPLETE); 1001 } 1002 1003 static inline int suspend_spe(struct spu_state *csa, struct spu *spu) 1004 { 1005 struct spu_problem __iomem *prob = spu->problem; 1006 1007 /* Restore, Step 9: 1008 * If SPU_Status[R]=1, stop SPU execution 1009 * and wait for stop to complete. 1010 * 1011 * Returns 1 if SPU_Status[R]=1 on entry. 1012 * 0 otherwise 1013 */ 1014 if (in_be32(&prob->spu_status_R) & SPU_STATUS_RUNNING) { 1015 if (in_be32(&prob->spu_status_R) & 1016 SPU_STATUS_ISOLATED_EXIT_STATUS) { 1017 POLL_WHILE_TRUE(in_be32(&prob->spu_status_R) & 1018 SPU_STATUS_RUNNING); 1019 } 1020 if ((in_be32(&prob->spu_status_R) & 1021 SPU_STATUS_ISOLATED_LOAD_STATUS) 1022 || (in_be32(&prob->spu_status_R) & 1023 SPU_STATUS_ISOLATED_STATE)) { 1024 out_be32(&prob->spu_runcntl_RW, SPU_RUNCNTL_STOP); 1025 eieio(); 1026 POLL_WHILE_TRUE(in_be32(&prob->spu_status_R) & 1027 SPU_STATUS_RUNNING); 1028 out_be32(&prob->spu_runcntl_RW, 0x2); 1029 eieio(); 1030 POLL_WHILE_TRUE(in_be32(&prob->spu_status_R) & 1031 SPU_STATUS_RUNNING); 1032 } 1033 if (in_be32(&prob->spu_status_R) & 1034 SPU_STATUS_WAITING_FOR_CHANNEL) { 1035 out_be32(&prob->spu_runcntl_RW, SPU_RUNCNTL_STOP); 1036 eieio(); 1037 POLL_WHILE_TRUE(in_be32(&prob->spu_status_R) & 1038 SPU_STATUS_RUNNING); 1039 } 1040 return 1; 1041 } 1042 return 0; 1043 } 1044 1045 static inline void clear_spu_status(struct spu_state *csa, struct spu *spu) 1046 { 1047 struct spu_problem __iomem *prob = spu->problem; 1048 1049 /* Restore, Step 10: 1050 * If SPU_Status[R]=0 and SPU_Status[E,L,IS]=1, 1051 * release SPU from isolate state. 1052 */ 1053 if (!(in_be32(&prob->spu_status_R) & SPU_STATUS_RUNNING)) { 1054 if (in_be32(&prob->spu_status_R) & 1055 SPU_STATUS_ISOLATED_EXIT_STATUS) { 1056 spu_mfc_sr1_set(spu, 1057 MFC_STATE1_MASTER_RUN_CONTROL_MASK); 1058 eieio(); 1059 out_be32(&prob->spu_runcntl_RW, SPU_RUNCNTL_RUNNABLE); 1060 eieio(); 1061 POLL_WHILE_TRUE(in_be32(&prob->spu_status_R) & 1062 SPU_STATUS_RUNNING); 1063 } 1064 if ((in_be32(&prob->spu_status_R) & 1065 SPU_STATUS_ISOLATED_LOAD_STATUS) 1066 || (in_be32(&prob->spu_status_R) & 1067 SPU_STATUS_ISOLATED_STATE)) { 1068 spu_mfc_sr1_set(spu, 1069 MFC_STATE1_MASTER_RUN_CONTROL_MASK); 1070 eieio(); 1071 out_be32(&prob->spu_runcntl_RW, 0x2); 1072 eieio(); 1073 POLL_WHILE_TRUE(in_be32(&prob->spu_status_R) & 1074 SPU_STATUS_RUNNING); 1075 } 1076 } 1077 } 1078 1079 static inline void reset_ch_part1(struct spu_state *csa, struct spu *spu) 1080 { 1081 struct spu_priv2 __iomem *priv2 = spu->priv2; 1082 u64 ch_indices[] = { 0UL, 3UL, 4UL, 24UL, 25UL, 27UL }; 1083 u64 idx; 1084 int i; 1085 1086 /* Restore, Step 20: 1087 */ 1088 1089 /* Reset CH 1 */ 1090 out_be64(&priv2->spu_chnlcntptr_RW, 1); 1091 out_be64(&priv2->spu_chnldata_RW, 0UL); 1092 1093 /* Reset the following CH: [0,3,4,24,25,27] */ 1094 for (i = 0; i < ARRAY_SIZE(ch_indices); i++) { 1095 idx = ch_indices[i]; 1096 out_be64(&priv2->spu_chnlcntptr_RW, idx); 1097 eieio(); 1098 out_be64(&priv2->spu_chnldata_RW, 0UL); 1099 out_be64(&priv2->spu_chnlcnt_RW, 0UL); 1100 eieio(); 1101 } 1102 } 1103 1104 static inline void reset_ch_part2(struct spu_state *csa, struct spu *spu) 1105 { 1106 struct spu_priv2 __iomem *priv2 = spu->priv2; 1107 u64 ch_indices[5] = { 21UL, 23UL, 28UL, 29UL, 30UL }; 1108 u64 ch_counts[5] = { 16UL, 1UL, 1UL, 0UL, 1UL }; 1109 u64 idx; 1110 int i; 1111 1112 /* Restore, Step 21: 1113 * Reset the following CH: [21, 23, 28, 29, 30] 1114 */ 1115 for (i = 0; i < 5; i++) { 1116 idx = ch_indices[i]; 1117 out_be64(&priv2->spu_chnlcntptr_RW, idx); 1118 eieio(); 1119 out_be64(&priv2->spu_chnlcnt_RW, ch_counts[i]); 1120 eieio(); 1121 } 1122 } 1123 1124 static inline void setup_spu_status_part1(struct spu_state *csa, 1125 struct spu *spu) 1126 { 1127 u32 status_P = SPU_STATUS_STOPPED_BY_STOP; 1128 u32 status_I = SPU_STATUS_INVALID_INSTR; 1129 u32 status_H = SPU_STATUS_STOPPED_BY_HALT; 1130 u32 status_S = SPU_STATUS_SINGLE_STEP; 1131 u32 status_S_I = SPU_STATUS_SINGLE_STEP | SPU_STATUS_INVALID_INSTR; 1132 u32 status_S_P = SPU_STATUS_SINGLE_STEP | SPU_STATUS_STOPPED_BY_STOP; 1133 u32 status_P_H = SPU_STATUS_STOPPED_BY_HALT |SPU_STATUS_STOPPED_BY_STOP; 1134 u32 status_P_I = SPU_STATUS_STOPPED_BY_STOP |SPU_STATUS_INVALID_INSTR; 1135 u32 status_code; 1136 1137 /* Restore, Step 27: 1138 * If the CSA.SPU_Status[I,S,H,P]=1 then add the correct 1139 * instruction sequence to the end of the SPU based restore 1140 * code (after the "context restored" stop and signal) to 1141 * restore the correct SPU status. 1142 * 1143 * NOTE: Rather than modifying the SPU executable, we 1144 * instead add a new 'stopped_status' field to the 1145 * LSCSA. The SPU-side restore reads this field and 1146 * takes the appropriate action when exiting. 1147 */ 1148 1149 status_code = 1150 (csa->prob.spu_status_R >> SPU_STOP_STATUS_SHIFT) & 0xFFFF; 1151 if ((csa->prob.spu_status_R & status_P_I) == status_P_I) { 1152 1153 /* SPU_Status[P,I]=1 - Illegal Instruction followed 1154 * by Stop and Signal instruction, followed by 'br -4'. 1155 * 1156 */ 1157 csa->lscsa->stopped_status.slot[0] = SPU_STOPPED_STATUS_P_I; 1158 csa->lscsa->stopped_status.slot[1] = status_code; 1159 1160 } else if ((csa->prob.spu_status_R & status_P_H) == status_P_H) { 1161 1162 /* SPU_Status[P,H]=1 - Halt Conditional, followed 1163 * by Stop and Signal instruction, followed by 1164 * 'br -4'. 1165 */ 1166 csa->lscsa->stopped_status.slot[0] = SPU_STOPPED_STATUS_P_H; 1167 csa->lscsa->stopped_status.slot[1] = status_code; 1168 1169 } else if ((csa->prob.spu_status_R & status_S_P) == status_S_P) { 1170 1171 /* SPU_Status[S,P]=1 - Stop and Signal instruction 1172 * followed by 'br -4'. 1173 */ 1174 csa->lscsa->stopped_status.slot[0] = SPU_STOPPED_STATUS_S_P; 1175 csa->lscsa->stopped_status.slot[1] = status_code; 1176 1177 } else if ((csa->prob.spu_status_R & status_S_I) == status_S_I) { 1178 1179 /* SPU_Status[S,I]=1 - Illegal instruction followed 1180 * by 'br -4'. 1181 */ 1182 csa->lscsa->stopped_status.slot[0] = SPU_STOPPED_STATUS_S_I; 1183 csa->lscsa->stopped_status.slot[1] = status_code; 1184 1185 } else if ((csa->prob.spu_status_R & status_P) == status_P) { 1186 1187 /* SPU_Status[P]=1 - Stop and Signal instruction 1188 * followed by 'br -4'. 1189 */ 1190 csa->lscsa->stopped_status.slot[0] = SPU_STOPPED_STATUS_P; 1191 csa->lscsa->stopped_status.slot[1] = status_code; 1192 1193 } else if ((csa->prob.spu_status_R & status_H) == status_H) { 1194 1195 /* SPU_Status[H]=1 - Halt Conditional, followed 1196 * by 'br -4'. 1197 */ 1198 csa->lscsa->stopped_status.slot[0] = SPU_STOPPED_STATUS_H; 1199 1200 } else if ((csa->prob.spu_status_R & status_S) == status_S) { 1201 1202 /* SPU_Status[S]=1 - Two nop instructions. 1203 */ 1204 csa->lscsa->stopped_status.slot[0] = SPU_STOPPED_STATUS_S; 1205 1206 } else if ((csa->prob.spu_status_R & status_I) == status_I) { 1207 1208 /* SPU_Status[I]=1 - Illegal instruction followed 1209 * by 'br -4'. 1210 */ 1211 csa->lscsa->stopped_status.slot[0] = SPU_STOPPED_STATUS_I; 1212 1213 } 1214 } 1215 1216 static inline void setup_spu_status_part2(struct spu_state *csa, 1217 struct spu *spu) 1218 { 1219 u32 mask; 1220 1221 /* Restore, Step 28: 1222 * If the CSA.SPU_Status[I,S,H,P,R]=0 then 1223 * add a 'br *' instruction to the end of 1224 * the SPU based restore code. 1225 * 1226 * NOTE: Rather than modifying the SPU executable, we 1227 * instead add a new 'stopped_status' field to the 1228 * LSCSA. The SPU-side restore reads this field and 1229 * takes the appropriate action when exiting. 1230 */ 1231 mask = SPU_STATUS_INVALID_INSTR | 1232 SPU_STATUS_SINGLE_STEP | 1233 SPU_STATUS_STOPPED_BY_HALT | 1234 SPU_STATUS_STOPPED_BY_STOP | SPU_STATUS_RUNNING; 1235 if (!(csa->prob.spu_status_R & mask)) { 1236 csa->lscsa->stopped_status.slot[0] = SPU_STOPPED_STATUS_R; 1237 } 1238 } 1239 1240 static inline void restore_mfc_rag(struct spu_state *csa, struct spu *spu) 1241 { 1242 /* Restore, Step 29: 1243 * Restore RA_GROUP_ID register and the 1244 * RA_ENABLE reigster from the CSA. 1245 */ 1246 spu_resource_allocation_groupID_set(spu, 1247 csa->priv1.resource_allocation_groupID_RW); 1248 spu_resource_allocation_enable_set(spu, 1249 csa->priv1.resource_allocation_enable_RW); 1250 } 1251 1252 static inline void send_restore_code(struct spu_state *csa, struct spu *spu) 1253 { 1254 unsigned long addr = (unsigned long)&spu_restore_code[0]; 1255 unsigned int ls_offset = 0x0; 1256 unsigned int size = sizeof(spu_restore_code); 1257 unsigned int tag = 0; 1258 unsigned int rclass = 0; 1259 unsigned int cmd = MFC_GETFS_CMD; 1260 1261 /* Restore, Step 37: 1262 * Issue MFC DMA command to copy context 1263 * restore code to local storage. 1264 */ 1265 send_mfc_dma(spu, addr, ls_offset, size, tag, rclass, cmd); 1266 } 1267 1268 static inline void setup_decr(struct spu_state *csa, struct spu *spu) 1269 { 1270 /* Restore, Step 34: 1271 * If CSA.MFC_CNTL[Ds]=1 (decrementer was 1272 * running) then adjust decrementer, set 1273 * decrementer running status in LSCSA, 1274 * and set decrementer "wrapped" status 1275 * in LSCSA. 1276 */ 1277 if (csa->priv2.mfc_control_RW & MFC_CNTL_DECREMENTER_RUNNING) { 1278 cycles_t resume_time = get_cycles(); 1279 cycles_t delta_time = resume_time - csa->suspend_time; 1280 1281 csa->lscsa->decr_status.slot[0] = SPU_DECR_STATUS_RUNNING; 1282 if (csa->lscsa->decr.slot[0] < delta_time) { 1283 csa->lscsa->decr_status.slot[0] |= 1284 SPU_DECR_STATUS_WRAPPED; 1285 } 1286 1287 csa->lscsa->decr.slot[0] -= delta_time; 1288 } else { 1289 csa->lscsa->decr_status.slot[0] = 0; 1290 } 1291 } 1292 1293 static inline void setup_ppu_mb(struct spu_state *csa, struct spu *spu) 1294 { 1295 /* Restore, Step 35: 1296 * Copy the CSA.PU_MB data into the LSCSA. 1297 */ 1298 csa->lscsa->ppu_mb.slot[0] = csa->prob.pu_mb_R; 1299 } 1300 1301 static inline void setup_ppuint_mb(struct spu_state *csa, struct spu *spu) 1302 { 1303 /* Restore, Step 36: 1304 * Copy the CSA.PUINT_MB data into the LSCSA. 1305 */ 1306 csa->lscsa->ppuint_mb.slot[0] = csa->priv2.puint_mb_R; 1307 } 1308 1309 static inline int check_restore_status(struct spu_state *csa, struct spu *spu) 1310 { 1311 struct spu_problem __iomem *prob = spu->problem; 1312 u32 complete; 1313 1314 /* Restore, Step 40: 1315 * If SPU_Status[P]=1 and SPU_Status[SC] = "success", 1316 * context restore succeeded, otherwise context restore 1317 * failed. 1318 */ 1319 complete = ((SPU_RESTORE_COMPLETE << SPU_STOP_STATUS_SHIFT) | 1320 SPU_STATUS_STOPPED_BY_STOP); 1321 return (in_be32(&prob->spu_status_R) != complete) ? 1 : 0; 1322 } 1323 1324 static inline void restore_spu_privcntl(struct spu_state *csa, struct spu *spu) 1325 { 1326 struct spu_priv2 __iomem *priv2 = spu->priv2; 1327 1328 /* Restore, Step 41: 1329 * Restore SPU_PrivCntl from the CSA. 1330 */ 1331 out_be64(&priv2->spu_privcntl_RW, csa->priv2.spu_privcntl_RW); 1332 eieio(); 1333 } 1334 1335 static inline void restore_status_part1(struct spu_state *csa, struct spu *spu) 1336 { 1337 struct spu_problem __iomem *prob = spu->problem; 1338 u32 mask; 1339 1340 /* Restore, Step 42: 1341 * If any CSA.SPU_Status[I,S,H,P]=1, then 1342 * restore the error or single step state. 1343 */ 1344 mask = SPU_STATUS_INVALID_INSTR | 1345 SPU_STATUS_SINGLE_STEP | 1346 SPU_STATUS_STOPPED_BY_HALT | SPU_STATUS_STOPPED_BY_STOP; 1347 if (csa->prob.spu_status_R & mask) { 1348 out_be32(&prob->spu_runcntl_RW, SPU_RUNCNTL_RUNNABLE); 1349 eieio(); 1350 POLL_WHILE_TRUE(in_be32(&prob->spu_status_R) & 1351 SPU_STATUS_RUNNING); 1352 } 1353 } 1354 1355 static inline void restore_status_part2(struct spu_state *csa, struct spu *spu) 1356 { 1357 struct spu_problem __iomem *prob = spu->problem; 1358 u32 mask; 1359 1360 /* Restore, Step 43: 1361 * If all CSA.SPU_Status[I,S,H,P,R]=0 then write 1362 * SPU_RunCntl[R0R1]='01', wait for SPU_Status[R]=1, 1363 * then write '00' to SPU_RunCntl[R0R1] and wait 1364 * for SPU_Status[R]=0. 1365 */ 1366 mask = SPU_STATUS_INVALID_INSTR | 1367 SPU_STATUS_SINGLE_STEP | 1368 SPU_STATUS_STOPPED_BY_HALT | 1369 SPU_STATUS_STOPPED_BY_STOP | SPU_STATUS_RUNNING; 1370 if (!(csa->prob.spu_status_R & mask)) { 1371 out_be32(&prob->spu_runcntl_RW, SPU_RUNCNTL_RUNNABLE); 1372 eieio(); 1373 POLL_WHILE_FALSE(in_be32(&prob->spu_status_R) & 1374 SPU_STATUS_RUNNING); 1375 out_be32(&prob->spu_runcntl_RW, SPU_RUNCNTL_STOP); 1376 eieio(); 1377 POLL_WHILE_TRUE(in_be32(&prob->spu_status_R) & 1378 SPU_STATUS_RUNNING); 1379 } 1380 } 1381 1382 static inline void restore_ls_16kb(struct spu_state *csa, struct spu *spu) 1383 { 1384 unsigned long addr = (unsigned long)&csa->lscsa->ls[0]; 1385 unsigned int ls_offset = 0x0; 1386 unsigned int size = 16384; 1387 unsigned int tag = 0; 1388 unsigned int rclass = 0; 1389 unsigned int cmd = MFC_GET_CMD; 1390 1391 /* Restore, Step 44: 1392 * Issue a DMA command to restore the first 1393 * 16kb of local storage from CSA. 1394 */ 1395 send_mfc_dma(spu, addr, ls_offset, size, tag, rclass, cmd); 1396 } 1397 1398 static inline void suspend_mfc(struct spu_state *csa, struct spu *spu) 1399 { 1400 struct spu_priv2 __iomem *priv2 = spu->priv2; 1401 1402 /* Restore, Step 47. 1403 * Write MFC_Cntl[Sc,Sm]='1','0' to suspend 1404 * the queue. 1405 */ 1406 out_be64(&priv2->mfc_control_RW, MFC_CNTL_SUSPEND_DMA_QUEUE); 1407 eieio(); 1408 } 1409 1410 static inline void clear_interrupts(struct spu_state *csa, struct spu *spu) 1411 { 1412 /* Restore, Step 49: 1413 * Write INT_MASK_class0 with value of 0. 1414 * Write INT_MASK_class1 with value of 0. 1415 * Write INT_MASK_class2 with value of 0. 1416 * Write INT_STAT_class0 with value of -1. 1417 * Write INT_STAT_class1 with value of -1. 1418 * Write INT_STAT_class2 with value of -1. 1419 */ 1420 spin_lock_irq(&spu->register_lock); 1421 spu_int_mask_set(spu, 0, 0ul); 1422 spu_int_mask_set(spu, 1, 0ul); 1423 spu_int_mask_set(spu, 2, 0ul); 1424 spu_int_stat_clear(spu, 0, CLASS0_INTR_MASK); 1425 spu_int_stat_clear(spu, 1, CLASS1_INTR_MASK); 1426 spu_int_stat_clear(spu, 2, CLASS2_INTR_MASK); 1427 spin_unlock_irq(&spu->register_lock); 1428 } 1429 1430 static inline void restore_mfc_queues(struct spu_state *csa, struct spu *spu) 1431 { 1432 struct spu_priv2 __iomem *priv2 = spu->priv2; 1433 int i; 1434 1435 /* Restore, Step 50: 1436 * If MFC_Cntl[Se]!=0 then restore 1437 * MFC command queues. 1438 */ 1439 if ((csa->priv2.mfc_control_RW & MFC_CNTL_DMA_QUEUES_EMPTY_MASK) == 0) { 1440 for (i = 0; i < 8; i++) { 1441 out_be64(&priv2->puq[i].mfc_cq_data0_RW, 1442 csa->priv2.puq[i].mfc_cq_data0_RW); 1443 out_be64(&priv2->puq[i].mfc_cq_data1_RW, 1444 csa->priv2.puq[i].mfc_cq_data1_RW); 1445 out_be64(&priv2->puq[i].mfc_cq_data2_RW, 1446 csa->priv2.puq[i].mfc_cq_data2_RW); 1447 out_be64(&priv2->puq[i].mfc_cq_data3_RW, 1448 csa->priv2.puq[i].mfc_cq_data3_RW); 1449 } 1450 for (i = 0; i < 16; i++) { 1451 out_be64(&priv2->spuq[i].mfc_cq_data0_RW, 1452 csa->priv2.spuq[i].mfc_cq_data0_RW); 1453 out_be64(&priv2->spuq[i].mfc_cq_data1_RW, 1454 csa->priv2.spuq[i].mfc_cq_data1_RW); 1455 out_be64(&priv2->spuq[i].mfc_cq_data2_RW, 1456 csa->priv2.spuq[i].mfc_cq_data2_RW); 1457 out_be64(&priv2->spuq[i].mfc_cq_data3_RW, 1458 csa->priv2.spuq[i].mfc_cq_data3_RW); 1459 } 1460 } 1461 eieio(); 1462 } 1463 1464 static inline void restore_ppu_querymask(struct spu_state *csa, struct spu *spu) 1465 { 1466 struct spu_problem __iomem *prob = spu->problem; 1467 1468 /* Restore, Step 51: 1469 * Restore the PPU_QueryMask register from CSA. 1470 */ 1471 out_be32(&prob->dma_querymask_RW, csa->prob.dma_querymask_RW); 1472 eieio(); 1473 } 1474 1475 static inline void restore_ppu_querytype(struct spu_state *csa, struct spu *spu) 1476 { 1477 struct spu_problem __iomem *prob = spu->problem; 1478 1479 /* Restore, Step 52: 1480 * Restore the PPU_QueryType register from CSA. 1481 */ 1482 out_be32(&prob->dma_querytype_RW, csa->prob.dma_querytype_RW); 1483 eieio(); 1484 } 1485 1486 static inline void restore_mfc_csr_tsq(struct spu_state *csa, struct spu *spu) 1487 { 1488 struct spu_priv2 __iomem *priv2 = spu->priv2; 1489 1490 /* Restore, Step 53: 1491 * Restore the MFC_CSR_TSQ register from CSA. 1492 */ 1493 out_be64(&priv2->spu_tag_status_query_RW, 1494 csa->priv2.spu_tag_status_query_RW); 1495 eieio(); 1496 } 1497 1498 static inline void restore_mfc_csr_cmd(struct spu_state *csa, struct spu *spu) 1499 { 1500 struct spu_priv2 __iomem *priv2 = spu->priv2; 1501 1502 /* Restore, Step 54: 1503 * Restore the MFC_CSR_CMD1 and MFC_CSR_CMD2 1504 * registers from CSA. 1505 */ 1506 out_be64(&priv2->spu_cmd_buf1_RW, csa->priv2.spu_cmd_buf1_RW); 1507 out_be64(&priv2->spu_cmd_buf2_RW, csa->priv2.spu_cmd_buf2_RW); 1508 eieio(); 1509 } 1510 1511 static inline void restore_mfc_csr_ato(struct spu_state *csa, struct spu *spu) 1512 { 1513 struct spu_priv2 __iomem *priv2 = spu->priv2; 1514 1515 /* Restore, Step 55: 1516 * Restore the MFC_CSR_ATO register from CSA. 1517 */ 1518 out_be64(&priv2->spu_atomic_status_RW, csa->priv2.spu_atomic_status_RW); 1519 } 1520 1521 static inline void restore_mfc_tclass_id(struct spu_state *csa, struct spu *spu) 1522 { 1523 /* Restore, Step 56: 1524 * Restore the MFC_TCLASS_ID register from CSA. 1525 */ 1526 spu_mfc_tclass_id_set(spu, csa->priv1.mfc_tclass_id_RW); 1527 eieio(); 1528 } 1529 1530 static inline void set_llr_event(struct spu_state *csa, struct spu *spu) 1531 { 1532 u64 ch0_cnt, ch0_data; 1533 u64 ch1_data; 1534 1535 /* Restore, Step 57: 1536 * Set the Lock Line Reservation Lost Event by: 1537 * 1. OR CSA.SPU_Event_Status with bit 21 (Lr) set to 1. 1538 * 2. If CSA.SPU_Channel_0_Count=0 and 1539 * CSA.SPU_Wr_Event_Mask[Lr]=1 and 1540 * CSA.SPU_Event_Status[Lr]=0 then set 1541 * CSA.SPU_Event_Status_Count=1. 1542 */ 1543 ch0_cnt = csa->spu_chnlcnt_RW[0]; 1544 ch0_data = csa->spu_chnldata_RW[0]; 1545 ch1_data = csa->spu_chnldata_RW[1]; 1546 csa->spu_chnldata_RW[0] |= MFC_LLR_LOST_EVENT; 1547 if ((ch0_cnt == 0) && !(ch0_data & MFC_LLR_LOST_EVENT) && 1548 (ch1_data & MFC_LLR_LOST_EVENT)) { 1549 csa->spu_chnlcnt_RW[0] = 1; 1550 } 1551 } 1552 1553 static inline void restore_decr_wrapped(struct spu_state *csa, struct spu *spu) 1554 { 1555 /* Restore, Step 58: 1556 * If the status of the CSA software decrementer 1557 * "wrapped" flag is set, OR in a '1' to 1558 * CSA.SPU_Event_Status[Tm]. 1559 */ 1560 if (!(csa->lscsa->decr_status.slot[0] & SPU_DECR_STATUS_WRAPPED)) 1561 return; 1562 1563 if ((csa->spu_chnlcnt_RW[0] == 0) && 1564 (csa->spu_chnldata_RW[1] & 0x20) && 1565 !(csa->spu_chnldata_RW[0] & 0x20)) 1566 csa->spu_chnlcnt_RW[0] = 1; 1567 1568 csa->spu_chnldata_RW[0] |= 0x20; 1569 } 1570 1571 static inline void restore_ch_part1(struct spu_state *csa, struct spu *spu) 1572 { 1573 struct spu_priv2 __iomem *priv2 = spu->priv2; 1574 u64 idx, ch_indices[] = { 0UL, 3UL, 4UL, 24UL, 25UL, 27UL }; 1575 int i; 1576 1577 /* Restore, Step 59: 1578 * Restore the following CH: [0,3,4,24,25,27] 1579 */ 1580 for (i = 0; i < ARRAY_SIZE(ch_indices); i++) { 1581 idx = ch_indices[i]; 1582 out_be64(&priv2->spu_chnlcntptr_RW, idx); 1583 eieio(); 1584 out_be64(&priv2->spu_chnldata_RW, csa->spu_chnldata_RW[idx]); 1585 out_be64(&priv2->spu_chnlcnt_RW, csa->spu_chnlcnt_RW[idx]); 1586 eieio(); 1587 } 1588 } 1589 1590 static inline void restore_ch_part2(struct spu_state *csa, struct spu *spu) 1591 { 1592 struct spu_priv2 __iomem *priv2 = spu->priv2; 1593 u64 ch_indices[3] = { 9UL, 21UL, 23UL }; 1594 u64 ch_counts[3] = { 1UL, 16UL, 1UL }; 1595 u64 idx; 1596 int i; 1597 1598 /* Restore, Step 60: 1599 * Restore the following CH: [9,21,23]. 1600 */ 1601 ch_counts[0] = 1UL; 1602 ch_counts[1] = csa->spu_chnlcnt_RW[21]; 1603 ch_counts[2] = 1UL; 1604 for (i = 0; i < 3; i++) { 1605 idx = ch_indices[i]; 1606 out_be64(&priv2->spu_chnlcntptr_RW, idx); 1607 eieio(); 1608 out_be64(&priv2->spu_chnlcnt_RW, ch_counts[i]); 1609 eieio(); 1610 } 1611 } 1612 1613 static inline void restore_spu_lslr(struct spu_state *csa, struct spu *spu) 1614 { 1615 struct spu_priv2 __iomem *priv2 = spu->priv2; 1616 1617 /* Restore, Step 61: 1618 * Restore the SPU_LSLR register from CSA. 1619 */ 1620 out_be64(&priv2->spu_lslr_RW, csa->priv2.spu_lslr_RW); 1621 eieio(); 1622 } 1623 1624 static inline void restore_spu_cfg(struct spu_state *csa, struct spu *spu) 1625 { 1626 struct spu_priv2 __iomem *priv2 = spu->priv2; 1627 1628 /* Restore, Step 62: 1629 * Restore the SPU_Cfg register from CSA. 1630 */ 1631 out_be64(&priv2->spu_cfg_RW, csa->priv2.spu_cfg_RW); 1632 eieio(); 1633 } 1634 1635 static inline void restore_pm_trace(struct spu_state *csa, struct spu *spu) 1636 { 1637 /* Restore, Step 63: 1638 * Restore PM_Trace_Tag_Wait_Mask from CSA. 1639 * Not performed by this implementation. 1640 */ 1641 } 1642 1643 static inline void restore_spu_npc(struct spu_state *csa, struct spu *spu) 1644 { 1645 struct spu_problem __iomem *prob = spu->problem; 1646 1647 /* Restore, Step 64: 1648 * Restore SPU_NPC from CSA. 1649 */ 1650 out_be32(&prob->spu_npc_RW, csa->prob.spu_npc_RW); 1651 eieio(); 1652 } 1653 1654 static inline void restore_spu_mb(struct spu_state *csa, struct spu *spu) 1655 { 1656 struct spu_priv2 __iomem *priv2 = spu->priv2; 1657 int i; 1658 1659 /* Restore, Step 65: 1660 * Restore MFC_RdSPU_MB from CSA. 1661 */ 1662 out_be64(&priv2->spu_chnlcntptr_RW, 29UL); 1663 eieio(); 1664 out_be64(&priv2->spu_chnlcnt_RW, csa->spu_chnlcnt_RW[29]); 1665 for (i = 0; i < 4; i++) { 1666 out_be64(&priv2->spu_chnldata_RW, csa->spu_mailbox_data[i]); 1667 } 1668 eieio(); 1669 } 1670 1671 static inline void check_ppu_mb_stat(struct spu_state *csa, struct spu *spu) 1672 { 1673 struct spu_problem __iomem *prob = spu->problem; 1674 u32 dummy = 0; 1675 1676 /* Restore, Step 66: 1677 * If CSA.MB_Stat[P]=0 (mailbox empty) then 1678 * read from the PPU_MB register. 1679 */ 1680 if ((csa->prob.mb_stat_R & 0xFF) == 0) { 1681 dummy = in_be32(&prob->pu_mb_R); 1682 eieio(); 1683 } 1684 } 1685 1686 static inline void check_ppuint_mb_stat(struct spu_state *csa, struct spu *spu) 1687 { 1688 struct spu_priv2 __iomem *priv2 = spu->priv2; 1689 u64 dummy = 0UL; 1690 1691 /* Restore, Step 66: 1692 * If CSA.MB_Stat[I]=0 (mailbox empty) then 1693 * read from the PPUINT_MB register. 1694 */ 1695 if ((csa->prob.mb_stat_R & 0xFF0000) == 0) { 1696 dummy = in_be64(&priv2->puint_mb_R); 1697 eieio(); 1698 spu_int_stat_clear(spu, 2, CLASS2_ENABLE_MAILBOX_INTR); 1699 eieio(); 1700 } 1701 } 1702 1703 static inline void restore_mfc_sr1(struct spu_state *csa, struct spu *spu) 1704 { 1705 /* Restore, Step 69: 1706 * Restore the MFC_SR1 register from CSA. 1707 */ 1708 spu_mfc_sr1_set(spu, csa->priv1.mfc_sr1_RW); 1709 eieio(); 1710 } 1711 1712 static inline void set_int_route(struct spu_state *csa, struct spu *spu) 1713 { 1714 struct spu_context *ctx = spu->ctx; 1715 1716 spu_cpu_affinity_set(spu, ctx->last_ran); 1717 } 1718 1719 static inline void restore_other_spu_access(struct spu_state *csa, 1720 struct spu *spu) 1721 { 1722 /* Restore, Step 70: 1723 * Restore other SPU mappings to this SPU. TBD. 1724 */ 1725 } 1726 1727 static inline void restore_spu_runcntl(struct spu_state *csa, struct spu *spu) 1728 { 1729 struct spu_problem __iomem *prob = spu->problem; 1730 1731 /* Restore, Step 71: 1732 * If CSA.SPU_Status[R]=1 then write 1733 * SPU_RunCntl[R0R1]='01'. 1734 */ 1735 if (csa->prob.spu_status_R & SPU_STATUS_RUNNING) { 1736 out_be32(&prob->spu_runcntl_RW, SPU_RUNCNTL_RUNNABLE); 1737 eieio(); 1738 } 1739 } 1740 1741 static inline void restore_mfc_cntl(struct spu_state *csa, struct spu *spu) 1742 { 1743 struct spu_priv2 __iomem *priv2 = spu->priv2; 1744 1745 /* Restore, Step 72: 1746 * Restore the MFC_CNTL register for the CSA. 1747 */ 1748 out_be64(&priv2->mfc_control_RW, csa->priv2.mfc_control_RW); 1749 eieio(); 1750 1751 /* 1752 * The queue is put back into the same state that was evident prior to 1753 * the context switch. The suspend flag is added to the saved state in 1754 * the csa, if the operational state was suspending or suspended. In 1755 * this case, the code that suspended the mfc is responsible for 1756 * continuing it. Note that SPE faults do not change the operational 1757 * state of the spu. 1758 */ 1759 } 1760 1761 static inline void enable_user_access(struct spu_state *csa, struct spu *spu) 1762 { 1763 /* Restore, Step 73: 1764 * Enable user-space access (if provided) to this 1765 * SPU by mapping the virtual pages assigned to 1766 * the SPU memory-mapped I/O (MMIO) for problem 1767 * state. TBD. 1768 */ 1769 } 1770 1771 static inline void reset_switch_active(struct spu_state *csa, struct spu *spu) 1772 { 1773 /* Restore, Step 74: 1774 * Reset the "context switch active" flag. 1775 * Not performed by this implementation. 1776 */ 1777 } 1778 1779 static inline void reenable_interrupts(struct spu_state *csa, struct spu *spu) 1780 { 1781 /* Restore, Step 75: 1782 * Re-enable SPU interrupts. 1783 */ 1784 spin_lock_irq(&spu->register_lock); 1785 spu_int_mask_set(spu, 0, csa->priv1.int_mask_class0_RW); 1786 spu_int_mask_set(spu, 1, csa->priv1.int_mask_class1_RW); 1787 spu_int_mask_set(spu, 2, csa->priv1.int_mask_class2_RW); 1788 spin_unlock_irq(&spu->register_lock); 1789 } 1790 1791 static int quiece_spu(struct spu_state *prev, struct spu *spu) 1792 { 1793 /* 1794 * Combined steps 2-18 of SPU context save sequence, which 1795 * quiesce the SPU state (disable SPU execution, MFC command 1796 * queues, decrementer, SPU interrupts, etc.). 1797 * 1798 * Returns 0 on success. 1799 * 2 if failed step 2. 1800 * 6 if failed step 6. 1801 */ 1802 1803 if (check_spu_isolate(prev, spu)) { /* Step 2. */ 1804 return 2; 1805 } 1806 disable_interrupts(prev, spu); /* Step 3. */ 1807 set_watchdog_timer(prev, spu); /* Step 4. */ 1808 inhibit_user_access(prev, spu); /* Step 5. */ 1809 if (check_spu_isolate(prev, spu)) { /* Step 6. */ 1810 return 6; 1811 } 1812 set_switch_pending(prev, spu); /* Step 7. */ 1813 save_mfc_cntl(prev, spu); /* Step 8. */ 1814 save_spu_runcntl(prev, spu); /* Step 9. */ 1815 save_mfc_sr1(prev, spu); /* Step 10. */ 1816 save_spu_status(prev, spu); /* Step 11. */ 1817 save_mfc_stopped_status(prev, spu); /* Step 12. */ 1818 halt_mfc_decr(prev, spu); /* Step 13. */ 1819 save_timebase(prev, spu); /* Step 14. */ 1820 remove_other_spu_access(prev, spu); /* Step 15. */ 1821 do_mfc_mssync(prev, spu); /* Step 16. */ 1822 issue_mfc_tlbie(prev, spu); /* Step 17. */ 1823 handle_pending_interrupts(prev, spu); /* Step 18. */ 1824 1825 return 0; 1826 } 1827 1828 static void save_csa(struct spu_state *prev, struct spu *spu) 1829 { 1830 /* 1831 * Combine steps 19-44 of SPU context save sequence, which 1832 * save regions of the privileged & problem state areas. 1833 */ 1834 1835 save_mfc_queues(prev, spu); /* Step 19. */ 1836 save_ppu_querymask(prev, spu); /* Step 20. */ 1837 save_ppu_querytype(prev, spu); /* Step 21. */ 1838 save_ppu_tagstatus(prev, spu); /* NEW. */ 1839 save_mfc_csr_tsq(prev, spu); /* Step 22. */ 1840 save_mfc_csr_cmd(prev, spu); /* Step 23. */ 1841 save_mfc_csr_ato(prev, spu); /* Step 24. */ 1842 save_mfc_tclass_id(prev, spu); /* Step 25. */ 1843 set_mfc_tclass_id(prev, spu); /* Step 26. */ 1844 save_mfc_cmd(prev, spu); /* Step 26a - moved from 44. */ 1845 purge_mfc_queue(prev, spu); /* Step 27. */ 1846 wait_purge_complete(prev, spu); /* Step 28. */ 1847 setup_mfc_sr1(prev, spu); /* Step 30. */ 1848 save_spu_npc(prev, spu); /* Step 31. */ 1849 save_spu_privcntl(prev, spu); /* Step 32. */ 1850 reset_spu_privcntl(prev, spu); /* Step 33. */ 1851 save_spu_lslr(prev, spu); /* Step 34. */ 1852 reset_spu_lslr(prev, spu); /* Step 35. */ 1853 save_spu_cfg(prev, spu); /* Step 36. */ 1854 save_pm_trace(prev, spu); /* Step 37. */ 1855 save_mfc_rag(prev, spu); /* Step 38. */ 1856 save_ppu_mb_stat(prev, spu); /* Step 39. */ 1857 save_ppu_mb(prev, spu); /* Step 40. */ 1858 save_ppuint_mb(prev, spu); /* Step 41. */ 1859 save_ch_part1(prev, spu); /* Step 42. */ 1860 save_spu_mb(prev, spu); /* Step 43. */ 1861 reset_ch(prev, spu); /* Step 45. */ 1862 } 1863 1864 static void save_lscsa(struct spu_state *prev, struct spu *spu) 1865 { 1866 /* 1867 * Perform steps 46-57 of SPU context save sequence, 1868 * which save regions of the local store and register 1869 * file. 1870 */ 1871 1872 resume_mfc_queue(prev, spu); /* Step 46. */ 1873 /* Step 47. */ 1874 setup_mfc_slbs(prev, spu, spu_save_code, sizeof(spu_save_code)); 1875 set_switch_active(prev, spu); /* Step 48. */ 1876 enable_interrupts(prev, spu); /* Step 49. */ 1877 save_ls_16kb(prev, spu); /* Step 50. */ 1878 set_spu_npc(prev, spu); /* Step 51. */ 1879 set_signot1(prev, spu); /* Step 52. */ 1880 set_signot2(prev, spu); /* Step 53. */ 1881 send_save_code(prev, spu); /* Step 54. */ 1882 set_ppu_querymask(prev, spu); /* Step 55. */ 1883 wait_tag_complete(prev, spu); /* Step 56. */ 1884 wait_spu_stopped(prev, spu); /* Step 57. */ 1885 } 1886 1887 static void force_spu_isolate_exit(struct spu *spu) 1888 { 1889 struct spu_problem __iomem *prob = spu->problem; 1890 struct spu_priv2 __iomem *priv2 = spu->priv2; 1891 1892 /* Stop SPE execution and wait for completion. */ 1893 out_be32(&prob->spu_runcntl_RW, SPU_RUNCNTL_STOP); 1894 iobarrier_rw(); 1895 POLL_WHILE_TRUE(in_be32(&prob->spu_status_R) & SPU_STATUS_RUNNING); 1896 1897 /* Restart SPE master runcntl. */ 1898 spu_mfc_sr1_set(spu, MFC_STATE1_MASTER_RUN_CONTROL_MASK); 1899 iobarrier_w(); 1900 1901 /* Initiate isolate exit request and wait for completion. */ 1902 out_be64(&priv2->spu_privcntl_RW, 4LL); 1903 iobarrier_w(); 1904 out_be32(&prob->spu_runcntl_RW, 2); 1905 iobarrier_rw(); 1906 POLL_WHILE_FALSE((in_be32(&prob->spu_status_R) 1907 & SPU_STATUS_STOPPED_BY_STOP)); 1908 1909 /* Reset load request to normal. */ 1910 out_be64(&priv2->spu_privcntl_RW, SPU_PRIVCNT_LOAD_REQUEST_NORMAL); 1911 iobarrier_w(); 1912 } 1913 1914 /** 1915 * stop_spu_isolate 1916 * Check SPU run-control state and force isolated 1917 * exit function as necessary. 1918 */ 1919 static void stop_spu_isolate(struct spu *spu) 1920 { 1921 struct spu_problem __iomem *prob = spu->problem; 1922 1923 if (in_be32(&prob->spu_status_R) & SPU_STATUS_ISOLATED_STATE) { 1924 /* The SPU is in isolated state; the only way 1925 * to get it out is to perform an isolated 1926 * exit (clean) operation. 1927 */ 1928 force_spu_isolate_exit(spu); 1929 } 1930 } 1931 1932 static void harvest(struct spu_state *prev, struct spu *spu) 1933 { 1934 /* 1935 * Perform steps 2-25 of SPU context restore sequence, 1936 * which resets an SPU either after a failed save, or 1937 * when using SPU for first time. 1938 */ 1939 1940 disable_interrupts(prev, spu); /* Step 2. */ 1941 inhibit_user_access(prev, spu); /* Step 3. */ 1942 terminate_spu_app(prev, spu); /* Step 4. */ 1943 set_switch_pending(prev, spu); /* Step 5. */ 1944 stop_spu_isolate(spu); /* NEW. */ 1945 remove_other_spu_access(prev, spu); /* Step 6. */ 1946 suspend_mfc_and_halt_decr(prev, spu); /* Step 7. */ 1947 wait_suspend_mfc_complete(prev, spu); /* Step 8. */ 1948 if (!suspend_spe(prev, spu)) /* Step 9. */ 1949 clear_spu_status(prev, spu); /* Step 10. */ 1950 do_mfc_mssync(prev, spu); /* Step 11. */ 1951 issue_mfc_tlbie(prev, spu); /* Step 12. */ 1952 handle_pending_interrupts(prev, spu); /* Step 13. */ 1953 purge_mfc_queue(prev, spu); /* Step 14. */ 1954 wait_purge_complete(prev, spu); /* Step 15. */ 1955 reset_spu_privcntl(prev, spu); /* Step 16. */ 1956 reset_spu_lslr(prev, spu); /* Step 17. */ 1957 setup_mfc_sr1(prev, spu); /* Step 18. */ 1958 spu_invalidate_slbs(spu); /* Step 19. */ 1959 reset_ch_part1(prev, spu); /* Step 20. */ 1960 reset_ch_part2(prev, spu); /* Step 21. */ 1961 enable_interrupts(prev, spu); /* Step 22. */ 1962 set_switch_active(prev, spu); /* Step 23. */ 1963 set_mfc_tclass_id(prev, spu); /* Step 24. */ 1964 resume_mfc_queue(prev, spu); /* Step 25. */ 1965 } 1966 1967 static void restore_lscsa(struct spu_state *next, struct spu *spu) 1968 { 1969 /* 1970 * Perform steps 26-40 of SPU context restore sequence, 1971 * which restores regions of the local store and register 1972 * file. 1973 */ 1974 1975 set_watchdog_timer(next, spu); /* Step 26. */ 1976 setup_spu_status_part1(next, spu); /* Step 27. */ 1977 setup_spu_status_part2(next, spu); /* Step 28. */ 1978 restore_mfc_rag(next, spu); /* Step 29. */ 1979 /* Step 30. */ 1980 setup_mfc_slbs(next, spu, spu_restore_code, sizeof(spu_restore_code)); 1981 set_spu_npc(next, spu); /* Step 31. */ 1982 set_signot1(next, spu); /* Step 32. */ 1983 set_signot2(next, spu); /* Step 33. */ 1984 setup_decr(next, spu); /* Step 34. */ 1985 setup_ppu_mb(next, spu); /* Step 35. */ 1986 setup_ppuint_mb(next, spu); /* Step 36. */ 1987 send_restore_code(next, spu); /* Step 37. */ 1988 set_ppu_querymask(next, spu); /* Step 38. */ 1989 wait_tag_complete(next, spu); /* Step 39. */ 1990 wait_spu_stopped(next, spu); /* Step 40. */ 1991 } 1992 1993 static void restore_csa(struct spu_state *next, struct spu *spu) 1994 { 1995 /* 1996 * Combine steps 41-76 of SPU context restore sequence, which 1997 * restore regions of the privileged & problem state areas. 1998 */ 1999 2000 restore_spu_privcntl(next, spu); /* Step 41. */ 2001 restore_status_part1(next, spu); /* Step 42. */ 2002 restore_status_part2(next, spu); /* Step 43. */ 2003 restore_ls_16kb(next, spu); /* Step 44. */ 2004 wait_tag_complete(next, spu); /* Step 45. */ 2005 suspend_mfc(next, spu); /* Step 46. */ 2006 wait_suspend_mfc_complete(next, spu); /* Step 47. */ 2007 issue_mfc_tlbie(next, spu); /* Step 48. */ 2008 clear_interrupts(next, spu); /* Step 49. */ 2009 restore_mfc_queues(next, spu); /* Step 50. */ 2010 restore_ppu_querymask(next, spu); /* Step 51. */ 2011 restore_ppu_querytype(next, spu); /* Step 52. */ 2012 restore_mfc_csr_tsq(next, spu); /* Step 53. */ 2013 restore_mfc_csr_cmd(next, spu); /* Step 54. */ 2014 restore_mfc_csr_ato(next, spu); /* Step 55. */ 2015 restore_mfc_tclass_id(next, spu); /* Step 56. */ 2016 set_llr_event(next, spu); /* Step 57. */ 2017 restore_decr_wrapped(next, spu); /* Step 58. */ 2018 restore_ch_part1(next, spu); /* Step 59. */ 2019 restore_ch_part2(next, spu); /* Step 60. */ 2020 restore_spu_lslr(next, spu); /* Step 61. */ 2021 restore_spu_cfg(next, spu); /* Step 62. */ 2022 restore_pm_trace(next, spu); /* Step 63. */ 2023 restore_spu_npc(next, spu); /* Step 64. */ 2024 restore_spu_mb(next, spu); /* Step 65. */ 2025 check_ppu_mb_stat(next, spu); /* Step 66. */ 2026 check_ppuint_mb_stat(next, spu); /* Step 67. */ 2027 spu_invalidate_slbs(spu); /* Modified Step 68. */ 2028 restore_mfc_sr1(next, spu); /* Step 69. */ 2029 set_int_route(next, spu); /* NEW */ 2030 restore_other_spu_access(next, spu); /* Step 70. */ 2031 restore_spu_runcntl(next, spu); /* Step 71. */ 2032 restore_mfc_cntl(next, spu); /* Step 72. */ 2033 enable_user_access(next, spu); /* Step 73. */ 2034 reset_switch_active(next, spu); /* Step 74. */ 2035 reenable_interrupts(next, spu); /* Step 75. */ 2036 } 2037 2038 static int __do_spu_save(struct spu_state *prev, struct spu *spu) 2039 { 2040 int rc; 2041 2042 /* 2043 * SPU context save can be broken into three phases: 2044 * 2045 * (a) quiesce [steps 2-16]. 2046 * (b) save of CSA, performed by PPE [steps 17-42] 2047 * (c) save of LSCSA, mostly performed by SPU [steps 43-52]. 2048 * 2049 * Returns 0 on success. 2050 * 2,6 if failed to quiece SPU 2051 * 53 if SPU-side of save failed. 2052 */ 2053 2054 rc = quiece_spu(prev, spu); /* Steps 2-16. */ 2055 switch (rc) { 2056 default: 2057 case 2: 2058 case 6: 2059 harvest(prev, spu); 2060 return rc; 2061 break; 2062 case 0: 2063 break; 2064 } 2065 save_csa(prev, spu); /* Steps 17-43. */ 2066 save_lscsa(prev, spu); /* Steps 44-53. */ 2067 return check_save_status(prev, spu); /* Step 54. */ 2068 } 2069 2070 static int __do_spu_restore(struct spu_state *next, struct spu *spu) 2071 { 2072 int rc; 2073 2074 /* 2075 * SPU context restore can be broken into three phases: 2076 * 2077 * (a) harvest (or reset) SPU [steps 2-24]. 2078 * (b) restore LSCSA [steps 25-40], mostly performed by SPU. 2079 * (c) restore CSA [steps 41-76], performed by PPE. 2080 * 2081 * The 'harvest' step is not performed here, but rather 2082 * as needed below. 2083 */ 2084 2085 restore_lscsa(next, spu); /* Steps 24-39. */ 2086 rc = check_restore_status(next, spu); /* Step 40. */ 2087 switch (rc) { 2088 default: 2089 /* Failed. Return now. */ 2090 return rc; 2091 break; 2092 case 0: 2093 /* Fall through to next step. */ 2094 break; 2095 } 2096 restore_csa(next, spu); 2097 2098 return 0; 2099 } 2100 2101 /** 2102 * spu_save - SPU context save, with locking. 2103 * @prev: pointer to SPU context save area, to be saved. 2104 * @spu: pointer to SPU iomem structure. 2105 * 2106 * Acquire locks, perform the save operation then return. 2107 */ 2108 int spu_save(struct spu_state *prev, struct spu *spu) 2109 { 2110 int rc; 2111 2112 acquire_spu_lock(spu); /* Step 1. */ 2113 rc = __do_spu_save(prev, spu); /* Steps 2-53. */ 2114 release_spu_lock(spu); 2115 if (rc != 0 && rc != 2 && rc != 6) { 2116 panic("%s failed on SPU[%d], rc=%d.\n", 2117 __func__, spu->number, rc); 2118 } 2119 return 0; 2120 } 2121 EXPORT_SYMBOL_GPL(spu_save); 2122 2123 /** 2124 * spu_restore - SPU context restore, with harvest and locking. 2125 * @new: pointer to SPU context save area, to be restored. 2126 * @spu: pointer to SPU iomem structure. 2127 * 2128 * Perform harvest + restore, as we may not be coming 2129 * from a previous successful save operation, and the 2130 * hardware state is unknown. 2131 */ 2132 int spu_restore(struct spu_state *new, struct spu *spu) 2133 { 2134 int rc; 2135 2136 acquire_spu_lock(spu); 2137 harvest(NULL, spu); 2138 spu->slb_replace = 0; 2139 rc = __do_spu_restore(new, spu); 2140 release_spu_lock(spu); 2141 if (rc) { 2142 panic("%s failed on SPU[%d] rc=%d.\n", 2143 __func__, spu->number, rc); 2144 } 2145 return rc; 2146 } 2147 EXPORT_SYMBOL_GPL(spu_restore); 2148 2149 static void init_prob(struct spu_state *csa) 2150 { 2151 csa->spu_chnlcnt_RW[9] = 1; 2152 csa->spu_chnlcnt_RW[21] = 16; 2153 csa->spu_chnlcnt_RW[23] = 1; 2154 csa->spu_chnlcnt_RW[28] = 1; 2155 csa->spu_chnlcnt_RW[30] = 1; 2156 csa->prob.spu_runcntl_RW = SPU_RUNCNTL_STOP; 2157 csa->prob.mb_stat_R = 0x000400; 2158 } 2159 2160 static void init_priv1(struct spu_state *csa) 2161 { 2162 /* Enable decode, relocate, tlbie response, master runcntl. */ 2163 csa->priv1.mfc_sr1_RW = MFC_STATE1_LOCAL_STORAGE_DECODE_MASK | 2164 MFC_STATE1_MASTER_RUN_CONTROL_MASK | 2165 MFC_STATE1_PROBLEM_STATE_MASK | 2166 MFC_STATE1_RELOCATE_MASK | MFC_STATE1_BUS_TLBIE_MASK; 2167 2168 /* Enable OS-specific set of interrupts. */ 2169 csa->priv1.int_mask_class0_RW = CLASS0_ENABLE_DMA_ALIGNMENT_INTR | 2170 CLASS0_ENABLE_INVALID_DMA_COMMAND_INTR | 2171 CLASS0_ENABLE_SPU_ERROR_INTR; 2172 csa->priv1.int_mask_class1_RW = CLASS1_ENABLE_SEGMENT_FAULT_INTR | 2173 CLASS1_ENABLE_STORAGE_FAULT_INTR; 2174 csa->priv1.int_mask_class2_RW = CLASS2_ENABLE_SPU_STOP_INTR | 2175 CLASS2_ENABLE_SPU_HALT_INTR | 2176 CLASS2_ENABLE_SPU_DMA_TAG_GROUP_COMPLETE_INTR; 2177 } 2178 2179 static void init_priv2(struct spu_state *csa) 2180 { 2181 csa->priv2.spu_lslr_RW = LS_ADDR_MASK; 2182 csa->priv2.mfc_control_RW = MFC_CNTL_RESUME_DMA_QUEUE | 2183 MFC_CNTL_NORMAL_DMA_QUEUE_OPERATION | 2184 MFC_CNTL_DMA_QUEUES_EMPTY_MASK; 2185 } 2186 2187 /** 2188 * spu_alloc_csa - allocate and initialize an SPU context save area. 2189 * 2190 * Allocate and initialize the contents of an SPU context save area. 2191 * This includes enabling address translation, interrupt masks, etc., 2192 * as appropriate for the given OS environment. 2193 * 2194 * Note that storage for the 'lscsa' is allocated separately, 2195 * as it is by far the largest of the context save regions, 2196 * and may need to be pinned or otherwise specially aligned. 2197 */ 2198 int spu_init_csa(struct spu_state *csa) 2199 { 2200 int rc; 2201 2202 if (!csa) 2203 return -EINVAL; 2204 memset(csa, 0, sizeof(struct spu_state)); 2205 2206 rc = spu_alloc_lscsa(csa); 2207 if (rc) 2208 return rc; 2209 2210 spin_lock_init(&csa->register_lock); 2211 2212 init_prob(csa); 2213 init_priv1(csa); 2214 init_priv2(csa); 2215 2216 return 0; 2217 } 2218 2219 void spu_fini_csa(struct spu_state *csa) 2220 { 2221 spu_free_lscsa(csa); 2222 } 2223