[release] Snap to d85a812c07

Release-Operation-Build: https://cr-buildbucket.appspot.com/build/8747956901976648465
Change-Id: I6a997c7751fce75d063d6a8e4b1abf713af19ab5
diff --git a/docs/development/drivers/driver_guides/display/how_to_write.md b/docs/development/drivers/driver_guides/display/how_to_write.md
index 1dfb9fc..b1e851e 100644
--- a/docs/development/drivers/driver_guides/display/how_to_write.md
+++ b/docs/development/drivers/driver_guides/display/how_to_write.md
@@ -191,11 +191,6 @@
   void DisplayControllerImplApplyConfiguration(
       const display_config_t** display_config, size_t display_count) {}
 
-  void DisplayControllerImplSetEld(
-      uint64_t display_id,
-      const uint8_t* raw_eld_list,
-      size_t raw_eld_count) {}
-
   zx_status_t DisplayControllerImplSetBufferCollectionConstraints(
       const image_buffer_usage_t* usage, uint64_t collection_id) {
     return ZX_ERR_NOT_SUPPORTED;
diff --git a/docs/gen/build_arguments.md b/docs/gen/build_arguments.md
index 5cc6865..9efaceb 100644
--- a/docs/gen/build_arguments.md
+++ b/docs/gen/build_arguments.md
@@ -1848,563 +1848,569 @@
 
 From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:89
 
+### dir_pw_dma_mcuxpresso
+
+**Current value (from the default):** `"//third_party/pigweed/src/pw_dma_mcuxpresso"`
+
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:90
+
 ### dir_pw_docgen
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_docgen"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:90
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:91
 
 ### dir_pw_doctor
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_doctor"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:91
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:92
 
 ### dir_pw_emu
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_emu"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:92
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:93
 
 ### dir_pw_env_setup
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_env_setup"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:93
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:94
 
 ### dir_pw_env_setup_zephyr
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_env_setup_zephyr"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:94
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:95
 
 ### dir_pw_file
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_file"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:95
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:96
 
 ### dir_pw_format
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_format"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:96
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:97
 
 ### dir_pw_function
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_function"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:97
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:98
 
 ### dir_pw_fuzzer
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_fuzzer"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:98
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:99
 
 ### dir_pw_grpc
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_grpc"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:99
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:100
 
 ### dir_pw_hdlc
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_hdlc"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:100
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:101
 
 ### dir_pw_hex_dump
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_hex_dump"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:101
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:102
 
 ### dir_pw_i2c
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_i2c"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:102
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:103
 
 ### dir_pw_i2c_linux
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_i2c_linux"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:103
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:104
 
 ### dir_pw_i2c_mcuxpresso
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_i2c_mcuxpresso"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:104
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:105
 
 ### dir_pw_i2c_rp2040
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_i2c_rp2040"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:105
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:106
 
 ### dir_pw_ide
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_ide"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:106
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:107
 
 ### dir_pw_interrupt
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_interrupt"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:107
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:108
 
 ### dir_pw_interrupt_cortex_m
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_interrupt_cortex_m"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:109
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:110
 
 ### dir_pw_interrupt_xtensa
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_interrupt_xtensa"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:110
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:111
 
 ### dir_pw_interrupt_zephyr
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_interrupt_zephyr"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:111
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:112
 
 ### dir_pw_intrusive_ptr
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_intrusive_ptr"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:112
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:113
 
 ### dir_pw_json
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_json"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:113
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:114
 
 ### dir_pw_kvs
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_kvs"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:114
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:115
 
 ### dir_pw_libc
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_libc"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:115
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:116
 
 ### dir_pw_libcxx
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_libcxx"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:116
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:117
 
 ### dir_pw_log
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_log"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:117
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:118
 
 ### dir_pw_log_android
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_log_android"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:118
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:119
 
 ### dir_pw_log_basic
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_log_basic"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:119
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:120
 
 ### dir_pw_log_null
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_log_null"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:120
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:121
 
 ### dir_pw_log_rpc
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_log_rpc"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:121
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:122
 
 ### dir_pw_log_string
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_log_string"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:122
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:123
 
 ### dir_pw_log_tokenized
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_log_tokenized"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:123
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:124
 
 ### dir_pw_log_zephyr
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_log_zephyr"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:124
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:125
 
 ### dir_pw_malloc
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_malloc"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:125
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:126
 
 ### dir_pw_malloc_freelist
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_malloc_freelist"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:126
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:127
 
 ### dir_pw_malloc_freertos
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_malloc_freertos"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:127
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:128
 
 ### dir_pw_metric
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_metric"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:128
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:129
 
 ### dir_pw_minimal_cpp_stdlib
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_minimal_cpp_stdlib"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:130
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:131
 
 ### dir_pw_module
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_module"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:131
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:132
 
 ### dir_pw_multibuf
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_multibuf"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:132
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:133
 
 ### dir_pw_multisink
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_multisink"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:133
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:134
 
 ### dir_pw_package
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_package"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:134
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:135
 
 ### dir_pw_perf_test
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_perf_test"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:135
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:136
 
 ### dir_pw_persistent_ram
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_persistent_ram"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:136
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:137
 
 ### dir_pw_polyfill
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_polyfill"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:137
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:138
 
 ### dir_pw_preprocessor
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_preprocessor"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:138
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:139
 
 ### dir_pw_presubmit
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_presubmit"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:139
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:140
 
 ### dir_pw_protobuf
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_protobuf"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:140
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:141
 
 ### dir_pw_protobuf_compiler
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_protobuf_compiler"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:141
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:142
 
 ### dir_pw_random
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_random"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:142
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:143
 
 ### dir_pw_result
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_result"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:143
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:144
 
 ### dir_pw_ring_buffer
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_ring_buffer"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:144
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:145
 
 ### dir_pw_router
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_router"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:145
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:146
 
 ### dir_pw_rpc
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_rpc"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:146
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:147
 
 ### dir_pw_rpc_transport
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_rpc_transport"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:147
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:148
 
 ### dir_pw_rust
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_rust"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:148
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:149
 
 ### dir_pw_sensor
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_sensor"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:149
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:150
 
 ### dir_pw_snapshot
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_snapshot"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:150
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:151
 
 ### dir_pw_software_update
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_software_update"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:151
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:152
 
 ### dir_pw_span
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_span"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:152
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:153
 
 ### dir_pw_spi
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_spi"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:153
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:154
 
 ### dir_pw_spi_linux
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_spi_linux"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:154
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:155
 
 ### dir_pw_spi_mcuxpresso
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_spi_mcuxpresso"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:155
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:156
 
 ### dir_pw_spi_rp2040
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_spi_rp2040"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:156
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:157
 
 ### dir_pw_status
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_status"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:157
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:158
 
 ### dir_pw_stm32cube_build
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_stm32cube_build"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:158
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:159
 
 ### dir_pw_stream
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_stream"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:159
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:160
 
 ### dir_pw_stream_shmem_mcuxpresso
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_stream_shmem_mcuxpresso"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:161
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:162
 
 ### dir_pw_stream_uart_linux
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_stream_uart_linux"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:162
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:163
 
 ### dir_pw_stream_uart_mcuxpresso
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_stream_uart_mcuxpresso"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:164
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:165
 
 ### dir_pw_string
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_string"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:165
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:166
 
 ### dir_pw_symbolizer
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_symbolizer"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:166
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:167
 
 ### dir_pw_sync
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_sync"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:167
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:168
 
 ### dir_pw_sync_baremetal
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_sync_baremetal"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:168
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:169
 
 ### dir_pw_sync_embos
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_sync_embos"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:169
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:170
 
 ### dir_pw_sync_freertos
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_sync_freertos"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:170
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:171
 
 ### dir_pw_sync_stl
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_sync_stl"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:171
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:172
 
 ### dir_pw_sync_threadx
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_sync_threadx"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:172
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:173
 
 ### dir_pw_sync_zephyr
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_sync_zephyr"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:173
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:174
 
 ### dir_pw_sys_io
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_sys_io"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:174
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:175
 
 ### dir_pw_sys_io_ambiq_sdk
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_sys_io_ambiq_sdk"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:175
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:176
 
 ### dir_pw_sys_io_arduino
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_sys_io_arduino"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:176
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:177
 
 ### dir_pw_sys_io_baremetal_lm3s6965evb
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_sys_io_baremetal_lm3s6965evb"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:178
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:179
 
 ### dir_pw_sys_io_baremetal_stm32f429
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_sys_io_baremetal_stm32f429"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:180
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:181
 
 ### dir_pw_sys_io_emcraft_sf2
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_sys_io_emcraft_sf2"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:182
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:183
 
 ### dir_pw_sys_io_mcuxpresso
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_sys_io_mcuxpresso"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:183
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:184
 
 ### dir_pw_sys_io_rp2040
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_sys_io_rp2040"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:184
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:185
 
 ### dir_pw_sys_io_stdio
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_sys_io_stdio"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:185
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:186
 
 ### dir_pw_sys_io_stm32cube
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_sys_io_stm32cube"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:186
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:187
 
 ### dir_pw_sys_io_zephyr
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_sys_io_zephyr"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:187
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:188
 
 ### dir_pw_system
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_system"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:188
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:189
 
 ### dir_pw_target_runner
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_target_runner"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:189
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:190
 
 ### dir_pw_third_party
 
@@ -2530,133 +2536,133 @@
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_thread"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:190
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:191
 
 ### dir_pw_thread_embos
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_thread_embos"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:191
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:192
 
 ### dir_pw_thread_freertos
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_thread_freertos"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:192
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:193
 
 ### dir_pw_thread_stl
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_thread_stl"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:193
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:194
 
 ### dir_pw_thread_threadx
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_thread_threadx"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:194
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:195
 
 ### dir_pw_thread_zephyr
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_thread_zephyr"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:195
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:196
 
 ### dir_pw_tls_client
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_tls_client"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:196
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:197
 
 ### dir_pw_tls_client_boringssl
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_tls_client_boringssl"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:198
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:199
 
 ### dir_pw_tls_client_mbedtls
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_tls_client_mbedtls"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:200
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:201
 
 ### dir_pw_tokenizer
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_tokenizer"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:201
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:202
 
 ### dir_pw_toolchain
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_toolchain"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:202
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:203
 
 ### dir_pw_toolchain_bazel
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_toolchain_bazel"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:203
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:204
 
 ### dir_pw_trace
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_trace"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:204
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:205
 
 ### dir_pw_trace_tokenized
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_trace_tokenized"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:205
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:206
 
 ### dir_pw_transfer
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_transfer"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:206
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:207
 
 ### dir_pw_uart
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_uart"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:207
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:208
 
 ### dir_pw_unit_test
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_unit_test"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:208
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:209
 
 ### dir_pw_unit_test_zephyr
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_unit_test_zephyr"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:209
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:210
 
 ### dir_pw_varint
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_varint"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:210
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:211
 
 ### dir_pw_watch
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_watch"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:211
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:212
 
 ### dir_pw_web
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_web"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:212
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:213
 
 ### dir_pw_work_queue
 
 **Current value (from the default):** `"//third_party/pigweed/src/pw_work_queue"`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:213
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:214
 
 ### disable_boot_tests
 
@@ -6185,25 +6191,25 @@
 
 A list with all Pigweed modules docs groups. DO NOT SET THIS BUILD ARGUMENT!
 
-**Current value (from the default):** `["//third_party/pigweed/src/docker:docs", "//third_party/pigweed/src/pw_alignment:docs", "//third_party/pigweed/src/pw_allocator:docs", "//third_party/pigweed/src/pw_analog:docs", "//third_party/pigweed/src/pw_android_toolchain:docs", "//third_party/pigweed/src/pw_arduino_build:docs", "//third_party/pigweed/src/pw_assert:docs", "//third_party/pigweed/src/pw_assert_basic:docs", "//third_party/pigweed/src/pw_assert_log:docs", "//third_party/pigweed/src/pw_assert_tokenized:docs", "//third_party/pigweed/src/pw_assert_zephyr:docs", "//third_party/pigweed/src/pw_async:docs", "//third_party/pigweed/src/pw_async2:docs", "//third_party/pigweed/src/pw_async2_basic:docs", "//third_party/pigweed/src/pw_async2_epoll:docs", "//third_party/pigweed/src/pw_async_basic:docs", "//third_party/pigweed/src/pw_base64:docs", "//third_party/pigweed/src/pw_bloat:docs", "//third_party/pigweed/src/pw_blob_store:docs", "//third_party/pigweed/src/pw_bluetooth:docs", "//third_party/pigweed/src/pw_bluetooth_hci:docs", "//third_party/pigweed/src/pw_bluetooth_profiles:docs", "//third_party/pigweed/src/pw_bluetooth_proxy:docs", "//third_party/pigweed/src/pw_bluetooth_sapphire:docs", "//third_party/pigweed/src/pw_boot:docs", "//third_party/pigweed/src/pw_boot_cortex_m:docs", "//third_party/pigweed/src/pw_build:docs", "//third_party/pigweed/src/pw_build_android:docs", "//third_party/pigweed/src/pw_build_info:docs", "//third_party/pigweed/src/pw_build_mcuxpresso:docs", "//third_party/pigweed/src/pw_bytes:docs", "//third_party/pigweed/src/pw_channel:docs", "//third_party/pigweed/src/pw_checksum:docs", "//third_party/pigweed/src/pw_chre:docs", "//third_party/pigweed/src/pw_chrono:docs", "//third_party/pigweed/src/pw_chrono_embos:docs", "//third_party/pigweed/src/pw_chrono_freertos:docs", "//third_party/pigweed/src/pw_chrono_rp2040:docs", "//third_party/pigweed/src/pw_chrono_stl:docs", "//third_party/pigweed/src/pw_chrono_threadx:docs", "//third_party/pigweed/src/pw_chrono_zephyr:docs", "//third_party/pigweed/src/pw_cli:docs", "//third_party/pigweed/src/pw_compilation_testing:docs", "//third_party/pigweed/src/pw_config_loader:docs", "//third_party/pigweed/src/pw_console:docs", "//third_party/pigweed/src/pw_containers:docs", "//third_party/pigweed/src/pw_cpu_exception:docs", "//third_party/pigweed/src/pw_cpu_exception_cortex_m:docs", "//third_party/pigweed/src/pw_cpu_exception_risc_v:docs", "//third_party/pigweed/src/pw_crypto:docs", "//third_party/pigweed/src/pw_digital_io:docs", "//third_party/pigweed/src/pw_digital_io_linux:docs", "//third_party/pigweed/src/pw_digital_io_mcuxpresso:docs", "//third_party/pigweed/src/pw_digital_io_rp2040:docs", "//third_party/pigweed/src/pw_docgen:docs", "//third_party/pigweed/src/pw_doctor:docs", "//third_party/pigweed/src/pw_emu:docs", "//third_party/pigweed/src/pw_env_setup:docs", "//third_party/pigweed/src/pw_env_setup_zephyr:docs", "//third_party/pigweed/src/pw_file:docs", "//third_party/pigweed/src/pw_format:docs", "//third_party/pigweed/src/pw_function:docs", "//third_party/pigweed/src/pw_fuzzer:docs", "//third_party/pigweed/src/pw_grpc:docs", "//third_party/pigweed/src/pw_hdlc:docs", "//third_party/pigweed/src/pw_hex_dump:docs", "//third_party/pigweed/src/pw_i2c:docs", "//third_party/pigweed/src/pw_i2c_linux:docs", "//third_party/pigweed/src/pw_i2c_mcuxpresso:docs", "//third_party/pigweed/src/pw_i2c_rp2040:docs", "//third_party/pigweed/src/pw_ide:docs", "//third_party/pigweed/src/pw_interrupt:docs", "//third_party/pigweed/src/pw_interrupt_cortex_m:docs", "//third_party/pigweed/src/pw_interrupt_xtensa:docs", "//third_party/pigweed/src/pw_interrupt_zephyr:docs", "//third_party/pigweed/src/pw_intrusive_ptr:docs", "//third_party/pigweed/src/pw_json:docs", "//third_party/pigweed/src/pw_kvs:docs", "//third_party/pigweed/src/pw_libc:docs", "//third_party/pigweed/src/pw_libcxx:docs", "//third_party/pigweed/src/pw_log:docs", "//third_party/pigweed/src/pw_log_android:docs", "//third_party/pigweed/src/pw_log_basic:docs", "//third_party/pigweed/src/pw_log_null:docs", "//third_party/pigweed/src/pw_log_rpc:docs", "//third_party/pigweed/src/pw_log_string:docs", "//third_party/pigweed/src/pw_log_tokenized:docs", "//third_party/pigweed/src/pw_log_zephyr:docs", "//third_party/pigweed/src/pw_malloc:docs", "//third_party/pigweed/src/pw_malloc_freelist:docs", "//third_party/pigweed/src/pw_malloc_freertos:docs", "//third_party/pigweed/src/pw_metric:docs", "//third_party/pigweed/src/pw_minimal_cpp_stdlib:docs", "//third_party/pigweed/src/pw_module:docs", "//third_party/pigweed/src/pw_multibuf:docs", "//third_party/pigweed/src/pw_multisink:docs", "//third_party/pigweed/src/pw_package:docs", "//third_party/pigweed/src/pw_perf_test:docs", "//third_party/pigweed/src/pw_persistent_ram:docs", "//third_party/pigweed/src/pw_polyfill:docs", "//third_party/pigweed/src/pw_preprocessor:docs", "//third_party/pigweed/src/pw_presubmit:docs", "//third_party/pigweed/src/pw_protobuf:docs", "//third_party/pigweed/src/pw_protobuf_compiler:docs", "//third_party/pigweed/src/pw_random:docs", "//third_party/pigweed/src/pw_result:docs", "//third_party/pigweed/src/pw_ring_buffer:docs", "//third_party/pigweed/src/pw_router:docs", "//third_party/pigweed/src/pw_rpc:docs", "//third_party/pigweed/src/pw_rpc_transport:docs", "//third_party/pigweed/src/pw_rust:docs", "//third_party/pigweed/src/pw_sensor:docs", "//third_party/pigweed/src/pw_snapshot:docs", "//third_party/pigweed/src/pw_software_update:docs", "//third_party/pigweed/src/pw_span:docs", "//third_party/pigweed/src/pw_spi:docs", "//third_party/pigweed/src/pw_spi_linux:docs", "//third_party/pigweed/src/pw_spi_mcuxpresso:docs", "//third_party/pigweed/src/pw_spi_rp2040:docs", "//third_party/pigweed/src/pw_status:docs", "//third_party/pigweed/src/pw_stm32cube_build:docs", "//third_party/pigweed/src/pw_stream:docs", "//third_party/pigweed/src/pw_stream_shmem_mcuxpresso:docs", "//third_party/pigweed/src/pw_stream_uart_linux:docs", "//third_party/pigweed/src/pw_stream_uart_mcuxpresso:docs", "//third_party/pigweed/src/pw_string:docs", "//third_party/pigweed/src/pw_symbolizer:docs", "//third_party/pigweed/src/pw_sync:docs", "//third_party/pigweed/src/pw_sync_baremetal:docs", "//third_party/pigweed/src/pw_sync_embos:docs", "//third_party/pigweed/src/pw_sync_freertos:docs", "//third_party/pigweed/src/pw_sync_stl:docs", "//third_party/pigweed/src/pw_sync_threadx:docs", "//third_party/pigweed/src/pw_sync_zephyr:docs", "//third_party/pigweed/src/pw_sys_io:docs", "//third_party/pigweed/src/pw_sys_io_ambiq_sdk:docs", "//third_party/pigweed/src/pw_sys_io_arduino:docs", "//third_party/pigweed/src/pw_sys_io_baremetal_lm3s6965evb:docs", "//third_party/pigweed/src/pw_sys_io_baremetal_stm32f429:docs", "//third_party/pigweed/src/pw_sys_io_emcraft_sf2:docs", "//third_party/pigweed/src/pw_sys_io_mcuxpresso:docs", "//third_party/pigweed/src/pw_sys_io_rp2040:docs", "//third_party/pigweed/src/pw_sys_io_stdio:docs", "//third_party/pigweed/src/pw_sys_io_stm32cube:docs", "//third_party/pigweed/src/pw_sys_io_zephyr:docs", "//third_party/pigweed/src/pw_system:docs", "//third_party/pigweed/src/pw_target_runner:docs", "//third_party/pigweed/src/pw_thread:docs", "//third_party/pigweed/src/pw_thread_embos:docs", "//third_party/pigweed/src/pw_thread_freertos:docs", "//third_party/pigweed/src/pw_thread_stl:docs", "//third_party/pigweed/src/pw_thread_threadx:docs", "//third_party/pigweed/src/pw_thread_zephyr:docs", "//third_party/pigweed/src/pw_tls_client:docs", "//third_party/pigweed/src/pw_tls_client_boringssl:docs", "//third_party/pigweed/src/pw_tls_client_mbedtls:docs", "//third_party/pigweed/src/pw_tokenizer:docs", "//third_party/pigweed/src/pw_toolchain:docs", "//third_party/pigweed/src/pw_toolchain_bazel:docs", "//third_party/pigweed/src/pw_trace:docs", "//third_party/pigweed/src/pw_trace_tokenized:docs", "//third_party/pigweed/src/pw_transfer:docs", "//third_party/pigweed/src/pw_uart:docs", "//third_party/pigweed/src/pw_unit_test:docs", "//third_party/pigweed/src/pw_unit_test_zephyr:docs", "//third_party/pigweed/src/pw_varint:docs", "//third_party/pigweed/src/pw_watch:docs", "//third_party/pigweed/src/pw_web:docs", "//third_party/pigweed/src/pw_work_queue:docs"]`
+**Current value (from the default):** `["//third_party/pigweed/src/docker:docs", "//third_party/pigweed/src/pw_alignment:docs", "//third_party/pigweed/src/pw_allocator:docs", "//third_party/pigweed/src/pw_analog:docs", "//third_party/pigweed/src/pw_android_toolchain:docs", "//third_party/pigweed/src/pw_arduino_build:docs", "//third_party/pigweed/src/pw_assert:docs", "//third_party/pigweed/src/pw_assert_basic:docs", "//third_party/pigweed/src/pw_assert_log:docs", "//third_party/pigweed/src/pw_assert_tokenized:docs", "//third_party/pigweed/src/pw_assert_zephyr:docs", "//third_party/pigweed/src/pw_async:docs", "//third_party/pigweed/src/pw_async2:docs", "//third_party/pigweed/src/pw_async2_basic:docs", "//third_party/pigweed/src/pw_async2_epoll:docs", "//third_party/pigweed/src/pw_async_basic:docs", "//third_party/pigweed/src/pw_base64:docs", "//third_party/pigweed/src/pw_bloat:docs", "//third_party/pigweed/src/pw_blob_store:docs", "//third_party/pigweed/src/pw_bluetooth:docs", "//third_party/pigweed/src/pw_bluetooth_hci:docs", "//third_party/pigweed/src/pw_bluetooth_profiles:docs", "//third_party/pigweed/src/pw_bluetooth_proxy:docs", "//third_party/pigweed/src/pw_bluetooth_sapphire:docs", "//third_party/pigweed/src/pw_boot:docs", "//third_party/pigweed/src/pw_boot_cortex_m:docs", "//third_party/pigweed/src/pw_build:docs", "//third_party/pigweed/src/pw_build_android:docs", "//third_party/pigweed/src/pw_build_info:docs", "//third_party/pigweed/src/pw_build_mcuxpresso:docs", "//third_party/pigweed/src/pw_bytes:docs", "//third_party/pigweed/src/pw_channel:docs", "//third_party/pigweed/src/pw_checksum:docs", "//third_party/pigweed/src/pw_chre:docs", "//third_party/pigweed/src/pw_chrono:docs", "//third_party/pigweed/src/pw_chrono_embos:docs", "//third_party/pigweed/src/pw_chrono_freertos:docs", "//third_party/pigweed/src/pw_chrono_rp2040:docs", "//third_party/pigweed/src/pw_chrono_stl:docs", "//third_party/pigweed/src/pw_chrono_threadx:docs", "//third_party/pigweed/src/pw_chrono_zephyr:docs", "//third_party/pigweed/src/pw_cli:docs", "//third_party/pigweed/src/pw_compilation_testing:docs", "//third_party/pigweed/src/pw_config_loader:docs", "//third_party/pigweed/src/pw_console:docs", "//third_party/pigweed/src/pw_containers:docs", "//third_party/pigweed/src/pw_cpu_exception:docs", "//third_party/pigweed/src/pw_cpu_exception_cortex_m:docs", "//third_party/pigweed/src/pw_cpu_exception_risc_v:docs", "//third_party/pigweed/src/pw_crypto:docs", "//third_party/pigweed/src/pw_digital_io:docs", "//third_party/pigweed/src/pw_digital_io_linux:docs", "//third_party/pigweed/src/pw_digital_io_mcuxpresso:docs", "//third_party/pigweed/src/pw_digital_io_rp2040:docs", "//third_party/pigweed/src/pw_dma_mcuxpresso:docs", "//third_party/pigweed/src/pw_docgen:docs", "//third_party/pigweed/src/pw_doctor:docs", "//third_party/pigweed/src/pw_emu:docs", "//third_party/pigweed/src/pw_env_setup:docs", "//third_party/pigweed/src/pw_env_setup_zephyr:docs", "//third_party/pigweed/src/pw_file:docs", "//third_party/pigweed/src/pw_format:docs", "//third_party/pigweed/src/pw_function:docs", "//third_party/pigweed/src/pw_fuzzer:docs", "//third_party/pigweed/src/pw_grpc:docs", "//third_party/pigweed/src/pw_hdlc:docs", "//third_party/pigweed/src/pw_hex_dump:docs", "//third_party/pigweed/src/pw_i2c:docs", "//third_party/pigweed/src/pw_i2c_linux:docs", "//third_party/pigweed/src/pw_i2c_mcuxpresso:docs", "//third_party/pigweed/src/pw_i2c_rp2040:docs", "//third_party/pigweed/src/pw_ide:docs", "//third_party/pigweed/src/pw_interrupt:docs", "//third_party/pigweed/src/pw_interrupt_cortex_m:docs", "//third_party/pigweed/src/pw_interrupt_xtensa:docs", "//third_party/pigweed/src/pw_interrupt_zephyr:docs", "//third_party/pigweed/src/pw_intrusive_ptr:docs", "//third_party/pigweed/src/pw_json:docs", "//third_party/pigweed/src/pw_kvs:docs", "//third_party/pigweed/src/pw_libc:docs", "//third_party/pigweed/src/pw_libcxx:docs", "//third_party/pigweed/src/pw_log:docs", "//third_party/pigweed/src/pw_log_android:docs", "//third_party/pigweed/src/pw_log_basic:docs", "//third_party/pigweed/src/pw_log_null:docs", "//third_party/pigweed/src/pw_log_rpc:docs", "//third_party/pigweed/src/pw_log_string:docs", "//third_party/pigweed/src/pw_log_tokenized:docs", "//third_party/pigweed/src/pw_log_zephyr:docs", "//third_party/pigweed/src/pw_malloc:docs", "//third_party/pigweed/src/pw_malloc_freelist:docs", "//third_party/pigweed/src/pw_malloc_freertos:docs", "//third_party/pigweed/src/pw_metric:docs", "//third_party/pigweed/src/pw_minimal_cpp_stdlib:docs", "//third_party/pigweed/src/pw_module:docs", "//third_party/pigweed/src/pw_multibuf:docs", "//third_party/pigweed/src/pw_multisink:docs", "//third_party/pigweed/src/pw_package:docs", "//third_party/pigweed/src/pw_perf_test:docs", "//third_party/pigweed/src/pw_persistent_ram:docs", "//third_party/pigweed/src/pw_polyfill:docs", "//third_party/pigweed/src/pw_preprocessor:docs", "//third_party/pigweed/src/pw_presubmit:docs", "//third_party/pigweed/src/pw_protobuf:docs", "//third_party/pigweed/src/pw_protobuf_compiler:docs", "//third_party/pigweed/src/pw_random:docs", "//third_party/pigweed/src/pw_result:docs", "//third_party/pigweed/src/pw_ring_buffer:docs", "//third_party/pigweed/src/pw_router:docs", "//third_party/pigweed/src/pw_rpc:docs", "//third_party/pigweed/src/pw_rpc_transport:docs", "//third_party/pigweed/src/pw_rust:docs", "//third_party/pigweed/src/pw_sensor:docs", "//third_party/pigweed/src/pw_snapshot:docs", "//third_party/pigweed/src/pw_software_update:docs", "//third_party/pigweed/src/pw_span:docs", "//third_party/pigweed/src/pw_spi:docs", "//third_party/pigweed/src/pw_spi_linux:docs", "//third_party/pigweed/src/pw_spi_mcuxpresso:docs", "//third_party/pigweed/src/pw_spi_rp2040:docs", "//third_party/pigweed/src/pw_status:docs", "//third_party/pigweed/src/pw_stm32cube_build:docs", "//third_party/pigweed/src/pw_stream:docs", "//third_party/pigweed/src/pw_stream_shmem_mcuxpresso:docs", "//third_party/pigweed/src/pw_stream_uart_linux:docs", "//third_party/pigweed/src/pw_stream_uart_mcuxpresso:docs", "//third_party/pigweed/src/pw_string:docs", "//third_party/pigweed/src/pw_symbolizer:docs", "//third_party/pigweed/src/pw_sync:docs", "//third_party/pigweed/src/pw_sync_baremetal:docs", "//third_party/pigweed/src/pw_sync_embos:docs", "//third_party/pigweed/src/pw_sync_freertos:docs", "//third_party/pigweed/src/pw_sync_stl:docs", "//third_party/pigweed/src/pw_sync_threadx:docs", "//third_party/pigweed/src/pw_sync_zephyr:docs", "//third_party/pigweed/src/pw_sys_io:docs", "//third_party/pigweed/src/pw_sys_io_ambiq_sdk:docs", "//third_party/pigweed/src/pw_sys_io_arduino:docs", "//third_party/pigweed/src/pw_sys_io_baremetal_lm3s6965evb:docs", "//third_party/pigweed/src/pw_sys_io_baremetal_stm32f429:docs", "//third_party/pigweed/src/pw_sys_io_emcraft_sf2:docs", "//third_party/pigweed/src/pw_sys_io_mcuxpresso:docs", "//third_party/pigweed/src/pw_sys_io_rp2040:docs", "//third_party/pigweed/src/pw_sys_io_stdio:docs", "//third_party/pigweed/src/pw_sys_io_stm32cube:docs", "//third_party/pigweed/src/pw_sys_io_zephyr:docs", "//third_party/pigweed/src/pw_system:docs", "//third_party/pigweed/src/pw_target_runner:docs", "//third_party/pigweed/src/pw_thread:docs", "//third_party/pigweed/src/pw_thread_embos:docs", "//third_party/pigweed/src/pw_thread_freertos:docs", "//third_party/pigweed/src/pw_thread_stl:docs", "//third_party/pigweed/src/pw_thread_threadx:docs", "//third_party/pigweed/src/pw_thread_zephyr:docs", "//third_party/pigweed/src/pw_tls_client:docs", "//third_party/pigweed/src/pw_tls_client_boringssl:docs", "//third_party/pigweed/src/pw_tls_client_mbedtls:docs", "//third_party/pigweed/src/pw_tokenizer:docs", "//third_party/pigweed/src/pw_toolchain:docs", "//third_party/pigweed/src/pw_toolchain_bazel:docs", "//third_party/pigweed/src/pw_trace:docs", "//third_party/pigweed/src/pw_trace_tokenized:docs", "//third_party/pigweed/src/pw_transfer:docs", "//third_party/pigweed/src/pw_uart:docs", "//third_party/pigweed/src/pw_unit_test:docs", "//third_party/pigweed/src/pw_unit_test_zephyr:docs", "//third_party/pigweed/src/pw_varint:docs", "//third_party/pigweed/src/pw_watch:docs", "//third_party/pigweed/src/pw_web:docs", "//third_party/pigweed/src/pw_work_queue:docs"]`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:566
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:569
 
 ### pw_module_tests
 
 A list with all Pigweed module test groups. DO NOT SET THIS BUILD ARGUMENT!
 
-**Current value (from the default):** `["//third_party/pigweed/src/docker:tests", "//third_party/pigweed/src/pw_alignment:tests", "//third_party/pigweed/src/pw_allocator:tests", "//third_party/pigweed/src/pw_analog:tests", "//third_party/pigweed/src/pw_android_toolchain:tests", "//third_party/pigweed/src/pw_arduino_build:tests", "//third_party/pigweed/src/pw_assert:tests", "//third_party/pigweed/src/pw_assert_basic:tests", "//third_party/pigweed/src/pw_assert_log:tests", "//third_party/pigweed/src/pw_assert_tokenized:tests", "//third_party/pigweed/src/pw_assert_zephyr:tests", "//third_party/pigweed/src/pw_async:tests", "//third_party/pigweed/src/pw_async2:tests", "//third_party/pigweed/src/pw_async2_basic:tests", "//third_party/pigweed/src/pw_async2_epoll:tests", "//third_party/pigweed/src/pw_async_basic:tests", "//third_party/pigweed/src/pw_base64:tests", "//third_party/pigweed/src/pw_bloat:tests", "//third_party/pigweed/src/pw_blob_store:tests", "//third_party/pigweed/src/pw_bluetooth:tests", "//third_party/pigweed/src/pw_bluetooth_hci:tests", "//third_party/pigweed/src/pw_bluetooth_profiles:tests", "//third_party/pigweed/src/pw_bluetooth_proxy:tests", "//third_party/pigweed/src/pw_bluetooth_sapphire:tests", "//third_party/pigweed/src/pw_boot:tests", "//third_party/pigweed/src/pw_boot_cortex_m:tests", "//third_party/pigweed/src/pw_build:tests", "//third_party/pigweed/src/pw_build_android:tests", "//third_party/pigweed/src/pw_build_info:tests", "//third_party/pigweed/src/pw_build_mcuxpresso:tests", "//third_party/pigweed/src/pw_bytes:tests", "//third_party/pigweed/src/pw_channel:tests", "//third_party/pigweed/src/pw_checksum:tests", "//third_party/pigweed/src/pw_chre:tests", "//third_party/pigweed/src/pw_chrono:tests", "//third_party/pigweed/src/pw_chrono_embos:tests", "//third_party/pigweed/src/pw_chrono_freertos:tests", "//third_party/pigweed/src/pw_chrono_rp2040:tests", "//third_party/pigweed/src/pw_chrono_stl:tests", "//third_party/pigweed/src/pw_chrono_threadx:tests", "//third_party/pigweed/src/pw_chrono_zephyr:tests", "//third_party/pigweed/src/pw_cli:tests", "//third_party/pigweed/src/pw_compilation_testing:tests", "//third_party/pigweed/src/pw_config_loader:tests", "//third_party/pigweed/src/pw_console:tests", "//third_party/pigweed/src/pw_containers:tests", "//third_party/pigweed/src/pw_cpu_exception:tests", "//third_party/pigweed/src/pw_cpu_exception_cortex_m:tests", "//third_party/pigweed/src/pw_cpu_exception_risc_v:tests", "//third_party/pigweed/src/pw_crypto:tests", "//third_party/pigweed/src/pw_digital_io:tests", "//third_party/pigweed/src/pw_digital_io_linux:tests", "//third_party/pigweed/src/pw_digital_io_mcuxpresso:tests", "//third_party/pigweed/src/pw_digital_io_rp2040:tests", "//third_party/pigweed/src/pw_docgen:tests", "//third_party/pigweed/src/pw_doctor:tests", "//third_party/pigweed/src/pw_emu:tests", "//third_party/pigweed/src/pw_env_setup:tests", "//third_party/pigweed/src/pw_env_setup_zephyr:tests", "//third_party/pigweed/src/pw_file:tests", "//third_party/pigweed/src/pw_format:tests", "//third_party/pigweed/src/pw_function:tests", "//third_party/pigweed/src/pw_fuzzer:tests", "//third_party/pigweed/src/pw_grpc:tests", "//third_party/pigweed/src/pw_hdlc:tests", "//third_party/pigweed/src/pw_hex_dump:tests", "//third_party/pigweed/src/pw_i2c:tests", "//third_party/pigweed/src/pw_i2c_linux:tests", "//third_party/pigweed/src/pw_i2c_mcuxpresso:tests", "//third_party/pigweed/src/pw_i2c_rp2040:tests", "//third_party/pigweed/src/pw_ide:tests", "//third_party/pigweed/src/pw_interrupt:tests", "//third_party/pigweed/src/pw_interrupt_cortex_m:tests", "//third_party/pigweed/src/pw_interrupt_xtensa:tests", "//third_party/pigweed/src/pw_interrupt_zephyr:tests", "//third_party/pigweed/src/pw_intrusive_ptr:tests", "//third_party/pigweed/src/pw_json:tests", "//third_party/pigweed/src/pw_kvs:tests", "//third_party/pigweed/src/pw_libc:tests", "//third_party/pigweed/src/pw_libcxx:tests", "//third_party/pigweed/src/pw_log:tests", "//third_party/pigweed/src/pw_log_android:tests", "//third_party/pigweed/src/pw_log_basic:tests", "//third_party/pigweed/src/pw_log_null:tests", "//third_party/pigweed/src/pw_log_rpc:tests", "//third_party/pigweed/src/pw_log_string:tests", "//third_party/pigweed/src/pw_log_tokenized:tests", "//third_party/pigweed/src/pw_log_zephyr:tests", "//third_party/pigweed/src/pw_malloc:tests", "//third_party/pigweed/src/pw_malloc_freelist:tests", "//third_party/pigweed/src/pw_malloc_freertos:tests", "//third_party/pigweed/src/pw_metric:tests", "//third_party/pigweed/src/pw_minimal_cpp_stdlib:tests", "//third_party/pigweed/src/pw_module:tests", "//third_party/pigweed/src/pw_multibuf:tests", "//third_party/pigweed/src/pw_multisink:tests", "//third_party/pigweed/src/pw_package:tests", "//third_party/pigweed/src/pw_perf_test:tests", "//third_party/pigweed/src/pw_persistent_ram:tests", "//third_party/pigweed/src/pw_polyfill:tests", "//third_party/pigweed/src/pw_preprocessor:tests", "//third_party/pigweed/src/pw_presubmit:tests", "//third_party/pigweed/src/pw_protobuf:tests", "//third_party/pigweed/src/pw_protobuf_compiler:tests", "//third_party/pigweed/src/pw_random:tests", "//third_party/pigweed/src/pw_result:tests", "//third_party/pigweed/src/pw_ring_buffer:tests", "//third_party/pigweed/src/pw_router:tests", "//third_party/pigweed/src/pw_rpc:tests", "//third_party/pigweed/src/pw_rpc_transport:tests", "//third_party/pigweed/src/pw_rust:tests", "//third_party/pigweed/src/pw_sensor:tests", "//third_party/pigweed/src/pw_snapshot:tests", "//third_party/pigweed/src/pw_software_update:tests", "//third_party/pigweed/src/pw_span:tests", "//third_party/pigweed/src/pw_spi:tests", "//third_party/pigweed/src/pw_spi_linux:tests", "//third_party/pigweed/src/pw_spi_mcuxpresso:tests", "//third_party/pigweed/src/pw_spi_rp2040:tests", "//third_party/pigweed/src/pw_status:tests", "//third_party/pigweed/src/pw_stm32cube_build:tests", "//third_party/pigweed/src/pw_stream:tests", "//third_party/pigweed/src/pw_stream_shmem_mcuxpresso:tests", "//third_party/pigweed/src/pw_stream_uart_linux:tests", "//third_party/pigweed/src/pw_stream_uart_mcuxpresso:tests", "//third_party/pigweed/src/pw_string:tests", "//third_party/pigweed/src/pw_symbolizer:tests", "//third_party/pigweed/src/pw_sync:tests", "//third_party/pigweed/src/pw_sync_baremetal:tests", "//third_party/pigweed/src/pw_sync_embos:tests", "//third_party/pigweed/src/pw_sync_freertos:tests", "//third_party/pigweed/src/pw_sync_stl:tests", "//third_party/pigweed/src/pw_sync_threadx:tests", "//third_party/pigweed/src/pw_sync_zephyr:tests", "//third_party/pigweed/src/pw_sys_io:tests", "//third_party/pigweed/src/pw_sys_io_ambiq_sdk:tests", "//third_party/pigweed/src/pw_sys_io_arduino:tests", "//third_party/pigweed/src/pw_sys_io_baremetal_lm3s6965evb:tests", "//third_party/pigweed/src/pw_sys_io_baremetal_stm32f429:tests", "//third_party/pigweed/src/pw_sys_io_emcraft_sf2:tests", "//third_party/pigweed/src/pw_sys_io_mcuxpresso:tests", "//third_party/pigweed/src/pw_sys_io_rp2040:tests", "//third_party/pigweed/src/pw_sys_io_stdio:tests", "//third_party/pigweed/src/pw_sys_io_stm32cube:tests", "//third_party/pigweed/src/pw_sys_io_zephyr:tests", "//third_party/pigweed/src/pw_system:tests", "//third_party/pigweed/src/pw_target_runner:tests", "//third_party/pigweed/src/pw_thread:tests", "//third_party/pigweed/src/pw_thread_embos:tests", "//third_party/pigweed/src/pw_thread_freertos:tests", "//third_party/pigweed/src/pw_thread_stl:tests", "//third_party/pigweed/src/pw_thread_threadx:tests", "//third_party/pigweed/src/pw_thread_zephyr:tests", "//third_party/pigweed/src/pw_tls_client:tests", "//third_party/pigweed/src/pw_tls_client_boringssl:tests", "//third_party/pigweed/src/pw_tls_client_mbedtls:tests", "//third_party/pigweed/src/pw_tokenizer:tests", "//third_party/pigweed/src/pw_toolchain:tests", "//third_party/pigweed/src/pw_toolchain_bazel:tests", "//third_party/pigweed/src/pw_trace:tests", "//third_party/pigweed/src/pw_trace_tokenized:tests", "//third_party/pigweed/src/pw_transfer:tests", "//third_party/pigweed/src/pw_uart:tests", "//third_party/pigweed/src/pw_unit_test:tests", "//third_party/pigweed/src/pw_unit_test_zephyr:tests", "//third_party/pigweed/src/pw_varint:tests", "//third_party/pigweed/src/pw_watch:tests", "//third_party/pigweed/src/pw_web:tests", "//third_party/pigweed/src/pw_work_queue:tests"]`
+**Current value (from the default):** `["//third_party/pigweed/src/docker:tests", "//third_party/pigweed/src/pw_alignment:tests", "//third_party/pigweed/src/pw_allocator:tests", "//third_party/pigweed/src/pw_analog:tests", "//third_party/pigweed/src/pw_android_toolchain:tests", "//third_party/pigweed/src/pw_arduino_build:tests", "//third_party/pigweed/src/pw_assert:tests", "//third_party/pigweed/src/pw_assert_basic:tests", "//third_party/pigweed/src/pw_assert_log:tests", "//third_party/pigweed/src/pw_assert_tokenized:tests", "//third_party/pigweed/src/pw_assert_zephyr:tests", "//third_party/pigweed/src/pw_async:tests", "//third_party/pigweed/src/pw_async2:tests", "//third_party/pigweed/src/pw_async2_basic:tests", "//third_party/pigweed/src/pw_async2_epoll:tests", "//third_party/pigweed/src/pw_async_basic:tests", "//third_party/pigweed/src/pw_base64:tests", "//third_party/pigweed/src/pw_bloat:tests", "//third_party/pigweed/src/pw_blob_store:tests", "//third_party/pigweed/src/pw_bluetooth:tests", "//third_party/pigweed/src/pw_bluetooth_hci:tests", "//third_party/pigweed/src/pw_bluetooth_profiles:tests", "//third_party/pigweed/src/pw_bluetooth_proxy:tests", "//third_party/pigweed/src/pw_bluetooth_sapphire:tests", "//third_party/pigweed/src/pw_boot:tests", "//third_party/pigweed/src/pw_boot_cortex_m:tests", "//third_party/pigweed/src/pw_build:tests", "//third_party/pigweed/src/pw_build_android:tests", "//third_party/pigweed/src/pw_build_info:tests", "//third_party/pigweed/src/pw_build_mcuxpresso:tests", "//third_party/pigweed/src/pw_bytes:tests", "//third_party/pigweed/src/pw_channel:tests", "//third_party/pigweed/src/pw_checksum:tests", "//third_party/pigweed/src/pw_chre:tests", "//third_party/pigweed/src/pw_chrono:tests", "//third_party/pigweed/src/pw_chrono_embos:tests", "//third_party/pigweed/src/pw_chrono_freertos:tests", "//third_party/pigweed/src/pw_chrono_rp2040:tests", "//third_party/pigweed/src/pw_chrono_stl:tests", "//third_party/pigweed/src/pw_chrono_threadx:tests", "//third_party/pigweed/src/pw_chrono_zephyr:tests", "//third_party/pigweed/src/pw_cli:tests", "//third_party/pigweed/src/pw_compilation_testing:tests", "//third_party/pigweed/src/pw_config_loader:tests", "//third_party/pigweed/src/pw_console:tests", "//third_party/pigweed/src/pw_containers:tests", "//third_party/pigweed/src/pw_cpu_exception:tests", "//third_party/pigweed/src/pw_cpu_exception_cortex_m:tests", "//third_party/pigweed/src/pw_cpu_exception_risc_v:tests", "//third_party/pigweed/src/pw_crypto:tests", "//third_party/pigweed/src/pw_digital_io:tests", "//third_party/pigweed/src/pw_digital_io_linux:tests", "//third_party/pigweed/src/pw_digital_io_mcuxpresso:tests", "//third_party/pigweed/src/pw_digital_io_rp2040:tests", "//third_party/pigweed/src/pw_dma_mcuxpresso:tests", "//third_party/pigweed/src/pw_docgen:tests", "//third_party/pigweed/src/pw_doctor:tests", "//third_party/pigweed/src/pw_emu:tests", "//third_party/pigweed/src/pw_env_setup:tests", "//third_party/pigweed/src/pw_env_setup_zephyr:tests", "//third_party/pigweed/src/pw_file:tests", "//third_party/pigweed/src/pw_format:tests", "//third_party/pigweed/src/pw_function:tests", "//third_party/pigweed/src/pw_fuzzer:tests", "//third_party/pigweed/src/pw_grpc:tests", "//third_party/pigweed/src/pw_hdlc:tests", "//third_party/pigweed/src/pw_hex_dump:tests", "//third_party/pigweed/src/pw_i2c:tests", "//third_party/pigweed/src/pw_i2c_linux:tests", "//third_party/pigweed/src/pw_i2c_mcuxpresso:tests", "//third_party/pigweed/src/pw_i2c_rp2040:tests", "//third_party/pigweed/src/pw_ide:tests", "//third_party/pigweed/src/pw_interrupt:tests", "//third_party/pigweed/src/pw_interrupt_cortex_m:tests", "//third_party/pigweed/src/pw_interrupt_xtensa:tests", "//third_party/pigweed/src/pw_interrupt_zephyr:tests", "//third_party/pigweed/src/pw_intrusive_ptr:tests", "//third_party/pigweed/src/pw_json:tests", "//third_party/pigweed/src/pw_kvs:tests", "//third_party/pigweed/src/pw_libc:tests", "//third_party/pigweed/src/pw_libcxx:tests", "//third_party/pigweed/src/pw_log:tests", "//third_party/pigweed/src/pw_log_android:tests", "//third_party/pigweed/src/pw_log_basic:tests", "//third_party/pigweed/src/pw_log_null:tests", "//third_party/pigweed/src/pw_log_rpc:tests", "//third_party/pigweed/src/pw_log_string:tests", "//third_party/pigweed/src/pw_log_tokenized:tests", "//third_party/pigweed/src/pw_log_zephyr:tests", "//third_party/pigweed/src/pw_malloc:tests", "//third_party/pigweed/src/pw_malloc_freelist:tests", "//third_party/pigweed/src/pw_malloc_freertos:tests", "//third_party/pigweed/src/pw_metric:tests", "//third_party/pigweed/src/pw_minimal_cpp_stdlib:tests", "//third_party/pigweed/src/pw_module:tests", "//third_party/pigweed/src/pw_multibuf:tests", "//third_party/pigweed/src/pw_multisink:tests", "//third_party/pigweed/src/pw_package:tests", "//third_party/pigweed/src/pw_perf_test:tests", "//third_party/pigweed/src/pw_persistent_ram:tests", "//third_party/pigweed/src/pw_polyfill:tests", "//third_party/pigweed/src/pw_preprocessor:tests", "//third_party/pigweed/src/pw_presubmit:tests", "//third_party/pigweed/src/pw_protobuf:tests", "//third_party/pigweed/src/pw_protobuf_compiler:tests", "//third_party/pigweed/src/pw_random:tests", "//third_party/pigweed/src/pw_result:tests", "//third_party/pigweed/src/pw_ring_buffer:tests", "//third_party/pigweed/src/pw_router:tests", "//third_party/pigweed/src/pw_rpc:tests", "//third_party/pigweed/src/pw_rpc_transport:tests", "//third_party/pigweed/src/pw_rust:tests", "//third_party/pigweed/src/pw_sensor:tests", "//third_party/pigweed/src/pw_snapshot:tests", "//third_party/pigweed/src/pw_software_update:tests", "//third_party/pigweed/src/pw_span:tests", "//third_party/pigweed/src/pw_spi:tests", "//third_party/pigweed/src/pw_spi_linux:tests", "//third_party/pigweed/src/pw_spi_mcuxpresso:tests", "//third_party/pigweed/src/pw_spi_rp2040:tests", "//third_party/pigweed/src/pw_status:tests", "//third_party/pigweed/src/pw_stm32cube_build:tests", "//third_party/pigweed/src/pw_stream:tests", "//third_party/pigweed/src/pw_stream_shmem_mcuxpresso:tests", "//third_party/pigweed/src/pw_stream_uart_linux:tests", "//third_party/pigweed/src/pw_stream_uart_mcuxpresso:tests", "//third_party/pigweed/src/pw_string:tests", "//third_party/pigweed/src/pw_symbolizer:tests", "//third_party/pigweed/src/pw_sync:tests", "//third_party/pigweed/src/pw_sync_baremetal:tests", "//third_party/pigweed/src/pw_sync_embos:tests", "//third_party/pigweed/src/pw_sync_freertos:tests", "//third_party/pigweed/src/pw_sync_stl:tests", "//third_party/pigweed/src/pw_sync_threadx:tests", "//third_party/pigweed/src/pw_sync_zephyr:tests", "//third_party/pigweed/src/pw_sys_io:tests", "//third_party/pigweed/src/pw_sys_io_ambiq_sdk:tests", "//third_party/pigweed/src/pw_sys_io_arduino:tests", "//third_party/pigweed/src/pw_sys_io_baremetal_lm3s6965evb:tests", "//third_party/pigweed/src/pw_sys_io_baremetal_stm32f429:tests", "//third_party/pigweed/src/pw_sys_io_emcraft_sf2:tests", "//third_party/pigweed/src/pw_sys_io_mcuxpresso:tests", "//third_party/pigweed/src/pw_sys_io_rp2040:tests", "//third_party/pigweed/src/pw_sys_io_stdio:tests", "//third_party/pigweed/src/pw_sys_io_stm32cube:tests", "//third_party/pigweed/src/pw_sys_io_zephyr:tests", "//third_party/pigweed/src/pw_system:tests", "//third_party/pigweed/src/pw_target_runner:tests", "//third_party/pigweed/src/pw_thread:tests", "//third_party/pigweed/src/pw_thread_embos:tests", "//third_party/pigweed/src/pw_thread_freertos:tests", "//third_party/pigweed/src/pw_thread_stl:tests", "//third_party/pigweed/src/pw_thread_threadx:tests", "//third_party/pigweed/src/pw_thread_zephyr:tests", "//third_party/pigweed/src/pw_tls_client:tests", "//third_party/pigweed/src/pw_tls_client_boringssl:tests", "//third_party/pigweed/src/pw_tls_client_mbedtls:tests", "//third_party/pigweed/src/pw_tokenizer:tests", "//third_party/pigweed/src/pw_toolchain:tests", "//third_party/pigweed/src/pw_toolchain_bazel:tests", "//third_party/pigweed/src/pw_trace:tests", "//third_party/pigweed/src/pw_trace_tokenized:tests", "//third_party/pigweed/src/pw_transfer:tests", "//third_party/pigweed/src/pw_uart:tests", "//third_party/pigweed/src/pw_unit_test:tests", "//third_party/pigweed/src/pw_unit_test_zephyr:tests", "//third_party/pigweed/src/pw_varint:tests", "//third_party/pigweed/src/pw_watch:tests", "//third_party/pigweed/src/pw_web:tests", "//third_party/pigweed/src/pw_work_queue:tests"]`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:393
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:395
 
 ### pw_modules
 
 A list with paths to all Pigweed module. DO NOT SET THIS BUILD ARGUMENT!
 
-**Current value (from the default):** `["//third_party/pigweed/src/docker", "//third_party/pigweed/src/pw_alignment", "//third_party/pigweed/src/pw_allocator", "//third_party/pigweed/src/pw_analog", "//third_party/pigweed/src/pw_android_toolchain", "//third_party/pigweed/src/pw_arduino_build", "//third_party/pigweed/src/pw_assert", "//third_party/pigweed/src/pw_assert_basic", "//third_party/pigweed/src/pw_assert_log", "//third_party/pigweed/src/pw_assert_tokenized", "//third_party/pigweed/src/pw_assert_zephyr", "//third_party/pigweed/src/pw_async", "//third_party/pigweed/src/pw_async2", "//third_party/pigweed/src/pw_async2_basic", "//third_party/pigweed/src/pw_async2_epoll", "//third_party/pigweed/src/pw_async_basic", "//third_party/pigweed/src/pw_base64", "//third_party/pigweed/src/pw_bloat", "//third_party/pigweed/src/pw_blob_store", "//third_party/pigweed/src/pw_bluetooth", "//third_party/pigweed/src/pw_bluetooth_hci", "//third_party/pigweed/src/pw_bluetooth_profiles", "//third_party/pigweed/src/pw_bluetooth_proxy", "//third_party/pigweed/src/pw_bluetooth_sapphire", "//third_party/pigweed/src/pw_boot", "//third_party/pigweed/src/pw_boot_cortex_m", "//third_party/pigweed/src/pw_build", "//third_party/pigweed/src/pw_build_android", "//third_party/pigweed/src/pw_build_info", "//third_party/pigweed/src/pw_build_mcuxpresso", "//third_party/pigweed/src/pw_bytes", "//third_party/pigweed/src/pw_channel", "//third_party/pigweed/src/pw_checksum", "//third_party/pigweed/src/pw_chre", "//third_party/pigweed/src/pw_chrono", "//third_party/pigweed/src/pw_chrono_embos", "//third_party/pigweed/src/pw_chrono_freertos", "//third_party/pigweed/src/pw_chrono_rp2040", "//third_party/pigweed/src/pw_chrono_stl", "//third_party/pigweed/src/pw_chrono_threadx", "//third_party/pigweed/src/pw_chrono_zephyr", "//third_party/pigweed/src/pw_cli", "//third_party/pigweed/src/pw_compilation_testing", "//third_party/pigweed/src/pw_config_loader", "//third_party/pigweed/src/pw_console", "//third_party/pigweed/src/pw_containers", "//third_party/pigweed/src/pw_cpu_exception", "//third_party/pigweed/src/pw_cpu_exception_cortex_m", "//third_party/pigweed/src/pw_cpu_exception_risc_v", "//third_party/pigweed/src/pw_crypto", "//third_party/pigweed/src/pw_digital_io", "//third_party/pigweed/src/pw_digital_io_linux", "//third_party/pigweed/src/pw_digital_io_mcuxpresso", "//third_party/pigweed/src/pw_digital_io_rp2040", "//third_party/pigweed/src/pw_docgen", "//third_party/pigweed/src/pw_doctor", "//third_party/pigweed/src/pw_emu", "//third_party/pigweed/src/pw_env_setup", "//third_party/pigweed/src/pw_env_setup_zephyr", "//third_party/pigweed/src/pw_file", "//third_party/pigweed/src/pw_format", "//third_party/pigweed/src/pw_function", "//third_party/pigweed/src/pw_fuzzer", "//third_party/pigweed/src/pw_grpc", "//third_party/pigweed/src/pw_hdlc", "//third_party/pigweed/src/pw_hex_dump", "//third_party/pigweed/src/pw_i2c", "//third_party/pigweed/src/pw_i2c_linux", "//third_party/pigweed/src/pw_i2c_mcuxpresso", "//third_party/pigweed/src/pw_i2c_rp2040", "//third_party/pigweed/src/pw_ide", "//third_party/pigweed/src/pw_interrupt", "//third_party/pigweed/src/pw_interrupt_cortex_m", "//third_party/pigweed/src/pw_interrupt_xtensa", "//third_party/pigweed/src/pw_interrupt_zephyr", "//third_party/pigweed/src/pw_intrusive_ptr", "//third_party/pigweed/src/pw_json", "//third_party/pigweed/src/pw_kvs", "//third_party/pigweed/src/pw_libc", "//third_party/pigweed/src/pw_libcxx", "//third_party/pigweed/src/pw_log", "//third_party/pigweed/src/pw_log_android", "//third_party/pigweed/src/pw_log_basic", "//third_party/pigweed/src/pw_log_null", "//third_party/pigweed/src/pw_log_rpc", "//third_party/pigweed/src/pw_log_string", "//third_party/pigweed/src/pw_log_tokenized", "//third_party/pigweed/src/pw_log_zephyr", "//third_party/pigweed/src/pw_malloc", "//third_party/pigweed/src/pw_malloc_freelist", "//third_party/pigweed/src/pw_malloc_freertos", "//third_party/pigweed/src/pw_metric", "//third_party/pigweed/src/pw_minimal_cpp_stdlib", "//third_party/pigweed/src/pw_module", "//third_party/pigweed/src/pw_multibuf", "//third_party/pigweed/src/pw_multisink", "//third_party/pigweed/src/pw_package", "//third_party/pigweed/src/pw_perf_test", "//third_party/pigweed/src/pw_persistent_ram", "//third_party/pigweed/src/pw_polyfill", "//third_party/pigweed/src/pw_preprocessor", "//third_party/pigweed/src/pw_presubmit", "//third_party/pigweed/src/pw_protobuf", "//third_party/pigweed/src/pw_protobuf_compiler", "//third_party/pigweed/src/pw_random", "//third_party/pigweed/src/pw_result", "//third_party/pigweed/src/pw_ring_buffer", "//third_party/pigweed/src/pw_router", "//third_party/pigweed/src/pw_rpc", "//third_party/pigweed/src/pw_rpc_transport", "//third_party/pigweed/src/pw_rust", "//third_party/pigweed/src/pw_sensor", "//third_party/pigweed/src/pw_snapshot", "//third_party/pigweed/src/pw_software_update", "//third_party/pigweed/src/pw_span", "//third_party/pigweed/src/pw_spi", "//third_party/pigweed/src/pw_spi_linux", "//third_party/pigweed/src/pw_spi_mcuxpresso", "//third_party/pigweed/src/pw_spi_rp2040", "//third_party/pigweed/src/pw_status", "//third_party/pigweed/src/pw_stm32cube_build", "//third_party/pigweed/src/pw_stream", "//third_party/pigweed/src/pw_stream_shmem_mcuxpresso", "//third_party/pigweed/src/pw_stream_uart_linux", "//third_party/pigweed/src/pw_stream_uart_mcuxpresso", "//third_party/pigweed/src/pw_string", "//third_party/pigweed/src/pw_symbolizer", "//third_party/pigweed/src/pw_sync", "//third_party/pigweed/src/pw_sync_baremetal", "//third_party/pigweed/src/pw_sync_embos", "//third_party/pigweed/src/pw_sync_freertos", "//third_party/pigweed/src/pw_sync_stl", "//third_party/pigweed/src/pw_sync_threadx", "//third_party/pigweed/src/pw_sync_zephyr", "//third_party/pigweed/src/pw_sys_io", "//third_party/pigweed/src/pw_sys_io_ambiq_sdk", "//third_party/pigweed/src/pw_sys_io_arduino", "//third_party/pigweed/src/pw_sys_io_baremetal_lm3s6965evb", "//third_party/pigweed/src/pw_sys_io_baremetal_stm32f429", "//third_party/pigweed/src/pw_sys_io_emcraft_sf2", "//third_party/pigweed/src/pw_sys_io_mcuxpresso", "//third_party/pigweed/src/pw_sys_io_rp2040", "//third_party/pigweed/src/pw_sys_io_stdio", "//third_party/pigweed/src/pw_sys_io_stm32cube", "//third_party/pigweed/src/pw_sys_io_zephyr", "//third_party/pigweed/src/pw_system", "//third_party/pigweed/src/pw_target_runner", "//third_party/pigweed/src/pw_thread", "//third_party/pigweed/src/pw_thread_embos", "//third_party/pigweed/src/pw_thread_freertos", "//third_party/pigweed/src/pw_thread_stl", "//third_party/pigweed/src/pw_thread_threadx", "//third_party/pigweed/src/pw_thread_zephyr", "//third_party/pigweed/src/pw_tls_client", "//third_party/pigweed/src/pw_tls_client_boringssl", "//third_party/pigweed/src/pw_tls_client_mbedtls", "//third_party/pigweed/src/pw_tokenizer", "//third_party/pigweed/src/pw_toolchain", "//third_party/pigweed/src/pw_toolchain_bazel", "//third_party/pigweed/src/pw_trace", "//third_party/pigweed/src/pw_trace_tokenized", "//third_party/pigweed/src/pw_transfer", "//third_party/pigweed/src/pw_uart", "//third_party/pigweed/src/pw_unit_test", "//third_party/pigweed/src/pw_unit_test_zephyr", "//third_party/pigweed/src/pw_varint", "//third_party/pigweed/src/pw_watch", "//third_party/pigweed/src/pw_web", "//third_party/pigweed/src/pw_work_queue"]`
+**Current value (from the default):** `["//third_party/pigweed/src/docker", "//third_party/pigweed/src/pw_alignment", "//third_party/pigweed/src/pw_allocator", "//third_party/pigweed/src/pw_analog", "//third_party/pigweed/src/pw_android_toolchain", "//third_party/pigweed/src/pw_arduino_build", "//third_party/pigweed/src/pw_assert", "//third_party/pigweed/src/pw_assert_basic", "//third_party/pigweed/src/pw_assert_log", "//third_party/pigweed/src/pw_assert_tokenized", "//third_party/pigweed/src/pw_assert_zephyr", "//third_party/pigweed/src/pw_async", "//third_party/pigweed/src/pw_async2", "//third_party/pigweed/src/pw_async2_basic", "//third_party/pigweed/src/pw_async2_epoll", "//third_party/pigweed/src/pw_async_basic", "//third_party/pigweed/src/pw_base64", "//third_party/pigweed/src/pw_bloat", "//third_party/pigweed/src/pw_blob_store", "//third_party/pigweed/src/pw_bluetooth", "//third_party/pigweed/src/pw_bluetooth_hci", "//third_party/pigweed/src/pw_bluetooth_profiles", "//third_party/pigweed/src/pw_bluetooth_proxy", "//third_party/pigweed/src/pw_bluetooth_sapphire", "//third_party/pigweed/src/pw_boot", "//third_party/pigweed/src/pw_boot_cortex_m", "//third_party/pigweed/src/pw_build", "//third_party/pigweed/src/pw_build_android", "//third_party/pigweed/src/pw_build_info", "//third_party/pigweed/src/pw_build_mcuxpresso", "//third_party/pigweed/src/pw_bytes", "//third_party/pigweed/src/pw_channel", "//third_party/pigweed/src/pw_checksum", "//third_party/pigweed/src/pw_chre", "//third_party/pigweed/src/pw_chrono", "//third_party/pigweed/src/pw_chrono_embos", "//third_party/pigweed/src/pw_chrono_freertos", "//third_party/pigweed/src/pw_chrono_rp2040", "//third_party/pigweed/src/pw_chrono_stl", "//third_party/pigweed/src/pw_chrono_threadx", "//third_party/pigweed/src/pw_chrono_zephyr", "//third_party/pigweed/src/pw_cli", "//third_party/pigweed/src/pw_compilation_testing", "//third_party/pigweed/src/pw_config_loader", "//third_party/pigweed/src/pw_console", "//third_party/pigweed/src/pw_containers", "//third_party/pigweed/src/pw_cpu_exception", "//third_party/pigweed/src/pw_cpu_exception_cortex_m", "//third_party/pigweed/src/pw_cpu_exception_risc_v", "//third_party/pigweed/src/pw_crypto", "//third_party/pigweed/src/pw_digital_io", "//third_party/pigweed/src/pw_digital_io_linux", "//third_party/pigweed/src/pw_digital_io_mcuxpresso", "//third_party/pigweed/src/pw_digital_io_rp2040", "//third_party/pigweed/src/pw_dma_mcuxpresso", "//third_party/pigweed/src/pw_docgen", "//third_party/pigweed/src/pw_doctor", "//third_party/pigweed/src/pw_emu", "//third_party/pigweed/src/pw_env_setup", "//third_party/pigweed/src/pw_env_setup_zephyr", "//third_party/pigweed/src/pw_file", "//third_party/pigweed/src/pw_format", "//third_party/pigweed/src/pw_function", "//third_party/pigweed/src/pw_fuzzer", "//third_party/pigweed/src/pw_grpc", "//third_party/pigweed/src/pw_hdlc", "//third_party/pigweed/src/pw_hex_dump", "//third_party/pigweed/src/pw_i2c", "//third_party/pigweed/src/pw_i2c_linux", "//third_party/pigweed/src/pw_i2c_mcuxpresso", "//third_party/pigweed/src/pw_i2c_rp2040", "//third_party/pigweed/src/pw_ide", "//third_party/pigweed/src/pw_interrupt", "//third_party/pigweed/src/pw_interrupt_cortex_m", "//third_party/pigweed/src/pw_interrupt_xtensa", "//third_party/pigweed/src/pw_interrupt_zephyr", "//third_party/pigweed/src/pw_intrusive_ptr", "//third_party/pigweed/src/pw_json", "//third_party/pigweed/src/pw_kvs", "//third_party/pigweed/src/pw_libc", "//third_party/pigweed/src/pw_libcxx", "//third_party/pigweed/src/pw_log", "//third_party/pigweed/src/pw_log_android", "//third_party/pigweed/src/pw_log_basic", "//third_party/pigweed/src/pw_log_null", "//third_party/pigweed/src/pw_log_rpc", "//third_party/pigweed/src/pw_log_string", "//third_party/pigweed/src/pw_log_tokenized", "//third_party/pigweed/src/pw_log_zephyr", "//third_party/pigweed/src/pw_malloc", "//third_party/pigweed/src/pw_malloc_freelist", "//third_party/pigweed/src/pw_malloc_freertos", "//third_party/pigweed/src/pw_metric", "//third_party/pigweed/src/pw_minimal_cpp_stdlib", "//third_party/pigweed/src/pw_module", "//third_party/pigweed/src/pw_multibuf", "//third_party/pigweed/src/pw_multisink", "//third_party/pigweed/src/pw_package", "//third_party/pigweed/src/pw_perf_test", "//third_party/pigweed/src/pw_persistent_ram", "//third_party/pigweed/src/pw_polyfill", "//third_party/pigweed/src/pw_preprocessor", "//third_party/pigweed/src/pw_presubmit", "//third_party/pigweed/src/pw_protobuf", "//third_party/pigweed/src/pw_protobuf_compiler", "//third_party/pigweed/src/pw_random", "//third_party/pigweed/src/pw_result", "//third_party/pigweed/src/pw_ring_buffer", "//third_party/pigweed/src/pw_router", "//third_party/pigweed/src/pw_rpc", "//third_party/pigweed/src/pw_rpc_transport", "//third_party/pigweed/src/pw_rust", "//third_party/pigweed/src/pw_sensor", "//third_party/pigweed/src/pw_snapshot", "//third_party/pigweed/src/pw_software_update", "//third_party/pigweed/src/pw_span", "//third_party/pigweed/src/pw_spi", "//third_party/pigweed/src/pw_spi_linux", "//third_party/pigweed/src/pw_spi_mcuxpresso", "//third_party/pigweed/src/pw_spi_rp2040", "//third_party/pigweed/src/pw_status", "//third_party/pigweed/src/pw_stm32cube_build", "//third_party/pigweed/src/pw_stream", "//third_party/pigweed/src/pw_stream_shmem_mcuxpresso", "//third_party/pigweed/src/pw_stream_uart_linux", "//third_party/pigweed/src/pw_stream_uart_mcuxpresso", "//third_party/pigweed/src/pw_string", "//third_party/pigweed/src/pw_symbolizer", "//third_party/pigweed/src/pw_sync", "//third_party/pigweed/src/pw_sync_baremetal", "//third_party/pigweed/src/pw_sync_embos", "//third_party/pigweed/src/pw_sync_freertos", "//third_party/pigweed/src/pw_sync_stl", "//third_party/pigweed/src/pw_sync_threadx", "//third_party/pigweed/src/pw_sync_zephyr", "//third_party/pigweed/src/pw_sys_io", "//third_party/pigweed/src/pw_sys_io_ambiq_sdk", "//third_party/pigweed/src/pw_sys_io_arduino", "//third_party/pigweed/src/pw_sys_io_baremetal_lm3s6965evb", "//third_party/pigweed/src/pw_sys_io_baremetal_stm32f429", "//third_party/pigweed/src/pw_sys_io_emcraft_sf2", "//third_party/pigweed/src/pw_sys_io_mcuxpresso", "//third_party/pigweed/src/pw_sys_io_rp2040", "//third_party/pigweed/src/pw_sys_io_stdio", "//third_party/pigweed/src/pw_sys_io_stm32cube", "//third_party/pigweed/src/pw_sys_io_zephyr", "//third_party/pigweed/src/pw_system", "//third_party/pigweed/src/pw_target_runner", "//third_party/pigweed/src/pw_thread", "//third_party/pigweed/src/pw_thread_embos", "//third_party/pigweed/src/pw_thread_freertos", "//third_party/pigweed/src/pw_thread_stl", "//third_party/pigweed/src/pw_thread_threadx", "//third_party/pigweed/src/pw_thread_zephyr", "//third_party/pigweed/src/pw_tls_client", "//third_party/pigweed/src/pw_tls_client_boringssl", "//third_party/pigweed/src/pw_tls_client_mbedtls", "//third_party/pigweed/src/pw_tokenizer", "//third_party/pigweed/src/pw_toolchain", "//third_party/pigweed/src/pw_toolchain_bazel", "//third_party/pigweed/src/pw_trace", "//third_party/pigweed/src/pw_trace_tokenized", "//third_party/pigweed/src/pw_transfer", "//third_party/pigweed/src/pw_uart", "//third_party/pigweed/src/pw_unit_test", "//third_party/pigweed/src/pw_unit_test_zephyr", "//third_party/pigweed/src/pw_varint", "//third_party/pigweed/src/pw_watch", "//third_party/pigweed/src/pw_web", "//third_party/pigweed/src/pw_work_queue"]`
 
-From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:220
+From //third_party/pigweed/src/pw_build/generated_pigweed_modules_lists.gni:221
 
 ### pw_preprocessor_CONFIG
 
diff --git a/docs/reference/hardware/_drivers_epitaphs.yaml b/docs/reference/hardware/_drivers_epitaphs.yaml
index e57a421..f180509 100644
--- a/docs/reference/hardware/_drivers_epitaphs.yaml
+++ b/docs/reference/hardware/_drivers_epitaphs.yaml
@@ -626,3 +626,15 @@
   available_in_git: 'd60145af7b3e75ada3b25eb4c24d49bd9636c19f'
   areas: ['Serial']
   path: '/src/devices/serial/drivers/serial-async'
+- short_description: 'Intel HD Audio ELD (EDID-like data) support in the display coordinator driver'
+  deletion_reason: 'HD Audio on HDMI is not actively used or tested on Intel NUC devices. Current implementation blocks display driver migration to DFv2'
+  gerrit_change_id: '1046392'
+  available_in_git: 'dd7557d95161c1e30014d441ce2df679eb1814f0'
+  areas: ['Display', 'Audio']
+  path: 'src/graphics/display/drivers/coordinator/eld.cc'
+- short_description: 'Intel HD Audio ELD (EDID-like data) setup on intel-i915 driver'
+  deletion_reason: 'HD Audio on HDMI is not actively used or tested on Intel NUC devices. Current implementation blocks display driver migration to DFv2'
+  gerrit_change_id: '1046393'
+  available_in_git: 'dd7557d95161c1e30014d441ce2df679eb1814f0'
+  areas: ['Display', 'Audio']
+  path: 'src/graphics/display/drivers/intel-i915/intel-i915.cc'
diff --git a/sdk/banjo/fuchsia.hardware.display.controller/display-controller.fidl b/sdk/banjo/fuchsia.hardware.display.controller/display-controller.fidl
index bd11ac3..73b3129 100644
--- a/sdk/banjo/fuchsia.hardware.display.controller/display-controller.fidl
+++ b/sdk/banjo/fuchsia.hardware.display.controller/display-controller.fidl
@@ -505,19 +505,6 @@
         config_stamp ConfigStamp;
     }) -> ();
 
