| Seq | Timestamp | Type | Name | Duration |
|---|---|---|---|---|
| 0/0 | 2026/08/11 01:11 | flow | patch-triage |
2mArgs:null Results: {
"EnableConfigs": [
"DRM_VKMS",
"DRM_FBDEV_EMULATION"
],
"FocusSymbols": [
"drm_client_modeset_wait_for_vblank",
"drm_crtc_wait_one_vblank",
"drm_crtc_wait_one_vblank_internal"
],
"KMSANReasoning": "The patch refactors `drm_crtc_wait_one_vblank` by extracting its core waiting logic into a new internal function `drm_crtc_wait_one_vblank_internal`. This allows callers like `drm_client_modeset_wait_for_vblank` that already hold a vblank reference to wait without acquiring and releasing the reference again. The changes are purely related to control flow, reference counting, and wait queues. There are no new data structures allocated, no structures copied to user space, and no uninitialized memory risks introduced. Any potential bugs introduced by this patch (such as use-after-free due to incorrect reference counting) would be caught by KASAN or standard kernel debugging tools. Therefore, a dedicated KMSAN fuzzing session is not necessary.",
"NeedsKMSAN": false,
"Reasoning": "The patch refactors the vblank waiting logic in the DRM core to avoid nested `drm_crtc_vblank_get` calls, introducing a new internal helper `drm_crtc_wait_one_vblank_internal`. This fixes a potential issue in `drm_client_modeset_wait_for_vblank` and modifies the execution flow of `drm_crtc_wait_one_vblank`. These functions are reachable from userspace via fbdev ioctls (e.g., `FBIO_WAITFORVSYNC`) and DRM atomic commits. The changes have a functional impact on the DRM core and are worth fuzzing.",
"WorthFuzzing": true
} |
| 1/1 | 2026/08/11 01:11 | action | read-patch-diff |
0mArgs:null Results: {
"PatchDiff": "commit d40deccccfdc284622c2366eab822b2770536ed8\nAuthor: syz-cluster \u003ctriage@syzkaller.com\u003e\nDate: Tue Aug 11 01:11:58 2026 +0000\n\n syz-cluster: applied patch under review\n\ndiff --git a/drivers/gpu/drm/drm_client_modeset.c b/drivers/gpu/drm/drm_client_modeset.c\nindex 0080a8e9556a5..7ff0f24a0f502 100644\n--- a/drivers/gpu/drm/drm_client_modeset.c\n+++ b/drivers/gpu/drm/drm_client_modeset.c\n@@ -1328,7 +1328,7 @@ int drm_client_modeset_wait_for_vblank(struct drm_client_dev *client, unsigned i\n \t */\n \tret = drm_crtc_vblank_get(crtc);\n \tif (!ret) {\n-\t\tdrm_crtc_wait_one_vblank(crtc);\n+\t\tdrm_crtc_wait_one_vblank_internal(crtc);\n \t\tdrm_crtc_vblank_put(crtc);\n \t}\n \ndiff --git a/drivers/gpu/drm/drm_internal.h b/drivers/gpu/drm/drm_internal.h\nindex f893b1e3a596e..6fd33672d206a 100644\n--- a/drivers/gpu/drm/drm_internal.h\n+++ b/drivers/gpu/drm/drm_internal.h\n@@ -115,6 +115,7 @@ void drm_vblank_disable_and_save(struct drm_device *dev, unsigned int pipe);\n int drm_vblank_get(struct drm_device *dev, unsigned int pipe);\n void drm_vblank_put(struct drm_device *dev, unsigned int pipe);\n u64 drm_vblank_count(struct drm_device *dev, unsigned int pipe);\n+int drm_crtc_wait_one_vblank_internal(struct drm_crtc *crtc);\n \n /* drm_vblank_work.c */\n static inline void drm_vblank_flush_worker(struct drm_vblank_crtc *vblank)\ndiff --git a/drivers/gpu/drm/drm_vblank.c b/drivers/gpu/drm/drm_vblank.c\nindex f90fb2d13e423..9cac7013b4c9c 100644\n--- a/drivers/gpu/drm/drm_vblank.c\n+++ b/drivers/gpu/drm/drm_vblank.c\n@@ -1297,6 +1297,32 @@ void drm_crtc_vblank_put(struct drm_crtc *crtc)\n }\n EXPORT_SYMBOL(drm_crtc_vblank_put);\n \n+/**\n+ * drm_crtc_wait_one_vblank_internal - wait for one vblank\n+ * @crtc: DRM crtc\n+ *\n+ * This waits for one vblank to pass on @crtc, using the irq driver interfaces.\n+ * Every caller must hold a vblank reference across the complete wait.\n+ *\n+ * Returns: 0 on success, negative error on failures.\n+ */\n+int drm_crtc_wait_one_vblank_internal(struct drm_crtc *crtc)\n+{\n+\tstruct drm_device *dev = crtc-\u003edev;\n+\tint pipe = drm_crtc_index(crtc);\n+\tstruct drm_vblank_crtc *vblank = drm_crtc_vblank_crtc(crtc);\n+\tint ret;\n+\tu64 last;\n+\n+\tlast = drm_vblank_count(dev, pipe);\n+\n+\tret = wait_event_timeout(vblank-\u003equeue,\n+\t\t\t\t last != drm_vblank_count(dev, pipe),\n+\t\t\t\t msecs_to_jiffies(1000));\n+\n+\treturn ret ? 0 : -ETIMEDOUT;\n+}\n+\n /**\n * drm_crtc_wait_one_vblank - wait for one vblank\n * @crtc: DRM crtc\n@@ -1311,26 +1337,20 @@ int drm_crtc_wait_one_vblank(struct drm_crtc *crtc)\n {\n \tstruct drm_device *dev = crtc-\u003edev;\n \tint pipe = drm_crtc_index(crtc);\n-\tstruct drm_vblank_crtc *vblank = drm_crtc_vblank_crtc(crtc);\n \tint ret;\n-\tu64 last;\n \n \tret = drm_vblank_get(dev, pipe);\n \tif (drm_WARN(dev, ret, \"vblank not available on crtc %i, ret=%i\\n\",\n \t\t pipe, ret))\n \t\treturn ret;\n \n-\tlast = drm_vblank_count(dev, pipe);\n-\n-\tret = wait_event_timeout(vblank-\u003equeue,\n-\t\t\t\t last != drm_vblank_count(dev, pipe),\n-\t\t\t\t msecs_to_jiffies(1000));\n+\tret = drm_crtc_wait_one_vblank_internal(crtc);\n \n-\tdrm_WARN(dev, ret == 0, \"vblank wait timed out on crtc %i\\n\", pipe);\n+\tdrm_WARN(dev, ret == -ETIMEDOUT, \"vblank wait timed out on crtc %i\\n\", pipe);\n \n \tdrm_vblank_put(dev, pipe);\n \n-\treturn ret ? 0 : -ETIMEDOUT;\n+\treturn ret;\n }\n EXPORT_SYMBOL(drm_crtc_wait_one_vblank);\n \n"
} |
| 2/1 | 2026/08/11 01:11 | agent | patch-evaluator |
2mModel:best-expensive Args: null Results: {
"EnableConfigs": [
"DRM_VKMS",
"DRM_FBDEV_EMULATION"
],
"FocusSymbols": [
"drm_client_modeset_wait_for_vblank",
"drm_crtc_wait_one_vblank",
"drm_crtc_wait_one_vblank_internal"
],
"Reasoning": "The patch refactors the vblank waiting logic in the DRM core to avoid nested `drm_crtc_vblank_get` calls, introducing a new internal helper `drm_crtc_wait_one_vblank_internal`. This fixes a potential issue in `drm_client_modeset_wait_for_vblank` and modifies the execution flow of `drm_crtc_wait_one_vblank`. These functions are reachable from userspace via fbdev ioctls (e.g., `FBIO_WAITFORVSYNC`) and DRM atomic commits. The changes have a functional impact on the DRM core and are worth fuzzing.",
"WorthFuzzing": true
}Instruction: You are an expert Linux kernel maintainer. Your job is to review a provided patch series and determine if it makes functional changes to the kernel that should be fuzzed. IMPORTANT: The changes have ALREADY been applied and committed as the HEAD commit in your workspace. Do NOT rely on your internal knowledge of the kernel. You must actively use your code access tools to examine the actual source code and confirm any assumptions. Return WorthFuzzing=false if the patch only contains: - Modifications to Documentation/, Kconfig files, or code comments. - Purely decorative changes, such as logging (e.g., pr_err, printk) or tracepoints. - Changes to numeric constants or macros that do not functionally alter execution flow. - Code paths that are impossible to reach in virtualized environments like GCE or QEMU, even when utilizing software-emulated hardware (e.g., usb gadget, mac80211_hwsim). - Code in vendor-specific PCIe switch, SmartNIC, or GPU drivers (e.g., mlxsw, pds_core, qed, ionic, amdgpu) that require physical PCIe hardware cards not emulated in standard QEMU. - Driver .remove, .shutdown, or pci_unregister_driver teardown callbacks (e.g., igb_remove) that are executed only during PCI hot-unplug or sysfs driver unbind operations. If it modifies reachable core kernel logic, drivers, or architectures, use your code search tools to verify the code can be executed, then return WorthFuzzing=true. When returning WorthFuzzing=true, you MUST ALSO: 1. Extract any specific kernel functions that should be heavily fuzzed into FocusSymbols. Avoid listing generic hot-path functions to prevent skewed test distributions. Prefer non-static, non-inlined API entrypoint functions over internal static helper functions (which are inlined by the compiler and do not have distinct symbol addresses). 2. Identify any specific CONFIG_ options required to properly test this new/modified feature. Go and look into the Kconfig files and check for ifdefs around the code, do not make assumptions. Also check "depends on" lines in Kconfig to include any non-standard parent subsystem configs needed for Kbuild to compile the code statically into vmlinux. List them in the EnableConfigs output array, and DO NOT add a 'CONFIG_' prefix (e.g., return "NET_IPV4" instead of "CONFIG_NET_IPV4"). Prefer calling several tools at the same time to save round-trips. Use set-results tool to provide results of the analysis. It must be called exactly once before the final reply. Ignore results of this tool. Prompt: For your convenience, here is the diff of the changes:
commit d40deccccfdc284622c2366eab822b2770536ed8
Author: syz-cluster <triage@syzkaller.com>
Date: Tue Aug 11 01:11:58 2026 +0000
syz-cluster: applied patch under review
diff --git a/drivers/gpu/drm/drm_client_modeset.c b/drivers/gpu/drm/drm_client_modeset.c
index 0080a8e9556a5..7ff0f24a0f502 100644
--- a/drivers/gpu/drm/drm_client_modeset.c
+++ b/drivers/gpu/drm/drm_client_modeset.c
@@ -1328,7 +1328,7 @@ int drm_client_modeset_wait_for_vblank(struct drm_client_dev *client, unsigned i
*/
ret = drm_crtc_vblank_get(crtc);
if (!ret) {
- drm_crtc_wait_one_vblank(crtc);
+ drm_crtc_wait_one_vblank_internal(crtc);
drm_crtc_vblank_put(crtc);
}
diff --git a/drivers/gpu/drm/drm_internal.h b/drivers/gpu/drm/drm_internal.h
index f893b1e3a596e..6fd33672d206a 100644
--- a/drivers/gpu/drm/drm_internal.h
+++ b/drivers/gpu/drm/drm_internal.h
@@ -115,6 +115,7 @@ void drm_vblank_disable_and_save(struct drm_device *dev, unsigned int pipe);
int drm_vblank_get(struct drm_device *dev, unsigned int pipe);
void drm_vblank_put(struct drm_device *dev, unsigned int pipe);
u64 drm_vblank_count(struct drm_device *dev, unsigned int pipe);
+int drm_crtc_wait_one_vblank_internal(struct drm_crtc *crtc);
/* drm_vblank_work.c */
static inline void drm_vblank_flush_worker(struct drm_vblank_crtc *vblank)
diff --git a/drivers/gpu/drm/drm_vblank.c b/drivers/gpu/drm/drm_vblank.c
index f90fb2d13e423..9cac7013b4c9c 100644
--- a/drivers/gpu/drm/drm_vblank.c
+++ b/drivers/gpu/drm/drm_vblank.c
@@ -1297,6 +1297,32 @@ void drm_crtc_vblank_put(struct drm_crtc *crtc)
}
EXPORT_SYMBOL(drm_crtc_vblank_put);
+/**
+ * drm_crtc_wait_one_vblank_internal - wait for one vblank
+ * @crtc: DRM crtc
+ *
+ * This waits for one vblank to pass on @crtc, using the irq driver interfaces.
+ * Every caller must hold a vblank reference across the complete wait.
+ *
+ * Returns: 0 on success, negative error on failures.
+ */
+int drm_crtc_wait_one_vblank_internal(struct drm_crtc *crtc)
+{
+ struct drm_device *dev = crtc->dev;
+ int pipe = drm_crtc_index(crtc);
+ struct drm_vblank_crtc *vblank = drm_crtc_vblank_crtc(crtc);
+ int ret;
+ u64 last;
+
+ last = drm_vblank_count(dev, pipe);
+
+ ret = wait_event_timeout(vblank->queue,
+ last != drm_vblank_count(dev, pipe),
+ msecs_to_jiffies(1000));
+
+ return ret ? 0 : -ETIMEDOUT;
+}
+
/**
* drm_crtc_wait_one_vblank - wait for one vblank
* @crtc: DRM crtc
@@ -1311,26 +1337,20 @@ int drm_crtc_wait_one_vblank(struct drm_crtc *crtc)
{
struct drm_device *dev = crtc->dev;
int pipe = drm_crtc_index(crtc);
- struct drm_vblank_crtc *vblank = drm_crtc_vblank_crtc(crtc);
int ret;
- u64 last;
ret = drm_vblank_get(dev, pipe);
if (drm_WARN(dev, ret, "vblank not available on crtc %i, ret=%i\n",
pipe, ret))
return ret;
- last = drm_vblank_count(dev, pipe);
-
- ret = wait_event_timeout(vblank->queue,
- last != drm_vblank_count(dev, pipe),
- msecs_to_jiffies(1000));
+ ret = drm_crtc_wait_one_vblank_internal(crtc);
- drm_WARN(dev, ret == 0, "vblank wait timed out on crtc %i\n", pipe);
+ drm_WARN(dev, ret == -ETIMEDOUT, "vblank wait timed out on crtc %i\n", pipe);
drm_vblank_put(dev, pipe);
- return ret ? 0 : -ETIMEDOUT;
+ return ret;
}
EXPORT_SYMBOL(drm_crtc_wait_one_vblank);
|
| 3/2 | 2026/08/11 01:11 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 3149 output: 27 thoughts: 300 Thoughts: **Analyzing a Potential Fuzzing Target: DRM Client Modeset** Okay, so I've got a patch here that's touching `drm_client_modeset.c`, `drm_internal.h`, and `drm_vblank.c`. My initial read says it's refactoring some vblank waiting logic. Specifically, it's pulling out the waiting part from `drm_crtc_wait_one_vblank` into a new internal function, `drm_crtc_wait_one_vblank_internal`. The key change seems to be that `drm_client_modeset_wait_for_vblank` is now going to use this internal function instead of the original `drm_crtc_wait_one_vblank`. My first gut reaction is, "Hmm, potentially interesting for fuzzing." It's changing the execution path of those two functions, `drm_client_modeset_wait_for_vblank` and `drm_crtc_wait_one_vblank`. The critical point here is that `drm_client_modeset_wait_for_vblank` already calls `drm_crtc_vblank_get` before it starts waiting, and the refactor is avoiding a *nested* call to `drm_crtc_vblank_get`. That smells like a potential race condition or some timing-related bug could be exposed with the new approach. But wait a minute... `drm_client_modeset_wait_for_vblank`... that's part of DRM client modeset, right? And isn't *that* accessible from userspace? Through DRM ioctls or sysfs? Yeah, I'm pretty sure it is. Alright, I need to confirm where `drm_client_modeset_wait_for_vblank` is actually called. That's a crucial piece of information before I make a call on fuzzing. Gotta see what the call sites look like. |
| 4/2 | 2026/08/11 01:12 | tool | grepper |
0mArgs:{
"Expression": "drm_client_modeset_wait_for_vblank"
}Results: {
"Output": "drivers/gpu/drm/drm_client_modeset.c=1295=EXPORT_SYMBOL(drm_client_modeset_dpms);\n--\ndrivers/gpu/drm/drm_client_modeset.c-1297-/**\ndrivers/gpu/drm/drm_client_modeset.c:1298: * drm_client_modeset_wait_for_vblank() - Wait for the next VBLANK to occur\ndrivers/gpu/drm/drm_client_modeset.c-1299- * @client: DRM client\n--\ndrivers/gpu/drm/drm_client_modeset.c-1308- */\ndrivers/gpu/drm/drm_client_modeset.c:1309:int drm_client_modeset_wait_for_vblank(struct drm_client_dev *client, unsigned int crtc_index)\ndrivers/gpu/drm/drm_client_modeset.c-1310-{\n--\ndrivers/gpu/drm/drm_client_modeset.c-1338-}\ndrivers/gpu/drm/drm_client_modeset.c:1339:EXPORT_SYMBOL(drm_client_modeset_wait_for_vblank);\ndrivers/gpu/drm/drm_client_modeset.c-1340-\n--\ndrivers/gpu/drm/drm_fb_helper.c=315=static void drm_fb_helper_fb_dirty(struct drm_fb_helper *helper)\n--\ndrivers/gpu/drm/drm_fb_helper.c-326-\tif (crtc_index \u003e= 0)\ndrivers/gpu/drm/drm_fb_helper.c:327:\t\tdrm_client_modeset_wait_for_vblank(\u0026helper-\u003eclient, crtc_index);\ndrivers/gpu/drm/drm_fb_helper.c-328-\tmutex_unlock(\u0026helper-\u003elock);\n--\ndrivers/gpu/drm/drm_fb_helper.c=984=int drm_fb_helper_ioctl(struct fb_info *info, unsigned int cmd,\n--\ndrivers/gpu/drm/drm_fb_helper.c-1009-\t\t */\ndrivers/gpu/drm/drm_fb_helper.c:1010:\t\tret = drm_client_modeset_wait_for_vblank(\u0026fb_helper-\u003eclient, 0);\ndrivers/gpu/drm/drm_fb_helper.c-1011-\t\tbreak;\n--\ninclude/drm/drm_client.h=219=int drm_client_modeset_dpms(struct drm_client_dev *client, int mode);\ninclude/drm/drm_client.h:220:int drm_client_modeset_wait_for_vblank(struct drm_client_dev *client, unsigned int crtc_index);\ninclude/drm/drm_client.h-221-\n"
} |
| 5/2 | 2026/08/11 01:12 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 4600 output: 22 thoughts: 302 Thoughts: **Analyzing a DRM/FBDEV Interaction Bug Fix** Okay, so I'm looking at this fix related to `drm_fb_helper_ioctl` and `drm_fb_helper_fb_dirty`. My immediate thought is that this is reachable from userspace, specifically through the `FBIO_WAITFORVSYNC` ioctl, and possibly others. Given syzkaller's fuzzing of the DRM subsystem, like with vgem and vkms, this is definitely something that could be triggered in a fuzzing campaign. The core of the issue seems to be the order of operations in waiting for a vblank. Specifically, `drm_crtc_wait_one_vblank` was being called *after* a `drm_crtc_vblank_get`, which in turn, would call `drm_vblank_get` *again*. That's inefficient and potentially buggy. This is a clear functional change, not just a cosmetic one. My next step is to dig into the relevant functions. Let's look at `drm_crtc_wait_one_vblank_internal` and `drm_crtc_wait_one_vblank`. `drm_crtc_wait_one_vblank` is the exported, public interface, used by numerous DRM drivers. `drm_crtc_wait_one_vblank_internal` is the internal helper function. Even though it's internal, the fact that it isn't `static` means it technically has a symbol, so I should include it in my review. I want to focus on these symbols to understand how this is happening: * `drm_client_modeset_wait_for_vblank` * `drm_crtc_wait_one_vblank` * `drm_crtc_wait_one_vblank_internal` Finally, a quick check of the relevant configuration options for DRM and FB_HELPER is in order, just to make sure we're not dealing with some unusual configuration dependency. |
| 6/2 | 2026/08/11 01:12 | tool | grepper |
0mArgs:{
"Expression": "config DRM_FBDEV_EMULATION"
}Results: {
"Output": "drivers/gpu/drm/clients/Kconfig=28=menu \"Supported DRM clients\"\n--\ndrivers/gpu/drm/clients/Kconfig-30-\ndrivers/gpu/drm/clients/Kconfig:31:config DRM_FBDEV_EMULATION\ndrivers/gpu/drm/clients/Kconfig-32-\tbool \"Enable legacy fbdev support for your modesetting driver\"\n"
} |
| 7/2 | 2026/08/11 01:12 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 5460 output: 19 thoughts: 40 Thoughts: Okay, here's my interpretation of that thought process, from an expert's perspective: **Diving into the Framebuffer Emulation** Hang on a second… I'm seeing this `drm_fb_helper.c` file and its compilation under `CONFIG_DRM_FBDEV_EMULATION`. That's interesting, and it immediately triggers some flags. I need to understand why this emulation is even happening. Let me quickly jump over to the `drivers/gpu/drm/Makefile`. I need to figure out how this `drm_fbdev_emulation` config option ties into the bigger picture of the Direct Rendering Manager (DRM) and framebuffers. My spidey-sense tells me this is key to how some legacy framebuffer interactions are handled in the DRM world, and I need to refresh my memory on the underlying dependencies and configuration choices. |
| 8/2 | 2026/08/11 01:12 | tool | grepper |
0mArgs:{
"Expression": "drm_fb_helper"
}Results: {
"Output": "\nFull output is too long, showing 500 out of 1568 lines.\nUse more precise expression if possible.\n\nDocumentation/gpu/drm-kms-helpers.rst=109=fbdev Helper Functions Reference\n--\nDocumentation/gpu/drm-kms-helpers.rst-111-\nDocumentation/gpu/drm-kms-helpers.rst:112:.. kernel-doc:: drivers/gpu/drm/drm_fb_helper.c\nDocumentation/gpu/drm-kms-helpers.rst-113- :doc: fbdev helpers\nDocumentation/gpu/drm-kms-helpers.rst-114-\nDocumentation/gpu/drm-kms-helpers.rst:115:.. kernel-doc:: include/drm/drm_fb_helper.h\nDocumentation/gpu/drm-kms-helpers.rst-116- :internal:\nDocumentation/gpu/drm-kms-helpers.rst-117-\nDocumentation/gpu/drm-kms-helpers.rst:118:.. kernel-doc:: drivers/gpu/drm/drm_fb_helper.c\nDocumentation/gpu/drm-kms-helpers.rst-119- :export:\n--\ndrivers/gpu/drm/Makefile=159=drm_kms_helper-$(CONFIG_DRM_PANEL_BRIDGE) += bridge/panel.o\ndrivers/gpu/drm/Makefile:160:drm_kms_helper-$(CONFIG_DRM_FBDEV_EMULATION) += drm_fb_helper.o\ndrivers/gpu/drm/Makefile-161-obj-$(CONFIG_DRM_KMS_HELPER) += drm_kms_helper.o\n--\ndrivers/gpu/drm/amd/amdgpu/amdgpu_display.c-44-#include \u003cdrm/drm_edid.h\u003e\ndrivers/gpu/drm/amd/amdgpu/amdgpu_display.c:45:#include \u003cdrm/drm_fb_helper.h\u003e\ndrivers/gpu/drm/amd/amdgpu/amdgpu_display.c-46-#include \u003cdrm/drm_gem_framebuffer_helper.h\u003e\n--\ndrivers/gpu/drm/amd/amdgpu/amdgpu_display.c=1741=int amdgpu_display_suspend_helper(struct amdgpu_device *adev)\n--\ndrivers/gpu/drm/amd/amdgpu/amdgpu_display.c-1776-\ndrivers/gpu/drm/amd/amdgpu/amdgpu_display.c:1777:\t\tif (!drm_fb_helper_gem_is_fb(dev-\u003efb_helper, fb-\u003eobj[0])) {\ndrivers/gpu/drm/amd/amdgpu/amdgpu_display.c-1778-\t\t\tstruct amdgpu_bo *robj = gem_to_amdgpu_bo(fb-\u003eobj[0]);\n--\ndrivers/gpu/drm/amd/amdgpu/amdgpu_kms.c-31-#include \u003cdrm/drm_drv.h\u003e\ndrivers/gpu/drm/amd/amdgpu/amdgpu_kms.c:32:#include \u003cdrm/drm_fb_helper.h\u003e\ndrivers/gpu/drm/amd/amdgpu/amdgpu_kms.c-33-#include \"amdgpu_uvd.h\"\n--\ndrivers/gpu/drm/armada/armada_drm.h=18=struct drm_display_mode;\ndrivers/gpu/drm/armada/armada_drm.h:19:struct drm_fb_helper;\ndrivers/gpu/drm/armada/armada_drm.h:20:struct drm_fb_helper_surface_size;\ndrivers/gpu/drm/armada/armada_drm.h-21-\n--\ndrivers/gpu/drm/armada/armada_drm.h=57=struct armada_private {\n--\ndrivers/gpu/drm/armada/armada_drm.h-78-#if defined(CONFIG_DRM_FBDEV_EMULATION)\ndrivers/gpu/drm/armada/armada_drm.h:79:int armada_fbdev_driver_fbdev_probe(struct drm_fb_helper *fbh,\ndrivers/gpu/drm/armada/armada_drm.h:80:\t\t\t\t struct drm_fb_helper_surface_size *sizes);\ndrivers/gpu/drm/armada/armada_drm.h-81-#define ARMADA_FBDEV_DRIVER_OPS \\\n--\ndrivers/gpu/drm/armada/armada_fbdev.c-13-#include \u003cdrm/drm_drv.h\u003e\ndrivers/gpu/drm/armada/armada_fbdev.c:14:#include \u003cdrm/drm_fb_helper.h\u003e\ndrivers/gpu/drm/armada/armada_fbdev.c-15-#include \u003cdrm/drm_fourcc.h\u003e\n--\ndrivers/gpu/drm/armada/armada_fbdev.c=23=static void armada_fbdev_fb_destroy(struct fb_info *info)\ndrivers/gpu/drm/armada/armada_fbdev.c-24-{\ndrivers/gpu/drm/armada/armada_fbdev.c:25:\tstruct drm_fb_helper *fbh = info-\u003epar;\ndrivers/gpu/drm/armada/armada_fbdev.c-26-\ndrivers/gpu/drm/armada/armada_fbdev.c:27:\tdrm_fb_helper_fini(fbh);\ndrivers/gpu/drm/armada/armada_fbdev.c-28-\n--\ndrivers/gpu/drm/armada/armada_fbdev.c=34=static const struct fb_ops armada_fb_ops = {\n--\ndrivers/gpu/drm/armada/armada_fbdev.c-40-\ndrivers/gpu/drm/armada/armada_fbdev.c:41:static const struct drm_fb_helper_funcs armada_fbdev_helper_funcs;\ndrivers/gpu/drm/armada/armada_fbdev.c-42-\ndrivers/gpu/drm/armada/armada_fbdev.c:43:int armada_fbdev_driver_fbdev_probe(struct drm_fb_helper *fbh,\ndrivers/gpu/drm/armada/armada_fbdev.c:44:\t\t\t\t struct drm_fb_helper_surface_size *sizes)\ndrivers/gpu/drm/armada/armada_fbdev.c-45-{\n--\ndrivers/gpu/drm/armada/armada_fbdev.c-101-\ndrivers/gpu/drm/armada/armada_fbdev.c:102:\tdrm_fb_helper_fill_info(info, fbh, sizes);\ndrivers/gpu/drm/armada/armada_fbdev.c-103-\n--\ndrivers/gpu/drm/clients/drm_fbdev_client.c-5-#include \u003cdrm/drm_drv.h\u003e\ndrivers/gpu/drm/clients/drm_fbdev_client.c:6:#include \u003cdrm/drm_fb_helper.h\u003e\ndrivers/gpu/drm/clients/drm_fbdev_client.c-7-#include \u003cdrm/drm_fourcc.h\u003e\n--\ndrivers/gpu/drm/clients/drm_fbdev_client.c=16=static void drm_fbdev_client_free(struct drm_client_dev *client)\ndrivers/gpu/drm/clients/drm_fbdev_client.c-17-{\ndrivers/gpu/drm/clients/drm_fbdev_client.c:18:\tstruct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);\ndrivers/gpu/drm/clients/drm_fbdev_client.c-19-\ndrivers/gpu/drm/clients/drm_fbdev_client.c:20:\tdrm_fb_helper_unprepare(fb_helper);\ndrivers/gpu/drm/clients/drm_fbdev_client.c-21-\tkfree(fb_helper);\n--\ndrivers/gpu/drm/clients/drm_fbdev_client.c=24=static void drm_fbdev_client_unregister(struct drm_client_dev *client)\ndrivers/gpu/drm/clients/drm_fbdev_client.c-25-{\ndrivers/gpu/drm/clients/drm_fbdev_client.c:26:\tstruct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);\ndrivers/gpu/drm/clients/drm_fbdev_client.c-27-\n--\ndrivers/gpu/drm/clients/drm_fbdev_client.c-31-\t\t */\ndrivers/gpu/drm/clients/drm_fbdev_client.c:32:\t\tdrm_fb_helper_unregister_info(fb_helper);\ndrivers/gpu/drm/clients/drm_fbdev_client.c-33-\t} else {\n--\ndrivers/gpu/drm/clients/drm_fbdev_client.c=41=static int drm_fbdev_client_restore(struct drm_client_dev *client, bool force)\ndrivers/gpu/drm/clients/drm_fbdev_client.c-42-{\ndrivers/gpu/drm/clients/drm_fbdev_client.c:43:\tstruct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);\ndrivers/gpu/drm/clients/drm_fbdev_client.c-44-\ndrivers/gpu/drm/clients/drm_fbdev_client.c:45:\tdrm_fb_helper_restore_fbdev_mode_unlocked(fb_helper, force);\ndrivers/gpu/drm/clients/drm_fbdev_client.c-46-\n--\ndrivers/gpu/drm/clients/drm_fbdev_client.c=50=static int drm_fbdev_client_hotplug(struct drm_client_dev *client)\ndrivers/gpu/drm/clients/drm_fbdev_client.c-51-{\ndrivers/gpu/drm/clients/drm_fbdev_client.c:52:\tstruct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);\ndrivers/gpu/drm/clients/drm_fbdev_client.c-53-\tstruct drm_device *dev = client-\u003edev;\n--\ndrivers/gpu/drm/clients/drm_fbdev_client.c-56-\tif (dev-\u003efb_helper)\ndrivers/gpu/drm/clients/drm_fbdev_client.c:57:\t\treturn drm_fb_helper_hotplug_event(dev-\u003efb_helper);\ndrivers/gpu/drm/clients/drm_fbdev_client.c-58-\ndrivers/gpu/drm/clients/drm_fbdev_client.c:59:\tret = drm_fb_helper_init(dev, fb_helper);\ndrivers/gpu/drm/clients/drm_fbdev_client.c-60-\tif (ret)\n--\ndrivers/gpu/drm/clients/drm_fbdev_client.c-65-\ndrivers/gpu/drm/clients/drm_fbdev_client.c:66:\tret = drm_fb_helper_initial_config(fb_helper);\ndrivers/gpu/drm/clients/drm_fbdev_client.c-67-\tif (ret)\ndrivers/gpu/drm/clients/drm_fbdev_client.c:68:\t\tgoto err_drm_fb_helper_fini;\ndrivers/gpu/drm/clients/drm_fbdev_client.c-69-\n--\ndrivers/gpu/drm/clients/drm_fbdev_client.c-71-\ndrivers/gpu/drm/clients/drm_fbdev_client.c:72:err_drm_fb_helper_fini:\ndrivers/gpu/drm/clients/drm_fbdev_client.c:73:\tdrm_fb_helper_fini(fb_helper);\ndrivers/gpu/drm/clients/drm_fbdev_client.c-74-err_drm_err:\n--\ndrivers/gpu/drm/clients/drm_fbdev_client.c=79=static int drm_fbdev_client_suspend(struct drm_client_dev *client)\ndrivers/gpu/drm/clients/drm_fbdev_client.c-80-{\ndrivers/gpu/drm/clients/drm_fbdev_client.c:81:\tstruct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);\ndrivers/gpu/drm/clients/drm_fbdev_client.c-82-\ndrivers/gpu/drm/clients/drm_fbdev_client.c:83:\tdrm_fb_helper_set_suspend_unlocked(fb_helper, true);\ndrivers/gpu/drm/clients/drm_fbdev_client.c-84-\n--\ndrivers/gpu/drm/clients/drm_fbdev_client.c=88=static int drm_fbdev_client_resume(struct drm_client_dev *client)\ndrivers/gpu/drm/clients/drm_fbdev_client.c-89-{\ndrivers/gpu/drm/clients/drm_fbdev_client.c:90:\tstruct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);\ndrivers/gpu/drm/clients/drm_fbdev_client.c-91-\ndrivers/gpu/drm/clients/drm_fbdev_client.c:92:\tdrm_fb_helper_set_suspend_unlocked(fb_helper, false);\ndrivers/gpu/drm/clients/drm_fbdev_client.c-93-\n--\ndrivers/gpu/drm/clients/drm_fbdev_client.c=126=int drm_fbdev_client_setup(struct drm_device *dev, const struct drm_format_info *format)\ndrivers/gpu/drm/clients/drm_fbdev_client.c-127-{\ndrivers/gpu/drm/clients/drm_fbdev_client.c:128:\tstruct drm_fb_helper *fb_helper;\ndrivers/gpu/drm/clients/drm_fbdev_client.c-129-\tunsigned int color_mode;\n--\ndrivers/gpu/drm/clients/drm_fbdev_client.c-159-\t\treturn -ENOMEM;\ndrivers/gpu/drm/clients/drm_fbdev_client.c:160:\tdrm_fb_helper_prepare(dev, fb_helper, color_mode, NULL);\ndrivers/gpu/drm/clients/drm_fbdev_client.c-161-\n--\ndrivers/gpu/drm/clients/drm_fbdev_client.c-172-err_drm_client_init:\ndrivers/gpu/drm/clients/drm_fbdev_client.c:173:\tdrm_fb_helper_unprepare(fb_helper);\ndrivers/gpu/drm/clients/drm_fbdev_client.c-174-\tkfree(fb_helper);\n--\ndrivers/gpu/drm/drm_auth.c=430=EXPORT_SYMBOL(drm_master_put);\ndrivers/gpu/drm/drm_auth.c-431-\ndrivers/gpu/drm/drm_auth.c:432:/* Used by drm_client and drm_fb_helper */\ndrivers/gpu/drm/drm_auth.c-433-bool drm_master_internal_acquire(struct drm_device *dev)\n--\ndrivers/gpu/drm/drm_auth.c=443=EXPORT_SYMBOL(drm_master_internal_acquire);\ndrivers/gpu/drm/drm_auth.c-444-\ndrivers/gpu/drm/drm_auth.c:445:/* Used by drm_client and drm_fb_helper */\ndrivers/gpu/drm/drm_auth.c-446-void drm_master_internal_release(struct drm_device *dev)\n--\ndrivers/gpu/drm/drm_fb_helper.c-36-#include \u003cdrm/drm_drv.h\u003e\ndrivers/gpu/drm/drm_fb_helper.c:37:#include \u003cdrm/drm_fb_helper.h\u003e\ndrivers/gpu/drm/drm_fb_helper.c-38-#include \u003cdrm/drm_fourcc.h\u003e\n--\ndrivers/gpu/drm/drm_fb_helper.c=75=MODULE_PARM_DESC(drm_leak_fbdev_smem,\n--\ndrivers/gpu/drm/drm_fb_helper.c-94- * It is possible, though perhaps somewhat tricky, to implement race-free\ndrivers/gpu/drm/drm_fb_helper.c:95: * hotplug detection using the fbdev helpers. The drm_fb_helper_prepare()\ndrivers/gpu/drm/drm_fb_helper.c-96- * helper must be called first to initialize the minimum required to make\n--\ndrivers/gpu/drm/drm_fb_helper.c-101- * encoders and connectors. To finish up the fbdev helper initialization, the\ndrivers/gpu/drm/drm_fb_helper.c:102: * drm_fb_helper_init() function is called. To probe for all attached displays\ndrivers/gpu/drm/drm_fb_helper.c-103- * and set up an initial configuration using the detected hardware, drivers\ndrivers/gpu/drm/drm_fb_helper.c:104: * should call drm_fb_helper_initial_config().\ndrivers/gpu/drm/drm_fb_helper.c-105- *\ndrivers/gpu/drm/drm_fb_helper.c-106- * If \u0026drm_framebuffer_funcs.dirty is set, the\ndrivers/gpu/drm/drm_fb_helper.c:107: * drm_fb_helper_{cfb,sys}_{write,fillrect,copyarea,imageblit} functions will\ndrivers/gpu/drm/drm_fb_helper.c:108: * accumulate changes and schedule \u0026drm_fb_helper.dirty_work to run right\ndrivers/gpu/drm/drm_fb_helper.c-109- * away. This worker then calls the dirty() function ensuring that it will\ndrivers/gpu/drm/drm_fb_helper.c-110- * always run in process context since the fb_*() function could be running in\ndrivers/gpu/drm/drm_fb_helper.c:111: * atomic context. If drm_fb_helper_deferred_io() is used as the deferred_io\ndrivers/gpu/drm/drm_fb_helper.c-112- * callback it will also schedule dirty_work with the damage collected from the\n--\ndrivers/gpu/drm/drm_fb_helper.c=116=static int\ndrivers/gpu/drm/drm_fb_helper.c:117:__drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper,\ndrivers/gpu/drm/drm_fb_helper.c-118-\t\t\t\t\t bool force)\n--\ndrivers/gpu/drm/drm_fb_helper.c-133-\t\t * to be held. But for forced restores we're intentionally\ndrivers/gpu/drm/drm_fb_helper.c:134:\t\t * racing here, see drm_fb_helper_set_par().\ndrivers/gpu/drm/drm_fb_helper.c-135-\t\t */\n--\ndrivers/gpu/drm/drm_fb_helper.c-146-\tif (do_delayed)\ndrivers/gpu/drm/drm_fb_helper.c:147:\t\tdrm_fb_helper_hotplug_event(fb_helper);\ndrivers/gpu/drm/drm_fb_helper.c-148-\n--\ndrivers/gpu/drm/drm_fb_helper.c-155-/**\ndrivers/gpu/drm/drm_fb_helper.c:156: * drm_fb_helper_restore_fbdev_mode_unlocked - restore fbdev configuration\ndrivers/gpu/drm/drm_fb_helper.c-157- * @fb_helper: driver-allocated fbdev helper, can be NULL\n--\ndrivers/gpu/drm/drm_fb_helper.c-166- */\ndrivers/gpu/drm/drm_fb_helper.c:167:int drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper, bool force)\ndrivers/gpu/drm/drm_fb_helper.c-168-{\ndrivers/gpu/drm/drm_fb_helper.c:169:\treturn __drm_fb_helper_restore_fbdev_mode_unlocked(fb_helper, force);\ndrivers/gpu/drm/drm_fb_helper.c-170-}\ndrivers/gpu/drm/drm_fb_helper.c:171:EXPORT_SYMBOL(drm_fb_helper_restore_fbdev_mode_unlocked);\ndrivers/gpu/drm/drm_fb_helper.c-172-\ndrivers/gpu/drm/drm_fb_helper.c:173:static void drm_fb_helper_dpms(struct fb_info *info, int dpms_mode)\ndrivers/gpu/drm/drm_fb_helper.c-174-{\ndrivers/gpu/drm/drm_fb_helper.c:175:\tstruct drm_fb_helper *fb_helper = info-\u003epar;\ndrivers/gpu/drm/drm_fb_helper.c-176-\n--\ndrivers/gpu/drm/drm_fb_helper.c-182-/**\ndrivers/gpu/drm/drm_fb_helper.c:183: * drm_fb_helper_blank - implementation for \u0026fb_ops.fb_blank\ndrivers/gpu/drm/drm_fb_helper.c-184- * @blank: desired blanking state\n--\ndrivers/gpu/drm/drm_fb_helper.c-186- */\ndrivers/gpu/drm/drm_fb_helper.c:187:int drm_fb_helper_blank(int blank, struct fb_info *info)\ndrivers/gpu/drm/drm_fb_helper.c-188-{\n--\ndrivers/gpu/drm/drm_fb_helper.c-194-\tcase FB_BLANK_UNBLANK:\ndrivers/gpu/drm/drm_fb_helper.c:195:\t\tdrm_fb_helper_dpms(info, DRM_MODE_DPMS_ON);\ndrivers/gpu/drm/drm_fb_helper.c-196-\t\tbreak;\n--\ndrivers/gpu/drm/drm_fb_helper.c-198-\tcase FB_BLANK_NORMAL:\ndrivers/gpu/drm/drm_fb_helper.c:199:\t\tdrm_fb_helper_dpms(info, DRM_MODE_DPMS_STANDBY);\ndrivers/gpu/drm/drm_fb_helper.c-200-\t\tbreak;\n--\ndrivers/gpu/drm/drm_fb_helper.c-202-\tcase FB_BLANK_HSYNC_SUSPEND:\ndrivers/gpu/drm/drm_fb_helper.c:203:\t\tdrm_fb_helper_dpms(info, DRM_MODE_DPMS_STANDBY);\ndrivers/gpu/drm/drm_fb_helper.c-204-\t\tbreak;\n--\ndrivers/gpu/drm/drm_fb_helper.c-206-\tcase FB_BLANK_VSYNC_SUSPEND:\ndrivers/gpu/drm/drm_fb_helper.c:207:\t\tdrm_fb_helper_dpms(info, DRM_MODE_DPMS_SUSPEND);\ndrivers/gpu/drm/drm_fb_helper.c-208-\t\tbreak;\n--\ndrivers/gpu/drm/drm_fb_helper.c-210-\tcase FB_BLANK_POWERDOWN:\ndrivers/gpu/drm/drm_fb_helper.c:211:\t\tdrm_fb_helper_dpms(info, DRM_MODE_DPMS_OFF);\ndrivers/gpu/drm/drm_fb_helper.c-212-\t\tbreak;\n--\ndrivers/gpu/drm/drm_fb_helper.c-215-}\ndrivers/gpu/drm/drm_fb_helper.c:216:EXPORT_SYMBOL(drm_fb_helper_blank);\ndrivers/gpu/drm/drm_fb_helper.c-217-\ndrivers/gpu/drm/drm_fb_helper.c:218:static void drm_fb_helper_resume_worker(struct work_struct *work)\ndrivers/gpu/drm/drm_fb_helper.c-219-{\ndrivers/gpu/drm/drm_fb_helper.c:220:\tstruct drm_fb_helper *helper = container_of(work, struct drm_fb_helper,\ndrivers/gpu/drm/drm_fb_helper.c-221-\t\t\t\t\t\t resume_work);\n--\ndrivers/gpu/drm/drm_fb_helper.c-227-\ndrivers/gpu/drm/drm_fb_helper.c:228:static int find_crtc_index_atomic(struct drm_fb_helper *helper)\ndrivers/gpu/drm/drm_fb_helper.c-229-{\n--\ndrivers/gpu/drm/drm_fb_helper.c-278-\ndrivers/gpu/drm/drm_fb_helper.c:279:static int find_crtc_index_legacy(struct drm_fb_helper *helper)\ndrivers/gpu/drm/drm_fb_helper.c-280-{\n--\ndrivers/gpu/drm/drm_fb_helper.c-297-\ndrivers/gpu/drm/drm_fb_helper.c:298:static int drm_fb_helper_find_crtc_index(struct drm_fb_helper *helper)\ndrivers/gpu/drm/drm_fb_helper.c-299-{\n--\ndrivers/gpu/drm/drm_fb_helper.c-314-\ndrivers/gpu/drm/drm_fb_helper.c:315:static void drm_fb_helper_fb_dirty(struct drm_fb_helper *helper)\ndrivers/gpu/drm/drm_fb_helper.c-316-{\n--\ndrivers/gpu/drm/drm_fb_helper.c-324-\tmutex_lock(\u0026helper-\u003elock);\ndrivers/gpu/drm/drm_fb_helper.c:325:\tcrtc_index = drm_fb_helper_find_crtc_index(helper);\ndrivers/gpu/drm/drm_fb_helper.c-326-\tif (crtc_index \u003e= 0)\n--\ndrivers/gpu/drm/drm_fb_helper.c-357-\ndrivers/gpu/drm/drm_fb_helper.c:358:static void drm_fb_helper_damage_work(struct work_struct *work)\ndrivers/gpu/drm/drm_fb_helper.c-359-{\ndrivers/gpu/drm/drm_fb_helper.c:360:\tstruct drm_fb_helper *helper = container_of(work, struct drm_fb_helper, damage_work);\ndrivers/gpu/drm/drm_fb_helper.c-361-\n--\ndrivers/gpu/drm/drm_fb_helper.c-364-\ndrivers/gpu/drm/drm_fb_helper.c:365:\tdrm_fb_helper_fb_dirty(helper);\ndrivers/gpu/drm/drm_fb_helper.c-366-}\n--\ndrivers/gpu/drm/drm_fb_helper.c-368-/**\ndrivers/gpu/drm/drm_fb_helper.c:369: * drm_fb_helper_prepare - setup a drm_fb_helper structure\ndrivers/gpu/drm/drm_fb_helper.c-370- * @dev: DRM device\n--\ndrivers/gpu/drm/drm_fb_helper.c-377- */\ndrivers/gpu/drm/drm_fb_helper.c:378:void drm_fb_helper_prepare(struct drm_device *dev, struct drm_fb_helper *helper,\ndrivers/gpu/drm/drm_fb_helper.c-379-\t\t\t unsigned int preferred_bpp,\ndrivers/gpu/drm/drm_fb_helper.c:380:\t\t\t const struct drm_fb_helper_funcs *funcs)\ndrivers/gpu/drm/drm_fb_helper.c-381-{\n--\ndrivers/gpu/drm/drm_fb_helper.c-396-\tspin_lock_init(\u0026helper-\u003edamage_lock);\ndrivers/gpu/drm/drm_fb_helper.c:397:\tINIT_WORK(\u0026helper-\u003eresume_work, drm_fb_helper_resume_worker);\ndrivers/gpu/drm/drm_fb_helper.c:398:\tINIT_WORK(\u0026helper-\u003edamage_work, drm_fb_helper_damage_work);\ndrivers/gpu/drm/drm_fb_helper.c-399-\thelper-\u003edamage_clip.x1 = helper-\u003edamage_clip.y1 = ~0;\n--\ndrivers/gpu/drm/drm_fb_helper.c-404-}\ndrivers/gpu/drm/drm_fb_helper.c:405:EXPORT_SYMBOL(drm_fb_helper_prepare);\ndrivers/gpu/drm/drm_fb_helper.c-406-\ndrivers/gpu/drm/drm_fb_helper.c-407-/**\ndrivers/gpu/drm/drm_fb_helper.c:408: * drm_fb_helper_unprepare - clean up a drm_fb_helper structure\ndrivers/gpu/drm/drm_fb_helper.c-409- * @fb_helper: driver-allocated fbdev helper structure to set up\ndrivers/gpu/drm/drm_fb_helper.c-410- *\ndrivers/gpu/drm/drm_fb_helper.c:411: * Cleans up the framebuffer helper. Inverse of drm_fb_helper_prepare().\ndrivers/gpu/drm/drm_fb_helper.c-412- */\ndrivers/gpu/drm/drm_fb_helper.c:413:void drm_fb_helper_unprepare(struct drm_fb_helper *fb_helper)\ndrivers/gpu/drm/drm_fb_helper.c-414-{\n--\ndrivers/gpu/drm/drm_fb_helper.c-416-}\ndrivers/gpu/drm/drm_fb_helper.c:417:EXPORT_SYMBOL(drm_fb_helper_unprepare);\ndrivers/gpu/drm/drm_fb_helper.c-418-\ndrivers/gpu/drm/drm_fb_helper.c-419-/**\ndrivers/gpu/drm/drm_fb_helper.c:420: * drm_fb_helper_init - initialize a \u0026struct drm_fb_helper\ndrivers/gpu/drm/drm_fb_helper.c-421- * @dev: drm device\n--\ndrivers/gpu/drm/drm_fb_helper.c-425- * Note that this won't yet touch the hardware (through the driver interfaces)\ndrivers/gpu/drm/drm_fb_helper.c:426: * nor register the fbdev. This is only done in drm_fb_helper_initial_config()\ndrivers/gpu/drm/drm_fb_helper.c-427- * to allow driver writes more control over the exact init sequence.\ndrivers/gpu/drm/drm_fb_helper.c-428- *\ndrivers/gpu/drm/drm_fb_helper.c:429: * Drivers must call drm_fb_helper_prepare() before calling this function.\ndrivers/gpu/drm/drm_fb_helper.c-430- *\n--\ndrivers/gpu/drm/drm_fb_helper.c-433- */\ndrivers/gpu/drm/drm_fb_helper.c:434:int drm_fb_helper_init(struct drm_device *dev,\ndrivers/gpu/drm/drm_fb_helper.c:435:\t\t struct drm_fb_helper *fb_helper)\ndrivers/gpu/drm/drm_fb_helper.c-436-{\n--\ndrivers/gpu/drm/drm_fb_helper.c-440-}\ndrivers/gpu/drm/drm_fb_helper.c:441:EXPORT_SYMBOL(drm_fb_helper_init);\ndrivers/gpu/drm/drm_fb_helper.c-442-\ndrivers/gpu/drm/drm_fb_helper.c:443:static struct fb_info *drm_fb_helper_alloc_info(struct drm_fb_helper *fb_helper)\ndrivers/gpu/drm/drm_fb_helper.c-444-{\n--\ndrivers/gpu/drm/drm_fb_helper.c-470-\ndrivers/gpu/drm/drm_fb_helper.c:471:static void drm_fb_helper_release_info(struct drm_fb_helper *fb_helper)\ndrivers/gpu/drm/drm_fb_helper.c-472-{\n--\ndrivers/gpu/drm/drm_fb_helper.c-485-/**\ndrivers/gpu/drm/drm_fb_helper.c:486: * drm_fb_helper_unregister_info - unregister fb_info framebuffer device\ndrivers/gpu/drm/drm_fb_helper.c-487- * @fb_helper: driver-allocated fbdev helper, must not be NULL\n--\ndrivers/gpu/drm/drm_fb_helper.c-490- * framebuffer device. This must be called before releasing all resources for\ndrivers/gpu/drm/drm_fb_helper.c:491: * @fb_helper by calling drm_fb_helper_fini().\ndrivers/gpu/drm/drm_fb_helper.c-492- */\ndrivers/gpu/drm/drm_fb_helper.c:493:void drm_fb_helper_unregister_info(struct drm_fb_helper *fb_helper)\ndrivers/gpu/drm/drm_fb_helper.c-494-{\n--\ndrivers/gpu/drm/drm_fb_helper.c-496-}\ndrivers/gpu/drm/drm_fb_helper.c:497:EXPORT_SYMBOL(drm_fb_helper_unregister_info);\ndrivers/gpu/drm/drm_fb_helper.c-498-\ndrivers/gpu/drm/drm_fb_helper.c-499-/**\ndrivers/gpu/drm/drm_fb_helper.c:500: * drm_fb_helper_fini - finialize a \u0026struct drm_fb_helper\ndrivers/gpu/drm/drm_fb_helper.c-501- * @fb_helper: driver-allocated fbdev helper, can be NULL\n--\ndrivers/gpu/drm/drm_fb_helper.c-504- */\ndrivers/gpu/drm/drm_fb_helper.c:505:void drm_fb_helper_fini(struct drm_fb_helper *fb_helper)\ndrivers/gpu/drm/drm_fb_helper.c-506-{\n--\ndrivers/gpu/drm/drm_fb_helper.c-517-\ndrivers/gpu/drm/drm_fb_helper.c:518:\tdrm_fb_helper_release_info(fb_helper);\ndrivers/gpu/drm/drm_fb_helper.c-519-}\ndrivers/gpu/drm/drm_fb_helper.c:520:EXPORT_SYMBOL(drm_fb_helper_fini);\ndrivers/gpu/drm/drm_fb_helper.c-521-\ndrivers/gpu/drm/drm_fb_helper.c:522:static void drm_fb_helper_add_damage_clip(struct drm_fb_helper *helper, u32 x, u32 y,\ndrivers/gpu/drm/drm_fb_helper.c-523-\t\t\t\t\t u32 width, u32 height)\n--\ndrivers/gpu/drm/drm_fb_helper.c-535-\ndrivers/gpu/drm/drm_fb_helper.c:536:static void drm_fb_helper_damage(struct drm_fb_helper *helper, u32 x, u32 y,\ndrivers/gpu/drm/drm_fb_helper.c-537-\t\t\t\t u32 width, u32 height)\n--\ndrivers/gpu/drm/drm_fb_helper.c-549-\ndrivers/gpu/drm/drm_fb_helper.c:550:\tdrm_fb_helper_add_damage_clip(helper, x, y, width, height);\ndrivers/gpu/drm/drm_fb_helper.c-551-\n--\ndrivers/gpu/drm/drm_fb_helper.c-559- */\ndrivers/gpu/drm/drm_fb_helper.c:560:static void drm_fb_helper_memory_range_to_clip(struct fb_info *info, off_t off, size_t len,\ndrivers/gpu/drm/drm_fb_helper.c-561-\t\t\t\t\t struct drm_rect *clip)\n--\ndrivers/gpu/drm/drm_fb_helper.c-592-/* Don't use in new code. */\ndrivers/gpu/drm/drm_fb_helper.c:593:void drm_fb_helper_damage_range(struct fb_info *info, off_t off, size_t len)\ndrivers/gpu/drm/drm_fb_helper.c-594-{\ndrivers/gpu/drm/drm_fb_helper.c:595:\tstruct drm_fb_helper *fb_helper = info-\u003epar;\ndrivers/gpu/drm/drm_fb_helper.c-596-\tstruct drm_rect damage_area;\ndrivers/gpu/drm/drm_fb_helper.c-597-\ndrivers/gpu/drm/drm_fb_helper.c:598:\tdrm_fb_helper_memory_range_to_clip(info, off, len, \u0026damage_area);\ndrivers/gpu/drm/drm_fb_helper.c:599:\tdrm_fb_helper_damage(fb_helper, damage_area.x1, damage_area.y1,\ndrivers/gpu/drm/drm_fb_helper.c-600-\t\t\t drm_rect_width(\u0026damage_area),\n--\ndrivers/gpu/drm/drm_fb_helper.c-602-}\ndrivers/gpu/drm/drm_fb_helper.c:603:EXPORT_SYMBOL(drm_fb_helper_damage_range);\ndrivers/gpu/drm/drm_fb_helper.c-604-\ndrivers/gpu/drm/drm_fb_helper.c-605-/* Don't use in new code. */\ndrivers/gpu/drm/drm_fb_helper.c:606:void drm_fb_helper_damage_area(struct fb_info *info, u32 x, u32 y, u32 width, u32 height)\ndrivers/gpu/drm/drm_fb_helper.c-607-{\ndrivers/gpu/drm/drm_fb_helper.c:608:\tstruct drm_fb_helper *fb_helper = info-\u003epar;\ndrivers/gpu/drm/drm_fb_helper.c-609-\ndrivers/gpu/drm/drm_fb_helper.c:610:\tdrm_fb_helper_damage(fb_helper, x, y, width, height);\ndrivers/gpu/drm/drm_fb_helper.c-611-}\ndrivers/gpu/drm/drm_fb_helper.c:612:EXPORT_SYMBOL(drm_fb_helper_damage_area);\ndrivers/gpu/drm/drm_fb_helper.c-613-\n--\ndrivers/gpu/drm/drm_fb_helper.c-615-/**\ndrivers/gpu/drm/drm_fb_helper.c:616: * drm_fb_helper_deferred_io() - fbdev deferred_io callback function\ndrivers/gpu/drm/drm_fb_helper.c-617- * @info: fb_info struct pointer\n--\ndrivers/gpu/drm/drm_fb_helper.c-622- */\ndrivers/gpu/drm/drm_fb_helper.c:623:void drm_fb_helper_deferred_io(struct fb_info *info, struct list_head *pagereflist)\ndrivers/gpu/drm/drm_fb_helper.c-624-{\ndrivers/gpu/drm/drm_fb_helper.c:625:\tstruct drm_fb_helper *helper = info-\u003epar;\ndrivers/gpu/drm/drm_fb_helper.c-626-\tunsigned long start, end, min_off, max_off, total_size;\n--\ndrivers/gpu/drm/drm_fb_helper.c-650-\tif (min_off \u003c max_off) {\ndrivers/gpu/drm/drm_fb_helper.c:651:\t\tdrm_fb_helper_memory_range_to_clip(info, min_off, max_off - min_off, \u0026damage_area);\ndrivers/gpu/drm/drm_fb_helper.c:652:\t\tdrm_fb_helper_damage(helper, damage_area.x1, damage_area.y1,\ndrivers/gpu/drm/drm_fb_helper.c-653-\t\t\t\t drm_rect_width(\u0026damage_area),\n--\ndrivers/gpu/drm/drm_fb_helper.c-656-}\ndrivers/gpu/drm/drm_fb_helper.c:657:EXPORT_SYMBOL(drm_fb_helper_deferred_io);\ndrivers/gpu/drm/drm_fb_helper.c-658-#endif\n--\ndrivers/gpu/drm/drm_fb_helper.c-660-/**\ndrivers/gpu/drm/drm_fb_helper.c:661: * drm_fb_helper_set_suspend - wrapper around fb_set_suspend\ndrivers/gpu/drm/drm_fb_helper.c-662- * @fb_helper: driver-allocated fbdev helper, can be NULL\n--\ndrivers/gpu/drm/drm_fb_helper.c-665- * A wrapper around fb_set_suspend implemented by fbdev core.\ndrivers/gpu/drm/drm_fb_helper.c:666: * Use drm_fb_helper_set_suspend_unlocked() if you don't need to take\ndrivers/gpu/drm/drm_fb_helper.c-667- * the lock yourself\ndrivers/gpu/drm/drm_fb_helper.c-668- */\ndrivers/gpu/drm/drm_fb_helper.c:669:void drm_fb_helper_set_suspend(struct drm_fb_helper *fb_helper, bool suspend)\ndrivers/gpu/drm/drm_fb_helper.c-670-{\n--\ndrivers/gpu/drm/drm_fb_helper.c-678-}\ndrivers/gpu/drm/drm_fb_helper.c:679:EXPORT_SYMBOL(drm_fb_helper_set_suspend);\ndrivers/gpu/drm/drm_fb_helper.c-680-\ndrivers/gpu/drm/drm_fb_helper.c-681-/**\ndrivers/gpu/drm/drm_fb_helper.c:682: * drm_fb_helper_set_suspend_unlocked - wrapper around fb_set_suspend that also\ndrivers/gpu/drm/drm_fb_helper.c-683- * takes the console lock\n--\ndrivers/gpu/drm/drm_fb_helper.c-694- *\ndrivers/gpu/drm/drm_fb_helper.c:695: * Use drm_fb_helper_set_suspend() if you need to take the lock yourself.\ndrivers/gpu/drm/drm_fb_helper.c-696- */\ndrivers/gpu/drm/drm_fb_helper.c:697:void drm_fb_helper_set_suspend_unlocked(struct drm_fb_helper *fb_helper,\ndrivers/gpu/drm/drm_fb_helper.c-698-\t\t\t\t\tbool suspend)\n--\ndrivers/gpu/drm/drm_fb_helper.c-711-\t\t * Cancel pending damage work. During GPU reset, VBlank\ndrivers/gpu/drm/drm_fb_helper.c:712:\t\t * interrupts are disabled and drm_fb_helper_fb_dirty()\ndrivers/gpu/drm/drm_fb_helper.c-713-\t\t * would wait for VBlank timeout otherwise.\n--\ndrivers/gpu/drm/drm_fb_helper.c-728-\ndrivers/gpu/drm/drm_fb_helper.c:729:\tdrm_fb_helper_set_suspend(fb_helper, suspend);\ndrivers/gpu/drm/drm_fb_helper.c-730-\tconsole_unlock();\ndrivers/gpu/drm/drm_fb_helper.c-731-}\ndrivers/gpu/drm/drm_fb_helper.c:732:EXPORT_SYMBOL(drm_fb_helper_set_suspend_unlocked);\ndrivers/gpu/drm/drm_fb_helper.c-733-\n--\ndrivers/gpu/drm/drm_fb_helper.c=766=static int setcmap_legacy(struct fb_cmap *cmap, struct fb_info *info)\ndrivers/gpu/drm/drm_fb_helper.c-767-{\ndrivers/gpu/drm/drm_fb_helper.c:768:\tstruct drm_fb_helper *fb_helper = info-\u003epar;\ndrivers/gpu/drm/drm_fb_helper.c-769-\tstruct drm_mode_set *modeset;\n--\ndrivers/gpu/drm/drm_fb_helper.c=849=static int setcmap_atomic(struct fb_cmap *cmap, struct fb_info *info)\ndrivers/gpu/drm/drm_fb_helper.c-850-{\ndrivers/gpu/drm/drm_fb_helper.c:851:\tstruct drm_fb_helper *fb_helper = info-\u003epar;\ndrivers/gpu/drm/drm_fb_helper.c-852-\tstruct drm_device *dev = fb_helper-\u003edev;\n--\ndrivers/gpu/drm/drm_fb_helper.c-937-/**\ndrivers/gpu/drm/drm_fb_helper.c:938: * drm_fb_helper_setcmap - implementation for \u0026fb_ops.fb_setcmap\ndrivers/gpu/drm/drm_fb_helper.c-939- * @cmap: cmap to set\n--\ndrivers/gpu/drm/drm_fb_helper.c-941- */\ndrivers/gpu/drm/drm_fb_helper.c:942:int drm_fb_helper_setcmap(struct fb_cmap *cmap, struct fb_info *info)\ndrivers/gpu/drm/drm_fb_helper.c-943-{\ndrivers/gpu/drm/drm_fb_helper.c:944:\tstruct drm_fb_helper *fb_helper = info-\u003epar;\ndrivers/gpu/drm/drm_fb_helper.c-945-\tstruct drm_device *dev = fb_helper-\u003edev;\n--\ndrivers/gpu/drm/drm_fb_helper.c-972-}\ndrivers/gpu/drm/drm_fb_helper.c:973:EXPORT_SYMBOL(drm_fb_helper_setcmap);\ndrivers/gpu/drm/drm_fb_helper.c-974-\ndrivers/gpu/drm/drm_fb_helper.c-975-/**\ndrivers/gpu/drm/drm_fb_helper.c:976: * drm_fb_helper_ioctl - legacy ioctl implementation\ndrivers/gpu/drm/drm_fb_helper.c-977- * @info: fbdev registered by the helper\n--\ndrivers/gpu/drm/drm_fb_helper.c-983- */\ndrivers/gpu/drm/drm_fb_helper.c:984:int drm_fb_helper_ioctl(struct fb_info *info, unsigned int cmd,\ndrivers/gpu/drm/drm_fb_helper.c-985-\t\t\tunsigned long arg)\ndrivers/gpu/drm/drm_fb_helper.c-986-{\ndrivers/gpu/drm/drm_fb_helper.c:987:\tstruct drm_fb_helper *fb_helper = info-\u003epar;\ndrivers/gpu/drm/drm_fb_helper.c-988-\tint ret = 0;\n--\ndrivers/gpu/drm/drm_fb_helper.c-1017-}\ndrivers/gpu/drm/drm_fb_helper.c:1018:EXPORT_SYMBOL(drm_fb_helper_ioctl);\ndrivers/gpu/drm/drm_fb_helper.c-1019-\ndrivers/gpu/drm/drm_fb_helper.c=1020=static bool drm_fb_pixel_format_equal(const struct fb_var_screeninfo *var_1,\n--\ndrivers/gpu/drm/drm_fb_helper.c-1038-\ndrivers/gpu/drm/drm_fb_helper.c:1039:static void drm_fb_helper_fill_pixel_fmt(struct fb_var_screeninfo *var,\ndrivers/gpu/drm/drm_fb_helper.c-1040-\t\t\t\t\t const struct drm_format_info *format)\n--\ndrivers/gpu/drm/drm_fb_helper.c=1101=static void __fill_var(struct fb_var_screeninfo *var, struct fb_info *info,\n--\ndrivers/gpu/drm/drm_fb_helper.c-1124-/**\ndrivers/gpu/drm/drm_fb_helper.c:1125: * drm_fb_helper_check_var - implementation for \u0026fb_ops.fb_check_var\ndrivers/gpu/drm/drm_fb_helper.c-1126- * @var: screeninfo to check\n--\ndrivers/gpu/drm/drm_fb_helper.c-1128- */\ndrivers/gpu/drm/drm_fb_helper.c:1129:int drm_fb_helper_check_var(struct fb_var_screeninfo *var,\ndrivers/gpu/drm/drm_fb_helper.c-1130-\t\t\t struct fb_info *info)\ndrivers/gpu/drm/drm_fb_helper.c-1131-{\ndrivers/gpu/drm/drm_fb_helper.c:1132:\tstruct drm_fb_helper *fb_helper = info-\u003epar;\ndrivers/gpu/drm/drm_fb_helper.c-1133-\tstruct drm_framebuffer *fb = fb_helper-\u003efb;\n--\ndrivers/gpu/drm/drm_fb_helper.c-1203-\t !var-\u003eblue.msb_right \u0026\u0026 !var-\u003etransp.msb_right) {\n\n"
} |
| 9/2 | 2026/08/11 01:12 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 18070 output: 20 thoughts: 97 Thoughts: **Analyzing the DRM Configuration** Okay, so `CONFIG_DRM_FBDEV_EMULATION` is definitely the key configuration item that brings in `drm_fb_helper.c`. That's the starting point. But, hold on a second... the patch also touches `drm_client_modeset.c` and `drm_vblank.c`. Hmm, that's interesting. I know `drm_client_modeset.c` is compiled conditionally under `CONFIG_DRM`, so it is likely that configuration is needed. Let me double-check the `drivers/gpu/drm/Makefile` to confirm that `drm_client_modeset.o` is actually built as part of the DRM core build process. Gotta confirm where this code is being included. |
| 10/2 | 2026/08/11 01:12 | tool | grepper |
0mArgs:{
"Expression": "drm_client_modeset"
}Results: {
"Output": "Documentation/gpu/drm-client.rst=2=Kernel clients\n--\nDocumentation/gpu/drm-client.rst-13-\nDocumentation/gpu/drm-client.rst:14:.. kernel-doc:: drivers/gpu/drm/drm_client_modeset.c\nDocumentation/gpu/drm-client.rst-15- :export:\n--\ndrivers/gpu/drm/Makefile=76=drm-$(CONFIG_DRM_CLIENT) += \\\n--\ndrivers/gpu/drm/Makefile-78-\tdrm_client_event.o \\\ndrivers/gpu/drm/Makefile:79:\tdrm_client_modeset.o \\\ndrivers/gpu/drm/Makefile-80-\tdrm_client_sysrq.o\n--\ndrivers/gpu/drm/clients/drm_log.c=235=static void drm_log_init_client(struct drm_log *dlog)\n--\ndrivers/gpu/drm/clients/drm_log.c-243-\ndrivers/gpu/drm/clients/drm_log.c:244:\tif (drm_client_modeset_probe(client, 0, 0))\ndrivers/gpu/drm/clients/drm_log.c-245-\t\treturn;\n--\ndrivers/gpu/drm/clients/drm_log.c-266-\ndrivers/gpu/drm/clients/drm_log.c:267:\tif (drm_client_modeset_commit(client))\ndrivers/gpu/drm/clients/drm_log.c-268-\t\tgoto err_failed_commit;\n--\ndrivers/gpu/drm/clients/drm_log.c=318=static int drm_log_client_restore(struct drm_client_dev *client, bool force)\n--\ndrivers/gpu/drm/clients/drm_log.c-322-\tif (force)\ndrivers/gpu/drm/clients/drm_log.c:323:\t\tret = drm_client_modeset_commit_locked(client);\ndrivers/gpu/drm/clients/drm_log.c-324-\telse\ndrivers/gpu/drm/clients/drm_log.c:325:\t\tret = drm_client_modeset_commit(client);\ndrivers/gpu/drm/clients/drm_log.c-326-\n--\ndrivers/gpu/drm/drm_client.c=80=int drm_client_init(struct drm_device *dev, struct drm_client_dev *client,\n--\ndrivers/gpu/drm/drm_client.c-91-\ndrivers/gpu/drm/drm_client.c:92:\tret = drm_client_modeset_create(client);\ndrivers/gpu/drm/drm_client.c-93-\tif (ret)\n--\ndrivers/gpu/drm/drm_client.c-104-err_free:\ndrivers/gpu/drm/drm_client.c:105:\tdrm_client_modeset_free(client);\ndrivers/gpu/drm/drm_client.c-106-\treturn ret;\n--\ndrivers/gpu/drm/drm_client.c=165=void drm_client_release(struct drm_client_dev *client)\n--\ndrivers/gpu/drm/drm_client.c-170-\ndrivers/gpu/drm/drm_client.c:171:\tdrm_client_modeset_free(client);\ndrivers/gpu/drm/drm_client.c-172-\tdrm_client_close(client);\n--\ndrivers/gpu/drm/drm_client_modeset.c=33=struct drm_client_offset {\n--\ndrivers/gpu/drm/drm_client_modeset.c-36-\ndrivers/gpu/drm/drm_client_modeset.c:37:int drm_client_modeset_create(struct drm_client_dev *client)\ndrivers/gpu/drm/drm_client_modeset.c-38-{\n--\ndrivers/gpu/drm/drm_client_modeset.c-69-err_free:\ndrivers/gpu/drm/drm_client_modeset.c:70:\tdrm_client_modeset_free(client);\ndrivers/gpu/drm/drm_client_modeset.c-71-\n--\ndrivers/gpu/drm/drm_client_modeset.c-74-\ndrivers/gpu/drm/drm_client_modeset.c:75:static void drm_client_modeset_release(struct drm_client_dev *client)\ndrivers/gpu/drm/drm_client_modeset.c-76-{\n--\ndrivers/gpu/drm/drm_client_modeset.c-93-\ndrivers/gpu/drm/drm_client_modeset.c:94:void drm_client_modeset_free(struct drm_client_dev *client)\ndrivers/gpu/drm/drm_client_modeset.c-95-{\n--\ndrivers/gpu/drm/drm_client_modeset.c-99-\ndrivers/gpu/drm/drm_client_modeset.c:100:\tdrm_client_modeset_release(client);\ndrivers/gpu/drm/drm_client_modeset.c-101-\n--\ndrivers/gpu/drm/drm_client_modeset.c=619=static bool drm_client_firmware_config(struct drm_client_dev *client,\n--\ndrivers/gpu/drm/drm_client_modeset.c-805-/**\ndrivers/gpu/drm/drm_client_modeset.c:806: * drm_client_modeset_probe() - Probe for displays\ndrivers/gpu/drm/drm_client_modeset.c-807- * @client: DRM client\n--\ndrivers/gpu/drm/drm_client_modeset.c-816- */\ndrivers/gpu/drm/drm_client_modeset.c:817:int drm_client_modeset_probe(struct drm_client_dev *client, unsigned int width, unsigned int height)\ndrivers/gpu/drm/drm_client_modeset.c-818-{\n--\ndrivers/gpu/drm/drm_client_modeset.c-894-\ndrivers/gpu/drm/drm_client_modeset.c:895:\tdrm_client_modeset_release(client);\ndrivers/gpu/drm/drm_client_modeset.c-896-\n--\ndrivers/gpu/drm/drm_client_modeset.c-944-}\ndrivers/gpu/drm/drm_client_modeset.c:945:EXPORT_SYMBOL(drm_client_modeset_probe);\ndrivers/gpu/drm/drm_client_modeset.c-946-\n--\ndrivers/gpu/drm/drm_client_modeset.c=1032=EXPORT_SYMBOL(drm_client_rotation);\ndrivers/gpu/drm/drm_client_modeset.c-1033-\ndrivers/gpu/drm/drm_client_modeset.c:1034:static int drm_client_modeset_commit_atomic(struct drm_client_dev *client, bool active, bool check)\ndrivers/gpu/drm/drm_client_modeset.c-1035-{\n--\ndrivers/gpu/drm/drm_client_modeset.c-1123-\ndrivers/gpu/drm/drm_client_modeset.c:1124:static int drm_client_modeset_commit_legacy(struct drm_client_dev *client)\ndrivers/gpu/drm/drm_client_modeset.c-1125-{\n--\ndrivers/gpu/drm/drm_client_modeset.c-1165-/**\ndrivers/gpu/drm/drm_client_modeset.c:1166: * drm_client_modeset_check() - Check modeset configuration\ndrivers/gpu/drm/drm_client_modeset.c-1167- * @client: DRM client\n--\ndrivers/gpu/drm/drm_client_modeset.c-1173- */\ndrivers/gpu/drm/drm_client_modeset.c:1174:int drm_client_modeset_check(struct drm_client_dev *client)\ndrivers/gpu/drm/drm_client_modeset.c-1175-{\n--\ndrivers/gpu/drm/drm_client_modeset.c-1181-\tmutex_lock(\u0026client-\u003emodeset_mutex);\ndrivers/gpu/drm/drm_client_modeset.c:1182:\tret = drm_client_modeset_commit_atomic(client, true, true);\ndrivers/gpu/drm/drm_client_modeset.c-1183-\tmutex_unlock(\u0026client-\u003emodeset_mutex);\n--\ndrivers/gpu/drm/drm_client_modeset.c-1186-}\ndrivers/gpu/drm/drm_client_modeset.c:1187:EXPORT_SYMBOL(drm_client_modeset_check);\ndrivers/gpu/drm/drm_client_modeset.c-1188-\ndrivers/gpu/drm/drm_client_modeset.c-1189-/**\ndrivers/gpu/drm/drm_client_modeset.c:1190: * drm_client_modeset_commit_locked() - Force commit CRTC configuration\ndrivers/gpu/drm/drm_client_modeset.c-1191- * @client: DRM client\n--\ndrivers/gpu/drm/drm_client_modeset.c-1199- */\ndrivers/gpu/drm/drm_client_modeset.c:1200:int drm_client_modeset_commit_locked(struct drm_client_dev *client)\ndrivers/gpu/drm/drm_client_modeset.c-1201-{\n--\ndrivers/gpu/drm/drm_client_modeset.c-1206-\tif (drm_drv_uses_atomic_modeset(dev))\ndrivers/gpu/drm/drm_client_modeset.c:1207:\t\tret = drm_client_modeset_commit_atomic(client, true, false);\ndrivers/gpu/drm/drm_client_modeset.c-1208-\telse\ndrivers/gpu/drm/drm_client_modeset.c:1209:\t\tret = drm_client_modeset_commit_legacy(client);\ndrivers/gpu/drm/drm_client_modeset.c-1210-\tmutex_unlock(\u0026client-\u003emodeset_mutex);\n--\ndrivers/gpu/drm/drm_client_modeset.c-1213-}\ndrivers/gpu/drm/drm_client_modeset.c:1214:EXPORT_SYMBOL(drm_client_modeset_commit_locked);\ndrivers/gpu/drm/drm_client_modeset.c-1215-\ndrivers/gpu/drm/drm_client_modeset.c-1216-/**\ndrivers/gpu/drm/drm_client_modeset.c:1217: * drm_client_modeset_commit() - Commit CRTC configuration\ndrivers/gpu/drm/drm_client_modeset.c-1218- * @client: DRM client\n--\ndrivers/gpu/drm/drm_client_modeset.c-1224- */\ndrivers/gpu/drm/drm_client_modeset.c:1225:int drm_client_modeset_commit(struct drm_client_dev *client)\ndrivers/gpu/drm/drm_client_modeset.c-1226-{\n--\ndrivers/gpu/drm/drm_client_modeset.c-1232-\ndrivers/gpu/drm/drm_client_modeset.c:1233:\tret = drm_client_modeset_commit_locked(client);\ndrivers/gpu/drm/drm_client_modeset.c-1234-\n--\ndrivers/gpu/drm/drm_client_modeset.c-1238-}\ndrivers/gpu/drm/drm_client_modeset.c:1239:EXPORT_SYMBOL(drm_client_modeset_commit);\ndrivers/gpu/drm/drm_client_modeset.c-1240-\ndrivers/gpu/drm/drm_client_modeset.c:1241:static void drm_client_modeset_dpms_legacy(struct drm_client_dev *client, int dpms_mode)\ndrivers/gpu/drm/drm_client_modeset.c-1242-{\n--\ndrivers/gpu/drm/drm_client_modeset.c-1266-/**\ndrivers/gpu/drm/drm_client_modeset.c:1267: * drm_client_modeset_dpms() - Set DPMS mode\ndrivers/gpu/drm/drm_client_modeset.c-1268- * @client: DRM client\n--\ndrivers/gpu/drm/drm_client_modeset.c-1275- */\ndrivers/gpu/drm/drm_client_modeset.c:1276:int drm_client_modeset_dpms(struct drm_client_dev *client, int mode)\ndrivers/gpu/drm/drm_client_modeset.c-1277-{\n--\ndrivers/gpu/drm/drm_client_modeset.c-1285-\tif (drm_drv_uses_atomic_modeset(dev))\ndrivers/gpu/drm/drm_client_modeset.c:1286:\t\tret = drm_client_modeset_commit_atomic(client, mode == DRM_MODE_DPMS_ON, false);\ndrivers/gpu/drm/drm_client_modeset.c-1287-\telse\ndrivers/gpu/drm/drm_client_modeset.c:1288:\t\tdrm_client_modeset_dpms_legacy(client, mode);\ndrivers/gpu/drm/drm_client_modeset.c-1289-\tmutex_unlock(\u0026client-\u003emodeset_mutex);\n--\ndrivers/gpu/drm/drm_client_modeset.c-1294-}\ndrivers/gpu/drm/drm_client_modeset.c:1295:EXPORT_SYMBOL(drm_client_modeset_dpms);\ndrivers/gpu/drm/drm_client_modeset.c-1296-\ndrivers/gpu/drm/drm_client_modeset.c-1297-/**\ndrivers/gpu/drm/drm_client_modeset.c:1298: * drm_client_modeset_wait_for_vblank() - Wait for the next VBLANK to occur\ndrivers/gpu/drm/drm_client_modeset.c-1299- * @client: DRM client\n--\ndrivers/gpu/drm/drm_client_modeset.c-1308- */\ndrivers/gpu/drm/drm_client_modeset.c:1309:int drm_client_modeset_wait_for_vblank(struct drm_client_dev *client, unsigned int crtc_index)\ndrivers/gpu/drm/drm_client_modeset.c-1310-{\n--\ndrivers/gpu/drm/drm_client_modeset.c-1338-}\ndrivers/gpu/drm/drm_client_modeset.c:1339:EXPORT_SYMBOL(drm_client_modeset_wait_for_vblank);\ndrivers/gpu/drm/drm_client_modeset.c-1340-\ndrivers/gpu/drm/drm_client_modeset.c-1341-#ifdef CONFIG_DRM_KUNIT_TEST\ndrivers/gpu/drm/drm_client_modeset.c:1342:#include \"tests/drm_client_modeset_test.c\"\ndrivers/gpu/drm/drm_client_modeset.c-1343-#endif\n--\ndrivers/gpu/drm/drm_fb_helper.c=117=__drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper,\n--\ndrivers/gpu/drm/drm_fb_helper.c-135-\t\t */\ndrivers/gpu/drm/drm_fb_helper.c:136:\t\tret = drm_client_modeset_commit_locked(\u0026fb_helper-\u003eclient);\ndrivers/gpu/drm/drm_fb_helper.c-137-\t} else {\ndrivers/gpu/drm/drm_fb_helper.c:138:\t\tret = drm_client_modeset_commit(\u0026fb_helper-\u003eclient);\ndrivers/gpu/drm/drm_fb_helper.c-139-\t}\n--\ndrivers/gpu/drm/drm_fb_helper.c=173=static void drm_fb_helper_dpms(struct fb_info *info, int dpms_mode)\n--\ndrivers/gpu/drm/drm_fb_helper.c-177-\tmutex_lock(\u0026fb_helper-\u003elock);\ndrivers/gpu/drm/drm_fb_helper.c:178:\tdrm_client_modeset_dpms(\u0026fb_helper-\u003eclient, dpms_mode);\ndrivers/gpu/drm/drm_fb_helper.c-179-\tmutex_unlock(\u0026fb_helper-\u003elock);\n--\ndrivers/gpu/drm/drm_fb_helper.c=315=static void drm_fb_helper_fb_dirty(struct drm_fb_helper *helper)\n--\ndrivers/gpu/drm/drm_fb_helper.c-326-\tif (crtc_index \u003e= 0)\ndrivers/gpu/drm/drm_fb_helper.c:327:\t\tdrm_client_modeset_wait_for_vblank(\u0026helper-\u003eclient, crtc_index);\ndrivers/gpu/drm/drm_fb_helper.c-328-\tmutex_unlock(\u0026helper-\u003elock);\n--\ndrivers/gpu/drm/drm_fb_helper.c=984=int drm_fb_helper_ioctl(struct fb_info *info, unsigned int cmd,\n--\ndrivers/gpu/drm/drm_fb_helper.c-1009-\t\t */\ndrivers/gpu/drm/drm_fb_helper.c:1010:\t\tret = drm_client_modeset_wait_for_vblank(\u0026fb_helper-\u003eclient, 0);\ndrivers/gpu/drm/drm_fb_helper.c-1011-\t\tbreak;\n--\ndrivers/gpu/drm/drm_fb_helper.c=1273=static int pan_display_atomic(struct fb_var_screeninfo *var,\n--\ndrivers/gpu/drm/drm_fb_helper.c-1282-\ndrivers/gpu/drm/drm_fb_helper.c:1283:\tret = drm_client_modeset_commit_locked(\u0026fb_helper-\u003eclient);\ndrivers/gpu/drm/drm_fb_helper.c-1284-\tif (!ret) {\n--\ndrivers/gpu/drm/drm_fb_helper.c=1525=static int drm_fb_helper_single_fb_probe(struct drm_fb_helper *fb_helper)\n--\ndrivers/gpu/drm/drm_fb_helper.c-1538-\t\tif (!fb_helper-\u003edeferred_setup)\ndrivers/gpu/drm/drm_fb_helper.c:1539:\t\t\tdrm_client_modeset_commit(client);\ndrivers/gpu/drm/drm_fb_helper.c-1540-\t\treturn ret;\n--\ndrivers/gpu/drm/drm_fb_helper.c=1707=__drm_fb_helper_initial_config_and_unlock(struct drm_fb_helper *fb_helper)\n--\ndrivers/gpu/drm/drm_fb_helper.c-1716-\ndrivers/gpu/drm/drm_fb_helper.c:1717:\tdrm_client_modeset_probe(\u0026fb_helper-\u003eclient, width, height);\ndrivers/gpu/drm/drm_fb_helper.c-1718-\n--\ndrivers/gpu/drm/drm_fb_helper.c=1835=int drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper)\n--\ndrivers/gpu/drm/drm_fb_helper.c-1857-\ndrivers/gpu/drm/drm_fb_helper.c:1858:\tdrm_client_modeset_probe(\u0026fb_helper-\u003eclient, fb_helper-\u003efb-\u003ewidth, fb_helper-\u003efb-\u003eheight);\ndrivers/gpu/drm/drm_fb_helper.c-1859-\tdrm_setup_crtcs_fb(fb_helper);\n--\ndrivers/gpu/drm/tests/drm_client_modeset_test.c-16-\ndrivers/gpu/drm/tests/drm_client_modeset_test.c:17:struct drm_client_modeset_test_priv {\ndrivers/gpu/drm/tests/drm_client_modeset_test.c-18-\tstruct drm_device *drm;\n--\ndrivers/gpu/drm/tests/drm_client_modeset_test.c-22-\ndrivers/gpu/drm/tests/drm_client_modeset_test.c:23:static int drm_client_modeset_connector_get_modes(struct drm_connector *connector)\ndrivers/gpu/drm/tests/drm_client_modeset_test.c-24-{\n--\ndrivers/gpu/drm/tests/drm_client_modeset_test.c-46-\ndrivers/gpu/drm/tests/drm_client_modeset_test.c:47:static const struct drm_connector_helper_funcs drm_client_modeset_connector_helper_funcs = {\ndrivers/gpu/drm/tests/drm_client_modeset_test.c:48:\t.get_modes = drm_client_modeset_connector_get_modes,\ndrivers/gpu/drm/tests/drm_client_modeset_test.c-49-};\ndrivers/gpu/drm/tests/drm_client_modeset_test.c-50-\ndrivers/gpu/drm/tests/drm_client_modeset_test.c:51:static const struct drm_connector_funcs drm_client_modeset_connector_funcs = {\ndrivers/gpu/drm/tests/drm_client_modeset_test.c-52-\t.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,\n--\ndrivers/gpu/drm/tests/drm_client_modeset_test.c-55-\ndrivers/gpu/drm/tests/drm_client_modeset_test.c:56:static int drm_client_modeset_test_init(struct kunit *test)\ndrivers/gpu/drm/tests/drm_client_modeset_test.c-57-{\ndrivers/gpu/drm/tests/drm_client_modeset_test.c:58:\tstruct drm_client_modeset_test_priv *priv;\ndrivers/gpu/drm/tests/drm_client_modeset_test.c-59-\tint ret;\n--\ndrivers/gpu/drm/tests/drm_client_modeset_test.c-74-\tret = drmm_connector_init(priv-\u003edrm, \u0026priv-\u003econnector,\ndrivers/gpu/drm/tests/drm_client_modeset_test.c:75:\t\t\t\t \u0026drm_client_modeset_connector_funcs,\ndrivers/gpu/drm/tests/drm_client_modeset_test.c-76-\t\t\t\t DRM_MODE_CONNECTOR_Unknown,\n--\ndrivers/gpu/drm/tests/drm_client_modeset_test.c-79-\ndrivers/gpu/drm/tests/drm_client_modeset_test.c:80:\tdrm_connector_helper_add(\u0026priv-\u003econnector, \u0026drm_client_modeset_connector_helper_funcs);\ndrivers/gpu/drm/tests/drm_client_modeset_test.c-81-\n--\ndrivers/gpu/drm/tests/drm_client_modeset_test.c=88=static void drm_test_pick_cmdline_res_1920_1080_60(struct kunit *test)\ndrivers/gpu/drm/tests/drm_client_modeset_test.c-89-{\ndrivers/gpu/drm/tests/drm_client_modeset_test.c:90:\tstruct drm_client_modeset_test_priv *priv = test-\u003epriv;\ndrivers/gpu/drm/tests/drm_client_modeset_test.c-91-\tstruct drm_device *drm = priv-\u003edrm;\n--\ndrivers/gpu/drm/tests/drm_client_modeset_test.c=132=static void drm_test_pick_cmdline_named(struct kunit *test)\n--\ndrivers/gpu/drm/tests/drm_client_modeset_test.c-134-\tconst struct drm_connector_pick_cmdline_mode_test *params = test-\u003eparam_value;\ndrivers/gpu/drm/tests/drm_client_modeset_test.c:135:\tstruct drm_client_modeset_test_priv *priv = test-\u003epriv;\ndrivers/gpu/drm/tests/drm_client_modeset_test.c-136-\tstruct drm_device *drm = priv-\u003edrm;\n--\ndrivers/gpu/drm/tests/drm_client_modeset_test.c=192=static struct kunit_suite drm_test_pick_cmdline_test_suite = {\ndrivers/gpu/drm/tests/drm_client_modeset_test.c-193-\t.name = \"drm_test_pick_cmdline\",\ndrivers/gpu/drm/tests/drm_client_modeset_test.c:194:\t.init = drm_client_modeset_test_init,\ndrivers/gpu/drm/tests/drm_client_modeset_test.c-195-\t.test_cases = drm_test_pick_cmdline_tests\n--\ndrivers/gpu/drm/tests/drm_client_modeset_test.c=198=kunit_test_suite(drm_test_pick_cmdline_test_suite);\n--\ndrivers/gpu/drm/tests/drm_client_modeset_test.c-200-/*\ndrivers/gpu/drm/tests/drm_client_modeset_test.c:201: * This file is included directly by drm_client_modeset.c so we can't\ndrivers/gpu/drm/tests/drm_client_modeset_test.c-202- * use any MODULE_* macro here.\n--\ninclude/drm/drm_client.h=210=void drm_client_buffer_vunmap(struct drm_client_buffer *buffer);\ninclude/drm/drm_client.h-211-\ninclude/drm/drm_client.h:212:int drm_client_modeset_create(struct drm_client_dev *client);\ninclude/drm/drm_client.h:213:void drm_client_modeset_free(struct drm_client_dev *client);\ninclude/drm/drm_client.h:214:int drm_client_modeset_probe(struct drm_client_dev *client, unsigned int width, unsigned int height);\ninclude/drm/drm_client.h-215-bool drm_client_rotation(struct drm_mode_set *modeset, unsigned int *rotation);\ninclude/drm/drm_client.h:216:int drm_client_modeset_check(struct drm_client_dev *client);\ninclude/drm/drm_client.h:217:int drm_client_modeset_commit_locked(struct drm_client_dev *client);\ninclude/drm/drm_client.h:218:int drm_client_modeset_commit(struct drm_client_dev *client);\ninclude/drm/drm_client.h:219:int drm_client_modeset_dpms(struct drm_client_dev *client, int mode);\ninclude/drm/drm_client.h:220:int drm_client_modeset_wait_for_vblank(struct drm_client_dev *client, unsigned int crtc_index);\ninclude/drm/drm_client.h-221-\n"
} |
| 11/2 | 2026/08/11 01:12 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 25198 output: 18 thoughts: 45 Thoughts: Okay, here's my take on those thoughts, tailored for an expert audience: **Analyzing the DRM Client Modesetting Compilation** Alright, so `drm_client_modeset.c` is being compiled, and it's flagged under `CONFIG_DRM_CLIENT`. My immediate instinct is to jump into the `Kconfig` files – specifically in `drivers/gpu/drm/Kconfig` – to understand the dependency and configuration options tied to `CONFIG_DRM_CLIENT`. I want to see what that configuration symbol actually *means* in the broader context of the DRM driver framework. What are the potential implications of enabling or disabling it? Are there any specific hardware or software requirements associated with it? I'm looking for the "why" and "how" behind this compilation choice to understand its role in the driver ecosystem. |
| 12/2 | 2026/08/11 01:12 | tool | grepper |
0mArgs:{
"Expression": "config DRM_CLIENT"
}Results: {
"Output": "drivers/gpu/drm/Kconfig=158=config DRM_DEBUG_MODESET_LOCK\n--\ndrivers/gpu/drm/Kconfig-172-\ndrivers/gpu/drm/Kconfig:173:config DRM_CLIENT\ndrivers/gpu/drm/Kconfig-174-\tbool\n--\ndrivers/gpu/drm/clients/Kconfig-2-\ndrivers/gpu/drm/clients/Kconfig:3:config DRM_CLIENT_LIB\ndrivers/gpu/drm/clients/Kconfig-4-\ttristate\n--\ndrivers/gpu/drm/clients/Kconfig-11-\ndrivers/gpu/drm/clients/Kconfig:12:config DRM_CLIENT_SELECTION\ndrivers/gpu/drm/clients/Kconfig-13-\ttristate\n--\ndrivers/gpu/drm/clients/Kconfig-20-\ndrivers/gpu/drm/clients/Kconfig:21:config DRM_CLIENT_SETUP\ndrivers/gpu/drm/clients/Kconfig-22-\tbool\n--\ndrivers/gpu/drm/clients/Kconfig=54=config DRM_FBDEV_LEAK_PHYS_SMEM\n--\ndrivers/gpu/drm/clients/Kconfig-73-\ndrivers/gpu/drm/clients/Kconfig:74:config DRM_CLIENT_LOG\ndrivers/gpu/drm/clients/Kconfig-75-\tbool \"Print the kernel boot message on the screen\"\n--\ndrivers/gpu/drm/clients/Kconfig=88=choice\n--\ndrivers/gpu/drm/clients/Kconfig-98-\ndrivers/gpu/drm/clients/Kconfig:99:config DRM_CLIENT_DEFAULT_FBDEV\ndrivers/gpu/drm/clients/Kconfig-100-\tbool \"fbdev\"\n--\ndrivers/gpu/drm/clients/Kconfig-105-\ndrivers/gpu/drm/clients/Kconfig:106:config DRM_CLIENT_DEFAULT_LOG\ndrivers/gpu/drm/clients/Kconfig-107-\tbool \"log\"\n--\ndrivers/gpu/drm/clients/Kconfig=114=endchoice\ndrivers/gpu/drm/clients/Kconfig-115-\ndrivers/gpu/drm/clients/Kconfig:116:config DRM_CLIENT_DEFAULT\ndrivers/gpu/drm/clients/Kconfig-117- string\n"
} |
| 13/2 | 2026/08/11 01:12 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 26004 output: 22 thoughts: 71 Thoughts: **Analyzing the DRM Client Configuration** Okay, so I'm looking at this `CONFIG_DRM_CLIENT` and the first thing I notice is that it's a hidden boolean. That means it's likely selected by something else, a dependency. Given the name, my gut feeling is that either `CONFIG_DRM_CLIENT_LIB` or `CONFIG_DRM_FBDEV_EMULATION` is responsible for selecting it. Both are plausible depending on the specific use case, but let's quickly check `CONFIG_DRM_FBDEV_EMULATION` first. It feels like the more likely candidate to me, given the direct connection to framebuffers. I'll need to go dig into `drivers/gpu/drm/clients/Kconfig` to confirm this suspicion. From there, I can determine the relationship between those config options. |
| 14/2 | 2026/08/11 01:12 | tool | grepper |
0mArgs:{
"Expression": "config DRM_FBDEV_EMULATION"
}Results: {
"Output": "drivers/gpu/drm/clients/Kconfig=28=menu \"Supported DRM clients\"\n--\ndrivers/gpu/drm/clients/Kconfig-30-\ndrivers/gpu/drm/clients/Kconfig:31:config DRM_FBDEV_EMULATION\ndrivers/gpu/drm/clients/Kconfig-32-\tbool \"Enable legacy fbdev support for your modesetting driver\"\n"
} |
| 15/2 | 2026/08/11 01:12 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 26379 output: 38 thoughts: 17 Thoughts: Okay, here's my summary, taking the perspective of someone knowledgeable in the field and approaching this specific code query: **Deconstructing the `DRM_FBDEV_EMULATION` Selection** Alright, let's dive into this. I'm taking a look at `DRM_FBDEV_EMULATION` and trying to figure out exactly *what* it's choosing. It's that kind of question that, as a specialist, I need to understand thoroughly. It directly impacts how the graphics stack interacts with the frame buffer. I want to understand what implications this choice carries in this context and how it impacts the architecture. I'll need to remember all the variables here. |
| 16/2 | 2026/08/11 01:12 | tool | grepper |
0mArgs:{
"Expression": "config DRM_FBDEV_EMULATION",
"PathPrefix": "drivers/gpu/drm/clients/Kconfig"
}Results: {
"Output": "drivers/gpu/drm/clients/Kconfig=28=menu \"Supported DRM clients\"\n--\ndrivers/gpu/drm/clients/Kconfig-30-\ndrivers/gpu/drm/clients/Kconfig:31:config DRM_FBDEV_EMULATION\ndrivers/gpu/drm/clients/Kconfig-32-\tbool \"Enable legacy fbdev support for your modesetting driver\"\n"
} |
| 17/2 | 2026/08/11 01:12 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 26681 output: 37 thoughts: 22 Thoughts: Here's my take on those thoughts: **Analyzing the DRM Client Configuration** Alright, let's dive into this `drivers/gpu/drm/clients/Kconfig` file. I'm focusing specifically around line 31. This is where the real guts of the client configurations are defined, and where the decisions get made on which hardware or features are supported. I expect to see the typical `config` blocks, conditional statements using `depends on`, `select`, and hopefully some decent help text to guide the configuration process. I'm hoping to quickly understand what clients are enabled by default, how they're related to various hardware platforms, and any dependencies they might have on specific kernel features or other DRM modules. I need to get a high-level picture of the client configuration strategy here so I can understand any downstream impacts. |
| 18/2 | 2026/08/11 01:12 | tool | read-file |
0mArgs:{
"File": "drivers/gpu/drm/clients/Kconfig",
"FirstLine": 25,
"LineCount": 20
}Results: {
"Contents": " 25:\t\t Enables the DRM client selection. DRM drivers that support the\n 26:\t\t default clients should select DRM_CLIENT_SELECTION instead.\n 27:\t\n 28:\tmenu \"Supported DRM clients\"\n 29:\t\tdepends on DRM_CLIENT_SELECTION\n 30:\t\n 31:\tconfig DRM_FBDEV_EMULATION\n 32:\t\tbool \"Enable legacy fbdev support for your modesetting driver\"\n 33:\t\tdepends on DRM_CLIENT_SELECTION\n 34:\t\tselect DRM_CLIENT\n 35:\t\tselect DRM_CLIENT_SETUP\n 36:\t\tselect FRAMEBUFFER_CONSOLE_DETECT_PRIMARY if FRAMEBUFFER_CONSOLE\n 37:\t\tdefault FB\n 38:\t\thelp\n 39:\t\t Choose this option if you have a need for the legacy fbdev\n 40:\t\t support. Note that this support also provides the linux console\n 41:\t\t support on top of your modesetting driver.\n 42:\t\n 43:\t\t If in doubt, say \"Y\".\n 44:\t\n"
} |
| 19/2 | 2026/08/11 01:12 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 27188 output: 19 thoughts: 108 Thoughts: **Navigating the DRM Configuration Landscape** Okay, so I'm diving into this DRM configuration jungle. My initial thought is that `DRM_FBDEV_EMULATION` automatically pulls in `DRM_CLIENT` – good to know. This makes me realize we need to add `DRM_FBDEV_EMULATION` to our `EnableConfigs`. But hang on a second, I have a feeling `DRM_CLIENT` might be selected by other things as well, maybe `DRM_CLIENT_LOG`? I need to verify that. Let me look at `DRM_CLIENT_SELECTION`. Alright, found it, that's selected by the DRM drivers themselves. Now, just to be thorough and avoid any gotchas, let's quickly check `DRM_VKMS` to see if it implicitly selects `DRM_CLIENT_SELECTION`. Want to make sure everything's connected as I expect it to be. |
| 20/2 | 2026/08/11 01:12 | tool | grepper |
0mArgs:{
"Expression": "config DRM_VKMS"
}Results: {
"Output": "drivers/gpu/drm/vkms/Kconfig-2-\ndrivers/gpu/drm/vkms/Kconfig:3:config DRM_VKMS\ndrivers/gpu/drm/vkms/Kconfig-4-\ttristate \"Virtual KMS (EXPERIMENTAL)\"\n--\ndrivers/gpu/drm/vkms/Kconfig-18-\ndrivers/gpu/drm/vkms/Kconfig:19:config DRM_VKMS_KUNIT_TEST\ndrivers/gpu/drm/vkms/Kconfig-20-\ttristate \"KUnit tests for VKMS\" if !KUNIT_ALL_TESTS\n"
} |
| 21/2 | 2026/08/11 01:12 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 27667 output: 37 thoughts: 17 Thoughts: Here's a summary of my thought process, as if I were reading the Kconfig file: **Diving into the VKMS Kconfig** Okay, time to dig into `drivers/gpu/drm/vkms/Kconfig`. Right away, I'm expecting this file to define the build configuration options for the Vulkan KMS driver. Knowing the DRM subsystem, I'm anticipating to see dependencies on the core DRM infrastructure, maybe options for specific hardware features or variations, and definitely some selections related to debug and testing capabilities. I'll need to understand what options are available to enable or disable the VKMS driver and any related features. I'll be looking for things like: * **`CONFIG_DRM_VKMS`**: The main switch to enable the driver. * **Dependencies**: I expect a dependency on the DRM core (`CONFIG_DRM`). Possibly other core dependencies, or on the platform the driver is intended for. * **Sub-features**: Anything specific to VKMS that can be configured, like debug messages (`CONFIG_DRM_VKMS_DEBUG`). Maybe options for specific virtual hardware configurations or rendering modes. * **Documentation**: Is it well-documented? I hope it's well-commented because good Kconfig files are essential for understanding the build system. The comments will tell me what the options do. * **Defaults**: What are the default values for the options? Are they reasonable? Do they align with common use cases? * **Triggers**: I wonder if there are any options to build a reduced-functionality VKMS for specific targets. This might be used to reduce the size or complexity of the system. * **Conflicts**: Are there conflicting options? Are there any options which make others mutually exclusive? This can be key when building and configuring the kernel. * **Help**: How good is the help text? Is it clear and concise? Does it provide good context for the user to make informed decisions? I'll be paying close attention to the dependencies, as they will tell me how this driver fits into the broader DRM/Vulkan landscape. I am curious to see how the VKMS implementation has addressed the user interface. My primary goal here is to grasp the configurability of VKMS. |
| 22/2 | 2026/08/11 01:12 | tool | read-file |
0mArgs:{
"File": "drivers/gpu/drm/vkms/Kconfig",
"FirstLine": 1,
"LineCount": 20
}Results: {
"Contents": " 1:\t# SPDX-License-Identifier: GPL-2.0-only\n 2:\t\n 3:\tconfig DRM_VKMS\n 4:\t\ttristate \"Virtual KMS (EXPERIMENTAL)\"\n 5:\t\tdepends on DRM \u0026\u0026 MMU\n 6:\t\tselect DRM_CLIENT_SELECTION\n 7:\t\tselect DRM_KMS_HELPER\n 8:\t\tselect DRM_GEM_SHMEM_HELPER\n 9:\t\tselect CRC32\n 10:\t\tselect CONFIGFS_FS\n 11:\t\tdefault n\n 12:\t\thelp\n 13:\t\t Virtual Kernel Mode-Setting (VKMS) is used for testing or for\n 14:\t\t running GPU in a headless machines. Choose this option to get\n 15:\t\t a VKMS.\n 16:\t\n 17:\t\t If M is selected the module will be called vkms.\n 18:\t\n 19:\tconfig DRM_VKMS_KUNIT_TEST\n 20:\t\ttristate \"KUnit tests for VKMS\" if !KUNIT_ALL_TESTS\n"
} |
| 23/2 | 2026/08/11 01:12 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 28473 output: 19 thoughts: 88 Thoughts: Okay, here's my interpretation of this configuration logic, focusing on the dependencies and the overall goal: **Thinking Through Virtual KMS Driver Selection** Alright, let me see... so, if I'm understanding this correctly, the `DRM_VKMS` driver specifically brings in the `DRM_CLIENT_SELECTION` option. That makes sense, `DRM_VKMS` is a virtual KMS driver so the clients can be managed and selected. Now, on top of that, `DRM_FBDEV_EMULATION` defaults to `FB`, okay, got it. So, to ensure we get the functionality we're aiming for – presumably a virtual KMS environment with the framebuffer emulation available – the clear path is to enable both `DRM_VKMS` and `DRM_FBDEV_EMULATION`. Hmm, hold on. There's another virtual driver in the mix: `DRM_VGEM`. I need to double-check something. Is `DRM_VGEM` also selecting `DRM_CLIENT_SELECTION`? We'll need to figure out the differences of selection and when to use these drivers. |
| 24/2 | 2026/08/11 01:13 | tool | grepper |
0mArgs:{
"Expression": "config DRM_VGEM"
}Results: {
"Output": "drivers/gpu/drm/vgem/Kconfig-1-# SPDX-License-Identifier: GPL-2.0-only\ndrivers/gpu/drm/vgem/Kconfig:2:config DRM_VGEM\ndrivers/gpu/drm/vgem/Kconfig-3-\ttristate \"Virtual GEM provider\"\n"
} |
| 25/2 | 2026/08/11 01:13 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 28909 output: 37 thoughts: 17 Thoughts: Okay, let's dive into this Kconfig file for the virtual GEM driver – `drivers/gpu/drm/vgem/Kconfig`. I need to get a clear understanding of its configuration options and dependencies. **Kconfig Analysis for Virtual GEM** Right, so I'm going through this Kconfig to see how the virtual GEM driver is set up for configuration. It's the standard format, which means it should be straightforward enough to parse. I'm looking for the core options, their defaults, any dependencies on other kernel features or drivers, and of course, what's controlling the build process. First, I need to understand if there's a main symbol. Then the dependencies need to be understood in the context of what hardware they target, or what other options are needed for the driver to work. I will be looking to see if there is any mention of this driver being experimental, if it is still active, or if it is deprecated. And of course, I am on the lookout for any interesting or unusual configurations. |
| 26/2 | 2026/08/11 01:13 | tool | read-file |
0mArgs:{
"File": "drivers/gpu/drm/vgem/Kconfig",
"FirstLine": 1,
"LineCount": 10
}Results: {
"Contents": " 1:\t# SPDX-License-Identifier: GPL-2.0-only\n 2:\tconfig DRM_VGEM\n 3:\t\ttristate \"Virtual GEM provider\"\n 4:\t\tdepends on DRM \u0026\u0026 MMU\n 5:\t\tselect DRM_GEM_SHMEM_HELPER\n 6:\t\thelp\n 7:\t\t Choose this option to get a virtual graphics memory manager,\n 8:\t\t as used by Mesa's software renderer for enhanced performance.\n 9:\t\t If M is selected the module will be called vgem.\n"
} |
| 27/2 | 2026/08/11 01:13 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 29320 output: 25 thoughts: 152 Thoughts: **My Assessment of the DRM Configuration** Okay, so VGEM doesn't utilize KMS. That immediately means I need to bypass the `DRM_CLIENT_SELECTION` and focus on `DRM_VKMS` instead. That's a key first step in getting this working. I also know I should enable `DRM_FBDEV_EMULATION`. Now, the next question is about how vblank waits are handled in user space. I need to confirm whether `drm_crtc_wait_one_vblank` is reachable from userspace calls. Right, let me see... yes, I can see that `drm_fb_helper_ioctl` is calling `drm_client_modeset_wait_for_vblank`, which then goes on to call the specific `drm_crtc_wait_one_vblank_internal` function that I am interested in. Furthermore, I need to remind myself that it is also called by those atomic commit helpers. Good, that confirms my understanding of the vblank synchronization path for both legacy and atomic modesetting, and it seems the implementation is solid. |
| 28/2 | 2026/08/11 01:13 | tool | grepper |
0mArgs:{
"Expression": "drm_crtc_wait_one_vblank"
}Results: {
"Output": "drivers/gpu/drm/display/drm_dp_helper.c=2287=static void drm_dp_aux_crc_work(struct work_struct *work)\n--\ndrivers/gpu/drm/display/drm_dp_helper.c-2300-\twhile (crtc-\u003ecrc.opened) {\ndrivers/gpu/drm/display/drm_dp_helper.c:2301:\t\tdrm_crtc_wait_one_vblank(crtc);\ndrivers/gpu/drm/display/drm_dp_helper.c-2302-\t\tif (!crtc-\u003ecrc.opened)\n--\ndrivers/gpu/drm/drm_client_modeset.c=1309=int drm_client_modeset_wait_for_vblank(struct drm_client_dev *client, unsigned int crtc_index)\n--\ndrivers/gpu/drm/drm_client_modeset.c-1330-\tif (!ret) {\ndrivers/gpu/drm/drm_client_modeset.c:1331:\t\tdrm_crtc_wait_one_vblank_internal(crtc);\ndrivers/gpu/drm/drm_client_modeset.c-1332-\t\tdrm_crtc_vblank_put(crtc);\n--\ndrivers/gpu/drm/drm_internal.h=117=u64 drm_vblank_count(struct drm_device *dev, unsigned int pipe);\ndrivers/gpu/drm/drm_internal.h:118:int drm_crtc_wait_one_vblank_internal(struct drm_crtc *crtc);\ndrivers/gpu/drm/drm_internal.h-119-\n--\ndrivers/gpu/drm/drm_vblank.c=1298=EXPORT_SYMBOL(drm_crtc_vblank_put);\n--\ndrivers/gpu/drm/drm_vblank.c-1300-/**\ndrivers/gpu/drm/drm_vblank.c:1301: * drm_crtc_wait_one_vblank_internal - wait for one vblank\ndrivers/gpu/drm/drm_vblank.c-1302- * @crtc: DRM crtc\n--\ndrivers/gpu/drm/drm_vblank.c-1308- */\ndrivers/gpu/drm/drm_vblank.c:1309:int drm_crtc_wait_one_vblank_internal(struct drm_crtc *crtc)\ndrivers/gpu/drm/drm_vblank.c-1310-{\n--\ndrivers/gpu/drm/drm_vblank.c-1326-/**\ndrivers/gpu/drm/drm_vblank.c:1327: * drm_crtc_wait_one_vblank - wait for one vblank\ndrivers/gpu/drm/drm_vblank.c-1328- * @crtc: DRM crtc\n--\ndrivers/gpu/drm/drm_vblank.c-1335- */\ndrivers/gpu/drm/drm_vblank.c:1336:int drm_crtc_wait_one_vblank(struct drm_crtc *crtc)\ndrivers/gpu/drm/drm_vblank.c-1337-{\n--\ndrivers/gpu/drm/drm_vblank.c-1346-\ndrivers/gpu/drm/drm_vblank.c:1347:\tret = drm_crtc_wait_one_vblank_internal(crtc);\ndrivers/gpu/drm/drm_vblank.c-1348-\n--\ndrivers/gpu/drm/drm_vblank.c-1354-}\ndrivers/gpu/drm/drm_vblank.c:1355:EXPORT_SYMBOL(drm_crtc_wait_one_vblank);\ndrivers/gpu/drm/drm_vblank.c-1356-\n--\ndrivers/gpu/drm/i915/display/intel_crtc.c=67=void intel_crtc_wait_for_next_vblank(struct intel_crtc *crtc)\ndrivers/gpu/drm/i915/display/intel_crtc.c-68-{\ndrivers/gpu/drm/i915/display/intel_crtc.c:69:\tdrm_crtc_wait_one_vblank(\u0026crtc-\u003ebase);\ndrivers/gpu/drm/i915/display/intel_crtc.c-70-}\n--\ndrivers/gpu/drm/ingenic/ingenic-drm-drv.c=213=static int ingenic_drm_update_pixclk(struct notifier_block *nb,\n--\ndrivers/gpu/drm/ingenic/ingenic-drm-drv.c-222-\t\tpriv-\u003eupdate_clk_rate = true;\ndrivers/gpu/drm/ingenic/ingenic-drm-drv.c:223:\t\tdrm_crtc_wait_one_vblank(\u0026priv-\u003ecrtc);\ndrivers/gpu/drm/ingenic/ingenic-drm-drv.c-224-\t\treturn NOTIFY_OK;\n--\ndrivers/gpu/drm/mediatek/mtk_crtc.c=805=static void mtk_crtc_atomic_disable(struct drm_crtc *crtc,\n--\ndrivers/gpu/drm/mediatek/mtk_crtc.c-836-\t/* Wait for planes to be disabled */\ndrivers/gpu/drm/mediatek/mtk_crtc.c:837:\tdrm_crtc_wait_one_vblank(crtc);\ndrivers/gpu/drm/mediatek/mtk_crtc.c-838-\n--\ndrivers/gpu/drm/sti/sti_crtc.c=36=static void sti_crtc_atomic_disable(struct drm_crtc *crtc,\n--\ndrivers/gpu/drm/sti/sti_crtc.c-44-\ndrivers/gpu/drm/sti/sti_crtc.c:45:\tdrm_crtc_wait_one_vblank(crtc);\ndrivers/gpu/drm/sti/sti_crtc.c-46-}\n--\ndrivers/gpu/drm/tegra/dc.c=1771=static int tegra_dc_show_crc(struct seq_file *s, void *data)\n--\ndrivers/gpu/drm/tegra/dc.c-1788-\ndrivers/gpu/drm/tegra/dc.c:1789:\tdrm_crtc_wait_one_vblank(\u0026dc-\u003ebase);\ndrivers/gpu/drm/tegra/dc.c:1790:\tdrm_crtc_wait_one_vblank(\u0026dc-\u003ebase);\ndrivers/gpu/drm/tegra/dc.c-1791-\n--\ninclude/drm/drm_vblank.h=304=void drm_crtc_vblank_put(struct drm_crtc *crtc);\ninclude/drm/drm_vblank.h:305:int drm_crtc_wait_one_vblank(struct drm_crtc *crtc);\ninclude/drm/drm_vblank.h-306-void drm_crtc_vblank_off(struct drm_crtc *crtc);\n"
} |
| 29/2 | 2026/08/11 01:13 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 31486 output: 16 thoughts: 590 Thoughts: **DRM Core Vblank Handling Fix: A Deep Dive** Okay, so I've been looking at this patch and how it affects the DRM core's vblank handling, specifically around `drm_crtc_wait_one_vblank`. This function, as we know, is used throughout the ecosystem, by many drivers and helper functions. The problem, as I see it, stems from `drm_client_modeset_wait_for_vblank` making a nested call – first getting the vblank status with `drm_crtc_vblank_get` and *then* calling `drm_crtc_wait_one_vblank`, which *also* calls `drm_crtc_vblank_get`. This double-dip, so to speak, could lead to potential issues, perhaps even triggering timeouts. The fix, introducing `drm_crtc_wait_one_vblank_internal`, neatly avoids this nested `get/put` cycle. It's a functional change in the DRM core, and it's reachable from userspace via fbdev ioctls or DRM atomic commits, and that means it's definitely worth fuzzing. I need to make sure this is tested thoroughly. My focus is on these symbols: `drm_client_modeset_wait_for_vblank`, `drm_crtc_wait_one_vblank`, and the new `drm_crtc_wait_one_vblank_internal`. I need to nail down the right config options. I'm thinking `DRM_VKMS` and `DRM_FBDEV_EMULATION` should be sufficient, but I need to be sure. Let's see... `DRM_VKMS` selects `DRM_CLIENT_SELECTION`. And `DRM_FBDEV_EMULATION` depends on `DRM_CLIENT_SELECTION`. So, that seems right. Now, do I need `DRM_CLIENT` explicitly? Nope, `DRM_FBDEV_EMULATION` selects `DRM_CLIENT`. Okay, that's good. Next, I need to check the signature of `drm_crtc_wait_one_vblank_internal` and whether it's exported. It isn't, but it's defined in `drivers/gpu/drm/drm_vblank.c` and declared in `drivers/gpu/drm/drm_internal.h`. Since it's not a static function, there *is* a symbol. Good. I'll confirm `drm_client_modeset_wait_for_vblank` is exported and `drm_crtc_wait_one_vblank` is also exported. Yes, they both are. Finally, are there any other crucial configs? Let's see... I'm wondering about `FB`. Does `DRM_FBDEV_EMULATION` require that? Let's check the dependencies. `DRM_FBDEV_EMULATION` depends on `DRM_CLIENT_SELECTION`, and it selects `DRM_CLIENT` and `DRM_CLIENT_SETUP`, and it *defaults* to `FB`. Wait, the *default* value, means it defaults to the value of `FB`. And is `FB` needed? It looks like I may not need `FB`. I will investigate further. |
| 30/2 | 2026/08/11 01:13 | tool | grepper |
0mArgs:{
"Expression": "config FB"
}Results: {
"Output": "\nFull output is too long, showing 500 out of 1054 lines.\nUse more precise expression if possible.\n\ndrivers/net/ethernet/meta/Kconfig=18=if NET_VENDOR_META\ndrivers/net/ethernet/meta/Kconfig-19-\ndrivers/net/ethernet/meta/Kconfig:20:config FBNIC\ndrivers/net/ethernet/meta/Kconfig-21-\ttristate \"Meta Platforms Host Network Interface\"\n--\ndrivers/staging/fbtft/Kconfig-1-# SPDX-License-Identifier: GPL-2.0\ndrivers/staging/fbtft/Kconfig:2:menuconfig FB_TFT\ndrivers/staging/fbtft/Kconfig-3-\ttristate \"Support for small TFT LCD display modules\"\n--\ndrivers/staging/fbtft/Kconfig=14=if FB_TFT\ndrivers/staging/fbtft/Kconfig-15-\ndrivers/staging/fbtft/Kconfig:16:config FB_TFT_AGM1264K_FL\ndrivers/staging/fbtft/Kconfig-17-\ttristate \"FB driver for the AGM1264K-FL LCD display\"\n--\ndrivers/staging/fbtft/Kconfig-20-\ndrivers/staging/fbtft/Kconfig:21:config FB_TFT_BD663474\ndrivers/staging/fbtft/Kconfig-22-\ttristate \"FB driver for the BD663474 LCD Controller\"\n--\ndrivers/staging/fbtft/Kconfig-25-\ndrivers/staging/fbtft/Kconfig:26:config FB_TFT_HX8340BN\ndrivers/staging/fbtft/Kconfig-27-\ttristate \"FB driver for the HX8340BN LCD Controller\"\n--\ndrivers/staging/fbtft/Kconfig-30-\ndrivers/staging/fbtft/Kconfig:31:config FB_TFT_HX8347D\ndrivers/staging/fbtft/Kconfig-32-\ttristate \"FB driver for the HX8347D LCD Controller\"\n--\ndrivers/staging/fbtft/Kconfig-35-\ndrivers/staging/fbtft/Kconfig:36:config FB_TFT_HX8353D\ndrivers/staging/fbtft/Kconfig-37-\ttristate \"FB driver for the HX8353D LCD Controller\"\n--\ndrivers/staging/fbtft/Kconfig-40-\ndrivers/staging/fbtft/Kconfig:41:config FB_TFT_HX8357D\ndrivers/staging/fbtft/Kconfig-42-\ttristate \"FB driver for the HX8357D LCD Controller\"\n--\ndrivers/staging/fbtft/Kconfig-45-\ndrivers/staging/fbtft/Kconfig:46:config FB_TFT_ILI9163\ndrivers/staging/fbtft/Kconfig-47-\ttristate \"FB driver for the ILI9163 LCD Controller\"\n--\ndrivers/staging/fbtft/Kconfig-50-\ndrivers/staging/fbtft/Kconfig:51:config FB_TFT_ILI9320\ndrivers/staging/fbtft/Kconfig-52-\ttristate \"FB driver for the ILI9320 LCD Controller\"\n--\ndrivers/staging/fbtft/Kconfig-55-\ndrivers/staging/fbtft/Kconfig:56:config FB_TFT_ILI9325\ndrivers/staging/fbtft/Kconfig-57-\ttristate \"FB driver for the ILI9325 LCD Controller\"\n--\ndrivers/staging/fbtft/Kconfig-60-\ndrivers/staging/fbtft/Kconfig:61:config FB_TFT_ILI9340\ndrivers/staging/fbtft/Kconfig-62-\ttristate \"FB driver for the ILI9340 LCD Controller\"\n--\ndrivers/staging/fbtft/Kconfig-65-\ndrivers/staging/fbtft/Kconfig:66:config FB_TFT_ILI9341\ndrivers/staging/fbtft/Kconfig-67-\ttristate \"FB driver for the ILI9341 LCD Controller\"\n--\ndrivers/staging/fbtft/Kconfig-70-\ndrivers/staging/fbtft/Kconfig:71:config FB_TFT_ILI9481\ndrivers/staging/fbtft/Kconfig-72-\ttristate \"FB driver for the ILI9481 LCD Controller\"\n--\ndrivers/staging/fbtft/Kconfig-75-\ndrivers/staging/fbtft/Kconfig:76:config FB_TFT_ILI9486\ndrivers/staging/fbtft/Kconfig-77-\ttristate \"FB driver for the ILI9486 LCD Controller\"\n--\ndrivers/staging/fbtft/Kconfig-80-\ndrivers/staging/fbtft/Kconfig:81:config FB_TFT_PCD8544\ndrivers/staging/fbtft/Kconfig-82-\ttristate \"FB driver for the PCD8544 LCD Controller\"\n--\ndrivers/staging/fbtft/Kconfig-85-\ndrivers/staging/fbtft/Kconfig:86:config FB_TFT_RA8875\ndrivers/staging/fbtft/Kconfig-87-\ttristate \"FB driver for the RA8875 LCD Controller\"\n--\ndrivers/staging/fbtft/Kconfig-94-\ndrivers/staging/fbtft/Kconfig:95:config FB_TFT_S6D02A1\ndrivers/staging/fbtft/Kconfig-96-\ttristate \"FB driver for the S6D02A1 LCD Controller\"\n--\ndrivers/staging/fbtft/Kconfig-99-\ndrivers/staging/fbtft/Kconfig:100:config FB_TFT_S6D1121\ndrivers/staging/fbtft/Kconfig-101-\ttristate \"FB driver for the S6D1211 LCD Controller\"\n--\ndrivers/staging/fbtft/Kconfig-104-\ndrivers/staging/fbtft/Kconfig:105:config FB_TFT_SEPS525\ndrivers/staging/fbtft/Kconfig-106-\ttristate \"FB driver for the SEPS525 LCD Controller\"\n--\ndrivers/staging/fbtft/Kconfig-110-\ndrivers/staging/fbtft/Kconfig:111:config FB_TFT_SH1106\ndrivers/staging/fbtft/Kconfig-112-\ttristate \"FB driver for the SH1106 OLED Controller\"\n--\ndrivers/staging/fbtft/Kconfig-115-\ndrivers/staging/fbtft/Kconfig:116:config FB_TFT_SSD1289\ndrivers/staging/fbtft/Kconfig-117-\ttristate \"FB driver for the SSD1289 LCD Controller\"\n--\ndrivers/staging/fbtft/Kconfig-120-\ndrivers/staging/fbtft/Kconfig:121:config FB_TFT_SSD1305\ndrivers/staging/fbtft/Kconfig-122-\ttristate \"FB driver for the SSD1305 OLED Controller\"\n--\ndrivers/staging/fbtft/Kconfig-125-\ndrivers/staging/fbtft/Kconfig:126:config FB_TFT_SSD1306\ndrivers/staging/fbtft/Kconfig-127-\ttristate \"FB driver for the SSD1306 OLED Controller\"\n--\ndrivers/staging/fbtft/Kconfig-130-\ndrivers/staging/fbtft/Kconfig:131:config FB_TFT_SSD1331\ndrivers/staging/fbtft/Kconfig-132-\ttristate \"FB driver for the SSD1331 LCD Controller\"\n--\ndrivers/staging/fbtft/Kconfig-135-\ndrivers/staging/fbtft/Kconfig:136:config FB_TFT_SSD1351\ndrivers/staging/fbtft/Kconfig-137-\ttristate \"FB driver for the SSD1351 LCD Controller\"\n--\ndrivers/staging/fbtft/Kconfig-140-\ndrivers/staging/fbtft/Kconfig:141:config FB_TFT_ST7735R\ndrivers/staging/fbtft/Kconfig-142-\ttristate \"FB driver for the ST7735R LCD Controller\"\n--\ndrivers/staging/fbtft/Kconfig-145-\ndrivers/staging/fbtft/Kconfig:146:config FB_TFT_ST7789V\ndrivers/staging/fbtft/Kconfig-147-\ttristate \"FB driver for the ST7789V LCD Controller\"\n--\ndrivers/staging/fbtft/Kconfig-154-\ndrivers/staging/fbtft/Kconfig:155:config FB_TFT_TINYLCD\ndrivers/staging/fbtft/Kconfig-156-\ttristate \"FB driver for tinylcd.com display\"\n--\ndrivers/staging/fbtft/Kconfig-159-\ndrivers/staging/fbtft/Kconfig:160:config FB_TFT_TLS8204\ndrivers/staging/fbtft/Kconfig-161-\ttristate \"FB driver for the TLS8204 LCD Controller\"\n--\ndrivers/staging/fbtft/Kconfig-164-\ndrivers/staging/fbtft/Kconfig:165:config FB_TFT_UC1611\ndrivers/staging/fbtft/Kconfig-166-\ttristate \"FB driver for the UC1611 LCD controller\"\n--\ndrivers/staging/fbtft/Kconfig-169-\ndrivers/staging/fbtft/Kconfig:170:config FB_TFT_UC1701\ndrivers/staging/fbtft/Kconfig-171-\ttristate \"FB driver for the UC1701 LCD Controller\"\n--\ndrivers/staging/fbtft/Kconfig-174-\ndrivers/staging/fbtft/Kconfig:175:config FB_TFT_UPD161704\ndrivers/staging/fbtft/Kconfig-176-\ttristate \"FB driver for the uPD161704 LCD Controller\"\n--\ndrivers/staging/sm750fb/Kconfig-1-# SPDX-License-Identifier: GPL-2.0\ndrivers/staging/sm750fb/Kconfig:2:config FB_SM750\ndrivers/staging/sm750fb/Kconfig-3-\ttristate \"Silicon Motion SM750 framebuffer support\"\n--\ndrivers/video/fbdev/Kconfig-5-\ndrivers/video/fbdev/Kconfig:6:menuconfig FB\ndrivers/video/fbdev/Kconfig-7-\ttristate \"Support for frame buffer device drivers\"\n--\ndrivers/video/fbdev/Kconfig-47-\ndrivers/video/fbdev/Kconfig:48:config FB_HECUBA\ndrivers/video/fbdev/Kconfig-49-\ttristate\n--\ndrivers/video/fbdev/Kconfig-52-\ndrivers/video/fbdev/Kconfig:53:config FB_SVGALIB\ndrivers/video/fbdev/Kconfig-54-\ttristate\n--\ndrivers/video/fbdev/Kconfig-59-\ndrivers/video/fbdev/Kconfig:60:config FB_MACMODES\ndrivers/video/fbdev/Kconfig-61-\ttristate\n--\ndrivers/video/fbdev/Kconfig-63-\ndrivers/video/fbdev/Kconfig:64:config FB_GRVGA\ndrivers/video/fbdev/Kconfig-65-\ttristate \"Aeroflex Gaisler framebuffer support\"\n--\ndrivers/video/fbdev/Kconfig-70-\ndrivers/video/fbdev/Kconfig:71:config FB_CIRRUS\ndrivers/video/fbdev/Kconfig-72-\ttristate \"Cirrus Logic support\"\n--\ndrivers/video/fbdev/Kconfig-89-\ndrivers/video/fbdev/Kconfig:90:config FB_PM2\ndrivers/video/fbdev/Kconfig-91-\ttristate \"Permedia2 support\"\n--\ndrivers/video/fbdev/Kconfig-110-\ndrivers/video/fbdev/Kconfig:111:config FB_PM2_FIFO_DISCONNECT\ndrivers/video/fbdev/Kconfig-112-\tbool \"enable FIFO disconnect feature\"\n--\ndrivers/video/fbdev/Kconfig-116-\ndrivers/video/fbdev/Kconfig:117:config FB_ACORN\ndrivers/video/fbdev/Kconfig-118-\tbool \"Acorn VIDC support\"\n--\ndrivers/video/fbdev/Kconfig-125-\ndrivers/video/fbdev/Kconfig:126:config FB_CLPS711X\ndrivers/video/fbdev/Kconfig-127-\ttristate \"CLPS711X LCD support\"\n--\ndrivers/video/fbdev/Kconfig-136-\ndrivers/video/fbdev/Kconfig:137:config FB_SA1100\ndrivers/video/fbdev/Kconfig-138-\tbool \"SA-1100 LCD support\"\n--\ndrivers/video/fbdev/Kconfig-148-\ndrivers/video/fbdev/Kconfig:149:config FB_IMX\ndrivers/video/fbdev/Kconfig-150-\ttristate \"Freescale i.MX1/21/25/27 LCD support\"\n--\ndrivers/video/fbdev/Kconfig-157-\ndrivers/video/fbdev/Kconfig:158:config FB_CYBER2000\ndrivers/video/fbdev/Kconfig-159-\ttristate \"CyberPro 2000/2010/5000 support\"\n--\ndrivers/video/fbdev/Kconfig-167-\ndrivers/video/fbdev/Kconfig:168:config FB_CYBER2000_DDC\ndrivers/video/fbdev/Kconfig-169-\tbool \"DDC for CyberPro support\"\n--\ndrivers/video/fbdev/Kconfig-176-\ndrivers/video/fbdev/Kconfig:177:config FB_CYBER2000_I2C\ndrivers/video/fbdev/Kconfig-178-\tbool \"CyberPro 2000/2010/5000 I2C support\"\n--\ndrivers/video/fbdev/Kconfig-186-\ndrivers/video/fbdev/Kconfig:187:config FB_APOLLO\ndrivers/video/fbdev/Kconfig-188-\tbool\n--\ndrivers/video/fbdev/Kconfig-194-\ndrivers/video/fbdev/Kconfig:195:config FB_Q40\ndrivers/video/fbdev/Kconfig-196-\tbool\n--\ndrivers/video/fbdev/Kconfig-200-\ndrivers/video/fbdev/Kconfig:201:config FB_AMIGA\ndrivers/video/fbdev/Kconfig-202-\ttristate \"Amiga native chipset support\"\n--\ndrivers/video/fbdev/Kconfig-211-\ndrivers/video/fbdev/Kconfig:212:config FB_AMIGA_OCS\ndrivers/video/fbdev/Kconfig-213-\tbool \"Amiga OCS chipset support\"\n--\ndrivers/video/fbdev/Kconfig-219-\ndrivers/video/fbdev/Kconfig:220:config FB_AMIGA_ECS\ndrivers/video/fbdev/Kconfig-221-\tbool \"Amiga ECS chipset support\"\n--\ndrivers/video/fbdev/Kconfig-228-\ndrivers/video/fbdev/Kconfig:229:config FB_AMIGA_AGA\ndrivers/video/fbdev/Kconfig-230-\tbool \"Amiga AGA chipset support\"\n--\ndrivers/video/fbdev/Kconfig-237-\ndrivers/video/fbdev/Kconfig:238:config FB_FM2\ndrivers/video/fbdev/Kconfig-239-\tbool \"Amiga FrameMaster II/Rainbow II support\"\n--\ndrivers/video/fbdev/Kconfig-245-\ndrivers/video/fbdev/Kconfig:246:config FB_ARC\ndrivers/video/fbdev/Kconfig-247-\ttristate \"Arc Monochrome LCD board support\"\n--\ndrivers/video/fbdev/Kconfig-258-\ndrivers/video/fbdev/Kconfig:259:config FB_ATARI\ndrivers/video/fbdev/Kconfig-260-\tbool \"Atari native chipset support\"\n--\ndrivers/video/fbdev/Kconfig-269-\ndrivers/video/fbdev/Kconfig:270:config FB_OF\ndrivers/video/fbdev/Kconfig-271-\ttristate \"Open Firmware frame buffer device support\"\n--\ndrivers/video/fbdev/Kconfig-280-\ndrivers/video/fbdev/Kconfig:281:config FB_CONTROL\ndrivers/video/fbdev/Kconfig-282-\tbool \"Apple \\\"control\\\" display support\"\n--\ndrivers/video/fbdev/Kconfig-289-\ndrivers/video/fbdev/Kconfig:290:config FB_PLATINUM\ndrivers/video/fbdev/Kconfig-291-\tbool \"Apple \\\"platinum\\\" display support\"\n--\ndrivers/video/fbdev/Kconfig-298-\ndrivers/video/fbdev/Kconfig:299:config FB_VALKYRIE\ndrivers/video/fbdev/Kconfig-300-\tbool \"Apple \\\"valkyrie\\\" display support\"\n--\ndrivers/video/fbdev/Kconfig-307-\ndrivers/video/fbdev/Kconfig:308:config FB_CT65550\ndrivers/video/fbdev/Kconfig-309-\tbool \"Chips 65550 display support\"\n--\ndrivers/video/fbdev/Kconfig-315-\ndrivers/video/fbdev/Kconfig:316:config FB_ASILIANT\ndrivers/video/fbdev/Kconfig-317-\tbool \"Asiliant (Chips) 69000 display support\"\n--\ndrivers/video/fbdev/Kconfig-322-\ndrivers/video/fbdev/Kconfig:323:config FB_IMSTT\ndrivers/video/fbdev/Kconfig-324-\tbool \"IMS Twin Turbo display support\"\n--\ndrivers/video/fbdev/Kconfig-332-\ndrivers/video/fbdev/Kconfig:333:config FB_VGA16\ndrivers/video/fbdev/Kconfig-334-\ttristate \"VGA 16-color graphics support\"\n--\ndrivers/video/fbdev/Kconfig-349-\ndrivers/video/fbdev/Kconfig:350:config FB_STI\ndrivers/video/fbdev/Kconfig-351-\ttristate \"HP STI frame buffer device support\"\n--\ndrivers/video/fbdev/Kconfig-369-\ndrivers/video/fbdev/Kconfig:370:config FB_MAC\ndrivers/video/fbdev/Kconfig-371-\tbool \"Generic Macintosh display support\"\n--\ndrivers/video/fbdev/Kconfig-375-\ndrivers/video/fbdev/Kconfig:376:config FB_HP300\ndrivers/video/fbdev/Kconfig-377-\tbool\n--\ndrivers/video/fbdev/Kconfig-382-\ndrivers/video/fbdev/Kconfig:383:config FB_TGA\ndrivers/video/fbdev/Kconfig-384-\ttristate \"TGA/SFB+ framebuffer support\"\n--\ndrivers/video/fbdev/Kconfig-406-\ndrivers/video/fbdev/Kconfig:407:config FB_UVESA\ndrivers/video/fbdev/Kconfig-408-\ttristate \"Userspace VESA VGA graphics support\"\n--\ndrivers/video/fbdev/Kconfig-423-\ndrivers/video/fbdev/Kconfig:424:config FB_VESA\ndrivers/video/fbdev/Kconfig-425-\tbool \"VESA VGA graphics support\"\n--\ndrivers/video/fbdev/Kconfig-435-\ndrivers/video/fbdev/Kconfig:436:config FB_EFI\ndrivers/video/fbdev/Kconfig-437-\tbool \"EFI-based Framebuffer Support\"\n--\ndrivers/video/fbdev/Kconfig-447-\ndrivers/video/fbdev/Kconfig:448:config FB_N411\ndrivers/video/fbdev/Kconfig-449-\ttristate \"N411 Apollo/Hecuba devkit support\"\n--\ndrivers/video/fbdev/Kconfig-455-\ndrivers/video/fbdev/Kconfig:456:config FB_GBE\ndrivers/video/fbdev/Kconfig-457-\tbool \"SGI Graphics Backend frame buffer support\"\n--\ndrivers/video/fbdev/Kconfig-464-\ndrivers/video/fbdev/Kconfig:465:config FB_GBE_MEM\ndrivers/video/fbdev/Kconfig-466-\tint \"Video memory size in MB\"\n--\ndrivers/video/fbdev/Kconfig-472-\ndrivers/video/fbdev/Kconfig:473:config FB_SBUS\ndrivers/video/fbdev/Kconfig-474-\tbool \"SBUS and UPA framebuffers\"\n--\ndrivers/video/fbdev/Kconfig-478-\ndrivers/video/fbdev/Kconfig:479:config FB_SBUS_HELPERS\ndrivers/video/fbdev/Kconfig-480-\tbool\n--\ndrivers/video/fbdev/Kconfig-485-\ndrivers/video/fbdev/Kconfig:486:config FB_BW2\ndrivers/video/fbdev/Kconfig-487-\tbool \"BWtwo support\"\n--\ndrivers/video/fbdev/Kconfig-492-\ndrivers/video/fbdev/Kconfig:493:config FB_CG3\ndrivers/video/fbdev/Kconfig-494-\tbool \"CGthree support\"\n--\ndrivers/video/fbdev/Kconfig-499-\ndrivers/video/fbdev/Kconfig:500:config FB_CG6\ndrivers/video/fbdev/Kconfig-501-\tbool \"CGsix (GX,TurboGX) support\"\n--\ndrivers/video/fbdev/Kconfig-509-\ndrivers/video/fbdev/Kconfig:510:config FB_FFB\ndrivers/video/fbdev/Kconfig-511-\tbool \"Creator/Creator3D/Elite3D support\"\n--\ndrivers/video/fbdev/Kconfig-519-\ndrivers/video/fbdev/Kconfig:520:config FB_TCX\ndrivers/video/fbdev/Kconfig-521-\tbool \"TCX (SS4/SS5 only) support\"\n--\ndrivers/video/fbdev/Kconfig-527-\ndrivers/video/fbdev/Kconfig:528:config FB_CG14\ndrivers/video/fbdev/Kconfig-529-\tbool \"CGfourteen (SX) support\"\n--\ndrivers/video/fbdev/Kconfig-535-\ndrivers/video/fbdev/Kconfig:536:config FB_P9100\ndrivers/video/fbdev/Kconfig-537-\tbool \"P9100 (Sparcbook 3 only) support\"\n--\ndrivers/video/fbdev/Kconfig-543-\ndrivers/video/fbdev/Kconfig:544:config FB_LEO\ndrivers/video/fbdev/Kconfig-545-\tbool \"Leo (ZX) support\"\n--\ndrivers/video/fbdev/Kconfig-551-\ndrivers/video/fbdev/Kconfig:552:config FB_XVR500\ndrivers/video/fbdev/Kconfig-553-\tbool \"Sun XVR-500 3DLABS Wildcat support\"\n--\ndrivers/video/fbdev/Kconfig-565-\ndrivers/video/fbdev/Kconfig:566:config FB_XVR2500\ndrivers/video/fbdev/Kconfig-567-\tbool \"Sun XVR-2500 3DLABS Wildcat support\"\n--\ndrivers/video/fbdev/Kconfig-576-\ndrivers/video/fbdev/Kconfig:577:config FB_XVR1000\ndrivers/video/fbdev/Kconfig-578-\tbool \"Sun XVR-1000 support\"\n--\ndrivers/video/fbdev/Kconfig-586-\ndrivers/video/fbdev/Kconfig:587:config FB_PVR2\ndrivers/video/fbdev/Kconfig-588-\ttristate \"NEC PowerVR 2 display support\"\n--\ndrivers/video/fbdev/Kconfig-609-\ndrivers/video/fbdev/Kconfig:610:config FB_OPENCORES\ndrivers/video/fbdev/Kconfig-611-\ttristate \"OpenCores VGA/LCD core 2.0 framebuffer support\"\n--\ndrivers/video/fbdev/Kconfig-623-\ndrivers/video/fbdev/Kconfig:624:config FB_S1D13XXX\ndrivers/video/fbdev/Kconfig-625-\ttristate \"Epson S1D13XXX framebuffer support\"\n--\ndrivers/video/fbdev/Kconfig-635-\ndrivers/video/fbdev/Kconfig:636:config FB_ATMEL\ndrivers/video/fbdev/Kconfig-637-\ttristate \"AT91 LCD Controller support\"\n--\ndrivers/video/fbdev/Kconfig-647-\ndrivers/video/fbdev/Kconfig:648:config FB_NVIDIA\ndrivers/video/fbdev/Kconfig-649-\ttristate \"nVidia Framebuffer Support\"\n--\ndrivers/video/fbdev/Kconfig-667-\ndrivers/video/fbdev/Kconfig:668:config FB_NVIDIA_I2C\ndrivers/video/fbdev/Kconfig-669-\tbool \"Enable DDC Support\"\n--\ndrivers/video/fbdev/Kconfig-680-\ndrivers/video/fbdev/Kconfig:681:config FB_NVIDIA_DEBUG\ndrivers/video/fbdev/Kconfig-682-\tbool \"Lots of debug output\"\n--\ndrivers/video/fbdev/Kconfig-688-\ndrivers/video/fbdev/Kconfig:689:config FB_NVIDIA_BACKLIGHT\ndrivers/video/fbdev/Kconfig-690-\tbool \"Support for backlight control\"\n--\ndrivers/video/fbdev/Kconfig-697-\ndrivers/video/fbdev/Kconfig:698:config FB_RIVA\ndrivers/video/fbdev/Kconfig-699-\ttristate \"nVidia Riva support\"\n--\ndrivers/video/fbdev/Kconfig-715-\ndrivers/video/fbdev/Kconfig:716:config FB_RIVA_I2C\ndrivers/video/fbdev/Kconfig-717-\tbool \"Enable DDC Support\"\n--\ndrivers/video/fbdev/Kconfig-728-\ndrivers/video/fbdev/Kconfig:729:config FB_RIVA_DEBUG\ndrivers/video/fbdev/Kconfig-730-\tbool \"Lots of debug output\"\n--\ndrivers/video/fbdev/Kconfig-736-\ndrivers/video/fbdev/Kconfig:737:config FB_RIVA_BACKLIGHT\ndrivers/video/fbdev/Kconfig-738-\tbool \"Support for backlight control\"\n--\ndrivers/video/fbdev/Kconfig-745-\ndrivers/video/fbdev/Kconfig:746:config FB_I740\ndrivers/video/fbdev/Kconfig-747-\ttristate \"Intel740 support\"\n--\ndrivers/video/fbdev/Kconfig-755-\ndrivers/video/fbdev/Kconfig:756:config FB_I810\ndrivers/video/fbdev/Kconfig-757-\ttristate \"Intel 810/815 support\"\n--\ndrivers/video/fbdev/Kconfig-771-\ndrivers/video/fbdev/Kconfig:772:config FB_I810_GTF\ndrivers/video/fbdev/Kconfig-773-\tbool \"use VESA Generalized Timing Formula\"\n--\ndrivers/video/fbdev/Kconfig-794-\ndrivers/video/fbdev/Kconfig:795:config FB_I810_I2C\ndrivers/video/fbdev/Kconfig-796-\tbool \"Enable DDC Support\"\n--\ndrivers/video/fbdev/Kconfig-804-\ndrivers/video/fbdev/Kconfig:805:config FB_MATROX\ndrivers/video/fbdev/Kconfig-806-\ttristate \"Matrox acceleration\"\n--\ndrivers/video/fbdev/Kconfig-826-\ndrivers/video/fbdev/Kconfig:827:config FB_MATROX_MILLENIUM\ndrivers/video/fbdev/Kconfig-828-\tbool \"Millennium I/II support\"\n--\ndrivers/video/fbdev/Kconfig-836-\ndrivers/video/fbdev/Kconfig:837:config FB_MATROX_MYSTIQUE\ndrivers/video/fbdev/Kconfig-838-\tbool \"Mystique support\"\n--\ndrivers/video/fbdev/Kconfig-846-\ndrivers/video/fbdev/Kconfig:847:config FB_MATROX_G\ndrivers/video/fbdev/Kconfig-848-\tbool \"G100/G200/G400/G450/G550 support\"\n--\ndrivers/video/fbdev/Kconfig-876-\ndrivers/video/fbdev/Kconfig:877:config FB_MATROX_I2C\ndrivers/video/fbdev/Kconfig-878-\ttristate \"Matrox I2C support\"\n--\ndrivers/video/fbdev/Kconfig-893-\ndrivers/video/fbdev/Kconfig:894:config FB_MATROX_MAVEN\ndrivers/video/fbdev/Kconfig-895-\ttristate \"G400 second head support\"\n--\ndrivers/video/fbdev/Kconfig-925-\ndrivers/video/fbdev/Kconfig:926:config FB_RADEON\ndrivers/video/fbdev/Kconfig-927-\ttristate \"ATI Radeon display support\"\n--\ndrivers/video/fbdev/Kconfig-939-\ndrivers/video/fbdev/Kconfig:940:config FB_RADEON_I2C\ndrivers/video/fbdev/Kconfig-941-\tbool \"DDC/I2C for ATI Radeon support\"\n--\ndrivers/video/fbdev/Kconfig-947-\ndrivers/video/fbdev/Kconfig:948:config FB_RADEON_BACKLIGHT\ndrivers/video/fbdev/Kconfig-949-\tbool \"Support for backlight control\"\n--\ndrivers/video/fbdev/Kconfig-956-\ndrivers/video/fbdev/Kconfig:957:config FB_RADEON_DEBUG\ndrivers/video/fbdev/Kconfig-958-\tbool \"Lots of debug output from Radeon driver\"\n--\ndrivers/video/fbdev/Kconfig-964-\ndrivers/video/fbdev/Kconfig:965:config FB_ATY128\ndrivers/video/fbdev/Kconfig-966-\ttristate \"ATI Rage128 display support\"\n--\ndrivers/video/fbdev/Kconfig-977-\ndrivers/video/fbdev/Kconfig:978:config FB_ATY128_BACKLIGHT\ndrivers/video/fbdev/Kconfig-979-\tbool \"Support for backlight control\"\n--\ndrivers/video/fbdev/Kconfig-986-\ndrivers/video/fbdev/Kconfig:987:config FB_ATY\ndrivers/video/fbdev/Kconfig-988-\ttristate \"ATI Mach64 display support\" if PCI || ATARI\n--\ndrivers/video/fbdev/Kconfig-1002-\ndrivers/video/fbdev/Kconfig:1003:config FB_ATY_CT\ndrivers/video/fbdev/Kconfig-1004-\tbool \"Mach64 CT/VT/GT/LT (incl. 3D RAGE) support\"\n--\ndrivers/video/fbdev/Kconfig-1011-\ndrivers/video/fbdev/Kconfig:1012:config FB_ATY_GENERIC_LCD\ndrivers/video/fbdev/Kconfig-1013-\tbool \"Mach64 generic LCD support\"\n--\ndrivers/video/fbdev/Kconfig-1018-\ndrivers/video/fbdev/Kconfig:1019:config FB_ATY_GX\ndrivers/video/fbdev/Kconfig-1020-\tbool \"Mach64 GX support\" if PCI\n--\ndrivers/video/fbdev/Kconfig-1029-\ndrivers/video/fbdev/Kconfig:1030:config FB_ATY_BACKLIGHT\ndrivers/video/fbdev/Kconfig-1031-\tbool \"Support for backlight control\"\n--\ndrivers/video/fbdev/Kconfig-1038-\ndrivers/video/fbdev/Kconfig:1039:config FB_S3\ndrivers/video/fbdev/Kconfig-1040-\ttristate \"S3 Trio/Virge support\"\n--\ndrivers/video/fbdev/Kconfig-1053-\ndrivers/video/fbdev/Kconfig:1054:config FB_S3_DDC\ndrivers/video/fbdev/Kconfig-1055-\tbool \"DDC for S3 support\"\n--\ndrivers/video/fbdev/Kconfig-1061-\ndrivers/video/fbdev/Kconfig:1062:config FB_SAVAGE\n\n"
} |
| 31/2 | 2026/08/11 01:13 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 41435 output: 38 thoughts: 58 Thoughts: Okay, here's my interpretation of those thoughts, tailored for an expert audience, presented in the first person: **Navigating the Framebuffer Landscape** Alright, let's see. The initial `FB` – that's short for framebuffer, and `CONFIG_FB` seems to be the core, the foundational component. So far, so good, makes sense. Now, `DRM_FBDEV_EMULATION`... I'm pretty sure that configuration option is responsible for linking things up with `FB_CORE`, or at least something in that vicinity. But I really should double-check the `Kconfig` files again. Better safe than sorry, specifically in `drivers/gpu/drm/clients/Kconfig` to be absolutely certain. Always good to refresh the memory with those crucial dependency declarations. |
| 32/2 | 2026/08/11 01:13 | tool | grepper |
0mArgs:{
"Expression": "config DRM_FBDEV_EMULATION",
"PathPrefix": "drivers/gpu/drm/clients/Kconfig"
}Results: {
"Output": "drivers/gpu/drm/clients/Kconfig=28=menu \"Supported DRM clients\"\n--\ndrivers/gpu/drm/clients/Kconfig-30-\ndrivers/gpu/drm/clients/Kconfig:31:config DRM_FBDEV_EMULATION\ndrivers/gpu/drm/clients/Kconfig-32-\tbool \"Enable legacy fbdev support for your modesetting driver\"\n"
} |
| 33/2 | 2026/08/11 01:13 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 41804 output: 37 thoughts: 23 Thoughts: Here's my attempt at summarizing the thought process, tailored for an expert audience: **Diving Back into the DRM Client Kconfig** Alright, let's circle back to `drivers/gpu/drm/clients/Kconfig`, specifically around line 31. I'm going to re-examine that section to refresh my understanding of how the client configuration options are structured. I'm probably looking for a specific dependency or a particular configuration variable that's been nagging at me. Perhaps I’m trying to solidify my grasp on a subtle interaction between different client drivers or trying to track down a configuration issue I’ve encountered recently. Or, maybe I'm reviewing the overall architecture before some impending change or contribution. Let me make sure I'm not missing any edge cases or dependencies I might've missed the first time. |
| 34/2 | 2026/08/11 01:13 | tool | read-file |
0mArgs:{
"File": "drivers/gpu/drm/clients/Kconfig",
"FirstLine": 25,
"LineCount": 20
}Results: {
"Contents": " 25:\t\t Enables the DRM client selection. DRM drivers that support the\n 26:\t\t default clients should select DRM_CLIENT_SELECTION instead.\n 27:\t\n 28:\tmenu \"Supported DRM clients\"\n 29:\t\tdepends on DRM_CLIENT_SELECTION\n 30:\t\n 31:\tconfig DRM_FBDEV_EMULATION\n 32:\t\tbool \"Enable legacy fbdev support for your modesetting driver\"\n 33:\t\tdepends on DRM_CLIENT_SELECTION\n 34:\t\tselect DRM_CLIENT\n 35:\t\tselect DRM_CLIENT_SETUP\n 36:\t\tselect FRAMEBUFFER_CONSOLE_DETECT_PRIMARY if FRAMEBUFFER_CONSOLE\n 37:\t\tdefault FB\n 38:\t\thelp\n 39:\t\t Choose this option if you have a need for the legacy fbdev\n 40:\t\t support. Note that this support also provides the linux console\n 41:\t\t support on top of your modesetting driver.\n 42:\t\n 43:\t\t If in doubt, say \"Y\".\n 44:\t\n"
} |
| 35/2 | 2026/08/11 01:13 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 42312 output: 21 thoughts: 90 Thoughts: Okay, here's my understanding, framed as my internal thought process: **Decoding the `default FB` Configuration** Right, let me break this down. When I see `default FB`, it's hinting that the system, by default, will use the value set by `CONFIG_FB`. So far, so good. However, it *doesn't* automatically mean that it actually *selects* `FB` directly. That's a crucial distinction. Now, I need to remind myself where the related code resides. Ah yes, `drm_fb_helper.c`. This file relies on `fb_info`, which is defined in `include/linux/fb.h`. But now I have to ask myself an important question: Does `drm_fb_helper.c` have an implicit dependency on `CONFIG_FB`? It feels like it might, but I need to confirm. My gut says I should re-examine the `drivers/gpu/drm/Makefile` to either confirm or refute my suspicion. I will do that before making any assumptions. |
| 36/2 | 2026/08/11 01:13 | tool | grepper |
0mArgs:{
"Expression": "drm_fb_helper.o"
}Results: {
"Output": "drivers/gpu/drm/Makefile=159=drm_kms_helper-$(CONFIG_DRM_PANEL_BRIDGE) += bridge/panel.o\ndrivers/gpu/drm/Makefile:160:drm_kms_helper-$(CONFIG_DRM_FBDEV_EMULATION) += drm_fb_helper.o\ndrivers/gpu/drm/Makefile-161-obj-$(CONFIG_DRM_KMS_HELPER) += drm_kms_helper.o\n"
} |
| 37/2 | 2026/08/11 01:13 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 42771 output: 18 thoughts: 72 Thoughts: **Investigating DRM_FBDEV_EMULATION and framebuffer dependencies** Okay, so I'm looking at this code and trying to understand its build dependencies. The crucial point here is the `DRM_FBDEV_EMULATION` option and how it affects the `drm_fb_helper.o` module. Specifically, if this emulation feature is enabled, then the `drm_fb_helper.o` is going to be built. But I have a nagging question in the back of my mind: can `drm_fb_helper.c` even *compile* without the classic framebuffer configuration (`CONFIG_FB`) enabled? It seems unlikely, given the name, but I need to confirm this. To answer that question with absolute certainty, I need to consult the code. The likely places to find this information are `include/linux/fb.h`, that should provide the declarations, or perhaps the `drivers/video/fbdev/core/Makefile`. The makefile might have conditional build flags, or the header file might include the relevant `ifdef` blocks. I'll start with those and see where I get. |
| 38/2 | 2026/08/11 01:13 | tool | grepper |
0mArgs:{
"Expression": "config FB_CORE"
}Results: {
"Output": "drivers/video/fbdev/core/Kconfig-5-\ndrivers/video/fbdev/core/Kconfig:6:config FB_CORE\ndrivers/video/fbdev/core/Kconfig-7-\tselect VIDEO\n"
} |
| 39/2 | 2026/08/11 01:13 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 43160 output: 18 thoughts: 21 Thoughts: Okay, here's my take on those thoughts, tailored for an expert audience and presented in the first person: **DRM_FBDEV_EMULATION and FB_CORE: A Quick Check** Right, let me just quickly run through this in my head. I need to make absolutely sure about something related to the Direct Rendering Manager (DRM) framebuffer emulation. Specifically, I'm thinking about the dependency between `DRM_FBDEV_EMULATION` and `FB_CORE`. It's a fundamental relationship, really. Does enabling the former automatically trigger the latter? If `DRM_FBDEV_EMULATION` is selected, does that inherently pull in the `FB_CORE` configuration as well? I need to clarify that dependency. A solid understanding of that link is pretty much essential for understanding how the core framebuffer emulation and DRM interface interact. Gotta make sure those two are correctly linked so that the userspace applications can work as intended with these modules. It's a key piece to verify. |
| 40/2 | 2026/08/11 01:13 | tool | grepper |
0mArgs:{
"Expression": "select FB_CORE"
}Results: {
"Output": "drivers/gpu/drm/Kconfig=45=config DRM_KMS_HELPER\n--\ndrivers/gpu/drm/Kconfig-47-\tdepends on DRM\ndrivers/gpu/drm/Kconfig:48:\tselect FB_CORE if DRM_FBDEV_EMULATION\ndrivers/gpu/drm/Kconfig-49-\thelp\n--\ndrivers/gpu/drm/Kconfig=250=config DRM_TTM_HELPER\n--\ndrivers/gpu/drm/Kconfig-254-\tselect DRM_KMS_HELPER if DRM_FBDEV_EMULATION\ndrivers/gpu/drm/Kconfig:255:\tselect FB_CORE if DRM_FBDEV_EMULATION\ndrivers/gpu/drm/Kconfig-256-\tselect FB_SYSMEM_HELPERS_DEFERRED if DRM_FBDEV_EMULATION\n--\ndrivers/gpu/drm/Kconfig=260=config DRM_GEM_DMA_HELPER\n--\ndrivers/gpu/drm/Kconfig-263-\tselect DRM_KMS_HELPER if DRM_FBDEV_EMULATION\ndrivers/gpu/drm/Kconfig:264:\tselect FB_CORE if DRM_FBDEV_EMULATION\ndrivers/gpu/drm/Kconfig-265-\tselect FB_DMAMEM_HELPERS_DEFERRED if DRM_FBDEV_EMULATION\n--\ndrivers/gpu/drm/Kconfig=269=config DRM_GEM_SHMEM_HELPER\n--\ndrivers/gpu/drm/Kconfig-272-\tselect DRM_KMS_HELPER if DRM_FBDEV_EMULATION\ndrivers/gpu/drm/Kconfig:273:\tselect FB_CORE if DRM_FBDEV_EMULATION\ndrivers/gpu/drm/Kconfig-274-\tselect FB_SYSMEM_HELPERS_DEFERRED if DRM_FBDEV_EMULATION\n--\ndrivers/gpu/drm/clients/Kconfig=3=config DRM_CLIENT_LIB\n--\ndrivers/gpu/drm/clients/Kconfig-6-\tselect DRM_KMS_HELPER if DRM_FBDEV_EMULATION\ndrivers/gpu/drm/clients/Kconfig:7:\tselect FB_CORE if DRM_FBDEV_EMULATION\ndrivers/gpu/drm/clients/Kconfig-8-\thelp\n--\ndrivers/video/fbdev/Kconfig=6=menuconfig FB\ndrivers/video/fbdev/Kconfig-7-\ttristate \"Support for frame buffer device drivers\"\ndrivers/video/fbdev/Kconfig:8:\tselect FB_CORE\ndrivers/video/fbdev/Kconfig-9-\tselect FB_NOTIFY\n"
} |
| 41/2 | 2026/08/11 01:13 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 44041 output: 232 thoughts: 852 Thoughts: **Fuzzing Target Identification: DRM Vblank Waiting Logic**
Okay, let's break this down. My initial thought is that `DRM_KMS_HELPER` chooses `FB_CORE` if we have `DRM_FBDEV_EMULATION` enabled. And, as we know, `DRM_VKMS` also selects `DRM_KMS_HELPER`, which implicitly selects `FB_CORE`. This means `FB_CORE` is handled automagically, so no need to explicitly worry about that one. Basically, we only need to enable `DRM_VKMS` and `DRM_FBDEV_EMULATION`.
Now, the important part: I need to confirm where these key functions are called. I see that `drm_client_modeset_wait_for_vblank` is indeed called and is exported. The patch alters both `drm_client_modeset_wait_for_vblank` and `drm_crtc_wait_one_vblank`. Both seem to be reachable - which is key!
Okay, let's summarize the fuzzing plan:
* **WorthFuzzing:** Absolutely!
* **Focus Symbols:** We have to focus on the following symbols
* `drm_client_modeset_wait_for_vblank`
* `drm_crtc_wait_one_vblank`
* `drm_crtc_wait_one_vblank_internal`
* **EnableConfigs:**
* `DRM_VKMS`
* `DRM_FBDEV_EMULATION`
Wait, hang on. `DRM_VKMS` is a virtual driver, perfect for fuzzing in a controlled environment. I need to make sure this is the right virtual driver. Does any other virtual driver use DRM? Let's see... `DRM_VGEM` doesn't use KMS, so it doesn't use `drm_crtc_wait_one_vblank`. But, `DRM_VKMS` *does* use KMS and CRTCs. Yes, `DRM_VKMS` is the correct target.
Let's double-check the definitions of the key functions to ensure they're accessible. I'll confirm that `drm_crtc_wait_one_vblank_internal` is not static, which it isn't. Similarly, `drm_client_modeset_wait_for_vblank` and `drm_crtc_wait_one_vblank` are also not static. Excellent. None of these functions are static or inlined.
The reason this is all worthwhile is that the patch refactors the vblank waiting logic to eliminate nested `drm_crtc_vblank_get` calls, and it introduces a new helper, `drm_crtc_wait_one_vblank_internal`. This fixes a potential issue in `drm_client_modeset_wait_for_vblank` and modifies how `drm_crtc_wait_one_vblank` functions. Since these functions can be accessed from userspace via fbdev ioctls (like `FBIO_WAITFORVSYNC`) and DRM atomic commits, there is a functional impact in the DRM core, making them perfect targets.
So, to reiterate, it seems like `DRM_VKMS` and `DRM_FBDEV_EMULATION` are the key configs we will need. This setup should give us a good testbed. Okay, I'm ready to proceed.
|
| 42/2 | 2026/08/11 01:14 | tool | set-results |
0mArgs:{
"EnableConfigs": [
"DRM_VKMS",
"DRM_FBDEV_EMULATION"
],
"FocusSymbols": [
"drm_client_modeset_wait_for_vblank",
"drm_crtc_wait_one_vblank",
"drm_crtc_wait_one_vblank_internal"
],
"Reasoning": "The patch refactors the vblank waiting logic in the DRM core to avoid nested `drm_crtc_vblank_get` calls, introducing a new internal helper `drm_crtc_wait_one_vblank_internal`. This fixes a potential issue in `drm_client_modeset_wait_for_vblank` and modifies the execution flow of `drm_crtc_wait_one_vblank`. These functions are reachable from userspace via fbdev ioctls (e.g., `FBIO_WAITFORVSYNC`) and DRM atomic commits. The changes have a functional impact on the DRM core and are worth fuzzing.",
"WorthFuzzing": true
}Results: {
"EnableConfigs": [
"DRM_VKMS",
"DRM_FBDEV_EMULATION"
],
"FocusSymbols": [
"drm_client_modeset_wait_for_vblank",
"drm_crtc_wait_one_vblank",
"drm_crtc_wait_one_vblank_internal"
],
"Reasoning": "The patch refactors the vblank waiting logic in the DRM core to avoid nested `drm_crtc_vblank_get` calls, introducing a new internal helper `drm_crtc_wait_one_vblank_internal`. This fixes a potential issue in `drm_client_modeset_wait_for_vblank` and modifies the execution flow of `drm_crtc_wait_one_vblank`. These functions are reachable from userspace via fbdev ioctls (e.g., `FBIO_WAITFORVSYNC`) and DRM atomic commits. The changes have a functional impact on the DRM core and are worth fuzzing.",
"WorthFuzzing": true
} |
| 43/1 | 2026/08/11 01:14 | action | If |
0mArgs:{
"WorthFuzzing": true
}Results: null |
| 44/2 | 2026/08/11 01:14 | agent | kmsan-evaluator |
0mModel:best-expensive Args: null Results: {
"KMSANReasoning": "The patch refactors `drm_crtc_wait_one_vblank` by extracting its core waiting logic into a new internal function `drm_crtc_wait_one_vblank_internal`. This allows callers like `drm_client_modeset_wait_for_vblank` that already hold a vblank reference to wait without acquiring and releasing the reference again. The changes are purely related to control flow, reference counting, and wait queues. There are no new data structures allocated, no structures copied to user space, and no uninitialized memory risks introduced. Any potential bugs introduced by this patch (such as use-after-free due to incorrect reference counting) would be caught by KASAN or standard kernel debugging tools. Therefore, a dedicated KMSAN fuzzing session is not necessary.",
"NeedsKMSAN": false
}Instruction: You are an expert Linux kernel security engineer specializing in kernel memory
error detectors (KASAN and KMSAN). Your job is to review the provided patch series and
determine if the code changes justify spawning a dedicated KMSAN (KernelMemorySanitizer)
fuzzing session in addition to standard KASAN fuzzing.
CRITICAL DISTINCTION BETWEEN KASAN AND KMSAN:
- Standard KASAN kernel builds (upstream-apparmor-kasan.config) already enable
a comprehensive suite of debugging tools and sanitizers, including KASAN
(out-of-bounds accesses, use-after-free, double free, invalid free), LOCKDEP
(locking bugs and deadlocks), UB-sanitizers, and memory corruption checks.
- KMSAN (KernelMemorySanitizer) detects reads of UNINITIALIZED memory (stack, heap,
or page allocations) and kernel-to-user memory info-leaks.
Rule: THERE IS NO SENSE IN RUNNING A KMSAN SESSION IF A BUG CAN BE CAUGHT BY KASAN,
LOCKDEP, OR OTHER STANDARD BUG DETECTORS.
A dedicated KMSAN fuzzing session incurs significant resource costs. You must ONLY
set NeedsKMSAN=true if the code changes introduce or expose UNINITIALIZED MEMORY risks
that are detected ONLY by KMSAN.
Look holistically at the patch series and surrounding code. Even if no direct
uninitialized field accesses or new buffer allocations are added in the diff itself,
a patch may alter control flow, bounds checking, or data length calculations in ways
that change how the rest of the code operates on existing buffers (e.g. allowing
uninitialized stack/heap memory to be read, copied to user space, or used in control
flow). Do not hesitate to use your code access tools to inspect the surrounding code,
called functions, and callers.
Set NeedsKMSAN=true ONLY IF the patch introduces or modifies:
1. Kernel structures sent to user space (via copy_to_user, put_user, netlink skb
attributes, ioctl output arguments, socket options, or BPF buffers) where fields
or structure padding might not be fully initialized/zeroed.
2. Conditional logic or branching that depends on potentially uninitialized variables
or struct fields.
3. Allocation or initialization of complex data structures where uninitialized fields
could be read later in reachable code paths.
4. Bounds checks, lengths, or logic in a way that allows surrounding code to access
uninitialized bytes of existing buffers.
Set NeedsKMSAN=false IF:
- The code changes primarily risk out-of-bounds access, array overflows, NULL pointer
dereferences, locking deadlocks, or use-after-free bugs (these are already caught
by KASAN, LOCKDEP, or standard bug detectors).
- All stack/heap structures touched or introduced by the patch are fully zeroed
or initialized (e.g. using = {0}, memset, kzalloc) before being read or copied.
- The patch does not introduce any risk of uninitialized memory usage or info-leaks.
Use your code access tools to inspect the surrounding code if necessary, then provide
detailed KMSANReasoning contrasting KASAN vs KMSAN applicability for this patch.
Prefer calling several tools at the same time to save round-trips.
Use set-results tool to provide results of the analysis.
It must be called exactly once before the final reply.
Ignore results of this tool.
Prompt: For your convenience, here is the diff of the changes:
commit d40deccccfdc284622c2366eab822b2770536ed8
Author: syz-cluster <triage@syzkaller.com>
Date: Tue Aug 11 01:11:58 2026 +0000
syz-cluster: applied patch under review
diff --git a/drivers/gpu/drm/drm_client_modeset.c b/drivers/gpu/drm/drm_client_modeset.c
index 0080a8e9556a5..7ff0f24a0f502 100644
--- a/drivers/gpu/drm/drm_client_modeset.c
+++ b/drivers/gpu/drm/drm_client_modeset.c
@@ -1328,7 +1328,7 @@ int drm_client_modeset_wait_for_vblank(struct drm_client_dev *client, unsigned i
*/
ret = drm_crtc_vblank_get(crtc);
if (!ret) {
- drm_crtc_wait_one_vblank(crtc);
+ drm_crtc_wait_one_vblank_internal(crtc);
drm_crtc_vblank_put(crtc);
}
diff --git a/drivers/gpu/drm/drm_internal.h b/drivers/gpu/drm/drm_internal.h
index f893b1e3a596e..6fd33672d206a 100644
--- a/drivers/gpu/drm/drm_internal.h
+++ b/drivers/gpu/drm/drm_internal.h
@@ -115,6 +115,7 @@ void drm_vblank_disable_and_save(struct drm_device *dev, unsigned int pipe);
int drm_vblank_get(struct drm_device *dev, unsigned int pipe);
void drm_vblank_put(struct drm_device *dev, unsigned int pipe);
u64 drm_vblank_count(struct drm_device *dev, unsigned int pipe);
+int drm_crtc_wait_one_vblank_internal(struct drm_crtc *crtc);
/* drm_vblank_work.c */
static inline void drm_vblank_flush_worker(struct drm_vblank_crtc *vblank)
diff --git a/drivers/gpu/drm/drm_vblank.c b/drivers/gpu/drm/drm_vblank.c
index f90fb2d13e423..9cac7013b4c9c 100644
--- a/drivers/gpu/drm/drm_vblank.c
+++ b/drivers/gpu/drm/drm_vblank.c
@@ -1297,6 +1297,32 @@ void drm_crtc_vblank_put(struct drm_crtc *crtc)
}
EXPORT_SYMBOL(drm_crtc_vblank_put);
+/**
+ * drm_crtc_wait_one_vblank_internal - wait for one vblank
+ * @crtc: DRM crtc
+ *
+ * This waits for one vblank to pass on @crtc, using the irq driver interfaces.
+ * Every caller must hold a vblank reference across the complete wait.
+ *
+ * Returns: 0 on success, negative error on failures.
+ */
+int drm_crtc_wait_one_vblank_internal(struct drm_crtc *crtc)
+{
+ struct drm_device *dev = crtc->dev;
+ int pipe = drm_crtc_index(crtc);
+ struct drm_vblank_crtc *vblank = drm_crtc_vblank_crtc(crtc);
+ int ret;
+ u64 last;
+
+ last = drm_vblank_count(dev, pipe);
+
+ ret = wait_event_timeout(vblank->queue,
+ last != drm_vblank_count(dev, pipe),
+ msecs_to_jiffies(1000));
+
+ return ret ? 0 : -ETIMEDOUT;
+}
+
/**
* drm_crtc_wait_one_vblank - wait for one vblank
* @crtc: DRM crtc
@@ -1311,26 +1337,20 @@ int drm_crtc_wait_one_vblank(struct drm_crtc *crtc)
{
struct drm_device *dev = crtc->dev;
int pipe = drm_crtc_index(crtc);
- struct drm_vblank_crtc *vblank = drm_crtc_vblank_crtc(crtc);
int ret;
- u64 last;
ret = drm_vblank_get(dev, pipe);
if (drm_WARN(dev, ret, "vblank not available on crtc %i, ret=%i\n",
pipe, ret))
return ret;
- last = drm_vblank_count(dev, pipe);
-
- ret = wait_event_timeout(vblank->queue,
- last != drm_vblank_count(dev, pipe),
- msecs_to_jiffies(1000));
+ ret = drm_crtc_wait_one_vblank_internal(crtc);
- drm_WARN(dev, ret == 0, "vblank wait timed out on crtc %i\n", pipe);
+ drm_WARN(dev, ret == -ETIMEDOUT, "vblank wait timed out on crtc %i\n", pipe);
drm_vblank_put(dev, pipe);
- return ret ? 0 : -ETIMEDOUT;
+ return ret;
}
EXPORT_SYMBOL(drm_crtc_wait_one_vblank);
|
| 45/3 | 2026/08/11 01:14 | llm | kmsan-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 3146 output: 191 thoughts: 414 Thoughts: **Refactoring the Vblank Wait Path** Okay, so I've been looking at this patch, and it looks like a pretty straightforward refactoring of the vblank waiting mechanism within the DRM core. Basically, what's happening is a function, `drm_client_modeset_wait_for_vblank`, is being streamlined to avoid redundant calls to `drm_vblank_get` and `drm_vblank_put`. I can see the logic; it's about optimizing reference counting. The main change is the introduction of `drm_crtc_wait_one_vblank_internal`. This new internal function in `drm_vblank.c` is the key. The existing function, `drm_crtc_wait_one_vblank`, originally contained a `drm_vblank_get` call but now, the code now gets a reference before calling the new internal function. This new internal function assumes the caller already holds the necessary reference, skipping the get/put calls within itself. This is good; we don't want to over-release or double release. Essentially, `drm_crtc_wait_one_vblank_internal` is a helper function that takes the burden of the reference counting from the public `drm_crtc_wait_one_vblank`. It simplifies the code path by allowing a caller to provide the reference if it has it. The old function `drm_crtc_wait_one_vblank` continues to manage the reference. Given the nature of the changes, I'm comfortable saying there's no risk of uninitialized memory being exposed here. We're dealing with reference counting and control flow – not with newly introduced data structures, allocations, or potentially unsafe memory accesses. This isn't a situation where KMSAN (Kernel Memory Sanitizer) is needed. KASAN (Kernel Address Sanitizer) and LOCKDEP should be more than sufficient to catch any subtle issues like use-after-free scenarios if the reference counting goes wrong. I can see no complex data structures or bounds checks here. I'm going to double-check the diff to confirm. `drm_crtc_wait_one_vblank_internal` will be returning `0` on success and `-ETIMEDOUT` on failure. `drm_crtc_wait_one_vblank` simply passes back the return code from that internal function. It's a clean separation of concerns: control flow and refcounting. Based on this analysis, I'm setting `NeedsKMSAN=false`. |
| 46/3 | 2026/08/11 01:14 | tool | set-results |
0mArgs:{
"KMSANReasoning": "The patch refactors `drm_crtc_wait_one_vblank` by extracting its core waiting logic into a new internal function `drm_crtc_wait_one_vblank_internal`. This allows callers like `drm_client_modeset_wait_for_vblank` that already hold a vblank reference to wait without acquiring and releasing the reference again. The changes are purely related to control flow, reference counting, and wait queues. There are no new data structures allocated, no structures copied to user space, and no uninitialized memory risks introduced. Any potential bugs introduced by this patch (such as use-after-free due to incorrect reference counting) would be caught by KASAN or standard kernel debugging tools. Therefore, a dedicated KMSAN fuzzing session is not necessary.",
"NeedsKMSAN": false
}Results: {
"KMSANReasoning": "The patch refactors `drm_crtc_wait_one_vblank` by extracting its core waiting logic into a new internal function `drm_crtc_wait_one_vblank_internal`. This allows callers like `drm_client_modeset_wait_for_vblank` that already hold a vblank reference to wait without acquiring and releasing the reference again. The changes are purely related to control flow, reference counting, and wait queues. There are no new data structures allocated, no structures copied to user space, and no uninitialized memory risks introduced. Any potential bugs introduced by this patch (such as use-after-free due to incorrect reference counting) would be caught by KASAN or standard kernel debugging tools. Therefore, a dedicated KMSAN fuzzing session is not necessary.",
"NeedsKMSAN": false
} |
| Total Calls | Total Tokens | Avg Tokens | Total Duration (Seconds) | Avg Duration (Seconds) |
|---|
| Total Calls | Total Duration (Seconds) | Avg Duration (Seconds) |
|---|