# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
#
# (C) COPYRIGHT 2012-2021 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 license.
#
# 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.
#
#

menuconfig MALI_MIDGARD
	tristate "Mali Midgard series support"
	select GPU_TRACEPOINTS if ANDROID
	select DMA_SHARED_BUFFER
	select PM_DEVFREQ
	select DEVFREQ_THERMAL
	default n
	help
	  Enable this option to build support for a ARM Mali Midgard GPU.

	  To compile this driver as a module, choose M here:
	  this will generate a single module, called mali_kbase.

if MALI_MIDGARD

config MALI_PLATFORM_NAME
	depends on MALI_MIDGARD
	string "Platform name"
	default "devicetree"
	help
	  Enter the name of the desired platform configuration directory to
	  include in the build. 'platform/$(MALI_PLATFORM_NAME)/Makefile' must
	  exist.

config MALI_REAL_HW
	depends on MALI_MIDGARD
	def_bool !MALI_NO_MALI

menu "Platform specific options"
source "drivers/gpu/arm/midgard/platform/Kconfig"
endmenu

config MALI_CSF_SUPPORT
	bool "Enable Mali CSF based GPU support"
	depends on MALI_MIDGARD=m
	default n
	help
	  Enables support for CSF based GPUs.

config MALI_DEVFREQ
	bool "Enable devfreq support for Mali"
	depends on MALI_MIDGARD && PM_DEVFREQ
	select DEVFREQ_GOV_SIMPLE_ONDEMAND
	default y
	help
	  Support devfreq for Mali.

	  Using the devfreq framework and, by default, the simple on-demand
	  governor, the frequency of Mali will be dynamically selected from the
	  available OPPs.

config MALI_MIDGARD_DVFS
	bool "Enable legacy DVFS"
	depends on MALI_MIDGARD && !MALI_DEVFREQ
	default n
	help
	  Choose this option to enable legacy DVFS in the Mali Midgard DDK.

config MALI_GATOR_SUPPORT
	bool "Enable Streamline tracing support"
	depends on MALI_MIDGARD
	default y
	help
	  Enables kbase tracing used by the Arm Streamline Performance Analyzer.
	  The tracepoints are used to derive GPU activity charts in Streamline.

config MALI_MIDGARD_ENABLE_TRACE
	bool "Enable kbase tracing"
	depends on MALI_MIDGARD
	default y if MALI_DEBUG
	default n
	help
	  Enables tracing in kbase. Trace log available through
	  the "mali_trace" debugfs file, when the CONFIG_DEBUG_FS is enabled

config MALI_DMA_FENCE
	bool "Enable DMA_BUF fence support for Mali"
	depends on MALI_MIDGARD
	default n
	help
	  Support DMA_BUF fences for Mali.

	  This option should only be enabled if the Linux Kernel has built in
	  support for DMA_BUF fences.

config MALI_ARBITER_SUPPORT
	bool "Enable arbiter support for Mali"
	depends on MALI_MIDGARD && !MALI_CSF_SUPPORT
	default n
	help
	  Enable support for the arbiter interface in the driver.
	  This allows an external arbiter to manage driver access
	  to GPU hardware in a virtualized environment

	  If unsure, say N.

config MALI_DMA_BUF_MAP_ON_DEMAND
	bool "Enable map imported dma-bufs on demand"
	depends on MALI_MIDGARD
	default n
	help
	  This option caused kbase to set up the GPU mapping of imported
	  dma-buf when needed to run atoms. This is the legacy behavior.

	  This is intended for testing and the option will get removed in the
	  future.

config MALI_DMA_BUF_LEGACY_COMPAT
	bool "Enable legacy compatibility cache flush on dma-buf map"
	depends on MALI_MIDGARD && !MALI_DMA_BUF_MAP_ON_DEMAND
	default n
	help
	  This option enables compatibility with legacy dma-buf mapping
	  behavior, then the dma-buf is mapped on import, by adding cache
	  maintenance where MALI_DMA_BUF_MAP_ON_DEMAND would do the mapping,
	  including a cache flush.

	  This option might work-around issues related to missing cache
	  flushes in other drivers. This only has an effect for clients using
	  UK 11.18 or older. For later UK versions it is not possible.

