asahi: Add timestamp buffer ops

TODO: virt support (needs virglrenderer changes & virt ABI break)

Signed-off-by: Asahi Lina <lina@asahilina.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/32434>
This commit is contained in:
Asahi Lina 2024-12-01 03:11:56 +09:00 committed by Marge Bot
parent 6697fb26ed
commit fbb38a30a6
2 changed files with 72 additions and 0 deletions

View file

@ -343,6 +343,52 @@ agx_bo_export(struct agx_device *dev, struct agx_bo *bo)
return fd;
}
static int
agx_bo_bind_object(struct agx_device *dev, struct agx_bo *bo,
uint32_t *object_handle, size_t size_B, uint64_t offset_B,
uint32_t flags)
{
struct drm_asahi_gem_bind_object gem_bind = {
.op = ASAHI_BIND_OBJECT_OP_BIND,
.flags = flags,
.handle = bo->handle,
.vm_id = 0,
.offset = offset_B,
.range = size_B,
};
int ret = drmIoctl(dev->fd, DRM_IOCTL_ASAHI_GEM_BIND_OBJECT, &gem_bind);
if (ret) {
fprintf(stderr,
"DRM_IOCTL_ASAHI_GEM_BIND_OBJECT failed: %m (handle=%d)\n",
bo->handle);
}
*object_handle = gem_bind.object_handle;
return ret;
}
static int
agx_bo_unbind_object(struct agx_device *dev, uint32_t object_handle,
uint32_t flags)
{
struct drm_asahi_gem_bind_object gem_bind = {
.op = ASAHI_BIND_OBJECT_OP_UNBIND,
.flags = flags,
.object_handle = object_handle,
};
int ret = drmIoctl(dev->fd, DRM_IOCTL_ASAHI_GEM_BIND_OBJECT, &gem_bind);
if (ret) {
fprintf(stderr,
"DRM_IOCTL_ASAHI_GEM_BIND_OBJECT failed: %m (object_handle=%d)\n",
object_handle);
}
return ret;
}
static void
agx_get_global_ids(struct agx_device *dev)
{
@ -393,6 +439,8 @@ const agx_device_ops_t agx_device_drm_ops = {
.bo_mmap = agx_bo_mmap,
.get_params = agx_get_params,
.submit = agx_submit,
.bo_bind_object = agx_bo_bind_object,
.bo_unbind_object = agx_bo_unbind_object,
};
static uint64_t
@ -414,6 +462,12 @@ agx_init_timestamps(struct agx_device *dev)
dev->timestamp_to_ns.num = NSEC_PER_SEC / ts_gcd;
dev->timestamp_to_ns.den = dev->params.timer_frequency_hz / ts_gcd;
uint64_t user_ts_gcd = gcd(dev->params.timer_frequency_hz, NSEC_PER_SEC);
dev->user_timestamp_to_ns.num = NSEC_PER_SEC / user_ts_gcd;
dev->user_timestamp_to_ns.den =
dev->params.user_timestamp_frequency_hz / user_ts_gcd;
}
bool

View file

@ -84,6 +84,12 @@ typedef struct {
ssize_t (*get_params)(struct agx_device *dev, void *buf, size_t size);
int (*submit)(struct agx_device *dev, struct drm_asahi_submit *submit,
struct agx_submit_virt *virt);
int (*bo_bind_object)(struct agx_device *dev, struct agx_bo *bo,
uint32_t *object_handle, size_t size_B,
uint64_t offset_B, uint32_t flags);
int (*bo_unbind_object)(struct agx_device *dev, uint32_t object_handle,
uint32_t flags);
} agx_device_ops_t;
struct agx_device {
@ -161,6 +167,11 @@ struct agx_device {
uint64_t num;
uint64_t den;
} timestamp_to_ns;
struct {
uint64_t num;
uint64_t den;
} user_timestamp_to_ns;
};
static inline void *
@ -217,6 +228,13 @@ agx_gpu_time_to_ns(struct agx_device *dev, uint64_t gpu_time)
return (gpu_time * dev->timestamp_to_ns.num) / dev->timestamp_to_ns.den;
}
static inline uint64_t
agx_gpu_timestamp_to_ns(struct agx_device *dev, uint64_t gpu_timestamp)
{
return (gpu_timestamp * dev->user_timestamp_to_ns.num) /
dev->user_timestamp_to_ns.den;
}
void agx_get_device_uuid(const struct agx_device *dev, void *uuid);
void agx_get_driver_uuid(void *uuid);
unsigned agx_get_num_cores(const struct agx_device *dev);