Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp3941463pxb; Tue, 2 Mar 2021 02:30:51 -0800 (PST) X-Google-Smtp-Source: ABdhPJw1cadEI84lKbxMrJYQlqSBZWRyGeYApOJud+wUkivuq92lLCSgORLvumKcGHg4ql6b0deP X-Received: by 2002:a17:906:f912:: with SMTP id lc18mr18852079ejb.159.1614681051273; Tue, 02 Mar 2021 02:30:51 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1614681051; cv=none; d=google.com; s=arc-20160816; b=P9YqeYbS0bLLCj3ktGuCVB5gOBnyJ4z3Lqvyrb9X6uWUce4uu80YFtrH1CWv/U/Q50 Waz/yUcqbGAncDdYgGYamXjEdOrJxsLo7tajRsDIzFi9XC/o9nUYdbzE4DUfFso89iYm Fma4osZQILzNVuNBfnI1FpqQXAFlGQpKePvg6GbD2eMzw5WI1402vXniAVRCGu8JdVrG 8zaE8S3puqiDZrvAFZ4T7q4BBadP8cX8EWm4dH/JUTiF3Y7moMBX7kTKfie3SCgDD2BC QnV4qmNLHTNdAspU/33xBbE/v8E86In3Vug4ZLkf5UeKJsuBF67PLXzNsn4KBCHFuQ3o KxNA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=hxXj3MgglNHY8hHDni4eBcNrCFUCaeFpJzBlkyks7po=; b=m3yJnxqr6WE0AW8y0pM+rj73JC5/fGS599ly+JJ3+48mk3nmLc6opmDqAvxVjQU20g mylamAqox7SY2woeLtpgxTaQFjq6iYRrJzwO1IcZo6enjpAuQE6k/WwVpB6qVmcPdYvA buUSUFWpnMaiyRIae4w8MjAaWGkbVFcpVn2EMGyG3lYJIr1t4o98ieUYc5279IQR8Cal nnuPdwkMvsrlwm1mE9RiZgOZAgzdXYT2g08VgRIvMkXvhICR03SSTC74wFC1biL5p3o9 dU5JggavgR5z+sKGGuS0jXw5T8mePC8ypIcnGMr1ZFZAGWYIXZij0rfBLFk3WTmRtq44 wsiQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=BuEP8Ecs; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id gn23si99189ejc.333.2021.03.02.02.30.27; Tue, 02 Mar 2021 02:30:51 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=BuEP8Ecs; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1379747AbhCBBbC (ORCPT + 99 others); Mon, 1 Mar 2021 20:31:02 -0500 Received: from mail.kernel.org ([198.145.29.99]:43878 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S241286AbhCATS4 (ORCPT ); Mon, 1 Mar 2021 14:18:56 -0500 Received: by mail.kernel.org (Postfix) with ESMTPSA id 8AA7C64F8A; Mon, 1 Mar 2021 17:15:04 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1614618905; bh=33YRk7hgs0ttCmBGsad2rzAIxUcYvHo0kfjQ23DuSyg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=BuEP8Ecs8+Npu/Reg+j/HXdvTN2k+jjWZJ9NPRKEZe6/zxEZ8aea0jPbVCXz+c2dM i/Uepo4S5SeOyePBoU4JN0/IehE056iejx2/uYDrXC4WyNjg7tXRTvAM3fAowqB0/L LFCEdUfYm4pFrDCDS/WGloRt/x8lA8eX15226Sw0= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Dave Stevenson , Dom Cobley , Maxime Ripard , Hans Verkuil , Maarten Lankhorst , Sasha Levin Subject: [PATCH 5.10 230/663] drm/vc4: hdmi: Fix register offset with longer CEC messages Date: Mon, 1 Mar 2021 17:07:58 +0100 Message-Id: <20210301161153.188297086@linuxfoundation.org> X-Mailer: git-send-email 2.30.1 In-Reply-To: <20210301161141.760350206@linuxfoundation.org> References: <20210301161141.760350206@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Dom Cobley [ Upstream commit 4a59ed546c0511f01a4bf6b886fe34b6cce2513f ] The code prior to 311e305fdb4e ("drm/vc4: hdmi: Implement a register layout abstraction") was relying on the fact that the register offset was incremented by 4 for each readl call. That worked since the register width is 4 bytes. However, since that commit the HDMI_READ macro is now taking an enum, and the offset doesn't increment by 4 but 1 now. Divide the index by 4 to fix this. Fixes: 311e305fdb4e ("drm/vc4: hdmi: Implement a register layout abstraction") Reviewed-by: Dave Stevenson Signed-off-by: Dom Cobley Signed-off-by: Maxime Ripard Acked-by: Hans Verkuil Tested-by: Hans Verkuil Link: https://patchwork.freedesktop.org/patch/msgid/20210111142309.193441-4-maxime@cerno.tech (cherry picked from commit e9c9481f373eb7344f9e973eb28fc6e9d0f46485) Signed-off-by: Maarten Lankhorst Signed-off-by: Sasha Levin --- drivers/gpu/drm/vc4/vc4_hdmi.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c index 1b2b5e3986ebd..f58098d2dc1d5 100644 --- a/drivers/gpu/drm/vc4/vc4_hdmi.c +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c @@ -1313,13 +1313,20 @@ static irqreturn_t vc4_cec_irq_handler_thread(int irq, void *priv) static void vc4_cec_read_msg(struct vc4_hdmi *vc4_hdmi, u32 cntrl1) { + struct drm_device *dev = vc4_hdmi->connector.dev; struct cec_msg *msg = &vc4_hdmi->cec_rx_msg; unsigned int i; msg->len = 1 + ((cntrl1 & VC4_HDMI_CEC_REC_WRD_CNT_MASK) >> VC4_HDMI_CEC_REC_WRD_CNT_SHIFT); + + if (msg->len > 16) { + drm_err(dev, "Attempting to read too much data (%d)\n", msg->len); + return; + } + for (i = 0; i < msg->len; i += 4) { - u32 val = HDMI_READ(HDMI_CEC_RX_DATA_1 + i); + u32 val = HDMI_READ(HDMI_CEC_RX_DATA_1 + (i >> 2)); msg->msg[i] = val & 0xff; msg->msg[i + 1] = (val >> 8) & 0xff; @@ -1412,11 +1419,17 @@ static int vc4_hdmi_cec_adap_transmit(struct cec_adapter *adap, u8 attempts, u32 signal_free_time, struct cec_msg *msg) { struct vc4_hdmi *vc4_hdmi = cec_get_drvdata(adap); + struct drm_device *dev = vc4_hdmi->connector.dev; u32 val; unsigned int i; + if (msg->len > 16) { + drm_err(dev, "Attempting to transmit too much data (%d)\n", msg->len); + return -ENOMEM; + } + for (i = 0; i < msg->len; i += 4) - HDMI_WRITE(HDMI_CEC_TX_DATA_1 + i, + HDMI_WRITE(HDMI_CEC_TX_DATA_1 + (i >> 2), (msg->msg[i]) | (msg->msg[i + 1] << 8) | (msg->msg[i + 2] << 16) | -- 2.27.0