#mem_alloc_method=0 : MEM=
#mem_alloc_method=1 : BigPhysArea
#mem_alloc_method=2 : Dynamic

# Test passing $(1) to $(CC). If $(CC) succeeds, then echo $(1).
# Copy from https://github.com/NVIDIA/open-gpu-kernel-modules/blob/main/utils.mk
TEST_CC_ARG = \
 $(shell $(CC) -c -x c /dev/null -Werror $(1) -o /dev/null > /dev/null 2>&1 && \
   echo $(1))

SHELL := /bin/bash

DRIVERNAME = delta-gwy

BINARY-OBJS += GatewayDrvBoard.o
BINARY-OBJS += MailboxMngr.o
BINARY-OBJS += BufMngr.o DMABufMngr.o DMAMngr.o PropertiesMngr.o ShadowRegisters.o SkelDrv.o 
BINARY-OBJS += CommonBufMngr.o KernelObjectCommon.o SkelProperties.o
BINARY-OBJS += USBufMngr.o DrvDbg.o EventMngr.o ConfigurationSpaceMngr.o 

SRC-OBJS += CommonBufMngr_Linux.o DriverAccess.o DriverEntry.o DrvParam.o
SRC-OBJS += EventMngr_Linux.o KernelObjects.o KernelSysCall.o LinuxAllocator.o LinuxDrvHlp.o USBufMngr_Linux.o KThreadMngr.o InterlockedOp.o DMAMngr_Linux.o KernelTime.o NvidiaP2PWrapper.o 

INCLUDE_REPS += -I$(src)/../..
INCLUDE_REPS += -I$(src)/../../../DrvIFX4XX
INCLUDE_REPS += -I$(src)/../../../DrvIFGateway/
INCLUDE_REPS += -I$(src)/../../../DrvX4XX
INCLUDE_REPS += -I$(src)/../../../DrvGateway/Linux
INCLUDE_REPS += -I$(src)/../../../../SkelDrv/DrvCommon
INCLUDE_REPS += -I$(src)/../../../../SkelDrv/DrvCommon/Linux
INCLUDE_REPS += -I$(src)/../../../../SkelDrv/DrvIFCommon
INCLUDE_REPS += -I$(src)/../../../../SkelDrv/DrvIFCommon/Linux
INCLUDE_REPS += -I$(src)/../../../../Repository
INCLUDE_REPS += -I$(src)/../../../../Repository/Drv
INCLUDE_REPS += -I$(src)/../../../../Repository/Drv/Features
INCLUDE_REPS += -I$(src)/../../../../Repository/Drv/Features/ClockReconstruction
INCLUDE_REPS += -I$(src)/../../../../Repository/Drv/Features/DelayedStreamStarter
INCLUDE_REPS += -I$(src)/../../../../Repository/Drv/HwComponent
INCLUDE_REPS += -I$(src)/../../../../Repository/Drv/HwComponent/Teb
INCLUDE_REPS += -I$(src)/../../../../Repository/Drv/HwComponent/Mailbox
INCLUDE_REPS += -I$(src)/../../../../Repository/Drv/Technologies
INCLUDE_REPS += -I$(src)/../../../../Repository/Drv/Technologies/Common
INCLUDE_REPS += -I$(src)/../../../../Repository/Drv_DrvIF_Common
INCLUDE_REPS += -I$(src)/../../../../Repository/Drv_DrvIF_Common/Misc
INCLUDE_REPS += -I$(src)/../../../../Repository/Drv_DrvIF_Common/Features
INCLUDE_REPS += -I$(src)/../../../../Repository/Drv_DrvIF_Common/HwComponent
INCLUDE_REPS += -I$(src)/../../../../Repository/Drv_DrvIF_Common/HwComponent/Mailbox
INCLUDE_REPS += -I$(src)/../../../../Repository/Drv_DrvIF_Common/HwComponent/PCIeBridge
INCLUDE_REPS += -I$(src)/../../../../Repository/Drv_DrvIF_Common/HwComponent/Flash
INCLUDE_REPS += -I$(src)/../../../../Repository/Drv_DrvIF_Common/Technologies
INCLUDE_REPS += -I$(src)/../../../../Repository/Drv_DrvIF_Common/Technologies/Common
INCLUDE_REPS += -I$(src)/../../../../../Repository
INCLUDE_REPS += -I$(src)/../../../../../Dependencies
INCLUDE_REPS += -I$(src)/../../../SkelDrv/DrvIFCommon

# default to currently running kernel if KVER not specified
ifeq ($(KVER),)
KVER := $(shell uname -r)
endif

KDIR ?= /lib/modules/$(KVER)/build
INSTALLDIR ?= /lib/modules/$(KVER)
PWD := $(shell pwd)

# Conditionally add -mno-outline-atomics to CFLAGS if it is supported
CONDITIONAL_CFLAGS := $(call TEST_CC_ARG, -mno-outline-atomics)

ifdef mem_alloc_method
EXTRA_CFLAGS += -DMEM_ALLOC_METHOD=$(mem_alloc_method)
endif
EXTRA_CFLAGS += -w -DDBG=0 -DDRIVER
EXTRA_CFLAGS += $(INCLUDE_REPS)
EXTRA_CFLAGS += -fno-stack-protector
EXTRA_CFLAGS += $(CONDITIONAL_CFLAGS)
EXTRA_CFLAGS += -Wno-error=incompatible-pointer-types

ifneq ($(KERNELRELEASE),)

obj-m := $(DRIVERNAME).o
$(DRIVERNAME)-objs := $(SRC-OBJS) $(BINARY-OBJS) 

else

ifndef VERBOSE
.SILENT: all
endif
	
all: default

default:
	
	for file in *.o_shipped; do if ! file "$$file" | grep -q 'ELF'; then xxd -p -r "$$file" > "$${file/.o_shipped/}.c"; fi; done

	@trap '$(MAKE) shipped_cleanup' EXIT ; $(MAKE) -C $(KDIR) M=$(PWD) modules
	
gencmd:
	for file in $(BINARY-OBJS);do touch .$${file}.cmd; done
	
genbin:
	for file in $(BINARY-OBJS);do echo "X" > $${file/.o/}.o_shipped; done
	
install:
	# Driver installation
	cp $(DRIVERNAME).ko $(INSTALLDIR)/$(DRIVERNAME).ko	
	cp $(DRIVERNAME).rules /etc/udev/$(DRIVERNAME).rules
	if [ ! -f /etc/udev/rules.d/010-$(DRIVERNAME).rules ]; then ln -sf /etc/udev/$(DRIVERNAME).rules /etc/udev/rules.d/010-$(DRIVERNAME).rules; fi
	depmod -a
	-modprobe -rq switchtec
	modprobe -rq $(DRIVERNAME)
	modprobe $(DRIVERNAME)
	@for files in /dev/$(DRIVERNAME)*; do if [ ! -r files ]; then ( dmesg | grep -i $(DRIVERNAME) ) | grep -i "System needs a restart" -o --colour=always; echo "">NULL; fi; done
	
uninstall:
	# Driver uninstallation	
	modprobe -r $(DRIVERNAME)
	rm $(INSTALLDIR)/$(DRIVERNAME).ko
	rm /etc/udev/$(DRIVERNAME).rules	
	rm /etc/udev/rules.d/010-$(DRIVERNAME).rules	
	

shipped_cleanup:
	for file in *.o_shipped; do if ! file "$$file" | grep -q 'ELF'; then rm -f "$${file/.o_shipped/}.c"; fi; done

clean:
	rm -f *.o
	rm -f Module.symvers
	rm -f modules.order
	rm -f *.ko
	
endif
