[sw/ottf] Restructure meson build targets for OTTF.

For testing the OTTF, a single meson build target was constructed with
an example test built in. This refactors the build targets to build the
OTTF as a library that is linked with tests that are also defined as
libraries. This makes building test binaries that use the OTTF similar
to those that use the existing test_main.c test framework.

Additionally, two example OTTF tests (one bare-metal and one concurrency)
are added to provided examples of how to write on-device tests using the
OTTF.

This partially addresses a larger effort of refactoring the on-device
test framework, as described in #8015.

Signed-off-by: Timothy Trippel <ttrippel@google.com>
diff --git a/sw/device/lib/testing/test_framework/example_ottf_test.c b/sw/device/lib/testing/test_framework/example_ottf_test.c
deleted file mode 100644
index 37831aa..0000000
--- a/sw/device/lib/testing/test_framework/example_ottf_test.c
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright lowRISC contributors.
-// Licensed under the Apache License, Version 2.0, see LICENSE for details.
-// SPDX-License-Identifier: Apache-2.0
-
-#include <sw/device/lib/testing/test_framework/ottf.h>
-
-#include "sw/device/lib/runtime/log.h"
-#include "sw/device/lib/testing/test_framework/FreeRTOSConfig.h"
-#include "sw/vendor/freertos_freertos_kernel/include/FreeRTOS.h"
-#include "sw/vendor/freertos_freertos_kernel/include/task.h"
-
-const test_config_t kTestConfig = {
-    .can_clobber_uart = false,
-    .enable_concurrency = true,
-};
-
-bool test_main(void) {
-  LOG_INFO("Running on-device test as FreeRTOS task (%s) using the OTTF.",
-           pcTaskGetName(NULL));
-  return true;
-}
diff --git a/sw/device/lib/testing/test_framework/meson.build b/sw/device/lib/testing/test_framework/meson.build
index 7e85d9f..4cbfce6 100644
--- a/sw/device/lib/testing/test_framework/meson.build
+++ b/sw/device/lib/testing/test_framework/meson.build
@@ -79,11 +79,9 @@
 ottf_sources = [
   'ottf.c',
   'ottf_isrs.c',
-  'example_ottf_test.c',
   'freertos_hooks.c',
   'freertos_port.S',
   'freertos_port.c',
-  hw_ip_rv_timer_reg_h,
   join_paths(freertos_root ,'tasks.c'),
   join_paths(freertos_root ,'queue.c'),
   join_paths(freertos_root ,'list.c'),
@@ -94,9 +92,9 @@
   '../../../../vendor/freertos_freertos_kernel/portable/GCC/RISC-V')
 
 # OpenTitan Test Framework (OTTF)
