LINUX_KERNEL_VERSION := $(shell uname -r)
KERNEL_MAJOR := $(word 1, $(subst ., ,$(LINUX_KERNEL_VERSION)))
KERNEL_MINOR := $(word 2, $(subst ., ,$(LINUX_KERNEL_VERSION)))

ifeq ($(KBUILD_EXTMOD),)
FULL_XDX_PATH := $(srctree)/$(src)
else
FULL_XDX_PATH := $(src)
endif

DISPLAY_FOLDER_NAME := display
AUDIO_FOLDER_NAME := audio
VPU_FOLDER_NAME := vpu
GFX_FOLDER_NAME := gfx
DMA_FOLDER_NAME := dma
ACPU_FOLDER_NAME := acpu
PM_FOLDER_NAME := pm
FULL_XDX_DISPLAY_PATH := $(FULL_XDX_PATH)/$(DISPLAY_FOLDER_NAME)
FULL_XDX_AUDIO_PATH := $(FULL_XDX_PATH)/$(AUDIO_FOLDER_NAME)
FULL_XDX_VPU_PATH := $(FULL_XDX_PATH)/$(VPU_FOLDER_NAME)
FULL_XDX_GFX_PATH := $(FULL_XDX_PATH)/$(GFX_FOLDER_NAME)
FULL_XDX_DMA_PATH := $(FULL_XDX_PATH)/$(DMA_FOLDER_NAME)
FULL_XDX_ACPU_PATH := $(FULL_XDX_PATH)/$(ACPU_FOLDER_NAME)
FULL_XDX_PM_PATH := $(FULL_XDX_PATH)/$(PM_FOLDER_NAME)
FULL_XDX_PLATEFORM_PATH := $(FULL_XDX_PATH)/platform
FULL_XDX_VKMS_PATH := $(FULL_XDX_PATH)/vkms
FULL_XDX_MMU_PATH := $(FULL_XDX_PATH)/mmu
FULL_XDX_SMMU_PATH := $(FULL_XDX_PATH)/smmu

# PVR GFX Config
XDX_WA_ARM_POWEROFF := 1
SUPPORT_PERF_IMPROVE := 1
SUPPORT_FALLBACK_FENCE_SYNC := 0
SUPPORT_NATIVE_FENCE_SYNC := 1
SUPPORT_DMA_FENCE := 1
SUPPORT_PANGU_ACPU := 1
SUPPORT_PANGU_PM := 1
SUPPORT_LINX_80 := 0
SUPPORT_AUDIO := 1
ifneq ($(SUPPORT_PANGU_ACPU), 1)
SUPPORT_AUDIO := 0
$(info "SUPPORT_AUDIO depends on SUPPORT_PANGU_ACPU!")
endif
ifeq ($(SUPPORT_LINX_80), 1)
ifeq ($(shell [ $(KERNEL_MAJOR) -eq 4 ] && [ $(KERNEL_MINOR) -lt 10 ] || [ $(KERNEL_MAJOR) -lt 4 ] && echo y), y)
SUPPORT_AUDIO := 0
$(info "LINX_80 4.9 KERNEL NOT SUPPORT AUDIO")
endif
endif
SUPPORT_VPU := 1
SUPPORT_BUFFER_SYNC := 1
SUPPORT_RGX := 1
PVR_ARCH := volcanic
SUPPORT_PDVFS :=
SUPPORT_WORKLOAD_ESTIMATION :=
SUPPORT_DI_BRG_IMPL := 1
PVR_HANDLE_BACKEND := idr
SUPPORT_PHYSMEM_TEST := 1
PVRSRV_SUPPORT_DYNAMIC_PHYSHEAPS := 1
PDUMP ?= 0

SUPPORT_LINUX_DVFS := 0

ifeq ($(ARCH), riscv)
SUPPORT_LINUX_DVFS := 0
$(info "RISCV NOT SUPPORT DVFS!")
endif

ifeq ($(ARCH), sw_64)
SUPPORT_LINUX_DVFS := 0
$(info "SW NOT SUPPORT DVFS!")
endif

