The iseries has a bar graph on the front panel that shows how busy it is. The operating system sets and clears a bit in the CTRL register to control it. Instead of going to the complexity of using a thread info bit, just set and clear it in the idle loop. Also create two helper functions, ppc64_runlatch_on and ppc64_runlatch_off. Finally don't use the short form of the SPR defines.
Unified · Split
| @@ -436,15 +436,6 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC) · 435 unmodified lines | ||
| 436 | 436 | REST_8GPRS(14, r1) |
| 437 | 437 | REST_10GPRS(22, r1) |
| 438 | 438 | |
| 439 | −#ifdef CONFIG_PPC_ISERIES | |
| 440 | − clrrdi r7,r1,THREAD_SHIFT /* get current_thread_info() */ | |
| 441 | − ld r7,TI_FLAGS(r7) /* Get run light flag */ | |
| 442 | − mfspr r9,CTRLF | |
| 443 | − srdi r7,r7,TIF_RUN_LIGHT | |
| 444 | − insrdi r9,r7,1,63 /* Insert run light into CTRL */ | |
| 445 | − mtspr CTRLT,r9 | |
| 446 | −#endif | |
| 447 | − | |
| 448 | 439 | /* convert old thread to its task_struct for return value */ |
| 449 | 440 | addi r3,r3,-THREAD |
| 450 | 441 | ld r7,_NIP(r1) /* Return to _switch caller in new task */ |
| @@ -626,10 +626,10 @@ system_reset_iSeries: · 625 unmodified lines | ||
| 626 | 626 | lhz r24,PACAPACAINDEX(r13) /* Get processor # */ |
| 627 | 627 | cmpwi 0,r24,0 /* Are we processor 0? */ |
| 628 | 628 | beq .__start_initialization_iSeries /* Start up the first processor */ |
| 629 | − mfspr r4,CTRLF | |
| 630 | − li r5,RUNLATCH /* Turn off the run light */ | |
| 629 | + mfspr r4,SPRN_CTRLF | |
| 630 | + li r5,CTRL_RUNLATCH /* Turn off the run light */ | |
| 631 | 631 | andc r4,r4,r5 |
| 632 | − mtspr CTRLT,r4 | |
| 632 | + mtspr SPRN_CTRLT,r4 | |
| 633 | 633 | |
| 634 | 634 | 1: |
| 635 | 635 | HMT_LOW |
| @@ -2082,9 +2082,9 @@ _GLOBAL(hmt_start_secondary) · 1446 unmodified lines | ||
| 2082 | 2082 | mfspr r4, HID0 |
| 2083 | 2083 | ori r4, r4, 0x1 |
| 2084 | 2084 | mtspr HID0, r4 |
| 2085 | − mfspr r4, CTRLF | |
| 2085 | + mfspr r4, SPRN_CTRLF | |
| 2086 | 2086 | oris r4, r4, 0x40 |
| 2087 | − mtspr CTRLT, r4 | |
| 2087 | + mtspr SPRN_CTRLT, r4 | |
| 2088 | 2088 | blr |
| 2089 | 2089 | #endif |
| 2090 | 2090 | |
| @@ -75,13 +75,9 @@ static int iSeries_idle(void) · 74 unmodified lines | ||
| 75 | 75 | { |
| 76 | 76 | struct paca_struct *lpaca; |
| 77 | 77 | long oldval; |
| 78 | − unsigned long CTRL; | |
| 79 | 78 | |
| 80 | 79 | /* ensure iSeries run light will be out when idle */ |
| 81 | − clear_thread_flag(TIF_RUN_LIGHT); | |
| 82 | − CTRL = mfspr(CTRLF); | |
| 83 | − CTRL &= ~RUNLATCH; | |
| 84 | − mtspr(CTRLT, CTRL); | |
| 80 | + ppc64_runlatch_off(); | |
| 85 | 81 | |
| 86 | 82 | lpaca = get_paca(); |
| 87 | 83 | |
| @@ -111,7 +107,9 @@ static int iSeries_idle(void) · 23 unmodified lines | ||
| 111 | 107 | } |
| 112 | 108 | } |
| 113 | 109 | |
| 110 | + ppc64_runlatch_on(); | |
| 114 | 111 | schedule(); |
| 112 | + ppc64_runlatch_off(); | |
| 115 | 113 | } |
| 116 | 114 | |
| 117 | 115 | return 0; |
| @@ -378,9 +378,6 @@ copy_thread(int nr, unsigned long clone_flags, unsigned long usp, · 377 unmodified lines | ||
| 378 | 378 | childregs->gpr[1] = sp + sizeof(struct pt_regs); |
| 379 | 379 | p->thread.regs = NULL; /* no user register state */ |
| 380 | 380 | clear_ti_thread_flag(p->thread_info, TIF_32BIT); |
| 381 | −#ifdef CONFIG_PPC_ISERIES | |
| 382 | − set_ti_thread_flag(p->thread_info, TIF_RUN_LIGHT); | |
| 383 | −#endif | |
| 384 | 381 | } else { |
| 385 | 382 | childregs->gpr[1] = usp; |
| 386 | 383 | p->thread.regs = childregs; |
| @@ -113,7 +113,6 @@ void ppc64_enable_pmcs(void) · 112 unmodified lines | ||
| 113 | 113 | #ifdef CONFIG_PPC_PSERIES |
| 114 | 114 | unsigned long set, reset; |
| 115 | 115 | int ret; |
| 116 | − unsigned int ctrl; | |
| 117 | 116 | #endif /* CONFIG_PPC_PSERIES */ |
| 118 | 117 | |
| 119 | 118 | /* Only need to enable them once */ |
| @@ -167,11 +166,8 @@ void ppc64_enable_pmcs(void) · 47 unmodified lines | ||
| 167 | 166 | * On SMT machines we have to set the run latch in the ctrl register |
| 168 | 167 | * in order to make PMC6 spin. |
| 169 | 168 | */ |
| 170 | − if (cpu_has_feature(CPU_FTR_SMT)) { | |
| 171 | − ctrl = mfspr(CTRLF); | |
| 172 | − ctrl |= RUNLATCH; | |
| 173 | − mtspr(CTRLT, ctrl); | |
| 174 | − } | |
| 169 | + if (cpu_has_feature(CPU_FTR_SMT)) | |
| 170 | + ppc64_runlatch_on(); | |
| 175 | 171 | #endif /* CONFIG_PPC_PSERIES */ |
| 176 | 172 | } |
| 177 | 173 | |
| @@ -164,6 +164,9 @@ · 163 unmodified lines | ||
| 164 | 164 | #define SPRN_USIA 0x3AB /* User Sampled Instruction Address Register */ |
| 165 | 165 | #define SPRN_XER 0x001 /* Fixed Point Exception Register */ |
| 166 | 166 | #define SPRN_VRSAVE 0x100 /* Vector save */ |
| 167 | +#define SPRN_CTRLF 0x088 | |
| 168 | +#define SPRN_CTRLT 0x098 | |
| 169 | +#define CTRL_RUNLATCH 0x1 | |
| 167 | 170 | |
| 168 | 171 | /* Performance monitor SPRs */ |
| 169 | 172 | #define SPRN_SIAR 780 |
| @@ -279,12 +282,6 @@ · 109 unmodified lines | ||
| 279 | 282 | #define XGLUE(a,b) a##b |
| 280 | 283 | #define GLUE(a,b) XGLUE(a,b) |
| 281 | 284 | |
| 282 | −/* iSeries CTRL register (for runlatch) */ | |
| 283 | − | |
| 284 | −#define CTRLT 0x098 | |
| 285 | −#define CTRLF 0x088 | |
| 286 | −#define RUNLATCH 0x0001 | |
| 287 | − | |
| 288 | 285 | #ifdef __ASSEMBLY__ |
| 289 | 286 | |
| 290 | 287 | #define _GLOBAL(name) \ |
| @@ -499,6 +496,24 @@ static inline void prefetchw(const void *x) · 208 unmodified lines | ||
| 499 | 496 | |
| 500 | 497 | #define HAVE_ARCH_PICK_MMAP_LAYOUT |
| 501 | 498 | |
| 499 | +static inline void ppc64_runlatch_on(void) | |
| 500 | +{ | |
| 501 | + unsigned long ctrl; | |
| 502 | + | |
| 503 | + ctrl = mfspr(SPRN_CTRLF); | |
| 504 | + ctrl |= CTRL_RUNLATCH; | |
| 505 | + mtspr(SPRN_CTRLT, ctrl); | |
| 506 | +} | |
| 507 | + | |
| 508 | +static inline void ppc64_runlatch_off(void) | |
| 509 | +{ | |
| 510 | + unsigned long ctrl; | |
| 511 | + | |
| 512 | + ctrl = mfspr(SPRN_CTRLF); | |
| 513 | + ctrl &= ~CTRL_RUNLATCH; | |
| 514 | + mtspr(SPRN_CTRLT, ctrl); | |
| 515 | +} | |
| 516 | + | |
| 502 | 517 | #endif /* __KERNEL__ */ |
| 503 | 518 | |
| 504 | 519 | #endif /* __ASSEMBLY__ */ |
| @@ -96,7 +96,7 @@ static inline struct thread_info *current_thread_info(void) · 95 unmodified lines | ||
| 96 | 96 | #define TIF_POLLING_NRFLAG 4 /* true if poll_idle() is polling |
| 97 | 97 | TIF_NEED_RESCHED */ |
| 98 | 98 | #define TIF_32BIT 5 /* 32 bit binary */ |
| 99 | −#define TIF_RUN_LIGHT 6 /* iSeries run light */ | |
| 99 | +/* #define SPARE 6 */ | |
| 100 | 100 | #define TIF_ABI_PENDING 7 /* 32/64 bit switch needed */ |
| 101 | 101 | #define TIF_SYSCALL_AUDIT 8 /* syscall auditing active */ |
| 102 | 102 | #define TIF_SINGLESTEP 9 /* singlestepping active */ |
| @@ -110,7 +110,7 @@ static inline struct thread_info *current_thread_info(void) · 7 unmodified lines | ||
| 110 | 110 | #define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED) |
| 111 | 111 | #define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG) |
| 112 | 112 | #define _TIF_32BIT (1<<TIF_32BIT) |
| 113 | −#define _TIF_RUN_LIGHT (1<<TIF_RUN_LIGHT) | |
| 113 | +/* #define _SPARE (1<<SPARE) */ | |
| 114 | 114 | #define _TIF_ABI_PENDING (1<<TIF_ABI_PENDING) |
| 115 | 115 | #define _TIF_SYSCALL_AUDIT (1<<TIF_SYSCALL_AUDIT) |
| 116 | 116 | #define _TIF_SINGLESTEP (1<<TIF_SINGLESTEP) |