@@ -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