struct console_font font;
        int rc = -EINVAL;
        int c;
+       unsigned int vpitch = op->op == KD_FONT_OP_GET_TALL ? op->height : 32;
 
        if (op->data) {
                font.data = kmalloc(max_font_size, GFP_KERNEL);
        if (vc->vc_mode != KD_TEXT)
                rc = -EINVAL;
        else if (vc->vc_sw->con_font_get)
-               rc = vc->vc_sw->con_font_get(vc, &font, 32);
+               rc = vc->vc_sw->con_font_get(vc, &font, vpitch);
        else
                rc = -ENOSYS;
        console_unlock();
        if (rc)
                goto out;
 
-       c = (font.width+7)/8 * 32 * font.charcount;
+       c = (font.width+7)/8 * vpitch * font.charcount;
 
        if (op->data && font.charcount > op->charcount)
                rc = -ENOSPC;
        struct console_font font;
        int rc = -EINVAL;
        int size;
+       unsigned int vpitch = op->op == KD_FONT_OP_SET_TALL ? op->height : 32;
 
        if (vc->vc_mode != KD_TEXT)
                return -EINVAL;
                return -EINVAL;
        if (op->width <= 0 || op->width > 32 || !op->height || op->height > 32)
                return -EINVAL;
-       size = (op->width+7)/8 * 32 * op->charcount;
+       if (vpitch < op->height)
+               return -EINVAL;
+       size = (op->width+7)/8 * vpitch * op->charcount;
        if (size > max_font_size)
                return -ENOSPC;
 
        else if (vc->vc_sw->con_font_set) {
                if (vc_is_sel(vc))
                        clear_selection();
-               rc = vc->vc_sw->con_font_set(vc, &font, 32, op->flags);
+               rc = vc->vc_sw->con_font_set(vc, &font, vpitch, op->flags);
        } else
                rc = -ENOSYS;
        console_unlock();
 {
        switch (op->op) {
        case KD_FONT_OP_SET:
+       case KD_FONT_OP_SET_TALL:
                return con_font_set(vc, op);
        case KD_FONT_OP_GET:
+       case KD_FONT_OP_GET_TALL:
                return con_font_get(vc, op);
        case KD_FONT_OP_SET_DEFAULT:
                return con_font_default(vc, op);
 
        unsigned int flags;     /* KD_FONT_FLAG_* */
        unsigned int width, height;     /* font size */
        unsigned int charcount;
-       unsigned char __user *data;     /* font data with height fixed to 32 */
+       unsigned char __user *data;     /* font data with vpitch fixed to 32 for
+                                        * KD_FONT_OP_SET/GET
+                                        */
 };
 
 struct console_font {
        unsigned int width, height;     /* font size */
        unsigned int charcount;
-       unsigned char *data;    /* font data with height fixed to 32 */
+       unsigned char *data;    /* font data with vpitch fixed to 32 for
+                                * KD_FONT_OP_SET/GET
+                                */
 };
 
 #define KD_FONT_OP_SET         0       /* Set font */
 #define KD_FONT_OP_GET         1       /* Get font */
 #define KD_FONT_OP_SET_DEFAULT 2       /* Set font to default, data points to name / NULL */
 #define KD_FONT_OP_COPY                3       /* Obsolete, do not use */
+#define KD_FONT_OP_SET_TALL    4       /* Set font with vpitch = height */
+#define KD_FONT_OP_GET_TALL    5       /* Get font with vpitch = height */
 
 #define KD_FONT_FLAG_DONT_RECALC       1       /* Don't recalculate hw charcell size [compat] */