Received: by 2002:ab2:3350:0:b0:1f4:6588:b3a7 with SMTP id o16csp1395123lqe; Mon, 8 Apr 2024 07:47:44 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCVt3N94VDMUZQzhjVgqpJAbJJHtMt4fM92IQxI7kMorGgRPbXbc4+T5ol6i20o9EvW0tXehdNZE+J1zGBhX+7XulTYjaRe0QpK9JGu7Gg== X-Google-Smtp-Source: AGHT+IHpIbSm983DV10fNpm6Mmt3MBd4fY+Eb7J+CTll7HKvDL+kfk93NbaHAe4kD3RDi7dtlm/g X-Received: by 2002:a05:6a00:c89:b0:6ea:c62c:c20f with SMTP id a9-20020a056a000c8900b006eac62cc20fmr11158669pfv.9.1712587663752; Mon, 08 Apr 2024 07:47:43 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1712587663; cv=pass; d=google.com; s=arc-20160816; b=XQcPamLqMVKDrCQ4ShpAiJpbbCRcxiny0N3dZHoxoDE+5VAZlK8gsj/PKg932baMp1 ZmEaWuQiGqGUg5HajS8Nf9fJC+CVk4R3YyRiL17MAw1lMcNRyzq56FKb8KcgTkjq401f RLyHsepDJXZTAQb4ev9hH0Sni+2Xy7YlSUQDPoWX/MrRBiYkyILoXWpPUtsSXm6noqXM hEqtCcKR5Jkxs+DB0YyKuDQZgxpVtZrp97IOoe9j9j5t6alWPm6g41eiEarJqsiWNs/C k3k8O3w3jNONWrYjZaEaXRSxHne764w5AgeC22MuEfpFOd3m6tKC3xzoBV4XKH7DRpgQ /dTw== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=O5fCzEJa1jx4fBDOGZmOfideFG5tZrN1thyOmxVVxFs=; fh=CpWGL0kPt/6lZb0GWvNT7y2IVz7KXjXP5Oh3nfa9mcg=; b=DPR7L0w22FH7sUQgPM1/ahaslyY0+RamaUjcU6EzI17U5fGgF+scAKbzjCg4/WzHEf PR8zjA+IS6SF5BX4bJFGSMZjHb1DholBxjGkQ20Upl3lXDzwkphv4/TpEJBG2YZ4PCBD 8StVjPKeLf/LmoVBbRNfATZQFEYDsR3P44RgQg3rDgLLzu2GlsV/fjLyvfYxf5oiIyvv 8rxed/jMnRDGiigk0aX1zKMEHlr2jCxV4Dlm4c5Cm9jgzIp99UFZtDCGaj0nwrAImqqd 8tAI6HtQLOaFl8FxWFJ2RcMecR2mN3qX2zU9rRdkiKVTYSX2WAB8UplByvWInubGqDeP g5Qw==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@cirrus.com header.s=PODMain02222019 header.b=YdAtm19b; arc=pass (i=1 spf=pass spfdomain=opensource.cirrus.com dkim=pass dkdomain=cirrus.com dmarc=pass fromdomain=opensource.cirrus.com); spf=pass (google.com: domain of linux-kernel+bounces-135549-linux.lists.archive=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) smtp.mailfrom="linux-kernel+bounces-135549-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=cirrus.com Return-Path: Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [139.178.88.99]) by mx.google.com with ESMTPS id ff19-20020a056a002f5300b006e732c05716si6322713pfb.355.2024.04.08.07.47.43 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 08 Apr 2024 07:47:43 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-135549-linux.lists.archive=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) client-ip=139.178.88.99; Authentication-Results: mx.google.com; dkim=pass header.i=@cirrus.com header.s=PODMain02222019 header.b=YdAtm19b; arc=pass (i=1 spf=pass spfdomain=opensource.cirrus.com dkim=pass dkdomain=cirrus.com dmarc=pass fromdomain=opensource.cirrus.com); spf=pass (google.com: domain of linux-kernel+bounces-135549-linux.lists.archive=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) smtp.mailfrom="linux-kernel+bounces-135549-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=cirrus.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sv.mirrors.kernel.org (Postfix) with ESMTPS id 3D4EE284140 for ; Mon, 8 Apr 2024 14:47:43 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 93AC21411EA; Mon, 8 Apr 2024 14:46:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=cirrus.com header.i=@cirrus.com header.b="YdAtm19b" Received: from mx0b-001ae601.pphosted.com (mx0a-001ae601.pphosted.com [67.231.149.25]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C58DC13F443 for ; Mon, 8 Apr 2024 14:46:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=67.231.149.25 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712587573; cv=none; b=htesQEUyilAuAhDk2KYaWOH0sBmzP/3RU2APsxCX0vCEt7xPm0/l2RDq66iT1ctZcoYvqye3C9H8stdNPE5QGq94f0k0c5ZMBkp6P/kW1Ysc2+3sM4kwnlxqwi8kBrvOkCvKmqkL/bU457enznOzs0CC7nIfkzhnxMhPgbVBxPI= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712587573; c=relaxed/simple; bh=1tZf6ntL+ZBT5VbnOA4amHONxR7tyFNpQjcDjtHoN3Y=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=GRaGYDN7GHDoJXEn+hStYhOIENUuR5GAkZIjMVFPfSz7MVEortIrYEb/NddUjWSRvUHRDvU+iTugkxqw0rBxFvdu9YCckAH058WC5HQabKg7S078BjxXAkZLhjVrRWYYre4MTsnplLCjn9ScJLbTJHEEszscJM+1hiqrcha5WZs= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=opensource.cirrus.com; spf=pass smtp.mailfrom=opensource.cirrus.com; dkim=pass (2048-bit key) header.d=cirrus.com header.i=@cirrus.com header.b=YdAtm19b; arc=none smtp.client-ip=67.231.149.25 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=opensource.cirrus.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=opensource.cirrus.com Received: from pps.filterd (m0077473.ppops.net [127.0.0.1]) by mx0a-001ae601.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 4385hvQq026412; Mon, 8 Apr 2024 09:46:07 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cirrus.com; h= from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding:content-type; s= PODMain02222019; bh=O5fCzEJa1jx4fBDOGZmOfideFG5tZrN1thyOmxVVxFs=; b= YdAtm19biTeZDVywcJqveGuJXhv7tTGys2ByKOCiT/vBpYM92yXnQz2de2qTJHj1 ry/8pMOX4hImFLhtSFH6t5KX9ZgdzX3BreGtvXOEyFBJcic60HcdByFw5GZ/kiCD mSlOwUDmVu6QwJmxeoyWt9vys/RDasBcrBHRjJQFUD35EQXtFH028EVHFEk5rdEC C/V+rQBP8NbCWoZvV+MsImWB3GF6dFbHbsTBJkUCH81B4qU/nx8N29QvujlqMlHa OoWuxNRQeYnrSawRMGS1wh09jCclbSs6eHgNexiU4LncQj23vZthFoC684MZ7B0D XMFe02DYq/bJnkcauRUbbg== Received: from ediex01.ad.cirrus.com ([84.19.233.68]) by mx0a-001ae601.pphosted.com (PPS) with ESMTPS id 3xb3sxhjp8-6 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 08 Apr 2024 09:46:07 -0500 (CDT) Received: from ediex02.ad.cirrus.com (198.61.84.81) by ediex01.ad.cirrus.com (198.61.84.80) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.9; Mon, 8 Apr 2024 15:46:01 +0100 Received: from ediswmail9.ad.cirrus.com (198.61.86.93) by anon-ediex02.ad.cirrus.com (198.61.84.81) with Microsoft SMTP Server id 15.2.1544.9 via Frontend Transport; Mon, 8 Apr 2024 15:46:01 +0100 Received: from ediswws06.ad.cirrus.com (ediswws06.ad.cirrus.com [198.90.208.18]) by ediswmail9.ad.cirrus.com (Postfix) with ESMTP id DC2DC820273; Mon, 8 Apr 2024 14:46:00 +0000 (UTC) From: Richard Fitzgerald To: CC: , , "Richard Fitzgerald" Subject: [PATCH 11/11] regmap: kunit: Add test cases for regmap_read_bypassed() Date: Mon, 8 Apr 2024 15:46:00 +0100 Message-ID: <20240408144600.230848-12-rf@opensource.cirrus.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240408144600.230848-1-rf@opensource.cirrus.com> References: <20240408144600.230848-1-rf@opensource.cirrus.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-Proofpoint-ORIG-GUID: sDJSNYLX5NYFZ7OwIQWJN-ot2LaQAd2l X-Proofpoint-GUID: sDJSNYLX5NYFZ7OwIQWJN-ot2LaQAd2l X-Proofpoint-Spam-Reason: safe This adds test cases to prove that regmap_read_bypassed() reads the hardware value while the regmap is in cache-only. Signed-off-by: Richard Fitzgerald --- This depends on pending commit ("regmap: Add regmap_read_bypassed()") https://lore.kernel.org/linux-sound/20240408101803.43183-1-rf@opensource.cirrus.com/T/#m2b99b1e01872bfc3597e89dee57dcdd5dbaf1b55 --- drivers/base/regmap/regmap-kunit.c | 131 +++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) diff --git a/drivers/base/regmap/regmap-kunit.c b/drivers/base/regmap/regmap-kunit.c index 6e469609c82c..44265dc2313d 100644 --- a/drivers/base/regmap/regmap-kunit.c +++ b/drivers/base/regmap/regmap-kunit.c @@ -295,6 +295,135 @@ static void bulk_read(struct kunit *test) KUNIT_EXPECT_EQ(test, config.cache_type == REGCACHE_NONE, data->read[i]); } +static void read_bypassed(struct kunit *test) +{ + const struct regmap_test_param *param = test->param_value; + struct regmap *map; + struct regmap_config config; + struct regmap_ram_data *data; + unsigned int val[BLOCK_TEST_SIZE], rval; + int i; + + config = test_regmap_config; + + map = gen_regmap(test, &config, &data); + KUNIT_ASSERT_FALSE(test, IS_ERR(map)); + if (IS_ERR(map)) + return; + + KUNIT_EXPECT_FALSE(test, map->cache_bypass); + + get_random_bytes(&val, sizeof(val)); + + /* Write some test values */ + KUNIT_EXPECT_EQ(test, 0, regmap_bulk_write(map, param->from_reg, val, ARRAY_SIZE(val))); + + regcache_cache_only(map, true); + + /* + * While in cache-only regmap_read_bypassed() should return the register + * value and leave the map in cache-only. + */ + for (i = 0; i < ARRAY_SIZE(val); i++) { + /* Put inverted bits in rval to prove we really read the value */ + rval = ~val[i]; + KUNIT_EXPECT_EQ(test, 0, regmap_read(map, param->from_reg + i, &rval)); + KUNIT_EXPECT_EQ(test, val[i], rval); + + rval = ~val[i]; + KUNIT_EXPECT_EQ(test, 0, regmap_read_bypassed(map, param->from_reg + i, &rval)); + KUNIT_EXPECT_EQ(test, val[i], rval); + KUNIT_EXPECT_TRUE(test, map->cache_only); + KUNIT_EXPECT_FALSE(test, map->cache_bypass); + } + + /* + * Change the underlying register values to prove it is returning + * real values not cached values. + */ + for (i = 0; i < ARRAY_SIZE(val); i++) { + val[i] = ~val[i]; + data->vals[param->from_reg + i] = val[i]; + } + + for (i = 0; i < ARRAY_SIZE(val); i++) { + rval = ~val[i]; + KUNIT_EXPECT_EQ(test, 0, regmap_read(map, param->from_reg + i, &rval)); + KUNIT_EXPECT_NE(test, val[i], rval); + + rval = ~val[i]; + KUNIT_EXPECT_EQ(test, 0, regmap_read_bypassed(map, param->from_reg + i, &rval)); + KUNIT_EXPECT_EQ(test, val[i], rval); + KUNIT_EXPECT_TRUE(test, map->cache_only); + KUNIT_EXPECT_FALSE(test, map->cache_bypass); + } +} + +static void read_bypassed_volatile(struct kunit *test) +{ + const struct regmap_test_param *param = test->param_value; + struct regmap *map; + struct regmap_config config; + struct regmap_ram_data *data; + unsigned int val[BLOCK_TEST_SIZE], rval; + int i; + + config = test_regmap_config; + /* All registers except #5 volatile */ + config.volatile_reg = reg_5_false; + + map = gen_regmap(test, &config, &data); + KUNIT_ASSERT_FALSE(test, IS_ERR(map)); + if (IS_ERR(map)) + return; + + KUNIT_EXPECT_FALSE(test, map->cache_bypass); + + get_random_bytes(&val, sizeof(val)); + + /* Write some test values */ + KUNIT_EXPECT_EQ(test, 0, regmap_bulk_write(map, param->from_reg, val, ARRAY_SIZE(val))); + + regcache_cache_only(map, true); + + /* + * While in cache-only regmap_read_bypassed() should return the register + * value and leave the map in cache-only. + */ + for (i = 0; i < ARRAY_SIZE(val); i++) { + /* Register #5 is non-volatile so should read from cache */ + KUNIT_EXPECT_EQ(test, (i == 5) ? 0 : -EBUSY, + regmap_read(map, param->from_reg + i, &rval)); + + /* Put inverted bits in rval to prove we really read the value */ + rval = ~val[i]; + KUNIT_EXPECT_EQ(test, 0, regmap_read_bypassed(map, param->from_reg + i, &rval)); + KUNIT_EXPECT_EQ(test, val[i], rval); + KUNIT_EXPECT_TRUE(test, map->cache_only); + KUNIT_EXPECT_FALSE(test, map->cache_bypass); + } + + /* + * Change the underlying register values to prove it is returning + * real values not cached values. + */ + for (i = 0; i < ARRAY_SIZE(val); i++) { + val[i] = ~val[i]; + data->vals[param->from_reg + i] = val[i]; + } + + for (i = 0; i < ARRAY_SIZE(val); i++) { + if (i == 5) + continue; + + rval = ~val[i]; + KUNIT_EXPECT_EQ(test, 0, regmap_read_bypassed(map, param->from_reg + i, &rval)); + KUNIT_EXPECT_EQ(test, val[i], rval); + KUNIT_EXPECT_TRUE(test, map->cache_only); + KUNIT_EXPECT_FALSE(test, map->cache_bypass); + } +} + static void write_readonly(struct kunit *test) { struct regmap *map; @@ -1747,6 +1876,8 @@ static void raw_ranges(struct kunit *test) static struct kunit_case regmap_test_cases[] = { KUNIT_CASE_PARAM(basic_read_write, regcache_types_gen_params), + KUNIT_CASE_PARAM(read_bypassed, real_cache_types_gen_params), + KUNIT_CASE_PARAM(read_bypassed_volatile, real_cache_types_gen_params), KUNIT_CASE_PARAM(bulk_write, regcache_types_gen_params), KUNIT_CASE_PARAM(bulk_read, regcache_types_gen_params), KUNIT_CASE_PARAM(write_readonly, regcache_types_gen_params), -- 2.39.2