Received: by 2002:a25:c205:0:0:0:0:0 with SMTP id s5csp2401361ybf; Mon, 2 Mar 2020 07:56:35 -0800 (PST) X-Google-Smtp-Source: ADFU+vt5afd2SVXcaKtQs5B1PBM5sVjRs6s6713eJ9j5J79TkgOtboLiOgP5df6aS/VYudXK/rzM X-Received: by 2002:a54:450d:: with SMTP id l13mr91837oil.117.1583164595163; Mon, 02 Mar 2020 07:56:35 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1583164595; cv=none; d=google.com; s=arc-20160816; b=cSeV/RmDYw8Gl1kWoM5tv+0XQEk46PoJPEffJySo1m1W4lXK1osE4tKzF41XupxdvI 80WI1Q7Aji7OEv6xdzjSIPvfkS++BoVQ/za3GIDec0kadZSIBXYOsC71X2jj/4XnJUsU saTeLxaoO3ris4QQ9O1T3z/DLzynexr6NhoUtSKDCI4ary3nkNUcj4TfEoq/yntjQ8Be KR4GJuuhWqKy/k10LUPOx59bBwQEL9r7W6W+qLldmM19XvXea0tjNANykJN9SoZGIWz8 olYeGLBR9lpGeZg6HVfpaiC8KEurYF5wXxmxPlkFqxmYbDBCoyg09mVjPx2icq8JhBEj vsBw== 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 :references:in-reply-to:message-id:date:subject:cc:to:from; bh=CpEQvyW2FPhRyXCGcon/lUu1cSVmaVgU8lsr3hdGxMo=; b=G81aw7AhpKiqYh8Ann/5hGrvBZGUIu/wm8v23ZaNnbC9ZiNpvzrKWCCe9nzke05sF+ WvLz3ERjlBxmg+KNa4opO5/Bj/C3yCxYXmGNq5z+8HvJT/b1Td1nCOBYo5uT/Pe4x2kx 3de0p55iL9nxpJvmuCvbV8aMOypwmTvYNTe2tQW6qAxqhrNlnDowVKl9CvYcoy8p39fp 3FirPaPc4/4LQhZpomAh36p01vYhCAS+xCZ9E4wpuMS5fx0STzcRn+FsBeDHBFhA9gHX Vvx9WXo+dTlnPdfEkLH/D3iyVP1Ppq6BQpZvJX4Tt8M2ldV59qMl/MjenHj4yqGmW11O wlfA== ARC-Authentication-Results: i=1; mx.google.com; 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 z62si6193557oiz.271.2020.03.02.07.56.23; Mon, 02 Mar 2020 07:56:35 -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; 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 S1727441AbgCBP4L (ORCPT + 99 others); Mon, 2 Mar 2020 10:56:11 -0500 Received: from mx2.suse.de ([195.135.220.15]:51296 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727328AbgCBP4H (ORCPT ); Mon, 2 Mar 2020 10:56:07 -0500 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id B0C2EAED7; Mon, 2 Mar 2020 15:56:04 +0000 (UTC) From: Nicolas Saenz Julienne To: linux-kernel@vger.kernel.org, Nicolas Saenz Julienne , Florian Fainelli , Ray Jui , Scott Branden , bcm-kernel-feedback-list@broadcom.com Cc: linux-usb@vger.kernel.org, linux-rpi-kernel@lists.infradead.org, linux-arm-kernel@lists.infradead.org, gregkh@linuxfoundation.org, tim.gover@raspberrypi.org, linux-pci@vger.kernel.org, wahrenst@gmx.net Subject: [PATCH v3 2/4] firmware: raspberrypi: Introduce vl805 init routine Date: Mon, 2 Mar 2020 16:55:26 +0100 Message-Id: <20200302155528.19505-3-nsaenzjulienne@suse.de> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200302155528.19505-1-nsaenzjulienne@suse.de> References: <20200302155528.19505-1-nsaenzjulienne@suse.de> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On the Raspberry Pi 4, after a PCI reset, VL805's firmware may either be loaded directly from an EEPROM or, if not present, by the SoC's VideCore. The function informs VideCore that VL805 was just reset, or requests for a probe defer. Based on Tim Gover's downstream implementation. Signed-off-by: Nicolas Saenz Julienne Reviewed-by: Florian Fainelli --- Changes since v1: - Move include into .c file and add forward declaration to .h drivers/firmware/raspberrypi.c | 38 ++++++++++++++++++++++ include/soc/bcm2835/raspberrypi-firmware.h | 7 ++++ 2 files changed, 45 insertions(+) diff --git a/drivers/firmware/raspberrypi.c b/drivers/firmware/raspberrypi.c index da26a584dca0..cbb495aff6a0 100644 --- a/drivers/firmware/raspberrypi.c +++ b/drivers/firmware/raspberrypi.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #define MBOX_MSG(chan, data28) (((data28) & ~0xf) | ((chan) & 0xf)) @@ -286,6 +287,43 @@ struct rpi_firmware *rpi_firmware_get(struct device_node *firmware_node) } EXPORT_SYMBOL_GPL(rpi_firmware_get); +/* + * On the Raspberry Pi 4, after a PCI reset, VL805's firmware may either be + * loaded directly from an EEPROM or, if not present, by the SoC's VideCore. + * Inform VideCore that VL805 was just reset, or defer xhci's probe if not yet + * joinable trough the mailbox interface. + */ +int rpi_firmware_init_vl805(struct pci_dev *pdev) +{ + struct device_node *fw_np; + struct rpi_firmware *fw; + u32 dev_addr; + int ret; + + fw_np = of_find_compatible_node(NULL, NULL, + "raspberrypi,bcm2835-firmware"); + if (!fw_np) + return 0; + + fw = rpi_firmware_get(fw_np); + of_node_put(fw_np); + if (!fw) + return -EPROBE_DEFER; + + dev_addr = pdev->bus->number << 20 | PCI_SLOT(pdev->devfn) << 15 | + PCI_FUNC(pdev->devfn) << 12; + + ret = rpi_firmware_property(fw, RPI_FIRMWARE_NOTIFY_XHCI_RESET, + &dev_addr, sizeof(dev_addr)); + if (ret) + return ret; + + dev_dbg(&pdev->dev, "loaded Raspberry Pi's VL805 firmware\n"); + + return 0; +} +EXPORT_SYMBOL_GPL(rpi_firmware_init_vl805); + static const struct of_device_id rpi_firmware_of_match[] = { { .compatible = "raspberrypi,bcm2835-firmware", }, {}, diff --git a/include/soc/bcm2835/raspberrypi-firmware.h b/include/soc/bcm2835/raspberrypi-firmware.h index cc9cdbc66403..c161bdab759d 100644 --- a/include/soc/bcm2835/raspberrypi-firmware.h +++ b/include/soc/bcm2835/raspberrypi-firmware.h @@ -10,6 +10,7 @@ #include struct rpi_firmware; +struct pci_dev; enum rpi_firmware_property_status { RPI_FIRMWARE_STATUS_REQUEST = 0, @@ -141,6 +142,7 @@ int rpi_firmware_property(struct rpi_firmware *fw, int rpi_firmware_property_list(struct rpi_firmware *fw, void *data, size_t tag_size); struct rpi_firmware *rpi_firmware_get(struct device_node *firmware_node); +int rpi_firmware_init_vl805(struct pci_dev *pdev); #else static inline int rpi_firmware_property(struct rpi_firmware *fw, u32 tag, void *data, size_t len) @@ -158,6 +160,11 @@ static inline struct rpi_firmware *rpi_firmware_get(struct device_node *firmware { return NULL; } + +static int rpi_firmware_init_vl805(struct pci_dev *pdev) +{ + return 0; +} #endif #endif /* __SOC_RASPBERRY_FIRMWARE_H__ */ -- 2.25.1