From patchwork Thu Jan 11 00:35:32 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Inochi Amaoto X-Patchwork-Id: 1885289 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=zXmlh6Kx; 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=iOM7bCb1; 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 4T9Qh65xybz1yPm for ; Thu, 11 Jan 2024 11:36:06 +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=Ak2E4pthMozbh5JbQ8eEqb/w01G0oBo5TNM5QKrxY54=; b=zXmlh6KxJCFdX1 /tqUHw5Vy/OD+5yPrA3yxv+0W0bIWqIiOBbPXt46IAwFDijmWgWYAcVFFdFeajy4N0ipzGLphlAg+ P/K6UDNKi2JYZSeSU4h/wRWBORFwI4KLBu6EtrFceIUGs1a3DuyaHQ0CDLA4ZgkE2jrIzqTzLl/H6 YQsC0VpOPtfyylcRG5/QYfN+Ir2ovKTt7sbBOaNXuSFQRMuINnOiNAoXDQ2Q2lRIP5CllZkjMjRDJ Mx2NnixpqeRPDN6MGR2Ii13JVPyQ4Ofw8NTUi+s/oSskTDVvtZnWPwGkaBNdSCUrviAwED8LOi7yU 7eh0xcCd5V/8HIA+XYMg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1rNj34-00ExJU-0k; Thu, 11 Jan 2024 00:35:54 +0000 Received: from mail-mw2nam12olkn2049.outbound.protection.outlook.com ([40.92.23.49] helo=NAM12-MW2-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1rNj30-00ExIM-2p for opensbi@lists.infradead.org; Thu, 11 Jan 2024 00:35:52 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=iLnQC/OD5NHyIa9pc1jGbMol0+GGynUDhqEAckpqRr8PFnDKbVrYVNykDT4eH4onwFrQX8l/zHTUBfX812owyqtB+1SEYZnmQiLBC96EJA/Y9WyRJFllXTcxmpwKnMmDX0Pq0JTl85FGQ8NTtGhu8fQeKf8Rrpg37tS5kUNni4BdZz/WO56YOXSPWhCjSCAuvINo3tOC9XBbraoLAIN/77iamPzg128kptirT1crx4MZ8/HXUz1L5P6R1FYdvCV7M/b2MmqoCTO18/x83nlor1t8HGBUXELjAA6A4zjmUeHsf2Cg2E8XHA65giAQg3DQXbJ9TKA1x06SxpJ9kJ8Bgw== 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=1yk7/QQTcwP+dUqiTuUFa82tF/2zUV+N6Y14N0NXWms=; b=KsJ+Wv5g9BXqX+NFeilKkdGMutfOyMTonpo3rNftzflxpJeKyOf9ErimFYVc6bfUcvf9/gvRgBkn5mOzvedHRba6a4G0SZC3gH/solepn0oJTZBK+xrzTo4ZIvmi+XnzxtD32aLL4tgVTFxN8Ksr4U56YgAPCHKDUHY813brybPQR9Rop8iSyhzb4YLE0Pb2FnBzY+y7nzx+9OV1abBGRTqd85j8P5EvETMUqJh/pJkWOXeR7XwUNeVFpvysxA5paLO5FOoyrIK7yA4wuXygBTbVSU/pGIdr58j7yFdiSK+fZdW4ElEpoVX6UDz/27rOs0yuOQTFCYOMRNjyMjjG1w== 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=1yk7/QQTcwP+dUqiTuUFa82tF/2zUV+N6Y14N0NXWms=; b=iOM7bCb1Na/xEaItriS0vdDKRLHgUm4vaC9vbMqRWlFn3SCGGjStzES0c8VSXkGSXf8BSa9Ixx0mD7jn4ekVX5t3Jw1haVHQOnQtMgYzpNL701qfr+xbOsCL2DT/UkYdNFwZUEFwJb/YZQE9/U99SYgBhot6OqeWKxLLUhM0RRlBZnd9B2uscQZUhfcjL3RDF3AYvDP8fducr1rGmwmhe9VbZaAyG1bo5JIscz1vIj6tVj64ahzHsYcHE1R/d7IFiRko/GUW9+XRRep0CUOlfd497JLborzBn5WQN4XqD9MeFtCx9ZHStkm3aGpl2HPBeXKOtXtxXOBX81OQYOh8bw== 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:35:46 +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:35:46 +0000 From: Inochi Amaoto To: Anup Patel , Atish Patra , Xiang W Cc: opensbi@lists.infradead.org, Inochi Amaoto Subject: [RFC PATCH v2 1/2] lib: sbi: Add shared memory region support Date: Thu, 11 Jan 2024 08:35:32 +0800 Message-ID: X-Mailer: git-send-email 2.43.0 In-Reply-To: References: X-TMN: [kkPj05UDLV0yGlipwRS7swfyDkB0B5tzT+lWIPwdfaU=] X-ClientProxiedBy: TYCPR01CA0119.jpnprd01.prod.outlook.com (2603:1096:405:4::35) To IA1PR20MB4953.namprd20.prod.outlook.com (2603:10b6:208:3af::19) X-Microsoft-Original-Message-ID: <20240111003533.119645-1-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: 304c8239-7d24-4008-2ba1-08dc123d404f X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: Bo+Ac4V+odJ5yn6cexHaaryk2GCQCPR0mH3gBtuAqoeUWMKQKOQmx2jNUVGJNmYBTUSrib7PRS5zxe2dJ0iv1Ze4Awrx9iWfSZoq/fccNA9SBsk8T45dfvIJG2lSbAUDHYldyd6eF/IiY0ji3bcoR+lCBnfWJjGROFyChScgxekruUsCwy+bU3t3DgLhRgO582Rh/X74LnSd/odUVTaLmG+4eWJpNO5e5F9y7UOfDgCAJceXY89joWlpZrCkXtRbcOptzzexI8msmTL2jgIlWNjz+6qUTb9oC5MDp1hVbsAzLLQDbIhwVI+8eRLGgF/LPsr8mOiXghy6b584LV15qyELmT5yB+D4nqgwVa32C16iyrEWP6yD2eguFuA5tXhxa75faxgbCKVfQTt8jZk+xrcWaaJ2rLKaImnnBtLbZg3PhTYwwq8mlHD4a+AYaSoUw+ZgrMO1Ohr2T4jHTl9INYv7gcqYmoPR08YrJvjgWPw1T2jMEfVaxkaR2I08AlwcF2/S747ZxXMWVanw6gj4cggE8DHAiNbtQdk6sY1Aq1UZedZTzoI/4zNv8uvaUIbCKwsmIwbIt0j5UQ3yGes9tw2OsZhot7UOo2KjYMdAlpa+vRqxKBoy1nYWykHsF/Ad X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: xIfaXGyAXg9Ulef2SrU3AwGDLIfc4LL+GwXcMPSy2zuWksSMlYSX99jMYgZR04rfwheVQDJP6fZKNnhRUfWvyoSUTlX6wJZMFs+j2vln5yr7qx6bc6W3/BgDW/CgrAYfFvCJmgH/QvtCmmKOSSm13kzomHUwIFJ+dvONok38qGvBRRULpL1q0vLk4CQuaQXj+qGz4/i0ygZ/9CFrNyChRHkyK4O/MvI1w/mKAjJiw55vy7IW7iRjPo1zwrK5vkfG3ocxEoN6hNV03Mku656F0Nda0j5Q9DdH9U6oDnCmWuj6DZZNWKtnoYhN7CFtQz+DRMGXho42NX2d9IMs1O3lP6k3OGdtJg9z84G3HIoKufdmfp5KmblK0Ze0bljD1arS9WmOAtNol/vmD0za8yDynx28wA1W1s9p7XmfqeC+jhO5DjOwrXBI3jUcfiWtV79S9abTBfmIWdOnQ6VbYD6a9m68p+P4ze8/JW4GwuIrKnFOyW7NHt0Ouk9Wk/EkAfABoFhxjcPuluc7uejJHa3EWy606Qy+E0w5jx8MxG0uxtrnFreqaP8gn/P2fsRZOU7FxkrgOpZOedRCbZ+tdaJciw3950Wo/rVgB25YbdzhTJm13BMIsetvtvfOv788I5QmqrGBuDL+VDMN0y7LUTS5/c5LoXB1cctoo+NFodZqQaQ/Z5FqnvAbRcvwvGx26aLW+7sIxtaNcrwaHetl8xIo6YIuSxju6/3txDt7qKm/bsKsyOPDGkFF8sX5fAU3aQ5liIFgk0ISPHNQ6K7jsZV3yK1EAH3JLH9QZJQrWwB/Fj+1LrVJP9BGlGppcR1RDSlDXM/4SKRInGNeNqvtj1wkvxdaClZ/C3xkggDbe9ZfpNCrwWpM7KV+31dKERDargD22QvMp99s4hDWZl/S6sqsZ+IGi/PPhOqYDTJkjxsosYnSZVOX0WefhRztP1PgcJpwakvQ1hOWspwW9l3wCumD1Azz198xMp1L4ghyj0+TGgaelPFf+lynjGi3UgWs4UtwJndcNeSLTGLjCyEGTfYPftCpz5mjJGCuWrg437M/lG1ib7e+HBMTYaCFwADJNtA6yr3iuOzwqCJyDVe5SPJDAU/OhHOBmyI010iWZ5TLLLm8gIUcB7Co3wS47k6pdZnMCV9c78WQ45cb++QH+JSDUc7YnTQ/fV+hb++mfZJzMfBdoZElUlOvXvFY01n9TYCeFnKj3b/GRe5+RTBlYkOyFBYeop7oJ8ybnc+I2sDoVWc= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 304c8239-7d24-4008-2ba1-08dc123d404f 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:35:46.3362 (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_163550_938459_4F1D2955 X-CRM114-Status: GOOD ( 16.94 ) 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 2.0 introducts shared memory between SBI and supervisor-mode software, which is needed by various extension. So add inital support for shared memory mechanisms. Signed-off-by: Inochi Amaoto --- include/sbi/sbi_bitops.h | 3 + include/sbi/sbi_shm.h | 129 +++++++++++++++++++++++++++++++++++++++ lib/sbi/objects.mk | 1 + lib/sbi/sbi_shm.c | 114 +++++++++++++++++ [...] Content analysis details: (-0.2 points, 5.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at https://www.dnswl.org/, no trust [40.92.23.49 listed in list.dnswl.org] -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.0 RCVD_IN_MSPIKE_H2 RBL: Average reputation (+2) [40.92.23.49 listed in wl.mailspike.net] -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 2.0 introducts shared memory between SBI and supervisor-mode software, which is needed by various extension. So add inital support for shared memory mechanisms. Signed-off-by: Inochi Amaoto --- include/sbi/sbi_bitops.h | 3 + include/sbi/sbi_shm.h | 129 +++++++++++++++++++++++++++++++++++++++ lib/sbi/objects.mk | 1 + lib/sbi/sbi_shm.c | 114 ++++++++++++++++++++++++++++++++++ 4 files changed, 247 insertions(+) create mode 100644 include/sbi/sbi_shm.h create mode 100644 lib/sbi/sbi_shm.c diff --git a/include/sbi/sbi_bitops.h b/include/sbi/sbi_bitops.h index 7d90334..19b478a 100644 --- a/include/sbi/sbi_bitops.h +++ b/include/sbi/sbi_bitops.h @@ -28,6 +28,9 @@ #define BIT_WORD_OFFSET(bit) ((bit) & (BITS_PER_LONG - 1)) #define BIT_ALIGN(bit, align) (((bit) + ((align) - 1)) & ~((align) - 1)) +#define IS_BIT_ALIGN(bit, align) \ + (((bit) & ((align) - 1)) == 0) + #define GENMASK(h, l) \ (((~0UL) - (1UL << (l)) + 1) & (~0UL >> (BITS_PER_LONG - 1 - (h)))) diff --git a/include/sbi/sbi_shm.h b/include/sbi/sbi_shm.h new file mode 100644 index 0000000..c50753b --- /dev/null +++ b/include/sbi/sbi_shm.h @@ -0,0 +1,129 @@ +/* + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright (c) 2024 Inochi Amaoto + */ + +#ifndef __SBI_SHM_H__ +#define __SBI_SHM_H__ + +#include + +#define SBI_SHMEM_M_READABLE (1UL << 0) +#define SBI_SHMEM_M_WRITABLE (1UL << 1) +#define SBI_SHMEM_M_EXECUTABLE (1UL << 2) +#define SBI_SHMEM_S_READABLE (1UL << 3) +#define SBI_SHMEM_S_WRITABLE (1UL << 4) +#define SBI_SHMEM_S_EXECUTABLE (1UL << 5) + +#define SBI_SHMEM_M_RW \ + (SBI_SHMEM_M_READABLE | \ + SBI_SHMEM_M_WRITABLE) +#define SBI_SHMEM_M_RWX \ + (SBI_SHMEM_M_READABLE | \ + SBI_SHMEM_M_WRITABLE | \ + SBI_SHMEM_M_EXECUTABLE) + +#define SBI_SHMEM_S_RW \ + (SBI_SHMEM_S_READABLE | \ + SBI_SHMEM_S_WRITABLE) +#define SBI_SHMEM_S_RWX \ + (SBI_SHMEM_S_READABLE | \ + SBI_SHMEM_S_WRITABLE | \ + SBI_SHMEM_S_EXECUTABLE) + +#define SBI_SHMEM_S_ACCESS_SHIFT 3 + +struct sbi_shmem { + unsigned long addr; + unsigned long size; +}; + +int sbi_shmem_region_init(unsigned long lo, unsigned long hi, + unsigned long size, unsigned long align, + struct sbi_shmem *shmem); +void sbi_shmem_region_clear(struct sbi_shmem *shmem); + +int sbi_shmem_region_check(struct sbi_shmem *shmem, unsigned long flags); + +int sbi_shmem_raw_read(struct sbi_shmem *shmem, unsigned long offset, + void* value, unsigned long size); +int sbi_shmem_raw_write(struct sbi_shmem *shmem, unsigned long offset, + void* value, unsigned long size); + +static inline int sbi_shmem_read_u8(struct sbi_shmem *shmem, + unsigned long offset, + uint8_t* value) +{ + return sbi_shmem_raw_read(shmem, offset, value, 1); +} + +static inline int sbi_shmem_read_u16(struct sbi_shmem *shmem, + unsigned long offset, + uint16_t* value) +{ + uint16_t tmp; + int ret = sbi_shmem_raw_write(shmem, offset, &tmp, 2); + + *value = le16_to_cpu(tmp); + + return ret; +} + +static inline int sbi_shmem_read_u32(struct sbi_shmem *shmem, + unsigned long offset, + uint32_t* value) +{ + uint32_t tmp; + int ret = sbi_shmem_raw_write(shmem, offset, &tmp, 4); + + *value = le32_to_cpu(tmp); + + return ret; +} + +static inline int sbi_shmem_read_u64(struct sbi_shmem *shmem, + unsigned long offset, + uint64_t* value) +{ + uint64_t tmp; + int ret = sbi_shmem_raw_write(shmem, offset, &tmp, 8); + + *value = le64_to_cpu(tmp); + + return ret; +} + +static inline int sbi_shmem_write_u8(struct sbi_shmem *shmem, + unsigned long offset, + uint8_t value) +{ + return sbi_shmem_raw_write(shmem, offset, &value, 1); +} + +static inline int sbi_shmem_write_u16(struct sbi_shmem *shmem, + unsigned long offset, + uint16_t value) +{ + uint16_t tmp = cpu_to_le16(value); + return sbi_shmem_raw_write(shmem, offset, &tmp, 2); +} + +static inline int sbi_shmem_write_u32(struct sbi_shmem *shmem, + unsigned long offset, + uint32_t value) +{ + uint32_t tmp = cpu_to_le32(value); + return sbi_shmem_raw_write(shmem, offset, &tmp, 4); +} + +static inline int sbi_shmem_write_u64(struct sbi_shmem *shmem, + unsigned long offset, + uint64_t value) +{ + uint64_t tmp = cpu_to_le64(value); + return sbi_shmem_raw_write(shmem, offset, &tmp, 8); +} + + +#endif // __SBI_SHM_H__ diff --git a/lib/sbi/objects.mk b/lib/sbi/objects.mk index c699187..5ffef06 100644 --- a/lib/sbi/objects.mk +++ b/lib/sbi/objects.mk @@ -71,6 +71,7 @@ libsbi-objs-y += sbi_misaligned_ldst.o libsbi-objs-y += sbi_platform.o libsbi-objs-y += sbi_pmu.o libsbi-objs-y += sbi_scratch.o +libsbi-objs-y += sbi_shm.o libsbi-objs-y += sbi_string.o libsbi-objs-y += sbi_system.o libsbi-objs-y += sbi_timer.o diff --git a/lib/sbi/sbi_shm.c b/lib/sbi/sbi_shm.c new file mode 100644 index 0000000..213edaf --- /dev/null +++ b/lib/sbi/sbi_shm.c @@ -0,0 +1,114 @@ +/* + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright (c) 2024 Inochi Amaoto + */ + +#include +#include +#include +#include +#include +#include + +void sbi_shmem_region_clear(struct sbi_shmem *shmem) +{ + shmem->addr = 0; + shmem->size = 0; +} + +int sbi_shmem_region_init(unsigned long lo, unsigned long hi, + unsigned long size, unsigned long align, + struct sbi_shmem *shmem) +{ + if (IS_BIT_ALIGN(lo, align)) + return SBI_EINVAL; + + if (size == 0) + return SBI_EINVAL; + + /* TODO: support address wider than XLEN bits */ + if (hi) + return SBI_EINVALID_ADDR; + + shmem->addr = lo; + shmem->size = size; + + return 0; +} + +static int __sbi_shmem_region_check(struct sbi_domain *domain, + struct sbi_shmem *shmem, + unsigned long mode, unsigned long flags) +{ + unsigned long access_flags = 0; + int ret; + + if (flags & SBI_SHMEM_M_RWX) { + if (flags & SBI_SHMEM_M_READABLE) + access_flags |= SBI_DOMAIN_READ; + if (flags & SBI_SHMEM_M_WRITABLE) + access_flags |= SBI_DOMAIN_WRITE; + if (flags & SBI_SHMEM_M_EXECUTABLE) + access_flags |= SBI_DOMAIN_EXECUTE; + ret = sbi_domain_check_addr_range(domain, + shmem->addr, shmem->size, + mode, access_flags); + if (!ret) + return SBI_EINVALID_ADDR; + } + + return 0; +} + + +int sbi_shmem_region_check(struct sbi_shmem *shmem, unsigned long flags) +{ + struct sbi_domain *domain = sbi_domain_thishart_ptr(); + int ret; + + if (shmem->size == 0) + return SBI_EINVAL; + + ret = __sbi_shmem_region_check(domain, shmem, PRV_M, flags); + if (ret) + return ret; + + ret = __sbi_shmem_region_check(domain, shmem, PRV_S, + flags >> SBI_SHMEM_S_ACCESS_SHIFT); + if (ret) + return ret; + + return 0; +} + + +int sbi_shmem_raw_write(struct sbi_shmem *shmem, unsigned long offset, + void* value, unsigned long size) +{ + void *pos = (void *)(shmem->addr + offset); + + if (shmem->size <= offset + size) + return SBI_EINVAL; + + mb(); + sbi_memcpy(pos, value, size); + wmb(); + + return 0; +} + +int sbi_shmem_raw_read(struct sbi_shmem *shmem, unsigned long offset, + void* value, unsigned long size) +{ + void *pos = (void *)(shmem->addr + offset); + + if (shmem->size <= offset + size) + return SBI_EINVAL; + + rmb(); + sbi_memcpy(value, pos, size); + wmb(); + + return 0; +} 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;