-    /// Set ELD for one display.
-    ///
-    /// This method is called independently from the CheckConfiguration and ApplyConfiguration
-    /// methods. The display_id may be unconfigured at the time this method is called.
-    /// raw_eld is the ELD raw data formatted according to the HDA specification version 1.0a
-    /// section 7.3.3.34.1.
-    /// https://www.intel.com/content/dam/www/public/us/en/documents/product-specifications/high-definition-audio-specification.pdf
-    /// The driver must not retain references to the ELD after this function returns.
-    strict SetEld(struct {
-        display_id uint64;
-        raw_eld vector<uint8>:MAX;
-    }) -> ();
-
     /// Conveys the display hardware's limitations on image buffers to sysmem.
     ///
     /// The sysmem BufferCollection imported with `collection_id` will receive
diff --git a/sdk/banjo/fuchsia.hardware.scpi/BUILD.gn b/sdk/banjo/fuchsia.hardware.scpi/BUILD.gn
deleted file mode 100644
index c23e0e3..0000000
--- a/sdk/banjo/fuchsia.hardware.scpi/BUILD.gn
+++ /dev/null
@@ -1,11 +0,0 @@
-# Copyright 2019 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/fidl/fidl.gni")
-
-fidl("fuchsia.hardware.scpi") {
-  sources = [ "scpi.fidl" ]
-  public_deps = [ "//zircon/vdso/zx" ]
-  enable_banjo = true
-}
diff --git a/sdk/banjo/fuchsia.hardware.scpi/scpi.fidl b/sdk/banjo/fuchsia.hardware.scpi/scpi.fidl
deleted file mode 100644
index 1b0161a..0000000
--- a/sdk/banjo/fuchsia.hardware.scpi/scpi.fidl
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-library fuchsia.hardware.scpi;
-
-using zx;
-
-const MAX_DVFS_OPPS uint32 = 16;
-
-type ScpiOppEntry = struct {
-    /// The operating point frequency in Hz.
-    freq_hz uint32;
-    /// The operating point voltage in microvolts.
-    volt_uv uint32;
-};
-
-type ScpiOpp = struct {
-    /// The device's operating points.
-    opp array<ScpiOppEntry, MAX_DVFS_OPPS>;
-    /// In microseconds.
-    latency uint32;
-    /// The number of operating points in opp.
-    count uint32;
-};
-
-@transport("Banjo")
-@banjo_layout("ddk-protocol")
-closed protocol Scpi {
-    strict GetSensor(struct {
-        name string:MAX;
-    }) -> (struct {
-        s zx.Status;
-        sensor_id uint32;
-    });
-    strict GetSensorValue(struct {
-        sensor_id uint32;
-    }) -> (struct {
-        s zx.Status;
-        sensor_value uint32;
-    });
-    strict GetDvfsInfo(struct {
-        power_domain uint8;
-    }) -> (struct {
-        s zx.Status;
-        opps ScpiOpp;
-    });
-    strict GetDvfsIdx(struct {
-        power_domain uint8;
-    }) -> (struct {
-        s zx.Status;
-        index uint16;
-    });
-    strict SetDvfsIdx(struct {
-        power_domain uint8;
-        index uint16;
-    }) -> (struct {
-        s zx.Status;
-    });
-};
diff --git a/sdk/fidl/fuchsia.hardware.display.engine/engine.fidl b/sdk/fidl/fuchsia.hardware.display.engine/engine.fidl
index 27c39f9..4b8d81d 100644
--- a/sdk/fidl/fuchsia.hardware.display.engine/engine.fidl
+++ b/sdk/fidl/fuchsia.hardware.display.engine/engine.fidl
@@ -215,18 +215,6 @@
         config_stamp fuchsia.hardware.display.types.ConfigStamp;
     }) -> ();
 
