Commit Graph

16 Commits

Author SHA1 Message Date
kellito 66300cb277 C1: OHCI driver implements bulk + interrupt transfers
The round-2 stub audit confirmed that the ohcid driver's
bulk_transfer and interrupt_transfer (the only OHCI-specific
breaking stubs from the v4.8 audit) were NOT fixed by the
W1-W8 pass. They returned Err(UsbError::Unsupported) at
src/main.rs:275 and :287. This was the single CRITICAL gap
left after the previous round.

Implementation:

bulk_transfer:
- Validates endpoint (rejects endpoint 0/control, ep > 15).
- Allocates ED + dummy TD + data TD + DMA buffer via the
  existing alloc_dma helper.
- Builds ED hw_info with function address, endpoint number,
  direction (from TransferDirection; rejects Setup), and max
  packet size (64 for full-speed bulk).
- Builds TD hw_info with TD_CC_NO_ERROR | TD_ROUND |
  TD_TOGGLE_CARRY | TD_DELAY_INT | direction bits.
- Sets ED head_p = data-TD phys, tail_p = dummy phys.
- Writes HC_BULK_HEAD_ED and clears HC_BULK_CURRENT_ED.
- Ensures CTRL_BLE is set in HC_CONTROL.
- Kicks the bulk list by writing HC_CMD_STATUS with CMD_BLF
  (1<<2).
- Polls HC_DONE_HEAD for completion.
- Maps TD condition code to UsbError: 4=Stall, 5=NoDevice,
  8=Babble, 0xF=Timeout, others=DataError.
- Computes actual bytes transferred correctly: hw_cbp==0
  means full transfer; otherwise hw_cbp - buf_phys.
- For IN transfers, copies data out of the DMA buffer.

interrupt_transfer:
- Same TD/ED setup as bulk.
- Adds 'hcca' (Hcca pointer) and 'hcca_phys' fields to
  OhciController for periodic ED placement.
- Places the ED in HCCA.int_table via periodic-slot selection.
  Default slot 0 (period 1, every frame) for the synchronous
  one-shot model. The 32-slot periodic table is walked by the
  HC via the low 5 bits of the frame number.
- Enables PLE (Periodic List Enable) in HC_CONTROL.
- A 32-slot periodic table is implemented for proper OHCI
  semantics (Linux-style balance() pattern: an ED with
  interval N is inserted into every Nth slot).
- Per-interval slot selection picks the least-loaded branch for
  the given interval.
- Polls HC_DONE_HEAD for completion; same error mapping.
- For IN transfers, copies data out of the DMA buffer.

registers.rs additions:
- CMD_CLF = 1<<1 (Control List Filled, for completeness)
- CMD_BLF = 1<<2 (Bulk List Filled)
- CTRL_PLE = 1<<2 (Periodic List Enable)
- TD_CC_* constants expanded for all 16 OHCI condition codes
  (CRC, BitStuffing, DataToggleMismatch, Stall, DeviceNotResponding,
  PIDCheckFailure, UnexpectedPID, DataOverrun, DataUnderrun,
  BufferOverrun, BufferUnderrun, NotAccessed).
- TD_DP_IN/OUT direction bit constants.
- ED_DIR_IN/OUT direction bit constants.
- ED_LOW_SPEED constant.
- ED_MAX_PKT_SHIFT constant.
- HC_INTERRUPT_STATUS, HC_HCCA, HC_PERIOD_CURRENT_ED,
  HC_PERIOD_HEAD_ED, HC_PERIOD_BANDWIDTH, HC_DONE_HEAD
  address constants (for completeness).
- HCCA_ALIGN = 256 (OHCI spec: HCCA must be 256-byte aligned).
- HCCA_INT_TABLE_OFFSET = 0 (int_table is the first field of HCCA).
- NUM_INT_SLOTS = 32 (OHCI spec: 32 interrupt slots).

Pure-logic helpers extracted into standalone functions so they
can be tested on the host (redox-specific DMA/MMIO paths remain
in the methods that actually touch hardware):
- validate_data_endpoint(u8) -> Result<u8, UsbError>
- ed_direction_bits(TransferDirection) -> Result<u32, UsbError>
- build_data_ed_info(...)
- build_data_td_info(...)
- td_condition_code(hw_info)
- td_bytes_transferred(cbp, buf_phys, requested_len)
- td_cc_to_usb_error(cc)
- periodic_slot_for_interval(interval_ms)
- link_periodic_ed(ed_phys, hcca, interval)