ifeq ($(REDHAT_83), 1)
SUPPORT_LINUX_DVFS := 0
$(info "REDHAT_83 NOT SUPPORT DVFS!")
endif

ifeq ($(KYLIN_SERVER), 1)
SUPPORT_LINUX_DVFS := 0
$(info "KYLIN_SERVER NOT SUPPORT DVFS!")
endif

ifndef CONFIG_PM_DEVFREQ
$(info "Kernel not enabled devfreq, disable SUPPORT_LINUX_DVFS!")
SUPPORT_LINUX_DVFS := 0
endif

ifneq ($(PDUMP),1)
SUPPORT_WRAP_EXTMEM := 1
else
SUPPORT_WRAP_EXTMEM := 0
endif

ifeq ($(SUPPORT_VGPU_GUEST), 1)
ifeq ($(CHIP_ID), pangu)
SUPPORT_VPU = 0
endif
SUPPORT_PANGU_ACPU = 0
SUPPORT_AUDIO = 0
endif

# don't modify these build options here, please update them in setup_ddk_config.sh
SUPPORT_AGP ?= 0
SUPPORT_AGP4 ?= 0
SUPPORT_DMA_TRANSFER ?= 0
SUPPORT_DMA_TRANSFER_B0 ?= 0
XDXGPU_SUPPORT_IOMMU ?= 0
XDXGPU_SMMU_SUPPORT ?= 0
SUPPORT_VPU_SMMU ?= 0
XDXGPU_CCCB_HOST_DDR ?= 0
XDXGPU_KCCB_HOST_DDR ?= 0
XDXGPU_SYNC_HOST_DDR ?= 0
XDXGPU_DUMP_CCB ?= 0
SUPPORT_DISPLAY_DUMP_REG ?= 0
XDXGPU_ENABLE_MTS_KICK_IN_VSYNC_IRQ ?= 0
CONFIG_FW_MAIN_ON_SYSMEM := 0
CONFIG_FORCE_WC_TO_UNCACHED := 0
SUPPORT_VALIDATION ?= 0
PVRSRV_ENABLE_HTB ?= 0
PVRSRV_SUPPORT_DYNAMIC_PHYSHEAPS ?= 0
PVRSRV_ENABLE_SYNC_POISONING ?= 0
PVRSRV_ENABLE_DYNAMIC_PHYSHEAPS ?= 1
TRACK_FW_BOOT ?= 0
DEBUG_BRIDGE_KM ?= 0
PVR_LINUX_PHYSMEM_ZERO_ALL_PAGES ?= 0
PVRSRV_MMU_PARITY_ON_PTALLOC_AND_PTEUNMAP ?= 1
DISABLE_GPU_FREQUENCY_CALIBRATION ?= 0
PVRSRV_ENABLE_PROCESS_STATS ?= 0
PVRSRV_ENABLE_MEMORY_STATS ?= 0
PVRSRV_ENABLE_PERPID_STATS ?= 0
PVRSRV_ENABLE_CACHEOP_STATS ?= 0
PVRSRV_ENABLE_GPU_MEMORY_INFO ?= 0
PVRSRV_DEBUG_LINUX_MEMORY_STATS ?= 0
PVRSRV_DEBUG_HANDLE_LOCK ?= 0
PVR_ANNOTATION_MAX_LEN ?= 64

ccflags-y := -I$(FULL_XDX_PATH) \
	-I$(FULL_XDX_PATH)/include \
	-I$(FULL_XDX_DISPLAY_PATH) \
	-I$(FULL_XDX_AUDIO_PATH) \
	-I$(FULL_XDX_PLATEFORM_PATH) \
	-I$(FULL_XDX_GFX_PATH) \
	-I$(FULL_XDX_VPU_PATH) \
	-I$(FULL_XDX_DMA_PATH) \
	-I$(FULL_XDX_VKMS_PATH) \
	-I$(FULL_XDX_DMA_PATH)/hal \
	-I$(FULL_XDX_MMU_PATH) \
	-I$(FULL_XDX_SMMU_PATH) \
	-I$(FULL_XDX_ACPU_PATH)

ifndef RGX_BVNC
$(error "XDXGPU -- RGX_BVNC is not defined")
endif

