diff --git a/.pick_status.json b/.pick_status.json index b982d0ca43e..9932a3d8bb8 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -714,7 +714,7 @@ "description": "nouveau: use nv_devince_info and fill in PCI and type information", "nominated": true, "nomination_type": 0, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null, "notes": null diff --git a/src/gallium/drivers/nouveau/meson.build b/src/gallium/drivers/nouveau/meson.build index 15344ab7c34..d3df4b701a1 100644 --- a/src/gallium/drivers/nouveau/meson.build +++ b/src/gallium/drivers/nouveau/meson.build @@ -169,7 +169,14 @@ libnouveau = static_library( ], gnu_symbol_visibility : 'hidden', link_with : [libnouveauwinsys], - dependencies : [dep_libdrm, idep_libnouveauwinsys, idep_nouveau_codegen, idep_mesautil, idep_nir_headers], + dependencies : [ + dep_libdrm, + idep_libnouveauwinsys, + idep_mesautil, + idep_nir_headers, + idep_nouveau_codegen, + idep_nvidia_headers, + ], ) driver_nouveau = declare_dependency( diff --git a/src/gallium/winsys/nouveau/drm/nouveau.c b/src/gallium/winsys/nouveau/drm/nouveau.c index fc9332b205a..d487e89fdbc 100644 --- a/src/gallium/winsys/nouveau/drm/nouveau.c +++ b/src/gallium/winsys/nouveau/drm/nouveau.c @@ -13,7 +13,6 @@ #include "nvif/ioctl.h" #include "nv_push.h" -#include "nv_device_info.h" #include "util/bitscan.h" #include "util/list.h" @@ -412,6 +411,39 @@ nouveau_device_new(struct nouveau_object *parent, struct nouveau_device **pdev) goto done; nvdev->base.chipset = info.chipset; + nvdev->base.info.chipset = info.chipset; + switch (info.platform) { + case NV_DEVICE_INFO_V0_PCI: + case NV_DEVICE_INFO_V0_AGP: + case NV_DEVICE_INFO_V0_PCIE: + nvdev->base.info.type = NV_DEVICE_TYPE_DIS; + break; + case NV_DEVICE_INFO_V0_IGP: + nvdev->base.info.type = NV_DEVICE_TYPE_IGP; + break; + case NV_DEVICE_INFO_V0_SOC: + nvdev->base.info.type = NV_DEVICE_TYPE_SOC; + break; + default: + unreachable("unhandled nvidia device type"); + break; + } + + drmDevicePtr drm_device; + ret = drmGetDevice2(drm->fd, 0, &drm_device); + if (ret) + goto done; + + if (drm_device->bustype == DRM_BUS_PCI) { + nvdev->base.info.pci.domain = drm_device->businfo.pci->domain; + nvdev->base.info.pci.bus = drm_device->businfo.pci->bus; + nvdev->base.info.pci.dev = drm_device->businfo.pci->dev; + nvdev->base.info.pci.func = drm_device->businfo.pci->func; + nvdev->base.info.pci.revision_id = drm_device->deviceinfo.pci->revision_id; + nvdev->base.info.device_id = drm_device->deviceinfo.pci->device_id; + } + + drmFreeDevice(&drm_device); ret = nouveau_getparam(dev, NOUVEAU_GETPARAM_FB_SIZE, &v); if (ret) diff --git a/src/gallium/winsys/nouveau/drm/nouveau.h b/src/gallium/winsys/nouveau/drm/nouveau.h index 7b03241661c..29f68bee397 100644 --- a/src/gallium/winsys/nouveau/drm/nouveau.h +++ b/src/gallium/winsys/nouveau/drm/nouveau.h @@ -7,6 +7,7 @@ #include "util/list.h" #include "drm-uapi/nouveau_drm.h" +#include "nv_device_info.h" #define NOUVEAU_FIFO_CHANNEL_CLASS 0x80000001 #define NOUVEAU_NOTIFIER_CLASS 0x80000002 @@ -50,6 +51,10 @@ struct nouveau_device { uint64_t gart_size; uint64_t vram_limit; uint64_t gart_limit; + + /* only pci info and device type are set */ + struct nv_device_info info; + /* classes for common push buf dumping */ uint32_t cls_eng3d; uint32_t cls_compute;