[PATCH 5/6] nouveau/gsp: add some more fields to r570 system info

Dave Airlie <[email protected]> Wed, 29 Jul 2026 14:15:29 +1000
Newsgroups org.freedesktop.lists.nouveau,org.freedesktop.lists.dri-devel
Message-ID <[email protected]>
From: Dave Airlie <[email protected]>

This just adds the pci io bar, link cap and os page size to the r570.

Signed-off-by: Dave Airlie <[email protected]>
---
 drivers/gpu/drm/nouveau/include/nvkm/core/device.h  |  2 ++
 drivers/gpu/drm/nouveau/nvkm/engine/device/pci.c    | 13 +++++++++++++
 .../gpu/drm/nouveau/nvkm/subdev/gsp/rm/r570/gsp.c   |  5 +++++
 3 files changed, 20 insertions(+)

diff --git a/drivers/gpu/drm/nouveau/include/nvkm/core/device.h b/drivers/g=
pu/drm/nouveau/include/nvkm/core/device.h
index 954a89d43bad..68b2d8a0b78c 100644
--- a/drivers/gpu/drm/nouveau/include/nvkm/core/device.h
+++ b/drivers/gpu/drm/nouveau/include/nvkm/core/device.h
@@ -86,6 +86,7 @@ enum nvkm_bar_id {
 =09NVKM_BAR0_PRI,
 =09NVKM_BAR1_FB,
 =09NVKM_BAR2_INST,
+=09NVKM_BAR3_IO,
 };
=20
 struct nvkm_device_func {
@@ -99,6 +100,7 @@ struct nvkm_device_func {
 =09resource_size_t (*resource_addr)(struct nvkm_device *, enum nvkm_bar_id=
);
 =09resource_size_t (*resource_size)(struct nvkm_device *, enum nvkm_bar_id=
);
 =09bool cpu_coherent;
+=09int (*link_cap)(struct nvkm_device *, u32 *lnk_cap);
 };
=20
 struct nvkm_device_quirk {
diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/device/pci.c b/drivers/gpu=
/drm/nouveau/nvkm/engine/device/pci.c
index 248623b91e29..7cfa21d9abaa 100644
--- a/drivers/gpu/drm/nouveau/nvkm/engine/device/pci.c
+++ b/drivers/gpu/drm/nouveau/nvkm/engine/device/pci.c
@@ -1576,6 +1576,10 @@ nvkm_device_pci_resource_idx(struct nvkm_device_pci =
*pdev, enum nvkm_bar_id bar)
 =09if (bar =3D=3D NVKM_BAR2_INST)
 =09=09return idx;
=20
+=09idx +=3D (pci_resource_flags(pdev->pdev, idx) & IORESOURCE_MEM_64) ? 2 =
: 1;
+=09if (bar =3D=3D NVKM_BAR3_IO)
+=09=09return idx;
+
 =09WARN_ON(1);
 =09return -1;
 }
@@ -1628,6 +1632,14 @@ nvkm_device_pci_preinit(struct nvkm_device *device)
 =09return 0;
 }
=20
+static int
+nvkm_device_pci_link_cap(struct nvkm_device *device, u32 *lnk_cap)
+{
+=09struct nvkm_device_pci *pdev =3D nvkm_device_pci(device);
+
+=09return pcie_capability_read_dword(pdev->pdev, PCI_EXP_LNKCAP, lnk_cap);
+}
+
 static void *
 nvkm_device_pci_dtor(struct nvkm_device *device)
 {
@@ -1646,6 +1658,7 @@ nvkm_device_pci_func =3D {
 =09.resource_addr =3D nvkm_device_pci_resource_addr,
 =09.resource_size =3D nvkm_device_pci_resource_size,
 =09.cpu_coherent =3D !IS_ENABLED(CONFIG_ARM),
+=09.link_cap =3D nvkm_device_pci_link_cap,
 };
=20
 int
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r570/gsp.c b/driver=
s/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r570/gsp.c
index d9786830153d..857eda1e7439 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r570/gsp.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r570/gsp.c
@@ -165,6 +165,7 @@ r570_gsp_set_system_info(struct nvkm_gsp *gsp)
 =09info->gpuPhysAddr =3D device->func->resource_addr(device, NVKM_BAR0_PRI=
);
 =09info->gpuPhysFbAddr =3D device->func->resource_addr(device, NVKM_BAR1_F=
B);
 =09info->gpuPhysInstAddr =3D device->func->resource_addr(device, NVKM_BAR2=
_INST);
+=09info->gpuPhysIoAddr =3D device->func->resource_addr(device, NVKM_BAR3_I=
O);
 =09info->nvDomainBusDeviceFunc =3D pci_dev_id(pdev);
 =09info->maxUserVa =3D TASK_SIZE;
 =09info->pciConfigMirrorBase =3D device->pci->func->cfg.addr;
@@ -175,6 +176,10 @@ r570_gsp_set_system_info(struct nvkm_gsp *gsp)
 =09r570_gsp_acpi_info(gsp, &info->acpiMethodData);
 =09info->bIsPrimary =3D video_is_primary_device(device->dev);
 =09info->bPreserveVideoMemoryAllocations =3D false;
+=09info->hostPageSize =3D PAGE_SIZE;
+
+=09if (device->func->link_cap)
+=09=09device->func->link_cap(device, &info->pcieConfigReg.linkCap);
=20
 =09return nvkm_gsp_rpc_wr(gsp, info, NVKM_GSP_RPC_REPLY_NOSEQ);
 }
--=20
2.55.0