From patchwork Thu Jan 10 09:24:03 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Linus Walleij X-Patchwork-Id: 155129 Delivered-To: patch@linaro.org Received: by 2002:a02:48:0:0:0:0:0 with SMTP id 69csp1675850jaa; Thu, 10 Jan 2019 01:24:19 -0800 (PST) X-Google-Smtp-Source: ALg8bN5cBsVKR+aRdEUR2bRCEG//TXoWx9swejdudnNOQDyG3JwekYNYmSgCeMXhDJL0iTdXRBXx X-Received: by 2002:a63:4926:: with SMTP id w38mr8313092pga.353.1547112259171; Thu, 10 Jan 2019 01:24:19 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1547112259; cv=none; d=google.com; s=arc-20160816; b=gQz2qmpHz6ti7zW7z1RxPgKZm4IHBg66ZHkJHF8mD1eGC3xwR0W5ZO09cUYfqfYBfB eq1df7T/ZuJWjMGieFQDzwlMDi8SaUiPn8Te84VfYlFxkAbntXz2dPeLby2OBt3TrL7/ OEd5q8yvKXRpjvDaBVNXpo522vMjJVjxxlft7S3ZZY2yqXEBGaOgRN3kXQAu0Nr2WHzV tnEj8drQg5Wqb8meg2w1hrUUsWhxtqpd221xGu9e7ZvOD73y05IBt/PQHTUw+f6JRqMo wWCO2kJ1zdApcrfYjONRK5QwcvF2u7ONYTPOPWYyBVDQe75LawKNSxrOH7dasFVAIvEX uFKA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:mime-version:message-id:date:subject:to:from :delivered-to; bh=aGJf3jcrNymZvyQXGvLLvurZ+2SGztqza7cnQ4Du0MI=; b=B1vK7mQ/w2aNrEtRiZ/BRuwaJqp3GrpHndfmGoOA2z6fNHCR91XsT5/TeLU5+3Sils CYp0k58isd7moORurMaPZQBs02lrEiIE9Oamoa2ZyO7T1GqpdTvMk6hG1UNNJJ2v56Ta V2IT4uuRkLlkFMDg1i8Bw08IzDD7y6zu3g2Gp/edybQ+e5+wkQuKv8hyvzYwOB+WrbmN Q47hpQhOYW8oFY/lo2Er8Rlna9OxYuMCmnqSpBsBkwOPPnuYDRO18CGpw3kxh8UV0LG2 7HtWC7+tIutG9ZuFdiH6kyKtjfAXOhLRDbS/LfXzGE3BI5VZdD9cnqwmLBUh2oF+eUzq uBKg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of dri-devel-bounces@lists.freedesktop.org designates 131.252.210.177 as permitted sender) smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from gabe.freedesktop.org (gabe.freedesktop.org. [131.252.210.177]) by mx.google.com with ESMTPS id m3si3067802pgs.8.2019.01.10.01.24.18 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 10 Jan 2019 01:24:19 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of dri-devel-bounces@lists.freedesktop.org designates 131.252.210.177 as permitted sender) client-ip=131.252.210.177; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of dri-devel-bounces@lists.freedesktop.org designates 131.252.210.177 as permitted sender) smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id D08536F213; Thu, 10 Jan 2019 09:24:17 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mail-lj1-x244.google.com (mail-lj1-x244.google.com [IPv6:2a00:1450:4864:20::244]) by gabe.freedesktop.org (Postfix) with ESMTPS id BC3376F213 for ; Thu, 10 Jan 2019 09:24:16 +0000 (UTC) Received: by mail-lj1-x244.google.com with SMTP id t18-v6so9054420ljd.4 for ; Thu, 10 Jan 2019 01:24:16 -0800 (PST) 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:mime-version :content-transfer-encoding; bh=JR/GkMfuzX7df3pIgljwTmHVCF8u0ta8aYFvG3AlIeU=; b=XCY+QBgd/PsVTCSQ87yPU7Rs7KanMHWcuRHlNdniAZn88wjyE4Pzg20rO/P9K3IzjY M3pxA+8tsP+DCCfwsS247zhdDT6Uh5pKkWih2xYV7bON0kFDs3LjvB9uCgFc9W7qHALu RJtD0UHAhXxnFIYiqpTk++FZTbKQyGMzsw8p22TX9O95/HfM6+pm53ommCwzj+g49A8s MfrmRPcb7F4ey2lcZPm11/haBnLskkDXswj4v7sRRLtpXsxedTQXITW4uQlplJ7rNCQo DeGULwJEUL3fq1/MWxnCgTt1OWZEVvBL7mHjuZAnq1corvQER4zkbqPA/IC+JHz0eWbO Zkjg== X-Gm-Message-State: AJcUukfZxUwQg46/fIRuEwaGWh4/4nPz+pvQmm1IzRfLCgqWKBX19hMI nsEDZwIgFmKjJ7vxZZpbgXXsFg== X-Received: by 2002:a2e:12d0:: with SMTP id 77-v6mr5244674ljs.132.1547112255016; Thu, 10 Jan 2019 01:24:15 -0800 (PST) Received: from genomnajs.ideon.se ([85.235.10.227]) by smtp.gmail.com with ESMTPSA id q6sm13881335lfh.52.2019.01.10.01.24.13 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 10 Jan 2019 01:24:13 -0800 (PST) From: Linus Walleij To: Bartlomiej Zolnierkiewicz , Eric Anholt , =?utf-8?q?Noralf_Tr=C3=B8nnes?= , Dave Airlie , David Lechner Subject: [PATCH v3] drm/fb-helper: Scale back depth to supported maximum Date: Thu, 10 Jan 2019 10:24:03 +0100 Message-Id: <20190110092403.28324-1-linus.walleij@linaro.org> X-Mailer: git-send-email 2.19.2 MIME-Version: 1.0 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: linux-fbdev@vger.kernel.org, linux-arm-kernel@lists.infradead.org, dri-devel@lists.freedesktop.org Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" The following happened when migrating an old fbdev driver to DRM: The Integrator/CP PL111 supports 16BPP but only ARGB1555/ABGR1555 or XRGB1555/XBGR1555 i.e. the maximum depth is 15. This makes the initialization of the framebuffer fail since the code in drm_fb_helper_single_fb_probe() assigns the same value to sizes.surface_bpp and sizes.surface_depth. I.e. it simply assumes a 1-to-1 mapping between BPP and depth, which is true in most cases but not for this hardware that only support odd formats. To support the odd case of a driver supporting 16BPP with only 15 bits of depth, this patch will make the code loop over the formats supported on the primary plane on each CRTC managed by the FB helper and cap the depth to the maximum supported on any primary plane. On the PL110 Integrator, this makes drm_mode_legacy_fb_format() select DRM_FORMAT_XRGB1555 which is acceptable for this driver, and thus we get framebuffer, penguin and console on the Integrator/CP. Cc: Noralf Trønnes Cc: Ville Syrjälä Reviewed-by: Daniel Vetter Signed-off-by: Linus Walleij --- ChangeLog v2->v3: - Rebased and tested with v5.0-rc1 - Skip any formats with fmt->depth == 0 - Collected Daniels review tag. ChangeLog v1->v2: - Loop over the CRTCs managed by the helper and check the crtc->primary on each CRTC for the applicable formats and thus depths. - Skip over YUV formats. The framebuffer emulation cannot handle these formats. The v1 was sent some while back in february and I only recently got back to fixing this up to support the last CLCD displays. It was agreed that it is probably best to augment the framebuffer initializer to pass a desired pixel format instead of just BPP as today, but that is a bit daunting, and Daniel said that we would probably anyways need a fallback like this. --- drivers/gpu/drm/drm_fb_helper.c | 53 ++++++++++++++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c index d3af098b0922..e29432e486f4 100644 --- a/drivers/gpu/drm/drm_fb_helper.c +++ b/drivers/gpu/drm/drm_fb_helper.c @@ -1797,6 +1797,7 @@ static int drm_fb_helper_single_fb_probe(struct drm_fb_helper *fb_helper, int i; struct drm_fb_helper_surface_size sizes; int gamma_size = 0; + int best_depth = 0; memset(&sizes, 0, sizeof(struct drm_fb_helper_surface_size)); sizes.surface_depth = 24; @@ -1804,7 +1805,10 @@ static int drm_fb_helper_single_fb_probe(struct drm_fb_helper *fb_helper, sizes.fb_width = (u32)-1; sizes.fb_height = (u32)-1; - /* if driver picks 8 or 16 by default use that for both depth/bpp */ + /* + * If driver picks 8 or 16 by default use that for both depth/bpp + * to begin with + */ if (preferred_bpp != sizes.surface_bpp) sizes.surface_depth = sizes.surface_bpp = preferred_bpp; @@ -1839,6 +1843,53 @@ static int drm_fb_helper_single_fb_probe(struct drm_fb_helper *fb_helper, } } + /* + * If we run into a situation where, for example, the primary plane + * supports RGBA5551 (16 bpp, depth 15) but not RGB565 (16 bpp, depth + * 16) we need to scale down the depth of the sizes we request. + */ + for (i = 0; i < fb_helper->crtc_count; i++) { + struct drm_mode_set *mode_set = &fb_helper->crtc_info[i].mode_set; + struct drm_crtc *crtc = mode_set->crtc; + struct drm_plane *plane = crtc->primary; + int j; + + DRM_DEBUG("test CRTC %d primary plane\n", i); + + for (j = 0; j < plane->format_count; j++) { + const struct drm_format_info *fmt; + + fmt = drm_format_info(plane->format_types[j]); + + /* + * Do not consider YUV or other complicated formats + * for framebuffers. This means only legacy formats + * are supported (fmt->depth is a legacy field) but + * the framebuffer emulation can only deal with such + * formats, specifically RGB/BGA formats. + */ + if (fmt->depth == 0) + continue; + + /* We found a perfect fit, great */ + if (fmt->depth == sizes.surface_depth) + break; + + /* Skip depths above what we're looking for */ + if (fmt->depth > sizes.surface_depth) + continue; + + /* Best depth found so far */ + if (fmt->depth > best_depth) + best_depth = fmt->depth; + } + } + if (sizes.surface_depth != best_depth) { + DRM_INFO("requested bpp %d, scaled depth down to %d", + sizes.surface_bpp, best_depth); + sizes.surface_depth = best_depth; + } + crtc_count = 0; for (i = 0; i < fb_helper->crtc_count; i++) { struct drm_display_mode *desired_mode;