Received: by 10.192.165.156 with SMTP id m28csp915475imm; Mon, 16 Apr 2018 10:44:06 -0700 (PDT) X-Google-Smtp-Source: AIpwx49ZrV+udM/0GpwIJaszQjno/IRQlA2li6pNneRs4ZZCEnT7gZ6A3svYJnnaCBuVXHcpkYfZ X-Received: by 2002:a17:902:57c7:: with SMTP id g7-v6mr10195004plj.222.1523900646249; Mon, 16 Apr 2018 10:44:06 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1523900646; cv=none; d=google.com; s=arc-20160816; b=E7YIWSVzF+7ZjC/61uYiMjXoncv9ILUhCoCa4QPkILSDNioiSqLO5wj2gMP6w5kpbg Nvsm9zCMQGycu4+9iF6wAGROlpMIwrKZu3DRbrX7QzKLj5WZ6nbobn22gzmx7h/qNkV8 cGstnV76iJSF3ZaUxdddOIrGUE+Yx9CoCKBitIfgUc15nrz0IaKB2ObvyWud+GyZTJIb cKnDzWvhwCG6QcpTxWpdtYKwqbuUUqMtq4nUA2jYKEvSlRikTLuG8C/ytvZHAhc0xEtS G7wNBZaNBVKTP9+GLTDpM9fgjBhQ/gvM6kh2CqGmIHQ4koC8A4jiIWuGHJR1gPKrRYqI 8ZzA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date:dkim-signature:arc-authentication-results; bh=WI2KWEW18wzD816mbk6b9/Idy23YOp45W21W1djbH3g=; b=macwRGB5VRLoJwMv7Nvu+BICKI0qAVRE9BXVnVKzNf9zpnxn12SaP1/nS/9ULahhLV +f7Nxu8ob+uQGJ9MlqTV9HrBUyrH6fCWDE6k/85DOrSqC2z3r/wpbPvFvZ+aS5xP3/rt 7BvaPrT6UafxCp60yei2Q6DTgtOVGWRrRARGBTMfehSdsOIMO5IBTL7Os7D0q7msKHKs qKl2zORYVIuvr2qEd+LZJrAjZoguidXMiAvoYEnBqLC7NC9k2JiI/9Dsp6XoZ4adM4TE Ig3geFxyDJawQhqS2GCo8PjXXsmsTskX+5yFYfqaGg4i6gRX78LO47BPYgJegreFQfTh HPFw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=qaHigwkT; 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; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id p9-v6si4448970plk.294.2018.04.16.10.43.50; Mon, 16 Apr 2018 10:44:06 -0700 (PDT) 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; dkim=pass header.i=@gmail.com header.s=20161025 header.b=qaHigwkT; 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; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752788AbeDPRl0 (ORCPT + 99 others); Mon, 16 Apr 2018 13:41:26 -0400 Received: from mail-yb0-f194.google.com ([209.85.213.194]:36196 "EHLO mail-yb0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750980AbeDPRlX (ORCPT ); Mon, 16 Apr 2018 13:41:23 -0400 Received: by mail-yb0-f194.google.com with SMTP id v140-v6so3970090ybe.3; Mon, 16 Apr 2018 10:41:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=WI2KWEW18wzD816mbk6b9/Idy23YOp45W21W1djbH3g=; b=qaHigwkTZKNUU7NtTR/9wq63M/vlMRwx79J9BI4MdAIRHhq6m1UkZAaSxpe/1CniLX tbD15vl8xal1IrYdlIiMvyGtVGzf74Z1Fs20ar5o+YnwXUgblsMqgpeA+RUjA/kYb+PJ L89aDWpf5D+LYpXBsCt2RgR6y5JjMbFqWzWF+vZx11XIlMxxOKROYMuBtT+qLghuJ29P OPJC2L5eONTX0GbWMliN9/RXeoksFDS3xefMHtWia9x8px7cuuN3pgi159jEnTyFnzCj bkCtnr6rmTzreSo58uxx0/kYioXfbZvqwnh+LRhsi/1LgPcj/CZrL7vu7EuwfkW+CARV z7bQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=WI2KWEW18wzD816mbk6b9/Idy23YOp45W21W1djbH3g=; b=ZH4RvSuVRpe3Crskb5ot16lqOo1xsx6UdIVsiZtMb1W7Ql8ZyHE9+lfmOawvWgf/SF MqI7pbPEodOCHNqGENxQbSuU8EEksIkAOWskPqytUgrPKAf13agWlTNPsmFzh2f763c1 09dhq7ueRBMYBCV5jya6rtEaxghv17U5C/G8LE8frjlEd+4ZX+b++FDtlzGfpRdWTjd/ TOuDpaoBPNRRVrrkToSqBE+l8KSJToBR/bGRzR9fVU1/SEj4xANmtO1+M5Zquv52J2Y+ sg8v0aXGuwMYwpc2SIAVfjiT6A//vJHLFEgKEJnZ2ZdpOi1mSN26u7ayRQEpVz5JUImE XIuA== X-Gm-Message-State: ALQs6tC19/1/f/5lV8rXCTVZVhtvG31EhLJVGx6wQZxW81CR75Leoag5 zEedFCvTHkpL77jb0BV/6/I= X-Received: by 2002:a25:bb49:: with SMTP id b9-v6mr12096704ybk.8.1523900482092; Mon, 16 Apr 2018 10:41:22 -0700 (PDT) Received: from dtor-ws ([2620:0:1000:1511:8de6:27a8:ed13:2ef5]) by smtp.gmail.com with ESMTPSA id d184sm3106474ywb.83.2018.04.16.10.41.19 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 16 Apr 2018 10:41:21 -0700 (PDT) Date: Mon, 16 Apr 2018 10:41:17 -0700 From: Dmitry Torokhov To: Andrzej Hajda Cc: Enric Balletbo i Serra , architt@codeaurora.org, inki.dae@samsung.com, thierry.reding@gmail.com, hjc@rock-chips.com, seanpaul@chromium.org, airlied@linux.ie, tfiga@chromium.org, heiko@sntech.de, dri-devel@lists.freedesktop.org, dianders@chromium.org, ykk@rock-chips.com, kernel@collabora.com, m.szyprowski@samsung.com, linux-samsung-soc@vger.kernel.org, jy0922.shim@samsung.com, rydberg@bitmath.org, krzk@kernel.org, linux-rockchip@lists.infradead.org, kgene@kernel.org, linux-input@vger.kernel.org, orjan.eide@arm.com, wxt@rock-chips.com, jeffy.chen@rock-chips.com, linux-arm-kernel@lists.infradead.org, mark.yao@rock-chips.com, wzz@rock-chips.com, hl@rock-chips.com, jingoohan1@gmail.com, sw0312.kim@samsung.com, linux-kernel@vger.kernel.org, kyungmin.park@samsung.com, Laurent.pinchart@ideasonboard.com, kuankuan.y@gmail.com, hshi@chromium.org, "Kristian H. Kristensen" Subject: Re: [PATCH v6 24/30] drm/rockchip: Disable PSR on input events Message-ID: <20180416174117.GA77055@dtor-ws> References: <20180405095000.9756-1-enric.balletbo@collabora.com> <20180405095000.9756-25-enric.balletbo@collabora.com> <20d2aa03-63e3-0072-5ca7-5f3ca42c3c9e@samsung.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20d2aa03-63e3-0072-5ca7-5f3ca42c3c9e@samsung.com> User-Agent: Mutt/1.9.2 (2017-12-15) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, Apr 16, 2018 at 09:19:21AM +0200, Andrzej Hajda wrote: > > +CC: linux-input list and maintainer > > > On 05.04.2018 11:49, Enric Balletbo i Serra wrote: > > From: "Kristian H. Kristensen" > > > > To improve PSR exit latency, we speculatively start exiting when we > > receive input events. Occasionally, this may lead to false positives, > > but most of the time we get a head start on coming out of PSR. Depending > > on how userspace takes to produce a new frame in response to the event, > > this can completely hide the exit latency. In case of Chrome OS, we > > typically get the input notifier 50ms or more before the dirty_fb > > triggered exit. > > As I see from the code below, you just need notification from input > subsystem on user activity. > Maybe there is some simpler notification mechanism for such things? > If not, maybe such helper should be created in input subsystem, I > suppose it could be reused in other places as well. Creating an input_handler is how you get user activity. It allows you to decide what devices you are interested in and you get events so you decide what to do with them. I am pretty sure using something like atomic notifier is not that much simpler, but much less flexible. I wonder though we we really need to open devices when we connect to them, or if we can leave it as is and only receive events if someone else opened the device and is consuming events. Thanks. > > Regards > Andrzej > > > > > Signed-off-by: Kristian H. Kristensen > > Signed-off-by: Thierry Escande > > Signed-off-by: Enric Balletbo i Serra > > Tested-by: Marek Szyprowski > > --- > > > > drivers/gpu/drm/rockchip/rockchip_drm_psr.c | 134 ++++++++++++++++++++++++++++ > > 1 file changed, 134 insertions(+) > > > > diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_psr.c b/drivers/gpu/drm/rockchip/rockchip_drm_psr.c > > index 9376f4396b6b..a107845ba97c 100644 > > --- a/drivers/gpu/drm/rockchip/rockchip_drm_psr.c > > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_psr.c > > @@ -12,6 +12,8 @@ > > * GNU General Public License for more details. > > */ > > > > +#include > > + > > #include > > #include > > > > @@ -35,6 +37,9 @@ struct psr_drv { > > enum psr_state state; > > > > struct delayed_work flush_work; > > + struct work_struct disable_work; > > + > > + struct input_handler input_handler; > > > > int (*set)(struct drm_encoder *encoder, bool enable); > > }; > > @@ -133,6 +138,18 @@ static void psr_flush_handler(struct work_struct *work) > > mutex_unlock(&psr->lock); > > } > > > > +static void psr_disable_handler(struct work_struct *work) > > +{ > > + struct psr_drv *psr = container_of(work, struct psr_drv, disable_work); > > + > > + /* If the state has changed since we initiated the flush, do nothing */ > > + mutex_lock(&psr->lock); > > + if (psr->state == PSR_ENABLE) > > + psr_set_state_locked(psr, PSR_FLUSH); > > + mutex_unlock(&psr->lock); > > + mod_delayed_work(system_wq, &psr->flush_work, PSR_FLUSH_TIMEOUT_MS); > > +} > > + > > /** > > * rockchip_drm_psr_activate - activate PSR on the given pipe > > * @encoder: encoder to obtain the PSR encoder > > @@ -173,6 +190,7 @@ int rockchip_drm_psr_deactivate(struct drm_encoder *encoder) > > psr->active = false; > > mutex_unlock(&psr->lock); > > cancel_delayed_work_sync(&psr->flush_work); > > + cancel_work_sync(&psr->disable_work); > > > > return 0; > > } > > @@ -226,6 +244,95 @@ void rockchip_drm_psr_flush_all(struct drm_device *dev) > > } > > EXPORT_SYMBOL(rockchip_drm_psr_flush_all); > > > > +static void psr_input_event(struct input_handle *handle, > > + unsigned int type, unsigned int code, > > + int value) > > +{ > > + struct psr_drv *psr = handle->handler->private; > > + > > + schedule_work(&psr->disable_work); > > +} > > + > > +static int psr_input_connect(struct input_handler *handler, > > + struct input_dev *dev, > > + const struct input_device_id *id) > > +{ > > + struct input_handle *handle; > > + int error; > > + > > + handle = kzalloc(sizeof(struct input_handle), GFP_KERNEL); > > + if (!handle) > > + return -ENOMEM; > > + > > + handle->dev = dev; > > + handle->handler = handler; > > + handle->name = "rockchip-psr"; > > + > > + error = input_register_handle(handle); > > + if (error) > > + goto err2; > > + > > + error = input_open_device(handle); > > + if (error) > > + goto err1; > > + > > + return 0; > > + > > +err1: > > + input_unregister_handle(handle); > > +err2: > > + kfree(handle); > > + return error; > > +} > > + > > +static void psr_input_disconnect(struct input_handle *handle) > > +{ > > + input_close_device(handle); > > + input_unregister_handle(handle); > > + kfree(handle); > > +} > > + > > +/* Same device ids as cpu-boost */ > > +static const struct input_device_id psr_ids[] = { > > + { > > + .flags = INPUT_DEVICE_ID_MATCH_EVBIT | > > + INPUT_DEVICE_ID_MATCH_ABSBIT, > > + .evbit = { BIT_MASK(EV_ABS) }, > > + .absbit = { [BIT_WORD(ABS_MT_POSITION_X)] = > > + BIT_MASK(ABS_MT_POSITION_X) | > > + BIT_MASK(ABS_MT_POSITION_Y) }, > > + }, /* multi-touch touchscreen */ > > + { > > + .flags = INPUT_DEVICE_ID_MATCH_EVBIT, > > + .evbit = { BIT_MASK(EV_ABS) }, > > + .absbit = { [BIT_WORD(ABS_X)] = BIT_MASK(ABS_X) } > > + > > + }, /* stylus or joystick device */ > > + { > > + .flags = INPUT_DEVICE_ID_MATCH_EVBIT, > > + .evbit = { BIT_MASK(EV_KEY) }, > > + .keybit = { [BIT_WORD(BTN_LEFT)] = BIT_MASK(BTN_LEFT) }, > > + }, /* pointer (e.g. trackpad, mouse) */ > > + { > > + .flags = INPUT_DEVICE_ID_MATCH_EVBIT, > > + .evbit = { BIT_MASK(EV_KEY) }, > > + .keybit = { [BIT_WORD(KEY_ESC)] = BIT_MASK(KEY_ESC) }, > > + }, /* keyboard */ > > + { > > + .flags = INPUT_DEVICE_ID_MATCH_EVBIT | > > + INPUT_DEVICE_ID_MATCH_KEYBIT, > > + .evbit = { BIT_MASK(EV_KEY) }, > > + .keybit = {[BIT_WORD(BTN_JOYSTICK)] = BIT_MASK(BTN_JOYSTICK) }, > > + }, /* joysticks not caught by ABS_X above */ > > + { > > + .flags = INPUT_DEVICE_ID_MATCH_EVBIT | > > + INPUT_DEVICE_ID_MATCH_KEYBIT, > > + .evbit = { BIT_MASK(EV_KEY) }, > > + .keybit = { [BIT_WORD(BTN_GAMEPAD)] = BIT_MASK(BTN_GAMEPAD) }, > > + }, /* gamepad */ > > + { }, > > +}; > > + > > /** > > * rockchip_drm_psr_register - register encoder to psr driver > > * @encoder: encoder that obtain the PSR function > > @@ -239,6 +346,7 @@ int rockchip_drm_psr_register(struct drm_encoder *encoder, > > { > > struct rockchip_drm_private *drm_drv = encoder->dev->dev_private; > > struct psr_drv *psr; > > + int error; > > > > if (!encoder || !psr_set) > > return -EINVAL; > > @@ -248,6 +356,7 @@ int rockchip_drm_psr_register(struct drm_encoder *encoder, > > return -ENOMEM; > > > > INIT_DELAYED_WORK(&psr->flush_work, psr_flush_handler); > > + INIT_WORK(&psr->disable_work, psr_disable_handler); > > mutex_init(&psr->lock); > > > > psr->active = true; > > @@ -255,11 +364,33 @@ int rockchip_drm_psr_register(struct drm_encoder *encoder, > > psr->encoder = encoder; > > psr->set = psr_set; > > > > + psr->input_handler.event = psr_input_event; > > + psr->input_handler.connect = psr_input_connect; > > + psr->input_handler.disconnect = psr_input_disconnect; > > + psr->input_handler.name = > > + kasprintf(GFP_KERNEL, "rockchip-psr-%s", encoder->name); > > + if (!psr->input_handler.name) { > > + error = -ENOMEM; > > + goto err2; > > + } > > + psr->input_handler.id_table = psr_ids; > > + psr->input_handler.private = psr; > > + > > + error = input_register_handler(&psr->input_handler); > > + if (error) > > + goto err1; > > + > > mutex_lock(&drm_drv->psr_list_lock); > > list_add_tail(&psr->list, &drm_drv->psr_list); > > mutex_unlock(&drm_drv->psr_list_lock); > > > > return 0; > > + > > + err1: > > + kfree(psr->input_handler.name); > > + err2: > > + kfree(psr); > > + return error; > > } > > EXPORT_SYMBOL(rockchip_drm_psr_register); > > > > @@ -279,8 +410,11 @@ void rockchip_drm_psr_unregister(struct drm_encoder *encoder) > > mutex_lock(&drm_drv->psr_list_lock); > > list_for_each_entry_safe(psr, n, &drm_drv->psr_list, list) { > > if (psr->encoder == encoder) { > > + input_unregister_handler(&psr->input_handler); > > cancel_delayed_work_sync(&psr->flush_work); > > + cancel_work_sync(&psr->disable_work); > > list_del(&psr->list); > > + kfree(psr->input_handler.name); > > kfree(psr); > > } > > } > > -- Dmitry