6db4831e98
Android 14
208 lines
4.5 KiB
C
208 lines
4.5 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
/*
|
|
* Copyright (c) 2020 MediaTek Inc.
|
|
*/
|
|
|
|
#ifndef __APUSYS_DEVICE_H__
|
|
#define __APUSYS_DEVICE_H__
|
|
|
|
/* device type */
|
|
enum {
|
|
APUSYS_DEVICE_NONE,
|
|
|
|
APUSYS_DEVICE_SAMPLE = 1,
|
|
APUSYS_DEVICE_MDLA = 2,
|
|
APUSYS_DEVICE_VPU = 3,
|
|
APUSYS_DEVICE_EDMA = 4,
|
|
APUSYS_DEVICE_EDMA_3_0 = 5,
|
|
APUSYS_DEVICE_RT = 32,
|
|
APUSYS_DEVICE_SAMPLE_RT = 33,
|
|
APUSYS_DEVICE_MDLA_RT = 34,
|
|
APUSYS_DEVICE_VPU_RT = 35,
|
|
APUSYS_DEVICE_LAST,
|
|
|
|
APUSYS_DEVICE_MAX = 64, //total support 64 different devices
|
|
};
|
|
|
|
|
|
/* device cmd type */
|
|
enum {
|
|
APUSYS_CMD_POWERON,
|
|
APUSYS_CMD_POWERDOWN,
|
|
APUSYS_CMD_RESUME,
|
|
APUSYS_CMD_SUSPEND,
|
|
APUSYS_CMD_EXECUTE,
|
|
APUSYS_CMD_PREEMPT,
|
|
|
|
APUSYS_CMD_FIRMWARE, // setup firmware
|
|
APUSYS_CMD_USER, //user defined
|
|
|
|
APUSYS_CMD_MAX,
|
|
};
|
|
|
|
/* device preempt type */
|
|
enum {
|
|
// device don't support preemption
|
|
APUSYS_PREEMPT_NONE,
|
|
// midware should resend preempted command after preemption call
|
|
APUSYS_PREEMPT_RESEND,
|
|
// midware don't need to resend cmd, and wait preempted cmd completed
|
|
APUSYS_PREEMPT_WAITCOMPLETED,
|
|
|
|
APUSYS_PREEMPT_MAX,
|
|
};
|
|
|
|
enum {
|
|
APUSYS_FIRMWARE_UNLOAD,
|
|
APUSYS_FIRMWARE_LOAD,
|
|
};
|
|
|
|
/* handle definition for send_cmd */
|
|
struct apusys_power_hnd {
|
|
uint32_t opp;
|
|
int boost_val;
|
|
|
|
uint32_t timeout;
|
|
};
|
|
|
|
struct apusys_kmem {
|
|
unsigned long long uva;
|
|
unsigned long long kva;
|
|
unsigned int iova;
|
|
unsigned int size;
|
|
unsigned int iova_size;
|
|
|
|
unsigned int align;
|
|
unsigned int cache;
|
|
|
|
int mem_type;
|
|
int fd;
|
|
unsigned long long khandle;
|
|
int uidr;
|
|
int property;
|
|
};
|
|
|
|
struct apusys_mdla_data {
|
|
uint64_t pmu_kva;
|
|
uint64_t cmd_entry;
|
|
};
|
|
|
|
/* cmd handle */
|
|
struct apusys_cmd_hnd {
|
|
/* cmd info */
|
|
uint64_t kva;
|
|
uint32_t iova;
|
|
uint32_t size;
|
|
|
|
struct apusys_kmem *cmdbuf;
|
|
|
|
uint64_t cmd_id;
|
|
uint32_t subcmd_idx;
|
|
uint8_t priority;
|
|
|
|
uint32_t ip_time;
|
|
int boost_val;
|
|
int cluster_size;
|
|
|
|
/* mdw priv*/
|
|
uint64_t m_kva;
|
|
|
|
/* multicore info */
|
|
uint32_t multicore_total; // how many cores to exec this subcmd
|
|
uint32_t multicore_idx; // which part of subcmd
|
|
|
|
/* mdla specific */
|
|
uint64_t pmu_kva;
|
|
uint64_t cmd_entry;
|
|
uint32_t cmd_size;
|
|
|
|
/* For preemption */
|
|
int (*context_callback)(int a, int b, uint8_t c);
|
|
int ctx_id;
|
|
};
|
|
|
|
struct apusys_firmware_hnd {
|
|
char name[32];
|
|
uint32_t magic; // for user checking byself
|
|
|
|
uint64_t kva;
|
|
uint32_t iova;
|
|
uint32_t size;
|
|
|
|
int idx;
|
|
|
|
int op;
|
|
};
|
|
|
|
struct apusys_usercmd_hnd {
|
|
uint64_t kva;
|
|
uint32_t iova;
|
|
uint32_t size;
|
|
};
|
|
|
|
struct apusys_preempt_hnd {
|
|
struct apusys_cmd_hnd *new_cmd;
|
|
struct apusys_cmd_hnd *old_cmd; //TODO
|
|
};
|
|
|
|
/* device definition */
|
|
struct apusys_device {
|
|
int dev_type;
|
|
int idx;
|
|
int preempt_type;
|
|
uint8_t preempt_level;
|
|
|
|
void *private; // for hw driver to record private structure
|
|
|
|
int (*send_cmd)(int type, void *hnd, struct apusys_device *dev);
|
|
};
|
|
|
|
/*
|
|
* export function for hardware driver
|
|
* @apusys_register_device
|
|
* Description:
|
|
* for drvier register device to resource management,
|
|
* caller should allocate struct apusys_device struct byself
|
|
* midware can schedule task and preempt by current requests status
|
|
* 1. user should implement 6 callback function for midware
|
|
* Parameters:
|
|
* <dev>
|
|
* dev_type: apusys device type, define as APUSYS_DEVICE_CMD_E
|
|
* private: midware don't touch this,
|
|
* it's for user record some private data,
|
|
* midware will pass to driver when send_cmd()
|
|
* preempt_type:
|
|
* preempt_level:
|
|
* send_cmd: 6 callback user should implement
|
|
* 1. poweron: poweron device with specific opp
|
|
* return:
|
|
* success: 0
|
|
* fail: error code
|
|
* 2. poweroff: poweroff device
|
|
* return:
|
|
* success: 0
|
|
* fail: error code
|
|
* 3. suspend: suspend device (TODO)
|
|
* 4. resume: resume device (TODO)
|
|
* 5. excute: execute command with device
|
|
* parameter:
|
|
* reutrn:
|
|
* success: cmd id
|
|
* fail: 0
|
|
* 6. preempt: preempt device and run new command
|
|
* return:
|
|
* success: 0
|
|
* fail: linux error code (negative value)
|
|
*/
|
|
extern int apusys_register_device(struct apusys_device *dev);
|
|
extern int apusys_unregister_device(struct apusys_device *dev);
|
|
|
|
extern uint64_t apusys_mem_query_kva(uint32_t iova);
|
|
extern uint32_t apusys_mem_query_iova(uint64_t kva);
|
|
|
|
extern int apusys_mem_flush(struct apusys_kmem *mem);
|
|
extern int apusys_mem_invalidate(struct apusys_kmem *mem);
|
|
|
|
|
|
#endif
|