From nobody Mon Dec 15 23:04:05 2025 Received: from mail-pg1-f177.google.com (mail-pg1-f177.google.com [209.85.215.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9477F29AAF0 for ; Thu, 22 May 2025 19:03:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747940631; cv=none; b=jo23TqXP+SVpY5UaFWKV+RMPeHPE0kzTlRakYqCDHpHc8POiMWSA3myCU4FYcyr14cHFodOR54LOOF62DJqJqXhBrVAWMdDzpD+SlDQ4M774wTamYChIQG6iOJnjC1041EFUG1VbnhnJCS/RfvFx/piJJ4qXU8plD80TZ80HckY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747940631; c=relaxed/simple; bh=H9KzbsOadvXKfagdeIiEb89m8/n30ul8CWjn2anZ1Ww=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=RctxZ1M7ZsfMi7OynyxflR3Z9zGObUhhFi+TFCZAoLy/HynYtuoE80j6BU7R0gtNBBGW1hirRP12IMAfwQmq4xNpirwpVO8diNVfCxZwD9JSPxgt/oeqlCJVDwjksuqWZDFRXw1WQ7jJdEIkYAhPalSlGTdiim6jE0aTvWont78= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=rivosinc.com; spf=pass smtp.mailfrom=rivosinc.com; dkim=pass (2048-bit key) header.d=rivosinc-com.20230601.gappssmtp.com header.i=@rivosinc-com.20230601.gappssmtp.com header.b=pr0sl2Ls; arc=none smtp.client-ip=209.85.215.177 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=rivosinc.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=rivosinc.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=rivosinc-com.20230601.gappssmtp.com header.i=@rivosinc-com.20230601.gappssmtp.com header.b="pr0sl2Ls" Received: by mail-pg1-f177.google.com with SMTP id 41be03b00d2f7-b170c99aa49so5601246a12.1 for ; Thu, 22 May 2025 12:03:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20230601.gappssmtp.com; s=20230601; t=1747940629; x=1748545429; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=fDxMnssaauwljQxlk9zc0qXTf5HAsn9k6GC49F2uSIA=; b=pr0sl2LsUduqLrQhnx6l2dXR7ZXc4JQiquUmHnwAF1y/1+cHit834oob72gqtcmymC BYxh39qlf5E8/WpvQN2AlHB3oTZUd4DH7pgpigiboNesh6JFQLyvOFPf2dtX09oCjg5e ek0aMYUqUyJE3OdVMXtK9jZVnrn3JgOKOLhNwyK75Eh1TTdxdWg1XpEMw2h40V6PJgC0 6Y3KDaBlsL3pWfu0tO9vTDa84ljX2DxieP9LMNYTSn+Tsmt6NGM0QnQbjB/6E/16OBh6 Dbae9HU3lAP+/btiZxghgkKzODEC5HN1faya6t7tS1J0novIVYmQ4PQ4i2uc+A+CRLeU YQ1g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747940629; x=1748545429; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=fDxMnssaauwljQxlk9zc0qXTf5HAsn9k6GC49F2uSIA=; b=XZQMIYB+DZEWVHEBM3kfKDPBXEDlDEG+lBB7xfv8qImmDOAH7Fv2vELBPX5tAlAuMs 5F6J++kOL8yc4kchrweAkjFUaUjnMyBJTmZS7KWTiv5WUz+k/ydQxxs2XU2R7iBz4PLZ w1p5bFQv8QNLMxm4pyQQ6qIvfZqxJFxN1AULug0T5+0gg+YjgMe4BXxj4NeRgRgg33DH lv1ctGRZWColdz0QzOLqyZ0PQn0buO9xq/IRPVzqGsc3omjol9NWd/4p57GHMFk7W+dv OBPDOY6IICeEleYc4h7T/0oxnfSztFl8/Im3G6eZ8lyZsI4hlgQkLShMvC1tCn7C/oGt R4Aw== X-Forwarded-Encrypted: i=1; AJvYcCWT8S2yUT30B8XVA9Y+3vZ9Ectus9l/kaRVLc1sP96eFgaSn57SQUzn2Jq4leYe2gmEvPXgkwKwp8+gYNk=@vger.kernel.org X-Gm-Message-State: AOJu0Yw1t3b0tQdPDtfpS+3SEBFoUhQbohgAERBVm2b95xnHPJv7ishL XfU7pKF9gNNnhvO4RMCx1zBQfW6D+/bDsaPx8GT46w3sAlD6GlntDNn2ieHz9bCL/oI= X-Gm-Gg: ASbGncs9qOP8p1BdCNJEqnBgHXalEkKCLqhzM/Hz3e1JF+GUrczV+ebeutua/avhIIZ s/rXXxevspPZ6SXq66O60K9rz8QyVUFfZMubWne+LZauQFGBaxe1bHg1fxNKLE0o/ZFnfclZP0O MXrTbOW2NQ3ugJWm4p3iCmz/kPF2G0omff3wMB0LaAZYA9JtthYXFUJWs3XUwPMI97x1p1FB7NY FYpDl8l/EYRhv3QxeONzxFnKjfk7dH5ZfYdxOZXkZFEi2pFjMi6htdW4OpGZWRmV3kh4WRAewot MOByDENaJ8vdGqkWJrneh2vCu9Ghk9DaVHVvWV7+byGoHuzt9UjVbLKPcXGSdeyX X-Google-Smtp-Source: AGHT+IG3oxLFDfbSNt6EH0ZdTZ5dYeLSDKnP9JAmNGN1V7oKcB4sbiLpNV8c6lgFnjfD3N9PA0Fqjg== X-Received: by 2002:a17:902:cf09:b0:22d:b240:34fe with SMTP id d9443c01a7336-231d451b294mr410839265ad.25.1747940628742; Thu, 22 May 2025 12:03:48 -0700 (PDT) Received: from atishp.ba.rivosinc.com ([64.71.180.162]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-231d4e9736esm111879155ad.149.2025.05.22.12.03.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 22 May 2025 12:03:48 -0700 (PDT) From: Atish Patra Date: Thu, 22 May 2025 12:03:38 -0700 Subject: [PATCH v3 4/9] drivers/perf: riscv: Implement PMU event info function Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250522-pmu_event_info-v3-4-f7bba7fd9cfe@rivosinc.com> References: <20250522-pmu_event_info-v3-0-f7bba7fd9cfe@rivosinc.com> In-Reply-To: <20250522-pmu_event_info-v3-0-f7bba7fd9cfe@rivosinc.com> To: Anup Patel , Will Deacon , Mark Rutland , Paul Walmsley , Palmer Dabbelt , Mayuresh Chitale Cc: linux-riscv@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Palmer Dabbelt , kvm@vger.kernel.org, kvm-riscv@lists.infradead.org, Atish Patra X-Mailer: b4 0.15-dev-42535 With the new SBI PMU event info function, we can query the availability of the all standard SBI PMU events at boot time with a single ecall. This improves the bootime by avoiding making an SBI call for each standard PMU event. Since this function is defined only in SBI v3.0, invoke this only if the underlying SBI implementation is v3.0 or higher. Signed-off-by: Atish Patra --- arch/riscv/include/asm/sbi.h | 9 ++++++ drivers/perf/riscv_pmu_sbi.c | 68 ++++++++++++++++++++++++++++++++++++++++= ++++ 2 files changed, 77 insertions(+) diff --git a/arch/riscv/include/asm/sbi.h b/arch/riscv/include/asm/sbi.h index 6ce385a3a7bb..77b6997eb6c5 100644 --- a/arch/riscv/include/asm/sbi.h +++ b/arch/riscv/include/asm/sbi.h @@ -135,6 +135,7 @@ enum sbi_ext_pmu_fid { SBI_EXT_PMU_COUNTER_FW_READ, SBI_EXT_PMU_COUNTER_FW_READ_HI, SBI_EXT_PMU_SNAPSHOT_SET_SHMEM, + SBI_EXT_PMU_EVENT_GET_INFO, }; =20 union sbi_pmu_ctr_info { @@ -158,6 +159,14 @@ struct riscv_pmu_snapshot_data { u64 reserved[447]; }; =20 +struct riscv_pmu_event_info { + u32 event_idx; + u32 output; + u64 event_data; +}; + +#define RISCV_PMU_EVENT_INFO_OUTPUT_MASK 0x01 + #define RISCV_PMU_RAW_EVENT_MASK GENMASK_ULL(47, 0) #define RISCV_PMU_PLAT_FW_EVENT_MASK GENMASK_ULL(61, 0) /* SBI v3.0 allows extended hpmeventX width value */ diff --git a/drivers/perf/riscv_pmu_sbi.c b/drivers/perf/riscv_pmu_sbi.c index 273ed70098a3..33d8348bf68a 100644 --- a/drivers/perf/riscv_pmu_sbi.c +++ b/drivers/perf/riscv_pmu_sbi.c @@ -299,6 +299,66 @@ static struct sbi_pmu_event_data pmu_cache_event_map[P= ERF_COUNT_HW_CACHE_MAX] }, }; =20 +static int pmu_sbi_check_event_info(void) +{ + int num_events =3D ARRAY_SIZE(pmu_hw_event_map) + PERF_COUNT_HW_CACHE_MAX= * + PERF_COUNT_HW_CACHE_OP_MAX * PERF_COUNT_HW_CACHE_RESULT_MAX; + struct riscv_pmu_event_info *event_info_shmem; + phys_addr_t base_addr; + int i, j, k, result =3D 0, count =3D 0; + struct sbiret ret; + + event_info_shmem =3D kcalloc(num_events, sizeof(*event_info_shmem), GFP_K= ERNEL); + if (!event_info_shmem) + return -ENOMEM; + + for (i =3D 0; i < ARRAY_SIZE(pmu_hw_event_map); i++) + event_info_shmem[count++].event_idx =3D pmu_hw_event_map[i].event_idx; + + for (i =3D 0; i < ARRAY_SIZE(pmu_cache_event_map); i++) { + for (j =3D 0; j < ARRAY_SIZE(pmu_cache_event_map[i]); j++) { + for (k =3D 0; k < ARRAY_SIZE(pmu_cache_event_map[i][j]); k++) + event_info_shmem[count++].event_idx =3D + pmu_cache_event_map[i][j][k].event_idx; + } + } + + base_addr =3D __pa(event_info_shmem); + if (IS_ENABLED(CONFIG_32BIT)) + ret =3D sbi_ecall(SBI_EXT_PMU, SBI_EXT_PMU_EVENT_GET_INFO, lower_32_bits= (base_addr), + upper_32_bits(base_addr), count, 0, 0, 0); + else + ret =3D sbi_ecall(SBI_EXT_PMU, SBI_EXT_PMU_EVENT_GET_INFO, base_addr, 0, + count, 0, 0, 0); + if (ret.error) { + result =3D -EOPNOTSUPP; + goto free_mem; + } + + for (i =3D 0; i < ARRAY_SIZE(pmu_hw_event_map); i++) { + if (!(event_info_shmem[i].output & RISCV_PMU_EVENT_INFO_OUTPUT_MASK)) + pmu_hw_event_map[i].event_idx =3D -ENOENT; + } + + count =3D ARRAY_SIZE(pmu_hw_event_map); + + for (i =3D 0; i < ARRAY_SIZE(pmu_cache_event_map); i++) { + for (j =3D 0; j < ARRAY_SIZE(pmu_cache_event_map[i]); j++) { + for (k =3D 0; k < ARRAY_SIZE(pmu_cache_event_map[i][j]); k++) { + if (!(event_info_shmem[count].output & + RISCV_PMU_EVENT_INFO_OUTPUT_MASK)) + pmu_cache_event_map[i][j][k].event_idx =3D -ENOENT; + count++; + } + } + } + +free_mem: + kfree(event_info_shmem); + + return result; +} + static void pmu_sbi_check_event(struct sbi_pmu_event_data *edata) { struct sbiret ret; @@ -316,6 +376,14 @@ static void pmu_sbi_check_event(struct sbi_pmu_event_d= ata *edata) =20 static void pmu_sbi_check_std_events(struct work_struct *work) { + int ret; + + if (sbi_v3_available) { + ret =3D pmu_sbi_check_event_info(); + if (!ret) + return; + } + for (int i =3D 0; i < ARRAY_SIZE(pmu_hw_event_map); i++) pmu_sbi_check_event(&pmu_hw_event_map[i]); =20 --=20 2.43.0