Skip to content

Commit 6594dcb

Browse files
committed
fixup! soc: apple: Add SEP driver.
Adjust to newer DMA coherent allocator series. Signed-off-by: Janne Grunau <[email protected]>
1 parent 95a0452 commit 6594dcb

1 file changed

Lines changed: 23 additions & 32 deletions

File tree

drivers/soc/apple/sep.rs

Lines changed: 23 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
//!
66
//! Copyright (C) The Asahi Linux Contributors
77
8-
use core::slice;
98
use core::sync::atomic::{AtomicBool, Ordering};
109

1110
use kernel::{
@@ -39,76 +38,68 @@ const MSG_DATA_SHIFT: u32 = 32;
3938

4039
const IOVA_SHIFT: u32 = 0xC;
4140

42-
type ShMem = dma::CoherentAllocation<u8, dma::CoherentAllocator>;
41+
type ShMem = dma::CoherentAllocation<u8>;
4342

4443
fn align_up(v: usize, a: usize) -> usize {
4544
(v + a - 1) & !(a - 1)
4645
}
4746

48-
fn memcpy_to_iomem(
49-
iomem: &ShMem,
50-
dev: &ARef<device::Device>,
51-
off: usize,
52-
src: &[u8],
53-
) -> Result<()> {
54-
if off + src.len() > iomem.count() {
55-
dev_err!(dev, "Out of bounds iomem write");
56-
return Err(EIO);
57-
}
58-
// SAFETY: We checked that it is in bounds above
47+
fn memcpy_to_iomem(iomem: &ShMem, off: usize, src: &[u8]) -> Result<()> {
48+
// SAFETY:
49+
// as_slice_mut() checks that off and src.len() are whithin iomem's limits.
50+
// memcpy_to_iomem is only called from within probe() ansuring there are no
51+
// concurrent read and write accesses to the same region while the slice is
52+
// alive per as_slice_mut()'s requiremnts.
5953
unsafe {
60-
let ptr = iomem.first_ptr_mut().offset(off as isize);
61-
let target = slice::from_raw_parts_mut(ptr, src.len());
54+
let target = iomem.as_slice_mut(off, src.len())?;
6255
target.copy_from_slice(src);
6356
}
6457
Ok(())
6558
}
6659

6760
fn build_shmem(dev: ARef<device::Device>) -> Result<ShMem> {
6861
let of = dev.of_node().ok_or(EIO)?;
69-
let iomem = dma::try_alloc_coherent(dev.clone(), SHMEM_SIZE, false)?;
62+
let iomem = dma::CoherentAllocation::<u8>::alloc_coherent(dev.clone(), SHMEM_SIZE, GFP_KERNEL)?;
7063

7164
let panic_offset = 0x4000;
7265
let panic_size = 0x8000;
73-
memcpy_to_iomem(&iomem, &dev, panic_offset, &1u32.to_le_bytes())?;
66+
memcpy_to_iomem(&iomem, panic_offset, &1u32.to_le_bytes())?;
7467

7568
let lpol_offset = panic_offset + panic_size;
7669
let lpol = of
7770
.find_property(c_str!("local-policy-manifest"))
7871
.ok_or(EIO)?;
7972
memcpy_to_iomem(
8073
&iomem,
81-
&dev,
8274
lpol_offset,
8375
&(lpol.value().len() as u32).to_le_bytes(),
8476
)?;
85-
memcpy_to_iomem(&iomem, &dev, lpol_offset + 4, lpol.value())?;
77+
memcpy_to_iomem(&iomem, lpol_offset + 4, lpol.value())?;
8678
let lpol_size = align_up(lpol.value().len() + 4, 0x4000);
8779

8880
let ibot_offset = lpol_offset + lpol_size;
8981
let ibot = of.find_property(c_str!("iboot-manifest")).ok_or(EIO)?;
9082
memcpy_to_iomem(
9183
&iomem,
92-
&dev,
9384
ibot_offset,
9485
&(ibot.value().len() as u32).to_le_bytes(),
9586
)?;
96-
memcpy_to_iomem(&iomem, &dev, ibot_offset + 4, ibot.value())?;
87+
memcpy_to_iomem(&iomem, ibot_offset + 4, ibot.value())?;
9788
let ibot_size = align_up(ibot.value().len() + 4, 0x4000);
9889

99-
memcpy_to_iomem(&iomem, &dev, 0, b"CNIP")?;
100-
memcpy_to_iomem(&iomem, &dev, 4, &(panic_size as u32).to_le_bytes())?;
101-
memcpy_to_iomem(&iomem, &dev, 8, &(panic_offset as u32).to_le_bytes())?;
90+
memcpy_to_iomem(&iomem, 0, b"CNIP")?;
91+
memcpy_to_iomem(&iomem, 4, &(panic_size as u32).to_le_bytes())?;
92+
memcpy_to_iomem(&iomem, 8, &(panic_offset as u32).to_le_bytes())?;
10293

103-
memcpy_to_iomem(&iomem, &dev, 16, b"OPLA")?;
104-
memcpy_to_iomem(&iomem, &dev, 16 + 4, &(lpol_size as u32).to_le_bytes())?;
105-
memcpy_to_iomem(&iomem, &dev, 16 + 8, &(lpol_offset as u32).to_le_bytes())?;
94+
memcpy_to_iomem(&iomem, 16, b"OPLA")?;
95+
memcpy_to_iomem(&iomem, 16 + 4, &(lpol_size as u32).to_le_bytes())?;
96+
memcpy_to_iomem(&iomem, 16 + 8, &(lpol_offset as u32).to_le_bytes())?;
10697

107-
memcpy_to_iomem(&iomem, &dev, 32, b"IPIS")?;
108-
memcpy_to_iomem(&iomem, &dev, 32 + 4, &(ibot_size as u32).to_le_bytes())?;
109-
memcpy_to_iomem(&iomem, &dev, 32 + 8, &(ibot_offset as u32).to_le_bytes())?;
98+
memcpy_to_iomem(&iomem, 32, b"IPIS")?;
99+
memcpy_to_iomem(&iomem, 32 + 4, &(ibot_size as u32).to_le_bytes())?;
100+
memcpy_to_iomem(&iomem, 32 + 8, &(ibot_offset as u32).to_le_bytes())?;
110101

111-
memcpy_to_iomem(&iomem, &dev, 48, b"llun")?;
102+
memcpy_to_iomem(&iomem, 48, b"llun")?;
112103
Ok(iomem)
113104
}
114105

@@ -207,7 +198,7 @@ impl SepData {
207198
},
208199
false,
209200
)?;
210-
let shm_addr = self.shmem.dma_handle >> IOVA_SHIFT;
201+
let shm_addr = self.shmem.dma_handle() >> IOVA_SHIFT;
211202
mbox.send(
212203
Message {
213204
msg0: EP_SHMEM | (MSG_SET_SHMEM << MSG_TYPE_SHIFT) | (shm_addr << MSG_DATA_SHIFT),

0 commit comments

Comments
 (0)