Skip to content

Commit e0fbfb2

Browse files
jannauherrnst
authored andcommitted
drm/asahi: Move unsafe data initialization to driver code
Keep the drm_device private data initialization after device creation hacks out of rust/drm/device.rs. This will hopefully soon be solved by device context for drm::device::Device. Signed-off-by: Janne Grunau <[email protected]>
1 parent ae6b625 commit e0fbfb2

1 file changed

Lines changed: 18 additions & 9 deletions

File tree

drivers/gpu/drm/asahi/driver.rs

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -177,25 +177,31 @@ impl platform::Driver for AsahiDriver {
177177
.property_read_array_vec(c_str!("apple,firmware-compat"), 3)?
178178
.required_by(pdev.as_ref())?;
179179

180-
let raw_drm = unsafe { drm::device::Device::<AsahiDriver>::new_uninit(pdev.as_ref())? };
181-
182-
let drm: AsahiDevRef = unsafe { ARef::from_raw(raw_drm) };
180+
// TODO: This is very temporary
181+
// SAFETY: This should be safe as data is not touched by the driver
182+
// untill it gets fully initialised.
183+
// Additionally drm::device::Device::release() will not drop data and
184+
// leaks instead.
185+
let uninit = unsafe {
186+
pin_init::pin_init_from_closure::<AsahiData, kernel::error::Error>(|_slot| Ok(()))
187+
};
188+
let drm: ARef<AsahiDevice> = drm::device::Device::new(pdev.as_ref(), uninit)?;
183189

184190
let gpu = match (cfg.gpu_gen, cfg.gpu_variant, compat.as_slice()) {
185191
(hw::GpuGen::G13, _, &[12, 3, 0]) => {
186-
gpu::GpuManagerG13V12_3::new(&drm, &res, cfg)? as Arc<dyn gpu::GpuManager>
192+
gpu::GpuManagerG13V12_3::new(&drm.clone(), &res, cfg)? as Arc<dyn gpu::GpuManager>
187193
}
188194
(hw::GpuGen::G14, hw::GpuVariant::G, &[12, 4, 0]) => {
189-
gpu::GpuManagerG14V12_4::new(&drm, &res, cfg)? as Arc<dyn gpu::GpuManager>
195+
gpu::GpuManagerG14V12_4::new(&drm.clone(), &res, cfg)? as Arc<dyn gpu::GpuManager>
190196
}
191197
(hw::GpuGen::G13, _, &[13, 5, 0]) => {
192-
gpu::GpuManagerG13V13_5::new(&drm, &res, cfg)? as Arc<dyn gpu::GpuManager>
198+
gpu::GpuManagerG13V13_5::new(&drm.clone(), &res, cfg)? as Arc<dyn gpu::GpuManager>
193199
}
194200
(hw::GpuGen::G14, hw::GpuVariant::G, &[13, 5, 0]) => {
195-
gpu::GpuManagerG14V13_5::new(&drm, &res, cfg)? as Arc<dyn gpu::GpuManager>
201+
gpu::GpuManagerG14V13_5::new(&drm.clone(), &res, cfg)? as Arc<dyn gpu::GpuManager>
196202
}
197203
(hw::GpuGen::G14, _, &[13, 5, 0]) => {
198-
gpu::GpuManagerG14XV13_5::new(&drm, &res, cfg)? as Arc<dyn gpu::GpuManager>
204+
gpu::GpuManagerG14XV13_5::new(&drm.clone(), &res, cfg)? as Arc<dyn gpu::GpuManager>
199205
}
200206
_ => {
201207
dev_info!(
@@ -215,7 +221,10 @@ impl platform::Driver for AsahiDriver {
215221
resources: res,
216222
});
217223

218-
let drm = unsafe { AsahiDevice::init_data(raw_drm, data)? };
224+
let ptr: *const AsahiData = &raw const **drm;
225+
unsafe {
226+
data.__pinned_init(ptr as *mut AsahiData)?;
227+
}
219228

220229
(*drm).gpu.init()?;
221230

0 commit comments

Comments
 (0)