diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-05-09 17:34:58 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-05-09 17:34:58 -0400 |
commit | b32729b1eeae7ef8f5709923b36b5a0906d213df (patch) | |
tree | 20bb9092d2c67569ea4efd95c0df5b8160b8b1a3 /arch/tile | |
parent | 091d0d55b286c9340201b4ed4470be87fc568228 (diff) | |
parent | abab8761d095e0805879df48a8ba6ea7f8b31c5e (diff) |
Merge branch 'stable' of git://git.kernel.org/pub/scm/linux/kernel/git/cmetcalf/linux-tile
Pull tile update from Chris Metcalf:
"The interesting bug fix is support for the upcoming "4.2" release of
the Tilera hypervisor, which by default launches Linux at privilege
level 2 instead of 1. The fix lets new and old hypervisors and
Linuxes interoperate more smoothly, so I've tagged it for
stable@kernel.org so that older Linuxes will be able to boot under the
newer hypervisor."
* 'stable' of git://git.kernel.org/pub/scm/linux/kernel/git/cmetcalf/linux-tile:
usb: tilegx: fix memleak when create hcd fail
arch/tile: remove inline marking of EXPORT_SYMBOL functions
rtc: rtc-tile: add missing platform_device_unregister() when module exit
tile: support new Tilera hypervisor
Diffstat (limited to 'arch/tile')
-rw-r--r-- | arch/tile/Kconfig | 14 | ||||
-rw-r--r-- | arch/tile/include/hv/hypervisor.h | 27 | ||||
-rw-r--r-- | arch/tile/kernel/head_32.S | 2 | ||||
-rw-r--r-- | arch/tile/kernel/head_64.S | 12 | ||||
-rw-r--r-- | arch/tile/lib/spinlock_32.c | 2 |
5 files changed, 45 insertions, 12 deletions
diff --git a/arch/tile/Kconfig b/arch/tile/Kconfig index 5b6a40dd5556..3aa37669ff8c 100644 --- a/arch/tile/Kconfig +++ b/arch/tile/Kconfig | |||
@@ -355,11 +355,17 @@ config HARDWALL | |||
355 | config KERNEL_PL | 355 | config KERNEL_PL |
356 | int "Processor protection level for kernel" | 356 | int "Processor protection level for kernel" |
357 | range 1 2 | 357 | range 1 2 |
358 | default "1" | 358 | default 2 if TILEGX |
359 | default 1 if !TILEGX | ||
359 | ---help--- | 360 | ---help--- |
360 | This setting determines the processor protection level the | 361 | Since MDE 4.2, the Tilera hypervisor runs the kernel |
361 | kernel will be built to run at. Generally you should use | 362 | at PL2 by default. If running under an older hypervisor, |
362 | the default value here. | 363 | or as a KVM guest, you must run at PL1. (The current |
364 | hypervisor may also be recompiled with "make HV_PL=2" to | ||
365 | allow it to run a kernel at PL1, but clients running at PL1 | ||
366 | are not expected to be supported indefinitely.) | ||
367 | |||
368 | If you're not sure, don't change the default. | ||
363 | 369 | ||
364 | source "arch/tile/gxio/Kconfig" | 370 | source "arch/tile/gxio/Kconfig" |
365 | 371 | ||
diff --git a/arch/tile/include/hv/hypervisor.h b/arch/tile/include/hv/hypervisor.h index ccd847e2347f..837dca5328c2 100644 --- a/arch/tile/include/hv/hypervisor.h +++ b/arch/tile/include/hv/hypervisor.h | |||
@@ -107,7 +107,22 @@ | |||
107 | #define HV_DISPATCH_ENTRY_SIZE 32 | 107 | #define HV_DISPATCH_ENTRY_SIZE 32 |
108 | 108 | ||
109 | /** Version of the hypervisor interface defined by this file */ | 109 | /** Version of the hypervisor interface defined by this file */ |
110 | #define _HV_VERSION 11 | 110 | #define _HV_VERSION 13 |
111 | |||
112 | /** Last version of the hypervisor interface with old hv_init() ABI. | ||
113 | * | ||
114 | * The change from version 12 to version 13 corresponds to launching | ||
115 | * the client by default at PL2 instead of PL1 (corresponding to the | ||
116 | * hv itself running at PL3 instead of PL2). To make this explicit, | ||
117 | * the hv_init() API was also extended so the client can report its | ||
118 | * desired PL, resulting in a more helpful failure diagnostic. If you | ||
119 | * call hv_init() with _HV_VERSION_OLD_HV_INIT and omit the client_pl | ||
120 | * argument, the hypervisor will assume client_pl = 1. | ||
121 | * | ||
122 | * Note that this is a deprecated solution and we do not expect to | ||
123 | * support clients of the Tilera hypervisor running at PL1 indefinitely. | ||
124 | */ | ||
125 | #define _HV_VERSION_OLD_HV_INIT 12 | ||
111 | 126 | ||
112 | /* Index into hypervisor interface dispatch code blocks. | 127 | /* Index into hypervisor interface dispatch code blocks. |
113 | * | 128 | * |
@@ -377,7 +392,11 @@ typedef int HV_Errno; | |||
377 | #ifndef __ASSEMBLER__ | 392 | #ifndef __ASSEMBLER__ |
378 | 393 | ||
379 | /** Pass HV_VERSION to hv_init to request this version of the interface. */ | 394 | /** Pass HV_VERSION to hv_init to request this version of the interface. */ |
380 | typedef enum { HV_VERSION = _HV_VERSION } HV_VersionNumber; | 395 | typedef enum { |
396 | HV_VERSION = _HV_VERSION, | ||
397 | HV_VERSION_OLD_HV_INIT = _HV_VERSION_OLD_HV_INIT, | ||
398 | |||
399 | } HV_VersionNumber; | ||
381 | 400 | ||
382 | /** Initializes the hypervisor. | 401 | /** Initializes the hypervisor. |
383 | * | 402 | * |
@@ -385,9 +404,11 @@ typedef enum { HV_VERSION = _HV_VERSION } HV_VersionNumber; | |||
385 | * that this program expects, typically HV_VERSION. | 404 | * that this program expects, typically HV_VERSION. |
386 | * @param chip_num Architecture number of the chip the client was built for. | 405 | * @param chip_num Architecture number of the chip the client was built for. |
387 | * @param chip_rev_num Revision number of the chip the client was built for. | 406 | * @param chip_rev_num Revision number of the chip the client was built for. |
407 | * @param client_pl Privilege level the client is built for | ||
408 | * (not required if interface_version_number == HV_VERSION_OLD_HV_INIT). | ||
388 | */ | 409 | */ |
389 | void hv_init(HV_VersionNumber interface_version_number, | 410 | void hv_init(HV_VersionNumber interface_version_number, |
390 | int chip_num, int chip_rev_num); | 411 | int chip_num, int chip_rev_num, int client_pl); |
391 | 412 | ||
392 | 413 | ||
393 | /** Queries we can make for hv_sysconf(). | 414 | /** Queries we can make for hv_sysconf(). |
diff --git a/arch/tile/kernel/head_32.S b/arch/tile/kernel/head_32.S index f71bfeeaf1a9..ac115307e5e4 100644 --- a/arch/tile/kernel/head_32.S +++ b/arch/tile/kernel/head_32.S | |||
@@ -38,7 +38,7 @@ ENTRY(_start) | |||
38 | movei r2, TILE_CHIP_REV | 38 | movei r2, TILE_CHIP_REV |
39 | } | 39 | } |
40 | { | 40 | { |
41 | moveli r0, _HV_VERSION | 41 | moveli r0, _HV_VERSION_OLD_HV_INIT |
42 | jal hv_init | 42 | jal hv_init |
43 | } | 43 | } |
44 | /* Get a reasonable default ASID in r0 */ | 44 | /* Get a reasonable default ASID in r0 */ |
diff --git a/arch/tile/kernel/head_64.S b/arch/tile/kernel/head_64.S index f9a2734f7b82..6093964fa5c7 100644 --- a/arch/tile/kernel/head_64.S +++ b/arch/tile/kernel/head_64.S | |||
@@ -34,13 +34,19 @@ | |||
34 | ENTRY(_start) | 34 | ENTRY(_start) |
35 | /* Notify the hypervisor of what version of the API we want */ | 35 | /* Notify the hypervisor of what version of the API we want */ |
36 | { | 36 | { |
37 | #if KERNEL_PL == 1 && _HV_VERSION == 13 | ||
38 | /* Support older hypervisors by asking for API version 12. */ | ||
39 | movei r0, _HV_VERSION_OLD_HV_INIT | ||
40 | #else | ||
41 | movei r0, _HV_VERSION | ||
42 | #endif | ||
37 | movei r1, TILE_CHIP | 43 | movei r1, TILE_CHIP |
38 | movei r2, TILE_CHIP_REV | ||
39 | } | 44 | } |
40 | { | 45 | { |
41 | moveli r0, _HV_VERSION | 46 | movei r2, TILE_CHIP_REV |
42 | jal hv_init | 47 | movei r3, KERNEL_PL |
43 | } | 48 | } |
49 | jal hv_init | ||
44 | /* Get a reasonable default ASID in r0 */ | 50 | /* Get a reasonable default ASID in r0 */ |
45 | { | 51 | { |
46 | move r0, zero | 52 | move r0, zero |
diff --git a/arch/tile/lib/spinlock_32.c b/arch/tile/lib/spinlock_32.c index b16ac49a968e..b34f79aada48 100644 --- a/arch/tile/lib/spinlock_32.c +++ b/arch/tile/lib/spinlock_32.c | |||
@@ -101,7 +101,7 @@ EXPORT_SYMBOL(arch_spin_unlock_wait); | |||
101 | * preserve the semantic that the same read lock can be acquired in an | 101 | * preserve the semantic that the same read lock can be acquired in an |
102 | * interrupt context. | 102 | * interrupt context. |
103 | */ | 103 | */ |
104 | inline int arch_read_trylock(arch_rwlock_t *rwlock) | 104 | int arch_read_trylock(arch_rwlock_t *rwlock) |
105 | { | 105 | { |
106 | u32 val; | 106 | u32 val; |
107 | __insn_mtspr(SPR_INTERRUPT_CRITICAL_SECTION, 1); | 107 | __insn_mtspr(SPR_INTERRUPT_CRITICAL_SECTION, 1); |