From patchwork Thu Jan 11 00:35:33 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Inochi Amaoto X-Patchwork-Id: 1885290 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; secure) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20210309 header.b=CXC1gS89; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=outlook.com header.i=@outlook.com header.a=rsa-sha256 header.s=selector1 header.b=BslFh3WS; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:3::133; helo=bombadil.infradead.org; envelope-from=opensbi-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=patchwork.ozlabs.org) Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:3::133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4T9Qhj3vkjz1yPm for ; Thu, 11 Jan 2024 11:36:37 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=kHhX0jTg5xa18Kf0mO28NLBeJJM3UN7JzGEjddxbD3U=; b=CXC1gS89xIUK82 zbp6Zkw4fm98uBMRVKYmqvX+ZED4c5a9+rSvqeeNJojLXh8TQFVJOwHIMpiW8eXaldarIr1OqnlrR V5wgIpLz8a7RiO++0T8WE/vzZSWb8hZGL0obxuhYC0gxFRRSGb0CxmoDCXtcjjEy2eCCBvqgPYgxd vUnI1ghclGRFvik8OsTNj/DuZWR82LZ0yMhtI4TLBsT28qZeR71dlZVesDrh2kQvFuaXJHw9i+a1v g9ax6bMucv1xeH9ryHW7RdhSjOvej6zktY1PRCLfQ8GV1/ezEkSo33TBQdsNYAyBo5V4c+IgUVe9W xRSnyu3ceaFvTwfDMSsg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1rNj3W-00ExRT-2G; Thu, 11 Jan 2024 00:36:22 +0000 Received: from mail-dm6nam04olkn20800.outbound.protection.outlook.com ([2a01:111:f403:2c09::800] helo=NAM04-DM6-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1rNj3T-00ExQM-21 for opensbi@lists.infradead.org; Thu, 11 Jan 2024 00:36:21 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=f+8QA9btuUbykg6Asvjrlfvfm/gXJ3pn7sA0Z1Zb9soyMccjaxOsthyKrvgm/fT+gpjCxbUAeClMoJQCRYZQsDWVk2hg+WQUYb/JYAYPD3lTa/a8pA6KPIdhKzgAol6KpAxzAkci2BCaNbPF9xUQ/VbAGFLF+SnVUex1I3ofJ7rpl3QDZOQ4wHDcl5Uvc8ubk2YR3V0LmP0E7Tvx3WsnymSy9obeZDu2W1CSVGYI0pMhWSdn0BCByTh4S10AZc7D9eOv1yjtxIcVH3NnnU7E/BXnB8NqceOinB+gAWBaMq5TuxGqWgAFHUDzlLzc+hVZKWBg4w8Pj1tHZZaMVj59uw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=/Ol2XkfktSOxDHqD6eTTStSoQnKGXjoHBSGJuhBKNn8=; b=GZFCX0uEWpYXKmALl9ohgMdATyvlLyL5dSNINgg1vT0Fz84hGMnyy0hta1atcBhIsj5cz45ZVpO/S5f7rLs4iaY+1Rv02T2Wt34H7Xg++nXEt0dSLoed/+3DG+VBuXfDHKsI3Acn5kzt7vhOBqRlbJ0FWzC01L3Ql/HnP0ff5l3keCsmqcspYJqIIuxk9P9t1gGPvVLZA9Dy/AUe/wb5HaFqrRo08UkA6YEZS1+1e7Ilw/34KI/a35rLcaHgdV+Kp0TsunsQIJo9MImlMql8rzhlJLxvz45gyyNkwm2nA9MlcZgCAlWGZ+21eOy95Qlm+Vq/UrZZ0v4A1mGPCnn81Q== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=/Ol2XkfktSOxDHqD6eTTStSoQnKGXjoHBSGJuhBKNn8=; b=BslFh3WSIYJrn4Jcn5dV49pntEfUik45LzTfoAZiqRn4DHf1PmrkeK7rV0KLPIIR1Ssi+XE/FqygHVcrMyXFPoGnCwA+yhbt2DJWJTspiSdJOES6mXe1BlIeH3xJAk5O/XGF0g+sW3rpWFc2/OQIEzuu+tRz0s1dx2USTZWDUEOJWlyAMdNNir+LrJvTxlln3b+tUKdn+LzxPovXRKiSzj1NZSxOwDx5Qw/F49/WK7e1cWgeaPel4Q8N3we60jjUgq5TY/Ee8E77NyORZ2V82NgBXvK6KrU6G9sTiKKJy9w0guHL7y2yJG0kjL0xVQiiL+J+bTCDNp4vUzI1Vn+xTQ== Received: from IA1PR20MB4953.namprd20.prod.outlook.com (2603:10b6:208:3af::19) by SA0PR20MB3376.namprd20.prod.outlook.com (2603:10b6:806:94::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7181.17; Thu, 11 Jan 2024 00:36:17 +0000 Received: from IA1PR20MB4953.namprd20.prod.outlook.com ([fe80::406a:664b:b8bc:1e6b]) by IA1PR20MB4953.namprd20.prod.outlook.com ([fe80::406a:664b:b8bc:1e6b%2]) with mapi id 15.20.7181.015; Thu, 11 Jan 2024 00:36:17 +0000 From: Inochi Amaoto To: Anup Patel , Atish Patra , Xiang W Cc: opensbi@lists.infradead.org, Inochi Amaoto Subject: [RFC PATCH v2 2/2] lib: sbi_pmu: Add PMU snapshot implementation Date: Thu, 11 Jan 2024 08:35:33 +0800 Message-ID: X-Mailer: git-send-email 2.43.0 In-Reply-To: References: X-TMN: [mOLF7l1LeQaRI40sPigwdOIrz2/IKj85F80KCkj8yDw=] X-ClientProxiedBy: TYCPR01CA0179.jpnprd01.prod.outlook.com (2603:1096:400:2b2::14) To IA1PR20MB4953.namprd20.prod.outlook.com (2603:10b6:208:3af::19) X-Microsoft-Original-Message-ID: <20240111003533.119645-2-inochiama@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: IA1PR20MB4953:EE_|SA0PR20MB3376:EE_ X-MS-Office365-Filtering-Correlation-Id: 508bc100-6a01-4204-e0cc-08dc123d52cb X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: BOvgRhEg2Yeg/4G5T9G811NDlj1Y9ZNjXY5BLypKsqRSgEsCJa0xc5JX9493RSn02WDqT7LgaRjzT25DTAZrxQoWAp6+jhO6g91xiXudGrcO7C2jxwFzIdPvKWWR0aBjWV+Ia7E9x6tygbSOMGgI0cVDldRGjWifBVzTj8IYrVjdOtgZesn7a8A0gsjxLpvVeTYBRQ6wxh+CRSIH++eMbbgqnmFf2yLzZ2tbZ5s2uKgFEjNqvYMe/80i2flN6Edawm4nPmH2mCfZZkWWEwuE5HhArYvoiGeSv4xt+Vhz9xOpEei7onJ0Cg8EFWpYrQ57fptF8GEhRFfMKuFH87+FQB3yY2Q8mQGNXJehEwXLIeputUEjnfKmKN96D3hNp/uB+PzB6HawcVCQlqZ6VQutFv9J9ZsjLmL7wHJjt+lwOzAqyoSnMB8onkzKCeK1P6kBGfu2zGzfZMnoFOUNmZQIxh+T8UsKu/dFODIBnFoH5vmIBEL736tJNrb+jyX+c34gNZEGslLDwdGliZH1DIleuFz4oNchqxCSER5fZeJ1RsbHy46gw+t4trWJDalD15w8vGQOaVRpVW8cHh45wCxPZKT35102OcyF0iqUaxlKQjeJQV692UCJHHynfjpirZPn X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 9lmnGELImifA7o3LPTzUhXDUZAPhyKnu/qxhtG5oeUgsWKVZK74TXCKFdnFBJ8WHgJel8qVGyZxRX3APtRNmnRt7iIumEeV5g7it2G+HOzT9vMoxpl5AmTvKLBlN2l37rj/AOFF5XQLWHDEWe++MG1ys3CnwTqRMOY7vdPPPFr/hBl9/p1xRiXAcLpYzFFAPGiP0A+/1LSEnt+XeDLo6I15GHnDZuj1ttvON1/obrbh2kxsMnKMgEpmYmRSgqe299OK0Yzgyjc/JNmBMpoXat7kAO7PqEyN3xc8Qc2ojxNjUoyoG6368ixmxeHg5sOqAuDMbOUxyt8iHWw/NwJB3VKK8IQcreRoSmhqat1GYKAcMNDA3GKxEqddLUQM9lDsazIToCuZOQTygLx40WQMpvNEIJPEJtPKtWiKQLhH05/1X4pJpa7SCC1SoP/nPi4/9McUhyflTQgosqPcoBbzHmpVmfGahxEiGTRAp6m7K7ilbGgA7K/+cSMBG7SWu0dLJIWaLzDQdAi0wsg4UMcQF+FL3+Q3LiC9XQa3GADl3QVS7Dsnj5TcpPQPFavO7A8ggZCmSR5ohj/EM4UFhcXeYlVewbPnWmCLEqyJhtKw/KrMhhKqyunRG9cp4oVPQWyH25jjO6hz6VG21rZMlTOgdJMLtolH6uDEoCaSoJy+UiYkNpI8mMkhak2iYuM82IhriyygMZX+zYNUpQwzZEWEnzTdsmzkoyt5d6IAkpCoExPjFqNrIpmQ7EOsU3cMMR0BRTPLDAro4BHWUgJ8yX2D7QXfOnYPaAt5RZ9QuOTFHAx6WGVY6Eg9uNhUZYL2c1ZoO56ULLyK9VFV+49c70ZMkgqB2k1tIfw1F6lRpzWWAKCn14J+Ruse2WlcI5369Gty6yLc2iwQq24cYiuqsndE10VDplImxkurdaO4iGQDECJPHMNRkYDrhpWJGjVdY+fks5StAVAB4jyK0fIhZqGeNH5UVjtFyM4HyyHQmsnnmEPc+9znVBEmDIdJ0nP290L1mLNgdppG8iyxnX1WOYm9CfmJSz53wrtbMytrEF7yTM1apXNjrR2Jp4OiIH1OR9GTl1Rvc2EF+TPQz4hfnUfDeK/b7wbJOM+38vHtzY8KYyjCzPw+2g4TpeZsTJhBaYEf++K+Yi4gO34z6V/e1KzorvCnz1XjNmQkNv27UUB9tl+FoxzO+GJPhwgYse/eq6bEQ4quQlSmV5MI7TAJbPTGZJOlgVWeJgSx/8Y13Zici4oI= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 508bc100-6a01-4204-e0cc-08dc123d52cb X-MS-Exchange-CrossTenant-AuthSource: IA1PR20MB4953.namprd20.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Jan 2024 00:36:17.5020 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA0PR20MB3376 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240110_163619_709245_BC4BE6CA X-CRM114-Status: GOOD ( 21.25 ) X-Spam-Score: -0.2 (/) X-Spam-Report: Spam detection software, running on the system "bombadil.infradead.org", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: SBI PMU snapshot is an opetional extension that allow supervisor to save a snapshot about PMU counter status. which is useful for KVM snapshot. Add the implementation of the PMU snapshot, and remove the related error. Content analysis details: (-0.2 points, 5.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 SPF_PASS SPF: sender matches SPF record 0.0 FREEMAIL_FROM Sender email is commonly abused enduser mail provider [inochiama[at]outlook.com] -0.0 SPF_HELO_PASS SPF: HELO matches SPF record -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.1 DKIM_VALID_EF Message has a valid DKIM or DK signature from envelope-from domain X-BeenThere: opensbi@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "opensbi" Errors-To: opensbi-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org SBI PMU snapshot is an opetional extension that allow supervisor to save a snapshot about PMU counter status. which is useful for KVM snapshot. Add the implementation of the PMU snapshot, and remove the related error. Signed-off-by: Inochi Amaoto --- include/sbi/sbi_pmu.h | 4 ++ include/sbi/sbi_shm.h | 6 +- lib/sbi/sbi_ecall_pmu.c | 3 +- lib/sbi/sbi_pmu.c | 143 ++++++++++++++++++++++++++++++++++++++-- 4 files changed, 146 insertions(+), 10 deletions(-) diff --git a/include/sbi/sbi_pmu.h b/include/sbi/sbi_pmu.h index 7d32a4d..c755ed5 100644 --- a/include/sbi/sbi_pmu.h +++ b/include/sbi/sbi_pmu.h @@ -150,4 +150,8 @@ int sbi_pmu_ctr_cfg_match(unsigned long cidx_base, unsigned long cidx_mask, int sbi_pmu_ctr_incr_fw(enum sbi_pmu_fw_event_code_id fw_id); +int sbi_pmu_set_snapshot_shmem(unsigned long shmem_phys_lo, + unsigned long shmem_phys_hi, + unsigned long flags); + #endif diff --git a/include/sbi/sbi_shm.h b/include/sbi/sbi_shm.h index c50753b..69afe81 100644 --- a/include/sbi/sbi_shm.h +++ b/include/sbi/sbi_shm.h @@ -63,7 +63,7 @@ static inline int sbi_shmem_read_u16(struct sbi_shmem *shmem, uint16_t* value) { uint16_t tmp; - int ret = sbi_shmem_raw_write(shmem, offset, &tmp, 2); + int ret = sbi_shmem_raw_read(shmem, offset, &tmp, 2); *value = le16_to_cpu(tmp); @@ -75,7 +75,7 @@ static inline int sbi_shmem_read_u32(struct sbi_shmem *shmem, uint32_t* value) { uint32_t tmp; - int ret = sbi_shmem_raw_write(shmem, offset, &tmp, 4); + int ret = sbi_shmem_raw_read(shmem, offset, &tmp, 4); *value = le32_to_cpu(tmp); @@ -87,7 +87,7 @@ static inline int sbi_shmem_read_u64(struct sbi_shmem *shmem, uint64_t* value) { uint64_t tmp; - int ret = sbi_shmem_raw_write(shmem, offset, &tmp, 8); + int ret = sbi_shmem_raw_read(shmem, offset, &tmp, 8); *value = le64_to_cpu(tmp); diff --git a/lib/sbi/sbi_ecall_pmu.c b/lib/sbi/sbi_ecall_pmu.c index 40a63a6..8e9a82e 100644 --- a/lib/sbi/sbi_ecall_pmu.c +++ b/lib/sbi/sbi_ecall_pmu.c @@ -74,7 +74,8 @@ static int sbi_ecall_pmu_handler(unsigned long extid, unsigned long funcid, ret = sbi_pmu_ctr_stop(regs->a0, regs->a1, regs->a2); break; case SBI_EXT_PMU_SNAPSHOT_SET_SHMEM: - /* fallthrough as OpenSBI doesn't support snapshot yet */ + ret = sbi_pmu_set_snapshot_shmem(regs->a0, regs->a1, regs->a2); + break; default: ret = SBI_ENOTSUPP; } diff --git a/lib/sbi/sbi_pmu.c b/lib/sbi/sbi_pmu.c index 6209ccc..5892537 100644 --- a/lib/sbi/sbi_pmu.c +++ b/lib/sbi/sbi_pmu.c @@ -16,6 +16,7 @@ #include #include #include +#include #include /** Information about hardware counters */ @@ -68,8 +69,22 @@ struct sbi_pmu_hart_state { * and hence can optimally share the same memory. */ uint64_t fw_counters_data[SBI_PMU_FW_CTR_MAX]; + + /* Shared memory for pmu */ + struct sbi_shmem shmem; }; +#define PMU_SNAPSHOT_SHMEM_ALIGN 4096 +#define PMU_SNAPSHOT_SHMEM_SIZE 4096 + +#define PMU_SNAPSHOT_COUNTER_OF_MAP_OFFSET 0x0000 +#define PMU_SNAPSHOT_COUNTER_OFFSET_BASE 0x0008 +#define PMU_SNAPSHOT_COUNTER_ENTRY_SIZE 8 + +#define PMU_SNAPSHOT_COUNTER_OFFSET(i) \ + (PMU_SNAPSHOT_COUNTER_OFFSET_BASE + \ + PMU_SNAPSHOT_COUNTER_ENTRY_SIZE * (i)) + /** Offset of pointer to PMU HART state in scratch space */ static unsigned long phs_ptr_offset; @@ -333,6 +348,39 @@ static int pmu_ctr_enable_irq_hw(int ctr_idx) return 0; } +static uint64_t pmu_ctr_read_hw_of(uint32_t cidx) +{ + struct sbi_scratch *scratch = sbi_scratch_thishart_ptr(); + uint32_t overflow; + + if (!sbi_hart_has_extension(scratch, SBI_HART_EXT_SSCOFPMF)) + return 0; + + if (cidx < (CSR_INSTRET - CSR_CYCLE)) + return 0; +#if __riscv_xlen == 32 + overflow = csr_read_num(CSR_MHPMEVENT3H + cidx - 3) & MHPMEVENTH_OF; +#else + overflow = csr_read_num(CSR_MHPMEVENT3 + cidx - 3) & MHPMEVENT_OF; +#endif + if (overflow) + return 1; + else + return 0; +} + +static uint64_t pmu_ctr_read_hw(uint32_t cidx) +{ + uint64_t cval; +#if __riscv_xlen == 32 + cval = csr_read_num(CSR_MCYCLE + cidx) | + csr_read_num(CSR_MCYCLEH + cidx) << BITS_PER_LONG; +#else + cval = csr_read_num(CSR_MCYCLE + cidx); +#endif + return cval; +} + static void pmu_ctr_write_hw(uint32_t cidx, uint64_t ival) { #if __riscv_xlen == 32 @@ -428,33 +476,64 @@ static int pmu_ctr_start_fw(struct sbi_pmu_hart_state *phs, return 0; } +static void pmu_ctrl_read_snapshot(struct sbi_pmu_hart_state *phs, + int i, int eid_type, + uint64_t of_val, uint64_t *ival) +{ + sbi_shmem_read_u64(&phs->shmem, + PMU_SNAPSHOT_COUNTER_OFFSET(i), + ival); + + if (eid_type == SBI_PMU_EVENT_TYPE_FW) + return; + + if (BIT(i) & of_val) + *ival |= MHPMEVENT_OF; +} + int sbi_pmu_ctr_start(unsigned long cbase, unsigned long cmask, unsigned long flags, uint64_t ival) { + struct sbi_scratch *scratch = sbi_scratch_thishart_ptr(); struct sbi_pmu_hart_state *phs = pmu_thishart_state_ptr(); int event_idx_type; uint32_t event_code; int ret = SBI_EINVAL; - bool bUpdate = false; + bool bUpdate = false, sUpdate = false; int i, cidx; - uint64_t edata; + uint64_t edata, of_val = 0; if ((cbase + sbi_fls(cmask)) >= total_ctrs) return ret; - if (flags & SBI_PMU_STOP_FLAG_TAKE_SNAPSHOT) - return SBI_ENO_SHMEM; + if (flags & SBI_PMU_START_FLAG_INIT_FROM_SNAPSHOT) + sUpdate = true; if (flags & SBI_PMU_START_FLAG_SET_INIT_VALUE) bUpdate = true; + if (sUpdate) { + if (sbi_hart_has_extension(scratch, SBI_HART_EXT_SSCOFPMF)) + sbi_shmem_read_u64(&phs->shmem, + PMU_SNAPSHOT_COUNTER_OF_MAP_OFFSET, + &of_val); + + /* Snapshot initialization implicit value update */ + bUpdate = true; + } + for_each_set_bit(i, &cmask, BITS_PER_LONG) { cidx = i + cbase; event_idx_type = pmu_ctr_validate(phs, cidx, &event_code); if (event_idx_type < 0) /* Continue the start operation for other counters */ continue; - else if (event_idx_type == SBI_PMU_EVENT_TYPE_FW) { + + if (sUpdate) + pmu_ctrl_read_snapshot(phs, i, event_idx_type, + of_val, &ival); + + if (event_idx_type == SBI_PMU_EVENT_TYPE_FW) { edata = (event_code == SBI_PMU_FW_PLATFORM) ? phs->fw_counters_data[cidx - num_hw_ctrs] : 0x0; @@ -538,13 +617,16 @@ int sbi_pmu_ctr_stop(unsigned long cbase, unsigned long cmask, int ret = SBI_EINVAL; int event_idx_type; uint32_t event_code; + bool record = false; + uint64_t counter_val; + uint64_t of_val = 0; int i, cidx; if ((cbase + sbi_fls(cmask)) >= total_ctrs) return SBI_EINVAL; if (flag & SBI_PMU_STOP_FLAG_TAKE_SNAPSHOT) - return SBI_ENO_SHMEM; + record = true; for_each_set_bit(i, &cmask, BITS_PER_LONG) { cidx = i + cbase; @@ -558,12 +640,30 @@ int sbi_pmu_ctr_stop(unsigned long cbase, unsigned long cmask, else ret = pmu_ctr_stop_hw(cidx); + if (record) { + if (event_idx_type == SBI_PMU_EVENT_TYPE_FW) + ret = sbi_pmu_ctr_fw_read(cidx, &counter_val); + else { + counter_val = pmu_ctr_read_hw(cidx); + of_val = pmu_ctr_read_hw_of(cidx) << cidx; + } + + sbi_shmem_write_u64(&phs->shmem, + PMU_SNAPSHOT_COUNTER_OFFSET(i), + counter_val); + } + if (cidx > (CSR_INSTRET - CSR_CYCLE) && flag & SBI_PMU_STOP_FLAG_RESET) { phs->active_events[cidx] = SBI_PMU_EVENT_IDX_INVALID; pmu_reset_hw_mhpmevent(cidx); } } + if (record) + sbi_shmem_write_u64(&phs->shmem, + PMU_SNAPSHOT_COUNTER_OF_MAP_OFFSET, + of_val); + return ret; } @@ -946,6 +1046,37 @@ static void pmu_reset_event_map(struct sbi_pmu_hart_state *phs) phs->fw_counters_started = 0; } +int sbi_pmu_set_snapshot_shmem(unsigned long shmem_phys_lo, + unsigned long shmem_phys_hi, + unsigned long flags) +{ + struct sbi_pmu_hart_state *phs = pmu_thishart_state_ptr(); + int ret; + + if (flags) + return SBI_EINVAL; + + /* remove the stop flag */ + if (shmem_phys_lo == -1 && shmem_phys_hi == -1) { + sbi_shmem_region_clear(&phs->shmem); + return 0; + } + + ret = sbi_shmem_region_init(shmem_phys_lo, shmem_phys_hi, + PMU_SNAPSHOT_SHMEM_SIZE, + PMU_SNAPSHOT_SHMEM_ALIGN, + &phs->shmem); + if (ret) + return ret; + + ret = sbi_shmem_region_check(&phs->shmem, + SBI_SHMEM_M_RW | SBI_SHMEM_S_RW); + if (ret) + return ret; + + return 0; +} + const struct sbi_pmu_device *sbi_pmu_get_device(void) { return pmu_dev;