Received: by 2002:a25:c205:0:0:0:0:0 with SMTP id s5csp3320465ybf; Tue, 3 Mar 2020 03:55:24 -0800 (PST) X-Google-Smtp-Source: ADFU+vtUGqfLzunuqfIN3hZf677WmCVE178bAMlne1ikj+hGfO9z+olQtnPle1sQT1ZSK3sKj5Xs X-Received: by 2002:a9d:77c3:: with SMTP id w3mr2901806otl.245.1583236524562; Tue, 03 Mar 2020 03:55:24 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1583236524; cv=none; d=google.com; s=arc-20160816; b=QH84cD5STFPSkK024hvD5KjXK2h+is1pEXeiDlalrt2lHkbnGjvGhY2B8pcZRdbHPf taiyuKRZHBqInFn1SJOXR3N+pc8oeL4SgRRh8R1zzLiP2tDUAd7G8fCzr/mci2v5fv10 OtwQzNyR/ZMO8urLQiYXcWaPF+m1Hc0C3R3YgXBK/WeLHP1iBh+Cf+ejbX0JvQ3lHrYk g0VT4KursN9K5B1JD1IYyZoj9rG7h8cdRRDFsjnIECXh6RJldp9y0S4AAEhmBTQ1lwE3 vgXSjuH/MfWHzoORDuaTQW1AcinQLekD2HV6eTDOAMOt124OqVthDFlcAkiCjP+DDWL8 7/GA== 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 :user-agent:references:in-reply-to:date:cc:to:from:subject :message-id; bh=049ljWxhdK6jQXEa5Nob/hVuhitch4kaa2DeMnmawA0=; b=XnE1WLCoLSsyYA+9LPM4rX3apeNyhwdNjadahGE5aMSK3jYMnih5IwGaOMUItuaO0g Mzzm9QEkTtZUzLR2Bok26EsrEBSw9JxVP26gHDcBnZFaZeaUU1m4jjOfOSQtM8VzRWwE OmMxxjxpy3ofvhhpgzAyFcPcGW4m4xjcKwrG8SY+qo2F3KQSsqESAblmlTrbDJmLD7gK tOG2xjduciZK17OsVyB+UzJxIe2IPImU48eJdj7JUcrfpbb//4osDpOV2eEBaYq7hFY7 Lx+5mxeYfwWF6kUMG6cm1HC+X6lEo2wuJgHCfJPsLjBmO6/qD99RQwIVosJti0PfYHIO TsjA== 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 u206si7793016oia.224.2020.03.03.03.55.11; Tue, 03 Mar 2020 03:55:24 -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 S1729074AbgCCLtg (ORCPT + 99 others); Tue, 3 Mar 2020 06:49:36 -0500 Received: from metis.ext.pengutronix.de ([85.220.165.71]:34195 "EHLO metis.ext.pengutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728976AbgCCLtg (ORCPT ); Tue, 3 Mar 2020 06:49:36 -0500 Received: from kresse.hi.pengutronix.de ([2001:67c:670:100:1d::2a]) by metis.ext.pengutronix.de with esmtp (Exim 4.92) (envelope-from ) id 1j963K-00085Z-RD; Tue, 03 Mar 2020 12:49:34 +0100 Message-ID: <4a5436201ff4345194f64aac1553f9656887203a.camel@pengutronix.de> Subject: Re: [PATCH v2] drm/etnaviv: rework perfmon query infrastructure From: Lucas Stach To: Christian Gmeiner , linux-kernel@vger.kernel.org Cc: Dan Carpenter , stable@vger.kernel.org, Russell King , David Airlie , Daniel Vetter , etnaviv@lists.freedesktop.org, dri-devel@lists.freedesktop.org Date: Tue, 03 Mar 2020 12:49:31 +0100 In-Reply-To: <20200228103752.1944629-1-christian.gmeiner@gmail.com> References: <20200228103752.1944629-1-christian.gmeiner@gmail.com> Content-Type: text/plain; charset="UTF-8" User-Agent: Evolution 3.30.5-1.1 MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-SA-Exim-Connect-IP: 2001:67c:670:100:1d::2a X-SA-Exim-Mail-From: l.stach@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-kernel@vger.kernel.org Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fr, 2020-02-28 at 11:37 +0100, Christian Gmeiner wrote: > Report the correct perfmon domains and signals depending > on the supported feature flags. > > Reported-by: Dan Carpenter > Fixes: 9e2c2e273012 ("drm/etnaviv: add infrastructure to query perf counter") > Cc: stable@vger.kernel.org > Signed-off-by: Christian Gmeiner Thanks, applied to etnaviv/next. Regards, Lucas > > --- > Changes V1 -> V2: > - Handle domain == NULL case better to get rid of BUG_ON(..) usage. > --- > drivers/gpu/drm/etnaviv/etnaviv_perfmon.c | 59 ++++++++++++++++++++--- > 1 file changed, 52 insertions(+), 7 deletions(-) > > diff --git a/drivers/gpu/drm/etnaviv/etnaviv_perfmon.c b/drivers/gpu/drm/etnaviv/etnaviv_perfmon.c > index 8adbf2861bff..e6795bafcbb9 100644 > --- a/drivers/gpu/drm/etnaviv/etnaviv_perfmon.c > +++ b/drivers/gpu/drm/etnaviv/etnaviv_perfmon.c > @@ -32,6 +32,7 @@ struct etnaviv_pm_domain { > }; > > struct etnaviv_pm_domain_meta { > + unsigned int feature; > const struct etnaviv_pm_domain *domains; > u32 nr_domains; > }; > @@ -410,36 +411,78 @@ static const struct etnaviv_pm_domain doms_vg[] = { > > static const struct etnaviv_pm_domain_meta doms_meta[] = { > { > + .feature = chipFeatures_PIPE_3D, > .nr_domains = ARRAY_SIZE(doms_3d), > .domains = &doms_3d[0] > }, > { > + .feature = chipFeatures_PIPE_2D, > .nr_domains = ARRAY_SIZE(doms_2d), > .domains = &doms_2d[0] > }, > { > + .feature = chipFeatures_PIPE_VG, > .nr_domains = ARRAY_SIZE(doms_vg), > .domains = &doms_vg[0] > } > }; > > +static unsigned int num_pm_domains(const struct etnaviv_gpu *gpu) > +{ > + unsigned int num = 0, i; > + > + for (i = 0; i < ARRAY_SIZE(doms_meta); i++) { > + const struct etnaviv_pm_domain_meta *meta = &doms_meta[i]; > + > + if (gpu->identity.features & meta->feature) > + num += meta->nr_domains; > + } > + > + return num; > +} > + > +static const struct etnaviv_pm_domain *pm_domain(const struct etnaviv_gpu *gpu, > + unsigned int index) > +{ > + const struct etnaviv_pm_domain *domain = NULL; > + unsigned int offset = 0, i; > + > + for (i = 0; i < ARRAY_SIZE(doms_meta); i++) { > + const struct etnaviv_pm_domain_meta *meta = &doms_meta[i]; > + > + if (!(gpu->identity.features & meta->feature)) > + continue; > + > + if (meta->nr_domains < (index - offset)) { > + offset += meta->nr_domains; > + continue; > + } > + > + domain = meta->domains + (index - offset); > + } > + > + return domain; > +} > + > int etnaviv_pm_query_dom(struct etnaviv_gpu *gpu, > struct drm_etnaviv_pm_domain *domain) > { > - const struct etnaviv_pm_domain_meta *meta = &doms_meta[domain->pipe]; > + const unsigned int nr_domains = num_pm_domains(gpu); > const struct etnaviv_pm_domain *dom; > > - if (domain->iter >= meta->nr_domains) > + if (domain->iter >= nr_domains) > return -EINVAL; > > - dom = meta->domains + domain->iter; > + dom = pm_domain(gpu, domain->iter); > + if (!dom) > + return -EINVAL; > > domain->id = domain->iter; > domain->nr_signals = dom->nr_signals; > strncpy(domain->name, dom->name, sizeof(domain->name)); > > domain->iter++; > - if (domain->iter == meta->nr_domains) > + if (domain->iter == nr_domains) > domain->iter = 0xff; > > return 0; > @@ -448,14 +491,16 @@ int etnaviv_pm_query_dom(struct etnaviv_gpu *gpu, > int etnaviv_pm_query_sig(struct etnaviv_gpu *gpu, > struct drm_etnaviv_pm_signal *signal) > { > - const struct etnaviv_pm_domain_meta *meta = &doms_meta[signal->pipe]; > + const unsigned int nr_domains = num_pm_domains(gpu); > const struct etnaviv_pm_domain *dom; > const struct etnaviv_pm_signal *sig; > > - if (signal->domain >= meta->nr_domains) > + if (signal->domain >= nr_domains) > return -EINVAL; > > - dom = meta->domains + signal->domain; > + dom = pm_domain(gpu, signal->domain); > + if (!dom) > + return -EINVAL; > > if (signal->iter >= dom->nr_signals) > return -EINVAL;