Received: by 2002:a05:6358:700f:b0:131:369:b2a3 with SMTP id 15csp781516rwo; Wed, 2 Aug 2023 04:14:30 -0700 (PDT) X-Google-Smtp-Source: APBJJlHwHGI0kD7LufkEzaRGhuyp0g+4Dwiopu6XRQbpX4i2ZH5+22DPO4/1nr19bNFzFPB72l6X X-Received: by 2002:a05:6a20:2455:b0:137:a3c9:aaa9 with SMTP id t21-20020a056a20245500b00137a3c9aaa9mr17363566pzc.16.1690974870572; Wed, 02 Aug 2023 04:14:30 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1690974870; cv=none; d=google.com; s=arc-20160816; b=UpaK9jyk6LJEqxzNjBuRpLFWEOd7ZlkEd5C8BBJ/v1mHHEcgYtEzZN01t6PmpGgiuU ms11PTxIG0xQa0A/HbUKLnUv8aX8DztWpfC/DGB+Vk1OtJQPUYsLPhIhyUuqYa9ElqRG E7n9yE309J/uYJIIIwKoa0LrIJU5/qgoMgUI88nEFmW3UqtxJTabsZvvGcZ1za+XCDoI NcU22Wpc0G4h7MFBLIpkAjTtXy0OsRWqMH1ifV2U5+H5+kcbVlYf4GkupZG4GEPxJyII JNDuilxI0mBZFqdF/SC8Dum3sZagjGREV6Eq55fNkjufpYQTvQUO7cD05e2L0MVlX1jK cTPw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:in-reply-to:content-transfer-encoding :content-disposition:mime-version:references:message-id:subject:cc :to:from:date:dkim-signature; bh=L8NP9DkKY6JdVZzY2lwLnOWwc4l5dQtWphVsytFibP0=; fh=ExlEGlmkGyjeISk1zckaWLaqvyz+q0oDvy16AK5Ajek=; b=Ssf740TwYPJi3gHaT7S4pQ7IFRSpfAJKZ8hc0pOyME6V2Te+oKSJYWmNq1IBHvMsHX A2GKAte/EoZ6iYJKGbnZXV7Z0yEtujKW+MIomXcmYVZCk/OoLJvaET8e65QAkKBXwPc4 DKXbpIaVDFpyir2vmBnnhbUx2tBrofPFfJW1hxUFfEetFdFq8UnV7AW7hXat1DmufE5d YqvPT5rJ1gA2ru51jb8B4vM9dzmLKxFbtSFMhnMMbqn7xAAnaIzbH4qrHoGtCkRn4QB4 LwoaAA/U47CuKCnXgWaYoVc3eNwx+8vtevxlYCmafBU6Y5INq/y60aBVf8Qn0udT8MkP j9WQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=ApfwCvXI; spf=pass (google.com: domain of linux-wireless-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-wireless-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id w184-20020a6282c1000000b00679a6ce03f6si7047680pfd.59.2023.08.02.04.14.19; Wed, 02 Aug 2023 04:14:30 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-wireless-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=ApfwCvXI; spf=pass (google.com: domain of linux-wireless-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-wireless-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233868AbjHBLB0 (ORCPT + 58 others); Wed, 2 Aug 2023 07:01:26 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39392 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232986AbjHBLBY (ORCPT ); Wed, 2 Aug 2023 07:01:24 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A481310FB for ; Wed, 2 Aug 2023 04:01:23 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 3EFB96191F for ; Wed, 2 Aug 2023 11:01:23 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id DCD74C433C7; Wed, 2 Aug 2023 11:01:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1690974082; bh=XKuLTtq7vHM7OrcnA+bCh8OFj1zxjB+o9QgZMTt1OJ0=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=ApfwCvXImiiCS2oCn28D8X7MQR/dQNtUoV85WTzzIhi3hq4SiAKxpS2gZdXJqhvX+ TCJkcO4/BRpyHzFNAWo+D5fLWA4lNmy4+ce1a8rh1qb/OzLmJaK3zovZBFW88cQa5b Q79fg1jtM4mBgserT4VOXFlbiDiRYDl1R2tdGxV38Er/3DtMCdhSxUSeupJjMejuSw kp8Z7IwcMy8E7aPyvtViEYjdImL6amh7V8n3qDlDAhdO0boGb4ypp1Kf3lpuZVoJIB tIhDkm5xyqi0WlmDZNvsLIoyqqM1B+7MK0SJO4mk6UsDP5L4IwOHxyEUzNXvMw1Otj FvsAg5DUERgAA== Date: Wed, 2 Aug 2023 16:31:10 +0530 From: Manivannan Sadhasivam To: Kalle Valo Cc: mhi@lists.linux.dev, ath11k@lists.infradead.org, linux-wireless@vger.kernel.org Subject: Re: [PATCH v4 1/3] bus: mhi: host: allow MHI client drivers to provide the firmware via a pointer Message-ID: <20230802110110.GD57374@thinkpad> References: <20230727100430.3603551-1-kvalo@kernel.org> <20230727100430.3603551-2-kvalo@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20230727100430.3603551-2-kvalo@kernel.org> X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF, RCVD_IN_DNSWL_BLOCKED,SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org On Thu, Jul 27, 2023 at 01:04:28PM +0300, Kalle Valo wrote: > From: Kalle Valo > > Currently MHI loads the firmware image from the path provided by client > devices. ath11k needs to support firmware image embedded along with meta data > (named as firmware-2.bin). So allow the client driver to request the firmware > file from user space on it's own and provide the firmware image data and size > to MHI via a pointer struct mhi_controller::fw_data. > > This is an optional feature, if fw_data is NULL MHI load the firmware using the > name from struct mhi_controller::fw_image string as before. > > Tested with ath11k and WCN6855 hw2.0. > > Signed-off-by: Kalle Valo Reviewed-by: Manivannan Sadhasivam I can apply this for 6.6 and then you can merge ath11k changes for 6.7. But if you want all of these patches to be applied for 6.6, then we can go with an immutable branch. Let me know! - Mani > --- > drivers/bus/mhi/host/boot.c | 34 +++++++++++++++++++++++++--------- > include/linux/mhi.h | 6 ++++++ > 2 files changed, 31 insertions(+), 9 deletions(-) > > diff --git a/drivers/bus/mhi/host/boot.c b/drivers/bus/mhi/host/boot.c > index d2a19b07ccb8..edc0ec5a0933 100644 > --- a/drivers/bus/mhi/host/boot.c > +++ b/drivers/bus/mhi/host/boot.c > @@ -365,12 +365,10 @@ int mhi_alloc_bhie_table(struct mhi_controller *mhi_cntrl, > } > > static void mhi_firmware_copy(struct mhi_controller *mhi_cntrl, > - const struct firmware *firmware, > + const u8 *buf, size_t remainder, > struct image_info *img_info) > { > - size_t remainder = firmware->size; > size_t to_cpy; > - const u8 *buf = firmware->data; > struct mhi_buf *mhi_buf = img_info->mhi_buf; > struct bhi_vec_entry *bhi_vec = img_info->bhi_vec; > > @@ -393,9 +391,10 @@ void mhi_fw_load_handler(struct mhi_controller *mhi_cntrl) > struct device *dev = &mhi_cntrl->mhi_dev->dev; > enum mhi_pm_state new_state; > const char *fw_name; > + const u8 *fw_data; > void *buf; > dma_addr_t dma_addr; > - size_t size; > + size_t size, fw_sz; > int i, ret; > > if (MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state)) { > @@ -425,6 +424,20 @@ void mhi_fw_load_handler(struct mhi_controller *mhi_cntrl) > fw_name = (mhi_cntrl->ee == MHI_EE_EDL) ? > mhi_cntrl->edl_image : mhi_cntrl->fw_image; > > + /* check if the driver has already provided the firmware data */ > + if (!fw_name && mhi_cntrl->fbc_download && > + mhi_cntrl->fw_data && mhi_cntrl->fw_sz) { > + if (!mhi_cntrl->sbl_size) { > + dev_err(dev, "fw_data provided but no sbl_size\n"); > + goto error_fw_load; > + } > + > + size = mhi_cntrl->sbl_size; > + fw_data = mhi_cntrl->fw_data; > + fw_sz = mhi_cntrl->fw_sz; > + goto skip_req_fw; > + } > + > if (!fw_name || (mhi_cntrl->fbc_download && (!mhi_cntrl->sbl_size || > !mhi_cntrl->seg_len))) { > dev_err(dev, > @@ -444,6 +457,10 @@ void mhi_fw_load_handler(struct mhi_controller *mhi_cntrl) > if (size > firmware->size) > size = firmware->size; > > + fw_data = firmware->data; > + fw_sz = firmware->size; > + > +skip_req_fw: > buf = dma_alloc_coherent(mhi_cntrl->cntrl_dev, size, &dma_addr, > GFP_KERNEL); > if (!buf) { > @@ -452,7 +469,7 @@ void mhi_fw_load_handler(struct mhi_controller *mhi_cntrl) > } > > /* Download image using BHI */ > - memcpy(buf, firmware->data, size); > + memcpy(buf, fw_data, size); > ret = mhi_fw_load_bhi(mhi_cntrl, dma_addr, size); > dma_free_coherent(mhi_cntrl->cntrl_dev, size, buf, dma_addr); > > @@ -464,7 +481,7 @@ void mhi_fw_load_handler(struct mhi_controller *mhi_cntrl) > } > > /* Wait for ready since EDL image was loaded */ > - if (fw_name == mhi_cntrl->edl_image) { > + if (fw_name && fw_name == mhi_cntrl->edl_image) { > release_firmware(firmware); > goto fw_load_ready_state; > } > @@ -478,15 +495,14 @@ void mhi_fw_load_handler(struct mhi_controller *mhi_cntrl) > * device transitioning into MHI READY state > */ > if (mhi_cntrl->fbc_download) { > - ret = mhi_alloc_bhie_table(mhi_cntrl, &mhi_cntrl->fbc_image, > - firmware->size); > + ret = mhi_alloc_bhie_table(mhi_cntrl, &mhi_cntrl->fbc_image, fw_sz); > if (ret) { > release_firmware(firmware); > goto error_fw_load; > } > > /* Load the firmware into BHIE vec table */ > - mhi_firmware_copy(mhi_cntrl, firmware, mhi_cntrl->fbc_image); > + mhi_firmware_copy(mhi_cntrl, fw_data, fw_sz, mhi_cntrl->fbc_image); > } > > release_firmware(firmware); > diff --git a/include/linux/mhi.h b/include/linux/mhi.h > index f6de4b6ecfc7..039943ec4d4e 100644 > --- a/include/linux/mhi.h > +++ b/include/linux/mhi.h > @@ -299,6 +299,10 @@ struct mhi_controller_config { > * @iova_start: IOMMU starting address for data (required) > * @iova_stop: IOMMU stop address for data (required) > * @fw_image: Firmware image name for normal booting (optional) > + * @fw_data: Firmware image data content for normal booting, used only > + * if fw_image is NULL and fbc_download is true (optional) > + * @fw_sz: Firmware image data size for normal booting, used only if fw_image > + * is NULL and fbc_download is true (optional) > * @edl_image: Firmware image name for emergency download mode (optional) > * @rddm_size: RAM dump size that host should allocate for debugging purpose > * @sbl_size: SBL image size downloaded through BHIe (optional) > @@ -384,6 +388,8 @@ struct mhi_controller { > dma_addr_t iova_start; > dma_addr_t iova_stop; > const char *fw_image; > + const u8 *fw_data; > + size_t fw_sz; > const char *edl_image; > size_t rddm_size; > size_t sbl_size; > -- > 2.39.2 > > -- மணிவண்ணன் சதாசிவம்