From patchwork Sun Oct 1 15:33:14 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hans de Goede X-Patchwork-Id: 9979787 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id BB00560327 for ; Sun, 1 Oct 2017 17:57:28 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id A19B2289C4 for ; Sun, 1 Oct 2017 17:57:28 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 94750289C9; Sun, 1 Oct 2017 17:57:28 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.1 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_MED, T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 1B3E4289C4 for ; Sun, 1 Oct 2017 17:57:27 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 67EA96E1E4; Sun, 1 Oct 2017 17:57:25 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mail-wr0-x244.google.com (mail-wr0-x244.google.com [IPv6:2a00:1450:400c:c0c::244]) by gabe.freedesktop.org (Postfix) with ESMTPS id 3CE6E6E072 for ; Sun, 1 Oct 2017 15:33:29 +0000 (UTC) Received: by mail-wr0-x244.google.com with SMTP id u48so2267187wrf.4 for ; Sun, 01 Oct 2017 08:33:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=dL/rv3OjCakLUUoa4DmaVc3UVwAsIFPaTK0WNMF7r68=; b=HfVFdkLrJy0y6xCjSK/FUgOstQW0UZwIPFOIFnh9318VQ4bwaaZWz9ltEPBbcpcC3/ YBe/3VKYH8q/sOKt7JW+m+VPCYdRg1sahbrAqiRqjtt5KqNbcGNkQywPPxO2IsrBKRYY QRVmIgfy6B+rd+evaq0e40M7RqgmJi1LpupHkMqJI5TQc7OaEml4fqo/E/cbv0IHpJIi 0IDY5OGEwzNvwJM/hNEd1/xSfCFbD0Xj/3up6mi2LDE8aoHZZkVlAv68BrwWFH/T7hrx Fe2Tl+raj9AMm/i0gQdKXmOjb3Nd3wnl/6iLZuodfPqpGqE2KzynUvOuJChcH1+5qYBR KFiw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=dL/rv3OjCakLUUoa4DmaVc3UVwAsIFPaTK0WNMF7r68=; b=pbQC0bSWjr7QBwlVBwIPFaw8wRNdmA2CnRws0b0RwqLl3sJRlj93jEUa1w92quEBhs yR9ZTwdM4DM/jtHvfXiHKpJDWPjxT/F3yCYHWWHODUwy54WZtqoy5ZV1SXU80bdrrRMQ 9fwnXo8MkLYRdhBAWIuJEW1TF3TZXOH9QSywvbrlSzV3ycLYdMWrwAhqPuzRBI2bce5C 5Zp9qzaB0eifMZw6CGcLKHTDjObzzQAY5edv06uIr/9efqR9TvvC7WD47djOjajt+TEJ BlHHjAxxL9xKpDeyTsQBMcvM6nYS5Y18eyKnRtZuT6sXLA9A1gjuPFwYrKX3yVGX5MMw hHqQ== X-Gm-Message-State: AHPjjUhwxhLCE3ulq3u5fZvV9+s+yDTO14nexF/Tg1ZfTbfjoTIt96Ii ceyTYSdZSe9C71JwIxcNXXg= X-Google-Smtp-Source: AOwi7QAVmMoX1V2rjltBnzyje01yXYU8uszq2K4Phdq+tToW5N8TyuvWIA+hrx4HcE7c6TqCbJeXgQ== X-Received: by 10.223.188.83 with SMTP id a19mr9518882wrh.44.1506872007560; Sun, 01 Oct 2017 08:33:27 -0700 (PDT) Received: from shalem.localdomain.com (546A5441.cm-12-3b.dynamic.ziggo.nl. [84.106.84.65]) by smtp.gmail.com with ESMTPSA id 30sm8700978wry.34.2017.10.01.08.33.26 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sun, 01 Oct 2017 08:33:26 -0700 (PDT) From: Hans de Goede X-Google-Original-From: Hans de Goede To: Daniel Vetter , Jani Nikula , Sean Paul , David Airlie , Bartlomiej Zolnierkiewicz Subject: [PATCH v2 1/4] video: fb: Make fbcon dmi quirks usuable for drm drivers too Date: Sun, 1 Oct 2017 17:33:14 +0200 Message-Id: <20171001153317.2343-2-hdegoede@redhat.com> X-Mailer: git-send-email 2.14.2 In-Reply-To: <20171001153317.2343-1-hdegoede@redhat.com> References: <20171001153317.2343-1-hdegoede@redhat.com> X-Mailman-Approved-At: Sun, 01 Oct 2017 17:57:25 +0000 Cc: Hans de Goede , linux-fbdev@vger.kernel.org, dri-devel@lists.freedesktop.org, Bastien Nocera X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" X-Virus-Scanned: ClamAV using ClamSMTP Some x86 clamshell design devices use portrait tablet LCD panels and a display engine which cannot (transparently) rotate in hardware, so we need to rotate things in software / let user space deal with this. The fbcon code has a set of DMI based quirks to automatically detect such tablet LCD panels and rotate the fbcon to compensate. The plan was for userspace (e.g. a Wayland compositor) to simply read /sys/class/graphics/fbcon/rotate and apply the rotation from there to the LCD panel to compensate. However this will not work when an external monitor gets plugged in, since with fbcon rotation is not per output, so the fbcon quirk code disables the rotation when an external monitor is present. Using /sys/class/graphics/fbcon/rotate will not help in that case since it will indicate no rotation is in use. So instead we are going to need a drm connecter property for this. This commit is a preparation patch for adding the drm-connecter property, by making the fbcon quirk code generally usable so that the drm code can use it to check for rotation quirks. Note this commit re-uses the FB_CMDLINE Kconfig option for selecting if the quirk code should be build, since that is already selected by both the drm and fbcon code. Signed-off-by: Hans de Goede --- Changes in v2: -Rebased on 4.14-rc1 --- drivers/video/fbdev/core/Makefile | 6 +++--- .../core/{fbcon_dmi_quirks.c => fb_dmi_quirks.c} | 15 +++++++++------ drivers/video/fbdev/core/fbcon.c | 22 ++++++++++++++-------- drivers/video/fbdev/core/fbcon.h | 6 ------ include/linux/fb.h | 6 ++++++ 5 files changed, 32 insertions(+), 23 deletions(-) rename drivers/video/fbdev/core/{fbcon_dmi_quirks.c => fb_dmi_quirks.c} (91%) diff --git a/drivers/video/fbdev/core/Makefile b/drivers/video/fbdev/core/Makefile index 73493bbd7a15..06caf037a822 100644 --- a/drivers/video/fbdev/core/Makefile +++ b/drivers/video/fbdev/core/Makefile @@ -1,4 +1,7 @@ obj-$(CONFIG_FB_CMDLINE) += fb_cmdline.o +ifeq ($(CONFIG_DMI),y) +obj-$(CONFIG_FB_CMDLINE) += fb_dmi_quirks.o +endif obj-$(CONFIG_FB_NOTIFY) += fb_notify.o obj-$(CONFIG_FB) += fb.o fb-y := fbmem.o fbmon.o fbcmap.o fbsysfs.o \ @@ -14,9 +17,6 @@ ifeq ($(CONFIG_FRAMEBUFFER_CONSOLE_ROTATION),y) fb-y += fbcon_rotate.o fbcon_cw.o fbcon_ud.o \ fbcon_ccw.o endif -ifeq ($(CONFIG_DMI),y) -fb-y += fbcon_dmi_quirks.o -endif endif fb-objs := $(fb-y) diff --git a/drivers/video/fbdev/core/fbcon_dmi_quirks.c b/drivers/video/fbdev/core/fb_dmi_quirks.c similarity index 91% rename from drivers/video/fbdev/core/fbcon_dmi_quirks.c rename to drivers/video/fbdev/core/fb_dmi_quirks.c index 6904e47d1e51..d5fdf3245f83 100644 --- a/drivers/video/fbdev/core/fbcon_dmi_quirks.c +++ b/drivers/video/fbdev/core/fb_dmi_quirks.c @@ -1,5 +1,5 @@ /* - * fbcon_dmi_quirks.c -- DMI based quirk detection for fbcon + * fb_dmi_quirks.c -- DMI based LCD panel rotation quirk detection * * Copyright (C) 2017 Hans de Goede * @@ -11,7 +11,6 @@ #include #include #include -#include "fbcon.h" /* * Some x86 clamshell design devices use portrait tablet screens and a display @@ -112,7 +111,11 @@ static const struct dmi_system_id rotate_data[] = { {} }; -int fbcon_platform_get_rotate(struct fb_info *info) +/* + * Note this function returns the rotation necessary to put the display + * the right way up, or -1 if there is no quirk. + */ +int fb_get_panel_rotate_quirk(int width, int height) { const struct dmi_system_id *match; const struct fbcon_dmi_rotate_data *data; @@ -124,8 +127,7 @@ int fbcon_platform_get_rotate(struct fb_info *info) match = dmi_first_match(match + 1)) { data = match->driver_data; - if (data->width != info->var.xres || - data->height != info->var.yres) + if (data->width != width || data->height != height) continue; if (!data->bios_dates) @@ -141,5 +143,6 @@ int fbcon_platform_get_rotate(struct fb_info *info) } } - return FB_ROTATE_UR; + return -1; } +EXPORT_SYMBOL_GPL(fb_get_panel_rotate_quirk); diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c index 04612f938bab..2e17ea02c295 100644 --- a/drivers/video/fbdev/core/fbcon.c +++ b/drivers/video/fbdev/core/fbcon.c @@ -963,10 +963,13 @@ static const char *fbcon_startup(void) ops->cur_rotate = -1; ops->cur_blink_jiffies = HZ / 5; info->fbcon_par = ops; - if (initial_rotation != -1) - p->con_rotate = initial_rotation; - else - p->con_rotate = fbcon_platform_get_rotate(info); + p->con_rotate = initial_rotation; + if (p->con_rotate == -1) + p->con_rotate = fb_get_panel_rotate_quirk(info->var.xres, + info->var.yres); + if (p->con_rotate == -1) + p->con_rotate = FB_ROTATE_UR; + set_blitting_type(vc, info); if (info->fix.type != FB_TYPE_TEXT) { @@ -1103,10 +1106,13 @@ static void fbcon_init(struct vc_data *vc, int init) ops = info->fbcon_par; ops->cur_blink_jiffies = msecs_to_jiffies(vc->vc_cur_blink_ms); - if (initial_rotation != -1) - p->con_rotate = initial_rotation; - else - p->con_rotate = fbcon_platform_get_rotate(info); + p->con_rotate = initial_rotation; + if (p->con_rotate == -1) + p->con_rotate = fb_get_panel_rotate_quirk(info->var.xres, + info->var.yres); + if (p->con_rotate == -1) + p->con_rotate = FB_ROTATE_UR; + set_blitting_type(vc, info); cols = vc->vc_cols; diff --git a/drivers/video/fbdev/core/fbcon.h b/drivers/video/fbdev/core/fbcon.h index 18f3ac144237..3746828356ed 100644 --- a/drivers/video/fbdev/core/fbcon.h +++ b/drivers/video/fbdev/core/fbcon.h @@ -261,10 +261,4 @@ extern void fbcon_set_rotate(struct fbcon_ops *ops); #define fbcon_set_rotate(x) do {} while(0) #endif /* CONFIG_FRAMEBUFFER_CONSOLE_ROTATION */ -#ifdef CONFIG_DMI -int fbcon_platform_get_rotate(struct fb_info *info); -#else -#define fbcon_platform_get_rotate(i) FB_ROTATE_UR -#endif /* CONFIG_DMI */ - #endif /* _VIDEO_FBCON_H */ diff --git a/include/linux/fb.h b/include/linux/fb.h index f4386b0ccf40..7527965c5b53 100644 --- a/include/linux/fb.h +++ b/include/linux/fb.h @@ -814,6 +814,12 @@ extern int fb_find_mode(struct fb_var_screeninfo *var, const struct fb_videomode *default_mode, unsigned int default_bpp); +#ifdef CONFIG_DMI +int fb_get_panel_rotate_quirk(int width, int height); +#else +#define fb_get_panel_rotate_quirk(width, height) (-1) +#endif /* CONFIG_DMI */ + /* Convenience logging macros */ #define fb_err(fb_info, fmt, ...) \ pr_err("fb%d: " fmt, (fb_info)->node, ##__VA_ARGS__)