Received: by 2002:a25:c205:0:0:0:0:0 with SMTP id s5csp525004ybf; Fri, 28 Feb 2020 02:40:25 -0800 (PST) X-Google-Smtp-Source: APXvYqxb5OYOVXrV1Em1+T4iLxfVc/w3z1pMEAy8uyuxW3Cy4vwpb6VN5YRGR66PtHX+X2h5lQpN X-Received: by 2002:a05:6830:1014:: with SMTP id a20mr2709620otp.302.1582886425676; Fri, 28 Feb 2020 02:40:25 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1582886425; cv=none; d=google.com; s=arc-20160816; b=0RJ94qyn5A7D3D49qNXvYUdmCObx61mLHh0GQZPDokvWGytwYD0b6NGKUPR2C2jIpu w2YRleaH9xOMWmep99Yy2WyhczDRXNnnqUajsggwqiVCAJQYRVmAKOKj1hfowtWY01fO hfIpyKfkQt4VHQlQ8XjaZdnrJT07fp3BsCD2j7RjoPMOsVBQiRlFXYk0B+bDjkd1lLEh HeOrP5ytSPyzojo7xmPZrVsCoI6uhnq0ZnLlI1uuIzrnI4pfBNbJE2nEgATZL4rhqYk+ dZLRMIMz20jdOz+edXhwJCdS09/H8LynjL8zg5+Z8kUNZS5qgTj3QdUej5Rb+t0HN4oL 9lAw== 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 :message-id:date:subject:cc:to:from:dkim-signature; bh=zgj7mTEBOZhnEp92w6YeduSWhL7aAxaZ23Ij9QT6Fcc=; b=XO60qJ73+7RTpcRNT18zGi1ytiGzePmSMLbnF+dOcPxtMuP/M7y7wznOpPrvuzHBPT 1yRSyCTgRIW1c+JfH58AZvrntqlQQFdI8n88+H26LP/zvvjHdEw3heBEWQKKnc3PVd6n OsmKOsZmuswuLKwV/IrBcvoT3kKTgGhO2TNDUehZObCE04o1Dsx95buoLavUSMcBHmTV gS5akCL7OTYZYBMytNW8nTDdcMKgENIL6VM4QbknWBnAJlVG2JySKnlzqc1YrK+RE8Fz GJGYv4hzWw7XyxkRcItHotS9gMxP9f98atJplx6g1x/oVTS6h6pzFHoVgrMIjBc2BkJk 51XQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=lDYpL4uN; 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 p9si856868oth.91.2020.02.28.02.40.13; Fri, 28 Feb 2020 02:40:25 -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; dkim=pass header.i=@gmail.com header.s=20161025 header.b=lDYpL4uN; 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 S1726898AbgB1KiB (ORCPT + 99 others); Fri, 28 Feb 2020 05:38:01 -0500 Received: from mail-wr1-f65.google.com ([209.85.221.65]:37272 "EHLO mail-wr1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726413AbgB1KiB (ORCPT ); Fri, 28 Feb 2020 05:38:01 -0500 Received: by mail-wr1-f65.google.com with SMTP id l5so2384863wrx.4; Fri, 28 Feb 2020 02:37:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=zgj7mTEBOZhnEp92w6YeduSWhL7aAxaZ23Ij9QT6Fcc=; b=lDYpL4uNGZO9BvGkElG1ZZKiB6RvJvwsUSqj3oDNMloKBWG8fm7f5xfah7pgRVx/vS kn5yawm8At4+BwAIzsioR8eNmllav5mPIJrwkxN8fYzQjZf8jde8TB58ZOVKy+yNAgPY uE3vxyFFBYPDLTeVnW7vMgSQgjDrYY4ER+c5zpQpLNU/gricql9sKfFJCoYs84gABaaR q9I9rCG4g/8Gsz6GZ8qSKg1KVa6tFvu2z+ig0BNcIPgGXN/ThiqIdgkTJASL1l36VDFh Y5a0zld+pZ/94BdNivbeLXSr8KTnJ0RZOl3pTxSwUA8/18nWLYTM2mc8LgVo15Igbj1V iQ/A== 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:mime-version :content-transfer-encoding; bh=zgj7mTEBOZhnEp92w6YeduSWhL7aAxaZ23Ij9QT6Fcc=; b=oYQXtFtQz7dnGIWntnu9/6WObzlD0QMRNU+V0ePDIqeY3mN3lR8sioAifLWD64jd0h tIs0+NewydkDLScBOlSw5T8ANhSG1l9XvDYlrtlqqEggyNQMvSzwmix8VEJ/joOWBQ/N Euoesdifx8z72JhxvovQY1xduRw0C5H+jmEeQxBNH5yHF8IlL1OepQYt5QbvxRJIcmCU 1GXq18NdVTrBKOtopyVKAou8YxXHJm1fjkF4zyOblWbJSA8k8C1bNPUImHdESof9rxRv +EaulnzbVOANbdg9kATkdeuB6Qn9PFWgi7DG2m/zHxvOq6zRGgpKhGqWRoQQoap047Lq HyWw== X-Gm-Message-State: APjAAAUSsZKmn330pKywf9BYOns0lgqgrZ95VJZ4vKypcaLkH8vPS7JO 0QymI2fMD/9Y6GRxExGs3uIz0rTkvpBdNQ== X-Received: by 2002:a5d:4f89:: with SMTP id d9mr4216926wru.391.1582886278351; Fri, 28 Feb 2020 02:37:58 -0800 (PST) Received: from localhost.localdomain (62-178-82-229.cable.dynamic.surfer.at. [62.178.82.229]) by smtp.gmail.com with ESMTPSA id s22sm1550679wmc.16.2020.02.28.02.37.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 28 Feb 2020 02:37:57 -0800 (PST) From: Christian Gmeiner To: linux-kernel@vger.kernel.org Cc: Christian Gmeiner , Dan Carpenter , stable@vger.kernel.org, Lucas Stach , Russell King , David Airlie , Daniel Vetter , etnaviv@lists.freedesktop.org, dri-devel@lists.freedesktop.org Subject: [PATCH v2] drm/etnaviv: rework perfmon query infrastructure Date: Fri, 28 Feb 2020 11:37:49 +0100 Message-Id: <20200228103752.1944629-1-christian.gmeiner@gmail.com> X-Mailer: git-send-email 2.24.1 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 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 --- 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; -- 2.24.1