diff --git a/local/recipes/gpu/redox-drm/source/src/drivers/intel/mod.rs b/local/recipes/gpu/redox-drm/source/src/drivers/intel/mod.rs index 88d0b52064..d3d73d34f2 100644 --- a/local/recipes/gpu/redox-drm/source/src/drivers/intel/mod.rs +++ b/local/recipes/gpu/redox-drm/source/src/drivers/intel/mod.rs @@ -211,6 +211,7 @@ impl IntelDriver { irq_mode ); + let device_id = info.device_id; Ok(Self { info, mmio, @@ -223,8 +224,8 @@ impl IntelDriver { gtt: Mutex::new(gtt), ring: Mutex::new(ring), vblank_count: AtomicU64::new(0), - pci_device_id: info.device_id, - gen: intel_gen_for_device_id(info.device_id), + pci_device_id: device_id, + gen: intel_gen_for_device_id(device_id), next_ctx_id: AtomicU64::new(1), next_vm_id: AtomicU64::new(1), bo_seqnos: Mutex::new(BTreeMap::new()), @@ -566,7 +567,6 @@ impl GpuDriver for IntelDriver { .map_err(|e| DriverError::Io(format!("Intel ring flush failed: {e}")))?; ring.last_seqno() }; - drop(ring); self.signal_completed_fences(); @@ -1382,7 +1382,7 @@ fn map_bar(device: &mut PciDevice, bar: &PciBarInfo, name: &str) -> Result u8 { use self::dmc::DisplayPlatform; - match super::dmc::display_platform_for_device_id(device_id) { + match self::dmc::display_platform_for_device_id(device_id) { Some(DisplayPlatform::Gen9) => 9, Some(DisplayPlatform::Gen11) => 11, Some(DisplayPlatform::Gen12) => 12, diff --git a/local/recipes/gpu/redox-drm/source/src/scheme.rs b/local/recipes/gpu/redox-drm/source/src/scheme.rs index 5586846e34..1e8913e15a 100644 --- a/local/recipes/gpu/redox-drm/source/src/scheme.rs +++ b/local/recipes/gpu/redox-drm/source/src/scheme.rs @@ -8,7 +8,7 @@ use log::{debug, warn}; use redox_scheme::scheme::SchemeSync; use redox_scheme::{CallerCtx, OpenResult}; use syscall::data::Stat; -use syscall::error::{Error, Result, EBADF, EBUSY, EINVAL, ENOENT, EOPNOTSUPP}; +use syscall::error::{Error, Result, EBADF, EBUSY, EINVAL, EIO, ENOENT, EOPNOTSUPP}; use syscall::flag::{EventFlags, MapFlags, MunmapFlags, MODE_FILE}; use syscall::schemev2::NewFdFlags; @@ -23,7 +23,7 @@ use crate::kms::ModeInfo; /// the value type of the `fence_eventfds` map. Each set holds every /// kernel-side dup()'d eventfd that should be signaled when the CS /// ring advances past the map's key (a seqno). -type FdSet = BTreeSet; +type FdSet = Vec; #[derive(Clone, Debug)] struct FbInfo { @@ -1063,7 +1063,7 @@ impl DrmScheme { self.fence_eventfds .entry(seqno) .or_insert_with(FdSet::new) - .insert(OwnedFd::new(kernel_fd)); + .push(unsafe { OwnedFd::from_raw_fd(kernel_fd) }); // Start the fence-signaler thread if this is the first // registered fence. The thread exits when the map becomes @@ -1110,10 +1110,9 @@ impl DrmScheme { let current_seqno = self.query_last_completed_seqno(); let mut to_remove: Vec = Vec::new(); let mut to_signal: Vec = Vec::new(); - for (&seqno, fd_set) in self.fence_eventfds.iter() { + for (&seqno, _fd_set) in self.fence_eventfds.iter() { if seqno <= current_seqno { - // Move all fds out, then remove the entry. - to_signal.extend(fd_set.iter().cloned()); + // Collect the seqno; the fds are moved out by the remove loop below. to_remove.push(seqno); } } @@ -1145,7 +1144,7 @@ impl DrmScheme { /// is signaled. Called from the CS-wait / page-flip completion /// path. Mirrors the role of drm_syncobj::drm_syncobj_signal_ioctl. fn complete_fence(&mut self, seqno: u64) { - self.fence_eventfds.remove(&(seqno, 0)); + self.fence_eventfds.remove(&seqno); } fn query_last_completed_seqno(&self) -> u64 { @@ -2172,49 +2171,49 @@ impl DrmScheme { REDOX_DRM_IOCTL_I915_GETPARAM => { let mut req = decode_wire::(payload)?; - self.driver.i915_getparam(req.param, &mut req.value)?; + self.driver.i915_getparam(req.param, &mut req.value).map_err(driver_to_syscall)?; bytes_of(&req) } REDOX_DRM_IOCTL_I915_GEM_CREATE => { let mut req = decode_wire::(payload)?; - self.driver.i915_gem_create(req.size, &mut req.handle)?; + self.driver.i915_gem_create(req.size, &mut req.handle).map_err(driver_to_syscall)?; bytes_of(&req) } REDOX_DRM_IOCTL_I915_GEM_MMAP_OFFSET => { let mut req = decode_wire::(payload)?; - self.driver.i915_gem_mmap_offset(req.handle, &mut req.offset)?; + self.driver.i915_gem_mmap_offset(req.handle, &mut req.offset).map_err(driver_to_syscall)?; bytes_of(&req) } REDOX_DRM_IOCTL_I915_GEM_SET_TILING => { let mut req = decode_wire::(payload)?; self.driver.i915_gem_set_tiling( req.handle, req.tiling_mode, req.stride, req.swizzle_mode, - )?; - req.swizzle_mode = self.driver.i915_gem_get_tiling_swizzle(req.handle)?; + ).map_err(driver_to_syscall)?; + req.swizzle_mode = self.driver.i915_gem_get_tiling_swizzle(req.handle).map_err(driver_to_syscall)?; bytes_of(&req) } REDOX_DRM_IOCTL_I915_GEM_GET_TILING => { let mut req = decode_wire::(payload)?; self.driver.i915_gem_get_tiling( req.handle, &mut req.tiling_mode, &mut req.stride, &mut req.swizzle_mode, - )?; + ).map_err(driver_to_syscall)?; bytes_of(&req) } REDOX_DRM_IOCTL_I915_GEM_SET_DOMAIN => { let req = decode_wire::(payload)?; self.driver.i915_gem_set_domain( req.handle, req.read_domains, req.write_domain, - )?; + ).map_err(driver_to_syscall)?; Vec::new() } REDOX_DRM_IOCTL_I915_GEM_BUSY => { let mut req = decode_wire::(payload)?; - req.busy = if self.driver.i915_gem_busy(req.handle)? { 1 } else { 0 }; + req.busy = if self.driver.i915_gem_busy(req.handle).map_err(driver_to_syscall)? { 1 } else { 0 }; bytes_of(&req) } REDOX_DRM_IOCTL_I915_GEM_WAIT => { let mut req = decode_wire::(payload)?; - let completed = self.driver.i915_gem_wait(req.handle, req.timeout_ns)?; + let completed = self.driver.i915_gem_wait(req.handle, req.timeout_ns).map_err(driver_to_syscall)?; if !completed { return Err(Error::new(syscall::error::ETIMEDOUT)); } @@ -2223,18 +2222,18 @@ impl DrmScheme { } REDOX_DRM_IOCTL_I915_GEM_MADVISE => { let mut req = decode_wire::(payload)?; - let retained = self.driver.i915_gem_madvise(req.handle, req.state)?; + let retained = self.driver.i915_gem_madvise(req.handle, req.state).map_err(driver_to_syscall)?; req.retained = u32::from(retained); bytes_of(&req) } REDOX_DRM_IOCTL_I915_GEM_CONTEXT_CREATE => { let mut req = decode_wire::(payload)?; - self.driver.i915_gem_context_create(&mut req.ctx_id)?; + self.driver.i915_gem_context_create(&mut req.ctx_id).map_err(driver_to_syscall)?; bytes_of(&req) } REDOX_DRM_IOCTL_I915_GEM_CONTEXT_DESTROY => { let req = decode_wire::(payload)?; - self.driver.i915_gem_context_destroy(req.ctx_id)?; + self.driver.i915_gem_context_destroy(req.ctx_id).map_err(driver_to_syscall)?; Vec::new() } REDOX_DRM_IOCTL_I915_GEM_EXECBUFFER2 => { @@ -2244,9 +2243,9 @@ impl DrmScheme { req.batch_start_offset as u64, req.batch_len, &[], - )?; + ).map_err(driver_to_syscall)?; let mut resp = req; - let resp_bytes = bytes_of(&resp); + let mut resp_bytes = bytes_of(&resp); let len = resp_bytes.len(); if len >= 8 { let seqno_bytes = (seqno).to_le_bytes(); @@ -2261,21 +2260,22 @@ impl DrmScheme { let data_start = 8; let data_end = data_start + len as usize; let mut data = payload[data_start..data_end].to_vec(); - self.driver.i915_query(req.query_id, &mut data)?; + self.driver.i915_query(req.query_id, &mut data).map_err(driver_to_syscall)?; let mut resp = payload.to_vec(); resp.splice(data_start..data_end, data); - return Ok(resp); + resp + } else { + Vec::new() } - Vec::new() } REDOX_DRM_IOCTL_I915_GEM_VM_CREATE => { let mut req = decode_wire::(payload)?; - self.driver.i915_gem_vm_create(&mut req.vm_id)?; + self.driver.i915_gem_vm_create(&mut req.vm_id).map_err(driver_to_syscall)?; bytes_of(&req) } REDOX_DRM_IOCTL_I915_GEM_VM_DESTROY => { let req = decode_wire::(payload)?; - self.driver.i915_gem_vm_destroy(req.vm_id)?; + self.driver.i915_gem_vm_destroy(req.vm_id).map_err(driver_to_syscall)?; Vec::new() } REDOX_DRM_IOCTL_I915_GEM_VM_BIND => { @@ -2299,7 +2299,7 @@ impl DrmScheme { 0, 0, req.flags, - )?; + ).map_err(driver_to_syscall)?; } req.num_binds = 0; bytes_of(&req) @@ -2308,39 +2308,39 @@ impl DrmScheme { let mut req = decode_wire::(payload)?; self.driver.amdgpu_gem_create( req.alloc_size, req.domains, req.flags, &mut req.handle, - )?; + ).map_err(driver_to_syscall)?; bytes_of(&req) } REDOX_DRM_IOCTL_AMDGPU_CTX => { let mut req = decode_wire::(payload)?; - self.driver.amdgpu_ctx(req.op, &mut req.ctx_id, req.param)?; + self.driver.amdgpu_ctx(req.op, &mut req.ctx_id, req.param).map_err(driver_to_syscall)?; bytes_of(&req) } REDOX_DRM_IOCTL_AMDGPU_CS => { let mut req = decode_wire::(payload)?; let seqno = self.driver.amdgpu_cs( req.ctx_id, &[], &[], - )?; + ).map_err(driver_to_syscall)?; req.seqno = seqno; bytes_of(&req) } REDOX_DRM_IOCTL_AMDGPU_VM => { let mut req = decode_wire::(payload)?; - self.driver.amdgpu_vm(req.op, &mut req.vm_id)?; + self.driver.amdgpu_vm(req.op, &mut req.vm_id).map_err(driver_to_syscall)?; bytes_of(&req) } REDOX_DRM_IOCTL_AMDGPU_BO_LIST => { let mut req = decode_wire::(payload)?; self.driver.amdgpu_bo_list( req.op, &mut req.list_handle, &[], - )?; + ).map_err(driver_to_syscall)?; bytes_of(&req) } REDOX_DRM_IOCTL_AMDGPU_WAIT_FENCES => { let req = decode_wire::(payload)?; let _completed = self.driver.amdgpu_wait_fences( &[], req.timeout_ns, req.wait_domain, - )?; + ).map_err(driver_to_syscall)?; Vec::new() } REDOX_DRM_IOCTL_AMDGPU_INFO => { @@ -2350,18 +2350,19 @@ impl DrmScheme { let data_start = 8; let data_end = data_start + len as usize; let mut data = payload[data_start..data_end].to_vec(); - self.driver.amdgpu_info(req.query_id, &mut data)?; + self.driver.amdgpu_info(req.query_id, &mut data).map_err(driver_to_syscall)?; let mut resp = payload.to_vec(); resp.splice(data_start..data_end, data); - return Ok(resp); + resp + } else { + Vec::new() } - Vec::new() } REDOX_DRM_IOCTL_AMDGPU_FENCE_TO_HANDLE => { let mut req = decode_wire::(payload)?; self.driver.amdgpu_fence_to_handle( req.fence, req.flags, &mut req.handle, - )?; + ).map_err(driver_to_syscall)?; bytes_of(&req) } @@ -2851,7 +2852,7 @@ impl SchemeSync for DrmScheme { // Fence handles report the CS seqno as an 8-byte LE value // when the ring has reached the requested target. if let NodeKind::Fence { seqno } = handle.node { - if self.fence_eventfds.remove(&(seqno, 0)).is_none() { + if self.fence_eventfds.remove(&seqno).is_none() { // Not registered: signal immediately. The CS ring // must already be past the requested seqno (the // submitter of the FENCE_EVENTFD ioctl recorded