Merge tag 'fbdev-v5.1' of git://github.com/bzolnier/linux
authorLinus Torvalds <torvalds@linux-foundation.org>
Fri, 15 Mar 2019 21:22:59 +0000 (14:22 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 15 Mar 2019 21:22:59 +0000 (14:22 -0700)
Pull fbdev updates from Bartlomiej Zolnierkiewicz:
 "Just a couple of small fixes and cleanups:

   - fix memory access if logo is bigger than the screen (Manfred
     Schlaegl)

   - silence fbcon logo on 'quiet' boots (Prarit Bhargava)

   - use kvmalloc() for scrollback buffer in fbcon (Konstantin Khorenko)

   - misc fixes (Colin Ian King, YueHaibing, Matteo Croce, Mathieu
     Malaterre, Anders Roxell, Arnd Bergmann)

   - misc cleanups (Rob Herring, Lubomir Rintel, Greg Kroah-Hartman,
     Jani Nikula, Michal Vokáč)"

* tag 'fbdev-v5.1' of git://github.com/bzolnier/linux:
  fbdev: mbx: fix a misspelled variable name
  fbdev: omap2: fix warnings in dss core
  video: fbdev: Fix potential NULL pointer dereference
  fbcon: Silence fbcon logo on 'quiet' boots
  printk: Export console_printk
  ARM: dts: imx28-cfa10036: Fix the reset gpio signal polarity
  video: ssd1307fb: Do not hard code active-low reset sequence
  dt-bindings: display: ssd1307fb: Remove reset-active-low from examples
  fbdev: fbmem: fix memory access if logo is bigger than the screen
  video/fbdev: refactor video= cmdline parsing
  fbdev: mbx: fix up debugfs file creation
  fbdev: omap2: no need to check return value of debugfs_create functions
  video: fbdev: geode: remove ifdef OLPC noise
  video: offb: annotate implicit fall throughs
  omapfb: fix typo
  fbdev: Use of_node_name_eq for node name comparisons
  fbcon: use kvmalloc() for scrollback buffer
  fbdev: chipsfb: remove set but not used variable 'size'
  fbdev/via: fix spelling mistake "Expandsion" -> "Expansion"

1  2 
drivers/video/fbdev/imsttfb.c
kernel/printk/printk.c

index 5d9670daf60ec18fee03e8c896d1f92617606048,b268570b019d7e6b2b7ce81d6106f489b3f01212..4b9615e4ce746242015010cdf7b0d956c0fde6f5
@@@ -30,8 -30,9 +30,8 @@@
  #include <asm/io.h>
  #include <linux/uaccess.h>
  
 -#if defined(CONFIG_PPC)
 +#if defined(CONFIG_PPC_PMAC)
  #include <linux/nvram.h>
 -#include <asm/prom.h>
  #include "macmodes.h"
  #endif
  
@@@ -326,13 -327,14 +326,13 @@@ enum 
        TVP = 1
  };
  
 -#define USE_NV_MODES          1
  #define INIT_BPP              8
  #define INIT_XRES             640
  #define INIT_YRES             480
  
  static int inverse = 0;
  static char fontname[40] __initdata = { 0 };
 -#if defined(CONFIG_PPC)
 +#if defined(CONFIG_PPC_PMAC)
  static signed char init_vmode = -1, init_cmode = -1;
  #endif
  
