Module Name: src
Committed By: mrg
Date: Sat Sep 30 10:46:46 UTC 2023
Modified Files:
src/sys/external/bsd/drm2/dist/drm/amd/amdgpu: amdgpu_cik.c
amdgpu_device.c amdgpu_si.c amdgpu_vi.c
src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/subdev/pci:
nouveau_nvkm_subdev_pci_pcie.c
src/sys/external/bsd/drm2/dist/drm/radeon: radeon_ci_dpm.c radeon_cik.c
radeon_evergreen.c radeon_r600.c radeon_rv770.c radeon_si.c
radeon_si_dpm.c
src/sys/external/bsd/drm2/include/linux: pci.h
src/sys/external/bsd/drm2/linux: linux_pci.c
Log Message:
drm: enable almost all PCIe functionality
linux_pci.c revisions 1.24 and 1.25 implemented most of the remaining
missing PCIe backends, but only enabled them for some amdgpu portions.
this enables all code marked with "XXX amdgpu pcie", "XXX radeon pcie",
and "XXX pcie speed". for most of it, simply removing #ifndefs __NetBSD__
to enable compliation was required, once the new "bus->max_bus_speed"
member was added to struct pci_bus. add an "always fails" backend for
pci_enable_atomic_ops_to_root() which seems to only be necessary
for virtual GPU functionality (and could be implemented if needed.)
tested on radeon 5450, 7750, R7 240 [radeon], and RX 550 [amdgpu], and
nvidia 750 and 1030 [nouveau].
this still does not quite work on nvidia cards. there are two problems
that remain:
- the call to set the link speed is skipped because the speed is set
to the default value of "-1". nvkm_pcie_set_link() will actually
determine the right value for this and for some cards, calling this
function if the current speed is -1 helps set the link speed. it
may be that on linux other paths we don't have enabled properly
would set this (there's one via debugfs, and a jetson specific one,
though perhaps setting either AC or DC speed values as boot options
(after hooking up these for netbsd) would currently work.
- worse, cards newer than kepler - geforce 900, 1000, and newer, are
all lacking the backing support to set pcie link speed. the GT 1030
card i have been testing with remains at pcie 1.0.
To generate a diff of this commit:
cvs rdiff -u -r1.6 -r1.7 \
src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_cik.c
cvs rdiff -u -r1.19 -r1.20 \
src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_device.c
cvs rdiff -u -r1.4 -r1.5 \
src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_si.c
cvs rdiff -u -r1.3 -r1.4 \
src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_vi.c
cvs rdiff -u -r1.4 -r1.5 \
src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/subdev/pci/nouveau_nvkm_subdev_pci_pcie.c
cvs rdiff -u -r1.6 -r1.7 \
src/sys/external/bsd/drm2/dist/drm/radeon/radeon_ci_dpm.c \
src/sys/external/bsd/drm2/dist/drm/radeon/radeon_r600.c
cvs rdiff -u -r1.7 -r1.8 \
src/sys/external/bsd/drm2/dist/drm/radeon/radeon_cik.c
cvs rdiff -u -r1.5 -r1.6 \
src/sys/external/bsd/drm2/dist/drm/radeon/radeon_evergreen.c \
src/sys/external/bsd/drm2/dist/drm/radeon/radeon_si.c
cvs rdiff -u -r1.2 -r1.3 \
src/sys/external/bsd/drm2/dist/drm/radeon/radeon_rv770.c
cvs rdiff -u -r1.8 -r1.9 \
src/sys/external/bsd/drm2/dist/drm/radeon/radeon_si_dpm.c
cvs rdiff -u -r1.56 -r1.57 src/sys/external/bsd/drm2/include/linux/pci.h
cvs rdiff -u -r1.26 -r1.27 src/sys/external/bsd/drm2/linux/linux_pci.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_cik.c
diff -u src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_cik.c:1.6 src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_cik.c:1.7
--- src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_cik.c:1.6 Mon Oct 17 03:05:32 2022
+++ src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_cik.c Sat Sep 30 10:46:45 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: amdgpu_cik.c,v 1.6 2022/10/17 03:05:32 mrg Exp $ */
+/* $NetBSD: amdgpu_cik.c,v 1.7 2023/09/30 10:46:45 mrg Exp $ */
/*
* Copyright 2012 Advanced Micro Devices, Inc.
@@ -24,7 +24,7 @@
* Authors: Alex Deucher
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: amdgpu_cik.c,v 1.6 2022/10/17 03:05:32 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: amdgpu_cik.c,v 1.7 2023/09/30 10:46:45 mrg Exp $");
#include <linux/firmware.h>
#include <linux/slab.h>
@@ -1733,9 +1733,6 @@ static void cik_program_aspm(struct amdg
WREG32_PCIE(ixPCIE_LC_LINK_WIDTH_CNTL, data);
if (!disable_clkreq) {
-#ifdef __NetBSD__ /* XXX amdgpu pcie */
- clk_req_support = false;
-#else
struct pci_dev *root = adev->pdev->bus->self;
u32 lnkcap;
@@ -1743,7 +1740,6 @@ static void cik_program_aspm(struct amdg
pcie_capability_read_dword(root, PCI_EXP_LNKCAP, &lnkcap);
if (lnkcap & PCI_EXP_LNKCAP_CLKPM)
clk_req_support = true;
-#endif
} else {
clk_req_support = false;
}
Index: src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_device.c
diff -u src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_device.c:1.19 src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_device.c:1.20
--- src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_device.c:1.19 Thu May 25 12:07:43 2023
+++ src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_device.c Sat Sep 30 10:46:45 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: amdgpu_device.c,v 1.19 2023/05/25 12:07:43 riastradh Exp $ */
+/* $NetBSD: amdgpu_device.c,v 1.20 2023/09/30 10:46:45 mrg Exp $ */
/*
* Copyright 2008 Advanced Micro Devices, Inc.
@@ -28,7 +28,7 @@
* Jerome Glisse
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: amdgpu_device.c,v 1.19 2023/05/25 12:07:43 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: amdgpu_device.c,v 1.20 2023/09/30 10:46:45 mrg Exp $");
#include <linux/power_supply.h>
#include <linux/kthread.h>
@@ -3091,7 +3091,6 @@ int amdgpu_device_init(struct amdgpu_dev
DRM_INFO("PCI I/O BAR is not found.\n");
/* enable PCIE atomic ops */
-#ifndef __NetBSD__ /* XXX amdgpu pcie atomics */
r = pci_enable_atomic_ops_to_root(adev->pdev,
PCI_EXP_DEVCAP2_ATOMIC_COMP32 |
PCI_EXP_DEVCAP2_ATOMIC_COMP64);
@@ -3101,7 +3100,6 @@ int amdgpu_device_init(struct amdgpu_dev
} else {
adev->have_atomics_support = true;
}
-#endif
amdgpu_device_get_pcie_info(adev);
Index: src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_si.c
diff -u src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_si.c:1.4 src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_si.c:1.5
--- src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_si.c:1.4 Mon Oct 17 03:05:32 2022
+++ src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_si.c Sat Sep 30 10:46:45 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: amdgpu_si.c,v 1.4 2022/10/17 03:05:32 mrg Exp $ */
+/* $NetBSD: amdgpu_si.c,v 1.5 2023/09/30 10:46:45 mrg Exp $ */
/*
* Copyright 2015 Advanced Micro Devices, Inc.
@@ -24,7 +24,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: amdgpu_si.c,v 1.4 2022/10/17 03:05:32 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: amdgpu_si.c,v 1.5 2023/09/30 10:46:45 mrg Exp $");
#include <linux/firmware.h>
#include <linux/slab.h>
@@ -2077,7 +2077,6 @@ static void si_program_aspm(struct amdgp
static void si_fix_pci_max_read_req_size(struct amdgpu_device *adev)
{
-#ifndef __NetBSD__ /* XXX amdgpu pcie */
int readrq;
u16 v;
@@ -2085,7 +2084,6 @@ static void si_fix_pci_max_read_req_size
v = ffs(readrq) - 8;
if ((v == 0) || (v == 6) || (v == 7))
pcie_set_readrq(adev->pdev, 512);
-#endif
}
static int si_common_hw_init(void *handle)
Index: src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_vi.c
diff -u src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_vi.c:1.3 src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_vi.c:1.4
--- src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_vi.c:1.3 Sun Dec 19 12:21:29 2021
+++ src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_vi.c Sat Sep 30 10:46:45 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: amdgpu_vi.c,v 1.3 2021/12/19 12:21:29 riastradh Exp $ */
+/* $NetBSD: amdgpu_vi.c,v 1.4 2023/09/30 10:46:45 mrg Exp $ */
/*
* Copyright 2014 Advanced Micro Devices, Inc.
@@ -24,7 +24,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: amdgpu_vi.c,v 1.3 2021/12/19 12:21:29 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: amdgpu_vi.c,v 1.4 2023/09/30 10:46:45 mrg Exp $");
#include <linux/pci.h>
#include <linux/slab.h>
@@ -914,7 +914,6 @@ static int vi_set_vce_clocks(struct amdg
static void vi_pcie_gen3_enable(struct amdgpu_device *adev)
{
-#ifndef __NetBSD__ /* XXX amdgpu pcie */
if (pci_is_root_bus(adev->pdev->bus))
return;
@@ -929,7 +928,6 @@ static void vi_pcie_gen3_enable(struct a
return;
/* todo */
-#endif
}
static void vi_program_aspm(struct amdgpu_device *adev)
Index: src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/subdev/pci/nouveau_nvkm_subdev_pci_pcie.c
diff -u src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/subdev/pci/nouveau_nvkm_subdev_pci_pcie.c:1.4 src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/subdev/pci/nouveau_nvkm_subdev_pci_pcie.c:1.5
--- src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/subdev/pci/nouveau_nvkm_subdev_pci_pcie.c:1.4 Sat Sep 30 10:38:31 2023
+++ src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/subdev/pci/nouveau_nvkm_subdev_pci_pcie.c Sat Sep 30 10:46:45 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: nouveau_nvkm_subdev_pci_pcie.c,v 1.4 2023/09/30 10:38:31 mrg Exp $ */
+/* $NetBSD: nouveau_nvkm_subdev_pci_pcie.c,v 1.5 2023/09/30 10:46:45 mrg Exp $ */
/*
* Copyright 2015 Karol Herbst <[email protected]>
@@ -24,7 +24,7 @@
* Authors: Karol Herbst <[email protected]>
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm_subdev_pci_pcie.c,v 1.4 2023/09/30 10:38:31 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nouveau_nvkm_subdev_pci_pcie.c,v 1.5 2023/09/30 10:46:45 mrg Exp $");
#include "priv.h"
@@ -138,13 +138,6 @@ nvkm_pcie_set_link(struct nvkm_pci *pci,
return -ENODEV;
}
-#ifdef __NetBSD__ /* XXX pcie speed */
- __USE(cur_speed);
- __USE(max_speed);
- __USE(pbus);
- __USE(nvkm_pcie_speed);
- ret = 0;
-#else
cur_speed = pci->func->pcie.cur_speed(pci);
max_speed = min(nvkm_pcie_speed(pbus->max_bus_speed),
pci->func->pcie.max_speed(pci));
@@ -172,7 +165,6 @@ nvkm_pcie_set_link(struct nvkm_pci *pci,
ret = pci->func->pcie.set_link(pci, speed, width);
if (ret < 0)
nvkm_error(subdev, "setting link failed: %i\n", ret);
-#endif
return ret;
}
Index: src/sys/external/bsd/drm2/dist/drm/radeon/radeon_ci_dpm.c
diff -u src/sys/external/bsd/drm2/dist/drm/radeon/radeon_ci_dpm.c:1.6 src/sys/external/bsd/drm2/dist/drm/radeon/radeon_ci_dpm.c:1.7
--- src/sys/external/bsd/drm2/dist/drm/radeon/radeon_ci_dpm.c:1.6 Sun Dec 19 12:40:43 2021
+++ src/sys/external/bsd/drm2/dist/drm/radeon/radeon_ci_dpm.c Sat Sep 30 10:46:45 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: radeon_ci_dpm.c,v 1.6 2021/12/19 12:40:43 riastradh Exp $ */
+/* $NetBSD: radeon_ci_dpm.c,v 1.7 2023/09/30 10:46:45 mrg Exp $ */
/*
* Copyright 2013 Advanced Micro Devices, Inc.
@@ -24,7 +24,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: radeon_ci_dpm.c,v 1.6 2021/12/19 12:40:43 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: radeon_ci_dpm.c,v 1.7 2023/09/30 10:46:45 mrg Exp $");
#include <linux/firmware.h>
#include <linux/pci.h>
@@ -5687,9 +5687,7 @@ int ci_dpm_init(struct radeon_device *rd
u8 frev, crev;
struct ci_power_info *pi;
enum pci_bus_speed speed_cap = PCI_SPEED_UNKNOWN;
-#ifndef __NetBSD__ /* XXX radeon pcie */
struct pci_dev *root = rdev->pdev->bus->self;
-#endif
int ret;
pi = kzalloc(sizeof(struct ci_power_info), GFP_KERNEL);
@@ -5697,10 +5695,8 @@ int ci_dpm_init(struct radeon_device *rd
return -ENOMEM;
rdev->pm.dpm.priv = pi;
-#ifndef __NetBSD__ /* XXX radeon pcie */
if (!pci_is_root_bus(rdev->pdev->bus))
speed_cap = pcie_get_speed_cap(root);
-#endif
if (speed_cap == PCI_SPEED_UNKNOWN) {
pi->sys_pcie_mask = 0;
} else {
Index: src/sys/external/bsd/drm2/dist/drm/radeon/radeon_r600.c
diff -u src/sys/external/bsd/drm2/dist/drm/radeon/radeon_r600.c:1.6 src/sys/external/bsd/drm2/dist/drm/radeon/radeon_r600.c:1.7
--- src/sys/external/bsd/drm2/dist/drm/radeon/radeon_r600.c:1.6 Sat Dec 18 23:45:43 2021
+++ src/sys/external/bsd/drm2/dist/drm/radeon/radeon_r600.c Sat Sep 30 10:46:45 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: radeon_r600.c,v 1.6 2021/12/18 23:45:43 riastradh Exp $ */
+/* $NetBSD: radeon_r600.c,v 1.7 2023/09/30 10:46:45 mrg Exp $ */
/*
* Copyright 2008 Advanced Micro Devices, Inc.
@@ -29,7 +29,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: radeon_r600.c,v 1.6 2021/12/18 23:45:43 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: radeon_r600.c,v 1.7 2023/09/30 10:46:45 mrg Exp $");
#include <linux/firmware.h>
#include <linux/module.h>
@@ -4546,7 +4546,6 @@ int r600_get_pcie_lanes(struct radeon_de
static void r600_pcie_gen2_enable(struct radeon_device *rdev)
{
-#ifndef __NetBSD__ /* XXX radeon pcie */
u32 link_width_cntl, lanes, speed_cntl, training_cntl, tmp;
u16 link_cntl2;
@@ -4657,7 +4656,6 @@ static void r600_pcie_gen2_enable(struct
link_width_cntl &= ~LC_UPCONFIGURE_DIS;
WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
}
-#endif
}
/**
Index: src/sys/external/bsd/drm2/dist/drm/radeon/radeon_cik.c
diff -u src/sys/external/bsd/drm2/dist/drm/radeon/radeon_cik.c:1.7 src/sys/external/bsd/drm2/dist/drm/radeon/radeon_cik.c:1.8
--- src/sys/external/bsd/drm2/dist/drm/radeon/radeon_cik.c:1.7 Mon Oct 17 03:05:32 2022
+++ src/sys/external/bsd/drm2/dist/drm/radeon/radeon_cik.c Sat Sep 30 10:46:45 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: radeon_cik.c,v 1.7 2022/10/17 03:05:32 mrg Exp $ */
+/* $NetBSD: radeon_cik.c,v 1.8 2023/09/30 10:46:45 mrg Exp $ */
/*
* Copyright 2012 Advanced Micro Devices, Inc.
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: radeon_cik.c,v 1.7 2022/10/17 03:05:32 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: radeon_cik.c,v 1.8 2023/09/30 10:46:45 mrg Exp $");
#include <linux/firmware.h>
#include <linux/module.h>
@@ -9827,17 +9827,13 @@ static void cik_program_aspm(struct rade
if (!disable_clkreq &&
!pci_is_root_bus(rdev->pdev->bus)) {
-#ifndef __NetBSD__ /* XXX radeon pcie */
struct pci_dev *root = rdev->pdev->bus->self;
u32 lnkcap;
-#endif
clk_req_support = false;
-#ifndef __NetBSD__ /* XXX radeon pcie */
pcie_capability_read_dword(root, PCI_EXP_LNKCAP, &lnkcap);
if (lnkcap & PCI_EXP_LNKCAP_CLKPM)
clk_req_support = true;
-#endif
} else {
clk_req_support = false;
}
Index: src/sys/external/bsd/drm2/dist/drm/radeon/radeon_evergreen.c
diff -u src/sys/external/bsd/drm2/dist/drm/radeon/radeon_evergreen.c:1.5 src/sys/external/bsd/drm2/dist/drm/radeon/radeon_evergreen.c:1.6
--- src/sys/external/bsd/drm2/dist/drm/radeon/radeon_evergreen.c:1.5 Sat Dec 18 23:45:43 2021
+++ src/sys/external/bsd/drm2/dist/drm/radeon/radeon_evergreen.c Sat Sep 30 10:46:45 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: radeon_evergreen.c,v 1.5 2021/12/18 23:45:43 riastradh Exp $ */
+/* $NetBSD: radeon_evergreen.c,v 1.6 2023/09/30 10:46:45 mrg Exp $ */
/*
* Copyright 2010 Advanced Micro Devices, Inc.
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: radeon_evergreen.c,v 1.5 2021/12/18 23:45:43 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: radeon_evergreen.c,v 1.6 2023/09/30 10:46:45 mrg Exp $");
#include <linux/firmware.h>
#include <linux/pci.h>
@@ -1285,7 +1285,6 @@ int evergreen_set_uvd_clocks(struct rade
void evergreen_fix_pci_max_read_req_size(struct radeon_device *rdev)
{
-#ifndef __NetBSD__ /* XXX radeon pcie */
int readrq;
u16 v;
@@ -1296,7 +1295,6 @@ void evergreen_fix_pci_max_read_req_size
*/
if ((v == 0) || (v == 6) || (v == 7))
pcie_set_readrq(rdev->pdev, 512);
-#endif
}
void dce4_program_fmt(struct drm_encoder *encoder)
@@ -5338,7 +5336,6 @@ void evergreen_fini(struct radeon_device
void evergreen_pcie_gen2_enable(struct radeon_device *rdev)
{
-#ifndef __NetBSD__ /* XXX radeon pcie */
u32 link_width_cntl, speed_cntl;
if (radeon_pcie_gen2 == 0)
@@ -5398,7 +5395,6 @@ void evergreen_pcie_gen2_enable(struct r
link_width_cntl &= ~LC_UPCONFIGURE_DIS;
WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
}
-#endif
}
void evergreen_program_aspm(struct radeon_device *rdev)
Index: src/sys/external/bsd/drm2/dist/drm/radeon/radeon_si.c
diff -u src/sys/external/bsd/drm2/dist/drm/radeon/radeon_si.c:1.5 src/sys/external/bsd/drm2/dist/drm/radeon/radeon_si.c:1.6
--- src/sys/external/bsd/drm2/dist/drm/radeon/radeon_si.c:1.5 Mon Oct 17 03:05:32 2022
+++ src/sys/external/bsd/drm2/dist/drm/radeon/radeon_si.c Sat Sep 30 10:46:45 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: radeon_si.c,v 1.5 2022/10/17 03:05:32 mrg Exp $ */
+/* $NetBSD: radeon_si.c,v 1.6 2023/09/30 10:46:45 mrg Exp $ */
/*
* Copyright 2011 Advanced Micro Devices, Inc.
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: radeon_si.c,v 1.5 2022/10/17 03:05:32 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: radeon_si.c,v 1.6 2023/09/30 10:46:45 mrg Exp $");
#include <linux/firmware.h>
#include <linux/module.h>
@@ -7414,17 +7414,13 @@ static void si_program_aspm(struct radeo
if (!disable_clkreq &&
!pci_is_root_bus(rdev->pdev->bus)) {
-#ifndef __NetBSD__ /* XXX radeon pcie */
struct pci_dev *root = rdev->pdev->bus->self;
u32 lnkcap;
-#endif
clk_req_support = false;
-#ifndef __NetBSD__ /* XXX radeon pcie */
pcie_capability_read_dword(root, PCI_EXP_LNKCAP, &lnkcap);
if (lnkcap & PCI_EXP_LNKCAP_CLKPM)
clk_req_support = true;
-#endif
} else {
clk_req_support = false;
}
Index: src/sys/external/bsd/drm2/dist/drm/radeon/radeon_rv770.c
diff -u src/sys/external/bsd/drm2/dist/drm/radeon/radeon_rv770.c:1.2 src/sys/external/bsd/drm2/dist/drm/radeon/radeon_rv770.c:1.3
--- src/sys/external/bsd/drm2/dist/drm/radeon/radeon_rv770.c:1.2 Sat Dec 18 23:45:43 2021
+++ src/sys/external/bsd/drm2/dist/drm/radeon/radeon_rv770.c Sat Sep 30 10:46:45 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: radeon_rv770.c,v 1.2 2021/12/18 23:45:43 riastradh Exp $ */
+/* $NetBSD: radeon_rv770.c,v 1.3 2023/09/30 10:46:45 mrg Exp $ */
/*
* Copyright 2008 Advanced Micro Devices, Inc.
@@ -29,7 +29,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: radeon_rv770.c,v 1.2 2021/12/18 23:45:43 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: radeon_rv770.c,v 1.3 2023/09/30 10:46:45 mrg Exp $");
#include <linux/firmware.h>
#include <linux/pci.h>
@@ -2029,7 +2029,6 @@ void rv770_fini(struct radeon_device *rd
static void rv770_pcie_gen2_enable(struct radeon_device *rdev)
{
-#ifndef __NetBSD__ /* XXX radeon pcie */
u32 link_width_cntl, lanes, speed_cntl, tmp;
u16 link_cntl2;
@@ -2107,5 +2106,4 @@ static void rv770_pcie_gen2_enable(struc
link_width_cntl &= ~LC_UPCONFIGURE_DIS;
WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl);
}
-#endif
}
Index: src/sys/external/bsd/drm2/dist/drm/radeon/radeon_si_dpm.c
diff -u src/sys/external/bsd/drm2/dist/drm/radeon/radeon_si_dpm.c:1.8 src/sys/external/bsd/drm2/dist/drm/radeon/radeon_si_dpm.c:1.9
--- src/sys/external/bsd/drm2/dist/drm/radeon/radeon_si_dpm.c:1.8 Sun Dec 19 12:40:43 2021
+++ src/sys/external/bsd/drm2/dist/drm/radeon/radeon_si_dpm.c Sat Sep 30 10:46:45 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: radeon_si_dpm.c,v 1.8 2021/12/19 12:40:43 riastradh Exp $ */
+/* $NetBSD: radeon_si_dpm.c,v 1.9 2023/09/30 10:46:45 mrg Exp $ */
/*
* Copyright 2013 Advanced Micro Devices, Inc.
@@ -24,7 +24,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: radeon_si_dpm.c,v 1.8 2021/12/19 12:40:43 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: radeon_si_dpm.c,v 1.9 2023/09/30 10:46:45 mrg Exp $");
#include <linux/math64.h>
#include <linux/pci.h>
@@ -6908,9 +6908,7 @@ int si_dpm_init(struct radeon_device *rd
struct si_power_info *si_pi;
struct atom_clock_dividers dividers;
enum pci_bus_speed speed_cap = PCI_SPEED_UNKNOWN;
-#ifndef __NetBSD__ /* XXX radeon pcie */
struct pci_dev *root = rdev->pdev->bus->self;
-#endif
int ret;
si_pi = kzalloc(sizeof(struct si_power_info), GFP_KERNEL);
@@ -6921,10 +6919,8 @@ int si_dpm_init(struct radeon_device *rd
eg_pi = &ni_pi->eg;
pi = &eg_pi->rv7xx;
-#ifndef __NetBSD__ /* XXX radeon pcie */
if (!pci_is_root_bus(rdev->pdev->bus))
speed_cap = pcie_get_speed_cap(root);
-#endif
if (speed_cap == PCI_SPEED_UNKNOWN) {
si_pi->sys_pcie_mask = 0;
} else {
Index: src/sys/external/bsd/drm2/include/linux/pci.h
diff -u src/sys/external/bsd/drm2/include/linux/pci.h:1.56 src/sys/external/bsd/drm2/include/linux/pci.h:1.57
--- src/sys/external/bsd/drm2/include/linux/pci.h:1.56 Tue Oct 25 23:37:06 2022
+++ src/sys/external/bsd/drm2/include/linux/pci.h Sat Sep 30 10:46:46 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: pci.h,v 1.56 2022/10/25 23:37:06 riastradh Exp $ */
+/* $NetBSD: pci.h,v 1.57 2023/09/30 10:46:46 mrg Exp $ */
/*-
* Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -62,17 +62,7 @@
struct acpi_devnode;
struct pci_driver;
struct pci_dev;
-
-struct pci_bus {
- /* NetBSD private members */
- pci_chipset_tag_t pb_pc;
- device_t pb_dev;
-
- /* Linux API */
- u_int number;
-
- struct pci_dev *self;
-};
+struct pci_bus;
struct pci_device_id {
uint32_t vendor;
@@ -150,6 +140,8 @@ CTASSERT(PCI_CLASS_BRIDGE_ISA == 0x0601)
#define PCI_EXP_LNKCTL2_TLS_8_0GT PCIE_LCSR2_TGT_LSPEED_8G
#define PCI_EXP_LNKCAP PCIE_LCAP
#define PCI_EXP_LNKCAP_CLKPM PCIE_LCAP_CLOCK_PM
+#define PCI_EXP_DEVCAP2_ATOMIC_COMP32 PCIE_DCAP2_32ATOM
+#define PCI_EXP_DEVCAP2_ATOMIC_COMP64 PCIE_DCAP2_64ATOM
typedef int pci_power_t;
@@ -233,6 +225,18 @@ enum pcie_link_width {
#define __pci_rom_iomem
+struct pci_bus {
+ /* NetBSD private members */
+ pci_chipset_tag_t pb_pc;
+ device_t pb_dev;
+
+ /* Linux API */
+ u_int number;
+ enum pci_bus_speed max_bus_speed;
+
+ struct pci_dev *self;
+};
+
/* Namespace. */
#define pci_bus_alloc_resource linux_pci_bus_alloc_resource
#define pci_bus_read_config_byte linux_pci_bus_read_config_byte
@@ -289,6 +293,7 @@ enum pcie_link_width {
#define pcie_read_config_word linux_pcie_capability_read_word
#define pcie_write_config_dword linux_pcie_capability_write_dword
#define pcie_write_config_word linux_pcie_capability_write_word
+#define pci_enable_atomic_ops_to_root linux_pci_enable_atomic_ops_to_root
/* NetBSD local additions. */
void linux_pci_dev_init(struct pci_dev *, device_t, device_t,
@@ -397,4 +402,11 @@ dev_is_pci(struct device *dev)
return parent && device_is_a(parent, "pci");
}
+static inline int
+pci_enable_atomic_ops_to_root(struct pci_dev *dev, uint32_t cap_mask)
+{
+
+ return -EINVAL;
+}
+
#endif /* _LINUX_PCI_H_ */
Index: src/sys/external/bsd/drm2/linux/linux_pci.c
diff -u src/sys/external/bsd/drm2/linux/linux_pci.c:1.26 src/sys/external/bsd/drm2/linux/linux_pci.c:1.27
--- src/sys/external/bsd/drm2/linux/linux_pci.c:1.26 Mon Sep 4 21:31:58 2023
+++ src/sys/external/bsd/drm2/linux/linux_pci.c Sat Sep 30 10:46:46 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: linux_pci.c,v 1.26 2023/09/04 21:31:58 mrg Exp $ */
+/* $NetBSD: linux_pci.c,v 1.27 2023/09/30 10:46:46 mrg Exp $ */
/*-
* Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -35,7 +35,7 @@
#endif
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux_pci.c,v 1.26 2023/09/04 21:31:58 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux_pci.c,v 1.27 2023/09/30 10:46:46 mrg Exp $");
#if NACPICA > 0
#include <dev/acpi/acpivar.h>
@@ -169,6 +169,17 @@ linux_pci_dev_init(struct pci_dev *pdev,
pdev->bus->pb_pc = pa->pa_pc;
pdev->bus->pb_dev = parent;
pdev->bus->number = pa->pa_bus;
+ /*
+ * NetBSD doesn't have an easy "am I PCIe" or "give me PCIe speed
+ * from capability" function, but we already emulate the Linux
+ * versions that do.
+ */
+ if (pci_is_pcie(pdev)) {
+ pdev->bus->max_bus_speed = pcie_get_speed_cap(pdev);
+ } else {
+ /* XXX: Do AGP/PCI-X, etc.? */
+ pdev->bus->max_bus_speed = PCI_SPEED_UNKNOWN;
+ }
pdev->bus->self = alloc_fake_parent_device(parent, pa);
pdev->devfn = PCI_DEVFN(pa->pa_device, pa->pa_function);
pdev->vendor = PCI_VENDOR(pa->pa_id);