We have opted to prefer 'if' over '#if' to more easily see problems in
contributed code.

When compiling with CONFIG_CC_OPTIMIZE_FOR_DEBUG=y the compiler does not
execute all optimization paths and references live-tree functions
even if CONFIG_$(PHASE_)OF_LIVE is not defined.

E.g. building qemu-riscv64_smode_defconfig with
CONFIG_CC_OPTIMIZE_FOR_DEBUG=y fails due to missing symbols.

Provide dummy implementation to allow debug builds.

Signed-off-by: Heinrich Schuchardt <[email protected]>
---
 drivers/core/Makefile     |   6 +-
 drivers/core/nof_access.c | 246 ++++++++++++++++++++++++++++++++++++++
 drivers/core/nof_addr.c   |  37 ++++++
 3 files changed, 288 insertions(+), 1 deletion(-)
 create mode 100644 drivers/core/nof_access.c
 create mode 100644 drivers/core/nof_addr.c

diff --git a/drivers/core/Makefile b/drivers/core/Makefile
index a549890c22b..caa912f48ab 100644
--- a/drivers/core/Makefile
+++ b/drivers/core/Makefile
@@ -11,7 +11,11 @@ obj-$(CONFIG_SIMPLE_PM_BUS)  += simple-pm-bus.o
 obj-$(CONFIG_DM)       += dump.o
 obj-$(CONFIG_$(PHASE_)REGMAP)  += regmap.o
 obj-$(CONFIG_$(PHASE_)SYSCON)  += syscon-uclass.o
-obj-$(CONFIG_$(PHASE_)OF_LIVE) += of_access.o of_addr.o
+ifdef CONFIG_$(PHASE_)OF_LIVE
+obj-y += of_access.o of_addr.o
+else
+obj-y += nof_access.o nof_addr.o
+endif
 ifndef CONFIG_DM_DEV_READ_INLINE
 obj-$(CONFIG_OF_CONTROL) += read.o
 endif
