Merge branch 'f25' of ssh://pkgs.fedoraproject.org/kernel into f25-pf
This commit is contained in:
commit
7b5a956be9
|
@ -0,0 +1,75 @@
|
|||
From 1989dada7ce07848196991c9ebf25ff9c5f14d4e Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Tissoires <benjamin.tissoires@redhat.com>
|
||||
Date: Tue, 13 Sep 2016 11:52:37 +0200
|
||||
Subject: [PATCH] HID: input: ignore System Control application usages if not
|
||||
System Controls
|
||||
|
||||
Microsoft is reusing its report descriptor again and again, and part of it
|
||||
looks like this:
|
||||
|
||||
0x05, 0x01, // Usage Page (Generic Desktop) 299
|
||||
0x09, 0x80, // Usage (System Control) 301
|
||||
0xa1, 0x01, // Collection (Application) 303
|
||||
0x85, 0x03, // Report ID (3) 305
|
||||
0x19, 0x00, // Usage Minimum (0) 307
|
||||
0x29, 0xff, // Usage Maximum (255) 309
|
||||
0x15, 0x00, // Logical Minimum (0) 311
|
||||
0x26, 0xff, 0x00, // Logical Maximum (255) 313
|
||||
0x81, 0x00, // Input (Data,Arr,Abs) 316
|
||||
0xc0, // End Collection 318
|
||||
|
||||
While there is nothing wrong in term of processing, we do however blindly
|
||||
map the full usage range (it's an array) from 0x00 to 0xff, which creates
|
||||
some interesting axis, like ABS_X|Y, and a bunch of ABS_MISC + n.
|
||||
|
||||
While libinput and other stacks don't care that much (we can detect them),
|
||||
joydev is very happy and attaches itself to the mouse or keyboard.
|
||||
|
||||
The problem is that joydev now handles the device as a joystick, but given
|
||||
that we have a HID array, it sets all the ABS_* values to 0. And in its
|
||||
world, 0 means -32767 (minimum value), which sends spurious events to games
|
||||
(think Steam).
|
||||
|
||||
It looks like hid-microsoft tries to tackle the very same problem with its
|
||||
.report_fixup callback. But fixing the report descriptor is an endless task
|
||||
and is quite obfuscated.
|
||||
|
||||
So take the hammer, and decide that if the application is meant to be
|
||||
System Control, any other usage not in the System Control range should
|
||||
be ignored.
|
||||
|
||||
Link: https://bugzilla.redhat.com/show_bug.cgi?id=1325354
|
||||
Link: https://bugzilla.kernel.org/show_bug.cgi?id=28912
|
||||
Link: https://github.com/ValveSoftware/steam-for-linux/issues/3384
|
||||
Link: https://bugzilla.redhat.com/show_bug.cgi?id=1325354
|
||||
Link: https://bugzilla.kernel.org/show_bug.cgi?id=37982
|
||||
|
||||
Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
|
||||
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
|
||||
---
|
||||
drivers/hid/hid-input.c | 9 +++++++++
|
||||
1 file changed, 9 insertions(+)
|
||||
|
||||
diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c
|
||||
index bcfaf32..058919d 100644
|
||||
--- a/drivers/hid/hid-input.c
|
||||
+++ b/drivers/hid/hid-input.c
|
||||
@@ -604,6 +604,15 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
|
||||
break;
|
||||
}
|
||||
|
||||
+ /*
|
||||
+ * Some lazy vendors declare 255 usages for System Control,
|
||||
+ * leading to the creation of ABS_X|Y axis and too many others.
|
||||
+ * It wouldn't be a problem if joydev doesn't consider the
|
||||
+ * device as a joystick then.
|
||||
+ */
|
||||
+ if (field->application == HID_GD_SYSTEM_CONTROL)
|
||||
+ goto ignore;
|
||||
+
|
||||
if ((usage->hid & 0xf0) == 0x90) { /* D-pad */
|
||||
switch (usage->hid) {
|
||||
case HID_GD_UP: usage->hat_dir = 1; break;
|
||||
--
|
||||
2.7.4
|
||||
|
|
@ -1,81 +0,0 @@
|
|||
From a397ba829d7f8aff4c90af3704573a28ccd61a59 Mon Sep 17 00:00:00 2001
|
||||
From: Marcelo Cerri <marcelo.cerri@canonical.com>
|
||||
Date: Wed, 28 Sep 2016 13:42:09 -0300
|
||||
Subject: [PATCH] crypto: ghash-generic - move common definitions to a new
|
||||
header file
|
||||
|
||||
Move common values and types used by ghash-generic to a new header file
|
||||
so drivers can directly use ghash-generic as a fallback implementation.
|
||||
|
||||
Fixes: cc333cd68dfa ("crypto: vmx - Adding GHASH routines for VMX module")
|
||||
Cc: stable@vger.kernel.org
|
||||
Signed-off-by: Marcelo Cerri <marcelo.cerri@canonical.com>
|
||||
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
|
||||
---
|
||||
crypto/ghash-generic.c | 13 +------------
|
||||
include/crypto/ghash.h | 23 +++++++++++++++++++++++
|
||||
2 files changed, 24 insertions(+), 12 deletions(-)
|
||||
create mode 100644 include/crypto/ghash.h
|
||||
|
||||
diff --git a/crypto/ghash-generic.c b/crypto/ghash-generic.c
|
||||
index bac7099..12ad3e3 100644
|
||||
--- a/crypto/ghash-generic.c
|
||||
+++ b/crypto/ghash-generic.c
|
||||
@@ -14,24 +14,13 @@
|
||||
|
||||
#include <crypto/algapi.h>
|
||||
#include <crypto/gf128mul.h>
|
||||
+#include <crypto/ghash.h>
|
||||
#include <crypto/internal/hash.h>
|
||||
#include <linux/crypto.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
-#define GHASH_BLOCK_SIZE 16
|
||||
-#define GHASH_DIGEST_SIZE 16
|
||||
-
|
||||
-struct ghash_ctx {
|
||||
- struct gf128mul_4k *gf128;
|
||||
-};
|
||||
-
|
||||
-struct ghash_desc_ctx {
|
||||
- u8 buffer[GHASH_BLOCK_SIZE];
|
||||
- u32 bytes;
|
||||
-};
|
||||
-
|
||||
static int ghash_init(struct shash_desc *desc)
|
||||
{
|
||||
struct ghash_desc_ctx *dctx = shash_desc_ctx(desc);
|
||||
diff --git a/include/crypto/ghash.h b/include/crypto/ghash.h
|
||||
new file mode 100644
|
||||
index 0000000..2a61c9b
|
||||
--- /dev/null
|
||||
+++ b/include/crypto/ghash.h
|
||||
@@ -0,0 +1,23 @@
|
||||
+/*
|
||||
+ * Common values for GHASH algorithms
|
||||
+ */
|
||||
+
|
||||
+#ifndef __CRYPTO_GHASH_H__
|
||||
+#define __CRYPTO_GHASH_H__
|
||||
+
|
||||
+#include <linux/types.h>
|
||||
+#include <crypto/gf128mul.h>
|
||||
+
|
||||
+#define GHASH_BLOCK_SIZE 16
|
||||
+#define GHASH_DIGEST_SIZE 16
|
||||
+
|
||||
+struct ghash_ctx {
|
||||
+ struct gf128mul_4k *gf128;
|
||||
+};
|
||||
+
|
||||
+struct ghash_desc_ctx {
|
||||
+ u8 buffer[GHASH_BLOCK_SIZE];
|
||||
+ u32 bytes;
|
||||
+};
|
||||
+
|
||||
+#endif
|
||||
--
|
||||
2.7.4
|
||||
|
|
@ -1,103 +0,0 @@
|
|||
From 80da44c29d997e28c4442825f35f4ac339813877 Mon Sep 17 00:00:00 2001
|
||||
From: Marcelo Cerri <marcelo.cerri@canonical.com>
|
||||
Date: Wed, 28 Sep 2016 13:42:10 -0300
|
||||
Subject: [PATCH] crypto: vmx - Fix memory corruption caused by p8_ghash
|
||||
|
||||
This patch changes the p8_ghash driver to use ghash-generic as a fixed
|
||||
fallback implementation. This allows the correct value of descsize to be
|
||||
defined directly in its shash_alg structure and avoids problems with
|
||||
incorrect buffer sizes when its state is exported or imported.
|
||||
|
||||
Reported-by: Jan Stancek <jstancek@redhat.com>
|
||||
Fixes: cc333cd68dfa ("crypto: vmx - Adding GHASH routines for VMX module")
|
||||
Cc: stable@vger.kernel.org
|
||||
Signed-off-by: Marcelo Cerri <marcelo.cerri@canonical.com>
|
||||
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
|
||||
---
|
||||
drivers/crypto/vmx/ghash.c | 31 ++++++++++++++++---------------
|
||||
1 file changed, 16 insertions(+), 15 deletions(-)
|
||||
|
||||
diff --git a/drivers/crypto/vmx/ghash.c b/drivers/crypto/vmx/ghash.c
|
||||
index 6c999cb0..27a94a1 100644
|
||||
--- a/drivers/crypto/vmx/ghash.c
|
||||
+++ b/drivers/crypto/vmx/ghash.c
|
||||
@@ -26,16 +26,13 @@
|
||||
#include <linux/hardirq.h>
|
||||
#include <asm/switch_to.h>
|
||||
#include <crypto/aes.h>
|
||||
+#include <crypto/ghash.h>
|
||||
#include <crypto/scatterwalk.h>
|
||||
#include <crypto/internal/hash.h>
|
||||
#include <crypto/b128ops.h>
|
||||
|
||||
#define IN_INTERRUPT in_interrupt()
|
||||
|
||||
-#define GHASH_BLOCK_SIZE (16)
|
||||
-#define GHASH_DIGEST_SIZE (16)
|
||||
-#define GHASH_KEY_LEN (16)
|
||||
-
|
||||
void gcm_init_p8(u128 htable[16], const u64 Xi[2]);
|
||||
void gcm_gmult_p8(u64 Xi[2], const u128 htable[16]);
|
||||
void gcm_ghash_p8(u64 Xi[2], const u128 htable[16],
|
||||
@@ -55,16 +52,11 @@ struct p8_ghash_desc_ctx {
|
||||
|
||||
static int p8_ghash_init_tfm(struct crypto_tfm *tfm)
|
||||
{
|
||||
- const char *alg;
|
||||
+ const char *alg = "ghash-generic";
|
||||
struct crypto_shash *fallback;
|
||||
struct crypto_shash *shash_tfm = __crypto_shash_cast(tfm);
|
||||
struct p8_ghash_ctx *ctx = crypto_tfm_ctx(tfm);
|
||||
|
||||
- if (!(alg = crypto_tfm_alg_name(tfm))) {
|
||||
- printk(KERN_ERR "Failed to get algorithm name.\n");
|
||||
- return -ENOENT;
|
||||
- }
|
||||
-
|
||||
fallback = crypto_alloc_shash(alg, 0, CRYPTO_ALG_NEED_FALLBACK);
|
||||
if (IS_ERR(fallback)) {
|
||||
printk(KERN_ERR
|
||||
@@ -78,10 +70,18 @@ static int p8_ghash_init_tfm(struct crypto_tfm *tfm)
|
||||
crypto_shash_set_flags(fallback,
|
||||
crypto_shash_get_flags((struct crypto_shash
|
||||
*) tfm));
|
||||
- ctx->fallback = fallback;
|
||||
|
||||
- shash_tfm->descsize = sizeof(struct p8_ghash_desc_ctx)
|
||||
- + crypto_shash_descsize(fallback);
|
||||
+ /* Check if the descsize defined in the algorithm is still enough. */
|
||||
+ if (shash_tfm->descsize < sizeof(struct p8_ghash_desc_ctx)
|
||||
+ + crypto_shash_descsize(fallback)) {
|
||||
+ printk(KERN_ERR
|
||||
+ "Desc size of the fallback implementation (%s) does not match the expected value: %lu vs %u\n",
|
||||
+ alg,
|
||||
+ shash_tfm->descsize - sizeof(struct p8_ghash_desc_ctx),
|
||||
+ crypto_shash_descsize(fallback));
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+ ctx->fallback = fallback;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -113,7 +113,7 @@ static int p8_ghash_setkey(struct crypto_shash *tfm, const u8 *key,
|
||||
{
|
||||
struct p8_ghash_ctx *ctx = crypto_tfm_ctx(crypto_shash_tfm(tfm));
|
||||
|
||||
- if (keylen != GHASH_KEY_LEN)
|
||||
+ if (keylen != GHASH_BLOCK_SIZE)
|
||||
return -EINVAL;
|
||||
|
||||
preempt_disable();
|
||||
@@ -211,7 +211,8 @@ struct shash_alg p8_ghash_alg = {
|
||||
.update = p8_ghash_update,
|
||||
.final = p8_ghash_final,
|
||||
.setkey = p8_ghash_setkey,
|
||||
- .descsize = sizeof(struct p8_ghash_desc_ctx),
|
||||
+ .descsize = sizeof(struct p8_ghash_desc_ctx)
|
||||
+ + sizeof(struct ghash_desc_ctx),
|
||||
.base = {
|
||||
.cra_name = "ghash",
|
||||
.cra_driver_name = "p8_ghash",
|
||||
--
|
||||
2.7.4
|
||||
|
|
@ -1,41 +0,0 @@
|
|||
From: Dan Carpenter <dan.carpenter@oracle.com>
|
||||
Date: 2016-09-15 13:44:56
|
||||
Subject: [patch v2] arcmsr: buffer overflow in arcmsr_iop_message_xfer()
|
||||
|
||||
We need to put an upper bound on "user_len" so the memcpy() doesn't
|
||||
overflow.
|
||||
|
||||
Reported-by: Marco Grassi <marco.gra@gmail.com>
|
||||
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
|
||||
Reviewed-by: Tomas Henzl <thenzl@redhat.com>
|
||||
|
||||
diff --git a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
|
||||
index 7640498..110eca9 100644
|
||||
--- a/drivers/scsi/arcmsr/arcmsr_hba.c
|
||||
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c
|
||||
@@ -2388,7 +2388,8 @@ static int arcmsr_iop_message_xfer(struct AdapterControlBlock *acb,
|
||||
}
|
||||
case ARCMSR_MESSAGE_WRITE_WQBUFFER: {
|
||||
unsigned char *ver_addr;
|
||||
- int32_t user_len, cnt2end;
|
||||
+ uint32_t user_len;
|
||||
+ int32_t cnt2end;
|
||||
uint8_t *pQbuffer, *ptmpuserbuffer;
|
||||
ver_addr = kmalloc(ARCMSR_API_DATA_BUFLEN, GFP_ATOMIC);
|
||||
if (!ver_addr) {
|
||||
@@ -2397,6 +2398,11 @@ static int arcmsr_iop_message_xfer(struct AdapterControlBlock *acb,
|
||||
}
|
||||
ptmpuserbuffer = ver_addr;
|
||||
user_len = pcmdmessagefld->cmdmessage.Length;
|
||||
+ if (user_len > ARCMSR_API_DATA_BUFLEN) {
|
||||
+ retvalue = ARCMSR_MESSAGE_FAIL;
|
||||
+ kfree(ver_addr);
|
||||
+ goto message_out;
|
||||
+ }
|
||||
memcpy(ptmpuserbuffer,
|
||||
pcmdmessagefld->messagedatabuffer, user_len);
|
||||
spin_lock_irqsave(&acb->wqbuffer_lock, flags);
|
||||
--
|
||||
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
|
||||
the body of a message to majordomo@vger.kernel.org
|
||||
More majordomo info at http://vger.kernel.org/majordomo-info.html
|
|
@ -634,3 +634,314 @@ index 9ecd6ff..a4b5370 100644
|
|||
--
|
||||
2.9.3
|
||||
|
||||
From c4e634ce412d97f0e61223b2a5b3f8f9600cd4dc Mon Sep 17 00:00:00 2001
|
||||
From: Eric Anholt <eric@anholt.net>
|
||||
Date: Fri, 30 Sep 2016 10:07:27 -0700
|
||||
Subject: clk: bcm2835: Clamp the PLL's requested rate to the hardware limits.
|
||||
|
||||
Fixes setting low-resolution video modes on HDMI. Now the PLLH_PIX
|
||||
divider adjusts itself until the PLLH is within bounds.
|
||||
|
||||
Signed-off-by: Eric Anholt <eric@anholt.net>
|
||||
Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
|
||||
---
|
||||
drivers/clk/bcm/clk-bcm2835.c | 11 ++++-------
|
||||
1 file changed, 4 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/drivers/clk/bcm/clk-bcm2835.c b/drivers/clk/bcm/clk-bcm2835.c
|
||||
index b68bf57..8c7763f 100644
|
||||
--- a/drivers/clk/bcm/clk-bcm2835.c
|
||||
+++ b/drivers/clk/bcm/clk-bcm2835.c
|
||||
@@ -502,8 +502,12 @@ static long bcm2835_pll_rate_from_divisors(unsigned long parent_rate,
|
||||
static long bcm2835_pll_round_rate(struct clk_hw *hw, unsigned long rate,
|
||||
unsigned long *parent_rate)
|
||||
{
|
||||
+ struct bcm2835_pll *pll = container_of(hw, struct bcm2835_pll, hw);
|
||||
+ const struct bcm2835_pll_data *data = pll->data;
|
||||
u32 ndiv, fdiv;
|
||||
|
||||
+ rate = clamp(rate, data->min_rate, data->max_rate);
|
||||
+
|
||||
bcm2835_pll_choose_ndiv_and_fdiv(rate, *parent_rate, &ndiv, &fdiv);
|
||||
|
||||
return bcm2835_pll_rate_from_divisors(*parent_rate, ndiv, fdiv, 1);
|
||||
@@ -608,13 +612,6 @@ static int bcm2835_pll_set_rate(struct clk_hw *hw,
|
||||
u32 ana[4];
|
||||
int i;
|
||||
|
||||
- if (rate < data->min_rate || rate > data->max_rate) {
|
||||
- dev_err(cprman->dev, "%s: rate out of spec: %lu vs (%lu, %lu)\n",
|
||||
- clk_hw_get_name(hw), rate,
|
||||
- data->min_rate, data->max_rate);
|
||||
- return -EINVAL;
|
||||
- }
|
||||
-
|
||||
if (rate > data->max_fb_rate) {
|
||||
use_fb_prediv = true;
|
||||
rate /= 2;
|
||||
--
|
||||
cgit v0.12
|
||||
|
||||
From e69fdcca836f0b81a2260b69429c8622a80ea891 Mon Sep 17 00:00:00 2001
|
||||
From: Eric Anholt <eric@anholt.net>
|
||||
Date: Wed, 1 Jun 2016 12:05:33 -0700
|
||||
Subject: clk: bcm2835: Mark the VPU clock as critical
|
||||
|
||||
The VPU clock is also the clock for our AXI bus, so we really can't
|
||||
disable it. This might have happened during boot if, for example,
|
||||
uart1 (aux_uart clock) probed and was then disabled before the other
|
||||
consumers of the VPU clock had probed.
|
||||
|
||||
Signed-off-by: Eric Anholt <eric@anholt.net>
|
||||
Acked-by: Martin Sperl <kernel@martin.sperl.org>
|
||||
Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
|
||||
---
|
||||
drivers/clk/bcm/clk-bcm2835.c | 5 ++++-
|
||||
1 file changed, 4 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/clk/bcm/clk-bcm2835.c b/drivers/clk/bcm/clk-bcm2835.c
|
||||
index 7a79708..d9db03c 100644
|
||||
--- a/drivers/clk/bcm/clk-bcm2835.c
|
||||
+++ b/drivers/clk/bcm/clk-bcm2835.c
|
||||
@@ -443,6 +443,8 @@ struct bcm2835_clock_data {
|
||||
/* Number of fractional bits in the divider */
|
||||
u32 frac_bits;
|
||||
|
||||
+ u32 flags;
|
||||
+
|
||||
bool is_vpu_clock;
|
||||
bool is_mash_clock;
|
||||
};
|
||||
@@ -1230,7 +1232,7 @@ static struct clk *bcm2835_register_clock(struct bcm2835_cprman *cprman,
|
||||
init.parent_names = parents;
|
||||
init.num_parents = data->num_mux_parents;
|
||||
init.name = data->name;
|
||||
- init.flags = CLK_IGNORE_UNUSED;
|
||||
+ init.flags = data->flags | CLK_IGNORE_UNUSED;
|
||||
|
||||
if (data->is_vpu_clock) {
|
||||
init.ops = &bcm2835_vpu_clock_clk_ops;
|
||||
@@ -1649,6 +1651,7 @@ static const struct bcm2835_clk_desc clk_desc_array[] = {
|
||||
.div_reg = CM_VPUDIV,
|
||||
.int_bits = 12,
|
||||
.frac_bits = 8,
|
||||
+ .flags = CLK_IS_CRITICAL,
|
||||
.is_vpu_clock = true),
|
||||
|
||||
/* clocks with per parent mux */
|
||||
--
|
||||
cgit v0.12
|
||||
|
||||
From eddcbe8398fc7103fccd22aa6df6917caf0123bf Mon Sep 17 00:00:00 2001
|
||||
From: Eric Anholt <eric@anholt.net>
|
||||
Date: Wed, 1 Jun 2016 12:05:34 -0700
|
||||
Subject: clk: bcm2835: Mark GPIO clocks enabled at boot as critical
|
||||
|
||||
These divide off of PLLD_PER and are used for the ethernet and wifi
|
||||
PHYs source PLLs. Neither of them is currently represented by a phy
|
||||
device that would grab the clock for us.
|
||||
|
||||
This keeps other drivers from killing the networking PHYs when they
|
||||
disable their own clocks and trigger PLLD_PER's refcount going to 0.
|
||||
|
||||
Signed-off-by: Eric Anholt <eric@anholt.net>
|
||||
Acked-by: Martin Sperl <kernel@martin.sperl.org>
|
||||
Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
|
||||
---
|
||||
drivers/clk/bcm/clk-bcm2835.c | 10 +++++++++-
|
||||
1 file changed, 9 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/clk/bcm/clk-bcm2835.c b/drivers/clk/bcm/clk-bcm2835.c
|
||||
index d9db03c..400615b 100644
|
||||
--- a/drivers/clk/bcm/clk-bcm2835.c
|
||||
+++ b/drivers/clk/bcm/clk-bcm2835.c
|
||||
@@ -1239,6 +1239,12 @@ static struct clk *bcm2835_register_clock(struct bcm2835_cprman *cprman,
|
||||
} else {
|
||||
init.ops = &bcm2835_clock_clk_ops;
|
||||
init.flags |= CLK_SET_RATE_GATE | CLK_SET_PARENT_GATE;
|
||||
+
|
||||
+ /* If the clock wasn't actually enabled at boot, it's not
|
||||
+ * critical.
|
||||
+ */
|
||||
+ if (!(cprman_read(cprman, data->ctl_reg) & CM_ENABLE))
|
||||
+ init.flags &= ~CLK_IS_CRITICAL;
|
||||
}
|
||||
|
||||
clock = devm_kzalloc(cprman->dev, sizeof(*clock), GFP_KERNEL);
|
||||
@@ -1708,13 +1714,15 @@ static const struct bcm2835_clk_desc clk_desc_array[] = {
|
||||
.div_reg = CM_GP1DIV,
|
||||
.int_bits = 12,
|
||||
.frac_bits = 12,
|
||||
+ .flags = CLK_IS_CRITICAL,
|
||||
.is_mash_clock = true),
|
||||
[BCM2835_CLOCK_GP2] = REGISTER_PER_CLK(
|
||||
.name = "gp2",
|
||||
.ctl_reg = CM_GP2CTL,
|
||||
.div_reg = CM_GP2DIV,
|
||||
.int_bits = 12,
|
||||
- .frac_bits = 12),
|
||||
+ .frac_bits = 12,
|
||||
+ .flags = CLK_IS_CRITICAL),
|
||||
|
||||
/* HDMI state machine */
|
||||
[BCM2835_CLOCK_HSM] = REGISTER_PER_CLK(
|
||||
--
|
||||
cgit v0.12
|
||||
|
||||
From 9e400c5cc5c105e35216ac59a346f20cdd7613be Mon Sep 17 00:00:00 2001
|
||||
From: Eric Anholt <eric@anholt.net>
|
||||
Date: Wed, 1 Jun 2016 12:05:35 -0700
|
||||
Subject: clk: bcm2835: Mark the CM SDRAM clock's parent as critical
|
||||
|
||||
While the SDRAM is being driven by its dedicated PLL most of the time,
|
||||
there is a little loop running in the firmware that periodically turns
|
||||
on the CM SDRAM clock (using its pre-initialized parent) and switches
|
||||
SDRAM to using the CM clock to do PVT recalibration.
|
||||
|
||||
This avoids system hangs if we choose SDRAM's parent for some other
|
||||
clock, then disable that clock.
|
||||
|
||||
Signed-off-by: Eric Anholt <eric@anholt.net>
|
||||
Acked-by: Martin Sperl <kernel@martin.sperl.org>
|
||||
Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
|
||||
---
|
||||
drivers/clk/bcm/clk-bcm2835.c | 25 +++++++++++++++++++++++++
|
||||
1 file changed, 25 insertions(+)
|
||||
|
||||
diff --git a/drivers/clk/bcm/clk-bcm2835.c b/drivers/clk/bcm/clk-bcm2835.c
|
||||
index 400615b..c6420b3 100644
|
||||
--- a/drivers/clk/bcm/clk-bcm2835.c
|
||||
+++ b/drivers/clk/bcm/clk-bcm2835.c
|
||||
@@ -36,6 +36,7 @@
|
||||
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/clkdev.h>
|
||||
+#include <linux/clk.h>
|
||||
#include <linux/clk/bcm2835.h>
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/module.h>
|
||||
@@ -1801,6 +1802,25 @@ static const struct bcm2835_clk_desc clk_desc_array[] = {
|
||||
.ctl_reg = CM_PERIICTL),
|
||||
};
|
||||
|
||||
+/*
|
||||
+ * Permanently take a reference on the parent of the SDRAM clock.
|
||||
+ *
|
||||
+ * While the SDRAM is being driven by its dedicated PLL most of the
|
||||
+ * time, there is a little loop running in the firmware that
|
||||
+ * periodically switches the SDRAM to using our CM clock to do PVT
|
||||
+ * recalibration, with the assumption that the previously configured
|
||||
+ * SDRAM parent is still enabled and running.
|
||||
+ */
|
||||
+static int bcm2835_mark_sdc_parent_critical(struct clk *sdc)
|
||||
+{
|
||||
+ struct clk *parent = clk_get_parent(sdc);
|
||||
+
|
||||
+ if (IS_ERR(parent))
|
||||
+ return PTR_ERR(parent);
|
||||
+
|
||||
+ return clk_prepare_enable(parent);
|
||||
+}
|
||||
+
|
||||
static int bcm2835_clk_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
@@ -1810,6 +1830,7 @@ static int bcm2835_clk_probe(struct platform_device *pdev)
|
||||
const struct bcm2835_clk_desc *desc;
|
||||
const size_t asize = ARRAY_SIZE(clk_desc_array);
|
||||
size_t i;
|
||||
+ int ret;
|
||||
|
||||
cprman = devm_kzalloc(dev,
|
||||
sizeof(*cprman) + asize * sizeof(*clks),
|
||||
@@ -1840,6 +1861,10 @@ static int bcm2835_clk_probe(struct platform_device *pdev)
|
||||
clks[i] = desc->clk_register(cprman, desc->data);
|
||||
}
|
||||
|
||||
+ ret = bcm2835_mark_sdc_parent_critical(clks[BCM2835_CLOCK_SDRAM]);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
return of_clk_add_provider(dev->of_node, of_clk_src_onecell_get,
|
||||
&cprman->onecell);
|
||||
}
|
||||
--
|
||||
cgit v0.12
|
||||
|
||||
From 67615c588a059b731df9d019edc3c561d8006ec9 Mon Sep 17 00:00:00 2001
|
||||
From: Eric Anholt <eric@anholt.net>
|
||||
Date: Wed, 1 Jun 2016 12:05:36 -0700
|
||||
Subject: clk: bcm2835: Skip PLLC clocks when deciding on a new clock parent
|
||||
|
||||
If the firmware had set up a clock to source from PLLC, go along with
|
||||
it. But if we're looking for a new parent, we don't want to switch it
|
||||
to PLLC because the firmware will force PLLC (and thus the AXI bus
|
||||
clock) to different frequencies during over-temp/under-voltage,
|
||||
without notification to Linux.
|
||||
|
||||
On my system, this moves the Linux-enabled HDMI state machine and DSI1
|
||||
escape clock over to plld_per from pllc_per. EMMC still ends up on
|
||||
pllc_per, because the firmware had set it up to use that.
|
||||
|
||||
Signed-off-by: Eric Anholt <eric@anholt.net>
|
||||
Fixes: 41691b8862e2 ("clk: bcm2835: Add support for programming the audio domain clocks")
|
||||
Acked-by: Martin Sperl <kernel@martin.sperl.org>
|
||||
Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
|
||||
---
|
||||
drivers/clk/bcm/clk-bcm2835.c | 23 +++++++++++++++++++++++
|
||||
1 file changed, 23 insertions(+)
|
||||
|
||||
diff --git a/drivers/clk/bcm/clk-bcm2835.c b/drivers/clk/bcm/clk-bcm2835.c
|
||||
index c6420b3..e8a9646a 100644
|
||||
--- a/drivers/clk/bcm/clk-bcm2835.c
|
||||
+++ b/drivers/clk/bcm/clk-bcm2835.c
|
||||
@@ -1009,16 +1009,28 @@ static int bcm2835_clock_set_rate(struct clk_hw *hw,
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static bool
|
||||
+bcm2835_clk_is_pllc(struct clk_hw *hw)
|
||||
+{
|
||||
+ if (!hw)
|
||||
+ return false;
|
||||
+
|
||||
+ return strncmp(clk_hw_get_name(hw), "pllc", 4) == 0;
|
||||
+}
|
||||
+
|
||||
static int bcm2835_clock_determine_rate(struct clk_hw *hw,
|
||||
struct clk_rate_request *req)
|
||||
{
|
||||
struct bcm2835_clock *clock = bcm2835_clock_from_hw(hw);
|
||||
struct clk_hw *parent, *best_parent = NULL;
|
||||
+ bool current_parent_is_pllc;
|
||||
unsigned long rate, best_rate = 0;
|
||||
unsigned long prate, best_prate = 0;
|
||||
size_t i;
|
||||
u32 div;
|
||||
|
||||
+ current_parent_is_pllc = bcm2835_clk_is_pllc(clk_hw_get_parent(hw));
|
||||
+
|
||||
/*
|
||||
* Select parent clock that results in the closest but lower rate
|
||||
*/
|
||||
@@ -1026,6 +1038,17 @@ static int bcm2835_clock_determine_rate(struct clk_hw *hw,
|
||||
parent = clk_hw_get_parent_by_index(hw, i);
|
||||
if (!parent)
|
||||
continue;
|
||||
+
|
||||
+ /*
|
||||
+ * Don't choose a PLLC-derived clock as our parent
|
||||
+ * unless it had been manually set that way. PLLC's
|
||||
+ * frequency gets adjusted by the firmware due to
|
||||
+ * over-temp or under-voltage conditions, without
|
||||
+ * prior notification to our clock consumer.
|
||||
+ */
|
||||
+ if (bcm2835_clk_is_pllc(parent) && !current_parent_is_pllc)
|
||||
+ continue;
|
||||
+
|
||||
prate = clk_hw_get_rate(parent);
|
||||
div = bcm2835_clock_choose_div(hw, req->rate, prate, true);
|
||||
rate = bcm2835_clock_rate_from_divisor(clock, prate, div);
|
||||
--
|
||||
cgit v0.12
|
||||
|
||||
|
|
|
@ -1,95 +0,0 @@
|
|||
From 61d19a658598b2d3ea80a5a02a59d9ea0ff08ce6 Mon Sep 17 00:00:00 2001
|
||||
From: Laszlo Ersek <lersek@redhat.com>
|
||||
Date: Mon, 3 Oct 2016 19:43:03 +0200
|
||||
Subject: [PATCH] drm: virtio: reinstate drm_virtio_set_busid()
|
||||
|
||||
Before commit a325725633c2 ("drm: Lobotomize set_busid nonsense for !pci
|
||||
drivers"), several DRM drivers for platform devices used to expose an
|
||||
explicit "drm_driver.set_busid" callback, invariably backed by
|
||||
drm_platform_set_busid().
|
||||
|
||||
Commit a325725633c2 removed drm_platform_set_busid(), along with the
|
||||
referring .set_busid field initializations. This was justified because
|
||||
interchangeable functionality had been implemented in drm_dev_alloc() /
|
||||
drm_dev_init(), which DRM_IOCTL_SET_VERSION would rely on going forward.
|
||||
|
||||
However, commit a325725633c2 also removed drm_virtio_set_busid(), for
|
||||
which the same consolidation was not appropriate: this .set_busid callback
|
||||
had been implemented with drm_pci_set_busid(), and not
|
||||
drm_platform_set_busid(). The error regressed Xorg/xserver on QEMU's
|
||||
"virtio-vga" card; the drmGetBusid() function from libdrm would no longer
|
||||
return stable PCI identifiers like "pci:0000:00:02.0", but rather unstable
|
||||
platform ones like "virtio0".
|
||||
|
||||
Reinstate drm_virtio_set_busid() with judicious use of
|
||||
|
||||
git checkout -p a325725633c2^ -- drivers/gpu/drm/virtio
|
||||
|
||||
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
|
||||
Cc: Daniel Vetter <daniel.vetter@intel.com>
|
||||
Cc: David Airlie <airlied@redhat.com>
|
||||
Cc: Emil Velikov <emil.l.velikov@gmail.com>
|
||||
Cc: Gerd Hoffmann <kraxel@redhat.com>
|
||||
Cc: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
|
||||
Cc: Hans de Goede <hdegoede@redhat.com>
|
||||
Cc: Joachim Frieben <jfrieben@hotmail.com>
|
||||
Cc: stable@vger.kernel.org
|
||||
Reported-by: Joachim Frieben <jfrieben@hotmail.com>
|
||||
Fixes: a325725633c26aa66ab940f762a6b0778edf76c0
|
||||
Ref: https://bugzilla.redhat.com/show_bug.cgi?id=1366842
|
||||
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
|
||||
Reviewed-by: Emil Velikov <emil.l.velikov@gmail.com>
|
||||
---
|
||||
drivers/gpu/drm/virtio/virtgpu_drm_bus.c | 10 ++++++++++
|
||||
drivers/gpu/drm/virtio/virtgpu_drv.c | 1 +
|
||||
drivers/gpu/drm/virtio/virtgpu_drv.h | 1 +
|
||||
3 files changed, 12 insertions(+)
|
||||
|
||||
diff --git a/drivers/gpu/drm/virtio/virtgpu_drm_bus.c b/drivers/gpu/drm/virtio/virtgpu_drm_bus.c
|
||||
index 7f0e93f87a55..88a39165edd5 100644
|
||||
--- a/drivers/gpu/drm/virtio/virtgpu_drm_bus.c
|
||||
+++ b/drivers/gpu/drm/virtio/virtgpu_drm_bus.c
|
||||
@@ -27,6 +27,16 @@
|
||||
|
||||
#include "virtgpu_drv.h"
|
||||
|
||||
+int drm_virtio_set_busid(struct drm_device *dev, struct drm_master *master)
|
||||
+{
|
||||
+ struct pci_dev *pdev = dev->pdev;
|
||||
+
|
||||
+ if (pdev) {
|
||||
+ return drm_pci_set_busid(dev, master);
|
||||
+ }
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static void virtio_pci_kick_out_firmware_fb(struct pci_dev *pci_dev)
|
||||
{
|
||||
struct apertures_struct *ap;
|
||||
diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.c b/drivers/gpu/drm/virtio/virtgpu_drv.c
|
||||
index c13f70cfc461..5820b7020ae5 100644
|
||||
--- a/drivers/gpu/drm/virtio/virtgpu_drv.c
|
||||
+++ b/drivers/gpu/drm/virtio/virtgpu_drv.c
|
||||
@@ -117,6 +117,7 @@ static const struct file_operations virtio_gpu_driver_fops = {
|
||||
|
||||
static struct drm_driver driver = {
|
||||
.driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_PRIME | DRIVER_RENDER | DRIVER_ATOMIC,
|
||||
+ .set_busid = drm_virtio_set_busid,
|
||||
.load = virtio_gpu_driver_load,
|
||||
.unload = virtio_gpu_driver_unload,
|
||||
.open = virtio_gpu_driver_open,
|
||||
diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h b/drivers/gpu/drm/virtio/virtgpu_drv.h
|
||||
index b18ef3111f0c..acf556a35cb2 100644
|
||||
--- a/drivers/gpu/drm/virtio/virtgpu_drv.h
|
||||
+++ b/drivers/gpu/drm/virtio/virtgpu_drv.h
|
||||
@@ -49,6 +49,7 @@
|
||||
#define DRIVER_PATCHLEVEL 1
|
||||
|
||||
/* virtgpu_drm_bus.c */
|
||||
+int drm_virtio_set_busid(struct drm_device *dev, struct drm_master *master);
|
||||
int drm_virtio_init(struct drm_driver *driver, struct virtio_device *vdev);
|
||||
|
||||
struct virtio_gpu_object {
|
||||
--
|
||||
2.7.4
|
||||
|
File diff suppressed because it is too large
Load Diff
17
kernel.spec
17
kernel.spec
|
@ -42,7 +42,7 @@ Summary: The Linux kernel
|
|||
# For non-released -rc kernels, this will be appended after the rcX and
|
||||
# gitX tags, so a 3 here would become part of release "0.rcX.gitX.3"
|
||||
#
|
||||
%global baserelease 300
|
||||
%global baserelease 301
|
||||
%global fedora_build %{baserelease}
|
||||
|
||||
# base_sublevel is the kernel version we're starting with and patching
|
||||
|
@ -55,7 +55,7 @@ Summary: The Linux kernel
|
|||
|
||||
# Do we have a -stable update to apply?
|
||||
#+Hu Pf against 4.8.2 v4.8-pf2: https://pf.natalenko.name/news/?p=207
|
||||
%define stable_update 2
|
||||
%define stable_update 4
|
||||
# Set rpm version accordingly
|
||||
%if 0%{?stable_update}
|
||||
%define stablerev %{stable_update}
|
||||
|
@ -630,15 +630,14 @@ Patch848: 0001-cpupower-Correct-return-type-of-cpu_power_is_cpu_onl.patch
|
|||
#ongoing complaint, full discussion delayed until ksummit/plumbers
|
||||
Patch849: 0001-iio-Use-event-header-from-kernel-tree.patch
|
||||
|
||||
#CVE-2016-7425 rhbz 1377330 1377331
|
||||
Patch850: arcmsr-buffer-overflow-in-archmsr_iop_message_xfer.patch
|
||||
# CVE-2016-9083 CVE-2016-9084 rhbz 1389258 1389259 1389285
|
||||
Patch850: v3-vfio-pci-Fix-integer-overflows-bitmask-check.patch
|
||||
|
||||
#rhbz 1366842
|
||||
Patch851: drm-virtio-reinstate-drm_virtio_set_busid.patch
|
||||
# Skylake i915 fixes from 4.9
|
||||
Patch851: drm_i915_skl_Backport_watermark_fixes_for_4.8.y.patch
|
||||
|
||||
# Fix memory corruption caused by p8_ghash
|
||||
Patch852: 0001-crypto-ghash-generic-move-common-definitions-to-a-ne.patch
|
||||
Patch853: 0001-crypto-vmx-Fix-memory-corruption-caused-by-p8_ghash.patch
|
||||
#rhbz 1325354
|
||||
Patch852: 0001-HID-input-ignore-System-Control-application-usages-i.patch
|
||||
|
||||
# END OF PATCH DEFINITIONS
|
||||
|
||||
|
|
2
sources
2
sources
|
@ -1,3 +1,3 @@
|
|||
c1af0afbd3df35c1ccdc7a5118cd2d07 linux-4.8.tar.xz
|
||||
0dad03f586e835d538d3e0d2cbdb9a28 perf-man-4.8.tar.gz
|
||||
9e430392b1cc430522fa7b27fc4301fc patch-4.8.3.xz
|
||||
4d85e2c59ec33dd7766e18d079e75114 patch-4.8.4.xz
|
||||
|
|
|
@ -0,0 +1,102 @@
|
|||
From patchwork Wed Oct 12 16:51:24 2016
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
MIME-Version: 1.0
|
||||
Content-Transfer-Encoding: 7bit
|
||||
Subject: [v3] vfio/pci: Fix integer overflows, bitmask check
|
||||
From: Vlad Tsyrklevich <vlad@tsyrklevich.net>
|
||||
X-Patchwork-Id: 9373631
|
||||
Message-Id: <1476291084-50737-1-git-send-email-vlad@tsyrklevich.net>
|
||||
To: kvm@vger.kernel.org
|
||||
Cc: alex.williamson@redhat.com, Vlad Tsyrklevich <vlad@tsyrklevich.net>
|
||||
Date: Wed, 12 Oct 2016 18:51:24 +0200
|
||||
|
||||
The VFIO_DEVICE_SET_IRQS ioctl did not sufficiently sanitize
|
||||
user-supplied integers, potentially allowing memory corruption. This
|
||||
patch adds appropriate integer overflow checks, checks the range bounds
|
||||
for VFIO_IRQ_SET_DATA_NONE, and also verifies that only single element
|
||||
in the VFIO_IRQ_SET_DATA_TYPE_MASK bitmask is set.
|
||||
VFIO_IRQ_SET_ACTION_TYPE_MASK is already correctly checked later in
|
||||
vfio_pci_set_irqs_ioctl().
|
||||
|
||||
Furthermore, a kzalloc is changed to a kcalloc because the use of a
|
||||
kzalloc with an integer multiplication allowed an integer overflow
|
||||
condition to be reached without this patch. kcalloc checks for overflow
|
||||
and should prevent a similar occurrence.
|
||||
|
||||
Signed-off-by: Vlad Tsyrklevich <vlad@tsyrklevich.net>
|
||||
---
|
||||
drivers/vfio/pci/vfio_pci.c | 33 +++++++++++++++++++++------------
|
||||
drivers/vfio/pci/vfio_pci_intrs.c | 2 +-
|
||||
2 files changed, 22 insertions(+), 13 deletions(-)
|
||||
|
||||
diff --git a/drivers/vfio/pci/vfio_pci.c b/drivers/vfio/pci/vfio_pci.c
|
||||
index d624a52..031bc08 100644
|
||||
--- a/drivers/vfio/pci/vfio_pci.c
|
||||
+++ b/drivers/vfio/pci/vfio_pci.c
|
||||
@@ -829,8 +829,9 @@ static long vfio_pci_ioctl(void *device_data,
|
||||
|
||||
} else if (cmd == VFIO_DEVICE_SET_IRQS) {
|
||||
struct vfio_irq_set hdr;
|
||||
+ size_t size;
|
||||
u8 *data = NULL;
|
||||
- int ret = 0;
|
||||
+ int max, ret = 0;
|
||||
|
||||
minsz = offsetofend(struct vfio_irq_set, count);
|
||||
|
||||
@@ -838,23 +839,31 @@ static long vfio_pci_ioctl(void *device_data,
|
||||
return -EFAULT;
|
||||
|
||||
if (hdr.argsz < minsz || hdr.index >= VFIO_PCI_NUM_IRQS ||
|
||||
+ hdr.count >= (U32_MAX - hdr.start) ||
|
||||
hdr.flags & ~(VFIO_IRQ_SET_DATA_TYPE_MASK |
|
||||
VFIO_IRQ_SET_ACTION_TYPE_MASK))
|
||||
return -EINVAL;
|
||||
|
||||
- if (!(hdr.flags & VFIO_IRQ_SET_DATA_NONE)) {
|
||||
- size_t size;
|
||||
- int max = vfio_pci_get_irq_count(vdev, hdr.index);
|
||||
+ max = vfio_pci_get_irq_count(vdev, hdr.index);
|
||||
+ if (hdr.start >= max || hdr.start + hdr.count > max)
|
||||
+ return -EINVAL;
|
||||
|
||||
- if (hdr.flags & VFIO_IRQ_SET_DATA_BOOL)
|
||||
- size = sizeof(uint8_t);
|
||||
- else if (hdr.flags & VFIO_IRQ_SET_DATA_EVENTFD)
|
||||
- size = sizeof(int32_t);
|
||||
- else
|
||||
- return -EINVAL;
|
||||
+ switch (hdr.flags & VFIO_IRQ_SET_DATA_TYPE_MASK) {
|
||||
+ case VFIO_IRQ_SET_DATA_NONE:
|
||||
+ size = 0;
|
||||
+ break;
|
||||
+ case VFIO_IRQ_SET_DATA_BOOL:
|
||||
+ size = sizeof(uint8_t);
|
||||
+ break;
|
||||
+ case VFIO_IRQ_SET_DATA_EVENTFD:
|
||||
+ size = sizeof(int32_t);
|
||||
+ break;
|
||||
+ default:
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
|
||||
- if (hdr.argsz - minsz < hdr.count * size ||
|
||||
- hdr.start >= max || hdr.start + hdr.count > max)
|
||||
+ if (size) {
|
||||
+ if (hdr.argsz - minsz < hdr.count * size)
|
||||
return -EINVAL;
|
||||
|
||||
data = memdup_user((void __user *)(arg + minsz),
|
||||
diff --git a/drivers/vfio/pci/vfio_pci_intrs.c b/drivers/vfio/pci/vfio_pci_intrs.c
|
||||
index c2e6089..1c46045 100644
|
||||
--- a/drivers/vfio/pci/vfio_pci_intrs.c
|
||||
+++ b/drivers/vfio/pci/vfio_pci_intrs.c
|
||||
@@ -256,7 +256,7 @@ static int vfio_msi_enable(struct vfio_pci_device *vdev, int nvec, bool msix)
|
||||
if (!is_irq_none(vdev))
|
||||
return -EINVAL;
|
||||
|
||||
- vdev->ctx = kzalloc(nvec * sizeof(struct vfio_pci_irq_ctx), GFP_KERNEL);
|
||||
+ vdev->ctx = kcalloc(nvec, sizeof(struct vfio_pci_irq_ctx), GFP_KERNEL);
|
||||
if (!vdev->ctx)
|
||||
return -ENOMEM;
|
||||
|
Loading…
Reference in New Issue