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: Chris Metcalf <cmetcalf@tilera.com>
Cc: stable@vger.linux.org
Tento commit je obsažen v:
Chris Metcalf
2013-05-02 15:29:04 -04:00
rodič c1be5a5b1b
revize c539914dcd
5 změnil soubory, kde provedl 45 přidání a 12 odebrání

Zobrazit soubor

@@ -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().