From 1aea567a294c52f73e17a8bdb8f59e152d1aeb80 Mon Sep 17 00:00:00 2001
From: Wei Fu <wefu@redhat.com>
Date: Sun, 19 Sep 2021 14:12:45 +0800
Subject: [PATCH] cache: add flush_range interface in cache_ops struct

Signed-off-by: Wei Fu <wefu@redhat.com>
---
 drivers/cache/cache-uclass.c | 11 +++++++++++
 include/cache.h              | 21 +++++++++++++++++++++
 2 files changed, 32 insertions(+)

diff --git a/drivers/cache/cache-uclass.c b/drivers/cache/cache-uclass.c
index 0c13dbdb75..399db84fb7 100644
--- a/drivers/cache/cache-uclass.c
+++ b/drivers/cache/cache-uclass.c
@@ -39,6 +39,17 @@ int cache_disable(struct udevice *dev)
 	return ops->disable(dev);
 }
 
+
+int flush_range(struct udevice *dev, unsigned long start, unsigned long end)
+{
+	struct cache_ops *ops = cache_get_ops(dev);
+
+	if (!ops->flush_range)
+		return -ENOSYS;
+
+	return ops->flush_range(dev, start, end);
+}
+
 UCLASS_DRIVER(cache) = {
 	.id		= UCLASS_CACHE,
 	.name		= "cache",
diff --git a/include/cache.h b/include/cache.h
index ecb7956efd..03ce408a96 100644
--- a/include/cache.h
+++ b/include/cache.h
@@ -40,6 +40,17 @@ struct cache_ops {
 	 * @return 0 if OK, -ve on error
 	 */
 	int (*disable)(struct udevice *dev);
+
+	/**
+	 * flush_range() - Flush cache in a range
+	 *
+	 * @dev:	Device to check (UCLASS_CACHE)
+	 * @start:	start address of the range
+	 * @end:	end address of the range
+	 * @return 0 if OK, -ve on error
+	 */
+	int (*flush_range)(struct udevice *dev,
+			   unsigned long start, unsigned long end);
 };
 
 #define cache_get_ops(dev)	((struct cache_ops *)(dev)->driver->ops)
@@ -68,4 +79,14 @@ int cache_enable(struct udevice *dev);
  * @return 0 if OK, -ve on error
  */
 int cache_disable(struct udevice *dev);
+
+/**
+ * flush_range() - Flush cache
+ *
+ * @dev:	Device to check (UCLASS_CACHE)
+ * @start:	start address of the range
+ * @end:	end address of the range
+ * @return 0 if OK, -ve on error
+ */
+int flush_range(struct udevice *dev, unsigned long start, unsigned long end);
 #endif