ifndef RGX_BNC
$(error "XDXGPU -- RGX_BNC is not defined")
endif

ifndef XDXGPU_VERSION_MAJ
$(error "XDXGPU -- XDXGPU_VERSION_MAJ is not defined")
endif

ifndef XDXGPU_VERSION_MIN
$(error "XDXGPU -- XDXGPU_VERSION_MIN is not defined")
endif

# XDXGPU_VERSION_BUILD from running "git describe --abbrev=5 --always"
ifndef XDXGPU_VERSION_BUILD
$(error "XDXGPU -- XDXGPU_VERSION_BUILD is not defined")
endif

ifeq ($(XDXGPU_DUMP_CCB), 1)
ccflags-y += -DXDXGPU_DUMP_CCB
endif

ccflags-y += -DXDXGPU
ccflags-y += -DRGX_BVNC_CORE_KM_HEADER=\"cores/rgxcore_km_$(RGX_BVNC).h\"
ccflags-y += -DRGX_BNC_CONFIG_KM_HEADER=\"configs/rgxconfig_km_$(RGX_BNC).h\"
ccflags-y += -DPVR_ANNOTATION_MAX_LEN=$(PVR_ANNOTATION_MAX_LEN)
ccflags-y += -DPVRVERSION_MAJ=$(XDXGPU_VERSION_MAJ) -DPVRVERSION_MIN=$(XDXGPU_VERSION_MIN) -DPVRVERSION_BUILD=$(XDXGPU_VERSION_BUILD)
$(info "XDXGPU -- RGX_BVNC: $(RGX_BVNC), RGX_BNC: $(RGX_BNC)")

ifeq ($(NO_HARDWARE), 1)
ccflags-y += -DNO_HARDWARE
endif

ifeq ($(PDUMP), 1)
ccflags-y += -DPDUMP_PARAM_INIT_STREAM_SIZE=0x800000
ccflags-y += -DPDUMP_PARAM_MAIN_STREAM_SIZE=0x1000000
ccflags-y += -DPDUMP_PARAM_DEINIT_STREAM_SIZE=0x10000
ccflags-y += -DPDUMP_PARAM_BLOCK_STREAM_SIZE=0
ccflags-y += -DPDUMP_SCRIPT_INIT_STREAM_SIZE=0x800000
ccflags-y += -DPDUMP_SCRIPT_MAIN_STREAM_SIZE=0x800000
ccflags-y += -DPDUMP_SCRIPT_DEINIT_STREAM_SIZE=0x10000
ccflags-y += -DPDUMP_SCRIPT_BLOCK_STREAM_SIZE=0x800000
ccflags-y += -DPDUMP_SPLIT_64BIT_REGISTER_ACCESS
ccflags-y += -DSUPPORT_TBI_INTERFACE
endif

ifeq ($(SUPPORT_PERF_IMPROVE), 1)
ccflags-y += -DSUPPORT_PERF_IMPROVE
endif

ifeq ($(SUPPORT_AGP), 1)
ccflags-y += -DSUPPORT_AGP
endif

ifeq ($(SUPPORT_AGP4), 1)
ccflags-y += -DSUPPORT_AGP4
endif

ifeq ($(CONFIG_FW_MAIN_ON_SYSMEM), 1)
ccflags-y += -DCONFIG_FW_MAIN_ON_SYSMEM
endif

ifeq ($(CONFIG_FORCE_WC_TO_UNCACHED), 1)
ccflags-y += -DCONFIG_FORCE_WC_TO_UNCACHED
endif

ifeq ($(SUPPORT_FALLBACK_FENCE_SYNC), 1)
ccflags-y += -DSUPPORT_FALLBACK_FENCE_SYNC
endif

ifeq ($(SUPPORT_NATIVE_FENCE_SYNC), 1)
ccflags-y += -DSUPPORT_NATIVE_FENCE_SYNC
endif

ifeq ($(SUPPORT_DMA_TRANSFER), 1)
ccflags-y += -DSUPPORT_DMA_TRANSFER
endif

ifeq ($(SUPPORT_DMA_TRANSFER_B0), 1)
ccflags-y += -DSUPPORT_DMA_TRANSFER_B0
endif