-    /// Set ELD (EDID Like Data, audio info in EDID) for one display.
-    ///
-    /// This method is called independently from the CheckConfiguration and
-    /// ApplyConfiguration methods. The display_id may be unconfigured at the
-    /// time this method is called. raw_eld is the ELD raw data formatted
-    /// according to the HDA specification version 1.0a section 7.3.3.34.1.
-    /// https://www.intel.com/content/dam/www/public/us/en/documents/product-specifications/high-definition-audio-specification.pdf
-    flexible SetEld(struct {
-        display_id uint64;
-        raw_eld vector<uint8>:MAX;
-    }) -> ();
-
     /// Set sysmem buffer collection contraints needed to ensure an image can be
     /// imported with `config` on the imported BufferCollecition with
     /// `collection_id`.
diff --git a/src/connectivity/network/netstack3/core/BUILD.gn b/src/connectivity/network/netstack3/core/BUILD.gn
index 95be012..602c8cf 100644
--- a/src/connectivity/network/netstack3/core/BUILD.gn
+++ b/src/connectivity/network/netstack3/core/BUILD.gn
@@ -33,8 +33,6 @@
   }
   configs -= [ "//build/config/rust/lints:allow_unused_results" ]
   sources = [
-    "src/algorithm.rs",
-    "src/algorithm/port_alloc.rs",
     "src/api.rs",
     "src/benchmarks.rs",
     "src/context.rs",
@@ -71,6 +69,7 @@
     "src/ip/device/integration.rs",
     "src/ip/device/nud.rs",
     "src/ip/device/nud/api.rs",
+    "src/ip/device/opaque_iid.rs",
     "src/ip/device/route_discovery.rs",
     "src/ip/device/router_solicitation.rs",
     "src/ip/device/slaac.rs",
diff --git a/src/connectivity/network/netstack3/core/base/BUILD.gn b/src/connectivity/network/netstack3/core/base/BUILD.gn
index 53dfd50..7a13f82 100644
--- a/src/connectivity/network/netstack3/core/base/BUILD.gn
+++ b/src/connectivity/network/netstack3/core/base/BUILD.gn
@@ -21,6 +21,7 @@
     "src/frame.rs",
     "src/inspect.rs",
     "src/lib.rs",
+    "src/port_alloc.rs",
     "src/resource_references.rs",
     "src/rng.rs",
     "src/testutil/addr.rs",
diff --git a/src/connectivity/network/netstack3/core/base/src/lib.rs b/src/connectivity/network/netstack3/core/base/src/lib.rs
index 21cc978..30e767c 100644
--- a/src/connectivity/network/netstack3/core/base/src/lib.rs
+++ b/src/connectivity/network/netstack3/core/base/src/lib.rs
@@ -21,6 +21,7 @@
 mod event;
 mod frame;
 mod inspect;
+mod port_alloc;
 mod resource_references;
 mod rng;
 mod time;
@@ -38,6 +39,7 @@
 pub use event::{CoreEventContext, EventContext};
 pub use frame::{ReceivableFrameMeta, RecvFrameContext, SendFrameContext, SendableFrameMeta};
 pub use inspect::{Inspectable, InspectableValue, Inspector, InspectorDeviceExt};
+pub use port_alloc::{simple_randomized_port_alloc, EphemeralPort, PortAllocImpl};
 pub use resource_references::{
     DeferredResourceRemovalContext, ReferenceNotifiers, RemoveResourceResult,
     RemoveResourceResultWithContext,
diff --git a/src/connectivity/network/netstack3/core/src/algorithm/port_alloc.rs b/src/connectivity/network/netstack3/core/base/src/port_alloc.rs
similarity index 83%
rename from src/connectivity/network/netstack3/core/src/algorithm/port_alloc.rs
rename to src/connectivity/network/netstack3/core/base/src/port_alloc.rs
index a52ec5c..9901b1c 100644
--- a/src/connectivity/network/netstack3/core/src/algorithm/port_alloc.rs
+++ b/src/connectivity/network/netstack3/core/base/src/port_alloc.rs
@@ -12,50 +12,16 @@
 use rand::RngCore;
 
 /// A port number.
-// NOTE(brunodalbo): `PortNumber` could be a trait, but given the expected use
-// of the PortAlloc algorithm is to allocate `u16` ports, it's just defined as a
-// type alias for simplicity.
-pub(crate) type PortNumber = u16;
-
-/// A common implementation of `HashableId` providing usual 3-tuple flow
-/// identifiers.
-///
-/// `ProtocolFlowId` provides the most common 3-tuple needed to be used when
-/// allocating ports: local IP, remote IP, and remote port number.
-#[derive(Hash, Debug)]
-pub(crate) struct ProtocolFlowId<A, P> {
-    local_addr: A,
-    remote_addr: A,
-    remote_port: P,
-}
-
-impl<A, P> ProtocolFlowId<A, P> {
-    /// Creates a new `ProtocolFlowId` with given parameters.
-    pub(crate) fn new(local_addr: A, remote_addr: A, remote_port: P) -> Self {
-        Self { local_addr, remote_addr, remote_port }
-    }
-
-    /// Gets this `ProtocolFlowId`'s local address.
-    pub(crate) fn local_addr(&self) -> &A {
-        &self.local_addr
-    }
-
-    /// Gets this `ProtocolFlowId`'s remote address.
-    pub(crate) fn remote_addr(&self) -> &A {
-        &self.remote_addr
-    }
-
-    /// Gets this `ProtocolFlowId`'s remote port number.
-    pub(crate) fn remote_port(&self) -> &P {
-        &self.remote_port
-    }
-}
+// NB: `PortNumber` could be a trait, but given the expected use of the
+// PortAlloc algorithm is to allocate `u16` ports, it's just defined as a type
+// alias for simplicity.
+type PortNumber = u16;
 
 /// Trait that configures the behavior of port allocation.
 ///
 /// `PortAllocImpl` provides the types, custom behaviors, and port availability
 /// checks necessary to operate the port allocation algorithm.
-pub(crate) trait PortAllocImpl {
+pub trait PortAllocImpl {
     /// The range of ports that can be allocated.
     ///
     /// Local ports used in transport protocols are called [Ephemeral Ports].
@@ -103,14 +69,14 @@
 ///
 /// `EphemeralPort` is always guaranteed to contain a port that is within
 /// `I::EPHEMERAL_RANGE`.
-pub(crate) struct EphemeralPort<I: PortAllocImpl + ?Sized> {
+pub struct EphemeralPort<I: PortAllocImpl + ?Sized> {
     port: PortNumber,
     _marker: PhantomData<I>,
 }
 
 impl<I: PortAllocImpl + ?Sized> EphemeralPort<I> {
     /// Creates a new `EphemeralPort` with a port chosen randomly in `range`.
-    pub(crate) fn new_random<R: RngCore>(rng: &mut R) -> Self {
+    pub fn new_random<R: RngCore>(rng: &mut R) -> Self {
         let num_ephemeral = u32::from(I::EPHEMERAL_RANGE.end() - I::EPHEMERAL_RANGE.start()) + 1;
         let port = I::EPHEMERAL_RANGE.start() + ((rng.next_u32() % num_ephemeral) as PortNumber);
         Self { port, _marker: PhantomData }
@@ -118,7 +84,7 @@
 
     /// Increments the current [`PortNumber`] to the next value in the contained
     /// range, wrapping around to the start of the range.
-    pub(crate) fn next(&mut self) {
+    pub fn next(&mut self) {
         if self.port == *I::EPHEMERAL_RANGE.end() {
             self.port = *I::EPHEMERAL_RANGE.start();
         } else {
@@ -127,7 +93,7 @@
     }
 
     /// Gets the `PortNumber` value.
-    pub(crate) fn get(&self) -> PortNumber {
+    pub fn get(&self) -> PortNumber {
         self.port
     }
 }
@@ -135,7 +101,7 @@
 /// Implements the [algorithm 1] as described in RFC 6056.
 ///
 /// [algorithm 1]: https://datatracker.ietf.org/doc/html/rfc6056#section-3.3.1
-pub(crate) fn simple_randomized_port_alloc<I: PortAllocImpl + ?Sized, R: RngCore>(
+pub fn simple_randomized_port_alloc<I: PortAllocImpl + ?Sized, R: RngCore>(
     rng: &mut R,
     id: &I::Id,
     state: &I,
diff --git a/src/connectivity/network/netstack3/core/lock-order/src/lock.rs b/src/connectivity/network/netstack3/core/lock-order/src/lock.rs
index fc81652..5afcbb9 100644
--- a/src/connectivity/network/netstack3/core/lock-order/src/lock.rs
+++ b/src/connectivity/network/netstack3/core/lock-order/src/lock.rs
@@ -71,6 +71,140 @@
     fn access(&self) -> Self::Guard<'_>;
 }
 
+/// Marks a type as offering ordered lock access for some inner type `T`.
+///
+/// This trait allows for types that are lock order sensitive to be defined in a
+/// separate crate than the lock levels themselves while nudging local code away
+/// from using the locks without regards for ordering.
+///
+/// The crate defining the lock levels can implement [`LockLevelFor`] to declare
+/// the lock level to access the field exposed by this implementation.
+pub trait OrderedLockAccess<T> {
+    /// The lock type that observes ordering.
+    ///
+    /// This should be a type that implements either [`ExclusiveLock`] or
+    /// [`ReadWriteLock`].
+    type Lock;
+    /// Returns a borrow to the order-aware lock.
+    ///
+    /// Note that this returns [`OrderedLockRef`] to further prevent out of
+    /// order lock usage. Once sealed into [`OrderedLockRef`], the borrow can
+    /// only be used via the blanket [`RwLockFor`] and [`LockFor`]
+    /// implementations provided by this crate.
+    fn ordered_lock_access(&self) -> OrderedLockRef<'_, Self::Lock>;
+}
+
+/// A borrowed order-aware lock.
+pub struct OrderedLockRef<'a, T>(&'a T);
+
+impl<'a, T> OrderedLockRef<'a, T> {
+    /// Creates a new `OrderedLockRef` with a borrow on `lock`.
+    pub fn new(lock: &'a T) -> Self {
+        Self(lock)
+    }
+}
+
+/// Declares a type as the lock level for some type `T` that exposes locked
+/// state of type `Self::Data`.
+///
+/// If `T` implements [`OrderedLockAccess`] for `Self::Data`, then the
+/// [`LockFor`] and [`RwLockFor`] traits can be used to gain access to the
+/// protected state `Data` within `T` at lock level `Self`.
+///
+/// See [`OrderedLockAccess`] for more details.
+pub trait LockLevelFor<T> {
+    /// The data type within `T` that this is a lock level for.
+    type Data;
+}
+
+/// Abstracts an exclusive lock (i.e. a Mutex).
+pub trait ExclusiveLock<T>: 'static {
+    /// The guard type returned when locking the lock.
+    type Guard<'l>: DerefMut<Target = T>;
+    /// Locks this lock.
+    fn lock(&self) -> Self::Guard<'_>;
+}
+
+/// Abstracts a read write lock (i.e. an RwLock).
+pub trait ReadWriteLock<T>: 'static {
+    /// The guard type returned when locking for reads (i.e. shared).
+    type ReadGuard<'l>: Deref<Target = T>;
+    /// The guard type returned when locking for writes (i.e. exclusive).
+    type WriteGuard<'l>: DerefMut<Target = T>;
+    /// Locks this lock for reading.
+    fn read_lock(&self) -> Self::ReadGuard<'_>;
+    /// Locks this lock for writing.
+    fn write_lock(&self) -> Self::WriteGuard<'_>;
+}
+
+impl<L, T> LockFor<L> for T
+where
+    L: LockLevelFor<T>,
+    T: OrderedLockAccess<L::Data>,
+    T::Lock: ExclusiveLock<L::Data>,
+{
+    type Data = L::Data;
+    type Guard<'l> = <T::Lock as ExclusiveLock<L::Data>>::Guard<'l>
+    where
+        Self: 'l;
+    fn lock(&self) -> Self::Guard<'_> {
+        let OrderedLockRef(lock) = self.ordered_lock_access();
+        lock.lock()
+    }
+}
+
+impl<L, T> RwLockFor<L> for T
+where
+    L: LockLevelFor<T>,
+    T: OrderedLockAccess<L::Data>,
+    T::Lock: ReadWriteLock<L::Data>,
+{
+    type Data = L::Data;
+    type ReadGuard<'l> = <T::Lock as ReadWriteLock<L::Data>>::ReadGuard<'l>
+    where
+        Self: 'l;
+    type WriteGuard<'l> = <T::Lock as ReadWriteLock<L::Data>>::WriteGuard<'l>
+    where
+        Self: 'l;
+    fn read_lock(&self) -> Self::ReadGuard<'_> {
+        let OrderedLockRef(lock) = self.ordered_lock_access();
+        lock.read_lock()
+    }
+    fn write_lock(&self) -> Self::WriteGuard<'_> {
+        let OrderedLockRef(lock) = self.ordered_lock_access();
+        lock.write_lock()
+    }
+}
+
+/// Declares a type that is an [`UnlockedAccess`] marker for some field `Data`
+/// within `T`.
+///
+/// This is the equivalent of [`LockLevelFor`] for [`UnlockedAccess`], but given
+/// unlocked access is freely available through borrows the foreign type can
+/// safely expose a getter.
+pub trait UnlockedAccessMarkerFor<T> {
+    /// The data type within `T` that this an unlocked access marker for.
+    type Data: 'static;
+
+    /// Retrieves `Self::Data` from `T`.
+    fn unlocked_access(t: &T) -> &Self::Data;
+}
+
+impl<L, T> UnlockedAccess<L> for T
+where
+    L: UnlockedAccessMarkerFor<T>,
+{
+    type Data = <L as UnlockedAccessMarkerFor<T>>::Data;
+
+    type Guard<'l> = &'l <L as UnlockedAccessMarkerFor<T>>::Data
+    where
+        Self: 'l;
+
+    fn access(&self) -> Self::Guard<'_> {
+        L::unlocked_access(self)
+    }
+}
+
 #[cfg(test)]
 mod example {
     //! Example implementations of the traits in this crate.
diff --git a/src/connectivity/network/netstack3/core/src/device/ndp.rs b/src/connectivity/network/netstack3/core/src/device/ndp.rs
index b873fbe..41d8c92 100644
--- a/src/connectivity/network/netstack3/core/src/device/ndp.rs
+++ b/src/connectivity/network/netstack3/core/src/device/ndp.rs
@@ -141,7 +141,6 @@
     use zerocopy::ByteSlice;
 
     use crate::{
-        algorithm::{OpaqueIid, OpaqueIidNonce, StableIidSecret},
         context::{
             testutil::{FakeInstant, FakeNetwork, FakeNetworkLinks, StepResult},
             InstantContext as _, RngContext as _,
@@ -159,6 +158,7 @@
                     Ipv6DeviceConfigurationUpdate,
                 },
                 get_ipv6_hop_limit,
+                opaque_iid::{OpaqueIid, OpaqueIidNonce, StableIidSecret},
                 router_solicitation::{MAX_RTR_SOLICITATION_DELAY, RTR_SOLICITATION_INTERVAL},
                 slaac::{
                     self, InnerSlaacTimerId, SlaacBindingsContext, SlaacConfiguration,
diff --git a/src/connectivity/network/netstack3/core/src/ip/device.rs b/src/connectivity/network/netstack3/core/src/ip/device.rs
index c166fd9..f667088 100644
--- a/src/connectivity/network/netstack3/core/src/ip/device.rs
+++ b/src/connectivity/network/netstack3/core/src/ip/device.rs
@@ -9,6 +9,7 @@
 pub(crate) mod dad;
 pub(crate) mod integration;
 pub(crate) mod nud;
+pub(crate) mod opaque_iid;
 pub(crate) mod route_discovery;
 pub(crate) mod router_solicitation;
 pub(crate) mod slaac;
diff --git a/src/connectivity/network/netstack3/core/src/algorithm.rs b/src/connectivity/network/netstack3/core/src/ip/device/opaque_iid.rs
similarity index 98%
rename from src/connectivity/network/netstack3/core/src/algorithm.rs
rename to src/connectivity/network/netstack3/core/src/ip/device/opaque_iid.rs
index 4c200bf..319d456 100644
--- a/src/connectivity/network/netstack3/core/src/algorithm.rs
+++ b/src/connectivity/network/netstack3/core/src/ip/device/opaque_iid.rs
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-//! Common algorithms.
+//! Opaque interface identifier (IID) used in SLAAC.
 
 use core::fmt::{self, Debug};
 
@@ -10,10 +10,6 @@
 use net_types::ip::{Ipv6Addr, Subnet};
 use rand::RngCore;
 
-mod port_alloc;
-
-pub(crate) use port_alloc::*;
-
 /// The length in bytes of the `secret_key` argument to
 /// [`generate_opaque_interface_identifier`].
 const STABLE_IID_SECRET_KEY_BYTES: usize = 32;
diff --git a/src/connectivity/network/netstack3/core/src/ip/device/slaac.rs b/src/connectivity/network/netstack3/core/src/ip/device/slaac.rs
index c167984..1524866 100644
--- a/src/connectivity/network/netstack3/core/src/ip/device/slaac.rs
+++ b/src/connectivity/network/netstack3/core/src/ip/device/slaac.rs
@@ -23,7 +23,6 @@
 use tracing::{debug, error, trace};
 
 use crate::{
-    algorithm::{OpaqueIid, OpaqueIidNonce, StableIidSecret},
     context::{
         CoreTimerContext, CounterContext, HandleableTimer, InstantBindingsTypes, InstantContext,
         RngContext, TimerBindingsTypes, TimerContext,
@@ -32,6 +31,7 @@
     device::{self, AnyDevice, DeviceIdContext, Id, WeakId as _},
     error::{ExistsError, NotFoundError},
     ip::device::{
+        opaque_iid::{OpaqueIid, OpaqueIidNonce, StableIidSecret},
         state::{Lifetime, SlaacConfig, TemporarySlaacConfig},
         AddressRemovedReason, Ipv6DeviceAddr,
     },
diff --git a/src/connectivity/network/netstack3/core/src/lib.rs b/src/connectivity/network/netstack3/core/src/lib.rs
index e3abcb5..ee229749 100644
--- a/src/connectivity/network/netstack3/core/src/lib.rs
+++ b/src/connectivity/network/netstack3/core/src/lib.rs
@@ -25,7 +25,6 @@
 // TODO(https://github.com/dtolnay/thiserror/pull/64): remove this module.
 extern crate fakestd as std;
 
-mod algorithm;
 mod api;
 mod context;
 mod counters;
@@ -42,6 +41,9 @@
 #[cfg(any(test, feature = "testutils"))]
 pub mod testutil;
 
+pub(crate) mod algorithm {
+    pub(crate) use netstack3_base::{simple_randomized_port_alloc, PortAllocImpl};
+}
 pub(crate) mod convert {
     pub(crate) use netstack3_base::{BidirectionalConverter, OwnedOrRefsBidirectionalConverter};
 }
@@ -162,7 +164,6 @@
     pub(crate) use base::*;
 
     // Re-exported types.
-    pub use crate::algorithm::StableIidSecret;
     pub use base::{IpLayerEvent, ResolveRouteError};
     pub use device::{
         api::{AddIpAddrSubnetError, AddrSubnetAndManualConfigEither, SetIpAddressPropertiesError},
@@ -170,6 +171,7 @@
             IpDeviceConfigurationUpdate, Ipv4DeviceConfigurationUpdate,
             Ipv6DeviceConfigurationUpdate, UpdateIpConfigurationError,
         },
+        opaque_iid::StableIidSecret,
         slaac::{SlaacConfiguration, TemporarySlaacAddressConfiguration},
         state::{
             IpDeviceConfiguration, Ipv4AddrConfig, Ipv4DeviceConfigurationAndFlags,
diff --git a/src/connectivity/network/netstack3/core/src/socket/datagram.rs b/src/connectivity/network/netstack3/core/src/socket/datagram.rs
index c27bee2a..1afd165 100644
--- a/src/connectivity/network/netstack3/core/src/socket/datagram.rs
+++ b/src/connectivity/network/netstack3/core/src/socket/datagram.rs
@@ -29,7 +29,6 @@
 use thiserror::Error;
 
 use crate::{
-    algorithm::ProtocolFlowId,
     context::{ReferenceNotifiers, RngContext},
     convert::{BidirectionalConverter, OwnedOrRefsBidirectionalConverter},
     device::{self, AnyDevice, DeviceIdContext, StrongId as _, WeakId as _},
@@ -600,14 +599,12 @@
 
 impl<A: IpAddress, D: crate::device::Id, LI, RI: Copy> ConnAddr<ConnIpAddr<A, LI, RI>, D> {
     pub(crate) fn from_protocol_flow_and_local_port(
-        id: &ProtocolFlowId<SocketIpAddr<A>, RI>,
+        id: &DatagramFlowId<A, RI>,
         local_port: LI,
     ) -> Self {
+        let DatagramFlowId { local_ip, remote_ip, remote_id } = id;
         Self {
-            ip: ConnIpAddr {
-                local: (*id.local_addr(), local_port),
-                remote: (*id.remote_addr(), *id.remote_port()),
-            },
+            ip: ConnIpAddr { local: (*local_ip, local_port), remote: (*remote_ip, *remote_id) },
             device: None,
         }
     }
diff --git a/src/connectivity/network/netstack3/core/src/transport/integration.rs b/src/connectivity/network/netstack3/core/src/transport/integration.rs
index 3e778cd..2f161da 100644
--- a/src/connectivity/network/netstack3/core/src/transport/integration.rs
+++ b/src/connectivity/network/netstack3/core/src/transport/integration.rs
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 use lock_order::{
-    lock::{RwLockFor, UnlockedAccess},
+    lock::{LockLevelFor, RwLockFor, UnlockedAccess},
     relation::LockBefore,
     wrap::prelude::*,
 };
@@ -583,6 +583,12 @@
     }
 }
 
+impl<I: crate::transport::tcp::socket::DualStackIpExt, D: device::WeakId, BT: BindingsTypes>
+    LockLevelFor<TcpSocketId<I, D, BT>> for crate::lock_ordering::TcpSocketState<I>
+{
+    type Data = TcpSocketState<I, D, BT>;
+}
+
 impl<I: crate::transport::tcp::socket::DualStackIpExt, BC: BindingsContext>
     UnlockedAccess<crate::lock_ordering::TcpIsnGenerator<I>> for StackState<BC>
 {
diff --git a/src/connectivity/network/netstack3/core/src/transport/tcp/socket.rs b/src/connectivity/network/netstack3/core/src/transport/tcp/socket.rs
index 71ede9f..1d0af87 100644
--- a/src/connectivity/network/netstack3/core/src/transport/tcp/socket.rs
+++ b/src/connectivity/network/netstack3/core/src/transport/tcp/socket.rs
@@ -32,6 +32,7 @@
 
 use assert_matches::assert_matches;
 use derivative::Derivative;
+use lock_order::lock::{OrderedLockAccess, OrderedLockRef};
 use net_types::{
     ip::{
         GenericOverIp, Ip, IpAddr, IpAddress, IpInvariant, IpVersion, IpVersionMarker, Ipv4,
@@ -1555,10 +1556,15 @@
     }
 }
 
+struct TcpDualStackPortAlloc<'a, I: DualStackIpExt, D: device::WeakId, BT: TcpBindingsTypes>(
+    &'a BoundSocketMap<I, D, BT>,
+    &'a BoundSocketMap<I::OtherVersion, D, BT>,
+);
+
 /// When binding to IPv6 ANY address (::), we need to allocate a port that is
 /// available in both stacks.
 impl<'a, I: DualStackIpExt, D: device::WeakId, BT: TcpBindingsTypes> PortAllocImpl
-    for (&'a BoundSocketMap<I, D, BT>, &'a BoundSocketMap<I::OtherVersion, D, BT>)
+    for TcpDualStackPortAlloc<'a, I, D, BT>
 {
     const EPHEMERAL_RANGE: RangeInclusive<u16> =
         <BoundSocketMap<I, D, BT> as PortAllocImpl>::EPHEMERAL_RANGE;
@@ -1566,7 +1572,7 @@
     type PortAvailableArg = ();
 
     fn is_port_available(&self, (): &Self::Id, port: u16, (): &Self::PortAvailableArg) -> bool {
-        let (this, other) = self;
+        let Self(this, other) = self;
         this.is_port_available(&None, port, &None) && other.is_port_available(&None, port, &None)
     }
 }
@@ -1793,25 +1799,12 @@
 }
 
 impl<I: DualStackIpExt, D: device::WeakId, BT: TcpBindingsTypes>
-    lock_order::lock::RwLockFor<crate::lock_ordering::TcpSocketState<I>> for TcpSocketId<I, D, BT>
+    OrderedLockAccess<TcpSocketState<I, D, BT>> for TcpSocketId<I, D, BT>
 {
-    type Data = TcpSocketState<I, D, BT>;
-
-    type ReadGuard<'l> = crate::sync::RwLockReadGuard<'l, Self::Data>
-        where
-            Self: 'l ;
-    type WriteGuard<'l> = crate::sync::RwLockWriteGuard<'l, Self::Data>
-        where
-            Self: 'l ;
-
-    fn read_lock(&self) -> Self::ReadGuard<'_> {
-        let Self(l) = self;
-        l.read()
-    }
-
-    fn write_lock(&self) -> Self::WriteGuard<'_> {
-        let Self(l) = self;
-        l.write()
+    type Lock = RwLock<TcpSocketState<I, D, BT>>;
+    fn ordered_lock_access(&self) -> OrderedLockRef<'_, Self::Lock> {
+        let Self(rc) = self;
+        OrderedLockRef::new(&*rc)
     }
 }
 
@@ -2228,12 +2221,16 @@
                                     // stacks before `bind_inner` tries to make
                                     // a decision, because it might give two
                                     // unrelated ports which is undesired.
+                                    let port_alloc = TcpDualStackPortAlloc(
+                                        &demux.socketmap,
+                                        &other_demux.socketmap
+                                    );
                                     let port = match port {
                                         Some(port) => port,
                                         None => match algorithm::simple_randomized_port_alloc(
                                             &mut bindings_ctx.rng(),
                                             &(),
-                                            &(&demux.socketmap, &other_demux.socketmap),
+                                            &port_alloc,
                                             &(),
                                         ){
                                             Some(port) => NonZeroU16::new(port)
diff --git a/src/connectivity/network/netstack3/core/src/transport/udp.rs b/src/connectivity/network/netstack3/core/src/transport/udp.rs
index 157aeca..0d5267c 100644
--- a/src/connectivity/network/netstack3/core/src/transport/udp.rs
+++ b/src/connectivity/network/netstack3/core/src/transport/udp.rs
@@ -33,7 +33,7 @@
 use tracing::{debug, trace};
 
 use crate::{
-    algorithm::{self, PortAllocImpl, ProtocolFlowId},
+    algorithm::{self, PortAllocImpl},
     context::{
         ContextPair, CounterContext, InstantContext, ReferenceNotifiers, RngContext, TracingContext,
     },
@@ -67,7 +67,7 @@
             SocketInfo, SocketState as DatagramSocketState, WrapOtherStackIpOptions,
             WrapOtherStackIpOptionsMut,
         },
-        AddrVec, Bound, IncompatibleError, InsertError, ListenerAddrInfo, MaybeDualStack,
+        AddrVec, Bound, IncompatibleError, InsertError, Inserter, ListenerAddrInfo, MaybeDualStack,
         NotDualStackCapableError, RemoveResult, SetDualStackEnabledError, ShutdownType,
         SocketAddrType, SocketMapAddrSpec, SocketMapAddrStateSpec, SocketMapConflictPolicy,
         SocketMapStateSpec,
@@ -624,10 +624,8 @@
         bindings_ctx: &mut BC,
         flow: datagram::DatagramFlowId<I::Addr, UdpRemotePort>,
     ) -> Option<NonZeroU16> {
-        let DatagramFlowId { local_ip, remote_ip, remote_id } = flow;
-        let id = ProtocolFlowId::new(local_ip, remote_ip, remote_id);
         let mut rng = bindings_ctx.rng();
-        algorithm::simple_randomized_port_alloc(&mut rng, &id, bound, &())
+        algorithm::simple_randomized_port_alloc(&mut rng, &flow, bound, &())
             .map(|p| NonZeroU16::new(p).expect("ephemeral ports should be non-zero"))
     }
 }
@@ -659,9 +657,24 @@
 }
 
 #[derive(Debug, Eq, PartialEq)]
+pub struct LoadBalancedEntry<T> {
+    id: T,
+    reuse_addr: bool,
+}
+
+#[derive(Debug, Eq, PartialEq)]
 pub enum AddrState<T> {
     Exclusive(T),
-    ReusePort(Vec<T>),
+    Shared {
+        // Entries with the SO_REUSEADDR flag. If this list is not empty then
+        // new packets are delivered the last socket in this list.
+        priority: Vec<T>,
+
+        // Entries with the SO_REUSEPORT flag. Some of them may have
+        // SO_REUSEADDR flag set as well. If `priority` list is empty then
+        // incoming packets are load-balanced between sockets in this list.
+        load_balanced: Vec<LoadBalancedEntry<T>>,
+    },
 }
 
 impl<'a, A: IpAddress, LI> From<&'a ListenerIpAddr<A, LI>> for SocketAddrType {
@@ -679,33 +692,17 @@
     }
 }
 
-#[derive(Copy, Clone, Debug, Eq, Hash, PartialEq)]
-pub enum Sharing {
-    Exclusive,
-    ReusePort,
-}
-
-impl Default for Sharing {
-    fn default() -> Self {
-        Self::Exclusive
-    }
+#[derive(Copy, Clone, Debug, Eq, Hash, PartialEq, Default)]
+pub struct Sharing {
+    reuse_addr: bool,
+    reuse_port: bool,
 }
 
 impl Sharing {
     pub(crate) fn is_shareable_with_new_state(&self, new_state: Sharing) -> bool {
-        match (self, new_state) {
-            (Sharing::Exclusive, Sharing::Exclusive) => false,
-            (Sharing::Exclusive, Sharing::ReusePort) => false,
-            (Sharing::ReusePort, Sharing::Exclusive) => false,
-            (Sharing::ReusePort, Sharing::ReusePort) => true,
-        }
-    }
-
-    pub(crate) fn is_reuse_port(&self) -> bool {
-        match self {
-            Sharing::Exclusive => false,
-            Sharing::ReusePort => true,
-        }
+        let Sharing { reuse_addr, reuse_port } = self;
+        let Sharing { reuse_addr: new_reuse_addr, reuse_port: new_reuse_port } = new_state;
+        (*reuse_addr && new_reuse_addr) || (*reuse_port && new_reuse_port)
     }
 }
 
@@ -730,8 +727,18 @@
 impl<T> ToSharingOptions for AddrState<T> {
     fn to_sharing_options(&self) -> Sharing {
         match self {
-            AddrState::Exclusive(_) => Sharing::Exclusive,
-            AddrState::ReusePort(_) => Sharing::ReusePort,
+            AddrState::Exclusive(_) => Sharing { reuse_addr: false, reuse_port: false },
+            AddrState::Shared { priority, load_balanced } => {
+                // All sockets in `priority` have `REUSE_ADDR` flag set. Check
+                // that all sockets in `load_balanced` have it set as well.
+                let reuse_addr = load_balanced.iter().all(|e| e.reuse_addr);
+
+                // All sockets in `load_balanced` have `REUSE_PORT` flag set,
+                // while the sockets in `priority` don't.
+                let reuse_port = priority.is_empty();
+
+                Sharing { reuse_addr, reuse_port }
+            }
         }
     }
 }
@@ -743,54 +750,92 @@
     }
 }
 
+pub struct SocketMapAddrInserter<'a, I> {
+    state: &'a mut AddrState<I>,
+    sharing_state: Sharing,
+}
+
+impl<'a, I> Inserter<I> for SocketMapAddrInserter<'a, I> {
+    fn insert(self, id: I) {
+        match self {
+            Self { state: _, sharing_state: Sharing { reuse_addr: false, reuse_port: false } }
+            | Self { state: AddrState::Exclusive(_), sharing_state: _ } => {
+                panic!("Can't insert entry in a non-shareable entry")
+            }
+
+            // If only `SO_REUSEADDR` flag is set then insert the entry in the `priority` list.
+            Self {
+                state: AddrState::Shared { priority, load_balanced: _ },
+                sharing_state: Sharing { reuse_addr: true, reuse_port: false },
+            } => priority.push(id),
+
+            // If `SO_REUSEPORT` flag is set then insert the entry in the `load_balanced` list.
+            Self {
+                state: AddrState::Shared { priority: _, load_balanced },
+                sharing_state: Sharing { reuse_addr, reuse_port: true },
+            } => load_balanced.push(LoadBalancedEntry { id, reuse_addr }),
+        }
+    }
+}
+
 impl<I: Debug + Eq> SocketMapAddrStateSpec for AddrState<I> {
     type Id = I;
     type SharingState = Sharing;
-    type Inserter<'a> = &'a mut Vec<I> where I: 'a;
+    type Inserter<'a> = SocketMapAddrInserter<'a, I>
+    where
+        I: 'a;
 
     fn new(new_sharing_state: &Sharing, id: I) -> Self {
         match new_sharing_state {
-            Sharing::Exclusive => Self::Exclusive(id),
-            Sharing::ReusePort => Self::ReusePort(Vec::from([id])),
+            Sharing { reuse_addr: false, reuse_port: false } => Self::Exclusive(id),
+            Sharing { reuse_addr: true, reuse_port: false } => {
+                Self::Shared { priority: Vec::from([id]), load_balanced: Vec::new() }
+            }
+            Sharing { reuse_addr, reuse_port: true } => Self::Shared {
+                priority: Vec::new(),
+                load_balanced: Vec::from([LoadBalancedEntry { id, reuse_addr: *reuse_addr }]),
+            },
         }
     }
 
     fn contains_id(&self, id: &Self::Id) -> bool {
         match self {
             Self::Exclusive(x) => id == x,
-            Self::ReusePort(ids) => ids.contains(id),
+            Self::Shared { priority, load_balanced } => {
+                priority.contains(id) || load_balanced.iter().any(|e| e.id == *id)
+            }
         }
     }
 
     fn try_get_inserter<'a, 'b>(
         &'b mut self,
         new_sharing_state: &'a Sharing,
-    ) -> Result<&'b mut Vec<I>, IncompatibleError> {
-        match (self, new_sharing_state) {
-            (AddrState::Exclusive(_), _) | (AddrState::ReusePort(_), Sharing::Exclusive) => {
-                Err(IncompatibleError)
-            }
-            (AddrState::ReusePort(ids), Sharing::ReusePort) => Ok(ids),
-        }
+    ) -> Result<SocketMapAddrInserter<'b, I>, IncompatibleError> {
+        self.could_insert(new_sharing_state)?;
+        Ok(SocketMapAddrInserter { state: self, sharing_state: *new_sharing_state })
     }
 
-    fn could_insert(
-        &self,
-        new_sharing_state: &Self::SharingState,
-    ) -> Result<(), IncompatibleError> {
-        match (self, new_sharing_state) {
-            (AddrState::Exclusive(_), _) | (_, Sharing::Exclusive) => Err(IncompatibleError),
-            (AddrState::ReusePort(_), Sharing::ReusePort) => Ok(()),
-        }
+    fn could_insert(&self, new_sharing_state: &Sharing) -> Result<(), IncompatibleError> {
+        self.to_sharing_options()
+            .is_shareable_with_new_state(*new_sharing_state)
+            .then_some(())
+            .ok_or_else(|| IncompatibleError)
     }
 
     fn remove_by_id(&mut self, id: I) -> RemoveResult {
         match self {
-            AddrState::Exclusive(_) => RemoveResult::IsLast,
-            AddrState::ReusePort(ids) => {
-                let index = ids.iter().position(|i| i == &id).expect("couldn't find ID to remove");
-                assert_eq!(ids.swap_remove(index), id);
-                if ids.is_empty() {
+            Self::Exclusive(_) => RemoveResult::IsLast,
+            Self::Shared { ref mut priority, ref mut load_balanced } => {
+                if let Some(pos) = priority.iter().position(|i| *i == id) {
+                    let _removed: I = priority.remove(pos);
+                } else {
+                    let pos = load_balanced
+                        .iter()
+                        .position(|e| e.id == id)
+                        .expect("couldn't find ID to remove");
+                    let _removed: LoadBalancedEntry<I> = load_balanced.remove(pos);
+                }
+                if priority.is_empty() && load_balanced.is_empty() {
                     RemoveResult::IsLast
                 } else {
                     RemoveResult::Success
@@ -807,11 +852,15 @@
     ) -> &T {
         match self {
             AddrState::Exclusive(id) => id,
-            AddrState::ReusePort(ids) => {
-                let mut hasher = DefaultHasher::new();
-                selector.hash(&mut hasher);
-                let index: usize = hasher.finish() as usize % ids.len();
-                &ids[index]
+            AddrState::Shared { priority, load_balanced } => {
+                if let Some(id) = priority.last() {
+                    id
+                } else {
+                    let mut hasher = DefaultHasher::new();
+                    selector.hash(&mut hasher);
+                    let index: usize = hasher.finish() as usize % load_balanced.len();
+                    &load_balanced[index].id
+                }
             }
         }
     }
@@ -819,7 +868,9 @@
     fn collect_all_ids(&self) -> impl Iterator<Item = &'_ T> {
         match self {
             AddrState::Exclusive(id) => Either::Left(core::iter::once(id)),
-            AddrState::ReusePort(ids) => Either::Right(ids.iter()),
+            AddrState::Shared { priority, load_balanced } => {
+                Either::Right(priority.iter().chain(load_balanced.iter().map(|i| &i.id)))
+            }
         }
     }
 }
@@ -911,7 +962,7 @@
     for UdpBoundSocketMap<I, D, BT>
 {
     const EPHEMERAL_RANGE: RangeInclusive<u16> = 49152..=65535;
-    type Id = ProtocolFlowId<SocketIpAddr<I::Addr>, UdpRemotePort>;
+    type Id = DatagramFlowId<I::Addr, UdpRemotePort>;
     type PortAvailableArg = ();
 
     fn is_port_available(&self, id: &Self::Id, port: u16, (): &()) -> bool {
@@ -1696,10 +1747,6 @@
     ///   available local ports for that address)
     /// - If there is no route to `remote_ip`
     /// - If `id` belongs to an already-connected socket
-    ///
-    /// # Panics
-    ///
-    /// `connect` panics if `id` is not a valid [`SocketId`].
     pub fn connect(
         &mut self,
         id: &UdpApiSocketId<I, C>,
@@ -1721,10 +1768,6 @@
     /// Sets the device to be used for sending and receiving packets for a socket.
     /// If the socket is not currently bound to a local address and port, the device
     /// will be used when binding.
-    ///
-    /// # Panics
-    ///
-    /// Panics if `id` is not a valid [`UdpSocketId`].
     pub fn set_device(
         &mut self,
         id: &UdpApiSocketId<I, C>,
@@ -1736,10 +1779,6 @@
     }
 
     /// Gets the device the specified socket is bound to.
-    ///
-    /// # Panics
-    ///
-    /// Panics if `id` is not a valid socket ID.
     pub fn get_bound_device(
         &mut self,
         id: &UdpApiSocketId<I, C>,
@@ -1756,10 +1795,6 @@
     ///
     /// Returns an error if the socket does not support the `IPV6_V6ONLY` socket
     /// option (e.g. an IPv4 socket).
-    ///
-    /// # Panics
-    ///
-    /// Panics if `id` is not a valid `UdpSocketId`.
     pub fn set_dual_stack_enabled(
         &mut self,
         id: &UdpApiSocketId<I, C>,
@@ -1800,10 +1835,6 @@
     ///
     /// Returns an error if the socket does not support the `IPV6_V6ONLY` socket
     /// option (e.g. an IPv4 socket).
-    ///
-    /// # Panics
-    ///
-    /// Panics if `id` is not a valid `UdpSocketId`.
     pub fn get_dual_stack_enabled(
         &mut self,
         id: &UdpApiSocketId<I, C>,
@@ -1821,34 +1852,44 @@
         })
     }
 
+    /// Sets the POSIX `SO_REUSEADDR` option for the specified socket.
+    ///
+    /// # Errors
+    ///
+    /// Returns an error if the socket is already bound.
+    pub fn set_posix_reuse_addr(
+        &mut self,
+        id: &UdpApiSocketId<I, C>,
+        reuse_addr: bool,
+    ) -> Result<(), ExpectedUnboundError> {
+        let mut sharing = datagram::get_sharing(self.core_ctx(), id);
+        sharing.reuse_addr = reuse_addr;
+        datagram::update_sharing(self.core_ctx(), id, sharing)
+    }
+
+    /// Gets the POSIX `SO_REUSEADDR` option for the specified socket.
+    pub fn get_posix_reuse_addr(&mut self, id: &UdpApiSocketId<I, C>) -> bool {
+        datagram::get_sharing(self.core_ctx(), id).reuse_addr
+    }
+
     /// Sets the POSIX `SO_REUSEPORT` option for the specified socket.
     ///
     /// # Errors
     ///
     /// Returns an error if the socket is already bound.
-    ///
-    /// # Panics
-    ///
-    /// panics if `id` is not a valid `UdpSocketId`.
     pub fn set_posix_reuse_port(
         &mut self,
         id: &UdpApiSocketId<I, C>,
         reuse_port: bool,
     ) -> Result<(), ExpectedUnboundError> {
-        datagram::update_sharing(
-            self.core_ctx(),
-            id,
-            if reuse_port { Sharing::ReusePort } else { Sharing::Exclusive },
-        )
+        let mut sharing = datagram::get_sharing(self.core_ctx(), id);
+        sharing.reuse_port = reuse_port;
+        datagram::update_sharing(self.core_ctx(), id, sharing)
     }
 
     /// Gets the POSIX `SO_REUSEPORT` option for the specified socket.
-    ///
-    /// # Panics
-    ///
-    /// Panics if `id` is not a valid `UdpSocketId`.
     pub fn get_posix_reuse_port(&mut self, id: &UdpApiSocketId<I, C>) -> bool {
-        datagram::get_sharing(self.core_ctx(), id).is_reuse_port()
+        datagram::get_sharing(self.core_ctx(), id).reuse_port
     }
 
     /// Sets the specified socket's membership status for the given group.
@@ -2131,10 +2172,6 @@
     /// # Errors
     ///
     /// Returns an error if the socket is not connected.
-    ///
-    /// # Panics
-    ///
-    /// Panics if `id` is not a valid `UdpSocketId`.
     pub fn disconnect(&mut self, id: &UdpApiSocketId<I, C>) -> Result<(), ExpectedConnError> {
         let (core_ctx, bindings_ctx) = self.contexts();
         debug!("disconnect {id:?}");
@@ -2146,10 +2183,6 @@
     /// # Errors
     ///
     /// Returns an error if the socket is not connected.
-    ///
-    /// # Panics
-    ///
-    /// Panics if `id` is not a valid `UdpSocketId`.
     pub fn shutdown(
         &mut self,
         id: &UdpApiSocketId<I, C>,
@@ -2164,20 +2197,12 @@
     ///
     /// If the socket is not connected, or if `shutdown` was not called on it,
     /// returns `None`.
-    ///
-    /// # Panics
-    ///
-    /// Panics if `id` is not a valid `UdpSocketId`.
     pub fn get_shutdown(&mut self, id: &UdpApiSocketId<I, C>) -> Option<ShutdownType> {
         let (core_ctx, bindings_ctx) = self.contexts();
         datagram::get_shutdown_connected(core_ctx, bindings_ctx, id)
     }
 
     /// Removes a socket that was previously created.
-    ///
-    /// # Panics
-    ///
-    /// Panics if `id` is not a valid [`UdpSocketId`].
     pub fn close(
         &mut self,
         id: UdpApiSocketId<I, C>,
@@ -2192,10 +2217,6 @@
 
     /// Gets the [`SocketInfo`] associated with the UDP socket referenced by
     /// `id`.
-    ///
-    /// # Panics
-    ///
-    /// `get_udp_info` panics if `id` is not a valid `UdpSocketId`.
     pub fn get_info(
         &mut self,
         id: &UdpApiSocketId<I, C>,
@@ -2220,10 +2241,6 @@
     /// # Errors
     ///
     /// Returns an error if the socket is not currently unbound.
-    ///
-    /// # Panics
-    ///
-    /// `listen_udp` panics if `id` is not a valid [`UdpSocketId`].
     pub fn listen(
         &mut self,
         id: &UdpApiSocketId<I, C>,
@@ -2247,10 +2264,6 @@
     /// Returns an error if the socket is not connected or the packet cannot be
     /// sent. On error, the original `body` is returned unmodified so that it
     /// can be reused by the caller.
-    ///
-    /// # Panics
-    ///
-    /// Panics if `id` is not a valid UDP socket identifier.
     pub fn send<B: BufferMut>(
         &mut self,
         id: &UdpApiSocketId<I, C>,
@@ -2281,10 +2294,6 @@
     /// Returns an error if the socket is unbound and connecting fails, or if the
     /// packet could not be sent. If the socket is unbound and connecting succeeds
     /// but sending fails, the socket remains connected.
-    ///
-    /// # Panics
-    ///
-    /// Panics if `id` is not a valid UDP socket identifier.
     pub fn send_to<B: BufferMut>(
         &mut self,
         id: &UdpApiSocketId<I, C>,
@@ -6820,61 +6829,124 @@
         })
     }
 
+    const EXCLUSIVE: Sharing = Sharing { reuse_addr: false, reuse_port: false };
+    const REUSE_ADDR: Sharing = Sharing { reuse_addr: true, reuse_port: false };
+    const REUSE_PORT: Sharing = Sharing { reuse_addr: false, reuse_port: true };
+    const REUSE_ADDR_PORT: Sharing = Sharing { reuse_addr: true, reuse_port: true };
+
     #[test_case([
-        (listen(ip_v4!("0.0.0.0"), 1), Sharing::Exclusive),
-        (listen(ip_v4!("0.0.0.0"), 2), Sharing::Exclusive)],
+        (listen(ip_v4!("0.0.0.0"), 1), EXCLUSIVE),
+        (listen(ip_v4!("0.0.0.0"), 2), EXCLUSIVE)],
             Ok(()); "listen_any_ip_different_port")]
     #[test_case([
-        (listen(ip_v4!("0.0.0.0"), 1), Sharing::Exclusive),
-        (listen(ip_v4!("0.0.0.0"), 1), Sharing::Exclusive)],
+        (listen(ip_v4!("0.0.0.0"), 1), EXCLUSIVE),
+        (listen(ip_v4!("0.0.0.0"), 1), EXCLUSIVE)],
             Err(InsertError::Exists); "any_ip_same_port")]
     #[test_case([
-        (listen(ip_v4!("1.1.1.1"), 1), Sharing::Exclusive),
-        (listen(ip_v4!("1.1.1.1"), 1), Sharing::Exclusive)],
+        (listen(ip_v4!("1.1.1.1"), 1), EXCLUSIVE),
+        (listen(ip_v4!("1.1.1.1"), 1), EXCLUSIVE)],
             Err(InsertError::Exists); "listen_same_specific_ip")]
     #[test_case([
-        (listen(ip_v4!("1.1.1.1"), 1), Sharing::ReusePort),
-        (listen(ip_v4!("1.1.1.1"), 1), Sharing::ReusePort)],
+        (listen(ip_v4!("1.1.1.1"), 1), REUSE_ADDR),
+        (listen(ip_v4!("1.1.1.1"), 1), REUSE_ADDR)],
+            Ok(()); "listen_same_specific_ip_reuse_addr")]
+    #[test_case([
+        (listen(ip_v4!("1.1.1.1"), 1), REUSE_PORT),
+        (listen(ip_v4!("1.1.1.1"), 1), REUSE_PORT)],
             Ok(()); "listen_same_specific_ip_reuse_port")]
     #[test_case([
