From patchwork Sun Jun 11 13:25:02 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Brown X-Patchwork-Id: 106085 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:994d:0:b0:3d9:f83d:47d9 with SMTP id k13csp2037461vqr; Sun, 11 Jun 2023 06:26:26 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ6BJ3oPlTtDqyddpEH1vr+nWrYT7ViuBvlXZCgB7dTKwJ25uBaPzL3OnwjmE3jwnSqxINea X-Received: by 2002:a17:906:dc90:b0:969:faf3:7dba with SMTP id cs16-20020a170906dc9000b00969faf37dbamr7377921ejc.52.1686489986690; Sun, 11 Jun 2023 06:26:26 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1686489986; cv=none; d=google.com; s=arc-20160816; b=pyv5aHvtbhqQ0LhNOXO7X89O6cwicV0VMHt+NUrev+n+N6mL3/WLr10wt4ZVxmTYsF cZucSTapR7GJ0QNY5uglWoCUaUXXjuYXytZ/djeIK334C+FEHdRMKoUoUBTjwq7v5ZMt zleIxRik8V1TSdlDDOB6XhbiSSV6Kdjw72bjU0fvLpPaE66rlXmFUf/bFuVShSh/NL/i GifdG0mHEZTNIZyv5UR3t8O7gxdlthVtv6a/YwthoSN5DPlu60z5jlWcpm4X8CaW7NGH +DqVLY30dlR8zAzRwFMOWx7M327QnvD1UqUrjt9Wvg/FN45252xDv5gOLX9Q5cN0sV+e riCg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:to:in-reply-to:references:message-id :content-transfer-encoding:mime-version:subject:date:from :dkim-signature; bh=Pqd726lrSruf06cqfibQUyPxO5mF4znle2995EFPMs4=; b=gRnHL/0YAKXqtM9JDpcJz9Ys+xn94wmUFCh6eK6UXdg124+fY9Eu2POwnm5iBYKzBJ 2nv2oXamL5MJaK8QfKetoSGTiVl3jB4s9CKmoNxjPyr+Hlu2s5buXCPr6qhvvPc4nVW/ 8j929yswH3xNfPJud/8FKMem8ielRY6G3+R7lpHrREf6WrBaiZVgd1e6P5fiDftBkghV eWAzZy5QCr8GjDFqsSiYyhUpdYAmN0RMfGd7GbBdt20rhrKOqJHhj8gkRwKN8N2m6mHs uBINWua2ClN+YZlXaXx2RLgFoWHFfFc+sO55zVD0KFDvEFbcGoiLtCXGboLBzwPIhPsy 7kIA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=sD1d1xsc; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id r13-20020aa7d14d000000b005148e864032si5026681edo.248.2023.06.11.06.26.01; Sun, 11 Jun 2023 06:26:26 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=sD1d1xsc; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233362AbjFKNZX (ORCPT + 99 others); Sun, 11 Jun 2023 09:25:23 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56878 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231255AbjFKNZT (ORCPT ); Sun, 11 Jun 2023 09:25:19 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4C2E7BC for ; Sun, 11 Jun 2023 06:25:18 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id DD9636162C for ; Sun, 11 Jun 2023 13:25:17 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id C792BC4339C; Sun, 11 Jun 2023 13:25:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1686489917; bh=iGXfXvl/InzCE01L3sj/3r7/25fU+y8vp67ay4WDSZk=; h=From:Date:Subject:References:In-Reply-To:To:From; b=sD1d1xsciU4UF1mPeH58L23UrGpOKJhQk5GEDMz+6hGModQ/HE6OnnrEFJcTa7GMV 7hwFwq8lYECkfqghCj2MY5ssvXEsJMYtFqZiX+StHYim4UFQddL1MgUnFFCrLIt5PZ V04QBMLPwi59BumYyf7C4Z37mU+ye5d6eZsEF/RGd45SBD8Ta7PKQRxmtJPVGOd/hH AotF4/+qpmcA3Yh38c+We+HO5SljXtFU5mo17NOorcg5CrmctAR/W7wder7ToBLncj 57K211Y+BCmCjxqUoL/JHFHmSx6UX44keX7O1WyEbOFQZQSn81wm9BbjyGNtB/KizG si45pb+eDGnCA== From: Mark Brown Date: Sun, 11 Jun 2023 14:25:02 +0100 Subject: [PATCH 1/2] regmap: Provide a ram backed regmap with raw support MIME-Version: 1.0 Message-Id: <20230610-regcache-raw-kunit-v1-1-583112cd28ac@kernel.org> References: <20230610-regcache-raw-kunit-v1-0-583112cd28ac@kernel.org> In-Reply-To: <20230610-regcache-raw-kunit-v1-0-583112cd28ac@kernel.org> To: linux-kernel@vger.kernel.org, Mark Brown X-Mailer: b4 0.13-dev-bfdf5 X-Developer-Signature: v=1; a=openpgp-sha256; l=5358; i=broonie@kernel.org; h=from:subject:message-id; bh=iGXfXvl/InzCE01L3sj/3r7/25fU+y8vp67ay4WDSZk=; b=owEBbQGS/pANAwAKASTWi3JdVIfQAcsmYgBkhcs58m+HeWH7HY7AiWhG5fOA1XIsYUj4h1lWHnha Emy3/gCJATMEAAEKAB0WIQSt5miqZ1cYtZ/in+ok1otyXVSH0AUCZIXLOQAKCRAk1otyXVSH0Fn8CA CGIdztpdcZxHw5ek5sxzeUB20CaHawbD3CQLm5mE2Sn4AuyVHgE1OoOTlawyCLNn1+n538YoLwud7+ E2zCUaH/6g+VuMudS7uDrSe6032ZwK6amDcDPyN2anauU+JmXvAe40FbgULzKgMoDsG1ZSfxmQlful OJ5OTMb34omIBUAoP+6hVnzTleeoqUowD9GnCBp0rvKdX0LSgb8tX78M0e/Li47+eg0so2szC7ziKE SlbShUMBwqAzvHTMOyKVcGu13VAGcMneP6yuJaPWMFcUF8lxP/yNThW8Zx6xdk/lAefJpIFMN/WdZN FqN263qa1EvaEjto7p7fEqV8RN/Pg9 X-Developer-Key: i=broonie@kernel.org; a=openpgp; fpr=3F2568AAC26998F9E813A1C5C3F436CA30F5D8EB X-Spam-Status: No, score=-7.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_HI, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1768412924581328786?= X-GMAIL-MSGID: =?utf-8?q?1768412924581328786?= Provide a simple, 16 bit only, RAM backed regmap which supports raw I/O for use in testing. Signed-off-by: Mark Brown --- drivers/base/regmap/Makefile | 2 +- drivers/base/regmap/internal.h | 8 +++ drivers/base/regmap/regmap-raw-ram.c | 133 +++++++++++++++++++++++++++++++++++ 3 files changed, 142 insertions(+), 1 deletion(-) diff --git a/drivers/base/regmap/Makefile b/drivers/base/regmap/Makefile index f6c6cb017200..5fdd0845b45e 100644 --- a/drivers/base/regmap/Makefile +++ b/drivers/base/regmap/Makefile @@ -8,7 +8,7 @@ obj-$(CONFIG_DEBUG_FS) += regmap-debugfs.o obj-$(CONFIG_REGMAP_KUNIT) += regmap-kunit.o obj-$(CONFIG_REGMAP_AC97) += regmap-ac97.o obj-$(CONFIG_REGMAP_I2C) += regmap-i2c.o -obj-$(CONFIG_REGMAP_RAM) += regmap-ram.o +obj-$(CONFIG_REGMAP_RAM) += regmap-ram.o regmap-raw-ram.o obj-$(CONFIG_REGMAP_SLIMBUS) += regmap-slimbus.o obj-$(CONFIG_REGMAP_SPI) += regmap-spi.o obj-$(CONFIG_REGMAP_SPMI) += regmap-spmi.o diff --git a/drivers/base/regmap/internal.h b/drivers/base/regmap/internal.h index 9bd0dfd1e259..d987ce182d22 100644 --- a/drivers/base/regmap/internal.h +++ b/drivers/base/regmap/internal.h @@ -312,6 +312,7 @@ struct regmap_ram_data { unsigned int *vals; /* Allocatd by caller */ bool *read; bool *written; + enum regmap_endian reg_endian; }; /* @@ -326,5 +327,12 @@ struct regmap *__regmap_init_ram(const struct regmap_config *config, #define regmap_init_ram(config, data) \ __regmap_lockdep_wrapper(__regmap_init_ram, #config, config, data) +struct regmap *__regmap_init_raw_ram(const struct regmap_config *config, + struct regmap_ram_data *data, + struct lock_class_key *lock_key, + const char *lock_name); + +#define regmap_init_raw_ram(config, data) \ + __regmap_lockdep_wrapper(__regmap_init_raw_ram, #config, config, data) #endif diff --git a/drivers/base/regmap/regmap-raw-ram.c b/drivers/base/regmap/regmap-raw-ram.c new file mode 100644 index 000000000000..c9b800885f3b --- /dev/null +++ b/drivers/base/regmap/regmap-raw-ram.c @@ -0,0 +1,133 @@ +// SPDX-License-Identifier: GPL-2.0 +// +// Register map access API - Memory region with raw access +// +// This is intended for testing only +// +// Copyright (c) 2023, Arm Ltd + +#include +#include +#include +#include +#include +#include +#include + +#include "internal.h" + +static unsigned int decode_reg(enum regmap_endian endian, const void *reg) +{ + const u16 *r = reg; + + if (endian == REGMAP_ENDIAN_BIG) + return be16_to_cpu(*r); + else + return le16_to_cpu(*r); +} + +static int regmap_raw_ram_gather_write(void *context, + const void *reg, size_t reg_len, + const void *val, size_t val_len) +{ + struct regmap_ram_data *data = context; + unsigned int r; + u16 *our_buf = (u16 *)data->vals; + int i; + + if (reg_len != 2) + return -EINVAL; + if (val_len % 2) + return -EINVAL; + + r = decode_reg(data->reg_endian, reg); + memcpy(&our_buf[r], val, val_len); + + for (i = 0; i < val_len / 2; i++) + data->written[r + i] = true; + + return 0; +} + +static int regmap_raw_ram_write(void *context, const void *data, size_t count) +{ + return regmap_raw_ram_gather_write(context, data, 2, + data + 2, count - 2); +} + +static int regmap_raw_ram_read(void *context, + const void *reg, size_t reg_len, + void *val, size_t val_len) +{ + struct regmap_ram_data *data = context; + unsigned int r; + u16 *our_buf = (u16 *)data->vals; + int i; + + if (reg_len != 2) + return -EINVAL; + if (val_len % 2) + return -EINVAL; + + r = decode_reg(data->reg_endian, reg); + memcpy(val, &our_buf[r], val_len); + + for (i = 0; i < val_len / 2; i++) + data->read[r + i] = true; + + return 0; +} + +static void regmap_raw_ram_free_context(void *context) +{ + struct regmap_ram_data *data = context; + + kfree(data->vals); + kfree(data->read); + kfree(data->written); + kfree(data); +} + +static const struct regmap_bus regmap_raw_ram = { + .fast_io = true, + .write = regmap_raw_ram_write, + .gather_write = regmap_raw_ram_gather_write, + .read = regmap_raw_ram_read, + .free_context = regmap_raw_ram_free_context, +}; + +struct regmap *__regmap_init_raw_ram(const struct regmap_config *config, + struct regmap_ram_data *data, + struct lock_class_key *lock_key, + const char *lock_name) +{ + struct regmap *map; + + if (config->reg_bits != 16) + return ERR_PTR(-EINVAL); + + if (!config->max_register) { + pr_crit("No max_register specified for RAM regmap\n"); + return ERR_PTR(-EINVAL); + } + + data->read = kcalloc(sizeof(bool), config->max_register + 1, + GFP_KERNEL); + if (!data->read) + return ERR_PTR(-ENOMEM); + + data->written = kcalloc(sizeof(bool), config->max_register + 1, + GFP_KERNEL); + if (!data->written) + return ERR_PTR(-ENOMEM); + + data->reg_endian = config->reg_format_endian; + + map = __regmap_init(NULL, ®map_raw_ram, data, config, + lock_key, lock_name); + + return map; +} +EXPORT_SYMBOL_GPL(__regmap_init_raw_ram); + +MODULE_LICENSE("GPL v2");