menuconfig MALI_EXPERT
	depends on MALI_MIDGARD
	bool "Enable Expert Settings"
	default n
	help
	  Enabling this option and modifying the default settings may produce
	  a driver with performance or other limitations.

if MALI_EXPERT

config MALI_2MB_ALLOC
	bool "Attempt to allocate 2MB pages"
	depends on MALI_MIDGARD && MALI_EXPERT
	default n
	help
	  Rather than allocating all GPU memory page-by-page, attempt to
	  allocate 2MB pages from the kernel. This reduces TLB pressure and
	  helps to prevent memory fragmentation.

	  If in doubt, say N

config MALI_MEMORY_FULLY_BACKED
	bool "Enable memory fully physically-backed"
	depends on MALI_MIDGARD && MALI_EXPERT
	default n
	help
	  This option enables full physical backing of all virtual
	  memory allocations in the kernel. Notice that this build
	  option only affects allocations of grow-on-GPU-page-fault
	  memory.

config MALI_CORESTACK
	bool "Enable support of GPU core stack power control"
	depends on MALI_MIDGARD && MALI_EXPERT
	default n
	help
	  Enabling this feature on supported GPUs will let the driver powering
	  on/off the GPU core stack independently without involving the Power
	  Domain Controller. This should only be enabled on platforms which
	  integration of the PDC to the Mali GPU is known to be problematic.
	  This feature is currently only supported on t-Six and t-HEx GPUs.

	  If unsure, say N.

comment "Platform options"
	depends on MALI_MIDGARD && MALI_EXPERT

config MALI_NO_MALI
	bool "Enable No Mali"
	depends on MALI_MIDGARD && MALI_EXPERT
	default n
	help
	  This can be used to test the driver in a simulated environment
	  whereby the hardware is not physically present. If the hardware is physically
	  present it will not be used. This can be used to test the majority of the
	  driver without needing actual hardware or for software benchmarking.
	  All calls to the simulated hardware will complete immediately as if the hardware
	  completed the task.

config MALI_ERROR_INJECT
	bool "Enable No Mali error injection"
	depends on MALI_MIDGARD && MALI_EXPERT && MALI_NO_MALI
	default n
	help
	  Enables insertion of errors to test module failure and recovery mechanisms.

config MALI_GEM5_BUILD
	bool "Enable build of Mali kernel driver for GEM5"
	depends on MALI_MIDGARD && MALI_EXPERT
	default n
	help
	  This option is to do a Mali GEM5 build.
	  If unsure, say N.

comment "Debug options"
	depends on MALI_MIDGARD && MALI_EXPERT

config MALI_DEBUG
	bool "Enable debug build"
	depends on MALI_MIDGARD && MALI_EXPERT
	default n
	help
	  Select this option for increased checking and reporting of errors.

config MALI_FENCE_DEBUG
	bool "Enable debug sync fence usage"
	depends on MALI_MIDGARD && MALI_EXPERT && (SYNC || SYNC_FILE)
	default y if MALI_DEBUG
	help
	  Select this option to enable additional checking and reporting on the
	  use of sync fences in the Mali driver.

	  This will add a 3s timeout to all sync fence waits in the Mali
	  driver, so that when work for Mali has been waiting on a sync fence
	  for a long time a debug message will be printed, detailing what fence
	  is causing the block, and which dependent Mali atoms are blocked as a
	  result of this.

	  The timeout can be changed at runtime through the js_soft_timeout
	  device attribute, where the timeout is specified in milliseconds.

config MALI_SYSTEM_TRACE
	bool "Enable system event tracing support"
	depends on MALI_MIDGARD && MALI_EXPERT
	default y if MALI_DEBUG
	default n
	help
	  Choose this option to enable system trace events for each
	  kbase event. This is typically used for debugging but has
	  minimal overhead when not in use. Enable only if you know what
	  you are doing.

comment "Instrumentation options"
	depends on MALI_MIDGARD && MALI_EXPERT

choice
	prompt "Select Performance counters set"
	default MALI_PRFCNT_SET_PRIMARY
	depends on MALI_MIDGARD && MALI_EXPERT

config MALI_PRFCNT_SET_PRIMARY
	bool "Primary"
	depends on MALI_MIDGARD && MALI_EXPERT
	help
	  Select this option to use primary set of performance counters.