-        (listen(ip_v4!("1.1.1.1"), 1), Sharing::Exclusive),
-        (listen(ip_v4!("1.1.1.1"), 1), Sharing::ReusePort)],
+        (listen(ip_v4!("1.1.1.1"), 1), REUSE_ADDR_PORT),
+        (listen(ip_v4!("1.1.1.1"), 1), REUSE_ADDR)],
+            Ok(()); "listen_same_specific_ip_reuse_addr_port_and_reuse_addr")]
+    #[test_case([
+        (listen(ip_v4!("1.1.1.1"), 1), REUSE_ADDR),
+        (listen(ip_v4!("1.1.1.1"), 1), REUSE_ADDR_PORT)],
+            Ok(()); "listen_same_specific_ip_reuse_addr_and_reuse_addr_port")]
+    #[test_case([
+        (listen(ip_v4!("1.1.1.1"), 1), REUSE_ADDR_PORT),
+        (listen(ip_v4!("1.1.1.1"), 1), REUSE_PORT)],
+            Ok(()); "listen_same_specific_ip_reuse_addr_port_and_reuse_port")]
+    #[test_case([
+        (listen(ip_v4!("1.1.1.1"), 1), REUSE_PORT),
+        (listen(ip_v4!("1.1.1.1"), 1), REUSE_ADDR_PORT)],
+            Ok(()); "listen_same_specific_ip_reuse_port_and_reuse_addr_port")]
+    #[test_case([
+        (listen(ip_v4!("1.1.1.1"), 1), REUSE_ADDR_PORT),
+        (listen(ip_v4!("1.1.1.1"), 1), REUSE_ADDR_PORT)],
+            Ok(()); "listen_same_specific_ip_reuse_addr_port_and_reuse_addr_port")]
+    #[test_case([
+        (listen(ip_v4!("1.1.1.1"), 1), EXCLUSIVE),
+        (listen(ip_v4!("1.1.1.1"), 1), REUSE_ADDR)],
+            Err(InsertError::Exists); "listen_same_specific_ip_exclusive_reuse_addr")]
+    #[test_case([
+        (listen(ip_v4!("1.1.1.1"), 1), REUSE_ADDR),
+        (listen(ip_v4!("1.1.1.1"), 1), EXCLUSIVE)],
+            Err(InsertError::Exists); "listen_same_specific_ip_reuse_addr_exclusive")]
+    #[test_case([
+        (listen(ip_v4!("1.1.1.1"), 1), EXCLUSIVE),
+        (listen(ip_v4!("1.1.1.1"), 1), REUSE_PORT)],
             Err(InsertError::Exists); "listen_same_specific_ip_exclusive_reuse_port")]
     #[test_case([
