# Auto-detect NVIDIA P2P support based on Module.symvers presence.
# GPUDirect RDMA is enabled only when the NVIDIA kernel module is installed.
# 查找 Module.symvers 的多个可能路径（按优先级）：
#   1. /usr/src/nvidia-<ver>/nvidia/Module.symvers  (版本精确匹配，优先)
#   2. /usr/src/nvidia-*/nvidia/Module.symvers      (通配符回退)
#   3. /var/lib/dkms/nvidia/*/build/Module.symvers  (DKMS构建临时目录，通常被清理)
_NV_KO  := $(shell find /lib/modules/$$(uname -r) -name "nvidia.ko" 2>/dev/null | head -1)
_NV_VER := $(and $(_NV_KO),$(shell modinfo -F version $(_NV_KO) 2>/dev/null))
NV_SYMVERS := $(firstword $(wildcard \
    $(if $(_NV_VER),/usr/src/nvidia-$(_NV_VER)/nvidia/Module.symvers) \
    /usr/src/nvidia-*/nvidia/Module.symvers \
    /var/lib/dkms/nvidia/*/build/Module.symvers))
ifneq ($(NV_SYMVERS),)
    ccflags-y := -Wall -fno-exceptions -std=gnu99
    KBUILD_EXTRA_SYMBOLS := $(NV_SYMVERS)
    $(info GPUDirect RDMA enabled, NVIDIA symvers: $(NV_SYMVERS))
else
    ccflags-y := -Wall -fno-exceptions -std=gnu99
    $(info GPUDirect RDMA disabled: NVIDIA Module.symvers not found, building without P2P support)
endif

# DMA-BUF import support (for Hygon/AMD GPU P2P).
#
# IMPORTANT: NVIDIA P2P and DMA-BUF are mutually exclusive at the kernel level.
#   - nvidia_p2p_* symbols are EXPORT_SYMBOL (proprietary)
#   - dma_buf_* symbols are EXPORT_SYMBOL_GPL (GPL-only)
# Kernel rule: once a module uses proprietary symbols, it is tainted with
# TAINT_PROPRIETARY_MODULE and can no longer use GPL-only symbols.
# Therefore: if NVIDIA P2P is enabled, DMA-BUF is automatically disabled.
#
# MODULE_IMPORT_NS(DMA_BUF) in cxp_mod.c handles the namespace requirement
# on kernels >= 5.16 (where dma_buf_* symbols moved to the DMA_BUF namespace).
#
# Override: make USE_DMA_BUF=1  (force-enable, only works without NVIDIA P2P)

_DMA_BUF_IN_KALLSYMS := $(shell grep -q 'dma_buf_attach' /proc/kallsyms 2>/dev/null && echo 1 || echo 0)

ifneq ($(NV_SYMVERS),)
    # NVIDIA P2P enabled → DMA-BUF incompatible (GPL vs proprietary taint)
    USE_DMA_BUF ?= 0
    $(info DMA-BUF: disabled (incompatible with NVIDIA P2P proprietary symbols))
else ifeq ($(_DMA_BUF_IN_KALLSYMS),1)
    USE_DMA_BUF ?= 1
    $(info DMA-BUF import support enabled)
else
    USE_DMA_BUF ?= 0
    $(info DMA-BUF: symbols not exported by kernel, support disabled)
endif

ifeq ($(USE_DMA_BUF),1)
    ccflags-y += -DUSE_DMA_BUF
endif

TARGET_MODULE:= vulcan_cxp_board

M ?=.
obj-m := $(TARGET_MODULE).o

$(TARGET_MODULE)-y :=   dbg.o \
	 		cxp_mod.o  \
			cxp_cdev.o \
			cxp_isr.o \
			cxp_ioctl.o

KVER ?= $(shell uname -r)
KDIR ?= /lib/modules/$(KVER)/build
PWD := $(shell pwd)
default:
	$(MAKE) -C $(KDIR) M=$(PWD) KBUILD_EXTRA_SYMBOLS="$(KBUILD_EXTRA_SYMBOLS)" modules

clean:
	$(MAKE) -C $(KDIR) M=$(PWD) clean