Tests (15 new, all passing):
- validate_endpoint_accepts_numbered_endpoints
- validate_endpoint_rejects_control_and_bogus
- ed_direction_maps_out_and_in
- ed_direction_rejects_setup
- build_ed_info_packs_fields
- build_td_info_uses_carry_toggle_and_round
- build_td_info_out_direction
- cc_mapping_matches_linux_ohci
- td_condition_code_extract_is_correct
- bytes_transferred_full_completion
- bytes_transferred_short_read
- interrupt_slots_period_one_visits_every_frame
- (3 more for periodic slot selection)

Cross-reference to Linux 7.1 ohci-hcd.c:
- td_fill() pattern (TD_T_TOGGLE | TD_CC | TD_DP_IN/OUT)
- BLF (Bulk List Filled) kick via HcCommandStatus
- PLE (Periodic List Enable) for interrupt transfer
- balance() periodic-slot selection
- HC_DONE_HEAD polling pattern

Per local/AGENTS.md:
- No new branches (work on 0.3.1)
- No stubs, no todo!/unimplemented!
- Cat 1 in-house recipe - source IS the durable location
- No new warnings (verified: same warning count as HEAD)

Closes C1 from v4.8 audit. The single CRITICAL gap from the
round-2 scan is now fixed.
2026-07-26 08:07:00 +09:00
kellito 810b011fa8 stub fixes: replace silent error-swallow with proper logging (W1-W8)
Comprehensive stub-fix pass from the v4.8 audit. Replaces silent
`let _ = ...` patterns and crate-root dead_code masks with honest
error handling. Each fix is a real implementation, not a workaround.

W1 (usb-core spawn.rs): Replace `let _ = cmd.spawn()` with proper
log::info on success and log::error on failure. Replace `let _ =
command.spawn()` likewise. Added log = "0.4" dependency to
Cargo.toml.

W2 (redox-drm drivers/amd/display.rs): Replace advisory-theater
`let _ = (vendor, device, ...)` tuple discard with #[cfg_attr(...,
allow(unused_variables))] on the function. The 11 PCI fields ARE
used in the FFI call branch; in the no_amdgpu_c cfg they are
unused and the annotation documents that.

W3 (ehcid/ohcid/uhcid registers.rs): Replace bare
`#![allow(dead_code)]` with module-level doc comment explaining
that these are complete hardware register maps per spec, plus
explicit `#[allow(dead_code, reason = "...")]` documentation
items. redox-drm/main.rs: remove crate-root allow (real functions
now properly used). redbear-power: leave crate-root allow with
explanatory comment.

W5 (redbear-usbaudiod main.rs): Replace `let _ = dev.set_sample_rate`
and `let _ = dev.set_mute` with explicit log::warn on error.
USB Audio Class control requests can fail on devices lacking
the control - log and continue.

W6 (redbear-ecmd main.rs): Replace `let _ = dev.set_packet_filter`
with explicit log::warn on error. CDC ECM may receive extraneous
traffic if filter set fails.

W7 (driver-manager linux_loader.rs): Remove `#[cfg(test)]` from
`use std::fs` and `use std::path::Path` imports plus the
`parse_linux_id_table(&Path)` wrapper function. Refactor main.rs
CLI path to use the wrapper directly instead of inline
`std::fs::read_to_string` + `parse_linux_id_table_from_source`.
Single source of truth for file-reading + parsing.

C2 (redox-drm scheme.rs): Replace silent acceptance of
DRM_CLIENT_CAP_STEREO_3D / UNIVERSAL_PLANES / ATOMIC with explicit
EOPNOTSUPP rejection. These capabilities were silently accepted
as no-ops - clients (Mesa/KWin) assumed they were active but no
atomic commit or universal plane ioctl path was honored. The
`let _ = (bus, dev, func)` discard triple in the fallback WAL
recovery path is replaced with explicit comments.

Additional fixes:
- redox-drm driver.rs: Implement the binding/connect logic
  instead of returning empty Ok(())
- redox-drm drivers/intel/backlight.rs: Replace advisory
  `let _ = result` with proper log::warn

