diff options
| author | Linus Torvalds <torvalds@g5.osdl.org> | 2006-04-02 15:48:36 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-04-02 15:48:36 -0400 |
| commit | f900e5824a44ab65437b4f7e7c610b72f94820c5 (patch) | |
| tree | 770015a763e4c87e807e00a467a4ca602f242363 | |
| parent | 23344cb341902f4e3431d8137dca93d6e186d054 (diff) | |
| parent | 856d08ec46c5ecf3df13827c492fb6998fdc8322 (diff) | |
Merge master.kernel.org:/pub/scm/linux/kernel/git/paulus/powerpc
* master.kernel.org:/pub/scm/linux/kernel/git/paulus/powerpc:
[PATCH] powerpc: iSeries needs slb_initialize to be called
powerpc: hook up the splice syscall
[PATCH] powerpc/cell: compile fixes
[PATCH] powerpc: trivial spelling fixes in fault.c
[PATCH] powerpc/pseries: EEH Cleanup
[PATCH] powerpc/pseries: misc lparcfg fixes
[PATCH] powerpc/pseries: fix device name printing, again.
[PATCH] powerpc: Extends HCALL interface for InfiniBand usage
[PATCH] powerpc/pseries: Change H_StudlyCaps to H_SHOUTING_CAPS
[PATCH] powerpc/pseries: print message if EEH recovery fails
[PATCH] powerpc/pseries: mutex lock to serialize EEH event processing
powerpc: converted embedded platforms to use new define_machine support
powerpc: merge machine_check_exception between ppc32 & ppc64
25 files changed, 440 insertions, 247 deletions
diff --git a/arch/powerpc/kernel/lparcfg.c b/arch/powerpc/kernel/lparcfg.c index 1b73508ecb2b..2cbde865d4f5 100644 --- a/arch/powerpc/kernel/lparcfg.c +++ b/arch/powerpc/kernel/lparcfg.c | |||
| @@ -37,7 +37,7 @@ | |||
| 37 | #include <asm/prom.h> | 37 | #include <asm/prom.h> |
| 38 | #include <asm/vdso_datapage.h> | 38 | #include <asm/vdso_datapage.h> |
| 39 | 39 | ||
| 40 | #define MODULE_VERS "1.6" | 40 | #define MODULE_VERS "1.7" |
| 41 | #define MODULE_NAME "lparcfg" | 41 | #define MODULE_NAME "lparcfg" |
| 42 | 42 | ||
| 43 | /* #define LPARCFG_DEBUG */ | 43 | /* #define LPARCFG_DEBUG */ |
| @@ -149,17 +149,17 @@ static void log_plpar_hcall_return(unsigned long rc, char *tag) | |||
| 149 | if (rc == 0) /* success, return */ | 149 | if (rc == 0) /* success, return */ |
| 150 | return; | 150 | return; |
| 151 | /* check for null tag ? */ | 151 | /* check for null tag ? */ |
| 152 | if (rc == H_Hardware) | 152 | if (rc == H_HARDWARE) |
| 153 | printk(KERN_INFO | 153 | printk(KERN_INFO |
| 154 | "plpar-hcall (%s) failed with hardware fault\n", tag); | 154 | "plpar-hcall (%s) failed with hardware fault\n", tag); |
| 155 | else if (rc == H_Function) | 155 | else if (rc == H_FUNCTION) |
| 156 | printk(KERN_INFO | 156 | printk(KERN_INFO |
| 157 | "plpar-hcall (%s) failed; function not allowed\n", tag); | 157 | "plpar-hcall (%s) failed; function not allowed\n", tag); |
| 158 | else if (rc == H_Authority) | 158 | else if (rc == H_AUTHORITY) |
| 159 | printk(KERN_INFO | 159 | printk(KERN_INFO |
| 160 | "plpar-hcall (%s) failed; not authorized to this function\n", | 160 | "plpar-hcall (%s) failed; not authorized to this" |
| 161 | tag); | 161 | " function\n", tag); |
| 162 | else if (rc == H_Parameter) | 162 | else if (rc == H_PARAMETER) |
| 163 | printk(KERN_INFO "plpar-hcall (%s) failed; Bad parameter(s)\n", | 163 | printk(KERN_INFO "plpar-hcall (%s) failed; Bad parameter(s)\n", |
| 164 | tag); | 164 | tag); |
| 165 | else | 165 | else |
| @@ -209,7 +209,7 @@ static void h_pic(unsigned long *pool_idle_time, unsigned long *num_procs) | |||
| 209 | unsigned long dummy; | 209 | unsigned long dummy; |
| 210 | rc = plpar_hcall(H_PIC, 0, 0, 0, 0, pool_idle_time, num_procs, &dummy); | 210 | rc = plpar_hcall(H_PIC, 0, 0, 0, 0, pool_idle_time, num_procs, &dummy); |
| 211 | 211 | ||
| 212 | if (rc != H_Authority) | 212 | if (rc != H_AUTHORITY) |
| 213 | log_plpar_hcall_return(rc, "H_PIC"); | 213 | log_plpar_hcall_return(rc, "H_PIC"); |
| 214 | } | 214 | } |
| 215 | 215 | ||
| @@ -242,7 +242,7 @@ static void parse_system_parameter_string(struct seq_file *m) | |||
| 242 | { | 242 | { |
| 243 | int call_status; | 243 | int call_status; |
| 244 | 244 | ||
| 245 | char *local_buffer = kmalloc(SPLPAR_MAXLENGTH, GFP_KERNEL); | 245 | unsigned char *local_buffer = kmalloc(SPLPAR_MAXLENGTH, GFP_KERNEL); |
| 246 | if (!local_buffer) { | 246 | if (!local_buffer) { |
| 247 | printk(KERN_ERR "%s %s kmalloc failure at line %d \n", | 247 | printk(KERN_ERR "%s %s kmalloc failure at line %d \n", |
| 248 | __FILE__, __FUNCTION__, __LINE__); | 248 | __FILE__, __FUNCTION__, __LINE__); |
| @@ -254,7 +254,8 @@ static void parse_system_parameter_string(struct seq_file *m) | |||
| 254 | call_status = rtas_call(rtas_token("ibm,get-system-parameter"), 3, 1, | 254 | call_status = rtas_call(rtas_token("ibm,get-system-parameter"), 3, 1, |
| 255 | NULL, | 255 | NULL, |
| 256 | SPLPAR_CHARACTERISTICS_TOKEN, | 256 | SPLPAR_CHARACTERISTICS_TOKEN, |
| 257 | __pa(rtas_data_buf)); | 257 | __pa(rtas_data_buf), |
| 258 | RTAS_DATA_BUF_SIZE); | ||
| 258 | memcpy(local_buffer, rtas_data_buf, SPLPAR_MAXLENGTH); | 259 | memcpy(local_buffer, rtas_data_buf, SPLPAR_MAXLENGTH); |
| 259 | spin_unlock(&rtas_data_buf_lock); | 260 | spin_unlock(&rtas_data_buf_lock); |
| 260 | 261 | ||
| @@ -275,7 +276,7 @@ static void parse_system_parameter_string(struct seq_file *m) | |||
| 275 | #ifdef LPARCFG_DEBUG | 276 | #ifdef LPARCFG_DEBUG |
| 276 | printk(KERN_INFO "success calling get-system-parameter \n"); | 277 | printk(KERN_INFO "success calling get-system-parameter \n"); |
| 277 | #endif | 278 | #endif |
| 278 | splpar_strlen = local_buffer[0] * 16 + local_buffer[1]; | 279 | splpar_strlen = local_buffer[0] * 256 + local_buffer[1]; |
| 279 | local_buffer += 2; /* step over strlen value */ | 280 | local_buffer += 2; /* step over strlen value */ |
| 280 | 281 | ||
| 281 | memset(workbuffer, 0, SPLPAR_MAXLENGTH); | 282 | memset(workbuffer, 0, SPLPAR_MAXLENGTH); |
| @@ -529,13 +530,13 @@ static ssize_t lparcfg_write(struct file *file, const char __user * buf, | |||
| 529 | retval = plpar_hcall_norets(H_SET_PPP, *new_entitled_ptr, | 530 | retval = plpar_hcall_norets(H_SET_PPP, *new_entitled_ptr, |
| 530 | *new_weight_ptr); | 531 | *new_weight_ptr); |
| 531 | 532 | ||
| 532 | if (retval == H_Success || retval == H_Constrained) { | 533 | if (retval == H_SUCCESS || retval == H_CONSTRAINED) { |
| 533 | retval = count; | 534 | retval = count; |
| 534 | } else if (retval == H_Busy) { | 535 | } else if (retval == H_BUSY) { |
| 535 | retval = -EBUSY; | 536 | retval = -EBUSY; |
| 536 | } else if (retval == H_Hardware) { | 537 | } else if (retval == H_HARDWARE) { |
| 537 | retval = -EIO; | 538 | retval = -EIO; |
| 538 | } else if (retval == H_Parameter) { | 539 | } else if (retval == H_PARAMETER) { |
| 539 | retval = -EINVAL; | 540 | retval = -EINVAL; |
| 540 | } else { | 541 | } else { |
| 541 | printk(KERN_WARNING "%s: received unknown hv return code %ld", | 542 | printk(KERN_WARNING "%s: received unknown hv return code %ld", |
diff --git a/arch/powerpc/kernel/rtas.c b/arch/powerpc/kernel/rtas.c index 06636c927a7e..0112318213ab 100644 --- a/arch/powerpc/kernel/rtas.c +++ b/arch/powerpc/kernel/rtas.c | |||
| @@ -578,18 +578,18 @@ static void rtas_percpu_suspend_me(void *info) | |||
| 578 | * We use "waiting" to indicate our state. As long | 578 | * We use "waiting" to indicate our state. As long |
| 579 | * as it is >0, we are still trying to all join up. | 579 | * as it is >0, we are still trying to all join up. |
| 580 | * If it goes to 0, we have successfully joined up and | 580 | * If it goes to 0, we have successfully joined up and |
| 581 | * one thread got H_Continue. If any error happens, | 581 | * one thread got H_CONTINUE. If any error happens, |
| 582 | * we set it to <0. | 582 | * we set it to <0. |
| 583 | */ | 583 | */ |
| 584 | local_irq_save(flags); | 584 | local_irq_save(flags); |
| 585 | do { | 585 | do { |
| 586 | rc = plpar_hcall_norets(H_JOIN); | 586 | rc = plpar_hcall_norets(H_JOIN); |
| 587 | smp_rmb(); | 587 | smp_rmb(); |
| 588 | } while (rc == H_Success && data->waiting > 0); | 588 | } while (rc == H_SUCCESS && data->waiting > 0); |
| 589 | if (rc == H_Success) | 589 | if (rc == H_SUCCESS) |
| 590 | goto out; | 590 | goto out; |
| 591 | 591 | ||
| 592 | if (rc == H_Continue) { | 592 | if (rc == H_CONTINUE) { |
| 593 | data->waiting = 0; | 593 | data->waiting = 0; |
| 594 | data->args->args[data->args->nargs] = | 594 | data->args->args[data->args->nargs] = |
| 595 | rtas_call(ibm_suspend_me_token, 0, 1, NULL); | 595 | rtas_call(ibm_suspend_me_token, 0, 1, NULL); |
| @@ -597,7 +597,7 @@ static void rtas_percpu_suspend_me(void *info) | |||
| 597 | plpar_hcall_norets(H_PROD,i); | 597 | plpar_hcall_norets(H_PROD,i); |
| 598 | } else { | 598 | } else { |
| 599 | data->waiting = -EBUSY; | 599 | data->waiting = -EBUSY; |
| 600 | printk(KERN_ERR "Error on H_Join hypervisor call\n"); | 600 | printk(KERN_ERR "Error on H_JOIN hypervisor call\n"); |
| 601 | } | 601 | } |
| 602 | 602 | ||
| 603 | out: | 603 | out: |
| @@ -624,7 +624,7 @@ static int rtas_ibm_suspend_me(struct rtas_args *args) | |||
| 624 | printk(KERN_ERR "Error doing global join\n"); | 624 | printk(KERN_ERR "Error doing global join\n"); |
| 625 | 625 | ||
| 626 | /* Prod each CPU. This won't hurt, and will wake | 626 | /* Prod each CPU. This won't hurt, and will wake |
| 627 | * anyone we successfully put to sleep with H_Join | 627 | * anyone we successfully put to sleep with H_JOIN. |
| 628 | */ | 628 | */ |
| 629 | for_each_possible_cpu(i) | 629 | for_each_possible_cpu(i) |
| 630 | plpar_hcall_norets(H_PROD, i); | 630 | plpar_hcall_norets(H_PROD, i); |
diff --git a/arch/powerpc/kernel/setup_32.c b/arch/powerpc/kernel/setup_32.c index a72bf5dceeee..69ac25701344 100644 --- a/arch/powerpc/kernel/setup_32.c +++ b/arch/powerpc/kernel/setup_32.c | |||
| @@ -50,7 +50,6 @@ | |||
| 50 | #include <asm/kgdb.h> | 50 | #include <asm/kgdb.h> |
| 51 | #endif | 51 | #endif |
| 52 | 52 | ||
| 53 | extern void platform_init(void); | ||
| 54 | extern void bootx_init(unsigned long r4, unsigned long phys); | 53 | extern void bootx_init(unsigned long r4, unsigned long phys); |
| 55 | 54 | ||
| 56 | boot_infos_t *boot_infos; | 55 | boot_infos_t *boot_infos; |
| @@ -138,12 +137,7 @@ void __init machine_init(unsigned long dt_ptr, unsigned long phys) | |||
| 138 | strlcpy(cmd_line, CONFIG_CMDLINE, sizeof(cmd_line)); | 137 | strlcpy(cmd_line, CONFIG_CMDLINE, sizeof(cmd_line)); |
| 139 | #endif /* CONFIG_CMDLINE */ | 138 | #endif /* CONFIG_CMDLINE */ |
| 140 | 139 | ||
| 141 | #ifdef CONFIG_PPC_MULTIPLATFORM | ||
| 142 | probe_machine(); | 140 | probe_machine(); |
| 143 | #else | ||
| 144 | /* Base init based on machine type. Obsoloete, please kill ! */ | ||
| 145 | platform_init(); | ||
| 146 | #endif | ||
| 147 | 141 | ||
| 148 | #ifdef CONFIG_6xx | 142 | #ifdef CONFIG_6xx |
| 149 | if (cpu_has_feature(CPU_FTR_CAN_DOZE) || | 143 | if (cpu_has_feature(CPU_FTR_CAN_DOZE) || |
diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c index 59aa92cd6fa4..13e91c4d70a8 100644 --- a/arch/powerpc/kernel/setup_64.c +++ b/arch/powerpc/kernel/setup_64.c | |||
| @@ -215,12 +215,10 @@ void __init early_setup(unsigned long dt_ptr) | |||
| 215 | /* | 215 | /* |
| 216 | * Initialize stab / SLB management except on iSeries | 216 | * Initialize stab / SLB management except on iSeries |
| 217 | */ | 217 | */ |
| 218 | if (!firmware_has_feature(FW_FEATURE_ISERIES)) { | 218 | if (cpu_has_feature(CPU_FTR_SLB)) |
| 219 | if (cpu_has_feature(CPU_FTR_SLB)) | 219 | slb_initialize(); |
| 220 | slb_initialize(); | 220 | else if (!firmware_has_feature(FW_FEATURE_ISERIES)) |
| 221 | else | 221 | stab_initialize(get_paca()->stab_real); |
| 222 | stab_initialize(get_paca()->stab_real); | ||
| 223 | } | ||
| 224 | 222 | ||
| 225 | DBG(" <- early_setup()\n"); | 223 | DBG(" <- early_setup()\n"); |
| 226 | } | 224 | } |
diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c index 4cbde211eb69..064a52564692 100644 --- a/arch/powerpc/kernel/traps.c +++ b/arch/powerpc/kernel/traps.c | |||
| @@ -228,7 +228,7 @@ void system_reset_exception(struct pt_regs *regs) | |||
| 228 | */ | 228 | */ |
| 229 | static inline int check_io_access(struct pt_regs *regs) | 229 | static inline int check_io_access(struct pt_regs *regs) |
| 230 | { | 230 | { |
| 231 | #ifdef CONFIG_PPC_PMAC | 231 | #if defined(CONFIG_PPC_PMAC) && defined(CONFIG_PPC32) |
| 232 | unsigned long msr = regs->msr; | 232 | unsigned long msr = regs->msr; |
| 233 | const struct exception_table_entry *entry; | 233 | const struct exception_table_entry *entry; |
| 234 | unsigned int *nip = (unsigned int *)regs->nip; | 234 | unsigned int *nip = (unsigned int *)regs->nip; |
| @@ -261,7 +261,7 @@ static inline int check_io_access(struct pt_regs *regs) | |||
| 261 | return 1; | 261 | return 1; |
| 262 | } | 262 | } |
| 263 | } | 263 | } |
| 264 | #endif /* CONFIG_PPC_PMAC */ | 264 | #endif /* CONFIG_PPC_PMAC && CONFIG_PPC32 */ |
| 265 | return 0; | 265 | return 0; |
| 266 | } | 266 | } |
| 267 | 267 | ||
| @@ -308,8 +308,8 @@ platform_machine_check(struct pt_regs *regs) | |||
| 308 | 308 | ||
| 309 | void machine_check_exception(struct pt_regs *regs) | 309 | void machine_check_exception(struct pt_regs *regs) |
| 310 | { | 310 | { |
| 311 | #ifdef CONFIG_PPC64 | ||
| 312 | int recover = 0; | 311 | int recover = 0; |
| 312 | unsigned long reason = get_mc_reason(regs); | ||
| 313 | 313 | ||
| 314 | /* See if any machine dependent calls */ | 314 | /* See if any machine dependent calls */ |
| 315 | if (ppc_md.machine_check_exception) | 315 | if (ppc_md.machine_check_exception) |
| @@ -317,8 +317,6 @@ void machine_check_exception(struct pt_regs *regs) | |||
| 317 | 317 | ||
| 318 | if (recover) | 318 | if (recover) |
| 319 | return; | 319 | return; |
| 320 | #else | ||
| 321 | unsigned long reason = get_mc_reason(regs); | ||
| 322 | 320 | ||
| 323 | if (user_mode(regs)) { | 321 | if (user_mode(regs)) { |
| 324 | regs->msr |= MSR_RI; | 322 | regs->msr |= MSR_RI; |
| @@ -462,7 +460,6 @@ void machine_check_exception(struct pt_regs *regs) | |||
| 462 | * additional info, e.g. bus error registers. | 460 | * additional info, e.g. bus error registers. |
| 463 | */ | 461 | */ |
| 464 | platform_machine_check(regs); | 462 | platform_machine_check(regs); |
| 465 | #endif /* CONFIG_PPC64 */ | ||
| 466 | 463 | ||
| 467 | if (debugger_fault_handler(regs)) | 464 | if (debugger_fault_handler(regs)) |
| 468 | return; | 465 | return; |
diff --git a/arch/powerpc/mm/fault.c b/arch/powerpc/mm/fault.c index 5aea0909a5ec..fdbba4206d59 100644 --- a/arch/powerpc/mm/fault.c +++ b/arch/powerpc/mm/fault.c | |||
| @@ -177,15 +177,15 @@ int __kprobes do_page_fault(struct pt_regs *regs, unsigned long address, | |||
| 177 | 177 | ||
| 178 | /* When running in the kernel we expect faults to occur only to | 178 | /* When running in the kernel we expect faults to occur only to |
| 179 | * addresses in user space. All other faults represent errors in the | 179 | * addresses in user space. All other faults represent errors in the |
| 180 | * kernel and should generate an OOPS. Unfortunatly, in the case of an | 180 | * kernel and should generate an OOPS. Unfortunately, in the case of an |
| 181 | * erroneous fault occuring in a code path which already holds mmap_sem | 181 | * erroneous fault occurring in a code path which already holds mmap_sem |
| 182 | * we will deadlock attempting to validate the fault against the | 182 | * we will deadlock attempting to validate the fault against the |
| 183 | * address space. Luckily the kernel only validly references user | 183 | * address space. Luckily the kernel only validly references user |
| 184 | * space from well defined areas of code, which are listed in the | 184 | * space from well defined areas of code, which are listed in the |
| 185 | * exceptions table. | 185 | * exceptions table. |
| 186 | * | 186 | * |
| 187 | * As the vast majority of faults will be valid we will only perform | 187 | * As the vast majority of faults will be valid we will only perform |
| 188 | * the source reference check when there is a possibilty of a deadlock. | 188 | * the source reference check when there is a possibility of a deadlock. |
| 189 | * Attempt to lock the address space, if we cannot we then validate the | 189 | * Attempt to lock the address space, if we cannot we then validate the |
| 190 | * source. If this is invalid we can skip the address space check, | 190 | * source. If this is invalid we can skip the address space check, |
| 191 | * thus avoiding the deadlock. | 191 | * thus avoiding the deadlock. |
diff --git a/arch/powerpc/platforms/83xx/mpc834x_sys.c b/arch/powerpc/platforms/83xx/mpc834x_sys.c index 7c18b4cd5db4..7e789d2420ba 100644 --- a/arch/powerpc/platforms/83xx/mpc834x_sys.c +++ b/arch/powerpc/platforms/83xx/mpc834x_sys.c | |||
| @@ -158,25 +158,25 @@ static int __init mpc834x_rtc_hookup(void) | |||
| 158 | late_initcall(mpc834x_rtc_hookup); | 158 | late_initcall(mpc834x_rtc_hookup); |
| 159 | #endif | 159 | #endif |
| 160 | 160 | ||
| 161 | void __init platform_init(void) | 161 | /* |
| 162 | * Called very early, MMU is off, device-tree isn't unflattened | ||
| 163 | */ | ||
| 164 | static int __init mpc834x_sys_probe(void) | ||
| 162 | { | 165 | { |
| 163 | /* setup the PowerPC module struct */ | 166 | /* We always match for now, eventually we should look at the flat |
| 164 | ppc_md.setup_arch = mpc834x_sys_setup_arch; | 167 | dev tree to ensure this is the board we are suppose to run on |
| 165 | 168 | */ | |
| 166 | ppc_md.init_IRQ = mpc834x_sys_init_IRQ; | 169 | return 1; |
| 167 | ppc_md.get_irq = ipic_get_irq; | ||
| 168 | |||
| 169 | ppc_md.restart = mpc83xx_restart; | ||
| 170 | |||
| 171 | ppc_md.time_init = mpc83xx_time_init; | ||
| 172 | ppc_md.set_rtc_time = NULL; | ||
| 173 | ppc_md.get_rtc_time = NULL; | ||
| 174 | ppc_md.calibrate_decr = generic_calibrate_decr; | ||
| 175 | |||
| 176 | ppc_md.progress = udbg_progress; | ||
| 177 | |||
| 178 | if (ppc_md.progress) | ||
| 179 | ppc_md.progress("mpc834x_sys_init(): exit", 0); | ||
| 180 | |||
| 181 | return; | ||
| 182 | } | 170 | } |
| 171 | |||
| 172 | define_machine(mpc834x_sys) { | ||
| 173 | .name = "MPC834x SYS", | ||
| 174 | .probe = mpc834x_sys_probe, | ||
| 175 | .setup_arch = mpc834x_sys_setup_arch, | ||
| 176 | .init_IRQ = mpc834x_sys_init_IRQ, | ||
| 177 | .get_irq = ipic_get_irq, | ||
| 178 | .restart = mpc83xx_restart, | ||
| 179 | .time_init = mpc83xx_time_init, | ||
| 180 | .calibrate_decr = generic_calibrate_decr, | ||
| 181 | .progress = udbg_progress, | ||
| 182 | }; | ||
diff --git a/arch/powerpc/platforms/85xx/mpc85xx_ads.c b/arch/powerpc/platforms/85xx/mpc85xx_ads.c index b7821dbae00d..5eeff370f5fc 100644 --- a/arch/powerpc/platforms/85xx/mpc85xx_ads.c +++ b/arch/powerpc/platforms/85xx/mpc85xx_ads.c | |||
| @@ -220,25 +220,25 @@ void mpc85xx_ads_show_cpuinfo(struct seq_file *m) | |||
| 220 | seq_printf(m, "Memory\t\t: %d MB\n", memsize / (1024 * 1024)); | 220 | seq_printf(m, "Memory\t\t: %d MB\n", memsize / (1024 * 1024)); |
| 221 | } | 221 | } |
| 222 | 222 | ||
| 223 | void __init platform_init(void) | 223 | /* |
| 224 | * Called very early, device-tree isn't unflattened | ||
| 225 | */ | ||
| 226 | static int __init mpc85xx_ads_probe(void) | ||
| 224 | { | 227 | { |
| 225 | ppc_md.setup_arch = mpc85xx_ads_setup_arch; | 228 | /* We always match for now, eventually we should look at the flat |
| 226 | ppc_md.show_cpuinfo = mpc85xx_ads_show_cpuinfo; | 229 | dev tree to ensure this is the board we are suppose to run on |
| 227 | 230 | */ | |
| 228 | ppc_md.init_IRQ = mpc85xx_ads_pic_init; | 231 | return 1; |
| 229 | ppc_md.get_irq = mpic_get_irq; | ||
| 230 | |||
| 231 | ppc_md.restart = mpc85xx_restart; | ||
| 232 | ppc_md.power_off = NULL; | ||
| 233 | ppc_md.halt = NULL; | ||
| 234 | |||
| 235 | ppc_md.time_init = NULL; | ||
| 236 | ppc_md.set_rtc_time = NULL; | ||
| 237 | ppc_md.get_rtc_time = NULL; | ||
| 238 | ppc_md.calibrate_decr = generic_calibrate_decr; | ||
| 239 | |||
| 240 | ppc_md.progress = udbg_progress; | ||
| 241 | |||
| 242 | if (ppc_md.progress) | ||
| 243 | ppc_md.progress("mpc85xx_ads platform_init(): exit", 0); | ||
| 244 | } | 232 | } |
| 233 | |||
| 234 | define_machine(mpc85xx_ads) { | ||
| 235 | .name = "MPC85xx ADS", | ||
| 236 | .probe = mpc85xx_ads_probe, | ||
| 237 | .setup_arch = mpc85xx_ads_setup_arch, | ||
| 238 | .init_IRQ = mpc85xx_ads_pic_init, | ||
| 239 | .show_cpuinfo = mpc85xx_ads_show_cpuinfo, | ||
| 240 | .get_irq = mpic_get_irq, | ||
| 241 | .restart = mpc85xx_restart, | ||
| 242 | .calibrate_decr = generic_calibrate_decr, | ||
| 243 | .progress = udbg_progress, | ||
| 244 | }; | ||
diff --git a/arch/powerpc/platforms/cell/spu_callbacks.c b/arch/powerpc/platforms/cell/spu_callbacks.c index 3a4245c926ad..6594bec73882 100644 --- a/arch/powerpc/platforms/cell/spu_callbacks.c +++ b/arch/powerpc/platforms/cell/spu_callbacks.c | |||
| @@ -316,6 +316,7 @@ void *spu_syscall_table[] = { | |||
| 316 | [__NR_pselect6] sys_ni_syscall, /* sys_pselect */ | 316 | [__NR_pselect6] sys_ni_syscall, /* sys_pselect */ |
| 317 | [__NR_ppoll] sys_ni_syscall, /* sys_ppoll */ | 317 | [__NR_ppoll] sys_ni_syscall, /* sys_ppoll */ |
| 318 | [__NR_unshare] sys_unshare, | 318 | [__NR_unshare] sys_unshare, |
| 319 | [__NR_splice] sys_splice, | ||
| 319 | }; | 320 | }; |
| 320 | 321 | ||
| 321 | long spu_sys_callback(struct spu_syscall_block *s) | 322 | long spu_sys_callback(struct spu_syscall_block *s) |
diff --git a/arch/powerpc/platforms/cell/spufs/run.c b/arch/powerpc/platforms/cell/spufs/run.c index c04e078c0fe5..483c8b76232c 100644 --- a/arch/powerpc/platforms/cell/spufs/run.c +++ b/arch/powerpc/platforms/cell/spufs/run.c | |||
| @@ -2,6 +2,7 @@ | |||
| 2 | #include <linux/ptrace.h> | 2 | #include <linux/ptrace.h> |
| 3 | 3 | ||
| 4 | #include <asm/spu.h> | 4 | #include <asm/spu.h> |
| 5 | #include <asm/unistd.h> | ||
| 5 | 6 | ||
| 6 | #include "spufs.h" | 7 | #include "spufs.h" |
| 7 | 8 | ||
diff --git a/arch/powerpc/platforms/pseries/eeh.c b/arch/powerpc/platforms/pseries/eeh.c index 9b2b1cb117b3..780fb27a0099 100644 --- a/arch/powerpc/platforms/pseries/eeh.c +++ b/arch/powerpc/platforms/pseries/eeh.c | |||
| @@ -865,7 +865,7 @@ void __init eeh_init(void) | |||
| 865 | * on the CEC architecture, type of the device, on earlier boot | 865 | * on the CEC architecture, type of the device, on earlier boot |
| 866 | * command-line arguments & etc. | 866 | * command-line arguments & etc. |
| 867 | */ | 867 | */ |
| 868 | void eeh_add_device_early(struct device_node *dn) | 868 | static void eeh_add_device_early(struct device_node *dn) |
| 869 | { | 869 | { |
| 870 | struct pci_controller *phb; | 870 | struct pci_controller *phb; |
| 871 | struct eeh_early_enable_info info; | 871 | struct eeh_early_enable_info info; |
| @@ -882,7 +882,6 @@ void eeh_add_device_early(struct device_node *dn) | |||
| 882 | info.buid_lo = BUID_LO(phb->buid); | 882 | info.buid_lo = BUID_LO(phb->buid); |
| 883 | early_enable_eeh(dn, &info); | 883 | early_enable_eeh(dn, &info); |
| 884 | } | 884 | } |
| 885 | EXPORT_SYMBOL_GPL(eeh_add_device_early); | ||
| 886 | 885 | ||
| 887 | void eeh_add_device_tree_early(struct device_node *dn) | 886 | void eeh_add_device_tree_early(struct device_node *dn) |
| 888 | { | 887 | { |
| @@ -893,20 +892,6 @@ void eeh_add_device_tree_early(struct device_node *dn) | |||
| 893 | } | 892 | } |
| 894 | EXPORT_SYMBOL_GPL(eeh_add_device_tree_early); | 893 | EXPORT_SYMBOL_GPL(eeh_add_device_tree_early); |
| 895 | 894 | ||
| 896 | void eeh_add_device_tree_late(struct pci_bus *bus) | ||
| 897 | { | ||
| 898 | struct pci_dev *dev; | ||
| 899 | |||
| 900 | list_for_each_entry(dev, &bus->devices, bus_list) { | ||
| 901 | eeh_add_device_late(dev); | ||
| 902 | if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE) { | ||
| 903 | struct pci_bus *subbus = dev->subordinate; | ||
| 904 | if (subbus) | ||
| 905 | eeh_add_device_tree_late(subbus); | ||
| 906 | } | ||
| 907 | } | ||
| 908 | } | ||
| 909 | |||
| 910 | /** | 895 | /** |
| 911 | * eeh_add_device_late - perform EEH initialization for the indicated pci device | 896 | * eeh_add_device_late - perform EEH initialization for the indicated pci device |
| 912 | * @dev: pci device for which to set up EEH | 897 | * @dev: pci device for which to set up EEH |
| @@ -914,7 +899,7 @@ void eeh_add_device_tree_late(struct pci_bus *bus) | |||
| 914 | * This routine must be used to complete EEH initialization for PCI | 899 | * This routine must be used to complete EEH initialization for PCI |
| 915 | * devices that were added after system boot (e.g. hotplug, dlpar). | 900 | * devices that were added after system boot (e.g. hotplug, dlpar). |
| 916 | */ | 901 | */ |
| 917 | void eeh_add_device_late(struct pci_dev *dev) | 902 | static void eeh_add_device_late(struct pci_dev *dev) |
| 918 | { | 903 | { |
| 919 | struct device_node *dn; | 904 | struct device_node *dn; |
| 920 | struct pci_dn *pdn; | 905 | struct pci_dn *pdn; |
| @@ -933,16 +918,33 @@ void eeh_add_device_late(struct pci_dev *dev) | |||
| 933 | 918 | ||
| 934 | pci_addr_cache_insert_device (dev); | 919 | pci_addr_cache_insert_device (dev); |
| 935 | } | 920 | } |
| 936 | EXPORT_SYMBOL_GPL(eeh_add_device_late); | 921 | |
| 922 | void eeh_add_device_tree_late(struct pci_bus *bus) | ||
| 923 | { | ||
| 924 | struct pci_dev *dev; | ||
| 925 | |||
| 926 | list_for_each_entry(dev, &bus->devices, bus_list) { | ||
| 927 | eeh_add_device_late(dev); | ||
| 928 | if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE) { | ||
| 929 | struct pci_bus *subbus = dev->subordinate; | ||
| 930 | if (subbus) | ||
| 931 | eeh_add_device_tree_late(subbus); | ||
| 932 | } | ||
| 933 | } | ||
| 934 | } | ||
| 935 | EXPORT_SYMBOL_GPL(eeh_add_device_tree_late); | ||
| 937 | 936 | ||
| 938 | /** | 937 | /** |
| 939 | * eeh_remove_device - undo EEH setup for the indicated pci device | 938 | * eeh_remove_device - undo EEH setup for the indicated pci device |
| 940 | * @dev: pci device to be removed | 939 | * @dev: pci device to be removed |
| 941 | * | 940 | * |
| 942 | * This routine should be when a device is removed from a running | 941 | * This routine should be called when a device is removed from |
| 943 | * system (e.g. by hotplug or dlpar). | 942 | * a running system (e.g. by hotplug or dlpar). It unregisters |
| 943 | * the PCI device from the EEH subsystem. I/O errors affecting | ||
| 944 | * this device will no longer be detected after this call; thus, | ||
| 945 | * i/o errors affecting this slot may leave this device unusable. | ||
| 944 | */ | 946 | */ |
| 945 | void eeh_remove_device(struct pci_dev *dev) | 947 | static void eeh_remove_device(struct pci_dev *dev) |
| 946 | { | 948 | { |
| 947 | struct device_node *dn; | 949 | struct device_node *dn; |
| 948 | if (!dev || !eeh_subsystem_enabled) | 950 | if (!dev || !eeh_subsystem_enabled) |
| @@ -958,21 +960,17 @@ void eeh_remove_device(struct pci_dev *dev) | |||
| 958 | PCI_DN(dn)->pcidev = NULL; | 960 | PCI_DN(dn)->pcidev = NULL; |
| 959 | pci_dev_put (dev); | 961 | pci_dev_put (dev); |
| 960 | } | 962 | } |
| 961 | EXPORT_SYMBOL_GPL(eeh_remove_device); | ||
| 962 | 963 | ||
| 963 | void eeh_remove_bus_device(struct pci_dev *dev) | 964 | void eeh_remove_bus_device(struct pci_dev *dev) |
| 964 | { | 965 | { |
| 966 | struct pci_bus *bus = dev->subordinate; | ||
| 967 | struct pci_dev *child, *tmp; | ||
| 968 | |||
| 965 | eeh_remove_device(dev); | 969 | eeh_remove_device(dev); |
| 966 | if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE) { | 970 | |
| 967 | struct pci_bus *bus = dev->subordinate; | 971 | if (bus && dev->hdr_type == PCI_HEADER_TYPE_BRIDGE) { |
| 968 | struct list_head *ln; | 972 | list_for_each_entry_safe(child, tmp, &bus->devices, bus_list) |
| 969 | if (!bus) | 973 | eeh_remove_bus_device(child); |
| 970 | return; | ||
| 971 | for (ln = bus->devices.next; ln != &bus->devices; ln = ln->next) { | ||
| 972 | struct pci_dev *pdev = pci_dev_b(ln); | ||
| 973 | if (pdev) | ||
| 974 | eeh_remove_bus_device(pdev); | ||
| 975 | } | ||
| 976 | } | 974 | } |
| 977 | } | 975 | } |
| 978 | EXPORT_SYMBOL_GPL(eeh_remove_bus_device); | 976 | EXPORT_SYMBOL_GPL(eeh_remove_bus_device); |
diff --git a/arch/powerpc/platforms/pseries/eeh_driver.c b/arch/powerpc/platforms/pseries/eeh_driver.c index cc2495a0cdd5..1fba695e32e8 100644 --- a/arch/powerpc/platforms/pseries/eeh_driver.c +++ b/arch/powerpc/platforms/pseries/eeh_driver.c | |||
| @@ -293,15 +293,16 @@ void handle_eeh_events (struct eeh_event *event) | |||
| 293 | frozen_pdn = PCI_DN(frozen_dn); | 293 | frozen_pdn = PCI_DN(frozen_dn); |
| 294 | frozen_pdn->eeh_freeze_count++; | 294 | frozen_pdn->eeh_freeze_count++; |
| 295 | 295 | ||
| 296 | pci_str = pci_name (frozen_pdn->pcidev); | 296 | if (frozen_pdn->pcidev) { |
| 297 | drv_str = pcid_name (frozen_pdn->pcidev); | 297 | pci_str = pci_name (frozen_pdn->pcidev); |
| 298 | if (!pci_str) { | 298 | drv_str = pcid_name (frozen_pdn->pcidev); |
| 299 | } else { | ||
| 299 | pci_str = pci_name (event->dev); | 300 | pci_str = pci_name (event->dev); |
| 300 | drv_str = pcid_name (event->dev); | 301 | drv_str = pcid_name (event->dev); |
| 301 | } | 302 | } |
| 302 | 303 | ||
| 303 | if (frozen_pdn->eeh_freeze_count > EEH_MAX_ALLOWED_FREEZES) | 304 | if (frozen_pdn->eeh_freeze_count > EEH_MAX_ALLOWED_FREEZES) |
| 304 | goto hard_fail; | 305 | goto excess_failures; |
| 305 | 306 | ||
| 306 | /* If the reset state is a '5' and the time to reset is 0 (infinity) | 307 | /* If the reset state is a '5' and the time to reset is 0 (infinity) |
| 307 | * or is more then 15 seconds, then mark this as a permanent failure. | 308 | * or is more then 15 seconds, then mark this as a permanent failure. |
| @@ -356,7 +357,7 @@ void handle_eeh_events (struct eeh_event *event) | |||
| 356 | 357 | ||
| 357 | return; | 358 | return; |
| 358 | 359 | ||
| 359 | hard_fail: | 360 | excess_failures: |
| 360 | /* | 361 | /* |
| 361 | * About 90% of all real-life EEH failures in the field | 362 | * About 90% of all real-life EEH failures in the field |
| 362 | * are due to poorly seated PCI cards. Only 10% or so are | 363 | * are due to poorly seated PCI cards. Only 10% or so are |
| @@ -367,7 +368,15 @@ hard_fail: | |||
| 367 | "and has been permanently disabled. Please try reseating\n" | 368 | "and has been permanently disabled. Please try reseating\n" |
| 368 | "this device or replacing it.\n", | 369 | "this device or replacing it.\n", |
| 369 | drv_str, pci_str, frozen_pdn->eeh_freeze_count); | 370 | drv_str, pci_str, frozen_pdn->eeh_freeze_count); |
| 371 | goto perm_error; | ||
| 372 | |||
| 373 | hard_fail: | ||
| 374 | printk(KERN_ERR | ||
| 375 | "EEH: Unable to recover from failure of PCI device %s - %s\n" | ||
| 376 | "Please try reseating this device or replacing it.\n", | ||
| 377 | drv_str, pci_str); | ||
| 370 | 378 | ||
| 379 | perm_error: | ||
| 371 | eeh_slot_error_detail(frozen_pdn, 2 /* Permanent Error */); | 380 | eeh_slot_error_detail(frozen_pdn, 2 /* Permanent Error */); |
| 372 | 381 | ||
| 373 | /* Notify all devices that they're about to go down. */ | 382 | /* Notify all devices that they're about to go down. */ |
diff --git a/arch/powerpc/platforms/pseries/eeh_event.c b/arch/powerpc/platforms/pseries/eeh_event.c index 9a9961f27480..a1bda6f96fd1 100644 --- a/arch/powerpc/platforms/pseries/eeh_event.c +++ b/arch/powerpc/platforms/pseries/eeh_event.c | |||
| @@ -19,7 +19,9 @@ | |||
| 19 | */ | 19 | */ |
| 20 | 20 | ||
| 21 | #include <linux/list.h> | 21 | #include <linux/list.h> |
| 22 | #include <linux/mutex.h> | ||
| 22 | #include <linux/pci.h> | 23 | #include <linux/pci.h> |
| 24 | #include <linux/workqueue.h> | ||
| 23 | #include <asm/eeh_event.h> | 25 | #include <asm/eeh_event.h> |
| 24 | #include <asm/ppc-pci.h> | 26 | #include <asm/ppc-pci.h> |
| 25 | 27 | ||
| @@ -37,14 +39,18 @@ LIST_HEAD(eeh_eventlist); | |||
| 37 | static void eeh_thread_launcher(void *); | 39 | static void eeh_thread_launcher(void *); |
| 38 | DECLARE_WORK(eeh_event_wq, eeh_thread_launcher, NULL); | 40 | DECLARE_WORK(eeh_event_wq, eeh_thread_launcher, NULL); |
| 39 | 41 | ||
| 42 | /* Serialize reset sequences for a given pci device */ | ||
| 43 | DEFINE_MUTEX(eeh_event_mutex); | ||
| 44 | |||
| 40 | /** | 45 | /** |
| 41 | * eeh_event_handler - dispatch EEH events. The detection of a frozen | 46 | * eeh_event_handler - dispatch EEH events. |
| 42 | * slot can occur inside an interrupt, where it can be hard to do | ||
| 43 | * anything about it. The goal of this routine is to pull these | ||
| 44 | * detection events out of the context of the interrupt handler, and | ||
| 45 | * re-dispatch them for processing at a later time in a normal context. | ||
| 46 | * | ||
| 47 | * @dummy - unused | 47 | * @dummy - unused |
| 48 | * | ||
| 49 | * The detection of a frozen slot can occur inside an interrupt, | ||
| 50 | * where it can be hard to do anything about it. The goal of this | ||
| 51 | * routine is to pull these detection events out of the context | ||
| 52 | * of the interrupt handler, and re-dispatch them for processing | ||
| 53 | * at a later time in a normal context. | ||
| 48 | */ | 54 | */ |
| 49 | static int eeh_event_handler(void * dummy) | 55 | static int eeh_event_handler(void * dummy) |
| 50 | { | 56 | { |
| @@ -64,23 +70,24 @@ static int eeh_event_handler(void * dummy) | |||
| 64 | event = list_entry(eeh_eventlist.next, struct eeh_event, list); | 70 | event = list_entry(eeh_eventlist.next, struct eeh_event, list); |
| 65 | list_del(&event->list); | 71 | list_del(&event->list); |
| 66 | } | 72 | } |
| 67 | |||
| 68 | if (event) | ||
| 69 | eeh_mark_slot(event->dn, EEH_MODE_RECOVERING); | ||
| 70 | |||
| 71 | spin_unlock_irqrestore(&eeh_eventlist_lock, flags); | 73 | spin_unlock_irqrestore(&eeh_eventlist_lock, flags); |
| 74 | |||
| 72 | if (event == NULL) | 75 | if (event == NULL) |
| 73 | break; | 76 | break; |
| 74 | 77 | ||
| 78 | /* Serialize processing of EEH events */ | ||
| 79 | mutex_lock(&eeh_event_mutex); | ||
| 80 | eeh_mark_slot(event->dn, EEH_MODE_RECOVERING); | ||
| 81 | |||
| 75 | printk(KERN_INFO "EEH: Detected PCI bus error on device %s\n", | 82 | printk(KERN_INFO "EEH: Detected PCI bus error on device %s\n", |
| 76 | pci_name(event->dev)); | 83 | pci_name(event->dev)); |
| 77 | 84 | ||
| 78 | handle_eeh_events(event); | 85 | handle_eeh_events(event); |
| 79 | 86 | ||
| 80 | eeh_clear_slot(event->dn, EEH_MODE_RECOVERING); | 87 | eeh_clear_slot(event->dn, EEH_MODE_RECOVERING); |
| 81 | |||
| 82 | pci_dev_put(event->dev); | 88 | pci_dev_put(event->dev); |
| 83 | kfree(event); | 89 | kfree(event); |
| 90 | mutex_unlock(&eeh_event_mutex); | ||
| 84 | } | 91 | } |
| 85 | 92 | ||
| 86 | return 0; | 93 | return 0; |
| @@ -88,7 +95,6 @@ static int eeh_event_handler(void * dummy) | |||
| 88 | 95 | ||
| 89 | /** | 96 | /** |
| 90 | * eeh_thread_launcher | 97 | * eeh_thread_launcher |
| 91 | * | ||
| 92 | * @dummy - unused | 98 | * @dummy - unused |
| 93 | */ | 99 | */ |
| 94 | static void eeh_thread_launcher(void *dummy) | 100 | static void eeh_thread_launcher(void *dummy) |
diff --git a/arch/powerpc/platforms/pseries/hvCall.S b/arch/powerpc/platforms/pseries/hvCall.S index db7c19fe9297..c9ff547f9d25 100644 --- a/arch/powerpc/platforms/pseries/hvCall.S +++ b/arch/powerpc/platforms/pseries/hvCall.S | |||
| @@ -127,3 +127,103 @@ _GLOBAL(plpar_hcall_4out) | |||
| 127 | 127 | ||
| 128 | mtcrf 0xff,r0 | 128 | mtcrf 0xff,r0 |
| 129 | blr /* return r3 = status */ | 129 | blr /* return r3 = status */ |
| 130 | |||
| 131 | /* plpar_hcall_7arg_7ret(unsigned long opcode, R3 | ||
| 132 | unsigned long arg1, R4 | ||
| 133 | unsigned long arg2, R5 | ||
| 134 | unsigned long arg3, R6 | ||
| 135 | unsigned long arg4, R7 | ||
| 136 | unsigned long arg5, R8 | ||
| 137 | unsigned long arg6, R9 | ||
| 138 | unsigned long arg7, R10 | ||
| 139 | unsigned long *out1, 112(R1) | ||
| 140 | unsigned long *out2, 110(R1) | ||
| 141 | unsigned long *out3, 108(R1) | ||
| 142 | unsigned long *out4, 106(R1) | ||
| 143 | unsigned long *out5, 104(R1) | ||
| 144 | unsigned long *out6, 102(R1) | ||
| 145 | unsigned long *out7); 100(R1) | ||
| 146 | */ | ||
| 147 | _GLOBAL(plpar_hcall_7arg_7ret) | ||
| 148 | HMT_MEDIUM | ||
| 149 | |||
| 150 | mfcr r0 | ||
| 151 | stw r0,8(r1) | ||
| 152 | |||
| 153 | HVSC /* invoke the hypervisor */ | ||
| 154 | |||
| 155 | lwz r0,8(r1) | ||
| 156 | |||
| 157 | ld r11,STK_PARM(r11)(r1) /* Fetch r4 ret arg */ | ||
| 158 | std r4,0(r11) | ||
| 159 | ld r11,STK_PARM(r12)(r1) /* Fetch r5 ret arg */ | ||
| 160 | std r5,0(r11) | ||
| 161 | ld r11,STK_PARM(r13)(r1) /* Fetch r6 ret arg */ | ||
| 162 | std r6,0(r11) | ||
| 163 | ld r11,STK_PARM(r14)(r1) /* Fetch r7 ret arg */ | ||
| 164 | std r7,0(r11) | ||
| 165 | ld r11,STK_PARM(r15)(r1) /* Fetch r8 ret arg */ | ||
| 166 | std r8,0(r11) | ||
| 167 | ld r11,STK_PARM(r16)(r1) /* Fetch r9 ret arg */ | ||
| 168 | std r9,0(r11) | ||
| 169 | ld r11,STK_PARM(r17)(r1) /* Fetch r10 ret arg */ | ||
| 170 | std r10,0(r11) | ||
| 171 | |||
| 172 | mtcrf 0xff,r0 | ||
| 173 | |||
| 174 | blr /* return r3 = status */ | ||
| 175 | |||
| 176 | /* plpar_hcall_9arg_9ret(unsigned long opcode, R3 | ||
| 177 | unsigned long arg1, R4 | ||
| 178 | unsigned long arg2, R5 | ||
| 179 | unsigned long arg3, R6 | ||
| 180 | unsigned long arg4, R7 | ||
| 181 | unsigned long arg5, R8 | ||
| 182 | unsigned long arg6, R9 | ||
| 183 | unsigned long arg7, R10 | ||
| 184 | unsigned long arg8, 112(R1) | ||
| 185 | unsigned long arg9, 110(R1) | ||
| 186 | unsigned long *out1, 108(R1) | ||
| 187 | unsigned long *out2, 106(R1) | ||
| 188 | unsigned long *out3, 104(R1) | ||
| 189 | unsigned long *out4, 102(R1) | ||
| 190 | unsigned long *out5, 100(R1) | ||
| 191 | unsigned long *out6, 98(R1) | ||
| 192 | unsigned long *out7); 96(R1) | ||
| 193 | unsigned long *out8, 94(R1) | ||
| 194 | unsigned long *out9, 92(R1) | ||
| 195 | */ | ||
| 196 | _GLOBAL(plpar_hcall_9arg_9ret) | ||
| 197 | HMT_MEDIUM | ||
| 198 | |||
| 199 | mfcr r0 | ||
| 200 | stw r0,8(r1) | ||
| 201 | |||
| 202 | ld r11,STK_PARM(r11)(r1) /* put arg8 in R11 */ | ||
| 203 | ld r12,STK_PARM(r12)(r1) /* put arg9 in R12 */ | ||
| 204 | |||
| 205 | HVSC /* invoke the hypervisor */ | ||
| 206 | |||
| 207 | ld r0,STK_PARM(r13)(r1) /* Fetch r4 ret arg */ | ||
| 208 | stdx r4,r0,r0 | ||
| 209 | ld r0,STK_PARM(r14)(r1) /* Fetch r5 ret arg */ | ||
| 210 | stdx r5,r0,r0 | ||
| 211 | ld r0,STK_PARM(r15)(r1) /* Fetch r6 ret arg */ | ||
| 212 | stdx r6,r0,r0 | ||
| 213 | ld r0,STK_PARM(r16)(r1) /* Fetch r7 ret arg */ | ||
| 214 | stdx r7,r0,r0 | ||
| 215 | ld r0,STK_PARM(r17)(r1) /* Fetch r8 ret arg */ | ||
| 216 | stdx r8,r0,r0 | ||
| 217 | ld r0,STK_PARM(r18)(r1) /* Fetch r9 ret arg */ | ||
| 218 | stdx r9,r0,r0 | ||
| 219 | ld r0,STK_PARM(r19)(r1) /* Fetch r10 ret arg */ | ||
| 220 | stdx r10,r0,r0 | ||
| 221 | ld r0,STK_PARM(r20)(r1) /* Fetch r11 ret arg */ | ||
| 222 | stdx r11,r0,r0 | ||
| 223 | ld r0,STK_PARM(r21)(r1) /* Fetch r12 ret arg */ | ||
| 224 | stdx r12,r0,r0 | ||
| 225 | |||
| 226 | lwz r0,8(r1) | ||
| 227 | mtcrf 0xff,r0 | ||
| 228 | |||
| 229 | blr /* return r3 = status */ | ||
diff --git a/arch/powerpc/platforms/pseries/hvconsole.c b/arch/powerpc/platforms/pseries/hvconsole.c index ba6befd96636..a72a987f1d4d 100644 --- a/arch/powerpc/platforms/pseries/hvconsole.c +++ b/arch/powerpc/platforms/pseries/hvconsole.c | |||
| @@ -41,7 +41,7 @@ int hvc_get_chars(uint32_t vtermno, char *buf, int count) | |||
| 41 | unsigned long got; | 41 | unsigned long got; |
| 42 | 42 | ||
| 43 | if (plpar_hcall(H_GET_TERM_CHAR, vtermno, 0, 0, 0, &got, | 43 | if (plpar_hcall(H_GET_TERM_CHAR, vtermno, 0, 0, 0, &got, |
| 44 | (unsigned long *)buf, (unsigned long *)buf+1) == H_Success) | 44 | (unsigned long *)buf, (unsigned long *)buf+1) == H_SUCCESS) |
| 45 | return got; | 45 | return got; |
| 46 | return 0; | 46 | return 0; |
| 47 | } | 47 | } |
| @@ -69,9 +69,9 @@ int hvc_put_chars(uint32_t vtermno, const char *buf, int count) | |||
| 69 | 69 | ||
| 70 | ret = plpar_hcall_norets(H_PUT_TERM_CHAR, vtermno, count, lbuf[0], | 70 | ret = plpar_hcall_norets(H_PUT_TERM_CHAR, vtermno, count, lbuf[0], |
| 71 | lbuf[1]); | 71 | lbuf[1]); |
| 72 | if (ret == H_Success) | 72 | if (ret == H_SUCCESS) |
| 73 | return count; | 73 | return count; |
| 74 | if (ret == H_Busy) | 74 | if (ret == H_BUSY) |
| 75 | return 0; | 75 | return 0; |
| 76 | return -EIO; | 76 | return -EIO; |
| 77 | } | 77 | } |
diff --git a/arch/powerpc/platforms/pseries/hvcserver.c b/arch/powerpc/platforms/pseries/hvcserver.c index 22bfb5c89db9..fcf4b4cbeaf3 100644 --- a/arch/powerpc/platforms/pseries/hvcserver.c +++ b/arch/powerpc/platforms/pseries/hvcserver.c | |||
| @@ -43,21 +43,21 @@ MODULE_VERSION(HVCS_ARCH_VERSION); | |||
| 43 | static int hvcs_convert(long to_convert) | 43 | static int hvcs_convert(long to_convert) |
| 44 | { | 44 | { |
| 45 | switch (to_convert) { | 45 | switch (to_convert) { |
| 46 | case H_Success: | 46 | case H_SUCCESS: |
| 47 | return 0; | 47 | return 0; |
| 48 | case H_Parameter: | 48 | case H_PARAMETER: |
| 49 | return -EINVAL; | 49 | return -EINVAL; |
| 50 | case H_Hardware: | 50 | case H_HARDWARE: |
| 51 | return -EIO; | 51 | return -EIO; |
| 52 | case H_Busy: | 52 | case H_BUSY: |
| 53 | case H_LongBusyOrder1msec: | 53 | case H_LONG_BUSY_ORDER_1_MSEC: |
| 54 | case H_LongBusyOrder10msec: | 54 | case H_LONG_BUSY_ORDER_10_MSEC: |
| 55 | case H_LongBusyOrder100msec: | 55 | case H_LONG_BUSY_ORDER_100_MSEC: |
| 56 | case H_LongBusyOrder1sec: | 56 | case H_LONG_BUSY_ORDER_1_SEC: |
| 57 | case H_LongBusyOrder10sec: | 57 | case H_LONG_BUSY_ORDER_10_SEC: |
| 58 | case H_LongBusyOrder100sec: | 58 | case H_LONG_BUSY_ORDER_100_SEC: |
| 59 | return -EBUSY; | 59 | return -EBUSY; |
| 60 | case H_Function: /* fall through */ | 60 | case H_FUNCTION: /* fall through */ |
| 61 | default: | 61 | default: |
| 62 | return -EPERM; | 62 | return -EPERM; |
| 63 | } | 63 | } |
diff --git a/arch/powerpc/platforms/pseries/lpar.c b/arch/powerpc/platforms/pseries/lpar.c index 8952528d31ac..634b7d06d3cc 100644 --- a/arch/powerpc/platforms/pseries/lpar.c +++ b/arch/powerpc/platforms/pseries/lpar.c | |||
| @@ -54,7 +54,8 @@ EXPORT_SYMBOL(plpar_hcall); | |||
| 54 | EXPORT_SYMBOL(plpar_hcall_4out); | 54 | EXPORT_SYMBOL(plpar_hcall_4out); |
| 55 | EXPORT_SYMBOL(plpar_hcall_norets); | 55 | EXPORT_SYMBOL(plpar_hcall_norets); |
| 56 | EXPORT_SYMBOL(plpar_hcall_8arg_2ret); | 56 | EXPORT_SYMBOL(plpar_hcall_8arg_2ret); |
| 57 | 57 | EXPORT_SYMBOL(plpar_hcall_7arg_7ret); | |
| 58 | EXPORT_SYMBOL(plpar_hcall_9arg_9ret); | ||
| 58 | extern void pSeries_find_serial_port(void); | 59 | extern void pSeries_find_serial_port(void); |
| 59 | 60 | ||
| 60 | 61 | ||
| @@ -72,7 +73,7 @@ static void udbg_hvsi_putc(char c) | |||
| 72 | 73 | ||
| 73 | do { | 74 | do { |
| 74 | rc = plpar_put_term_char(vtermno, sizeof(packet), packet); | 75 | rc = plpar_put_term_char(vtermno, sizeof(packet), packet); |
| 75 | } while (rc == H_Busy); | 76 | } while (rc == H_BUSY); |
| 76 | } | 77 | } |
| 77 | 78 | ||
| 78 | static long hvsi_udbg_buf_len; | 79 | static long hvsi_udbg_buf_len; |
| @@ -85,7 +86,7 @@ static int udbg_hvsi_getc_poll(void) | |||
| 85 | 86 | ||
| 86 | if (hvsi_udbg_buf_len == 0) { | 87 | if (hvsi_udbg_buf_len == 0) { |
| 87 | rc = plpar_get_term_char(vtermno, &hvsi_udbg_buf_len, hvsi_udbg_buf); | 88 | rc = plpar_get_term_char(vtermno, &hvsi_udbg_buf_len, hvsi_udbg_buf); |
| 88 | if (rc != H_Success || hvsi_udbg_buf[0] != 0xff) { | 89 | if (rc != H_SUCCESS || hvsi_udbg_buf[0] != 0xff) { |
| 89 | /* bad read or non-data packet */ | 90 | /* bad read or non-data packet */ |
| 90 | hvsi_udbg_buf_len = 0; | 91 | hvsi_udbg_buf_len = 0; |
| 91 | } else { | 92 | } else { |
| @@ -139,7 +140,7 @@ static void udbg_putcLP(char c) | |||
| 139 | buf[0] = c; | 140 | buf[0] = c; |
| 140 | do { | 141 | do { |
| 141 | rc = plpar_put_term_char(vtermno, 1, buf); | 142 | rc = plpar_put_term_char(vtermno, 1, buf); |
| 142 | } while(rc == H_Busy); | 143 | } while(rc == H_BUSY); |
| 143 | } | 144 | } |
| 144 | 145 | ||
| 145 | /* Buffered chars getc */ | 146 | /* Buffered chars getc */ |
| @@ -158,7 +159,7 @@ static int udbg_getc_pollLP(void) | |||
| 158 | /* get some more chars. */ | 159 | /* get some more chars. */ |
| 159 | inbuflen = 0; | 160 | inbuflen = 0; |
| 160 | rc = plpar_get_term_char(vtermno, &inbuflen, buf); | 161 | rc = plpar_get_term_char(vtermno, &inbuflen, buf); |
| 161 | if (rc != H_Success) | 162 | if (rc != H_SUCCESS) |
| 162 | inbuflen = 0; /* otherwise inbuflen is garbage */ | 163 | inbuflen = 0; /* otherwise inbuflen is garbage */ |
| 163 | } | 164 | } |
| 164 | if (inbuflen <= 0 || inbuflen > 16) { | 165 | if (inbuflen <= 0 || inbuflen > 16) { |
| @@ -304,7 +305,7 @@ long pSeries_lpar_hpte_insert(unsigned long hpte_group, | |||
| 304 | 305 | ||
| 305 | lpar_rc = plpar_hcall(H_ENTER, flags, hpte_group, hpte_v, | 306 | lpar_rc = plpar_hcall(H_ENTER, flags, hpte_group, hpte_v, |
| 306 | hpte_r, &slot, &dummy0, &dummy1); | 307 | hpte_r, &slot, &dummy0, &dummy1); |
| 307 | if (unlikely(lpar_rc == H_PTEG_Full)) { | 308 | if (unlikely(lpar_rc == H_PTEG_FULL)) { |
| 308 | if (!(vflags & HPTE_V_BOLTED)) | 309 | if (!(vflags & HPTE_V_BOLTED)) |
| 309 | DBG_LOW(" full\n"); | 310 | DBG_LOW(" full\n"); |
| 310 | return -1; | 311 | return -1; |
| @@ -315,7 +316,7 @@ long pSeries_lpar_hpte_insert(unsigned long hpte_group, | |||
| 315 | * will fail. However we must catch the failure in hash_page | 316 | * will fail. However we must catch the failure in hash_page |
| 316 | * or we will loop forever, so return -2 in this case. | 317 | * or we will loop forever, so return -2 in this case. |
| 317 | */ | 318 | */ |
| 318 | if (unlikely(lpar_rc != H_Success)) { | 319 | if (unlikely(lpar_rc != H_SUCCESS)) { |
| 319 | if (!(vflags & HPTE_V_BOLTED)) | 320 | if (!(vflags & HPTE_V_BOLTED)) |
| 320 | DBG_LOW(" lpar err %d\n", lpar_rc); | 321 | DBG_LOW(" lpar err %d\n", lpar_rc); |
| 321 | return -2; | 322 | return -2; |
| @@ -346,9 +347,9 @@ static long pSeries_lpar_hpte_remove(unsigned long hpte_group) | |||
| 346 | /* don't remove a bolted entry */ | 347 | /* don't remove a bolted entry */ |
| 347 | lpar_rc = plpar_pte_remove(H_ANDCOND, hpte_group + slot_offset, | 348 | lpar_rc = plpar_pte_remove(H_ANDCOND, hpte_group + slot_offset, |
| 348 | (0x1UL << 4), &dummy1, &dummy2); | 349 | (0x1UL << 4), &dummy1, &dummy2); |
| 349 | if (lpar_rc == H_Success) | 350 | if (lpar_rc == H_SUCCESS) |
| 350 | return i; | 351 | return i; |
| 351 | BUG_ON(lpar_rc != H_Not_Found); | 352 | BUG_ON(lpar_rc != H_NOT_FOUND); |
| 352 | 353 | ||
| 353 | slot_offset++; | 354 | slot_offset++; |
| 354 | slot_offset &= 0x7; | 355 | slot_offset &= 0x7; |
| @@ -391,14 +392,14 @@ static long pSeries_lpar_hpte_updatepp(unsigned long slot, | |||
| 391 | 392 | ||
| 392 | lpar_rc = plpar_pte_protect(flags, slot, want_v & HPTE_V_AVPN); | 393 | lpar_rc = plpar_pte_protect(flags, slot, want_v & HPTE_V_AVPN); |
| 393 | 394 | ||
| 394 | if (lpar_rc == H_Not_Found) { | 395 | if (lpar_rc == H_NOT_FOUND) { |
| 395 | DBG_LOW("not found !\n"); | 396 | DBG_LOW("not found !\n"); |
| 396 | return -1; | 397 | return -1; |
| 397 | } | 398 | } |
| 398 | 399 | ||
| 399 | DBG_LOW("ok\n"); | 400 | DBG_LOW("ok\n"); |
| 400 | 401 | ||
| 401 | BUG_ON(lpar_rc != H_Success); | 402 | BUG_ON(lpar_rc != H_SUCCESS); |
| 402 | 403 | ||
| 403 | return 0; | 404 | return 0; |
| 404 | } | 405 | } |
| @@ -417,7 +418,7 @@ static unsigned long pSeries_lpar_hpte_getword0(unsigned long slot) | |||
| 417 | 418 | ||
| 418 | lpar_rc = plpar_pte_read(flags, slot, &dword0, &dummy_word1); | 419 | lpar_rc = plpar_pte_read(flags, slot, &dword0, &dummy_word1); |
| 419 | 420 | ||
| 420 | BUG_ON(lpar_rc != H_Success); | 421 | BUG_ON(lpar_rc != H_SUCCESS); |
| 421 | 422 | ||
| 422 | return dword0; | 423 | return dword0; |
| 423 | } | 424 | } |
| @@ -468,7 +469,7 @@ static void pSeries_lpar_hpte_updateboltedpp(unsigned long newpp, | |||
| 468 | flags = newpp & 7; | 469 | flags = newpp & 7; |
| 469 | lpar_rc = plpar_pte_protect(flags, slot, 0); | 470 | lpar_rc = plpar_pte_protect(flags, slot, 0); |
| 470 | 471 | ||
| 471 | BUG_ON(lpar_rc != H_Success); | 472 | BUG_ON(lpar_rc != H_SUCCESS); |
| 472 | } | 473 | } |
| 473 | 474 | ||
| 474 | static void pSeries_lpar_hpte_invalidate(unsigned long slot, unsigned long va, | 475 | static void pSeries_lpar_hpte_invalidate(unsigned long slot, unsigned long va, |
| @@ -484,10 +485,10 @@ static void pSeries_lpar_hpte_invalidate(unsigned long slot, unsigned long va, | |||
| 484 | want_v = hpte_encode_v(va, psize); | 485 | want_v = hpte_encode_v(va, psize); |
| 485 | lpar_rc = plpar_pte_remove(H_AVPN, slot, want_v & HPTE_V_AVPN, | 486 | lpar_rc = plpar_pte_remove(H_AVPN, slot, want_v & HPTE_V_AVPN, |
| 486 | &dummy1, &dummy2); | 487 | &dummy1, &dummy2); |
| 487 | if (lpar_rc == H_Not_Found) | 488 | if (lpar_rc == H_NOT_FOUND) |
| 488 | return; | 489 | return; |
| 489 | 490 | ||
| 490 | BUG_ON(lpar_rc != H_Success); | 491 | BUG_ON(lpar_rc != H_SUCCESS); |
| 491 | } | 492 | } |
| 492 | 493 | ||
| 493 | /* | 494 | /* |
diff --git a/arch/powerpc/platforms/pseries/setup.c b/arch/powerpc/platforms/pseries/setup.c index b2fbf8ba8fbb..5eb55ef1c91c 100644 --- a/arch/powerpc/platforms/pseries/setup.c +++ b/arch/powerpc/platforms/pseries/setup.c | |||
| @@ -463,7 +463,7 @@ static void pseries_dedicated_idle_sleep(void) | |||
| 463 | * very low priority. The cede enables interrupts, which | 463 | * very low priority. The cede enables interrupts, which |
| 464 | * doesn't matter here. | 464 | * doesn't matter here. |
| 465 | */ | 465 | */ |
| 466 | if (!lppaca[cpu ^ 1].idle || poll_pending() == H_Pending) | 466 | if (!lppaca[cpu ^ 1].idle || poll_pending() == H_PENDING) |
| 467 | cede_processor(); | 467 | cede_processor(); |
| 468 | 468 | ||
| 469 | out: | 469 | out: |
diff --git a/arch/powerpc/platforms/pseries/vio.c b/arch/powerpc/platforms/pseries/vio.c index 866379b80c09..8e53e04ada8b 100644 --- a/arch/powerpc/platforms/pseries/vio.c +++ b/arch/powerpc/platforms/pseries/vio.c | |||
| @@ -258,7 +258,7 @@ EXPORT_SYMBOL(vio_find_node); | |||
| 258 | int vio_enable_interrupts(struct vio_dev *dev) | 258 | int vio_enable_interrupts(struct vio_dev *dev) |
| 259 | { | 259 | { |
| 260 | int rc = h_vio_signal(dev->unit_address, VIO_IRQ_ENABLE); | 260 | int rc = h_vio_signal(dev->unit_address, VIO_IRQ_ENABLE); |
| 261 | if (rc != H_Success) | 261 | if (rc != H_SUCCESS) |
| 262 | printk(KERN_ERR "vio: Error 0x%x enabling interrupts\n", rc); | 262 | printk(KERN_ERR "vio: Error 0x%x enabling interrupts\n", rc); |
| 263 | return rc; | 263 | return rc; |
| 264 | } | 264 | } |
| @@ -267,7 +267,7 @@ EXPORT_SYMBOL(vio_enable_interrupts); | |||
| 267 | int vio_disable_interrupts(struct vio_dev *dev) | 267 | int vio_disable_interrupts(struct vio_dev *dev) |
| 268 | { | 268 | { |
| 269 | int rc = h_vio_signal(dev->unit_address, VIO_IRQ_DISABLE); | 269 | int rc = h_vio_signal(dev->unit_address, VIO_IRQ_DISABLE); |
| 270 | if (rc != H_Success) | 270 | if (rc != H_SUCCESS) |
| 271 | printk(KERN_ERR "vio: Error 0x%x disabling interrupts\n", rc); | 271 | printk(KERN_ERR "vio: Error 0x%x disabling interrupts\n", rc); |
| 272 | return rc; | 272 | return rc; |
| 273 | } | 273 | } |
diff --git a/arch/powerpc/platforms/pseries/xics.c b/arch/powerpc/platforms/pseries/xics.c index 4864cb32be25..2d60ea30fed6 100644 --- a/arch/powerpc/platforms/pseries/xics.c +++ b/arch/powerpc/platforms/pseries/xics.c | |||
| @@ -168,7 +168,7 @@ static int pSeriesLP_xirr_info_get(int n_cpu) | |||
| 168 | unsigned long return_value; | 168 | unsigned long return_value; |
| 169 | 169 | ||
| 170 | lpar_rc = plpar_xirr(&return_value); | 170 | lpar_rc = plpar_xirr(&return_value); |
| 171 | if (lpar_rc != H_Success) | 171 | if (lpar_rc != H_SUCCESS) |
| 172 | panic(" bad return code xirr - rc = %lx \n", lpar_rc); | 172 | panic(" bad return code xirr - rc = %lx \n", lpar_rc); |
| 173 | return (int)return_value; | 173 | return (int)return_value; |
| 174 | } | 174 | } |
| @@ -179,7 +179,7 @@ static void pSeriesLP_xirr_info_set(int n_cpu, int value) | |||
| 179 | unsigned long val64 = value & 0xffffffff; | 179 | unsigned long val64 = value & 0xffffffff; |
| 180 | 180 | ||
| 181 | lpar_rc = plpar_eoi(val64); | 181 | lpar_rc = plpar_eoi(val64); |
| 182 | if (lpar_rc != H_Success) | 182 | if (lpar_rc != H_SUCCESS) |
| 183 | panic("bad return code EOI - rc = %ld, value=%lx\n", lpar_rc, | 183 | panic("bad return code EOI - rc = %ld, value=%lx\n", lpar_rc, |
| 184 | val64); | 184 | val64); |
| 185 | } | 185 | } |
| @@ -189,7 +189,7 @@ void pSeriesLP_cppr_info(int n_cpu, u8 value) | |||
| 189 | unsigned long lpar_rc; | 189 | unsigned long lpar_rc; |
| 190 | 190 | ||
| 191 | lpar_rc = plpar_cppr(value); | 191 | lpar_rc = plpar_cppr(value); |
| 192 | if (lpar_rc != H_Success) | 192 | if (lpar_rc != H_SUCCESS) |
| 193 | panic("bad return code cppr - rc = %lx\n", lpar_rc); | 193 | panic("bad return code cppr - rc = %lx\n", lpar_rc); |
| 194 | } | 194 | } |
| 195 | 195 | ||
| @@ -198,7 +198,7 @@ static void pSeriesLP_qirr_info(int n_cpu , u8 value) | |||
| 198 | unsigned long lpar_rc; | 198 | unsigned long lpar_rc; |
| 199 | 199 | ||
| 200 | lpar_rc = plpar_ipi(get_hard_smp_processor_id(n_cpu), value); | 200 | lpar_rc = plpar_ipi(get_hard_smp_processor_id(n_cpu), value); |
| 201 | if (lpar_rc != H_Success) | 201 | if (lpar_rc != H_SUCCESS) |
| 202 | panic("bad return code qirr - rc = %lx\n", lpar_rc); | 202 | panic("bad return code qirr - rc = %lx\n", lpar_rc); |
| 203 | } | 203 | } |
| 204 | 204 | ||
diff --git a/drivers/char/hvcs.c b/drivers/char/hvcs.c index 327b00c3c45e..8d97b3911293 100644 --- a/drivers/char/hvcs.c +++ b/drivers/char/hvcs.c | |||
| @@ -904,7 +904,7 @@ static int hvcs_enable_device(struct hvcs_struct *hvcsd, uint32_t unit_address, | |||
| 904 | * It is possible the vty-server was removed after the irq was | 904 | * It is possible the vty-server was removed after the irq was |
| 905 | * requested but before we have time to enable interrupts. | 905 | * requested but before we have time to enable interrupts. |
| 906 | */ | 906 | */ |
| 907 | if (vio_enable_interrupts(vdev) == H_Success) | 907 | if (vio_enable_interrupts(vdev) == H_SUCCESS) |
| 908 | return 0; | 908 | return 0; |
| 909 | else { | 909 | else { |
| 910 | printk(KERN_ERR "HVCS: int enable failed for" | 910 | printk(KERN_ERR "HVCS: int enable failed for" |
diff --git a/drivers/net/ibmveth.c b/drivers/net/ibmveth.c index ceb98fd398af..52d01027d9e7 100644 --- a/drivers/net/ibmveth.c +++ b/drivers/net/ibmveth.c | |||
| @@ -235,7 +235,7 @@ static void ibmveth_replenish_buffer_pool(struct ibmveth_adapter *adapter, struc | |||
| 235 | 235 | ||
| 236 | lpar_rc = h_add_logical_lan_buffer(adapter->vdev->unit_address, desc.desc); | 236 | lpar_rc = h_add_logical_lan_buffer(adapter->vdev->unit_address, desc.desc); |
| 237 | 237 | ||
| 238 | if(lpar_rc != H_Success) { | 238 | if(lpar_rc != H_SUCCESS) { |
| 239 | pool->free_map[free_index] = index; | 239 | pool->free_map[free_index] = index; |
| 240 | pool->skbuff[index] = NULL; | 240 | pool->skbuff[index] = NULL; |
| 241 | pool->consumer_index--; | 241 | pool->consumer_index--; |
| @@ -373,7 +373,7 @@ static void ibmveth_rxq_recycle_buffer(struct ibmveth_adapter *adapter) | |||
| 373 | 373 | ||
| 374 | lpar_rc = h_add_logical_lan_buffer(adapter->vdev->unit_address, desc.desc); | 374 | lpar_rc = h_add_logical_lan_buffer(adapter->vdev->unit_address, desc.desc); |
| 375 | 375 | ||
| 376 | if(lpar_rc != H_Success) { | 376 | if(lpar_rc != H_SUCCESS) { |
| 377 | ibmveth_debug_printk("h_add_logical_lan_buffer failed during recycle rc=%ld", lpar_rc); | 377 | ibmveth_debug_printk("h_add_logical_lan_buffer failed during recycle rc=%ld", lpar_rc); |
| 378 | ibmveth_remove_buffer_from_pool(adapter, adapter->rx_queue.queue_addr[adapter->rx_queue.index].correlator); | 378 | ibmveth_remove_buffer_from_pool(adapter, adapter->rx_queue.queue_addr[adapter->rx_queue.index].correlator); |
| 379 | } | 379 | } |
| @@ -511,7 +511,7 @@ static int ibmveth_open(struct net_device *netdev) | |||
| 511 | adapter->filter_list_dma, | 511 | adapter->filter_list_dma, |
| 512 | mac_address); | 512 | mac_address); |
| 513 | 513 | ||
| 514 | if(lpar_rc != H_Success) { | 514 | if(lpar_rc != H_SUCCESS) { |
| 515 | ibmveth_error_printk("h_register_logical_lan failed with %ld\n", lpar_rc); | 515 | ibmveth_error_printk("h_register_logical_lan failed with %ld\n", lpar_rc); |
| 516 | ibmveth_error_printk("buffer TCE:0x%lx filter TCE:0x%lx rxq desc:0x%lx MAC:0x%lx\n", | 516 | ibmveth_error_printk("buffer TCE:0x%lx filter TCE:0x%lx rxq desc:0x%lx MAC:0x%lx\n", |
| 517 | adapter->buffer_list_dma, | 517 | adapter->buffer_list_dma, |
| @@ -527,7 +527,7 @@ static int ibmveth_open(struct net_device *netdev) | |||
| 527 | ibmveth_error_printk("unable to request irq 0x%x, rc %d\n", netdev->irq, rc); | 527 | ibmveth_error_printk("unable to request irq 0x%x, rc %d\n", netdev->irq, rc); |
| 528 | do { | 528 | do { |
| 529 | rc = h_free_logical_lan(adapter->vdev->unit_address); | 529 | rc = h_free_logical_lan(adapter->vdev->unit_address); |
| 530 | } while (H_isLongBusy(rc) || (rc == H_Busy)); | 530 | } while (H_IS_LONG_BUSY(rc) || (rc == H_BUSY)); |
| 531 | 531 | ||
| 532 | ibmveth_cleanup(adapter); | 532 | ibmveth_cleanup(adapter); |
| 533 | return rc; | 533 | return rc; |
| @@ -556,9 +556,9 @@ static int ibmveth_close(struct net_device *netdev) | |||
| 556 | 556 | ||
| 557 | do { | 557 | do { |
| 558 | lpar_rc = h_free_logical_lan(adapter->vdev->unit_address); | 558 | lpar_rc = h_free_logical_lan(adapter->vdev->unit_address); |
| 559 | } while (H_isLongBusy(lpar_rc) || (lpar_rc == H_Busy)); | 559 | } while (H_IS_LONG_BUSY(lpar_rc) || (lpar_rc == H_BUSY)); |
| 560 | 560 | ||
| 561 | if(lpar_rc != H_Success) | 561 | if(lpar_rc != H_SUCCESS) |
| 562 | { | 562 | { |
| 563 | ibmveth_error_printk("h_free_logical_lan failed with %lx, continuing with close\n", | 563 | ibmveth_error_printk("h_free_logical_lan failed with %lx, continuing with close\n", |
| 564 | lpar_rc); | 564 | lpar_rc); |
| @@ -693,9 +693,9 @@ static int ibmveth_start_xmit(struct sk_buff *skb, struct net_device *netdev) | |||
| 693 | desc[4].desc, | 693 | desc[4].desc, |
| 694 | desc[5].desc, | 694 | desc[5].desc, |
| 695 | correlator); | 695 | correlator); |
| 696 | } while ((lpar_rc == H_Busy) && (retry_count--)); | 696 | } while ((lpar_rc == H_BUSY) && (retry_count--)); |
| 697 | 697 | ||
| 698 | if(lpar_rc != H_Success && lpar_rc != H_Dropped) { | 698 | if(lpar_rc != H_SUCCESS && lpar_rc != H_DROPPED) { |
| 699 | int i; | 699 | int i; |
| 700 | ibmveth_error_printk("tx: h_send_logical_lan failed with rc=%ld\n", lpar_rc); | 700 | ibmveth_error_printk("tx: h_send_logical_lan failed with rc=%ld\n", lpar_rc); |
| 701 | for(i = 0; i < 6; i++) { | 701 | for(i = 0; i < 6; i++) { |
| @@ -786,14 +786,14 @@ static int ibmveth_poll(struct net_device *netdev, int *budget) | |||
| 786 | /* we think we are done - reenable interrupts, then check once more to make sure we are done */ | 786 | /* we think we are done - reenable interrupts, then check once more to make sure we are done */ |
| 787 | lpar_rc = h_vio_signal(adapter->vdev->unit_address, VIO_IRQ_ENABLE); | 787 | lpar_rc = h_vio_signal(adapter->vdev->unit_address, VIO_IRQ_ENABLE); |
| 788 | 788 | ||
| 789 | ibmveth_assert(lpar_rc == H_Success); | 789 | ibmveth_assert(lpar_rc == H_SUCCESS); |
| 790 | 790 | ||
| 791 | netif_rx_complete(netdev); | 791 | netif_rx_complete(netdev); |
| 792 | 792 | ||
| 793 | if(ibmveth_rxq_pending_buffer(adapter) && netif_rx_reschedule(netdev, frames_processed)) | 793 | if(ibmveth_rxq_pending_buffer(adapter) && netif_rx_reschedule(netdev, frames_processed)) |
| 794 | { | 794 | { |
| 795 | lpar_rc = h_vio_signal(adapter->vdev->unit_address, VIO_IRQ_DISABLE); | 795 | lpar_rc = h_vio_signal(adapter->vdev->unit_address, VIO_IRQ_DISABLE); |
| 796 | ibmveth_assert(lpar_rc == H_Success); | 796 | ibmveth_assert(lpar_rc == H_SUCCESS); |
| 797 | more_work = 1; | 797 | more_work = 1; |
| 798 | goto restart_poll; | 798 | goto restart_poll; |
| 799 | } | 799 | } |
| @@ -813,7 +813,7 @@ static irqreturn_t ibmveth_interrupt(int irq, void *dev_instance, struct pt_regs | |||
| 813 | 813 | ||
| 814 | if(netif_rx_schedule_prep(netdev)) { | 814 | if(netif_rx_schedule_prep(netdev)) { |
| 815 | lpar_rc = h_vio_signal(adapter->vdev->unit_address, VIO_IRQ_DISABLE); | 815 | lpar_rc = h_vio_signal(adapter->vdev->unit_address, VIO_IRQ_DISABLE); |
| 816 | ibmveth_assert(lpar_rc == H_Success); | 816 | ibmveth_assert(lpar_rc == H_SUCCESS); |
| 817 | __netif_rx_schedule(netdev); | 817 | __netif_rx_schedule(netdev); |
| 818 | } | 818 | } |
| 819 | return IRQ_HANDLED; | 819 | return IRQ_HANDLED; |
| @@ -835,7 +835,7 @@ static void ibmveth_set_multicast_list(struct net_device *netdev) | |||
| 835 | IbmVethMcastEnableRecv | | 835 | IbmVethMcastEnableRecv | |
| 836 | IbmVethMcastDisableFiltering, | 836 | IbmVethMcastDisableFiltering, |
| 837 | 0); | 837 | 0); |
| 838 | if(lpar_rc != H_Success) { | 838 | if(lpar_rc != H_SUCCESS) { |
| 839 | ibmveth_error_printk("h_multicast_ctrl rc=%ld when entering promisc mode\n", lpar_rc); | 839 | ibmveth_error_printk("h_multicast_ctrl rc=%ld when entering promisc mode\n", lpar_rc); |
| 840 | } | 840 | } |
| 841 | } else { | 841 | } else { |
| @@ -847,7 +847,7 @@ static void ibmveth_set_multicast_list(struct net_device *netdev) | |||
| 847 | IbmVethMcastDisableFiltering | | 847 | IbmVethMcastDisableFiltering | |
| 848 | IbmVethMcastClearFilterTable, | 848 | IbmVethMcastClearFilterTable, |
| 849 | 0); | 849 | 0); |
| 850 | if(lpar_rc != H_Success) { | 850 | if(lpar_rc != H_SUCCESS) { |
| 851 | ibmveth_error_printk("h_multicast_ctrl rc=%ld when attempting to clear filter table\n", lpar_rc); | 851 | ibmveth_error_printk("h_multicast_ctrl rc=%ld when attempting to clear filter table\n", lpar_rc); |
| 852 | } | 852 | } |
| 853 | /* add the addresses to the filter table */ | 853 | /* add the addresses to the filter table */ |
| @@ -858,7 +858,7 @@ static void ibmveth_set_multicast_list(struct net_device *netdev) | |||
| 858 | lpar_rc = h_multicast_ctrl(adapter->vdev->unit_address, | 858 | lpar_rc = h_multicast_ctrl(adapter->vdev->unit_address, |
| 859 | IbmVethMcastAddFilter, | 859 | IbmVethMcastAddFilter, |
| 860 | mcast_addr); | 860 | mcast_addr); |
| 861 | if(lpar_rc != H_Success) { | 861 | if(lpar_rc != H_SUCCESS) { |
| 862 | ibmveth_error_printk("h_multicast_ctrl rc=%ld when adding an entry to the filter table\n", lpar_rc); | 862 | ibmveth_error_printk("h_multicast_ctrl rc=%ld when adding an entry to the filter table\n", lpar_rc); |
| 863 | } | 863 | } |
| 864 | } | 864 | } |
| @@ -867,7 +867,7 @@ static void ibmveth_set_multicast_list(struct net_device *netdev) | |||
| 867 | lpar_rc = h_multicast_ctrl(adapter->vdev->unit_address, | 867 | lpar_rc = h_multicast_ctrl(adapter->vdev->unit_address, |
| 868 | IbmVethMcastEnableFiltering, | 868 | IbmVethMcastEnableFiltering, |
| 869 | 0); | 869 | 0); |
| 870 | if(lpar_rc != H_Success) { | 870 | if(lpar_rc != H_SUCCESS) { |
| 871 | ibmveth_error_printk("h_multicast_ctrl rc=%ld when enabling filtering\n", lpar_rc); | 871 | ibmveth_error_printk("h_multicast_ctrl rc=%ld when enabling filtering\n", lpar_rc); |
| 872 | } | 872 | } |
| 873 | } | 873 | } |
diff --git a/drivers/scsi/ibmvscsi/rpa_vscsi.c b/drivers/scsi/ibmvscsi/rpa_vscsi.c index f47dd87c05e7..892e8ed63091 100644 --- a/drivers/scsi/ibmvscsi/rpa_vscsi.c +++ b/drivers/scsi/ibmvscsi/rpa_vscsi.c | |||
| @@ -80,7 +80,7 @@ void ibmvscsi_release_crq_queue(struct crq_queue *queue, | |||
| 80 | tasklet_kill(&hostdata->srp_task); | 80 | tasklet_kill(&hostdata->srp_task); |
| 81 | do { | 81 | do { |
| 82 | rc = plpar_hcall_norets(H_FREE_CRQ, vdev->unit_address); | 82 | rc = plpar_hcall_norets(H_FREE_CRQ, vdev->unit_address); |
| 83 | } while ((rc == H_Busy) || (H_isLongBusy(rc))); | 83 | } while ((rc == H_BUSY) || (H_IS_LONG_BUSY(rc))); |
| 84 | dma_unmap_single(hostdata->dev, | 84 | dma_unmap_single(hostdata->dev, |
| 85 | queue->msg_token, | 85 | queue->msg_token, |
| 86 | queue->size * sizeof(*queue->msgs), DMA_BIDIRECTIONAL); | 86 | queue->size * sizeof(*queue->msgs), DMA_BIDIRECTIONAL); |
| @@ -230,7 +230,7 @@ int ibmvscsi_init_crq_queue(struct crq_queue *queue, | |||
| 230 | rc = plpar_hcall_norets(H_REG_CRQ, | 230 | rc = plpar_hcall_norets(H_REG_CRQ, |
| 231 | vdev->unit_address, | 231 | vdev->unit_address, |
| 232 | queue->msg_token, PAGE_SIZE); | 232 | queue->msg_token, PAGE_SIZE); |
| 233 | if (rc == H_Resource) | 233 | if (rc == H_RESOURCE) |
| 234 | /* maybe kexecing and resource is busy. try a reset */ | 234 | /* maybe kexecing and resource is busy. try a reset */ |
| 235 | rc = ibmvscsi_reset_crq_queue(queue, | 235 | rc = ibmvscsi_reset_crq_queue(queue, |
| 236 | hostdata); | 236 | hostdata); |
| @@ -269,7 +269,7 @@ int ibmvscsi_init_crq_queue(struct crq_queue *queue, | |||
| 269 | req_irq_failed: | 269 | req_irq_failed: |
| 270 | do { | 270 | do { |
| 271 | rc = plpar_hcall_norets(H_FREE_CRQ, vdev->unit_address); | 271 | rc = plpar_hcall_norets(H_FREE_CRQ, vdev->unit_address); |
| 272 | } while ((rc == H_Busy) || (H_isLongBusy(rc))); | 272 | } while ((rc == H_BUSY) || (H_IS_LONG_BUSY(rc))); |
| 273 | reg_crq_failed: | 273 | reg_crq_failed: |
| 274 | dma_unmap_single(hostdata->dev, | 274 | dma_unmap_single(hostdata->dev, |
| 275 | queue->msg_token, | 275 | queue->msg_token, |
| @@ -295,7 +295,7 @@ int ibmvscsi_reenable_crq_queue(struct crq_queue *queue, | |||
| 295 | /* Re-enable the CRQ */ | 295 | /* Re-enable the CRQ */ |
| 296 | do { | 296 | do { |
| 297 | rc = plpar_hcall_norets(H_ENABLE_CRQ, vdev->unit_address); | 297 | rc = plpar_hcall_norets(H_ENABLE_CRQ, vdev->unit_address); |
| 298 | } while ((rc == H_InProgress) || (rc == H_Busy) || (H_isLongBusy(rc))); | 298 | } while ((rc == H_IN_PROGRESS) || (rc == H_BUSY) || (H_IS_LONG_BUSY(rc))); |
| 299 | 299 | ||
| 300 | if (rc) | 300 | if (rc) |
| 301 | printk(KERN_ERR "ibmvscsi: Error %d enabling adapter\n", rc); | 301 | printk(KERN_ERR "ibmvscsi: Error %d enabling adapter\n", rc); |
| @@ -317,7 +317,7 @@ int ibmvscsi_reset_crq_queue(struct crq_queue *queue, | |||
| 317 | /* Close the CRQ */ | 317 | /* Close the CRQ */ |
| 318 | do { | 318 | do { |
| 319 | rc = plpar_hcall_norets(H_FREE_CRQ, vdev->unit_address); | 319 | rc = plpar_hcall_norets(H_FREE_CRQ, vdev->unit_address); |
| 320 | } while ((rc == H_Busy) || (H_isLongBusy(rc))); | 320 | } while ((rc == H_BUSY) || (H_IS_LONG_BUSY(rc))); |
| 321 | 321 | ||
| 322 | /* Clean out the queue */ | 322 | /* Clean out the queue */ |
| 323 | memset(queue->msgs, 0x00, PAGE_SIZE); | 323 | memset(queue->msgs, 0x00, PAGE_SIZE); |
diff --git a/include/asm-powerpc/eeh.h b/include/asm-powerpc/eeh.h index 5207758a6dd9..868c7139dbff 100644 --- a/include/asm-powerpc/eeh.h +++ b/include/asm-powerpc/eeh.h | |||
| @@ -60,24 +60,10 @@ void __init pci_addr_cache_build(void); | |||
| 60 | * device (including config space i/o). Call eeh_add_device_late | 60 | * device (including config space i/o). Call eeh_add_device_late |
| 61 | * to finish the eeh setup for this device. | 61 | * to finish the eeh setup for this device. |
| 62 | */ | 62 | */ |
| 63 | void eeh_add_device_early(struct device_node *); | ||
| 64 | void eeh_add_device_late(struct pci_dev *dev); | ||
| 65 | void eeh_add_device_tree_early(struct device_node *); | 63 | void eeh_add_device_tree_early(struct device_node *); |
| 66 | void eeh_add_device_tree_late(struct pci_bus *); | 64 | void eeh_add_device_tree_late(struct pci_bus *); |
| 67 | 65 | ||
| 68 | /** | 66 | /** |
| 69 | * eeh_remove_device - undo EEH setup for the indicated pci device | ||
| 70 | * @dev: pci device to be removed | ||
| 71 | * | ||
| 72 | * This routine should be called when a device is removed from | ||
| 73 | * a running system (e.g. by hotplug or dlpar). It unregisters | ||
| 74 | * the PCI device from the EEH subsystem. I/O errors affecting | ||
| 75 | * this device will no longer be detected after this call; thus, | ||
| 76 | * i/o errors affecting this slot may leave this device unusable. | ||
| 77 | */ | ||
| 78 | void eeh_remove_device(struct pci_dev *); | ||
| 79 | |||
| 80 | /** | ||
| 81 | * eeh_remove_device_recursive - undo EEH for device & children. | 67 | * eeh_remove_device_recursive - undo EEH for device & children. |
| 82 | * @dev: pci device to be removed | 68 | * @dev: pci device to be removed |
| 83 | * | 69 | * |
| @@ -116,12 +102,6 @@ static inline int eeh_dn_check_failure(struct device_node *dn, struct pci_dev *d | |||
| 116 | 102 | ||
| 117 | static inline void pci_addr_cache_build(void) { } | 103 | static inline void pci_addr_cache_build(void) { } |
| 118 | 104 | ||
| 119 | static inline void eeh_add_device_early(struct device_node *dn) { } | ||
| 120 | |||
| 121 | static inline void eeh_add_device_late(struct pci_dev *dev) { } | ||
| 122 | |||
| 123 | static inline void eeh_remove_device(struct pci_dev *dev) { } | ||
| 124 | |||
| 125 | static inline void eeh_add_device_tree_early(struct device_node *dn) { } | 105 | static inline void eeh_add_device_tree_early(struct device_node *dn) { } |
| 126 | 106 | ||
| 127 | static inline void eeh_add_device_tree_late(struct pci_bus *bus) { } | 107 | static inline void eeh_add_device_tree_late(struct pci_bus *bus) { } |
diff --git a/include/asm-powerpc/hvcall.h b/include/asm-powerpc/hvcall.h index b72c04f3f551..6cc7e1fb7bfd 100644 --- a/include/asm-powerpc/hvcall.h +++ b/include/asm-powerpc/hvcall.h | |||
| @@ -4,47 +4,88 @@ | |||
| 4 | 4 | ||
| 5 | #define HVSC .long 0x44000022 | 5 | #define HVSC .long 0x44000022 |
| 6 | 6 | ||
| 7 | #define H_Success 0 | 7 | #define H_SUCCESS 0 |
| 8 | #define H_Busy 1 /* Hardware busy -- retry later */ | 8 | #define H_BUSY 1 /* Hardware busy -- retry later */ |
| 9 | #define H_Closed 2 /* Resource closed */ | 9 | #define H_CLOSED 2 /* Resource closed */ |
| 10 | #define H_Constrained 4 /* Resource request constrained to max allowed */ | 10 | #define H_NOT_AVAILABLE 3 |
| 11 | #define H_InProgress 14 /* Kind of like busy */ | 11 | #define H_CONSTRAINED 4 /* Resource request constrained to max allowed */ |
| 12 | #define H_Pending 17 /* returned from H_POLL_PENDING */ | 12 | #define H_PARTIAL 5 |
| 13 | #define H_Continue 18 /* Returned from H_Join on success */ | 13 | #define H_IN_PROGRESS 14 /* Kind of like busy */ |
| 14 | #define H_LongBusyStartRange 9900 /* Start of long busy range */ | 14 | #define H_PAGE_REGISTERED 15 |
| 15 | #define H_LongBusyOrder1msec 9900 /* Long busy, hint that 1msec is a good time to retry */ | 15 | #define H_PARTIAL_STORE 16 |
| 16 | #define H_LongBusyOrder10msec 9901 /* Long busy, hint that 10msec is a good time to retry */ | 16 | #define H_PENDING 17 /* returned from H_POLL_PENDING */ |
| 17 | #define H_LongBusyOrder100msec 9902 /* Long busy, hint that 100msec is a good time to retry */ | 17 | #define H_CONTINUE 18 /* Returned from H_Join on success */ |
| 18 | #define H_LongBusyOrder1sec 9903 /* Long busy, hint that 1sec is a good time to retry */ | 18 | #define H_LONG_BUSY_START_RANGE 9900 /* Start of long busy range */ |
| 19 | #define H_LongBusyOrder10sec 9904 /* Long busy, hint that 10sec is a good time to retry */ | 19 | #define H_LONG_BUSY_ORDER_1_MSEC 9900 /* Long busy, hint that 1msec \ |
| 20 | #define H_LongBusyOrder100sec 9905 /* Long busy, hint that 100sec is a good time to retry */ | 20 | is a good time to retry */ |
| 21 | #define H_LongBusyEndRange 9905 /* End of long busy range */ | 21 | #define H_LONG_BUSY_ORDER_10_MSEC 9901 /* Long busy, hint that 10msec \ |
| 22 | #define H_Hardware -1 /* Hardware error */ | 22 | is a good time to retry */ |
| 23 | #define H_Function -2 /* Function not supported */ | 23 | #define H_LONG_BUSY_ORDER_100_MSEC 9902 /* Long busy, hint that 100msec \ |
| 24 | #define H_Privilege -3 /* Caller not privileged */ | 24 | is a good time to retry */ |
| 25 | #define H_Parameter -4 /* Parameter invalid, out-of-range or conflicting */ | 25 | #define H_LONG_BUSY_ORDER_1_SEC 9903 /* Long busy, hint that 1sec \ |
| 26 | #define H_Bad_Mode -5 /* Illegal msr value */ | 26 | is a good time to retry */ |
| 27 | #define H_PTEG_Full -6 /* PTEG is full */ | 27 | #define H_LONG_BUSY_ORDER_10_SEC 9904 /* Long busy, hint that 10sec \ |
| 28 | #define H_Not_Found -7 /* PTE was not found" */ | 28 | is a good time to retry */ |
| 29 | #define H_Reserved_DABR -8 /* DABR address is reserved by the hypervisor on this processor" */ | 29 | #define H_LONG_BUSY_ORDER_100_SEC 9905 /* Long busy, hint that 100sec \ |
| 30 | #define H_NoMem -9 | 30 | is a good time to retry */ |
| 31 | #define H_Authority -10 | 31 | #define H_LONG_BUSY_END_RANGE 9905 /* End of long busy range */ |
| 32 | #define H_Permission -11 | 32 | #define H_HARDWARE -1 /* Hardware error */ |
| 33 | #define H_Dropped -12 | 33 | #define H_FUNCTION -2 /* Function not supported */ |
| 34 | #define H_SourceParm -13 | 34 | #define H_PRIVILEGE -3 /* Caller not privileged */ |
| 35 | #define H_DestParm -14 | 35 | #define H_PARAMETER -4 /* Parameter invalid, out-of-range or conflicting */ |
| 36 | #define H_RemoteParm -15 | 36 | #define H_BAD_MODE -5 /* Illegal msr value */ |
| 37 | #define H_Resource -16 | 37 | #define H_PTEG_FULL -6 /* PTEG is full */ |
| 38 | #define H_NOT_FOUND -7 /* PTE was not found" */ | ||
| 39 | #define H_RESERVED_DABR -8 /* DABR address is reserved by the hypervisor on this processor" */ | ||
| 40 | #define H_NO_MEM -9 | ||
| 41 | #define H_AUTHORITY -10 | ||
| 42 | #define H_PERMISSION -11 | ||
| 43 | #define H_DROPPED -12 | ||
| 44 | #define H_SOURCE_PARM -13 | ||
| 45 | #define H_DEST_PARM -14 | ||
| 46 | #define H_REMOTE_PARM -15 | ||
| 47 | #define H_RESOURCE -16 | ||
| 48 | #define H_ADAPTER_PARM -17 | ||
| 49 | #define H_RH_PARM -18 | ||
| 50 | #define H_RCQ_PARM -19 | ||
| 51 | #define H_SCQ_PARM -20 | ||
| 52 | #define H_EQ_PARM -21 | ||
| 53 | #define H_RT_PARM -22 | ||
| 54 | #define H_ST_PARM -23 | ||
| 55 | #define H_SIGT_PARM -24 | ||
| 56 | #define H_TOKEN_PARM -25 | ||
| 57 | #define H_MLENGTH_PARM -27 | ||
| 58 | #define H_MEM_PARM -28 | ||
| 59 | #define H_MEM_ACCESS_PARM -29 | ||
| 60 | #define H_ATTR_PARM -30 | ||
| 61 | #define H_PORT_PARM -31 | ||
| 62 | #define H_MCG_PARM -32 | ||
| 63 | #define H_VL_PARM -33 | ||
| 64 | #define H_TSIZE_PARM -34 | ||
| 65 | #define H_TRACE_PARM -35 | ||
| 66 | |||
| 67 | #define H_MASK_PARM -37 | ||
| 68 | #define H_MCG_FULL -38 | ||
| 69 | #define H_ALIAS_EXIST -39 | ||
| 70 | #define H_P_COUNTER -40 | ||
| 71 | #define H_TABLE_FULL -41 | ||
| 72 | #define H_ALT_TABLE -42 | ||
| 73 | #define H_MR_CONDITION -43 | ||
| 74 | #define H_NOT_ENOUGH_RESOURCES -44 | ||
| 75 | #define H_R_STATE -45 | ||
| 76 | #define H_RESCINDEND -46 | ||
| 77 | |||
| 38 | 78 | ||
| 39 | /* Long Busy is a condition that can be returned by the firmware | 79 | /* Long Busy is a condition that can be returned by the firmware |
| 40 | * when a call cannot be completed now, but the identical call | 80 | * when a call cannot be completed now, but the identical call |
| 41 | * should be retried later. This prevents calls blocking in the | 81 | * should be retried later. This prevents calls blocking in the |
| 42 | * firmware for long periods of time. Annoyingly the firmware can return | 82 | * firmware for long periods of time. Annoyingly the firmware can return |
| 43 | * a range of return codes, hinting at how long we should wait before | 83 | * a range of return codes, hinting at how long we should wait before |
| 44 | * retrying. If you don't care for the hint, the macro below is a good | 84 | * retrying. If you don't care for the hint, the macro below is a good |
| 45 | * way to check for the long_busy return codes | 85 | * way to check for the long_busy return codes |
| 46 | */ | 86 | */ |
| 47 | #define H_isLongBusy(x) ((x >= H_LongBusyStartRange) && (x <= H_LongBusyEndRange)) | 87 | #define H_IS_LONG_BUSY(x) ((x >= H_LONG_BUSY_START_RANGE) \ |
| 88 | && (x <= H_LONG_BUSY_END_RANGE)) | ||
| 48 | 89 | ||
| 49 | /* Flags */ | 90 | /* Flags */ |
| 50 | #define H_LARGE_PAGE (1UL<<(63-16)) | 91 | #define H_LARGE_PAGE (1UL<<(63-16)) |
| @@ -66,6 +107,9 @@ | |||
| 66 | #define H_DABRX_KERNEL (1UL<<(63-62)) | 107 | #define H_DABRX_KERNEL (1UL<<(63-62)) |
| 67 | #define H_DABRX_USER (1UL<<(63-63)) | 108 | #define H_DABRX_USER (1UL<<(63-63)) |
| 68 | 109 | ||
| 110 | /* Each control block has to be on a 4K bondary */ | ||
| 111 | #define H_CB_ALIGNMENT 4096 | ||
| 112 | |||
| 69 | /* pSeries hypervisor opcodes */ | 113 | /* pSeries hypervisor opcodes */ |
| 70 | #define H_REMOVE 0x04 | 114 | #define H_REMOVE 0x04 |
| 71 | #define H_ENTER 0x08 | 115 | #define H_ENTER 0x08 |
| @@ -99,25 +143,52 @@ | |||
| 99 | #define H_PERFMON 0x7c | 143 | #define H_PERFMON 0x7c |
| 100 | #define H_MIGRATE_DMA 0x78 | 144 | #define H_MIGRATE_DMA 0x78 |
| 101 | #define H_REGISTER_VPA 0xDC | 145 | #define H_REGISTER_VPA 0xDC |
| 102 | #define H_CEDE 0xE0 | 146 | #define H_CEDE 0xE0 |
| 103 | #define H_CONFER 0xE4 | 147 | #define H_CONFER 0xE4 |
| 104 | #define H_PROD 0xE8 | 148 | #define H_PROD 0xE8 |
| 105 | #define H_GET_PPP 0xEC | 149 | #define H_GET_PPP 0xEC |
| 106 | #define H_SET_PPP 0xF0 | 150 | #define H_SET_PPP 0xF0 |
| 107 | #define H_PURR 0xF4 | 151 | #define H_PURR 0xF4 |
| 108 | #define H_PIC 0xF8 | 152 | #define H_PIC 0xF8 |
| 109 | #define H_REG_CRQ 0xFC | 153 | #define H_REG_CRQ 0xFC |
| 110 | #define H_FREE_CRQ 0x100 | 154 | #define H_FREE_CRQ 0x100 |
| 111 | #define H_VIO_SIGNAL 0x104 | 155 | #define H_VIO_SIGNAL 0x104 |
| 112 | #define H_SEND_CRQ 0x108 | 156 | #define H_SEND_CRQ 0x108 |
| 113 | #define H_COPY_RDMA 0x110 | 157 | #define H_COPY_RDMA 0x110 |
| 114 | #define H_SET_XDABR 0x134 | 158 | #define H_SET_XDABR 0x134 |
| 115 | #define H_STUFF_TCE 0x138 | 159 | #define H_STUFF_TCE 0x138 |
| 116 | #define H_PUT_TCE_INDIRECT 0x13C | 160 | #define H_PUT_TCE_INDIRECT 0x13C |
| 117 | #define H_VTERM_PARTNER_INFO 0x150 | 161 | #define H_VTERM_PARTNER_INFO 0x150 |
| 118 | #define H_REGISTER_VTERM 0x154 | 162 | #define H_REGISTER_VTERM 0x154 |
| 119 | #define H_FREE_VTERM 0x158 | 163 | #define H_FREE_VTERM 0x158 |
| 120 | #define H_POLL_PENDING 0x1D8 | 164 | #define H_RESET_EVENTS 0x15C |
| 165 | #define H_ALLOC_RESOURCE 0x160 | ||
| 166 | #define H_FREE_RESOURCE 0x164 | ||
| 167 | #define H_MODIFY_QP 0x168 | ||
| 168 | #define H_QUERY_QP 0x16C | ||
| 169 | #define H_REREGISTER_PMR 0x170 | ||
| 170 | #define H_REGISTER_SMR 0x174 | ||
| 171 | #define H_QUERY_MR 0x178 | ||
| 172 | #define H_QUERY_MW 0x17C | ||
| 173 | #define H_QUERY_HCA 0x180 | ||
| 174 | #define H_QUERY_PORT 0x184 | ||
| 175 | #define H_MODIFY_PORT 0x188 | ||
| 176 | #define H_DEFINE_AQP1 0x18C | ||
| 177 | #define H_GET_TRACE_BUFFER 0x190 | ||
| 178 | #define H_DEFINE_AQP0 0x194 | ||
| 179 | #define H_RESIZE_MR 0x198 | ||
| 180 | #define H_ATTACH_MCQP 0x19C | ||
| 181 | #define H_DETACH_MCQP 0x1A0 | ||
| 182 | #define H_CREATE_RPT 0x1A4 | ||
| 183 | #define H_REMOVE_RPT 0x1A8 | ||
| 184 | #define H_REGISTER_RPAGES 0x1AC | ||
| 185 | #define H_DISABLE_AND_GETC 0x1B0 | ||
| 186 | #define H_ERROR_DATA 0x1B4 | ||
| 187 | #define H_GET_HCA_INFO 0x1B8 | ||
| 188 | #define H_GET_PERF_COUNT 0x1BC | ||
| 189 | #define H_MANAGE_TRACE 0x1C0 | ||
| 190 | #define H_QUERY_INT_STATE 0x1E4 | ||
| 191 | #define H_POLL_PENDING 0x1D8 | ||
| 121 | #define H_JOIN 0x298 | 192 | #define H_JOIN 0x298 |
| 122 | #define H_ENABLE_CRQ 0x2B0 | 193 | #define H_ENABLE_CRQ 0x2B0 |
| 123 | 194 | ||
| @@ -152,7 +223,7 @@ long plpar_hcall_norets(unsigned long opcode, ...); | |||
| 152 | */ | 223 | */ |
| 153 | long plpar_hcall_8arg_2ret(unsigned long opcode, | 224 | long plpar_hcall_8arg_2ret(unsigned long opcode, |
| 154 | unsigned long arg1, | 225 | unsigned long arg1, |
| 155 | unsigned long arg2, | 226 | unsigned long arg2, |
| 156 | unsigned long arg3, | 227 | unsigned long arg3, |
| 157 | unsigned long arg4, | 228 | unsigned long arg4, |
| 158 | unsigned long arg5, | 229 | unsigned long arg5, |
| @@ -176,6 +247,42 @@ long plpar_hcall_4out(unsigned long opcode, | |||
| 176 | unsigned long *out3, | 247 | unsigned long *out3, |
| 177 | unsigned long *out4); | 248 | unsigned long *out4); |
| 178 | 249 | ||
| 250 | long plpar_hcall_7arg_7ret(unsigned long opcode, | ||
| 251 | unsigned long arg1, | ||
| 252 | unsigned long arg2, | ||
| 253 | unsigned long arg3, | ||
| 254 | unsigned long arg4, | ||
| 255 | unsigned long arg5, | ||
| 256 | unsigned long arg6, | ||
| 257 | unsigned long arg7, | ||
| 258 | unsigned long *out1, | ||
| 259 | unsigned long *out2, | ||
| 260 | unsigned long *out3, | ||
| 261 | unsigned long *out4, | ||
| 262 | unsigned long *out5, | ||
| 263 | unsigned long *out6, | ||
| 264 | unsigned long *out7); | ||
| 265 | |||
| 266 | long plpar_hcall_9arg_9ret(unsigned long opcode, | ||
| 267 | unsigned long arg1, | ||
| 268 | unsigned long arg2, | ||
| 269 | unsigned long arg3, | ||
| 270 | unsigned long arg4, | ||
| 271 | unsigned long arg5, | ||
| 272 | unsigned long arg6, | ||
| 273 | unsigned long arg7, | ||
| 274 | unsigned long arg8, | ||
| 275 | unsigned long arg9, | ||
| 276 | unsigned long *out1, | ||
| 277 | unsigned long *out2, | ||
| 278 | unsigned long *out3, | ||
| 279 | unsigned long *out4, | ||
| 280 | unsigned long *out5, | ||
| 281 | unsigned long *out6, | ||
| 282 | unsigned long *out7, | ||
| 283 | unsigned long *out8, | ||
| 284 | unsigned long *out9); | ||
| 285 | |||
| 179 | #endif /* __ASSEMBLY__ */ | 286 | #endif /* __ASSEMBLY__ */ |
| 180 | #endif /* __KERNEL__ */ | 287 | #endif /* __KERNEL__ */ |
| 181 | #endif /* _ASM_POWERPC_HVCALL_H */ | 288 | #endif /* _ASM_POWERPC_HVCALL_H */ |
