> diff --git a/drivers/gpu/drm/panel/bpf/progs/Makefile
> b/drivers/gpu/drm/panel/bpf/progs/Makefile
> new file mode 100644
> index 000000000000..74190ee618ab
> --- /dev/null
> +++ b/drivers/gpu/drm/panel/bpf/progs/Makefile
[ ... ]
> @@ -0,0 +1,93 @@
> +VMLINUX_BTF_PATHS ?= $(if $(O),$(O)/vmlinux) \
> + $(if $(KBUILD_OUTPUT),$(KBUILD_OUTPUT)/vmlinux) \
> + ../../../../../../vmlinux \
> + /sys/kernel/btf/vmlinux \
> + /boot/vmlinux-$(shell uname -r)
> +VMLINUX_BTF ?= $(abspath $(firstword $(wildcard $(VMLINUX_BTF_PATHS))))
[ ... ]
> +vmlinux.h: $(VMLINUX_BTF) $(BPFTOOL) | $(INCLUDE_DIR)
> +ifeq ($(VMLINUX_H),)
> + $(call msg,GEN,,$@)
> + $(Q)$(BPFTOOL) btf dump file $(VMLINUX_BTF) format c > $@
> +else
> + $(call msg,CP,,$@)
> + $(Q)cp "$(VMLINUX_H)" $@
> +endif
Does this build work when CONFIG_DRM_PANEL_BPF_MIPI_DSI=m?
The Makefile generates vmlinux.h from vmlinux BTF only. The BPF programs
need types defined in the panel driver: struct drm_panel_dsi_bpf_ops,
struct panel_bpf_mipi_dsi_ctx, and the panel_bpf_mipi_dsi_supply and
panel_bpf_mipi_dsi_gpio enums.
DRM_PANEL_BPF_MIPI_DSI is tristate and becomes =m when CONFIG_DRM=m
(the case in arch/arm64/configs/defconfig, the Raspberry Pi target).
With =m, these types exist only in the module's split BTF at
/sys/kernel/btf/panel_bpf_mipi_dsi, not in vmlinux BTF.
panel-bpf-mipi-dsi.h declares PANEL_BPF_MIPI_DSI_OPS(x) which expands
to "struct drm_panel_dsi_bpf_ops x", and uses PANEL_BPF_MIPI_DSI_SUPPLY_*
and PANEL_BPF_MIPI_DSI_GPIO_* enum values. Without the module BTF dump,
the struct is incomplete and the enums are undeclared. The panel programs
added later in the series would fail to compile.
The commit message says the Makefile follows drivers/hid/bpf/progs/, but
that works because HID_BPF is bool and its types always land in vmlinux
BTF.
You could either dump the module BTF:
bpftool btf dump file /sys/kernel/btf/panel_bpf_mipi_dsi \
-B $(VMLINUX_BTF) format c >> vmlinux.h
or define the ABI types directly in panel-bpf-mipi-dsi.h, as the bpf_testmod
selftests do.
> diff --git a/drivers/gpu/drm/panel/bpf/progs/panel-bpf-mipi-dsi.h
> b/drivers/gpu/drm/panel/bpf/progs/panel-bpf-mipi-dsi.h
> new file mode 100644
> index 000000000000..e2b03afef2c8
> --- /dev/null
> +++ b/drivers/gpu/drm/panel/bpf/progs/panel-bpf-mipi-dsi.h
[ ... ]
> diff --git a/include/drm/drm_panel_dsi_bpf.h b/include/drm/drm_panel_dsi_bpf.h
> deleted file mode 100644
> index 02d4707fd0a0..000000000000
> --- a/include/drm/drm_panel_dsi_bpf.h
> +++ /dev/null
> @@ -1,50 +0,0 @@
> -/* SPDX-License-Identifier: GPL-2.0 */
> -#ifndef __DRM_PANEL_DSI_BPF_H__
> -#define __DRM_PANEL_DSI_BPF_H__
> -
> -#include <linux/bpf.h>
> -
> -struct mipi_dsi_device;
> -struct drm_panel;
> -
> -#define DSI_BPF_PANEL_ID_LEN 64
> -
> -/**
> - * struct dsi_bpf_ctx - Context passed to BPF panel programs
> - * @panel: The drm_panel this callback operates on (private)
> - */
> -struct dsi_bpf_ctx {
> - struct drm_panel *panel;
> -};
> -
> -/**
> - * struct drm_panel_dsi_bpf_ops - BPF struct_ops for MIPI-DSI panels
> - * @panel_id: Device identifier for matching. On DT systems this holds
> - * the panel's compatible string. Firmware-agnostic to allow future
> - * ACPI support. Written before load, immutable after.
> - * @panel_prepare: Called to power on the panel and send init commands.
> - * Must enable regulators, toggle GPIOs, and send the DSI init
> - * sequence. Sleepable.
> - * @panel_unprepare: Called to power off the panel. Must send shutdown
> - * commands, assert reset, and disable regulators. Sleepable.
> - * @panel_enable: Optional. Called after video stream starts, for panels
> - * that need post-video-start DSI commands. Sleepable.
> - * @panel_disable: Optional. Called before video stream stops. Sleepable.
> - * @set_brightness: Optional. Called to set backlight brightness via DSI
> - * commands. Sleepable.
> - */
> -struct drm_panel_dsi_bpf_ops {
> - char panel_id[DSI_BPF_PANEL_ID_LEN];
> -
> - /* private: internal bookkeeping */
> - struct drm_panel *panel;
> -
> - /* public: */
> - int (*panel_prepare)(struct dsi_bpf_ctx *ctx);
> - int (*panel_unprepare)(struct dsi_bpf_ctx *ctx);
> - int (*panel_enable)(struct dsi_bpf_ctx *ctx);
> - int (*panel_disable)(struct dsi_bpf_ctx *ctx);
> - int (*set_brightness)(struct dsi_bpf_ctx *ctx, u32 brightness);
> -};
> -
> -#endif /* __DRM_PANEL_DSI_BPF_H__ */
The commit message describes adding the BPF-side header and Makefile, but
doesn't mention removing include/drm/drm_panel_dsi_bpf.h. The header was
added one patch earlier by 095e3b42d5ca and contains a stale ABI definition
(struct drm_panel_dsi_bpf_ops with dsi_bpf_ctx) that conflicts with the
real definition in drivers/gpu/drm/panel/bpf/panel-bpf-mipi-dsi.h.
Why is the file being removed as a side effect here rather than being
excluded from the earlier patch?
---
AI reviewed your patch. Please fix the bug or email reply why it's not a bug.
See: https://github.com/kernel-patches/vmtest/blob/master/ci/claude/README.md
CI run summary: https://github.com/kernel-patches/bpf/actions/runs/36644629998