diff options
Diffstat (limited to 'arch/powerpc/include')
39 files changed, 731 insertions, 1732 deletions
diff --git a/arch/powerpc/include/asm/abs_addr.h b/arch/powerpc/include/asm/abs_addr.h index 5ab0b71531be..9d92ba04b033 100644 --- a/arch/powerpc/include/asm/abs_addr.h +++ b/arch/powerpc/include/asm/abs_addr.h | |||
@@ -17,7 +17,6 @@ | |||
17 | #include <asm/types.h> | 17 | #include <asm/types.h> |
18 | #include <asm/page.h> | 18 | #include <asm/page.h> |
19 | #include <asm/prom.h> | 19 | #include <asm/prom.h> |
20 | #include <asm/firmware.h> | ||
21 | 20 | ||
22 | struct mschunks_map { | 21 | struct mschunks_map { |
23 | unsigned long num_chunks; | 22 | unsigned long num_chunks; |
@@ -46,30 +45,12 @@ static inline unsigned long addr_to_chunk(unsigned long addr) | |||
46 | 45 | ||
47 | static inline unsigned long phys_to_abs(unsigned long pa) | 46 | static inline unsigned long phys_to_abs(unsigned long pa) |
48 | { | 47 | { |
49 | unsigned long chunk; | 48 | return pa; |
50 | |||
51 | /* This is a no-op on non-iSeries */ | ||
52 | if (!firmware_has_feature(FW_FEATURE_ISERIES)) | ||
53 | return pa; | ||
54 | |||
55 | chunk = addr_to_chunk(pa); | ||
56 | |||
57 | if (chunk < mschunks_map.num_chunks) | ||
58 | chunk = mschunks_map.mapping[chunk]; | ||
59 | |||
60 | return chunk_to_addr(chunk) + (pa & MSCHUNKS_OFFSET_MASK); | ||
61 | } | 49 | } |
62 | 50 | ||
63 | /* Convenience macros */ | 51 | /* Convenience macros */ |
64 | #define virt_to_abs(va) phys_to_abs(__pa(va)) | 52 | #define virt_to_abs(va) phys_to_abs(__pa(va)) |
65 | #define abs_to_virt(aa) __va(aa) | 53 | #define abs_to_virt(aa) __va(aa) |
66 | 54 | ||
67 | /* | ||
68 | * Converts Virtual Address to Real Address for | ||
69 | * Legacy iSeries Hypervisor calls | ||
70 | */ | ||
71 | #define iseries_hv_addr(virtaddr) \ | ||
72 | (0x8000000000000000UL | virt_to_abs(virtaddr)) | ||
73 | |||
74 | #endif /* __KERNEL__ */ | 55 | #endif /* __KERNEL__ */ |
75 | #endif /* _ASM_POWERPC_ABS_ADDR_H */ | 56 | #endif /* _ASM_POWERPC_ABS_ADDR_H */ |
diff --git a/arch/powerpc/include/asm/atomic.h b/arch/powerpc/include/asm/atomic.h index 02e41b53488d..14174e838ad9 100644 --- a/arch/powerpc/include/asm/atomic.h +++ b/arch/powerpc/include/asm/atomic.h | |||
@@ -212,6 +212,36 @@ static __inline__ int __atomic_add_unless(atomic_t *v, int a, int u) | |||
212 | return t; | 212 | return t; |
213 | } | 213 | } |
214 | 214 | ||
215 | /** | ||
216 | * atomic_inc_not_zero - increment unless the number is zero | ||
217 | * @v: pointer of type atomic_t | ||
218 | * | ||
219 | * Atomically increments @v by 1, so long as @v is non-zero. | ||
220 | * Returns non-zero if @v was non-zero, and zero otherwise. | ||
221 | */ | ||
222 | static __inline__ int atomic_inc_not_zero(atomic_t *v) | ||
223 | { | ||
224 | int t1, t2; | ||
225 | |||
226 | __asm__ __volatile__ ( | ||
227 | PPC_ATOMIC_ENTRY_BARRIER | ||
228 | "1: lwarx %0,0,%2 # atomic_inc_not_zero\n\ | ||
229 | cmpwi 0,%0,0\n\ | ||
230 | beq- 2f\n\ | ||
231 | addic %1,%0,1\n" | ||
232 | PPC405_ERR77(0,%2) | ||
233 | " stwcx. %1,0,%2\n\ | ||
234 | bne- 1b\n" | ||
235 | PPC_ATOMIC_EXIT_BARRIER | ||
236 | "\n\ | ||
237 | 2:" | ||
238 | : "=&r" (t1), "=&r" (t2) | ||
239 | : "r" (&v->counter) | ||
240 | : "cc", "xer", "memory"); | ||
241 | |||
242 | return t1; | ||
243 | } | ||
244 | #define atomic_inc_not_zero(v) atomic_inc_not_zero((v)) | ||
215 | 245 | ||
216 | #define atomic_sub_and_test(a, v) (atomic_sub_return((a), (v)) == 0) | 246 | #define atomic_sub_and_test(a, v) (atomic_sub_return((a), (v)) == 0) |
217 | #define atomic_dec_and_test(v) (atomic_dec_return((v)) == 0) | 247 | #define atomic_dec_and_test(v) (atomic_dec_return((v)) == 0) |
@@ -467,7 +497,34 @@ static __inline__ int atomic64_add_unless(atomic64_t *v, long a, long u) | |||
467 | return t != u; | 497 | return t != u; |
468 | } | 498 | } |
469 | 499 | ||
470 | #define atomic64_inc_not_zero(v) atomic64_add_unless((v), 1, 0) | 500 | /** |
501 | * atomic_inc64_not_zero - increment unless the number is zero | ||
502 | * @v: pointer of type atomic64_t | ||
503 | * | ||
504 | * Atomically increments @v by 1, so long as @v is non-zero. | ||
505 | * Returns non-zero if @v was non-zero, and zero otherwise. | ||
506 | */ | ||
507 | static __inline__ long atomic64_inc_not_zero(atomic64_t *v) | ||
508 | { | ||
509 | long t1, t2; | ||
510 | |||
511 | __asm__ __volatile__ ( | ||
512 | PPC_ATOMIC_ENTRY_BARRIER | ||
513 | "1: ldarx %0,0,%2 # atomic64_inc_not_zero\n\ | ||
514 | cmpdi 0,%0,0\n\ | ||
515 | beq- 2f\n\ | ||
516 | addic %1,%0,1\n\ | ||
517 | stdcx. %1,0,%2\n\ | ||
518 | bne- 1b\n" | ||
519 | PPC_ATOMIC_EXIT_BARRIER | ||
520 | "\n\ | ||
521 | 2:" | ||
522 | : "=&r" (t1), "=&r" (t2) | ||
523 | : "r" (&v->counter) | ||
524 | : "cc", "xer", "memory"); | ||
525 | |||
526 | return t1; | ||
527 | } | ||
471 | 528 | ||
472 | #endif /* __powerpc64__ */ | 529 | #endif /* __powerpc64__ */ |
473 | 530 | ||
diff --git a/arch/powerpc/include/asm/cputable.h b/arch/powerpc/include/asm/cputable.h index ad55a1ccb9fb..b9219e99bd2a 100644 --- a/arch/powerpc/include/asm/cputable.h +++ b/arch/powerpc/include/asm/cputable.h | |||
@@ -390,6 +390,10 @@ extern const char *powerpc_base_platform; | |||
390 | CPU_FTR_L2CSR | CPU_FTR_LWSYNC | CPU_FTR_NOEXECUTE | \ | 390 | CPU_FTR_L2CSR | CPU_FTR_LWSYNC | CPU_FTR_NOEXECUTE | \ |
391 | CPU_FTR_DBELL | CPU_FTR_POPCNTB | CPU_FTR_POPCNTD | \ | 391 | CPU_FTR_DBELL | CPU_FTR_POPCNTB | CPU_FTR_POPCNTD | \ |
392 | CPU_FTR_DEBUG_LVL_EXC) | 392 | CPU_FTR_DEBUG_LVL_EXC) |
393 | #define CPU_FTRS_E6500 (CPU_FTR_USE_TB | CPU_FTR_NODSISRALIGN | \ | ||
394 | CPU_FTR_L2CSR | CPU_FTR_LWSYNC | CPU_FTR_NOEXECUTE | \ | ||
395 | CPU_FTR_DBELL | CPU_FTR_POPCNTB | CPU_FTR_POPCNTD | \ | ||
396 | CPU_FTR_DEBUG_LVL_EXC) | ||
393 | #define CPU_FTRS_GENERIC_32 (CPU_FTR_COMMON | CPU_FTR_NODSISRALIGN) | 397 | #define CPU_FTRS_GENERIC_32 (CPU_FTR_COMMON | CPU_FTR_NODSISRALIGN) |
394 | 398 | ||
395 | /* 64-bit CPUs */ | 399 | /* 64-bit CPUs */ |
@@ -442,7 +446,7 @@ extern const char *powerpc_base_platform; | |||
442 | 446 | ||
443 | #ifdef __powerpc64__ | 447 | #ifdef __powerpc64__ |
444 | #ifdef CONFIG_PPC_BOOK3E | 448 | #ifdef CONFIG_PPC_BOOK3E |
445 | #define CPU_FTRS_POSSIBLE (CPU_FTRS_E5500 | CPU_FTRS_A2) | 449 | #define CPU_FTRS_POSSIBLE (CPU_FTRS_E6500 | CPU_FTRS_E5500 | CPU_FTRS_A2) |
446 | #else | 450 | #else |
447 | #define CPU_FTRS_POSSIBLE \ | 451 | #define CPU_FTRS_POSSIBLE \ |
448 | (CPU_FTRS_POWER3 | CPU_FTRS_RS64 | CPU_FTRS_POWER4 | \ | 452 | (CPU_FTRS_POWER3 | CPU_FTRS_RS64 | CPU_FTRS_POWER4 | \ |
@@ -483,7 +487,7 @@ enum { | |||
483 | #endif | 487 | #endif |
484 | #ifdef CONFIG_E500 | 488 | #ifdef CONFIG_E500 |
485 | CPU_FTRS_E500 | CPU_FTRS_E500_2 | CPU_FTRS_E500MC | | 489 | CPU_FTRS_E500 | CPU_FTRS_E500_2 | CPU_FTRS_E500MC | |
486 | CPU_FTRS_E5500 | | 490 | CPU_FTRS_E5500 | CPU_FTRS_E6500 | |
487 | #endif | 491 | #endif |
488 | 0, | 492 | 0, |
489 | }; | 493 | }; |
@@ -491,7 +495,7 @@ enum { | |||
491 | 495 | ||
492 | #ifdef __powerpc64__ | 496 | #ifdef __powerpc64__ |
493 | #ifdef CONFIG_PPC_BOOK3E | 497 | #ifdef CONFIG_PPC_BOOK3E |
494 | #define CPU_FTRS_ALWAYS (CPU_FTRS_E5500 & CPU_FTRS_A2) | 498 | #define CPU_FTRS_ALWAYS (CPU_FTRS_E6500 & CPU_FTRS_E5500 & CPU_FTRS_A2) |
495 | #else | 499 | #else |
496 | #define CPU_FTRS_ALWAYS \ | 500 | #define CPU_FTRS_ALWAYS \ |
497 | (CPU_FTRS_POWER3 & CPU_FTRS_RS64 & CPU_FTRS_POWER4 & \ | 501 | (CPU_FTRS_POWER3 & CPU_FTRS_RS64 & CPU_FTRS_POWER4 & \ |
@@ -528,7 +532,7 @@ enum { | |||
528 | #endif | 532 | #endif |
529 | #ifdef CONFIG_E500 | 533 | #ifdef CONFIG_E500 |
530 | CPU_FTRS_E500 & CPU_FTRS_E500_2 & CPU_FTRS_E500MC & | 534 | CPU_FTRS_E500 & CPU_FTRS_E500_2 & CPU_FTRS_E500MC & |
531 | CPU_FTRS_E5500 & | 535 | CPU_FTRS_E5500 & CPU_FTRS_E6500 & |
532 | #endif | 536 | #endif |
533 | CPU_FTRS_POSSIBLE, | 537 | CPU_FTRS_POSSIBLE, |
534 | }; | 538 | }; |
diff --git a/arch/powerpc/include/asm/device.h b/arch/powerpc/include/asm/device.h index d57c08acedfc..63d5ca49cece 100644 --- a/arch/powerpc/include/asm/device.h +++ b/arch/powerpc/include/asm/device.h | |||
@@ -31,6 +31,9 @@ struct dev_archdata { | |||
31 | #ifdef CONFIG_SWIOTLB | 31 | #ifdef CONFIG_SWIOTLB |
32 | dma_addr_t max_direct_dma_addr; | 32 | dma_addr_t max_direct_dma_addr; |
33 | #endif | 33 | #endif |
34 | #ifdef CONFIG_EEH | ||
35 | struct eeh_dev *edev; | ||
36 | #endif | ||
34 | }; | 37 | }; |
35 | 38 | ||
36 | struct pdev_archdata { | 39 | struct pdev_archdata { |
diff --git a/arch/powerpc/include/asm/dma.h b/arch/powerpc/include/asm/dma.h index a7e06e25c708..adadb9943610 100644 --- a/arch/powerpc/include/asm/dma.h +++ b/arch/powerpc/include/asm/dma.h | |||
@@ -34,8 +34,6 @@ | |||
34 | /* Doesn't really apply... */ | 34 | /* Doesn't really apply... */ |
35 | #define MAX_DMA_ADDRESS (~0UL) | 35 | #define MAX_DMA_ADDRESS (~0UL) |
36 | 36 | ||
37 | #if !defined(CONFIG_PPC_ISERIES) || defined(CONFIG_PCI) | ||
38 | |||
39 | #ifdef HAVE_REALLY_SLOW_DMA_CONTROLLER | 37 | #ifdef HAVE_REALLY_SLOW_DMA_CONTROLLER |
40 | #define dma_outb outb_p | 38 | #define dma_outb outb_p |
41 | #else | 39 | #else |
@@ -354,7 +352,5 @@ extern int isa_dma_bridge_buggy; | |||
354 | #define isa_dma_bridge_buggy (0) | 352 | #define isa_dma_bridge_buggy (0) |
355 | #endif | 353 | #endif |
356 | 354 | ||
357 | #endif /* !defined(CONFIG_PPC_ISERIES) || defined(CONFIG_PCI) */ | ||
358 | |||
359 | #endif /* __KERNEL__ */ | 355 | #endif /* __KERNEL__ */ |
360 | #endif /* _ASM_POWERPC_DMA_H */ | 356 | #endif /* _ASM_POWERPC_DMA_H */ |
diff --git a/arch/powerpc/include/asm/eeh.h b/arch/powerpc/include/asm/eeh.h index 66ea9b8b95c5..d60f99814ffb 100644 --- a/arch/powerpc/include/asm/eeh.h +++ b/arch/powerpc/include/asm/eeh.h | |||
@@ -1,6 +1,6 @@ | |||
1 | /* | 1 | /* |
2 | * eeh.h | ||
3 | * Copyright (C) 2001 Dave Engebretsen & Todd Inglett IBM Corporation. | 2 | * Copyright (C) 2001 Dave Engebretsen & Todd Inglett IBM Corporation. |
3 | * Copyright 2001-2012 IBM Corporation. | ||
4 | * | 4 | * |
5 | * This program is free software; you can redistribute it and/or modify | 5 | * This program is free software; you can redistribute it and/or modify |
6 | * it under the terms of the GNU General Public License as published by | 6 | * it under the terms of the GNU General Public License as published by |
@@ -31,44 +31,105 @@ struct device_node; | |||
31 | 31 | ||
32 | #ifdef CONFIG_EEH | 32 | #ifdef CONFIG_EEH |
33 | 33 | ||
34 | extern int eeh_subsystem_enabled; | 34 | /* |
35 | * The struct is used to trace EEH state for the associated | ||
36 | * PCI device node or PCI device. In future, it might | ||
37 | * represent PE as well so that the EEH device to form | ||
38 | * another tree except the currently existing tree of PCI | ||
39 | * buses and PCI devices | ||
40 | */ | ||
41 | #define EEH_MODE_SUPPORTED (1<<0) /* EEH supported on the device */ | ||
42 | #define EEH_MODE_NOCHECK (1<<1) /* EEH check should be skipped */ | ||
43 | #define EEH_MODE_ISOLATED (1<<2) /* The device has been isolated */ | ||
44 | #define EEH_MODE_RECOVERING (1<<3) /* Recovering the device */ | ||
45 | #define EEH_MODE_IRQ_DISABLED (1<<4) /* Interrupt disabled */ | ||
46 | |||
47 | struct eeh_dev { | ||
48 | int mode; /* EEH mode */ | ||
49 | int class_code; /* Class code of the device */ | ||
50 | int config_addr; /* Config address */ | ||
51 | int pe_config_addr; /* PE config address */ | ||
52 | int check_count; /* Times of ignored error */ | ||
53 | int freeze_count; /* Times of froze up */ | ||
54 | int false_positives; /* Times of reported #ff's */ | ||
55 | u32 config_space[16]; /* Saved PCI config space */ | ||
56 | struct pci_controller *phb; /* Associated PHB */ | ||
57 | struct device_node *dn; /* Associated device node */ | ||
58 | struct pci_dev *pdev; /* Associated PCI device */ | ||
59 | }; | ||
60 | |||
61 | static inline struct device_node *eeh_dev_to_of_node(struct eeh_dev *edev) | ||
62 | { | ||
63 | return edev->dn; | ||
64 | } | ||
65 | |||
66 | static inline struct pci_dev *eeh_dev_to_pci_dev(struct eeh_dev *edev) | ||
67 | { | ||
68 | return edev->pdev; | ||
69 | } | ||
35 | 70 | ||
36 | /* Values for eeh_mode bits in device_node */ | 71 | /* |
37 | #define EEH_MODE_SUPPORTED (1<<0) | 72 | * The struct is used to trace the registered EEH operation |
38 | #define EEH_MODE_NOCHECK (1<<1) | 73 | * callback functions. Actually, those operation callback |
39 | #define EEH_MODE_ISOLATED (1<<2) | 74 | * functions are heavily platform dependent. That means the |
40 | #define EEH_MODE_RECOVERING (1<<3) | 75 | * platform should register its own EEH operation callback |
41 | #define EEH_MODE_IRQ_DISABLED (1<<4) | 76 | * functions before any EEH further operations. |
77 | */ | ||
78 | #define EEH_OPT_DISABLE 0 /* EEH disable */ | ||
79 | #define EEH_OPT_ENABLE 1 /* EEH enable */ | ||
80 | #define EEH_OPT_THAW_MMIO 2 /* MMIO enable */ | ||
81 | #define EEH_OPT_THAW_DMA 3 /* DMA enable */ | ||
82 | #define EEH_STATE_UNAVAILABLE (1 << 0) /* State unavailable */ | ||
83 | #define EEH_STATE_NOT_SUPPORT (1 << 1) /* EEH not supported */ | ||
84 | #define EEH_STATE_RESET_ACTIVE (1 << 2) /* Active reset */ | ||
85 | #define EEH_STATE_MMIO_ACTIVE (1 << 3) /* Active MMIO */ | ||
86 | #define EEH_STATE_DMA_ACTIVE (1 << 4) /* Active DMA */ | ||
87 | #define EEH_STATE_MMIO_ENABLED (1 << 5) /* MMIO enabled */ | ||
88 | #define EEH_STATE_DMA_ENABLED (1 << 6) /* DMA enabled */ | ||
89 | #define EEH_RESET_DEACTIVATE 0 /* Deactivate the PE reset */ | ||
90 | #define EEH_RESET_HOT 1 /* Hot reset */ | ||
91 | #define EEH_RESET_FUNDAMENTAL 3 /* Fundamental reset */ | ||
92 | #define EEH_LOG_TEMP 1 /* EEH temporary error log */ | ||
93 | #define EEH_LOG_PERM 2 /* EEH permanent error log */ | ||
94 | |||
95 | struct eeh_ops { | ||
96 | char *name; | ||
97 | int (*init)(void); | ||
98 | int (*set_option)(struct device_node *dn, int option); | ||
99 | int (*get_pe_addr)(struct device_node *dn); | ||
100 | int (*get_state)(struct device_node *dn, int *state); | ||
101 | int (*reset)(struct device_node *dn, int option); | ||
102 | int (*wait_state)(struct device_node *dn, int max_wait); | ||
103 | int (*get_log)(struct device_node *dn, int severity, char *drv_log, unsigned long len); | ||
104 | int (*configure_bridge)(struct device_node *dn); | ||
105 | int (*read_config)(struct device_node *dn, int where, int size, u32 *val); | ||
106 | int (*write_config)(struct device_node *dn, int where, int size, u32 val); | ||
107 | }; | ||
108 | |||
109 | extern struct eeh_ops *eeh_ops; | ||
110 | extern int eeh_subsystem_enabled; | ||
42 | 111 | ||
43 | /* Max number of EEH freezes allowed before we consider the device | 112 | /* |
44 | * to be permanently disabled. */ | 113 | * Max number of EEH freezes allowed before we consider the device |
114 | * to be permanently disabled. | ||
115 | */ | ||
45 | #define EEH_MAX_ALLOWED_FREEZES 5 | 116 | #define EEH_MAX_ALLOWED_FREEZES 5 |
46 | 117 | ||
118 | void * __devinit eeh_dev_init(struct device_node *dn, void *data); | ||
119 | void __devinit eeh_dev_phb_init_dynamic(struct pci_controller *phb); | ||
120 | void __init eeh_dev_phb_init(void); | ||
47 | void __init eeh_init(void); | 121 | void __init eeh_init(void); |
122 | #ifdef CONFIG_PPC_PSERIES | ||
123 | int __init eeh_pseries_init(void); | ||
124 | #endif | ||
125 | int __init eeh_ops_register(struct eeh_ops *ops); | ||
126 | int __exit eeh_ops_unregister(const char *name); | ||
48 | unsigned long eeh_check_failure(const volatile void __iomem *token, | 127 | unsigned long eeh_check_failure(const volatile void __iomem *token, |
49 | unsigned long val); | 128 | unsigned long val); |
50 | int eeh_dn_check_failure(struct device_node *dn, struct pci_dev *dev); | 129 | int eeh_dn_check_failure(struct device_node *dn, struct pci_dev *dev); |
51 | void __init pci_addr_cache_build(void); | 130 | void __init pci_addr_cache_build(void); |
52 | |||
53 | /** | ||
54 | * eeh_add_device_early | ||
55 | * eeh_add_device_late | ||
56 | * | ||
57 | * Perform eeh initialization for devices added after boot. | ||
58 | * Call eeh_add_device_early before doing any i/o to the | ||
59 | * device (including config space i/o). Call eeh_add_device_late | ||
60 | * to finish the eeh setup for this device. | ||
61 | */ | ||
62 | void eeh_add_device_tree_early(struct device_node *); | 131 | void eeh_add_device_tree_early(struct device_node *); |
63 | void eeh_add_device_tree_late(struct pci_bus *); | 132 | void eeh_add_device_tree_late(struct pci_bus *); |
64 | |||
65 | /** | ||
66 | * eeh_remove_device_recursive - undo EEH for device & children. | ||
67 | * @dev: pci device to be removed | ||
68 | * | ||
69 | * As above, this removes the device; it also removes child | ||
70 | * pci devices as well. | ||
71 | */ | ||
72 | void eeh_remove_bus_device(struct pci_dev *); | 133 | void eeh_remove_bus_device(struct pci_dev *); |
73 | 134 | ||
74 | /** | 135 | /** |
@@ -87,8 +148,25 @@ void eeh_remove_bus_device(struct pci_dev *); | |||
87 | #define EEH_IO_ERROR_VALUE(size) (~0U >> ((4 - (size)) * 8)) | 148 | #define EEH_IO_ERROR_VALUE(size) (~0U >> ((4 - (size)) * 8)) |
88 | 149 | ||
89 | #else /* !CONFIG_EEH */ | 150 | #else /* !CONFIG_EEH */ |
151 | |||
152 | static inline void *eeh_dev_init(struct device_node *dn, void *data) | ||
153 | { | ||
154 | return NULL; | ||
155 | } | ||
156 | |||
157 | static inline void eeh_dev_phb_init_dynamic(struct pci_controller *phb) { } | ||
158 | |||
159 | static inline void eeh_dev_phb_init(void) { } | ||
160 | |||
90 | static inline void eeh_init(void) { } | 161 | static inline void eeh_init(void) { } |
91 | 162 | ||
163 | #ifdef CONFIG_PPC_PSERIES | ||
164 | static inline int eeh_pseries_init(void) | ||
165 | { | ||
166 | return 0; | ||
167 | } | ||
168 | #endif /* CONFIG_PPC_PSERIES */ | ||
169 | |||
92 | static inline unsigned long eeh_check_failure(const volatile void __iomem *token, unsigned long val) | 170 | static inline unsigned long eeh_check_failure(const volatile void __iomem *token, unsigned long val) |
93 | { | 171 | { |
94 | return val; | 172 | return val; |
diff --git a/arch/powerpc/include/asm/eeh_event.h b/arch/powerpc/include/asm/eeh_event.h index cc3cb04539ac..c68b012b7797 100644 --- a/arch/powerpc/include/asm/eeh_event.h +++ b/arch/powerpc/include/asm/eeh_event.h | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * eeh_event.h | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | 2 | * This program is free software; you can redistribute it and/or modify |
5 | * it under the terms of the GNU General Public License as published by | 3 | * it under the terms of the GNU General Public License as published by |
6 | * the Free Software Foundation; either version 2 of the License, or | 4 | * the Free Software Foundation; either version 2 of the License, or |
@@ -22,32 +20,19 @@ | |||
22 | #define ASM_POWERPC_EEH_EVENT_H | 20 | #define ASM_POWERPC_EEH_EVENT_H |
23 | #ifdef __KERNEL__ | 21 | #ifdef __KERNEL__ |
24 | 22 | ||
25 | /** EEH event -- structure holding pci controller data that describes | 23 | /* |
26 | * a change in the isolation status of a PCI slot. A pointer | 24 | * structure holding pci controller data that describes a |
27 | * to this struct is passed as the data pointer in a notify callback. | 25 | * change in the isolation status of a PCI slot. A pointer |
26 | * to this struct is passed as the data pointer in a notify | ||
27 | * callback. | ||
28 | */ | 28 | */ |
29 | struct eeh_event { | 29 | struct eeh_event { |
30 | struct list_head list; | 30 | struct list_head list; /* to form event queue */ |
31 | struct device_node *dn; /* struct device node */ | 31 | struct eeh_dev *edev; /* EEH device */ |
32 | struct pci_dev *dev; /* affected device */ | ||
33 | }; | 32 | }; |
34 | 33 | ||
35 | /** | 34 | int eeh_send_failure_event(struct eeh_dev *edev); |
36 | * eeh_send_failure_event - generate a PCI error event | 35 | struct eeh_dev *handle_eeh_events(struct eeh_event *); |
37 | * @dev pci device | ||
38 | * | ||
39 | * This routine builds a PCI error event which will be delivered | ||
40 | * to all listeners on the eeh_notifier_chain. | ||
41 | * | ||
42 | * This routine can be called within an interrupt context; | ||
43 | * the actual event will be delivered in a normal context | ||
44 | * (from a workqueue). | ||
45 | */ | ||
46 | int eeh_send_failure_event (struct device_node *dn, | ||
47 | struct pci_dev *dev); | ||
48 | |||
49 | /* Main recovery function */ | ||
50 | struct pci_dn * handle_eeh_events (struct eeh_event *); | ||
51 | 36 | ||
52 | #endif /* __KERNEL__ */ | 37 | #endif /* __KERNEL__ */ |
53 | #endif /* ASM_POWERPC_EEH_EVENT_H */ | 38 | #endif /* ASM_POWERPC_EEH_EVENT_H */ |
diff --git a/arch/powerpc/include/asm/exception-64s.h b/arch/powerpc/include/asm/exception-64s.h index 8057f4f6980f..548da3aa0a30 100644 --- a/arch/powerpc/include/asm/exception-64s.h +++ b/arch/powerpc/include/asm/exception-64s.h | |||
@@ -232,23 +232,30 @@ label##_hv: \ | |||
232 | EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, label##_common, \ | 232 | EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, label##_common, \ |
233 | EXC_HV, KVMTEST, vec) | 233 | EXC_HV, KVMTEST, vec) |
234 | 234 | ||
235 | #define __SOFTEN_TEST(h) \ | 235 | /* This associate vector numbers with bits in paca->irq_happened */ |
236 | #define SOFTEN_VALUE_0x500 PACA_IRQ_EE | ||
237 | #define SOFTEN_VALUE_0x502 PACA_IRQ_EE | ||
238 | #define SOFTEN_VALUE_0x900 PACA_IRQ_DEC | ||
239 | #define SOFTEN_VALUE_0x982 PACA_IRQ_DEC | ||
240 | |||
241 | #define __SOFTEN_TEST(h, vec) \ | ||
236 | lbz r10,PACASOFTIRQEN(r13); \ | 242 | lbz r10,PACASOFTIRQEN(r13); \ |
237 | cmpwi r10,0; \ | 243 | cmpwi r10,0; \ |
244 | li r10,SOFTEN_VALUE_##vec; \ | ||
238 | beq masked_##h##interrupt | 245 | beq masked_##h##interrupt |
239 | #define _SOFTEN_TEST(h) __SOFTEN_TEST(h) | 246 | #define _SOFTEN_TEST(h, vec) __SOFTEN_TEST(h, vec) |
240 | 247 | ||
241 | #define SOFTEN_TEST_PR(vec) \ | 248 | #define SOFTEN_TEST_PR(vec) \ |
242 | KVMTEST_PR(vec); \ | 249 | KVMTEST_PR(vec); \ |
243 | _SOFTEN_TEST(EXC_STD) | 250 | _SOFTEN_TEST(EXC_STD, vec) |
244 | 251 | ||
245 | #define SOFTEN_TEST_HV(vec) \ | 252 | #define SOFTEN_TEST_HV(vec) \ |
246 | KVMTEST(vec); \ | 253 | KVMTEST(vec); \ |
247 | _SOFTEN_TEST(EXC_HV) | 254 | _SOFTEN_TEST(EXC_HV, vec) |
248 | 255 | ||
249 | #define SOFTEN_TEST_HV_201(vec) \ | 256 | #define SOFTEN_TEST_HV_201(vec) \ |
250 | KVMTEST(vec); \ | 257 | KVMTEST(vec); \ |
251 | _SOFTEN_TEST(EXC_STD) | 258 | _SOFTEN_TEST(EXC_STD, vec) |
252 | 259 | ||
253 | #define __MASKABLE_EXCEPTION_PSERIES(vec, label, h, extra) \ | 260 | #define __MASKABLE_EXCEPTION_PSERIES(vec, label, h, extra) \ |
254 | HMT_MEDIUM; \ | 261 | HMT_MEDIUM; \ |
@@ -272,73 +279,55 @@ label##_hv: \ | |||
272 | _MASKABLE_EXCEPTION_PSERIES(vec, label, \ | 279 | _MASKABLE_EXCEPTION_PSERIES(vec, label, \ |
273 | EXC_HV, SOFTEN_TEST_HV) | 280 | EXC_HV, SOFTEN_TEST_HV) |
274 | 281 | ||
275 | #ifdef CONFIG_PPC_ISERIES | 282 | /* |
276 | #define DISABLE_INTS \ | 283 | * Our exception common code can be passed various "additions" |
277 | li r11,0; \ | 284 | * to specify the behaviour of interrupts, whether to kick the |
278 | stb r11,PACASOFTIRQEN(r13); \ | 285 | * runlatch, etc... |
279 | BEGIN_FW_FTR_SECTION; \ | 286 | */ |
280 | stb r11,PACAHARDIRQEN(r13); \ | 287 | |
281 | END_FW_FTR_SECTION_IFCLR(FW_FEATURE_ISERIES); \ | 288 | /* Exception addition: Hard disable interrupts */ |
282 | TRACE_DISABLE_INTS; \ | 289 | #define DISABLE_INTS SOFT_DISABLE_INTS(r10,r11) |
283 | BEGIN_FW_FTR_SECTION; \ | ||
284 | mfmsr r10; \ | ||
285 | ori r10,r10,MSR_EE; \ | ||
286 | mtmsrd r10,1; \ | ||
287 | END_FW_FTR_SECTION_IFSET(FW_FEATURE_ISERIES) | ||
288 | #else | ||
289 | #define DISABLE_INTS \ | ||
290 | li r11,0; \ | ||
291 | stb r11,PACASOFTIRQEN(r13); \ | ||
292 | stb r11,PACAHARDIRQEN(r13); \ | ||
293 | TRACE_DISABLE_INTS | ||
294 | #endif /* CONFIG_PPC_ISERIES */ | ||
295 | 290 | ||
291 | /* Exception addition: Keep interrupt state */ | ||
296 | #define ENABLE_INTS \ | 292 | #define ENABLE_INTS \ |
293 | ld r11,PACAKMSR(r13); \ | ||
297 | ld r12,_MSR(r1); \ | 294 | ld r12,_MSR(r1); \ |
298 | mfmsr r11; \ | ||
299 | rlwimi r11,r12,0,MSR_EE; \ | 295 | rlwimi r11,r12,0,MSR_EE; \ |
300 | mtmsrd r11,1 | 296 | mtmsrd r11,1 |
301 | 297 | ||
302 | #define STD_EXCEPTION_COMMON(trap, label, hdlr) \ | 298 | #define ADD_NVGPRS \ |
303 | .align 7; \ | 299 | bl .save_nvgprs |
304 | .globl label##_common; \ | 300 | |
305 | label##_common: \ | 301 | #define RUNLATCH_ON \ |
306 | EXCEPTION_PROLOG_COMMON(trap, PACA_EXGEN); \ | 302 | BEGIN_FTR_SECTION \ |
307 | DISABLE_INTS; \ | 303 | clrrdi r3,r1,THREAD_SHIFT; \ |
308 | bl .save_nvgprs; \ | 304 | ld r4,TI_LOCAL_FLAGS(r3); \ |
309 | addi r3,r1,STACK_FRAME_OVERHEAD; \ | 305 | andi. r0,r4,_TLF_RUNLATCH; \ |
310 | bl hdlr; \ | 306 | beql ppc64_runlatch_on_trampoline; \ |
311 | b .ret_from_except | 307 | END_FTR_SECTION_IFSET(CPU_FTR_CTRL) |
308 | |||
309 | #define EXCEPTION_COMMON(trap, label, hdlr, ret, additions) \ | ||
310 | .align 7; \ | ||
311 | .globl label##_common; \ | ||
312 | label##_common: \ | ||
313 | EXCEPTION_PROLOG_COMMON(trap, PACA_EXGEN); \ | ||
314 | additions; \ | ||
315 | addi r3,r1,STACK_FRAME_OVERHEAD; \ | ||
316 | bl hdlr; \ | ||
317 | b ret | ||
318 | |||
319 | #define STD_EXCEPTION_COMMON(trap, label, hdlr) \ | ||
320 | EXCEPTION_COMMON(trap, label, hdlr, ret_from_except, \ | ||
321 | ADD_NVGPRS;DISABLE_INTS) | ||
312 | 322 | ||
313 | /* | 323 | /* |
314 | * Like STD_EXCEPTION_COMMON, but for exceptions that can occur | 324 | * Like STD_EXCEPTION_COMMON, but for exceptions that can occur |
315 | * in the idle task and therefore need the special idle handling. | 325 | * in the idle task and therefore need the special idle handling |
326 | * (finish nap and runlatch) | ||
316 | */ | 327 | */ |
317 | #define STD_EXCEPTION_COMMON_IDLE(trap, label, hdlr) \ | 328 | #define STD_EXCEPTION_COMMON_ASYNC(trap, label, hdlr) \ |
318 | .align 7; \ | 329 | EXCEPTION_COMMON(trap, label, hdlr, ret_from_except_lite, \ |
319 | .globl label##_common; \ | 330 | FINISH_NAP;RUNLATCH_ON;DISABLE_INTS) |
320 | label##_common: \ | ||
321 | EXCEPTION_PROLOG_COMMON(trap, PACA_EXGEN); \ | ||
322 | FINISH_NAP; \ | ||
323 | DISABLE_INTS; \ | ||
324 | bl .save_nvgprs; \ | ||
325 | addi r3,r1,STACK_FRAME_OVERHEAD; \ | ||
326 | bl hdlr; \ | ||
327 | b .ret_from_except | ||
328 | |||
329 | #define STD_EXCEPTION_COMMON_LITE(trap, label, hdlr) \ | ||
330 | .align 7; \ | ||
331 | .globl label##_common; \ | ||
332 | label##_common: \ | ||
333 | EXCEPTION_PROLOG_COMMON(trap, PACA_EXGEN); \ | ||
334 | FINISH_NAP; \ | ||
335 | DISABLE_INTS; \ | ||
336 | BEGIN_FTR_SECTION \ | ||
337 | bl .ppc64_runlatch_on; \ | ||
338 | END_FTR_SECTION_IFSET(CPU_FTR_CTRL) \ | ||
339 | addi r3,r1,STACK_FRAME_OVERHEAD; \ | ||
340 | bl hdlr; \ | ||
341 | b .ret_from_except_lite | ||
342 | 331 | ||
343 | /* | 332 | /* |
344 | * When the idle code in power4_idle puts the CPU into NAP mode, | 333 | * When the idle code in power4_idle puts the CPU into NAP mode, |
diff --git a/arch/powerpc/include/asm/fadump.h b/arch/powerpc/include/asm/fadump.h new file mode 100644 index 000000000000..88dbf9659185 --- /dev/null +++ b/arch/powerpc/include/asm/fadump.h | |||
@@ -0,0 +1,218 @@ | |||
1 | /* | ||
2 | * Firmware Assisted dump header file. | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License as published by | ||
6 | * the Free Software Foundation; either version 2 of the License, or | ||
7 | * (at your option) any later version. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License | ||
15 | * along with this program; if not, write to the Free Software | ||
16 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
17 | * | ||
18 | * Copyright 2011 IBM Corporation | ||
19 | * Author: Mahesh Salgaonkar <mahesh@linux.vnet.ibm.com> | ||
20 | */ | ||
21 | |||
22 | #ifndef __PPC64_FA_DUMP_H__ | ||
23 | #define __PPC64_FA_DUMP_H__ | ||
24 | |||
25 | #ifdef CONFIG_FA_DUMP | ||
26 | |||
27 | /* | ||
28 | * The RMA region will be saved for later dumping when kernel crashes. | ||
29 | * RMA is Real Mode Area, the first block of logical memory address owned | ||
30 | * by logical partition, containing the storage that may be accessed with | ||
31 | * translate off. | ||
32 | */ | ||
33 | #define RMA_START 0x0 | ||
34 | #define RMA_END (ppc64_rma_size) | ||
35 | |||
36 | /* | ||
37 | * On some Power systems where RMO is 128MB, it still requires minimum of | ||
38 | * 256MB for kernel to boot successfully. When kdump infrastructure is | ||
39 | * configured to save vmcore over network, we run into OOM issue while | ||
40 | * loading modules related to network setup. Hence we need aditional 64M | ||
41 | * of memory to avoid OOM issue. | ||
42 | */ | ||
43 | #define MIN_BOOT_MEM (((RMA_END < (0x1UL << 28)) ? (0x1UL << 28) : RMA_END) \ | ||
44 | + (0x1UL << 26)) | ||
45 | |||
46 | #define memblock_num_regions(memblock_type) (memblock.memblock_type.cnt) | ||
47 | |||
48 | #ifndef ELF_CORE_EFLAGS | ||
49 | #define ELF_CORE_EFLAGS 0 | ||
50 | #endif | ||
51 | |||
52 | /* Firmware provided dump sections */ | ||
53 | #define FADUMP_CPU_STATE_DATA 0x0001 | ||
54 | #define FADUMP_HPTE_REGION 0x0002 | ||
55 | #define FADUMP_REAL_MODE_REGION 0x0011 | ||
56 | |||
57 | /* Dump request flag */ | ||
58 | #define FADUMP_REQUEST_FLAG 0x00000001 | ||
59 | |||
60 | /* FAD commands */ | ||
61 | #define FADUMP_REGISTER 1 | ||
62 | #define FADUMP_UNREGISTER 2 | ||
63 | #define FADUMP_INVALIDATE 3 | ||
64 | |||
65 | /* Dump status flag */ | ||
66 | #define FADUMP_ERROR_FLAG 0x2000 | ||
67 | |||
68 | #define FADUMP_CPU_ID_MASK ((1UL << 32) - 1) | ||
69 | |||
70 | #define CPU_UNKNOWN (~((u32)0)) | ||
71 | |||
72 | /* Utility macros */ | ||
73 | #define SKIP_TO_NEXT_CPU(reg_entry) \ | ||
74 | ({ \ | ||
75 | while (reg_entry->reg_id != REG_ID("CPUEND")) \ | ||
76 | reg_entry++; \ | ||
77 | reg_entry++; \ | ||
78 | }) | ||
79 | |||
80 | /* Kernel Dump section info */ | ||
81 | struct fadump_section { | ||
82 | u32 request_flag; | ||
83 | u16 source_data_type; | ||
84 | u16 error_flags; | ||
85 | u64 source_address; | ||
86 | u64 source_len; | ||
87 | u64 bytes_dumped; | ||
88 | u64 destination_address; | ||
89 | }; | ||
90 | |||
91 | /* ibm,configure-kernel-dump header. */ | ||
92 | struct fadump_section_header { | ||
93 | u32 dump_format_version; | ||
94 | u16 dump_num_sections; | ||
95 | u16 dump_status_flag; | ||
96 | u32 offset_first_dump_section; | ||
97 | |||
98 | /* Fields for disk dump option. */ | ||
99 | u32 dd_block_size; | ||
100 | u64 dd_block_offset; | ||
101 | u64 dd_num_blocks; | ||
102 | u32 dd_offset_disk_path; | ||
103 | |||
104 | /* Maximum time allowed to prevent an automatic dump-reboot. */ | ||
105 | u32 max_time_auto; | ||
106 | }; | ||
107 | |||
108 | /* | ||
109 | * Firmware Assisted dump memory structure. This structure is required for | ||
110 | * registering future kernel dump with power firmware through rtas call. | ||
111 | * | ||
112 | * No disk dump option. Hence disk dump path string section is not included. | ||
113 | */ | ||
114 | struct fadump_mem_struct { | ||
115 | struct fadump_section_header header; | ||
116 | |||
117 | /* Kernel dump sections */ | ||
118 | struct fadump_section cpu_state_data; | ||
119 | struct fadump_section hpte_region; | ||
120 | struct fadump_section rmr_region; | ||
121 | }; | ||
122 | |||
123 | /* Firmware-assisted dump configuration details. */ | ||
124 | struct fw_dump { | ||
125 | unsigned long cpu_state_data_size; | ||
126 | unsigned long hpte_region_size; | ||
127 | unsigned long boot_memory_size; | ||
128 | unsigned long reserve_dump_area_start; | ||
129 | unsigned long reserve_dump_area_size; | ||
130 | /* cmd line option during boot */ | ||
131 | unsigned long reserve_bootvar; | ||
132 | |||
133 | unsigned long fadumphdr_addr; | ||
134 | unsigned long cpu_notes_buf; | ||
135 | unsigned long cpu_notes_buf_size; | ||
136 | |||
137 | int ibm_configure_kernel_dump; | ||
138 | |||
139 | unsigned long fadump_enabled:1; | ||
140 | unsigned long fadump_supported:1; | ||
141 | unsigned long dump_active:1; | ||
142 | unsigned long dump_registered:1; | ||
143 | }; | ||
144 | |||
145 | /* | ||
146 | * Copy the ascii values for first 8 characters from a string into u64 | ||
147 | * variable at their respective indexes. | ||
148 | * e.g. | ||
149 | * The string "FADMPINF" will be converted into 0x4641444d50494e46 | ||
150 | */ | ||
151 | static inline u64 str_to_u64(const char *str) | ||
152 | { | ||
153 | u64 val = 0; | ||
154 | int i; | ||
155 | |||
156 | for (i = 0; i < sizeof(val); i++) | ||
157 | val = (*str) ? (val << 8) | *str++ : val << 8; | ||
158 | return val; | ||
159 | } | ||
160 | #define STR_TO_HEX(x) str_to_u64(x) | ||
161 | #define REG_ID(x) str_to_u64(x) | ||
162 | |||
163 | #define FADUMP_CRASH_INFO_MAGIC STR_TO_HEX("FADMPINF") | ||
164 | #define REGSAVE_AREA_MAGIC STR_TO_HEX("REGSAVE") | ||
165 | |||
166 | /* The firmware-assisted dump format. | ||
167 | * | ||
168 | * The register save area is an area in the partition's memory used to preserve | ||
169 | * the register contents (CPU state data) for the active CPUs during a firmware | ||
170 | * assisted dump. The dump format contains register save area header followed | ||
171 | * by register entries. Each list of registers for a CPU starts with | ||
172 | * "CPUSTRT" and ends with "CPUEND". | ||
173 | */ | ||
174 | |||
175 | /* Register save area header. */ | ||
176 | struct fadump_reg_save_area_header { | ||
177 | u64 magic_number; | ||
178 | u32 version; | ||
179 | u32 num_cpu_offset; | ||
180 | }; | ||
181 | |||
182 | /* Register entry. */ | ||
183 | struct fadump_reg_entry { | ||
184 | u64 reg_id; | ||
185 | u64 reg_value; | ||
186 | }; | ||
187 | |||
188 | /* fadump crash info structure */ | ||
189 | struct fadump_crash_info_header { | ||
190 | u64 magic_number; | ||
191 | u64 elfcorehdr_addr; | ||
192 | u32 crashing_cpu; | ||
193 | struct pt_regs regs; | ||
194 | struct cpumask cpu_online_mask; | ||
195 | }; | ||
196 | |||
197 | /* Crash memory ranges */ | ||
198 | #define INIT_CRASHMEM_RANGES (INIT_MEMBLOCK_REGIONS + 2) | ||
199 | |||
200 | struct fad_crash_memory_ranges { | ||
201 | unsigned long long base; | ||
202 | unsigned long long size; | ||
203 | }; | ||
204 | |||
205 | extern int early_init_dt_scan_fw_dump(unsigned long node, | ||
206 | const char *uname, int depth, void *data); | ||
207 | extern int fadump_reserve_mem(void); | ||
208 | extern int setup_fadump(void); | ||
209 | extern int is_fadump_active(void); | ||
210 | extern void crash_fadump(struct pt_regs *, const char *); | ||
211 | extern void fadump_cleanup(void); | ||
212 | |||
213 | extern void vmcore_cleanup(void); | ||
214 | #else /* CONFIG_FA_DUMP */ | ||
215 | static inline int is_fadump_active(void) { return 0; } | ||
216 | static inline void crash_fadump(struct pt_regs *regs, const char *str) { } | ||
217 | #endif | ||
218 | #endif | ||
diff --git a/arch/powerpc/include/asm/firmware.h b/arch/powerpc/include/asm/firmware.h index 14db29b18d0e..ad0b751b0d78 100644 --- a/arch/powerpc/include/asm/firmware.h +++ b/arch/powerpc/include/asm/firmware.h | |||
@@ -41,7 +41,6 @@ | |||
41 | #define FW_FEATURE_XDABR ASM_CONST(0x0000000000040000) | 41 | #define FW_FEATURE_XDABR ASM_CONST(0x0000000000040000) |
42 | #define FW_FEATURE_MULTITCE ASM_CONST(0x0000000000080000) | 42 | #define FW_FEATURE_MULTITCE ASM_CONST(0x0000000000080000) |
43 | #define FW_FEATURE_SPLPAR ASM_CONST(0x0000000000100000) | 43 | #define FW_FEATURE_SPLPAR ASM_CONST(0x0000000000100000) |
44 | #define FW_FEATURE_ISERIES ASM_CONST(0x0000000000200000) | ||
45 | #define FW_FEATURE_LPAR ASM_CONST(0x0000000000400000) | 44 | #define FW_FEATURE_LPAR ASM_CONST(0x0000000000400000) |
46 | #define FW_FEATURE_PS3_LV1 ASM_CONST(0x0000000000800000) | 45 | #define FW_FEATURE_PS3_LV1 ASM_CONST(0x0000000000800000) |
47 | #define FW_FEATURE_BEAT ASM_CONST(0x0000000001000000) | 46 | #define FW_FEATURE_BEAT ASM_CONST(0x0000000001000000) |
@@ -65,8 +64,6 @@ enum { | |||
65 | FW_FEATURE_MULTITCE | FW_FEATURE_SPLPAR | FW_FEATURE_LPAR | | 64 | FW_FEATURE_MULTITCE | FW_FEATURE_SPLPAR | FW_FEATURE_LPAR | |
66 | FW_FEATURE_CMO | FW_FEATURE_VPHN | FW_FEATURE_XCMO, | 65 | FW_FEATURE_CMO | FW_FEATURE_VPHN | FW_FEATURE_XCMO, |
67 | FW_FEATURE_PSERIES_ALWAYS = 0, | 66 | FW_FEATURE_PSERIES_ALWAYS = 0, |
68 | FW_FEATURE_ISERIES_POSSIBLE = FW_FEATURE_ISERIES | FW_FEATURE_LPAR, | ||
69 | FW_FEATURE_ISERIES_ALWAYS = FW_FEATURE_ISERIES | FW_FEATURE_LPAR, | ||
70 | FW_FEATURE_POWERNV_POSSIBLE = FW_FEATURE_OPAL | FW_FEATURE_OPALv2, | 67 | FW_FEATURE_POWERNV_POSSIBLE = FW_FEATURE_OPAL | FW_FEATURE_OPALv2, |
71 | FW_FEATURE_POWERNV_ALWAYS = 0, | 68 | FW_FEATURE_POWERNV_ALWAYS = 0, |
72 | FW_FEATURE_PS3_POSSIBLE = FW_FEATURE_LPAR | FW_FEATURE_PS3_LV1, | 69 | FW_FEATURE_PS3_POSSIBLE = FW_FEATURE_LPAR | FW_FEATURE_PS3_LV1, |
@@ -79,9 +76,6 @@ enum { | |||
79 | #ifdef CONFIG_PPC_PSERIES | 76 | #ifdef CONFIG_PPC_PSERIES |
80 | FW_FEATURE_PSERIES_POSSIBLE | | 77 | FW_FEATURE_PSERIES_POSSIBLE | |
81 | #endif | 78 | #endif |
82 | #ifdef CONFIG_PPC_ISERIES | ||
83 | FW_FEATURE_ISERIES_POSSIBLE | | ||
84 | #endif | ||
85 | #ifdef CONFIG_PPC_POWERNV | 79 | #ifdef CONFIG_PPC_POWERNV |
86 | FW_FEATURE_POWERNV_POSSIBLE | | 80 | FW_FEATURE_POWERNV_POSSIBLE | |
87 | #endif | 81 | #endif |
@@ -99,9 +93,6 @@ enum { | |||
99 | #ifdef CONFIG_PPC_PSERIES | 93 | #ifdef CONFIG_PPC_PSERIES |
100 | FW_FEATURE_PSERIES_ALWAYS & | 94 | FW_FEATURE_PSERIES_ALWAYS & |
101 | #endif | 95 | #endif |
102 | #ifdef CONFIG_PPC_ISERIES | ||
103 | FW_FEATURE_ISERIES_ALWAYS & | ||
104 | #endif | ||
105 | #ifdef CONFIG_PPC_POWERNV | 96 | #ifdef CONFIG_PPC_POWERNV |
106 | FW_FEATURE_POWERNV_ALWAYS & | 97 | FW_FEATURE_POWERNV_ALWAYS & |
107 | #endif | 98 | #endif |
diff --git a/arch/powerpc/include/asm/fsl_guts.h b/arch/powerpc/include/asm/fsl_guts.h index bebd12463ec9..ce04530d2000 100644 --- a/arch/powerpc/include/asm/fsl_guts.h +++ b/arch/powerpc/include/asm/fsl_guts.h | |||
@@ -4,7 +4,7 @@ | |||
4 | * Authors: Jeff Brown | 4 | * Authors: Jeff Brown |
5 | * Timur Tabi <timur@freescale.com> | 5 | * Timur Tabi <timur@freescale.com> |
6 | * | 6 | * |
7 | * Copyright 2004,2007 Freescale Semiconductor, Inc | 7 | * Copyright 2004,2007,2012 Freescale Semiconductor, Inc |
8 | * | 8 | * |
9 | * This program is free software; you can redistribute it and/or modify it | 9 | * This program is free software; you can redistribute it and/or modify it |
10 | * under the terms of the GNU General Public License as published by the | 10 | * under the terms of the GNU General Public License as published by the |
@@ -114,6 +114,10 @@ struct ccsr_guts_86xx { | |||
114 | __be32 srds2cr1; /* 0x.0f44 - SerDes2 Control Register 0 */ | 114 | __be32 srds2cr1; /* 0x.0f44 - SerDes2 Control Register 0 */ |
115 | } __attribute__ ((packed)); | 115 | } __attribute__ ((packed)); |
116 | 116 | ||
117 | |||
118 | /* Alternate function signal multiplex control */ | ||
119 | #define MPC85xx_PMUXCR_QE(x) (0x8000 >> (x)) | ||
120 | |||
117 | #ifdef CONFIG_PPC_86xx | 121 | #ifdef CONFIG_PPC_86xx |
118 | 122 | ||
119 | #define CCSR_GUTS_DMACR_DEV_SSI 0 /* DMA controller/channel set to SSI */ | 123 | #define CCSR_GUTS_DMACR_DEV_SSI 0 /* DMA controller/channel set to SSI */ |
diff --git a/arch/powerpc/include/asm/hw_irq.h b/arch/powerpc/include/asm/hw_irq.h index bb712c9488b3..51010bfc792e 100644 --- a/arch/powerpc/include/asm/hw_irq.h +++ b/arch/powerpc/include/asm/hw_irq.h | |||
@@ -11,6 +11,27 @@ | |||
11 | #include <asm/ptrace.h> | 11 | #include <asm/ptrace.h> |
12 | #include <asm/processor.h> | 12 | #include <asm/processor.h> |
13 | 13 | ||
14 | #ifdef CONFIG_PPC64 | ||
15 | |||
16 | /* | ||
17 | * PACA flags in paca->irq_happened. | ||
18 | * | ||
19 | * This bits are set when interrupts occur while soft-disabled | ||
20 | * and allow a proper replay. Additionally, PACA_IRQ_HARD_DIS | ||
21 | * is set whenever we manually hard disable. | ||
22 | */ | ||
23 | #define PACA_IRQ_HARD_DIS 0x01 | ||
24 | #define PACA_IRQ_DBELL 0x02 | ||
25 | #define PACA_IRQ_EE 0x04 | ||
26 | #define PACA_IRQ_DEC 0x08 /* Or FIT */ | ||
27 | #define PACA_IRQ_EE_EDGE 0x10 /* BookE only */ | ||
28 | |||
29 | #endif /* CONFIG_PPC64 */ | ||
30 | |||
31 | #ifndef __ASSEMBLY__ | ||
32 | |||
33 | extern void __replay_interrupt(unsigned int vector); | ||
34 | |||
14 | extern void timer_interrupt(struct pt_regs *); | 35 | extern void timer_interrupt(struct pt_regs *); |
15 | 36 | ||
16 | #ifdef CONFIG_PPC64 | 37 | #ifdef CONFIG_PPC64 |
@@ -42,7 +63,6 @@ static inline unsigned long arch_local_irq_disable(void) | |||
42 | } | 63 | } |
43 | 64 | ||
44 | extern void arch_local_irq_restore(unsigned long); | 65 | extern void arch_local_irq_restore(unsigned long); |
45 | extern void iseries_handle_interrupts(void); | ||
46 | 66 | ||
47 | static inline void arch_local_irq_enable(void) | 67 | static inline void arch_local_irq_enable(void) |
48 | { | 68 | { |
@@ -68,16 +88,33 @@ static inline bool arch_irqs_disabled(void) | |||
68 | #define __hard_irq_enable() asm volatile("wrteei 1" : : : "memory"); | 88 | #define __hard_irq_enable() asm volatile("wrteei 1" : : : "memory"); |
69 | #define __hard_irq_disable() asm volatile("wrteei 0" : : : "memory"); | 89 | #define __hard_irq_disable() asm volatile("wrteei 0" : : : "memory"); |
70 | #else | 90 | #else |
71 | #define __hard_irq_enable() __mtmsrd(mfmsr() | MSR_EE, 1) | 91 | #define __hard_irq_enable() __mtmsrd(local_paca->kernel_msr | MSR_EE, 1) |
72 | #define __hard_irq_disable() __mtmsrd(mfmsr() & ~MSR_EE, 1) | 92 | #define __hard_irq_disable() __mtmsrd(local_paca->kernel_msr, 1) |
73 | #endif | 93 | #endif |
74 | 94 | ||
75 | #define hard_irq_disable() \ | 95 | static inline void hard_irq_disable(void) |
76 | do { \ | 96 | { |
77 | __hard_irq_disable(); \ | 97 | __hard_irq_disable(); |
78 | get_paca()->soft_enabled = 0; \ | 98 | get_paca()->soft_enabled = 0; |
79 | get_paca()->hard_enabled = 0; \ | 99 | get_paca()->irq_happened |= PACA_IRQ_HARD_DIS; |
80 | } while(0) | 100 | } |
101 | |||
102 | /* | ||
103 | * This is called by asynchronous interrupts to conditionally | ||
104 | * re-enable hard interrupts when soft-disabled after having | ||
105 | * cleared the source of the interrupt | ||
106 | */ | ||
107 | static inline void may_hard_irq_enable(void) | ||
108 | { | ||
109 | get_paca()->irq_happened &= ~PACA_IRQ_HARD_DIS; | ||
110 | if (!(get_paca()->irq_happened & PACA_IRQ_EE)) | ||
111 | __hard_irq_enable(); | ||
112 | } | ||
113 | |||
114 | static inline bool arch_irq_disabled_regs(struct pt_regs *regs) | ||
115 | { | ||
116 | return !regs->softe; | ||
117 | } | ||
81 | 118 | ||
82 | #else /* CONFIG_PPC64 */ | 119 | #else /* CONFIG_PPC64 */ |
83 | 120 | ||
@@ -139,6 +176,13 @@ static inline bool arch_irqs_disabled(void) | |||
139 | 176 | ||
140 | #define hard_irq_disable() arch_local_irq_disable() | 177 | #define hard_irq_disable() arch_local_irq_disable() |
141 | 178 | ||
179 | static inline bool arch_irq_disabled_regs(struct pt_regs *regs) | ||
180 | { | ||
181 | return !(regs->msr & MSR_EE); | ||
182 | } | ||
183 | |||
184 | static inline void may_hard_irq_enable(void) { } | ||
185 | |||
142 | #endif /* CONFIG_PPC64 */ | 186 | #endif /* CONFIG_PPC64 */ |
143 | 187 | ||
144 | #define ARCH_IRQ_INIT_FLAGS IRQ_NOREQUEST | 188 | #define ARCH_IRQ_INIT_FLAGS IRQ_NOREQUEST |
@@ -149,5 +193,6 @@ static inline bool arch_irqs_disabled(void) | |||
149 | */ | 193 | */ |
150 | struct irq_chip; | 194 | struct irq_chip; |
151 | 195 | ||
196 | #endif /* __ASSEMBLY__ */ | ||
152 | #endif /* __KERNEL__ */ | 197 | #endif /* __KERNEL__ */ |
153 | #endif /* _ASM_POWERPC_HW_IRQ_H */ | 198 | #endif /* _ASM_POWERPC_HW_IRQ_H */ |
diff --git a/arch/powerpc/include/asm/irqflags.h b/arch/powerpc/include/asm/irqflags.h index b0b06d85788d..6f9b6e23dc5a 100644 --- a/arch/powerpc/include/asm/irqflags.h +++ b/arch/powerpc/include/asm/irqflags.h | |||
@@ -39,24 +39,31 @@ | |||
39 | #define TRACE_ENABLE_INTS TRACE_WITH_FRAME_BUFFER(.trace_hardirqs_on) | 39 | #define TRACE_ENABLE_INTS TRACE_WITH_FRAME_BUFFER(.trace_hardirqs_on) |
40 | #define TRACE_DISABLE_INTS TRACE_WITH_FRAME_BUFFER(.trace_hardirqs_off) | 40 | #define TRACE_DISABLE_INTS TRACE_WITH_FRAME_BUFFER(.trace_hardirqs_off) |
41 | 41 | ||
42 | #define TRACE_AND_RESTORE_IRQ_PARTIAL(en,skip) \ | 42 | /* |
43 | cmpdi en,0; \ | 43 | * This is used by assembly code to soft-disable interrupts |
44 | bne 95f; \ | 44 | */ |
45 | stb en,PACASOFTIRQEN(r13); \ | 45 | #define SOFT_DISABLE_INTS(__rA, __rB) \ |
46 | TRACE_WITH_FRAME_BUFFER(.trace_hardirqs_off) \ | 46 | lbz __rA,PACASOFTIRQEN(r13); \ |
47 | b skip; \ | 47 | lbz __rB,PACAIRQHAPPENED(r13); \ |
48 | 95: TRACE_WITH_FRAME_BUFFER(.trace_hardirqs_on) \ | 48 | cmpwi cr0,__rA,0; \ |
49 | li en,1; | 49 | li __rA,0; \ |
50 | #define TRACE_AND_RESTORE_IRQ(en) \ | 50 | ori __rB,__rB,PACA_IRQ_HARD_DIS; \ |
51 | TRACE_AND_RESTORE_IRQ_PARTIAL(en,96f); \ | 51 | stb __rB,PACAIRQHAPPENED(r13); \ |
52 | stb en,PACASOFTIRQEN(r13); \ | 52 | beq 44f; \ |
53 | 96: | 53 | stb __rA,PACASOFTIRQEN(r13); \ |
54 | TRACE_DISABLE_INTS; \ | ||
55 | 44: | ||
56 | |||
54 | #else | 57 | #else |
55 | #define TRACE_ENABLE_INTS | 58 | #define TRACE_ENABLE_INTS |
56 | #define TRACE_DISABLE_INTS | 59 | #define TRACE_DISABLE_INTS |
57 | #define TRACE_AND_RESTORE_IRQ_PARTIAL(en,skip) | 60 | |
58 | #define TRACE_AND_RESTORE_IRQ(en) \ | 61 | #define SOFT_DISABLE_INTS(__rA, __rB) \ |
59 | stb en,PACASOFTIRQEN(r13) | 62 | lbz __rA,PACAIRQHAPPENED(r13); \ |
63 | li __rB,0; \ | ||
64 | ori __rA,__rA,PACA_IRQ_HARD_DIS; \ | ||
65 | stb __rB,PACASOFTIRQEN(r13); \ | ||
66 | stb __rA,PACAIRQHAPPENED(r13) | ||
60 | #endif | 67 | #endif |
61 | #endif | 68 | #endif |
62 | 69 | ||
diff --git a/arch/powerpc/include/asm/iseries/alpaca.h b/arch/powerpc/include/asm/iseries/alpaca.h deleted file mode 100644 index c0cce6727a69..000000000000 --- a/arch/powerpc/include/asm/iseries/alpaca.h +++ /dev/null | |||
@@ -1,31 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright © 2008 Stephen Rothwell IBM Corporation | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License as published by | ||
6 | * the Free Software Foundation; either version 2 of the License, or | ||
7 | * (at your option) any later version. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License | ||
15 | * along with this program; if not, write to the Free Software | ||
16 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
17 | */ | ||
18 | #ifndef _ASM_POWERPC_ISERIES_ALPACA_H | ||
19 | #define _ASM_POWERPC_ISERIES_ALPACA_H | ||
20 | |||
21 | /* | ||
22 | * This is the part of the paca that the iSeries hypervisor | ||
23 | * needs to be statically initialised. Immediately after boot | ||
24 | * we switch to the normal Linux paca. | ||
25 | */ | ||
26 | struct alpaca { | ||
27 | struct lppaca *lppaca_ptr; /* Pointer to LpPaca for PLIC */ | ||
28 | const void *reg_save_ptr; /* Pointer to LpRegSave for PLIC */ | ||
29 | }; | ||
30 | |||
31 | #endif /* _ASM_POWERPC_ISERIES_ALPACA_H */ | ||
diff --git a/arch/powerpc/include/asm/iseries/hv_call.h b/arch/powerpc/include/asm/iseries/hv_call.h deleted file mode 100644 index 162d653ad51f..000000000000 --- a/arch/powerpc/include/asm/iseries/hv_call.h +++ /dev/null | |||
@@ -1,111 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2001 Mike Corrigan IBM Corporation | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License as published by | ||
6 | * the Free Software Foundation; either version 2 of the License, or | ||
7 | * (at your option) any later version. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License | ||
15 | * along with this program; if not, write to the Free Software | ||
16 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
17 | * | ||
18 | * This file contains the "hypervisor call" interface which is used to | ||
19 | * drive the hypervisor from the OS. | ||
20 | */ | ||
21 | #ifndef _ASM_POWERPC_ISERIES_HV_CALL_H | ||
22 | #define _ASM_POWERPC_ISERIES_HV_CALL_H | ||
23 | |||
24 | #include <asm/iseries/hv_call_sc.h> | ||
25 | #include <asm/iseries/hv_types.h> | ||
26 | #include <asm/paca.h> | ||
27 | |||
28 | /* Type of yield for HvCallBaseYieldProcessor */ | ||
29 | #define HvCall_YieldTimed 0 /* Yield until specified time (tb) */ | ||
30 | #define HvCall_YieldToActive 1 /* Yield until all active procs have run */ | ||
31 | #define HvCall_YieldToProc 2 /* Yield until the specified processor has run */ | ||
32 | |||
33 | /* interrupt masks for setEnabledInterrupts */ | ||
34 | #define HvCall_MaskIPI 0x00000001 | ||
35 | #define HvCall_MaskLpEvent 0x00000002 | ||
36 | #define HvCall_MaskLpProd 0x00000004 | ||
37 | #define HvCall_MaskTimeout 0x00000008 | ||
38 | |||
39 | /* Log buffer formats */ | ||
40 | #define HvCall_LogBuffer_ASCII 0 | ||
41 | #define HvCall_LogBuffer_EBCDIC 1 | ||
42 | |||
43 | #define HvCallBaseAckDeferredInts HvCallBase + 0 | ||
44 | #define HvCallBaseCpmPowerOff HvCallBase + 1 | ||
45 | #define HvCallBaseGetHwPatch HvCallBase + 2 | ||
46 | #define HvCallBaseReIplSpAttn HvCallBase + 3 | ||
47 | #define HvCallBaseSetASR HvCallBase + 4 | ||
48 | #define HvCallBaseSetASRAndRfi HvCallBase + 5 | ||
49 | #define HvCallBaseSetIMR HvCallBase + 6 | ||
50 | #define HvCallBaseSendIPI HvCallBase + 7 | ||
51 | #define HvCallBaseTerminateMachine HvCallBase + 8 | ||
52 | #define HvCallBaseTerminateMachineSrc HvCallBase + 9 | ||
53 | #define HvCallBaseProcessPlicInterrupts HvCallBase + 10 | ||
54 | #define HvCallBaseIsPrimaryCpmOrMsdIpl HvCallBase + 11 | ||
55 | #define HvCallBaseSetVirtualSIT HvCallBase + 12 | ||
56 | #define HvCallBaseVaryOffThisProcessor HvCallBase + 13 | ||
57 | #define HvCallBaseVaryOffMemoryChunk HvCallBase + 14 | ||
58 | #define HvCallBaseVaryOffInteractivePercentage HvCallBase + 15 | ||
59 | #define HvCallBaseSendLpProd HvCallBase + 16 | ||
60 | #define HvCallBaseSetEnabledInterrupts HvCallBase + 17 | ||
61 | #define HvCallBaseYieldProcessor HvCallBase + 18 | ||
62 | #define HvCallBaseVaryOffSharedProcUnits HvCallBase + 19 | ||
63 | #define HvCallBaseSetVirtualDecr HvCallBase + 20 | ||
64 | #define HvCallBaseClearLogBuffer HvCallBase + 21 | ||
65 | #define HvCallBaseGetLogBufferCodePage HvCallBase + 22 | ||
66 | #define HvCallBaseGetLogBufferFormat HvCallBase + 23 | ||
67 | #define HvCallBaseGetLogBufferLength HvCallBase + 24 | ||
68 | #define HvCallBaseReadLogBuffer HvCallBase + 25 | ||
69 | #define HvCallBaseSetLogBufferFormatAndCodePage HvCallBase + 26 | ||
70 | #define HvCallBaseWriteLogBuffer HvCallBase + 27 | ||
71 | #define HvCallBaseRouter28 HvCallBase + 28 | ||
72 | #define HvCallBaseRouter29 HvCallBase + 29 | ||
73 | #define HvCallBaseRouter30 HvCallBase + 30 | ||
74 | #define HvCallBaseSetDebugBus HvCallBase + 31 | ||
75 | |||
76 | #define HvCallCcSetDABR HvCallCc + 7 | ||
77 | |||
78 | static inline void HvCall_setVirtualDecr(void) | ||
79 | { | ||
80 | /* | ||
81 | * Ignore any error return codes - most likely means that the | ||
82 | * target value for the LP has been increased and this vary off | ||
83 | * would bring us below the new target. | ||
84 | */ | ||
85 | HvCall0(HvCallBaseSetVirtualDecr); | ||
86 | } | ||
87 | |||
88 | static inline void HvCall_yieldProcessor(unsigned typeOfYield, u64 yieldParm) | ||
89 | { | ||
90 | HvCall2(HvCallBaseYieldProcessor, typeOfYield, yieldParm); | ||
91 | } | ||
92 | |||
93 | static inline void HvCall_setEnabledInterrupts(u64 enabledInterrupts) | ||
94 | { | ||
95 | HvCall1(HvCallBaseSetEnabledInterrupts, enabledInterrupts); | ||
96 | } | ||
97 | |||
98 | static inline void HvCall_setLogBufferFormatAndCodepage(int format, | ||
99 | u32 codePage) | ||
100 | { | ||
101 | HvCall2(HvCallBaseSetLogBufferFormatAndCodePage, format, codePage); | ||
102 | } | ||
103 | |||
104 | extern void HvCall_writeLogBuffer(const void *buffer, u64 bufLen); | ||
105 | |||
106 | static inline void HvCall_sendIPI(struct paca_struct *targetPaca) | ||
107 | { | ||
108 | HvCall1(HvCallBaseSendIPI, targetPaca->paca_index); | ||
109 | } | ||
110 | |||
111 | #endif /* _ASM_POWERPC_ISERIES_HV_CALL_H */ | ||
diff --git a/arch/powerpc/include/asm/iseries/hv_call_event.h b/arch/powerpc/include/asm/iseries/hv_call_event.h deleted file mode 100644 index cc029d388e11..000000000000 --- a/arch/powerpc/include/asm/iseries/hv_call_event.h +++ /dev/null | |||
@@ -1,201 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2001 Mike Corrigan IBM Corporation | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License as published by | ||
6 | * the Free Software Foundation; either version 2 of the License, or | ||
7 | * (at your option) any later version. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License | ||
15 | * along with this program; if not, write to the Free Software | ||
16 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
17 | * | ||
18 | * This file contains the "hypervisor call" interface which is used to | ||
19 | * drive the hypervisor from the OS. | ||
20 | */ | ||
21 | #ifndef _ASM_POWERPC_ISERIES_HV_CALL_EVENT_H | ||
22 | #define _ASM_POWERPC_ISERIES_HV_CALL_EVENT_H | ||
23 | |||
24 | #include <linux/types.h> | ||
25 | #include <linux/dma-mapping.h> | ||
26 | |||
27 | #include <asm/iseries/hv_call_sc.h> | ||
28 | #include <asm/iseries/hv_types.h> | ||
29 | #include <asm/abs_addr.h> | ||
30 | |||
31 | struct HvLpEvent; | ||
32 | |||
33 | typedef u8 HvLpEvent_Type; | ||
34 | typedef u8 HvLpEvent_AckInd; | ||
35 | typedef u8 HvLpEvent_AckType; | ||
36 | |||
37 | typedef u8 HvLpDma_Direction; | ||
38 | typedef u8 HvLpDma_AddressType; | ||
39 | |||
40 | typedef u64 HvLpEvent_Rc; | ||
41 | typedef u64 HvLpDma_Rc; | ||
42 | |||
43 | #define HvCallEventAckLpEvent HvCallEvent + 0 | ||
44 | #define HvCallEventCancelLpEvent HvCallEvent + 1 | ||
45 | #define HvCallEventCloseLpEventPath HvCallEvent + 2 | ||
46 | #define HvCallEventDmaBufList HvCallEvent + 3 | ||
47 | #define HvCallEventDmaSingle HvCallEvent + 4 | ||
48 | #define HvCallEventDmaToSp HvCallEvent + 5 | ||
49 | #define HvCallEventGetOverflowLpEvents HvCallEvent + 6 | ||
50 | #define HvCallEventGetSourceLpInstanceId HvCallEvent + 7 | ||
51 | #define HvCallEventGetTargetLpInstanceId HvCallEvent + 8 | ||
52 | #define HvCallEventOpenLpEventPath HvCallEvent + 9 | ||
53 | #define HvCallEventSetLpEventStack HvCallEvent + 10 | ||
54 | #define HvCallEventSignalLpEvent HvCallEvent + 11 | ||
55 | #define HvCallEventSignalLpEventParms HvCallEvent + 12 | ||
56 | #define HvCallEventSetInterLpQueueIndex HvCallEvent + 13 | ||
57 | #define HvCallEventSetLpEventQueueInterruptProc HvCallEvent + 14 | ||
58 | #define HvCallEventRouter15 HvCallEvent + 15 | ||
59 | |||
60 | static inline void HvCallEvent_getOverflowLpEvents(u8 queueIndex) | ||
61 | { | ||
62 | HvCall1(HvCallEventGetOverflowLpEvents, queueIndex); | ||
63 | } | ||
64 | |||
65 | static inline void HvCallEvent_setInterLpQueueIndex(u8 queueIndex) | ||
66 | { | ||
67 | HvCall1(HvCallEventSetInterLpQueueIndex, queueIndex); | ||
68 | } | ||
69 | |||
70 | static inline void HvCallEvent_setLpEventStack(u8 queueIndex, | ||
71 | char *eventStackAddr, u32 eventStackSize) | ||
72 | { | ||
73 | HvCall3(HvCallEventSetLpEventStack, queueIndex, | ||
74 | virt_to_abs(eventStackAddr), eventStackSize); | ||
75 | } | ||
76 | |||
77 | static inline void HvCallEvent_setLpEventQueueInterruptProc(u8 queueIndex, | ||
78 | u16 lpLogicalProcIndex) | ||
79 | { | ||
80 | HvCall2(HvCallEventSetLpEventQueueInterruptProc, queueIndex, | ||
81 | lpLogicalProcIndex); | ||
82 | } | ||
83 | |||
84 | static inline HvLpEvent_Rc HvCallEvent_signalLpEvent(struct HvLpEvent *event) | ||
85 | { | ||
86 | return HvCall1(HvCallEventSignalLpEvent, virt_to_abs(event)); | ||
87 | } | ||
88 | |||
89 | static inline HvLpEvent_Rc HvCallEvent_signalLpEventFast(HvLpIndex targetLp, | ||
90 | HvLpEvent_Type type, u16 subtype, HvLpEvent_AckInd ackInd, | ||
91 | HvLpEvent_AckType ackType, HvLpInstanceId sourceInstanceId, | ||
92 | HvLpInstanceId targetInstanceId, u64 correlationToken, | ||
93 | u64 eventData1, u64 eventData2, u64 eventData3, | ||
94 | u64 eventData4, u64 eventData5) | ||
95 | { | ||
96 | /* Pack the misc bits into a single Dword to pass to PLIC */ | ||
97 | union { | ||
98 | struct { | ||
99 | u8 ack_and_target; | ||
100 | u8 type; | ||
101 | u16 subtype; | ||
102 | HvLpInstanceId src_inst; | ||
103 | HvLpInstanceId target_inst; | ||
104 | } parms; | ||
105 | u64 dword; | ||
106 | } packed; | ||
107 | |||
108 | packed.parms.ack_and_target = (ackType << 7) | (ackInd << 6) | targetLp; | ||
109 | packed.parms.type = type; | ||
110 | packed.parms.subtype = subtype; | ||
111 | packed.parms.src_inst = sourceInstanceId; | ||
112 | packed.parms.target_inst = targetInstanceId; | ||
113 | |||
114 | return HvCall7(HvCallEventSignalLpEventParms, packed.dword, | ||
115 | correlationToken, eventData1, eventData2, | ||
116 | eventData3, eventData4, eventData5); | ||
117 | } | ||
118 | |||
119 | extern void *iseries_hv_alloc(size_t size, dma_addr_t *dma_handle, gfp_t flag); | ||
120 | extern void iseries_hv_free(size_t size, void *vaddr, dma_addr_t dma_handle); | ||
121 | extern dma_addr_t iseries_hv_map(void *vaddr, size_t size, | ||
122 | enum dma_data_direction direction); | ||
123 | extern void iseries_hv_unmap(dma_addr_t dma_handle, size_t size, | ||
124 | enum dma_data_direction direction); | ||
125 | |||
126 | static inline HvLpEvent_Rc HvCallEvent_ackLpEvent(struct HvLpEvent *event) | ||
127 | { | ||
128 | return HvCall1(HvCallEventAckLpEvent, virt_to_abs(event)); | ||
129 | } | ||
130 | |||
131 | static inline HvLpEvent_Rc HvCallEvent_cancelLpEvent(struct HvLpEvent *event) | ||
132 | { | ||
133 | return HvCall1(HvCallEventCancelLpEvent, virt_to_abs(event)); | ||
134 | } | ||
135 | |||
136 | static inline HvLpInstanceId HvCallEvent_getSourceLpInstanceId( | ||
137 | HvLpIndex targetLp, HvLpEvent_Type type) | ||
138 | { | ||
139 | return HvCall2(HvCallEventGetSourceLpInstanceId, targetLp, type); | ||
140 | } | ||
141 | |||
142 | static inline HvLpInstanceId HvCallEvent_getTargetLpInstanceId( | ||
143 | HvLpIndex targetLp, HvLpEvent_Type type) | ||
144 | { | ||
145 | return HvCall2(HvCallEventGetTargetLpInstanceId, targetLp, type); | ||
146 | } | ||
147 | |||
148 | static inline void HvCallEvent_openLpEventPath(HvLpIndex targetLp, | ||
149 | HvLpEvent_Type type) | ||
150 | { | ||
151 | HvCall2(HvCallEventOpenLpEventPath, targetLp, type); | ||
152 | } | ||
153 | |||
154 | static inline void HvCallEvent_closeLpEventPath(HvLpIndex targetLp, | ||
155 | HvLpEvent_Type type) | ||
156 | { | ||
157 | HvCall2(HvCallEventCloseLpEventPath, targetLp, type); | ||
158 | } | ||
159 | |||
160 | static inline HvLpDma_Rc HvCallEvent_dmaBufList(HvLpEvent_Type type, | ||
161 | HvLpIndex remoteLp, HvLpDma_Direction direction, | ||
162 | HvLpInstanceId localInstanceId, | ||
163 | HvLpInstanceId remoteInstanceId, | ||
164 | HvLpDma_AddressType localAddressType, | ||
165 | HvLpDma_AddressType remoteAddressType, | ||
166 | /* Do these need to be converted to absolute addresses? */ | ||
167 | u64 localBufList, u64 remoteBufList, u32 transferLength) | ||
168 | { | ||
169 | /* Pack the misc bits into a single Dword to pass to PLIC */ | ||
170 | union { | ||
171 | struct { | ||
172 | u8 flags; | ||
173 | HvLpIndex remote; | ||
174 | u8 type; | ||
175 | u8 reserved; | ||
176 | HvLpInstanceId local_inst; | ||
177 | HvLpInstanceId remote_inst; | ||
178 | } parms; | ||
179 | u64 dword; | ||
180 | } packed; | ||
181 | |||
182 | packed.parms.flags = (direction << 7) | | ||
183 | (localAddressType << 6) | (remoteAddressType << 5); | ||
184 | packed.parms.remote = remoteLp; | ||
185 | packed.parms.type = type; | ||
186 | packed.parms.reserved = 0; | ||
187 | packed.parms.local_inst = localInstanceId; | ||
188 | packed.parms.remote_inst = remoteInstanceId; | ||
189 | |||
190 | return HvCall4(HvCallEventDmaBufList, packed.dword, localBufList, | ||
191 | remoteBufList, transferLength); | ||
192 | } | ||
193 | |||
194 | static inline HvLpDma_Rc HvCallEvent_dmaToSp(void *local, u32 remote, | ||
195 | u32 length, HvLpDma_Direction dir) | ||
196 | { | ||
197 | return HvCall4(HvCallEventDmaToSp, virt_to_abs(local), remote, | ||
198 | length, dir); | ||
199 | } | ||
200 | |||
201 | #endif /* _ASM_POWERPC_ISERIES_HV_CALL_EVENT_H */ | ||
diff --git a/arch/powerpc/include/asm/iseries/hv_call_sc.h b/arch/powerpc/include/asm/iseries/hv_call_sc.h deleted file mode 100644 index f5d210959250..000000000000 --- a/arch/powerpc/include/asm/iseries/hv_call_sc.h +++ /dev/null | |||
@@ -1,50 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2001 Mike Corrigan IBM Corporation | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License as published by | ||
6 | * the Free Software Foundation; either version 2 of the License, or | ||
7 | * (at your option) any later version. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License | ||
15 | * along with this program; if not, write to the Free Software | ||
16 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
17 | */ | ||
18 | #ifndef _ASM_POWERPC_ISERIES_HV_CALL_SC_H | ||
19 | #define _ASM_POWERPC_ISERIES_HV_CALL_SC_H | ||
20 | |||
21 | #include <linux/types.h> | ||
22 | |||
23 | #define HvCallBase 0x8000000000000000ul | ||
24 | #define HvCallCc 0x8001000000000000ul | ||
25 | #define HvCallCfg 0x8002000000000000ul | ||
26 | #define HvCallEvent 0x8003000000000000ul | ||
27 | #define HvCallHpt 0x8004000000000000ul | ||
28 | #define HvCallPci 0x8005000000000000ul | ||
29 | #define HvCallSm 0x8007000000000000ul | ||
30 | #define HvCallXm 0x8009000000000000ul | ||
31 | |||
32 | extern u64 HvCall0(u64); | ||
33 | extern u64 HvCall1(u64, u64); | ||
34 | extern u64 HvCall2(u64, u64, u64); | ||
35 | extern u64 HvCall3(u64, u64, u64, u64); | ||
36 | extern u64 HvCall4(u64, u64, u64, u64, u64); | ||
37 | extern u64 HvCall5(u64, u64, u64, u64, u64, u64); | ||
38 | extern u64 HvCall6(u64, u64, u64, u64, u64, u64, u64); | ||
39 | extern u64 HvCall7(u64, u64, u64, u64, u64, u64, u64, u64); | ||
40 | |||
41 | extern u64 HvCall0Ret16(u64, void *); | ||
42 | extern u64 HvCall1Ret16(u64, void *, u64); | ||
43 | extern u64 HvCall2Ret16(u64, void *, u64, u64); | ||
44 | extern u64 HvCall3Ret16(u64, void *, u64, u64, u64); | ||
45 | extern u64 HvCall4Ret16(u64, void *, u64, u64, u64, u64); | ||
46 | extern u64 HvCall5Ret16(u64, void *, u64, u64, u64, u64, u64); | ||
47 | extern u64 HvCall6Ret16(u64, void *, u64, u64, u64, u64, u64, u64); | ||
48 | extern u64 HvCall7Ret16(u64, void *, u64, u64 ,u64 ,u64 ,u64 ,u64 ,u64); | ||
49 | |||
50 | #endif /* _ASM_POWERPC_ISERIES_HV_CALL_SC_H */ | ||
diff --git a/arch/powerpc/include/asm/iseries/hv_call_xm.h b/arch/powerpc/include/asm/iseries/hv_call_xm.h deleted file mode 100644 index 392ac3f54df0..000000000000 --- a/arch/powerpc/include/asm/iseries/hv_call_xm.h +++ /dev/null | |||
@@ -1,61 +0,0 @@ | |||
1 | /* | ||
2 | * This file contains the "hypervisor call" interface which is used to | ||
3 | * drive the hypervisor from SLIC. | ||
4 | */ | ||
5 | #ifndef _ASM_POWERPC_ISERIES_HV_CALL_XM_H | ||
6 | #define _ASM_POWERPC_ISERIES_HV_CALL_XM_H | ||
7 | |||
8 | #include <asm/iseries/hv_call_sc.h> | ||
9 | #include <asm/iseries/hv_types.h> | ||
10 | |||
11 | #define HvCallXmGetTceTableParms HvCallXm + 0 | ||
12 | #define HvCallXmTestBus HvCallXm + 1 | ||
13 | #define HvCallXmConnectBusUnit HvCallXm + 2 | ||
14 | #define HvCallXmLoadTod HvCallXm + 8 | ||
15 | #define HvCallXmTestBusUnit HvCallXm + 9 | ||
16 | #define HvCallXmSetTce HvCallXm + 11 | ||
17 | #define HvCallXmSetTces HvCallXm + 13 | ||
18 | |||
19 | static inline void HvCallXm_getTceTableParms(u64 cb) | ||
20 | { | ||
21 | HvCall1(HvCallXmGetTceTableParms, cb); | ||
22 | } | ||
23 | |||
24 | static inline u64 HvCallXm_setTce(u64 tceTableToken, u64 tceOffset, u64 tce) | ||
25 | { | ||
26 | return HvCall3(HvCallXmSetTce, tceTableToken, tceOffset, tce); | ||
27 | } | ||
28 | |||
29 | static inline u64 HvCallXm_setTces(u64 tceTableToken, u64 tceOffset, | ||
30 | u64 numTces, u64 tce1, u64 tce2, u64 tce3, u64 tce4) | ||
31 | { | ||
32 | return HvCall7(HvCallXmSetTces, tceTableToken, tceOffset, numTces, | ||
33 | tce1, tce2, tce3, tce4); | ||
34 | } | ||
35 | |||
36 | static inline u64 HvCallXm_testBus(u16 busNumber) | ||
37 | { | ||
38 | return HvCall1(HvCallXmTestBus, busNumber); | ||
39 | } | ||
40 | |||
41 | static inline u64 HvCallXm_testBusUnit(u16 busNumber, u8 subBusNumber, | ||
42 | u8 deviceId) | ||
43 | { | ||
44 | return HvCall2(HvCallXmTestBusUnit, busNumber, | ||
45 | (subBusNumber << 8) | deviceId); | ||
46 | } | ||
47 | |||
48 | static inline u64 HvCallXm_connectBusUnit(u16 busNumber, u8 subBusNumber, | ||
49 | u8 deviceId, u64 interruptToken) | ||
50 | { | ||
51 | return HvCall5(HvCallXmConnectBusUnit, busNumber, | ||
52 | (subBusNumber << 8) | deviceId, interruptToken, 0, | ||
53 | 0 /* HvLpConfig::mapDsaToQueueIndex(HvLpDSA(busNumber, xBoard, xCard)) */); | ||
54 | } | ||
55 | |||
56 | static inline u64 HvCallXm_loadTod(void) | ||
57 | { | ||
58 | return HvCall0(HvCallXmLoadTod); | ||
59 | } | ||
60 | |||
61 | #endif /* _ASM_POWERPC_ISERIES_HV_CALL_XM_H */ | ||
diff --git a/arch/powerpc/include/asm/iseries/hv_lp_config.h b/arch/powerpc/include/asm/iseries/hv_lp_config.h deleted file mode 100644 index a006fd1e4a2c..000000000000 --- a/arch/powerpc/include/asm/iseries/hv_lp_config.h +++ /dev/null | |||
@@ -1,128 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2001 Mike Corrigan IBM Corporation | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License as published by | ||
6 | * the Free Software Foundation; either version 2 of the License, or | ||
7 | * (at your option) any later version. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License | ||
15 | * along with this program; if not, write to the Free Software | ||
16 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
17 | */ | ||
18 | #ifndef _ASM_POWERPC_ISERIES_HV_LP_CONFIG_H | ||
19 | #define _ASM_POWERPC_ISERIES_HV_LP_CONFIG_H | ||
20 | |||
21 | /* | ||
22 | * This file contains the interface to the LPAR configuration data | ||
23 | * to determine which resources should be allocated to each partition. | ||
24 | */ | ||
25 | |||
26 | #include <asm/iseries/hv_call_sc.h> | ||
27 | #include <asm/iseries/hv_types.h> | ||
28 | |||
29 | enum { | ||
30 | HvCallCfg_Cur = 0, | ||
31 | HvCallCfg_Init = 1, | ||
32 | HvCallCfg_Max = 2, | ||
33 | HvCallCfg_Min = 3 | ||
34 | }; | ||
35 | |||
36 | #define HvCallCfgGetSystemPhysicalProcessors HvCallCfg + 6 | ||
37 | #define HvCallCfgGetPhysicalProcessors HvCallCfg + 7 | ||
38 | #define HvCallCfgGetMsChunks HvCallCfg + 9 | ||
39 | #define HvCallCfgGetSharedPoolIndex HvCallCfg + 20 | ||
40 | #define HvCallCfgGetSharedProcUnits HvCallCfg + 21 | ||
41 | #define HvCallCfgGetNumProcsInSharedPool HvCallCfg + 22 | ||
42 | #define HvCallCfgGetVirtualLanIndexMap HvCallCfg + 30 | ||
43 | #define HvCallCfgGetHostingLpIndex HvCallCfg + 32 | ||
44 | |||
45 | extern HvLpIndex HvLpConfig_getLpIndex_outline(void); | ||
46 | extern HvLpIndex HvLpConfig_getLpIndex(void); | ||
47 | extern HvLpIndex HvLpConfig_getPrimaryLpIndex(void); | ||
48 | |||
49 | static inline u64 HvLpConfig_getMsChunks(void) | ||
50 | { | ||
51 | return HvCall2(HvCallCfgGetMsChunks, HvLpConfig_getLpIndex(), | ||
52 | HvCallCfg_Cur); | ||
53 | } | ||
54 | |||
55 | static inline u64 HvLpConfig_getSystemPhysicalProcessors(void) | ||
56 | { | ||
57 | return HvCall0(HvCallCfgGetSystemPhysicalProcessors); | ||
58 | } | ||
59 | |||
60 | static inline u64 HvLpConfig_getNumProcsInSharedPool(HvLpSharedPoolIndex sPI) | ||
61 | { | ||
62 | return (u16)HvCall1(HvCallCfgGetNumProcsInSharedPool, sPI); | ||
63 | } | ||
64 | |||
65 | static inline u64 HvLpConfig_getPhysicalProcessors(void) | ||
66 | { | ||
67 | return HvCall2(HvCallCfgGetPhysicalProcessors, HvLpConfig_getLpIndex(), | ||
68 | HvCallCfg_Cur); | ||
69 | } | ||
70 | |||
71 | static inline HvLpSharedPoolIndex HvLpConfig_getSharedPoolIndex(void) | ||
72 | { | ||
73 | return HvCall1(HvCallCfgGetSharedPoolIndex, HvLpConfig_getLpIndex()); | ||
74 | } | ||
75 | |||
76 | static inline u64 HvLpConfig_getSharedProcUnits(void) | ||
77 | { | ||
78 | return HvCall2(HvCallCfgGetSharedProcUnits, HvLpConfig_getLpIndex(), | ||
79 | HvCallCfg_Cur); | ||
80 | } | ||
81 | |||
82 | static inline u64 HvLpConfig_getMaxSharedProcUnits(void) | ||
83 | { | ||
84 | return HvCall2(HvCallCfgGetSharedProcUnits, HvLpConfig_getLpIndex(), | ||
85 | HvCallCfg_Max); | ||
86 | } | ||
87 | |||
88 | static inline u64 HvLpConfig_getMaxPhysicalProcessors(void) | ||
89 | { | ||
90 | return HvCall2(HvCallCfgGetPhysicalProcessors, HvLpConfig_getLpIndex(), | ||
91 | HvCallCfg_Max); | ||
92 | } | ||
93 | |||
94 | static inline HvLpVirtualLanIndexMap HvLpConfig_getVirtualLanIndexMapForLp( | ||
95 | HvLpIndex lp) | ||
96 | { | ||
97 | /* | ||
98 | * This is a new function in V5R1 so calls to this on older | ||
99 | * hypervisors will return -1 | ||
100 | */ | ||
101 | u64 retVal = HvCall1(HvCallCfgGetVirtualLanIndexMap, lp); | ||
102 | if (retVal == -1) | ||
103 | retVal = 0; | ||
104 | return retVal; | ||
105 | } | ||
106 | |||
107 | static inline HvLpVirtualLanIndexMap HvLpConfig_getVirtualLanIndexMap(void) | ||
108 | { | ||
109 | return HvLpConfig_getVirtualLanIndexMapForLp( | ||
110 | HvLpConfig_getLpIndex_outline()); | ||
111 | } | ||
112 | |||
113 | static inline int HvLpConfig_doLpsCommunicateOnVirtualLan(HvLpIndex lp1, | ||
114 | HvLpIndex lp2) | ||
115 | { | ||
116 | HvLpVirtualLanIndexMap virtualLanIndexMap1 = | ||
117 | HvLpConfig_getVirtualLanIndexMapForLp(lp1); | ||
118 | HvLpVirtualLanIndexMap virtualLanIndexMap2 = | ||
119 | HvLpConfig_getVirtualLanIndexMapForLp(lp2); | ||
120 | return ((virtualLanIndexMap1 & virtualLanIndexMap2) != 0); | ||
121 | } | ||
122 | |||
123 | static inline HvLpIndex HvLpConfig_getHostingLpIndex(HvLpIndex lp) | ||
124 | { | ||
125 | return HvCall1(HvCallCfgGetHostingLpIndex, lp); | ||
126 | } | ||
127 | |||
128 | #endif /* _ASM_POWERPC_ISERIES_HV_LP_CONFIG_H */ | ||
diff --git a/arch/powerpc/include/asm/iseries/hv_lp_event.h b/arch/powerpc/include/asm/iseries/hv_lp_event.h deleted file mode 100644 index 8f5da7d77202..000000000000 --- a/arch/powerpc/include/asm/iseries/hv_lp_event.h +++ /dev/null | |||
@@ -1,162 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2001 Mike Corrigan IBM Corporation | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License as published by | ||
6 | * the Free Software Foundation; either version 2 of the License, or | ||
7 | * (at your option) any later version. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License | ||
15 | * along with this program; if not, write to the Free Software | ||
16 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
17 | */ | ||
18 | |||
19 | /* This file contains the class for HV events in the system. */ | ||
20 | |||
21 | #ifndef _ASM_POWERPC_ISERIES_HV_LP_EVENT_H | ||
22 | #define _ASM_POWERPC_ISERIES_HV_LP_EVENT_H | ||
23 | |||
24 | #include <asm/types.h> | ||
25 | #include <asm/ptrace.h> | ||
26 | #include <asm/iseries/hv_types.h> | ||
27 | #include <asm/iseries/hv_call_event.h> | ||
28 | |||
29 | /* | ||
30 | * HvLpEvent is the structure for Lp Event messages passed between | ||
31 | * partitions through PLIC. | ||
32 | */ | ||
33 | |||
34 | struct HvLpEvent { | ||
35 | u8 flags; /* Event flags x00-x00 */ | ||
36 | u8 xType; /* Type of message x01-x01 */ | ||
37 | u16 xSubtype; /* Subtype for event x02-x03 */ | ||
38 | u8 xSourceLp; /* Source LP x04-x04 */ | ||
39 | u8 xTargetLp; /* Target LP x05-x05 */ | ||
40 | u8 xSizeMinus1; /* Size of Derived class - 1 x06-x06 */ | ||
41 | u8 xRc; /* RC for Ack flows x07-x07 */ | ||
42 | u16 xSourceInstanceId; /* Source sides instance id x08-x09 */ | ||
43 | u16 xTargetInstanceId; /* Target sides instance id x0A-x0B */ | ||
44 | union { | ||
45 | u32 xSubtypeData; /* Data usable by the subtype x0C-x0F */ | ||
46 | u16 xSubtypeDataShort[2]; /* Data as 2 shorts */ | ||
47 | u8 xSubtypeDataChar[4]; /* Data as 4 chars */ | ||
48 | } x; | ||
49 | |||
50 | u64 xCorrelationToken; /* Unique value for source/type x10-x17 */ | ||
51 | }; | ||
52 | |||
53 | typedef void (*LpEventHandler)(struct HvLpEvent *); | ||
54 | |||
55 | /* Register a handler for an event type - returns 0 on success */ | ||
56 | extern int HvLpEvent_registerHandler(HvLpEvent_Type eventType, | ||
57 | LpEventHandler hdlr); | ||
58 | |||
59 | /* | ||
60 | * Unregister a handler for an event type | ||
61 | * | ||
62 | * This call will sleep until the handler being removed is guaranteed to | ||
63 | * be no longer executing on any CPU. Do not call with locks held. | ||
64 | * | ||
65 | * returns 0 on success | ||
66 | * Unregister will fail if there are any paths open for the type | ||
67 | */ | ||
68 | extern int HvLpEvent_unregisterHandler(HvLpEvent_Type eventType); | ||
69 | |||
70 | /* | ||
71 | * Open an Lp Event Path for an event type | ||
72 | * returns 0 on success | ||
73 | * openPath will fail if there is no handler registered for the event type. | ||
74 | * The lpIndex specified is the partition index for the target partition | ||
75 | * (for VirtualIo, VirtualLan and SessionMgr) other types specify zero) | ||
76 | */ | ||
77 | extern int HvLpEvent_openPath(HvLpEvent_Type eventType, HvLpIndex lpIndex); | ||
78 | |||
79 | /* | ||
80 | * Close an Lp Event Path for a type and partition | ||
81 | * returns 0 on success | ||
82 | */ | ||
83 | extern int HvLpEvent_closePath(HvLpEvent_Type eventType, HvLpIndex lpIndex); | ||
84 | |||
85 | #define HvLpEvent_Type_Hypervisor 0 | ||
86 | #define HvLpEvent_Type_MachineFac 1 | ||
87 | #define HvLpEvent_Type_SessionMgr 2 | ||
88 | #define HvLpEvent_Type_SpdIo 3 | ||
89 | #define HvLpEvent_Type_VirtualBus 4 | ||
90 | #define HvLpEvent_Type_PciIo 5 | ||
91 | #define HvLpEvent_Type_RioIo 6 | ||
92 | #define HvLpEvent_Type_VirtualLan 7 | ||
93 | #define HvLpEvent_Type_VirtualIo 8 | ||
94 | #define HvLpEvent_Type_NumTypes 9 | ||
95 | |||
96 | #define HvLpEvent_Rc_Good 0 | ||
97 | #define HvLpEvent_Rc_BufferNotAvailable 1 | ||
98 | #define HvLpEvent_Rc_Cancelled 2 | ||
99 | #define HvLpEvent_Rc_GenericError 3 | ||
100 | #define HvLpEvent_Rc_InvalidAddress 4 | ||
101 | #define HvLpEvent_Rc_InvalidPartition 5 | ||
102 | #define HvLpEvent_Rc_InvalidSize 6 | ||
103 | #define HvLpEvent_Rc_InvalidSubtype 7 | ||
104 | #define HvLpEvent_Rc_InvalidSubtypeData 8 | ||
105 | #define HvLpEvent_Rc_InvalidType 9 | ||
106 | #define HvLpEvent_Rc_PartitionDead 10 | ||
107 | #define HvLpEvent_Rc_PathClosed 11 | ||
108 | #define HvLpEvent_Rc_SubtypeError 12 | ||
109 | |||
110 | #define HvLpEvent_Function_Ack 0 | ||
111 | #define HvLpEvent_Function_Int 1 | ||
112 | |||
113 | #define HvLpEvent_AckInd_NoAck 0 | ||
114 | #define HvLpEvent_AckInd_DoAck 1 | ||
115 | |||
116 | #define HvLpEvent_AckType_ImmediateAck 0 | ||
117 | #define HvLpEvent_AckType_DeferredAck 1 | ||
118 | |||
119 | #define HV_LP_EVENT_INT 0x01 | ||
120 | #define HV_LP_EVENT_DO_ACK 0x02 | ||
121 | #define HV_LP_EVENT_DEFERRED_ACK 0x04 | ||
122 | #define HV_LP_EVENT_VALID 0x80 | ||
123 | |||
124 | #define HvLpDma_Direction_LocalToRemote 0 | ||
125 | #define HvLpDma_Direction_RemoteToLocal 1 | ||
126 | |||
127 | #define HvLpDma_AddressType_TceIndex 0 | ||
128 | #define HvLpDma_AddressType_RealAddress 1 | ||
129 | |||
130 | #define HvLpDma_Rc_Good 0 | ||
131 | #define HvLpDma_Rc_Error 1 | ||
132 | #define HvLpDma_Rc_PartitionDead 2 | ||
133 | #define HvLpDma_Rc_PathClosed 3 | ||
134 | #define HvLpDma_Rc_InvalidAddress 4 | ||
135 | #define HvLpDma_Rc_InvalidLength 5 | ||
136 | |||
137 | static inline int hvlpevent_is_valid(struct HvLpEvent *h) | ||
138 | { | ||
139 | return h->flags & HV_LP_EVENT_VALID; | ||
140 | } | ||
141 | |||
142 | static inline void hvlpevent_invalidate(struct HvLpEvent *h) | ||
143 | { | ||
144 | h->flags &= ~ HV_LP_EVENT_VALID; | ||
145 | } | ||
146 | |||
147 | static inline int hvlpevent_is_int(struct HvLpEvent *h) | ||
148 | { | ||
149 | return h->flags & HV_LP_EVENT_INT; | ||
150 | } | ||
151 | |||
152 | static inline int hvlpevent_is_ack(struct HvLpEvent *h) | ||
153 | { | ||
154 | return !hvlpevent_is_int(h); | ||
155 | } | ||
156 | |||
157 | static inline int hvlpevent_need_ack(struct HvLpEvent *h) | ||
158 | { | ||
159 | return h->flags & HV_LP_EVENT_DO_ACK; | ||
160 | } | ||
161 | |||
162 | #endif /* _ASM_POWERPC_ISERIES_HV_LP_EVENT_H */ | ||
diff --git a/arch/powerpc/include/asm/iseries/hv_types.h b/arch/powerpc/include/asm/iseries/hv_types.h deleted file mode 100644 index c3e6d2a1d1c3..000000000000 --- a/arch/powerpc/include/asm/iseries/hv_types.h +++ /dev/null | |||
@@ -1,112 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2001 Mike Corrigan IBM Corporation | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License as published by | ||
6 | * the Free Software Foundation; either version 2 of the License, or | ||
7 | * (at your option) any later version. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License | ||
15 | * along with this program; if not, write to the Free Software | ||
16 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
17 | */ | ||
18 | #ifndef _ASM_POWERPC_ISERIES_HV_TYPES_H | ||
19 | #define _ASM_POWERPC_ISERIES_HV_TYPES_H | ||
20 | |||
21 | /* | ||
22 | * General typedefs for the hypervisor. | ||
23 | */ | ||
24 | |||
25 | #include <asm/types.h> | ||
26 | |||
27 | typedef u8 HvLpIndex; | ||
28 | typedef u16 HvLpInstanceId; | ||
29 | typedef u64 HvLpTOD; | ||
30 | typedef u64 HvLpSystemSerialNum; | ||
31 | typedef u8 HvLpDeviceSerialNum[12]; | ||
32 | typedef u16 HvLpSanHwSet; | ||
33 | typedef u16 HvLpBus; | ||
34 | typedef u16 HvLpBoard; | ||
35 | typedef u16 HvLpCard; | ||
36 | typedef u8 HvLpDeviceType[4]; | ||
37 | typedef u8 HvLpDeviceModel[3]; | ||
38 | typedef u64 HvIoToken; | ||
39 | typedef u8 HvLpName[8]; | ||
40 | typedef u32 HvIoId; | ||
41 | typedef u64 HvRealMemoryIndex; | ||
42 | typedef u32 HvLpIndexMap; /* Must hold HVMAXARCHITECTEDLPS bits!!! */ | ||
43 | typedef u16 HvLpVrmIndex; | ||
44 | typedef u32 HvXmGenerationId; | ||
45 | typedef u8 HvLpBusPool; | ||
46 | typedef u8 HvLpSharedPoolIndex; | ||
47 | typedef u16 HvLpSharedProcUnitsX100; | ||
48 | typedef u8 HvLpVirtualLanIndex; | ||
49 | typedef u16 HvLpVirtualLanIndexMap; /* Must hold HVMAXARCHITECTEDVIRTUALLANS bits!!! */ | ||
50 | typedef u16 HvBusNumber; /* Hypervisor Bus Number */ | ||
51 | typedef u8 HvSubBusNumber; /* Hypervisor SubBus Number */ | ||
52 | typedef u8 HvAgentId; /* Hypervisor DevFn */ | ||
53 | |||
54 | |||
55 | #define HVMAXARCHITECTEDLPS 32 | ||
56 | #define HVMAXARCHITECTEDVIRTUALLANS 16 | ||
57 | #define HVMAXARCHITECTEDVIRTUALDISKS 32 | ||
58 | #define HVMAXARCHITECTEDVIRTUALCDROMS 8 | ||
59 | #define HVMAXARCHITECTEDVIRTUALTAPES 8 | ||
60 | #define HVCHUNKSIZE (256 * 1024) | ||
61 | #define HVPAGESIZE (4 * 1024) | ||
62 | #define HVLPMINMEGSPRIMARY 256 | ||
63 | #define HVLPMINMEGSSECONDARY 64 | ||
64 | #define HVCHUNKSPERMEG 4 | ||
65 | #define HVPAGESPERMEG 256 | ||
66 | #define HVPAGESPERCHUNK 64 | ||
67 | |||
68 | #define HvLpIndexInvalid ((HvLpIndex)0xff) | ||
69 | |||
70 | /* | ||
71 | * Enums for the sub-components under PLIC | ||
72 | * Used in HvCall and HvPrimaryCall | ||
73 | */ | ||
74 | enum { | ||
75 | HvCallCompId = 0, | ||
76 | HvCallCpuCtlsCompId = 1, | ||
77 | HvCallCfgCompId = 2, | ||
78 | HvCallEventCompId = 3, | ||
79 | HvCallHptCompId = 4, | ||
80 | HvCallPciCompId = 5, | ||
81 | HvCallSlmCompId = 6, | ||
82 | HvCallSmCompId = 7, | ||
83 | HvCallSpdCompId = 8, | ||
84 | HvCallXmCompId = 9, | ||
85 | HvCallRioCompId = 10, | ||
86 | HvCallRsvd3CompId = 11, | ||
87 | HvCallRsvd2CompId = 12, | ||
88 | HvCallRsvd1CompId = 13, | ||
89 | HvCallMaxCompId = 14, | ||
90 | HvPrimaryCallCompId = 0, | ||
91 | HvPrimaryCallCfgCompId = 1, | ||
92 | HvPrimaryCallPciCompId = 2, | ||
93 | HvPrimaryCallSmCompId = 3, | ||
94 | HvPrimaryCallSpdCompId = 4, | ||
95 | HvPrimaryCallXmCompId = 5, | ||
96 | HvPrimaryCallRioCompId = 6, | ||
97 | HvPrimaryCallRsvd7CompId = 7, | ||
98 | HvPrimaryCallRsvd6CompId = 8, | ||
99 | HvPrimaryCallRsvd5CompId = 9, | ||
100 | HvPrimaryCallRsvd4CompId = 10, | ||
101 | HvPrimaryCallRsvd3CompId = 11, | ||
102 | HvPrimaryCallRsvd2CompId = 12, | ||
103 | HvPrimaryCallRsvd1CompId = 13, | ||
104 | HvPrimaryCallMaxCompId = HvCallMaxCompId | ||
105 | }; | ||
106 | |||
107 | struct HvLpBufferList { | ||
108 | u64 addr; | ||
109 | u64 len; | ||
110 | }; | ||
111 | |||
112 | #endif /* _ASM_POWERPC_ISERIES_HV_TYPES_H */ | ||
diff --git a/arch/powerpc/include/asm/iseries/iommu.h b/arch/powerpc/include/asm/iseries/iommu.h deleted file mode 100644 index 1b9692c60899..000000000000 --- a/arch/powerpc/include/asm/iseries/iommu.h +++ /dev/null | |||
@@ -1,37 +0,0 @@ | |||
1 | #ifndef _ASM_POWERPC_ISERIES_IOMMU_H | ||
2 | #define _ASM_POWERPC_ISERIES_IOMMU_H | ||
3 | |||
4 | /* | ||
5 | * Copyright (C) 2005 Stephen Rothwell, IBM Corporation | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License as published by | ||
9 | * the Free Software Foundation; either version 2 of the License, or | ||
10 | * (at your option) any later version. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | * GNU General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the: | ||
19 | * Free Software Foundation, Inc., | ||
20 | * 59 Temple Place, Suite 330, | ||
21 | * Boston, MA 02111-1307 USA | ||
22 | */ | ||
23 | |||
24 | struct pci_dev; | ||
25 | struct vio_dev; | ||
26 | struct device_node; | ||
27 | struct iommu_table; | ||
28 | |||
29 | /* Get table parameters from HV */ | ||
30 | extern void iommu_table_getparms_iSeries(unsigned long busno, | ||
31 | unsigned char slotno, unsigned char virtbus, | ||
32 | struct iommu_table *tbl); | ||
33 | |||
34 | extern struct iommu_table *vio_build_iommu_table_iseries(struct vio_dev *dev); | ||
35 | extern void iommu_vio_init(void); | ||
36 | |||
37 | #endif /* _ASM_POWERPC_ISERIES_IOMMU_H */ | ||
diff --git a/arch/powerpc/include/asm/iseries/it_lp_queue.h b/arch/powerpc/include/asm/iseries/it_lp_queue.h deleted file mode 100644 index 428278838821..000000000000 --- a/arch/powerpc/include/asm/iseries/it_lp_queue.h +++ /dev/null | |||
@@ -1,78 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2001 Mike Corrigan IBM Corporation | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License as published by | ||
6 | * the Free Software Foundation; either version 2 of the License, or | ||
7 | * (at your option) any later version. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License | ||
15 | * along with this program; if not, write to the Free Software | ||
16 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
17 | */ | ||
18 | #ifndef _ASM_POWERPC_ISERIES_IT_LP_QUEUE_H | ||
19 | #define _ASM_POWERPC_ISERIES_IT_LP_QUEUE_H | ||
20 | |||
21 | /* | ||
22 | * This control block defines the simple LP queue structure that is | ||
23 | * shared between the hypervisor (PLIC) and the OS in order to send | ||
24 | * events to an LP. | ||
25 | */ | ||
26 | |||
27 | #include <asm/types.h> | ||
28 | #include <asm/ptrace.h> | ||
29 | |||
30 | #define IT_LP_MAX_QUEUES 8 | ||
31 | |||
32 | #define IT_LP_NOT_USED 0 /* Queue will not be used by PLIC */ | ||
33 | #define IT_LP_DEDICATED_IO 1 /* Queue dedicated to IO processor specified */ | ||
34 | #define IT_LP_DEDICATED_LP 2 /* Queue dedicated to LP specified */ | ||
35 | #define IT_LP_SHARED 3 /* Queue shared for both IO and LP */ | ||
36 | |||
37 | #define IT_LP_EVENT_STACK_SIZE 4096 | ||
38 | #define IT_LP_EVENT_MAX_SIZE 256 | ||
39 | #define IT_LP_EVENT_ALIGN 64 | ||
40 | |||
41 | struct hvlpevent_queue { | ||
42 | /* | ||
43 | * The hq_current_event is the pointer to the next event stack entry | ||
44 | * that will become valid. The OS must peek at this entry to determine | ||
45 | * if it is valid. PLIC will set the valid indicator as the very last | ||
46 | * store into that entry. | ||
47 | * | ||
48 | * When the OS has completed processing of the event then it will mark | ||
49 | * the event as invalid so that PLIC knows it can store into that event | ||
50 | * location again. | ||
51 | * | ||
52 | * If the event stack fills and there are overflow events, then PLIC | ||
53 | * will set the hq_overflow_pending flag in which case the OS will | ||
54 | * have to fetch the additional LP events once they have drained the | ||
55 | * event stack. | ||
56 | * | ||
57 | * The first 16-bytes are known by both the OS and PLIC. The remainder | ||
58 | * of the cache line is for use by the OS. | ||
59 | */ | ||
60 | u8 hq_overflow_pending; /* 0x00 Overflow events are pending */ | ||
61 | u8 hq_status; /* 0x01 DedicatedIo or DedicatedLp or NotUsed */ | ||
62 | u16 hq_proc_index; /* 0x02 Logical Proc Index for correlation */ | ||
63 | u8 hq_reserved1[12]; /* 0x04 */ | ||
64 | char *hq_current_event; /* 0x10 */ | ||
65 | char *hq_last_event; /* 0x18 */ | ||
66 | char *hq_event_stack; /* 0x20 */ | ||
67 | u8 hq_index; /* 0x28 unique sequential index. */ | ||
68 | u8 hq_reserved2[3]; /* 0x29-2b */ | ||
69 | spinlock_t hq_lock; | ||
70 | }; | ||
71 | |||
72 | extern struct hvlpevent_queue hvlpevent_queue; | ||
73 | |||
74 | extern int hvlpevent_is_pending(void); | ||
75 | extern void process_hvlpevents(void); | ||
76 | extern void setup_hvlpevent_queue(void); | ||
77 | |||
78 | #endif /* _ASM_POWERPC_ISERIES_IT_LP_QUEUE_H */ | ||
diff --git a/arch/powerpc/include/asm/iseries/lpar_map.h b/arch/powerpc/include/asm/iseries/lpar_map.h deleted file mode 100644 index 5e9f3e128ee2..000000000000 --- a/arch/powerpc/include/asm/iseries/lpar_map.h +++ /dev/null | |||
@@ -1,85 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2001 Mike Corrigan IBM Corporation | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License as published by | ||
6 | * the Free Software Foundation; either version 2 of the License, or | ||
7 | * (at your option) any later version. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License | ||
15 | * along with this program; if not, write to the Free Software | ||
16 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
17 | */ | ||
18 | #ifndef _ASM_POWERPC_ISERIES_LPAR_MAP_H | ||
19 | #define _ASM_POWERPC_ISERIES_LPAR_MAP_H | ||
20 | |||
21 | #ifndef __ASSEMBLY__ | ||
22 | |||
23 | #include <asm/types.h> | ||
24 | |||
25 | #endif | ||
26 | |||
27 | /* | ||
28 | * The iSeries hypervisor will set up mapping for one or more | ||
29 | * ESID/VSID pairs (in SLB/segment registers) and will set up | ||
30 | * mappings of one or more ranges of pages to VAs. | ||
31 | * We will have the hypervisor set up the ESID->VSID mapping | ||
32 | * for the four kernel segments (C-F). With shared processors, | ||
33 | * the hypervisor will clear all segment registers and reload | ||
34 | * these four whenever the processor is switched from one | ||
35 | * partition to another. | ||
36 | */ | ||
37 | |||
38 | /* The Vsid and Esid identified below will be used by the hypervisor | ||
39 | * to set up a memory mapping for part of the load area before giving | ||
40 | * control to the Linux kernel. The load area is 64 MB, but this must | ||
41 | * not attempt to map the whole load area. The Hashed Page Table may | ||
42 | * need to be located within the load area (if the total partition size | ||
43 | * is 64 MB), but cannot be mapped. Typically, this should specify | ||
44 | * to map half (32 MB) of the load area. | ||
45 | * | ||
46 | * The hypervisor will set up page table entries for the number of | ||
47 | * pages specified. | ||
48 | * | ||
49 | * In 32-bit mode, the hypervisor will load all four of the | ||
50 | * segment registers (identified by the low-order four bits of the | ||
51 | * Esid field. In 64-bit mode, the hypervisor will load one SLB | ||
52 | * entry to map the Esid to the Vsid. | ||
53 | */ | ||
54 | |||
55 | #define HvEsidsToMap 2 | ||
56 | #define HvRangesToMap 1 | ||
57 | |||
58 | /* Hypervisor initially maps 32MB of the load area */ | ||
59 | #define HvPagesToMap 8192 | ||
60 | |||
61 | #ifndef __ASSEMBLY__ | ||
62 | struct LparMap { | ||
63 | u64 xNumberEsids; // Number of ESID/VSID pairs | ||
64 | u64 xNumberRanges; // Number of VA ranges to map | ||
65 | u64 xSegmentTableOffs; // Page number within load area of seg table | ||
66 | u64 xRsvd[5]; | ||
67 | struct { | ||
68 | u64 xKernelEsid; // Esid used to map kernel load | ||
69 | u64 xKernelVsid; // Vsid used to map kernel load | ||
70 | } xEsids[HvEsidsToMap]; | ||
71 | struct { | ||
72 | u64 xPages; // Number of pages to be mapped | ||
73 | u64 xOffset; // Offset from start of load area | ||
74 | u64 xVPN; // Virtual Page Number | ||
75 | } xRanges[HvRangesToMap]; | ||
76 | }; | ||
77 | |||
78 | extern const struct LparMap xLparMap; | ||
79 | |||
80 | #endif /* __ASSEMBLY__ */ | ||
81 | |||
82 | /* the fixed address where the LparMap exists */ | ||
83 | #define LPARMAP_PHYS 0x7000 | ||
84 | |||
85 | #endif /* _ASM_POWERPC_ISERIES_LPAR_MAP_H */ | ||
diff --git a/arch/powerpc/include/asm/iseries/mf.h b/arch/powerpc/include/asm/iseries/mf.h deleted file mode 100644 index eb851a9c9e5c..000000000000 --- a/arch/powerpc/include/asm/iseries/mf.h +++ /dev/null | |||
@@ -1,51 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2001 Troy D. Armstrong IBM Corporation | ||
3 | * Copyright (C) 2004 Stephen Rothwell IBM Corporation | ||
4 | * | ||
5 | * This modules exists as an interface between a Linux secondary partition | ||
6 | * running on an iSeries and the primary partition's Virtual Service | ||
7 | * Processor (VSP) object. The VSP has final authority over powering on/off | ||
8 | * all partitions in the iSeries. It also provides miscellaneous low-level | ||
9 | * machine facility type operations. | ||
10 | * | ||
11 | * This program is free software; you can redistribute it and/or modify | ||
12 | * it under the terms of the GNU General Public License as published by | ||
13 | * the Free Software Foundation; either version 2 of the License, or | ||
14 | * (at your option) any later version. | ||
15 | * | ||
16 | * This program is distributed in the hope that it will be useful, | ||
17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
18 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
19 | * GNU General Public License for more details. | ||
20 | * | ||
21 | * You should have received a copy of the GNU General Public License | ||
22 | * along with this program; if not, write to the Free Software | ||
23 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
24 | */ | ||
25 | #ifndef _ASM_POWERPC_ISERIES_MF_H | ||
26 | #define _ASM_POWERPC_ISERIES_MF_H | ||
27 | |||
28 | #include <linux/types.h> | ||
29 | |||
30 | #include <asm/iseries/hv_types.h> | ||
31 | #include <asm/iseries/hv_call_event.h> | ||
32 | |||
33 | struct rtc_time; | ||
34 | |||
35 | typedef void (*MFCompleteHandler)(void *clientToken, int returnCode); | ||
36 | |||
37 | extern void mf_allocate_lp_events(HvLpIndex targetLp, HvLpEvent_Type type, | ||
38 | unsigned size, unsigned amount, MFCompleteHandler hdlr, | ||
39 | void *userToken); | ||
40 | extern void mf_deallocate_lp_events(HvLpIndex targetLp, HvLpEvent_Type type, | ||
41 | unsigned count, MFCompleteHandler hdlr, void *userToken); | ||
42 | |||
43 | extern void mf_power_off(void); | ||
44 | extern void mf_reboot(char *cmd); | ||
45 | |||
46 | extern void mf_display_src(u32 word); | ||
47 | extern void mf_display_progress(u16 value); | ||
48 | |||
49 | extern void mf_init(void); | ||
50 | |||
51 | #endif /* _ASM_POWERPC_ISERIES_MF_H */ | ||
diff --git a/arch/powerpc/include/asm/iseries/vio.h b/arch/powerpc/include/asm/iseries/vio.h deleted file mode 100644 index f9ac0d00b951..000000000000 --- a/arch/powerpc/include/asm/iseries/vio.h +++ /dev/null | |||
@@ -1,265 +0,0 @@ | |||
1 | /* -*- linux-c -*- | ||
2 | * | ||
3 | * iSeries Virtual I/O Message Path header | ||
4 | * | ||
5 | * Authors: Dave Boutcher <boutcher@us.ibm.com> | ||
6 | * Ryan Arnold <ryanarn@us.ibm.com> | ||
7 | * Colin Devilbiss <devilbis@us.ibm.com> | ||
8 | * | ||
9 | * (C) Copyright 2000 IBM Corporation | ||
10 | * | ||
11 | * This header file is used by the iSeries virtual I/O device | ||
12 | * drivers. It defines the interfaces to the common functions | ||
13 | * (implemented in drivers/char/viopath.h) as well as defining | ||
14 | * common functions and structures. Currently (at the time I | ||
15 | * wrote this comment) the iSeries virtual I/O device drivers | ||
16 | * that use this are | ||
17 | * drivers/block/viodasd.c | ||
18 | * drivers/char/viocons.c | ||
19 | * drivers/char/viotape.c | ||
20 | * drivers/cdrom/viocd.c | ||
21 | * | ||
22 | * The iSeries virtual ethernet support (veth.c) uses a whole | ||
23 | * different set of functions. | ||
24 | * | ||
25 | * This program is free software; you can redistribute it and/or | ||
26 | * modify it under the terms of the GNU General Public License as | ||
27 | * published by the Free Software Foundation; either version 2 of the | ||
28 | * License, or (at your option) anyu later version. | ||
29 | * | ||
30 | * This program is distributed in the hope that it will be useful, but | ||
31 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
32 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
33 | * General Public License for more details. | ||
34 | * | ||
35 | * You should have received a copy of the GNU General Public License | ||
36 | * along with this program; if not, write to the Free Software Foundation, | ||
37 | * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
38 | * | ||
39 | */ | ||
40 | #ifndef _ASM_POWERPC_ISERIES_VIO_H | ||
41 | #define _ASM_POWERPC_ISERIES_VIO_H | ||
42 | |||
43 | #include <asm/iseries/hv_types.h> | ||
44 | #include <asm/iseries/hv_lp_event.h> | ||
45 | |||
46 | /* | ||
47 | * iSeries virtual I/O events use the subtype field in | ||
48 | * HvLpEvent to figure out what kind of vio event is coming | ||
49 | * in. We use a table to route these, and this defines | ||
50 | * the maximum number of distinct subtypes | ||
51 | */ | ||
52 | #define VIO_MAX_SUBTYPES 8 | ||
53 | |||
54 | #define VIOMAXBLOCKDMA 12 | ||
55 | |||
56 | struct open_data { | ||
57 | u64 disk_size; | ||
58 | u16 max_disk; | ||
59 | u16 cylinders; | ||
60 | u16 tracks; | ||
61 | u16 sectors; | ||
62 | u16 bytes_per_sector; | ||
63 | }; | ||
64 | |||
65 | struct rw_data { | ||
66 | u64 offset; | ||
67 | struct { | ||
68 | u32 token; | ||
69 | u32 reserved; | ||
70 | u64 len; | ||
71 | } dma_info[VIOMAXBLOCKDMA]; | ||
72 | }; | ||
73 | |||
74 | struct vioblocklpevent { | ||
75 | struct HvLpEvent event; | ||
76 | u32 reserved; | ||
77 | u16 version; | ||
78 | u16 sub_result; | ||
79 | u16 disk; | ||
80 | u16 flags; | ||
81 | union { | ||
82 | struct open_data open_data; | ||
83 | struct rw_data rw_data; | ||
84 | u64 changed; | ||
85 | } u; | ||
86 | }; | ||
87 | |||
88 | #define vioblockflags_ro 0x0001 | ||
89 | |||
90 | enum vioblocksubtype { | ||
91 | vioblockopen = 0x0001, | ||
92 | vioblockclose = 0x0002, | ||
93 | vioblockread = 0x0003, | ||
94 | vioblockwrite = 0x0004, | ||
95 | vioblockflush = 0x0005, | ||
96 | vioblockcheck = 0x0007 | ||
97 | }; | ||
98 | |||
99 | struct viocdlpevent { | ||
100 | struct HvLpEvent event; | ||
101 | u32 reserved; | ||
102 | u16 version; | ||
103 | u16 sub_result; | ||
104 | u16 disk; | ||
105 | u16 flags; | ||
106 | u32 token; | ||
107 | u64 offset; /* On open, max number of disks */ | ||
108 | u64 len; /* On open, size of the disk */ | ||
109 | u32 block_size; /* Only set on open */ | ||
110 | u32 media_size; /* Only set on open */ | ||
111 | }; | ||
112 | |||
113 | enum viocdsubtype { | ||
114 | viocdopen = 0x0001, | ||
115 | viocdclose = 0x0002, | ||
116 | viocdread = 0x0003, | ||
117 | viocdwrite = 0x0004, | ||
118 | viocdlockdoor = 0x0005, | ||
119 | viocdgetinfo = 0x0006, | ||
120 | viocdcheck = 0x0007 | ||
121 | }; | ||
122 | |||
123 | struct viotapelpevent { | ||
124 | struct HvLpEvent event; | ||
125 | u32 reserved; | ||
126 | u16 version; | ||
127 | u16 sub_type_result; | ||
128 | u16 tape; | ||
129 | u16 flags; | ||
130 | u32 token; | ||
131 | u64 len; | ||
132 | union { | ||
133 | struct { | ||
134 | u32 tape_op; | ||
135 | u32 count; | ||
136 | } op; | ||
137 | struct { | ||
138 | u32 type; | ||
139 | u32 resid; | ||
140 | u32 dsreg; | ||
141 | u32 gstat; | ||
142 | u32 erreg; | ||
143 | u32 file_no; | ||
144 | u32 block_no; | ||
145 | } get_status; | ||
146 | struct { | ||
147 | u32 block_no; | ||
148 | } get_pos; | ||
149 | } u; | ||
150 | }; | ||
151 | |||
152 | enum viotapesubtype { | ||
153 | viotapeopen = 0x0001, | ||
154 | viotapeclose = 0x0002, | ||
155 | viotaperead = 0x0003, | ||
156 | viotapewrite = 0x0004, | ||
157 | viotapegetinfo = 0x0005, | ||
158 | viotapeop = 0x0006, | ||
159 | viotapegetpos = 0x0007, | ||
160 | viotapesetpos = 0x0008, | ||
161 | viotapegetstatus = 0x0009 | ||
162 | }; | ||
163 | |||
164 | /* | ||
165 | * Each subtype can register a handler to process their events. | ||
166 | * The handler must have this interface. | ||
167 | */ | ||
168 | typedef void (vio_event_handler_t) (struct HvLpEvent * event); | ||
169 | |||
170 | extern int viopath_open(HvLpIndex remoteLp, int subtype, int numReq); | ||
171 | extern int viopath_close(HvLpIndex remoteLp, int subtype, int numReq); | ||
172 | extern int vio_setHandler(int subtype, vio_event_handler_t * beh); | ||
173 | extern int vio_clearHandler(int subtype); | ||
174 | extern int viopath_isactive(HvLpIndex lp); | ||
175 | extern HvLpInstanceId viopath_sourceinst(HvLpIndex lp); | ||
176 | extern HvLpInstanceId viopath_targetinst(HvLpIndex lp); | ||
177 | extern void vio_set_hostlp(void); | ||
178 | extern void *vio_get_event_buffer(int subtype); | ||
179 | extern void vio_free_event_buffer(int subtype, void *buffer); | ||
180 | |||
181 | extern struct vio_dev *vio_create_viodasd(u32 unit); | ||
182 | |||
183 | extern HvLpIndex viopath_hostLp; | ||
184 | extern HvLpIndex viopath_ourLp; | ||
185 | |||
186 | #define VIOCHAR_MAX_DATA 200 | ||
187 | |||
188 | #define VIOMAJOR_SUBTYPE_MASK 0xff00 | ||
189 | #define VIOMINOR_SUBTYPE_MASK 0x00ff | ||
190 | #define VIOMAJOR_SUBTYPE_SHIFT 8 | ||
191 | |||
192 | #define VIOVERSION 0x0101 | ||
193 | |||
194 | /* | ||
195 | * This is the general structure for VIO errors; each module should have | ||
196 | * a table of them, and each table should be terminated by an entry of | ||
197 | * { 0, 0, NULL }. Then, to find a specific error message, a module | ||
198 | * should pass its local table and the return code. | ||
199 | */ | ||
200 | struct vio_error_entry { | ||
201 | u16 rc; | ||
202 | int errno; | ||
203 | const char *msg; | ||
204 | }; | ||
205 | extern const struct vio_error_entry *vio_lookup_rc( | ||
206 | const struct vio_error_entry *local_table, u16 rc); | ||
207 | |||
208 | enum viosubtypes { | ||
209 | viomajorsubtype_monitor = 0x0100, | ||
210 | viomajorsubtype_blockio = 0x0200, | ||
211 | viomajorsubtype_chario = 0x0300, | ||
212 | viomajorsubtype_config = 0x0400, | ||
213 | viomajorsubtype_cdio = 0x0500, | ||
214 | viomajorsubtype_tape = 0x0600, | ||
215 | viomajorsubtype_scsi = 0x0700 | ||
216 | }; | ||
217 | |||
218 | enum vioconfigsubtype { | ||
219 | vioconfigget = 0x0001, | ||
220 | }; | ||
221 | |||
222 | enum viorc { | ||
223 | viorc_good = 0x0000, | ||
224 | viorc_noConnection = 0x0001, | ||
225 | viorc_noReceiver = 0x0002, | ||
226 | viorc_noBufferAvailable = 0x0003, | ||
227 | viorc_invalidMessageType = 0x0004, | ||
228 | viorc_invalidRange = 0x0201, | ||
229 | viorc_invalidToken = 0x0202, | ||
230 | viorc_DMAError = 0x0203, | ||
231 | viorc_useError = 0x0204, | ||
232 | viorc_releaseError = 0x0205, | ||
233 | viorc_invalidDisk = 0x0206, | ||
234 | viorc_openRejected = 0x0301 | ||
235 | }; | ||
236 | |||
237 | /* | ||
238 | * The structure of the events that flow between us and OS/400 for chario | ||
239 | * events. You can't mess with this unless the OS/400 side changes too. | ||
240 | */ | ||
241 | struct viocharlpevent { | ||
242 | struct HvLpEvent event; | ||
243 | u32 reserved; | ||
244 | u16 version; | ||
245 | u16 subtype_result_code; | ||
246 | u8 virtual_device; | ||
247 | u8 len; | ||
248 | u8 data[VIOCHAR_MAX_DATA]; | ||
249 | }; | ||
250 | |||
251 | #define VIOCHAR_WINDOW 10 | ||
252 | |||
253 | enum viocharsubtype { | ||
254 | viocharopen = 0x0001, | ||
255 | viocharclose = 0x0002, | ||
256 | viochardata = 0x0003, | ||
257 | viocharack = 0x0004, | ||
258 | viocharconfig = 0x0005 | ||
259 | }; | ||
260 | |||
261 | enum viochar_rc { | ||
262 | viochar_rc_ebusy = 1 | ||
263 | }; | ||
264 | |||
265 | #endif /* _ASM_POWERPC_ISERIES_VIO_H */ | ||
diff --git a/arch/powerpc/include/asm/lppaca.h b/arch/powerpc/include/asm/lppaca.h index e0298d26ce5d..a76254af0aaa 100644 --- a/arch/powerpc/include/asm/lppaca.h +++ b/arch/powerpc/include/asm/lppaca.h | |||
@@ -41,15 +41,7 @@ | |||
41 | * We only have to have statically allocated lppaca structs on | 41 | * We only have to have statically allocated lppaca structs on |
42 | * legacy iSeries, which supports at most 64 cpus. | 42 | * legacy iSeries, which supports at most 64 cpus. |
43 | */ | 43 | */ |
44 | #ifdef CONFIG_PPC_ISERIES | ||
45 | #if NR_CPUS < 64 | ||
46 | #define NR_LPPACAS NR_CPUS | ||
47 | #else | ||
48 | #define NR_LPPACAS 64 | ||
49 | #endif | ||
50 | #else /* not iSeries */ | ||
51 | #define NR_LPPACAS 1 | 44 | #define NR_LPPACAS 1 |
52 | #endif | ||
53 | 45 | ||
54 | 46 | ||
55 | /* The Hypervisor barfs if the lppaca crosses a page boundary. A 1k | 47 | /* The Hypervisor barfs if the lppaca crosses a page boundary. A 1k |
diff --git a/arch/powerpc/include/asm/mpic.h b/arch/powerpc/include/asm/mpic.h index a5b7c56237f9..c65b9294376e 100644 --- a/arch/powerpc/include/asm/mpic.h +++ b/arch/powerpc/include/asm/mpic.h | |||
@@ -273,7 +273,6 @@ struct mpic | |||
273 | unsigned int isu_size; | 273 | unsigned int isu_size; |
274 | unsigned int isu_shift; | 274 | unsigned int isu_shift; |
275 | unsigned int isu_mask; | 275 | unsigned int isu_mask; |
276 | unsigned int irq_count; | ||
277 | /* Number of sources */ | 276 | /* Number of sources */ |
278 | unsigned int num_sources; | 277 | unsigned int num_sources; |
279 | /* default senses array */ | 278 | /* default senses array */ |
@@ -349,8 +348,6 @@ struct mpic | |||
349 | #define MPIC_U3_HT_IRQS 0x00000004 | 348 | #define MPIC_U3_HT_IRQS 0x00000004 |
350 | /* Broken IPI registers (autodetected) */ | 349 | /* Broken IPI registers (autodetected) */ |
351 | #define MPIC_BROKEN_IPI 0x00000008 | 350 | #define MPIC_BROKEN_IPI 0x00000008 |
352 | /* MPIC wants a reset */ | ||
353 | #define MPIC_WANTS_RESET 0x00000010 | ||
354 | /* Spurious vector requires EOI */ | 351 | /* Spurious vector requires EOI */ |
355 | #define MPIC_SPV_EOI 0x00000020 | 352 | #define MPIC_SPV_EOI 0x00000020 |
356 | /* No passthrough disable */ | 353 | /* No passthrough disable */ |
@@ -363,15 +360,11 @@ struct mpic | |||
363 | #define MPIC_ENABLE_MCK 0x00000200 | 360 | #define MPIC_ENABLE_MCK 0x00000200 |
364 | /* Disable bias among target selection, spread interrupts evenly */ | 361 | /* Disable bias among target selection, spread interrupts evenly */ |
365 | #define MPIC_NO_BIAS 0x00000400 | 362 | #define MPIC_NO_BIAS 0x00000400 |
366 | /* Ignore NIRQS as reported by FRR */ | ||
367 | #define MPIC_BROKEN_FRR_NIRQS 0x00000800 | ||
368 | /* Destination only supports a single CPU at a time */ | 363 | /* Destination only supports a single CPU at a time */ |
369 | #define MPIC_SINGLE_DEST_CPU 0x00001000 | 364 | #define MPIC_SINGLE_DEST_CPU 0x00001000 |
370 | /* Enable CoreInt delivery of interrupts */ | 365 | /* Enable CoreInt delivery of interrupts */ |
371 | #define MPIC_ENABLE_COREINT 0x00002000 | 366 | #define MPIC_ENABLE_COREINT 0x00002000 |
372 | /* Disable resetting of the MPIC. | 367 | /* Do not reset the MPIC during initialization */ |
373 | * NOTE: This flag trumps MPIC_WANTS_RESET. | ||
374 | */ | ||
375 | #define MPIC_NO_RESET 0x00004000 | 368 | #define MPIC_NO_RESET 0x00004000 |
376 | /* Freescale MPIC (compatible includes "fsl,mpic") */ | 369 | /* Freescale MPIC (compatible includes "fsl,mpic") */ |
377 | #define MPIC_FSL 0x00008000 | 370 | #define MPIC_FSL 0x00008000 |
diff --git a/arch/powerpc/include/asm/mpic_msgr.h b/arch/powerpc/include/asm/mpic_msgr.h new file mode 100644 index 000000000000..3ec37dc9003e --- /dev/null +++ b/arch/powerpc/include/asm/mpic_msgr.h | |||
@@ -0,0 +1,132 @@ | |||
1 | /* | ||
2 | * Copyright 2011-2012, Meador Inge, Mentor Graphics Corporation. | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or | ||
5 | * modify it under the terms of the GNU General Public License | ||
6 | * as published by the Free Software Foundation; version 2 of the | ||
7 | * License. | ||
8 | * | ||
9 | */ | ||
10 | |||
11 | #ifndef _ASM_MPIC_MSGR_H | ||
12 | #define _ASM_MPIC_MSGR_H | ||
13 | |||
14 | #include <linux/types.h> | ||
15 | #include <linux/spinlock.h> | ||
16 | |||
17 | struct mpic_msgr { | ||
18 | u32 __iomem *base; | ||
19 | u32 __iomem *mer; | ||
20 | int irq; | ||
21 | unsigned char in_use; | ||
22 | raw_spinlock_t lock; | ||
23 | int num; | ||
24 | }; | ||
25 | |||
26 | /* Get a message register | ||
27 | * | ||
28 | * @reg_num: the MPIC message register to get | ||
29 | * | ||
30 | * A pointer to the message register is returned. If | ||
31 | * the message register asked for is already in use, then | ||
32 | * EBUSY is returned. If the number given is not associated | ||
33 | * with an actual message register, then ENODEV is returned. | ||
34 | * Successfully getting the register marks it as in use. | ||
35 | */ | ||
36 | extern struct mpic_msgr *mpic_msgr_get(unsigned int reg_num); | ||
37 | |||
38 | /* Relinquish a message register | ||
39 | * | ||
40 | * @msgr: the message register to return | ||
41 | * | ||
42 | * Disables the given message register and marks it as free. | ||
43 | * After this call has completed successully the message | ||
44 | * register is available to be acquired by a call to | ||
45 | * mpic_msgr_get. | ||
46 | */ | ||
47 | extern void mpic_msgr_put(struct mpic_msgr *msgr); | ||
48 | |||
49 | /* Enable a message register | ||
50 | * | ||
51 | * @msgr: the message register to enable | ||
52 | * | ||
53 | * The given message register is enabled for sending | ||
54 | * messages. | ||
55 | */ | ||
56 | extern void mpic_msgr_enable(struct mpic_msgr *msgr); | ||
57 | |||
58 | /* Disable a message register | ||
59 | * | ||
60 | * @msgr: the message register to disable | ||
61 | * | ||
62 | * The given message register is disabled for sending | ||
63 | * messages. | ||
64 | */ | ||
65 | extern void mpic_msgr_disable(struct mpic_msgr *msgr); | ||
66 | |||
67 | /* Write a message to a message register | ||
68 | * | ||
69 | * @msgr: the message register to write to | ||
70 | * @message: the message to write | ||
71 | * | ||
72 | * The given 32-bit message is written to the given message | ||
73 | * register. Writing to an enabled message registers fires | ||
74 | * an interrupt. | ||
75 | */ | ||
76 | static inline void mpic_msgr_write(struct mpic_msgr *msgr, u32 message) | ||
77 | { | ||
78 | out_be32(msgr->base, message); | ||
79 | } | ||
80 | |||
81 | /* Read a message from a message register | ||
82 | * | ||
83 | * @msgr: the message register to read from | ||
84 | * | ||
85 | * Returns the 32-bit value currently in the given message register. | ||
86 | * Upon reading the register any interrupts for that register are | ||
87 | * cleared. | ||
88 | */ | ||
89 | static inline u32 mpic_msgr_read(struct mpic_msgr *msgr) | ||
90 | { | ||
91 | return in_be32(msgr->base); | ||
92 | } | ||
93 | |||
94 | /* Clear a message register | ||
95 | * | ||
96 | * @msgr: the message register to clear | ||
97 | * | ||
98 | * Clears any interrupts associated with the given message register. | ||
99 | */ | ||
100 | static inline void mpic_msgr_clear(struct mpic_msgr *msgr) | ||
101 | { | ||
102 | (void) mpic_msgr_read(msgr); | ||
103 | } | ||
104 | |||
105 | /* Set the destination CPU for the message register | ||
106 | * | ||
107 | * @msgr: the message register whose destination is to be set | ||
108 | * @cpu_num: the Linux CPU number to bind the message register to | ||
109 | * | ||
110 | * Note that the CPU number given is the CPU number used by the kernel | ||
111 | * and *not* the actual hardware CPU number. | ||
112 | */ | ||
113 | static inline void mpic_msgr_set_destination(struct mpic_msgr *msgr, | ||
114 | u32 cpu_num) | ||
115 | { | ||
116 | out_be32(msgr->base, 1 << get_hard_smp_processor_id(cpu_num)); | ||
117 | } | ||
118 | |||
119 | /* Get the IRQ number for the message register | ||
120 | * @msgr: the message register whose IRQ is to be returned | ||
121 | * | ||
122 | * Returns the IRQ number associated with the given message register. | ||
123 | * NO_IRQ is returned if this message register is not capable of | ||
124 | * receiving interrupts. What message register can and cannot receive | ||
125 | * interrupts is specified in the device tree for the system. | ||
126 | */ | ||
127 | static inline int mpic_msgr_get_irq(struct mpic_msgr *msgr) | ||
128 | { | ||
129 | return msgr->irq; | ||
130 | } | ||
131 | |||
132 | #endif | ||
diff --git a/arch/powerpc/include/asm/paca.h b/arch/powerpc/include/asm/paca.h index 269c05a36d91..daf813fea91f 100644 --- a/arch/powerpc/include/asm/paca.h +++ b/arch/powerpc/include/asm/paca.h | |||
@@ -132,7 +132,7 @@ struct paca_struct { | |||
132 | u64 saved_msr; /* MSR saved here by enter_rtas */ | 132 | u64 saved_msr; /* MSR saved here by enter_rtas */ |
133 | u16 trap_save; /* Used when bad stack is encountered */ | 133 | u16 trap_save; /* Used when bad stack is encountered */ |
134 | u8 soft_enabled; /* irq soft-enable flag */ | 134 | u8 soft_enabled; /* irq soft-enable flag */ |
135 | u8 hard_enabled; /* set if irqs are enabled in MSR */ | 135 | u8 irq_happened; /* irq happened while soft-disabled */ |
136 | u8 io_sync; /* writel() needs spin_unlock sync */ | 136 | u8 io_sync; /* writel() needs spin_unlock sync */ |
137 | u8 irq_work_pending; /* IRQ_WORK interrupt while soft-disable */ | 137 | u8 irq_work_pending; /* IRQ_WORK interrupt while soft-disable */ |
138 | u8 nap_state_lost; /* NV GPR values lost in power7_idle */ | 138 | u8 nap_state_lost; /* NV GPR values lost in power7_idle */ |
diff --git a/arch/powerpc/include/asm/phyp_dump.h b/arch/powerpc/include/asm/phyp_dump.h deleted file mode 100644 index fa74c6c3e106..000000000000 --- a/arch/powerpc/include/asm/phyp_dump.h +++ /dev/null | |||
@@ -1,47 +0,0 @@ | |||
1 | /* | ||
2 | * Hypervisor-assisted dump | ||
3 | * | ||
4 | * Linas Vepstas, Manish Ahuja 2008 | ||
5 | * Copyright 2008 IBM Corp. | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or | ||
8 | * modify it under the terms of the GNU General Public License | ||
9 | * as published by the Free Software Foundation; either version | ||
10 | * 2 of the License, or (at your option) any later version. | ||
11 | */ | ||
12 | |||
13 | #ifndef _PPC64_PHYP_DUMP_H | ||
14 | #define _PPC64_PHYP_DUMP_H | ||
15 | |||
16 | #ifdef CONFIG_PHYP_DUMP | ||
17 | |||
18 | /* The RMR region will be saved for later dumping | ||
19 | * whenever the kernel crashes. Set this to 256MB. */ | ||
20 | #define PHYP_DUMP_RMR_START 0x0 | ||
21 | #define PHYP_DUMP_RMR_END (1UL<<28) | ||
22 | |||
23 | struct phyp_dump { | ||
24 | /* Memory that is reserved during very early boot. */ | ||
25 | unsigned long init_reserve_start; | ||
26 | unsigned long init_reserve_size; | ||
27 | /* cmd line options during boot */ | ||
28 | unsigned long reserve_bootvar; | ||
29 | unsigned long phyp_dump_at_boot; | ||
30 | /* Check status during boot if dump supported, active & present*/ | ||
31 | unsigned long phyp_dump_configured; | ||
32 | unsigned long phyp_dump_is_active; | ||
33 | /* store cpu & hpte size */ | ||
34 | unsigned long cpu_state_size; | ||
35 | unsigned long hpte_region_size; | ||
36 | /* previous scratch area values */ | ||
37 | unsigned long reserved_scratch_addr; | ||
38 | unsigned long reserved_scratch_size; | ||
39 | }; | ||
40 | |||
41 | extern struct phyp_dump *phyp_dump_info; | ||
42 | |||
43 | int early_init_dt_scan_phyp_dump(unsigned long node, | ||
44 | const char *uname, int depth, void *data); | ||
45 | |||
46 | #endif /* CONFIG_PHYP_DUMP */ | ||
47 | #endif /* _PPC64_PHYP_DUMP_H */ | ||
diff --git a/arch/powerpc/include/asm/ppc-pci.h b/arch/powerpc/include/asm/ppc-pci.h index 6d422979ebaf..e660b37aa7d0 100644 --- a/arch/powerpc/include/asm/ppc-pci.h +++ b/arch/powerpc/include/asm/ppc-pci.h | |||
@@ -47,92 +47,21 @@ extern int rtas_setup_phb(struct pci_controller *phb); | |||
47 | 47 | ||
48 | extern unsigned long pci_probe_only; | 48 | extern unsigned long pci_probe_only; |
49 | 49 | ||
50 | /* ---- EEH internal-use-only related routines ---- */ | ||
51 | #ifdef CONFIG_EEH | 50 | #ifdef CONFIG_EEH |
52 | 51 | ||
52 | void pci_addr_cache_build(void); | ||
53 | void pci_addr_cache_insert_device(struct pci_dev *dev); | 53 | void pci_addr_cache_insert_device(struct pci_dev *dev); |
54 | void pci_addr_cache_remove_device(struct pci_dev *dev); | 54 | void pci_addr_cache_remove_device(struct pci_dev *dev); |
55 | void pci_addr_cache_build(void); | 55 | struct pci_dev *pci_addr_cache_get_device(unsigned long addr); |
56 | struct pci_dev *pci_get_device_by_addr(unsigned long addr); | 56 | void eeh_slot_error_detail(struct eeh_dev *edev, int severity); |
57 | 57 | int eeh_pci_enable(struct eeh_dev *edev, int function); | |
58 | /** | 58 | int eeh_reset_pe(struct eeh_dev *); |
59 | * eeh_slot_error_detail -- record and EEH error condition to the log | 59 | void eeh_restore_bars(struct eeh_dev *); |
60 | * @pdn: pci device node | ||
61 | * @severity: EEH_LOG_TEMP_FAILURE or EEH_LOG_PERM_FAILURE | ||
62 | * | ||
63 | * Obtains the EEH error details from the RTAS subsystem, | ||
64 | * and then logs these details with the RTAS error log system. | ||
65 | */ | ||
66 | #define EEH_LOG_TEMP_FAILURE 1 | ||
67 | #define EEH_LOG_PERM_FAILURE 2 | ||
68 | void eeh_slot_error_detail (struct pci_dn *pdn, int severity); | ||
69 | |||
70 | /** | ||
71 | * rtas_pci_enable - enable IO transfers for this slot | ||
72 | * @pdn: pci device node | ||
73 | * @function: either EEH_THAW_MMIO or EEH_THAW_DMA | ||
74 | * | ||
75 | * Enable I/O transfers to this slot | ||
76 | */ | ||
77 | #define EEH_THAW_MMIO 2 | ||
78 | #define EEH_THAW_DMA 3 | ||
79 | int rtas_pci_enable(struct pci_dn *pdn, int function); | ||
80 | |||
81 | /** | ||
82 | * rtas_set_slot_reset -- unfreeze a frozen slot | ||
83 | * @pdn: pci device node | ||
84 | * | ||
85 | * Clear the EEH-frozen condition on a slot. This routine | ||
86 | * does this by asserting the PCI #RST line for 1/8th of | ||
87 | * a second; this routine will sleep while the adapter is | ||
88 | * being reset. | ||
89 | * | ||
90 | * Returns a non-zero value if the reset failed. | ||
91 | */ | ||
92 | int rtas_set_slot_reset (struct pci_dn *); | ||
93 | int eeh_wait_for_slot_status(struct pci_dn *pdn, int max_wait_msecs); | ||
94 | |||
95 | /** | ||
96 | * eeh_restore_bars - Restore device configuration info. | ||
97 | * @pdn: pci device node | ||
98 | * | ||
99 | * A reset of a PCI device will clear out its config space. | ||
100 | * This routines will restore the config space for this | ||
101 | * device, and is children, to values previously obtained | ||
102 | * from the firmware. | ||
103 | */ | ||
104 | void eeh_restore_bars(struct pci_dn *); | ||
105 | |||
106 | /** | ||
107 | * rtas_configure_bridge -- firmware initialization of pci bridge | ||
108 | * @pdn: pci device node | ||
109 | * | ||
110 | * Ask the firmware to configure all PCI bridges devices | ||
111 | * located behind the indicated node. Required after a | ||
112 | * pci device reset. Does essentially the same hing as | ||
113 | * eeh_restore_bars, but for brdges, and lets firmware | ||
114 | * do the work. | ||
115 | */ | ||
116 | void rtas_configure_bridge(struct pci_dn *); | ||
117 | |||
118 | int rtas_write_config(struct pci_dn *, int where, int size, u32 val); | 60 | int rtas_write_config(struct pci_dn *, int where, int size, u32 val); |
119 | int rtas_read_config(struct pci_dn *, int where, int size, u32 *val); | 61 | int rtas_read_config(struct pci_dn *, int where, int size, u32 *val); |
120 | 62 | void eeh_mark_slot(struct device_node *dn, int mode_flag); | |
121 | /** | 63 | void eeh_clear_slot(struct device_node *dn, int mode_flag); |
122 | * eeh_mark_slot -- set mode flags for pertition endpoint | 64 | struct device_node *eeh_find_device_pe(struct device_node *dn); |
123 | * @pdn: pci device node | ||
124 | * | ||
125 | * mark and clear slots: find "partition endpoint" PE and set or | ||
126 | * clear the flags for each subnode of the PE. | ||
127 | */ | ||
128 | void eeh_mark_slot (struct device_node *dn, int mode_flag); | ||
129 | void eeh_clear_slot (struct device_node *dn, int mode_flag); | ||
130 | |||
131 | /** | ||
132 | * find_device_pe -- Find the associated "Partiationable Endpoint" PE | ||
133 | * @pdn: pci device node | ||
134 | */ | ||
135 | struct device_node * find_device_pe(struct device_node *dn); | ||
136 | 65 | ||
137 | void eeh_sysfs_add_device(struct pci_dev *pdev); | 66 | void eeh_sysfs_add_device(struct pci_dev *pdev); |
138 | void eeh_sysfs_remove_device(struct pci_dev *pdev); | 67 | void eeh_sysfs_remove_device(struct pci_dev *pdev); |
diff --git a/arch/powerpc/include/asm/ppc_asm.h b/arch/powerpc/include/asm/ppc_asm.h index 368f72f79808..50f73aa2ba21 100644 --- a/arch/powerpc/include/asm/ppc_asm.h +++ b/arch/powerpc/include/asm/ppc_asm.h | |||
@@ -60,6 +60,8 @@ BEGIN_FW_FTR_SECTION; \ | |||
60 | cmpd cr1,r11,r10; \ | 60 | cmpd cr1,r11,r10; \ |
61 | beq+ cr1,33f; \ | 61 | beq+ cr1,33f; \ |
62 | bl .accumulate_stolen_time; \ | 62 | bl .accumulate_stolen_time; \ |
63 | ld r12,_MSR(r1); \ | ||
64 | andi. r10,r12,MSR_PR; /* Restore cr0 (coming from user) */ \ | ||
63 | 33: \ | 65 | 33: \ |
64 | END_FW_FTR_SECTION_IFSET(FW_FEATURE_SPLPAR) | 66 | END_FW_FTR_SECTION_IFSET(FW_FEATURE_SPLPAR) |
65 | 67 | ||
diff --git a/arch/powerpc/include/asm/reg.h b/arch/powerpc/include/asm/reg.h index 7fdc2c0b7fa0..b1a215eabef6 100644 --- a/arch/powerpc/include/asm/reg.h +++ b/arch/powerpc/include/asm/reg.h | |||
@@ -1079,30 +1079,12 @@ | |||
1079 | 1079 | ||
1080 | #define proc_trap() asm volatile("trap") | 1080 | #define proc_trap() asm volatile("trap") |
1081 | 1081 | ||
1082 | #ifdef CONFIG_PPC64 | 1082 | #define __get_SP() ({unsigned long sp; \ |
1083 | 1083 | asm volatile("mr %0,1": "=r" (sp)); sp;}) | |
1084 | extern void ppc64_runlatch_on(void); | ||
1085 | extern void __ppc64_runlatch_off(void); | ||
1086 | |||
1087 | #define ppc64_runlatch_off() \ | ||
1088 | do { \ | ||
1089 | if (cpu_has_feature(CPU_FTR_CTRL) && \ | ||
1090 | test_thread_flag(TIF_RUNLATCH)) \ | ||
1091 | __ppc64_runlatch_off(); \ | ||
1092 | } while (0) | ||
1093 | 1084 | ||
1094 | extern unsigned long scom970_read(unsigned int address); | 1085 | extern unsigned long scom970_read(unsigned int address); |
1095 | extern void scom970_write(unsigned int address, unsigned long value); | 1086 | extern void scom970_write(unsigned int address, unsigned long value); |
1096 | 1087 | ||
1097 | #else | ||
1098 | #define ppc64_runlatch_on() | ||
1099 | #define ppc64_runlatch_off() | ||
1100 | |||
1101 | #endif /* CONFIG_PPC64 */ | ||
1102 | |||
1103 | #define __get_SP() ({unsigned long sp; \ | ||
1104 | asm volatile("mr %0,1": "=r" (sp)); sp;}) | ||
1105 | |||
1106 | struct pt_regs; | 1088 | struct pt_regs; |
1107 | 1089 | ||
1108 | extern void ppc_save_regs(struct pt_regs *regs); | 1090 | extern void ppc_save_regs(struct pt_regs *regs); |
diff --git a/arch/powerpc/include/asm/reg_booke.h b/arch/powerpc/include/asm/reg_booke.h index 500fe1dc43e6..8a97aa7289d3 100644 --- a/arch/powerpc/include/asm/reg_booke.h +++ b/arch/powerpc/include/asm/reg_booke.h | |||
@@ -62,6 +62,7 @@ | |||
62 | #define SPRN_DVC2 0x13F /* Data Value Compare Register 2 */ | 62 | #define SPRN_DVC2 0x13F /* Data Value Compare Register 2 */ |
63 | #define SPRN_MAS8 0x155 /* MMU Assist Register 8 */ | 63 | #define SPRN_MAS8 0x155 /* MMU Assist Register 8 */ |
64 | #define SPRN_TLB0PS 0x158 /* TLB 0 Page Size Register */ | 64 | #define SPRN_TLB0PS 0x158 /* TLB 0 Page Size Register */ |
65 | #define SPRN_TLB1PS 0x159 /* TLB 1 Page Size Register */ | ||
65 | #define SPRN_MAS5_MAS6 0x15c /* MMU Assist Register 5 || 6 */ | 66 | #define SPRN_MAS5_MAS6 0x15c /* MMU Assist Register 5 || 6 */ |
66 | #define SPRN_MAS8_MAS1 0x15d /* MMU Assist Register 8 || 1 */ | 67 | #define SPRN_MAS8_MAS1 0x15d /* MMU Assist Register 8 || 1 */ |
67 | #define SPRN_EPTCFG 0x15e /* Embedded Page Table Config */ | 68 | #define SPRN_EPTCFG 0x15e /* Embedded Page Table Config */ |
diff --git a/arch/powerpc/include/asm/spinlock.h b/arch/powerpc/include/asm/spinlock.h index f9611bd69ed2..7124fc06ad47 100644 --- a/arch/powerpc/include/asm/spinlock.h +++ b/arch/powerpc/include/asm/spinlock.h | |||
@@ -23,7 +23,6 @@ | |||
23 | #ifdef CONFIG_PPC64 | 23 | #ifdef CONFIG_PPC64 |
24 | #include <asm/paca.h> | 24 | #include <asm/paca.h> |
25 | #include <asm/hvcall.h> | 25 | #include <asm/hvcall.h> |
26 | #include <asm/iseries/hv_call.h> | ||
27 | #endif | 26 | #endif |
28 | #include <asm/asm-compat.h> | 27 | #include <asm/asm-compat.h> |
29 | #include <asm/synch.h> | 28 | #include <asm/synch.h> |
@@ -95,12 +94,12 @@ static inline int arch_spin_trylock(arch_spinlock_t *lock) | |||
95 | * value. | 94 | * value. |
96 | */ | 95 | */ |
97 | 96 | ||
98 | #if defined(CONFIG_PPC_SPLPAR) || defined(CONFIG_PPC_ISERIES) | 97 | #if defined(CONFIG_PPC_SPLPAR) |
99 | /* We only yield to the hypervisor if we are in shared processor mode */ | 98 | /* We only yield to the hypervisor if we are in shared processor mode */ |
100 | #define SHARED_PROCESSOR (get_lppaca()->shared_proc) | 99 | #define SHARED_PROCESSOR (get_lppaca()->shared_proc) |
101 | extern void __spin_yield(arch_spinlock_t *lock); | 100 | extern void __spin_yield(arch_spinlock_t *lock); |
102 | extern void __rw_yield(arch_rwlock_t *lock); | 101 | extern void __rw_yield(arch_rwlock_t *lock); |
103 | #else /* SPLPAR || ISERIES */ | 102 | #else /* SPLPAR */ |
104 | #define __spin_yield(x) barrier() | 103 | #define __spin_yield(x) barrier() |
105 | #define __rw_yield(x) barrier() | 104 | #define __rw_yield(x) barrier() |
106 | #define SHARED_PROCESSOR 0 | 105 | #define SHARED_PROCESSOR 0 |
diff --git a/arch/powerpc/include/asm/system.h b/arch/powerpc/include/asm/system.h index c377457d1b89..a02883d5af43 100644 --- a/arch/powerpc/include/asm/system.h +++ b/arch/powerpc/include/asm/system.h | |||
@@ -550,5 +550,43 @@ extern void reloc_got2(unsigned long); | |||
550 | 550 | ||
551 | extern struct dentry *powerpc_debugfs_root; | 551 | extern struct dentry *powerpc_debugfs_root; |
552 | 552 | ||
553 | #ifdef CONFIG_PPC64 | ||
554 | |||
555 | extern void __ppc64_runlatch_on(void); | ||
556 | extern void __ppc64_runlatch_off(void); | ||
557 | |||
558 | /* | ||
559 | * We manually hard enable-disable, this is called | ||
560 | * in the idle loop and we don't want to mess up | ||
561 | * with soft-disable/enable & interrupt replay. | ||
562 | */ | ||
563 | #define ppc64_runlatch_off() \ | ||
564 | do { \ | ||
565 | if (cpu_has_feature(CPU_FTR_CTRL) && \ | ||
566 | test_thread_local_flags(_TLF_RUNLATCH)) { \ | ||
567 | unsigned long msr = mfmsr(); \ | ||
568 | __hard_irq_disable(); \ | ||
569 | __ppc64_runlatch_off(); \ | ||
570 | if (msr & MSR_EE) \ | ||
571 | __hard_irq_enable(); \ | ||
572 | } \ | ||
573 | } while (0) | ||
574 | |||
575 | #define ppc64_runlatch_on() \ | ||
576 | do { \ | ||
577 | if (cpu_has_feature(CPU_FTR_CTRL) && \ | ||
578 | !test_thread_local_flags(_TLF_RUNLATCH)) { \ | ||
579 | unsigned long msr = mfmsr(); \ | ||
580 | __hard_irq_disable(); \ | ||
581 | __ppc64_runlatch_on(); \ | ||
582 | if (msr & MSR_EE) \ | ||
583 | __hard_irq_enable(); \ | ||
584 | } \ | ||
585 | } while (0) | ||
586 | #else | ||
587 | #define ppc64_runlatch_on() | ||
588 | #define ppc64_runlatch_off() | ||
589 | #endif /* CONFIG_PPC64 */ | ||
590 | |||
553 | #endif /* __KERNEL__ */ | 591 | #endif /* __KERNEL__ */ |
554 | #endif /* _ASM_POWERPC_SYSTEM_H */ | 592 | #endif /* _ASM_POWERPC_SYSTEM_H */ |
diff --git a/arch/powerpc/include/asm/thread_info.h b/arch/powerpc/include/asm/thread_info.h index 964714940961..4a741c7efd02 100644 --- a/arch/powerpc/include/asm/thread_info.h +++ b/arch/powerpc/include/asm/thread_info.h | |||
@@ -110,7 +110,6 @@ static inline struct thread_info *current_thread_info(void) | |||
110 | #define TIF_NOERROR 12 /* Force successful syscall return */ | 110 | #define TIF_NOERROR 12 /* Force successful syscall return */ |
111 | #define TIF_NOTIFY_RESUME 13 /* callback before returning to user */ | 111 | #define TIF_NOTIFY_RESUME 13 /* callback before returning to user */ |
112 | #define TIF_SYSCALL_TRACEPOINT 15 /* syscall tracepoint instrumentation */ | 112 | #define TIF_SYSCALL_TRACEPOINT 15 /* syscall tracepoint instrumentation */ |
113 | #define TIF_RUNLATCH 16 /* Is the runlatch enabled? */ | ||
114 | 113 | ||
115 | /* as above, but as bit values */ | 114 | /* as above, but as bit values */ |
116 | #define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE) | 115 | #define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE) |
@@ -141,11 +140,13 @@ static inline struct thread_info *current_thread_info(void) | |||
141 | #define TLF_SLEEPING 1 /* suspend code enabled SLEEP mode */ | 140 | #define TLF_SLEEPING 1 /* suspend code enabled SLEEP mode */ |
142 | #define TLF_RESTORE_SIGMASK 2 /* Restore signal mask in do_signal */ | 141 | #define TLF_RESTORE_SIGMASK 2 /* Restore signal mask in do_signal */ |
143 | #define TLF_LAZY_MMU 3 /* tlb_batch is active */ | 142 | #define TLF_LAZY_MMU 3 /* tlb_batch is active */ |
143 | #define TLF_RUNLATCH 4 /* Is the runlatch enabled? */ | ||
144 | 144 | ||
145 | #define _TLF_NAPPING (1 << TLF_NAPPING) | 145 | #define _TLF_NAPPING (1 << TLF_NAPPING) |
146 | #define _TLF_SLEEPING (1 << TLF_SLEEPING) | 146 | #define _TLF_SLEEPING (1 << TLF_SLEEPING) |
147 | #define _TLF_RESTORE_SIGMASK (1 << TLF_RESTORE_SIGMASK) | 147 | #define _TLF_RESTORE_SIGMASK (1 << TLF_RESTORE_SIGMASK) |
148 | #define _TLF_LAZY_MMU (1 << TLF_LAZY_MMU) | 148 | #define _TLF_LAZY_MMU (1 << TLF_LAZY_MMU) |
149 | #define _TLF_RUNLATCH (1 << TLF_RUNLATCH) | ||
149 | 150 | ||
150 | #ifndef __ASSEMBLY__ | 151 | #ifndef __ASSEMBLY__ |
151 | #define HAVE_SET_RESTORE_SIGMASK 1 | 152 | #define HAVE_SET_RESTORE_SIGMASK 1 |
@@ -156,6 +157,12 @@ static inline void set_restore_sigmask(void) | |||
156 | set_bit(TIF_SIGPENDING, &ti->flags); | 157 | set_bit(TIF_SIGPENDING, &ti->flags); |
157 | } | 158 | } |
158 | 159 | ||
160 | static inline bool test_thread_local_flags(unsigned int flags) | ||
161 | { | ||
162 | struct thread_info *ti = current_thread_info(); | ||
163 | return (ti->local_flags & flags) != 0; | ||
164 | } | ||
165 | |||
159 | #ifdef CONFIG_PPC64 | 166 | #ifdef CONFIG_PPC64 |
160 | #define is_32bit_task() (test_thread_flag(TIF_32BIT)) | 167 | #define is_32bit_task() (test_thread_flag(TIF_32BIT)) |
161 | #else | 168 | #else |
diff --git a/arch/powerpc/include/asm/time.h b/arch/powerpc/include/asm/time.h index 7eb10fb96cd0..2136f58a54e8 100644 --- a/arch/powerpc/include/asm/time.h +++ b/arch/powerpc/include/asm/time.h | |||
@@ -18,11 +18,6 @@ | |||
18 | #include <linux/percpu.h> | 18 | #include <linux/percpu.h> |
19 | 19 | ||
20 | #include <asm/processor.h> | 20 | #include <asm/processor.h> |
21 | #ifdef CONFIG_PPC_ISERIES | ||
22 | #include <asm/paca.h> | ||
23 | #include <asm/firmware.h> | ||
24 | #include <asm/iseries/hv_call.h> | ||
25 | #endif | ||
26 | 21 | ||
27 | /* time.c */ | 22 | /* time.c */ |
28 | extern unsigned long tb_ticks_per_jiffy; | 23 | extern unsigned long tb_ticks_per_jiffy; |
@@ -167,15 +162,6 @@ static inline void set_dec(int val) | |||
167 | #ifndef CONFIG_BOOKE | 162 | #ifndef CONFIG_BOOKE |
168 | --val; | 163 | --val; |
169 | #endif | 164 | #endif |
170 | #ifdef CONFIG_PPC_ISERIES | ||
171 | if (firmware_has_feature(FW_FEATURE_ISERIES) && | ||
172 | get_lppaca()->shared_proc) { | ||
173 | get_lppaca()->virtual_decr = val; | ||
174 | if (get_dec() > val) | ||
175 | HvCall_setVirtualDecr(); | ||
176 | return; | ||
177 | } | ||
178 | #endif | ||
179 | mtspr(SPRN_DEC, val); | 165 | mtspr(SPRN_DEC, val); |
180 | #endif /* not 40x or 8xx_CPU6 */ | 166 | #endif /* not 40x or 8xx_CPU6 */ |
181 | } | 167 | } |
@@ -217,7 +203,6 @@ DECLARE_PER_CPU(struct cpu_usage, cpu_usage_array); | |||
217 | #endif | 203 | #endif |
218 | 204 | ||
219 | extern void secondary_cpu_time_init(void); | 205 | extern void secondary_cpu_time_init(void); |
220 | extern void iSeries_time_init_early(void); | ||
221 | 206 | ||
222 | DECLARE_PER_CPU(u64, decrementers_next_tb); | 207 | DECLARE_PER_CPU(u64, decrementers_next_tb); |
223 | 208 | ||