diff options
author | Sidath Senanayake <sidaths@google.com> | 2021-01-29 14:51:21 +0000 |
---|---|---|
committer | Sidath Senanayake <sidaths@google.com> | 2021-01-29 14:51:21 +0000 |
commit | 201c8bfb4637601363b6e9283f3bdc510711a226 (patch) | |
tree | afa8b543c81e78e5b82156be5d5266060c71e069 /mali_kbase/arbiter | |
parent | 72f2457ff7355ff0389efe5bc9cec3365362d8c4 (diff) | |
download | gpu-201c8bfb4637601363b6e9283f3bdc510711a226.tar.gz |
Mali Valhall DDK r28p0 KMD
Provenance:
f61f43e2c (collaborate/EAC/v_r28p0)
VX504X08X-BU-00000-r28p0-01eac0 - Android DDK
VX504X08X-SW-99006-r28p0-01eac0 - Android Renderscript AOSP parts
VX504X08X-BU-60000-r28p0-01eac0 - Android Document Bundle
VX504X08X-DC-11001-r28p0-01eac0 - Valhall Android DDK Software Errata
Signed-off-by: Sidath Senanayake <sidaths@google.com>
Change-Id: Iafabf59869cc06a23d69668f6ae1a152cb86b7f3
Diffstat (limited to 'mali_kbase/arbiter')
-rw-r--r-- | mali_kbase/arbiter/mali_kbase_arbif.c | 56 | ||||
-rw-r--r-- | mali_kbase/arbiter/mali_kbase_arbiter_pm.c | 139 |
2 files changed, 195 insertions, 0 deletions
diff --git a/mali_kbase/arbiter/mali_kbase_arbif.c b/mali_kbase/arbiter/mali_kbase_arbif.c index ddf1a0c..3bfc62d 100644 --- a/mali_kbase/arbiter/mali_kbase_arbif.c +++ b/mali_kbase/arbiter/mali_kbase_arbif.c @@ -34,6 +34,12 @@ #include <linux/of_platform.h> #include "mali_kbase_arbiter_interface.h" +/** + * on_gpu_stop() - sends KBASE_VM_GPU_STOP_EVT event on VM stop + * @dev: arbiter interface device handle + * + * call back function to signal a GPU STOP event from arbiter interface + */ static void on_gpu_stop(struct device *dev) { struct kbase_device *kbdev = dev_get_drvdata(dev); @@ -42,6 +48,12 @@ static void on_gpu_stop(struct device *dev) kbase_arbiter_pm_vm_event(kbdev, KBASE_VM_GPU_STOP_EVT); } +/** + * on_gpu_granted() - sends KBASE_VM_GPU_GRANTED_EVT event on GPU granted + * @dev: arbiter interface device handle + * + * call back function to signal a GPU GRANT event from arbiter interface + */ static void on_gpu_granted(struct device *dev) { struct kbase_device *kbdev = dev_get_drvdata(dev); @@ -50,6 +62,12 @@ static void on_gpu_granted(struct device *dev) kbase_arbiter_pm_vm_event(kbdev, KBASE_VM_GPU_GRANTED_EVT); } +/** + * on_gpu_lost() - sends KBASE_VM_GPU_LOST_EVT event on GPU granted + * @dev: arbiter interface device handle + * + * call back function to signal a GPU LOST event from arbiter interface + */ static void on_gpu_lost(struct device *dev) { struct kbase_device *kbdev = dev_get_drvdata(dev); @@ -57,6 +75,14 @@ static void on_gpu_lost(struct device *dev) kbase_arbiter_pm_vm_event(kbdev, KBASE_VM_GPU_LOST_EVT); } +/** + * kbase_arbif_init() - Kbase Arbiter interface initialisation. + * @kbdev: The kbase device structure for the device (must be a valid pointer) + * + * Initialise Kbase Arbiter interface and assign callback functions. + * + * Return: 0 on success else a Linux error code + */ int kbase_arbif_init(struct kbase_device *kbdev) { #ifdef CONFIG_OF @@ -119,6 +145,12 @@ int kbase_arbif_init(struct kbase_device *kbdev) return 0; } +/** + * kbase_arbif_destroy() - De-init Kbase arbiter interface + * @kbdev: The kbase device structure for the device (must be a valid pointer) + * + * De-initialise Kbase arbiter interface + */ void kbase_arbif_destroy(struct kbase_device *kbdev) { struct arbiter_if_dev *arb_if = kbdev->arb.arb_if; @@ -133,6 +165,12 @@ void kbase_arbif_destroy(struct kbase_device *kbdev) kbdev->arb.arb_dev = NULL; } +/** + * kbase_arbif_gpu_request() - Request GPU from + * @kbdev: The kbase device structure for the device (must be a valid pointer) + * + * call back function from arb interface to arbiter requesting GPU for VM + */ void kbase_arbif_gpu_request(struct kbase_device *kbdev) { struct arbiter_if_dev *arb_if = kbdev->arb.arb_if; @@ -143,6 +181,12 @@ void kbase_arbif_gpu_request(struct kbase_device *kbdev) } } +/** + * kbase_arbif_gpu_stopped() - send GPU stopped message to the arbiter + * @kbdev: The kbase device structure for the device (must be a valid pointer) + * @gpu_required: GPU request flag + * + */ void kbase_arbif_gpu_stopped(struct kbase_device *kbdev, u8 gpu_required) { struct arbiter_if_dev *arb_if = kbdev->arb.arb_if; @@ -154,6 +198,12 @@ void kbase_arbif_gpu_stopped(struct kbase_device *kbdev, u8 gpu_required) } } +/** + * kbase_arbif_gpu_active() - Sends a GPU_ACTIVE message to the Arbiter + * @kbdev: The kbase device structure for the device (must be a valid pointer) + * + * Informs the arbiter VM is active + */ void kbase_arbif_gpu_active(struct kbase_device *kbdev) { struct arbiter_if_dev *arb_if = kbdev->arb.arb_if; @@ -164,6 +214,12 @@ void kbase_arbif_gpu_active(struct kbase_device *kbdev) } } +/** + * kbase_arbif_gpu_idle() - Inform the arbiter that the VM has gone idle + * @kbdev: The kbase device structure for the device (must be a valid pointer) + * + * Informs the arbiter VM is idle + */ void kbase_arbif_gpu_idle(struct kbase_device *kbdev) { struct arbiter_if_dev *arb_if = kbdev->arb.arb_if; diff --git a/mali_kbase/arbiter/mali_kbase_arbiter_pm.c b/mali_kbase/arbiter/mali_kbase_arbiter_pm.c index 02b5de2..1fc432b 100644 --- a/mali_kbase/arbiter/mali_kbase_arbiter_pm.c +++ b/mali_kbase/arbiter/mali_kbase_arbiter_pm.c @@ -39,6 +39,13 @@ static void kbase_arbiter_pm_vm_wait_gpu_assignment(struct kbase_device *kbdev); static inline bool kbase_arbiter_pm_vm_gpu_assigned_lockheld( struct kbase_device *kbdev); +/** + * kbase_arbiter_pm_vm_state_str() - Helper function to get string + * for kbase VM state.(debug) + * @state: kbase VM state + * + * Return: string representation of Kbase_vm_state + */ static inline const char *kbase_arbiter_pm_vm_state_str( enum kbase_vm_state state) { @@ -73,6 +80,13 @@ static inline const char *kbase_arbiter_pm_vm_state_str( } } +/** + * kbase_arbiter_pm_vm_event_str() - Helper function to get string + * for kbase VM event.(debug) + * @evt: kbase VM state + * + * Return: String representation of Kbase_arbif_event + */ static inline const char *kbase_arbiter_pm_vm_event_str( enum kbase_arbif_evt evt) { @@ -99,6 +113,13 @@ static inline const char *kbase_arbiter_pm_vm_event_str( } } +/** + * kbase_arbiter_pm_vm_set_state() - Sets new kbase_arbiter_vm_state + * @kbdev: The kbase device structure for the device (must be a valid pointer) + * @new_state: kbase VM new state + * + * This function sets the new state for the VM + */ static void kbase_arbiter_pm_vm_set_state(struct kbase_device *kbdev, enum kbase_vm_state new_state) { @@ -107,11 +128,19 @@ static void kbase_arbiter_pm_vm_set_state(struct kbase_device *kbdev, dev_dbg(kbdev->dev, "VM set_state %s -> %s", kbase_arbiter_pm_vm_state_str(arb_vm_state->vm_state), kbase_arbiter_pm_vm_state_str(new_state)); + lockdep_assert_held(&arb_vm_state->vm_state_lock); arb_vm_state->vm_state = new_state; wake_up(&arb_vm_state->vm_state_wait); } +/** + * kbase_arbiter_pm_suspend_wq() - suspend work queue of the driver. + * @data: work queue + * + * Suspends work queue of the driver, when VM is in SUSPEND_PENDING or + * STOPPING_IDLE or STOPPING_ACTIVE state + */ static void kbase_arbiter_pm_suspend_wq(struct work_struct *data) { struct kbase_arbiter_vm_state *arb_vm_state = container_of(data, @@ -136,6 +165,13 @@ static void kbase_arbiter_pm_suspend_wq(struct work_struct *data) dev_dbg(kbdev->dev, "<%s\n", __func__); } +/** + * kbase_arbiter_pm_resume_wq() -Kbase resume work queue. + * @data: work item + * + * Resume work queue of the driver when VM is in STARTING state, + * else if its in STOPPING_ACTIVE will request a stop event. + */ static void kbase_arbiter_pm_resume_wq(struct work_struct *data) { struct kbase_arbiter_vm_state *arb_vm_state = container_of(data, @@ -160,6 +196,16 @@ static void kbase_arbiter_pm_resume_wq(struct work_struct *data) dev_dbg(kbdev->dev, "<%s\n", __func__); } +/** + * kbase_arbiter_pm_early_init() - Initialize arbiter for VM + * Paravirtualized use. + * @kbdev: The kbase device structure for the device (must be a valid pointer) + * + * Initialize the arbiter and other required resources during the runtime + * and request the GPU for the VM for the first time. + * + * Return: 0 if success, or a Linux error code + */ int kbase_arbiter_pm_early_init(struct kbase_device *kbdev) { int err; @@ -179,6 +225,7 @@ int kbase_arbiter_pm_early_init(struct kbase_device *kbdev) WQ_HIGHPRI); if (!arb_vm_state->vm_arb_wq) { dev_err(kbdev->dev, "Failed to allocate vm_arb workqueue\n"); + kfree(arb_vm_state); return -ENOMEM; } INIT_WORK(&arb_vm_state->vm_suspend_work, kbase_arbiter_pm_suspend_wq); @@ -210,6 +257,12 @@ arbif_init_fail: return err; } +/** + * kbase_arbiter_pm_early_term() - Shutdown arbiter and free resources + * @kbdev: The kbase device structure for the device (must be a valid pointer) + * + * Clean up all the resources + */ void kbase_arbiter_pm_early_term(struct kbase_device *kbdev) { struct kbase_arbiter_vm_state *arb_vm_state = kbdev->pm.arb_vm_state; @@ -227,6 +280,12 @@ void kbase_arbiter_pm_early_term(struct kbase_device *kbdev) kbdev->pm.arb_vm_state = NULL; } +/** + * kbase_arbiter_pm_release_interrupts() - Release the GPU interrupts + * @kbdev: The kbase device structure for the device (must be a valid pointer) + * + * Releases interrupts if needed (GPU is available) otherwise does nothing + */ void kbase_arbiter_pm_release_interrupts(struct kbase_device *kbdev) { struct kbase_arbiter_vm_state *arb_vm_state = kbdev->pm.arb_vm_state; @@ -240,6 +299,12 @@ void kbase_arbiter_pm_release_interrupts(struct kbase_device *kbdev) mutex_unlock(&arb_vm_state->vm_state_lock); } +/** + * kbase_arbiter_pm_vm_stopped() - Handle stop state for the VM + * @kbdev: The kbase device structure for the device (must be a valid pointer) + * + * Handles a stop state for the VM + */ void kbase_arbiter_pm_vm_stopped(struct kbase_device *kbdev) { bool request_gpu = false; @@ -277,6 +342,12 @@ void kbase_arbiter_pm_vm_stopped(struct kbase_device *kbdev) kbase_arbif_gpu_stopped(kbdev, request_gpu); } +/** + * kbase_arbiter_pm_vm_gpu_start() - Handles the start state of the VM + * @kbdev: The kbase device structure for the device (must be a valid pointer) + * + * Handles the start state of the VM + */ static void kbase_arbiter_pm_vm_gpu_start(struct kbase_device *kbdev) { struct kbase_arbiter_vm_state *arb_vm_state = kbdev->pm.arb_vm_state; @@ -306,6 +377,12 @@ static void kbase_arbiter_pm_vm_gpu_start(struct kbase_device *kbdev) } } +/** + * kbase_arbiter_pm_vm_gpu_stop() - Handles the stop state of the VM + * @kbdev: The kbase device structure for the device (must be a valid pointer) + * + * Handles the start state of the VM + */ static void kbase_arbiter_pm_vm_gpu_stop(struct kbase_device *kbdev) { struct kbase_arbiter_vm_state *arb_vm_state = kbdev->pm.arb_vm_state; @@ -348,6 +425,12 @@ static void kbase_arbiter_pm_vm_gpu_stop(struct kbase_device *kbdev) } } +/** + * kbase_gpu_lost() - Kbase signals GPU is lost on a lost event signal + * @kbdev: The kbase device structure for the device (must be a valid pointer) + * + * On GPU lost event signals GPU_LOST to the aribiter + */ static void kbase_gpu_lost(struct kbase_device *kbdev) { struct kbase_arbiter_vm_state *arb_vm_state = kbdev->pm.arb_vm_state; @@ -396,6 +479,13 @@ static void kbase_gpu_lost(struct kbase_device *kbdev) } } +/** + * kbase_arbiter_pm_vm_os_suspend_ready_state() - checks if VM is ready + * to be moved to suspended state. + * @kbdev: The kbase device structure for the device (must be a valid pointer) + * + * Return: True if its ready to be suspended else False. + */ static inline bool kbase_arbiter_pm_vm_os_suspend_ready_state( struct kbase_device *kbdev) { @@ -410,6 +500,14 @@ static inline bool kbase_arbiter_pm_vm_os_suspend_ready_state( } } +/** + * kbase_arbiter_pm_vm_os_prepare_suspend() - Prepare OS to be in suspend state + * until it receives the grant message from arbiter + * @kbdev: The kbase device structure for the device (must be a valid pointer) + * + * Prepares OS to be in suspend state until it receives GRANT message + * from Arbiter asynchronously. + */ static void kbase_arbiter_pm_vm_os_prepare_suspend(struct kbase_device *kbdev) { struct kbase_arbiter_vm_state *arb_vm_state = kbdev->pm.arb_vm_state; @@ -475,6 +573,14 @@ static void kbase_arbiter_pm_vm_os_prepare_suspend(struct kbase_device *kbdev) } } +/** + * kbase_arbiter_pm_vm_os_resume() - Resume OS function once it receives + * a grant message from arbiter + * @kbdev: The kbase device structure for the device (must be a valid pointer) + * + * Resume OS function once it receives GRANT message + * from Arbiter asynchronously. + */ static void kbase_arbiter_pm_vm_os_resume(struct kbase_device *kbdev) { struct kbase_arbiter_vm_state *arb_vm_state = kbdev->pm.arb_vm_state; @@ -498,6 +604,14 @@ static void kbase_arbiter_pm_vm_os_resume(struct kbase_device *kbdev) mutex_lock(&arb_vm_state->vm_state_lock); } +/** + * kbase_arbiter_pm_vm_event() - Dispatch VM event to the state machine. + * @kbdev: The kbase device structure for the device (must be a valid pointer) + * @evt: VM event + * + * The state machine function. Receives events and transitions states + * according the event received and the current state + */ void kbase_arbiter_pm_vm_event(struct kbase_device *kbdev, enum kbase_arbif_evt evt) { @@ -586,6 +700,12 @@ void kbase_arbiter_pm_vm_event(struct kbase_device *kbdev, KBASE_EXPORT_TEST_API(kbase_arbiter_pm_vm_event); +/** + * kbase_arbiter_pm_vm_wait_gpu_assignment() - VM wait for a GPU assignment. + * @kbdev: The kbase device structure for the device (must be a valid pointer) + * + * VM waits for a GPU assignment. + */ static void kbase_arbiter_pm_vm_wait_gpu_assignment(struct kbase_device *kbdev) { struct kbase_arbiter_vm_state *arb_vm_state = kbdev->pm.arb_vm_state; @@ -597,6 +717,12 @@ static void kbase_arbiter_pm_vm_wait_gpu_assignment(struct kbase_device *kbdev) dev_dbg(kbdev->dev, "Waiting for GPU assignment - done\n"); } +/** + * kbase_arbiter_pm_vm_gpu_assigned_lockheld() - Check if VM holds VM state lock + * @kbdev: The kbase device structure for the device (must be a valid pointer) + * + * Checks if the virtual machine holds VM state lock. + */ static inline bool kbase_arbiter_pm_vm_gpu_assigned_lockheld( struct kbase_device *kbdev) { @@ -607,6 +733,19 @@ static inline bool kbase_arbiter_pm_vm_gpu_assigned_lockheld( arb_vm_state->vm_state == KBASE_VM_STATE_ACTIVE); } +/** + * kbase_arbiter_pm_ctx_active_handle_suspend() - Handle suspend operation for + * arbitration mode + * @kbdev: The kbase device structure for the device (must be a valid pointer) + * @suspend_handler: The handler code for how to handle a suspend + * that might occur + * + * This function handles a suspend event from the driver, + * communicating with the arbiter and waiting synchronously for the GPU + * to be granted again depending on the VM state. + * + * Return: 0 on success else 1 suspend handler isn not possible. + */ int kbase_arbiter_pm_ctx_active_handle_suspend(struct kbase_device *kbdev, enum kbase_pm_suspend_handler suspend_handler) { |