@@@ -1388,8 -1390,8 +1388,8 @@@ static void init_imstt(struct fb_info *
                }
        }
  
 -#if USE_NV_MODES && defined(CONFIG_PPC32)
 -      {
 +#if defined(CONFIG_PPC_PMAC) && defined(CONFIG_PPC32)
 +      if (IS_REACHABLE(CONFIG_NVRAM) && machine_is(powermac)) {
                int vmode = init_vmode, cmode = init_cmode;
  
                if (vmode == -1) {
                        info->var.yres = info->var.yres_virtual = INIT_YRES;
                        info->var.bits_per_pixel = INIT_BPP;
                }
 -      }
 -#else
 -      info->var.xres = info->var.xres_virtual = INIT_XRES;
 -      info->var.yres = info->var.yres_virtual = INIT_YRES;
 -      info->var.bits_per_pixel = INIT_BPP;
 +      } else
  #endif
 +      {
 +              info->var.xres = info->var.xres_virtual = INIT_XRES;
 +              info->var.yres = info->var.yres_virtual = INIT_YRES;
 +              info->var.bits_per_pixel = INIT_BPP;
 +      }
  
        if ((info->var.xres * info->var.yres) * (info->var.bits_per_pixel >> 3) > info->fix.smem_len
            || !(compute_imstt_regvals(par, info->var.xres, info->var.yres))) {
@@@ -1497,8 -1498,8 +1497,8 @@@ static int imsttfb_probe(struct pci_de
        switch (pdev->device) {
                case PCI_DEVICE_ID_IMS_TT128: /* IMS,tt128mbA */
                        par->ramdac = IBM;
-                       if (dp && ((strcmp(dp->name, "IMS,tt128mb8") == 0) ||
-                                  (strcmp(dp->name, "IMS,tt128mb8A") == 0)))
+                       if (of_node_name_eq(dp, "IMS,tt128mb8") ||
+                           of_node_name_eq(dp, "IMS,tt128mb8A"))
                                par->ramdac = TVP;
                        break;
                case PCI_DEVICE_ID_IMS_TT3D:  /* IMS,tt3d */
@@@ -1564,7 -1565,7 +1564,7 @@@ imsttfb_setup(char *options
                        inverse = 1;
                        fb_invert_cmaps();
                }
 -#if defined(CONFIG_PPC)
 +#if defined(CONFIG_PPC_PMAC)
                else if (!strncmp(this_opt, "vmode:", 6)) {
                        int vmode = simple_strtoul(this_opt+6, NULL, 0);
                        if (vmode > 0 && vmode <= VMODE_MAX)
diff --combined kernel/printk/printk.c
index 6b7654b8001fc4d07dc8bcd4a00eddee31e09891,8201019d1fff6d227a93171a29ed0f0b97be95fe..02ca827b8fac7f110535ba5d6aca8f1c87306def
@@@ -65,6 -65,7 +65,7 @@@ int console_printk[4] = 
        CONSOLE_LOGLEVEL_MIN,           /* minimum_console_loglevel */
        CONSOLE_LOGLEVEL_DEFAULT,       /* default_console_loglevel */
  };
+ EXPORT_SYMBOL_GPL(console_printk);
  
  atomic_t ignore_console_lock_warning __read_mostly = ATOMIC_INIT(0);
  EXPORT_SYMBOL(ignore_console_lock_warning);
@@@ -344,6 -345,7 +345,6 @@@ static int console_msg_format = MSG_FOR
  
  enum log_flags {
        LOG_NEWLINE     = 2,    /* text ended with a newline */
 -      LOG_PREFIX      = 4,    /* text started with a prefix */
        LOG_CONT        = 8,    /* text is a fragment of a continuation line */
  };
  
@@@ -355,9 -357,6 +356,9 @@@ struct printk_log 
        u8 facility;            /* syslog facility */
        u8 flags:5;             /* internal record flags */
        u8 level:3;             /* syslog level */
 +#ifdef CONFIG_PRINTK_CALLER
 +      u32 caller_id;            /* thread id or processor id */
 +#endif
  }
  #ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
  __packed __aligned(4)
@@@ -424,11 -423,7 +425,11 @@@ static u64 exclusive_console_stop_seq
  static u64 clear_seq;
  static u32 clear_idx;
  
 +#ifdef CONFIG_PRINTK_CALLER
 +#define PREFIX_MAX            48
 +#else
  #define PREFIX_MAX            32
 +#endif
  #define LOG_LINE_MAX          (1024 - PREFIX_MAX)
  
  #define LOG_LEVEL(v)          ((v) & 0x07)
@@@ -583,7 -578,7 +584,7 @@@ static u32 truncate_msg(u16 *text_len, 
  }
  
  /* insert record into the buffer, discard old ones, update heads */
 -static int log_store(int facility, int level,
 +static int log_store(u32 caller_id, int facility, int level,
                     enum log_flags flags, u64 ts_nsec,
                     const char *dict, u16 dict_len,
                     const char *text, u16 text_len)
                msg->ts_nsec = ts_nsec;
        else
                msg->ts_nsec = local_clock();
 +#ifdef CONFIG_PRINTK_CALLER
 +      msg->caller_id = caller_id;
 +#endif
        memset(log_dict(msg) + dict_len, 0, pad_len);
        msg->len = size;
  
@@@ -697,21 -689,12 +698,21 @@@ static ssize_t msg_print_ext_header(cha
                                    struct printk_log *msg, u64 seq)
  {
        u64 ts_usec = msg->ts_nsec;
 +      char caller[20];
 +#ifdef CONFIG_PRINTK_CALLER
 +      u32 id = msg->caller_id;
 +
 +      snprintf(caller, sizeof(caller), ",caller=%c%u",
 +               id & 0x80000000 ? 'C' : 'T', id & ~0x80000000);
 +#else
 +      caller[0] = '\0';
 +#endif
  
        do_div(ts_usec, 1000);
  
 -      return scnprintf(buf, size, "%u,%llu,%llu,%c;",
 -                     (msg->facility << 3) | msg->level, seq, ts_usec,
 -                     msg->flags & LOG_CONT ? 'c' : '-');
 +      return scnprintf(buf, size, "%u,%llu,%llu,%c%s;",
 +                       (msg->facility << 3) | msg->level, seq, ts_usec,
 +                       msg->flags & LOG_CONT ? 'c' : '-', caller);
  }
  
  static ssize_t msg_print_ext_body(char *buf, size_t size,
@@@ -1056,9 -1039,6 +1057,9 @@@ void log_buf_vmcoreinfo_setup(void
        VMCOREINFO_OFFSET(printk_log, len);
        VMCOREINFO_OFFSET(printk_log, text_len);
        VMCOREINFO_OFFSET(printk_log, dict_len);
 +#ifdef CONFIG_PRINTK_CALLER
 +      VMCOREINFO_OFFSET(printk_log, caller_id);
 +#endif
  }
  #endif
  
@@@ -1143,7 -1123,14 +1144,7 @@@ void __init setup_log_buf(int early
        if (!new_log_buf_len)
                return;
  
 -      if (early) {
 -              new_log_buf =
 -                      memblock_alloc(new_log_buf_len, LOG_ALIGN);
 -      } else {
 -              new_log_buf = memblock_alloc_nopanic(new_log_buf_len,
 -                                                        LOG_ALIGN);
 -      }
 -
 +      new_log_buf = memblock_alloc(new_log_buf_len, LOG_ALIGN);
        if (unlikely(!new_log_buf)) {
                pr_err("log_buf_len: %lu bytes not available\n",
                        new_log_buf_len);
@@@ -1250,23 -1237,10 +1251,23 @@@ static size_t print_time(u64 ts, char *
  {
        unsigned long rem_nsec = do_div(ts, 1000000000);
  
 -      return sprintf(buf, "[%5lu.%06lu] ",
 +      return sprintf(buf, "[%5lu.%06lu]",
                       (unsigned long)ts, rem_nsec / 1000);
  }
  
 +#ifdef CONFIG_PRINTK_CALLER
 +static size_t print_caller(u32 id, char *buf)
 +{
 +      char caller[12];
 +
 +      snprintf(caller, sizeof(caller), "%c%u",
 +               id & 0x80000000 ? 'C' : 'T', id & ~0x80000000);
 +      return sprintf(buf, "[%6s]", caller);
 +}
 +#else
 +#define print_caller(id, buf) 0
 +#endif
 +
  static size_t print_prefix(const struct printk_log *msg, bool syslog,
                           bool time, char *buf)
  {
  
        if (syslog)
                len = print_syslog((msg->facility << 3) | msg->level, buf);
 +
        if (time)
                len += print_time(msg->ts_nsec, buf + len);
 +
 +      len += print_caller(msg->caller_id, buf + len);
 +
 +      if (IS_ENABLED(CONFIG_PRINTK_CALLER) || time) {
 +              buf[len++] = ' ';
 +              buf[len] = '\0';
 +      }
 +
        return len;
  }
  
@@@ -1788,12 -1753,6 +1789,12 @@@ static inline void printk_delay(void
        }
  }
  
 +static inline u32 printk_caller_id(void)
 +{
 +      return in_task() ? task_pid_nr(current) :
 +              0x80000000 + raw_smp_processor_id();
 +}
 +
  /*
   * Continuation lines are buffered, and not committed to the record buffer
   * until the line is complete, or a race forces it. The line fragments
  static struct cont {
        char buf[LOG_LINE_MAX];
        size_t len;                     /* length == 0 means unused buffer */
 -      struct task_struct *owner;      /* task of first print*/
 +      u32 caller_id;                  /* printk_caller_id() of first print */
        u64 ts_nsec;                    /* time of first print */
        u8 level;                       /* log level of first message */
        u8 facility;                    /* log facility of first message */
@@@ -1815,13 -1774,12 +1816,13 @@@ static void cont_flush(void
        if (cont.len == 0)
                return;
  
 -      log_store(cont.facility, cont.level, cont.flags, cont.ts_nsec,
 -                NULL, 0, cont.buf, cont.len);
 +      log_store(cont.caller_id, cont.facility, cont.level, cont.flags,
 +                cont.ts_nsec, NULL, 0, cont.buf, cont.len);
        cont.len = 0;
  }
  
 -static bool cont_add(int facility, int level, enum log_flags flags, const char *text, size_t len)
 +static bool cont_add(u32 caller_id, int facility, int level,
 +                   enum log_flags flags, const char *text, size_t len)
  {
        /* If the line gets too long, split it up in separate records. */
        if (cont.len + len > sizeof(cont.buf)) {
        if (!cont.len) {
                cont.facility = facility;
                cont.level = level;
 -              cont.owner = current;
 +              cont.caller_id = caller_id;
                cont.ts_nsec = local_clock();
                cont.flags = flags;
        }
  
  static size_t log_output(int facility, int level, enum log_flags lflags, const char *dict, size_t dictlen, char *text, size_t text_len)
  {
 +      const u32 caller_id = printk_caller_id();
 +
        /*
         * If an earlier line was buffered, and we're a continuation
 -       * write from the same process, try to add it to the buffer.
 +       * write from the same context, try to add it to the buffer.
         */
        if (cont.len) {
 -              if (cont.owner == current && (lflags & LOG_CONT)) {
 -                      if (cont_add(facility, level, lflags, text, text_len))
 +              if (cont.caller_id == caller_id && (lflags & LOG_CONT)) {
 +                      if (cont_add(caller_id, facility, level, lflags, text, text_len))
                                return text_len;
                }
                /* Otherwise, make sure it's flushed */
  
        /* If it doesn't end in a newline, try to buffer the current line */
        if (!(lflags & LOG_NEWLINE)) {
 -              if (cont_add(facility, level, lflags, text, text_len))
 +              if (cont_add(caller_id, facility, level, lflags, text, text_len))
                        return text_len;
        }
  
        /* Store it in the record log */
 -      return log_store(facility, level, lflags, 0, dict, dictlen, text, text_len);
 +      return log_store(caller_id, facility, level, lflags, 0,
 +                       dict, dictlen, text, text_len);
  }
  
  /* Must be called under logbuf_lock. */
@@@ -1913,6 -1868,9 +1914,6 @@@ int vprintk_store(int facility, int lev
                        case '0' ... '7':
                                if (level == LOGLEVEL_DEFAULT)
                                        level = kern_level - '0';
 -                              /* fallthrough */
 -                      case 'd':       /* KERN_DEFAULT */
 -                              lflags |= LOG_PREFIX;
                                break;
                        case 'c':       /* KERN_CONT */
                                lflags |= LOG_CONT;
                level = default_message_loglevel;
  
        if (dict)
 -              lflags |= LOG_PREFIX|LOG_NEWLINE;
 +              lflags |= LOG_NEWLINE;
  
        return log_output(facility, level, lflags,
                          dict, dictlen, text, text_len);