Received: by 2002:a25:1506:0:0:0:0:0 with SMTP id 6csp1640866ybv; Fri, 21 Feb 2020 00:50:27 -0800 (PST) X-Google-Smtp-Source: APXvYqyBGX4eSwdVeb1Z2Q8uKb27XP4EFAtuuhLlFyXg+Ry05nVdwib4iCEoYtcSqb47UXIZeUsF X-Received: by 2002:aca:aa0a:: with SMTP id t10mr1067203oie.156.1582275027438; Fri, 21 Feb 2020 00:50:27 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1582275027; cv=none; d=google.com; s=arc-20160816; b=F1Xa0i1EkJpXaifb1+QFDziP0I0rKdXwGGhDPFeSXbwsKZJ1U6ecFPD6VPiL3XekAk X5AJm/yL3dxJZAUL9IE+0uUY5Ww8kzbMDL1TdjUHk8uTe+X29E/gWNOjM9++ltXvkaOB ZvQ0GLfq/F6Ym5hLDCaqXOPCwQlIiDqS8SO1XJNIZSPKpnaE7XPPm1K/XJoGkVzLib02 0SeYyj0k0IxOD25sAmb+XRS0iQnodobgTXWEVgAtwmiKJ4sky+FNSCm202p0kEzWneuv RKdnHfdgvj8lzHxoT3OXGoEMqt3K4iC6WNzFbb6UJoYid6Q18P9lnMelr3uxI1E9PI0Y v2/w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=sMadx9kWlv28mZMQ81nd9U4/l5Ef9DZzbgmYbGY54q4=; b=atPihOrv/H2LzS9uty22b6uQiIBVwps20HNbkD5JGEHZijqC/wvn16E92xtSIzuvg5 n//kHpkcZWPOxP1oF9wlGUaTNjrj38hpcY0xRl60ybYx7MWtVAanGCir1TSX45K18fUW mgulTHdiHAsxNnpz8SNDTp29OZHMC3dNyMYPTyWpdGdJPJzfUMPzXjBz9mOkyxnKxEVB taPqIi9r0P8RBBqXHiKiNDKoAuw5jxrgHlUWijZWuXLCB9Nz2Au9pcD1oAVF/v+r31Sy yw4DIvMEwVWJlMElyx5WF5/02RY1HKOEmmbWyD6d64TOFe+zdVenB1jvOlv5ol/r3c96 +wBw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=mYWAp57d; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id z23si1214853oti.34.2020.02.21.00.50.15; Fri, 21 Feb 2020 00:50:27 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=mYWAp57d; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730437AbgBUItt (ORCPT + 99 others); Fri, 21 Feb 2020 03:49:49 -0500 Received: from mail.kernel.org ([198.145.29.99]:39316 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727973AbgBUHof (ORCPT ); Fri, 21 Feb 2020 02:44:35 -0500 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 83020222C4; Fri, 21 Feb 2020 07:44:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1582271074; bh=w72o9lcZbaZku5BCWTjN8fzU+n6bQrTtcghNJBGySBw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=mYWAp57dY2cifJSDIFKJQ5F/V+8G+sa70SB4RsrXueP1AmWIOnV9llbWayFP3rY8y vmhVfCZc6SeT/UDWHlmvG+1sFBWlB2AVvQLf4GmpOoA8k6PugUoUbaHcAYDm4GxaOk YbkWGPGKvDJrVmZoaDvl9Xax3lO2KJpXNQfJy1NI= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Nikola Cornij , Jun Lei , Rodrigo Siqueira , Alex Deucher , Sasha Levin Subject: [PATCH 5.5 029/399] drm/amd/display: Map ODM memory correctly when doing ODM combine Date: Fri, 21 Feb 2020 08:35:54 +0100 Message-Id: <20200221072405.176809360@linuxfoundation.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200221072402.315346745@linuxfoundation.org> References: <20200221072402.315346745@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Nikola Cornij [ Upstream commit ec5b356c58941bb8930858155d9ce14ceb3d30a0 ] [why] Up to 4 ODM memory pieces are required per ODM combine and cannot overlap, i.e. each ODM "session" has to use its own memory pieces. The ODM-memory mapping is currently broken for generic case. The maximum number of memory pieces is ASIC-dependent, but it's always big enough to satisfy maximum number of ODM combines. Memory pieces are mapped as a bit-map, i.e. one memory piece corresponds to one bit. The OPTC doing ODM needs to select memory pieces by setting the corresponding bits, making sure there's no overlap with other OPTC instances that might be doing ODM. The current mapping works only for OPTC instance indexes smaller than 3. For instance indexes 3 and up it practically maps no ODM memory, causing black, gray or white screen in display configs that include ODM on OPTC instance 3 or up. [how] Statically map two unique ODM memory pieces for each OPTC instance and piece them together when programming ODM combine mode. Signed-off-by: Nikola Cornij Reviewed-by: Jun Lei Acked-by: Rodrigo Siqueira Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- .../gpu/drm/amd/display/dc/dcn20/dcn20_optc.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_optc.c b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_optc.c index 3b613fb93ef80..0162d3ffe268f 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_optc.c +++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_optc.c @@ -233,12 +233,13 @@ void optc2_set_odm_combine(struct timing_generator *optc, int *opp_id, int opp_c struct dc_crtc_timing *timing) { struct optc *optc1 = DCN10TG_FROM_TG(optc); - /* 2 pieces of memory required for up to 5120 displays, 4 for up to 8192 */ int mpcc_hactive = (timing->h_addressable + timing->h_border_left + timing->h_border_right) / opp_cnt; - int memory_mask = mpcc_hactive <= 2560 ? 0x3 : 0xf; + uint32_t memory_mask; uint32_t data_fmt = 0; + ASSERT(opp_cnt == 2); + /* TODO: In pseudocode but does not affect maximus, delete comment if we dont need on asic * REG_SET(OTG_GLOBAL_CONTROL2, 0, GLOBAL_UPDATE_LOCK_EN, 1); * Program OTG register MASTER_UPDATE_LOCK_DB_X/Y to the position before DP frame start @@ -246,9 +247,17 @@ void optc2_set_odm_combine(struct timing_generator *optc, int *opp_id, int opp_c * MASTER_UPDATE_LOCK_DB_X, 160, * MASTER_UPDATE_LOCK_DB_Y, 240); */ + + /* 2 pieces of memory required for up to 5120 displays, 4 for up to 8192, + * however, for ODM combine we can simplify by always using 4. + * To make sure there's no overlap, each instance "reserves" 2 memories and + * they are uniquely combined here. + */ + memory_mask = 0x3 << (opp_id[0] * 2) | 0x3 << (opp_id[1] * 2); + if (REG(OPTC_MEMORY_CONFIG)) REG_SET(OPTC_MEMORY_CONFIG, 0, - OPTC_MEM_SEL, memory_mask << (optc->inst * 4)); + OPTC_MEM_SEL, memory_mask); if (timing->pixel_encoding == PIXEL_ENCODING_YCBCR422) data_fmt = 1; @@ -257,7 +266,6 @@ void optc2_set_odm_combine(struct timing_generator *optc, int *opp_id, int opp_c REG_UPDATE(OPTC_DATA_FORMAT_CONTROL, OPTC_DATA_FORMAT, data_fmt); - ASSERT(opp_cnt == 2); REG_SET_3(OPTC_DATA_SOURCE_SELECT, 0, OPTC_NUM_OF_INPUT_SEGMENT, 1, OPTC_SEG0_SRC_SEL, opp_id[0], -- 2.20.1