diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3b2bb08 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +archlinux-linux/ +build/ +pkg/ +src/ +*.tar.zst diff --git a/0001-add-acs-overrides.patch b/0001-add-acs-overrides.patch new file mode 100644 index 0000000..91a562b --- /dev/null +++ b/0001-add-acs-overrides.patch @@ -0,0 +1,153 @@ +From c1ed6974bffaee49ae8a82838a4cf7cd8ebad36c Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?=C3=A9clairevoyant?= + <848000+eclairevoyant@users.noreply.github.com> +Date: Sun, 1 Jan 2023 16:21:00 -0500 +Subject: [PATCH 1/2] add-acs-overrides + +--- + .../admin-guide/kernel-parameters.txt | 8 ++ + drivers/pci/quirks.c | 102 ++++++++++++++++++ + 2 files changed, 110 insertions(+) + +diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt +index 42af9ca0127e..4f94a9f2cff0 100644 +--- a/Documentation/admin-guide/kernel-parameters.txt ++++ b/Documentation/admin-guide/kernel-parameters.txt +@@ -4145,6 +4145,14 @@ + nomsi [MSI] If the PCI_MSI kernel config parameter is + enabled, this kernel boot option can be used to + disable the use of MSI interrupts system-wide. ++ pci_acs_override [PCIE] Override missing PCIe ACS support for: ++ downstream ++ All downstream ports - full ACS capabilities ++ multifunction ++ Add multifunction devices - multifunction ACS subset ++ id:nnnn:nnnn ++ Specific device - full ACS capabilities ++ Specified as vid:did (vendor/device ID) in hex + noioapicquirk [APIC] Disable all boot interrupt quirks. + Safety option to keep boot IRQs enabled. This + should never be necessary. +diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c +index 285acc4aaccc..7ad267e87c34 100644 +--- a/drivers/pci/quirks.c ++++ b/drivers/pci/quirks.c +@@ -194,6 +194,106 @@ static int __init pci_apply_final_quirks(void) + } + fs_initcall_sync(pci_apply_final_quirks); + ++static bool acs_on_downstream; ++static bool acs_on_multifunction; ++ ++#define NUM_ACS_IDS 16 ++struct acs_on_id { ++ unsigned short vendor; ++ unsigned short device; ++}; ++static struct acs_on_id acs_on_ids[NUM_ACS_IDS]; ++static u8 max_acs_id; ++ ++static __init int pcie_acs_override_setup(char *p) ++{ ++ if (!p) ++ return -EINVAL; ++ ++ while (*p) { ++ if (!strncmp(p, "downstream", 10)) ++ acs_on_downstream = true; ++ if (!strncmp(p, "multifunction", 13)) ++ acs_on_multifunction = true; ++ if (!strncmp(p, "id:", 3)) { ++ char opt[5]; ++ int ret; ++ long val; ++ ++ if (max_acs_id >= NUM_ACS_IDS - 1) { ++ pr_warn("Out of PCIe ACS override slots (%d)\n", ++ NUM_ACS_IDS); ++ goto next; ++ } ++ ++ p += 3; ++ snprintf(opt, 5, "%s", p); ++ ret = kstrtol(opt, 16, &val); ++ if (ret) { ++ pr_warn("PCIe ACS ID parse error %d\n", ret); ++ goto next; ++ } ++ acs_on_ids[max_acs_id].vendor = val; ++ p += strcspn(p, ":"); ++ if (*p != ':') { ++ pr_warn("PCIe ACS invalid ID\n"); ++ goto next; ++ } ++ ++ p++; ++ snprintf(opt, 5, "%s", p); ++ ret = kstrtol(opt, 16, &val); ++ if (ret) { ++ pr_warn("PCIe ACS ID parse error %d\n", ret); ++ goto next; ++ } ++ acs_on_ids[max_acs_id].device = val; ++ max_acs_id++; ++ } ++next: ++ p += strcspn(p, ","); ++ if (*p == ',') ++ p++; ++ } ++ ++ if (acs_on_downstream || acs_on_multifunction || max_acs_id) ++ pr_warn("Warning: PCIe ACS overrides enabled; This may allow non-IOMMU protected peer-to-peer DMA\n"); ++ ++ return 0; ++} ++early_param("pcie_acs_override", pcie_acs_override_setup); ++ ++static int pcie_acs_overrides(struct pci_dev *dev, u16 acs_flags) ++{ ++ int i; ++ ++ /* Never override ACS for legacy devices or devices with ACS caps */ ++ if (!pci_is_pcie(dev) || ++ pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ACS)) ++ return -ENOTTY; ++ ++ for (i = 0; i < max_acs_id; i++) ++ if (acs_on_ids[i].vendor == dev->vendor && ++ acs_on_ids[i].device == dev->device) ++ return 1; ++ ++switch (pci_pcie_type(dev)) { ++ case PCI_EXP_TYPE_DOWNSTREAM: ++ case PCI_EXP_TYPE_ROOT_PORT: ++ if (acs_on_downstream) ++ return 1; ++ break; ++ case PCI_EXP_TYPE_ENDPOINT: ++ case PCI_EXP_TYPE_UPSTREAM: ++ case PCI_EXP_TYPE_LEG_END: ++ case PCI_EXP_TYPE_RC_END: ++ if (acs_on_multifunction && dev->multifunction) ++ return 1; ++ } ++ ++ return -ENOTTY; ++} ++ + /* + * Decoding should be disabled for a PCI device during BAR sizing to avoid + * conflict. But doing so may cause problems on host bridge and perhaps other +@@ -4980,6 +5080,8 @@ static const struct pci_dev_acs_enabled { + { PCI_VENDOR_ID_NXP, 0x8d9b, pci_quirk_nxp_rp_acs }, + /* Zhaoxin Root/Downstream Ports */ + { PCI_VENDOR_ID_ZHAOXIN, PCI_ANY_ID, pci_quirk_zhaoxin_pcie_ports_acs }, ++ /* allow acs for any */ ++ { PCI_ANY_ID, PCI_ANY_ID, pcie_acs_overrides }, + { 0 } + }; + +-- +2.38.1 + diff --git a/0002-i915-vga-arbiter.patch b/0002-i915-vga-arbiter.patch new file mode 100644 index 0000000..0467c13 --- /dev/null +++ b/0002-i915-vga-arbiter.patch @@ -0,0 +1,158 @@ +From c8894968896294c7ced91b86fb59ca2c1aa6e031 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?=C3=A9clairevoyant?= + <848000+eclairevoyant@users.noreply.github.com> +Date: Sun, 1 Jan 2023 16:21:24 -0500 +Subject: [PATCH 2/2] i915-vga-arbiter + +--- + drivers/gpu/drm/i915/display/intel_display.c | 15 ++++++++-- + drivers/gpu/drm/i915/display/intel_display.h | 1 + + drivers/gpu/drm/i915/display/intel_vga.c | 31 ++++++++++++++++++++ + drivers/gpu/drm/i915/display/intel_vga.h | 4 +++ + drivers/gpu/drm/i915/i915_params.c | 3 ++ + drivers/gpu/drm/i915/i915_params.h | 1 + + 6 files changed, 52 insertions(+), 3 deletions(-) + +diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c +index de77054195c6..507ee4e0d1dc 100644 +--- a/drivers/gpu/drm/i915/display/intel_display.c ++++ b/drivers/gpu/drm/i915/display/intel_display.c +@@ -8656,9 +8656,11 @@ int intel_modeset_init_noirq(struct drm_i915_private *i915) + + intel_bios_init(i915); + +- ret = intel_vga_register(i915); +- if (ret) +- goto cleanup_bios; ++ if (!i915_modparams.enable_hd_vgaarb || !HAS_PCH_SPLIT(i915)) { ++ ret = intel_vga_register(i915); ++ if (ret) ++ goto cleanup_bios; ++ } + + /* FIXME: completely on the wrong abstraction layer */ + intel_power_domains_init_hw(i915, false); +@@ -8807,6 +8809,12 @@ int intel_modeset_init(struct drm_i915_private *i915) + if (ret) + return ret; + ++ /* ++ * Must do this after fbcon init so that ++ * vgacon_save_screen() works during the handover. ++ */ ++ intel_vga_disable_mem(i915); ++ + /* Only enable hotplug handling once the fbdev is fully set up. */ + intel_hpd_init(i915); + intel_hpd_poll_disable(i915); +@@ -8977,6 +8985,7 @@ void intel_modeset_driver_remove(struct drm_i915_private *i915) + if (!HAS_DISPLAY(i915)) + return; + ++ intel_vga_enable_mem(i915); + flush_workqueue(i915->display.wq.flip); + flush_workqueue(i915->display.wq.modeset); + +diff --git a/drivers/gpu/drm/i915/display/intel_display.h b/drivers/gpu/drm/i915/display/intel_display.h +index 884e8e67b17c..90f932db61f0 100644 +--- a/drivers/gpu/drm/i915/display/intel_display.h ++++ b/drivers/gpu/drm/i915/display/intel_display.h +@@ -576,6 +576,7 @@ void i830_disable_pipe(struct drm_i915_private *dev_priv, enum pipe pipe); + int vlv_get_hpll_vco(struct drm_i915_private *dev_priv); + int vlv_get_cck_clock(struct drm_i915_private *dev_priv, + const char *name, u32 reg, int ref_freq); ++extern void intel_vga_disable_mem(struct drm_i915_private *dev_priv); + int vlv_get_cck_clock_hpll(struct drm_i915_private *dev_priv, + const char *name, u32 reg); + void intel_init_display_hooks(struct drm_i915_private *dev_priv); +diff --git a/drivers/gpu/drm/i915/display/intel_vga.c b/drivers/gpu/drm/i915/display/intel_vga.c +index b5d058404c14..ad23732a9f21 100644 +--- a/drivers/gpu/drm/i915/display/intel_vga.c ++++ b/drivers/gpu/drm/i915/display/intel_vga.c +@@ -45,6 +45,36 @@ void intel_vga_disable(struct drm_i915_private *dev_priv) + intel_de_posting_read(dev_priv, vga_reg); + } + ++void intel_vga_enable_mem(struct drm_i915_private *dev_priv) ++{ ++ struct pci_dev *pdev = to_pci_dev(dev_priv->drm.dev); ++ ++ /* Enable VGA memory on Intel HD */ ++ if (i915_modparams.enable_hd_vgaarb && HAS_PCH_SPLIT(dev_priv)) { ++ vga_get_uninterruptible(pdev, VGA_RSRC_LEGACY_IO); ++ outb(inb(VGA_MIS_R) | (1 << 1), VGA_MIS_W); ++ vga_set_legacy_decoding(pdev, VGA_RSRC_LEGACY_IO | ++ VGA_RSRC_LEGACY_MEM | ++ VGA_RSRC_NORMAL_IO | ++ VGA_RSRC_NORMAL_MEM); ++ vga_put(pdev, VGA_RSRC_LEGACY_IO); ++ } ++} ++ ++void intel_vga_disable_mem(struct drm_i915_private *dev_priv) ++{ ++ struct pci_dev *pdev = to_pci_dev(dev_priv->drm.dev); ++ /* Disable VGA memory on Intel HD */ ++ if (i915_modparams.enable_hd_vgaarb && HAS_PCH_SPLIT(dev_priv)) { ++ vga_get_uninterruptible(pdev, VGA_RSRC_LEGACY_IO); ++ outb(inb(VGA_MIS_R) & ~(1 << 1), VGA_MIS_W); ++ vga_set_legacy_decoding(pdev, VGA_RSRC_LEGACY_IO | ++ VGA_RSRC_NORMAL_IO | ++ VGA_RSRC_NORMAL_MEM); ++ vga_put(pdev, VGA_RSRC_LEGACY_IO); ++ } ++} ++ + void intel_vga_redisable_power_on(struct drm_i915_private *dev_priv) + { + i915_reg_t vga_reg = intel_vga_cntrl_reg(dev_priv); +@@ -53,6 +83,7 @@ void intel_vga_redisable_power_on(struct drm_i915_private *dev_priv) + drm_dbg_kms(&dev_priv->drm, + "Something enabled VGA plane, disabling it\n"); + intel_vga_disable(dev_priv); ++ intel_vga_disable_mem(dev_priv); + } + } + +diff --git a/drivers/gpu/drm/i915/display/intel_vga.h b/drivers/gpu/drm/i915/display/intel_vga.h +index ba5b55b917f0..7e2af7924e99 100644 +--- a/drivers/gpu/drm/i915/display/intel_vga.h ++++ b/drivers/gpu/drm/i915/display/intel_vga.h +@@ -15,4 +15,8 @@ void intel_vga_redisable_power_on(struct drm_i915_private *i915); + int intel_vga_register(struct drm_i915_private *i915); + void intel_vga_unregister(struct drm_i915_private *i915); + ++/* i915 vga arb patch */ ++void intel_vga_enable_mem(struct drm_i915_private *i915); ++void intel_vga_disable_mem(struct drm_i915_private *i915); ++ + #endif /* __INTEL_VGA_H__ */ +diff --git a/drivers/gpu/drm/i915/i915_params.c b/drivers/gpu/drm/i915/i915_params.c +index d1e4d528cb17..a00cbc6591b0 100644 +--- a/drivers/gpu/drm/i915/i915_params.c ++++ b/drivers/gpu/drm/i915/i915_params.c +@@ -154,6 +154,9 @@ i915_param_named_unsafe(invert_brightness, int, 0400, + i915_param_named(disable_display, bool, 0400, + "Disable display (default: false)"); + ++i915_param_named(enable_hd_vgaarb, bool, 0444, ++ "Enable support for VGA arbitration on Intel HD IGD. (default: false)"); ++ + i915_param_named(memtest, bool, 0400, + "Perform a read/write test of all device memory on module load (default: off)"); + +diff --git a/drivers/gpu/drm/i915/i915_params.h b/drivers/gpu/drm/i915/i915_params.h +index 2733cb6cfe09..f21c5b1529cc 100644 +--- a/drivers/gpu/drm/i915/i915_params.h ++++ b/drivers/gpu/drm/i915/i915_params.h +@@ -76,6 +76,7 @@ struct drm_printer; + param(unsigned int, lmem_size, 0, 0400) \ + param(unsigned int, lmem_bar_size, 0, 0400) \ + /* leave bools at the end to not create holes */ \ ++ param(bool, enable_hd_vgaarb, false, 0600) \ + param(bool, enable_hangcheck, true, 0600) \ + param(bool, load_detect_test, false, 0600) \ + param(bool, force_reset_modeset_test, false, 0600) \ +-- +2.38.1 + diff --git a/PKGBUILD b/PKGBUILD index daff733..48f3d37 100644 --- a/PKGBUILD +++ b/PKGBUILD @@ -1,6 +1,6 @@ # Maintainer: Jan Alexander Steffens (heftig) -pkgbase=linux +pkgbase=linux-eirene pkgver=6.1.2.arch1 pkgrel=1 pkgdesc='Linux' @@ -18,6 +18,8 @@ _srcname=archlinux-linux source=( "$_srcname::git+https://github.com/archlinux/linux?signed#tag=$_srctag" config # the main kernel config file + 0001-add-acs-overrides.patch + 0002-i915-vga-arbiter.patch ) validpgpkeys=( 'ABAF11C65A2970B130ABE3C479BE3E4300411886' # Linus Torvalds @@ -26,7 +28,9 @@ validpgpkeys=( 'C7E7849466FE2358343588377258734B41C31549' # David Runge ) sha256sums=('SKIP' - '0571ea17a2e38458096b679418197bbea8c414388f628d122517f3a1f3a31b3a') + 'f419741df953badc877b10f2e11696ddc96e6f71ad0effc60448f88373a93d92' + 'b8f977aa923aa6076703b88262e395c56ce9df2943a52448d8a0e32cc90b1a70' + '750c57539f17332cafe01a978a0133fc9500dbe37a411b823dad2eee66652cfc') export KBUILD_BUILD_HOST=archlinux export KBUILD_BUILD_USER=$pkgbase @@ -52,7 +56,7 @@ prepare() { echo "Setting config..." cp ../config .config make olddefconfig - diff -u ../config .config || : + /usr/scr/linux/scripts/diffconfig .config ../config > ../config.diff || : make -s kernelrelease > version echo "Prepared $pkgbase version $(