config MALI_PRFCNT_SET_SECONDARY
	bool "Secondary"
	depends on MALI_MIDGARD && MALI_EXPERT
	help
	  Select this option to use secondary set of performance counters. Kernel
	  features that depend on an access to the primary set of counters may
	  become unavailable. Enabling this option will prevent power management
	  from working optimally and may cause instrumentation tools to return
	  bogus results.

	  If unsure, use MALI_PRFCNT_SET_PRIMARY.

config MALI_PRFCNT_SET_TERTIARY
	bool "Tertiary"
	depends on MALI_MIDGARD && MALI_EXPERT
	help
	  Select this option to use tertiary set of performance counters. Kernel
	  features that depend on an access to the primary set of counters may
	  become unavailable. Enabling this option will prevent power management
	  from working optimally and may cause instrumentation tools to return
	  bogus results.

	  If unsure, use MALI_PRFCNT_SET_PRIMARY.

endchoice

config MALI_PRFCNT_SET_SELECT_VIA_DEBUG_FS
	bool "Enable runtime selection of performance counters set via debugfs"
	depends on MALI_MIDGARD && MALI_EXPERT && DEBUG_FS
	default n
	help
	  Select this option to make the secondary set of performance counters
	  available at runtime via debugfs. Kernel features that depend on an
	  access to the primary set of counters may become unavailable.

	  If no runtime debugfs option is set, the build time counter set
	  choice will be used.

	  This feature is unsupported and unstable, and may break at any time.
	  Enabling this option will prevent power management from working
	  optimally and may cause instrumentation tools to return bogus results.

	  No validation is done on the debugfs input. Invalid input could cause
	  performance counter errors. Valid inputs are the values accepted by
	  the SET_SELECT bits of the PRFCNT_CONFIG register as defined in the
	  architecture specification.

	  If unsure, say N.

config MALI_JOB_DUMP
	bool "Enable system level support needed for job dumping"
	depends on MALI_MIDGARD && MALI_EXPERT
	default n
	help
	  Choose this option to enable system level support needed for
	  job dumping. This is typically used for instrumentation but has
	  minimal overhead when not in use. Enable only if you know what
	  you are doing.

comment "Workarounds"
	depends on MALI_MIDGARD && MALI_EXPERT

config MALI_PWRSOFT_765
	bool "Enable workaround for PWRSOFT-765"
	depends on MALI_MIDGARD && MALI_EXPERT
	default n
	help
	  PWRSOFT-765 fixes devfreq cooling devices issues. The fix was merged
	  in kernel v4.10, however if backported into the kernel then this
	  option must be manually selected.

	  If using kernel >= v4.10 then say N, otherwise if devfreq cooling
	  changes have been backported say Y to avoid compilation errors.

config MALI_HW_ERRATA_1485982_NOT_AFFECTED
	bool "Disable workaround for BASE_HW_ISSUE_GPU2017_1336"
	depends on MALI_MIDGARD && MALI_EXPERT
	default n
	help
	  This option disables the default workaround for GPU2017-1336. The
	  workaround keeps the L2 cache powered up except for powerdown and reset.

	  The workaround introduces a limitation that will prevent the running of
	  protected mode content on fully coherent platforms, as the switch to IO
	  coherency mode requires the L2 to be turned off.

config MALI_HW_ERRATA_1485982_USE_CLOCK_ALTERNATIVE
	bool "Use alternative workaround for BASE_HW_ISSUE_GPU2017_1336"
	depends on MALI_MIDGARD && MALI_EXPERT && !MALI_HW_ERRATA_1485982_NOT_AFFECTED
	default n
	help
	  This option uses an alternative workaround for GPU2017-1336. Lowering
	  the GPU clock to a, platform specific, known good frequency before
	  powering down the L2 cache. The clock can be specified in the device
	  tree using the property, opp-mali-errata-1485982. Otherwise the
	  slowest clock will be selected.

endif

config MALI_ARBITRATION
	bool "Enable Virtualization reference code"
	depends on MALI_MIDGARD
	default n
	help
	  Enables the build of several reference modules used in the reference
	  virtualization setup for Mali
	  If unsure, say N.

source "drivers/gpu/arm/midgard/tests/Kconfig"

endif
