Commit c539914d authored by Chris Metcalf's avatar Chris Metcalf

tile: support new Tilera hypervisor

The Tilera hypervisor shipped in releases up through MDE 4.1 launches
the client operating system (i.e. Linux) at privilege level 1 (PL1).
Starting with MDE 4.2, as part of the work to enable KVM, the
Tilera hypervisor launches Linux at PL2 instead.

This commit makes the KERNEL_PL option default to 2 for tilegx, while
still saying at 1 for tilepro, which doesn't have an updated hypervisor.
It also explains how and when you might want to choose another value.
In addition, we change a small buglet in the on-chip Ethernet driver,
where we were failing to use the KERNEL_PL constant in an API call.

To make the transition cleaner, this change also provides the updated
hv_init() API for the new hypervisor that supports announcing Linux's
compiled-in PL, so the hypervisor can generate a suitable error in the
case of a mismatched hypervisor and Linux binary.
Signed-off-by: default avatarChris Metcalf <cmetcalf@tilera.com>
Cc: stable@vger.linux.org
parent c1be5a5b
......@@ -368,11 +368,17 @@ config HARDWALL
config KERNEL_PL
int "Processor protection level for kernel"
range 1 2
default "1"
default 2 if TILEGX
default 1 if !TILEGX
---help---
This setting determines the processor protection level the
kernel will be built to run at. Generally you should use
the default value here.
Since MDE 4.2, the Tilera hypervisor runs the kernel
at PL2 by default. If running under an older hypervisor,
or as a KVM guest, you must run at PL1. (The current
hypervisor may also be recompiled with "make HV_PL=2" to
allow it to run a kernel at PL1, but clients running at PL1
are not expected to be supported indefinitely.)
If you're not sure, don't change the default.
source "arch/tile/gxio/Kconfig"
......
......@@ -107,7 +107,22 @@
#define HV_DISPATCH_ENTRY_SIZE 32
/** Version of the hypervisor interface defined by this file */
#define _HV_VERSION 11
#define _HV_VERSION 13
/** Last version of the hypervisor interface with old hv_init() ABI.
*
* The change from version 12 to version 13 corresponds to launching
* the client by default at PL2 instead of PL1 (corresponding to the
* hv itself running at PL3 instead of PL2). To make this explicit,
* the hv_init() API was also extended so the client can report its
* desired PL, resulting in a more helpful failure diagnostic. If you
* call hv_init() with _HV_VERSION_OLD_HV_INIT and omit the client_pl
* argument, the hypervisor will assume client_pl = 1.
*
* Note that this is a deprecated solution and we do not expect to
* support clients of the Tilera hypervisor running at PL1 indefinitely.
*/
#define _HV_VERSION_OLD_HV_INIT 12
/* Index into hypervisor interface dispatch code blocks.
*
......@@ -377,7 +392,11 @@ typedef int HV_Errno;
#ifndef __ASSEMBLER__
/** Pass HV_VERSION to hv_init to request this version of the interface. */
typedef enum { HV_VERSION = _HV_VERSION } HV_VersionNumber;
typedef enum {
HV_VERSION = _HV_VERSION,
HV_VERSION_OLD_HV_INIT = _HV_VERSION_OLD_HV_INIT,
} HV_VersionNumber;
/** Initializes the hypervisor.
*
......@@ -385,9 +404,11 @@ typedef enum { HV_VERSION = _HV_VERSION } HV_VersionNumber;
* that this program expects, typically HV_VERSION.
* @param chip_num Architecture number of the chip the client was built for.
* @param chip_rev_num Revision number of the chip the client was built for.
* @param client_pl Privilege level the client is built for
* (not required if interface_version_number == HV_VERSION_OLD_HV_INIT).
*/
void hv_init(HV_VersionNumber interface_version_number,
int chip_num, int chip_rev_num);
int chip_num, int chip_rev_num, int client_pl);
/** Queries we can make for hv_sysconf().
......
......@@ -38,7 +38,7 @@ ENTRY(_start)
movei r2, TILE_CHIP_REV
}
{
moveli r0, _HV_VERSION
moveli r0, _HV_VERSION_OLD_HV_INIT
jal hv_init
}
/* Get a reasonable default ASID in r0 */
......
......@@ -34,13 +34,19 @@
ENTRY(_start)
/* Notify the hypervisor of what version of the API we want */
{
#if KERNEL_PL == 1 && _HV_VERSION == 13
/* Support older hypervisors by asking for API version 12. */
movei r0, _HV_VERSION_OLD_HV_INIT
#else
movei r0, _HV_VERSION
#endif
movei r1, TILE_CHIP
movei r2, TILE_CHIP_REV
}
{
moveli r0, _HV_VERSION
jal hv_init
movei r2, TILE_CHIP_REV
movei r3, KERNEL_PL
}
jal hv_init
/* Get a reasonable default ASID in r0 */
{
move r0, zero
......
......@@ -930,7 +930,7 @@ static int tile_net_setup_interrupts(struct net_device *dev)
if (info->has_iqueue) {
gxio_mpipe_request_notif_ring_interrupt(
&context, cpu_x(cpu), cpu_y(cpu),
1, ingress_irq, info->iqueue.ring);
KERNEL_PL, ingress_irq, info->iqueue.ring);
}
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment