From: gilles grimaud <[email protected]>

Add shared helpers for reporting unimplemented RP2040 features and register 
accesses. Keeping the formatting in one place makes shallow peripheral models 
explicit and gives their diagnostics a consistent component, address, offset 
and value format.

Add a dedicated Kconfig symbol so the helpers remain disabled until selected by 
the RP2040 SoC.

Signed-off-by: gilles grimaud <[email protected]>
---
 MAINTAINERS                  |  7 ++++++
 hw/misc/Kconfig              |  3 +++
 hw/misc/meson.build          |  1 +
 hw/misc/rp2040_nyi.c         | 47 ++++++++++++++++++++++++++++++++++++
 include/hw/misc/rp2040_nyi.h | 19 +++++++++++++++
 5 files changed, 77 insertions(+)
 create mode 100644 hw/misc/rp2040_nyi.c
 create mode 100644 include/hw/misc/rp2040_nyi.h

diff --git a/MAINTAINERS b/MAINTAINERS
index 55f6f2e3c0..db641d9c4c 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -1035,6 +1035,13 @@ F: docs/system/arm/raspi.rst
 F: tests/functional/arm/test_raspi2.py
 F: tests/functional/aarch64/test_raspi*.py
 
+Raspberry Pi Pico / RP2040
+M: Gilles Grimaud <[email protected]>
+L: [email protected]
+S: Maintained
+F: hw/*/rp2040*
+F: include/hw/*/rp2040*
+
 Real View
 M: Peter Maydell <[email protected]>
 L: [email protected]
diff --git a/hw/misc/Kconfig b/hw/misc/Kconfig
index 46e3c03cc8..de7a0f56fa 100644
--- a/hw/misc/Kconfig
+++ b/hw/misc/Kconfig
@@ -101,6 +101,9 @@ config FSL_IMX8MP_ANALOG
 config FSL_IMX8MP_CCM
     bool
 
+config RP2040_NYI
+    bool
+
 config STM32_RCC
     bool
 
diff --git a/hw/misc/meson.build b/hw/misc/meson.build
index 54e07aacda..8611d59437 100644
--- a/hw/misc/meson.build
+++ b/hw/misc/meson.build
@@ -98,6 +98,7 @@ system_ss.add(when: 'CONFIG_RASPI', if_true: files(
   'bcm2835_cprman.c',
   'bcm2835_powermgt.c',
 ))
+system_ss.add(when: 'CONFIG_RP2040_NYI', if_true: files('rp2040_nyi.c'))
 system_ss.add(when: 'CONFIG_SLAVIO', if_true: files('slavio_misc.c'))
 system_ss.add(when: 'CONFIG_ZYNQ', if_true: files('zynq_slcr.c'))
 system_ss.add(when: 'CONFIG_XLNX_ZYNQ_DDRC', if_true: 
files('xlnx-zynq-ddrc.c'))
diff --git a/hw/misc/rp2040_nyi.c b/hw/misc/rp2040_nyi.c
new file mode 100644
index 0000000000..7e9e4c09a1
--- /dev/null
+++ b/hw/misc/rp2040_nyi.c
@@ -0,0 +1,47 @@
+/*
+ * RP2040 "not yet implemented" diagnostics
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "qemu/osdep.h"
+#include "hw/misc/rp2040_nyi.h"
+#include "qemu/log.h"
+
+void rp2040_log_nyi(const char *component, const char *feature,
+                    const char *detail)
+{
+    if (g_str_has_prefix(component, "rp2040.")) {
+        component += strlen("rp2040.");
+    }
+
+    qemu_log_mask(LOG_UNIMP, "Not yet implemented: rp2040.%s: %s%s%s\n",
+                  component, feature, detail ? ": " : "",
+                  detail ? detail : "");
+}
+
+void rp2040_log_unimplemented_read(const char *component, unsigned size,
+                                   uint64_t addr, uint64_t offset,
+                                   uint64_t value)
+{
+    char detail[128];
+
+    snprintf(detail, sizeof(detail),
+             "size %u, addr 0x%08" PRIx64 ", offset 0x%04" PRIx64
+             " -> 0x%0*" PRIx64,
+             size, addr, offset, size << 1, value);
+    rp2040_log_nyi(component, "unimplemented read", detail);
+}
+
+void rp2040_log_unimplemented_write(const char *component, unsigned size,
+                                    uint64_t addr, uint64_t offset,
+                                    uint64_t value)
+{
+    char detail[128];
+
+    snprintf(detail, sizeof(detail),
+             "size %u, addr 0x%08" PRIx64 ", offset 0x%04" PRIx64
+             ", value 0x%0*" PRIx64,
+             size, addr, offset, size << 1, value);
+    rp2040_log_nyi(component, "unimplemented write", detail);
+}
diff --git a/include/hw/misc/rp2040_nyi.h b/include/hw/misc/rp2040_nyi.h
new file mode 100644
index 0000000000..c23805973b
--- /dev/null
+++ b/include/hw/misc/rp2040_nyi.h
@@ -0,0 +1,19 @@
+/*
+ * RP2040 "not yet implemented" diagnostics
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#ifndef HW_MISC_RP2040_NYI_H
+#define HW_MISC_RP2040_NYI_H
+
+void rp2040_log_nyi(const char *component, const char *feature,
+                    const char *detail);
+void rp2040_log_unimplemented_read(const char *component, unsigned size,
+                                   uint64_t addr, uint64_t offset,
+                                   uint64_t value);
+void rp2040_log_unimplemented_write(const char *component, unsigned size,
+                                    uint64_t addr, uint64_t offset,
+                                    uint64_t value);
+
+#endif
-- 
2.55.0


Reply via email to