Merge tag ‘pm-5.0’ of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm [Linux 5.0]

This Linux kernel change "Merge tag ‘pm-5.0’ of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm" is included in the Linux 5.0 release. This change is authored by Linus Torvalds <torvalds [at] linux-foundation.org> on Fri Feb 22 17:46:30 2019 -0800. The commit for this change in Linux stable tree is ef4edb3 (patch). Other info about this change: Merge: 9053d2d 5b317cb

Merge tag 'pm-5.0' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm

Pull power management fixes from Rafael Wysocki:
 "These fix a regression in the PM-runtime framework introduced by the
  recent switch-over of it to using hrtimers and a use-after-free
  introduced by one of the recent changes in the scmi-cpufreq driver.

  Specifics:

   - Use hrtimer_try_to_cancel() instead of hrtimer_cancel() in the
     PM-runtime framework to avoid a possible timer-related deadlock
     introduced recently (Vincent Guittot).

   - Reorder the scmi-cpufreq driver code to avoid accessing memory that
     has just been freed (Yangtao Li)"

* tag 'pm-5.0' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
  PM-runtime: Fix deadlock when canceling hrtimer
  cpufreq: scmi: Fix use-after-free in scmi_cpufreq_exit()

There is no are 0 lines of Linux source code added/deleted in this change. Code changes to Linux kernel are as follows.

 arch/arc/include/asm/arcregs.h |  8 ++++++++
 arch/arc/kernel/setup.c        | 26 +++++++++++++++++++++-----
 2 files changed, 29 insertions(+), 5 deletions(-)

diff --git a/arch/arc/include/asm/arcregs.h b/arch/arc/include/asm/arcregs.h
index f1b86ce..a27eafd 100644
--- a/arch/arc/include/asm/arcregs.h
+++ b/arch/arc/include/asm/arcregs.h
@@ -151,6 +151,14 @@ struct bcr_isa_arcv2 {
 #endif
 };

+struct bcr_uarch_build_arcv2 {
+#ifdef CONFIG_CPU_BIG_ENDIAN
+   unsigned int pad:8, prod:8, maj:8, min:8;
+#else
+   unsigned int min:8, maj:8, prod:8, pad:8;
+#endif
+};
+
 struct bcr_mpy {
 #ifdef CONFIG_CPU_BIG_ENDIAN
    unsigned int pad:8, x1616:8, dsp:4, cycles:2, type:2, ver:8;
diff --git a/arch/arc/kernel/setup.c b/arch/arc/kernel/setup.c
index 93d4d66..7b23409 100644
--- a/arch/arc/kernel/setup.c
+++ b/arch/arc/kernel/setup.c
@@ -199,13 +199,29 @@ static void read_arc_build_cfg_regs(void)
        cpu->bpu.ret_stk = 4 << bpu.rse;

        if (cpu->core.family >= 0x54) {
-           unsigned int exec_ctrl;

-           READ_BCR(AUX_EXEC_CTRL, exec_ctrl);
-           cpu->extn.dual_enb = !(exec_ctrl & 1);
+           struct bcr_uarch_build_arcv2 uarch;

-           /* dual issue always present for this core */
-           cpu->extn.dual = 1;
+           /*
+            * The first 0x54 core (uarch maj:min 0:1 or 0:2) was
+            * dual issue only (HS4x). But next uarch rev (1:0)
+            * allows it be configured for single issue (HS3x)
+            * Ensure we fiddle with dual issue only on HS4x
+            */
+           READ_BCR(ARC_REG_MICRO_ARCH_BCR, uarch);
+
+           if (uarch.prod == 4) {
+               unsigned int exec_ctrl;
+
+               /* dual issue hardware always present */
+               cpu->extn.dual = 1;
+
+               READ_BCR(AUX_EXEC_CTRL, exec_ctrl);
+
+               /* dual issue hardware enabled ? */
+               cpu->extn.dual_enb = !(exec_ctrl & 1);
+
+           }
        }
    }

Leave a Reply

Your email address will not be published. Required fields are marked *