blob: f81ef54673911d81fab01e30cd09d034ddb8d209 [file] [log] [blame]
#ifndef __KGSL_CMDSTREAM_H
#define __KGSL_CMDSTREAM_H
#include <linux/msm_kgsl.h>
#include "kgsl_device.h"
#include "kgsl_log.h"
#ifdef KGSL_DEVICE_SHADOW_MEMSTORE_TO_USER
#define KGSL_CMDSTREAM_USE_MEM_TIMESTAMP
#endif /* KGSL_DEVICE_SHADOW_MEMSTORE_TO_USER */
#ifdef KGSL_CMDSTREAM_USE_MEM_TIMESTAMP
#define KGSL_CMDSTREAM_GET_SOP_TIMESTAMP(device, data) \
kgsl_sharedmem_read(&device->memstore, (data), \
KGSL_DEVICE_MEMSTORE_OFFSET(soptimestamp), 4)
#else
#define KGSL_CMDSTREAM_GET_SOP_TIMESTAMP(device, data) \
kgsl_yamato_regread(device, REG_CP_TIMESTAMP, (data))
#endif /* KGSL_CMDSTREAM_USE_MEM_TIMESTAMP */
#define KGSL_CMDSTREAM_GET_EOP_TIMESTAMP(device, data) \
kgsl_sharedmem_read(&device->memstore, (data), \
KGSL_DEVICE_MEMSTORE_OFFSET(eoptimestamp), 4)
/* Flags to control command packet settings */
#define KGSL_CMD_FLAGS_PMODE 0x00000001
#define KGSL_CMD_FLAGS_NO_TS_CMP 0x00000002
int kgsl_cmdstream_init(struct kgsl_device *device);
int kgsl_cmdstream_close(struct kgsl_device *device);
void kgsl_cmdstream_memqueue_drain(struct kgsl_device *device);
uint32_t
kgsl_cmdstream_readtimestamp(struct kgsl_device *device,
enum kgsl_timestamp_type type);
int kgsl_cmdstream_check_timestamp(struct kgsl_device *device,
unsigned int timestamp);
int
kgsl_cmdstream_freememontimestamp(struct kgsl_device *device,
struct kgsl_mem_entry *entry,
uint32_t timestamp,
enum kgsl_timestamp_type type);
static inline bool timestamp_cmp(unsigned int new, unsigned int old)
{
int ts_diff = new - old;
return (ts_diff >= 0) || (ts_diff < -20000);
}
#endif /* __KGSL_CMDSTREAM_H */