blob: c0137f7adc9d0fff3c39c3eb0b368cc160e1567d [file] [log] [blame]
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
/*
*
* (C) COPYRIGHT 2019-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.
*
*/
/**
* @file
* Defines the Mali arbiter interface
*/
#ifndef _MALI_KBASE_ARBITER_INTERFACE_H_
#define _MALI_KBASE_ARBITER_INTERFACE_H_
/**
* Mali arbiter interface version
*
* This specifies the current version of the configuration interface. Whenever
* the arbiter interface changes, so that integration effort is required, the
* version number will be increased. Each configuration must make an effort
* to check that it implements the correct version.
*
* Version history:
* 1 - Added the Mali arbiter configuration interface.
* 2 - Strip out reference code from header
* 3 - Removed DVFS utilization interface (DVFS moved to arbiter side)
* 4 - Added max_config support
* 5 - Added GPU clock frequency reporting support from arbiter
*/
#define MALI_KBASE_ARBITER_INTERFACE_VERSION 5
/**
* NO_FREQ is used in case platform doesn't support reporting frequency
*/
#define NO_FREQ 0
struct arbiter_if_dev;
/**
* struct arbiter_if_arb_vm_ops - Interface to communicate messages to VM
*
* This struct contains callbacks used to deliver messages
* from the arbiter to the corresponding VM.
*
* Note that calls into these callbacks may have synchronous calls back into
* the arbiter arbiter_if_vm_arb_ops callbacks below.
* For example vm_arb_gpu_stopped() may be called as a side effect of
* arb_vm_gpu_stop() being called here.
*/
struct arbiter_if_arb_vm_ops {
/**
* arb_vm_gpu_stop() - Ask VM to stop using GPU
* @dev: The arbif kernel module device.
*
* Informs KBase to stop using the GPU as soon as possible.
* @Note: Once the driver is no longer using the GPU, a call to
* vm_arb_gpu_stopped is expected by the arbiter.
*/
void (*arb_vm_gpu_stop)(struct device *dev);
/**
* arb_vm_gpu_granted() - GPU has been granted to VM
* @dev: The arbif kernel module device.
*
* Informs KBase that the GPU can now be used by the VM.
*/
void (*arb_vm_gpu_granted)(struct device *dev);
/**
* arb_vm_gpu_lost() - VM has lost the GPU
* @dev: The arbif kernel module device.
*
* This is called if KBase takes too long to respond to the arbiter
* stop request.
* Once this is called, KBase will assume that access to the GPU
* has been lost and will fail all running jobs and reset its
* internal state.
* If successful, will respond with a vm_arb_gpu_stopped message.
*/
void (*arb_vm_gpu_lost)(struct device *dev);
/**
* arb_vm_max_config() - Send max config info to the VM
* @dev: The arbif kernel module device.
* @max_l2_slices: The maximum number of L2 slices.
* @max_core_mask: The largest core mask.
*
* Informs KBase the maximum resources that can be allocated to the
* partition in use.
*/
void (*arb_vm_max_config)(struct device *dev, uint32_t max_l2_slices,
uint32_t max_core_mask);
/**
* arb_vm_update_freq() - GPU clock frequency has been updated
* @dev: The arbif kernel module device.
* @freq: GPU clock frequency value reported from arbiter
*
* Informs KBase that the GPU clock frequency has been updated.
*/
void (*arb_vm_update_freq)(struct device *dev, uint32_t freq);
};
/**
* struct arbiter_if_vm_arb_ops - Interface to communicate messages to arbiter
*
* This struct contains callbacks used to request operations
* from the VM to the arbiter
*
* Note that we must not make any synchronous calls back in to the VM
* (via arbiter_if_arb_vm_ops above) in the context of these callbacks.
*/
struct arbiter_if_vm_arb_ops {
/**
* vm_arb_register_dev() - Register VM device driver callbacks.
* @arbif_dev: The arbiter interface we are registering device callbacks
* @dev: The device structure to supply in the callbacks.
* @ops: The callbacks that the device driver supports
* (none are optional).
*
* Return:
* * 0 - successful.
* * -EINVAL - invalid argument.
* * -EPROBE_DEFER - module dependencies are not yet available.
*/
int (*vm_arb_register_dev)(struct arbiter_if_dev *arbif_dev,
struct device *dev, struct arbiter_if_arb_vm_ops *ops);
/**
* vm_arb_unregister_dev() - Unregister VM device driver callbacks.
* @arbif_dev: The arbiter interface we are unregistering from.
*/
void (*vm_arb_unregister_dev)(struct arbiter_if_dev *arbif_dev);
/**
* vm_arb_gpu_get_max_config() - Request the max config from the
* Arbiter.
* @arbif_dev: The arbiter interface we want to issue the request.
*/
void (*vm_arb_get_max_config)(struct arbiter_if_dev *arbif_dev);
/**
* vm_arb_gpu_request() - Ask the arbiter interface for GPU access.
* @arbif_dev: The arbiter interface we want to issue the request.
*/
void (*vm_arb_gpu_request)(struct arbiter_if_dev *arbif_dev);
/**
* vm_arb_gpu_active() - Inform arbiter that the driver has gone active
* @arbif_dev: The arbiter interface device.
*/
void (*vm_arb_gpu_active)(struct arbiter_if_dev *arbif_dev);
/**
* vm_arb_gpu_idle() - Inform the arbiter that the driver has gone idle
* @arbif_dev: The arbiter interface device.
*/
void (*vm_arb_gpu_idle)(struct arbiter_if_dev *arbif_dev);
/**
* vm_arb_gpu_stopped() - Inform the arbiter that the driver has stopped
* using the GPU
* @arbif_dev: The arbiter interface device.
* @gpu_required: The GPU is still needed to do more work.
*/
void (*vm_arb_gpu_stopped)(struct arbiter_if_dev *arbif_dev,
u8 gpu_required);
};
/**
* struct arbiter_if_dev - Arbiter Interface
* @vm_ops: Callback functions for connecting KBase with
* arbiter interface device.
* @priv_data: Internal arbif data not used by KBASE.
*
* Arbiter Interface Kernel Module State used for linking KBase
* with an arbiter interface platform device
*/
struct arbiter_if_dev {
struct arbiter_if_vm_arb_ops vm_ops;
void *priv_data;
};
#endif /* _MALI_KBASE_ARBITER_INTERFACE_H_ */