-sw_lib_ottf = declare_dependency(
+sw_lib_testing_ottf = declare_dependency(
   link_with: static_library(
-    'sw_lib_ottf',
+    'sw_lib_testing_ottf',
     sources: ottf_sources,
     include_directories: ottf_incdirs,
     c_args: [
diff --git a/sw/device/tests/meson.build b/sw/device/tests/meson.build
index 1c96b1f..25b6fa2 100644
--- a/sw/device/tests/meson.build
+++ b/sw/device/tests/meson.build
@@ -26,6 +26,41 @@
 }
 
 ###############################################################################
+# OTTF Example Tests
+###############################################################################
+ottf_example_bare_metal_test_lib = declare_dependency(
+  link_with: static_library(
+    'ottf_example_bare_metal_test_lib',
+    sources: ['ottf_example_bare_metal_test.c'],
+    dependencies: [
+      sw_lib_runtime_log,
+    ],
+  ),
+)
+sw_tests += {
+  'ottf_example_bare_metal_test_lib': {
+    'library': ottf_example_bare_metal_test_lib,
+    'use_ottf': true,
+  }
+}
+
+ottf_example_concurrency_test_lib = declare_dependency(
+  link_with: static_library(
+    'ottf_example_concurrency_test_lib',
+    sources: ['ottf_example_concurrency_test.c'],
+    dependencies: [
+      sw_lib_runtime_log,
+    ],
+  ),
+)
+sw_tests += {
+  'ottf_example_concurrency_test_lib': {
+    'library': ottf_example_concurrency_test_lib,
+    'use_ottf': true,
+  }
+}
+
+###############################################################################
 # Smoke Tests
 ###############################################################################
 rv_plic_smoketest_lib = declare_dependency(
@@ -636,17 +671,32 @@
 # (unsigned) test binaries loaded with ROM from sw/device/boot_rom/
 foreach sw_test_name, sw_test_info : sw_tests
   foreach device_name, device_lib : sw_lib_arch_core_devices
-    sw_test_elf = executable(
-      sw_test_name + '_' + device_name,
-      name_suffix: 'elf',
-      dependencies: [
-        riscv_crt,
-        device_lib,
-        sw_test_info['library'],
-        sw_lib_irq_handlers,
-        sw_lib_testing_test_main,
-      ],
-    )
+    if 'use_ottf' in sw_test_info
+      # test target with OTTF
+      sw_test_elf = executable(
+        sw_test_name + '_' + device_name,
+        name_suffix: 'elf',
+        dependencies: [
+          riscv_crt,
+          device_lib,
+          sw_test_info['library'],
+          sw_lib_testing_ottf,
+        ],
+      )
+    else
+      # test target with bare metal on-device test framework
+      sw_test_elf = executable(
+        sw_test_name + '_' + device_name,
+        name_suffix: 'elf',
+        dependencies: [
+          riscv_crt,
+          device_lib,
+          sw_test_info['library'],
+          sw_lib_irq_handlers,
+          sw_lib_testing_test_main,
+        ],
+      )
+    endif
 
     target_name = sw_test_name + '_@0@_' + device_name
 
@@ -921,69 +971,3 @@
     build_by_default: true,
   )
 endforeach
-
-# OpenTitan (FreeRTOS) Test Framework
-foreach device_name, device_lib : sw_lib_arch_core_devices
-  ottf_elf = executable(
-    'ottf_' + device_name,
-    name_suffix: 'elf',
-    dependencies: [
-      riscv_crt,
-      device_lib,
-      sw_lib_ottf,
-      sw_lib_irq_handlers,
-    ],
-  )
-
-  target_name = 'ottf_@0@_' + device_name
-
-  ottf_dis = custom_target(
-    target_name.format('dis'),
-    input: ottf_elf,
-    kwargs: elf_to_dis_custom_target_args,
-  )
-
-  ottf_bin = custom_target(
-    target_name.format('bin'),
-    input: ottf_elf,
-    kwargs: elf_to_bin_custom_target_args,
-  )
-
-  ottf_vmem32 = custom_target(
-    target_name.format('vmem32'),
-    input: ottf_bin,
-    kwargs: bin_to_vmem32_custom_target_args,
-  )
-
-  ottf_vmem64 = custom_target(
-    target_name.format('vmem64'),
-    input: ottf_bin,
-    kwargs: bin_to_vmem64_custom_target_args,
-  )
-
-  ottf_scr_vmem64 = custom_target(
-    target_name.format('scrambled'),
-    input: ottf_vmem64,
-    output: flash_image_outputs,
-    command: flash_image_command,
-    depend_files: flash_image_depend_files,
-    build_by_default: true,
-  )
-
-  custom_target(
-    target_name.format('export'),
-    command: export_target_command,
-    depend_files: [export_target_depend_files,],
-    input: [
-      ottf_elf,
-      ottf_dis,
-      ottf_bin,
-      ottf_vmem32,
-      ottf_vmem64,
-      ottf_scr_vmem64
-    ],
-    output: target_name.format('export'),
-    build_always_stale: true,
-    build_by_default: true,
-  )
-endforeach
diff --git a/sw/device/tests/ottf_example_bare_metal_test.c b/sw/device/tests/ottf_example_bare_metal_test.c
new file mode 100644
index 0000000..bbf22b9
--- /dev/null
+++ b/sw/device/tests/ottf_example_bare_metal_test.c
@@ -0,0 +1,16 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+
+#include "sw/device/lib/runtime/log.h"
+#include "sw/device/lib/testing/test_framework/ottf.h"
+
+const test_config_t kTestConfig = {
+    .can_clobber_uart = false,
+    .enable_concurrency = false,
+};
+
+bool test_main(void) {
+  LOG_INFO("Running on-device test on bare-metal using the OTTF.");
+  return true;
+}
diff --git a/sw/device/tests/ottf_example_concurrency_test.c b/sw/device/tests/ottf_example_concurrency_test.c
new file mode 100644
index 0000000..564755c
--- /dev/null
+++ b/sw/device/tests/ottf_example_concurrency_test.c
@@ -0,0 +1,16 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+
+#include "sw/device/lib/runtime/log.h"
+#include "sw/device/lib/testing/test_framework/ottf.h"
+
+const test_config_t kTestConfig = {
+    .can_clobber_uart = false,
+    .enable_concurrency = true,
+};
+
+bool test_main(void) {
+  LOG_INFO("Running on-device test as FreeRTOS task using the OTTF.");
+  return true;
+}