diff options
Diffstat (limited to 'arch/arm')
| -rw-r--r-- | arch/arm/Kconfig | 10 | ||||
| -rw-r--r-- | arch/arm/boot/dts/Makefile | 1 | ||||
| -rw-r--r-- | arch/arm/boot/dts/at91sam9260.dtsi | 18 | ||||
| -rw-r--r-- | arch/arm/boot/dts/at91sam9263.dtsi | 36 | ||||
| -rw-r--r-- | arch/arm/boot/dts/at91sam9g45.dtsi | 36 | ||||
| -rw-r--r-- | arch/arm/boot/dts/at91sam9n12.dtsi | 26 | ||||
| -rw-r--r-- | arch/arm/boot/dts/at91sam9x5.dtsi | 32 | ||||
| -rw-r--r-- | arch/arm/include/asm/assembler.h | 10 | ||||
| -rw-r--r-- | arch/arm/include/asm/cti.h | 10 | ||||
| -rw-r--r-- | arch/arm/include/asm/hardware/coresight.h | 6 | ||||
| -rw-r--r-- | arch/arm/include/asm/hw_breakpoint.h | 3 | ||||
| -rw-r--r-- | arch/arm/include/asm/opcodes-sec.h | 24 | ||||
| -rw-r--r-- | arch/arm/include/asm/opcodes.h | 1 | ||||
| -rw-r--r-- | arch/arm/include/asm/psci.h | 36 | ||||
| -rw-r--r-- | arch/arm/include/asm/virt.h | 4 | ||||
| -rw-r--r-- | arch/arm/kernel/Makefile | 1 | ||||
| -rw-r--r-- | arch/arm/kernel/hw_breakpoint.c | 61 | ||||
| -rw-r--r-- | arch/arm/kernel/psci.c | 211 | ||||
| -rw-r--r-- | arch/arm/mach-pxa/include/mach/mfp-pxa27x.h | 3 | ||||
| -rw-r--r-- | arch/arm/mach-pxa/pxa27x.c | 4 | ||||
| -rw-r--r-- | arch/arm/mm/Kconfig | 10 |
21 files changed, 500 insertions, 43 deletions
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index e0627cdbcda5..2daf6c06beb9 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
| @@ -1620,6 +1620,16 @@ config HOTPLUG_CPU | |||
| 1620 | Say Y here to experiment with turning CPUs off and on. CPUs | 1620 | Say Y here to experiment with turning CPUs off and on. CPUs |
| 1621 | can be controlled through /sys/devices/system/cpu. | 1621 | can be controlled through /sys/devices/system/cpu. |
| 1622 | 1622 | ||
| 1623 | config ARM_PSCI | ||
| 1624 | bool "Support for the ARM Power State Coordination Interface (PSCI)" | ||
| 1625 | depends on CPU_V7 | ||
| 1626 | help | ||
| 1627 | Say Y here if you want Linux to communicate with system firmware | ||
| 1628 | implementing the PSCI specification for CPU-centric power | ||
| 1629 | management operations described in ARM document number ARM DEN | ||
| 1630 | 0022A ("Power State Coordination Interface System Software on | ||
| 1631 | ARM processors"). | ||
| 1632 | |||
| 1623 | config LOCAL_TIMERS | 1633 | config LOCAL_TIMERS |
| 1624 | bool "Use local timer interrupts" | 1634 | bool "Use local timer interrupts" |
| 1625 | depends on SMP | 1635 | depends on SMP |
diff --git a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile index e44da40d984f..5ebb44fe826a 100644 --- a/arch/arm/boot/dts/Makefile +++ b/arch/arm/boot/dts/Makefile | |||
| @@ -155,6 +155,7 @@ dtb-$(CONFIG_ARCH_VT8500) += vt8500-bv07.dtb \ | |||
| 155 | dtb-$(CONFIG_ARCH_ZYNQ) += zynq-zc702.dtb | 155 | dtb-$(CONFIG_ARCH_ZYNQ) += zynq-zc702.dtb |
| 156 | 156 | ||
| 157 | targets += dtbs | 157 | targets += dtbs |
| 158 | targets += $(dtb-y) | ||
| 158 | endif | 159 | endif |
| 159 | 160 | ||
| 160 | # *.dtb used to be generated in the directory above. Clean out the | 161 | # *.dtb used to be generated in the directory above. Clean out the |
diff --git a/arch/arm/boot/dts/at91sam9260.dtsi b/arch/arm/boot/dts/at91sam9260.dtsi index 68bccf41a2c6..cb7bcc51608d 100644 --- a/arch/arm/boot/dts/at91sam9260.dtsi +++ b/arch/arm/boot/dts/at91sam9260.dtsi | |||
| @@ -306,6 +306,22 @@ | |||
| 306 | }; | 306 | }; |
| 307 | }; | 307 | }; |
| 308 | 308 | ||
| 309 | ssc0 { | ||
| 310 | pinctrl_ssc0_tx: ssc0_tx-0 { | ||
| 311 | atmel,pins = | ||
| 312 | <1 16 0x1 0x0 /* PB16 periph A */ | ||
| 313 | 1 17 0x1 0x0 /* PB17 periph A */ | ||
| 314 | 1 18 0x1 0x0>; /* PB18 periph A */ | ||
| 315 | }; | ||
| 316 | |||
| 317 | pinctrl_ssc0_rx: ssc0_rx-0 { | ||
| 318 | atmel,pins = | ||
| 319 | <1 19 0x1 0x0 /* PB19 periph A */ | ||
| 320 | 1 20 0x1 0x0 /* PB20 periph A */ | ||
| 321 | 1 21 0x1 0x0>; /* PB21 periph A */ | ||
| 322 | }; | ||
| 323 | }; | ||
| 324 | |||
| 309 | pioA: gpio@fffff400 { | 325 | pioA: gpio@fffff400 { |
| 310 | compatible = "atmel,at91rm9200-gpio"; | 326 | compatible = "atmel,at91rm9200-gpio"; |
| 311 | reg = <0xfffff400 0x200>; | 327 | reg = <0xfffff400 0x200>; |
| @@ -450,6 +466,8 @@ | |||
| 450 | compatible = "atmel,at91rm9200-ssc"; | 466 | compatible = "atmel,at91rm9200-ssc"; |
| 451 | reg = <0xfffbc000 0x4000>; | 467 | reg = <0xfffbc000 0x4000>; |
| 452 | interrupts = <14 4 5>; | 468 | interrupts = <14 4 5>; |
| 469 | pinctrl-names = "default"; | ||
| 470 | pinctrl-0 = <&pinctrl_ssc0_tx &pinctrl_ssc0_rx>; | ||
| 453 | status = "disabled"; | 471 | status = "disabled"; |
| 454 | }; | 472 | }; |
| 455 | 473 | ||
diff --git a/arch/arm/boot/dts/at91sam9263.dtsi b/arch/arm/boot/dts/at91sam9263.dtsi index 32ec62cf5385..271d4de026e9 100644 --- a/arch/arm/boot/dts/at91sam9263.dtsi +++ b/arch/arm/boot/dts/at91sam9263.dtsi | |||
| @@ -271,6 +271,38 @@ | |||
| 271 | }; | 271 | }; |
| 272 | }; | 272 | }; |
| 273 | 273 | ||
| 274 | ssc0 { | ||
| 275 | pinctrl_ssc0_tx: ssc0_tx-0 { | ||
| 276 | atmel,pins = | ||
| 277 | <1 0 0x2 0x0 /* PB0 periph B */ | ||
| 278 | 1 1 0x2 0x0 /* PB1 periph B */ | ||
| 279 | 1 2 0x2 0x0>; /* PB2 periph B */ | ||
| 280 | }; | ||
| 281 | |||
| 282 | pinctrl_ssc0_rx: ssc0_rx-0 { | ||
| 283 | atmel,pins = | ||
| 284 | <1 3 0x2 0x0 /* PB3 periph B */ | ||
| 285 | 1 4 0x2 0x0 /* PB4 periph B */ | ||
| 286 | 1 5 0x2 0x0>; /* PB5 periph B */ | ||
| 287 | }; | ||
| 288 | }; | ||
| 289 | |||
| 290 | ssc1 { | ||
| 291 | pinctrl_ssc1_tx: ssc1_tx-0 { | ||
| 292 | atmel,pins = | ||
| 293 | <1 6 0x1 0x0 /* PB6 periph A */ | ||
| 294 | 1 7 0x1 0x0 /* PB7 periph A */ | ||
| 295 | 1 8 0x1 0x0>; /* PB8 periph A */ | ||
| 296 | }; | ||
| 297 | |||
| 298 | pinctrl_ssc1_rx: ssc1_rx-0 { | ||
| 299 | atmel,pins = | ||
| 300 | <1 9 0x1 0x0 /* PB9 periph A */ | ||
| 301 | 1 10 0x1 0x0 /* PB10 periph A */ | ||
| 302 | 1 11 0x1 0x0>; /* PB11 periph A */ | ||
| 303 | }; | ||
| 304 | }; | ||
| 305 | |||
| 274 | pioA: gpio@fffff200 { | 306 | pioA: gpio@fffff200 { |
| 275 | compatible = "atmel,at91rm9200-gpio"; | 307 | compatible = "atmel,at91rm9200-gpio"; |
| 276 | reg = <0xfffff200 0x200>; | 308 | reg = <0xfffff200 0x200>; |
| @@ -368,6 +400,8 @@ | |||
| 368 | compatible = "atmel,at91rm9200-ssc"; | 400 | compatible = "atmel,at91rm9200-ssc"; |
| 369 | reg = <0xfff98000 0x4000>; | 401 | reg = <0xfff98000 0x4000>; |
| 370 | interrupts = <16 4 5>; | 402 | interrupts = <16 4 5>; |
| 403 | pinctrl-names = "default"; | ||
| 404 | pinctrl-0 = <&pinctrl_ssc0_tx &pinctrl_ssc0_rx>; | ||
| 371 | status = "disabled"; | 405 | status = "disabled"; |
| 372 | }; | 406 | }; |
| 373 | 407 | ||
| @@ -375,6 +409,8 @@ | |||
| 375 | compatible = "atmel,at91rm9200-ssc"; | 409 | compatible = "atmel,at91rm9200-ssc"; |
| 376 | reg = <0xfff9c000 0x4000>; | 410 | reg = <0xfff9c000 0x4000>; |
| 377 | interrupts = <17 4 5>; | 411 | interrupts = <17 4 5>; |
| 412 | pinctrl-names = "default"; | ||
| 413 | pinctrl-0 = <&pinctrl_ssc1_tx &pinctrl_ssc1_rx>; | ||
| 378 | status = "disabled"; | 414 | status = "disabled"; |
| 379 | }; | 415 | }; |
| 380 | 416 | ||
diff --git a/arch/arm/boot/dts/at91sam9g45.dtsi b/arch/arm/boot/dts/at91sam9g45.dtsi index 231858ffd850..6b1d4cab24c2 100644 --- a/arch/arm/boot/dts/at91sam9g45.dtsi +++ b/arch/arm/boot/dts/at91sam9g45.dtsi | |||
| @@ -290,6 +290,38 @@ | |||
| 290 | }; | 290 | }; |
| 291 | }; | 291 | }; |
| 292 | 292 | ||
| 293 | ssc0 { | ||
| 294 | pinctrl_ssc0_tx: ssc0_tx-0 { | ||
| 295 | atmel,pins = | ||
| 296 | <3 0 0x1 0x0 /* PD0 periph A */ | ||
| 297 | 3 1 0x1 0x0 /* PD1 periph A */ | ||
| 298 | 3 2 0x1 0x0>; /* PD2 periph A */ | ||
| 299 | }; | ||
| 300 | |||
| 301 | pinctrl_ssc0_rx: ssc0_rx-0 { | ||
| 302 | atmel,pins = | ||
| 303 | <3 3 0x1 0x0 /* PD3 periph A */ | ||
| 304 | 3 4 0x1 0x0 /* PD4 periph A */ | ||
| 305 | 3 5 0x1 0x0>; /* PD5 periph A */ | ||
| 306 | }; | ||
| 307 | }; | ||
| 308 | |||
| 309 | ssc1 { | ||
| 310 | pinctrl_ssc1_tx: ssc1_tx-0 { | ||
| 311 | atmel,pins = | ||
| 312 | <3 10 0x1 0x0 /* PD10 periph A */ | ||
| 313 | 3 11 0x1 0x0 /* PD11 periph A */ | ||
| 314 | 3 12 0x1 0x0>; /* PD12 periph A */ | ||
| 315 | }; | ||
| 316 | |||
| 317 | pinctrl_ssc1_rx: ssc1_rx-0 { | ||
| 318 | atmel,pins = | ||
| 319 | <3 13 0x1 0x0 /* PD13 periph A */ | ||
| 320 | 3 14 0x1 0x0 /* PD14 periph A */ | ||
| 321 | 3 15 0x1 0x0>; /* PD15 periph A */ | ||
| 322 | }; | ||
| 323 | }; | ||
| 324 | |||
| 293 | pioA: gpio@fffff200 { | 325 | pioA: gpio@fffff200 { |
| 294 | compatible = "atmel,at91rm9200-gpio"; | 326 | compatible = "atmel,at91rm9200-gpio"; |
| 295 | reg = <0xfffff200 0x200>; | 327 | reg = <0xfffff200 0x200>; |
| @@ -425,6 +457,8 @@ | |||
| 425 | compatible = "atmel,at91sam9g45-ssc"; | 457 | compatible = "atmel,at91sam9g45-ssc"; |
| 426 | reg = <0xfff9c000 0x4000>; | 458 | reg = <0xfff9c000 0x4000>; |
| 427 | interrupts = <16 4 5>; | 459 | interrupts = <16 4 5>; |
| 460 | pinctrl-names = "default"; | ||
| 461 | pinctrl-0 = <&pinctrl_ssc0_tx &pinctrl_ssc0_rx>; | ||
| 428 | status = "disabled"; | 462 | status = "disabled"; |
| 429 | }; | 463 | }; |
| 430 | 464 | ||
| @@ -432,6 +466,8 @@ | |||
| 432 | compatible = "atmel,at91sam9g45-ssc"; | 466 | compatible = "atmel,at91sam9g45-ssc"; |
| 433 | reg = <0xfffa0000 0x4000>; | 467 | reg = <0xfffa0000 0x4000>; |
| 434 | interrupts = <17 4 5>; | 468 | interrupts = <17 4 5>; |
| 469 | pinctrl-names = "default"; | ||
| 470 | pinctrl-0 = <&pinctrl_ssc1_tx &pinctrl_ssc1_rx>; | ||
| 435 | status = "disabled"; | 471 | status = "disabled"; |
| 436 | }; | 472 | }; |
| 437 | 473 | ||
diff --git a/arch/arm/boot/dts/at91sam9n12.dtsi b/arch/arm/boot/dts/at91sam9n12.dtsi index e9efb34f4379..80e29c605d4e 100644 --- a/arch/arm/boot/dts/at91sam9n12.dtsi +++ b/arch/arm/boot/dts/at91sam9n12.dtsi | |||
| @@ -28,6 +28,7 @@ | |||
| 28 | tcb1 = &tcb1; | 28 | tcb1 = &tcb1; |
| 29 | i2c0 = &i2c0; | 29 | i2c0 = &i2c0; |
| 30 | i2c1 = &i2c1; | 30 | i2c1 = &i2c1; |
| 31 | ssc0 = &ssc0; | ||
| 31 | }; | 32 | }; |
| 32 | cpus { | 33 | cpus { |
| 33 | cpu@0 { | 34 | cpu@0 { |
| @@ -244,6 +245,22 @@ | |||
| 244 | }; | 245 | }; |
| 245 | }; | 246 | }; |
| 246 | 247 | ||
| 248 | ssc0 { | ||
| 249 | pinctrl_ssc0_tx: ssc0_tx-0 { | ||
| 250 | atmel,pins = | ||
| 251 | <0 24 0x2 0x0 /* PA24 periph B */ | ||
| 252 | 0 25 0x2 0x0 /* PA25 periph B */ | ||
| 253 | 0 26 0x2 0x0>; /* PA26 periph B */ | ||
| 254 | }; | ||
| 255 | |||
| 256 | pinctrl_ssc0_rx: ssc0_rx-0 { | ||
| 257 | atmel,pins = | ||
| 258 | <0 27 0x2 0x0 /* PA27 periph B */ | ||
| 259 | 0 28 0x2 0x0 /* PA28 periph B */ | ||
| 260 | 0 29 0x2 0x0>; /* PA29 periph B */ | ||
| 261 | }; | ||
| 262 | }; | ||
| 263 | |||
| 247 | pioA: gpio@fffff400 { | 264 | pioA: gpio@fffff400 { |
| 248 | compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio"; | 265 | compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio"; |
| 249 | reg = <0xfffff400 0x200>; | 266 | reg = <0xfffff400 0x200>; |
| @@ -294,6 +311,15 @@ | |||
| 294 | status = "disabled"; | 311 | status = "disabled"; |
| 295 | }; | 312 | }; |
| 296 | 313 | ||
| 314 | ssc0: ssc@f0010000 { | ||
| 315 | compatible = "atmel,at91sam9g45-ssc"; | ||
| 316 | reg = <0xf0010000 0x4000>; | ||
| 317 | interrupts = <28 4 5>; | ||
| 318 | pinctrl-names = "default"; | ||
| 319 | pinctrl-0 = <&pinctrl_ssc0_tx &pinctrl_ssc0_rx>; | ||
| 320 | status = "disabled"; | ||
| 321 | }; | ||
| 322 | |||
| 297 | usart0: serial@f801c000 { | 323 | usart0: serial@f801c000 { |
| 298 | compatible = "atmel,at91sam9260-usart"; | 324 | compatible = "atmel,at91sam9260-usart"; |
| 299 | reg = <0xf801c000 0x4000>; | 325 | reg = <0xf801c000 0x4000>; |
diff --git a/arch/arm/boot/dts/at91sam9x5.dtsi b/arch/arm/boot/dts/at91sam9x5.dtsi index 40ac3a4eb1ab..3a47cf952146 100644 --- a/arch/arm/boot/dts/at91sam9x5.dtsi +++ b/arch/arm/boot/dts/at91sam9x5.dtsi | |||
| @@ -88,13 +88,6 @@ | |||
| 88 | interrupts = <1 4 7>; | 88 | interrupts = <1 4 7>; |
| 89 | }; | 89 | }; |
| 90 | 90 | ||
| 91 | ssc0: ssc@f0010000 { | ||
| 92 | compatible = "atmel,at91sam9g45-ssc"; | ||
| 93 | reg = <0xf0010000 0x4000>; | ||
| 94 | interrupts = <28 4 5>; | ||
| 95 | status = "disabled"; | ||
| 96 | }; | ||
| 97 | |||
| 98 | tcb0: timer@f8008000 { | 91 | tcb0: timer@f8008000 { |
| 99 | compatible = "atmel,at91sam9x5-tcb"; | 92 | compatible = "atmel,at91sam9x5-tcb"; |
| 100 | reg = <0xf8008000 0x100>; | 93 | reg = <0xf8008000 0x100>; |
| @@ -290,6 +283,22 @@ | |||
| 290 | }; | 283 | }; |
| 291 | }; | 284 | }; |
| 292 | 285 | ||
| 286 | ssc0 { | ||
| 287 | pinctrl_ssc0_tx: ssc0_tx-0 { | ||
| 288 | atmel,pins = | ||
| 289 | <0 24 0x2 0x0 /* PA24 periph B */ | ||
| 290 | 0 25 0x2 0x0 /* PA25 periph B */ | ||
| 291 | 0 26 0x2 0x0>; /* PA26 periph B */ | ||
| 292 | }; | ||
| 293 | |||
| 294 | pinctrl_ssc0_rx: ssc0_rx-0 { | ||
| 295 | atmel,pins = | ||
| 296 | <0 27 0x2 0x0 /* PA27 periph B */ | ||
| 297 | 0 28 0x2 0x0 /* PA28 periph B */ | ||
| 298 | 0 29 0x2 0x0>; /* PA29 periph B */ | ||
| 299 | }; | ||
| 300 | }; | ||
| 301 | |||
| 293 | pioA: gpio@fffff400 { | 302 | pioA: gpio@fffff400 { |
| 294 | compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio"; | 303 | compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio"; |
| 295 | reg = <0xfffff400 0x200>; | 304 | reg = <0xfffff400 0x200>; |
| @@ -333,6 +342,15 @@ | |||
| 333 | }; | 342 | }; |
| 334 | }; | 343 | }; |
| 335 | 344 | ||
| 345 | ssc0: ssc@f0010000 { | ||
| 346 | compatible = "atmel,at91sam9g45-ssc"; | ||
| 347 | reg = <0xf0010000 0x4000>; | ||
| 348 | interrupts = <28 4 5>; | ||
| 349 | pinctrl-names = "default"; | ||
| 350 | pinctrl-0 = <&pinctrl_ssc0_tx &pinctrl_ssc0_rx>; | ||
| 351 | status = "disabled"; | ||
| 352 | }; | ||
| 353 | |||
| 336 | mmc0: mmc@f0008000 { | 354 | mmc0: mmc@f0008000 { |
| 337 | compatible = "atmel,hsmci"; | 355 | compatible = "atmel,hsmci"; |
| 338 | reg = <0xf0008000 0x600>; | 356 | reg = <0xf0008000 0x600>; |
diff --git a/arch/arm/include/asm/assembler.h b/arch/arm/include/asm/assembler.h index eb87200aa4b5..05ee9eebad6b 100644 --- a/arch/arm/include/asm/assembler.h +++ b/arch/arm/include/asm/assembler.h | |||
| @@ -246,18 +246,14 @@ | |||
| 246 | * | 246 | * |
| 247 | * This macro is intended for forcing the CPU into SVC mode at boot time. | 247 | * This macro is intended for forcing the CPU into SVC mode at boot time. |
| 248 | * you cannot return to the original mode. | 248 | * you cannot return to the original mode. |
| 249 | * | ||
| 250 | * Beware, it also clobers LR. | ||
| 251 | */ | 249 | */ |
| 252 | .macro safe_svcmode_maskall reg:req | 250 | .macro safe_svcmode_maskall reg:req |
| 253 | #if __LINUX_ARM_ARCH__ >= 6 | 251 | #if __LINUX_ARM_ARCH__ >= 6 |
| 254 | mrs \reg , cpsr | 252 | mrs \reg , cpsr |
| 255 | mov lr , \reg | 253 | eor \reg, \reg, #HYP_MODE |
| 256 | and lr , lr , #MODE_MASK | 254 | tst \reg, #MODE_MASK |
| 257 | cmp lr , #HYP_MODE | ||
| 258 | orr \reg , \reg , #PSR_I_BIT | PSR_F_BIT | ||
| 259 | bic \reg , \reg , #MODE_MASK | 255 | bic \reg , \reg , #MODE_MASK |
| 260 | orr \reg , \reg , #SVC_MODE | 256 | orr \reg , \reg , #PSR_I_BIT | PSR_F_BIT | SVC_MODE |
| 261 | THUMB( orr \reg , \reg , #PSR_T_BIT ) | 257 | THUMB( orr \reg , \reg , #PSR_T_BIT ) |
| 262 | bne 1f | 258 | bne 1f |
| 263 | orr \reg, \reg, #PSR_A_BIT | 259 | orr \reg, \reg, #PSR_A_BIT |
diff --git a/arch/arm/include/asm/cti.h b/arch/arm/include/asm/cti.h index f2e5cad3f306..2381199acb7d 100644 --- a/arch/arm/include/asm/cti.h +++ b/arch/arm/include/asm/cti.h | |||
| @@ -2,6 +2,7 @@ | |||
| 2 | #define __ASMARM_CTI_H | 2 | #define __ASMARM_CTI_H |
| 3 | 3 | ||
| 4 | #include <asm/io.h> | 4 | #include <asm/io.h> |
| 5 | #include <asm/hardware/coresight.h> | ||
| 5 | 6 | ||
| 6 | /* The registers' definition is from section 3.2 of | 7 | /* The registers' definition is from section 3.2 of |
| 7 | * Embedded Cross Trigger Revision: r0p0 | 8 | * Embedded Cross Trigger Revision: r0p0 |
| @@ -35,11 +36,6 @@ | |||
| 35 | #define LOCKACCESS 0xFB0 | 36 | #define LOCKACCESS 0xFB0 |
| 36 | #define LOCKSTATUS 0xFB4 | 37 | #define LOCKSTATUS 0xFB4 |
| 37 | 38 | ||
| 38 | /* write this value to LOCKACCESS will unlock the module, and | ||
| 39 | * other value will lock the module | ||
| 40 | */ | ||
| 41 | #define LOCKCODE 0xC5ACCE55 | ||
| 42 | |||
| 43 | /** | 39 | /** |
| 44 | * struct cti - cross trigger interface struct | 40 | * struct cti - cross trigger interface struct |
| 45 | * @base: mapped virtual address for the cti base | 41 | * @base: mapped virtual address for the cti base |
| @@ -146,7 +142,7 @@ static inline void cti_irq_ack(struct cti *cti) | |||
| 146 | */ | 142 | */ |
| 147 | static inline void cti_unlock(struct cti *cti) | 143 | static inline void cti_unlock(struct cti *cti) |
| 148 | { | 144 | { |
| 149 | __raw_writel(LOCKCODE, cti->base + LOCKACCESS); | 145 | __raw_writel(CS_LAR_KEY, cti->base + LOCKACCESS); |
| 150 | } | 146 | } |
| 151 | 147 | ||
| 152 | /** | 148 | /** |
| @@ -158,6 +154,6 @@ static inline void cti_unlock(struct cti *cti) | |||
| 158 | */ | 154 | */ |
| 159 | static inline void cti_lock(struct cti *cti) | 155 | static inline void cti_lock(struct cti *cti) |
| 160 | { | 156 | { |
| 161 | __raw_writel(~LOCKCODE, cti->base + LOCKACCESS); | 157 | __raw_writel(~CS_LAR_KEY, cti->base + LOCKACCESS); |
| 162 | } | 158 | } |
| 163 | #endif | 159 | #endif |
diff --git a/arch/arm/include/asm/hardware/coresight.h b/arch/arm/include/asm/hardware/coresight.h index 7ecd793b8f5a..0cf7a6b842ff 100644 --- a/arch/arm/include/asm/hardware/coresight.h +++ b/arch/arm/include/asm/hardware/coresight.h | |||
| @@ -36,7 +36,7 @@ | |||
| 36 | /* CoreSight Component Registers */ | 36 | /* CoreSight Component Registers */ |
| 37 | #define CSCR_CLASS 0xff4 | 37 | #define CSCR_CLASS 0xff4 |
| 38 | 38 | ||
| 39 | #define UNLOCK_MAGIC 0xc5acce55 | 39 | #define CS_LAR_KEY 0xc5acce55 |
| 40 | 40 | ||
| 41 | /* ETM control register, "ETM Architecture", 3.3.1 */ | 41 | /* ETM control register, "ETM Architecture", 3.3.1 */ |
| 42 | #define ETMR_CTRL 0 | 42 | #define ETMR_CTRL 0 |
| @@ -147,11 +147,11 @@ | |||
| 147 | 147 | ||
| 148 | #define etm_lock(t) do { etm_writel((t), 0, CSMR_LOCKACCESS); } while (0) | 148 | #define etm_lock(t) do { etm_writel((t), 0, CSMR_LOCKACCESS); } while (0) |
| 149 | #define etm_unlock(t) \ | 149 | #define etm_unlock(t) \ |
| 150 | do { etm_writel((t), UNLOCK_MAGIC, CSMR_LOCKACCESS); } while (0) | 150 | do { etm_writel((t), CS_LAR_KEY, CSMR_LOCKACCESS); } while (0) |
| 151 | 151 | ||
| 152 | #define etb_lock(t) do { etb_writel((t), 0, CSMR_LOCKACCESS); } while (0) | 152 | #define etb_lock(t) do { etb_writel((t), 0, CSMR_LOCKACCESS); } while (0) |
| 153 | #define etb_unlock(t) \ | 153 | #define etb_unlock(t) \ |
| 154 | do { etb_writel((t), UNLOCK_MAGIC, CSMR_LOCKACCESS); } while (0) | 154 | do { etb_writel((t), CS_LAR_KEY, CSMR_LOCKACCESS); } while (0) |
| 155 | 155 | ||
| 156 | #endif /* __ASM_HARDWARE_CORESIGHT_H */ | 156 | #endif /* __ASM_HARDWARE_CORESIGHT_H */ |
| 157 | 157 | ||
diff --git a/arch/arm/include/asm/hw_breakpoint.h b/arch/arm/include/asm/hw_breakpoint.h index 01169dd723f1..eef55ea9ef00 100644 --- a/arch/arm/include/asm/hw_breakpoint.h +++ b/arch/arm/include/asm/hw_breakpoint.h | |||
| @@ -85,6 +85,9 @@ static inline void decode_ctrl_reg(u32 reg, | |||
| 85 | #define ARM_DSCR_HDBGEN (1 << 14) | 85 | #define ARM_DSCR_HDBGEN (1 << 14) |
| 86 | #define ARM_DSCR_MDBGEN (1 << 15) | 86 | #define ARM_DSCR_MDBGEN (1 << 15) |
| 87 | 87 | ||
| 88 | /* OSLSR os lock model bits */ | ||
| 89 | #define ARM_OSLSR_OSLM0 (1 << 0) | ||
| 90 | |||
| 88 | /* opcode2 numbers for the co-processor instructions. */ | 91 | /* opcode2 numbers for the co-processor instructions. */ |
| 89 | #define ARM_OP2_BVR 4 | 92 | #define ARM_OP2_BVR 4 |
| 90 | #define ARM_OP2_BCR 5 | 93 | #define ARM_OP2_BCR 5 |
diff --git a/arch/arm/include/asm/opcodes-sec.h b/arch/arm/include/asm/opcodes-sec.h new file mode 100644 index 000000000000..bc3a9174417c --- /dev/null +++ b/arch/arm/include/asm/opcodes-sec.h | |||
| @@ -0,0 +1,24 @@ | |||
| 1 | /* | ||
| 2 | * This program is free software; you can redistribute it and/or modify | ||
| 3 | * it under the terms of the GNU General Public License version 2 as | ||
| 4 | * published by the Free Software Foundation. | ||
| 5 | * | ||
| 6 | * This program is distributed in the hope that it will be useful, | ||
| 7 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 8 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 9 | * GNU General Public License for more details. | ||
| 10 | * | ||
| 11 | * Copyright (C) 2012 ARM Limited | ||
| 12 | */ | ||
| 13 | |||
| 14 | #ifndef __ASM_ARM_OPCODES_SEC_H | ||
| 15 | #define __ASM_ARM_OPCODES_SEC_H | ||
| 16 | |||
| 17 | #include <asm/opcodes.h> | ||
| 18 | |||
| 19 | #define __SMC(imm4) __inst_arm_thumb32( \ | ||
| 20 | 0xE1600070 | (((imm4) & 0xF) << 0), \ | ||
| 21 | 0xF7F08000 | (((imm4) & 0xF) << 16) \ | ||
| 22 | ) | ||
| 23 | |||
| 24 | #endif /* __ASM_ARM_OPCODES_SEC_H */ | ||
diff --git a/arch/arm/include/asm/opcodes.h b/arch/arm/include/asm/opcodes.h index 74e211a6fb24..e796c598513b 100644 --- a/arch/arm/include/asm/opcodes.h +++ b/arch/arm/include/asm/opcodes.h | |||
| @@ -10,6 +10,7 @@ | |||
| 10 | #define __ASM_ARM_OPCODES_H | 10 | #define __ASM_ARM_OPCODES_H |
| 11 | 11 | ||
| 12 | #ifndef __ASSEMBLY__ | 12 | #ifndef __ASSEMBLY__ |
| 13 | #include <linux/linkage.h> | ||
| 13 | extern asmlinkage unsigned int arm_check_condition(u32 opcode, u32 psr); | 14 | extern asmlinkage unsigned int arm_check_condition(u32 opcode, u32 psr); |
| 14 | #endif | 15 | #endif |
| 15 | 16 | ||
diff --git a/arch/arm/include/asm/psci.h b/arch/arm/include/asm/psci.h new file mode 100644 index 000000000000..ce0dbe7c1625 --- /dev/null +++ b/arch/arm/include/asm/psci.h | |||
| @@ -0,0 +1,36 @@ | |||
| 1 | /* | ||
| 2 | * This program is free software; you can redistribute it and/or modify | ||
| 3 | * it under the terms of the GNU General Public License version 2 as | ||
| 4 | * published by the Free Software Foundation. | ||
| 5 | * | ||
| 6 | * This program is distributed in the hope that it will be useful, | ||
| 7 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 8 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 9 | * GNU General Public License for more details. | ||
| 10 | * | ||
| 11 | * Copyright (C) 2012 ARM Limited | ||
| 12 | */ | ||
| 13 | |||
| 14 | #ifndef __ASM_ARM_PSCI_H | ||
| 15 | #define __ASM_ARM_PSCI_H | ||
| 16 | |||
| 17 | #define PSCI_POWER_STATE_TYPE_STANDBY 0 | ||
| 18 | #define PSCI_POWER_STATE_TYPE_POWER_DOWN 1 | ||
| 19 | |||
| 20 | struct psci_power_state { | ||
| 21 | u16 id; | ||
| 22 | u8 type; | ||
| 23 | u8 affinity_level; | ||
| 24 | }; | ||
| 25 | |||
| 26 | struct psci_operations { | ||
| 27 | int (*cpu_suspend)(struct psci_power_state state, | ||
| 28 | unsigned long entry_point); | ||
| 29 | int (*cpu_off)(struct psci_power_state state); | ||
| 30 | int (*cpu_on)(unsigned long cpuid, unsigned long entry_point); | ||
| 31 | int (*migrate)(unsigned long cpuid); | ||
| 32 | }; | ||
| 33 | |||
| 34 | extern struct psci_operations psci_ops; | ||
| 35 | |||
| 36 | #endif /* __ASM_ARM_PSCI_H */ | ||
diff --git a/arch/arm/include/asm/virt.h b/arch/arm/include/asm/virt.h index 86164df86cb4..50af92bac737 100644 --- a/arch/arm/include/asm/virt.h +++ b/arch/arm/include/asm/virt.h | |||
| @@ -24,9 +24,9 @@ | |||
| 24 | /* | 24 | /* |
| 25 | * Flag indicating that the kernel was not entered in the same mode on every | 25 | * Flag indicating that the kernel was not entered in the same mode on every |
| 26 | * CPU. The zImage loader stashes this value in an SPSR, so we need an | 26 | * CPU. The zImage loader stashes this value in an SPSR, so we need an |
| 27 | * architecturally defined flag bit here (the N flag, as it happens) | 27 | * architecturally defined flag bit here. |
| 28 | */ | 28 | */ |
| 29 | #define BOOT_CPU_MODE_MISMATCH (1<<31) | 29 | #define BOOT_CPU_MODE_MISMATCH PSR_N_BIT |
| 30 | 30 | ||
| 31 | #ifndef __ASSEMBLY__ | 31 | #ifndef __ASSEMBLY__ |
| 32 | 32 | ||
diff --git a/arch/arm/kernel/Makefile b/arch/arm/kernel/Makefile index 5bbec7b8183e..5f3338eacad2 100644 --- a/arch/arm/kernel/Makefile +++ b/arch/arm/kernel/Makefile | |||
| @@ -82,5 +82,6 @@ obj-$(CONFIG_DEBUG_LL) += debug.o | |||
| 82 | obj-$(CONFIG_EARLY_PRINTK) += early_printk.o | 82 | obj-$(CONFIG_EARLY_PRINTK) += early_printk.o |
| 83 | 83 | ||
| 84 | obj-$(CONFIG_ARM_VIRT_EXT) += hyp-stub.o | 84 | obj-$(CONFIG_ARM_VIRT_EXT) += hyp-stub.o |
| 85 | obj-$(CONFIG_ARM_PSCI) += psci.o | ||
| 85 | 86 | ||
| 86 | extra-y := $(head-y) vmlinux.lds | 87 | extra-y := $(head-y) vmlinux.lds |
diff --git a/arch/arm/kernel/hw_breakpoint.c b/arch/arm/kernel/hw_breakpoint.c index 5ff2e77782b1..5eae53e7a2e1 100644 --- a/arch/arm/kernel/hw_breakpoint.c +++ b/arch/arm/kernel/hw_breakpoint.c | |||
| @@ -28,6 +28,7 @@ | |||
| 28 | #include <linux/perf_event.h> | 28 | #include <linux/perf_event.h> |
| 29 | #include <linux/hw_breakpoint.h> | 29 | #include <linux/hw_breakpoint.h> |
| 30 | #include <linux/smp.h> | 30 | #include <linux/smp.h> |
| 31 | #include <linux/cpu_pm.h> | ||
| 31 | 32 | ||
| 32 | #include <asm/cacheflush.h> | 33 | #include <asm/cacheflush.h> |
| 33 | #include <asm/cputype.h> | 34 | #include <asm/cputype.h> |
| @@ -35,6 +36,7 @@ | |||
| 35 | #include <asm/hw_breakpoint.h> | 36 | #include <asm/hw_breakpoint.h> |
| 36 | #include <asm/kdebug.h> | 37 | #include <asm/kdebug.h> |
| 37 | #include <asm/traps.h> | 38 | #include <asm/traps.h> |
| 39 | #include <asm/hardware/coresight.h> | ||
| 38 | 40 | ||
| 39 | /* Breakpoint currently in use for each BRP. */ | 41 | /* Breakpoint currently in use for each BRP. */ |
| 40 | static DEFINE_PER_CPU(struct perf_event *, bp_on_reg[ARM_MAX_BRP]); | 42 | static DEFINE_PER_CPU(struct perf_event *, bp_on_reg[ARM_MAX_BRP]); |
| @@ -49,6 +51,9 @@ static int core_num_wrps; | |||
| 49 | /* Debug architecture version. */ | 51 | /* Debug architecture version. */ |
| 50 | static u8 debug_arch; | 52 | static u8 debug_arch; |
| 51 | 53 | ||
| 54 | /* Does debug architecture support OS Save and Restore? */ | ||
| 55 | static bool has_ossr; | ||
| 56 | |||
| 52 | /* Maximum supported watchpoint length. */ | 57 | /* Maximum supported watchpoint length. */ |
| 53 | static u8 max_watchpoint_len; | 58 | static u8 max_watchpoint_len; |
| 54 | 59 | ||
| @@ -903,6 +908,23 @@ static struct undef_hook debug_reg_hook = { | |||
| 903 | .fn = debug_reg_trap, | 908 | .fn = debug_reg_trap, |
| 904 | }; | 909 | }; |
| 905 | 910 | ||
| 911 | /* Does this core support OS Save and Restore? */ | ||
| 912 | static bool core_has_os_save_restore(void) | ||
| 913 | { | ||
| 914 | u32 oslsr; | ||
| 915 | |||
| 916 | switch (get_debug_arch()) { | ||
| 917 | case ARM_DEBUG_ARCH_V7_1: | ||
| 918 | return true; | ||
| 919 | case ARM_DEBUG_ARCH_V7_ECP14: | ||
| 920 | ARM_DBG_READ(c1, c1, 4, oslsr); | ||
| 921 | if (oslsr & ARM_OSLSR_OSLM0) | ||
| 922 | return true; | ||
| 923 | default: | ||
| 924 | return false; | ||
| 925 | } | ||
| 926 | } | ||
| 927 | |||
| 906 | static void reset_ctrl_regs(void *unused) | 928 | static void reset_ctrl_regs(void *unused) |
| 907 | { | 929 | { |
| 908 | int i, raw_num_brps, err = 0, cpu = smp_processor_id(); | 930 | int i, raw_num_brps, err = 0, cpu = smp_processor_id(); |
| @@ -930,11 +952,7 @@ static void reset_ctrl_regs(void *unused) | |||
| 930 | if ((val & 0x1) == 0) | 952 | if ((val & 0x1) == 0) |
| 931 | err = -EPERM; | 953 | err = -EPERM; |
| 932 | 954 | ||
| 933 | /* | 955 | if (!has_ossr) |
| 934 | * Check whether we implement OS save and restore. | ||
| 935 | */ | ||
| 936 | ARM_DBG_READ(c1, c1, 4, val); | ||
| 937 | if ((val & 0x9) == 0) | ||
| 938 | goto clear_vcr; | 956 | goto clear_vcr; |
| 939 | break; | 957 | break; |
| 940 | case ARM_DEBUG_ARCH_V7_1: | 958 | case ARM_DEBUG_ARCH_V7_1: |
| @@ -955,9 +973,9 @@ static void reset_ctrl_regs(void *unused) | |||
| 955 | 973 | ||
| 956 | /* | 974 | /* |
| 957 | * Unconditionally clear the OS lock by writing a value | 975 | * Unconditionally clear the OS lock by writing a value |
| 958 | * other than 0xC5ACCE55 to the access register. | 976 | * other than CS_LAR_KEY to the access register. |
| 959 | */ | 977 | */ |
| 960 | ARM_DBG_WRITE(c1, c0, 4, 0); | 978 | ARM_DBG_WRITE(c1, c0, 4, ~CS_LAR_KEY); |
| 961 | isb(); | 979 | isb(); |
| 962 | 980 | ||
| 963 | /* | 981 | /* |
| @@ -1015,6 +1033,30 @@ static struct notifier_block __cpuinitdata dbg_reset_nb = { | |||
| 1015 | .notifier_call = dbg_reset_notify, | 1033 | .notifier_call = dbg_reset_notify, |
| 1016 | }; | 1034 | }; |
| 1017 | 1035 | ||
| 1036 | #ifdef CONFIG_CPU_PM | ||
| 1037 | static int dbg_cpu_pm_notify(struct notifier_block *self, unsigned long action, | ||
| 1038 | void *v) | ||
| 1039 | { | ||
| 1040 | if (action == CPU_PM_EXIT) | ||
| 1041 | reset_ctrl_regs(NULL); | ||
| 1042 | |||
| 1043 | return NOTIFY_OK; | ||
| 1044 | } | ||
| 1045 | |||
| 1046 | static struct notifier_block __cpuinitdata dbg_cpu_pm_nb = { | ||
| 1047 | .notifier_call = dbg_cpu_pm_notify, | ||
| 1048 | }; | ||
| 1049 | |||
| 1050 | static void __init pm_init(void) | ||
| 1051 | { | ||
| 1052 | cpu_pm_register_notifier(&dbg_cpu_pm_nb); | ||
| 1053 | } | ||
| 1054 | #else | ||
| 1055 | static inline void pm_init(void) | ||
| 1056 | { | ||
| 1057 | } | ||
| 1058 | #endif | ||
| 1059 | |||
| 1018 | static int __init arch_hw_breakpoint_init(void) | 1060 | static int __init arch_hw_breakpoint_init(void) |
| 1019 | { | 1061 | { |
| 1020 | debug_arch = get_debug_arch(); | 1062 | debug_arch = get_debug_arch(); |
| @@ -1024,6 +1066,8 @@ static int __init arch_hw_breakpoint_init(void) | |||
| 1024 | return 0; | 1066 | return 0; |
| 1025 | } | 1067 | } |
| 1026 | 1068 | ||
| 1069 | has_ossr = core_has_os_save_restore(); | ||
| 1070 | |||
| 1027 | /* Determine how many BRPs/WRPs are available. */ | 1071 | /* Determine how many BRPs/WRPs are available. */ |
| 1028 | core_num_brps = get_num_brps(); | 1072 | core_num_brps = get_num_brps(); |
| 1029 | core_num_wrps = get_num_wrps(); | 1073 | core_num_wrps = get_num_wrps(); |
| @@ -1062,8 +1106,9 @@ static int __init arch_hw_breakpoint_init(void) | |||
| 1062 | hook_ifault_code(FAULT_CODE_DEBUG, hw_breakpoint_pending, SIGTRAP, | 1106 | hook_ifault_code(FAULT_CODE_DEBUG, hw_breakpoint_pending, SIGTRAP, |
| 1063 | TRAP_HWBKPT, "breakpoint debug exception"); | 1107 | TRAP_HWBKPT, "breakpoint debug exception"); |
| 1064 | 1108 | ||
| 1065 | /* Register hotplug notifier. */ | 1109 | /* Register hotplug and PM notifiers. */ |
| 1066 | register_cpu_notifier(&dbg_reset_nb); | 1110 | register_cpu_notifier(&dbg_reset_nb); |
| 1111 | pm_init(); | ||
| 1067 | return 0; | 1112 | return 0; |
| 1068 | } | 1113 | } |
| 1069 | arch_initcall(arch_hw_breakpoint_init); | 1114 | arch_initcall(arch_hw_breakpoint_init); |
diff --git a/arch/arm/kernel/psci.c b/arch/arm/kernel/psci.c new file mode 100644 index 000000000000..36531643cc2c --- /dev/null +++ b/arch/arm/kernel/psci.c | |||
| @@ -0,0 +1,211 @@ | |||
| 1 | /* | ||
| 2 | * This program is free software; you can redistribute it and/or modify | ||
| 3 | * it under the terms of the GNU General Public License version 2 as | ||
| 4 | * published by the Free Software Foundation. | ||
| 5 | * | ||
| 6 | * This program is distributed in the hope that it will be useful, | ||
| 7 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 8 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 9 | * GNU General Public License for more details. | ||
| 10 | * | ||
| 11 | * Copyright (C) 2012 ARM Limited | ||
| 12 | * | ||
| 13 | * Author: Will Deacon <will.deacon@arm.com> | ||
| 14 | */ | ||
| 15 | |||
| 16 | #define pr_fmt(fmt) "psci: " fmt | ||
| 17 | |||
| 18 | #include <linux/init.h> | ||
| 19 | #include <linux/of.h> | ||
| 20 | |||
| 21 | #include <asm/compiler.h> | ||
| 22 | #include <asm/errno.h> | ||
| 23 | #include <asm/opcodes-sec.h> | ||
| 24 | #include <asm/opcodes-virt.h> | ||
| 25 | #include <asm/psci.h> | ||
| 26 | |||
| 27 | struct psci_operations psci_ops; | ||
| 28 | |||
| 29 | static int (*invoke_psci_fn)(u32, u32, u32, u32); | ||
| 30 | |||
| 31 | enum psci_function { | ||
| 32 | PSCI_FN_CPU_SUSPEND, | ||
| 33 | PSCI_FN_CPU_ON, | ||
| 34 | PSCI_FN_CPU_OFF, | ||
| 35 | PSCI_FN_MIGRATE, | ||
| 36 | PSCI_FN_MAX, | ||
| 37 | }; | ||
| 38 | |||
| 39 | static u32 psci_function_id[PSCI_FN_MAX]; | ||
| 40 | |||
| 41 | #define PSCI_RET_SUCCESS 0 | ||
| 42 | #define PSCI_RET_EOPNOTSUPP -1 | ||
| 43 | #define PSCI_RET_EINVAL -2 | ||
| 44 | #define PSCI_RET_EPERM -3 | ||
| 45 | |||
| 46 | static int psci_to_linux_errno(int errno) | ||
| 47 | { | ||
| 48 | switch (errno) { | ||
| 49 | case PSCI_RET_SUCCESS: | ||
| 50 | return 0; | ||
| 51 | case PSCI_RET_EOPNOTSUPP: | ||
| 52 | return -EOPNOTSUPP; | ||
| 53 | case PSCI_RET_EINVAL: | ||
| 54 | return -EINVAL; | ||
| 55 | case PSCI_RET_EPERM: | ||
| 56 | return -EPERM; | ||
| 57 | }; | ||
| 58 | |||
| 59 | return -EINVAL; | ||
| 60 | } | ||
| 61 | |||
| 62 | #define PSCI_POWER_STATE_ID_MASK 0xffff | ||
| 63 | #define PSCI_POWER_STATE_ID_SHIFT 0 | ||
| 64 | #define PSCI_POWER_STATE_TYPE_MASK 0x1 | ||
| 65 | #define PSCI_POWER_STATE_TYPE_SHIFT 16 | ||
| 66 | #define PSCI_POWER_STATE_AFFL_MASK 0x3 | ||
| 67 | #define PSCI_POWER_STATE_AFFL_SHIFT 24 | ||
| 68 | |||
| 69 | static u32 psci_power_state_pack(struct psci_power_state state) | ||
| 70 | { | ||
| 71 | return ((state.id & PSCI_POWER_STATE_ID_MASK) | ||
| 72 | << PSCI_POWER_STATE_ID_SHIFT) | | ||
| 73 | ((state.type & PSCI_POWER_STATE_TYPE_MASK) | ||
| 74 | << PSCI_POWER_STATE_TYPE_SHIFT) | | ||
| 75 | ((state.affinity_level & PSCI_POWER_STATE_AFFL_MASK) | ||
| 76 | << PSCI_POWER_STATE_AFFL_SHIFT); | ||
| 77 | } | ||
| 78 | |||
| 79 | /* | ||
| 80 | * The following two functions are invoked via the invoke_psci_fn pointer | ||
| 81 | * and will not be inlined, allowing us to piggyback on the AAPCS. | ||
| 82 | */ | ||
| 83 | static noinline int __invoke_psci_fn_hvc(u32 function_id, u32 arg0, u32 arg1, | ||
| 84 | u32 arg2) | ||
| 85 | { | ||
| 86 | asm volatile( | ||
| 87 | __asmeq("%0", "r0") | ||
| 88 | __asmeq("%1", "r1") | ||
| 89 | __asmeq("%2", "r2") | ||
| 90 | __asmeq("%3", "r3") | ||
| 91 | __HVC(0) | ||
| 92 | : "+r" (function_id) | ||
| 93 | : "r" (arg0), "r" (arg1), "r" (arg2)); | ||
| 94 | |||
| 95 | return function_id; | ||
| 96 | } | ||
| 97 | |||
| 98 | static noinline int __invoke_psci_fn_smc(u32 function_id, u32 arg0, u32 arg1, | ||
| 99 | u32 arg2) | ||
| 100 | { | ||
| 101 | asm volatile( | ||
| 102 | __asmeq("%0", "r0") | ||
| 103 | __asmeq("%1", "r1") | ||
| 104 | __asmeq("%2", "r2") | ||
| 105 | __asmeq("%3", "r3") | ||
| 106 | __SMC(0) | ||
| 107 | : "+r" (function_id) | ||
| 108 | : "r" (arg0), "r" (arg1), "r" (arg2)); | ||
| 109 | |||
| 110 | return function_id; | ||
| 111 | } | ||
| 112 | |||
| 113 | static int psci_cpu_suspend(struct psci_power_state state, | ||
| 114 | unsigned long entry_point) | ||
| 115 | { | ||
| 116 | int err; | ||
| 117 | u32 fn, power_state; | ||
| 118 | |||
| 119 | fn = psci_function_id[PSCI_FN_CPU_SUSPEND]; | ||
| 120 | power_state = psci_power_state_pack(state); | ||
| 121 | err = invoke_psci_fn(fn, power_state, entry_point, 0); | ||
| 122 | return psci_to_linux_errno(err); | ||
| 123 | } | ||
| 124 | |||
| 125 | static int psci_cpu_off(struct psci_power_state state) | ||
| 126 | { | ||
| 127 | int err; | ||
| 128 | u32 fn, power_state; | ||
| 129 | |||
| 130 | fn = psci_function_id[PSCI_FN_CPU_OFF]; | ||
| 131 | power_state = psci_power_state_pack(state); | ||
| 132 | err = invoke_psci_fn(fn, power_state, 0, 0); | ||
| 133 | return psci_to_linux_errno(err); | ||
| 134 | } | ||
| 135 | |||
| 136 | static int psci_cpu_on(unsigned long cpuid, unsigned long entry_point) | ||
| 137 | { | ||
| 138 | int err; | ||
| 139 | u32 fn; | ||
| 140 | |||
| 141 | fn = psci_function_id[PSCI_FN_CPU_ON]; | ||
| 142 | err = invoke_psci_fn(fn, cpuid, entry_point, 0); | ||
| 143 | return psci_to_linux_errno(err); | ||
| 144 | } | ||
| 145 | |||
| 146 | static int psci_migrate(unsigned long cpuid) | ||
| 147 | { | ||
| 148 | int err; | ||
| 149 | u32 fn; | ||
| 150 | |||
| 151 | fn = psci_function_id[PSCI_FN_MIGRATE]; | ||
| 152 | err = invoke_psci_fn(fn, cpuid, 0, 0); | ||
| 153 | return psci_to_linux_errno(err); | ||
| 154 | } | ||
| 155 | |||
| 156 | static const struct of_device_id psci_of_match[] __initconst = { | ||
| 157 | { .compatible = "arm,psci", }, | ||
| 158 | {}, | ||
| 159 | }; | ||
| 160 | |||
| 161 | static int __init psci_init(void) | ||
| 162 | { | ||
| 163 | struct device_node *np; | ||
| 164 | const char *method; | ||
| 165 | u32 id; | ||
| 166 | |||
| 167 | np = of_find_matching_node(NULL, psci_of_match); | ||
| 168 | if (!np) | ||
| 169 | return 0; | ||
| 170 | |||
| 171 | pr_info("probing function IDs from device-tree\n"); | ||
| 172 | |||
| 173 | if (of_property_read_string(np, "method", &method)) { | ||
| 174 | pr_warning("missing \"method\" property\n"); | ||
| 175 | goto out_put_node; | ||
| 176 | } | ||
| 177 | |||
| 178 | if (!strcmp("hvc", method)) { | ||
| 179 | invoke_psci_fn = __invoke_psci_fn_hvc; | ||
| 180 | } else if (!strcmp("smc", method)) { | ||
| 181 | invoke_psci_fn = __invoke_psci_fn_smc; | ||
| 182 | } else { | ||
| 183 | pr_warning("invalid \"method\" property: %s\n", method); | ||
| 184 | goto out_put_node; | ||
| 185 | } | ||
| 186 | |||
| 187 | if (!of_property_read_u32(np, "cpu_suspend", &id)) { | ||
| 188 | psci_function_id[PSCI_FN_CPU_SUSPEND] = id; | ||
| 189 | psci_ops.cpu_suspend = psci_cpu_suspend; | ||
| 190 | } | ||
| 191 | |||
| 192 | if (!of_property_read_u32(np, "cpu_off", &id)) { | ||
| 193 | psci_function_id[PSCI_FN_CPU_OFF] = id; | ||
| 194 | psci_ops.cpu_off = psci_cpu_off; | ||
| 195 | } | ||
| 196 | |||
| 197 | if (!of_property_read_u32(np, "cpu_on", &id)) { | ||
| 198 | psci_function_id[PSCI_FN_CPU_ON] = id; | ||
| 199 | psci_ops.cpu_on = psci_cpu_on; | ||
| 200 | } | ||
| 201 | |||
| 202 | if (!of_property_read_u32(np, "migrate", &id)) { | ||
| 203 | psci_function_id[PSCI_FN_MIGRATE] = id; | ||
| 204 | psci_ops.migrate = psci_migrate; | ||
| 205 | } | ||
| 206 | |||
| 207 | out_put_node: | ||
| 208 | of_node_put(np); | ||
| 209 | return 0; | ||
| 210 | } | ||
| 211 | early_initcall(psci_init); | ||
diff --git a/arch/arm/mach-pxa/include/mach/mfp-pxa27x.h b/arch/arm/mach-pxa/include/mach/mfp-pxa27x.h index a611ad3153c7..b6132aa95dc0 100644 --- a/arch/arm/mach-pxa/include/mach/mfp-pxa27x.h +++ b/arch/arm/mach-pxa/include/mach/mfp-pxa27x.h | |||
| @@ -463,6 +463,9 @@ | |||
| 463 | GPIO76_LCD_PCLK, \ | 463 | GPIO76_LCD_PCLK, \ |
| 464 | GPIO77_LCD_BIAS | 464 | GPIO77_LCD_BIAS |
| 465 | 465 | ||
| 466 | /* these enable a work-around for a hw bug in pxa27x during ac97 warm reset */ | ||
| 467 | #define GPIO113_AC97_nRESET_GPIO_HIGH MFP_CFG_OUT(GPIO113, AF0, DEFAULT) | ||
| 468 | #define GPIO95_AC97_nRESET_GPIO_HIGH MFP_CFG_OUT(GPIO95, AF0, DEFAULT) | ||
| 466 | 469 | ||
| 467 | extern int keypad_set_wake(unsigned int on); | 470 | extern int keypad_set_wake(unsigned int on); |
| 468 | #endif /* __ASM_ARCH_MFP_PXA27X_H */ | 471 | #endif /* __ASM_ARCH_MFP_PXA27X_H */ |
diff --git a/arch/arm/mach-pxa/pxa27x.c b/arch/arm/mach-pxa/pxa27x.c index 8047ee0effc5..616cb87b6179 100644 --- a/arch/arm/mach-pxa/pxa27x.c +++ b/arch/arm/mach-pxa/pxa27x.c | |||
| @@ -47,9 +47,9 @@ void pxa27x_clear_otgph(void) | |||
| 47 | EXPORT_SYMBOL(pxa27x_clear_otgph); | 47 | EXPORT_SYMBOL(pxa27x_clear_otgph); |
| 48 | 48 | ||
| 49 | static unsigned long ac97_reset_config[] = { | 49 | static unsigned long ac97_reset_config[] = { |
| 50 | GPIO113_GPIO, | 50 | GPIO113_AC97_nRESET_GPIO_HIGH, |
| 51 | GPIO113_AC97_nRESET, | 51 | GPIO113_AC97_nRESET, |
| 52 | GPIO95_GPIO, | 52 | GPIO95_AC97_nRESET_GPIO_HIGH, |
| 53 | GPIO95_AC97_nRESET, | 53 | GPIO95_AC97_nRESET, |
| 54 | }; | 54 | }; |
| 55 | 55 | ||
diff --git a/arch/arm/mm/Kconfig b/arch/arm/mm/Kconfig index 3fd629d5a513..025d17328730 100644 --- a/arch/arm/mm/Kconfig +++ b/arch/arm/mm/Kconfig | |||
| @@ -629,8 +629,9 @@ config ARM_THUMBEE | |||
| 629 | make use of it. Say N for code that can run on CPUs without ThumbEE. | 629 | make use of it. Say N for code that can run on CPUs without ThumbEE. |
| 630 | 630 | ||
| 631 | config ARM_VIRT_EXT | 631 | config ARM_VIRT_EXT |
| 632 | bool "Native support for the ARM Virtualization Extensions" | 632 | bool |
| 633 | depends on MMU && CPU_V7 | 633 | depends on MMU |
| 634 | default y if CPU_V7 | ||
| 634 | help | 635 | help |
| 635 | Enable the kernel to make use of the ARM Virtualization | 636 | Enable the kernel to make use of the ARM Virtualization |
| 636 | Extensions to install hypervisors without run-time firmware | 637 | Extensions to install hypervisors without run-time firmware |
| @@ -640,11 +641,6 @@ config ARM_VIRT_EXT | |||
| 640 | use of this feature. Refer to Documentation/arm/Booting for | 641 | use of this feature. Refer to Documentation/arm/Booting for |
| 641 | details. | 642 | details. |
| 642 | 643 | ||
| 643 | It is safe to enable this option even if the kernel may not be | ||
| 644 | booted in HYP mode, may not have support for the | ||
| 645 | virtualization extensions, or may be booted with a | ||
| 646 | non-compliant bootloader. | ||
| 647 | |||
| 648 | config SWP_EMULATE | 644 | config SWP_EMULATE |
| 649 | bool "Emulate SWP/SWPB instructions" | 645 | bool "Emulate SWP/SWPB instructions" |
| 650 | depends on !CPU_USE_DOMAINS && CPU_V7 | 646 | depends on !CPU_USE_DOMAINS && CPU_V7 |
