README.md
Rendering markdown...
//
// Created by hawkes on 4/28/20.
//
#ifndef ADRENALINE_ADRENALINE_H
#define ADRENALINE_ADRENALINE_H
enum kgsl_user_mem_type {
KGSL_USER_MEM_TYPE_PMEM = 0x00000000,
KGSL_USER_MEM_TYPE_ASHMEM = 0x00000001,
KGSL_USER_MEM_TYPE_ADDR = 0x00000002,
KGSL_USER_MEM_TYPE_ION = 0x00000003,
KGSL_USER_MEM_TYPE_DMABUF = 0x00000003,
KGSL_USER_MEM_TYPE_MAX = 0x00000007,
};
struct kgsl_map_user_mem {
int fd;
unsigned long gpuaddr; /*output param */
size_t len;
size_t offset;
unsigned long hostptr; /*input param */
enum kgsl_user_mem_type memtype;
unsigned int flags;
};
struct kgsl_drawctxt_create {
unsigned int flags;
unsigned int drawctxt_id; /*output param */
};
/* destroy a draw context */
struct kgsl_drawctxt_destroy {
unsigned int drawctxt_id;
};
struct kgsl_command_object {
uint64_t offset;
uint64_t gpuaddr;
uint64_t size;
unsigned int flags;
unsigned int id;
};
struct kgsl_gpu_command {
uint64_t flags;
uint64_t __user cmdlist;
unsigned int cmdsize;
unsigned int numcmds;
uint64_t __user objlist;
unsigned int objsize;
unsigned int numobjs;
uint64_t __user synclist;
unsigned int syncsize;
unsigned int numsyncs;
unsigned int context_id;
unsigned int timestamp;
};
#define KGSL_IOC_TYPE 0x09
#define IOCTL_KGSL_DRAWCTXT_CREATE \
_IOWR(KGSL_IOC_TYPE, 0x13, struct kgsl_drawctxt_create)
#define IOCTL_KGSL_DRAWCTXT_DESTROY \
_IOW(KGSL_IOC_TYPE, 0x14, struct kgsl_drawctxt_destroy)
#define IOCTL_KGSL_MAP_USER_MEM \
_IOWR(KGSL_IOC_TYPE, 0x15, struct kgsl_map_user_mem)
#define IOCTL_KGSL_GPU_COMMAND \
_IOWR(KGSL_IOC_TYPE, 0x4A, struct kgsl_gpu_command)
#define KGSL_CMDLIST_IB 0x00000001U
#define KGSL_MEMFLAGS_USE_CPU_MAP 0x10000000ULL
#define CP_TYPE4_PKT (4 << 28)
#define CP_TYPE7_PKT (7 << 28)
#define CP_NOP 0x10
#define CP_WAIT_FOR_ME 0x13
#define CP_WAIT_FOR_IDLE 0x26
#define CP_WAIT_REG_MEM 0x3c
#define CP_MEM_WRITE 0x3d
/* Load a buffer with pre-fetch enabled */
/* corrupts ring buffer */
#define CP_INDIRECT_BUFFER_PFE 0x3f
#define CP_SET_DRAW_STATE 0x43
#define CP_MEM_TO_MEM 0x73
/* switches SMMU pagetable, used on a5xx only */
#define CP_SMMU_TABLE_UPDATE 0x53
#define upper_32_bits(n) ((uint32_t)(((n) >> 16) >> 16))
#define lower_32_bits(n) ((uint32_t)(n))
static inline uint cp_gpuaddr(uint *cmds, uint64_t gpuaddr)
{
uint *start = cmds;
*cmds++ = lower_32_bits(gpuaddr);
*cmds++ = upper_32_bits(gpuaddr);
return cmds - start;
}
static inline uint pm4_calc_odd_parity_bit(uint val) {
return (0x9669 >> (0xf & ((val) ^
((val) >> 4) ^ ((val) >> 8) ^ ((val) >> 12) ^
((val) >> 16) ^ ((val) >> 20) ^ ((val) >> 24) ^
((val) >> 28)))) & 1;
}
static inline uint cp_type7_packet(uint opcode, uint cnt) {
return CP_TYPE7_PKT | ((cnt) << 0) |
(pm4_calc_odd_parity_bit(cnt) << 15) |
(((opcode) & 0x7F) << 16) |
((pm4_calc_odd_parity_bit(opcode) << 23));
}
static inline uint cp_wait_for_me(
uint *cmds)
{
uint *start = cmds;
*cmds++ = cp_type7_packet(CP_WAIT_FOR_ME, 0);
return cmds - start;
}
static inline uint cp_mem_packet(int opcode, uint size, uint num_mem) {
return cp_type7_packet(opcode, size + num_mem);
}
static inline uint cp_wait_for_idle(
uint *cmds)
{
uint *start = cmds;
*cmds++ = cp_type7_packet(CP_WAIT_FOR_IDLE, 0);
return cmds - start;
}
static inline int _adreno_iommu_add_idle_indirect_cmds(
unsigned int *cmds)
{
unsigned int *start = cmds;
cmds += cp_wait_for_me(cmds);
*cmds++ = cp_mem_packet(CP_INDIRECT_BUFFER_PFE, 2, 1);
cmds += cp_gpuaddr(cmds, 0xfc000000+1024);
*cmds++ = 2;
cmds += cp_wait_for_idle(cmds);
return cmds - start;
}
static inline uint cp_type4_packet(uint opcode, uint cnt)
{
return CP_TYPE4_PKT | ((cnt) << 0) |
(pm4_calc_odd_parity_bit(cnt) << 7) |
(((opcode) & 0x3FFFF) << 8) |
((pm4_calc_odd_parity_bit(opcode) << 27));
}
static inline uint cp_register(
unsigned int reg, unsigned int size)
{
return cp_type4_packet(reg, size);
}
static inline uint cp_invalidate_state(
uint *cmds)
{
uint *start = cmds;
*cmds++ = cp_type7_packet(CP_SET_DRAW_STATE, 3);
*cmds++ = 0x40000;
*cmds++ = 0;
*cmds++ = 0;
return cmds - start;
}
#endif //ADRENALINE_ADRENALINE_H