aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'arch/powerpc/kernel')
-rw-r--r--arch/powerpc/kernel/irq.c12
-rw-r--r--arch/powerpc/kernel/machine_kexec_64.c18
-rw-r--r--arch/powerpc/kernel/misc_32.S2
-rw-r--r--arch/powerpc/kernel/misc_64.S2
-rw-r--r--arch/powerpc/kernel/process.c5
-rw-r--r--arch/powerpc/kernel/rtas_flash.c39
-rw-r--r--arch/powerpc/kernel/setup_32.c4
-rw-r--r--arch/powerpc/kernel/setup_64.c4
8 files changed, 22 insertions, 64 deletions
diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c
index 30817d9b20cb..3333bbdd23ef 100644
--- a/arch/powerpc/kernel/irq.c
+++ b/arch/powerpc/kernel/irq.c
@@ -317,7 +317,6 @@ void fixup_irqs(const struct cpumask *map)
317} 317}
318#endif 318#endif
319 319
320#ifdef CONFIG_IRQSTACKS
321static inline void handle_one_irq(unsigned int irq) 320static inline void handle_one_irq(unsigned int irq)
322{ 321{
323 struct thread_info *curtp, *irqtp; 322 struct thread_info *curtp, *irqtp;
@@ -358,12 +357,6 @@ static inline void handle_one_irq(unsigned int irq)
358 if (irqtp->flags) 357 if (irqtp->flags)
359 set_bits(irqtp->flags, &curtp->flags); 358 set_bits(irqtp->flags, &curtp->flags);
360} 359}
361#else
362static inline void handle_one_irq(unsigned int irq)
363{
364 generic_handle_irq(irq);
365}
366#endif
367 360
368static inline void check_stack_overflow(void) 361static inline void check_stack_overflow(void)
369{ 362{
@@ -455,7 +448,6 @@ void exc_lvl_ctx_init(void)
455} 448}
456#endif 449#endif
457 450
458#ifdef CONFIG_IRQSTACKS
459struct thread_info *softirq_ctx[NR_CPUS] __read_mostly; 451struct thread_info *softirq_ctx[NR_CPUS] __read_mostly;
460struct thread_info *hardirq_ctx[NR_CPUS] __read_mostly; 452struct thread_info *hardirq_ctx[NR_CPUS] __read_mostly;
461 453
@@ -492,10 +484,6 @@ static inline void do_softirq_onstack(void)
492 irqtp->task = NULL; 484 irqtp->task = NULL;
493} 485}
494 486
495#else
496#define do_softirq_onstack() __do_softirq()
497#endif /* CONFIG_IRQSTACKS */
498
499void do_softirq(void) 487void do_softirq(void)
500{ 488{
501 unsigned long flags; 489 unsigned long flags;
diff --git a/arch/powerpc/kernel/machine_kexec_64.c b/arch/powerpc/kernel/machine_kexec_64.c
index 26f9900f773c..ed31a29c4ff7 100644
--- a/arch/powerpc/kernel/machine_kexec_64.c
+++ b/arch/powerpc/kernel/machine_kexec_64.c
@@ -182,28 +182,12 @@ static void kexec_prepare_cpus_wait(int wait_state)
182 182
183 my_cpu = get_cpu(); 183 my_cpu = get_cpu();
184 /* Make sure each CPU has atleast made it to the state we need */ 184 /* Make sure each CPU has atleast made it to the state we need */
185 for (i=0; i < NR_CPUS; i++) { 185 for_each_online_cpu(i) {
186 if (i == my_cpu) 186 if (i == my_cpu)
187 continue; 187 continue;
188 188
189 while (paca[i].kexec_state < wait_state) { 189 while (paca[i].kexec_state < wait_state) {
190 barrier(); 190 barrier();
191 if (!cpu_possible(i)) {
192 printk("kexec: cpu %d hw_cpu_id %d is not"
193 " possible, ignoring\n",
194 i, paca[i].hw_cpu_id);
195 break;
196 }
197 if (!cpu_online(i)) {
198 /* Fixme: this can be spinning in
199 * pSeries_secondary_wait with a paca
200 * waiting for it to go online.
201 */
202 printk("kexec: cpu %d hw_cpu_id %d is not"
203 " online, ignoring\n",
204 i, paca[i].hw_cpu_id);
205 break;
206 }
207 if (i != notified) { 191 if (i != notified) {
208 printk( "kexec: waiting for cpu %d (physical" 192 printk( "kexec: waiting for cpu %d (physical"
209 " %d) to enter %i state\n", 193 " %d) to enter %i state\n",
diff --git a/arch/powerpc/kernel/misc_32.S b/arch/powerpc/kernel/misc_32.S
index dc66d52dcff5..6bbd7a604d24 100644
--- a/arch/powerpc/kernel/misc_32.S
+++ b/arch/powerpc/kernel/misc_32.S
@@ -33,7 +33,6 @@
33 33
34 .text 34 .text
35 35
36#ifdef CONFIG_IRQSTACKS
37_GLOBAL(call_do_softirq) 36_GLOBAL(call_do_softirq)
38 mflr r0 37 mflr r0
39 stw r0,4(r1) 38 stw r0,4(r1)
@@ -56,7 +55,6 @@ _GLOBAL(call_handle_irq)
56 lwz r0,4(r1) 55 lwz r0,4(r1)
57 mtlr r0 56 mtlr r0
58 blr 57 blr
59#endif /* CONFIG_IRQSTACKS */
60 58
61/* 59/*
62 * This returns the high 64 bits of the product of two 64-bit numbers. 60 * This returns the high 64 bits of the product of two 64-bit numbers.
diff --git a/arch/powerpc/kernel/misc_64.S b/arch/powerpc/kernel/misc_64.S
index a2b18dffa03e..e5144906a56d 100644
--- a/arch/powerpc/kernel/misc_64.S
+++ b/arch/powerpc/kernel/misc_64.S
@@ -28,7 +28,6 @@
28 28
29 .text 29 .text
30 30
31#ifdef CONFIG_IRQSTACKS
32_GLOBAL(call_do_softirq) 31_GLOBAL(call_do_softirq)
33 mflr r0 32 mflr r0
34 std r0,16(r1) 33 std r0,16(r1)
@@ -52,7 +51,6 @@ _GLOBAL(call_handle_irq)
52 ld r0,16(r1) 51 ld r0,16(r1)
53 mtlr r0 52 mtlr r0
54 blr 53 blr
55#endif /* CONFIG_IRQSTACKS */
56 54
57 .section ".toc","aw" 55 .section ".toc","aw"
58PPC64_CACHES: 56PPC64_CACHES:
diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c
index 9d255b4f0a0e..773424df828a 100644
--- a/arch/powerpc/kernel/process.c
+++ b/arch/powerpc/kernel/process.c
@@ -1005,7 +1005,6 @@ out:
1005 return error; 1005 return error;
1006} 1006}
1007 1007
1008#ifdef CONFIG_IRQSTACKS
1009static inline int valid_irq_stack(unsigned long sp, struct task_struct *p, 1008static inline int valid_irq_stack(unsigned long sp, struct task_struct *p,
1010 unsigned long nbytes) 1009 unsigned long nbytes)
1011{ 1010{
@@ -1030,10 +1029,6 @@ static inline int valid_irq_stack(unsigned long sp, struct task_struct *p,
1030 return 0; 1029 return 0;
1031} 1030}
1032 1031
1033#else
1034#define valid_irq_stack(sp, p, nb) 0
1035#endif /* CONFIG_IRQSTACKS */
1036
1037int validate_sp(unsigned long sp, struct task_struct *p, 1032int validate_sp(unsigned long sp, struct task_struct *p,
1038 unsigned long nbytes) 1033 unsigned long nbytes)
1039{ 1034{
diff --git a/arch/powerpc/kernel/rtas_flash.c b/arch/powerpc/kernel/rtas_flash.c
index bfc2abafac44..67a84d8f118d 100644
--- a/arch/powerpc/kernel/rtas_flash.c
+++ b/arch/powerpc/kernel/rtas_flash.c
@@ -94,12 +94,8 @@ struct flash_block_list {
94 struct flash_block_list *next; 94 struct flash_block_list *next;
95 struct flash_block blocks[FLASH_BLOCKS_PER_NODE]; 95 struct flash_block blocks[FLASH_BLOCKS_PER_NODE];
96}; 96};
97struct flash_block_list_header { /* just the header of flash_block_list */
98 unsigned long num_blocks;
99 struct flash_block_list *next;
100};
101 97
102static struct flash_block_list_header rtas_firmware_flash_list = {0, NULL}; 98static struct flash_block_list *rtas_firmware_flash_list;
103 99
104/* Use slab cache to guarantee 4k alignment */ 100/* Use slab cache to guarantee 4k alignment */
105static struct kmem_cache *flash_block_cache = NULL; 101static struct kmem_cache *flash_block_cache = NULL;
@@ -108,13 +104,14 @@ static struct kmem_cache *flash_block_cache = NULL;
108 104
109/* Local copy of the flash block list. 105/* Local copy of the flash block list.
110 * We only allow one open of the flash proc file and create this 106 * We only allow one open of the flash proc file and create this
111 * list as we go. This list will be put in the 107 * list as we go. The rtas_firmware_flash_list varable will be
112 * rtas_firmware_flash_list var once it is fully read. 108 * set once the data is fully read.
113 * 109 *
114 * For convenience as we build the list we use virtual addrs, 110 * For convenience as we build the list we use virtual addrs,
115 * we do not fill in the version number, and the length field 111 * we do not fill in the version number, and the length field
116 * is treated as the number of entries currently in the block 112 * is treated as the number of entries currently in the block
117 * (i.e. not a byte count). This is all fixed on release. 113 * (i.e. not a byte count). This is all fixed when calling
114 * the flash routine.
118 */ 115 */
119 116
120/* Status int must be first member of struct */ 117/* Status int must be first member of struct */
@@ -201,16 +198,16 @@ static int rtas_flash_release(struct inode *inode, struct file *file)
201 if (uf->flist) { 198 if (uf->flist) {
202 /* File was opened in write mode for a new flash attempt */ 199 /* File was opened in write mode for a new flash attempt */
203 /* Clear saved list */ 200 /* Clear saved list */
204 if (rtas_firmware_flash_list.next) { 201 if (rtas_firmware_flash_list) {
205 free_flash_list(rtas_firmware_flash_list.next); 202 free_flash_list(rtas_firmware_flash_list);
206 rtas_firmware_flash_list.next = NULL; 203 rtas_firmware_flash_list = NULL;
207 } 204 }
208 205
209 if (uf->status != FLASH_AUTH) 206 if (uf->status != FLASH_AUTH)
210 uf->status = flash_list_valid(uf->flist); 207 uf->status = flash_list_valid(uf->flist);
211 208
212 if (uf->status == FLASH_IMG_READY) 209 if (uf->status == FLASH_IMG_READY)
213 rtas_firmware_flash_list.next = uf->flist; 210 rtas_firmware_flash_list = uf->flist;
214 else 211 else
215 free_flash_list(uf->flist); 212 free_flash_list(uf->flist);
216 213
@@ -593,7 +590,7 @@ static void rtas_flash_firmware(int reboot_type)
593 unsigned long rtas_block_list; 590 unsigned long rtas_block_list;
594 int i, status, update_token; 591 int i, status, update_token;
595 592
596 if (rtas_firmware_flash_list.next == NULL) 593 if (rtas_firmware_flash_list == NULL)
597 return; /* nothing to do */ 594 return; /* nothing to do */
598 595
599 if (reboot_type != SYS_RESTART) { 596 if (reboot_type != SYS_RESTART) {
@@ -610,20 +607,25 @@ static void rtas_flash_firmware(int reboot_type)
610 return; 607 return;
611 } 608 }
612 609
613 /* NOTE: the "first" block list is a global var with no data 610 /*
614 * blocks in the kernel data segment. We do this because 611 * NOTE: the "first" block must be under 4GB, so we create
615 * we want to ensure this block_list addr is under 4GB. 612 * an entry with no data blocks in the reserved buffer in
613 * the kernel data segment.
616 */ 614 */
617 rtas_firmware_flash_list.num_blocks = 0; 615 spin_lock(&rtas_data_buf_lock);
618 flist = (struct flash_block_list *)&rtas_firmware_flash_list; 616 flist = (struct flash_block_list *)&rtas_data_buf[0];
617 flist->num_blocks = 0;
618 flist->next = rtas_firmware_flash_list;
619 rtas_block_list = virt_to_abs(flist); 619 rtas_block_list = virt_to_abs(flist);
620 if (rtas_block_list >= 4UL*1024*1024*1024) { 620 if (rtas_block_list >= 4UL*1024*1024*1024) {
621 printk(KERN_ALERT "FLASH: kernel bug...flash list header addr above 4GB\n"); 621 printk(KERN_ALERT "FLASH: kernel bug...flash list header addr above 4GB\n");
622 spin_unlock(&rtas_data_buf_lock);
622 return; 623 return;
623 } 624 }
624 625
625 printk(KERN_ALERT "FLASH: preparing saved firmware image for flash\n"); 626 printk(KERN_ALERT "FLASH: preparing saved firmware image for flash\n");
626 /* Update the block_list in place. */ 627 /* Update the block_list in place. */
628 rtas_firmware_flash_list = NULL; /* too hard to backout on error */
627 image_size = 0; 629 image_size = 0;
628 for (f = flist; f; f = next) { 630 for (f = flist; f; f = next) {
629 /* Translate data addrs to absolute */ 631 /* Translate data addrs to absolute */
@@ -664,6 +666,7 @@ static void rtas_flash_firmware(int reboot_type)
664 printk(KERN_ALERT "FLASH: unknown flash return code %d\n", status); 666 printk(KERN_ALERT "FLASH: unknown flash return code %d\n", status);
665 break; 667 break;
666 } 668 }
669 spin_unlock(&rtas_data_buf_lock);
667} 670}
668 671
669static void remove_flash_pde(struct proc_dir_entry *dp) 672static void remove_flash_pde(struct proc_dir_entry *dp)
diff --git a/arch/powerpc/kernel/setup_32.c b/arch/powerpc/kernel/setup_32.c
index 8f58986c2ad9..7d84b210f168 100644
--- a/arch/powerpc/kernel/setup_32.c
+++ b/arch/powerpc/kernel/setup_32.c
@@ -241,7 +241,6 @@ int __init ppc_init(void)
241 241
242arch_initcall(ppc_init); 242arch_initcall(ppc_init);
243 243
244#ifdef CONFIG_IRQSTACKS
245static void __init irqstack_early_init(void) 244static void __init irqstack_early_init(void)
246{ 245{
247 unsigned int i; 246 unsigned int i;
@@ -255,9 +254,6 @@ static void __init irqstack_early_init(void)
255 __va(lmb_alloc(THREAD_SIZE, THREAD_SIZE)); 254 __va(lmb_alloc(THREAD_SIZE, THREAD_SIZE));
256 } 255 }
257} 256}
258#else
259#define irqstack_early_init()
260#endif
261 257
262#if defined(CONFIG_BOOKE) || defined(CONFIG_40x) 258#if defined(CONFIG_BOOKE) || defined(CONFIG_40x)
263static void __init exc_lvl_early_init(void) 259static void __init exc_lvl_early_init(void)
diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c
index f3fb5a79de52..643dcac40fcb 100644
--- a/arch/powerpc/kernel/setup_64.c
+++ b/arch/powerpc/kernel/setup_64.c
@@ -432,7 +432,6 @@ static u64 slb0_limit(void)
432 return 1UL << SID_SHIFT; 432 return 1UL << SID_SHIFT;
433} 433}
434 434
435#ifdef CONFIG_IRQSTACKS
436static void __init irqstack_early_init(void) 435static void __init irqstack_early_init(void)
437{ 436{
438 u64 limit = slb0_limit(); 437 u64 limit = slb0_limit();
@@ -451,9 +450,6 @@ static void __init irqstack_early_init(void)
451 THREAD_SIZE, limit)); 450 THREAD_SIZE, limit));
452 } 451 }
453} 452}
454#else
455#define irqstack_early_init()
456#endif
457 453
458#ifdef CONFIG_PPC_BOOK3E 454#ifdef CONFIG_PPC_BOOK3E
459static void __init exc_lvl_early_init(void) 455static void __init exc_lvl_early_init(void)