-        (listen(ip_v4!("1.1.1.1"), 1), Sharing::ReusePort),
-        (listen(ip_v4!("1.1.1.1"), 1), Sharing::Exclusive)],
+        (listen(ip_v4!("1.1.1.1"), 1), REUSE_PORT),
+        (listen(ip_v4!("1.1.1.1"), 1), EXCLUSIVE)],
             Err(InsertError::Exists); "listen_same_specific_ip_reuse_port_exclusive")]
     #[test_case([
-        (listen(ip_v4!("1.1.1.1"), 1), Sharing::ReusePort),
-        (conn(ip_v4!("1.1.1.1"), 1, ip_v4!("2.2.2.2"), 2), Sharing::ReusePort)],
+        (listen(ip_v4!("1.1.1.1"), 1), EXCLUSIVE),
+        (listen(ip_v4!("1.1.1.1"), 1), REUSE_ADDR_PORT)],
+            Err(InsertError::Exists); "listen_same_specific_ip_exclusive_reuse_addr_port")]
+    #[test_case([
+        (listen(ip_v4!("1.1.1.1"), 1), REUSE_ADDR_PORT),
+        (listen(ip_v4!("1.1.1.1"), 1), EXCLUSIVE)],
+            Err(InsertError::Exists); "listen_same_specific_ip_reuse_addr_port_exclusive")]
+    #[test_case([
+        (listen(ip_v4!("1.1.1.1"), 1), REUSE_PORT),
+        (listen(ip_v4!("1.1.1.1"), 1), REUSE_ADDR)],
+            Err(InsertError::Exists); "listen_same_specific_ip_reuse_port_reuse_addr")]
+    #[test_case([
+        (listen(ip_v4!("1.1.1.1"), 1), REUSE_ADDR),
+        (listen(ip_v4!("1.1.1.1"), 1), REUSE_PORT)],
+            Err(InsertError::Exists); "listen_same_specific_ip_reuse_addr_reuse_port")]
+    #[test_case([
+        (listen(ip_v4!("1.1.1.1"), 1), REUSE_ADDR_PORT),
+        (listen(ip_v4!("1.1.1.1"), 1), REUSE_PORT),
+        (listen(ip_v4!("1.1.1.1"), 1), REUSE_ADDR),],
+            Err(InsertError::Exists); "listen_same_specific_ip_reuse_addr_port_and_reuse_port_and_reuse_addr")]
+    #[test_case([
+        (listen(ip_v4!("1.1.1.1"), 1), REUSE_ADDR_PORT),
+        (listen(ip_v4!("1.1.1.1"), 1), REUSE_ADDR),
+        (listen(ip_v4!("1.1.1.1"), 1), REUSE_PORT),],
+            Err(InsertError::Exists); "listen_same_specific_ip_reuse_addr_port_and_reuse_addr_and_reuse_port")]
+    #[test_case([
+        (listen(ip_v4!("1.1.1.1"), 1), REUSE_PORT),
+        (conn(ip_v4!("1.1.1.1"), 1, ip_v4!("2.2.2.2"), 2), REUSE_PORT)],
             Ok(()); "conn_shadows_listener_reuse_port")]
     #[test_case([
-        (listen(ip_v4!("1.1.1.1"), 1), Sharing::Exclusive),
-        (conn(ip_v4!("1.1.1.1"), 1, ip_v4!("2.2.2.2"), 2), Sharing::Exclusive)],
+        (listen(ip_v4!("1.1.1.1"), 1), EXCLUSIVE),
+        (conn(ip_v4!("1.1.1.1"), 1, ip_v4!("2.2.2.2"), 2), EXCLUSIVE)],
             Err(InsertError::ShadowAddrExists); "conn_shadows_listener_exclusive")]
     #[test_case([
-        (listen(ip_v4!("1.1.1.1"), 1), Sharing::Exclusive),
-        (conn(ip_v4!("1.1.1.1"), 1, ip_v4!("2.2.2.2"), 2), Sharing::ReusePort)],
+        (listen(ip_v4!("1.1.1.1"), 1), EXCLUSIVE),
+        (conn(ip_v4!("1.1.1.1"), 1, ip_v4!("2.2.2.2"), 2), REUSE_PORT)],
             Err(InsertError::ShadowAddrExists); "conn_shadows_listener_exclusive_reuse_port")]
     #[test_case([
-        (listen(ip_v4!("1.1.1.1"), 1), Sharing::ReusePort),
-        (conn(ip_v4!("1.1.1.1"), 1, ip_v4!("2.2.2.2"), 2), Sharing::Exclusive)],
+        (listen(ip_v4!("1.1.1.1"), 1), REUSE_PORT),
+        (conn(ip_v4!("1.1.1.1"), 1, ip_v4!("2.2.2.2"), 2), EXCLUSIVE)],
             Err(InsertError::ShadowAddrExists); "conn_shadows_listener_reuse_port_exclusive")]
     #[test_case([
-        (listen_device(ip_v4!("1.1.1.1"), 1, FakeWeakDeviceId(FakeDeviceId)), Sharing::Exclusive),
-        (conn(ip_v4!("1.1.1.1"), 1, ip_v4!("2.2.2.2"), 2), Sharing::Exclusive)],
+        (listen_device(ip_v4!("1.1.1.1"), 1, FakeWeakDeviceId(FakeDeviceId)), EXCLUSIVE),
+        (conn(ip_v4!("1.1.1.1"), 1, ip_v4!("2.2.2.2"), 2), EXCLUSIVE)],
             Err(InsertError::IndirectConflict); "conn_indirect_conflict_specific_listener")]
     #[test_case([
-        (listen_device(ip_v4!("0.0.0.0"), 1, FakeWeakDeviceId(FakeDeviceId)), Sharing::Exclusive),
-        (conn(ip_v4!("1.1.1.1"), 1, ip_v4!("2.2.2.2"), 2), Sharing::Exclusive)],
+        (listen_device(ip_v4!("0.0.0.0"), 1, FakeWeakDeviceId(FakeDeviceId)), EXCLUSIVE),
+        (conn(ip_v4!("1.1.1.1"), 1, ip_v4!("2.2.2.2"), 2), EXCLUSIVE)],
             Err(InsertError::IndirectConflict); "conn_indirect_conflict_any_listener")]
     #[test_case([
-        (conn(ip_v4!("1.1.1.1"), 1, ip_v4!("2.2.2.2"), 2), Sharing::Exclusive),
-        (listen_device(ip_v4!("1.1.1.1"), 1, FakeWeakDeviceId(FakeDeviceId)), Sharing::Exclusive)],
+        (conn(ip_v4!("1.1.1.1"), 1, ip_v4!("2.2.2.2"), 2), EXCLUSIVE),
+        (listen_device(ip_v4!("1.1.1.1"), 1, FakeWeakDeviceId(FakeDeviceId)), EXCLUSIVE)],
             Err(InsertError::IndirectConflict); "specific_listener_indirect_conflict_conn")]
     #[test_case([
-        (conn(ip_v4!("1.1.1.1"), 1, ip_v4!("2.2.2.2"), 2), Sharing::Exclusive),
-        (listen_device(ip_v4!("0.0.0.0"), 1, FakeWeakDeviceId(FakeDeviceId)), Sharing::Exclusive)],
+        (conn(ip_v4!("1.1.1.1"), 1, ip_v4!("2.2.2.2"), 2), EXCLUSIVE),
+        (listen_device(ip_v4!("0.0.0.0"), 1, FakeWeakDeviceId(FakeDeviceId)), EXCLUSIVE)],
             Err(InsertError::IndirectConflict); "any_listener_indirect_conflict_conn")]
     fn bind_sequence<
         C: IntoIterator<Item = (AddrVec<Ipv4, FakeWeakDeviceId<FakeDeviceId>, UdpAddrSpec>, Sharing)>,
@@ -6919,16 +6991,16 @@
     }
 
     #[test_case([
-            (listen(ip_v4!("1.1.1.1"), 1), Sharing::Exclusive),
-            (listen(ip_v4!("2.2.2.2"), 2), Sharing::Exclusive),
+            (listen(ip_v4!("1.1.1.1"), 1), EXCLUSIVE),
+            (listen(ip_v4!("2.2.2.2"), 2), EXCLUSIVE),
         ]; "distinct")]
     #[test_case([
-            (listen(ip_v4!("1.1.1.1"), 1), Sharing::ReusePort),
-            (listen(ip_v4!("1.1.1.1"), 1), Sharing::ReusePort),
+            (listen(ip_v4!("1.1.1.1"), 1), REUSE_PORT),
+            (listen(ip_v4!("1.1.1.1"), 1), REUSE_PORT),
         ]; "listen_reuse_port")]
     #[test_case([
-            (conn(ip_v4!("1.1.1.1"), 1, ip_v4!("2.2.2.2"), 3), Sharing::ReusePort),
-            (conn(ip_v4!("1.1.1.1"), 1, ip_v4!("2.2.2.2"), 3), Sharing::ReusePort),
+            (conn(ip_v4!("1.1.1.1"), 1, ip_v4!("2.2.2.2"), 3), REUSE_PORT),
+            (conn(ip_v4!("1.1.1.1"), 1, ip_v4!("2.2.2.2"), 3), REUSE_PORT),
         ]; "conn_reuse_port")]
     fn remove_sequence<I>(spec: I)
     where
