# 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_BIFROST
	tristate "Mali Bifrost series support"
	depends on ARM64 && ARM64_PAGE_SHIFT=12
	depends on THERMAL || THERMAL=n
	select GPU_TRACEPOINTS if ANDROID
	select DMA_SHARED_BUFFER
	select PM_DEVFREQ
	select DEVFREQ_THERMAL
	depends on !MALI_MIDGARD && MALI_MIDGARD!=m
	default n
	help
	  Enable this option to build support for a ARM Mali Bifrost GPU.

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

if MALI_BIFROST

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

config MALI_BIFROST_REAL_HW
	depends on MALI_BIFROST
	def_bool !MALI_BIFROST_NO_MALI

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

config MALI_BIFROST_CSF_SUPPORT
	bool "Enable Mali CSF based GPU support"
	depends on BROKEN # CHROMIUM: prevent enabling in board=arm64-generic
	depends on MALI_BIFROST=m
	default n
	help
	  Enables support for CSF based GPUs.

config MALI_BIFROST_DEVFREQ
	bool "Enable devfreq support for Mali"
	depends on MALI_BIFROST && 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_BIFROST_DVFS
	bool "Enable legacy DVFS"
	depends on MALI_BIFROST && !MALI_BIFROST_DEVFREQ
	depends on BROKEN
	default n
	help
	  Choose this option to enable legacy DVFS in the Mali Bifrost DDK.

config MALI_BIFROST_GATOR_SUPPORT
	bool "Enable Streamline tracing support"
	depends on MALI_BIFROST
	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_BIFROST_ENABLE_TRACE
	bool "Enable kbase tracing"
	depends on MALI_BIFROST
	default y if MALI_BIFROST_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_BIFROST_DMA_FENCE
	bool "Enable DMA_BUF fence support for Mali"
	depends on MALI_BIFROST
	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_BIFROST_ARBITER_SUPPORT
	bool "Enable arbiter support for Mali"
	depends on MALI_BIFROST && !MALI_BIFROST_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_BIFROST_DMA_BUF_MAP_ON_DEMAND
	bool "Enable map imported dma-bufs on demand"
	depends on MALI_BIFROST
	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_BIFROST_DMA_BUF_LEGACY_COMPAT
	bool "Enable legacy compatibility cache flush on dma-buf map"
	depends on MALI_BIFROST && !MALI_BIFROST_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_BIFROST_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_BIFROST_EXPERT
	depends on MALI_BIFROST
	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_BIFROST_EXPERT

config MALI_BIFROST_2MB_ALLOC
	bool "Attempt to allocate 2MB pages"
	depends on MALI_BIFROST && MALI_BIFROST_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_BIFROST_MEMORY_FULLY_BACKED
	bool "Enable memory fully physically-backed"
	depends on MALI_BIFROST && MALI_BIFROST_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_BIFROST_CORESTACK
	bool "Enable support of GPU core stack power control"
	depends on MALI_BIFROST && MALI_BIFROST_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_BIFROST && MALI_BIFROST_EXPERT

config MALI_BIFROST_NO_MALI
	bool "Enable No Mali"
	depends on MALI_BIFROST && MALI_BIFROST_EXPERT
	depends on BROKEN
	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_BIFROST_ERROR_INJECT
	bool "Enable No Mali error injection"
	depends on MALI_BIFROST && MALI_BIFROST_EXPERT && MALI_BIFROST_NO_MALI
	default n
	help
	  Enables insertion of errors to test module failure and recovery mechanisms.

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

comment "Debug options"
	depends on MALI_BIFROST && MALI_BIFROST_EXPERT

config MALI_BIFROST_DEBUG
	bool "Enable debug build"
	depends on MALI_BIFROST && MALI_BIFROST_EXPERT
	default n
	help
	  Select this option for increased checking and reporting of errors.

config MALI_BIFROST_FENCE_DEBUG
	bool "Enable debug sync fence usage"
	depends on MALI_BIFROST && MALI_BIFROST_EXPERT && (SYNC || SYNC_FILE)
	default y if MALI_BIFROST_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_BIFROST_SYSTEM_TRACE
	bool "Enable system event tracing support"
	depends on MALI_BIFROST && MALI_BIFROST_EXPERT
	default y if MALI_BIFROST_DEBUG
	depends on BROKEN
	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_BIFROST && MALI_BIFROST_EXPERT

choice
	prompt "Select Performance counters set"
	default MALI_BIFROST_PRFCNT_SET_PRIMARY
	depends on MALI_BIFROST && MALI_BIFROST_EXPERT

config MALI_BIFROST_PRFCNT_SET_PRIMARY
	bool "Primary"
	depends on MALI_BIFROST && MALI_BIFROST_EXPERT
	help
	  Select this option to use primary set of performance counters.

config MALI_BIFROST_PRFCNT_SET_SECONDARY
	bool "Secondary"
	depends on MALI_BIFROST && MALI_BIFROST_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_BIFROST_PRFCNT_SET_PRIMARY.

config MALI_BIFROST_PRFCNT_SET_TERTIARY
	bool "Tertiary"
	depends on MALI_BIFROST && MALI_BIFROST_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_BIFROST_PRFCNT_SET_PRIMARY.

endchoice

config MALI_BIFROST_PRFCNT_SET_SELECT_VIA_DEBUG_FS
	bool "Enable runtime selection of performance counters set via debugfs"
	depends on MALI_BIFROST && MALI_BIFROST_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_BIFROST_JOB_DUMP
	bool "Enable system level support needed for job dumping"
	depends on MALI_BIFROST && MALI_BIFROST_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_BIFROST && MALI_BIFROST_EXPERT

config MALI_BIFROST_PWRSOFT_765
	bool "Enable workaround for PWRSOFT-765"
	depends on MALI_BIFROST && MALI_BIFROST_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_BIFROST_HW_ERRATA_1485982_NOT_AFFECTED
	bool "Disable workaround for BASE_HW_ISSUE_GPU2017_1336"
	depends on MALI_BIFROST && MALI_BIFROST_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_BIFROST_HW_ERRATA_1485982_USE_CLOCK_ALTERNATIVE
	bool "Use alternative workaround for BASE_HW_ISSUE_GPU2017_1336"
	depends on MALI_BIFROST && MALI_BIFROST_EXPERT && !MALI_BIFROST_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_BIFROST_ARBITRATION
	bool "Enable Virtualization reference code"
	depends on BROKEN # CHROMIUM: prevent enabling in board=arm64-generic
	depends on MALI_BIFROST
	default n
	help
	  Enables the build of several reference modules used in the reference
	  virtualization setup for Mali
	  If unsure, say N.

if MALI_BIFROST_ARBITRATION
source "drivers/gpu/arm/mali/arbitration/Kconfig"
endif

endif
