# 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
	select FW_LOADER
	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)/Kbuild' 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_FW_CORE_DUMP
        bool "Enable support for FW core dump"
        depends on MALI_MIDGARD && MALI_EXPERT && MALI_CSF_SUPPORT
        default n
        help
          Adds ability to request firmware core dump

          Example:
          * To explicitly request core dump:
                echo 1 >/sys/kernel/debug/mali0/fw_core_dump
          * To output current core dump (after explicitly requesting a core dump,
            or kernel driver reported an internal firmware error):
                cat /sys/kernel/debug/mali0/fw_core_dump

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
	tristate "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.

if MALI_ARBITRATION
source "drivers/gpu/arm/midgard/arbitration/Kconfig"
endif

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

endif
