summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to '4.8.7/1005_linux-4.8.6.patch')
-rw-r--r--4.8.7/1005_linux-4.8.6.patch5137
1 files changed, 0 insertions, 5137 deletions
diff --git a/4.8.7/1005_linux-4.8.6.patch b/4.8.7/1005_linux-4.8.6.patch
deleted file mode 100644
index 641ba27..0000000
--- a/4.8.7/1005_linux-4.8.6.patch
+++ /dev/null
@@ -1,5137 +0,0 @@
-diff --git a/Makefile b/Makefile
-index daa3a01..b249529 100644
---- a/Makefile
-+++ b/Makefile
-@@ -1,6 +1,6 @@
- VERSION = 4
- PATCHLEVEL = 8
--SUBLEVEL = 5
-+SUBLEVEL = 6
- EXTRAVERSION =
- NAME = Psychotic Stoned Sheep
-
-diff --git a/arch/arm/boot/dts/arm-realview-eb.dtsi b/arch/arm/boot/dts/arm-realview-eb.dtsi
-index 1c6a040..e2e9599 100644
---- a/arch/arm/boot/dts/arm-realview-eb.dtsi
-+++ b/arch/arm/boot/dts/arm-realview-eb.dtsi
-@@ -51,14 +51,6 @@
- regulator-boot-on;
- };
-
-- veth: fixedregulator@0 {
-- compatible = "regulator-fixed";
-- regulator-name = "veth";
-- regulator-min-microvolt = <3300000>;
-- regulator-max-microvolt = <3300000>;
-- regulator-boot-on;
-- };
--
- xtal24mhz: xtal24mhz@24M {
- #clock-cells = <0>;
- compatible = "fixed-clock";
-@@ -134,16 +126,15 @@
- bank-width = <4>;
- };
-
-- /* SMSC 9118 ethernet with PHY and EEPROM */
-+ /* SMSC LAN91C111 ethernet with PHY and EEPROM */
- ethernet: ethernet@4e000000 {
-- compatible = "smsc,lan9118", "smsc,lan9115";
-+ compatible = "smsc,lan91c111";
- reg = <0x4e000000 0x10000>;
-- phy-mode = "mii";
-- reg-io-width = <4>;
-- smsc,irq-active-high;
-- smsc,irq-push-pull;
-- vdd33a-supply = <&veth>;
-- vddvario-supply = <&veth>;
-+ /*
-+ * This means the adapter can be accessed with 8, 16 or
-+ * 32 bit reads/writes.
-+ */
-+ reg-io-width = <7>;
- };
-
- usb: usb@4f000000 {
-diff --git a/arch/arm/boot/dts/bcm958625hr.dts b/arch/arm/boot/dts/bcm958625hr.dts
-index 03b8bbe..652418a 100644
---- a/arch/arm/boot/dts/bcm958625hr.dts
-+++ b/arch/arm/boot/dts/bcm958625hr.dts
-@@ -47,7 +47,8 @@
- };
-
- memory {
-- reg = <0x60000000 0x20000000>;
-+ device_type = "memory";
-+ reg = <0x60000000 0x80000000>;
- };
- };
-
-diff --git a/arch/arm/boot/dts/omap3-overo-common-lcd35.dtsi b/arch/arm/boot/dts/omap3-overo-common-lcd35.dtsi
-index ca86da6..854117d 100644
---- a/arch/arm/boot/dts/omap3-overo-common-lcd35.dtsi
-+++ b/arch/arm/boot/dts/omap3-overo-common-lcd35.dtsi
-@@ -119,7 +119,7 @@
- pinctrl-names = "default";
- pinctrl-0 = <&mcspi1_pins>;
-
-- lcd0: display {
-+ lcd0: display@1 {
- compatible = "lgphilips,lb035q02";
- label = "lcd35";
-
-diff --git a/arch/arm/boot/dts/sun9i-a80.dtsi b/arch/arm/boot/dts/sun9i-a80.dtsi
-index f68b324..3f528a3 100644
---- a/arch/arm/boot/dts/sun9i-a80.dtsi
-+++ b/arch/arm/boot/dts/sun9i-a80.dtsi
-@@ -899,8 +899,7 @@
- resets = <&apbs_rst 0>;
- gpio-controller;
- interrupt-controller;
-- #address-cells = <1>;
-- #size-cells = <0>;
-+ #interrupt-cells = <3>;
- #gpio-cells = <3>;
-
- r_ir_pins: r_ir {
-diff --git a/arch/arm/crypto/ghash-ce-glue.c b/arch/arm/crypto/ghash-ce-glue.c
-index 1568cb5..b88364a 100644
---- a/arch/arm/crypto/ghash-ce-glue.c
-+++ b/arch/arm/crypto/ghash-ce-glue.c
-@@ -220,6 +220,27 @@ static int ghash_async_digest(struct ahash_request *req)
- }
- }
-
-+static int ghash_async_import(struct ahash_request *req, const void *in)
-+{
-+ struct ahash_request *cryptd_req = ahash_request_ctx(req);
-+ struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
-+ struct ghash_async_ctx *ctx = crypto_ahash_ctx(tfm);
-+ struct shash_desc *desc = cryptd_shash_desc(cryptd_req);
-+
-+ desc->tfm = cryptd_ahash_child(ctx->cryptd_tfm);
-+ desc->flags = req->base.flags;
-+
-+ return crypto_shash_import(desc, in);
-+}
-+
-+static int ghash_async_export(struct ahash_request *req, void *out)
-+{
-+ struct ahash_request *cryptd_req = ahash_request_ctx(req);
-+ struct shash_desc *desc = cryptd_shash_desc(cryptd_req);
-+
-+ return crypto_shash_export(desc, out);
-+}
-+
- static int ghash_async_setkey(struct crypto_ahash *tfm, const u8 *key,
- unsigned int keylen)
- {
-@@ -268,7 +289,10 @@ static struct ahash_alg ghash_async_alg = {
- .final = ghash_async_final,
- .setkey = ghash_async_setkey,
- .digest = ghash_async_digest,
-+ .import = ghash_async_import,
-+ .export = ghash_async_export,
- .halg.digestsize = GHASH_DIGEST_SIZE,
-+ .halg.statesize = sizeof(struct ghash_desc_ctx),
- .halg.base = {
- .cra_name = "ghash",
- .cra_driver_name = "ghash-ce",
-diff --git a/arch/arm/mach-pxa/corgi_pm.c b/arch/arm/mach-pxa/corgi_pm.c
-index d920681..c71c483 100644
---- a/arch/arm/mach-pxa/corgi_pm.c
-+++ b/arch/arm/mach-pxa/corgi_pm.c
-@@ -131,16 +131,11 @@ static int corgi_should_wakeup(unsigned int resume_on_alarm)
- return is_resume;
- }
-
--static unsigned long corgi_charger_wakeup(void)
-+static bool corgi_charger_wakeup(void)
- {
-- unsigned long ret;
--
-- ret = (!gpio_get_value(CORGI_GPIO_AC_IN) << GPIO_bit(CORGI_GPIO_AC_IN))
-- | (!gpio_get_value(CORGI_GPIO_KEY_INT)
-- << GPIO_bit(CORGI_GPIO_KEY_INT))
-- | (!gpio_get_value(CORGI_GPIO_WAKEUP)
-- << GPIO_bit(CORGI_GPIO_WAKEUP));
-- return ret;
-+ return !gpio_get_value(CORGI_GPIO_AC_IN) ||
-+ !gpio_get_value(CORGI_GPIO_KEY_INT) ||
-+ !gpio_get_value(CORGI_GPIO_WAKEUP);
- }
-
- unsigned long corgipm_read_devdata(int type)
-diff --git a/arch/arm/mach-pxa/pxa_cplds_irqs.c b/arch/arm/mach-pxa/pxa_cplds_irqs.c
-index 2385052..e362f86 100644
---- a/arch/arm/mach-pxa/pxa_cplds_irqs.c
-+++ b/arch/arm/mach-pxa/pxa_cplds_irqs.c
-@@ -41,30 +41,35 @@ static irqreturn_t cplds_irq_handler(int in_irq, void *d)
- unsigned long pending;
- unsigned int bit;
-
-- pending = readl(fpga->base + FPGA_IRQ_SET_CLR) & fpga->irq_mask;
-- for_each_set_bit(bit, &pending, CPLDS_NB_IRQ)
-- generic_handle_irq(irq_find_mapping(fpga->irqdomain, bit));
-+ do {
-+ pending = readl(fpga->base + FPGA_IRQ_SET_CLR) & fpga->irq_mask;
-+ for_each_set_bit(bit, &pending, CPLDS_NB_IRQ) {
-+ generic_handle_irq(irq_find_mapping(fpga->irqdomain,
-+ bit));
-+ }
-+ } while (pending);
-
- return IRQ_HANDLED;
- }
-
--static void cplds_irq_mask_ack(struct irq_data *d)
-+static void cplds_irq_mask(struct irq_data *d)
- {
- struct cplds *fpga = irq_data_get_irq_chip_data(d);
- unsigned int cplds_irq = irqd_to_hwirq(d);
-- unsigned int set, bit = BIT(cplds_irq);
-+ unsigned int bit = BIT(cplds_irq);
-
- fpga->irq_mask &= ~bit;
- writel(fpga->irq_mask, fpga->base + FPGA_IRQ_MASK_EN);
-- set = readl(fpga->base + FPGA_IRQ_SET_CLR);
-- writel(set & ~bit, fpga->base + FPGA_IRQ_SET_CLR);
- }
-
- static void cplds_irq_unmask(struct irq_data *d)
- {
- struct cplds *fpga = irq_data_get_irq_chip_data(d);
- unsigned int cplds_irq = irqd_to_hwirq(d);
-- unsigned int bit = BIT(cplds_irq);
-+ unsigned int set, bit = BIT(cplds_irq);
-+
-+ set = readl(fpga->base + FPGA_IRQ_SET_CLR);
-+ writel(set & ~bit, fpga->base + FPGA_IRQ_SET_CLR);
-
- fpga->irq_mask |= bit;
- writel(fpga->irq_mask, fpga->base + FPGA_IRQ_MASK_EN);
-@@ -72,7 +77,8 @@ static void cplds_irq_unmask(struct irq_data *d)
-
- static struct irq_chip cplds_irq_chip = {
- .name = "pxa_cplds",
-- .irq_mask_ack = cplds_irq_mask_ack,
-+ .irq_ack = cplds_irq_mask,
-+ .irq_mask = cplds_irq_mask,
- .irq_unmask = cplds_irq_unmask,
- .flags = IRQCHIP_MASK_ON_SUSPEND | IRQCHIP_SKIP_SET_WAKE,
- };
-diff --git a/arch/arm/mach-pxa/sharpsl_pm.c b/arch/arm/mach-pxa/sharpsl_pm.c
-index b80eab9..249b7bd 100644
---- a/arch/arm/mach-pxa/sharpsl_pm.c
-+++ b/arch/arm/mach-pxa/sharpsl_pm.c
-@@ -744,7 +744,7 @@ static int sharpsl_off_charge_battery(void)
- time = RCNR;
- while (1) {
- /* Check if any wakeup event had occurred */
-- if (sharpsl_pm.machinfo->charger_wakeup() != 0)
-+ if (sharpsl_pm.machinfo->charger_wakeup())
- return 0;
- /* Check for timeout */
- if ((RCNR - time) > SHARPSL_WAIT_CO_TIME)
-diff --git a/arch/arm/mach-pxa/sharpsl_pm.h b/arch/arm/mach-pxa/sharpsl_pm.h
-index 905be67..fa75b6d 100644
---- a/arch/arm/mach-pxa/sharpsl_pm.h
-+++ b/arch/arm/mach-pxa/sharpsl_pm.h
-@@ -34,7 +34,7 @@ struct sharpsl_charger_machinfo {
- #define SHARPSL_STATUS_LOCK 5
- #define SHARPSL_STATUS_CHRGFULL 6
- #define SHARPSL_STATUS_FATAL 7
-- unsigned long (*charger_wakeup)(void);
-+ bool (*charger_wakeup)(void);
- int (*should_wakeup)(unsigned int resume_on_alarm);
- void (*backlight_limit)(int);
- int (*backlight_get_status) (void);
-diff --git a/arch/arm/mach-pxa/spitz_pm.c b/arch/arm/mach-pxa/spitz_pm.c
-index ea9f903..4e64a14 100644
---- a/arch/arm/mach-pxa/spitz_pm.c
-+++ b/arch/arm/mach-pxa/spitz_pm.c
-@@ -165,13 +165,10 @@ static int spitz_should_wakeup(unsigned int resume_on_alarm)
- return is_resume;
- }
-
--static unsigned long spitz_charger_wakeup(void)
-+static bool spitz_charger_wakeup(void)
- {
-- unsigned long ret;
-- ret = ((!gpio_get_value(SPITZ_GPIO_KEY_INT)
-- << GPIO_bit(SPITZ_GPIO_KEY_INT))
-- | gpio_get_value(SPITZ_GPIO_SYNC));
-- return ret;
-+ return !gpio_get_value(SPITZ_GPIO_KEY_INT) ||
-+ gpio_get_value(SPITZ_GPIO_SYNC);
- }
-
- unsigned long spitzpm_read_devdata(int type)
-diff --git a/arch/powerpc/include/asm/book3s/64/pgtable.h b/arch/powerpc/include/asm/book3s/64/pgtable.h
-index 263bf39..9bd84ba 100644
---- a/arch/powerpc/include/asm/book3s/64/pgtable.h
-+++ b/arch/powerpc/include/asm/book3s/64/pgtable.h
-@@ -6,6 +6,8 @@
- */
- #define _PAGE_BIT_SWAP_TYPE 0
-
-+#define _PAGE_RO 0
-+
- #define _PAGE_EXEC 0x00001 /* execute permission */
- #define _PAGE_WRITE 0x00002 /* write access allowed */
- #define _PAGE_READ 0x00004 /* read access allowed */
-diff --git a/arch/powerpc/kernel/nvram_64.c b/arch/powerpc/kernel/nvram_64.c
-index 64174bf..05a0a91 100644
---- a/arch/powerpc/kernel/nvram_64.c
-+++ b/arch/powerpc/kernel/nvram_64.c
-@@ -956,7 +956,7 @@ int __init nvram_remove_partition(const char *name, int sig,
-
- /* Make partition a free partition */
- part->header.signature = NVRAM_SIG_FREE;
-- strncpy(part->header.name, "wwwwwwwwwwww", 12);
-+ memset(part->header.name, 'w', 12);
- part->header.checksum = nvram_checksum(&part->header);
- rc = nvram_write_header(part);
- if (rc <= 0) {
-@@ -974,8 +974,8 @@ int __init nvram_remove_partition(const char *name, int sig,
- }
- if (prev) {
- prev->header.length += part->header.length;
-- prev->header.checksum = nvram_checksum(&part->header);
-- rc = nvram_write_header(part);
-+ prev->header.checksum = nvram_checksum(&prev->header);
-+ rc = nvram_write_header(prev);
- if (rc <= 0) {
- printk(KERN_ERR "nvram_remove_partition: nvram_write failed (%d)\n", rc);
- return rc;
-diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c
-index 9ee2623..ad37aa1 100644
---- a/arch/powerpc/kernel/process.c
-+++ b/arch/powerpc/kernel/process.c
-@@ -88,7 +88,13 @@ static void check_if_tm_restore_required(struct task_struct *tsk)
- set_thread_flag(TIF_RESTORE_TM);
- }
- }
-+
-+static inline bool msr_tm_active(unsigned long msr)
-+{
-+ return MSR_TM_ACTIVE(msr);
-+}
- #else
-+static inline bool msr_tm_active(unsigned long msr) { return false; }
- static inline void check_if_tm_restore_required(struct task_struct *tsk) { }
- #endif /* CONFIG_PPC_TRANSACTIONAL_MEM */
-
-@@ -208,7 +214,7 @@ void enable_kernel_fp(void)
- EXPORT_SYMBOL(enable_kernel_fp);
-
- static int restore_fp(struct task_struct *tsk) {
-- if (tsk->thread.load_fp) {
-+ if (tsk->thread.load_fp || msr_tm_active(tsk->thread.regs->msr)) {
- load_fp_state(&current->thread.fp_state);
- current->thread.load_fp++;
- return 1;
-@@ -278,7 +284,8 @@ EXPORT_SYMBOL_GPL(flush_altivec_to_thread);
-
- static int restore_altivec(struct task_struct *tsk)
- {
-- if (cpu_has_feature(CPU_FTR_ALTIVEC) && tsk->thread.load_vec) {
-+ if (cpu_has_feature(CPU_FTR_ALTIVEC) &&
-+ (tsk->thread.load_vec || msr_tm_active(tsk->thread.regs->msr))) {
- load_vr_state(&tsk->thread.vr_state);
- tsk->thread.used_vr = 1;
- tsk->thread.load_vec++;
-@@ -438,6 +445,7 @@ void giveup_all(struct task_struct *tsk)
- return;
-
- msr_check_and_set(msr_all_available);
-+ check_if_tm_restore_required(tsk);
-
- #ifdef CONFIG_PPC_FPU
- if (usermsr & MSR_FP)
-@@ -464,7 +472,8 @@ void restore_math(struct pt_regs *regs)
- {
- unsigned long msr;
-
-- if (!current->thread.load_fp && !loadvec(current->thread))
-+ if (!msr_tm_active(regs->msr) &&
-+ !current->thread.load_fp && !loadvec(current->thread))
- return;
-
- msr = regs->msr;
-@@ -983,6 +992,13 @@ void restore_tm_state(struct pt_regs *regs)
- msr_diff = current->thread.ckpt_regs.msr & ~regs->msr;
- msr_diff &= MSR_FP | MSR_VEC | MSR_VSX;
-
-+ /* Ensure that restore_math() will restore */
-+ if (msr_diff & MSR_FP)
-+ current->thread.load_fp = 1;
-+#ifdef CONFIG_ALIVEC
-+ if (cpu_has_feature(CPU_FTR_ALTIVEC) && msr_diff & MSR_VEC)
-+ current->thread.load_vec = 1;
-+#endif
- restore_math(regs);
-
- regs->msr |= msr_diff;
-diff --git a/arch/powerpc/mm/hugetlbpage.c b/arch/powerpc/mm/hugetlbpage.c
-index 7372ee1..a5d3ecd 100644
---- a/arch/powerpc/mm/hugetlbpage.c
-+++ b/arch/powerpc/mm/hugetlbpage.c
-@@ -1019,8 +1019,15 @@ int gup_hugepte(pte_t *ptep, unsigned long sz, unsigned long addr,
-
- pte = READ_ONCE(*ptep);
- mask = _PAGE_PRESENT | _PAGE_READ;
-+
-+ /*
-+ * On some CPUs like the 8xx, _PAGE_RW hence _PAGE_WRITE is defined
-+ * as 0 and _PAGE_RO has to be set when a page is not writable
-+ */
- if (write)
- mask |= _PAGE_WRITE;
-+ else
-+ mask |= _PAGE_RO;
-
- if ((pte_val(pte) & mask) != mask)
- return 0;
-diff --git a/arch/x86/kernel/early-quirks.c b/arch/x86/kernel/early-quirks.c
-index de7501e..8b8852b 100644
---- a/arch/x86/kernel/early-quirks.c
-+++ b/arch/x86/kernel/early-quirks.c
-@@ -317,16 +317,11 @@ static phys_addr_t __init i85x_stolen_base(int num, int slot, int func,
- static phys_addr_t __init i865_stolen_base(int num, int slot, int func,
- size_t stolen_size)
- {
-- u16 toud;
-+ u16 toud = 0;
-
-- /*
-- * FIXME is the graphics stolen memory region
-- * always at TOUD? Ie. is it always the last
-- * one to be allocated by the BIOS?
-- */
- toud = read_pci_config_16(0, 0, 0, I865_TOUD);
-
-- return (phys_addr_t)toud << 16;
-+ return (phys_addr_t)(toud << 16) + i845_tseg_size();
- }
-
- static phys_addr_t __init gen3_stolen_base(int num, int slot, int func,
-diff --git a/crypto/gcm.c b/crypto/gcm.c
-index 70a892e8..f624ac9 100644
---- a/crypto/gcm.c
-+++ b/crypto/gcm.c
-@@ -117,7 +117,7 @@ static int crypto_gcm_setkey(struct crypto_aead *aead, const u8 *key,
- struct crypto_skcipher *ctr = ctx->ctr;
- struct {
- be128 hash;
-- u8 iv[8];
-+ u8 iv[16];
-
- struct crypto_gcm_setkey_result result;
-
-diff --git a/drivers/char/hw_random/omap-rng.c b/drivers/char/hw_random/omap-rng.c
-index 01d4be2..f5c26a5 100644
---- a/drivers/char/hw_random/omap-rng.c
-+++ b/drivers/char/hw_random/omap-rng.c
-@@ -385,7 +385,7 @@ static int omap_rng_probe(struct platform_device *pdev)
-
- pm_runtime_enable(&pdev->dev);
- ret = pm_runtime_get_sync(&pdev->dev);
-- if (ret) {
-+ if (ret < 0) {
- dev_err(&pdev->dev, "Failed to runtime_get device: %d\n", ret);
- pm_runtime_put_noidle(&pdev->dev);
- goto err_ioremap;
-@@ -443,7 +443,7 @@ static int __maybe_unused omap_rng_resume(struct device *dev)
- int ret;
-
- ret = pm_runtime_get_sync(dev);
-- if (ret) {
-+ if (ret < 0) {
- dev_err(dev, "Failed to runtime_get device: %d\n", ret);
- pm_runtime_put_noidle(dev);
- return ret;
-diff --git a/drivers/clk/bcm/clk-bcm2835.c b/drivers/clk/bcm/clk-bcm2835.c
-index 7a79708..0fc71cb 100644
---- a/drivers/clk/bcm/clk-bcm2835.c
-+++ b/drivers/clk/bcm/clk-bcm2835.c
-@@ -1006,16 +1006,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
- */
-@@ -1023,6 +1035,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);
-diff --git a/drivers/clk/clk-divider.c b/drivers/clk/clk-divider.c
-index a0f55bc..96386ff 100644
---- a/drivers/clk/clk-divider.c
-+++ b/drivers/clk/clk-divider.c
-@@ -352,7 +352,7 @@ static long clk_divider_round_rate(struct clk_hw *hw, unsigned long rate,
-
- /* if read only, just return current value */
- if (divider->flags & CLK_DIVIDER_READ_ONLY) {
-- bestdiv = readl(divider->reg) >> divider->shift;
-+ bestdiv = clk_readl(divider->reg) >> divider->shift;
- bestdiv &= div_mask(divider->width);
- bestdiv = _get_div(divider->table, bestdiv, divider->flags,
- divider->width);
-diff --git a/drivers/clk/clk-qoriq.c b/drivers/clk/clk-qoriq.c
-index 58566a17..20b1055 100644
---- a/drivers/clk/clk-qoriq.c
-+++ b/drivers/clk/clk-qoriq.c
-@@ -766,7 +766,11 @@ static struct clk * __init create_one_cmux(struct clockgen *cg, int idx)
- if (!hwc)
- return NULL;
-
-- hwc->reg = cg->regs + 0x20 * idx;
-+ if (cg->info.flags & CG_VER3)
-+ hwc->reg = cg->regs + 0x70000 + 0x20 * idx;
-+ else
-+ hwc->reg = cg->regs + 0x20 * idx;
-+
- hwc->info = cg->info.cmux_groups[cg->info.cmux_to_group[idx]];
-
- /*
-diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
-index 820a939..2877a4d 100644
---- a/drivers/clk/clk.c
-+++ b/drivers/clk/clk.c
-@@ -1908,10 +1908,6 @@ int clk_set_phase(struct clk *clk, int degrees)
-
- clk_prepare_lock();
-
-- /* bail early if nothing to do */
-- if (degrees == clk->core->phase)
-- goto out;
--
- trace_clk_set_phase(clk->core, degrees);
-
- if (clk->core->ops->set_phase)
-@@ -1922,7 +1918,6 @@ int clk_set_phase(struct clk *clk, int degrees)
- if (!ret)
- clk->core->phase = degrees;
-
--out:
- clk_prepare_unlock();
-
- return ret;
-@@ -3186,7 +3181,7 @@ struct clk *__of_clk_get_from_provider(struct of_phandle_args *clkspec,
- {
- struct of_clk_provider *provider;
- struct clk *clk = ERR_PTR(-EPROBE_DEFER);
-- struct clk_hw *hw = ERR_PTR(-EPROBE_DEFER);
-+ struct clk_hw *hw;
-
- if (!clkspec)
- return ERR_PTR(-EINVAL);
-@@ -3194,12 +3189,13 @@ struct clk *__of_clk_get_from_provider(struct of_phandle_args *clkspec,
- /* Check if we have such a provider in our array */
- mutex_lock(&of_clk_mutex);
- list_for_each_entry(provider, &of_clk_providers, link) {
-- if (provider->node == clkspec->np)
-+ if (provider->node == clkspec->np) {
- hw = __of_clk_get_hw_from_provider(provider, clkspec);
-- if (!IS_ERR(hw)) {
- clk = __clk_create_clk(hw, dev_id, con_id);
-+ }
-
-- if (!IS_ERR(clk) && !__clk_get(clk)) {
-+ if (!IS_ERR(clk)) {
-+ if (!__clk_get(clk)) {
- __clk_free_clk(clk);
- clk = ERR_PTR(-ENOENT);
- }
-diff --git a/drivers/clk/imx/clk-imx35.c b/drivers/clk/imx/clk-imx35.c
-index b0978d3..d302ed3 100644
---- a/drivers/clk/imx/clk-imx35.c
-+++ b/drivers/clk/imx/clk-imx35.c
-@@ -115,7 +115,7 @@ static void __init _mx35_clocks_init(void)
- }
-
- clk[ckih] = imx_clk_fixed("ckih", 24000000);
-- clk[ckil] = imx_clk_fixed("ckih", 32768);
-+ clk[ckil] = imx_clk_fixed("ckil", 32768);
- clk[mpll] = imx_clk_pllv1(IMX_PLLV1_IMX35, "mpll", "ckih", base + MX35_CCM_MPCTL);
- clk[ppll] = imx_clk_pllv1(IMX_PLLV1_IMX35, "ppll", "ckih", base + MX35_CCM_PPCTL);
-
-diff --git a/drivers/clk/qcom/Kconfig b/drivers/clk/qcom/Kconfig
-index 95e3b3e..98909b1 100644
---- a/drivers/clk/qcom/Kconfig
-+++ b/drivers/clk/qcom/Kconfig
-@@ -117,6 +117,7 @@ config MSM_MMCC_8974
-
- config MSM_GCC_8996
- tristate "MSM8996 Global Clock Controller"
-+ select QCOM_GDSC
- depends on COMMON_CLK_QCOM
- help
- Support for the global clock controller on msm8996 devices.
-@@ -126,6 +127,7 @@ config MSM_GCC_8996
- config MSM_MMCC_8996
- tristate "MSM8996 Multimedia Clock Controller"
- select MSM_GCC_8996
-+ select QCOM_GDSC
- depends on COMMON_CLK_QCOM
- help
- Support for the multimedia clock controller on msm8996 devices.
-diff --git a/drivers/clk/qcom/gcc-msm8996.c b/drivers/clk/qcom/gcc-msm8996.c
-index bbf732b..9f643cc 100644
---- a/drivers/clk/qcom/gcc-msm8996.c
-+++ b/drivers/clk/qcom/gcc-msm8996.c
-@@ -2592,9 +2592,9 @@ static struct clk_branch gcc_pcie_2_aux_clk = {
- };
-
- static struct clk_branch gcc_pcie_2_pipe_clk = {
-- .halt_reg = 0x6e108,
-+ .halt_reg = 0x6e018,
- .clkr = {
-- .enable_reg = 0x6e108,
-+ .enable_reg = 0x6e018,
- .enable_mask = BIT(0),
- .hw.init = &(struct clk_init_data){
- .name = "gcc_pcie_2_pipe_clk",
-diff --git a/drivers/crypto/ccp/ccp-dmaengine.c b/drivers/crypto/ccp/ccp-dmaengine.c
-index 94f77b0..32f645e 100644
---- a/drivers/crypto/ccp/ccp-dmaengine.c
-+++ b/drivers/crypto/ccp/ccp-dmaengine.c
-@@ -650,7 +650,7 @@ int ccp_dmaengine_register(struct ccp_device *ccp)
- dma_desc_cache_name = devm_kasprintf(ccp->dev, GFP_KERNEL,
- "%s-dmaengine-desc-cache",
- ccp->name);
-- if (!dma_cmd_cache_name)
-+ if (!dma_desc_cache_name)
- return -ENOMEM;
- ccp->dma_desc_cache = kmem_cache_create(dma_desc_cache_name,
- sizeof(struct ccp_dma_desc),
-diff --git a/drivers/crypto/marvell/cesa.c b/drivers/crypto/marvell/cesa.c
-index d64af86..37dadb2 100644
---- a/drivers/crypto/marvell/cesa.c
-+++ b/drivers/crypto/marvell/cesa.c
-@@ -166,6 +166,7 @@ static irqreturn_t mv_cesa_int(int irq, void *priv)
- if (!req)
- break;
-
-+ ctx = crypto_tfm_ctx(req->tfm);
- mv_cesa_complete_req(ctx, req, 0);
- }
- }
-diff --git a/drivers/crypto/marvell/hash.c b/drivers/crypto/marvell/hash.c
-index 82e0f4e6..b111e14 100644
---- a/drivers/crypto/marvell/hash.c
-+++ b/drivers/crypto/marvell/hash.c
-@@ -805,13 +805,14 @@ static int mv_cesa_md5_init(struct ahash_request *req)
- struct mv_cesa_op_ctx tmpl = { };
-
- mv_cesa_set_op_cfg(&tmpl, CESA_SA_DESC_CFG_MACM_MD5);
-+
-+ mv_cesa_ahash_init(req, &tmpl, true);
-+
- creq->state[0] = MD5_H0;
- creq->state[1] = MD5_H1;
- creq->state[2] = MD5_H2;
- creq->state[3] = MD5_H3;
-
-- mv_cesa_ahash_init(req, &tmpl, true);
--
- return 0;
- }
-
-@@ -873,14 +874,15 @@ static int mv_cesa_sha1_init(struct ahash_request *req)
- struct mv_cesa_op_ctx tmpl = { };
-
- mv_cesa_set_op_cfg(&tmpl, CESA_SA_DESC_CFG_MACM_SHA1);
-+
-+ mv_cesa_ahash_init(req, &tmpl, false);
-+
- creq->state[0] = SHA1_H0;
- creq->state[1] = SHA1_H1;
- creq->state[2] = SHA1_H2;
- creq->state[3] = SHA1_H3;
- creq->state[4] = SHA1_H4;
-
-- mv_cesa_ahash_init(req, &tmpl, false);
--
- return 0;
- }
-
-@@ -942,6 +944,9 @@ static int mv_cesa_sha256_init(struct ahash_request *req)
- struct mv_cesa_op_ctx tmpl = { };
-
- mv_cesa_set_op_cfg(&tmpl, CESA_SA_DESC_CFG_MACM_SHA256);
-+
-+ mv_cesa_ahash_init(req, &tmpl, false);
-+
- creq->state[0] = SHA256_H0;
- creq->state[1] = SHA256_H1;
- creq->state[2] = SHA256_H2;
-@@ -951,8 +956,6 @@ static int mv_cesa_sha256_init(struct ahash_request *req)
- creq->state[6] = SHA256_H6;
- creq->state[7] = SHA256_H7;
-
-- mv_cesa_ahash_init(req, &tmpl, false);
--
- return 0;
- }
-
-diff --git a/drivers/dma/ipu/ipu_irq.c b/drivers/dma/ipu/ipu_irq.c
-index 2bf37e6..dd184b5 100644
---- a/drivers/dma/ipu/ipu_irq.c
-+++ b/drivers/dma/ipu/ipu_irq.c
-@@ -286,22 +286,21 @@ static void ipu_irq_handler(struct irq_desc *desc)
- raw_spin_unlock(&bank_lock);
- while ((line = ffs(status))) {
- struct ipu_irq_map *map;
-- unsigned int irq = NO_IRQ;
-+ unsigned int irq;
-
- line--;
- status &= ~(1UL << line);
-
- raw_spin_lock(&bank_lock);
- map = src2map(32 * i + line);
-- if (map)
-- irq = map->irq;
-- raw_spin_unlock(&bank_lock);
--
- if (!map) {
-+ raw_spin_unlock(&bank_lock);
- pr_err("IPU: Interrupt on unmapped source %u bank %d\n",
- line, i);
- continue;
- }
-+ irq = map->irq;
-+ raw_spin_unlock(&bank_lock);
- generic_handle_irq(irq);
- }
- }
-diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
-index 17e1362..4e71a68 100644
---- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
-+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
-@@ -43,6 +43,9 @@ static int amdgpu_ctx_init(struct amdgpu_device *adev, struct amdgpu_ctx *ctx)
- ctx->rings[i].sequence = 1;
- ctx->rings[i].fences = &ctx->fences[amdgpu_sched_jobs * i];
- }
-+
-+ ctx->reset_counter = atomic_read(&adev->gpu_reset_counter);
-+
- /* create context entity for each ring */
- for (i = 0; i < adev->num_rings; i++) {
- struct amdgpu_ring *ring = adev->rings[i];
-diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.c
-index fe36caf..14f57d9 100644
---- a/drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.c
-+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.c
-@@ -113,24 +113,26 @@ void amdgpu_dpm_print_ps_status(struct amdgpu_device *adev,
- printk("\n");
- }
-
-+
- u32 amdgpu_dpm_get_vblank_time(struct amdgpu_device *adev)
- {
- struct drm_device *dev = adev->ddev;
- struct drm_crtc *crtc;
- struct amdgpu_crtc *amdgpu_crtc;
-- u32 line_time_us, vblank_lines;
-+ u32 vblank_in_pixels;
- u32 vblank_time_us = 0xffffffff; /* if the displays are off, vblank time is max */
-
- if (adev->mode_info.num_crtc && adev->mode_info.mode_config_initialized) {
- list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
- amdgpu_crtc = to_amdgpu_crtc(crtc);
- if (crtc->enabled && amdgpu_crtc->enabled && amdgpu_crtc->hw_mode.clock) {
-- line_time_us = (amdgpu_crtc->hw_mode.crtc_htotal * 1000) /
-- amdgpu_crtc->hw_mode.clock;
-- vblank_lines = amdgpu_crtc->hw_mode.crtc_vblank_end -
-+ vblank_in_pixels =
-+ amdgpu_crtc->hw_mode.crtc_htotal *
-+ (amdgpu_crtc->hw_mode.crtc_vblank_end -
- amdgpu_crtc->hw_mode.crtc_vdisplay +
-- (amdgpu_crtc->v_border * 2);
-- vblank_time_us = vblank_lines * line_time_us;
-+ (amdgpu_crtc->v_border * 2));
-+
-+ vblank_time_us = vblank_in_pixels * 1000 / amdgpu_crtc->hw_mode.clock;
- break;
- }
- }
-diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
-index d942654..e24a8af 100644
---- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
-+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
-@@ -292,7 +292,7 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file
- type = AMD_IP_BLOCK_TYPE_UVD;
- ring_mask = adev->uvd.ring.ready ? 1 : 0;
- ib_start_alignment = AMDGPU_GPU_PAGE_SIZE;
-- ib_size_alignment = 8;
-+ ib_size_alignment = 16;
- break;
- case AMDGPU_HW_IP_VCE:
- type = AMD_IP_BLOCK_TYPE_VCE;
-diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c
-index c1b04e9..172bed9 100644
---- a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c
-+++ b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c
-@@ -425,16 +425,6 @@ static void dce_v10_0_hpd_init(struct amdgpu_device *adev)
- list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
- struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
-
-- if (connector->connector_type == DRM_MODE_CONNECTOR_eDP ||
-- connector->connector_type == DRM_MODE_CONNECTOR_LVDS) {
-- /* don't try to enable hpd on eDP or LVDS avoid breaking the
-- * aux dp channel on imac and help (but not completely fix)
-- * https://bugzilla.redhat.com/show_bug.cgi?id=726143
-- * also avoid interrupt storms during dpms.
-- */
-- continue;
-- }
--
- switch (amdgpu_connector->hpd.hpd) {
- case AMDGPU_HPD_1:
- idx = 0;
-@@ -458,6 +448,19 @@ static void dce_v10_0_hpd_init(struct amdgpu_device *adev)
- continue;
- }
-
-+ if (connector->connector_type == DRM_MODE_CONNECTOR_eDP ||
-+ connector->connector_type == DRM_MODE_CONNECTOR_LVDS) {
-+ /* don't try to enable hpd on eDP or LVDS avoid breaking the
-+ * aux dp channel on imac and help (but not completely fix)
-+ * https://bugzilla.redhat.com/show_bug.cgi?id=726143
-+ * also avoid interrupt storms during dpms.
-+ */
-+ tmp = RREG32(mmDC_HPD_INT_CONTROL + hpd_offsets[idx]);
-+ tmp = REG_SET_FIELD(tmp, DC_HPD_INT_CONTROL, DC_HPD_INT_EN, 0);
-+ WREG32(mmDC_HPD_INT_CONTROL + hpd_offsets[idx], tmp);
-+ continue;
-+ }
-+
- tmp = RREG32(mmDC_HPD_CONTROL + hpd_offsets[idx]);
- tmp = REG_SET_FIELD(tmp, DC_HPD_CONTROL, DC_HPD_EN, 1);
- WREG32(mmDC_HPD_CONTROL + hpd_offsets[idx], tmp);
-diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
-index d4bf133..67c7c05 100644
---- a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
-+++ b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
-@@ -443,16 +443,6 @@ static void dce_v11_0_hpd_init(struct amdgpu_device *adev)
- list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
- struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
-
-- if (connector->connector_type == DRM_MODE_CONNECTOR_eDP ||
-- connector->connector_type == DRM_MODE_CONNECTOR_LVDS) {
-- /* don't try to enable hpd on eDP or LVDS avoid breaking the
-- * aux dp channel on imac and help (but not completely fix)
-- * https://bugzilla.redhat.com/show_bug.cgi?id=726143
-- * also avoid interrupt storms during dpms.
-- */
-- continue;
-- }
--
- switch (amdgpu_connector->hpd.hpd) {
- case AMDGPU_HPD_1:
- idx = 0;
-@@ -476,6 +466,19 @@ static void dce_v11_0_hpd_init(struct amdgpu_device *adev)
- continue;
- }
-
-+ if (connector->connector_type == DRM_MODE_CONNECTOR_eDP ||
-+ connector->connector_type == DRM_MODE_CONNECTOR_LVDS) {
-+ /* don't try to enable hpd on eDP or LVDS avoid breaking the
-+ * aux dp channel on imac and help (but not completely fix)
-+ * https://bugzilla.redhat.com/show_bug.cgi?id=726143
-+ * also avoid interrupt storms during dpms.
-+ */
-+ tmp = RREG32(mmDC_HPD_INT_CONTROL + hpd_offsets[idx]);
-+ tmp = REG_SET_FIELD(tmp, DC_HPD_INT_CONTROL, DC_HPD_INT_EN, 0);
-+ WREG32(mmDC_HPD_INT_CONTROL + hpd_offsets[idx], tmp);
-+ continue;
-+ }
-+
- tmp = RREG32(mmDC_HPD_CONTROL + hpd_offsets[idx]);
- tmp = REG_SET_FIELD(tmp, DC_HPD_CONTROL, DC_HPD_EN, 1);
- WREG32(mmDC_HPD_CONTROL + hpd_offsets[idx], tmp);
-@@ -3109,6 +3112,7 @@ static int dce_v11_0_sw_fini(void *handle)
-
- dce_v11_0_afmt_fini(adev);
-
-+ drm_mode_config_cleanup(adev->ddev);
- adev->mode_info.mode_config_initialized = false;
-
- return 0;
-diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c
-index 4fdfab1..ea07c50 100644
---- a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c
-+++ b/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c
-@@ -395,15 +395,6 @@ static void dce_v8_0_hpd_init(struct amdgpu_device *adev)
- list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
- struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
-
-- if (connector->connector_type == DRM_MODE_CONNECTOR_eDP ||
-- connector->connector_type == DRM_MODE_CONNECTOR_LVDS) {
-- /* don't try to enable hpd on eDP or LVDS avoid breaking the
-- * aux dp channel on imac and help (but not completely fix)
-- * https://bugzilla.redhat.com/show_bug.cgi?id=726143
-- * also avoid interrupt storms during dpms.
-- */
-- continue;
-- }
- switch (amdgpu_connector->hpd.hpd) {
- case AMDGPU_HPD_1:
- WREG32(mmDC_HPD1_CONTROL, tmp);
-@@ -426,6 +417,45 @@ static void dce_v8_0_hpd_init(struct amdgpu_device *adev)
- default:
- break;
- }
-+
-+ if (connector->connector_type == DRM_MODE_CONNECTOR_eDP ||
-+ connector->connector_type == DRM_MODE_CONNECTOR_LVDS) {
-+ /* don't try to enable hpd on eDP or LVDS avoid breaking the
-+ * aux dp channel on imac and help (but not completely fix)
-+ * https://bugzilla.redhat.com/show_bug.cgi?id=726143
-+ * also avoid interrupt storms during dpms.
-+ */
-+ u32 dc_hpd_int_cntl_reg, dc_hpd_int_cntl;
-+
-+ switch (amdgpu_connector->hpd.hpd) {
-+ case AMDGPU_HPD_1:
-+ dc_hpd_int_cntl_reg = mmDC_HPD1_INT_CONTROL;
-+ break;
-+ case AMDGPU_HPD_2:
-+ dc_hpd_int_cntl_reg = mmDC_HPD2_INT_CONTROL;
-+ break;
-+ case AMDGPU_HPD_3:
-+ dc_hpd_int_cntl_reg = mmDC_HPD3_INT_CONTROL;
-+ break;
-+ case AMDGPU_HPD_4:
-+ dc_hpd_int_cntl_reg = mmDC_HPD4_INT_CONTROL;
-+ break;
-+ case AMDGPU_HPD_5:
-+ dc_hpd_int_cntl_reg = mmDC_HPD5_INT_CONTROL;
-+ break;
-+ case AMDGPU_HPD_6:
-+ dc_hpd_int_cntl_reg = mmDC_HPD6_INT_CONTROL;
-+ break;
-+ default:
-+ continue;
-+ }
-+
-+ dc_hpd_int_cntl = RREG32(dc_hpd_int_cntl_reg);
-+ dc_hpd_int_cntl &= ~DC_HPD1_INT_CONTROL__DC_HPD1_INT_EN_MASK;
-+ WREG32(dc_hpd_int_cntl_reg, dc_hpd_int_cntl);
-+ continue;
-+ }
-+
- dce_v8_0_hpd_set_polarity(adev, amdgpu_connector->hpd.hpd);
- amdgpu_irq_get(adev, &adev->hpd_irq, amdgpu_connector->hpd.hpd);
- }
-diff --git a/drivers/gpu/drm/amd/powerplay/eventmgr/eventactionchains.c b/drivers/gpu/drm/amd/powerplay/eventmgr/eventactionchains.c
-index 635fc4b..92b1178 100644
---- a/drivers/gpu/drm/amd/powerplay/eventmgr/eventactionchains.c
-+++ b/drivers/gpu/drm/amd/powerplay/eventmgr/eventactionchains.c
-@@ -262,6 +262,8 @@ static const pem_event_action * const display_config_change_event[] = {
- unblock_adjust_power_state_tasks,
- set_cpu_power_state,
- notify_hw_power_source_tasks,
-+ get_2d_performance_state_tasks,
-+ set_performance_state_tasks,
- /* updateDALConfigurationTasks,
- variBrightDisplayConfigurationChangeTasks, */
- adjust_power_state_tasks,
-diff --git a/drivers/gpu/drm/amd/powerplay/eventmgr/psm.c b/drivers/gpu/drm/amd/powerplay/eventmgr/psm.c
-index a46225c..d6bee72 100644
---- a/drivers/gpu/drm/amd/powerplay/eventmgr/psm.c
-+++ b/drivers/gpu/drm/amd/powerplay/eventmgr/psm.c
-@@ -100,11 +100,12 @@ int psm_adjust_power_state_dynamic(struct pp_eventmgr *eventmgr, bool skip)
- if (requested == NULL)
- return 0;
-
-+ phm_apply_state_adjust_rules(hwmgr, requested, pcurrent);
-+
- if (pcurrent == NULL || (0 != phm_check_states_equal(hwmgr, &pcurrent->hardware, &requested->hardware, &equal)))
- equal = false;
-
- if (!equal || phm_check_smc_update_required_for_display_configuration(hwmgr)) {
-- phm_apply_state_adjust_rules(hwmgr, requested, pcurrent);
- phm_set_power_state(hwmgr, &pcurrent->hardware, &requested->hardware);
- hwmgr->current_ps = requested;
- }
-diff --git a/drivers/gpu/drm/drm_prime.c b/drivers/gpu/drm/drm_prime.c
-index 780589b..9c4387d 100644
---- a/drivers/gpu/drm/drm_prime.c
-+++ b/drivers/gpu/drm/drm_prime.c
-@@ -335,14 +335,17 @@ static const struct dma_buf_ops drm_gem_prime_dmabuf_ops = {
- * using the PRIME helpers.
- */
- struct dma_buf *drm_gem_prime_export(struct drm_device *dev,
-- struct drm_gem_object *obj, int flags)
-+ struct drm_gem_object *obj,
-+ int flags)
- {
-- DEFINE_DMA_BUF_EXPORT_INFO(exp_info);
--
-- exp_info.ops = &drm_gem_prime_dmabuf_ops;
-- exp_info.size = obj->size;
-- exp_info.flags = flags;
-- exp_info.priv = obj;
-+ struct dma_buf_export_info exp_info = {
-+ .exp_name = KBUILD_MODNAME, /* white lie for debug */
-+ .owner = dev->driver->fops->owner,
-+ .ops = &drm_gem_prime_dmabuf_ops,
-+ .size = obj->size,
-+ .flags = flags,
-+ .priv = obj,
-+ };
-
- if (dev->driver->gem_prime_res_obj)
- exp_info.resv = dev->driver->gem_prime_res_obj(obj);
-diff --git a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c
-index 7882387..5fc8ebd 100644
---- a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c
-+++ b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c
-@@ -330,6 +330,7 @@ static int fsl_dcu_drm_probe(struct platform_device *pdev)
- const char *pix_clk_in_name;
- const struct of_device_id *id;
- int ret;
-+ u8 div_ratio_shift = 0;
-
- fsl_dev = devm_kzalloc(dev, sizeof(*fsl_dev), GFP_KERNEL);
- if (!fsl_dev)
-@@ -382,11 +383,14 @@ static int fsl_dcu_drm_probe(struct platform_device *pdev)
- pix_clk_in = fsl_dev->clk;
- }
-
-+ if (of_property_read_bool(dev->of_node, "big-endian"))
-+ div_ratio_shift = 24;
-+
- pix_clk_in_name = __clk_get_name(pix_clk_in);
- snprintf(pix_clk_name, sizeof(pix_clk_name), "%s_pix", pix_clk_in_name);
- fsl_dev->pix_clk = clk_register_divider(dev, pix_clk_name,
- pix_clk_in_name, 0, base + DCU_DIV_RATIO,
-- 0, 8, CLK_DIVIDER_ROUND_CLOSEST, NULL);
-+ div_ratio_shift, 8, CLK_DIVIDER_ROUND_CLOSEST, NULL);
- if (IS_ERR(fsl_dev->pix_clk)) {
- dev_err(dev, "failed to register pix clk\n");
- ret = PTR_ERR(fsl_dev->pix_clk);
-diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
-index f68c789..84a0010 100644
---- a/drivers/gpu/drm/i915/i915_drv.h
-+++ b/drivers/gpu/drm/i915/i915_drv.h
-@@ -631,6 +631,8 @@ struct drm_i915_display_funcs {
- struct intel_crtc_state *crtc_state);
- void (*crtc_enable)(struct drm_crtc *crtc);
- void (*crtc_disable)(struct drm_crtc *crtc);
-+ void (*update_crtcs)(struct drm_atomic_state *state,
-+ unsigned int *crtc_vblank_mask);
- void (*audio_codec_enable)(struct drm_connector *connector,
- struct intel_encoder *encoder,
- const struct drm_display_mode *adjusted_mode);
-@@ -1965,11 +1967,11 @@ struct drm_i915_private {
- struct vlv_s0ix_state vlv_s0ix_state;
-
- enum {
-- I915_SKL_SAGV_UNKNOWN = 0,
-- I915_SKL_SAGV_DISABLED,
-- I915_SKL_SAGV_ENABLED,
-- I915_SKL_SAGV_NOT_CONTROLLED
-- } skl_sagv_status;
-+ I915_SAGV_UNKNOWN = 0,
-+ I915_SAGV_DISABLED,
-+ I915_SAGV_ENABLED,
-+ I915_SAGV_NOT_CONTROLLED
-+ } sagv_status;
-
- struct {
- /*
-@@ -2280,21 +2282,19 @@ struct drm_i915_gem_object {
- /** Record of address bit 17 of each page at last unbind. */
- unsigned long *bit_17;
-
-- union {
-- /** for phy allocated objects */
-- struct drm_dma_handle *phys_handle;
--
-- struct i915_gem_userptr {
-- uintptr_t ptr;
-- unsigned read_only :1;
-- unsigned workers :4;
-+ struct i915_gem_userptr {
-+ uintptr_t ptr;
-+ unsigned read_only :1;
-+ unsigned workers :4;
- #define I915_GEM_USERPTR_MAX_WORKERS 15
-
-- struct i915_mm_struct *mm;
-- struct i915_mmu_object *mmu_object;
-- struct work_struct *work;
-- } userptr;
-- };
-+ struct i915_mm_struct *mm;
-+ struct i915_mmu_object *mmu_object;
-+ struct work_struct *work;
-+ } userptr;
-+
-+ /** for phys allocated objects */
-+ struct drm_dma_handle *phys_handle;
- };
- #define to_intel_bo(x) container_of(x, struct drm_i915_gem_object, base)
-
-diff --git a/drivers/gpu/drm/i915/i915_gem_stolen.c b/drivers/gpu/drm/i915/i915_gem_stolen.c
-index 66be299a1..2bb69f3 100644
---- a/drivers/gpu/drm/i915/i915_gem_stolen.c
-+++ b/drivers/gpu/drm/i915/i915_gem_stolen.c
-@@ -115,17 +115,28 @@ static unsigned long i915_stolen_to_physical(struct drm_device *dev)
-
- base = bsm & INTEL_BSM_MASK;
- } else if (IS_I865G(dev)) {
-+ u32 tseg_size = 0;
- u16 toud = 0;
-+ u8 tmp;
-+
-+ pci_bus_read_config_byte(dev->pdev->bus, PCI_DEVFN(0, 0),
-+ I845_ESMRAMC, &tmp);
-+
-+ if (tmp & TSEG_ENABLE) {
-+ switch (tmp & I845_TSEG_SIZE_MASK) {
-+ case I845_TSEG_SIZE_512K:
-+ tseg_size = KB(512);
-+ break;
-+ case I845_TSEG_SIZE_1M:
-+ tseg_size = MB(1);
-+ break;
-+ }
-+ }
-
-- /*
-- * FIXME is the graphics stolen memory region
-- * always at TOUD? Ie. is it always the last
-- * one to be allocated by the BIOS?
-- */
- pci_bus_read_config_word(dev->pdev->bus, PCI_DEVFN(0, 0),
- I865_TOUD, &toud);
-
-- base = toud << 16;
-+ base = (toud << 16) + tseg_size;
- } else if (IS_I85X(dev)) {
- u32 tseg_size = 0;
- u32 tom;
-diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
-index 175595f..e9a64fb 100644
---- a/drivers/gpu/drm/i915/intel_display.c
-+++ b/drivers/gpu/drm/i915/intel_display.c
-@@ -2980,6 +2980,7 @@ static void skylake_update_primary_plane(struct drm_plane *plane,
- struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->base.crtc);
- struct drm_framebuffer *fb = plane_state->base.fb;
- struct drm_i915_gem_object *obj = intel_fb_obj(fb);
-+ const struct skl_wm_values *wm = &dev_priv->wm.skl_results;
- int pipe = intel_crtc->pipe;
- u32 plane_ctl, stride_div, stride;
- u32 tile_height, plane_offset, plane_size;
-@@ -3031,6 +3032,9 @@ static void skylake_update_primary_plane(struct drm_plane *plane,
- intel_crtc->adjusted_x = x_offset;
- intel_crtc->adjusted_y = y_offset;
-
-+ if (wm->dirty_pipes & drm_crtc_mask(&intel_crtc->base))
-+ skl_write_plane_wm(intel_crtc, wm, 0);
-+
- I915_WRITE(PLANE_CTL(pipe, 0), plane_ctl);
- I915_WRITE(PLANE_OFFSET(pipe, 0), plane_offset);
- I915_WRITE(PLANE_SIZE(pipe, 0), plane_size);
-@@ -3061,7 +3065,15 @@ static void skylake_disable_primary_plane(struct drm_plane *primary,
- {
- struct drm_device *dev = crtc->dev;
- struct drm_i915_private *dev_priv = to_i915(dev);
-- int pipe = to_intel_crtc(crtc)->pipe;
-+ struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
-+ int pipe = intel_crtc->pipe;
-+
-+ /*
-+ * We only populate skl_results on watermark updates, and if the
-+ * plane's visiblity isn't actually changing neither is its watermarks.
-+ */
-+ if (!to_intel_plane_state(crtc->primary->state)->visible)
-+ skl_write_plane_wm(intel_crtc, &dev_priv->wm.skl_results, 0);
-
- I915_WRITE(PLANE_CTL(pipe, 0), 0);
- I915_WRITE(PLANE_SURF(pipe, 0), 0);
-@@ -8995,6 +9007,24 @@ static void ironlake_compute_dpll(struct intel_crtc *intel_crtc,
- if (intel_crtc_has_dp_encoder(crtc_state))
- dpll |= DPLL_SDVO_HIGH_SPEED;
-
-+ /*
-+ * The high speed IO clock is only really required for
-+ * SDVO/HDMI/DP, but we also enable it for CRT to make it
-+ * possible to share the DPLL between CRT and HDMI. Enabling
-+ * the clock needlessly does no real harm, except use up a
-+ * bit of power potentially.
-+ *
-+ * We'll limit this to IVB with 3 pipes, since it has only two
-+ * DPLLs and so DPLL sharing is the only way to get three pipes
-+ * driving PCH ports at the same time. On SNB we could do this,
-+ * and potentially avoid enabling the second DPLL, but it's not
-+ * clear if it''s a win or loss power wise. No point in doing
-+ * this on ILK at all since it has a fixed DPLL<->pipe mapping.
-+ */
-+ if (INTEL_INFO(dev_priv)->num_pipes == 3 &&
-+ intel_crtc_has_type(crtc_state, INTEL_OUTPUT_ANALOG))
-+ dpll |= DPLL_SDVO_HIGH_SPEED;
-+
- /* compute bitmask from p1 value */
- dpll |= (1 << (crtc_state->dpll.p1 - 1)) << DPLL_FPA01_P1_POST_DIV_SHIFT;
- /* also FPA1 */
-@@ -10306,9 +10336,13 @@ static void i9xx_update_cursor(struct drm_crtc *crtc, u32 base,
- struct drm_device *dev = crtc->dev;
- struct drm_i915_private *dev_priv = to_i915(dev);
- struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
-+ const struct skl_wm_values *wm = &dev_priv->wm.skl_results;
- int pipe = intel_crtc->pipe;
- uint32_t cntl = 0;
-
-+ if (INTEL_GEN(dev_priv) >= 9 && wm->dirty_pipes & drm_crtc_mask(crtc))
-+ skl_write_cursor_wm(intel_crtc, wm);
-+
- if (plane_state && plane_state->visible) {
- cntl = MCURSOR_GAMMA_ENABLE;
- switch (plane_state->base.crtc_w) {
-@@ -12956,16 +12990,23 @@ static void verify_wm_state(struct drm_crtc *crtc,
- hw_entry->start, hw_entry->end);
- }
-
-- /* cursor */
-- hw_entry = &hw_ddb.plane[pipe][PLANE_CURSOR];
-- sw_entry = &sw_ddb->plane[pipe][PLANE_CURSOR];
--
-- if (!skl_ddb_entry_equal(hw_entry, sw_entry)) {
-- DRM_ERROR("mismatch in DDB state pipe %c cursor "
-- "(expected (%u,%u), found (%u,%u))\n",
-- pipe_name(pipe),
-- sw_entry->start, sw_entry->end,
-- hw_entry->start, hw_entry->end);
-+ /*
-+ * cursor
-+ * If the cursor plane isn't active, we may not have updated it's ddb
-+ * allocation. In that case since the ddb allocation will be updated
-+ * once the plane becomes visible, we can skip this check
-+ */
-+ if (intel_crtc->cursor_addr) {
-+ hw_entry = &hw_ddb.plane[pipe][PLANE_CURSOR];
-+ sw_entry = &sw_ddb->plane[pipe][PLANE_CURSOR];
-+
-+ if (!skl_ddb_entry_equal(hw_entry, sw_entry)) {
-+ DRM_ERROR("mismatch in DDB state pipe %c cursor "
-+ "(expected (%u,%u), found (%u,%u))\n",
-+ pipe_name(pipe),
-+ sw_entry->start, sw_entry->end,
-+ hw_entry->start, hw_entry->end);
-+ }
- }
- }
-
-@@ -13671,6 +13712,111 @@ static bool needs_vblank_wait(struct intel_crtc_state *crtc_state)
- return false;
- }
-
-+static void intel_update_crtc(struct drm_crtc *crtc,
-+ struct drm_atomic_state *state,
-+ struct drm_crtc_state *old_crtc_state,
-+ unsigned int *crtc_vblank_mask)
-+{
-+ struct drm_device *dev = crtc->dev;
-+ struct drm_i915_private *dev_priv = to_i915(dev);
-+ struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
-+ struct intel_crtc_state *pipe_config = to_intel_crtc_state(crtc->state);
-+ bool modeset = needs_modeset(crtc->state);
-+
-+ if (modeset) {
-+ update_scanline_offset(intel_crtc);
-+ dev_priv->display.crtc_enable(crtc);
-+ } else {
-+ intel_pre_plane_update(to_intel_crtc_state(old_crtc_state));
-+ }
-+
-+ if (drm_atomic_get_existing_plane_state(state, crtc->primary)) {
-+ intel_fbc_enable(
-+ intel_crtc, pipe_config,
-+ to_intel_plane_state(crtc->primary->state));
-+ }
-+
-+ drm_atomic_helper_commit_planes_on_crtc(old_crtc_state);
-+
-+ if (needs_vblank_wait(pipe_config))
-+ *crtc_vblank_mask |= drm_crtc_mask(crtc);
-+}
-+
-+static void intel_update_crtcs(struct drm_atomic_state *state,
-+ unsigned int *crtc_vblank_mask)
-+{
-+ struct drm_crtc *crtc;
-+ struct drm_crtc_state *old_crtc_state;
-+ int i;
-+
-+ for_each_crtc_in_state(state, crtc, old_crtc_state, i) {
-+ if (!crtc->state->active)
-+ continue;
-+
-+ intel_update_crtc(crtc, state, old_crtc_state,
-+ crtc_vblank_mask);
-+ }
-+}
-+
-+static void skl_update_crtcs(struct drm_atomic_state *state,
-+ unsigned int *crtc_vblank_mask)
-+{
-+ struct drm_device *dev = state->dev;
-+ struct drm_i915_private *dev_priv = to_i915(dev);
-+ struct intel_atomic_state *intel_state = to_intel_atomic_state(state);
-+ struct drm_crtc *crtc;
-+ struct drm_crtc_state *old_crtc_state;
-+ struct skl_ddb_allocation *new_ddb = &intel_state->wm_results.ddb;
-+ struct skl_ddb_allocation *cur_ddb = &dev_priv->wm.skl_hw.ddb;
-+ unsigned int updated = 0;
-+ bool progress;
-+ enum pipe pipe;
-+
-+ /*
-+ * Whenever the number of active pipes changes, we need to make sure we
-+ * update the pipes in the right order so that their ddb allocations
-+ * never overlap with eachother inbetween CRTC updates. Otherwise we'll
-+ * cause pipe underruns and other bad stuff.
-+ */
-+ do {
-+ int i;
-+ progress = false;
-+
-+ for_each_crtc_in_state(state, crtc, old_crtc_state, i) {
-+ bool vbl_wait = false;
-+ unsigned int cmask = drm_crtc_mask(crtc);
-+ pipe = to_intel_crtc(crtc)->pipe;
-+
-+ if (updated & cmask || !crtc->state->active)
-+ continue;
-+ if (skl_ddb_allocation_overlaps(state, cur_ddb, new_ddb,
-+ pipe))
-+ continue;
-+
-+ updated |= cmask;
-+
-+ /*
-+ * If this is an already active pipe, it's DDB changed,
-+ * and this isn't the last pipe that needs updating
-+ * then we need to wait for a vblank to pass for the
-+ * new ddb allocation to take effect.
-+ */
-+ if (!skl_ddb_allocation_equals(cur_ddb, new_ddb, pipe) &&
-+ !crtc->state->active_changed &&
-+ intel_state->wm_results.dirty_pipes != updated)
-+ vbl_wait = true;
-+
-+ intel_update_crtc(crtc, state, old_crtc_state,
-+ crtc_vblank_mask);
-+
-+ if (vbl_wait)
-+ intel_wait_for_vblank(dev, pipe);
-+
-+ progress = true;
-+ }
-+ } while (progress);
-+}
-+
- static void intel_atomic_commit_tail(struct drm_atomic_state *state)
- {
- struct drm_device *dev = state->dev;
-@@ -13763,23 +13909,15 @@ static void intel_atomic_commit_tail(struct drm_atomic_state *state)
- * SKL workaround: bspec recommends we disable the SAGV when we
- * have more then one pipe enabled
- */
-- if (IS_SKYLAKE(dev_priv) && !skl_can_enable_sagv(state))
-- skl_disable_sagv(dev_priv);
-+ if (!intel_can_enable_sagv(state))
-+ intel_disable_sagv(dev_priv);
-
- intel_modeset_verify_disabled(dev);
- }
-
-- /* Now enable the clocks, plane, pipe, and connectors that we set up. */
-+ /* Complete the events for pipes that have now been disabled */
- for_each_crtc_in_state(state, crtc, old_crtc_state, i) {
-- struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
- bool modeset = needs_modeset(crtc->state);
-- struct intel_crtc_state *pipe_config =
-- to_intel_crtc_state(crtc->state);
--
-- if (modeset && crtc->state->active) {
-- update_scanline_offset(to_intel_crtc(crtc));
-- dev_priv->display.crtc_enable(crtc);
-- }
-
- /* Complete events for now disable pipes here. */
- if (modeset && !crtc->state->active && crtc->state->event) {
-@@ -13789,21 +13927,11 @@ static void intel_atomic_commit_tail(struct drm_atomic_state *state)
-
- crtc->state->event = NULL;
- }
--
-- if (!modeset)
-- intel_pre_plane_update(to_intel_crtc_state(old_crtc_state));
--
-- if (crtc->state->active &&
-- drm_atomic_get_existing_plane_state(state, crtc->primary))
-- intel_fbc_enable(intel_crtc, pipe_config, to_intel_plane_state(crtc->primary->state));
--
-- if (crtc->state->active)
-- drm_atomic_helper_commit_planes_on_crtc(old_crtc_state);
--
-- if (pipe_config->base.active && needs_vblank_wait(pipe_config))
-- crtc_vblank_mask |= 1 << i;
- }
-
-+ /* Now enable the clocks, plane, pipe, and connectors that we set up. */
-+ dev_priv->display.update_crtcs(state, &crtc_vblank_mask);
-+
- /* FIXME: We should call drm_atomic_helper_commit_hw_done() here
- * already, but still need the state for the delayed optimization. To
- * fix this:
-@@ -13839,9 +13967,8 @@ static void intel_atomic_commit_tail(struct drm_atomic_state *state)
- intel_modeset_verify_crtc(crtc, old_crtc_state, crtc->state);
- }
-
-- if (IS_SKYLAKE(dev_priv) && intel_state->modeset &&
-- skl_can_enable_sagv(state))
-- skl_enable_sagv(dev_priv);
-+ if (intel_state->modeset && intel_can_enable_sagv(state))
-+ intel_enable_sagv(dev_priv);
-
- drm_atomic_helper_commit_hw_done(state);
-
-@@ -14221,10 +14348,12 @@ static void intel_begin_crtc_commit(struct drm_crtc *crtc,
- struct drm_crtc_state *old_crtc_state)
- {
- struct drm_device *dev = crtc->dev;
-+ struct drm_i915_private *dev_priv = to_i915(dev);
- struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
- struct intel_crtc_state *old_intel_state =
- to_intel_crtc_state(old_crtc_state);
- bool modeset = needs_modeset(crtc->state);
-+ enum pipe pipe = intel_crtc->pipe;
-
- /* Perform vblank evasion around commit operation */
- intel_pipe_update_start(intel_crtc);
-@@ -14239,8 +14368,12 @@ static void intel_begin_crtc_commit(struct drm_crtc *crtc,
-
- if (to_intel_crtc_state(crtc->state)->update_pipe)
- intel_update_pipe_config(intel_crtc, old_intel_state);
-- else if (INTEL_INFO(dev)->gen >= 9)
-+ else if (INTEL_GEN(dev_priv) >= 9) {
- skl_detach_scalers(intel_crtc);
-+
-+ I915_WRITE(PIPE_WM_LINETIME(pipe),
-+ dev_priv->wm.skl_hw.wm_linetime[pipe]);
-+ }
- }
-
- static void intel_finish_crtc_commit(struct drm_crtc *crtc,
-@@ -15347,6 +15480,11 @@ void intel_init_display_hooks(struct drm_i915_private *dev_priv)
- skl_modeset_calc_cdclk;
- }
-
-+ if (dev_priv->info.gen >= 9)
-+ dev_priv->display.update_crtcs = skl_update_crtcs;
-+ else
-+ dev_priv->display.update_crtcs = intel_update_crtcs;
-+
- switch (INTEL_INFO(dev_priv)->gen) {
- case 2:
- dev_priv->display.queue_flip = intel_gen2_queue_flip;
-diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
-index 21b04c3..1ca155f 100644
---- a/drivers/gpu/drm/i915/intel_dp.c
-+++ b/drivers/gpu/drm/i915/intel_dp.c
-@@ -4148,7 +4148,7 @@ static bool bxt_digital_port_connected(struct drm_i915_private *dev_priv,
- *
- * Return %true if @port is connected, %false otherwise.
- */
--bool intel_digital_port_connected(struct drm_i915_private *dev_priv,
-+static bool intel_digital_port_connected(struct drm_i915_private *dev_priv,
- struct intel_digital_port *port)
- {
- if (HAS_PCH_IBX(dev_priv))
-@@ -4207,7 +4207,7 @@ intel_dp_unset_edid(struct intel_dp *intel_dp)
- intel_dp->has_audio = false;
- }
-
--static void
-+static enum drm_connector_status
- intel_dp_long_pulse(struct intel_connector *intel_connector)
- {
- struct drm_connector *connector = &intel_connector->base;
-@@ -4232,7 +4232,7 @@ intel_dp_long_pulse(struct intel_connector *intel_connector)
- else
- status = connector_status_disconnected;
-
-- if (status != connector_status_connected) {
-+ if (status == connector_status_disconnected) {
- intel_dp->compliance_test_active = 0;
- intel_dp->compliance_test_type = 0;
- intel_dp->compliance_test_data = 0;
-@@ -4284,8 +4284,8 @@ intel_dp_long_pulse(struct intel_connector *intel_connector)
- intel_dp->aux.i2c_defer_count = 0;
-
- intel_dp_set_edid(intel_dp);
--
-- status = connector_status_connected;
-+ if (is_edp(intel_dp) || intel_connector->detect_edid)
-+ status = connector_status_connected;
- intel_dp->detect_done = true;
-
- /* Try to read the source of the interrupt */
-@@ -4303,12 +4303,11 @@ intel_dp_long_pulse(struct intel_connector *intel_connector)
- }
-
- out:
-- if ((status != connector_status_connected) &&
-- (intel_dp->is_mst == false))
-+ if (status != connector_status_connected && !intel_dp->is_mst)
- intel_dp_unset_edid(intel_dp);
-
- intel_display_power_put(to_i915(dev), power_domain);
-- return;
-+ return status;
- }
-
- static enum drm_connector_status
-@@ -4317,7 +4316,7 @@ intel_dp_detect(struct drm_connector *connector, bool force)
- struct intel_dp *intel_dp = intel_attached_dp(connector);
- struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
- struct intel_encoder *intel_encoder = &intel_dig_port->base;
-- struct intel_connector *intel_connector = to_intel_connector(connector);
-+ enum drm_connector_status status = connector->status;
-
- DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
- connector->base.id, connector->name);
-@@ -4332,14 +4331,11 @@ intel_dp_detect(struct drm_connector *connector, bool force)
-
- /* If full detect is not performed yet, do a full detect */
- if (!intel_dp->detect_done)
-- intel_dp_long_pulse(intel_dp->attached_connector);
-+ status = intel_dp_long_pulse(intel_dp->attached_connector);
-
- intel_dp->detect_done = false;
-
-- if (is_edp(intel_dp) || intel_connector->detect_edid)
-- return connector_status_connected;
-- else
-- return connector_status_disconnected;
-+ return status;
- }
-
- static void
-@@ -4696,36 +4692,34 @@ intel_dp_hpd_pulse(struct intel_digital_port *intel_dig_port, bool long_hpd)
- port_name(intel_dig_port->port),
- long_hpd ? "long" : "short");
-
-+ if (long_hpd) {
-+ intel_dp->detect_done = false;
-+ return IRQ_NONE;
-+ }
-+
- power_domain = intel_display_port_aux_power_domain(intel_encoder);
- intel_display_power_get(dev_priv, power_domain);
-
-- if (long_hpd) {
-- intel_dp_long_pulse(intel_dp->attached_connector);
-- if (intel_dp->is_mst)
-- ret = IRQ_HANDLED;
-- goto put_power;
--
-- } else {
-- if (intel_dp->is_mst) {
-- if (intel_dp_check_mst_status(intel_dp) == -EINVAL) {
-- /*
-- * If we were in MST mode, and device is not
-- * there, get out of MST mode
-- */
-- DRM_DEBUG_KMS("MST device may have disappeared %d vs %d\n",
-- intel_dp->is_mst, intel_dp->mst_mgr.mst_state);
-- intel_dp->is_mst = false;
-- drm_dp_mst_topology_mgr_set_mst(&intel_dp->mst_mgr,
-- intel_dp->is_mst);
-- goto put_power;
-- }
-+ if (intel_dp->is_mst) {
-+ if (intel_dp_check_mst_status(intel_dp) == -EINVAL) {
-+ /*
-+ * If we were in MST mode, and device is not
-+ * there, get out of MST mode
-+ */
-+ DRM_DEBUG_KMS("MST device may have disappeared %d vs %d\n",
-+ intel_dp->is_mst, intel_dp->mst_mgr.mst_state);
-+ intel_dp->is_mst = false;
-+ drm_dp_mst_topology_mgr_set_mst(&intel_dp->mst_mgr,
-+ intel_dp->is_mst);
-+ intel_dp->detect_done = false;
-+ goto put_power;
- }
-+ }
-
-- if (!intel_dp->is_mst) {
-- if (!intel_dp_short_pulse(intel_dp)) {
-- intel_dp_long_pulse(intel_dp->attached_connector);
-- goto put_power;
-- }
-+ if (!intel_dp->is_mst) {
-+ if (!intel_dp_short_pulse(intel_dp)) {
-+ intel_dp->detect_done = false;
-+ goto put_power;
- }
- }
-
-diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
-index ff399b9..9a58800 100644
---- a/drivers/gpu/drm/i915/intel_drv.h
-+++ b/drivers/gpu/drm/i915/intel_drv.h
-@@ -236,6 +236,7 @@ struct intel_panel {
- bool enabled;
- bool combination_mode; /* gen 2/4 only */
- bool active_low_pwm;
-+ bool alternate_pwm_increment; /* lpt+ */
-
- /* PWM chip */
- bool util_pin_active_low; /* bxt+ */
-@@ -1387,8 +1388,6 @@ void intel_edp_drrs_disable(struct intel_dp *intel_dp);
- void intel_edp_drrs_invalidate(struct drm_device *dev,
- unsigned frontbuffer_bits);
- void intel_edp_drrs_flush(struct drm_device *dev, unsigned frontbuffer_bits);
--bool intel_digital_port_connected(struct drm_i915_private *dev_priv,
-- struct intel_digital_port *port);
-
- void
- intel_dp_program_link_training_pattern(struct intel_dp *intel_dp,
-@@ -1716,9 +1715,21 @@ void ilk_wm_get_hw_state(struct drm_device *dev);
- void skl_wm_get_hw_state(struct drm_device *dev);
- void skl_ddb_get_hw_state(struct drm_i915_private *dev_priv,
- struct skl_ddb_allocation *ddb /* out */);
--bool skl_can_enable_sagv(struct drm_atomic_state *state);
--int skl_enable_sagv(struct drm_i915_private *dev_priv);
--int skl_disable_sagv(struct drm_i915_private *dev_priv);
-+bool intel_can_enable_sagv(struct drm_atomic_state *state);
-+int intel_enable_sagv(struct drm_i915_private *dev_priv);
-+int intel_disable_sagv(struct drm_i915_private *dev_priv);
-+bool skl_ddb_allocation_equals(const struct skl_ddb_allocation *old,
-+ const struct skl_ddb_allocation *new,
-+ enum pipe pipe);
-+bool skl_ddb_allocation_overlaps(struct drm_atomic_state *state,
-+ const struct skl_ddb_allocation *old,
-+ const struct skl_ddb_allocation *new,
-+ enum pipe pipe);
-+void skl_write_cursor_wm(struct intel_crtc *intel_crtc,
-+ const struct skl_wm_values *wm);
-+void skl_write_plane_wm(struct intel_crtc *intel_crtc,
-+ const struct skl_wm_values *wm,
-+ int plane);
- uint32_t ilk_pipe_pixel_rate(const struct intel_crtc_state *pipe_config);
- bool ilk_disable_lp_wm(struct drm_device *dev);
- int sanitize_rc6_option(struct drm_i915_private *dev_priv, int enable_rc6);
-diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c
-index 4df9f38..c3aa9e6 100644
---- a/drivers/gpu/drm/i915/intel_hdmi.c
-+++ b/drivers/gpu/drm/i915/intel_hdmi.c
-@@ -1422,24 +1422,22 @@ intel_hdmi_dp_dual_mode_detect(struct drm_connector *connector, bool has_edid)
- }
-
- static bool
--intel_hdmi_set_edid(struct drm_connector *connector, bool force)
-+intel_hdmi_set_edid(struct drm_connector *connector)
- {
- struct drm_i915_private *dev_priv = to_i915(connector->dev);
- struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
-- struct edid *edid = NULL;
-+ struct edid *edid;
- bool connected = false;
-
-- if (force) {
-- intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS);
-+ intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS);
-
-- edid = drm_get_edid(connector,
-- intel_gmbus_get_adapter(dev_priv,
-- intel_hdmi->ddc_bus));
-+ edid = drm_get_edid(connector,
-+ intel_gmbus_get_adapter(dev_priv,
-+ intel_hdmi->ddc_bus));
-
-- intel_hdmi_dp_dual_mode_detect(connector, edid != NULL);
-+ intel_hdmi_dp_dual_mode_detect(connector, edid != NULL);
-
-- intel_display_power_put(dev_priv, POWER_DOMAIN_GMBUS);
-- }
-+ intel_display_power_put(dev_priv, POWER_DOMAIN_GMBUS);
-
- to_intel_connector(connector)->detect_edid = edid;
- if (edid && edid->input & DRM_EDID_INPUT_DIGITAL) {
-@@ -1465,37 +1463,16 @@ static enum drm_connector_status
- intel_hdmi_detect(struct drm_connector *connector, bool force)
- {
- enum drm_connector_status status;
-- struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
- struct drm_i915_private *dev_priv = to_i915(connector->dev);
-- bool live_status = false;
-- unsigned int try;
-
- DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
- connector->base.id, connector->name);
-
- intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS);
-
-- for (try = 0; !live_status && try < 9; try++) {
-- if (try)
-- msleep(10);
-- live_status = intel_digital_port_connected(dev_priv,
-- hdmi_to_dig_port(intel_hdmi));
-- }
--
-- if (!live_status) {
-- DRM_DEBUG_KMS("HDMI live status down\n");
-- /*
-- * Live status register is not reliable on all intel platforms.
-- * So consider live_status only for certain platforms, for
-- * others, read EDID to determine presence of sink.
-- */
-- if (INTEL_INFO(dev_priv)->gen < 7 || IS_IVYBRIDGE(dev_priv))
-- live_status = true;
-- }
--
- intel_hdmi_unset_edid(connector);
-
-- if (intel_hdmi_set_edid(connector, live_status)) {
-+ if (intel_hdmi_set_edid(connector)) {
- struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
-
- hdmi_to_dig_port(intel_hdmi)->base.type = INTEL_OUTPUT_HDMI;
-@@ -1521,7 +1498,7 @@ intel_hdmi_force(struct drm_connector *connector)
- if (connector->status != connector_status_connected)
- return;
-
-- intel_hdmi_set_edid(connector, true);
-+ intel_hdmi_set_edid(connector);
- hdmi_to_dig_port(intel_hdmi)->base.type = INTEL_OUTPUT_HDMI;
- }
-
-diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c
-index 96c65d7..9a2393a 100644
---- a/drivers/gpu/drm/i915/intel_panel.c
-+++ b/drivers/gpu/drm/i915/intel_panel.c
-@@ -841,7 +841,7 @@ static void lpt_enable_backlight(struct intel_connector *connector)
- {
- struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
- struct intel_panel *panel = &connector->panel;
-- u32 pch_ctl1, pch_ctl2;
-+ u32 pch_ctl1, pch_ctl2, schicken;
-
- pch_ctl1 = I915_READ(BLC_PWM_PCH_CTL1);
- if (pch_ctl1 & BLM_PCH_PWM_ENABLE) {
-@@ -850,6 +850,22 @@ static void lpt_enable_backlight(struct intel_connector *connector)
- I915_WRITE(BLC_PWM_PCH_CTL1, pch_ctl1);
- }
-
-+ if (HAS_PCH_LPT(dev_priv)) {
-+ schicken = I915_READ(SOUTH_CHICKEN2);
-+ if (panel->backlight.alternate_pwm_increment)
-+ schicken |= LPT_PWM_GRANULARITY;
-+ else
-+ schicken &= ~LPT_PWM_GRANULARITY;
-+ I915_WRITE(SOUTH_CHICKEN2, schicken);
-+ } else {
-+ schicken = I915_READ(SOUTH_CHICKEN1);
-+ if (panel->backlight.alternate_pwm_increment)
-+ schicken |= SPT_PWM_GRANULARITY;
-+ else
-+ schicken &= ~SPT_PWM_GRANULARITY;
-+ I915_WRITE(SOUTH_CHICKEN1, schicken);
-+ }
-+
- pch_ctl2 = panel->backlight.max << 16;
- I915_WRITE(BLC_PWM_PCH_CTL2, pch_ctl2);
-
-@@ -1242,10 +1258,10 @@ static u32 bxt_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
- */
- static u32 spt_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
- {
-- struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
-+ struct intel_panel *panel = &connector->panel;
- u32 mul;
-
-- if (I915_READ(SOUTH_CHICKEN1) & SPT_PWM_GRANULARITY)
-+ if (panel->backlight.alternate_pwm_increment)
- mul = 128;
- else
- mul = 16;
-@@ -1261,9 +1277,10 @@ static u32 spt_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
- static u32 lpt_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
- {
- struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
-+ struct intel_panel *panel = &connector->panel;
- u32 mul, clock;
-
-- if (I915_READ(SOUTH_CHICKEN2) & LPT_PWM_GRANULARITY)
-+ if (panel->backlight.alternate_pwm_increment)
- mul = 16;
- else
- mul = 128;
-@@ -1414,6 +1431,13 @@ static int lpt_setup_backlight(struct intel_connector *connector, enum pipe unus
- struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
- struct intel_panel *panel = &connector->panel;
- u32 pch_ctl1, pch_ctl2, val;
-+ bool alt;
-+
-+ if (HAS_PCH_LPT(dev_priv))
-+ alt = I915_READ(SOUTH_CHICKEN2) & LPT_PWM_GRANULARITY;
-+ else
-+ alt = I915_READ(SOUTH_CHICKEN1) & SPT_PWM_GRANULARITY;
-+ panel->backlight.alternate_pwm_increment = alt;
-
- pch_ctl1 = I915_READ(BLC_PWM_PCH_CTL1);
- panel->backlight.active_low_pwm = pch_ctl1 & BLM_PCH_POLARITY;
-diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
-index 2d24813..e59a28c 100644
---- a/drivers/gpu/drm/i915/intel_pm.c
-+++ b/drivers/gpu/drm/i915/intel_pm.c
-@@ -2119,32 +2119,34 @@ static void intel_read_wm_latency(struct drm_device *dev, uint16_t wm[8])
- GEN9_MEM_LATENCY_LEVEL_MASK;
-
- /*
-+ * If a level n (n > 1) has a 0us latency, all levels m (m >= n)
-+ * need to be disabled. We make sure to sanitize the values out
-+ * of the punit to satisfy this requirement.
-+ */
-+ for (level = 1; level <= max_level; level++) {
-+ if (wm[level] == 0) {
-+ for (i = level + 1; i <= max_level; i++)
-+ wm[i] = 0;
-+ break;
-+ }
-+ }
-+
-+ /*
- * WaWmMemoryReadLatency:skl
- *
- * punit doesn't take into account the read latency so we need
-- * to add 2us to the various latency levels we retrieve from
-- * the punit.
-- * - W0 is a bit special in that it's the only level that
-- * can't be disabled if we want to have display working, so
-- * we always add 2us there.
-- * - For levels >=1, punit returns 0us latency when they are
-- * disabled, so we respect that and don't add 2us then
-- *
-- * Additionally, if a level n (n > 1) has a 0us latency, all
-- * levels m (m >= n) need to be disabled. We make sure to
-- * sanitize the values out of the punit to satisfy this
-- * requirement.
-+ * to add 2us to the various latency levels we retrieve from the
-+ * punit when level 0 response data us 0us.
- */
-- wm[0] += 2;
-- for (level = 1; level <= max_level; level++)
-- if (wm[level] != 0)
-+ if (wm[0] == 0) {
-+ wm[0] += 2;
-+ for (level = 1; level <= max_level; level++) {
-+ if (wm[level] == 0)
-+ break;
- wm[level] += 2;
-- else {
-- for (i = level + 1; i <= max_level; i++)
-- wm[i] = 0;
--
-- break;
- }
-+ }
-+
- } else if (IS_HASWELL(dev) || IS_BROADWELL(dev)) {
- uint64_t sskpd = I915_READ64(MCH_SSKPD);
-
-@@ -2876,6 +2878,19 @@ skl_wm_plane_id(const struct intel_plane *plane)
- }
- }
-
-+static bool
-+intel_has_sagv(struct drm_i915_private *dev_priv)
-+{
-+ if (IS_KABYLAKE(dev_priv))
-+ return true;
-+
-+ if (IS_SKYLAKE(dev_priv) &&
-+ dev_priv->sagv_status != I915_SAGV_NOT_CONTROLLED)
-+ return true;
-+
-+ return false;
-+}
-+
- /*
- * SAGV dynamically adjusts the system agent voltage and clock frequencies
- * depending on power and performance requirements. The display engine access
-@@ -2888,12 +2903,14 @@ skl_wm_plane_id(const struct intel_plane *plane)
- * - We're not using an interlaced display configuration
- */
- int
--skl_enable_sagv(struct drm_i915_private *dev_priv)
-+intel_enable_sagv(struct drm_i915_private *dev_priv)
- {
- int ret;
-
-- if (dev_priv->skl_sagv_status == I915_SKL_SAGV_NOT_CONTROLLED ||
-- dev_priv->skl_sagv_status == I915_SKL_SAGV_ENABLED)
-+ if (!intel_has_sagv(dev_priv))
-+ return 0;
-+
-+ if (dev_priv->sagv_status == I915_SAGV_ENABLED)
- return 0;
-
- DRM_DEBUG_KMS("Enabling the SAGV\n");
-@@ -2909,21 +2926,21 @@ skl_enable_sagv(struct drm_i915_private *dev_priv)
- * Some skl systems, pre-release machines in particular,
- * don't actually have an SAGV.
- */
-- if (ret == -ENXIO) {
-+ if (IS_SKYLAKE(dev_priv) && ret == -ENXIO) {
- DRM_DEBUG_DRIVER("No SAGV found on system, ignoring\n");
-- dev_priv->skl_sagv_status = I915_SKL_SAGV_NOT_CONTROLLED;
-+ dev_priv->sagv_status = I915_SAGV_NOT_CONTROLLED;
- return 0;
- } else if (ret < 0) {
- DRM_ERROR("Failed to enable the SAGV\n");
- return ret;
- }
-
-- dev_priv->skl_sagv_status = I915_SKL_SAGV_ENABLED;
-+ dev_priv->sagv_status = I915_SAGV_ENABLED;
- return 0;
- }
-
- static int
--skl_do_sagv_disable(struct drm_i915_private *dev_priv)
-+intel_do_sagv_disable(struct drm_i915_private *dev_priv)
- {
- int ret;
- uint32_t temp = GEN9_SAGV_DISABLE;
-@@ -2937,19 +2954,21 @@ skl_do_sagv_disable(struct drm_i915_private *dev_priv)
- }
-
- int
--skl_disable_sagv(struct drm_i915_private *dev_priv)
-+intel_disable_sagv(struct drm_i915_private *dev_priv)
- {
- int ret, result;
-
-- if (dev_priv->skl_sagv_status == I915_SKL_SAGV_NOT_CONTROLLED ||
-- dev_priv->skl_sagv_status == I915_SKL_SAGV_DISABLED)
-+ if (!intel_has_sagv(dev_priv))
-+ return 0;
-+
-+ if (dev_priv->sagv_status == I915_SAGV_DISABLED)
- return 0;
-
- DRM_DEBUG_KMS("Disabling the SAGV\n");
- mutex_lock(&dev_priv->rps.hw_lock);
-
- /* bspec says to keep retrying for at least 1 ms */
-- ret = wait_for(result = skl_do_sagv_disable(dev_priv), 1);
-+ ret = wait_for(result = intel_do_sagv_disable(dev_priv), 1);
- mutex_unlock(&dev_priv->rps.hw_lock);
-
- if (ret == -ETIMEDOUT) {
-@@ -2961,20 +2980,20 @@ skl_disable_sagv(struct drm_i915_private *dev_priv)
- * Some skl systems, pre-release machines in particular,
- * don't actually have an SAGV.
- */
-- if (result == -ENXIO) {
-+ if (IS_SKYLAKE(dev_priv) && result == -ENXIO) {
- DRM_DEBUG_DRIVER("No SAGV found on system, ignoring\n");
-- dev_priv->skl_sagv_status = I915_SKL_SAGV_NOT_CONTROLLED;
-+ dev_priv->sagv_status = I915_SAGV_NOT_CONTROLLED;
- return 0;
- } else if (result < 0) {
- DRM_ERROR("Failed to disable the SAGV\n");
- return result;
- }
-
-- dev_priv->skl_sagv_status = I915_SKL_SAGV_DISABLED;
-+ dev_priv->sagv_status = I915_SAGV_DISABLED;
- return 0;
- }
-
--bool skl_can_enable_sagv(struct drm_atomic_state *state)
-+bool intel_can_enable_sagv(struct drm_atomic_state *state)
- {
- struct drm_device *dev = state->dev;
- struct drm_i915_private *dev_priv = to_i915(dev);
-@@ -2983,6 +3002,9 @@ bool skl_can_enable_sagv(struct drm_atomic_state *state)
- enum pipe pipe;
- int level, plane;
-
-+ if (!intel_has_sagv(dev_priv))
-+ return false;
-+
- /*
- * SKL workaround: bspec recommends we disable the SAGV when we have
- * more then one pipe enabled
-@@ -3473,29 +3495,14 @@ static uint32_t skl_wm_method1(uint32_t pixel_rate, uint8_t cpp, uint32_t latenc
- }
-
- static uint32_t skl_wm_method2(uint32_t pixel_rate, uint32_t pipe_htotal,
-- uint32_t horiz_pixels, uint8_t cpp,
-- uint64_t tiling, uint32_t latency)
-+ uint32_t latency, uint32_t plane_blocks_per_line)
- {
- uint32_t ret;
-- uint32_t plane_bytes_per_line, plane_blocks_per_line;
- uint32_t wm_intermediate_val;
-
- if (latency == 0)
- return UINT_MAX;
-
-- plane_bytes_per_line = horiz_pixels * cpp;
--
-- if (tiling == I915_FORMAT_MOD_Y_TILED ||
-- tiling == I915_FORMAT_MOD_Yf_TILED) {
-- plane_bytes_per_line *= 4;
-- plane_blocks_per_line = DIV_ROUND_UP(plane_bytes_per_line, 512);
-- plane_blocks_per_line /= 4;
-- } else if (tiling == DRM_FORMAT_MOD_NONE) {
-- plane_blocks_per_line = DIV_ROUND_UP(plane_bytes_per_line, 512) + 1;
-- } else {
-- plane_blocks_per_line = DIV_ROUND_UP(plane_bytes_per_line, 512);
-- }
--
- wm_intermediate_val = latency * pixel_rate;
- ret = DIV_ROUND_UP(wm_intermediate_val, pipe_htotal * 1000) *
- plane_blocks_per_line;
-@@ -3546,6 +3553,7 @@ static int skl_compute_plane_wm(const struct drm_i915_private *dev_priv,
- uint8_t cpp;
- uint32_t width = 0, height = 0;
- uint32_t plane_pixel_rate;
-+ uint32_t y_tile_minimum, y_min_scanlines;
-
- if (latency == 0 || !cstate->base.active || !intel_pstate->visible) {
- *enabled = false;
-@@ -3561,38 +3569,51 @@ static int skl_compute_plane_wm(const struct drm_i915_private *dev_priv,
- cpp = drm_format_plane_cpp(fb->pixel_format, 0);
- plane_pixel_rate = skl_adjusted_plane_pixel_rate(cstate, intel_pstate);
-
-+ if (intel_rotation_90_or_270(pstate->rotation)) {
-+ int cpp = (fb->pixel_format == DRM_FORMAT_NV12) ?
-+ drm_format_plane_cpp(fb->pixel_format, 1) :
-+ drm_format_plane_cpp(fb->pixel_format, 0);
-+
-+ switch (cpp) {
-+ case 1:
-+ y_min_scanlines = 16;
-+ break;
-+ case 2:
-+ y_min_scanlines = 8;
-+ break;
-+ default:
-+ WARN(1, "Unsupported pixel depth for rotation");
-+ case 4:
-+ y_min_scanlines = 4;
-+ break;
-+ }
-+ } else {
-+ y_min_scanlines = 4;
-+ }
-+
-+ plane_bytes_per_line = width * cpp;
-+ if (fb->modifier[0] == I915_FORMAT_MOD_Y_TILED ||
-+ fb->modifier[0] == I915_FORMAT_MOD_Yf_TILED) {
-+ plane_blocks_per_line =
-+ DIV_ROUND_UP(plane_bytes_per_line * y_min_scanlines, 512);
-+ plane_blocks_per_line /= y_min_scanlines;
-+ } else if (fb->modifier[0] == DRM_FORMAT_MOD_NONE) {
-+ plane_blocks_per_line = DIV_ROUND_UP(plane_bytes_per_line, 512)
-+ + 1;
-+ } else {
-+ plane_blocks_per_line = DIV_ROUND_UP(plane_bytes_per_line, 512);
-+ }
-+
- method1 = skl_wm_method1(plane_pixel_rate, cpp, latency);
- method2 = skl_wm_method2(plane_pixel_rate,
- cstate->base.adjusted_mode.crtc_htotal,
-- width,
-- cpp,
-- fb->modifier[0],
-- latency);
-+ latency,
-+ plane_blocks_per_line);
-
-- plane_bytes_per_line = width * cpp;
-- plane_blocks_per_line = DIV_ROUND_UP(plane_bytes_per_line, 512);
-+ y_tile_minimum = plane_blocks_per_line * y_min_scanlines;
-
- if (fb->modifier[0] == I915_FORMAT_MOD_Y_TILED ||
- fb->modifier[0] == I915_FORMAT_MOD_Yf_TILED) {
-- uint32_t min_scanlines = 4;
-- uint32_t y_tile_minimum;
-- if (intel_rotation_90_or_270(pstate->rotation)) {
-- int cpp = (fb->pixel_format == DRM_FORMAT_NV12) ?
-- drm_format_plane_cpp(fb->pixel_format, 1) :
-- drm_format_plane_cpp(fb->pixel_format, 0);
--
-- switch (cpp) {
-- case 1:
-- min_scanlines = 16;
-- break;
-- case 2:
-- min_scanlines = 8;
-- break;
-- case 8:
-- WARN(1, "Unsupported pixel depth for rotation");
-- }
-- }
-- y_tile_minimum = plane_blocks_per_line * min_scanlines;
- selected_result = max(method2, y_tile_minimum);
- } else {
- if ((ddb_allocation / plane_blocks_per_line) >= 1)
-@@ -3606,10 +3627,12 @@ static int skl_compute_plane_wm(const struct drm_i915_private *dev_priv,
-
- if (level >= 1 && level <= 7) {
- if (fb->modifier[0] == I915_FORMAT_MOD_Y_TILED ||
-- fb->modifier[0] == I915_FORMAT_MOD_Yf_TILED)
-- res_lines += 4;
-- else
-+ fb->modifier[0] == I915_FORMAT_MOD_Yf_TILED) {
-+ res_blocks += y_tile_minimum;
-+ res_lines += y_min_scanlines;
-+ } else {
- res_blocks++;
-+ }
- }
-
- if (res_blocks >= ddb_allocation || res_lines > 31) {
-@@ -3828,183 +3851,82 @@ static void skl_ddb_entry_write(struct drm_i915_private *dev_priv,
- I915_WRITE(reg, 0);
- }
-
--static void skl_write_wm_values(struct drm_i915_private *dev_priv,
-- const struct skl_wm_values *new)
-+void skl_write_plane_wm(struct intel_crtc *intel_crtc,
-+ const struct skl_wm_values *wm,
-+ int plane)
- {
-- struct drm_device *dev = &dev_priv->drm;
-- struct intel_crtc *crtc;
--
-- for_each_intel_crtc(dev, crtc) {
-- int i, level, max_level = ilk_wm_max_level(dev);
-- enum pipe pipe = crtc->pipe;
--
-- if ((new->dirty_pipes & drm_crtc_mask(&crtc->base)) == 0)
-- continue;
-- if (!crtc->active)
-- continue;
--
-- I915_WRITE(PIPE_WM_LINETIME(pipe), new->wm_linetime[pipe]);
--
-- for (level = 0; level <= max_level; level++) {
-- for (i = 0; i < intel_num_planes(crtc); i++)
-- I915_WRITE(PLANE_WM(pipe, i, level),
-- new->plane[pipe][i][level]);
-- I915_WRITE(CUR_WM(pipe, level),
-- new->plane[pipe][PLANE_CURSOR][level]);
-- }
-- for (i = 0; i < intel_num_planes(crtc); i++)
-- I915_WRITE(PLANE_WM_TRANS(pipe, i),
-- new->plane_trans[pipe][i]);
-- I915_WRITE(CUR_WM_TRANS(pipe),
-- new->plane_trans[pipe][PLANE_CURSOR]);
--
-- for (i = 0; i < intel_num_planes(crtc); i++) {
-- skl_ddb_entry_write(dev_priv,
-- PLANE_BUF_CFG(pipe, i),
-- &new->ddb.plane[pipe][i]);
-- skl_ddb_entry_write(dev_priv,
-- PLANE_NV12_BUF_CFG(pipe, i),
-- &new->ddb.y_plane[pipe][i]);
-- }
-+ struct drm_crtc *crtc = &intel_crtc->base;
-+ struct drm_device *dev = crtc->dev;
-+ struct drm_i915_private *dev_priv = to_i915(dev);
-+ int level, max_level = ilk_wm_max_level(dev);
-+ enum pipe pipe = intel_crtc->pipe;
-
-- skl_ddb_entry_write(dev_priv, CUR_BUF_CFG(pipe),
-- &new->ddb.plane[pipe][PLANE_CURSOR]);
-+ for (level = 0; level <= max_level; level++) {
-+ I915_WRITE(PLANE_WM(pipe, plane, level),
-+ wm->plane[pipe][plane][level]);
- }
--}
-+ I915_WRITE(PLANE_WM_TRANS(pipe, plane), wm->plane_trans[pipe][plane]);
-
--/*
-- * When setting up a new DDB allocation arrangement, we need to correctly
-- * sequence the times at which the new allocations for the pipes are taken into
-- * account or we'll have pipes fetching from space previously allocated to
-- * another pipe.
-- *
-- * Roughly the sequence looks like:
-- * 1. re-allocate the pipe(s) with the allocation being reduced and not
-- * overlapping with a previous light-up pipe (another way to put it is:
-- * pipes with their new allocation strickly included into their old ones).
-- * 2. re-allocate the other pipes that get their allocation reduced
-- * 3. allocate the pipes having their allocation increased
-- *
-- * Steps 1. and 2. are here to take care of the following case:
-- * - Initially DDB looks like this:
-- * | B | C |
-- * - enable pipe A.
-- * - pipe B has a reduced DDB allocation that overlaps with the old pipe C
-- * allocation
-- * | A | B | C |
-- *
-- * We need to sequence the re-allocation: C, B, A (and not B, C, A).
-- */
-+ skl_ddb_entry_write(dev_priv, PLANE_BUF_CFG(pipe, plane),
-+ &wm->ddb.plane[pipe][plane]);
-+ skl_ddb_entry_write(dev_priv, PLANE_NV12_BUF_CFG(pipe, plane),
-+ &wm->ddb.y_plane[pipe][plane]);
-+}
-
--static void
--skl_wm_flush_pipe(struct drm_i915_private *dev_priv, enum pipe pipe, int pass)
-+void skl_write_cursor_wm(struct intel_crtc *intel_crtc,
-+ const struct skl_wm_values *wm)
- {
-- int plane;
--
-- DRM_DEBUG_KMS("flush pipe %c (pass %d)\n", pipe_name(pipe), pass);
-+ struct drm_crtc *crtc = &intel_crtc->base;
-+ struct drm_device *dev = crtc->dev;
-+ struct drm_i915_private *dev_priv = to_i915(dev);
-+ int level, max_level = ilk_wm_max_level(dev);
-+ enum pipe pipe = intel_crtc->pipe;
-
-- for_each_plane(dev_priv, pipe, plane) {
-- I915_WRITE(PLANE_SURF(pipe, plane),
-- I915_READ(PLANE_SURF(pipe, plane)));
-+ for (level = 0; level <= max_level; level++) {
-+ I915_WRITE(CUR_WM(pipe, level),
-+ wm->plane[pipe][PLANE_CURSOR][level]);
- }
-- I915_WRITE(CURBASE(pipe), I915_READ(CURBASE(pipe)));
-+ I915_WRITE(CUR_WM_TRANS(pipe), wm->plane_trans[pipe][PLANE_CURSOR]);
-+
-+ skl_ddb_entry_write(dev_priv, CUR_BUF_CFG(pipe),
-+ &wm->ddb.plane[pipe][PLANE_CURSOR]);
- }
-
--static bool
--skl_ddb_allocation_included(const struct skl_ddb_allocation *old,
-- const struct skl_ddb_allocation *new,
-- enum pipe pipe)
-+bool skl_ddb_allocation_equals(const struct skl_ddb_allocation *old,
-+ const struct skl_ddb_allocation *new,
-+ enum pipe pipe)
- {
-- uint16_t old_size, new_size;
--
-- old_size = skl_ddb_entry_size(&old->pipe[pipe]);
-- new_size = skl_ddb_entry_size(&new->pipe[pipe]);
--
-- return old_size != new_size &&
-- new->pipe[pipe].start >= old->pipe[pipe].start &&
-- new->pipe[pipe].end <= old->pipe[pipe].end;
-+ return new->pipe[pipe].start == old->pipe[pipe].start &&
-+ new->pipe[pipe].end == old->pipe[pipe].end;
- }
-
--static void skl_flush_wm_values(struct drm_i915_private *dev_priv,
-- struct skl_wm_values *new_values)
-+static inline bool skl_ddb_entries_overlap(const struct skl_ddb_entry *a,
-+ const struct skl_ddb_entry *b)
- {
-- struct drm_device *dev = &dev_priv->drm;
-- struct skl_ddb_allocation *cur_ddb, *new_ddb;
-- bool reallocated[I915_MAX_PIPES] = {};
-- struct intel_crtc *crtc;
-- enum pipe pipe;
--
-- new_ddb = &new_values->ddb;
-- cur_ddb = &dev_priv->wm.skl_hw.ddb;
--
-- /*
-- * First pass: flush the pipes with the new allocation contained into
-- * the old space.
-- *
-- * We'll wait for the vblank on those pipes to ensure we can safely
-- * re-allocate the freed space without this pipe fetching from it.
-- */
-- for_each_intel_crtc(dev, crtc) {
-- if (!crtc->active)
-- continue;
--
-- pipe = crtc->pipe;
--
-- if (!skl_ddb_allocation_included(cur_ddb, new_ddb, pipe))
-- continue;
--
-- skl_wm_flush_pipe(dev_priv, pipe, 1);
-- intel_wait_for_vblank(dev, pipe);
--
-- reallocated[pipe] = true;
-- }
--
-+ return a->start < b->end && b->start < a->end;
-+}
-
-- /*
-- * Second pass: flush the pipes that are having their allocation
-- * reduced, but overlapping with a previous allocation.
-- *
-- * Here as well we need to wait for the vblank to make sure the freed
-- * space is not used anymore.
-- */
-- for_each_intel_crtc(dev, crtc) {
-- if (!crtc->active)
-- continue;
-+bool skl_ddb_allocation_overlaps(struct drm_atomic_state *state,
-+ const struct skl_ddb_allocation *old,
-+ const struct skl_ddb_allocation *new,
-+ enum pipe pipe)
-+{
-+ struct drm_device *dev = state->dev;
-+ struct intel_crtc *intel_crtc;
-+ enum pipe otherp;
-
-- pipe = crtc->pipe;
-+ for_each_intel_crtc(dev, intel_crtc) {
-+ otherp = intel_crtc->pipe;
-
-- if (reallocated[pipe])
-+ if (otherp == pipe)
- continue;
-
-- if (skl_ddb_entry_size(&new_ddb->pipe[pipe]) <
-- skl_ddb_entry_size(&cur_ddb->pipe[pipe])) {
-- skl_wm_flush_pipe(dev_priv, pipe, 2);
-- intel_wait_for_vblank(dev, pipe);
-- reallocated[pipe] = true;
-- }
-+ if (skl_ddb_entries_overlap(&new->pipe[pipe],
-+ &old->pipe[otherp]))
-+ return true;
- }
-
-- /*
-- * Third pass: flush the pipes that got more space allocated.
-- *
-- * We don't need to actively wait for the update here, next vblank
-- * will just get more DDB space with the correct WM values.
-- */
-- for_each_intel_crtc(dev, crtc) {
-- if (!crtc->active)
-- continue;
--
-- pipe = crtc->pipe;
--
-- /*
-- * At this point, only the pipes more space than before are
-- * left to re-allocate.
-- */
-- if (reallocated[pipe])
-- continue;
--
-- skl_wm_flush_pipe(dev_priv, pipe, 3);
-- }
-+ return false;
- }
-
- static int skl_update_pipe_wm(struct drm_crtc_state *cstate,
-@@ -4041,6 +3963,41 @@ pipes_modified(struct drm_atomic_state *state)
- return ret;
- }
-
-+int
-+skl_ddb_add_affected_planes(struct intel_crtc_state *cstate)
-+{
-+ struct drm_atomic_state *state = cstate->base.state;
-+ struct drm_device *dev = state->dev;
-+ struct drm_crtc *crtc = cstate->base.crtc;
-+ struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
-+ struct drm_i915_private *dev_priv = to_i915(dev);
-+ struct intel_atomic_state *intel_state = to_intel_atomic_state(state);
-+ struct skl_ddb_allocation *new_ddb = &intel_state->wm_results.ddb;
-+ struct skl_ddb_allocation *cur_ddb = &dev_priv->wm.skl_hw.ddb;
-+ struct drm_plane_state *plane_state;
-+ struct drm_plane *plane;
-+ enum pipe pipe = intel_crtc->pipe;
-+ int id;
-+
-+ WARN_ON(!drm_atomic_get_existing_crtc_state(state, crtc));
-+
-+ drm_for_each_plane_mask(plane, dev, crtc->state->plane_mask) {
-+ id = skl_wm_plane_id(to_intel_plane(plane));
-+
-+ if (skl_ddb_entry_equal(&cur_ddb->plane[pipe][id],
-+ &new_ddb->plane[pipe][id]) &&
-+ skl_ddb_entry_equal(&cur_ddb->y_plane[pipe][id],
-+ &new_ddb->y_plane[pipe][id]))
-+ continue;
-+
-+ plane_state = drm_atomic_get_plane_state(state, plane);
-+ if (IS_ERR(plane_state))
-+ return PTR_ERR(plane_state);
-+ }
-+
-+ return 0;
-+}
-+
- static int
- skl_compute_ddb(struct drm_atomic_state *state)
- {
-@@ -4105,6 +4062,10 @@ skl_compute_ddb(struct drm_atomic_state *state)
- if (ret)
- return ret;
-
-+ ret = skl_ddb_add_affected_planes(cstate);
-+ if (ret)
-+ return ret;
-+
- ret = drm_atomic_add_affected_planes(state, &intel_crtc->base);
- if (ret)
- return ret;
-@@ -4206,7 +4167,7 @@ static void skl_update_wm(struct drm_crtc *crtc)
- struct skl_wm_values *hw_vals = &dev_priv->wm.skl_hw;
- struct intel_crtc_state *cstate = to_intel_crtc_state(crtc->state);
- struct skl_pipe_wm *pipe_wm = &cstate->wm.skl.optimal;
-- int pipe;
-+ enum pipe pipe = intel_crtc->pipe;
-
- if ((results->dirty_pipes & drm_crtc_mask(crtc)) == 0)
- return;
-@@ -4215,15 +4176,22 @@ static void skl_update_wm(struct drm_crtc *crtc)
-
- mutex_lock(&dev_priv->wm.wm_mutex);
-
-- skl_write_wm_values(dev_priv, results);
-- skl_flush_wm_values(dev_priv, results);
--
- /*
-- * Store the new configuration (but only for the pipes that have
-- * changed; the other values weren't recomputed).
-+ * If this pipe isn't active already, we're going to be enabling it
-+ * very soon. Since it's safe to update a pipe's ddb allocation while
-+ * the pipe's shut off, just do so here. Already active pipes will have
-+ * their watermarks updated once we update their planes.
- */
-- for_each_pipe_masked(dev_priv, pipe, results->dirty_pipes)
-- skl_copy_wm_for_pipe(hw_vals, results, pipe);
-+ if (crtc->state->active_changed) {
-+ int plane;
-+
-+ for (plane = 0; plane < intel_num_planes(intel_crtc); plane++)
-+ skl_write_plane_wm(intel_crtc, results, plane);
-+
-+ skl_write_cursor_wm(intel_crtc, results);
-+ }
-+
-+ skl_copy_wm_for_pipe(hw_vals, results, pipe);
-
- mutex_unlock(&dev_priv->wm.wm_mutex);
- }
-diff --git a/drivers/gpu/drm/i915/intel_sprite.c b/drivers/gpu/drm/i915/intel_sprite.c
-index 7c08e4f..4178849 100644
---- a/drivers/gpu/drm/i915/intel_sprite.c
-+++ b/drivers/gpu/drm/i915/intel_sprite.c
-@@ -203,6 +203,9 @@ skl_update_plane(struct drm_plane *drm_plane,
- struct intel_plane *intel_plane = to_intel_plane(drm_plane);
- struct drm_framebuffer *fb = plane_state->base.fb;
- struct drm_i915_gem_object *obj = intel_fb_obj(fb);
-+ const struct skl_wm_values *wm = &dev_priv->wm.skl_results;
-+ struct drm_crtc *crtc = crtc_state->base.crtc;
-+ struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
- const int pipe = intel_plane->pipe;
- const int plane = intel_plane->plane + 1;
- u32 plane_ctl, stride_div, stride;
-@@ -238,6 +241,9 @@ skl_update_plane(struct drm_plane *drm_plane,
- crtc_w--;
- crtc_h--;
-
-+ if (wm->dirty_pipes & drm_crtc_mask(crtc))
-+ skl_write_plane_wm(intel_crtc, wm, plane);
-+
- if (key->flags) {
- I915_WRITE(PLANE_KEYVAL(pipe, plane), key->min_value);
- I915_WRITE(PLANE_KEYMAX(pipe, plane), key->max_value);
-@@ -308,6 +314,14 @@ skl_disable_plane(struct drm_plane *dplane, struct drm_crtc *crtc)
- const int pipe = intel_plane->pipe;
- const int plane = intel_plane->plane + 1;
-
-+ /*
-+ * We only populate skl_results on watermark updates, and if the
-+ * plane's visiblity isn't actually changing neither is its watermarks.
-+ */
-+ if (!to_intel_plane_state(dplane->state)->visible)
-+ skl_write_plane_wm(to_intel_crtc(crtc),
-+ &dev_priv->wm.skl_results, plane);
-+
- I915_WRITE(PLANE_CTL(pipe, plane), 0);
-
- I915_WRITE(PLANE_SURF(pipe, plane), 0);
-diff --git a/drivers/gpu/drm/i915/intel_uncore.c b/drivers/gpu/drm/i915/intel_uncore.c
-index ff80a81..ec28b15 100644
---- a/drivers/gpu/drm/i915/intel_uncore.c
-+++ b/drivers/gpu/drm/i915/intel_uncore.c
-@@ -796,10 +796,9 @@ __unclaimed_reg_debug(struct drm_i915_private *dev_priv,
- const bool read,
- const bool before)
- {
-- if (WARN(check_for_unclaimed_mmio(dev_priv),
-- "Unclaimed register detected %s %s register 0x%x\n",
-- before ? "before" : "after",
-- read ? "reading" : "writing to",
-+ if (WARN(check_for_unclaimed_mmio(dev_priv) && !before,
-+ "Unclaimed %s register 0x%x\n",
-+ read ? "read from" : "write to",
- i915_mmio_reg_offset(reg)))
- i915.mmio_debug--; /* Only report the first N failures */
- }
-diff --git a/drivers/gpu/drm/radeon/r600_dpm.c b/drivers/gpu/drm/radeon/r600_dpm.c
-index 6a4b020..5a26eb4 100644
---- a/drivers/gpu/drm/radeon/r600_dpm.c
-+++ b/drivers/gpu/drm/radeon/r600_dpm.c
-@@ -156,19 +156,20 @@ u32 r600_dpm_get_vblank_time(struct radeon_device *rdev)
- struct drm_device *dev = rdev->ddev;
- struct drm_crtc *crtc;
- struct radeon_crtc *radeon_crtc;
-- u32 line_time_us, vblank_lines;
-+ u32 vblank_in_pixels;
- u32 vblank_time_us = 0xffffffff; /* if the displays are off, vblank time is max */
-
- if (rdev->num_crtc && rdev->mode_info.mode_config_initialized) {
- list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
- radeon_crtc = to_radeon_crtc(crtc);
- if (crtc->enabled && radeon_crtc->enabled && radeon_crtc->hw_mode.clock) {
-- line_time_us = (radeon_crtc->hw_mode.crtc_htotal * 1000) /
-- radeon_crtc->hw_mode.clock;
-- vblank_lines = radeon_crtc->hw_mode.crtc_vblank_end -
-- radeon_crtc->hw_mode.crtc_vdisplay +
-- (radeon_crtc->v_border * 2);
-- vblank_time_us = vblank_lines * line_time_us;
-+ vblank_in_pixels =
-+ radeon_crtc->hw_mode.crtc_htotal *
-+ (radeon_crtc->hw_mode.crtc_vblank_end -
-+ radeon_crtc->hw_mode.crtc_vdisplay +
-+ (radeon_crtc->v_border * 2));
-+
-+ vblank_time_us = vblank_in_pixels * 1000 / radeon_crtc->hw_mode.clock;
- break;
- }
- }
-diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c
-index a00dd2f..554ca71 100644
---- a/drivers/gpu/drm/radeon/radeon_device.c
-+++ b/drivers/gpu/drm/radeon/radeon_device.c
-@@ -661,8 +661,9 @@ bool radeon_card_posted(struct radeon_device *rdev)
- {
- uint32_t reg;
-
-- /* for pass through, always force asic_init */
-- if (radeon_device_is_virtual())
-+ /* for pass through, always force asic_init for CI */
-+ if (rdev->family >= CHIP_BONAIRE &&
-+ radeon_device_is_virtual())
- return false;
-
- /* required for EFI mode on macbook2,1 which uses an r5xx asic */
-diff --git a/drivers/gpu/drm/radeon/si_dpm.c b/drivers/gpu/drm/radeon/si_dpm.c
-index 1f78ec2..89bdf20 100644
---- a/drivers/gpu/drm/radeon/si_dpm.c
-+++ b/drivers/gpu/drm/radeon/si_dpm.c
-@@ -4112,7 +4112,7 @@ static int si_populate_smc_voltage_tables(struct radeon_device *rdev,
- &rdev->pm.dpm.dyn_state.phase_shedding_limits_table)) {
- si_populate_smc_voltage_table(rdev, &si_pi->vddc_phase_shed_table, table);
-
-- table->phaseMaskTable.lowMask[SISLANDS_SMC_VOLTAGEMASK_VDDC] =
-+ table->phaseMaskTable.lowMask[SISLANDS_SMC_VOLTAGEMASK_VDDC_PHASE_SHEDDING] =
- cpu_to_be32(si_pi->vddc_phase_shed_table.mask_low);
-
- si_write_smc_soft_register(rdev, SI_SMC_SOFT_REGISTER_phase_shedding_delay,
-diff --git a/drivers/gpu/drm/radeon/sislands_smc.h b/drivers/gpu/drm/radeon/sislands_smc.h
-index 3c77983..966e3a5 100644
---- a/drivers/gpu/drm/radeon/sislands_smc.h
-+++ b/drivers/gpu/drm/radeon/sislands_smc.h
-@@ -194,6 +194,7 @@ typedef struct SISLANDS_SMC_SWSTATE SISLANDS_SMC_SWSTATE;
- #define SISLANDS_SMC_VOLTAGEMASK_VDDC 0
- #define SISLANDS_SMC_VOLTAGEMASK_MVDD 1
- #define SISLANDS_SMC_VOLTAGEMASK_VDDCI 2
-+#define SISLANDS_SMC_VOLTAGEMASK_VDDC_PHASE_SHEDDING 3
- #define SISLANDS_SMC_VOLTAGEMASK_MAX 4
-
- struct SISLANDS_SMC_VOLTAGEMASKTABLE
-diff --git a/drivers/gpu/drm/vc4/vc4_drv.h b/drivers/gpu/drm/vc4/vc4_drv.h
-index 428e249..f696b75 100644
---- a/drivers/gpu/drm/vc4/vc4_drv.h
-+++ b/drivers/gpu/drm/vc4/vc4_drv.h
-@@ -122,9 +122,16 @@ to_vc4_dev(struct drm_device *dev)
- struct vc4_bo {
- struct drm_gem_cma_object base;
-
-- /* seqno of the last job to render to this BO. */
-+ /* seqno of the last job to render using this BO. */
- uint64_t seqno;
-
-+ /* seqno of the last job to use the RCL to write to this BO.
-+ *
-+ * Note that this doesn't include binner overflow memory
-+ * writes.
-+ */
-+ uint64_t write_seqno;
-+
- /* List entry for the BO's position in either
- * vc4_exec_info->unref_list or vc4_dev->bo_cache.time_list
- */
-@@ -216,6 +223,9 @@ struct vc4_exec_info {
- /* Sequence number for this bin/render job. */
- uint64_t seqno;
-
-+ /* Latest write_seqno of any BO that binning depends on. */
-+ uint64_t bin_dep_seqno;
-+
- /* Last current addresses the hardware was processing when the
- * hangcheck timer checked on us.
- */
-@@ -230,6 +240,13 @@ struct vc4_exec_info {
- struct drm_gem_cma_object **bo;
- uint32_t bo_count;
-
-+ /* List of BOs that are being written by the RCL. Other than
-+ * the binner temporary storage, this is all the BOs written
-+ * by the job.
-+ */
-+ struct drm_gem_cma_object *rcl_write_bo[4];
-+ uint32_t rcl_write_bo_count;
-+
- /* Pointers for our position in vc4->job_list */
- struct list_head head;
-
-diff --git a/drivers/gpu/drm/vc4/vc4_gem.c b/drivers/gpu/drm/vc4/vc4_gem.c
-index b262c5c..ae1609e 100644
---- a/drivers/gpu/drm/vc4/vc4_gem.c
-+++ b/drivers/gpu/drm/vc4/vc4_gem.c
-@@ -471,6 +471,11 @@ vc4_update_bo_seqnos(struct vc4_exec_info *exec, uint64_t seqno)
- list_for_each_entry(bo, &exec->unref_list, unref_head) {
- bo->seqno = seqno;
- }
-+
-+ for (i = 0; i < exec->rcl_write_bo_count; i++) {
-+ bo = to_vc4_bo(&exec->rcl_write_bo[i]->base);
-+ bo->write_seqno = seqno;
-+ }
- }
-
- /* Queues a struct vc4_exec_info for execution. If no job is
-@@ -673,6 +678,14 @@ vc4_get_bcl(struct drm_device *dev, struct vc4_exec_info *exec)
- goto fail;
-
- ret = vc4_validate_shader_recs(dev, exec);
-+ if (ret)
-+ goto fail;
-+
-+ /* Block waiting on any previous rendering into the CS's VBO,
-+ * IB, or textures, so that pixels are actually written by the
-+ * time we try to read them.
-+ */
-+ ret = vc4_wait_for_seqno(dev, exec->bin_dep_seqno, ~0ull, true);
-
- fail:
- drm_free_large(temp);
-diff --git a/drivers/gpu/drm/vc4/vc4_render_cl.c b/drivers/gpu/drm/vc4/vc4_render_cl.c
-index 0f12418..08886a3 100644
---- a/drivers/gpu/drm/vc4/vc4_render_cl.c
-+++ b/drivers/gpu/drm/vc4/vc4_render_cl.c
-@@ -45,6 +45,8 @@ struct vc4_rcl_setup {
-
- struct drm_gem_cma_object *rcl;
- u32 next_offset;
-+
-+ u32 next_write_bo_index;
- };
-
- static inline void rcl_u8(struct vc4_rcl_setup *setup, u8 val)
-@@ -407,6 +409,8 @@ static int vc4_rcl_msaa_surface_setup(struct vc4_exec_info *exec,
- if (!*obj)
- return -EINVAL;
-
-+ exec->rcl_write_bo[exec->rcl_write_bo_count++] = *obj;
-+
- if (surf->offset & 0xf) {
- DRM_ERROR("MSAA write must be 16b aligned.\n");
- return -EINVAL;
-@@ -417,7 +421,8 @@ static int vc4_rcl_msaa_surface_setup(struct vc4_exec_info *exec,
-
- static int vc4_rcl_surface_setup(struct vc4_exec_info *exec,
- struct drm_gem_cma_object **obj,
-- struct drm_vc4_submit_rcl_surface *surf)
-+ struct drm_vc4_submit_rcl_surface *surf,
-+ bool is_write)
- {
- uint8_t tiling = VC4_GET_FIELD(surf->bits,
- VC4_LOADSTORE_TILE_BUFFER_TILING);
-@@ -440,6 +445,9 @@ static int vc4_rcl_surface_setup(struct vc4_exec_info *exec,
- if (!*obj)
- return -EINVAL;
-
-+ if (is_write)
-+ exec->rcl_write_bo[exec->rcl_write_bo_count++] = *obj;
-+
- if (surf->flags & VC4_SUBMIT_RCL_SURFACE_READ_IS_FULL_RES) {
- if (surf == &exec->args->zs_write) {
- DRM_ERROR("general zs write may not be a full-res.\n");
-@@ -542,6 +550,8 @@ vc4_rcl_render_config_surface_setup(struct vc4_exec_info *exec,
- if (!*obj)
- return -EINVAL;
-
-+ exec->rcl_write_bo[exec->rcl_write_bo_count++] = *obj;
-+
- if (tiling > VC4_TILING_FORMAT_LT) {
- DRM_ERROR("Bad tiling format\n");
- return -EINVAL;
-@@ -599,15 +609,18 @@ int vc4_get_rcl(struct drm_device *dev, struct vc4_exec_info *exec)
- if (ret)
- return ret;
-
-- ret = vc4_rcl_surface_setup(exec, &setup.color_read, &args->color_read);
-+ ret = vc4_rcl_surface_setup(exec, &setup.color_read, &args->color_read,
-+ false);
- if (ret)
- return ret;
-
-- ret = vc4_rcl_surface_setup(exec, &setup.zs_read, &args->zs_read);
-+ ret = vc4_rcl_surface_setup(exec, &setup.zs_read, &args->zs_read,
-+ false);
- if (ret)
- return ret;
-
-- ret = vc4_rcl_surface_setup(exec, &setup.zs_write, &args->zs_write);
-+ ret = vc4_rcl_surface_setup(exec, &setup.zs_write, &args->zs_write,
-+ true);
- if (ret)
- return ret;
-
-diff --git a/drivers/gpu/drm/vc4/vc4_validate.c b/drivers/gpu/drm/vc4/vc4_validate.c
-index 9ce1d0a..26503e3 100644
---- a/drivers/gpu/drm/vc4/vc4_validate.c
-+++ b/drivers/gpu/drm/vc4/vc4_validate.c
-@@ -267,6 +267,9 @@ validate_indexed_prim_list(VALIDATE_ARGS)
- if (!ib)
- return -EINVAL;
-
-+ exec->bin_dep_seqno = max(exec->bin_dep_seqno,
-+ to_vc4_bo(&ib->base)->write_seqno);
-+
- if (offset > ib->base.size ||
- (ib->base.size - offset) / index_size < length) {
- DRM_ERROR("IB access overflow (%d + %d*%d > %zd)\n",
-@@ -555,8 +558,7 @@ static bool
- reloc_tex(struct vc4_exec_info *exec,
- void *uniform_data_u,
- struct vc4_texture_sample_info *sample,
-- uint32_t texture_handle_index)
--
-+ uint32_t texture_handle_index, bool is_cs)
- {
- struct drm_gem_cma_object *tex;
- uint32_t p0 = *(uint32_t *)(uniform_data_u + sample->p_offset[0]);
-@@ -714,6 +716,11 @@ reloc_tex(struct vc4_exec_info *exec,
-
- *validated_p0 = tex->paddr + p0;
-
-+ if (is_cs) {
-+ exec->bin_dep_seqno = max(exec->bin_dep_seqno,
-+ to_vc4_bo(&tex->base)->write_seqno);
-+ }
-+
- return true;
- fail:
- DRM_INFO("Texture p0 at %d: 0x%08x\n", sample->p_offset[0], p0);
-@@ -835,7 +842,8 @@ validate_gl_shader_rec(struct drm_device *dev,
- if (!reloc_tex(exec,
- uniform_data_u,
- &validated_shader->texture_samples[tex],
-- texture_handles_u[tex])) {
-+ texture_handles_u[tex],
-+ i == 2)) {
- return -EINVAL;
- }
- }
-@@ -867,6 +875,9 @@ validate_gl_shader_rec(struct drm_device *dev,
- uint32_t stride = *(uint8_t *)(pkt_u + o + 5);
- uint32_t max_index;
-
-+ exec->bin_dep_seqno = max(exec->bin_dep_seqno,
-+ to_vc4_bo(&vbo->base)->write_seqno);
-+
- if (state->addr & 0x8)
- stride |= (*(uint32_t *)(pkt_u + 100 + i * 4)) & ~0xff;
-
-diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c b/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c
-index dc5beff..8a15c4a 100644
---- a/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c
-+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c
-@@ -34,6 +34,24 @@
-
- #define VMW_RES_HT_ORDER 12
-
-+ /**
-+ * enum vmw_resource_relocation_type - Relocation type for resources
-+ *
-+ * @vmw_res_rel_normal: Traditional relocation. The resource id in the
-+ * command stream is replaced with the actual id after validation.
-+ * @vmw_res_rel_nop: NOP relocation. The command is unconditionally replaced
-+ * with a NOP.
-+ * @vmw_res_rel_cond_nop: Conditional NOP relocation. If the resource id
-+ * after validation is -1, the command is replaced with a NOP. Otherwise no
-+ * action.
-+ */
-+enum vmw_resource_relocation_type {
-+ vmw_res_rel_normal,
-+ vmw_res_rel_nop,
-+ vmw_res_rel_cond_nop,
-+ vmw_res_rel_max
-+};
-+
- /**
- * struct vmw_resource_relocation - Relocation info for resources
- *
-@@ -41,11 +59,13 @@
- * @res: Non-ref-counted pointer to the resource.
- * @offset: Offset of 4 byte entries into the command buffer where the
- * id that needs fixup is located.
-+ * @rel_type: Type of relocation.
- */
- struct vmw_resource_relocation {
- struct list_head head;
- const struct vmw_resource *res;
-- unsigned long offset;
-+ u32 offset:29;
-+ enum vmw_resource_relocation_type rel_type:3;
- };
-
- /**
-@@ -410,10 +430,13 @@ static int vmw_resource_context_res_add(struct vmw_private *dev_priv,
- * @res: The resource.
- * @offset: Offset into the command buffer currently being parsed where the
- * id that needs fixup is located. Granularity is 4 bytes.
-+ * @rel_type: Relocation type.
- */
- static int vmw_resource_relocation_add(struct list_head *list,
- const struct vmw_resource *res,
-- unsigned long offset)
-+ unsigned long offset,
-+ enum vmw_resource_relocation_type
-+ rel_type)
- {
- struct vmw_resource_relocation *rel;
-
-@@ -425,6 +448,7 @@ static int vmw_resource_relocation_add(struct list_head *list,
-
- rel->res = res;
- rel->offset = offset;
-+ rel->rel_type = rel_type;
- list_add_tail(&rel->head, list);
-
- return 0;
-@@ -459,11 +483,23 @@ static void vmw_resource_relocations_apply(uint32_t *cb,
- {
- struct vmw_resource_relocation *rel;
-
-+ /* Validate the struct vmw_resource_relocation member size */
-+ BUILD_BUG_ON(SVGA_CB_MAX_SIZE >= (1 << 29));
-+ BUILD_BUG_ON(vmw_res_rel_max >= (1 << 3));
-+
- list_for_each_entry(rel, list, head) {
-- if (likely(rel->res != NULL))
-+ switch (rel->rel_type) {
-+ case vmw_res_rel_normal:
- cb[rel->offset] = rel->res->id;
-- else
-+ break;
-+ case vmw_res_rel_nop:
- cb[rel->offset] = SVGA_3D_CMD_NOP;
-+ break;
-+ default:
-+ if (rel->res->id == -1)
-+ cb[rel->offset] = SVGA_3D_CMD_NOP;
-+ break;
-+ }
- }
- }
-
-@@ -655,7 +691,8 @@ static int vmw_cmd_res_reloc_add(struct vmw_private *dev_priv,
- *p_val = NULL;
- ret = vmw_resource_relocation_add(&sw_context->res_relocations,
- res,
-- id_loc - sw_context->buf_start);
-+ id_loc - sw_context->buf_start,
-+ vmw_res_rel_normal);
- if (unlikely(ret != 0))
- return ret;
-
-@@ -721,7 +758,8 @@ vmw_cmd_res_check(struct vmw_private *dev_priv,
-
- return vmw_resource_relocation_add
- (&sw_context->res_relocations, res,
-- id_loc - sw_context->buf_start);
-+ id_loc - sw_context->buf_start,
-+ vmw_res_rel_normal);
- }
-
- ret = vmw_user_resource_lookup_handle(dev_priv,
-@@ -2144,7 +2182,8 @@ static int vmw_cmd_shader_define(struct vmw_private *dev_priv,
-
- return vmw_resource_relocation_add(&sw_context->res_relocations,
- NULL, &cmd->header.id -
-- sw_context->buf_start);
-+ sw_context->buf_start,
-+ vmw_res_rel_nop);
-
- return 0;
- }
-@@ -2189,7 +2228,8 @@ static int vmw_cmd_shader_destroy(struct vmw_private *dev_priv,
-
- return vmw_resource_relocation_add(&sw_context->res_relocations,
- NULL, &cmd->header.id -
-- sw_context->buf_start);
-+ sw_context->buf_start,
-+ vmw_res_rel_nop);
-
- return 0;
- }
-@@ -2848,8 +2888,7 @@ static int vmw_cmd_dx_cid_check(struct vmw_private *dev_priv,
- * @header: Pointer to the command header in the command stream.
- *
- * Check that the view exists, and if it was not created using this
-- * command batch, make sure it's validated (present in the device) so that
-- * the remove command will not confuse the device.
-+ * command batch, conditionally make this command a NOP.
- */
- static int vmw_cmd_dx_view_remove(struct vmw_private *dev_priv,
- struct vmw_sw_context *sw_context,
-@@ -2877,10 +2916,15 @@ static int vmw_cmd_dx_view_remove(struct vmw_private *dev_priv,
- return ret;
-
- /*
-- * Add view to the validate list iff it was not created using this
-- * command batch.
-+ * If the view wasn't created during this command batch, it might
-+ * have been removed due to a context swapout, so add a
-+ * relocation to conditionally make this command a NOP to avoid
-+ * device errors.
- */
-- return vmw_view_res_val_add(sw_context, view);
-+ return vmw_resource_relocation_add(&sw_context->res_relocations,
-+ view,
-+ &cmd->header.id - sw_context->buf_start,
-+ vmw_res_rel_cond_nop);
- }
-
- /**
-@@ -3848,14 +3892,14 @@ static void *vmw_execbuf_cmdbuf(struct vmw_private *dev_priv,
- int ret;
-
- *header = NULL;
-- if (!dev_priv->cman || kernel_commands)
-- return kernel_commands;
--
- if (command_size > SVGA_CB_MAX_SIZE) {
- DRM_ERROR("Command buffer is too large.\n");
- return ERR_PTR(-EINVAL);
- }
-
-+ if (!dev_priv->cman || kernel_commands)
-+ return kernel_commands;
-+
- /* If possible, add a little space for fencing. */
- cmdbuf_size = command_size + 512;
- cmdbuf_size = min_t(size_t, cmdbuf_size, SVGA_CB_MAX_SIZE);
-diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
-index 4ed9a4f..e92b09d 100644
---- a/drivers/hid/hid-ids.h
-+++ b/drivers/hid/hid-ids.h
-@@ -64,6 +64,9 @@
- #define USB_VENDOR_ID_AKAI 0x2011
- #define USB_DEVICE_ID_AKAI_MPKMINI2 0x0715
-
-+#define USB_VENDOR_ID_AKAI_09E8 0x09E8
-+#define USB_DEVICE_ID_AKAI_09E8_MIDIMIX 0x0031
-+
- #define USB_VENDOR_ID_ALCOR 0x058f
- #define USB_DEVICE_ID_ALCOR_USBRS232 0x9720
-
-diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c
-index b4b8c6a..bb40008 100644
---- a/drivers/hid/usbhid/hid-quirks.c
-+++ b/drivers/hid/usbhid/hid-quirks.c
-@@ -56,6 +56,7 @@ static const struct hid_blacklist {
-
- { USB_VENDOR_ID_AIREN, USB_DEVICE_ID_AIREN_SLIMPLUS, HID_QUIRK_NOGET },
- { USB_VENDOR_ID_AKAI, USB_DEVICE_ID_AKAI_MPKMINI2, HID_QUIRK_NO_INIT_REPORTS },
-+ { USB_VENDOR_ID_AKAI_09E8, USB_DEVICE_ID_AKAI_09E8_MIDIMIX, HID_QUIRK_NO_INIT_REPORTS },
- { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_UC100KM, HID_QUIRK_NOGET },
- { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_CS124U, HID_QUIRK_NOGET },
- { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_2PORTKVM, HID_QUIRK_NOGET },
-diff --git a/drivers/hwtracing/coresight/coresight-tmc.c b/drivers/hwtracing/coresight/coresight-tmc.c
-index 9e02ac9..3978cbb 100644
---- a/drivers/hwtracing/coresight/coresight-tmc.c
-+++ b/drivers/hwtracing/coresight/coresight-tmc.c
-@@ -388,9 +388,6 @@ static int tmc_probe(struct amba_device *adev, const struct amba_id *id)
- err_misc_register:
- coresight_unregister(drvdata->csdev);
- err_devm_kzalloc:
-- if (drvdata->config_type == TMC_CONFIG_TYPE_ETR)
-- dma_free_coherent(dev, drvdata->size,
-- drvdata->vaddr, drvdata->paddr);
- return ret;
- }
-
-diff --git a/drivers/iio/dac/ad5755.c b/drivers/iio/dac/ad5755.c
-index 0fde593..5f79682 100644
---- a/drivers/iio/dac/ad5755.c
-+++ b/drivers/iio/dac/ad5755.c
-@@ -655,7 +655,7 @@ static struct ad5755_platform_data *ad5755_parse_dt(struct device *dev)
-
- devnr = 0;
- for_each_child_of_node(np, pp) {
-- if (devnr > AD5755_NUM_CHANNELS) {
-+ if (devnr >= AD5755_NUM_CHANNELS) {
- dev_err(dev,
- "There is to many channels defined in DT\n");
- goto error_out;
-diff --git a/drivers/iio/light/us5182d.c b/drivers/iio/light/us5182d.c
-index 20c40f7..18cf2e2 100644
---- a/drivers/iio/light/us5182d.c
-+++ b/drivers/iio/light/us5182d.c
-@@ -894,7 +894,7 @@ static int us5182d_probe(struct i2c_client *client,
- goto out_err;
-
- if (data->default_continuous) {
-- pm_runtime_set_active(&client->dev);
-+ ret = pm_runtime_set_active(&client->dev);
- if (ret < 0)
- goto out_err;
- }
-diff --git a/drivers/infiniband/hw/hfi1/qp.c b/drivers/infiniband/hw/hfi1/qp.c
-index 4e4d831..c17c9dd 100644
---- a/drivers/infiniband/hw/hfi1/qp.c
-+++ b/drivers/infiniband/hw/hfi1/qp.c
-@@ -808,6 +808,13 @@ void *qp_priv_alloc(struct rvt_dev_info *rdi, struct rvt_qp *qp,
- kfree(priv);
- return ERR_PTR(-ENOMEM);
- }
-+ iowait_init(
-+ &priv->s_iowait,
-+ 1,
-+ _hfi1_do_send,
-+ iowait_sleep,
-+ iowait_wakeup,
-+ iowait_sdma_drained);
- setup_timer(&priv->s_rnr_timer, hfi1_rc_rnr_retry, (unsigned long)qp);
- qp->s_timer.function = hfi1_rc_timeout;
- return priv;
-@@ -873,13 +880,6 @@ void notify_qp_reset(struct rvt_qp *qp)
- {
- struct hfi1_qp_priv *priv = qp->priv;
-
-- iowait_init(
-- &priv->s_iowait,
-- 1,
-- _hfi1_do_send,
-- iowait_sleep,
-- iowait_wakeup,
-- iowait_sdma_drained);
- priv->r_adefered = 0;
- clear_ahg(qp);
- }
-diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c
-index e19537c..bff8707a 100644
---- a/drivers/infiniband/hw/mlx5/main.c
-+++ b/drivers/infiniband/hw/mlx5/main.c
-@@ -1843,6 +1843,7 @@ static struct mlx5_ib_flow_handler *create_leftovers_rule(struct mlx5_ib_dev *de
- &leftovers_specs[LEFTOVERS_UC].flow_attr,
- dst);
- if (IS_ERR(handler_ucast)) {
-+ mlx5_del_flow_rule(handler->rule);
- kfree(handler);
- handler = handler_ucast;
- } else {
-diff --git a/drivers/infiniband/hw/qib/qib.h b/drivers/infiniband/hw/qib/qib.h
-index bbf0a16..54bb655f 100644
---- a/drivers/infiniband/hw/qib/qib.h
-+++ b/drivers/infiniband/hw/qib/qib.h
-@@ -1131,7 +1131,6 @@ extern spinlock_t qib_devs_lock;
- extern struct qib_devdata *qib_lookup(int unit);
- extern u32 qib_cpulist_count;
- extern unsigned long *qib_cpulist;
--extern u16 qpt_mask;
- extern unsigned qib_cc_table_size;
-
- int qib_init(struct qib_devdata *, int);
-diff --git a/drivers/infiniband/hw/qib/qib_qp.c b/drivers/infiniband/hw/qib/qib_qp.c
-index f9b8cd2..99d31ef 100644
---- a/drivers/infiniband/hw/qib/qib_qp.c
-+++ b/drivers/infiniband/hw/qib/qib_qp.c
-@@ -41,14 +41,6 @@
-
- #include "qib.h"
-
--/*
-- * mask field which was present in now deleted qib_qpn_table
-- * is not present in rvt_qpn_table. Defining the same field
-- * as qpt_mask here instead of adding the mask field to
-- * rvt_qpn_table.
-- */
--u16 qpt_mask;
--
- static inline unsigned mk_qpn(struct rvt_qpn_table *qpt,
- struct rvt_qpn_map *map, unsigned off)
- {
-@@ -57,7 +49,7 @@ static inline unsigned mk_qpn(struct rvt_qpn_table *qpt,
-
- static inline unsigned find_next_offset(struct rvt_qpn_table *qpt,
- struct rvt_qpn_map *map, unsigned off,
-- unsigned n)
-+ unsigned n, u16 qpt_mask)
- {
- if (qpt_mask) {
- off++;
-@@ -179,6 +171,7 @@ int qib_alloc_qpn(struct rvt_dev_info *rdi, struct rvt_qpn_table *qpt,
- struct qib_ibdev *verbs_dev = container_of(rdi, struct qib_ibdev, rdi);
- struct qib_devdata *dd = container_of(verbs_dev, struct qib_devdata,
- verbs_dev);
-+ u16 qpt_mask = dd->qpn_mask;
-
- if (type == IB_QPT_SMI || type == IB_QPT_GSI) {
- unsigned n;
-@@ -215,7 +208,7 @@ int qib_alloc_qpn(struct rvt_dev_info *rdi, struct rvt_qpn_table *qpt,
- goto bail;
- }
- offset = find_next_offset(qpt, map, offset,
-- dd->n_krcv_queues);
-+ dd->n_krcv_queues, qpt_mask);
- qpn = mk_qpn(qpt, map, offset);
- /*
- * This test differs from alloc_pidmap().
-diff --git a/drivers/infiniband/hw/qib/qib_verbs.c b/drivers/infiniband/hw/qib/qib_verbs.c
-index fd1dfbc..b2b845f 100644
---- a/drivers/infiniband/hw/qib/qib_verbs.c
-+++ b/drivers/infiniband/hw/qib/qib_verbs.c
-@@ -1606,8 +1606,6 @@ int qib_register_ib_device(struct qib_devdata *dd)
- /* Only need to initialize non-zero fields. */
- setup_timer(&dev->mem_timer, mem_timer, (unsigned long)dev);
-
-- qpt_mask = dd->qpn_mask;
--
- INIT_LIST_HEAD(&dev->piowait);
- INIT_LIST_HEAD(&dev->dmawait);
- INIT_LIST_HEAD(&dev->txwait);
-diff --git a/drivers/infiniband/sw/rdmavt/qp.c b/drivers/infiniband/sw/rdmavt/qp.c
-index 870b4f2..5911c53 100644
---- a/drivers/infiniband/sw/rdmavt/qp.c
-+++ b/drivers/infiniband/sw/rdmavt/qp.c
-@@ -501,12 +501,9 @@ static void rvt_remove_qp(struct rvt_dev_info *rdi, struct rvt_qp *qp)
- */
- static void rvt_reset_qp(struct rvt_dev_info *rdi, struct rvt_qp *qp,
- enum ib_qp_type type)
-- __releases(&qp->s_lock)
-- __releases(&qp->s_hlock)
-- __releases(&qp->r_lock)
-- __acquires(&qp->r_lock)
-- __acquires(&qp->s_hlock)
-- __acquires(&qp->s_lock)
-+ __must_hold(&qp->r_lock)
-+ __must_hold(&qp->s_hlock)
-+ __must_hold(&qp->s_lock)
- {
- if (qp->state != IB_QPS_RESET) {
- qp->state = IB_QPS_RESET;
-diff --git a/drivers/net/ethernet/intel/i40e/i40e_client.c b/drivers/net/ethernet/intel/i40e/i40e_client.c
-index 618f184..c65e17f 100644
---- a/drivers/net/ethernet/intel/i40e/i40e_client.c
-+++ b/drivers/net/ethernet/intel/i40e/i40e_client.c
-@@ -1009,7 +1009,6 @@ int i40e_unregister_client(struct i40e_client *client)
- if (!i40e_client_is_registered(client)) {
- pr_info("i40e: Client %s has not been registered\n",
- client->name);
-- mutex_unlock(&i40e_client_mutex);
- ret = -ENODEV;
- goto out;
- }
-diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c
-index dad15b6..c74d164 100644
---- a/drivers/net/ethernet/intel/i40e/i40e_main.c
-+++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
-@@ -7990,45 +7990,34 @@ static int i40e_setup_misc_vector(struct i40e_pf *pf)
- static int i40e_config_rss_aq(struct i40e_vsi *vsi, const u8 *seed,
- u8 *lut, u16 lut_size)
- {
-- struct i40e_aqc_get_set_rss_key_data rss_key;
- struct i40e_pf *pf = vsi->back;
- struct i40e_hw *hw = &pf->hw;
-- bool pf_lut = false;
-- u8 *rss_lut;
-- int ret, i;
--
-- memcpy(&rss_key, seed, sizeof(rss_key));
--
-- rss_lut = kzalloc(pf->rss_table_size, GFP_KERNEL);
-- if (!rss_lut)
-- return -ENOMEM;
--
-- /* Populate the LUT with max no. of queues in round robin fashion */
-- for (i = 0; i < vsi->rss_table_size; i++)
-- rss_lut[i] = i % vsi->rss_size;
-+ int ret = 0;
-
-- ret = i40e_aq_set_rss_key(hw, vsi->id, &rss_key);
-- if (ret) {
-- dev_info(&pf->pdev->dev,
-- "Cannot set RSS key, err %s aq_err %s\n",
-- i40e_stat_str(&pf->hw, ret),
-- i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status));
-- goto config_rss_aq_out;
-+ if (seed) {
-+ struct i40e_aqc_get_set_rss_key_data *seed_dw =
-+ (struct i40e_aqc_get_set_rss_key_data *)seed;
-+ ret = i40e_aq_set_rss_key(hw, vsi->id, seed_dw);
-+ if (ret) {
-+ dev_info(&pf->pdev->dev,
-+ "Cannot set RSS key, err %s aq_err %s\n",
-+ i40e_stat_str(hw, ret),
-+ i40e_aq_str(hw, hw->aq.asq_last_status));
-+ return ret;
-+ }
- }
-+ if (lut) {
-+ bool pf_lut = vsi->type == I40E_VSI_MAIN ? true : false;
-
-- if (vsi->type == I40E_VSI_MAIN)
-- pf_lut = true;
--
-- ret = i40e_aq_set_rss_lut(hw, vsi->id, pf_lut, rss_lut,
-- vsi->rss_table_size);
-- if (ret)
-- dev_info(&pf->pdev->dev,
-- "Cannot set RSS lut, err %s aq_err %s\n",
-- i40e_stat_str(&pf->hw, ret),
-- i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status));
--
--config_rss_aq_out:
-- kfree(rss_lut);
-+ ret = i40e_aq_set_rss_lut(hw, vsi->id, pf_lut, lut, lut_size);
-+ if (ret) {
-+ dev_info(&pf->pdev->dev,
-+ "Cannot set RSS lut, err %s aq_err %s\n",
-+ i40e_stat_str(hw, ret),
-+ i40e_aq_str(hw, hw->aq.asq_last_status));
-+ return ret;
-+ }
-+ }
- return ret;
- }
-
-diff --git a/drivers/net/wireless/ath/ath10k/htt_rx.c b/drivers/net/wireless/ath/ath10k/htt_rx.c
-index 24c8d65..09ca634 100644
---- a/drivers/net/wireless/ath/ath10k/htt_rx.c
-+++ b/drivers/net/wireless/ath/ath10k/htt_rx.c
-@@ -2394,6 +2394,8 @@ static void ath10k_htt_txrx_compl_task(unsigned long ptr)
- skb_queue_splice_init(&htt->rx_in_ord_compl_q, &rx_ind_q);
- spin_unlock_irqrestore(&htt->rx_in_ord_compl_q.lock, flags);
-
-+ ath10k_mac_tx_push_pending(ar);
-+
- spin_lock_irqsave(&htt->tx_fetch_ind_q.lock, flags);
- skb_queue_splice_init(&htt->tx_fetch_ind_q, &tx_ind_q);
- spin_unlock_irqrestore(&htt->tx_fetch_ind_q.lock, flags);
-diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c
-index 0bbd0a0..146365b 100644
---- a/drivers/net/wireless/ath/ath10k/mac.c
-+++ b/drivers/net/wireless/ath/ath10k/mac.c
-@@ -3777,7 +3777,9 @@ int ath10k_mac_tx_push_txq(struct ieee80211_hw *hw,
- enum ath10k_hw_txrx_mode txmode;
- enum ath10k_mac_tx_path txpath;
- struct sk_buff *skb;
-+ struct ieee80211_hdr *hdr;
- size_t skb_len;
-+ bool is_mgmt, is_presp;
- int ret;
-
- spin_lock_bh(&ar->htt.tx_lock);
-@@ -3801,6 +3803,22 @@ int ath10k_mac_tx_push_txq(struct ieee80211_hw *hw,
- skb_len = skb->len;
- txmode = ath10k_mac_tx_h_get_txmode(ar, vif, sta, skb);
- txpath = ath10k_mac_tx_h_get_txpath(ar, skb, txmode);
-+ is_mgmt = (txpath == ATH10K_MAC_TX_HTT_MGMT);
-+
-+ if (is_mgmt) {
-+ hdr = (struct ieee80211_hdr *)skb->data;
-+ is_presp = ieee80211_is_probe_resp(hdr->frame_control);
-+
-+ spin_lock_bh(&ar->htt.tx_lock);
-+ ret = ath10k_htt_tx_mgmt_inc_pending(htt, is_mgmt, is_presp);
-+
-+ if (ret) {
-+ ath10k_htt_tx_dec_pending(htt);
-+ spin_unlock_bh(&ar->htt.tx_lock);
-+ return ret;
-+ }
-+ spin_unlock_bh(&ar->htt.tx_lock);
-+ }
-
- ret = ath10k_mac_tx(ar, vif, sta, txmode, txpath, skb);
- if (unlikely(ret)) {
-@@ -3808,6 +3826,8 @@ int ath10k_mac_tx_push_txq(struct ieee80211_hw *hw,
-
- spin_lock_bh(&ar->htt.tx_lock);
- ath10k_htt_tx_dec_pending(htt);
-+ if (is_mgmt)
-+ ath10k_htt_tx_mgmt_dec_pending(htt);
- spin_unlock_bh(&ar->htt.tx_lock);
-
- return ret;
-@@ -6538,7 +6558,7 @@ static int ath10k_get_survey(struct ieee80211_hw *hw, int idx,
- goto exit;
- }
-
-- ath10k_mac_update_bss_chan_survey(ar, survey->channel);
-+ ath10k_mac_update_bss_chan_survey(ar, &sband->channels[idx]);
-
- spin_lock_bh(&ar->data_lock);
- memcpy(survey, ar_survey, sizeof(*survey));
-diff --git a/drivers/net/wireless/ath/ath10k/txrx.c b/drivers/net/wireless/ath/ath10k/txrx.c
-index b29a86a..28ff5cb 100644
---- a/drivers/net/wireless/ath/ath10k/txrx.c
-+++ b/drivers/net/wireless/ath/ath10k/txrx.c
-@@ -119,8 +119,6 @@ int ath10k_txrx_tx_unref(struct ath10k_htt *htt,
- ieee80211_tx_status(htt->ar->hw, msdu);
- /* we do not own the msdu anymore */
-
-- ath10k_mac_tx_push_pending(ar);
--
- return 0;
- }
-
-diff --git a/drivers/net/wireless/ath/ath10k/wmi.h b/drivers/net/wireless/ath/ath10k/wmi.h
-index 3ef4688..f67cc19 100644
---- a/drivers/net/wireless/ath/ath10k/wmi.h
-+++ b/drivers/net/wireless/ath/ath10k/wmi.h
-@@ -180,6 +180,7 @@ enum wmi_service {
- WMI_SERVICE_MESH_NON_11S,
- WMI_SERVICE_PEER_STATS,
- WMI_SERVICE_RESTRT_CHNL_SUPPORT,
-+ WMI_SERVICE_PERIODIC_CHAN_STAT_SUPPORT,
- WMI_SERVICE_TX_MODE_PUSH_ONLY,
- WMI_SERVICE_TX_MODE_PUSH_PULL,
- WMI_SERVICE_TX_MODE_DYNAMIC,
-@@ -305,6 +306,7 @@ enum wmi_10_4_service {
- WMI_10_4_SERVICE_RESTRT_CHNL_SUPPORT,
- WMI_10_4_SERVICE_PEER_STATS,
- WMI_10_4_SERVICE_MESH_11S,
-+ WMI_10_4_SERVICE_PERIODIC_CHAN_STAT_SUPPORT,
- WMI_10_4_SERVICE_TX_MODE_PUSH_ONLY,
- WMI_10_4_SERVICE_TX_MODE_PUSH_PULL,
- WMI_10_4_SERVICE_TX_MODE_DYNAMIC,
-@@ -402,6 +404,7 @@ static inline char *wmi_service_name(int service_id)
- SVCSTR(WMI_SERVICE_MESH_NON_11S);
- SVCSTR(WMI_SERVICE_PEER_STATS);
- SVCSTR(WMI_SERVICE_RESTRT_CHNL_SUPPORT);
-+ SVCSTR(WMI_SERVICE_PERIODIC_CHAN_STAT_SUPPORT);
- SVCSTR(WMI_SERVICE_TX_MODE_PUSH_ONLY);
- SVCSTR(WMI_SERVICE_TX_MODE_PUSH_PULL);
- SVCSTR(WMI_SERVICE_TX_MODE_DYNAMIC);
-@@ -652,6 +655,8 @@ static inline void wmi_10_4_svc_map(const __le32 *in, unsigned long *out,
- WMI_SERVICE_PEER_STATS, len);
- SVCMAP(WMI_10_4_SERVICE_MESH_11S,
- WMI_SERVICE_MESH_11S, len);
-+ SVCMAP(WMI_10_4_SERVICE_PERIODIC_CHAN_STAT_SUPPORT,
-+ WMI_SERVICE_PERIODIC_CHAN_STAT_SUPPORT, len);
- SVCMAP(WMI_10_4_SERVICE_TX_MODE_PUSH_ONLY,
- WMI_SERVICE_TX_MODE_PUSH_ONLY, len);
- SVCMAP(WMI_10_4_SERVICE_TX_MODE_PUSH_PULL,
-diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c b/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c
-index 43f8f7d..adba3b0 100644
---- a/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c
-+++ b/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c
-@@ -564,11 +564,16 @@ static void iwl_set_hw_address_from_csr(struct iwl_trans *trans,
- __le32 mac_addr0 = cpu_to_le32(iwl_read32(trans, CSR_MAC_ADDR0_STRAP));
- __le32 mac_addr1 = cpu_to_le32(iwl_read32(trans, CSR_MAC_ADDR1_STRAP));
-
-- /* If OEM did not fuse address - get it from OTP */
-- if (!mac_addr0 && !mac_addr1) {
-- mac_addr0 = cpu_to_le32(iwl_read32(trans, CSR_MAC_ADDR0_OTP));
-- mac_addr1 = cpu_to_le32(iwl_read32(trans, CSR_MAC_ADDR1_OTP));
-- }
-+ iwl_flip_hw_address(mac_addr0, mac_addr1, data->hw_addr);
-+ /*
-+ * If the OEM fused a valid address, use it instead of the one in the
-+ * OTP
-+ */
-+ if (is_valid_ether_addr(data->hw_addr))
-+ return;
-+
-+ mac_addr0 = cpu_to_le32(iwl_read32(trans, CSR_MAC_ADDR0_OTP));
-+ mac_addr1 = cpu_to_le32(iwl_read32(trans, CSR_MAC_ADDR1_OTP));
-
- iwl_flip_hw_address(mac_addr0, mac_addr1, data->hw_addr);
- }
-diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/fw.c b/drivers/net/wireless/intel/iwlwifi/mvm/fw.c
-index 7e0cdbf..794c574 100644
---- a/drivers/net/wireless/intel/iwlwifi/mvm/fw.c
-+++ b/drivers/net/wireless/intel/iwlwifi/mvm/fw.c
-@@ -1214,9 +1214,12 @@ int iwl_mvm_up(struct iwl_mvm *mvm)
- }
-
- /* TODO: read the budget from BIOS / Platform NVM */
-- if (iwl_mvm_is_ctdp_supported(mvm) && mvm->cooling_dev.cur_state > 0)
-+ if (iwl_mvm_is_ctdp_supported(mvm) && mvm->cooling_dev.cur_state > 0) {
- ret = iwl_mvm_ctdp_command(mvm, CTDP_CMD_OPERATION_START,
- mvm->cooling_dev.cur_state);
-+ if (ret)
-+ goto error;
-+ }
- #else
- /* Initialize tx backoffs to the minimal possible */
- iwl_mvm_tt_tx_backoff(mvm, 0);
-diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mac-ctxt.c b/drivers/net/wireless/intel/iwlwifi/mvm/mac-ctxt.c
-index 69c42ce..d742d27 100644
---- a/drivers/net/wireless/intel/iwlwifi/mvm/mac-ctxt.c
-+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac-ctxt.c
-@@ -539,6 +539,11 @@ void iwl_mvm_mac_ctxt_release(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
- iwl_mvm_disable_txq(mvm, IWL_MVM_OFFCHANNEL_QUEUE,
- IWL_MVM_OFFCHANNEL_QUEUE,
- IWL_MAX_TID_COUNT, 0);
-+ else
-+ iwl_mvm_disable_txq(mvm,
-+ IWL_MVM_DQA_P2P_DEVICE_QUEUE,
-+ vif->hw_queue[0], IWL_MAX_TID_COUNT,
-+ 0);
-
- break;
- case NL80211_IFTYPE_AP:
-diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c b/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c
-index df6c32c..afb7eb6 100644
---- a/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c
-+++ b/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c
-@@ -598,9 +598,10 @@ static bool iwl_mvm_reorder(struct iwl_mvm *mvm,
-
- mvm_sta = iwl_mvm_sta_from_mac80211(sta);
-
-- /* not a data packet */
-- if (!ieee80211_is_data_qos(hdr->frame_control) ||
-- is_multicast_ether_addr(hdr->addr1))
-+ /* not a data packet or a bar */
-+ if (!ieee80211_is_back_req(hdr->frame_control) &&
-+ (!ieee80211_is_data_qos(hdr->frame_control) ||
-+ is_multicast_ether_addr(hdr->addr1)))
- return false;
-
- if (unlikely(!ieee80211_is_data_present(hdr->frame_control)))
-@@ -624,6 +625,11 @@ static bool iwl_mvm_reorder(struct iwl_mvm *mvm,
-
- spin_lock_bh(&buffer->lock);
-
-+ if (ieee80211_is_back_req(hdr->frame_control)) {
-+ iwl_mvm_release_frames(mvm, sta, napi, buffer, nssn);
-+ goto drop;
-+ }
-+
- /*
- * If there was a significant jump in the nssn - adjust.
- * If the SN is smaller than the NSSN it might need to first go into
-diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c
-index 3130b9c..e933c12 100644
---- a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c
-+++ b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c
-@@ -576,9 +576,7 @@ static int iwl_mvm_scd_queue_redirect(struct iwl_mvm *mvm, int queue, int tid,
- ret);
-
- /* Make sure the SCD wrptr is correctly set before reconfiguring */
-- iwl_trans_txq_enable(mvm->trans, queue, iwl_mvm_ac_to_tx_fifo[ac],
-- cmd.sta_id, tid, LINK_QUAL_AGG_FRAME_LIMIT_DEF,
-- ssn, wdg_timeout);
-+ iwl_trans_txq_enable_cfg(mvm->trans, queue, ssn, NULL, wdg_timeout);
-
- /* TODO: Work-around SCD bug when moving back by multiples of 0x40 */
-
-@@ -1270,9 +1268,31 @@ int iwl_mvm_rm_sta(struct iwl_mvm *mvm,
- ret = iwl_mvm_drain_sta(mvm, mvm_sta, false);
-
- /* If DQA is supported - the queues can be disabled now */
-- if (iwl_mvm_is_dqa_supported(mvm))
-+ if (iwl_mvm_is_dqa_supported(mvm)) {
-+ u8 reserved_txq = mvm_sta->reserved_queue;
-+ enum iwl_mvm_queue_status *status;
-+
- iwl_mvm_disable_sta_queues(mvm, vif, mvm_sta);
-
-+ /*
-+ * If no traffic has gone through the reserved TXQ - it
-+ * is still marked as IWL_MVM_QUEUE_RESERVED, and
-+ * should be manually marked as free again
-+ */
-+ spin_lock_bh(&mvm->queue_info_lock);
-+ status = &mvm->queue_info[reserved_txq].status;
-+ if (WARN((*status != IWL_MVM_QUEUE_RESERVED) &&
-+ (*status != IWL_MVM_QUEUE_FREE),
-+ "sta_id %d reserved txq %d status %d",
-+ mvm_sta->sta_id, reserved_txq, *status)) {
-+ spin_unlock_bh(&mvm->queue_info_lock);
-+ return -EINVAL;
-+ }
-+
-+ *status = IWL_MVM_QUEUE_FREE;
-+ spin_unlock_bh(&mvm->queue_info_lock);
-+ }
-+
- if (vif->type == NL80211_IFTYPE_STATION &&
- mvmvif->ap_sta_id == mvm_sta->sta_id) {
- /* if associated - we can't remove the AP STA now */
-diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c
-index b3a87a3..a0c1e3d 100644
---- a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c
-+++ b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c
-@@ -903,9 +903,13 @@ static int iwl_mvm_tx_mpdu(struct iwl_mvm *mvm, struct sk_buff *skb,
- tid = IWL_MAX_TID_COUNT;
- }
-
-- if (iwl_mvm_is_dqa_supported(mvm))
-+ if (iwl_mvm_is_dqa_supported(mvm)) {
- txq_id = mvmsta->tid_data[tid].txq_id;
-
-+ if (ieee80211_is_mgmt(fc))
-+ tx_cmd->tid_tspec = IWL_TID_NON_QOS;
-+ }
-+
- /* Copy MAC header from skb into command buffer */
- memcpy(tx_cmd->hdr, hdr, hdrlen);
-
-diff --git a/drivers/net/wireless/marvell/mwifiex/join.c b/drivers/net/wireless/marvell/mwifiex/join.c
-index 1c7b006..b89596c 100644
---- a/drivers/net/wireless/marvell/mwifiex/join.c
-+++ b/drivers/net/wireless/marvell/mwifiex/join.c
-@@ -669,9 +669,8 @@ int mwifiex_ret_802_11_associate(struct mwifiex_private *priv,
- priv->assoc_rsp_size = min(le16_to_cpu(resp->size) - S_DS_GEN,
- sizeof(priv->assoc_rsp_buf));
-
-- memcpy(priv->assoc_rsp_buf, &resp->params, priv->assoc_rsp_size);
--
- assoc_rsp->a_id = cpu_to_le16(aid);
-+ memcpy(priv->assoc_rsp_buf, &resp->params, priv->assoc_rsp_size);
-
- if (status_code) {
- priv->adapter->dbg.num_cmd_assoc_failure++;
-diff --git a/drivers/net/wireless/marvell/mwifiex/sta_event.c b/drivers/net/wireless/marvell/mwifiex/sta_event.c
-index a422f33..7e394d4 100644
---- a/drivers/net/wireless/marvell/mwifiex/sta_event.c
-+++ b/drivers/net/wireless/marvell/mwifiex/sta_event.c
-@@ -708,7 +708,11 @@ int mwifiex_process_sta_event(struct mwifiex_private *priv)
-
- case EVENT_EXT_SCAN_REPORT:
- mwifiex_dbg(adapter, EVENT, "event: EXT_SCAN Report\n");
-- if (adapter->ext_scan && !priv->scan_aborting)
-+ /* We intend to skip this event during suspend, but handle
-+ * it in interface disabled case
-+ */
-+ if (adapter->ext_scan && (!priv->scan_aborting ||
-+ !netif_running(priv->netdev)))
- ret = mwifiex_handle_event_ext_scan_report(priv,
- adapter->event_skb->data);
-
-diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c b/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c
-index 7cf26c6..6005e14 100644
---- a/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c
-+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c
-@@ -831,8 +831,10 @@ int rt2x00usb_probe(struct usb_interface *usb_intf,
- rt2x00dev->anchor = devm_kmalloc(&usb_dev->dev,
- sizeof(struct usb_anchor),
- GFP_KERNEL);
-- if (!rt2x00dev->anchor)
-+ if (!rt2x00dev->anchor) {
-+ retval = -ENOMEM;
- goto exit_free_reg;
-+ }
-
- init_usb_anchor(rt2x00dev->anchor);
- return 0;
-diff --git a/drivers/nvdimm/bus.c b/drivers/nvdimm/bus.c
-index 935866f..a8b6949 100644
---- a/drivers/nvdimm/bus.c
-+++ b/drivers/nvdimm/bus.c
-@@ -217,6 +217,8 @@ long nvdimm_clear_poison(struct device *dev, phys_addr_t phys,
- return rc;
- if (cmd_rc < 0)
- return cmd_rc;
-+
-+ nvdimm_clear_from_poison_list(nvdimm_bus, phys, len);
- return clear_err.cleared;
- }
- EXPORT_SYMBOL_GPL(nvdimm_clear_poison);
-diff --git a/drivers/nvdimm/core.c b/drivers/nvdimm/core.c
-index 4d7bbd2..7ceba08 100644
---- a/drivers/nvdimm/core.c
-+++ b/drivers/nvdimm/core.c
-@@ -547,11 +547,12 @@ void nvdimm_badblocks_populate(struct nd_region *nd_region,
- }
- EXPORT_SYMBOL_GPL(nvdimm_badblocks_populate);
-
--static int add_poison(struct nvdimm_bus *nvdimm_bus, u64 addr, u64 length)
-+static int add_poison(struct nvdimm_bus *nvdimm_bus, u64 addr, u64 length,
-+ gfp_t flags)
- {
- struct nd_poison *pl;
-
-- pl = kzalloc(sizeof(*pl), GFP_KERNEL);
-+ pl = kzalloc(sizeof(*pl), flags);
- if (!pl)
- return -ENOMEM;
-
-@@ -567,7 +568,7 @@ static int bus_add_poison(struct nvdimm_bus *nvdimm_bus, u64 addr, u64 length)
- struct nd_poison *pl;
-
- if (list_empty(&nvdimm_bus->poison_list))
-- return add_poison(nvdimm_bus, addr, length);
-+ return add_poison(nvdimm_bus, addr, length, GFP_KERNEL);
-
- /*
- * There is a chance this is a duplicate, check for those first.
-@@ -587,7 +588,7 @@ static int bus_add_poison(struct nvdimm_bus *nvdimm_bus, u64 addr, u64 length)
- * as any overlapping ranges will get resolved when the list is consumed
- * and converted to badblocks
- */
-- return add_poison(nvdimm_bus, addr, length);
-+ return add_poison(nvdimm_bus, addr, length, GFP_KERNEL);
- }
-
- int nvdimm_bus_add_poison(struct nvdimm_bus *nvdimm_bus, u64 addr, u64 length)
-@@ -602,6 +603,70 @@ int nvdimm_bus_add_poison(struct nvdimm_bus *nvdimm_bus, u64 addr, u64 length)
- }
- EXPORT_SYMBOL_GPL(nvdimm_bus_add_poison);
-
-+void nvdimm_clear_from_poison_list(struct nvdimm_bus *nvdimm_bus,
-+ phys_addr_t start, unsigned int len)
-+{
-+ struct list_head *poison_list = &nvdimm_bus->poison_list;
-+ u64 clr_end = start + len - 1;
-+ struct nd_poison *pl, *next;
-+
-+ nvdimm_bus_lock(&nvdimm_bus->dev);
-+ WARN_ON_ONCE(list_empty(poison_list));
-+
-+ /*
-+ * [start, clr_end] is the poison interval being cleared.
-+ * [pl->start, pl_end] is the poison_list entry we're comparing
-+ * the above interval against. The poison list entry may need
-+ * to be modified (update either start or length), deleted, or
-+ * split into two based on the overlap characteristics
-+ */
-+
-+ list_for_each_entry_safe(pl, next, poison_list, list) {
-+ u64 pl_end = pl->start + pl->length - 1;
-+
-+ /* Skip intervals with no intersection */
-+ if (pl_end < start)
-+ continue;
-+ if (pl->start > clr_end)
-+ continue;
-+ /* Delete completely overlapped poison entries */
-+ if ((pl->start >= start) && (pl_end <= clr_end)) {
-+ list_del(&pl->list);
-+ kfree(pl);
-+ continue;
-+ }
-+ /* Adjust start point of partially cleared entries */
-+ if ((start <= pl->start) && (clr_end > pl->start)) {
-+ pl->length -= clr_end - pl->start + 1;
-+ pl->start = clr_end + 1;
-+ continue;
-+ }
-+ /* Adjust pl->length for partial clearing at the tail end */
-+ if ((pl->start < start) && (pl_end <= clr_end)) {
-+ /* pl->start remains the same */
-+ pl->length = start - pl->start;
-+ continue;
-+ }
-+ /*
-+ * If clearing in the middle of an entry, we split it into
-+ * two by modifying the current entry to represent one half of
-+ * the split, and adding a new entry for the second half.
-+ */
-+ if ((pl->start < start) && (pl_end > clr_end)) {
-+ u64 new_start = clr_end + 1;
-+ u64 new_len = pl_end - new_start + 1;
-+
-+ /* Add new entry covering the right half */
-+ add_poison(nvdimm_bus, new_start, new_len, GFP_NOIO);
-+ /* Adjust this entry to cover the left half */
-+ pl->length = start - pl->start;
-+ continue;
-+ }
-+ }
-+ nvdimm_bus_unlock(&nvdimm_bus->dev);
-+}
-+EXPORT_SYMBOL_GPL(nvdimm_clear_from_poison_list);
-+
- #ifdef CONFIG_BLK_DEV_INTEGRITY
- int nd_integrity_init(struct gendisk *disk, unsigned long meta_size)
- {
-diff --git a/drivers/pci/host/pci-aardvark.c b/drivers/pci/host/pci-aardvark.c
-index ef9893f..4f5e567 100644
---- a/drivers/pci/host/pci-aardvark.c
-+++ b/drivers/pci/host/pci-aardvark.c
-@@ -848,7 +848,7 @@ static int advk_pcie_parse_request_of_pci_ranges(struct advk_pcie *pcie)
- int err, res_valid = 0;
- struct device *dev = &pcie->pdev->dev;
- struct device_node *np = dev->of_node;
-- struct resource_entry *win;
-+ struct resource_entry *win, *tmp;
- resource_size_t iobase;
-
- INIT_LIST_HEAD(&pcie->resources);
-@@ -862,7 +862,7 @@ static int advk_pcie_parse_request_of_pci_ranges(struct advk_pcie *pcie)
- if (err)
- goto out_release_res;
-
-- resource_list_for_each_entry(win, &pcie->resources) {
-+ resource_list_for_each_entry_safe(win, tmp, &pcie->resources) {
- struct resource *res = win->res;
-
- switch (resource_type(res)) {
-@@ -874,9 +874,11 @@ static int advk_pcie_parse_request_of_pci_ranges(struct advk_pcie *pcie)
- lower_32_bits(res->start),
- OB_PCIE_IO);
- err = pci_remap_iospace(res, iobase);
-- if (err)
-+ if (err) {
- dev_warn(dev, "error %d: failed to map resource %pR\n",
- err, res);
-+ resource_list_destroy_entry(win);
-+ }
- break;
- case IORESOURCE_MEM:
- advk_pcie_set_ob_win(pcie, 0,
-diff --git a/drivers/pci/host/pci-host-common.c b/drivers/pci/host/pci-host-common.c
-index 9d9d34e..61eb4d4 100644
---- a/drivers/pci/host/pci-host-common.c
-+++ b/drivers/pci/host/pci-host-common.c
-@@ -29,7 +29,7 @@ static int gen_pci_parse_request_of_pci_ranges(struct device *dev,
- int err, res_valid = 0;
- struct device_node *np = dev->of_node;
- resource_size_t iobase;
-- struct resource_entry *win;
-+ struct resource_entry *win, *tmp;
-
- err = of_pci_get_host_bridge_resources(np, 0, 0xff, resources, &iobase);
- if (err)
-@@ -39,15 +39,17 @@ static int gen_pci_parse_request_of_pci_ranges(struct device *dev,
- if (err)
- return err;
-
-- resource_list_for_each_entry(win, resources) {
-+ resource_list_for_each_entry_safe(win, tmp, resources) {
- struct resource *res = win->res;
-
- switch (resource_type(res)) {
- case IORESOURCE_IO:
- err = pci_remap_iospace(res, iobase);
-- if (err)
-+ if (err) {
- dev_warn(dev, "error %d: failed to map resource %pR\n",
- err, res);
-+ resource_list_destroy_entry(win);
-+ }
- break;
- case IORESOURCE_MEM:
- res_valid |= !(res->flags & IORESOURCE_PREFETCH);
-diff --git a/drivers/pci/host/pci-tegra.c b/drivers/pci/host/pci-tegra.c
-index 84d650d..7ec1e80 100644
---- a/drivers/pci/host/pci-tegra.c
-+++ b/drivers/pci/host/pci-tegra.c
-@@ -621,7 +621,11 @@ static int tegra_pcie_setup(int nr, struct pci_sys_data *sys)
- if (err < 0)
- return err;
-
-- pci_add_resource_offset(&sys->resources, &pcie->pio, sys->io_offset);
-+ err = pci_remap_iospace(&pcie->pio, pcie->io.start);
-+ if (!err)
-+ pci_add_resource_offset(&sys->resources, &pcie->pio,
-+ sys->io_offset);
-+
- pci_add_resource_offset(&sys->resources, &pcie->mem, sys->mem_offset);
- pci_add_resource_offset(&sys->resources, &pcie->prefetch,
- sys->mem_offset);
-@@ -631,7 +635,6 @@ static int tegra_pcie_setup(int nr, struct pci_sys_data *sys)
- if (err < 0)
- return err;
-
-- pci_remap_iospace(&pcie->pio, pcie->io.start);
- return 1;
- }
-
-diff --git a/drivers/pci/host/pci-versatile.c b/drivers/pci/host/pci-versatile.c
-index f2344057..b7dc070 100644
---- a/drivers/pci/host/pci-versatile.c
-+++ b/drivers/pci/host/pci-versatile.c
-@@ -74,7 +74,7 @@ static int versatile_pci_parse_request_of_pci_ranges(struct device *dev,
- int err, mem = 1, res_valid = 0;
- struct device_node *np = dev->of_node;
- resource_size_t iobase;
-- struct resource_entry *win;
-+ struct resource_entry *win, *tmp;
-
- err = of_pci_get_host_bridge_resources(np, 0, 0xff, res, &iobase);
- if (err)
-@@ -84,15 +84,17 @@ static int versatile_pci_parse_request_of_pci_ranges(struct device *dev,
- if (err)
- goto out_release_res;
-
-- resource_list_for_each_entry(win, res) {
-+ resource_list_for_each_entry_safe(win, tmp, res) {
- struct resource *res = win->res;
-
- switch (resource_type(res)) {
- case IORESOURCE_IO:
- err = pci_remap_iospace(res, iobase);
-- if (err)
-+ if (err) {
- dev_warn(dev, "error %d: failed to map resource %pR\n",
- err, res);
-+ resource_list_destroy_entry(win);
-+ }
- break;
- case IORESOURCE_MEM:
- res_valid |= !(res->flags & IORESOURCE_PREFETCH);
-diff --git a/drivers/pci/host/pcie-designware.c b/drivers/pci/host/pcie-designware.c
-index 12afce1..2a500f2 100644
---- a/drivers/pci/host/pcie-designware.c
-+++ b/drivers/pci/host/pcie-designware.c
-@@ -436,7 +436,7 @@ int dw_pcie_host_init(struct pcie_port *pp)
- struct resource *cfg_res;
- int i, ret;
- LIST_HEAD(res);
-- struct resource_entry *win;
-+ struct resource_entry *win, *tmp;
-
- cfg_res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "config");
- if (cfg_res) {
-@@ -457,17 +457,20 @@ int dw_pcie_host_init(struct pcie_port *pp)
- goto error;
-
- /* Get the I/O and memory ranges from DT */
-- resource_list_for_each_entry(win, &res) {
-+ resource_list_for_each_entry_safe(win, tmp, &res) {
- switch (resource_type(win->res)) {
- case IORESOURCE_IO:
-- pp->io = win->res;
-- pp->io->name = "I/O";
-- pp->io_size = resource_size(pp->io);
-- pp->io_bus_addr = pp->io->start - win->offset;
-- ret = pci_remap_iospace(pp->io, pp->io_base);
-- if (ret)
-+ ret = pci_remap_iospace(win->res, pp->io_base);
-+ if (ret) {
- dev_warn(pp->dev, "error %d: failed to map resource %pR\n",
-- ret, pp->io);
-+ ret, win->res);
-+ resource_list_destroy_entry(win);
-+ } else {
-+ pp->io = win->res;
-+ pp->io->name = "I/O";
-+ pp->io_size = resource_size(pp->io);
-+ pp->io_bus_addr = pp->io->start - win->offset;
-+ }
- break;
- case IORESOURCE_MEM:
- pp->mem = win->res;
-diff --git a/drivers/pci/host/pcie-rcar.c b/drivers/pci/host/pcie-rcar.c
-index 65db7a2..5f7fcc9 100644
---- a/drivers/pci/host/pcie-rcar.c
-+++ b/drivers/pci/host/pcie-rcar.c
-@@ -945,7 +945,7 @@ static int rcar_pcie_parse_request_of_pci_ranges(struct rcar_pcie *pci)
- struct device *dev = pci->dev;
- struct device_node *np = dev->of_node;
- resource_size_t iobase;
-- struct resource_entry *win;
-+ struct resource_entry *win, *tmp;
-
- err = of_pci_get_host_bridge_resources(np, 0, 0xff, &pci->resources, &iobase);
- if (err)
-@@ -955,14 +955,17 @@ static int rcar_pcie_parse_request_of_pci_ranges(struct rcar_pcie *pci)
- if (err)
- goto out_release_res;
-
-- resource_list_for_each_entry(win, &pci->resources) {
-+ resource_list_for_each_entry_safe(win, tmp, &pci->resources) {
- struct resource *res = win->res;
-
- if (resource_type(res) == IORESOURCE_IO) {
- err = pci_remap_iospace(res, iobase);
-- if (err)
-+ if (err) {
- dev_warn(dev, "error %d: failed to map resource %pR\n",
- err, res);
-+
-+ resource_list_destroy_entry(win);
-+ }
- }
- }
-
-diff --git a/drivers/pinctrl/qcom/pinctrl-msm.c b/drivers/pinctrl/qcom/pinctrl-msm.c
-index 51c42d7..775c883 100644
---- a/drivers/pinctrl/qcom/pinctrl-msm.c
-+++ b/drivers/pinctrl/qcom/pinctrl-msm.c
-@@ -156,7 +156,7 @@ static int msm_pinmux_set_mux(struct pinctrl_dev *pctldev,
- spin_lock_irqsave(&pctrl->lock, flags);
-
- val = readl(pctrl->regs + g->ctl_reg);
-- val &= mask;
-+ val &= ~mask;
- val |= i << g->mux_bit;
- writel(val, pctrl->regs + g->ctl_reg);
-
-diff --git a/drivers/power/bq24257_charger.c b/drivers/power/bq24257_charger.c
-index 1fea2c7..6fc31bd 100644
---- a/drivers/power/bq24257_charger.c
-+++ b/drivers/power/bq24257_charger.c
-@@ -1068,6 +1068,12 @@ static int bq24257_probe(struct i2c_client *client,
- return ret;
- }
-
-+ ret = bq24257_power_supply_init(bq);
-+ if (ret < 0) {
-+ dev_err(dev, "Failed to register power supply\n");
-+ return ret;
-+ }
-+
- ret = devm_request_threaded_irq(dev, client->irq, NULL,
- bq24257_irq_handler_thread,
- IRQF_TRIGGER_FALLING |
-@@ -1078,12 +1084,6 @@ static int bq24257_probe(struct i2c_client *client,
- return ret;
- }
-
-- ret = bq24257_power_supply_init(bq);
-- if (ret < 0) {
-- dev_err(dev, "Failed to register power supply\n");
-- return ret;
-- }
--
- ret = sysfs_create_group(&bq->charger->dev.kobj, &bq24257_attr_group);
- if (ret < 0) {
- dev_err(dev, "Can't create sysfs entries\n");
-diff --git a/drivers/s390/char/con3270.c b/drivers/s390/char/con3270.c
-index 6b1577c..285b400 100644
---- a/drivers/s390/char/con3270.c
-+++ b/drivers/s390/char/con3270.c
-@@ -124,7 +124,12 @@ con3270_create_status(struct con3270 *cp)
- static void
- con3270_update_string(struct con3270 *cp, struct string *s, int nr)
- {
-- if (s->len >= cp->view.cols - 5)
-+ if (s->len < 4) {
-+ /* This indicates a bug, but printing a warning would
-+ * cause a deadlock. */
-+ return;
-+ }
-+ if (s->string[s->len - 4] != TO_RA)
- return;
- raw3270_buffer_address(cp->view.dev, s->string + s->len - 3,
- cp->view.cols * (nr + 1));
-@@ -460,11 +465,11 @@ con3270_cline_end(struct con3270 *cp)
- cp->cline->len + 4 : cp->view.cols;
- s = con3270_alloc_string(cp, size);
- memcpy(s->string, cp->cline->string, cp->cline->len);
-- if (s->len < cp->view.cols - 5) {
-+ if (cp->cline->len < cp->view.cols - 5) {
- s->string[s->len - 4] = TO_RA;
- s->string[s->len - 1] = 0;
- } else {
-- while (--size > cp->cline->len)
-+ while (--size >= cp->cline->len)
- s->string[size] = cp->view.ascebc[' '];
- }
- /* Replace cline with allocated line s and reset cline. */
-diff --git a/drivers/s390/cio/chsc.c b/drivers/s390/cio/chsc.c
-index 940e725..1167469 100644
---- a/drivers/s390/cio/chsc.c
-+++ b/drivers/s390/cio/chsc.c
-@@ -95,12 +95,13 @@ struct chsc_ssd_area {
- int chsc_get_ssd_info(struct subchannel_id schid, struct chsc_ssd_info *ssd)
- {
- struct chsc_ssd_area *ssd_area;
-+ unsigned long flags;
- int ccode;
- int ret;
- int i;
- int mask;
-
-- spin_lock_irq(&chsc_page_lock);
-+ spin_lock_irqsave(&chsc_page_lock, flags);
- memset(chsc_page, 0, PAGE_SIZE);
- ssd_area = chsc_page;
- ssd_area->request.length = 0x0010;
-@@ -144,7 +145,7 @@ int chsc_get_ssd_info(struct subchannel_id schid, struct chsc_ssd_info *ssd)
- ssd->fla[i] = ssd_area->fla[i];
- }
- out:
-- spin_unlock_irq(&chsc_page_lock);
-+ spin_unlock_irqrestore(&chsc_page_lock, flags);
- return ret;
- }
-
-@@ -832,9 +833,10 @@ int __chsc_do_secm(struct channel_subsystem *css, int enable)
- u32 fmt : 4;
- u32 : 16;
- } __attribute__ ((packed)) *secm_area;
-+ unsigned long flags;
- int ret, ccode;
-
-- spin_lock_irq(&chsc_page_lock);
-+ spin_lock_irqsave(&chsc_page_lock, flags);
- memset(chsc_page, 0, PAGE_SIZE);
- secm_area = chsc_page;
- secm_area->request.length = 0x0050;
-@@ -864,7 +866,7 @@ int __chsc_do_secm(struct channel_subsystem *css, int enable)
- CIO_CRW_EVENT(2, "chsc: secm failed (rc=%04x)\n",
- secm_area->response.code);
- out:
-- spin_unlock_irq(&chsc_page_lock);
-+ spin_unlock_irqrestore(&chsc_page_lock, flags);
- return ret;
- }
-
-@@ -992,6 +994,7 @@ chsc_initialize_cmg_chars(struct channel_path *chp, u8 cmcv,
-
- int chsc_get_channel_measurement_chars(struct channel_path *chp)
- {
-+ unsigned long flags;
- int ccode, ret;
-
- struct {
-@@ -1021,7 +1024,7 @@ int chsc_get_channel_measurement_chars(struct channel_path *chp)
- if (!css_chsc_characteristics.scmc || !css_chsc_characteristics.secm)
- return -EINVAL;
-
-- spin_lock_irq(&chsc_page_lock);
-+ spin_lock_irqsave(&chsc_page_lock, flags);
- memset(chsc_page, 0, PAGE_SIZE);
- scmc_area = chsc_page;
- scmc_area->request.length = 0x0010;
-@@ -1053,7 +1056,7 @@ int chsc_get_channel_measurement_chars(struct channel_path *chp)
- chsc_initialize_cmg_chars(chp, scmc_area->cmcv,
- (struct cmg_chars *) &scmc_area->data);
- out:
-- spin_unlock_irq(&chsc_page_lock);
-+ spin_unlock_irqrestore(&chsc_page_lock, flags);
- return ret;
- }
-
-@@ -1134,6 +1137,7 @@ struct css_chsc_char css_chsc_characteristics;
- int __init
- chsc_determine_css_characteristics(void)
- {
-+ unsigned long flags;
- int result;
- struct {
- struct chsc_header request;
-@@ -1146,7 +1150,7 @@ chsc_determine_css_characteristics(void)
- u32 chsc_char[508];
- } __attribute__ ((packed)) *scsc_area;
-
-- spin_lock_irq(&chsc_page_lock);
-+ spin_lock_irqsave(&chsc_page_lock, flags);
- memset(chsc_page, 0, PAGE_SIZE);
- scsc_area = chsc_page;
- scsc_area->request.length = 0x0010;
-@@ -1168,7 +1172,7 @@ chsc_determine_css_characteristics(void)
- CIO_CRW_EVENT(2, "chsc: scsc failed (rc=%04x)\n",
- scsc_area->response.code);
- exit:
-- spin_unlock_irq(&chsc_page_lock);
-+ spin_unlock_irqrestore(&chsc_page_lock, flags);
- return result;
- }
-
-diff --git a/drivers/scsi/cxlflash/main.c b/drivers/scsi/cxlflash/main.c
-index 661bb94..228b99e 100644
---- a/drivers/scsi/cxlflash/main.c
-+++ b/drivers/scsi/cxlflash/main.c
-@@ -823,17 +823,6 @@ static void notify_shutdown(struct cxlflash_cfg *cfg, bool wait)
- }
-
- /**
-- * cxlflash_shutdown() - shutdown handler
-- * @pdev: PCI device associated with the host.
-- */
--static void cxlflash_shutdown(struct pci_dev *pdev)
--{
-- struct cxlflash_cfg *cfg = pci_get_drvdata(pdev);
--
-- notify_shutdown(cfg, false);
--}
--
--/**
- * cxlflash_remove() - PCI entry point to tear down host
- * @pdev: PCI device associated with the host.
- *
-@@ -844,6 +833,11 @@ static void cxlflash_remove(struct pci_dev *pdev)
- struct cxlflash_cfg *cfg = pci_get_drvdata(pdev);
- ulong lock_flags;
-
-+ if (!pci_is_enabled(pdev)) {
-+ pr_debug("%s: Device is disabled\n", __func__);
-+ return;
-+ }
-+
- /* If a Task Management Function is active, wait for it to complete
- * before continuing with remove.
- */
-@@ -2685,7 +2679,7 @@ static struct pci_driver cxlflash_driver = {
- .id_table = cxlflash_pci_table,
- .probe = cxlflash_probe,
- .remove = cxlflash_remove,
-- .shutdown = cxlflash_shutdown,
-+ .shutdown = cxlflash_remove,
- .err_handler = &cxlflash_err_handler,
- };
-
-diff --git a/drivers/scsi/mpt3sas/mpt3sas_scsih.c b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
-index cd91a68..4cb7990 100644
---- a/drivers/scsi/mpt3sas/mpt3sas_scsih.c
-+++ b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
-@@ -4701,7 +4701,7 @@ _scsih_io_done(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 msix_index, u32 reply)
- le16_to_cpu(mpi_reply->DevHandle));
- mpt3sas_trigger_scsi(ioc, data.skey, data.asc, data.ascq);
-
-- if (!(ioc->logging_level & MPT_DEBUG_REPLY) &&
-+ if ((ioc->logging_level & MPT_DEBUG_REPLY) &&
- ((scmd->sense_buffer[2] == UNIT_ATTENTION) ||
- (scmd->sense_buffer[2] == MEDIUM_ERROR) ||
- (scmd->sense_buffer[2] == HARDWARE_ERROR)))
-diff --git a/drivers/spi/spi-fsl-dspi.c b/drivers/spi/spi-fsl-dspi.c
-index 9e9dadb..eec5e3f 100644
---- a/drivers/spi/spi-fsl-dspi.c
-+++ b/drivers/spi/spi-fsl-dspi.c
-@@ -760,7 +760,6 @@ static int dspi_remove(struct platform_device *pdev)
- /* Disconnect from the SPI framework */
- clk_disable_unprepare(dspi->clk);
- spi_unregister_master(dspi->master);
-- spi_master_put(dspi->master);
-
- return 0;
- }
-diff --git a/drivers/staging/android/ion/Kconfig b/drivers/staging/android/ion/Kconfig
-index 19c1572..800245e 100644
---- a/drivers/staging/android/ion/Kconfig
-+++ b/drivers/staging/android/ion/Kconfig
-@@ -36,6 +36,7 @@ config ION_TEGRA
- config ION_HISI
- tristate "Ion for Hisilicon"
- depends on ARCH_HISI && ION
-+ select ION_OF
- help
- Choose this option if you wish to use ion on Hisilicon Platform.
-
-diff --git a/drivers/staging/ks7010/ks_hostif.c b/drivers/staging/ks7010/ks_hostif.c
-index a8822fe..f4cee81 100644
---- a/drivers/staging/ks7010/ks_hostif.c
-+++ b/drivers/staging/ks7010/ks_hostif.c
-@@ -69,16 +69,20 @@ inline u32 get_DWORD(struct ks_wlan_private *priv)
- return data;
- }
-
--void ks_wlan_hw_wakeup_task(struct work_struct *work)
-+static void ks_wlan_hw_wakeup_task(struct work_struct *work)
- {
- struct ks_wlan_private *priv =
- container_of(work, struct ks_wlan_private, ks_wlan_wakeup_task);
- int ps_status = atomic_read(&priv->psstatus.status);
-+ long time_left;
-
- if (ps_status == PS_SNOOZE) {
- ks_wlan_hw_wakeup_request(priv);
-- if (!wait_for_completion_interruptible_timeout(&priv->psstatus.wakeup_wait, HZ / 50)) { /* 20ms timeout */
-- DPRINTK(1, "wake up timeout !!!\n");
-+ time_left = wait_for_completion_interruptible_timeout(
-+ &priv->psstatus.wakeup_wait,
-+ msecs_to_jiffies(20));
-+ if (time_left <= 0) {
-+ DPRINTK(1, "wake up timeout or interrupted !!!\n");
- schedule_work(&priv->ks_wlan_wakeup_task);
- return;
- }
-@@ -1505,7 +1509,7 @@ void hostif_infrastructure_set_request(struct ks_wlan_private *priv)
- ks_wlan_hw_tx(priv, pp, hif_align_size(sizeof(*pp)), NULL, NULL, NULL);
- }
-
--void hostif_infrastructure_set2_request(struct ks_wlan_private *priv)
-+static void hostif_infrastructure_set2_request(struct ks_wlan_private *priv)
- {
- struct hostif_infrastructure_set2_request_t *pp;
- uint16_t capability;
-diff --git a/drivers/staging/rtl8188eu/core/rtw_cmd.c b/drivers/staging/rtl8188eu/core/rtw_cmd.c
-index 7748523..32d3a9c 100644
---- a/drivers/staging/rtl8188eu/core/rtw_cmd.c
-+++ b/drivers/staging/rtl8188eu/core/rtw_cmd.c
-@@ -670,13 +670,13 @@ u8 rtw_addbareq_cmd(struct adapter *padapter, u8 tid, u8 *addr)
- u8 res = _SUCCESS;
-
-
-- ph2c = kzalloc(sizeof(struct cmd_obj), GFP_KERNEL);
-+ ph2c = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC);
- if (!ph2c) {
- res = _FAIL;
- goto exit;
- }
-
-- paddbareq_parm = kzalloc(sizeof(struct addBaReq_parm), GFP_KERNEL);
-+ paddbareq_parm = kzalloc(sizeof(struct addBaReq_parm), GFP_ATOMIC);
- if (!paddbareq_parm) {
- kfree(ph2c);
- res = _FAIL;
-diff --git a/drivers/staging/sm750fb/ddk750_mode.c b/drivers/staging/sm750fb/ddk750_mode.c
-index ccb4e06..e29d4bd 100644
---- a/drivers/staging/sm750fb/ddk750_mode.c
-+++ b/drivers/staging/sm750fb/ddk750_mode.c
-@@ -63,7 +63,7 @@ static unsigned long displayControlAdjust_SM750LE(mode_parameter_t *pModeParam,
- dispControl |= (CRT_DISPLAY_CTRL_CRTSELECT | CRT_DISPLAY_CTRL_RGBBIT);
-
- /* Set bit 14 of display controller */
-- dispControl = DISPLAY_CTRL_CLOCK_PHASE;
-+ dispControl |= DISPLAY_CTRL_CLOCK_PHASE;
-
- POKE32(CRT_DISPLAY_CTRL, dispControl);
-
-diff --git a/drivers/uio/uio_dmem_genirq.c b/drivers/uio/uio_dmem_genirq.c
-index 915facb..e1134a4 100644
---- a/drivers/uio/uio_dmem_genirq.c
-+++ b/drivers/uio/uio_dmem_genirq.c
-@@ -229,7 +229,7 @@ static int uio_dmem_genirq_probe(struct platform_device *pdev)
- ++uiomem;
- }
-
-- priv->dmem_region_start = i;
-+ priv->dmem_region_start = uiomem - &uioinfo->mem[0];
- priv->num_dmem_regions = pdata->num_dynamic_regions;
-
- for (i = 0; i < pdata->num_dynamic_regions; ++i) {
-diff --git a/fs/9p/acl.c b/fs/9p/acl.c
-index 5b6a174..b3c2cc7 100644
---- a/fs/9p/acl.c
-+++ b/fs/9p/acl.c
-@@ -276,32 +276,26 @@ static int v9fs_xattr_set_acl(const struct xattr_handler *handler,
- switch (handler->flags) {
- case ACL_TYPE_ACCESS:
- if (acl) {
-- umode_t mode = inode->i_mode;
-- retval = posix_acl_equiv_mode(acl, &mode);
-- if (retval < 0)
-+ struct iattr iattr;
-+
-+ retval = posix_acl_update_mode(inode, &iattr.ia_mode, &acl);
-+ if (retval)
- goto err_out;
-- else {
-- struct iattr iattr;
-- if (retval == 0) {
-- /*
-- * ACL can be represented
-- * by the mode bits. So don't
-- * update ACL.
-- */
-- acl = NULL;
-- value = NULL;
-- size = 0;
-- }
-- /* Updte the mode bits */
-- iattr.ia_mode = ((mode & S_IALLUGO) |
-- (inode->i_mode & ~S_IALLUGO));
-- iattr.ia_valid = ATTR_MODE;
-- /* FIXME should we update ctime ?
-- * What is the following setxattr update the
-- * mode ?
-+ if (!acl) {
-+ /*
-+ * ACL can be represented
-+ * by the mode bits. So don't
-+ * update ACL.
- */
-- v9fs_vfs_setattr_dotl(dentry, &iattr);
-+ value = NULL;
-+ size = 0;
- }
-+ iattr.ia_valid = ATTR_MODE;
-+ /* FIXME should we update ctime ?
-+ * What is the following setxattr update the
-+ * mode ?
-+ */
-+ v9fs_vfs_setattr_dotl(dentry, &iattr);
- }
- break;
- case ACL_TYPE_DEFAULT:
-diff --git a/fs/btrfs/acl.c b/fs/btrfs/acl.c
-index 53bb7af..247b8df 100644
---- a/fs/btrfs/acl.c
-+++ b/fs/btrfs/acl.c
-@@ -79,11 +79,9 @@ static int __btrfs_set_acl(struct btrfs_trans_handle *trans,
- case ACL_TYPE_ACCESS:
- name = XATTR_NAME_POSIX_ACL_ACCESS;
- if (acl) {
-- ret = posix_acl_equiv_mode(acl, &inode->i_mode);
-- if (ret < 0)
-+ ret = posix_acl_update_mode(inode, &inode->i_mode, &acl);
-+ if (ret)
- return ret;
-- if (ret == 0)
-- acl = NULL;
- }
- ret = 0;
- break;
-diff --git a/fs/ceph/acl.c b/fs/ceph/acl.c
-index 4f67227..d0b6b342 100644
---- a/fs/ceph/acl.c
-+++ b/fs/ceph/acl.c
-@@ -95,11 +95,9 @@ int ceph_set_acl(struct inode *inode, struct posix_acl *acl, int type)
- case ACL_TYPE_ACCESS:
- name = XATTR_NAME_POSIX_ACL_ACCESS;
- if (acl) {
-- ret = posix_acl_equiv_mode(acl, &new_mode);
-- if (ret < 0)
-+ ret = posix_acl_update_mode(inode, &new_mode, &acl);
-+ if (ret)
- goto out;
-- if (ret == 0)
-- acl = NULL;
- }
- break;
- case ACL_TYPE_DEFAULT:
-diff --git a/fs/ext2/acl.c b/fs/ext2/acl.c
-index 42f1d18..e725aa0 100644
---- a/fs/ext2/acl.c
-+++ b/fs/ext2/acl.c
-@@ -190,15 +190,11 @@ ext2_set_acl(struct inode *inode, struct posix_acl *acl, int type)
- case ACL_TYPE_ACCESS:
- name_index = EXT2_XATTR_INDEX_POSIX_ACL_ACCESS;
- if (acl) {
-- error = posix_acl_equiv_mode(acl, &inode->i_mode);
-- if (error < 0)
-+ error = posix_acl_update_mode(inode, &inode->i_mode, &acl);
-+ if (error)
- return error;
-- else {
-- inode->i_ctime = CURRENT_TIME_SEC;
-- mark_inode_dirty(inode);
-- if (error == 0)
-- acl = NULL;
-- }
-+ inode->i_ctime = CURRENT_TIME_SEC;
-+ mark_inode_dirty(inode);
- }
- break;
-
-diff --git a/fs/ext4/acl.c b/fs/ext4/acl.c
-index c6601a4..dfa5199 100644
---- a/fs/ext4/acl.c
-+++ b/fs/ext4/acl.c
-@@ -193,15 +193,11 @@ __ext4_set_acl(handle_t *handle, struct inode *inode, int type,
- case ACL_TYPE_ACCESS:
- name_index = EXT4_XATTR_INDEX_POSIX_ACL_ACCESS;
- if (acl) {
-- error = posix_acl_equiv_mode(acl, &inode->i_mode);
-- if (error < 0)
-+ error = posix_acl_update_mode(inode, &inode->i_mode, &acl);
-+ if (error)
- return error;
-- else {
-- inode->i_ctime = ext4_current_time(inode);
-- ext4_mark_inode_dirty(handle, inode);
-- if (error == 0)
-- acl = NULL;
-- }
-+ inode->i_ctime = ext4_current_time(inode);
-+ ext4_mark_inode_dirty(handle, inode);
- }
- break;
-
-diff --git a/fs/f2fs/acl.c b/fs/f2fs/acl.c
-index 4dcc9e2..3134424 100644
---- a/fs/f2fs/acl.c
-+++ b/fs/f2fs/acl.c
-@@ -210,12 +210,10 @@ static int __f2fs_set_acl(struct inode *inode, int type,
- case ACL_TYPE_ACCESS:
- name_index = F2FS_XATTR_INDEX_POSIX_ACL_ACCESS;
- if (acl) {
-- error = posix_acl_equiv_mode(acl, &inode->i_mode);
-- if (error < 0)
-+ error = posix_acl_update_mode(inode, &inode->i_mode, &acl);
-+ if (error)
- return error;
- set_acl_inode(inode, inode->i_mode);
-- if (error == 0)
-- acl = NULL;
- }
- break;
-
-diff --git a/fs/gfs2/acl.c b/fs/gfs2/acl.c
-index 363ba9e..2524807 100644
---- a/fs/gfs2/acl.c
-+++ b/fs/gfs2/acl.c
-@@ -92,17 +92,11 @@ int __gfs2_set_acl(struct inode *inode, struct posix_acl *acl, int type)
- if (type == ACL_TYPE_ACCESS) {
- umode_t mode = inode->i_mode;
-
-- error = posix_acl_equiv_mode(acl, &mode);
-- if (error < 0)
-+ error = posix_acl_update_mode(inode, &inode->i_mode, &acl);
-+ if (error)
- return error;
--
-- if (error == 0)
-- acl = NULL;
--
-- if (mode != inode->i_mode) {
-- inode->i_mode = mode;
-+ if (mode != inode->i_mode)
- mark_inode_dirty(inode);
-- }
- }
-
- if (acl) {
-diff --git a/fs/hfsplus/posix_acl.c b/fs/hfsplus/posix_acl.c
-index ab7ea25..9b92058 100644
---- a/fs/hfsplus/posix_acl.c
-+++ b/fs/hfsplus/posix_acl.c
-@@ -65,8 +65,8 @@ int hfsplus_set_posix_acl(struct inode *inode, struct posix_acl *acl,
- case ACL_TYPE_ACCESS:
- xattr_name = XATTR_NAME_POSIX_ACL_ACCESS;
- if (acl) {
-- err = posix_acl_equiv_mode(acl, &inode->i_mode);
-- if (err < 0)
-+ err = posix_acl_update_mode(inode, &inode->i_mode, &acl);
-+ if (err)
- return err;
- }
- err = 0;
-diff --git a/fs/jffs2/acl.c b/fs/jffs2/acl.c
-index bc2693d..2a0f2a1 100644
---- a/fs/jffs2/acl.c
-+++ b/fs/jffs2/acl.c
-@@ -233,9 +233,10 @@ int jffs2_set_acl(struct inode *inode, struct posix_acl *acl, int type)
- case ACL_TYPE_ACCESS:
- xprefix = JFFS2_XPREFIX_ACL_ACCESS;
- if (acl) {
-- umode_t mode = inode->i_mode;
-- rc = posix_acl_equiv_mode(acl, &mode);
-- if (rc < 0)
-+ umode_t mode;
-+
-+ rc = posix_acl_update_mode(inode, &mode, &acl);
-+ if (rc)
- return rc;
- if (inode->i_mode != mode) {
- struct iattr attr;
-@@ -247,8 +248,6 @@ int jffs2_set_acl(struct inode *inode, struct posix_acl *acl, int type)
- if (rc < 0)
- return rc;
- }
-- if (rc == 0)
-- acl = NULL;
- }
- break;
- case ACL_TYPE_DEFAULT:
-diff --git a/fs/jfs/acl.c b/fs/jfs/acl.c
-index 21fa92b..3a1e155 100644
---- a/fs/jfs/acl.c
-+++ b/fs/jfs/acl.c
-@@ -78,13 +78,11 @@ static int __jfs_set_acl(tid_t tid, struct inode *inode, int type,
- case ACL_TYPE_ACCESS:
- ea_name = XATTR_NAME_POSIX_ACL_ACCESS;
- if (acl) {
-- rc = posix_acl_equiv_mode(acl, &inode->i_mode);
-- if (rc < 0)
-+ rc = posix_acl_update_mode(inode, &inode->i_mode, &acl);
-+ if (rc)
- return rc;
- inode->i_ctime = CURRENT_TIME;
- mark_inode_dirty(inode);
-- if (rc == 0)
-- acl = NULL;
- }
- break;
- case ACL_TYPE_DEFAULT:
-diff --git a/fs/ocfs2/acl.c b/fs/ocfs2/acl.c
-index 2162434..164307b 100644
---- a/fs/ocfs2/acl.c
-+++ b/fs/ocfs2/acl.c
-@@ -241,13 +241,11 @@ int ocfs2_set_acl(handle_t *handle,
- case ACL_TYPE_ACCESS:
- name_index = OCFS2_XATTR_INDEX_POSIX_ACL_ACCESS;
- if (acl) {
-- umode_t mode = inode->i_mode;
-- ret = posix_acl_equiv_mode(acl, &mode);
-- if (ret < 0)
-- return ret;
-+ umode_t mode;
-
-- if (ret == 0)
-- acl = NULL;
-+ ret = posix_acl_update_mode(inode, &mode, &acl);
-+ if (ret)
-+ return ret;
-
- ret = ocfs2_acl_set_mode(inode, di_bh,
- handle, mode);
-diff --git a/fs/orangefs/acl.c b/fs/orangefs/acl.c
-index 28f2195..7a37544 100644
---- a/fs/orangefs/acl.c
-+++ b/fs/orangefs/acl.c
-@@ -73,14 +73,11 @@ int orangefs_set_acl(struct inode *inode, struct posix_acl *acl, int type)
- case ACL_TYPE_ACCESS:
- name = XATTR_NAME_POSIX_ACL_ACCESS;
- if (acl) {
-- umode_t mode = inode->i_mode;
-- /*
-- * can we represent this with the traditional file
-- * mode permission bits?
-- */
-- error = posix_acl_equiv_mode(acl, &mode);
-- if (error < 0) {
-- gossip_err("%s: posix_acl_equiv_mode err: %d\n",
-+ umode_t mode;
-+
-+ error = posix_acl_update_mode(inode, &mode, &acl);
-+ if (error) {
-+ gossip_err("%s: posix_acl_update_mode err: %d\n",
- __func__,
- error);
- return error;
-@@ -90,8 +87,6 @@ int orangefs_set_acl(struct inode *inode, struct posix_acl *acl, int type)
- SetModeFlag(orangefs_inode);
- inode->i_mode = mode;
- mark_inode_dirty_sync(inode);
-- if (error == 0)
-- acl = NULL;
- }
- break;
- case ACL_TYPE_DEFAULT:
-diff --git a/fs/posix_acl.c b/fs/posix_acl.c
-index 59d47ab0..bfc3ec3 100644
---- a/fs/posix_acl.c
-+++ b/fs/posix_acl.c
-@@ -626,6 +626,37 @@ posix_acl_create(struct inode *dir, umode_t *mode,
- }
- EXPORT_SYMBOL_GPL(posix_acl_create);
-
-+/**
-+ * posix_acl_update_mode - update mode in set_acl
-+ *
-+ * Update the file mode when setting an ACL: compute the new file permission
-+ * bits based on the ACL. In addition, if the ACL is equivalent to the new
-+ * file mode, set *acl to NULL to indicate that no ACL should be set.
-+ *
-+ * As with chmod, clear the setgit bit if the caller is not in the owning group
-+ * or capable of CAP_FSETID (see inode_change_ok).
-+ *
-+ * Called from set_acl inode operations.
-+ */
-+int posix_acl_update_mode(struct inode *inode, umode_t *mode_p,
-+ struct posix_acl **acl)
-+{
-+ umode_t mode = inode->i_mode;
-+ int error;
-+
-+ error = posix_acl_equiv_mode(*acl, &mode);
-+ if (error < 0)
-+ return error;
-+ if (error == 0)
-+ *acl = NULL;
-+ if (!in_group_p(inode->i_gid) &&
-+ !capable_wrt_inode_uidgid(inode, CAP_FSETID))
-+ mode &= ~S_ISGID;
-+ *mode_p = mode;
-+ return 0;
-+}
-+EXPORT_SYMBOL(posix_acl_update_mode);
-+
- /*
- * Fix up the uids and gids in posix acl extended attributes in place.
- */
-diff --git a/fs/reiserfs/xattr_acl.c b/fs/reiserfs/xattr_acl.c
-index dbed42f..2737668 100644
---- a/fs/reiserfs/xattr_acl.c
-+++ b/fs/reiserfs/xattr_acl.c
-@@ -242,13 +242,9 @@ __reiserfs_set_acl(struct reiserfs_transaction_handle *th, struct inode *inode,
- case ACL_TYPE_ACCESS:
- name = XATTR_NAME_POSIX_ACL_ACCESS;
- if (acl) {
-- error = posix_acl_equiv_mode(acl, &inode->i_mode);
-- if (error < 0)
-+ error = posix_acl_update_mode(inode, &inode->i_mode, &acl);
-+ if (error)
- return error;
-- else {
-- if (error == 0)
-- acl = NULL;
-- }
- }
- break;
- case ACL_TYPE_DEFAULT:
-diff --git a/fs/xfs/xfs_acl.c b/fs/xfs/xfs_acl.c
-index b6e527b..8a0dec8 100644
---- a/fs/xfs/xfs_acl.c
-+++ b/fs/xfs/xfs_acl.c
-@@ -257,16 +257,11 @@ xfs_set_acl(struct inode *inode, struct posix_acl *acl, int type)
- return error;
-
- if (type == ACL_TYPE_ACCESS) {
-- umode_t mode = inode->i_mode;
-- error = posix_acl_equiv_mode(acl, &mode);
--
-- if (error <= 0) {
-- acl = NULL;
--
-- if (error < 0)
-- return error;
-- }
-+ umode_t mode;
-
-+ error = posix_acl_update_mode(inode, &mode, &acl);
-+ if (error)
-+ return error;
- error = xfs_set_mode(inode, mode);
- if (error)
- return error;
-diff --git a/include/drm/drmP.h b/include/drm/drmP.h
-index d377865..988903a 100644
---- a/include/drm/drmP.h
-+++ b/include/drm/drmP.h
-@@ -938,7 +938,8 @@ static inline int drm_debugfs_remove_files(const struct drm_info_list *files,
- #endif
-
- extern struct dma_buf *drm_gem_prime_export(struct drm_device *dev,
-- struct drm_gem_object *obj, int flags);
-+ struct drm_gem_object *obj,
-+ int flags);
- extern int drm_gem_prime_handle_to_fd(struct drm_device *dev,
- struct drm_file *file_priv, uint32_t handle, uint32_t flags,
- int *prime_fd);
-diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h
-index c26d463..fe99e6f 100644
---- a/include/linux/hugetlb.h
-+++ b/include/linux/hugetlb.h
-@@ -450,8 +450,8 @@ static inline pgoff_t basepage_index(struct page *page)
- return __basepage_index(page);
- }
-
--extern void dissolve_free_huge_pages(unsigned long start_pfn,
-- unsigned long end_pfn);
-+extern int dissolve_free_huge_pages(unsigned long start_pfn,
-+ unsigned long end_pfn);
- static inline bool hugepage_migration_supported(struct hstate *h)
- {
- #ifdef CONFIG_ARCH_ENABLE_HUGEPAGE_MIGRATION
-@@ -518,7 +518,7 @@ static inline pgoff_t basepage_index(struct page *page)
- {
- return page->index;
- }
--#define dissolve_free_huge_pages(s, e) do {} while (0)
-+#define dissolve_free_huge_pages(s, e) 0
- #define hugepage_migration_supported(h) false
-
- static inline spinlock_t *huge_pte_lockptr(struct hstate *h,
-diff --git a/include/linux/libnvdimm.h b/include/linux/libnvdimm.h
-index b519e13..bbfce62 100644
---- a/include/linux/libnvdimm.h
-+++ b/include/linux/libnvdimm.h
-@@ -129,6 +129,8 @@ static inline struct nd_blk_region_desc *to_blk_region_desc(
- }
-
- int nvdimm_bus_add_poison(struct nvdimm_bus *nvdimm_bus, u64 addr, u64 length);
-+void nvdimm_clear_from_poison_list(struct nvdimm_bus *nvdimm_bus,
-+ phys_addr_t start, unsigned int len);
- struct nvdimm_bus *nvdimm_bus_register(struct device *parent,
- struct nvdimm_bus_descriptor *nfit_desc);
- void nvdimm_bus_unregister(struct nvdimm_bus *nvdimm_bus);
-diff --git a/include/linux/posix_acl.h b/include/linux/posix_acl.h
-index d5d3d74..bf1046d 100644
---- a/include/linux/posix_acl.h
-+++ b/include/linux/posix_acl.h
-@@ -93,6 +93,7 @@ extern int set_posix_acl(struct inode *, int, struct posix_acl *);
- extern int posix_acl_chmod(struct inode *, umode_t);
- extern int posix_acl_create(struct inode *, umode_t *, struct posix_acl **,
- struct posix_acl **);
-+extern int posix_acl_update_mode(struct inode *, umode_t *, struct posix_acl **);
-
- extern int simple_set_acl(struct inode *, struct posix_acl *, int);
- extern int simple_acl_create(struct inode *, struct inode *);
-diff --git a/kernel/irq/generic-chip.c b/kernel/irq/generic-chip.c
-index abd286a..a4775f3 100644
---- a/kernel/irq/generic-chip.c
-+++ b/kernel/irq/generic-chip.c
-@@ -411,8 +411,29 @@ int irq_map_generic_chip(struct irq_domain *d, unsigned int virq,
- }
- EXPORT_SYMBOL_GPL(irq_map_generic_chip);
-
-+static void irq_unmap_generic_chip(struct irq_domain *d, unsigned int virq)
-+{
-+ struct irq_data *data = irq_domain_get_irq_data(d, virq);
-+ struct irq_domain_chip_generic *dgc = d->gc;
-+ unsigned int hw_irq = data->hwirq;
-+ struct irq_chip_generic *gc;
-+ int irq_idx;
-+
-+ gc = irq_get_domain_generic_chip(d, hw_irq);
-+ if (!gc)
-+ return;
-+
-+ irq_idx = hw_irq % dgc->irqs_per_chip;
-+
-+ clear_bit(irq_idx, &gc->installed);
-+ irq_domain_set_info(d, virq, hw_irq, &no_irq_chip, NULL, NULL, NULL,
-+ NULL);
-+
-+}
-+
- struct irq_domain_ops irq_generic_chip_ops = {
- .map = irq_map_generic_chip,
-+ .unmap = irq_unmap_generic_chip,
- .xlate = irq_domain_xlate_onetwocell,
- };
- EXPORT_SYMBOL_GPL(irq_generic_chip_ops);
-diff --git a/mm/hugetlb.c b/mm/hugetlb.c
-index 603bdd0..770d83e 100644
---- a/mm/hugetlb.c
-+++ b/mm/hugetlb.c
-@@ -1437,22 +1437,32 @@ static int free_pool_huge_page(struct hstate *h, nodemask_t *nodes_allowed,
-
- /*
- * Dissolve a given free hugepage into free buddy pages. This function does
-- * nothing for in-use (including surplus) hugepages.
-+ * nothing for in-use (including surplus) hugepages. Returns -EBUSY if the
-+ * number of free hugepages would be reduced below the number of reserved
-+ * hugepages.
- */
--static void dissolve_free_huge_page(struct page *page)
-+static int dissolve_free_huge_page(struct page *page)
- {
-+ int rc = 0;
-+
- spin_lock(&hugetlb_lock);
- if (PageHuge(page) && !page_count(page)) {
- struct page *head = compound_head(page);
- struct hstate *h = page_hstate(head);
- int nid = page_to_nid(head);
-+ if (h->free_huge_pages - h->resv_huge_pages == 0) {
-+ rc = -EBUSY;
-+ goto out;
-+ }
- list_del(&head->lru);
- h->free_huge_pages--;
- h->free_huge_pages_node[nid]--;
- h->max_huge_pages--;
- update_and_free_page(h, head);
- }
-+out:
- spin_unlock(&hugetlb_lock);
-+ return rc;
- }
-
- /*
-@@ -1460,16 +1470,28 @@ static void dissolve_free_huge_page(struct page *page)
- * make specified memory blocks removable from the system.
- * Note that this will dissolve a free gigantic hugepage completely, if any
- * part of it lies within the given range.
-+ * Also note that if dissolve_free_huge_page() returns with an error, all
-+ * free hugepages that were dissolved before that error are lost.
- */
--void dissolve_free_huge_pages(unsigned long start_pfn, unsigned long end_pfn)
-+int dissolve_free_huge_pages(unsigned long start_pfn, unsigned long end_pfn)
- {
- unsigned long pfn;
-+ struct page *page;
-+ int rc = 0;
-
- if (!hugepages_supported())
-- return;
-+ return rc;
-+
-+ for (pfn = start_pfn; pfn < end_pfn; pfn += 1 << minimum_order) {
-+ page = pfn_to_page(pfn);
-+ if (PageHuge(page) && !page_count(page)) {
-+ rc = dissolve_free_huge_page(page);
-+ if (rc)
-+ break;
-+ }
-+ }
-
-- for (pfn = start_pfn; pfn < end_pfn; pfn += 1 << minimum_order)
-- dissolve_free_huge_page(pfn_to_page(pfn));
-+ return rc;
- }
-
- /*
-diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
-index 9d29ba0..9629273 100644
---- a/mm/memory_hotplug.c
-+++ b/mm/memory_hotplug.c
-@@ -1945,7 +1945,9 @@ static int __ref __offline_pages(unsigned long start_pfn,
- * dissolve free hugepages in the memory block before doing offlining
- * actually in order to make hugetlbfs's object counting consistent.
- */
-- dissolve_free_huge_pages(start_pfn, end_pfn);
-+ ret = dissolve_free_huge_pages(start_pfn, end_pfn);
-+ if (ret)
-+ goto failed_removal;
- /* check again */
- offlined_pages = check_pages_isolated(start_pfn, end_pfn);
- if (offlined_pages < 0) {
-diff --git a/sound/soc/intel/boards/bxt_da7219_max98357a.c b/sound/soc/intel/boards/bxt_da7219_max98357a.c
-index 3774b11..49b65d4 100644
---- a/sound/soc/intel/boards/bxt_da7219_max98357a.c
-+++ b/sound/soc/intel/boards/bxt_da7219_max98357a.c
-@@ -255,7 +255,7 @@ static struct snd_soc_ops broxton_da7219_ops = {
- /* broxton digital audio interface glue - connects codec <--> CPU */
- static struct snd_soc_dai_link broxton_dais[] = {
- /* Front End DAI links */
-- [BXT_DPCM_AUDIO_PB]
-+ [BXT_DPCM_AUDIO_PB] =
- {
- .name = "Bxt Audio Port",
- .stream_name = "Audio",
-@@ -271,7 +271,7 @@ static struct snd_soc_dai_link broxton_dais[] = {
- .dpcm_playback = 1,
- .ops = &broxton_da7219_fe_ops,
- },
-- [BXT_DPCM_AUDIO_CP]
-+ [BXT_DPCM_AUDIO_CP] =
- {
- .name = "Bxt Audio Capture Port",
- .stream_name = "Audio Record",
-@@ -286,7 +286,7 @@ static struct snd_soc_dai_link broxton_dais[] = {
- .dpcm_capture = 1,
- .ops = &broxton_da7219_fe_ops,
- },
-- [BXT_DPCM_AUDIO_REF_CP]
-+ [BXT_DPCM_AUDIO_REF_CP] =
- {
- .name = "Bxt Audio Reference cap",
- .stream_name = "Refcap",
-@@ -300,7 +300,7 @@ static struct snd_soc_dai_link broxton_dais[] = {
- .nonatomic = 1,
- .dynamic = 1,
- },
-- [BXT_DPCM_AUDIO_HDMI1_PB]
-+ [BXT_DPCM_AUDIO_HDMI1_PB] =
- {
- .name = "Bxt HDMI Port1",
- .stream_name = "Hdmi1",
-@@ -313,7 +313,7 @@ static struct snd_soc_dai_link broxton_dais[] = {
- .nonatomic = 1,
- .dynamic = 1,
- },
-- [BXT_DPCM_AUDIO_HDMI2_PB]
-+ [BXT_DPCM_AUDIO_HDMI2_PB] =
- {
- .name = "Bxt HDMI Port2",
- .stream_name = "Hdmi2",
-@@ -326,7 +326,7 @@ static struct snd_soc_dai_link broxton_dais[] = {
- .nonatomic = 1,
- .dynamic = 1,
- },
-- [BXT_DPCM_AUDIO_HDMI3_PB]
-+ [BXT_DPCM_AUDIO_HDMI3_PB] =
- {
- .name = "Bxt HDMI Port3",
- .stream_name = "Hdmi3",
-diff --git a/sound/soc/intel/boards/bxt_rt298.c b/sound/soc/intel/boards/bxt_rt298.c
-index 253d7bf..d610bdca 100644
---- a/sound/soc/intel/boards/bxt_rt298.c
-+++ b/sound/soc/intel/boards/bxt_rt298.c
-@@ -271,7 +271,7 @@ static const struct snd_soc_ops broxton_rt286_fe_ops = {
- /* broxton digital audio interface glue - connects codec <--> CPU */
- static struct snd_soc_dai_link broxton_rt298_dais[] = {
- /* Front End DAI links */
-- [BXT_DPCM_AUDIO_PB]
-+ [BXT_DPCM_AUDIO_PB] =
- {
- .name = "Bxt Audio Port",
- .stream_name = "Audio",
-@@ -286,7 +286,7 @@ static struct snd_soc_dai_link broxton_rt298_dais[] = {
- .dpcm_playback = 1,
- .ops = &broxton_rt286_fe_ops,
- },
-- [BXT_DPCM_AUDIO_CP]
-+ [BXT_DPCM_AUDIO_CP] =
- {
- .name = "Bxt Audio Capture Port",
- .stream_name = "Audio Record",
-@@ -300,7 +300,7 @@ static struct snd_soc_dai_link broxton_rt298_dais[] = {
- .dpcm_capture = 1,
- .ops = &broxton_rt286_fe_ops,
- },
-- [BXT_DPCM_AUDIO_REF_CP]
-+ [BXT_DPCM_AUDIO_REF_CP] =
- {
- .name = "Bxt Audio Reference cap",
- .stream_name = "refcap",
-@@ -313,7 +313,7 @@ static struct snd_soc_dai_link broxton_rt298_dais[] = {
- .nonatomic = 1,
- .dynamic = 1,
- },
-- [BXT_DPCM_AUDIO_DMIC_CP]
-+ [BXT_DPCM_AUDIO_DMIC_CP] =
- {
- .name = "Bxt Audio DMIC cap",
- .stream_name = "dmiccap",
-@@ -327,7 +327,7 @@ static struct snd_soc_dai_link broxton_rt298_dais[] = {
- .dynamic = 1,
- .ops = &broxton_dmic_ops,
- },
-- [BXT_DPCM_AUDIO_HDMI1_PB]
-+ [BXT_DPCM_AUDIO_HDMI1_PB] =
- {
- .name = "Bxt HDMI Port1",
- .stream_name = "Hdmi1",
-@@ -340,7 +340,7 @@ static struct snd_soc_dai_link broxton_rt298_dais[] = {
- .nonatomic = 1,
- .dynamic = 1,
- },
-- [BXT_DPCM_AUDIO_HDMI2_PB]
-+ [BXT_DPCM_AUDIO_HDMI2_PB] =
- {
- .name = "Bxt HDMI Port2",
- .stream_name = "Hdmi2",
-@@ -353,7 +353,7 @@ static struct snd_soc_dai_link broxton_rt298_dais[] = {
- .nonatomic = 1,
- .dynamic = 1,
- },
-- [BXT_DPCM_AUDIO_HDMI3_PB]
-+ [BXT_DPCM_AUDIO_HDMI3_PB] =
- {
- .name = "Bxt HDMI Port3",
- .stream_name = "Hdmi3",
-diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c
-index d908ff8..801082f 100644
---- a/sound/soc/soc-dapm.c
-+++ b/sound/soc/soc-dapm.c
-@@ -823,6 +823,7 @@ static int dapm_create_or_share_kcontrol(struct snd_soc_dapm_widget *w,
- case snd_soc_dapm_switch:
- case snd_soc_dapm_mixer:
- case snd_soc_dapm_pga:
-+ case snd_soc_dapm_out_drv:
- wname_in_long_name = true;
- kcname_in_long_name = true;
- break;
-@@ -3049,6 +3050,9 @@ int snd_soc_dapm_get_volsw(struct snd_kcontrol *kcontrol,
- }
- mutex_unlock(&card->dapm_mutex);
-
-+ if (ret)
-+ return ret;
-+
- if (invert)
- ucontrol->value.integer.value[0] = max - val;
- else
-@@ -3200,7 +3204,7 @@ int snd_soc_dapm_put_enum_double(struct snd_kcontrol *kcontrol,
- if (e->shift_l != e->shift_r) {
- if (item[1] > e->items)
- return -EINVAL;
-- val |= snd_soc_enum_item_to_val(e, item[1]) << e->shift_l;
-+ val |= snd_soc_enum_item_to_val(e, item[1]) << e->shift_r;
- mask |= e->mask << e->shift_r;
- }
-
-diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c
-index ee7f15a..3406907 100644
---- a/sound/soc/soc-topology.c
-+++ b/sound/soc/soc-topology.c
-@@ -1475,6 +1475,7 @@ static int soc_tplg_dapm_widget_create(struct soc_tplg *tplg,
- if (widget == NULL) {
- dev_err(tplg->dev, "ASoC: failed to create widget %s controls\n",
- w->name);
-+ ret = -ENOMEM;
- goto hdr_err;
- }
-
-diff --git a/tools/perf/perf-sys.h b/tools/perf/perf-sys.h
-index 7ed72a4..e4b717e 100644
---- a/tools/perf/perf-sys.h
-+++ b/tools/perf/perf-sys.h
-@@ -20,7 +20,6 @@
- #endif
-
- #ifdef __powerpc__
--#include "../../arch/powerpc/include/uapi/asm/unistd.h"
- #define CPUINFO_PROC {"cpu"}
- #endif
-
-diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c
-index 13d4143..7aee954 100644
---- a/tools/perf/ui/browsers/hists.c
-+++ b/tools/perf/ui/browsers/hists.c
-@@ -1091,7 +1091,6 @@ static int __hpp__slsmg_color_printf(struct perf_hpp *hpp, const char *fmt, ...)
- ret = scnprintf(hpp->buf, hpp->size, fmt, len, percent);
- ui_browser__printf(arg->b, "%s", hpp->buf);
-
-- advance_hpp(hpp, ret);
- return ret;
- }
-
-@@ -2046,6 +2045,7 @@ void hist_browser__init(struct hist_browser *browser,
- struct hists *hists)
- {
- struct perf_hpp_fmt *fmt;
-+ struct perf_hpp_list_node *node;
-
- browser->hists = hists;
- browser->b.refresh = hist_browser__refresh;
-@@ -2058,6 +2058,11 @@ void hist_browser__init(struct hist_browser *browser,
- perf_hpp__reset_width(fmt, hists);
- ++browser->b.columns;
- }
-+ /* hierarchy entries have their own hpp list */
-+ list_for_each_entry(node, &hists->hpp_formats, list) {
-+ perf_hpp_list__for_each_format(&node->hpp, fmt)
-+ perf_hpp__reset_width(fmt, hists);
-+ }
- }
-
- struct hist_browser *hist_browser__new(struct hists *hists)
-diff --git a/tools/perf/ui/stdio/hist.c b/tools/perf/ui/stdio/hist.c
-index f04a631..d0cae75 100644
---- a/tools/perf/ui/stdio/hist.c
-+++ b/tools/perf/ui/stdio/hist.c
-@@ -628,14 +628,6 @@ hists__fprintf_hierarchy_headers(struct hists *hists,
- struct perf_hpp *hpp,
- FILE *fp)
- {
-- struct perf_hpp_list_node *fmt_node;
-- struct perf_hpp_fmt *fmt;
--
-- list_for_each_entry(fmt_node, &hists->hpp_formats, list) {
-- perf_hpp_list__for_each_format(&fmt_node->hpp, fmt)
-- perf_hpp__reset_width(fmt, hists);
-- }
--
- return print_hierarchy_header(hists, hpp, symbol_conf.field_sep, fp);
- }
-
-@@ -714,6 +706,7 @@ size_t hists__fprintf(struct hists *hists, bool show_header, int max_rows,
- bool use_callchain)
- {
- struct perf_hpp_fmt *fmt;
-+ struct perf_hpp_list_node *node;
- struct rb_node *nd;
- size_t ret = 0;
- const char *sep = symbol_conf.field_sep;
-@@ -726,6 +719,11 @@ size_t hists__fprintf(struct hists *hists, bool show_header, int max_rows,
-
- hists__for_each_format(hists, fmt)
- perf_hpp__reset_width(fmt, hists);
-+ /* hierarchy entries have their own hpp list */
-+ list_for_each_entry(node, &hists->hpp_formats, list) {
-+ perf_hpp_list__for_each_format(&node->hpp, fmt)
-+ perf_hpp__reset_width(fmt, hists);
-+ }
-
- if (symbol_conf.col_width_list_str)
- perf_hpp__set_user_width(symbol_conf.col_width_list_str);
-diff --git a/tools/perf/util/data-convert-bt.c b/tools/perf/util/data-convert-bt.c
-index 4f979bb..7123f4d 100644
---- a/tools/perf/util/data-convert-bt.c
-+++ b/tools/perf/util/data-convert-bt.c
-@@ -437,7 +437,7 @@ add_bpf_output_values(struct bt_ctf_event_class *event_class,
- int ret;
-
- if (nr_elements * sizeof(u32) != raw_size)
-- pr_warning("Incorrect raw_size (%u) in bpf output event, skip %lu bytes\n",
-+ pr_warning("Incorrect raw_size (%u) in bpf output event, skip %zu bytes\n",
- raw_size, nr_elements * sizeof(u32) - raw_size);
-
- len_type = bt_ctf_event_class_get_field_by_name(event_class, "raw_len");
-diff --git a/tools/perf/util/symbol-elf.c b/tools/perf/util/symbol-elf.c
-index a811c13..f77b316 100644
---- a/tools/perf/util/symbol-elf.c
-+++ b/tools/perf/util/symbol-elf.c
-@@ -1113,9 +1113,8 @@ int dso__load_sym(struct dso *dso, struct map *map,
- * For misannotated, zeroed, ASM function sizes.
- */
- if (nr > 0) {
-- if (!symbol_conf.allow_aliases)
-- symbols__fixup_duplicate(&dso->symbols[map->type]);
- symbols__fixup_end(&dso->symbols[map->type]);
-+ symbols__fixup_duplicate(&dso->symbols[map->type]);
- if (kmap) {
- /*
- * We need to fixup this here too because we create new
-diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c
-index 37e8d20..f29f336 100644
---- a/tools/perf/util/symbol.c
-+++ b/tools/perf/util/symbol.c
-@@ -152,6 +152,9 @@ void symbols__fixup_duplicate(struct rb_root *symbols)
- struct rb_node *nd;
- struct symbol *curr, *next;
-
-+ if (symbol_conf.allow_aliases)
-+ return;
-+
- nd = rb_first(symbols);
-
- while (nd) {
-@@ -1234,8 +1237,8 @@ int __dso__load_kallsyms(struct dso *dso, const char *filename,
- if (kallsyms__delta(map, filename, &delta))
- return -1;
-
-- symbols__fixup_duplicate(&dso->symbols[map->type]);
- symbols__fixup_end(&dso->symbols[map->type]);
-+ symbols__fixup_duplicate(&dso->symbols[map->type]);
-
- if (dso->kernel == DSO_TYPE_GUEST_KERNEL)
- dso->symtab_type = DSO_BINARY_TYPE__GUEST_KALLSYMS;