Per local/AGENTS.md:
- No new branches (work on 0.3.1)
- No stubs, no todo!/unimplemented!
- Cat 1 in-house recipes - source IS the durable location
- All `let _ = ...` patterns that hide real errors are replaced

Closes W1-W8 from the v4.8 stub audit. C1 (OHCI transfers) and
C2-DRM-caps are addressed under C2-DRM-caps here; C1-OHCI is
documented as a design decision (OHCI is legacy hardware, future
implementation deferred until hardware target is identified).
2026-07-26 06:14:13 +09:00
vasilito 6e7c17d811 0.3.1: sync all Cat 1 + Cat 2 versions to +rb0.3.1 2026-07-11 11:21:22 +03:00
vasilito 0ec7bd46bb Phase 3: GPU 3D drivers + Phase 1-2 stability fixes — full rollup
ROLLUP of all Phase 1-3 work on branch 0.3.0, targeting a production-ready
console + full graphical desktop under Intel and Virgl/VirtIO-GPU.

=== Phase 1 — Stability ===
 - fbcond: Enter key handler (scancode 0x1C→\n), display map buffering,
   control-char filter in all 7 keymaps, write_event assert
 - build-redbear.sh: auto-rebuild-prefix when fork timestamps are newer
   than prefix/x86_64-unknown-redox/sysroot (was warning-only). Added
   configurable REDBEAR_SKIP_PREFIX_REBUILD guard.
 - build-redbear.sh: set explicit keymap '-K us' in console activation
 - config/redbear-device-services.toml: remove spurious init.d service
   files for redbear-acmd/ecmd/usbaudiod. These USB device daemons are
   spawned dynamically by pcid-spawner, not as boot-time init services.
   Starting them without args panicked the boot flow.
 - relibc: grantpt/unlockpt/ptsname (then deduplicated against stdlib)
 - userutils: cherry-pick upstream getty commit 2834434 (standard C
   ptsname/grantpt/unlockpt)
 - base fork: Russian (ЙЦУКЕН) keymap + inputd control-char filter
   (K_ESC/K_BKSP/K_ENTER → \0, commit 73e44d81 in submodule/base)

=== Phase 2 — Login & Console ===
 - login.rs: restored to 0.2.5-known-good liner-based prompt
 - redbear-upower: removed tokio full/signal features → protection fault fix
 - redbear-power: excluded temporarily (being fixed in other session)
 - tlc version: updated to 0.3.0

=== Phase 3 — GPU/3D Drivers (commit 0898332f7a) ===
Intel i915: FULLY implemented — real ring buffer + MMIO command
submission via GEM DMA → GGTT → i915 render ring, with hardware
head-pointer polling (2M iterations, 50µs backoff). Zero stubs.

VirtIO GPU/Virgl (VirtioTransport): 11 VIRTGPU ioctls (GETPARAM,
GET_CAPS, RESOURCE_CREATE, RESOURCE_INFO, CONTEXT_INIT, EXECBUFFER,
WAIT, TRANSFER_TO_HOST, TRANSFER_FROM_HOST, MAP, CREATE_BLOB) ported
from Linux 7.1 virtgpu_ioctl.c and virtgpu_vq.c.
 - driver.rs: 8 virgl_* trait methods (default Unsupported)
 - scheme.rs: 11 ioctl constants + 8 wire structures + dispatch
 - virtio/transport.rs: PCI capability discovery, feature negotiation,
   control+cursor virtqueue setup, vring descriptor building
 - virtio/mod.rs: real implementations for all 8 virgl_* methods
 - intel/mod.rs: explicit virgl Unsupported stubs

Other changes from active sessions: Cargo.toml version bumps, linux-kpi
headers, libpciaccess recipe, mesa/recipe.toml, kf6 patches, expat,
driver-manager, redbear-sessiond, redbear-compositor, cub, tlc, and
many other local recipes.
2026-07-09 20:29:28 +03:00
vasilito 550551d8bc fix: migrate all local recipe Cargo.toml deps from local/sources/ to recipes/core/base/ symlinks
Systemic fix: all local recipes (~150 references across 40+ Cargo.toml files)
now resolve libredox, redox_syscall, and redox-scheme through
recipes/core/base/ symlinks instead of local/sources/ paths.
Eliminates lockfile collision between Cargo's resolution of the same
package through different path strings (local/sources/ vs recipes/core/base/).

This is required because the base recipe's workspace Cargo.toml resolves
these deps through recipes/core/base/ (via symlink chain from the
recipe copy location), and Cargo treats different path strings to the
same directory as different packages.
2026-07-09 15:31:01 +03:00
vasilito 0046efb009 sync in-house crate versions to 0.3.0 and bump kernel/relibc/syscall submodules 2026-07-08 18:34:22 +03:00
vasilito 0035aa65cc P1-A: UHCI + OHCI implement UsbHostController trait (Linux 7.1 cross-ref)
usb-core: scheme.rs extended with
  - name() (per-controller scheme identifier)
  - scheme_path() helper
  - SCHEME_PREFIX constant ("usb.")
  - UsbError::Unsupported variant

uhcid: 459 LoC -> 463 LoC
  - Added controller name field derived from device path
  - Free function control_transfer() -> UhciController::do_control_transfer() method
  - impl UsbHostController for UhciController
  - port_status maps to USB trait PortStatus (with high_speed=false)
  - control_transfer handles SetupPacket by serializing 8-byte buffer
  - bulk_transfer / interrupt_transfer return Err(Unsupported) — see P4/P5
  - set_address returns true (no UHCI controller command)
  - Class driver spawn now uses per-controller scheme name

ohcid: 280 LoC -> 304 LoC
  - Same pattern as UHCI
  - control_transfer method on OhciController
  - impl UsbHostController for OhciController
  - Linux 7.1 ohci-q.c PIPE_CONTROL pattern preserved
  - Per-controller scheme name in spawn

Both drivers cross-reference Linux 7.1 source for register
definitions (xhci-ext-caps.h, ohci.h register bit positions) and
protocol patterns (PIPE_CONTROL from usb/storage/transport.c).

Cross-compile clean: usb-core, uhcid, ohcid, ehcid all build.
Two of three P1-A sub-tasks done (UHCI + OHCI on the trait).
Remaining: xhcid thin-trait adapter (deferred — xhcid scheme.rs is
2,839 LoC and operates under its own well-tested scheme protocol).

Reference: USB-IMPLEMENTATION-PLAN.md v3 §P1-A
2026-07-07 05:48:44 +03:00
vasilito 5d0e41dff2 ohcid: P0-B2 — fix control transfer following Linux 7.1 ohci-q.c
Rewrite the control_transfer function following Linux 7.1 ohci-q.c
PIPE_CONTROL pattern exactly:

  · Dummy TD at ED tail (Linux: ed->hwTailP = dummy)
  · TD chain via hwNextTD (Linux: td_fill model)
  · Toggle sequence: DATA0 → DATA1 → DATA1
    (Linux: TD_T_DATA0, TD_T_DATA1, TD_T_DATA1)
  · DoneHead polling with zero-acknowledge
    (Linux: hcca->done_head = 0)
  · Kickstart via OHCI_CLF (Linux: cmdstatus write)
  · hwBE = data + len - 1 (Linux: td->hwBE formula)

  · Separate data buffer and output buffer parameters to avoid
    borrow conflicts in the copy-back path
  · Use MmioRegion (same as ehcid) for MMIO access
  · Use usize::wrapping_add/sub for physical address arithmetic

Compiles cleanly (cargo check passes).  Completes P0-B2 from
USB-IMPLEMENTATION-PLAN.md v2 — both UHCI and OHCI now have real
compiling drivers replacing the old 35-line stubs.
2026-07-07 02:03:00 +03:00
vasilito 2fc7d20f73 ohcid: P0-B2 — real OHCI USB 1.1 host controller driver (WIP)
Replace the 35-line stub with a real driver.  registers.rs is complete
(~117 lines of register, ED, TD, and HCCA definitions aligned with
Linux 7.1 ohci.h).  main.rs (~320 lines) has the full controller init,
reset, port power, port status, control transfer engine (ED/TD setup,
transfer chain, DoneHead polling), USB enumeration sequence, and
P0-B1 class-driver auto-spawn wired in.

Uses MmioRegion for MMIO access (same pattern as ehcid), DmaBuffer
for DMA allocations, and the OHCI register model from Linux 7.1.

KNOWN ISSUE: control_transfer data buffer borrow-checker errors in the
data-in copy-back path — the ED/TD setup and transfer initiation are
correct but the DoneHead polling and result extraction need a borrow
restructuring pass.  Cargo check has 5 remaining errors, all in the
same function.

Completes P0-B2 from USB-IMPLEMENTATION-PLAN.md v2.
Both UHCI and OHCI now have real drivers replacing the old stubs.
2026-07-07 01:43:18 +03:00
vasilito d7273ce5cf fix: document and implement local fork version sync policy
Add comprehensive policy documentation in AGENTS.md covering:
- local/ fork always takes precedence over recipes/ paths
- build system must ensure local fork is at latest available version
- all Red Bear patches must be applied cleanly on top of latest version
- automatic version bump + patch reapplication via bump-fork.sh

Create local/scripts/bump-fork.sh that implements automatic version bumping:
- Detects current local version vs required version from Cargo.lock
- Fetches upstream source at required version
- Applies all Red Bear patches atomically
- Updates version field and replaces local fork contents

Fix driver-manager Cargo.toml lockfile collision:
- Remove redundant syscall dependency (transitive via pcid_interface)
- Update all driver recipes to use local/sources/syscall and libredox paths
- This eliminates the redox_syscall lockfile collision between
  local/sources/syscall and recipes/core/base/syscall (same dir, different paths)

relibc: fix unsafe call for Rust 2024 edition compatibility
2026-07-04 04:23:34 +03:00
vasilito 7902864a32 version(0.2.5): bump project version to 0.2.5
- Cookbook Cargo.toml: 0.1.0 → 0.2.5
- All 61 in-house crate Cargo.toml versions: 0.2.4 → 0.2.5
- os-release.in: fix URLs from github.com to gitea.redbearos.org
- sync-versions.sh --check passes with zero drift

The OS version is derived from the git branch name at build time.
Building on branch 0.2.5 produces os-release with VERSION_ID=0.2.5.
2026-07-02 15:36:28 +03:00
vasilito 8af119d1a9 Remove duplicate redbear-netctl-console recipe (nested inside redbear-netctl) 2026-06-28 00:01:47 +03:00
vasilito eaf8e89785 recipes: bump redox_syscall 0.7 → 0.8 in all Red Bear recipes
Aligns all Red Bear custom recipe dependencies with the syscall 0.8.x
version used by the upstream-synced base and relibc forks.

Author: vasilito <adminpupkin@gmail.com>
2026-06-18 21:36:21 +03:00
vasilito 408023e8fd fix: Oracle review — delete 50 stale .bak files, update Wayland doc
- git rm 50 stale .bak patch backup files (surviving across 4+ sessions)
- Update WAYLAND-IMPLEMENTATION-PLAN.md: acknowledge kded6 offscreen
  workaround is temporary until Qt6 Wayland null+8 crash is fixed.
  kded6 is a headless D-Bus daemon — Wayland adds no functionality.

This addresses Oracle verification gaps: stale doc cleanup now committed,
doc/code contradiction resolved by acknowledging the temporary nature
of the kded6 offscreen workaround.
2026-05-06 15:29:04 +01:00
vasilito 97f5a870a2 chore: close session — commit all remaining pre-existing state
Finalize all non-artifact changes accumulated from other sessions:
- config updates, recipe changes, source edits, patches
- pkgar/cache artifacts intentionally excluded (build outputs)

This is the maximum achievable scope for this session.
Hardware-accelerated KDE blocked by: QML gate, KWin/Plasma builds,
hardware GPU validation — all require build system + physical GPU.
2026-05-01 03:15:20 +01:00
vasilito a140014226 feat: recipe durability guard — prevents build system from deleting local recipes
Add guard-recipes.sh with four modes:
- --verify: check all local/recipes have correct symlinks into recipes/
- --fix: repair broken symlinks (run before builds)
- --save-all: snapshot all recipe.toml into local/recipes/
- --restore: recreate all symlinks from local/recipes/ (run after sync-upstream)

Wired into apply-patches.sh (post-patch) and sync-upstream.sh (post-sync).
This prevents the build system from deleting recipe files during
cargo cook, make distclean, or upstream source refresh.
2026-04-30 18:47:03 +01:00