ifeq ($(XDXGPU_SUPPORT_IOMMU), 1)
ccflags-y += -DXDXGPU_SUPPORT_IOMMU
endif

ifeq ($(XDXGPU_SMMU_SUPPORT), 1)
ccflags-y += -DXDXGPU_SMMU_SUPPORT
endif

ifeq ($(SUPPORT_VPU_SMMU), 1)
ccflags-y += -DSUPPORT_VPU_SMMU
endif

ifeq ($(XDXGPU_CCCB_HOST_DDR), 1)
ccflags-y += -DXDXGPU_CCCB_HOST_DDR
endif

ifeq ($(XDXGPU_KCCB_HOST_DDR), 1)
ccflags-y += -DXDXGPU_KCCB_HOST_DDR
endif

ifeq ($(XDXGPU_SYNC_HOST_DDR), 1)
ccflags-y += -DXDXGPU_SYNC_HOST_DDR
endif

ifeq ($(XDXGPU_ENABLE_MTS_KICK_IN_VSYNC_IRQ), 1)
ccflags-y += -DXDXGPU_ENABLE_MTS_KICK_IN_VSYNC_IRQ
endif

ifeq ($(SUPPORT_PANGU_ACPU), 1)
ccflags-y += -DSUPPORT_PANGU_ACPU
endif

ifeq ($(SUPPORT_PANGU_PM), 1)
ccflags-y += -DSUPPORT_PANGU_PM
endif

ifeq ($(SUPPORT_PANGU_DOORBELL_MEMSET), 1)
ccflags-y += -DSUPPORT_PANGU_DOORBELL_MEMSET
endif

ifeq ($(SUPPORT_AUDIO), 1)
ccflags-y += -DSUPPORT_AUDIO
endif

ifeq ($(XDX_WA_ARM_POWEROFF), 1)
ccflags-y += -DXDX_WA_ARM_POWEROFF
endif

ifeq ($(SUPPORT_VPU), 1)
ccflags-y += -DSUPPORT_VPU
endif

ifeq ($(SUPPORT_DI_BRG_IMPL), 1)
ccflags-y += -DSUPPORT_DI_BRG_IMPL
endif

ifeq ($(SUPPORT_DISPLAY_DUMP_REG), 1)
ccflags-y += -DSUPPORT_DISPLAY_DUMP_REG
endif

ifeq ($(PVR_BUILD_TYPE), debug)
SUPPORT_RGXKICKSYNC_BRIDGE := 1
#PVRSRV_ENABLE_HTB := 1
PVRSRV_ENABLE_SYNC_POISONING :=1
DEBUG_BRIDGE_KM := 1
ccflags-y += -g -DDEBUG -DPVR_BUILD_TYPE=\"debug\"
else
ifeq ($(SUPPORT_PERF_IMPROVE), 1)
ccflags-y += -O2 -DPVR_BUILD_TYPE=\"release\"
$(warning $(ccflags-y))
else
ccflags-y += -DPVR_BUILD_TYPE=\"release\"
endif
endif

ifeq ($(SUPPORT_PHYSMEM_TEST), 1)
ccflags-y += -DSUPPORT_PHYSMEM_TEST
endif

ifeq ($(SUPPORT_LINUX_DVFS), 1)
ccflags-y += -DSUPPORT_LINUX_DVFS
endif

ifeq ($(PVRSRV_ENABLE_SYNC_POISONING), 1)
ccflags-y += -DPVRSRV_ENABLE_SYNC_POISONING
endif
ifeq ($(PVRSRV_ENABLE_HTB), 1)
ccflags-y += -DPVRSRV_ENABLE_HTB
endif
ifeq ($(SUPPORT_RGXKICKSYNC_BRIDGE), 1)
ccflags-y += -DSUPPORT_RGXKICKSYNC_BRIDGE
endif
ifeq ($(DEBUG_BRIDGE_KM), 1)
ccflags-y += -DDEBUG_BRIDGE_KM
endif

ifeq ($(CHIP_ID), fuxi)
ccflags-y += -DSUPPORT_FUXI
$(info "NOW WE BUILD FOR FUXI!")
endif

