Currently nova-drm reads the VRAM BAR size directly from the PCIe device which requires trying to cast the parent device into a PCIe device. This obviously requires the parent device to actually be a PCIe bus device. Whilst that is true today it may not always be the case, and there is no reason to make this assumption now that NovaCoreApi can hold a reference to the bound PCIe device.
So convert nova-drm to using nova-core to obtain the VRAM_BAR_SIZE parameter. Signed-off-by: Alistair Popple <[email protected]> --- drivers/gpu/drm/nova/file.rs | 10 ++-------- drivers/gpu/nova-core/api.rs | 8 ++++++++ drivers/gpu/nova-core/driver.rs | 2 +- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/drivers/gpu/drm/nova/file.rs b/drivers/gpu/drm/nova/file.rs index 31aea3283474..de645f9197ad 100644 --- a/drivers/gpu/drm/nova/file.rs +++ b/drivers/gpu/drm/nova/file.rs @@ -8,14 +8,11 @@ use crate::gem::NovaObject; use kernel::{ alloc::flags::*, - auxiliary, - device::Bound, drm::{ self, gem::BaseObject, Registered, // }, - pci, prelude::*, uapi, }; @@ -33,16 +30,13 @@ fn open(_dev: &NovaDevice) -> Result<Pin<KBox<Self>>> { impl File { /// IOCTL: get_param: Query GPU / driver metadata. pub(crate) fn get_param( - dev: &NovaDevice<Registered>, + _dev: &NovaDevice<Registered>, reg_data: &DrmRegData<'_>, getparam: &mut uapi::drm_nova_getparam, _file: &drm::File<File>, ) -> Result<u32> { - let adev: &auxiliary::Device<Bound> = dev.as_ref(); - let pdev: &pci::Device<Bound> = adev.parent().try_into()?; - let value = match getparam.param as u32 { - uapi::NOVA_GETPARAM_VRAM_BAR_SIZE => pdev.resource_len(1)?, + uapi::NOVA_GETPARAM_VRAM_BAR_SIZE => reg_data.api.vram_bar_size()?, uapi::NOVA_GETPARAM_GPU_CHIPSET => reg_data.api.chipset() as u64, uapi::NOVA_GETPARAM_VRAM_SIZE => reg_data.api.vram_size(), _ => return Err(EINVAL), diff --git a/drivers/gpu/nova-core/api.rs b/drivers/gpu/nova-core/api.rs index f025df90dc5d..d7b18e33b5f5 100644 --- a/drivers/gpu/nova-core/api.rs +++ b/drivers/gpu/nova-core/api.rs @@ -8,6 +8,7 @@ use kernel::{ auxiliary, device::Bound, + pci, prelude::*, types::CovariantForLt, // }; @@ -20,6 +21,7 @@ /// API handle for the auxiliary bus child drivers to interact with nova-core. pub struct NovaCoreApi<'bound> { pub(crate) gpu: Pin<&'bound Gpu<'bound>>, + pub(crate) pdev: &'bound pci::Device<Bound>, } impl NovaCoreApi<'_> { @@ -34,6 +36,12 @@ pub fn chipset(&self) -> Chipset { self.gpu.spec.chipset } + /// Returns the size of the PCIe BAR used for accessing VRAM, typically + /// BAR1. + pub fn vram_bar_size(&self) -> Result<u64> { + self.pdev.resource_len(1) + } + /// Returns the total usable VRAM size of this GPU in bytes. pub fn vram_size(&self) -> u64 { self.gpu.gsp_static_info.vram_size() diff --git a/drivers/gpu/nova-core/driver.rs b/drivers/gpu/nova-core/driver.rs index a5dabc84fbc6..84c713b23c53 100644 --- a/drivers/gpu/nova-core/driver.rs +++ b/drivers/gpu/nova-core/driver.rs @@ -111,7 +111,7 @@ fn probe<'bound>( // never recycles IDs. AUXILIARY_ID_COUNTER.fetch_add(1, Relaxed), crate::MODULE_NAME, - NovaCoreApi { gpu }, + NovaCoreApi { gpu, pdev }, )? } }, -- 2.54.0