diff --git a/src/connectivity/network/netstack3/core/sync/BUILD.gn b/src/connectivity/network/netstack3/core/sync/BUILD.gn
index d1e8e15..0de8e89 100644
--- a/src/connectivity/network/netstack3/core/sync/BUILD.gn
+++ b/src/connectivity/network/netstack3/core/sync/BUILD.gn
@@ -14,7 +14,10 @@
     "src/lib.rs",
     "src/rc.rs",
   ]
-  deps = [ "//third_party/rust_crates:derivative" ]
+  deps = [
+    "//src/connectivity/network/netstack3/core/lock-order",
+    "//third_party/rust_crates:derivative",
+  ]
 
   feature_sets = [
     {
diff --git a/src/connectivity/network/netstack3/core/sync/src/lib.rs b/src/connectivity/network/netstack3/core/sync/src/lib.rs
index efdcd36..ebe2e96a 100644
--- a/src/connectivity/network/netstack3/core/sync/src/lib.rs
+++ b/src/connectivity/network/netstack3/core/sync/src/lib.rs
@@ -59,6 +59,14 @@
     }
 }
 
+impl<T: 'static> lock_order::lock::ExclusiveLock<T> for Mutex<T> {
+    type Guard<'l> = LockGuard<'l, T>;
+
+    fn lock(&self) -> Self::Guard<'_> {
+        self.lock()
+    }
+}
+
 /// A [`std::sync::RwLock`] assuming lock poisoning will never occur.
 #[derive(Debug, Default)]
 pub struct RwLock<T>(std::sync::RwLock<T>);
@@ -127,6 +135,20 @@
     }
 }
 
+impl<T: 'static> lock_order::lock::ReadWriteLock<T> for RwLock<T> {
+    type ReadGuard<'l> = RwLockReadGuard<'l, T>;
+
+    type WriteGuard<'l> = RwLockWriteGuard<'l, T>;
+
+    fn read_lock(&self) -> Self::ReadGuard<'_> {
+        self.read()
+    }
+
+    fn write_lock(&self) -> Self::WriteGuard<'_> {
+        self.write()
+    }
+}
+
 mod lock_guard {
     #[cfg(not(feature = "recursive-lock-panic"))]
     use core::marker::PhantomData;
diff --git a/src/connectivity/network/netstack3/src/bindings/socket/datagram.rs b/src/connectivity/network/netstack3/src/bindings/socket/datagram.rs
index d2abb0d..b40e1ab 100644
--- a/src/connectivity/network/netstack3/src/bindings/socket/datagram.rs
+++ b/src/connectivity/network/netstack3/src/bindings/socket/datagram.rs
@@ -126,6 +126,7 @@
     type SetSocketDeviceError: IntoErrno;
     type SetMulticastMembershipError: IntoErrno;
     type MulticastInterfaceError: IntoErrno;
+    type SetReuseAddrError: IntoErrno;
     type SetReusePortError: IntoErrno;
     type ShutdownError: IntoErrno;
     type SetIpTransparentError: IntoErrno;
@@ -188,6 +189,14 @@
         id: &Self::SocketId,
     ) -> Result<bool, NotDualStackCapableError>;
 
+    fn set_reuse_addr(
+        ctx: &mut Ctx,
+        id: &Self::SocketId,
+        reuse_addr: bool,
+    ) -> Result<(), Self::SetReuseAddrError>;
+
+    fn get_reuse_addr(ctx: &mut Ctx, id: &Self::SocketId) -> bool;
+
     fn set_reuse_port(
         ctx: &mut Ctx,
         id: &Self::SocketId,
@@ -309,6 +318,7 @@
     type SetSocketDeviceError = SocketError;
     type SetMulticastMembershipError = SetMulticastMembershipError;
     type MulticastInterfaceError = NotDualStackCapableError;
+    type SetReuseAddrError = ExpectedUnboundError;
     type SetReusePortError = ExpectedUnboundError;
     type SetIpTransparentError = Never;
     type LocalIdentifier = NonZeroU16;
@@ -385,20 +395,24 @@
         ctx.api().udp().get_bound_device(id)
     }
 
+    fn set_reuse_addr(
+        ctx: &mut Ctx,
+        id: &Self::SocketId,
+        reuse_addr: bool,
+    ) -> Result<(), Self::SetReusePortError> {
+        ctx.api().udp().set_posix_reuse_addr(id, reuse_addr).inspect_err(|_| {
+            warn!("tried to set SO_REUSEADDR on a bound socket; see https://fxbug.dev/42051599")
+        })
+    }
+
     fn set_reuse_port(
         ctx: &mut Ctx,
         id: &Self::SocketId,
         reuse_port: bool,
     ) -> Result<(), Self::SetReusePortError> {
-        match ctx.api().udp().set_posix_reuse_port(id, reuse_port) {
-            Ok(()) => Ok(()),
-            Err(e) => {
-                warn!(
-                    "tried to set SO_REUSEPORT on a bound socket; see https://fxbug.dev/42051599"
-                );
-                Err(e)
-            }
-        }
+        ctx.api().udp().set_posix_reuse_port(id, reuse_port).inspect_err(|_| {
+            warn!("tried to set SO_REUSEPORT on a bound socket; see https://fxbug.dev/42051599")
+        })
     }
 
     fn set_dual_stack_enabled(
@@ -416,6 +430,10 @@
         ctx.api().udp().get_dual_stack_enabled(id)
     }
 
+    fn get_reuse_addr(ctx: &mut Ctx, id: &Self::SocketId) -> bool {
+        ctx.api().udp().get_posix_reuse_addr(id)
+    }
+
     fn get_reuse_port(ctx: &mut Ctx, id: &Self::SocketId) -> bool {
         ctx.api().udp().get_posix_reuse_port(id)
     }
@@ -578,6 +596,7 @@
     type SetSocketDeviceError = SocketError;
     type SetMulticastMembershipError = NotSupportedError;
     type MulticastInterfaceError = NotSupportedError;
+    type SetReuseAddrError = NotSupportedError;
     type SetReusePortError = NotSupportedError;
     type SetIpTransparentError = NotSupportedError;
     type LocalIdentifier = NonZeroU16;
@@ -684,6 +703,18 @@
         }
     }
 
+    fn set_reuse_addr(
+        _ctx: &mut Ctx,
+        _id: &Self::SocketId,
+        _reuse_addr: bool,
+    ) -> Result<(), Self::SetReuseAddrError> {
+        Err(NotSupportedError)
+    }
+
+    fn get_reuse_addr(_ctx: &mut Ctx, _id: &Self::SocketId) -> bool {
+        false
+    }
+
     fn set_reuse_port(
         _ctx: &mut Ctx,
         _id: &Self::SocketId,
@@ -1233,7 +1264,12 @@
                 responder.send(Ok(())).unwrap_or_else(|e| error!("failed to respond: {e:?}"));
             }
             Request::GetSendBuffer { responder } => {
-                respond_not_supported!("syncudp::GetSendBuffer", responder)
+                // TODO(https://fxbug.dev/42074004): Actually implement SetSendBuffer.
+                // Until then we return the default buffer size used on Linux.
+                const DEFAULT_SEND_BUFFER: u64 = 212992;
+                responder
+                    .send(Ok(DEFAULT_SEND_BUFFER))
+                    .unwrap_or_else(|e| error!("failed to respond: {e:?}"));
             }
             Request::SetReceiveBuffer { value_bytes, responder } => {
                 responder
@@ -1248,18 +1284,15 @@
                     .send(Ok(self.get_max_receive_buffer_size()))
                     .unwrap_or_else(|e| error!("failed to respond: {e:?}"));
             }
