Commit b32729b1 authored by Linus Torvalds's avatar Linus Torvalds

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
parents 091d0d55 abab8761
...@@ -355,11 +355,17 @@ config HARDWALL ...@@ -355,11 +355,17 @@ config HARDWALL
config KERNEL_PL config KERNEL_PL
int "Processor protection level for kernel" int "Processor protection level for kernel"
range 1 2 range 1 2
default "1" default 2 if TILEGX
default 1 if !TILEGX
---help--- ---help---
This setting determines the processor protection level the Since MDE 4.2, the Tilera hypervisor runs the kernel
kernel will be built to run at. Generally you should use at PL2 by default. If running under an older hypervisor,
the default value here. 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" source "arch/tile/gxio/Kconfig"
......
...@@ -107,7 +107,22 @@ ...@@ -107,7 +107,22 @@
#define HV_DISPATCH_ENTRY_SIZE 32 #define HV_DISPATCH_ENTRY_SIZE 32
/** Version of the hypervisor interface defined by this file */ /** 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. /* Index into hypervisor interface dispatch code blocks.
* *
...@@ -377,7 +392,11 @@ typedef int HV_Errno; ...@@ -377,7 +392,11 @@ typedef int HV_Errno;
#ifndef __ASSEMBLER__ #ifndef __ASSEMBLER__
/** Pass HV_VERSION to hv_init to request this version of the interface. */ /** 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. /** Initializes the hypervisor.
* *
...@@ -385,9 +404,11 @@ typedef enum { HV_VERSION = _HV_VERSION } HV_VersionNumber; ...@@ -385,9 +404,11 @@ typedef enum { HV_VERSION = _HV_VERSION } HV_VersionNumber;
* that this program expects, typically HV_VERSION. * that this program expects, typically HV_VERSION.
* @param chip_num Architecture number of the chip the client was built for. * @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 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, 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(). /** Queries we can make for hv_sysconf().
......
...@@ -38,7 +38,7 @@ ENTRY(_start) ...@@ -38,7 +38,7 @@ ENTRY(_start)
movei r2, TILE_CHIP_REV movei r2, TILE_CHIP_REV
} }
{ {
moveli r0, _HV_VERSION moveli r0, _HV_VERSION_OLD_HV_INIT
jal hv_init jal hv_init
} }
/* Get a reasonable default ASID in r0 */ /* Get a reasonable default ASID in r0 */
......
...@@ -34,13 +34,19 @@ ...@@ -34,13 +34,19 @@
ENTRY(_start) ENTRY(_start)
/* Notify the hypervisor of what version of the API we want */ /* 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 r1, TILE_CHIP
movei r2, TILE_CHIP_REV
} }
{ {
moveli r0, _HV_VERSION movei r2, TILE_CHIP_REV
jal hv_init movei r3, KERNEL_PL
} }
jal hv_init
/* Get a reasonable default ASID in r0 */ /* Get a reasonable default ASID in r0 */
{ {
move r0, zero move r0, zero
......
...@@ -101,7 +101,7 @@ EXPORT_SYMBOL(arch_spin_unlock_wait); ...@@ -101,7 +101,7 @@ EXPORT_SYMBOL(arch_spin_unlock_wait);
* preserve the semantic that the same read lock can be acquired in an * preserve the semantic that the same read lock can be acquired in an
* interrupt context. * interrupt context.
*/ */
inline int arch_read_trylock(arch_rwlock_t *rwlock) int arch_read_trylock(arch_rwlock_t *rwlock)
{ {
u32 val; u32 val;
__insn_mtspr(SPR_INTERRUPT_CRITICAL_SECTION, 1); __insn_mtspr(SPR_INTERRUPT_CRITICAL_SECTION, 1);
......
...@@ -930,7 +930,7 @@ static int tile_net_setup_interrupts(struct net_device *dev) ...@@ -930,7 +930,7 @@ static int tile_net_setup_interrupts(struct net_device *dev)
if (info->has_iqueue) { if (info->has_iqueue) {
gxio_mpipe_request_notif_ring_interrupt( gxio_mpipe_request_notif_ring_interrupt(
&context, cpu_x(cpu), cpu_y(cpu), &context, cpu_x(cpu), cpu_y(cpu),
1, ingress_irq, info->iqueue.ring); KERNEL_PL, ingress_irq, info->iqueue.ring);
} }
} }
......
...@@ -146,6 +146,7 @@ static int __init tile_rtc_driver_init(void) ...@@ -146,6 +146,7 @@ static int __init tile_rtc_driver_init(void)
*/ */
static void __exit tile_rtc_driver_exit(void) static void __exit tile_rtc_driver_exit(void)
{ {
platform_device_unregister(tile_rtc_platform_device);
platform_driver_unregister(&tile_rtc_platform_driver); platform_driver_unregister(&tile_rtc_platform_driver);
} }
......
...@@ -118,8 +118,10 @@ static int ehci_hcd_tilegx_drv_probe(struct platform_device *pdev) ...@@ -118,8 +118,10 @@ static int ehci_hcd_tilegx_drv_probe(struct platform_device *pdev)
hcd = usb_create_hcd(&ehci_tilegx_hc_driver, &pdev->dev, hcd = usb_create_hcd(&ehci_tilegx_hc_driver, &pdev->dev,
dev_name(&pdev->dev)); dev_name(&pdev->dev));
if (!hcd) if (!hcd) {
return -ENOMEM; ret = -ENOMEM;
goto err_hcd;
}
/* /*
* We don't use rsrc_start to map in our registers, but seems like * We don't use rsrc_start to map in our registers, but seems like
...@@ -176,6 +178,7 @@ static int ehci_hcd_tilegx_drv_probe(struct platform_device *pdev) ...@@ -176,6 +178,7 @@ static int ehci_hcd_tilegx_drv_probe(struct platform_device *pdev)
err_no_irq: err_no_irq:
tilegx_stop_ehc(); tilegx_stop_ehc();
usb_put_hcd(hcd); usb_put_hcd(hcd);
err_hcd:
gxio_usb_host_destroy(&pdata->usb_ctx); gxio_usb_host_destroy(&pdata->usb_ctx);
return ret; return ret;
} }
......
...@@ -112,8 +112,10 @@ static int ohci_hcd_tilegx_drv_probe(struct platform_device *pdev) ...@@ -112,8 +112,10 @@ static int ohci_hcd_tilegx_drv_probe(struct platform_device *pdev)
hcd = usb_create_hcd(&ohci_tilegx_hc_driver, &pdev->dev, hcd = usb_create_hcd(&ohci_tilegx_hc_driver, &pdev->dev,
dev_name(&pdev->dev)); dev_name(&pdev->dev));
if (!hcd) if (!hcd) {
return -ENOMEM; ret = -ENOMEM;
goto err_hcd;
}
/* /*
* We don't use rsrc_start to map in our registers, but seems like * We don't use rsrc_start to map in our registers, but seems like
...@@ -165,6 +167,7 @@ static int ohci_hcd_tilegx_drv_probe(struct platform_device *pdev) ...@@ -165,6 +167,7 @@ static int ohci_hcd_tilegx_drv_probe(struct platform_device *pdev)
err_no_irq: err_no_irq:
tilegx_stop_ohc(); tilegx_stop_ohc();
usb_put_hcd(hcd); usb_put_hcd(hcd);
err_hcd:
gxio_usb_host_destroy(&pdata->usb_ctx); gxio_usb_host_destroy(&pdata->usb_ctx);
return ret; return ret;
} }
......
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