| /* 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_ */ |