diff options
201 files changed, 7075 insertions, 2581 deletions
diff --git a/Documentation/devicetree/bindings/crypto/fsl-sec4.txt b/Documentation/devicetree/bindings/crypto/fsl-sec4.txt index fc9ce6f1688c..6d21c0288e9e 100644 --- a/Documentation/devicetree/bindings/crypto/fsl-sec4.txt +++ b/Documentation/devicetree/bindings/crypto/fsl-sec4.txt | |||
@@ -54,8 +54,13 @@ PROPERTIES | |||
54 | - compatible | 54 | - compatible |
55 | Usage: required | 55 | Usage: required |
56 | Value type: <string> | 56 | Value type: <string> |
57 | Definition: Must include "fsl,sec-v4.0". Also includes SEC | 57 | Definition: Must include "fsl,sec-v4.0" |
58 | ERA versions (optional) with which the device is compatible. | 58 | |
59 | - fsl,sec-era | ||
60 | Usage: optional | ||
61 | Value type: <u32> | ||
62 | Definition: A standard property. Define the 'ERA' of the SEC | ||
63 | device. | ||
59 | 64 | ||
60 | - #address-cells | 65 | - #address-cells |
61 | Usage: required | 66 | Usage: required |
@@ -107,7 +112,8 @@ PROPERTIES | |||
107 | 112 | ||
108 | EXAMPLE | 113 | EXAMPLE |
109 | crypto@300000 { | 114 | crypto@300000 { |
110 | compatible = "fsl,sec-v4.0", "fsl,sec-era-v2.0"; | 115 | compatible = "fsl,sec-v4.0"; |
116 | fsl,sec-era = <0x2>; | ||
111 | #address-cells = <1>; | 117 | #address-cells = <1>; |
112 | #size-cells = <1>; | 118 | #size-cells = <1>; |
113 | reg = <0x300000 0x10000>; | 119 | reg = <0x300000 0x10000>; |
diff --git a/Documentation/devicetree/bindings/powerpc/fsl/guts.txt b/Documentation/devicetree/bindings/powerpc/fsl/guts.txt index 9e7a2417dac5..7f150b5012cc 100644 --- a/Documentation/devicetree/bindings/powerpc/fsl/guts.txt +++ b/Documentation/devicetree/bindings/powerpc/fsl/guts.txt | |||
@@ -17,9 +17,20 @@ Recommended properties: | |||
17 | contains a functioning "reset control register" (i.e. the board | 17 | contains a functioning "reset control register" (i.e. the board |
18 | is wired to reset upon setting the HRESET_REQ bit in this register). | 18 | is wired to reset upon setting the HRESET_REQ bit in this register). |
19 | 19 | ||
20 | Example: | 20 | - fsl,liodn-bits : Indicates the number of defined bits in the LIODN |
21 | registers, for those SOCs that have a PAMU device. | ||
22 | |||
23 | Examples: | ||
21 | global-utilities@e0000 { /* global utilities block */ | 24 | global-utilities@e0000 { /* global utilities block */ |
22 | compatible = "fsl,mpc8548-guts"; | 25 | compatible = "fsl,mpc8548-guts"; |
23 | reg = <e0000 1000>; | 26 | reg = <e0000 1000>; |
24 | fsl,has-rstcr; | 27 | fsl,has-rstcr; |
25 | }; | 28 | }; |
29 | |||
30 | guts: global-utilities@e0000 { | ||
31 | compatible = "fsl,qoriq-device-config-1.0"; | ||
32 | reg = <0xe0000 0xe00>; | ||
33 | fsl,has-rstcr; | ||
34 | #sleep-cells = <1>; | ||
35 | fsl,liodn-bits = <12>; | ||
36 | }; | ||
diff --git a/Documentation/devicetree/bindings/powerpc/fsl/pamu.txt b/Documentation/devicetree/bindings/powerpc/fsl/pamu.txt new file mode 100644 index 000000000000..1f5e329f756c --- /dev/null +++ b/Documentation/devicetree/bindings/powerpc/fsl/pamu.txt | |||
@@ -0,0 +1,140 @@ | |||
1 | Freescale Peripheral Management Access Unit (PAMU) Device Tree Binding | ||
2 | |||
3 | DESCRIPTION | ||
4 | |||
5 | The PAMU is an I/O MMU that provides device-to-memory access control and | ||
6 | address translation capabilities. | ||
7 | |||
8 | Required properties: | ||
9 | |||
10 | - compatible : <string> | ||
11 | First entry is a version-specific string, such as | ||
12 | "fsl,pamu-v1.0". The second is "fsl,pamu". | ||
13 | - ranges : <prop-encoded-array> | ||
14 | A standard property. Utilized to describe the memory mapped | ||
15 | I/O space utilized by the controller. The size should | ||
16 | be set to the total size of the register space of all | ||
17 | physically present PAMU controllers. For example, for | ||
18 | PAMU v1.0, on an SOC that has five PAMU devices, the size | ||
19 | is 0x5000. | ||
20 | - interrupts : <prop-encoded-array> | ||
21 | Interrupt mappings. The first tuple is the normal PAMU | ||
22 | interrupt, used for reporting access violations. The second | ||
23 | is for PAMU hardware errors, such as PAMU operation errors | ||
24 | and ECC errors. | ||
25 | - #address-cells: <u32> | ||
26 | A standard property. | ||
27 | - #size-cells : <u32> | ||
28 | A standard property. | ||
29 | |||
30 | Optional properties: | ||
31 | - reg : <prop-encoded-array> | ||
32 | A standard property. It represents the CCSR registers of | ||
33 | all child PAMUs combined. Include it to provide support | ||
34 | for legacy drivers. | ||
35 | - interrupt-parent : <phandle> | ||
36 | Phandle to interrupt controller | ||
37 | |||
38 | Child nodes: | ||
39 | |||
40 | Each child node represents one PAMU controller. Each SOC device that is | ||
41 | connected to a specific PAMU device should have a "fsl,pamu-phandle" property | ||
42 | that links to the corresponding specific child PAMU controller. | ||
43 | |||
44 | - reg : <prop-encoded-array> | ||
45 | A standard property. Specifies the physical address and | ||
46 | length (relative to the parent 'ranges' property) of this | ||
47 | PAMU controller's configuration registers. The size should | ||
48 | be set to the size of this PAMU controllers's register space. | ||
49 | For PAMU v1.0, this size is 0x1000. | ||
50 | - fsl,primary-cache-geometry | ||
51 | : <prop-encoded-array> | ||
52 | Two cells that specify the geometry of the primary PAMU | ||
53 | cache. The first is the number of cache lines, and the | ||
54 | second is the number of "ways". For direct-mapped caches, | ||
55 | specify a value of 1. | ||
56 | - fsl,secondary-cache-geometry | ||
57 | : <prop-encoded-array> | ||
58 | Two cells that specify the geometry of the secondary PAMU | ||
59 | cache. The first is the number of cache lines, and the | ||
60 | second is the number of "ways". For direct-mapped caches, | ||
61 | specify a value of 1. | ||
62 | |||
63 | Device nodes: | ||
64 | |||
65 | Devices that have LIODNs need to specify links to the parent PAMU controller | ||
66 | (the actual PAMU controller that this device is connected to) and a pointer to | ||
67 | the LIODN register, if applicable. | ||
68 | |||
69 | - fsl,iommu-parent | ||
70 | : <phandle> | ||
71 | Phandle to the single, specific PAMU controller node to which | ||
72 | this device is connect. The PAMU topology is represented in | ||
73 | the device tree to assist code that dynamically determines the | ||
74 | best LIODN values to minimize PAMU cache thrashing. | ||
75 | |||
76 | - fsl,liodn-reg : <prop-encoded-array> | ||
77 | Two cells that specify the location of the LIODN register | ||
78 | for this device. Required for devices that have a single | ||
79 | LIODN. The first cell is a phandle to a node that contains | ||
80 | the registers where the LIODN is to be set. The second is | ||
81 | the offset from the first "reg" resource of the node where | ||
82 | the specific LIODN register is located. | ||
83 | |||
84 | |||
85 | Example: | ||
86 | |||
87 | iommu@20000 { | ||
88 | compatible = "fsl,pamu-v1.0", "fsl,pamu"; | ||
89 | reg = <0x20000 0x5000>; | ||
90 | ranges = <0 0x20000 0x5000>; | ||
91 | #address-cells = <1>; | ||
92 | #size-cells = <1>; | ||
93 | interrupts = < | ||
94 | 24 2 0 0 | ||
95 | 16 2 1 30>; | ||
96 | |||
97 | pamu0: pamu@0 { | ||
98 | reg = <0 0x1000>; | ||
99 | fsl,primary-cache-geometry = <32 1>; | ||
100 | fsl,secondary-cache-geometry = <128 2>; | ||
101 | }; | ||
102 | |||
103 | pamu1: pamu@1000 { | ||
104 | reg = <0x1000 0x1000>; | ||
105 | fsl,primary-cache-geometry = <32 1>; | ||
106 | fsl,secondary-cache-geometry = <128 2>; | ||
107 | }; | ||
108 | |||
109 | pamu2: pamu@2000 { | ||
110 | reg = <0x2000 0x1000>; | ||
111 | fsl,primary-cache-geometry = <32 1>; | ||
112 | fsl,secondary-cache-geometry = <128 2>; | ||
113 | }; | ||
114 | |||
115 | pamu3: pamu@3000 { | ||
116 | reg = <0x3000 0x1000>; | ||
117 | fsl,primary-cache-geometry = <32 1>; | ||
118 | fsl,secondary-cache-geometry = <128 2>; | ||
119 | }; | ||
120 | |||
121 | pamu4: pamu@4000 { | ||
122 | reg = <0x4000 0x1000>; | ||
123 | fsl,primary-cache-geometry = <32 1>; | ||
124 | fsl,secondary-cache-geometry = <128 2>; | ||
125 | }; | ||
126 | }; | ||
127 | |||
128 | guts: global-utilities@e0000 { | ||
129 | compatible = "fsl,qoriq-device-config-1.0"; | ||
130 | reg = <0xe0000 0xe00>; | ||
131 | fsl,has-rstcr; | ||
132 | #sleep-cells = <1>; | ||
133 | fsl,liodn-bits = <12>; | ||
134 | }; | ||
135 | |||
136 | /include/ "qoriq-dma-0.dtsi" | ||
137 | dma@100300 { | ||
138 | fsl,iommu-parent = <&pamu0>; | ||
139 | fsl,liodn-reg = <&guts 0x584>; /* DMA2LIODNR */ | ||
140 | }; | ||
diff --git a/Documentation/powerpc/cpu_features.txt b/Documentation/powerpc/cpu_features.txt index ffa4183fdb8b..ae09df8722c8 100644 --- a/Documentation/powerpc/cpu_features.txt +++ b/Documentation/powerpc/cpu_features.txt | |||
@@ -11,10 +11,10 @@ split instruction and data caches, and if the CPU supports the DOZE and NAP | |||
11 | sleep modes. | 11 | sleep modes. |
12 | 12 | ||
13 | Detection of the feature set is simple. A list of processors can be found in | 13 | Detection of the feature set is simple. A list of processors can be found in |
14 | arch/ppc/kernel/cputable.c. The PVR register is masked and compared with each | 14 | arch/powerpc/kernel/cputable.c. The PVR register is masked and compared with |
15 | value in the list. If a match is found, the cpu_features of cur_cpu_spec is | 15 | each value in the list. If a match is found, the cpu_features of cur_cpu_spec |
16 | assigned to the feature bitmask for this processor and a __setup_cpu function | 16 | is assigned to the feature bitmask for this processor and a __setup_cpu |
17 | is called. | 17 | function is called. |
18 | 18 | ||
19 | C code may test 'cur_cpu_spec[smp_processor_id()]->cpu_features' for a | 19 | C code may test 'cur_cpu_spec[smp_processor_id()]->cpu_features' for a |
20 | particular feature bit. This is done in quite a few places, for example | 20 | particular feature bit. This is done in quite a few places, for example |
@@ -51,6 +51,6 @@ should be used in the majority of cases. | |||
51 | 51 | ||
52 | The END_FTR_SECTION macros are implemented by storing information about this | 52 | The END_FTR_SECTION macros are implemented by storing information about this |
53 | code in the '__ftr_fixup' ELF section. When do_cpu_ftr_fixups | 53 | code in the '__ftr_fixup' ELF section. When do_cpu_ftr_fixups |
54 | (arch/ppc/kernel/misc.S) is invoked, it will iterate over the records in | 54 | (arch/powerpc/kernel/misc.S) is invoked, it will iterate over the records in |
55 | __ftr_fixup, and if the required feature is not present it will loop writing | 55 | __ftr_fixup, and if the required feature is not present it will loop writing |
56 | nop's from each BEGIN_FTR_SECTION to END_FTR_SECTION. | 56 | nop's from each BEGIN_FTR_SECTION to END_FTR_SECTION. |
diff --git a/Documentation/powerpc/transactional_memory.txt b/Documentation/powerpc/transactional_memory.txt new file mode 100644 index 000000000000..c907be41d60f --- /dev/null +++ b/Documentation/powerpc/transactional_memory.txt | |||
@@ -0,0 +1,175 @@ | |||
1 | Transactional Memory support | ||
2 | ============================ | ||
3 | |||
4 | POWER kernel support for this feature is currently limited to supporting | ||
5 | its use by user programs. It is not currently used by the kernel itself. | ||
6 | |||
7 | This file aims to sum up how it is supported by Linux and what behaviour you | ||
8 | can expect from your user programs. | ||
9 | |||
10 | |||
11 | Basic overview | ||
12 | ============== | ||
13 | |||
14 | Hardware Transactional Memory is supported on POWER8 processors, and is a | ||
15 | feature that enables a different form of atomic memory access. Several new | ||
16 | instructions are presented to delimit transactions; transactions are | ||
17 | guaranteed to either complete atomically or roll back and undo any partial | ||
18 | changes. | ||
19 | |||
20 | A simple transaction looks like this: | ||
21 | |||
22 | begin_move_money: | ||
23 | tbegin | ||
24 | beq abort_handler | ||
25 | |||
26 | ld r4, SAVINGS_ACCT(r3) | ||
27 | ld r5, CURRENT_ACCT(r3) | ||
28 | subi r5, r5, 1 | ||
29 | addi r4, r4, 1 | ||
30 | std r4, SAVINGS_ACCT(r3) | ||
31 | std r5, CURRENT_ACCT(r3) | ||
32 | |||
33 | tend | ||
34 | |||
35 | b continue | ||
36 | |||
37 | abort_handler: | ||
38 | ... test for odd failures ... | ||
39 | |||
40 | /* Retry the transaction if it failed because it conflicted with | ||
41 | * someone else: */ | ||
42 | b begin_move_money | ||
43 | |||
44 | |||
45 | The 'tbegin' instruction denotes the start point, and 'tend' the end point. | ||
46 | Between these points the processor is in 'Transactional' state; any memory | ||
47 | references will complete in one go if there are no conflicts with other | ||
48 | transactional or non-transactional accesses within the system. In this | ||
49 | example, the transaction completes as though it were normal straight-line code | ||
50 | IF no other processor has touched SAVINGS_ACCT(r3) or CURRENT_ACCT(r3); an | ||
51 | atomic move of money from the current account to the savings account has been | ||
52 | performed. Even though the normal ld/std instructions are used (note no | ||
53 | lwarx/stwcx), either *both* SAVINGS_ACCT(r3) and CURRENT_ACCT(r3) will be | ||
54 | updated, or neither will be updated. | ||
55 | |||
56 | If, in the meantime, there is a conflict with the locations accessed by the | ||
57 | transaction, the transaction will be aborted by the CPU. Register and memory | ||
58 | state will roll back to that at the 'tbegin', and control will continue from | ||
59 | 'tbegin+4'. The branch to abort_handler will be taken this second time; the | ||
60 | abort handler can check the cause of the failure, and retry. | ||
61 | |||
62 | Checkpointed registers include all GPRs, FPRs, VRs/VSRs, LR, CCR/CR, CTR, FPCSR | ||
63 | and a few other status/flag regs; see the ISA for details. | ||
64 | |||
65 | Causes of transaction aborts | ||
66 | ============================ | ||
67 | |||
68 | - Conflicts with cache lines used by other processors | ||
69 | - Signals | ||
70 | - Context switches | ||
71 | - See the ISA for full documentation of everything that will abort transactions. | ||
72 | |||
73 | |||
74 | Syscalls | ||
75 | ======== | ||
76 | |||
77 | Performing syscalls from within transaction is not recommended, and can lead | ||
78 | to unpredictable results. | ||
79 | |||
80 | Syscalls do not by design abort transactions, but beware: The kernel code will | ||
81 | not be running in transactional state. The effect of syscalls will always | ||
82 | remain visible, but depending on the call they may abort your transaction as a | ||
83 | side-effect, read soon-to-be-aborted transactional data that should not remain | ||
84 | invisible, etc. If you constantly retry a transaction that constantly aborts | ||
85 | itself by calling a syscall, you'll have a livelock & make no progress. | ||
86 | |||
87 | Simple syscalls (e.g. sigprocmask()) "could" be OK. Even things like write() | ||
88 | from, say, printf() should be OK as long as the kernel does not access any | ||
89 | memory that was accessed transactionally. | ||
90 | |||
91 | Consider any syscalls that happen to work as debug-only -- not recommended for | ||
92 | production use. Best to queue them up till after the transaction is over. | ||
93 | |||
94 | |||
95 | Signals | ||
96 | ======= | ||
97 | |||
98 | Delivery of signals (both sync and async) during transactions provides a second | ||
99 | thread state (ucontext/mcontext) to represent the second transactional register | ||
100 | state. Signal delivery 'treclaim's to capture both register states, so signals | ||
101 | abort transactions. The usual ucontext_t passed to the signal handler | ||
102 | represents the checkpointed/original register state; the signal appears to have | ||
103 | arisen at 'tbegin+4'. | ||
104 | |||
105 | If the sighandler ucontext has uc_link set, a second ucontext has been | ||
106 | delivered. For future compatibility the MSR.TS field should be checked to | ||
107 | determine the transactional state -- if so, the second ucontext in uc->uc_link | ||
108 | represents the active transactional registers at the point of the signal. | ||
109 | |||
110 | For 64-bit processes, uc->uc_mcontext.regs->msr is a full 64-bit MSR and its TS | ||
111 | field shows the transactional mode. | ||
112 | |||
113 | For 32-bit processes, the mcontext's MSR register is only 32 bits; the top 32 | ||
114 | bits are stored in the MSR of the second ucontext, i.e. in | ||
115 | uc->uc_link->uc_mcontext.regs->msr. The top word contains the transactional | ||
116 | state TS. | ||
117 | |||
118 | However, basic signal handlers don't need to be aware of transactions | ||
119 | and simply returning from the handler will deal with things correctly: | ||
120 | |||
121 | Transaction-aware signal handlers can read the transactional register state | ||
122 | from the second ucontext. This will be necessary for crash handlers to | ||
123 | determine, for example, the address of the instruction causing the SIGSEGV. | ||
124 | |||
125 | Example signal handler: | ||
126 | |||
127 | void crash_handler(int sig, siginfo_t *si, void *uc) | ||
128 | { | ||
129 | ucontext_t *ucp = uc; | ||
130 | ucontext_t *transactional_ucp = ucp->uc_link; | ||
131 | |||
132 | if (ucp_link) { | ||
133 | u64 msr = ucp->uc_mcontext.regs->msr; | ||
134 | /* May have transactional ucontext! */ | ||
135 | #ifndef __powerpc64__ | ||
136 | msr |= ((u64)transactional_ucp->uc_mcontext.regs->msr) << 32; | ||
137 | #endif | ||
138 | if (MSR_TM_ACTIVE(msr)) { | ||
139 | /* Yes, we crashed during a transaction. Oops. */ | ||
140 | fprintf(stderr, "Transaction to be restarted at 0x%llx, but " | ||
141 | "crashy instruction was at 0x%llx\n", | ||
142 | ucp->uc_mcontext.regs->nip, | ||
143 | transactional_ucp->uc_mcontext.regs->nip); | ||
144 | } | ||
145 | } | ||
146 | |||
147 | fix_the_problem(ucp->dar); | ||
148 | } | ||
149 | |||
150 | |||
151 | Failure cause codes used by kernel | ||
152 | ================================== | ||
153 | |||
154 | These are defined in <asm/reg.h>, and distinguish different reasons why the | ||
155 | kernel aborted a transaction: | ||
156 | |||
157 | TM_CAUSE_RESCHED Thread was rescheduled. | ||
158 | TM_CAUSE_FAC_UNAV FP/VEC/VSX unavailable trap. | ||
159 | TM_CAUSE_SYSCALL Currently unused; future syscalls that must abort | ||
160 | transactions for consistency will use this. | ||
161 | TM_CAUSE_SIGNAL Signal delivered. | ||
162 | TM_CAUSE_MISC Currently unused. | ||
163 | |||
164 | These can be checked by the user program's abort handler as TEXASR[0:7]. | ||
165 | |||
166 | |||
167 | GDB | ||
168 | === | ||
169 | |||
170 | GDB and ptrace are not currently TM-aware. If one stops during a transaction, | ||
171 | it looks like the transaction has just started (the checkpointed state is | ||
172 | presented). The transaction cannot then be continued and will take the failure | ||
173 | handler route. Furthermore, the transactional 2nd register state will be | ||
174 | inaccessible. GDB can currently be used on programs using TM, but not sensibly | ||
175 | in parts within transactions. | ||
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index e7fb8edb629b..a5255f242be9 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig | |||
@@ -142,6 +142,7 @@ config PPC | |||
142 | select HAVE_MOD_ARCH_SPECIFIC | 142 | select HAVE_MOD_ARCH_SPECIFIC |
143 | select MODULES_USE_ELF_RELA | 143 | select MODULES_USE_ELF_RELA |
144 | select CLONE_BACKWARDS | 144 | select CLONE_BACKWARDS |
145 | select ARCH_USE_BUILTIN_BSWAP | ||
145 | 146 | ||
146 | config EARLY_PRINTK | 147 | config EARLY_PRINTK |
147 | bool | 148 | bool |
@@ -273,6 +274,10 @@ config PPC_ADV_DEBUG_DAC_RANGE | |||
273 | depends on PPC_ADV_DEBUG_REGS && 44x | 274 | depends on PPC_ADV_DEBUG_REGS && 44x |
274 | default y | 275 | default y |
275 | 276 | ||
277 | config PPC_EMULATE_SSTEP | ||
278 | bool | ||
279 | default y if KPROBES || UPROBES || XMON || HAVE_HW_BREAKPOINT | ||
280 | |||
276 | source "init/Kconfig" | 281 | source "init/Kconfig" |
277 | 282 | ||
278 | source "kernel/Kconfig.freezer" | 283 | source "kernel/Kconfig.freezer" |
@@ -306,6 +311,14 @@ config MATH_EMULATION | |||
306 | unit, which will allow programs that use floating-point | 311 | unit, which will allow programs that use floating-point |
307 | instructions to run. | 312 | instructions to run. |
308 | 313 | ||
314 | config PPC_TRANSACTIONAL_MEM | ||
315 | bool "Transactional Memory support for POWERPC" | ||
316 | depends on PPC_BOOK3S_64 | ||
317 | depends on SMP | ||
318 | default n | ||
319 | ---help--- | ||
320 | Support user-mode Transactional Memory on POWERPC. | ||
321 | |||
309 | config 8XX_MINIMAL_FPEMU | 322 | config 8XX_MINIMAL_FPEMU |
310 | bool "Minimal math emulation for 8xx" | 323 | bool "Minimal math emulation for 8xx" |
311 | depends on 8xx && !MATH_EMULATION | 324 | depends on 8xx && !MATH_EMULATION |
diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile index b639852116fa..967fd23ace78 100644 --- a/arch/powerpc/Makefile +++ b/arch/powerpc/Makefile | |||
@@ -67,7 +67,25 @@ LDFLAGS_vmlinux-y := -Bstatic | |||
67 | LDFLAGS_vmlinux-$(CONFIG_RELOCATABLE) := -pie | 67 | LDFLAGS_vmlinux-$(CONFIG_RELOCATABLE) := -pie |
68 | LDFLAGS_vmlinux := $(LDFLAGS_vmlinux-y) | 68 | LDFLAGS_vmlinux := $(LDFLAGS_vmlinux-y) |
69 | 69 | ||
70 | CFLAGS-$(CONFIG_PPC64) := -mminimal-toc -mtraceback=no -mcall-aixdesc | 70 | ifeq ($(CONFIG_PPC64),y) |
71 | ifeq ($(call cc-option-yn,-mcmodel=medium),y) | ||
72 | # -mcmodel=medium breaks modules because it uses 32bit offsets from | ||
73 | # the TOC pointer to create pointers where possible. Pointers into the | ||
74 | # percpu data area are created by this method. | ||
75 | # | ||
76 | # The kernel module loader relocates the percpu data section from the | ||
77 | # original location (starting with 0xd...) to somewhere in the base | ||
78 | # kernel percpu data space (starting with 0xc...). We need a full | ||
79 | # 64bit relocation for this to work, hence -mcmodel=large. | ||
80 | KBUILD_CFLAGS_MODULE += -mcmodel=large | ||
81 | else | ||
82 | export NO_MINIMAL_TOC := -mno-minimal-toc | ||
83 | endif | ||
84 | endif | ||
85 | |||
86 | CFLAGS-$(CONFIG_PPC64) := -mtraceback=no -mcall-aixdesc | ||
87 | CFLAGS-$(CONFIG_PPC64) += $(call cc-option,-mcmodel=medium,-mminimal-toc) | ||
88 | CFLAGS-$(CONFIG_PPC64) += $(call cc-option,-mno-pointers-to-nested-functions) | ||
71 | CFLAGS-$(CONFIG_PPC32) := -ffixed-r2 -mmultiple | 89 | CFLAGS-$(CONFIG_PPC32) := -ffixed-r2 -mmultiple |
72 | 90 | ||
73 | CFLAGS-$(CONFIG_GENERIC_CPU) += $(call cc-option,-mtune=power7,-mtune=power4) | 91 | CFLAGS-$(CONFIG_GENERIC_CPU) += $(call cc-option,-mtune=power7,-mtune=power4) |
@@ -136,6 +154,7 @@ head-$(CONFIG_FSL_BOOKE) := arch/powerpc/kernel/head_fsl_booke.o | |||
136 | head-$(CONFIG_PPC64) += arch/powerpc/kernel/entry_64.o | 154 | head-$(CONFIG_PPC64) += arch/powerpc/kernel/entry_64.o |
137 | head-$(CONFIG_PPC_FPU) += arch/powerpc/kernel/fpu.o | 155 | head-$(CONFIG_PPC_FPU) += arch/powerpc/kernel/fpu.o |
138 | head-$(CONFIG_ALTIVEC) += arch/powerpc/kernel/vector.o | 156 | head-$(CONFIG_ALTIVEC) += arch/powerpc/kernel/vector.o |
157 | head-$(CONFIG_PPC_OF_BOOT_TRAMPOLINE) += arch/powerpc/kernel/prom_init.o | ||
139 | 158 | ||
140 | core-y += arch/powerpc/kernel/ \ | 159 | core-y += arch/powerpc/kernel/ \ |
141 | arch/powerpc/mm/ \ | 160 | arch/powerpc/mm/ \ |
@@ -143,6 +162,7 @@ core-y += arch/powerpc/kernel/ \ | |||
143 | arch/powerpc/sysdev/ \ | 162 | arch/powerpc/sysdev/ \ |
144 | arch/powerpc/platforms/ \ | 163 | arch/powerpc/platforms/ \ |
145 | arch/powerpc/math-emu/ \ | 164 | arch/powerpc/math-emu/ \ |
165 | arch/powerpc/crypto/ \ | ||
146 | arch/powerpc/net/ | 166 | arch/powerpc/net/ |
147 | core-$(CONFIG_XMON) += arch/powerpc/xmon/ | 167 | core-$(CONFIG_XMON) += arch/powerpc/xmon/ |
148 | core-$(CONFIG_KVM) += arch/powerpc/kvm/ | 168 | core-$(CONFIG_KVM) += arch/powerpc/kvm/ |
diff --git a/arch/powerpc/boot/dts/a3m071.dts b/arch/powerpc/boot/dts/a3m071.dts index 877a28cb77e4..bf81b8f9704c 100644 --- a/arch/powerpc/boot/dts/a3m071.dts +++ b/arch/powerpc/boot/dts/a3m071.dts | |||
@@ -17,6 +17,8 @@ | |||
17 | 17 | ||
18 | /include/ "mpc5200b.dtsi" | 18 | /include/ "mpc5200b.dtsi" |
19 | 19 | ||
20 | &gpt0 { fsl,has-wdt; }; | ||
21 | |||
20 | / { | 22 | / { |
21 | model = "anonymous,a3m071"; | 23 | model = "anonymous,a3m071"; |
22 | compatible = "anonymous,a3m071"; | 24 | compatible = "anonymous,a3m071"; |
@@ -30,10 +32,6 @@ | |||
30 | bus-frequency = <0>; /* From boot loader */ | 32 | bus-frequency = <0>; /* From boot loader */ |
31 | system-frequency = <0>; /* From boot loader */ | 33 | system-frequency = <0>; /* From boot loader */ |
32 | 34 | ||
33 | timer@600 { | ||
34 | fsl,has-wdt; | ||
35 | }; | ||
36 | |||
37 | spi@f00 { | 35 | spi@f00 { |
38 | status = "disabled"; | 36 | status = "disabled"; |
39 | }; | 37 | }; |
diff --git a/arch/powerpc/boot/dts/a4m072.dts b/arch/powerpc/boot/dts/a4m072.dts index fabe7b7d5f13..1f02034c7e99 100644 --- a/arch/powerpc/boot/dts/a4m072.dts +++ b/arch/powerpc/boot/dts/a4m072.dts | |||
@@ -15,6 +15,11 @@ | |||
15 | 15 | ||
16 | /include/ "mpc5200b.dtsi" | 16 | /include/ "mpc5200b.dtsi" |
17 | 17 | ||
18 | &gpt0 { fsl,has-wdt; }; | ||
19 | &gpt3 { gpio-controller; }; | ||
20 | &gpt4 { gpio-controller; }; | ||
21 | &gpt5 { gpio-controller; }; | ||
22 | |||
18 | / { | 23 | / { |
19 | model = "anonymous,a4m072"; | 24 | model = "anonymous,a4m072"; |
20 | compatible = "anonymous,a4m072"; | 25 | compatible = "anonymous,a4m072"; |
@@ -34,28 +39,6 @@ | |||
34 | fsl,init-fd-counters = <0x3333>; | 39 | fsl,init-fd-counters = <0x3333>; |
35 | }; | 40 | }; |
36 | 41 | ||
37 | timer@600 { | ||
38 | fsl,has-wdt; | ||
39 | }; | ||
40 | |||
41 | gpt3: timer@630 { /* General Purpose Timer in GPIO mode */ | ||
42 | compatible = "fsl,mpc5200b-gpt-gpio","fsl,mpc5200-gpt-gpio"; | ||
43 | gpio-controller; | ||
44 | #gpio-cells = <2>; | ||
45 | }; | ||
46 | |||
47 | gpt4: timer@640 { /* General Purpose Timer in GPIO mode */ | ||
48 | compatible = "fsl,mpc5200b-gpt-gpio","fsl,mpc5200-gpt-gpio"; | ||
49 | gpio-controller; | ||
50 | #gpio-cells = <2>; | ||
51 | }; | ||
52 | |||
53 | gpt5: timer@650 { /* General Purpose Timer in GPIO mode */ | ||
54 | compatible = "fsl,mpc5200b-gpt-gpio","fsl,mpc5200-gpt-gpio"; | ||
55 | gpio-controller; | ||
56 | #gpio-cells = <2>; | ||
57 | }; | ||
58 | |||
59 | spi@f00 { | 42 | spi@f00 { |
60 | status = "disabled"; | 43 | status = "disabled"; |
61 | }; | 44 | }; |
diff --git a/arch/powerpc/boot/dts/bluestone.dts b/arch/powerpc/boot/dts/bluestone.dts index 9d4917aebe6b..7daaca324c01 100644 --- a/arch/powerpc/boot/dts/bluestone.dts +++ b/arch/powerpc/boot/dts/bluestone.dts | |||
@@ -107,6 +107,14 @@ | |||
107 | interrupt-parent = <&UIC0>; | 107 | interrupt-parent = <&UIC0>; |
108 | }; | 108 | }; |
109 | 109 | ||
110 | OCM: ocm@400040000 { | ||
111 | compatible = "ibm,ocm"; | ||
112 | status = "ok"; | ||
113 | cell-index = <1>; | ||
114 | /* configured in U-Boot */ | ||
115 | reg = <4 0x00040000 0x8000>; /* 32K */ | ||
116 | }; | ||
117 | |||
110 | SDR0: sdr { | 118 | SDR0: sdr { |
111 | compatible = "ibm,sdr-apm821xx"; | 119 | compatible = "ibm,sdr-apm821xx"; |
112 | dcr-reg = <0x00e 0x002>; | 120 | dcr-reg = <0x00e 0x002>; |
diff --git a/arch/powerpc/boot/dts/bsc9131rdb.dtsi b/arch/powerpc/boot/dts/bsc9131rdb.dtsi index 638adda2c218..9e6c01339ccc 100644 --- a/arch/powerpc/boot/dts/bsc9131rdb.dtsi +++ b/arch/powerpc/boot/dts/bsc9131rdb.dtsi | |||
@@ -126,7 +126,7 @@ | |||
126 | }; | 126 | }; |
127 | }; | 127 | }; |
128 | 128 | ||
129 | sdhci@2e000 { | 129 | sdhc@2e000 { |
130 | status = "disabled"; | 130 | status = "disabled"; |
131 | }; | 131 | }; |
132 | 132 | ||
diff --git a/arch/powerpc/boot/dts/cm5200.dts b/arch/powerpc/boot/dts/cm5200.dts index ad3a4f4a2b04..fb580dd84ddf 100644 --- a/arch/powerpc/boot/dts/cm5200.dts +++ b/arch/powerpc/boot/dts/cm5200.dts | |||
@@ -12,15 +12,13 @@ | |||
12 | 12 | ||
13 | /include/ "mpc5200b.dtsi" | 13 | /include/ "mpc5200b.dtsi" |
14 | 14 | ||
15 | &gpt0 { fsl,has-wdt; }; | ||
16 | |||
15 | / { | 17 | / { |
16 | model = "schindler,cm5200"; | 18 | model = "schindler,cm5200"; |
17 | compatible = "schindler,cm5200"; | 19 | compatible = "schindler,cm5200"; |
18 | 20 | ||
19 | soc5200@f0000000 { | 21 | soc5200@f0000000 { |
20 | timer@600 { // General Purpose Timer | ||
21 | fsl,has-wdt; | ||
22 | }; | ||
23 | |||
24 | can@900 { | 22 | can@900 { |
25 | status = "disabled"; | 23 | status = "disabled"; |
26 | }; | 24 | }; |
diff --git a/arch/powerpc/boot/dts/digsy_mtc.dts b/arch/powerpc/boot/dts/digsy_mtc.dts index a7511f2d844d..955bff629df3 100644 --- a/arch/powerpc/boot/dts/digsy_mtc.dts +++ b/arch/powerpc/boot/dts/digsy_mtc.dts | |||
@@ -13,6 +13,9 @@ | |||
13 | 13 | ||
14 | /include/ "mpc5200b.dtsi" | 14 | /include/ "mpc5200b.dtsi" |
15 | 15 | ||
16 | &gpt0 { gpio-controller; fsl,has-wdt; }; | ||
17 | &gpt1 { gpio-controller; }; | ||
18 | |||
16 | / { | 19 | / { |
17 | model = "intercontrol,digsy-mtc"; | 20 | model = "intercontrol,digsy-mtc"; |
18 | compatible = "intercontrol,digsy-mtc"; | 21 | compatible = "intercontrol,digsy-mtc"; |
@@ -22,17 +25,6 @@ | |||
22 | }; | 25 | }; |
23 | 26 | ||
24 | soc5200@f0000000 { | 27 | soc5200@f0000000 { |
25 | timer@600 { // General Purpose Timer | ||
26 | #gpio-cells = <2>; | ||
27 | fsl,has-wdt; | ||
28 | gpio-controller; | ||
29 | }; | ||
30 | |||
31 | timer@610 { | ||
32 | #gpio-cells = <2>; | ||
33 | gpio-controller; | ||
34 | }; | ||
35 | |||
36 | rtc@800 { | 28 | rtc@800 { |
37 | status = "disabled"; | 29 | status = "disabled"; |
38 | }; | 30 | }; |
diff --git a/arch/powerpc/boot/dts/fsl/p1010si-post.dtsi b/arch/powerpc/boot/dts/fsl/p1010si-post.dtsi index 0bde9ee8afaf..af12ead88c5f 100644 --- a/arch/powerpc/boot/dts/fsl/p1010si-post.dtsi +++ b/arch/powerpc/boot/dts/fsl/p1010si-post.dtsi | |||
@@ -41,7 +41,7 @@ | |||
41 | 41 | ||
42 | /* controller at 0x9000 */ | 42 | /* controller at 0x9000 */ |
43 | &pci0 { | 43 | &pci0 { |
44 | compatible = "fsl,p1010-pcie", "fsl,qoriq-pcie-v2.3", "fsl,qoriq-pcie-v2.2"; | 44 | compatible = "fsl,p1010-pcie", "fsl,qoriq-pcie-v2.3"; |
45 | device_type = "pci"; | 45 | device_type = "pci"; |
46 | #size-cells = <2>; | 46 | #size-cells = <2>; |
47 | #address-cells = <3>; | 47 | #address-cells = <3>; |
@@ -69,7 +69,7 @@ | |||
69 | 69 | ||
70 | /* controller at 0xa000 */ | 70 | /* controller at 0xa000 */ |
71 | &pci1 { | 71 | &pci1 { |
72 | compatible = "fsl,p1010-pcie", "fsl,qoriq-pcie-v2.3", "fsl,qoriq-pcie-v2.2"; | 72 | compatible = "fsl,p1010-pcie", "fsl,qoriq-pcie-v2.3"; |
73 | device_type = "pci"; | 73 | device_type = "pci"; |
74 | #size-cells = <2>; | 74 | #size-cells = <2>; |
75 | #address-cells = <3>; | 75 | #address-cells = <3>; |
diff --git a/arch/powerpc/boot/dts/fsl/p1022si-post.dtsi b/arch/powerpc/boot/dts/fsl/p1022si-post.dtsi index 06216b8c0af5..e179803a81ef 100644 --- a/arch/powerpc/boot/dts/fsl/p1022si-post.dtsi +++ b/arch/powerpc/boot/dts/fsl/p1022si-post.dtsi | |||
@@ -45,7 +45,7 @@ | |||
45 | 45 | ||
46 | /* controller at 0x9000 */ | 46 | /* controller at 0x9000 */ |
47 | &pci0 { | 47 | &pci0 { |
48 | compatible = "fsl,p1022-pcie"; | 48 | compatible = "fsl,mpc8548-pcie"; |
49 | device_type = "pci"; | 49 | device_type = "pci"; |
50 | #size-cells = <2>; | 50 | #size-cells = <2>; |
51 | #address-cells = <3>; | 51 | #address-cells = <3>; |
@@ -73,7 +73,7 @@ | |||
73 | 73 | ||
74 | /* controller at 0xa000 */ | 74 | /* controller at 0xa000 */ |
75 | &pci1 { | 75 | &pci1 { |
76 | compatible = "fsl,p1022-pcie"; | 76 | compatible = "fsl,mpc8548-pcie"; |
77 | device_type = "pci"; | 77 | device_type = "pci"; |
78 | #size-cells = <2>; | 78 | #size-cells = <2>; |
79 | #address-cells = <3>; | 79 | #address-cells = <3>; |
@@ -102,7 +102,7 @@ | |||
102 | 102 | ||
103 | /* controller at 0xb000 */ | 103 | /* controller at 0xb000 */ |
104 | &pci2 { | 104 | &pci2 { |
105 | compatible = "fsl,p1022-pcie"; | 105 | compatible = "fsl,mpc8548-pcie"; |
106 | device_type = "pci"; | 106 | device_type = "pci"; |
107 | #size-cells = <2>; | 107 | #size-cells = <2>; |
108 | #address-cells = <3>; | 108 | #address-cells = <3>; |
diff --git a/arch/powerpc/boot/dts/fsl/p2041si-post.dtsi b/arch/powerpc/boot/dts/fsl/p2041si-post.dtsi index 531eab82c6c9..69ac1acd4349 100644 --- a/arch/powerpc/boot/dts/fsl/p2041si-post.dtsi +++ b/arch/powerpc/boot/dts/fsl/p2041si-post.dtsi | |||
@@ -48,6 +48,8 @@ | |||
48 | bus-range = <0x0 0xff>; | 48 | bus-range = <0x0 0xff>; |
49 | clock-frequency = <33333333>; | 49 | clock-frequency = <33333333>; |
50 | interrupts = <16 2 1 15>; | 50 | interrupts = <16 2 1 15>; |
51 | fsl,iommu-parent = <&pamu0>; | ||
52 | fsl,liodn-reg = <&guts 0x500>; /* PEX1LIODNR */ | ||
51 | pcie@0 { | 53 | pcie@0 { |
52 | reg = <0 0 0 0 0>; | 54 | reg = <0 0 0 0 0>; |
53 | #interrupt-cells = <1>; | 55 | #interrupt-cells = <1>; |
@@ -75,6 +77,8 @@ | |||
75 | bus-range = <0 0xff>; | 77 | bus-range = <0 0xff>; |
76 | clock-frequency = <33333333>; | 78 | clock-frequency = <33333333>; |
77 | interrupts = <16 2 1 14>; | 79 | interrupts = <16 2 1 14>; |
80 | fsl,iommu-parent = <&pamu0>; | ||
81 | fsl,liodn-reg = <&guts 0x504>; /* PEX2LIODNR */ | ||
78 | pcie@0 { | 82 | pcie@0 { |
79 | reg = <0 0 0 0 0>; | 83 | reg = <0 0 0 0 0>; |
80 | #interrupt-cells = <1>; | 84 | #interrupt-cells = <1>; |
@@ -102,6 +106,8 @@ | |||
102 | bus-range = <0x0 0xff>; | 106 | bus-range = <0x0 0xff>; |
103 | clock-frequency = <33333333>; | 107 | clock-frequency = <33333333>; |
104 | interrupts = <16 2 1 13>; | 108 | interrupts = <16 2 1 13>; |
109 | fsl,iommu-parent = <&pamu0>; | ||
110 | fsl,liodn-reg = <&guts 0x508>; /* PEX3LIODNR */ | ||
105 | pcie@0 { | 111 | pcie@0 { |
106 | reg = <0 0 0 0 0>; | 112 | reg = <0 0 0 0 0>; |
107 | #interrupt-cells = <1>; | 113 | #interrupt-cells = <1>; |
@@ -125,18 +131,21 @@ | |||
125 | interrupts = <16 2 1 11>; | 131 | interrupts = <16 2 1 11>; |
126 | #address-cells = <2>; | 132 | #address-cells = <2>; |
127 | #size-cells = <2>; | 133 | #size-cells = <2>; |
134 | fsl,iommu-parent = <&pamu0>; | ||
128 | ranges; | 135 | ranges; |
129 | 136 | ||
130 | port1 { | 137 | port1 { |
131 | #address-cells = <2>; | 138 | #address-cells = <2>; |
132 | #size-cells = <2>; | 139 | #size-cells = <2>; |
133 | cell-index = <1>; | 140 | cell-index = <1>; |
141 | fsl,liodn-reg = <&guts 0x510>; /* RIO1LIODNR */ | ||
134 | }; | 142 | }; |
135 | 143 | ||
136 | port2 { | 144 | port2 { |
137 | #address-cells = <2>; | 145 | #address-cells = <2>; |
138 | #size-cells = <2>; | 146 | #size-cells = <2>; |
139 | cell-index = <2>; | 147 | cell-index = <2>; |
148 | fsl,liodn-reg = <&guts 0x514>; /* RIO2LIODNR */ | ||
140 | }; | 149 | }; |
141 | }; | 150 | }; |
142 | 151 | ||
@@ -246,10 +255,37 @@ | |||
246 | 255 | ||
247 | iommu@20000 { | 256 | iommu@20000 { |
248 | compatible = "fsl,pamu-v1.0", "fsl,pamu"; | 257 | compatible = "fsl,pamu-v1.0", "fsl,pamu"; |
249 | reg = <0x20000 0x4000>; | 258 | reg = <0x20000 0x4000>; /* for compatibility with older PAMU drivers */ |
259 | ranges = <0 0x20000 0x4000>; | ||
260 | #address-cells = <1>; | ||
261 | #size-cells = <1>; | ||
250 | interrupts = < | 262 | interrupts = < |
251 | 24 2 0 0 | 263 | 24 2 0 0 |
252 | 16 2 1 30>; | 264 | 16 2 1 30>; |
265 | |||
266 | pamu0: pamu@0 { | ||
267 | reg = <0 0x1000>; | ||
268 | fsl,primary-cache-geometry = <32 1>; | ||
269 | fsl,secondary-cache-geometry = <128 2>; | ||
270 | }; | ||
271 | |||
272 | pamu1: pamu@1000 { | ||
273 | reg = <0x1000 0x1000>; | ||
274 | fsl,primary-cache-geometry = <32 1>; | ||
275 | fsl,secondary-cache-geometry = <128 2>; | ||
276 | }; | ||
277 | |||
278 | pamu2: pamu@2000 { | ||
279 | reg = <0x2000 0x1000>; | ||
280 | fsl,primary-cache-geometry = <32 1>; | ||
281 | fsl,secondary-cache-geometry = <128 2>; | ||
282 | }; | ||
283 | |||
284 | pamu3: pamu@3000 { | ||
285 | reg = <0x3000 0x1000>; | ||
286 | fsl,primary-cache-geometry = <32 1>; | ||
287 | fsl,secondary-cache-geometry = <128 2>; | ||
288 | }; | ||
253 | }; | 289 | }; |
254 | 290 | ||
255 | /include/ "qoriq-mpic.dtsi" | 291 | /include/ "qoriq-mpic.dtsi" |
@@ -291,7 +327,17 @@ | |||
291 | }; | 327 | }; |
292 | 328 | ||
293 | /include/ "qoriq-dma-0.dtsi" | 329 | /include/ "qoriq-dma-0.dtsi" |
330 | dma@100300 { | ||
331 | fsl,iommu-parent = <&pamu0>; | ||
332 | fsl,liodn-reg = <&guts 0x580>; /* DMA1LIODNR */ | ||
333 | }; | ||
334 | |||
294 | /include/ "qoriq-dma-1.dtsi" | 335 | /include/ "qoriq-dma-1.dtsi" |
336 | dma@101300 { | ||
337 | fsl,iommu-parent = <&pamu0>; | ||
338 | fsl,liodn-reg = <&guts 0x584>; /* DMA2LIODNR */ | ||
339 | }; | ||
340 | |||
295 | /include/ "qoriq-espi-0.dtsi" | 341 | /include/ "qoriq-espi-0.dtsi" |
296 | spi@110000 { | 342 | spi@110000 { |
297 | fsl,espi-num-chipselects = <4>; | 343 | fsl,espi-num-chipselects = <4>; |
@@ -299,6 +345,8 @@ | |||
299 | 345 | ||
300 | /include/ "qoriq-esdhc-0.dtsi" | 346 | /include/ "qoriq-esdhc-0.dtsi" |
301 | sdhc@114000 { | 347 | sdhc@114000 { |
348 | fsl,iommu-parent = <&pamu1>; | ||
349 | fsl,liodn-reg = <&guts 0x530>; /* eSDHCLIODNR */ | ||
302 | sdhci,auto-cmd12; | 350 | sdhci,auto-cmd12; |
303 | }; | 351 | }; |
304 | 352 | ||
@@ -308,20 +356,37 @@ | |||
308 | /include/ "qoriq-duart-1.dtsi" | 356 | /include/ "qoriq-duart-1.dtsi" |
309 | /include/ "qoriq-gpio-0.dtsi" | 357 | /include/ "qoriq-gpio-0.dtsi" |
310 | /include/ "qoriq-usb2-mph-0.dtsi" | 358 | /include/ "qoriq-usb2-mph-0.dtsi" |
311 | usb0: usb@210000 { | 359 | usb0: usb@210000 { |
312 | compatible = "fsl-usb2-mph-v1.6", "fsl,mpc85xx-usb2-mph", "fsl-usb2-mph"; | 360 | compatible = "fsl-usb2-mph-v1.6", "fsl,mpc85xx-usb2-mph", "fsl-usb2-mph"; |
313 | phy_type = "utmi"; | 361 | phy_type = "utmi"; |
314 | port0; | 362 | fsl,iommu-parent = <&pamu1>; |
315 | }; | 363 | fsl,liodn-reg = <&guts 0x520>; /* USB1LIODNR */ |
364 | port0; | ||
365 | }; | ||
316 | 366 | ||
317 | /include/ "qoriq-usb2-dr-0.dtsi" | 367 | /include/ "qoriq-usb2-dr-0.dtsi" |
318 | usb1: usb@211000 { | 368 | usb1: usb@211000 { |
319 | compatible = "fsl-usb2-dr-v1.6", "fsl,mpc85xx-usb2-dr", "fsl-usb2-dr"; | 369 | compatible = "fsl-usb2-dr-v1.6", "fsl,mpc85xx-usb2-dr", "fsl-usb2-dr"; |
320 | dr_mode = "host"; | 370 | fsl,iommu-parent = <&pamu1>; |
321 | phy_type = "utmi"; | 371 | fsl,liodn-reg = <&guts 0x524>; /* USB2LIODNR */ |
322 | }; | 372 | dr_mode = "host"; |
373 | phy_type = "utmi"; | ||
374 | }; | ||
323 | 375 | ||
324 | /include/ "qoriq-sata2-0.dtsi" | 376 | /include/ "qoriq-sata2-0.dtsi" |
377 | sata@220000 { | ||
378 | fsl,iommu-parent = <&pamu1>; | ||
379 | fsl,liodn-reg = <&guts 0x550>; /* SATA1LIODNR */ | ||
380 | }; | ||
381 | |||
325 | /include/ "qoriq-sata2-1.dtsi" | 382 | /include/ "qoriq-sata2-1.dtsi" |
383 | sata@221000 { | ||
384 | fsl,iommu-parent = <&pamu1>; | ||
385 | fsl,liodn-reg = <&guts 0x554>; /* SATA2LIODNR */ | ||
386 | }; | ||
387 | |||
326 | /include/ "qoriq-sec4.2-0.dtsi" | 388 | /include/ "qoriq-sec4.2-0.dtsi" |
389 | crypto: crypto@300000 { | ||
390 | fsl,iommu-parent = <&pamu1>; | ||
391 | }; | ||
327 | }; | 392 | }; |
diff --git a/arch/powerpc/boot/dts/fsl/p3041si-post.dtsi b/arch/powerpc/boot/dts/fsl/p3041si-post.dtsi index af4ebc8009e3..9b5a81a4529c 100644 --- a/arch/powerpc/boot/dts/fsl/p3041si-post.dtsi +++ b/arch/powerpc/boot/dts/fsl/p3041si-post.dtsi | |||
@@ -48,6 +48,8 @@ | |||
48 | bus-range = <0x0 0xff>; | 48 | bus-range = <0x0 0xff>; |
49 | clock-frequency = <33333333>; | 49 | clock-frequency = <33333333>; |
50 | interrupts = <16 2 1 15>; | 50 | interrupts = <16 2 1 15>; |
51 | fsl,iommu-parent = <&pamu0>; | ||
52 | fsl,liodn-reg = <&guts 0x500>; /* PEX1LIODNR */ | ||
51 | pcie@0 { | 53 | pcie@0 { |
52 | reg = <0 0 0 0 0>; | 54 | reg = <0 0 0 0 0>; |
53 | #interrupt-cells = <1>; | 55 | #interrupt-cells = <1>; |
@@ -75,6 +77,8 @@ | |||
75 | bus-range = <0 0xff>; | 77 | bus-range = <0 0xff>; |
76 | clock-frequency = <33333333>; | 78 | clock-frequency = <33333333>; |
77 | interrupts = <16 2 1 14>; | 79 | interrupts = <16 2 1 14>; |
80 | fsl,iommu-parent = <&pamu0>; | ||
81 | fsl,liodn-reg = <&guts 0x504>; /* PEX2LIODNR */ | ||
78 | pcie@0 { | 82 | pcie@0 { |
79 | reg = <0 0 0 0 0>; | 83 | reg = <0 0 0 0 0>; |
80 | #interrupt-cells = <1>; | 84 | #interrupt-cells = <1>; |
@@ -102,6 +106,8 @@ | |||
102 | bus-range = <0x0 0xff>; | 106 | bus-range = <0x0 0xff>; |
103 | clock-frequency = <33333333>; | 107 | clock-frequency = <33333333>; |
104 | interrupts = <16 2 1 13>; | 108 | interrupts = <16 2 1 13>; |
109 | fsl,iommu-parent = <&pamu0>; | ||
110 | fsl,liodn-reg = <&guts 0x508>; /* PEX3LIODNR */ | ||
105 | pcie@0 { | 111 | pcie@0 { |
106 | reg = <0 0 0 0 0>; | 112 | reg = <0 0 0 0 0>; |
107 | #interrupt-cells = <1>; | 113 | #interrupt-cells = <1>; |
@@ -152,18 +158,21 @@ | |||
152 | interrupts = <16 2 1 11>; | 158 | interrupts = <16 2 1 11>; |
153 | #address-cells = <2>; | 159 | #address-cells = <2>; |
154 | #size-cells = <2>; | 160 | #size-cells = <2>; |
161 | fsl,iommu-parent = <&pamu0>; | ||
155 | ranges; | 162 | ranges; |
156 | 163 | ||
157 | port1 { | 164 | port1 { |
158 | #address-cells = <2>; | 165 | #address-cells = <2>; |
159 | #size-cells = <2>; | 166 | #size-cells = <2>; |
160 | cell-index = <1>; | 167 | cell-index = <1>; |
168 | fsl,liodn-reg = <&guts 0x510>; /* RIO1LIODNR */ | ||
161 | }; | 169 | }; |
162 | 170 | ||
163 | port2 { | 171 | port2 { |
164 | #address-cells = <2>; | 172 | #address-cells = <2>; |
165 | #size-cells = <2>; | 173 | #size-cells = <2>; |
166 | cell-index = <2>; | 174 | cell-index = <2>; |
175 | fsl,liodn-reg = <&guts 0x514>; /* RIO2LIODNR */ | ||
167 | }; | 176 | }; |
168 | }; | 177 | }; |
169 | 178 | ||
@@ -273,10 +282,37 @@ | |||
273 | 282 | ||
274 | iommu@20000 { | 283 | iommu@20000 { |
275 | compatible = "fsl,pamu-v1.0", "fsl,pamu"; | 284 | compatible = "fsl,pamu-v1.0", "fsl,pamu"; |
276 | reg = <0x20000 0x4000>; | 285 | reg = <0x20000 0x4000>; /* for compatibility with older PAMU drivers */ |
286 | ranges = <0 0x20000 0x4000>; | ||
287 | #address-cells = <1>; | ||
288 | #size-cells = <1>; | ||
277 | interrupts = < | 289 | interrupts = < |
278 | 24 2 0 0 | 290 | 24 2 0 0 |
279 | 16 2 1 30>; | 291 | 16 2 1 30>; |
292 | |||
293 | pamu0: pamu@0 { | ||
294 | reg = <0 0x1000>; | ||
295 | fsl,primary-cache-geometry = <32 1>; | ||
296 | fsl,secondary-cache-geometry = <128 2>; | ||
297 | }; | ||
298 | |||
299 | pamu1: pamu@1000 { | ||
300 | reg = <0x1000 0x1000>; | ||
301 | fsl,primary-cache-geometry = <32 1>; | ||
302 | fsl,secondary-cache-geometry = <128 2>; | ||
303 | }; | ||
304 | |||
305 | pamu2: pamu@2000 { | ||
306 | reg = <0x2000 0x1000>; | ||
307 | fsl,primary-cache-geometry = <32 1>; | ||
308 | fsl,secondary-cache-geometry = <128 2>; | ||
309 | }; | ||
310 | |||
311 | pamu3: pamu@3000 { | ||
312 | reg = <0x3000 0x1000>; | ||
313 | fsl,primary-cache-geometry = <32 1>; | ||
314 | fsl,secondary-cache-geometry = <128 2>; | ||
315 | }; | ||
280 | }; | 316 | }; |
281 | 317 | ||
282 | /include/ "qoriq-mpic.dtsi" | 318 | /include/ "qoriq-mpic.dtsi" |
@@ -318,7 +354,17 @@ | |||
318 | }; | 354 | }; |
319 | 355 | ||
320 | /include/ "qoriq-dma-0.dtsi" | 356 | /include/ "qoriq-dma-0.dtsi" |
357 | dma@100300 { | ||
358 | fsl,iommu-parent = <&pamu0>; | ||
359 | fsl,liodn-reg = <&guts 0x580>; /* DMA1LIODNR */ | ||
360 | }; | ||
361 | |||
321 | /include/ "qoriq-dma-1.dtsi" | 362 | /include/ "qoriq-dma-1.dtsi" |
363 | dma@101300 { | ||
364 | fsl,iommu-parent = <&pamu0>; | ||
365 | fsl,liodn-reg = <&guts 0x584>; /* DMA2LIODNR */ | ||
366 | }; | ||
367 | |||
322 | /include/ "qoriq-espi-0.dtsi" | 368 | /include/ "qoriq-espi-0.dtsi" |
323 | spi@110000 { | 369 | spi@110000 { |
324 | fsl,espi-num-chipselects = <4>; | 370 | fsl,espi-num-chipselects = <4>; |
@@ -326,6 +372,8 @@ | |||
326 | 372 | ||
327 | /include/ "qoriq-esdhc-0.dtsi" | 373 | /include/ "qoriq-esdhc-0.dtsi" |
328 | sdhc@114000 { | 374 | sdhc@114000 { |
375 | fsl,iommu-parent = <&pamu1>; | ||
376 | fsl,liodn-reg = <&guts 0x530>; /* eSDHCLIODNR */ | ||
329 | sdhci,auto-cmd12; | 377 | sdhci,auto-cmd12; |
330 | }; | 378 | }; |
331 | 379 | ||
@@ -335,20 +383,37 @@ | |||
335 | /include/ "qoriq-duart-1.dtsi" | 383 | /include/ "qoriq-duart-1.dtsi" |
336 | /include/ "qoriq-gpio-0.dtsi" | 384 | /include/ "qoriq-gpio-0.dtsi" |
337 | /include/ "qoriq-usb2-mph-0.dtsi" | 385 | /include/ "qoriq-usb2-mph-0.dtsi" |
338 | usb0: usb@210000 { | 386 | usb0: usb@210000 { |
339 | compatible = "fsl-usb2-mph-v1.6", "fsl-usb2-mph"; | 387 | compatible = "fsl-usb2-mph-v1.6", "fsl-usb2-mph"; |
340 | phy_type = "utmi"; | 388 | phy_type = "utmi"; |
341 | port0; | 389 | fsl,iommu-parent = <&pamu1>; |
342 | }; | 390 | fsl,liodn-reg = <&guts 0x520>; /* USB1LIODNR */ |
391 | port0; | ||
392 | }; | ||
343 | 393 | ||
344 | /include/ "qoriq-usb2-dr-0.dtsi" | 394 | /include/ "qoriq-usb2-dr-0.dtsi" |
345 | usb1: usb@211000 { | 395 | usb1: usb@211000 { |
346 | compatible = "fsl-usb2-dr-v1.6", "fsl,mpc85xx-usb2-dr", "fsl-usb2-dr"; | 396 | compatible = "fsl-usb2-dr-v1.6", "fsl,mpc85xx-usb2-dr", "fsl-usb2-dr"; |
347 | dr_mode = "host"; | 397 | fsl,iommu-parent = <&pamu1>; |
348 | phy_type = "utmi"; | 398 | fsl,liodn-reg = <&guts 0x524>; /* USB2LIODNR */ |
349 | }; | 399 | dr_mode = "host"; |
400 | phy_type = "utmi"; | ||
401 | }; | ||
350 | 402 | ||
351 | /include/ "qoriq-sata2-0.dtsi" | 403 | /include/ "qoriq-sata2-0.dtsi" |
404 | sata@220000 { | ||
405 | fsl,iommu-parent = <&pamu1>; | ||
406 | fsl,liodn-reg = <&guts 0x550>; /* SATA1LIODNR */ | ||
407 | }; | ||
408 | |||
352 | /include/ "qoriq-sata2-1.dtsi" | 409 | /include/ "qoriq-sata2-1.dtsi" |
410 | sata@221000 { | ||
411 | fsl,iommu-parent = <&pamu1>; | ||
412 | fsl,liodn-reg = <&guts 0x554>; /* SATA2LIODNR */ | ||
413 | }; | ||
414 | |||
353 | /include/ "qoriq-sec4.2-0.dtsi" | 415 | /include/ "qoriq-sec4.2-0.dtsi" |
416 | crypto: crypto@300000 { | ||
417 | fsl,iommu-parent = <&pamu1>; | ||
418 | }; | ||
354 | }; | 419 | }; |
diff --git a/arch/powerpc/boot/dts/fsl/p4080si-post.dtsi b/arch/powerpc/boot/dts/fsl/p4080si-post.dtsi index 4f9c9f682ecf..19859ad851eb 100644 --- a/arch/powerpc/boot/dts/fsl/p4080si-post.dtsi +++ b/arch/powerpc/boot/dts/fsl/p4080si-post.dtsi | |||
@@ -41,13 +41,15 @@ | |||
41 | 41 | ||
42 | /* controller at 0x200000 */ | 42 | /* controller at 0x200000 */ |
43 | &pci0 { | 43 | &pci0 { |
44 | compatible = "fsl,p4080-pcie"; | 44 | compatible = "fsl,p4080-pcie", "fsl,qoriq-pcie-v2.1"; |
45 | device_type = "pci"; | 45 | device_type = "pci"; |
46 | #size-cells = <2>; | 46 | #size-cells = <2>; |
47 | #address-cells = <3>; | 47 | #address-cells = <3>; |
48 | bus-range = <0x0 0xff>; | 48 | bus-range = <0x0 0xff>; |
49 | clock-frequency = <33333333>; | 49 | clock-frequency = <33333333>; |
50 | interrupts = <16 2 1 15>; | 50 | interrupts = <16 2 1 15>; |
51 | fsl,iommu-parent = <&pamu0>; | ||
52 | fsl,liodn-reg = <&guts 0x500>; /* PEX1LIODNR */ | ||
51 | pcie@0 { | 53 | pcie@0 { |
52 | reg = <0 0 0 0 0>; | 54 | reg = <0 0 0 0 0>; |
53 | #interrupt-cells = <1>; | 55 | #interrupt-cells = <1>; |
@@ -68,13 +70,15 @@ | |||
68 | 70 | ||
69 | /* controller at 0x201000 */ | 71 | /* controller at 0x201000 */ |
70 | &pci1 { | 72 | &pci1 { |
71 | compatible = "fsl,p4080-pcie"; | 73 | compatible = "fsl,p4080-pcie", "fsl,qoriq-pcie-v2.1"; |
72 | device_type = "pci"; | 74 | device_type = "pci"; |
73 | #size-cells = <2>; | 75 | #size-cells = <2>; |
74 | #address-cells = <3>; | 76 | #address-cells = <3>; |
75 | bus-range = <0 0xff>; | 77 | bus-range = <0 0xff>; |
76 | clock-frequency = <33333333>; | 78 | clock-frequency = <33333333>; |
77 | interrupts = <16 2 1 14>; | 79 | interrupts = <16 2 1 14>; |
80 | fsl,iommu-parent = <&pamu0>; | ||
81 | fsl,liodn-reg = <&guts 0x504>; /* PEX2LIODNR */ | ||
78 | pcie@0 { | 82 | pcie@0 { |
79 | reg = <0 0 0 0 0>; | 83 | reg = <0 0 0 0 0>; |
80 | #interrupt-cells = <1>; | 84 | #interrupt-cells = <1>; |
@@ -95,13 +99,15 @@ | |||
95 | 99 | ||
96 | /* controller at 0x202000 */ | 100 | /* controller at 0x202000 */ |
97 | &pci2 { | 101 | &pci2 { |
98 | compatible = "fsl,p4080-pcie"; | 102 | compatible = "fsl,p4080-pcie", "fsl,qoriq-pcie-v2.1"; |
99 | device_type = "pci"; | 103 | device_type = "pci"; |
100 | #size-cells = <2>; | 104 | #size-cells = <2>; |
101 | #address-cells = <3>; | 105 | #address-cells = <3>; |
102 | bus-range = <0x0 0xff>; | 106 | bus-range = <0x0 0xff>; |
103 | clock-frequency = <33333333>; | 107 | clock-frequency = <33333333>; |
104 | interrupts = <16 2 1 13>; | 108 | interrupts = <16 2 1 13>; |
109 | fsl,iommu-parent = <&pamu0>; | ||
110 | fsl,liodn-reg = <&guts 0x508>; /* PEX3LIODNR */ | ||
105 | pcie@0 { | 111 | pcie@0 { |
106 | reg = <0 0 0 0 0>; | 112 | reg = <0 0 0 0 0>; |
107 | #interrupt-cells = <1>; | 113 | #interrupt-cells = <1>; |
@@ -126,18 +132,21 @@ | |||
126 | #address-cells = <2>; | 132 | #address-cells = <2>; |
127 | #size-cells = <2>; | 133 | #size-cells = <2>; |
128 | fsl,srio-rmu-handle = <&rmu>; | 134 | fsl,srio-rmu-handle = <&rmu>; |
135 | fsl,iommu-parent = <&pamu0>; | ||
129 | ranges; | 136 | ranges; |
130 | 137 | ||
131 | port1 { | 138 | port1 { |
132 | #address-cells = <2>; | 139 | #address-cells = <2>; |
133 | #size-cells = <2>; | 140 | #size-cells = <2>; |
134 | cell-index = <1>; | 141 | cell-index = <1>; |
142 | fsl,liodn-reg = <&guts 0x510>; /* RIO1LIODNR */ | ||
135 | }; | 143 | }; |
136 | 144 | ||
137 | port2 { | 145 | port2 { |
138 | #address-cells = <2>; | 146 | #address-cells = <2>; |
139 | #size-cells = <2>; | 147 | #size-cells = <2>; |
140 | cell-index = <2>; | 148 | cell-index = <2>; |
149 | fsl,liodn-reg = <&guts 0x514>; /* RIO2LIODNR */ | ||
141 | }; | 150 | }; |
142 | }; | 151 | }; |
143 | 152 | ||
@@ -281,13 +290,51 @@ | |||
281 | 290 | ||
282 | iommu@20000 { | 291 | iommu@20000 { |
283 | compatible = "fsl,pamu-v1.0", "fsl,pamu"; | 292 | compatible = "fsl,pamu-v1.0", "fsl,pamu"; |
284 | reg = <0x20000 0x5000>; | 293 | reg = <0x20000 0x5000>; /* for compatibility with older PAMU drivers */ |
294 | ranges = <0 0x20000 0x5000>; | ||
295 | #address-cells = <1>; | ||
296 | #size-cells = <1>; | ||
285 | interrupts = < | 297 | interrupts = < |
286 | 24 2 0 0 | 298 | 24 2 0 0 |
287 | 16 2 1 30>; | 299 | 16 2 1 30>; |
300 | |||
301 | pamu0: pamu@0 { | ||
302 | reg = <0 0x1000>; | ||
303 | fsl,primary-cache-geometry = <32 1>; | ||
304 | fsl,secondary-cache-geometry = <128 2>; | ||
305 | }; | ||
306 | |||
307 | pamu1: pamu@1000 { | ||
308 | reg = <0x1000 0x1000>; | ||
309 | fsl,primary-cache-geometry = <32 1>; | ||
310 | fsl,secondary-cache-geometry = <128 2>; | ||
311 | }; | ||
312 | |||
313 | pamu2: pamu@2000 { | ||
314 | reg = <0x2000 0x1000>; | ||
315 | fsl,primary-cache-geometry = <32 1>; | ||
316 | fsl,secondary-cache-geometry = <128 2>; | ||
317 | }; | ||
318 | |||
319 | pamu3: pamu@3000 { | ||
320 | reg = <0x3000 0x1000>; | ||
321 | fsl,primary-cache-geometry = <32 1>; | ||
322 | fsl,secondary-cache-geometry = <128 2>; | ||
323 | }; | ||
324 | |||
325 | pamu4: pamu@4000 { | ||
326 | reg = <0x4000 0x1000>; | ||
327 | fsl,primary-cache-geometry = <32 1>; | ||
328 | fsl,secondary-cache-geometry = <128 2>; | ||
329 | }; | ||
288 | }; | 330 | }; |
289 | 331 | ||
290 | /include/ "qoriq-rmu-0.dtsi" | 332 | /include/ "qoriq-rmu-0.dtsi" |
333 | rmu@d3000 { | ||
334 | fsl,iommu-parent = <&pamu0>; | ||
335 | fsl,liodn-reg = <&guts 0x540>; /* RMULIODNR */ | ||
336 | }; | ||
337 | |||
291 | /include/ "qoriq-mpic.dtsi" | 338 | /include/ "qoriq-mpic.dtsi" |
292 | 339 | ||
293 | guts: global-utilities@e0000 { | 340 | guts: global-utilities@e0000 { |
@@ -327,7 +374,17 @@ | |||
327 | }; | 374 | }; |
328 | 375 | ||
329 | /include/ "qoriq-dma-0.dtsi" | 376 | /include/ "qoriq-dma-0.dtsi" |
377 | dma@100300 { | ||
378 | fsl,iommu-parent = <&pamu0>; | ||
379 | fsl,liodn-reg = <&guts 0x580>; /* DMA1LIODNR */ | ||
380 | }; | ||
381 | |||
330 | /include/ "qoriq-dma-1.dtsi" | 382 | /include/ "qoriq-dma-1.dtsi" |
383 | dma@101300 { | ||
384 | fsl,iommu-parent = <&pamu0>; | ||
385 | fsl,liodn-reg = <&guts 0x584>; /* DMA2LIODNR */ | ||
386 | }; | ||
387 | |||
331 | /include/ "qoriq-espi-0.dtsi" | 388 | /include/ "qoriq-espi-0.dtsi" |
332 | spi@110000 { | 389 | spi@110000 { |
333 | fsl,espi-num-chipselects = <4>; | 390 | fsl,espi-num-chipselects = <4>; |
@@ -335,6 +392,8 @@ | |||
335 | 392 | ||
336 | /include/ "qoriq-esdhc-0.dtsi" | 393 | /include/ "qoriq-esdhc-0.dtsi" |
337 | sdhc@114000 { | 394 | sdhc@114000 { |
395 | fsl,iommu-parent = <&pamu1>; | ||
396 | fsl,liodn-reg = <&guts 0x530>; /* eSDHCLIODNR */ | ||
338 | voltage-ranges = <3300 3300>; | 397 | voltage-ranges = <3300 3300>; |
339 | sdhci,auto-cmd12; | 398 | sdhci,auto-cmd12; |
340 | }; | 399 | }; |
@@ -347,11 +406,18 @@ | |||
347 | /include/ "qoriq-usb2-mph-0.dtsi" | 406 | /include/ "qoriq-usb2-mph-0.dtsi" |
348 | usb@210000 { | 407 | usb@210000 { |
349 | compatible = "fsl-usb2-mph-v1.6", "fsl,mpc85xx-usb2-mph", "fsl-usb2-mph"; | 408 | compatible = "fsl-usb2-mph-v1.6", "fsl,mpc85xx-usb2-mph", "fsl-usb2-mph"; |
409 | fsl,iommu-parent = <&pamu1>; | ||
410 | fsl,liodn-reg = <&guts 0x520>; /* USB1LIODNR */ | ||
350 | port0; | 411 | port0; |
351 | }; | 412 | }; |
352 | /include/ "qoriq-usb2-dr-0.dtsi" | 413 | /include/ "qoriq-usb2-dr-0.dtsi" |
353 | usb@211000 { | 414 | usb@211000 { |
354 | compatible = "fsl-usb2-dr-v1.6", "fsl,mpc85xx-usb2-dr", "fsl-usb2-dr"; | 415 | compatible = "fsl-usb2-dr-v1.6", "fsl,mpc85xx-usb2-dr", "fsl-usb2-dr"; |
416 | fsl,iommu-parent = <&pamu1>; | ||
417 | fsl,liodn-reg = <&guts 0x524>; /* USB2LIODNR */ | ||
355 | }; | 418 | }; |
356 | /include/ "qoriq-sec4.0-0.dtsi" | 419 | /include/ "qoriq-sec4.0-0.dtsi" |
420 | crypto: crypto@300000 { | ||
421 | fsl,iommu-parent = <&pamu1>; | ||
422 | }; | ||
357 | }; | 423 | }; |
diff --git a/arch/powerpc/boot/dts/fsl/p5020si-post.dtsi b/arch/powerpc/boot/dts/fsl/p5020si-post.dtsi index 5d7205b7bb05..9ea77c3513f6 100644 --- a/arch/powerpc/boot/dts/fsl/p5020si-post.dtsi +++ b/arch/powerpc/boot/dts/fsl/p5020si-post.dtsi | |||
@@ -48,6 +48,8 @@ | |||
48 | bus-range = <0x0 0xff>; | 48 | bus-range = <0x0 0xff>; |
49 | clock-frequency = <33333333>; | 49 | clock-frequency = <33333333>; |
50 | interrupts = <16 2 1 15>; | 50 | interrupts = <16 2 1 15>; |
51 | fsl,iommu-parent = <&pamu0>; | ||
52 | fsl,liodn-reg = <&guts 0x500>; /* PEX1LIODNR */ | ||
51 | pcie@0 { | 53 | pcie@0 { |
52 | reg = <0 0 0 0 0>; | 54 | reg = <0 0 0 0 0>; |
53 | #interrupt-cells = <1>; | 55 | #interrupt-cells = <1>; |
@@ -75,6 +77,8 @@ | |||
75 | bus-range = <0 0xff>; | 77 | bus-range = <0 0xff>; |
76 | clock-frequency = <33333333>; | 78 | clock-frequency = <33333333>; |
77 | interrupts = <16 2 1 14>; | 79 | interrupts = <16 2 1 14>; |
80 | fsl,iommu-parent = <&pamu0>; | ||
81 | fsl,liodn-reg = <&guts 0x504>; /* PEX2LIODNR */ | ||
78 | pcie@0 { | 82 | pcie@0 { |
79 | reg = <0 0 0 0 0>; | 83 | reg = <0 0 0 0 0>; |
80 | #interrupt-cells = <1>; | 84 | #interrupt-cells = <1>; |
@@ -102,6 +106,8 @@ | |||
102 | bus-range = <0x0 0xff>; | 106 | bus-range = <0x0 0xff>; |
103 | clock-frequency = <33333333>; | 107 | clock-frequency = <33333333>; |
104 | interrupts = <16 2 1 13>; | 108 | interrupts = <16 2 1 13>; |
109 | fsl,iommu-parent = <&pamu0>; | ||
110 | fsl,liodn-reg = <&guts 0x508>; /* PEX3LIODNR */ | ||
105 | pcie@0 { | 111 | pcie@0 { |
106 | reg = <0 0 0 0 0>; | 112 | reg = <0 0 0 0 0>; |
107 | #interrupt-cells = <1>; | 113 | #interrupt-cells = <1>; |
@@ -129,6 +135,8 @@ | |||
129 | bus-range = <0x0 0xff>; | 135 | bus-range = <0x0 0xff>; |
130 | clock-frequency = <33333333>; | 136 | clock-frequency = <33333333>; |
131 | interrupts = <16 2 1 12>; | 137 | interrupts = <16 2 1 12>; |
138 | fsl,iommu-parent = <&pamu0>; | ||
139 | fsl,liodn-reg = <&guts 0x50c>; /* PEX4LIODNR */ | ||
132 | pcie@0 { | 140 | pcie@0 { |
133 | reg = <0 0 0 0 0>; | 141 | reg = <0 0 0 0 0>; |
134 | #interrupt-cells = <1>; | 142 | #interrupt-cells = <1>; |
@@ -152,18 +160,21 @@ | |||
152 | interrupts = <16 2 1 11>; | 160 | interrupts = <16 2 1 11>; |
153 | #address-cells = <2>; | 161 | #address-cells = <2>; |
154 | #size-cells = <2>; | 162 | #size-cells = <2>; |
163 | fsl,iommu-parent = <&pamu0>; | ||
155 | ranges; | 164 | ranges; |
156 | 165 | ||
157 | port1 { | 166 | port1 { |
158 | #address-cells = <2>; | 167 | #address-cells = <2>; |
159 | #size-cells = <2>; | 168 | #size-cells = <2>; |
160 | cell-index = <1>; | 169 | cell-index = <1>; |
170 | fsl,liodn-reg = <&guts 0x510>; /* RIO1LIODNR */ | ||
161 | }; | 171 | }; |
162 | 172 | ||
163 | port2 { | 173 | port2 { |
164 | #address-cells = <2>; | 174 | #address-cells = <2>; |
165 | #size-cells = <2>; | 175 | #size-cells = <2>; |
166 | cell-index = <2>; | 176 | cell-index = <2>; |
177 | fsl,liodn-reg = <&guts 0x514>; /* RIO2LIODNR */ | ||
167 | }; | 178 | }; |
168 | }; | 179 | }; |
169 | 180 | ||
@@ -276,10 +287,37 @@ | |||
276 | 287 | ||
277 | iommu@20000 { | 288 | iommu@20000 { |
278 | compatible = "fsl,pamu-v1.0", "fsl,pamu"; | 289 | compatible = "fsl,pamu-v1.0", "fsl,pamu"; |
279 | reg = <0x20000 0x4000>; | 290 | reg = <0x20000 0x4000>; /* for compatibility with older PAMU drivers */ |
291 | ranges = <0 0x20000 0x4000>; | ||
292 | #address-cells = <1>; | ||
293 | #size-cells = <1>; | ||
280 | interrupts = < | 294 | interrupts = < |
281 | 24 2 0 0 | 295 | 24 2 0 0 |
282 | 16 2 1 30>; | 296 | 16 2 1 30>; |
297 | |||
298 | pamu0: pamu@0 { | ||
299 | reg = <0 0x1000>; | ||
300 | fsl,primary-cache-geometry = <32 1>; | ||
301 | fsl,secondary-cache-geometry = <128 2>; | ||
302 | }; | ||
303 | |||
304 | pamu1: pamu@1000 { | ||
305 | reg = <0x1000 0x1000>; | ||
306 | fsl,primary-cache-geometry = <32 1>; | ||
307 | fsl,secondary-cache-geometry = <128 2>; | ||
308 | }; | ||
309 | |||
310 | pamu2: pamu@2000 { | ||
311 | reg = <0x2000 0x1000>; | ||
312 | fsl,primary-cache-geometry = <32 1>; | ||
313 | fsl,secondary-cache-geometry = <128 2>; | ||
314 | }; | ||
315 | |||
316 | pamu3: pamu@3000 { | ||
317 | reg = <0x3000 0x1000>; | ||
318 | fsl,primary-cache-geometry = <32 1>; | ||
319 | fsl,secondary-cache-geometry = <128 2>; | ||
320 | }; | ||
283 | }; | 321 | }; |
284 | 322 | ||
285 | /include/ "qoriq-mpic.dtsi" | 323 | /include/ "qoriq-mpic.dtsi" |
@@ -321,7 +359,17 @@ | |||
321 | }; | 359 | }; |
322 | 360 | ||
323 | /include/ "qoriq-dma-0.dtsi" | 361 | /include/ "qoriq-dma-0.dtsi" |
362 | dma@100300 { | ||
363 | fsl,iommu-parent = <&pamu0>; | ||
364 | fsl,liodn-reg = <&guts 0x580>; /* DMA1LIODNR */ | ||
365 | }; | ||
366 | |||
324 | /include/ "qoriq-dma-1.dtsi" | 367 | /include/ "qoriq-dma-1.dtsi" |
368 | dma@101300 { | ||
369 | fsl,iommu-parent = <&pamu0>; | ||
370 | fsl,liodn-reg = <&guts 0x584>; /* DMA2LIODNR */ | ||
371 | }; | ||
372 | |||
325 | /include/ "qoriq-espi-0.dtsi" | 373 | /include/ "qoriq-espi-0.dtsi" |
326 | spi@110000 { | 374 | spi@110000 { |
327 | fsl,espi-num-chipselects = <4>; | 375 | fsl,espi-num-chipselects = <4>; |
@@ -329,6 +377,8 @@ | |||
329 | 377 | ||
330 | /include/ "qoriq-esdhc-0.dtsi" | 378 | /include/ "qoriq-esdhc-0.dtsi" |
331 | sdhc@114000 { | 379 | sdhc@114000 { |
380 | fsl,iommu-parent = <&pamu1>; | ||
381 | fsl,liodn-reg = <&guts 0x530>; /* eSDHCLIODNR */ | ||
332 | sdhci,auto-cmd12; | 382 | sdhci,auto-cmd12; |
333 | }; | 383 | }; |
334 | 384 | ||
@@ -338,21 +388,41 @@ | |||
338 | /include/ "qoriq-duart-1.dtsi" | 388 | /include/ "qoriq-duart-1.dtsi" |
339 | /include/ "qoriq-gpio-0.dtsi" | 389 | /include/ "qoriq-gpio-0.dtsi" |
340 | /include/ "qoriq-usb2-mph-0.dtsi" | 390 | /include/ "qoriq-usb2-mph-0.dtsi" |
341 | usb0: usb@210000 { | 391 | usb0: usb@210000 { |
342 | compatible = "fsl-usb2-mph-v1.6", "fsl,mpc85xx-usb2-mph", "fsl-usb2-mph"; | 392 | compatible = "fsl-usb2-mph-v1.6", "fsl,mpc85xx-usb2-mph", "fsl-usb2-mph"; |
343 | phy_type = "utmi"; | 393 | fsl,iommu-parent = <&pamu1>; |
344 | port0; | 394 | fsl,liodn-reg = <&guts 0x520>; /* USB1LIODNR */ |
345 | }; | 395 | phy_type = "utmi"; |
396 | port0; | ||
397 | }; | ||
346 | 398 | ||
347 | /include/ "qoriq-usb2-dr-0.dtsi" | 399 | /include/ "qoriq-usb2-dr-0.dtsi" |
348 | usb1: usb@211000 { | 400 | usb1: usb@211000 { |
349 | compatible = "fsl-usb2-dr-v1.6", "fsl,mpc85xx-usb2-dr", "fsl-usb2-dr"; | 401 | compatible = "fsl-usb2-dr-v1.6", "fsl,mpc85xx-usb2-dr", "fsl-usb2-dr"; |
350 | dr_mode = "host"; | 402 | fsl,iommu-parent = <&pamu1>; |
351 | phy_type = "utmi"; | 403 | fsl,liodn-reg = <&guts 0x524>; /* USB2LIODNR */ |
352 | }; | 404 | dr_mode = "host"; |
405 | phy_type = "utmi"; | ||
406 | }; | ||
353 | 407 | ||
354 | /include/ "qoriq-sata2-0.dtsi" | 408 | /include/ "qoriq-sata2-0.dtsi" |
409 | sata@220000 { | ||
410 | fsl,iommu-parent = <&pamu1>; | ||
411 | fsl,liodn-reg = <&guts 0x550>; /* SATA1LIODNR */ | ||
412 | }; | ||
413 | |||
355 | /include/ "qoriq-sata2-1.dtsi" | 414 | /include/ "qoriq-sata2-1.dtsi" |
415 | sata@221000 { | ||
416 | fsl,iommu-parent = <&pamu1>; | ||
417 | fsl,liodn-reg = <&guts 0x554>; /* SATA2LIODNR */ | ||
418 | }; | ||
356 | /include/ "qoriq-sec4.2-0.dtsi" | 419 | /include/ "qoriq-sec4.2-0.dtsi" |
420 | crypto@300000 { | ||
421 | fsl,iommu-parent = <&pamu1>; | ||
422 | }; | ||
423 | |||
357 | /include/ "qoriq-raid1.0-0.dtsi" | 424 | /include/ "qoriq-raid1.0-0.dtsi" |
425 | raideng@320000 { | ||
426 | fsl,iommu-parent = <&pamu1>; | ||
427 | }; | ||
358 | }; | 428 | }; |
diff --git a/arch/powerpc/boot/dts/fsl/p5040si-post.dtsi b/arch/powerpc/boot/dts/fsl/p5040si-post.dtsi index db2c9a7b3a0e..97f8c26f9709 100644 --- a/arch/powerpc/boot/dts/fsl/p5040si-post.dtsi +++ b/arch/powerpc/boot/dts/fsl/p5040si-post.dtsi | |||
@@ -48,6 +48,7 @@ | |||
48 | bus-range = <0x0 0xff>; | 48 | bus-range = <0x0 0xff>; |
49 | clock-frequency = <33333333>; | 49 | clock-frequency = <33333333>; |
50 | interrupts = <16 2 1 15>; | 50 | interrupts = <16 2 1 15>; |
51 | fsl,iommu-parent = <&pamu0>; | ||
51 | pcie@0 { | 52 | pcie@0 { |
52 | reg = <0 0 0 0 0>; | 53 | reg = <0 0 0 0 0>; |
53 | #interrupt-cells = <1>; | 54 | #interrupt-cells = <1>; |
@@ -75,6 +76,7 @@ | |||
75 | bus-range = <0 0xff>; | 76 | bus-range = <0 0xff>; |
76 | clock-frequency = <33333333>; | 77 | clock-frequency = <33333333>; |
77 | interrupts = <16 2 1 14>; | 78 | interrupts = <16 2 1 14>; |
79 | fsl,iommu-parent = <&pamu0>; | ||
78 | pcie@0 { | 80 | pcie@0 { |
79 | reg = <0 0 0 0 0>; | 81 | reg = <0 0 0 0 0>; |
80 | #interrupt-cells = <1>; | 82 | #interrupt-cells = <1>; |
@@ -102,6 +104,7 @@ | |||
102 | bus-range = <0x0 0xff>; | 104 | bus-range = <0x0 0xff>; |
103 | clock-frequency = <33333333>; | 105 | clock-frequency = <33333333>; |
104 | interrupts = <16 2 1 13>; | 106 | interrupts = <16 2 1 13>; |
107 | fsl,iommu-parent = <&pamu0>; | ||
105 | pcie@0 { | 108 | pcie@0 { |
106 | reg = <0 0 0 0 0>; | 109 | reg = <0 0 0 0 0>; |
107 | #interrupt-cells = <1>; | 110 | #interrupt-cells = <1>; |
@@ -239,10 +242,42 @@ | |||
239 | 242 | ||
240 | iommu@20000 { | 243 | iommu@20000 { |
241 | compatible = "fsl,pamu-v1.0", "fsl,pamu"; | 244 | compatible = "fsl,pamu-v1.0", "fsl,pamu"; |
242 | reg = <0x20000 0x5000>; | 245 | reg = <0x20000 0x5000>; /* for compatibility with older PAMU drivers */ |
243 | interrupts = < | 246 | ranges = <0 0x20000 0x5000>; |
244 | 24 2 0 0 | 247 | #address-cells = <1>; |
245 | 16 2 1 30>; | 248 | #size-cells = <1>; |
249 | interrupts = <24 2 0 0 | ||
250 | 16 2 1 30>; | ||
251 | |||
252 | pamu0: pamu@0 { | ||
253 | reg = <0 0x1000>; | ||
254 | fsl,primary-cache-geometry = <32 1>; | ||
255 | fsl,secondary-cache-geometry = <128 2>; | ||
256 | }; | ||
257 | |||
258 | pamu1: pamu@1000 { | ||
259 | reg = <0x1000 0x1000>; | ||
260 | fsl,primary-cache-geometry = <32 1>; | ||
261 | fsl,secondary-cache-geometry = <128 2>; | ||
262 | }; | ||
263 | |||
264 | pamu2: pamu@2000 { | ||
265 | reg = <0x2000 0x1000>; | ||
266 | fsl,primary-cache-geometry = <32 1>; | ||
267 | fsl,secondary-cache-geometry = <128 2>; | ||
268 | }; | ||
269 | |||
270 | pamu3: pamu@3000 { | ||
271 | reg = <0x3000 0x1000>; | ||
272 | fsl,primary-cache-geometry = <32 1>; | ||
273 | fsl,secondary-cache-geometry = <128 2>; | ||
274 | }; | ||
275 | |||
276 | pamu4: pamu@4000 { | ||
277 | reg = <0x4000 0x1000>; | ||
278 | fsl,primary-cache-geometry = <32 1>; | ||
279 | fsl,secondary-cache-geometry = <128 2>; | ||
280 | }; | ||
246 | }; | 281 | }; |
247 | 282 | ||
248 | /include/ "qoriq-mpic.dtsi" | 283 | /include/ "qoriq-mpic.dtsi" |
@@ -284,7 +319,17 @@ | |||
284 | }; | 319 | }; |
285 | 320 | ||
286 | /include/ "qoriq-dma-0.dtsi" | 321 | /include/ "qoriq-dma-0.dtsi" |
322 | dma@100300 { | ||
323 | fsl,iommu-parent = <&pamu0>; | ||
324 | fsl,liodn-reg = <&guts 0x580>; /* DMA1LIODNR */ | ||
325 | }; | ||
326 | |||
287 | /include/ "qoriq-dma-1.dtsi" | 327 | /include/ "qoriq-dma-1.dtsi" |
328 | dma@101300 { | ||
329 | fsl,iommu-parent = <&pamu0>; | ||
330 | fsl,liodn-reg = <&guts 0x584>; /* DMA2LIODNR */ | ||
331 | }; | ||
332 | |||
288 | /include/ "qoriq-espi-0.dtsi" | 333 | /include/ "qoriq-espi-0.dtsi" |
289 | spi@110000 { | 334 | spi@110000 { |
290 | fsl,espi-num-chipselects = <4>; | 335 | fsl,espi-num-chipselects = <4>; |
@@ -292,6 +337,8 @@ | |||
292 | 337 | ||
293 | /include/ "qoriq-esdhc-0.dtsi" | 338 | /include/ "qoriq-esdhc-0.dtsi" |
294 | sdhc@114000 { | 339 | sdhc@114000 { |
340 | fsl,iommu-parent = <&pamu2>; | ||
341 | fsl,liodn-reg = <&guts 0x530>; /* eSDHCLIODNR */ | ||
295 | sdhci,auto-cmd12; | 342 | sdhci,auto-cmd12; |
296 | }; | 343 | }; |
297 | 344 | ||
@@ -301,20 +348,37 @@ | |||
301 | /include/ "qoriq-duart-1.dtsi" | 348 | /include/ "qoriq-duart-1.dtsi" |
302 | /include/ "qoriq-gpio-0.dtsi" | 349 | /include/ "qoriq-gpio-0.dtsi" |
303 | /include/ "qoriq-usb2-mph-0.dtsi" | 350 | /include/ "qoriq-usb2-mph-0.dtsi" |
304 | usb0: usb@210000 { | 351 | usb0: usb@210000 { |
305 | compatible = "fsl-usb2-mph-v1.6", "fsl,mpc85xx-usb2-mph", "fsl-usb2-mph"; | 352 | compatible = "fsl-usb2-mph-v1.6", "fsl,mpc85xx-usb2-mph", "fsl-usb2-mph"; |
306 | phy_type = "utmi"; | 353 | fsl,iommu-parent = <&pamu4>; |
307 | port0; | 354 | fsl,liodn-reg = <&guts 0x520>; /* USB1LIODNR */ |
308 | }; | 355 | phy_type = "utmi"; |
356 | port0; | ||
357 | }; | ||
309 | 358 | ||
310 | /include/ "qoriq-usb2-dr-0.dtsi" | 359 | /include/ "qoriq-usb2-dr-0.dtsi" |
311 | usb1: usb@211000 { | 360 | usb1: usb@211000 { |
312 | compatible = "fsl-usb2-dr-v1.6", "fsl,mpc85xx-usb2-dr", "fsl-usb2-dr"; | 361 | compatible = "fsl-usb2-dr-v1.6", "fsl,mpc85xx-usb2-dr", "fsl-usb2-dr"; |
313 | dr_mode = "host"; | 362 | fsl,iommu-parent = <&pamu4>; |
314 | phy_type = "utmi"; | 363 | fsl,liodn-reg = <&guts 0x524>; /* USB2LIODNR */ |
315 | }; | 364 | dr_mode = "host"; |
365 | phy_type = "utmi"; | ||
366 | }; | ||
316 | 367 | ||
317 | /include/ "qoriq-sata2-0.dtsi" | 368 | /include/ "qoriq-sata2-0.dtsi" |
369 | sata@220000 { | ||
370 | fsl,iommu-parent = <&pamu4>; | ||
371 | fsl,liodn-reg = <&guts 0x550>; /* SATA1LIODNR */ | ||
372 | }; | ||
373 | |||
318 | /include/ "qoriq-sata2-1.dtsi" | 374 | /include/ "qoriq-sata2-1.dtsi" |
375 | sata@221000 { | ||
376 | fsl,iommu-parent = <&pamu4>; | ||
377 | fsl,liodn-reg = <&guts 0x554>; /* SATA2LIODNR */ | ||
378 | }; | ||
379 | |||
319 | /include/ "qoriq-sec5.2-0.dtsi" | 380 | /include/ "qoriq-sec5.2-0.dtsi" |
381 | crypto@300000 { | ||
382 | fsl,iommu-parent = <&pamu4>; | ||
383 | }; | ||
320 | }; | 384 | }; |
diff --git a/arch/powerpc/boot/dts/fsl/pq3-sec4.4-0.dtsi b/arch/powerpc/boot/dts/fsl/pq3-sec4.4-0.dtsi index d4c9d5daab21..ffadcb563ada 100644 --- a/arch/powerpc/boot/dts/fsl/pq3-sec4.4-0.dtsi +++ b/arch/powerpc/boot/dts/fsl/pq3-sec4.4-0.dtsi | |||
@@ -36,6 +36,7 @@ crypto@30000 { | |||
36 | compatible = "fsl,sec-v4.4", "fsl,sec-v4.0"; | 36 | compatible = "fsl,sec-v4.4", "fsl,sec-v4.0"; |
37 | #address-cells = <1>; | 37 | #address-cells = <1>; |
38 | #size-cells = <1>; | 38 | #size-cells = <1>; |
39 | ranges = <0x0 0x30000 0x10000>; | ||
39 | reg = <0x30000 0x10000>; | 40 | reg = <0x30000 0x10000>; |
40 | interrupts = <58 2 0 0>; | 41 | interrupts = <58 2 0 0>; |
41 | 42 | ||
diff --git a/arch/powerpc/boot/dts/lite5200b.dts b/arch/powerpc/boot/dts/lite5200b.dts index fb288bb882b6..5abb46c5cc95 100644 --- a/arch/powerpc/boot/dts/lite5200b.dts +++ b/arch/powerpc/boot/dts/lite5200b.dts | |||
@@ -12,19 +12,34 @@ | |||
12 | 12 | ||
13 | /include/ "mpc5200b.dtsi" | 13 | /include/ "mpc5200b.dtsi" |
14 | 14 | ||
15 | &gpt0 { fsl,has-wdt; }; | ||
16 | &gpt2 { gpio-controller; }; | ||
17 | &gpt3 { gpio-controller; }; | ||
18 | |||
15 | / { | 19 | / { |
16 | model = "fsl,lite5200b"; | 20 | model = "fsl,lite5200b"; |
17 | compatible = "fsl,lite5200b"; | 21 | compatible = "fsl,lite5200b"; |
18 | 22 | ||
23 | leds { | ||
24 | compatible = "gpio-leds"; | ||
25 | tmr2 { | ||
26 | gpios = <&gpt2 0 1>; | ||
27 | }; | ||
28 | tmr3 { | ||
29 | gpios = <&gpt3 0 1>; | ||
30 | linux,default-trigger = "heartbeat"; | ||
31 | }; | ||
32 | led1 { gpios = <&gpio_wkup 2 1>; }; | ||
33 | led2 { gpios = <&gpio_simple 3 1>; }; | ||
34 | led3 { gpios = <&gpio_wkup 3 1>; }; | ||
35 | led4 { gpios = <&gpio_simple 2 1>; }; | ||
36 | }; | ||
37 | |||
19 | memory { | 38 | memory { |
20 | reg = <0x00000000 0x10000000>; // 256MB | 39 | reg = <0x00000000 0x10000000>; // 256MB |
21 | }; | 40 | }; |
22 | 41 | ||
23 | soc5200@f0000000 { | 42 | soc5200@f0000000 { |
24 | timer@600 { // General Purpose Timer | ||
25 | fsl,has-wdt; | ||
26 | }; | ||
27 | |||
28 | psc@2000 { // PSC1 | 43 | psc@2000 { // PSC1 |
29 | compatible = "fsl,mpc5200b-psc-uart","fsl,mpc5200-psc-uart"; | 44 | compatible = "fsl,mpc5200b-psc-uart","fsl,mpc5200-psc-uart"; |
30 | cell-index = <0>; | 45 | cell-index = <0>; |
diff --git a/arch/powerpc/boot/dts/media5200.dts b/arch/powerpc/boot/dts/media5200.dts index 48d72f38e5ed..b5413cb85f13 100644 --- a/arch/powerpc/boot/dts/media5200.dts +++ b/arch/powerpc/boot/dts/media5200.dts | |||
@@ -13,6 +13,8 @@ | |||
13 | 13 | ||
14 | /include/ "mpc5200b.dtsi" | 14 | /include/ "mpc5200b.dtsi" |
15 | 15 | ||
16 | &gpt0 { fsl,has-wdt; }; | ||
17 | |||
16 | / { | 18 | / { |
17 | model = "fsl,media5200"; | 19 | model = "fsl,media5200"; |
18 | compatible = "fsl,media5200"; | 20 | compatible = "fsl,media5200"; |
@@ -41,10 +43,6 @@ | |||
41 | soc5200@f0000000 { | 43 | soc5200@f0000000 { |
42 | bus-frequency = <132000000>;// 132 MHz | 44 | bus-frequency = <132000000>;// 132 MHz |
43 | 45 | ||
44 | timer@600 { // General Purpose Timer | ||
45 | fsl,has-wdt; | ||
46 | }; | ||
47 | |||
48 | psc@2000 { // PSC1 | 46 | psc@2000 { // PSC1 |
49 | status = "disabled"; | 47 | status = "disabled"; |
50 | }; | 48 | }; |
diff --git a/arch/powerpc/boot/dts/motionpro.dts b/arch/powerpc/boot/dts/motionpro.dts index 0b78e89ac69b..bbabd97492ad 100644 --- a/arch/powerpc/boot/dts/motionpro.dts +++ b/arch/powerpc/boot/dts/motionpro.dts | |||
@@ -12,26 +12,22 @@ | |||
12 | 12 | ||
13 | /include/ "mpc5200b.dtsi" | 13 | /include/ "mpc5200b.dtsi" |
14 | 14 | ||
15 | &gpt0 { fsl,has-wdt; }; | ||
16 | &gpt6 { // Motion-PRO status LED | ||
17 | compatible = "promess,motionpro-led"; | ||
18 | label = "motionpro-statusled"; | ||
19 | blink-delay = <100>; // 100 msec | ||
20 | }; | ||
21 | &gpt7 { // Motion-PRO ready LED | ||
22 | compatible = "promess,motionpro-led"; | ||
23 | label = "motionpro-readyled"; | ||
24 | }; | ||
25 | |||
15 | / { | 26 | / { |
16 | model = "promess,motionpro"; | 27 | model = "promess,motionpro"; |
17 | compatible = "promess,motionpro"; | 28 | compatible = "promess,motionpro"; |
18 | 29 | ||
19 | soc5200@f0000000 { | 30 | soc5200@f0000000 { |
20 | timer@600 { // General Purpose Timer | ||
21 | fsl,has-wdt; | ||
22 | }; | ||
23 | |||
24 | timer@660 { // Motion-PRO status LED | ||
25 | compatible = "promess,motionpro-led"; | ||
26 | label = "motionpro-statusled"; | ||
27 | blink-delay = <100>; // 100 msec | ||
28 | }; | ||
29 | |||
30 | timer@670 { // Motion-PRO ready LED | ||
31 | compatible = "promess,motionpro-led"; | ||
32 | label = "motionpro-readyled"; | ||
33 | }; | ||
34 | |||
35 | can@900 { | 31 | can@900 { |
36 | status = "disabled"; | 32 | status = "disabled"; |
37 | }; | 33 | }; |
diff --git a/arch/powerpc/boot/dts/mpc5121.dtsi b/arch/powerpc/boot/dts/mpc5121.dtsi new file mode 100644 index 000000000000..723e292b6b4e --- /dev/null +++ b/arch/powerpc/boot/dts/mpc5121.dtsi | |||
@@ -0,0 +1,410 @@ | |||
1 | /* | ||
2 | * base MPC5121 Device Tree Source | ||
3 | * | ||
4 | * Copyright 2007-2008 Freescale Semiconductor Inc. | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify it | ||
7 | * under the terms of the GNU General Public License as published by the | ||
8 | * Free Software Foundation; either version 2 of the License, or (at your | ||
9 | * option) any later version. | ||
10 | */ | ||
11 | |||
12 | /dts-v1/; | ||
13 | |||
14 | / { | ||
15 | model = "mpc5121"; | ||
16 | compatible = "fsl,mpc5121"; | ||
17 | #address-cells = <1>; | ||
18 | #size-cells = <1>; | ||
19 | interrupt-parent = <&ipic>; | ||
20 | |||
21 | aliases { | ||
22 | ethernet0 = ð0; | ||
23 | pci = &pci; | ||
24 | }; | ||
25 | |||
26 | cpus { | ||
27 | #address-cells = <1>; | ||
28 | #size-cells = <0>; | ||
29 | |||
30 | PowerPC,5121@0 { | ||
31 | device_type = "cpu"; | ||
32 | reg = <0>; | ||
33 | d-cache-line-size = <0x20>; /* 32 bytes */ | ||
34 | i-cache-line-size = <0x20>; /* 32 bytes */ | ||
35 | d-cache-size = <0x8000>; /* L1, 32K */ | ||
36 | i-cache-size = <0x8000>; /* L1, 32K */ | ||
37 | timebase-frequency = <49500000>;/* 49.5 MHz (csb/4) */ | ||
38 | bus-frequency = <198000000>; /* 198 MHz csb bus */ | ||
39 | clock-frequency = <396000000>; /* 396 MHz ppc core */ | ||
40 | }; | ||
41 | }; | ||
42 | |||
43 | memory { | ||
44 | device_type = "memory"; | ||
45 | reg = <0x00000000 0x10000000>; /* 256MB at 0 */ | ||
46 | }; | ||
47 | |||
48 | mbx@20000000 { | ||
49 | compatible = "fsl,mpc5121-mbx"; | ||
50 | reg = <0x20000000 0x4000>; | ||
51 | interrupts = <66 0x8>; | ||
52 | }; | ||
53 | |||
54 | sram@30000000 { | ||
55 | compatible = "fsl,mpc5121-sram"; | ||
56 | reg = <0x30000000 0x20000>; /* 128K at 0x30000000 */ | ||
57 | }; | ||
58 | |||
59 | nfc@40000000 { | ||
60 | compatible = "fsl,mpc5121-nfc"; | ||
61 | reg = <0x40000000 0x100000>; /* 1M at 0x40000000 */ | ||
62 | interrupts = <6 8>; | ||
63 | #address-cells = <1>; | ||
64 | #size-cells = <1>; | ||
65 | }; | ||
66 | |||
67 | localbus@80000020 { | ||
68 | compatible = "fsl,mpc5121-localbus"; | ||
69 | #address-cells = <2>; | ||
70 | #size-cells = <1>; | ||
71 | reg = <0x80000020 0x40>; | ||
72 | interrupts = <7 0x8>; | ||
73 | ranges = <0x0 0x0 0xfc000000 0x04000000>; | ||
74 | }; | ||
75 | |||
76 | soc@80000000 { | ||
77 | compatible = "fsl,mpc5121-immr"; | ||
78 | #address-cells = <1>; | ||
79 | #size-cells = <1>; | ||
80 | #interrupt-cells = <2>; | ||
81 | ranges = <0x0 0x80000000 0x400000>; | ||
82 | reg = <0x80000000 0x400000>; | ||
83 | bus-frequency = <66000000>; /* 66 MHz ips bus */ | ||
84 | |||
85 | |||
86 | /* | ||
87 | * IPIC | ||
88 | * interrupts cell = <intr #, sense> | ||
89 | * sense values match linux IORESOURCE_IRQ_* defines: | ||
90 | * sense == 8: Level, low assertion | ||
91 | * sense == 2: Edge, high-to-low change | ||
92 | */ | ||
93 | ipic: interrupt-controller@c00 { | ||
94 | compatible = "fsl,mpc5121-ipic", "fsl,ipic"; | ||
95 | interrupt-controller; | ||
96 | #address-cells = <0>; | ||
97 | #interrupt-cells = <2>; | ||
98 | reg = <0xc00 0x100>; | ||
99 | }; | ||
100 | |||
101 | /* Watchdog timer */ | ||
102 | wdt@900 { | ||
103 | compatible = "fsl,mpc5121-wdt"; | ||
104 | reg = <0x900 0x100>; | ||
105 | }; | ||
106 | |||
107 | /* Real time clock */ | ||
108 | rtc@a00 { | ||
109 | compatible = "fsl,mpc5121-rtc"; | ||
110 | reg = <0xa00 0x100>; | ||
111 | interrupts = <79 0x8 80 0x8>; | ||
112 | }; | ||
113 | |||
114 | /* Reset module */ | ||
115 | reset@e00 { | ||
116 | compatible = "fsl,mpc5121-reset"; | ||
117 | reg = <0xe00 0x100>; | ||
118 | }; | ||
119 | |||
120 | /* Clock control */ | ||
121 | clock@f00 { | ||
122 | compatible = "fsl,mpc5121-clock"; | ||
123 | reg = <0xf00 0x100>; | ||
124 | }; | ||
125 | |||
126 | /* Power Management Controller */ | ||
127 | pmc@1000{ | ||
128 | compatible = "fsl,mpc5121-pmc"; | ||
129 | reg = <0x1000 0x100>; | ||
130 | interrupts = <83 0x8>; | ||
131 | }; | ||
132 | |||
133 | gpio@1100 { | ||
134 | compatible = "fsl,mpc5121-gpio"; | ||
135 | reg = <0x1100 0x100>; | ||
136 | interrupts = <78 0x8>; | ||
137 | }; | ||
138 | |||
139 | can@1300 { | ||
140 | compatible = "fsl,mpc5121-mscan"; | ||
141 | reg = <0x1300 0x80>; | ||
142 | interrupts = <12 0x8>; | ||
143 | }; | ||
144 | |||
145 | can@1380 { | ||
146 | compatible = "fsl,mpc5121-mscan"; | ||
147 | reg = <0x1380 0x80>; | ||
148 | interrupts = <13 0x8>; | ||
149 | }; | ||
150 | |||
151 | sdhc@1500 { | ||
152 | compatible = "fsl,mpc5121-sdhc"; | ||
153 | reg = <0x1500 0x100>; | ||
154 | interrupts = <8 0x8>; | ||
155 | }; | ||
156 | |||
157 | i2c@1700 { | ||
158 | #address-cells = <1>; | ||
159 | #size-cells = <0>; | ||
160 | compatible = "fsl,mpc5121-i2c", "fsl-i2c"; | ||
161 | reg = <0x1700 0x20>; | ||
162 | interrupts = <9 0x8>; | ||
163 | }; | ||
164 | |||
165 | i2c@1720 { | ||
166 | #address-cells = <1>; | ||
167 | #size-cells = <0>; | ||
168 | compatible = "fsl,mpc5121-i2c", "fsl-i2c"; | ||
169 | reg = <0x1720 0x20>; | ||
170 | interrupts = <10 0x8>; | ||
171 | }; | ||
172 | |||
173 | i2c@1740 { | ||
174 | #address-cells = <1>; | ||
175 | #size-cells = <0>; | ||
176 | compatible = "fsl,mpc5121-i2c", "fsl-i2c"; | ||
177 | reg = <0x1740 0x20>; | ||
178 | interrupts = <11 0x8>; | ||
179 | }; | ||
180 | |||
181 | i2ccontrol@1760 { | ||
182 | compatible = "fsl,mpc5121-i2c-ctrl"; | ||
183 | reg = <0x1760 0x8>; | ||
184 | }; | ||
185 | |||
186 | axe@2000 { | ||
187 | compatible = "fsl,mpc5121-axe"; | ||
188 | reg = <0x2000 0x100>; | ||
189 | interrupts = <42 0x8>; | ||
190 | }; | ||
191 | |||
192 | display@2100 { | ||
193 | compatible = "fsl,mpc5121-diu"; | ||
194 | reg = <0x2100 0x100>; | ||
195 | interrupts = <64 0x8>; | ||
196 | }; | ||
197 | |||
198 | can@2300 { | ||
199 | compatible = "fsl,mpc5121-mscan"; | ||
200 | reg = <0x2300 0x80>; | ||
201 | interrupts = <90 0x8>; | ||
202 | }; | ||
203 | |||
204 | can@2380 { | ||
205 | compatible = "fsl,mpc5121-mscan"; | ||
206 | reg = <0x2380 0x80>; | ||
207 | interrupts = <91 0x8>; | ||
208 | }; | ||
209 | |||
210 | viu@2400 { | ||
211 | compatible = "fsl,mpc5121-viu"; | ||
212 | reg = <0x2400 0x400>; | ||
213 | interrupts = <67 0x8>; | ||
214 | }; | ||
215 | |||
216 | mdio@2800 { | ||
217 | compatible = "fsl,mpc5121-fec-mdio"; | ||
218 | reg = <0x2800 0x800>; | ||
219 | #address-cells = <1>; | ||
220 | #size-cells = <0>; | ||
221 | }; | ||
222 | |||
223 | eth0: ethernet@2800 { | ||
224 | device_type = "network"; | ||
225 | compatible = "fsl,mpc5121-fec"; | ||
226 | reg = <0x2800 0x800>; | ||
227 | local-mac-address = [ 00 00 00 00 00 00 ]; | ||
228 | interrupts = <4 0x8>; | ||
229 | }; | ||
230 | |||
231 | /* USB1 using external ULPI PHY */ | ||
232 | usb@3000 { | ||
233 | compatible = "fsl,mpc5121-usb2-dr"; | ||
234 | reg = <0x3000 0x600>; | ||
235 | #address-cells = <1>; | ||
236 | #size-cells = <0>; | ||
237 | interrupts = <43 0x8>; | ||
238 | dr_mode = "otg"; | ||
239 | phy_type = "ulpi"; | ||
240 | }; | ||
241 | |||
242 | /* USB0 using internal UTMI PHY */ | ||
243 | usb@4000 { | ||
244 | compatible = "fsl,mpc5121-usb2-dr"; | ||
245 | reg = <0x4000 0x600>; | ||
246 | #address-cells = <1>; | ||
247 | #size-cells = <0>; | ||
248 | interrupts = <44 0x8>; | ||
249 | dr_mode = "otg"; | ||
250 | phy_type = "utmi_wide"; | ||
251 | }; | ||
252 | |||
253 | /* IO control */ | ||
254 | ioctl@a000 { | ||
255 | compatible = "fsl,mpc5121-ioctl"; | ||
256 | reg = <0xA000 0x1000>; | ||
257 | }; | ||
258 | |||
259 | /* LocalPlus controller */ | ||
260 | lpc@10000 { | ||
261 | compatible = "fsl,mpc5121-lpc"; | ||
262 | reg = <0x10000 0x200>; | ||
263 | }; | ||
264 | |||
265 | pata@10200 { | ||
266 | compatible = "fsl,mpc5121-pata"; | ||
267 | reg = <0x10200 0x100>; | ||
268 | interrupts = <5 0x8>; | ||
269 | }; | ||
270 | |||
271 | /* 512x PSCs are not 52xx PSC compatible */ | ||
272 | |||
273 | /* PSC0 */ | ||
274 | psc@11000 { | ||
275 | compatible = "fsl,mpc5121-psc"; | ||
276 | reg = <0x11000 0x100>; | ||
277 | interrupts = <40 0x8>; | ||
278 | fsl,rx-fifo-size = <16>; | ||
279 | fsl,tx-fifo-size = <16>; | ||
280 | }; | ||
281 | |||
282 | /* PSC1 */ | ||
283 | psc@11100 { | ||
284 | compatible = "fsl,mpc5121-psc"; | ||
285 | reg = <0x11100 0x100>; | ||
286 | interrupts = <40 0x8>; | ||
287 | fsl,rx-fifo-size = <16>; | ||
288 | fsl,tx-fifo-size = <16>; | ||
289 | }; | ||
290 | |||
291 | /* PSC2 */ | ||
292 | psc@11200 { | ||
293 | compatible = "fsl,mpc5121-psc"; | ||
294 | reg = <0x11200 0x100>; | ||
295 | interrupts = <40 0x8>; | ||
296 | fsl,rx-fifo-size = <16>; | ||
297 | fsl,tx-fifo-size = <16>; | ||
298 | }; | ||
299 | |||
300 | /* PSC3 */ | ||
301 | psc@11300 { | ||
302 | compatible = "fsl,mpc5121-psc-uart", "fsl,mpc5121-psc"; | ||
303 | reg = <0x11300 0x100>; | ||
304 | interrupts = <40 0x8>; | ||
305 | fsl,rx-fifo-size = <16>; | ||
306 | fsl,tx-fifo-size = <16>; | ||
307 | }; | ||
308 | |||
309 | /* PSC4 */ | ||
310 | psc@11400 { | ||
311 | compatible = "fsl,mpc5121-psc-uart", "fsl,mpc5121-psc"; | ||
312 | reg = <0x11400 0x100>; | ||
313 | interrupts = <40 0x8>; | ||
314 | fsl,rx-fifo-size = <16>; | ||
315 | fsl,tx-fifo-size = <16>; | ||
316 | }; | ||
317 | |||
318 | /* PSC5 */ | ||
319 | psc@11500 { | ||
320 | compatible = "fsl,mpc5121-psc"; | ||
321 | reg = <0x11500 0x100>; | ||
322 | interrupts = <40 0x8>; | ||
323 | fsl,rx-fifo-size = <16>; | ||
324 | fsl,tx-fifo-size = <16>; | ||
325 | }; | ||
326 | |||
327 | /* PSC6 */ | ||
328 | psc@11600 { | ||
329 | compatible = "fsl,mpc5121-psc"; | ||
330 | reg = <0x11600 0x100>; | ||
331 | interrupts = <40 0x8>; | ||
332 | fsl,rx-fifo-size = <16>; | ||
333 | fsl,tx-fifo-size = <16>; | ||
334 | }; | ||
335 | |||
336 | /* PSC7 */ | ||
337 | psc@11700 { | ||
338 | compatible = "fsl,mpc5121-psc"; | ||
339 | reg = <0x11700 0x100>; | ||
340 | interrupts = <40 0x8>; | ||
341 | fsl,rx-fifo-size = <16>; | ||
342 | fsl,tx-fifo-size = <16>; | ||
343 | }; | ||
344 | |||
345 | /* PSC8 */ | ||
346 | psc@11800 { | ||
347 | compatible = "fsl,mpc5121-psc"; | ||
348 | reg = <0x11800 0x100>; | ||
349 | interrupts = <40 0x8>; | ||
350 | fsl,rx-fifo-size = <16>; | ||
351 | fsl,tx-fifo-size = <16>; | ||
352 | }; | ||
353 | |||
354 | /* PSC9 */ | ||
355 | psc@11900 { | ||
356 | compatible = "fsl,mpc5121-psc"; | ||
357 | reg = <0x11900 0x100>; | ||
358 | interrupts = <40 0x8>; | ||
359 | fsl,rx-fifo-size = <16>; | ||
360 | fsl,tx-fifo-size = <16>; | ||
361 | }; | ||
362 | |||
363 | /* PSC10 */ | ||
364 | psc@11a00 { | ||
365 | compatible = "fsl,mpc5121-psc"; | ||
366 | reg = <0x11a00 0x100>; | ||
367 | interrupts = <40 0x8>; | ||
368 | fsl,rx-fifo-size = <16>; | ||
369 | fsl,tx-fifo-size = <16>; | ||
370 | }; | ||
371 | |||
372 | /* PSC11 */ | ||
373 | psc@11b00 { | ||
374 | compatible = "fsl,mpc5121-psc"; | ||
375 | reg = <0x11b00 0x100>; | ||
376 | interrupts = <40 0x8>; | ||
377 | fsl,rx-fifo-size = <16>; | ||
378 | fsl,tx-fifo-size = <16>; | ||
379 | }; | ||
380 | |||
381 | pscfifo@11f00 { | ||
382 | compatible = "fsl,mpc5121-psc-fifo"; | ||
383 | reg = <0x11f00 0x100>; | ||
384 | interrupts = <40 0x8>; | ||
385 | }; | ||
386 | |||
387 | dma@14000 { | ||
388 | compatible = "fsl,mpc5121-dma"; | ||
389 | reg = <0x14000 0x1800>; | ||
390 | interrupts = <65 0x8>; | ||
391 | }; | ||
392 | }; | ||
393 | |||
394 | pci: pci@80008500 { | ||
395 | compatible = "fsl,mpc5121-pci"; | ||
396 | device_type = "pci"; | ||
397 | interrupts = <1 0x8>; | ||
398 | clock-frequency = <0>; | ||
399 | #address-cells = <3>; | ||
400 | #size-cells = <2>; | ||
401 | #interrupt-cells = <1>; | ||
402 | |||
403 | reg = <0x80008500 0x100 /* internal registers */ | ||
404 | 0x80008300 0x8>; /* config space access registers */ | ||
405 | bus-range = <0x0 0x0>; | ||
406 | ranges = <0x42000000 0x0 0xa0000000 0xa0000000 0x0 0x10000000 | ||
407 | 0x02000000 0x0 0xb0000000 0xb0000000 0x0 0x10000000 | ||
408 | 0x01000000 0x0 0x00000000 0x84000000 0x0 0x01000000>; | ||
409 | }; | ||
410 | }; | ||
diff --git a/arch/powerpc/boot/dts/mpc5121ads.dts b/arch/powerpc/boot/dts/mpc5121ads.dts index c9ef6bbe26cf..f269b1382ef7 100644 --- a/arch/powerpc/boot/dts/mpc5121ads.dts +++ b/arch/powerpc/boot/dts/mpc5121ads.dts | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * MPC5121E ADS Device Tree Source | 2 | * MPC5121E ADS Device Tree Source |
3 | * | 3 | * |
4 | * Copyright 2007,2008 Freescale Semiconductor Inc. | 4 | * Copyright 2007-2008 Freescale Semiconductor Inc. |
5 | * | 5 | * |
6 | * This program is free software; you can redistribute it and/or modify it | 6 | * This program is free software; you can redistribute it and/or modify it |
7 | * under the terms of the GNU General Public License as published by the | 7 | * under the terms of the GNU General Public License as published by the |
@@ -9,74 +9,26 @@ | |||
9 | * option) any later version. | 9 | * option) any later version. |
10 | */ | 10 | */ |
11 | 11 | ||
12 | /dts-v1/; | 12 | /include/ "mpc5121.dtsi" |
13 | 13 | ||
14 | / { | 14 | / { |
15 | model = "mpc5121ads"; | 15 | model = "mpc5121ads"; |
16 | compatible = "fsl,mpc5121ads"; | 16 | compatible = "fsl,mpc5121ads"; |
17 | #address-cells = <1>; | ||
18 | #size-cells = <1>; | ||
19 | |||
20 | aliases { | ||
21 | pci = &pci; | ||
22 | }; | ||
23 | |||
24 | cpus { | ||
25 | #address-cells = <1>; | ||
26 | #size-cells = <0>; | ||
27 | |||
28 | PowerPC,5121@0 { | ||
29 | device_type = "cpu"; | ||
30 | reg = <0>; | ||
31 | d-cache-line-size = <0x20>; // 32 bytes | ||
32 | i-cache-line-size = <0x20>; // 32 bytes | ||
33 | d-cache-size = <0x8000>; // L1, 32K | ||
34 | i-cache-size = <0x8000>; // L1, 32K | ||
35 | timebase-frequency = <49500000>;// 49.5 MHz (csb/4) | ||
36 | bus-frequency = <198000000>; // 198 MHz csb bus | ||
37 | clock-frequency = <396000000>; // 396 MHz ppc core | ||
38 | }; | ||
39 | }; | ||
40 | |||
41 | memory { | ||
42 | device_type = "memory"; | ||
43 | reg = <0x00000000 0x10000000>; // 256MB at 0 | ||
44 | }; | ||
45 | |||
46 | mbx@20000000 { | ||
47 | compatible = "fsl,mpc5121-mbx"; | ||
48 | reg = <0x20000000 0x4000>; | ||
49 | interrupts = <66 0x8>; | ||
50 | interrupt-parent = < &ipic >; | ||
51 | }; | ||
52 | |||
53 | sram@30000000 { | ||
54 | compatible = "fsl,mpc5121-sram"; | ||
55 | reg = <0x30000000 0x20000>; // 128K at 0x30000000 | ||
56 | }; | ||
57 | 17 | ||
58 | nfc@40000000 { | 18 | nfc@40000000 { |
59 | compatible = "fsl,mpc5121-nfc"; | 19 | /* |
60 | reg = <0x40000000 0x100000>; // 1M at 0x40000000 | 20 | * ADS has two Hynix 512MB Nand flash chips in a single |
61 | interrupts = <6 8>; | 21 | * stacked package. |
62 | interrupt-parent = < &ipic >; | 22 | */ |
63 | #address-cells = <1>; | ||
64 | #size-cells = <1>; | ||
65 | // ADS has two Hynix 512MB Nand flash chips in a single | ||
66 | // stacked package. | ||
67 | chips = <2>; | 23 | chips = <2>; |
24 | |||
68 | nand@0 { | 25 | nand@0 { |
69 | label = "nand"; | 26 | label = "nand"; |
70 | reg = <0x00000000 0x40000000>; // 512MB + 512MB | 27 | reg = <0x00000000 0x40000000>; /* 512MB + 512MB */ |
71 | }; | 28 | }; |
72 | }; | 29 | }; |
73 | 30 | ||
74 | localbus@80000020 { | 31 | localbus@80000020 { |
75 | compatible = "fsl,mpc5121-localbus"; | ||
76 | #address-cells = <2>; | ||
77 | #size-cells = <1>; | ||
78 | reg = <0x80000020 0x40>; | ||
79 | |||
80 | ranges = <0x0 0x0 0xfc000000 0x04000000 | 32 | ranges = <0x0 0x0 0xfc000000 0x04000000 |
81 | 0x2 0x0 0x82000000 0x00008000>; | 33 | 0x2 0x0 0x82000000 0x00008000>; |
82 | 34 | ||
@@ -87,6 +39,7 @@ | |||
87 | #size-cells = <1>; | 39 | #size-cells = <1>; |
88 | bank-width = <4>; | 40 | bank-width = <4>; |
89 | device-width = <2>; | 41 | device-width = <2>; |
42 | |||
90 | protected@0 { | 43 | protected@0 { |
91 | label = "protected"; | 44 | label = "protected"; |
92 | reg = <0x00000000 0x00040000>; // first sector is protected | 45 | reg = <0x00000000 0x00040000>; // first sector is protected |
@@ -121,91 +74,18 @@ | |||
121 | interrupt-controller; | 74 | interrupt-controller; |
122 | #interrupt-cells = <2>; | 75 | #interrupt-cells = <2>; |
123 | reg = <0x2 0xa 0x5>; | 76 | reg = <0x2 0xa 0x5>; |
124 | interrupt-parent = < &ipic >; | 77 | /* irq routing: |
125 | // irq routing | 78 | * all irqs but touch screen are routed to irq0 (ipic 48) |
126 | // all irqs but touch screen are routed to irq0 (ipic 48) | 79 | * touch screen is statically routed to irq1 (ipic 17) |
127 | // touch screen is statically routed to irq1 (ipic 17) | 80 | * so don't use it here |
128 | // so don't use it here | 81 | */ |
129 | interrupts = <48 0x8>; | 82 | interrupts = <48 0x8>; |
130 | }; | 83 | }; |
131 | }; | 84 | }; |
132 | 85 | ||
133 | soc@80000000 { | 86 | soc@80000000 { |
134 | compatible = "fsl,mpc5121-immr"; | ||
135 | #address-cells = <1>; | ||
136 | #size-cells = <1>; | ||
137 | #interrupt-cells = <2>; | ||
138 | ranges = <0x0 0x80000000 0x400000>; | ||
139 | reg = <0x80000000 0x400000>; | ||
140 | bus-frequency = <66000000>; // 66 MHz ips bus | ||
141 | |||
142 | |||
143 | // IPIC | ||
144 | // interrupts cell = <intr #, sense> | ||
145 | // sense values match linux IORESOURCE_IRQ_* defines: | ||
146 | // sense == 8: Level, low assertion | ||
147 | // sense == 2: Edge, high-to-low change | ||
148 | // | ||
149 | ipic: interrupt-controller@c00 { | ||
150 | compatible = "fsl,mpc5121-ipic", "fsl,ipic"; | ||
151 | interrupt-controller; | ||
152 | #address-cells = <0>; | ||
153 | #interrupt-cells = <2>; | ||
154 | reg = <0xc00 0x100>; | ||
155 | }; | ||
156 | |||
157 | rtc@a00 { // Real time clock | ||
158 | compatible = "fsl,mpc5121-rtc"; | ||
159 | reg = <0xa00 0x100>; | ||
160 | interrupts = <79 0x8 80 0x8>; | ||
161 | interrupt-parent = < &ipic >; | ||
162 | }; | ||
163 | |||
164 | reset@e00 { // Reset module | ||
165 | compatible = "fsl,mpc5121-reset"; | ||
166 | reg = <0xe00 0x100>; | ||
167 | }; | ||
168 | |||
169 | clock@f00 { // Clock control | ||
170 | compatible = "fsl,mpc5121-clock"; | ||
171 | reg = <0xf00 0x100>; | ||
172 | }; | ||
173 | |||
174 | pmc@1000{ //Power Management Controller | ||
175 | compatible = "fsl,mpc5121-pmc"; | ||
176 | reg = <0x1000 0x100>; | ||
177 | interrupts = <83 0x2>; | ||
178 | interrupt-parent = < &ipic >; | ||
179 | }; | ||
180 | |||
181 | gpio@1100 { | ||
182 | compatible = "fsl,mpc5121-gpio"; | ||
183 | reg = <0x1100 0x100>; | ||
184 | interrupts = <78 0x8>; | ||
185 | interrupt-parent = < &ipic >; | ||
186 | }; | ||
187 | |||
188 | can@1300 { | ||
189 | compatible = "fsl,mpc5121-mscan"; | ||
190 | interrupts = <12 0x8>; | ||
191 | interrupt-parent = < &ipic >; | ||
192 | reg = <0x1300 0x80>; | ||
193 | }; | ||
194 | |||
195 | can@1380 { | ||
196 | compatible = "fsl,mpc5121-mscan"; | ||
197 | interrupts = <13 0x8>; | ||
198 | interrupt-parent = < &ipic >; | ||
199 | reg = <0x1380 0x80>; | ||
200 | }; | ||
201 | 87 | ||
202 | i2c@1700 { | 88 | i2c@1700 { |
203 | #address-cells = <1>; | ||
204 | #size-cells = <0>; | ||
205 | compatible = "fsl,mpc5121-i2c", "fsl-i2c"; | ||
206 | reg = <0x1700 0x20>; | ||
207 | interrupts = <9 0x8>; | ||
208 | interrupt-parent = < &ipic >; | ||
209 | fsl,preserve-clocking; | 89 | fsl,preserve-clocking; |
210 | 90 | ||
211 | hwmon@4a { | 91 | hwmon@4a { |
@@ -224,196 +104,75 @@ | |||
224 | }; | 104 | }; |
225 | }; | 105 | }; |
226 | 106 | ||
227 | i2c@1720 { | 107 | eth0: ethernet@2800 { |
228 | #address-cells = <1>; | 108 | phy-handle = <&phy0>; |
229 | #size-cells = <0>; | ||
230 | compatible = "fsl,mpc5121-i2c", "fsl-i2c"; | ||
231 | reg = <0x1720 0x20>; | ||
232 | interrupts = <10 0x8>; | ||
233 | interrupt-parent = < &ipic >; | ||
234 | }; | ||
235 | |||
236 | i2c@1740 { | ||
237 | #address-cells = <1>; | ||
238 | #size-cells = <0>; | ||
239 | compatible = "fsl,mpc5121-i2c", "fsl-i2c"; | ||
240 | reg = <0x1740 0x20>; | ||
241 | interrupts = <11 0x8>; | ||
242 | interrupt-parent = < &ipic >; | ||
243 | }; | 109 | }; |
244 | 110 | ||
245 | i2ccontrol@1760 { | 111 | can@2300 { |
246 | compatible = "fsl,mpc5121-i2c-ctrl"; | 112 | status = "disabled"; |
247 | reg = <0x1760 0x8>; | ||
248 | }; | 113 | }; |
249 | 114 | ||
250 | axe@2000 { | 115 | can@2380 { |
251 | compatible = "fsl,mpc5121-axe"; | 116 | status = "disabled"; |
252 | reg = <0x2000 0x100>; | ||
253 | interrupts = <42 0x8>; | ||
254 | interrupt-parent = < &ipic >; | ||
255 | }; | 117 | }; |
256 | 118 | ||
257 | display@2100 { | 119 | viu@2400 { |
258 | compatible = "fsl,mpc5121-diu"; | 120 | status = "disabled"; |
259 | reg = <0x2100 0x100>; | ||
260 | interrupts = <64 0x8>; | ||
261 | interrupt-parent = < &ipic >; | ||
262 | }; | 121 | }; |
263 | 122 | ||
264 | mdio@2800 { | 123 | mdio@2800 { |
265 | compatible = "fsl,mpc5121-fec-mdio"; | 124 | phy0: ethernet-phy@0 { |
266 | reg = <0x2800 0x800>; | ||
267 | #address-cells = <1>; | ||
268 | #size-cells = <0>; | ||
269 | phy: ethernet-phy@0 { | ||
270 | reg = <1>; | 125 | reg = <1>; |
271 | device_type = "ethernet-phy"; | ||
272 | }; | 126 | }; |
273 | }; | 127 | }; |
274 | 128 | ||
275 | ethernet@2800 { | 129 | /* mpc5121ads only uses USB0 */ |
276 | device_type = "network"; | 130 | usb@3000 { |
277 | compatible = "fsl,mpc5121-fec"; | 131 | status = "disabled"; |
278 | reg = <0x2800 0x800>; | ||
279 | local-mac-address = [ 00 00 00 00 00 00 ]; | ||
280 | interrupts = <4 0x8>; | ||
281 | interrupt-parent = < &ipic >; | ||
282 | phy-handle = < &phy >; | ||
283 | fsl,align-tx-packets = <4>; | ||
284 | }; | 132 | }; |
285 | 133 | ||
286 | // 5121e has two dr usb modules | 134 | /* USB0 using internal UTMI PHY */ |
287 | // mpc5121_ads only uses USB0 | ||
288 | |||
289 | // USB1 using external ULPI PHY | ||
290 | //usb@3000 { | ||
291 | // compatible = "fsl,mpc5121-usb2-dr"; | ||
292 | // reg = <0x3000 0x1000>; | ||
293 | // #address-cells = <1>; | ||
294 | // #size-cells = <0>; | ||
295 | // interrupt-parent = < &ipic >; | ||
296 | // interrupts = <43 0x8>; | ||
297 | // dr_mode = "otg"; | ||
298 | // phy_type = "ulpi"; | ||
299 | //}; | ||
300 | |||
301 | // USB0 using internal UTMI PHY | ||
302 | usb@4000 { | 135 | usb@4000 { |
303 | compatible = "fsl,mpc5121-usb2-dr"; | 136 | dr_mode = "host"; |
304 | reg = <0x4000 0x1000>; | ||
305 | #address-cells = <1>; | ||
306 | #size-cells = <0>; | ||
307 | interrupt-parent = < &ipic >; | ||
308 | interrupts = <44 0x8>; | ||
309 | dr_mode = "otg"; | ||
310 | phy_type = "utmi_wide"; | ||
311 | fsl,invert-drvvbus; | 137 | fsl,invert-drvvbus; |
312 | fsl,invert-pwr-fault; | 138 | fsl,invert-pwr-fault; |
313 | }; | 139 | }; |
314 | 140 | ||
315 | // IO control | 141 | /* PSC3 serial port A aka ttyPSC0 */ |
316 | ioctl@a000 { | 142 | psc@11300 { |
317 | compatible = "fsl,mpc5121-ioctl"; | ||
318 | reg = <0xA000 0x1000>; | ||
319 | }; | ||
320 | |||
321 | pata@10200 { | ||
322 | compatible = "fsl,mpc5121-pata"; | ||
323 | reg = <0x10200 0x100>; | ||
324 | interrupts = <5 0x8>; | ||
325 | interrupt-parent = < &ipic >; | ||
326 | }; | ||
327 | |||
328 | // 512x PSCs are not 52xx PSC compatible | ||
329 | // PSC3 serial port A aka ttyPSC0 | ||
330 | serial@11300 { | ||
331 | device_type = "serial"; | ||
332 | compatible = "fsl,mpc5121-psc-uart", "fsl,mpc5121-psc"; | 143 | compatible = "fsl,mpc5121-psc-uart", "fsl,mpc5121-psc"; |
333 | // Logical port assignment needed until driver | ||
334 | // learns to use aliases | ||
335 | port-number = <0>; | ||
336 | cell-index = <3>; | ||
337 | reg = <0x11300 0x100>; | ||
338 | interrupts = <40 0x8>; | ||
339 | interrupt-parent = < &ipic >; | ||
340 | rx-fifo-size = <16>; | ||
341 | tx-fifo-size = <16>; | ||
342 | }; | 144 | }; |
343 | 145 | ||
344 | // PSC4 serial port B aka ttyPSC1 | 146 | /* PSC4 serial port B aka ttyPSC1 */ |
345 | serial@11400 { | 147 | psc@11400 { |
346 | device_type = "serial"; | ||
347 | compatible = "fsl,mpc5121-psc-uart", "fsl,mpc5121-psc"; | 148 | compatible = "fsl,mpc5121-psc-uart", "fsl,mpc5121-psc"; |
348 | // Logical port assignment needed until driver | ||
349 | // learns to use aliases | ||
350 | port-number = <1>; | ||
351 | cell-index = <4>; | ||
352 | reg = <0x11400 0x100>; | ||
353 | interrupts = <40 0x8>; | ||
354 | interrupt-parent = < &ipic >; | ||
355 | rx-fifo-size = <16>; | ||
356 | tx-fifo-size = <16>; | ||
357 | }; | 149 | }; |
358 | 150 | ||
359 | // PSC5 in ac97 mode | 151 | /* PSC5 in ac97 mode */ |
360 | ac97@11500 { | 152 | ac97: psc@11500 { |
361 | compatible = "fsl,mpc5121-psc-ac97", "fsl,mpc5121-psc"; | 153 | compatible = "fsl,mpc5121-psc-ac97", "fsl,mpc5121-psc"; |
362 | cell-index = <5>; | ||
363 | reg = <0x11500 0x100>; | ||
364 | interrupts = <40 0x8>; | ||
365 | interrupt-parent = < &ipic >; | ||
366 | fsl,mode = "ac97-slave"; | 154 | fsl,mode = "ac97-slave"; |
367 | rx-fifo-size = <384>; | 155 | fsl,rx-fifo-size = <384>; |
368 | tx-fifo-size = <384>; | 156 | fsl,tx-fifo-size = <384>; |
369 | }; | ||
370 | |||
371 | pscfifo@11f00 { | ||
372 | compatible = "fsl,mpc5121-psc-fifo"; | ||
373 | reg = <0x11f00 0x100>; | ||
374 | interrupts = <40 0x8>; | ||
375 | interrupt-parent = < &ipic >; | ||
376 | }; | 157 | }; |
377 | |||
378 | dma@14000 { | ||
379 | compatible = "fsl,mpc5121-dma"; | ||
380 | reg = <0x14000 0x1800>; | ||
381 | interrupts = <65 0x8>; | ||
382 | interrupt-parent = < &ipic >; | ||
383 | }; | ||
384 | |||
385 | }; | 158 | }; |
386 | 159 | ||
387 | pci: pci@80008500 { | 160 | pci: pci@80008500 { |
388 | interrupt-map-mask = <0xf800 0x0 0x0 0x7>; | 161 | interrupt-map-mask = <0xf800 0x0 0x0 0x7>; |
389 | interrupt-map = < | 162 | interrupt-map = < |
390 | // IDSEL 0x15 - Slot 1 PCI | 163 | /* IDSEL 0x15 - Slot 1 PCI */ |
391 | 0xa800 0x0 0x0 0x1 &cpld_pic 0x0 0x8 | 164 | 0xa800 0x0 0x0 0x1 &cpld_pic 0x0 0x8 |
392 | 0xa800 0x0 0x0 0x2 &cpld_pic 0x1 0x8 | 165 | 0xa800 0x0 0x0 0x2 &cpld_pic 0x1 0x8 |
393 | 0xa800 0x0 0x0 0x3 &cpld_pic 0x2 0x8 | 166 | 0xa800 0x0 0x0 0x3 &cpld_pic 0x2 0x8 |
394 | 0xa800 0x0 0x0 0x4 &cpld_pic 0x3 0x8 | 167 | 0xa800 0x0 0x0 0x4 &cpld_pic 0x3 0x8 |
395 | 168 | ||
396 | // IDSEL 0x16 - Slot 2 MiniPCI | 169 | /* IDSEL 0x16 - Slot 2 MiniPCI */ |
397 | 0xb000 0x0 0x0 0x1 &cpld_pic 0x4 0x8 | 170 | 0xb000 0x0 0x0 0x1 &cpld_pic 0x4 0x8 |
398 | 0xb000 0x0 0x0 0x2 &cpld_pic 0x5 0x8 | 171 | 0xb000 0x0 0x0 0x2 &cpld_pic 0x5 0x8 |
399 | 172 | ||
400 | // IDSEL 0x17 - Slot 3 MiniPCI | 173 | /* IDSEL 0x17 - Slot 3 MiniPCI */ |
401 | 0xb800 0x0 0x0 0x1 &cpld_pic 0x6 0x8 | 174 | 0xb800 0x0 0x0 0x1 &cpld_pic 0x6 0x8 |
402 | 0xb800 0x0 0x0 0x2 &cpld_pic 0x7 0x8 | 175 | 0xb800 0x0 0x0 0x2 &cpld_pic 0x7 0x8 |
403 | >; | 176 | >; |
404 | interrupt-parent = < &ipic >; | ||
405 | interrupts = <1 0x8>; | ||
406 | bus-range = <0 0>; | ||
407 | ranges = <0x42000000 0x0 0xa0000000 0xa0000000 0x0 0x10000000 | ||
408 | 0x02000000 0x0 0xb0000000 0xb0000000 0x0 0x10000000 | ||
409 | 0x01000000 0x0 0x00000000 0x84000000 0x0 0x01000000>; | ||
410 | clock-frequency = <0>; | ||
411 | #interrupt-cells = <1>; | ||
412 | #size-cells = <2>; | ||
413 | #address-cells = <3>; | ||
414 | reg = <0x80008500 0x100 /* internal registers */ | ||
415 | 0x80008300 0x8>; /* config space access registers */ | ||
416 | compatible = "fsl,mpc5121-pci"; | ||
417 | device_type = "pci"; | ||
418 | }; | 177 | }; |
419 | }; | 178 | }; |
diff --git a/arch/powerpc/boot/dts/mpc5200b.dtsi b/arch/powerpc/boot/dts/mpc5200b.dtsi index 39ed65a44c5f..969b2200b2f9 100644 --- a/arch/powerpc/boot/dts/mpc5200b.dtsi +++ b/arch/powerpc/boot/dts/mpc5200b.dtsi | |||
@@ -64,50 +64,59 @@ | |||
64 | reg = <0x500 0x80>; | 64 | reg = <0x500 0x80>; |
65 | }; | 65 | }; |
66 | 66 | ||
67 | timer@600 { // General Purpose Timer | 67 | gpt0: timer@600 { // General Purpose Timer |
68 | compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; | 68 | compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; |
69 | #gpio-cells = <2>; // Add 'gpio-controller;' to enable gpio mode | ||
69 | reg = <0x600 0x10>; | 70 | reg = <0x600 0x10>; |
70 | interrupts = <1 9 0>; | 71 | interrupts = <1 9 0>; |
72 | // add 'fsl,has-wdt' to enable watchdog | ||
71 | }; | 73 | }; |
72 | 74 | ||
73 | timer@610 { // General Purpose Timer | 75 | gpt1: timer@610 { // General Purpose Timer |
74 | compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; | 76 | compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; |
77 | #gpio-cells = <2>; // Add 'gpio-controller;' to enable gpio mode | ||
75 | reg = <0x610 0x10>; | 78 | reg = <0x610 0x10>; |
76 | interrupts = <1 10 0>; | 79 | interrupts = <1 10 0>; |
77 | }; | 80 | }; |
78 | 81 | ||
79 | timer@620 { // General Purpose Timer | 82 | gpt2: timer@620 { // General Purpose Timer |
80 | compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; | 83 | compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; |
84 | #gpio-cells = <2>; // Add 'gpio-controller;' to enable gpio mode | ||
81 | reg = <0x620 0x10>; | 85 | reg = <0x620 0x10>; |
82 | interrupts = <1 11 0>; | 86 | interrupts = <1 11 0>; |
83 | }; | 87 | }; |
84 | 88 | ||
85 | timer@630 { // General Purpose Timer | 89 | gpt3: timer@630 { // General Purpose Timer |
86 | compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; | 90 | compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; |
91 | #gpio-cells = <2>; // Add 'gpio-controller;' to enable gpio mode | ||
87 | reg = <0x630 0x10>; | 92 | reg = <0x630 0x10>; |
88 | interrupts = <1 12 0>; | 93 | interrupts = <1 12 0>; |
89 | }; | 94 | }; |
90 | 95 | ||
91 | timer@640 { // General Purpose Timer | 96 | gpt4: timer@640 { // General Purpose Timer |
92 | compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; | 97 | compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; |
98 | #gpio-cells = <2>; // Add 'gpio-controller;' to enable gpio mode | ||
93 | reg = <0x640 0x10>; | 99 | reg = <0x640 0x10>; |
94 | interrupts = <1 13 0>; | 100 | interrupts = <1 13 0>; |
95 | }; | 101 | }; |
96 | 102 | ||
97 | timer@650 { // General Purpose Timer | 103 | gpt5: timer@650 { // General Purpose Timer |
98 | compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; | 104 | compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; |
105 | #gpio-cells = <2>; // Add 'gpio-controller;' to enable gpio mode | ||
99 | reg = <0x650 0x10>; | 106 | reg = <0x650 0x10>; |
100 | interrupts = <1 14 0>; | 107 | interrupts = <1 14 0>; |
101 | }; | 108 | }; |
102 | 109 | ||
103 | timer@660 { // General Purpose Timer | 110 | gpt6: timer@660 { // General Purpose Timer |
104 | compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; | 111 | compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; |
112 | #gpio-cells = <2>; // Add 'gpio-controller;' to enable gpio mode | ||
105 | reg = <0x660 0x10>; | 113 | reg = <0x660 0x10>; |
106 | interrupts = <1 15 0>; | 114 | interrupts = <1 15 0>; |
107 | }; | 115 | }; |
108 | 116 | ||
109 | timer@670 { // General Purpose Timer | 117 | gpt7: timer@670 { // General Purpose Timer |
110 | compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; | 118 | compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; |
119 | #gpio-cells = <2>; // Add 'gpio-controller;' to enable gpio mode | ||
111 | reg = <0x670 0x10>; | 120 | reg = <0x670 0x10>; |
112 | interrupts = <1 16 0>; | 121 | interrupts = <1 16 0>; |
113 | }; | 122 | }; |
diff --git a/arch/powerpc/boot/dts/mucmc52.dts b/arch/powerpc/boot/dts/mucmc52.dts index 21d34720fcc9..d3a792bb5c1a 100644 --- a/arch/powerpc/boot/dts/mucmc52.dts +++ b/arch/powerpc/boot/dts/mucmc52.dts | |||
@@ -13,47 +13,23 @@ | |||
13 | 13 | ||
14 | /include/ "mpc5200b.dtsi" | 14 | /include/ "mpc5200b.dtsi" |
15 | 15 | ||
16 | /* Timer pins that need to be in GPIO mode */ | ||
17 | &gpt0 { gpio-controller; }; | ||
18 | &gpt1 { gpio-controller; }; | ||
19 | &gpt2 { gpio-controller; }; | ||
20 | &gpt3 { gpio-controller; }; | ||
21 | |||
22 | /* Disabled timers */ | ||
23 | &gpt4 { status = "disabled"; }; | ||
24 | &gpt5 { status = "disabled"; }; | ||
25 | &gpt6 { status = "disabled"; }; | ||
26 | &gpt7 { status = "disabled"; }; | ||
27 | |||
16 | / { | 28 | / { |
17 | model = "manroland,mucmc52"; | 29 | model = "manroland,mucmc52"; |
18 | compatible = "manroland,mucmc52"; | 30 | compatible = "manroland,mucmc52"; |
19 | 31 | ||
20 | soc5200@f0000000 { | 32 | soc5200@f0000000 { |
21 | gpt0: timer@600 { // GPT 0 in GPIO mode | ||
22 | gpio-controller; | ||
23 | #gpio-cells = <2>; | ||
24 | }; | ||
25 | |||
26 | gpt1: timer@610 { // General Purpose Timer in GPIO mode | ||
27 | gpio-controller; | ||
28 | #gpio-cells = <2>; | ||
29 | }; | ||
30 | |||
31 | gpt2: timer@620 { // General Purpose Timer in GPIO mode | ||
32 | gpio-controller; | ||
33 | #gpio-cells = <2>; | ||
34 | }; | ||
35 | |||
36 | gpt3: timer@630 { // General Purpose Timer in GPIO mode | ||
37 | gpio-controller; | ||
38 | #gpio-cells = <2>; | ||
39 | }; | ||
40 | |||
41 | timer@640 { | ||
42 | status = "disabled"; | ||
43 | }; | ||
44 | |||
45 | timer@650 { | ||
46 | status = "disabled"; | ||
47 | }; | ||
48 | |||
49 | timer@660 { | ||
50 | status = "disabled"; | ||
51 | }; | ||
52 | |||
53 | timer@670 { | ||
54 | status = "disabled"; | ||
55 | }; | ||
56 | |||
57 | rtc@800 { | 33 | rtc@800 { |
58 | status = "disabled"; | 34 | status = "disabled"; |
59 | }; | 35 | }; |
diff --git a/arch/powerpc/boot/dts/o2d.dtsi b/arch/powerpc/boot/dts/o2d.dtsi index 24f668039295..cf073e693f24 100644 --- a/arch/powerpc/boot/dts/o2d.dtsi +++ b/arch/powerpc/boot/dts/o2d.dtsi | |||
@@ -12,6 +12,13 @@ | |||
12 | 12 | ||
13 | /include/ "mpc5200b.dtsi" | 13 | /include/ "mpc5200b.dtsi" |
14 | 14 | ||
15 | &gpt0 { | ||
16 | gpio-controller; | ||
17 | fsl,has-wdt; | ||
18 | fsl,wdt-on-boot = <0>; | ||
19 | }; | ||
20 | &gpt1 { gpio-controller; }; | ||
21 | |||
15 | / { | 22 | / { |
16 | model = "ifm,o2d"; | 23 | model = "ifm,o2d"; |
17 | compatible = "ifm,o2d"; | 24 | compatible = "ifm,o2d"; |
@@ -22,24 +29,6 @@ | |||
22 | 29 | ||
23 | soc5200@f0000000 { | 30 | soc5200@f0000000 { |
24 | 31 | ||
25 | gpio_simple: gpio@b00 { | ||
26 | }; | ||
27 | |||
28 | timer@600 { // General Purpose Timer | ||
29 | #gpio-cells = <2>; | ||
30 | gpio-controller; | ||
31 | fsl,has-wdt; | ||
32 | fsl,wdt-on-boot = <0>; | ||
33 | }; | ||
34 | |||
35 | timer@610 { | ||
36 | #gpio-cells = <2>; | ||
37 | gpio-controller; | ||
38 | }; | ||
39 | |||
40 | timer7: timer@670 { | ||
41 | }; | ||
42 | |||
43 | rtc@800 { | 32 | rtc@800 { |
44 | status = "disabled"; | 33 | status = "disabled"; |
45 | }; | 34 | }; |
@@ -118,7 +107,7 @@ | |||
118 | csi@3,0 { | 107 | csi@3,0 { |
119 | compatible = "ifm,o2d-csi"; | 108 | compatible = "ifm,o2d-csi"; |
120 | reg = <3 0 0x00100000>; | 109 | reg = <3 0 0x00100000>; |
121 | ifm,csi-clk-handle = <&timer7>; | 110 | ifm,csi-clk-handle = <&gpt7>; |
122 | gpios = <&gpio_simple 23 0 /* imag_capture */ | 111 | gpios = <&gpio_simple 23 0 /* imag_capture */ |
123 | &gpio_simple 26 0 /* imag_reset */ | 112 | &gpio_simple 26 0 /* imag_reset */ |
124 | &gpio_simple 29 0>; /* imag_master_en */ | 113 | &gpio_simple 29 0>; /* imag_master_en */ |
diff --git a/arch/powerpc/boot/dts/pcm030.dts b/arch/powerpc/boot/dts/pcm030.dts index 96512c058033..192e66af0001 100644 --- a/arch/powerpc/boot/dts/pcm030.dts +++ b/arch/powerpc/boot/dts/pcm030.dts | |||
@@ -14,51 +14,19 @@ | |||
14 | 14 | ||
15 | /include/ "mpc5200b.dtsi" | 15 | /include/ "mpc5200b.dtsi" |
16 | 16 | ||
17 | &gpt0 { fsl,has-wdt; }; | ||
18 | &gpt2 { gpio-controller; }; | ||
19 | &gpt3 { gpio-controller; }; | ||
20 | &gpt4 { gpio-controller; }; | ||
21 | &gpt5 { gpio-controller; }; | ||
22 | &gpt6 { gpio-controller; }; | ||
23 | &gpt7 { gpio-controller; }; | ||
24 | |||
17 | / { | 25 | / { |
18 | model = "phytec,pcm030"; | 26 | model = "phytec,pcm030"; |
19 | compatible = "phytec,pcm030"; | 27 | compatible = "phytec,pcm030"; |
20 | 28 | ||
21 | soc5200@f0000000 { | 29 | soc5200@f0000000 { |
22 | timer@600 { // General Purpose Timer | ||
23 | fsl,has-wdt; | ||
24 | }; | ||
25 | |||
26 | gpt2: timer@620 { // General Purpose Timer in GPIO mode | ||
27 | compatible = "fsl,mpc5200b-gpt-gpio","fsl,mpc5200-gpt-gpio"; | ||
28 | gpio-controller; | ||
29 | #gpio-cells = <2>; | ||
30 | }; | ||
31 | |||
32 | gpt3: timer@630 { // General Purpose Timer in GPIO mode | ||
33 | compatible = "fsl,mpc5200b-gpt-gpio","fsl,mpc5200-gpt-gpio"; | ||
34 | gpio-controller; | ||
35 | #gpio-cells = <2>; | ||
36 | }; | ||
37 | |||
38 | gpt4: timer@640 { // General Purpose Timer in GPIO mode | ||
39 | compatible = "fsl,mpc5200b-gpt-gpio","fsl,mpc5200-gpt-gpio"; | ||
40 | gpio-controller; | ||
41 | #gpio-cells = <2>; | ||
42 | }; | ||
43 | |||
44 | gpt5: timer@650 { // General Purpose Timer in GPIO mode | ||
45 | compatible = "fsl,mpc5200b-gpt-gpio","fsl,mpc5200-gpt-gpio"; | ||
46 | gpio-controller; | ||
47 | #gpio-cells = <2>; | ||
48 | }; | ||
49 | |||
50 | gpt6: timer@660 { // General Purpose Timer in GPIO mode | ||
51 | compatible = "fsl,mpc5200b-gpt-gpio","fsl,mpc5200-gpt-gpio"; | ||
52 | gpio-controller; | ||
53 | #gpio-cells = <2>; | ||
54 | }; | ||
55 | |||
56 | gpt7: timer@670 { // General Purpose Timer in GPIO mode | ||
57 | compatible = "fsl,mpc5200b-gpt-gpio","fsl,mpc5200-gpt-gpio"; | ||
58 | gpio-controller; | ||
59 | #gpio-cells = <2>; | ||
60 | }; | ||
61 | |||
62 | audioplatform: psc@2000 { /* PSC1 in ac97 mode */ | 30 | audioplatform: psc@2000 { /* PSC1 in ac97 mode */ |
63 | compatible = "mpc5200b-psc-ac97","fsl,mpc5200b-psc-ac97"; | 31 | compatible = "mpc5200b-psc-ac97","fsl,mpc5200b-psc-ac97"; |
64 | cell-index = <0>; | 32 | cell-index = <0>; |
diff --git a/arch/powerpc/boot/dts/pcm032.dts b/arch/powerpc/boot/dts/pcm032.dts index 1dd478bfff96..96b139bf50e9 100644 --- a/arch/powerpc/boot/dts/pcm032.dts +++ b/arch/powerpc/boot/dts/pcm032.dts | |||
@@ -14,6 +14,14 @@ | |||
14 | 14 | ||
15 | /include/ "mpc5200b.dtsi" | 15 | /include/ "mpc5200b.dtsi" |
16 | 16 | ||
17 | &gpt0 { fsl,has-wdt; }; | ||
18 | &gpt2 { gpio-controller; }; | ||
19 | &gpt3 { gpio-controller; }; | ||
20 | &gpt4 { gpio-controller; }; | ||
21 | &gpt5 { gpio-controller; }; | ||
22 | &gpt6 { gpio-controller; }; | ||
23 | &gpt7 { gpio-controller; }; | ||
24 | |||
17 | / { | 25 | / { |
18 | model = "phytec,pcm032"; | 26 | model = "phytec,pcm032"; |
19 | compatible = "phytec,pcm032"; | 27 | compatible = "phytec,pcm032"; |
@@ -23,43 +31,6 @@ | |||
23 | }; | 31 | }; |
24 | 32 | ||
25 | soc5200@f0000000 { | 33 | soc5200@f0000000 { |
26 | timer@600 { // General Purpose Timer | ||
27 | fsl,has-wdt; | ||
28 | }; | ||
29 | |||
30 | gpt2: timer@620 { // General Purpose Timer in GPIO mode | ||
31 | gpio-controller; | ||
32 | #gpio-cells = <2>; | ||
33 | }; | ||
34 | |||
35 | gpt3: timer@630 { // General Purpose Timer in GPIO mode | ||
36 | gpio-controller; | ||
37 | #gpio-cells = <2>; | ||
38 | }; | ||
39 | |||
40 | gpt4: timer@640 { // General Purpose Timer in GPIO mode | ||
41 | gpio-controller; | ||
42 | #gpio-cells = <2>; | ||
43 | }; | ||
44 | |||
45 | gpt5: timer@650 { // General Purpose Timer in GPIO mode | ||
46 | gpio-controller; | ||
47 | #gpio-cells = <2>; | ||
48 | }; | ||
49 | |||
50 | gpt6: timer@660 { // General Purpose Timer in GPIO mode | ||
51 | compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; | ||
52 | reg = <0x660 0x10>; | ||
53 | interrupts = <1 15 0>; | ||
54 | gpio-controller; | ||
55 | #gpio-cells = <2>; | ||
56 | }; | ||
57 | |||
58 | gpt7: timer@670 { // General Purpose Timer in GPIO mode | ||
59 | gpio-controller; | ||
60 | #gpio-cells = <2>; | ||
61 | }; | ||
62 | |||
63 | psc@2000 { /* PSC1 is ac97 */ | 34 | psc@2000 { /* PSC1 is ac97 */ |
64 | compatible = "fsl,mpc5200b-psc-ac97","fsl,mpc5200-psc-ac97"; | 35 | compatible = "fsl,mpc5200b-psc-ac97","fsl,mpc5200-psc-ac97"; |
65 | cell-index = <0>; | 36 | cell-index = <0>; |
diff --git a/arch/powerpc/boot/dts/pdm360ng.dts b/arch/powerpc/boot/dts/pdm360ng.dts index 94dfa5c9a7f9..0b069477838a 100644 --- a/arch/powerpc/boot/dts/pdm360ng.dts +++ b/arch/powerpc/boot/dts/pdm360ng.dts | |||
@@ -13,7 +13,7 @@ | |||
13 | * option) any later version. | 13 | * option) any later version. |
14 | */ | 14 | */ |
15 | 15 | ||
16 | /dts-v1/; | 16 | /include/ "mpc5121.dtsi" |
17 | 17 | ||
18 | / { | 18 | / { |
19 | model = "pdm360ng"; | 19 | model = "pdm360ng"; |
@@ -22,38 +22,12 @@ | |||
22 | #size-cells = <1>; | 22 | #size-cells = <1>; |
23 | interrupt-parent = <&ipic>; | 23 | interrupt-parent = <&ipic>; |
24 | 24 | ||
25 | aliases { | ||
26 | ethernet0 = ð0; | ||
27 | }; | ||
28 | |||
29 | cpus { | ||
30 | #address-cells = <1>; | ||
31 | #size-cells = <0>; | ||
32 | |||
33 | PowerPC,5121@0 { | ||
34 | device_type = "cpu"; | ||
35 | reg = <0>; | ||
36 | d-cache-line-size = <0x20>; // 32 bytes | ||
37 | i-cache-line-size = <0x20>; // 32 bytes | ||
38 | d-cache-size = <0x8000>; // L1, 32K | ||
39 | i-cache-size = <0x8000>; // L1, 32K | ||
40 | timebase-frequency = <49500000>;// 49.5 MHz (csb/4) | ||
41 | bus-frequency = <198000000>; // 198 MHz csb bus | ||
42 | clock-frequency = <396000000>; // 396 MHz ppc core | ||
43 | }; | ||
44 | }; | ||
45 | |||
46 | memory { | 25 | memory { |
47 | device_type = "memory"; | 26 | device_type = "memory"; |
48 | reg = <0x00000000 0x20000000>; // 512MB at 0 | 27 | reg = <0x00000000 0x20000000>; // 512MB at 0 |
49 | }; | 28 | }; |
50 | 29 | ||
51 | nfc@40000000 { | 30 | nfc@40000000 { |
52 | compatible = "fsl,mpc5121-nfc"; | ||
53 | reg = <0x40000000 0x100000>; | ||
54 | interrupts = <0x6 0x8>; | ||
55 | #address-cells = <0x1>; | ||
56 | #size-cells = <0x1>; | ||
57 | bank-width = <0x1>; | 31 | bank-width = <0x1>; |
58 | chips = <0x1>; | 32 | chips = <0x1>; |
59 | 33 | ||
@@ -63,17 +37,7 @@ | |||
63 | }; | 37 | }; |
64 | }; | 38 | }; |
65 | 39 | ||
66 | sram@50000000 { | ||
67 | compatible = "fsl,mpc5121-sram"; | ||
68 | reg = <0x50000000 0x20000>; // 128K at 0x50000000 | ||
69 | }; | ||
70 | |||
71 | localbus@80000020 { | 40 | localbus@80000020 { |
72 | compatible = "fsl,mpc5121-localbus"; | ||
73 | #address-cells = <2>; | ||
74 | #size-cells = <1>; | ||
75 | reg = <0x80000020 0x40>; | ||
76 | |||
77 | ranges = <0x0 0x0 0xf0000000 0x10000000 /* Flash */ | 41 | ranges = <0x0 0x0 0xf0000000 0x10000000 /* Flash */ |
78 | 0x2 0x0 0x50040000 0x00020000>; /* CS2: MRAM */ | 42 | 0x2 0x0 0x50040000 0x00020000>; /* CS2: MRAM */ |
79 | 43 | ||
@@ -129,74 +93,8 @@ | |||
129 | }; | 93 | }; |
130 | 94 | ||
131 | soc@80000000 { | 95 | soc@80000000 { |
132 | compatible = "fsl,mpc5121-immr"; | ||
133 | #address-cells = <1>; | ||
134 | #size-cells = <1>; | ||
135 | #interrupt-cells = <2>; | ||
136 | ranges = <0x0 0x80000000 0x400000>; | ||
137 | reg = <0x80000000 0x400000>; | ||
138 | bus-frequency = <66000000>; // 66 MHz ips bus | ||
139 | |||
140 | // IPIC | ||
141 | // interrupts cell = <intr #, sense> | ||
142 | // sense values match linux IORESOURCE_IRQ_* defines: | ||
143 | // sense == 8: Level, low assertion | ||
144 | // sense == 2: Edge, high-to-low change | ||
145 | // | ||
146 | ipic: interrupt-controller@c00 { | ||
147 | compatible = "fsl,mpc5121-ipic", "fsl,ipic"; | ||
148 | interrupt-controller; | ||
149 | #address-cells = <0>; | ||
150 | #interrupt-cells = <2>; | ||
151 | reg = <0xc00 0x100>; | ||
152 | }; | ||
153 | |||
154 | rtc@a00 { // Real time clock | ||
155 | compatible = "fsl,mpc5121-rtc"; | ||
156 | reg = <0xa00 0x100>; | ||
157 | interrupts = <79 0x8 80 0x8>; | ||
158 | }; | ||
159 | |||
160 | reset@e00 { // Reset module | ||
161 | compatible = "fsl,mpc5121-reset"; | ||
162 | reg = <0xe00 0x100>; | ||
163 | }; | ||
164 | |||
165 | clock@f00 { // Clock control | ||
166 | compatible = "fsl,mpc5121-clock"; | ||
167 | reg = <0xf00 0x100>; | ||
168 | }; | ||
169 | |||
170 | pmc@1000{ //Power Management Controller | ||
171 | compatible = "fsl,mpc5121-pmc"; | ||
172 | reg = <0x1000 0x100>; | ||
173 | interrupts = <83 0x2>; | ||
174 | }; | ||
175 | |||
176 | gpio@1100 { | ||
177 | compatible = "fsl,mpc5121-gpio"; | ||
178 | reg = <0x1100 0x100>; | ||
179 | interrupts = <78 0x8>; | ||
180 | }; | ||
181 | |||
182 | can@1300 { | ||
183 | compatible = "fsl,mpc5121-mscan"; | ||
184 | interrupts = <12 0x8>; | ||
185 | reg = <0x1300 0x80>; | ||
186 | }; | ||
187 | |||
188 | can@1380 { | ||
189 | compatible = "fsl,mpc5121-mscan"; | ||
190 | interrupts = <13 0x8>; | ||
191 | reg = <0x1380 0x80>; | ||
192 | }; | ||
193 | 96 | ||
194 | i2c@1700 { | 97 | i2c@1700 { |
195 | #address-cells = <1>; | ||
196 | #size-cells = <0>; | ||
197 | compatible = "fsl,mpc5121-i2c"; | ||
198 | reg = <0x1700 0x20>; | ||
199 | interrupts = <0x9 0x8>; | ||
200 | fsl,preserve-clocking; | 98 | fsl,preserve-clocking; |
201 | 99 | ||
202 | eeprom@50 { | 100 | eeprom@50 { |
@@ -210,201 +108,92 @@ | |||
210 | }; | 108 | }; |
211 | }; | 109 | }; |
212 | 110 | ||
213 | i2c@1740 { | 111 | i2c@1720 { |
214 | #address-cells = <1>; | 112 | status = "disabled"; |
215 | #size-cells = <0>; | ||
216 | compatible = "fsl,mpc5121-i2c"; | ||
217 | reg = <0x1740 0x20>; | ||
218 | interrupts = <0xb 0x8>; | ||
219 | fsl,preserve-clocking; | ||
220 | }; | ||
221 | |||
222 | i2ccontrol@1760 { | ||
223 | compatible = "fsl,mpc5121-i2c-ctrl"; | ||
224 | reg = <0x1760 0x8>; | ||
225 | }; | ||
226 | |||
227 | axe@2000 { | ||
228 | compatible = "fsl,mpc5121-axe"; | ||
229 | reg = <0x2000 0x100>; | ||
230 | interrupts = <42 0x8>; | ||
231 | }; | ||
232 | |||
233 | display@2100 { | ||
234 | compatible = "fsl,mpc5121-diu"; | ||
235 | reg = <0x2100 0x100>; | ||
236 | interrupts = <64 0x8>; | ||
237 | }; | 113 | }; |
238 | 114 | ||
239 | can@2300 { | 115 | i2c@1740 { |
240 | compatible = "fsl,mpc5121-mscan"; | 116 | fsl,preserve-clocking; |
241 | interrupts = <90 0x8>; | ||
242 | reg = <0x2300 0x80>; | ||
243 | }; | ||
244 | |||
245 | can@2380 { | ||
246 | compatible = "fsl,mpc5121-mscan"; | ||
247 | interrupts = <91 0x8>; | ||
248 | reg = <0x2380 0x80>; | ||
249 | }; | 117 | }; |
250 | 118 | ||
251 | viu@2400 { | 119 | ethernet@2800 { |
252 | compatible = "fsl,mpc5121-viu"; | 120 | phy-handle = <&phy0>; |
253 | reg = <0x2400 0x400>; | ||
254 | interrupts = <67 0x8>; | ||
255 | }; | 121 | }; |
256 | 122 | ||
257 | mdio@2800 { | 123 | mdio@2800 { |
258 | compatible = "fsl,mpc5121-fec-mdio"; | 124 | phy0: ethernet-phy@1f { |
259 | reg = <0x2800 0x200>; | ||
260 | #address-cells = <1>; | ||
261 | #size-cells = <0>; | ||
262 | phy: ethernet-phy@0 { | ||
263 | compatible = "smsc,lan8700"; | 125 | compatible = "smsc,lan8700"; |
264 | reg = <0x1f>; | 126 | reg = <0x1f>; |
265 | }; | 127 | }; |
266 | }; | 128 | }; |
267 | 129 | ||
268 | eth0: ethernet@2800 { | 130 | /* USB1 using external ULPI PHY */ |
269 | compatible = "fsl,mpc5121-fec"; | ||
270 | reg = <0x2800 0x200>; | ||
271 | local-mac-address = [ 00 00 00 00 00 00 ]; | ||
272 | interrupts = <4 0x8>; | ||
273 | phy-handle = < &phy >; | ||
274 | }; | ||
275 | |||
276 | // USB1 using external ULPI PHY | ||
277 | usb@3000 { | 131 | usb@3000 { |
278 | compatible = "fsl,mpc5121-usb2-dr"; | ||
279 | reg = <0x3000 0x600>; | ||
280 | #address-cells = <1>; | ||
281 | #size-cells = <0>; | ||
282 | interrupts = <43 0x8>; | ||
283 | dr_mode = "host"; | 132 | dr_mode = "host"; |
284 | phy_type = "ulpi"; | ||
285 | }; | 133 | }; |
286 | 134 | ||
287 | // USB0 using internal UTMI PHY | 135 | /* USB0 using internal UTMI PHY */ |
288 | usb@4000 { | 136 | usb@4000 { |
289 | compatible = "fsl,mpc5121-usb2-dr"; | ||
290 | reg = <0x4000 0x600>; | ||
291 | #address-cells = <1>; | ||
292 | #size-cells = <0>; | ||
293 | interrupts = <44 0x8>; | ||
294 | dr_mode = "otg"; | ||
295 | phy_type = "utmi_wide"; | ||
296 | fsl,invert-pwr-fault; | 137 | fsl,invert-pwr-fault; |
297 | }; | 138 | }; |
298 | 139 | ||
299 | // IO control | 140 | psc@11000 { |
300 | ioctl@a000 { | ||
301 | compatible = "fsl,mpc5121-ioctl"; | ||
302 | reg = <0xA000 0x1000>; | ||
303 | }; | ||
304 | |||
305 | // 512x PSCs are not 52xx PSCs compatible | ||
306 | serial@11000 { | ||
307 | compatible = "fsl,mpc5121-psc-uart", "fsl,mpc5121-psc"; | 141 | compatible = "fsl,mpc5121-psc-uart", "fsl,mpc5121-psc"; |
308 | cell-index = <0>; | ||
309 | reg = <0x11000 0x100>; | ||
310 | interrupts = <40 0x8>; | ||
311 | fsl,rx-fifo-size = <16>; | ||
312 | fsl,tx-fifo-size = <16>; | ||
313 | }; | 142 | }; |
314 | 143 | ||
315 | serial@11100 { | 144 | psc@11100 { |
316 | compatible = "fsl,mpc5121-psc-uart", "fsl,mpc5121-psc"; | 145 | compatible = "fsl,mpc5121-psc-uart", "fsl,mpc5121-psc"; |
317 | cell-index = <1>; | ||
318 | reg = <0x11100 0x100>; | ||
319 | interrupts = <40 0x8>; | ||
320 | fsl,rx-fifo-size = <16>; | ||
321 | fsl,tx-fifo-size = <16>; | ||
322 | }; | 146 | }; |
323 | 147 | ||
324 | serial@11200 { | 148 | psc@11200 { |
325 | compatible = "fsl,mpc5121-psc-uart", "fsl,mpc5121-psc"; | 149 | compatible = "fsl,mpc5121-psc-uart", "fsl,mpc5121-psc"; |
326 | cell-index = <2>; | ||
327 | reg = <0x11200 0x100>; | ||
328 | interrupts = <40 0x8>; | ||
329 | fsl,rx-fifo-size = <16>; | ||
330 | fsl,tx-fifo-size = <16>; | ||
331 | }; | 150 | }; |
332 | 151 | ||
333 | serial@11300 { | 152 | psc@11300 { |
334 | compatible = "fsl,mpc5121-psc-uart", "fsl,mpc5121-psc"; | 153 | compatible = "fsl,mpc5121-psc-uart", "fsl,mpc5121-psc"; |
335 | cell-index = <3>; | ||
336 | reg = <0x11300 0x100>; | ||
337 | interrupts = <40 0x8>; | ||
338 | fsl,rx-fifo-size = <16>; | ||
339 | fsl,tx-fifo-size = <16>; | ||
340 | }; | 154 | }; |
341 | 155 | ||
342 | serial@11400 { | 156 | psc@11400 { |
343 | compatible = "fsl,mpc5121-psc-uart", "fsl,mpc5121-psc"; | 157 | compatible = "fsl,mpc5121-psc-uart", "fsl,mpc5121-psc"; |
344 | cell-index = <4>; | ||
345 | reg = <0x11400 0x100>; | ||
346 | interrupts = <40 0x8>; | ||
347 | fsl,rx-fifo-size = <16>; | ||
348 | fsl,tx-fifo-size = <16>; | ||
349 | }; | 158 | }; |
350 | 159 | ||
351 | serial@11600 { | 160 | psc@11500 { |
352 | compatible = "fsl,mpc5121-psc-uart", "fsl,mpc5121-psc"; | 161 | status = "disabled"; |
353 | cell-index = <6>; | ||
354 | reg = <0x11600 0x100>; | ||
355 | interrupts = <40 0x8>; | ||
356 | fsl,rx-fifo-size = <16>; | ||
357 | fsl,tx-fifo-size = <16>; | ||
358 | }; | 162 | }; |
359 | 163 | ||
360 | serial@11800 { | 164 | psc@11600 { |
361 | compatible = "fsl,mpc5121-psc-uart", "fsl,mpc5121-psc"; | 165 | compatible = "fsl,mpc5121-psc-uart", "fsl,mpc5121-psc"; |
362 | cell-index = <8>; | ||
363 | reg = <0x11800 0x100>; | ||
364 | interrupts = <40 0x8>; | ||
365 | fsl,rx-fifo-size = <16>; | ||
366 | fsl,tx-fifo-size = <16>; | ||
367 | }; | 166 | }; |
368 | 167 | ||
369 | serial@11B00 { | 168 | psc@11700 { |
370 | compatible = "fsl,mpc5121-psc-uart", "fsl,mpc5121-psc"; | 169 | status = "disabled"; |
371 | cell-index = <11>; | ||
372 | reg = <0x11B00 0x100>; | ||
373 | interrupts = <40 0x8>; | ||
374 | fsl,rx-fifo-size = <16>; | ||
375 | fsl,tx-fifo-size = <16>; | ||
376 | }; | 170 | }; |
377 | 171 | ||
378 | pscfifo@11f00 { | 172 | psc@11800 { |
379 | compatible = "fsl,mpc5121-psc-fifo"; | 173 | compatible = "fsl,mpc5121-psc-uart", "fsl,mpc5121-psc"; |
380 | reg = <0x11f00 0x100>; | ||
381 | interrupts = <40 0x8>; | ||
382 | }; | 174 | }; |
383 | 175 | ||
384 | spi@11900 { | 176 | psc@11900 { |
385 | compatible = "fsl,mpc5121-psc-spi", "fsl,mpc5121-psc"; | 177 | compatible = "fsl,mpc5121-psc-spi", "fsl,mpc5121-psc"; |
386 | cell-index = <9>; | ||
387 | #address-cells = <1>; | 178 | #address-cells = <1>; |
388 | #size-cells = <0>; | 179 | #size-cells = <0>; |
389 | reg = <0x11900 0x100>; | ||
390 | interrupts = <40 0x8>; | ||
391 | fsl,rx-fifo-size = <16>; | ||
392 | fsl,tx-fifo-size = <16>; | ||
393 | 180 | ||
394 | // 7845 touch screen controller | 181 | /* ADS7845 touch screen controller */ |
395 | ts@0 { | 182 | ts@0 { |
396 | compatible = "ti,ads7846"; | 183 | compatible = "ti,ads7846"; |
397 | reg = <0x0>; | 184 | reg = <0x0>; |
398 | spi-max-frequency = <3000000>; | 185 | spi-max-frequency = <3000000>; |
399 | // pen irq is GPIO25 | 186 | /* pen irq is GPIO25 */ |
400 | interrupts = <78 0x8>; | 187 | interrupts = <78 0x8>; |
401 | }; | 188 | }; |
402 | }; | 189 | }; |
403 | 190 | ||
404 | dma@14000 { | 191 | psc@11a00 { |
405 | compatible = "fsl,mpc5121-dma"; | 192 | status = "disabled"; |
406 | reg = <0x14000 0x1800>; | 193 | }; |
407 | interrupts = <65 0x8>; | 194 | |
195 | psc@11b00 { | ||
196 | compatible = "fsl,mpc5121-psc-uart", "fsl,mpc5121-psc"; | ||
408 | }; | 197 | }; |
409 | }; | 198 | }; |
410 | }; | 199 | }; |
diff --git a/arch/powerpc/boot/dts/ppa8548.dts b/arch/powerpc/boot/dts/ppa8548.dts new file mode 100644 index 000000000000..f97eceed610a --- /dev/null +++ b/arch/powerpc/boot/dts/ppa8548.dts | |||
@@ -0,0 +1,166 @@ | |||
1 | /* | ||
2 | * PPA8548 Device Tree Source (36-bit address map) | ||
3 | * Copyright 2013 Prodrive B.V. | ||
4 | * | ||
5 | * Based on: | ||
6 | * MPC8548 CDS Device Tree Source (36-bit address map) | ||
7 | * Copyright 2012 Freescale Semiconductor Inc. | ||
8 | * | ||
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 | ||
11 | * Free Software Foundation; either version 2 of the License, or (at your | ||
12 | * option) any later version. | ||
13 | */ | ||
14 | |||
15 | /include/ "fsl/mpc8548si-pre.dtsi" | ||
16 | |||
17 | / { | ||
18 | model = "ppa8548"; | ||
19 | compatible = "ppa8548"; | ||
20 | #address-cells = <2>; | ||
21 | #size-cells = <2>; | ||
22 | interrupt-parent = <&mpic>; | ||
23 | |||
24 | memory { | ||
25 | device_type = "memory"; | ||
26 | reg = <0 0 0x0 0x40000000>; | ||
27 | }; | ||
28 | |||
29 | lbc: localbus@fe0005000 { | ||
30 | reg = <0xf 0xe0005000 0 0x1000>; | ||
31 | ranges = <0x0 0x0 0xf 0xff800000 0x00800000>; | ||
32 | }; | ||
33 | |||
34 | soc: soc8548@fe0000000 { | ||
35 | ranges = <0 0xf 0xe0000000 0x100000>; | ||
36 | }; | ||
37 | |||
38 | pci0: pci@fe0008000 { | ||
39 | /* ppa8548 board doesn't support PCI */ | ||
40 | status = "disabled"; | ||
41 | }; | ||
42 | |||
43 | pci1: pci@fe0009000 { | ||
44 | /* ppa8548 board doesn't support PCI */ | ||
45 | status = "disabled"; | ||
46 | }; | ||
47 | |||
48 | pci2: pcie@fe000a000 { | ||
49 | /* ppa8548 board doesn't support PCI */ | ||
50 | status = "disabled"; | ||
51 | }; | ||
52 | |||
53 | rio: rapidio@fe00c0000 { | ||
54 | reg = <0xf 0xe00c0000 0x0 0x11000>; | ||
55 | port1 { | ||
56 | ranges = <0x0 0x0 0x0 0x80000000 0x0 0x40000000>; | ||
57 | }; | ||
58 | }; | ||
59 | }; | ||
60 | |||
61 | &lbc { | ||
62 | nor@0 { | ||
63 | #address-cells = <1>; | ||
64 | #size-cells = <1>; | ||
65 | compatible = "cfi-flash"; | ||
66 | reg = <0x0 0x0 0x00800000>; | ||
67 | bank-width = <2>; | ||
68 | device-width = <2>; | ||
69 | |||
70 | partition@0 { | ||
71 | reg = <0x0 0x7A0000>; | ||
72 | label = "user"; | ||
73 | }; | ||
74 | |||
75 | partition@7A0000 { | ||
76 | reg = <0x7A0000 0x20000>; | ||
77 | label = "env"; | ||
78 | read-only; | ||
79 | }; | ||
80 | |||
81 | partition@7C0000 { | ||
82 | reg = <0x7C0000 0x40000>; | ||
83 | label = "u-boot"; | ||
84 | read-only; | ||
85 | }; | ||
86 | }; | ||
87 | }; | ||
88 | |||
89 | &soc { | ||
90 | i2c@3000 { | ||
91 | rtc@6f { | ||
92 | compatible = "intersil,isl1208"; | ||
93 | reg = <0x6f>; | ||
94 | }; | ||
95 | }; | ||
96 | |||
97 | i2c@3100 { | ||
98 | }; | ||
99 | |||
100 | /* | ||
101 | * Only ethernet controller @25000 and @26000 are used. | ||
102 | * Use alias enet2 and enet3 for the remainig controllers, | ||
103 | * to stay compatible with mpc8548si-pre.dtsi. | ||
104 | */ | ||
105 | enet2: ethernet@24000 { | ||
106 | status = "disabled"; | ||
107 | }; | ||
108 | |||
109 | mdio@24520 { | ||
110 | phy0: ethernet-phy@0 { | ||
111 | interrupts = <7 1 0 0>; | ||
112 | reg = <0x0>; | ||
113 | device_type = "ethernet-phy"; | ||
114 | }; | ||
115 | phy1: ethernet-phy@1 { | ||
116 | interrupts = <8 1 0 0>; | ||
117 | reg = <0x1>; | ||
118 | device_type = "ethernet-phy"; | ||
119 | }; | ||
120 | tbi0: tbi-phy@11 { | ||
121 | reg = <0x11>; | ||
122 | device_type = "tbi-phy"; | ||
123 | }; | ||
124 | }; | ||
125 | |||
126 | enet0: ethernet@25000 { | ||
127 | tbi-handle = <&tbi1>; | ||
128 | phy-handle = <&phy0>; | ||
129 | }; | ||
130 | |||
131 | mdio@25520 { | ||
132 | tbi1: tbi-phy@11 { | ||
133 | reg = <0x11>; | ||
134 | device_type = "tbi-phy"; | ||
135 | }; | ||
136 | }; | ||
137 | |||
138 | enet1: ethernet@26000 { | ||
139 | tbi-handle = <&tbi2>; | ||
140 | phy-handle = <&phy1>; | ||
141 | }; | ||
142 | |||
143 | mdio@26520 { | ||
144 | tbi2: tbi-phy@11 { | ||
145 | reg = <0x11>; | ||
146 | device_type = "tbi-phy"; | ||
147 | }; | ||
148 | }; | ||
149 | |||
150 | enet3: ethernet@27000 { | ||
151 | status = "disabled"; | ||
152 | }; | ||
153 | |||
154 | mdio@27520 { | ||
155 | tbi3: tbi-phy@11 { | ||
156 | reg = <0x11>; | ||
157 | device_type = "tbi-phy"; | ||
158 | }; | ||
159 | }; | ||
160 | |||
161 | crypto@30000 { | ||
162 | status = "disabled"; | ||
163 | }; | ||
164 | }; | ||
165 | |||
166 | /include/ "fsl/mpc8548si-post.dtsi" | ||
diff --git a/arch/powerpc/boot/dts/sbc8548-altflash.dts b/arch/powerpc/boot/dts/sbc8548-altflash.dts new file mode 100644 index 000000000000..0b38a0defd2c --- /dev/null +++ b/arch/powerpc/boot/dts/sbc8548-altflash.dts | |||
@@ -0,0 +1,115 @@ | |||
1 | /* | ||
2 | * SBC8548 Device Tree Source | ||
3 | * | ||
4 | * Configured for booting off the alternate (64MB SODIMM) flash. | ||
5 | * Requires switching JP12 jumpers and changing SW2.8 setting. | ||
6 | * | ||
7 | * Copyright 2013 Wind River Systems Inc. | ||
8 | * | ||
9 | * Paul Gortmaker (see MAINTAINERS for contact information) | ||
10 | * | ||
11 | * This program is free software; you can redistribute it and/or modify it | ||
12 | * under the terms of the GNU General Public License as published by the | ||
13 | * Free Software Foundation; either version 2 of the License, or (at your | ||
14 | * option) any later version. | ||
15 | */ | ||
16 | |||
17 | |||
18 | /dts-v1/; | ||
19 | |||
20 | /include/ "sbc8548-pre.dtsi" | ||
21 | |||
22 | /{ | ||
23 | localbus@e0000000 { | ||
24 | #address-cells = <2>; | ||
25 | #size-cells = <1>; | ||
26 | compatible = "simple-bus"; | ||
27 | reg = <0xe0000000 0x5000>; | ||
28 | interrupt-parent = <&mpic>; | ||
29 | |||
30 | ranges = <0x0 0x0 0xfc000000 0x04000000 /*64MB Flash*/ | ||
31 | 0x3 0x0 0xf0000000 0x04000000 /*64MB SDRAM*/ | ||
32 | 0x4 0x0 0xf4000000 0x04000000 /*64MB SDRAM*/ | ||
33 | 0x5 0x0 0xf8000000 0x00b10000 /* EPLD */ | ||
34 | 0x6 0x0 0xef800000 0x00800000>; /*8MB Flash*/ | ||
35 | |||
36 | flash@0,0 { | ||
37 | #address-cells = <1>; | ||
38 | #size-cells = <1>; | ||
39 | reg = <0x0 0x0 0x04000000>; | ||
40 | compatible = "intel,JS28F128", "cfi-flash"; | ||
41 | bank-width = <4>; | ||
42 | device-width = <1>; | ||
43 | partition@0x0 { | ||
44 | label = "space"; | ||
45 | /* FC000000 -> FFEFFFFF */ | ||
46 | reg = <0x00000000 0x03f00000>; | ||
47 | }; | ||
48 | partition@0x03f00000 { | ||
49 | label = "bootloader"; | ||
50 | /* FFF00000 -> FFFFFFFF */ | ||
51 | reg = <0x03f00000 0x00100000>; | ||
52 | read-only; | ||
53 | }; | ||
54 | }; | ||
55 | |||
56 | |||
57 | epld@5,0 { | ||
58 | compatible = "wrs,epld-localbus"; | ||
59 | #address-cells = <2>; | ||
60 | #size-cells = <1>; | ||
61 | reg = <0x5 0x0 0x00b10000>; | ||
62 | ranges = < | ||
63 | 0x0 0x0 0x5 0x000000 0x1fff /* LED */ | ||
64 | 0x1 0x0 0x5 0x100000 0x1fff /* Switches */ | ||
65 | 0x3 0x0 0x5 0x300000 0x1fff /* HW Rev. */ | ||
66 | 0xb 0x0 0x5 0xb00000 0x1fff /* EEPROM */ | ||
67 | >; | ||
68 | |||
69 | led@0,0 { | ||
70 | compatible = "led"; | ||
71 | reg = <0x0 0x0 0x1fff>; | ||
72 | }; | ||
73 | |||
74 | switches@1,0 { | ||
75 | compatible = "switches"; | ||
76 | reg = <0x1 0x0 0x1fff>; | ||
77 | }; | ||
78 | |||
79 | hw-rev@3,0 { | ||
80 | compatible = "hw-rev"; | ||
81 | reg = <0x3 0x0 0x1fff>; | ||
82 | }; | ||
83 | |||
84 | eeprom@b,0 { | ||
85 | compatible = "eeprom"; | ||
86 | reg = <0xb 0 0x1fff>; | ||
87 | }; | ||
88 | |||
89 | }; | ||
90 | |||
91 | alt-flash@6,0 { | ||
92 | #address-cells = <1>; | ||
93 | #size-cells = <1>; | ||
94 | compatible = "intel,JS28F640", "cfi-flash"; | ||
95 | reg = <0x6 0x0 0x800000>; | ||
96 | bank-width = <1>; | ||
97 | device-width = <1>; | ||
98 | partition@0x0 { | ||
99 | label = "space"; | ||
100 | /* EF800000 -> EFF9FFFF */ | ||
101 | reg = <0x00000000 0x007a0000>; | ||
102 | }; | ||
103 | partition@0x7a0000 { | ||
104 | label = "bootloader"; | ||
105 | /* EFFA0000 -> EFFFFFFF */ | ||
106 | reg = <0x007a0000 0x00060000>; | ||
107 | read-only; | ||
108 | }; | ||
109 | }; | ||
110 | |||
111 | |||
112 | }; | ||
113 | }; | ||
114 | |||
115 | /include/ "sbc8548-post.dtsi" | ||
diff --git a/arch/powerpc/boot/dts/sbc8548-post.dtsi b/arch/powerpc/boot/dts/sbc8548-post.dtsi new file mode 100644 index 000000000000..33a47e27a11e --- /dev/null +++ b/arch/powerpc/boot/dts/sbc8548-post.dtsi | |||
@@ -0,0 +1,295 @@ | |||
1 | /* | ||
2 | * SBC8548 Device Tree Source | ||
3 | * | ||
4 | * Copyright 2007 Wind River Systems Inc. | ||
5 | * | ||
6 | * Paul Gortmaker (see MAINTAINERS for contact information) | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify it | ||
9 | * under the terms of the GNU General Public License as published by the | ||
10 | * Free Software Foundation; either version 2 of the License, or (at your | ||
11 | * option) any later version. | ||
12 | */ | ||
13 | |||
14 | /{ | ||
15 | soc8548@e0000000 { | ||
16 | #address-cells = <1>; | ||
17 | #size-cells = <1>; | ||
18 | device_type = "soc"; | ||
19 | ranges = <0x00000000 0xe0000000 0x00100000>; | ||
20 | bus-frequency = <0>; | ||
21 | compatible = "simple-bus"; | ||
22 | |||
23 | ecm-law@0 { | ||
24 | compatible = "fsl,ecm-law"; | ||
25 | reg = <0x0 0x1000>; | ||
26 | fsl,num-laws = <10>; | ||
27 | }; | ||
28 | |||
29 | ecm@1000 { | ||
30 | compatible = "fsl,mpc8548-ecm", "fsl,ecm"; | ||
31 | reg = <0x1000 0x1000>; | ||
32 | interrupts = <17 2>; | ||
33 | interrupt-parent = <&mpic>; | ||
34 | }; | ||
35 | |||
36 | memory-controller@2000 { | ||
37 | compatible = "fsl,mpc8548-memory-controller"; | ||
38 | reg = <0x2000 0x1000>; | ||
39 | interrupt-parent = <&mpic>; | ||
40 | interrupts = <0x12 0x2>; | ||
41 | }; | ||
42 | |||
43 | L2: l2-cache-controller@20000 { | ||
44 | compatible = "fsl,mpc8548-l2-cache-controller"; | ||
45 | reg = <0x20000 0x1000>; | ||
46 | cache-line-size = <0x20>; // 32 bytes | ||
47 | cache-size = <0x80000>; // L2, 512K | ||
48 | interrupt-parent = <&mpic>; | ||
49 | interrupts = <0x10 0x2>; | ||
50 | }; | ||
51 | |||
52 | i2c@3000 { | ||
53 | #address-cells = <1>; | ||
54 | #size-cells = <0>; | ||
55 | cell-index = <0>; | ||
56 | compatible = "fsl-i2c"; | ||
57 | reg = <0x3000 0x100>; | ||
58 | interrupts = <0x2b 0x2>; | ||
59 | interrupt-parent = <&mpic>; | ||
60 | dfsrr; | ||
61 | }; | ||
62 | |||
63 | i2c@3100 { | ||
64 | #address-cells = <1>; | ||
65 | #size-cells = <0>; | ||
66 | cell-index = <1>; | ||
67 | compatible = "fsl-i2c"; | ||
68 | reg = <0x3100 0x100>; | ||
69 | interrupts = <0x2b 0x2>; | ||
70 | interrupt-parent = <&mpic>; | ||
71 | dfsrr; | ||
72 | }; | ||
73 | |||
74 | dma@21300 { | ||
75 | #address-cells = <1>; | ||
76 | #size-cells = <1>; | ||
77 | compatible = "fsl,mpc8548-dma", "fsl,eloplus-dma"; | ||
78 | reg = <0x21300 0x4>; | ||
79 | ranges = <0x0 0x21100 0x200>; | ||
80 | cell-index = <0>; | ||
81 | dma-channel@0 { | ||
82 | compatible = "fsl,mpc8548-dma-channel", | ||
83 | "fsl,eloplus-dma-channel"; | ||
84 | reg = <0x0 0x80>; | ||
85 | cell-index = <0>; | ||
86 | interrupt-parent = <&mpic>; | ||
87 | interrupts = <20 2>; | ||
88 | }; | ||
89 | dma-channel@80 { | ||
90 | compatible = "fsl,mpc8548-dma-channel", | ||
91 | "fsl,eloplus-dma-channel"; | ||
92 | reg = <0x80 0x80>; | ||
93 | cell-index = <1>; | ||
94 | interrupt-parent = <&mpic>; | ||
95 | interrupts = <21 2>; | ||
96 | }; | ||
97 | dma-channel@100 { | ||
98 | compatible = "fsl,mpc8548-dma-channel", | ||
99 | "fsl,eloplus-dma-channel"; | ||
100 | reg = <0x100 0x80>; | ||
101 | cell-index = <2>; | ||
102 | interrupt-parent = <&mpic>; | ||
103 | interrupts = <22 2>; | ||
104 | }; | ||
105 | dma-channel@180 { | ||
106 | compatible = "fsl,mpc8548-dma-channel", | ||
107 | "fsl,eloplus-dma-channel"; | ||
108 | reg = <0x180 0x80>; | ||
109 | cell-index = <3>; | ||
110 | interrupt-parent = <&mpic>; | ||
111 | interrupts = <23 2>; | ||
112 | }; | ||
113 | }; | ||
114 | |||
115 | enet0: ethernet@24000 { | ||
116 | #address-cells = <1>; | ||
117 | #size-cells = <1>; | ||
118 | cell-index = <0>; | ||
119 | device_type = "network"; | ||
120 | model = "eTSEC"; | ||
121 | compatible = "gianfar"; | ||
122 | reg = <0x24000 0x1000>; | ||
123 | ranges = <0x0 0x24000 0x1000>; | ||
124 | local-mac-address = [ 00 00 00 00 00 00 ]; | ||
125 | interrupts = <0x1d 0x2 0x1e 0x2 0x22 0x2>; | ||
126 | interrupt-parent = <&mpic>; | ||
127 | tbi-handle = <&tbi0>; | ||
128 | phy-handle = <&phy0>; | ||
129 | |||
130 | mdio@520 { | ||
131 | #address-cells = <1>; | ||
132 | #size-cells = <0>; | ||
133 | compatible = "fsl,gianfar-mdio"; | ||
134 | reg = <0x520 0x20>; | ||
135 | |||
136 | phy0: ethernet-phy@19 { | ||
137 | interrupt-parent = <&mpic>; | ||
138 | interrupts = <0x6 0x1>; | ||
139 | reg = <0x19>; | ||
140 | device_type = "ethernet-phy"; | ||
141 | }; | ||
142 | phy1: ethernet-phy@1a { | ||
143 | interrupt-parent = <&mpic>; | ||
144 | interrupts = <0x7 0x1>; | ||
145 | reg = <0x1a>; | ||
146 | device_type = "ethernet-phy"; | ||
147 | }; | ||
148 | tbi0: tbi-phy@11 { | ||
149 | reg = <0x11>; | ||
150 | device_type = "tbi-phy"; | ||
151 | }; | ||
152 | }; | ||
153 | }; | ||
154 | |||
155 | enet1: ethernet@25000 { | ||
156 | #address-cells = <1>; | ||
157 | #size-cells = <1>; | ||
158 | cell-index = <1>; | ||
159 | device_type = "network"; | ||
160 | model = "eTSEC"; | ||
161 | compatible = "gianfar"; | ||
162 | reg = <0x25000 0x1000>; | ||
163 | ranges = <0x0 0x25000 0x1000>; | ||
164 | local-mac-address = [ 00 00 00 00 00 00 ]; | ||
165 | interrupts = <0x23 0x2 0x24 0x2 0x28 0x2>; | ||
166 | interrupt-parent = <&mpic>; | ||
167 | tbi-handle = <&tbi1>; | ||
168 | phy-handle = <&phy1>; | ||
169 | |||
170 | mdio@520 { | ||
171 | #address-cells = <1>; | ||
172 | #size-cells = <0>; | ||
173 | compatible = "fsl,gianfar-tbi"; | ||
174 | reg = <0x520 0x20>; | ||
175 | |||
176 | tbi1: tbi-phy@11 { | ||
177 | reg = <0x11>; | ||
178 | device_type = "tbi-phy"; | ||
179 | }; | ||
180 | }; | ||
181 | }; | ||
182 | |||
183 | serial0: serial@4500 { | ||
184 | cell-index = <0>; | ||
185 | device_type = "serial"; | ||
186 | compatible = "fsl,ns16550", "ns16550"; | ||
187 | reg = <0x4500 0x100>; // reg base, size | ||
188 | clock-frequency = <0>; // should we fill in in uboot? | ||
189 | interrupts = <0x2a 0x2>; | ||
190 | interrupt-parent = <&mpic>; | ||
191 | }; | ||
192 | |||
193 | serial1: serial@4600 { | ||
194 | cell-index = <1>; | ||
195 | device_type = "serial"; | ||
196 | compatible = "fsl,ns16550", "ns16550"; | ||
197 | reg = <0x4600 0x100>; // reg base, size | ||
198 | clock-frequency = <0>; // should we fill in in uboot? | ||
199 | interrupts = <0x2a 0x2>; | ||
200 | interrupt-parent = <&mpic>; | ||
201 | }; | ||
202 | |||
203 | global-utilities@e0000 { //global utilities reg | ||
204 | compatible = "fsl,mpc8548-guts"; | ||
205 | reg = <0xe0000 0x1000>; | ||
206 | fsl,has-rstcr; | ||
207 | }; | ||
208 | |||
209 | crypto@30000 { | ||
210 | compatible = "fsl,sec2.1", "fsl,sec2.0"; | ||
211 | reg = <0x30000 0x10000>; | ||
212 | interrupts = <45 2>; | ||
213 | interrupt-parent = <&mpic>; | ||
214 | fsl,num-channels = <4>; | ||
215 | fsl,channel-fifo-len = <24>; | ||
216 | fsl,exec-units-mask = <0xfe>; | ||
217 | fsl,descriptor-types-mask = <0x12b0ebf>; | ||
218 | }; | ||
219 | |||
220 | mpic: pic@40000 { | ||
221 | interrupt-controller; | ||
222 | #address-cells = <0>; | ||
223 | #interrupt-cells = <2>; | ||
224 | reg = <0x40000 0x40000>; | ||
225 | compatible = "chrp,open-pic"; | ||
226 | device_type = "open-pic"; | ||
227 | }; | ||
228 | }; | ||
229 | |||
230 | pci0: pci@e0008000 { | ||
231 | interrupt-map-mask = <0xf800 0x0 0x0 0x7>; | ||
232 | interrupt-map = < | ||
233 | /* IDSEL 0x01 (PCI-X slot) @66MHz */ | ||
234 | 0x0800 0x0 0x0 0x1 &mpic 0x2 0x1 | ||
235 | 0x0800 0x0 0x0 0x2 &mpic 0x3 0x1 | ||
236 | 0x0800 0x0 0x0 0x3 &mpic 0x4 0x1 | ||
237 | 0x0800 0x0 0x0 0x4 &mpic 0x1 0x1 | ||
238 | |||
239 | /* IDSEL 0x11 (PCI, 3.3V 32bit) @33MHz */ | ||
240 | 0x8800 0x0 0x0 0x1 &mpic 0x2 0x1 | ||
241 | 0x8800 0x0 0x0 0x2 &mpic 0x3 0x1 | ||
242 | 0x8800 0x0 0x0 0x3 &mpic 0x4 0x1 | ||
243 | 0x8800 0x0 0x0 0x4 &mpic 0x1 0x1>; | ||
244 | |||
245 | interrupt-parent = <&mpic>; | ||
246 | interrupts = <0x18 0x2>; | ||
247 | bus-range = <0 0>; | ||
248 | ranges = <0x02000000 0x0 0x80000000 0x80000000 0x0 0x10000000 | ||
249 | 0x01000000 0x0 0x00000000 0xe2000000 0x0 0x00800000>; | ||
250 | clock-frequency = <66000000>; | ||
251 | #interrupt-cells = <1>; | ||
252 | #size-cells = <2>; | ||
253 | #address-cells = <3>; | ||
254 | reg = <0xe0008000 0x1000>; | ||
255 | compatible = "fsl,mpc8540-pcix", "fsl,mpc8540-pci"; | ||
256 | device_type = "pci"; | ||
257 | }; | ||
258 | |||
259 | pci1: pcie@e000a000 { | ||
260 | interrupt-map-mask = <0xf800 0x0 0x0 0x7>; | ||
261 | interrupt-map = < | ||
262 | |||
263 | /* IDSEL 0x0 (PEX) */ | ||
264 | 0x0000 0x0 0x0 0x1 &mpic 0x0 0x1 | ||
265 | 0x0000 0x0 0x0 0x2 &mpic 0x1 0x1 | ||
266 | 0x0000 0x0 0x0 0x3 &mpic 0x2 0x1 | ||
267 | 0x0000 0x0 0x0 0x4 &mpic 0x3 0x1>; | ||
268 | |||
269 | interrupt-parent = <&mpic>; | ||
270 | interrupts = <0x1a 0x2>; | ||
271 | bus-range = <0x0 0xff>; | ||
272 | ranges = <0x02000000 0x0 0xa0000000 0xa0000000 0x0 0x10000000 | ||
273 | 0x01000000 0x0 0x00000000 0xe2800000 0x0 0x08000000>; | ||
274 | clock-frequency = <33000000>; | ||
275 | #interrupt-cells = <1>; | ||
276 | #size-cells = <2>; | ||
277 | #address-cells = <3>; | ||
278 | reg = <0xe000a000 0x1000>; | ||
279 | compatible = "fsl,mpc8548-pcie"; | ||
280 | device_type = "pci"; | ||
281 | pcie@0 { | ||
282 | reg = <0x0 0x0 0x0 0x0 0x0>; | ||
283 | #size-cells = <2>; | ||
284 | #address-cells = <3>; | ||
285 | device_type = "pci"; | ||
286 | ranges = <0x02000000 0x0 0xa0000000 | ||
287 | 0x02000000 0x0 0xa0000000 | ||
288 | 0x0 0x10000000 | ||
289 | |||
290 | 0x01000000 0x0 0x00000000 | ||
291 | 0x01000000 0x0 0x00000000 | ||
292 | 0x0 0x00800000>; | ||
293 | }; | ||
294 | }; | ||
295 | }; | ||
diff --git a/arch/powerpc/boot/dts/sbc8548-pre.dtsi b/arch/powerpc/boot/dts/sbc8548-pre.dtsi new file mode 100644 index 000000000000..d8c66290c5b4 --- /dev/null +++ b/arch/powerpc/boot/dts/sbc8548-pre.dtsi | |||
@@ -0,0 +1,52 @@ | |||
1 | /* | ||
2 | * SBC8548 Device Tree Source | ||
3 | * | ||
4 | * Copyright 2007 Wind River Systems Inc. | ||
5 | * | ||
6 | * Paul Gortmaker (see MAINTAINERS for contact information) | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify it | ||
9 | * under the terms of the GNU General Public License as published by the | ||
10 | * Free Software Foundation; either version 2 of the License, or (at your | ||
11 | * option) any later version. | ||
12 | */ | ||
13 | |||
14 | /{ | ||
15 | model = "SBC8548"; | ||
16 | compatible = "SBC8548"; | ||
17 | #address-cells = <1>; | ||
18 | #size-cells = <1>; | ||
19 | |||
20 | aliases { | ||
21 | ethernet0 = &enet0; | ||
22 | ethernet1 = &enet1; | ||
23 | serial0 = &serial0; | ||
24 | serial1 = &serial1; | ||
25 | pci0 = &pci0; | ||
26 | pci1 = &pci1; | ||
27 | }; | ||
28 | |||
29 | cpus { | ||
30 | #address-cells = <1>; | ||
31 | #size-cells = <0>; | ||
32 | |||
33 | PowerPC,8548@0 { | ||
34 | device_type = "cpu"; | ||
35 | reg = <0>; | ||
36 | d-cache-line-size = <0x20>; // 32 bytes | ||
37 | i-cache-line-size = <0x20>; // 32 bytes | ||
38 | d-cache-size = <0x8000>; // L1, 32K | ||
39 | i-cache-size = <0x8000>; // L1, 32K | ||
40 | timebase-frequency = <0>; // From uboot | ||
41 | bus-frequency = <0>; | ||
42 | clock-frequency = <0>; | ||
43 | next-level-cache = <&L2>; | ||
44 | }; | ||
45 | }; | ||
46 | |||
47 | memory { | ||
48 | device_type = "memory"; | ||
49 | reg = <0x00000000 0x10000000>; | ||
50 | }; | ||
51 | |||
52 | }; | ||
diff --git a/arch/powerpc/boot/dts/sbc8548.dts b/arch/powerpc/boot/dts/sbc8548.dts index 77be77116c2e..1df2a0955668 100644 --- a/arch/powerpc/boot/dts/sbc8548.dts +++ b/arch/powerpc/boot/dts/sbc8548.dts | |||
@@ -14,44 +14,9 @@ | |||
14 | 14 | ||
15 | /dts-v1/; | 15 | /dts-v1/; |
16 | 16 | ||
17 | / { | 17 | /include/ "sbc8548-pre.dtsi" |
18 | model = "SBC8548"; | ||
19 | compatible = "SBC8548"; | ||
20 | #address-cells = <1>; | ||
21 | #size-cells = <1>; | ||
22 | |||
23 | aliases { | ||
24 | ethernet0 = &enet0; | ||
25 | ethernet1 = &enet1; | ||
26 | serial0 = &serial0; | ||
27 | serial1 = &serial1; | ||
28 | pci0 = &pci0; | ||
29 | pci1 = &pci1; | ||
30 | }; | ||
31 | |||
32 | cpus { | ||
33 | #address-cells = <1>; | ||
34 | #size-cells = <0>; | ||
35 | |||
36 | PowerPC,8548@0 { | ||
37 | device_type = "cpu"; | ||
38 | reg = <0>; | ||
39 | d-cache-line-size = <0x20>; // 32 bytes | ||
40 | i-cache-line-size = <0x20>; // 32 bytes | ||
41 | d-cache-size = <0x8000>; // L1, 32K | ||
42 | i-cache-size = <0x8000>; // L1, 32K | ||
43 | timebase-frequency = <0>; // From uboot | ||
44 | bus-frequency = <0>; | ||
45 | clock-frequency = <0>; | ||
46 | next-level-cache = <&L2>; | ||
47 | }; | ||
48 | }; | ||
49 | |||
50 | memory { | ||
51 | device_type = "memory"; | ||
52 | reg = <0x00000000 0x10000000>; | ||
53 | }; | ||
54 | 18 | ||
19 | /{ | ||
55 | localbus@e0000000 { | 20 | localbus@e0000000 { |
56 | #address-cells = <2>; | 21 | #address-cells = <2>; |
57 | #size-cells = <1>; | 22 | #size-cells = <1>; |
@@ -63,23 +28,25 @@ | |||
63 | 0x3 0x0 0xf0000000 0x04000000 /*64MB SDRAM*/ | 28 | 0x3 0x0 0xf0000000 0x04000000 /*64MB SDRAM*/ |
64 | 0x4 0x0 0xf4000000 0x04000000 /*64MB SDRAM*/ | 29 | 0x4 0x0 0xf4000000 0x04000000 /*64MB SDRAM*/ |
65 | 0x5 0x0 0xf8000000 0x00b10000 /* EPLD */ | 30 | 0x5 0x0 0xf8000000 0x00b10000 /* EPLD */ |
66 | 0x6 0x0 0xfb800000 0x04000000>; /*64MB Flash*/ | 31 | 0x6 0x0 0xec000000 0x04000000>; /*64MB Flash*/ |
67 | 32 | ||
68 | 33 | ||
69 | flash@0,0 { | 34 | flash@0,0 { |
70 | #address-cells = <1>; | 35 | #address-cells = <1>; |
71 | #size-cells = <1>; | 36 | #size-cells = <1>; |
72 | compatible = "cfi-flash"; | 37 | compatible = "intel,JS28F640", "cfi-flash"; |
73 | reg = <0x0 0x0 0x800000>; | 38 | reg = <0x0 0x0 0x800000>; |
74 | bank-width = <1>; | 39 | bank-width = <1>; |
75 | device-width = <1>; | 40 | device-width = <1>; |
76 | partition@0x0 { | 41 | partition@0x0 { |
77 | label = "space"; | 42 | label = "space"; |
78 | reg = <0x00000000 0x00100000>; | 43 | /* FF800000 -> FFF9FFFF */ |
44 | reg = <0x00000000 0x007a0000>; | ||
79 | }; | 45 | }; |
80 | partition@0x100000 { | 46 | partition@0x7a0000 { |
81 | label = "bootloader"; | 47 | label = "bootloader"; |
82 | reg = <0x00100000 0x00700000>; | 48 | /* FFFA0000 -> FFFFFFFF */ |
49 | reg = <0x007a0000 0x00060000>; | ||
83 | read-only; | 50 | read-only; |
84 | }; | 51 | }; |
85 | }; | 52 | }; |
@@ -122,307 +89,22 @@ | |||
122 | #address-cells = <1>; | 89 | #address-cells = <1>; |
123 | #size-cells = <1>; | 90 | #size-cells = <1>; |
124 | reg = <0x6 0x0 0x04000000>; | 91 | reg = <0x6 0x0 0x04000000>; |
125 | compatible = "cfi-flash"; | 92 | compatible = "intel,JS28F128", "cfi-flash"; |
126 | bank-width = <4>; | 93 | bank-width = <4>; |
127 | device-width = <1>; | 94 | device-width = <1>; |
128 | partition@0x0 { | 95 | partition@0x0 { |
96 | label = "space"; | ||
97 | /* EC000000 -> EFEFFFFF */ | ||
98 | reg = <0x00000000 0x03f00000>; | ||
99 | }; | ||
100 | partition@0x03f00000 { | ||
129 | label = "bootloader"; | 101 | label = "bootloader"; |
130 | reg = <0x00000000 0x00100000>; | 102 | /* EFF00000 -> EFFFFFFF */ |
103 | reg = <0x03f00000 0x00100000>; | ||
131 | read-only; | 104 | read-only; |
132 | }; | 105 | }; |
133 | partition@0x00100000 { | ||
134 | label = "file-system"; | ||
135 | reg = <0x00100000 0x01f00000>; | ||
136 | }; | ||
137 | partition@0x02000000 { | ||
138 | label = "boot-config"; | ||
139 | reg = <0x02000000 0x00100000>; | ||
140 | }; | ||
141 | partition@0x02100000 { | ||
142 | label = "space"; | ||
143 | reg = <0x02100000 0x01f00000>; | ||
144 | }; | ||
145 | }; | 106 | }; |
146 | }; | 107 | }; |
147 | |||
148 | soc8548@e0000000 { | ||
149 | #address-cells = <1>; | ||
150 | #size-cells = <1>; | ||
151 | device_type = "soc"; | ||
152 | ranges = <0x00000000 0xe0000000 0x00100000>; | ||
153 | bus-frequency = <0>; | ||
154 | compatible = "simple-bus"; | ||
155 | |||
156 | ecm-law@0 { | ||
157 | compatible = "fsl,ecm-law"; | ||
158 | reg = <0x0 0x1000>; | ||
159 | fsl,num-laws = <10>; | ||
160 | }; | ||
161 | |||
162 | ecm@1000 { | ||
163 | compatible = "fsl,mpc8548-ecm", "fsl,ecm"; | ||
164 | reg = <0x1000 0x1000>; | ||
165 | interrupts = <17 2>; | ||
166 | interrupt-parent = <&mpic>; | ||
167 | }; | ||
168 | |||
169 | memory-controller@2000 { | ||
170 | compatible = "fsl,mpc8548-memory-controller"; | ||
171 | reg = <0x2000 0x1000>; | ||
172 | interrupt-parent = <&mpic>; | ||
173 | interrupts = <0x12 0x2>; | ||
174 | }; | ||
175 | |||
176 | L2: l2-cache-controller@20000 { | ||
177 | compatible = "fsl,mpc8548-l2-cache-controller"; | ||
178 | reg = <0x20000 0x1000>; | ||
179 | cache-line-size = <0x20>; // 32 bytes | ||
180 | cache-size = <0x80000>; // L2, 512K | ||
181 | interrupt-parent = <&mpic>; | ||
182 | interrupts = <0x10 0x2>; | ||
183 | }; | ||
184 | |||
185 | i2c@3000 { | ||
186 | #address-cells = <1>; | ||
187 | #size-cells = <0>; | ||
188 | cell-index = <0>; | ||
189 | compatible = "fsl-i2c"; | ||
190 | reg = <0x3000 0x100>; | ||
191 | interrupts = <0x2b 0x2>; | ||
192 | interrupt-parent = <&mpic>; | ||
193 | dfsrr; | ||
194 | }; | ||
195 | |||
196 | i2c@3100 { | ||
197 | #address-cells = <1>; | ||
198 | #size-cells = <0>; | ||
199 | cell-index = <1>; | ||
200 | compatible = "fsl-i2c"; | ||
201 | reg = <0x3100 0x100>; | ||
202 | interrupts = <0x2b 0x2>; | ||
203 | interrupt-parent = <&mpic>; | ||
204 | dfsrr; | ||
205 | }; | ||
206 | |||
207 | dma@21300 { | ||
208 | #address-cells = <1>; | ||
209 | #size-cells = <1>; | ||
210 | compatible = "fsl,mpc8548-dma", "fsl,eloplus-dma"; | ||
211 | reg = <0x21300 0x4>; | ||
212 | ranges = <0x0 0x21100 0x200>; | ||
213 | cell-index = <0>; | ||
214 | dma-channel@0 { | ||
215 | compatible = "fsl,mpc8548-dma-channel", | ||
216 | "fsl,eloplus-dma-channel"; | ||
217 | reg = <0x0 0x80>; | ||
218 | cell-index = <0>; | ||
219 | interrupt-parent = <&mpic>; | ||
220 | interrupts = <20 2>; | ||
221 | }; | ||
222 | dma-channel@80 { | ||
223 | compatible = "fsl,mpc8548-dma-channel", | ||
224 | "fsl,eloplus-dma-channel"; | ||
225 | reg = <0x80 0x80>; | ||
226 | cell-index = <1>; | ||
227 | interrupt-parent = <&mpic>; | ||
228 | interrupts = <21 2>; | ||
229 | }; | ||
230 | dma-channel@100 { | ||
231 | compatible = "fsl,mpc8548-dma-channel", | ||
232 | "fsl,eloplus-dma-channel"; | ||
233 | reg = <0x100 0x80>; | ||
234 | cell-index = <2>; | ||
235 | interrupt-parent = <&mpic>; | ||
236 | interrupts = <22 2>; | ||
237 | }; | ||
238 | dma-channel@180 { | ||
239 | compatible = "fsl,mpc8548-dma-channel", | ||
240 | "fsl,eloplus-dma-channel"; | ||
241 | reg = <0x180 0x80>; | ||
242 | cell-index = <3>; | ||
243 | interrupt-parent = <&mpic>; | ||
244 | interrupts = <23 2>; | ||
245 | }; | ||
246 | }; | ||
247 | |||
248 | enet0: ethernet@24000 { | ||
249 | #address-cells = <1>; | ||
250 | #size-cells = <1>; | ||
251 | cell-index = <0>; | ||
252 | device_type = "network"; | ||
253 | model = "eTSEC"; | ||
254 | compatible = "gianfar"; | ||
255 | reg = <0x24000 0x1000>; | ||
256 | ranges = <0x0 0x24000 0x1000>; | ||
257 | local-mac-address = [ 00 00 00 00 00 00 ]; | ||
258 | interrupts = <0x1d 0x2 0x1e 0x2 0x22 0x2>; | ||
259 | interrupt-parent = <&mpic>; | ||
260 | tbi-handle = <&tbi0>; | ||
261 | phy-handle = <&phy0>; | ||
262 | |||
263 | mdio@520 { | ||
264 | #address-cells = <1>; | ||
265 | #size-cells = <0>; | ||
266 | compatible = "fsl,gianfar-mdio"; | ||
267 | reg = <0x520 0x20>; | ||
268 | |||
269 | phy0: ethernet-phy@19 { | ||
270 | interrupt-parent = <&mpic>; | ||
271 | interrupts = <0x6 0x1>; | ||
272 | reg = <0x19>; | ||
273 | device_type = "ethernet-phy"; | ||
274 | }; | ||
275 | phy1: ethernet-phy@1a { | ||
276 | interrupt-parent = <&mpic>; | ||
277 | interrupts = <0x7 0x1>; | ||
278 | reg = <0x1a>; | ||
279 | device_type = "ethernet-phy"; | ||
280 | }; | ||
281 | tbi0: tbi-phy@11 { | ||
282 | reg = <0x11>; | ||
283 | device_type = "tbi-phy"; | ||
284 | }; | ||
285 | }; | ||
286 | }; | ||
287 | |||
288 | enet1: ethernet@25000 { | ||
289 | #address-cells = <1>; | ||
290 | #size-cells = <1>; | ||
291 | cell-index = <1>; | ||
292 | device_type = "network"; | ||
293 | model = "eTSEC"; | ||
294 | compatible = "gianfar"; | ||
295 | reg = <0x25000 0x1000>; | ||
296 | ranges = <0x0 0x25000 0x1000>; | ||
297 | local-mac-address = [ 00 00 00 00 00 00 ]; | ||
298 | interrupts = <0x23 0x2 0x24 0x2 0x28 0x2>; | ||
299 | interrupt-parent = <&mpic>; | ||
300 | tbi-handle = <&tbi1>; | ||
301 | phy-handle = <&phy1>; | ||
302 | |||
303 | mdio@520 { | ||
304 | #address-cells = <1>; | ||
305 | #size-cells = <0>; | ||
306 | compatible = "fsl,gianfar-tbi"; | ||
307 | reg = <0x520 0x20>; | ||
308 | |||
309 | tbi1: tbi-phy@11 { | ||
310 | reg = <0x11>; | ||
311 | device_type = "tbi-phy"; | ||
312 | }; | ||
313 | }; | ||
314 | }; | ||
315 | |||
316 | serial0: serial@4500 { | ||
317 | cell-index = <0>; | ||
318 | device_type = "serial"; | ||
319 | compatible = "fsl,ns16550", "ns16550"; | ||
320 | reg = <0x4500 0x100>; // reg base, size | ||
321 | clock-frequency = <0>; // should we fill in in uboot? | ||
322 | interrupts = <0x2a 0x2>; | ||
323 | interrupt-parent = <&mpic>; | ||
324 | }; | ||
325 | |||
326 | serial1: serial@4600 { | ||
327 | cell-index = <1>; | ||
328 | device_type = "serial"; | ||
329 | compatible = "fsl,ns16550", "ns16550"; | ||
330 | reg = <0x4600 0x100>; // reg base, size | ||
331 | clock-frequency = <0>; // should we fill in in uboot? | ||
332 | interrupts = <0x2a 0x2>; | ||
333 | interrupt-parent = <&mpic>; | ||
334 | }; | ||
335 | |||
336 | global-utilities@e0000 { //global utilities reg | ||
337 | compatible = "fsl,mpc8548-guts"; | ||
338 | reg = <0xe0000 0x1000>; | ||
339 | fsl,has-rstcr; | ||
340 | }; | ||
341 | |||
342 | crypto@30000 { | ||
343 | compatible = "fsl,sec2.1", "fsl,sec2.0"; | ||
344 | reg = <0x30000 0x10000>; | ||
345 | interrupts = <45 2>; | ||
346 | interrupt-parent = <&mpic>; | ||
347 | fsl,num-channels = <4>; | ||
348 | fsl,channel-fifo-len = <24>; | ||
349 | fsl,exec-units-mask = <0xfe>; | ||
350 | fsl,descriptor-types-mask = <0x12b0ebf>; | ||
351 | }; | ||
352 | |||
353 | mpic: pic@40000 { | ||
354 | interrupt-controller; | ||
355 | #address-cells = <0>; | ||
356 | #interrupt-cells = <2>; | ||
357 | reg = <0x40000 0x40000>; | ||
358 | compatible = "chrp,open-pic"; | ||
359 | device_type = "open-pic"; | ||
360 | }; | ||
361 | }; | ||
362 | |||
363 | pci0: pci@e0008000 { | ||
364 | interrupt-map-mask = <0xf800 0x0 0x0 0x7>; | ||
365 | interrupt-map = < | ||
366 | /* IDSEL 0x01 (PCI-X slot) @66MHz */ | ||
367 | 0x0800 0x0 0x0 0x1 &mpic 0x2 0x1 | ||
368 | 0x0800 0x0 0x0 0x2 &mpic 0x3 0x1 | ||
369 | 0x0800 0x0 0x0 0x3 &mpic 0x4 0x1 | ||
370 | 0x0800 0x0 0x0 0x4 &mpic 0x1 0x1 | ||
371 | |||
372 | /* IDSEL 0x11 (PCI, 3.3V 32bit) @33MHz */ | ||
373 | 0x8800 0x0 0x0 0x1 &mpic 0x2 0x1 | ||
374 | 0x8800 0x0 0x0 0x2 &mpic 0x3 0x1 | ||
375 | 0x8800 0x0 0x0 0x3 &mpic 0x4 0x1 | ||
376 | 0x8800 0x0 0x0 0x4 &mpic 0x1 0x1>; | ||
377 | |||
378 | interrupt-parent = <&mpic>; | ||
379 | interrupts = <0x18 0x2>; | ||
380 | bus-range = <0 0>; | ||
381 | ranges = <0x02000000 0x0 0x80000000 0x80000000 0x0 0x10000000 | ||
382 | 0x01000000 0x0 0x00000000 0xe2000000 0x0 0x00800000>; | ||
383 | clock-frequency = <66000000>; | ||
384 | #interrupt-cells = <1>; | ||
385 | #size-cells = <2>; | ||
386 | #address-cells = <3>; | ||
387 | reg = <0xe0008000 0x1000>; | ||
388 | compatible = "fsl,mpc8540-pcix", "fsl,mpc8540-pci"; | ||
389 | device_type = "pci"; | ||
390 | }; | ||
391 | |||
392 | pci1: pcie@e000a000 { | ||
393 | interrupt-map-mask = <0xf800 0x0 0x0 0x7>; | ||
394 | interrupt-map = < | ||
395 | |||
396 | /* IDSEL 0x0 (PEX) */ | ||
397 | 0x0000 0x0 0x0 0x1 &mpic 0x0 0x1 | ||
398 | 0x0000 0x0 0x0 0x2 &mpic 0x1 0x1 | ||
399 | 0x0000 0x0 0x0 0x3 &mpic 0x2 0x1 | ||
400 | 0x0000 0x0 0x0 0x4 &mpic 0x3 0x1>; | ||
401 | |||
402 | interrupt-parent = <&mpic>; | ||
403 | interrupts = <0x1a 0x2>; | ||
404 | bus-range = <0x0 0xff>; | ||
405 | ranges = <0x02000000 0x0 0xa0000000 0xa0000000 0x0 0x10000000 | ||
406 | 0x01000000 0x0 0x00000000 0xe2800000 0x0 0x08000000>; | ||
407 | clock-frequency = <33000000>; | ||
408 | #interrupt-cells = <1>; | ||
409 | #size-cells = <2>; | ||
410 | #address-cells = <3>; | ||
411 | reg = <0xe000a000 0x1000>; | ||
412 | compatible = "fsl,mpc8548-pcie"; | ||
413 | device_type = "pci"; | ||
414 | pcie@0 { | ||
415 | reg = <0x0 0x0 0x0 0x0 0x0>; | ||
416 | #size-cells = <2>; | ||
417 | #address-cells = <3>; | ||
418 | device_type = "pci"; | ||
419 | ranges = <0x02000000 0x0 0xa0000000 | ||
420 | 0x02000000 0x0 0xa0000000 | ||
421 | 0x0 0x10000000 | ||
422 | |||
423 | 0x01000000 0x0 0x00000000 | ||
424 | 0x01000000 0x0 0x00000000 | ||
425 | 0x0 0x00800000>; | ||
426 | }; | ||
427 | }; | ||
428 | }; | 108 | }; |
109 | |||
110 | /include/ "sbc8548-post.dtsi" | ||
diff --git a/arch/powerpc/boot/dts/uc101.dts b/arch/powerpc/boot/dts/uc101.dts index ba83d5488ec6..5c462194ef06 100644 --- a/arch/powerpc/boot/dts/uc101.dts +++ b/arch/powerpc/boot/dts/uc101.dts | |||
@@ -13,54 +13,20 @@ | |||
13 | 13 | ||
14 | /include/ "mpc5200b.dtsi" | 14 | /include/ "mpc5200b.dtsi" |
15 | 15 | ||
16 | &gpt0 { gpio-controller; }; | ||
17 | &gpt1 { gpio-controller; }; | ||
18 | &gpt2 { gpio-controller; }; | ||
19 | &gpt3 { gpio-controller; }; | ||
20 | &gpt4 { gpio-controller; }; | ||
21 | &gpt5 { gpio-controller; }; | ||
22 | &gpt6 { gpio-controller; }; | ||
23 | &gpt7 { gpio-controller; }; | ||
24 | |||
16 | / { | 25 | / { |
17 | model = "manroland,uc101"; | 26 | model = "manroland,uc101"; |
18 | compatible = "manroland,uc101"; | 27 | compatible = "manroland,uc101"; |
19 | 28 | ||
20 | soc5200@f0000000 { | 29 | soc5200@f0000000 { |
21 | gpt0: timer@600 { // General Purpose Timer in GPIO mode | ||
22 | gpio-controller; | ||
23 | #gpio-cells = <2>; | ||
24 | }; | ||
25 | |||
26 | gpt1: timer@610 { // General Purpose Timer in GPIO mode | ||
27 | gpio-controller; | ||
28 | #gpio-cells = <2>; | ||
29 | }; | ||
30 | |||
31 | gpt2: timer@620 { // General Purpose Timer in GPIO mode | ||
32 | gpio-controller; | ||
33 | #gpio-cells = <2>; | ||
34 | }; | ||
35 | |||
36 | gpt3: timer@630 { // General Purpose Timer in GPIO mode | ||
37 | compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; | ||
38 | reg = <0x630 0x10>; | ||
39 | interrupts = <1 12 0>; | ||
40 | gpio-controller; | ||
41 | #gpio-cells = <2>; | ||
42 | }; | ||
43 | |||
44 | gpt4: timer@640 { // General Purpose Timer in GPIO mode | ||
45 | gpio-controller; | ||
46 | #gpio-cells = <2>; | ||
47 | }; | ||
48 | |||
49 | gpt5: timer@650 { // General Purpose Timer in GPIO mode | ||
50 | gpio-controller; | ||
51 | #gpio-cells = <2>; | ||
52 | }; | ||
53 | |||
54 | gpt6: timer@660 { // General Purpose Timer in GPIO mode | ||
55 | gpio-controller; | ||
56 | #gpio-cells = <2>; | ||
57 | }; | ||
58 | |||
59 | gpt7: timer@670 { // General Purpose Timer in GPIO mode | ||
60 | gpio-controller; | ||
61 | #gpio-cells = <2>; | ||
62 | }; | ||
63 | |||
64 | rtc@800 { | 30 | rtc@800 { |
65 | status = "disabled"; | 31 | status = "disabled"; |
66 | }; | 32 | }; |
diff --git a/arch/powerpc/boot/dts/virtex440-ml507.dts b/arch/powerpc/boot/dts/virtex440-ml507.dts index 52d8c1ad26a1..fc7073bc547e 100644 --- a/arch/powerpc/boot/dts/virtex440-ml507.dts +++ b/arch/powerpc/boot/dts/virtex440-ml507.dts | |||
@@ -272,6 +272,12 @@ | |||
272 | xlnx,temac-type = <0>; | 272 | xlnx,temac-type = <0>; |
273 | xlnx,txcsum = <1>; | 273 | xlnx,txcsum = <1>; |
274 | xlnx,txfifo = <0x1000>; | 274 | xlnx,txfifo = <0x1000>; |
275 | phy-handle = <&phy7>; | ||
276 | clock-frequency = <100000000>; | ||
277 | phy7: phy@7 { | ||
278 | compatible = "marvell,88e1111"; | ||
279 | reg = <7>; | ||
280 | } ; | ||
275 | } ; | 281 | } ; |
276 | } ; | 282 | } ; |
277 | IIC_EEPROM: i2c@81600000 { | 283 | IIC_EEPROM: i2c@81600000 { |
diff --git a/arch/powerpc/configs/83xx/kmeter1_defconfig b/arch/powerpc/configs/83xx/kmeter1_defconfig index a0dfef1fcdb7..e12e60c3b9a2 100644 --- a/arch/powerpc/configs/83xx/kmeter1_defconfig +++ b/arch/powerpc/configs/83xx/kmeter1_defconfig | |||
@@ -2,6 +2,8 @@ CONFIG_EXPERIMENTAL=y | |||
2 | # CONFIG_SWAP is not set | 2 | # CONFIG_SWAP is not set |
3 | CONFIG_SYSVIPC=y | 3 | CONFIG_SYSVIPC=y |
4 | CONFIG_POSIX_MQUEUE=y | 4 | CONFIG_POSIX_MQUEUE=y |
5 | CONFIG_NO_HZ=y | ||
6 | CONFIG_HIGH_RES_TIMERS=y | ||
5 | CONFIG_LOG_BUF_SHIFT=14 | 7 | CONFIG_LOG_BUF_SHIFT=14 |
6 | CONFIG_EXPERT=y | 8 | CONFIG_EXPERT=y |
7 | CONFIG_SLAB=y | 9 | CONFIG_SLAB=y |
@@ -16,8 +18,6 @@ CONFIG_PARTITION_ADVANCED=y | |||
16 | # CONFIG_PPC_PMAC is not set | 18 | # CONFIG_PPC_PMAC is not set |
17 | CONFIG_PPC_83xx=y | 19 | CONFIG_PPC_83xx=y |
18 | CONFIG_KMETER1=y | 20 | CONFIG_KMETER1=y |
19 | CONFIG_NO_HZ=y | ||
20 | CONFIG_HIGH_RES_TIMERS=y | ||
21 | CONFIG_PREEMPT=y | 21 | CONFIG_PREEMPT=y |
22 | # CONFIG_SECCOMP is not set | 22 | # CONFIG_SECCOMP is not set |
23 | CONFIG_NET=y | 23 | CONFIG_NET=y |
@@ -45,7 +45,6 @@ CONFIG_MTD_PHYSMAP_OF=y | |||
45 | CONFIG_MTD_PHRAM=y | 45 | CONFIG_MTD_PHRAM=y |
46 | CONFIG_MTD_UBI=y | 46 | CONFIG_MTD_UBI=y |
47 | CONFIG_MTD_UBI_GLUEBI=y | 47 | CONFIG_MTD_UBI_GLUEBI=y |
48 | CONFIG_MTD_UBI_DEBUG=y | ||
49 | CONFIG_PROC_DEVICETREE=y | 48 | CONFIG_PROC_DEVICETREE=y |
50 | CONFIG_NETDEVICES=y | 49 | CONFIG_NETDEVICES=y |
51 | CONFIG_DUMMY=y | 50 | CONFIG_DUMMY=y |
@@ -76,5 +75,4 @@ CONFIG_TMPFS=y | |||
76 | CONFIG_JFFS2_FS=y | 75 | CONFIG_JFFS2_FS=y |
77 | CONFIG_UBIFS_FS=y | 76 | CONFIG_UBIFS_FS=y |
78 | CONFIG_NFS_FS=y | 77 | CONFIG_NFS_FS=y |
79 | CONFIG_NFS_V3=y | ||
80 | CONFIG_ROOT_NFS=y | 78 | CONFIG_ROOT_NFS=y |
diff --git a/arch/powerpc/configs/85xx/ge_imp3a_defconfig b/arch/powerpc/configs/85xx/ge_imp3a_defconfig index f8c51a4ab995..c9765b54dd1a 100644 --- a/arch/powerpc/configs/85xx/ge_imp3a_defconfig +++ b/arch/powerpc/configs/85xx/ge_imp3a_defconfig | |||
@@ -34,7 +34,6 @@ CONFIG_PREEMPT=y | |||
34 | # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set | 34 | # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set |
35 | CONFIG_BINFMT_MISC=m | 35 | CONFIG_BINFMT_MISC=m |
36 | CONFIG_MATH_EMULATION=y | 36 | CONFIG_MATH_EMULATION=y |
37 | CONFIG_IRQ_ALL_CPUS=y | ||
38 | CONFIG_FORCE_MAX_ZONEORDER=17 | 37 | CONFIG_FORCE_MAX_ZONEORDER=17 |
39 | CONFIG_PCI=y | 38 | CONFIG_PCI=y |
40 | CONFIG_PCIEPORTBUS=y | 39 | CONFIG_PCIEPORTBUS=y |
diff --git a/arch/powerpc/configs/85xx/ppa8548_defconfig b/arch/powerpc/configs/85xx/ppa8548_defconfig new file mode 100644 index 000000000000..a11337de8aa2 --- /dev/null +++ b/arch/powerpc/configs/85xx/ppa8548_defconfig | |||
@@ -0,0 +1,65 @@ | |||
1 | CONFIG_PPC_85xx=y | ||
2 | CONFIG_PPA8548=y | ||
3 | CONFIG_DTC=y | ||
4 | CONFIG_DEFAULT_UIMAGE=y | ||
5 | CONFIG_IKCONFIG=y | ||
6 | CONFIG_IKCONFIG_PROC=y | ||
7 | # CONFIG_PCI is not set | ||
8 | # CONFIG_USB_SUPPORT is not set | ||
9 | CONFIG_ADVANCED_OPTIONS=y | ||
10 | CONFIG_LOWMEM_SIZE_BOOL=y | ||
11 | CONFIG_LOWMEM_SIZE=0x40000000 | ||
12 | CONFIG_LOWMEM_CAM_NUM_BOOL=y | ||
13 | CONFIG_LOWMEM_CAM_NUM=4 | ||
14 | CONFIG_PAGE_OFFSET_BOOL=y | ||
15 | CONFIG_PAGE_OFFSET=0xb0000000 | ||
16 | CONFIG_KERNEL_START_BOOL=y | ||
17 | CONFIG_KERNEL_START=0xb0000000 | ||
18 | # CONFIG_PHYSICAL_START_BOOL is not set | ||
19 | CONFIG_PHYSICAL_START=0x00000000 | ||
20 | CONFIG_PHYSICAL_ALIGN=0x04000000 | ||
21 | CONFIG_TASK_SIZE_BOOL=y | ||
22 | CONFIG_TASK_SIZE=0xb0000000 | ||
23 | |||
24 | CONFIG_FSL_LBC=y | ||
25 | CONFIG_FSL_DMA=y | ||
26 | CONFIG_FSL_RIO=y | ||
27 | |||
28 | CONFIG_RAPIDIO=y | ||
29 | CONFIG_RAPIDIO_DMA_ENGINE=y | ||
30 | CONFIG_RAPIDIO_TSI57X=y | ||
31 | CONFIG_RAPIDIO_TSI568=y | ||
32 | CONFIG_RAPIDIO_CPS_XX=y | ||
33 | CONFIG_RAPIDIO_CPS_GEN2=y | ||
34 | CONFIG_SERIAL_8250=y | ||
35 | CONFIG_SERIAL_8250_CONSOLE=y | ||
36 | CONFIG_PROC_DEVICETREE=y | ||
37 | |||
38 | CONFIG_MTD=y | ||
39 | CONFIG_MTD_BLKDEVS=y | ||
40 | CONFIG_MTD_BLOCK=y | ||
41 | CONFIG_MTD_CFI=y | ||
42 | CONFIG_MTD_CFI_AMDSTD=y | ||
43 | CONFIG_MTD_CFI_INTELEXT=y | ||
44 | CONFIG_MTD_CHAR=y | ||
45 | CONFIG_MTD_CMDLINE_PARTS=y | ||
46 | CONFIG_MTD_CONCAT=y | ||
47 | CONFIG_MTD_PARTITIONS=y | ||
48 | CONFIG_MTD_PHYSMAP_OF=y | ||
49 | |||
50 | CONFIG_I2C=y | ||
51 | CONFIG_I2C_MPC=y | ||
52 | CONFIG_I2C_CHARDEV | ||
53 | CONFIG_RTC_CLASS=y | ||
54 | CONFIG_RTC_HCTOSYS=y | ||
55 | CONFIG_RTC_DRV_ISL1208=y | ||
56 | |||
57 | CONFIG_NET=y | ||
58 | CONFIG_INET=y | ||
59 | CONFIG_IP_PNP=y | ||
60 | CONFIG_NETDEVICES=y | ||
61 | CONFIG_MII=y | ||
62 | CONFIG_GIANFAR=y | ||
63 | CONFIG_MARVELL_PHY=y | ||
64 | CONFIG_NFS_FS=y | ||
65 | CONFIG_ROOT_NFS=y | ||
diff --git a/arch/powerpc/configs/85xx/sbc8548_defconfig b/arch/powerpc/configs/85xx/sbc8548_defconfig index 5b2b651dfb98..008a7a47b89b 100644 --- a/arch/powerpc/configs/85xx/sbc8548_defconfig +++ b/arch/powerpc/configs/85xx/sbc8548_defconfig | |||
@@ -55,3 +55,22 @@ CONFIG_ROOT_NFS=y | |||
55 | # CONFIG_RCU_CPU_STALL_DETECTOR is not set | 55 | # CONFIG_RCU_CPU_STALL_DETECTOR is not set |
56 | CONFIG_SYSCTL_SYSCALL_CHECK=y | 56 | CONFIG_SYSCTL_SYSCALL_CHECK=y |
57 | # CONFIG_CRYPTO_ANSI_CPRNG is not set | 57 | # CONFIG_CRYPTO_ANSI_CPRNG is not set |
58 | CONFIG_MTD=y | ||
59 | CONFIG_MTD_OF_PARTS=y | ||
60 | CONFIG_MTD_CHAR=y | ||
61 | CONFIG_MTD_BLKDEVS=y | ||
62 | CONFIG_MTD_BLOCK=y | ||
63 | CONFIG_MTD_CFI=y | ||
64 | CONFIG_MTD_GEN_PROBE=y | ||
65 | CONFIG_MTD_CFI_ADV_OPTIONS=y | ||
66 | CONFIG_MTD_CFI_NOSWAP=y | ||
67 | CONFIG_MTD_CFI_GEOMETRY=y | ||
68 | CONFIG_MTD_MAP_BANK_WIDTH_1=y | ||
69 | CONFIG_MTD_MAP_BANK_WIDTH_2=y | ||
70 | CONFIG_MTD_MAP_BANK_WIDTH_4=y | ||
71 | CONFIG_MTD_CFI_I1=y | ||
72 | CONFIG_MTD_CFI_I2=y | ||
73 | CONFIG_MTD_CFI_I4=y | ||
74 | CONFIG_MTD_CFI_INTELEXT=y | ||
75 | CONFIG_MTD_CFI_UTIL=y | ||
76 | CONFIG_MTD_PHYSMAP_OF=y | ||
diff --git a/arch/powerpc/configs/86xx/gef_ppc9a_defconfig b/arch/powerpc/configs/86xx/gef_ppc9a_defconfig index da731c2fe984..f2f6734d5f76 100644 --- a/arch/powerpc/configs/86xx/gef_ppc9a_defconfig +++ b/arch/powerpc/configs/86xx/gef_ppc9a_defconfig | |||
@@ -25,7 +25,6 @@ CONFIG_HIGH_RES_TIMERS=y | |||
25 | CONFIG_HZ_1000=y | 25 | CONFIG_HZ_1000=y |
26 | CONFIG_PREEMPT=y | 26 | CONFIG_PREEMPT=y |
27 | CONFIG_BINFMT_MISC=m | 27 | CONFIG_BINFMT_MISC=m |
28 | CONFIG_IRQ_ALL_CPUS=y | ||
29 | CONFIG_SPARSE_IRQ=y | 28 | CONFIG_SPARSE_IRQ=y |
30 | CONFIG_PCI=y | 29 | CONFIG_PCI=y |
31 | CONFIG_PCIEPORTBUS=y | 30 | CONFIG_PCIEPORTBUS=y |
diff --git a/arch/powerpc/configs/86xx/gef_sbc310_defconfig b/arch/powerpc/configs/86xx/gef_sbc310_defconfig index 2149360a1e62..be73219212b7 100644 --- a/arch/powerpc/configs/86xx/gef_sbc310_defconfig +++ b/arch/powerpc/configs/86xx/gef_sbc310_defconfig | |||
@@ -25,7 +25,6 @@ CONFIG_HIGH_RES_TIMERS=y | |||
25 | CONFIG_HZ_1000=y | 25 | CONFIG_HZ_1000=y |
26 | CONFIG_PREEMPT=y | 26 | CONFIG_PREEMPT=y |
27 | CONFIG_BINFMT_MISC=y | 27 | CONFIG_BINFMT_MISC=y |
28 | CONFIG_IRQ_ALL_CPUS=y | ||
29 | CONFIG_SPARSE_IRQ=y | 28 | CONFIG_SPARSE_IRQ=y |
30 | CONFIG_PCI=y | 29 | CONFIG_PCI=y |
31 | CONFIG_PCIEPORTBUS=y | 30 | CONFIG_PCIEPORTBUS=y |
diff --git a/arch/powerpc/configs/86xx/gef_sbc610_defconfig b/arch/powerpc/configs/86xx/gef_sbc610_defconfig index af2e8e1edba6..b3e2b1058f27 100644 --- a/arch/powerpc/configs/86xx/gef_sbc610_defconfig +++ b/arch/powerpc/configs/86xx/gef_sbc610_defconfig | |||
@@ -25,7 +25,6 @@ CONFIG_HIGH_RES_TIMERS=y | |||
25 | CONFIG_HZ_1000=y | 25 | CONFIG_HZ_1000=y |
26 | CONFIG_PREEMPT=y | 26 | CONFIG_PREEMPT=y |
27 | CONFIG_BINFMT_MISC=m | 27 | CONFIG_BINFMT_MISC=m |
28 | CONFIG_IRQ_ALL_CPUS=y | ||
29 | CONFIG_SPARSE_IRQ=y | 28 | CONFIG_SPARSE_IRQ=y |
30 | CONFIG_PCI=y | 29 | CONFIG_PCI=y |
31 | CONFIG_PCIEPORTBUS=y | 30 | CONFIG_PCIEPORTBUS=y |
diff --git a/arch/powerpc/configs/86xx/sbc8641d_defconfig b/arch/powerpc/configs/86xx/sbc8641d_defconfig index 0a92ca045641..1a62baf855e9 100644 --- a/arch/powerpc/configs/86xx/sbc8641d_defconfig +++ b/arch/powerpc/configs/86xx/sbc8641d_defconfig | |||
@@ -23,7 +23,6 @@ CONFIG_SBC8641D=y | |||
23 | CONFIG_HIGH_RES_TIMERS=y | 23 | CONFIG_HIGH_RES_TIMERS=y |
24 | CONFIG_PREEMPT=y | 24 | CONFIG_PREEMPT=y |
25 | CONFIG_BINFMT_MISC=m | 25 | CONFIG_BINFMT_MISC=m |
26 | CONFIG_IRQ_ALL_CPUS=y | ||
27 | CONFIG_SPARSE_IRQ=y | 26 | CONFIG_SPARSE_IRQ=y |
28 | CONFIG_PCI=y | 27 | CONFIG_PCI=y |
29 | CONFIG_PCIEPORTBUS=y | 28 | CONFIG_PCIEPORTBUS=y |
diff --git a/arch/powerpc/configs/corenet32_smp_defconfig b/arch/powerpc/configs/corenet32_smp_defconfig index 1c0f2432ecdb..60027c2a7034 100644 --- a/arch/powerpc/configs/corenet32_smp_defconfig +++ b/arch/powerpc/configs/corenet32_smp_defconfig | |||
@@ -32,7 +32,6 @@ CONFIG_HIGHMEM=y | |||
32 | # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set | 32 | # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set |
33 | CONFIG_BINFMT_MISC=m | 33 | CONFIG_BINFMT_MISC=m |
34 | CONFIG_KEXEC=y | 34 | CONFIG_KEXEC=y |
35 | CONFIG_IRQ_ALL_CPUS=y | ||
36 | CONFIG_FORCE_MAX_ZONEORDER=13 | 35 | CONFIG_FORCE_MAX_ZONEORDER=13 |
37 | CONFIG_PCI=y | 36 | CONFIG_PCI=y |
38 | CONFIG_PCIEPORTBUS=y | 37 | CONFIG_PCIEPORTBUS=y |
diff --git a/arch/powerpc/configs/corenet64_smp_defconfig b/arch/powerpc/configs/corenet64_smp_defconfig index f7df8362911f..3d139fa04050 100644 --- a/arch/powerpc/configs/corenet64_smp_defconfig +++ b/arch/powerpc/configs/corenet64_smp_defconfig | |||
@@ -26,7 +26,6 @@ CONFIG_P5020_DS=y | |||
26 | CONFIG_P5040_DS=y | 26 | CONFIG_P5040_DS=y |
27 | # CONFIG_PPC_OF_BOOT_TRAMPOLINE is not set | 27 | # CONFIG_PPC_OF_BOOT_TRAMPOLINE is not set |
28 | CONFIG_BINFMT_MISC=m | 28 | CONFIG_BINFMT_MISC=m |
29 | CONFIG_IRQ_ALL_CPUS=y | ||
30 | CONFIG_PCIEPORTBUS=y | 29 | CONFIG_PCIEPORTBUS=y |
31 | CONFIG_PCI_MSI=y | 30 | CONFIG_PCI_MSI=y |
32 | CONFIG_RAPIDIO=y | 31 | CONFIG_RAPIDIO=y |
diff --git a/arch/powerpc/configs/mpc85xx_smp_defconfig b/arch/powerpc/configs/mpc85xx_smp_defconfig index 502cd9e027e4..8d00ea5b8a9f 100644 --- a/arch/powerpc/configs/mpc85xx_smp_defconfig +++ b/arch/powerpc/configs/mpc85xx_smp_defconfig | |||
@@ -49,7 +49,6 @@ CONFIG_QE_GPIO=y | |||
49 | CONFIG_HIGHMEM=y | 49 | CONFIG_HIGHMEM=y |
50 | CONFIG_BINFMT_MISC=m | 50 | CONFIG_BINFMT_MISC=m |
51 | CONFIG_MATH_EMULATION=y | 51 | CONFIG_MATH_EMULATION=y |
52 | CONFIG_IRQ_ALL_CPUS=y | ||
53 | CONFIG_FORCE_MAX_ZONEORDER=12 | 52 | CONFIG_FORCE_MAX_ZONEORDER=12 |
54 | CONFIG_PCI=y | 53 | CONFIG_PCI=y |
55 | CONFIG_PCI_MSI=y | 54 | CONFIG_PCI_MSI=y |
diff --git a/arch/powerpc/configs/pasemi_defconfig b/arch/powerpc/configs/pasemi_defconfig index bcedeea0df89..bd8a6f71944f 100644 --- a/arch/powerpc/configs/pasemi_defconfig +++ b/arch/powerpc/configs/pasemi_defconfig | |||
@@ -1,28 +1,27 @@ | |||
1 | CONFIG_PPC64=y | 1 | CONFIG_PPC64=y |
2 | CONFIG_ALTIVEC=y | 2 | CONFIG_ALTIVEC=y |
3 | # CONFIG_VIRT_CPU_ACCOUNTING_NATIVE is not set | ||
4 | CONFIG_SMP=y | 3 | CONFIG_SMP=y |
5 | CONFIG_NR_CPUS=2 | 4 | CONFIG_NR_CPUS=2 |
6 | CONFIG_EXPERIMENTAL=y | 5 | CONFIG_EXPERIMENTAL=y |
7 | CONFIG_SYSVIPC=y | 6 | CONFIG_SYSVIPC=y |
7 | CONFIG_NO_HZ=y | ||
8 | CONFIG_HIGH_RES_TIMERS=y | ||
8 | CONFIG_BLK_DEV_INITRD=y | 9 | CONFIG_BLK_DEV_INITRD=y |
9 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | ||
10 | CONFIG_PROFILING=y | 10 | CONFIG_PROFILING=y |
11 | CONFIG_OPROFILE=y | 11 | CONFIG_OPROFILE=y |
12 | CONFIG_MODULES=y | 12 | CONFIG_MODULES=y |
13 | CONFIG_MODULE_UNLOAD=y | 13 | CONFIG_MODULE_UNLOAD=y |
14 | # CONFIG_BLK_DEV_BSG is not set | 14 | # CONFIG_BLK_DEV_BSG is not set |
15 | CONFIG_PARTITION_ADVANCED=y | ||
16 | CONFIG_MAC_PARTITION=y | ||
15 | # CONFIG_PPC_PSERIES is not set | 17 | # CONFIG_PPC_PSERIES is not set |
16 | # CONFIG_PPC_PMAC is not set | 18 | # CONFIG_PPC_PMAC is not set |
17 | CONFIG_PPC_PASEMI=y | 19 | CONFIG_PPC_PASEMI=y |
18 | CONFIG_PPC_PASEMI_IOMMU=y | 20 | CONFIG_PPC_PASEMI_IOMMU=y |
19 | CONFIG_CPU_FREQ=y | 21 | CONFIG_CPU_FREQ=y |
20 | CONFIG_CPU_FREQ_DEBUG=y | ||
21 | CONFIG_CPU_FREQ_GOV_POWERSAVE=y | 22 | CONFIG_CPU_FREQ_GOV_POWERSAVE=y |
22 | CONFIG_CPU_FREQ_GOV_USERSPACE=y | 23 | CONFIG_CPU_FREQ_GOV_USERSPACE=y |
23 | CONFIG_CPU_FREQ_GOV_ONDEMAND=y | 24 | CONFIG_CPU_FREQ_GOV_ONDEMAND=y |
24 | CONFIG_NO_HZ=y | ||
25 | CONFIG_HIGH_RES_TIMERS=y | ||
26 | CONFIG_HZ_1000=y | 25 | CONFIG_HZ_1000=y |
27 | CONFIG_PPC_64K_PAGES=y | 26 | CONFIG_PPC_64K_PAGES=y |
28 | # CONFIG_SECCOMP is not set | 27 | # CONFIG_SECCOMP is not set |
@@ -47,7 +46,6 @@ CONFIG_INET_ESP=y | |||
47 | # CONFIG_IPV6 is not set | 46 | # CONFIG_IPV6 is not set |
48 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | 47 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" |
49 | CONFIG_MTD=y | 48 | CONFIG_MTD=y |
50 | CONFIG_MTD_CONCAT=y | ||
51 | CONFIG_MTD_CHAR=y | 49 | CONFIG_MTD_CHAR=y |
52 | CONFIG_MTD_BLOCK=y | 50 | CONFIG_MTD_BLOCK=y |
53 | CONFIG_MTD_SLRAM=y | 51 | CONFIG_MTD_SLRAM=y |
@@ -58,7 +56,6 @@ CONFIG_PROC_DEVICETREE=y | |||
58 | CONFIG_BLK_DEV_LOOP=y | 56 | CONFIG_BLK_DEV_LOOP=y |
59 | CONFIG_BLK_DEV_RAM=y | 57 | CONFIG_BLK_DEV_RAM=y |
60 | CONFIG_BLK_DEV_RAM_SIZE=16384 | 58 | CONFIG_BLK_DEV_RAM_SIZE=16384 |
61 | CONFIG_MISC_DEVICES=y | ||
62 | CONFIG_EEPROM_LEGACY=y | 59 | CONFIG_EEPROM_LEGACY=y |
63 | CONFIG_IDE=y | 60 | CONFIG_IDE=y |
64 | CONFIG_BLK_DEV_IDECD=y | 61 | CONFIG_BLK_DEV_IDECD=y |
@@ -91,21 +88,19 @@ CONFIG_BLK_DEV_DM=y | |||
91 | CONFIG_DM_CRYPT=y | 88 | CONFIG_DM_CRYPT=y |
92 | CONFIG_NETDEVICES=y | 89 | CONFIG_NETDEVICES=y |
93 | CONFIG_DUMMY=y | 90 | CONFIG_DUMMY=y |
94 | CONFIG_MARVELL_PHY=y | ||
95 | CONFIG_NET_ETHERNET=y | ||
96 | CONFIG_MII=y | 91 | CONFIG_MII=y |
97 | CONFIG_NET_PCI=y | ||
98 | CONFIG_E1000=y | ||
99 | CONFIG_TIGON3=y | 92 | CONFIG_TIGON3=y |
93 | CONFIG_E1000=y | ||
100 | CONFIG_PASEMI_MAC=y | 94 | CONFIG_PASEMI_MAC=y |
95 | CONFIG_MARVELL_PHY=y | ||
101 | CONFIG_INPUT_JOYDEV=y | 96 | CONFIG_INPUT_JOYDEV=y |
102 | CONFIG_INPUT_EVDEV=y | 97 | CONFIG_INPUT_EVDEV=y |
103 | # CONFIG_KEYBOARD_ATKBD is not set | 98 | # CONFIG_KEYBOARD_ATKBD is not set |
104 | # CONFIG_MOUSE_PS2 is not set | 99 | # CONFIG_MOUSE_PS2 is not set |
105 | # CONFIG_SERIO is not set | 100 | # CONFIG_SERIO is not set |
101 | CONFIG_LEGACY_PTY_COUNT=4 | ||
106 | CONFIG_SERIAL_8250=y | 102 | CONFIG_SERIAL_8250=y |
107 | CONFIG_SERIAL_8250_CONSOLE=y | 103 | CONFIG_SERIAL_8250_CONSOLE=y |
108 | CONFIG_LEGACY_PTY_COUNT=4 | ||
109 | CONFIG_HW_RANDOM=y | 104 | CONFIG_HW_RANDOM=y |
110 | CONFIG_RAW_DRIVER=y | 105 | CONFIG_RAW_DRIVER=y |
111 | CONFIG_I2C_CHARDEV=y | 106 | CONFIG_I2C_CHARDEV=y |
@@ -146,14 +141,11 @@ CONFIG_HID_TOPSEED=y | |||
146 | CONFIG_HID_THRUSTMASTER=y | 141 | CONFIG_HID_THRUSTMASTER=y |
147 | CONFIG_HID_ZEROPLUS=y | 142 | CONFIG_HID_ZEROPLUS=y |
148 | CONFIG_USB=y | 143 | CONFIG_USB=y |
149 | CONFIG_USB_DEVICEFS=y | ||
150 | # CONFIG_USB_DEVICE_CLASS is not set | ||
151 | CONFIG_USB_EHCI_HCD=y | 144 | CONFIG_USB_EHCI_HCD=y |
152 | CONFIG_USB_OHCI_HCD=y | 145 | CONFIG_USB_OHCI_HCD=y |
153 | CONFIG_USB_UHCI_HCD=y | 146 | CONFIG_USB_UHCI_HCD=y |
154 | CONFIG_USB_SL811_HCD=y | 147 | CONFIG_USB_SL811_HCD=y |
155 | CONFIG_USB_STORAGE=y | 148 | CONFIG_USB_STORAGE=y |
156 | CONFIG_USB_LIBUSUAL=y | ||
157 | CONFIG_EDAC=y | 149 | CONFIG_EDAC=y |
158 | CONFIG_EDAC_MM_EDAC=y | 150 | CONFIG_EDAC_MM_EDAC=y |
159 | CONFIG_EDAC_PASEMI=y | 151 | CONFIG_EDAC_PASEMI=y |
@@ -164,8 +156,6 @@ CONFIG_EXT2_FS_XATTR=y | |||
164 | CONFIG_EXT2_FS_POSIX_ACL=y | 156 | CONFIG_EXT2_FS_POSIX_ACL=y |
165 | CONFIG_EXT3_FS=y | 157 | CONFIG_EXT3_FS=y |
166 | # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set | 158 | # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set |
167 | CONFIG_INOTIFY=y | ||
168 | CONFIG_AUTOFS_FS=y | ||
169 | CONFIG_AUTOFS4_FS=y | 159 | CONFIG_AUTOFS4_FS=y |
170 | CONFIG_ISO9660_FS=y | 160 | CONFIG_ISO9660_FS=y |
171 | CONFIG_UDF_FS=y | 161 | CONFIG_UDF_FS=y |
@@ -177,27 +167,22 @@ CONFIG_HUGETLBFS=y | |||
177 | CONFIG_CONFIGFS_FS=y | 167 | CONFIG_CONFIGFS_FS=y |
178 | CONFIG_JFFS2_FS=y | 168 | CONFIG_JFFS2_FS=y |
179 | CONFIG_NFS_FS=y | 169 | CONFIG_NFS_FS=y |
180 | CONFIG_NFS_V3=y | ||
181 | CONFIG_ROOT_NFS=y | 170 | CONFIG_ROOT_NFS=y |
182 | CONFIG_NFSD=y | 171 | CONFIG_NFSD=y |
183 | CONFIG_NFSD_V4=y | 172 | CONFIG_NFSD_V4=y |
184 | CONFIG_PARTITION_ADVANCED=y | ||
185 | CONFIG_MAC_PARTITION=y | ||
186 | CONFIG_NLS_CODEPAGE_437=y | 173 | CONFIG_NLS_CODEPAGE_437=y |
187 | CONFIG_NLS_ISO8859_1=y | 174 | CONFIG_NLS_ISO8859_1=y |
188 | CONFIG_CRC_CCITT=y | 175 | CONFIG_CRC_CCITT=y |
176 | CONFIG_PRINTK_TIME=y | ||
189 | CONFIG_MAGIC_SYSRQ=y | 177 | CONFIG_MAGIC_SYSRQ=y |
190 | CONFIG_DEBUG_FS=y | 178 | CONFIG_DEBUG_FS=y |
191 | CONFIG_DEBUG_KERNEL=y | 179 | CONFIG_DEBUG_KERNEL=y |
192 | CONFIG_DETECT_HUNG_TASK=y | 180 | CONFIG_DETECT_HUNG_TASK=y |
193 | # CONFIG_SCHED_DEBUG is not set | 181 | # CONFIG_SCHED_DEBUG is not set |
194 | # CONFIG_RCU_CPU_STALL_DETECTOR is not set | ||
195 | CONFIG_SYSCTL_SYSCALL_CHECK=y | ||
196 | CONFIG_XMON=y | 182 | CONFIG_XMON=y |
197 | CONFIG_XMON_DEFAULT=y | 183 | CONFIG_XMON_DEFAULT=y |
198 | CONFIG_CRYPTO_MD4=y | 184 | CONFIG_CRYPTO_MD4=y |
199 | CONFIG_CRYPTO_SHA256=y | 185 | CONFIG_CRYPTO_SHA256=y |
200 | CONFIG_CRYPTO_SHA512=y | 186 | CONFIG_CRYPTO_SHA512=y |
201 | CONFIG_CRYPTO_AES=y | ||
202 | CONFIG_CRYPTO_BLOWFISH=y | 187 | CONFIG_CRYPTO_BLOWFISH=y |
203 | # CONFIG_CRYPTO_ANSI_CPRNG is not set | 188 | # CONFIG_CRYPTO_ANSI_CPRNG is not set |
diff --git a/arch/powerpc/configs/ppc64_defconfig b/arch/powerpc/configs/ppc64_defconfig index 6d03530b7506..aef3f71de5ad 100644 --- a/arch/powerpc/configs/ppc64_defconfig +++ b/arch/powerpc/configs/ppc64_defconfig | |||
@@ -5,6 +5,9 @@ CONFIG_SMP=y | |||
5 | CONFIG_EXPERIMENTAL=y | 5 | CONFIG_EXPERIMENTAL=y |
6 | CONFIG_SYSVIPC=y | 6 | CONFIG_SYSVIPC=y |
7 | CONFIG_POSIX_MQUEUE=y | 7 | CONFIG_POSIX_MQUEUE=y |
8 | CONFIG_IRQ_DOMAIN_DEBUG=y | ||
9 | CONFIG_NO_HZ=y | ||
10 | CONFIG_HIGH_RES_TIMERS=y | ||
8 | CONFIG_TASKSTATS=y | 11 | CONFIG_TASKSTATS=y |
9 | CONFIG_TASK_DELAY_ACCT=y | 12 | CONFIG_TASK_DELAY_ACCT=y |
10 | CONFIG_IKCONFIG=y | 13 | CONFIG_IKCONFIG=y |
@@ -21,6 +24,8 @@ CONFIG_MODULES=y | |||
21 | CONFIG_MODULE_UNLOAD=y | 24 | CONFIG_MODULE_UNLOAD=y |
22 | CONFIG_MODVERSIONS=y | 25 | CONFIG_MODVERSIONS=y |
23 | CONFIG_MODULE_SRCVERSION_ALL=y | 26 | CONFIG_MODULE_SRCVERSION_ALL=y |
27 | CONFIG_PARTITION_ADVANCED=y | ||
28 | CONFIG_EFI_PARTITION=y | ||
24 | CONFIG_PPC_SPLPAR=y | 29 | CONFIG_PPC_SPLPAR=y |
25 | CONFIG_SCANLOG=m | 30 | CONFIG_SCANLOG=m |
26 | CONFIG_PPC_SMLPAR=y | 31 | CONFIG_PPC_SMLPAR=y |
@@ -42,10 +47,9 @@ CONFIG_CPU_FREQ=y | |||
42 | CONFIG_CPU_FREQ_GOV_POWERSAVE=y | 47 | CONFIG_CPU_FREQ_GOV_POWERSAVE=y |
43 | CONFIG_CPU_FREQ_GOV_USERSPACE=y | 48 | CONFIG_CPU_FREQ_GOV_USERSPACE=y |
44 | CONFIG_CPU_FREQ_PMAC64=y | 49 | CONFIG_CPU_FREQ_PMAC64=y |
45 | CONFIG_NO_HZ=y | ||
46 | CONFIG_HIGH_RES_TIMERS=y | ||
47 | CONFIG_HZ_100=y | 50 | CONFIG_HZ_100=y |
48 | CONFIG_BINFMT_MISC=m | 51 | CONFIG_BINFMT_MISC=m |
52 | CONFIG_PPC_TRANSACTIONAL_MEM=y | ||
49 | CONFIG_HOTPLUG_CPU=y | 53 | CONFIG_HOTPLUG_CPU=y |
50 | CONFIG_KEXEC=y | 54 | CONFIG_KEXEC=y |
51 | CONFIG_IRQ_ALL_CPUS=y | 55 | CONFIG_IRQ_ALL_CPUS=y |
@@ -73,7 +77,6 @@ CONFIG_INET_ESP=m | |||
73 | CONFIG_INET_IPCOMP=m | 77 | CONFIG_INET_IPCOMP=m |
74 | # CONFIG_IPV6 is not set | 78 | # CONFIG_IPV6 is not set |
75 | CONFIG_NETFILTER=y | 79 | CONFIG_NETFILTER=y |
76 | CONFIG_NETFILTER_NETLINK_QUEUE=m | ||
77 | CONFIG_NF_CONNTRACK=m | 80 | CONFIG_NF_CONNTRACK=m |
78 | CONFIG_NF_CONNTRACK_EVENTS=y | 81 | CONFIG_NF_CONNTRACK_EVENTS=y |
79 | CONFIG_NF_CT_PROTO_SCTP=m | 82 | CONFIG_NF_CT_PROTO_SCTP=m |
@@ -130,19 +133,12 @@ CONFIG_NETFILTER_XT_MATCH_U32=m | |||
130 | CONFIG_NF_CONNTRACK_IPV4=m | 133 | CONFIG_NF_CONNTRACK_IPV4=m |
131 | CONFIG_IP_NF_QUEUE=m | 134 | CONFIG_IP_NF_QUEUE=m |
132 | CONFIG_IP_NF_IPTABLES=m | 135 | CONFIG_IP_NF_IPTABLES=m |
133 | CONFIG_IP_NF_MATCH_ADDRTYPE=m | ||
134 | CONFIG_IP_NF_MATCH_AH=m | 136 | CONFIG_IP_NF_MATCH_AH=m |
135 | CONFIG_IP_NF_MATCH_ECN=m | 137 | CONFIG_IP_NF_MATCH_ECN=m |
136 | CONFIG_IP_NF_MATCH_TTL=m | 138 | CONFIG_IP_NF_MATCH_TTL=m |
137 | CONFIG_IP_NF_FILTER=m | 139 | CONFIG_IP_NF_FILTER=m |
138 | CONFIG_IP_NF_TARGET_REJECT=m | 140 | CONFIG_IP_NF_TARGET_REJECT=m |
139 | CONFIG_IP_NF_TARGET_LOG=m | ||
140 | CONFIG_IP_NF_TARGET_ULOG=m | 141 | CONFIG_IP_NF_TARGET_ULOG=m |
141 | CONFIG_NF_NAT=m | ||
142 | CONFIG_IP_NF_TARGET_MASQUERADE=m | ||
143 | CONFIG_IP_NF_TARGET_NETMAP=m | ||
144 | CONFIG_IP_NF_TARGET_REDIRECT=m | ||
145 | CONFIG_NF_NAT_SNMP_BASIC=m | ||
146 | CONFIG_IP_NF_MANGLE=m | 142 | CONFIG_IP_NF_MANGLE=m |
147 | CONFIG_IP_NF_TARGET_CLUSTERIP=m | 143 | CONFIG_IP_NF_TARGET_CLUSTERIP=m |
148 | CONFIG_IP_NF_TARGET_ECN=m | 144 | CONFIG_IP_NF_TARGET_ECN=m |
@@ -151,7 +147,10 @@ CONFIG_IP_NF_RAW=m | |||
151 | CONFIG_IP_NF_ARPTABLES=m | 147 | CONFIG_IP_NF_ARPTABLES=m |
152 | CONFIG_IP_NF_ARPFILTER=m | 148 | CONFIG_IP_NF_ARPFILTER=m |
153 | CONFIG_IP_NF_ARP_MANGLE=m | 149 | CONFIG_IP_NF_ARP_MANGLE=m |
150 | CONFIG_BPF_JIT=y | ||
154 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | 151 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" |
152 | CONFIG_DEVTMPFS=y | ||
153 | CONFIG_DEVTMPFS_MOUNT=y | ||
155 | CONFIG_PROC_DEVICETREE=y | 154 | CONFIG_PROC_DEVICETREE=y |
156 | CONFIG_BLK_DEV_FD=y | 155 | CONFIG_BLK_DEV_FD=y |
157 | CONFIG_BLK_DEV_LOOP=y | 156 | CONFIG_BLK_DEV_LOOP=y |
@@ -173,7 +172,6 @@ CONFIG_CHR_DEV_SG=y | |||
173 | CONFIG_SCSI_MULTI_LUN=y | 172 | CONFIG_SCSI_MULTI_LUN=y |
174 | CONFIG_SCSI_CONSTANTS=y | 173 | CONFIG_SCSI_CONSTANTS=y |
175 | CONFIG_SCSI_FC_ATTRS=y | 174 | CONFIG_SCSI_FC_ATTRS=y |
176 | CONFIG_SCSI_SAS_ATTRS=m | ||
177 | CONFIG_SCSI_CXGB3_ISCSI=m | 175 | CONFIG_SCSI_CXGB3_ISCSI=m |
178 | CONFIG_SCSI_CXGB4_ISCSI=m | 176 | CONFIG_SCSI_CXGB4_ISCSI=m |
179 | CONFIG_SCSI_BNX2_ISCSI=m | 177 | CONFIG_SCSI_BNX2_ISCSI=m |
@@ -205,13 +203,6 @@ CONFIG_DM_SNAPSHOT=m | |||
205 | CONFIG_DM_MIRROR=m | 203 | CONFIG_DM_MIRROR=m |
206 | CONFIG_DM_ZERO=m | 204 | CONFIG_DM_ZERO=m |
207 | CONFIG_DM_MULTIPATH=m | 205 | CONFIG_DM_MULTIPATH=m |
208 | CONFIG_IEEE1394=y | ||
209 | CONFIG_IEEE1394_OHCI1394=y | ||
210 | CONFIG_IEEE1394_SBP2=m | ||
211 | CONFIG_IEEE1394_ETH1394=m | ||
212 | CONFIG_IEEE1394_RAWIO=y | ||
213 | CONFIG_IEEE1394_VIDEO1394=m | ||
214 | CONFIG_IEEE1394_DV1394=m | ||
215 | CONFIG_ADB_PMU=y | 206 | CONFIG_ADB_PMU=y |
216 | CONFIG_PMAC_SMU=y | 207 | CONFIG_PMAC_SMU=y |
217 | CONFIG_THERM_PM72=y | 208 | CONFIG_THERM_PM72=y |
@@ -220,50 +211,43 @@ CONFIG_WINDFARM_PM81=y | |||
220 | CONFIG_WINDFARM_PM91=y | 211 | CONFIG_WINDFARM_PM91=y |
221 | CONFIG_WINDFARM_PM112=y | 212 | CONFIG_WINDFARM_PM112=y |
222 | CONFIG_WINDFARM_PM121=y | 213 | CONFIG_WINDFARM_PM121=y |
223 | CONFIG_NETDEVICES=y | ||
224 | CONFIG_DUMMY=m | ||
225 | CONFIG_BONDING=m | 214 | CONFIG_BONDING=m |
215 | CONFIG_DUMMY=m | ||
216 | CONFIG_NETCONSOLE=y | ||
217 | CONFIG_NETPOLL_TRAP=y | ||
226 | CONFIG_TUN=m | 218 | CONFIG_TUN=m |
227 | CONFIG_MARVELL_PHY=y | ||
228 | CONFIG_BROADCOM_PHY=m | ||
229 | CONFIG_NET_ETHERNET=y | ||
230 | CONFIG_SUNGEM=y | ||
231 | CONFIG_NET_VENDOR_3COM=y | ||
232 | CONFIG_VORTEX=y | 219 | CONFIG_VORTEX=y |
233 | CONFIG_IBMVETH=m | ||
234 | CONFIG_NET_PCI=y | ||
235 | CONFIG_PCNET32=y | ||
236 | CONFIG_E100=y | ||
237 | CONFIG_ACENIC=m | 220 | CONFIG_ACENIC=m |
238 | CONFIG_ACENIC_OMIT_TIGON_I=y | 221 | CONFIG_ACENIC_OMIT_TIGON_I=y |
239 | CONFIG_E1000=y | 222 | CONFIG_PCNET32=y |
240 | CONFIG_E1000E=y | ||
241 | CONFIG_TIGON3=y | 223 | CONFIG_TIGON3=y |
242 | CONFIG_BNX2=m | ||
243 | CONFIG_SPIDER_NET=m | ||
244 | CONFIG_GELIC_NET=m | ||
245 | CONFIG_GELIC_WIRELESS=y | ||
246 | CONFIG_CHELSIO_T1=m | 224 | CONFIG_CHELSIO_T1=m |
247 | CONFIG_CHELSIO_T3=m | 225 | CONFIG_BE2NET=m |
248 | CONFIG_CHELSIO_T4=m | 226 | CONFIG_S2IO=m |
227 | CONFIG_IBMVETH=m | ||
249 | CONFIG_EHEA=m | 228 | CONFIG_EHEA=m |
250 | CONFIG_IXGBE=m | 229 | CONFIG_E100=y |
230 | CONFIG_E1000=y | ||
231 | CONFIG_E1000E=y | ||
251 | CONFIG_IXGB=m | 232 | CONFIG_IXGB=m |
252 | CONFIG_S2IO=m | 233 | CONFIG_IXGBE=m |
234 | CONFIG_MLX4_EN=m | ||
253 | CONFIG_MYRI10GE=m | 235 | CONFIG_MYRI10GE=m |
254 | CONFIG_NETXEN_NIC=m | ||
255 | CONFIG_PASEMI_MAC=y | 236 | CONFIG_PASEMI_MAC=y |
256 | CONFIG_MLX4_EN=m | ||
257 | CONFIG_QLGE=m | 237 | CONFIG_QLGE=m |
258 | CONFIG_BE2NET=m | 238 | CONFIG_NETXEN_NIC=m |
239 | CONFIG_SUNGEM=y | ||
240 | CONFIG_GELIC_NET=m | ||
241 | CONFIG_GELIC_WIRELESS=y | ||
242 | CONFIG_SPIDER_NET=m | ||
243 | CONFIG_MARVELL_PHY=y | ||
244 | CONFIG_BROADCOM_PHY=m | ||
259 | CONFIG_PPP=m | 245 | CONFIG_PPP=m |
260 | CONFIG_PPP_ASYNC=m | ||
261 | CONFIG_PPP_SYNC_TTY=m | ||
262 | CONFIG_PPP_DEFLATE=m | ||
263 | CONFIG_PPP_BSDCOMP=m | 246 | CONFIG_PPP_BSDCOMP=m |
247 | CONFIG_PPP_DEFLATE=m | ||
264 | CONFIG_PPPOE=m | 248 | CONFIG_PPPOE=m |
265 | CONFIG_NETCONSOLE=y | 249 | CONFIG_PPP_ASYNC=m |
266 | CONFIG_NETPOLL_TRAP=y | 250 | CONFIG_PPP_SYNC_TTY=m |
267 | # CONFIG_INPUT_MOUSEDEV_PSAUX is not set | 251 | # CONFIG_INPUT_MOUSEDEV_PSAUX is not set |
268 | CONFIG_INPUT_EVDEV=m | 252 | CONFIG_INPUT_EVDEV=m |
269 | CONFIG_INPUT_MISC=y | 253 | CONFIG_INPUT_MISC=y |
@@ -279,13 +263,10 @@ CONFIG_HVC_RTAS=y | |||
279 | CONFIG_HVC_BEAT=y | 263 | CONFIG_HVC_BEAT=y |
280 | CONFIG_HVCS=m | 264 | CONFIG_HVCS=m |
281 | CONFIG_IBM_BSR=m | 265 | CONFIG_IBM_BSR=m |
282 | CONFIG_HW_RANDOM=m | ||
283 | CONFIG_HW_RANDOM_PSERIES=m | ||
284 | CONFIG_RAW_DRIVER=y | 266 | CONFIG_RAW_DRIVER=y |
285 | CONFIG_I2C_CHARDEV=y | 267 | CONFIG_I2C_CHARDEV=y |
286 | CONFIG_I2C_AMD8111=y | 268 | CONFIG_I2C_AMD8111=y |
287 | CONFIG_I2C_PASEMI=y | 269 | CONFIG_I2C_PASEMI=y |
288 | # CONFIG_HWMON is not set | ||
289 | CONFIG_VIDEO_OUTPUT_CONTROL=m | 270 | CONFIG_VIDEO_OUTPUT_CONTROL=m |
290 | CONFIG_FB=y | 271 | CONFIG_FB=y |
291 | CONFIG_FIRMWARE_EDID=y | 272 | CONFIG_FIRMWARE_EDID=y |
@@ -300,7 +281,6 @@ CONFIG_FB_RADEON=y | |||
300 | CONFIG_FB_IBM_GXT4500=y | 281 | CONFIG_FB_IBM_GXT4500=y |
301 | CONFIG_FB_PS3=m | 282 | CONFIG_FB_PS3=m |
302 | CONFIG_LCD_CLASS_DEVICE=y | 283 | CONFIG_LCD_CLASS_DEVICE=y |
303 | CONFIG_DISPLAY_SUPPORT=y | ||
304 | # CONFIG_VGA_CONSOLE is not set | 284 | # CONFIG_VGA_CONSOLE is not set |
305 | CONFIG_FRAMEBUFFER_CONSOLE=y | 285 | CONFIG_FRAMEBUFFER_CONSOLE=y |
306 | CONFIG_LOGO=y | 286 | CONFIG_LOGO=y |
@@ -317,18 +297,16 @@ CONFIG_SND_AOA_FABRIC_LAYOUT=m | |||
317 | CONFIG_SND_AOA_ONYX=m | 297 | CONFIG_SND_AOA_ONYX=m |
318 | CONFIG_SND_AOA_TAS=m | 298 | CONFIG_SND_AOA_TAS=m |
319 | CONFIG_SND_AOA_TOONIE=m | 299 | CONFIG_SND_AOA_TOONIE=m |
320 | CONFIG_USB_HIDDEV=y | ||
321 | CONFIG_HID_GYRATION=y | 300 | CONFIG_HID_GYRATION=y |
322 | CONFIG_HID_PANTHERLORD=y | 301 | CONFIG_HID_PANTHERLORD=y |
323 | CONFIG_HID_PETALYNX=y | 302 | CONFIG_HID_PETALYNX=y |
324 | CONFIG_HID_SAMSUNG=y | 303 | CONFIG_HID_SAMSUNG=y |
325 | CONFIG_HID_SONY=y | 304 | CONFIG_HID_SONY=y |
326 | CONFIG_HID_SUNPLUS=y | 305 | CONFIG_HID_SUNPLUS=y |
306 | CONFIG_USB_HIDDEV=y | ||
327 | CONFIG_USB=y | 307 | CONFIG_USB=y |
328 | CONFIG_USB_DEVICEFS=y | ||
329 | CONFIG_USB_MON=m | 308 | CONFIG_USB_MON=m |
330 | CONFIG_USB_EHCI_HCD=y | 309 | CONFIG_USB_EHCI_HCD=y |
331 | CONFIG_USB_EHCI_TT_NEWSCHED=y | ||
332 | # CONFIG_USB_EHCI_HCD_PPC_OF is not set | 310 | # CONFIG_USB_EHCI_HCD_PPC_OF is not set |
333 | CONFIG_USB_OHCI_HCD=y | 311 | CONFIG_USB_OHCI_HCD=y |
334 | CONFIG_USB_STORAGE=m | 312 | CONFIG_USB_STORAGE=m |
@@ -370,11 +348,9 @@ CONFIG_JFS_POSIX_ACL=y | |||
370 | CONFIG_JFS_SECURITY=y | 348 | CONFIG_JFS_SECURITY=y |
371 | CONFIG_XFS_FS=m | 349 | CONFIG_XFS_FS=m |
372 | CONFIG_XFS_POSIX_ACL=y | 350 | CONFIG_XFS_POSIX_ACL=y |
373 | CONFIG_OCFS2_FS=m | ||
374 | CONFIG_BTRFS_FS=m | 351 | CONFIG_BTRFS_FS=m |
375 | CONFIG_BTRFS_FS_POSIX_ACL=y | 352 | CONFIG_BTRFS_FS_POSIX_ACL=y |
376 | CONFIG_NILFS2_FS=m | 353 | CONFIG_NILFS2_FS=m |
377 | CONFIG_INOTIFY=y | ||
378 | CONFIG_AUTOFS4_FS=m | 354 | CONFIG_AUTOFS4_FS=m |
379 | CONFIG_FUSE_FS=m | 355 | CONFIG_FUSE_FS=m |
380 | CONFIG_ISO9660_FS=y | 356 | CONFIG_ISO9660_FS=y |
@@ -383,100 +359,53 @@ CONFIG_MSDOS_FS=y | |||
383 | CONFIG_VFAT_FS=y | 359 | CONFIG_VFAT_FS=y |
384 | CONFIG_PROC_KCORE=y | 360 | CONFIG_PROC_KCORE=y |
385 | CONFIG_TMPFS=y | 361 | CONFIG_TMPFS=y |
362 | CONFIG_TMPFS_POSIX_ACL=y | ||
386 | CONFIG_HUGETLBFS=y | 363 | CONFIG_HUGETLBFS=y |
387 | CONFIG_HFS_FS=m | 364 | CONFIG_HFS_FS=m |
388 | CONFIG_HFSPLUS_FS=m | 365 | CONFIG_HFSPLUS_FS=m |
389 | CONFIG_CRAMFS=m | 366 | CONFIG_CRAMFS=m |
390 | CONFIG_SQUASHFS=m | 367 | CONFIG_SQUASHFS=m |
391 | CONFIG_SQUASHFS_XATTR=y | 368 | CONFIG_SQUASHFS_XATTR=y |
392 | CONFIG_SQUASHFS_ZLIB=y | ||
393 | CONFIG_SQUASHFS_LZO=y | 369 | CONFIG_SQUASHFS_LZO=y |
394 | CONFIG_SQUASHFS_XZ=y | 370 | CONFIG_SQUASHFS_XZ=y |
395 | CONFIG_NFS_FS=y | 371 | CONFIG_NFS_FS=y |
396 | CONFIG_NFS_V3=y | ||
397 | CONFIG_NFS_V3_ACL=y | 372 | CONFIG_NFS_V3_ACL=y |
398 | CONFIG_NFS_V4=y | 373 | CONFIG_NFS_V4=y |
399 | CONFIG_ROOT_NFS=y | 374 | CONFIG_ROOT_NFS=y |
400 | CONFIG_NFSD=m | 375 | CONFIG_NFSD=m |
401 | CONFIG_NFSD_V3_ACL=y | 376 | CONFIG_NFSD_V3_ACL=y |
402 | CONFIG_NFSD_V4=y | 377 | CONFIG_NFSD_V4=y |
403 | CONFIG_RPCSEC_GSS_SPKM3=m | ||
404 | CONFIG_CIFS=m | 378 | CONFIG_CIFS=m |
405 | CONFIG_CIFS_XATTR=y | 379 | CONFIG_CIFS_XATTR=y |
406 | CONFIG_CIFS_POSIX=y | 380 | CONFIG_CIFS_POSIX=y |
407 | CONFIG_PARTITION_ADVANCED=y | 381 | CONFIG_NLS_DEFAULT="utf8" |
408 | CONFIG_NLS_CODEPAGE_437=y | 382 | CONFIG_NLS_CODEPAGE_437=y |
409 | CONFIG_NLS_CODEPAGE_737=m | 383 | CONFIG_NLS_ASCII=y |
410 | CONFIG_NLS_CODEPAGE_775=m | ||
411 | CONFIG_NLS_CODEPAGE_850=m | ||
412 | CONFIG_NLS_CODEPAGE_852=m | ||
413 | CONFIG_NLS_CODEPAGE_855=m | ||
414 | CONFIG_NLS_CODEPAGE_857=m | ||
415 | CONFIG_NLS_CODEPAGE_860=m | ||
416 | CONFIG_NLS_CODEPAGE_861=m | ||
417 | CONFIG_NLS_CODEPAGE_862=m | ||
418 | CONFIG_NLS_CODEPAGE_863=m | ||
419 | CONFIG_NLS_CODEPAGE_864=m | ||
420 | CONFIG_NLS_CODEPAGE_865=m | ||
421 | CONFIG_NLS_CODEPAGE_866=m | ||
422 | CONFIG_NLS_CODEPAGE_869=m | ||
423 | CONFIG_NLS_CODEPAGE_936=m | ||
424 | CONFIG_NLS_CODEPAGE_950=m | ||
425 | CONFIG_NLS_CODEPAGE_932=m | ||
426 | CONFIG_NLS_CODEPAGE_949=m | ||
427 | CONFIG_NLS_CODEPAGE_874=m | ||
428 | CONFIG_NLS_ISO8859_8=m | ||
429 | CONFIG_NLS_CODEPAGE_1250=m | ||
430 | CONFIG_NLS_CODEPAGE_1251=m | ||
431 | CONFIG_NLS_ASCII=m | ||
432 | CONFIG_NLS_ISO8859_1=y | 384 | CONFIG_NLS_ISO8859_1=y |
433 | CONFIG_NLS_ISO8859_2=m | 385 | CONFIG_NLS_UTF8=y |
434 | CONFIG_NLS_ISO8859_3=m | ||
435 | CONFIG_NLS_ISO8859_4=m | ||
436 | CONFIG_NLS_ISO8859_5=m | ||
437 | CONFIG_NLS_ISO8859_6=m | ||
438 | CONFIG_NLS_ISO8859_7=m | ||
439 | CONFIG_NLS_ISO8859_9=m | ||
440 | CONFIG_NLS_ISO8859_13=m | ||
441 | CONFIG_NLS_ISO8859_14=m | ||
442 | CONFIG_NLS_ISO8859_15=m | ||
443 | CONFIG_NLS_KOI8_R=m | ||
444 | CONFIG_NLS_KOI8_U=m | ||
445 | CONFIG_CRC_T10DIF=y | 386 | CONFIG_CRC_T10DIF=y |
446 | CONFIG_MAGIC_SYSRQ=y | 387 | CONFIG_MAGIC_SYSRQ=y |
447 | CONFIG_DEBUG_KERNEL=y | 388 | CONFIG_DEBUG_KERNEL=y |
448 | CONFIG_LOCKUP_DETECTOR=y | 389 | CONFIG_LOCKUP_DETECTOR=y |
449 | CONFIG_DETECT_HUNG_TASK=y | ||
450 | CONFIG_DEBUG_MUTEXES=y | 390 | CONFIG_DEBUG_MUTEXES=y |
451 | # CONFIG_RCU_CPU_STALL_DETECTOR is not set | 391 | CONFIG_DEBUG_STACK_USAGE=y |
452 | CONFIG_LATENCYTOP=y | 392 | CONFIG_LATENCYTOP=y |
453 | CONFIG_SYSCTL_SYSCALL_CHECK=y | ||
454 | CONFIG_SCHED_TRACER=y | 393 | CONFIG_SCHED_TRACER=y |
455 | CONFIG_BLK_DEV_IO_TRACE=y | 394 | CONFIG_BLK_DEV_IO_TRACE=y |
456 | CONFIG_DEBUG_STACKOVERFLOW=y | 395 | CONFIG_DEBUG_STACKOVERFLOW=y |
457 | CONFIG_DEBUG_STACK_USAGE=y | ||
458 | CONFIG_CODE_PATCHING_SELFTEST=y | 396 | CONFIG_CODE_PATCHING_SELFTEST=y |
459 | CONFIG_FTR_FIXUP_SELFTEST=y | 397 | CONFIG_FTR_FIXUP_SELFTEST=y |
460 | CONFIG_MSI_BITMAP_SELFTEST=y | 398 | CONFIG_MSI_BITMAP_SELFTEST=y |
461 | CONFIG_XMON=y | 399 | CONFIG_XMON=y |
462 | CONFIG_IRQ_DOMAIN_DEBUG=y | ||
463 | CONFIG_BOOTX_TEXT=y | 400 | CONFIG_BOOTX_TEXT=y |
464 | CONFIG_CRYPTO_NULL=m | 401 | CONFIG_CRYPTO_NULL=m |
465 | CONFIG_CRYPTO_TEST=m | 402 | CONFIG_CRYPTO_TEST=m |
466 | CONFIG_CRYPTO_CCM=m | ||
467 | CONFIG_CRYPTO_GCM=m | ||
468 | CONFIG_CRYPTO_ECB=m | ||
469 | CONFIG_CRYPTO_PCBC=m | 403 | CONFIG_CRYPTO_PCBC=m |
470 | CONFIG_CRYPTO_HMAC=y | 404 | CONFIG_CRYPTO_HMAC=y |
471 | CONFIG_CRYPTO_MD4=m | ||
472 | CONFIG_CRYPTO_MICHAEL_MIC=m | 405 | CONFIG_CRYPTO_MICHAEL_MIC=m |
473 | CONFIG_CRYPTO_SHA256=m | ||
474 | CONFIG_CRYPTO_SHA512=m | ||
475 | CONFIG_CRYPTO_TGR192=m | 406 | CONFIG_CRYPTO_TGR192=m |
476 | CONFIG_CRYPTO_WP512=m | 407 | CONFIG_CRYPTO_WP512=m |
477 | CONFIG_CRYPTO_AES=m | ||
478 | CONFIG_CRYPTO_ANUBIS=m | 408 | CONFIG_CRYPTO_ANUBIS=m |
479 | CONFIG_CRYPTO_ARC4=m | ||
480 | CONFIG_CRYPTO_BLOWFISH=m | 409 | CONFIG_CRYPTO_BLOWFISH=m |
481 | CONFIG_CRYPTO_CAST6=m | 410 | CONFIG_CRYPTO_CAST6=m |
482 | CONFIG_CRYPTO_KHAZAD=m | 411 | CONFIG_CRYPTO_KHAZAD=m |
@@ -486,11 +415,9 @@ CONFIG_CRYPTO_TEA=m | |||
486 | CONFIG_CRYPTO_TWOFISH=m | 415 | CONFIG_CRYPTO_TWOFISH=m |
487 | CONFIG_CRYPTO_LZO=m | 416 | CONFIG_CRYPTO_LZO=m |
488 | # CONFIG_CRYPTO_ANSI_CPRNG is not set | 417 | # CONFIG_CRYPTO_ANSI_CPRNG is not set |
489 | CONFIG_CRYPTO_HW=y | ||
490 | CONFIG_CRYPTO_DEV_NX=y | 418 | CONFIG_CRYPTO_DEV_NX=y |
491 | CONFIG_CRYPTO_DEV_NX_ENCRYPT=m | 419 | CONFIG_CRYPTO_DEV_NX_ENCRYPT=m |
492 | CONFIG_VIRTUALIZATION=y | 420 | CONFIG_VIRTUALIZATION=y |
493 | CONFIG_KVM_BOOK3S_64=m | 421 | CONFIG_KVM_BOOK3S_64=m |
494 | CONFIG_KVM_BOOK3S_64_HV=y | 422 | CONFIG_KVM_BOOK3S_64_HV=y |
495 | CONFIG_VHOST_NET=m | 423 | CONFIG_VHOST_NET=m |
496 | CONFIG_BPF_JIT=y | ||
diff --git a/arch/powerpc/configs/ppc64e_defconfig b/arch/powerpc/configs/ppc64e_defconfig index f55c27609fc6..4b20f76172e2 100644 --- a/arch/powerpc/configs/ppc64e_defconfig +++ b/arch/powerpc/configs/ppc64e_defconfig | |||
@@ -4,6 +4,8 @@ CONFIG_SMP=y | |||
4 | CONFIG_EXPERIMENTAL=y | 4 | CONFIG_EXPERIMENTAL=y |
5 | CONFIG_SYSVIPC=y | 5 | CONFIG_SYSVIPC=y |
6 | CONFIG_POSIX_MQUEUE=y | 6 | CONFIG_POSIX_MQUEUE=y |
7 | CONFIG_NO_HZ=y | ||
8 | CONFIG_HIGH_RES_TIMERS=y | ||
7 | CONFIG_TASKSTATS=y | 9 | CONFIG_TASKSTATS=y |
8 | CONFIG_TASK_DELAY_ACCT=y | 10 | CONFIG_TASK_DELAY_ACCT=y |
9 | CONFIG_IKCONFIG=y | 11 | CONFIG_IKCONFIG=y |
@@ -18,12 +20,13 @@ CONFIG_MODULES=y | |||
18 | CONFIG_MODULE_UNLOAD=y | 20 | CONFIG_MODULE_UNLOAD=y |
19 | CONFIG_MODVERSIONS=y | 21 | CONFIG_MODVERSIONS=y |
20 | CONFIG_MODULE_SRCVERSION_ALL=y | 22 | CONFIG_MODULE_SRCVERSION_ALL=y |
23 | CONFIG_PARTITION_ADVANCED=y | ||
24 | CONFIG_MAC_PARTITION=y | ||
25 | CONFIG_EFI_PARTITION=y | ||
21 | CONFIG_P5020_DS=y | 26 | CONFIG_P5020_DS=y |
22 | CONFIG_CPU_FREQ=y | 27 | CONFIG_CPU_FREQ=y |
23 | CONFIG_CPU_FREQ_GOV_POWERSAVE=y | 28 | CONFIG_CPU_FREQ_GOV_POWERSAVE=y |
24 | CONFIG_CPU_FREQ_GOV_USERSPACE=y | 29 | CONFIG_CPU_FREQ_GOV_USERSPACE=y |
25 | CONFIG_NO_HZ=y | ||
26 | CONFIG_HIGH_RES_TIMERS=y | ||
27 | CONFIG_BINFMT_MISC=m | 30 | CONFIG_BINFMT_MISC=m |
28 | CONFIG_IRQ_ALL_CPUS=y | 31 | CONFIG_IRQ_ALL_CPUS=y |
29 | CONFIG_SPARSEMEM_MANUAL=y | 32 | CONFIG_SPARSEMEM_MANUAL=y |
@@ -46,7 +49,6 @@ CONFIG_INET_ESP=m | |||
46 | CONFIG_INET_IPCOMP=m | 49 | CONFIG_INET_IPCOMP=m |
47 | # CONFIG_IPV6 is not set | 50 | # CONFIG_IPV6 is not set |
48 | CONFIG_NETFILTER=y | 51 | CONFIG_NETFILTER=y |
49 | CONFIG_NETFILTER_NETLINK_QUEUE=m | ||
50 | CONFIG_NF_CONNTRACK=m | 52 | CONFIG_NF_CONNTRACK=m |
51 | CONFIG_NF_CONNTRACK_EVENTS=y | 53 | CONFIG_NF_CONNTRACK_EVENTS=y |
52 | CONFIG_NF_CT_PROTO_SCTP=m | 54 | CONFIG_NF_CT_PROTO_SCTP=m |
@@ -103,19 +105,12 @@ CONFIG_NETFILTER_XT_MATCH_U32=m | |||
103 | CONFIG_NF_CONNTRACK_IPV4=m | 105 | CONFIG_NF_CONNTRACK_IPV4=m |
104 | CONFIG_IP_NF_QUEUE=m | 106 | CONFIG_IP_NF_QUEUE=m |
105 | CONFIG_IP_NF_IPTABLES=m | 107 | CONFIG_IP_NF_IPTABLES=m |
106 | CONFIG_IP_NF_MATCH_ADDRTYPE=m | ||
107 | CONFIG_IP_NF_MATCH_AH=m | 108 | CONFIG_IP_NF_MATCH_AH=m |
108 | CONFIG_IP_NF_MATCH_ECN=m | 109 | CONFIG_IP_NF_MATCH_ECN=m |
109 | CONFIG_IP_NF_MATCH_TTL=m | 110 | CONFIG_IP_NF_MATCH_TTL=m |
110 | CONFIG_IP_NF_FILTER=m | 111 | CONFIG_IP_NF_FILTER=m |
111 | CONFIG_IP_NF_TARGET_REJECT=m | 112 | CONFIG_IP_NF_TARGET_REJECT=m |
112 | CONFIG_IP_NF_TARGET_LOG=m | ||
113 | CONFIG_IP_NF_TARGET_ULOG=m | 113 | CONFIG_IP_NF_TARGET_ULOG=m |
114 | CONFIG_NF_NAT=m | ||
115 | CONFIG_IP_NF_TARGET_MASQUERADE=m | ||
116 | CONFIG_IP_NF_TARGET_NETMAP=m | ||
117 | CONFIG_IP_NF_TARGET_REDIRECT=m | ||
118 | CONFIG_NF_NAT_SNMP_BASIC=m | ||
119 | CONFIG_IP_NF_MANGLE=m | 114 | CONFIG_IP_NF_MANGLE=m |
120 | CONFIG_IP_NF_TARGET_CLUSTERIP=m | 115 | CONFIG_IP_NF_TARGET_CLUSTERIP=m |
121 | CONFIG_IP_NF_TARGET_ECN=m | 116 | CONFIG_IP_NF_TARGET_ECN=m |
@@ -125,6 +120,8 @@ CONFIG_IP_NF_ARPTABLES=m | |||
125 | CONFIG_IP_NF_ARPFILTER=m | 120 | CONFIG_IP_NF_ARPFILTER=m |
126 | CONFIG_IP_NF_ARP_MANGLE=m | 121 | CONFIG_IP_NF_ARP_MANGLE=m |
127 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | 122 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" |
123 | CONFIG_DEVTMPFS=y | ||
124 | CONFIG_DEVTMPFS_MOUNT=y | ||
128 | CONFIG_PROC_DEVICETREE=y | 125 | CONFIG_PROC_DEVICETREE=y |
129 | CONFIG_BLK_DEV_FD=y | 126 | CONFIG_BLK_DEV_FD=y |
130 | CONFIG_BLK_DEV_LOOP=y | 127 | CONFIG_BLK_DEV_LOOP=y |
@@ -167,41 +164,31 @@ CONFIG_DM_SNAPSHOT=m | |||
167 | CONFIG_DM_MIRROR=m | 164 | CONFIG_DM_MIRROR=m |
168 | CONFIG_DM_ZERO=m | 165 | CONFIG_DM_ZERO=m |
169 | CONFIG_DM_MULTIPATH=m | 166 | CONFIG_DM_MULTIPATH=m |
170 | CONFIG_IEEE1394=y | ||
171 | CONFIG_IEEE1394_OHCI1394=y | ||
172 | CONFIG_IEEE1394_SBP2=m | ||
173 | CONFIG_IEEE1394_ETH1394=m | ||
174 | CONFIG_IEEE1394_RAWIO=y | ||
175 | CONFIG_IEEE1394_VIDEO1394=m | ||
176 | CONFIG_IEEE1394_DV1394=m | ||
177 | CONFIG_MACINTOSH_DRIVERS=y | 167 | CONFIG_MACINTOSH_DRIVERS=y |
178 | CONFIG_WINDFARM=y | 168 | CONFIG_WINDFARM=y |
179 | CONFIG_NETDEVICES=y | 169 | CONFIG_NETDEVICES=y |
180 | CONFIG_DUMMY=m | ||
181 | CONFIG_BONDING=m | 170 | CONFIG_BONDING=m |
171 | CONFIG_DUMMY=m | ||
172 | CONFIG_NETCONSOLE=y | ||
173 | CONFIG_NETPOLL_TRAP=y | ||
182 | CONFIG_TUN=m | 174 | CONFIG_TUN=m |
183 | CONFIG_MARVELL_PHY=y | ||
184 | CONFIG_BROADCOM_PHY=m | ||
185 | CONFIG_NET_ETHERNET=y | ||
186 | CONFIG_SUNGEM=y | ||
187 | CONFIG_NET_VENDOR_3COM=y | ||
188 | CONFIG_VORTEX=y | 175 | CONFIG_VORTEX=y |
189 | CONFIG_NET_PCI=y | ||
190 | CONFIG_PCNET32=y | ||
191 | CONFIG_E100=y | ||
192 | CONFIG_ACENIC=y | 176 | CONFIG_ACENIC=y |
193 | CONFIG_ACENIC_OMIT_TIGON_I=y | 177 | CONFIG_ACENIC_OMIT_TIGON_I=y |
194 | CONFIG_E1000=y | 178 | CONFIG_PCNET32=y |
195 | CONFIG_TIGON3=y | 179 | CONFIG_TIGON3=y |
180 | CONFIG_E100=y | ||
181 | CONFIG_E1000=y | ||
196 | CONFIG_IXGB=m | 182 | CONFIG_IXGB=m |
183 | CONFIG_SUNGEM=y | ||
184 | CONFIG_MARVELL_PHY=y | ||
185 | CONFIG_BROADCOM_PHY=m | ||
197 | CONFIG_PPP=m | 186 | CONFIG_PPP=m |
198 | CONFIG_PPP_ASYNC=m | ||
199 | CONFIG_PPP_SYNC_TTY=m | ||
200 | CONFIG_PPP_DEFLATE=m | ||
201 | CONFIG_PPP_BSDCOMP=m | 187 | CONFIG_PPP_BSDCOMP=m |
188 | CONFIG_PPP_DEFLATE=m | ||
202 | CONFIG_PPPOE=m | 189 | CONFIG_PPPOE=m |
203 | CONFIG_NETCONSOLE=y | 190 | CONFIG_PPP_ASYNC=m |
204 | CONFIG_NETPOLL_TRAP=y | 191 | CONFIG_PPP_SYNC_TTY=m |
205 | # CONFIG_INPUT_MOUSEDEV_PSAUX is not set | 192 | # CONFIG_INPUT_MOUSEDEV_PSAUX is not set |
206 | CONFIG_INPUT_EVDEV=m | 193 | CONFIG_INPUT_EVDEV=m |
207 | CONFIG_INPUT_MISC=y | 194 | CONFIG_INPUT_MISC=y |
@@ -213,7 +200,6 @@ CONFIG_SERIAL_8250_CONSOLE=y | |||
213 | CONFIG_RAW_DRIVER=y | 200 | CONFIG_RAW_DRIVER=y |
214 | CONFIG_I2C_CHARDEV=y | 201 | CONFIG_I2C_CHARDEV=y |
215 | CONFIG_I2C_AMD8111=y | 202 | CONFIG_I2C_AMD8111=y |
216 | # CONFIG_HWMON is not set | ||
217 | CONFIG_VIDEO_OUTPUT_CONTROL=m | 203 | CONFIG_VIDEO_OUTPUT_CONTROL=m |
218 | CONFIG_FB=y | 204 | CONFIG_FB=y |
219 | CONFIG_FIRMWARE_EDID=y | 205 | CONFIG_FIRMWARE_EDID=y |
@@ -227,7 +213,6 @@ CONFIG_FB_MATROX_MAVEN=m | |||
227 | CONFIG_FB_RADEON=y | 213 | CONFIG_FB_RADEON=y |
228 | CONFIG_FB_IBM_GXT4500=y | 214 | CONFIG_FB_IBM_GXT4500=y |
229 | CONFIG_LCD_CLASS_DEVICE=y | 215 | CONFIG_LCD_CLASS_DEVICE=y |
230 | CONFIG_DISPLAY_SUPPORT=y | ||
231 | # CONFIG_VGA_CONSOLE is not set | 216 | # CONFIG_VGA_CONSOLE is not set |
232 | CONFIG_FRAMEBUFFER_CONSOLE=y | 217 | CONFIG_FRAMEBUFFER_CONSOLE=y |
233 | CONFIG_LOGO=y | 218 | CONFIG_LOGO=y |
@@ -238,7 +223,6 @@ CONFIG_SND_SEQ_DUMMY=m | |||
238 | CONFIG_SND_MIXER_OSS=m | 223 | CONFIG_SND_MIXER_OSS=m |
239 | CONFIG_SND_PCM_OSS=m | 224 | CONFIG_SND_PCM_OSS=m |
240 | CONFIG_SND_SEQUENCER_OSS=y | 225 | CONFIG_SND_SEQUENCER_OSS=y |
241 | CONFIG_USB_HIDDEV=y | ||
242 | CONFIG_HID_DRAGONRISE=y | 226 | CONFIG_HID_DRAGONRISE=y |
243 | CONFIG_HID_GYRATION=y | 227 | CONFIG_HID_GYRATION=y |
244 | CONFIG_HID_TWINHAN=y | 228 | CONFIG_HID_TWINHAN=y |
@@ -253,8 +237,8 @@ CONFIG_HID_SMARTJOYPLUS=y | |||
253 | CONFIG_HID_TOPSEED=y | 237 | CONFIG_HID_TOPSEED=y |
254 | CONFIG_HID_THRUSTMASTER=y | 238 | CONFIG_HID_THRUSTMASTER=y |
255 | CONFIG_HID_ZEROPLUS=y | 239 | CONFIG_HID_ZEROPLUS=y |
240 | CONFIG_USB_HIDDEV=y | ||
256 | CONFIG_USB=y | 241 | CONFIG_USB=y |
257 | CONFIG_USB_DEVICEFS=y | ||
258 | CONFIG_USB_EHCI_HCD=y | 242 | CONFIG_USB_EHCI_HCD=y |
259 | # CONFIG_USB_EHCI_HCD_PPC_OF is not set | 243 | # CONFIG_USB_EHCI_HCD_PPC_OF is not set |
260 | CONFIG_USB_OHCI_HCD=y | 244 | CONFIG_USB_OHCI_HCD=y |
@@ -296,73 +280,36 @@ CONFIG_MSDOS_FS=y | |||
296 | CONFIG_VFAT_FS=y | 280 | CONFIG_VFAT_FS=y |
297 | CONFIG_PROC_KCORE=y | 281 | CONFIG_PROC_KCORE=y |
298 | CONFIG_TMPFS=y | 282 | CONFIG_TMPFS=y |
283 | CONFIG_TMPFS_POSIX_ACL=y | ||
299 | CONFIG_HFS_FS=m | 284 | CONFIG_HFS_FS=m |
300 | CONFIG_HFSPLUS_FS=m | 285 | CONFIG_HFSPLUS_FS=m |
301 | CONFIG_CRAMFS=y | 286 | CONFIG_CRAMFS=y |
302 | CONFIG_NFS_FS=y | 287 | CONFIG_NFS_FS=y |
303 | CONFIG_NFS_V3=y | ||
304 | CONFIG_NFS_V3_ACL=y | 288 | CONFIG_NFS_V3_ACL=y |
305 | CONFIG_NFS_V4=y | 289 | CONFIG_NFS_V4=y |
306 | CONFIG_ROOT_NFS=y | 290 | CONFIG_ROOT_NFS=y |
307 | CONFIG_NFSD=m | 291 | CONFIG_NFSD=m |
308 | CONFIG_NFSD_V3_ACL=y | 292 | CONFIG_NFSD_V3_ACL=y |
309 | CONFIG_NFSD_V4=y | 293 | CONFIG_NFSD_V4=y |
310 | CONFIG_RPCSEC_GSS_SPKM3=m | ||
311 | CONFIG_CIFS=m | 294 | CONFIG_CIFS=m |
312 | CONFIG_CIFS_XATTR=y | 295 | CONFIG_CIFS_XATTR=y |
313 | CONFIG_CIFS_POSIX=y | 296 | CONFIG_CIFS_POSIX=y |
314 | CONFIG_PARTITION_ADVANCED=y | 297 | CONFIG_NLS_DEFAULT="utf8" |
315 | CONFIG_MAC_PARTITION=y | ||
316 | CONFIG_NLS_CODEPAGE_437=y | 298 | CONFIG_NLS_CODEPAGE_437=y |
317 | CONFIG_NLS_CODEPAGE_737=m | 299 | CONFIG_NLS_ASCII=y |
318 | CONFIG_NLS_CODEPAGE_775=m | ||
319 | CONFIG_NLS_CODEPAGE_850=m | ||
320 | CONFIG_NLS_CODEPAGE_852=m | ||
321 | CONFIG_NLS_CODEPAGE_855=m | ||
322 | CONFIG_NLS_CODEPAGE_857=m | ||
323 | CONFIG_NLS_CODEPAGE_860=m | ||
324 | CONFIG_NLS_CODEPAGE_861=m | ||
325 | CONFIG_NLS_CODEPAGE_862=m | ||
326 | CONFIG_NLS_CODEPAGE_863=m | ||
327 | CONFIG_NLS_CODEPAGE_864=m | ||
328 | CONFIG_NLS_CODEPAGE_865=m | ||
329 | CONFIG_NLS_CODEPAGE_866=m | ||
330 | CONFIG_NLS_CODEPAGE_869=m | ||
331 | CONFIG_NLS_CODEPAGE_936=m | ||
332 | CONFIG_NLS_CODEPAGE_950=m | ||
333 | CONFIG_NLS_CODEPAGE_932=m | ||
334 | CONFIG_NLS_CODEPAGE_949=m | ||
335 | CONFIG_NLS_CODEPAGE_874=m | ||
336 | CONFIG_NLS_ISO8859_8=m | ||
337 | CONFIG_NLS_CODEPAGE_1250=m | ||
338 | CONFIG_NLS_CODEPAGE_1251=m | ||
339 | CONFIG_NLS_ASCII=m | ||
340 | CONFIG_NLS_ISO8859_1=y | 300 | CONFIG_NLS_ISO8859_1=y |
341 | CONFIG_NLS_ISO8859_2=m | 301 | CONFIG_NLS_UTF8=y |
342 | CONFIG_NLS_ISO8859_3=m | ||
343 | CONFIG_NLS_ISO8859_4=m | ||
344 | CONFIG_NLS_ISO8859_5=m | ||
345 | CONFIG_NLS_ISO8859_6=m | ||
346 | CONFIG_NLS_ISO8859_7=m | ||
347 | CONFIG_NLS_ISO8859_9=m | ||
348 | CONFIG_NLS_ISO8859_13=m | ||
349 | CONFIG_NLS_ISO8859_14=m | ||
350 | CONFIG_NLS_ISO8859_15=m | ||
351 | CONFIG_NLS_KOI8_R=m | ||
352 | CONFIG_NLS_KOI8_U=m | ||
353 | CONFIG_CRC_T10DIF=y | 302 | CONFIG_CRC_T10DIF=y |
354 | CONFIG_MAGIC_SYSRQ=y | 303 | CONFIG_MAGIC_SYSRQ=y |
355 | CONFIG_DEBUG_KERNEL=y | 304 | CONFIG_DEBUG_KERNEL=y |
356 | CONFIG_DETECT_HUNG_TASK=y | 305 | CONFIG_DETECT_HUNG_TASK=y |
357 | CONFIG_DEBUG_MUTEXES=y | 306 | CONFIG_DEBUG_MUTEXES=y |
358 | # CONFIG_RCU_CPU_STALL_DETECTOR is not set | 307 | CONFIG_DEBUG_STACK_USAGE=y |
359 | CONFIG_LATENCYTOP=y | 308 | CONFIG_LATENCYTOP=y |
360 | CONFIG_SYSCTL_SYSCALL_CHECK=y | ||
361 | CONFIG_IRQSOFF_TRACER=y | 309 | CONFIG_IRQSOFF_TRACER=y |
362 | CONFIG_SCHED_TRACER=y | 310 | CONFIG_SCHED_TRACER=y |
363 | CONFIG_BLK_DEV_IO_TRACE=y | 311 | CONFIG_BLK_DEV_IO_TRACE=y |
364 | CONFIG_DEBUG_STACKOVERFLOW=y | 312 | CONFIG_DEBUG_STACKOVERFLOW=y |
365 | CONFIG_DEBUG_STACK_USAGE=y | ||
366 | CONFIG_CODE_PATCHING_SELFTEST=y | 313 | CONFIG_CODE_PATCHING_SELFTEST=y |
367 | CONFIG_FTR_FIXUP_SELFTEST=y | 314 | CONFIG_FTR_FIXUP_SELFTEST=y |
368 | CONFIG_MSI_BITMAP_SELFTEST=y | 315 | CONFIG_MSI_BITMAP_SELFTEST=y |
@@ -371,16 +318,12 @@ CONFIG_CRYPTO_NULL=m | |||
371 | CONFIG_CRYPTO_TEST=m | 318 | CONFIG_CRYPTO_TEST=m |
372 | CONFIG_CRYPTO_CCM=m | 319 | CONFIG_CRYPTO_CCM=m |
373 | CONFIG_CRYPTO_GCM=m | 320 | CONFIG_CRYPTO_GCM=m |
374 | CONFIG_CRYPTO_ECB=m | ||
375 | CONFIG_CRYPTO_PCBC=m | 321 | CONFIG_CRYPTO_PCBC=m |
376 | CONFIG_CRYPTO_HMAC=y | 322 | CONFIG_CRYPTO_HMAC=y |
377 | CONFIG_CRYPTO_MD4=m | ||
378 | CONFIG_CRYPTO_MICHAEL_MIC=m | 323 | CONFIG_CRYPTO_MICHAEL_MIC=m |
379 | CONFIG_CRYPTO_SHA256=m | ||
380 | CONFIG_CRYPTO_SHA512=m | 324 | CONFIG_CRYPTO_SHA512=m |
381 | CONFIG_CRYPTO_TGR192=m | 325 | CONFIG_CRYPTO_TGR192=m |
382 | CONFIG_CRYPTO_WP512=m | 326 | CONFIG_CRYPTO_WP512=m |
383 | CONFIG_CRYPTO_AES=m | ||
384 | CONFIG_CRYPTO_ANUBIS=m | 327 | CONFIG_CRYPTO_ANUBIS=m |
385 | CONFIG_CRYPTO_BLOWFISH=m | 328 | CONFIG_CRYPTO_BLOWFISH=m |
386 | CONFIG_CRYPTO_CAST6=m | 329 | CONFIG_CRYPTO_CAST6=m |
diff --git a/arch/powerpc/configs/ps3_defconfig b/arch/powerpc/configs/ps3_defconfig index c2f4b4a86ece..7a5c15fcc7cf 100644 --- a/arch/powerpc/configs/ps3_defconfig +++ b/arch/powerpc/configs/ps3_defconfig | |||
@@ -6,6 +6,7 @@ CONFIG_NR_CPUS=2 | |||
6 | CONFIG_EXPERIMENTAL=y | 6 | CONFIG_EXPERIMENTAL=y |
7 | CONFIG_SYSVIPC=y | 7 | CONFIG_SYSVIPC=y |
8 | CONFIG_POSIX_MQUEUE=y | 8 | CONFIG_POSIX_MQUEUE=y |
9 | CONFIG_HIGH_RES_TIMERS=y | ||
9 | CONFIG_BLK_DEV_INITRD=y | 10 | CONFIG_BLK_DEV_INITRD=y |
10 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y | 11 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y |
11 | CONFIG_EMBEDDED=y | 12 | CONFIG_EMBEDDED=y |
@@ -24,12 +25,13 @@ CONFIG_PS3_DISK=y | |||
24 | CONFIG_PS3_ROM=y | 25 | CONFIG_PS3_ROM=y |
25 | CONFIG_PS3_FLASH=y | 26 | CONFIG_PS3_FLASH=y |
26 | CONFIG_PS3_VRAM=m | 27 | CONFIG_PS3_VRAM=m |
28 | CONFIG_PS3_LPM=m | ||
27 | # CONFIG_PPC_OF_BOOT_TRAMPOLINE is not set | 29 | # CONFIG_PPC_OF_BOOT_TRAMPOLINE is not set |
28 | CONFIG_HIGH_RES_TIMERS=y | ||
29 | # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set | 30 | # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set |
30 | CONFIG_BINFMT_MISC=y | 31 | CONFIG_BINFMT_MISC=y |
31 | CONFIG_KEXEC=y | 32 | CONFIG_KEXEC=y |
32 | # CONFIG_SPARSEMEM_VMEMMAP is not set | 33 | # CONFIG_SPARSEMEM_VMEMMAP is not set |
34 | # CONFIG_COMPACTION is not set | ||
33 | CONFIG_SCHED_SMT=y | 35 | CONFIG_SCHED_SMT=y |
34 | CONFIG_CMDLINE_BOOL=y | 36 | CONFIG_CMDLINE_BOOL=y |
35 | CONFIG_CMDLINE="" | 37 | CONFIG_CMDLINE="" |
@@ -59,6 +61,7 @@ CONFIG_BT_BNEP_PROTO_FILTER=y | |||
59 | CONFIG_BT_HIDP=m | 61 | CONFIG_BT_HIDP=m |
60 | CONFIG_BT_HCIBTUSB=m | 62 | CONFIG_BT_HCIBTUSB=m |
61 | CONFIG_CFG80211=m | 63 | CONFIG_CFG80211=m |
64 | CONFIG_CFG80211_WEXT=y | ||
62 | CONFIG_MAC80211=m | 65 | CONFIG_MAC80211=m |
63 | CONFIG_MAC80211_RC_PID=y | 66 | CONFIG_MAC80211_RC_PID=y |
64 | # CONFIG_MAC80211_RC_MINSTREL is not set | 67 | # CONFIG_MAC80211_RC_MINSTREL is not set |
@@ -78,7 +81,6 @@ CONFIG_MD=y | |||
78 | CONFIG_BLK_DEV_DM=m | 81 | CONFIG_BLK_DEV_DM=m |
79 | CONFIG_NETDEVICES=y | 82 | CONFIG_NETDEVICES=y |
80 | # CONFIG_NET_VENDOR_BROADCOM is not set | 83 | # CONFIG_NET_VENDOR_BROADCOM is not set |
81 | # CONFIG_NET_VENDOR_CHELSIO is not set | ||
82 | # CONFIG_NET_VENDOR_INTEL is not set | 84 | # CONFIG_NET_VENDOR_INTEL is not set |
83 | # CONFIG_NET_VENDOR_MARVELL is not set | 85 | # CONFIG_NET_VENDOR_MARVELL is not set |
84 | # CONFIG_NET_VENDOR_MICREL is not set | 86 | # CONFIG_NET_VENDOR_MICREL is not set |
@@ -119,21 +121,21 @@ CONFIG_SND=m | |||
119 | # CONFIG_SND_DRIVERS is not set | 121 | # CONFIG_SND_DRIVERS is not set |
120 | CONFIG_SND_USB_AUDIO=m | 122 | CONFIG_SND_USB_AUDIO=m |
121 | CONFIG_HIDRAW=y | 123 | CONFIG_HIDRAW=y |
122 | CONFIG_USB_HIDDEV=y | ||
123 | CONFIG_HID_APPLE=m | 124 | CONFIG_HID_APPLE=m |
124 | CONFIG_HID_BELKIN=m | 125 | CONFIG_HID_BELKIN=m |
125 | CONFIG_HID_CHERRY=m | 126 | CONFIG_HID_CHERRY=m |
126 | CONFIG_HID_EZKEY=m | 127 | CONFIG_HID_EZKEY=m |
127 | CONFIG_HID_TWINHAN=m | 128 | CONFIG_HID_TWINHAN=m |
128 | CONFIG_HID_LOGITECH=m | 129 | CONFIG_HID_LOGITECH=m |
130 | CONFIG_HID_LOGITECH_DJ=m | ||
129 | CONFIG_HID_MICROSOFT=m | 131 | CONFIG_HID_MICROSOFT=m |
132 | CONFIG_HID_PS3REMOTE=m | ||
130 | CONFIG_HID_SONY=m | 133 | CONFIG_HID_SONY=m |
131 | CONFIG_HID_SUNPLUS=m | 134 | CONFIG_HID_SUNPLUS=m |
132 | CONFIG_HID_SMARTJOYPLUS=m | 135 | CONFIG_HID_SMARTJOYPLUS=m |
136 | CONFIG_USB_HIDDEV=y | ||
133 | CONFIG_USB=m | 137 | CONFIG_USB=m |
134 | CONFIG_USB_ANNOUNCE_NEW_DEVICES=y | 138 | CONFIG_USB_ANNOUNCE_NEW_DEVICES=y |
135 | CONFIG_USB_DEVICEFS=y | ||
136 | # CONFIG_USB_DEVICE_CLASS is not set | ||
137 | CONFIG_USB_SUSPEND=y | 139 | CONFIG_USB_SUSPEND=y |
138 | CONFIG_USB_MON=m | 140 | CONFIG_USB_MON=m |
139 | CONFIG_USB_EHCI_HCD=m | 141 | CONFIG_USB_EHCI_HCD=m |
@@ -158,8 +160,8 @@ CONFIG_PROC_KCORE=y | |||
158 | CONFIG_TMPFS=y | 160 | CONFIG_TMPFS=y |
159 | CONFIG_HUGETLBFS=y | 161 | CONFIG_HUGETLBFS=y |
160 | CONFIG_NFS_FS=y | 162 | CONFIG_NFS_FS=y |
161 | CONFIG_NFS_V3=y | ||
162 | CONFIG_NFS_V4=y | 163 | CONFIG_NFS_V4=y |
164 | CONFIG_NFS_SWAP=y | ||
163 | CONFIG_ROOT_NFS=y | 165 | CONFIG_ROOT_NFS=y |
164 | CONFIG_CIFS=m | 166 | CONFIG_CIFS=m |
165 | CONFIG_NLS=y | 167 | CONFIG_NLS=y |
@@ -176,6 +178,7 @@ CONFIG_DEBUG_INFO=y | |||
176 | CONFIG_DEBUG_WRITECOUNT=y | 178 | CONFIG_DEBUG_WRITECOUNT=y |
177 | CONFIG_DEBUG_MEMORY_INIT=y | 179 | CONFIG_DEBUG_MEMORY_INIT=y |
178 | CONFIG_DEBUG_LIST=y | 180 | CONFIG_DEBUG_LIST=y |
181 | CONFIG_RCU_CPU_STALL_TIMEOUT=60 | ||
179 | # CONFIG_FTRACE is not set | 182 | # CONFIG_FTRACE is not set |
180 | CONFIG_DEBUG_STACKOVERFLOW=y | 183 | CONFIG_DEBUG_STACKOVERFLOW=y |
181 | CONFIG_CRYPTO_CCM=m | 184 | CONFIG_CRYPTO_CCM=m |
diff --git a/arch/powerpc/configs/pseries_defconfig b/arch/powerpc/configs/pseries_defconfig index 5b8e1e508270..c4dfbaf8b192 100644 --- a/arch/powerpc/configs/pseries_defconfig +++ b/arch/powerpc/configs/pseries_defconfig | |||
@@ -6,12 +6,15 @@ CONFIG_NR_CPUS=2048 | |||
6 | CONFIG_EXPERIMENTAL=y | 6 | CONFIG_EXPERIMENTAL=y |
7 | CONFIG_SYSVIPC=y | 7 | CONFIG_SYSVIPC=y |
8 | CONFIG_POSIX_MQUEUE=y | 8 | CONFIG_POSIX_MQUEUE=y |
9 | CONFIG_AUDIT=y | ||
10 | CONFIG_AUDITSYSCALL=y | ||
11 | CONFIG_IRQ_DOMAIN_DEBUG=y | ||
12 | CONFIG_NO_HZ=y | ||
13 | CONFIG_HIGH_RES_TIMERS=y | ||
9 | CONFIG_TASKSTATS=y | 14 | CONFIG_TASKSTATS=y |
10 | CONFIG_TASK_DELAY_ACCT=y | 15 | CONFIG_TASK_DELAY_ACCT=y |
11 | CONFIG_TASK_XACCT=y | 16 | CONFIG_TASK_XACCT=y |
12 | CONFIG_TASK_IO_ACCOUNTING=y | 17 | CONFIG_TASK_IO_ACCOUNTING=y |
13 | CONFIG_AUDIT=y | ||
14 | CONFIG_AUDITSYSCALL=y | ||
15 | CONFIG_IKCONFIG=y | 18 | CONFIG_IKCONFIG=y |
16 | CONFIG_IKCONFIG_PROC=y | 19 | CONFIG_IKCONFIG_PROC=y |
17 | CONFIG_CGROUPS=y | 20 | CONFIG_CGROUPS=y |
@@ -29,6 +32,8 @@ CONFIG_MODULES=y | |||
29 | CONFIG_MODULE_UNLOAD=y | 32 | CONFIG_MODULE_UNLOAD=y |
30 | CONFIG_MODVERSIONS=y | 33 | CONFIG_MODVERSIONS=y |
31 | CONFIG_MODULE_SRCVERSION_ALL=y | 34 | CONFIG_MODULE_SRCVERSION_ALL=y |
35 | CONFIG_PARTITION_ADVANCED=y | ||
36 | CONFIG_EFI_PARTITION=y | ||
32 | CONFIG_PPC_SPLPAR=y | 37 | CONFIG_PPC_SPLPAR=y |
33 | CONFIG_SCANLOG=m | 38 | CONFIG_SCANLOG=m |
34 | CONFIG_PPC_SMLPAR=y | 39 | CONFIG_PPC_SMLPAR=y |
@@ -36,10 +41,9 @@ CONFIG_DTL=y | |||
36 | # CONFIG_PPC_PMAC is not set | 41 | # CONFIG_PPC_PMAC is not set |
37 | CONFIG_RTAS_FLASH=m | 42 | CONFIG_RTAS_FLASH=m |
38 | CONFIG_IBMEBUS=y | 43 | CONFIG_IBMEBUS=y |
39 | CONFIG_NO_HZ=y | ||
40 | CONFIG_HIGH_RES_TIMERS=y | ||
41 | CONFIG_HZ_100=y | 44 | CONFIG_HZ_100=y |
42 | CONFIG_BINFMT_MISC=m | 45 | CONFIG_BINFMT_MISC=m |
46 | CONFIG_PPC_TRANSACTIONAL_MEM=y | ||
43 | CONFIG_HOTPLUG_CPU=y | 47 | CONFIG_HOTPLUG_CPU=y |
44 | CONFIG_KEXEC=y | 48 | CONFIG_KEXEC=y |
45 | CONFIG_IRQ_ALL_CPUS=y | 49 | CONFIG_IRQ_ALL_CPUS=y |
@@ -65,7 +69,6 @@ CONFIG_INET_ESP=m | |||
65 | CONFIG_INET_IPCOMP=m | 69 | CONFIG_INET_IPCOMP=m |
66 | # CONFIG_IPV6 is not set | 70 | # CONFIG_IPV6 is not set |
67 | CONFIG_NETFILTER=y | 71 | CONFIG_NETFILTER=y |
68 | CONFIG_NETFILTER_NETLINK_QUEUE=m | ||
69 | CONFIG_NF_CONNTRACK=m | 72 | CONFIG_NF_CONNTRACK=m |
70 | CONFIG_NF_CONNTRACK_EVENTS=y | 73 | CONFIG_NF_CONNTRACK_EVENTS=y |
71 | CONFIG_NF_CT_PROTO_UDPLITE=m | 74 | CONFIG_NF_CT_PROTO_UDPLITE=m |
@@ -112,20 +115,15 @@ CONFIG_NETFILTER_XT_MATCH_U32=m | |||
112 | CONFIG_NF_CONNTRACK_IPV4=m | 115 | CONFIG_NF_CONNTRACK_IPV4=m |
113 | CONFIG_IP_NF_QUEUE=m | 116 | CONFIG_IP_NF_QUEUE=m |
114 | CONFIG_IP_NF_IPTABLES=m | 117 | CONFIG_IP_NF_IPTABLES=m |
115 | CONFIG_IP_NF_MATCH_ADDRTYPE=m | ||
116 | CONFIG_IP_NF_MATCH_AH=m | 118 | CONFIG_IP_NF_MATCH_AH=m |
117 | CONFIG_IP_NF_MATCH_ECN=m | 119 | CONFIG_IP_NF_MATCH_ECN=m |
118 | CONFIG_IP_NF_MATCH_TTL=m | 120 | CONFIG_IP_NF_MATCH_TTL=m |
119 | CONFIG_IP_NF_FILTER=m | 121 | CONFIG_IP_NF_FILTER=m |
120 | CONFIG_IP_NF_TARGET_REJECT=m | 122 | CONFIG_IP_NF_TARGET_REJECT=m |
121 | CONFIG_IP_NF_TARGET_LOG=m | ||
122 | CONFIG_IP_NF_TARGET_ULOG=m | 123 | CONFIG_IP_NF_TARGET_ULOG=m |
123 | CONFIG_NF_NAT=m | ||
124 | CONFIG_IP_NF_TARGET_MASQUERADE=m | ||
125 | CONFIG_IP_NF_TARGET_NETMAP=m | ||
126 | CONFIG_IP_NF_TARGET_REDIRECT=m | ||
127 | CONFIG_NF_NAT_SNMP_BASIC=m | ||
128 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | 124 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" |
125 | CONFIG_DEVTMPFS=y | ||
126 | CONFIG_DEVTMPFS_MOUNT=y | ||
129 | CONFIG_PROC_DEVICETREE=y | 127 | CONFIG_PROC_DEVICETREE=y |
130 | CONFIG_PARPORT=m | 128 | CONFIG_PARPORT=m |
131 | CONFIG_PARPORT_PC=m | 129 | CONFIG_PARPORT_PC=m |
@@ -146,7 +144,6 @@ CONFIG_CHR_DEV_SG=y | |||
146 | CONFIG_SCSI_MULTI_LUN=y | 144 | CONFIG_SCSI_MULTI_LUN=y |
147 | CONFIG_SCSI_CONSTANTS=y | 145 | CONFIG_SCSI_CONSTANTS=y |
148 | CONFIG_SCSI_FC_ATTRS=y | 146 | CONFIG_SCSI_FC_ATTRS=y |
149 | CONFIG_SCSI_SAS_ATTRS=m | ||
150 | CONFIG_SCSI_CXGB3_ISCSI=m | 147 | CONFIG_SCSI_CXGB3_ISCSI=m |
151 | CONFIG_SCSI_CXGB4_ISCSI=m | 148 | CONFIG_SCSI_CXGB4_ISCSI=m |
152 | CONFIG_SCSI_BNX2_ISCSI=m | 149 | CONFIG_SCSI_BNX2_ISCSI=m |
@@ -177,43 +174,36 @@ CONFIG_DM_SNAPSHOT=m | |||
177 | CONFIG_DM_MIRROR=m | 174 | CONFIG_DM_MIRROR=m |
178 | CONFIG_DM_ZERO=m | 175 | CONFIG_DM_ZERO=m |
179 | CONFIG_DM_MULTIPATH=m | 176 | CONFIG_DM_MULTIPATH=m |
180 | CONFIG_NETDEVICES=y | ||
181 | CONFIG_DUMMY=m | ||
182 | CONFIG_BONDING=m | 177 | CONFIG_BONDING=m |
178 | CONFIG_DUMMY=m | ||
179 | CONFIG_NETCONSOLE=y | ||
180 | CONFIG_NETPOLL_TRAP=y | ||
183 | CONFIG_TUN=m | 181 | CONFIG_TUN=m |
184 | CONFIG_NET_ETHERNET=y | ||
185 | CONFIG_NET_VENDOR_3COM=y | ||
186 | CONFIG_VORTEX=y | 182 | CONFIG_VORTEX=y |
187 | CONFIG_IBMVETH=y | ||
188 | CONFIG_NET_PCI=y | ||
189 | CONFIG_PCNET32=y | ||
190 | CONFIG_E100=y | ||
191 | CONFIG_ACENIC=m | 183 | CONFIG_ACENIC=m |
192 | CONFIG_ACENIC_OMIT_TIGON_I=y | 184 | CONFIG_ACENIC_OMIT_TIGON_I=y |
193 | CONFIG_E1000=y | 185 | CONFIG_PCNET32=y |
194 | CONFIG_E1000E=y | ||
195 | CONFIG_TIGON3=y | 186 | CONFIG_TIGON3=y |
196 | CONFIG_BNX2=m | ||
197 | CONFIG_CHELSIO_T1=m | 187 | CONFIG_CHELSIO_T1=m |
198 | CONFIG_CHELSIO_T3=m | 188 | CONFIG_BE2NET=m |
199 | CONFIG_CHELSIO_T4=m | 189 | CONFIG_S2IO=m |
190 | CONFIG_IBMVETH=y | ||
200 | CONFIG_EHEA=y | 191 | CONFIG_EHEA=y |
201 | CONFIG_IXGBE=m | 192 | CONFIG_E100=y |
193 | CONFIG_E1000=y | ||
194 | CONFIG_E1000E=y | ||
202 | CONFIG_IXGB=m | 195 | CONFIG_IXGB=m |
203 | CONFIG_S2IO=m | 196 | CONFIG_IXGBE=m |
204 | CONFIG_MYRI10GE=m | ||
205 | CONFIG_NETXEN_NIC=m | ||
206 | CONFIG_MLX4_EN=m | 197 | CONFIG_MLX4_EN=m |
198 | CONFIG_MYRI10GE=m | ||
207 | CONFIG_QLGE=m | 199 | CONFIG_QLGE=m |
208 | CONFIG_BE2NET=m | 200 | CONFIG_NETXEN_NIC=m |
209 | CONFIG_PPP=m | 201 | CONFIG_PPP=m |
210 | CONFIG_PPP_ASYNC=m | ||
211 | CONFIG_PPP_SYNC_TTY=m | ||
212 | CONFIG_PPP_DEFLATE=m | ||
213 | CONFIG_PPP_BSDCOMP=m | 202 | CONFIG_PPP_BSDCOMP=m |
203 | CONFIG_PPP_DEFLATE=m | ||
214 | CONFIG_PPPOE=m | 204 | CONFIG_PPPOE=m |
215 | CONFIG_NETCONSOLE=y | 205 | CONFIG_PPP_ASYNC=m |
216 | CONFIG_NETPOLL_TRAP=y | 206 | CONFIG_PPP_SYNC_TTY=m |
217 | # CONFIG_INPUT_MOUSEDEV_PSAUX is not set | 207 | # CONFIG_INPUT_MOUSEDEV_PSAUX is not set |
218 | CONFIG_INPUT_EVDEV=m | 208 | CONFIG_INPUT_EVDEV=m |
219 | CONFIG_INPUT_MISC=y | 209 | CONFIG_INPUT_MISC=y |
@@ -227,12 +217,9 @@ CONFIG_HVC_CONSOLE=y | |||
227 | CONFIG_HVC_RTAS=y | 217 | CONFIG_HVC_RTAS=y |
228 | CONFIG_HVCS=m | 218 | CONFIG_HVCS=m |
229 | CONFIG_IBM_BSR=m | 219 | CONFIG_IBM_BSR=m |
230 | CONFIG_HW_RANDOM=m | ||
231 | CONFIG_HW_RANDOM_PSERIES=m | ||
232 | CONFIG_GEN_RTC=y | 220 | CONFIG_GEN_RTC=y |
233 | CONFIG_RAW_DRIVER=y | 221 | CONFIG_RAW_DRIVER=y |
234 | CONFIG_MAX_RAW_DEVS=1024 | 222 | CONFIG_MAX_RAW_DEVS=1024 |
235 | # CONFIG_HWMON is not set | ||
236 | CONFIG_FB=y | 223 | CONFIG_FB=y |
237 | CONFIG_FIRMWARE_EDID=y | 224 | CONFIG_FIRMWARE_EDID=y |
238 | CONFIG_FB_OF=y | 225 | CONFIG_FB_OF=y |
@@ -243,19 +230,17 @@ CONFIG_FB_MATROX_G=y | |||
243 | CONFIG_FB_RADEON=y | 230 | CONFIG_FB_RADEON=y |
244 | CONFIG_FB_IBM_GXT4500=y | 231 | CONFIG_FB_IBM_GXT4500=y |
245 | CONFIG_LCD_PLATFORM=m | 232 | CONFIG_LCD_PLATFORM=m |
246 | CONFIG_DISPLAY_SUPPORT=y | ||
247 | # CONFIG_VGA_CONSOLE is not set | 233 | # CONFIG_VGA_CONSOLE is not set |
248 | CONFIG_FRAMEBUFFER_CONSOLE=y | 234 | CONFIG_FRAMEBUFFER_CONSOLE=y |
249 | CONFIG_LOGO=y | 235 | CONFIG_LOGO=y |
250 | CONFIG_USB_HIDDEV=y | ||
251 | CONFIG_HID_GYRATION=y | 236 | CONFIG_HID_GYRATION=y |
252 | CONFIG_HID_PANTHERLORD=y | 237 | CONFIG_HID_PANTHERLORD=y |
253 | CONFIG_HID_PETALYNX=y | 238 | CONFIG_HID_PETALYNX=y |
254 | CONFIG_HID_SAMSUNG=y | 239 | CONFIG_HID_SAMSUNG=y |
255 | CONFIG_HID_SONY=y | 240 | CONFIG_HID_SONY=y |
256 | CONFIG_HID_SUNPLUS=y | 241 | CONFIG_HID_SUNPLUS=y |
242 | CONFIG_USB_HIDDEV=y | ||
257 | CONFIG_USB=y | 243 | CONFIG_USB=y |
258 | CONFIG_USB_DEVICEFS=y | ||
259 | CONFIG_USB_MON=m | 244 | CONFIG_USB_MON=m |
260 | CONFIG_USB_EHCI_HCD=y | 245 | CONFIG_USB_EHCI_HCD=y |
261 | # CONFIG_USB_EHCI_HCD_PPC_OF is not set | 246 | # CONFIG_USB_EHCI_HCD_PPC_OF is not set |
@@ -293,7 +278,6 @@ CONFIG_JFS_POSIX_ACL=y | |||
293 | CONFIG_JFS_SECURITY=y | 278 | CONFIG_JFS_SECURITY=y |
294 | CONFIG_XFS_FS=m | 279 | CONFIG_XFS_FS=m |
295 | CONFIG_XFS_POSIX_ACL=y | 280 | CONFIG_XFS_POSIX_ACL=y |
296 | CONFIG_OCFS2_FS=m | ||
297 | CONFIG_BTRFS_FS=m | 281 | CONFIG_BTRFS_FS=m |
298 | CONFIG_BTRFS_FS_POSIX_ACL=y | 282 | CONFIG_BTRFS_FS_POSIX_ACL=y |
299 | CONFIG_NILFS2_FS=m | 283 | CONFIG_NILFS2_FS=m |
@@ -305,61 +289,49 @@ CONFIG_MSDOS_FS=y | |||
305 | CONFIG_VFAT_FS=y | 289 | CONFIG_VFAT_FS=y |
306 | CONFIG_PROC_KCORE=y | 290 | CONFIG_PROC_KCORE=y |
307 | CONFIG_TMPFS=y | 291 | CONFIG_TMPFS=y |
292 | CONFIG_TMPFS_POSIX_ACL=y | ||
308 | CONFIG_HUGETLBFS=y | 293 | CONFIG_HUGETLBFS=y |
309 | CONFIG_CRAMFS=m | 294 | CONFIG_CRAMFS=m |
310 | CONFIG_SQUASHFS=m | 295 | CONFIG_SQUASHFS=m |
311 | CONFIG_SQUASHFS_XATTR=y | 296 | CONFIG_SQUASHFS_XATTR=y |
312 | CONFIG_SQUASHFS_ZLIB=y | ||
313 | CONFIG_SQUASHFS_LZO=y | 297 | CONFIG_SQUASHFS_LZO=y |
314 | CONFIG_SQUASHFS_XZ=y | 298 | CONFIG_SQUASHFS_XZ=y |
315 | CONFIG_NFS_FS=y | 299 | CONFIG_NFS_FS=y |
316 | CONFIG_NFS_V3=y | ||
317 | CONFIG_NFS_V3_ACL=y | 300 | CONFIG_NFS_V3_ACL=y |
318 | CONFIG_NFS_V4=y | 301 | CONFIG_NFS_V4=y |
319 | CONFIG_NFSD=m | 302 | CONFIG_NFSD=m |
320 | CONFIG_NFSD_V3_ACL=y | 303 | CONFIG_NFSD_V3_ACL=y |
321 | CONFIG_NFSD_V4=y | 304 | CONFIG_NFSD_V4=y |
322 | CONFIG_RPCSEC_GSS_SPKM3=m | ||
323 | CONFIG_CIFS=m | 305 | CONFIG_CIFS=m |
324 | CONFIG_CIFS_XATTR=y | 306 | CONFIG_CIFS_XATTR=y |
325 | CONFIG_CIFS_POSIX=y | 307 | CONFIG_CIFS_POSIX=y |
308 | CONFIG_NLS_DEFAULT="utf8" | ||
326 | CONFIG_NLS_CODEPAGE_437=y | 309 | CONFIG_NLS_CODEPAGE_437=y |
327 | CONFIG_NLS_ASCII=y | 310 | CONFIG_NLS_ASCII=y |
328 | CONFIG_NLS_ISO8859_1=y | 311 | CONFIG_NLS_ISO8859_1=y |
312 | CONFIG_NLS_UTF8=y | ||
329 | CONFIG_CRC_T10DIF=y | 313 | CONFIG_CRC_T10DIF=y |
330 | CONFIG_MAGIC_SYSRQ=y | 314 | CONFIG_MAGIC_SYSRQ=y |
331 | CONFIG_DEBUG_KERNEL=y | 315 | CONFIG_DEBUG_KERNEL=y |
332 | CONFIG_LOCKUP_DETECTOR=y | 316 | CONFIG_LOCKUP_DETECTOR=y |
333 | CONFIG_DETECT_HUNG_TASK=y | 317 | CONFIG_DEBUG_STACK_USAGE=y |
334 | # CONFIG_RCU_CPU_STALL_DETECTOR is not set | ||
335 | CONFIG_LATENCYTOP=y | 318 | CONFIG_LATENCYTOP=y |
336 | CONFIG_SYSCTL_SYSCALL_CHECK=y | ||
337 | CONFIG_SCHED_TRACER=y | 319 | CONFIG_SCHED_TRACER=y |
338 | CONFIG_BLK_DEV_IO_TRACE=y | 320 | CONFIG_BLK_DEV_IO_TRACE=y |
339 | CONFIG_DEBUG_STACKOVERFLOW=y | 321 | CONFIG_DEBUG_STACKOVERFLOW=y |
340 | CONFIG_DEBUG_STACK_USAGE=y | ||
341 | CONFIG_CODE_PATCHING_SELFTEST=y | 322 | CONFIG_CODE_PATCHING_SELFTEST=y |
342 | CONFIG_FTR_FIXUP_SELFTEST=y | 323 | CONFIG_FTR_FIXUP_SELFTEST=y |
343 | CONFIG_MSI_BITMAP_SELFTEST=y | 324 | CONFIG_MSI_BITMAP_SELFTEST=y |
344 | CONFIG_XMON=y | 325 | CONFIG_XMON=y |
345 | CONFIG_XMON_DEFAULT=y | 326 | CONFIG_XMON_DEFAULT=y |
346 | CONFIG_IRQ_DOMAIN_DEBUG=y | ||
347 | CONFIG_CRYPTO_NULL=m | 327 | CONFIG_CRYPTO_NULL=m |
348 | CONFIG_CRYPTO_TEST=m | 328 | CONFIG_CRYPTO_TEST=m |
349 | CONFIG_CRYPTO_CCM=m | ||
350 | CONFIG_CRYPTO_GCM=m | ||
351 | CONFIG_CRYPTO_ECB=m | ||
352 | CONFIG_CRYPTO_PCBC=m | 329 | CONFIG_CRYPTO_PCBC=m |
353 | CONFIG_CRYPTO_HMAC=y | 330 | CONFIG_CRYPTO_HMAC=y |
354 | CONFIG_CRYPTO_MD4=m | ||
355 | CONFIG_CRYPTO_MICHAEL_MIC=m | 331 | CONFIG_CRYPTO_MICHAEL_MIC=m |
356 | CONFIG_CRYPTO_SHA256=m | ||
357 | CONFIG_CRYPTO_SHA512=m | ||
358 | CONFIG_CRYPTO_TGR192=m | 332 | CONFIG_CRYPTO_TGR192=m |
359 | CONFIG_CRYPTO_WP512=m | 333 | CONFIG_CRYPTO_WP512=m |
360 | CONFIG_CRYPTO_AES=m | ||
361 | CONFIG_CRYPTO_ANUBIS=m | 334 | CONFIG_CRYPTO_ANUBIS=m |
362 | CONFIG_CRYPTO_ARC4=m | ||
363 | CONFIG_CRYPTO_BLOWFISH=m | 335 | CONFIG_CRYPTO_BLOWFISH=m |
364 | CONFIG_CRYPTO_CAST6=m | 336 | CONFIG_CRYPTO_CAST6=m |
365 | CONFIG_CRYPTO_KHAZAD=m | 337 | CONFIG_CRYPTO_KHAZAD=m |
@@ -369,7 +341,6 @@ CONFIG_CRYPTO_TEA=m | |||
369 | CONFIG_CRYPTO_TWOFISH=m | 341 | CONFIG_CRYPTO_TWOFISH=m |
370 | CONFIG_CRYPTO_LZO=m | 342 | CONFIG_CRYPTO_LZO=m |
371 | # CONFIG_CRYPTO_ANSI_CPRNG is not set | 343 | # CONFIG_CRYPTO_ANSI_CPRNG is not set |
372 | CONFIG_CRYPTO_HW=y | ||
373 | CONFIG_CRYPTO_DEV_NX=y | 344 | CONFIG_CRYPTO_DEV_NX=y |
374 | CONFIG_CRYPTO_DEV_NX_ENCRYPT=m | 345 | CONFIG_CRYPTO_DEV_NX_ENCRYPT=m |
375 | CONFIG_VIRTUALIZATION=y | 346 | CONFIG_VIRTUALIZATION=y |
diff --git a/arch/powerpc/crypto/Makefile b/arch/powerpc/crypto/Makefile new file mode 100644 index 000000000000..2926fb9c570a --- /dev/null +++ b/arch/powerpc/crypto/Makefile | |||
@@ -0,0 +1,9 @@ | |||
1 | # | ||
2 | # powerpc/crypto/Makefile | ||
3 | # | ||
4 | # Arch-specific CryptoAPI modules. | ||
5 | # | ||
6 | |||
7 | obj-$(CONFIG_CRYPTO_SHA1_PPC) += sha1-powerpc.o | ||
8 | |||
9 | sha1-powerpc-y := sha1-powerpc-asm.o sha1.o | ||
diff --git a/arch/powerpc/crypto/sha1-powerpc-asm.S b/arch/powerpc/crypto/sha1-powerpc-asm.S new file mode 100644 index 000000000000..a5f8264d2d3c --- /dev/null +++ b/arch/powerpc/crypto/sha1-powerpc-asm.S | |||
@@ -0,0 +1,179 @@ | |||
1 | /* | ||
2 | * SHA-1 implementation for PowerPC. | ||
3 | * | ||
4 | * Copyright (C) 2005 Paul Mackerras <paulus@samba.org> | ||
5 | */ | ||
6 | |||
7 | #include <asm/ppc_asm.h> | ||
8 | #include <asm/asm-offsets.h> | ||
9 | |||
10 | /* | ||
11 | * We roll the registers for T, A, B, C, D, E around on each | ||
12 | * iteration; T on iteration t is A on iteration t+1, and so on. | ||
13 | * We use registers 7 - 12 for this. | ||
14 | */ | ||
15 | #define RT(t) ((((t)+5)%6)+7) | ||
16 | #define RA(t) ((((t)+4)%6)+7) | ||
17 | #define RB(t) ((((t)+3)%6)+7) | ||
18 | #define RC(t) ((((t)+2)%6)+7) | ||
19 | #define RD(t) ((((t)+1)%6)+7) | ||
20 | #define RE(t) ((((t)+0)%6)+7) | ||
21 | |||
22 | /* We use registers 16 - 31 for the W values */ | ||
23 | #define W(t) (((t)%16)+16) | ||
24 | |||
25 | #define LOADW(t) \ | ||
26 | lwz W(t),(t)*4(r4) | ||
27 | |||
28 | #define STEPD0_LOAD(t) \ | ||
29 | andc r0,RD(t),RB(t); \ | ||
30 | and r6,RB(t),RC(t); \ | ||
31 | rotlwi RT(t),RA(t),5; \ | ||
32 | or r6,r6,r0; \ | ||
33 | add r0,RE(t),r15; \ | ||
34 | add RT(t),RT(t),r6; \ | ||
35 | add r14,r0,W(t); \ | ||
36 | lwz W((t)+4),((t)+4)*4(r4); \ | ||
37 | rotlwi RB(t),RB(t),30; \ | ||
38 | add RT(t),RT(t),r14 | ||
39 | |||
40 | #define STEPD0_UPDATE(t) \ | ||
41 | and r6,RB(t),RC(t); \ | ||
42 | andc r0,RD(t),RB(t); \ | ||
43 | rotlwi RT(t),RA(t),5; \ | ||
44 | rotlwi RB(t),RB(t),30; \ | ||
45 | or r6,r6,r0; \ | ||
46 | add r0,RE(t),r15; \ | ||
47 | xor r5,W((t)+4-3),W((t)+4-8); \ | ||
48 | add RT(t),RT(t),r6; \ | ||
49 | xor W((t)+4),W((t)+4-16),W((t)+4-14); \ | ||
50 | add r0,r0,W(t); \ | ||
51 | xor W((t)+4),W((t)+4),r5; \ | ||
52 | add RT(t),RT(t),r0; \ | ||
53 | rotlwi W((t)+4),W((t)+4),1 | ||
54 | |||
55 | #define STEPD1(t) \ | ||
56 | xor r6,RB(t),RC(t); \ | ||
57 | rotlwi RT(t),RA(t),5; \ | ||
58 | rotlwi RB(t),RB(t),30; \ | ||
59 | xor r6,r6,RD(t); \ | ||
60 | add r0,RE(t),r15; \ | ||
61 | add RT(t),RT(t),r6; \ | ||
62 | add r0,r0,W(t); \ | ||
63 | add RT(t),RT(t),r0 | ||
64 | |||
65 | #define STEPD1_UPDATE(t) \ | ||
66 | xor r6,RB(t),RC(t); \ | ||
67 | rotlwi RT(t),RA(t),5; \ | ||
68 | rotlwi RB(t),RB(t),30; \ | ||
69 | xor r6,r6,RD(t); \ | ||
70 | add r0,RE(t),r15; \ | ||
71 | xor r5,W((t)+4-3),W((t)+4-8); \ | ||
72 | add RT(t),RT(t),r6; \ | ||
73 | xor W((t)+4),W((t)+4-16),W((t)+4-14); \ | ||
74 | add r0,r0,W(t); \ | ||
75 | xor W((t)+4),W((t)+4),r5; \ | ||
76 | add RT(t),RT(t),r0; \ | ||
77 | rotlwi W((t)+4),W((t)+4),1 | ||
78 | |||
79 | #define STEPD2_UPDATE(t) \ | ||
80 | and r6,RB(t),RC(t); \ | ||
81 | and r0,RB(t),RD(t); \ | ||
82 | rotlwi RT(t),RA(t),5; \ | ||
83 | or r6,r6,r0; \ | ||
84 | rotlwi RB(t),RB(t),30; \ | ||
85 | and r0,RC(t),RD(t); \ | ||
86 | xor r5,W((t)+4-3),W((t)+4-8); \ | ||
87 | or r6,r6,r0; \ | ||
88 | xor W((t)+4),W((t)+4-16),W((t)+4-14); \ | ||
89 | add r0,RE(t),r15; \ | ||
90 | add RT(t),RT(t),r6; \ | ||
91 | add r0,r0,W(t); \ | ||
92 | xor W((t)+4),W((t)+4),r5; \ | ||
93 | add RT(t),RT(t),r0; \ | ||
94 | rotlwi W((t)+4),W((t)+4),1 | ||
95 | |||
96 | #define STEP0LD4(t) \ | ||
97 | STEPD0_LOAD(t); \ | ||
98 | STEPD0_LOAD((t)+1); \ | ||
99 | STEPD0_LOAD((t)+2); \ | ||
100 | STEPD0_LOAD((t)+3) | ||
101 | |||
102 | #define STEPUP4(t, fn) \ | ||
103 | STEP##fn##_UPDATE(t); \ | ||
104 | STEP##fn##_UPDATE((t)+1); \ | ||
105 | STEP##fn##_UPDATE((t)+2); \ | ||
106 | STEP##fn##_UPDATE((t)+3) | ||
107 | |||
108 | #define STEPUP20(t, fn) \ | ||
109 | STEPUP4(t, fn); \ | ||
110 | STEPUP4((t)+4, fn); \ | ||
111 | STEPUP4((t)+8, fn); \ | ||
112 | STEPUP4((t)+12, fn); \ | ||
113 | STEPUP4((t)+16, fn) | ||
114 | |||
115 | _GLOBAL(powerpc_sha_transform) | ||
116 | PPC_STLU r1,-STACKFRAMESIZE(r1) | ||
117 | SAVE_8GPRS(14, r1) | ||
118 | SAVE_10GPRS(22, r1) | ||
119 | |||
120 | /* Load up A - E */ | ||
121 | lwz RA(0),0(r3) /* A */ | ||
122 | lwz RB(0),4(r3) /* B */ | ||
123 | lwz RC(0),8(r3) /* C */ | ||
124 | lwz RD(0),12(r3) /* D */ | ||
125 | lwz RE(0),16(r3) /* E */ | ||
126 | |||
127 | LOADW(0) | ||
128 | LOADW(1) | ||
129 | LOADW(2) | ||
130 | LOADW(3) | ||
131 | |||
132 | lis r15,0x5a82 /* K0-19 */ | ||
133 | ori r15,r15,0x7999 | ||
134 | STEP0LD4(0) | ||
135 | STEP0LD4(4) | ||
136 | STEP0LD4(8) | ||
137 | STEPUP4(12, D0) | ||
138 | STEPUP4(16, D0) | ||
139 | |||
140 | lis r15,0x6ed9 /* K20-39 */ | ||
141 | ori r15,r15,0xeba1 | ||
142 | STEPUP20(20, D1) | ||
143 | |||
144 | lis r15,0x8f1b /* K40-59 */ | ||
145 | ori r15,r15,0xbcdc | ||
146 | STEPUP20(40, D2) | ||
147 | |||
148 | lis r15,0xca62 /* K60-79 */ | ||
149 | ori r15,r15,0xc1d6 | ||
150 | STEPUP4(60, D1) | ||
151 | STEPUP4(64, D1) | ||
152 | STEPUP4(68, D1) | ||
153 | STEPUP4(72, D1) | ||
154 | lwz r20,16(r3) | ||
155 | STEPD1(76) | ||
156 | lwz r19,12(r3) | ||
157 | STEPD1(77) | ||
158 | lwz r18,8(r3) | ||
159 | STEPD1(78) | ||
160 | lwz r17,4(r3) | ||
161 | STEPD1(79) | ||
162 | |||
163 | lwz r16,0(r3) | ||
164 | add r20,RE(80),r20 | ||
165 | add RD(0),RD(80),r19 | ||
166 | add RC(0),RC(80),r18 | ||
167 | add RB(0),RB(80),r17 | ||
168 | add RA(0),RA(80),r16 | ||
169 | mr RE(0),r20 | ||
170 | stw RA(0),0(r3) | ||
171 | stw RB(0),4(r3) | ||
172 | stw RC(0),8(r3) | ||
173 | stw RD(0),12(r3) | ||
174 | stw RE(0),16(r3) | ||
175 | |||
176 | REST_8GPRS(14, r1) | ||
177 | REST_10GPRS(22, r1) | ||
178 | addi r1,r1,STACKFRAMESIZE | ||
179 | blr | ||
diff --git a/arch/powerpc/crypto/sha1.c b/arch/powerpc/crypto/sha1.c new file mode 100644 index 000000000000..f9e8b9491efc --- /dev/null +++ b/arch/powerpc/crypto/sha1.c | |||
@@ -0,0 +1,157 @@ | |||
1 | /* | ||
2 | * Cryptographic API. | ||
3 | * | ||
4 | * powerpc implementation of the SHA1 Secure Hash Algorithm. | ||
5 | * | ||
6 | * Derived from cryptoapi implementation, adapted for in-place | ||
7 | * scatterlist interface. | ||
8 | * | ||
9 | * Derived from "crypto/sha1.c" | ||
10 | * Copyright (c) Alan Smithee. | ||
11 | * Copyright (c) Andrew McDonald <andrew@mcdonald.org.uk> | ||
12 | * Copyright (c) Jean-Francois Dive <jef@linuxbe.org> | ||
13 | * | ||
14 | * This program is free software; you can redistribute it and/or modify it | ||
15 | * under the terms of the GNU General Public License as published by the Free | ||
16 | * Software Foundation; either version 2 of the License, or (at your option) | ||
17 | * any later version. | ||
18 | * | ||
19 | */ | ||
20 | #include <crypto/internal/hash.h> | ||
21 | #include <linux/init.h> | ||
22 | #include <linux/module.h> | ||
23 | #include <linux/mm.h> | ||
24 | #include <linux/cryptohash.h> | ||
25 | #include <linux/types.h> | ||
26 | #include <crypto/sha.h> | ||
27 | #include <asm/byteorder.h> | ||
28 | |||
29 | extern void powerpc_sha_transform(u32 *state, const u8 *src, u32 *temp); | ||
30 | |||
31 | static int sha1_init(struct shash_desc *desc) | ||
32 | { | ||
33 | struct sha1_state *sctx = shash_desc_ctx(desc); | ||
34 | |||
35 | *sctx = (struct sha1_state){ | ||
36 | .state = { SHA1_H0, SHA1_H1, SHA1_H2, SHA1_H3, SHA1_H4 }, | ||
37 | }; | ||
38 | |||
39 | return 0; | ||
40 | } | ||
41 | |||
42 | static int sha1_update(struct shash_desc *desc, const u8 *data, | ||
43 | unsigned int len) | ||
44 | { | ||
45 | struct sha1_state *sctx = shash_desc_ctx(desc); | ||
46 | unsigned int partial, done; | ||
47 | const u8 *src; | ||
48 | |||
49 | partial = sctx->count & 0x3f; | ||
50 | sctx->count += len; | ||
51 | done = 0; | ||
52 | src = data; | ||
53 | |||
54 | if ((partial + len) > 63) { | ||
55 | u32 temp[SHA_WORKSPACE_WORDS]; | ||
56 | |||
57 | if (partial) { | ||
58 | done = -partial; | ||
59 | memcpy(sctx->buffer + partial, data, done + 64); | ||
60 | src = sctx->buffer; | ||
61 | } | ||
62 | |||
63 | do { | ||
64 | powerpc_sha_transform(sctx->state, src, temp); | ||
65 | done += 64; | ||
66 | src = data + done; | ||
67 | } while (done + 63 < len); | ||
68 | |||
69 | memset(temp, 0, sizeof(temp)); | ||
70 | partial = 0; | ||
71 | } | ||
72 | memcpy(sctx->buffer + partial, src, len - done); | ||
73 | |||
74 | return 0; | ||
75 | } | ||
76 | |||
77 | |||
78 | /* Add padding and return the message digest. */ | ||
79 | static int sha1_final(struct shash_desc *desc, u8 *out) | ||
80 | { | ||
81 | struct sha1_state *sctx = shash_desc_ctx(desc); | ||
82 | __be32 *dst = (__be32 *)out; | ||
83 | u32 i, index, padlen; | ||
84 | __be64 bits; | ||
85 | static const u8 padding[64] = { 0x80, }; | ||
86 | |||
87 | bits = cpu_to_be64(sctx->count << 3); | ||
88 | |||
89 | /* Pad out to 56 mod 64 */ | ||
90 | index = sctx->count & 0x3f; | ||
91 | padlen = (index < 56) ? (56 - index) : ((64+56) - index); | ||
92 | sha1_update(desc, padding, padlen); | ||
93 | |||
94 | /* Append length */ | ||
95 | sha1_update(desc, (const u8 *)&bits, sizeof(bits)); | ||
96 | |||
97 | /* Store state in digest */ | ||
98 | for (i = 0; i < 5; i++) | ||
99 | dst[i] = cpu_to_be32(sctx->state[i]); | ||
100 | |||
101 | /* Wipe context */ | ||
102 | memset(sctx, 0, sizeof *sctx); | ||
103 | |||
104 | return 0; | ||
105 | } | ||
106 | |||
107 | static int sha1_export(struct shash_desc *desc, void *out) | ||
108 | { | ||
109 | struct sha1_state *sctx = shash_desc_ctx(desc); | ||
110 | |||
111 | memcpy(out, sctx, sizeof(*sctx)); | ||
112 | return 0; | ||
113 | } | ||
114 | |||
115 | static int sha1_import(struct shash_desc *desc, const void *in) | ||
116 | { | ||
117 | struct sha1_state *sctx = shash_desc_ctx(desc); | ||
118 | |||
119 | memcpy(sctx, in, sizeof(*sctx)); | ||
120 | return 0; | ||
121 | } | ||
122 | |||
123 | static struct shash_alg alg = { | ||
124 | .digestsize = SHA1_DIGEST_SIZE, | ||
125 | .init = sha1_init, | ||
126 | .update = sha1_update, | ||
127 | .final = sha1_final, | ||
128 | .export = sha1_export, | ||
129 | .import = sha1_import, | ||
130 | .descsize = sizeof(struct sha1_state), | ||
131 | .statesize = sizeof(struct sha1_state), | ||
132 | .base = { | ||
133 | .cra_name = "sha1", | ||
134 | .cra_driver_name= "sha1-powerpc", | ||
135 | .cra_flags = CRYPTO_ALG_TYPE_SHASH, | ||
136 | .cra_blocksize = SHA1_BLOCK_SIZE, | ||
137 | .cra_module = THIS_MODULE, | ||
138 | } | ||
139 | }; | ||
140 | |||
141 | static int __init sha1_powerpc_mod_init(void) | ||
142 | { | ||
143 | return crypto_register_shash(&alg); | ||
144 | } | ||
145 | |||
146 | static void __exit sha1_powerpc_mod_fini(void) | ||
147 | { | ||
148 | crypto_unregister_shash(&alg); | ||
149 | } | ||
150 | |||
151 | module_init(sha1_powerpc_mod_init); | ||
152 | module_exit(sha1_powerpc_mod_fini); | ||
153 | |||
154 | MODULE_LICENSE("GPL"); | ||
155 | MODULE_DESCRIPTION("SHA1 Secure Hash Algorithm"); | ||
156 | |||
157 | MODULE_ALIAS("sha1-powerpc"); | ||
diff --git a/arch/powerpc/include/asm/cputable.h b/arch/powerpc/include/asm/cputable.h index 76f81bd64f1d..fb3245e928ea 100644 --- a/arch/powerpc/include/asm/cputable.h +++ b/arch/powerpc/include/asm/cputable.h | |||
@@ -106,37 +106,37 @@ extern const char *powerpc_base_platform; | |||
106 | /* CPU kernel features */ | 106 | /* CPU kernel features */ |
107 | 107 | ||
108 | /* Retain the 32b definitions all use bottom half of word */ | 108 | /* Retain the 32b definitions all use bottom half of word */ |
109 | #define CPU_FTR_COHERENT_ICACHE ASM_CONST(0x0000000000000001) | 109 | #define CPU_FTR_COHERENT_ICACHE ASM_CONST(0x00000001) |
110 | #define CPU_FTR_L2CR ASM_CONST(0x0000000000000002) | 110 | #define CPU_FTR_L2CR ASM_CONST(0x00000002) |
111 | #define CPU_FTR_SPEC7450 ASM_CONST(0x0000000000000004) | 111 | #define CPU_FTR_SPEC7450 ASM_CONST(0x00000004) |
112 | #define CPU_FTR_ALTIVEC ASM_CONST(0x0000000000000008) | 112 | #define CPU_FTR_ALTIVEC ASM_CONST(0x00000008) |
113 | #define CPU_FTR_TAU ASM_CONST(0x0000000000000010) | 113 | #define CPU_FTR_TAU ASM_CONST(0x00000010) |
114 | #define CPU_FTR_CAN_DOZE ASM_CONST(0x0000000000000020) | 114 | #define CPU_FTR_CAN_DOZE ASM_CONST(0x00000020) |
115 | #define CPU_FTR_USE_TB ASM_CONST(0x0000000000000040) | 115 | #define CPU_FTR_USE_TB ASM_CONST(0x00000040) |
116 | #define CPU_FTR_L2CSR ASM_CONST(0x0000000000000080) | 116 | #define CPU_FTR_L2CSR ASM_CONST(0x00000080) |
117 | #define CPU_FTR_601 ASM_CONST(0x0000000000000100) | 117 | #define CPU_FTR_601 ASM_CONST(0x00000100) |
118 | #define CPU_FTR_DBELL ASM_CONST(0x0000000000000200) | 118 | #define CPU_FTR_DBELL ASM_CONST(0x00000200) |
119 | #define CPU_FTR_CAN_NAP ASM_CONST(0x0000000000000400) | 119 | #define CPU_FTR_CAN_NAP ASM_CONST(0x00000400) |
120 | #define CPU_FTR_L3CR ASM_CONST(0x0000000000000800) | 120 | #define CPU_FTR_L3CR ASM_CONST(0x00000800) |
121 | #define CPU_FTR_L3_DISABLE_NAP ASM_CONST(0x0000000000001000) | 121 | #define CPU_FTR_L3_DISABLE_NAP ASM_CONST(0x00001000) |
122 | #define CPU_FTR_NAP_DISABLE_L2_PR ASM_CONST(0x0000000000002000) | 122 | #define CPU_FTR_NAP_DISABLE_L2_PR ASM_CONST(0x00002000) |
123 | #define CPU_FTR_DUAL_PLL_750FX ASM_CONST(0x0000000000004000) | 123 | #define CPU_FTR_DUAL_PLL_750FX ASM_CONST(0x00004000) |
124 | #define CPU_FTR_NO_DPM ASM_CONST(0x0000000000008000) | 124 | #define CPU_FTR_NO_DPM ASM_CONST(0x00008000) |
125 | #define CPU_FTR_476_DD2 ASM_CONST(0x0000000000010000) | 125 | #define CPU_FTR_476_DD2 ASM_CONST(0x00010000) |
126 | #define CPU_FTR_NEED_COHERENT ASM_CONST(0x0000000000020000) | 126 | #define CPU_FTR_NEED_COHERENT ASM_CONST(0x00020000) |
127 | #define CPU_FTR_NO_BTIC ASM_CONST(0x0000000000040000) | 127 | #define CPU_FTR_NO_BTIC ASM_CONST(0x00040000) |
128 | #define CPU_FTR_DEBUG_LVL_EXC ASM_CONST(0x0000000000080000) | 128 | #define CPU_FTR_DEBUG_LVL_EXC ASM_CONST(0x00080000) |
129 | #define CPU_FTR_NODSISRALIGN ASM_CONST(0x0000000000100000) | 129 | #define CPU_FTR_NODSISRALIGN ASM_CONST(0x00100000) |
130 | #define CPU_FTR_PPC_LE ASM_CONST(0x0000000000200000) | 130 | #define CPU_FTR_PPC_LE ASM_CONST(0x00200000) |
131 | #define CPU_FTR_REAL_LE ASM_CONST(0x0000000000400000) | 131 | #define CPU_FTR_REAL_LE ASM_CONST(0x00400000) |
132 | #define CPU_FTR_FPU_UNAVAILABLE ASM_CONST(0x0000000000800000) | 132 | #define CPU_FTR_FPU_UNAVAILABLE ASM_CONST(0x00800000) |
133 | #define CPU_FTR_UNIFIED_ID_CACHE ASM_CONST(0x0000000001000000) | 133 | #define CPU_FTR_UNIFIED_ID_CACHE ASM_CONST(0x01000000) |
134 | #define CPU_FTR_SPE ASM_CONST(0x0000000002000000) | 134 | #define CPU_FTR_SPE ASM_CONST(0x02000000) |
135 | #define CPU_FTR_NEED_PAIRED_STWCX ASM_CONST(0x0000000004000000) | 135 | #define CPU_FTR_NEED_PAIRED_STWCX ASM_CONST(0x04000000) |
136 | #define CPU_FTR_LWSYNC ASM_CONST(0x0000000008000000) | 136 | #define CPU_FTR_LWSYNC ASM_CONST(0x08000000) |
137 | #define CPU_FTR_NOEXECUTE ASM_CONST(0x0000000010000000) | 137 | #define CPU_FTR_NOEXECUTE ASM_CONST(0x10000000) |
138 | #define CPU_FTR_INDEXED_DCR ASM_CONST(0x0000000020000000) | 138 | #define CPU_FTR_INDEXED_DCR ASM_CONST(0x20000000) |
139 | #define CPU_FTR_EMB_HV ASM_CONST(0x0000000040000000) | 139 | #define CPU_FTR_EMB_HV ASM_CONST(0x40000000) |
140 | 140 | ||
141 | /* | 141 | /* |
142 | * Add the 64-bit processor unique features in the top half of the word; | 142 | * Add the 64-bit processor unique features in the top half of the word; |
@@ -148,29 +148,33 @@ extern const char *powerpc_base_platform; | |||
148 | #define LONG_ASM_CONST(x) 0 | 148 | #define LONG_ASM_CONST(x) 0 |
149 | #endif | 149 | #endif |
150 | 150 | ||
151 | #define CPU_FTR_HVMODE LONG_ASM_CONST(0x0000000200000000) | 151 | #define CPU_FTR_HVMODE LONG_ASM_CONST(0x0000000100000000) |
152 | #define CPU_FTR_ARCH_201 LONG_ASM_CONST(0x0000000400000000) | 152 | #define CPU_FTR_ARCH_201 LONG_ASM_CONST(0x0000000200000000) |
153 | #define CPU_FTR_ARCH_206 LONG_ASM_CONST(0x0000000800000000) | 153 | #define CPU_FTR_ARCH_206 LONG_ASM_CONST(0x0000000400000000) |
154 | #define CPU_FTR_CFAR LONG_ASM_CONST(0x0000001000000000) | 154 | #define CPU_FTR_CFAR LONG_ASM_CONST(0x0000000800000000) |
155 | #define CPU_FTR_IABR LONG_ASM_CONST(0x0000002000000000) | 155 | #define CPU_FTR_IABR LONG_ASM_CONST(0x0000001000000000) |
156 | #define CPU_FTR_MMCRA LONG_ASM_CONST(0x0000004000000000) | 156 | #define CPU_FTR_MMCRA LONG_ASM_CONST(0x0000002000000000) |
157 | #define CPU_FTR_CTRL LONG_ASM_CONST(0x0000008000000000) | 157 | #define CPU_FTR_CTRL LONG_ASM_CONST(0x0000004000000000) |
158 | #define CPU_FTR_SMT LONG_ASM_CONST(0x0000010000000000) | 158 | #define CPU_FTR_SMT LONG_ASM_CONST(0x0000008000000000) |
159 | #define CPU_FTR_PAUSE_ZERO LONG_ASM_CONST(0x0000200000000000) | 159 | #define CPU_FTR_PAUSE_ZERO LONG_ASM_CONST(0x0000010000000000) |
160 | #define CPU_FTR_PURR LONG_ASM_CONST(0x0000400000000000) | 160 | #define CPU_FTR_PURR LONG_ASM_CONST(0x0000020000000000) |
161 | #define CPU_FTR_CELL_TB_BUG LONG_ASM_CONST(0x0000800000000000) | 161 | #define CPU_FTR_CELL_TB_BUG LONG_ASM_CONST(0x0000040000000000) |
162 | #define CPU_FTR_SPURR LONG_ASM_CONST(0x0001000000000000) | 162 | #define CPU_FTR_SPURR LONG_ASM_CONST(0x0000080000000000) |
163 | #define CPU_FTR_DSCR LONG_ASM_CONST(0x0002000000000000) | 163 | #define CPU_FTR_DSCR LONG_ASM_CONST(0x0000100000000000) |
164 | #define CPU_FTR_VSX LONG_ASM_CONST(0x0010000000000000) | 164 | #define CPU_FTR_VSX LONG_ASM_CONST(0x0000200000000000) |
165 | #define CPU_FTR_SAO LONG_ASM_CONST(0x0020000000000000) | 165 | #define CPU_FTR_SAO LONG_ASM_CONST(0x0000400000000000) |
166 | #define CPU_FTR_CP_USE_DCBTZ LONG_ASM_CONST(0x0040000000000000) | 166 | #define CPU_FTR_CP_USE_DCBTZ LONG_ASM_CONST(0x0000800000000000) |
167 | #define CPU_FTR_UNALIGNED_LD_STD LONG_ASM_CONST(0x0080000000000000) | 167 | #define CPU_FTR_UNALIGNED_LD_STD LONG_ASM_CONST(0x0001000000000000) |
168 | #define CPU_FTR_ASYM_SMT LONG_ASM_CONST(0x0100000000000000) | 168 | #define CPU_FTR_ASYM_SMT LONG_ASM_CONST(0x0002000000000000) |
169 | #define CPU_FTR_STCX_CHECKS_ADDRESS LONG_ASM_CONST(0x0200000000000000) | 169 | #define CPU_FTR_STCX_CHECKS_ADDRESS LONG_ASM_CONST(0x0004000000000000) |
170 | #define CPU_FTR_POPCNTB LONG_ASM_CONST(0x0400000000000000) | 170 | #define CPU_FTR_POPCNTB LONG_ASM_CONST(0x0008000000000000) |
171 | #define CPU_FTR_POPCNTD LONG_ASM_CONST(0x0800000000000000) | 171 | #define CPU_FTR_POPCNTD LONG_ASM_CONST(0x0010000000000000) |
172 | #define CPU_FTR_ICSWX LONG_ASM_CONST(0x1000000000000000) | 172 | #define CPU_FTR_ICSWX LONG_ASM_CONST(0x0020000000000000) |
173 | #define CPU_FTR_VMX_COPY LONG_ASM_CONST(0x2000000000000000) | 173 | #define CPU_FTR_VMX_COPY LONG_ASM_CONST(0x0040000000000000) |
174 | #define CPU_FTR_TM LONG_ASM_CONST(0x0080000000000000) | ||
175 | #define CPU_FTR_BCTAR LONG_ASM_CONST(0x0100000000000000) | ||
176 | #define CPU_FTR_HAS_PPR LONG_ASM_CONST(0x0200000000000000) | ||
177 | #define CPU_FTR_DAWR LONG_ASM_CONST(0x0400000000000000) | ||
174 | 178 | ||
175 | #ifndef __ASSEMBLY__ | 179 | #ifndef __ASSEMBLY__ |
176 | 180 | ||
@@ -216,6 +220,13 @@ extern const char *powerpc_base_platform; | |||
216 | #define PPC_FEATURE_HAS_EFP_DOUBLE_COMP 0 | 220 | #define PPC_FEATURE_HAS_EFP_DOUBLE_COMP 0 |
217 | #endif | 221 | #endif |
218 | 222 | ||
223 | /* We only set the TM feature if the kernel was compiled with TM supprt */ | ||
224 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | ||
225 | #define CPU_FTR_TM_COMP CPU_FTR_TM | ||
226 | #else | ||
227 | #define CPU_FTR_TM_COMP 0 | ||
228 | #endif | ||
229 | |||
219 | /* We need to mark all pages as being coherent if we're SMP or we have a | 230 | /* We need to mark all pages as being coherent if we're SMP or we have a |
220 | * 74[45]x and an MPC107 host bridge. Also 83xx and PowerQUICC II | 231 | * 74[45]x and an MPC107 host bridge. Also 83xx and PowerQUICC II |
221 | * require it for PCI "streaming/prefetch" to work properly. | 232 | * require it for PCI "streaming/prefetch" to work properly. |
@@ -400,7 +411,8 @@ extern const char *powerpc_base_platform; | |||
400 | CPU_FTR_PURR | CPU_FTR_SPURR | CPU_FTR_REAL_LE | \ | 411 | CPU_FTR_PURR | CPU_FTR_SPURR | CPU_FTR_REAL_LE | \ |
401 | CPU_FTR_DSCR | CPU_FTR_SAO | CPU_FTR_ASYM_SMT | \ | 412 | CPU_FTR_DSCR | CPU_FTR_SAO | CPU_FTR_ASYM_SMT | \ |
402 | CPU_FTR_STCX_CHECKS_ADDRESS | CPU_FTR_POPCNTB | CPU_FTR_POPCNTD | \ | 413 | CPU_FTR_STCX_CHECKS_ADDRESS | CPU_FTR_POPCNTB | CPU_FTR_POPCNTD | \ |
403 | CPU_FTR_ICSWX | CPU_FTR_CFAR | CPU_FTR_HVMODE | CPU_FTR_VMX_COPY) | 414 | CPU_FTR_ICSWX | CPU_FTR_CFAR | CPU_FTR_HVMODE | \ |
415 | CPU_FTR_VMX_COPY | CPU_FTR_HAS_PPR) | ||
404 | #define CPU_FTRS_POWER8 (CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \ | 416 | #define CPU_FTRS_POWER8 (CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \ |
405 | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | CPU_FTR_ARCH_206 |\ | 417 | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | CPU_FTR_ARCH_206 |\ |
406 | CPU_FTR_MMCRA | CPU_FTR_SMT | \ | 418 | CPU_FTR_MMCRA | CPU_FTR_SMT | \ |
@@ -408,7 +420,9 @@ extern const char *powerpc_base_platform; | |||
408 | CPU_FTR_PURR | CPU_FTR_SPURR | CPU_FTR_REAL_LE | \ | 420 | CPU_FTR_PURR | CPU_FTR_SPURR | CPU_FTR_REAL_LE | \ |
409 | CPU_FTR_DSCR | CPU_FTR_SAO | \ | 421 | CPU_FTR_DSCR | CPU_FTR_SAO | \ |
410 | CPU_FTR_STCX_CHECKS_ADDRESS | CPU_FTR_POPCNTB | CPU_FTR_POPCNTD | \ | 422 | CPU_FTR_STCX_CHECKS_ADDRESS | CPU_FTR_POPCNTB | CPU_FTR_POPCNTD | \ |
411 | CPU_FTR_ICSWX | CPU_FTR_CFAR | CPU_FTR_HVMODE | CPU_FTR_VMX_COPY) | 423 | CPU_FTR_ICSWX | CPU_FTR_CFAR | CPU_FTR_HVMODE | CPU_FTR_VMX_COPY | \ |
424 | CPU_FTR_DBELL | CPU_FTR_HAS_PPR | CPU_FTR_DAWR | CPU_FTR_BCTAR | \ | ||
425 | CPU_FTR_TM_COMP) | ||
412 | #define CPU_FTRS_CELL (CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \ | 426 | #define CPU_FTRS_CELL (CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \ |
413 | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | \ | 427 | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | \ |
414 | CPU_FTR_ALTIVEC_COMP | CPU_FTR_MMCRA | CPU_FTR_SMT | \ | 428 | CPU_FTR_ALTIVEC_COMP | CPU_FTR_MMCRA | CPU_FTR_SMT | \ |
diff --git a/arch/powerpc/include/asm/dbell.h b/arch/powerpc/include/asm/dbell.h index 607e4eeeb694..5fa6b20eba10 100644 --- a/arch/powerpc/include/asm/dbell.h +++ b/arch/powerpc/include/asm/dbell.h | |||
@@ -28,8 +28,36 @@ enum ppc_dbell { | |||
28 | PPC_G_DBELL = 2, /* guest doorbell */ | 28 | PPC_G_DBELL = 2, /* guest doorbell */ |
29 | PPC_G_DBELL_CRIT = 3, /* guest critical doorbell */ | 29 | PPC_G_DBELL_CRIT = 3, /* guest critical doorbell */ |
30 | PPC_G_DBELL_MC = 4, /* guest mcheck doorbell */ | 30 | PPC_G_DBELL_MC = 4, /* guest mcheck doorbell */ |
31 | PPC_DBELL_SERVER = 5, /* doorbell on server */ | ||
31 | }; | 32 | }; |
32 | 33 | ||
34 | #ifdef CONFIG_PPC_BOOK3S | ||
35 | |||
36 | #define PPC_DBELL_MSGTYPE PPC_DBELL_SERVER | ||
37 | #define SPRN_DOORBELL_CPUTAG SPRN_TIR | ||
38 | #define PPC_DBELL_TAG_MASK 0x7f | ||
39 | |||
40 | static inline void _ppc_msgsnd(u32 msg) | ||
41 | { | ||
42 | if (cpu_has_feature(CPU_FTR_HVMODE)) | ||
43 | __asm__ __volatile__ (PPC_MSGSND(%0) : : "r" (msg)); | ||
44 | else | ||
45 | __asm__ __volatile__ (PPC_MSGSNDP(%0) : : "r" (msg)); | ||
46 | } | ||
47 | |||
48 | #else /* CONFIG_PPC_BOOK3S */ | ||
49 | |||
50 | #define PPC_DBELL_MSGTYPE PPC_DBELL | ||
51 | #define SPRN_DOORBELL_CPUTAG SPRN_PIR | ||
52 | #define PPC_DBELL_TAG_MASK 0x3fff | ||
53 | |||
54 | static inline void _ppc_msgsnd(u32 msg) | ||
55 | { | ||
56 | __asm__ __volatile__ (PPC_MSGSND(%0) : : "r" (msg)); | ||
57 | } | ||
58 | |||
59 | #endif /* CONFIG_PPC_BOOK3S */ | ||
60 | |||
33 | extern void doorbell_cause_ipi(int cpu, unsigned long data); | 61 | extern void doorbell_cause_ipi(int cpu, unsigned long data); |
34 | extern void doorbell_exception(struct pt_regs *regs); | 62 | extern void doorbell_exception(struct pt_regs *regs); |
35 | extern void doorbell_setup_this_cpu(void); | 63 | extern void doorbell_setup_this_cpu(void); |
@@ -39,7 +67,7 @@ static inline void ppc_msgsnd(enum ppc_dbell type, u32 flags, u32 tag) | |||
39 | u32 msg = PPC_DBELL_TYPE(type) | (flags & PPC_DBELL_MSG_BRDCAST) | | 67 | u32 msg = PPC_DBELL_TYPE(type) | (flags & PPC_DBELL_MSG_BRDCAST) | |
40 | (tag & 0x07ffffff); | 68 | (tag & 0x07ffffff); |
41 | 69 | ||
42 | __asm__ __volatile__ (PPC_MSGSND(%0) : : "r" (msg)); | 70 | _ppc_msgsnd(msg); |
43 | } | 71 | } |
44 | 72 | ||
45 | #endif /* _ASM_POWERPC_DBELL_H */ | 73 | #endif /* _ASM_POWERPC_DBELL_H */ |
diff --git a/arch/powerpc/include/asm/debug.h b/arch/powerpc/include/asm/debug.h index 32de2577bb6d..d2516308ed1e 100644 --- a/arch/powerpc/include/asm/debug.h +++ b/arch/powerpc/include/asm/debug.h | |||
@@ -4,6 +4,8 @@ | |||
4 | #ifndef _ASM_POWERPC_DEBUG_H | 4 | #ifndef _ASM_POWERPC_DEBUG_H |
5 | #define _ASM_POWERPC_DEBUG_H | 5 | #define _ASM_POWERPC_DEBUG_H |
6 | 6 | ||
7 | #include <asm/hw_breakpoint.h> | ||
8 | |||
7 | struct pt_regs; | 9 | struct pt_regs; |
8 | 10 | ||
9 | extern struct dentry *powerpc_debugfs_root; | 11 | extern struct dentry *powerpc_debugfs_root; |
@@ -15,7 +17,7 @@ extern int (*__debugger_ipi)(struct pt_regs *regs); | |||
15 | extern int (*__debugger_bpt)(struct pt_regs *regs); | 17 | extern int (*__debugger_bpt)(struct pt_regs *regs); |
16 | extern int (*__debugger_sstep)(struct pt_regs *regs); | 18 | extern int (*__debugger_sstep)(struct pt_regs *regs); |
17 | extern int (*__debugger_iabr_match)(struct pt_regs *regs); | 19 | extern int (*__debugger_iabr_match)(struct pt_regs *regs); |
18 | extern int (*__debugger_dabr_match)(struct pt_regs *regs); | 20 | extern int (*__debugger_break_match)(struct pt_regs *regs); |
19 | extern int (*__debugger_fault_handler)(struct pt_regs *regs); | 21 | extern int (*__debugger_fault_handler)(struct pt_regs *regs); |
20 | 22 | ||
21 | #define DEBUGGER_BOILERPLATE(__NAME) \ | 23 | #define DEBUGGER_BOILERPLATE(__NAME) \ |
@@ -31,7 +33,7 @@ DEBUGGER_BOILERPLATE(debugger_ipi) | |||
31 | DEBUGGER_BOILERPLATE(debugger_bpt) | 33 | DEBUGGER_BOILERPLATE(debugger_bpt) |
32 | DEBUGGER_BOILERPLATE(debugger_sstep) | 34 | DEBUGGER_BOILERPLATE(debugger_sstep) |
33 | DEBUGGER_BOILERPLATE(debugger_iabr_match) | 35 | DEBUGGER_BOILERPLATE(debugger_iabr_match) |
34 | DEBUGGER_BOILERPLATE(debugger_dabr_match) | 36 | DEBUGGER_BOILERPLATE(debugger_break_match) |
35 | DEBUGGER_BOILERPLATE(debugger_fault_handler) | 37 | DEBUGGER_BOILERPLATE(debugger_fault_handler) |
36 | 38 | ||
37 | #else | 39 | #else |
@@ -40,17 +42,18 @@ static inline int debugger_ipi(struct pt_regs *regs) { return 0; } | |||
40 | static inline int debugger_bpt(struct pt_regs *regs) { return 0; } | 42 | static inline int debugger_bpt(struct pt_regs *regs) { return 0; } |
41 | static inline int debugger_sstep(struct pt_regs *regs) { return 0; } | 43 | static inline int debugger_sstep(struct pt_regs *regs) { return 0; } |
42 | static inline int debugger_iabr_match(struct pt_regs *regs) { return 0; } | 44 | static inline int debugger_iabr_match(struct pt_regs *regs) { return 0; } |
43 | static inline int debugger_dabr_match(struct pt_regs *regs) { return 0; } | 45 | static inline int debugger_break_match(struct pt_regs *regs) { return 0; } |
44 | static inline int debugger_fault_handler(struct pt_regs *regs) { return 0; } | 46 | static inline int debugger_fault_handler(struct pt_regs *regs) { return 0; } |
45 | #endif | 47 | #endif |
46 | 48 | ||
47 | extern int set_dabr(unsigned long dabr, unsigned long dabrx); | 49 | int set_breakpoint(struct arch_hw_breakpoint *brk); |
48 | #ifdef CONFIG_PPC_ADV_DEBUG_REGS | 50 | #ifdef CONFIG_PPC_ADV_DEBUG_REGS |
49 | extern void do_send_trap(struct pt_regs *regs, unsigned long address, | 51 | extern void do_send_trap(struct pt_regs *regs, unsigned long address, |
50 | unsigned long error_code, int signal_code, int brkpt); | 52 | unsigned long error_code, int signal_code, int brkpt); |
51 | #else | 53 | #else |
52 | extern void do_dabr(struct pt_regs *regs, unsigned long address, | 54 | |
53 | unsigned long error_code); | 55 | extern void do_break(struct pt_regs *regs, unsigned long address, |
56 | unsigned long error_code); | ||
54 | #endif | 57 | #endif |
55 | 58 | ||
56 | #endif /* _ASM_POWERPC_DEBUG_H */ | 59 | #endif /* _ASM_POWERPC_DEBUG_H */ |
diff --git a/arch/powerpc/include/asm/eeh.h b/arch/powerpc/include/asm/eeh.h index a8fb03e22770..a80e32b46c11 100644 --- a/arch/powerpc/include/asm/eeh.h +++ b/arch/powerpc/include/asm/eeh.h | |||
@@ -201,6 +201,7 @@ int eeh_dev_check_failure(struct eeh_dev *edev); | |||
201 | void __init eeh_addr_cache_build(void); | 201 | void __init eeh_addr_cache_build(void); |
202 | void eeh_add_device_tree_early(struct device_node *); | 202 | void eeh_add_device_tree_early(struct device_node *); |
203 | void eeh_add_device_tree_late(struct pci_bus *); | 203 | void eeh_add_device_tree_late(struct pci_bus *); |
204 | void eeh_add_sysfs_files(struct pci_bus *); | ||
204 | void eeh_remove_bus_device(struct pci_dev *, int); | 205 | void eeh_remove_bus_device(struct pci_dev *, int); |
205 | 206 | ||
206 | /** | 207 | /** |
@@ -240,6 +241,8 @@ static inline void eeh_add_device_tree_early(struct device_node *dn) { } | |||
240 | 241 | ||
241 | static inline void eeh_add_device_tree_late(struct pci_bus *bus) { } | 242 | static inline void eeh_add_device_tree_late(struct pci_bus *bus) { } |
242 | 243 | ||
244 | static inline void eeh_add_sysfs_files(struct pci_bus *bus) { } | ||
245 | |||
243 | static inline void eeh_remove_bus_device(struct pci_dev *dev, int purge_pe) { } | 246 | static inline void eeh_remove_bus_device(struct pci_dev *dev, int purge_pe) { } |
244 | 247 | ||
245 | static inline void eeh_lock(void) { } | 248 | static inline void eeh_lock(void) { } |
diff --git a/arch/powerpc/include/asm/exception-64s.h b/arch/powerpc/include/asm/exception-64s.h index ad708dda3ba3..05e6d2ee1db9 100644 --- a/arch/powerpc/include/asm/exception-64s.h +++ b/arch/powerpc/include/asm/exception-64s.h | |||
@@ -47,9 +47,10 @@ | |||
47 | #define EX_R3 64 | 47 | #define EX_R3 64 |
48 | #define EX_LR 72 | 48 | #define EX_LR 72 |
49 | #define EX_CFAR 80 | 49 | #define EX_CFAR 80 |
50 | #define EX_PPR 88 /* SMT thread status register (priority) */ | ||
50 | 51 | ||
51 | #ifdef CONFIG_RELOCATABLE | 52 | #ifdef CONFIG_RELOCATABLE |
52 | #define EXCEPTION_RELON_PROLOG_PSERIES_1(label, h) \ | 53 | #define __EXCEPTION_RELON_PROLOG_PSERIES_1(label, h) \ |
53 | ld r12,PACAKBASE(r13); /* get high part of &label */ \ | 54 | ld r12,PACAKBASE(r13); /* get high part of &label */ \ |
54 | mfspr r11,SPRN_##h##SRR0; /* save SRR0 */ \ | 55 | mfspr r11,SPRN_##h##SRR0; /* save SRR0 */ \ |
55 | LOAD_HANDLER(r12,label); \ | 56 | LOAD_HANDLER(r12,label); \ |
@@ -60,13 +61,15 @@ | |||
60 | blr; | 61 | blr; |
61 | #else | 62 | #else |
62 | /* If not relocatable, we can jump directly -- and save messing with LR */ | 63 | /* If not relocatable, we can jump directly -- and save messing with LR */ |
63 | #define EXCEPTION_RELON_PROLOG_PSERIES_1(label, h) \ | 64 | #define __EXCEPTION_RELON_PROLOG_PSERIES_1(label, h) \ |
64 | mfspr r11,SPRN_##h##SRR0; /* save SRR0 */ \ | 65 | mfspr r11,SPRN_##h##SRR0; /* save SRR0 */ \ |
65 | mfspr r12,SPRN_##h##SRR1; /* and SRR1 */ \ | 66 | mfspr r12,SPRN_##h##SRR1; /* and SRR1 */ \ |
66 | li r10,MSR_RI; \ | 67 | li r10,MSR_RI; \ |
67 | mtmsrd r10,1; /* Set RI (EE=0) */ \ | 68 | mtmsrd r10,1; /* Set RI (EE=0) */ \ |
68 | b label; | 69 | b label; |
69 | #endif | 70 | #endif |
71 | #define EXCEPTION_RELON_PROLOG_PSERIES_1(label, h) \ | ||
72 | __EXCEPTION_RELON_PROLOG_PSERIES_1(label, h) \ | ||
70 | 73 | ||
71 | /* | 74 | /* |
72 | * As EXCEPTION_PROLOG_PSERIES(), except we've already got relocation on | 75 | * As EXCEPTION_PROLOG_PSERIES(), except we've already got relocation on |
@@ -74,6 +77,7 @@ | |||
74 | * case EXCEPTION_RELON_PROLOG_PSERIES_1 will be using lr. | 77 | * case EXCEPTION_RELON_PROLOG_PSERIES_1 will be using lr. |
75 | */ | 78 | */ |
76 | #define EXCEPTION_RELON_PROLOG_PSERIES(area, label, h, extra, vec) \ | 79 | #define EXCEPTION_RELON_PROLOG_PSERIES(area, label, h, extra, vec) \ |
80 | EXCEPTION_PROLOG_0(area); \ | ||
77 | EXCEPTION_PROLOG_1(area, extra, vec); \ | 81 | EXCEPTION_PROLOG_1(area, extra, vec); \ |
78 | EXCEPTION_RELON_PROLOG_PSERIES_1(label, h) | 82 | EXCEPTION_RELON_PROLOG_PSERIES_1(label, h) |
79 | 83 | ||
@@ -107,14 +111,59 @@ | |||
107 | #define RESTORE_LR(reg, area) | 111 | #define RESTORE_LR(reg, area) |
108 | #endif | 112 | #endif |
109 | 113 | ||
110 | #define __EXCEPTION_PROLOG_1(area, extra, vec) \ | 114 | /* |
115 | * PPR save/restore macros used in exceptions_64s.S | ||
116 | * Used for P7 or later processors | ||
117 | */ | ||
118 | #define SAVE_PPR(area, ra, rb) \ | ||
119 | BEGIN_FTR_SECTION_NESTED(940) \ | ||
120 | ld ra,PACACURRENT(r13); \ | ||
121 | ld rb,area+EX_PPR(r13); /* Read PPR from paca */ \ | ||
122 | std rb,TASKTHREADPPR(ra); \ | ||
123 | END_FTR_SECTION_NESTED(CPU_FTR_HAS_PPR,CPU_FTR_HAS_PPR,940) | ||
124 | |||
125 | #define RESTORE_PPR_PACA(area, ra) \ | ||
126 | BEGIN_FTR_SECTION_NESTED(941) \ | ||
127 | ld ra,area+EX_PPR(r13); \ | ||
128 | mtspr SPRN_PPR,ra; \ | ||
129 | END_FTR_SECTION_NESTED(CPU_FTR_HAS_PPR,CPU_FTR_HAS_PPR,941) | ||
130 | |||
131 | /* | ||
132 | * Increase the priority on systems where PPR save/restore is not | ||
133 | * implemented/ supported. | ||
134 | */ | ||
135 | #define HMT_MEDIUM_PPR_DISCARD \ | ||
136 | BEGIN_FTR_SECTION_NESTED(942) \ | ||
137 | HMT_MEDIUM; \ | ||
138 | END_FTR_SECTION_NESTED(CPU_FTR_HAS_PPR,0,942) /*non P7*/ | ||
139 | |||
140 | /* | ||
141 | * Get an SPR into a register if the CPU has the given feature | ||
142 | */ | ||
143 | #define OPT_GET_SPR(ra, spr, ftr) \ | ||
144 | BEGIN_FTR_SECTION_NESTED(943) \ | ||
145 | mfspr ra,spr; \ | ||
146 | END_FTR_SECTION_NESTED(ftr,ftr,943) | ||
147 | |||
148 | /* | ||
149 | * Save a register to the PACA if the CPU has the given feature | ||
150 | */ | ||
151 | #define OPT_SAVE_REG_TO_PACA(offset, ra, ftr) \ | ||
152 | BEGIN_FTR_SECTION_NESTED(943) \ | ||
153 | std ra,offset(r13); \ | ||
154 | END_FTR_SECTION_NESTED(ftr,ftr,943) | ||
155 | |||
156 | #define EXCEPTION_PROLOG_0(area) \ | ||
111 | GET_PACA(r13); \ | 157 | GET_PACA(r13); \ |
112 | std r9,area+EX_R9(r13); /* save r9 - r12 */ \ | 158 | std r9,area+EX_R9(r13); /* save r9 */ \ |
113 | std r10,area+EX_R10(r13); \ | 159 | OPT_GET_SPR(r9, SPRN_PPR, CPU_FTR_HAS_PPR); \ |
114 | BEGIN_FTR_SECTION_NESTED(66); \ | 160 | HMT_MEDIUM; \ |
115 | mfspr r10,SPRN_CFAR; \ | 161 | std r10,area+EX_R10(r13); /* save r10 - r12 */ \ |
116 | std r10,area+EX_CFAR(r13); \ | 162 | OPT_GET_SPR(r10, SPRN_CFAR, CPU_FTR_CFAR) |
117 | END_FTR_SECTION_NESTED(CPU_FTR_CFAR, CPU_FTR_CFAR, 66); \ | 163 | |
164 | #define __EXCEPTION_PROLOG_1(area, extra, vec) \ | ||
165 | OPT_SAVE_REG_TO_PACA(area+EX_PPR, r9, CPU_FTR_HAS_PPR); \ | ||
166 | OPT_SAVE_REG_TO_PACA(area+EX_CFAR, r10, CPU_FTR_CFAR); \ | ||
118 | SAVE_LR(r10, area); \ | 167 | SAVE_LR(r10, area); \ |
119 | mfcr r9; \ | 168 | mfcr r9; \ |
120 | extra(vec); \ | 169 | extra(vec); \ |
@@ -139,6 +188,7 @@ | |||
139 | __EXCEPTION_PROLOG_PSERIES_1(label, h) | 188 | __EXCEPTION_PROLOG_PSERIES_1(label, h) |
140 | 189 | ||
141 | #define EXCEPTION_PROLOG_PSERIES(area, label, h, extra, vec) \ | 190 | #define EXCEPTION_PROLOG_PSERIES(area, label, h, extra, vec) \ |
191 | EXCEPTION_PROLOG_0(area); \ | ||
142 | EXCEPTION_PROLOG_1(area, extra, vec); \ | 192 | EXCEPTION_PROLOG_1(area, extra, vec); \ |
143 | EXCEPTION_PROLOG_PSERIES_1(label, h); | 193 | EXCEPTION_PROLOG_PSERIES_1(label, h); |
144 | 194 | ||
@@ -149,10 +199,14 @@ | |||
149 | 199 | ||
150 | #define __KVM_HANDLER(area, h, n) \ | 200 | #define __KVM_HANDLER(area, h, n) \ |
151 | do_kvm_##n: \ | 201 | do_kvm_##n: \ |
202 | BEGIN_FTR_SECTION_NESTED(947) \ | ||
203 | ld r10,area+EX_CFAR(r13); \ | ||
204 | std r10,HSTATE_CFAR(r13); \ | ||
205 | END_FTR_SECTION_NESTED(CPU_FTR_CFAR,CPU_FTR_CFAR,947); \ | ||
152 | ld r10,area+EX_R10(r13); \ | 206 | ld r10,area+EX_R10(r13); \ |
153 | stw r9,HSTATE_SCRATCH1(r13); \ | 207 | stw r9,HSTATE_SCRATCH1(r13); \ |
154 | ld r9,area+EX_R9(r13); \ | 208 | ld r9,area+EX_R9(r13); \ |
155 | std r12,HSTATE_SCRATCH0(r13); \ | 209 | std r12,HSTATE_SCRATCH0(r13); \ |
156 | li r12,n; \ | 210 | li r12,n; \ |
157 | b kvmppc_interrupt | 211 | b kvmppc_interrupt |
158 | 212 | ||
@@ -224,8 +278,10 @@ do_kvm_##n: \ | |||
224 | std r10,0(r1); /* make stack chain pointer */ \ | 278 | std r10,0(r1); /* make stack chain pointer */ \ |
225 | std r0,GPR0(r1); /* save r0 in stackframe */ \ | 279 | std r0,GPR0(r1); /* save r0 in stackframe */ \ |
226 | std r10,GPR1(r1); /* save r1 in stackframe */ \ | 280 | std r10,GPR1(r1); /* save r1 in stackframe */ \ |
281 | beq 4f; /* if from kernel mode */ \ | ||
227 | ACCOUNT_CPU_USER_ENTRY(r9, r10); \ | 282 | ACCOUNT_CPU_USER_ENTRY(r9, r10); \ |
228 | std r2,GPR2(r1); /* save r2 in stackframe */ \ | 283 | SAVE_PPR(area, r9, r10); \ |
284 | 4: std r2,GPR2(r1); /* save r2 in stackframe */ \ | ||
229 | SAVE_4GPRS(3, r1); /* save r3 - r6 in stackframe */ \ | 285 | SAVE_4GPRS(3, r1); /* save r3 - r6 in stackframe */ \ |
230 | SAVE_2GPRS(7, r1); /* save r7, r8 in stackframe */ \ | 286 | SAVE_2GPRS(7, r1); /* save r7, r8 in stackframe */ \ |
231 | ld r9,area+EX_R9(r13); /* move r9, r10 to stackframe */ \ | 287 | ld r9,area+EX_R9(r13); /* move r9, r10 to stackframe */ \ |
@@ -266,45 +322,74 @@ do_kvm_##n: \ | |||
266 | . = loc; \ | 322 | . = loc; \ |
267 | .globl label##_pSeries; \ | 323 | .globl label##_pSeries; \ |
268 | label##_pSeries: \ | 324 | label##_pSeries: \ |
269 | HMT_MEDIUM; \ | 325 | HMT_MEDIUM_PPR_DISCARD; \ |
270 | SET_SCRATCH0(r13); /* save r13 */ \ | 326 | SET_SCRATCH0(r13); /* save r13 */ \ |
271 | EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, label##_common, \ | 327 | EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, label##_common, \ |
272 | EXC_STD, KVMTEST_PR, vec) | 328 | EXC_STD, KVMTEST_PR, vec) |
273 | 329 | ||
330 | /* Version of above for when we have to branch out-of-line */ | ||
331 | #define STD_EXCEPTION_PSERIES_OOL(vec, label) \ | ||
332 | .globl label##_pSeries; \ | ||
333 | label##_pSeries: \ | ||
334 | EXCEPTION_PROLOG_1(PACA_EXGEN, KVMTEST_PR, vec); \ | ||
335 | EXCEPTION_PROLOG_PSERIES_1(label##_common, EXC_STD) | ||
336 | |||
274 | #define STD_EXCEPTION_HV(loc, vec, label) \ | 337 | #define STD_EXCEPTION_HV(loc, vec, label) \ |
275 | . = loc; \ | 338 | . = loc; \ |
276 | .globl label##_hv; \ | 339 | .globl label##_hv; \ |
277 | label##_hv: \ | 340 | label##_hv: \ |
278 | HMT_MEDIUM; \ | 341 | HMT_MEDIUM_PPR_DISCARD; \ |
279 | SET_SCRATCH0(r13); /* save r13 */ \ | 342 | SET_SCRATCH0(r13); /* save r13 */ \ |
280 | EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, label##_common, \ | 343 | EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, label##_common, \ |
281 | EXC_HV, KVMTEST, vec) | 344 | EXC_HV, KVMTEST, vec) |
282 | 345 | ||
346 | /* Version of above for when we have to branch out-of-line */ | ||
347 | #define STD_EXCEPTION_HV_OOL(vec, label) \ | ||
348 | .globl label##_hv; \ | ||
349 | label##_hv: \ | ||
350 | EXCEPTION_PROLOG_1(PACA_EXGEN, KVMTEST, vec); \ | ||
351 | EXCEPTION_PROLOG_PSERIES_1(label##_common, EXC_HV) | ||
352 | |||
283 | #define STD_RELON_EXCEPTION_PSERIES(loc, vec, label) \ | 353 | #define STD_RELON_EXCEPTION_PSERIES(loc, vec, label) \ |
284 | . = loc; \ | 354 | . = loc; \ |
285 | .globl label##_relon_pSeries; \ | 355 | .globl label##_relon_pSeries; \ |
286 | label##_relon_pSeries: \ | 356 | label##_relon_pSeries: \ |
287 | HMT_MEDIUM; \ | 357 | HMT_MEDIUM_PPR_DISCARD; \ |
288 | /* No guest interrupts come through here */ \ | 358 | /* No guest interrupts come through here */ \ |
289 | SET_SCRATCH0(r13); /* save r13 */ \ | 359 | SET_SCRATCH0(r13); /* save r13 */ \ |
290 | EXCEPTION_RELON_PROLOG_PSERIES(PACA_EXGEN, label##_common, \ | 360 | EXCEPTION_RELON_PROLOG_PSERIES(PACA_EXGEN, label##_common, \ |
291 | EXC_STD, KVMTEST_PR, vec) | 361 | EXC_STD, KVMTEST_PR, vec) |
292 | 362 | ||
363 | #define STD_RELON_EXCEPTION_PSERIES_OOL(vec, label) \ | ||
364 | .globl label##_relon_pSeries; \ | ||
365 | label##_relon_pSeries: \ | ||
366 | EXCEPTION_PROLOG_1(PACA_EXGEN, KVMTEST_PR, vec); \ | ||
367 | EXCEPTION_RELON_PROLOG_PSERIES_1(label##_common, EXC_STD) | ||
368 | |||
293 | #define STD_RELON_EXCEPTION_HV(loc, vec, label) \ | 369 | #define STD_RELON_EXCEPTION_HV(loc, vec, label) \ |
294 | . = loc; \ | 370 | . = loc; \ |
295 | .globl label##_relon_hv; \ | 371 | .globl label##_relon_hv; \ |
296 | label##_relon_hv: \ | 372 | label##_relon_hv: \ |
297 | HMT_MEDIUM; \ | 373 | HMT_MEDIUM_PPR_DISCARD; \ |
298 | /* No guest interrupts come through here */ \ | 374 | /* No guest interrupts come through here */ \ |
299 | SET_SCRATCH0(r13); /* save r13 */ \ | 375 | SET_SCRATCH0(r13); /* save r13 */ \ |
300 | EXCEPTION_RELON_PROLOG_PSERIES(PACA_EXGEN, label##_common, \ | 376 | EXCEPTION_RELON_PROLOG_PSERIES(PACA_EXGEN, label##_common, \ |
301 | EXC_HV, KVMTEST, vec) | 377 | EXC_HV, KVMTEST, vec) |
302 | 378 | ||
379 | #define STD_RELON_EXCEPTION_HV_OOL(vec, label) \ | ||
380 | .globl label##_relon_hv; \ | ||
381 | label##_relon_hv: \ | ||
382 | EXCEPTION_PROLOG_1(PACA_EXGEN, KVMTEST, vec); \ | ||
383 | EXCEPTION_RELON_PROLOG_PSERIES_1(label##_common, EXC_HV) | ||
384 | |||
303 | /* This associate vector numbers with bits in paca->irq_happened */ | 385 | /* This associate vector numbers with bits in paca->irq_happened */ |
304 | #define SOFTEN_VALUE_0x500 PACA_IRQ_EE | 386 | #define SOFTEN_VALUE_0x500 PACA_IRQ_EE |
305 | #define SOFTEN_VALUE_0x502 PACA_IRQ_EE | 387 | #define SOFTEN_VALUE_0x502 PACA_IRQ_EE |
306 | #define SOFTEN_VALUE_0x900 PACA_IRQ_DEC | 388 | #define SOFTEN_VALUE_0x900 PACA_IRQ_DEC |
307 | #define SOFTEN_VALUE_0x982 PACA_IRQ_DEC | 389 | #define SOFTEN_VALUE_0x982 PACA_IRQ_DEC |
390 | #define SOFTEN_VALUE_0xa00 PACA_IRQ_DBELL | ||
391 | #define SOFTEN_VALUE_0xe80 PACA_IRQ_DBELL | ||
392 | #define SOFTEN_VALUE_0xe82 PACA_IRQ_DBELL | ||
308 | 393 | ||
309 | #define __SOFTEN_TEST(h, vec) \ | 394 | #define __SOFTEN_TEST(h, vec) \ |
310 | lbz r10,PACASOFTIRQEN(r13); \ | 395 | lbz r10,PACASOFTIRQEN(r13); \ |
@@ -329,10 +414,12 @@ label##_relon_hv: \ | |||
329 | #define SOFTEN_NOTEST_HV(vec) _SOFTEN_TEST(EXC_HV, vec) | 414 | #define SOFTEN_NOTEST_HV(vec) _SOFTEN_TEST(EXC_HV, vec) |
330 | 415 | ||
331 | #define __MASKABLE_EXCEPTION_PSERIES(vec, label, h, extra) \ | 416 | #define __MASKABLE_EXCEPTION_PSERIES(vec, label, h, extra) \ |
332 | HMT_MEDIUM; \ | 417 | HMT_MEDIUM_PPR_DISCARD; \ |
333 | SET_SCRATCH0(r13); /* save r13 */ \ | 418 | SET_SCRATCH0(r13); /* save r13 */ \ |
334 | __EXCEPTION_PROLOG_1(PACA_EXGEN, extra, vec); \ | 419 | EXCEPTION_PROLOG_0(PACA_EXGEN); \ |
420 | __EXCEPTION_PROLOG_1(PACA_EXGEN, extra, vec); \ | ||
335 | EXCEPTION_PROLOG_PSERIES_1(label##_common, h); | 421 | EXCEPTION_PROLOG_PSERIES_1(label##_common, h); |
422 | |||
336 | #define _MASKABLE_EXCEPTION_PSERIES(vec, label, h, extra) \ | 423 | #define _MASKABLE_EXCEPTION_PSERIES(vec, label, h, extra) \ |
337 | __MASKABLE_EXCEPTION_PSERIES(vec, label, h, extra) | 424 | __MASKABLE_EXCEPTION_PSERIES(vec, label, h, extra) |
338 | 425 | ||
@@ -350,9 +437,16 @@ label##_hv: \ | |||
350 | _MASKABLE_EXCEPTION_PSERIES(vec, label, \ | 437 | _MASKABLE_EXCEPTION_PSERIES(vec, label, \ |
351 | EXC_HV, SOFTEN_TEST_HV) | 438 | EXC_HV, SOFTEN_TEST_HV) |
352 | 439 | ||
440 | #define MASKABLE_EXCEPTION_HV_OOL(vec, label) \ | ||
441 | .globl label##_hv; \ | ||
442 | label##_hv: \ | ||
443 | EXCEPTION_PROLOG_1(PACA_EXGEN, SOFTEN_TEST_HV, vec); \ | ||
444 | EXCEPTION_PROLOG_PSERIES_1(label##_common, EXC_HV); | ||
445 | |||
353 | #define __MASKABLE_RELON_EXCEPTION_PSERIES(vec, label, h, extra) \ | 446 | #define __MASKABLE_RELON_EXCEPTION_PSERIES(vec, label, h, extra) \ |
354 | HMT_MEDIUM; \ | 447 | HMT_MEDIUM_PPR_DISCARD; \ |
355 | SET_SCRATCH0(r13); /* save r13 */ \ | 448 | SET_SCRATCH0(r13); /* save r13 */ \ |
449 | EXCEPTION_PROLOG_0(PACA_EXGEN); \ | ||
356 | __EXCEPTION_PROLOG_1(PACA_EXGEN, extra, vec); \ | 450 | __EXCEPTION_PROLOG_1(PACA_EXGEN, extra, vec); \ |
357 | EXCEPTION_RELON_PROLOG_PSERIES_1(label##_common, h); | 451 | EXCEPTION_RELON_PROLOG_PSERIES_1(label##_common, h); |
358 | #define _MASKABLE_RELON_EXCEPTION_PSERIES(vec, label, h, extra) \ | 452 | #define _MASKABLE_RELON_EXCEPTION_PSERIES(vec, label, h, extra) \ |
@@ -372,6 +466,12 @@ label##_relon_hv: \ | |||
372 | _MASKABLE_RELON_EXCEPTION_PSERIES(vec, label, \ | 466 | _MASKABLE_RELON_EXCEPTION_PSERIES(vec, label, \ |
373 | EXC_HV, SOFTEN_NOTEST_HV) | 467 | EXC_HV, SOFTEN_NOTEST_HV) |
374 | 468 | ||
469 | #define MASKABLE_RELON_EXCEPTION_HV_OOL(vec, label) \ | ||
470 | .globl label##_relon_hv; \ | ||
471 | label##_relon_hv: \ | ||
472 | EXCEPTION_PROLOG_1(PACA_EXGEN, SOFTEN_NOTEST_HV, vec); \ | ||
473 | EXCEPTION_PROLOG_PSERIES_1(label##_common, EXC_HV); | ||
474 | |||
375 | /* | 475 | /* |
376 | * Our exception common code can be passed various "additions" | 476 | * Our exception common code can be passed various "additions" |
377 | * to specify the behaviour of interrupts, whether to kick the | 477 | * to specify the behaviour of interrupts, whether to kick the |
diff --git a/arch/powerpc/include/asm/firmware.h b/arch/powerpc/include/asm/firmware.h index 973cc3be011b..097dee57a7a9 100644 --- a/arch/powerpc/include/asm/firmware.h +++ b/arch/powerpc/include/asm/firmware.h | |||
@@ -50,6 +50,7 @@ | |||
50 | #define FW_FEATURE_OPAL ASM_CONST(0x0000000010000000) | 50 | #define FW_FEATURE_OPAL ASM_CONST(0x0000000010000000) |
51 | #define FW_FEATURE_OPALv2 ASM_CONST(0x0000000020000000) | 51 | #define FW_FEATURE_OPALv2 ASM_CONST(0x0000000020000000) |
52 | #define FW_FEATURE_SET_MODE ASM_CONST(0x0000000040000000) | 52 | #define FW_FEATURE_SET_MODE ASM_CONST(0x0000000040000000) |
53 | #define FW_FEATURE_BEST_ENERGY ASM_CONST(0x0000000080000000) | ||
53 | 54 | ||
54 | #ifndef __ASSEMBLY__ | 55 | #ifndef __ASSEMBLY__ |
55 | 56 | ||
@@ -64,7 +65,7 @@ enum { | |||
64 | FW_FEATURE_BULK_REMOVE | FW_FEATURE_XDABR | | 65 | FW_FEATURE_BULK_REMOVE | FW_FEATURE_XDABR | |
65 | FW_FEATURE_MULTITCE | FW_FEATURE_SPLPAR | FW_FEATURE_LPAR | | 66 | FW_FEATURE_MULTITCE | FW_FEATURE_SPLPAR | FW_FEATURE_LPAR | |
66 | FW_FEATURE_CMO | FW_FEATURE_VPHN | FW_FEATURE_XCMO | | 67 | FW_FEATURE_CMO | FW_FEATURE_VPHN | FW_FEATURE_XCMO | |
67 | FW_FEATURE_SET_MODE, | 68 | FW_FEATURE_SET_MODE | FW_FEATURE_BEST_ENERGY, |
68 | FW_FEATURE_PSERIES_ALWAYS = 0, | 69 | FW_FEATURE_PSERIES_ALWAYS = 0, |
69 | FW_FEATURE_POWERNV_POSSIBLE = FW_FEATURE_OPAL | FW_FEATURE_OPALv2, | 70 | FW_FEATURE_POWERNV_POSSIBLE = FW_FEATURE_OPAL | FW_FEATURE_OPALv2, |
70 | FW_FEATURE_POWERNV_ALWAYS = 0, | 71 | FW_FEATURE_POWERNV_ALWAYS = 0, |
diff --git a/arch/powerpc/include/asm/hvcall.h b/arch/powerpc/include/asm/hvcall.h index 0975e5c0bb19..4bc2c3dad6ad 100644 --- a/arch/powerpc/include/asm/hvcall.h +++ b/arch/powerpc/include/asm/hvcall.h | |||
@@ -395,6 +395,15 @@ static inline unsigned long cmo_get_page_size(void) | |||
395 | { | 395 | { |
396 | return CMO_PageSize; | 396 | return CMO_PageSize; |
397 | } | 397 | } |
398 | |||
399 | extern long pSeries_enable_reloc_on_exc(void); | ||
400 | extern long pSeries_disable_reloc_on_exc(void); | ||
401 | |||
402 | #else | ||
403 | |||
404 | #define pSeries_enable_reloc_on_exc() do {} while (0) | ||
405 | #define pSeries_disable_reloc_on_exc() do {} while (0) | ||
406 | |||
398 | #endif /* CONFIG_PPC_PSERIES */ | 407 | #endif /* CONFIG_PPC_PSERIES */ |
399 | 408 | ||
400 | #endif /* __ASSEMBLY__ */ | 409 | #endif /* __ASSEMBLY__ */ |
diff --git a/arch/powerpc/include/asm/hw_breakpoint.h b/arch/powerpc/include/asm/hw_breakpoint.h index 423424599dad..eb0f4ac75c4c 100644 --- a/arch/powerpc/include/asm/hw_breakpoint.h +++ b/arch/powerpc/include/asm/hw_breakpoint.h | |||
@@ -24,16 +24,30 @@ | |||
24 | #define _PPC_BOOK3S_64_HW_BREAKPOINT_H | 24 | #define _PPC_BOOK3S_64_HW_BREAKPOINT_H |
25 | 25 | ||
26 | #ifdef __KERNEL__ | 26 | #ifdef __KERNEL__ |
27 | #ifdef CONFIG_HAVE_HW_BREAKPOINT | ||
28 | |||
29 | struct arch_hw_breakpoint { | 27 | struct arch_hw_breakpoint { |
30 | unsigned long address; | 28 | unsigned long address; |
31 | unsigned long dabrx; | 29 | u16 type; |
32 | int type; | 30 | u16 len; /* length of the target data symbol */ |
33 | u8 len; /* length of the target data symbol */ | ||
34 | bool extraneous_interrupt; | ||
35 | }; | 31 | }; |
36 | 32 | ||
33 | /* Note: Don't change the the first 6 bits below as they are in the same order | ||
34 | * as the dabr and dabrx. | ||
35 | */ | ||
36 | #define HW_BRK_TYPE_READ 0x01 | ||
37 | #define HW_BRK_TYPE_WRITE 0x02 | ||
38 | #define HW_BRK_TYPE_TRANSLATE 0x04 | ||
39 | #define HW_BRK_TYPE_USER 0x08 | ||
40 | #define HW_BRK_TYPE_KERNEL 0x10 | ||
41 | #define HW_BRK_TYPE_HYP 0x20 | ||
42 | #define HW_BRK_TYPE_EXTRANEOUS_IRQ 0x80 | ||
43 | |||
44 | /* bits that overlap with the bottom 3 bits of the dabr */ | ||
45 | #define HW_BRK_TYPE_RDWR (HW_BRK_TYPE_READ | HW_BRK_TYPE_WRITE) | ||
46 | #define HW_BRK_TYPE_DABR (HW_BRK_TYPE_RDWR | HW_BRK_TYPE_TRANSLATE) | ||
47 | #define HW_BRK_TYPE_PRIV_ALL (HW_BRK_TYPE_USER | HW_BRK_TYPE_KERNEL | \ | ||
48 | HW_BRK_TYPE_HYP) | ||
49 | |||
50 | #ifdef CONFIG_HAVE_HW_BREAKPOINT | ||
37 | #include <linux/kdebug.h> | 51 | #include <linux/kdebug.h> |
38 | #include <asm/reg.h> | 52 | #include <asm/reg.h> |
39 | #include <asm/debug.h> | 53 | #include <asm/debug.h> |
@@ -43,8 +57,6 @@ struct pmu; | |||
43 | struct perf_sample_data; | 57 | struct perf_sample_data; |
44 | 58 | ||
45 | #define HW_BREAKPOINT_ALIGN 0x7 | 59 | #define HW_BREAKPOINT_ALIGN 0x7 |
46 | /* Maximum permissible length of any HW Breakpoint */ | ||
47 | #define HW_BREAKPOINT_LEN 0x8 | ||
48 | 60 | ||
49 | extern int hw_breakpoint_slots(int type); | 61 | extern int hw_breakpoint_slots(int type); |
50 | extern int arch_bp_generic_fields(int type, int *gen_bp_type); | 62 | extern int arch_bp_generic_fields(int type, int *gen_bp_type); |
@@ -62,7 +74,12 @@ extern void ptrace_triggered(struct perf_event *bp, | |||
62 | struct perf_sample_data *data, struct pt_regs *regs); | 74 | struct perf_sample_data *data, struct pt_regs *regs); |
63 | static inline void hw_breakpoint_disable(void) | 75 | static inline void hw_breakpoint_disable(void) |
64 | { | 76 | { |
65 | set_dabr(0, 0); | 77 | struct arch_hw_breakpoint brk; |
78 | |||
79 | brk.address = 0; | ||
80 | brk.type = 0; | ||
81 | brk.len = 0; | ||
82 | set_breakpoint(&brk); | ||
66 | } | 83 | } |
67 | extern void thread_change_pc(struct task_struct *tsk, struct pt_regs *regs); | 84 | extern void thread_change_pc(struct task_struct *tsk, struct pt_regs *regs); |
68 | 85 | ||
diff --git a/arch/powerpc/include/asm/kvm_book3s_asm.h b/arch/powerpc/include/asm/kvm_book3s_asm.h index 88609b23b775..cdc3d2717cc6 100644 --- a/arch/powerpc/include/asm/kvm_book3s_asm.h +++ b/arch/powerpc/include/asm/kvm_book3s_asm.h | |||
@@ -93,6 +93,9 @@ struct kvmppc_host_state { | |||
93 | u64 host_dscr; | 93 | u64 host_dscr; |
94 | u64 dec_expires; | 94 | u64 dec_expires; |
95 | #endif | 95 | #endif |
96 | #ifdef CONFIG_PPC_BOOK3S_64 | ||
97 | u64 cfar; | ||
98 | #endif | ||
96 | }; | 99 | }; |
97 | 100 | ||
98 | struct kvmppc_book3s_shadow_vcpu { | 101 | struct kvmppc_book3s_shadow_vcpu { |
diff --git a/arch/powerpc/include/asm/kvm_host.h b/arch/powerpc/include/asm/kvm_host.h index ca9bf459db6a..03d7beae89a0 100644 --- a/arch/powerpc/include/asm/kvm_host.h +++ b/arch/powerpc/include/asm/kvm_host.h | |||
@@ -440,6 +440,7 @@ struct kvm_vcpu_arch { | |||
440 | ulong uamor; | 440 | ulong uamor; |
441 | u32 ctrl; | 441 | u32 ctrl; |
442 | ulong dabr; | 442 | ulong dabr; |
443 | ulong cfar; | ||
443 | #endif | 444 | #endif |
444 | u32 vrsave; /* also USPRG0 */ | 445 | u32 vrsave; /* also USPRG0 */ |
445 | u32 mmucr; | 446 | u32 mmucr; |
diff --git a/arch/powerpc/include/asm/machdep.h b/arch/powerpc/include/asm/machdep.h index 19d9d96eb8d3..3d6b4100dac1 100644 --- a/arch/powerpc/include/asm/machdep.h +++ b/arch/powerpc/include/asm/machdep.h | |||
@@ -180,6 +180,10 @@ struct machdep_calls { | |||
180 | int (*set_dabr)(unsigned long dabr, | 180 | int (*set_dabr)(unsigned long dabr, |
181 | unsigned long dabrx); | 181 | unsigned long dabrx); |
182 | 182 | ||
183 | /* Set DAWR for this platform, leave empty for default implemenation */ | ||
184 | int (*set_dawr)(unsigned long dawr, | ||
185 | unsigned long dawrx); | ||
186 | |||
183 | #ifdef CONFIG_PPC32 /* XXX for now */ | 187 | #ifdef CONFIG_PPC32 /* XXX for now */ |
184 | /* A general init function, called by ppc_init in init/main.c. | 188 | /* A general init function, called by ppc_init in init/main.c. |
185 | May be NULL. */ | 189 | May be NULL. */ |
diff --git a/arch/powerpc/include/asm/mpc5121.h b/arch/powerpc/include/asm/mpc5121.h index 8c0ab2ca689c..885c040d6194 100644 --- a/arch/powerpc/include/asm/mpc5121.h +++ b/arch/powerpc/include/asm/mpc5121.h | |||
@@ -53,4 +53,21 @@ struct mpc512x_ccm { | |||
53 | u32 m4ccr; /* MSCAN4 CCR */ | 53 | u32 m4ccr; /* MSCAN4 CCR */ |
54 | u8 res[0x98]; /* Reserved */ | 54 | u8 res[0x98]; /* Reserved */ |
55 | }; | 55 | }; |
56 | |||
57 | /* | ||
58 | * LPC Module | ||
59 | */ | ||
60 | struct mpc512x_lpc { | ||
61 | u32 cs_cfg[8]; /* CS config */ | ||
62 | u32 cs_ctrl; /* CS Control Register */ | ||
63 | u32 cs_status; /* CS Status Register */ | ||
64 | u32 burst_ctrl; /* CS Burst Control Register */ | ||
65 | u32 deadcycle_ctrl; /* CS Deadcycle Control Register */ | ||
66 | u32 holdcycle_ctrl; /* CS Holdcycle Control Register */ | ||
67 | u32 alt; /* Address Latch Timing Register */ | ||
68 | }; | ||
69 | |||
70 | int mpc512x_cs_config(unsigned int cs, u32 val); | ||
71 | int __init mpc5121_clk_init(void); | ||
72 | |||
56 | #endif /* __ASM_POWERPC_MPC5121_H__ */ | 73 | #endif /* __ASM_POWERPC_MPC5121_H__ */ |
diff --git a/arch/powerpc/include/asm/paca.h b/arch/powerpc/include/asm/paca.h index e9e7a6999bb8..77c91e74b612 100644 --- a/arch/powerpc/include/asm/paca.h +++ b/arch/powerpc/include/asm/paca.h | |||
@@ -93,9 +93,9 @@ struct paca_struct { | |||
93 | * Now, starting in cacheline 2, the exception save areas | 93 | * Now, starting in cacheline 2, the exception save areas |
94 | */ | 94 | */ |
95 | /* used for most interrupts/exceptions */ | 95 | /* used for most interrupts/exceptions */ |
96 | u64 exgen[11] __attribute__((aligned(0x80))); | 96 | u64 exgen[12] __attribute__((aligned(0x80))); |
97 | u64 exmc[11]; /* used for machine checks */ | 97 | u64 exmc[12]; /* used for machine checks */ |
98 | u64 exslb[11]; /* used for SLB/segment table misses | 98 | u64 exslb[12]; /* used for SLB/segment table misses |
99 | * on the linear mapping */ | 99 | * on the linear mapping */ |
100 | /* SLB related definitions */ | 100 | /* SLB related definitions */ |
101 | u16 vmalloc_sllp; | 101 | u16 vmalloc_sllp; |
@@ -137,6 +137,9 @@ struct paca_struct { | |||
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 */ |
139 | u64 sprg3; /* Saved user-visible sprg */ | 139 | u64 sprg3; /* Saved user-visible sprg */ |
140 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | ||
141 | u64 tm_scratch; /* TM scratch area for reclaim */ | ||
142 | #endif | ||
140 | 143 | ||
141 | #ifdef CONFIG_PPC_POWERNV | 144 | #ifdef CONFIG_PPC_POWERNV |
142 | /* Pointer to OPAL machine check event structure set by the | 145 | /* Pointer to OPAL machine check event structure set by the |
@@ -167,7 +170,6 @@ struct paca_struct { | |||
167 | }; | 170 | }; |
168 | 171 | ||
169 | extern struct paca_struct *paca; | 172 | extern struct paca_struct *paca; |
170 | extern __initdata struct paca_struct boot_paca; | ||
171 | extern void initialise_paca(struct paca_struct *new_paca, int cpu); | 173 | extern void initialise_paca(struct paca_struct *new_paca, int cpu); |
172 | extern void setup_paca(struct paca_struct *new_paca); | 174 | extern void setup_paca(struct paca_struct *new_paca); |
173 | extern void allocate_pacas(void); | 175 | extern void allocate_pacas(void); |
diff --git a/arch/powerpc/include/asm/perf_event_server.h b/arch/powerpc/include/asm/perf_event_server.h index 136bba62efa4..d0aec72722e9 100644 --- a/arch/powerpc/include/asm/perf_event_server.h +++ b/arch/powerpc/include/asm/perf_event_server.h | |||
@@ -47,11 +47,11 @@ struct power_pmu { | |||
47 | /* | 47 | /* |
48 | * Values for power_pmu.flags | 48 | * Values for power_pmu.flags |
49 | */ | 49 | */ |
50 | #define PPMU_LIMITED_PMC5_6 1 /* PMC5/6 have limited function */ | 50 | #define PPMU_LIMITED_PMC5_6 0x00000001 /* PMC5/6 have limited function */ |
51 | #define PPMU_ALT_SIPR 2 /* uses alternate posn for SIPR/HV */ | 51 | #define PPMU_ALT_SIPR 0x00000002 /* uses alternate posn for SIPR/HV */ |
52 | #define PPMU_NO_SIPR 4 /* no SIPR/HV in MMCRA at all */ | 52 | #define PPMU_NO_SIPR 0x00000004 /* no SIPR/HV in MMCRA at all */ |
53 | #define PPMU_NO_CONT_SAMPLING 8 /* no continuous sampling */ | 53 | #define PPMU_NO_CONT_SAMPLING 0x00000008 /* no continuous sampling */ |
54 | #define PPMU_SIAR_VALID 16 /* Processor has SIAR Valid bit */ | 54 | #define PPMU_SIAR_VALID 0x00000010 /* Processor has SIAR Valid bit */ |
55 | 55 | ||
56 | /* | 56 | /* |
57 | * Values for flags to get_alternatives() | 57 | * Values for flags to get_alternatives() |
diff --git a/arch/powerpc/include/asm/ppc-opcode.h b/arch/powerpc/include/asm/ppc-opcode.h index 51fb00a20d7e..8752bc8e34a3 100644 --- a/arch/powerpc/include/asm/ppc-opcode.h +++ b/arch/powerpc/include/asm/ppc-opcode.h | |||
@@ -100,6 +100,7 @@ | |||
100 | #define PPC_INST_MFSPR_PVR 0x7c1f42a6 | 100 | #define PPC_INST_MFSPR_PVR 0x7c1f42a6 |
101 | #define PPC_INST_MFSPR_PVR_MASK 0xfc1fffff | 101 | #define PPC_INST_MFSPR_PVR_MASK 0xfc1fffff |
102 | #define PPC_INST_MSGSND 0x7c00019c | 102 | #define PPC_INST_MSGSND 0x7c00019c |
103 | #define PPC_INST_MSGSNDP 0x7c00011c | ||
103 | #define PPC_INST_NOP 0x60000000 | 104 | #define PPC_INST_NOP 0x60000000 |
104 | #define PPC_INST_POPCNTB 0x7c0000f4 | 105 | #define PPC_INST_POPCNTB 0x7c0000f4 |
105 | #define PPC_INST_POPCNTB_MASK 0xfc0007fe | 106 | #define PPC_INST_POPCNTB_MASK 0xfc0007fe |
@@ -128,6 +129,9 @@ | |||
128 | #define PPC_INST_TLBSRX_DOT 0x7c0006a5 | 129 | #define PPC_INST_TLBSRX_DOT 0x7c0006a5 |
129 | #define PPC_INST_XXLOR 0xf0000510 | 130 | #define PPC_INST_XXLOR 0xf0000510 |
130 | #define PPC_INST_XVCPSGNDP 0xf0000780 | 131 | #define PPC_INST_XVCPSGNDP 0xf0000780 |
132 | #define PPC_INST_TRECHKPT 0x7c0007dd | ||
133 | #define PPC_INST_TRECLAIM 0x7c00075d | ||
134 | #define PPC_INST_TABORT 0x7c00071d | ||
131 | 135 | ||
132 | #define PPC_INST_NAP 0x4c000364 | 136 | #define PPC_INST_NAP 0x4c000364 |
133 | #define PPC_INST_SLEEP 0x4c0003a4 | 137 | #define PPC_INST_SLEEP 0x4c0003a4 |
@@ -227,6 +231,8 @@ | |||
227 | ___PPC_RB(b) | __PPC_EH(eh)) | 231 | ___PPC_RB(b) | __PPC_EH(eh)) |
228 | #define PPC_MSGSND(b) stringify_in_c(.long PPC_INST_MSGSND | \ | 232 | #define PPC_MSGSND(b) stringify_in_c(.long PPC_INST_MSGSND | \ |
229 | ___PPC_RB(b)) | 233 | ___PPC_RB(b)) |
234 | #define PPC_MSGSNDP(b) stringify_in_c(.long PPC_INST_MSGSNDP | \ | ||
235 | ___PPC_RB(b)) | ||
230 | #define PPC_POPCNTB(a, s) stringify_in_c(.long PPC_INST_POPCNTB | \ | 236 | #define PPC_POPCNTB(a, s) stringify_in_c(.long PPC_INST_POPCNTB | \ |
231 | __PPC_RA(a) | __PPC_RS(s)) | 237 | __PPC_RA(a) | __PPC_RS(s)) |
232 | #define PPC_POPCNTD(a, s) stringify_in_c(.long PPC_INST_POPCNTD | \ | 238 | #define PPC_POPCNTD(a, s) stringify_in_c(.long PPC_INST_POPCNTD | \ |
@@ -291,4 +297,11 @@ | |||
291 | #define PPC_NAP stringify_in_c(.long PPC_INST_NAP) | 297 | #define PPC_NAP stringify_in_c(.long PPC_INST_NAP) |
292 | #define PPC_SLEEP stringify_in_c(.long PPC_INST_SLEEP) | 298 | #define PPC_SLEEP stringify_in_c(.long PPC_INST_SLEEP) |
293 | 299 | ||
300 | /* Transactional memory instructions */ | ||
301 | #define TRECHKPT stringify_in_c(.long PPC_INST_TRECHKPT) | ||
302 | #define TRECLAIM(r) stringify_in_c(.long PPC_INST_TRECLAIM \ | ||
303 | | __PPC_RA(r)) | ||
304 | #define TABORT(r) stringify_in_c(.long PPC_INST_TABORT \ | ||
305 | | __PPC_RA(r)) | ||
306 | |||
294 | #endif /* _ASM_POWERPC_PPC_OPCODE_H */ | 307 | #endif /* _ASM_POWERPC_PPC_OPCODE_H */ |
diff --git a/arch/powerpc/include/asm/ppc4xx_ocm.h b/arch/powerpc/include/asm/ppc4xx_ocm.h new file mode 100644 index 000000000000..6ce904605538 --- /dev/null +++ b/arch/powerpc/include/asm/ppc4xx_ocm.h | |||
@@ -0,0 +1,45 @@ | |||
1 | /* | ||
2 | * PowerPC 4xx OCM memory allocation support | ||
3 | * | ||
4 | * (C) Copyright 2009, Applied Micro Circuits Corporation | ||
5 | * Victor Gallardo (vgallardo@amcc.com) | ||
6 | * | ||
7 | * See file CREDITS for list of people who contributed to this | ||
8 | * project. | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or | ||
11 | * modify it under the terms of the GNU General Public License as | ||
12 | * published by the Free Software Foundation; either version 2 of | ||
13 | * the License, or (at your option) any later version. | ||
14 | * | ||
15 | * This program is distributed in the hope that it will be useful, | ||
16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
18 | * GNU General Public License for more details. | ||
19 | * | ||
20 | * You should have received a copy of the GNU General Public License | ||
21 | * along with this program; if not, write to the Free Software | ||
22 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, | ||
23 | * MA 02111-1307 USA | ||
24 | */ | ||
25 | |||
26 | #ifndef __ASM_POWERPC_PPC4XX_OCM_H__ | ||
27 | #define __ASM_POWERPC_PPC4XX_OCM_H__ | ||
28 | |||
29 | #define PPC4XX_OCM_NON_CACHED 0 | ||
30 | #define PPC4XX_OCM_CACHED 1 | ||
31 | |||
32 | #if defined(CONFIG_PPC4xx_OCM) | ||
33 | |||
34 | void *ppc4xx_ocm_alloc(phys_addr_t *phys, int size, int align, | ||
35 | int flags, const char *owner); | ||
36 | void ppc4xx_ocm_free(const void *virt); | ||
37 | |||
38 | #else | ||
39 | |||
40 | #define ppc4xx_ocm_alloc(phys, size, align, flags, owner) NULL | ||
41 | #define ppc4xx_ocm_free(addr) ((void)0) | ||
42 | |||
43 | #endif /* CONFIG_PPC4xx_OCM */ | ||
44 | |||
45 | #endif /* __ASM_POWERPC_PPC4XX_OCM_H__ */ | ||
diff --git a/arch/powerpc/include/asm/ppc_asm.h b/arch/powerpc/include/asm/ppc_asm.h index 2d0e1f5d8339..cea8496091ff 100644 --- a/arch/powerpc/include/asm/ppc_asm.h +++ b/arch/powerpc/include/asm/ppc_asm.h | |||
@@ -30,7 +30,6 @@ | |||
30 | #define ACCOUNT_STOLEN_TIME | 30 | #define ACCOUNT_STOLEN_TIME |
31 | #else | 31 | #else |
32 | #define ACCOUNT_CPU_USER_ENTRY(ra, rb) \ | 32 | #define ACCOUNT_CPU_USER_ENTRY(ra, rb) \ |
33 | beq 2f; /* if from kernel mode */ \ | ||
34 | MFTB(ra); /* get timebase */ \ | 33 | MFTB(ra); /* get timebase */ \ |
35 | ld rb,PACA_STARTTIME_USER(r13); \ | 34 | ld rb,PACA_STARTTIME_USER(r13); \ |
36 | std ra,PACA_STARTTIME(r13); \ | 35 | std ra,PACA_STARTTIME(r13); \ |
@@ -38,7 +37,6 @@ | |||
38 | ld ra,PACA_USER_TIME(r13); \ | 37 | ld ra,PACA_USER_TIME(r13); \ |
39 | add ra,ra,rb; /* add on to user time */ \ | 38 | add ra,ra,rb; /* add on to user time */ \ |
40 | std ra,PACA_USER_TIME(r13); \ | 39 | std ra,PACA_USER_TIME(r13); \ |
41 | 2: | ||
42 | 40 | ||
43 | #define ACCOUNT_CPU_USER_EXIT(ra, rb) \ | 41 | #define ACCOUNT_CPU_USER_EXIT(ra, rb) \ |
44 | MFTB(ra); /* get timebase */ \ | 42 | MFTB(ra); /* get timebase */ \ |
@@ -125,6 +123,89 @@ END_FW_FTR_SECTION_IFSET(FW_FEATURE_SPLPAR) | |||
125 | #define REST_16VRS(n,b,base) REST_8VRS(n,b,base); REST_8VRS(n+8,b,base) | 123 | #define REST_16VRS(n,b,base) REST_8VRS(n,b,base); REST_8VRS(n+8,b,base) |
126 | #define REST_32VRS(n,b,base) REST_16VRS(n,b,base); REST_16VRS(n+16,b,base) | 124 | #define REST_32VRS(n,b,base) REST_16VRS(n,b,base); REST_16VRS(n+16,b,base) |
127 | 125 | ||
126 | /* Save/restore FPRs, VRs and VSRs from their checkpointed backups in | ||
127 | * thread_struct: | ||
128 | */ | ||
129 | #define SAVE_FPR_TRANSACT(n, base) stfd n,THREAD_TRANSACT_FPR0+ \ | ||
130 | 8*TS_FPRWIDTH*(n)(base) | ||
131 | #define SAVE_2FPRS_TRANSACT(n, base) SAVE_FPR_TRANSACT(n, base); \ | ||
132 | SAVE_FPR_TRANSACT(n+1, base) | ||
133 | #define SAVE_4FPRS_TRANSACT(n, base) SAVE_2FPRS_TRANSACT(n, base); \ | ||
134 | SAVE_2FPRS_TRANSACT(n+2, base) | ||
135 | #define SAVE_8FPRS_TRANSACT(n, base) SAVE_4FPRS_TRANSACT(n, base); \ | ||
136 | SAVE_4FPRS_TRANSACT(n+4, base) | ||
137 | #define SAVE_16FPRS_TRANSACT(n, base) SAVE_8FPRS_TRANSACT(n, base); \ | ||
138 | SAVE_8FPRS_TRANSACT(n+8, base) | ||
139 | #define SAVE_32FPRS_TRANSACT(n, base) SAVE_16FPRS_TRANSACT(n, base); \ | ||
140 | SAVE_16FPRS_TRANSACT(n+16, base) | ||
141 | |||
142 | #define REST_FPR_TRANSACT(n, base) lfd n,THREAD_TRANSACT_FPR0+ \ | ||
143 | 8*TS_FPRWIDTH*(n)(base) | ||
144 | #define REST_2FPRS_TRANSACT(n, base) REST_FPR_TRANSACT(n, base); \ | ||
145 | REST_FPR_TRANSACT(n+1, base) | ||
146 | #define REST_4FPRS_TRANSACT(n, base) REST_2FPRS_TRANSACT(n, base); \ | ||
147 | REST_2FPRS_TRANSACT(n+2, base) | ||
148 | #define REST_8FPRS_TRANSACT(n, base) REST_4FPRS_TRANSACT(n, base); \ | ||
149 | REST_4FPRS_TRANSACT(n+4, base) | ||
150 | #define REST_16FPRS_TRANSACT(n, base) REST_8FPRS_TRANSACT(n, base); \ | ||
151 | REST_8FPRS_TRANSACT(n+8, base) | ||
152 | #define REST_32FPRS_TRANSACT(n, base) REST_16FPRS_TRANSACT(n, base); \ | ||
153 | REST_16FPRS_TRANSACT(n+16, base) | ||
154 | |||
155 | |||
156 | #define SAVE_VR_TRANSACT(n,b,base) li b,THREAD_TRANSACT_VR0+(16*(n)); \ | ||
157 | stvx n,b,base | ||
158 | #define SAVE_2VRS_TRANSACT(n,b,base) SAVE_VR_TRANSACT(n,b,base); \ | ||
159 | SAVE_VR_TRANSACT(n+1,b,base) | ||
160 | #define SAVE_4VRS_TRANSACT(n,b,base) SAVE_2VRS_TRANSACT(n,b,base); \ | ||
161 | SAVE_2VRS_TRANSACT(n+2,b,base) | ||
162 | #define SAVE_8VRS_TRANSACT(n,b,base) SAVE_4VRS_TRANSACT(n,b,base); \ | ||
163 | SAVE_4VRS_TRANSACT(n+4,b,base) | ||
164 | #define SAVE_16VRS_TRANSACT(n,b,base) SAVE_8VRS_TRANSACT(n,b,base); \ | ||
165 | SAVE_8VRS_TRANSACT(n+8,b,base) | ||
166 | #define SAVE_32VRS_TRANSACT(n,b,base) SAVE_16VRS_TRANSACT(n,b,base); \ | ||
167 | SAVE_16VRS_TRANSACT(n+16,b,base) | ||
168 | |||
169 | #define REST_VR_TRANSACT(n,b,base) li b,THREAD_TRANSACT_VR0+(16*(n)); \ | ||
170 | lvx n,b,base | ||
171 | #define REST_2VRS_TRANSACT(n,b,base) REST_VR_TRANSACT(n,b,base); \ | ||
172 | REST_VR_TRANSACT(n+1,b,base) | ||
173 | #define REST_4VRS_TRANSACT(n,b,base) REST_2VRS_TRANSACT(n,b,base); \ | ||
174 | REST_2VRS_TRANSACT(n+2,b,base) | ||
175 | #define REST_8VRS_TRANSACT(n,b,base) REST_4VRS_TRANSACT(n,b,base); \ | ||
176 | REST_4VRS_TRANSACT(n+4,b,base) | ||
177 | #define REST_16VRS_TRANSACT(n,b,base) REST_8VRS_TRANSACT(n,b,base); \ | ||
178 | REST_8VRS_TRANSACT(n+8,b,base) | ||
179 | #define REST_32VRS_TRANSACT(n,b,base) REST_16VRS_TRANSACT(n,b,base); \ | ||
180 | REST_16VRS_TRANSACT(n+16,b,base) | ||
181 | |||
182 | |||
183 | #define SAVE_VSR_TRANSACT(n,b,base) li b,THREAD_TRANSACT_VSR0+(16*(n)); \ | ||
184 | STXVD2X(n,R##base,R##b) | ||
185 | #define SAVE_2VSRS_TRANSACT(n,b,base) SAVE_VSR_TRANSACT(n,b,base); \ | ||
186 | SAVE_VSR_TRANSACT(n+1,b,base) | ||
187 | #define SAVE_4VSRS_TRANSACT(n,b,base) SAVE_2VSRS_TRANSACT(n,b,base); \ | ||
188 | SAVE_2VSRS_TRANSACT(n+2,b,base) | ||
189 | #define SAVE_8VSRS_TRANSACT(n,b,base) SAVE_4VSRS_TRANSACT(n,b,base); \ | ||
190 | SAVE_4VSRS_TRANSACT(n+4,b,base) | ||
191 | #define SAVE_16VSRS_TRANSACT(n,b,base) SAVE_8VSRS_TRANSACT(n,b,base); \ | ||
192 | SAVE_8VSRS_TRANSACT(n+8,b,base) | ||
193 | #define SAVE_32VSRS_TRANSACT(n,b,base) SAVE_16VSRS_TRANSACT(n,b,base); \ | ||
194 | SAVE_16VSRS_TRANSACT(n+16,b,base) | ||
195 | |||
196 | #define REST_VSR_TRANSACT(n,b,base) li b,THREAD_TRANSACT_VSR0+(16*(n)); \ | ||
197 | LXVD2X(n,R##base,R##b) | ||
198 | #define REST_2VSRS_TRANSACT(n,b,base) REST_VSR_TRANSACT(n,b,base); \ | ||
199 | REST_VSR_TRANSACT(n+1,b,base) | ||
200 | #define REST_4VSRS_TRANSACT(n,b,base) REST_2VSRS_TRANSACT(n,b,base); \ | ||
201 | REST_2VSRS_TRANSACT(n+2,b,base) | ||
202 | #define REST_8VSRS_TRANSACT(n,b,base) REST_4VSRS_TRANSACT(n,b,base); \ | ||
203 | REST_4VSRS_TRANSACT(n+4,b,base) | ||
204 | #define REST_16VSRS_TRANSACT(n,b,base) REST_8VSRS_TRANSACT(n,b,base); \ | ||
205 | REST_8VSRS_TRANSACT(n+8,b,base) | ||
206 | #define REST_32VSRS_TRANSACT(n,b,base) REST_16VSRS_TRANSACT(n,b,base); \ | ||
207 | REST_16VSRS_TRANSACT(n+16,b,base) | ||
208 | |||
128 | /* Save the lower 32 VSRs in the thread VSR region */ | 209 | /* Save the lower 32 VSRs in the thread VSR region */ |
129 | #define SAVE_VSR(n,b,base) li b,THREAD_VSR0+(16*(n)); STXVD2X(n,R##base,R##b) | 210 | #define SAVE_VSR(n,b,base) li b,THREAD_VSR0+(16*(n)); STXVD2X(n,R##base,R##b) |
130 | #define SAVE_2VSRS(n,b,base) SAVE_VSR(n,b,base); SAVE_VSR(n+1,b,base) | 211 | #define SAVE_2VSRS(n,b,base) SAVE_VSR(n,b,base); SAVE_VSR(n+1,b,base) |
@@ -391,6 +472,31 @@ END_FTR_SECTION_IFCLR(CPU_FTR_601) | |||
391 | FTR_SECTION_ELSE_NESTED(848); \ | 472 | FTR_SECTION_ELSE_NESTED(848); \ |
392 | mtocrf (FXM), RS; \ | 473 | mtocrf (FXM), RS; \ |
393 | ALT_FTR_SECTION_END_NESTED_IFCLR(CPU_FTR_NOEXECUTE, 848) | 474 | ALT_FTR_SECTION_END_NESTED_IFCLR(CPU_FTR_NOEXECUTE, 848) |
475 | |||
476 | /* | ||
477 | * PPR restore macros used in entry_64.S | ||
478 | * Used for P7 or later processors | ||
479 | */ | ||
480 | #define HMT_MEDIUM_LOW_HAS_PPR \ | ||
481 | BEGIN_FTR_SECTION_NESTED(944) \ | ||
482 | HMT_MEDIUM_LOW; \ | ||
483 | END_FTR_SECTION_NESTED(CPU_FTR_HAS_PPR,CPU_FTR_HAS_PPR,944) | ||
484 | |||
485 | #define SET_DEFAULT_THREAD_PPR(ra, rb) \ | ||
486 | BEGIN_FTR_SECTION_NESTED(945) \ | ||
487 | lis ra,INIT_PPR@highest; /* default ppr=3 */ \ | ||
488 | ld rb,PACACURRENT(r13); \ | ||
489 | sldi ra,ra,32; /* 11- 13 bits are used for ppr */ \ | ||
490 | std ra,TASKTHREADPPR(rb); \ | ||
491 | END_FTR_SECTION_NESTED(CPU_FTR_HAS_PPR,CPU_FTR_HAS_PPR,945) | ||
492 | |||
493 | #define RESTORE_PPR(ra, rb) \ | ||
494 | BEGIN_FTR_SECTION_NESTED(946) \ | ||
495 | ld ra,PACACURRENT(r13); \ | ||
496 | ld rb,TASKTHREADPPR(ra); \ | ||
497 | mtspr SPRN_PPR,rb; /* Restore PPR */ \ | ||
498 | END_FTR_SECTION_NESTED(CPU_FTR_HAS_PPR,CPU_FTR_HAS_PPR,946) | ||
499 | |||
394 | #endif | 500 | #endif |
395 | 501 | ||
396 | /* | 502 | /* |
diff --git a/arch/powerpc/include/asm/processor.h b/arch/powerpc/include/asm/processor.h index 87502046c0dc..7ff9eaa3ea6c 100644 --- a/arch/powerpc/include/asm/processor.h +++ b/arch/powerpc/include/asm/processor.h | |||
@@ -18,11 +18,22 @@ | |||
18 | #define TS_FPRWIDTH 1 | 18 | #define TS_FPRWIDTH 1 |
19 | #endif | 19 | #endif |
20 | 20 | ||
21 | #ifdef CONFIG_PPC64 | ||
22 | /* Default SMT priority is set to 3. Use 11- 13bits to save priority. */ | ||
23 | #define PPR_PRIORITY 3 | ||
24 | #ifdef __ASSEMBLY__ | ||
25 | #define INIT_PPR (PPR_PRIORITY << 50) | ||
26 | #else | ||
27 | #define INIT_PPR ((u64)PPR_PRIORITY << 50) | ||
28 | #endif /* __ASSEMBLY__ */ | ||
29 | #endif /* CONFIG_PPC64 */ | ||
30 | |||
21 | #ifndef __ASSEMBLY__ | 31 | #ifndef __ASSEMBLY__ |
22 | #include <linux/compiler.h> | 32 | #include <linux/compiler.h> |
23 | #include <linux/cache.h> | 33 | #include <linux/cache.h> |
24 | #include <asm/ptrace.h> | 34 | #include <asm/ptrace.h> |
25 | #include <asm/types.h> | 35 | #include <asm/types.h> |
36 | #include <asm/hw_breakpoint.h> | ||
26 | 37 | ||
27 | /* We do _not_ want to define new machine types at all, those must die | 38 | /* We do _not_ want to define new machine types at all, those must die |
28 | * in favor of using the device-tree | 39 | * in favor of using the device-tree |
@@ -141,6 +152,7 @@ typedef struct { | |||
141 | #define TS_FPROFFSET 0 | 152 | #define TS_FPROFFSET 0 |
142 | #define TS_VSRLOWOFFSET 1 | 153 | #define TS_VSRLOWOFFSET 1 |
143 | #define TS_FPR(i) fpr[i][TS_FPROFFSET] | 154 | #define TS_FPR(i) fpr[i][TS_FPROFFSET] |
155 | #define TS_TRANS_FPR(i) transact_fpr[i][TS_FPROFFSET] | ||
144 | 156 | ||
145 | struct thread_struct { | 157 | struct thread_struct { |
146 | unsigned long ksp; /* Kernel stack pointer */ | 158 | unsigned long ksp; /* Kernel stack pointer */ |
@@ -215,8 +227,7 @@ struct thread_struct { | |||
215 | struct perf_event *last_hit_ubp; | 227 | struct perf_event *last_hit_ubp; |
216 | #endif /* CONFIG_HAVE_HW_BREAKPOINT */ | 228 | #endif /* CONFIG_HAVE_HW_BREAKPOINT */ |
217 | #endif | 229 | #endif |
218 | unsigned long dabr; /* Data address breakpoint register */ | 230 | struct arch_hw_breakpoint hw_brk; /* info on the hardware breakpoint */ |
219 | unsigned long dabrx; /* ... extension */ | ||
220 | unsigned long trap_nr; /* last trap # on this thread */ | 231 | unsigned long trap_nr; /* last trap # on this thread */ |
221 | #ifdef CONFIG_ALTIVEC | 232 | #ifdef CONFIG_ALTIVEC |
222 | /* Complete AltiVec register set */ | 233 | /* Complete AltiVec register set */ |
@@ -236,6 +247,34 @@ struct thread_struct { | |||
236 | unsigned long spefscr; /* SPE & eFP status */ | 247 | unsigned long spefscr; /* SPE & eFP status */ |
237 | int used_spe; /* set if process has used spe */ | 248 | int used_spe; /* set if process has used spe */ |
238 | #endif /* CONFIG_SPE */ | 249 | #endif /* CONFIG_SPE */ |
250 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | ||
251 | u64 tm_tfhar; /* Transaction fail handler addr */ | ||
252 | u64 tm_texasr; /* Transaction exception & summary */ | ||
253 | u64 tm_tfiar; /* Transaction fail instr address reg */ | ||
254 | unsigned long tm_orig_msr; /* Thread's MSR on ctx switch */ | ||
255 | struct pt_regs ckpt_regs; /* Checkpointed registers */ | ||
256 | |||
257 | /* | ||
258 | * Transactional FP and VSX 0-31 register set. | ||
259 | * NOTE: the sense of these is the opposite of the integer ckpt_regs! | ||
260 | * | ||
261 | * When a transaction is active/signalled/scheduled etc., *regs is the | ||
262 | * most recent set of/speculated GPRs with ckpt_regs being the older | ||
263 | * checkpointed regs to which we roll back if transaction aborts. | ||
264 | * | ||
265 | * However, fpr[] is the checkpointed 'base state' of FP regs, and | ||
266 | * transact_fpr[] is the new set of transactional values. | ||
267 | * VRs work the same way. | ||
268 | */ | ||
269 | double transact_fpr[32][TS_FPRWIDTH]; | ||
270 | struct { | ||
271 | unsigned int pad; | ||
272 | unsigned int val; /* Floating point status */ | ||
273 | } transact_fpscr; | ||
274 | vector128 transact_vr[32] __attribute__((aligned(16))); | ||
275 | vector128 transact_vscr __attribute__((aligned(16))); | ||
276 | unsigned long transact_vrsave; | ||
277 | #endif /* CONFIG_PPC_TRANSACTIONAL_MEM */ | ||
239 | #ifdef CONFIG_KVM_BOOK3S_32_HANDLER | 278 | #ifdef CONFIG_KVM_BOOK3S_32_HANDLER |
240 | void* kvm_shadow_vcpu; /* KVM internal data */ | 279 | void* kvm_shadow_vcpu; /* KVM internal data */ |
241 | #endif /* CONFIG_KVM_BOOK3S_32_HANDLER */ | 280 | #endif /* CONFIG_KVM_BOOK3S_32_HANDLER */ |
@@ -245,6 +284,10 @@ struct thread_struct { | |||
245 | #ifdef CONFIG_PPC64 | 284 | #ifdef CONFIG_PPC64 |
246 | unsigned long dscr; | 285 | unsigned long dscr; |
247 | int dscr_inherit; | 286 | int dscr_inherit; |
287 | unsigned long ppr; /* used to save/restore SMT priority */ | ||
288 | #endif | ||
289 | #ifdef CONFIG_PPC_BOOK3S_64 | ||
290 | unsigned long tar; | ||
248 | #endif | 291 | #endif |
249 | }; | 292 | }; |
250 | 293 | ||
@@ -278,6 +321,7 @@ struct thread_struct { | |||
278 | .fpr = {{0}}, \ | 321 | .fpr = {{0}}, \ |
279 | .fpscr = { .val = 0, }, \ | 322 | .fpscr = { .val = 0, }, \ |
280 | .fpexc_mode = 0, \ | 323 | .fpexc_mode = 0, \ |
324 | .ppr = INIT_PPR, \ | ||
281 | } | 325 | } |
282 | #endif | 326 | #endif |
283 | 327 | ||
diff --git a/arch/powerpc/include/asm/ps3.h b/arch/powerpc/include/asm/ps3.h index 0e15db4d703b..678a7c1d9cb8 100644 --- a/arch/powerpc/include/asm/ps3.h +++ b/arch/powerpc/include/asm/ps3.h | |||
@@ -245,7 +245,7 @@ enum lv1_result { | |||
245 | 245 | ||
246 | static inline const char* ps3_result(int result) | 246 | static inline const char* ps3_result(int result) |
247 | { | 247 | { |
248 | #if defined(DEBUG) | 248 | #if defined(DEBUG) || defined(PS3_VERBOSE_RESULT) |
249 | switch (result) { | 249 | switch (result) { |
250 | case LV1_SUCCESS: | 250 | case LV1_SUCCESS: |
251 | return "LV1_SUCCESS (0)"; | 251 | return "LV1_SUCCESS (0)"; |
diff --git a/arch/powerpc/include/asm/reg.h b/arch/powerpc/include/asm/reg.h index 3d5c9dc8917a..7035e608f3fa 100644 --- a/arch/powerpc/include/asm/reg.h +++ b/arch/powerpc/include/asm/reg.h | |||
@@ -29,6 +29,10 @@ | |||
29 | #define MSR_SF_LG 63 /* Enable 64 bit mode */ | 29 | #define MSR_SF_LG 63 /* Enable 64 bit mode */ |
30 | #define MSR_ISF_LG 61 /* Interrupt 64b mode valid on 630 */ | 30 | #define MSR_ISF_LG 61 /* Interrupt 64b mode valid on 630 */ |
31 | #define MSR_HV_LG 60 /* Hypervisor state */ | 31 | #define MSR_HV_LG 60 /* Hypervisor state */ |
32 | #define MSR_TS_T_LG 34 /* Trans Mem state: Transactional */ | ||
33 | #define MSR_TS_S_LG 33 /* Trans Mem state: Suspended */ | ||
34 | #define MSR_TS_LG 33 /* Trans Mem state (2 bits) */ | ||
35 | #define MSR_TM_LG 32 /* Trans Mem Available */ | ||
32 | #define MSR_VEC_LG 25 /* Enable AltiVec */ | 36 | #define MSR_VEC_LG 25 /* Enable AltiVec */ |
33 | #define MSR_VSX_LG 23 /* Enable VSX */ | 37 | #define MSR_VSX_LG 23 /* Enable VSX */ |
34 | #define MSR_POW_LG 18 /* Enable Power Management */ | 38 | #define MSR_POW_LG 18 /* Enable Power Management */ |
@@ -98,6 +102,26 @@ | |||
98 | #define MSR_RI __MASK(MSR_RI_LG) /* Recoverable Exception */ | 102 | #define MSR_RI __MASK(MSR_RI_LG) /* Recoverable Exception */ |
99 | #define MSR_LE __MASK(MSR_LE_LG) /* Little Endian */ | 103 | #define MSR_LE __MASK(MSR_LE_LG) /* Little Endian */ |
100 | 104 | ||
105 | #define MSR_TM __MASK(MSR_TM_LG) /* Transactional Mem Available */ | ||
106 | #define MSR_TS_N 0 /* Non-transactional */ | ||
107 | #define MSR_TS_S __MASK(MSR_TS_S_LG) /* Transaction Suspended */ | ||
108 | #define MSR_TS_T __MASK(MSR_TS_T_LG) /* Transaction Transactional */ | ||
109 | #define MSR_TS_MASK (MSR_TS_T | MSR_TS_S) /* Transaction State bits */ | ||
110 | #define MSR_TM_ACTIVE(x) (((x) & MSR_TS_MASK) != 0) /* Transaction active? */ | ||
111 | #define MSR_TM_TRANSACTIONAL(x) (((x) & MSR_TS_MASK) == MSR_TS_T) | ||
112 | #define MSR_TM_SUSPENDED(x) (((x) & MSR_TS_MASK) == MSR_TS_S) | ||
113 | |||
114 | /* Reason codes describing kernel causes for transaction aborts. By | ||
115 | convention, bit0 is copied to TEXASR[56] (IBM bit 7) which is set if | ||
116 | the failure is persistent. | ||
117 | */ | ||
118 | #define TM_CAUSE_RESCHED 0xfe | ||
119 | #define TM_CAUSE_TLBI 0xfc | ||
120 | #define TM_CAUSE_FAC_UNAV 0xfa | ||
121 | #define TM_CAUSE_SYSCALL 0xf9 /* Persistent */ | ||
122 | #define TM_CAUSE_MISC 0xf6 | ||
123 | #define TM_CAUSE_SIGNAL 0xf4 | ||
124 | |||
101 | #if defined(CONFIG_PPC_BOOK3S_64) | 125 | #if defined(CONFIG_PPC_BOOK3S_64) |
102 | #define MSR_64BIT MSR_SF | 126 | #define MSR_64BIT MSR_SF |
103 | 127 | ||
@@ -193,6 +217,10 @@ | |||
193 | #define SPRN_UAMOR 0x9d /* User Authority Mask Override Register */ | 217 | #define SPRN_UAMOR 0x9d /* User Authority Mask Override Register */ |
194 | #define SPRN_AMOR 0x15d /* Authority Mask Override Register */ | 218 | #define SPRN_AMOR 0x15d /* Authority Mask Override Register */ |
195 | #define SPRN_ACOP 0x1F /* Available Coprocessor Register */ | 219 | #define SPRN_ACOP 0x1F /* Available Coprocessor Register */ |
220 | #define SPRN_TFIAR 0x81 /* Transaction Failure Inst Addr */ | ||
221 | #define SPRN_TEXASR 0x82 /* Transaction EXception & Summary */ | ||
222 | #define SPRN_TEXASRU 0x83 /* '' '' '' Upper 32 */ | ||
223 | #define SPRN_TFHAR 0x80 /* Transaction Failure Handler Addr */ | ||
196 | #define SPRN_CTRLF 0x088 | 224 | #define SPRN_CTRLF 0x088 |
197 | #define SPRN_CTRLT 0x098 | 225 | #define SPRN_CTRLT 0x098 |
198 | #define CTRL_CT 0xc0000000 /* current thread */ | 226 | #define CTRL_CT 0xc0000000 /* current thread */ |
@@ -200,10 +228,12 @@ | |||
200 | #define CTRL_CT1 0x40000000 /* thread 1 */ | 228 | #define CTRL_CT1 0x40000000 /* thread 1 */ |
201 | #define CTRL_TE 0x00c00000 /* thread enable */ | 229 | #define CTRL_TE 0x00c00000 /* thread enable */ |
202 | #define CTRL_RUNLATCH 0x1 | 230 | #define CTRL_RUNLATCH 0x1 |
231 | #define SPRN_DAWR 0xB4 | ||
232 | #define SPRN_DAWRX 0xBC | ||
233 | #define DAWRX_USER (1UL << 0) | ||
234 | #define DAWRX_KERNEL (1UL << 1) | ||
235 | #define DAWRX_HYP (1UL << 2) | ||
203 | #define SPRN_DABR 0x3F5 /* Data Address Breakpoint Register */ | 236 | #define SPRN_DABR 0x3F5 /* Data Address Breakpoint Register */ |
204 | #define DABR_TRANSLATION (1UL << 2) | ||
205 | #define DABR_DATA_WRITE (1UL << 1) | ||
206 | #define DABR_DATA_READ (1UL << 0) | ||
207 | #define SPRN_DABR2 0x13D /* e300 */ | 237 | #define SPRN_DABR2 0x13D /* e300 */ |
208 | #define SPRN_DABRX 0x3F7 /* Data Address Breakpoint Register Extension */ | 238 | #define SPRN_DABRX 0x3F7 /* Data Address Breakpoint Register Extension */ |
209 | #define DABRX_USER (1UL << 0) | 239 | #define DABRX_USER (1UL << 0) |
@@ -235,6 +265,9 @@ | |||
235 | #define SPRN_HRMOR 0x139 /* Real mode offset register */ | 265 | #define SPRN_HRMOR 0x139 /* Real mode offset register */ |
236 | #define SPRN_HSRR0 0x13A /* Hypervisor Save/Restore 0 */ | 266 | #define SPRN_HSRR0 0x13A /* Hypervisor Save/Restore 0 */ |
237 | #define SPRN_HSRR1 0x13B /* Hypervisor Save/Restore 1 */ | 267 | #define SPRN_HSRR1 0x13B /* Hypervisor Save/Restore 1 */ |
268 | #define SPRN_FSCR 0x099 /* Facility Status & Control Register */ | ||
269 | #define FSCR_TAR (1<<8) /* Enable Target Adress Register */ | ||
270 | #define SPRN_TAR 0x32f /* Target Address Register */ | ||
238 | #define SPRN_LPCR 0x13E /* LPAR Control Register */ | 271 | #define SPRN_LPCR 0x13E /* LPAR Control Register */ |
239 | #define LPCR_VPM0 (1ul << (63-0)) | 272 | #define LPCR_VPM0 (1ul << (63-0)) |
240 | #define LPCR_VPM1 (1ul << (63-1)) | 273 | #define LPCR_VPM1 (1ul << (63-1)) |
@@ -289,6 +322,7 @@ | |||
289 | #define SPRN_DBAT6U 0x23C /* Data BAT 6 Upper Register */ | 322 | #define SPRN_DBAT6U 0x23C /* Data BAT 6 Upper Register */ |
290 | #define SPRN_DBAT7L 0x23F /* Data BAT 7 Lower Register */ | 323 | #define SPRN_DBAT7L 0x23F /* Data BAT 7 Lower Register */ |
291 | #define SPRN_DBAT7U 0x23E /* Data BAT 7 Upper Register */ | 324 | #define SPRN_DBAT7U 0x23E /* Data BAT 7 Upper Register */ |
325 | #define SPRN_PPR 0x380 /* SMT Thread status Register */ | ||
292 | 326 | ||
293 | #define SPRN_DEC 0x016 /* Decrement Register */ | 327 | #define SPRN_DEC 0x016 /* Decrement Register */ |
294 | #define SPRN_DER 0x095 /* Debug Enable Regsiter */ | 328 | #define SPRN_DER 0x095 /* Debug Enable Regsiter */ |
@@ -483,6 +517,7 @@ | |||
483 | #ifndef SPRN_PIR | 517 | #ifndef SPRN_PIR |
484 | #define SPRN_PIR 0x3FF /* Processor Identification Register */ | 518 | #define SPRN_PIR 0x3FF /* Processor Identification Register */ |
485 | #endif | 519 | #endif |
520 | #define SPRN_TIR 0x1BE /* Thread Identification Register */ | ||
486 | #define SPRN_PTEHI 0x3D5 /* 981 7450 PTE HI word (S/W TLB load) */ | 521 | #define SPRN_PTEHI 0x3D5 /* 981 7450 PTE HI word (S/W TLB load) */ |
487 | #define SPRN_PTELO 0x3D6 /* 982 7450 PTE LO word (S/W TLB load) */ | 522 | #define SPRN_PTELO 0x3D6 /* 982 7450 PTE LO word (S/W TLB load) */ |
488 | #define SPRN_PURR 0x135 /* Processor Utilization of Resources Reg */ | 523 | #define SPRN_PURR 0x135 /* Processor Utilization of Resources Reg */ |
@@ -763,7 +798,7 @@ | |||
763 | * HV mode in which case it is HSPRG0 | 798 | * HV mode in which case it is HSPRG0 |
764 | * | 799 | * |
765 | * 64-bit server: | 800 | * 64-bit server: |
766 | * - SPRG0 unused (reserved for HV on Power4) | 801 | * - SPRG0 scratch for TM recheckpoint/reclaim (reserved for HV on Power4) |
767 | * - SPRG2 scratch for exception vectors | 802 | * - SPRG2 scratch for exception vectors |
768 | * - SPRG3 CPU and NUMA node for VDSO getcpu (user visible) | 803 | * - SPRG3 CPU and NUMA node for VDSO getcpu (user visible) |
769 | * - HSPRG0 stores PACA in HV mode | 804 | * - HSPRG0 stores PACA in HV mode |
diff --git a/arch/powerpc/include/asm/sections.h b/arch/powerpc/include/asm/sections.h index a0f358d4a00c..4ee06fe15de4 100644 --- a/arch/powerpc/include/asm/sections.h +++ b/arch/powerpc/include/asm/sections.h | |||
@@ -10,6 +10,9 @@ | |||
10 | 10 | ||
11 | extern char __end_interrupts[]; | 11 | extern char __end_interrupts[]; |
12 | 12 | ||
13 | extern char __prom_init_toc_start[]; | ||
14 | extern char __prom_init_toc_end[]; | ||
15 | |||
13 | static inline int in_kernel_text(unsigned long addr) | 16 | static inline int in_kernel_text(unsigned long addr) |
14 | { | 17 | { |
15 | if (addr >= (unsigned long)_stext && addr < (unsigned long)__init_end) | 18 | if (addr >= (unsigned long)_stext && addr < (unsigned long)__init_end) |
diff --git a/arch/powerpc/include/asm/spinlock.h b/arch/powerpc/include/asm/spinlock.h index 7124fc06ad47..5b23f910ee57 100644 --- a/arch/powerpc/include/asm/spinlock.h +++ b/arch/powerpc/include/asm/spinlock.h | |||
@@ -96,7 +96,7 @@ static inline int arch_spin_trylock(arch_spinlock_t *lock) | |||
96 | 96 | ||
97 | #if defined(CONFIG_PPC_SPLPAR) | 97 | #if defined(CONFIG_PPC_SPLPAR) |
98 | /* 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 */ |
99 | #define SHARED_PROCESSOR (get_lppaca()->shared_proc) | 99 | #define SHARED_PROCESSOR (local_paca->lppaca_ptr->shared_proc) |
100 | extern void __spin_yield(arch_spinlock_t *lock); | 100 | extern void __spin_yield(arch_spinlock_t *lock); |
101 | extern void __rw_yield(arch_rwlock_t *lock); | 101 | extern void __rw_yield(arch_rwlock_t *lock); |
102 | #else /* SPLPAR */ | 102 | #else /* SPLPAR */ |
diff --git a/arch/powerpc/include/asm/tm.h b/arch/powerpc/include/asm/tm.h new file mode 100644 index 000000000000..4b4449abf3f8 --- /dev/null +++ b/arch/powerpc/include/asm/tm.h | |||
@@ -0,0 +1,20 @@ | |||
1 | /* | ||
2 | * Transactional memory support routines to reclaim and recheckpoint | ||
3 | * transactional process state. | ||
4 | * | ||
5 | * Copyright 2012 Matt Evans & Michael Neuling, IBM Corporation. | ||
6 | */ | ||
7 | |||
8 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | ||
9 | extern void do_load_up_transact_fpu(struct thread_struct *thread); | ||
10 | extern void do_load_up_transact_altivec(struct thread_struct *thread); | ||
11 | #endif | ||
12 | |||
13 | extern void tm_enable(void); | ||
14 | extern void tm_reclaim(struct thread_struct *thread, | ||
15 | unsigned long orig_msr, uint8_t cause); | ||
16 | extern void tm_recheckpoint(struct thread_struct *thread, | ||
17 | unsigned long orig_msr); | ||
18 | extern void tm_abort(uint8_t cause); | ||
19 | extern void tm_save_sprs(struct thread_struct *thread); | ||
20 | extern void tm_restore_sprs(struct thread_struct *thread); | ||
diff --git a/arch/powerpc/include/uapi/asm/ptrace.h b/arch/powerpc/include/uapi/asm/ptrace.h index ee67a2bc91bb..66b9ca4ee94a 100644 --- a/arch/powerpc/include/uapi/asm/ptrace.h +++ b/arch/powerpc/include/uapi/asm/ptrace.h | |||
@@ -108,6 +108,7 @@ struct pt_regs { | |||
108 | #define PT_DAR 41 | 108 | #define PT_DAR 41 |
109 | #define PT_DSISR 42 | 109 | #define PT_DSISR 42 |
110 | #define PT_RESULT 43 | 110 | #define PT_RESULT 43 |
111 | #define PT_DSCR 44 | ||
111 | #define PT_REGS_COUNT 44 | 112 | #define PT_REGS_COUNT 44 |
112 | 113 | ||
113 | #define PT_FPR0 48 /* each FP reg occupies 2 slots in this space */ | 114 | #define PT_FPR0 48 /* each FP reg occupies 2 slots in this space */ |
@@ -146,34 +147,34 @@ struct pt_regs { | |||
146 | * structures. This also simplifies the implementation of a bi-arch | 147 | * structures. This also simplifies the implementation of a bi-arch |
147 | * (combined (32- and 64-bit) gdb. | 148 | * (combined (32- and 64-bit) gdb. |
148 | */ | 149 | */ |
149 | #define PTRACE_GETVRREGS 18 | 150 | #define PTRACE_GETVRREGS 0x12 |
150 | #define PTRACE_SETVRREGS 19 | 151 | #define PTRACE_SETVRREGS 0x13 |
151 | 152 | ||
152 | /* Get/set all the upper 32-bits of the SPE registers, accumulator, and | 153 | /* Get/set all the upper 32-bits of the SPE registers, accumulator, and |
153 | * spefscr, in one go */ | 154 | * spefscr, in one go */ |
154 | #define PTRACE_GETEVRREGS 20 | 155 | #define PTRACE_GETEVRREGS 0x14 |
155 | #define PTRACE_SETEVRREGS 21 | 156 | #define PTRACE_SETEVRREGS 0x15 |
156 | 157 | ||
157 | /* Get the first 32 128bit VSX registers */ | 158 | /* Get the first 32 128bit VSX registers */ |
158 | #define PTRACE_GETVSRREGS 27 | 159 | #define PTRACE_GETVSRREGS 0x1b |
159 | #define PTRACE_SETVSRREGS 28 | 160 | #define PTRACE_SETVSRREGS 0x1c |
160 | 161 | ||
161 | /* | 162 | /* |
162 | * Get or set a debug register. The first 16 are DABR registers and the | 163 | * Get or set a debug register. The first 16 are DABR registers and the |
163 | * second 16 are IABR registers. | 164 | * second 16 are IABR registers. |
164 | */ | 165 | */ |
165 | #define PTRACE_GET_DEBUGREG 25 | 166 | #define PTRACE_GET_DEBUGREG 0x19 |
166 | #define PTRACE_SET_DEBUGREG 26 | 167 | #define PTRACE_SET_DEBUGREG 0x1a |
167 | 168 | ||
168 | /* (new) PTRACE requests using the same numbers as x86 and the same | 169 | /* (new) PTRACE requests using the same numbers as x86 and the same |
169 | * argument ordering. Additionally, they support more registers too | 170 | * argument ordering. Additionally, they support more registers too |
170 | */ | 171 | */ |
171 | #define PTRACE_GETREGS 12 | 172 | #define PTRACE_GETREGS 0xc |
172 | #define PTRACE_SETREGS 13 | 173 | #define PTRACE_SETREGS 0xd |
173 | #define PTRACE_GETFPREGS 14 | 174 | #define PTRACE_GETFPREGS 0xe |
174 | #define PTRACE_SETFPREGS 15 | 175 | #define PTRACE_SETFPREGS 0xf |
175 | #define PTRACE_GETREGS64 22 | 176 | #define PTRACE_GETREGS64 0x16 |
176 | #define PTRACE_SETREGS64 23 | 177 | #define PTRACE_SETREGS64 0x17 |
177 | 178 | ||
178 | /* Calls to trace a 64bit program from a 32bit program */ | 179 | /* Calls to trace a 64bit program from a 32bit program */ |
179 | #define PPC_PTRACE_PEEKTEXT_3264 0x95 | 180 | #define PPC_PTRACE_PEEKTEXT_3264 0x95 |
diff --git a/arch/powerpc/kernel/Makefile b/arch/powerpc/kernel/Makefile index 8f619342f14c..f960a7944553 100644 --- a/arch/powerpc/kernel/Makefile +++ b/arch/powerpc/kernel/Makefile | |||
@@ -7,7 +7,7 @@ CFLAGS_ptrace.o += -DUTS_MACHINE='"$(UTS_MACHINE)"' | |||
7 | subdir-ccflags-$(CONFIG_PPC_WERROR) := -Werror | 7 | subdir-ccflags-$(CONFIG_PPC_WERROR) := -Werror |
8 | 8 | ||
9 | ifeq ($(CONFIG_PPC64),y) | 9 | ifeq ($(CONFIG_PPC64),y) |
10 | CFLAGS_prom_init.o += -mno-minimal-toc | 10 | CFLAGS_prom_init.o += $(NO_MINIMAL_TOC) |
11 | endif | 11 | endif |
12 | ifeq ($(CONFIG_PPC32),y) | 12 | ifeq ($(CONFIG_PPC32),y) |
13 | CFLAGS_prom_init.o += -fPIC | 13 | CFLAGS_prom_init.o += -fPIC |
@@ -75,8 +75,8 @@ endif | |||
75 | obj64-$(CONFIG_HIBERNATION) += swsusp_asm64.o | 75 | obj64-$(CONFIG_HIBERNATION) += swsusp_asm64.o |
76 | obj-$(CONFIG_MODULES) += module.o module_$(CONFIG_WORD_SIZE).o | 76 | obj-$(CONFIG_MODULES) += module.o module_$(CONFIG_WORD_SIZE).o |
77 | obj-$(CONFIG_44x) += cpu_setup_44x.o | 77 | obj-$(CONFIG_44x) += cpu_setup_44x.o |
78 | obj-$(CONFIG_PPC_FSL_BOOK3E) += cpu_setup_fsl_booke.o dbell.o | 78 | obj-$(CONFIG_PPC_FSL_BOOK3E) += cpu_setup_fsl_booke.o |
79 | obj-$(CONFIG_PPC_BOOK3E_64) += dbell.o | 79 | obj-$(CONFIG_PPC_DOORBELL) += dbell.o |
80 | obj-$(CONFIG_JUMP_LABEL) += jump_label.o | 80 | obj-$(CONFIG_JUMP_LABEL) += jump_label.o |
81 | 81 | ||
82 | extra-y := head_$(CONFIG_WORD_SIZE).o | 82 | extra-y := head_$(CONFIG_WORD_SIZE).o |
@@ -91,7 +91,6 @@ obj-$(CONFIG_RELOCATABLE_PPC32) += reloc_32.o | |||
91 | obj-$(CONFIG_PPC32) += entry_32.o setup_32.o | 91 | obj-$(CONFIG_PPC32) += entry_32.o setup_32.o |
92 | obj-$(CONFIG_PPC64) += dma-iommu.o iommu.o | 92 | obj-$(CONFIG_PPC64) += dma-iommu.o iommu.o |
93 | obj-$(CONFIG_KGDB) += kgdb.o | 93 | obj-$(CONFIG_KGDB) += kgdb.o |
94 | obj-$(CONFIG_PPC_OF_BOOT_TRAMPOLINE) += prom_init.o | ||
95 | obj-$(CONFIG_MODULES) += ppc_ksyms.o | 94 | obj-$(CONFIG_MODULES) += ppc_ksyms.o |
96 | obj-$(CONFIG_BOOTX_TEXT) += btext.o | 95 | obj-$(CONFIG_BOOTX_TEXT) += btext.o |
97 | obj-$(CONFIG_SMP) += smp.o | 96 | obj-$(CONFIG_SMP) += smp.o |
@@ -122,6 +121,8 @@ ifneq ($(CONFIG_PPC_INDIRECT_IO),y) | |||
122 | obj-y += iomap.o | 121 | obj-y += iomap.o |
123 | endif | 122 | endif |
124 | 123 | ||
124 | obj64-$(CONFIG_PPC_TRANSACTIONAL_MEM) += tm.o | ||
125 | |||
125 | obj-$(CONFIG_PPC64) += $(obj64-y) | 126 | obj-$(CONFIG_PPC64) += $(obj64-y) |
126 | obj-$(CONFIG_PPC32) += $(obj32-y) | 127 | obj-$(CONFIG_PPC32) += $(obj32-y) |
127 | 128 | ||
@@ -142,6 +143,7 @@ GCOV_PROFILE_kprobes.o := n | |||
142 | extra-$(CONFIG_PPC_FPU) += fpu.o | 143 | extra-$(CONFIG_PPC_FPU) += fpu.o |
143 | extra-$(CONFIG_ALTIVEC) += vector.o | 144 | extra-$(CONFIG_ALTIVEC) += vector.o |
144 | extra-$(CONFIG_PPC64) += entry_64.o | 145 | extra-$(CONFIG_PPC64) += entry_64.o |
146 | extra-$(CONFIG_PPC_OF_BOOT_TRAMPOLINE) += prom_init.o | ||
145 | 147 | ||
146 | extra-y += systbl_chk.i | 148 | extra-y += systbl_chk.i |
147 | $(obj)/systbl.o: systbl_chk | 149 | $(obj)/systbl.o: systbl_chk |
diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c index 4e23ba2f3ca7..781190367292 100644 --- a/arch/powerpc/kernel/asm-offsets.c +++ b/arch/powerpc/kernel/asm-offsets.c | |||
@@ -77,6 +77,7 @@ int main(void) | |||
77 | DEFINE(NMI_MASK, NMI_MASK); | 77 | DEFINE(NMI_MASK, NMI_MASK); |
78 | DEFINE(THREAD_DSCR, offsetof(struct thread_struct, dscr)); | 78 | DEFINE(THREAD_DSCR, offsetof(struct thread_struct, dscr)); |
79 | DEFINE(THREAD_DSCR_INHERIT, offsetof(struct thread_struct, dscr_inherit)); | 79 | DEFINE(THREAD_DSCR_INHERIT, offsetof(struct thread_struct, dscr_inherit)); |
80 | DEFINE(TASKTHREADPPR, offsetof(struct task_struct, thread.ppr)); | ||
80 | #else | 81 | #else |
81 | DEFINE(THREAD_INFO, offsetof(struct task_struct, stack)); | 82 | DEFINE(THREAD_INFO, offsetof(struct task_struct, stack)); |
82 | #endif /* CONFIG_PPC64 */ | 83 | #endif /* CONFIG_PPC64 */ |
@@ -121,6 +122,34 @@ int main(void) | |||
121 | DEFINE(THREAD_KVM_VCPU, offsetof(struct thread_struct, kvm_vcpu)); | 122 | DEFINE(THREAD_KVM_VCPU, offsetof(struct thread_struct, kvm_vcpu)); |
122 | #endif | 123 | #endif |
123 | 124 | ||
125 | #ifdef CONFIG_PPC_BOOK3S_64 | ||
126 | DEFINE(THREAD_TAR, offsetof(struct thread_struct, tar)); | ||
127 | #endif | ||
128 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | ||
129 | DEFINE(PACATMSCRATCH, offsetof(struct paca_struct, tm_scratch)); | ||
130 | DEFINE(THREAD_TM_TFHAR, offsetof(struct thread_struct, tm_tfhar)); | ||
131 | DEFINE(THREAD_TM_TEXASR, offsetof(struct thread_struct, tm_texasr)); | ||
132 | DEFINE(THREAD_TM_TFIAR, offsetof(struct thread_struct, tm_tfiar)); | ||
133 | DEFINE(PT_CKPT_REGS, offsetof(struct thread_struct, ckpt_regs)); | ||
134 | DEFINE(THREAD_TRANSACT_VR0, offsetof(struct thread_struct, | ||
135 | transact_vr[0])); | ||
136 | DEFINE(THREAD_TRANSACT_VSCR, offsetof(struct thread_struct, | ||
137 | transact_vscr)); | ||
138 | DEFINE(THREAD_TRANSACT_VRSAVE, offsetof(struct thread_struct, | ||
139 | transact_vrsave)); | ||
140 | DEFINE(THREAD_TRANSACT_FPR0, offsetof(struct thread_struct, | ||
141 | transact_fpr[0])); | ||
142 | DEFINE(THREAD_TRANSACT_FPSCR, offsetof(struct thread_struct, | ||
143 | transact_fpscr)); | ||
144 | #ifdef CONFIG_VSX | ||
145 | DEFINE(THREAD_TRANSACT_VSR0, offsetof(struct thread_struct, | ||
146 | transact_fpr[0])); | ||
147 | #endif | ||
148 | /* Local pt_regs on stack for Transactional Memory funcs. */ | ||
149 | DEFINE(TM_FRAME_SIZE, STACK_FRAME_OVERHEAD + | ||
150 | sizeof(struct pt_regs) + 16); | ||
151 | #endif /* CONFIG_PPC_TRANSACTIONAL_MEM */ | ||
152 | |||
124 | DEFINE(TI_FLAGS, offsetof(struct thread_info, flags)); | 153 | DEFINE(TI_FLAGS, offsetof(struct thread_info, flags)); |
125 | DEFINE(TI_LOCAL_FLAGS, offsetof(struct thread_info, local_flags)); | 154 | DEFINE(TI_LOCAL_FLAGS, offsetof(struct thread_info, local_flags)); |
126 | DEFINE(TI_PREEMPT, offsetof(struct thread_info, preempt_count)); | 155 | DEFINE(TI_PREEMPT, offsetof(struct thread_info, preempt_count)); |
@@ -474,6 +503,7 @@ int main(void) | |||
474 | DEFINE(VCPU_LAST_INST, offsetof(struct kvm_vcpu, arch.last_inst)); | 503 | DEFINE(VCPU_LAST_INST, offsetof(struct kvm_vcpu, arch.last_inst)); |
475 | DEFINE(VCPU_TRAP, offsetof(struct kvm_vcpu, arch.trap)); | 504 | DEFINE(VCPU_TRAP, offsetof(struct kvm_vcpu, arch.trap)); |
476 | DEFINE(VCPU_PTID, offsetof(struct kvm_vcpu, arch.ptid)); | 505 | DEFINE(VCPU_PTID, offsetof(struct kvm_vcpu, arch.ptid)); |
506 | DEFINE(VCPU_CFAR, offsetof(struct kvm_vcpu, arch.cfar)); | ||
477 | DEFINE(VCORE_ENTRY_EXIT, offsetof(struct kvmppc_vcore, entry_exit_count)); | 507 | DEFINE(VCORE_ENTRY_EXIT, offsetof(struct kvmppc_vcore, entry_exit_count)); |
478 | DEFINE(VCORE_NAP_COUNT, offsetof(struct kvmppc_vcore, nap_count)); | 508 | DEFINE(VCORE_NAP_COUNT, offsetof(struct kvmppc_vcore, nap_count)); |
479 | DEFINE(VCORE_IN_GUEST, offsetof(struct kvmppc_vcore, in_guest)); | 509 | DEFINE(VCORE_IN_GUEST, offsetof(struct kvmppc_vcore, in_guest)); |
@@ -553,6 +583,10 @@ int main(void) | |||
553 | DEFINE(IPI_PRIORITY, IPI_PRIORITY); | 583 | DEFINE(IPI_PRIORITY, IPI_PRIORITY); |
554 | #endif /* CONFIG_KVM_BOOK3S_64_HV */ | 584 | #endif /* CONFIG_KVM_BOOK3S_64_HV */ |
555 | 585 | ||
586 | #ifdef CONFIG_PPC_BOOK3S_64 | ||
587 | HSTATE_FIELD(HSTATE_CFAR, cfar); | ||
588 | #endif /* CONFIG_PPC_BOOK3S_64 */ | ||
589 | |||
556 | #else /* CONFIG_PPC_BOOK3S */ | 590 | #else /* CONFIG_PPC_BOOK3S */ |
557 | DEFINE(VCPU_CR, offsetof(struct kvm_vcpu, arch.cr)); | 591 | DEFINE(VCPU_CR, offsetof(struct kvm_vcpu, arch.cr)); |
558 | DEFINE(VCPU_XER, offsetof(struct kvm_vcpu, arch.xer)); | 592 | DEFINE(VCPU_XER, offsetof(struct kvm_vcpu, arch.xer)); |
diff --git a/arch/powerpc/kernel/cpu_setup_power.S b/arch/powerpc/kernel/cpu_setup_power.S index 57cf14065aec..d29facbf9a28 100644 --- a/arch/powerpc/kernel/cpu_setup_power.S +++ b/arch/powerpc/kernel/cpu_setup_power.S | |||
@@ -56,6 +56,7 @@ _GLOBAL(__setup_cpu_power8) | |||
56 | mfspr r3,SPRN_LPCR | 56 | mfspr r3,SPRN_LPCR |
57 | oris r3, r3, LPCR_AIL_3@h | 57 | oris r3, r3, LPCR_AIL_3@h |
58 | bl __init_LPCR | 58 | bl __init_LPCR |
59 | bl __init_FSCR | ||
59 | bl __init_TLB | 60 | bl __init_TLB |
60 | mtlr r11 | 61 | mtlr r11 |
61 | blr | 62 | blr |
@@ -112,6 +113,12 @@ __init_LPCR: | |||
112 | isync | 113 | isync |
113 | blr | 114 | blr |
114 | 115 | ||
116 | __init_FSCR: | ||
117 | mfspr r3,SPRN_FSCR | ||
118 | ori r3,r3,FSCR_TAR | ||
119 | mtspr SPRN_FSCR,r3 | ||
120 | blr | ||
121 | |||
115 | __init_TLB: | 122 | __init_TLB: |
116 | /* Clear the TLB */ | 123 | /* Clear the TLB */ |
117 | li r6,128 | 124 | li r6,128 |
diff --git a/arch/powerpc/kernel/dbell.c b/arch/powerpc/kernel/dbell.c index a892680668d8..9ebbc24bb23c 100644 --- a/arch/powerpc/kernel/dbell.c +++ b/arch/powerpc/kernel/dbell.c | |||
@@ -21,7 +21,7 @@ | |||
21 | #ifdef CONFIG_SMP | 21 | #ifdef CONFIG_SMP |
22 | void doorbell_setup_this_cpu(void) | 22 | void doorbell_setup_this_cpu(void) |
23 | { | 23 | { |
24 | unsigned long tag = mfspr(SPRN_PIR) & 0x3fff; | 24 | unsigned long tag = mfspr(SPRN_DOORBELL_CPUTAG) & PPC_DBELL_TAG_MASK; |
25 | 25 | ||
26 | smp_muxed_ipi_set_data(smp_processor_id(), tag); | 26 | smp_muxed_ipi_set_data(smp_processor_id(), tag); |
27 | } | 27 | } |
@@ -30,7 +30,7 @@ void doorbell_cause_ipi(int cpu, unsigned long data) | |||
30 | { | 30 | { |
31 | /* Order previous accesses vs. msgsnd, which is treated as a store */ | 31 | /* Order previous accesses vs. msgsnd, which is treated as a store */ |
32 | mb(); | 32 | mb(); |
33 | ppc_msgsnd(PPC_DBELL, 0, data); | 33 | ppc_msgsnd(PPC_DBELL_MSGTYPE, 0, data); |
34 | } | 34 | } |
35 | 35 | ||
36 | void doorbell_exception(struct pt_regs *regs) | 36 | void doorbell_exception(struct pt_regs *regs) |
diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S index ac057013f9fd..256c5bf0adb7 100644 --- a/arch/powerpc/kernel/entry_64.S +++ b/arch/powerpc/kernel/entry_64.S | |||
@@ -62,8 +62,9 @@ system_call_common: | |||
62 | std r12,_MSR(r1) | 62 | std r12,_MSR(r1) |
63 | std r0,GPR0(r1) | 63 | std r0,GPR0(r1) |
64 | std r10,GPR1(r1) | 64 | std r10,GPR1(r1) |
65 | beq 2f /* if from kernel mode */ | ||
65 | ACCOUNT_CPU_USER_ENTRY(r10, r11) | 66 | ACCOUNT_CPU_USER_ENTRY(r10, r11) |
66 | std r2,GPR2(r1) | 67 | 2: std r2,GPR2(r1) |
67 | std r3,GPR3(r1) | 68 | std r3,GPR3(r1) |
68 | mfcr r2 | 69 | mfcr r2 |
69 | std r4,GPR4(r1) | 70 | std r4,GPR4(r1) |
@@ -226,6 +227,7 @@ END_FTR_SECTION_IFCLR(CPU_FTR_STCX_CHECKS_ADDRESS) | |||
226 | 227 | ||
227 | beq- 1f | 228 | beq- 1f |
228 | ACCOUNT_CPU_USER_EXIT(r11, r12) | 229 | ACCOUNT_CPU_USER_EXIT(r11, r12) |
230 | HMT_MEDIUM_LOW_HAS_PPR | ||
229 | ld r13,GPR13(r1) /* only restore r13 if returning to usermode */ | 231 | ld r13,GPR13(r1) /* only restore r13 if returning to usermode */ |
230 | 1: ld r2,GPR2(r1) | 232 | 1: ld r2,GPR2(r1) |
231 | ld r1,GPR1(r1) | 233 | ld r1,GPR1(r1) |
@@ -302,6 +304,7 @@ syscall_exit_work: | |||
302 | subi r12,r12,TI_FLAGS | 304 | subi r12,r12,TI_FLAGS |
303 | 305 | ||
304 | 4: /* Anything else left to do? */ | 306 | 4: /* Anything else left to do? */ |
307 | SET_DEFAULT_THREAD_PPR(r3, r9) /* Set thread.ppr = 3 */ | ||
305 | andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP) | 308 | andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP) |
306 | beq .ret_from_except_lite | 309 | beq .ret_from_except_lite |
307 | 310 | ||
@@ -445,6 +448,19 @@ END_FTR_SECTION_IFSET(CPU_FTR_DSCR) | |||
445 | std r23,_CCR(r1) | 448 | std r23,_CCR(r1) |
446 | std r1,KSP(r3) /* Set old stack pointer */ | 449 | std r1,KSP(r3) /* Set old stack pointer */ |
447 | 450 | ||
451 | #ifdef CONFIG_PPC_BOOK3S_64 | ||
452 | BEGIN_FTR_SECTION | ||
453 | /* | ||
454 | * Back up the TAR across context switches. Note that the TAR is not | ||
455 | * available for use in the kernel. (To provide this, the TAR should | ||
456 | * be backed up/restored on exception entry/exit instead, and be in | ||
457 | * pt_regs. FIXME, this should be in pt_regs anyway (for debug).) | ||
458 | */ | ||
459 | mfspr r0,SPRN_TAR | ||
460 | std r0,THREAD_TAR(r3) | ||
461 | END_FTR_SECTION_IFSET(CPU_FTR_BCTAR) | ||
462 | #endif | ||
463 | |||
448 | #ifdef CONFIG_SMP | 464 | #ifdef CONFIG_SMP |
449 | /* We need a sync somewhere here to make sure that if the | 465 | /* We need a sync somewhere here to make sure that if the |
450 | * previous task gets rescheduled on another CPU, it sees all | 466 | * previous task gets rescheduled on another CPU, it sees all |
@@ -527,6 +543,13 @@ END_MMU_FTR_SECTION_IFSET(MMU_FTR_1T_SEGMENT) | |||
527 | mr r1,r8 /* start using new stack pointer */ | 543 | mr r1,r8 /* start using new stack pointer */ |
528 | std r7,PACAKSAVE(r13) | 544 | std r7,PACAKSAVE(r13) |
529 | 545 | ||
546 | #ifdef CONFIG_PPC_BOOK3S_64 | ||
547 | BEGIN_FTR_SECTION | ||
548 | ld r0,THREAD_TAR(r4) | ||
549 | mtspr SPRN_TAR,r0 | ||
550 | END_FTR_SECTION_IFSET(CPU_FTR_BCTAR) | ||
551 | #endif | ||
552 | |||
530 | #ifdef CONFIG_ALTIVEC | 553 | #ifdef CONFIG_ALTIVEC |
531 | BEGIN_FTR_SECTION | 554 | BEGIN_FTR_SECTION |
532 | ld r0,THREAD_VRSAVE(r4) | 555 | ld r0,THREAD_VRSAVE(r4) |
@@ -762,6 +785,10 @@ fast_exception_return: | |||
762 | andc r4,r4,r0 /* r0 contains MSR_RI here */ | 785 | andc r4,r4,r0 /* r0 contains MSR_RI here */ |
763 | mtmsrd r4,1 | 786 | mtmsrd r4,1 |
764 | 787 | ||
788 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | ||
789 | /* TM debug */ | ||
790 | std r3, PACATMSCRATCH(r13) /* Stash returned-to MSR */ | ||
791 | #endif | ||
765 | /* | 792 | /* |
766 | * r13 is our per cpu area, only restore it if we are returning to | 793 | * r13 is our per cpu area, only restore it if we are returning to |
767 | * userspace the value stored in the stack frame may belong to | 794 | * userspace the value stored in the stack frame may belong to |
@@ -770,6 +797,7 @@ fast_exception_return: | |||
770 | andi. r0,r3,MSR_PR | 797 | andi. r0,r3,MSR_PR |
771 | beq 1f | 798 | beq 1f |
772 | ACCOUNT_CPU_USER_EXIT(r2, r4) | 799 | ACCOUNT_CPU_USER_EXIT(r2, r4) |
800 | RESTORE_PPR(r2, r4) | ||
773 | REST_GPR(13, r1) | 801 | REST_GPR(13, r1) |
774 | 1: | 802 | 1: |
775 | mtspr SPRN_SRR1,r3 | 803 | mtspr SPRN_SRR1,r3 |
@@ -849,13 +877,22 @@ restore_check_irq_replay: | |||
849 | addi r3,r1,STACK_FRAME_OVERHEAD; | 877 | addi r3,r1,STACK_FRAME_OVERHEAD; |
850 | bl .timer_interrupt | 878 | bl .timer_interrupt |
851 | b .ret_from_except | 879 | b .ret_from_except |
880 | #ifdef CONFIG_PPC_DOORBELL | ||
881 | 1: | ||
852 | #ifdef CONFIG_PPC_BOOK3E | 882 | #ifdef CONFIG_PPC_BOOK3E |
853 | 1: cmpwi cr0,r3,0x280 | 883 | cmpwi cr0,r3,0x280 |
884 | #else | ||
885 | BEGIN_FTR_SECTION | ||
886 | cmpwi cr0,r3,0xe80 | ||
887 | FTR_SECTION_ELSE | ||
888 | cmpwi cr0,r3,0xa00 | ||
889 | ALT_FTR_SECTION_END_IFSET(CPU_FTR_HVMODE) | ||
890 | #endif /* CONFIG_PPC_BOOK3E */ | ||
854 | bne 1f | 891 | bne 1f |
855 | addi r3,r1,STACK_FRAME_OVERHEAD; | 892 | addi r3,r1,STACK_FRAME_OVERHEAD; |
856 | bl .doorbell_exception | 893 | bl .doorbell_exception |
857 | b .ret_from_except | 894 | b .ret_from_except |
858 | #endif /* CONFIG_PPC_BOOK3E */ | 895 | #endif /* CONFIG_PPC_DOORBELL */ |
859 | 1: b .ret_from_except /* What else to do here ? */ | 896 | 1: b .ret_from_except /* What else to do here ? */ |
860 | 897 | ||
861 | unrecov_restore: | 898 | unrecov_restore: |
diff --git a/arch/powerpc/kernel/exceptions-64e.S b/arch/powerpc/kernel/exceptions-64e.S index 4684e33a26c3..ae54553eacd9 100644 --- a/arch/powerpc/kernel/exceptions-64e.S +++ b/arch/powerpc/kernel/exceptions-64e.S | |||
@@ -159,8 +159,9 @@ exc_##n##_common: \ | |||
159 | std r9,GPR9(r1); /* save r9 in stackframe */ \ | 159 | std r9,GPR9(r1); /* save r9 in stackframe */ \ |
160 | std r10,_NIP(r1); /* save SRR0 to stackframe */ \ | 160 | std r10,_NIP(r1); /* save SRR0 to stackframe */ \ |
161 | std r11,_MSR(r1); /* save SRR1 to stackframe */ \ | 161 | std r11,_MSR(r1); /* save SRR1 to stackframe */ \ |
162 | beq 2f; /* if from kernel mode */ \ | ||
162 | ACCOUNT_CPU_USER_ENTRY(r10,r11);/* accounting (uses cr0+eq) */ \ | 163 | ACCOUNT_CPU_USER_ENTRY(r10,r11);/* accounting (uses cr0+eq) */ \ |
163 | ld r3,excf+EX_R10(r13); /* get back r10 */ \ | 164 | 2: ld r3,excf+EX_R10(r13); /* get back r10 */ \ |
164 | ld r4,excf+EX_R11(r13); /* get back r11 */ \ | 165 | ld r4,excf+EX_R11(r13); /* get back r11 */ \ |
165 | mfspr r5,SPRN_SPRG_GEN_SCRATCH;/* get back r13 */ \ | 166 | mfspr r5,SPRN_SPRG_GEN_SCRATCH;/* get back r13 */ \ |
166 | std r12,GPR12(r1); /* save r12 in stackframe */ \ | 167 | std r12,GPR12(r1); /* save r12 in stackframe */ \ |
diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S index 4665e82fa377..a8a5361fb70c 100644 --- a/arch/powerpc/kernel/exceptions-64s.S +++ b/arch/powerpc/kernel/exceptions-64s.S | |||
@@ -104,7 +104,7 @@ __start_interrupts: | |||
104 | 104 | ||
105 | .globl system_reset_pSeries; | 105 | .globl system_reset_pSeries; |
106 | system_reset_pSeries: | 106 | system_reset_pSeries: |
107 | HMT_MEDIUM; | 107 | HMT_MEDIUM_PPR_DISCARD |
108 | SET_SCRATCH0(r13) | 108 | SET_SCRATCH0(r13) |
109 | #ifdef CONFIG_PPC_P7_NAP | 109 | #ifdef CONFIG_PPC_P7_NAP |
110 | BEGIN_FTR_SECTION | 110 | BEGIN_FTR_SECTION |
@@ -153,12 +153,15 @@ machine_check_pSeries_1: | |||
153 | * some code path might still want to branch into the original | 153 | * some code path might still want to branch into the original |
154 | * vector | 154 | * vector |
155 | */ | 155 | */ |
156 | b machine_check_pSeries | 156 | HMT_MEDIUM_PPR_DISCARD |
157 | SET_SCRATCH0(r13) /* save r13 */ | ||
158 | EXCEPTION_PROLOG_0(PACA_EXMC) | ||
159 | b machine_check_pSeries_0 | ||
157 | 160 | ||
158 | . = 0x300 | 161 | . = 0x300 |
159 | .globl data_access_pSeries | 162 | .globl data_access_pSeries |
160 | data_access_pSeries: | 163 | data_access_pSeries: |
161 | HMT_MEDIUM | 164 | HMT_MEDIUM_PPR_DISCARD |
162 | SET_SCRATCH0(r13) | 165 | SET_SCRATCH0(r13) |
163 | BEGIN_FTR_SECTION | 166 | BEGIN_FTR_SECTION |
164 | b data_access_check_stab | 167 | b data_access_check_stab |
@@ -170,8 +173,9 @@ END_MMU_FTR_SECTION_IFCLR(MMU_FTR_SLB) | |||
170 | . = 0x380 | 173 | . = 0x380 |
171 | .globl data_access_slb_pSeries | 174 | .globl data_access_slb_pSeries |
172 | data_access_slb_pSeries: | 175 | data_access_slb_pSeries: |
173 | HMT_MEDIUM | 176 | HMT_MEDIUM_PPR_DISCARD |
174 | SET_SCRATCH0(r13) | 177 | SET_SCRATCH0(r13) |
178 | EXCEPTION_PROLOG_0(PACA_EXSLB) | ||
175 | EXCEPTION_PROLOG_1(PACA_EXSLB, KVMTEST, 0x380) | 179 | EXCEPTION_PROLOG_1(PACA_EXSLB, KVMTEST, 0x380) |
176 | std r3,PACA_EXSLB+EX_R3(r13) | 180 | std r3,PACA_EXSLB+EX_R3(r13) |
177 | mfspr r3,SPRN_DAR | 181 | mfspr r3,SPRN_DAR |
@@ -201,8 +205,9 @@ data_access_slb_pSeries: | |||
201 | . = 0x480 | 205 | . = 0x480 |
202 | .globl instruction_access_slb_pSeries | 206 | .globl instruction_access_slb_pSeries |
203 | instruction_access_slb_pSeries: | 207 | instruction_access_slb_pSeries: |
204 | HMT_MEDIUM | 208 | HMT_MEDIUM_PPR_DISCARD |
205 | SET_SCRATCH0(r13) | 209 | SET_SCRATCH0(r13) |
210 | EXCEPTION_PROLOG_0(PACA_EXSLB) | ||
206 | EXCEPTION_PROLOG_1(PACA_EXSLB, KVMTEST_PR, 0x480) | 211 | EXCEPTION_PROLOG_1(PACA_EXSLB, KVMTEST_PR, 0x480) |
207 | std r3,PACA_EXSLB+EX_R3(r13) | 212 | std r3,PACA_EXSLB+EX_R3(r13) |
208 | mfspr r3,SPRN_SRR0 /* SRR0 is faulting address */ | 213 | mfspr r3,SPRN_SRR0 /* SRR0 is faulting address */ |
@@ -252,7 +257,7 @@ hardware_interrupt_hv: | |||
252 | MASKABLE_EXCEPTION_PSERIES(0x900, 0x900, decrementer) | 257 | MASKABLE_EXCEPTION_PSERIES(0x900, 0x900, decrementer) |
253 | STD_EXCEPTION_HV(0x980, 0x982, hdecrementer) | 258 | STD_EXCEPTION_HV(0x980, 0x982, hdecrementer) |
254 | 259 | ||
255 | STD_EXCEPTION_PSERIES(0xa00, 0xa00, trap_0a) | 260 | MASKABLE_EXCEPTION_PSERIES(0xa00, 0xa00, doorbell_super) |
256 | KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xa00) | 261 | KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xa00) |
257 | 262 | ||
258 | STD_EXCEPTION_PSERIES(0xb00, 0xb00, trap_0b) | 263 | STD_EXCEPTION_PSERIES(0xb00, 0xb00, trap_0b) |
@@ -284,16 +289,30 @@ system_call_pSeries: | |||
284 | */ | 289 | */ |
285 | . = 0xe00 | 290 | . = 0xe00 |
286 | hv_exception_trampoline: | 291 | hv_exception_trampoline: |
292 | SET_SCRATCH0(r13) | ||
293 | EXCEPTION_PROLOG_0(PACA_EXGEN) | ||
287 | b h_data_storage_hv | 294 | b h_data_storage_hv |
295 | |||
288 | . = 0xe20 | 296 | . = 0xe20 |
297 | SET_SCRATCH0(r13) | ||
298 | EXCEPTION_PROLOG_0(PACA_EXGEN) | ||
289 | b h_instr_storage_hv | 299 | b h_instr_storage_hv |
300 | |||
290 | . = 0xe40 | 301 | . = 0xe40 |
302 | SET_SCRATCH0(r13) | ||
303 | EXCEPTION_PROLOG_0(PACA_EXGEN) | ||
291 | b emulation_assist_hv | 304 | b emulation_assist_hv |
292 | . = 0xe50 | 305 | |
293 | b hmi_exception_hv | ||
294 | . = 0xe60 | 306 | . = 0xe60 |
307 | SET_SCRATCH0(r13) | ||
308 | EXCEPTION_PROLOG_0(PACA_EXGEN) | ||
295 | b hmi_exception_hv | 309 | b hmi_exception_hv |
296 | 310 | ||
311 | . = 0xe80 | ||
312 | SET_SCRATCH0(r13) | ||
313 | EXCEPTION_PROLOG_0(PACA_EXGEN) | ||
314 | b h_doorbell_hv | ||
315 | |||
297 | /* We need to deal with the Altivec unavailable exception | 316 | /* We need to deal with the Altivec unavailable exception |
298 | * here which is at 0xf20, thus in the middle of the | 317 | * here which is at 0xf20, thus in the middle of the |
299 | * prolog code of the PerformanceMonitor one. A little | 318 | * prolog code of the PerformanceMonitor one. A little |
@@ -301,16 +320,27 @@ hv_exception_trampoline: | |||
301 | */ | 320 | */ |
302 | performance_monitor_pSeries_1: | 321 | performance_monitor_pSeries_1: |
303 | . = 0xf00 | 322 | . = 0xf00 |
323 | SET_SCRATCH0(r13) | ||
324 | EXCEPTION_PROLOG_0(PACA_EXGEN) | ||
304 | b performance_monitor_pSeries | 325 | b performance_monitor_pSeries |
305 | 326 | ||
306 | altivec_unavailable_pSeries_1: | 327 | altivec_unavailable_pSeries_1: |
307 | . = 0xf20 | 328 | . = 0xf20 |
329 | SET_SCRATCH0(r13) | ||
330 | EXCEPTION_PROLOG_0(PACA_EXGEN) | ||
308 | b altivec_unavailable_pSeries | 331 | b altivec_unavailable_pSeries |
309 | 332 | ||
310 | vsx_unavailable_pSeries_1: | 333 | vsx_unavailable_pSeries_1: |
311 | . = 0xf40 | 334 | . = 0xf40 |
335 | SET_SCRATCH0(r13) | ||
336 | EXCEPTION_PROLOG_0(PACA_EXGEN) | ||
312 | b vsx_unavailable_pSeries | 337 | b vsx_unavailable_pSeries |
313 | 338 | ||
339 | . = 0xf60 | ||
340 | SET_SCRATCH0(r13) | ||
341 | EXCEPTION_PROLOG_0(PACA_EXGEN) | ||
342 | b tm_unavailable_pSeries | ||
343 | |||
314 | #ifdef CONFIG_CBE_RAS | 344 | #ifdef CONFIG_CBE_RAS |
315 | STD_EXCEPTION_HV(0x1200, 0x1202, cbe_system_error) | 345 | STD_EXCEPTION_HV(0x1200, 0x1202, cbe_system_error) |
316 | KVM_HANDLER_SKIP(PACA_EXGEN, EXC_HV, 0x1202) | 346 | KVM_HANDLER_SKIP(PACA_EXGEN, EXC_HV, 0x1202) |
@@ -322,11 +352,9 @@ vsx_unavailable_pSeries_1: | |||
322 | . = 0x1500 | 352 | . = 0x1500 |
323 | .global denorm_exception_hv | 353 | .global denorm_exception_hv |
324 | denorm_exception_hv: | 354 | denorm_exception_hv: |
325 | HMT_MEDIUM | 355 | HMT_MEDIUM_PPR_DISCARD |
326 | mtspr SPRN_SPRG_HSCRATCH0,r13 | 356 | mtspr SPRN_SPRG_HSCRATCH0,r13 |
327 | mfspr r13,SPRN_SPRG_HPACA | 357 | EXCEPTION_PROLOG_0(PACA_EXGEN) |
328 | std r9,PACA_EXGEN+EX_R9(r13) | ||
329 | std r10,PACA_EXGEN+EX_R10(r13) | ||
330 | std r11,PACA_EXGEN+EX_R11(r13) | 358 | std r11,PACA_EXGEN+EX_R11(r13) |
331 | std r12,PACA_EXGEN+EX_R12(r13) | 359 | std r12,PACA_EXGEN+EX_R12(r13) |
332 | mfspr r9,SPRN_SPRG_HSCRATCH0 | 360 | mfspr r9,SPRN_SPRG_HSCRATCH0 |
@@ -367,10 +395,12 @@ denorm_exception_hv: | |||
367 | machine_check_pSeries: | 395 | machine_check_pSeries: |
368 | .globl machine_check_fwnmi | 396 | .globl machine_check_fwnmi |
369 | machine_check_fwnmi: | 397 | machine_check_fwnmi: |
370 | HMT_MEDIUM | 398 | HMT_MEDIUM_PPR_DISCARD |
371 | SET_SCRATCH0(r13) /* save r13 */ | 399 | SET_SCRATCH0(r13) /* save r13 */ |
372 | EXCEPTION_PROLOG_PSERIES(PACA_EXMC, machine_check_common, | 400 | EXCEPTION_PROLOG_0(PACA_EXMC) |
373 | EXC_STD, KVMTEST, 0x200) | 401 | machine_check_pSeries_0: |
402 | EXCEPTION_PROLOG_1(PACA_EXMC, KVMTEST, 0x200) | ||
403 | EXCEPTION_PROLOG_PSERIES_1(machine_check_common, EXC_STD) | ||
374 | KVM_HANDLER_SKIP(PACA_EXMC, EXC_STD, 0x200) | 404 | KVM_HANDLER_SKIP(PACA_EXMC, EXC_STD, 0x200) |
375 | 405 | ||
376 | /* moved from 0x300 */ | 406 | /* moved from 0x300 */ |
@@ -496,6 +526,7 @@ ALT_FTR_SECTION_END_IFCLR(CPU_FTR_ARCH_206) | |||
496 | mtspr SPRN_HSRR0,r11 | 526 | mtspr SPRN_HSRR0,r11 |
497 | mtcrf 0x80,r9 | 527 | mtcrf 0x80,r9 |
498 | ld r9,PACA_EXGEN+EX_R9(r13) | 528 | ld r9,PACA_EXGEN+EX_R9(r13) |
529 | RESTORE_PPR_PACA(PACA_EXGEN, r10) | ||
499 | ld r10,PACA_EXGEN+EX_R10(r13) | 530 | ld r10,PACA_EXGEN+EX_R10(r13) |
500 | ld r11,PACA_EXGEN+EX_R11(r13) | 531 | ld r11,PACA_EXGEN+EX_R11(r13) |
501 | ld r12,PACA_EXGEN+EX_R12(r13) | 532 | ld r12,PACA_EXGEN+EX_R12(r13) |
@@ -506,28 +537,34 @@ ALT_FTR_SECTION_END_IFCLR(CPU_FTR_ARCH_206) | |||
506 | 537 | ||
507 | .align 7 | 538 | .align 7 |
508 | /* moved from 0xe00 */ | 539 | /* moved from 0xe00 */ |
509 | STD_EXCEPTION_HV(., 0xe02, h_data_storage) | 540 | STD_EXCEPTION_HV_OOL(0xe02, h_data_storage) |
510 | KVM_HANDLER_SKIP(PACA_EXGEN, EXC_HV, 0xe02) | 541 | KVM_HANDLER_SKIP(PACA_EXGEN, EXC_HV, 0xe02) |
511 | STD_EXCEPTION_HV(., 0xe22, h_instr_storage) | 542 | STD_EXCEPTION_HV_OOL(0xe22, h_instr_storage) |
512 | KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe22) | 543 | KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe22) |
513 | STD_EXCEPTION_HV(., 0xe42, emulation_assist) | 544 | STD_EXCEPTION_HV_OOL(0xe42, emulation_assist) |
514 | KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe42) | 545 | KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe42) |
515 | STD_EXCEPTION_HV(., 0xe62, hmi_exception) /* need to flush cache ? */ | 546 | STD_EXCEPTION_HV_OOL(0xe62, hmi_exception) /* need to flush cache ? */ |
516 | KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe62) | 547 | KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe62) |
548 | MASKABLE_EXCEPTION_HV_OOL(0xe82, h_doorbell) | ||
549 | KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe82) | ||
517 | 550 | ||
518 | /* moved from 0xf00 */ | 551 | /* moved from 0xf00 */ |
519 | STD_EXCEPTION_PSERIES(., 0xf00, performance_monitor) | 552 | STD_EXCEPTION_PSERIES_OOL(0xf00, performance_monitor) |
520 | KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xf00) | 553 | KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xf00) |
521 | STD_EXCEPTION_PSERIES(., 0xf20, altivec_unavailable) | 554 | STD_EXCEPTION_PSERIES_OOL(0xf20, altivec_unavailable) |
522 | KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xf20) | 555 | KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xf20) |
523 | STD_EXCEPTION_PSERIES(., 0xf40, vsx_unavailable) | 556 | STD_EXCEPTION_PSERIES_OOL(0xf40, vsx_unavailable) |
524 | KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xf40) | 557 | KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xf40) |
558 | STD_EXCEPTION_PSERIES_OOL(0xf60, tm_unavailable) | ||
559 | KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xf60) | ||
525 | 560 | ||
526 | /* | 561 | /* |
527 | * An interrupt came in while soft-disabled. We set paca->irq_happened, | 562 | * An interrupt came in while soft-disabled. We set paca->irq_happened, then: |
528 | * then, if it was a decrementer interrupt, we bump the dec to max and | 563 | * - If it was a decrementer interrupt, we bump the dec to max and and return. |
529 | * and return, else we hard disable and return. This is called with | 564 | * - If it was a doorbell we return immediately since doorbells are edge |
530 | * r10 containing the value to OR to the paca field. | 565 | * triggered and won't automatically refire. |
566 | * - else we hard disable and return. | ||
567 | * This is called with r10 containing the value to OR to the paca field. | ||
531 | */ | 568 | */ |
532 | #define MASKED_INTERRUPT(_H) \ | 569 | #define MASKED_INTERRUPT(_H) \ |
533 | masked_##_H##interrupt: \ | 570 | masked_##_H##interrupt: \ |
@@ -535,13 +572,15 @@ masked_##_H##interrupt: \ | |||
535 | lbz r11,PACAIRQHAPPENED(r13); \ | 572 | lbz r11,PACAIRQHAPPENED(r13); \ |
536 | or r11,r11,r10; \ | 573 | or r11,r11,r10; \ |
537 | stb r11,PACAIRQHAPPENED(r13); \ | 574 | stb r11,PACAIRQHAPPENED(r13); \ |
538 | andi. r10,r10,PACA_IRQ_DEC; \ | 575 | cmpwi r10,PACA_IRQ_DEC; \ |
539 | beq 1f; \ | 576 | bne 1f; \ |
540 | lis r10,0x7fff; \ | 577 | lis r10,0x7fff; \ |
541 | ori r10,r10,0xffff; \ | 578 | ori r10,r10,0xffff; \ |
542 | mtspr SPRN_DEC,r10; \ | 579 | mtspr SPRN_DEC,r10; \ |
543 | b 2f; \ | 580 | b 2f; \ |
544 | 1: mfspr r10,SPRN_##_H##SRR1; \ | 581 | 1: cmpwi r10,PACA_IRQ_DBELL; \ |
582 | beq 2f; \ | ||
583 | mfspr r10,SPRN_##_H##SRR1; \ | ||
545 | rldicl r10,r10,48,1; /* clear MSR_EE */ \ | 584 | rldicl r10,r10,48,1; /* clear MSR_EE */ \ |
546 | rotldi r10,r10,16; \ | 585 | rotldi r10,r10,16; \ |
547 | mtspr SPRN_##_H##SRR1,r10; \ | 586 | mtspr SPRN_##_H##SRR1,r10; \ |
@@ -558,8 +597,8 @@ masked_##_H##interrupt: \ | |||
558 | 597 | ||
559 | /* | 598 | /* |
560 | * Called from arch_local_irq_enable when an interrupt needs | 599 | * Called from arch_local_irq_enable when an interrupt needs |
561 | * to be resent. r3 contains 0x500 or 0x900 to indicate which | 600 | * to be resent. r3 contains 0x500, 0x900, 0xa00 or 0xe80 to indicate |
562 | * kind of interrupt. MSR:EE is already off. We generate a | 601 | * which kind of interrupt. MSR:EE is already off. We generate a |
563 | * stackframe like if a real interrupt had happened. | 602 | * stackframe like if a real interrupt had happened. |
564 | * | 603 | * |
565 | * Note: While MSR:EE is off, we need to make sure that _MSR | 604 | * Note: While MSR:EE is off, we need to make sure that _MSR |
@@ -575,9 +614,18 @@ _GLOBAL(__replay_interrupt) | |||
575 | mflr r11 | 614 | mflr r11 |
576 | mfcr r9 | 615 | mfcr r9 |
577 | ori r12,r12,MSR_EE | 616 | ori r12,r12,MSR_EE |
578 | andi. r3,r3,0x0800 | 617 | cmpwi r3,0x900 |
579 | bne decrementer_common | 618 | beq decrementer_common |
580 | b hardware_interrupt_common | 619 | cmpwi r3,0x500 |
620 | beq hardware_interrupt_common | ||
621 | BEGIN_FTR_SECTION | ||
622 | cmpwi r3,0xe80 | ||
623 | beq h_doorbell_common | ||
624 | FTR_SECTION_ELSE | ||
625 | cmpwi r3,0xa00 | ||
626 | beq doorbell_super_common | ||
627 | ALT_FTR_SECTION_END_IFSET(CPU_FTR_HVMODE) | ||
628 | blr | ||
581 | 629 | ||
582 | #ifdef CONFIG_PPC_PSERIES | 630 | #ifdef CONFIG_PPC_PSERIES |
583 | /* | 631 | /* |
@@ -586,7 +634,7 @@ _GLOBAL(__replay_interrupt) | |||
586 | .globl system_reset_fwnmi | 634 | .globl system_reset_fwnmi |
587 | .align 7 | 635 | .align 7 |
588 | system_reset_fwnmi: | 636 | system_reset_fwnmi: |
589 | HMT_MEDIUM | 637 | HMT_MEDIUM_PPR_DISCARD |
590 | SET_SCRATCH0(r13) /* save r13 */ | 638 | SET_SCRATCH0(r13) /* save r13 */ |
591 | EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, system_reset_common, EXC_STD, | 639 | EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, system_reset_common, EXC_STD, |
592 | NOTEST, 0x100) | 640 | NOTEST, 0x100) |
@@ -651,12 +699,21 @@ machine_check_common: | |||
651 | STD_EXCEPTION_COMMON_ASYNC(0x500, hardware_interrupt, do_IRQ) | 699 | STD_EXCEPTION_COMMON_ASYNC(0x500, hardware_interrupt, do_IRQ) |
652 | STD_EXCEPTION_COMMON_ASYNC(0x900, decrementer, .timer_interrupt) | 700 | STD_EXCEPTION_COMMON_ASYNC(0x900, decrementer, .timer_interrupt) |
653 | STD_EXCEPTION_COMMON(0x980, hdecrementer, .hdec_interrupt) | 701 | STD_EXCEPTION_COMMON(0x980, hdecrementer, .hdec_interrupt) |
654 | STD_EXCEPTION_COMMON(0xa00, trap_0a, .unknown_exception) | 702 | #ifdef CONFIG_PPC_DOORBELL |
703 | STD_EXCEPTION_COMMON_ASYNC(0xa00, doorbell_super, .doorbell_exception) | ||
704 | #else | ||
705 | STD_EXCEPTION_COMMON_ASYNC(0xa00, doorbell_super, .unknown_exception) | ||
706 | #endif | ||
655 | STD_EXCEPTION_COMMON(0xb00, trap_0b, .unknown_exception) | 707 | STD_EXCEPTION_COMMON(0xb00, trap_0b, .unknown_exception) |
656 | STD_EXCEPTION_COMMON(0xd00, single_step, .single_step_exception) | 708 | STD_EXCEPTION_COMMON(0xd00, single_step, .single_step_exception) |
657 | STD_EXCEPTION_COMMON(0xe00, trap_0e, .unknown_exception) | 709 | STD_EXCEPTION_COMMON(0xe00, trap_0e, .unknown_exception) |
658 | STD_EXCEPTION_COMMON(0xe40, emulation_assist, .program_check_exception) | 710 | STD_EXCEPTION_COMMON(0xe40, emulation_assist, .program_check_exception) |
659 | STD_EXCEPTION_COMMON(0xe60, hmi_exception, .unknown_exception) | 711 | STD_EXCEPTION_COMMON(0xe60, hmi_exception, .unknown_exception) |
712 | #ifdef CONFIG_PPC_DOORBELL | ||
713 | STD_EXCEPTION_COMMON_ASYNC(0xe80, h_doorbell, .doorbell_exception) | ||
714 | #else | ||
715 | STD_EXCEPTION_COMMON_ASYNC(0xe80, h_doorbell, .unknown_exception) | ||
716 | #endif | ||
660 | STD_EXCEPTION_COMMON_ASYNC(0xf00, performance_monitor, .performance_monitor_exception) | 717 | STD_EXCEPTION_COMMON_ASYNC(0xf00, performance_monitor, .performance_monitor_exception) |
661 | STD_EXCEPTION_COMMON(0x1300, instruction_breakpoint, .instruction_breakpoint_exception) | 718 | STD_EXCEPTION_COMMON(0x1300, instruction_breakpoint, .instruction_breakpoint_exception) |
662 | STD_EXCEPTION_COMMON(0x1502, denorm, .unknown_exception) | 719 | STD_EXCEPTION_COMMON(0x1502, denorm, .unknown_exception) |
@@ -690,8 +747,8 @@ machine_check_common: | |||
690 | . = 0x4380 | 747 | . = 0x4380 |
691 | .globl data_access_slb_relon_pSeries | 748 | .globl data_access_slb_relon_pSeries |
692 | data_access_slb_relon_pSeries: | 749 | data_access_slb_relon_pSeries: |
693 | HMT_MEDIUM | ||
694 | SET_SCRATCH0(r13) | 750 | SET_SCRATCH0(r13) |
751 | EXCEPTION_PROLOG_0(PACA_EXSLB) | ||
695 | EXCEPTION_PROLOG_1(PACA_EXSLB, NOTEST, 0x380) | 752 | EXCEPTION_PROLOG_1(PACA_EXSLB, NOTEST, 0x380) |
696 | std r3,PACA_EXSLB+EX_R3(r13) | 753 | std r3,PACA_EXSLB+EX_R3(r13) |
697 | mfspr r3,SPRN_DAR | 754 | mfspr r3,SPRN_DAR |
@@ -715,8 +772,8 @@ data_access_slb_relon_pSeries: | |||
715 | . = 0x4480 | 772 | . = 0x4480 |
716 | .globl instruction_access_slb_relon_pSeries | 773 | .globl instruction_access_slb_relon_pSeries |
717 | instruction_access_slb_relon_pSeries: | 774 | instruction_access_slb_relon_pSeries: |
718 | HMT_MEDIUM | ||
719 | SET_SCRATCH0(r13) | 775 | SET_SCRATCH0(r13) |
776 | EXCEPTION_PROLOG_0(PACA_EXSLB) | ||
720 | EXCEPTION_PROLOG_1(PACA_EXSLB, NOTEST, 0x480) | 777 | EXCEPTION_PROLOG_1(PACA_EXSLB, NOTEST, 0x480) |
721 | std r3,PACA_EXSLB+EX_R3(r13) | 778 | std r3,PACA_EXSLB+EX_R3(r13) |
722 | mfspr r3,SPRN_SRR0 /* SRR0 is faulting address */ | 779 | mfspr r3,SPRN_SRR0 /* SRR0 is faulting address */ |
@@ -746,6 +803,7 @@ hardware_interrupt_relon_hv: | |||
746 | STD_RELON_EXCEPTION_PSERIES(0x4800, 0x800, fp_unavailable) | 803 | STD_RELON_EXCEPTION_PSERIES(0x4800, 0x800, fp_unavailable) |
747 | MASKABLE_RELON_EXCEPTION_PSERIES(0x4900, 0x900, decrementer) | 804 | MASKABLE_RELON_EXCEPTION_PSERIES(0x4900, 0x900, decrementer) |
748 | STD_RELON_EXCEPTION_HV(0x4980, 0x982, hdecrementer) | 805 | STD_RELON_EXCEPTION_HV(0x4980, 0x982, hdecrementer) |
806 | MASKABLE_RELON_EXCEPTION_PSERIES(0x4a00, 0xa00, doorbell_super) | ||
749 | STD_RELON_EXCEPTION_PSERIES(0x4b00, 0xb00, trap_0b) | 807 | STD_RELON_EXCEPTION_PSERIES(0x4b00, 0xb00, trap_0b) |
750 | 808 | ||
751 | . = 0x4c00 | 809 | . = 0x4c00 |
@@ -759,56 +817,64 @@ system_call_relon_pSeries: | |||
759 | STD_RELON_EXCEPTION_PSERIES(0x4d00, 0xd00, single_step) | 817 | STD_RELON_EXCEPTION_PSERIES(0x4d00, 0xd00, single_step) |
760 | 818 | ||
761 | . = 0x4e00 | 819 | . = 0x4e00 |
820 | SET_SCRATCH0(r13) | ||
821 | EXCEPTION_PROLOG_0(PACA_EXGEN) | ||
762 | b h_data_storage_relon_hv | 822 | b h_data_storage_relon_hv |
763 | 823 | ||
764 | . = 0x4e20 | 824 | . = 0x4e20 |
825 | SET_SCRATCH0(r13) | ||
826 | EXCEPTION_PROLOG_0(PACA_EXGEN) | ||
765 | b h_instr_storage_relon_hv | 827 | b h_instr_storage_relon_hv |
766 | 828 | ||
767 | . = 0x4e40 | 829 | . = 0x4e40 |
830 | SET_SCRATCH0(r13) | ||
831 | EXCEPTION_PROLOG_0(PACA_EXGEN) | ||
768 | b emulation_assist_relon_hv | 832 | b emulation_assist_relon_hv |
769 | 833 | ||
770 | . = 0x4e50 | ||
771 | b hmi_exception_relon_hv | ||
772 | |||
773 | . = 0x4e60 | 834 | . = 0x4e60 |
835 | SET_SCRATCH0(r13) | ||
836 | EXCEPTION_PROLOG_0(PACA_EXGEN) | ||
774 | b hmi_exception_relon_hv | 837 | b hmi_exception_relon_hv |
775 | 838 | ||
776 | /* For when we support the doorbell interrupt: | 839 | . = 0x4e80 |
777 | STD_RELON_EXCEPTION_HYPERVISOR(0x4e80, 0xe80, doorbell_hyper) | 840 | SET_SCRATCH0(r13) |
778 | */ | 841 | EXCEPTION_PROLOG_0(PACA_EXGEN) |
842 | b h_doorbell_relon_hv | ||
779 | 843 | ||
780 | performance_monitor_relon_pSeries_1: | 844 | performance_monitor_relon_pSeries_1: |
781 | . = 0x4f00 | 845 | . = 0x4f00 |
846 | SET_SCRATCH0(r13) | ||
847 | EXCEPTION_PROLOG_0(PACA_EXGEN) | ||
782 | b performance_monitor_relon_pSeries | 848 | b performance_monitor_relon_pSeries |
783 | 849 | ||
784 | altivec_unavailable_relon_pSeries_1: | 850 | altivec_unavailable_relon_pSeries_1: |
785 | . = 0x4f20 | 851 | . = 0x4f20 |
852 | SET_SCRATCH0(r13) | ||
853 | EXCEPTION_PROLOG_0(PACA_EXGEN) | ||
786 | b altivec_unavailable_relon_pSeries | 854 | b altivec_unavailable_relon_pSeries |
787 | 855 | ||
788 | vsx_unavailable_relon_pSeries_1: | 856 | vsx_unavailable_relon_pSeries_1: |
789 | . = 0x4f40 | 857 | . = 0x4f40 |
858 | SET_SCRATCH0(r13) | ||
859 | EXCEPTION_PROLOG_0(PACA_EXGEN) | ||
790 | b vsx_unavailable_relon_pSeries | 860 | b vsx_unavailable_relon_pSeries |
791 | 861 | ||
792 | #ifdef CONFIG_CBE_RAS | 862 | tm_unavailable_relon_pSeries_1: |
793 | STD_RELON_EXCEPTION_HV(0x5200, 0x1202, cbe_system_error) | 863 | . = 0x4f60 |
794 | #endif /* CONFIG_CBE_RAS */ | 864 | SET_SCRATCH0(r13) |
865 | EXCEPTION_PROLOG_0(PACA_EXGEN) | ||
866 | b tm_unavailable_relon_pSeries | ||
867 | |||
795 | STD_RELON_EXCEPTION_PSERIES(0x5300, 0x1300, instruction_breakpoint) | 868 | STD_RELON_EXCEPTION_PSERIES(0x5300, 0x1300, instruction_breakpoint) |
796 | #ifdef CONFIG_PPC_DENORMALISATION | 869 | #ifdef CONFIG_PPC_DENORMALISATION |
797 | . = 0x5500 | 870 | . = 0x5500 |
798 | b denorm_exception_hv | 871 | b denorm_exception_hv |
799 | #endif | 872 | #endif |
800 | #ifdef CONFIG_CBE_RAS | ||
801 | STD_RELON_EXCEPTION_HV(0x5600, 0x1602, cbe_maintenance) | ||
802 | #else | ||
803 | #ifdef CONFIG_HVC_SCOM | 873 | #ifdef CONFIG_HVC_SCOM |
804 | STD_RELON_EXCEPTION_HV(0x5600, 0x1600, maintence_interrupt) | 874 | STD_RELON_EXCEPTION_HV(0x5600, 0x1600, maintence_interrupt) |
805 | KVM_HANDLER_SKIP(PACA_EXGEN, EXC_HV, 0x1600) | 875 | KVM_HANDLER_SKIP(PACA_EXGEN, EXC_HV, 0x1600) |
806 | #endif /* CONFIG_HVC_SCOM */ | 876 | #endif /* CONFIG_HVC_SCOM */ |
807 | #endif /* CONFIG_CBE_RAS */ | ||
808 | STD_RELON_EXCEPTION_PSERIES(0x5700, 0x1700, altivec_assist) | 877 | STD_RELON_EXCEPTION_PSERIES(0x5700, 0x1700, altivec_assist) |
809 | #ifdef CONFIG_CBE_RAS | ||
810 | STD_RELON_EXCEPTION_HV(0x5800, 0x1802, cbe_thermal) | ||
811 | #endif /* CONFIG_CBE_RAS */ | ||
812 | 878 | ||
813 | /* Other future vectors */ | 879 | /* Other future vectors */ |
814 | .align 7 | 880 | .align 7 |
@@ -1036,6 +1102,7 @@ _GLOBAL(slb_miss_realmode) | |||
1036 | mtcrf 0x01,r9 /* slb_allocate uses cr0 and cr7 */ | 1102 | mtcrf 0x01,r9 /* slb_allocate uses cr0 and cr7 */ |
1037 | .machine pop | 1103 | .machine pop |
1038 | 1104 | ||
1105 | RESTORE_PPR_PACA(PACA_EXSLB, r9) | ||
1039 | ld r9,PACA_EXSLB+EX_R9(r13) | 1106 | ld r9,PACA_EXSLB+EX_R9(r13) |
1040 | ld r10,PACA_EXSLB+EX_R10(r13) | 1107 | ld r10,PACA_EXSLB+EX_R10(r13) |
1041 | ld r11,PACA_EXSLB+EX_R11(r13) | 1108 | ld r11,PACA_EXSLB+EX_R11(r13) |
@@ -1109,9 +1176,26 @@ fp_unavailable_common: | |||
1109 | addi r3,r1,STACK_FRAME_OVERHEAD | 1176 | addi r3,r1,STACK_FRAME_OVERHEAD |
1110 | bl .kernel_fp_unavailable_exception | 1177 | bl .kernel_fp_unavailable_exception |
1111 | BUG_OPCODE | 1178 | BUG_OPCODE |
1112 | 1: bl .load_up_fpu | 1179 | 1: |
1180 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | ||
1181 | BEGIN_FTR_SECTION | ||
1182 | /* Test if 2 TM state bits are zero. If non-zero (ie. userspace was in | ||
1183 | * transaction), go do TM stuff | ||
1184 | */ | ||
1185 | rldicl. r0, r12, (64-MSR_TS_LG), (64-2) | ||
1186 | bne- 2f | ||
1187 | END_FTR_SECTION_IFSET(CPU_FTR_TM) | ||
1188 | #endif | ||
1189 | bl .load_up_fpu | ||
1113 | b fast_exception_return | 1190 | b fast_exception_return |
1114 | 1191 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | |
1192 | 2: /* User process was in a transaction */ | ||
1193 | bl .save_nvgprs | ||
1194 | DISABLE_INTS | ||
1195 | addi r3,r1,STACK_FRAME_OVERHEAD | ||
1196 | bl .fp_unavailable_tm | ||
1197 | b .ret_from_except | ||
1198 | #endif | ||
1115 | .align 7 | 1199 | .align 7 |
1116 | .globl altivec_unavailable_common | 1200 | .globl altivec_unavailable_common |
1117 | altivec_unavailable_common: | 1201 | altivec_unavailable_common: |
@@ -1119,8 +1203,25 @@ altivec_unavailable_common: | |||
1119 | #ifdef CONFIG_ALTIVEC | 1203 | #ifdef CONFIG_ALTIVEC |
1120 | BEGIN_FTR_SECTION | 1204 | BEGIN_FTR_SECTION |
1121 | beq 1f | 1205 | beq 1f |
1206 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | ||
1207 | BEGIN_FTR_SECTION_NESTED(69) | ||
1208 | /* Test if 2 TM state bits are zero. If non-zero (ie. userspace was in | ||
1209 | * transaction), go do TM stuff | ||
1210 | */ | ||
1211 | rldicl. r0, r12, (64-MSR_TS_LG), (64-2) | ||
1212 | bne- 2f | ||
1213 | END_FTR_SECTION_NESTED(CPU_FTR_TM, CPU_FTR_TM, 69) | ||
1214 | #endif | ||
1122 | bl .load_up_altivec | 1215 | bl .load_up_altivec |
1123 | b fast_exception_return | 1216 | b fast_exception_return |
1217 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | ||
1218 | 2: /* User process was in a transaction */ | ||
1219 | bl .save_nvgprs | ||
1220 | DISABLE_INTS | ||
1221 | addi r3,r1,STACK_FRAME_OVERHEAD | ||
1222 | bl .altivec_unavailable_tm | ||
1223 | b .ret_from_except | ||
1224 | #endif | ||
1124 | 1: | 1225 | 1: |
1125 | END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC) | 1226 | END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC) |
1126 | #endif | 1227 | #endif |
@@ -1137,7 +1238,24 @@ vsx_unavailable_common: | |||
1137 | #ifdef CONFIG_VSX | 1238 | #ifdef CONFIG_VSX |
1138 | BEGIN_FTR_SECTION | 1239 | BEGIN_FTR_SECTION |
1139 | beq 1f | 1240 | beq 1f |
1241 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | ||
1242 | BEGIN_FTR_SECTION_NESTED(69) | ||
1243 | /* Test if 2 TM state bits are zero. If non-zero (ie. userspace was in | ||
1244 | * transaction), go do TM stuff | ||
1245 | */ | ||
1246 | rldicl. r0, r12, (64-MSR_TS_LG), (64-2) | ||
1247 | bne- 2f | ||
1248 | END_FTR_SECTION_NESTED(CPU_FTR_TM, CPU_FTR_TM, 69) | ||
1249 | #endif | ||
1140 | b .load_up_vsx | 1250 | b .load_up_vsx |
1251 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | ||
1252 | 2: /* User process was in a transaction */ | ||
1253 | bl .save_nvgprs | ||
1254 | DISABLE_INTS | ||
1255 | addi r3,r1,STACK_FRAME_OVERHEAD | ||
1256 | bl .vsx_unavailable_tm | ||
1257 | b .ret_from_except | ||
1258 | #endif | ||
1141 | 1: | 1259 | 1: |
1142 | END_FTR_SECTION_IFSET(CPU_FTR_VSX) | 1260 | END_FTR_SECTION_IFSET(CPU_FTR_VSX) |
1143 | #endif | 1261 | #endif |
@@ -1148,9 +1266,75 @@ END_FTR_SECTION_IFSET(CPU_FTR_VSX) | |||
1148 | b .ret_from_except | 1266 | b .ret_from_except |
1149 | 1267 | ||
1150 | .align 7 | 1268 | .align 7 |
1269 | .globl tm_unavailable_common | ||
1270 | tm_unavailable_common: | ||
1271 | EXCEPTION_PROLOG_COMMON(0xf60, PACA_EXGEN) | ||
1272 | bl .save_nvgprs | ||
1273 | DISABLE_INTS | ||
1274 | addi r3,r1,STACK_FRAME_OVERHEAD | ||
1275 | bl .tm_unavailable_exception | ||
1276 | b .ret_from_except | ||
1277 | |||
1278 | .align 7 | ||
1151 | .globl __end_handlers | 1279 | .globl __end_handlers |
1152 | __end_handlers: | 1280 | __end_handlers: |
1153 | 1281 | ||
1282 | /* Equivalents to the above handlers for relocation-on interrupt vectors */ | ||
1283 | STD_RELON_EXCEPTION_HV_OOL(0xe00, h_data_storage) | ||
1284 | KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe00) | ||
1285 | STD_RELON_EXCEPTION_HV_OOL(0xe20, h_instr_storage) | ||
1286 | KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe20) | ||
1287 | STD_RELON_EXCEPTION_HV_OOL(0xe40, emulation_assist) | ||
1288 | KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe40) | ||
1289 | STD_RELON_EXCEPTION_HV_OOL(0xe60, hmi_exception) | ||
1290 | KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe60) | ||
1291 | MASKABLE_RELON_EXCEPTION_HV_OOL(0xe80, h_doorbell) | ||
1292 | KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe80) | ||
1293 | |||
1294 | STD_RELON_EXCEPTION_PSERIES_OOL(0xf00, performance_monitor) | ||
1295 | STD_RELON_EXCEPTION_PSERIES_OOL(0xf20, altivec_unavailable) | ||
1296 | STD_RELON_EXCEPTION_PSERIES_OOL(0xf40, vsx_unavailable) | ||
1297 | STD_RELON_EXCEPTION_PSERIES_OOL(0xf60, tm_unavailable) | ||
1298 | |||
1299 | #if defined(CONFIG_PPC_PSERIES) || defined(CONFIG_PPC_POWERNV) | ||
1300 | /* | ||
1301 | * Data area reserved for FWNMI option. | ||
1302 | * This address (0x7000) is fixed by the RPA. | ||
1303 | */ | ||
1304 | .= 0x7000 | ||
1305 | .globl fwnmi_data_area | ||
1306 | fwnmi_data_area: | ||
1307 | |||
1308 | /* pseries and powernv need to keep the whole page from | ||
1309 | * 0x7000 to 0x8000 free for use by the firmware | ||
1310 | */ | ||
1311 | . = 0x8000 | ||
1312 | #endif /* defined(CONFIG_PPC_PSERIES) || defined(CONFIG_PPC_POWERNV) */ | ||
1313 | |||
1314 | /* Space for CPU0's segment table */ | ||
1315 | .balign 4096 | ||
1316 | .globl initial_stab | ||
1317 | initial_stab: | ||
1318 | .space 4096 | ||
1319 | |||
1320 | #ifdef CONFIG_PPC_POWERNV | ||
1321 | _GLOBAL(opal_mc_secondary_handler) | ||
1322 | HMT_MEDIUM_PPR_DISCARD | ||
1323 | SET_SCRATCH0(r13) | ||
1324 | GET_PACA(r13) | ||
1325 | clrldi r3,r3,2 | ||
1326 | tovirt(r3,r3) | ||
1327 | std r3,PACA_OPAL_MC_EVT(r13) | ||
1328 | ld r13,OPAL_MC_SRR0(r3) | ||
1329 | mtspr SPRN_SRR0,r13 | ||
1330 | ld r13,OPAL_MC_SRR1(r3) | ||
1331 | mtspr SPRN_SRR1,r13 | ||
1332 | ld r3,OPAL_MC_GPR3(r3) | ||
1333 | GET_SCRATCH0(r13) | ||
1334 | b machine_check_pSeries | ||
1335 | #endif /* CONFIG_PPC_POWERNV */ | ||
1336 | |||
1337 | |||
1154 | /* | 1338 | /* |
1155 | * Hash table stuff | 1339 | * Hash table stuff |
1156 | */ | 1340 | */ |
@@ -1222,7 +1406,7 @@ handle_dabr_fault: | |||
1222 | ld r4,_DAR(r1) | 1406 | ld r4,_DAR(r1) |
1223 | ld r5,_DSISR(r1) | 1407 | ld r5,_DSISR(r1) |
1224 | addi r3,r1,STACK_FRAME_OVERHEAD | 1408 | addi r3,r1,STACK_FRAME_OVERHEAD |
1225 | bl .do_dabr | 1409 | bl .do_break |
1226 | 12: b .ret_from_except_lite | 1410 | 12: b .ret_from_except_lite |
1227 | 1411 | ||
1228 | 1412 | ||
@@ -1344,56 +1528,3 @@ _GLOBAL(do_stab_bolted) | |||
1344 | ld r13,PACA_EXSLB+EX_R13(r13) | 1528 | ld r13,PACA_EXSLB+EX_R13(r13) |
1345 | rfid | 1529 | rfid |
1346 | b . /* prevent speculative execution */ | 1530 | b . /* prevent speculative execution */ |
1347 | |||
1348 | |||
1349 | /* Equivalents to the above handlers for relocation-on interrupt vectors */ | ||
1350 | STD_RELON_EXCEPTION_HV(., 0xe00, h_data_storage) | ||
1351 | KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe00) | ||
1352 | STD_RELON_EXCEPTION_HV(., 0xe20, h_instr_storage) | ||
1353 | KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe20) | ||
1354 | STD_RELON_EXCEPTION_HV(., 0xe40, emulation_assist) | ||
1355 | KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe40) | ||
1356 | STD_RELON_EXCEPTION_HV(., 0xe60, hmi_exception) | ||
1357 | KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe60) | ||
1358 | |||
1359 | STD_RELON_EXCEPTION_PSERIES(., 0xf00, performance_monitor) | ||
1360 | STD_RELON_EXCEPTION_PSERIES(., 0xf20, altivec_unavailable) | ||
1361 | STD_RELON_EXCEPTION_PSERIES(., 0xf40, vsx_unavailable) | ||
1362 | |||
1363 | #if defined(CONFIG_PPC_PSERIES) || defined(CONFIG_PPC_POWERNV) | ||
1364 | /* | ||
1365 | * Data area reserved for FWNMI option. | ||
1366 | * This address (0x7000) is fixed by the RPA. | ||
1367 | */ | ||
1368 | .= 0x7000 | ||
1369 | .globl fwnmi_data_area | ||
1370 | fwnmi_data_area: | ||
1371 | |||
1372 | /* pseries and powernv need to keep the whole page from | ||
1373 | * 0x7000 to 0x8000 free for use by the firmware | ||
1374 | */ | ||
1375 | . = 0x8000 | ||
1376 | #endif /* defined(CONFIG_PPC_PSERIES) || defined(CONFIG_PPC_POWERNV) */ | ||
1377 | |||
1378 | /* Space for CPU0's segment table */ | ||
1379 | .balign 4096 | ||
1380 | .globl initial_stab | ||
1381 | initial_stab: | ||
1382 | .space 4096 | ||
1383 | |||
1384 | #ifdef CONFIG_PPC_POWERNV | ||
1385 | _GLOBAL(opal_mc_secondary_handler) | ||
1386 | HMT_MEDIUM | ||
1387 | SET_SCRATCH0(r13) | ||
1388 | GET_PACA(r13) | ||
1389 | clrldi r3,r3,2 | ||
1390 | tovirt(r3,r3) | ||
1391 | std r3,PACA_OPAL_MC_EVT(r13) | ||
1392 | ld r13,OPAL_MC_SRR0(r3) | ||
1393 | mtspr SPRN_SRR0,r13 | ||
1394 | ld r13,OPAL_MC_SRR1(r3) | ||
1395 | mtspr SPRN_SRR1,r13 | ||
1396 | ld r3,OPAL_MC_GPR3(r3) | ||
1397 | GET_SCRATCH0(r13) | ||
1398 | b machine_check_pSeries | ||
1399 | #endif /* CONFIG_PPC_POWERNV */ | ||
diff --git a/arch/powerpc/kernel/fpu.S b/arch/powerpc/kernel/fpu.S index e0ada05f2df3..caeaabf11a2f 100644 --- a/arch/powerpc/kernel/fpu.S +++ b/arch/powerpc/kernel/fpu.S | |||
@@ -35,6 +35,15 @@ END_FTR_SECTION_IFSET(CPU_FTR_VSX); \ | |||
35 | 2: REST_32VSRS(n,c,base); \ | 35 | 2: REST_32VSRS(n,c,base); \ |
36 | 3: | 36 | 3: |
37 | 37 | ||
38 | #define __REST_32FPVSRS_TRANSACT(n,c,base) \ | ||
39 | BEGIN_FTR_SECTION \ | ||
40 | b 2f; \ | ||
41 | END_FTR_SECTION_IFSET(CPU_FTR_VSX); \ | ||
42 | REST_32FPRS_TRANSACT(n,base); \ | ||
43 | b 3f; \ | ||
44 | 2: REST_32VSRS_TRANSACT(n,c,base); \ | ||
45 | 3: | ||
46 | |||
38 | #define __SAVE_32FPVSRS(n,c,base) \ | 47 | #define __SAVE_32FPVSRS(n,c,base) \ |
39 | BEGIN_FTR_SECTION \ | 48 | BEGIN_FTR_SECTION \ |
40 | b 2f; \ | 49 | b 2f; \ |
@@ -45,11 +54,68 @@ END_FTR_SECTION_IFSET(CPU_FTR_VSX); \ | |||
45 | 3: | 54 | 3: |
46 | #else | 55 | #else |
47 | #define __REST_32FPVSRS(n,b,base) REST_32FPRS(n, base) | 56 | #define __REST_32FPVSRS(n,b,base) REST_32FPRS(n, base) |
57 | #define __REST_32FPVSRS_TRANSACT(n,b,base) REST_32FPRS(n, base) | ||
48 | #define __SAVE_32FPVSRS(n,b,base) SAVE_32FPRS(n, base) | 58 | #define __SAVE_32FPVSRS(n,b,base) SAVE_32FPRS(n, base) |
49 | #endif | 59 | #endif |
50 | #define REST_32FPVSRS(n,c,base) __REST_32FPVSRS(n,__REG_##c,__REG_##base) | 60 | #define REST_32FPVSRS(n,c,base) __REST_32FPVSRS(n,__REG_##c,__REG_##base) |
61 | #define REST_32FPVSRS_TRANSACT(n,c,base) \ | ||
62 | __REST_32FPVSRS_TRANSACT(n,__REG_##c,__REG_##base) | ||
51 | #define SAVE_32FPVSRS(n,c,base) __SAVE_32FPVSRS(n,__REG_##c,__REG_##base) | 63 | #define SAVE_32FPVSRS(n,c,base) __SAVE_32FPVSRS(n,__REG_##c,__REG_##base) |
52 | 64 | ||
65 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | ||
66 | /* | ||
67 | * Wrapper to call load_up_fpu from C. | ||
68 | * void do_load_up_fpu(struct pt_regs *regs); | ||
69 | */ | ||
70 | _GLOBAL(do_load_up_fpu) | ||
71 | mflr r0 | ||
72 | std r0, 16(r1) | ||
73 | stdu r1, -112(r1) | ||
74 | |||
75 | subi r6, r3, STACK_FRAME_OVERHEAD | ||
76 | /* load_up_fpu expects r12=MSR, r13=PACA, and returns | ||
77 | * with r12 = new MSR. | ||
78 | */ | ||
79 | ld r12,_MSR(r6) | ||
80 | GET_PACA(r13) | ||
81 | |||
82 | bl load_up_fpu | ||
83 | std r12,_MSR(r6) | ||
84 | |||
85 | ld r0, 112+16(r1) | ||
86 | addi r1, r1, 112 | ||
87 | mtlr r0 | ||
88 | blr | ||
89 | |||
90 | |||
91 | /* void do_load_up_transact_fpu(struct thread_struct *thread) | ||
92 | * | ||
93 | * This is similar to load_up_fpu but for the transactional version of the FP | ||
94 | * register set. It doesn't mess with the task MSR or valid flags. | ||
95 | * Furthermore, we don't do lazy FP with TM currently. | ||
96 | */ | ||
97 | _GLOBAL(do_load_up_transact_fpu) | ||
98 | mfmsr r6 | ||
99 | ori r5,r6,MSR_FP | ||
100 | #ifdef CONFIG_VSX | ||
101 | BEGIN_FTR_SECTION | ||
102 | oris r5,r5,MSR_VSX@h | ||
103 | END_FTR_SECTION_IFSET(CPU_FTR_VSX) | ||
104 | #endif | ||
105 | SYNC | ||
106 | MTMSRD(r5) | ||
107 | |||
108 | lfd fr0,THREAD_TRANSACT_FPSCR(r3) | ||
109 | MTFSF_L(fr0) | ||
110 | REST_32FPVSRS_TRANSACT(0, R4, R3) | ||
111 | |||
112 | /* FP/VSX off again */ | ||
113 | MTMSRD(r6) | ||
114 | SYNC | ||
115 | |||
116 | blr | ||
117 | #endif /* CONFIG_PPC_TRANSACTIONAL_MEM */ | ||
118 | |||
53 | /* | 119 | /* |
54 | * This task wants to use the FPU now. | 120 | * This task wants to use the FPU now. |
55 | * On UP, disable FP for the task which had the FPU previously, | 121 | * On UP, disable FP for the task which had the FPU previously, |
diff --git a/arch/powerpc/kernel/head_40x.S b/arch/powerpc/kernel/head_40x.S index 4989661b710b..8a9b6f59822d 100644 --- a/arch/powerpc/kernel/head_40x.S +++ b/arch/powerpc/kernel/head_40x.S | |||
@@ -430,30 +430,18 @@ label: | |||
430 | EXCEPTION(0x0F00, Trap_0F, unknown_exception, EXC_XFER_EE) | 430 | EXCEPTION(0x0F00, Trap_0F, unknown_exception, EXC_XFER_EE) |
431 | 431 | ||
432 | /* 0x1000 - Programmable Interval Timer (PIT) Exception */ | 432 | /* 0x1000 - Programmable Interval Timer (PIT) Exception */ |
433 | START_EXCEPTION(0x1000, Decrementer) | 433 | . = 0x1000 |
434 | NORMAL_EXCEPTION_PROLOG | 434 | b Decrementer |
435 | lis r0,TSR_PIS@h | ||
436 | mtspr SPRN_TSR,r0 /* Clear the PIT exception */ | ||
437 | addi r3,r1,STACK_FRAME_OVERHEAD | ||
438 | EXC_XFER_LITE(0x1000, timer_interrupt) | ||
439 | |||
440 | #if 0 | ||
441 | /* NOTE: | ||
442 | * FIT and WDT handlers are not implemented yet. | ||
443 | */ | ||
444 | 435 | ||
445 | /* 0x1010 - Fixed Interval Timer (FIT) Exception | 436 | /* 0x1010 - Fixed Interval Timer (FIT) Exception |
446 | */ | 437 | */ |
447 | STND_EXCEPTION(0x1010, FITException, unknown_exception) | 438 | . = 0x1010 |
439 | b FITException | ||
448 | 440 | ||
449 | /* 0x1020 - Watchdog Timer (WDT) Exception | 441 | /* 0x1020 - Watchdog Timer (WDT) Exception |
450 | */ | 442 | */ |
451 | #ifdef CONFIG_BOOKE_WDT | 443 | . = 0x1020 |
452 | CRITICAL_EXCEPTION(0x1020, WDTException, WatchdogException) | 444 | b WDTException |
453 | #else | ||
454 | CRITICAL_EXCEPTION(0x1020, WDTException, unknown_exception) | ||
455 | #endif | ||
456 | #endif | ||
457 | 445 | ||
458 | /* 0x1100 - Data TLB Miss Exception | 446 | /* 0x1100 - Data TLB Miss Exception |
459 | * As the name implies, translation is not in the MMU, so search the | 447 | * As the name implies, translation is not in the MMU, so search the |
@@ -738,6 +726,29 @@ label: | |||
738 | (MSR_KERNEL & ~(MSR_ME|MSR_DE|MSR_CE)), \ | 726 | (MSR_KERNEL & ~(MSR_ME|MSR_DE|MSR_CE)), \ |
739 | NOCOPY, crit_transfer_to_handler, ret_from_crit_exc) | 727 | NOCOPY, crit_transfer_to_handler, ret_from_crit_exc) |
740 | 728 | ||
729 | /* Programmable Interval Timer (PIT) Exception. (from 0x1000) */ | ||
730 | Decrementer: | ||
731 | NORMAL_EXCEPTION_PROLOG | ||
732 | lis r0,TSR_PIS@h | ||
733 | mtspr SPRN_TSR,r0 /* Clear the PIT exception */ | ||
734 | addi r3,r1,STACK_FRAME_OVERHEAD | ||
735 | EXC_XFER_LITE(0x1000, timer_interrupt) | ||
736 | |||
737 | /* Fixed Interval Timer (FIT) Exception. (from 0x1010) */ | ||
738 | FITException: | ||
739 | NORMAL_EXCEPTION_PROLOG | ||
740 | addi r3,r1,STACK_FRAME_OVERHEAD; | ||
741 | EXC_XFER_EE(0x1010, unknown_exception) | ||
742 | |||
743 | /* Watchdog Timer (WDT) Exception. (from 0x1020) */ | ||
744 | WDTException: | ||
745 | CRITICAL_EXCEPTION_PROLOG; | ||
746 | addi r3,r1,STACK_FRAME_OVERHEAD; | ||
747 | EXC_XFER_TEMPLATE(WatchdogException, 0x1020+2, | ||
748 | (MSR_KERNEL & ~(MSR_ME|MSR_DE|MSR_CE)), | ||
749 | NOCOPY, crit_transfer_to_handler, | ||
750 | ret_from_crit_exc) | ||
751 | |||
741 | /* | 752 | /* |
742 | * The other Data TLB exceptions bail out to this point | 753 | * The other Data TLB exceptions bail out to this point |
743 | * if they can't resolve the lightweight TLB fault. | 754 | * if they can't resolve the lightweight TLB fault. |
diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S index 116f0868695b..0886ae6dd5be 100644 --- a/arch/powerpc/kernel/head_64.S +++ b/arch/powerpc/kernel/head_64.S | |||
@@ -122,6 +122,8 @@ __secondary_hold: | |||
122 | #endif | 122 | #endif |
123 | /* Grab our physical cpu number */ | 123 | /* Grab our physical cpu number */ |
124 | mr r24,r3 | 124 | mr r24,r3 |
125 | /* stash r4 for book3e */ | ||
126 | mr r25,r4 | ||
125 | 127 | ||
126 | /* Tell the master cpu we're here */ | 128 | /* Tell the master cpu we're here */ |
127 | /* Relocation is off & we are located at an address less */ | 129 | /* Relocation is off & we are located at an address less */ |
@@ -129,16 +131,31 @@ __secondary_hold: | |||
129 | std r24,__secondary_hold_acknowledge-_stext(0) | 131 | std r24,__secondary_hold_acknowledge-_stext(0) |
130 | sync | 132 | sync |
131 | 133 | ||
134 | li r26,0 | ||
135 | #ifdef CONFIG_PPC_BOOK3E | ||
136 | tovirt(r26,r26) | ||
137 | #endif | ||
132 | /* All secondary cpus wait here until told to start. */ | 138 | /* All secondary cpus wait here until told to start. */ |
133 | 100: ld r4,__secondary_hold_spinloop-_stext(0) | 139 | 100: ld r4,__secondary_hold_spinloop-_stext(r26) |
134 | cmpdi 0,r4,0 | 140 | cmpdi 0,r4,0 |
135 | beq 100b | 141 | beq 100b |
136 | 142 | ||
137 | #if defined(CONFIG_SMP) || defined(CONFIG_KEXEC) | 143 | #if defined(CONFIG_SMP) || defined(CONFIG_KEXEC) |
144 | #ifdef CONFIG_PPC_BOOK3E | ||
145 | tovirt(r4,r4) | ||
146 | #endif | ||
138 | ld r4,0(r4) /* deref function descriptor */ | 147 | ld r4,0(r4) /* deref function descriptor */ |
139 | mtctr r4 | 148 | mtctr r4 |
140 | mr r3,r24 | 149 | mr r3,r24 |
150 | /* | ||
151 | * it may be the case that other platforms have r4 right to | ||
152 | * begin with, this gives us some safety in case it is not | ||
153 | */ | ||
154 | #ifdef CONFIG_PPC_BOOK3E | ||
155 | mr r4,r25 | ||
156 | #else | ||
141 | li r4,0 | 157 | li r4,0 |
158 | #endif | ||
142 | /* Make sure that patched code is visible */ | 159 | /* Make sure that patched code is visible */ |
143 | isync | 160 | isync |
144 | bctr | 161 | bctr |
@@ -169,6 +186,7 @@ _GLOBAL(generic_secondary_thread_init) | |||
169 | 186 | ||
170 | /* get a valid TOC pointer, wherever we're mapped at */ | 187 | /* get a valid TOC pointer, wherever we're mapped at */ |
171 | bl .relative_toc | 188 | bl .relative_toc |
189 | tovirt(r2,r2) | ||
172 | 190 | ||
173 | #ifdef CONFIG_PPC_BOOK3E | 191 | #ifdef CONFIG_PPC_BOOK3E |
174 | /* Book3E initialization */ | 192 | /* Book3E initialization */ |
@@ -195,6 +213,7 @@ _GLOBAL(generic_secondary_smp_init) | |||
195 | 213 | ||
196 | /* get a valid TOC pointer, wherever we're mapped at */ | 214 | /* get a valid TOC pointer, wherever we're mapped at */ |
197 | bl .relative_toc | 215 | bl .relative_toc |
216 | tovirt(r2,r2) | ||
198 | 217 | ||
199 | #ifdef CONFIG_PPC_BOOK3E | 218 | #ifdef CONFIG_PPC_BOOK3E |
200 | /* Book3E initialization */ | 219 | /* Book3E initialization */ |
@@ -531,6 +550,7 @@ _GLOBAL(pmac_secondary_start) | |||
531 | 550 | ||
532 | /* get TOC pointer (real address) */ | 551 | /* get TOC pointer (real address) */ |
533 | bl .relative_toc | 552 | bl .relative_toc |
553 | tovirt(r2,r2) | ||
534 | 554 | ||
535 | /* Copy some CPU settings from CPU 0 */ | 555 | /* Copy some CPU settings from CPU 0 */ |
536 | bl .__restore_cpu_ppc970 | 556 | bl .__restore_cpu_ppc970 |
@@ -665,6 +685,13 @@ _GLOBAL(enable_64b_mode) | |||
665 | * This puts the TOC pointer into r2, offset by 0x8000 (as expected | 685 | * This puts the TOC pointer into r2, offset by 0x8000 (as expected |
666 | * by the toolchain). It computes the correct value for wherever we | 686 | * by the toolchain). It computes the correct value for wherever we |
667 | * are running at the moment, using position-independent code. | 687 | * are running at the moment, using position-independent code. |
688 | * | ||
689 | * Note: The compiler constructs pointers using offsets from the | ||
690 | * TOC in -mcmodel=medium mode. After we relocate to 0 but before | ||
691 | * the MMU is on we need our TOC to be a virtual address otherwise | ||
692 | * these pointers will be real addresses which may get stored and | ||
693 | * accessed later with the MMU on. We use tovirt() at the call | ||
694 | * sites to handle this. | ||
668 | */ | 695 | */ |
669 | _GLOBAL(relative_toc) | 696 | _GLOBAL(relative_toc) |
670 | mflr r0 | 697 | mflr r0 |
@@ -681,8 +708,9 @@ p_toc: .llong __toc_start + 0x8000 - 0b | |||
681 | * This is where the main kernel code starts. | 708 | * This is where the main kernel code starts. |
682 | */ | 709 | */ |
683 | _INIT_STATIC(start_here_multiplatform) | 710 | _INIT_STATIC(start_here_multiplatform) |
684 | /* set up the TOC (real address) */ | 711 | /* set up the TOC */ |
685 | bl .relative_toc | 712 | bl .relative_toc |
713 | tovirt(r2,r2) | ||
686 | 714 | ||
687 | /* Clear out the BSS. It may have been done in prom_init, | 715 | /* Clear out the BSS. It may have been done in prom_init, |
688 | * already but that's irrelevant since prom_init will soon | 716 | * already but that's irrelevant since prom_init will soon |
diff --git a/arch/powerpc/kernel/hw_breakpoint.c b/arch/powerpc/kernel/hw_breakpoint.c index a89cae481b04..a949bdfc9623 100644 --- a/arch/powerpc/kernel/hw_breakpoint.c +++ b/arch/powerpc/kernel/hw_breakpoint.c | |||
@@ -73,7 +73,7 @@ int arch_install_hw_breakpoint(struct perf_event *bp) | |||
73 | * If so, DABR will be populated in single_step_dabr_instruction(). | 73 | * If so, DABR will be populated in single_step_dabr_instruction(). |
74 | */ | 74 | */ |
75 | if (current->thread.last_hit_ubp != bp) | 75 | if (current->thread.last_hit_ubp != bp) |
76 | set_dabr(info->address | info->type | DABR_TRANSLATION, info->dabrx); | 76 | set_breakpoint(info); |
77 | 77 | ||
78 | return 0; | 78 | return 0; |
79 | } | 79 | } |
@@ -97,7 +97,7 @@ void arch_uninstall_hw_breakpoint(struct perf_event *bp) | |||
97 | } | 97 | } |
98 | 98 | ||
99 | *slot = NULL; | 99 | *slot = NULL; |
100 | set_dabr(0, 0); | 100 | hw_breakpoint_disable(); |
101 | } | 101 | } |
102 | 102 | ||
103 | /* | 103 | /* |
@@ -127,19 +127,13 @@ int arch_check_bp_in_kernelspace(struct perf_event *bp) | |||
127 | 127 | ||
128 | int arch_bp_generic_fields(int type, int *gen_bp_type) | 128 | int arch_bp_generic_fields(int type, int *gen_bp_type) |
129 | { | 129 | { |
130 | switch (type) { | 130 | *gen_bp_type = 0; |
131 | case DABR_DATA_READ: | 131 | if (type & HW_BRK_TYPE_READ) |
132 | *gen_bp_type = HW_BREAKPOINT_R; | 132 | *gen_bp_type |= HW_BREAKPOINT_R; |
133 | break; | 133 | if (type & HW_BRK_TYPE_WRITE) |
134 | case DABR_DATA_WRITE: | 134 | *gen_bp_type |= HW_BREAKPOINT_W; |
135 | *gen_bp_type = HW_BREAKPOINT_W; | 135 | if (*gen_bp_type == 0) |
136 | break; | ||
137 | case (DABR_DATA_WRITE | DABR_DATA_READ): | ||
138 | *gen_bp_type = (HW_BREAKPOINT_W | HW_BREAKPOINT_R); | ||
139 | break; | ||
140 | default: | ||
141 | return -EINVAL; | 136 | return -EINVAL; |
142 | } | ||
143 | return 0; | 137 | return 0; |
144 | } | 138 | } |
145 | 139 | ||
@@ -148,35 +142,28 @@ int arch_bp_generic_fields(int type, int *gen_bp_type) | |||
148 | */ | 142 | */ |
149 | int arch_validate_hwbkpt_settings(struct perf_event *bp) | 143 | int arch_validate_hwbkpt_settings(struct perf_event *bp) |
150 | { | 144 | { |
151 | int ret = -EINVAL; | 145 | int ret = -EINVAL, length_max; |
152 | struct arch_hw_breakpoint *info = counter_arch_bp(bp); | 146 | struct arch_hw_breakpoint *info = counter_arch_bp(bp); |
153 | 147 | ||
154 | if (!bp) | 148 | if (!bp) |
155 | return ret; | 149 | return ret; |
156 | 150 | ||
157 | switch (bp->attr.bp_type) { | 151 | info->type = HW_BRK_TYPE_TRANSLATE; |
158 | case HW_BREAKPOINT_R: | 152 | if (bp->attr.bp_type & HW_BREAKPOINT_R) |
159 | info->type = DABR_DATA_READ; | 153 | info->type |= HW_BRK_TYPE_READ; |
160 | break; | 154 | if (bp->attr.bp_type & HW_BREAKPOINT_W) |
161 | case HW_BREAKPOINT_W: | 155 | info->type |= HW_BRK_TYPE_WRITE; |
162 | info->type = DABR_DATA_WRITE; | 156 | if (info->type == HW_BRK_TYPE_TRANSLATE) |
163 | break; | 157 | /* must set alteast read or write */ |
164 | case HW_BREAKPOINT_R | HW_BREAKPOINT_W: | ||
165 | info->type = (DABR_DATA_READ | DABR_DATA_WRITE); | ||
166 | break; | ||
167 | default: | ||
168 | return ret; | 158 | return ret; |
169 | } | 159 | if (!(bp->attr.exclude_user)) |
170 | 160 | info->type |= HW_BRK_TYPE_USER; | |
161 | if (!(bp->attr.exclude_kernel)) | ||
162 | info->type |= HW_BRK_TYPE_KERNEL; | ||
163 | if (!(bp->attr.exclude_hv)) | ||
164 | info->type |= HW_BRK_TYPE_HYP; | ||
171 | info->address = bp->attr.bp_addr; | 165 | info->address = bp->attr.bp_addr; |
172 | info->len = bp->attr.bp_len; | 166 | info->len = bp->attr.bp_len; |
173 | info->dabrx = DABRX_ALL; | ||
174 | if (bp->attr.exclude_user) | ||
175 | info->dabrx &= ~DABRX_USER; | ||
176 | if (bp->attr.exclude_kernel) | ||
177 | info->dabrx &= ~DABRX_KERNEL; | ||
178 | if (bp->attr.exclude_hv) | ||
179 | info->dabrx &= ~DABRX_HYP; | ||
180 | 167 | ||
181 | /* | 168 | /* |
182 | * Since breakpoint length can be a maximum of HW_BREAKPOINT_LEN(8) | 169 | * Since breakpoint length can be a maximum of HW_BREAKPOINT_LEN(8) |
@@ -184,8 +171,16 @@ int arch_validate_hwbkpt_settings(struct perf_event *bp) | |||
184 | * HW_BREAKPOINT_ALIGN by rounding off to the lower address, the | 171 | * HW_BREAKPOINT_ALIGN by rounding off to the lower address, the |
185 | * 'symbolsize' should satisfy the check below. | 172 | * 'symbolsize' should satisfy the check below. |
186 | */ | 173 | */ |
174 | length_max = 8; /* DABR */ | ||
175 | if (cpu_has_feature(CPU_FTR_DAWR)) { | ||
176 | length_max = 512 ; /* 64 doublewords */ | ||
177 | /* DAWR region can't cross 512 boundary */ | ||
178 | if ((bp->attr.bp_addr >> 10) != | ||
179 | ((bp->attr.bp_addr + bp->attr.bp_len) >> 10)) | ||
180 | return -EINVAL; | ||
181 | } | ||
187 | if (info->len > | 182 | if (info->len > |
188 | (HW_BREAKPOINT_LEN - (info->address & HW_BREAKPOINT_ALIGN))) | 183 | (length_max - (info->address & HW_BREAKPOINT_ALIGN))) |
189 | return -EINVAL; | 184 | return -EINVAL; |
190 | return 0; | 185 | return 0; |
191 | } | 186 | } |
@@ -204,7 +199,7 @@ void thread_change_pc(struct task_struct *tsk, struct pt_regs *regs) | |||
204 | 199 | ||
205 | info = counter_arch_bp(tsk->thread.last_hit_ubp); | 200 | info = counter_arch_bp(tsk->thread.last_hit_ubp); |
206 | regs->msr &= ~MSR_SE; | 201 | regs->msr &= ~MSR_SE; |
207 | set_dabr(info->address | info->type | DABR_TRANSLATION, info->dabrx); | 202 | set_breakpoint(info); |
208 | tsk->thread.last_hit_ubp = NULL; | 203 | tsk->thread.last_hit_ubp = NULL; |
209 | } | 204 | } |
210 | 205 | ||
@@ -222,7 +217,7 @@ int __kprobes hw_breakpoint_handler(struct die_args *args) | |||
222 | unsigned long dar = regs->dar; | 217 | unsigned long dar = regs->dar; |
223 | 218 | ||
224 | /* Disable breakpoints during exception handling */ | 219 | /* Disable breakpoints during exception handling */ |
225 | set_dabr(0, 0); | 220 | hw_breakpoint_disable(); |
226 | 221 | ||
227 | /* | 222 | /* |
228 | * The counter may be concurrently released but that can only | 223 | * The counter may be concurrently released but that can only |
@@ -255,8 +250,9 @@ int __kprobes hw_breakpoint_handler(struct die_args *args) | |||
255 | * we still need to single-step the instruction, but we don't | 250 | * we still need to single-step the instruction, but we don't |
256 | * generate an event. | 251 | * generate an event. |
257 | */ | 252 | */ |
258 | info->extraneous_interrupt = !((bp->attr.bp_addr <= dar) && | 253 | if (!((bp->attr.bp_addr <= dar) && |
259 | (dar - bp->attr.bp_addr < bp->attr.bp_len)); | 254 | (dar - bp->attr.bp_addr < bp->attr.bp_len))) |
255 | info->type |= HW_BRK_TYPE_EXTRANEOUS_IRQ; | ||
260 | 256 | ||
261 | /* Do not emulate user-space instructions, instead single-step them */ | 257 | /* Do not emulate user-space instructions, instead single-step them */ |
262 | if (user_mode(regs)) { | 258 | if (user_mode(regs)) { |
@@ -285,10 +281,10 @@ int __kprobes hw_breakpoint_handler(struct die_args *args) | |||
285 | * As a policy, the callback is invoked in a 'trigger-after-execute' | 281 | * As a policy, the callback is invoked in a 'trigger-after-execute' |
286 | * fashion | 282 | * fashion |
287 | */ | 283 | */ |
288 | if (!info->extraneous_interrupt) | 284 | if (!(info->type & HW_BRK_TYPE_EXTRANEOUS_IRQ)) |
289 | perf_bp_event(bp, regs); | 285 | perf_bp_event(bp, regs); |
290 | 286 | ||
291 | set_dabr(info->address | info->type | DABR_TRANSLATION, info->dabrx); | 287 | set_breakpoint(info); |
292 | out: | 288 | out: |
293 | rcu_read_unlock(); | 289 | rcu_read_unlock(); |
294 | return rc; | 290 | return rc; |
@@ -317,10 +313,10 @@ int __kprobes single_step_dabr_instruction(struct die_args *args) | |||
317 | * We shall invoke the user-defined callback function in the single | 313 | * We shall invoke the user-defined callback function in the single |
318 | * stepping handler to confirm to 'trigger-after-execute' semantics | 314 | * stepping handler to confirm to 'trigger-after-execute' semantics |
319 | */ | 315 | */ |
320 | if (!info->extraneous_interrupt) | 316 | if (!(info->type & HW_BRK_TYPE_EXTRANEOUS_IRQ)) |
321 | perf_bp_event(bp, regs); | 317 | perf_bp_event(bp, regs); |
322 | 318 | ||
323 | set_dabr(info->address | info->type | DABR_TRANSLATION, info->dabrx); | 319 | set_breakpoint(info); |
324 | current->thread.last_hit_ubp = NULL; | 320 | current->thread.last_hit_ubp = NULL; |
325 | 321 | ||
326 | /* | 322 | /* |
diff --git a/arch/powerpc/kernel/iommu.c b/arch/powerpc/kernel/iommu.c index c862fd716fe3..31c4fdc6859c 100644 --- a/arch/powerpc/kernel/iommu.c +++ b/arch/powerpc/kernel/iommu.c | |||
@@ -717,6 +717,13 @@ void iommu_free_table(struct iommu_table *tbl, const char *node_name) | |||
717 | return; | 717 | return; |
718 | } | 718 | } |
719 | 719 | ||
720 | /* | ||
721 | * In case we have reserved the first bit, we should not emit | ||
722 | * the warning below. | ||
723 | */ | ||
724 | if (tbl->it_offset == 0) | ||
725 | clear_bit(0, tbl->it_map); | ||
726 | |||
720 | /* verify that table contains no entries */ | 727 | /* verify that table contains no entries */ |
721 | if (!bitmap_empty(tbl->it_map, tbl->it_size)) | 728 | if (!bitmap_empty(tbl->it_map, tbl->it_size)) |
722 | pr_warn("%s: Unexpected TCEs for %s\n", __func__, node_name); | 729 | pr_warn("%s: Unexpected TCEs for %s\n", __func__, node_name); |
diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c index 71413f41278f..4f97fe345526 100644 --- a/arch/powerpc/kernel/irq.c +++ b/arch/powerpc/kernel/irq.c | |||
@@ -122,8 +122,8 @@ static inline notrace int decrementer_check_overflow(void) | |||
122 | } | 122 | } |
123 | 123 | ||
124 | /* This is called whenever we are re-enabling interrupts | 124 | /* This is called whenever we are re-enabling interrupts |
125 | * and returns either 0 (nothing to do) or 500/900 if there's | 125 | * and returns either 0 (nothing to do) or 500/900/280/a00/e80 if |
126 | * either an EE or a DEC to generate. | 126 | * there's an EE, DEC or DBELL to generate. |
127 | * | 127 | * |
128 | * This is called in two contexts: From arch_local_irq_restore() | 128 | * This is called in two contexts: From arch_local_irq_restore() |
129 | * before soft-enabling interrupts, and from the exception exit | 129 | * before soft-enabling interrupts, and from the exception exit |
@@ -182,6 +182,13 @@ notrace unsigned int __check_irq_replay(void) | |||
182 | local_paca->irq_happened &= ~PACA_IRQ_DBELL; | 182 | local_paca->irq_happened &= ~PACA_IRQ_DBELL; |
183 | if (happened & PACA_IRQ_DBELL) | 183 | if (happened & PACA_IRQ_DBELL) |
184 | return 0x280; | 184 | return 0x280; |
185 | #else | ||
186 | local_paca->irq_happened &= ~PACA_IRQ_DBELL; | ||
187 | if (happened & PACA_IRQ_DBELL) { | ||
188 | if (cpu_has_feature(CPU_FTR_HVMODE)) | ||
189 | return 0xe80; | ||
190 | return 0xa00; | ||
191 | } | ||
185 | #endif /* CONFIG_PPC_BOOK3E */ | 192 | #endif /* CONFIG_PPC_BOOK3E */ |
186 | 193 | ||
187 | /* There should be nothing left ! */ | 194 | /* There should be nothing left ! */ |
diff --git a/arch/powerpc/kernel/kgdb.c b/arch/powerpc/kernel/kgdb.c index a7bc7521c064..5ca82cd4a374 100644 --- a/arch/powerpc/kernel/kgdb.c +++ b/arch/powerpc/kernel/kgdb.c | |||
@@ -199,7 +199,7 @@ static int kgdb_iabr_match(struct pt_regs *regs) | |||
199 | return 1; | 199 | return 1; |
200 | } | 200 | } |
201 | 201 | ||
202 | static int kgdb_dabr_match(struct pt_regs *regs) | 202 | static int kgdb_break_match(struct pt_regs *regs) |
203 | { | 203 | { |
204 | if (user_mode(regs)) | 204 | if (user_mode(regs)) |
205 | return 0; | 205 | return 0; |
@@ -459,7 +459,7 @@ static void *old__debugger; | |||
459 | static void *old__debugger_bpt; | 459 | static void *old__debugger_bpt; |
460 | static void *old__debugger_sstep; | 460 | static void *old__debugger_sstep; |
461 | static void *old__debugger_iabr_match; | 461 | static void *old__debugger_iabr_match; |
462 | static void *old__debugger_dabr_match; | 462 | static void *old__debugger_break_match; |
463 | static void *old__debugger_fault_handler; | 463 | static void *old__debugger_fault_handler; |
464 | 464 | ||
465 | int kgdb_arch_init(void) | 465 | int kgdb_arch_init(void) |
@@ -469,7 +469,7 @@ int kgdb_arch_init(void) | |||
469 | old__debugger_bpt = __debugger_bpt; | 469 | old__debugger_bpt = __debugger_bpt; |
470 | old__debugger_sstep = __debugger_sstep; | 470 | old__debugger_sstep = __debugger_sstep; |
471 | old__debugger_iabr_match = __debugger_iabr_match; | 471 | old__debugger_iabr_match = __debugger_iabr_match; |
472 | old__debugger_dabr_match = __debugger_dabr_match; | 472 | old__debugger_break_match = __debugger_break_match; |
473 | old__debugger_fault_handler = __debugger_fault_handler; | 473 | old__debugger_fault_handler = __debugger_fault_handler; |
474 | 474 | ||
475 | __debugger_ipi = kgdb_call_nmi_hook; | 475 | __debugger_ipi = kgdb_call_nmi_hook; |
@@ -477,7 +477,7 @@ int kgdb_arch_init(void) | |||
477 | __debugger_bpt = kgdb_handle_breakpoint; | 477 | __debugger_bpt = kgdb_handle_breakpoint; |
478 | __debugger_sstep = kgdb_singlestep; | 478 | __debugger_sstep = kgdb_singlestep; |
479 | __debugger_iabr_match = kgdb_iabr_match; | 479 | __debugger_iabr_match = kgdb_iabr_match; |
480 | __debugger_dabr_match = kgdb_dabr_match; | 480 | __debugger_break_match = kgdb_break_match; |
481 | __debugger_fault_handler = kgdb_not_implemented; | 481 | __debugger_fault_handler = kgdb_not_implemented; |
482 | 482 | ||
483 | return 0; | 483 | return 0; |
@@ -490,6 +490,6 @@ void kgdb_arch_exit(void) | |||
490 | __debugger_bpt = old__debugger_bpt; | 490 | __debugger_bpt = old__debugger_bpt; |
491 | __debugger_sstep = old__debugger_sstep; | 491 | __debugger_sstep = old__debugger_sstep; |
492 | __debugger_iabr_match = old__debugger_iabr_match; | 492 | __debugger_iabr_match = old__debugger_iabr_match; |
493 | __debugger_dabr_match = old__debugger_dabr_match; | 493 | __debugger_break_match = old__debugger_break_match; |
494 | __debugger_fault_handler = old__debugger_fault_handler; | 494 | __debugger_fault_handler = old__debugger_fault_handler; |
495 | } | 495 | } |
diff --git a/arch/powerpc/kernel/machine_kexec_64.c b/arch/powerpc/kernel/machine_kexec_64.c index 7206701b1ff1..466a2908bb63 100644 --- a/arch/powerpc/kernel/machine_kexec_64.c +++ b/arch/powerpc/kernel/machine_kexec_64.c | |||
@@ -162,6 +162,8 @@ static int kexec_all_irq_disabled = 0; | |||
162 | static void kexec_smp_down(void *arg) | 162 | static void kexec_smp_down(void *arg) |
163 | { | 163 | { |
164 | local_irq_disable(); | 164 | local_irq_disable(); |
165 | hard_irq_disable(); | ||
166 | |||
165 | mb(); /* make sure our irqs are disabled before we say they are */ | 167 | mb(); /* make sure our irqs are disabled before we say they are */ |
166 | get_paca()->kexec_state = KEXEC_STATE_IRQS_OFF; | 168 | get_paca()->kexec_state = KEXEC_STATE_IRQS_OFF; |
167 | while(kexec_all_irq_disabled == 0) | 169 | while(kexec_all_irq_disabled == 0) |
@@ -244,6 +246,8 @@ static void kexec_prepare_cpus(void) | |||
244 | wake_offline_cpus(); | 246 | wake_offline_cpus(); |
245 | smp_call_function(kexec_smp_down, NULL, /* wait */0); | 247 | smp_call_function(kexec_smp_down, NULL, /* wait */0); |
246 | local_irq_disable(); | 248 | local_irq_disable(); |
249 | hard_irq_disable(); | ||
250 | |||
247 | mb(); /* make sure IRQs are disabled before we say they are */ | 251 | mb(); /* make sure IRQs are disabled before we say they are */ |
248 | get_paca()->kexec_state = KEXEC_STATE_IRQS_OFF; | 252 | get_paca()->kexec_state = KEXEC_STATE_IRQS_OFF; |
249 | 253 | ||
@@ -281,6 +285,7 @@ static void kexec_prepare_cpus(void) | |||
281 | if (ppc_md.kexec_cpu_down) | 285 | if (ppc_md.kexec_cpu_down) |
282 | ppc_md.kexec_cpu_down(0, 0); | 286 | ppc_md.kexec_cpu_down(0, 0); |
283 | local_irq_disable(); | 287 | local_irq_disable(); |
288 | hard_irq_disable(); | ||
284 | } | 289 | } |
285 | 290 | ||
286 | #endif /* SMP */ | 291 | #endif /* SMP */ |
diff --git a/arch/powerpc/kernel/module_64.c b/arch/powerpc/kernel/module_64.c index 9f44a775a106..6ee59a0eb268 100644 --- a/arch/powerpc/kernel/module_64.c +++ b/arch/powerpc/kernel/module_64.c | |||
@@ -386,6 +386,14 @@ int apply_relocate_add(Elf64_Shdr *sechdrs, | |||
386 | | (value & 0xffff); | 386 | | (value & 0xffff); |
387 | break; | 387 | break; |
388 | 388 | ||
389 | case R_PPC64_TOC16_LO: | ||
390 | /* Subtract TOC pointer */ | ||
391 | value -= my_r2(sechdrs, me); | ||
392 | *((uint16_t *) location) | ||
393 | = (*((uint16_t *) location) & ~0xffff) | ||
394 | | (value & 0xffff); | ||
395 | break; | ||
396 | |||
389 | case R_PPC64_TOC16_DS: | 397 | case R_PPC64_TOC16_DS: |
390 | /* Subtract TOC pointer */ | 398 | /* Subtract TOC pointer */ |
391 | value -= my_r2(sechdrs, me); | 399 | value -= my_r2(sechdrs, me); |
@@ -399,6 +407,28 @@ int apply_relocate_add(Elf64_Shdr *sechdrs, | |||
399 | | (value & 0xfffc); | 407 | | (value & 0xfffc); |
400 | break; | 408 | break; |
401 | 409 | ||
410 | case R_PPC64_TOC16_LO_DS: | ||
411 | /* Subtract TOC pointer */ | ||
412 | value -= my_r2(sechdrs, me); | ||
413 | if ((value & 3) != 0) { | ||
414 | printk("%s: bad TOC16_LO_DS relocation (%lu)\n", | ||
415 | me->name, value); | ||
416 | return -ENOEXEC; | ||
417 | } | ||
418 | *((uint16_t *) location) | ||
419 | = (*((uint16_t *) location) & ~0xfffc) | ||
420 | | (value & 0xfffc); | ||
421 | break; | ||
422 | |||
423 | case R_PPC64_TOC16_HA: | ||
424 | /* Subtract TOC pointer */ | ||
425 | value -= my_r2(sechdrs, me); | ||
426 | value = ((value + 0x8000) >> 16); | ||
427 | *((uint16_t *) location) | ||
428 | = (*((uint16_t *) location) & ~0xffff) | ||
429 | | (value & 0xffff); | ||
430 | break; | ||
431 | |||
402 | case R_PPC_REL24: | 432 | case R_PPC_REL24: |
403 | /* FIXME: Handle weak symbols here --RR */ | 433 | /* FIXME: Handle weak symbols here --RR */ |
404 | if (sym->st_shndx == SHN_UNDEF) { | 434 | if (sym->st_shndx == SHN_UNDEF) { |
diff --git a/arch/powerpc/kernel/of_platform.c b/arch/powerpc/kernel/of_platform.c index 07c12697d708..a7b743076720 100644 --- a/arch/powerpc/kernel/of_platform.c +++ b/arch/powerpc/kernel/of_platform.c | |||
@@ -71,10 +71,8 @@ static int of_pci_phb_probe(struct platform_device *dev) | |||
71 | eeh_dev_phb_init_dynamic(phb); | 71 | eeh_dev_phb_init_dynamic(phb); |
72 | 72 | ||
73 | /* Register devices with EEH */ | 73 | /* Register devices with EEH */ |
74 | #ifdef CONFIG_EEH | ||
75 | if (dev->dev.of_node->child) | 74 | if (dev->dev.of_node->child) |
76 | eeh_add_device_tree_early(dev->dev.of_node); | 75 | eeh_add_device_tree_early(dev->dev.of_node); |
77 | #endif /* CONFIG_EEH */ | ||
78 | 76 | ||
79 | /* Scan the bus */ | 77 | /* Scan the bus */ |
80 | pcibios_scan_phb(phb); | 78 | pcibios_scan_phb(phb); |
@@ -88,13 +86,14 @@ static int of_pci_phb_probe(struct platform_device *dev) | |||
88 | pcibios_claim_one_bus(phb->bus); | 86 | pcibios_claim_one_bus(phb->bus); |
89 | 87 | ||
90 | /* Finish EEH setup */ | 88 | /* Finish EEH setup */ |
91 | #ifdef CONFIG_EEH | ||
92 | eeh_add_device_tree_late(phb->bus); | 89 | eeh_add_device_tree_late(phb->bus); |
93 | #endif | ||
94 | 90 | ||
95 | /* Add probed PCI devices to the device model */ | 91 | /* Add probed PCI devices to the device model */ |
96 | pci_bus_add_devices(phb->bus); | 92 | pci_bus_add_devices(phb->bus); |
97 | 93 | ||
94 | /* sysfs files should only be added after devices are added */ | ||
95 | eeh_add_sysfs_files(phb->bus); | ||
96 | |||
98 | return 0; | 97 | return 0; |
99 | } | 98 | } |
100 | 99 | ||
diff --git a/arch/powerpc/kernel/paca.c b/arch/powerpc/kernel/paca.c index cd6da855090c..f8f24685f10a 100644 --- a/arch/powerpc/kernel/paca.c +++ b/arch/powerpc/kernel/paca.c | |||
@@ -120,8 +120,6 @@ struct slb_shadow slb_shadow[] __cacheline_aligned = { | |||
120 | struct paca_struct *paca; | 120 | struct paca_struct *paca; |
121 | EXPORT_SYMBOL(paca); | 121 | EXPORT_SYMBOL(paca); |
122 | 122 | ||
123 | struct paca_struct boot_paca; | ||
124 | |||
125 | void __init initialise_paca(struct paca_struct *new_paca, int cpu) | 123 | void __init initialise_paca(struct paca_struct *new_paca, int cpu) |
126 | { | 124 | { |
127 | /* The TOC register (GPR2) points 32kB into the TOC, so that 64kB | 125 | /* The TOC register (GPR2) points 32kB into the TOC, so that 64kB |
diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c index 7c37379ea9b1..fa12ae42d98c 100644 --- a/arch/powerpc/kernel/pci-common.c +++ b/arch/powerpc/kernel/pci-common.c | |||
@@ -1477,11 +1477,14 @@ void pcibios_finish_adding_to_bus(struct pci_bus *bus) | |||
1477 | pcibios_allocate_bus_resources(bus); | 1477 | pcibios_allocate_bus_resources(bus); |
1478 | pcibios_claim_one_bus(bus); | 1478 | pcibios_claim_one_bus(bus); |
1479 | 1479 | ||
1480 | /* Fixup EEH */ | ||
1481 | eeh_add_device_tree_late(bus); | ||
1482 | |||
1480 | /* Add new devices to global lists. Register in proc, sysfs. */ | 1483 | /* Add new devices to global lists. Register in proc, sysfs. */ |
1481 | pci_bus_add_devices(bus); | 1484 | pci_bus_add_devices(bus); |
1482 | 1485 | ||
1483 | /* Fixup EEH */ | 1486 | /* sysfs files should only be added after devices are added */ |
1484 | eeh_add_device_tree_late(bus); | 1487 | eeh_add_sysfs_files(bus); |
1485 | } | 1488 | } |
1486 | EXPORT_SYMBOL_GPL(pcibios_finish_adding_to_bus); | 1489 | EXPORT_SYMBOL_GPL(pcibios_finish_adding_to_bus); |
1487 | 1490 | ||
diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c index 81430674e71c..59dd545fdde1 100644 --- a/arch/powerpc/kernel/process.c +++ b/arch/powerpc/kernel/process.c | |||
@@ -50,6 +50,7 @@ | |||
50 | #include <asm/runlatch.h> | 50 | #include <asm/runlatch.h> |
51 | #include <asm/syscalls.h> | 51 | #include <asm/syscalls.h> |
52 | #include <asm/switch_to.h> | 52 | #include <asm/switch_to.h> |
53 | #include <asm/tm.h> | ||
53 | #include <asm/debug.h> | 54 | #include <asm/debug.h> |
54 | #ifdef CONFIG_PPC64 | 55 | #ifdef CONFIG_PPC64 |
55 | #include <asm/firmware.h> | 56 | #include <asm/firmware.h> |
@@ -57,6 +58,13 @@ | |||
57 | #include <linux/kprobes.h> | 58 | #include <linux/kprobes.h> |
58 | #include <linux/kdebug.h> | 59 | #include <linux/kdebug.h> |
59 | 60 | ||
61 | /* Transactional Memory debug */ | ||
62 | #ifdef TM_DEBUG_SW | ||
63 | #define TM_DEBUG(x...) printk(KERN_INFO x) | ||
64 | #else | ||
65 | #define TM_DEBUG(x...) do { } while(0) | ||
66 | #endif | ||
67 | |||
60 | extern unsigned long _get_SP(void); | 68 | extern unsigned long _get_SP(void); |
61 | 69 | ||
62 | #ifndef CONFIG_SMP | 70 | #ifndef CONFIG_SMP |
@@ -271,7 +279,7 @@ void do_send_trap(struct pt_regs *regs, unsigned long address, | |||
271 | force_sig_info(SIGTRAP, &info, current); | 279 | force_sig_info(SIGTRAP, &info, current); |
272 | } | 280 | } |
273 | #else /* !CONFIG_PPC_ADV_DEBUG_REGS */ | 281 | #else /* !CONFIG_PPC_ADV_DEBUG_REGS */ |
274 | void do_dabr(struct pt_regs *regs, unsigned long address, | 282 | void do_break (struct pt_regs *regs, unsigned long address, |
275 | unsigned long error_code) | 283 | unsigned long error_code) |
276 | { | 284 | { |
277 | siginfo_t info; | 285 | siginfo_t info; |
@@ -281,11 +289,11 @@ void do_dabr(struct pt_regs *regs, unsigned long address, | |||
281 | 11, SIGSEGV) == NOTIFY_STOP) | 289 | 11, SIGSEGV) == NOTIFY_STOP) |
282 | return; | 290 | return; |
283 | 291 | ||
284 | if (debugger_dabr_match(regs)) | 292 | if (debugger_break_match(regs)) |
285 | return; | 293 | return; |
286 | 294 | ||
287 | /* Clear the DABR */ | 295 | /* Clear the breakpoint */ |
288 | set_dabr(0, 0); | 296 | hw_breakpoint_disable(); |
289 | 297 | ||
290 | /* Deliver the signal to userspace */ | 298 | /* Deliver the signal to userspace */ |
291 | info.si_signo = SIGTRAP; | 299 | info.si_signo = SIGTRAP; |
@@ -296,7 +304,7 @@ void do_dabr(struct pt_regs *regs, unsigned long address, | |||
296 | } | 304 | } |
297 | #endif /* CONFIG_PPC_ADV_DEBUG_REGS */ | 305 | #endif /* CONFIG_PPC_ADV_DEBUG_REGS */ |
298 | 306 | ||
299 | static DEFINE_PER_CPU(unsigned long, current_dabr); | 307 | static DEFINE_PER_CPU(struct arch_hw_breakpoint, current_brk); |
300 | 308 | ||
301 | #ifdef CONFIG_PPC_ADV_DEBUG_REGS | 309 | #ifdef CONFIG_PPC_ADV_DEBUG_REGS |
302 | /* | 310 | /* |
@@ -364,39 +372,214 @@ static void switch_booke_debug_regs(struct thread_struct *new_thread) | |||
364 | #ifndef CONFIG_HAVE_HW_BREAKPOINT | 372 | #ifndef CONFIG_HAVE_HW_BREAKPOINT |
365 | static void set_debug_reg_defaults(struct thread_struct *thread) | 373 | static void set_debug_reg_defaults(struct thread_struct *thread) |
366 | { | 374 | { |
367 | if (thread->dabr) { | 375 | thread->hw_brk.address = 0; |
368 | thread->dabr = 0; | 376 | thread->hw_brk.type = 0; |
369 | thread->dabrx = 0; | 377 | set_breakpoint(&thread->hw_brk); |
370 | set_dabr(0, 0); | ||
371 | } | ||
372 | } | 378 | } |
373 | #endif /* !CONFIG_HAVE_HW_BREAKPOINT */ | 379 | #endif /* !CONFIG_HAVE_HW_BREAKPOINT */ |
374 | #endif /* CONFIG_PPC_ADV_DEBUG_REGS */ | 380 | #endif /* CONFIG_PPC_ADV_DEBUG_REGS */ |
375 | 381 | ||
376 | int set_dabr(unsigned long dabr, unsigned long dabrx) | ||
377 | { | ||
378 | __get_cpu_var(current_dabr) = dabr; | ||
379 | |||
380 | if (ppc_md.set_dabr) | ||
381 | return ppc_md.set_dabr(dabr, dabrx); | ||
382 | |||
383 | /* XXX should we have a CPU_FTR_HAS_DABR ? */ | ||
384 | #ifdef CONFIG_PPC_ADV_DEBUG_REGS | 382 | #ifdef CONFIG_PPC_ADV_DEBUG_REGS |
383 | static inline int __set_dabr(unsigned long dabr, unsigned long dabrx) | ||
384 | { | ||
385 | mtspr(SPRN_DAC1, dabr); | 385 | mtspr(SPRN_DAC1, dabr); |
386 | #ifdef CONFIG_PPC_47x | 386 | #ifdef CONFIG_PPC_47x |
387 | isync(); | 387 | isync(); |
388 | #endif | 388 | #endif |
389 | return 0; | ||
390 | } | ||
389 | #elif defined(CONFIG_PPC_BOOK3S) | 391 | #elif defined(CONFIG_PPC_BOOK3S) |
392 | static inline int __set_dabr(unsigned long dabr, unsigned long dabrx) | ||
393 | { | ||
390 | mtspr(SPRN_DABR, dabr); | 394 | mtspr(SPRN_DABR, dabr); |
391 | mtspr(SPRN_DABRX, dabrx); | 395 | mtspr(SPRN_DABRX, dabrx); |
396 | return 0; | ||
397 | } | ||
398 | #else | ||
399 | static inline int __set_dabr(unsigned long dabr, unsigned long dabrx) | ||
400 | { | ||
401 | return -EINVAL; | ||
402 | } | ||
392 | #endif | 403 | #endif |
404 | |||
405 | static inline int set_dabr(struct arch_hw_breakpoint *brk) | ||
406 | { | ||
407 | unsigned long dabr, dabrx; | ||
408 | |||
409 | dabr = brk->address | (brk->type & HW_BRK_TYPE_DABR); | ||
410 | dabrx = ((brk->type >> 3) & 0x7); | ||
411 | |||
412 | if (ppc_md.set_dabr) | ||
413 | return ppc_md.set_dabr(dabr, dabrx); | ||
414 | |||
415 | return __set_dabr(dabr, dabrx); | ||
416 | } | ||
417 | |||
418 | static inline int set_dawr(struct arch_hw_breakpoint *brk) | ||
419 | { | ||
420 | unsigned long dawr, dawrx, mrd; | ||
421 | |||
422 | dawr = brk->address; | ||
423 | |||
424 | dawrx = (brk->type & (HW_BRK_TYPE_READ | HW_BRK_TYPE_WRITE)) \ | ||
425 | << (63 - 58); //* read/write bits */ | ||
426 | dawrx |= ((brk->type & (HW_BRK_TYPE_TRANSLATE)) >> 2) \ | ||
427 | << (63 - 59); //* translate */ | ||
428 | dawrx |= (brk->type & (HW_BRK_TYPE_PRIV_ALL)) \ | ||
429 | >> 3; //* PRIM bits */ | ||
430 | /* dawr length is stored in field MDR bits 48:53. Matches range in | ||
431 | doublewords (64 bits) baised by -1 eg. 0b000000=1DW and | ||
432 | 0b111111=64DW. | ||
433 | brk->len is in bytes. | ||
434 | This aligns up to double word size, shifts and does the bias. | ||
435 | */ | ||
436 | mrd = ((brk->len + 7) >> 3) - 1; | ||
437 | dawrx |= (mrd & 0x3f) << (63 - 53); | ||
438 | |||
439 | if (ppc_md.set_dawr) | ||
440 | return ppc_md.set_dawr(dawr, dawrx); | ||
441 | mtspr(SPRN_DAWR, dawr); | ||
442 | mtspr(SPRN_DAWRX, dawrx); | ||
393 | return 0; | 443 | return 0; |
394 | } | 444 | } |
395 | 445 | ||
446 | int set_breakpoint(struct arch_hw_breakpoint *brk) | ||
447 | { | ||
448 | __get_cpu_var(current_brk) = *brk; | ||
449 | |||
450 | if (cpu_has_feature(CPU_FTR_DAWR)) | ||
451 | return set_dawr(brk); | ||
452 | |||
453 | return set_dabr(brk); | ||
454 | } | ||
455 | |||
396 | #ifdef CONFIG_PPC64 | 456 | #ifdef CONFIG_PPC64 |
397 | DEFINE_PER_CPU(struct cpu_usage, cpu_usage_array); | 457 | DEFINE_PER_CPU(struct cpu_usage, cpu_usage_array); |
398 | #endif | 458 | #endif |
399 | 459 | ||
460 | static inline bool hw_brk_match(struct arch_hw_breakpoint *a, | ||
461 | struct arch_hw_breakpoint *b) | ||
462 | { | ||
463 | if (a->address != b->address) | ||
464 | return false; | ||
465 | if (a->type != b->type) | ||
466 | return false; | ||
467 | if (a->len != b->len) | ||
468 | return false; | ||
469 | return true; | ||
470 | } | ||
471 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | ||
472 | static inline void tm_reclaim_task(struct task_struct *tsk) | ||
473 | { | ||
474 | /* We have to work out if we're switching from/to a task that's in the | ||
475 | * middle of a transaction. | ||
476 | * | ||
477 | * In switching we need to maintain a 2nd register state as | ||
478 | * oldtask->thread.ckpt_regs. We tm_reclaim(oldproc); this saves the | ||
479 | * checkpointed (tbegin) state in ckpt_regs and saves the transactional | ||
480 | * (current) FPRs into oldtask->thread.transact_fpr[]. | ||
481 | * | ||
482 | * We also context switch (save) TFHAR/TEXASR/TFIAR in here. | ||
483 | */ | ||
484 | struct thread_struct *thr = &tsk->thread; | ||
485 | |||
486 | if (!thr->regs) | ||
487 | return; | ||
488 | |||
489 | if (!MSR_TM_ACTIVE(thr->regs->msr)) | ||
490 | goto out_and_saveregs; | ||
491 | |||
492 | /* Stash the original thread MSR, as giveup_fpu et al will | ||
493 | * modify it. We hold onto it to see whether the task used | ||
494 | * FP & vector regs. | ||
495 | */ | ||
496 | thr->tm_orig_msr = thr->regs->msr; | ||
497 | |||
498 | TM_DEBUG("--- tm_reclaim on pid %d (NIP=%lx, " | ||
499 | "ccr=%lx, msr=%lx, trap=%lx)\n", | ||
500 | tsk->pid, thr->regs->nip, | ||
501 | thr->regs->ccr, thr->regs->msr, | ||
502 | thr->regs->trap); | ||
503 | |||
504 | tm_reclaim(thr, thr->regs->msr, TM_CAUSE_RESCHED); | ||
505 | |||
506 | TM_DEBUG("--- tm_reclaim on pid %d complete\n", | ||
507 | tsk->pid); | ||
508 | |||
509 | out_and_saveregs: | ||
510 | /* Always save the regs here, even if a transaction's not active. | ||
511 | * This context-switches a thread's TM info SPRs. We do it here to | ||
512 | * be consistent with the restore path (in recheckpoint) which | ||
513 | * cannot happen later in _switch(). | ||
514 | */ | ||
515 | tm_save_sprs(thr); | ||
516 | } | ||
517 | |||
518 | static inline void tm_recheckpoint_new_task(struct task_struct *new) | ||
519 | { | ||
520 | unsigned long msr; | ||
521 | |||
522 | if (!cpu_has_feature(CPU_FTR_TM)) | ||
523 | return; | ||
524 | |||
525 | /* Recheckpoint the registers of the thread we're about to switch to. | ||
526 | * | ||
527 | * If the task was using FP, we non-lazily reload both the original and | ||
528 | * the speculative FP register states. This is because the kernel | ||
529 | * doesn't see if/when a TM rollback occurs, so if we take an FP | ||
530 | * unavoidable later, we are unable to determine which set of FP regs | ||
531 | * need to be restored. | ||
532 | */ | ||
533 | if (!new->thread.regs) | ||
534 | return; | ||
535 | |||
536 | /* The TM SPRs are restored here, so that TEXASR.FS can be set | ||
537 | * before the trecheckpoint and no explosion occurs. | ||
538 | */ | ||
539 | tm_restore_sprs(&new->thread); | ||
540 | |||
541 | if (!MSR_TM_ACTIVE(new->thread.regs->msr)) | ||
542 | return; | ||
543 | msr = new->thread.tm_orig_msr; | ||
544 | /* Recheckpoint to restore original checkpointed register state. */ | ||
545 | TM_DEBUG("*** tm_recheckpoint of pid %d " | ||
546 | "(new->msr 0x%lx, new->origmsr 0x%lx)\n", | ||
547 | new->pid, new->thread.regs->msr, msr); | ||
548 | |||
549 | /* This loads the checkpointed FP/VEC state, if used */ | ||
550 | tm_recheckpoint(&new->thread, msr); | ||
551 | |||
552 | /* This loads the speculative FP/VEC state, if used */ | ||
553 | if (msr & MSR_FP) { | ||
554 | do_load_up_transact_fpu(&new->thread); | ||
555 | new->thread.regs->msr |= | ||
556 | (MSR_FP | new->thread.fpexc_mode); | ||
557 | } | ||
558 | if (msr & MSR_VEC) { | ||
559 | do_load_up_transact_altivec(&new->thread); | ||
560 | new->thread.regs->msr |= MSR_VEC; | ||
561 | } | ||
562 | /* We may as well turn on VSX too since all the state is restored now */ | ||
563 | if (msr & MSR_VSX) | ||
564 | new->thread.regs->msr |= MSR_VSX; | ||
565 | |||
566 | TM_DEBUG("*** tm_recheckpoint of pid %d complete " | ||
567 | "(kernel msr 0x%lx)\n", | ||
568 | new->pid, mfmsr()); | ||
569 | } | ||
570 | |||
571 | static inline void __switch_to_tm(struct task_struct *prev) | ||
572 | { | ||
573 | if (cpu_has_feature(CPU_FTR_TM)) { | ||
574 | tm_enable(); | ||
575 | tm_reclaim_task(prev); | ||
576 | } | ||
577 | } | ||
578 | #else | ||
579 | #define tm_recheckpoint_new_task(new) | ||
580 | #define __switch_to_tm(prev) | ||
581 | #endif /* CONFIG_PPC_TRANSACTIONAL_MEM */ | ||
582 | |||
400 | struct task_struct *__switch_to(struct task_struct *prev, | 583 | struct task_struct *__switch_to(struct task_struct *prev, |
401 | struct task_struct *new) | 584 | struct task_struct *new) |
402 | { | 585 | { |
@@ -407,6 +590,8 @@ struct task_struct *__switch_to(struct task_struct *prev, | |||
407 | struct ppc64_tlb_batch *batch; | 590 | struct ppc64_tlb_batch *batch; |
408 | #endif | 591 | #endif |
409 | 592 | ||
593 | __switch_to_tm(prev); | ||
594 | |||
410 | #ifdef CONFIG_SMP | 595 | #ifdef CONFIG_SMP |
411 | /* avoid complexity of lazy save/restore of fpu | 596 | /* avoid complexity of lazy save/restore of fpu |
412 | * by just saving it every time we switch out if | 597 | * by just saving it every time we switch out if |
@@ -481,8 +666,8 @@ struct task_struct *__switch_to(struct task_struct *prev, | |||
481 | * schedule DABR | 666 | * schedule DABR |
482 | */ | 667 | */ |
483 | #ifndef CONFIG_HAVE_HW_BREAKPOINT | 668 | #ifndef CONFIG_HAVE_HW_BREAKPOINT |
484 | if (unlikely(__get_cpu_var(current_dabr) != new->thread.dabr)) | 669 | if (unlikely(hw_brk_match(&__get_cpu_var(current_brk), &new->thread.hw_brk))) |
485 | set_dabr(new->thread.dabr, new->thread.dabrx); | 670 | set_breakpoint(&new->thread.hw_brk); |
486 | #endif /* CONFIG_HAVE_HW_BREAKPOINT */ | 671 | #endif /* CONFIG_HAVE_HW_BREAKPOINT */ |
487 | #endif | 672 | #endif |
488 | 673 | ||
@@ -522,6 +707,9 @@ struct task_struct *__switch_to(struct task_struct *prev, | |||
522 | * of sync. Hard disable here. | 707 | * of sync. Hard disable here. |
523 | */ | 708 | */ |
524 | hard_irq_disable(); | 709 | hard_irq_disable(); |
710 | |||
711 | tm_recheckpoint_new_task(new); | ||
712 | |||
525 | last = _switch(old_thread, new_thread); | 713 | last = _switch(old_thread, new_thread); |
526 | 714 | ||
527 | #ifdef CONFIG_PPC_BOOK3S_64 | 715 | #ifdef CONFIG_PPC_BOOK3S_64 |
@@ -683,6 +871,9 @@ void show_regs(struct pt_regs * regs) | |||
683 | printk("NIP ["REG"] %pS\n", regs->nip, (void *)regs->nip); | 871 | printk("NIP ["REG"] %pS\n", regs->nip, (void *)regs->nip); |
684 | printk("LR ["REG"] %pS\n", regs->link, (void *)regs->link); | 872 | printk("LR ["REG"] %pS\n", regs->link, (void *)regs->link); |
685 | #endif | 873 | #endif |
874 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | ||
875 | printk("PACATMSCRATCH [%llx]\n", get_paca()->tm_scratch); | ||
876 | #endif | ||
686 | show_stack(current, (unsigned long *) regs->gpr[1]); | 877 | show_stack(current, (unsigned long *) regs->gpr[1]); |
687 | if (!user_mode(regs)) | 878 | if (!user_mode(regs)) |
688 | show_instructions(regs); | 879 | show_instructions(regs); |
@@ -813,6 +1004,8 @@ int copy_thread(unsigned long clone_flags, unsigned long usp, | |||
813 | p->thread.dscr_inherit = current->thread.dscr_inherit; | 1004 | p->thread.dscr_inherit = current->thread.dscr_inherit; |
814 | p->thread.dscr = current->thread.dscr; | 1005 | p->thread.dscr = current->thread.dscr; |
815 | } | 1006 | } |
1007 | if (cpu_has_feature(CPU_FTR_HAS_PPR)) | ||
1008 | p->thread.ppr = INIT_PPR; | ||
816 | #endif | 1009 | #endif |
817 | /* | 1010 | /* |
818 | * The PPC64 ABI makes use of a TOC to contain function | 1011 | * The PPC64 ABI makes use of a TOC to contain function |
@@ -892,7 +1085,6 @@ void start_thread(struct pt_regs *regs, unsigned long start, unsigned long sp) | |||
892 | regs->msr = MSR_USER32; | 1085 | regs->msr = MSR_USER32; |
893 | } | 1086 | } |
894 | #endif | 1087 | #endif |
895 | |||
896 | discard_lazy_cpu_state(); | 1088 | discard_lazy_cpu_state(); |
897 | #ifdef CONFIG_VSX | 1089 | #ifdef CONFIG_VSX |
898 | current->thread.used_vsr = 0; | 1090 | current->thread.used_vsr = 0; |
@@ -912,6 +1104,13 @@ void start_thread(struct pt_regs *regs, unsigned long start, unsigned long sp) | |||
912 | current->thread.spefscr = 0; | 1104 | current->thread.spefscr = 0; |
913 | current->thread.used_spe = 0; | 1105 | current->thread.used_spe = 0; |
914 | #endif /* CONFIG_SPE */ | 1106 | #endif /* CONFIG_SPE */ |
1107 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | ||
1108 | if (cpu_has_feature(CPU_FTR_TM)) | ||
1109 | regs->msr |= MSR_TM; | ||
1110 | current->thread.tm_tfhar = 0; | ||
1111 | current->thread.tm_texasr = 0; | ||
1112 | current->thread.tm_tfiar = 0; | ||
1113 | #endif /* CONFIG_PPC_TRANSACTIONAL_MEM */ | ||
915 | } | 1114 | } |
916 | 1115 | ||
917 | #define PR_FP_ALL_EXCEPT (PR_FP_EXC_DIV | PR_FP_EXC_OVF | PR_FP_EXC_UND \ | 1116 | #define PR_FP_ALL_EXCEPT (PR_FP_EXC_DIV | PR_FP_EXC_OVF | PR_FP_EXC_UND \ |
diff --git a/arch/powerpc/kernel/prom_init.c b/arch/powerpc/kernel/prom_init.c index 779f34049a56..7f7fb7fd991b 100644 --- a/arch/powerpc/kernel/prom_init.c +++ b/arch/powerpc/kernel/prom_init.c | |||
@@ -66,8 +66,8 @@ | |||
66 | * is running at whatever address it has been loaded at. | 66 | * is running at whatever address it has been loaded at. |
67 | * On ppc32 we compile with -mrelocatable, which means that references | 67 | * On ppc32 we compile with -mrelocatable, which means that references |
68 | * to extern and static variables get relocated automatically. | 68 | * to extern and static variables get relocated automatically. |
69 | * On ppc64 we have to relocate the references explicitly with | 69 | * ppc64 objects are always relocatable, we just need to relocate the |
70 | * RELOC. (Note that strings count as static variables.) | 70 | * TOC. |
71 | * | 71 | * |
72 | * Because OF may have mapped I/O devices into the area starting at | 72 | * Because OF may have mapped I/O devices into the area starting at |
73 | * KERNELBASE, particularly on CHRP machines, we can't safely call | 73 | * KERNELBASE, particularly on CHRP machines, we can't safely call |
@@ -79,13 +79,11 @@ | |||
79 | * On ppc64, 64 bit values are truncated to 32 bits (and | 79 | * On ppc64, 64 bit values are truncated to 32 bits (and |
80 | * fortunately don't get interpreted as two arguments). | 80 | * fortunately don't get interpreted as two arguments). |
81 | */ | 81 | */ |
82 | #define ADDR(x) (u32)(unsigned long)(x) | ||
83 | |||
82 | #ifdef CONFIG_PPC64 | 84 | #ifdef CONFIG_PPC64 |
83 | #define RELOC(x) (*PTRRELOC(&(x))) | ||
84 | #define ADDR(x) (u32) add_reloc_offset((unsigned long)(x)) | ||
85 | #define OF_WORKAROUNDS 0 | 85 | #define OF_WORKAROUNDS 0 |
86 | #else | 86 | #else |
87 | #define RELOC(x) (x) | ||
88 | #define ADDR(x) (u32) (x) | ||
89 | #define OF_WORKAROUNDS of_workarounds | 87 | #define OF_WORKAROUNDS of_workarounds |
90 | int of_workarounds; | 88 | int of_workarounds; |
91 | #endif | 89 | #endif |
@@ -95,7 +93,7 @@ int of_workarounds; | |||
95 | 93 | ||
96 | #define PROM_BUG() do { \ | 94 | #define PROM_BUG() do { \ |
97 | prom_printf("kernel BUG at %s line 0x%x!\n", \ | 95 | prom_printf("kernel BUG at %s line 0x%x!\n", \ |
98 | RELOC(__FILE__), __LINE__); \ | 96 | __FILE__, __LINE__); \ |
99 | __asm__ __volatile__(".long " BUG_ILLEGAL_INSTR); \ | 97 | __asm__ __volatile__(".long " BUG_ILLEGAL_INSTR); \ |
100 | } while (0) | 98 | } while (0) |
101 | 99 | ||
@@ -233,7 +231,7 @@ static int __init call_prom(const char *service, int nargs, int nret, ...) | |||
233 | for (i = 0; i < nret; i++) | 231 | for (i = 0; i < nret; i++) |
234 | args.args[nargs+i] = 0; | 232 | args.args[nargs+i] = 0; |
235 | 233 | ||
236 | if (enter_prom(&args, RELOC(prom_entry)) < 0) | 234 | if (enter_prom(&args, prom_entry) < 0) |
237 | return PROM_ERROR; | 235 | return PROM_ERROR; |
238 | 236 | ||
239 | return (nret > 0) ? args.args[nargs] : 0; | 237 | return (nret > 0) ? args.args[nargs] : 0; |
@@ -258,7 +256,7 @@ static int __init call_prom_ret(const char *service, int nargs, int nret, | |||
258 | for (i = 0; i < nret; i++) | 256 | for (i = 0; i < nret; i++) |
259 | args.args[nargs+i] = 0; | 257 | args.args[nargs+i] = 0; |
260 | 258 | ||
261 | if (enter_prom(&args, RELOC(prom_entry)) < 0) | 259 | if (enter_prom(&args, prom_entry) < 0) |
262 | return PROM_ERROR; | 260 | return PROM_ERROR; |
263 | 261 | ||
264 | if (rets != NULL) | 262 | if (rets != NULL) |
@@ -272,20 +270,19 @@ static int __init call_prom_ret(const char *service, int nargs, int nret, | |||
272 | static void __init prom_print(const char *msg) | 270 | static void __init prom_print(const char *msg) |
273 | { | 271 | { |
274 | const char *p, *q; | 272 | const char *p, *q; |
275 | struct prom_t *_prom = &RELOC(prom); | ||
276 | 273 | ||
277 | if (_prom->stdout == 0) | 274 | if (prom.stdout == 0) |
278 | return; | 275 | return; |
279 | 276 | ||
280 | for (p = msg; *p != 0; p = q) { | 277 | for (p = msg; *p != 0; p = q) { |
281 | for (q = p; *q != 0 && *q != '\n'; ++q) | 278 | for (q = p; *q != 0 && *q != '\n'; ++q) |
282 | ; | 279 | ; |
283 | if (q > p) | 280 | if (q > p) |
284 | call_prom("write", 3, 1, _prom->stdout, p, q - p); | 281 | call_prom("write", 3, 1, prom.stdout, p, q - p); |
285 | if (*q == 0) | 282 | if (*q == 0) |
286 | break; | 283 | break; |
287 | ++q; | 284 | ++q; |
288 | call_prom("write", 3, 1, _prom->stdout, ADDR("\r\n"), 2); | 285 | call_prom("write", 3, 1, prom.stdout, ADDR("\r\n"), 2); |
289 | } | 286 | } |
290 | } | 287 | } |
291 | 288 | ||
@@ -294,7 +291,6 @@ static void __init prom_print_hex(unsigned long val) | |||
294 | { | 291 | { |
295 | int i, nibbles = sizeof(val)*2; | 292 | int i, nibbles = sizeof(val)*2; |
296 | char buf[sizeof(val)*2+1]; | 293 | char buf[sizeof(val)*2+1]; |
297 | struct prom_t *_prom = &RELOC(prom); | ||
298 | 294 | ||
299 | for (i = nibbles-1; i >= 0; i--) { | 295 | for (i = nibbles-1; i >= 0; i--) { |
300 | buf[i] = (val & 0xf) + '0'; | 296 | buf[i] = (val & 0xf) + '0'; |
@@ -303,7 +299,7 @@ static void __init prom_print_hex(unsigned long val) | |||
303 | val >>= 4; | 299 | val >>= 4; |
304 | } | 300 | } |
305 | buf[nibbles] = '\0'; | 301 | buf[nibbles] = '\0'; |
306 | call_prom("write", 3, 1, _prom->stdout, buf, nibbles); | 302 | call_prom("write", 3, 1, prom.stdout, buf, nibbles); |
307 | } | 303 | } |
308 | 304 | ||
309 | /* max number of decimal digits in an unsigned long */ | 305 | /* max number of decimal digits in an unsigned long */ |
@@ -312,7 +308,6 @@ static void __init prom_print_dec(unsigned long val) | |||
312 | { | 308 | { |
313 | int i, size; | 309 | int i, size; |
314 | char buf[UL_DIGITS+1]; | 310 | char buf[UL_DIGITS+1]; |
315 | struct prom_t *_prom = &RELOC(prom); | ||
316 | 311 | ||
317 | for (i = UL_DIGITS-1; i >= 0; i--) { | 312 | for (i = UL_DIGITS-1; i >= 0; i--) { |
318 | buf[i] = (val % 10) + '0'; | 313 | buf[i] = (val % 10) + '0'; |
@@ -322,7 +317,7 @@ static void __init prom_print_dec(unsigned long val) | |||
322 | } | 317 | } |
323 | /* shift stuff down */ | 318 | /* shift stuff down */ |
324 | size = UL_DIGITS - i; | 319 | size = UL_DIGITS - i; |
325 | call_prom("write", 3, 1, _prom->stdout, buf+i, size); | 320 | call_prom("write", 3, 1, prom.stdout, buf+i, size); |
326 | } | 321 | } |
327 | 322 | ||
328 | static void __init prom_printf(const char *format, ...) | 323 | static void __init prom_printf(const char *format, ...) |
@@ -331,22 +326,18 @@ static void __init prom_printf(const char *format, ...) | |||
331 | va_list args; | 326 | va_list args; |
332 | unsigned long v; | 327 | unsigned long v; |
333 | long vs; | 328 | long vs; |
334 | struct prom_t *_prom = &RELOC(prom); | ||
335 | 329 | ||
336 | va_start(args, format); | 330 | va_start(args, format); |
337 | #ifdef CONFIG_PPC64 | ||
338 | format = PTRRELOC(format); | ||
339 | #endif | ||
340 | for (p = format; *p != 0; p = q) { | 331 | for (p = format; *p != 0; p = q) { |
341 | for (q = p; *q != 0 && *q != '\n' && *q != '%'; ++q) | 332 | for (q = p; *q != 0 && *q != '\n' && *q != '%'; ++q) |
342 | ; | 333 | ; |
343 | if (q > p) | 334 | if (q > p) |
344 | call_prom("write", 3, 1, _prom->stdout, p, q - p); | 335 | call_prom("write", 3, 1, prom.stdout, p, q - p); |
345 | if (*q == 0) | 336 | if (*q == 0) |
346 | break; | 337 | break; |
347 | if (*q == '\n') { | 338 | if (*q == '\n') { |
348 | ++q; | 339 | ++q; |
349 | call_prom("write", 3, 1, _prom->stdout, | 340 | call_prom("write", 3, 1, prom.stdout, |
350 | ADDR("\r\n"), 2); | 341 | ADDR("\r\n"), 2); |
351 | continue; | 342 | continue; |
352 | } | 343 | } |
@@ -368,7 +359,7 @@ static void __init prom_printf(const char *format, ...) | |||
368 | ++q; | 359 | ++q; |
369 | vs = va_arg(args, int); | 360 | vs = va_arg(args, int); |
370 | if (vs < 0) { | 361 | if (vs < 0) { |
371 | prom_print(RELOC("-")); | 362 | prom_print("-"); |
372 | vs = -vs; | 363 | vs = -vs; |
373 | } | 364 | } |
374 | prom_print_dec(vs); | 365 | prom_print_dec(vs); |
@@ -389,7 +380,7 @@ static void __init prom_printf(const char *format, ...) | |||
389 | ++q; | 380 | ++q; |
390 | vs = va_arg(args, long); | 381 | vs = va_arg(args, long); |
391 | if (vs < 0) { | 382 | if (vs < 0) { |
392 | prom_print(RELOC("-")); | 383 | prom_print("-"); |
393 | vs = -vs; | 384 | vs = -vs; |
394 | } | 385 | } |
395 | prom_print_dec(vs); | 386 | prom_print_dec(vs); |
@@ -403,7 +394,6 @@ static void __init prom_printf(const char *format, ...) | |||
403 | static unsigned int __init prom_claim(unsigned long virt, unsigned long size, | 394 | static unsigned int __init prom_claim(unsigned long virt, unsigned long size, |
404 | unsigned long align) | 395 | unsigned long align) |
405 | { | 396 | { |
406 | struct prom_t *_prom = &RELOC(prom); | ||
407 | 397 | ||
408 | if (align == 0 && (OF_WORKAROUNDS & OF_WA_CLAIM)) { | 398 | if (align == 0 && (OF_WORKAROUNDS & OF_WA_CLAIM)) { |
409 | /* | 399 | /* |
@@ -414,21 +404,21 @@ static unsigned int __init prom_claim(unsigned long virt, unsigned long size, | |||
414 | prom_arg_t result; | 404 | prom_arg_t result; |
415 | 405 | ||
416 | ret = call_prom_ret("call-method", 5, 2, &result, | 406 | ret = call_prom_ret("call-method", 5, 2, &result, |
417 | ADDR("claim"), _prom->memory, | 407 | ADDR("claim"), prom.memory, |
418 | align, size, virt); | 408 | align, size, virt); |
419 | if (ret != 0 || result == -1) | 409 | if (ret != 0 || result == -1) |
420 | return -1; | 410 | return -1; |
421 | ret = call_prom_ret("call-method", 5, 2, &result, | 411 | ret = call_prom_ret("call-method", 5, 2, &result, |
422 | ADDR("claim"), _prom->mmumap, | 412 | ADDR("claim"), prom.mmumap, |
423 | align, size, virt); | 413 | align, size, virt); |
424 | if (ret != 0) { | 414 | if (ret != 0) { |
425 | call_prom("call-method", 4, 1, ADDR("release"), | 415 | call_prom("call-method", 4, 1, ADDR("release"), |
426 | _prom->memory, size, virt); | 416 | prom.memory, size, virt); |
427 | return -1; | 417 | return -1; |
428 | } | 418 | } |
429 | /* the 0x12 is M (coherence) + PP == read/write */ | 419 | /* the 0x12 is M (coherence) + PP == read/write */ |
430 | call_prom("call-method", 6, 1, | 420 | call_prom("call-method", 6, 1, |
431 | ADDR("map"), _prom->mmumap, 0x12, size, virt, virt); | 421 | ADDR("map"), prom.mmumap, 0x12, size, virt, virt); |
432 | return virt; | 422 | return virt; |
433 | } | 423 | } |
434 | return call_prom("claim", 3, 1, (prom_arg_t)virt, (prom_arg_t)size, | 424 | return call_prom("claim", 3, 1, (prom_arg_t)virt, (prom_arg_t)size, |
@@ -437,13 +427,10 @@ static unsigned int __init prom_claim(unsigned long virt, unsigned long size, | |||
437 | 427 | ||
438 | static void __init __attribute__((noreturn)) prom_panic(const char *reason) | 428 | static void __init __attribute__((noreturn)) prom_panic(const char *reason) |
439 | { | 429 | { |
440 | #ifdef CONFIG_PPC64 | ||
441 | reason = PTRRELOC(reason); | ||
442 | #endif | ||
443 | prom_print(reason); | 430 | prom_print(reason); |
444 | /* Do not call exit because it clears the screen on pmac | 431 | /* Do not call exit because it clears the screen on pmac |
445 | * it also causes some sort of double-fault on early pmacs */ | 432 | * it also causes some sort of double-fault on early pmacs */ |
446 | if (RELOC(of_platform) == PLATFORM_POWERMAC) | 433 | if (of_platform == PLATFORM_POWERMAC) |
447 | asm("trap\n"); | 434 | asm("trap\n"); |
448 | 435 | ||
449 | /* ToDo: should put up an SRC here on pSeries */ | 436 | /* ToDo: should put up an SRC here on pSeries */ |
@@ -525,13 +512,13 @@ static int __init prom_setprop(phandle node, const char *nodename, | |||
525 | add_string(&p, tohex((u32)(unsigned long) value)); | 512 | add_string(&p, tohex((u32)(unsigned long) value)); |
526 | add_string(&p, tohex(valuelen)); | 513 | add_string(&p, tohex(valuelen)); |
527 | add_string(&p, tohex(ADDR(pname))); | 514 | add_string(&p, tohex(ADDR(pname))); |
528 | add_string(&p, tohex(strlen(RELOC(pname)))); | 515 | add_string(&p, tohex(strlen(pname))); |
529 | add_string(&p, "property"); | 516 | add_string(&p, "property"); |
530 | *p = 0; | 517 | *p = 0; |
531 | return call_prom("interpret", 1, 1, (u32)(unsigned long) cmd); | 518 | return call_prom("interpret", 1, 1, (u32)(unsigned long) cmd); |
532 | } | 519 | } |
533 | 520 | ||
534 | /* We can't use the standard versions because of RELOC headaches. */ | 521 | /* We can't use the standard versions because of relocation headaches. */ |
535 | #define isxdigit(c) (('0' <= (c) && (c) <= '9') \ | 522 | #define isxdigit(c) (('0' <= (c) && (c) <= '9') \ |
536 | || ('a' <= (c) && (c) <= 'f') \ | 523 | || ('a' <= (c) && (c) <= 'f') \ |
537 | || ('A' <= (c) && (c) <= 'F')) | 524 | || ('A' <= (c) && (c) <= 'F')) |
@@ -598,43 +585,42 @@ unsigned long prom_memparse(const char *ptr, const char **retptr) | |||
598 | */ | 585 | */ |
599 | static void __init early_cmdline_parse(void) | 586 | static void __init early_cmdline_parse(void) |
600 | { | 587 | { |
601 | struct prom_t *_prom = &RELOC(prom); | ||
602 | const char *opt; | 588 | const char *opt; |
603 | 589 | ||
604 | char *p; | 590 | char *p; |
605 | int l = 0; | 591 | int l = 0; |
606 | 592 | ||
607 | RELOC(prom_cmd_line[0]) = 0; | 593 | prom_cmd_line[0] = 0; |
608 | p = RELOC(prom_cmd_line); | 594 | p = prom_cmd_line; |
609 | if ((long)_prom->chosen > 0) | 595 | if ((long)prom.chosen > 0) |
610 | l = prom_getprop(_prom->chosen, "bootargs", p, COMMAND_LINE_SIZE-1); | 596 | l = prom_getprop(prom.chosen, "bootargs", p, COMMAND_LINE_SIZE-1); |
611 | #ifdef CONFIG_CMDLINE | 597 | #ifdef CONFIG_CMDLINE |
612 | if (l <= 0 || p[0] == '\0') /* dbl check */ | 598 | if (l <= 0 || p[0] == '\0') /* dbl check */ |
613 | strlcpy(RELOC(prom_cmd_line), | 599 | strlcpy(prom_cmd_line, |
614 | RELOC(CONFIG_CMDLINE), sizeof(prom_cmd_line)); | 600 | CONFIG_CMDLINE, sizeof(prom_cmd_line)); |
615 | #endif /* CONFIG_CMDLINE */ | 601 | #endif /* CONFIG_CMDLINE */ |
616 | prom_printf("command line: %s\n", RELOC(prom_cmd_line)); | 602 | prom_printf("command line: %s\n", prom_cmd_line); |
617 | 603 | ||
618 | #ifdef CONFIG_PPC64 | 604 | #ifdef CONFIG_PPC64 |
619 | opt = strstr(RELOC(prom_cmd_line), RELOC("iommu=")); | 605 | opt = strstr(prom_cmd_line, "iommu="); |
620 | if (opt) { | 606 | if (opt) { |
621 | prom_printf("iommu opt is: %s\n", opt); | 607 | prom_printf("iommu opt is: %s\n", opt); |
622 | opt += 6; | 608 | opt += 6; |
623 | while (*opt && *opt == ' ') | 609 | while (*opt && *opt == ' ') |
624 | opt++; | 610 | opt++; |
625 | if (!strncmp(opt, RELOC("off"), 3)) | 611 | if (!strncmp(opt, "off", 3)) |
626 | RELOC(prom_iommu_off) = 1; | 612 | prom_iommu_off = 1; |
627 | else if (!strncmp(opt, RELOC("force"), 5)) | 613 | else if (!strncmp(opt, "force", 5)) |
628 | RELOC(prom_iommu_force_on) = 1; | 614 | prom_iommu_force_on = 1; |
629 | } | 615 | } |
630 | #endif | 616 | #endif |
631 | opt = strstr(RELOC(prom_cmd_line), RELOC("mem=")); | 617 | opt = strstr(prom_cmd_line, "mem="); |
632 | if (opt) { | 618 | if (opt) { |
633 | opt += 4; | 619 | opt += 4; |
634 | RELOC(prom_memory_limit) = prom_memparse(opt, (const char **)&opt); | 620 | prom_memory_limit = prom_memparse(opt, (const char **)&opt); |
635 | #ifdef CONFIG_PPC64 | 621 | #ifdef CONFIG_PPC64 |
636 | /* Align to 16 MB == size of ppc64 large page */ | 622 | /* Align to 16 MB == size of ppc64 large page */ |
637 | RELOC(prom_memory_limit) = ALIGN(RELOC(prom_memory_limit), 0x1000000); | 623 | prom_memory_limit = ALIGN(prom_memory_limit, 0x1000000); |
638 | #endif | 624 | #endif |
639 | } | 625 | } |
640 | } | 626 | } |
@@ -887,7 +873,7 @@ static int __init prom_count_smt_threads(void) | |||
887 | type[0] = 0; | 873 | type[0] = 0; |
888 | prom_getprop(node, "device_type", type, sizeof(type)); | 874 | prom_getprop(node, "device_type", type, sizeof(type)); |
889 | 875 | ||
890 | if (strcmp(type, RELOC("cpu"))) | 876 | if (strcmp(type, "cpu")) |
891 | continue; | 877 | continue; |
892 | /* | 878 | /* |
893 | * There is an entry for each smt thread, each entry being | 879 | * There is an entry for each smt thread, each entry being |
@@ -929,7 +915,7 @@ static void __init prom_send_capabilities(void) | |||
929 | * (we assume this is the same for all cores) and use it to | 915 | * (we assume this is the same for all cores) and use it to |
930 | * divide NR_CPUS. | 916 | * divide NR_CPUS. |
931 | */ | 917 | */ |
932 | cores = (u32 *)PTRRELOC(&ibm_architecture_vec[IBM_ARCH_VEC_NRCORES_OFFSET]); | 918 | cores = (u32 *)&ibm_architecture_vec[IBM_ARCH_VEC_NRCORES_OFFSET]; |
933 | if (*cores != NR_CPUS) { | 919 | if (*cores != NR_CPUS) { |
934 | prom_printf("WARNING ! " | 920 | prom_printf("WARNING ! " |
935 | "ibm_architecture_vec structure inconsistent: %lu!\n", | 921 | "ibm_architecture_vec structure inconsistent: %lu!\n", |
@@ -1005,21 +991,21 @@ static void __init prom_send_capabilities(void) | |||
1005 | */ | 991 | */ |
1006 | static unsigned long __init alloc_up(unsigned long size, unsigned long align) | 992 | static unsigned long __init alloc_up(unsigned long size, unsigned long align) |
1007 | { | 993 | { |
1008 | unsigned long base = RELOC(alloc_bottom); | 994 | unsigned long base = alloc_bottom; |
1009 | unsigned long addr = 0; | 995 | unsigned long addr = 0; |
1010 | 996 | ||
1011 | if (align) | 997 | if (align) |
1012 | base = _ALIGN_UP(base, align); | 998 | base = _ALIGN_UP(base, align); |
1013 | prom_debug("alloc_up(%x, %x)\n", size, align); | 999 | prom_debug("alloc_up(%x, %x)\n", size, align); |
1014 | if (RELOC(ram_top) == 0) | 1000 | if (ram_top == 0) |
1015 | prom_panic("alloc_up() called with mem not initialized\n"); | 1001 | prom_panic("alloc_up() called with mem not initialized\n"); |
1016 | 1002 | ||
1017 | if (align) | 1003 | if (align) |
1018 | base = _ALIGN_UP(RELOC(alloc_bottom), align); | 1004 | base = _ALIGN_UP(alloc_bottom, align); |
1019 | else | 1005 | else |
1020 | base = RELOC(alloc_bottom); | 1006 | base = alloc_bottom; |
1021 | 1007 | ||
1022 | for(; (base + size) <= RELOC(alloc_top); | 1008 | for(; (base + size) <= alloc_top; |
1023 | base = _ALIGN_UP(base + 0x100000, align)) { | 1009 | base = _ALIGN_UP(base + 0x100000, align)) { |
1024 | prom_debug(" trying: 0x%x\n\r", base); | 1010 | prom_debug(" trying: 0x%x\n\r", base); |
1025 | addr = (unsigned long)prom_claim(base, size, 0); | 1011 | addr = (unsigned long)prom_claim(base, size, 0); |
@@ -1031,14 +1017,14 @@ static unsigned long __init alloc_up(unsigned long size, unsigned long align) | |||
1031 | } | 1017 | } |
1032 | if (addr == 0) | 1018 | if (addr == 0) |
1033 | return 0; | 1019 | return 0; |
1034 | RELOC(alloc_bottom) = addr + size; | 1020 | alloc_bottom = addr + size; |
1035 | 1021 | ||
1036 | prom_debug(" -> %x\n", addr); | 1022 | prom_debug(" -> %x\n", addr); |
1037 | prom_debug(" alloc_bottom : %x\n", RELOC(alloc_bottom)); | 1023 | prom_debug(" alloc_bottom : %x\n", alloc_bottom); |
1038 | prom_debug(" alloc_top : %x\n", RELOC(alloc_top)); | 1024 | prom_debug(" alloc_top : %x\n", alloc_top); |
1039 | prom_debug(" alloc_top_hi : %x\n", RELOC(alloc_top_high)); | 1025 | prom_debug(" alloc_top_hi : %x\n", alloc_top_high); |
1040 | prom_debug(" rmo_top : %x\n", RELOC(rmo_top)); | 1026 | prom_debug(" rmo_top : %x\n", rmo_top); |
1041 | prom_debug(" ram_top : %x\n", RELOC(ram_top)); | 1027 | prom_debug(" ram_top : %x\n", ram_top); |
1042 | 1028 | ||
1043 | return addr; | 1029 | return addr; |
1044 | } | 1030 | } |
@@ -1054,32 +1040,32 @@ static unsigned long __init alloc_down(unsigned long size, unsigned long align, | |||
1054 | unsigned long base, addr = 0; | 1040 | unsigned long base, addr = 0; |
1055 | 1041 | ||
1056 | prom_debug("alloc_down(%x, %x, %s)\n", size, align, | 1042 | prom_debug("alloc_down(%x, %x, %s)\n", size, align, |
1057 | highmem ? RELOC("(high)") : RELOC("(low)")); | 1043 | highmem ? "(high)" : "(low)"); |
1058 | if (RELOC(ram_top) == 0) | 1044 | if (ram_top == 0) |
1059 | prom_panic("alloc_down() called with mem not initialized\n"); | 1045 | prom_panic("alloc_down() called with mem not initialized\n"); |
1060 | 1046 | ||
1061 | if (highmem) { | 1047 | if (highmem) { |
1062 | /* Carve out storage for the TCE table. */ | 1048 | /* Carve out storage for the TCE table. */ |
1063 | addr = _ALIGN_DOWN(RELOC(alloc_top_high) - size, align); | 1049 | addr = _ALIGN_DOWN(alloc_top_high - size, align); |
1064 | if (addr <= RELOC(alloc_bottom)) | 1050 | if (addr <= alloc_bottom) |
1065 | return 0; | 1051 | return 0; |
1066 | /* Will we bump into the RMO ? If yes, check out that we | 1052 | /* Will we bump into the RMO ? If yes, check out that we |
1067 | * didn't overlap existing allocations there, if we did, | 1053 | * didn't overlap existing allocations there, if we did, |
1068 | * we are dead, we must be the first in town ! | 1054 | * we are dead, we must be the first in town ! |
1069 | */ | 1055 | */ |
1070 | if (addr < RELOC(rmo_top)) { | 1056 | if (addr < rmo_top) { |
1071 | /* Good, we are first */ | 1057 | /* Good, we are first */ |
1072 | if (RELOC(alloc_top) == RELOC(rmo_top)) | 1058 | if (alloc_top == rmo_top) |
1073 | RELOC(alloc_top) = RELOC(rmo_top) = addr; | 1059 | alloc_top = rmo_top = addr; |
1074 | else | 1060 | else |
1075 | return 0; | 1061 | return 0; |
1076 | } | 1062 | } |
1077 | RELOC(alloc_top_high) = addr; | 1063 | alloc_top_high = addr; |
1078 | goto bail; | 1064 | goto bail; |
1079 | } | 1065 | } |
1080 | 1066 | ||
1081 | base = _ALIGN_DOWN(RELOC(alloc_top) - size, align); | 1067 | base = _ALIGN_DOWN(alloc_top - size, align); |
1082 | for (; base > RELOC(alloc_bottom); | 1068 | for (; base > alloc_bottom; |
1083 | base = _ALIGN_DOWN(base - 0x100000, align)) { | 1069 | base = _ALIGN_DOWN(base - 0x100000, align)) { |
1084 | prom_debug(" trying: 0x%x\n\r", base); | 1070 | prom_debug(" trying: 0x%x\n\r", base); |
1085 | addr = (unsigned long)prom_claim(base, size, 0); | 1071 | addr = (unsigned long)prom_claim(base, size, 0); |
@@ -1089,15 +1075,15 @@ static unsigned long __init alloc_down(unsigned long size, unsigned long align, | |||
1089 | } | 1075 | } |
1090 | if (addr == 0) | 1076 | if (addr == 0) |
1091 | return 0; | 1077 | return 0; |
1092 | RELOC(alloc_top) = addr; | 1078 | alloc_top = addr; |
1093 | 1079 | ||
1094 | bail: | 1080 | bail: |
1095 | prom_debug(" -> %x\n", addr); | 1081 | prom_debug(" -> %x\n", addr); |
1096 | prom_debug(" alloc_bottom : %x\n", RELOC(alloc_bottom)); | 1082 | prom_debug(" alloc_bottom : %x\n", alloc_bottom); |
1097 | prom_debug(" alloc_top : %x\n", RELOC(alloc_top)); | 1083 | prom_debug(" alloc_top : %x\n", alloc_top); |
1098 | prom_debug(" alloc_top_hi : %x\n", RELOC(alloc_top_high)); | 1084 | prom_debug(" alloc_top_hi : %x\n", alloc_top_high); |
1099 | prom_debug(" rmo_top : %x\n", RELOC(rmo_top)); | 1085 | prom_debug(" rmo_top : %x\n", rmo_top); |
1100 | prom_debug(" ram_top : %x\n", RELOC(ram_top)); | 1086 | prom_debug(" ram_top : %x\n", ram_top); |
1101 | 1087 | ||
1102 | return addr; | 1088 | return addr; |
1103 | } | 1089 | } |
@@ -1137,7 +1123,7 @@ static unsigned long __init prom_next_cell(int s, cell_t **cellp) | |||
1137 | static void __init reserve_mem(u64 base, u64 size) | 1123 | static void __init reserve_mem(u64 base, u64 size) |
1138 | { | 1124 | { |
1139 | u64 top = base + size; | 1125 | u64 top = base + size; |
1140 | unsigned long cnt = RELOC(mem_reserve_cnt); | 1126 | unsigned long cnt = mem_reserve_cnt; |
1141 | 1127 | ||
1142 | if (size == 0) | 1128 | if (size == 0) |
1143 | return; | 1129 | return; |
@@ -1152,9 +1138,9 @@ static void __init reserve_mem(u64 base, u64 size) | |||
1152 | 1138 | ||
1153 | if (cnt >= (MEM_RESERVE_MAP_SIZE - 1)) | 1139 | if (cnt >= (MEM_RESERVE_MAP_SIZE - 1)) |
1154 | prom_panic("Memory reserve map exhausted !\n"); | 1140 | prom_panic("Memory reserve map exhausted !\n"); |
1155 | RELOC(mem_reserve_map)[cnt].base = base; | 1141 | mem_reserve_map[cnt].base = base; |
1156 | RELOC(mem_reserve_map)[cnt].size = size; | 1142 | mem_reserve_map[cnt].size = size; |
1157 | RELOC(mem_reserve_cnt) = cnt + 1; | 1143 | mem_reserve_cnt = cnt + 1; |
1158 | } | 1144 | } |
1159 | 1145 | ||
1160 | /* | 1146 | /* |
@@ -1167,7 +1153,6 @@ static void __init prom_init_mem(void) | |||
1167 | char *path, type[64]; | 1153 | char *path, type[64]; |
1168 | unsigned int plen; | 1154 | unsigned int plen; |
1169 | cell_t *p, *endp; | 1155 | cell_t *p, *endp; |
1170 | struct prom_t *_prom = &RELOC(prom); | ||
1171 | u32 rac, rsc; | 1156 | u32 rac, rsc; |
1172 | 1157 | ||
1173 | /* | 1158 | /* |
@@ -1176,14 +1161,14 @@ static void __init prom_init_mem(void) | |||
1176 | * 2) top of memory | 1161 | * 2) top of memory |
1177 | */ | 1162 | */ |
1178 | rac = 2; | 1163 | rac = 2; |
1179 | prom_getprop(_prom->root, "#address-cells", &rac, sizeof(rac)); | 1164 | prom_getprop(prom.root, "#address-cells", &rac, sizeof(rac)); |
1180 | rsc = 1; | 1165 | rsc = 1; |
1181 | prom_getprop(_prom->root, "#size-cells", &rsc, sizeof(rsc)); | 1166 | prom_getprop(prom.root, "#size-cells", &rsc, sizeof(rsc)); |
1182 | prom_debug("root_addr_cells: %x\n", (unsigned long) rac); | 1167 | prom_debug("root_addr_cells: %x\n", (unsigned long) rac); |
1183 | prom_debug("root_size_cells: %x\n", (unsigned long) rsc); | 1168 | prom_debug("root_size_cells: %x\n", (unsigned long) rsc); |
1184 | 1169 | ||
1185 | prom_debug("scanning memory:\n"); | 1170 | prom_debug("scanning memory:\n"); |
1186 | path = RELOC(prom_scratch); | 1171 | path = prom_scratch; |
1187 | 1172 | ||
1188 | for (node = 0; prom_next_node(&node); ) { | 1173 | for (node = 0; prom_next_node(&node); ) { |
1189 | type[0] = 0; | 1174 | type[0] = 0; |
@@ -1196,15 +1181,15 @@ static void __init prom_init_mem(void) | |||
1196 | */ | 1181 | */ |
1197 | prom_getprop(node, "name", type, sizeof(type)); | 1182 | prom_getprop(node, "name", type, sizeof(type)); |
1198 | } | 1183 | } |
1199 | if (strcmp(type, RELOC("memory"))) | 1184 | if (strcmp(type, "memory")) |
1200 | continue; | 1185 | continue; |
1201 | 1186 | ||
1202 | plen = prom_getprop(node, "reg", RELOC(regbuf), sizeof(regbuf)); | 1187 | plen = prom_getprop(node, "reg", regbuf, sizeof(regbuf)); |
1203 | if (plen > sizeof(regbuf)) { | 1188 | if (plen > sizeof(regbuf)) { |
1204 | prom_printf("memory node too large for buffer !\n"); | 1189 | prom_printf("memory node too large for buffer !\n"); |
1205 | plen = sizeof(regbuf); | 1190 | plen = sizeof(regbuf); |
1206 | } | 1191 | } |
1207 | p = RELOC(regbuf); | 1192 | p = regbuf; |
1208 | endp = p + (plen / sizeof(cell_t)); | 1193 | endp = p + (plen / sizeof(cell_t)); |
1209 | 1194 | ||
1210 | #ifdef DEBUG_PROM | 1195 | #ifdef DEBUG_PROM |
@@ -1222,14 +1207,14 @@ static void __init prom_init_mem(void) | |||
1222 | if (size == 0) | 1207 | if (size == 0) |
1223 | continue; | 1208 | continue; |
1224 | prom_debug(" %x %x\n", base, size); | 1209 | prom_debug(" %x %x\n", base, size); |
1225 | if (base == 0 && (RELOC(of_platform) & PLATFORM_LPAR)) | 1210 | if (base == 0 && (of_platform & PLATFORM_LPAR)) |
1226 | RELOC(rmo_top) = size; | 1211 | rmo_top = size; |
1227 | if ((base + size) > RELOC(ram_top)) | 1212 | if ((base + size) > ram_top) |
1228 | RELOC(ram_top) = base + size; | 1213 | ram_top = base + size; |
1229 | } | 1214 | } |
1230 | } | 1215 | } |
1231 | 1216 | ||
1232 | RELOC(alloc_bottom) = PAGE_ALIGN((unsigned long)&RELOC(_end) + 0x4000); | 1217 | alloc_bottom = PAGE_ALIGN((unsigned long)&_end + 0x4000); |
1233 | 1218 | ||
1234 | /* | 1219 | /* |
1235 | * If prom_memory_limit is set we reduce the upper limits *except* for | 1220 | * If prom_memory_limit is set we reduce the upper limits *except* for |
@@ -1237,20 +1222,20 @@ static void __init prom_init_mem(void) | |||
1237 | * TCE's up there. | 1222 | * TCE's up there. |
1238 | */ | 1223 | */ |
1239 | 1224 | ||
1240 | RELOC(alloc_top_high) = RELOC(ram_top); | 1225 | alloc_top_high = ram_top; |
1241 | 1226 | ||
1242 | if (RELOC(prom_memory_limit)) { | 1227 | if (prom_memory_limit) { |
1243 | if (RELOC(prom_memory_limit) <= RELOC(alloc_bottom)) { | 1228 | if (prom_memory_limit <= alloc_bottom) { |
1244 | prom_printf("Ignoring mem=%x <= alloc_bottom.\n", | 1229 | prom_printf("Ignoring mem=%x <= alloc_bottom.\n", |
1245 | RELOC(prom_memory_limit)); | 1230 | prom_memory_limit); |
1246 | RELOC(prom_memory_limit) = 0; | 1231 | prom_memory_limit = 0; |
1247 | } else if (RELOC(prom_memory_limit) >= RELOC(ram_top)) { | 1232 | } else if (prom_memory_limit >= ram_top) { |
1248 | prom_printf("Ignoring mem=%x >= ram_top.\n", | 1233 | prom_printf("Ignoring mem=%x >= ram_top.\n", |
1249 | RELOC(prom_memory_limit)); | 1234 | prom_memory_limit); |
1250 | RELOC(prom_memory_limit) = 0; | 1235 | prom_memory_limit = 0; |
1251 | } else { | 1236 | } else { |
1252 | RELOC(ram_top) = RELOC(prom_memory_limit); | 1237 | ram_top = prom_memory_limit; |
1253 | RELOC(rmo_top) = min(RELOC(rmo_top), RELOC(prom_memory_limit)); | 1238 | rmo_top = min(rmo_top, prom_memory_limit); |
1254 | } | 1239 | } |
1255 | } | 1240 | } |
1256 | 1241 | ||
@@ -1262,36 +1247,35 @@ static void __init prom_init_mem(void) | |||
1262 | * Since 768MB is plenty of room, and we need to cap to something | 1247 | * Since 768MB is plenty of room, and we need to cap to something |
1263 | * reasonable on 32-bit, cap at 768MB on all machines. | 1248 | * reasonable on 32-bit, cap at 768MB on all machines. |
1264 | */ | 1249 | */ |
1265 | if (!RELOC(rmo_top)) | 1250 | if (!rmo_top) |
1266 | RELOC(rmo_top) = RELOC(ram_top); | 1251 | rmo_top = ram_top; |
1267 | RELOC(rmo_top) = min(0x30000000ul, RELOC(rmo_top)); | 1252 | rmo_top = min(0x30000000ul, rmo_top); |
1268 | RELOC(alloc_top) = RELOC(rmo_top); | 1253 | alloc_top = rmo_top; |
1269 | RELOC(alloc_top_high) = RELOC(ram_top); | 1254 | alloc_top_high = ram_top; |
1270 | 1255 | ||
1271 | /* | 1256 | /* |
1272 | * Check if we have an initrd after the kernel but still inside | 1257 | * Check if we have an initrd after the kernel but still inside |
1273 | * the RMO. If we do move our bottom point to after it. | 1258 | * the RMO. If we do move our bottom point to after it. |
1274 | */ | 1259 | */ |
1275 | if (RELOC(prom_initrd_start) && | 1260 | if (prom_initrd_start && |
1276 | RELOC(prom_initrd_start) < RELOC(rmo_top) && | 1261 | prom_initrd_start < rmo_top && |
1277 | RELOC(prom_initrd_end) > RELOC(alloc_bottom)) | 1262 | prom_initrd_end > alloc_bottom) |
1278 | RELOC(alloc_bottom) = PAGE_ALIGN(RELOC(prom_initrd_end)); | 1263 | alloc_bottom = PAGE_ALIGN(prom_initrd_end); |
1279 | 1264 | ||
1280 | prom_printf("memory layout at init:\n"); | 1265 | prom_printf("memory layout at init:\n"); |
1281 | prom_printf(" memory_limit : %x (16 MB aligned)\n", RELOC(prom_memory_limit)); | 1266 | prom_printf(" memory_limit : %x (16 MB aligned)\n", prom_memory_limit); |
1282 | prom_printf(" alloc_bottom : %x\n", RELOC(alloc_bottom)); | 1267 | prom_printf(" alloc_bottom : %x\n", alloc_bottom); |
1283 | prom_printf(" alloc_top : %x\n", RELOC(alloc_top)); | 1268 | prom_printf(" alloc_top : %x\n", alloc_top); |
1284 | prom_printf(" alloc_top_hi : %x\n", RELOC(alloc_top_high)); | 1269 | prom_printf(" alloc_top_hi : %x\n", alloc_top_high); |
1285 | prom_printf(" rmo_top : %x\n", RELOC(rmo_top)); | 1270 | prom_printf(" rmo_top : %x\n", rmo_top); |
1286 | prom_printf(" ram_top : %x\n", RELOC(ram_top)); | 1271 | prom_printf(" ram_top : %x\n", ram_top); |
1287 | } | 1272 | } |
1288 | 1273 | ||
1289 | static void __init prom_close_stdin(void) | 1274 | static void __init prom_close_stdin(void) |
1290 | { | 1275 | { |
1291 | struct prom_t *_prom = &RELOC(prom); | ||
1292 | ihandle val; | 1276 | ihandle val; |
1293 | 1277 | ||
1294 | if (prom_getprop(_prom->chosen, "stdin", &val, sizeof(val)) > 0) | 1278 | if (prom_getprop(prom.chosen, "stdin", &val, sizeof(val)) > 0) |
1295 | call_prom("close", 1, 0, val); | 1279 | call_prom("close", 1, 0, val); |
1296 | } | 1280 | } |
1297 | 1281 | ||
@@ -1332,19 +1316,19 @@ static void __init prom_query_opal(void) | |||
1332 | } | 1316 | } |
1333 | 1317 | ||
1334 | prom_printf("Querying for OPAL presence... "); | 1318 | prom_printf("Querying for OPAL presence... "); |
1335 | rc = opal_query_takeover(&RELOC(prom_opal_size), | 1319 | rc = opal_query_takeover(&prom_opal_size, |
1336 | &RELOC(prom_opal_align)); | 1320 | &prom_opal_align); |
1337 | prom_debug("(rc = %ld) ", rc); | 1321 | prom_debug("(rc = %ld) ", rc); |
1338 | if (rc != 0) { | 1322 | if (rc != 0) { |
1339 | prom_printf("not there.\n"); | 1323 | prom_printf("not there.\n"); |
1340 | return; | 1324 | return; |
1341 | } | 1325 | } |
1342 | RELOC(of_platform) = PLATFORM_OPAL; | 1326 | of_platform = PLATFORM_OPAL; |
1343 | prom_printf(" there !\n"); | 1327 | prom_printf(" there !\n"); |
1344 | prom_debug(" opal_size = 0x%lx\n", RELOC(prom_opal_size)); | 1328 | prom_debug(" opal_size = 0x%lx\n", prom_opal_size); |
1345 | prom_debug(" opal_align = 0x%lx\n", RELOC(prom_opal_align)); | 1329 | prom_debug(" opal_align = 0x%lx\n", prom_opal_align); |
1346 | if (RELOC(prom_opal_align) < 0x10000) | 1330 | if (prom_opal_align < 0x10000) |
1347 | RELOC(prom_opal_align) = 0x10000; | 1331 | prom_opal_align = 0x10000; |
1348 | } | 1332 | } |
1349 | 1333 | ||
1350 | static int prom_rtas_call(int token, int nargs, int nret, int *outputs, ...) | 1334 | static int prom_rtas_call(int token, int nargs, int nret, int *outputs, ...) |
@@ -1365,8 +1349,8 @@ static int prom_rtas_call(int token, int nargs, int nret, int *outputs, ...) | |||
1365 | for (i = 0; i < nret; ++i) | 1349 | for (i = 0; i < nret; ++i) |
1366 | rtas_args.rets[i] = 0; | 1350 | rtas_args.rets[i] = 0; |
1367 | 1351 | ||
1368 | opal_enter_rtas(&rtas_args, RELOC(prom_rtas_data), | 1352 | opal_enter_rtas(&rtas_args, prom_rtas_data, |
1369 | RELOC(prom_rtas_entry)); | 1353 | prom_rtas_entry); |
1370 | 1354 | ||
1371 | if (nret > 1 && outputs != NULL) | 1355 | if (nret > 1 && outputs != NULL) |
1372 | for (i = 0; i < nret-1; ++i) | 1356 | for (i = 0; i < nret-1; ++i) |
@@ -1381,9 +1365,8 @@ static void __init prom_opal_hold_cpus(void) | |||
1381 | phandle node; | 1365 | phandle node; |
1382 | char type[64]; | 1366 | char type[64]; |
1383 | u32 servers[8]; | 1367 | u32 servers[8]; |
1384 | struct prom_t *_prom = &RELOC(prom); | 1368 | void *entry = (unsigned long *)&opal_secondary_entry; |
1385 | void *entry = (unsigned long *)&RELOC(opal_secondary_entry); | 1369 | struct opal_secondary_data *data = &opal_secondary_data; |
1386 | struct opal_secondary_data *data = &RELOC(opal_secondary_data); | ||
1387 | 1370 | ||
1388 | prom_debug("prom_opal_hold_cpus: start...\n"); | 1371 | prom_debug("prom_opal_hold_cpus: start...\n"); |
1389 | prom_debug(" - entry = 0x%x\n", entry); | 1372 | prom_debug(" - entry = 0x%x\n", entry); |
@@ -1396,12 +1379,12 @@ static void __init prom_opal_hold_cpus(void) | |||
1396 | for (node = 0; prom_next_node(&node); ) { | 1379 | for (node = 0; prom_next_node(&node); ) { |
1397 | type[0] = 0; | 1380 | type[0] = 0; |
1398 | prom_getprop(node, "device_type", type, sizeof(type)); | 1381 | prom_getprop(node, "device_type", type, sizeof(type)); |
1399 | if (strcmp(type, RELOC("cpu")) != 0) | 1382 | if (strcmp(type, "cpu") != 0) |
1400 | continue; | 1383 | continue; |
1401 | 1384 | ||
1402 | /* Skip non-configured cpus. */ | 1385 | /* Skip non-configured cpus. */ |
1403 | if (prom_getprop(node, "status", type, sizeof(type)) > 0) | 1386 | if (prom_getprop(node, "status", type, sizeof(type)) > 0) |
1404 | if (strcmp(type, RELOC("okay")) != 0) | 1387 | if (strcmp(type, "okay") != 0) |
1405 | continue; | 1388 | continue; |
1406 | 1389 | ||
1407 | cnt = prom_getprop(node, "ibm,ppc-interrupt-server#s", servers, | 1390 | cnt = prom_getprop(node, "ibm,ppc-interrupt-server#s", servers, |
@@ -1412,7 +1395,7 @@ static void __init prom_opal_hold_cpus(void) | |||
1412 | for (i = 0; i < cnt; i++) { | 1395 | for (i = 0; i < cnt; i++) { |
1413 | cpu = servers[i]; | 1396 | cpu = servers[i]; |
1414 | prom_debug("CPU %d ... ", cpu); | 1397 | prom_debug("CPU %d ... ", cpu); |
1415 | if (cpu == _prom->cpu) { | 1398 | if (cpu == prom.cpu) { |
1416 | prom_debug("booted !\n"); | 1399 | prom_debug("booted !\n"); |
1417 | continue; | 1400 | continue; |
1418 | } | 1401 | } |
@@ -1423,7 +1406,7 @@ static void __init prom_opal_hold_cpus(void) | |||
1423 | * spinloop. | 1406 | * spinloop. |
1424 | */ | 1407 | */ |
1425 | data->ack = -1; | 1408 | data->ack = -1; |
1426 | rc = prom_rtas_call(RELOC(prom_rtas_start_cpu), 3, 1, | 1409 | rc = prom_rtas_call(prom_rtas_start_cpu, 3, 1, |
1427 | NULL, cpu, entry, data); | 1410 | NULL, cpu, entry, data); |
1428 | prom_debug("rtas rc=%d ...", rc); | 1411 | prom_debug("rtas rc=%d ...", rc); |
1429 | 1412 | ||
@@ -1443,21 +1426,21 @@ static void __init prom_opal_hold_cpus(void) | |||
1443 | 1426 | ||
1444 | static void __init prom_opal_takeover(void) | 1427 | static void __init prom_opal_takeover(void) |
1445 | { | 1428 | { |
1446 | struct opal_secondary_data *data = &RELOC(opal_secondary_data); | 1429 | struct opal_secondary_data *data = &opal_secondary_data; |
1447 | struct opal_takeover_args *args = &data->args; | 1430 | struct opal_takeover_args *args = &data->args; |
1448 | u64 align = RELOC(prom_opal_align); | 1431 | u64 align = prom_opal_align; |
1449 | u64 top_addr, opal_addr; | 1432 | u64 top_addr, opal_addr; |
1450 | 1433 | ||
1451 | args->k_image = (u64)RELOC(_stext); | 1434 | args->k_image = (u64)_stext; |
1452 | args->k_size = _end - _stext; | 1435 | args->k_size = _end - _stext; |
1453 | args->k_entry = 0; | 1436 | args->k_entry = 0; |
1454 | args->k_entry2 = 0x60; | 1437 | args->k_entry2 = 0x60; |
1455 | 1438 | ||
1456 | top_addr = _ALIGN_UP(args->k_size, align); | 1439 | top_addr = _ALIGN_UP(args->k_size, align); |
1457 | 1440 | ||
1458 | if (RELOC(prom_initrd_start) != 0) { | 1441 | if (prom_initrd_start != 0) { |
1459 | args->rd_image = RELOC(prom_initrd_start); | 1442 | args->rd_image = prom_initrd_start; |
1460 | args->rd_size = RELOC(prom_initrd_end) - args->rd_image; | 1443 | args->rd_size = prom_initrd_end - args->rd_image; |
1461 | args->rd_loc = top_addr; | 1444 | args->rd_loc = top_addr; |
1462 | top_addr = _ALIGN_UP(args->rd_loc + args->rd_size, align); | 1445 | top_addr = _ALIGN_UP(args->rd_loc + args->rd_size, align); |
1463 | } | 1446 | } |
@@ -1469,13 +1452,13 @@ static void __init prom_opal_takeover(void) | |||
1469 | * has plenty of memory, and we ask for the HAL for now to | 1452 | * has plenty of memory, and we ask for the HAL for now to |
1470 | * be just below the 1G point, or above the initrd | 1453 | * be just below the 1G point, or above the initrd |
1471 | */ | 1454 | */ |
1472 | opal_addr = _ALIGN_DOWN(0x40000000 - RELOC(prom_opal_size), align); | 1455 | opal_addr = _ALIGN_DOWN(0x40000000 - prom_opal_size, align); |
1473 | if (opal_addr < top_addr) | 1456 | if (opal_addr < top_addr) |
1474 | opal_addr = top_addr; | 1457 | opal_addr = top_addr; |
1475 | args->hal_addr = opal_addr; | 1458 | args->hal_addr = opal_addr; |
1476 | 1459 | ||
1477 | /* Copy the command line to the kernel image */ | 1460 | /* Copy the command line to the kernel image */ |
1478 | strlcpy(RELOC(boot_command_line), RELOC(prom_cmd_line), | 1461 | strlcpy(boot_command_line, prom_cmd_line, |
1479 | COMMAND_LINE_SIZE); | 1462 | COMMAND_LINE_SIZE); |
1480 | 1463 | ||
1481 | prom_debug(" k_image = 0x%lx\n", args->k_image); | 1464 | prom_debug(" k_image = 0x%lx\n", args->k_image); |
@@ -1557,8 +1540,8 @@ static void __init prom_instantiate_opal(void) | |||
1557 | &entry, sizeof(entry)); | 1540 | &entry, sizeof(entry)); |
1558 | 1541 | ||
1559 | #ifdef CONFIG_PPC_EARLY_DEBUG_OPAL | 1542 | #ifdef CONFIG_PPC_EARLY_DEBUG_OPAL |
1560 | RELOC(prom_opal_base) = base; | 1543 | prom_opal_base = base; |
1561 | RELOC(prom_opal_entry) = entry; | 1544 | prom_opal_entry = entry; |
1562 | #endif | 1545 | #endif |
1563 | prom_debug("prom_instantiate_opal: end...\n"); | 1546 | prom_debug("prom_instantiate_opal: end...\n"); |
1564 | } | 1547 | } |
@@ -1616,9 +1599,9 @@ static void __init prom_instantiate_rtas(void) | |||
1616 | 1599 | ||
1617 | #ifdef CONFIG_PPC_POWERNV | 1600 | #ifdef CONFIG_PPC_POWERNV |
1618 | /* PowerVN takeover hack */ | 1601 | /* PowerVN takeover hack */ |
1619 | RELOC(prom_rtas_data) = base; | 1602 | prom_rtas_data = base; |
1620 | RELOC(prom_rtas_entry) = entry; | 1603 | prom_rtas_entry = entry; |
1621 | prom_getprop(rtas_node, "start-cpu", &RELOC(prom_rtas_start_cpu), 4); | 1604 | prom_getprop(rtas_node, "start-cpu", &prom_rtas_start_cpu, 4); |
1622 | #endif | 1605 | #endif |
1623 | prom_debug("rtas base = 0x%x\n", base); | 1606 | prom_debug("rtas base = 0x%x\n", base); |
1624 | prom_debug("rtas entry = 0x%x\n", entry); | 1607 | prom_debug("rtas entry = 0x%x\n", entry); |
@@ -1693,20 +1676,20 @@ static void __init prom_initialize_tce_table(void) | |||
1693 | phandle node; | 1676 | phandle node; |
1694 | ihandle phb_node; | 1677 | ihandle phb_node; |
1695 | char compatible[64], type[64], model[64]; | 1678 | char compatible[64], type[64], model[64]; |
1696 | char *path = RELOC(prom_scratch); | 1679 | char *path = prom_scratch; |
1697 | u64 base, align; | 1680 | u64 base, align; |
1698 | u32 minalign, minsize; | 1681 | u32 minalign, minsize; |
1699 | u64 tce_entry, *tce_entryp; | 1682 | u64 tce_entry, *tce_entryp; |
1700 | u64 local_alloc_top, local_alloc_bottom; | 1683 | u64 local_alloc_top, local_alloc_bottom; |
1701 | u64 i; | 1684 | u64 i; |
1702 | 1685 | ||
1703 | if (RELOC(prom_iommu_off)) | 1686 | if (prom_iommu_off) |
1704 | return; | 1687 | return; |
1705 | 1688 | ||
1706 | prom_debug("starting prom_initialize_tce_table\n"); | 1689 | prom_debug("starting prom_initialize_tce_table\n"); |
1707 | 1690 | ||
1708 | /* Cache current top of allocs so we reserve a single block */ | 1691 | /* Cache current top of allocs so we reserve a single block */ |
1709 | local_alloc_top = RELOC(alloc_top_high); | 1692 | local_alloc_top = alloc_top_high; |
1710 | local_alloc_bottom = local_alloc_top; | 1693 | local_alloc_bottom = local_alloc_top; |
1711 | 1694 | ||
1712 | /* Search all nodes looking for PHBs. */ | 1695 | /* Search all nodes looking for PHBs. */ |
@@ -1719,19 +1702,19 @@ static void __init prom_initialize_tce_table(void) | |||
1719 | prom_getprop(node, "device_type", type, sizeof(type)); | 1702 | prom_getprop(node, "device_type", type, sizeof(type)); |
1720 | prom_getprop(node, "model", model, sizeof(model)); | 1703 | prom_getprop(node, "model", model, sizeof(model)); |
1721 | 1704 | ||
1722 | if ((type[0] == 0) || (strstr(type, RELOC("pci")) == NULL)) | 1705 | if ((type[0] == 0) || (strstr(type, "pci") == NULL)) |
1723 | continue; | 1706 | continue; |
1724 | 1707 | ||
1725 | /* Keep the old logic intact to avoid regression. */ | 1708 | /* Keep the old logic intact to avoid regression. */ |
1726 | if (compatible[0] != 0) { | 1709 | if (compatible[0] != 0) { |
1727 | if ((strstr(compatible, RELOC("python")) == NULL) && | 1710 | if ((strstr(compatible, "python") == NULL) && |
1728 | (strstr(compatible, RELOC("Speedwagon")) == NULL) && | 1711 | (strstr(compatible, "Speedwagon") == NULL) && |
1729 | (strstr(compatible, RELOC("Winnipeg")) == NULL)) | 1712 | (strstr(compatible, "Winnipeg") == NULL)) |
1730 | continue; | 1713 | continue; |
1731 | } else if (model[0] != 0) { | 1714 | } else if (model[0] != 0) { |
1732 | if ((strstr(model, RELOC("ython")) == NULL) && | 1715 | if ((strstr(model, "ython") == NULL) && |
1733 | (strstr(model, RELOC("peedwagon")) == NULL) && | 1716 | (strstr(model, "peedwagon") == NULL) && |
1734 | (strstr(model, RELOC("innipeg")) == NULL)) | 1717 | (strstr(model, "innipeg") == NULL)) |
1735 | continue; | 1718 | continue; |
1736 | } | 1719 | } |
1737 | 1720 | ||
@@ -1810,8 +1793,8 @@ static void __init prom_initialize_tce_table(void) | |||
1810 | 1793 | ||
1811 | /* These are only really needed if there is a memory limit in | 1794 | /* These are only really needed if there is a memory limit in |
1812 | * effect, but we don't know so export them always. */ | 1795 | * effect, but we don't know so export them always. */ |
1813 | RELOC(prom_tce_alloc_start) = local_alloc_bottom; | 1796 | prom_tce_alloc_start = local_alloc_bottom; |
1814 | RELOC(prom_tce_alloc_end) = local_alloc_top; | 1797 | prom_tce_alloc_end = local_alloc_top; |
1815 | 1798 | ||
1816 | /* Flag the first invalid entry */ | 1799 | /* Flag the first invalid entry */ |
1817 | prom_debug("ending prom_initialize_tce_table\n"); | 1800 | prom_debug("ending prom_initialize_tce_table\n"); |
@@ -1848,7 +1831,6 @@ static void __init prom_hold_cpus(void) | |||
1848 | unsigned int reg; | 1831 | unsigned int reg; |
1849 | phandle node; | 1832 | phandle node; |
1850 | char type[64]; | 1833 | char type[64]; |
1851 | struct prom_t *_prom = &RELOC(prom); | ||
1852 | unsigned long *spinloop | 1834 | unsigned long *spinloop |
1853 | = (void *) LOW_ADDR(__secondary_hold_spinloop); | 1835 | = (void *) LOW_ADDR(__secondary_hold_spinloop); |
1854 | unsigned long *acknowledge | 1836 | unsigned long *acknowledge |
@@ -1874,12 +1856,12 @@ static void __init prom_hold_cpus(void) | |||
1874 | for (node = 0; prom_next_node(&node); ) { | 1856 | for (node = 0; prom_next_node(&node); ) { |
1875 | type[0] = 0; | 1857 | type[0] = 0; |
1876 | prom_getprop(node, "device_type", type, sizeof(type)); | 1858 | prom_getprop(node, "device_type", type, sizeof(type)); |
1877 | if (strcmp(type, RELOC("cpu")) != 0) | 1859 | if (strcmp(type, "cpu") != 0) |
1878 | continue; | 1860 | continue; |
1879 | 1861 | ||
1880 | /* Skip non-configured cpus. */ | 1862 | /* Skip non-configured cpus. */ |
1881 | if (prom_getprop(node, "status", type, sizeof(type)) > 0) | 1863 | if (prom_getprop(node, "status", type, sizeof(type)) > 0) |
1882 | if (strcmp(type, RELOC("okay")) != 0) | 1864 | if (strcmp(type, "okay") != 0) |
1883 | continue; | 1865 | continue; |
1884 | 1866 | ||
1885 | reg = -1; | 1867 | reg = -1; |
@@ -1893,7 +1875,7 @@ static void __init prom_hold_cpus(void) | |||
1893 | */ | 1875 | */ |
1894 | *acknowledge = (unsigned long)-1; | 1876 | *acknowledge = (unsigned long)-1; |
1895 | 1877 | ||
1896 | if (reg != _prom->cpu) { | 1878 | if (reg != prom.cpu) { |
1897 | /* Primary Thread of non-boot cpu or any thread */ | 1879 | /* Primary Thread of non-boot cpu or any thread */ |
1898 | prom_printf("starting cpu hw idx %lu... ", reg); | 1880 | prom_printf("starting cpu hw idx %lu... ", reg); |
1899 | call_prom("start-cpu", 3, 0, node, | 1881 | call_prom("start-cpu", 3, 0, node, |
@@ -1920,22 +1902,20 @@ static void __init prom_hold_cpus(void) | |||
1920 | 1902 | ||
1921 | static void __init prom_init_client_services(unsigned long pp) | 1903 | static void __init prom_init_client_services(unsigned long pp) |
1922 | { | 1904 | { |
1923 | struct prom_t *_prom = &RELOC(prom); | ||
1924 | |||
1925 | /* Get a handle to the prom entry point before anything else */ | 1905 | /* Get a handle to the prom entry point before anything else */ |
1926 | RELOC(prom_entry) = pp; | 1906 | prom_entry = pp; |
1927 | 1907 | ||
1928 | /* get a handle for the stdout device */ | 1908 | /* get a handle for the stdout device */ |
1929 | _prom->chosen = call_prom("finddevice", 1, 1, ADDR("/chosen")); | 1909 | prom.chosen = call_prom("finddevice", 1, 1, ADDR("/chosen")); |
1930 | if (!PHANDLE_VALID(_prom->chosen)) | 1910 | if (!PHANDLE_VALID(prom.chosen)) |
1931 | prom_panic("cannot find chosen"); /* msg won't be printed :( */ | 1911 | prom_panic("cannot find chosen"); /* msg won't be printed :( */ |
1932 | 1912 | ||
1933 | /* get device tree root */ | 1913 | /* get device tree root */ |
1934 | _prom->root = call_prom("finddevice", 1, 1, ADDR("/")); | 1914 | prom.root = call_prom("finddevice", 1, 1, ADDR("/")); |
1935 | if (!PHANDLE_VALID(_prom->root)) | 1915 | if (!PHANDLE_VALID(prom.root)) |
1936 | prom_panic("cannot find device tree root"); /* msg won't be printed :( */ | 1916 | prom_panic("cannot find device tree root"); /* msg won't be printed :( */ |
1937 | 1917 | ||
1938 | _prom->mmumap = 0; | 1918 | prom.mmumap = 0; |
1939 | } | 1919 | } |
1940 | 1920 | ||
1941 | #ifdef CONFIG_PPC32 | 1921 | #ifdef CONFIG_PPC32 |
@@ -1946,7 +1926,6 @@ static void __init prom_init_client_services(unsigned long pp) | |||
1946 | */ | 1926 | */ |
1947 | static void __init prom_find_mmu(void) | 1927 | static void __init prom_find_mmu(void) |
1948 | { | 1928 | { |
1949 | struct prom_t *_prom = &RELOC(prom); | ||
1950 | phandle oprom; | 1929 | phandle oprom; |
1951 | char version[64]; | 1930 | char version[64]; |
1952 | 1931 | ||
@@ -1964,10 +1943,10 @@ static void __init prom_find_mmu(void) | |||
1964 | call_prom("interpret", 1, 1, "dev /memory 0 to allow-reclaim"); | 1943 | call_prom("interpret", 1, 1, "dev /memory 0 to allow-reclaim"); |
1965 | } else | 1944 | } else |
1966 | return; | 1945 | return; |
1967 | _prom->memory = call_prom("open", 1, 1, ADDR("/memory")); | 1946 | prom.memory = call_prom("open", 1, 1, ADDR("/memory")); |
1968 | prom_getprop(_prom->chosen, "mmu", &_prom->mmumap, | 1947 | prom_getprop(prom.chosen, "mmu", &prom.mmumap, |
1969 | sizeof(_prom->mmumap)); | 1948 | sizeof(prom.mmumap)); |
1970 | if (!IHANDLE_VALID(_prom->memory) || !IHANDLE_VALID(_prom->mmumap)) | 1949 | if (!IHANDLE_VALID(prom.memory) || !IHANDLE_VALID(prom.mmumap)) |
1971 | of_workarounds &= ~OF_WA_CLAIM; /* hmmm */ | 1950 | of_workarounds &= ~OF_WA_CLAIM; /* hmmm */ |
1972 | } | 1951 | } |
1973 | #else | 1952 | #else |
@@ -1976,36 +1955,34 @@ static void __init prom_find_mmu(void) | |||
1976 | 1955 | ||
1977 | static void __init prom_init_stdout(void) | 1956 | static void __init prom_init_stdout(void) |
1978 | { | 1957 | { |
1979 | struct prom_t *_prom = &RELOC(prom); | 1958 | char *path = of_stdout_device; |
1980 | char *path = RELOC(of_stdout_device); | ||
1981 | char type[16]; | 1959 | char type[16]; |
1982 | u32 val; | 1960 | u32 val; |
1983 | 1961 | ||
1984 | if (prom_getprop(_prom->chosen, "stdout", &val, sizeof(val)) <= 0) | 1962 | if (prom_getprop(prom.chosen, "stdout", &val, sizeof(val)) <= 0) |
1985 | prom_panic("cannot find stdout"); | 1963 | prom_panic("cannot find stdout"); |
1986 | 1964 | ||
1987 | _prom->stdout = val; | 1965 | prom.stdout = val; |
1988 | 1966 | ||
1989 | /* Get the full OF pathname of the stdout device */ | 1967 | /* Get the full OF pathname of the stdout device */ |
1990 | memset(path, 0, 256); | 1968 | memset(path, 0, 256); |
1991 | call_prom("instance-to-path", 3, 1, _prom->stdout, path, 255); | 1969 | call_prom("instance-to-path", 3, 1, prom.stdout, path, 255); |
1992 | val = call_prom("instance-to-package", 1, 1, _prom->stdout); | 1970 | val = call_prom("instance-to-package", 1, 1, prom.stdout); |
1993 | prom_setprop(_prom->chosen, "/chosen", "linux,stdout-package", | 1971 | prom_setprop(prom.chosen, "/chosen", "linux,stdout-package", |
1994 | &val, sizeof(val)); | 1972 | &val, sizeof(val)); |
1995 | prom_printf("OF stdout device is: %s\n", RELOC(of_stdout_device)); | 1973 | prom_printf("OF stdout device is: %s\n", of_stdout_device); |
1996 | prom_setprop(_prom->chosen, "/chosen", "linux,stdout-path", | 1974 | prom_setprop(prom.chosen, "/chosen", "linux,stdout-path", |
1997 | path, strlen(path) + 1); | 1975 | path, strlen(path) + 1); |
1998 | 1976 | ||
1999 | /* If it's a display, note it */ | 1977 | /* If it's a display, note it */ |
2000 | memset(type, 0, sizeof(type)); | 1978 | memset(type, 0, sizeof(type)); |
2001 | prom_getprop(val, "device_type", type, sizeof(type)); | 1979 | prom_getprop(val, "device_type", type, sizeof(type)); |
2002 | if (strcmp(type, RELOC("display")) == 0) | 1980 | if (strcmp(type, "display") == 0) |
2003 | prom_setprop(val, path, "linux,boot-display", NULL, 0); | 1981 | prom_setprop(val, path, "linux,boot-display", NULL, 0); |
2004 | } | 1982 | } |
2005 | 1983 | ||
2006 | static int __init prom_find_machine_type(void) | 1984 | static int __init prom_find_machine_type(void) |
2007 | { | 1985 | { |
2008 | struct prom_t *_prom = &RELOC(prom); | ||
2009 | char compat[256]; | 1986 | char compat[256]; |
2010 | int len, i = 0; | 1987 | int len, i = 0; |
2011 | #ifdef CONFIG_PPC64 | 1988 | #ifdef CONFIG_PPC64 |
@@ -2014,7 +1991,7 @@ static int __init prom_find_machine_type(void) | |||
2014 | #endif | 1991 | #endif |
2015 | 1992 | ||
2016 | /* Look for a PowerMac or a Cell */ | 1993 | /* Look for a PowerMac or a Cell */ |
2017 | len = prom_getprop(_prom->root, "compatible", | 1994 | len = prom_getprop(prom.root, "compatible", |
2018 | compat, sizeof(compat)-1); | 1995 | compat, sizeof(compat)-1); |
2019 | if (len > 0) { | 1996 | if (len > 0) { |
2020 | compat[len] = 0; | 1997 | compat[len] = 0; |
@@ -2023,16 +2000,16 @@ static int __init prom_find_machine_type(void) | |||
2023 | int sl = strlen(p); | 2000 | int sl = strlen(p); |
2024 | if (sl == 0) | 2001 | if (sl == 0) |
2025 | break; | 2002 | break; |
2026 | if (strstr(p, RELOC("Power Macintosh")) || | 2003 | if (strstr(p, "Power Macintosh") || |
2027 | strstr(p, RELOC("MacRISC"))) | 2004 | strstr(p, "MacRISC")) |
2028 | return PLATFORM_POWERMAC; | 2005 | return PLATFORM_POWERMAC; |
2029 | #ifdef CONFIG_PPC64 | 2006 | #ifdef CONFIG_PPC64 |
2030 | /* We must make sure we don't detect the IBM Cell | 2007 | /* We must make sure we don't detect the IBM Cell |
2031 | * blades as pSeries due to some firmware issues, | 2008 | * blades as pSeries due to some firmware issues, |
2032 | * so we do it here. | 2009 | * so we do it here. |
2033 | */ | 2010 | */ |
2034 | if (strstr(p, RELOC("IBM,CBEA")) || | 2011 | if (strstr(p, "IBM,CBEA") || |
2035 | strstr(p, RELOC("IBM,CPBW-1.0"))) | 2012 | strstr(p, "IBM,CPBW-1.0")) |
2036 | return PLATFORM_GENERIC; | 2013 | return PLATFORM_GENERIC; |
2037 | #endif /* CONFIG_PPC64 */ | 2014 | #endif /* CONFIG_PPC64 */ |
2038 | i += sl + 1; | 2015 | i += sl + 1; |
@@ -2049,11 +2026,11 @@ static int __init prom_find_machine_type(void) | |||
2049 | * non-IBM designs ! | 2026 | * non-IBM designs ! |
2050 | * - it has /rtas | 2027 | * - it has /rtas |
2051 | */ | 2028 | */ |
2052 | len = prom_getprop(_prom->root, "device_type", | 2029 | len = prom_getprop(prom.root, "device_type", |
2053 | compat, sizeof(compat)-1); | 2030 | compat, sizeof(compat)-1); |
2054 | if (len <= 0) | 2031 | if (len <= 0) |
2055 | return PLATFORM_GENERIC; | 2032 | return PLATFORM_GENERIC; |
2056 | if (strcmp(compat, RELOC("chrp"))) | 2033 | if (strcmp(compat, "chrp")) |
2057 | return PLATFORM_GENERIC; | 2034 | return PLATFORM_GENERIC; |
2058 | 2035 | ||
2059 | /* Default to pSeries. We need to know if we are running LPAR */ | 2036 | /* Default to pSeries. We need to know if we are running LPAR */ |
@@ -2115,11 +2092,11 @@ static void __init prom_check_displays(void) | |||
2115 | for (node = 0; prom_next_node(&node); ) { | 2092 | for (node = 0; prom_next_node(&node); ) { |
2116 | memset(type, 0, sizeof(type)); | 2093 | memset(type, 0, sizeof(type)); |
2117 | prom_getprop(node, "device_type", type, sizeof(type)); | 2094 | prom_getprop(node, "device_type", type, sizeof(type)); |
2118 | if (strcmp(type, RELOC("display")) != 0) | 2095 | if (strcmp(type, "display") != 0) |
2119 | continue; | 2096 | continue; |
2120 | 2097 | ||
2121 | /* It seems OF doesn't null-terminate the path :-( */ | 2098 | /* It seems OF doesn't null-terminate the path :-( */ |
2122 | path = RELOC(prom_scratch); | 2099 | path = prom_scratch; |
2123 | memset(path, 0, PROM_SCRATCH_SIZE); | 2100 | memset(path, 0, PROM_SCRATCH_SIZE); |
2124 | 2101 | ||
2125 | /* | 2102 | /* |
@@ -2143,15 +2120,15 @@ static void __init prom_check_displays(void) | |||
2143 | 2120 | ||
2144 | /* Setup a usable color table when the appropriate | 2121 | /* Setup a usable color table when the appropriate |
2145 | * method is available. Should update this to set-colors */ | 2122 | * method is available. Should update this to set-colors */ |
2146 | clut = RELOC(default_colors); | 2123 | clut = default_colors; |
2147 | for (i = 0; i < 16; i++, clut += 3) | 2124 | for (i = 0; i < 16; i++, clut += 3) |
2148 | if (prom_set_color(ih, i, clut[0], clut[1], | 2125 | if (prom_set_color(ih, i, clut[0], clut[1], |
2149 | clut[2]) != 0) | 2126 | clut[2]) != 0) |
2150 | break; | 2127 | break; |
2151 | 2128 | ||
2152 | #ifdef CONFIG_LOGO_LINUX_CLUT224 | 2129 | #ifdef CONFIG_LOGO_LINUX_CLUT224 |
2153 | clut = PTRRELOC(RELOC(logo_linux_clut224.clut)); | 2130 | clut = PTRRELOC(logo_linux_clut224.clut); |
2154 | for (i = 0; i < RELOC(logo_linux_clut224.clutsize); i++, clut += 3) | 2131 | for (i = 0; i < logo_linux_clut224.clutsize; i++, clut += 3) |
2155 | if (prom_set_color(ih, i + 32, clut[0], clut[1], | 2132 | if (prom_set_color(ih, i + 32, clut[0], clut[1], |
2156 | clut[2]) != 0) | 2133 | clut[2]) != 0) |
2157 | break; | 2134 | break; |
@@ -2171,8 +2148,8 @@ static void __init *make_room(unsigned long *mem_start, unsigned long *mem_end, | |||
2171 | unsigned long room, chunk; | 2148 | unsigned long room, chunk; |
2172 | 2149 | ||
2173 | prom_debug("Chunk exhausted, claiming more at %x...\n", | 2150 | prom_debug("Chunk exhausted, claiming more at %x...\n", |
2174 | RELOC(alloc_bottom)); | 2151 | alloc_bottom); |
2175 | room = RELOC(alloc_top) - RELOC(alloc_bottom); | 2152 | room = alloc_top - alloc_bottom; |
2176 | if (room > DEVTREE_CHUNK_SIZE) | 2153 | if (room > DEVTREE_CHUNK_SIZE) |
2177 | room = DEVTREE_CHUNK_SIZE; | 2154 | room = DEVTREE_CHUNK_SIZE; |
2178 | if (room < PAGE_SIZE) | 2155 | if (room < PAGE_SIZE) |
@@ -2198,9 +2175,9 @@ static unsigned long __init dt_find_string(char *str) | |||
2198 | { | 2175 | { |
2199 | char *s, *os; | 2176 | char *s, *os; |
2200 | 2177 | ||
2201 | s = os = (char *)RELOC(dt_string_start); | 2178 | s = os = (char *)dt_string_start; |
2202 | s += 4; | 2179 | s += 4; |
2203 | while (s < (char *)RELOC(dt_string_end)) { | 2180 | while (s < (char *)dt_string_end) { |
2204 | if (strcmp(s, str) == 0) | 2181 | if (strcmp(s, str) == 0) |
2205 | return s - os; | 2182 | return s - os; |
2206 | s += strlen(s) + 1; | 2183 | s += strlen(s) + 1; |
@@ -2222,10 +2199,10 @@ static void __init scan_dt_build_strings(phandle node, | |||
2222 | unsigned long soff; | 2199 | unsigned long soff; |
2223 | phandle child; | 2200 | phandle child; |
2224 | 2201 | ||
2225 | sstart = (char *)RELOC(dt_string_start); | 2202 | sstart = (char *)dt_string_start; |
2226 | 2203 | ||
2227 | /* get and store all property names */ | 2204 | /* get and store all property names */ |
2228 | prev_name = RELOC(""); | 2205 | prev_name = ""; |
2229 | for (;;) { | 2206 | for (;;) { |
2230 | /* 64 is max len of name including nul. */ | 2207 | /* 64 is max len of name including nul. */ |
2231 | namep = make_room(mem_start, mem_end, MAX_PROPERTY_NAME, 1); | 2208 | namep = make_room(mem_start, mem_end, MAX_PROPERTY_NAME, 1); |
@@ -2236,9 +2213,9 @@ static void __init scan_dt_build_strings(phandle node, | |||
2236 | } | 2213 | } |
2237 | 2214 | ||
2238 | /* skip "name" */ | 2215 | /* skip "name" */ |
2239 | if (strcmp(namep, RELOC("name")) == 0) { | 2216 | if (strcmp(namep, "name") == 0) { |
2240 | *mem_start = (unsigned long)namep; | 2217 | *mem_start = (unsigned long)namep; |
2241 | prev_name = RELOC("name"); | 2218 | prev_name = "name"; |
2242 | continue; | 2219 | continue; |
2243 | } | 2220 | } |
2244 | /* get/create string entry */ | 2221 | /* get/create string entry */ |
@@ -2249,7 +2226,7 @@ static void __init scan_dt_build_strings(phandle node, | |||
2249 | } else { | 2226 | } else { |
2250 | /* Trim off some if we can */ | 2227 | /* Trim off some if we can */ |
2251 | *mem_start = (unsigned long)namep + strlen(namep) + 1; | 2228 | *mem_start = (unsigned long)namep + strlen(namep) + 1; |
2252 | RELOC(dt_string_end) = *mem_start; | 2229 | dt_string_end = *mem_start; |
2253 | } | 2230 | } |
2254 | prev_name = namep; | 2231 | prev_name = namep; |
2255 | } | 2232 | } |
@@ -2304,35 +2281,35 @@ static void __init scan_dt_build_struct(phandle node, unsigned long *mem_start, | |||
2304 | } | 2281 | } |
2305 | 2282 | ||
2306 | /* get it again for debugging */ | 2283 | /* get it again for debugging */ |
2307 | path = RELOC(prom_scratch); | 2284 | path = prom_scratch; |
2308 | memset(path, 0, PROM_SCRATCH_SIZE); | 2285 | memset(path, 0, PROM_SCRATCH_SIZE); |
2309 | call_prom("package-to-path", 3, 1, node, path, PROM_SCRATCH_SIZE-1); | 2286 | call_prom("package-to-path", 3, 1, node, path, PROM_SCRATCH_SIZE-1); |
2310 | 2287 | ||
2311 | /* get and store all properties */ | 2288 | /* get and store all properties */ |
2312 | prev_name = RELOC(""); | 2289 | prev_name = ""; |
2313 | sstart = (char *)RELOC(dt_string_start); | 2290 | sstart = (char *)dt_string_start; |
2314 | for (;;) { | 2291 | for (;;) { |
2315 | if (call_prom("nextprop", 3, 1, node, prev_name, | 2292 | if (call_prom("nextprop", 3, 1, node, prev_name, |
2316 | RELOC(pname)) != 1) | 2293 | pname) != 1) |
2317 | break; | 2294 | break; |
2318 | 2295 | ||
2319 | /* skip "name" */ | 2296 | /* skip "name" */ |
2320 | if (strcmp(RELOC(pname), RELOC("name")) == 0) { | 2297 | if (strcmp(pname, "name") == 0) { |
2321 | prev_name = RELOC("name"); | 2298 | prev_name = "name"; |
2322 | continue; | 2299 | continue; |
2323 | } | 2300 | } |
2324 | 2301 | ||
2325 | /* find string offset */ | 2302 | /* find string offset */ |
2326 | soff = dt_find_string(RELOC(pname)); | 2303 | soff = dt_find_string(pname); |
2327 | if (soff == 0) { | 2304 | if (soff == 0) { |
2328 | prom_printf("WARNING: Can't find string index for" | 2305 | prom_printf("WARNING: Can't find string index for" |
2329 | " <%s>, node %s\n", RELOC(pname), path); | 2306 | " <%s>, node %s\n", pname, path); |
2330 | break; | 2307 | break; |
2331 | } | 2308 | } |
2332 | prev_name = sstart + soff; | 2309 | prev_name = sstart + soff; |
2333 | 2310 | ||
2334 | /* get length */ | 2311 | /* get length */ |
2335 | l = call_prom("getproplen", 2, 1, node, RELOC(pname)); | 2312 | l = call_prom("getproplen", 2, 1, node, pname); |
2336 | 2313 | ||
2337 | /* sanity checks */ | 2314 | /* sanity checks */ |
2338 | if (l == PROM_ERROR) | 2315 | if (l == PROM_ERROR) |
@@ -2345,10 +2322,10 @@ static void __init scan_dt_build_struct(phandle node, unsigned long *mem_start, | |||
2345 | 2322 | ||
2346 | /* push property content */ | 2323 | /* push property content */ |
2347 | valp = make_room(mem_start, mem_end, l, 4); | 2324 | valp = make_room(mem_start, mem_end, l, 4); |
2348 | call_prom("getprop", 4, 1, node, RELOC(pname), valp, l); | 2325 | call_prom("getprop", 4, 1, node, pname, valp, l); |
2349 | *mem_start = _ALIGN(*mem_start, 4); | 2326 | *mem_start = _ALIGN(*mem_start, 4); |
2350 | 2327 | ||
2351 | if (!strcmp(RELOC(pname), RELOC("phandle"))) | 2328 | if (!strcmp(pname, "phandle")) |
2352 | has_phandle = 1; | 2329 | has_phandle = 1; |
2353 | } | 2330 | } |
2354 | 2331 | ||
@@ -2356,7 +2333,7 @@ static void __init scan_dt_build_struct(phandle node, unsigned long *mem_start, | |||
2356 | * existed (can happen with OPAL) | 2333 | * existed (can happen with OPAL) |
2357 | */ | 2334 | */ |
2358 | if (!has_phandle) { | 2335 | if (!has_phandle) { |
2359 | soff = dt_find_string(RELOC("linux,phandle")); | 2336 | soff = dt_find_string("linux,phandle"); |
2360 | if (soff == 0) | 2337 | if (soff == 0) |
2361 | prom_printf("WARNING: Can't find string index for" | 2338 | prom_printf("WARNING: Can't find string index for" |
2362 | " <linux-phandle> node %s\n", path); | 2339 | " <linux-phandle> node %s\n", path); |
@@ -2384,7 +2361,6 @@ static void __init flatten_device_tree(void) | |||
2384 | phandle root; | 2361 | phandle root; |
2385 | unsigned long mem_start, mem_end, room; | 2362 | unsigned long mem_start, mem_end, room; |
2386 | struct boot_param_header *hdr; | 2363 | struct boot_param_header *hdr; |
2387 | struct prom_t *_prom = &RELOC(prom); | ||
2388 | char *namep; | 2364 | char *namep; |
2389 | u64 *rsvmap; | 2365 | u64 *rsvmap; |
2390 | 2366 | ||
@@ -2392,10 +2368,10 @@ static void __init flatten_device_tree(void) | |||
2392 | * Check how much room we have between alloc top & bottom (+/- a | 2368 | * Check how much room we have between alloc top & bottom (+/- a |
2393 | * few pages), crop to 1MB, as this is our "chunk" size | 2369 | * few pages), crop to 1MB, as this is our "chunk" size |
2394 | */ | 2370 | */ |
2395 | room = RELOC(alloc_top) - RELOC(alloc_bottom) - 0x4000; | 2371 | room = alloc_top - alloc_bottom - 0x4000; |
2396 | if (room > DEVTREE_CHUNK_SIZE) | 2372 | if (room > DEVTREE_CHUNK_SIZE) |
2397 | room = DEVTREE_CHUNK_SIZE; | 2373 | room = DEVTREE_CHUNK_SIZE; |
2398 | prom_debug("starting device tree allocs at %x\n", RELOC(alloc_bottom)); | 2374 | prom_debug("starting device tree allocs at %x\n", alloc_bottom); |
2399 | 2375 | ||
2400 | /* Now try to claim that */ | 2376 | /* Now try to claim that */ |
2401 | mem_start = (unsigned long)alloc_up(room, PAGE_SIZE); | 2377 | mem_start = (unsigned long)alloc_up(room, PAGE_SIZE); |
@@ -2412,66 +2388,66 @@ static void __init flatten_device_tree(void) | |||
2412 | mem_start = _ALIGN(mem_start, 4); | 2388 | mem_start = _ALIGN(mem_start, 4); |
2413 | hdr = make_room(&mem_start, &mem_end, | 2389 | hdr = make_room(&mem_start, &mem_end, |
2414 | sizeof(struct boot_param_header), 4); | 2390 | sizeof(struct boot_param_header), 4); |
2415 | RELOC(dt_header_start) = (unsigned long)hdr; | 2391 | dt_header_start = (unsigned long)hdr; |
2416 | rsvmap = make_room(&mem_start, &mem_end, sizeof(mem_reserve_map), 8); | 2392 | rsvmap = make_room(&mem_start, &mem_end, sizeof(mem_reserve_map), 8); |
2417 | 2393 | ||
2418 | /* Start of strings */ | 2394 | /* Start of strings */ |
2419 | mem_start = PAGE_ALIGN(mem_start); | 2395 | mem_start = PAGE_ALIGN(mem_start); |
2420 | RELOC(dt_string_start) = mem_start; | 2396 | dt_string_start = mem_start; |
2421 | mem_start += 4; /* hole */ | 2397 | mem_start += 4; /* hole */ |
2422 | 2398 | ||
2423 | /* Add "linux,phandle" in there, we'll need it */ | 2399 | /* Add "linux,phandle" in there, we'll need it */ |
2424 | namep = make_room(&mem_start, &mem_end, 16, 1); | 2400 | namep = make_room(&mem_start, &mem_end, 16, 1); |
2425 | strcpy(namep, RELOC("linux,phandle")); | 2401 | strcpy(namep, "linux,phandle"); |
2426 | mem_start = (unsigned long)namep + strlen(namep) + 1; | 2402 | mem_start = (unsigned long)namep + strlen(namep) + 1; |
2427 | 2403 | ||
2428 | /* Build string array */ | 2404 | /* Build string array */ |
2429 | prom_printf("Building dt strings...\n"); | 2405 | prom_printf("Building dt strings...\n"); |
2430 | scan_dt_build_strings(root, &mem_start, &mem_end); | 2406 | scan_dt_build_strings(root, &mem_start, &mem_end); |
2431 | RELOC(dt_string_end) = mem_start; | 2407 | dt_string_end = mem_start; |
2432 | 2408 | ||
2433 | /* Build structure */ | 2409 | /* Build structure */ |
2434 | mem_start = PAGE_ALIGN(mem_start); | 2410 | mem_start = PAGE_ALIGN(mem_start); |
2435 | RELOC(dt_struct_start) = mem_start; | 2411 | dt_struct_start = mem_start; |
2436 | prom_printf("Building dt structure...\n"); | 2412 | prom_printf("Building dt structure...\n"); |
2437 | scan_dt_build_struct(root, &mem_start, &mem_end); | 2413 | scan_dt_build_struct(root, &mem_start, &mem_end); |
2438 | dt_push_token(OF_DT_END, &mem_start, &mem_end); | 2414 | dt_push_token(OF_DT_END, &mem_start, &mem_end); |
2439 | RELOC(dt_struct_end) = PAGE_ALIGN(mem_start); | 2415 | dt_struct_end = PAGE_ALIGN(mem_start); |
2440 | 2416 | ||
2441 | /* Finish header */ | 2417 | /* Finish header */ |
2442 | hdr->boot_cpuid_phys = _prom->cpu; | 2418 | hdr->boot_cpuid_phys = prom.cpu; |
2443 | hdr->magic = OF_DT_HEADER; | 2419 | hdr->magic = OF_DT_HEADER; |
2444 | hdr->totalsize = RELOC(dt_struct_end) - RELOC(dt_header_start); | 2420 | hdr->totalsize = dt_struct_end - dt_header_start; |
2445 | hdr->off_dt_struct = RELOC(dt_struct_start) - RELOC(dt_header_start); | 2421 | hdr->off_dt_struct = dt_struct_start - dt_header_start; |
2446 | hdr->off_dt_strings = RELOC(dt_string_start) - RELOC(dt_header_start); | 2422 | hdr->off_dt_strings = dt_string_start - dt_header_start; |
2447 | hdr->dt_strings_size = RELOC(dt_string_end) - RELOC(dt_string_start); | 2423 | hdr->dt_strings_size = dt_string_end - dt_string_start; |
2448 | hdr->off_mem_rsvmap = ((unsigned long)rsvmap) - RELOC(dt_header_start); | 2424 | hdr->off_mem_rsvmap = ((unsigned long)rsvmap) - dt_header_start; |
2449 | hdr->version = OF_DT_VERSION; | 2425 | hdr->version = OF_DT_VERSION; |
2450 | /* Version 16 is not backward compatible */ | 2426 | /* Version 16 is not backward compatible */ |
2451 | hdr->last_comp_version = 0x10; | 2427 | hdr->last_comp_version = 0x10; |
2452 | 2428 | ||
2453 | /* Copy the reserve map in */ | 2429 | /* Copy the reserve map in */ |
2454 | memcpy(rsvmap, RELOC(mem_reserve_map), sizeof(mem_reserve_map)); | 2430 | memcpy(rsvmap, mem_reserve_map, sizeof(mem_reserve_map)); |
2455 | 2431 | ||
2456 | #ifdef DEBUG_PROM | 2432 | #ifdef DEBUG_PROM |
2457 | { | 2433 | { |
2458 | int i; | 2434 | int i; |
2459 | prom_printf("reserved memory map:\n"); | 2435 | prom_printf("reserved memory map:\n"); |
2460 | for (i = 0; i < RELOC(mem_reserve_cnt); i++) | 2436 | for (i = 0; i < mem_reserve_cnt; i++) |
2461 | prom_printf(" %x - %x\n", | 2437 | prom_printf(" %x - %x\n", |
2462 | RELOC(mem_reserve_map)[i].base, | 2438 | mem_reserve_map[i].base, |
2463 | RELOC(mem_reserve_map)[i].size); | 2439 | mem_reserve_map[i].size); |
2464 | } | 2440 | } |
2465 | #endif | 2441 | #endif |
2466 | /* Bump mem_reserve_cnt to cause further reservations to fail | 2442 | /* Bump mem_reserve_cnt to cause further reservations to fail |
2467 | * since it's too late. | 2443 | * since it's too late. |
2468 | */ | 2444 | */ |
2469 | RELOC(mem_reserve_cnt) = MEM_RESERVE_MAP_SIZE; | 2445 | mem_reserve_cnt = MEM_RESERVE_MAP_SIZE; |
2470 | 2446 | ||
2471 | prom_printf("Device tree strings 0x%x -> 0x%x\n", | 2447 | prom_printf("Device tree strings 0x%x -> 0x%x\n", |
2472 | RELOC(dt_string_start), RELOC(dt_string_end)); | 2448 | dt_string_start, dt_string_end); |
2473 | prom_printf("Device tree struct 0x%x -> 0x%x\n", | 2449 | prom_printf("Device tree struct 0x%x -> 0x%x\n", |
2474 | RELOC(dt_struct_start), RELOC(dt_struct_end)); | 2450 | dt_struct_start, dt_struct_end); |
2475 | 2451 | ||
2476 | } | 2452 | } |
2477 | 2453 | ||
@@ -2526,7 +2502,6 @@ static void __init fixup_device_tree_maple_memory_controller(void) | |||
2526 | phandle mc; | 2502 | phandle mc; |
2527 | u32 mc_reg[4]; | 2503 | u32 mc_reg[4]; |
2528 | char *name = "/hostbridge@f8000000"; | 2504 | char *name = "/hostbridge@f8000000"; |
2529 | struct prom_t *_prom = &RELOC(prom); | ||
2530 | u32 ac, sc; | 2505 | u32 ac, sc; |
2531 | 2506 | ||
2532 | mc = call_prom("finddevice", 1, 1, ADDR(name)); | 2507 | mc = call_prom("finddevice", 1, 1, ADDR(name)); |
@@ -2536,8 +2511,8 @@ static void __init fixup_device_tree_maple_memory_controller(void) | |||
2536 | if (prom_getproplen(mc, "reg") != 8) | 2511 | if (prom_getproplen(mc, "reg") != 8) |
2537 | return; | 2512 | return; |
2538 | 2513 | ||
2539 | prom_getprop(_prom->root, "#address-cells", &ac, sizeof(ac)); | 2514 | prom_getprop(prom.root, "#address-cells", &ac, sizeof(ac)); |
2540 | prom_getprop(_prom->root, "#size-cells", &sc, sizeof(sc)); | 2515 | prom_getprop(prom.root, "#size-cells", &sc, sizeof(sc)); |
2541 | if ((ac != 2) || (sc != 2)) | 2516 | if ((ac != 2) || (sc != 2)) |
2542 | return; | 2517 | return; |
2543 | 2518 | ||
@@ -2806,50 +2781,94 @@ static void __init fixup_device_tree(void) | |||
2806 | 2781 | ||
2807 | static void __init prom_find_boot_cpu(void) | 2782 | static void __init prom_find_boot_cpu(void) |
2808 | { | 2783 | { |
2809 | struct prom_t *_prom = &RELOC(prom); | ||
2810 | u32 getprop_rval; | 2784 | u32 getprop_rval; |
2811 | ihandle prom_cpu; | 2785 | ihandle prom_cpu; |
2812 | phandle cpu_pkg; | 2786 | phandle cpu_pkg; |
2813 | 2787 | ||
2814 | _prom->cpu = 0; | 2788 | prom.cpu = 0; |
2815 | if (prom_getprop(_prom->chosen, "cpu", &prom_cpu, sizeof(prom_cpu)) <= 0) | 2789 | if (prom_getprop(prom.chosen, "cpu", &prom_cpu, sizeof(prom_cpu)) <= 0) |
2816 | return; | 2790 | return; |
2817 | 2791 | ||
2818 | cpu_pkg = call_prom("instance-to-package", 1, 1, prom_cpu); | 2792 | cpu_pkg = call_prom("instance-to-package", 1, 1, prom_cpu); |
2819 | 2793 | ||
2820 | prom_getprop(cpu_pkg, "reg", &getprop_rval, sizeof(getprop_rval)); | 2794 | prom_getprop(cpu_pkg, "reg", &getprop_rval, sizeof(getprop_rval)); |
2821 | _prom->cpu = getprop_rval; | 2795 | prom.cpu = getprop_rval; |
2822 | 2796 | ||
2823 | prom_debug("Booting CPU hw index = %lu\n", _prom->cpu); | 2797 | prom_debug("Booting CPU hw index = %lu\n", prom.cpu); |
2824 | } | 2798 | } |
2825 | 2799 | ||
2826 | static void __init prom_check_initrd(unsigned long r3, unsigned long r4) | 2800 | static void __init prom_check_initrd(unsigned long r3, unsigned long r4) |
2827 | { | 2801 | { |
2828 | #ifdef CONFIG_BLK_DEV_INITRD | 2802 | #ifdef CONFIG_BLK_DEV_INITRD |
2829 | struct prom_t *_prom = &RELOC(prom); | ||
2830 | |||
2831 | if (r3 && r4 && r4 != 0xdeadbeef) { | 2803 | if (r3 && r4 && r4 != 0xdeadbeef) { |
2832 | unsigned long val; | 2804 | unsigned long val; |
2833 | 2805 | ||
2834 | RELOC(prom_initrd_start) = is_kernel_addr(r3) ? __pa(r3) : r3; | 2806 | prom_initrd_start = is_kernel_addr(r3) ? __pa(r3) : r3; |
2835 | RELOC(prom_initrd_end) = RELOC(prom_initrd_start) + r4; | 2807 | prom_initrd_end = prom_initrd_start + r4; |
2836 | 2808 | ||
2837 | val = RELOC(prom_initrd_start); | 2809 | val = prom_initrd_start; |
2838 | prom_setprop(_prom->chosen, "/chosen", "linux,initrd-start", | 2810 | prom_setprop(prom.chosen, "/chosen", "linux,initrd-start", |
2839 | &val, sizeof(val)); | 2811 | &val, sizeof(val)); |
2840 | val = RELOC(prom_initrd_end); | 2812 | val = prom_initrd_end; |
2841 | prom_setprop(_prom->chosen, "/chosen", "linux,initrd-end", | 2813 | prom_setprop(prom.chosen, "/chosen", "linux,initrd-end", |
2842 | &val, sizeof(val)); | 2814 | &val, sizeof(val)); |
2843 | 2815 | ||
2844 | reserve_mem(RELOC(prom_initrd_start), | 2816 | reserve_mem(prom_initrd_start, |
2845 | RELOC(prom_initrd_end) - RELOC(prom_initrd_start)); | 2817 | prom_initrd_end - prom_initrd_start); |
2846 | 2818 | ||
2847 | prom_debug("initrd_start=0x%x\n", RELOC(prom_initrd_start)); | 2819 | prom_debug("initrd_start=0x%x\n", prom_initrd_start); |
2848 | prom_debug("initrd_end=0x%x\n", RELOC(prom_initrd_end)); | 2820 | prom_debug("initrd_end=0x%x\n", prom_initrd_end); |
2849 | } | 2821 | } |
2850 | #endif /* CONFIG_BLK_DEV_INITRD */ | 2822 | #endif /* CONFIG_BLK_DEV_INITRD */ |
2851 | } | 2823 | } |
2852 | 2824 | ||
2825 | #ifdef CONFIG_PPC64 | ||
2826 | #ifdef CONFIG_RELOCATABLE | ||
2827 | static void reloc_toc(void) | ||
2828 | { | ||
2829 | } | ||
2830 | |||
2831 | static void unreloc_toc(void) | ||
2832 | { | ||
2833 | } | ||
2834 | #else | ||
2835 | static void __reloc_toc(void *tocstart, unsigned long offset, | ||
2836 | unsigned long nr_entries) | ||
2837 | { | ||
2838 | unsigned long i; | ||
2839 | unsigned long *toc_entry = (unsigned long *)tocstart; | ||
2840 | |||
2841 | for (i = 0; i < nr_entries; i++) { | ||
2842 | *toc_entry = *toc_entry + offset; | ||
2843 | toc_entry++; | ||
2844 | } | ||
2845 | } | ||
2846 | |||
2847 | static void reloc_toc(void) | ||
2848 | { | ||
2849 | unsigned long offset = reloc_offset(); | ||
2850 | unsigned long nr_entries = | ||
2851 | (__prom_init_toc_end - __prom_init_toc_start) / sizeof(long); | ||
2852 | |||
2853 | /* Need to add offset to get at __prom_init_toc_start */ | ||
2854 | __reloc_toc(__prom_init_toc_start + offset, offset, nr_entries); | ||
2855 | |||
2856 | mb(); | ||
2857 | } | ||
2858 | |||
2859 | static void unreloc_toc(void) | ||
2860 | { | ||
2861 | unsigned long offset = reloc_offset(); | ||
2862 | unsigned long nr_entries = | ||
2863 | (__prom_init_toc_end - __prom_init_toc_start) / sizeof(long); | ||
2864 | |||
2865 | mb(); | ||
2866 | |||
2867 | /* __prom_init_toc_start has been relocated, no need to add offset */ | ||
2868 | __reloc_toc(__prom_init_toc_start, -offset, nr_entries); | ||
2869 | } | ||
2870 | #endif | ||
2871 | #endif | ||
2853 | 2872 | ||
2854 | /* | 2873 | /* |
2855 | * We enter here early on, when the Open Firmware prom is still | 2874 | * We enter here early on, when the Open Firmware prom is still |
@@ -2861,20 +2880,19 @@ unsigned long __init prom_init(unsigned long r3, unsigned long r4, | |||
2861 | unsigned long r6, unsigned long r7, | 2880 | unsigned long r6, unsigned long r7, |
2862 | unsigned long kbase) | 2881 | unsigned long kbase) |
2863 | { | 2882 | { |
2864 | struct prom_t *_prom; | ||
2865 | unsigned long hdr; | 2883 | unsigned long hdr; |
2866 | 2884 | ||
2867 | #ifdef CONFIG_PPC32 | 2885 | #ifdef CONFIG_PPC32 |
2868 | unsigned long offset = reloc_offset(); | 2886 | unsigned long offset = reloc_offset(); |
2869 | reloc_got2(offset); | 2887 | reloc_got2(offset); |
2888 | #else | ||
2889 | reloc_toc(); | ||
2870 | #endif | 2890 | #endif |
2871 | 2891 | ||
2872 | _prom = &RELOC(prom); | ||
2873 | |||
2874 | /* | 2892 | /* |
2875 | * First zero the BSS | 2893 | * First zero the BSS |
2876 | */ | 2894 | */ |
2877 | memset(&RELOC(__bss_start), 0, __bss_stop - __bss_start); | 2895 | memset(&__bss_start, 0, __bss_stop - __bss_start); |
2878 | 2896 | ||
2879 | /* | 2897 | /* |
2880 | * Init interface to Open Firmware, get some node references, | 2898 | * Init interface to Open Firmware, get some node references, |
@@ -2893,14 +2911,14 @@ unsigned long __init prom_init(unsigned long r3, unsigned long r4, | |||
2893 | */ | 2911 | */ |
2894 | prom_init_stdout(); | 2912 | prom_init_stdout(); |
2895 | 2913 | ||
2896 | prom_printf("Preparing to boot %s", RELOC(linux_banner)); | 2914 | prom_printf("Preparing to boot %s", linux_banner); |
2897 | 2915 | ||
2898 | /* | 2916 | /* |
2899 | * Get default machine type. At this point, we do not differentiate | 2917 | * Get default machine type. At this point, we do not differentiate |
2900 | * between pSeries SMP and pSeries LPAR | 2918 | * between pSeries SMP and pSeries LPAR |
2901 | */ | 2919 | */ |
2902 | RELOC(of_platform) = prom_find_machine_type(); | 2920 | of_platform = prom_find_machine_type(); |
2903 | prom_printf("Detected machine type: %x\n", RELOC(of_platform)); | 2921 | prom_printf("Detected machine type: %x\n", of_platform); |
2904 | 2922 | ||
2905 | #ifndef CONFIG_NONSTATIC_KERNEL | 2923 | #ifndef CONFIG_NONSTATIC_KERNEL |
2906 | /* Bail if this is a kdump kernel. */ | 2924 | /* Bail if this is a kdump kernel. */ |
@@ -2917,15 +2935,15 @@ unsigned long __init prom_init(unsigned long r3, unsigned long r4, | |||
2917 | /* | 2935 | /* |
2918 | * On pSeries, inform the firmware about our capabilities | 2936 | * On pSeries, inform the firmware about our capabilities |
2919 | */ | 2937 | */ |
2920 | if (RELOC(of_platform) == PLATFORM_PSERIES || | 2938 | if (of_platform == PLATFORM_PSERIES || |
2921 | RELOC(of_platform) == PLATFORM_PSERIES_LPAR) | 2939 | of_platform == PLATFORM_PSERIES_LPAR) |
2922 | prom_send_capabilities(); | 2940 | prom_send_capabilities(); |
2923 | #endif | 2941 | #endif |
2924 | 2942 | ||
2925 | /* | 2943 | /* |
2926 | * Copy the CPU hold code | 2944 | * Copy the CPU hold code |
2927 | */ | 2945 | */ |
2928 | if (RELOC(of_platform) != PLATFORM_POWERMAC) | 2946 | if (of_platform != PLATFORM_POWERMAC) |
2929 | copy_and_flush(0, kbase, 0x100, 0); | 2947 | copy_and_flush(0, kbase, 0x100, 0); |
2930 | 2948 | ||
2931 | /* | 2949 | /* |
@@ -2954,7 +2972,7 @@ unsigned long __init prom_init(unsigned long r3, unsigned long r4, | |||
2954 | * that uses the allocator, we need to make sure we get the top of memory | 2972 | * that uses the allocator, we need to make sure we get the top of memory |
2955 | * available for us here... | 2973 | * available for us here... |
2956 | */ | 2974 | */ |
2957 | if (RELOC(of_platform) == PLATFORM_PSERIES) | 2975 | if (of_platform == PLATFORM_PSERIES) |
2958 | prom_initialize_tce_table(); | 2976 | prom_initialize_tce_table(); |
2959 | #endif | 2977 | #endif |
2960 | 2978 | ||
@@ -2962,19 +2980,19 @@ unsigned long __init prom_init(unsigned long r3, unsigned long r4, | |||
2962 | * On non-powermacs, try to instantiate RTAS. PowerMacs don't | 2980 | * On non-powermacs, try to instantiate RTAS. PowerMacs don't |
2963 | * have a usable RTAS implementation. | 2981 | * have a usable RTAS implementation. |
2964 | */ | 2982 | */ |
2965 | if (RELOC(of_platform) != PLATFORM_POWERMAC && | 2983 | if (of_platform != PLATFORM_POWERMAC && |
2966 | RELOC(of_platform) != PLATFORM_OPAL) | 2984 | of_platform != PLATFORM_OPAL) |
2967 | prom_instantiate_rtas(); | 2985 | prom_instantiate_rtas(); |
2968 | 2986 | ||
2969 | #ifdef CONFIG_PPC_POWERNV | 2987 | #ifdef CONFIG_PPC_POWERNV |
2970 | /* Detect HAL and try instanciating it & doing takeover */ | 2988 | /* Detect HAL and try instanciating it & doing takeover */ |
2971 | if (RELOC(of_platform) == PLATFORM_PSERIES_LPAR) { | 2989 | if (of_platform == PLATFORM_PSERIES_LPAR) { |
2972 | prom_query_opal(); | 2990 | prom_query_opal(); |
2973 | if (RELOC(of_platform) == PLATFORM_OPAL) { | 2991 | if (of_platform == PLATFORM_OPAL) { |
2974 | prom_opal_hold_cpus(); | 2992 | prom_opal_hold_cpus(); |
2975 | prom_opal_takeover(); | 2993 | prom_opal_takeover(); |
2976 | } | 2994 | } |
2977 | } else if (RELOC(of_platform) == PLATFORM_OPAL) | 2995 | } else if (of_platform == PLATFORM_OPAL) |
2978 | prom_instantiate_opal(); | 2996 | prom_instantiate_opal(); |
2979 | #endif | 2997 | #endif |
2980 | 2998 | ||
@@ -2988,32 +3006,32 @@ unsigned long __init prom_init(unsigned long r3, unsigned long r4, | |||
2988 | * | 3006 | * |
2989 | * PowerMacs use a different mechanism to spin CPUs | 3007 | * PowerMacs use a different mechanism to spin CPUs |
2990 | */ | 3008 | */ |
2991 | if (RELOC(of_platform) != PLATFORM_POWERMAC && | 3009 | if (of_platform != PLATFORM_POWERMAC && |
2992 | RELOC(of_platform) != PLATFORM_OPAL) | 3010 | of_platform != PLATFORM_OPAL) |
2993 | prom_hold_cpus(); | 3011 | prom_hold_cpus(); |
2994 | 3012 | ||
2995 | /* | 3013 | /* |
2996 | * Fill in some infos for use by the kernel later on | 3014 | * Fill in some infos for use by the kernel later on |
2997 | */ | 3015 | */ |
2998 | if (RELOC(prom_memory_limit)) | 3016 | if (prom_memory_limit) |
2999 | prom_setprop(_prom->chosen, "/chosen", "linux,memory-limit", | 3017 | prom_setprop(prom.chosen, "/chosen", "linux,memory-limit", |
3000 | &RELOC(prom_memory_limit), | 3018 | &prom_memory_limit, |
3001 | sizeof(prom_memory_limit)); | 3019 | sizeof(prom_memory_limit)); |
3002 | #ifdef CONFIG_PPC64 | 3020 | #ifdef CONFIG_PPC64 |
3003 | if (RELOC(prom_iommu_off)) | 3021 | if (prom_iommu_off) |
3004 | prom_setprop(_prom->chosen, "/chosen", "linux,iommu-off", | 3022 | prom_setprop(prom.chosen, "/chosen", "linux,iommu-off", |
3005 | NULL, 0); | 3023 | NULL, 0); |
3006 | 3024 | ||
3007 | if (RELOC(prom_iommu_force_on)) | 3025 | if (prom_iommu_force_on) |
3008 | prom_setprop(_prom->chosen, "/chosen", "linux,iommu-force-on", | 3026 | prom_setprop(prom.chosen, "/chosen", "linux,iommu-force-on", |
3009 | NULL, 0); | 3027 | NULL, 0); |
3010 | 3028 | ||
3011 | if (RELOC(prom_tce_alloc_start)) { | 3029 | if (prom_tce_alloc_start) { |
3012 | prom_setprop(_prom->chosen, "/chosen", "linux,tce-alloc-start", | 3030 | prom_setprop(prom.chosen, "/chosen", "linux,tce-alloc-start", |
3013 | &RELOC(prom_tce_alloc_start), | 3031 | &prom_tce_alloc_start, |
3014 | sizeof(prom_tce_alloc_start)); | 3032 | sizeof(prom_tce_alloc_start)); |
3015 | prom_setprop(_prom->chosen, "/chosen", "linux,tce-alloc-end", | 3033 | prom_setprop(prom.chosen, "/chosen", "linux,tce-alloc-end", |
3016 | &RELOC(prom_tce_alloc_end), | 3034 | &prom_tce_alloc_end, |
3017 | sizeof(prom_tce_alloc_end)); | 3035 | sizeof(prom_tce_alloc_end)); |
3018 | } | 3036 | } |
3019 | #endif | 3037 | #endif |
@@ -3035,8 +3053,8 @@ unsigned long __init prom_init(unsigned long r3, unsigned long r4, | |||
3035 | * closed stdin already (in particular the powerbook 101). It | 3053 | * closed stdin already (in particular the powerbook 101). It |
3036 | * appears that the OPAL version of OFW doesn't like it either. | 3054 | * appears that the OPAL version of OFW doesn't like it either. |
3037 | */ | 3055 | */ |
3038 | if (RELOC(of_platform) != PLATFORM_POWERMAC && | 3056 | if (of_platform != PLATFORM_POWERMAC && |
3039 | RELOC(of_platform) != PLATFORM_OPAL) | 3057 | of_platform != PLATFORM_OPAL) |
3040 | prom_close_stdin(); | 3058 | prom_close_stdin(); |
3041 | 3059 | ||
3042 | /* | 3060 | /* |
@@ -3051,22 +3069,24 @@ unsigned long __init prom_init(unsigned long r3, unsigned long r4, | |||
3051 | * tree and NULL as r5, thus triggering the new entry point which | 3069 | * tree and NULL as r5, thus triggering the new entry point which |
3052 | * is common to us and kexec | 3070 | * is common to us and kexec |
3053 | */ | 3071 | */ |
3054 | hdr = RELOC(dt_header_start); | 3072 | hdr = dt_header_start; |
3055 | 3073 | ||
3056 | /* Don't print anything after quiesce under OPAL, it crashes OFW */ | 3074 | /* Don't print anything after quiesce under OPAL, it crashes OFW */ |
3057 | if (RELOC(of_platform) != PLATFORM_OPAL) { | 3075 | if (of_platform != PLATFORM_OPAL) { |
3058 | prom_printf("returning from prom_init\n"); | 3076 | prom_printf("returning from prom_init\n"); |
3059 | prom_debug("->dt_header_start=0x%x\n", hdr); | 3077 | prom_debug("->dt_header_start=0x%x\n", hdr); |
3060 | } | 3078 | } |
3061 | 3079 | ||
3062 | #ifdef CONFIG_PPC32 | 3080 | #ifdef CONFIG_PPC32 |
3063 | reloc_got2(-offset); | 3081 | reloc_got2(-offset); |
3082 | #else | ||
3083 | unreloc_toc(); | ||
3064 | #endif | 3084 | #endif |
3065 | 3085 | ||
3066 | #ifdef CONFIG_PPC_EARLY_DEBUG_OPAL | 3086 | #ifdef CONFIG_PPC_EARLY_DEBUG_OPAL |
3067 | /* OPAL early debug gets the OPAL base & entry in r8 and r9 */ | 3087 | /* OPAL early debug gets the OPAL base & entry in r8 and r9 */ |
3068 | __start(hdr, kbase, 0, 0, 0, | 3088 | __start(hdr, kbase, 0, 0, 0, |
3069 | RELOC(prom_opal_base), RELOC(prom_opal_entry)); | 3089 | prom_opal_base, prom_opal_entry); |
3070 | #else | 3090 | #else |
3071 | __start(hdr, kbase, 0, 0, 0, 0, 0); | 3091 | __start(hdr, kbase, 0, 0, 0, 0, 0); |
3072 | #endif | 3092 | #endif |
diff --git a/arch/powerpc/kernel/prom_init_check.sh b/arch/powerpc/kernel/prom_init_check.sh index 70f4286eaa7a..3765da6be4f2 100644 --- a/arch/powerpc/kernel/prom_init_check.sh +++ b/arch/powerpc/kernel/prom_init_check.sh | |||
@@ -22,7 +22,7 @@ __secondary_hold_acknowledge __secondary_hold_spinloop __start | |||
22 | strcmp strcpy strlcpy strlen strncmp strstr logo_linux_clut224 | 22 | strcmp strcpy strlcpy strlen strncmp strstr logo_linux_clut224 |
23 | reloc_got2 kernstart_addr memstart_addr linux_banner _stext | 23 | reloc_got2 kernstart_addr memstart_addr linux_banner _stext |
24 | opal_query_takeover opal_do_takeover opal_enter_rtas opal_secondary_entry | 24 | opal_query_takeover opal_do_takeover opal_enter_rtas opal_secondary_entry |
25 | boot_command_line" | 25 | boot_command_line __prom_init_toc_start __prom_init_toc_end" |
26 | 26 | ||
27 | NM="$1" | 27 | NM="$1" |
28 | OBJ="$2" | 28 | OBJ="$2" |
diff --git a/arch/powerpc/kernel/ptrace.c b/arch/powerpc/kernel/ptrace.c index c4970004d44d..245c1b6a0858 100644 --- a/arch/powerpc/kernel/ptrace.c +++ b/arch/powerpc/kernel/ptrace.c | |||
@@ -179,6 +179,30 @@ static int set_user_msr(struct task_struct *task, unsigned long msr) | |||
179 | return 0; | 179 | return 0; |
180 | } | 180 | } |
181 | 181 | ||
182 | #ifdef CONFIG_PPC64 | ||
183 | static unsigned long get_user_dscr(struct task_struct *task) | ||
184 | { | ||
185 | return task->thread.dscr; | ||
186 | } | ||
187 | |||
188 | static int set_user_dscr(struct task_struct *task, unsigned long dscr) | ||
189 | { | ||
190 | task->thread.dscr = dscr; | ||
191 | task->thread.dscr_inherit = 1; | ||
192 | return 0; | ||
193 | } | ||
194 | #else | ||
195 | static unsigned long get_user_dscr(struct task_struct *task) | ||
196 | { | ||
197 | return -EIO; | ||
198 | } | ||
199 | |||
200 | static int set_user_dscr(struct task_struct *task, unsigned long dscr) | ||
201 | { | ||
202 | return -EIO; | ||
203 | } | ||
204 | #endif | ||
205 | |||
182 | /* | 206 | /* |
183 | * We prevent mucking around with the reserved area of trap | 207 | * We prevent mucking around with the reserved area of trap |
184 | * which are used internally by the kernel. | 208 | * which are used internally by the kernel. |
@@ -200,6 +224,9 @@ unsigned long ptrace_get_reg(struct task_struct *task, int regno) | |||
200 | if (regno == PT_MSR) | 224 | if (regno == PT_MSR) |
201 | return get_user_msr(task); | 225 | return get_user_msr(task); |
202 | 226 | ||
227 | if (regno == PT_DSCR) | ||
228 | return get_user_dscr(task); | ||
229 | |||
203 | if (regno < (sizeof(struct pt_regs) / sizeof(unsigned long))) | 230 | if (regno < (sizeof(struct pt_regs) / sizeof(unsigned long))) |
204 | return ((unsigned long *)task->thread.regs)[regno]; | 231 | return ((unsigned long *)task->thread.regs)[regno]; |
205 | 232 | ||
@@ -218,6 +245,8 @@ int ptrace_put_reg(struct task_struct *task, int regno, unsigned long data) | |||
218 | return set_user_msr(task, data); | 245 | return set_user_msr(task, data); |
219 | if (regno == PT_TRAP) | 246 | if (regno == PT_TRAP) |
220 | return set_user_trap(task, data); | 247 | return set_user_trap(task, data); |
248 | if (regno == PT_DSCR) | ||
249 | return set_user_dscr(task, data); | ||
221 | 250 | ||
222 | if (regno <= PT_MAX_PUT_REG) { | 251 | if (regno <= PT_MAX_PUT_REG) { |
223 | ((unsigned long *)task->thread.regs)[regno] = data; | 252 | ((unsigned long *)task->thread.regs)[regno] = data; |
@@ -905,6 +934,9 @@ int ptrace_set_debugreg(struct task_struct *task, unsigned long addr, | |||
905 | struct perf_event *bp; | 934 | struct perf_event *bp; |
906 | struct perf_event_attr attr; | 935 | struct perf_event_attr attr; |
907 | #endif /* CONFIG_HAVE_HW_BREAKPOINT */ | 936 | #endif /* CONFIG_HAVE_HW_BREAKPOINT */ |
937 | #ifndef CONFIG_PPC_ADV_DEBUG_REGS | ||
938 | struct arch_hw_breakpoint hw_brk; | ||
939 | #endif | ||
908 | 940 | ||
909 | /* For ppc64 we support one DABR and no IABR's at the moment (ppc64). | 941 | /* For ppc64 we support one DABR and no IABR's at the moment (ppc64). |
910 | * For embedded processors we support one DAC and no IAC's at the | 942 | * For embedded processors we support one DAC and no IAC's at the |
@@ -931,14 +963,17 @@ int ptrace_set_debugreg(struct task_struct *task, unsigned long addr, | |||
931 | */ | 963 | */ |
932 | 964 | ||
933 | /* Ensure breakpoint translation bit is set */ | 965 | /* Ensure breakpoint translation bit is set */ |
934 | if (data && !(data & DABR_TRANSLATION)) | 966 | if (data && !(data & HW_BRK_TYPE_TRANSLATE)) |
935 | return -EIO; | 967 | return -EIO; |
968 | hw_brk.address = data & (~HW_BRK_TYPE_DABR); | ||
969 | hw_brk.type = (data & HW_BRK_TYPE_DABR) | HW_BRK_TYPE_PRIV_ALL; | ||
970 | hw_brk.len = 8; | ||
936 | #ifdef CONFIG_HAVE_HW_BREAKPOINT | 971 | #ifdef CONFIG_HAVE_HW_BREAKPOINT |
937 | if (ptrace_get_breakpoints(task) < 0) | 972 | if (ptrace_get_breakpoints(task) < 0) |
938 | return -ESRCH; | 973 | return -ESRCH; |
939 | 974 | ||
940 | bp = thread->ptrace_bps[0]; | 975 | bp = thread->ptrace_bps[0]; |
941 | if ((!data) || !(data & (DABR_DATA_WRITE | DABR_DATA_READ))) { | 976 | if ((!data) || !(hw_brk.type & HW_BRK_TYPE_RDWR)) { |
942 | if (bp) { | 977 | if (bp) { |
943 | unregister_hw_breakpoint(bp); | 978 | unregister_hw_breakpoint(bp); |
944 | thread->ptrace_bps[0] = NULL; | 979 | thread->ptrace_bps[0] = NULL; |
@@ -948,10 +983,8 @@ int ptrace_set_debugreg(struct task_struct *task, unsigned long addr, | |||
948 | } | 983 | } |
949 | if (bp) { | 984 | if (bp) { |
950 | attr = bp->attr; | 985 | attr = bp->attr; |
951 | attr.bp_addr = data & ~HW_BREAKPOINT_ALIGN; | 986 | attr.bp_addr = hw_brk.address; |
952 | arch_bp_generic_fields(data & | 987 | arch_bp_generic_fields(hw_brk.type, &attr.bp_type); |
953 | (DABR_DATA_WRITE | DABR_DATA_READ), | ||
954 | &attr.bp_type); | ||
955 | 988 | ||
956 | /* Enable breakpoint */ | 989 | /* Enable breakpoint */ |
957 | attr.disabled = false; | 990 | attr.disabled = false; |
@@ -963,16 +996,15 @@ int ptrace_set_debugreg(struct task_struct *task, unsigned long addr, | |||
963 | } | 996 | } |
964 | thread->ptrace_bps[0] = bp; | 997 | thread->ptrace_bps[0] = bp; |
965 | ptrace_put_breakpoints(task); | 998 | ptrace_put_breakpoints(task); |
966 | thread->dabr = data; | 999 | thread->hw_brk = hw_brk; |
967 | thread->dabrx = DABRX_ALL; | ||
968 | return 0; | 1000 | return 0; |
969 | } | 1001 | } |
970 | 1002 | ||
971 | /* Create a new breakpoint request if one doesn't exist already */ | 1003 | /* Create a new breakpoint request if one doesn't exist already */ |
972 | hw_breakpoint_init(&attr); | 1004 | hw_breakpoint_init(&attr); |
973 | attr.bp_addr = data & ~HW_BREAKPOINT_ALIGN; | 1005 | attr.bp_addr = hw_brk.address; |
974 | arch_bp_generic_fields(data & (DABR_DATA_WRITE | DABR_DATA_READ), | 1006 | arch_bp_generic_fields(hw_brk.type, |
975 | &attr.bp_type); | 1007 | &attr.bp_type); |
976 | 1008 | ||
977 | thread->ptrace_bps[0] = bp = register_user_hw_breakpoint(&attr, | 1009 | thread->ptrace_bps[0] = bp = register_user_hw_breakpoint(&attr, |
978 | ptrace_triggered, NULL, task); | 1010 | ptrace_triggered, NULL, task); |
@@ -985,10 +1017,7 @@ int ptrace_set_debugreg(struct task_struct *task, unsigned long addr, | |||
985 | ptrace_put_breakpoints(task); | 1017 | ptrace_put_breakpoints(task); |
986 | 1018 | ||
987 | #endif /* CONFIG_HAVE_HW_BREAKPOINT */ | 1019 | #endif /* CONFIG_HAVE_HW_BREAKPOINT */ |
988 | 1020 | task->thread.hw_brk = hw_brk; | |
989 | /* Move contents to the DABR register */ | ||
990 | task->thread.dabr = data; | ||
991 | task->thread.dabrx = DABRX_ALL; | ||
992 | #else /* CONFIG_PPC_ADV_DEBUG_REGS */ | 1021 | #else /* CONFIG_PPC_ADV_DEBUG_REGS */ |
993 | /* As described above, it was assumed 3 bits were passed with the data | 1022 | /* As described above, it was assumed 3 bits were passed with the data |
994 | * address, but we will assume only the mode bits will be passed | 1023 | * address, but we will assume only the mode bits will be passed |
@@ -1349,7 +1378,7 @@ static long ppc_set_hwdebug(struct task_struct *child, | |||
1349 | struct perf_event_attr attr; | 1378 | struct perf_event_attr attr; |
1350 | #endif /* CONFIG_HAVE_HW_BREAKPOINT */ | 1379 | #endif /* CONFIG_HAVE_HW_BREAKPOINT */ |
1351 | #ifndef CONFIG_PPC_ADV_DEBUG_REGS | 1380 | #ifndef CONFIG_PPC_ADV_DEBUG_REGS |
1352 | unsigned long dabr; | 1381 | struct arch_hw_breakpoint brk; |
1353 | #endif | 1382 | #endif |
1354 | 1383 | ||
1355 | if (bp_info->version != 1) | 1384 | if (bp_info->version != 1) |
@@ -1397,12 +1426,12 @@ static long ppc_set_hwdebug(struct task_struct *child, | |||
1397 | if ((unsigned long)bp_info->addr >= TASK_SIZE) | 1426 | if ((unsigned long)bp_info->addr >= TASK_SIZE) |
1398 | return -EIO; | 1427 | return -EIO; |
1399 | 1428 | ||
1400 | dabr = (unsigned long)bp_info->addr & ~7UL; | 1429 | brk.address = bp_info->addr & ~7UL; |
1401 | dabr |= DABR_TRANSLATION; | 1430 | brk.type = HW_BRK_TYPE_TRANSLATE; |
1402 | if (bp_info->trigger_type & PPC_BREAKPOINT_TRIGGER_READ) | 1431 | if (bp_info->trigger_type & PPC_BREAKPOINT_TRIGGER_READ) |
1403 | dabr |= DABR_DATA_READ; | 1432 | brk.type |= HW_BRK_TYPE_READ; |
1404 | if (bp_info->trigger_type & PPC_BREAKPOINT_TRIGGER_WRITE) | 1433 | if (bp_info->trigger_type & PPC_BREAKPOINT_TRIGGER_WRITE) |
1405 | dabr |= DABR_DATA_WRITE; | 1434 | brk.type |= HW_BRK_TYPE_WRITE; |
1406 | #ifdef CONFIG_HAVE_HW_BREAKPOINT | 1435 | #ifdef CONFIG_HAVE_HW_BREAKPOINT |
1407 | if (ptrace_get_breakpoints(child) < 0) | 1436 | if (ptrace_get_breakpoints(child) < 0) |
1408 | return -ESRCH; | 1437 | return -ESRCH; |
@@ -1427,8 +1456,7 @@ static long ppc_set_hwdebug(struct task_struct *child, | |||
1427 | hw_breakpoint_init(&attr); | 1456 | hw_breakpoint_init(&attr); |
1428 | attr.bp_addr = (unsigned long)bp_info->addr & ~HW_BREAKPOINT_ALIGN; | 1457 | attr.bp_addr = (unsigned long)bp_info->addr & ~HW_BREAKPOINT_ALIGN; |
1429 | attr.bp_len = len; | 1458 | attr.bp_len = len; |
1430 | arch_bp_generic_fields(dabr & (DABR_DATA_WRITE | DABR_DATA_READ), | 1459 | arch_bp_generic_fields(brk.type, &attr.bp_type); |
1431 | &attr.bp_type); | ||
1432 | 1460 | ||
1433 | thread->ptrace_bps[0] = bp = register_user_hw_breakpoint(&attr, | 1461 | thread->ptrace_bps[0] = bp = register_user_hw_breakpoint(&attr, |
1434 | ptrace_triggered, NULL, child); | 1462 | ptrace_triggered, NULL, child); |
@@ -1445,11 +1473,10 @@ static long ppc_set_hwdebug(struct task_struct *child, | |||
1445 | if (bp_info->addr_mode != PPC_BREAKPOINT_MODE_EXACT) | 1473 | if (bp_info->addr_mode != PPC_BREAKPOINT_MODE_EXACT) |
1446 | return -EINVAL; | 1474 | return -EINVAL; |
1447 | 1475 | ||
1448 | if (child->thread.dabr) | 1476 | if (child->thread.hw_brk.address) |
1449 | return -ENOSPC; | 1477 | return -ENOSPC; |
1450 | 1478 | ||
1451 | child->thread.dabr = dabr; | 1479 | child->thread.hw_brk = brk; |
1452 | child->thread.dabrx = DABRX_ALL; | ||
1453 | 1480 | ||
1454 | return 1; | 1481 | return 1; |
1455 | #endif /* !CONFIG_PPC_ADV_DEBUG_DVCS */ | 1482 | #endif /* !CONFIG_PPC_ADV_DEBUG_DVCS */ |
@@ -1495,10 +1522,11 @@ static long ppc_del_hwdebug(struct task_struct *child, long data) | |||
1495 | ptrace_put_breakpoints(child); | 1522 | ptrace_put_breakpoints(child); |
1496 | return ret; | 1523 | return ret; |
1497 | #else /* CONFIG_HAVE_HW_BREAKPOINT */ | 1524 | #else /* CONFIG_HAVE_HW_BREAKPOINT */ |
1498 | if (child->thread.dabr == 0) | 1525 | if (child->thread.hw_brk.address == 0) |
1499 | return -ENOENT; | 1526 | return -ENOENT; |
1500 | 1527 | ||
1501 | child->thread.dabr = 0; | 1528 | child->thread.hw_brk.address = 0; |
1529 | child->thread.hw_brk.type = 0; | ||
1502 | #endif /* CONFIG_HAVE_HW_BREAKPOINT */ | 1530 | #endif /* CONFIG_HAVE_HW_BREAKPOINT */ |
1503 | 1531 | ||
1504 | return 0; | 1532 | return 0; |
@@ -1642,6 +1670,9 @@ long arch_ptrace(struct task_struct *child, long request, | |||
1642 | } | 1670 | } |
1643 | 1671 | ||
1644 | case PTRACE_GET_DEBUGREG: { | 1672 | case PTRACE_GET_DEBUGREG: { |
1673 | #ifndef CONFIG_PPC_ADV_DEBUG_REGS | ||
1674 | unsigned long dabr_fake; | ||
1675 | #endif | ||
1645 | ret = -EINVAL; | 1676 | ret = -EINVAL; |
1646 | /* We only support one DABR and no IABRS at the moment */ | 1677 | /* We only support one DABR and no IABRS at the moment */ |
1647 | if (addr > 0) | 1678 | if (addr > 0) |
@@ -1649,7 +1680,9 @@ long arch_ptrace(struct task_struct *child, long request, | |||
1649 | #ifdef CONFIG_PPC_ADV_DEBUG_REGS | 1680 | #ifdef CONFIG_PPC_ADV_DEBUG_REGS |
1650 | ret = put_user(child->thread.dac1, datalp); | 1681 | ret = put_user(child->thread.dac1, datalp); |
1651 | #else | 1682 | #else |
1652 | ret = put_user(child->thread.dabr, datalp); | 1683 | dabr_fake = ((child->thread.hw_brk.address & (~HW_BRK_TYPE_DABR)) | |
1684 | (child->thread.hw_brk.type & HW_BRK_TYPE_DABR)); | ||
1685 | ret = put_user(dabr_fake, datalp); | ||
1653 | #endif | 1686 | #endif |
1654 | break; | 1687 | break; |
1655 | } | 1688 | } |
diff --git a/arch/powerpc/kernel/ptrace32.c b/arch/powerpc/kernel/ptrace32.c index 8c21658719d9..c0244e766834 100644 --- a/arch/powerpc/kernel/ptrace32.c +++ b/arch/powerpc/kernel/ptrace32.c | |||
@@ -252,6 +252,9 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request, | |||
252 | } | 252 | } |
253 | 253 | ||
254 | case PTRACE_GET_DEBUGREG: { | 254 | case PTRACE_GET_DEBUGREG: { |
255 | #ifndef CONFIG_PPC_ADV_DEBUG_REGS | ||
256 | unsigned long dabr_fake; | ||
257 | #endif | ||
255 | ret = -EINVAL; | 258 | ret = -EINVAL; |
256 | /* We only support one DABR and no IABRS at the moment */ | 259 | /* We only support one DABR and no IABRS at the moment */ |
257 | if (addr > 0) | 260 | if (addr > 0) |
@@ -259,7 +262,10 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request, | |||
259 | #ifdef CONFIG_PPC_ADV_DEBUG_REGS | 262 | #ifdef CONFIG_PPC_ADV_DEBUG_REGS |
260 | ret = put_user(child->thread.dac1, (u32 __user *)data); | 263 | ret = put_user(child->thread.dac1, (u32 __user *)data); |
261 | #else | 264 | #else |
262 | ret = put_user(child->thread.dabr, (u32 __user *)data); | 265 | dabr_fake = ( |
266 | (child->thread.hw_brk.address & (~HW_BRK_TYPE_DABR)) | | ||
267 | (child->thread.hw_brk.type & HW_BRK_TYPE_DABR)); | ||
268 | ret = put_user(dabr_fake, (u32 __user *)data); | ||
263 | #endif | 269 | #endif |
264 | break; | 270 | break; |
265 | } | 271 | } |
diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c index 6da881b35dac..75fbaceb5c87 100644 --- a/arch/powerpc/kernel/setup_64.c +++ b/arch/powerpc/kernel/setup_64.c | |||
@@ -156,6 +156,15 @@ early_param("smt-enabled", early_smt_enabled); | |||
156 | #define check_smt_enabled() | 156 | #define check_smt_enabled() |
157 | #endif /* CONFIG_SMP */ | 157 | #endif /* CONFIG_SMP */ |
158 | 158 | ||
159 | /** Fix up paca fields required for the boot cpu */ | ||
160 | static void fixup_boot_paca(void) | ||
161 | { | ||
162 | /* The boot cpu is started */ | ||
163 | get_paca()->cpu_start = 1; | ||
164 | /* Allow percpu accesses to work until we setup percpu data */ | ||
165 | get_paca()->data_offset = 0; | ||
166 | } | ||
167 | |||
159 | /* | 168 | /* |
160 | * Early initialization entry point. This is called by head.S | 169 | * Early initialization entry point. This is called by head.S |
161 | * with MMU translation disabled. We rely on the "feature" of | 170 | * with MMU translation disabled. We rely on the "feature" of |
@@ -177,6 +186,8 @@ early_param("smt-enabled", early_smt_enabled); | |||
177 | 186 | ||
178 | void __init early_setup(unsigned long dt_ptr) | 187 | void __init early_setup(unsigned long dt_ptr) |
179 | { | 188 | { |
189 | static __initdata struct paca_struct boot_paca; | ||
190 | |||
180 | /* -------- printk is _NOT_ safe to use here ! ------- */ | 191 | /* -------- printk is _NOT_ safe to use here ! ------- */ |
181 | 192 | ||
182 | /* Identify CPU type */ | 193 | /* Identify CPU type */ |
@@ -185,6 +196,7 @@ void __init early_setup(unsigned long dt_ptr) | |||
185 | /* Assume we're on cpu 0 for now. Don't write to the paca yet! */ | 196 | /* Assume we're on cpu 0 for now. Don't write to the paca yet! */ |
186 | initialise_paca(&boot_paca, 0); | 197 | initialise_paca(&boot_paca, 0); |
187 | setup_paca(&boot_paca); | 198 | setup_paca(&boot_paca); |
199 | fixup_boot_paca(); | ||
188 | 200 | ||
189 | /* Initialize lockdep early or else spinlocks will blow */ | 201 | /* Initialize lockdep early or else spinlocks will blow */ |
190 | lockdep_init(); | 202 | lockdep_init(); |
@@ -205,11 +217,7 @@ void __init early_setup(unsigned long dt_ptr) | |||
205 | 217 | ||
206 | /* Now we know the logical id of our boot cpu, setup the paca. */ | 218 | /* Now we know the logical id of our boot cpu, setup the paca. */ |
207 | setup_paca(&paca[boot_cpuid]); | 219 | setup_paca(&paca[boot_cpuid]); |
208 | 220 | fixup_boot_paca(); | |
209 | /* Fix up paca fields required for the boot cpu */ | ||
210 | get_paca()->cpu_start = 1; | ||
211 | /* Allow percpu accesses to "work" until we setup percpu data */ | ||
212 | get_paca()->data_offset = 0; | ||
213 | 221 | ||
214 | /* Probe the machine type */ | 222 | /* Probe the machine type */ |
215 | probe_machine(); | 223 | probe_machine(); |
diff --git a/arch/powerpc/kernel/signal.c b/arch/powerpc/kernel/signal.c index 3b997118df50..3003d890e9ef 100644 --- a/arch/powerpc/kernel/signal.c +++ b/arch/powerpc/kernel/signal.c | |||
@@ -130,8 +130,9 @@ static int do_signal(struct pt_regs *regs) | |||
130 | * user space. The DABR will have been cleared if it | 130 | * user space. The DABR will have been cleared if it |
131 | * triggered inside the kernel. | 131 | * triggered inside the kernel. |
132 | */ | 132 | */ |
133 | if (current->thread.dabr) | 133 | if (current->thread.hw_brk.address && |
134 | set_dabr(current->thread.dabr, current->thread.dabrx); | 134 | current->thread.hw_brk.type) |
135 | set_breakpoint(¤t->thread.hw_brk); | ||
135 | #endif | 136 | #endif |
136 | /* Re-enable the breakpoints for the signal stack */ | 137 | /* Re-enable the breakpoints for the signal stack */ |
137 | thread_change_pc(current, regs); | 138 | thread_change_pc(current, regs); |
diff --git a/arch/powerpc/kernel/signal.h b/arch/powerpc/kernel/signal.h index e00acb413934..ec84c901ceab 100644 --- a/arch/powerpc/kernel/signal.h +++ b/arch/powerpc/kernel/signal.h | |||
@@ -25,13 +25,21 @@ extern int handle_rt_signal32(unsigned long sig, struct k_sigaction *ka, | |||
25 | 25 | ||
26 | extern unsigned long copy_fpr_to_user(void __user *to, | 26 | extern unsigned long copy_fpr_to_user(void __user *to, |
27 | struct task_struct *task); | 27 | struct task_struct *task); |
28 | extern unsigned long copy_transact_fpr_to_user(void __user *to, | ||
29 | struct task_struct *task); | ||
28 | extern unsigned long copy_fpr_from_user(struct task_struct *task, | 30 | extern unsigned long copy_fpr_from_user(struct task_struct *task, |
29 | void __user *from); | 31 | void __user *from); |
32 | extern unsigned long copy_transact_fpr_from_user(struct task_struct *task, | ||
33 | void __user *from); | ||
30 | #ifdef CONFIG_VSX | 34 | #ifdef CONFIG_VSX |
31 | extern unsigned long copy_vsx_to_user(void __user *to, | 35 | extern unsigned long copy_vsx_to_user(void __user *to, |
32 | struct task_struct *task); | 36 | struct task_struct *task); |
37 | extern unsigned long copy_transact_vsx_to_user(void __user *to, | ||
38 | struct task_struct *task); | ||
33 | extern unsigned long copy_vsx_from_user(struct task_struct *task, | 39 | extern unsigned long copy_vsx_from_user(struct task_struct *task, |
34 | void __user *from); | 40 | void __user *from); |
41 | extern unsigned long copy_transact_vsx_from_user(struct task_struct *task, | ||
42 | void __user *from); | ||
35 | #endif | 43 | #endif |
36 | 44 | ||
37 | #ifdef CONFIG_PPC64 | 45 | #ifdef CONFIG_PPC64 |
diff --git a/arch/powerpc/kernel/signal_32.c b/arch/powerpc/kernel/signal_32.c index 804e323c139d..e4a88d340de6 100644 --- a/arch/powerpc/kernel/signal_32.c +++ b/arch/powerpc/kernel/signal_32.c | |||
@@ -43,6 +43,7 @@ | |||
43 | #include <asm/sigcontext.h> | 43 | #include <asm/sigcontext.h> |
44 | #include <asm/vdso.h> | 44 | #include <asm/vdso.h> |
45 | #include <asm/switch_to.h> | 45 | #include <asm/switch_to.h> |
46 | #include <asm/tm.h> | ||
46 | #ifdef CONFIG_PPC64 | 47 | #ifdef CONFIG_PPC64 |
47 | #include "ppc32.h" | 48 | #include "ppc32.h" |
48 | #include <asm/unistd.h> | 49 | #include <asm/unistd.h> |
@@ -293,6 +294,10 @@ long sys_sigaction(int sig, struct old_sigaction __user *act, | |||
293 | struct sigframe { | 294 | struct sigframe { |
294 | struct sigcontext sctx; /* the sigcontext */ | 295 | struct sigcontext sctx; /* the sigcontext */ |
295 | struct mcontext mctx; /* all the register values */ | 296 | struct mcontext mctx; /* all the register values */ |
297 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | ||
298 | struct sigcontext sctx_transact; | ||
299 | struct mcontext mctx_transact; | ||
300 | #endif | ||
296 | /* | 301 | /* |
297 | * Programs using the rs6000/xcoff abi can save up to 19 gp | 302 | * Programs using the rs6000/xcoff abi can save up to 19 gp |
298 | * regs and 18 fp regs below sp before decrementing it. | 303 | * regs and 18 fp regs below sp before decrementing it. |
@@ -321,6 +326,9 @@ struct rt_sigframe { | |||
321 | struct siginfo info; | 326 | struct siginfo info; |
322 | #endif | 327 | #endif |
323 | struct ucontext uc; | 328 | struct ucontext uc; |
329 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | ||
330 | struct ucontext uc_transact; | ||
331 | #endif | ||
324 | /* | 332 | /* |
325 | * Programs using the rs6000/xcoff abi can save up to 19 gp | 333 | * Programs using the rs6000/xcoff abi can save up to 19 gp |
326 | * regs and 18 fp regs below sp before decrementing it. | 334 | * regs and 18 fp regs below sp before decrementing it. |
@@ -381,6 +389,61 @@ unsigned long copy_vsx_from_user(struct task_struct *task, | |||
381 | task->thread.fpr[i][TS_VSRLOWOFFSET] = buf[i]; | 389 | task->thread.fpr[i][TS_VSRLOWOFFSET] = buf[i]; |
382 | return 0; | 390 | return 0; |
383 | } | 391 | } |
392 | |||
393 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | ||
394 | unsigned long copy_transact_fpr_to_user(void __user *to, | ||
395 | struct task_struct *task) | ||
396 | { | ||
397 | double buf[ELF_NFPREG]; | ||
398 | int i; | ||
399 | |||
400 | /* save FPR copy to local buffer then write to the thread_struct */ | ||
401 | for (i = 0; i < (ELF_NFPREG - 1) ; i++) | ||
402 | buf[i] = task->thread.TS_TRANS_FPR(i); | ||
403 | memcpy(&buf[i], &task->thread.transact_fpscr, sizeof(double)); | ||
404 | return __copy_to_user(to, buf, ELF_NFPREG * sizeof(double)); | ||
405 | } | ||
406 | |||
407 | unsigned long copy_transact_fpr_from_user(struct task_struct *task, | ||
408 | void __user *from) | ||
409 | { | ||
410 | double buf[ELF_NFPREG]; | ||
411 | int i; | ||
412 | |||
413 | if (__copy_from_user(buf, from, ELF_NFPREG * sizeof(double))) | ||
414 | return 1; | ||
415 | for (i = 0; i < (ELF_NFPREG - 1) ; i++) | ||
416 | task->thread.TS_TRANS_FPR(i) = buf[i]; | ||
417 | memcpy(&task->thread.transact_fpscr, &buf[i], sizeof(double)); | ||
418 | |||
419 | return 0; | ||
420 | } | ||
421 | |||
422 | unsigned long copy_transact_vsx_to_user(void __user *to, | ||
423 | struct task_struct *task) | ||
424 | { | ||
425 | double buf[ELF_NVSRHALFREG]; | ||
426 | int i; | ||
427 | |||
428 | /* save FPR copy to local buffer then write to the thread_struct */ | ||
429 | for (i = 0; i < ELF_NVSRHALFREG; i++) | ||
430 | buf[i] = task->thread.transact_fpr[i][TS_VSRLOWOFFSET]; | ||
431 | return __copy_to_user(to, buf, ELF_NVSRHALFREG * sizeof(double)); | ||
432 | } | ||
433 | |||
434 | unsigned long copy_transact_vsx_from_user(struct task_struct *task, | ||
435 | void __user *from) | ||
436 | { | ||
437 | double buf[ELF_NVSRHALFREG]; | ||
438 | int i; | ||
439 | |||
440 | if (__copy_from_user(buf, from, ELF_NVSRHALFREG * sizeof(double))) | ||
441 | return 1; | ||
442 | for (i = 0; i < ELF_NVSRHALFREG ; i++) | ||
443 | task->thread.transact_fpr[i][TS_VSRLOWOFFSET] = buf[i]; | ||
444 | return 0; | ||
445 | } | ||
446 | #endif /* CONFIG_PPC_TRANSACTIONAL_MEM */ | ||
384 | #else | 447 | #else |
385 | inline unsigned long copy_fpr_to_user(void __user *to, | 448 | inline unsigned long copy_fpr_to_user(void __user *to, |
386 | struct task_struct *task) | 449 | struct task_struct *task) |
@@ -395,6 +458,22 @@ inline unsigned long copy_fpr_from_user(struct task_struct *task, | |||
395 | return __copy_from_user(task->thread.fpr, from, | 458 | return __copy_from_user(task->thread.fpr, from, |
396 | ELF_NFPREG * sizeof(double)); | 459 | ELF_NFPREG * sizeof(double)); |
397 | } | 460 | } |
461 | |||
462 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | ||
463 | inline unsigned long copy_transact_fpr_to_user(void __user *to, | ||
464 | struct task_struct *task) | ||
465 | { | ||
466 | return __copy_to_user(to, task->thread.transact_fpr, | ||
467 | ELF_NFPREG * sizeof(double)); | ||
468 | } | ||
469 | |||
470 | inline unsigned long copy_transact_fpr_from_user(struct task_struct *task, | ||
471 | void __user *from) | ||
472 | { | ||
473 | return __copy_from_user(task->thread.transact_fpr, from, | ||
474 | ELF_NFPREG * sizeof(double)); | ||
475 | } | ||
476 | #endif /* CONFIG_PPC_TRANSACTIONAL_MEM */ | ||
398 | #endif | 477 | #endif |
399 | 478 | ||
400 | /* | 479 | /* |
@@ -483,6 +562,156 @@ static int save_user_regs(struct pt_regs *regs, struct mcontext __user *frame, | |||
483 | return 0; | 562 | return 0; |
484 | } | 563 | } |
485 | 564 | ||
565 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | ||
566 | /* | ||
567 | * Save the current user registers on the user stack. | ||
568 | * We only save the altivec/spe registers if the process has used | ||
569 | * altivec/spe instructions at some point. | ||
570 | * We also save the transactional registers to a second ucontext in the | ||
571 | * frame. | ||
572 | * | ||
573 | * See save_user_regs() and signal_64.c:setup_tm_sigcontexts(). | ||
574 | */ | ||
575 | static int save_tm_user_regs(struct pt_regs *regs, | ||
576 | struct mcontext __user *frame, | ||
577 | struct mcontext __user *tm_frame, int sigret) | ||
578 | { | ||
579 | unsigned long msr = regs->msr; | ||
580 | |||
581 | /* tm_reclaim rolls back all reg states, updating thread.ckpt_regs, | ||
582 | * thread.transact_fpr[], thread.transact_vr[], etc. | ||
583 | */ | ||
584 | tm_enable(); | ||
585 | tm_reclaim(¤t->thread, msr, TM_CAUSE_SIGNAL); | ||
586 | |||
587 | /* Make sure floating point registers are stored in regs */ | ||
588 | flush_fp_to_thread(current); | ||
589 | |||
590 | /* Save both sets of general registers */ | ||
591 | if (save_general_regs(¤t->thread.ckpt_regs, frame) | ||
592 | || save_general_regs(regs, tm_frame)) | ||
593 | return 1; | ||
594 | |||
595 | /* Stash the top half of the 64bit MSR into the 32bit MSR word | ||
596 | * of the transactional mcontext. This way we have a backward-compatible | ||
597 | * MSR in the 'normal' (checkpointed) mcontext and additionally one can | ||
598 | * also look at what type of transaction (T or S) was active at the | ||
599 | * time of the signal. | ||
600 | */ | ||
601 | if (__put_user((msr >> 32), &tm_frame->mc_gregs[PT_MSR])) | ||
602 | return 1; | ||
603 | |||
604 | #ifdef CONFIG_ALTIVEC | ||
605 | /* save altivec registers */ | ||
606 | if (current->thread.used_vr) { | ||
607 | flush_altivec_to_thread(current); | ||
608 | if (__copy_to_user(&frame->mc_vregs, current->thread.vr, | ||
609 | ELF_NVRREG * sizeof(vector128))) | ||
610 | return 1; | ||
611 | if (msr & MSR_VEC) { | ||
612 | if (__copy_to_user(&tm_frame->mc_vregs, | ||
613 | current->thread.transact_vr, | ||
614 | ELF_NVRREG * sizeof(vector128))) | ||
615 | return 1; | ||
616 | } else { | ||
617 | if (__copy_to_user(&tm_frame->mc_vregs, | ||
618 | current->thread.vr, | ||
619 | ELF_NVRREG * sizeof(vector128))) | ||
620 | return 1; | ||
621 | } | ||
622 | |||
623 | /* set MSR_VEC in the saved MSR value to indicate that | ||
624 | * frame->mc_vregs contains valid data | ||
625 | */ | ||
626 | msr |= MSR_VEC; | ||
627 | } | ||
628 | |||
629 | /* We always copy to/from vrsave, it's 0 if we don't have or don't | ||
630 | * use altivec. Since VSCR only contains 32 bits saved in the least | ||
631 | * significant bits of a vector, we "cheat" and stuff VRSAVE in the | ||
632 | * most significant bits of that same vector. --BenH | ||
633 | */ | ||
634 | if (__put_user(current->thread.vrsave, | ||
635 | (u32 __user *)&frame->mc_vregs[32])) | ||
636 | return 1; | ||
637 | if (msr & MSR_VEC) { | ||
638 | if (__put_user(current->thread.transact_vrsave, | ||
639 | (u32 __user *)&tm_frame->mc_vregs[32])) | ||
640 | return 1; | ||
641 | } else { | ||
642 | if (__put_user(current->thread.vrsave, | ||
643 | (u32 __user *)&tm_frame->mc_vregs[32])) | ||
644 | return 1; | ||
645 | } | ||
646 | #endif /* CONFIG_ALTIVEC */ | ||
647 | |||
648 | if (copy_fpr_to_user(&frame->mc_fregs, current)) | ||
649 | return 1; | ||
650 | if (msr & MSR_FP) { | ||
651 | if (copy_transact_fpr_to_user(&tm_frame->mc_fregs, current)) | ||
652 | return 1; | ||
653 | } else { | ||
654 | if (copy_fpr_to_user(&tm_frame->mc_fregs, current)) | ||
655 | return 1; | ||
656 | } | ||
657 | |||
658 | #ifdef CONFIG_VSX | ||
659 | /* | ||
660 | * Copy VSR 0-31 upper half from thread_struct to local | ||
661 | * buffer, then write that to userspace. Also set MSR_VSX in | ||
662 | * the saved MSR value to indicate that frame->mc_vregs | ||
663 | * contains valid data | ||
664 | */ | ||
665 | if (current->thread.used_vsr) { | ||
666 | __giveup_vsx(current); | ||
667 | if (copy_vsx_to_user(&frame->mc_vsregs, current)) | ||
668 | return 1; | ||
669 | if (msr & MSR_VSX) { | ||
670 | if (copy_transact_vsx_to_user(&tm_frame->mc_vsregs, | ||
671 | current)) | ||
672 | return 1; | ||
673 | } else { | ||
674 | if (copy_vsx_to_user(&tm_frame->mc_vsregs, current)) | ||
675 | return 1; | ||
676 | } | ||
677 | |||
678 | msr |= MSR_VSX; | ||
679 | } | ||
680 | #endif /* CONFIG_VSX */ | ||
681 | #ifdef CONFIG_SPE | ||
682 | /* SPE regs are not checkpointed with TM, so this section is | ||
683 | * simply the same as in save_user_regs(). | ||
684 | */ | ||
685 | if (current->thread.used_spe) { | ||
686 | flush_spe_to_thread(current); | ||
687 | if (__copy_to_user(&frame->mc_vregs, current->thread.evr, | ||
688 | ELF_NEVRREG * sizeof(u32))) | ||
689 | return 1; | ||
690 | /* set MSR_SPE in the saved MSR value to indicate that | ||
691 | * frame->mc_vregs contains valid data */ | ||
692 | msr |= MSR_SPE; | ||
693 | } | ||
694 | |||
695 | /* We always copy to/from spefscr */ | ||
696 | if (__put_user(current->thread.spefscr, (u32 __user *)&frame->mc_vregs + ELF_NEVRREG)) | ||
697 | return 1; | ||
698 | #endif /* CONFIG_SPE */ | ||
699 | |||
700 | if (__put_user(msr, &frame->mc_gregs[PT_MSR])) | ||
701 | return 1; | ||
702 | if (sigret) { | ||
703 | /* Set up the sigreturn trampoline: li r0,sigret; sc */ | ||
704 | if (__put_user(0x38000000UL + sigret, &frame->tramp[0]) | ||
705 | || __put_user(0x44000002UL, &frame->tramp[1])) | ||
706 | return 1; | ||
707 | flush_icache_range((unsigned long) &frame->tramp[0], | ||
708 | (unsigned long) &frame->tramp[2]); | ||
709 | } | ||
710 | |||
711 | return 0; | ||
712 | } | ||
713 | #endif | ||
714 | |||
486 | /* | 715 | /* |
487 | * Restore the current user register values from the user stack, | 716 | * Restore the current user register values from the user stack, |
488 | * (except for MSR). | 717 | * (except for MSR). |
@@ -588,6 +817,139 @@ static long restore_user_regs(struct pt_regs *regs, | |||
588 | return 0; | 817 | return 0; |
589 | } | 818 | } |
590 | 819 | ||
820 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | ||
821 | /* | ||
822 | * Restore the current user register values from the user stack, except for | ||
823 | * MSR, and recheckpoint the original checkpointed register state for processes | ||
824 | * in transactions. | ||
825 | */ | ||
826 | static long restore_tm_user_regs(struct pt_regs *regs, | ||
827 | struct mcontext __user *sr, | ||
828 | struct mcontext __user *tm_sr) | ||
829 | { | ||
830 | long err; | ||
831 | unsigned long msr; | ||
832 | #ifdef CONFIG_VSX | ||
833 | int i; | ||
834 | #endif | ||
835 | |||
836 | /* | ||
837 | * restore general registers but not including MSR or SOFTE. Also | ||
838 | * take care of keeping r2 (TLS) intact if not a signal. | ||
839 | * See comment in signal_64.c:restore_tm_sigcontexts(); | ||
840 | * TFHAR is restored from the checkpointed NIP; TEXASR and TFIAR | ||
841 | * were set by the signal delivery. | ||
842 | */ | ||
843 | err = restore_general_regs(regs, tm_sr); | ||
844 | err |= restore_general_regs(¤t->thread.ckpt_regs, sr); | ||
845 | |||
846 | err |= __get_user(current->thread.tm_tfhar, &sr->mc_gregs[PT_NIP]); | ||
847 | |||
848 | err |= __get_user(msr, &sr->mc_gregs[PT_MSR]); | ||
849 | if (err) | ||
850 | return 1; | ||
851 | |||
852 | /* Restore the previous little-endian mode */ | ||
853 | regs->msr = (regs->msr & ~MSR_LE) | (msr & MSR_LE); | ||
854 | |||
855 | /* | ||
856 | * Do this before updating the thread state in | ||
857 | * current->thread.fpr/vr/evr. That way, if we get preempted | ||
858 | * and another task grabs the FPU/Altivec/SPE, it won't be | ||
859 | * tempted to save the current CPU state into the thread_struct | ||
860 | * and corrupt what we are writing there. | ||
861 | */ | ||
862 | discard_lazy_cpu_state(); | ||
863 | |||
864 | #ifdef CONFIG_ALTIVEC | ||
865 | regs->msr &= ~MSR_VEC; | ||
866 | if (msr & MSR_VEC) { | ||
867 | /* restore altivec registers from the stack */ | ||
868 | if (__copy_from_user(current->thread.vr, &sr->mc_vregs, | ||
869 | sizeof(sr->mc_vregs)) || | ||
870 | __copy_from_user(current->thread.transact_vr, | ||
871 | &tm_sr->mc_vregs, | ||
872 | sizeof(sr->mc_vregs))) | ||
873 | return 1; | ||
874 | } else if (current->thread.used_vr) { | ||
875 | memset(current->thread.vr, 0, ELF_NVRREG * sizeof(vector128)); | ||
876 | memset(current->thread.transact_vr, 0, | ||
877 | ELF_NVRREG * sizeof(vector128)); | ||
878 | } | ||
879 | |||
880 | /* Always get VRSAVE back */ | ||
881 | if (__get_user(current->thread.vrsave, | ||
882 | (u32 __user *)&sr->mc_vregs[32]) || | ||
883 | __get_user(current->thread.transact_vrsave, | ||
884 | (u32 __user *)&tm_sr->mc_vregs[32])) | ||
885 | return 1; | ||
886 | #endif /* CONFIG_ALTIVEC */ | ||
887 | |||
888 | regs->msr &= ~(MSR_FP | MSR_FE0 | MSR_FE1); | ||
889 | |||
890 | if (copy_fpr_from_user(current, &sr->mc_fregs) || | ||
891 | copy_transact_fpr_from_user(current, &tm_sr->mc_fregs)) | ||
892 | return 1; | ||
893 | |||
894 | #ifdef CONFIG_VSX | ||
895 | regs->msr &= ~MSR_VSX; | ||
896 | if (msr & MSR_VSX) { | ||
897 | /* | ||
898 | * Restore altivec registers from the stack to a local | ||
899 | * buffer, then write this out to the thread_struct | ||
900 | */ | ||
901 | if (copy_vsx_from_user(current, &sr->mc_vsregs) || | ||
902 | copy_transact_vsx_from_user(current, &tm_sr->mc_vsregs)) | ||
903 | return 1; | ||
904 | } else if (current->thread.used_vsr) | ||
905 | for (i = 0; i < 32 ; i++) { | ||
906 | current->thread.fpr[i][TS_VSRLOWOFFSET] = 0; | ||
907 | current->thread.transact_fpr[i][TS_VSRLOWOFFSET] = 0; | ||
908 | } | ||
909 | #endif /* CONFIG_VSX */ | ||
910 | |||
911 | #ifdef CONFIG_SPE | ||
912 | /* SPE regs are not checkpointed with TM, so this section is | ||
913 | * simply the same as in restore_user_regs(). | ||
914 | */ | ||
915 | regs->msr &= ~MSR_SPE; | ||
916 | if (msr & MSR_SPE) { | ||
917 | if (__copy_from_user(current->thread.evr, &sr->mc_vregs, | ||
918 | ELF_NEVRREG * sizeof(u32))) | ||
919 | return 1; | ||
920 | } else if (current->thread.used_spe) | ||
921 | memset(current->thread.evr, 0, ELF_NEVRREG * sizeof(u32)); | ||
922 | |||
923 | /* Always get SPEFSCR back */ | ||
924 | if (__get_user(current->thread.spefscr, (u32 __user *)&sr->mc_vregs | ||
925 | + ELF_NEVRREG)) | ||
926 | return 1; | ||
927 | #endif /* CONFIG_SPE */ | ||
928 | |||
929 | /* Now, recheckpoint. This loads up all of the checkpointed (older) | ||
930 | * registers, including FP and V[S]Rs. After recheckpointing, the | ||
931 | * transactional versions should be loaded. | ||
932 | */ | ||
933 | tm_enable(); | ||
934 | /* This loads the checkpointed FP/VEC state, if used */ | ||
935 | tm_recheckpoint(¤t->thread, msr); | ||
936 | /* The task has moved into TM state S, so ensure MSR reflects this */ | ||
937 | regs->msr = (regs->msr & ~MSR_TS_MASK) | MSR_TS_S; | ||
938 | |||
939 | /* This loads the speculative FP/VEC state, if used */ | ||
940 | if (msr & MSR_FP) { | ||
941 | do_load_up_transact_fpu(¤t->thread); | ||
942 | regs->msr |= (MSR_FP | current->thread.fpexc_mode); | ||
943 | } | ||
944 | if (msr & MSR_VEC) { | ||
945 | do_load_up_transact_altivec(¤t->thread); | ||
946 | regs->msr |= MSR_VEC; | ||
947 | } | ||
948 | |||
949 | return 0; | ||
950 | } | ||
951 | #endif | ||
952 | |||
591 | #ifdef CONFIG_PPC64 | 953 | #ifdef CONFIG_PPC64 |
592 | long compat_sys_rt_sigaction(int sig, const struct sigaction32 __user *act, | 954 | long compat_sys_rt_sigaction(int sig, const struct sigaction32 __user *act, |
593 | struct sigaction32 __user *oact, size_t sigsetsize) | 955 | struct sigaction32 __user *oact, size_t sigsetsize) |
@@ -827,6 +1189,8 @@ int handle_rt_signal32(unsigned long sig, struct k_sigaction *ka, | |||
827 | struct mcontext __user *frame; | 1189 | struct mcontext __user *frame; |
828 | void __user *addr; | 1190 | void __user *addr; |
829 | unsigned long newsp = 0; | 1191 | unsigned long newsp = 0; |
1192 | int sigret; | ||
1193 | unsigned long tramp; | ||
830 | 1194 | ||
831 | /* Set up Signal Frame */ | 1195 | /* Set up Signal Frame */ |
832 | /* Put a Real Time Context onto stack */ | 1196 | /* Put a Real Time Context onto stack */ |
@@ -838,7 +1202,6 @@ int handle_rt_signal32(unsigned long sig, struct k_sigaction *ka, | |||
838 | /* Put the siginfo & fill in most of the ucontext */ | 1202 | /* Put the siginfo & fill in most of the ucontext */ |
839 | if (copy_siginfo_to_user(&rt_sf->info, info) | 1203 | if (copy_siginfo_to_user(&rt_sf->info, info) |
840 | || __put_user(0, &rt_sf->uc.uc_flags) | 1204 | || __put_user(0, &rt_sf->uc.uc_flags) |
841 | || __put_user(0, &rt_sf->uc.uc_link) | ||
842 | || __put_user(current->sas_ss_sp, &rt_sf->uc.uc_stack.ss_sp) | 1205 | || __put_user(current->sas_ss_sp, &rt_sf->uc.uc_stack.ss_sp) |
843 | || __put_user(sas_ss_flags(regs->gpr[1]), | 1206 | || __put_user(sas_ss_flags(regs->gpr[1]), |
844 | &rt_sf->uc.uc_stack.ss_flags) | 1207 | &rt_sf->uc.uc_stack.ss_flags) |
@@ -852,14 +1215,37 @@ int handle_rt_signal32(unsigned long sig, struct k_sigaction *ka, | |||
852 | frame = &rt_sf->uc.uc_mcontext; | 1215 | frame = &rt_sf->uc.uc_mcontext; |
853 | addr = frame; | 1216 | addr = frame; |
854 | if (vdso32_rt_sigtramp && current->mm->context.vdso_base) { | 1217 | if (vdso32_rt_sigtramp && current->mm->context.vdso_base) { |
855 | if (save_user_regs(regs, frame, 0, 1)) | 1218 | sigret = 0; |
856 | goto badframe; | 1219 | tramp = current->mm->context.vdso_base + vdso32_rt_sigtramp; |
857 | regs->link = current->mm->context.vdso_base + vdso32_rt_sigtramp; | ||
858 | } else { | 1220 | } else { |
859 | if (save_user_regs(regs, frame, __NR_rt_sigreturn, 1)) | 1221 | sigret = __NR_rt_sigreturn; |
1222 | tramp = (unsigned long) frame->tramp; | ||
1223 | } | ||
1224 | |||
1225 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | ||
1226 | if (MSR_TM_ACTIVE(regs->msr)) { | ||
1227 | if (save_tm_user_regs(regs, &rt_sf->uc.uc_mcontext, | ||
1228 | &rt_sf->uc_transact.uc_mcontext, sigret)) | ||
860 | goto badframe; | 1229 | goto badframe; |
861 | regs->link = (unsigned long) frame->tramp; | ||
862 | } | 1230 | } |
1231 | else | ||
1232 | #endif | ||
1233 | if (save_user_regs(regs, frame, sigret, 1)) | ||
1234 | goto badframe; | ||
1235 | regs->link = tramp; | ||
1236 | |||
1237 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | ||
1238 | if (MSR_TM_ACTIVE(regs->msr)) { | ||
1239 | if (__put_user((unsigned long)&rt_sf->uc_transact, | ||
1240 | &rt_sf->uc.uc_link) | ||
1241 | || __put_user(to_user_ptr(&rt_sf->uc_transact.uc_mcontext), | ||
1242 | &rt_sf->uc_transact.uc_regs)) | ||
1243 | goto badframe; | ||
1244 | } | ||
1245 | else | ||
1246 | #endif | ||
1247 | if (__put_user(0, &rt_sf->uc.uc_link)) | ||
1248 | goto badframe; | ||
863 | 1249 | ||
864 | current->thread.fpscr.val = 0; /* turn off all fp exceptions */ | 1250 | current->thread.fpscr.val = 0; /* turn off all fp exceptions */ |
865 | 1251 | ||
@@ -878,6 +1264,13 @@ int handle_rt_signal32(unsigned long sig, struct k_sigaction *ka, | |||
878 | regs->nip = (unsigned long) ka->sa.sa_handler; | 1264 | regs->nip = (unsigned long) ka->sa.sa_handler; |
879 | /* enter the signal handler in big-endian mode */ | 1265 | /* enter the signal handler in big-endian mode */ |
880 | regs->msr &= ~MSR_LE; | 1266 | regs->msr &= ~MSR_LE; |
1267 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | ||
1268 | /* Remove TM bits from thread's MSR. The MSR in the sigcontext | ||
1269 | * just indicates to userland that we were doing a transaction, but we | ||
1270 | * don't want to return in transactional state: | ||
1271 | */ | ||
1272 | regs->msr &= ~MSR_TS_MASK; | ||
1273 | #endif | ||
881 | return 1; | 1274 | return 1; |
882 | 1275 | ||
883 | badframe: | 1276 | badframe: |
@@ -925,6 +1318,35 @@ static int do_setcontext(struct ucontext __user *ucp, struct pt_regs *regs, int | |||
925 | return 0; | 1318 | return 0; |
926 | } | 1319 | } |
927 | 1320 | ||
1321 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | ||
1322 | static int do_setcontext_tm(struct ucontext __user *ucp, | ||
1323 | struct ucontext __user *tm_ucp, | ||
1324 | struct pt_regs *regs) | ||
1325 | { | ||
1326 | sigset_t set; | ||
1327 | struct mcontext __user *mcp; | ||
1328 | struct mcontext __user *tm_mcp; | ||
1329 | u32 cmcp; | ||
1330 | u32 tm_cmcp; | ||
1331 | |||
1332 | if (get_sigset_t(&set, &ucp->uc_sigmask)) | ||
1333 | return -EFAULT; | ||
1334 | |||
1335 | if (__get_user(cmcp, &ucp->uc_regs) || | ||
1336 | __get_user(tm_cmcp, &tm_ucp->uc_regs)) | ||
1337 | return -EFAULT; | ||
1338 | mcp = (struct mcontext __user *)(u64)cmcp; | ||
1339 | tm_mcp = (struct mcontext __user *)(u64)tm_cmcp; | ||
1340 | /* no need to check access_ok(mcp), since mcp < 4GB */ | ||
1341 | |||
1342 | set_current_blocked(&set); | ||
1343 | if (restore_tm_user_regs(regs, mcp, tm_mcp)) | ||
1344 | return -EFAULT; | ||
1345 | |||
1346 | return 0; | ||
1347 | } | ||
1348 | #endif | ||
1349 | |||
928 | long sys_swapcontext(struct ucontext __user *old_ctx, | 1350 | long sys_swapcontext(struct ucontext __user *old_ctx, |
929 | struct ucontext __user *new_ctx, | 1351 | struct ucontext __user *new_ctx, |
930 | int ctx_size, int r6, int r7, int r8, struct pt_regs *regs) | 1352 | int ctx_size, int r6, int r7, int r8, struct pt_regs *regs) |
@@ -1020,7 +1442,12 @@ long sys_rt_sigreturn(int r3, int r4, int r5, int r6, int r7, int r8, | |||
1020 | struct pt_regs *regs) | 1442 | struct pt_regs *regs) |
1021 | { | 1443 | { |
1022 | struct rt_sigframe __user *rt_sf; | 1444 | struct rt_sigframe __user *rt_sf; |
1023 | 1445 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | |
1446 | struct ucontext __user *uc_transact; | ||
1447 | unsigned long msr_hi; | ||
1448 | unsigned long tmp; | ||
1449 | int tm_restore = 0; | ||
1450 | #endif | ||
1024 | /* Always make any pending restarted system calls return -EINTR */ | 1451 | /* Always make any pending restarted system calls return -EINTR */ |
1025 | current_thread_info()->restart_block.fn = do_no_restart_syscall; | 1452 | current_thread_info()->restart_block.fn = do_no_restart_syscall; |
1026 | 1453 | ||
@@ -1028,6 +1455,34 @@ long sys_rt_sigreturn(int r3, int r4, int r5, int r6, int r7, int r8, | |||
1028 | (regs->gpr[1] + __SIGNAL_FRAMESIZE + 16); | 1455 | (regs->gpr[1] + __SIGNAL_FRAMESIZE + 16); |
1029 | if (!access_ok(VERIFY_READ, rt_sf, sizeof(*rt_sf))) | 1456 | if (!access_ok(VERIFY_READ, rt_sf, sizeof(*rt_sf))) |
1030 | goto bad; | 1457 | goto bad; |
1458 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | ||
1459 | if (__get_user(tmp, &rt_sf->uc.uc_link)) | ||
1460 | goto bad; | ||
1461 | uc_transact = (struct ucontext __user *)(uintptr_t)tmp; | ||
1462 | if (uc_transact) { | ||
1463 | u32 cmcp; | ||
1464 | struct mcontext __user *mcp; | ||
1465 | |||
1466 | if (__get_user(cmcp, &uc_transact->uc_regs)) | ||
1467 | return -EFAULT; | ||
1468 | mcp = (struct mcontext __user *)(u64)cmcp; | ||
1469 | /* The top 32 bits of the MSR are stashed in the transactional | ||
1470 | * ucontext. */ | ||
1471 | if (__get_user(msr_hi, &mcp->mc_gregs[PT_MSR])) | ||
1472 | goto bad; | ||
1473 | |||
1474 | if (MSR_TM_SUSPENDED(msr_hi<<32)) { | ||
1475 | /* We only recheckpoint on return if we're | ||
1476 | * transaction. | ||
1477 | */ | ||
1478 | tm_restore = 1; | ||
1479 | if (do_setcontext_tm(&rt_sf->uc, uc_transact, regs)) | ||
1480 | goto bad; | ||
1481 | } | ||
1482 | } | ||
1483 | if (!tm_restore) | ||
1484 | /* Fall through, for non-TM restore */ | ||
1485 | #endif | ||
1031 | if (do_setcontext(&rt_sf->uc, regs, 1)) | 1486 | if (do_setcontext(&rt_sf->uc, regs, 1)) |
1032 | goto bad; | 1487 | goto bad; |
1033 | 1488 | ||
@@ -1179,6 +1634,8 @@ int handle_signal32(unsigned long sig, struct k_sigaction *ka, | |||
1179 | struct sigcontext __user *sc; | 1634 | struct sigcontext __user *sc; |
1180 | struct sigframe __user *frame; | 1635 | struct sigframe __user *frame; |
1181 | unsigned long newsp = 0; | 1636 | unsigned long newsp = 0; |
1637 | int sigret; | ||
1638 | unsigned long tramp; | ||
1182 | 1639 | ||
1183 | /* Set up Signal Frame */ | 1640 | /* Set up Signal Frame */ |
1184 | frame = get_sigframe(ka, regs, sizeof(*frame), 1); | 1641 | frame = get_sigframe(ka, regs, sizeof(*frame), 1); |
@@ -1201,14 +1658,25 @@ int handle_signal32(unsigned long sig, struct k_sigaction *ka, | |||
1201 | goto badframe; | 1658 | goto badframe; |
1202 | 1659 | ||
1203 | if (vdso32_sigtramp && current->mm->context.vdso_base) { | 1660 | if (vdso32_sigtramp && current->mm->context.vdso_base) { |
1204 | if (save_user_regs(regs, &frame->mctx, 0, 1)) | 1661 | sigret = 0; |
1205 | goto badframe; | 1662 | tramp = current->mm->context.vdso_base + vdso32_sigtramp; |
1206 | regs->link = current->mm->context.vdso_base + vdso32_sigtramp; | ||
1207 | } else { | 1663 | } else { |
1208 | if (save_user_regs(regs, &frame->mctx, __NR_sigreturn, 1)) | 1664 | sigret = __NR_sigreturn; |
1665 | tramp = (unsigned long) frame->mctx.tramp; | ||
1666 | } | ||
1667 | |||
1668 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | ||
1669 | if (MSR_TM_ACTIVE(regs->msr)) { | ||
1670 | if (save_tm_user_regs(regs, &frame->mctx, &frame->mctx_transact, | ||
1671 | sigret)) | ||
1209 | goto badframe; | 1672 | goto badframe; |
1210 | regs->link = (unsigned long) frame->mctx.tramp; | ||
1211 | } | 1673 | } |
1674 | else | ||
1675 | #endif | ||
1676 | if (save_user_regs(regs, &frame->mctx, sigret, 1)) | ||
1677 | goto badframe; | ||
1678 | |||
1679 | regs->link = tramp; | ||
1212 | 1680 | ||
1213 | current->thread.fpscr.val = 0; /* turn off all fp exceptions */ | 1681 | current->thread.fpscr.val = 0; /* turn off all fp exceptions */ |
1214 | 1682 | ||
@@ -1223,7 +1691,13 @@ int handle_signal32(unsigned long sig, struct k_sigaction *ka, | |||
1223 | regs->nip = (unsigned long) ka->sa.sa_handler; | 1691 | regs->nip = (unsigned long) ka->sa.sa_handler; |
1224 | /* enter the signal handler in big-endian mode */ | 1692 | /* enter the signal handler in big-endian mode */ |
1225 | regs->msr &= ~MSR_LE; | 1693 | regs->msr &= ~MSR_LE; |
1226 | 1694 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | |
1695 | /* Remove TM bits from thread's MSR. The MSR in the sigcontext | ||
1696 | * just indicates to userland that we were doing a transaction, but we | ||
1697 | * don't want to return in transactional state: | ||
1698 | */ | ||
1699 | regs->msr &= ~MSR_TS_MASK; | ||
1700 | #endif | ||
1227 | return 1; | 1701 | return 1; |
1228 | 1702 | ||
1229 | badframe: | 1703 | badframe: |
diff --git a/arch/powerpc/kernel/signal_64.c b/arch/powerpc/kernel/signal_64.c index 1ca045d44324..7a76ee48a952 100644 --- a/arch/powerpc/kernel/signal_64.c +++ b/arch/powerpc/kernel/signal_64.c | |||
@@ -34,6 +34,7 @@ | |||
34 | #include <asm/syscalls.h> | 34 | #include <asm/syscalls.h> |
35 | #include <asm/vdso.h> | 35 | #include <asm/vdso.h> |
36 | #include <asm/switch_to.h> | 36 | #include <asm/switch_to.h> |
37 | #include <asm/tm.h> | ||
37 | 38 | ||
38 | #include "signal.h" | 39 | #include "signal.h" |
39 | 40 | ||
@@ -56,6 +57,9 @@ | |||
56 | struct rt_sigframe { | 57 | struct rt_sigframe { |
57 | /* sys_rt_sigreturn requires the ucontext be the first field */ | 58 | /* sys_rt_sigreturn requires the ucontext be the first field */ |
58 | struct ucontext uc; | 59 | struct ucontext uc; |
60 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | ||
61 | struct ucontext uc_transact; | ||
62 | #endif | ||
59 | unsigned long _unused[2]; | 63 | unsigned long _unused[2]; |
60 | unsigned int tramp[TRAMP_SIZE]; | 64 | unsigned int tramp[TRAMP_SIZE]; |
61 | struct siginfo __user *pinfo; | 65 | struct siginfo __user *pinfo; |
@@ -145,6 +149,145 @@ static long setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs, | |||
145 | return err; | 149 | return err; |
146 | } | 150 | } |
147 | 151 | ||
152 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | ||
153 | /* | ||
154 | * As above, but Transactional Memory is in use, so deliver sigcontexts | ||
155 | * containing checkpointed and transactional register states. | ||
156 | * | ||
157 | * To do this, we treclaim to gather both sets of registers and set up the | ||
158 | * 'normal' sigcontext registers with rolled-back register values such that a | ||
159 | * simple signal handler sees a correct checkpointed register state. | ||
160 | * If interested, a TM-aware sighandler can examine the transactional registers | ||
161 | * in the 2nd sigcontext to determine the real origin of the signal. | ||
162 | */ | ||
163 | static long setup_tm_sigcontexts(struct sigcontext __user *sc, | ||
164 | struct sigcontext __user *tm_sc, | ||
165 | struct pt_regs *regs, | ||
166 | int signr, sigset_t *set, unsigned long handler) | ||
167 | { | ||
168 | /* When CONFIG_ALTIVEC is set, we _always_ setup v_regs even if the | ||
169 | * process never used altivec yet (MSR_VEC is zero in pt_regs of | ||
170 | * the context). This is very important because we must ensure we | ||
171 | * don't lose the VRSAVE content that may have been set prior to | ||
172 | * the process doing its first vector operation | ||
173 | * Userland shall check AT_HWCAP to know wether it can rely on the | ||
174 | * v_regs pointer or not. | ||
175 | */ | ||
176 | #ifdef CONFIG_ALTIVEC | ||
177 | elf_vrreg_t __user *v_regs = (elf_vrreg_t __user *) | ||
178 | (((unsigned long)sc->vmx_reserve + 15) & ~0xful); | ||
179 | elf_vrreg_t __user *tm_v_regs = (elf_vrreg_t __user *) | ||
180 | (((unsigned long)tm_sc->vmx_reserve + 15) & ~0xful); | ||
181 | #endif | ||
182 | unsigned long msr = regs->msr; | ||
183 | long err = 0; | ||
184 | |||
185 | BUG_ON(!MSR_TM_ACTIVE(regs->msr)); | ||
186 | |||
187 | /* tm_reclaim rolls back all reg states, saving checkpointed (older) | ||
188 | * GPRs to thread.ckpt_regs and (if used) FPRs to (newer) | ||
189 | * thread.transact_fp and/or VRs to (newer) thread.transact_vr. | ||
190 | * THEN we save out FP/VRs, if necessary, to the checkpointed (older) | ||
191 | * thread.fr[]/vr[]s. The transactional (newer) GPRs are on the | ||
192 | * stack, in *regs. | ||
193 | */ | ||
194 | tm_enable(); | ||
195 | tm_reclaim(¤t->thread, msr, TM_CAUSE_SIGNAL); | ||
196 | |||
197 | flush_fp_to_thread(current); | ||
198 | |||
199 | #ifdef CONFIG_ALTIVEC | ||
200 | err |= __put_user(v_regs, &sc->v_regs); | ||
201 | err |= __put_user(tm_v_regs, &tm_sc->v_regs); | ||
202 | |||
203 | /* save altivec registers */ | ||
204 | if (current->thread.used_vr) { | ||
205 | flush_altivec_to_thread(current); | ||
206 | /* Copy 33 vec registers (vr0..31 and vscr) to the stack */ | ||
207 | err |= __copy_to_user(v_regs, current->thread.vr, | ||
208 | 33 * sizeof(vector128)); | ||
209 | /* If VEC was enabled there are transactional VRs valid too, | ||
210 | * else they're a copy of the checkpointed VRs. | ||
211 | */ | ||
212 | if (msr & MSR_VEC) | ||
213 | err |= __copy_to_user(tm_v_regs, | ||
214 | current->thread.transact_vr, | ||
215 | 33 * sizeof(vector128)); | ||
216 | else | ||
217 | err |= __copy_to_user(tm_v_regs, | ||
218 | current->thread.vr, | ||
219 | 33 * sizeof(vector128)); | ||
220 | |||
221 | /* set MSR_VEC in the MSR value in the frame to indicate | ||
222 | * that sc->v_reg contains valid data. | ||
223 | */ | ||
224 | msr |= MSR_VEC; | ||
225 | } | ||
226 | /* We always copy to/from vrsave, it's 0 if we don't have or don't | ||
227 | * use altivec. | ||
228 | */ | ||
229 | err |= __put_user(current->thread.vrsave, (u32 __user *)&v_regs[33]); | ||
230 | if (msr & MSR_VEC) | ||
231 | err |= __put_user(current->thread.transact_vrsave, | ||
232 | (u32 __user *)&tm_v_regs[33]); | ||
233 | else | ||
234 | err |= __put_user(current->thread.vrsave, | ||
235 | (u32 __user *)&tm_v_regs[33]); | ||
236 | |||
237 | #else /* CONFIG_ALTIVEC */ | ||
238 | err |= __put_user(0, &sc->v_regs); | ||
239 | err |= __put_user(0, &tm_sc->v_regs); | ||
240 | #endif /* CONFIG_ALTIVEC */ | ||
241 | |||
242 | /* copy fpr regs and fpscr */ | ||
243 | err |= copy_fpr_to_user(&sc->fp_regs, current); | ||
244 | if (msr & MSR_FP) | ||
245 | err |= copy_transact_fpr_to_user(&tm_sc->fp_regs, current); | ||
246 | else | ||
247 | err |= copy_fpr_to_user(&tm_sc->fp_regs, current); | ||
248 | |||
249 | #ifdef CONFIG_VSX | ||
250 | /* | ||
251 | * Copy VSX low doubleword to local buffer for formatting, | ||
252 | * then out to userspace. Update v_regs to point after the | ||
253 | * VMX data. | ||
254 | */ | ||
255 | if (current->thread.used_vsr) { | ||
256 | __giveup_vsx(current); | ||
257 | v_regs += ELF_NVRREG; | ||
258 | tm_v_regs += ELF_NVRREG; | ||
259 | |||
260 | err |= copy_vsx_to_user(v_regs, current); | ||
261 | |||
262 | if (msr & MSR_VSX) | ||
263 | err |= copy_transact_vsx_to_user(tm_v_regs, current); | ||
264 | else | ||
265 | err |= copy_vsx_to_user(tm_v_regs, current); | ||
266 | |||
267 | /* set MSR_VSX in the MSR value in the frame to | ||
268 | * indicate that sc->vs_reg) contains valid data. | ||
269 | */ | ||
270 | msr |= MSR_VSX; | ||
271 | } | ||
272 | #endif /* CONFIG_VSX */ | ||
273 | |||
274 | err |= __put_user(&sc->gp_regs, &sc->regs); | ||
275 | err |= __put_user(&tm_sc->gp_regs, &tm_sc->regs); | ||
276 | WARN_ON(!FULL_REGS(regs)); | ||
277 | err |= __copy_to_user(&tm_sc->gp_regs, regs, GP_REGS_SIZE); | ||
278 | err |= __copy_to_user(&sc->gp_regs, | ||
279 | ¤t->thread.ckpt_regs, GP_REGS_SIZE); | ||
280 | err |= __put_user(msr, &tm_sc->gp_regs[PT_MSR]); | ||
281 | err |= __put_user(msr, &sc->gp_regs[PT_MSR]); | ||
282 | err |= __put_user(signr, &sc->signal); | ||
283 | err |= __put_user(handler, &sc->handler); | ||
284 | if (set != NULL) | ||
285 | err |= __put_user(set->sig[0], &sc->oldmask); | ||
286 | |||
287 | return err; | ||
288 | } | ||
289 | #endif | ||
290 | |||
148 | /* | 291 | /* |
149 | * Restore the sigcontext from the signal frame. | 292 | * Restore the sigcontext from the signal frame. |
150 | */ | 293 | */ |
@@ -241,6 +384,153 @@ static long restore_sigcontext(struct pt_regs *regs, sigset_t *set, int sig, | |||
241 | return err; | 384 | return err; |
242 | } | 385 | } |
243 | 386 | ||
387 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | ||
388 | /* | ||
389 | * Restore the two sigcontexts from the frame of a transactional processes. | ||
390 | */ | ||
391 | |||
392 | static long restore_tm_sigcontexts(struct pt_regs *regs, | ||
393 | struct sigcontext __user *sc, | ||
394 | struct sigcontext __user *tm_sc) | ||
395 | { | ||
396 | #ifdef CONFIG_ALTIVEC | ||
397 | elf_vrreg_t __user *v_regs, *tm_v_regs; | ||
398 | #endif | ||
399 | unsigned long err = 0; | ||
400 | unsigned long msr; | ||
401 | #ifdef CONFIG_VSX | ||
402 | int i; | ||
403 | #endif | ||
404 | /* copy the GPRs */ | ||
405 | err |= __copy_from_user(regs->gpr, tm_sc->gp_regs, sizeof(regs->gpr)); | ||
406 | err |= __copy_from_user(¤t->thread.ckpt_regs, sc->gp_regs, | ||
407 | sizeof(regs->gpr)); | ||
408 | |||
409 | /* | ||
410 | * TFHAR is restored from the checkpointed 'wound-back' ucontext's NIP. | ||
411 | * TEXASR was set by the signal delivery reclaim, as was TFIAR. | ||
412 | * Users doing anything abhorrent like thread-switching w/ signals for | ||
413 | * TM-Suspended code will have to back TEXASR/TFIAR up themselves. | ||
414 | * For the case of getting a signal and simply returning from it, | ||
415 | * we don't need to re-copy them here. | ||
416 | */ | ||
417 | err |= __get_user(regs->nip, &tm_sc->gp_regs[PT_NIP]); | ||
418 | err |= __get_user(current->thread.tm_tfhar, &sc->gp_regs[PT_NIP]); | ||
419 | |||
420 | /* get MSR separately, transfer the LE bit if doing signal return */ | ||
421 | err |= __get_user(msr, &sc->gp_regs[PT_MSR]); | ||
422 | regs->msr = (regs->msr & ~MSR_LE) | (msr & MSR_LE); | ||
423 | |||
424 | /* The following non-GPR non-FPR non-VR state is also checkpointed: */ | ||
425 | err |= __get_user(regs->ctr, &tm_sc->gp_regs[PT_CTR]); | ||
426 | err |= __get_user(regs->link, &tm_sc->gp_regs[PT_LNK]); | ||
427 | err |= __get_user(regs->xer, &tm_sc->gp_regs[PT_XER]); | ||
428 | err |= __get_user(regs->ccr, &tm_sc->gp_regs[PT_CCR]); | ||
429 | err |= __get_user(current->thread.ckpt_regs.ctr, | ||
430 | &sc->gp_regs[PT_CTR]); | ||
431 | err |= __get_user(current->thread.ckpt_regs.link, | ||
432 | &sc->gp_regs[PT_LNK]); | ||
433 | err |= __get_user(current->thread.ckpt_regs.xer, | ||
434 | &sc->gp_regs[PT_XER]); | ||
435 | err |= __get_user(current->thread.ckpt_regs.ccr, | ||
436 | &sc->gp_regs[PT_CCR]); | ||
437 | |||
438 | /* These regs are not checkpointed; they can go in 'regs'. */ | ||
439 | err |= __get_user(regs->trap, &sc->gp_regs[PT_TRAP]); | ||
440 | err |= __get_user(regs->dar, &sc->gp_regs[PT_DAR]); | ||
441 | err |= __get_user(regs->dsisr, &sc->gp_regs[PT_DSISR]); | ||
442 | err |= __get_user(regs->result, &sc->gp_regs[PT_RESULT]); | ||
443 | |||
444 | /* | ||
445 | * Do this before updating the thread state in | ||
446 | * current->thread.fpr/vr. That way, if we get preempted | ||
447 | * and another task grabs the FPU/Altivec, it won't be | ||
448 | * tempted to save the current CPU state into the thread_struct | ||
449 | * and corrupt what we are writing there. | ||
450 | */ | ||
451 | discard_lazy_cpu_state(); | ||
452 | |||
453 | /* | ||
454 | * Force reload of FP/VEC. | ||
455 | * This has to be done before copying stuff into current->thread.fpr/vr | ||
456 | * for the reasons explained in the previous comment. | ||
457 | */ | ||
458 | regs->msr &= ~(MSR_FP | MSR_FE0 | MSR_FE1 | MSR_VEC | MSR_VSX); | ||
459 | |||
460 | #ifdef CONFIG_ALTIVEC | ||
461 | err |= __get_user(v_regs, &sc->v_regs); | ||
462 | err |= __get_user(tm_v_regs, &tm_sc->v_regs); | ||
463 | if (err) | ||
464 | return err; | ||
465 | if (v_regs && !access_ok(VERIFY_READ, v_regs, 34 * sizeof(vector128))) | ||
466 | return -EFAULT; | ||
467 | if (tm_v_regs && !access_ok(VERIFY_READ, | ||
468 | tm_v_regs, 34 * sizeof(vector128))) | ||
469 | return -EFAULT; | ||
470 | /* Copy 33 vec registers (vr0..31 and vscr) from the stack */ | ||
471 | if (v_regs != 0 && tm_v_regs != 0 && (msr & MSR_VEC) != 0) { | ||
472 | err |= __copy_from_user(current->thread.vr, v_regs, | ||
473 | 33 * sizeof(vector128)); | ||
474 | err |= __copy_from_user(current->thread.transact_vr, tm_v_regs, | ||
475 | 33 * sizeof(vector128)); | ||
476 | } | ||
477 | else if (current->thread.used_vr) { | ||
478 | memset(current->thread.vr, 0, 33 * sizeof(vector128)); | ||
479 | memset(current->thread.transact_vr, 0, 33 * sizeof(vector128)); | ||
480 | } | ||
481 | /* Always get VRSAVE back */ | ||
482 | if (v_regs != 0 && tm_v_regs != 0) { | ||
483 | err |= __get_user(current->thread.vrsave, | ||
484 | (u32 __user *)&v_regs[33]); | ||
485 | err |= __get_user(current->thread.transact_vrsave, | ||
486 | (u32 __user *)&tm_v_regs[33]); | ||
487 | } | ||
488 | else { | ||
489 | current->thread.vrsave = 0; | ||
490 | current->thread.transact_vrsave = 0; | ||
491 | } | ||
492 | #endif /* CONFIG_ALTIVEC */ | ||
493 | /* restore floating point */ | ||
494 | err |= copy_fpr_from_user(current, &sc->fp_regs); | ||
495 | err |= copy_transact_fpr_from_user(current, &tm_sc->fp_regs); | ||
496 | #ifdef CONFIG_VSX | ||
497 | /* | ||
498 | * Get additional VSX data. Update v_regs to point after the | ||
499 | * VMX data. Copy VSX low doubleword from userspace to local | ||
500 | * buffer for formatting, then into the taskstruct. | ||
501 | */ | ||
502 | if (v_regs && ((msr & MSR_VSX) != 0)) { | ||
503 | v_regs += ELF_NVRREG; | ||
504 | tm_v_regs += ELF_NVRREG; | ||
505 | err |= copy_vsx_from_user(current, v_regs); | ||
506 | err |= copy_transact_vsx_from_user(current, tm_v_regs); | ||
507 | } else { | ||
508 | for (i = 0; i < 32 ; i++) { | ||
509 | current->thread.fpr[i][TS_VSRLOWOFFSET] = 0; | ||
510 | current->thread.transact_fpr[i][TS_VSRLOWOFFSET] = 0; | ||
511 | } | ||
512 | } | ||
513 | #endif | ||
514 | tm_enable(); | ||
515 | /* This loads the checkpointed FP/VEC state, if used */ | ||
516 | tm_recheckpoint(¤t->thread, msr); | ||
517 | /* The task has moved into TM state S, so ensure MSR reflects this: */ | ||
518 | regs->msr = (regs->msr & ~MSR_TS_MASK) | __MASK(33); | ||
519 | |||
520 | /* This loads the speculative FP/VEC state, if used */ | ||
521 | if (msr & MSR_FP) { | ||
522 | do_load_up_transact_fpu(¤t->thread); | ||
523 | regs->msr |= (MSR_FP | current->thread.fpexc_mode); | ||
524 | } | ||
525 | if (msr & MSR_VEC) { | ||
526 | do_load_up_transact_altivec(¤t->thread); | ||
527 | regs->msr |= MSR_VEC; | ||
528 | } | ||
529 | |||
530 | return err; | ||
531 | } | ||
532 | #endif | ||
533 | |||
244 | /* | 534 | /* |
245 | * Setup the trampoline code on the stack | 535 | * Setup the trampoline code on the stack |
246 | */ | 536 | */ |
@@ -355,6 +645,9 @@ int sys_rt_sigreturn(unsigned long r3, unsigned long r4, unsigned long r5, | |||
355 | { | 645 | { |
356 | struct ucontext __user *uc = (struct ucontext __user *)regs->gpr[1]; | 646 | struct ucontext __user *uc = (struct ucontext __user *)regs->gpr[1]; |
357 | sigset_t set; | 647 | sigset_t set; |
648 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | ||
649 | unsigned long msr; | ||
650 | #endif | ||
358 | 651 | ||
359 | /* Always make any pending restarted system calls return -EINTR */ | 652 | /* Always make any pending restarted system calls return -EINTR */ |
360 | current_thread_info()->restart_block.fn = do_no_restart_syscall; | 653 | current_thread_info()->restart_block.fn = do_no_restart_syscall; |
@@ -365,6 +658,21 @@ int sys_rt_sigreturn(unsigned long r3, unsigned long r4, unsigned long r5, | |||
365 | if (__copy_from_user(&set, &uc->uc_sigmask, sizeof(set))) | 658 | if (__copy_from_user(&set, &uc->uc_sigmask, sizeof(set))) |
366 | goto badframe; | 659 | goto badframe; |
367 | set_current_blocked(&set); | 660 | set_current_blocked(&set); |
661 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | ||
662 | if (__get_user(msr, &uc->uc_mcontext.gp_regs[PT_MSR])) | ||
663 | goto badframe; | ||
664 | if (MSR_TM_SUSPENDED(msr)) { | ||
665 | /* We recheckpoint on return. */ | ||
666 | struct ucontext __user *uc_transact; | ||
667 | if (__get_user(uc_transact, &uc->uc_link)) | ||
668 | goto badframe; | ||
669 | if (restore_tm_sigcontexts(regs, &uc->uc_mcontext, | ||
670 | &uc_transact->uc_mcontext)) | ||
671 | goto badframe; | ||
672 | } | ||
673 | else | ||
674 | /* Fall through, for non-TM restore */ | ||
675 | #endif | ||
368 | if (restore_sigcontext(regs, NULL, 1, &uc->uc_mcontext)) | 676 | if (restore_sigcontext(regs, NULL, 1, &uc->uc_mcontext)) |
369 | goto badframe; | 677 | goto badframe; |
370 | 678 | ||
@@ -415,19 +723,42 @@ int handle_rt_signal64(int signr, struct k_sigaction *ka, siginfo_t *info, | |||
415 | 723 | ||
416 | /* Create the ucontext. */ | 724 | /* Create the ucontext. */ |
417 | err |= __put_user(0, &frame->uc.uc_flags); | 725 | err |= __put_user(0, &frame->uc.uc_flags); |
418 | err |= __put_user(0, &frame->uc.uc_link); | ||
419 | err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp); | 726 | err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp); |
420 | err |= __put_user(sas_ss_flags(regs->gpr[1]), | 727 | err |= __put_user(sas_ss_flags(regs->gpr[1]), |
421 | &frame->uc.uc_stack.ss_flags); | 728 | &frame->uc.uc_stack.ss_flags); |
422 | err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size); | 729 | err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size); |
423 | err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, signr, NULL, | 730 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM |
424 | (unsigned long)ka->sa.sa_handler, 1); | 731 | if (MSR_TM_ACTIVE(regs->msr)) { |
732 | /* The ucontext_t passed to userland points to the second | ||
733 | * ucontext_t (for transactional state) with its uc_link ptr. | ||
734 | */ | ||
735 | err |= __put_user(&frame->uc_transact, &frame->uc.uc_link); | ||
736 | err |= setup_tm_sigcontexts(&frame->uc.uc_mcontext, | ||
737 | &frame->uc_transact.uc_mcontext, | ||
738 | regs, signr, | ||
739 | NULL, | ||
740 | (unsigned long)ka->sa.sa_handler); | ||
741 | } else | ||
742 | #endif | ||
743 | { | ||
744 | err |= __put_user(0, &frame->uc.uc_link); | ||
745 | err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, signr, | ||
746 | NULL, (unsigned long)ka->sa.sa_handler, | ||
747 | 1); | ||
748 | } | ||
425 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); | 749 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); |
426 | if (err) | 750 | if (err) |
427 | goto badframe; | 751 | goto badframe; |
428 | 752 | ||
429 | /* Make sure signal handler doesn't get spurious FP exceptions */ | 753 | /* Make sure signal handler doesn't get spurious FP exceptions */ |
430 | current->thread.fpscr.val = 0; | 754 | current->thread.fpscr.val = 0; |
755 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | ||
756 | /* Remove TM bits from thread's MSR. The MSR in the sigcontext | ||
757 | * just indicates to userland that we were doing a transaction, but we | ||
758 | * don't want to return in transactional state: | ||
759 | */ | ||
760 | regs->msr &= ~MSR_TS_MASK; | ||
761 | #endif | ||
431 | 762 | ||
432 | /* Set up to return from userspace. */ | 763 | /* Set up to return from userspace. */ |
433 | if (vdso64_rt_sigtramp && current->mm->context.vdso_base) { | 764 | if (vdso64_rt_sigtramp && current->mm->context.vdso_base) { |
diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c index 793401e65088..76bd9da8cb71 100644 --- a/arch/powerpc/kernel/smp.c +++ b/arch/powerpc/kernel/smp.c | |||
@@ -610,7 +610,7 @@ static struct device_node *cpu_to_l2cache(int cpu) | |||
610 | } | 610 | } |
611 | 611 | ||
612 | /* Activate a secondary processor. */ | 612 | /* Activate a secondary processor. */ |
613 | void start_secondary(void *unused) | 613 | __cpuinit void start_secondary(void *unused) |
614 | { | 614 | { |
615 | unsigned int cpu = smp_processor_id(); | 615 | unsigned int cpu = smp_processor_id(); |
616 | struct device_node *l2_cache; | 616 | struct device_node *l2_cache; |
diff --git a/arch/powerpc/kernel/tm.S b/arch/powerpc/kernel/tm.S new file mode 100644 index 000000000000..84dbace657ce --- /dev/null +++ b/arch/powerpc/kernel/tm.S | |||
@@ -0,0 +1,388 @@ | |||
1 | /* | ||
2 | * Transactional memory support routines to reclaim and recheckpoint | ||
3 | * transactional process state. | ||
4 | * | ||
5 | * Copyright 2012 Matt Evans & Michael Neuling, IBM Corporation. | ||
6 | */ | ||
7 | |||
8 | #include <asm/asm-offsets.h> | ||
9 | #include <asm/ppc_asm.h> | ||
10 | #include <asm/ppc-opcode.h> | ||
11 | #include <asm/ptrace.h> | ||
12 | #include <asm/reg.h> | ||
13 | |||
14 | #ifdef CONFIG_VSX | ||
15 | /* See fpu.S, this is very similar but to save/restore checkpointed FPRs/VSRs */ | ||
16 | #define __SAVE_32FPRS_VSRS_TRANSACT(n,c,base) \ | ||
17 | BEGIN_FTR_SECTION \ | ||
18 | b 2f; \ | ||
19 | END_FTR_SECTION_IFSET(CPU_FTR_VSX); \ | ||
20 | SAVE_32FPRS_TRANSACT(n,base); \ | ||
21 | b 3f; \ | ||
22 | 2: SAVE_32VSRS_TRANSACT(n,c,base); \ | ||
23 | 3: | ||
24 | /* ...and this is just plain borrowed from there. */ | ||
25 | #define __REST_32FPRS_VSRS(n,c,base) \ | ||
26 | BEGIN_FTR_SECTION \ | ||
27 | b 2f; \ | ||
28 | END_FTR_SECTION_IFSET(CPU_FTR_VSX); \ | ||
29 | REST_32FPRS(n,base); \ | ||
30 | b 3f; \ | ||
31 | 2: REST_32VSRS(n,c,base); \ | ||
32 | 3: | ||
33 | #else | ||
34 | #define __SAVE_32FPRS_VSRS_TRANSACT(n,c,base) SAVE_32FPRS_TRANSACT(n, base) | ||
35 | #define __REST_32FPRS_VSRS(n,c,base) REST_32FPRS(n, base) | ||
36 | #endif | ||
37 | #define SAVE_32FPRS_VSRS_TRANSACT(n,c,base) \ | ||
38 | __SAVE_32FPRS_VSRS_TRANSACT(n,__REG_##c,__REG_##base) | ||
39 | #define REST_32FPRS_VSRS(n,c,base) \ | ||
40 | __REST_32FPRS_VSRS(n,__REG_##c,__REG_##base) | ||
41 | |||
42 | /* Stack frame offsets for local variables. */ | ||
43 | #define TM_FRAME_L0 TM_FRAME_SIZE-16 | ||
44 | #define TM_FRAME_L1 TM_FRAME_SIZE-8 | ||
45 | #define STACK_PARAM(x) (48+((x)*8)) | ||
46 | |||
47 | |||
48 | /* In order to access the TM SPRs, TM must be enabled. So, do so: */ | ||
49 | _GLOBAL(tm_enable) | ||
50 | mfmsr r4 | ||
51 | li r3, MSR_TM >> 32 | ||
52 | sldi r3, r3, 32 | ||
53 | and. r0, r4, r3 | ||
54 | bne 1f | ||
55 | or r4, r4, r3 | ||
56 | mtmsrd r4 | ||
57 | 1: blr | ||
58 | |||
59 | _GLOBAL(tm_save_sprs) | ||
60 | mfspr r0, SPRN_TFHAR | ||
61 | std r0, THREAD_TM_TFHAR(r3) | ||
62 | mfspr r0, SPRN_TEXASR | ||
63 | std r0, THREAD_TM_TEXASR(r3) | ||
64 | mfspr r0, SPRN_TFIAR | ||
65 | std r0, THREAD_TM_TFIAR(r3) | ||
66 | blr | ||
67 | |||
68 | _GLOBAL(tm_restore_sprs) | ||
69 | ld r0, THREAD_TM_TFHAR(r3) | ||
70 | mtspr SPRN_TFHAR, r0 | ||
71 | ld r0, THREAD_TM_TEXASR(r3) | ||
72 | mtspr SPRN_TEXASR, r0 | ||
73 | ld r0, THREAD_TM_TFIAR(r3) | ||
74 | mtspr SPRN_TFIAR, r0 | ||
75 | blr | ||
76 | |||
77 | /* Passed an 8-bit failure cause as first argument. */ | ||
78 | _GLOBAL(tm_abort) | ||
79 | TABORT(R3) | ||
80 | blr | ||
81 | |||
82 | |||
83 | /* void tm_reclaim(struct thread_struct *thread, | ||
84 | * unsigned long orig_msr, | ||
85 | * uint8_t cause) | ||
86 | * | ||
87 | * - Performs a full reclaim. This destroys outstanding | ||
88 | * transactions and updates thread->regs.tm_ckpt_* with the | ||
89 | * original checkpointed state. Note that thread->regs is | ||
90 | * unchanged. | ||
91 | * - FP regs are written back to thread->transact_fpr before | ||
92 | * reclaiming. These are the transactional (current) versions. | ||
93 | * | ||
94 | * Purpose is to both abort transactions of, and preserve the state of, | ||
95 | * a transactions at a context switch. We preserve/restore both sets of process | ||
96 | * state to restore them when the thread's scheduled again. We continue in | ||
97 | * userland as though nothing happened, but when the transaction is resumed | ||
98 | * they will abort back to the checkpointed state we save out here. | ||
99 | * | ||
100 | * Call with IRQs off, stacks get all out of sync for some periods in here! | ||
101 | */ | ||
102 | _GLOBAL(tm_reclaim) | ||
103 | mfcr r6 | ||
104 | mflr r0 | ||
105 | std r6, 8(r1) | ||
106 | std r0, 16(r1) | ||
107 | std r2, 40(r1) | ||
108 | stdu r1, -TM_FRAME_SIZE(r1) | ||
109 | |||
110 | /* We've a struct pt_regs at [r1+STACK_FRAME_OVERHEAD]. */ | ||
111 | |||
112 | std r3, STACK_PARAM(0)(r1) | ||
113 | SAVE_NVGPRS(r1) | ||
114 | |||
115 | mfmsr r14 | ||
116 | mr r15, r14 | ||
117 | ori r15, r15, MSR_FP | ||
118 | oris r15, r15, MSR_VEC@h | ||
119 | #ifdef CONFIG_VSX | ||
120 | BEGIN_FTR_SECTION | ||
121 | oris r15,r15, MSR_VSX@h | ||
122 | END_FTR_SECTION_IFSET(CPU_FTR_VSX) | ||
123 | #endif | ||
124 | mtmsrd r15 | ||
125 | std r14, TM_FRAME_L0(r1) | ||
126 | |||
127 | /* Stash the stack pointer away for use after reclaim */ | ||
128 | std r1, PACAR1(r13) | ||
129 | |||
130 | /* ******************** FPR/VR/VSRs ************ | ||
131 | * Before reclaiming, capture the current/transactional FPR/VR | ||
132 | * versions /if used/. | ||
133 | * | ||
134 | * (If VSX used, FP and VMX are implied. Or, we don't need to look | ||
135 | * at MSR.VSX as copying FP regs if .FP, vector regs if .VMX covers it.) | ||
136 | * | ||
137 | * We're passed the thread's MSR as parameter 2. | ||
138 | * | ||
139 | * We enabled VEC/FP/VSX in the msr above, so we can execute these | ||
140 | * instructions! | ||
141 | */ | ||
142 | andis. r0, r4, MSR_VEC@h | ||
143 | beq dont_backup_vec | ||
144 | |||
145 | SAVE_32VRS_TRANSACT(0, r6, r3) /* r6 scratch, r3 thread */ | ||
146 | mfvscr vr0 | ||
147 | li r6, THREAD_TRANSACT_VSCR | ||
148 | stvx vr0, r3, r6 | ||
149 | mfspr r0, SPRN_VRSAVE | ||
150 | std r0, THREAD_TRANSACT_VRSAVE(r3) | ||
151 | |||
152 | dont_backup_vec: | ||
153 | andi. r0, r4, MSR_FP | ||
154 | beq dont_backup_fp | ||
155 | |||
156 | SAVE_32FPRS_VSRS_TRANSACT(0, R6, R3) /* r6 scratch, r3 thread */ | ||
157 | |||
158 | mffs fr0 | ||
159 | stfd fr0,THREAD_TRANSACT_FPSCR(r3) | ||
160 | |||
161 | dont_backup_fp: | ||
162 | /* The moment we treclaim, ALL of our GPRs will switch | ||
163 | * to user register state. (FPRs, CCR etc. also!) | ||
164 | * Use an sprg and a tm_scratch in the PACA to shuffle. | ||
165 | */ | ||
166 | TRECLAIM(R5) /* Cause in r5 */ | ||
167 | |||
168 | /* ******************** GPRs ******************** */ | ||
169 | /* Stash the checkpointed r13 away in the scratch SPR and get the real | ||
170 | * paca | ||
171 | */ | ||
172 | SET_SCRATCH0(r13) | ||
173 | GET_PACA(r13) | ||
174 | |||
175 | /* Stash the checkpointed r1 away in paca tm_scratch and get the real | ||
176 | * stack pointer back | ||
177 | */ | ||
178 | std r1, PACATMSCRATCH(r13) | ||
179 | ld r1, PACAR1(r13) | ||
180 | |||
181 | /* Now get some more GPRS free */ | ||
182 | std r7, GPR7(r1) /* Temporary stash */ | ||
183 | std r12, GPR12(r1) /* '' '' '' */ | ||
184 | ld r12, STACK_PARAM(0)(r1) /* Param 0, thread_struct * */ | ||
185 | |||
186 | addi r7, r12, PT_CKPT_REGS /* Thread's ckpt_regs */ | ||
187 | |||
188 | /* Make r7 look like an exception frame so that we | ||
189 | * can use the neat GPRx(n) macros. r7 is NOT a pt_regs ptr! | ||
190 | */ | ||
191 | subi r7, r7, STACK_FRAME_OVERHEAD | ||
192 | |||
193 | /* Sync the userland GPRs 2-12, 14-31 to thread->regs: */ | ||
194 | SAVE_GPR(0, r7) /* user r0 */ | ||
195 | SAVE_GPR(2, r7) /* user r2 */ | ||
196 | SAVE_4GPRS(3, r7) /* user r3-r6 */ | ||
197 | SAVE_4GPRS(8, r7) /* user r8-r11 */ | ||
198 | ld r3, PACATMSCRATCH(r13) /* user r1 */ | ||
199 | ld r4, GPR7(r1) /* user r7 */ | ||
200 | ld r5, GPR12(r1) /* user r12 */ | ||
201 | GET_SCRATCH0(6) /* user r13 */ | ||
202 | std r3, GPR1(r7) | ||
203 | std r4, GPR7(r7) | ||
204 | std r5, GPR12(r7) | ||
205 | std r6, GPR13(r7) | ||
206 | |||
207 | SAVE_NVGPRS(r7) /* user r14-r31 */ | ||
208 | |||
209 | /* ******************** NIP ******************** */ | ||
210 | mfspr r3, SPRN_TFHAR | ||
211 | std r3, _NIP(r7) /* Returns to failhandler */ | ||
212 | /* The checkpointed NIP is ignored when rescheduling/rechkpting, | ||
213 | * but is used in signal return to 'wind back' to the abort handler. | ||
214 | */ | ||
215 | |||
216 | /* ******************** CR,LR,CCR,MSR ********** */ | ||
217 | mfctr r3 | ||
218 | mflr r4 | ||
219 | mfcr r5 | ||
220 | mfxer r6 | ||
221 | |||
222 | std r3, _CTR(r7) | ||
223 | std r4, _LINK(r7) | ||
224 | std r5, _CCR(r7) | ||
225 | std r6, _XER(r7) | ||
226 | |||
227 | /* MSR and flags: We don't change CRs, and we don't need to alter | ||
228 | * MSR. | ||
229 | */ | ||
230 | |||
231 | /* TM regs, incl TEXASR -- these live in thread_struct. Note they've | ||
232 | * been updated by the treclaim, to explain to userland the failure | ||
233 | * cause (aborted). | ||
234 | */ | ||
235 | mfspr r0, SPRN_TEXASR | ||
236 | mfspr r3, SPRN_TFHAR | ||
237 | mfspr r4, SPRN_TFIAR | ||
238 | std r0, THREAD_TM_TEXASR(r12) | ||
239 | std r3, THREAD_TM_TFHAR(r12) | ||
240 | std r4, THREAD_TM_TFIAR(r12) | ||
241 | |||
242 | /* AMR and PPR are checkpointed too, but are unsupported by Linux. */ | ||
243 | |||
244 | /* Restore original MSR/IRQ state & clear TM mode */ | ||
245 | ld r14, TM_FRAME_L0(r1) /* Orig MSR */ | ||
246 | li r15, 0 | ||
247 | rldimi r14, r15, MSR_TS_LG, (63-MSR_TS_LG)-1 | ||
248 | mtmsrd r14 | ||
249 | |||
250 | REST_NVGPRS(r1) | ||
251 | |||
252 | addi r1, r1, TM_FRAME_SIZE | ||
253 | ld r4, 8(r1) | ||
254 | ld r0, 16(r1) | ||
255 | mtcr r4 | ||
256 | mtlr r0 | ||
257 | ld r2, 40(r1) | ||
258 | blr | ||
259 | |||
260 | |||
261 | /* void tm_recheckpoint(struct thread_struct *thread, | ||
262 | * unsigned long orig_msr) | ||
263 | * - Restore the checkpointed register state saved by tm_reclaim | ||
264 | * when we switch_to a process. | ||
265 | * | ||
266 | * Call with IRQs off, stacks get all out of sync for | ||
267 | * some periods in here! | ||
268 | */ | ||
269 | _GLOBAL(tm_recheckpoint) | ||
270 | mfcr r5 | ||
271 | mflr r0 | ||
272 | std r5, 8(r1) | ||
273 | std r0, 16(r1) | ||
274 | std r2, 40(r1) | ||
275 | stdu r1, -TM_FRAME_SIZE(r1) | ||
276 | |||
277 | /* We've a struct pt_regs at [r1+STACK_FRAME_OVERHEAD]. | ||
278 | * This is used for backing up the NVGPRs: | ||
279 | */ | ||
280 | SAVE_NVGPRS(r1) | ||
281 | |||
282 | std r1, PACAR1(r13) | ||
283 | |||
284 | /* Load complete register state from ts_ckpt* registers */ | ||
285 | |||
286 | addi r7, r3, PT_CKPT_REGS /* Thread's ckpt_regs */ | ||
287 | |||
288 | /* Make r7 look like an exception frame so that we | ||
289 | * can use the neat GPRx(n) macros. r7 is now NOT a pt_regs ptr! | ||
290 | */ | ||
291 | subi r7, r7, STACK_FRAME_OVERHEAD | ||
292 | |||
293 | SET_SCRATCH0(r1) | ||
294 | |||
295 | mfmsr r6 | ||
296 | /* R4 = original MSR to indicate whether thread used FP/Vector etc. */ | ||
297 | |||
298 | /* Enable FP/vec in MSR if necessary! */ | ||
299 | lis r5, MSR_VEC@h | ||
300 | ori r5, r5, MSR_FP | ||
301 | and. r5, r4, r5 | ||
302 | beq restore_gprs /* if neither, skip both */ | ||
303 | |||
304 | #ifdef CONFIG_VSX | ||
305 | BEGIN_FTR_SECTION | ||
306 | oris r5, r5, MSR_VSX@h | ||
307 | END_FTR_SECTION_IFSET(CPU_FTR_VSX) | ||
308 | #endif | ||
309 | or r5, r6, r5 /* Set MSR.FP+.VSX/.VEC */ | ||
310 | mtmsr r5 | ||
311 | |||
312 | /* FP and VEC registers: These are recheckpointed from thread.fpr[] | ||
313 | * and thread.vr[] respectively. The thread.transact_fpr[] version | ||
314 | * is more modern, and will be loaded subsequently by any FPUnavailable | ||
315 | * trap. | ||
316 | */ | ||
317 | andis. r0, r4, MSR_VEC@h | ||
318 | beq dont_restore_vec | ||
319 | |||
320 | li r5, THREAD_VSCR | ||
321 | lvx vr0, r3, r5 | ||
322 | mtvscr vr0 | ||
323 | REST_32VRS(0, r5, r3) /* r5 scratch, r3 THREAD ptr */ | ||
324 | ld r5, THREAD_VRSAVE(r3) | ||
325 | mtspr SPRN_VRSAVE, r5 | ||
326 | |||
327 | dont_restore_vec: | ||
328 | andi. r0, r4, MSR_FP | ||
329 | beq dont_restore_fp | ||
330 | |||
331 | lfd fr0, THREAD_FPSCR(r3) | ||
332 | MTFSF_L(fr0) | ||
333 | REST_32FPRS_VSRS(0, R4, R3) | ||
334 | |||
335 | dont_restore_fp: | ||
336 | mtmsr r6 /* FP/Vec off again! */ | ||
337 | |||
338 | restore_gprs: | ||
339 | /* ******************** CR,LR,CCR,MSR ********** */ | ||
340 | ld r3, _CTR(r7) | ||
341 | ld r4, _LINK(r7) | ||
342 | ld r5, _CCR(r7) | ||
343 | ld r6, _XER(r7) | ||
344 | |||
345 | mtctr r3 | ||
346 | mtlr r4 | ||
347 | mtcr r5 | ||
348 | mtxer r6 | ||
349 | |||
350 | /* MSR and flags: We don't change CRs, and we don't need to alter | ||
351 | * MSR. | ||
352 | */ | ||
353 | |||
354 | REST_4GPRS(0, r7) /* GPR0-3 */ | ||
355 | REST_GPR(4, r7) /* GPR4-6 */ | ||
356 | REST_GPR(5, r7) | ||
357 | REST_GPR(6, r7) | ||
358 | REST_4GPRS(8, r7) /* GPR8-11 */ | ||
359 | REST_2GPRS(12, r7) /* GPR12-13 */ | ||
360 | |||
361 | REST_NVGPRS(r7) /* GPR14-31 */ | ||
362 | |||
363 | ld r7, GPR7(r7) /* GPR7 */ | ||
364 | |||
365 | /* Commit register state as checkpointed state: */ | ||
366 | TRECHKPT | ||
367 | |||
368 | /* Our transactional state has now changed. | ||
369 | * | ||
370 | * Now just get out of here. Transactional (current) state will be | ||
371 | * updated once restore is called on the return path in the _switch-ed | ||
372 | * -to process. | ||
373 | */ | ||
374 | |||
375 | GET_PACA(r13) | ||
376 | GET_SCRATCH0(r1) | ||
377 | |||
378 | REST_NVGPRS(r1) | ||
379 | |||
380 | addi r1, r1, TM_FRAME_SIZE | ||
381 | ld r4, 8(r1) | ||
382 | ld r0, 16(r1) | ||
383 | mtcr r4 | ||
384 | mtlr r0 | ||
385 | ld r2, 40(r1) | ||
386 | blr | ||
387 | |||
388 | /* ****************************************************************** */ | ||
diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c index 32518401af68..f9b751b29558 100644 --- a/arch/powerpc/kernel/traps.c +++ b/arch/powerpc/kernel/traps.c | |||
@@ -58,6 +58,7 @@ | |||
58 | #include <asm/rio.h> | 58 | #include <asm/rio.h> |
59 | #include <asm/fadump.h> | 59 | #include <asm/fadump.h> |
60 | #include <asm/switch_to.h> | 60 | #include <asm/switch_to.h> |
61 | #include <asm/tm.h> | ||
61 | #include <asm/debug.h> | 62 | #include <asm/debug.h> |
62 | 63 | ||
63 | #if defined(CONFIG_DEBUGGER) || defined(CONFIG_KEXEC) | 64 | #if defined(CONFIG_DEBUGGER) || defined(CONFIG_KEXEC) |
@@ -66,7 +67,7 @@ int (*__debugger_ipi)(struct pt_regs *regs) __read_mostly; | |||
66 | int (*__debugger_bpt)(struct pt_regs *regs) __read_mostly; | 67 | int (*__debugger_bpt)(struct pt_regs *regs) __read_mostly; |
67 | int (*__debugger_sstep)(struct pt_regs *regs) __read_mostly; | 68 | int (*__debugger_sstep)(struct pt_regs *regs) __read_mostly; |
68 | int (*__debugger_iabr_match)(struct pt_regs *regs) __read_mostly; | 69 | int (*__debugger_iabr_match)(struct pt_regs *regs) __read_mostly; |
69 | int (*__debugger_dabr_match)(struct pt_regs *regs) __read_mostly; | 70 | int (*__debugger_break_match)(struct pt_regs *regs) __read_mostly; |
70 | int (*__debugger_fault_handler)(struct pt_regs *regs) __read_mostly; | 71 | int (*__debugger_fault_handler)(struct pt_regs *regs) __read_mostly; |
71 | 72 | ||
72 | EXPORT_SYMBOL(__debugger); | 73 | EXPORT_SYMBOL(__debugger); |
@@ -74,10 +75,17 @@ EXPORT_SYMBOL(__debugger_ipi); | |||
74 | EXPORT_SYMBOL(__debugger_bpt); | 75 | EXPORT_SYMBOL(__debugger_bpt); |
75 | EXPORT_SYMBOL(__debugger_sstep); | 76 | EXPORT_SYMBOL(__debugger_sstep); |
76 | EXPORT_SYMBOL(__debugger_iabr_match); | 77 | EXPORT_SYMBOL(__debugger_iabr_match); |
77 | EXPORT_SYMBOL(__debugger_dabr_match); | 78 | EXPORT_SYMBOL(__debugger_break_match); |
78 | EXPORT_SYMBOL(__debugger_fault_handler); | 79 | EXPORT_SYMBOL(__debugger_fault_handler); |
79 | #endif | 80 | #endif |
80 | 81 | ||
82 | /* Transactional Memory trap debug */ | ||
83 | #ifdef TM_DEBUG_SW | ||
84 | #define TM_DEBUG(x...) printk(KERN_INFO x) | ||
85 | #else | ||
86 | #define TM_DEBUG(x...) do { } while(0) | ||
87 | #endif | ||
88 | |||
81 | /* | 89 | /* |
82 | * Trap & Exception support | 90 | * Trap & Exception support |
83 | */ | 91 | */ |
@@ -350,6 +358,7 @@ static inline int check_io_access(struct pt_regs *regs) | |||
350 | exception is in the MSR. */ | 358 | exception is in the MSR. */ |
351 | #define get_reason(regs) ((regs)->msr) | 359 | #define get_reason(regs) ((regs)->msr) |
352 | #define get_mc_reason(regs) ((regs)->msr) | 360 | #define get_mc_reason(regs) ((regs)->msr) |
361 | #define REASON_TM 0x200000 | ||
353 | #define REASON_FP 0x100000 | 362 | #define REASON_FP 0x100000 |
354 | #define REASON_ILLEGAL 0x80000 | 363 | #define REASON_ILLEGAL 0x80000 |
355 | #define REASON_PRIVILEGED 0x40000 | 364 | #define REASON_PRIVILEGED 0x40000 |
@@ -1020,6 +1029,38 @@ void __kprobes program_check_exception(struct pt_regs *regs) | |||
1020 | _exception(SIGTRAP, regs, TRAP_BRKPT, regs->nip); | 1029 | _exception(SIGTRAP, regs, TRAP_BRKPT, regs->nip); |
1021 | return; | 1030 | return; |
1022 | } | 1031 | } |
1032 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | ||
1033 | if (reason & REASON_TM) { | ||
1034 | /* This is a TM "Bad Thing Exception" program check. | ||
1035 | * This occurs when: | ||
1036 | * - An rfid/hrfid/mtmsrd attempts to cause an illegal | ||
1037 | * transition in TM states. | ||
1038 | * - A trechkpt is attempted when transactional. | ||
1039 | * - A treclaim is attempted when non transactional. | ||
1040 | * - A tend is illegally attempted. | ||
1041 | * - writing a TM SPR when transactional. | ||
1042 | */ | ||
1043 | if (!user_mode(regs) && | ||
1044 | report_bug(regs->nip, regs) == BUG_TRAP_TYPE_WARN) { | ||
1045 | regs->nip += 4; | ||
1046 | return; | ||
1047 | } | ||
1048 | /* If usermode caused this, it's done something illegal and | ||
1049 | * gets a SIGILL slap on the wrist. We call it an illegal | ||
1050 | * operand to distinguish from the instruction just being bad | ||
1051 | * (e.g. executing a 'tend' on a CPU without TM!); it's an | ||
1052 | * illegal /placement/ of a valid instruction. | ||
1053 | */ | ||
1054 | if (user_mode(regs)) { | ||
1055 | _exception(SIGILL, regs, ILL_ILLOPN, regs->nip); | ||
1056 | return; | ||
1057 | } else { | ||
1058 | printk(KERN_EMERG "Unexpected TM Bad Thing exception " | ||
1059 | "at %lx (msr 0x%x)\n", regs->nip, reason); | ||
1060 | die("Unrecoverable exception", regs, SIGABRT); | ||
1061 | } | ||
1062 | } | ||
1063 | #endif | ||
1023 | 1064 | ||
1024 | /* We restore the interrupt state now */ | 1065 | /* We restore the interrupt state now */ |
1025 | if (!arch_irq_disabled_regs(regs)) | 1066 | if (!arch_irq_disabled_regs(regs)) |
@@ -1160,6 +1201,109 @@ void vsx_unavailable_exception(struct pt_regs *regs) | |||
1160 | die("Unrecoverable VSX Unavailable Exception", regs, SIGABRT); | 1201 | die("Unrecoverable VSX Unavailable Exception", regs, SIGABRT); |
1161 | } | 1202 | } |
1162 | 1203 | ||
1204 | void tm_unavailable_exception(struct pt_regs *regs) | ||
1205 | { | ||
1206 | /* We restore the interrupt state now */ | ||
1207 | if (!arch_irq_disabled_regs(regs)) | ||
1208 | local_irq_enable(); | ||
1209 | |||
1210 | /* Currently we never expect a TMU exception. Catch | ||
1211 | * this and kill the process! | ||
1212 | */ | ||
1213 | printk(KERN_EMERG "Unexpected TM unavailable exception at %lx " | ||
1214 | "(msr %lx)\n", | ||
1215 | regs->nip, regs->msr); | ||
1216 | |||
1217 | if (user_mode(regs)) { | ||
1218 | _exception(SIGILL, regs, ILL_ILLOPC, regs->nip); | ||
1219 | return; | ||
1220 | } | ||
1221 | |||
1222 | die("Unexpected TM unavailable exception", regs, SIGABRT); | ||
1223 | } | ||
1224 | |||
1225 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | ||
1226 | |||
1227 | extern void do_load_up_fpu(struct pt_regs *regs); | ||
1228 | |||
1229 | void fp_unavailable_tm(struct pt_regs *regs) | ||
1230 | { | ||
1231 | /* Note: This does not handle any kind of FP laziness. */ | ||
1232 | |||
1233 | TM_DEBUG("FP Unavailable trap whilst transactional at 0x%lx, MSR=%lx\n", | ||
1234 | regs->nip, regs->msr); | ||
1235 | tm_enable(); | ||
1236 | |||
1237 | /* We can only have got here if the task started using FP after | ||
1238 | * beginning the transaction. So, the transactional regs are just a | ||
1239 | * copy of the checkpointed ones. But, we still need to recheckpoint | ||
1240 | * as we're enabling FP for the process; it will return, abort the | ||
1241 | * transaction, and probably retry but now with FP enabled. So the | ||
1242 | * checkpointed FP registers need to be loaded. | ||
1243 | */ | ||
1244 | tm_reclaim(¤t->thread, current->thread.regs->msr, | ||
1245 | TM_CAUSE_FAC_UNAV); | ||
1246 | /* Reclaim didn't save out any FPRs to transact_fprs. */ | ||
1247 | |||
1248 | /* Enable FP for the task: */ | ||
1249 | regs->msr |= (MSR_FP | current->thread.fpexc_mode); | ||
1250 | |||
1251 | /* This loads and recheckpoints the FP registers from | ||
1252 | * thread.fpr[]. They will remain in registers after the | ||
1253 | * checkpoint so we don't need to reload them after. | ||
1254 | */ | ||
1255 | tm_recheckpoint(¤t->thread, regs->msr); | ||
1256 | } | ||
1257 | |||
1258 | #ifdef CONFIG_ALTIVEC | ||
1259 | extern void do_load_up_altivec(struct pt_regs *regs); | ||
1260 | |||
1261 | void altivec_unavailable_tm(struct pt_regs *regs) | ||
1262 | { | ||
1263 | /* See the comments in fp_unavailable_tm(). This function operates | ||
1264 | * the same way. | ||
1265 | */ | ||
1266 | |||
1267 | TM_DEBUG("Vector Unavailable trap whilst transactional at 0x%lx," | ||
1268 | "MSR=%lx\n", | ||
1269 | regs->nip, regs->msr); | ||
1270 | tm_enable(); | ||
1271 | tm_reclaim(¤t->thread, current->thread.regs->msr, | ||
1272 | TM_CAUSE_FAC_UNAV); | ||
1273 | regs->msr |= MSR_VEC; | ||
1274 | tm_recheckpoint(¤t->thread, regs->msr); | ||
1275 | current->thread.used_vr = 1; | ||
1276 | } | ||
1277 | #endif | ||
1278 | |||
1279 | #ifdef CONFIG_VSX | ||
1280 | void vsx_unavailable_tm(struct pt_regs *regs) | ||
1281 | { | ||
1282 | /* See the comments in fp_unavailable_tm(). This works similarly, | ||
1283 | * though we're loading both FP and VEC registers in here. | ||
1284 | * | ||
1285 | * If FP isn't in use, load FP regs. If VEC isn't in use, load VEC | ||
1286 | * regs. Either way, set MSR_VSX. | ||
1287 | */ | ||
1288 | |||
1289 | TM_DEBUG("VSX Unavailable trap whilst transactional at 0x%lx," | ||
1290 | "MSR=%lx\n", | ||
1291 | regs->nip, regs->msr); | ||
1292 | |||
1293 | tm_enable(); | ||
1294 | /* This reclaims FP and/or VR regs if they're already enabled */ | ||
1295 | tm_reclaim(¤t->thread, current->thread.regs->msr, | ||
1296 | TM_CAUSE_FAC_UNAV); | ||
1297 | |||
1298 | regs->msr |= MSR_VEC | MSR_FP | current->thread.fpexc_mode | | ||
1299 | MSR_VSX; | ||
1300 | /* This loads & recheckpoints FP and VRs. */ | ||
1301 | tm_recheckpoint(¤t->thread, regs->msr); | ||
1302 | current->thread.used_vsr = 1; | ||
1303 | } | ||
1304 | #endif | ||
1305 | #endif /* CONFIG_PPC_TRANSACTIONAL_MEM */ | ||
1306 | |||
1163 | void performance_monitor_exception(struct pt_regs *regs) | 1307 | void performance_monitor_exception(struct pt_regs *regs) |
1164 | { | 1308 | { |
1165 | __get_cpu_var(irq_stat).pmu_irqs++; | 1309 | __get_cpu_var(irq_stat).pmu_irqs++; |
@@ -1515,7 +1659,7 @@ void unrecoverable_exception(struct pt_regs *regs) | |||
1515 | die("Unrecoverable exception", regs, SIGABRT); | 1659 | die("Unrecoverable exception", regs, SIGABRT); |
1516 | } | 1660 | } |
1517 | 1661 | ||
1518 | #ifdef CONFIG_BOOKE_WDT | 1662 | #if defined(CONFIG_BOOKE_WDT) || defined(CONFIG_40x) |
1519 | /* | 1663 | /* |
1520 | * Default handler for a Watchdog exception, | 1664 | * Default handler for a Watchdog exception, |
1521 | * spins until a reboot occurs | 1665 | * spins until a reboot occurs |
diff --git a/arch/powerpc/kernel/vector.S b/arch/powerpc/kernel/vector.S index e830289d2e48..9e20999aaef2 100644 --- a/arch/powerpc/kernel/vector.S +++ b/arch/powerpc/kernel/vector.S | |||
@@ -7,6 +7,57 @@ | |||
7 | #include <asm/page.h> | 7 | #include <asm/page.h> |
8 | #include <asm/ptrace.h> | 8 | #include <asm/ptrace.h> |
9 | 9 | ||
10 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | ||
11 | /* | ||
12 | * Wrapper to call load_up_altivec from C. | ||
13 | * void do_load_up_altivec(struct pt_regs *regs); | ||
14 | */ | ||
15 | _GLOBAL(do_load_up_altivec) | ||
16 | mflr r0 | ||
17 | std r0, 16(r1) | ||
18 | stdu r1, -112(r1) | ||
19 | |||
20 | subi r6, r3, STACK_FRAME_OVERHEAD | ||
21 | /* load_up_altivec expects r12=MSR, r13=PACA, and returns | ||
22 | * with r12 = new MSR. | ||
23 | */ | ||
24 | ld r12,_MSR(r6) | ||
25 | GET_PACA(r13) | ||
26 | bl load_up_altivec | ||
27 | std r12,_MSR(r6) | ||
28 | |||
29 | ld r0, 112+16(r1) | ||
30 | addi r1, r1, 112 | ||
31 | mtlr r0 | ||
32 | blr | ||
33 | |||
34 | /* void do_load_up_transact_altivec(struct thread_struct *thread) | ||
35 | * | ||
36 | * This is similar to load_up_altivec but for the transactional version of the | ||
37 | * vector regs. It doesn't mess with the task MSR or valid flags. | ||
38 | * Furthermore, VEC laziness is not supported with TM currently. | ||
39 | */ | ||
40 | _GLOBAL(do_load_up_transact_altivec) | ||
41 | mfmsr r6 | ||
42 | oris r5,r6,MSR_VEC@h | ||
43 | MTMSRD(r5) | ||
44 | isync | ||
45 | |||
46 | li r4,1 | ||
47 | stw r4,THREAD_USED_VR(r3) | ||
48 | |||
49 | li r10,THREAD_TRANSACT_VSCR | ||
50 | lvx vr0,r10,r3 | ||
51 | mtvscr vr0 | ||
52 | REST_32VRS_TRANSACT(0,r4,r3) | ||
53 | |||
54 | /* Disable VEC again. */ | ||
55 | MTMSRD(r6) | ||
56 | isync | ||
57 | |||
58 | blr | ||
59 | #endif | ||
60 | |||
10 | /* | 61 | /* |
11 | * load_up_altivec(unused, unused, tsk) | 62 | * load_up_altivec(unused, unused, tsk) |
12 | * Disable VMX for the task which had it previously, | 63 | * Disable VMX for the task which had it previously, |
diff --git a/arch/powerpc/kernel/vmlinux.lds.S b/arch/powerpc/kernel/vmlinux.lds.S index 65d1c08cf09e..654e479802f2 100644 --- a/arch/powerpc/kernel/vmlinux.lds.S +++ b/arch/powerpc/kernel/vmlinux.lds.S | |||
@@ -218,6 +218,11 @@ SECTIONS | |||
218 | 218 | ||
219 | .got : AT(ADDR(.got) - LOAD_OFFSET) { | 219 | .got : AT(ADDR(.got) - LOAD_OFFSET) { |
220 | __toc_start = .; | 220 | __toc_start = .; |
221 | #ifndef CONFIG_RELOCATABLE | ||
222 | __prom_init_toc_start = .; | ||
223 | arch/powerpc/kernel/prom_init.o*(.toc .got) | ||
224 | __prom_init_toc_end = .; | ||
225 | #endif | ||
221 | *(.got) | 226 | *(.got) |
222 | *(.toc) | 227 | *(.toc) |
223 | } | 228 | } |
diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S b/arch/powerpc/kvm/book3s_hv_rmhandlers.S index 10b6c358dd77..e33d11f1b977 100644 --- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S +++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S | |||
@@ -539,6 +539,11 @@ fast_guest_return: | |||
539 | 539 | ||
540 | /* Enter guest */ | 540 | /* Enter guest */ |
541 | 541 | ||
542 | BEGIN_FTR_SECTION | ||
543 | ld r5, VCPU_CFAR(r4) | ||
544 | mtspr SPRN_CFAR, r5 | ||
545 | END_FTR_SECTION_IFSET(CPU_FTR_CFAR) | ||
546 | |||
542 | ld r5, VCPU_LR(r4) | 547 | ld r5, VCPU_LR(r4) |
543 | lwz r6, VCPU_CR(r4) | 548 | lwz r6, VCPU_CR(r4) |
544 | mtlr r5 | 549 | mtlr r5 |
@@ -604,6 +609,10 @@ kvmppc_interrupt: | |||
604 | lwz r4, HSTATE_SCRATCH1(r13) | 609 | lwz r4, HSTATE_SCRATCH1(r13) |
605 | std r3, VCPU_GPR(R12)(r9) | 610 | std r3, VCPU_GPR(R12)(r9) |
606 | stw r4, VCPU_CR(r9) | 611 | stw r4, VCPU_CR(r9) |
612 | BEGIN_FTR_SECTION | ||
613 | ld r3, HSTATE_CFAR(r13) | ||
614 | std r3, VCPU_CFAR(r9) | ||
615 | END_FTR_SECTION_IFSET(CPU_FTR_CFAR) | ||
607 | 616 | ||
608 | /* Restore R1/R2 so we can handle faults */ | 617 | /* Restore R1/R2 so we can handle faults */ |
609 | ld r1, HSTATE_HOST_R1(r13) | 618 | ld r1, HSTATE_HOST_R1(r13) |
diff --git a/arch/powerpc/kvm/book3s_pr.c b/arch/powerpc/kvm/book3s_pr.c index 28d38adeca73..6702442ca818 100644 --- a/arch/powerpc/kvm/book3s_pr.c +++ b/arch/powerpc/kvm/book3s_pr.c | |||
@@ -34,6 +34,8 @@ | |||
34 | #include <asm/kvm_book3s.h> | 34 | #include <asm/kvm_book3s.h> |
35 | #include <asm/mmu_context.h> | 35 | #include <asm/mmu_context.h> |
36 | #include <asm/switch_to.h> | 36 | #include <asm/switch_to.h> |
37 | #include <asm/firmware.h> | ||
38 | #include <asm/hvcall.h> | ||
37 | #include <linux/gfp.h> | 39 | #include <linux/gfp.h> |
38 | #include <linux/sched.h> | 40 | #include <linux/sched.h> |
39 | #include <linux/vmalloc.h> | 41 | #include <linux/vmalloc.h> |
@@ -1284,12 +1286,21 @@ void kvmppc_core_flush_memslot(struct kvm *kvm, struct kvm_memory_slot *memslot) | |||
1284 | { | 1286 | { |
1285 | } | 1287 | } |
1286 | 1288 | ||
1289 | static unsigned int kvm_global_user_count = 0; | ||
1290 | static DEFINE_SPINLOCK(kvm_global_user_count_lock); | ||
1291 | |||
1287 | int kvmppc_core_init_vm(struct kvm *kvm) | 1292 | int kvmppc_core_init_vm(struct kvm *kvm) |
1288 | { | 1293 | { |
1289 | #ifdef CONFIG_PPC64 | 1294 | #ifdef CONFIG_PPC64 |
1290 | INIT_LIST_HEAD(&kvm->arch.spapr_tce_tables); | 1295 | INIT_LIST_HEAD(&kvm->arch.spapr_tce_tables); |
1291 | #endif | 1296 | #endif |
1292 | 1297 | ||
1298 | if (firmware_has_feature(FW_FEATURE_SET_MODE)) { | ||
1299 | spin_lock(&kvm_global_user_count_lock); | ||
1300 | if (++kvm_global_user_count == 1) | ||
1301 | pSeries_disable_reloc_on_exc(); | ||
1302 | spin_unlock(&kvm_global_user_count_lock); | ||
1303 | } | ||
1293 | return 0; | 1304 | return 0; |
1294 | } | 1305 | } |
1295 | 1306 | ||
@@ -1298,6 +1309,14 @@ void kvmppc_core_destroy_vm(struct kvm *kvm) | |||
1298 | #ifdef CONFIG_PPC64 | 1309 | #ifdef CONFIG_PPC64 |
1299 | WARN_ON(!list_empty(&kvm->arch.spapr_tce_tables)); | 1310 | WARN_ON(!list_empty(&kvm->arch.spapr_tce_tables)); |
1300 | #endif | 1311 | #endif |
1312 | |||
1313 | if (firmware_has_feature(FW_FEATURE_SET_MODE)) { | ||
1314 | spin_lock(&kvm_global_user_count_lock); | ||
1315 | BUG_ON(kvm_global_user_count == 0); | ||
1316 | if (--kvm_global_user_count == 0) | ||
1317 | pSeries_enable_reloc_on_exc(); | ||
1318 | spin_unlock(&kvm_global_user_count_lock); | ||
1319 | } | ||
1301 | } | 1320 | } |
1302 | 1321 | ||
1303 | static int kvmppc_book3s_init(void) | 1322 | static int kvmppc_book3s_init(void) |
diff --git a/arch/powerpc/lib/Makefile b/arch/powerpc/lib/Makefile index 746e0c895cd7..450433276699 100644 --- a/arch/powerpc/lib/Makefile +++ b/arch/powerpc/lib/Makefile | |||
@@ -4,7 +4,7 @@ | |||
4 | 4 | ||
5 | subdir-ccflags-$(CONFIG_PPC_WERROR) := -Werror | 5 | subdir-ccflags-$(CONFIG_PPC_WERROR) := -Werror |
6 | 6 | ||
7 | ccflags-$(CONFIG_PPC64) := -mno-minimal-toc | 7 | ccflags-$(CONFIG_PPC64) := $(NO_MINIMAL_TOC) |
8 | 8 | ||
9 | CFLAGS_REMOVE_code-patching.o = -pg | 9 | CFLAGS_REMOVE_code-patching.o = -pg |
10 | CFLAGS_REMOVE_feature-fixups.o = -pg | 10 | CFLAGS_REMOVE_feature-fixups.o = -pg |
@@ -19,9 +19,7 @@ obj-$(CONFIG_PPC64) += copypage_64.o copyuser_64.o \ | |||
19 | checksum_wrappers_64.o hweight_64.o \ | 19 | checksum_wrappers_64.o hweight_64.o \ |
20 | copyuser_power7.o string_64.o copypage_power7.o \ | 20 | copyuser_power7.o string_64.o copypage_power7.o \ |
21 | memcpy_power7.o | 21 | memcpy_power7.o |
22 | obj-$(CONFIG_XMON) += sstep.o ldstfp.o | 22 | obj-$(CONFIG_PPC_EMULATE_SSTEP) += sstep.o ldstfp.o |
23 | obj-$(CONFIG_KPROBES) += sstep.o ldstfp.o | ||
24 | obj-$(CONFIG_HAVE_HW_BREAKPOINT) += sstep.o ldstfp.o | ||
25 | 23 | ||
26 | ifeq ($(CONFIG_PPC64),y) | 24 | ifeq ($(CONFIG_PPC64),y) |
27 | obj-$(CONFIG_SMP) += locks.o | 25 | obj-$(CONFIG_SMP) += locks.o |
diff --git a/arch/powerpc/mm/Makefile b/arch/powerpc/mm/Makefile index 3787b61f7d20..cf16b5733eaa 100644 --- a/arch/powerpc/mm/Makefile +++ b/arch/powerpc/mm/Makefile | |||
@@ -4,7 +4,7 @@ | |||
4 | 4 | ||
5 | subdir-ccflags-$(CONFIG_PPC_WERROR) := -Werror | 5 | subdir-ccflags-$(CONFIG_PPC_WERROR) := -Werror |
6 | 6 | ||
7 | ccflags-$(CONFIG_PPC64) := -mno-minimal-toc | 7 | ccflags-$(CONFIG_PPC64) := $(NO_MINIMAL_TOC) |
8 | 8 | ||
9 | obj-y := fault.o mem.o pgtable.o gup.o \ | 9 | obj-y := fault.o mem.o pgtable.o gup.o \ |
10 | init_$(CONFIG_WORD_SIZE).o \ | 10 | init_$(CONFIG_WORD_SIZE).o \ |
diff --git a/arch/powerpc/mm/fault.c b/arch/powerpc/mm/fault.c index 3a8489a354e9..229951ffc351 100644 --- a/arch/powerpc/mm/fault.c +++ b/arch/powerpc/mm/fault.c | |||
@@ -249,8 +249,8 @@ int __kprobes do_page_fault(struct pt_regs *regs, unsigned long address, | |||
249 | #if !(defined(CONFIG_4xx) || defined(CONFIG_BOOKE) || \ | 249 | #if !(defined(CONFIG_4xx) || defined(CONFIG_BOOKE) || \ |
250 | defined(CONFIG_PPC_BOOK3S_64)) | 250 | defined(CONFIG_PPC_BOOK3S_64)) |
251 | if (error_code & DSISR_DABRMATCH) { | 251 | if (error_code & DSISR_DABRMATCH) { |
252 | /* DABR match */ | 252 | /* breakpoint match */ |
253 | do_dabr(regs, address, error_code); | 253 | do_break(regs, address, error_code); |
254 | return 0; | 254 | return 0; |
255 | } | 255 | } |
256 | #endif | 256 | #endif |
diff --git a/arch/powerpc/mm/hash_utils_64.c b/arch/powerpc/mm/hash_utils_64.c index 3a292be2e079..1b6e1271719f 100644 --- a/arch/powerpc/mm/hash_utils_64.c +++ b/arch/powerpc/mm/hash_utils_64.c | |||
@@ -55,6 +55,7 @@ | |||
55 | #include <asm/code-patching.h> | 55 | #include <asm/code-patching.h> |
56 | #include <asm/fadump.h> | 56 | #include <asm/fadump.h> |
57 | #include <asm/firmware.h> | 57 | #include <asm/firmware.h> |
58 | #include <asm/tm.h> | ||
58 | 59 | ||
59 | #ifdef DEBUG | 60 | #ifdef DEBUG |
60 | #define DBG(fmt...) udbg_printf(fmt) | 61 | #define DBG(fmt...) udbg_printf(fmt) |
@@ -1171,6 +1172,21 @@ void flush_hash_page(unsigned long vpn, real_pte_t pte, int psize, int ssize, | |||
1171 | DBG_LOW(" sub %ld: hash=%lx, hidx=%lx\n", index, slot, hidx); | 1172 | DBG_LOW(" sub %ld: hash=%lx, hidx=%lx\n", index, slot, hidx); |
1172 | ppc_md.hpte_invalidate(slot, vpn, psize, ssize, local); | 1173 | ppc_md.hpte_invalidate(slot, vpn, psize, ssize, local); |
1173 | } pte_iterate_hashed_end(); | 1174 | } pte_iterate_hashed_end(); |
1175 | |||
1176 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | ||
1177 | /* Transactions are not aborted by tlbiel, only tlbie. | ||
1178 | * Without, syncing a page back to a block device w/ PIO could pick up | ||
1179 | * transactional data (bad!) so we force an abort here. Before the | ||
1180 | * sync the page will be made read-only, which will flush_hash_page. | ||
1181 | * BIG ISSUE here: if the kernel uses a page from userspace without | ||
1182 | * unmapping it first, it may see the speculated version. | ||
1183 | */ | ||
1184 | if (local && cpu_has_feature(CPU_FTR_TM) && | ||
1185 | MSR_TM_ACTIVE(current->thread.regs->msr)) { | ||
1186 | tm_enable(); | ||
1187 | tm_abort(TM_CAUSE_TLBI); | ||
1188 | } | ||
1189 | #endif | ||
1174 | } | 1190 | } |
1175 | 1191 | ||
1176 | void flush_hash_range(unsigned long number, int local) | 1192 | void flush_hash_range(unsigned long number, int local) |
diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c index 0dba5066c22a..40df7c8f2096 100644 --- a/arch/powerpc/mm/mem.c +++ b/arch/powerpc/mm/mem.c | |||
@@ -195,13 +195,10 @@ void __init do_init_bootmem(void) | |||
195 | min_low_pfn = MEMORY_START >> PAGE_SHIFT; | 195 | min_low_pfn = MEMORY_START >> PAGE_SHIFT; |
196 | boot_mapsize = init_bootmem_node(NODE_DATA(0), start >> PAGE_SHIFT, min_low_pfn, max_low_pfn); | 196 | boot_mapsize = init_bootmem_node(NODE_DATA(0), start >> PAGE_SHIFT, min_low_pfn, max_low_pfn); |
197 | 197 | ||
198 | /* Add active regions with valid PFNs */ | 198 | /* Place all memblock_regions in the same node and merge contiguous |
199 | for_each_memblock(memory, reg) { | 199 | * memblock_regions |
200 | unsigned long start_pfn, end_pfn; | 200 | */ |
201 | start_pfn = memblock_region_memory_base_pfn(reg); | 201 | memblock_set_node(0, (phys_addr_t)ULLONG_MAX, 0); |
202 | end_pfn = memblock_region_memory_end_pfn(reg); | ||
203 | memblock_set_node(0, (phys_addr_t)ULLONG_MAX, 0); | ||
204 | } | ||
205 | 202 | ||
206 | /* Add all physical memory to the bootmem map, mark each area | 203 | /* Add all physical memory to the bootmem map, mark each area |
207 | * present. | 204 | * present. |
diff --git a/arch/powerpc/oprofile/Makefile b/arch/powerpc/oprofile/Makefile index 73456c4cec28..751ec7bd5018 100644 --- a/arch/powerpc/oprofile/Makefile +++ b/arch/powerpc/oprofile/Makefile | |||
@@ -1,6 +1,6 @@ | |||
1 | subdir-ccflags-$(CONFIG_PPC_WERROR) := -Werror | 1 | subdir-ccflags-$(CONFIG_PPC_WERROR) := -Werror |
2 | 2 | ||
3 | ccflags-$(CONFIG_PPC64) := -mno-minimal-toc | 3 | ccflags-$(CONFIG_PPC64) := $(NO_MINIMAL_TOC) |
4 | 4 | ||
5 | obj-$(CONFIG_OPROFILE) += oprofile.o | 5 | obj-$(CONFIG_OPROFILE) += oprofile.o |
6 | 6 | ||
diff --git a/arch/powerpc/perf/core-book3s.c b/arch/powerpc/perf/core-book3s.c index fa476d50791f..65362e98eb26 100644 --- a/arch/powerpc/perf/core-book3s.c +++ b/arch/powerpc/perf/core-book3s.c | |||
@@ -880,8 +880,16 @@ static int power_pmu_add(struct perf_event *event, int ef_flags) | |||
880 | cpuhw->events[n0] = event->hw.config; | 880 | cpuhw->events[n0] = event->hw.config; |
881 | cpuhw->flags[n0] = event->hw.event_base; | 881 | cpuhw->flags[n0] = event->hw.event_base; |
882 | 882 | ||
883 | /* | ||
884 | * This event may have been disabled/stopped in record_and_restart() | ||
885 | * because we exceeded the ->event_limit. If re-starting the event, | ||
886 | * clear the ->hw.state (STOPPED and UPTODATE flags), so the user | ||
887 | * notification is re-enabled. | ||
888 | */ | ||
883 | if (!(ef_flags & PERF_EF_START)) | 889 | if (!(ef_flags & PERF_EF_START)) |
884 | event->hw.state = PERF_HES_STOPPED | PERF_HES_UPTODATE; | 890 | event->hw.state = PERF_HES_STOPPED | PERF_HES_UPTODATE; |
891 | else | ||
892 | event->hw.state = 0; | ||
885 | 893 | ||
886 | /* | 894 | /* |
887 | * If group events scheduling transaction was started, | 895 | * If group events scheduling transaction was started, |
@@ -1359,6 +1367,8 @@ static void record_and_restart(struct perf_event *event, unsigned long val, | |||
1359 | */ | 1367 | */ |
1360 | val = 0; | 1368 | val = 0; |
1361 | left = local64_read(&event->hw.period_left) - delta; | 1369 | left = local64_read(&event->hw.period_left) - delta; |
1370 | if (delta == 0) | ||
1371 | left++; | ||
1362 | if (period) { | 1372 | if (period) { |
1363 | if (left <= 0) { | 1373 | if (left <= 0) { |
1364 | left += period; | 1374 | left += period; |
@@ -1422,11 +1432,8 @@ unsigned long perf_instruction_pointer(struct pt_regs *regs) | |||
1422 | return regs->nip; | 1432 | return regs->nip; |
1423 | } | 1433 | } |
1424 | 1434 | ||
1425 | static bool pmc_overflow(unsigned long val) | 1435 | static bool pmc_overflow_power7(unsigned long val) |
1426 | { | 1436 | { |
1427 | if ((int)val < 0) | ||
1428 | return true; | ||
1429 | |||
1430 | /* | 1437 | /* |
1431 | * Events on POWER7 can roll back if a speculative event doesn't | 1438 | * Events on POWER7 can roll back if a speculative event doesn't |
1432 | * eventually complete. Unfortunately in some rare cases they will | 1439 | * eventually complete. Unfortunately in some rare cases they will |
@@ -1438,7 +1445,15 @@ static bool pmc_overflow(unsigned long val) | |||
1438 | * PMCs because a user might set a period of less than 256 and we | 1445 | * PMCs because a user might set a period of less than 256 and we |
1439 | * don't want to mistakenly reset them. | 1446 | * don't want to mistakenly reset them. |
1440 | */ | 1447 | */ |
1441 | if (pvr_version_is(PVR_POWER7) && ((0x80000000 - val) <= 256)) | 1448 | if ((0x80000000 - val) <= 256) |
1449 | return true; | ||
1450 | |||
1451 | return false; | ||
1452 | } | ||
1453 | |||
1454 | static bool pmc_overflow(unsigned long val) | ||
1455 | { | ||
1456 | if ((int)val < 0) | ||
1442 | return true; | 1457 | return true; |
1443 | 1458 | ||
1444 | return false; | 1459 | return false; |
@@ -1449,11 +1464,11 @@ static bool pmc_overflow(unsigned long val) | |||
1449 | */ | 1464 | */ |
1450 | static void perf_event_interrupt(struct pt_regs *regs) | 1465 | static void perf_event_interrupt(struct pt_regs *regs) |
1451 | { | 1466 | { |
1452 | int i; | 1467 | int i, j; |
1453 | struct cpu_hw_events *cpuhw = &__get_cpu_var(cpu_hw_events); | 1468 | struct cpu_hw_events *cpuhw = &__get_cpu_var(cpu_hw_events); |
1454 | struct perf_event *event; | 1469 | struct perf_event *event; |
1455 | unsigned long val; | 1470 | unsigned long val[8]; |
1456 | int found = 0; | 1471 | int found, active; |
1457 | int nmi; | 1472 | int nmi; |
1458 | 1473 | ||
1459 | if (cpuhw->n_limited) | 1474 | if (cpuhw->n_limited) |
@@ -1468,33 +1483,53 @@ static void perf_event_interrupt(struct pt_regs *regs) | |||
1468 | else | 1483 | else |
1469 | irq_enter(); | 1484 | irq_enter(); |
1470 | 1485 | ||
1471 | for (i = 0; i < cpuhw->n_events; ++i) { | 1486 | /* Read all the PMCs since we'll need them a bunch of times */ |
1472 | event = cpuhw->event[i]; | 1487 | for (i = 0; i < ppmu->n_counter; ++i) |
1473 | if (!event->hw.idx || is_limited_pmc(event->hw.idx)) | 1488 | val[i] = read_pmc(i + 1); |
1489 | |||
1490 | /* Try to find what caused the IRQ */ | ||
1491 | found = 0; | ||
1492 | for (i = 0; i < ppmu->n_counter; ++i) { | ||
1493 | if (!pmc_overflow(val[i])) | ||
1474 | continue; | 1494 | continue; |
1475 | val = read_pmc(event->hw.idx); | 1495 | if (is_limited_pmc(i + 1)) |
1476 | if ((int)val < 0) { | 1496 | continue; /* these won't generate IRQs */ |
1477 | /* event has overflowed */ | 1497 | /* |
1478 | found = 1; | 1498 | * We've found one that's overflowed. For active |
1479 | record_and_restart(event, val, regs); | 1499 | * counters we need to log this. For inactive |
1500 | * counters, we need to reset it anyway | ||
1501 | */ | ||
1502 | found = 1; | ||
1503 | active = 0; | ||
1504 | for (j = 0; j < cpuhw->n_events; ++j) { | ||
1505 | event = cpuhw->event[j]; | ||
1506 | if (event->hw.idx == (i + 1)) { | ||
1507 | active = 1; | ||
1508 | record_and_restart(event, val[i], regs); | ||
1509 | break; | ||
1510 | } | ||
1480 | } | 1511 | } |
1512 | if (!active) | ||
1513 | /* reset non active counters that have overflowed */ | ||
1514 | write_pmc(i + 1, 0); | ||
1481 | } | 1515 | } |
1482 | 1516 | if (!found && pvr_version_is(PVR_POWER7)) { | |
1483 | /* | 1517 | /* check active counters for special buggy p7 overflow */ |
1484 | * In case we didn't find and reset the event that caused | 1518 | for (i = 0; i < cpuhw->n_events; ++i) { |
1485 | * the interrupt, scan all events and reset any that are | 1519 | event = cpuhw->event[i]; |
1486 | * negative, to avoid getting continual interrupts. | 1520 | if (!event->hw.idx || is_limited_pmc(event->hw.idx)) |
1487 | * Any that we processed in the previous loop will not be negative. | ||
1488 | */ | ||
1489 | if (!found) { | ||
1490 | for (i = 0; i < ppmu->n_counter; ++i) { | ||
1491 | if (is_limited_pmc(i + 1)) | ||
1492 | continue; | 1521 | continue; |
1493 | val = read_pmc(i + 1); | 1522 | if (pmc_overflow_power7(val[event->hw.idx - 1])) { |
1494 | if (pmc_overflow(val)) | 1523 | /* event has overflowed in a buggy way*/ |
1495 | write_pmc(i + 1, 0); | 1524 | found = 1; |
1525 | record_and_restart(event, | ||
1526 | val[event->hw.idx - 1], | ||
1527 | regs); | ||
1528 | } | ||
1496 | } | 1529 | } |
1497 | } | 1530 | } |
1531 | if ((!found) && printk_ratelimit()) | ||
1532 | printk(KERN_WARNING "Can't find PMC that caused IRQ\n"); | ||
1498 | 1533 | ||
1499 | /* | 1534 | /* |
1500 | * Reset MMCR0 to its normal value. This will set PMXE and | 1535 | * Reset MMCR0 to its normal value. This will set PMXE and |
diff --git a/arch/powerpc/perf/e500-pmu.c b/arch/powerpc/perf/e500-pmu.c index cb2e2949c8d1..fb664929f5da 100644 --- a/arch/powerpc/perf/e500-pmu.c +++ b/arch/powerpc/perf/e500-pmu.c | |||
@@ -24,6 +24,8 @@ static int e500_generic_events[] = { | |||
24 | [PERF_COUNT_HW_CACHE_MISSES] = 41, /* Data L1 cache reloads */ | 24 | [PERF_COUNT_HW_CACHE_MISSES] = 41, /* Data L1 cache reloads */ |
25 | [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = 12, | 25 | [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = 12, |
26 | [PERF_COUNT_HW_BRANCH_MISSES] = 15, | 26 | [PERF_COUNT_HW_BRANCH_MISSES] = 15, |
27 | [PERF_COUNT_HW_STALLED_CYCLES_FRONTEND] = 18, | ||
28 | [PERF_COUNT_HW_STALLED_CYCLES_BACKEND] = 19, | ||
27 | }; | 29 | }; |
28 | 30 | ||
29 | #define C(x) PERF_COUNT_HW_CACHE_##x | 31 | #define C(x) PERF_COUNT_HW_CACHE_##x |
diff --git a/arch/powerpc/platforms/44x/Kconfig b/arch/powerpc/platforms/44x/Kconfig index 8abf6fb8f410..0effe9f5a1ea 100644 --- a/arch/powerpc/platforms/44x/Kconfig +++ b/arch/powerpc/platforms/44x/Kconfig | |||
@@ -252,6 +252,14 @@ config PPC4xx_GPIO | |||
252 | help | 252 | help |
253 | Enable gpiolib support for ppc440 based boards | 253 | Enable gpiolib support for ppc440 based boards |
254 | 254 | ||
255 | config PPC4xx_OCM | ||
256 | bool "PPC4xx On Chip Memory (OCM) support" | ||
257 | depends on 4xx | ||
258 | select PPC_LIB_RHEAP | ||
259 | help | ||
260 | Enable OCM support for PowerPC 4xx platforms with on chip memory, | ||
261 | OCM provides the fast place for memory access to improve performance. | ||
262 | |||
255 | # 44x specific CPU modules, selected based on the board above. | 263 | # 44x specific CPU modules, selected based on the board above. |
256 | config 440EP | 264 | config 440EP |
257 | bool | 265 | bool |
diff --git a/arch/powerpc/platforms/512x/clock.c b/arch/powerpc/platforms/512x/clock.c index 9f771e05457c..52d57d281724 100644 --- a/arch/powerpc/platforms/512x/clock.c +++ b/arch/powerpc/platforms/512x/clock.c | |||
@@ -26,6 +26,7 @@ | |||
26 | 26 | ||
27 | #include <linux/of_platform.h> | 27 | #include <linux/of_platform.h> |
28 | #include <asm/mpc5xxx.h> | 28 | #include <asm/mpc5xxx.h> |
29 | #include <asm/mpc5121.h> | ||
29 | #include <asm/clk_interface.h> | 30 | #include <asm/clk_interface.h> |
30 | 31 | ||
31 | #undef CLK_DEBUG | 32 | #undef CLK_DEBUG |
@@ -122,7 +123,7 @@ struct mpc512x_clockctl { | |||
122 | u32 dccr; /* DIU Clk Cnfg Reg */ | 123 | u32 dccr; /* DIU Clk Cnfg Reg */ |
123 | }; | 124 | }; |
124 | 125 | ||
125 | struct mpc512x_clockctl __iomem *clockctl; | 126 | static struct mpc512x_clockctl __iomem *clockctl; |
126 | 127 | ||
127 | static int mpc5121_clk_enable(struct clk *clk) | 128 | static int mpc5121_clk_enable(struct clk *clk) |
128 | { | 129 | { |
@@ -184,7 +185,7 @@ static unsigned long spmf_mult(void) | |||
184 | 36, 40, 44, 48, | 185 | 36, 40, 44, 48, |
185 | 52, 56, 60, 64 | 186 | 52, 56, 60, 64 |
186 | }; | 187 | }; |
187 | int spmf = (clockctl->spmr >> 24) & 0xf; | 188 | int spmf = (in_be32(&clockctl->spmr) >> 24) & 0xf; |
188 | return spmf_to_mult[spmf]; | 189 | return spmf_to_mult[spmf]; |
189 | } | 190 | } |
190 | 191 | ||
@@ -206,7 +207,7 @@ static unsigned long sysdiv_div_x_2(void) | |||
206 | 52, 56, 58, 62, | 207 | 52, 56, 58, 62, |
207 | 60, 64, 66, | 208 | 60, 64, 66, |
208 | }; | 209 | }; |
209 | int sysdiv = (clockctl->scfr2 >> 26) & 0x3f; | 210 | int sysdiv = (in_be32(&clockctl->scfr2) >> 26) & 0x3f; |
210 | return sysdiv_to_div_x_2[sysdiv]; | 211 | return sysdiv_to_div_x_2[sysdiv]; |
211 | } | 212 | } |
212 | 213 | ||
@@ -230,7 +231,7 @@ static unsigned long sys_to_ref(unsigned long rate) | |||
230 | 231 | ||
231 | static long ips_to_ref(unsigned long rate) | 232 | static long ips_to_ref(unsigned long rate) |
232 | { | 233 | { |
233 | int ips_div = (clockctl->scfr1 >> 23) & 0x7; | 234 | int ips_div = (in_be32(&clockctl->scfr1) >> 23) & 0x7; |
234 | 235 | ||
235 | rate *= ips_div; /* csb_clk = ips_clk * ips_div */ | 236 | rate *= ips_div; /* csb_clk = ips_clk * ips_div */ |
236 | rate *= 2; /* sys_clk = csb_clk * 2 */ | 237 | rate *= 2; /* sys_clk = csb_clk * 2 */ |
@@ -284,7 +285,7 @@ static struct clk sys_clk = { | |||
284 | 285 | ||
285 | static void diu_clk_calc(struct clk *clk) | 286 | static void diu_clk_calc(struct clk *clk) |
286 | { | 287 | { |
287 | int diudiv_x_2 = clockctl->scfr1 & 0xff; | 288 | int diudiv_x_2 = in_be32(&clockctl->scfr1) & 0xff; |
288 | unsigned long rate; | 289 | unsigned long rate; |
289 | 290 | ||
290 | rate = sys_clk.rate; | 291 | rate = sys_clk.rate; |
@@ -311,7 +312,7 @@ static void half_clk_calc(struct clk *clk) | |||
311 | 312 | ||
312 | static void generic_div_clk_calc(struct clk *clk) | 313 | static void generic_div_clk_calc(struct clk *clk) |
313 | { | 314 | { |
314 | int div = (clockctl->scfr1 >> clk->div_shift) & 0x7; | 315 | int div = (in_be32(&clockctl->scfr1) >> clk->div_shift) & 0x7; |
315 | 316 | ||
316 | clk->rate = clk->parent->rate / div; | 317 | clk->rate = clk->parent->rate / div; |
317 | } | 318 | } |
@@ -329,7 +330,7 @@ static struct clk csb_clk = { | |||
329 | 330 | ||
330 | static void e300_clk_calc(struct clk *clk) | 331 | static void e300_clk_calc(struct clk *clk) |
331 | { | 332 | { |
332 | int spmf = (clockctl->spmr >> 16) & 0xf; | 333 | int spmf = (in_be32(&clockctl->spmr) >> 16) & 0xf; |
333 | int ratex2 = clk->parent->rate * spmf; | 334 | int ratex2 = clk->parent->rate * spmf; |
334 | 335 | ||
335 | clk->rate = ratex2 / 2; | 336 | clk->rate = ratex2 / 2; |
@@ -551,7 +552,7 @@ static struct clk ac97_clk = { | |||
551 | .calc = ac97_clk_calc, | 552 | .calc = ac97_clk_calc, |
552 | }; | 553 | }; |
553 | 554 | ||
554 | struct clk *rate_clks[] = { | 555 | static struct clk *rate_clks[] = { |
555 | &ref_clk, | 556 | &ref_clk, |
556 | &sys_clk, | 557 | &sys_clk, |
557 | &diu_clk, | 558 | &diu_clk, |
@@ -607,7 +608,7 @@ static void rate_clks_init(void) | |||
607 | * There are two clk enable registers with 32 enable bits each | 608 | * There are two clk enable registers with 32 enable bits each |
608 | * psc clocks and device clocks are all stored in dev_clks | 609 | * psc clocks and device clocks are all stored in dev_clks |
609 | */ | 610 | */ |
610 | struct clk dev_clks[2][32]; | 611 | static struct clk dev_clks[2][32]; |
611 | 612 | ||
612 | /* | 613 | /* |
613 | * Given a psc number return the dev_clk | 614 | * Given a psc number return the dev_clk |
@@ -648,12 +649,12 @@ static void psc_calc_rate(struct clk *clk, int pscnum, struct device_node *np) | |||
648 | out_be32(&clockctl->pccr[pscnum], 0x00020000); | 649 | out_be32(&clockctl->pccr[pscnum], 0x00020000); |
649 | out_be32(&clockctl->pccr[pscnum], 0x00030000); | 650 | out_be32(&clockctl->pccr[pscnum], 0x00030000); |
650 | 651 | ||
651 | if (clockctl->pccr[pscnum] & 0x80) { | 652 | if (in_be32(&clockctl->pccr[pscnum]) & 0x80) { |
652 | clk->rate = spdif_rxclk.rate; | 653 | clk->rate = spdif_rxclk.rate; |
653 | return; | 654 | return; |
654 | } | 655 | } |
655 | 656 | ||
656 | switch ((clockctl->pccr[pscnum] >> 14) & 0x3) { | 657 | switch ((in_be32(&clockctl->pccr[pscnum]) >> 14) & 0x3) { |
657 | case 0: | 658 | case 0: |
658 | mclk_src = sys_clk.rate; | 659 | mclk_src = sys_clk.rate; |
659 | break; | 660 | break; |
@@ -668,7 +669,7 @@ static void psc_calc_rate(struct clk *clk, int pscnum, struct device_node *np) | |||
668 | break; | 669 | break; |
669 | } | 670 | } |
670 | 671 | ||
671 | mclk_div = ((clockctl->pccr[pscnum] >> 17) & 0x7fff) + 1; | 672 | mclk_div = ((in_be32(&clockctl->pccr[pscnum]) >> 17) & 0x7fff) + 1; |
672 | clk->rate = mclk_src / mclk_div; | 673 | clk->rate = mclk_src / mclk_div; |
673 | } | 674 | } |
674 | 675 | ||
@@ -680,13 +681,12 @@ static void psc_calc_rate(struct clk *clk, int pscnum, struct device_node *np) | |||
680 | static void psc_clks_init(void) | 681 | static void psc_clks_init(void) |
681 | { | 682 | { |
682 | struct device_node *np; | 683 | struct device_node *np; |
683 | const u32 *cell_index; | ||
684 | struct platform_device *ofdev; | 684 | struct platform_device *ofdev; |
685 | u32 reg; | ||
685 | 686 | ||
686 | for_each_compatible_node(np, NULL, "fsl,mpc5121-psc") { | 687 | for_each_compatible_node(np, NULL, "fsl,mpc5121-psc") { |
687 | cell_index = of_get_property(np, "cell-index", NULL); | 688 | if (!of_property_read_u32(np, "reg", ®)) { |
688 | if (cell_index) { | 689 | int pscnum = (reg & 0xf00) >> 8; |
689 | int pscnum = *cell_index; | ||
690 | struct clk *clk = psc_dev_clk(pscnum); | 690 | struct clk *clk = psc_dev_clk(pscnum); |
691 | 691 | ||
692 | clk->flags = CLK_HAS_RATE | CLK_HAS_CTRL; | 692 | clk->flags = CLK_HAS_RATE | CLK_HAS_CTRL; |
@@ -696,7 +696,7 @@ static void psc_clks_init(void) | |||
696 | * AC97 is special rate clock does | 696 | * AC97 is special rate clock does |
697 | * not go through normal path | 697 | * not go through normal path |
698 | */ | 698 | */ |
699 | if (strcmp("ac97", np->name) == 0) | 699 | if (of_device_is_compatible(np, "fsl,mpc5121-psc-ac97")) |
700 | clk->rate = ac97_clk.rate; | 700 | clk->rate = ac97_clk.rate; |
701 | else | 701 | else |
702 | psc_calc_rate(clk, pscnum, np); | 702 | psc_calc_rate(clk, pscnum, np); |
diff --git a/arch/powerpc/platforms/512x/mpc512x_shared.c b/arch/powerpc/platforms/512x/mpc512x_shared.c index 35f14fda108a..d30235b7e3f7 100644 --- a/arch/powerpc/platforms/512x/mpc512x_shared.c +++ b/arch/powerpc/platforms/512x/mpc512x_shared.c | |||
@@ -68,10 +68,6 @@ struct fsl_diu_shared_fb { | |||
68 | bool in_use; | 68 | bool in_use; |
69 | }; | 69 | }; |
70 | 70 | ||
71 | void mpc512x_set_monitor_port(enum fsl_diu_monitor_port port) | ||
72 | { | ||
73 | } | ||
74 | |||
75 | #define DIU_DIV_MASK 0x000000ff | 71 | #define DIU_DIV_MASK 0x000000ff |
76 | void mpc512x_set_pixel_clock(unsigned int pixclock) | 72 | void mpc512x_set_pixel_clock(unsigned int pixclock) |
77 | { | 73 | { |
@@ -303,7 +299,6 @@ void __init mpc512x_setup_diu(void) | |||
303 | } | 299 | } |
304 | } | 300 | } |
305 | 301 | ||
306 | diu_ops.set_monitor_port = mpc512x_set_monitor_port; | ||
307 | diu_ops.set_pixel_clock = mpc512x_set_pixel_clock; | 302 | diu_ops.set_pixel_clock = mpc512x_set_pixel_clock; |
308 | diu_ops.valid_monitor_port = mpc512x_valid_monitor_port; | 303 | diu_ops.valid_monitor_port = mpc512x_valid_monitor_port; |
309 | diu_ops.release_bootmem = mpc512x_release_bootmem; | 304 | diu_ops.release_bootmem = mpc512x_release_bootmem; |
@@ -431,8 +426,38 @@ void __init mpc512x_psc_fifo_init(void) | |||
431 | 426 | ||
432 | void __init mpc512x_init(void) | 427 | void __init mpc512x_init(void) |
433 | { | 428 | { |
434 | mpc512x_declare_of_platform_devices(); | ||
435 | mpc5121_clk_init(); | 429 | mpc5121_clk_init(); |
430 | mpc512x_declare_of_platform_devices(); | ||
436 | mpc512x_restart_init(); | 431 | mpc512x_restart_init(); |
437 | mpc512x_psc_fifo_init(); | 432 | mpc512x_psc_fifo_init(); |
438 | } | 433 | } |
434 | |||
435 | /** | ||
436 | * mpc512x_cs_config - Setup chip select configuration | ||
437 | * @cs: chip select number | ||
438 | * @val: chip select configuration value | ||
439 | * | ||
440 | * Perform chip select configuration for devices on LocalPlus Bus. | ||
441 | * Intended to dynamically reconfigure the chip select parameters | ||
442 | * for configurable devices on the bus. | ||
443 | */ | ||
444 | int mpc512x_cs_config(unsigned int cs, u32 val) | ||
445 | { | ||
446 | static struct mpc512x_lpc __iomem *lpc; | ||
447 | struct device_node *np; | ||
448 | |||
449 | if (cs > 7) | ||
450 | return -EINVAL; | ||
451 | |||
452 | if (!lpc) { | ||
453 | np = of_find_compatible_node(NULL, NULL, "fsl,mpc5121-lpc"); | ||
454 | lpc = of_iomap(np, 0); | ||
455 | of_node_put(np); | ||
456 | if (!lpc) | ||
457 | return -ENOMEM; | ||
458 | } | ||
459 | |||
460 | out_be32(&lpc->cs_cfg[cs], val); | ||
461 | return 0; | ||
462 | } | ||
463 | EXPORT_SYMBOL(mpc512x_cs_config); | ||
diff --git a/arch/powerpc/platforms/52xx/mpc52xx_lpbfifo.c b/arch/powerpc/platforms/52xx/mpc52xx_lpbfifo.c index f9f4537f546d..be7b1aa4d54c 100644 --- a/arch/powerpc/platforms/52xx/mpc52xx_lpbfifo.c +++ b/arch/powerpc/platforms/52xx/mpc52xx_lpbfifo.c | |||
@@ -20,9 +20,9 @@ | |||
20 | #include <asm/mpc52xx.h> | 20 | #include <asm/mpc52xx.h> |
21 | #include <asm/time.h> | 21 | #include <asm/time.h> |
22 | 22 | ||
23 | #include <sysdev/bestcomm/bestcomm.h> | 23 | #include <linux/fsl/bestcomm/bestcomm.h> |
24 | #include <sysdev/bestcomm/bestcomm_priv.h> | 24 | #include <linux/fsl/bestcomm/bestcomm_priv.h> |
25 | #include <sysdev/bestcomm/gen_bd.h> | 25 | #include <linux/fsl/bestcomm/gen_bd.h> |
26 | 26 | ||
27 | MODULE_AUTHOR("Grant Likely <grant.likely@secretlab.ca>"); | 27 | MODULE_AUTHOR("Grant Likely <grant.likely@secretlab.ca>"); |
28 | MODULE_DESCRIPTION("MPC5200 LocalPlus FIFO device driver"); | 28 | MODULE_DESCRIPTION("MPC5200 LocalPlus FIFO device driver"); |
diff --git a/arch/powerpc/platforms/82xx/km82xx.c b/arch/powerpc/platforms/82xx/km82xx.c index cf964e19573a..058cc1895c88 100644 --- a/arch/powerpc/platforms/82xx/km82xx.c +++ b/arch/powerpc/platforms/82xx/km82xx.c | |||
@@ -18,11 +18,11 @@ | |||
18 | #include <linux/fsl_devices.h> | 18 | #include <linux/fsl_devices.h> |
19 | #include <linux/of_platform.h> | 19 | #include <linux/of_platform.h> |
20 | 20 | ||
21 | #include <asm/io.h> | 21 | #include <linux/io.h> |
22 | #include <asm/cpm2.h> | 22 | #include <asm/cpm2.h> |
23 | #include <asm/udbg.h> | 23 | #include <asm/udbg.h> |
24 | #include <asm/machdep.h> | 24 | #include <asm/machdep.h> |
25 | #include <asm/time.h> | 25 | #include <linux/time.h> |
26 | #include <asm/mpc8260.h> | 26 | #include <asm/mpc8260.h> |
27 | #include <asm/prom.h> | 27 | #include <asm/prom.h> |
28 | 28 | ||
@@ -36,7 +36,7 @@ static void __init km82xx_pic_init(void) | |||
36 | struct device_node *np = of_find_compatible_node(NULL, NULL, | 36 | struct device_node *np = of_find_compatible_node(NULL, NULL, |
37 | "fsl,pq2-pic"); | 37 | "fsl,pq2-pic"); |
38 | if (!np) { | 38 | if (!np) { |
39 | printk(KERN_ERR "PIC init: can not find cpm-pic node\n"); | 39 | pr_err("PIC init: can not find cpm-pic node\n"); |
40 | return; | 40 | return; |
41 | } | 41 | } |
42 | 42 | ||
diff --git a/arch/powerpc/platforms/82xx/pq2.c b/arch/powerpc/platforms/82xx/pq2.c index fb94d10e5a4d..fc8b2d6a7d8d 100644 --- a/arch/powerpc/platforms/82xx/pq2.c +++ b/arch/powerpc/platforms/82xx/pq2.c | |||
@@ -71,11 +71,11 @@ err: | |||
71 | 71 | ||
72 | void __init pq2_init_pci(void) | 72 | void __init pq2_init_pci(void) |
73 | { | 73 | { |
74 | struct device_node *np = NULL; | 74 | struct device_node *np; |
75 | 75 | ||
76 | ppc_md.pci_exclude_device = pq2_pci_exclude_device; | 76 | ppc_md.pci_exclude_device = pq2_pci_exclude_device; |
77 | 77 | ||
78 | while ((np = of_find_compatible_node(np, NULL, "fsl,pq2-pci"))) | 78 | for_each_compatible_node(np, NULL, "fsl,pq2-pci") |
79 | pq2_pci_add_bridge(np); | 79 | pq2_pci_add_bridge(np); |
80 | } | 80 | } |
81 | #endif | 81 | #endif |
diff --git a/arch/powerpc/platforms/83xx/km83xx.c b/arch/powerpc/platforms/83xx/km83xx.c index 89923d723349..bf4c4473abb9 100644 --- a/arch/powerpc/platforms/83xx/km83xx.c +++ b/arch/powerpc/platforms/83xx/km83xx.c | |||
@@ -28,8 +28,8 @@ | |||
28 | #include <linux/of_device.h> | 28 | #include <linux/of_device.h> |
29 | 29 | ||
30 | #include <linux/atomic.h> | 30 | #include <linux/atomic.h> |
31 | #include <asm/time.h> | 31 | #include <linux/time.h> |
32 | #include <asm/io.h> | 32 | #include <linux/io.h> |
33 | #include <asm/machdep.h> | 33 | #include <asm/machdep.h> |
34 | #include <asm/ipic.h> | 34 | #include <asm/ipic.h> |
35 | #include <asm/irq.h> | 35 | #include <asm/irq.h> |
@@ -43,6 +43,82 @@ | |||
43 | #include "mpc83xx.h" | 43 | #include "mpc83xx.h" |
44 | 44 | ||
45 | #define SVR_REV(svr) (((svr) >> 0) & 0xFFFF) /* Revision field */ | 45 | #define SVR_REV(svr) (((svr) >> 0) & 0xFFFF) /* Revision field */ |
46 | |||
47 | static void quirk_mpc8360e_qe_enet10(void) | ||
48 | { | ||
49 | /* | ||
50 | * handle mpc8360E Erratum QE_ENET10: | ||
51 | * RGMII AC values do not meet the specification | ||
52 | */ | ||
53 | uint svid = mfspr(SPRN_SVR); | ||
54 | struct device_node *np_par; | ||
55 | struct resource res; | ||
56 | void __iomem *base; | ||
57 | int ret; | ||
58 | |||
59 | np_par = of_find_node_by_name(NULL, "par_io"); | ||
60 | if (np_par == NULL) { | ||
61 | pr_warn("%s couldn;t find par_io node\n", __func__); | ||
62 | return; | ||
63 | } | ||
64 | /* Map Parallel I/O ports registers */ | ||
65 | ret = of_address_to_resource(np_par, 0, &res); | ||
66 | if (ret) { | ||
67 | pr_warn("%s couldn;t map par_io registers\n", __func__); | ||
68 | return; | ||
69 | } | ||
70 | |||
71 | base = ioremap(res.start, res.end - res.start + 1); | ||
72 | |||
73 | /* | ||
74 | * set output delay adjustments to default values according | ||
75 | * table 5 in Errata Rev. 5, 9/2011: | ||
76 | * | ||
77 | * write 0b01 to UCC1 bits 18:19 | ||
78 | * write 0b01 to UCC2 option 1 bits 4:5 | ||
79 | * write 0b01 to UCC2 option 2 bits 16:17 | ||
80 | */ | ||
81 | clrsetbits_be32((base + 0xa8), 0x0c00f000, 0x04005000); | ||
82 | |||
83 | /* | ||
84 | * set output delay adjustments to default values according | ||
85 | * table 3-13 in Reference Manual Rev.3 05/2010: | ||
86 | * | ||
87 | * write 0b01 to UCC2 option 2 bits 16:17 | ||
88 | * write 0b0101 to UCC1 bits 20:23 | ||
89 | * write 0b0101 to UCC2 option 1 bits 24:27 | ||
90 | */ | ||
91 | clrsetbits_be32((base + 0xac), 0x0000cff0, 0x00004550); | ||
92 | |||
93 | if (SVR_REV(svid) == 0x0021) { | ||
94 | /* | ||
95 | * UCC2 option 1: write 0b1010 to bits 24:27 | ||
96 | * at address IMMRBAR+0x14AC | ||
97 | */ | ||
98 | clrsetbits_be32((base + 0xac), 0x000000f0, 0x000000a0); | ||
99 | } else if (SVR_REV(svid) == 0x0020) { | ||
100 | /* | ||
101 | * UCC1: write 0b11 to bits 18:19 | ||
102 | * at address IMMRBAR+0x14A8 | ||
103 | */ | ||
104 | setbits32((base + 0xa8), 0x00003000); | ||
105 | |||
106 | /* | ||
107 | * UCC2 option 1: write 0b11 to bits 4:5 | ||
108 | * at address IMMRBAR+0x14A8 | ||
109 | */ | ||
110 | setbits32((base + 0xa8), 0x0c000000); | ||
111 | |||
112 | /* | ||
113 | * UCC2 option 2: write 0b11 to bits 16:17 | ||
114 | * at address IMMRBAR+0x14AC | ||
115 | */ | ||
116 | setbits32((base + 0xac), 0x0000c000); | ||
117 | } | ||
118 | iounmap(base); | ||
119 | of_node_put(np_par); | ||
120 | } | ||
121 | |||
46 | /* ************************************************************************ | 122 | /* ************************************************************************ |
47 | * | 123 | * |
48 | * Setup the architecture | 124 | * Setup the architecture |
@@ -72,84 +148,13 @@ static void __init mpc83xx_km_setup_arch(void) | |||
72 | 148 | ||
73 | for_each_node_by_name(np, "ucc") | 149 | for_each_node_by_name(np, "ucc") |
74 | par_io_of_config(np); | 150 | par_io_of_config(np); |
75 | } | ||
76 | |||
77 | np = of_find_compatible_node(NULL, "network", "ucc_geth"); | ||
78 | if (np != NULL) { | ||
79 | /* | ||
80 | * handle mpc8360E Erratum QE_ENET10: | ||
81 | * RGMII AC values do not meet the specification | ||
82 | */ | ||
83 | uint svid = mfspr(SPRN_SVR); | ||
84 | struct device_node *np_par; | ||
85 | struct resource res; | ||
86 | void __iomem *base; | ||
87 | int ret; | ||
88 | |||
89 | np_par = of_find_node_by_name(NULL, "par_io"); | ||
90 | if (np_par == NULL) { | ||
91 | printk(KERN_WARNING "%s couldn;t find par_io node\n", | ||
92 | __func__); | ||
93 | return; | ||
94 | } | ||
95 | /* Map Parallel I/O ports registers */ | ||
96 | ret = of_address_to_resource(np_par, 0, &res); | ||
97 | if (ret) { | ||
98 | printk(KERN_WARNING "%s couldn;t map par_io registers\n", | ||
99 | __func__); | ||
100 | return; | ||
101 | } | ||
102 | |||
103 | base = ioremap(res.start, res.end - res.start + 1); | ||
104 | |||
105 | /* | ||
106 | * set output delay adjustments to default values according | ||
107 | * table 5 in Errata Rev. 5, 9/2011: | ||
108 | * | ||
109 | * write 0b01 to UCC1 bits 18:19 | ||
110 | * write 0b01 to UCC2 option 1 bits 4:5 | ||
111 | * write 0b01 to UCC2 option 2 bits 16:17 | ||
112 | */ | ||
113 | clrsetbits_be32((base + 0xa8), 0x0c00f000, 0x04005000); | ||
114 | 151 | ||
115 | /* | 152 | /* Only apply this quirk when par_io is available */ |
116 | * set output delay adjustments to default values according | 153 | np = of_find_compatible_node(NULL, "network", "ucc_geth"); |
117 | * table 3-13 in Reference Manual Rev.3 05/2010: | 154 | if (np != NULL) { |
118 | * | 155 | quirk_mpc8360e_qe_enet10(); |
119 | * write 0b01 to UCC2 option 2 bits 16:17 | 156 | of_node_put(np); |
120 | * write 0b0101 to UCC1 bits 20:23 | ||
121 | * write 0b0101 to UCC2 option 1 bits 24:27 | ||
122 | */ | ||
123 | clrsetbits_be32((base + 0xac), 0x0000cff0, 0x00004550); | ||
124 | |||
125 | if (SVR_REV(svid) == 0x0021) { | ||
126 | /* | ||
127 | * UCC2 option 1: write 0b1010 to bits 24:27 | ||
128 | * at address IMMRBAR+0x14AC | ||
129 | */ | ||
130 | clrsetbits_be32((base + 0xac), 0x000000f0, 0x000000a0); | ||
131 | } else if (SVR_REV(svid) == 0x0020) { | ||
132 | /* | ||
133 | * UCC1: write 0b11 to bits 18:19 | ||
134 | * at address IMMRBAR+0x14A8 | ||
135 | */ | ||
136 | setbits32((base + 0xa8), 0x00003000); | ||
137 | |||
138 | /* | ||
139 | * UCC2 option 1: write 0b11 to bits 4:5 | ||
140 | * at address IMMRBAR+0x14A8 | ||
141 | */ | ||
142 | setbits32((base + 0xa8), 0x0c000000); | ||
143 | |||
144 | /* | ||
145 | * UCC2 option 2: write 0b11 to bits 16:17 | ||
146 | * at address IMMRBAR+0x14AC | ||
147 | */ | ||
148 | setbits32((base + 0xac), 0x0000c000); | ||
149 | } | 157 | } |
150 | iounmap(base); | ||
151 | of_node_put(np_par); | ||
152 | of_node_put(np); | ||
153 | } | 158 | } |
154 | #endif /* CONFIG_QUICC_ENGINE */ | 159 | #endif /* CONFIG_QUICC_ENGINE */ |
155 | } | 160 | } |
diff --git a/arch/powerpc/platforms/85xx/Kconfig b/arch/powerpc/platforms/85xx/Kconfig index 92ab60a62711..a0dcd577fb0d 100644 --- a/arch/powerpc/platforms/85xx/Kconfig +++ b/arch/powerpc/platforms/85xx/Kconfig | |||
@@ -191,6 +191,13 @@ config SBC8548 | |||
191 | help | 191 | help |
192 | This option enables support for the Wind River SBC8548 board | 192 | This option enables support for the Wind River SBC8548 board |
193 | 193 | ||
194 | config PPA8548 | ||
195 | bool "Prodrive PPA8548" | ||
196 | help | ||
197 | This option enables support for the Prodrive PPA8548 board. | ||
198 | select DEFAULT_UIMAGE | ||
199 | select HAS_RAPIDIO | ||
200 | |||
194 | config GE_IMP3A | 201 | config GE_IMP3A |
195 | bool "GE Intelligent Platforms IMP3A" | 202 | bool "GE Intelligent Platforms IMP3A" |
196 | select DEFAULT_UIMAGE | 203 | select DEFAULT_UIMAGE |
@@ -245,6 +252,14 @@ config P4080_DS | |||
245 | help | 252 | help |
246 | This option enables support for the P4080 DS board | 253 | This option enables support for the P4080 DS board |
247 | 254 | ||
255 | config SGY_CTS1000 | ||
256 | tristate "Servergy CTS-1000 support" | ||
257 | select GPIOLIB | ||
258 | select OF_GPIO | ||
259 | depends on P4080_DS | ||
260 | help | ||
261 | Enable this to support functionality in Servergy's CTS-1000 systems. | ||
262 | |||
248 | endif # PPC32 | 263 | endif # PPC32 |
249 | 264 | ||
250 | config P5020_DS | 265 | config P5020_DS |
diff --git a/arch/powerpc/platforms/85xx/Makefile b/arch/powerpc/platforms/85xx/Makefile index 76f679cb04a0..07d0dbb141c0 100644 --- a/arch/powerpc/platforms/85xx/Makefile +++ b/arch/powerpc/platforms/85xx/Makefile | |||
@@ -25,8 +25,10 @@ obj-$(CONFIG_P5040_DS) += p5040_ds.o corenet_ds.o | |||
25 | obj-$(CONFIG_STX_GP3) += stx_gp3.o | 25 | obj-$(CONFIG_STX_GP3) += stx_gp3.o |
26 | obj-$(CONFIG_TQM85xx) += tqm85xx.o | 26 | obj-$(CONFIG_TQM85xx) += tqm85xx.o |
27 | obj-$(CONFIG_SBC8548) += sbc8548.o | 27 | obj-$(CONFIG_SBC8548) += sbc8548.o |
28 | obj-$(CONFIG_PPA8548) += ppa8548.o | ||
28 | obj-$(CONFIG_SOCRATES) += socrates.o socrates_fpga_pic.o | 29 | obj-$(CONFIG_SOCRATES) += socrates.o socrates_fpga_pic.o |
29 | obj-$(CONFIG_KSI8560) += ksi8560.o | 30 | obj-$(CONFIG_KSI8560) += ksi8560.o |
30 | obj-$(CONFIG_XES_MPC85xx) += xes_mpc85xx.o | 31 | obj-$(CONFIG_XES_MPC85xx) += xes_mpc85xx.o |
31 | obj-$(CONFIG_GE_IMP3A) += ge_imp3a.o | 32 | obj-$(CONFIG_GE_IMP3A) += ge_imp3a.o |
32 | obj-$(CONFIG_PPC_QEMU_E500) += qemu_e500.o | 33 | obj-$(CONFIG_PPC_QEMU_E500) += qemu_e500.o |
34 | obj-$(CONFIG_SGY_CTS1000) += sgy_cts1000.o | ||
diff --git a/arch/powerpc/platforms/85xx/mpc85xx_mds.c b/arch/powerpc/platforms/85xx/mpc85xx_mds.c index bd12588fa252..a7b3621a8df5 100644 --- a/arch/powerpc/platforms/85xx/mpc85xx_mds.c +++ b/arch/powerpc/platforms/85xx/mpc85xx_mds.c | |||
@@ -206,9 +206,7 @@ static void __init mpc85xx_mds_reset_ucc_phys(void) | |||
206 | setbits8(&bcsr_regs[7], BCSR7_UCC12_GETHnRST); | 206 | setbits8(&bcsr_regs[7], BCSR7_UCC12_GETHnRST); |
207 | clrbits8(&bcsr_regs[8], BCSR8_UEM_MARVELL_RST); | 207 | clrbits8(&bcsr_regs[8], BCSR8_UEM_MARVELL_RST); |
208 | 208 | ||
209 | for (np = NULL; (np = of_find_compatible_node(np, | 209 | for_each_compatible_node(np, "network", "ucc_geth") { |
210 | "network", | ||
211 | "ucc_geth")) != NULL;) { | ||
212 | const unsigned int *prop; | 210 | const unsigned int *prop; |
213 | int ucc_num; | 211 | int ucc_num; |
214 | 212 | ||
diff --git a/arch/powerpc/platforms/85xx/p1022_ds.c b/arch/powerpc/platforms/85xx/p1022_ds.c index e346edf7f157..e611e79f23ce 100644 --- a/arch/powerpc/platforms/85xx/p1022_ds.c +++ b/arch/powerpc/platforms/85xx/p1022_ds.c | |||
@@ -106,42 +106,6 @@ | |||
106 | (c2 << AD_COMP_2_SHIFT) | (c1 << AD_COMP_1_SHIFT) | \ | 106 | (c2 << AD_COMP_2_SHIFT) | (c1 << AD_COMP_1_SHIFT) | \ |
107 | (c0 << AD_COMP_0_SHIFT) | (size << AD_PIXEL_S_SHIFT)) | 107 | (c0 << AD_COMP_0_SHIFT) | (size << AD_PIXEL_S_SHIFT)) |
108 | 108 | ||
109 | /** | ||
110 | * p1022ds_get_pixel_format: return the Area Descriptor for a given pixel depth | ||
111 | * | ||
112 | * The Area Descriptor is a 32-bit value that determine which bits in each | ||
113 | * pixel are to be used for each color. | ||
114 | */ | ||
115 | static u32 p1022ds_get_pixel_format(enum fsl_diu_monitor_port port, | ||
116 | unsigned int bits_per_pixel) | ||
117 | { | ||
118 | switch (bits_per_pixel) { | ||
119 | case 32: | ||
120 | /* 0x88883316 */ | ||
121 | return MAKE_AD(3, 2, 0, 1, 3, 8, 8, 8, 8); | ||
122 | case 24: | ||
123 | /* 0x88082219 */ | ||
124 | return MAKE_AD(4, 0, 1, 2, 2, 0, 8, 8, 8); | ||
125 | case 16: | ||
126 | /* 0x65053118 */ | ||
127 | return MAKE_AD(4, 2, 1, 0, 1, 5, 6, 5, 0); | ||
128 | default: | ||
129 | pr_err("fsl-diu: unsupported pixel depth %u\n", bits_per_pixel); | ||
130 | return 0; | ||
131 | } | ||
132 | } | ||
133 | |||
134 | /** | ||
135 | * p1022ds_set_gamma_table: update the gamma table, if necessary | ||
136 | * | ||
137 | * On some boards, the gamma table for some ports may need to be modified. | ||
138 | * This is not the case on the P1022DS, so we do nothing. | ||
139 | */ | ||
140 | static void p1022ds_set_gamma_table(enum fsl_diu_monitor_port port, | ||
141 | char *gamma_table_base) | ||
142 | { | ||
143 | } | ||
144 | |||
145 | struct fsl_law { | 109 | struct fsl_law { |
146 | u32 lawbar; | 110 | u32 lawbar; |
147 | u32 reserved1; | 111 | u32 reserved1; |
@@ -302,7 +266,7 @@ static void p1022ds_set_monitor_port(enum fsl_diu_monitor_port port) | |||
302 | goto exit; | 266 | goto exit; |
303 | } | 267 | } |
304 | cs1_addr = lbc_br_to_phys(ecm, num_laws, br1); | 268 | cs1_addr = lbc_br_to_phys(ecm, num_laws, br1); |
305 | if (!cs0_addr) { | 269 | if (!cs1_addr) { |
306 | pr_err("p1022ds: could not determine physical address for CS1" | 270 | pr_err("p1022ds: could not determine physical address for CS1" |
307 | " (BR1=%08x)\n", br1); | 271 | " (BR1=%08x)\n", br1); |
308 | goto exit; | 272 | goto exit; |
@@ -510,8 +474,6 @@ static void __init p1022_ds_setup_arch(void) | |||
510 | ppc_md.progress("p1022_ds_setup_arch()", 0); | 474 | ppc_md.progress("p1022_ds_setup_arch()", 0); |
511 | 475 | ||
512 | #if defined(CONFIG_FB_FSL_DIU) || defined(CONFIG_FB_FSL_DIU_MODULE) | 476 | #if defined(CONFIG_FB_FSL_DIU) || defined(CONFIG_FB_FSL_DIU_MODULE) |
513 | diu_ops.get_pixel_format = p1022ds_get_pixel_format; | ||
514 | diu_ops.set_gamma_table = p1022ds_set_gamma_table; | ||
515 | diu_ops.set_monitor_port = p1022ds_set_monitor_port; | 477 | diu_ops.set_monitor_port = p1022ds_set_monitor_port; |
516 | diu_ops.set_pixel_clock = p1022ds_set_pixel_clock; | 478 | diu_ops.set_pixel_clock = p1022ds_set_pixel_clock; |
517 | diu_ops.valid_monitor_port = p1022ds_valid_monitor_port; | 479 | diu_ops.valid_monitor_port = p1022ds_valid_monitor_port; |
diff --git a/arch/powerpc/platforms/85xx/p1022_rdk.c b/arch/powerpc/platforms/85xx/p1022_rdk.c index 55ffa1cc380c..8c9297112b30 100644 --- a/arch/powerpc/platforms/85xx/p1022_rdk.c +++ b/arch/powerpc/platforms/85xx/p1022_rdk.c | |||
@@ -35,17 +35,6 @@ | |||
35 | #define CLKDVDR_PXCLK_MASK 0x00FF0000 | 35 | #define CLKDVDR_PXCLK_MASK 0x00FF0000 |
36 | 36 | ||
37 | /** | 37 | /** |
38 | * p1022rdk_set_monitor_port: switch the output to a different monitor port | ||
39 | */ | ||
40 | static void p1022rdk_set_monitor_port(enum fsl_diu_monitor_port port) | ||
41 | { | ||
42 | if (port != FSL_DIU_PORT_DVI) { | ||
43 | pr_err("p1022rdk: unsupported monitor port %i\n", port); | ||
44 | return; | ||
45 | } | ||
46 | } | ||
47 | |||
48 | /** | ||
49 | * p1022rdk_set_pixel_clock: program the DIU's clock | 38 | * p1022rdk_set_pixel_clock: program the DIU's clock |
50 | * | 39 | * |
51 | * @pixclock: the wavelength, in picoseconds, of the clock | 40 | * @pixclock: the wavelength, in picoseconds, of the clock |
@@ -124,7 +113,6 @@ static void __init p1022_rdk_setup_arch(void) | |||
124 | ppc_md.progress("p1022_rdk_setup_arch()", 0); | 113 | ppc_md.progress("p1022_rdk_setup_arch()", 0); |
125 | 114 | ||
126 | #if defined(CONFIG_FB_FSL_DIU) || defined(CONFIG_FB_FSL_DIU_MODULE) | 115 | #if defined(CONFIG_FB_FSL_DIU) || defined(CONFIG_FB_FSL_DIU_MODULE) |
127 | diu_ops.set_monitor_port = p1022rdk_set_monitor_port; | ||
128 | diu_ops.set_pixel_clock = p1022rdk_set_pixel_clock; | 116 | diu_ops.set_pixel_clock = p1022rdk_set_pixel_clock; |
129 | diu_ops.valid_monitor_port = p1022rdk_valid_monitor_port; | 117 | diu_ops.valid_monitor_port = p1022rdk_valid_monitor_port; |
130 | #endif | 118 | #endif |
diff --git a/arch/powerpc/platforms/85xx/ppa8548.c b/arch/powerpc/platforms/85xx/ppa8548.c new file mode 100644 index 000000000000..6a7704b92c3b --- /dev/null +++ b/arch/powerpc/platforms/85xx/ppa8548.c | |||
@@ -0,0 +1,98 @@ | |||
1 | /* | ||
2 | * ppa8548 setup and early boot code. | ||
3 | * | ||
4 | * Copyright 2009 Prodrive B.V.. | ||
5 | * | ||
6 | * By Stef van Os (see MAINTAINERS for contact information) | ||
7 | * | ||
8 | * Based on the SBC8548 support - Copyright 2007 Wind River Systems Inc. | ||
9 | * Based on the MPC8548CDS support - Copyright 2005 Freescale Inc. | ||
10 | * | ||
11 | * This program is free software; you can redistribute it and/or modify it | ||
12 | * under the terms of the GNU General Public License as published by the | ||
13 | * Free Software Foundation; either version 2 of the License, or (at your | ||
14 | * option) any later version. | ||
15 | */ | ||
16 | |||
17 | #include <linux/stddef.h> | ||
18 | #include <linux/kernel.h> | ||
19 | #include <linux/init.h> | ||
20 | #include <linux/reboot.h> | ||
21 | #include <linux/seq_file.h> | ||
22 | #include <linux/of_platform.h> | ||
23 | |||
24 | #include <asm/machdep.h> | ||
25 | #include <asm/udbg.h> | ||
26 | #include <asm/mpic.h> | ||
27 | |||
28 | #include <sysdev/fsl_soc.h> | ||
29 | |||
30 | static void __init ppa8548_pic_init(void) | ||
31 | { | ||
32 | struct mpic *mpic = mpic_alloc(NULL, 0, MPIC_BIG_ENDIAN, | ||
33 | 0, 256, " OpenPIC "); | ||
34 | BUG_ON(mpic == NULL); | ||
35 | mpic_init(mpic); | ||
36 | } | ||
37 | |||
38 | /* | ||
39 | * Setup the architecture | ||
40 | */ | ||
41 | static void __init ppa8548_setup_arch(void) | ||
42 | { | ||
43 | if (ppc_md.progress) | ||
44 | ppc_md.progress("ppa8548_setup_arch()", 0); | ||
45 | } | ||
46 | |||
47 | static void ppa8548_show_cpuinfo(struct seq_file *m) | ||
48 | { | ||
49 | uint32_t svid, phid1; | ||
50 | |||
51 | svid = mfspr(SPRN_SVR); | ||
52 | |||
53 | seq_printf(m, "Vendor\t\t: Prodrive B.V.\n"); | ||
54 | seq_printf(m, "SVR\t\t: 0x%x\n", svid); | ||
55 | |||
56 | /* Display cpu Pll setting */ | ||
57 | phid1 = mfspr(SPRN_HID1); | ||
58 | seq_printf(m, "PLL setting\t: 0x%x\n", ((phid1 >> 24) & 0x3f)); | ||
59 | } | ||
60 | |||
61 | static struct of_device_id __initdata of_bus_ids[] = { | ||
62 | { .name = "soc", }, | ||
63 | { .type = "soc", }, | ||
64 | { .compatible = "simple-bus", }, | ||
65 | { .compatible = "gianfar", }, | ||
66 | { .compatible = "fsl,srio", }, | ||
67 | {}, | ||
68 | }; | ||
69 | |||
70 | static int __init declare_of_platform_devices(void) | ||
71 | { | ||
72 | of_platform_bus_probe(NULL, of_bus_ids, NULL); | ||
73 | |||
74 | return 0; | ||
75 | } | ||
76 | machine_device_initcall(ppa8548, declare_of_platform_devices); | ||
77 | |||
78 | /* | ||
79 | * Called very early, device-tree isn't unflattened | ||
80 | */ | ||
81 | static int __init ppa8548_probe(void) | ||
82 | { | ||
83 | unsigned long root = of_get_flat_dt_root(); | ||
84 | |||
85 | return of_flat_dt_is_compatible(root, "ppa8548"); | ||
86 | } | ||
87 | |||
88 | define_machine(ppa8548) { | ||
89 | .name = "ppa8548", | ||
90 | .probe = ppa8548_probe, | ||
91 | .setup_arch = ppa8548_setup_arch, | ||
92 | .init_IRQ = ppa8548_pic_init, | ||
93 | .show_cpuinfo = ppa8548_show_cpuinfo, | ||
94 | .get_irq = mpic_get_irq, | ||
95 | .restart = fsl_rstcr_restart, | ||
96 | .calibrate_decr = generic_calibrate_decr, | ||
97 | .progress = udbg_progress, | ||
98 | }; | ||
diff --git a/arch/powerpc/platforms/85xx/qemu_e500.c b/arch/powerpc/platforms/85xx/qemu_e500.c index f6ea5618c733..5cefc5a9a144 100644 --- a/arch/powerpc/platforms/85xx/qemu_e500.c +++ b/arch/powerpc/platforms/85xx/qemu_e500.c | |||
@@ -29,9 +29,10 @@ | |||
29 | void __init qemu_e500_pic_init(void) | 29 | void __init qemu_e500_pic_init(void) |
30 | { | 30 | { |
31 | struct mpic *mpic; | 31 | struct mpic *mpic; |
32 | unsigned int flags = MPIC_BIG_ENDIAN | MPIC_SINGLE_DEST_CPU | | ||
33 | MPIC_ENABLE_COREINT; | ||
32 | 34 | ||
33 | mpic = mpic_alloc(NULL, 0, MPIC_BIG_ENDIAN | MPIC_SINGLE_DEST_CPU, | 35 | mpic = mpic_alloc(NULL, 0, flags, 0, 256, " OpenPIC "); |
34 | 0, 256, " OpenPIC "); | ||
35 | 36 | ||
36 | BUG_ON(mpic == NULL); | 37 | BUG_ON(mpic == NULL); |
37 | mpic_init(mpic); | 38 | mpic_init(mpic); |
@@ -66,7 +67,7 @@ define_machine(qemu_e500) { | |||
66 | #ifdef CONFIG_PCI | 67 | #ifdef CONFIG_PCI |
67 | .pcibios_fixup_bus = fsl_pcibios_fixup_bus, | 68 | .pcibios_fixup_bus = fsl_pcibios_fixup_bus, |
68 | #endif | 69 | #endif |
69 | .get_irq = mpic_get_irq, | 70 | .get_irq = mpic_get_coreint_irq, |
70 | .restart = fsl_rstcr_restart, | 71 | .restart = fsl_rstcr_restart, |
71 | .calibrate_decr = generic_calibrate_decr, | 72 | .calibrate_decr = generic_calibrate_decr, |
72 | .progress = udbg_progress, | 73 | .progress = udbg_progress, |
diff --git a/arch/powerpc/platforms/85xx/sgy_cts1000.c b/arch/powerpc/platforms/85xx/sgy_cts1000.c new file mode 100644 index 000000000000..611e92f291c4 --- /dev/null +++ b/arch/powerpc/platforms/85xx/sgy_cts1000.c | |||
@@ -0,0 +1,176 @@ | |||
1 | /* | ||
2 | * Servergy CTS-1000 Setup | ||
3 | * | ||
4 | * Maintained by Ben Collins <ben.c@servergy.com> | ||
5 | * | ||
6 | * Copyright 2012 by Servergy, Inc. | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify it | ||
9 | * under the terms of the GNU General Public License as published by the | ||
10 | * Free Software Foundation; either version 2 of the License, or (at your | ||
11 | * option) any later version. | ||
12 | */ | ||
13 | |||
14 | #include <linux/platform_device.h> | ||
15 | #include <linux/device.h> | ||
16 | #include <linux/module.h> | ||
17 | #include <linux/init.h> | ||
18 | #include <linux/of_gpio.h> | ||
19 | #include <linux/workqueue.h> | ||
20 | #include <linux/reboot.h> | ||
21 | #include <linux/interrupt.h> | ||
22 | |||
23 | #include <asm/machdep.h> | ||
24 | |||
25 | static struct device_node *halt_node; | ||
26 | |||
27 | static struct of_device_id child_match[] = { | ||
28 | { | ||
29 | .compatible = "sgy,gpio-halt", | ||
30 | }, | ||
31 | {}, | ||
32 | }; | ||
33 | |||
34 | static void gpio_halt_wfn(struct work_struct *work) | ||
35 | { | ||
36 | /* Likely wont return */ | ||
37 | orderly_poweroff(true); | ||
38 | } | ||
39 | static DECLARE_WORK(gpio_halt_wq, gpio_halt_wfn); | ||
40 | |||
41 | static void gpio_halt_cb(void) | ||
42 | { | ||
43 | enum of_gpio_flags flags; | ||
44 | int trigger, gpio; | ||
45 | |||
46 | if (!halt_node) | ||
47 | return; | ||
48 | |||
49 | gpio = of_get_gpio_flags(halt_node, 0, &flags); | ||
50 | |||
51 | if (!gpio_is_valid(gpio)) | ||
52 | return; | ||
53 | |||
54 | trigger = (flags == OF_GPIO_ACTIVE_LOW); | ||
55 | |||
56 | printk(KERN_INFO "gpio-halt: triggering GPIO.\n"); | ||
57 | |||
58 | /* Probably wont return */ | ||
59 | gpio_set_value(gpio, trigger); | ||
60 | } | ||
61 | |||
62 | /* This IRQ means someone pressed the power button and it is waiting for us | ||
63 | * to handle the shutdown/poweroff. */ | ||
64 | static irqreturn_t gpio_halt_irq(int irq, void *__data) | ||
65 | { | ||
66 | printk(KERN_INFO "gpio-halt: shutdown due to power button IRQ.\n"); | ||
67 | schedule_work(&gpio_halt_wq); | ||
68 | |||
69 | return IRQ_HANDLED; | ||
70 | }; | ||
71 | |||
72 | static int __devinit gpio_halt_probe(struct platform_device *pdev) | ||
73 | { | ||
74 | enum of_gpio_flags flags; | ||
75 | struct device_node *node = pdev->dev.of_node; | ||
76 | int gpio, err, irq; | ||
77 | int trigger; | ||
78 | |||
79 | if (!node) | ||
80 | return -ENODEV; | ||
81 | |||
82 | /* If there's no matching child, this isn't really an error */ | ||
83 | halt_node = of_find_matching_node(node, child_match); | ||
84 | if (!halt_node) | ||
85 | return 0; | ||
86 | |||
87 | /* Technically we could just read the first one, but punish | ||
88 | * DT writers for invalid form. */ | ||
89 | if (of_gpio_count(halt_node) != 1) | ||
90 | return -EINVAL; | ||
91 | |||
92 | /* Get the gpio number relative to the dynamic base. */ | ||
93 | gpio = of_get_gpio_flags(halt_node, 0, &flags); | ||
94 | if (!gpio_is_valid(gpio)) | ||
95 | return -EINVAL; | ||
96 | |||
97 | err = gpio_request(gpio, "gpio-halt"); | ||
98 | if (err) { | ||
99 | printk(KERN_ERR "gpio-halt: error requesting GPIO %d.\n", | ||
100 | gpio); | ||
101 | halt_node = NULL; | ||
102 | return err; | ||
103 | } | ||
104 | |||
105 | trigger = (flags == OF_GPIO_ACTIVE_LOW); | ||
106 | |||
107 | gpio_direction_output(gpio, !trigger); | ||
108 | |||
109 | /* Now get the IRQ which tells us when the power button is hit */ | ||
110 | irq = irq_of_parse_and_map(halt_node, 0); | ||
111 | err = request_irq(irq, gpio_halt_irq, IRQF_TRIGGER_RISING | | ||
112 | IRQF_TRIGGER_FALLING, "gpio-halt", halt_node); | ||
113 | if (err) { | ||
114 | printk(KERN_ERR "gpio-halt: error requesting IRQ %d for " | ||
115 | "GPIO %d.\n", irq, gpio); | ||
116 | gpio_free(gpio); | ||
117 | halt_node = NULL; | ||
118 | return err; | ||
119 | } | ||
120 | |||
121 | /* Register our halt function */ | ||
122 | ppc_md.halt = gpio_halt_cb; | ||
123 | ppc_md.power_off = gpio_halt_cb; | ||
124 | |||
125 | printk(KERN_INFO "gpio-halt: registered GPIO %d (%d trigger, %d" | ||
126 | " irq).\n", gpio, trigger, irq); | ||
127 | |||
128 | return 0; | ||
129 | } | ||
130 | |||
131 | static int __devexit gpio_halt_remove(struct platform_device *pdev) | ||
132 | { | ||
133 | if (halt_node) { | ||
134 | int gpio = of_get_gpio(halt_node, 0); | ||
135 | int irq = irq_of_parse_and_map(halt_node, 0); | ||
136 | |||
137 | free_irq(irq, halt_node); | ||
138 | |||
139 | ppc_md.halt = NULL; | ||
140 | ppc_md.power_off = NULL; | ||
141 | |||
142 | gpio_free(gpio); | ||
143 | |||
144 | halt_node = NULL; | ||
145 | } | ||
146 | |||
147 | return 0; | ||
148 | } | ||
149 | |||
150 | static struct of_device_id gpio_halt_match[] = { | ||
151 | /* We match on the gpio bus itself and scan the children since they | ||
152 | * wont be matched against us. We know the bus wont match until it | ||
153 | * has been registered too. */ | ||
154 | { | ||
155 | .compatible = "fsl,qoriq-gpio", | ||
156 | }, | ||
157 | {}, | ||
158 | }; | ||
159 | MODULE_DEVICE_TABLE(of, gpio_halt_match); | ||
160 | |||
161 | static struct platform_driver gpio_halt_driver = { | ||
162 | .driver = { | ||
163 | .name = "gpio-halt", | ||
164 | .owner = THIS_MODULE, | ||
165 | .of_match_table = gpio_halt_match, | ||
166 | }, | ||
167 | .probe = gpio_halt_probe, | ||
168 | .remove = __devexit_p(gpio_halt_remove), | ||
169 | }; | ||
170 | |||
171 | module_platform_driver(gpio_halt_driver); | ||
172 | |||
173 | MODULE_DESCRIPTION("Driver to support GPIO triggered system halt for Servergy CTS-1000 Systems."); | ||
174 | MODULE_VERSION("1.0"); | ||
175 | MODULE_AUTHOR("Ben Collins <ben.c@servergy.com>"); | ||
176 | MODULE_LICENSE("GPL"); | ||
diff --git a/arch/powerpc/platforms/Kconfig b/arch/powerpc/platforms/Kconfig index 48a920d51489..52de8bccfb30 100644 --- a/arch/powerpc/platforms/Kconfig +++ b/arch/powerpc/platforms/Kconfig | |||
@@ -352,8 +352,6 @@ config OF_RTC | |||
352 | Uses information from the OF or flattened device tree to instantiate | 352 | Uses information from the OF or flattened device tree to instantiate |
353 | platform devices for direct mapped RTC chips like the DS1742 or DS1743. | 353 | platform devices for direct mapped RTC chips like the DS1742 or DS1743. |
354 | 354 | ||
355 | source "arch/powerpc/sysdev/bestcomm/Kconfig" | ||
356 | |||
357 | config SIMPLE_GPIO | 355 | config SIMPLE_GPIO |
358 | bool "Support for simple, memory-mapped GPIO controllers" | 356 | bool "Support for simple, memory-mapped GPIO controllers" |
359 | depends on PPC | 357 | depends on PPC |
diff --git a/arch/powerpc/platforms/Kconfig.cputype b/arch/powerpc/platforms/Kconfig.cputype index 72afd2888cad..cea2f09c4241 100644 --- a/arch/powerpc/platforms/Kconfig.cputype +++ b/arch/powerpc/platforms/Kconfig.cputype | |||
@@ -76,6 +76,7 @@ config PPC_BOOK3E_64 | |||
76 | bool "Embedded processors" | 76 | bool "Embedded processors" |
77 | select PPC_FPU # Make it a choice ? | 77 | select PPC_FPU # Make it a choice ? |
78 | select PPC_SMP_MUXED_IPI | 78 | select PPC_SMP_MUXED_IPI |
79 | select PPC_DOORBELL | ||
79 | 80 | ||
80 | endchoice | 81 | endchoice |
81 | 82 | ||
@@ -208,6 +209,7 @@ config PPC_FSL_BOOK3E | |||
208 | select FSL_EMB_PERFMON | 209 | select FSL_EMB_PERFMON |
209 | select PPC_SMP_MUXED_IPI | 210 | select PPC_SMP_MUXED_IPI |
210 | select SYS_SUPPORTS_HUGETLBFS if PHYS_64BIT || PPC64 | 211 | select SYS_SUPPORTS_HUGETLBFS if PHYS_64BIT || PPC64 |
212 | select PPC_DOORBELL | ||
211 | default y if FSL_BOOKE | 213 | default y if FSL_BOOKE |
212 | 214 | ||
213 | config PTE_64BIT | 215 | config PTE_64BIT |
@@ -382,4 +384,8 @@ config NOT_COHERENT_CACHE | |||
382 | config CHECK_CACHE_COHERENCY | 384 | config CHECK_CACHE_COHERENCY |
383 | bool | 385 | bool |
384 | 386 | ||
387 | config PPC_DOORBELL | ||
388 | bool | ||
389 | default n | ||
390 | |||
385 | endmenu | 391 | endmenu |
diff --git a/arch/powerpc/platforms/cell/celleb_scc_sio.c b/arch/powerpc/platforms/cell/celleb_scc_sio.c index 3a16c5b3c464..9c339ec646f5 100644 --- a/arch/powerpc/platforms/cell/celleb_scc_sio.c +++ b/arch/powerpc/platforms/cell/celleb_scc_sio.c | |||
@@ -42,14 +42,13 @@ static struct { | |||
42 | static int __init txx9_serial_init(void) | 42 | static int __init txx9_serial_init(void) |
43 | { | 43 | { |
44 | extern int early_serial_txx9_setup(struct uart_port *port); | 44 | extern int early_serial_txx9_setup(struct uart_port *port); |
45 | struct device_node *node = NULL; | 45 | struct device_node *node; |
46 | int i; | 46 | int i; |
47 | struct uart_port req; | 47 | struct uart_port req; |
48 | struct of_irq irq; | 48 | struct of_irq irq; |
49 | struct resource res; | 49 | struct resource res; |
50 | 50 | ||
51 | while ((node = of_find_compatible_node(node, | 51 | for_each_compatible_node(node, "serial", "toshiba,sio-scc") { |
52 | "serial", "toshiba,sio-scc")) != NULL) { | ||
53 | for (i = 0; i < ARRAY_SIZE(txx9_scc_tab); i++) { | 52 | for (i = 0; i < ARRAY_SIZE(txx9_scc_tab); i++) { |
54 | if (!(txx9_serial_bitmap & (1<<i))) | 53 | if (!(txx9_serial_bitmap & (1<<i))) |
55 | continue; | 54 | continue; |
diff --git a/arch/powerpc/platforms/cell/spu_callbacks.c b/arch/powerpc/platforms/cell/spu_callbacks.c index 75d613313f10..b0ec78e8ad68 100644 --- a/arch/powerpc/platforms/cell/spu_callbacks.c +++ b/arch/powerpc/platforms/cell/spu_callbacks.c | |||
@@ -60,13 +60,12 @@ long spu_sys_callback(struct spu_syscall_block *s) | |||
60 | 60 | ||
61 | syscall = spu_syscall_table[s->nr_ret]; | 61 | syscall = spu_syscall_table[s->nr_ret]; |
62 | 62 | ||
63 | #ifdef DEBUG | 63 | pr_debug("SPU-syscall " |
64 | print_symbol(KERN_DEBUG "SPU-syscall %s:", (unsigned long)syscall); | 64 | "%pSR:syscall%lld(%llx, %llx, %llx, %llx, %llx, %llx)\n", |
65 | printk("syscall%ld(%lx, %lx, %lx, %lx, %lx, %lx)\n", | 65 | syscall, |
66 | s->nr_ret, | 66 | s->nr_ret, |
67 | s->parm[0], s->parm[1], s->parm[2], | 67 | s->parm[0], s->parm[1], s->parm[2], |
68 | s->parm[3], s->parm[4], s->parm[5]); | 68 | s->parm[3], s->parm[4], s->parm[5]); |
69 | #endif | ||
70 | 69 | ||
71 | return syscall(s->parm[0], s->parm[1], s->parm[2], | 70 | return syscall(s->parm[0], s->parm[1], s->parm[2], |
72 | s->parm[3], s->parm[4], s->parm[5]); | 71 | s->parm[3], s->parm[4], s->parm[5]); |
diff --git a/arch/powerpc/platforms/ps3/htab.c b/arch/powerpc/platforms/ps3/htab.c index d00d7b0a3bda..6cc58201db8c 100644 --- a/arch/powerpc/platforms/ps3/htab.c +++ b/arch/powerpc/platforms/ps3/htab.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <asm/lv1call.h> | 27 | #include <asm/lv1call.h> |
28 | #include <asm/ps3fb.h> | 28 | #include <asm/ps3fb.h> |
29 | 29 | ||
30 | #define PS3_VERBOSE_RESULT | ||
30 | #include "platform.h" | 31 | #include "platform.h" |
31 | 32 | ||
32 | /** | 33 | /** |
@@ -75,8 +76,9 @@ static long ps3_hpte_insert(unsigned long hpte_group, unsigned long vpn, | |||
75 | 76 | ||
76 | if (result) { | 77 | if (result) { |
77 | /* all entries bolted !*/ | 78 | /* all entries bolted !*/ |
78 | pr_info("%s:result=%d vpn=%lx pa=%lx ix=%lx v=%llx r=%llx\n", | 79 | pr_info("%s:result=%s vpn=%lx pa=%lx ix=%lx v=%llx r=%llx\n", |
79 | __func__, result, vpn, pa, hpte_group, hpte_v, hpte_r); | 80 | __func__, ps3_result(result), vpn, pa, hpte_group, |
81 | hpte_v, hpte_r); | ||
80 | BUG(); | 82 | BUG(); |
81 | } | 83 | } |
82 | 84 | ||
@@ -125,8 +127,8 @@ static long ps3_hpte_updatepp(unsigned long slot, unsigned long newpp, | |||
125 | &hpte_rs); | 127 | &hpte_rs); |
126 | 128 | ||
127 | if (result) { | 129 | if (result) { |
128 | pr_info("%s: res=%d read vpn=%lx slot=%lx psize=%d\n", | 130 | pr_info("%s: result=%s read vpn=%lx slot=%lx psize=%d\n", |
129 | __func__, result, vpn, slot, psize); | 131 | __func__, ps3_result(result), vpn, slot, psize); |
130 | BUG(); | 132 | BUG(); |
131 | } | 133 | } |
132 | 134 | ||
@@ -170,8 +172,8 @@ static void ps3_hpte_invalidate(unsigned long slot, unsigned long vpn, | |||
170 | result = lv1_write_htab_entry(PS3_LPAR_VAS_ID_CURRENT, slot, 0, 0); | 172 | result = lv1_write_htab_entry(PS3_LPAR_VAS_ID_CURRENT, slot, 0, 0); |
171 | 173 | ||
172 | if (result) { | 174 | if (result) { |
173 | pr_info("%s: res=%d vpn=%lx slot=%lx psize=%d\n", | 175 | pr_info("%s: result=%s vpn=%lx slot=%lx psize=%d\n", |
174 | __func__, result, vpn, slot, psize); | 176 | __func__, ps3_result(result), vpn, slot, psize); |
175 | BUG(); | 177 | BUG(); |
176 | } | 178 | } |
177 | 179 | ||
diff --git a/arch/powerpc/platforms/pseries/Kconfig b/arch/powerpc/platforms/pseries/Kconfig index 837cf49357ed..9a0941bc4d31 100644 --- a/arch/powerpc/platforms/pseries/Kconfig +++ b/arch/powerpc/platforms/pseries/Kconfig | |||
@@ -17,6 +17,7 @@ config PPC_PSERIES | |||
17 | select PPC_NATIVE | 17 | select PPC_NATIVE |
18 | select PPC_PCI_CHOICE if EXPERT | 18 | select PPC_PCI_CHOICE if EXPERT |
19 | select ZLIB_DEFLATE | 19 | select ZLIB_DEFLATE |
20 | select PPC_DOORBELL | ||
20 | default y | 21 | default y |
21 | 22 | ||
22 | config PPC_SPLPAR | 23 | config PPC_SPLPAR |
diff --git a/arch/powerpc/platforms/pseries/Makefile b/arch/powerpc/platforms/pseries/Makefile index 890622b87c8f..53866e537a92 100644 --- a/arch/powerpc/platforms/pseries/Makefile +++ b/arch/powerpc/platforms/pseries/Makefile | |||
@@ -1,4 +1,4 @@ | |||
1 | ccflags-$(CONFIG_PPC64) := -mno-minimal-toc | 1 | ccflags-$(CONFIG_PPC64) := $(NO_MINIMAL_TOC) |
2 | ccflags-$(CONFIG_PPC_PSERIES_DEBUG) += -DDEBUG | 2 | ccflags-$(CONFIG_PPC_PSERIES_DEBUG) += -DDEBUG |
3 | 3 | ||
4 | obj-y := lpar.o hvCall.o nvram.o reconfig.o \ | 4 | obj-y := lpar.o hvCall.o nvram.o reconfig.o \ |
diff --git a/arch/powerpc/platforms/pseries/eeh.c b/arch/powerpc/platforms/pseries/eeh.c index 9a04322b1736..6b73d6c44f51 100644 --- a/arch/powerpc/platforms/pseries/eeh.c +++ b/arch/powerpc/platforms/pseries/eeh.c | |||
@@ -788,7 +788,6 @@ static void eeh_add_device_late(struct pci_dev *dev) | |||
788 | dev->dev.archdata.edev = edev; | 788 | dev->dev.archdata.edev = edev; |
789 | 789 | ||
790 | eeh_addr_cache_insert_dev(dev); | 790 | eeh_addr_cache_insert_dev(dev); |
791 | eeh_sysfs_add_device(dev); | ||
792 | } | 791 | } |
793 | 792 | ||
794 | /** | 793 | /** |
@@ -815,6 +814,29 @@ void eeh_add_device_tree_late(struct pci_bus *bus) | |||
815 | EXPORT_SYMBOL_GPL(eeh_add_device_tree_late); | 814 | EXPORT_SYMBOL_GPL(eeh_add_device_tree_late); |
816 | 815 | ||
817 | /** | 816 | /** |
817 | * eeh_add_sysfs_files - Add EEH sysfs files for the indicated PCI bus | ||
818 | * @bus: PCI bus | ||
819 | * | ||
820 | * This routine must be used to add EEH sysfs files for PCI | ||
821 | * devices which are attached to the indicated PCI bus. The PCI bus | ||
822 | * is added after system boot through hotplug or dlpar. | ||
823 | */ | ||
824 | void eeh_add_sysfs_files(struct pci_bus *bus) | ||
825 | { | ||
826 | struct pci_dev *dev; | ||
827 | |||
828 | list_for_each_entry(dev, &bus->devices, bus_list) { | ||
829 | eeh_sysfs_add_device(dev); | ||
830 | if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE) { | ||
831 | struct pci_bus *subbus = dev->subordinate; | ||
832 | if (subbus) | ||
833 | eeh_add_sysfs_files(subbus); | ||
834 | } | ||
835 | } | ||
836 | } | ||
837 | EXPORT_SYMBOL_GPL(eeh_add_sysfs_files); | ||
838 | |||
839 | /** | ||
818 | * eeh_remove_device - Undo EEH setup for the indicated pci device | 840 | * eeh_remove_device - Undo EEH setup for the indicated pci device |
819 | * @dev: pci device to be removed | 841 | * @dev: pci device to be removed |
820 | * @purge_pe: remove the PE or not | 842 | * @purge_pe: remove the PE or not |
diff --git a/arch/powerpc/platforms/pseries/firmware.c b/arch/powerpc/platforms/pseries/firmware.c index 7b56118f531c..aa3693f7fb27 100644 --- a/arch/powerpc/platforms/pseries/firmware.c +++ b/arch/powerpc/platforms/pseries/firmware.c | |||
@@ -33,6 +33,11 @@ typedef struct { | |||
33 | char * name; | 33 | char * name; |
34 | } firmware_feature_t; | 34 | } firmware_feature_t; |
35 | 35 | ||
36 | /* | ||
37 | * The names in this table match names in rtas/ibm,hypertas-functions. If the | ||
38 | * entry ends in a '*', only upto the '*' is matched. Otherwise the entire | ||
39 | * string must match. | ||
40 | */ | ||
36 | static __initdata firmware_feature_t | 41 | static __initdata firmware_feature_t |
37 | firmware_features_table[FIRMWARE_MAX_FEATURES] = { | 42 | firmware_features_table[FIRMWARE_MAX_FEATURES] = { |
38 | {FW_FEATURE_PFT, "hcall-pft"}, | 43 | {FW_FEATURE_PFT, "hcall-pft"}, |
@@ -57,6 +62,7 @@ firmware_features_table[FIRMWARE_MAX_FEATURES] = { | |||
57 | {FW_FEATURE_SPLPAR, "hcall-splpar"}, | 62 | {FW_FEATURE_SPLPAR, "hcall-splpar"}, |
58 | {FW_FEATURE_VPHN, "hcall-vphn"}, | 63 | {FW_FEATURE_VPHN, "hcall-vphn"}, |
59 | {FW_FEATURE_SET_MODE, "hcall-set-mode"}, | 64 | {FW_FEATURE_SET_MODE, "hcall-set-mode"}, |
65 | {FW_FEATURE_BEST_ENERGY, "hcall-best-energy-1*"}, | ||
60 | }; | 66 | }; |
61 | 67 | ||
62 | /* Build up the firmware features bitmask using the contents of | 68 | /* Build up the firmware features bitmask using the contents of |
@@ -72,9 +78,20 @@ void __init fw_feature_init(const char *hypertas, unsigned long len) | |||
72 | 78 | ||
73 | for (s = hypertas; s < hypertas + len; s += strlen(s) + 1) { | 79 | for (s = hypertas; s < hypertas + len; s += strlen(s) + 1) { |
74 | for (i = 0; i < FIRMWARE_MAX_FEATURES; i++) { | 80 | for (i = 0; i < FIRMWARE_MAX_FEATURES; i++) { |
81 | const char *name = firmware_features_table[i].name; | ||
82 | size_t size; | ||
75 | /* check value against table of strings */ | 83 | /* check value against table of strings */ |
76 | if (!firmware_features_table[i].name || | 84 | if (!name) |
77 | strcmp(firmware_features_table[i].name, s)) | 85 | continue; |
86 | /* | ||
87 | * If there is a '*' at the end of name, only check | ||
88 | * upto there | ||
89 | */ | ||
90 | size = strlen(name); | ||
91 | if (size && name[size - 1] == '*') { | ||
92 | if (strncmp(name, s, size - 1)) | ||
93 | continue; | ||
94 | } else if (strcmp(name, s)) | ||
78 | continue; | 95 | continue; |
79 | 96 | ||
80 | /* we have a match */ | 97 | /* we have a match */ |
diff --git a/arch/powerpc/platforms/pseries/hotplug-cpu.c b/arch/powerpc/platforms/pseries/hotplug-cpu.c index a38956269fbf..217ca5c75b20 100644 --- a/arch/powerpc/platforms/pseries/hotplug-cpu.c +++ b/arch/powerpc/platforms/pseries/hotplug-cpu.c | |||
@@ -127,9 +127,16 @@ static void pseries_mach_cpu_die(void) | |||
127 | get_lppaca()->donate_dedicated_cpu = 1; | 127 | get_lppaca()->donate_dedicated_cpu = 1; |
128 | 128 | ||
129 | while (get_preferred_offline_state(cpu) == CPU_STATE_INACTIVE) { | 129 | while (get_preferred_offline_state(cpu) == CPU_STATE_INACTIVE) { |
130 | while (!prep_irq_for_idle()) { | ||
131 | local_irq_enable(); | ||
132 | local_irq_disable(); | ||
133 | } | ||
134 | |||
130 | extended_cede_processor(cede_latency_hint); | 135 | extended_cede_processor(cede_latency_hint); |
131 | } | 136 | } |
132 | 137 | ||
138 | local_irq_disable(); | ||
139 | |||
133 | if (!get_lppaca()->shared_proc) | 140 | if (!get_lppaca()->shared_proc) |
134 | get_lppaca()->donate_dedicated_cpu = 0; | 141 | get_lppaca()->donate_dedicated_cpu = 0; |
135 | get_lppaca()->idle = 0; | 142 | get_lppaca()->idle = 0; |
@@ -137,6 +144,7 @@ static void pseries_mach_cpu_die(void) | |||
137 | if (get_preferred_offline_state(cpu) == CPU_STATE_ONLINE) { | 144 | if (get_preferred_offline_state(cpu) == CPU_STATE_ONLINE) { |
138 | unregister_slb_shadow(hwcpu); | 145 | unregister_slb_shadow(hwcpu); |
139 | 146 | ||
147 | hard_irq_disable(); | ||
140 | /* | 148 | /* |
141 | * Call to start_secondary_resume() will not return. | 149 | * Call to start_secondary_resume() will not return. |
142 | * Kernel stack will be reset and start_secondary() | 150 | * Kernel stack will be reset and start_secondary() |
diff --git a/arch/powerpc/platforms/pseries/iommu.c b/arch/powerpc/platforms/pseries/iommu.c index e2685badb5db..1b2a174e7c59 100644 --- a/arch/powerpc/platforms/pseries/iommu.c +++ b/arch/powerpc/platforms/pseries/iommu.c | |||
@@ -382,6 +382,7 @@ static int tce_clearrange_multi_pSeriesLP(unsigned long start_pfn, | |||
382 | rc = plpar_tce_stuff((u64)be32_to_cpu(maprange->liobn), | 382 | rc = plpar_tce_stuff((u64)be32_to_cpu(maprange->liobn), |
383 | dma_offset, | 383 | dma_offset, |
384 | 0, limit); | 384 | 0, limit); |
385 | next += limit * tce_size; | ||
385 | num_tce -= limit; | 386 | num_tce -= limit; |
386 | } while (num_tce > 0 && !rc); | 387 | } while (num_tce > 0 && !rc); |
387 | 388 | ||
@@ -786,33 +787,68 @@ static u64 find_existing_ddw(struct device_node *pdn) | |||
786 | return dma_addr; | 787 | return dma_addr; |
787 | } | 788 | } |
788 | 789 | ||
790 | static void __restore_default_window(struct eeh_dev *edev, | ||
791 | u32 ddw_restore_token) | ||
792 | { | ||
793 | u32 cfg_addr; | ||
794 | u64 buid; | ||
795 | int ret; | ||
796 | |||
797 | /* | ||
798 | * Get the config address and phb buid of the PE window. | ||
799 | * Rely on eeh to retrieve this for us. | ||
800 | * Retrieve them from the pci device, not the node with the | ||
801 | * dma-window property | ||
802 | */ | ||
803 | cfg_addr = edev->config_addr; | ||
804 | if (edev->pe_config_addr) | ||
805 | cfg_addr = edev->pe_config_addr; | ||
806 | buid = edev->phb->buid; | ||
807 | |||
808 | do { | ||
809 | ret = rtas_call(ddw_restore_token, 3, 1, NULL, cfg_addr, | ||
810 | BUID_HI(buid), BUID_LO(buid)); | ||
811 | } while (rtas_busy_delay(ret)); | ||
812 | pr_info("ibm,reset-pe-dma-windows(%x) %x %x %x returned %d\n", | ||
813 | ddw_restore_token, cfg_addr, BUID_HI(buid), BUID_LO(buid), ret); | ||
814 | } | ||
815 | |||
789 | static int find_existing_ddw_windows(void) | 816 | static int find_existing_ddw_windows(void) |
790 | { | 817 | { |
791 | int len; | ||
792 | struct device_node *pdn; | 818 | struct device_node *pdn; |
793 | struct direct_window *window; | ||
794 | const struct dynamic_dma_window_prop *direct64; | 819 | const struct dynamic_dma_window_prop *direct64; |
820 | const u32 *ddw_extensions; | ||
795 | 821 | ||
796 | if (!firmware_has_feature(FW_FEATURE_LPAR)) | 822 | if (!firmware_has_feature(FW_FEATURE_LPAR)) |
797 | return 0; | 823 | return 0; |
798 | 824 | ||
799 | for_each_node_with_property(pdn, DIRECT64_PROPNAME) { | 825 | for_each_node_with_property(pdn, DIRECT64_PROPNAME) { |
800 | direct64 = of_get_property(pdn, DIRECT64_PROPNAME, &len); | 826 | direct64 = of_get_property(pdn, DIRECT64_PROPNAME, NULL); |
801 | if (!direct64) | 827 | if (!direct64) |
802 | continue; | 828 | continue; |
803 | 829 | ||
804 | window = kzalloc(sizeof(*window), GFP_KERNEL); | 830 | /* |
805 | if (!window || len < sizeof(struct dynamic_dma_window_prop)) { | 831 | * We need to ensure the IOMMU table is active when we |
806 | kfree(window); | 832 | * return from the IOMMU setup so that the common code |
807 | remove_ddw(pdn); | 833 | * can clear the table or find the holes. To that end, |
808 | continue; | 834 | * first, remove any existing DDW configuration. |
809 | } | 835 | */ |
836 | remove_ddw(pdn); | ||
810 | 837 | ||
811 | window->device = pdn; | 838 | /* |
812 | window->prop = direct64; | 839 | * Second, if we are running on a new enough level of |
813 | spin_lock(&direct_window_list_lock); | 840 | * firmware where the restore API is present, use it to |
814 | list_add(&window->list, &direct_window_list); | 841 | * restore the 32-bit window, which was removed in |
815 | spin_unlock(&direct_window_list_lock); | 842 | * create_ddw. |
843 | * If the API is not present, then create_ddw couldn't | ||
844 | * have removed the 32-bit window in the first place, so | ||
845 | * removing the DDW configuration should be sufficient. | ||
846 | */ | ||
847 | ddw_extensions = of_get_property(pdn, "ibm,ddw-extensions", | ||
848 | NULL); | ||
849 | if (ddw_extensions && ddw_extensions[0] > 0) | ||
850 | __restore_default_window(of_node_to_eeh_dev(pdn), | ||
851 | ddw_extensions[1]); | ||
816 | } | 852 | } |
817 | 853 | ||
818 | return 0; | 854 | return 0; |
@@ -883,32 +919,9 @@ static int create_ddw(struct pci_dev *dev, const u32 *ddw_avail, | |||
883 | } | 919 | } |
884 | 920 | ||
885 | static void restore_default_window(struct pci_dev *dev, | 921 | static void restore_default_window(struct pci_dev *dev, |
886 | u32 ddw_restore_token, unsigned long liobn) | 922 | u32 ddw_restore_token) |
887 | { | 923 | { |
888 | struct eeh_dev *edev; | 924 | __restore_default_window(pci_dev_to_eeh_dev(dev), ddw_restore_token); |
889 | u32 cfg_addr; | ||
890 | u64 buid; | ||
891 | int ret; | ||
892 | |||
893 | /* | ||
894 | * Get the config address and phb buid of the PE window. | ||
895 | * Rely on eeh to retrieve this for us. | ||
896 | * Retrieve them from the pci device, not the node with the | ||
897 | * dma-window property | ||
898 | */ | ||
899 | edev = pci_dev_to_eeh_dev(dev); | ||
900 | cfg_addr = edev->config_addr; | ||
901 | if (edev->pe_config_addr) | ||
902 | cfg_addr = edev->pe_config_addr; | ||
903 | buid = edev->phb->buid; | ||
904 | |||
905 | do { | ||
906 | ret = rtas_call(ddw_restore_token, 3, 1, NULL, cfg_addr, | ||
907 | BUID_HI(buid), BUID_LO(buid)); | ||
908 | } while (rtas_busy_delay(ret)); | ||
909 | dev_info(&dev->dev, | ||
910 | "ibm,reset-pe-dma-windows(%x) %x %x %x returned %d\n", | ||
911 | ddw_restore_token, cfg_addr, BUID_HI(buid), BUID_LO(buid), ret); | ||
912 | } | 925 | } |
913 | 926 | ||
914 | /* | 927 | /* |
@@ -1099,7 +1112,7 @@ out_free_prop: | |||
1099 | 1112 | ||
1100 | out_restore_window: | 1113 | out_restore_window: |
1101 | if (ddw_restore_token) | 1114 | if (ddw_restore_token) |
1102 | restore_default_window(dev, ddw_restore_token, liobn); | 1115 | restore_default_window(dev, ddw_restore_token); |
1103 | 1116 | ||
1104 | out_unlock: | 1117 | out_unlock: |
1105 | mutex_unlock(&direct_window_init_mutex); | 1118 | mutex_unlock(&direct_window_init_mutex); |
@@ -1295,6 +1308,7 @@ static int iommu_reconfig_notifier(struct notifier_block *nb, unsigned long acti | |||
1295 | 1308 | ||
1296 | switch (action) { | 1309 | switch (action) { |
1297 | case OF_RECONFIG_DETACH_NODE: | 1310 | case OF_RECONFIG_DETACH_NODE: |
1311 | remove_ddw(np); | ||
1298 | if (pci && pci->iommu_table) | 1312 | if (pci && pci->iommu_table) |
1299 | iommu_free_table(pci->iommu_table, np->full_name); | 1313 | iommu_free_table(pci->iommu_table, np->full_name); |
1300 | 1314 | ||
@@ -1307,16 +1321,6 @@ static int iommu_reconfig_notifier(struct notifier_block *nb, unsigned long acti | |||
1307 | } | 1321 | } |
1308 | } | 1322 | } |
1309 | spin_unlock(&direct_window_list_lock); | 1323 | spin_unlock(&direct_window_list_lock); |
1310 | |||
1311 | /* | ||
1312 | * Because the notifier runs after isolation of the | ||
1313 | * slot, we are guaranteed any DMA window has already | ||
1314 | * been revoked and the TCEs have been marked invalid, | ||
1315 | * so we don't need a call to remove_ddw(np). However, | ||
1316 | * if an additional notifier action is added before the | ||
1317 | * isolate call, we should update this code for | ||
1318 | * completeness with such a call. | ||
1319 | */ | ||
1320 | break; | 1324 | break; |
1321 | default: | 1325 | default: |
1322 | err = NOTIFY_DONE; | 1326 | err = NOTIFY_DONE; |
diff --git a/arch/powerpc/platforms/pseries/pci.c b/arch/powerpc/platforms/pseries/pci.c index 56b864d777ee..0b580f413a9a 100644 --- a/arch/powerpc/platforms/pseries/pci.c +++ b/arch/powerpc/platforms/pseries/pci.c | |||
@@ -40,7 +40,8 @@ void pcibios_name_device(struct pci_dev *dev) | |||
40 | */ | 40 | */ |
41 | dn = pci_device_to_OF_node(dev); | 41 | dn = pci_device_to_OF_node(dev); |
42 | if (dn) { | 42 | if (dn) { |
43 | const char *loc_code = of_get_property(dn, "ibm,loc-code", 0); | 43 | const char *loc_code = of_get_property(dn, "ibm,loc-code", |
44 | NULL); | ||
44 | if (loc_code) { | 45 | if (loc_code) { |
45 | int loc_len = strlen(loc_code); | 46 | int loc_len = strlen(loc_code); |
46 | if (loc_len < sizeof(dev->dev.name)) { | 47 | if (loc_len < sizeof(dev->dev.name)) { |
diff --git a/arch/powerpc/platforms/pseries/plpar_wrappers.h b/arch/powerpc/platforms/pseries/plpar_wrappers.h index e6cc34a67053..f368668d97b3 100644 --- a/arch/powerpc/platforms/pseries/plpar_wrappers.h +++ b/arch/powerpc/platforms/pseries/plpar_wrappers.h | |||
@@ -2,6 +2,7 @@ | |||
2 | #define _PSERIES_PLPAR_WRAPPERS_H | 2 | #define _PSERIES_PLPAR_WRAPPERS_H |
3 | 3 | ||
4 | #include <linux/string.h> | 4 | #include <linux/string.h> |
5 | #include <linux/irqflags.h> | ||
5 | 6 | ||
6 | #include <asm/hvcall.h> | 7 | #include <asm/hvcall.h> |
7 | #include <asm/paca.h> | 8 | #include <asm/paca.h> |
@@ -41,7 +42,14 @@ static inline long extended_cede_processor(unsigned long latency_hint) | |||
41 | u8 old_latency_hint = get_cede_latency_hint(); | 42 | u8 old_latency_hint = get_cede_latency_hint(); |
42 | 43 | ||
43 | set_cede_latency_hint(latency_hint); | 44 | set_cede_latency_hint(latency_hint); |
45 | |||
44 | rc = cede_processor(); | 46 | rc = cede_processor(); |
47 | #ifdef CONFIG_TRACE_IRQFLAGS | ||
48 | /* Ensure that H_CEDE returns with IRQs on */ | ||
49 | if (WARN_ON(!(mfmsr() & MSR_EE))) | ||
50 | __hard_irq_enable(); | ||
51 | #endif | ||
52 | |||
45 | set_cede_latency_hint(old_latency_hint); | 53 | set_cede_latency_hint(old_latency_hint); |
46 | 54 | ||
47 | return rc; | 55 | return rc; |
@@ -304,4 +312,14 @@ static inline long disable_reloc_on_exceptions(void) { | |||
304 | return plpar_set_mode(0, 3, 0, 0); | 312 | return plpar_set_mode(0, 3, 0, 0); |
305 | } | 313 | } |
306 | 314 | ||
315 | static inline long plapr_set_ciabr(unsigned long ciabr) | ||
316 | { | ||
317 | return plpar_set_mode(0, 1, ciabr, 0); | ||
318 | } | ||
319 | |||
320 | static inline long plapr_set_watchpoint0(unsigned long dawr0, unsigned long dawrx0) | ||
321 | { | ||
322 | return plpar_set_mode(0, 2, dawr0, dawrx0); | ||
323 | } | ||
324 | |||
307 | #endif /* _PSERIES_PLPAR_WRAPPERS_H */ | 325 | #endif /* _PSERIES_PLPAR_WRAPPERS_H */ |
diff --git a/arch/powerpc/platforms/pseries/pseries_energy.c b/arch/powerpc/platforms/pseries/pseries_energy.c index af281dce510a..a91e6dadda2c 100644 --- a/arch/powerpc/platforms/pseries/pseries_energy.c +++ b/arch/powerpc/platforms/pseries/pseries_energy.c | |||
@@ -21,6 +21,7 @@ | |||
21 | #include <asm/cputhreads.h> | 21 | #include <asm/cputhreads.h> |
22 | #include <asm/page.h> | 22 | #include <asm/page.h> |
23 | #include <asm/hvcall.h> | 23 | #include <asm/hvcall.h> |
24 | #include <asm/firmware.h> | ||
24 | 25 | ||
25 | 26 | ||
26 | #define MODULE_VERS "1.0" | 27 | #define MODULE_VERS "1.0" |
@@ -32,40 +33,6 @@ static int sysfs_entries; | |||
32 | 33 | ||
33 | /* Helper routines */ | 34 | /* Helper routines */ |
34 | 35 | ||
35 | /* | ||
36 | * Routine to detect firmware support for hcall | ||
37 | * return 1 if H_BEST_ENERGY is supported | ||
38 | * else return 0 | ||
39 | */ | ||
40 | |||
41 | static int check_for_h_best_energy(void) | ||
42 | { | ||
43 | struct device_node *rtas = NULL; | ||
44 | const char *hypertas, *s; | ||
45 | int length; | ||
46 | int rc = 0; | ||
47 | |||
48 | rtas = of_find_node_by_path("/rtas"); | ||
49 | if (!rtas) | ||
50 | return 0; | ||
51 | |||
52 | hypertas = of_get_property(rtas, "ibm,hypertas-functions", &length); | ||
53 | if (!hypertas) { | ||
54 | of_node_put(rtas); | ||
55 | return 0; | ||
56 | } | ||
57 | |||
58 | /* hypertas will have list of strings with hcall names */ | ||
59 | for (s = hypertas; s < hypertas + length; s += strlen(s) + 1) { | ||
60 | if (!strncmp("hcall-best-energy-1", s, 19)) { | ||
61 | rc = 1; /* Found the string */ | ||
62 | break; | ||
63 | } | ||
64 | } | ||
65 | of_node_put(rtas); | ||
66 | return rc; | ||
67 | } | ||
68 | |||
69 | /* Helper Routines to convert between drc_index to cpu numbers */ | 36 | /* Helper Routines to convert between drc_index to cpu numbers */ |
70 | 37 | ||
71 | static u32 cpu_to_drc_index(int cpu) | 38 | static u32 cpu_to_drc_index(int cpu) |
@@ -262,7 +229,7 @@ static int __init pseries_energy_init(void) | |||
262 | int cpu, err; | 229 | int cpu, err; |
263 | struct device *cpu_dev; | 230 | struct device *cpu_dev; |
264 | 231 | ||
265 | if (!check_for_h_best_energy()) { | 232 | if (!firmware_has_feature(FW_FEATURE_BEST_ENERGY)) { |
266 | printk(KERN_INFO "Hypercall H_BEST_ENERGY not supported\n"); | 233 | printk(KERN_INFO "Hypercall H_BEST_ENERGY not supported\n"); |
267 | return 0; | 234 | return 0; |
268 | } | 235 | } |
diff --git a/arch/powerpc/platforms/pseries/setup.c b/arch/powerpc/platforms/pseries/setup.c index 527e12c9573b..8bcc9ca6682f 100644 --- a/arch/powerpc/platforms/pseries/setup.c +++ b/arch/powerpc/platforms/pseries/setup.c | |||
@@ -65,6 +65,7 @@ | |||
65 | #include <asm/smp.h> | 65 | #include <asm/smp.h> |
66 | #include <asm/firmware.h> | 66 | #include <asm/firmware.h> |
67 | #include <asm/eeh.h> | 67 | #include <asm/eeh.h> |
68 | #include <asm/reg.h> | ||
68 | 69 | ||
69 | #include "plpar_wrappers.h" | 70 | #include "plpar_wrappers.h" |
70 | #include "pseries.h" | 71 | #include "pseries.h" |
@@ -375,7 +376,7 @@ static void pSeries_idle(void) | |||
375 | * to ever be a problem in practice we can move this into a kernel thread to | 376 | * to ever be a problem in practice we can move this into a kernel thread to |
376 | * finish off the process later in boot. | 377 | * finish off the process later in boot. |
377 | */ | 378 | */ |
378 | static int __init pSeries_enable_reloc_on_exc(void) | 379 | long pSeries_enable_reloc_on_exc(void) |
379 | { | 380 | { |
380 | long rc; | 381 | long rc; |
381 | unsigned int delay, total_delay = 0; | 382 | unsigned int delay, total_delay = 0; |
@@ -397,9 +398,9 @@ static int __init pSeries_enable_reloc_on_exc(void) | |||
397 | mdelay(delay); | 398 | mdelay(delay); |
398 | } | 399 | } |
399 | } | 400 | } |
401 | EXPORT_SYMBOL(pSeries_enable_reloc_on_exc); | ||
400 | 402 | ||
401 | #ifdef CONFIG_KEXEC | 403 | long pSeries_disable_reloc_on_exc(void) |
402 | static long pSeries_disable_reloc_on_exc(void) | ||
403 | { | 404 | { |
404 | long rc; | 405 | long rc; |
405 | 406 | ||
@@ -410,7 +411,9 @@ static long pSeries_disable_reloc_on_exc(void) | |||
410 | mdelay(get_longbusy_msecs(rc)); | 411 | mdelay(get_longbusy_msecs(rc)); |
411 | } | 412 | } |
412 | } | 413 | } |
414 | EXPORT_SYMBOL(pSeries_disable_reloc_on_exc); | ||
413 | 415 | ||
416 | #ifdef CONFIG_KEXEC | ||
414 | static void pSeries_machine_kexec(struct kimage *image) | 417 | static void pSeries_machine_kexec(struct kimage *image) |
415 | { | 418 | { |
416 | long rc; | 419 | long rc; |
@@ -498,6 +501,14 @@ static int pseries_set_xdabr(unsigned long dabr, unsigned long dabrx) | |||
498 | return plpar_hcall_norets(H_SET_XDABR, dabr, dabrx); | 501 | return plpar_hcall_norets(H_SET_XDABR, dabr, dabrx); |
499 | } | 502 | } |
500 | 503 | ||
504 | static int pseries_set_dawr(unsigned long dawr, unsigned long dawrx) | ||
505 | { | ||
506 | /* PAPR says we can't set HYP */ | ||
507 | dawrx &= ~DAWRX_HYP; | ||
508 | |||
509 | return plapr_set_watchpoint0(dawr, dawrx); | ||
510 | } | ||
511 | |||
501 | #define CMO_CHARACTERISTICS_TOKEN 44 | 512 | #define CMO_CHARACTERISTICS_TOKEN 44 |
502 | #define CMO_MAXLENGTH 1026 | 513 | #define CMO_MAXLENGTH 1026 |
503 | 514 | ||
@@ -604,6 +615,9 @@ static void __init pSeries_init_early(void) | |||
604 | else if (firmware_has_feature(FW_FEATURE_DABR)) | 615 | else if (firmware_has_feature(FW_FEATURE_DABR)) |
605 | ppc_md.set_dabr = pseries_set_dabr; | 616 | ppc_md.set_dabr = pseries_set_dabr; |
606 | 617 | ||
618 | if (firmware_has_feature(FW_FEATURE_SET_MODE)) | ||
619 | ppc_md.set_dawr = pseries_set_dawr; | ||
620 | |||
607 | pSeries_cmo_feature_init(); | 621 | pSeries_cmo_feature_init(); |
608 | iommu_init_early_pSeries(); | 622 | iommu_init_early_pSeries(); |
609 | 623 | ||
diff --git a/arch/powerpc/platforms/pseries/smp.c b/arch/powerpc/platforms/pseries/smp.c index 80cd0be71e06..12bc8c3663ad 100644 --- a/arch/powerpc/platforms/pseries/smp.c +++ b/arch/powerpc/platforms/pseries/smp.c | |||
@@ -42,6 +42,7 @@ | |||
42 | #include <asm/vdso_datapage.h> | 42 | #include <asm/vdso_datapage.h> |
43 | #include <asm/cputhreads.h> | 43 | #include <asm/cputhreads.h> |
44 | #include <asm/xics.h> | 44 | #include <asm/xics.h> |
45 | #include <asm/dbell.h> | ||
45 | 46 | ||
46 | #include "plpar_wrappers.h" | 47 | #include "plpar_wrappers.h" |
47 | #include "pseries.h" | 48 | #include "pseries.h" |
@@ -54,6 +55,11 @@ | |||
54 | */ | 55 | */ |
55 | static cpumask_var_t of_spin_mask; | 56 | static cpumask_var_t of_spin_mask; |
56 | 57 | ||
58 | /* | ||
59 | * If we multiplex IPI mechanisms, store the appropriate XICS IPI mechanism here | ||
60 | */ | ||
61 | static void (*xics_cause_ipi)(int cpu, unsigned long data); | ||
62 | |||
57 | /* Query where a cpu is now. Return codes #defined in plpar_wrappers.h */ | 63 | /* Query where a cpu is now. Return codes #defined in plpar_wrappers.h */ |
58 | int smp_query_cpu_stopped(unsigned int pcpu) | 64 | int smp_query_cpu_stopped(unsigned int pcpu) |
59 | { | 65 | { |
@@ -137,6 +143,8 @@ static void smp_xics_setup_cpu(int cpu) | |||
137 | { | 143 | { |
138 | if (cpu != boot_cpuid) | 144 | if (cpu != boot_cpuid) |
139 | xics_setup_cpu(); | 145 | xics_setup_cpu(); |
146 | if (cpu_has_feature(CPU_FTR_DBELL)) | ||
147 | doorbell_setup_this_cpu(); | ||
140 | 148 | ||
141 | if (firmware_has_feature(FW_FEATURE_SPLPAR)) | 149 | if (firmware_has_feature(FW_FEATURE_SPLPAR)) |
142 | vpa_init(cpu); | 150 | vpa_init(cpu); |
@@ -195,6 +203,27 @@ static int smp_pSeries_cpu_bootable(unsigned int nr) | |||
195 | return 1; | 203 | return 1; |
196 | } | 204 | } |
197 | 205 | ||
206 | /* Only used on systems that support multiple IPI mechanisms */ | ||
207 | static void pSeries_cause_ipi_mux(int cpu, unsigned long data) | ||
208 | { | ||
209 | if (cpumask_test_cpu(cpu, cpu_sibling_mask(smp_processor_id()))) | ||
210 | doorbell_cause_ipi(cpu, data); | ||
211 | else | ||
212 | xics_cause_ipi(cpu, data); | ||
213 | } | ||
214 | |||
215 | static __init int pSeries_smp_probe(void) | ||
216 | { | ||
217 | int ret = xics_smp_probe(); | ||
218 | |||
219 | if (cpu_has_feature(CPU_FTR_DBELL)) { | ||
220 | xics_cause_ipi = smp_ops->cause_ipi; | ||
221 | smp_ops->cause_ipi = pSeries_cause_ipi_mux; | ||
222 | } | ||
223 | |||
224 | return ret; | ||
225 | } | ||
226 | |||
198 | static struct smp_ops_t pSeries_mpic_smp_ops = { | 227 | static struct smp_ops_t pSeries_mpic_smp_ops = { |
199 | .message_pass = smp_mpic_message_pass, | 228 | .message_pass = smp_mpic_message_pass, |
200 | .probe = smp_mpic_probe, | 229 | .probe = smp_mpic_probe, |
@@ -204,8 +233,8 @@ static struct smp_ops_t pSeries_mpic_smp_ops = { | |||
204 | 233 | ||
205 | static struct smp_ops_t pSeries_xics_smp_ops = { | 234 | static struct smp_ops_t pSeries_xics_smp_ops = { |
206 | .message_pass = NULL, /* Use smp_muxed_ipi_message_pass */ | 235 | .message_pass = NULL, /* Use smp_muxed_ipi_message_pass */ |
207 | .cause_ipi = NULL, /* Filled at runtime by xics_smp_probe() */ | 236 | .cause_ipi = NULL, /* Filled at runtime by pSeries_smp_probe() */ |
208 | .probe = xics_smp_probe, | 237 | .probe = pSeries_smp_probe, |
209 | .kick_cpu = smp_pSeries_kick_cpu, | 238 | .kick_cpu = smp_pSeries_kick_cpu, |
210 | .setup_cpu = smp_xics_setup_cpu, | 239 | .setup_cpu = smp_xics_setup_cpu, |
211 | .cpu_bootable = smp_pSeries_cpu_bootable, | 240 | .cpu_bootable = smp_pSeries_cpu_bootable, |
diff --git a/arch/powerpc/platforms/wsp/Makefile b/arch/powerpc/platforms/wsp/Makefile index 56817ac98fc9..162fc60125a2 100644 --- a/arch/powerpc/platforms/wsp/Makefile +++ b/arch/powerpc/platforms/wsp/Makefile | |||
@@ -1,4 +1,4 @@ | |||
1 | ccflags-y += -mno-minimal-toc | 1 | ccflags-y += $(NO_MINIMAL_TOC) |
2 | 2 | ||
3 | obj-y += setup.o ics.o wsp.o | 3 | obj-y += setup.o ics.o wsp.o |
4 | obj-$(CONFIG_PPC_PSR2) += psr2.o | 4 | obj-$(CONFIG_PPC_PSR2) += psr2.o |
diff --git a/arch/powerpc/sysdev/Makefile b/arch/powerpc/sysdev/Makefile index a57600b3a4e3..b0a518e97599 100644 --- a/arch/powerpc/sysdev/Makefile +++ b/arch/powerpc/sysdev/Makefile | |||
@@ -1,6 +1,6 @@ | |||
1 | subdir-ccflags-$(CONFIG_PPC_WERROR) := -Werror | 1 | subdir-ccflags-$(CONFIG_PPC_WERROR) := -Werror |
2 | 2 | ||
3 | ccflags-$(CONFIG_PPC64) := -mno-minimal-toc | 3 | ccflags-$(CONFIG_PPC64) := $(NO_MINIMAL_TOC) |
4 | 4 | ||
5 | mpic-msi-obj-$(CONFIG_PCI_MSI) += mpic_msi.o mpic_u3msi.o mpic_pasemi_msi.o | 5 | mpic-msi-obj-$(CONFIG_PCI_MSI) += mpic_msi.o mpic_u3msi.o mpic_pasemi_msi.o |
6 | obj-$(CONFIG_MPIC) += mpic.o $(mpic-msi-obj-y) | 6 | obj-$(CONFIG_MPIC) += mpic.o $(mpic-msi-obj-y) |
@@ -26,7 +26,6 @@ obj-$(CONFIG_SIMPLE_GPIO) += simple_gpio.o | |||
26 | obj-$(CONFIG_FSL_RIO) += fsl_rio.o fsl_rmu.o | 26 | obj-$(CONFIG_FSL_RIO) += fsl_rio.o fsl_rmu.o |
27 | obj-$(CONFIG_TSI108_BRIDGE) += tsi108_pci.o tsi108_dev.o | 27 | obj-$(CONFIG_TSI108_BRIDGE) += tsi108_pci.o tsi108_dev.o |
28 | obj-$(CONFIG_QUICC_ENGINE) += qe_lib/ | 28 | obj-$(CONFIG_QUICC_ENGINE) += qe_lib/ |
29 | obj-$(CONFIG_PPC_BESTCOMM) += bestcomm/ | ||
30 | mv64x60-$(CONFIG_PCI) += mv64x60_pci.o | 29 | mv64x60-$(CONFIG_PCI) += mv64x60_pci.o |
31 | obj-$(CONFIG_MV64X60) += $(mv64x60-y) mv64x60_pic.o mv64x60_dev.o \ | 30 | obj-$(CONFIG_MV64X60) += $(mv64x60-y) mv64x60_pic.o mv64x60_dev.o \ |
32 | mv64x60_udbg.o | 31 | mv64x60_udbg.o |
@@ -37,6 +36,7 @@ obj-$(CONFIG_PPC_INDIRECT_PCI) += indirect_pci.o | |||
37 | obj-$(CONFIG_PPC_I8259) += i8259.o | 36 | obj-$(CONFIG_PPC_I8259) += i8259.o |
38 | obj-$(CONFIG_IPIC) += ipic.o | 37 | obj-$(CONFIG_IPIC) += ipic.o |
39 | obj-$(CONFIG_4xx) += uic.o | 38 | obj-$(CONFIG_4xx) += uic.o |
39 | obj-$(CONFIG_PPC4xx_OCM) += ppc4xx_ocm.o | ||
40 | obj-$(CONFIG_4xx_SOC) += ppc4xx_soc.o | 40 | obj-$(CONFIG_4xx_SOC) += ppc4xx_soc.o |
41 | obj-$(CONFIG_XILINX_VIRTEX) += xilinx_intc.o | 41 | obj-$(CONFIG_XILINX_VIRTEX) += xilinx_intc.o |
42 | obj-$(CONFIG_XILINX_PCI) += xilinx_pci.o | 42 | obj-$(CONFIG_XILINX_PCI) += xilinx_pci.o |
diff --git a/arch/powerpc/sysdev/fsl_85xx_l2ctlr.c b/arch/powerpc/sysdev/fsl_85xx_l2ctlr.c index 8cf93f029e17..afc2dbf37011 100644 --- a/arch/powerpc/sysdev/fsl_85xx_l2ctlr.c +++ b/arch/powerpc/sysdev/fsl_85xx_l2ctlr.c | |||
@@ -203,6 +203,7 @@ static struct of_device_id mpc85xx_l2ctlr_of_match[] = { | |||
203 | { .compatible = "fsl,p1024-l2-cache-controller",}, | 203 | { .compatible = "fsl,p1024-l2-cache-controller",}, |
204 | { .compatible = "fsl,p1015-l2-cache-controller",}, | 204 | { .compatible = "fsl,p1015-l2-cache-controller",}, |
205 | { .compatible = "fsl,p1010-l2-cache-controller",}, | 205 | { .compatible = "fsl,p1010-l2-cache-controller",}, |
206 | { .compatible = "fsl,bsc9131-l2-cache-controller",}, | ||
206 | {}, | 207 | {}, |
207 | }; | 208 | }; |
208 | 209 | ||
diff --git a/arch/powerpc/sysdev/fsl_ifc.c b/arch/powerpc/sysdev/fsl_ifc.c index 2a36fd6a9583..d7fc72239144 100644 --- a/arch/powerpc/sysdev/fsl_ifc.c +++ b/arch/powerpc/sysdev/fsl_ifc.c | |||
@@ -63,7 +63,7 @@ int fsl_ifc_find(phys_addr_t addr_base) | |||
63 | return -ENODEV; | 63 | return -ENODEV; |
64 | 64 | ||
65 | for (i = 0; i < ARRAY_SIZE(fsl_ifc_ctrl_dev->regs->cspr_cs); i++) { | 65 | for (i = 0; i < ARRAY_SIZE(fsl_ifc_ctrl_dev->regs->cspr_cs); i++) { |
66 | __be32 cspr = in_be32(&fsl_ifc_ctrl_dev->regs->cspr_cs[i].cspr); | 66 | u32 cspr = in_be32(&fsl_ifc_ctrl_dev->regs->cspr_cs[i].cspr); |
67 | if (cspr & CSPR_V && (cspr & CSPR_BA) == | 67 | if (cspr & CSPR_V && (cspr & CSPR_BA) == |
68 | convert_ifc_address(addr_base)) | 68 | convert_ifc_address(addr_base)) |
69 | return i; | 69 | return i; |
diff --git a/arch/powerpc/sysdev/fsl_lbc.c b/arch/powerpc/sysdev/fsl_lbc.c index 300be2d06a26..6bc5a546d49f 100644 --- a/arch/powerpc/sysdev/fsl_lbc.c +++ b/arch/powerpc/sysdev/fsl_lbc.c | |||
@@ -74,8 +74,8 @@ int fsl_lbc_find(phys_addr_t addr_base) | |||
74 | 74 | ||
75 | lbc = fsl_lbc_ctrl_dev->regs; | 75 | lbc = fsl_lbc_ctrl_dev->regs; |
76 | for (i = 0; i < ARRAY_SIZE(lbc->bank); i++) { | 76 | for (i = 0; i < ARRAY_SIZE(lbc->bank); i++) { |
77 | __be32 br = in_be32(&lbc->bank[i].br); | 77 | u32 br = in_be32(&lbc->bank[i].br); |
78 | __be32 or = in_be32(&lbc->bank[i].or); | 78 | u32 or = in_be32(&lbc->bank[i].or); |
79 | 79 | ||
80 | if (br & BR_V && (br & or & BR_BA) == fsl_lbc_addr(addr_base)) | 80 | if (br & BR_V && (br & or & BR_BA) == fsl_lbc_addr(addr_base)) |
81 | return i; | 81 | return i; |
@@ -97,7 +97,7 @@ EXPORT_SYMBOL(fsl_lbc_find); | |||
97 | int fsl_upm_find(phys_addr_t addr_base, struct fsl_upm *upm) | 97 | int fsl_upm_find(phys_addr_t addr_base, struct fsl_upm *upm) |
98 | { | 98 | { |
99 | int bank; | 99 | int bank; |
100 | __be32 br; | 100 | u32 br; |
101 | struct fsl_lbc_regs __iomem *lbc; | 101 | struct fsl_lbc_regs __iomem *lbc; |
102 | 102 | ||
103 | bank = fsl_lbc_find(addr_base); | 103 | bank = fsl_lbc_find(addr_base); |
diff --git a/arch/powerpc/sysdev/fsl_msi.c b/arch/powerpc/sysdev/fsl_msi.c index 6e53d97abd3f..178c99427b1c 100644 --- a/arch/powerpc/sysdev/fsl_msi.c +++ b/arch/powerpc/sysdev/fsl_msi.c | |||
@@ -28,7 +28,7 @@ | |||
28 | #include "fsl_msi.h" | 28 | #include "fsl_msi.h" |
29 | #include "fsl_pci.h" | 29 | #include "fsl_pci.h" |
30 | 30 | ||
31 | LIST_HEAD(msi_head); | 31 | static LIST_HEAD(msi_head); |
32 | 32 | ||
33 | struct fsl_msi_feature { | 33 | struct fsl_msi_feature { |
34 | u32 fsl_pic_ip; | 34 | u32 fsl_pic_ip; |
@@ -130,7 +130,7 @@ static void fsl_compose_msi_msg(struct pci_dev *pdev, int hwirq, | |||
130 | struct pci_controller *hose = pci_bus_to_host(pdev->bus); | 130 | struct pci_controller *hose = pci_bus_to_host(pdev->bus); |
131 | u64 address; /* Physical address of the MSIIR */ | 131 | u64 address; /* Physical address of the MSIIR */ |
132 | int len; | 132 | int len; |
133 | const u64 *reg; | 133 | const __be64 *reg; |
134 | 134 | ||
135 | /* If the msi-address-64 property exists, then use it */ | 135 | /* If the msi-address-64 property exists, then use it */ |
136 | reg = of_get_property(hose->dn, "msi-address-64", &len); | 136 | reg = of_get_property(hose->dn, "msi-address-64", &len); |
diff --git a/arch/powerpc/sysdev/fsl_pci.c b/arch/powerpc/sysdev/fsl_pci.c index 92a5915b1827..682084dba19b 100644 --- a/arch/powerpc/sysdev/fsl_pci.c +++ b/arch/powerpc/sysdev/fsl_pci.c | |||
@@ -421,13 +421,16 @@ void fsl_pcibios_fixup_bus(struct pci_bus *bus) | |||
421 | } | 421 | } |
422 | } | 422 | } |
423 | 423 | ||
424 | int __init fsl_add_bridge(struct device_node *dev, int is_primary) | 424 | int __init fsl_add_bridge(struct platform_device *pdev, int is_primary) |
425 | { | 425 | { |
426 | int len; | 426 | int len; |
427 | struct pci_controller *hose; | 427 | struct pci_controller *hose; |
428 | struct resource rsrc; | 428 | struct resource rsrc; |
429 | const int *bus_range; | 429 | const int *bus_range; |
430 | u8 hdr_type, progif; | 430 | u8 hdr_type, progif; |
431 | struct device_node *dev; | ||
432 | |||
433 | dev = pdev->dev.of_node; | ||
431 | 434 | ||
432 | if (!of_device_is_available(dev)) { | 435 | if (!of_device_is_available(dev)) { |
433 | pr_warning("%s: disabled\n", dev->full_name); | 436 | pr_warning("%s: disabled\n", dev->full_name); |
@@ -453,6 +456,8 @@ int __init fsl_add_bridge(struct device_node *dev, int is_primary) | |||
453 | if (!hose) | 456 | if (!hose) |
454 | return -ENOMEM; | 457 | return -ENOMEM; |
455 | 458 | ||
459 | /* set platform device as the parent */ | ||
460 | hose->parent = &pdev->dev; | ||
456 | hose->first_busno = bus_range ? bus_range[0] : 0x0; | 461 | hose->first_busno = bus_range ? bus_range[0] : 0x0; |
457 | hose->last_busno = bus_range ? bus_range[1] : 0xff; | 462 | hose->last_busno = bus_range ? bus_range[1] : 0xff; |
458 | 463 | ||
@@ -827,13 +832,18 @@ static const struct of_device_id pci_ids[] = { | |||
827 | { .compatible = "fsl,mpc8548-pcie", }, | 832 | { .compatible = "fsl,mpc8548-pcie", }, |
828 | { .compatible = "fsl,mpc8610-pci", }, | 833 | { .compatible = "fsl,mpc8610-pci", }, |
829 | { .compatible = "fsl,mpc8641-pcie", }, | 834 | { .compatible = "fsl,mpc8641-pcie", }, |
835 | { .compatible = "fsl,qoriq-pcie-v2.1", }, | ||
836 | { .compatible = "fsl,qoriq-pcie-v2.2", }, | ||
837 | { .compatible = "fsl,qoriq-pcie-v2.3", }, | ||
838 | { .compatible = "fsl,qoriq-pcie-v2.4", }, | ||
839 | |||
840 | /* | ||
841 | * The following entries are for compatibility with older device | ||
842 | * trees. | ||
843 | */ | ||
830 | { .compatible = "fsl,p1022-pcie", }, | 844 | { .compatible = "fsl,p1022-pcie", }, |
831 | { .compatible = "fsl,p1010-pcie", }, | ||
832 | { .compatible = "fsl,p1023-pcie", }, | ||
833 | { .compatible = "fsl,p4080-pcie", }, | 845 | { .compatible = "fsl,p4080-pcie", }, |
834 | { .compatible = "fsl,qoriq-pcie-v2.4", }, | 846 | |
835 | { .compatible = "fsl,qoriq-pcie-v2.3", }, | ||
836 | { .compatible = "fsl,qoriq-pcie-v2.2", }, | ||
837 | {}, | 847 | {}, |
838 | }; | 848 | }; |
839 | 849 | ||
@@ -880,7 +890,7 @@ static int fsl_pci_probe(struct platform_device *pdev) | |||
880 | #endif | 890 | #endif |
881 | 891 | ||
882 | node = pdev->dev.of_node; | 892 | node = pdev->dev.of_node; |
883 | ret = fsl_add_bridge(node, fsl_pci_primary == node); | 893 | ret = fsl_add_bridge(pdev, fsl_pci_primary == node); |
884 | 894 | ||
885 | #ifdef CONFIG_SWIOTLB | 895 | #ifdef CONFIG_SWIOTLB |
886 | if (ret == 0) { | 896 | if (ret == 0) { |
diff --git a/arch/powerpc/sysdev/fsl_pci.h b/arch/powerpc/sysdev/fsl_pci.h index d078537adece..c495c00c8740 100644 --- a/arch/powerpc/sysdev/fsl_pci.h +++ b/arch/powerpc/sysdev/fsl_pci.h | |||
@@ -91,7 +91,7 @@ struct ccsr_pci { | |||
91 | __be32 pex_err_cap_r3; /* 0x.e34 - PCIE error capture register 0 */ | 91 | __be32 pex_err_cap_r3; /* 0x.e34 - PCIE error capture register 0 */ |
92 | }; | 92 | }; |
93 | 93 | ||
94 | extern int fsl_add_bridge(struct device_node *dev, int is_primary); | 94 | extern int fsl_add_bridge(struct platform_device *pdev, int is_primary); |
95 | extern void fsl_pcibios_fixup_bus(struct pci_bus *bus); | 95 | extern void fsl_pcibios_fixup_bus(struct pci_bus *bus); |
96 | extern int mpc83xx_add_bridge(struct device_node *dev); | 96 | extern int mpc83xx_add_bridge(struct device_node *dev); |
97 | u64 fsl_pci_immrbar_base(struct pci_controller *hose); | 97 | u64 fsl_pci_immrbar_base(struct pci_controller *hose); |
diff --git a/arch/powerpc/sysdev/fsl_soc.c b/arch/powerpc/sysdev/fsl_soc.c index 97118dc3d285..228cf91b91c1 100644 --- a/arch/powerpc/sysdev/fsl_soc.c +++ b/arch/powerpc/sysdev/fsl_soc.c | |||
@@ -58,10 +58,10 @@ phys_addr_t get_immrbase(void) | |||
58 | if (soc) { | 58 | if (soc) { |
59 | int size; | 59 | int size; |
60 | u32 naddr; | 60 | u32 naddr; |
61 | const u32 *prop = of_get_property(soc, "#address-cells", &size); | 61 | const __be32 *prop = of_get_property(soc, "#address-cells", &size); |
62 | 62 | ||
63 | if (prop && size == 4) | 63 | if (prop && size == 4) |
64 | naddr = *prop; | 64 | naddr = be32_to_cpup(prop); |
65 | else | 65 | else |
66 | naddr = 2; | 66 | naddr = 2; |
67 | 67 | ||
diff --git a/arch/powerpc/sysdev/mpc5xxx_clocks.c b/arch/powerpc/sysdev/mpc5xxx_clocks.c index 96f815a55dfd..5492dc5f56f4 100644 --- a/arch/powerpc/sysdev/mpc5xxx_clocks.c +++ b/arch/powerpc/sysdev/mpc5xxx_clocks.c | |||
@@ -9,9 +9,9 @@ | |||
9 | #include <linux/kernel.h> | 9 | #include <linux/kernel.h> |
10 | #include <linux/of_platform.h> | 10 | #include <linux/of_platform.h> |
11 | #include <linux/export.h> | 11 | #include <linux/export.h> |
12 | #include <asm/mpc5xxx.h> | ||
12 | 13 | ||
13 | unsigned int | 14 | unsigned long mpc5xxx_get_bus_frequency(struct device_node *node) |
14 | mpc5xxx_get_bus_frequency(struct device_node *node) | ||
15 | { | 15 | { |
16 | struct device_node *np; | 16 | struct device_node *np; |
17 | const unsigned int *p_bus_freq = NULL; | 17 | const unsigned int *p_bus_freq = NULL; |
diff --git a/arch/powerpc/sysdev/mpic.c b/arch/powerpc/sysdev/mpic.c index 3b2efd41abf2..d30e6a676c89 100644 --- a/arch/powerpc/sysdev/mpic.c +++ b/arch/powerpc/sysdev/mpic.c | |||
@@ -54,7 +54,7 @@ static DEFINE_RAW_SPINLOCK(mpic_lock); | |||
54 | 54 | ||
55 | #ifdef CONFIG_PPC32 /* XXX for now */ | 55 | #ifdef CONFIG_PPC32 /* XXX for now */ |
56 | #ifdef CONFIG_IRQ_ALL_CPUS | 56 | #ifdef CONFIG_IRQ_ALL_CPUS |
57 | #define distribute_irqs (1) | 57 | #define distribute_irqs (!(mpic->flags & MPIC_SINGLE_DEST_CPU)) |
58 | #else | 58 | #else |
59 | #define distribute_irqs (0) | 59 | #define distribute_irqs (0) |
60 | #endif | 60 | #endif |
@@ -1182,6 +1182,7 @@ struct mpic * __init mpic_alloc(struct device_node *node, | |||
1182 | const char *vers; | 1182 | const char *vers; |
1183 | const u32 *psrc; | 1183 | const u32 *psrc; |
1184 | u32 last_irq; | 1184 | u32 last_irq; |
1185 | u32 fsl_version = 0; | ||
1185 | 1186 | ||
1186 | /* Default MPIC search parameters */ | 1187 | /* Default MPIC search parameters */ |
1187 | static const struct of_device_id __initconst mpic_device_id[] = { | 1188 | static const struct of_device_id __initconst mpic_device_id[] = { |
@@ -1314,7 +1315,7 @@ struct mpic * __init mpic_alloc(struct device_node *node, | |||
1314 | mpic_map(mpic, mpic->paddr, &mpic->tmregs, MPIC_INFO(TIMER_BASE), 0x1000); | 1315 | mpic_map(mpic, mpic->paddr, &mpic->tmregs, MPIC_INFO(TIMER_BASE), 0x1000); |
1315 | 1316 | ||
1316 | if (mpic->flags & MPIC_FSL) { | 1317 | if (mpic->flags & MPIC_FSL) { |
1317 | u32 brr1, version; | 1318 | u32 brr1; |
1318 | int ret; | 1319 | int ret; |
1319 | 1320 | ||
1320 | /* | 1321 | /* |
@@ -1327,7 +1328,7 @@ struct mpic * __init mpic_alloc(struct device_node *node, | |||
1327 | 1328 | ||
1328 | brr1 = _mpic_read(mpic->reg_type, &mpic->thiscpuregs, | 1329 | brr1 = _mpic_read(mpic->reg_type, &mpic->thiscpuregs, |
1329 | MPIC_FSL_BRR1); | 1330 | MPIC_FSL_BRR1); |
1330 | version = brr1 & MPIC_FSL_BRR1_VER; | 1331 | fsl_version = brr1 & MPIC_FSL_BRR1_VER; |
1331 | 1332 | ||
1332 | /* Error interrupt mask register (EIMR) is required for | 1333 | /* Error interrupt mask register (EIMR) is required for |
1333 | * handling individual device error interrupts. EIMR | 1334 | * handling individual device error interrupts. EIMR |
@@ -1342,11 +1343,30 @@ struct mpic * __init mpic_alloc(struct device_node *node, | |||
1342 | * is the number of vectors which have been consumed by | 1343 | * is the number of vectors which have been consumed by |
1343 | * ipis and timer interrupts. | 1344 | * ipis and timer interrupts. |
1344 | */ | 1345 | */ |
1345 | if (version >= 0x401) { | 1346 | if (fsl_version >= 0x401) { |
1346 | ret = mpic_setup_error_int(mpic, intvec_top - 12); | 1347 | ret = mpic_setup_error_int(mpic, intvec_top - 12); |
1347 | if (ret) | 1348 | if (ret) |
1348 | return NULL; | 1349 | return NULL; |
1349 | } | 1350 | } |
1351 | |||
1352 | } | ||
1353 | |||
1354 | /* | ||
1355 | * EPR is only available starting with v4.0. To support | ||
1356 | * platforms that don't know the MPIC version at compile-time, | ||
1357 | * such as qemu-e500, turn off coreint if this MPIC doesn't | ||
1358 | * support it. Note that we never enable it if it wasn't | ||
1359 | * requested in the first place. | ||
1360 | * | ||
1361 | * This is done outside the MPIC_FSL check, so that we | ||
1362 | * also disable coreint if the MPIC node doesn't have | ||
1363 | * an "fsl,mpic" compatible at all. This will be the case | ||
1364 | * with device trees generated by older versions of QEMU. | ||
1365 | * fsl_version will be zero if MPIC_FSL is not set. | ||
1366 | */ | ||
1367 | if (fsl_version < 0x400 && (flags & MPIC_ENABLE_COREINT)) { | ||
1368 | WARN_ON(ppc_md.get_irq != mpic_get_coreint_irq); | ||
1369 | ppc_md.get_irq = mpic_get_irq; | ||
1350 | } | 1370 | } |
1351 | 1371 | ||
1352 | /* Reset */ | 1372 | /* Reset */ |
diff --git a/arch/powerpc/sysdev/ppc4xx_ocm.c b/arch/powerpc/sysdev/ppc4xx_ocm.c new file mode 100644 index 000000000000..1b15f93479c3 --- /dev/null +++ b/arch/powerpc/sysdev/ppc4xx_ocm.c | |||
@@ -0,0 +1,415 @@ | |||
1 | /* | ||
2 | * PowerPC 4xx OCM memory allocation support | ||
3 | * | ||
4 | * (C) Copyright 2009, Applied Micro Circuits Corporation | ||
5 | * Victor Gallardo (vgallardo@amcc.com) | ||
6 | * | ||
7 | * See file CREDITS for list of people who contributed to this | ||
8 | * project. | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or | ||
11 | * modify it under the terms of the GNU General Public License as | ||
12 | * published by the Free Software Foundation; either version 2 of | ||
13 | * the License, or (at your option) any later version. | ||
14 | * | ||
15 | * This program is distributed in the hope that it will be useful, | ||
16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
18 | * GNU General Public License for more details. | ||
19 | * | ||
20 | * You should have received a copy of the GNU General Public License | ||
21 | * along with this program; if not, write to the Free Software | ||
22 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, | ||
23 | * MA 02111-1307 USA | ||
24 | */ | ||
25 | |||
26 | #include <linux/kernel.h> | ||
27 | #include <linux/dma-mapping.h> | ||
28 | #include <linux/of.h> | ||
29 | #include <asm/rheap.h> | ||
30 | #include <asm/ppc4xx_ocm.h> | ||
31 | #include <linux/slab.h> | ||
32 | #include <linux/debugfs.h> | ||
33 | |||
34 | #define OCM_DISABLED 0 | ||
35 | #define OCM_ENABLED 1 | ||
36 | |||
37 | struct ocm_block { | ||
38 | struct list_head list; | ||
39 | void __iomem *addr; | ||
40 | int size; | ||
41 | const char *owner; | ||
42 | }; | ||
43 | |||
44 | /* non-cached or cached region */ | ||
45 | struct ocm_region { | ||
46 | phys_addr_t phys; | ||
47 | void __iomem *virt; | ||
48 | |||
49 | int memtotal; | ||
50 | int memfree; | ||
51 | |||
52 | rh_info_t *rh; | ||
53 | struct list_head list; | ||
54 | }; | ||
55 | |||
56 | struct ocm_info { | ||
57 | int index; | ||
58 | int status; | ||
59 | int ready; | ||
60 | |||
61 | phys_addr_t phys; | ||
62 | |||
63 | int alignment; | ||
64 | int memtotal; | ||
65 | int cache_size; | ||
66 | |||
67 | struct ocm_region nc; /* non-cached region */ | ||
68 | struct ocm_region c; /* cached region */ | ||
69 | }; | ||
70 | |||
71 | static struct ocm_info *ocm_nodes; | ||
72 | static int ocm_count; | ||
73 | |||
74 | static struct ocm_info *ocm_get_node(unsigned int index) | ||
75 | { | ||
76 | if (index >= ocm_count) { | ||
77 | printk(KERN_ERR "PPC4XX OCM: invalid index"); | ||
78 | return NULL; | ||
79 | } | ||
80 | |||
81 | return &ocm_nodes[index]; | ||
82 | } | ||
83 | |||
84 | static int ocm_free_region(struct ocm_region *ocm_reg, const void *addr) | ||
85 | { | ||
86 | struct ocm_block *blk, *tmp; | ||
87 | unsigned long offset; | ||
88 | |||
89 | if (!ocm_reg->virt) | ||
90 | return 0; | ||
91 | |||
92 | list_for_each_entry_safe(blk, tmp, &ocm_reg->list, list) { | ||
93 | if (blk->addr == addr) { | ||
94 | offset = addr - ocm_reg->virt; | ||
95 | ocm_reg->memfree += blk->size; | ||
96 | rh_free(ocm_reg->rh, offset); | ||
97 | list_del(&blk->list); | ||
98 | kfree(blk); | ||
99 | return 1; | ||
100 | } | ||
101 | } | ||
102 | |||
103 | return 0; | ||
104 | } | ||
105 | |||
106 | static void __init ocm_init_node(int count, struct device_node *node) | ||
107 | { | ||
108 | struct ocm_info *ocm; | ||
109 | |||
110 | const unsigned int *cell_index; | ||
111 | const unsigned int *cache_size; | ||
112 | int len; | ||
113 | |||
114 | struct resource rsrc; | ||
115 | int ioflags; | ||
116 | |||
117 | ocm = ocm_get_node(count); | ||
118 | |||
119 | cell_index = of_get_property(node, "cell-index", &len); | ||
120 | if (!cell_index) { | ||
121 | printk(KERN_ERR "PPC4XX OCM: missing cell-index property"); | ||
122 | return; | ||
123 | } | ||
124 | ocm->index = *cell_index; | ||
125 | |||
126 | if (of_device_is_available(node)) | ||
127 | ocm->status = OCM_ENABLED; | ||
128 | |||
129 | cache_size = of_get_property(node, "cached-region-size", &len); | ||
130 | if (cache_size) | ||
131 | ocm->cache_size = *cache_size; | ||
132 | |||
133 | if (of_address_to_resource(node, 0, &rsrc)) { | ||
134 | printk(KERN_ERR "PPC4XX OCM%d: could not get resource address\n", | ||
135 | ocm->index); | ||
136 | return; | ||
137 | } | ||
138 | |||
139 | ocm->phys = rsrc.start; | ||
140 | ocm->memtotal = (rsrc.end - rsrc.start + 1); | ||
141 | |||
142 | printk(KERN_INFO "PPC4XX OCM%d: %d Bytes (%s)\n", | ||
143 | ocm->index, ocm->memtotal, | ||
144 | (ocm->status == OCM_DISABLED) ? "disabled" : "enabled"); | ||
145 | |||
146 | if (ocm->status == OCM_DISABLED) | ||
147 | return; | ||
148 | |||
149 | /* request region */ | ||
150 | |||
151 | if (!request_mem_region(ocm->phys, ocm->memtotal, "ppc4xx_ocm")) { | ||
152 | printk(KERN_ERR "PPC4XX OCM%d: could not request region\n", | ||
153 | ocm->index); | ||
154 | return; | ||
155 | } | ||
156 | |||
157 | /* Configure non-cached and cached regions */ | ||
158 | |||
159 | ocm->nc.phys = ocm->phys; | ||
160 | ocm->nc.memtotal = ocm->memtotal - ocm->cache_size; | ||
161 | ocm->nc.memfree = ocm->nc.memtotal; | ||
162 | |||
163 | ocm->c.phys = ocm->phys + ocm->nc.memtotal; | ||
164 | ocm->c.memtotal = ocm->cache_size; | ||
165 | ocm->c.memfree = ocm->c.memtotal; | ||
166 | |||
167 | if (ocm->nc.memtotal == 0) | ||
168 | ocm->nc.phys = 0; | ||
169 | |||
170 | if (ocm->c.memtotal == 0) | ||
171 | ocm->c.phys = 0; | ||
172 | |||
173 | printk(KERN_INFO "PPC4XX OCM%d: %d Bytes (non-cached)\n", | ||
174 | ocm->index, ocm->nc.memtotal); | ||
175 | |||
176 | printk(KERN_INFO "PPC4XX OCM%d: %d Bytes (cached)\n", | ||
177 | ocm->index, ocm->c.memtotal); | ||
178 | |||
179 | /* ioremap the non-cached region */ | ||
180 | if (ocm->nc.memtotal) { | ||
181 | ioflags = _PAGE_NO_CACHE | _PAGE_GUARDED | _PAGE_EXEC; | ||
182 | ocm->nc.virt = __ioremap(ocm->nc.phys, ocm->nc.memtotal, | ||
183 | ioflags); | ||
184 | |||
185 | if (!ocm->nc.virt) { | ||
186 | printk(KERN_ERR | ||
187 | "PPC4XX OCM%d: failed to ioremap non-cached memory\n", | ||
188 | ocm->index); | ||
189 | ocm->nc.memfree = 0; | ||
190 | return; | ||
191 | } | ||
192 | } | ||
193 | |||
194 | /* ioremap the cached region */ | ||
195 | |||
196 | if (ocm->c.memtotal) { | ||
197 | ioflags = _PAGE_EXEC; | ||
198 | ocm->c.virt = __ioremap(ocm->c.phys, ocm->c.memtotal, | ||
199 | ioflags); | ||
200 | |||
201 | if (!ocm->c.virt) { | ||
202 | printk(KERN_ERR | ||
203 | "PPC4XX OCM%d: failed to ioremap cached memory\n", | ||
204 | ocm->index); | ||
205 | ocm->c.memfree = 0; | ||
206 | return; | ||
207 | } | ||
208 | } | ||
209 | |||
210 | /* Create Remote Heaps */ | ||
211 | |||
212 | ocm->alignment = 4; /* default 4 byte alignment */ | ||
213 | |||
214 | if (ocm->nc.virt) { | ||
215 | ocm->nc.rh = rh_create(ocm->alignment); | ||
216 | rh_attach_region(ocm->nc.rh, 0, ocm->nc.memtotal); | ||
217 | } | ||
218 | |||
219 | if (ocm->c.virt) { | ||
220 | ocm->c.rh = rh_create(ocm->alignment); | ||
221 | rh_attach_region(ocm->c.rh, 0, ocm->c.memtotal); | ||
222 | } | ||
223 | |||
224 | INIT_LIST_HEAD(&ocm->nc.list); | ||
225 | INIT_LIST_HEAD(&ocm->c.list); | ||
226 | |||
227 | ocm->ready = 1; | ||
228 | |||
229 | return; | ||
230 | } | ||
231 | |||
232 | static int ocm_debugfs_show(struct seq_file *m, void *v) | ||
233 | { | ||
234 | struct ocm_block *blk, *tmp; | ||
235 | unsigned int i; | ||
236 | |||
237 | for (i = 0; i < ocm_count; i++) { | ||
238 | struct ocm_info *ocm = ocm_get_node(i); | ||
239 | |||
240 | if (!ocm || !ocm->ready) | ||
241 | continue; | ||
242 | |||
243 | seq_printf(m, "PPC4XX OCM : %d\n", ocm->index); | ||
244 | seq_printf(m, "PhysAddr : 0x%llx\n", ocm->phys); | ||
245 | seq_printf(m, "MemTotal : %d Bytes\n", ocm->memtotal); | ||
246 | seq_printf(m, "MemTotal(NC) : %d Bytes\n", ocm->nc.memtotal); | ||
247 | seq_printf(m, "MemTotal(C) : %d Bytes\n", ocm->c.memtotal); | ||
248 | |||
249 | seq_printf(m, "\n"); | ||
250 | |||
251 | seq_printf(m, "NC.PhysAddr : 0x%llx\n", ocm->nc.phys); | ||
252 | seq_printf(m, "NC.VirtAddr : 0x%p\n", ocm->nc.virt); | ||
253 | seq_printf(m, "NC.MemTotal : %d Bytes\n", ocm->nc.memtotal); | ||
254 | seq_printf(m, "NC.MemFree : %d Bytes\n", ocm->nc.memfree); | ||
255 | |||
256 | list_for_each_entry_safe(blk, tmp, &ocm->nc.list, list) { | ||
257 | seq_printf(m, "NC.MemUsed : %d Bytes (%s)\n", | ||
258 | blk->size, blk->owner); | ||
259 | } | ||
260 | |||
261 | seq_printf(m, "\n"); | ||
262 | |||
263 | seq_printf(m, "C.PhysAddr : 0x%llx\n", ocm->c.phys); | ||
264 | seq_printf(m, "C.VirtAddr : 0x%p\n", ocm->c.virt); | ||
265 | seq_printf(m, "C.MemTotal : %d Bytes\n", ocm->c.memtotal); | ||
266 | seq_printf(m, "C.MemFree : %d Bytes\n", ocm->c.memfree); | ||
267 | |||
268 | list_for_each_entry_safe(blk, tmp, &ocm->c.list, list) { | ||
269 | seq_printf(m, "C.MemUsed : %d Bytes (%s)\n", | ||
270 | blk->size, blk->owner); | ||
271 | } | ||
272 | |||
273 | seq_printf(m, "\n"); | ||
274 | } | ||
275 | |||
276 | return 0; | ||
277 | } | ||
278 | |||
279 | static int ocm_debugfs_open(struct inode *inode, struct file *file) | ||
280 | { | ||
281 | return single_open(file, ocm_debugfs_show, NULL); | ||
282 | } | ||
283 | |||
284 | static const struct file_operations ocm_debugfs_fops = { | ||
285 | .open = ocm_debugfs_open, | ||
286 | .read = seq_read, | ||
287 | .llseek = seq_lseek, | ||
288 | .release = single_release, | ||
289 | }; | ||
290 | |||
291 | static int ocm_debugfs_init(void) | ||
292 | { | ||
293 | struct dentry *junk; | ||
294 | |||
295 | junk = debugfs_create_dir("ppc4xx_ocm", 0); | ||
296 | if (!junk) { | ||
297 | printk(KERN_ALERT "debugfs ppc4xx ocm: failed to create dir\n"); | ||
298 | return -1; | ||
299 | } | ||
300 | |||
301 | if (debugfs_create_file("info", 0644, junk, NULL, &ocm_debugfs_fops)) { | ||
302 | printk(KERN_ALERT "debugfs ppc4xx ocm: failed to create file\n"); | ||
303 | return -1; | ||
304 | } | ||
305 | |||
306 | return 0; | ||
307 | } | ||
308 | |||
309 | void *ppc4xx_ocm_alloc(phys_addr_t *phys, int size, int align, | ||
310 | int flags, const char *owner) | ||
311 | { | ||
312 | void __iomem *addr = NULL; | ||
313 | unsigned long offset; | ||
314 | struct ocm_info *ocm; | ||
315 | struct ocm_region *ocm_reg; | ||
316 | struct ocm_block *ocm_blk; | ||
317 | int i; | ||
318 | |||
319 | for (i = 0; i < ocm_count; i++) { | ||
320 | ocm = ocm_get_node(i); | ||
321 | |||
322 | if (!ocm || !ocm->ready) | ||
323 | continue; | ||
324 | |||
325 | if (flags == PPC4XX_OCM_NON_CACHED) | ||
326 | ocm_reg = &ocm->nc; | ||
327 | else | ||
328 | ocm_reg = &ocm->c; | ||
329 | |||
330 | if (!ocm_reg->virt) | ||
331 | continue; | ||
332 | |||
333 | if (align < ocm->alignment) | ||
334 | align = ocm->alignment; | ||
335 | |||
336 | offset = rh_alloc_align(ocm_reg->rh, size, align, NULL); | ||
337 | |||
338 | if (IS_ERR_VALUE(offset)) | ||
339 | continue; | ||
340 | |||
341 | ocm_blk = kzalloc(sizeof(struct ocm_block *), GFP_KERNEL); | ||
342 | if (!ocm_blk) { | ||
343 | printk(KERN_ERR "PPC4XX OCM: could not allocate ocm block"); | ||
344 | rh_free(ocm_reg->rh, offset); | ||
345 | break; | ||
346 | } | ||
347 | |||
348 | *phys = ocm_reg->phys + offset; | ||
349 | addr = ocm_reg->virt + offset; | ||
350 | size = ALIGN(size, align); | ||
351 | |||
352 | ocm_blk->addr = addr; | ||
353 | ocm_blk->size = size; | ||
354 | ocm_blk->owner = owner; | ||
355 | list_add_tail(&ocm_blk->list, &ocm_reg->list); | ||
356 | |||
357 | ocm_reg->memfree -= size; | ||
358 | |||
359 | break; | ||
360 | } | ||
361 | |||
362 | return addr; | ||
363 | } | ||
364 | |||
365 | void ppc4xx_ocm_free(const void *addr) | ||
366 | { | ||
367 | int i; | ||
368 | |||
369 | if (!addr) | ||
370 | return; | ||
371 | |||
372 | for (i = 0; i < ocm_count; i++) { | ||
373 | struct ocm_info *ocm = ocm_get_node(i); | ||
374 | |||
375 | if (!ocm || !ocm->ready) | ||
376 | continue; | ||
377 | |||
378 | if (ocm_free_region(&ocm->nc, addr) || | ||
379 | ocm_free_region(&ocm->c, addr)) | ||
380 | return; | ||
381 | } | ||
382 | } | ||
383 | |||
384 | static int __init ppc4xx_ocm_init(void) | ||
385 | { | ||
386 | struct device_node *np; | ||
387 | int count; | ||
388 | |||
389 | count = 0; | ||
390 | for_each_compatible_node(np, NULL, "ibm,ocm") | ||
391 | count++; | ||
392 | |||
393 | if (!count) | ||
394 | return 0; | ||
395 | |||
396 | ocm_nodes = kzalloc((count * sizeof(struct ocm_info)), GFP_KERNEL); | ||
397 | if (!ocm_nodes) { | ||
398 | printk(KERN_ERR "PPC4XX OCM: failed to allocate OCM nodes!\n"); | ||
399 | return -ENOMEM; | ||
400 | } | ||
401 | |||
402 | ocm_count = count; | ||
403 | count = 0; | ||
404 | |||
405 | for_each_compatible_node(np, NULL, "ibm,ocm") { | ||
406 | ocm_init_node(count, np); | ||
407 | count++; | ||
408 | } | ||
409 | |||
410 | ocm_debugfs_init(); | ||
411 | |||
412 | return 0; | ||
413 | } | ||
414 | |||
415 | arch_initcall(ppc4xx_ocm_init); | ||
diff --git a/arch/powerpc/sysdev/xics/ics-rtas.c b/arch/powerpc/sysdev/xics/ics-rtas.c index c782f85cf7e4..936575d99c5c 100644 --- a/arch/powerpc/sysdev/xics/ics-rtas.c +++ b/arch/powerpc/sysdev/xics/ics-rtas.c | |||
@@ -213,7 +213,7 @@ static int ics_rtas_host_match(struct ics *ics, struct device_node *node) | |||
213 | return !of_device_is_compatible(node, "chrp,iic"); | 213 | return !of_device_is_compatible(node, "chrp,iic"); |
214 | } | 214 | } |
215 | 215 | ||
216 | int ics_rtas_init(void) | 216 | __init int ics_rtas_init(void) |
217 | { | 217 | { |
218 | ibm_get_xive = rtas_token("ibm,get-xive"); | 218 | ibm_get_xive = rtas_token("ibm,get-xive"); |
219 | ibm_set_xive = rtas_token("ibm,set-xive"); | 219 | ibm_set_xive = rtas_token("ibm,set-xive"); |
diff --git a/arch/powerpc/xmon/Makefile b/arch/powerpc/xmon/Makefile index b49fdbd15808..1278788d96e3 100644 --- a/arch/powerpc/xmon/Makefile +++ b/arch/powerpc/xmon/Makefile | |||
@@ -4,7 +4,7 @@ subdir-ccflags-$(CONFIG_PPC_WERROR) := -Werror | |||
4 | 4 | ||
5 | GCOV_PROFILE := n | 5 | GCOV_PROFILE := n |
6 | 6 | ||
7 | ccflags-$(CONFIG_PPC64) := -mno-minimal-toc | 7 | ccflags-$(CONFIG_PPC64) := $(NO_MINIMAL_TOC) |
8 | 8 | ||
9 | obj-y += xmon.o nonstdio.o | 9 | obj-y += xmon.o nonstdio.o |
10 | 10 | ||
diff --git a/arch/powerpc/xmon/xmon.c b/arch/powerpc/xmon/xmon.c index 1f8d2f10a432..13f85defabed 100644 --- a/arch/powerpc/xmon/xmon.c +++ b/arch/powerpc/xmon/xmon.c | |||
@@ -43,6 +43,7 @@ | |||
43 | #include <asm/setjmp.h> | 43 | #include <asm/setjmp.h> |
44 | #include <asm/reg.h> | 44 | #include <asm/reg.h> |
45 | #include <asm/debug.h> | 45 | #include <asm/debug.h> |
46 | #include <asm/hw_breakpoint.h> | ||
46 | 47 | ||
47 | #ifdef CONFIG_PPC64 | 48 | #ifdef CONFIG_PPC64 |
48 | #include <asm/hvcall.h> | 49 | #include <asm/hvcall.h> |
@@ -607,7 +608,7 @@ static int xmon_sstep(struct pt_regs *regs) | |||
607 | return 1; | 608 | return 1; |
608 | } | 609 | } |
609 | 610 | ||
610 | static int xmon_dabr_match(struct pt_regs *regs) | 611 | static int xmon_break_match(struct pt_regs *regs) |
611 | { | 612 | { |
612 | if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) != (MSR_IR|MSR_64BIT)) | 613 | if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) != (MSR_IR|MSR_64BIT)) |
613 | return 0; | 614 | return 0; |
@@ -740,8 +741,14 @@ static void insert_bpts(void) | |||
740 | 741 | ||
741 | static void insert_cpu_bpts(void) | 742 | static void insert_cpu_bpts(void) |
742 | { | 743 | { |
743 | if (dabr.enabled) | 744 | struct arch_hw_breakpoint brk; |
744 | set_dabr(dabr.address | (dabr.enabled & 7), DABRX_ALL); | 745 | |
746 | if (dabr.enabled) { | ||
747 | brk.address = dabr.address; | ||
748 | brk.type = (dabr.enabled & HW_BRK_TYPE_DABR) | HW_BRK_TYPE_PRIV_ALL; | ||
749 | brk.len = 8; | ||
750 | set_breakpoint(&brk); | ||
751 | } | ||
745 | if (iabr && cpu_has_feature(CPU_FTR_IABR)) | 752 | if (iabr && cpu_has_feature(CPU_FTR_IABR)) |
746 | mtspr(SPRN_IABR, iabr->address | 753 | mtspr(SPRN_IABR, iabr->address |
747 | | (iabr->enabled & (BP_IABR|BP_IABR_TE))); | 754 | | (iabr->enabled & (BP_IABR|BP_IABR_TE))); |
@@ -769,7 +776,7 @@ static void remove_bpts(void) | |||
769 | 776 | ||
770 | static void remove_cpu_bpts(void) | 777 | static void remove_cpu_bpts(void) |
771 | { | 778 | { |
772 | set_dabr(0, 0); | 779 | hw_breakpoint_disable(); |
773 | if (cpu_has_feature(CPU_FTR_IABR)) | 780 | if (cpu_has_feature(CPU_FTR_IABR)) |
774 | mtspr(SPRN_IABR, 0); | 781 | mtspr(SPRN_IABR, 0); |
775 | } | 782 | } |
@@ -1138,7 +1145,7 @@ bpt_cmds(void) | |||
1138 | printf(badaddr); | 1145 | printf(badaddr); |
1139 | break; | 1146 | break; |
1140 | } | 1147 | } |
1141 | dabr.address &= ~7; | 1148 | dabr.address &= ~HW_BRK_TYPE_DABR; |
1142 | dabr.enabled = mode | BP_DABR; | 1149 | dabr.enabled = mode | BP_DABR; |
1143 | } | 1150 | } |
1144 | break; | 1151 | break; |
@@ -2917,7 +2924,7 @@ static void xmon_init(int enable) | |||
2917 | __debugger_bpt = xmon_bpt; | 2924 | __debugger_bpt = xmon_bpt; |
2918 | __debugger_sstep = xmon_sstep; | 2925 | __debugger_sstep = xmon_sstep; |
2919 | __debugger_iabr_match = xmon_iabr_match; | 2926 | __debugger_iabr_match = xmon_iabr_match; |
2920 | __debugger_dabr_match = xmon_dabr_match; | 2927 | __debugger_break_match = xmon_break_match; |
2921 | __debugger_fault_handler = xmon_fault_handler; | 2928 | __debugger_fault_handler = xmon_fault_handler; |
2922 | } else { | 2929 | } else { |
2923 | __debugger = NULL; | 2930 | __debugger = NULL; |
@@ -2925,7 +2932,7 @@ static void xmon_init(int enable) | |||
2925 | __debugger_bpt = NULL; | 2932 | __debugger_bpt = NULL; |
2926 | __debugger_sstep = NULL; | 2933 | __debugger_sstep = NULL; |
2927 | __debugger_iabr_match = NULL; | 2934 | __debugger_iabr_match = NULL; |
2928 | __debugger_dabr_match = NULL; | 2935 | __debugger_break_match = NULL; |
2929 | __debugger_fault_handler = NULL; | 2936 | __debugger_fault_handler = NULL; |
2930 | } | 2937 | } |
2931 | } | 2938 | } |
diff --git a/crypto/Kconfig b/crypto/Kconfig index 3f37520035dd..0880a14834aa 100644 --- a/crypto/Kconfig +++ b/crypto/Kconfig | |||
@@ -477,6 +477,13 @@ config CRYPTO_SHA1_ARM | |||
477 | SHA-1 secure hash standard (FIPS 180-1/DFIPS 180-2) implemented | 477 | SHA-1 secure hash standard (FIPS 180-1/DFIPS 180-2) implemented |
478 | using optimized ARM assembler. | 478 | using optimized ARM assembler. |
479 | 479 | ||
480 | config CRYPTO_SHA1_PPC | ||
481 | tristate "SHA1 digest algorithm (powerpc)" | ||
482 | depends on PPC | ||
483 | help | ||
484 | This is the powerpc hardware accelerated implementation of the | ||
485 | SHA-1 secure hash standard (FIPS 180-1/DFIPS 180-2). | ||
486 | |||
480 | config CRYPTO_SHA256 | 487 | config CRYPTO_SHA256 |
481 | tristate "SHA224 and SHA256 digest algorithm" | 488 | tristate "SHA224 and SHA256 digest algorithm" |
482 | select CRYPTO_HASH | 489 | select CRYPTO_HASH |
diff --git a/drivers/Makefile b/drivers/Makefile index b359948fc02b..dce39a95fa71 100644 --- a/drivers/Makefile +++ b/drivers/Makefile | |||
@@ -29,7 +29,7 @@ obj-$(CONFIG_PNP) += pnp/ | |||
29 | obj-y += amba/ | 29 | obj-y += amba/ |
30 | # Many drivers will want to use DMA so this has to be made available | 30 | # Many drivers will want to use DMA so this has to be made available |
31 | # really early. | 31 | # really early. |
32 | obj-$(CONFIG_DMA_ENGINE) += dma/ | 32 | obj-$(CONFIG_DMADEVICES) += dma/ |
33 | 33 | ||
34 | obj-$(CONFIG_VIRTIO) += virtio/ | 34 | obj-$(CONFIG_VIRTIO) += virtio/ |
35 | obj-$(CONFIG_XEN) += xen/ | 35 | obj-$(CONFIG_XEN) += xen/ |
diff --git a/drivers/ata/pata_mpc52xx.c b/drivers/ata/pata_mpc52xx.c index 652f57e83484..3a8fb28b71f2 100644 --- a/drivers/ata/pata_mpc52xx.c +++ b/drivers/ata/pata_mpc52xx.c | |||
@@ -26,9 +26,9 @@ | |||
26 | #include <asm/prom.h> | 26 | #include <asm/prom.h> |
27 | #include <asm/mpc52xx.h> | 27 | #include <asm/mpc52xx.h> |
28 | 28 | ||
29 | #include <sysdev/bestcomm/bestcomm.h> | 29 | #include <linux/fsl/bestcomm/bestcomm.h> |
30 | #include <sysdev/bestcomm/bestcomm_priv.h> | 30 | #include <linux/fsl/bestcomm/bestcomm_priv.h> |
31 | #include <sysdev/bestcomm/ata.h> | 31 | #include <linux/fsl/bestcomm/ata.h> |
32 | 32 | ||
33 | #define DRV_NAME "mpc52xx_ata" | 33 | #define DRV_NAME "mpc52xx_ata" |
34 | 34 | ||
diff --git a/drivers/dma/Kconfig b/drivers/dma/Kconfig index d4c12180c654..40179e749f08 100644 --- a/drivers/dma/Kconfig +++ b/drivers/dma/Kconfig | |||
@@ -125,6 +125,8 @@ config MPC512X_DMA | |||
125 | ---help--- | 125 | ---help--- |
126 | Enable support for the Freescale MPC512x built-in DMA engine. | 126 | Enable support for the Freescale MPC512x built-in DMA engine. |
127 | 127 | ||
128 | source "drivers/dma/bestcomm/Kconfig" | ||
129 | |||
128 | config MV_XOR | 130 | config MV_XOR |
129 | bool "Marvell XOR engine support" | 131 | bool "Marvell XOR engine support" |
130 | depends on PLAT_ORION | 132 | depends on PLAT_ORION |
diff --git a/drivers/dma/Makefile b/drivers/dma/Makefile index 7428feaa8705..642d96736cf5 100644 --- a/drivers/dma/Makefile +++ b/drivers/dma/Makefile | |||
@@ -10,6 +10,7 @@ obj-$(CONFIG_INTEL_IOATDMA) += ioat/ | |||
10 | obj-$(CONFIG_INTEL_IOP_ADMA) += iop-adma.o | 10 | obj-$(CONFIG_INTEL_IOP_ADMA) += iop-adma.o |
11 | obj-$(CONFIG_FSL_DMA) += fsldma.o | 11 | obj-$(CONFIG_FSL_DMA) += fsldma.o |
12 | obj-$(CONFIG_MPC512X_DMA) += mpc512x_dma.o | 12 | obj-$(CONFIG_MPC512X_DMA) += mpc512x_dma.o |
13 | obj-$(CONFIG_PPC_BESTCOMM) += bestcomm/ | ||
13 | obj-$(CONFIG_MV_XOR) += mv_xor.o | 14 | obj-$(CONFIG_MV_XOR) += mv_xor.o |
14 | obj-$(CONFIG_DW_DMAC) += dw_dmac.o | 15 | obj-$(CONFIG_DW_DMAC) += dw_dmac.o |
15 | obj-$(CONFIG_AT_HDMAC) += at_hdmac.o | 16 | obj-$(CONFIG_AT_HDMAC) += at_hdmac.o |
diff --git a/arch/powerpc/sysdev/bestcomm/Kconfig b/drivers/dma/bestcomm/Kconfig index 29e427085efb..29e427085efb 100644 --- a/arch/powerpc/sysdev/bestcomm/Kconfig +++ b/drivers/dma/bestcomm/Kconfig | |||
diff --git a/arch/powerpc/sysdev/bestcomm/Makefile b/drivers/dma/bestcomm/Makefile index aed2df2a6580..aed2df2a6580 100644 --- a/arch/powerpc/sysdev/bestcomm/Makefile +++ b/drivers/dma/bestcomm/Makefile | |||
diff --git a/arch/powerpc/sysdev/bestcomm/ata.c b/drivers/dma/bestcomm/ata.c index 901c9f91e5dd..2fd87f83cf90 100644 --- a/arch/powerpc/sysdev/bestcomm/ata.c +++ b/drivers/dma/bestcomm/ata.c | |||
@@ -18,9 +18,9 @@ | |||
18 | #include <linux/types.h> | 18 | #include <linux/types.h> |
19 | #include <asm/io.h> | 19 | #include <asm/io.h> |
20 | 20 | ||
21 | #include "bestcomm.h" | 21 | #include <linux/fsl/bestcomm/bestcomm.h> |
22 | #include "bestcomm_priv.h" | 22 | #include <linux/fsl/bestcomm/bestcomm_priv.h> |
23 | #include "ata.h" | 23 | #include <linux/fsl/bestcomm/ata.h> |
24 | 24 | ||
25 | 25 | ||
26 | /* ======================================================================== */ | 26 | /* ======================================================================== */ |
diff --git a/arch/powerpc/sysdev/bestcomm/bcom_ata_task.c b/drivers/dma/bestcomm/bcom_ata_task.c index cc6049a4e469..cc6049a4e469 100644 --- a/arch/powerpc/sysdev/bestcomm/bcom_ata_task.c +++ b/drivers/dma/bestcomm/bcom_ata_task.c | |||
diff --git a/arch/powerpc/sysdev/bestcomm/bcom_fec_rx_task.c b/drivers/dma/bestcomm/bcom_fec_rx_task.c index a1ad6a02fcef..a1ad6a02fcef 100644 --- a/arch/powerpc/sysdev/bestcomm/bcom_fec_rx_task.c +++ b/drivers/dma/bestcomm/bcom_fec_rx_task.c | |||
diff --git a/arch/powerpc/sysdev/bestcomm/bcom_fec_tx_task.c b/drivers/dma/bestcomm/bcom_fec_tx_task.c index b1c495c3a65a..b1c495c3a65a 100644 --- a/arch/powerpc/sysdev/bestcomm/bcom_fec_tx_task.c +++ b/drivers/dma/bestcomm/bcom_fec_tx_task.c | |||
diff --git a/arch/powerpc/sysdev/bestcomm/bcom_gen_bd_rx_task.c b/drivers/dma/bestcomm/bcom_gen_bd_rx_task.c index efee022b0256..efee022b0256 100644 --- a/arch/powerpc/sysdev/bestcomm/bcom_gen_bd_rx_task.c +++ b/drivers/dma/bestcomm/bcom_gen_bd_rx_task.c | |||
diff --git a/arch/powerpc/sysdev/bestcomm/bcom_gen_bd_tx_task.c b/drivers/dma/bestcomm/bcom_gen_bd_tx_task.c index c605aa42ecbb..c605aa42ecbb 100644 --- a/arch/powerpc/sysdev/bestcomm/bcom_gen_bd_tx_task.c +++ b/drivers/dma/bestcomm/bcom_gen_bd_tx_task.c | |||
diff --git a/arch/powerpc/sysdev/bestcomm/bestcomm.c b/drivers/dma/bestcomm/bestcomm.c index 81c331481336..a8c2e2994d2e 100644 --- a/arch/powerpc/sysdev/bestcomm/bestcomm.c +++ b/drivers/dma/bestcomm/bestcomm.c | |||
@@ -23,9 +23,9 @@ | |||
23 | #include <asm/irq.h> | 23 | #include <asm/irq.h> |
24 | #include <asm/mpc52xx.h> | 24 | #include <asm/mpc52xx.h> |
25 | 25 | ||
26 | #include "sram.h" | 26 | #include <linux/fsl/bestcomm/sram.h> |
27 | #include "bestcomm_priv.h" | 27 | #include <linux/fsl/bestcomm/bestcomm_priv.h> |
28 | #include "bestcomm.h" | 28 | #include "linux/fsl/bestcomm/bestcomm.h" |
29 | 29 | ||
30 | #define DRIVER_NAME "bestcomm-core" | 30 | #define DRIVER_NAME "bestcomm-core" |
31 | 31 | ||
diff --git a/arch/powerpc/sysdev/bestcomm/fec.c b/drivers/dma/bestcomm/fec.c index 957a988d23ea..7f1fb1c999e4 100644 --- a/arch/powerpc/sysdev/bestcomm/fec.c +++ b/drivers/dma/bestcomm/fec.c | |||
@@ -16,9 +16,9 @@ | |||
16 | #include <linux/types.h> | 16 | #include <linux/types.h> |
17 | #include <asm/io.h> | 17 | #include <asm/io.h> |
18 | 18 | ||
19 | #include "bestcomm.h" | 19 | #include <linux/fsl/bestcomm/bestcomm.h> |
20 | #include "bestcomm_priv.h" | 20 | #include <linux/fsl/bestcomm/bestcomm_priv.h> |
21 | #include "fec.h" | 21 | #include <linux/fsl/bestcomm/fec.h> |
22 | 22 | ||
23 | 23 | ||
24 | /* ======================================================================== */ | 24 | /* ======================================================================== */ |
diff --git a/arch/powerpc/sysdev/bestcomm/gen_bd.c b/drivers/dma/bestcomm/gen_bd.c index e0a53e3147b2..1a5b22d88127 100644 --- a/arch/powerpc/sysdev/bestcomm/gen_bd.c +++ b/drivers/dma/bestcomm/gen_bd.c | |||
@@ -21,9 +21,9 @@ | |||
21 | #include <asm/mpc52xx.h> | 21 | #include <asm/mpc52xx.h> |
22 | #include <asm/mpc52xx_psc.h> | 22 | #include <asm/mpc52xx_psc.h> |
23 | 23 | ||
24 | #include "bestcomm.h" | 24 | #include <linux/fsl/bestcomm/bestcomm.h> |
25 | #include "bestcomm_priv.h" | 25 | #include <linux/fsl/bestcomm/bestcomm_priv.h> |
26 | #include "gen_bd.h" | 26 | #include <linux/fsl/bestcomm/gen_bd.h> |
27 | 27 | ||
28 | 28 | ||
29 | /* ======================================================================== */ | 29 | /* ======================================================================== */ |
diff --git a/arch/powerpc/sysdev/bestcomm/sram.c b/drivers/dma/bestcomm/sram.c index b6db23e085fb..5e2ed30ba2c4 100644 --- a/arch/powerpc/sysdev/bestcomm/sram.c +++ b/drivers/dma/bestcomm/sram.c | |||
@@ -23,7 +23,7 @@ | |||
23 | #include <asm/io.h> | 23 | #include <asm/io.h> |
24 | #include <asm/mmu.h> | 24 | #include <asm/mmu.h> |
25 | 25 | ||
26 | #include "sram.h" | 26 | #include <linux/fsl/bestcomm/sram.h> |
27 | 27 | ||
28 | 28 | ||
29 | /* Struct keeping our 'state' */ | 29 | /* Struct keeping our 'state' */ |
diff --git a/drivers/macintosh/windfarm_pm112.c b/drivers/macintosh/windfarm_pm112.c index 35ef6e2582b8..3024685e4cca 100644 --- a/drivers/macintosh/windfarm_pm112.c +++ b/drivers/macintosh/windfarm_pm112.c | |||
@@ -681,7 +681,7 @@ static int __init wf_pm112_init(void) | |||
681 | 681 | ||
682 | /* Count the number of CPU cores */ | 682 | /* Count the number of CPU cores */ |
683 | nr_cores = 0; | 683 | nr_cores = 0; |
684 | for (cpu = NULL; (cpu = of_find_node_by_type(cpu, "cpu")) != NULL; ) | 684 | for_each_node_by_type(cpu, "cpu") |
685 | ++nr_cores; | 685 | ++nr_cores; |
686 | 686 | ||
687 | printk(KERN_INFO "windfarm: initializing for dual-core desktop G5\n"); | 687 | printk(KERN_INFO "windfarm: initializing for dual-core desktop G5\n"); |
diff --git a/drivers/macintosh/windfarm_pm72.c b/drivers/macintosh/windfarm_pm72.c index 6e5585357cd3..2f506b9d5a52 100644 --- a/drivers/macintosh/windfarm_pm72.c +++ b/drivers/macintosh/windfarm_pm72.c | |||
@@ -804,7 +804,7 @@ static int __init wf_pm72_init(void) | |||
804 | 804 | ||
805 | /* Count the number of CPU cores */ | 805 | /* Count the number of CPU cores */ |
806 | nr_chips = 0; | 806 | nr_chips = 0; |
807 | for (cpu = NULL; (cpu = of_find_node_by_type(cpu, "cpu")) != NULL; ) | 807 | for_each_node_by_type(cpu, "cpu") |
808 | ++nr_chips; | 808 | ++nr_chips; |
809 | if (nr_chips > NR_CHIPS) | 809 | if (nr_chips > NR_CHIPS) |
810 | nr_chips = NR_CHIPS; | 810 | nr_chips = NR_CHIPS; |
diff --git a/drivers/macintosh/windfarm_rm31.c b/drivers/macintosh/windfarm_rm31.c index 844003fb4ef0..0b9a79b2f48a 100644 --- a/drivers/macintosh/windfarm_rm31.c +++ b/drivers/macintosh/windfarm_rm31.c | |||
@@ -696,7 +696,7 @@ static int __init wf_rm31_init(void) | |||
696 | 696 | ||
697 | /* Count the number of CPU cores */ | 697 | /* Count the number of CPU cores */ |
698 | nr_chips = 0; | 698 | nr_chips = 0; |
699 | for (cpu = NULL; (cpu = of_find_node_by_type(cpu, "cpu")) != NULL; ) | 699 | for_each_node_by_type(cpu, "cpu") |
700 | ++nr_chips; | 700 | ++nr_chips; |
701 | if (nr_chips > NR_CHIPS) | 701 | if (nr_chips > NR_CHIPS) |
702 | nr_chips = NR_CHIPS; | 702 | nr_chips = NR_CHIPS; |
diff --git a/drivers/net/ethernet/freescale/fec_mpc52xx.c b/drivers/net/ethernet/freescale/fec_mpc52xx.c index 7f91b0c5c264..77943a6a1b8c 100644 --- a/drivers/net/ethernet/freescale/fec_mpc52xx.c +++ b/drivers/net/ethernet/freescale/fec_mpc52xx.c | |||
@@ -41,8 +41,8 @@ | |||
41 | #include <asm/delay.h> | 41 | #include <asm/delay.h> |
42 | #include <asm/mpc52xx.h> | 42 | #include <asm/mpc52xx.h> |
43 | 43 | ||
44 | #include <sysdev/bestcomm/bestcomm.h> | 44 | #include <linux/fsl/bestcomm/bestcomm.h> |
45 | #include <sysdev/bestcomm/fec.h> | 45 | #include <linux/fsl/bestcomm/fec.h> |
46 | 46 | ||
47 | #include "fec_mpc52xx.h" | 47 | #include "fec_mpc52xx.h" |
48 | 48 | ||
diff --git a/drivers/video/fsl-diu-fb.c b/drivers/video/fsl-diu-fb.c index 19cfd7a92563..41fbd9453c5f 100644 --- a/drivers/video/fsl-diu-fb.c +++ b/drivers/video/fsl-diu-fb.c | |||
@@ -944,7 +944,7 @@ static u32 fsl_diu_get_pixel_format(unsigned int bits_per_pixel) | |||
944 | #define PF_COMP_0_MASK 0x0000000F | 944 | #define PF_COMP_0_MASK 0x0000000F |
945 | #define PF_COMP_0_SHIFT 0 | 945 | #define PF_COMP_0_SHIFT 0 |
946 | 946 | ||
947 | #define MAKE_PF(alpha, red, blue, green, size, c0, c1, c2, c3) \ | 947 | #define MAKE_PF(alpha, red, green, blue, size, c0, c1, c2, c3) \ |
948 | cpu_to_le32(PF_BYTE_F | (alpha << PF_ALPHA_C_SHIFT) | \ | 948 | cpu_to_le32(PF_BYTE_F | (alpha << PF_ALPHA_C_SHIFT) | \ |
949 | (blue << PF_BLUE_C_SHIFT) | (green << PF_GREEN_C_SHIFT) | \ | 949 | (blue << PF_BLUE_C_SHIFT) | (green << PF_GREEN_C_SHIFT) | \ |
950 | (red << PF_RED_C_SHIFT) | (c3 << PF_COMP_3_SHIFT) | \ | 950 | (red << PF_RED_C_SHIFT) | (c3 << PF_COMP_3_SHIFT) | \ |
@@ -954,10 +954,10 @@ static u32 fsl_diu_get_pixel_format(unsigned int bits_per_pixel) | |||
954 | switch (bits_per_pixel) { | 954 | switch (bits_per_pixel) { |
955 | case 32: | 955 | case 32: |
956 | /* 0x88883316 */ | 956 | /* 0x88883316 */ |
957 | return MAKE_PF(3, 2, 0, 1, 3, 8, 8, 8, 8); | 957 | return MAKE_PF(3, 2, 1, 0, 3, 8, 8, 8, 8); |
958 | case 24: | 958 | case 24: |
959 | /* 0x88082219 */ | 959 | /* 0x88082219 */ |
960 | return MAKE_PF(4, 0, 1, 2, 2, 0, 8, 8, 8); | 960 | return MAKE_PF(4, 0, 1, 2, 2, 8, 8, 8, 0); |
961 | case 16: | 961 | case 16: |
962 | /* 0x65053118 */ | 962 | /* 0x65053118 */ |
963 | return MAKE_PF(4, 2, 1, 0, 1, 5, 6, 5, 0); | 963 | return MAKE_PF(4, 2, 1, 0, 1, 5, 6, 5, 0); |
@@ -1232,6 +1232,16 @@ static int fsl_diu_ioctl(struct fb_info *info, unsigned int cmd, | |||
1232 | return 0; | 1232 | return 0; |
1233 | } | 1233 | } |
1234 | 1234 | ||
1235 | static inline void fsl_diu_enable_interrupts(struct fsl_diu_data *data) | ||
1236 | { | ||
1237 | u32 int_mask = INT_UNDRUN; /* enable underrun detection */ | ||
1238 | |||
1239 | if (IS_ENABLED(CONFIG_NOT_COHERENT_CACHE)) | ||
1240 | int_mask |= INT_VSYNC; /* enable vertical sync */ | ||
1241 | |||
1242 | clrbits32(&data->diu_reg->int_mask, int_mask); | ||
1243 | } | ||
1244 | |||
1235 | /* turn on fb if count == 1 | 1245 | /* turn on fb if count == 1 |
1236 | */ | 1246 | */ |
1237 | static int fsl_diu_open(struct fb_info *info, int user) | 1247 | static int fsl_diu_open(struct fb_info *info, int user) |
@@ -1251,19 +1261,7 @@ static int fsl_diu_open(struct fb_info *info, int user) | |||
1251 | if (res < 0) | 1261 | if (res < 0) |
1252 | mfbi->count--; | 1262 | mfbi->count--; |
1253 | else { | 1263 | else { |
1254 | struct fsl_diu_data *data = mfbi->parent; | 1264 | fsl_diu_enable_interrupts(mfbi->parent); |
1255 | |||
1256 | #ifdef CONFIG_NOT_COHERENT_CACHE | ||
1257 | /* | ||
1258 | * Enable underrun detection and vertical sync | ||
1259 | * interrupts. | ||
1260 | */ | ||
1261 | clrbits32(&data->diu_reg->int_mask, | ||
1262 | INT_UNDRUN | INT_VSYNC); | ||
1263 | #else | ||
1264 | /* Enable underrun detection */ | ||
1265 | clrbits32(&data->diu_reg->int_mask, INT_UNDRUN); | ||
1266 | #endif | ||
1267 | fsl_diu_enable_panel(info); | 1265 | fsl_diu_enable_panel(info); |
1268 | } | 1266 | } |
1269 | } | 1267 | } |
@@ -1283,9 +1281,18 @@ static int fsl_diu_release(struct fb_info *info, int user) | |||
1283 | mfbi->count--; | 1281 | mfbi->count--; |
1284 | if (mfbi->count == 0) { | 1282 | if (mfbi->count == 0) { |
1285 | struct fsl_diu_data *data = mfbi->parent; | 1283 | struct fsl_diu_data *data = mfbi->parent; |
1284 | bool disable = true; | ||
1285 | int i; | ||
1286 | 1286 | ||
1287 | /* Disable interrupts */ | 1287 | /* Disable interrupts only if all AOIs are closed */ |
1288 | out_be32(&data->diu_reg->int_mask, 0xffffffff); | 1288 | for (i = 0; i < NUM_AOIS; i++) { |
1289 | struct mfb_info *mi = data->fsl_diu_info[i].par; | ||
1290 | |||
1291 | if (mi->count) | ||
1292 | disable = false; | ||
1293 | } | ||
1294 | if (disable) | ||
1295 | out_be32(&data->diu_reg->int_mask, 0xffffffff); | ||
1289 | fsl_diu_disable_panel(info); | 1296 | fsl_diu_disable_panel(info); |
1290 | } | 1297 | } |
1291 | 1298 | ||
@@ -1614,14 +1621,6 @@ static int fsl_diu_probe(struct platform_device *pdev) | |||
1614 | out_be32(&data->diu_reg->desc[1], data->dummy_ad.paddr); | 1621 | out_be32(&data->diu_reg->desc[1], data->dummy_ad.paddr); |
1615 | out_be32(&data->diu_reg->desc[2], data->dummy_ad.paddr); | 1622 | out_be32(&data->diu_reg->desc[2], data->dummy_ad.paddr); |
1616 | 1623 | ||
1617 | for (i = 0; i < NUM_AOIS; i++) { | ||
1618 | ret = install_fb(&data->fsl_diu_info[i]); | ||
1619 | if (ret) { | ||
1620 | dev_err(&pdev->dev, "could not register fb %d\n", i); | ||
1621 | goto error; | ||
1622 | } | ||
1623 | } | ||
1624 | |||
1625 | /* | 1624 | /* |
1626 | * Older versions of U-Boot leave interrupts enabled, so disable | 1625 | * Older versions of U-Boot leave interrupts enabled, so disable |
1627 | * all of them and clear the status register. | 1626 | * all of them and clear the status register. |
@@ -1630,12 +1629,21 @@ static int fsl_diu_probe(struct platform_device *pdev) | |||
1630 | in_be32(&data->diu_reg->int_status); | 1629 | in_be32(&data->diu_reg->int_status); |
1631 | 1630 | ||
1632 | ret = request_irq(data->irq, fsl_diu_isr, 0, "fsl-diu-fb", | 1631 | ret = request_irq(data->irq, fsl_diu_isr, 0, "fsl-diu-fb", |
1633 | &data->diu_reg); | 1632 | data->diu_reg); |
1634 | if (ret) { | 1633 | if (ret) { |
1635 | dev_err(&pdev->dev, "could not claim irq\n"); | 1634 | dev_err(&pdev->dev, "could not claim irq\n"); |
1636 | goto error; | 1635 | goto error; |
1637 | } | 1636 | } |
1638 | 1637 | ||
1638 | for (i = 0; i < NUM_AOIS; i++) { | ||
1639 | ret = install_fb(&data->fsl_diu_info[i]); | ||
1640 | if (ret) { | ||
1641 | dev_err(&pdev->dev, "could not register fb %d\n", i); | ||
1642 | free_irq(data->irq, data->diu_reg); | ||
1643 | goto error; | ||
1644 | } | ||
1645 | } | ||
1646 | |||
1639 | sysfs_attr_init(&data->dev_attr.attr); | 1647 | sysfs_attr_init(&data->dev_attr.attr); |
1640 | data->dev_attr.attr.name = "monitor"; | 1648 | data->dev_attr.attr.name = "monitor"; |
1641 | data->dev_attr.attr.mode = S_IRUGO|S_IWUSR; | 1649 | data->dev_attr.attr.mode = S_IRUGO|S_IWUSR; |
@@ -1667,7 +1675,7 @@ static int fsl_diu_remove(struct platform_device *pdev) | |||
1667 | data = dev_get_drvdata(&pdev->dev); | 1675 | data = dev_get_drvdata(&pdev->dev); |
1668 | disable_lcdc(&data->fsl_diu_info[0]); | 1676 | disable_lcdc(&data->fsl_diu_info[0]); |
1669 | 1677 | ||
1670 | free_irq(data->irq, &data->diu_reg); | 1678 | free_irq(data->irq, data->diu_reg); |
1671 | 1679 | ||
1672 | for (i = 0; i < NUM_AOIS; i++) | 1680 | for (i = 0; i < NUM_AOIS; i++) |
1673 | uninstall_fb(&data->fsl_diu_info[i]); | 1681 | uninstall_fb(&data->fsl_diu_info[i]); |
diff --git a/arch/powerpc/sysdev/bestcomm/ata.h b/include/linux/fsl/bestcomm/ata.h index 0b2371811334..0b2371811334 100644 --- a/arch/powerpc/sysdev/bestcomm/ata.h +++ b/include/linux/fsl/bestcomm/ata.h | |||
diff --git a/arch/powerpc/sysdev/bestcomm/bestcomm.h b/include/linux/fsl/bestcomm/bestcomm.h index a0e2e6b19b57..a0e2e6b19b57 100644 --- a/arch/powerpc/sysdev/bestcomm/bestcomm.h +++ b/include/linux/fsl/bestcomm/bestcomm.h | |||
diff --git a/arch/powerpc/sysdev/bestcomm/bestcomm_priv.h b/include/linux/fsl/bestcomm/bestcomm_priv.h index 3b52f3ffbdf8..3b52f3ffbdf8 100644 --- a/arch/powerpc/sysdev/bestcomm/bestcomm_priv.h +++ b/include/linux/fsl/bestcomm/bestcomm_priv.h | |||
diff --git a/arch/powerpc/sysdev/bestcomm/fec.h b/include/linux/fsl/bestcomm/fec.h index ee565d94d503..ee565d94d503 100644 --- a/arch/powerpc/sysdev/bestcomm/fec.h +++ b/include/linux/fsl/bestcomm/fec.h | |||
diff --git a/arch/powerpc/sysdev/bestcomm/gen_bd.h b/include/linux/fsl/bestcomm/gen_bd.h index de47260e69da..de47260e69da 100644 --- a/arch/powerpc/sysdev/bestcomm/gen_bd.h +++ b/include/linux/fsl/bestcomm/gen_bd.h | |||
diff --git a/arch/powerpc/sysdev/bestcomm/sram.h b/include/linux/fsl/bestcomm/sram.h index b6d668963cce..b6d668963cce 100644 --- a/arch/powerpc/sysdev/bestcomm/sram.h +++ b/include/linux/fsl/bestcomm/sram.h | |||
diff --git a/sound/soc/fsl/mpc5200_dma.c b/sound/soc/fsl/mpc5200_dma.c index 9997c039bb24..2a847ca494b5 100644 --- a/sound/soc/fsl/mpc5200_dma.c +++ b/sound/soc/fsl/mpc5200_dma.c | |||
@@ -14,8 +14,8 @@ | |||
14 | 14 | ||
15 | #include <sound/soc.h> | 15 | #include <sound/soc.h> |
16 | 16 | ||
17 | #include <sysdev/bestcomm/bestcomm.h> | 17 | #include <linux/fsl/bestcomm/bestcomm.h> |
18 | #include <sysdev/bestcomm/gen_bd.h> | 18 | #include <linux/fsl/bestcomm/gen_bd.h> |
19 | #include <asm/mpc52xx_psc.h> | 19 | #include <asm/mpc52xx_psc.h> |
20 | 20 | ||
21 | #include "mpc5200_dma.h" | 21 | #include "mpc5200_dma.h" |