int validate_array_size;
int validate_count;
- drmBO *cached_reloc_buf;
uint32_t *cached_reloc_buf_data;
} dri_bufmgr_ttm;
int validate_index;
/** DRM buffer object containing relocation list */
- drmBO *reloc_buf;
uint32_t *reloc_buf_data;
struct dri_ttm_reloc *relocs;
req->bo_req.mask = INTEL_BO_MASK;
req->bo_req.fence_class = 0; /* Backwards compat. */
- if (ttm_buf->reloc_buf != NULL)
- arg->reloc_handle = ttm_buf->reloc_buf->handle;
+ if (ttm_buf->reloc_buf_data != NULL)
+ arg->reloc_ptr = (unsigned long)(void *)ttm_buf->reloc_buf_data;
else
- arg->reloc_handle = 0;
+ arg->reloc_ptr = 0;
/* Hook up the linked list of args for the kernel */
arg->next = 0;
{
dri_bo_ttm *bo_ttm = (dri_bo_ttm *)bo;
dri_bufmgr_ttm *bufmgr_ttm = (dri_bufmgr_ttm *)bo->bufmgr;
- int ret;
bo_ttm->relocs = malloc(sizeof(struct dri_ttm_reloc) *
bufmgr_ttm->max_relocs);
- if (bufmgr_ttm->cached_reloc_buf != NULL) {
- bo_ttm->reloc_buf = bufmgr_ttm->cached_reloc_buf;
+ if (bufmgr_ttm->cached_reloc_buf_data != NULL) {
bo_ttm->reloc_buf_data = bufmgr_ttm->cached_reloc_buf_data;
- bufmgr_ttm->cached_reloc_buf = NULL;
bufmgr_ttm->cached_reloc_buf_data = NULL;
} else {
- bo_ttm->reloc_buf = malloc(sizeof(bo_ttm->drm_bo));
- ret = drmBOCreate(bufmgr_ttm->fd,
- RELOC_BUF_SIZE(bufmgr_ttm->max_relocs), 0,
- NULL,
- DRM_BO_FLAG_MEM_LOCAL |
- DRM_BO_FLAG_READ |
- DRM_BO_FLAG_WRITE |
- DRM_BO_FLAG_MAPPABLE |
- DRM_BO_FLAG_CACHED,
- 0, bo_ttm->reloc_buf);
- if (ret) {
- fprintf(stderr, "Failed to create relocation BO: %s\n",
- strerror(-ret));
- return ret;
- }
-
- ret = drmBOMap(bufmgr_ttm->fd, bo_ttm->reloc_buf,
- DRM_BO_FLAG_READ | DRM_BO_FLAG_WRITE,
- 0, (void **)&bo_ttm->reloc_buf_data);
- if (ret) {
- fprintf(stderr, "Failed to map relocation BO: %s\n",
- strerror(-ret));
- return ret;
- }
+ bo_ttm->reloc_buf_data = calloc(1, RELOC_BUF_SIZE(bufmgr_ttm->max_relocs));
}
/* Initialize the relocation list with the header:
- * DWORD 0: relocation type, relocation count
- * DWORD 1: handle to next relocation list (currently none)
- * DWORD 2: unused
+ * DWORD 0: relocation count
+ * DWORD 1: relocation type
+ * DWORD 2+3: handle to next relocation list (currently none) 64-bits
* DWORD 3: unused
*/
- bo_ttm->reloc_buf_data[0] = I915_RELOC_TYPE_0 << 16;
- bo_ttm->reloc_buf_data[1] = 0;
+ bo_ttm->reloc_buf_data[0] = 0;
+ bo_ttm->reloc_buf_data[1] = I915_RELOC_TYPE_0;
bo_ttm->reloc_buf_data[2] = 0;
bo_ttm->reloc_buf_data[3] = 0;
ttm_buf->bo.bufmgr = bufmgr;
ttm_buf->name = name;
ttm_buf->refcount = 1;
- ttm_buf->reloc_buf = NULL;
ttm_buf->reloc_buf_data = NULL;
ttm_buf->relocs = NULL;
ttm_buf->last_flags = ttm_buf->drm_bo.flags;
ttm_buf->bo.bufmgr = bufmgr;
ttm_buf->name = name;
ttm_buf->refcount = 1;
- ttm_buf->reloc_buf = NULL;
ttm_buf->reloc_buf_data = NULL;
ttm_buf->relocs = NULL;
ttm_buf->last_flags = ttm_buf->drm_bo.flags;
if (--ttm_buf->refcount == 0) {
int ret;
- if (ttm_buf->reloc_buf) {
+ if (ttm_buf->reloc_buf_data) {
int i;
/* Unreference all the target buffers */
dri_bo_unreference(ttm_buf->relocs[i].target_buf);
free(ttm_buf->relocs);
- if (bufmgr_ttm->cached_reloc_buf == NULL) {
+ if (bufmgr_ttm->cached_reloc_buf_data == NULL) {
/* Cache a single relocation buffer allocation to avoid
* repeated create/map/unmap/destroy for batchbuffer
* relocations.
*/
- bufmgr_ttm->cached_reloc_buf = ttm_buf->reloc_buf;
bufmgr_ttm->cached_reloc_buf_data = ttm_buf->reloc_buf_data;
} else {
/* Free the kernel BO containing relocation entries */
- drmBOUnmap(bufmgr_ttm->fd, ttm_buf->reloc_buf);
- drmBOUnreference(bufmgr_ttm->fd, ttm_buf->reloc_buf);
- free(ttm_buf->reloc_buf);
+ free(ttm_buf->reloc_buf_data);
+ ttm_buf->reloc_buf_data = NULL;
}
}
{
dri_bufmgr_ttm *bufmgr_ttm = (dri_bufmgr_ttm *)bufmgr;
- if (bufmgr_ttm->cached_reloc_buf) {
- /* Free the cached kernel BO containing relocation entries */
- drmBOUnmap(bufmgr_ttm->fd, bufmgr_ttm->cached_reloc_buf);
- drmBOUnreference(bufmgr_ttm->fd, bufmgr_ttm->cached_reloc_buf);
- free(bufmgr_ttm->cached_reloc_buf);
+ if (bufmgr_ttm->cached_reloc_buf_data) {
+ free(bufmgr_ttm->cached_reloc_buf_data);
}
free(bufmgr_ttm->validate_array);
{
dri_bufmgr_ttm *bufmgr_ttm = (dri_bufmgr_ttm *)reloc_buf->bufmgr;
dri_bo_ttm *reloc_buf_ttm = (dri_bo_ttm *)reloc_buf;
+ dri_bo_ttm *target_buf_ttm = (dri_bo_ttm *)target_buf;
int num_relocs;
uint32_t *this_reloc;
/* Create a new relocation list if needed */
- if (reloc_buf_ttm->reloc_buf == NULL)
+ if (reloc_buf_ttm->reloc_buf_data == NULL)
intel_setup_reloc_list(reloc_buf);
- num_relocs = (reloc_buf_ttm->reloc_buf_data[0] & 0xffff);
+ num_relocs = reloc_buf_ttm->reloc_buf_data[0];
/* Check overflow */
- assert((reloc_buf_ttm->reloc_buf_data[0] & 0xffff) <
- bufmgr_ttm->max_relocs);
+ assert(num_relocs < bufmgr_ttm->max_relocs);
this_reloc = reloc_buf_ttm->reloc_buf_data + I915_RELOC_HEADER +
num_relocs * I915_RELOC0_STRIDE;
this_reloc[0] = offset;
this_reloc[1] = delta;
- this_reloc[2] = -1; /* To be filled in at exec time */
+ this_reloc[2] = target_buf_ttm->drm_bo.handle; /* To be filled in at exec time */
this_reloc[3] = 0;
reloc_buf_ttm->relocs[num_relocs].validate_flags = flags;
reloc_buf_ttm->reloc_buf_data[0]++; /* Increment relocation count */
/* Check wraparound */
- assert((reloc_buf_ttm->reloc_buf_data[0] & 0xffff) != 0);
+ assert(reloc_buf_ttm->reloc_buf_data[0] != 0);
}
/**
/* Update the index of the target in the relocation entry */
reloc_entry = bo_ttm->reloc_buf_data + I915_RELOC_HEADER +
i * I915_RELOC0_STRIDE;
- reloc_entry[2] = target_ttm->validate_index;
}
}
bufmgr_ttm->fd = fd;
bufmgr_ttm->fence_type = fence_type;
bufmgr_ttm->fence_type_flush = fence_type_flush;
- bufmgr_ttm->cached_reloc_buf = NULL;
bufmgr_ttm->cached_reloc_buf_data = NULL;
/* Let's go with one relocation per every 2 dwords (but round down a bit