171 lines
7.4 KiB
C
171 lines
7.4 KiB
C
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
|
/*
|
|
*
|
|
* (C) COPYRIGHT 2019-2022 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.
|
|
*
|
|
*/
|
|
|
|
/**
|
|
* DOC: Defines the Mali arbiter interface
|
|
*/
|
|
|
|
#ifndef _MALI_KBASE_ARBITER_INTERFACE_H_
|
|
#define _MALI_KBASE_ARBITER_INTERFACE_H_
|
|
|
|
/**
|
|
* DOC: 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_ARBITER_INTERFACE_VERSION 5
|
|
|
|
/**
|
|
* DOC: 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
|
|
*
|
|
* @arb_vm_gpu_stop: Callback to 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.
|
|
* @arb_vm_gpu_granted: Callback to indicate that GPU has been granted to VM.
|
|
* dev: The arbif kernel module device.
|
|
*
|
|
* Informs KBase that the GPU can now be used by the VM.
|
|
* @arb_vm_gpu_lost: Callback to indicate that 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.
|
|
* @arb_vm_max_config: Callback to send the 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.
|
|
* @arb_vm_update_freq: Callback to notify that 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.
|
|
*
|
|
* 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 {
|
|
void (*arb_vm_gpu_stop)(struct device *dev);
|
|
void (*arb_vm_gpu_granted)(struct device *dev);
|
|
void (*arb_vm_gpu_lost)(struct device *dev);
|
|
void (*arb_vm_max_config)(struct device *dev, uint32_t max_l2_slices,
|
|
uint32_t max_core_mask);
|
|
void (*arb_vm_update_freq)(struct device *dev, uint32_t freq);
|
|
};
|
|
|
|
/**
|
|
* struct arbiter_if_vm_arb_ops - Interface to communicate messages to arbiter
|
|
*
|
|
* @vm_arb_register_dev: Callback to register VM device driver callbacks.
|
|
* arbif_dev: The arbiter interface to register
|
|
* with for device callbacks
|
|
* dev: The device structure to supply in the callbacks.
|
|
* ops: The callbacks that the device driver supports
|
|
* (none are optional).
|
|
*
|
|
* Returns
|
|
* 0 - successful.
|
|
* -EINVAL - invalid argument.
|
|
* -EPROBE_DEFER - module dependencies are not yet
|
|
* available.
|
|
* @vm_arb_unregister_dev: Callback to unregister VM device driver callbacks.
|
|
* arbif_dev: The arbiter interface to unregistering
|
|
* from.
|
|
* @vm_arb_get_max_config: Callback to Request the max config from the Arbiter.
|
|
* arbif_dev: The arbiter interface to issue the
|
|
* request to.
|
|
* @vm_arb_gpu_request: Callback to ask the arbiter interface for GPU access.
|
|
* arbif_dev: The arbiter interface to issue the request
|
|
* to.
|
|
* @vm_arb_gpu_active: Callback to inform arbiter that driver has gone active.
|
|
* arbif_dev: The arbiter interface device to notify.
|
|
* @vm_arb_gpu_idle: Callback to inform the arbiter that driver has gone idle.
|
|
* arbif_dev: The arbiter interface device to notify.
|
|
* @vm_arb_gpu_stopped: Callback to inform arbiter that driver has stopped
|
|
* using the GPU
|
|
* arbif_dev: The arbiter interface device to notify.
|
|
* gpu_required: The GPU is still needed to do more work.
|
|
*
|
|
* 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 {
|
|
int (*vm_arb_register_dev)(struct arbiter_if_dev *arbif_dev,
|
|
struct device *dev, struct arbiter_if_arb_vm_ops *ops);
|
|
void (*vm_arb_unregister_dev)(struct arbiter_if_dev *arbif_dev);
|
|
void (*vm_arb_get_max_config)(struct arbiter_if_dev *arbif_dev);
|
|
void (*vm_arb_gpu_request)(struct arbiter_if_dev *arbif_dev);
|
|
void (*vm_arb_gpu_active)(struct arbiter_if_dev *arbif_dev);
|
|
void (*vm_arb_gpu_idle)(struct arbiter_if_dev *arbif_dev);
|
|
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_ */
|