]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/nouveau/pci: add PRI address of config space mirror to nvkm_pci_func
authorBen Skeggs <bskeggs@nvidia.com>
Thu, 30 Jan 2025 15:56:33 +0000 (01:56 +1000)
committerDave Airlie <airlied@redhat.com>
Sun, 18 May 2025 20:29:26 +0000 (06:29 +1000)
These registers have moved on GH100/GBxxx, and the GSP-RM init code uses
hardcoded values from earlier GPUs to fill GspSystemInfo.

Replace the per-GPU accessors in nvkm_pci_func with region info, and use
it when initialising GspSystemInfo.

Signed-off-by: Ben Skeggs <bskeggs@nvidia.com>
Reviewed-by: Dave Airlie <airlied@redhat.com>
Reviewed-by: Timur Tabi <ttabi@nvidia.com>
Tested-by: Timur Tabi <ttabi@nvidia.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
15 files changed:
drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/gsp.c
drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r570/gsp.c
drivers/gpu/drm/nouveau/nvkm/subdev/pci/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/pci/g84.c
drivers/gpu/drm/nouveau/nvkm/subdev/pci/g92.c
drivers/gpu/drm/nouveau/nvkm/subdev/pci/g94.c
drivers/gpu/drm/nouveau/nvkm/subdev/pci/gf100.c
drivers/gpu/drm/nouveau/nvkm/subdev/pci/gf106.c
drivers/gpu/drm/nouveau/nvkm/subdev/pci/gk104.c
drivers/gpu/drm/nouveau/nvkm/subdev/pci/gp100.c
drivers/gpu/drm/nouveau/nvkm/subdev/pci/nv04.c
drivers/gpu/drm/nouveau/nvkm/subdev/pci/nv40.c
drivers/gpu/drm/nouveau/nvkm/subdev/pci/nv46.c
drivers/gpu/drm/nouveau/nvkm/subdev/pci/nv4c.c
drivers/gpu/drm/nouveau/nvkm/subdev/pci/priv.h

index ce3d4dd49ac8065f665d8301456bcc55b27e0b2c..e2171d0d25bec1b9d4a27b58f891e367940233f1 100644 (file)
@@ -24,6 +24,7 @@
 #include "priv.h"
 
 #include <core/pci.h>
+#include <subdev/pci/priv.h>
 #include <subdev/timer.h>
 #include <subdev/vfn.h>
 #include <engine/fifo/chan.h>
@@ -905,8 +906,8 @@ r535_gsp_set_system_info(struct nvkm_gsp *gsp)
        info->gpuPhysInstAddr = device->func->resource_addr(device, 3);
        info->nvDomainBusDeviceFunc = pci_dev_id(pdev->pdev);
        info->maxUserVa = TASK_SIZE;
-       info->pciConfigMirrorBase = 0x088000;
-       info->pciConfigMirrorSize = 0x001000;
+       info->pciConfigMirrorBase = device->pci->func->cfg.addr;
+       info->pciConfigMirrorSize = device->pci->func->cfg.size;
        r535_gsp_acpi_info(gsp, &info->acpiMethodData);
 
        return nvkm_gsp_rpc_wr(gsp, info, NVKM_GSP_RPC_REPLY_NOWAIT);
index 55795c49371facb7d7b1903a76f8c0a1d31573af..a3c070d4192389f433c1cf6a8c0b706ccb491dab 100644 (file)
@@ -12,6 +12,7 @@
 #include "nvrm/msgfn.h"
 
 #include <core/pci.h>
+#include <subdev/pci/priv.h>
 
 static u32
 r570_gsp_sr_data_size(struct nvkm_gsp *gsp)
@@ -157,8 +158,8 @@ r570_gsp_set_system_info(struct nvkm_gsp *gsp)
        info->gpuPhysInstAddr = device->func->resource_addr(device, 3);
        info->nvDomainBusDeviceFunc = pci_dev_id(pdev);
        info->maxUserVa = TASK_SIZE;
