Skip to content

rewrite(phase4): port regmap batch B from c-RCP — HW pins, streams, EP-ID map, optional subsystems - #143

Merged
SoundMatt merged 3 commits into
rewrite/v3-from-c-rcpfrom
phase4/regmap-b
Aug 22, 2026
Merged

SoundMatt merged 3 commits into
rewrite/v3-from-c-rcpfrom
phase4/regmap-b

Conversation

@SoundMatt

Copy link
Copy Markdown
Owner

Part of the v3.0.0 ground-up rewrite (#129, ROADMAP.md Phase 17), branch rewrite/v3-from-c-rcp. Phase 4 batch B of the two-batch regmap port; batch A (general map, EP0, generic/functional config split, merged as #141) is the prerequisite this builds on.

Ported

  • EpFunctionalCfg — content-modeling only (see reconciliation below).
  • HW pin mapping: HwPinMapEntry (replaces an old placeholder with zero consumers anywhere in the tree), hw_pin::k* bit constants (Table 22), hw_pin_map::render/apply_reconfig, HwPinMapReconfigErrc (REQ-RMAP-040/041).
  • NamedSignal enum + string/signal-nr helpers.
  • RequestStreamConfig extended (not replaced — existing field names kept verbatim for e2e.hpp/watchdog.hpp/sim.hpp compat) with 4 new fields; wd-timeout ms/ticks conversions, wire codec (TC18 0.5.1_RC5 issue #458's 4-bit reconciliation, AND-not-OR coupling), resolve_index.
  • ResponseQueueConfig replaced (old shape had zero real consumers) with c-RCP's real per-queue row.
  • EpIdMappingEntry extended with 2 fields appended last (preserves existing brace-inits) + ep_id_map:: namespace (ascending check, render/apply_reconfig, single-client-per-ep, shared-bus-homogeneous, fixed-ep_id, cross-endpoint orchestrator query, is_valid_association).
  • OptionalSubsystemCfg (REQ-RMAP-039), wired into RegisterMap.

Batch-A TODOs closed

  • writer_ctx()'s via_valid_stream_association now calls the real is_valid_association() instead of a fail-closed stub.
  • EndpointGenericConfig's 3 pre-existing CRC fields confirmed as a deliberate, distinct mechanism — every Phase 3 endpoint type already ported c-RCP's real functional-cfg CRC fields inline into its own struct, so EpFunctionalCfg is content-modeling only.

Deliberately deferred

c-RCP's EP0 address-routed dispatcher (~500 lines combining every sub-table with lifecycle authorization + sequencer ownership) and the sequencer-table wire codec — neither named in batch B's scope.

No bugs found versus c-RCP during the port.

Verification

regmap.hpp: 1328→2654 lines. test_regmap.cpp: 1105→1904 lines, 59→120 TEST_CASEs (332→2433 assertions). Full tree rebuilds clean (0 errors/warnings), 56/56 ctest suites pass (100%) — independently re-verified from a fresh build.

SoundMatt and others added 3 commits August 21, 2026 15:01
…eneric/functional split

Part of the v3.0.0 ground-up rewrite (cpp-RCP #129, ROADMAP.md Phase 17),
branch rewrite/v3-from-c-rcp. Phase 4 batch A of a two-batch regmap port
(batch B — HW pin map, named-signal index, request-stream/response-queue
config, EP-ID map, optional-subsystem sections — is a separate later PR).

c-RCP's regmap.h/.c (3549+2662 = 6211 lines) is regmap's own content
source of truth; cpp-RCP's prior regmap.hpp (534 lines) was a stub with
real content gaps, matching ROADMAP.md's own flagged '~7x more complete
in c-RCP' finding that originally scoped this phase.

## Ported (c-RCP file:line -> cpp-RCP)

- EP0/root-client model (regmap.h:358-371, regmap.c:12-15) ->
  regmap::is_ep0(), kEp0.
- svr_implemented_options (REQ-RMAP-030, regmap.h:384-413): the 5 real
  bits (kOptCompoundWait/Trigger/Chained/TimeSync/EnhCancel); kept
  legacy kOptConditionalRequests/kOptSafetyRequests/kOptFragmentation
  (still referenced by request.hpp/e2e.hpp) with a comment explaining
  they have no TC18 basis per REQ-RMAP-004..008's retirement.
- General register map (regmap.h:416-1141, regmap.c:41-288): new
  GeneralMap struct (~40 fields, REQ-RMAP-023/026-039), render(),
  encode_read_response()/decode_read_response()/decode_write_request()
  (Table 20 wire codec), GeneralMapErrc.
- Root-client/writer_ctx (regmap.h:1152-1211, regmap.c:1684-1741):
  EpClient, writer_ctx() deriving lifecycle::WriterCtx.
- SvrEpCfg (TC18 Sec13.7.1.2, regmap.h:1211-1303): svr_discovery_timeout,
  svr_ep_status.
- EndpointGenericConfig (regmap.h:1310-1608): real fields
  (ep_type/ep_used/ep_delay_time/ep_req_storage_size/ep_description/
  ep_tx_buffer_size/ep_rx_buffer_size), ep_generic_cfg:: namespace with
  boundary conversions (issue #311 batches 2-4), render(),
  apply_reconfig() (per-field, matching c-RCP's documented rationale),
  EpGenericCfgReconfigErrc.

## Deliberate deferrals (marked TODO(phase4-batch-b) in-file)

- writer_ctx()'s via_valid_stream_association always returns false
  (fail-closed) until batch B's EP-ID/byte_bus_id association table
  lands (needs a request_stream_index field EpIdMappingEntry doesn't
  have yet).
- HW pin map, request-stream-cfg, response-queue-cfg, EP-ID map,
  optional-subsystem config, ep_functional_cfg_t: untouched, batch B.

## Cross-cutting note

c-RCP's ep_generic_cfg_t has no per-role CRC fields (that's
ep_functional_cfg_t's, batch B); cpp-RCP's pre-existing
EndpointGenericConfig already had three (ep_req/ack/response_crc_enable)
depended on by e2e.hpp/test_e2e.cpp -- kept, marked in-file as
pre-existing/non-c-RCP content rather than silently dropped or
relocated (relocation needs ep_functional_cfg_t, batch B's scope).

## Call sites

mock.hpp: RegisterMap::endpoint_count -> general.svr_ep_count,
magic -> general.magic (2 lines). test_mock.cpp: matching 4-line fix.
No other files touched.

## Verification

test_regmap.cpp: 558 -> 1105 lines, 28 -> 57 TEST_CASEs (327
assertions). Full tree rebuilds clean (0 errors, 0 warnings), 56/56
ctest suites pass (100%) -- independently re-verified from a fresh
build, not just the porting agent's own report. Heavy regmap
dependents (test_e2e, test_watchdog, test_request, test_discovery,
test_mock, test_gpio, test_adc) spot-checked with unchanged assertion
counts.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Signed-off-by: Matt <47545907+SoundMatt@users.noreply.github.com>
…P-ID map, optional subsystems

Part of the v3.0.0 ground-up rewrite (cpp-RCP #129, ROADMAP.md Phase 17),
branch rewrite/v3-from-c-rcp. Phase 4 batch B of the two-batch regmap
port; batch A (general map, EP0, generic/functional config split,
merged as #141) is the prerequisite this builds on.

## Ported (c-RCP regmap.h/.c -> cpp-RCP regmap.hpp)

- EpFunctionalCfg (regmap.h:1614-1627) -- content-modeling only, see
  reconciliation below.
- HW pin mapping: HwPinMapEntry (regmap.h:1685-1697, replaces the old
  pin_id/function placeholder -- zero consumers existed for it
  anywhere in the tree), hw_pin::k* bit constants (Table 22),
  hw_pin_map::render/apply_reconfig, HwPinMapReconfigErrc
  (REQ-RMAP-040/041).
- NamedSignal enum + named_signal_string()/named_signal_ep_signal_nr()
  (regmap.h:1798-1906).
- RequestStreamConfig extended (not replaced -- rx_wd_timeout_interval
  etc. kept verbatim since e2e.hpp/watchdog.hpp/sim.hpp and their
  tests depend on those exact names) with rx_secure_channel_index/
  rx_ack_stream_index/rx_resp_stream_index(default 1)/
  rx_stream_max_request_size; request_stream_cfg::
  wd_timeout_ms_to_ticks/_ticks_to_ms, render/apply_reconfig (TC18
  0.5.1_RC5 issue #458 4-bit reconciliation, AND-not-OR coupling),
  resolve_index.
- ResponseQueueConfig replaced (old shape had zero real consumers;
  comments in respqueue.hpp/deadline.hpp already referenced fields
  that never existed) with c-RCP's real per-queue row +
  response_queue_stream_id(), render/apply_reconfig.
- EpIdMappingEntry extended with request_stream_index/crc_required
  appended last (preserves existing 2-element brace-inits in
  mock.hpp/tests) + ep_id_map::{is_ascending, effective_count,
  row_init_default, render, apply_reconfig, has_single_client_per_ep,
  shared_bus_homogeneous, ep_type_has_fixed_ep_id,
  byte_bus_ids_for_stream, is_valid_association}.
- OptionalSubsystemCfg + optional_subsystem_cfg::apply_reconfig
  (REQ-RMAP-039), wired into RegisterMap as 4 new fields.

## Batch-A TODOs closed

- writer_ctx()'s via_valid_stream_association now calls the real
  ep_id_map::is_valid_association() instead of the fail-closed stub.
- EndpointGenericConfig's 3 pre-existing CRC fields: confirmed as a
  deliberate, distinct mechanism (not c-RCP's ep_req_crc_enable) --
  every concrete endpoint type from this project's own Phase 3
  (gpio.hpp, adc.hpp, etc.) already independently ported c-RCP's real
  functional-cfg fields inline into its own struct, so EpFunctionalCfg
  is content-modeling only, matching SvrEpCfg's existing disposition.

## Deliberately deferred (documented in-file)

c-RCP's EP0 address-routed dispatcher (regmap.h:3072-3549, ~500 lines
combining every sub-table with lifecycle authorization + sequencer
ownership) and the sequencer-table wire codec -- neither is named in
batch B's scope; only their content/mechanism pieces were ported.

No bugs found versus c-RCP during the port (render/apply_reconfig
logic, including the AND-not-OR bit coupling and saturation rules,
reproduced faithfully); one self-contradictory assertion in this
batch's own new test was caught and fixed before it reached the build.

## Verification

regmap.hpp: 1328 -> 2654 lines. test_regmap.cpp: 1105 -> 1904 lines,
59 -> 120 TEST_CASEs (332 -> 2433 assertions). Full tree rebuilds
clean (0 errors, 0 warnings), 56/56 ctest suites pass (100%) --
independently re-verified from a fresh build, not just the porting
agent's own report.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Signed-off-by: Matt <47545907+SoundMatt@users.noreply.github.com>
…batch B

# Conflicts:
#	include/rcp/regmap.hpp
#	tests/test_regmap.cpp

Signed-off-by: Matt <47545907+SoundMatt@users.noreply.github.com>
@SoundMatt
SoundMatt merged commit ddb9b76 into rewrite/v3-from-c-rcp Aug 22, 2026
22 checks passed
@SoundMatt
SoundMatt deleted the phase4/regmap-b branch August 22, 2026 05:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant