From d950e331848dbed227d3e2679f3954468eedef8e Mon Sep 17 00:00:00 2001 From: bjorn3 <17426603+bjorn3@users.noreply.github.com> Date: Sat, 20 Jan 2024 18:58:09 +0100 Subject: [PATCH] Migrate ac97d to pcid_interface --- Cargo.lock | 2 ++ ac97d/Cargo.toml | 2 ++ ac97d/config.toml | 3 ++- ac97d/src/main.rs | 30 +++++++++++++++++++----------- 4 files changed, 25 insertions(+), 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index afafaffb65..28bca81fc7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9,6 +9,7 @@ dependencies = [ "bitflags 1.3.2", "common", "log", + "pcid", "redox-daemon", "redox-log", "redox_event 0.1.0", @@ -46,6 +47,7 @@ dependencies = [ "common", "log", "partitionlib", + "pcid", "redox-daemon", "redox-log", "redox_syscall 0.4.1", diff --git a/ac97d/Cargo.toml b/ac97d/Cargo.toml index 784990155a..6a8c4a477f 100644 --- a/ac97d/Cargo.toml +++ b/ac97d/Cargo.toml @@ -12,3 +12,5 @@ redox-log = "0.1" redox_event = { git = "https://gitlab.redox-os.org/redox-os/event.git" } redox_syscall = "0.4" spin = "0.9" + +pcid = { path = "../pcid" } diff --git a/ac97d/config.toml b/ac97d/config.toml index f7c662483f..efc85ac560 100644 --- a/ac97d/config.toml +++ b/ac97d/config.toml @@ -2,4 +2,5 @@ name = "AC97 Audio" class = 0x04 subclass = 0x01 -command = ["ac97d", "$NAME", "$BAR0", "$BAR1", "$IRQ"] +command = ["ac97d"] +use_channel = true diff --git a/ac97d/src/main.rs b/ac97d/src/main.rs index 6c65e75ad5..a1e6760070 100644 --- a/ac97d/src/main.rs +++ b/ac97d/src/main.rs @@ -5,16 +5,17 @@ extern crate spin; extern crate syscall; extern crate event; -use std::{env, usize}; use std::fs::File; use std::io::{ErrorKind, Read, Write, Result}; use std::os::unix::io::{AsRawFd, FromRawFd, RawFd}; -use syscall::{Packet, SchemeBlockMut, EventFlags}; use std::cell::RefCell; use std::sync::Arc; +use std::usize; use event::EventQueue; +use pcid_interface::{PciBar, PcidServerHandle}; use redox_log::{OutputBuilder, RedoxLogger}; +use syscall::{EventFlags, Packet, SchemeBlockMut}; pub mod device; @@ -63,26 +64,33 @@ fn setup_logging() -> Option<&'static RedoxLogger> { } fn main() { - let mut args = env::args().skip(1); + let mut pcid_handle = + PcidServerHandle::connect_default().expect("ac97d: failed to setup channel to pcid"); + let pci_config = pcid_handle + .fetch_config() + .expect("ac97d: failed to fetch config"); - let mut name = args.next().expect("ac97: no name provided"); + let mut name = pci_config.func.name(); name.push_str("_ac97"); - let bar0_str = args.next().expect("ac97: no address provided"); - let bar0 = u16::from_str_radix(&bar0_str, 16).expect("ac97: failed to parse address"); + let bar0 = match pci_config.func.bars[0] { + PciBar::Port(port) => port, + _ => unreachable!(), + }; - let bar1_str = args.next().expect("ac97: no address provided"); - let bar1 = u16::from_str_radix(&bar1_str, 16).expect("ac97: failed to parse address"); + let bar1 = match pci_config.func.bars[1] { + PciBar::Port(port) => port, + _ => unreachable!(), + }; - let irq_str = args.next().expect("ac97: no irq provided"); - let irq = irq_str.parse::().expect("ac97: failed to parse irq"); + let irq = pci_config.func.legacy_interrupt_line; print!("{}", format!(" + ac97 {} on: {:X}, {:X}, IRQ {}\n", name, bar0, bar1, irq)); // Daemonize redox_daemon::Daemon::new(move |daemon| { let _logger_ref = setup_logging(); - + unsafe { syscall::iopl(3) }.expect("ac97d: failed to set I/O privilege level to Ring 3"); let mut irq_file = File::open(format!("irq:{}", irq)).expect("ac97d: failed to open IRQ file");