Intel 图形处理器

来自 Arch Linux 中文维基
(重定向自Intel

由于 Intel 提供并维护开源驱动程序,因此 Intel 显卡基本上是即插即用的。

有关 Intel GPU 型号以及相应芯片组和 CPU 的全面列表,请参阅 Wikipedia:list of Intel graphics processing unitsGentoo:Intel#Feature support

注意:
  • 开源驱动不支持基于 PowerVR 架构的图形卡 (比如GMA 3600 系列)
  • Intel 第 N 代硬件不代表 CPU 的代数,它表示不同于 CPU 代数的 GPU 的代数
  • 参见 Xorg#驱动安装 来识别你的显卡

安装[编辑 | 编辑源代码]

  • 安装 以下任一软件包,它提供用于 3D 加速的 DRI 驱动程序。
    • mesa 是最新的 Mesa 软件包,其中包括用于 Intel 第 3 代及更高版本硬件的现代 Gallium3D 驱动程序。这是推荐选择。
    • mesa-amber 是旧版 Mesa 软件包,包括用于第 2 代至第 11 代硬件的经典(非 Gallium3D)驱动程序。此驱动程序对于第 7 代和较旧的硬件具有更好的性能和稳定性,但是不再维护。
  • 对于 DDX 驱动支持(可提供对 Xorg 的 2D 加速),安装以下任一软件包:
    • 包含在 xorg-server 软件包内的 modesetting 驱动是对于第 4 代及以上硬件的推荐选择。它通过 glamor 使用 DRI 来实现加速。
    • xf86-video-intel 软件包为第 2 代至第 9 代硬件提供了旧的 Intel DDX 驱动。通常不建议使用此软件包,请参见下面的注释。

另请参见 硬件视频加速.

注意:

加载[编辑 | 编辑源代码]

Intel 内核模块应会在系统引导时自动加载。

如果它没有自动加载,请尝试:

  • 由于 Intel 需要内核模式设置,确保您没有内核参数 中添加 nomodeset
  • 请同时确认您没有在 /etc/modprobe.d//usr/lib/modprobe.d/ 中把 Intel 列入 modprobe 的黑名单导致禁用了 Intel。

启用 KMS 早启动[编辑 | 编辑源代码]

i915 驱动支持 内核级显示模式设置 (KMS),并且从 mkinitcpio v32 开始启用,因为 kms 钩子被默认包含。对于其他配置方式,请参考 Kernel_mode_setting#KMS_早启动 获得有关如何在启动过程中第一时间启用KMS的说明。

启用 GuC / HuC 固件加载[编辑 | 编辑源代码]

本文或本章节的事实准确性存在争议。

原因: 尽管 Intel 的文档没有说,但是 Tiger Lake 和 Rocket Lake GPU 可能实际上支持 enable_guc=3, 并且默认设置了 enable_guc=1.(在 Talk:Intel graphics#TGL/RKL GuC Submission 中讨论)


从第 9 代硬件 (Skylake 及以后的架构) 开始, Intel GPU 都包含了一个用于提供以下功能的图形微控制器 「Graphics micro (μ) Controller」 (GuC) [6]:

  • 安装 intel-media-driver 软件包来启用硬件视频加速后,能够把一些多媒体解码功能从 CPU 分载(offload)到 HEVC/H.265 微控制器 (micro (µ) Controller) (HuC) 上。该功能于第 9 代推出。
  • 使用 GuC 进行调度、上下文提交(context submission)和电源管理。该功能通过第 12 代硬件于 Alder Lake-P(移动端)推出。

为了使用这些功能,您必须加载 GuC 固件。对于 HuC 支持,一些视频特性(如 SKL 低功耗编码模式下的 CBR 速率控制)也需要加载 HuC 固件才能实现。 [7] GuC 和 HuC 的固件文件都包含在 linux-firmware 软件包中。

GuC 功能由 i915.enable_guc 内核参数 控制,用法如下:

enable_guc 的值 GuC Submission HuC Firmware Loading 作为平台默认值 支持的平台
0 Tiger Lake, Rocket Lake, 和 Pre-Gen12 [8] All
1 Alder Lake-P (Mobile) 及更新
2 Alder Lake-S (Desktop) [9] [10] Gen9 及更新
3 Alder Lake-P (Mobile) 及更新 第 9.5 代或更新(某些程度上更好)

如果 GuC submission 或者 HuC 固件加载并未在您的 GPU 上默认启用,您可以手动启用它。

警告: 即使您的显卡不支持相关功能,手动启用 GuC/HuC 固件加载也可能会污染内核。此外,启用GuC/HuC固件加载可能会导致某些系统出现问题;如果您遇到冻结(例如,从休眠恢复后),请禁用它。

首先确保您已经安装linux-firmware 软件包。

配置 i915.enable_guc 内核参数,比如:

/etc/modprobe.d/i915.conf
options i915 enable_guc=2

然后 重建 initramfs,在下一次启动时您可以通过 dmesg 命令来确认 GuC 和 HuC 都已被启用。

# dmesg
[30130.586970] i915 0000:00:02.0: [drm] GuC firmware i915/icl_guc_33.0.0.bin version 33.0 submission:disabled
[30130.586973] i915 0000:00:02.0: [drm] HuC firmware i915/icl_huc_9.0.0.bin version 9.0 authenticated:yes

如果您的显卡不支持它们,你会看到:

# dmesg
[    0.571339] i915 0000:00:02.0: [drm] Incompatible option enable_guc=2 - GuC is not supported!
[    0.571340] i915 0000:00:02.0: [drm] Incompatible option enable_guc=2 - HuC is not supported!

或者,使用以下方法进行检查:

# cat /sys/kernel/debug/dri/0/gt/uc/guc_info
# cat /sys/kernel/debug/dri/0/gt/uc/huc_info
注意: 从 Linux 4.20.11 起,当 GuC/HuC 被启用时,不支持通过设置 enable_gvt=1 来使用 GVT-g 图形虚拟化 功能。i915模块将无法初始化,如系统日志所示:
# journalctl
... kernel: [drm:intel_gvt_init [i915]] *ERROR* i915 GVT-g loading failed due to Graphics virtualization is not yet supported with GuC submission
... kernel: i915 0000:00:02.0: [drm:i915_driver_load [i915]] Device initialization failed (-5)
... kernel: i915: probe of 0000:00:02.0 failed with error -5
... kernel: snd_hda_intel 0000:00:1f.3: failed to add i915 component master (-19)

请注意相关警告并非致命,正如[11] 中解释的那样:

# journalctl -b 
... kernel: i915 0000:00:02.0: Direct firmware load for i915/gvt/vid_0x8086_did_0x5916_rid_0x02.golden_hw_state failed with error -2

Xorg 配置[编辑 | 编辑源代码]

通常不需要为了运行 Xorg 去配置任何东西。

但是如果需要使用一些驱动选项或是 Xorg 未正常启动,您可以创建一个 Xorg 配置文件。

使用 modesetting 驱动[编辑 | 编辑源代码]

如果您已经安装了 xf86-video-intel 软件包但是想要显式加载 modesetting 驱动而不是让 DDX 驱动有着更高的优先级,比如试着去比较它们:

/etc/X11/xorg.conf.d/20-intel.conf
Section "Device"
  Identifier "Intel Graphics"
  Driver "modesetting"
EndSection

使用 Intel 驱动[编辑 | 编辑源代码]

注意: 以下操作需要安装 xf86-video-intel 软件包。

创建一个与下述类似的 Xorg 配置文件:

/etc/X11/xorg.conf.d/20-intel.conf
Section "Device"
  Identifier "Intel Graphics"
  Driver "intel"
EndSection

您可以在 Driver "intel" 下方开新行添加额外的选项。请参考 intel(4) 手册页以获得完整的选项列表。

注意: 您可能需要添加不止一段 device 配置,本文将在需要的地方指出。

AccelMethod[编辑 | 编辑源代码]

创建配置文件时,您可能需要指定 Option "AccelMethod" 。传统的选项包括 UXA, SNA (默认) 和 BLT.

如果您在使用默认选项 SNA 时遇到问题 (比如花屏、文字损坏等),尝试改用UXA 。只需要在配置文件中添加如下一行即可:

Option      "AccelMethod"  "uxa"

另请参阅 intel(4) § CONFIGURATION DETAILS 手册文件中的 AccelMethod 选项。

对于较新的 GPU 使用 Intel DDX 驱动[编辑 | 编辑源代码]

从第 8 代 Intel GPU 开始(Broadwell),需要 Iris Mesa 驱动:

Option      "DRI"  "iris"

禁用 TearFree,TripleBuffer,SwapbuffersWait[编辑 | 编辑源代码]

如果你在使用组合器(在比如 GNOME,KDE Plasma,Xfce 等现代桌面环境中是默认的),那么 TearFree,TripleBuffer 和 SwapbuffersWait 通常可以禁用以提高性能和省电。

Option      "TearFree"        "false"
Option      "TripleBuffer"    "false"
Option      "SwapbuffersWait" "false"

基于内核模块参数的选项[编辑 | 编辑源代码]

i915 内核模块允许您通过内核模块参数来配置选项。其中一些选项会影响到省电。

您可以使用以下命令生成所有选项的列表以及简短说明和默认值:

$ modinfo -p i915

若要检查当前启用了哪些选项,请运行

# systool -m i915 -av

您将注意到,许多选项默认为 -1,说明芯片的省电状态都为默认值。然而,您可以通过修改内核模块参数来配置更积极的省电策略。

注意: Diverting from the defaults will mark the kernel as tainted from Linux 3.18 onwards. This basically implies using other options than the per-chip defaults is considered experimental and not supported by the developers.

Framebuffer 压缩 (enable_fbc)[编辑 | 编辑源代码]

启用 Framebuffer 压缩 (FBC) 功能能够减少电源消耗,同时减少刷新屏幕所需的内存带宽。

如果您的硬件支持,此功能将被自动启用。您可以通过该命令来检查是否启用:

$ modinfo i915 | grep enable_fbc
parm:           enable_fbc:Enable frame buffer compression for power savings (default: -1 (use per-chip default)) (int)

如果 parm 被设为 -1,那您不需要做任何事。如果在其他情况下要强制启用 FBC,请在内核参数中添加 i915.enable_fbc=1 或在 /etc/modprobe.d/i915.conf 中进行如下配置:

/etc/modprobe.d/i915.conf
options i915 enable_fbc=1
注意: 在 Sandy Bridge (第6代)之前的几代 Intel GPU 上,帧缓冲(Framebuffer)压缩可能不可靠或不可用。 这导致系统日志中可能会记录类似如下信息:
kernel: drm: not enough stolen space for compressed buffer, disabling.

在Sandy Bridge之前的CPU上启用帧缓冲区压缩会导致无休止的错误消息:

# dmesg
[ 2360.475430] [drm] not enough stolen space for compressed buffer (need 4325376 bytes), disabling
[ 2360.475437] [drm] hint: you may be able to increase stolen memory size in the BIOS to avoid this
解决方案是禁用帧缓冲压缩,这将增加些微功耗(约0.06W)。为了禁用它,请在内核参数中添加i915.enable_fbc=0 。 请参阅此处 了解更多关于禁用帧缓冲的影响。

Fastboot[编辑 | 编辑源代码]

注意: Skylake 和更新的架构,会在默认情况下启用此参数[12]。以及 Bay- 和 Cherry-Trail (VLV/CHV)[13] 自 Linux 5.1 版本以来也会启用。[14]

Intel Fastboot 的目标是在 Xorg 启动之前将帧缓冲区保留为 BIOS 或引导加载程序设置的内容,以避免出现屏闪。[15][16]

要在未默认启用快速启动的平台上强制启用快速启动,请设置 i915.fastboot=1 内核参数 ,或在 /etc/modprobe.d/i915.conf 里作如下设置:

/etc/modprobe.d/i915.conf
options i915 fastboot=1

Intel GVT-g 图形虚拟化支持[编辑 | 编辑源代码]

请参考 Intel GVT-g 以了解详细信息。

启用性能支持[编辑 | 编辑源代码]

这篇文章的某些内容需要扩充。

原因: What does Mesa actually do using the performance counters? What's the effect of this? Some report drastic performance increases on Intel Tiger Lake, attributing it to a support for Dynamic Tuning [17]. (在 Talk:Intel 图形处理器#Potential performance gains via Observation Architecture 中讨论)

从第六代处理器 (Sandy Bridge 及更新的架构) 开始,Intel GPU 提供性能计数器,用于向驱动程序提供内部性能数据。 驱动程序和硬件寄存器将此基础结构称为 Observation Architecture (内部称为 "OA") [18],但英特尔的文档一般普遍将此功能称为 提供可观测性能计数器(Observability Performance Counters)[19] [20].

默认情况下,只有使用 CAP_SYS_ADMIN(相当于root)或 CAP_PERFMON 能力(Capabilities)运行的程序才能使用 OA​ [21] [22]。 大多数应用程序将在没有这两种情况下运行,从而导致以下警告:

MESA-INTEL: warning: Performance support disabled, consider sysctl dev.i915.perf_stream_paranoid=0

若要在不使用能力(或 root)的情况下启用性能支持,请按 sysctl 中的描述设置内核参数。

警告: perf_event_paranoid 系列选项默认为限制访问,因为允许应用程序访问性能数据存在风险 [23]。话虽如此, dev.i915.perf_stream_paranoid 只会影响对 GPU 性能计数器的访问,这比访问 CPU 架构执行上下文寄存器之类的带来的风险要小。

技巧和窍门[编辑 | 编辑源代码]

设置缩放模式[编辑 | 编辑源代码]

这对于某些全屏应用程序很有用:

$ xrandr --output LVDS1 --set PANEL_FITTING param

其中 param 可以为:

  • center: 分辨率将完全保持原设置,不会进行缩放
  • full: 缩放分辨率,以便使用整个屏幕
  • full_aspect: 将分辨率缩放到可能的最大值,但保持纵横比。

如果它不起作用,请尝试:

$ xrandr --output LVDS1 --set "scaling mode" param

其中 param 可以为 "Full""Center""Full aspect"

注意: 此选项目前不适用于外接显示器 (比如 VGA, DVI, HDMI, DP). [24]

GMA 4500上的硬件加速 H.264 解码[编辑 | 编辑源代码]

对于某些 GMA 4500 系列的 GPU,libva-intel-driver 软件包只提供对 MPEG-2 解码的硬件加速,而并不包括 H.264 解码。要检查这是否对您的 GPU 有影响,请同时安装驱动和 libva-utils 软件包,并检查 vainfo 命令的输出结果中是否包含以 VAProfileH264 开头的项目。

对于 H.264 的解码支持是在另一个 g45-h264 分支中独立维护的。您可以安装 libva-intel-driver-g45-h264AUR 软件包来使用它。然而,要注意该支持是实验性的,并且其开发工作已被放弃。在GMA 4500系列GPU上使用VA-API与此驱动程序能够帮助 CPU 分载(offload),但可能无法实现像非硬件加速那样平滑的播放。使用 mplayer 进行的测试表明,使用 vaapi 播放 H.264编码的1080p 视频可以将 CPU 负载减半(与 XV overlay相比) ,但是播放非常卡顿,而720p 播放效果相当不错 [25]。这与其他人的经历相印证 [26]。在 BIOS 中将预先分配的视频内存大小设置得更高,可以获得更好的硬件解码播放效果。这样做了之后即使是1080p h264视频也可以流畅播放[27]。同时使用 mpv-gitAURffmpeg-gitAURlibva-intel-driver-g45-h264AUR 也可以流畅播放(1080p/720p)视频。通过 MPV 和 Firefox 插件“发送到 MPV 播放器”[28] ,可以观看硬件加速的 YouTube 视频。

覆写报告的 OpenGL 版本[编辑 | 编辑源代码]

MESA_GL_VERSION_OVERRIDE 环境变量 可以为任何应用程序覆写报告的 OpenGL 版本。比如,设置 MESA_GL_VERSION_OVERRIDE=4.5 环境变量将会把 OpenGL 版本报告为 4.5.

注意: 您可以使用此变量报告任何已知的 OpenGL 版本,即使 GPU 不支持它。一些应用程序可能不再崩溃,而一些可能反而开始崩溃。所以您可能不希望全局设置这个变量。

监控[编辑 | 编辑源代码]

本文或本章节可能需要合并到Hardware video acceleration#Verification

附注: This overlaps the content at the previously linked page and would probably be a better fit in a generic page instead of this one dedicated to Intel GPUs. Otherwise, Hardware video acceleration#Verification should be modified to link to each dedicated page instead of duplicating content.(在 Talk:Intel 图形处理器 中讨论)
  • intel_gpu_top — 适用于 Intel GPU 的类似 top 命令的任务监视器。 (需要 root 权限)
https://gitlab.freedesktop.org/drm/igt-gpu-tools || intel-gpu-tools
  • nvtop — 适用于 AMD、Intel 和 NVIDIA 的 GPU 进程监视器(目前对 Intel GPU 仅有非常基础的支持)
https://github.com/Syllo/nvtop || nvtop

设置亮度和伽玛值[编辑 | 编辑源代码]

参见 Backlight.

测试新的实验性 Xe 驱动[编辑 | 编辑源代码]

为了尝试(实验性的)新的 Xe 驱动,你需要:

  • linux 6.8 或更高版本
  • Tiger Lake 或更新的集成显卡,或者独立显卡
  • 官方源的 mesa 软件包。或者保证 mesa 使用 -D intel-xe-kmd=enabled 进行编译

运行此命令,然后记录下您的 PCI ID:

lspci -nn | grep VGA
00:02.0 VGA compatible controller [0300]: Intel Corporation TigerLake-LP GT2 [Iris Xe Graphics] [8086:9a49] (rev 01)

然后将带有合适 PCI ID 的以下内容添加到内核参数里:

... i915.force_probe=!9a49 xe.force_probe=9a49

确保您有在需要时可以撤销变更的备用启动方案。

故障排除[编辑 | 编辑源代码]

画面撕裂[编辑 | 编辑源代码]

使用了 Intel 驱动[编辑 | 编辑源代码]

SNA 加速方法在一些机器上引起撕裂。要解决这个问题,请在驱动程序中启用 TearFree 选项,方法是在配置文件中添加以下内容:

/etc/X11/xorg.conf.d/20-intel.conf
Section "Device"
  Identifier "Intel Graphics"
  Driver "intel"
  Option "TearFree" "true"
EndSection

参见 原始错误报告 以获得更多信息。

注意:
  • SwapbuffersWaitfalse 时,该选项可能不工作
  • 此选项可能会显著增加内存分配并降低性能。[29]
  • 对于对vsync定时非常挑剔的应用程序来说,这个选项是有问题的,比如 Super Meat Boy.
  • 此选项不适用于UXA加速方法,仅适用于SNA。
  • 对于 Intel UHD 620 或 630 显卡,您需要添加 Option "TripleBuffer" "true" 选项才能使 TearFree 工作。
  • 通过添加 Option "DRI" "2" 来禁用 DRI3 可能是必须的,不然任意全屏应用(比如视频播放)会使 TearFree 失效。[30]

使用了 modesetting 驱动[编辑 | 编辑源代码]

modesetting 驱动在最近才支持 TearFree [31][32]。直到 2023 年 11 月,这个补丁还没有进入稳定版,所以现在你会需要 xorg-server-gitAUR

/etc/X11/xorg.conf.d/20-intel.conf
Section "Device"
  Identifier "Intel Graphics"
  Driver "modesetting"
  Option "TearFree" "true"
EndSection

禁用垂直同步 (VSYNC)[编辑 | 编辑源代码]

适用于以下情景:

  • 由于 GPU 的原因,Chomium/Chrome 有滞后和性能低下的问题,而在使用 --disable-gpu 选项启动时能流畅运行。
  • glxgears 测试未显示预期性能

Intel 驱动程序使用三重缓冲进行垂直同步;这允许充分的性能释放并避免画面撕裂。若要关闭垂直同步(例如用于基准测试),请在主目录中使用如下 .drirc 文件:

~/.drirc
<device screen="0" driver="dri2">
	<application name="Default">
		<option name="vblank_mode" value="0"/>
	</application>
</device>
注意: 不要使用 driconfAUR 来创建此文件。它有问题,会设置错误的驱动程序。

DRI3 问题[编辑 | 编辑源代码]

DRI3xf86-video-intel 中的默认 DRI 版本。在某些系统上,这可能会导致这样的问题。要切换回 DRI2,请在配置文件中添加以下行:

Option "DRI" "2"

对于 modesetting 驱动程序,这种禁用 DRI3 的方法不起作用。所以我们可以设置环境变量 LIBGL_DRI3_DISABLE=1

GTK应用程序中的字体和屏显损坏(挂起/恢复后缺少字形)[编辑 | 编辑源代码]

如果您在 GTK 应用程序中遇到缺少字形的问题,以下解决方法可能会有所帮助。编辑 /etc/environment 并添加以下行:

/etc/environment
COGL_ATLAS_DEFAULT_BLIT_MODE=framebuffer

另请参考 FreeDesktop bug 88584.

启动过程中加载模块时显示空白屏幕[编辑 | 编辑源代码]

这一章节正在考虑移除。

原因:mkinitcpio v32 开始,kms 钩子被默认包含,因此大部分配置会默认启动早启动。 (在 Talk:Intel 图形处理器 讨论)


如果您使用 KMS 晚启动,然后屏幕在加载模块(Loading modules)时显示为空白,您可以试着把 i915intel_agp 添加到 initramfs 中。请参考 内核级显示模式设置#KMS_早启动

另外,附加以下内核参数似乎也有效:

video=SVIDEO-1:d

如果您需要输出到VGA,请尝试以下操作:

video=VGA-1:1280x800

X 窗口系统在使用 Intel 驱动程序时冻结或崩溃[编辑 | 编辑源代码]

一些关于 X 窗口系统崩溃、冻结或 GPU 挂起的问题,可以通过设置 NoAccel 选项禁用 GPU 来解决。请在配置文件中添加以下内容:

  Option "NoAccel" "True"

或者,尝试通过设置 DRI 选项来只禁用 3D 加速:

  Option "DRI" "False"

添加未检测到的分辨率[编辑 | 编辑源代码]

这个问题在 Xrandr 页面 中有详细的说明。

无法调节背光[编辑 | 编辑源代码]

如果您的设备从挂起中恢复后,调整屏幕背光亮度的热键失效,请根据 Backlight 一文检查您的配置。

如果问题仍然存在,请尝试如下任一内核参数:

acpi_osi=Linux
acpi_osi="!Windows 2012"
acpi_osi=

还要确保您没有使用 fastboot 模式 (i915.fastboot 内核参数) ,因为它会破坏背光控制

Chromium 和 Firefox 损坏或无响应[编辑 | 编辑源代码]

如果您在 Chromium 和/或 Firefox 中遇到了损坏、无响应、性能滞后或缓慢的问题,一些可能的解决方案包括:

4.0+ 版本的内核会在使用 Broadwell 或 Core-M 芯片时崩溃[编辑 | 编辑源代码]

X/Wayland 加载后几秒钟,机器将冻结,journalctl 将记录内核崩溃并提到 Intel 显卡:

Jun 16 17:54:03 hostname kernel: BUG: unable to handle kernel NULL pointer dereference at           (null)
Jun 16 17:54:03 hostname kernel: IP: [<          (null)>]           (null)
...
Jun 16 17:54:03 hostname kernel: CPU: 0 PID: 733 Comm: gnome-shell Tainted: G     U     O    4.0.5-1-ARCH #1
...
Jun 16 17:54:03 hostname kernel: Call Trace:
Jun 16 17:54:03 hostname kernel:  [<ffffffffa055cc27>] ? i915_gem_object_sync+0xe7/0x190 [i915]
Jun 16 17:54:03 hostname kernel:  [<ffffffffa0579634>] intel_execlists_submission+0x294/0x4c0 [i915]
Jun 16 17:54:03 hostname kernel:  [<ffffffffa05539fc>] i915_gem_do_execbuffer.isra.12+0xabc/0x1230 [i915]
Jun 16 17:54:03 hostname kernel:  [<ffffffffa055d349>] ? i915_gem_object_set_to_cpu_domain+0xa9/0x1f0 [i915]
Jun 16 17:54:03 hostname kernel:  [<ffffffff811ba2ae>] ? __kmalloc+0x2e/0x2a0
Jun 16 17:54:03 hostname kernel:  [<ffffffffa0555471>] i915_gem_execbuffer2+0x141/0x2b0 [i915]
Jun 16 17:54:03 hostname kernel:  [<ffffffffa042fcab>] drm_ioctl+0x1db/0x640 [drm]
Jun 16 17:54:03 hostname kernel:  [<ffffffffa0555330>] ? i915_gem_execbuffer+0x450/0x450 [i915]
Jun 16 17:54:03 hostname kernel:  [<ffffffff8122339b>] ? eventfd_ctx_read+0x16b/0x200
Jun 16 17:54:03 hostname kernel:  [<ffffffff811ebc36>] do_vfs_ioctl+0x2c6/0x4d0
Jun 16 17:54:03 hostname kernel:  [<ffffffff811f6452>] ? __fget+0x72/0xb0
Jun 16 17:54:03 hostname kernel:  [<ffffffff811ebec1>] SyS_ioctl+0x81/0xa0
Jun 16 17:54:03 hostname kernel:  [<ffffffff8157a589>] system_call_fastpath+0x12/0x17
Jun 16 17:54:03 hostname kernel: Code:  Bad RIP value.
Jun 16 17:54:03 hostname kernel: RIP  [<          (null)>]           (null)

这可以通过禁用 execlist 支持来解决,该支持在 4.0 内核中被设为为默认值。添加以下内核参数

i915.enable_execlists=0

目前已知该问题直到 4.0.5 内核上仍存在。

Windows 客户机运行迟缓[编辑 | 编辑源代码]

VirtualBox 中 Windows 客户机的视频输出有时会挂起,直到主机强制屏幕更新(例如移动鼠标光标)。删除 enable_fbc=1 选项可以解决这个问题。

屏幕闪烁[编辑 | 编辑源代码]

面板自刷新 (PSR), 一种 Intel iGPU (核显)使用的节能技术已知在某些情况下会导致闪烁 FS#49628 FS#49371 FS#50605. 临时的解决办法是通过设置 i915.enable_psr=0 内核参数来禁用该功能。

在 i915 驱动上使用 OpenGL 2.1[编辑 | 编辑源代码]

正如这篇文章所说,把 mesa 从 13.x 版本更新到 17 可能会导致第三代 Intel GPU (如GMA3100,参阅这里)上的 OpenGL 2.1 支持失效,并使其降级到 OpenGL 1.4。然而您可以通过配置 /etc/drirc~/.drirc 文件中的选项来手动恢复它:

/etc/drirc
<driconf>
...
    <device driver="i915">
        <application name="Default">
            <option name="stub_occlusion_query" value="true" />
            <option name="fragment_shader" value="true" />
        </application>
    </device>
...
</driconf>
注意:
  • 作出该让步的原因是 Chromium 和其他应用程序的糟糕体验。如果有需要,您可以参考 此文 来对 drirc 文件作特定于应用程序的修改,比如专门针对 Chromium 禁用 gl2.1。
  • 新的包含在 mesa 软件包内的基于 Gallium 的 i915 驱动会一直报告 OpenGL 2.1,所以这些设置对于那个驱动来说不再需要了。

KMS 问题:终端只在很小的一块区域中显示[编辑 | 编辑源代码]

其中一个低分辨率视频端口会在引导时启用,这将导致终端仅能使用屏幕的一小块区域。 要修复这个问题,在引导加载程序的内核命令行参数中,使用 i915 模块参数 video=SVIDEO-1:d 来明确禁用该端口。有关详细信息,请参阅内核参数

如果这不起作用,请尝试禁用 TV1 或 VGA1,而不是 SVIDEO-1。视频端口名称可以用 xrandr 列出。

Haswell CPU 使用 HDMI 输出时没有声音[编辑 | 编辑源代码]

根据一个 Linux 内核问题,在设置 intel_iommu=on 参数时声音不会通过 HDMI 端口输出。要修复该问题,使用如下内核参数

intel_iommu=on,igfx_off

或者也可以禁用 IOMMU:

intel_iommu=off

低功耗 Intel CPU 会崩溃或冻结[编辑 | 编辑源代码]

本文或本章节的事实准确性存在争议。

原因: 在额外的声明里提到,enable_dc=0 可能不会影响到电源管理(在 Intel graphics#Incorrect statements regarding power usage penalty of enable_dc=0 中讨论)


由于低功耗 Intel CPU 上电源管理功能的问题,低功耗 Intel 处理器和/或笔记本电脑处理器有随机挂起或崩溃的倾向。如果发生此类崩溃,您将看不到任何报告此问题的日志。添加以下内核参数可能有助于解决问题。

注意: 不建议同时使用以下三个内核参数
intel_idle.max_cstate=1 i915.enable_dc=0 ahci.mobile_lpm_policy=1

ahci.mobile_lpm_policy=1 能修复部分联想笔记本电脑和一些宏碁笔记本电脑因 SATA 控制器电源管理问题而出现的挂起故障。该解决方法严格来说与 Intel 显卡无关,但它确实解决了相关问题。添加此内核参数可以将链路电源管理(LPM)从固件默认值修改为最大性能,并且还可以解决当您在某些联想机器上更改显示器亮度时出现的挂起问题。但这么做在现代超级本上会增加 1 至 1.5 W 的闲置功耗。有关更多信息,特别是有关其他状态的信息,请参阅 Linux内核邮件列表Red Hat 文档

i915.enable_dc=0 会禁用GPU电源管理。这确实解决了某些 Intel 系统上的随机挂起问题,特别是 Goldmount 和 Kaby Lake Refresh 芯片。但使用此参数会提高笔记本电脑的功耗并缩短电池寿命。

intel_idle.max_cstate=1 会处理器的睡眠状态,它防止处理器进入深度睡眠状态。这绝对不是理想的做法,而且确实会导致更高的功率使用和更低的电池寿命。然而,它确实解决了许多 Intel 系统上的随机挂起问题。如果您使用的是 Intel Baytrail 或 Kaby Lake Refresh 芯片,请使用此参数。Intel Baytrail 芯片由于一个硬件缺陷,在没有这个内核参数的情况下会随机挂起[33]。有关 max_cstate 参数的更多信息,请参见内核文档以及 GitHub 上关于 cstates 的一篇文章。

如果您尝试通过一次性添加 intel_idle.max_cstate=1 i915.enable_dc=0 ahci.mobile_lpm_policy=1 等三个参数来解决频繁挂起的问题,然后成功了,那您应该用排除法找出真正解决问题的那个参数。因为如果实际的问题与 SATA 电源管理有关,并且 ahci.mobile_lpm_policy=1 参数解决了这个问题,那么禁用 cstate 和显示电源管理是不可取的。

参考 Linux Reviews 网站以获取更多信息。

添加对 165Hz 显示器的支持[编辑 | 编辑源代码]

本文或本章节可能需要合并到内核级显示模式设置#强制设置显示模式与_EDID

附注: 这种技术似乎并不特定于 i915。在合并之前,请验证安装脚本是必需的,并且没有更简单的方法来将 EDID BIN 添加到 initramfs。(在 Talk:Intel 图形处理器 中讨论)

对于某些 165Hz 显示器,xrandr 可能不会显示165Hz选项,且 #添加未检测到的分辨率 中的方法并不能解决这一问题。在这种情况下,请参见 StackExchange 上的问答 i915-driver-stuck-at-40hz-on-165hz-screen

注意: 除了创建 /etc/initramfs-tools/hooks/edid 文件之外,应该通过以下方式创建 mkinitcpio 钩子:
/etc/initcpio/install/edid
#!/bin/bash

build() {
    add_file /lib/firmware/edid/edid.bin
}

help() {
    cat <<HELPEOF
This hook add support for 165Hz
HELPEOF
}

然后在 /etc/mkinitcpio.conf 文件的 HOOKS 中添加 edid ,就像下面这样

/etc/mkinitcpio.conf
HOOKS=(... fsck edid)

最后 重新生成initramfs.

Raptor Lake 和 Alder Lake-P 处理器从睡眠/挂起中恢复时冻结[编辑 | 编辑源代码]

来自不同供应商的 Raptor Lake 和 Alder Lake-P 第 12 代移动处理器的笔记本电脑的用户在从暂停状态中醒来后,遇到了了冻结和黑屏。这是因为根据 freedesktop issue 55316401 的描述,许多笔记本电脑供应商提供了错误的 VBT(Video BIOS Table,视频 BIOS 表),错误地描述了连接到 iGPU 的实际端口。在这种情况下,所有被记录的案例都怀疑是重复的 eDP 条目。

考虑到大多数供应商不会为运行正常的 Windows 操作系统的笔记本电脑发布 BIOS 更新,Linux 用户只能在内核端解决这个问题。有两个方法可以防止出现重复的 eDP 条目以影响到内核:修补内核或者加载一个 修改过的 VBT

为了修补内核,重复的 eDP 条目需要通过分析以下命令的输出被辨别出来:

# intel_vbt_decode /sys/kernel/debug/dri/1/i915_vbt
Child device info:
        Device handle: 0x0008 (LFP 1 (eDP))
        Device type: 0x1806 (unknown)
 ...
 Child device info:
        Device handle: 0x0080 (LFP 2 (eDP))
        Device type: 0x1806 (unknown)

输出表明这里确实存在重复的 eDP,内核应该忽略掉第二个,但是用户还是被鼓励检查这个。然后可以使用下面的补丁修补内核,如果有需要的话重复条目的索引可以被替换为 ignoreEntry = 1

--- a/drivers/gpu/drm/i915/display/intel_bios.c
+++ b/drivers/gpu/drm/i915/display/intel_bios.c
@@ -3688,6 +3688,14 @@
{
       struct intel_bios_encoder_data *devdata;

+       int ignoreEntry = 0;
+
       list_for_each_entry(devdata, &i915->display.vbt.display_devices, node)
-               func(i915, devdata);
+       {
+               if (ignoreEntry != 1)
+               {
+                       func(i915, devdata);
+                       ignoreEntry++;
+               }
+       }
}

第二种解决这个问题的方法是通过直接清除 VBT 内重复条目来修改 VBT。

复制 VBT,使用十六进制编辑器编辑它然后修改重复的 device handle 的 device type 至 00 00

$ cat /sys/kernel/debug/dri/0/i915_vbt > vbt
--- vbt
+++ modified_vbt
@@ -22,10 +22,10 @@
 00000150  00 08 00 20 00 08 00 10  00 08 00 02 00 08 00 01  |... ............|
 00000160  00 08 00 00 01 08 00 00  00 04 00 00 00 40 00 00  |.............@..|
 00000170  00 20 00 00 00 10 00 00  00 02 00 00 00 01 00 00  |. ..............|
-00000180  00 00 01 00 00 02 8b 01  02 04 00 00 27 08 00 06  |............'...|
-00000190  18 00 00 00 00 00 00 00  00 00 00 00 00 0a 00 00  |................|
+00000180  00 00 01 00 00 02 8b 01  02 04 00 00 27 08 00 00  |............'...|
+00000190  00 00 00 00 00 00 00 00  00 00 00 00 00 0a 00 00  |................|
 000001a0  03 00 00 00 c0 00 40 00  20 00 00 00 00 00 00 00  |......@. .......|
-000001b0  00 00 20 00 80 00 06 18  00 00 00 00 00 00 00 00  |.. .............|
+000001b0  00 00 20 00 80 00 00 00  00 00 00 00 00 00 00 00  |.. .............|
 000001c0  00 00 00 00 07 00 00 00  00 00 00 c0 00 10 00 20  |............... |
 000001d0  00 00 00 00 00 00 00 00  00 20 00 04 00 d2 60 00  |......... ....`.|
 000001e0  10 10 00 23 21 10 00 00  00 00 00 07 00 00 02 00  |...#!...........|

这个修改过的 VBT 可以通过复制到 /lib/firmware/modified_vbt 再传递 i915.vbt_firmware=modified_vbt 的内核参数来加载,以及如果有需要,重新生成 initramfs

参阅[编辑 | 编辑源代码]