#
# (C) COPYRIGHT 2012-2016, 2017 ARM Limited. All rights reserved.
#
# This program is free software and is provided to you under the terms of the
# GNU General Public License version 2 as published by the Free Software
# Foundation, and any use by you of this program is subject to the terms
# of such GNU licence.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, you can access it online at
# http://www.gnu.org/licenses/gpl-2.0.html.
#
# SPDX-License-Identifier: GPL-2.0
#
#


# Driver version string which is returned to userspace via an ioctl
MALI_RELEASE_NAME ?= "r10p0-01rel0"

# Paths required for build
KBASE_PATH = $(src)
KBASE_PLATFORM_PATH = $(KBASE_PATH)/platform_dummy
UMP_PATH = $(src)/../../../base

ifeq ($(CONFIG_MALI_ERROR_INJECT),y)
MALI_ERROR_INJECT_ON = 1
endif

# Set up defaults if not defined by build system
MALI_CUSTOMER_RELEASE ?= 1
MALI_UNIT_TEST ?= 0
MALI_KERNEL_TEST_API ?= 0
MALI_ERROR_INJECT_ON ?= 0
MALI_MOCK_TEST ?= 0
MALI_COVERAGE ?= 0
CONFIG_MALI_PLATFORM_NAME ?= "devicetree"
# This workaround is for what seems to be a compiler bug we observed in
# GCC 4.7 on AOSP 4.3.  The bug caused an intermittent failure compiling
# the "_Pragma" syntax, where an error message is returned:
#
# "internal compiler error: unspellable token PRAGMA"
#
# This regression has thus far only been seen on the GCC 4.7 compiler bundled
# with AOSP 4.3.0.  So this makefile, intended for in-tree kernel builds
# which are not known to be used with AOSP, is hardcoded to disable the
# workaround, i.e. set the define to 0.
MALI_GCC_WORKAROUND_MIDCOM_4598 ?= 0

# Set up our defines, which will be passed to gcc
DEFINES = \
	-DMALI_CUSTOMER_RELEASE=$(MALI_CUSTOMER_RELEASE) \
	-DMALI_KERNEL_TEST_API=$(MALI_KERNEL_TEST_API) \
	-DMALI_UNIT_TEST=$(MALI_UNIT_TEST) \
	-DMALI_ERROR_INJECT_ON=$(MALI_ERROR_INJECT_ON) \
	-DMALI_MOCK_TEST=$(MALI_MOCK_TEST) \
	-DMALI_COVERAGE=$(MALI_COVERAGE) \
	-DMALI_RELEASE_NAME=\"$(MALI_RELEASE_NAME)\" \
	-DMALI_GCC_WORKAROUND_MIDCOM_4598=$(MALI_GCC_WORKAROUND_MIDCOM_4598)

ifeq ($(KBUILD_EXTMOD),)
# in-tree
DEFINES +=-DMALI_KBASE_PLATFORM_PATH=../../$(src)/platform/$(CONFIG_MALI_PLATFORM_NAME)
else
# out-of-tree
DEFINES +=-DMALI_KBASE_PLATFORM_PATH=$(src)/platform/$(CONFIG_MALI_PLATFORM_NAME)
endif

DEFINES += -I$(srctree)/drivers/staging/android

# Use our defines when compiling
ldflags-y += --strip-debug
ccflags-y += $(DEFINES) -I$(KBASE_PATH)   -I$(KBASE_PLATFORM_PATH) -I$(UMP_PATH) -I$(srctree)/include/linux
subdir-ccflags-y += $(DEFINES) -I$(KBASE_PATH)   -I$(KBASE_PLATFORM_PATH) -I$(OSK_PATH) -I$(UMP_PATH) -I$(srctree)/include/linux

