Skip to content

Commit b5c37ef

Browse files
committed
soc: apple: pmp: Avoid unnecessary try_access() calls
A Bound device is available use this to prove that the IoMem is guaranteed to be available. Simplifies the code and avoids indirection through pmp_read32(). Signed-off-by: Janne Grunau <j@jannau.net>
1 parent d183f64 commit b5c37ef

1 file changed

Lines changed: 21 additions & 29 deletions

File tree

drivers/soc/apple/pmp.rs

Lines changed: 21 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -130,8 +130,8 @@ impl PmpData {
130130
GFP_KERNEL,
131131
)
132132
}
133-
fn start_cpu(&self) -> Result<()> {
134-
let asc_mmio = self.asc_mmio.try_access().ok_or(ENXIO)?;
133+
fn start_cpu(&self, dev: &platform::Device<Core>) -> Result<()> {
134+
let asc_mmio = self.asc_mmio.access(dev.as_ref())?;
135135
let val = asc_mmio.read32_relaxed(CPU_CONTROL);
136136
asc_mmio.write32_relaxed(val | CPU_RUN, CPU_CONTROL);
137137
Ok(())
@@ -142,21 +142,12 @@ impl PmpData {
142142
rtk.as_mut().wake()?;
143143
rtk.start_endpoint(PMP_ENDPOINT)
144144
}
145-
fn pmp_read32(&self, off: usize) -> u32 {
146-
if let Some(pmp_mmio) = self.pmp_mmio.try_access() {
147-
pmp_mmio.read32_relaxed(off)
148-
} else {
149-
0
150-
}
151-
}
152-
fn patch_bootargs(&self, patches: &[(u32, u32)]) -> Result<()> {
153-
let offset = self.pmp_read32(BOOTARGS_OFFSET) as usize;
154-
let size = self.pmp_read32(BOOTARGS_SIZE) as usize;
145+
fn patch_bootargs(&self, dev: &platform::Device<Core>, patches: &[(u32, u32)]) -> Result<()> {
146+
let io = self.pmp_mmio.access(dev.as_ref())?;
147+
let offset = io.read32_relaxed(BOOTARGS_OFFSET) as usize;
148+
let size = io.read32_relaxed(BOOTARGS_SIZE) as usize;
155149
let mut arg_bytes = kvec![0u8; size]?;
156-
{
157-
let pmp_mmio = self.pmp_mmio.try_access().ok_or(ENXIO)?;
158-
pmp_mmio.try_memcpy_fromio(&mut arg_bytes, offset)?;
159-
}
150+
io.try_memcpy_fromio(&mut arg_bytes, offset)?;
160151
let mut idx = 0;
161152
while idx < size {
162153
let key = u32::from_le_bytes(arg_bytes[idx..idx + 4].try_into().unwrap());
@@ -171,10 +162,7 @@ impl PmpData {
171162
}
172163
idx += size;
173164
}
174-
{
175-
let pmp_mmio = self.pmp_mmio.try_access().ok_or(ENXIO)?;
176-
pmp_mmio.try_memcpy_toio(offset, &arg_bytes)
177-
}
165+
io.try_memcpy_toio(offset, &arg_bytes)
178166
}
179167
fn get_iova_table(&self) -> Result<u64> {
180168
let mut state = self.state.lock();
@@ -416,18 +404,22 @@ impl platform::Driver for PmpDriver {
416404
.required_by(&dev)?;
417405
let bdid = node.property_read(c"apple,board-id").required_by(&dev)?;
418406
match node.property_read(c"apple,dram-capacity").optional() {
419-
Some(dcap) => data.patch_bootargs(&[
420-
(from_fourcc(b"BDID"), bdid),
421-
(from_fourcc(b"DCAP"), dcap),
422-
(from_fourcc(b"DVID"), dvid),
423-
])?,
424-
None => {
425-
data.patch_bootargs(&[(from_fourcc(b"BDID"), bdid), (from_fourcc(b"DVID"), dvid)])?
426-
}
407+
Some(dcap) => data.patch_bootargs(
408+
pdev,
409+
&[
410+
(from_fourcc(b"BDID"), bdid),
411+
(from_fourcc(b"DCAP"), dcap),
412+
(from_fourcc(b"DVID"), dvid),
413+
],
414+
)?,
415+
None => data.patch_bootargs(
416+
pdev,
417+
&[(from_fourcc(b"BDID"), bdid), (from_fourcc(b"DVID"), dvid)],
418+
)?,
427419
};
428420
let rtkit = rtkit::RtKit::<PmpData>::new(&dev, None, 0, data.clone())?;
429421
*data.rtkit.lock() = Some(rtkit);
430-
data.start_cpu()?;
422+
data.start_cpu(pdev)?;
431423
data.start()?;
432424
Ok(PmpDriver(data))
433425
}

0 commit comments

Comments
 (0)