| Seq | Timestamp | Type | Name | Duration |
|---|---|---|---|---|
| 0/0 | 2026/07/15 07:26 | flow | patch-triage |
0mArgs:null Results: {
"EnableConfigs": null,
"FocusSymbols": [],
"Reasoning": "The patch modifies the initialization path of the AMD PDS Core PCI driver (`pdsc_init_pf`). This is a hardware-specific PCI driver that lacks software emulation in the kernel, meaning its probe and initialization paths are unreachable in virtualized environments like GCE or QEMU used by syzkaller.",
"WorthFuzzing": false
} |
| 1/1 | 2026/07/15 07:26 | action | read-patch-diff |
0mArgs:null Results: {
"PatchDiff": "commit 279fbbbd7b6ed8d89072f7f51de6c318b503e2b8\nAuthor: syz-cluster \u003ctriage@syzkaller.com\u003e\nDate: Wed Jul 15 07:26:02 2026 +0000\n\n syz-cluster: applied patch under review\n\ndiff --git a/drivers/net/ethernet/amd/pds_core/main.c b/drivers/net/ethernet/amd/pds_core/main.c\nindex 22db78343eb075..f37e5fefa26481 100644\n--- a/drivers/net/ethernet/amd/pds_core/main.c\n+++ b/drivers/net/ethernet/amd/pds_core/main.c\n@@ -238,6 +238,10 @@ static int pdsc_init_pf(struct pdsc *pdsc)\n \t/* General workqueue and timer, but don't start timer yet */\n \tsnprintf(wq_name, sizeof(wq_name), \"%s.%d\", PDS_CORE_DRV_NAME, pdsc-\u003euid);\n \tpdsc-\u003ewq = create_singlethread_workqueue(wq_name);\n+\tif (!pdsc-\u003ewq) {\n+\t\terr = -ENOMEM;\n+\t\tgoto err_out_unmap_bars;\n+\t}\n \tINIT_WORK(\u0026pdsc-\u003ehealth_work, pdsc_health_thread);\n \tINIT_WORK(\u0026pdsc-\u003epci_reset_work, pdsc_pci_reset_thread);\n \ttimer_setup(\u0026pdsc-\u003ewdtimer, pdsc_wdtimer_cb, 0);\n@@ -253,7 +257,7 @@ static int pdsc_init_pf(struct pdsc *pdsc)\n \terr = pdsc_setup(pdsc, PDSC_SETUP_INIT);\n \tif (err) {\n \t\tmutex_unlock(\u0026pdsc-\u003econfig_lock);\n-\t\tgoto err_out_unmap_bars;\n+\t\tgoto err_out_shutdown_timer;\n \t}\n \n \terr = pdsc_start(pdsc);\n@@ -305,13 +309,14 @@ static int pdsc_init_pf(struct pdsc *pdsc)\n \tpdsc_stop(pdsc);\n err_out_teardown:\n \tpdsc_teardown(pdsc, PDSC_TEARDOWN_REMOVING);\n-err_out_unmap_bars:\n+err_out_shutdown_timer:\n \ttimer_shutdown_sync(\u0026pdsc-\u003ewdtimer);\n \tif (pdsc-\u003ewq)\n \t\tdestroy_workqueue(pdsc-\u003ewq);\n \tmutex_destroy(\u0026pdsc-\u003econfig_lock);\n \tmutex_destroy(\u0026pdsc-\u003edevcmd_lock);\n \tpci_free_irq_vectors(pdsc-\u003epdev);\n+err_out_unmap_bars:\n \tpdsc_unmap_bars(pdsc);\n err_out_release_regions:\n \tpci_release_regions(pdsc-\u003epdev);\n"
} |
| 2/1 | 2026/07/15 07:26 | agent | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: {
"EnableConfigs": null,
"FocusSymbols": [],
"Reasoning": "The patch modifies the initialization path of the AMD PDS Core PCI driver (`pdsc_init_pf`). This is a hardware-specific PCI driver that lacks software emulation in the kernel, meaning its probe and initialization paths are unreachable in virtualized environments like GCE or QEMU used by syzkaller.",
"WorthFuzzing": false
}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). 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. 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. Do not list too generic configs (we already have them enabled). Only list those that specifically cover the modified code. 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 279fbbbd7b6ed8d89072f7f51de6c318b503e2b8
Author: syz-cluster <triage@syzkaller.com>
Date: Wed Jul 15 07:26:02 2026 +0000
syz-cluster: applied patch under review
diff --git a/drivers/net/ethernet/amd/pds_core/main.c b/drivers/net/ethernet/amd/pds_core/main.c
index 22db78343eb075..f37e5fefa26481 100644
--- a/drivers/net/ethernet/amd/pds_core/main.c
+++ b/drivers/net/ethernet/amd/pds_core/main.c
@@ -238,6 +238,10 @@ static int pdsc_init_pf(struct pdsc *pdsc)
/* General workqueue and timer, but don't start timer yet */
snprintf(wq_name, sizeof(wq_name), "%s.%d", PDS_CORE_DRV_NAME, pdsc->uid);
pdsc->wq = create_singlethread_workqueue(wq_name);
+ if (!pdsc->wq) {
+ err = -ENOMEM;
+ goto err_out_unmap_bars;
+ }
INIT_WORK(&pdsc->health_work, pdsc_health_thread);
INIT_WORK(&pdsc->pci_reset_work, pdsc_pci_reset_thread);
timer_setup(&pdsc->wdtimer, pdsc_wdtimer_cb, 0);
@@ -253,7 +257,7 @@ static int pdsc_init_pf(struct pdsc *pdsc)
err = pdsc_setup(pdsc, PDSC_SETUP_INIT);
if (err) {
mutex_unlock(&pdsc->config_lock);
- goto err_out_unmap_bars;
+ goto err_out_shutdown_timer;
}
err = pdsc_start(pdsc);
@@ -305,13 +309,14 @@ static int pdsc_init_pf(struct pdsc *pdsc)
pdsc_stop(pdsc);
err_out_teardown:
pdsc_teardown(pdsc, PDSC_TEARDOWN_REMOVING);
-err_out_unmap_bars:
+err_out_shutdown_timer:
timer_shutdown_sync(&pdsc->wdtimer);
if (pdsc->wq)
destroy_workqueue(pdsc->wq);
mutex_destroy(&pdsc->config_lock);
mutex_destroy(&pdsc->devcmd_lock);
pci_free_irq_vectors(pdsc->pdev);
+err_out_unmap_bars:
pdsc_unmap_bars(pdsc);
err_out_release_regions:
pci_release_regions(pdsc->pdev);
|
| 3/2 | 2026/07/15 07:26 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 2313 output: 43 thoughts: 247 Thoughts: **Analyzing a Recent Network Driver Patch** Okay, so I'm looking at this patch for `drivers/net/ethernet/amd/pds_core/main.c`. It seems they've added a check after `create_singlethread_workqueue(wq_name)` to see if `pdsc->wq` is NULL. Makes sense, memory allocation failure is a common problem. If it *is* NULL, it bails out with `-ENOMEM` and jumps to `err_out_unmap_bars`, which is standard error handling. They've also rejiggered the error handling path itself. `err_out_unmap_bars` is now placed *after* `timer_shutdown_sync`, `destroy_workqueue`, `mutex_destroy`, and `pci_free_irq_vectors`, and it's got a new label, `err_out_shutdown_timer`. That's a reasonable reordering for resource cleanup to ensure a clean exit. But wait a minute, this is a PCI driver specifically for the AMD PDS Core. That throws up a red flag in my mind. How likely is this code path to actually be reached in a typical environment, like QEMU or GCE? Typically, drivers for specific hardware components, especially PCI drivers, aren't directly exercisable unless the hardware is either emulated or passed through to a virtual machine. I need to figure out if there's any emulation for this AMD PDS Core anywhere. I'll need to dig into the kernel source and search for `PDS_CORE_DRV_NAME` or just `pds_core` to see what I can find. Understanding the context of where this driver is used is critical for understanding the validity of this patch and how to test it. |
| 4/2 | 2026/07/15 07:26 | tool | grepper |
0mArgs:{
"Expression": "PDS_CORE_DRV_NAME",
"PathPrefix": "drivers/net/ethernet/amd/pds_core/"
}Results: {
"Output": "drivers/net/ethernet/amd/pds_core/auxbus.c=194=int pdsc_auxbus_dev_add(struct pdsc *cf, struct pdsc *pf,\n--\ndrivers/net/ethernet/amd/pds_core/auxbus.c-236-\tsnprintf(devname, sizeof(devname), \"%s.%s.%d\",\ndrivers/net/ethernet/amd/pds_core/auxbus.c:237:\t\t PDS_CORE_DRV_NAME, pf-\u003eviftype_status[vt].name, cf-\u003euid);\ndrivers/net/ethernet/amd/pds_core/auxbus.c-238-\tclient_id = pds_client_register(pf, devname);\n--\ndrivers/net/ethernet/amd/pds_core/core.c=116=static int pdsc_qcq_intr_alloc(struct pdsc *pdsc, struct pdsc_qcq *qcq)\n--\ndrivers/net/ethernet/amd/pds_core/core.c-126-\tsnprintf(name, sizeof(name), \"%s-%d-%s\",\ndrivers/net/ethernet/amd/pds_core/core.c:127:\t\t PDS_CORE_DRV_NAME, pdsc-\u003epdev-\u003ebus-\u003enumber, qcq-\u003eq.name);\ndrivers/net/ethernet/amd/pds_core/core.c-128-\tindex = pdsc_intr_alloc(pdsc, name, pdsc_adminq_isr, pdsc);\n--\ndrivers/net/ethernet/amd/pds_core/debugfs.c=10=void pdsc_debugfs_create(void)\ndrivers/net/ethernet/amd/pds_core/debugfs.c-11-{\ndrivers/net/ethernet/amd/pds_core/debugfs.c:12:\tpdsc_dir = debugfs_create_dir(PDS_CORE_DRV_NAME, NULL);\ndrivers/net/ethernet/amd/pds_core/debugfs.c-13-}\n--\ndrivers/net/ethernet/amd/pds_core/dev.c=276=static int pdsc_identify(struct pdsc *pdsc)\n--\ndrivers/net/ethernet/amd/pds_core/dev.c-285-\tn = snprintf(drv.driver_ver_str, sizeof(drv.driver_ver_str),\ndrivers/net/ethernet/amd/pds_core/dev.c:286:\t\t \"%s %s\", PDS_CORE_DRV_NAME, utsname()-\u003erelease);\ndrivers/net/ethernet/amd/pds_core/dev.c-287-\tif (n \u003e sizeof(drv.driver_ver_str))\n--\ndrivers/net/ethernet/amd/pds_core/main.c=218=static int pdsc_init_pf(struct pdsc *pdsc)\n--\ndrivers/net/ethernet/amd/pds_core/main.c-226-\ndrivers/net/ethernet/amd/pds_core/main.c:227:\terr = pci_request_regions(pdsc-\u003epdev, PDS_CORE_DRV_NAME);\ndrivers/net/ethernet/amd/pds_core/main.c-228-\tif (err) {\n--\ndrivers/net/ethernet/amd/pds_core/main.c-238-\t/* General workqueue and timer, but don't start timer yet */\ndrivers/net/ethernet/amd/pds_core/main.c:239:\tsnprintf(wq_name, sizeof(wq_name), \"%s.%d\", PDS_CORE_DRV_NAME, pdsc-\u003euid);\ndrivers/net/ethernet/amd/pds_core/main.c-240-\tpdsc-\u003ewq = create_singlethread_workqueue(wq_name);\n--\ndrivers/net/ethernet/amd/pds_core/main.c=509=static void pdsc_reset_done(struct pci_dev *pdev)\n--\ndrivers/net/ethernet/amd/pds_core/main.c-524-\ndrivers/net/ethernet/amd/pds_core/main.c:525:\t\terr = pci_request_regions(pdsc-\u003epdev, PDS_CORE_DRV_NAME);\ndrivers/net/ethernet/amd/pds_core/main.c-526-\t\tif (err) {\n--\ndrivers/net/ethernet/amd/pds_core/main.c=582=static struct pci_driver pdsc_driver = {\ndrivers/net/ethernet/amd/pds_core/main.c:583:\t.name = PDS_CORE_DRV_NAME,\ndrivers/net/ethernet/amd/pds_core/main.c-584-\t.id_table = pdsc_id_table,\n--\ndrivers/net/ethernet/amd/pds_core/main.c=597=static int __init pdsc_init_module(void)\ndrivers/net/ethernet/amd/pds_core/main.c-598-{\ndrivers/net/ethernet/amd/pds_core/main.c:599:\tif (strcmp(KBUILD_MODNAME, PDS_CORE_DRV_NAME))\ndrivers/net/ethernet/amd/pds_core/main.c-600-\t\treturn -EINVAL;\n"
} |
| 5/2 | 2026/07/15 07:26 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 4350 output: 29 thoughts: 48 Thoughts: **Investigating PCI Driver Reachability in Syzkaller** Okay, so I'm looking at this driver and it's a PCI driver. The immediate question in my mind is, "How can I actually trigger this thing within Syzkaller?" I know from past experience that Syzkaller doesn't have explicit emulation of the AMD PDS Core hardware. That's a key roadblock. My next step is to quickly see if there are any existing emulations or dummy devices that might allow me to interact with it indirectly. Perhaps there's a generic PCI device emulation or some other workaround I can leverage. I need to figure out the path to get this driver exercised through the fuzzer. |
| 6/2 | 2026/07/15 07:26 | tool | grepper |
0mArgs:{
"Expression": "PDS_CORE_DRV_NAME",
"PathPrefix": ""
}Results: {
"Output": "drivers/fwctl/pds/main.c=519=static const struct auxiliary_device_id pdsfc_id_table[] = {\ndrivers/fwctl/pds/main.c:520:\t{.name = PDS_CORE_DRV_NAME \".\" PDS_DEV_TYPE_FWCTL_STR },\ndrivers/fwctl/pds/main.c-521-\t{}\n--\ndrivers/net/ethernet/amd/pds_core/auxbus.c=194=int pdsc_auxbus_dev_add(struct pdsc *cf, struct pdsc *pf,\n--\ndrivers/net/ethernet/amd/pds_core/auxbus.c-236-\tsnprintf(devname, sizeof(devname), \"%s.%s.%d\",\ndrivers/net/ethernet/amd/pds_core/auxbus.c:237:\t\t PDS_CORE_DRV_NAME, pf-\u003eviftype_status[vt].name, cf-\u003euid);\ndrivers/net/ethernet/amd/pds_core/auxbus.c-238-\tclient_id = pds_client_register(pf, devname);\n--\ndrivers/net/ethernet/amd/pds_core/core.c=116=static int pdsc_qcq_intr_alloc(struct pdsc *pdsc, struct pdsc_qcq *qcq)\n--\ndrivers/net/ethernet/amd/pds_core/core.c-126-\tsnprintf(name, sizeof(name), \"%s-%d-%s\",\ndrivers/net/ethernet/amd/pds_core/core.c:127:\t\t PDS_CORE_DRV_NAME, pdsc-\u003epdev-\u003ebus-\u003enumber, qcq-\u003eq.name);\ndrivers/net/ethernet/amd/pds_core/core.c-128-\tindex = pdsc_intr_alloc(pdsc, name, pdsc_adminq_isr, pdsc);\n--\ndrivers/net/ethernet/amd/pds_core/debugfs.c=10=void pdsc_debugfs_create(void)\ndrivers/net/ethernet/amd/pds_core/debugfs.c-11-{\ndrivers/net/ethernet/amd/pds_core/debugfs.c:12:\tpdsc_dir = debugfs_create_dir(PDS_CORE_DRV_NAME, NULL);\ndrivers/net/ethernet/amd/pds_core/debugfs.c-13-}\n--\ndrivers/net/ethernet/amd/pds_core/dev.c=276=static int pdsc_identify(struct pdsc *pdsc)\n--\ndrivers/net/ethernet/amd/pds_core/dev.c-285-\tn = snprintf(drv.driver_ver_str, sizeof(drv.driver_ver_str),\ndrivers/net/ethernet/amd/pds_core/dev.c:286:\t\t \"%s %s\", PDS_CORE_DRV_NAME, utsname()-\u003erelease);\ndrivers/net/ethernet/amd/pds_core/dev.c-287-\tif (n \u003e sizeof(drv.driver_ver_str))\n--\ndrivers/net/ethernet/amd/pds_core/main.c=218=static int pdsc_init_pf(struct pdsc *pdsc)\n--\ndrivers/net/ethernet/amd/pds_core/main.c-226-\ndrivers/net/ethernet/amd/pds_core/main.c:227:\terr = pci_request_regions(pdsc-\u003epdev, PDS_CORE_DRV_NAME);\ndrivers/net/ethernet/amd/pds_core/main.c-228-\tif (err) {\n--\ndrivers/net/ethernet/amd/pds_core/main.c-238-\t/* General workqueue and timer, but don't start timer yet */\ndrivers/net/ethernet/amd/pds_core/main.c:239:\tsnprintf(wq_name, sizeof(wq_name), \"%s.%d\", PDS_CORE_DRV_NAME, pdsc-\u003euid);\ndrivers/net/ethernet/amd/pds_core/main.c-240-\tpdsc-\u003ewq = create_singlethread_workqueue(wq_name);\n--\ndrivers/net/ethernet/amd/pds_core/main.c=509=static void pdsc_reset_done(struct pci_dev *pdev)\n--\ndrivers/net/ethernet/amd/pds_core/main.c-524-\ndrivers/net/ethernet/amd/pds_core/main.c:525:\t\terr = pci_request_regions(pdsc-\u003epdev, PDS_CORE_DRV_NAME);\ndrivers/net/ethernet/amd/pds_core/main.c-526-\t\tif (err) {\n--\ndrivers/net/ethernet/amd/pds_core/main.c=582=static struct pci_driver pdsc_driver = {\ndrivers/net/ethernet/amd/pds_core/main.c:583:\t.name = PDS_CORE_DRV_NAME,\ndrivers/net/ethernet/amd/pds_core/main.c-584-\t.id_table = pdsc_id_table,\n--\ndrivers/net/ethernet/amd/pds_core/main.c=597=static int __init pdsc_init_module(void)\ndrivers/net/ethernet/amd/pds_core/main.c-598-{\ndrivers/net/ethernet/amd/pds_core/main.c:599:\tif (strcmp(KBUILD_MODNAME, PDS_CORE_DRV_NAME))\ndrivers/net/ethernet/amd/pds_core/main.c-600-\t\treturn -EINVAL;\n--\ninclude/linux/pds/pds_common.h-8-\ninclude/linux/pds/pds_common.h:9:#define PDS_CORE_DRV_NAME\t\t\t\"pds_core\"\ninclude/linux/pds/pds_common.h-10-\n--\ninclude/linux/pds/pds_common.h=25=enum pds_core_vif_types {\n--\ninclude/linux/pds/pds_common.h-45-\ninclude/linux/pds/pds_common.h:46:#define PDS_VDPA_DEV_NAME\tPDS_CORE_DRV_NAME \".\" PDS_DEV_TYPE_VDPA_STR\ninclude/linux/pds/pds_common.h:47:#define PDS_VFIO_LM_DEV_NAME\tPDS_CORE_DRV_NAME \".\" PDS_DEV_TYPE_LM_STR \".\" PDS_DEV_TYPE_VFIO_STR\ninclude/linux/pds/pds_common.h-48-\n"
} |
| 7/2 | 2026/07/15 07:26 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 6290 output: 40 thoughts: 107 Thoughts: **Analyzing the AMD PDS Core PCI Driver in Syzkaller** Okay, so I'm looking at this PCI driver for the AMD PDS Core. The key question is, can I even get to this thing with Syzkaller? The immediate problem is Syzkaller doesn't actually emulate the AMD PDS Core hardware directly, that's a hurdle right off the bat. But wait, there's a glimmer of hope. I know Syzkaller has this virtual PCI device, `vhci`. However, I know from experience that `vhci` isn't designed to simulate *specific* hardware. It's really more of a general PCI device unless there's a *dedicated* driver that's implemented specifically for that hardware, or if it's a generic device like virtio. So, that leaves me with the main question: can this driver even *be* reached via `vhci`? The next thing to check is if the init function, `pdsc_init_pf`, is called from the probe function. That's a good starting point to see how reachable this is. |
| 8/2 | 2026/07/15 07:26 | tool | grepper |
0mArgs:{
"Expression": "pdsc_init_pf",
"PathPrefix": "drivers/net/ethernet/amd/pds_core/"
}Results: {
"Output": "drivers/net/ethernet/amd/pds_core/main.c=208=static const struct devlink_param pdsc_dl_params[] = {\n--\ndrivers/net/ethernet/amd/pds_core/main.c-217-\ndrivers/net/ethernet/amd/pds_core/main.c:218:static int pdsc_init_pf(struct pdsc *pdsc)\ndrivers/net/ethernet/amd/pds_core/main.c-219-{\n--\ndrivers/net/ethernet/amd/pds_core/main.c=337=static int pdsc_probe(struct pci_dev *pdev, const struct pci_device_id *ent)\n--\ndrivers/net/ethernet/amd/pds_core/main.c-382-\tif (is_pf)\ndrivers/net/ethernet/amd/pds_core/main.c:383:\t\terr = pdsc_init_pf(pdsc);\ndrivers/net/ethernet/amd/pds_core/main.c-384-\telse\n"
} |
| 9/2 | 2026/07/15 07:26 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 6953 output: 33 thoughts: 100 Thoughts: **Analyzing the Feasibility of Fuzzing a PCI Driver** Okay, so I'm looking at this code path, and it's being called from `pdsc_probe`. Right off the bat, my expert intuition is telling me this is a hardware-specific PCI driver. This means that, realistically, I'm not going to see this code executed in a virtualized environment like GCE or QEMU unless I've got the exact hardware in place. Therefore, my initial assessment is that `WorthFuzzing` should evaluate to false. But hold on a second... let's not be too hasty. My experience has taught me to consider all possibilities. Is there a chance this can be reached through a dummy device or some kind of software emulation? What about `hwsim` or `vhci` for `pds_core`? It's worth a quick check to rule those out before I make a final determination. I need to fully understand the accessibility of this code before making a call. |
| 10/2 | 2026/07/15 07:26 | tool | grepper |
0mArgs:{
"Expression": "pds_core",
"PathPrefix": "drivers/net/ethernet/amd/"
}Results: {
"Output": "drivers/net/ethernet/amd/Kconfig=169=config PDS_CORE\n--\ndrivers/net/ethernet/amd/Kconfig-177-\t found in\ndrivers/net/ethernet/amd/Kconfig:178:\t \u003cfile:Documentation/networking/device_drivers/ethernet/amd/pds_core.rst\u003e.\ndrivers/net/ethernet/amd/Kconfig-179-\ndrivers/net/ethernet/amd/Kconfig-180-\t To compile this driver as a module, choose M here. The module\ndrivers/net/ethernet/amd/Kconfig:181:\t will be called pds_core.\ndrivers/net/ethernet/amd/Kconfig-182-\n--\ndrivers/net/ethernet/amd/Makefile=17=obj-$(CONFIG_AMD_XGBE) += xgbe/\ndrivers/net/ethernet/amd/Makefile:18:obj-$(CONFIG_PDS_CORE) += pds_core/\n--\ndrivers/net/ethernet/amd/pds_core/Makefile-3-\ndrivers/net/ethernet/amd/pds_core/Makefile:4:obj-$(CONFIG_PDS_CORE) := pds_core.o\ndrivers/net/ethernet/amd/pds_core/Makefile-5-\ndrivers/net/ethernet/amd/pds_core/Makefile:6:pds_core-y := main.o \\\ndrivers/net/ethernet/amd/pds_core/Makefile-7-\t devlink.o \\\n--\ndrivers/net/ethernet/amd/pds_core/adminq.c=8=static int pdsc_process_notifyq(struct pdsc_qcq *qcq)\ndrivers/net/ethernet/amd/pds_core/adminq.c-9-{\ndrivers/net/ethernet/amd/pds_core/adminq.c:10:\tunion pds_core_notifyq_comp *comp;\ndrivers/net/ethernet/amd/pds_core/adminq.c-11-\tstruct pdsc *pdsc = qcq-\u003epdsc;\n--\ndrivers/net/ethernet/amd/pds_core/adminq.c=70=void pdsc_process_adminq(struct pdsc_qcq *qcq)\ndrivers/net/ethernet/amd/pds_core/adminq.c-71-{\ndrivers/net/ethernet/amd/pds_core/adminq.c:72:\tunion pds_core_adminq_comp *comp;\ndrivers/net/ethernet/amd/pds_core/adminq.c-73-\tstruct pdsc_queue *q = \u0026qcq-\u003eq;\n--\ndrivers/net/ethernet/amd/pds_core/adminq.c-124-\t/* Return the interrupt credits, one for each completion */\ndrivers/net/ethernet/amd/pds_core/adminq.c:125:\tpds_core_intr_credits(\u0026pdsc-\u003eintr_ctrl[qcq-\u003eintx],\ndrivers/net/ethernet/amd/pds_core/adminq.c-126-\t\t\t nq_work + aq_work,\n--\ndrivers/net/ethernet/amd/pds_core/adminq.c=157=static int __pdsc_adminq_post(struct pdsc *pdsc,\ndrivers/net/ethernet/amd/pds_core/adminq.c-158-\t\t\t struct pdsc_qcq *qcq,\ndrivers/net/ethernet/amd/pds_core/adminq.c:159:\t\t\t union pds_core_adminq_cmd *cmd,\ndrivers/net/ethernet/amd/pds_core/adminq.c:160:\t\t\t union pds_core_adminq_comp *comp)\ndrivers/net/ethernet/amd/pds_core/adminq.c-161-{\n--\ndrivers/net/ethernet/amd/pds_core/adminq.c-213-\ndrivers/net/ethernet/amd/pds_core/adminq.c:214:\tpds_core_dbell_ring(pdsc-\u003ekern_dbpage,\ndrivers/net/ethernet/amd/pds_core/adminq.c-215-\t\t\t q-\u003ehw_type, q-\u003edbval | q-\u003ehead_idx);\n--\ndrivers/net/ethernet/amd/pds_core/adminq.c=223=int pdsc_adminq_post(struct pdsc *pdsc,\ndrivers/net/ethernet/amd/pds_core/adminq.c:224:\t\t union pds_core_adminq_cmd *cmd,\ndrivers/net/ethernet/amd/pds_core/adminq.c:225:\t\t union pds_core_adminq_comp *comp,\ndrivers/net/ethernet/amd/pds_core/adminq.c-226-\t\t bool fast_poll)\n--\ndrivers/net/ethernet/amd/pds_core/auxbus.c-11- * @pf:\t\tptr to the PF driver's private data struct\ndrivers/net/ethernet/amd/pds_core/auxbus.c:12: * @devname:\tname that includes service into, e.g. pds_core.vDPA\ndrivers/net/ethernet/amd/pds_core/auxbus.c-13- *\n--\ndrivers/net/ethernet/amd/pds_core/auxbus.c=17=int pds_client_register(struct pdsc *pf, char *devname)\ndrivers/net/ethernet/amd/pds_core/auxbus.c-18-{\ndrivers/net/ethernet/amd/pds_core/auxbus.c:19:\tunion pds_core_adminq_comp comp = {};\ndrivers/net/ethernet/amd/pds_core/auxbus.c:20:\tunion pds_core_adminq_cmd cmd = {};\ndrivers/net/ethernet/amd/pds_core/auxbus.c-21-\tint err;\n--\ndrivers/net/ethernet/amd/pds_core/auxbus.c=57=int pds_client_unregister(struct pdsc *pf, u16 client_id)\ndrivers/net/ethernet/amd/pds_core/auxbus.c-58-{\ndrivers/net/ethernet/amd/pds_core/auxbus.c:59:\tunion pds_core_adminq_comp comp = {};\ndrivers/net/ethernet/amd/pds_core/auxbus.c:60:\tunion pds_core_adminq_cmd cmd = {};\ndrivers/net/ethernet/amd/pds_core/auxbus.c-61-\tint err;\n--\ndrivers/net/ethernet/amd/pds_core/auxbus.c=73=EXPORT_SYMBOL_GPL(pds_client_unregister);\n--\ndrivers/net/ethernet/amd/pds_core/auxbus.c-80- * @resp: ptr to buffer where answer is to be copied\ndrivers/net/ethernet/amd/pds_core/auxbus.c:81: * @flags: optional flags from pds_core_adminq_flags\ndrivers/net/ethernet/amd/pds_core/auxbus.c-82- *\n--\ndrivers/net/ethernet/amd/pds_core/auxbus.c-86- * Client sends pointers to request and response buffers\ndrivers/net/ethernet/amd/pds_core/auxbus.c:87: * Core copies request data into pds_core_client_request_cmd\ndrivers/net/ethernet/amd/pds_core/auxbus.c-88- * Core sets other fields as needed\n--\ndrivers/net/ethernet/amd/pds_core/auxbus.c=92=int pds_client_adminq_cmd(struct pds_auxiliary_dev *padev,\ndrivers/net/ethernet/amd/pds_core/auxbus.c:93:\t\t\t union pds_core_adminq_cmd *req,\ndrivers/net/ethernet/amd/pds_core/auxbus.c-94-\t\t\t size_t req_len,\ndrivers/net/ethernet/amd/pds_core/auxbus.c:95:\t\t\t union pds_core_adminq_comp *resp,\ndrivers/net/ethernet/amd/pds_core/auxbus.c-96-\t\t\t u64 flags)\ndrivers/net/ethernet/amd/pds_core/auxbus.c-97-{\ndrivers/net/ethernet/amd/pds_core/auxbus.c:98:\tunion pds_core_adminq_cmd cmd = {};\ndrivers/net/ethernet/amd/pds_core/auxbus.c-99-\tstruct pci_dev *pf_pdev;\n--\ndrivers/net/ethernet/amd/pds_core/auxbus.c=194=int pdsc_auxbus_dev_add(struct pdsc *cf, struct pdsc *pf,\ndrivers/net/ethernet/amd/pds_core/auxbus.c:195:\t\t\tenum pds_core_vif_types vt,\ndrivers/net/ethernet/amd/pds_core/auxbus.c-196-\t\t\tstruct pds_auxiliary_dev **pd_ptr)\n--\ndrivers/net/ethernet/amd/pds_core/core.c=28=void pdsc_intr_free(struct pdsc *pdsc, int index)\n--\ndrivers/net/ethernet/amd/pds_core/core.c-42-\ndrivers/net/ethernet/amd/pds_core/core.c:43:\tpds_core_intr_mask(\u0026pdsc-\u003eintr_ctrl[index], PDS_CORE_INTR_MASK_SET);\ndrivers/net/ethernet/amd/pds_core/core.c:44:\tpds_core_intr_clean(\u0026pdsc-\u003eintr_ctrl[index]);\ndrivers/net/ethernet/amd/pds_core/core.c-45-\n--\ndrivers/net/ethernet/amd/pds_core/core.c=51=int pdsc_intr_alloc(struct pdsc *pdsc, char *name,\n--\ndrivers/net/ethernet/amd/pds_core/core.c-67-\ndrivers/net/ethernet/amd/pds_core/core.c:68:\tpds_core_intr_clean_flags(\u0026pdsc-\u003eintr_ctrl[index],\ndrivers/net/ethernet/amd/pds_core/core.c-69-\t\t\t\t PDS_CORE_INTR_CRED_RESET_COALESCE);\n--\ndrivers/net/ethernet/amd/pds_core/core.c-86-\t/* Init the device's intr mask */\ndrivers/net/ethernet/amd/pds_core/core.c:87:\tpds_core_intr_clean(\u0026pdsc-\u003eintr_ctrl[index]);\ndrivers/net/ethernet/amd/pds_core/core.c:88:\tpds_core_intr_mask_assert(\u0026pdsc-\u003eintr_ctrl[index], 1);\ndrivers/net/ethernet/amd/pds_core/core.c:89:\tpds_core_intr_mask(\u0026pdsc-\u003eintr_ctrl[index], PDS_CORE_INTR_MASK_SET);\ndrivers/net/ethernet/amd/pds_core/core.c-90-\n--\ndrivers/net/ethernet/amd/pds_core/core.c=316=static int pdsc_core_init(struct pdsc *pdsc)\ndrivers/net/ethernet/amd/pds_core/core.c-317-{\ndrivers/net/ethernet/amd/pds_core/core.c:318:\tunion pds_core_dev_comp comp = {};\ndrivers/net/ethernet/amd/pds_core/core.c:319:\tunion pds_core_dev_cmd cmd = {\ndrivers/net/ethernet/amd/pds_core/core.c-320-\t\t.init.opcode = PDS_CORE_CMD_INIT,\ndrivers/net/ethernet/amd/pds_core/core.c-321-\t};\ndrivers/net/ethernet/amd/pds_core/core.c:322:\tstruct pds_core_dev_init_data_out cido;\ndrivers/net/ethernet/amd/pds_core/core.c:323:\tstruct pds_core_dev_init_data_in cidi;\ndrivers/net/ethernet/amd/pds_core/core.c-324-\tu32 dbid_count;\n--\ndrivers/net/ethernet/amd/pds_core/core.c-333-\t\t\t numdescs,\ndrivers/net/ethernet/amd/pds_core/core.c:334:\t\t\t sizeof(union pds_core_adminq_cmd),\ndrivers/net/ethernet/amd/pds_core/core.c:335:\t\t\t sizeof(union pds_core_adminq_comp),\ndrivers/net/ethernet/amd/pds_core/core.c-336-\t\t\t 0, \u0026pdsc-\u003eadminqcq);\n--\ndrivers/net/ethernet/amd/pds_core/core.c-342-\t\t\t PDSC_NOTIFYQ_LENGTH,\ndrivers/net/ethernet/amd/pds_core/core.c:343:\t\t\t sizeof(struct pds_core_notifyq_cmd),\ndrivers/net/ethernet/amd/pds_core/core.c:344:\t\t\t sizeof(union pds_core_notifyq_comp),\ndrivers/net/ethernet/amd/pds_core/core.c-345-\t\t\t 0, \u0026pdsc-\u003enotifyqcq);\n--\ndrivers/net/ethernet/amd/pds_core/core.c=414=static int pdsc_viftypes_init(struct pdsc *pdsc)\ndrivers/net/ethernet/amd/pds_core/core.c-415-{\ndrivers/net/ethernet/amd/pds_core/core.c:416:\tenum pds_core_vif_types vt;\ndrivers/net/ethernet/amd/pds_core/core.c-417-\n--\ndrivers/net/ethernet/amd/pds_core/core.c=499=int pdsc_start(struct pdsc *pdsc)\ndrivers/net/ethernet/amd/pds_core/core.c-500-{\ndrivers/net/ethernet/amd/pds_core/core.c:501:\tpds_core_intr_mask(\u0026pdsc-\u003eintr_ctrl[pdsc-\u003eadminqcq.intx],\ndrivers/net/ethernet/amd/pds_core/core.c-502-\t\t\t PDS_CORE_INTR_MASK_CLEAR);\n--\ndrivers/net/ethernet/amd/pds_core/core.c=507=void pdsc_stop(struct pdsc *pdsc)\n--\ndrivers/net/ethernet/amd/pds_core/core.c-516-\t\tif (pdsc-\u003eintr_info[i].vector)\ndrivers/net/ethernet/amd/pds_core/core.c:517:\t\t\tpds_core_intr_mask(\u0026pdsc-\u003eintr_ctrl[i],\ndrivers/net/ethernet/amd/pds_core/core.c-518-\t\t\t\t\t PDS_CORE_INTR_MASK_SET);\n--\ndrivers/net/ethernet/amd/pds_core/core.c=539=void pdsc_fw_down(struct pdsc *pdsc)\ndrivers/net/ethernet/amd/pds_core/core.c-540-{\ndrivers/net/ethernet/amd/pds_core/core.c:541:\tunion pds_core_notifyq_comp reset_event = {\ndrivers/net/ethernet/amd/pds_core/core.c-542-\t\t.reset.ecode = cpu_to_le16(PDS_EVENT_RESET),\n--\ndrivers/net/ethernet/amd/pds_core/core.c=565=void pdsc_fw_up(struct pdsc *pdsc)\ndrivers/net/ethernet/amd/pds_core/core.c-566-{\ndrivers/net/ethernet/amd/pds_core/core.c:567:\tunion pds_core_notifyq_comp reset_event = {\ndrivers/net/ethernet/amd/pds_core/core.c-568-\t\t.reset.ecode = cpu_to_le16(PDS_EVENT_RESET),\n--\ndrivers/net/ethernet/amd/pds_core/core.h-10-#include \u003clinux/pds/pds_common.h\u003e\ndrivers/net/ethernet/amd/pds_core/core.h:11:#include \u003clinux/pds/pds_core_if.h\u003e\ndrivers/net/ethernet/amd/pds_core/core.h-12-#include \u003clinux/pds/pds_adminq.h\u003e\n--\ndrivers/net/ethernet/amd/pds_core/core.h=49=struct pdsc_queue {\n--\ndrivers/net/ethernet/amd/pds_core/core.h-62-\t\tvoid *base;\ndrivers/net/ethernet/amd/pds_core/core.h:63:\t\tstruct pds_core_admin_cmd *adminq;\ndrivers/net/ethernet/amd/pds_core/core.h-64-\t};\n--\ndrivers/net/ethernet/amd/pds_core/core.h=154=struct pdsc {\n--\ndrivers/net/ethernet/amd/pds_core/core.h-177-\tstruct pdsc_devinfo dev_info;\ndrivers/net/ethernet/amd/pds_core/core.h:178:\tstruct pds_core_dev_identity dev_ident;\ndrivers/net/ethernet/amd/pds_core/core.h-179-\tunsigned int nintrs;\n--\ndrivers/net/ethernet/amd/pds_core/core.h-188-\trefcount_t adminq_refcnt;\ndrivers/net/ethernet/amd/pds_core/core.h:189:\tstruct pds_core_dev_info_regs __iomem *info_regs;\ndrivers/net/ethernet/amd/pds_core/core.h:190:\tstruct pds_core_dev_cmd_regs __iomem *cmd_regs;\ndrivers/net/ethernet/amd/pds_core/core.h:191:\tstruct pds_core_intr __iomem *intr_ctrl;\ndrivers/net/ethernet/amd/pds_core/core.h-192-\tu64 __iomem *intr_status;\n--\ndrivers/net/ethernet/amd/pds_core/core.h-203-\ndrivers/net/ethernet/amd/pds_core/core.h:204:/** enum pds_core_dbell_bits - bitwise composition of dbell values.\ndrivers/net/ethernet/amd/pds_core/core.h-205- *\n--\ndrivers/net/ethernet/amd/pds_core/core.h-220- */\ndrivers/net/ethernet/amd/pds_core/core.h:221:enum pds_core_dbell_bits {\ndrivers/net/ethernet/amd/pds_core/core.h-222-\tPDS_CORE_DBELL_QID_MASK\t\t= 0xffffff,\n--\ndrivers/net/ethernet/amd/pds_core/core.h-241-\ndrivers/net/ethernet/amd/pds_core/core.h:242:static inline void pds_core_dbell_ring(u64 __iomem *db_page,\ndrivers/net/ethernet/amd/pds_core/core.h:243:\t\t\t\t enum pds_core_logical_qtype qtype,\ndrivers/net/ethernet/amd/pds_core/core.h-244-\t\t\t\t u64 val)\n--\ndrivers/net/ethernet/amd/pds_core/core.h=277=void pdsc_debugfs_del_qcq(struct pdsc_qcq *qcq);\ndrivers/net/ethernet/amd/pds_core/core.h-278-\ndrivers/net/ethernet/amd/pds_core/core.h:279:int pdsc_err_to_errno(enum pds_core_status_code code);\ndrivers/net/ethernet/amd/pds_core/core.h-280-bool pdsc_is_fw_running(struct pdsc *pdsc);\ndrivers/net/ethernet/amd/pds_core/core.h=281=bool pdsc_is_fw_good(struct pdsc *pdsc);\ndrivers/net/ethernet/amd/pds_core/core.h:282:int pdsc_devcmd(struct pdsc *pdsc, union pds_core_dev_cmd *cmd,\ndrivers/net/ethernet/amd/pds_core/core.h:283:\t\tunion pds_core_dev_comp *comp, int max_seconds);\ndrivers/net/ethernet/amd/pds_core/core.h:284:int pdsc_devcmd_locked(struct pdsc *pdsc, union pds_core_dev_cmd *cmd,\ndrivers/net/ethernet/amd/pds_core/core.h:285:\t\t union pds_core_dev_comp *comp, int max_seconds);\ndrivers/net/ethernet/amd/pds_core/core.h-286-int pdsc_devcmd_init(struct pdsc *pdsc);\n--\ndrivers/net/ethernet/amd/pds_core/core.h=308=int pdsc_auxbus_dev_add(struct pdsc *cf, struct pdsc *pf,\ndrivers/net/ethernet/amd/pds_core/core.h:309:\t\t\tenum pds_core_vif_types vt,\ndrivers/net/ethernet/amd/pds_core/core.h-310-\t\t\tstruct pds_auxiliary_dev **pd_ptr);\n--\ndrivers/net/ethernet/amd/pds_core/debugfs.c=33=static int identity_show(struct seq_file *seq, void *v)\ndrivers/net/ethernet/amd/pds_core/debugfs.c-34-{\ndrivers/net/ethernet/amd/pds_core/debugfs.c:35:\tstruct pds_core_dev_identity *ident;\ndrivers/net/ethernet/amd/pds_core/debugfs.c-36-\tstruct pdsc *pdsc = seq-\u003eprivate;\n--\ndrivers/net/ethernet/amd/pds_core/dev.c-9-\ndrivers/net/ethernet/amd/pds_core/dev.c:10:int pdsc_err_to_errno(enum pds_core_status_code code)\ndrivers/net/ethernet/amd/pds_core/dev.c-11-{\n--\ndrivers/net/ethernet/amd/pds_core/dev.c=129=static int pdsc_devcmd_wait(struct pdsc *pdsc, u8 opcode, int max_seconds)\n--\ndrivers/net/ethernet/amd/pds_core/dev.c-189-\ndrivers/net/ethernet/amd/pds_core/dev.c:190:int pdsc_devcmd_locked(struct pdsc *pdsc, union pds_core_dev_cmd *cmd,\ndrivers/net/ethernet/amd/pds_core/dev.c:191:\t\t union pds_core_dev_comp *comp, int max_seconds)\ndrivers/net/ethernet/amd/pds_core/dev.c-192-{\n--\ndrivers/net/ethernet/amd/pds_core/dev.c-209-\ndrivers/net/ethernet/amd/pds_core/dev.c:210:int pdsc_devcmd(struct pdsc *pdsc, union pds_core_dev_cmd *cmd,\ndrivers/net/ethernet/amd/pds_core/dev.c:211:\t\tunion pds_core_dev_comp *comp, int max_seconds)\ndrivers/net/ethernet/amd/pds_core/dev.c-212-{\n--\ndrivers/net/ethernet/amd/pds_core/dev.c=222=int pdsc_devcmd_init(struct pdsc *pdsc)\ndrivers/net/ethernet/amd/pds_core/dev.c-223-{\ndrivers/net/ethernet/amd/pds_core/dev.c:224:\tunion pds_core_dev_comp comp = {};\ndrivers/net/ethernet/amd/pds_core/dev.c:225:\tunion pds_core_dev_cmd cmd = {\ndrivers/net/ethernet/amd/pds_core/dev.c-226-\t\t.opcode = PDS_CORE_CMD_INIT,\n--\ndrivers/net/ethernet/amd/pds_core/dev.c=232=int pdsc_devcmd_reset(struct pdsc *pdsc)\ndrivers/net/ethernet/amd/pds_core/dev.c-233-{\ndrivers/net/ethernet/amd/pds_core/dev.c:234:\tunion pds_core_dev_comp comp = {};\ndrivers/net/ethernet/amd/pds_core/dev.c:235:\tunion pds_core_dev_cmd cmd = {\ndrivers/net/ethernet/amd/pds_core/dev.c-236-\t\t.reset.opcode = PDS_CORE_CMD_RESET,\n--\ndrivers/net/ethernet/amd/pds_core/dev.c=245=static int pdsc_devcmd_identify_locked(struct pdsc *pdsc)\ndrivers/net/ethernet/amd/pds_core/dev.c-246-{\ndrivers/net/ethernet/amd/pds_core/dev.c:247:\tunion pds_core_dev_comp comp = {};\ndrivers/net/ethernet/amd/pds_core/dev.c:248:\tunion pds_core_dev_cmd cmd = {\ndrivers/net/ethernet/amd/pds_core/dev.c-249-\t\t.identify.opcode = PDS_CORE_CMD_IDENTIFY,\n--\ndrivers/net/ethernet/amd/pds_core/dev.c=276=static int pdsc_identify(struct pdsc *pdsc)\ndrivers/net/ethernet/amd/pds_core/dev.c-277-{\ndrivers/net/ethernet/amd/pds_core/dev.c:278:\tstruct pds_core_drv_identity drv = {};\ndrivers/net/ethernet/amd/pds_core/dev.c-279-\tsize_t sz;\n--\ndrivers/net/ethernet/amd/pds_core/devlink.c=102=int pdsc_dl_info_get(struct devlink *dl, struct devlink_info_req *req,\n--\ndrivers/net/ethernet/amd/pds_core/devlink.c-104-{\ndrivers/net/ethernet/amd/pds_core/devlink.c:105:\tunion pds_core_dev_cmd cmd = {\ndrivers/net/ethernet/amd/pds_core/devlink.c-106-\t\t.fw_control.opcode = PDS_CORE_CMD_FW_CONTROL,\n--\ndrivers/net/ethernet/amd/pds_core/devlink.c-108-\t};\ndrivers/net/ethernet/amd/pds_core/devlink.c:109:\tstruct pds_core_fw_list_info fw_list = {};\ndrivers/net/ethernet/amd/pds_core/devlink.c-110-\tstruct pdsc *pdsc = devlink_priv(dl);\ndrivers/net/ethernet/amd/pds_core/devlink.c:111:\tunion pds_core_dev_comp comp;\ndrivers/net/ethernet/amd/pds_core/devlink.c-112-\tchar buf[32];\n--\ndrivers/net/ethernet/amd/pds_core/fw.c=17=static int pdsc_devcmd_fw_download_locked(struct pdsc *pdsc, u64 addr,\n--\ndrivers/net/ethernet/amd/pds_core/fw.c-19-{\ndrivers/net/ethernet/amd/pds_core/fw.c:20:\tunion pds_core_dev_cmd cmd = {\ndrivers/net/ethernet/amd/pds_core/fw.c-21-\t\t.fw_download.opcode = PDS_CORE_CMD_FW_DOWNLOAD,\n--\ndrivers/net/ethernet/amd/pds_core/fw.c-25-\t};\ndrivers/net/ethernet/amd/pds_core/fw.c:26:\tunion pds_core_dev_comp comp;\ndrivers/net/ethernet/amd/pds_core/fw.c-27-\n--\ndrivers/net/ethernet/amd/pds_core/fw.c=31=static int pdsc_devcmd_fw_install(struct pdsc *pdsc)\ndrivers/net/ethernet/amd/pds_core/fw.c-32-{\ndrivers/net/ethernet/amd/pds_core/fw.c:33:\tunion pds_core_dev_cmd cmd = {\ndrivers/net/ethernet/amd/pds_core/fw.c-34-\t\t.fw_control.opcode = PDS_CORE_CMD_FW_CONTROL,\n--\ndrivers/net/ethernet/amd/pds_core/fw.c-36-\t};\ndrivers/net/ethernet/amd/pds_core/fw.c:37:\tunion pds_core_dev_comp comp;\ndrivers/net/ethernet/amd/pds_core/fw.c-38-\tint err;\n--\ndrivers/net/ethernet/amd/pds_core/fw.c=47=static int pdsc_devcmd_fw_activate(struct pdsc *pdsc,\ndrivers/net/ethernet/amd/pds_core/fw.c:48:\t\t\t\t enum pds_core_fw_slot slot)\ndrivers/net/ethernet/amd/pds_core/fw.c-49-{\ndrivers/net/ethernet/amd/pds_core/fw.c:50:\tunion pds_core_dev_cmd cmd = {\ndrivers/net/ethernet/amd/pds_core/fw.c-51-\t\t.fw_control.opcode = PDS_CORE_CMD_FW_CONTROL,\n--\ndrivers/net/ethernet/amd/pds_core/fw.c-54-\t};\ndrivers/net/ethernet/amd/pds_core/fw.c:55:\tunion pds_core_dev_comp comp;\ndrivers/net/ethernet/amd/pds_core/fw.c-56-\n--\ndrivers/net/ethernet/amd/pds_core/fw.c=60=static int pdsc_fw_status_long_wait(struct pdsc *pdsc,\n--\ndrivers/net/ethernet/amd/pds_core/fw.c-65-{\ndrivers/net/ethernet/amd/pds_core/fw.c:66:\tunion pds_core_dev_cmd cmd = {\ndrivers/net/ethernet/amd/pds_core/fw.c-67-\t\t.fw_control.opcode = PDS_CORE_CMD_FW_CONTROL,\n--\ndrivers/net/ethernet/amd/pds_core/fw.c-69-\t};\ndrivers/net/ethernet/amd/pds_core/fw.c:70:\tunion pds_core_dev_comp comp;\ndrivers/net/ethernet/amd/pds_core/fw.c-71-\tunsigned long start_time;\n--\ndrivers/net/ethernet/amd/pds_core/fw.c=98=int pdsc_firmware_update(struct pdsc *pdsc, const struct firmware *fw,\n--\ndrivers/net/ethernet/amd/pds_core/fw.c-124-\tnext_interval = 0;\ndrivers/net/ethernet/amd/pds_core/fw.c:125:\tdata_addr = offsetof(struct pds_core_dev_cmd_regs, data);\ndrivers/net/ethernet/amd/pds_core/fw.c-126-\twhile (offset \u003c fw-\u003esize) {\n"
} |
| 11/2 | 2026/07/15 07:26 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 15566 output: 26 thoughts: 509 Thoughts: **Analyzing the Fuzzing Potential of `PDS_CORE`** Okay, so I'm looking at this `PDS_CORE` driver, and it's pretty clear it's a PCI driver designed for AMD Pensando Core hardware. The key issue here is that there's no software emulation for it in the kernel. This means it's not going to be accessible within a typical virtualized environment, like GCE or QEMU, unless you've got the actual hardware present. My initial thought was, "Could it be reached via something like `vhci` or a `dummy` interface?" But no, it's just a standard PCI driver (`pci_driver pdsc_driver`). Unless a PCI device with the right vendor and device ID is present, the driver's `probe` function won't even be triggered. Then I wondered about Syzkaller. Does Syzkaller provide some generic PCI device injection mechanism, maybe using `vhci` (Virtual Host Controller Interface) or something similar, like with `syz_kvm_setup_cpu` or perhaps a `syz_pci_device` call? No, it doesn't. Syzkaller doesn't have a generic PCI emulator capable of mimicking the complexities of arbitrary hardware registers. While Syzkaller has evolved to provide some fuzzing support for PCI devices, it does not do so in a way that allows us to target `PDS_CORE`. I tried to recall if there were any recent additions to Syzkaller regarding PCI fuzzing through `vhci` or `vfio`, but the answer is no. Syzkaller has `syz_genetlink`, and I know it has calls like `syz_usb_connect` for USB, `syz_80211_join_ibss` for Wi-Fi, but I am familiar with Syzkaller, and I'm certain that the PCI side has no equivalent ability to emulate arbitrary PCI hardware. So the bottom line is: The code isn't reachable in a standard virtualized environment. Without software emulation, this driver is effectively locked behind a hardware requirement. Just to be absolutely sure, I'll quickly double-check for any sign of `pds_core` emulation anywhere. I'll do a quick grep and make sure there isn't anything hiding in some obscure corner of the codebase. Yep, I grepped for `pds_core` and found nothing resembling emulation. Therefore, my final conclusion is `WorthFuzzing: false`. My reasoning is that this is a hardware-specific PCI driver that lacks software emulation. It's simply unreachable in virtualized environments like GCE or QEMU. I'll check if `pdsc_init_pf` is called from anywhere else. |
| 12/2 | 2026/07/15 07:26 | tool | grepper |
0mArgs:{
"Expression": "pdsc_init_pf",
"PathPrefix": ""
}Results: {
"Output": "drivers/net/ethernet/amd/pds_core/main.c=208=static const struct devlink_param pdsc_dl_params[] = {\n--\ndrivers/net/ethernet/amd/pds_core/main.c-217-\ndrivers/net/ethernet/amd/pds_core/main.c:218:static int pdsc_init_pf(struct pdsc *pdsc)\ndrivers/net/ethernet/amd/pds_core/main.c-219-{\n--\ndrivers/net/ethernet/amd/pds_core/main.c=337=static int pdsc_probe(struct pci_dev *pdev, const struct pci_device_id *ent)\n--\ndrivers/net/ethernet/amd/pds_core/main.c-382-\tif (is_pf)\ndrivers/net/ethernet/amd/pds_core/main.c:383:\t\terr = pdsc_init_pf(pdsc);\ndrivers/net/ethernet/amd/pds_core/main.c-384-\telse\n"
} |
| 13/2 | 2026/07/15 07:26 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 16979 output: 24 thoughts: 30 Thoughts: Okay, here's my interpretation of those thoughts, tailored for an expert audience, presented in the first person: **Decoding the Driver Probe** Alright, let's break this down. My mind is immediately drawn to the call stack. The crucial bit here is that this particular piece of logic is *exclusively* invoked from `pdsc_probe`. That's the entry point. And `pdsc_probe`, as I'm reminded, is the probe function defined within the `pdsc_driver` structure. Essentially, we're looking at the core of the driver's initialization sequence, the point where it attempts to identify and configure the target device. This is where the magic (or the troubleshooting) begins. Knowing that this is the sole entry point provides critical context for debugging or auditing the driver's behavior. We know exactly where to look for the initial triggers and dependencies. Any issues in here are foundational; they'll cascade outwards. |
| 14/2 | 2026/07/15 07:26 | tool | grepper |
0mArgs:{
"Expression": "pdsc_probe",
"PathPrefix": ""
}Results: {
"Output": "drivers/net/ethernet/amd/pds_core/main.c=335=static DEFINE_IDA(pdsc_ida);\ndrivers/net/ethernet/amd/pds_core/main.c-336-\ndrivers/net/ethernet/amd/pds_core/main.c:337:static int pdsc_probe(struct pci_dev *pdev, const struct pci_device_id *ent)\ndrivers/net/ethernet/amd/pds_core/main.c-338-{\n--\ndrivers/net/ethernet/amd/pds_core/main.c=582=static struct pci_driver pdsc_driver = {\n--\ndrivers/net/ethernet/amd/pds_core/main.c-584-\t.id_table = pdsc_id_table,\ndrivers/net/ethernet/amd/pds_core/main.c:585:\t.probe = pdsc_probe,\ndrivers/net/ethernet/amd/pds_core/main.c-586-\t.remove = pdsc_remove,\n"
} |
| 15/2 | 2026/07/15 07:26 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 17513 output: 94 thoughts: 48 Thoughts: **My Assessment of the PCI Driver Probe Function** Okay, so I'm looking at this code and it's pretty clear this is solely a PCI driver probe function. There's no emulation of the AMD Pensando Core hardware in any virtualized environments. That means this specific code path is completely unreachable if we're running in a VM. Given that limitation, I'm going to set `WorthFuzzing: false`. There's no point in spending resources trying to fuzz something that can't be triggered in the target environment. It's simply not worth the effort. I need to focus my energy on paths that are actually exposed. |
| 16/2 | 2026/07/15 07:26 | tool | set-results |
0mArgs:{
"EnableConfigs": [],
"FocusSymbols": [],
"Reasoning": "The patch modifies the initialization path of the AMD PDS Core PCI driver (`pdsc_init_pf`). This is a hardware-specific PCI driver that lacks software emulation in the kernel, meaning its probe and initialization paths are unreachable in virtualized environments like GCE or QEMU used by syzkaller.",
"WorthFuzzing": false
}Results: {
"EnableConfigs": null,
"FocusSymbols": [],
"Reasoning": "The patch modifies the initialization path of the AMD PDS Core PCI driver (`pdsc_init_pf`). This is a hardware-specific PCI driver that lacks software emulation in the kernel, meaning its probe and initialization paths are unreachable in virtualized environments like GCE or QEMU used by syzkaller.",
"WorthFuzzing": false
} |
| Total Calls | Total Tokens | Avg Tokens | Total Duration (Seconds) | Avg Duration (Seconds) |
|---|
| Total Calls | Total Duration (Seconds) | Avg Duration (Seconds) |
|---|