123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- /* SPDX-License-Identifier: GPL-2.0-only */
- /*
- * Copyright (c) 2020, The Linux Foundation. All rights reserved.
- */
- #ifndef __SDE_VM_H__
- #define __SDE_VM_H__
- #include "msm_drv.h"
- struct sde_kms;
- /**
- * sde_vm_irq_entry - VM irq specification
- * @label - VM_IRQ_LABEL assigned by Hyp RM
- * @irq - linux mapped irq number
- */
- struct sde_vm_irq_entry {
- u32 label;
- u32 irq;
- };
- /**
- * sde_vm_irq_desc - list of IRQ's to be handled
- * @n_irq - irq count
- * @irq_entries - list of sde_vm_irq_entry
- */
- struct sde_vm_irq_desc {
- u32 n_irq;
- struct sde_vm_irq_entry *irq_entries;
- };
- /**
- * sde_vm - VM layer descriptor. Abstract for all the VM's
- * @vm_res_lock - mutex to protect resource updates
- * @mem_notificaiton_cookie - Hyp RM notification identifier
- * @n_irq_lent - irq count
- * @io_mem_handle - RM identifier for the IO range
- * @sde_kms - handle to sde_kms
- */
- struct sde_vm {
- struct mutex vm_res_lock;
- void *mem_notification_cookie;
- atomic_t n_irq_lent;
- int io_mem_handle;
- struct sde_kms *sde_kms;
- };
- /**
- * sde_vm_primary - VM layer descriptor for Primary VM
- * @base - parent struct object
- * @irq_desc - cache copy of irq list for validating reclaim
- */
- struct sde_vm_primary {
- struct sde_vm base;
- struct sde_vm_irq_desc *irq_desc;
- };
- /**
- * sde_vm_trusted - VM layer descriptor for Trusted VM
- * @base - parent struct object
- * @sgl_desc - hyp RM sgl list descriptor for IO ranges
- * @irq_desc - irq list
- */
- struct sde_vm_trusted {
- struct sde_vm base;
- struct sde_vm_irq_desc *irq_desc;
- struct hh_sgl_desc *sgl_desc;
- };
- /**
- * sde_vm_ops - VM specific function hooks
- */
- struct sde_vm_ops {
- /**
- * vm_acquire - hook to handle HW accept
- * @kms - handle to sde_kms
- * @return - return 0 on success
- */
- int (*vm_acquire)(struct sde_kms *kms);
- /**
- * vm_release - hook to handle HW release
- * @kms - handle to sde_kms
- * @return - return 0 on success
- */
- int (*vm_release)(struct sde_kms *kms);
- /**
- * vm_owns_hw - hook to query the HW status of the VM
- * @kms - handle to sde_kms
- * @return - return true when vm owns the hw
- */
- bool (*vm_owns_hw)(struct sde_kms *kms);
- /**
- * vm_prepare_commit - hook to handle operations before the first
- commit after acquiring the HW
- * @sde_kms - handle to sde_kms
- * @state - global atomic state to be parsed
- * @return - return 0 on success
- */
- int (*vm_prepare_commit)(struct sde_kms *sde_kms,
- struct drm_atomic_state *state);
- /**
- * vm_post_commit - hook to handle operations after
- last commit before release
- * @sde_kms - handle to sde_kms
- * @state - global atomic state to be parsed
- * @return - return 0 on success
- */
- int (*vm_post_commit)(struct sde_kms *sde_kms,
- struct drm_atomic_state *state);
- /**
- * vm_deinit - deinitialize VM layer
- * @kms - pointer to sde_kms
- * @ops - primary VM specific ops functions
- */
- void (*vm_deinit)(struct sde_kms *kms, struct sde_vm_ops *ops);
- };
- /**
- * sde_vm_primary_init - Initialize primary VM layer
- * @kms - pointer to sde_kms
- * @ops - primary VM specific ops functions
- * @return - 0 on success
- */
- int sde_vm_primary_init(struct sde_kms *kms, struct sde_vm_ops *ops);
- /**
- * sde_vm_trusted_init - Initialize Trusted VM layer
- * @kms - pointer to sde_kms
- * @ops - primary VM specific ops functions
- * @return - 0 on success
- */
- int sde_vm_trusted_init(struct sde_kms *kms, struct sde_vm_ops *ops);
- #endif /* __SDE_VM_H__ */
|