From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.10]) (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 C1CFB1DD525 for ; Thu, 16 Jan 2025 12:43:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.10 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737031389; cv=none; b=ddnCeY3lPi+nmBfpiBs/bhp72zzU7yRiG9PAK3rfUzozUZ7gpHjLRM/Pw48WIK19n/l8m0v1NlV4QyfddDj16S3DKSayF9XiRVfTkkQ6nbyrHpO5mEkvpNuHyAHAgqjBvCkramFsWdzVHIn8NflWivXjxqE4Wkgh+sA0iSukkaU= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737031389; c=relaxed/simple; bh=+bExmAFvcdjvhhsWFg7P+7WOIz9q9d17MBaa4d3bbrM=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=sKSGzx6+SiEEoaqwtsN/HZZHu1uEGyKoZaPMC+VyWmwCCrUWJ4bLOMIUuREND2JyITzVETnd4zTsuZNmd1DUCHBR9CYqPhfNIk7tNOzp0PO5MzjOMeBOfnV7HJ+ttHR+DcArr3Cz+SD5AIpPshGW07RA1mZA+UO5mjeLcsW99Fk= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com; spf=none smtp.mailfrom=linux.intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=PXg1j+GN; arc=none smtp.client-ip=198.175.65.10 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="PXg1j+GN" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1737031387; x=1768567387; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=+bExmAFvcdjvhhsWFg7P+7WOIz9q9d17MBaa4d3bbrM=; b=PXg1j+GNLnIkxDk/Lor6dX+r1KQufDGepn/YIfG8f4auxnNG5ekie8aO HJ3c+K0ZG/m5tnUYGmZFAQdDg1ViaU9IQagBW7vzPcXBU3FbS+Lnyv98A ENqPi13nu1y0E5wX5layVUxR1Lt7WwP7OI01k8FobafXVGWjYo1EkEITG v3lMwYKSs2nu313BQYCT7Rvy4Hv84WS4FT3WNopYyxqo9PBpZ2qsNtUpi zOA7u6+YMCY3VQQCZSsBdrxJg63KgADFiveSCme+6dZuOiFvaOT3sAxr+ zqKhjTs+xaukF3XISVQCxtrpxZ2L7tMAxquS3LNKxtGaKXyVKl9fVFRL7 Q==; X-CSE-ConnectionGUID: gjYqWs/XTQecHUAFd8fo6g== X-CSE-MsgGUID: +kCP23/1QEeqzNEgTv7dcw== X-IronPort-AV: E=McAfee;i="6700,10204,11316"; a="54828307" X-IronPort-AV: E=Sophos;i="6.13,209,1732608000"; d="scan'208";a="54828307" Received: from fmviesa002.fm.intel.com ([10.60.135.142]) by orvoesa102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Jan 2025 04:43:07 -0800 X-CSE-ConnectionGUID: kbfY/4YwSOC0Tfp2fTzFVg== X-CSE-MsgGUID: xOVV7le1TWGZ3e8HuYix5w== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.12,224,1728975600"; d="scan'208";a="128737588" Received: from black.fi.intel.com ([10.237.72.28]) by fmviesa002.fm.intel.com with ESMTP; 16 Jan 2025 04:43:05 -0800 Received: by black.fi.intel.com (Postfix, from userid 1003) id 8F14C478; Thu, 16 Jan 2025 14:43:04 +0200 (EET) From: Andy Shevchenko To: Mark Brown , linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , "Rafael J. Wysocki" , Danilo Krummrich , Andy Shevchenko Subject: [PATCH v3 1/1] regmap: Synchronize cache for the page selector Date: Thu, 16 Jan 2025 14:42:48 +0200 Message-ID: <20250116124303.3941583-1-andriy.shevchenko@linux.intel.com> X-Mailer: git-send-email 2.43.0.rc1.1336.g36b5255a03ac Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit If the selector register is represented in each page, its value in accordance to the debugfs is stale because it gets synchronized only after the real page switch happens. Synchronize cache for the page selector. Before (offset followed by hexdump, the first byte is selector): // Real registers 18: 05 ff 00 00 ff 0f 00 00 f0 00 00 00 ... // Virtual (per port) 40: 05 ff 00 00 e0 e0 00 00 00 00 00 1f 50: 00 ff 00 00 e0 e0 00 00 00 00 00 1f 60: 01 ff 00 00 ff ff 00 00 00 00 00 00 70: 02 ff 00 00 cf f3 00 00 00 00 00 0c 80: 03 ff 00 00 00 00 00 00 00 00 00 ff 90: 04 ff 00 00 ff 0f 00 00 f0 00 00 00 After: // Real registers 18: 05 ff 00 00 ff 0f 00 00 f0 00 00 00 ... // Virtual (per port) 40: 00 ff 00 00 e0 e0 00 00 00 00 00 1f 50: 01 ff 00 00 e0 e0 00 00 00 00 00 1f 60: 02 ff 00 00 ff ff 00 00 00 00 00 00 70: 03 ff 00 00 cf f3 00 00 00 00 00 0c 80: 04 ff 00 00 00 00 00 00 00 00 00 ff 90: 05 ff 00 00 ff 0f 00 00 f0 00 00 00 Fixes: 6863ca622759 ("regmap: Add support for register indirect addressing.") Signed-off-by: Andy Shevchenko --- v3: rebased on the top of latest vanilla drivers/base/regmap/regmap.c | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c index f2843f814675..197c79b66828 100644 --- a/drivers/base/regmap/regmap.c +++ b/drivers/base/regmap/regmap.c @@ -1557,24 +1557,40 @@ static int _regmap_select_page(struct regmap *map, unsigned int *reg, return -EINVAL; } - /* It is possible to have selector register inside data window. - In that case, selector register is located on every page and - it needs no page switching, when accessed alone. */ + /* + * It is possible to have selector register inside data window. + * In that case, selector register is located on every page and it + * needs no page switching, when accessed alone. + * + * Nevertheless we should synchronize the cache values for it. + */ if (val_num > 1 || range->window_start + win_offset != range->selector_reg) { + unsigned int page_off = win_page * range->window_len; + unsigned int sel_offset = range->selector_reg - range->window_start; + unsigned int sel_register = range->range_min + page_off + sel_offset; + unsigned int val = win_page << range->selector_shift; + unsigned int mask = range->selector_mask; + /* Use separate work_buf during page switching */ orig_work_buf = map->work_buf; map->work_buf = map->selector_work_buf; - ret = _regmap_update_bits(map, range->selector_reg, - range->selector_mask, - win_page << range->selector_shift, + ret = _regmap_update_bits(map, range->selector_reg, mask, val, &page_chg, false); map->work_buf = orig_work_buf; if (ret != 0) return ret; + + /* + * If selector register has been just updated, update the respective + * virtual copy as well. + */ + if (page_chg && + in_range(range->selector_reg, range->window_start, range->window_len)) + _regmap_update_bits(map, sel_register, mask, val, NULL, false); } *reg = range->window_start + win_offset; -- 2.43.0.rc1.1336.g36b5255a03ac