[Nouveau] [PATCH v2 4/9] pci: implement pcie speed change for tesla
Ben Skeggs
skeggsb at gmail.com
Tue Oct 13 15:56:40 PDT 2015
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256
On 10/13/2015 07:44 PM, Karol Herbst wrote:
> v2: rename functions and simplify init
>
> Signed-off-by: Karol Herbst <nouveau at karolherbst.de> ---
> drm/nouveau/nvkm/subdev/pci/g84.c | 105
> ++++++++++++++++++++++++++++++++++++
> drm/nouveau/nvkm/subdev/pci/g94.c | 10 ++++
> drm/nouveau/nvkm/subdev/pci/gf100.c | 5 ++
> drm/nouveau/nvkm/subdev/pci/gf106.c | 5 ++
> drm/nouveau/nvkm/subdev/pci/gk104.c | 2 +
> drm/nouveau/nvkm/subdev/pci/priv.h | 9 ++++ 6 files changed, 136
> insertions(+)
>
> diff --git a/drm/nouveau/nvkm/subdev/pci/g84.c
> b/drm/nouveau/nvkm/subdev/pci/g84.c index 3faa6bf..7a4e766 100644
> --- a/drm/nouveau/nvkm/subdev/pci/g84.c +++
> b/drm/nouveau/nvkm/subdev/pci/g84.c @@ -25,6 +25,94 @@
>
> #include <core/pci.h>
>
> +int +g84_pcie_version_supported(struct nvkm_pci *pci) +{ + u32
> chipset = pci->subdev.device->chipset, reg_v; + + /* these cards
> report wrong information about what they support */ + if (chipset
> == 0x84 || chipset == 0x86) + return 1;
Give these chipsets their own implementation that just returns 1 for
this hook.
> + + reg_v = nvkm_pci_rd32(pci, 0x460) & 0x200; + if (reg_v ==
> 0x200) + return 2; + return 1; +} + +int +g84_pcie_version(struct
> nvkm_pci *pci) +{ + struct nvkm_device *device =
> pci->subdev.device; + return (nvkm_rd32(device, 0x00154c) & 0x1) +
> 1; +} + +void +g84_pcie_set_version(struct nvkm_pci *pci, u8 ver)
> +{ + struct nvkm_device *device = pci->subdev.device; +
> nvkm_mask(device, 0x00154c, 0x1, (ver >= 2 ? 0x1 : 0x0)); +} +
> +static void +g84_pcie_set_cap_speed(struct nvkm_pci *pci, bool
> full_speed) +{ + struct nvkm_device *device = pci->subdev.device; +
> nvkm_mask(device, 0x00154c, 0x80, full_speed ? 0x80 : 0x0); +} +
> +enum nvkm_pcie_speed +g84_pcie_cur_speed(struct nvkm_pci *pci) +{
> + u32 reg_v = nvkm_pci_rd32(pci, 0x88) & 0x30000; + switch (reg_v)
> { + case 0x30000: + return NVKM_PCIE_SPEED_8_0; + case
> 0x20000: + return NVKM_PCIE_SPEED_5_0; + case 0x10000: +
> default: + return NVKM_PCIE_SPEED_2_5; + } +} + +enum
> nvkm_pcie_speed +g84_pcie_max_speed(struct nvkm_pci *pci) +{ + u32
> reg_v = nvkm_pci_rd32(pci, 0x460) & 0x3300; + if (reg_v == 0x2200)
> + return NVKM_PCIE_SPEED_5_0; + return NVKM_PCIE_SPEED_2_5; +} +
> +void +g84_pcie_set_link_speed(struct nvkm_pci *pci, enum
> nvkm_pcie_speed speed) +{ + u32 mask_value; + + if (speed ==
> NVKM_PCIE_SPEED_5_0) + mask_value = 0x20; + else + mask_value =
> 0x10; + + nvkm_pci_mask(pci, 0x460, 0x30, mask_value); +
> nvkm_pci_mask(pci, 0x460, 0x1, 0x1); +} + +int
> +g84_pcie_set_link(struct nvkm_pci *pci, enum nvkm_pcie_speed
> req_speed, + u8 req_width) +{ + if (req_speed ==
> NVKM_PCIE_SPEED_5_0) + g84_pcie_set_cap_speed(pci, true); + else +
> g84_pcie_set_cap_speed(pci, false); + +
> g84_pcie_set_link_speed(pci, req_speed); + + return 0; +} + void
> g84_pci_init(struct nvkm_pci *pci) { @@ -48,6 +136,13 @@
> g84_pci_init(struct nvkm_pci *pci) nvkm_pci_mask(pci, 0x041c,
> 0x00000060, 0x00000000); }
>
> +int +g84_pcie_init(struct nvkm_pci *pci) +{ +
> g84_pcie_set_cap_speed(pci, g84_pcie_cur_speed(pci) ==
> NVKM_PCIE_SPEED_5_0); + return 0; +} + static const struct
> nvkm_pci_func g84_pci_func = { .init = g84_pci_init, @@ -55,6
> +150,16 @@ g84_pci_func = { .wr08 = nv40_pci_wr08, .wr32 =
> nv40_pci_wr32, .msi_rearm = nv46_pci_msi_rearm, + + .pcie.init =
> g84_pcie_init, + .pcie.set_link = g84_pcie_set_link, + +
> .pcie.max_speed = g84_pcie_max_speed, + .pcie.cur_speed =
> g84_pcie_cur_speed, + + .pcie.set_version = g84_pcie_set_version, +
> .pcie.version = g84_pcie_version, + .pcie.version_supported =
> g84_pcie_version_supported, };
>
> int diff --git a/drm/nouveau/nvkm/subdev/pci/g94.c
> b/drm/nouveau/nvkm/subdev/pci/g94.c index cd311ee..f2f96c1 100644
> --- a/drm/nouveau/nvkm/subdev/pci/g94.c +++
> b/drm/nouveau/nvkm/subdev/pci/g94.c @@ -30,6 +30,16 @@ g94_pci_func
> = { .wr08 = nv40_pci_wr08, .wr32 = nv40_pci_wr32, .msi_rearm =
> nv40_pci_msi_rearm, + + .pcie.init = g84_pcie_init, +
> .pcie.set_link = g84_pcie_set_link, + + .pcie.max_speed =
> g84_pcie_max_speed, + .pcie.cur_speed = g84_pcie_cur_speed, + +
> .pcie.set_version = g84_pcie_set_version, + .pcie.version =
> g84_pcie_version, + .pcie.version_supported =
> g84_pcie_version_supported, };
>
> int diff --git a/drm/nouveau/nvkm/subdev/pci/gf100.c
> b/drm/nouveau/nvkm/subdev/pci/gf100.c index 25e1ae7..1ee43ad
> 100644 --- a/drm/nouveau/nvkm/subdev/pci/gf100.c +++
> b/drm/nouveau/nvkm/subdev/pci/gf100.c @@ -36,6 +36,11 @@
> gf100_pci_func = { .wr08 = nv40_pci_wr08, .wr32 = nv40_pci_wr32,
> .msi_rearm = gf100_pci_msi_rearm, + + .pcie.max_speed =
> g84_pcie_max_speed, + .pcie.cur_speed = g84_pcie_cur_speed, + +
> .pcie.version_supported = g84_pcie_version_supported, };
>
> int diff --git a/drm/nouveau/nvkm/subdev/pci/gf106.c
> b/drm/nouveau/nvkm/subdev/pci/gf106.c index 82d8c27..d72f850
> 100644 --- a/drm/nouveau/nvkm/subdev/pci/gf106.c +++
> b/drm/nouveau/nvkm/subdev/pci/gf106.c @@ -29,6 +29,11 @@
> gf106_pci_func = { .wr08 = nv40_pci_wr08, .wr32 = nv40_pci_wr32,
> .msi_rearm = nv40_pci_msi_rearm, + + .pcie.max_speed =
> g84_pcie_max_speed, + .pcie.cur_speed = g84_pcie_cur_speed, + +
> .pcie.version_supported = g84_pcie_version_supported, };
>
> int diff --git a/drm/nouveau/nvkm/subdev/pci/gk104.c
> b/drm/nouveau/nvkm/subdev/pci/gk104.c index 6119f89..af79d9b
> 100644 --- a/drm/nouveau/nvkm/subdev/pci/gk104.c +++
> b/drm/nouveau/nvkm/subdev/pci/gk104.c @@ -29,6 +29,8 @@
> gk104_pci_func = { .wr08 = nv40_pci_wr08, .wr32 = nv40_pci_wr32,
> .msi_rearm = nv40_pci_msi_rearm, + + .pcie.cur_speed =
> g84_pcie_cur_speed, };
>
> int diff --git a/drm/nouveau/nvkm/subdev/pci/priv.h
> b/drm/nouveau/nvkm/subdev/pci/priv.h index 5370f0d..a504812 100644
> --- a/drm/nouveau/nvkm/subdev/pci/priv.h +++
> b/drm/nouveau/nvkm/subdev/pci/priv.h @@ -36,5 +36,14 @@ void
> nv46_pci_msi_rearm(struct nvkm_pci *); void g84_pci_init(struct
> nvkm_pci *pci);
>
> /* pcie functions */ +void g84_pcie_set_version(struct nvkm_pci *,
> u8); +int g84_pcie_version(struct nvkm_pci *); +int
> g84_pcie_version_supported(struct nvkm_pci *); +void
> g84_pcie_set_link_speed(struct nvkm_pci *, enum nvkm_pcie_speed);
> +enum nvkm_pcie_speed g84_pcie_cur_speed(struct nvkm_pci *); +enum
> nvkm_pcie_speed g84_pcie_max_speed(struct nvkm_pci *); +int
> g84_pcie_init(struct nvkm_pci *); +int g84_pcie_set_link(struct
> nvkm_pci *, enum nvkm_pcie_speed, u8); + int nvkm_pcie_init(struct
> nvkm_pci *pci); #endif
>
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2
iQIcBAEBCAAGBQJWHYwoAAoJEHYLnGJQkpH7V7wP/ArjtKXGn6CDPgDGp+a40BWc
mB4T3dLjgZhjGYVjbPG0eddynTiR4PyJP+RPyD0O4eS+PdknUMo+QJXPOYWVoKlg
a090vfzkAp35OSSRa6NjKOAf5LgK4+Zi6BgFXE3TpUJ6w2vxOkUIUDLOaC3HPc61
Kk1TqPEcKk8JCl7fHGmzt8gPhw/bJaDzDmFghudzpVzJit0jXzAkevqHN80y4Auz
ADYE0ayVPPG0hDEGIXhY09A2OZPbfAqJyP2A0mt97ELWsUc1w1ipjz3Psq0u6QvB
fCHX4FPp6a1Lbns0M3a+RWOOeVv7zciOcmrDGSvmiX2IbvnoFDzK+fK6/MadLFk5
2Sh5hdH6e6T5BLKetCU/A9JWF/RdytQF8GHZEYxr0aM6NINKyB+jU1ccAkRqJLmm
+sbd9ONkfbWVuweTeiQW7I4fBHI9+LVbdcMusnTREKsFK5mri4SRAovKTq20WKKp
EGGHzeJlm7YQVJg5JZGfK2FcCxE9yTkthK3mKYHI/c4HufyL+JMHfAJo1hKO3xL4
vAnmq2XoUltPJyNqzsTJMt8zooraXYEMaVfpzijE3A1B5wm+e5/7DpNNhcDZT86K
AvLj+bxQ3+B0Z74jfy2jUNerwiImKH/aFsa681kVlX7Y57fXcc1AaUXqLEwshQGp
FUxQj+UWJ/GIcImWaNVW
=6Pdy
-----END PGP SIGNATURE-----
More information about the Nouveau
mailing list