Received: by 2002:a05:6a11:4021:0:0:0:0 with SMTP id ky33csp1800039pxb; Thu, 16 Sep 2021 16:14:50 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzJ3noOJd6NwHiNLCBR4nJj0T5xUcylsFOEJhajSJNuUI1HaDxxY56ciuTIS9LF7RXjhZCS X-Received: by 2002:a50:8d5b:: with SMTP id t27mr9223456edt.316.1631834090273; Thu, 16 Sep 2021 16:14:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1631834090; cv=none; d=google.com; s=arc-20160816; b=aBDRTjwn+GkHdN988lGgG64VuOwwbSIUVwgTLkxoyMwyIgMFnvO062OlYFBYyE8ouo JtW1ptzmfTQbi80l2OoQIhuus0/8JoorbPXsupP74rdLvvLfI2h7FuNETEcYUF0JE9pT s4QRfuoIa8wSmOo9nE79xdY0EETgBcMzhWUSaru65Zu0koMsbsZ/kMEXhzEI+4I5G+B9 TlLoiSOOrST00NXPCRIj7jmUQUFtTL4yOSxwphPapoZPZ1kmepTTgiia+FrghZQb4gCi d2r5SL3vbfSGiPXj1Nt004kP1NHr0nSyoGuapeC08ljm6GNKVONUAWz/PegWOxSwQMi/ jBgw== 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=sb/BWW4FEEwxKJP3Qk3nQPWVDICOKOodkxl8JlbGU/M=; b=XMJwvp0tL3y/3JWj1yd9n5M/O6dCVVh4sw9UBJGadDcMCMmj1DzAWvYQ5XyfxJEHX3 jNGEUUbfjtgykRTbFv7fUZCglzS8VpLq5672hMFyNc0IPL5lDI8CATnZ+m/PQhKhPljF dx2BnkAHGF2bCeoxPSKcYBeV7EwnUar4FLIHinC6AUbvrg7ot2i1pNSUq4UkvHHZqsKG RtggNiFN9rx6+cRexscrzKvJunsu9pN//48HAFOneoTOr3Gx0ZshcB8o4M7CJvSp81st Xq6Nz/KpRXrRdjO9nnr1MA4YUkYHXTM1hRoMbhOiEJDfwezqp2c/L0SDCHjmUY9oDCEC zLtg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=yCPMKEYK; 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 b9si4666902ejd.404.2021.09.16.16.14.26; Thu, 16 Sep 2021 16:14:50 -0700 (PDT) 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=yCPMKEYK; 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 S242430AbhIPQv5 (ORCPT + 99 others); Thu, 16 Sep 2021 12:51:57 -0400 Received: from mail.kernel.org ([198.145.29.99]:57406 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1344670AbhIPQqb (ORCPT ); Thu, 16 Sep 2021 12:46:31 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 2A19A6135F; Thu, 16 Sep 2021 16:26:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1631809593; bh=eKh/RbB0FE66jRLZpFyPGhzq2+Rphm3XQMLhLeNhtUM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=yCPMKEYKHLjwcw4o9Ac/AH+WVrSg56DyCUadR8bPSee9uLpiIcHV8tRBmKYKol07V h6hE6apZfDPWcN1jcrKfEsfQU/MfXd5DUFZP9gUMr/my1Y7khoXNMVtjr644vU0Ydw ysamNW8RlH18yLifU24ZM794Ag4UTPx06hlm7YWc= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Laurentiu Tudor , Sasha Levin Subject: [PATCH 5.13 179/380] bus: fsl-mc: fix mmio base address for child DPRCs Date: Thu, 16 Sep 2021 17:58:56 +0200 Message-Id: <20210916155810.163220070@linuxfoundation.org> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20210916155803.966362085@linuxfoundation.org> References: <20210916155803.966362085@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: Laurentiu Tudor [ Upstream commit 8990f96a012f42543005b07d9e482694192e9309 ] Some versions of the MC firmware wrongly report 0 for register base address of the DPMCP associated with child DPRC objects thus rendering them unusable. This is particularly troublesome in ACPI boot scenarios where the legacy way of extracting this base address from the device tree does not apply. Given that DPMCPs share the same base address, workaround this by using the base address extracted from the root DPRC container. Signed-off-by: Laurentiu Tudor Link: https://lore.kernel.org/r/20210715140718.8513-8-laurentiu.tudor@nxp.com Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin --- drivers/bus/fsl-mc/fsl-mc-bus.c | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/drivers/bus/fsl-mc/fsl-mc-bus.c b/drivers/bus/fsl-mc/fsl-mc-bus.c index 74faaf3e4e27..57f78d1cc9d8 100644 --- a/drivers/bus/fsl-mc/fsl-mc-bus.c +++ b/drivers/bus/fsl-mc/fsl-mc-bus.c @@ -67,6 +67,8 @@ struct fsl_mc_addr_translation_range { #define MC_FAPR_PL BIT(18) #define MC_FAPR_BMT BIT(17) +static phys_addr_t mc_portal_base_phys_addr; + /** * fsl_mc_bus_match - device to driver matching callback * @dev: the fsl-mc device to match against @@ -702,14 +704,30 @@ static int fsl_mc_device_get_mmio_regions(struct fsl_mc_device *mc_dev, * If base address is in the region_desc use it otherwise * revert to old mechanism */ - if (region_desc.base_address) + if (region_desc.base_address) { regions[i].start = region_desc.base_address + region_desc.base_offset; - else + } else { error = translate_mc_addr(mc_dev, mc_region_type, region_desc.base_offset, ®ions[i].start); + /* + * Some versions of the MC firmware wrongly report + * 0 for register base address of the DPMCP associated + * with child DPRC objects thus rendering them unusable. + * This is particularly troublesome in ACPI boot + * scenarios where the legacy way of extracting this + * base address from the device tree does not apply. + * Given that DPMCPs share the same base address, + * workaround this by using the base address extracted + * from the root DPRC container. + */ + if (is_fsl_mc_bus_dprc(mc_dev) && + regions[i].start == region_desc.base_offset) + regions[i].start += mc_portal_base_phys_addr; + } + if (error < 0) { dev_err(parent_dev, "Invalid MC offset: %#x (for %s.%d\'s region %d)\n", @@ -1125,6 +1143,8 @@ static int fsl_mc_bus_probe(struct platform_device *pdev) plat_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); mc_portal_phys_addr = plat_res->start; mc_portal_size = resource_size(plat_res); + mc_portal_base_phys_addr = mc_portal_phys_addr & ~0x3ffffff; + error = fsl_create_mc_io(&pdev->dev, mc_portal_phys_addr, mc_portal_size, NULL, FSL_MC_IO_ATOMIC_CONTEXT_PORTAL, &mc_io); -- 2.30.2