-            Request::SetReuseAddress { value: _, responder } => {
-                tracing::warn!(
-                    "TODO(https://fxbug.dev/42180094): implement SO_REUSEADDR; returning OK"
-                );
-                // ANVL's UDP test stub requires that setting SO_REUSEADDR succeeds.
-                // Blindly return success here to unblock test coverage (possible since
-                // the network test realm is restarted before each test case).
-                // TODO(https://fxbug.dev/42180094): Actually implement SetReuseAddress.
-                responder.send(Ok(())).unwrap_or_else(|e| error!("failed to respond: {e:?}"));
+            Request::SetReuseAddress { value, responder } => {
+                let result = self.set_reuse_addr(value);
+                maybe_log_error!("set_reuse_addr", &result);
+                responder.send(result).unwrap_or_else(|e| error!("failed to respond: {e:?}"));
             }
             Request::GetReuseAddress { responder } => {
-                respond_not_supported!("syncudp::GetReuseAddress", responder)
+                responder
+                    .send(Ok(self.get_reuse_addr()))
+                    .unwrap_or_else(|e| error!("failed to respond: {e:?}"));
             }
             Request::SetReusePort { value, responder } => {
                 let result = self.set_reuse_port(value);
@@ -1916,6 +1949,16 @@
         correct_ip_version.ok_or(fposix::Errno::Eopnotsupp)
     }
 
+    fn set_reuse_addr(self, reuse_addr: bool) -> Result<(), fposix::Errno> {
+        let Self { ctx, data: BindingData { info: SocketControlInfo { id, .. }, .. } } = self;
+        T::set_reuse_addr(ctx, id, reuse_addr).map_err(IntoErrno::into_errno)
+    }
+
+    fn get_reuse_addr(self) -> bool {
+        let Self { ctx, data: BindingData { info: SocketControlInfo { id, .. }, .. } } = self;
+        T::get_reuse_addr(ctx, id)
+    }
+
     fn set_reuse_port(self, reuse_port: bool) -> Result<(), fposix::Errno> {
         let Self { ctx, data: BindingData { info: SocketControlInfo { id, .. }, .. } } = self;
         T::set_reuse_port(ctx, id, reuse_port).map_err(IntoErrno::into_errno)
diff --git a/src/developer/ffx/plugins/repository/serve/src/lib.rs b/src/developer/ffx/plugins/repository/serve/src/lib.rs
index e9c2a50..1acf3f7 100644
--- a/src/developer/ffx/plugins/repository/serve/src/lib.rs
+++ b/src/developer/ffx/plugins/repository/serve/src/lib.rs
@@ -999,6 +999,7 @@
             );
 
         let tmp_port_file = tempfile::NamedTempFile::new().unwrap();
+        let tmp_port_file_path = tmp_port_file.path().to_owned();
 
         // Future resolves once fake target exists
         let _timeout = timeout(time::Duration::from_secs(10), async {
@@ -1014,28 +1015,31 @@
         .await
         .unwrap();
 
-        let serve_tool = ServeTool {
-            cmd: ServeCommand {
-                repository: Some(REPO_NAME.to_string()),
-                trusted_root: None,
-                address: (REPO_IPV4_ADDR, REPO_PORT).into(),
-                repo_path: Some(EMPTY_REPO_PATH.into()),
-                product_bundle: None,
-                alias: vec!["example.com".into(), "fuchsia.com".into()],
-                storage_type: Some(RepositoryStorageType::Ephemeral),
-                alias_conflict_mode: RepositoryRegistrationAliasConflictMode::Replace,
-                port_path: Some(tmp_port_file.path().to_owned()),
-                no_device: false,
-            },
-            context: test_env.context.clone(),
-            target_collection_proxy: target_collection_proxy,
-        };
-
         let test_stdout = TestBuffer::default();
         let writer = SimpleWriter::new_buffers(test_stdout.clone(), Vec::new());
 
         // Run main in background
-        let _task = fasync::Task::local(async move { serve_tool.main(writer).await.unwrap() });
+        let _task = fasync::Task::local(async move {
+            serve_impl(
+                target_collection_proxy,
+                ServeCommand {
+                    repository: Some(REPO_NAME.to_string()),
+                    trusted_root: None,
+                    address: (REPO_IPV4_ADDR, REPO_PORT).into(),
+                    repo_path: Some(EMPTY_REPO_PATH.into()),
+                    product_bundle: None,
+                    alias: vec!["example.com".into(), "fuchsia.com".into()],
+                    storage_type: Some(RepositoryStorageType::Ephemeral),
+                    alias_conflict_mode: RepositoryRegistrationAliasConflictMode::Replace,
+                    port_path: Some(tmp_port_file_path),
+                    no_device: false,
+                },
+                test_env.context.clone(),
+                writer,
+            )
+            .await
+            .unwrap()
+        });
 
         // Future resolves once repo server communicates with them.
         let _timeout = timeout(time::Duration::from_secs(10), async {
@@ -1136,6 +1140,7 @@
         let test_env = get_test_env().await;
 
         let tmp_port_file = tempfile::NamedTempFile::new().unwrap();
+        let tmp_port_file_path = tmp_port_file.path().to_owned();
 
         let (fake_repo, _fake_repo_rx) = FakeRepositoryManager::new();
         let (fake_engine, _fake_engine_rx) = FakeEngine::new();
@@ -1143,28 +1148,31 @@
         let (_, target_collection_proxy, _) =
             FakeTargetCollection::new(fake_repo.clone(), fake_engine.clone(), None);
 
-        let serve_tool = ServeTool {
-            cmd: ServeCommand {
-                repository: Some(REPO_NAME.to_string()),
-                trusted_root: None,
-                address: (REPO_IPV4_ADDR, REPO_PORT).into(),
-                repo_path: Some(EMPTY_REPO_PATH.into()),
-                product_bundle: None,
-                alias: vec![],
-                storage_type: None,
-                alias_conflict_mode: RepositoryRegistrationAliasConflictMode::Replace,
-                port_path: Some(tmp_port_file.path().to_owned()),
-                no_device: true,
-            },
-            context: test_env.context.clone(),
-            target_collection_proxy: target_collection_proxy,
-        };
-
         let test_stdout = TestBuffer::default();
         let writer = SimpleWriter::new_buffers(test_stdout.clone(), Vec::new());
 
         // Run main in background
-        let _task = fasync::Task::local(async move { serve_tool.main(writer).await.unwrap() });
+        let _task = fasync::Task::local(async move {
+            serve_impl(
+                target_collection_proxy,
+                ServeCommand {
+                    repository: Some(REPO_NAME.to_string()),
+                    trusted_root: None,
+                    address: (REPO_IPV4_ADDR, REPO_PORT).into(),
+                    repo_path: Some(EMPTY_REPO_PATH.into()),
+                    product_bundle: None,
+                    alias: vec!["example.com".into(), "fuchsia.com".into()],
+                    storage_type: Some(RepositoryStorageType::Ephemeral),
+                    alias_conflict_mode: RepositoryRegistrationAliasConflictMode::Replace,
+                    port_path: Some(tmp_port_file_path),
+                    no_device: false,
+                },
+                test_env.context.clone(),
+                writer,
+            )
+            .await
+            .unwrap()
+        });
 
         // Wait for the "Serving repository ..." output
         for _ in 0..10 {
@@ -1289,6 +1297,7 @@
         write_product_bundle(&pb_dir).await;
 
         let tmp_port_file = tempfile::NamedTempFile::new().unwrap();
+        let tmp_port_file_path = tmp_port_file.path().to_owned();
 
         let (fake_repo, mut fake_repo_rx) = FakeRepositoryManager::new();
         let (fake_engine, _fake_engine_rx) = FakeEngine::new();
@@ -1309,28 +1318,31 @@
         .await
         .unwrap();
 
-        let serve_tool = ServeTool {
-            cmd: ServeCommand {
-                repository: None,
-                trusted_root: None,
-                address: (REPO_IPV4_ADDR, REPO_PORT).into(),
-                repo_path: None,
-                product_bundle: Some(pb_dir),
-                alias: vec![],
-                storage_type: Some(RepositoryStorageType::Ephemeral),
-                alias_conflict_mode: RepositoryRegistrationAliasConflictMode::Replace,
-                port_path: Some(tmp_port_file.path().to_owned()),
-                no_device: false,
-            },
-            context: test_env.context.clone(),
-            target_collection_proxy: target_collection_proxy,
-        };
-
         let test_stdout = TestBuffer::default();
         let writer = SimpleWriter::new_buffers(test_stdout.clone(), Vec::new());
 
         // Run main in background
-        let _task = fasync::Task::local(async move { serve_tool.main(writer).await.unwrap() });
+        let _task = fasync::Task::local(async move {
+            serve_impl(
+                target_collection_proxy,
+                ServeCommand {
+                    repository: None,
+                    trusted_root: None,
+                    address: (REPO_IPV4_ADDR, REPO_PORT).into(),
+                    repo_path: None,
+                    product_bundle: Some(pb_dir),
+                    alias: vec![],
+                    storage_type: Some(RepositoryStorageType::Ephemeral),
+                    alias_conflict_mode: RepositoryRegistrationAliasConflictMode::Replace,
+                    port_path: Some(tmp_port_file_path),
+                    no_device: false,
+                },
+                test_env.context.clone(),
+                writer,
+            )
+            .await
+            .unwrap()
+        });
 
         // Future resolves once repo server communicates with them.
         let _timeout = timeout(time::Duration::from_secs(10), async {
diff --git a/src/devices/tests/node-group-test/drivers/root-driver.cc b/src/devices/tests/node-group-test/drivers/root-driver.cc
index 0832541..7c0e9d5 100644
--- a/src/devices/tests/node-group-test/drivers/root-driver.cc
+++ b/src/devices/tests/node-group-test/drivers/root-driver.cc
@@ -29,7 +29,7 @@
   };
 
   zx_device_str_prop_t str_fragment_props_1[] = {
-      {bind_test::FLAG.c_str(), str_prop_bool_val(false)},
+      ddk::MakeStrProperty(bind_test::FLAG, false),
   };
 
   auto fragment_dev_a_1 = std::make_unique<RootDriver>(dev);
@@ -70,7 +70,7 @@
 
   // Add 2 devices that matches the other node group node.
   zx_device_str_prop_t str_fragment_props_2[] = {
-      {bind_test::TEST_PROP.c_str(), str_prop_str_val(bind_test::TEST_PROP_VALUE_2.c_str())},
+      ddk::MakeStrProperty(bind_test::TEST_PROP, bind_test::TEST_PROP_VALUE_2),
   };
 
   auto fragment_dev_b_1 = std::make_unique<RootDriver>(dev);
diff --git a/src/graphics/display/drivers/amlogic-display/display-engine.h b/src/graphics/display/drivers/amlogic-display/display-engine.h
index 498c8a7..fa75f66 100644
--- a/src/graphics/display/drivers/amlogic-display/display-engine.h
+++ b/src/graphics/display/drivers/amlogic-display/display-engine.h
@@ -104,8 +104,6 @@
   void DisplayControllerImplApplyConfiguration(const display_config_t* display_configs,
                                                size_t display_count,
                                                const config_stamp_t* banjo_config_stamp);
-  void DisplayControllerImplSetEld(uint64_t display_id, const uint8_t* raw_eld_list,
-                                   size_t raw_eld_count) {}  // No ELD required for non-HDA systems.
   zx_status_t DisplayControllerImplSetBufferCollectionConstraints(
       const image_buffer_usage_t* usage, uint64_t banjo_driver_buffer_collection_id);
   zx_status_t DisplayControllerImplSetDisplayPower(uint64_t display_id, bool power_on);
diff --git a/src/graphics/display/drivers/coordinator/BUILD.gn b/src/graphics/display/drivers/coordinator/BUILD.gn
index 71a91a5..eaa10ad 100644
--- a/src/graphics/display/drivers/coordinator/BUILD.gn
+++ b/src/graphics/display/drivers/coordinator/BUILD.gn
@@ -61,8 +61,6 @@
     "controller.h",
     "display-info.cc",
     "display-info.h",
-    "eld.cc",
-    "eld.h",
     "engine-driver-client.cc",
     "engine-driver-client.h",
     "fence.cc",
@@ -97,7 +95,6 @@
     "//src/graphics/display/lib/api-types-cpp",
     "//src/graphics/display/lib/edid",
     "//src/lib/async-watchdog",
-    "//src/lib/eld",
     "//src/media/audio/drivers/lib/audio-proto-utils",
     "//zircon/system/ulib/async:async-cpp",
     "//zircon/system/ulib/async-loop:async-loop-cpp",
diff --git a/src/graphics/display/drivers/coordinator/controller.cc b/src/graphics/display/drivers/coordinator/controller.cc
index b48d6e9..9e6192c 100644
--- a/src/graphics/display/drivers/coordinator/controller.cc
+++ b/src/graphics/display/drivers/coordinator/controller.cc
@@ -46,7 +46,6 @@
 #include "src/graphics/display/drivers/coordinator/client-priority.h"
 #include "src/graphics/display/drivers/coordinator/client.h"
 #include "src/graphics/display/drivers/coordinator/display-info.h"
-#include "src/graphics/display/drivers/coordinator/eld.h"
 #include "src/graphics/display/drivers/coordinator/image.h"
 #include "src/graphics/display/drivers/coordinator/layer.h"
 #include "src/graphics/display/drivers/coordinator/migration-util.h"
@@ -159,13 +158,6 @@
 
   fbl::RefPtr<DisplayInfo> display_info = std::move(display_info_result).value();
   DisplayId display_id = display_info->id;
-  if (display_info->edid.has_value()) {
-    fbl::Array<uint8_t> eld = ComputeEld(display_info->edid->base);
-
-    // The array is empty if memory allocation failed. We prefer using an
-    // empty ELD to dropping the display altogether.
-    engine_driver_client_->SetEld(display_id, eld);
-  }
 
   fbl::AutoLock lock(mtx());
   auto display_it = displays_.find(display_id);
diff --git a/src/graphics/display/drivers/coordinator/eld.cc b/src/graphics/display/drivers/coordinator/eld.cc
deleted file mode 100644
index 2f6e21f..0000000
--- a/src/graphics/display/drivers/coordinator/eld.cc
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright 2021 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "src/graphics/display/drivers/coordinator/eld.h"
-
-#include <zircon/assert.h>
-
-#include <cstddef>
-#include <cstdint>
-#include <cstring>
-#include <limits>
-
-#include <fbl/array.h>
-
-#include "src/graphics/display/lib/edid/edid.h"
-#include "src/lib/eld/eld.h"
-
-namespace display {
-
-fbl::Array<uint8_t> ComputeEld(const edid::Edid& edid) {
-  // First we calculate the total length so we can allocate.
-  // The total ELD length of the ELD includes the ELD header, the ELD baseline (parts 1, 2 and 3)
-  // and the any vendor specific data (not suported).
-
-  // We need the baseline part 2 variable length from the monitor name.
-  // We populate up to kEldMonitorNameMaxLength bytes of monitor name.
-  constexpr size_t kMaxMonitorNameStringLength = 16;
-  size_t monitor_name_string_len = strlen(edid.monitor_name());
-  if (monitor_name_string_len > kMaxMonitorNameStringLength) {
-    monitor_name_string_len = kMaxMonitorNameStringLength;
-  }
-  const size_t eld_baseline_part2_length = monitor_name_string_len;
-
-  // We need the number of short audio descriptors to calculate the baseline part 3 length.
-  size_t number_of_short_audio_descriptors = 0;
-  for (auto it = edid::audio_data_block_iterator(&edid); it.is_valid(); ++it) {
-    if (it->format() != edid::ShortAudioDescriptor::kLPcm) {
-      // TODO(andresoportus): Add compressed formats.
-      continue;
-    }
-    number_of_short_audio_descriptors++;
-  }
-  const size_t eld_baseline_part3_length =
-      number_of_short_audio_descriptors * sizeof(edid::ShortAudioDescriptor);
-
-  // Now we can calculate the ELD length.
-  size_t eld_length = sizeof(hda::EldHeader) + sizeof(hda::EldBaselinePart1) +
-                      eld_baseline_part2_length + eld_baseline_part3_length;
-  eld_length = (eld_length + 3) & ~3;  //  Make the ELD length multiple of 4.
-
-  // With the ELD length we can allocate and then fill in the data.
-  //
-  // The array is default-initialized, so all ELD fields are set to zero.
-  fbl::Array<uint8_t> eld = fbl::MakeArray<uint8_t>(eld_length);
-  if (eld.empty()) {
-    // Array allocation failed.
-    return eld;
-  }
-
-  // Fill the data, moving pointer p along the way.
-  uint8_t* p = eld.get();
-
-  // Populate the ELD header.
-  hda::EldHeader* header = reinterpret_cast<hda::EldHeader*>(p);
-  header->set_eld_ver(2);
-  // These asserts guarantee the cast directly below will not cause UB.
-  ZX_ASSERT_MSG(eld_length > 0, "Overflow while computing ELD length");
-  ZX_ASSERT(eld_length < std::numeric_limits<uint32_t>::max());
-  header->set_baseline_eld_len(static_cast<uint32_t>(eld_length));
-  p += sizeof(hda::EldHeader);
-
-  // Populate the ELD baseline part 1.
-  hda::EldBaselinePart1* part1 = reinterpret_cast<hda::EldBaselinePart1*>(p);
-  // "with CEA-861-C and continuing through present, incrementing the version number is no longer
-  // required. The revision number shall be set to 0x03"
-  part1->set_cea_edid_ver(3);
-  // The cast does not cause UB because monitor_name_string_len has an upper
-  // bound of kMaxMonitorNameStringLength, which is 16.
-  part1->set_mnl(static_cast<char>(monitor_name_string_len));
-  part1->set_sad_count(static_cast<uint8_t>(number_of_short_audio_descriptors));
-  part1->set_conn_type(edid.is_hdmi() ? 0 : 1);
-  part1->set_s_ai(0);          // Not supported: ACP, ISRC1, or ISRC2 packets.
-  part1->set_hdcp(0);          // Not supported.
-  part1->aud_synch_delay = 0;  // Not supported.
-  part1->byte4 = 0;            // Not supported: FLR, LFE, FC, RLR, RC, FLRC, RLRC.
-  part1->port_id = 0;          // Not supported.
-  part1->manufacturer_name = edid.manufacturer_name_code();
-  part1->product_code = edid.product_code();
-  p += sizeof(hda::EldBaselinePart1);
-
-  // Populate the ELD baseline part 2: monitor_name_string.
-  memcpy(p, edid.monitor_name(), monitor_name_string_len);
-  p += monitor_name_string_len;
-
-  // Populate the ELD baseline part 3: short audio descriptors.
-  for (auto it = edid::audio_data_block_iterator(&edid); it.is_valid(); ++it) {
-    if (it->format() != edid::ShortAudioDescriptor::kLPcm) {
-      // TODO(andresoportus): Add compressed formats.
-      continue;
-    }
-    edid::ShortAudioDescriptor* sad = reinterpret_cast<edid::ShortAudioDescriptor*>(p);
-    p += sizeof(edid::ShortAudioDescriptor);
-    *sad = *it;
-  }
-  // We don't populate the vendor specific block.
-
-  return eld;
-}
-
-}  // namespace display
diff --git a/src/graphics/display/drivers/coordinator/eld.h b/src/graphics/display/drivers/coordinator/eld.h
deleted file mode 100644
index e8a15fc..0000000
--- a/src/graphics/display/drivers/coordinator/eld.h
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2021 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SRC_GRAPHICS_DISPLAY_DRIVERS_COORDINATOR_ELD_H_
-#define SRC_GRAPHICS_DISPLAY_DRIVERS_COORDINATOR_ELD_H_
-
-#include <cstdint>
-
-#include <fbl/array.h>
-
-#include "src/graphics/display/lib/edid/edid.h"
-
-namespace display {
-
-// Returns an empty array if memory allocation failed.
-fbl::Array<uint8_t> ComputeEld(const edid::Edid& edid);
-
-}  // namespace display
-
-#endif  // SRC_GRAPHICS_DISPLAY_DRIVERS_COORDINATOR_ELD_H_
diff --git a/src/graphics/display/drivers/coordinator/engine-driver-client.cc b/src/graphics/display/drivers/coordinator/engine-driver-client.cc
index b9bc460..4cf3f11 100644
--- a/src/graphics/display/drivers/coordinator/engine-driver-client.cc
+++ b/src/graphics/display/drivers/coordinator/engine-driver-client.cc
@@ -184,15 +184,6 @@
   dc_.ApplyConfiguration(display_config_list, display_config_count, config_stamp);
 }
 
-void EngineDriverClient::SetEld(DisplayId display_id, cpp20::span<const uint8_t> raw_eld) {
-  if (use_engine_) {
-    return;
-  }
-
-  ZX_DEBUG_ASSERT(dc_.is_valid());
-  dc_.SetEld(ToBanjoDisplayId(display_id), raw_eld.data(), raw_eld.size());
-}
-
 void EngineDriverClient::SetDisplayControllerInterface(
     const display_controller_interface_protocol_t& protocol) {
   if (use_engine_) {
diff --git a/src/graphics/display/drivers/coordinator/engine-driver-client.h b/src/graphics/display/drivers/coordinator/engine-driver-client.h
index fa4a828..e9e5a8c 100644
--- a/src/graphics/display/drivers/coordinator/engine-driver-client.h
+++ b/src/graphics/display/drivers/coordinator/engine-driver-client.h
@@ -56,8 +56,6 @@
   void ApplyConfiguration(const display_config_t* display_config_list, size_t display_config_count,
                           const config_stamp_t* config_stamp);
 
-  void SetEld(DisplayId display_id, cpp20::span<const uint8_t> raw_eld);
-
   // TODO(https://fxbug.dev/314126494): These methods are only used in the
   // banjo transport. Remove when all drivers are migrated to FIDL transport.
   void SetDisplayControllerInterface(const display_controller_interface_protocol_t& protocol);
diff --git a/src/graphics/display/drivers/coordinator/tests/BUILD.gn b/src/graphics/display/drivers/coordinator/tests/BUILD.gn
index ea9add5..339e7d1 100644
--- a/src/graphics/display/drivers/coordinator/tests/BUILD.gn
+++ b/src/graphics/display/drivers/coordinator/tests/BUILD.gn
@@ -9,7 +9,6 @@
   configs += [ "//build/config:all_source" ]
   sources = [
     "display-test.cc",
-    "eld-test.cc",
     "fence-test.cc",
     "image-test.cc",
     "inspect-test.cc",
diff --git a/src/graphics/display/drivers/coordinator/tests/eld-test.cc b/src/graphics/display/drivers/coordinator/tests/eld-test.cc
deleted file mode 100644
index 0185ded..0000000
--- a/src/graphics/display/drivers/coordinator/tests/eld-test.cc
+++ /dev/null
@@ -1,153 +0,0 @@
-// Copyright 2021 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "src/graphics/display/drivers/coordinator/eld.h"
-
-#include <gtest/gtest.h>
-#include <src/lib/eld/eld.h>
-
-namespace display {
-
-TEST(EldTest, eld1) {
-  static uint8_t edid1[] = {
-      0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x1E, 0x6D, 0xB8, 0x5A, 0x01, 0x01, 0x01,
-      0x01, 0x01, 0x18, 0x01, 0x03, 0x80, 0x30, 0x1B, 0x78, 0xEA, 0x31, 0x35, 0xA5, 0x55, 0x4E,
-      0xA1, 0x26, 0x0C, 0x50, 0x54, 0xA5, 0x4B, 0x00, 0x71, 0x4F, 0x81, 0x80, 0x95, 0x00, 0xB3,
-      0x00, 0xA9, 0xC0, 0x81, 0x00, 0x81, 0xC0, 0x90, 0x40, 0x02, 0x3A, 0x80, 0x18, 0x71, 0x38,
-      0x2D, 0x40, 0x58, 0x2C, 0x45, 0x00, 0xE0, 0x0E, 0x11, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00,
-      0xFD, 0x00, 0x38, 0x4B, 0x1E, 0x53, 0x0F, 0x00, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x00, 0x00, 0x00, 0xFC, 0x00, 0x4C, 0x47, 0x20, 0x49, 0x50, 0x53, 0x20, 0x46, 0x55, 0x4C,
-      0x4C, 0x48, 0x44, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x01, 0x64, 0x02, 0x03, 0x1D, 0xF1, 0x4A, 0x90, 0x04,
-      0x03, 0x01, 0x14, 0x12, 0x05, 0x1F, 0x10, 0x13, 0x23, 0x09, 0x07, 0x07, 0x83, 0x01, 0x00,
-      0x00, 0x65, 0x03, 0x0C, 0x00, 0x10, 0x00, 0x02, 0x3A, 0x80, 0x18, 0x71, 0x38, 0x2D, 0x40,
-      0x58, 0x2C, 0x45, 0x00, 0xE0, 0x0E, 0x11, 0x00, 0x00, 0x1E, 0x01, 0x1D, 0x80, 0x18, 0x71,
-      0x1C, 0x16, 0x20, 0x58, 0x2C, 0x25, 0x00, 0xE0, 0x0E, 0x11, 0x00, 0x00, 0x9E, 0x01, 0x1D,
-      0x00, 0x72, 0x51, 0xD0, 0x1E, 0x20, 0x6E, 0x28, 0x55, 0x00, 0xE0, 0x0E, 0x11, 0x00, 0x00,
-      0x1E, 0x8C, 0x0A, 0xD0, 0x8A, 0x20, 0xE0, 0x2D, 0x10, 0x10, 0x3E, 0x96, 0x00, 0xE0, 0x0E,
-      0x11, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0xAE};
-
-  edid::Edid edid;
-  const char* err_msg = nullptr;
-  ASSERT_TRUE(edid.Init(edid1, sizeof(edid1), &err_msg));
-  fbl::Array<uint8_t> eld = ComputeEld(edid);
-  ASSERT_EQ(eld.size(), 36u);
-  EXPECT_EQ(eld[3], 0x10);  // Version 2.
-
-  const char* monitor_name = "LG IPS FULLHD";
-  size_t monitor_name_length = strlen(monitor_name);
-  EXPECT_EQ(eld[sizeof(hda::EldHeader)], 0x60 | monitor_name_length);  // EDID version 3, mnl.
-  EXPECT_TRUE(memcmp((char*)&eld[20], monitor_name, monitor_name_length) == 0);
-  EXPECT_EQ(eld[sizeof(hda::EldHeader) + 1], 0x10);  // SAD count = 1, other fiels 0.
-
-  EXPECT_EQ(eld[sizeof(hda::EldHeader) + 12], 0x6d);  // Manufacturer id2 for LG.
-  EXPECT_EQ(eld[sizeof(hda::EldHeader) + 13], 0x1e);  // Manufacturer id1 for LG.
-  EXPECT_EQ(eld[sizeof(hda::EldHeader) + 14], 0xb8);  // Product Code2.
-  EXPECT_EQ(eld[sizeof(hda::EldHeader) + 15], 0x5a);  // Product Code1.
-
-  // Short Audio Descriptor.
-  size_t sad_start = sizeof(hda::EldHeader) + sizeof(hda::EldBaselinePart1) + monitor_name_length;
-  EXPECT_EQ(eld[sad_start], 0x09);      // format = 1, num channels minus 1 = 1.
-  EXPECT_EQ(eld[sad_start + 1], 0x07);  // sampling_frequencies 32k, 44.1k and 48k.
-  EXPECT_EQ(eld[sad_start + 2], 0x07);  // All 4 bits for number of bits.
-}
-
-TEST(EldTest, VsyncWithEld2) {
-  static uint8_t edid2[] = {
-      0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x5A, 0x63, 0x34, 0x5B, 0x01, 0x01, 0x01,
-      0x01, 0x2C, 0x1D, 0x01, 0x03, 0x80, 0x5E, 0x35, 0x78, 0x2E, 0x2E, 0xDD, 0xA6, 0x55, 0x4E,
-      0x9A, 0x26, 0x0E, 0x47, 0x4A, 0xBF, 0xEF, 0x80, 0xD1, 0xC0, 0xB3, 0x00, 0xA9, 0x40, 0xA9,
-      0xC0, 0x95, 0x00, 0x90, 0x40, 0x81, 0x80, 0x01, 0x01, 0x4D, 0xD0, 0x00, 0xA0, 0xF0, 0x70,
-      0x3E, 0x80, 0x30, 0x20, 0x35, 0x00, 0xAD, 0x11, 0x32, 0x00, 0x00, 0x1A, 0x56, 0x5E, 0x00,
-      0xA0, 0xA0, 0xA0, 0x29, 0x50, 0x2F, 0x20, 0x35, 0x00, 0xAD, 0x11, 0x32, 0x00, 0x00, 0x1A,
-      0x00, 0x00, 0x00, 0xFD, 0x00, 0x32, 0x4B, 0x18, 0xA0, 0x3C, 0x01, 0x0A, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x56, 0x58, 0x34, 0x33, 0x38, 0x30, 0x20,
-      0x53, 0x45, 0x52, 0x49, 0x45, 0x53, 0x01, 0x2E, 0x02, 0x03, 0x36, 0xF1, 0x54, 0x01, 0x03,
-      0x04, 0x05, 0x07, 0x0A, 0x0B, 0x0E, 0x0F, 0x90, 0x12, 0x13, 0x14, 0x16, 0x1F, 0x60, 0x61,
-      0x65, 0x66, 0x5D, 0x23, 0x09, 0x7F, 0x07, 0x83, 0x01, 0x00, 0x00, 0x67, 0x03, 0x0C, 0x00,
-      0x10, 0x00, 0x38, 0x78, 0x67, 0xD8, 0x5D, 0xC4, 0x01, 0x78, 0x88, 0x03, 0xE4, 0x0F, 0x00,
-      0x80, 0x07, 0x52, 0x6C, 0x80, 0xA0, 0x70, 0x70, 0x3E, 0x80, 0x30, 0x20, 0x3A, 0x00, 0xAD,
-      0x11, 0x32, 0x00, 0x00, 0x1E, 0x1A, 0x68, 0x00, 0xA0, 0xF0, 0x38, 0x1F, 0x40, 0x30, 0x20,
-      0xA3, 0x00, 0xAD, 0x11, 0x32, 0x00, 0x00, 0x18, 0xA3, 0x66, 0x00, 0xA0, 0xF0, 0x70, 0x1F,
-      0x80, 0x30, 0x20, 0x35, 0x00, 0xAD, 0x11, 0x32, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x1A};
-
-  edid::Edid edid;
-  const char* err_msg = nullptr;
-  ASSERT_TRUE(edid.Init(edid2, sizeof(edid2), &err_msg));
-  fbl::Array<uint8_t> eld = ComputeEld(edid);
-  ASSERT_EQ(eld.size(), 36u);
-  EXPECT_EQ(eld[3], 0x10);  // Version 2.
-
-  const char* monitor_name = "VX4380 SERIES";
-  size_t monitor_name_length = strlen(monitor_name);
-  EXPECT_EQ(eld[sizeof(hda::EldHeader)], 0x60 | monitor_name_length);  // EDID version 3, mnl.
-  EXPECT_TRUE(memcmp((char*)&eld[20], monitor_name, monitor_name_length) == 0);
-  EXPECT_EQ(eld[sizeof(hda::EldHeader) + 1], 0x10);  // SAD count = 1, other fiels 0.
-
-  EXPECT_EQ(eld[sizeof(hda::EldHeader) + 12], 0x63);  // Manufacturer id2 for ViewSonic.
-  EXPECT_EQ(eld[sizeof(hda::EldHeader) + 13], 0x5a);  // Manufacturer id1 for ViewSonic.
-  EXPECT_EQ(eld[sizeof(hda::EldHeader) + 14], 0x34);  // Product Code2.
-  EXPECT_EQ(eld[sizeof(hda::EldHeader) + 15], 0x5b);  // Product Code1.
-
-  // Short Audio Descriptor.
-  size_t sad_start = sizeof(hda::EldHeader) + sizeof(hda::EldBaselinePart1) + monitor_name_length;
-  EXPECT_EQ(eld[sad_start], 0x09);      // format = 1, num channels minus 1 = 1.
-  EXPECT_EQ(eld[sad_start + 1], 0x7F);  // All 7 bits for sampling_frequencies.
-  EXPECT_EQ(eld[sad_start + 2], 0x07);  // All 4 bits for number of bits.
-}
-
-TEST(EldTest, VsyncWithEld3) {
-  static uint8_t edid3[] = {
-      0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x1E, 0x6D, 0x08, 0x5B, 0x15, 0x76, 0x01,
-      0x00, 0x09, 0x1B, 0x01, 0x03, 0x80, 0x3C, 0x22, 0x78, 0xEA, 0x30, 0x35, 0xA7, 0x55, 0x4E,
-      0xA3, 0x26, 0x0F, 0x50, 0x54, 0x21, 0x08, 0x00, 0x71, 0x40, 0x81, 0x80, 0x81, 0xC0, 0xA9,
-      0xC0, 0xD1, 0xC0, 0x81, 0x00, 0x01, 0x01, 0x01, 0x01, 0x04, 0x74, 0x00, 0x30, 0xF2, 0x70,
-      0x5A, 0x80, 0xB0, 0x58, 0x8A, 0x00, 0x58, 0x54, 0x21, 0x00, 0x00, 0x1E, 0x56, 0x5E, 0x00,
-      0xA0, 0xA0, 0xA0, 0x29, 0x50, 0x30, 0x20, 0x35, 0x00, 0x58, 0x54, 0x21, 0x00, 0x00, 0x1A,
-      0x00, 0x00, 0x00, 0xFD, 0x00, 0x38, 0x3D, 0x1E, 0x87, 0x1E, 0x00, 0x0A, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x4C, 0x47, 0x20, 0x55, 0x6C, 0x74, 0x72,
-      0x61, 0x20, 0x48, 0x44, 0x0A, 0x20, 0x01, 0xF7, 0x02, 0x03, 0x1D, 0x71, 0x46, 0x90, 0x22,
-      0x05, 0x04, 0x03, 0x01, 0x23, 0x09, 0x07, 0x07, 0x6D, 0x03, 0x0C, 0x00, 0x10, 0x00, 0xB8,
-      0x3C, 0x20, 0x00, 0x60, 0x01, 0x02, 0x03, 0x02, 0x3A, 0x80, 0x18, 0x71, 0x38, 0x2D, 0x40,
-      0x58, 0x2C, 0x45, 0x00, 0x58, 0x54, 0x21, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0xFF, 0x00,
-      0x37, 0x30, 0x39, 0x4E, 0x54, 0x42, 0x4B, 0x32, 0x54, 0x37, 0x36, 0x35, 0x0A, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x8A};
-
-  edid::Edid edid;
-  const char* err_msg = nullptr;
-  ASSERT_TRUE(edid.Init(edid3, sizeof(edid3), &err_msg));
-  fbl::Array<uint8_t> eld = ComputeEld(edid);
-  ASSERT_EQ(eld.size(), 36u);
-  EXPECT_EQ(eld[3], 0x10);  // Version 2.
-
-  const char* monitor_name = "LG Ultra HD";
-  size_t monitor_name_length = strlen(monitor_name);
-  EXPECT_EQ(eld[sizeof(hda::EldHeader)], 0x60 | monitor_name_length);  // EDID version 3, mnl.
-  EXPECT_TRUE(memcmp((char*)&eld[20], monitor_name, monitor_name_length) == 0);
-  EXPECT_EQ(eld[sizeof(hda::EldHeader) + 1], 0x10);  // SAD count = 1, other fiels 0.
-
-  EXPECT_EQ(eld[sizeof(hda::EldHeader) + 12], 0x6d);  // Manufacturer id2 for LG.
-  EXPECT_EQ(eld[sizeof(hda::EldHeader) + 13], 0x1e);  // Manufacturer id1 for LG.
-  EXPECT_EQ(eld[sizeof(hda::EldHeader) + 14], 0x08);  // Product Code2
-  EXPECT_EQ(eld[sizeof(hda::EldHeader) + 15], 0x5b);  // Product Code1
-
-  // Short Audio Descriptor.
-  size_t sad_start = sizeof(hda::EldHeader) + sizeof(hda::EldBaselinePart1) + monitor_name_length;
-  EXPECT_EQ(eld[sad_start], 0x09);      // format = 1, num channels minus 1 = 1.
-  EXPECT_EQ(eld[sad_start + 1], 0x07);  // sampling_frequencies 32k, 44.1k and 48k.
-  EXPECT_EQ(eld[sad_start + 2], 0x07);  // All 4 bits for number of bits.
-
-  EXPECT_EQ(eld[34], 0x00);  // Alignment bytes must be zero.
-  EXPECT_EQ(eld[35], 0x00);  // Alignment bytes must be zero.
-}
-
-}  // namespace display
diff --git a/src/graphics/display/drivers/fake/fake-display.cc b/src/graphics/display/drivers/fake/fake-display.cc
index 4d1203d4..4722ca7 100644
--- a/src/graphics/display/drivers/fake/fake-display.cc
+++ b/src/graphics/display/drivers/fake/fake-display.cc
@@ -401,9 +401,6 @@
   current_config_stamp_.store(config_stamp, std::memory_order_relaxed);
 }
 
-void FakeDisplay::DisplayControllerImplSetEld(uint64_t display_id, const uint8_t* raw_eld_list,
-                                              size_t raw_eld_count) {}
-
 enum class FakeDisplay::BufferCollectionUsage {
   kPrimaryLayer = 1,
   kCapture = 2,
diff --git a/src/graphics/display/drivers/fake/fake-display.h b/src/graphics/display/drivers/fake/fake-display.h
index 7f86d7c..b209271 100644
--- a/src/graphics/display/drivers/fake/fake-display.h
+++ b/src/graphics/display/drivers/fake/fake-display.h
@@ -90,8 +90,6 @@
   void DisplayControllerImplApplyConfiguration(const display_config_t* display_configs,
                                                size_t display_count,
                                                const config_stamp_t* banjo_config_stamp);
-  void DisplayControllerImplSetEld(uint64_t display_id, const uint8_t* raw_eld_list,
-                                   size_t raw_eld_count);
   zx_status_t DisplayControllerImplSetBufferCollectionConstraints(
       const image_buffer_usage_t* usage, uint64_t banjo_driver_buffer_collection_id);
   zx_status_t DisplayControllerImplSetDisplayPower(uint64_t display_id, bool power_on);
diff --git a/src/graphics/display/drivers/goldfish-display/display-engine.h b/src/graphics/display/drivers/goldfish-display/display-engine.h
index a87becd..8c2f164 100644
--- a/src/graphics/display/drivers/goldfish-display/display-engine.h
+++ b/src/graphics/display/drivers/goldfish-display/display-engine.h
@@ -74,8 +74,6 @@
   void DisplayControllerImplApplyConfiguration(const display_config_t* display_config,
                                                size_t display_count,
                                                const config_stamp_t* banjo_config_stamp);
-  void DisplayControllerImplSetEld(uint64_t display_id, const uint8_t* raw_eld_list,
-                                   size_t raw_eld_count) {}  // No ELD required for non-HDA systems.
   zx_status_t DisplayControllerImplSetBufferCollectionConstraints(
       const image_buffer_usage_t* usage, uint64_t banjo_driver_buffer_collection_id);
   zx_status_t DisplayControllerImplSetDisplayPower(uint64_t display_id, bool power_on) {
diff --git a/src/graphics/display/drivers/intel-i915/intel-i915.cc b/src/graphics/display/drivers/intel-i915/intel-i915.cc
index 150853c..ec0ca6c 100644
--- a/src/graphics/display/drivers/intel-i915/intel-i915.cc
+++ b/src/graphics/display/drivers/intel-i915/intel-i915.cc
@@ -762,13 +762,6 @@
 }
 
 void Controller::RemoveDisplay(std::unique_ptr<DisplayDevice> display) {
-  // Invalidate and disable any ELD.
-  if (display->id() == eld_display_id_) {
-    auto audio_pin = registers::AudioPinEldCPReadyStatus::Get().ReadFrom(mmio_space());
-    audio_pin.set_eld_valid_a(0).set_audio_enable_a(0).WriteTo(mmio_space());
-    eld_display_id_.reset();
-  }
-
   // Make sure the display's resources get freed before reallocating the pipe buffers by letting
   // "display" go out of scope.
 }
@@ -1827,36 +1820,6 @@
   return is_tgl(device_id_) ? kTigerLakeDataBufferBlockCount : kKabyLakeDataBufferBlockCount;
 }
 
-void Controller::DisplayControllerImplSetEld(uint64_t banjo_display_id, const uint8_t* raw_eld_list,
-                                             size_t raw_eld_count) {
-  const display::DisplayId display_id = display::ToDisplayId(banjo_display_id);
-  // We use the first "a" of the 3 ELD slots in the datasheet.
-  if (eld_display_id_.has_value() && eld_display_id_.value() != display_id) {
-    zxlogf(ERROR, "ELD display already in use");
-    return;
-  }
-  eld_display_id_ = display_id;
-
-  constexpr size_t kMaxEldLength = 48;
-  size_t length = std::min<size_t>(raw_eld_count, kMaxEldLength);
-  auto edid0 = registers::AudEdidData::Get(0).ReadFrom(mmio_space());
-  auto audio_pin = registers::AudioPinEldCPReadyStatus::Get().ReadFrom(mmio_space());
-  auto ctrl = registers::AudioDipEldControlStatus::Get().ReadFrom(mmio_space());
-  audio_pin.set_audio_enable_a(1).set_eld_valid_a(0).WriteTo(mmio_space());
-
-  // TODO(andresoportus): We should "Wait for 2 vertical blanks" if we do this with the display
-  // enabled.
-
-  ctrl.set_eld_access_address(0).WriteTo(mmio_space());
-  ZX_ASSERT(!(length % 4));  // We don't use vendor block so length is multiple of 4.
-  for (size_t i = 0; i < length; i += 4) {
-    edid0.set_data(raw_eld_list[i] | (raw_eld_list[i + 1] << 8) | (raw_eld_list[i + 2] << 16) |
-                   (raw_eld_list[i + 3] << 24));
-    edid0.WriteTo(mmio_space());
-  }
-  audio_pin.set_eld_valid_a(1).WriteTo(mmio_space());
-}
-
 void Controller::DisplayControllerImplApplyConfiguration(
     const display_config_t* banjo_display_configs, size_t display_config_count,
     const config_stamp_t* banjo_config_stamp) {
diff --git a/src/graphics/display/drivers/intel-i915/intel-i915.h b/src/graphics/display/drivers/intel-i915/intel-i915.h
index be96da4..72667a4 100644
--- a/src/graphics/display/drivers/intel-i915/intel-i915.h
+++ b/src/graphics/display/drivers/intel-i915/intel-i915.h
@@ -100,8 +100,6 @@
   void DisplayControllerImplApplyConfiguration(const display_config_t* banjo_display_configs,
                                                size_t display_config_count,
                                                const config_stamp_t* banjo_config_stamp);
-  void DisplayControllerImplSetEld(uint64_t banjo_display_id, const uint8_t* raw_eld_list,
-                                   size_t raw_eld_count);
   zx_status_t DisplayControllerImplSetBufferCollectionConstraints(
       const image_buffer_usage_t* usage, uint64_t banjo_driver_buffer_collection_id);
   zx_status_t DisplayControllerImplSetDisplayPower(uint64_t banjo_display_id, bool power_on) {
@@ -343,8 +341,6 @@
   // Various configuration values set by the BIOS which need to be carried across suspend.
   bool ddi_e_disabled_ = true;
 
-  std::optional<display::DisplayId> eld_display_id_;
-
   // Debug
   inspect::Inspector inspector_;
   inspect::Node root_node_;
diff --git a/src/graphics/display/drivers/intel-i915/registers.h b/src/graphics/display/drivers/intel-i915/registers.h
index 0bfb392..767b236 100644
--- a/src/graphics/display/drivers/intel-i915/registers.h
+++ b/src/graphics/display/drivers/intel-i915/registers.h
@@ -542,58 +542,6 @@
   static auto Get() { return hwreg::RegisterAddr<FuseStatus>(0x42000); }
 };
 
-// AUD_EDID_DATA
-class AudEdidData : public hwreg::RegisterBase<AudEdidData, uint32_t> {
- public:
-  DEF_FIELD(31, 0, data);
-
-  static auto Get(int transcoder_id) {
-    if (transcoder_id == 0) {
-      return hwreg::RegisterAddr<AudEdidData>(0x65050);
-    } else if (transcoder_id == 1) {
-      return hwreg::RegisterAddr<AudEdidData>(0x65150);
-    } else {  // transcoder_id == 2.
-      ZX_DEBUG_ASSERT(transcoder_id == 2);
-      return hwreg::RegisterAddr<AudEdidData>(0x65250);
-    }
-  }
-};
-
-// AUD_DIP_ELD_CTRL_ST
-class AudioDipEldControlStatus : public hwreg::RegisterBase<AudioDipEldControlStatus, uint32_t> {
- public:
-  DEF_FIELD(30, 29, dip_port_select);
-  DEF_FIELD(24, 21, dip_type_enable_status);
-  DEF_FIELD(20, 18, dip_buffer_index);
-  DEF_FIELD(17, 16, dip_transmission_frequency);
-  DEF_FIELD(14, 10, eld_buffer_size);
-  DEF_FIELD(9, 5, eld_access_address);
-  DEF_BIT(4, eld_ack);
-  DEF_FIELD(3, 0, dip_access_address);
-  static auto Get() { return hwreg::RegisterAddr<AudioDipEldControlStatus>(0x650B4); }
-};
-
-// AUD_PIN_ELD_CP_VLD
-class AudioPinEldCPReadyStatus : public hwreg::RegisterBase<AudioPinEldCPReadyStatus, uint32_t> {
- public:
-  DEF_BIT(11, audio_inactive_c);
-  DEF_BIT(10, audio_enable_c);
-  DEF_BIT(9, cp_ready_c);
-  DEF_BIT(8, eld_valid_c);
-
-  DEF_BIT(7, audio_inactive_b);
-  DEF_BIT(6, audio_enable_b);
-  DEF_BIT(5, cp_ready_b);
-  DEF_BIT(4, eld_valid_b);
-
-  DEF_BIT(3, audio_inactive_a);
-  DEF_BIT(2, audio_enable_a);
-  DEF_BIT(1, cp_ready_a);
-  DEF_BIT(0, eld_valid_a);
-
-  static auto Get() { return hwreg::RegisterAddr<AudioPinEldCPReadyStatus>(0x650C0); }
-};
-
 // CDCLK_CTL (CD Clock Control)
 //
 // Tiger Lake: IHD-OS-TGL-Vol 2c-12.21 Part 1 pages 220-222
diff --git a/src/graphics/display/drivers/simple/simple-display.h b/src/graphics/display/drivers/simple/simple-display.h
index 024aa0a..6aefe3f 100644
--- a/src/graphics/display/drivers/simple/simple-display.h
+++ b/src/graphics/display/drivers/simple/simple-display.h
@@ -79,8 +79,6 @@
   void DisplayControllerImplApplyConfiguration(const display_config_t* display_config,
                                                size_t display_count,
                                                const config_stamp_t* banjo_config_stamp);
-  void DisplayControllerImplSetEld(uint64_t display_id, const uint8_t* raw_eld_list,
-                                   size_t raw_eld_count) {}  // No ELD required for non-HDA systems.
   zx_status_t DisplayControllerImplSetBufferCollectionConstraints(
       const image_buffer_usage_t* usage, uint64_t banjo_driver_buffer_collection_id);
   zx_status_t DisplayControllerImplSetDisplayPower(uint64_t display_id, bool power_on) {
diff --git a/src/graphics/display/drivers/virtio-guest/v1/display-controller-banjo.cc b/src/graphics/display/drivers/virtio-guest/v1/display-controller-banjo.cc
index 4d0b318..044ff07 100644
--- a/src/graphics/display/drivers/virtio-guest/v1/display-controller-banjo.cc
+++ b/src/graphics/display/drivers/virtio-guest/v1/display-controller-banjo.cc
@@ -126,14 +126,6 @@
   return engine_.ApplyConfiguration(display_configs, banjo_config_stamp);
 }
 
-void DisplayControllerBanjo::DisplayControllerImplSetEld(uint64_t banjo_display_id,
-                                                         const uint8_t* raw_eld_list,
-                                                         size_t raw_eld_count) {
-  const display::DisplayId display_id = display::ToDisplayId(banjo_display_id);
-  const cpp20::span<const uint8_t> raw_eld(raw_eld_list, raw_eld_count);
-  engine_.SetEld(display_id, raw_eld);
-}
-
 zx_status_t DisplayControllerBanjo::DisplayControllerImplSetBufferCollectionConstraints(
     const image_buffer_usage_t* banjo_image_buffer_usage,
     uint64_t banjo_driver_buffer_collection_id) {
diff --git a/src/graphics/display/drivers/virtio-guest/v1/display-controller-banjo.h b/src/graphics/display/drivers/virtio-guest/v1/display-controller-banjo.h
index 2e22599..e2d60c6 100644
--- a/src/graphics/display/drivers/virtio-guest/v1/display-controller-banjo.h
+++ b/src/graphics/display/drivers/virtio-guest/v1/display-controller-banjo.h
@@ -55,8 +55,6 @@
   void DisplayControllerImplApplyConfiguration(const display_config_t* banjo_display_configs,
                                                size_t banjo_display_configs_count,
                                                const config_stamp_t* banjo_config_stamp);
-  void DisplayControllerImplSetEld(uint64_t banjo_display_id, const uint8_t* raw_eld_list,
-                                   size_t raw_eld_count);
   zx_status_t DisplayControllerImplSetBufferCollectionConstraints(
       const image_buffer_usage_t* banjo_image_buffer_usage,
       uint64_t banjo_driver_buffer_collection_id);
diff --git a/src/graphics/display/drivers/virtio-guest/v1/display-engine-interface.h b/src/graphics/display/drivers/virtio-guest/v1/display-engine-interface.h
index a1a2ba9..84d8473 100644
--- a/src/graphics/display/drivers/virtio-guest/v1/display-engine-interface.h
+++ b/src/graphics/display/drivers/virtio-guest/v1/display-engine-interface.h
@@ -63,8 +63,6 @@
   virtual void ApplyConfiguration(cpp20::span<const display_config_t> display_configs,
                                   const config_stamp_t* banjo_config_stamp) = 0;
 
-  virtual void SetEld(display::DisplayId display_id, cpp20::span<const uint8_t> raw_eld) = 0;
-
   virtual zx::result<> SetBufferCollectionConstraints(
       const display::ImageBufferUsage& image_buffer_usage,
       display::DriverBufferCollectionId driver_buffer_collection_id) = 0;
diff --git a/src/graphics/display/drivers/virtio-guest/v1/display-engine.cc b/src/graphics/display/drivers/virtio-guest/v1/display-engine.cc
index dcf8f16..189c170 100644
--- a/src/graphics/display/drivers/virtio-guest/v1/display-engine.cc
+++ b/src/graphics/display/drivers/virtio-guest/v1/display-engine.cc
@@ -347,11 +347,6 @@
   }
 }
 
-void DisplayEngine::SetEld(display::DisplayId display_id, cpp20::span<const uint8_t> raw_eld) {
-  // No ELD required for non-HDA systems.
-  return;
-}
-
 zx::result<> DisplayEngine::SetBufferCollectionConstraints(
     const display::ImageBufferUsage& image_buffer_usage,
     display::DriverBufferCollectionId driver_buffer_collection_id) {
diff --git a/src/graphics/display/drivers/virtio-guest/v1/display-engine.h b/src/graphics/display/drivers/virtio-guest/v1/display-engine.h
index 5f6d23d..81b68d9 100644
--- a/src/graphics/display/drivers/virtio-guest/v1/display-engine.h
+++ b/src/graphics/display/drivers/virtio-guest/v1/display-engine.h
@@ -89,7 +89,6 @@
       size_t* out_client_composition_opcodes_actual) override;
   void ApplyConfiguration(cpp20::span<const display_config_t> display_configs,
                           const config_stamp_t* banjo_config_stamp) override;
-  void SetEld(display::DisplayId display_id, cpp20::span<const uint8_t> raw_eld) override;
   zx::result<> SetBufferCollectionConstraints(
       const display::ImageBufferUsage& image_buffer_usage,
       display::DriverBufferCollectionId driver_buffer_collection_id) override;
diff --git a/src/graphics/display/drivers/virtio-guest/v2/gpu-device.h b/src/graphics/display/drivers/virtio-guest/v2/gpu-device.h
index 55828d1..57ca5f2 100644
--- a/src/graphics/display/drivers/virtio-guest/v2/gpu-device.h
+++ b/src/graphics/display/drivers/virtio-guest/v2/gpu-device.h
@@ -69,8 +69,6 @@
                           CheckConfigurationCompleter::Sync& completer) override {}
   void ApplyConfiguration(ApplyConfigurationRequestView request, fdf::Arena& arena,
                           ApplyConfigurationCompleter::Sync& completer) override {}
-  void SetEld(SetEldRequestView request, fdf::Arena& arena,
-              SetEldCompleter::Sync& completer) override {}
   void SetBufferCollectionConstraints(
       SetBufferCollectionConstraintsRequestView request, fdf::Arena& arena,
       SetBufferCollectionConstraintsCompleter::Sync& completer) override {}
diff --git a/src/lib/ddktl/include/ddktl/device.h b/src/lib/ddktl/include/ddktl/device.h
index 6731f1c..864bf69 100644
--- a/src/lib/ddktl/include/ddktl/device.h
+++ b/src/lib/ddktl/include/ddktl/device.h
@@ -319,6 +319,39 @@
   std::vector<device_metadata_t> metadata_list_;
 };
 
+// Factory functions to create a zx_device_str_prop_t.
+inline zx_device_str_prop_t MakeStrProperty(const std::string& key, uint32_t val) {
+  return {key.c_str(), str_prop_int_val(val)};
+}
+
+inline zx_device_str_prop_t MakeStrProperty(const char* key, uint32_t val) {
+  return {key, str_prop_int_val(val)};
+}
+
+inline zx_device_str_prop_t MakeStrProperty(const std::string& key, bool val) {
+  return {key.c_str(), str_prop_bool_val(val)};
+}
+
+inline zx_device_str_prop_t MakeStrProperty(const char* key, bool val) {
+  return {key, str_prop_bool_val(val)};
+}
+
+inline zx_device_str_prop_t MakeStrProperty(const std::string& key, const std::string& val) {
+  return {key.c_str(), str_prop_str_val(val.c_str())};
+}
+
+inline zx_device_str_prop_t MakeStrProperty(const char* key, const std::string& val) {
+  return {key, str_prop_str_val(val.c_str())};
+}
+
+inline zx_device_str_prop_t MakeStrProperty(const std::string& key, const char* val) {
+  return {key.c_str(), str_prop_str_val(val)};
+}
+
+inline zx_device_str_prop_t MakeStrProperty(const char* key, const char* val) {
+  return {key, str_prop_str_val(val)};
+}
+
 class DeviceAddArgs {
  public:
   explicit DeviceAddArgs(const char* name) {
diff --git a/src/sys/pkg/bin/pm/cmd/pm/pm.go b/src/sys/pkg/bin/pm/cmd/pm/pm.go
index 0b319e3..2e199e3 100644
--- a/src/sys/pkg/bin/pm/cmd/pm/pm.go
+++ b/src/sys/pkg/bin/pm/cmd/pm/pm.go
@@ -15,7 +15,6 @@
 	"go.fuchsia.dev/fuchsia/src/sys/pkg/bin/pm/build"
 	"go.fuchsia.dev/fuchsia/src/sys/pkg/bin/pm/cmd/pm/archive"
 	buildcmd "go.fuchsia.dev/fuchsia/src/sys/pkg/bin/pm/cmd/pm/build"
-	initcmd "go.fuchsia.dev/fuchsia/src/sys/pkg/bin/pm/cmd/pm/init"
 	"go.fuchsia.dev/fuchsia/src/sys/pkg/bin/pm/cmd/pm/publish"
 	"go.fuchsia.dev/fuchsia/src/sys/pkg/bin/pm/cmd/pm/seal"
 	"go.fuchsia.dev/fuchsia/src/sys/pkg/bin/pm/cmd/pm/serve"
@@ -30,7 +29,6 @@
            through ffx. Please adapt workflows accordingly.
 
 Package Commands:
-    init     - initialize a package meta directory in the standard form
     build    - perform update and seal in order
     update   - update the merkle roots in meta/contents
     seal     - seal package metadata into a meta.far
@@ -98,7 +96,9 @@
 		err = nil
 
 	case "init":
-		err = initcmd.Run(cfg, flag.Args()[1:])
+		url := "https://fuchsia.dev/fuchsia-src/development/idk/documentation/packages"
+		fmt.Fprintf(os.Stderr, "please create the meta directory and the meta package file according to %v", url)
+		err = nil
 
 	case "publish":
 		err = publish.Run(cfg, flag.Args()[1:])
diff --git a/third_party/gvisor_syscall_tests/expects/netstack3/generic.json5 b/third_party/gvisor_syscall_tests/expects/netstack3/generic.json5
index f49c03d..becc96c 100644
--- a/third_party/gvisor_syscall_tests/expects/netstack3/generic.json5
+++ b/third_party/gvisor_syscall_tests/expects/netstack3/generic.json5
@@ -14,10 +14,6 @@
                 "SocketTest.UnixSocketStatFS",
                 "OpenModes/SocketOpenTest.Unix/*",
 
-                // Netstack3 does not support SO_REUSEADDR for UDP.
-                "IPUnboundSockets/IPUnboundSocketTest.ReuseAddrDefault/[0123]",
-                "IPUnboundSockets/IPUnboundSocketTest.SetReuseAddr/[0123]",
-
                 // Netstack3 does not support many UDP socket options or operations
                 "IPUnboundSockets/IPUnboundSocketTest.CheckSkipECN/*",
                 "IPUnboundSockets/IPUnboundSocketTest.InvalidLargeTOS/*",
diff --git a/third_party/gvisor_syscall_tests/expects/netstack3/loopback_isolated.json5 b/third_party/gvisor_syscall_tests/expects/netstack3/loopback_isolated.json5
index 2161b01..df7fee1 100644
--- a/third_party/gvisor_syscall_tests/expects/netstack3/loopback_isolated.json5
+++ b/third_party/gvisor_syscall_tests/expects/netstack3/loopback_isolated.json5
@@ -37,7 +37,6 @@
                 "AllFamilies/SocketMultiProtocolInetLoopbackIsolatedTest.BindToDeviceReusePort/TCP",
 
                 // Netstack3 does not have complete support for multicast sockets.
-                "AllFamilies/SocketMultiProtocolInetLoopbackIsolatedTest.V4EphemeralPortReservedReuseAddr/UDP",
                 "AllFamilies/SocketMultiProtocolInetLoopbackIsolatedTest.V4MappedEphemeralPortReservedReuseAddr/UDP",
                 "AllFamilies/SocketMultiProtocolInetLoopbackIsolatedTest.V6EphemeralPortReservedReuseAddr/UDP",
             ],
diff --git a/third_party/gvisor_syscall_tests/expects/netstack3/udp.json5 b/third_party/gvisor_syscall_tests/expects/netstack3/udp.json5
index b751824..6f6ffb2 100644
--- a/third_party/gvisor_syscall_tests/expects/netstack3/udp.json5
+++ b/third_party/gvisor_syscall_tests/expects/netstack3/udp.json5
@@ -6,9 +6,7 @@
         {
             type: "expect_failure",
             matchers: [
-                // Netstack3 does not support SO_REUSEADDR and only partially supports
-                // SO_REUSEPORT for UDP sockets.
-                "AllUDPSockets/UDPSocketPairTest.ReuseAddrDefault/*",
+                // Netstack3 does not support SO_REUSEADDR and SO_REUSEPORT on bound sockets.
                 "AllUDPSockets/UDPSocketPairTest.SetReuseAddr/*",
                 "AllUDPSockets/UDPSocketPairTest.SetReuseAddrReusePort/*",
                 "AllUDPSockets/UDPSocketPairTest.SetReusePort/*",
@@ -57,7 +55,6 @@
                 // Netstack3 does not support many UDP socket options or operations
                 "AllUDPSockets/AllSocketPairTest.BasicRecvmmsg/*",
                 "AllUDPSockets/AllSocketPairTest.BasicSendmmsg/*",
-                "AllUDPSockets/AllSocketPairTest.GetSndBufSucceeds/*",
                 "AllUDPSockets/AllSocketPairTest.GetSocketOutOfBandInlineOption/*",
                 "AllUDPSockets/AllSocketPairTest.GetSocketRcvbufOption/*",
                 "AllUDPSockets/AllSocketPairTest.KeepAliveSocketOption/*",
@@ -67,7 +64,6 @@
                 "AllUDPSockets/AllSocketPairTest.SendmmsgIsLimitedByMAXIOV/*",
                 "AllUDPSockets/AllSocketPairTest.RecvmsgPeekMsghdrFlagsCleared/*",
                 "AllUDPSockets/AllSocketPairTest.SetAndGetBooleanSocketOptions/*",
-                "AllUDPSockets/NonStreamSocketPairTest.SendMsgTooLarge/*",
                 "AllUDPSockets/UDPSocketPairTest.GetSocketAcceptConn/*",
                 "AllUDPSockets/UDPSocketPairTest.IPPKTINFODefault/*",
                 "AllUDPSockets/UDPSocketPairTest.RecvTosDefault/*",
diff --git a/third_party/gvisor_syscall_tests/expects/netstack3/udp_unbound.json5 b/third_party/gvisor_syscall_tests/expects/netstack3/udp_unbound.json5
index b0e0e15..9d28b05 100644
--- a/third_party/gvisor_syscall_tests/expects/netstack3/udp_unbound.json5
+++ b/third_party/gvisor_syscall_tests/expects/netstack3/udp_unbound.json5
@@ -6,14 +6,6 @@
         {
             type: "expect_failure",
             matchers: [
-                // Netstack3 does not support SO_REUSEADDR and only partially supports
-                // SO_REUSEPORT for UDP sockets.
-                "IPv4UDPSockets/IPv4UDPUnboundSocketTest.BindDoubleReuseAddrReusePortThenReuseAddr/*",
-                "IPv4UDPSockets/IPv4UDPUnboundSocketTest.BindReuseAddrReusePortConversionReversable1/*",
-                "IPv4UDPSockets/IPv4UDPUnboundSocketTest.BindReuseAddrReusePortConversionReversable2/*",
-                "IPv4UDPSockets/IPv4UDPUnboundSocketTest.BindReuseAddrReusePortConvertibleToReuseAddr/*",
-                "IPv4UDPSockets/IPv4UDPUnboundSocketTest.ReuseAddrDistribution/*",
-
                 // Netstack3 does not have complete support for multicast UDP sockets.
                 "IPv4UDPSockets/IPv4UDPUnboundSocketTest.IpMulticastIPPacketInfo/*",
                 "IPv4UDPSockets/IPv4UDPUnboundSocketTest.IpMulticastLoopbackAddrNoDefaultSendIf/*",
@@ -25,8 +17,6 @@
                 "IPv4UDPSockets/IPv4UDPUnboundSocketTest.SetAndReceiveIPPKTINFO/*",
                 "IPv4UDPSockets/IPv4UDPUnboundSocketTest.SetSocketRecvBuf/*",
                 "IPv4UDPSockets/IPv4UDPUnboundSocketTest.SetSocketSendBuf/*",
-                "IPv4UDPSockets/IPv4UDPUnboundSocketTest.SetSocketSendBufAboveMax/*",
-                "IPv4UDPSockets/IPv4UDPUnboundSocketTest.SetSocketSendBufBelowMin/*",
                 "IPv4UDPSockets/IPv4UDPUnboundSocketTest.TestBindToBcastThenReceive/*",
                 "IPv4UDPSockets/IPv4UDPUnboundSocketTest.TestBindToBcastThenSend/*",
                 "IPv4UDPSockets/IPv4UDPUnboundSocketTest.TestBindToMcastThenSend/*",
diff --git a/third_party/llvm-libc/src b/third_party/llvm-libc/src
index 8da67cb..205050e 160000
--- a/third_party/llvm-libc/src
+++ b/third_party/llvm-libc/src
@@ -1 +1 @@
-Subproject commit 8da67cbc66b8d96f4873fc2ce6de80edc12f913a
+Subproject commit 205050e07712f021f766d8aca85bf7f549665f81
diff --git a/tools/devshell/host-tool b/tools/devshell/host-tool
index fb91710..2242026 100755
--- a/tools/devshell/host-tool
+++ b/tools/devshell/host-tool
@@ -27,7 +27,9 @@
 
 set -e
 
+# shellcheck source=tools/devshell/lib/vars.sh
 source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/lib/vars.sh || exit $?
+# shellcheck source=tools/devshell/lib/host_symbolizer.sh
 source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/lib/host_symbolizer.sh || exit $?
 fx-config-read
 
@@ -90,6 +92,7 @@
 
 # list-build-artifacts fails with a reasonable error message if tool is unknown
 toolpath="$(fx-command-run list-build-artifacts --name "${toolname}" --expect-one tools)"
+tool_label="$(fx-command-run list-build-artifacts --show-label --name "${toolname}" --expect-one tools)"
 
 if [[ ! -f "${FUCHSIA_BUILD_DIR}/${toolpath}" ]]; then
   # If the desire is to build, then it's important for the build to
@@ -107,13 +110,13 @@
 
   if ! $build; then
     fx-error "Tool \"${toolname}\" is required by this command and has not been built."
-    fx-error "Please build it first: fx build ${toolpath}"
+    fx-error "Please build it first: fx build ${tool_label}"
     exit 2
   fi
 
   {
-    echo "Building required tool \"${toolpath}\"..."
-    fx-command-run build "${toolpath}" || exit $?
+    echo "Building required tool '${toolname}' from \"${tool_label}\"..."
+    fx-command-run build "${tool_label}" || exit $?
   } 1>&2
 fi
 
diff --git a/tools/devshell/tests/subcommands/fx_host_tool_test b/tools/devshell/tests/subcommands/fx_host_tool_test
index 2c9d964..8f363b0b 100644
--- a/tools/devshell/tests/subcommands/fx_host_tool_test
+++ b/tools/devshell/tests/subcommands/fx_host_tool_test
@@ -5,9 +5,12 @@
 
 ### Test expected usage of host-tool in fx scripts
 
+# Source platform.sh so that we can point to jq and include it as a runtime dependency.
+source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)/../../lib/platform.sh" || exit $?
 
 BT_FILE_DEPS=(
   "scripts/fx"
+  "prebuilt/third_party/jq/${HOST_PLATFORM}/bin/jq"
   "tools/devshell/lib/fx-cmd-locator.sh"
   "tools/devshell/lib/fx-optional-features.sh"
   "tools/devshell/lib/host_symbolizer.sh"
@@ -15,10 +18,11 @@
   "tools/devshell/lib/vars.sh"
   "tools/devshell/lib/platform.sh"
   "tools/devshell/host-tool"
+  "tools/devshell/list-build-artifacts"
+  "tools/devshell/jq.fx"
 )
 
 BT_MOCKED_TOOLS=(
-  "tools/devshell/list-build-artifacts"
   "tools/devshell/build"
 )
 
@@ -31,10 +35,32 @@
   fx-config-read
   ffx="$(btf::make_installed_hosttools_mock ffx)"
   ffx_rel="${ffx##${FUCHSIA_BUILD_DIR}/}"
-  cat >"${BT_TEMP_DIR}/tools/devshell/list-build-artifacts.mock_side_effects" <<EOF
-    [[ \$2 == "ffx" ]] && echo ${ffx_rel} && exit 0
-    exit 1
+
+  # slow_tool is used by the TEST_kill_bg_process below and must be
+  # listed in tool_paths.json.
+  slow_tool="$(btf::make_installed_hosttools_mock slow_tool)"
+  slow_tool_rel="${slow_tool##${FUCHSIA_BUILD_DIR}/}"
+
+  # Set up dummy build API modules.
+cat > "${BT_TEMP_DIR}/out/default/tool_paths.json" <<EOF
+[
+  {
+    "cpu": "${HOST_CPU}",
+    "label": "//tools/ffx(//build/toolchain:host_${HOST_CPU})",
+    "name": "ffx",
+    "os": "${HOST_OS}",
+    "path": "${ffx_rel}"
+  },
+  {
+    "cpu": "${HOST_CPU}",
+    "label": "//tools/slow_tool(//build/toolchain:host_${HOST_CPU})",
+    "name": "slow_tool",
+    "os": "${HOST_OS}",
+    "path": "${slow_tool_rel}"
+  }
+]
 EOF
+
   local uname="$(btf::make_mock_binary uname)"
   btf::add_binary_to_path "$uname"
 
@@ -152,12 +178,6 @@
 EOF
   chmod +x "${frontend_cmd}"
 
-  local slow_tool="$(btf::make_installed_hosttools_mock slow_tool)"
-  local slow_tool_rel="${slow_tool##${FUCHSIA_BUILD_DIR}/}"
-  cat >"${BT_TEMP_DIR}/tools/devshell/list-build-artifacts.mock_side_effects" <<EOF
-    [[ \$2 == "slow_tool" ]] && echo ${slow_tool_rel} && exit 0
-    exit 1
-EOF
   cat >"${slow_tool}.mock_side_effects" <<EOF
   cleanup() {
     local st=\$1
diff --git a/tools/fidl/fidlgen_cpp/goldens/protocols_wire_messaging.h.golden b/tools/fidl/fidlgen_cpp/goldens/protocols_wire_messaging.h.golden
index fc3f8c9..bcb5482 100644
--- a/tools/fidl/fidlgen_cpp/goldens/protocols_wire_messaging.h.golden
+++ b/tools/fidl/fidlgen_cpp/goldens/protocols_wire_messaging.h.golden
@@ -5241,7 +5241,7 @@
 
 template<>
 struct ::fidl::internal::ProtocolDetails<::test_protocols::PlatformServer> {
-    static constexpr char DiscoverableName[] = "platform";
+    static constexpr char DiscoverableName[] = "test.protocols.PlatformServer";
 };
 
 #endif  // __Fuchsia__
diff --git a/tools/fidl/fidlgen_go/goldens/protocols.go.golden b/tools/fidl/fidlgen_go/goldens/protocols.go.golden
index e7fb1e8..832786e 100644
--- a/tools/fidl/fidlgen_go/goldens/protocols.go.golden
+++ b/tools/fidl/fidlgen_go/goldens/protocols.go.golden
@@ -1114,13 +1114,13 @@
 
 // Implements ServiceRequest.
 func (_ PlatformServerWithCtxInterfaceRequest) Name() string {
-	return "platform"
+	return "test.protocols.PlatformServer"
 }
 func (c PlatformServerWithCtxInterfaceRequest) ToChannel() _zx.Channel {
 	return c.Channel
 }
 
-const PlatformServerName = "platform"
+const PlatformServerName = "test.protocols.PlatformServer"
 
 type PlatformServerWithCtxStub struct {
 	Impl PlatformServerWithCtx
diff --git a/tools/fidl/fidlgen_hlcpp/goldens/protocols.cc.golden b/tools/fidl/fidlgen_hlcpp/goldens/protocols.cc.golden
index 22e8d01..258c6ff 100644
--- a/tools/fidl/fidlgen_hlcpp/goldens/protocols.cc.golden
+++ b/tools/fidl/fidlgen_hlcpp/goldens/protocols.cc.golden
@@ -3594,7 +3594,7 @@
 
 
 PlatformServer::~PlatformServer() = default;
-const char PlatformServer::Name_[] = "platform";
+const char PlatformServer::Name_[] = "test.protocols.PlatformServer";
 
 const fidl_type_t* ::test::protocols::PlatformServer_RequestDecoder::GetType(uint64_t ordinal, bool* out_needs_response, bool* out_is_known) {
   *out_needs_response = false;
diff --git a/tools/fidl/fidlgen_rust/goldens/protocols.rs.golden b/tools/fidl/fidlgen_rust/goldens/protocols.rs.golden
index 633802f..0e31c43 100644
--- a/tools/fidl/fidlgen_rust/goldens/protocols.rs.golden
+++ b/tools/fidl/fidlgen_rust/goldens/protocols.rs.golden
@@ -2979,7 +2979,7 @@
     #[cfg(target_os = "fuchsia")]
     type SynchronousProxy = PlatformServer_SynchronousProxy;
 
-    const DEBUG_NAME: &'static str = "platform";
+    const DEBUG_NAME: &'static str = "test.protocols.PlatformServer";
 }
 impl fidl::endpoints::DiscoverableProtocolMarker for PlatformServer_Marker {}
 
diff --git a/tools/fidl/fidlgen_syzkaller/goldens/protocols.syz.txt.golden b/tools/fidl/fidlgen_syzkaller/goldens/protocols.syz.txt.golden
index 23b1507..5882c6e 100644
--- a/tools/fidl/fidlgen_syzkaller/goldens/protocols.syz.txt.golden
+++ b/tools/fidl/fidlgen_syzkaller/goldens/protocols.syz.txt.golden
@@ -563,7 +563,7 @@
 resource zx_chan_test_protocols_PlatformServer_server[zx_chan]
 
 zx_channel_create$test_protocols_PlatformServer(options const[0], out0 ptr[out, zx_chan_test_protocols_PlatformServer_client], out1 ptr[out, zx_chan_test_protocols_PlatformServer_server])
-fdio_service_connect$test_protocols_PlatformServer(path ptr[in, string["/svc/platform"]], handle zx_chan_test_protocols_PlatformServer_server)
+fdio_service_connect$test_protocols_PlatformServer(path ptr[in, string["/svc/test.protocols.PlatformServer"]], handle zx_chan_test_protocols_PlatformServer_server)
 
 
 test_protocols_SyscallProtocolMethodCRequest {
diff --git a/tools/fidl/lib/fidlgen/types.go b/tools/fidl/lib/fidlgen/types.go
index 29a2c08..7495dc7 100644
--- a/tools/fidl/lib/fidlgen/types.go
+++ b/tools/fidl/lib/fidlgen/types.go
@@ -1326,7 +1326,7 @@
 		return ""
 	}
 	var name string
-	if arg, ok := attr.LookupArgStandalone(); ok {
+	if arg, ok := attr.LookupArg("name"); ok {
 		name = arg.ValueString()
 	} else {
 		// TODO(https://fxbug.dev/42053780): Construct this string in fidlc, not here.