SRC := \
	mali_kbase_device.c \
	mali_kbase_cache_policy.c \
	mali_kbase_mem.c \
	mali_kbase_mmu.c \
	mali_kbase_ctx_sched.c \
	mali_kbase_jd.c \
	mali_kbase_jd_debugfs.c \
	mali_kbase_jm.c \
	mali_kbase_gpuprops.c \
	mali_kbase_js.c \
	mali_kbase_js_ctx_attr.c \
	mali_kbase_event.c \
	mali_kbase_context.c \
	mali_kbase_pm.c \
	mali_kbase_config.c \
	mali_kbase_vinstr.c \
	mali_kbase_softjobs.c \
	mali_kbase_10969_workaround.c \
	mali_kbase_hw.c \
	mali_kbase_utility.c \
	mali_kbase_debug.c \
	mali_kbase_trace_timeline.c \
	mali_kbase_gpu_memory_debugfs.c \
	mali_kbase_mem_linux.c \
	mali_kbase_core_linux.c \
	mali_kbase_replay.c \
	mali_kbase_mem_profile_debugfs.c \
	mali_kbase_mmu_mode_lpae.c \
	mali_kbase_mmu_mode_aarch64.c \
	mali_kbase_disjoint_events.c \
	mali_kbase_gator_api.c \
	mali_kbase_debug_mem_view.c \
	mali_kbase_debug_job_fault.c \
	mali_kbase_smc.c \
	mali_kbase_mem_pool.c \
	mali_kbase_mem_pool_debugfs.c \
	mali_kbase_tlstream.c \
	mali_kbase_strings.c \
	mali_kbase_as_fault_debugfs.c \
	mali_kbase_regs_history_debugfs.c \
	thirdparty/mali_kbase_mmap.c


ifeq ($(CONFIG_MALI_JOB_DUMP),y)
	SRC += mali_kbase_gwt.c
endif

ifeq ($(MALI_UNIT_TEST),1)
	SRC += mali_kbase_tlstream_test.c
endif

ifeq ($(MALI_CUSTOMER_RELEASE),0)
	SRC += mali_kbase_regs_dump_debugfs.c
endif


ccflags-y += -I$(KBASE_PATH)

# Tell the Linux build system from which .o file to create the kernel module
obj-$(CONFIG_MALI_MIDGARD) += mali_kbase.o

# Tell the Linux build system to enable building of our .c files
mali_kbase-y := $(SRC:.c=.o)

# Kconfig passes in the name with quotes for in-tree builds - remove them.
platform_name := $(shell echo $(CONFIG_MALI_PLATFORM_NAME))
MALI_PLATFORM_DIR := platform/$(platform_name)
ccflags-y += -I$(src)/$(MALI_PLATFORM_DIR)
include $(src)/$(MALI_PLATFORM_DIR)/Kbuild

ifeq ($(CONFIG_MALI_DEVFREQ),y)
  ifeq ($(CONFIG_DEVFREQ_THERMAL),y)
    include $(src)/ipa/Kbuild
  endif
endif

mali_kbase-$(CONFIG_MALI_DMA_FENCE) += \
	mali_kbase_dma_fence.o \
	mali_kbase_fence.o
mali_kbase-$(CONFIG_SYNC) += \
	mali_kbase_sync_android.o \
	mali_kbase_sync_common.o
mali_kbase-$(CONFIG_SYNC_FILE) += \
	mali_kbase_sync_file.o \
	mali_kbase_sync_common.o \
	mali_kbase_fence.o

ifeq ($(MALI_MOCK_TEST),1)
# Test functionality
mali_kbase-y += tests/internal/src/mock/mali_kbase_pm_driver_mock.o
endif

include  $(src)/backend/gpu/Kbuild
mali_kbase-y += $(BACKEND:.c=.o)


ccflags-y += -I$(src)/backend/gpu
subdir-ccflags-y += -I$(src)/backend/gpu

# For kutf and mali_kutf_irq_latency_test
obj-$(CONFIG_MALI_KUTF) += tests/
