diff options
Diffstat (limited to 'arch/powerpc/platforms/pseries')
-rw-r--r-- | arch/powerpc/platforms/pseries/eeh.c | 14 | ||||
-rw-r--r-- | arch/powerpc/platforms/pseries/eeh_driver.c | 11 | ||||
-rw-r--r-- | arch/powerpc/platforms/pseries/firmware.c | 1 | ||||
-rw-r--r-- | arch/powerpc/platforms/pseries/hotplug-memory.c | 117 | ||||
-rw-r--r-- | arch/powerpc/platforms/pseries/iommu.c | 15 | ||||
-rw-r--r-- | arch/powerpc/platforms/pseries/kexec.c | 2 | ||||
-rw-r--r-- | arch/powerpc/platforms/pseries/lpar.c | 4 | ||||
-rw-r--r-- | arch/powerpc/platforms/pseries/nvram.c | 4 | ||||
-rw-r--r-- | arch/powerpc/platforms/pseries/ras.c | 2 | ||||
-rw-r--r-- | arch/powerpc/platforms/pseries/reconfig.c | 38 | ||||
-rw-r--r-- | arch/powerpc/platforms/pseries/rtasd.c | 4 | ||||
-rw-r--r-- | arch/powerpc/platforms/pseries/setup.c | 4 | ||||
-rw-r--r-- | arch/powerpc/platforms/pseries/xics.c | 6 |
13 files changed, 155 insertions, 67 deletions
diff --git a/arch/powerpc/platforms/pseries/eeh.c b/arch/powerpc/platforms/pseries/eeh.c index 6f544ba4b37..c027f0a70a0 100644 --- a/arch/powerpc/platforms/pseries/eeh.c +++ b/arch/powerpc/platforms/pseries/eeh.c | |||
@@ -812,6 +812,7 @@ int rtas_set_slot_reset(struct pci_dn *pdn) | |||
812 | static inline void __restore_bars (struct pci_dn *pdn) | 812 | static inline void __restore_bars (struct pci_dn *pdn) |
813 | { | 813 | { |
814 | int i; | 814 | int i; |
815 | u32 cmd; | ||
815 | 816 | ||
816 | if (NULL==pdn->phb) return; | 817 | if (NULL==pdn->phb) return; |
817 | for (i=4; i<10; i++) { | 818 | for (i=4; i<10; i++) { |
@@ -832,6 +833,19 @@ static inline void __restore_bars (struct pci_dn *pdn) | |||
832 | 833 | ||
833 | /* max latency, min grant, interrupt pin and line */ | 834 | /* max latency, min grant, interrupt pin and line */ |
834 | rtas_write_config(pdn, 15*4, 4, pdn->config_space[15]); | 835 | rtas_write_config(pdn, 15*4, 4, pdn->config_space[15]); |
836 | |||
837 | /* Restore PERR & SERR bits, some devices require it, | ||
838 | don't touch the other command bits */ | ||
839 | rtas_read_config(pdn, PCI_COMMAND, 4, &cmd); | ||
840 | if (pdn->config_space[1] & PCI_COMMAND_PARITY) | ||
841 | cmd |= PCI_COMMAND_PARITY; | ||
842 | else | ||
843 | cmd &= ~PCI_COMMAND_PARITY; | ||
844 | if (pdn->config_space[1] & PCI_COMMAND_SERR) | ||
845 | cmd |= PCI_COMMAND_SERR; | ||
846 | else | ||
847 | cmd &= ~PCI_COMMAND_SERR; | ||
848 | rtas_write_config(pdn, PCI_COMMAND, 4, cmd); | ||
835 | } | 849 | } |
836 | 850 | ||
837 | /** | 851 | /** |
diff --git a/arch/powerpc/platforms/pseries/eeh_driver.c b/arch/powerpc/platforms/pseries/eeh_driver.c index 68ea5eee39a..8c1ca477c52 100644 --- a/arch/powerpc/platforms/pseries/eeh_driver.c +++ b/arch/powerpc/platforms/pseries/eeh_driver.c | |||
@@ -42,17 +42,20 @@ static inline const char * pcid_name (struct pci_dev *pdev) | |||
42 | } | 42 | } |
43 | 43 | ||
44 | #ifdef DEBUG | 44 | #ifdef DEBUG |
45 | static void print_device_node_tree (struct pci_dn *pdn, int dent) | 45 | static void print_device_node_tree(struct pci_dn *pdn, int dent) |
46 | { | 46 | { |
47 | int i; | 47 | int i; |
48 | if (!pdn) return; | 48 | struct device_node *pc; |
49 | for (i=0;i<dent; i++) | 49 | |
50 | if (!pdn) | ||
51 | return; | ||
52 | for (i = 0; i < dent; i++) | ||
50 | printk(" "); | 53 | printk(" "); |
51 | printk("dn=%s mode=%x \tcfg_addr=%x pe_addr=%x \tfull=%s\n", | 54 | printk("dn=%s mode=%x \tcfg_addr=%x pe_addr=%x \tfull=%s\n", |
52 | pdn->node->name, pdn->eeh_mode, pdn->eeh_config_addr, | 55 | pdn->node->name, pdn->eeh_mode, pdn->eeh_config_addr, |
53 | pdn->eeh_pe_config_addr, pdn->node->full_name); | 56 | pdn->eeh_pe_config_addr, pdn->node->full_name); |
54 | dent += 3; | 57 | dent += 3; |
55 | struct device_node *pc = pdn->node->child; | 58 | pc = pdn->node->child; |
56 | while (pc) { | 59 | while (pc) { |
57 | print_device_node_tree(PCI_DN(pc), dent); | 60 | print_device_node_tree(PCI_DN(pc), dent); |
58 | pc = pc->sibling; | 61 | pc = pc->sibling; |
diff --git a/arch/powerpc/platforms/pseries/firmware.c b/arch/powerpc/platforms/pseries/firmware.c index 9d3a40f4597..5a707da3f5c 100644 --- a/arch/powerpc/platforms/pseries/firmware.c +++ b/arch/powerpc/platforms/pseries/firmware.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <asm/prom.h> | 26 | #include <asm/prom.h> |
27 | #include <asm/udbg.h> | 27 | #include <asm/udbg.h> |
28 | 28 | ||
29 | #include "pseries.h" | ||
29 | 30 | ||
30 | typedef struct { | 31 | typedef struct { |
31 | unsigned long val; | 32 | unsigned long val; |
diff --git a/arch/powerpc/platforms/pseries/hotplug-memory.c b/arch/powerpc/platforms/pseries/hotplug-memory.c index 3c5727dd5aa..a1a368dd2d9 100644 --- a/arch/powerpc/platforms/pseries/hotplug-memory.c +++ b/arch/powerpc/platforms/pseries/hotplug-memory.c | |||
@@ -15,34 +15,13 @@ | |||
15 | #include <asm/machdep.h> | 15 | #include <asm/machdep.h> |
16 | #include <asm/pSeries_reconfig.h> | 16 | #include <asm/pSeries_reconfig.h> |
17 | 17 | ||
18 | static int pseries_remove_memory(struct device_node *np) | 18 | static int pseries_remove_lmb(unsigned long base, unsigned int lmb_size) |
19 | { | 19 | { |
20 | const char *type; | 20 | unsigned long start, start_pfn; |
21 | const unsigned int *my_index; | ||
22 | const unsigned int *regs; | ||
23 | u64 start_pfn, start; | ||
24 | struct zone *zone; | 21 | struct zone *zone; |
25 | int ret = -EINVAL; | 22 | int ret; |
26 | |||
27 | /* | ||
28 | * Check to see if we are actually removing memory | ||
29 | */ | ||
30 | type = of_get_property(np, "device_type", NULL); | ||
31 | if (type == NULL || strcmp(type, "memory") != 0) | ||
32 | return 0; | ||
33 | 23 | ||
34 | /* | 24 | start_pfn = base >> PFN_SECTION_SHIFT; |
35 | * Find the memory index and size of the removing section | ||
36 | */ | ||
37 | my_index = of_get_property(np, "ibm,my-drc-index", NULL); | ||
38 | if (!my_index) | ||
39 | return ret; | ||
40 | |||
41 | regs = of_get_property(np, "reg", NULL); | ||
42 | if (!regs) | ||
43 | return ret; | ||
44 | |||
45 | start_pfn = section_nr_to_pfn(*my_index & 0xffff); | ||
46 | zone = page_zone(pfn_to_page(start_pfn)); | 25 | zone = page_zone(pfn_to_page(start_pfn)); |
47 | 26 | ||
48 | /* | 27 | /* |
@@ -54,56 +33,111 @@ static int pseries_remove_memory(struct device_node *np) | |||
54 | * to sysfs "state" file and we can't remove sysfs entries | 33 | * to sysfs "state" file and we can't remove sysfs entries |
55 | * while writing to it. So we have to defer it to here. | 34 | * while writing to it. So we have to defer it to here. |
56 | */ | 35 | */ |
57 | ret = __remove_pages(zone, start_pfn, regs[3] >> PAGE_SHIFT); | 36 | ret = __remove_pages(zone, start_pfn, lmb_size >> PAGE_SHIFT); |
58 | if (ret) | 37 | if (ret) |
59 | return ret; | 38 | return ret; |
60 | 39 | ||
61 | /* | 40 | /* |
62 | * Update memory regions for memory remove | 41 | * Update memory regions for memory remove |
63 | */ | 42 | */ |
64 | lmb_remove(start_pfn << PAGE_SHIFT, regs[3]); | 43 | lmb_remove(base, lmb_size); |
65 | 44 | ||
66 | /* | 45 | /* |
67 | * Remove htab bolted mappings for this section of memory | 46 | * Remove htab bolted mappings for this section of memory |
68 | */ | 47 | */ |
69 | start = (unsigned long)__va(start_pfn << PAGE_SHIFT); | 48 | start = (unsigned long)__va(base); |
70 | ret = remove_section_mapping(start, start + regs[3]); | 49 | ret = remove_section_mapping(start, start + lmb_size); |
71 | return ret; | 50 | return ret; |
72 | } | 51 | } |
73 | 52 | ||
74 | static int pseries_add_memory(struct device_node *np) | 53 | static int pseries_remove_memory(struct device_node *np) |
75 | { | 54 | { |
76 | const char *type; | 55 | const char *type; |
77 | const unsigned int *my_index; | ||
78 | const unsigned int *regs; | 56 | const unsigned int *regs; |
79 | u64 start_pfn; | 57 | unsigned long base; |
58 | unsigned int lmb_size; | ||
80 | int ret = -EINVAL; | 59 | int ret = -EINVAL; |
81 | 60 | ||
82 | /* | 61 | /* |
83 | * Check to see if we are actually adding memory | 62 | * Check to see if we are actually removing memory |
84 | */ | 63 | */ |
85 | type = of_get_property(np, "device_type", NULL); | 64 | type = of_get_property(np, "device_type", NULL); |
86 | if (type == NULL || strcmp(type, "memory") != 0) | 65 | if (type == NULL || strcmp(type, "memory") != 0) |
87 | return 0; | 66 | return 0; |
88 | 67 | ||
89 | /* | 68 | /* |
90 | * Find the memory index and size of the added section | 69 | * Find the bae address and size of the lmb |
91 | */ | 70 | */ |
92 | my_index = of_get_property(np, "ibm,my-drc-index", NULL); | 71 | regs = of_get_property(np, "reg", NULL); |
93 | if (!my_index) | 72 | if (!regs) |
94 | return ret; | 73 | return ret; |
95 | 74 | ||
75 | base = *(unsigned long *)regs; | ||
76 | lmb_size = regs[3]; | ||
77 | |||
78 | ret = pseries_remove_lmb(base, lmb_size); | ||
79 | return ret; | ||
80 | } | ||
81 | |||
82 | static int pseries_add_memory(struct device_node *np) | ||
83 | { | ||
84 | const char *type; | ||
85 | const unsigned int *regs; | ||
86 | unsigned long base; | ||
87 | unsigned int lmb_size; | ||
88 | int ret = -EINVAL; | ||
89 | |||
90 | /* | ||
91 | * Check to see if we are actually adding memory | ||
92 | */ | ||
93 | type = of_get_property(np, "device_type", NULL); | ||
94 | if (type == NULL || strcmp(type, "memory") != 0) | ||
95 | return 0; | ||
96 | |||
97 | /* | ||
98 | * Find the base and size of the lmb | ||
99 | */ | ||
96 | regs = of_get_property(np, "reg", NULL); | 100 | regs = of_get_property(np, "reg", NULL); |
97 | if (!regs) | 101 | if (!regs) |
98 | return ret; | 102 | return ret; |
99 | 103 | ||
100 | start_pfn = section_nr_to_pfn(*my_index & 0xffff); | 104 | base = *(unsigned long *)regs; |
105 | lmb_size = regs[3]; | ||
101 | 106 | ||
102 | /* | 107 | /* |
103 | * Update memory region to represent the memory add | 108 | * Update memory region to represent the memory add |
104 | */ | 109 | */ |
105 | lmb_add(start_pfn << PAGE_SHIFT, regs[3]); | 110 | ret = lmb_add(base, lmb_size); |
106 | return 0; | 111 | return (ret < 0) ? -EINVAL : 0; |
112 | } | ||
113 | |||
114 | static int pseries_drconf_memory(unsigned long *base, unsigned int action) | ||
115 | { | ||
116 | struct device_node *np; | ||
117 | const unsigned long *lmb_size; | ||
118 | int rc; | ||
119 | |||
120 | np = of_find_node_by_path("/ibm,dynamic-reconfiguration-memory"); | ||
121 | if (!np) | ||
122 | return -EINVAL; | ||
123 | |||
124 | lmb_size = of_get_property(np, "ibm,lmb-size", NULL); | ||
125 | if (!lmb_size) { | ||
126 | of_node_put(np); | ||
127 | return -EINVAL; | ||
128 | } | ||
129 | |||
130 | if (action == PSERIES_DRCONF_MEM_ADD) { | ||
131 | rc = lmb_add(*base, *lmb_size); | ||
132 | rc = (rc < 0) ? -EINVAL : 0; | ||
133 | } else if (action == PSERIES_DRCONF_MEM_REMOVE) { | ||
134 | rc = pseries_remove_lmb(*base, *lmb_size); | ||
135 | } else { | ||
136 | rc = -EINVAL; | ||
137 | } | ||
138 | |||
139 | of_node_put(np); | ||
140 | return rc; | ||
107 | } | 141 | } |
108 | 142 | ||
109 | static int pseries_memory_notifier(struct notifier_block *nb, | 143 | static int pseries_memory_notifier(struct notifier_block *nb, |
@@ -120,6 +154,11 @@ static int pseries_memory_notifier(struct notifier_block *nb, | |||
120 | if (pseries_remove_memory(node)) | 154 | if (pseries_remove_memory(node)) |
121 | err = NOTIFY_BAD; | 155 | err = NOTIFY_BAD; |
122 | break; | 156 | break; |
157 | case PSERIES_DRCONF_MEM_ADD: | ||
158 | case PSERIES_DRCONF_MEM_REMOVE: | ||
159 | if (pseries_drconf_memory(node, action)) | ||
160 | err = NOTIFY_BAD; | ||
161 | break; | ||
123 | default: | 162 | default: |
124 | err = NOTIFY_DONE; | 163 | err = NOTIFY_DONE; |
125 | break; | 164 | break; |
diff --git a/arch/powerpc/platforms/pseries/iommu.c b/arch/powerpc/platforms/pseries/iommu.c index 176f1f39d2d..9a12908510f 100644 --- a/arch/powerpc/platforms/pseries/iommu.c +++ b/arch/powerpc/platforms/pseries/iommu.c | |||
@@ -135,9 +135,10 @@ static void tce_buildmulti_pSeriesLP(struct iommu_table *tbl, long tcenum, | |||
135 | u64 rpn; | 135 | u64 rpn; |
136 | long l, limit; | 136 | long l, limit; |
137 | 137 | ||
138 | if (npages == 1) | 138 | if (npages == 1) { |
139 | return tce_build_pSeriesLP(tbl, tcenum, npages, uaddr, | 139 | tce_build_pSeriesLP(tbl, tcenum, npages, uaddr, direction); |
140 | direction); | 140 | return; |
141 | } | ||
141 | 142 | ||
142 | tcep = __get_cpu_var(tce_page); | 143 | tcep = __get_cpu_var(tce_page); |
143 | 144 | ||
@@ -147,9 +148,11 @@ static void tce_buildmulti_pSeriesLP(struct iommu_table *tbl, long tcenum, | |||
147 | if (!tcep) { | 148 | if (!tcep) { |
148 | tcep = (u64 *)__get_free_page(GFP_ATOMIC); | 149 | tcep = (u64 *)__get_free_page(GFP_ATOMIC); |
149 | /* If allocation fails, fall back to the loop implementation */ | 150 | /* If allocation fails, fall back to the loop implementation */ |
150 | if (!tcep) | 151 | if (!tcep) { |
151 | return tce_build_pSeriesLP(tbl, tcenum, npages, | 152 | tce_build_pSeriesLP(tbl, tcenum, npages, uaddr, |
152 | uaddr, direction); | 153 | direction); |
154 | return; | ||
155 | } | ||
153 | __get_cpu_var(tce_page) = tcep; | 156 | __get_cpu_var(tce_page) = tcep; |
154 | } | 157 | } |
155 | 158 | ||
diff --git a/arch/powerpc/platforms/pseries/kexec.c b/arch/powerpc/platforms/pseries/kexec.c index e9dd5fe081c..53cbd53d874 100644 --- a/arch/powerpc/platforms/pseries/kexec.c +++ b/arch/powerpc/platforms/pseries/kexec.c | |||
@@ -70,4 +70,4 @@ static int __init pseries_kexec_setup(void) | |||
70 | 70 | ||
71 | return 0; | 71 | return 0; |
72 | } | 72 | } |
73 | __initcall(pseries_kexec_setup); | 73 | machine_device_initcall(pseries, pseries_kexec_setup); |
diff --git a/arch/powerpc/platforms/pseries/lpar.c b/arch/powerpc/platforms/pseries/lpar.c index 2cbaedb17f3..52a80e5840e 100644 --- a/arch/powerpc/platforms/pseries/lpar.c +++ b/arch/powerpc/platforms/pseries/lpar.c | |||
@@ -52,7 +52,7 @@ EXPORT_SYMBOL(plpar_hcall_norets); | |||
52 | extern void pSeries_find_serial_port(void); | 52 | extern void pSeries_find_serial_port(void); |
53 | 53 | ||
54 | 54 | ||
55 | int vtermno; /* virtual terminal# for udbg */ | 55 | static int vtermno; /* virtual terminal# for udbg */ |
56 | 56 | ||
57 | #define __ALIGNED__ __attribute__((__aligned__(sizeof(long)))) | 57 | #define __ALIGNED__ __attribute__((__aligned__(sizeof(long)))) |
58 | static void udbg_hvsi_putc(char c) | 58 | static void udbg_hvsi_putc(char c) |
@@ -305,7 +305,7 @@ static long pSeries_lpar_hpte_insert(unsigned long hpte_group, | |||
305 | flags = 0; | 305 | flags = 0; |
306 | 306 | ||
307 | /* Make pHyp happy */ | 307 | /* Make pHyp happy */ |
308 | if (rflags & (_PAGE_GUARDED|_PAGE_NO_CACHE)) | 308 | if ((rflags & _PAGE_NO_CACHE) & !(rflags & _PAGE_WRITETHRU)) |
309 | hpte_r &= ~_PAGE_COHERENT; | 309 | hpte_r &= ~_PAGE_COHERENT; |
310 | 310 | ||
311 | lpar_rc = plpar_pte_enter(flags, hpte_group, hpte_v, hpte_r, &slot); | 311 | lpar_rc = plpar_pte_enter(flags, hpte_group, hpte_v, hpte_r, &slot); |
diff --git a/arch/powerpc/platforms/pseries/nvram.c b/arch/powerpc/platforms/pseries/nvram.c index f68903e15bd..42f7e384e6c 100644 --- a/arch/powerpc/platforms/pseries/nvram.c +++ b/arch/powerpc/platforms/pseries/nvram.c | |||
@@ -131,8 +131,10 @@ int __init pSeries_nvram_init(void) | |||
131 | return -ENODEV; | 131 | return -ENODEV; |
132 | 132 | ||
133 | nbytes_p = of_get_property(nvram, "#bytes", &proplen); | 133 | nbytes_p = of_get_property(nvram, "#bytes", &proplen); |
134 | if (nbytes_p == NULL || proplen != sizeof(unsigned int)) | 134 | if (nbytes_p == NULL || proplen != sizeof(unsigned int)) { |
135 | of_node_put(nvram); | ||
135 | return -EIO; | 136 | return -EIO; |
137 | } | ||
136 | 138 | ||
137 | nvram_size = *nbytes_p; | 139 | nvram_size = *nbytes_p; |
138 | 140 | ||
diff --git a/arch/powerpc/platforms/pseries/ras.c b/arch/powerpc/platforms/pseries/ras.c index 2b548afd100..d20b96e22c2 100644 --- a/arch/powerpc/platforms/pseries/ras.c +++ b/arch/powerpc/platforms/pseries/ras.c | |||
@@ -55,7 +55,7 @@ | |||
55 | static unsigned char ras_log_buf[RTAS_ERROR_LOG_MAX]; | 55 | static unsigned char ras_log_buf[RTAS_ERROR_LOG_MAX]; |
56 | static DEFINE_SPINLOCK(ras_log_buf_lock); | 56 | static DEFINE_SPINLOCK(ras_log_buf_lock); |
57 | 57 | ||
58 | char mce_data_buf[RTAS_ERROR_LOG_MAX]; | 58 | static char mce_data_buf[RTAS_ERROR_LOG_MAX]; |
59 | 59 | ||
60 | static int ras_get_sensor_state_token; | 60 | static int ras_get_sensor_state_token; |
61 | static int ras_check_exception_token; | 61 | static int ras_check_exception_token; |
diff --git a/arch/powerpc/platforms/pseries/reconfig.c b/arch/powerpc/platforms/pseries/reconfig.c index 75769aae41d..7637bd38c79 100644 --- a/arch/powerpc/platforms/pseries/reconfig.c +++ b/arch/powerpc/platforms/pseries/reconfig.c | |||
@@ -365,7 +365,7 @@ static char *parse_node(char *buf, size_t bufsize, struct device_node **npp) | |||
365 | *buf = '\0'; | 365 | *buf = '\0'; |
366 | buf++; | 366 | buf++; |
367 | 367 | ||
368 | handle = simple_strtoul(handle_str, NULL, 10); | 368 | handle = simple_strtoul(handle_str, NULL, 0); |
369 | 369 | ||
370 | *npp = of_find_node_by_phandle(handle); | 370 | *npp = of_find_node_by_phandle(handle); |
371 | return buf; | 371 | return buf; |
@@ -422,8 +422,8 @@ static int do_update_property(char *buf, size_t bufsize) | |||
422 | { | 422 | { |
423 | struct device_node *np; | 423 | struct device_node *np; |
424 | unsigned char *value; | 424 | unsigned char *value; |
425 | char *name, *end; | 425 | char *name, *end, *next_prop; |
426 | int length; | 426 | int rc, length; |
427 | struct property *newprop, *oldprop; | 427 | struct property *newprop, *oldprop; |
428 | buf = parse_node(buf, bufsize, &np); | 428 | buf = parse_node(buf, bufsize, &np); |
429 | end = buf + bufsize; | 429 | end = buf + bufsize; |
@@ -431,7 +431,8 @@ static int do_update_property(char *buf, size_t bufsize) | |||
431 | if (!np) | 431 | if (!np) |
432 | return -ENODEV; | 432 | return -ENODEV; |
433 | 433 | ||
434 | if (parse_next_property(buf, end, &name, &length, &value) == NULL) | 434 | next_prop = parse_next_property(buf, end, &name, &length, &value); |
435 | if (!next_prop) | ||
435 | return -EINVAL; | 436 | return -EINVAL; |
436 | 437 | ||
437 | newprop = new_property(name, length, value, NULL); | 438 | newprop = new_property(name, length, value, NULL); |
@@ -442,7 +443,34 @@ static int do_update_property(char *buf, size_t bufsize) | |||
442 | if (!oldprop) | 443 | if (!oldprop) |
443 | return -ENODEV; | 444 | return -ENODEV; |
444 | 445 | ||
445 | return prom_update_property(np, newprop, oldprop); | 446 | rc = prom_update_property(np, newprop, oldprop); |
447 | if (rc) | ||
448 | return rc; | ||
449 | |||
450 | /* For memory under the ibm,dynamic-reconfiguration-memory node | ||
451 | * of the device tree, adding and removing memory is just an update | ||
452 | * to the ibm,dynamic-memory property instead of adding/removing a | ||
453 | * memory node in the device tree. For these cases we still need to | ||
454 | * involve the notifier chain. | ||
455 | */ | ||
456 | if (!strcmp(name, "ibm,dynamic-memory")) { | ||
457 | int action; | ||
458 | |||
459 | next_prop = parse_next_property(next_prop, end, &name, | ||
460 | &length, &value); | ||
461 | if (!next_prop) | ||
462 | return -EINVAL; | ||
463 | |||
464 | if (!strcmp(name, "add")) | ||
465 | action = PSERIES_DRCONF_MEM_ADD; | ||
466 | else | ||
467 | action = PSERIES_DRCONF_MEM_REMOVE; | ||
468 | |||
469 | blocking_notifier_call_chain(&pSeries_reconfig_chain, | ||
470 | action, value); | ||
471 | } | ||
472 | |||
473 | return 0; | ||
446 | } | 474 | } |
447 | 475 | ||
448 | /** | 476 | /** |
diff --git a/arch/powerpc/platforms/pseries/rtasd.c b/arch/powerpc/platforms/pseries/rtasd.c index 7d3e2b0bd4d..c9ffd8c225f 100644 --- a/arch/powerpc/platforms/pseries/rtasd.c +++ b/arch/powerpc/platforms/pseries/rtasd.c | |||
@@ -32,7 +32,7 @@ | |||
32 | 32 | ||
33 | static DEFINE_SPINLOCK(rtasd_log_lock); | 33 | static DEFINE_SPINLOCK(rtasd_log_lock); |
34 | 34 | ||
35 | DECLARE_WAIT_QUEUE_HEAD(rtas_log_wait); | 35 | static DECLARE_WAIT_QUEUE_HEAD(rtas_log_wait); |
36 | 36 | ||
37 | static char *rtas_log_buf; | 37 | static char *rtas_log_buf; |
38 | static unsigned long rtas_log_start; | 38 | static unsigned long rtas_log_start; |
@@ -329,7 +329,7 @@ static unsigned int rtas_log_poll(struct file *file, poll_table * wait) | |||
329 | return 0; | 329 | return 0; |
330 | } | 330 | } |
331 | 331 | ||
332 | const struct file_operations proc_rtas_log_operations = { | 332 | static const struct file_operations proc_rtas_log_operations = { |
333 | .read = rtas_log_read, | 333 | .read = rtas_log_read, |
334 | .poll = rtas_log_poll, | 334 | .poll = rtas_log_poll, |
335 | .open = rtas_log_open, | 335 | .open = rtas_log_open, |
diff --git a/arch/powerpc/platforms/pseries/setup.c b/arch/powerpc/platforms/pseries/setup.c index f5d29f5b13c..90beb444e1d 100644 --- a/arch/powerpc/platforms/pseries/setup.c +++ b/arch/powerpc/platforms/pseries/setup.c | |||
@@ -109,7 +109,7 @@ static void __init fwnmi_init(void) | |||
109 | fwnmi_active = 1; | 109 | fwnmi_active = 1; |
110 | } | 110 | } |
111 | 111 | ||
112 | void pseries_8259_cascade(unsigned int irq, struct irq_desc *desc) | 112 | static void pseries_8259_cascade(unsigned int irq, struct irq_desc *desc) |
113 | { | 113 | { |
114 | unsigned int cascade_irq = i8259_irq(); | 114 | unsigned int cascade_irq = i8259_irq(); |
115 | if (cascade_irq != NO_IRQ) | 115 | if (cascade_irq != NO_IRQ) |
@@ -482,7 +482,7 @@ static int pSeries_pci_probe_mode(struct pci_bus *bus) | |||
482 | * possible with power button press. If ibm,power-off-ups token is used | 482 | * possible with power button press. If ibm,power-off-ups token is used |
483 | * it will allow auto poweron after power is restored. | 483 | * it will allow auto poweron after power is restored. |
484 | */ | 484 | */ |
485 | void pSeries_power_off(void) | 485 | static void pSeries_power_off(void) |
486 | { | 486 | { |
487 | int rc; | 487 | int rc; |
488 | int rtas_poweroff_ups_token = rtas_token("ibm,power-off-ups"); | 488 | int rtas_poweroff_ups_token = rtas_token("ibm,power-off-ups"); |
diff --git a/arch/powerpc/platforms/pseries/xics.c b/arch/powerpc/platforms/pseries/xics.c index ebebc28fe89..0fc830f576f 100644 --- a/arch/powerpc/platforms/pseries/xics.c +++ b/arch/powerpc/platforms/pseries/xics.c | |||
@@ -383,13 +383,11 @@ static irqreturn_t xics_ipi_dispatch(int cpu) | |||
383 | mb(); | 383 | mb(); |
384 | smp_message_recv(PPC_MSG_RESCHEDULE); | 384 | smp_message_recv(PPC_MSG_RESCHEDULE); |
385 | } | 385 | } |
386 | #if 0 | 386 | if (test_and_clear_bit(PPC_MSG_CALL_FUNC_SINGLE, |
387 | if (test_and_clear_bit(PPC_MSG_MIGRATE_TASK, | ||
388 | &xics_ipi_message[cpu].value)) { | 387 | &xics_ipi_message[cpu].value)) { |
389 | mb(); | 388 | mb(); |
390 | smp_message_recv(PPC_MSG_MIGRATE_TASK); | 389 | smp_message_recv(PPC_MSG_CALL_FUNC_SINGLE); |
391 | } | 390 | } |
392 | #endif | ||
393 | #if defined(CONFIG_DEBUGGER) || defined(CONFIG_KEXEC) | 391 | #if defined(CONFIG_DEBUGGER) || defined(CONFIG_KEXEC) |
394 | if (test_and_clear_bit(PPC_MSG_DEBUGGER_BREAK, | 392 | if (test_and_clear_bit(PPC_MSG_DEBUGGER_BREAK, |
395 | &xics_ipi_message[cpu].value)) { | 393 | &xics_ipi_message[cpu].value)) { |