-       info->pciConfigMirrorBase = 0x088000;
-       info->pciConfigMirrorSize = 0x001000;
+       info->pciConfigMirrorBase = device->pci->func->cfg.addr;
+       info->pciConfigMirrorSize = device->pci->func->cfg.size;
        info->PCIDeviceID = (pdev->device << 16) | pdev->vendor;
        info->PCISubDeviceID = (pdev->subsystem_device << 16) | pdev->subsystem_vendor;
        info->PCIRevisionID = pdev->revision;
index 5a0de45d36ce0d290c9ce6c1e034dcf32ace3b28..6867934256a768f58205a948f79222d223d89005 100644 (file)
@@ -39,26 +39,26 @@ nvkm_pci_msi_rearm(struct nvkm_device *device)
 u32
 nvkm_pci_rd32(struct nvkm_pci *pci, u16 addr)
 {
-       return pci->func->rd32(pci, addr);
+       return nvkm_rd32(pci->subdev.device, pci->func->cfg.addr + addr);
 }
 
 void
 nvkm_pci_wr08(struct nvkm_pci *pci, u16 addr, u8 data)
 {
-       pci->func->wr08(pci, addr, data);
+       nvkm_wr08(pci->subdev.device, pci->func->cfg.addr + addr, data);
 }
 
 void
 nvkm_pci_wr32(struct nvkm_pci *pci, u16 addr, u32 data)
 {
-       pci->func->wr32(pci, addr, data);
+       nvkm_wr32(pci->subdev.device, pci->func->cfg.addr + addr, data);
 }
 
 u32
 nvkm_pci_mask(struct nvkm_pci *pci, u16 addr, u32 mask, u32 value)
 {
-       u32 data = pci->func->rd32(pci, addr);
-       pci->func->wr32(pci, addr, (data & ~mask) | value);
+       u32 data = nvkm_pci_rd32(pci, addr);
+       nvkm_pci_wr32(pci, addr, (data & ~mask) | value);
        return data;
 }
 
