diff -druNp --no-dereference linux-libre-3.18.32-gnu/arch/powerpc/include/uapi/asm/cputable.h linux-libre-3.18.33-gnu/arch/powerpc/include/uapi/asm/cputable.h
--- linux-libre-3.18.32-gnu/arch/powerpc/include/uapi/asm/cputable.h	2016-04-23 16:46:40.000000000 -0400
+++ linux-libre-3.18.33-gnu/arch/powerpc/include/uapi/asm/cputable.h	2016-05-11 00:09:19.000000000 -0400
@@ -31,6 +31,7 @@
 #define PPC_FEATURE_PSERIES_PERFMON_COMPAT \
 					0x00000040
 
+/* Reserved - do not use		0x00000004 */
 #define PPC_FEATURE_TRUE_LE		0x00000002
 #define PPC_FEATURE_PPC_LE		0x00000001
 
diff -druNp --no-dereference linux-libre-3.18.32-gnu/arch/powerpc/kernel/prom.c linux-libre-3.18.33-gnu/arch/powerpc/kernel/prom.c
--- linux-libre-3.18.32-gnu/arch/powerpc/kernel/prom.c	2016-04-23 16:46:40.000000000 -0400
+++ linux-libre-3.18.33-gnu/arch/powerpc/kernel/prom.c	2016-05-11 00:09:19.000000000 -0400
@@ -149,17 +149,24 @@ static struct ibm_pa_feature {
 	unsigned long	cpu_features;	/* CPU_FTR_xxx bit */
 	unsigned long	mmu_features;	/* MMU_FTR_xxx bit */
 	unsigned int	cpu_user_ftrs;	/* PPC_FEATURE_xxx bit */
+	unsigned int	cpu_user_ftrs2;	/* PPC_FEATURE2_xxx bit */
 	unsigned char	pabyte;		/* byte number in ibm,pa-features */
 	unsigned char	pabit;		/* bit number (big-endian) */
 	unsigned char	invert;		/* if 1, pa bit set => clear feature */
 } ibm_pa_features[] __initdata = {
-	{0, 0, PPC_FEATURE_HAS_MMU,	0, 0, 0},
-	{0, 0, PPC_FEATURE_HAS_FPU,	0, 1, 0},
-	{CPU_FTR_CTRL, 0, 0,		0, 3, 0},
-	{CPU_FTR_NOEXECUTE, 0, 0,	0, 6, 0},
-	{CPU_FTR_NODSISRALIGN, 0, 0,	1, 1, 1},
-	{0, MMU_FTR_CI_LARGE_PAGE, 0,	1, 2, 0},
-	{CPU_FTR_REAL_LE, PPC_FEATURE_TRUE_LE, 5, 0, 0},
+	{0, 0, PPC_FEATURE_HAS_MMU, 0,		0, 0, 0},
+	{0, 0, PPC_FEATURE_HAS_FPU, 0,		0, 1, 0},
+	{CPU_FTR_CTRL, 0, 0, 0,			0, 3, 0},
+	{CPU_FTR_NOEXECUTE, 0, 0, 0,		0, 6, 0},
+	{CPU_FTR_NODSISRALIGN, 0, 0, 0,		1, 1, 1},
+	{0, MMU_FTR_CI_LARGE_PAGE, 0, 0,		1, 2, 0},
+	{CPU_FTR_REAL_LE, 0, PPC_FEATURE_TRUE_LE, 0, 5, 0, 0},
+	/*
+	 * If the kernel doesn't support TM (ie. CONFIG_PPC_TRANSACTIONAL_MEM=n),
+	 * we don't want to turn on CPU_FTR_TM here, so we use CPU_FTR_TM_COMP
+	 * which is 0 if the kernel doesn't support TM.
+	 */
+	{CPU_FTR_TM_COMP, 0, 0, 0,		22, 0, 0},
 };
 
 static void __init scan_features(unsigned long node, const unsigned char *ftrs,
@@ -190,10 +197,12 @@ static void __init scan_features(unsigne
 		if (bit ^ fp->invert) {
 			cur_cpu_spec->cpu_features |= fp->cpu_features;
 			cur_cpu_spec->cpu_user_features |= fp->cpu_user_ftrs;
+			cur_cpu_spec->cpu_user_features2 |= fp->cpu_user_ftrs2;
 			cur_cpu_spec->mmu_features |= fp->mmu_features;
 		} else {
 			cur_cpu_spec->cpu_features &= ~fp->cpu_features;
 			cur_cpu_spec->cpu_user_features &= ~fp->cpu_user_ftrs;
+			cur_cpu_spec->cpu_user_features2 &= ~fp->cpu_user_ftrs2;
 			cur_cpu_spec->mmu_features &= ~fp->mmu_features;
 		}
 	}
diff -druNp --no-dereference linux-libre-3.18.32-gnu/arch/s390/include/asm/hugetlb.h linux-libre-3.18.33-gnu/arch/s390/include/asm/hugetlb.h
--- linux-libre-3.18.32-gnu/arch/s390/include/asm/hugetlb.h	2016-04-23 16:46:40.000000000 -0400
+++ linux-libre-3.18.33-gnu/arch/s390/include/asm/hugetlb.h	2016-05-11 00:09:19.000000000 -0400
@@ -14,6 +14,7 @@
 
 #define is_hugepage_only_range(mm, addr, len)	0
 #define hugetlb_free_pgd_range			free_pgd_range
+#define hugepages_supported()			(MACHINE_HAS_HPAGE)
 
 void set_huge_pte_at(struct mm_struct *mm, unsigned long addr,
 		     pte_t *ptep, pte_t pte);
diff -druNp --no-dereference linux-libre-3.18.32-gnu/arch/x86/crypto/sha-mb/sha1_mb.c linux-libre-3.18.33-gnu/arch/x86/crypto/sha-mb/sha1_mb.c
--- linux-libre-3.18.32-gnu/arch/x86/crypto/sha-mb/sha1_mb.c	2016-04-23 16:46:40.000000000 -0400
+++ linux-libre-3.18.33-gnu/arch/x86/crypto/sha-mb/sha1_mb.c	2016-05-11 00:09:19.000000000 -0400
@@ -457,10 +457,10 @@ static int sha_complete_job(struct mcryp
 
 			req = cast_mcryptd_ctx_to_req(req_ctx);
 			if (irqs_disabled())
-				rctx->complete(&req->base, ret);
+				req_ctx->complete(&req->base, ret);
 			else {
 				local_bh_disable();
-				rctx->complete(&req->base, ret);
+				req_ctx->complete(&req->base, ret);
 				local_bh_enable();
 			}
 		}
diff -druNp --no-dereference linux-libre-3.18.32-gnu/arch/x86/include/asm/hugetlb.h linux-libre-3.18.33-gnu/arch/x86/include/asm/hugetlb.h
--- linux-libre-3.18.32-gnu/arch/x86/include/asm/hugetlb.h	2016-04-23 16:46:40.000000000 -0400
+++ linux-libre-3.18.33-gnu/arch/x86/include/asm/hugetlb.h	2016-05-11 00:09:19.000000000 -0400
@@ -4,6 +4,7 @@
 #include <asm/page.h>
 #include <asm-generic/hugetlb.h>
 
+#define hugepages_supported() cpu_has_pse
 
 static inline int is_hugepage_only_range(struct mm_struct *mm,
 					 unsigned long addr,
diff -druNp --no-dereference linux-libre-3.18.32-gnu/drivers/crypto/ccp/ccp-crypto-aes-cmac.c linux-libre-3.18.33-gnu/drivers/crypto/ccp/ccp-crypto-aes-cmac.c
--- linux-libre-3.18.32-gnu/drivers/crypto/ccp/ccp-crypto-aes-cmac.c	2016-04-23 16:46:40.000000000 -0400
+++ linux-libre-3.18.33-gnu/drivers/crypto/ccp/ccp-crypto-aes-cmac.c	2016-05-11 00:09:19.000000000 -0400
@@ -206,6 +206,9 @@ static int ccp_aes_cmac_export(struct ah
 	struct ccp_aes_cmac_req_ctx *rctx = ahash_request_ctx(req);
 	struct ccp_aes_cmac_exp_ctx state;
 
+	/* Don't let anything leak to 'out' */
+	memset(&state, 0, sizeof(state));
+
 	state.null_msg = rctx->null_msg;
 	memcpy(state.iv, rctx->iv, sizeof(state.iv));
 	state.buf_count = rctx->buf_count;
diff -druNp --no-dereference linux-libre-3.18.32-gnu/drivers/crypto/ccp/ccp-crypto-sha.c linux-libre-3.18.33-gnu/drivers/crypto/ccp/ccp-crypto-sha.c
--- linux-libre-3.18.32-gnu/drivers/crypto/ccp/ccp-crypto-sha.c	2016-04-23 16:46:40.000000000 -0400
+++ linux-libre-3.18.33-gnu/drivers/crypto/ccp/ccp-crypto-sha.c	2016-05-11 00:09:19.000000000 -0400
@@ -198,6 +198,9 @@ static int ccp_sha_export(struct ahash_r
 	struct ccp_sha_req_ctx *rctx = ahash_request_ctx(req);
 	struct ccp_sha_exp_ctx state;
 
+	/* Don't let anything leak to 'out' */
+	memset(&state, 0, sizeof(state));
+
 	state.type = rctx->type;
 	state.msg_bits = rctx->msg_bits;
 	state.first = rctx->first;
diff -druNp --no-dereference linux-libre-3.18.32-gnu/drivers/edac/sb_edac.c linux-libre-3.18.33-gnu/drivers/edac/sb_edac.c
--- linux-libre-3.18.32-gnu/drivers/edac/sb_edac.c	2016-04-23 16:46:40.000000000 -0400
+++ linux-libre-3.18.33-gnu/drivers/edac/sb_edac.c	2016-05-11 00:09:19.000000000 -0400
@@ -1264,7 +1264,7 @@ static int get_memory_error_data(struct
 	}
 
 	ch_way = TAD_CH(reg) + 1;
-	sck_way = 1 << TAD_SOCK(reg);
+	sck_way = TAD_SOCK(reg);
 
 	if (ch_way == 3)
 		idx = addr >> 6;
@@ -1303,7 +1303,7 @@ static int get_memory_error_data(struct
 		switch(ch_way) {
 		case 2:
 		case 4:
-			sck_xch = 1 << sck_way * (ch_way >> 1);
+			sck_xch = (1 << sck_way) * (ch_way >> 1);
 			break;
 		default:
 			sprintf(msg, "Invalid mirror set. Can't decode addr");
@@ -1339,7 +1339,7 @@ static int get_memory_error_data(struct
 
 	ch_addr = addr - offset;
 	ch_addr >>= (6 + shiftup);
-	ch_addr /= ch_way * sck_way;
+	ch_addr /= sck_xch;
 	ch_addr <<= (6 + shiftup);
 	ch_addr |= addr & ((1 << (6 + shiftup)) - 1);
 
diff -druNp --no-dereference linux-libre-3.18.32-gnu/drivers/gpu/drm/radeon/radeon_atpx_handler.c linux-libre-3.18.33-gnu/drivers/gpu/drm/radeon/radeon_atpx_handler.c
--- linux-libre-3.18.32-gnu/drivers/gpu/drm/radeon/radeon_atpx_handler.c	2016-04-23 16:46:40.000000000 -0400
+++ linux-libre-3.18.33-gnu/drivers/gpu/drm/radeon/radeon_atpx_handler.c	2016-05-11 00:09:19.000000000 -0400
@@ -62,10 +62,6 @@ bool radeon_has_atpx(void) {
 	return radeon_atpx_priv.atpx_detected;
 }
 
-bool radeon_has_atpx_dgpu_power_cntl(void) {
-	return radeon_atpx_priv.atpx.functions.power_cntl;
-}
-
 /**
  * radeon_atpx_call - call an ATPX method
  *
@@ -145,6 +141,10 @@ static void radeon_atpx_parse_functions(
  */
 static int radeon_atpx_validate(struct radeon_atpx *atpx)
 {
+	/* make sure required functions are enabled */
+	/* dGPU power control is required */
+	atpx->functions.power_cntl = true;
+
 	if (atpx->functions.px_params) {
 		union acpi_object *info;
 		struct atpx_px_params output;
diff -druNp --no-dereference linux-libre-3.18.32-gnu/drivers/gpu/drm/radeon/radeon_device.c linux-libre-3.18.33-gnu/drivers/gpu/drm/radeon/radeon_device.c
--- linux-libre-3.18.32-gnu/drivers/gpu/drm/radeon/radeon_device.c	2016-04-23 16:46:40.000000000 -0400
+++ linux-libre-3.18.33-gnu/drivers/gpu/drm/radeon/radeon_device.c	2016-05-11 00:09:19.000000000 -0400
@@ -103,12 +103,6 @@ static const char radeon_family_name[][1
 	"LAST",
 };
 
-#if defined(CONFIG_VGA_SWITCHEROO)
-bool radeon_has_atpx_dgpu_power_cntl(void);
-#else
-static inline bool radeon_has_atpx_dgpu_power_cntl(void) { return false; }
-#endif
-
 #define RADEON_PX_QUIRK_DISABLE_PX  (1 << 0)
 #define RADEON_PX_QUIRK_LONG_WAKEUP (1 << 1)
 
@@ -1401,7 +1395,7 @@ int radeon_device_init(struct radeon_dev
 	 * ignore it */
 	vga_client_register(rdev->pdev, rdev, NULL, radeon_vga_set_decode);
 
-	if ((rdev->flags & RADEON_IS_PX) && radeon_has_atpx_dgpu_power_cntl())
+	if (rdev->flags & RADEON_IS_PX)
 		runtime = true;
 	vga_switcheroo_register_client(rdev->pdev, &radeon_switcheroo_ops, runtime);
 	if (runtime)
diff -druNp --no-dereference linux-libre-3.18.32-gnu/drivers/gpu/drm/radeon/radeon_ttm.c linux-libre-3.18.33-gnu/drivers/gpu/drm/radeon/radeon_ttm.c
--- linux-libre-3.18.32-gnu/drivers/gpu/drm/radeon/radeon_ttm.c	2016-04-23 16:46:40.000000000 -0400
+++ linux-libre-3.18.33-gnu/drivers/gpu/drm/radeon/radeon_ttm.c	2016-05-11 00:09:19.000000000 -0400
@@ -212,6 +212,8 @@ static int radeon_verify_access(struct t
 {
 	struct radeon_bo *rbo = container_of(bo, struct radeon_bo, tbo);
 
+	if (radeon_ttm_tt_has_userptr(bo->ttm))
+		return -EPERM;
 	return drm_vma_node_verify_access(&rbo->gem_base.vma_node, filp);
 }
 
diff -druNp --no-dereference linux-libre-3.18.32-gnu/drivers/gpu/drm/radeon/si_dpm.c linux-libre-3.18.33-gnu/drivers/gpu/drm/radeon/si_dpm.c
--- linux-libre-3.18.32-gnu/drivers/gpu/drm/radeon/si_dpm.c	2016-04-23 16:46:40.000000000 -0400
+++ linux-libre-3.18.33-gnu/drivers/gpu/drm/radeon/si_dpm.c	2016-05-11 00:09:19.000000000 -0400
@@ -2923,6 +2923,10 @@ static struct si_dpm_quirk si_dpm_quirk_
 	{ PCI_VENDOR_ID_ATI, 0x6810, 0x1462, 0x3036, 0, 120000 },
 	{ PCI_VENDOR_ID_ATI, 0x6811, 0x174b, 0xe271, 0, 120000 },
 	{ PCI_VENDOR_ID_ATI, 0x6810, 0x174b, 0xe271, 85000, 90000 },
+	{ PCI_VENDOR_ID_ATI, 0x6811, 0x1762, 0x2015, 0, 120000 },
+	{ PCI_VENDOR_ID_ATI, 0x6811, 0x1043, 0x2015, 0, 120000 },
+	{ PCI_VENDOR_ID_ATI, 0x6811, 0x148c, 0x2015, 0, 120000 },
+	{ PCI_VENDOR_ID_ATI, 0x6810, 0x1682, 0x9275, 0, 120000 },
 	{ 0, 0, 0, 0 },
 };
 
diff -druNp --no-dereference linux-libre-3.18.32-gnu/drivers/input/tablet/gtco.c linux-libre-3.18.33-gnu/drivers/input/tablet/gtco.c
--- linux-libre-3.18.32-gnu/drivers/input/tablet/gtco.c	2016-04-23 16:46:40.000000000 -0400
+++ linux-libre-3.18.33-gnu/drivers/input/tablet/gtco.c	2016-05-11 00:09:19.000000000 -0400
@@ -868,6 +868,14 @@ static int gtco_probe(struct usb_interfa
 		goto err_free_buf;
 	}
 
+	/* Sanity check that a device has an endpoint */
+	if (usbinterface->altsetting[0].desc.bNumEndpoints < 1) {
+		dev_err(&usbinterface->dev,
+			"Invalid number of endpoints\n");
+		error = -EINVAL;
+		goto err_free_urb;
+	}
+
 	/*
 	 * The endpoint is always altsetting 0, we know this since we know
 	 * this device only has one interrupt endpoint
@@ -889,7 +897,7 @@ static int gtco_probe(struct usb_interfa
 	 * HID report descriptor
 	 */
 	if (usb_get_extra_descriptor(usbinterface->cur_altsetting,
-				     HID_DEVICE_TYPE, &hid_desc) != 0){
+				     HID_DEVICE_TYPE, &hid_desc) != 0) {
 		dev_err(&usbinterface->dev,
 			"Can't retrieve exta USB descriptor to get hid report descriptor length\n");
 		error = -EIO;
diff -druNp --no-dereference linux-libre-3.18.32-gnu/include/drm/drm_cache.h linux-libre-3.18.33-gnu/include/drm/drm_cache.h
--- linux-libre-3.18.32-gnu/include/drm/drm_cache.h	2016-04-23 16:46:40.000000000 -0400
+++ linux-libre-3.18.33-gnu/include/drm/drm_cache.h	2016-05-11 00:09:19.000000000 -0400
@@ -39,6 +39,8 @@ static inline bool drm_arch_can_wc_memor
 {
 #if defined(CONFIG_PPC) && !defined(CONFIG_NOT_COHERENT_CACHE)
 	return false;
+#elif defined(CONFIG_MIPS) && defined(CONFIG_CPU_LOONGSON3)
+	return false;
 #else
 	return true;
 #endif
diff -druNp --no-dereference linux-libre-3.18.32-gnu/include/linux/hugetlb.h linux-libre-3.18.33-gnu/include/linux/hugetlb.h
--- linux-libre-3.18.32-gnu/include/linux/hugetlb.h	2016-04-23 16:46:40.000000000 -0400
+++ linux-libre-3.18.33-gnu/include/linux/hugetlb.h	2016-05-11 00:09:19.000000000 -0400
@@ -415,15 +415,14 @@ static inline spinlock_t *huge_pte_lockp
 	return &mm->page_table_lock;
 }
 
-static inline bool hugepages_supported(void)
-{
-	/*
-	 * Some platform decide whether they support huge pages at boot
-	 * time. On these, such as powerpc, HPAGE_SHIFT is set to 0 when
-	 * there is no such support
-	 */
-	return HPAGE_SHIFT != 0;
-}
+#ifndef hugepages_supported
+/*
+ * Some platform decide whether they support huge pages at boot
+ * time. Some of them, such as powerpc, set HPAGE_SHIFT to 0
+ * when there is no such support
+ */
+#define hugepages_supported() (HPAGE_SHIFT != 0)
+#endif
 
 #else	/* CONFIG_HUGETLB_PAGE */
 struct hstate {};
diff -druNp --no-dereference linux-libre-3.18.32-gnu/kernel/futex.c linux-libre-3.18.33-gnu/kernel/futex.c
--- linux-libre-3.18.32-gnu/kernel/futex.c	2016-04-23 16:46:40.000000000 -0400
+++ linux-libre-3.18.33-gnu/kernel/futex.c	2016-05-11 00:09:19.000000000 -0400
@@ -1157,10 +1157,20 @@ static int wake_futex_pi(u32 __user *uad
 	 */
 	newval = FUTEX_WAITERS | task_pid_vnr(new_owner);
 
-	if (cmpxchg_futex_value_locked(&curval, uaddr, uval, newval))
+	if (cmpxchg_futex_value_locked(&curval, uaddr, uval, newval)) {
 		ret = -EFAULT;
-	else if (curval != uval)
-		ret = -EINVAL;
+	} else if (curval != uval) {
+		/*
+		 * If a unconditional UNLOCK_PI operation (user space did not
+		 * try the TID->0 transition) raced with a waiter setting the
+		 * FUTEX_WAITERS flag between get_user() and locking the hash
+		 * bucket lock, retry the operation.
+		 */
+		if ((FUTEX_TID_MASK & curval) == uval)
+			ret = -EAGAIN;
+		else
+			ret = -EINVAL;
+	}
 	if (ret) {
 		raw_spin_unlock(&pi_state->pi_mutex.wait_lock);
 		return ret;
@@ -2419,6 +2429,15 @@ retry:
 		 */
 		if (ret == -EFAULT)
 			goto pi_faulted;
+		/*
+		 * A unconditional UNLOCK_PI op raced against a waiter
+		 * setting the FUTEX_WAITERS bit. Try again.
+		 */
+		if (ret == -EAGAIN) {
+			spin_unlock(&hb->lock);
+			put_futex_key(&key);
+			goto retry;
+		}
 		goto out_unlock;
 	}
 
diff -druNp --no-dereference linux-libre-3.18.32-gnu/Makefile linux-libre-3.18.33-gnu/Makefile
--- linux-libre-3.18.32-gnu/Makefile	2016-04-27 19:04:18.000000000 -0400
+++ linux-libre-3.18.33-gnu/Makefile	2016-05-12 09:59:41.000000000 -0400
@@ -1,6 +1,6 @@
 VERSION = 3
 PATCHLEVEL = 18
-SUBLEVEL = 32
+SUBLEVEL = 33
 EXTRAVERSION =-gnu
 NAME = Diseased Newt
 
diff -druNp --no-dereference linux-libre-3.18.32-gnu/net/wireless/nl80211.c linux-libre-3.18.33-gnu/net/wireless/nl80211.c
--- linux-libre-3.18.32-gnu/net/wireless/nl80211.c	2016-04-23 16:46:40.000000000 -0400
+++ linux-libre-3.18.33-gnu/net/wireless/nl80211.c	2016-05-11 00:09:19.000000000 -0400
@@ -11951,7 +11951,7 @@ static int nl80211_netlink_notify(struct
 	struct wireless_dev *wdev;
 	struct cfg80211_beacon_registration *reg, *tmp;
 
-	if (state != NETLINK_URELEASE)
+	if (state != NETLINK_URELEASE || notify->protocol != NETLINK_GENERIC)
 		return NOTIFY_DONE;
 
 	rcu_read_lock();
diff -druNp --no-dereference linux-libre-3.18.32-gnu/sound/pci/pcxhr/pcxhr_core.c linux-libre-3.18.33-gnu/sound/pci/pcxhr/pcxhr_core.c
--- linux-libre-3.18.32-gnu/sound/pci/pcxhr/pcxhr_core.c	2016-04-23 16:46:40.000000000 -0400
+++ linux-libre-3.18.33-gnu/sound/pci/pcxhr/pcxhr_core.c	2016-05-11 00:09:19.000000000 -0400
@@ -1339,5 +1339,6 @@ irqreturn_t pcxhr_threaded_irq(int irq,
 	}
 
 	pcxhr_msg_thread(mgr);
+	mutex_unlock(&mgr->lock);
 	return IRQ_HANDLED;
 }