diff --git a/drivers/core/nof_access.c b/drivers/core/nof_access.c
new file mode 100644
index 00000000000..08adba247f7
--- /dev/null
+++ b/drivers/core/nof_access.c
@@ -0,0 +1,246 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * This file contains dummy function implementations that are only needed
+ * when compiling with -Og. In this case the optimizer does not remove
+ * function calls based on CONFIG_$(PHASE_)OF_LIVE.
+ */
+
+#include <dm/of_access.h>
+#include <linux/errno.h>
+
+int of_n_addr_cells(const struct device_node *np)
+{
+       return -ENOSYS;
+}
+
+int of_n_size_cells(const struct device_node *np)
+{
+       return -ENOSYS;
+}
+
+int of_simple_addr_cells(const struct device_node *np)
+{
+       return -ENOSYS;
+}
+
+int of_simple_size_cells(const struct device_node *np)
+{
+       return -ENOSYS;
+}
+
+struct property *of_find_property(const struct device_node *np,
+                                 const char *name, int *lenp)
+{
+       return NULL;
+}
+
+struct device_node *of_find_all_nodes(struct device_node *prev)
+{
+       return NULL;
+}
+
+const void *of_get_property(const struct device_node *np, const char *name,
+                           int *lenp)
+{
+       return NULL;
+}
+
+const struct property *of_get_first_property(const struct device_node *np)
+{
+       return NULL;
+}
+
+const struct property *of_get_next_property(const struct device_node *np,
+                                           const struct property *property)
+{
+       return NULL;
+}
+
+const void *of_get_property_by_prop(const struct device_node *np,
+                                   const struct property *property,
+                                   const char **name,
+                                   int *lenp)
+{
+       return NULL;
+}
+
+int of_device_is_compatible(const struct device_node *device,
+                           const char *compat, const char *type,
+                           const char *name)
+{
+       return -ENOSYS;
+}
+
+bool of_device_is_available(const struct device_node *device)
+{
+       return false;
+}
+
+struct device_node *of_get_parent(const struct device_node *node)
+{
+       return NULL;
+}
+
+struct device_node *of_find_node_opts_by_path(struct device_node *root,
+                                             const char *path,
+                                             const char **opts)
+{
+       return NULL;
+}
+
+struct device_node *of_find_compatible_node(struct device_node *from,
+               const char *type, const char *compatible)
+{
+       return NULL;
+}
+
+struct device_node *of_find_node_by_prop_value(struct device_node *from,
+                                              const char *propname,
+                                              const void *propval, int proplen)
+{
+       return NULL;
+}
+
+struct device_node *of_find_node_by_phandle(struct device_node *root,
+                                           phandle handle)
+{
+       return NULL;
+}
+
+int of_read_u8(const struct device_node *np, const char *propname, u8 *outp)
+{
+       return -ENOSYS;
+}
+
+int of_read_u16(const struct device_node *np, const char *propname, u16 *outp)
+{
+       return -ENOSYS;
+}
+
+int of_read_u32(const struct device_node *np, const char *propname, u32 *outp)
+{
+       return -ENOSYS;
+}
+
+int of_read_u32_array(const struct device_node *np, const char *propname,
+                     u32 *out_values, size_t sz)
+{
+       return -ENOSYS;
+}
+
+int of_read_u32_index(const struct device_node *np, const char *propname,
+                     int index, u32 *outp)
+{
+       return -ENOSYS;
+}
+
+int of_read_u64_index(const struct device_node *np, const char *propname,
+                     int index, u64 *outp)
+{
+       return -ENOSYS;
+}
+
+int of_read_u64(const struct device_node *np, const char *propname, u64 *outp)
+{
+       return -ENOSYS;
+}
+
+int of_property_match_string(const struct device_node *np, const char 
*propname,
+                            const char *string)
+{
+       return -ENOSYS;
+}
+
+int of_property_read_string_helper(const struct device_node *np,
+                                  const char *propname, const char **out_strs,
+                                  size_t sz, int skip)
+{
+       return -ENOSYS;
+}
+
+struct device_node *of_root_parse_phandle(struct device_node *root,
+                                         const struct device_node *np,
+                                         const char *phandle_name, int index)
+{
+       return NULL;
+}
+
+int of_root_parse_phandle_with_args(struct device_node *root,
+                                   const struct device_node *np,
+                                   const char *list_name, const char 
*cells_name,
+                                   int cell_count, int index,
+                                   struct of_phandle_args *out_args)
+{
+       return -ENOSYS;
+}
+
+int of_root_count_phandle_with_args(struct device_node *root,
+                                   const struct device_node *np,
+                                   const char *list_name, const char 
*cells_name,
+                                   int cell_count)
+{
+       return -ENOSYS;
+}
+
+struct device_node *of_parse_phandle(const struct device_node *np,
+                                    const char *phandle_name, int index)
+{
+       return NULL;
+}
+
+int of_parse_phandle_with_args(const struct device_node *np,
+                              const char *list_name, const char *cells_name,
+                              int cell_count, int index,
+                              struct of_phandle_args *out_args)
+{
+       return -ENOSYS;
+}
+
+int of_count_phandle_with_args(const struct device_node *np,
+                              const char *list_name, const char *cells_name,
+                              int cell_count)
+{
+       return -ENOSYS;
+}
+
+int of_alias_scan(void)
+{
+       return -ENOSYS;
+}
+
+int of_alias_get_id(const struct device_node *np, const char *stem)
+{
+       return -ENOSYS;
+}
+
+int of_alias_get_highest_id(const char *stem)
+{
+       return -ENOSYS;
+}
+
+struct device_node *of_get_stdout(void)
+{
+       return NULL;
+}
+
+int of_write_prop(struct device_node *np, const char *propname, int len,
+                 const void *value)
+{
+       return -ENOSYS;
+}
+
+int of_add_subnode(struct device_node *parent, const char *name, int len,
+                  struct device_node **childp)
+{
+       return -ENOSYS;
+}
+
+int of_remove_property(struct device_node *np, struct property *prop)
+{
+       return -ENOSYS;
+}
+
+int of_remove_node(struct device_node *to_remove)
+{
+       return -ENOSYS;
+}
diff --git a/drivers/core/nof_addr.c b/drivers/core/nof_addr.c
new file mode 100644
index 00000000000..8f619f9ec33
--- /dev/null
+++ b/drivers/core/nof_addr.c
@@ -0,0 +1,37 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * This file contains dummy function implementations that are only needed
+ * when compiling with -Og. In this case the optimizer does not remove
+ * function calls based on CONFIG_$(PHASE_)OF_LIVE.
+ */
+
+#include <dm/of_addr.h>
+#include <linux/errno.h>
+
+const __be32 *of_get_address(const struct device_node *dev, int index,
+                            u64 *size, unsigned int *flags)
+{
+       return NULL;
+}
+
+u64 of_translate_address(const struct device_node *dev, const __be32 *in_addr)
+{
+       return -ENOSYS;
+}
+
+u64 of_translate_dma_address(const struct device_node *dev, const __be32 
*in_addr)
+{
+       return -ENOSYS;
+}
+
+int of_get_dma_range(const struct device_node *dev, phys_addr_t *cpu,
+                    dma_addr_t *bus, u64 *size)
+{
+       return -ENOSYS;
+}
+
+int of_address_to_resource(const struct device_node *dev, int index,
+                          struct resource *r)
+{
+       return -ENOSYS;
+}
-- 
2.51.0

Reply via email to