ifeq ($(CHIP_ID), pangu)
ccflags-y += -DSUPPORT_PANGU
$(info "NOW WE BUILD FOR PANGU!")
endif

xdxgpu-y :=

# add gfx driver
include $(FULL_XDX_GFX_PATH)/Makefile
xdxgpu-y += $(XDX_GFX_FILES)

# add bridge
include $(FULL_XDX_PLATEFORM_PATH)/Makefile
xdxgpu-y += $(XDX_BR_FILES)

# add dc driver
include $(FULL_XDX_DISPLAY_PATH)/Makefile
xdxgpu-y += $(XDX_DC_FILES)

include $(FULL_XDX_VKMS_PATH)/Makefile
xdxgpu-y += $(XDX_VKMS_FILES)

# add vpu driver
ifeq ($(SUPPORT_VPU), 1)
include $(FULL_XDX_VPU_PATH)/Makefile
xdxgpu-y += $(XDX_VPU_FILES)
endif

# add audio driver
ifeq ($(SUPPORT_AUDIO), 1)
include $(FULL_XDX_AUDIO_PATH)/Makefile
xdxgpu-y += $(XDX_AUDIO_FILES)
endif

# add dma driver
ifeq ($(SUPPORT_DMA_TRANSFER), 1)
include $(FULL_XDX_DMA_PATH)/Makefile
xdxgpu-y += $(XDX_DMA_FILES)
endif

# add acpu driver
ifeq ($(SUPPORT_PANGU_ACPU), 1)
include $(FULL_XDX_ACPU_PATH)/Makefile
xdxgpu-y += $(XDX_ACPU_FILES)
endif

# add pm function
# pm features heavily depend on acpu/cmcu
ifeq ($(SUPPORT_PANGU_PM), 1)
include $(FULL_XDX_PM_PATH)/Makefile
xdxgpu-y += $(XDX_PM_FILES)
endif

include $(FULL_XDX_MMU_PATH)/Makefile
xdxgpu-y += $(XDX_MMU_FILES)

include $(FULL_XDX_SMMU_PATH)/Makefile
xdxgpu-y += $(XDX_SMMU_FILES)

# add pci driver
xdxgpu-y += xdx_drv.o

# add drm driver
xdxgpu-y += xdx_device.o xdx_fdinfo.o xdx_gem.o xdx_debugfs.o xdx_irq.o xdx_sysfs.o \
	    pangu_a0.o pangu_b0.o fuxi_a0.o fuxi_b0.o xdx_vmm.o

ifeq ($(SUPPORT_VPU), 1)
xdxgpu-y += xdx_vpu.o
endif

ifeq ($(SUPPORT_PANGU_ACPU), 1)
xdxgpu-y += xdx_acpu.o
endif

ifeq ($(SUPPORT_PANGU_PM), 1)
xdxgpu-y += pm/xdx_pm.o
endif

ifeq ($(SUPPORT_AUDIO), 1)
xdxgpu-y += xdx_audio.o
endif

ifeq ($(REDHAT_83), 1)
ccflags-y += -DREDHAT_83
$(info "NOW WE BUILDING FOR REDHAT_83!")
endif

ifeq ($(KYLIN_SERVER), 1)
ccflags-y += -DKYLIN_SERVER
$(info "NOW WE BUILDING FOR KYLIN_SERVER!")
endif

ifeq ($(SUPPORT_LINX_80), 1)
ifeq ($(shell [ $(KERNEL_MAJOR) -eq 4 ] && [ $(KERNEL_MINOR) -gt 9 ] && echo y), y)
ccflags-y += -DLINX_80
$(info "NOW WE BUILDING FOR LINX_80!")
endif
endif

ifeq ($(UBUNTU_2204_68), 1)
ccflags-y += -DUBUNTU_2204_68
endif

ifeq ($(SUPPORT_VGPU_GUEST), 1)
ccflags-y += -DSUPPORT_VGPU_GUEST
endif

#$(warning $(xdxgpu-y))
obj-$(CONFIG_DRM_XDXGPU) += xdxgpu.o
