Ignore:
Timestamp:
03/06/20 11:28:58 (5 years ago)
Author:
Edwin Eefting <edwin@datux.nl>
Branches:
master
Children:
e856512
Parents:
f6630dd
Message:

upgrade to linux kernel 4.14.172

File:
1 edited

Legend:

Unmodified
Added
Removed
  • npl/kernel/linux_src/4200_fbcondecor.patch

    rf6630dd refa4154  
    11diff --git a/Documentation/fb/00-INDEX b/Documentation/fb/00-INDEX
    2 index fe85e7c..2230930 100644
     2index fe85e7c5907a..22309308ba56 100644
    33--- a/Documentation/fb/00-INDEX
    44+++ b/Documentation/fb/00-INDEX
     
    1414diff --git a/Documentation/fb/fbcondecor.txt b/Documentation/fb/fbcondecor.txt
    1515new file mode 100644
    16 index 0000000..637209e
     16index 000000000000..637209e11ccd
    1717--- /dev/null
    1818+++ b/Documentation/fb/fbcondecor.txt
     
    226226+
    227227diff --git a/drivers/Makefile b/drivers/Makefile
    228 index 53abb4a..1721aee 100644
     228index 1d034b680431..9f41f2ea0c8b 100644
    229229--- a/drivers/Makefile
    230230+++ b/drivers/Makefile
    231 @@ -17,6 +17,10 @@ obj-y                                += pwm/
    232  obj-$(CONFIG_PCI)              += pci/
     231@@ -23,6 +23,10 @@ obj-y                                += pci/dwc/
     232 
    233233 obj-$(CONFIG_PARISC)           += parisc/
    234234 obj-$(CONFIG_RAPIDIO)          += rapidio/
     
    240240 obj-y                          += idle/
    241241 
    242 @@ -45,11 +49,6 @@ obj-$(CONFIG_REGULATOR)              += regulator/
     242@@ -53,11 +57,6 @@ obj-$(CONFIG_REGULATOR)              += regulator/
    243243 # reset controllers early, since gpu drivers might rely on them to initialize
    244244 obj-$(CONFIG_RESET_CONTROLLER) += reset/
     
    253253 
    254254diff --git a/drivers/video/console/Kconfig b/drivers/video/console/Kconfig
    255 index 38da6e2..fe58152 100644
     255index 7f1f1fbcef9e..8439b618dfc0 100644
    256256--- a/drivers/video/console/Kconfig
    257257+++ b/drivers/video/console/Kconfig
    258 @@ -130,6 +130,19 @@ config FRAMEBUFFER_CONSOLE_ROTATION
     258@@ -151,6 +151,19 @@ config FRAMEBUFFER_CONSOLE_ROTATION
    259259          such that other users of the framebuffer will remain normally
    260260          oriented.
     
    277277         depends on PARISC
    278278diff --git a/drivers/video/console/Makefile b/drivers/video/console/Makefile
    279 index 43bfa48..cc104b6 100644
     279index db07b784bd2c..3e369bd120b8 100644
    280280--- a/drivers/video/console/Makefile
    281281+++ b/drivers/video/console/Makefile
    282 @@ -16,4 +16,5 @@ obj-$(CONFIG_FRAMEBUFFER_CONSOLE)     += fbcon_rotate.o fbcon_cw.o fbcon_ud.o \
    283                                           fbcon_ccw.o
    284  endif
     282@@ -9,4 +9,5 @@ obj-$(CONFIG_STI_CONSOLE)         += sticon.o sticore.o
     283 obj-$(CONFIG_VGA_CONSOLE)         += vgacon.o
     284 obj-$(CONFIG_MDA_CONSOLE)         += mdacon.o
    285285 
    286286+obj-$(CONFIG_FB_CON_DECOR)               += fbcondecor.o cfbcondecor.o
    287287 obj-$(CONFIG_FB_STI)              += sticore.o
    288 diff --git a/drivers/video/console/bitblit.c b/drivers/video/console/bitblit.c
    289 index dbfe4ee..14da307 100644
    290 --- a/drivers/video/console/bitblit.c
    291 +++ b/drivers/video/console/bitblit.c
    292 @@ -18,6 +18,7 @@
    293  #include <linux/console.h>
    294  #include <asm/types.h>
    295  #include "fbcon.h"
    296 +#include "fbcondecor.h"
    297  
    298  /*
    299   * Accelerated handlers.
    300 @@ -55,6 +56,13 @@ static void bit_bmove(struct vc_data *vc, struct fb_info *info, int sy,
    301         area.height = height * vc->vc_font.height;
    302         area.width = width * vc->vc_font.width;
    303  
    304 +       if (fbcon_decor_active(info, vc)) {
    305 +               area.sx += vc->vc_decor.tx;
    306 +               area.sy += vc->vc_decor.ty;
    307 +               area.dx += vc->vc_decor.tx;
    308 +               area.dy += vc->vc_decor.ty;
    309 +       }
    310 +
    311         info->fbops->fb_copyarea(info, &area);
    312  }
    313  
    314 @@ -379,11 +387,15 @@ static void bit_cursor(struct vc_data *vc, struct fb_info *info, int mode,
    315         cursor.image.depth = 1;
    316         cursor.rop = ROP_XOR;
    317  
    318 -       if (info->fbops->fb_cursor)
    319 -               err = info->fbops->fb_cursor(info, &cursor);
    320 +       if (fbcon_decor_active(info, vc)) {
    321 +               fbcon_decor_cursor(info, &cursor);
    322 +       } else {
    323 +               if (info->fbops->fb_cursor)
    324 +                       err = info->fbops->fb_cursor(info, &cursor);
    325  
    326 -       if (err)
    327 -               soft_cursor(info, &cursor);
    328 +               if (err)
    329 +                       soft_cursor(info, &cursor);
    330 +       }
    331  
    332         ops->cursor_reset = 0;
    333  }
    334288diff --git a/drivers/video/console/cfbcondecor.c b/drivers/video/console/cfbcondecor.c
    335289new file mode 100644
    336 index 0000000..c262540
     290index 000000000000..b00960803edc
    337291--- /dev/null
    338292+++ b/drivers/video/console/cfbcondecor.c
     
    362316+#include <asm/irq.h>
    363317+
    364 +#include "fbcon.h"
     318+#include "../fbdev/core/fbcon.h"
    365319+#include "fbcondecor.h"
    366320+
     
    811765+}
    812766+
    813 diff --git a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c
    814 index b87f5cf..ce44538 100644
    815 --- a/drivers/video/console/fbcon.c
    816 +++ b/drivers/video/console/fbcon.c
    817 @@ -79,6 +79,7 @@
    818  #include <asm/irq.h>
    819  
    820  #include "fbcon.h"
    821 +#include "../console/fbcondecor.h"
    822  
    823  #ifdef FBCONDEBUG
    824  #  define DPRINTK(fmt, args...) printk(KERN_DEBUG "%s: " fmt, __func__ , ## args)
    825 @@ -94,7 +95,7 @@ enum {
    826  
    827  static struct display fb_display[MAX_NR_CONSOLES];
    828  
    829 -static signed char con2fb_map[MAX_NR_CONSOLES];
    830 +signed char con2fb_map[MAX_NR_CONSOLES];
    831  static signed char con2fb_map_boot[MAX_NR_CONSOLES];
    832  
    833  static int logo_lines;
    834 @@ -282,7 +283,7 @@ static inline int fbcon_is_inactive(struct vc_data *vc, struct fb_info *info)
    835                 !vt_force_oops_output(vc);
    836  }
    837  
    838 -static int get_color(struct vc_data *vc, struct fb_info *info,
    839 +int get_color(struct vc_data *vc, struct fb_info *info,
    840               u16 c, int is_fg)
    841  {
    842         int depth = fb_get_color_depth(&info->var, &info->fix);
    843 @@ -546,6 +547,9 @@ static int do_fbcon_takeover(int show_logo)
    844                 info_idx = -1;
    845         } else {
    846                 fbcon_has_console_bind = 1;
    847 +#ifdef CONFIG_FB_CON_DECOR
    848 +               fbcon_decor_init();
    849 +#endif
    850         }
    851  
    852         return err;
    853 @@ -1005,6 +1009,12 @@ static const char *fbcon_startup(void)
    854         rows = FBCON_SWAP(ops->rotate, info->var.yres, info->var.xres);
    855         cols /= vc->vc_font.width;
    856         rows /= vc->vc_font.height;
    857 +
    858 +       if (fbcon_decor_active(info, vc)) {
    859 +               cols = vc->vc_decor.twidth / vc->vc_font.width;
    860 +               rows = vc->vc_decor.theight / vc->vc_font.height;
    861 +       }
    862 +
    863         vc_resize(vc, cols, rows);
    864  
    865         DPRINTK("mode:   %s\n", info->fix.id);
    866 @@ -1034,7 +1044,7 @@ static void fbcon_init(struct vc_data *vc, int init)
    867         cap = info->flags;
    868  
    869         if (vc != svc || logo_shown == FBCON_LOGO_DONTSHOW ||
    870 -           (info->fix.type == FB_TYPE_TEXT))
    871 +           (info->fix.type == FB_TYPE_TEXT) || fbcon_decor_active(info, vc))
    872                 logo = 0;
    873  
    874         if (var_to_display(p, &info->var, info))
    875 @@ -1259,6 +1269,11 @@ static void fbcon_clear(struct vc_data *vc, int sy, int sx, int height,
    876                 fbcon_clear_margins(vc, 0);
    877         }
    878  
    879 +       if (fbcon_decor_active(info, vc)) {
    880 +               fbcon_decor_clear(vc, info, sy, sx, height, width);
    881 +               return;
    882 +       }
    883 +
    884         /* Split blits that cross physical y_wrap boundary */
    885  
    886         y_break = p->vrows - p->yscroll;
    887 @@ -1278,10 +1293,15 @@ static void fbcon_putcs(struct vc_data *vc, const unsigned short *s,
    888         struct display *p = &fb_display[vc->vc_num];
    889         struct fbcon_ops *ops = info->fbcon_par;
    890  
    891 -       if (!fbcon_is_inactive(vc, info))
    892 -               ops->putcs(vc, info, s, count, real_y(p, ypos), xpos,
    893 -                          get_color(vc, info, scr_readw(s), 1),
    894 -                          get_color(vc, info, scr_readw(s), 0));
    895 +       if (!fbcon_is_inactive(vc, info)) {
    896 +
    897 +               if (fbcon_decor_active(info, vc))
    898 +                       fbcon_decor_putcs(vc, info, s, count, ypos, xpos);
    899 +               else
    900 +                       ops->putcs(vc, info, s, count, real_y(p, ypos), xpos,
    901 +                                  get_color(vc, info, scr_readw(s), 1),
    902 +                                  get_color(vc, info, scr_readw(s), 0));
    903 +       }
    904  }
    905  
    906  static void fbcon_putc(struct vc_data *vc, int c, int ypos, int xpos)
    907 @@ -1297,8 +1317,12 @@ static void fbcon_clear_margins(struct vc_data *vc, int bottom_only)
    908         struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]];
    909         struct fbcon_ops *ops = info->fbcon_par;
    910  
    911 -       if (!fbcon_is_inactive(vc, info))
    912 -               ops->clear_margins(vc, info, bottom_only);
    913 +       if (!fbcon_is_inactive(vc, info)) {
    914 +               if (fbcon_decor_active(info, vc))
    915 +                       fbcon_decor_clear_margins(vc, info, bottom_only);
    916 +               else
    917 +                       ops->clear_margins(vc, info, bottom_only);
    918 +       }
    919  }
    920  
    921  static void fbcon_cursor(struct vc_data *vc, int mode)
    922 @@ -1819,7 +1843,7 @@ static int fbcon_scroll(struct vc_data *vc, int t, int b, int dir,
    923                         count = vc->vc_rows;
    924                 if (softback_top)
    925                         fbcon_softback_note(vc, t, count);
    926 -               if (logo_shown >= 0)
    927 +               if (logo_shown >= 0 || fbcon_decor_active(info, vc))
    928                         goto redraw_up;
    929                 switch (p->scrollmode) {
    930                 case SCROLL_MOVE:
    931 @@ -1912,6 +1936,8 @@ static int fbcon_scroll(struct vc_data *vc, int t, int b, int dir,
    932                         count = vc->vc_rows;
    933                 if (logo_shown >= 0)
    934                         goto redraw_down;
    935 +               if (fbcon_decor_active(info, vc))
    936 +                       goto redraw_down;
    937                 switch (p->scrollmode) {
    938                 case SCROLL_MOVE:
    939                         fbcon_redraw_blit(vc, info, p, b - 1, b - t - count,
    940 @@ -2060,6 +2086,13 @@ static void fbcon_bmove_rec(struct vc_data *vc, struct display *p, int sy, int s
    941                 }
    942                 return;
    943         }
    944 +
    945 +       if (fbcon_decor_active(info, vc) && sy == dy && height == 1) {
    946 +               /* must use slower redraw bmove to keep background pic intact */
    947 +               fbcon_decor_bmove_redraw(vc, info, sy, sx, dx, width);
    948 +               return;
    949 +       }
    950 +
    951         ops->bmove(vc, info, real_y(p, sy), sx, real_y(p, dy), dx,
    952                    height, width);
    953  }
    954 @@ -2130,8 +2163,8 @@ static int fbcon_resize(struct vc_data *vc, unsigned int width,
    955         var.yres = virt_h * virt_fh;
    956         x_diff = info->var.xres - var.xres;
    957         y_diff = info->var.yres - var.yres;
    958 -       if (x_diff < 0 || x_diff > virt_fw ||
    959 -           y_diff < 0 || y_diff > virt_fh) {
    960 +       if ((x_diff < 0 || x_diff > virt_fw ||
    961 +               y_diff < 0 || y_diff > virt_fh) && !vc->vc_decor.state) {
    962                 const struct fb_videomode *mode;
    963  
    964                 DPRINTK("attempting resize %ix%i\n", var.xres, var.yres);
    965 @@ -2167,6 +2200,22 @@ static int fbcon_switch(struct vc_data *vc)
    966  
    967         info = registered_fb[con2fb_map[vc->vc_num]];
    968         ops = info->fbcon_par;
    969 +       prev_console = ops->currcon;
    970 +       if (prev_console != -1)
    971 +               old_info = registered_fb[con2fb_map[prev_console]];
    972 +
    973 +#ifdef CONFIG_FB_CON_DECOR
    974 +       if (!fbcon_decor_active_vc(vc) && info->fix.visual == FB_VISUAL_DIRECTCOLOR) {
    975 +               struct vc_data *vc_curr = vc_cons[prev_console].d;
    976 +
    977 +               if (vc_curr && fbcon_decor_active_vc(vc_curr)) {
    978 +                       // Clear the screen to avoid displaying funky colors
    979 +                       // during palette updates.
    980 +                       memset((u8 *)info->screen_base + info->fix.line_length * info->var.yoffset,
    981 +                              0, info->var.yres * info->fix.line_length);
    982 +               }
    983 +       }
    984 +#endif
    985  
    986         if (softback_top) {
    987                 if (softback_lines)
    988 @@ -2185,9 +2234,6 @@ static int fbcon_switch(struct vc_data *vc)
    989                 logo_shown = FBCON_LOGO_CANSHOW;
    990         }
    991  
    992 -       prev_console = ops->currcon;
    993 -       if (prev_console != -1)
    994 -               old_info = registered_fb[con2fb_map[prev_console]];
    995         /*
    996          * FIXME: If we have multiple fbdev's loaded, we need to
    997          * update all info->currcon.  Perhaps, we can place this
    998 @@ -2231,6 +2277,18 @@ static int fbcon_switch(struct vc_data *vc)
    999                         fbcon_del_cursor_timer(old_info);
    1000         }
    1001  
    1002 +       if (fbcon_decor_active_vc(vc)) {
    1003 +               struct vc_data *vc_curr = vc_cons[prev_console].d;
    1004 +
    1005 +               if (!vc_curr->vc_decor.theme ||
    1006 +                       strcmp(vc->vc_decor.theme, vc_curr->vc_decor.theme) ||
    1007 +                       (fbcon_decor_active_nores(info, vc_curr) &&
    1008 +                        !fbcon_decor_active(info, vc_curr))) {
    1009 +                       fbcon_decor_disable(vc, 0);
    1010 +                       fbcon_decor_call_helper("modechange", vc->vc_num);
    1011 +               }
    1012 +       }
    1013 +
    1014         if (fbcon_is_inactive(vc, info) ||
    1015             ops->blank_state != FB_BLANK_UNBLANK)
    1016                 fbcon_del_cursor_timer(info);
    1017 @@ -2339,15 +2397,20 @@ static int fbcon_blank(struct vc_data *vc, int blank, int mode_switch)
    1018                 }
    1019         }
    1020  
    1021 -       if (!fbcon_is_inactive(vc, info)) {
    1022 +       if (!fbcon_is_inactive(vc, info)) {
    1023                 if (ops->blank_state != blank) {
    1024                         ops->blank_state = blank;
    1025                         fbcon_cursor(vc, blank ? CM_ERASE : CM_DRAW);
    1026                         ops->cursor_flash = (!blank);
    1027  
    1028 -                       if (!(info->flags & FBINFO_MISC_USEREVENT))
    1029 -                               if (fb_blank(info, blank))
    1030 -                                       fbcon_generic_blank(vc, info, blank);
    1031 +                       if (!(info->flags & FBINFO_MISC_USEREVENT)) {
    1032 +                               if (fb_blank(info, blank)) {
    1033 +                                       if (fbcon_decor_active(info, vc))
    1034 +                                               fbcon_decor_blank(vc, info, blank);
    1035 +                                       else
    1036 +                                               fbcon_generic_blank(vc, info, blank);
    1037 +                               }
    1038 +                       }
    1039                 }
    1040  
    1041                 if (!blank)
    1042 @@ -2522,13 +2585,22 @@ static int fbcon_do_set_font(struct vc_data *vc, int w, int h,
    1043         }
    1044  
    1045         if (resize) {
    1046 +               /* reset wrap/pan */
    1047                 int cols, rows;
    1048  
    1049                 cols = FBCON_SWAP(ops->rotate, info->var.xres, info->var.yres);
    1050                 rows = FBCON_SWAP(ops->rotate, info->var.yres, info->var.xres);
    1051 +
    1052 +               if (fbcon_decor_active(info, vc)) {
    1053 +                       info->var.xoffset = info->var.yoffset = p->yscroll = 0;
    1054 +                       cols = vc->vc_decor.twidth;
    1055 +                       rows = vc->vc_decor.theight;
    1056 +               }
    1057                 cols /= w;
    1058                 rows /= h;
    1059 +
    1060                 vc_resize(vc, cols, rows);
    1061 +
    1062                 if (con_is_visible(vc) && softback_buf)
    1063                         fbcon_update_softback(vc);
    1064         } else if (con_is_visible(vc)
    1065 @@ -2657,7 +2729,11 @@ static void fbcon_set_palette(struct vc_data *vc, const unsigned char *table)
    1066         int i, j, k, depth;
    1067         u8 val;
    1068  
    1069 -       if (fbcon_is_inactive(vc, info))
    1070 +       if (fbcon_is_inactive(vc, info)
    1071 +#ifdef CONFIG_FB_CON_DECOR
    1072 +                       || vc->vc_num != fg_console
    1073 +#endif
    1074 +               )
    1075                 return;
    1076  
    1077         if (!con_is_visible(vc))
    1078 @@ -2683,7 +2759,47 @@ static void fbcon_set_palette(struct vc_data *vc, const unsigned char *table)
    1079         } else
    1080                 fb_copy_cmap(fb_default_cmap(1 << depth), &palette_cmap);
    1081  
    1082 -       fb_set_cmap(&palette_cmap, info);
    1083 +       if (fbcon_decor_active(info, vc_cons[fg_console].d) &&
    1084 +           info->fix.visual == FB_VISUAL_DIRECTCOLOR) {
    1085 +
    1086 +               u16 *red, *green, *blue;
    1087 +               int minlen = min(min(info->var.red.length, info->var.green.length),
    1088 +                                    info->var.blue.length);
    1089 +
    1090 +               struct fb_cmap cmap = {
    1091 +                       .start = 0,
    1092 +                       .len = (1 << minlen),
    1093 +                       .red = NULL,
    1094 +                       .green = NULL,
    1095 +                       .blue = NULL,
    1096 +                       .transp = NULL
    1097 +               };
    1098 +
    1099 +               red = kmalloc(256 * sizeof(u16) * 3, GFP_KERNEL);
    1100 +
    1101 +               if (!red)
    1102 +                       goto out;
    1103 +
    1104 +               green = red + 256;
    1105 +               blue = green + 256;
    1106 +               cmap.red = red;
    1107 +               cmap.green = green;
    1108 +               cmap.blue = blue;
    1109 +
    1110 +               for (i = 0; i < cmap.len; i++)
    1111 +                       red[i] = green[i] = blue[i] = (0xffff * i)/(cmap.len-1);
    1112 +
    1113 +               fb_set_cmap(&cmap, info);
    1114 +               fbcon_decor_fix_pseudo_pal(info, vc_cons[fg_console].d);
    1115 +               kfree(red);
    1116 +
    1117 +               return;
    1118 +
    1119 +       } else if (fbcon_decor_active(info, vc_cons[fg_console].d) &&
    1120 +                  info->var.bits_per_pixel == 8 && info->bgdecor.cmap.red != NULL)
    1121 +               fb_set_cmap(&info->bgdecor.cmap, info);
    1122 +
    1123 +out:   fb_set_cmap(&palette_cmap, info);
    1124  }
    1125  
    1126  static u16 *fbcon_screen_pos(struct vc_data *vc, int offset)
    1127 @@ -2908,7 +3024,14 @@ static void fbcon_modechanged(struct fb_info *info)
    1128                 rows = FBCON_SWAP(ops->rotate, info->var.yres, info->var.xres);
    1129                 cols /= vc->vc_font.width;
    1130                 rows /= vc->vc_font.height;
    1131 -               vc_resize(vc, cols, rows);
    1132 +
    1133 +               if (!fbcon_decor_active_nores(info, vc)) {
    1134 +                       vc_resize(vc, cols, rows);
    1135 +               } else {
    1136 +                       fbcon_decor_disable(vc, 0);
    1137 +                       fbcon_decor_call_helper("modechange", vc->vc_num);
    1138 +               }
    1139 +
    1140                 updatescrollmode(p, info, vc);
    1141                 scrollback_max = 0;
    1142                 scrollback_current = 0;
    1143 @@ -2953,7 +3076,8 @@ static void fbcon_set_all_vcs(struct fb_info *info)
    1144                 rows = FBCON_SWAP(ops->rotate, info->var.yres, info->var.xres);
    1145                 cols /= vc->vc_font.width;
    1146                 rows /= vc->vc_font.height;
    1147 -               vc_resize(vc, cols, rows);
    1148 +               if (!fbcon_decor_active_nores(info, vc))
    1149 +                       vc_resize(vc, cols, rows);
    1150         }
    1151  
    1152         if (fg != -1)
    1153 @@ -3594,6 +3718,7 @@ static void fbcon_exit(void)
    1154                 }
    1155         }
    1156  
    1157 +       fbcon_decor_exit();
    1158         fbcon_has_exited = 1;
    1159  }
    1160  
    1161767diff --git a/drivers/video/console/fbcondecor.c b/drivers/video/console/fbcondecor.c
    1162768new file mode 100644
    1163 index 0000000..65cc0d3
     769index 000000000000..78288a497a60
    1164770--- /dev/null
    1165771+++ b/drivers/video/console/fbcondecor.c
     
    1202808+#include <linux/compat.h>
    1203809+#include <linux/console.h>
    1204 +
     810+#include <linux/binfmts.h>
    1205811+#include <linux/uaccess.h>
    1206812+#include <asm/irq.h>
    1207813+
    1208 +#include "fbcon.h"
     814+#include "../fbdev/core/fbcon.h"
    1209815+#include "fbcondecor.h"
    1210816+
     
    1337943+               return -EINVAL;
    1338944+
    1339 +       len = strlen_user(cfg->theme);
     945+       len = strnlen_user(cfg->theme, MAX_ARG_STRLEN);
    1340946+       if (!len || len > FBCON_DECOR_THEME_LEN)
    1341947+               return -EINVAL;
     
    17161322diff --git a/drivers/video/console/fbcondecor.h b/drivers/video/console/fbcondecor.h
    17171323new file mode 100644
    1718 index 0000000..c49386c
     1324index 000000000000..c49386c16695
    17191325--- /dev/null
    17201326+++ b/drivers/video/console/fbcondecor.h
     
    17981404+#endif /* __FBCON_DECOR_H */
    17991405diff --git a/drivers/video/fbdev/Kconfig b/drivers/video/fbdev/Kconfig
    1800 index 88b008f..c84113d 100644
     1406index 5e58f5ec0a28..1daa8c2cb2d8 100644
    18011407--- a/drivers/video/fbdev/Kconfig
    18021408+++ b/drivers/video/fbdev/Kconfig
    1803 @@ -1216,7 +1216,6 @@ config FB_MATROX
     1409@@ -1226,7 +1226,6 @@ config FB_MATROX
    18041410        select FB_CFB_FILLRECT
    18051411        select FB_CFB_COPYAREA
     
    18091415        ---help---
    18101416          Say Y here if you have a Matrox Millennium, Matrox Millennium II,
     1417diff --git a/drivers/video/fbdev/core/bitblit.c b/drivers/video/fbdev/core/bitblit.c
     1418index 790900d646c0..3f940c93752c 100644
     1419--- a/drivers/video/fbdev/core/bitblit.c
     1420+++ b/drivers/video/fbdev/core/bitblit.c
     1421@@ -18,6 +18,7 @@
     1422 #include <linux/console.h>
     1423 #include <asm/types.h>
     1424 #include "fbcon.h"
     1425+#include "../../console/fbcondecor.h"
     1426 
     1427 /*
     1428  * Accelerated handlers.
     1429@@ -55,6 +56,13 @@ static void bit_bmove(struct vc_data *vc, struct fb_info *info, int sy,
     1430        area.height = height * vc->vc_font.height;
     1431        area.width = width * vc->vc_font.width;
     1432 
     1433+       if (fbcon_decor_active(info, vc)) {
     1434+               area.sx += vc->vc_decor.tx;
     1435+               area.sy += vc->vc_decor.ty;
     1436+               area.dx += vc->vc_decor.tx;
     1437+               area.dy += vc->vc_decor.ty;
     1438+       }
     1439+
     1440        info->fbops->fb_copyarea(info, &area);
     1441 }
     1442 
     1443@@ -379,11 +387,15 @@ static void bit_cursor(struct vc_data *vc, struct fb_info *info, int mode,
     1444        cursor.image.depth = 1;
     1445        cursor.rop = ROP_XOR;
     1446 
     1447-       if (info->fbops->fb_cursor)
     1448-               err = info->fbops->fb_cursor(info, &cursor);
     1449+       if (fbcon_decor_active(info, vc)) {
     1450+               fbcon_decor_cursor(info, &cursor);
     1451+       } else {
     1452+               if (info->fbops->fb_cursor)
     1453+                       err = info->fbops->fb_cursor(info, &cursor);
     1454 
     1455-       if (err)
     1456-               soft_cursor(info, &cursor);
     1457+               if (err)
     1458+                       soft_cursor(info, &cursor);
     1459+       }
     1460 
     1461        ops->cursor_reset = 0;
     1462 }
    18111463diff --git a/drivers/video/fbdev/core/fbcmap.c b/drivers/video/fbdev/core/fbcmap.c
    1812 index f89245b..c2c12ce 100644
     1464index 68a113594808..21f977cb59d2 100644
    18131465--- a/drivers/video/fbdev/core/fbcmap.c
    18141466+++ b/drivers/video/fbdev/core/fbcmap.c
     
    18221474     0x0000, 0xaaaa
    18231475 };
    1824 @@ -254,9 +256,12 @@ int fb_set_cmap(struct fb_cmap *cmap, struct fb_info *info)
     1476@@ -256,9 +258,12 @@ int fb_set_cmap(struct fb_cmap *cmap, struct fb_info *info)
    18251477                                break;
    18261478                }
     
    18371489 }
    18381490 
     1491diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c
     1492index 04612f938bab..95c349200078 100644
     1493--- a/drivers/video/fbdev/core/fbcon.c
     1494+++ b/drivers/video/fbdev/core/fbcon.c
     1495@@ -80,6 +80,7 @@
     1496 #include <asm/irq.h>
     1497 
     1498 #include "fbcon.h"
     1499+#include "../../console/fbcondecor.h"
     1500 
     1501 #ifdef FBCONDEBUG
     1502 #  define DPRINTK(fmt, args...) printk(KERN_DEBUG "%s: " fmt, __func__ , ## args)
     1503@@ -95,7 +96,7 @@ enum {
     1504 
     1505 static struct display fb_display[MAX_NR_CONSOLES];
     1506 
     1507-static signed char con2fb_map[MAX_NR_CONSOLES];
     1508+signed char con2fb_map[MAX_NR_CONSOLES];
     1509 static signed char con2fb_map_boot[MAX_NR_CONSOLES];
     1510 
     1511 static int logo_lines;
     1512@@ -282,7 +283,7 @@ static inline int fbcon_is_inactive(struct vc_data *vc, struct fb_info *info)
     1513                !vt_force_oops_output(vc);
     1514 }
     1515 
     1516-static int get_color(struct vc_data *vc, struct fb_info *info,
     1517+int get_color(struct vc_data *vc, struct fb_info *info,
     1518              u16 c, int is_fg)
     1519 {
     1520        int depth = fb_get_color_depth(&info->var, &info->fix);
     1521@@ -551,6 +552,9 @@ static int do_fbcon_takeover(int show_logo)
     1522                info_idx = -1;
     1523        } else {
     1524                fbcon_has_console_bind = 1;
     1525+#ifdef CONFIG_FB_CON_DECOR
     1526+               fbcon_decor_init();
     1527+#endif
     1528        }
     1529 
     1530        return err;
     1531@@ -1013,6 +1017,12 @@ static const char *fbcon_startup(void)
     1532        rows = FBCON_SWAP(ops->rotate, info->var.yres, info->var.xres);
     1533        cols /= vc->vc_font.width;
     1534        rows /= vc->vc_font.height;
     1535+
     1536+       if (fbcon_decor_active(info, vc)) {
     1537+               cols = vc->vc_decor.twidth / vc->vc_font.width;
     1538+               rows = vc->vc_decor.theight / vc->vc_font.height;
     1539+       }
     1540+
     1541        vc_resize(vc, cols, rows);
     1542 
     1543        DPRINTK("mode:   %s\n", info->fix.id);
     1544@@ -1042,7 +1052,7 @@ static void fbcon_init(struct vc_data *vc, int init)
     1545        cap = info->flags;
     1546 
     1547        if (vc != svc || logo_shown == FBCON_LOGO_DONTSHOW ||
     1548-           (info->fix.type == FB_TYPE_TEXT))
     1549+           (info->fix.type == FB_TYPE_TEXT) || fbcon_decor_active(info, vc))
     1550                logo = 0;
     1551 
     1552        if (var_to_display(p, &info->var, info))
     1553@@ -1275,6 +1285,11 @@ static void fbcon_clear(struct vc_data *vc, int sy, int sx, int height,
     1554                fbcon_clear_margins(vc, 0);
     1555        }
     1556 
     1557+       if (fbcon_decor_active(info, vc)) {
     1558+               fbcon_decor_clear(vc, info, sy, sx, height, width);
     1559+               return;
     1560+       }
     1561+
     1562        /* Split blits that cross physical y_wrap boundary */
     1563 
     1564        y_break = p->vrows - p->yscroll;
     1565@@ -1294,10 +1309,15 @@ static void fbcon_putcs(struct vc_data *vc, const unsigned short *s,
     1566        struct display *p = &fb_display[vc->vc_num];
     1567        struct fbcon_ops *ops = info->fbcon_par;
     1568 
     1569-       if (!fbcon_is_inactive(vc, info))
     1570-               ops->putcs(vc, info, s, count, real_y(p, ypos), xpos,
     1571-                          get_color(vc, info, scr_readw(s), 1),
     1572-                          get_color(vc, info, scr_readw(s), 0));
     1573+       if (!fbcon_is_inactive(vc, info)) {
     1574+
     1575+               if (fbcon_decor_active(info, vc))
     1576+                       fbcon_decor_putcs(vc, info, s, count, ypos, xpos);
     1577+               else
     1578+                       ops->putcs(vc, info, s, count, real_y(p, ypos), xpos,
     1579+                                  get_color(vc, info, scr_readw(s), 1),
     1580+                                  get_color(vc, info, scr_readw(s), 0));
     1581+       }
     1582 }
     1583 
     1584 static void fbcon_putc(struct vc_data *vc, int c, int ypos, int xpos)
     1585@@ -1313,8 +1333,12 @@ static void fbcon_clear_margins(struct vc_data *vc, int bottom_only)
     1586        struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]];
     1587        struct fbcon_ops *ops = info->fbcon_par;
     1588 
     1589-       if (!fbcon_is_inactive(vc, info))
     1590-               ops->clear_margins(vc, info, margin_color, bottom_only);
     1591+       if (!fbcon_is_inactive(vc, info)) {
     1592+               if (fbcon_decor_active(info, vc))
     1593+                       fbcon_decor_clear_margins(vc, info, bottom_only);
     1594+               else
     1595+                       ops->clear_margins(vc, info, margin_color, bottom_only);
     1596+       }
     1597 }
     1598 
     1599 static void fbcon_cursor(struct vc_data *vc, int mode)
     1600@@ -1835,7 +1859,7 @@ static bool fbcon_scroll(struct vc_data *vc, unsigned int t, unsigned int b,
     1601                        count = vc->vc_rows;
     1602                if (softback_top)
     1603                        fbcon_softback_note(vc, t, count);
     1604-               if (logo_shown >= 0)
     1605+               if (logo_shown >= 0 || fbcon_decor_active(info, vc))
     1606                        goto redraw_up;
     1607                switch (p->scrollmode) {
     1608                case SCROLL_MOVE:
     1609@@ -1928,6 +1952,8 @@ static bool fbcon_scroll(struct vc_data *vc, unsigned int t, unsigned int b,
     1610                        count = vc->vc_rows;
     1611                if (logo_shown >= 0)
     1612                        goto redraw_down;
     1613+               if (fbcon_decor_active(info, vc))
     1614+                       goto redraw_down;
     1615                switch (p->scrollmode) {
     1616                case SCROLL_MOVE:
     1617                        fbcon_redraw_blit(vc, info, p, b - 1, b - t - count,
     1618@@ -2076,6 +2102,13 @@ static void fbcon_bmove_rec(struct vc_data *vc, struct display *p, int sy, int s
     1619                }
     1620                return;
     1621        }
     1622+
     1623+       if (fbcon_decor_active(info, vc) && sy == dy && height == 1) {
     1624+               /* must use slower redraw bmove to keep background pic intact */
     1625+               fbcon_decor_bmove_redraw(vc, info, sy, sx, dx, width);
     1626+               return;
     1627+       }
     1628+
     1629        ops->bmove(vc, info, real_y(p, sy), sx, real_y(p, dy), dx,
     1630                   height, width);
     1631 }
     1632@@ -2146,8 +2179,8 @@ static int fbcon_resize(struct vc_data *vc, unsigned int width,
     1633        var.yres = virt_h * virt_fh;
     1634        x_diff = info->var.xres - var.xres;
     1635        y_diff = info->var.yres - var.yres;
     1636-       if (x_diff < 0 || x_diff > virt_fw ||
     1637-           y_diff < 0 || y_diff > virt_fh) {
     1638+       if ((x_diff < 0 || x_diff > virt_fw ||
     1639+               y_diff < 0 || y_diff > virt_fh) && !vc->vc_decor.state) {
     1640                const struct fb_videomode *mode;
     1641 
     1642                DPRINTK("attempting resize %ix%i\n", var.xres, var.yres);
     1643@@ -2183,6 +2216,22 @@ static int fbcon_switch(struct vc_data *vc)
     1644 
     1645        info = registered_fb[con2fb_map[vc->vc_num]];
     1646        ops = info->fbcon_par;
     1647+       prev_console = ops->currcon;
     1648+       if (prev_console != -1)
     1649+               old_info = registered_fb[con2fb_map[prev_console]];
     1650+
     1651+#ifdef CONFIG_FB_CON_DECOR
     1652+       if (!fbcon_decor_active_vc(vc) && info->fix.visual == FB_VISUAL_DIRECTCOLOR) {
     1653+               struct vc_data *vc_curr = vc_cons[prev_console].d;
     1654+
     1655+               if (vc_curr && fbcon_decor_active_vc(vc_curr)) {
     1656+                       // Clear the screen to avoid displaying funky colors
     1657+                       // during palette updates.
     1658+                       memset((u8 *)info->screen_base + info->fix.line_length * info->var.yoffset,
     1659+                              0, info->var.yres * info->fix.line_length);
     1660+               }
     1661+       }
     1662+#endif
     1663 
     1664        if (softback_top) {
     1665                if (softback_lines)
     1666@@ -2201,9 +2250,6 @@ static int fbcon_switch(struct vc_data *vc)
     1667                logo_shown = FBCON_LOGO_CANSHOW;
     1668        }
     1669 
     1670-       prev_console = ops->currcon;
     1671-       if (prev_console != -1)
     1672-               old_info = registered_fb[con2fb_map[prev_console]];
     1673        /*
     1674         * FIXME: If we have multiple fbdev's loaded, we need to
     1675         * update all info->currcon.  Perhaps, we can place this
     1676@@ -2247,6 +2293,18 @@ static int fbcon_switch(struct vc_data *vc)
     1677                        fbcon_del_cursor_timer(old_info);
     1678        }
     1679 
     1680+       if (fbcon_decor_active_vc(vc)) {
     1681+               struct vc_data *vc_curr = vc_cons[prev_console].d;
     1682+
     1683+               if (!vc_curr->vc_decor.theme ||
     1684+                       strcmp(vc->vc_decor.theme, vc_curr->vc_decor.theme) ||
     1685+                       (fbcon_decor_active_nores(info, vc_curr) &&
     1686+                        !fbcon_decor_active(info, vc_curr))) {
     1687+                       fbcon_decor_disable(vc, 0);
     1688+                       fbcon_decor_call_helper("modechange", vc->vc_num);
     1689+               }
     1690+       }
     1691+
     1692        if (fbcon_is_inactive(vc, info) ||
     1693            ops->blank_state != FB_BLANK_UNBLANK)
     1694                fbcon_del_cursor_timer(info);
     1695@@ -2355,15 +2413,20 @@ static int fbcon_blank(struct vc_data *vc, int blank, int mode_switch)
     1696                }
     1697        }
     1698 
     1699-       if (!fbcon_is_inactive(vc, info)) {
     1700+       if (!fbcon_is_inactive(vc, info)) {
     1701                if (ops->blank_state != blank) {
     1702                        ops->blank_state = blank;
     1703                        fbcon_cursor(vc, blank ? CM_ERASE : CM_DRAW);
     1704                        ops->cursor_flash = (!blank);
     1705 
     1706-                       if (!(info->flags & FBINFO_MISC_USEREVENT))
     1707-                               if (fb_blank(info, blank))
     1708-                                       fbcon_generic_blank(vc, info, blank);
     1709+                       if (!(info->flags & FBINFO_MISC_USEREVENT)) {
     1710+                               if (fb_blank(info, blank)) {
     1711+                                       if (fbcon_decor_active(info, vc))
     1712+                                               fbcon_decor_blank(vc, info, blank);
     1713+                                       else
     1714+                                               fbcon_generic_blank(vc, info, blank);
     1715+                               }
     1716+                       }
     1717                }
     1718 
     1719                if (!blank)
     1720@@ -2546,13 +2609,22 @@ static int fbcon_do_set_font(struct vc_data *vc, int w, int h,
     1721                set_vc_hi_font(vc, true);
     1722 
     1723        if (resize) {
     1724+               /* reset wrap/pan */
     1725                int cols, rows;
     1726 
     1727                cols = FBCON_SWAP(ops->rotate, info->var.xres, info->var.yres);
     1728                rows = FBCON_SWAP(ops->rotate, info->var.yres, info->var.xres);
     1729+
     1730+               if (fbcon_decor_active(info, vc)) {
     1731+                       info->var.xoffset = info->var.yoffset = p->yscroll = 0;
     1732+                       cols = vc->vc_decor.twidth;
     1733+                       rows = vc->vc_decor.theight;
     1734+               }
     1735                cols /= w;
     1736                rows /= h;
     1737+
     1738                vc_resize(vc, cols, rows);
     1739+
     1740                if (con_is_visible(vc) && softback_buf)
     1741                        fbcon_update_softback(vc);
     1742        } else if (con_is_visible(vc)
     1743@@ -2681,7 +2753,11 @@ static void fbcon_set_palette(struct vc_data *vc, const unsigned char *table)
     1744        int i, j, k, depth;
     1745        u8 val;
     1746 
     1747-       if (fbcon_is_inactive(vc, info))
     1748+       if (fbcon_is_inactive(vc, info)
     1749+#ifdef CONFIG_FB_CON_DECOR
     1750+                       || vc->vc_num != fg_console
     1751+#endif
     1752+               )
     1753                return;
     1754 
     1755        if (!con_is_visible(vc))
     1756@@ -2707,7 +2783,47 @@ static void fbcon_set_palette(struct vc_data *vc, const unsigned char *table)
     1757        } else
     1758                fb_copy_cmap(fb_default_cmap(1 << depth), &palette_cmap);
     1759 
     1760-       fb_set_cmap(&palette_cmap, info);
     1761+       if (fbcon_decor_active(info, vc_cons[fg_console].d) &&
     1762+           info->fix.visual == FB_VISUAL_DIRECTCOLOR) {
     1763+
     1764+               u16 *red, *green, *blue;
     1765+               int minlen = min(min(info->var.red.length, info->var.green.length),
     1766+                                    info->var.blue.length);
     1767+
     1768+               struct fb_cmap cmap = {
     1769+                       .start = 0,
     1770+                       .len = (1 << minlen),
     1771+                       .red = NULL,
     1772+                       .green = NULL,
     1773+                       .blue = NULL,
     1774+                       .transp = NULL
     1775+               };
     1776+
     1777+               red = kmalloc(256 * sizeof(u16) * 3, GFP_KERNEL);
     1778+
     1779+               if (!red)
     1780+                       goto out;
     1781+
     1782+               green = red + 256;
     1783+               blue = green + 256;
     1784+               cmap.red = red;
     1785+               cmap.green = green;
     1786+               cmap.blue = blue;
     1787+
     1788+               for (i = 0; i < cmap.len; i++)
     1789+                       red[i] = green[i] = blue[i] = (0xffff * i)/(cmap.len-1);
     1790+
     1791+               fb_set_cmap(&cmap, info);
     1792+               fbcon_decor_fix_pseudo_pal(info, vc_cons[fg_console].d);
     1793+               kfree(red);
     1794+
     1795+               return;
     1796+
     1797+       } else if (fbcon_decor_active(info, vc_cons[fg_console].d) &&
     1798+                  info->var.bits_per_pixel == 8 && info->bgdecor.cmap.red != NULL)
     1799+               fb_set_cmap(&info->bgdecor.cmap, info);
     1800+
     1801+out:   fb_set_cmap(&palette_cmap, info);
     1802 }
     1803 
     1804 static u16 *fbcon_screen_pos(struct vc_data *vc, int offset)
     1805@@ -2932,7 +3048,14 @@ static void fbcon_modechanged(struct fb_info *info)
     1806                rows = FBCON_SWAP(ops->rotate, info->var.yres, info->var.xres);
     1807                cols /= vc->vc_font.width;
     1808                rows /= vc->vc_font.height;
     1809-               vc_resize(vc, cols, rows);
     1810+
     1811+               if (!fbcon_decor_active_nores(info, vc)) {
     1812+                       vc_resize(vc, cols, rows);
     1813+               } else {
     1814+                       fbcon_decor_disable(vc, 0);
     1815+                       fbcon_decor_call_helper("modechange", vc->vc_num);
     1816+               }
     1817+
     1818                updatescrollmode(p, info, vc);
     1819                scrollback_max = 0;
     1820                scrollback_current = 0;
     1821@@ -2977,7 +3100,8 @@ static void fbcon_set_all_vcs(struct fb_info *info)
     1822                rows = FBCON_SWAP(ops->rotate, info->var.yres, info->var.xres);
     1823                cols /= vc->vc_font.width;
     1824                rows /= vc->vc_font.height;
     1825-               vc_resize(vc, cols, rows);
     1826+               if (!fbcon_decor_active_nores(info, vc))
     1827+                       vc_resize(vc, cols, rows);
     1828        }
     1829 
     1830        if (fg != -1)
     1831@@ -3618,6 +3742,7 @@ static void fbcon_exit(void)
     1832                }
     1833        }
     1834 
     1835+       fbcon_decor_exit();
     1836        fbcon_has_exited = 1;
     1837 }
     1838 
    18391839diff --git a/drivers/video/fbdev/core/fbmem.c b/drivers/video/fbdev/core/fbmem.c
    1840 index 76c1ad9..fafc0af 100644
     1840index f741ba8df01b..b0141433d249 100644
    18411841--- a/drivers/video/fbdev/core/fbmem.c
    18421842+++ b/drivers/video/fbdev/core/fbmem.c
    1843 @@ -1251,15 +1251,6 @@ struct fb_fix_screeninfo32 {
     1843@@ -1253,15 +1253,6 @@ struct fb_fix_screeninfo32 {
    18441844        u16                     reserved[3];
    18451845 };
     
    18591859diff --git a/include/linux/console_decor.h b/include/linux/console_decor.h
    18601860new file mode 100644
    1861 index 0000000..1514355
     1861index 000000000000..15143556c2aa
    18621862--- /dev/null
    18631863+++ b/include/linux/console_decor.h
     
    19101910+#endif
    19111911diff --git a/include/linux/console_struct.h b/include/linux/console_struct.h
    1912 index 6fd3c90..c649555 100644
     1912index c0ec478ea5bf..8bfed6b21fc9 100644
    19131913--- a/include/linux/console_struct.h
    19141914+++ b/include/linux/console_struct.h
    1915 @@ -20,6 +20,7 @@ struct vt_struct;
     1915@@ -21,6 +21,7 @@ struct vt_struct;
    19161916 struct uni_pagedir;
    19171917 
     
    19211921 /*
    19221922  * Example: vc_data of a console that was scrolled 3 lines down.
    1923 @@ -140,6 +141,8 @@ struct vc_data {
     1923@@ -141,6 +142,8 @@ struct vc_data {
    19241924        struct uni_pagedir *vc_uni_pagedir;
    19251925        struct uni_pagedir **vc_uni_pagedir_loc; /* [!] Location of uni_pagedir variable for this console */
     
    19311931 
    19321932diff --git a/include/linux/fb.h b/include/linux/fb.h
    1933 index a964d07..672cc64 100644
     1933index bc24e48e396d..ad7d182c7545 100644
    19341934--- a/include/linux/fb.h
    19351935+++ b/include/linux/fb.h
    1936 @@ -238,6 +238,34 @@ struct fb_deferred_io {
     1936@@ -239,6 +239,34 @@ struct fb_deferred_io {
    19371937 };
    19381938 #endif
     
    19691969  * Frame buffer operations
    19701970  *
    1971 @@ -508,6 +536,9 @@ struct fb_info {
     1971@@ -509,6 +537,9 @@ struct fb_info {
    19721972 #define FBINFO_STATE_SUSPENDED 1
    19731973        u32 state;                      /* Hardware state i.e suspend */
     
    19801980        /* we need the PCI or similar aperture base/size not
    19811981diff --git a/include/uapi/linux/fb.h b/include/uapi/linux/fb.h
    1982 index fb795c3..4b57c67 100644
     1982index 6cd9b198b7c6..a228440649fa 100644
    19831983--- a/include/uapi/linux/fb.h
    19841984+++ b/include/uapi/linux/fb.h
    1985 @@ -8,6 +8,23 @@
     1985@@ -9,6 +9,23 @@
    19861986 
    19871987 #define FB_MAX                 32      /* sufficient for now */
     
    20072007    0x46 is 'F'                                                         */
    20082008 #define FBIOGET_VSCREENINFO    0x4600
    2009 @@ -35,6 +52,25 @@
     2009@@ -36,6 +53,25 @@
    20102010 #define FBIOGET_DISPINFO        0x4618
    20112011 #define FBIO_WAITFORVSYNC      _IOW('F', 0x20, __u32)
     
    20332033 #define FB_TYPE_PLANES                 1       /* Non interleaved planes */
    20342034 #define FB_TYPE_INTERLEAVED_PLANES     2       /* Interleaved planes   */
    2035 @@ -277,6 +313,29 @@ struct fb_var_screeninfo {
     2035@@ -278,6 +314,29 @@ struct fb_var_screeninfo {
    20362036        __u32 reserved[4];              /* Reserved for future compatibility */
    20372037 };
     
    20642064        __u32 len;                      /* Number of entries */
    20652065diff --git a/kernel/sysctl.c b/kernel/sysctl.c
    2066 index 6ee416e..d2c2425 100644
     2066index d9c31bc2eaea..e33ac56cc32a 100644
    20672067--- a/kernel/sysctl.c
    20682068+++ b/kernel/sysctl.c
    2069 @@ -149,6 +149,10 @@ static const int cap_last_cap = CAP_LAST_CAP;
     2069@@ -150,6 +150,10 @@ static const int cap_last_cap = CAP_LAST_CAP;
    20702070 static unsigned long hung_task_timeout_max = (LONG_MAX/HZ);
    20712071 #endif
     
    20782078 #include <linux/inotify.h>
    20792079 #endif
    2080 @@ -266,6 +270,15 @@ static struct ctl_table sysctl_base_table[] = {
     2080@@ -283,6 +287,15 @@ static struct ctl_table sysctl_base_table[] = {
    20812081                .mode           = 0555,
    20822082                .child          = dev_table,
Note: See TracChangeset for help on using the changeset viewer.