From patchwork Mon Mar 23 12:30:56 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Manivannan Sadhasivam X-Patchwork-Id: 11452843 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 1847D1392 for ; Mon, 23 Mar 2020 12:31:17 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id E9DDD20719 for ; Mon, 23 Mar 2020 12:31:16 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="mHwm7rXl" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728217AbgCWMbQ (ORCPT ); Mon, 23 Mar 2020 08:31:16 -0400 Received: from mail-pl1-f193.google.com ([209.85.214.193]:44440 "EHLO mail-pl1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727548AbgCWMbQ (ORCPT ); Mon, 23 Mar 2020 08:31:16 -0400 Received: by mail-pl1-f193.google.com with SMTP id h11so5846612plr.11 for ; Mon, 23 Mar 2020 05:31:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=OevnXq7eEYKHASkGViX/6POF5UwCr/O5lLFLTc/N8U0=; b=mHwm7rXlDkbiGbH9lni18Ooi5wyruE2ZC8wwJTbyamVNy4cOpp1yUvUkdAJUGLwcvB gFy+MHZ6zCSRAaCGuqUImMy8HYooVqc2o0QaR0NAVOTRoi30XVq2kIZlZJm7AAFl6yNv 6sAjwJg8jiA+XwdEx91wECyX4OT8G/LUgHgCHN8yWCwTSqU/VAlx8vPx89gJGRZF+cbQ eYuQwVQnVWRVssqrWEIk8TIA5X24m8J0ZW2XxzALtFGHLIcPFdoWO4UjwPrPkUKXKg20 fvRIzwX+lULwweLUnpcwx+glP0Q5kBcpf6k6hT4NRUXBW0yJdx6FN2/J8kv1Mlqgwf8+ RT9w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=OevnXq7eEYKHASkGViX/6POF5UwCr/O5lLFLTc/N8U0=; b=K3TNBF3h+bX/cwOzlDyn8tcepfgtkkvR+FOVMuPjL7Ia5VR/SitB6QR+E3arDzYKXa QeVrs6In2DoS1IKzSQ9n7LBLfwlEnwkeXilSm69A7//6t1eY7CJNeexYpRCqnUbrRwJ2 RQjP27Z229Niuu0t21yn4J2Eip1uXvpWFuEOetRj0XSng5BGlftCtV0nhL3V+iXKSJxP mT7YyHRd9BuuZRgxWQDPveT7Edxh3/FSwENYyIDd5NK2MDwF3L72vqq1KVzt9MWl54pq 6TSAfUqkeQEsUtp6mMmbZRwsLIGkOj5XNWMHKUk70YW5RvAa1WJDQTixAZfWD67OJIph bNmA== X-Gm-Message-State: ANhLgQ1PsEu4OwttLAj7+QZOA9K2Aq15g3KkNHX7MzdZVyjp/EhGTiNW Y7A0XY2fToA4dfCauDM9xfq8 X-Google-Smtp-Source: ADFU+vvWE0EJxVM+nOcooo5S+IzJifzzK5rEhbb9pGmxbRIR7tGARZLY6jgVl+NTEnXlOdkTjrg5BA== X-Received: by 2002:a17:902:bc47:: with SMTP id t7mr21982260plz.47.1584966675212; Mon, 23 Mar 2020 05:31:15 -0700 (PDT) Received: from localhost.localdomain ([103.59.133.81]) by smtp.googlemail.com with ESMTPSA id 144sm3590131pgd.29.2020.03.23.05.31.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Mar 2020 05:31:14 -0700 (PDT) From: Manivannan Sadhasivam To: gregkh@linuxfoundation.org, davem@davemloft.net Cc: smohanad@codeaurora.org, jhugo@codeaurora.org, kvalo@codeaurora.org, bjorn.andersson@linaro.org, hemantk@codeaurora.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, Manivannan Sadhasivam Subject: [PATCH v2 1/7] bus: mhi: core: Pass module owner during client driver registration Date: Mon, 23 Mar 2020 18:00:56 +0530 Message-Id: <20200323123102.13992-2-manivannan.sadhasivam@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200323123102.13992-1-manivannan.sadhasivam@linaro.org> References: <20200323123102.13992-1-manivannan.sadhasivam@linaro.org> Sender: linux-arm-msm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-arm-msm@vger.kernel.org The module owner field can be used to prevent the removal of kernel modules when there are any device files associated with it opened in userspace. Hence, modify the API to pass module owner field. For convenience, module_mhi_driver() macro is used which takes care of passing the module owner through THIS_MODULE of the module of the driver and also avoiding the use of specifying the default MHI client driver register/unregister routines. Suggested-by: Greg Kroah-Hartman Signed-off-by: Manivannan Sadhasivam --- drivers/bus/mhi/core/init.c | 5 +++-- include/linux/mhi.h | 21 +++++++++++++++++++-- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/drivers/bus/mhi/core/init.c b/drivers/bus/mhi/core/init.c index 5fb756ca335e..eb7f556a8531 100644 --- a/drivers/bus/mhi/core/init.c +++ b/drivers/bus/mhi/core/init.c @@ -1189,7 +1189,7 @@ static int mhi_driver_remove(struct device *dev) return 0; } -int mhi_driver_register(struct mhi_driver *mhi_drv) +int __mhi_driver_register(struct mhi_driver *mhi_drv, struct module *owner) { struct device_driver *driver = &mhi_drv->driver; @@ -1197,12 +1197,13 @@ int mhi_driver_register(struct mhi_driver *mhi_drv) return -EINVAL; driver->bus = &mhi_bus_type; + driver->owner = owner; driver->probe = mhi_driver_probe; driver->remove = mhi_driver_remove; return driver_register(driver); } -EXPORT_SYMBOL_GPL(mhi_driver_register); +EXPORT_SYMBOL_GPL(__mhi_driver_register); void mhi_driver_unregister(struct mhi_driver *mhi_drv) { diff --git a/include/linux/mhi.h b/include/linux/mhi.h index 79cb9f898544..d83e7772681b 100644 --- a/include/linux/mhi.h +++ b/include/linux/mhi.h @@ -514,11 +514,28 @@ int mhi_register_controller(struct mhi_controller *mhi_cntrl, */ void mhi_unregister_controller(struct mhi_controller *mhi_cntrl); +/* + * module_mhi_driver() - Helper macro for drivers that don't do + * anything special other than using default mhi_driver_register() and + * mhi_driver_unregister(). This eliminates a lot of boilerplate. + * Each module may only use this macro once. + */ +#define module_mhi_driver(mhi_drv) \ + module_driver(mhi_drv, mhi_driver_register, \ + mhi_driver_unregister) + +/* + * Macro to avoid include chaining to get THIS_MODULE + */ +#define mhi_driver_register(mhi_drv) \ + __mhi_driver_register(mhi_drv, THIS_MODULE) + /** - * mhi_driver_register - Register driver with MHI framework + * __mhi_driver_register - Register driver with MHI framework * @mhi_drv: Driver associated with the device + * @owner: The module owner */ -int mhi_driver_register(struct mhi_driver *mhi_drv); +int __mhi_driver_register(struct mhi_driver *mhi_drv, struct module *owner); /** * mhi_driver_unregister - Unregister a driver for mhi_devices From patchwork Mon Mar 23 12:30:57 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Manivannan Sadhasivam X-Patchwork-Id: 11452845 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 2668114B4 for ; Mon, 23 Mar 2020 12:31:24 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id F07642072E for ; Mon, 23 Mar 2020 12:31:23 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="T//sib/M" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727548AbgCWMbW (ORCPT ); Mon, 23 Mar 2020 08:31:22 -0400 Received: from mail-pg1-f194.google.com ([209.85.215.194]:39283 "EHLO mail-pg1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728207AbgCWMbW (ORCPT ); Mon, 23 Mar 2020 08:31:22 -0400 Received: by mail-pg1-f194.google.com with SMTP id b22so7124874pgb.6 for ; Mon, 23 Mar 2020 05:31:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=NJFfdkDDVWPfDBODZ8jf2fP70+u0slAGMe8B4fkY7/s=; b=T//sib/MZoxXffAJaWHl9eMzDJmthoI8qNI/kjNt8Ajq5Cq8KKr0VHXAj1aYl/bNtk 3wwn6PDok2sBsJwI18vqGCUco5fhYj638DSNZDMtAakR31sX1GJLvPbE6oGaBO+iZqOw 10+ACqr0ozOCADRKWYvnjsvuaOAWbbwdlqa2j3D4SARsL+y74g5BuBeG2Tlf6uUidSmG Tg8J0HUZl30Zij9FjsQK19wQve7BT/HpNBIITiq2JR1oZQKo7S0O2Sjm45P+T1ME+9sq MY82aVsQnJgTzvsT5ukc4GKMVlUFhad+YysZx3w2lndapDcXQ6IUQL5iWABaGFJtfCmM NxTw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=NJFfdkDDVWPfDBODZ8jf2fP70+u0slAGMe8B4fkY7/s=; b=o23KyY3qzXjL77GfZVgx5W3IWreTg0pp5HB0mWrko58I2Wy9lkPRKx0H70DpGEHMKE mnPqU+isTyA1EqyvO0s/ZmEseLc5QndKF1/ClMwQ5x8d/EThWAFeo+FcoZJ3RaFhVoSh yjJxjBe7Sx2DR4KqIZ9L8Pm5rASdX5BWYVW6IxsViHKIemxlZfnQvj8EDVQ3No4UZbia N5cguUpnu5mZnE12KobWbAgppJzyH+HPmA7ckznY6dcxKL1IuP5uUZvRVeXQA1n8JOd0 stPkSE44ACZFXkOWB3C/s1noxcEBHMmelLlF6uSNmisrfm/jW7bGgaEunyzA4jybGRzW b89g== X-Gm-Message-State: ANhLgQ0K7AoDLvCyayMtoetHH8+Q/LCTU1f0m0uaPN7E3v8Oow7GsaAH TV0jQ5T/isvONbOE0rDhhemC X-Google-Smtp-Source: ADFU+vu+KpKyjeTtIwrK9NfcrgcsN7GPjs67i9gcir0fNE/tpe0Cw/eovSyq0cQsxIezch8w8yOmRw== X-Received: by 2002:a63:6d43:: with SMTP id i64mr2694413pgc.201.1584966679266; Mon, 23 Mar 2020 05:31:19 -0700 (PDT) Received: from localhost.localdomain ([103.59.133.81]) by smtp.googlemail.com with ESMTPSA id 144sm3590131pgd.29.2020.03.23.05.31.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Mar 2020 05:31:18 -0700 (PDT) From: Manivannan Sadhasivam To: gregkh@linuxfoundation.org, davem@davemloft.net Cc: smohanad@codeaurora.org, jhugo@codeaurora.org, kvalo@codeaurora.org, bjorn.andersson@linaro.org, hemantk@codeaurora.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, Manivannan Sadhasivam Subject: [PATCH v2 2/7] bus: mhi: core: Add support for reading MHI info from device Date: Mon, 23 Mar 2020 18:00:57 +0530 Message-Id: <20200323123102.13992-3-manivannan.sadhasivam@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200323123102.13992-1-manivannan.sadhasivam@linaro.org> References: <20200323123102.13992-1-manivannan.sadhasivam@linaro.org> Sender: linux-arm-msm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-arm-msm@vger.kernel.org The MHI register base has several registers used for getting the MHI specific information such as version, family, major, and minor numbers from the device. This information can be used by the controller drivers for usecases such as applying quirks for a specific revision etc... While at it, let's also rearrange the local variables in mhi_register_controller(). Suggested-by: Hemant Kumar Signed-off-by: Manivannan Sadhasivam --- drivers/bus/mhi/core/init.c | 19 +++++++++++++++++-- drivers/bus/mhi/core/internal.h | 10 ++++++++++ include/linux/mhi.h | 8 ++++++++ 3 files changed, 35 insertions(+), 2 deletions(-) diff --git a/drivers/bus/mhi/core/init.c b/drivers/bus/mhi/core/init.c index eb7f556a8531..d136f6c6ca78 100644 --- a/drivers/bus/mhi/core/init.c +++ b/drivers/bus/mhi/core/init.c @@ -802,12 +802,12 @@ static int parse_config(struct mhi_controller *mhi_cntrl, int mhi_register_controller(struct mhi_controller *mhi_cntrl, struct mhi_controller_config *config) { - int ret; - int i; struct mhi_event *mhi_event; struct mhi_chan *mhi_chan; struct mhi_cmd *mhi_cmd; struct mhi_device *mhi_dev; + u32 soc_info; + int ret, i; if (!mhi_cntrl) return -EINVAL; @@ -874,6 +874,21 @@ int mhi_register_controller(struct mhi_controller *mhi_cntrl, mhi_cntrl->unmap_single = mhi_unmap_single_no_bb; } + /* Read the MHI device info */ + ret = mhi_read_reg(mhi_cntrl, mhi_cntrl->regs, + SOC_HW_VERSION_OFFS, &soc_info); + if (ret) + goto error_alloc_dev; + + mhi_cntrl->family_number = (soc_info & SOC_HW_VERSION_FAM_NUM_BMSK) >> + SOC_HW_VERSION_FAM_NUM_SHFT; + mhi_cntrl->device_number = (soc_info & SOC_HW_VERSION_DEV_NUM_BMSK) >> + SOC_HW_VERSION_DEV_NUM_SHFT; + mhi_cntrl->major_version = (soc_info & SOC_HW_VERSION_MAJOR_VER_BMSK) >> + SOC_HW_VERSION_MAJOR_VER_SHFT; + mhi_cntrl->minor_version = (soc_info & SOC_HW_VERSION_MINOR_VER_BMSK) >> + SOC_HW_VERSION_MINOR_VER_SHFT; + /* Register controller with MHI bus */ mhi_dev = mhi_alloc_device(mhi_cntrl); if (IS_ERR(mhi_dev)) { diff --git a/drivers/bus/mhi/core/internal.h b/drivers/bus/mhi/core/internal.h index 18066302e6e2..5deadfaa053a 100644 --- a/drivers/bus/mhi/core/internal.h +++ b/drivers/bus/mhi/core/internal.h @@ -196,6 +196,16 @@ extern struct bus_type mhi_bus_type; #define BHIE_RXVECSTATUS_STATUS_XFER_COMPL (0x02) #define BHIE_RXVECSTATUS_STATUS_ERROR (0x03) +#define SOC_HW_VERSION_OFFS (0x224) +#define SOC_HW_VERSION_FAM_NUM_BMSK (0xF0000000) +#define SOC_HW_VERSION_FAM_NUM_SHFT (28) +#define SOC_HW_VERSION_DEV_NUM_BMSK (0x0FFF0000) +#define SOC_HW_VERSION_DEV_NUM_SHFT (16) +#define SOC_HW_VERSION_MAJOR_VER_BMSK (0x0000FF00) +#define SOC_HW_VERSION_MAJOR_VER_SHFT (8) +#define SOC_HW_VERSION_MINOR_VER_BMSK (0x000000FF) +#define SOC_HW_VERSION_MINOR_VER_SHFT (0) + #define EV_CTX_RESERVED_MASK GENMASK(7, 0) #define EV_CTX_INTMODC_MASK GENMASK(15, 8) #define EV_CTX_INTMODC_SHIFT 8 diff --git a/include/linux/mhi.h b/include/linux/mhi.h index d83e7772681b..b295de5b4ab4 100644 --- a/include/linux/mhi.h +++ b/include/linux/mhi.h @@ -310,6 +310,10 @@ struct mhi_controller_config { * @sw_ev_rings: Number of software event rings * @nr_irqs_req: Number of IRQs required to operate (optional) * @nr_irqs: Number of IRQ allocated by bus master (required) + * @family_number: MHI controller family number + * @device_number: MHI controller device number + * @major_version: MHI controller major revision number + * @minor_version: MHI controller minor revision number * @mhi_event: MHI event ring configurations table * @mhi_cmd: MHI command ring configurations table * @mhi_ctxt: MHI device context, shared memory between host and device @@ -375,6 +379,10 @@ struct mhi_controller { u32 sw_ev_rings; u32 nr_irqs_req; u32 nr_irqs; + u32 family_number; + u32 device_number; + u32 major_version; + u32 minor_version; struct mhi_event *mhi_event; struct mhi_cmd *mhi_cmd; From patchwork Mon Mar 23 12:30:58 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Manivannan Sadhasivam X-Patchwork-Id: 11452847 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 7BA6414B4 for ; Mon, 23 Mar 2020 12:31:28 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 5A52A2072E for ; Mon, 23 Mar 2020 12:31:28 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="osKRm7XV" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728207AbgCWMb0 (ORCPT ); Mon, 23 Mar 2020 08:31:26 -0400 Received: from mail-pg1-f194.google.com ([209.85.215.194]:40739 "EHLO mail-pg1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728257AbgCWMbZ (ORCPT ); Mon, 23 Mar 2020 08:31:25 -0400 Received: by mail-pg1-f194.google.com with SMTP id t24so7120884pgj.7 for ; Mon, 23 Mar 2020 05:31:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=unGw6c2ZufitdrNu+5YBhFURhwCE/NrCJkMv+/OxkYg=; b=osKRm7XV+UlLkbrcfQFyBUqpYN+wH6/BfZM+cAof3MaOuskwPGOX4b4p8/mMnko5Mw 9Td860n3EVINgTQ8AQRjsHuhxMQgicPXJ8OdDmvXPOAv36Ds85nkWUxrvtve3bbuXRIm RDbNWmqoLNd+oY2bz9pf+IB9VxV0IMHNxDn2c9CWPJmAbUocPXXQS567ZdaICSISeKtm eUBVhauyx6fCxPTu0YY0uwsKtuQYBP6zcQzEMGxI1EHiCd4EZEsGd78wCcGhbSyDN3PL 6ri90h7cFHN5KVQC1GTKvBUKMwxX1nKo6jNSpYfbgWYmppyIxyzXaZFaM+2Spl5deM5b U2ZQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=unGw6c2ZufitdrNu+5YBhFURhwCE/NrCJkMv+/OxkYg=; b=TqBin4mQ+0kMr5h3ESpadt9FrEjVka+UblMC+JdRpZXiTJ1rWE9gfGgpnKe0/VmqVT CPo7Gnu5ez/zkbaD3Ve5GvD63qS6YaoKga56FOu1mSZJU+Jn7iiuqGf9yJVZfYB/BsUt i696Efl88jiFHYZKpb2mToQnCxAk6e/YREoXTTR8H4BwsTYACsMdSuwNuvAmuKE2cppC 3YBTG89GYe89IXhrAdbMlVYpJQ/RM44c7S5EwCbYaO7qWIf+Z/DQql036KrhUh5ak6R7 JtiNFgaJwrco7XY8TVWOIOSfrMwGIUQJ+FAwExsXouAR+M8QEClydAlzkS7VokKvIXGC OYuQ== X-Gm-Message-State: ANhLgQ0Y0xXskMkVqYCrEU+QQMVIxW3lf3XgauMH1dDuLNNVmtgy+rI/ 2OXq0wbkxXDV2PZURzscryEG X-Google-Smtp-Source: ADFU+vs6ei/hpgxQ7OVG0nfPzPqxm4i+aQZo5jdn0+awOA69IkcLZd0TrJnKsDeFVumYxKaqfBBrvw== X-Received: by 2002:a63:c451:: with SMTP id m17mr4671091pgg.223.1584966683070; Mon, 23 Mar 2020 05:31:23 -0700 (PDT) Received: from localhost.localdomain ([103.59.133.81]) by smtp.googlemail.com with ESMTPSA id 144sm3590131pgd.29.2020.03.23.05.31.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Mar 2020 05:31:22 -0700 (PDT) From: Manivannan Sadhasivam To: gregkh@linuxfoundation.org, davem@davemloft.net Cc: smohanad@codeaurora.org, jhugo@codeaurora.org, kvalo@codeaurora.org, bjorn.andersson@linaro.org, hemantk@codeaurora.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, Manivannan Sadhasivam Subject: [PATCH v2 3/7] bus: mhi: core: Initialize bhie field in mhi_cntrl for RDDM capture Date: Mon, 23 Mar 2020 18:00:58 +0530 Message-Id: <20200323123102.13992-4-manivannan.sadhasivam@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200323123102.13992-1-manivannan.sadhasivam@linaro.org> References: <20200323123102.13992-1-manivannan.sadhasivam@linaro.org> Sender: linux-arm-msm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-arm-msm@vger.kernel.org The bhie field in mhi_cntrl needs to be initialized to proper register base in order to make mhi_rddm_prepare() to work. Otherwise, mhi_rddm_prepare() will cause NULL pointer dereference. Fixes: 6fdfdd27328c ("bus: mhi: core: Add support for downloading RDDM image during panic") Reported-by: Hemant Kumar Signed-off-by: Manivannan Sadhasivam --- drivers/bus/mhi/core/init.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/bus/mhi/core/init.c b/drivers/bus/mhi/core/init.c index d136f6c6ca78..f6e3c16225a7 100644 --- a/drivers/bus/mhi/core/init.c +++ b/drivers/bus/mhi/core/init.c @@ -979,7 +979,8 @@ int mhi_prepare_for_power_up(struct mhi_controller *mhi_cntrl) goto bhie_error; } - memset_io(mhi_cntrl->regs + bhie_off + BHIE_RXVECADDR_LOW_OFFS, + mhi_cntrl->bhie = mhi_cntrl->regs + bhie_off; + memset_io(mhi_cntrl->bhie + BHIE_RXVECADDR_LOW_OFFS, 0, BHIE_RXVECSTATUS_OFFS - BHIE_RXVECADDR_LOW_OFFS + 4); From patchwork Mon Mar 23 12:30:59 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Manivannan Sadhasivam X-Patchwork-Id: 11452849 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 78EEB1392 for ; Mon, 23 Mar 2020 12:31:29 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 57A582072E for ; Mon, 23 Mar 2020 12:31:29 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="pOe+nKCh" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728235AbgCWMb2 (ORCPT ); Mon, 23 Mar 2020 08:31:28 -0400 Received: from mail-pg1-f196.google.com ([209.85.215.196]:39297 "EHLO mail-pg1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727380AbgCWMb1 (ORCPT ); Mon, 23 Mar 2020 08:31:27 -0400 Received: by mail-pg1-f196.google.com with SMTP id b22so7125020pgb.6 for ; Mon, 23 Mar 2020 05:31:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=0WVYi5XJp4WaCaddQcy1HjEAG2je/Kk0d1P+LoVF1LU=; b=pOe+nKChsCyDxA3kKu+UWucseGJUAw5AqsBo7ljLGWVFFRYvte4WaO9LHFWE0Jg6oq bkTNuHlS3gKm4K6znOjFupC/LjpnV+C5RpZZcXDjI4cWKhdl5+gHpBHd9y11kEG1rH+v 7vpghAnkih8eRYbO8cIvU2LvMJKEedxIzaa2CuOrrsDrjKQuq8RW4osafGvRKxl8Fb2N OOk/TF5UB2rG1Fkv60/+Iy3gFh5vQ201ZQ3Ejlqoy48orCYMTWCUC0Iyb+PV2jUceTDq 12T7QH3YbFRn+A9B8Xw/7ktl8sU2ZwiDc/4c5ikpW/ACjbAMdCkfAXUgHxeI6meWMa0C iiBQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=0WVYi5XJp4WaCaddQcy1HjEAG2je/Kk0d1P+LoVF1LU=; b=S2AKO0lHL1K/9d0Gpb9qbFYG1sznzjIh7lp/b9b/h1bxUuY/aF6mtBk7nPO1ZzdlSl 1vCXvIZH9AYJyf/jLx+Xwmrqn6XNyCholiKaQFRpQOJR9fSfob6bbxOQ4IwxIzQStwYe VdB3e0aKr2JjNEW1wkbrn5ypi87LZdXq2CM06wgs535bQI6RlrRGjIDgzyubX68r7il7 Z4zHyJQeDhyffh3k8P1NGuK/Ax0pUMf/C2g416X7vMMsLKzvJghvhSOKfJCEw3VzRbD/ 2Dpl9Zy8bbUY3hMo8aqAh+L68xlcXHMAPJ7u0S8HErBU2+d05ven5wYQ7zs75dXKn8/l HSDA== X-Gm-Message-State: ANhLgQ3GTJ7w7bRlgNl2X5+WMmJZHt+h8bPRf9r40lQ3U62BSWPtxuZW 2KVpS9Wl2+qxtWEmNNOkbfqu X-Google-Smtp-Source: ADFU+vt3DTLu/I5B2gbgbMVEzZd8OJT3CGLsgKm677pDzpkf1N2Iny5qvULAmixEzxzWgEH+t3ThnA== X-Received: by 2002:a63:a55d:: with SMTP id r29mr4326673pgu.248.1584966686708; Mon, 23 Mar 2020 05:31:26 -0700 (PDT) Received: from localhost.localdomain ([103.59.133.81]) by smtp.googlemail.com with ESMTPSA id 144sm3590131pgd.29.2020.03.23.05.31.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Mar 2020 05:31:25 -0700 (PDT) From: Manivannan Sadhasivam To: gregkh@linuxfoundation.org, davem@davemloft.net Cc: smohanad@codeaurora.org, jhugo@codeaurora.org, kvalo@codeaurora.org, bjorn.andersson@linaro.org, hemantk@codeaurora.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, Manivannan Sadhasivam Subject: [PATCH v2 4/7] bus: mhi: core: Drop the references to mhi_dev in mhi_destroy_device() Date: Mon, 23 Mar 2020 18:00:59 +0530 Message-Id: <20200323123102.13992-5-manivannan.sadhasivam@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200323123102.13992-1-manivannan.sadhasivam@linaro.org> References: <20200323123102.13992-1-manivannan.sadhasivam@linaro.org> Sender: linux-arm-msm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-arm-msm@vger.kernel.org For some scenarios like controller suspend and resume, mhi_destroy_device() will get called without mhi_unregister_controller(). In that case, the references to the mhi_dev created for the channels will not be dropped but the channels will be destroyed as per the spec. This will cause issue during resume as the channels will not be created due to the fact that mhi_dev is not NULL. Hence, this change decrements the refcount for mhi_dev in mhi_destroy_device() for concerned channels and also sets mhi_dev to NULL in release_device(). Reported-by: Carl Huang Signed-off-by: Manivannan Sadhasivam --- drivers/bus/mhi/core/init.c | 12 ++++++++++++ drivers/bus/mhi/core/main.c | 13 +++++++++++++ 2 files changed, 25 insertions(+) diff --git a/drivers/bus/mhi/core/init.c b/drivers/bus/mhi/core/init.c index f6e3c16225a7..b38359c480ea 100644 --- a/drivers/bus/mhi/core/init.c +++ b/drivers/bus/mhi/core/init.c @@ -1028,6 +1028,18 @@ static void mhi_release_device(struct device *dev) { struct mhi_device *mhi_dev = to_mhi_device(dev); + /* + * We need to set the mhi_chan->mhi_dev to NULL here since the MHI + * devices for the channels will only get created if the mhi_dev + * associated with it is NULL. This scenario will happen during the + * controller suspend and resume. + */ + if (mhi_dev->ul_chan) + mhi_dev->ul_chan->mhi_dev = NULL; + + if (mhi_dev->dl_chan) + mhi_dev->dl_chan->mhi_dev = NULL; + kfree(mhi_dev); } diff --git a/drivers/bus/mhi/core/main.c b/drivers/bus/mhi/core/main.c index fa1c9000fc6c..eb4256b81406 100644 --- a/drivers/bus/mhi/core/main.c +++ b/drivers/bus/mhi/core/main.c @@ -244,6 +244,19 @@ int mhi_destroy_device(struct device *dev, void *data) if (mhi_dev->dev_type == MHI_DEVICE_CONTROLLER) return 0; + /* + * For the suspend and resume case, this function will get called + * without mhi_unregister_controller(). Hence, we need to drop the + * references to mhi_dev created for ul and dl channels. We can + * be sure that there will be no instances of mhi_dev left after + * this. + */ + if (mhi_dev->ul_chan) + put_device(&mhi_dev->ul_chan->mhi_dev->dev); + + if (mhi_dev->dl_chan) + put_device(&mhi_dev->dl_chan->mhi_dev->dev); + dev_dbg(&mhi_cntrl->mhi_dev->dev, "destroy device for chan:%s\n", mhi_dev->chan_name); From patchwork Mon Mar 23 12:31:00 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Manivannan Sadhasivam X-Patchwork-Id: 11452851 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 7E5A014B4 for ; Mon, 23 Mar 2020 12:31:33 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 53B5020719 for ; Mon, 23 Mar 2020 12:31:33 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="BAguYNia" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728273AbgCWMbc (ORCPT ); Mon, 23 Mar 2020 08:31:32 -0400 Received: from mail-pf1-f196.google.com ([209.85.210.196]:33865 "EHLO mail-pf1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728272AbgCWMbb (ORCPT ); Mon, 23 Mar 2020 08:31:31 -0400 Received: by mail-pf1-f196.google.com with SMTP id 23so7448637pfj.1 for ; Mon, 23 Mar 2020 05:31:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=Eaovk+x8P1gp02zFRjyjN8J0LaUiHMNc3qEJKITffoI=; b=BAguYNiazMf7Bx5H4GHx2gcuSxeGN5Bz5oB4cCD04Uw6L7BNqpCtYTET3xXIztYaFP DcjN815jn81IHO774Jhsw/CfHmVHyZCLlspPUUtQ6hMbtI2JRF5lKTxIl+XPG8trf2Jc YMN0Qss1h6lc68v/05sM94RvuQgIOK4ZLtxpuHc3GnGwsLkVUBUjC6y3MfeqLafFlNcU oue4KnQZ+yLe5EM+Vzjk0vSAU+Llxod/NjLoSiXhN9xgXPTkhADyHisgCO07h62m4qH9 09SBjc3YKC8zzbT8UhadFs/uNlZH6c11KCu4kYhvFBLtAmf2Z9MqmaTxjExDaa6itiv5 dAxg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=Eaovk+x8P1gp02zFRjyjN8J0LaUiHMNc3qEJKITffoI=; b=riOkE1Ijhr53k0akmDIuZ+SLJHzQ9lgTsAcoGhs8W/3Jhjs9Dz0NRAQr3/aqVKVkSw e6h6qXaH8ltrMrlt6JfnFjTlr4OtwVI1wbB/DI82SmjIFICPQ7/JJKkXgiWRgc/tjvnT ruJeH+q4Qq4c+ZgpmBiiu4ovNMN9sBbGWXtkGmSAwaV6vXe5xPj6XzRDDKWCqXiOssv0 lQjM1RuW/K/5EcQgMOLMlffPZXsam1Mx4LBJYk/JMQS8EVeGsrYoilAC5JCsESRRNPjc CECxgDwULr56Cc2askz+vvgPc6aL4yHTzqiBxUmJb1ljmQVe39oUDYeaGO9YA6HgHcBS xDrQ== X-Gm-Message-State: ANhLgQ1OW3MuUKwreoTqx3Dfd/eCgLb51fs96YYYnlPhvpqG/K/iBJ5J NkYKcGZkx8HH90ifo0X778YkMEWDXoqU X-Google-Smtp-Source: ADFU+vslHJzFzyJcEJ7TfjNpDtxQZMphImrQ/oGTfdw7EJ0E8Z1p4/d8sdvv2fJWcnuSZORd6saOAg== X-Received: by 2002:a63:cf03:: with SMTP id j3mr21753040pgg.433.1584966690238; Mon, 23 Mar 2020 05:31:30 -0700 (PDT) Received: from localhost.localdomain ([103.59.133.81]) by smtp.googlemail.com with ESMTPSA id 144sm3590131pgd.29.2020.03.23.05.31.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Mar 2020 05:31:29 -0700 (PDT) From: Manivannan Sadhasivam To: gregkh@linuxfoundation.org, davem@davemloft.net Cc: smohanad@codeaurora.org, jhugo@codeaurora.org, kvalo@codeaurora.org, bjorn.andersson@linaro.org, hemantk@codeaurora.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, Manivannan Sadhasivam Subject: [PATCH v2 5/7] bus: mhi: core: Add support for MHI suspend and resume Date: Mon, 23 Mar 2020 18:01:00 +0530 Message-Id: <20200323123102.13992-6-manivannan.sadhasivam@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200323123102.13992-1-manivannan.sadhasivam@linaro.org> References: <20200323123102.13992-1-manivannan.sadhasivam@linaro.org> Sender: linux-arm-msm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-arm-msm@vger.kernel.org Add support for MHI suspend and resume states. While at it, the mhi_notify() function needs to be exported as well. Signed-off-by: Manivannan Sadhasivam --- drivers/bus/mhi/core/main.c | 3 +- drivers/bus/mhi/core/pm.c | 143 ++++++++++++++++++++++++++++++++++++ include/linux/mhi.h | 19 +++++ 3 files changed, 164 insertions(+), 1 deletion(-) diff --git a/drivers/bus/mhi/core/main.c b/drivers/bus/mhi/core/main.c index eb4256b81406..3e9aa3b2da77 100644 --- a/drivers/bus/mhi/core/main.c +++ b/drivers/bus/mhi/core/main.c @@ -267,7 +267,7 @@ int mhi_destroy_device(struct device *dev, void *data) return 0; } -static void mhi_notify(struct mhi_device *mhi_dev, enum mhi_callback cb_reason) +void mhi_notify(struct mhi_device *mhi_dev, enum mhi_callback cb_reason) { struct mhi_driver *mhi_drv; @@ -279,6 +279,7 @@ static void mhi_notify(struct mhi_device *mhi_dev, enum mhi_callback cb_reason) if (mhi_drv->status_cb) mhi_drv->status_cb(mhi_dev, cb_reason); } +EXPORT_SYMBOL_GPL(mhi_notify); /* Bind MHI channels to MHI devices */ void mhi_create_devices(struct mhi_controller *mhi_cntrl) diff --git a/drivers/bus/mhi/core/pm.c b/drivers/bus/mhi/core/pm.c index 52690cb5c89c..3529419d076b 100644 --- a/drivers/bus/mhi/core/pm.c +++ b/drivers/bus/mhi/core/pm.c @@ -669,6 +669,149 @@ void mhi_pm_st_worker(struct work_struct *work) } } +int mhi_pm_suspend(struct mhi_controller *mhi_cntrl) +{ + struct mhi_chan *itr, *tmp; + struct device *dev = &mhi_cntrl->mhi_dev->dev; + enum mhi_pm_state new_state; + int ret; + + if (mhi_cntrl->pm_state == MHI_PM_DISABLE) + return -EINVAL; + + if (MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state)) + return -EIO; + + /* Return busy if there are any pending resources */ + if (atomic_read(&mhi_cntrl->dev_wake)) + return -EBUSY; + + /* Take MHI out of M2 state */ + read_lock_bh(&mhi_cntrl->pm_lock); + mhi_cntrl->wake_get(mhi_cntrl, false); + read_unlock_bh(&mhi_cntrl->pm_lock); + + ret = wait_event_timeout(mhi_cntrl->state_event, + mhi_cntrl->dev_state == MHI_STATE_M0 || + mhi_cntrl->dev_state == MHI_STATE_M1 || + MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state), + msecs_to_jiffies(mhi_cntrl->timeout_ms)); + + read_lock_bh(&mhi_cntrl->pm_lock); + mhi_cntrl->wake_put(mhi_cntrl, false); + read_unlock_bh(&mhi_cntrl->pm_lock); + + if (!ret || MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state)) { + dev_err(dev, + "Could not enter M0/M1 state"); + return -EIO; + } + + write_lock_irq(&mhi_cntrl->pm_lock); + + if (atomic_read(&mhi_cntrl->dev_wake)) { + write_unlock_irq(&mhi_cntrl->pm_lock); + return -EBUSY; + } + + dev_info(dev, "Allowing M3 transition\n"); + new_state = mhi_tryset_pm_state(mhi_cntrl, MHI_PM_M3_ENTER); + if (new_state != MHI_PM_M3_ENTER) { + write_unlock_irq(&mhi_cntrl->pm_lock); + dev_err(dev, + "Error setting to PM state: %s from: %s\n", + to_mhi_pm_state_str(MHI_PM_M3_ENTER), + to_mhi_pm_state_str(mhi_cntrl->pm_state)); + return -EIO; + } + + /* Set MHI to M3 and wait for completion */ + mhi_set_mhi_state(mhi_cntrl, MHI_STATE_M3); + write_unlock_irq(&mhi_cntrl->pm_lock); + dev_info(dev, "Wait for M3 completion\n"); + + ret = wait_event_timeout(mhi_cntrl->state_event, + mhi_cntrl->dev_state == MHI_STATE_M3 || + MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state), + msecs_to_jiffies(mhi_cntrl->timeout_ms)); + + if (!ret || MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state)) { + dev_err(dev, + "Did not enter M3 state, MHI state: %s, PM state: %s\n", + TO_MHI_STATE_STR(mhi_cntrl->dev_state), + to_mhi_pm_state_str(mhi_cntrl->pm_state)); + return -EIO; + } + + /* Notify clients about entering LPM */ + list_for_each_entry_safe(itr, tmp, &mhi_cntrl->lpm_chans, node) { + mutex_lock(&itr->mutex); + if (itr->mhi_dev) + mhi_notify(itr->mhi_dev, MHI_CB_LPM_ENTER); + mutex_unlock(&itr->mutex); + } + + return 0; +} +EXPORT_SYMBOL_GPL(mhi_pm_suspend); + +int mhi_pm_resume(struct mhi_controller *mhi_cntrl) +{ + struct mhi_chan *itr, *tmp; + struct device *dev = &mhi_cntrl->mhi_dev->dev; + enum mhi_pm_state cur_state; + int ret; + + dev_info(dev, "Entered with PM state: %s, MHI state: %s\n", + to_mhi_pm_state_str(mhi_cntrl->pm_state), + TO_MHI_STATE_STR(mhi_cntrl->dev_state)); + + if (mhi_cntrl->pm_state == MHI_PM_DISABLE) + return 0; + + if (MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state)) + return -EIO; + + /* Notify clients about exiting LPM */ + list_for_each_entry_safe(itr, tmp, &mhi_cntrl->lpm_chans, node) { + mutex_lock(&itr->mutex); + if (itr->mhi_dev) + mhi_notify(itr->mhi_dev, MHI_CB_LPM_EXIT); + mutex_unlock(&itr->mutex); + } + + write_lock_irq(&mhi_cntrl->pm_lock); + cur_state = mhi_tryset_pm_state(mhi_cntrl, MHI_PM_M3_EXIT); + if (cur_state != MHI_PM_M3_EXIT) { + write_unlock_irq(&mhi_cntrl->pm_lock); + dev_info(dev, + "Error setting to PM state: %s from: %s\n", + to_mhi_pm_state_str(MHI_PM_M3_EXIT), + to_mhi_pm_state_str(mhi_cntrl->pm_state)); + return -EIO; + } + + /* Set MHI to M0 and wait for completion */ + mhi_set_mhi_state(mhi_cntrl, MHI_STATE_M0); + write_unlock_irq(&mhi_cntrl->pm_lock); + + ret = wait_event_timeout(mhi_cntrl->state_event, + mhi_cntrl->dev_state == MHI_STATE_M0 || + MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state), + msecs_to_jiffies(mhi_cntrl->timeout_ms)); + + if (!ret || MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state)) { + dev_err(dev, + "Did not enter M0 state, MHI state: %s, PM state: %s\n", + TO_MHI_STATE_STR(mhi_cntrl->dev_state), + to_mhi_pm_state_str(mhi_cntrl->pm_state)); + return -EIO; + } + + return 0; +} +EXPORT_SYMBOL_GPL(mhi_pm_resume); + int __mhi_device_get_sync(struct mhi_controller *mhi_cntrl) { int ret; diff --git a/include/linux/mhi.h b/include/linux/mhi.h index b295de5b4ab4..b5f450420245 100644 --- a/include/linux/mhi.h +++ b/include/linux/mhi.h @@ -559,6 +559,13 @@ void mhi_driver_unregister(struct mhi_driver *mhi_drv); void mhi_set_mhi_state(struct mhi_controller *mhi_cntrl, enum mhi_state state); +/** + * mhi_notify - Notify the MHI client driver about client device status + * @mhi_dev: MHI device instance + * @cb_reason: MHI callback reason + */ +void mhi_notify(struct mhi_device *mhi_dev, enum mhi_callback cb_reason); + /** * mhi_prepare_for_power_up - Do pre-initialization before power up. * This is optional, call this before power up if @@ -595,6 +602,18 @@ void mhi_power_down(struct mhi_controller *mhi_cntrl, bool graceful); */ void mhi_unprepare_after_power_down(struct mhi_controller *mhi_cntrl); +/** + * mhi_pm_suspend - Move MHI into a suspended state + * @mhi_cntrl: MHI controller + */ +int mhi_pm_suspend(struct mhi_controller *mhi_cntrl); + +/** + * mhi_pm_resume - Resume MHI from suspended state + * @mhi_cntrl: MHI controller + */ +int mhi_pm_resume(struct mhi_controller *mhi_cntrl); + /** * mhi_download_rddm_img - Download ramdump image from device for * debugging purpose. From patchwork Mon Mar 23 12:31:01 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Manivannan Sadhasivam X-Patchwork-Id: 11452855 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id E69161392 for ; Mon, 23 Mar 2020 12:31:43 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id BC06B20753 for ; Mon, 23 Mar 2020 12:31:43 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="MCgGtUpA" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728291AbgCWMbh (ORCPT ); Mon, 23 Mar 2020 08:31:37 -0400 Received: from mail-pf1-f194.google.com ([209.85.210.194]:33238 "EHLO mail-pf1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728149AbgCWMbg (ORCPT ); Mon, 23 Mar 2020 08:31:36 -0400 Received: by mail-pf1-f194.google.com with SMTP id j1so4731218pfe.0 for ; Mon, 23 Mar 2020 05:31:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=ze2ItdsI6wPt5v1O8KEFX204MaoLii8v3eVvbrQAdcg=; b=MCgGtUpAROkqV2KhJ5MkLpbTrkma9zEQLOixv+V3jZd5LmArDHXACzLD2Z23aynMCo e8I9jS+pjqfIus3gLiag+hGO0WNK1k9Vo6jKoBr6jPlyHgGWzz6uZAG2j3JQd/NOwccB gUUFqbGvSmy3opf+8kIgllPjNKIovAg6ajVZzZYU85SqOQhizW+iQ5QklcMOvNhyt+lq MZxsB34O8NQZsz3dg7ts/Gvbxp8NS0+6o5Q9PXdTX0WNr5tA+nIXxqwj9JRg8bMwbZyU Llr5VqHtWgKsskZHfALQPhWIZo8mtCl6bodAZURDoM3IoL8V8iiccy0w6V4OkoiJipVQ D6GA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=ze2ItdsI6wPt5v1O8KEFX204MaoLii8v3eVvbrQAdcg=; b=KlHRUXFP/XS+SMZJkivhpTQfqhbQojYQoq60EkqTlRXCBMmy3CfK0oCxhSzcAeJv0U thgabJgPNmbqf9Nf7g7NhNlTLibHFpphDGGBMpC8zmAJ0TdNNZ/oaud6be+peqxWANdL dDaeeg1vFobKPkAWYgk40FrD9KRL6XZl8IqFTEPV78bLVXQfQiXRmcX6qIVl6e86LPF3 eGFT5zboCX65GOUiQhekFTYzLwM7GF6xWB/2GvmAPpUaOYMoHUmbdsTvRKHGC2Zt15BA FiqIfHStfzVEk3tcqwcwtslROv0fpy6VemBmhLnOcwCbDZhKk027F2Z7ClmO3lbGuYUb xI7A== X-Gm-Message-State: ANhLgQ0Xf+PWio3+940G//QMD3Ghwjcic/NJwvPc+m21jEVDtul4Rp4a IxCzYI7FE3HBtdjRm28GgaVt X-Google-Smtp-Source: ADFU+vtn7resoV0Oycvk4uY6IzRVyMozhAMqBUjsqylBEgy+VOuR363DfABr4j3yhi9pd/tPpYMwLQ== X-Received: by 2002:aa7:848b:: with SMTP id u11mr23558941pfn.76.1584966694093; Mon, 23 Mar 2020 05:31:34 -0700 (PDT) Received: from localhost.localdomain ([103.59.133.81]) by smtp.googlemail.com with ESMTPSA id 144sm3590131pgd.29.2020.03.23.05.31.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Mar 2020 05:31:33 -0700 (PDT) From: Manivannan Sadhasivam To: gregkh@linuxfoundation.org, davem@davemloft.net Cc: smohanad@codeaurora.org, jhugo@codeaurora.org, kvalo@codeaurora.org, bjorn.andersson@linaro.org, hemantk@codeaurora.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, Manivannan Sadhasivam , netdev@vger.kernel.org Subject: [PATCH v2 6/7] net: qrtr: Add MHI transport layer Date: Mon, 23 Mar 2020 18:01:01 +0530 Message-Id: <20200323123102.13992-7-manivannan.sadhasivam@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200323123102.13992-1-manivannan.sadhasivam@linaro.org> References: <20200323123102.13992-1-manivannan.sadhasivam@linaro.org> Sender: linux-arm-msm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-arm-msm@vger.kernel.org MHI is the transport layer used for communicating to the external modems. Hence, this commit adds MHI transport layer support to QRTR for transferring the QMI messages over IPC Router. Cc: "David S. Miller" Cc: netdev@vger.kernel.org Signed-off-by: Manivannan Sadhasivam --- net/qrtr/Kconfig | 7 ++ net/qrtr/Makefile | 2 + net/qrtr/mhi.c | 208 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 217 insertions(+) create mode 100644 net/qrtr/mhi.c diff --git a/net/qrtr/Kconfig b/net/qrtr/Kconfig index 63f89cc6e82c..8eb876471564 100644 --- a/net/qrtr/Kconfig +++ b/net/qrtr/Kconfig @@ -29,4 +29,11 @@ config QRTR_TUN implement endpoints of QRTR, for purpose of tunneling data to other hosts or testing purposes. +config QRTR_MHI + tristate "MHI IPC Router channels" + depends on MHI_BUS + help + Say Y here to support MHI based ipcrouter channels. MHI is the + transport used for communicating to external modems. + endif # QRTR diff --git a/net/qrtr/Makefile b/net/qrtr/Makefile index 1c6d6c120fb7..3dc0a7c9d455 100644 --- a/net/qrtr/Makefile +++ b/net/qrtr/Makefile @@ -5,3 +5,5 @@ obj-$(CONFIG_QRTR_SMD) += qrtr-smd.o qrtr-smd-y := smd.o obj-$(CONFIG_QRTR_TUN) += qrtr-tun.o qrtr-tun-y := tun.o +obj-$(CONFIG_QRTR_MHI) += qrtr-mhi.o +qrtr-mhi-y := mhi.o diff --git a/net/qrtr/mhi.c b/net/qrtr/mhi.c new file mode 100644 index 000000000000..90af208f34c1 --- /dev/null +++ b/net/qrtr/mhi.c @@ -0,0 +1,208 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) 2018-2020, The Linux Foundation. All rights reserved. + */ + +#include +#include +#include +#include +#include + +#include "qrtr.h" + +struct qrtr_mhi_dev { + struct qrtr_endpoint ep; + struct mhi_device *mhi_dev; + struct device *dev; + spinlock_t ul_lock; /* lock to protect ul_pkts */ + struct list_head ul_pkts; + atomic_t in_reset; +}; + +struct qrtr_mhi_pkt { + struct list_head node; + struct sk_buff *skb; + struct kref refcount; + struct completion done; +}; + +static void qrtr_mhi_pkt_release(struct kref *ref) +{ + struct qrtr_mhi_pkt *pkt = container_of(ref, struct qrtr_mhi_pkt, + refcount); + struct sock *sk = pkt->skb->sk; + + consume_skb(pkt->skb); + if (sk) + sock_put(sk); + + kfree(pkt); +} + +/* From MHI to QRTR */ +static void qcom_mhi_qrtr_dl_callback(struct mhi_device *mhi_dev, + struct mhi_result *mhi_res) +{ + struct qrtr_mhi_dev *qdev = dev_get_drvdata(&mhi_dev->dev); + int rc; + + if (!qdev || mhi_res->transaction_status) + return; + + rc = qrtr_endpoint_post(&qdev->ep, mhi_res->buf_addr, + mhi_res->bytes_xferd); + if (rc == -EINVAL) + dev_err(qdev->dev, "invalid ipcrouter packet\n"); +} + +/* From QRTR to MHI */ +static void qcom_mhi_qrtr_ul_callback(struct mhi_device *mhi_dev, + struct mhi_result *mhi_res) +{ + struct qrtr_mhi_dev *qdev = dev_get_drvdata(&mhi_dev->dev); + struct qrtr_mhi_pkt *pkt; + unsigned long flags; + + spin_lock_irqsave(&qdev->ul_lock, flags); + pkt = list_first_entry(&qdev->ul_pkts, struct qrtr_mhi_pkt, node); + list_del(&pkt->node); + complete_all(&pkt->done); + + kref_put(&pkt->refcount, qrtr_mhi_pkt_release); + spin_unlock_irqrestore(&qdev->ul_lock, flags); +} + +static void qcom_mhi_qrtr_status_callback(struct mhi_device *mhi_dev, + enum mhi_callback mhi_cb) +{ + struct qrtr_mhi_dev *qdev = dev_get_drvdata(&mhi_dev->dev); + struct qrtr_mhi_pkt *pkt; + unsigned long flags; + + if (mhi_cb != MHI_CB_FATAL_ERROR) + return; + + atomic_inc(&qdev->in_reset); + spin_lock_irqsave(&qdev->ul_lock, flags); + list_for_each_entry(pkt, &qdev->ul_pkts, node) + complete_all(&pkt->done); + spin_unlock_irqrestore(&qdev->ul_lock, flags); +} + +/* Send data over MHI */ +static int qcom_mhi_qrtr_send(struct qrtr_endpoint *ep, struct sk_buff *skb) +{ + struct qrtr_mhi_dev *qdev = container_of(ep, struct qrtr_mhi_dev, ep); + struct qrtr_mhi_pkt *pkt; + int rc; + + rc = skb_linearize(skb); + if (rc) { + kfree_skb(skb); + return rc; + } + + pkt = kzalloc(sizeof(*pkt), GFP_KERNEL); + if (!pkt) { + kfree_skb(skb); + return -ENOMEM; + } + + init_completion(&pkt->done); + kref_init(&pkt->refcount); + kref_get(&pkt->refcount); + pkt->skb = skb; + + spin_lock_bh(&qdev->ul_lock); + list_add_tail(&pkt->node, &qdev->ul_pkts); + rc = mhi_queue_skb(qdev->mhi_dev, DMA_TO_DEVICE, skb, skb->len, + MHI_EOT); + if (rc) { + list_del(&pkt->node); + /* Reference count needs to be dropped 2 times */ + kref_put(&pkt->refcount, qrtr_mhi_pkt_release); + kref_put(&pkt->refcount, qrtr_mhi_pkt_release); + kfree_skb(skb); + spin_unlock_bh(&qdev->ul_lock); + return rc; + } + + spin_unlock_bh(&qdev->ul_lock); + if (skb->sk) + sock_hold(skb->sk); + + rc = wait_for_completion_interruptible_timeout(&pkt->done, HZ * 5); + if (atomic_read(&qdev->in_reset)) + rc = -ECONNRESET; + else if (rc == 0) + rc = -ETIMEDOUT; + else if (rc > 0) + rc = 0; + + kref_put(&pkt->refcount, qrtr_mhi_pkt_release); + + return rc; +} + +static int qcom_mhi_qrtr_probe(struct mhi_device *mhi_dev, + const struct mhi_device_id *id) +{ + struct qrtr_mhi_dev *qdev; + u32 net_id; + int rc; + + qdev = devm_kzalloc(&mhi_dev->dev, sizeof(*qdev), GFP_KERNEL); + if (!qdev) + return -ENOMEM; + + qdev->mhi_dev = mhi_dev; + qdev->dev = &mhi_dev->dev; + qdev->ep.xmit = qcom_mhi_qrtr_send; + atomic_set(&qdev->in_reset, 0); + + net_id = QRTR_EP_NID_AUTO; + + INIT_LIST_HEAD(&qdev->ul_pkts); + spin_lock_init(&qdev->ul_lock); + + dev_set_drvdata(&mhi_dev->dev, qdev); + rc = qrtr_endpoint_register(&qdev->ep, net_id); + if (rc) + return rc; + + dev_dbg(qdev->dev, "Qualcomm MHI QRTR driver probed\n"); + + return 0; +} + +static void qcom_mhi_qrtr_remove(struct mhi_device *mhi_dev) +{ + struct qrtr_mhi_dev *qdev = dev_get_drvdata(&mhi_dev->dev); + + qrtr_endpoint_unregister(&qdev->ep); + dev_set_drvdata(&mhi_dev->dev, NULL); +} + +static const struct mhi_device_id qcom_mhi_qrtr_id_table[] = { + { .chan = "IPCR" }, + {} +}; +MODULE_DEVICE_TABLE(mhi, qcom_mhi_qrtr_id_table); + +static struct mhi_driver qcom_mhi_qrtr_driver = { + .probe = qcom_mhi_qrtr_probe, + .remove = qcom_mhi_qrtr_remove, + .dl_xfer_cb = qcom_mhi_qrtr_dl_callback, + .ul_xfer_cb = qcom_mhi_qrtr_ul_callback, + .status_cb = qcom_mhi_qrtr_status_callback, + .id_table = qcom_mhi_qrtr_id_table, + .driver = { + .name = "qcom_mhi_qrtr", + }, +}; + +module_mhi_driver(qcom_mhi_qrtr_driver); + +MODULE_DESCRIPTION("Qualcomm IPC-Router MHI interface driver"); +MODULE_LICENSE("GPL v2"); From patchwork Mon Mar 23 12:31:02 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Manivannan Sadhasivam X-Patchwork-Id: 11452853 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id B4CFE14B4 for ; Mon, 23 Mar 2020 12:31:42 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 9341C20774 for ; Mon, 23 Mar 2020 12:31:42 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="QRYKlwz+" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728299AbgCWMbk (ORCPT ); Mon, 23 Mar 2020 08:31:40 -0400 Received: from mail-pf1-f194.google.com ([209.85.210.194]:33243 "EHLO mail-pf1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728262AbgCWMbj (ORCPT ); Mon, 23 Mar 2020 08:31:39 -0400 Received: by mail-pf1-f194.google.com with SMTP id j1so4731287pfe.0 for ; Mon, 23 Mar 2020 05:31:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=rEAkBJxPd4hSHqHeDBCWCT76WtgPmMTyeJUR1ztc3Ws=; b=QRYKlwz+3wUdtgT0HtxmgWkUMXKIl6FDmO1CEZkb865YpAP3hnIhmMRAC5Jv7LrWP3 UqKpz8+kWkeyxuDgqiztAliegXLra6GT/RKM9sJDlP9citChqHDyKeCOucH9TCS19Wze dLtH4g7cxy5DNAr5ZR2ja4MoBwadhqEt+Nq1rNLwCp3Ci7rRpw8ZebP0Lc+S2jiPgxMd WnoYeQikA8KkBqUJp0L3Wz1QGo86NA16hnMirkv0axfVJ9f5WJjCjvmtm0D3Y7YrlSwR Iy3Ej6HA8IWGNoE9K4UIijkqchwpK4oKNL4wEwo8SH581O6BuqAFh3yuww0Vzm3XGw/Z Ke9w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=rEAkBJxPd4hSHqHeDBCWCT76WtgPmMTyeJUR1ztc3Ws=; b=q2HcwsYAn/ogNQiist6nZRsDJKp6qYKirwThnbzfpFMxC7nXkYLEj6k7apc8+OqgCD QZqmCcX7wqIanm4TQxGS1HJYo+hQsmIOF8awb5Db05VGxzq3Eno29MTSkFRl4XmfrVyM kaoSNF5vMmgpRDzQDT9783+fZjczNQJySOmlnoKCwLGv+cclYLlHEexUCYtFpPsmq8oW Nek03qDo3D/brX1yJcI3vJSw2JiTW+y3drunptvT01TIahFqbFmbPWvbwwGLtcsZTxfX Ce+DkxcyhEVx/YV7VKVI2WNY3RYHQQWeEK1fxiqDBlwwncpvIk/ZMJpf4NuGM27YOXcj dzaw== X-Gm-Message-State: ANhLgQ3IblN4Ln7arYmGxnfPz9Lw1WL5KLIim3td66HVNQhouOuWlc25 cOF+JETlM6K9qi6C5G8C8yGy X-Google-Smtp-Source: ADFU+vsdD0ZZ982SutPaxJPmPd5nX7gRp0D+LOtoVjGZjdF/H3fWCAWtZgi/vfuak6vBRIQm6Vbxew== X-Received: by 2002:aa7:84cc:: with SMTP id x12mr5852695pfn.82.1584966698034; Mon, 23 Mar 2020 05:31:38 -0700 (PDT) Received: from localhost.localdomain ([103.59.133.81]) by smtp.googlemail.com with ESMTPSA id 144sm3590131pgd.29.2020.03.23.05.31.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Mar 2020 05:31:37 -0700 (PDT) From: Manivannan Sadhasivam To: gregkh@linuxfoundation.org, davem@davemloft.net Cc: smohanad@codeaurora.org, jhugo@codeaurora.org, kvalo@codeaurora.org, bjorn.andersson@linaro.org, hemantk@codeaurora.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, Manivannan Sadhasivam , netdev@vger.kernel.org Subject: [PATCH v2 7/7] net: qrtr: Do not depend on ARCH_QCOM Date: Mon, 23 Mar 2020 18:01:02 +0530 Message-Id: <20200323123102.13992-8-manivannan.sadhasivam@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200323123102.13992-1-manivannan.sadhasivam@linaro.org> References: <20200323123102.13992-1-manivannan.sadhasivam@linaro.org> Sender: linux-arm-msm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-arm-msm@vger.kernel.org IPC Router protocol is also used by external modems for exchanging the QMI messages. Hence, it doesn't always depend on Qualcomm platforms. One such instance is the QCA6390 modem connected to x86 machine. Cc: "David S. Miller" Cc: netdev@vger.kernel.org Signed-off-by: Manivannan Sadhasivam --- net/qrtr/Kconfig | 1 - 1 file changed, 1 deletion(-) diff --git a/net/qrtr/Kconfig b/net/qrtr/Kconfig index 8eb876471564..f362ca316015 100644 --- a/net/qrtr/Kconfig +++ b/net/qrtr/Kconfig @@ -4,7 +4,6 @@ config QRTR tristate "Qualcomm IPC Router support" - depends on ARCH_QCOM || COMPILE_TEST ---help--- Say Y if you intend to use Qualcomm IPC router protocol. The protocol is used to communicate with services provided by other