dm: core: Use separate priv/plat data region
authorSimon Glass <sjg@chromium.org>
Mon, 15 Mar 2021 04:25:40 +0000 (17:25 +1300)
committerSimon Glass <sjg@chromium.org>
Fri, 26 Mar 2021 04:03:09 +0000 (17:03 +1300)
Make use of the new priv/plat data region if enabled. This is implemented
as a simple offset from the position set up by dtoc to the new position.

So long as all access goes through dm_priv_to_rw() this is safe.

Signed-off-by: Simon Glass <sjg@chromium.org>
Signed-off-by: Simon Glass <sjg@chromium.org>
drivers/core/device.c
drivers/core/root.c
include/dm/util.h

index 06d2467..cb960f8 100644 (file)
@@ -600,7 +600,7 @@ void *dev_get_plat(const struct udevice *dev)
                return NULL;
        }
 
-       return dev->plat_;
+       return dm_priv_to_rw(dev->plat_);
 }
 
 void *dev_get_parent_plat(const struct udevice *dev)
@@ -610,7 +610,7 @@ void *dev_get_parent_plat(const struct udevice *dev)
                return NULL;
        }
 
-       return dev->parent_plat_;
+       return dm_priv_to_rw(dev->parent_plat_);
 }
 
 void *dev_get_uclass_plat(const struct udevice *dev)
@@ -620,7 +620,7 @@ void *dev_get_uclass_plat(const struct udevice *dev)
                return NULL;
        }
 
-       return dev->uclass_plat_;
+       return dm_priv_to_rw(dev->uclass_plat_);
 }
 
 void *dev_get_priv(const struct udevice *dev)
@@ -630,7 +630,7 @@ void *dev_get_priv(const struct udevice *dev)
                return NULL;
        }
 
-       return dev->priv_;
+       return dm_priv_to_rw(dev->priv_);
 }
 
 void *dev_get_uclass_priv(const struct udevice *dev)
@@ -640,7 +640,7 @@ void *dev_get_uclass_priv(const struct udevice *dev)
                return NULL;
        }
 
-       return dev->uclass_priv_;
+       return dm_priv_to_rw(dev->uclass_priv_);
 }
 
 void *dev_get_parent_priv(const struct udevice *dev)
@@ -650,7 +650,7 @@ void *dev_get_parent_priv(const struct udevice *dev)
                return NULL;
        }
 
-       return dev->parent_priv_;
+       return dm_priv_to_rw(dev->parent_priv_);
 }
 
 static int device_get_device_tail(struct udevice *dev, int ret,
index 82b3c7d..d9a19c5 100644 (file)
@@ -347,6 +347,15 @@ __weak int dm_scan_other(bool pre_reloc_only)
        return 0;
 }
 
+#if CONFIG_IS_ENABLED(OF_PLATDATA_INST) && CONFIG_IS_ENABLED(READ_ONLY)
+void *dm_priv_to_rw(void *priv)
+{
+       long offset = priv - (void *)__priv_data_start;
+
+       return gd_dm_priv_base() + offset;
+}
+#endif
+
 /**
  * dm_scan() - Scan tables to bind devices
  *
index 01a0449..138893c 100644 (file)
@@ -49,3 +49,12 @@ void dm_dump_driver_compat(void);
 void dm_dump_static_driver_info(void);
 
 #endif
+
+#if CONFIG_IS_ENABLED(OF_PLATDATA_INST) && CONFIG_IS_ENABLED(READ_ONLY)
+void *dm_priv_to_rw(void *priv);
+#else
+static inline void *dm_priv_to_rw(void *priv)
+{
+       return priv;
+}
+#endif