index 5b29aacedef3bf450d7822927f51482fd4162175..5308f6539a3f0a8965f0c9b05dca5f38f2c960db 100644 (file)
@@ -132,10 +132,9 @@ g84_pcie_init(struct nvkm_pci *pci)
 
 static const struct nvkm_pci_func
 g84_pci_func = {
+       .cfg = { .addr = 0x088000, .size = 0x1000 },
+
        .init = g84_pci_init,
-       .rd32 = nv40_pci_rd32,
-       .wr08 = nv40_pci_wr08,
-       .wr32 = nv40_pci_wr32,
        .msi_rearm = nv46_pci_msi_rearm,
 
        .pcie.init = g84_pcie_init,
index a9e0674009c6f704ccb0f6af080bdc05c03cc1c0..8ae7aa02e6756b08b5bf466ff15351d63c4248d6 100644 (file)
@@ -33,10 +33,9 @@ g92_pcie_version_supported(struct nvkm_pci *pci)
 
 static const struct nvkm_pci_func
 g92_pci_func = {
+       .cfg = { .addr = 0x088000, .size = 0x1000 },
+
        .init = g84_pci_init,
-       .rd32 = nv40_pci_rd32,
-       .wr08 = nv40_pci_wr08,
-       .wr32 = nv40_pci_wr32,
        .msi_rearm = nv46_pci_msi_rearm,
 
        .pcie.init = g84_pcie_init,
index 7bacd0693283f37ce8d2fe223a3feaa8200262a7..df745d0690cae4898f115142655138a8c20beffb 100644 (file)
 
 static const struct nvkm_pci_func
 g94_pci_func = {
+       .cfg = { .addr = 0x088000, .size = 0x1000 },
+
        .init = g84_pci_init,
-       .rd32 = nv40_pci_rd32,
-       .wr08 = nv40_pci_wr08,
-       .wr32 = nv40_pci_wr32,
        .msi_rearm = nv40_pci_msi_rearm,
 
        .pcie.init = g84_pcie_init,
index 099906092fe15f66d1c6ff51ef142bd8c7e16b97..6ce941df87b7989a86aeaf925e6d5e4fbf5ecc08 100644 (file)
@@ -78,10 +78,9 @@ gf100_pcie_set_link(struct nvkm_pci *pci, enum nvkm_pcie_speed speed, u8 width)
 
 static const struct nvkm_pci_func
 gf100_pci_func = {
+       .cfg = { .addr = 0x088000, .size = 0x1000 },
+
        .init = g84_pci_init,
-       .rd32 = nv40_pci_rd32,
-       .wr08 = nv40_pci_wr08,
-       .wr32 = nv40_pci_wr32,
        .msi_rearm = gf100_pci_msi_rearm,
 
        .pcie.init = gf100_pcie_init,
index bcde609ba8666864f8d388876dc976c5f76c00cd..712ca7e0959adbce75cc2a7cd403061ad6de8195 100644 (file)
 
 static const struct nvkm_pci_func
 gf106_pci_func = {
+       .cfg = { .addr = 0x088000, .size = 0x1000 },
+
        .init = g84_pci_init,
-       .rd32 = nv40_pci_rd32,
-       .wr08 = nv40_pci_wr08,
-       .wr32 = nv40_pci_wr32,
        .msi_rearm = nv40_pci_msi_rearm,
 
        .pcie.init = gf100_pcie_init,
index 6be87ecffc89c864dfc80b32007dee96b9f0854c..ec6d0a7de995f29eb9eb6aa5712f34618be03c58 100644 (file)
@@ -204,10 +204,9 @@ gk104_pcie_set_link(struct nvkm_pci *pci, enum nvkm_pcie_speed speed, u8 width)
 
 static const struct nvkm_pci_func
 gk104_pci_func = {
+       .cfg = { .addr = 0x088000, .size = 0x1000 },
+
        .init = g84_pci_init,
-       .rd32 = nv40_pci_rd32,
-       .wr08 = nv40_pci_wr08,
-       .wr32 = nv40_pci_wr32,
        .msi_rearm = nv40_pci_msi_rearm,
 
        .pcie.init = gk104_pcie_init,
index a5fafda0014d9846e7627c35f9b65cd3a1d48341..4204316a544f2e1fcdc2f15a1e2ebf048c43bc94 100644 (file)
@@ -31,9 +31,7 @@ gp100_pci_msi_rearm(struct nvkm_pci *pci)
 
 static const struct nvkm_pci_func
 gp100_pci_func = {
-       .rd32 = nv40_pci_rd32,
-       .wr08 = nv40_pci_wr08,
-       .wr32 = nv40_pci_wr32,
+       .cfg = { .addr = 0x088000, .size = 0x1000 },
        .msi_rearm = gp100_pci_msi_rearm,
 };
 
index 9ab64194b185ab4fda04759ae126cd350390dd41..b8a3f6850fa7faa2ede67d5ce7a996a233aee6b9 100644 (file)
  */
 #include "priv.h"
 
-static u32
-nv04_pci_rd32(struct nvkm_pci *pci, u16 addr)
-{
-       struct nvkm_device *device = pci->subdev.device;
-       return nvkm_rd32(device, 0x001800 + addr);
-}
-
-static void
-nv04_pci_wr08(struct nvkm_pci *pci, u16 addr, u8 data)
-{
-       struct nvkm_device *device = pci->subdev.device;
-       nvkm_wr08(device, 0x001800 + addr, data);
-}
-
-static void
-nv04_pci_wr32(struct nvkm_pci *pci, u16 addr, u32 data)
-{
-       struct nvkm_device *device = pci->subdev.device;
-       nvkm_wr32(device, 0x001800 + addr, data);
-}
-
 static const struct nvkm_pci_func
 nv04_pci_func = {
-       .rd32 = nv04_pci_rd32,
-       .wr08 = nv04_pci_wr08,
-       .wr32 = nv04_pci_wr32,
+       .cfg = { .addr = 0x001800, .size = 0x1000 },
 };
 
 int
index 6a3c31cf0200f84fc1c67b7108e389fe87ae1021..1971dbbdeb2b9a8dc1e0eae7a59ad3ee71ea99a2 100644 (file)
  */
 #include "priv.h"
 
-u32
-nv40_pci_rd32(struct nvkm_pci *pci, u16 addr)
-{
-       struct nvkm_device *device = pci->subdev.device;
-       return nvkm_rd32(device, 0x088000 + addr);
-}
-
-void
-nv40_pci_wr08(struct nvkm_pci *pci, u16 addr, u8 data)
-{
-       struct nvkm_device *device = pci->subdev.device;
-       nvkm_wr08(device, 0x088000 + addr, data);
-}
-
-void
-nv40_pci_wr32(struct nvkm_pci *pci, u16 addr, u32 data)
-{
-       struct nvkm_device *device = pci->subdev.device;
-       nvkm_wr32(device, 0x088000 + addr, data);
-}
-
 void
 nv40_pci_msi_rearm(struct nvkm_pci *pci)
 {
@@ -52,9 +31,7 @@ nv40_pci_msi_rearm(struct nvkm_pci *pci)
 
 static const struct nvkm_pci_func
 nv40_pci_func = {
-       .rd32 = nv40_pci_rd32,
-       .wr08 = nv40_pci_wr08,
-       .wr32 = nv40_pci_wr32,
+       .cfg = { .addr = 0x088000, .size = 0x1000 },
        .msi_rearm = nv40_pci_msi_rearm,
 };
 
index 9cad17f178ec49c9638608213103b9d775446c7d..0093eabac9aed6b4b1747e0140d7917d4d24b511 100644 (file)
@@ -38,9 +38,7 @@ nv46_pci_msi_rearm(struct nvkm_pci *pci)
 
 static const struct nvkm_pci_func
 nv46_pci_func = {
-       .rd32 = nv40_pci_rd32,
-       .wr08 = nv40_pci_wr08,
-       .wr32 = nv40_pci_wr32,
+       .cfg = { .addr = 0x088000, .size = 0x1000 },
        .msi_rearm = nv46_pci_msi_rearm,
 };
 
index 741e34bf307cfccefd02d1c4a54bda248dd71f2b..b445081bb80e92b528c4f112e36e21fce11f90ea 100644 (file)
@@ -25,9 +25,7 @@
 
 static const struct nvkm_pci_func
 nv4c_pci_func = {
-       .rd32 = nv40_pci_rd32,
-       .wr08 = nv40_pci_wr08,
-       .wr32 = nv40_pci_wr32,
+       .cfg = { .addr = 0x088000, .size = 0x1000 },
 };
 
 int
index 9b75835329625f80b99844c6a8e06c25527a1adb..988eeee1471ccb64ef1b51a03cd5749e313589ad 100644 (file)
@@ -8,10 +8,12 @@ int nvkm_pci_new_(const struct nvkm_pci_func *, struct nvkm_device *, enum nvkm_
                  struct nvkm_pci **);
 
 struct nvkm_pci_func {
+       struct {
+               u32 addr;
+               u16 size;
+       } cfg;
+
        void (*init)(struct nvkm_pci *);
-       u32 (*rd32)(struct nvkm_pci *, u16 addr);
-       void (*wr08)(struct nvkm_pci *, u16 addr, u8 data);
-       void (*wr32)(struct nvkm_pci *, u16 addr, u32 data);
        void (*msi_rearm)(struct nvkm_pci *);
 
        struct {
@@ -27,9 +29,6 @@ struct nvkm_pci_func {
        } pcie;
 };
 
-u32 nv40_pci_rd32(struct nvkm_pci *, u16);
-void nv40_pci_wr08(struct nvkm_pci *, u16, u8);
-void nv40_pci_wr32(struct nvkm_pci *, u16, u32);
 void nv40_pci_msi_rearm(struct nvkm_pci *);
 
 void nv46_pci_msi_rearm(struct nvkm_pci *);