diff options
Diffstat (limited to 'src/mesa/drivers/dri/glamo/glamo_cmdq.c')
-rw-r--r-- | src/mesa/drivers/dri/glamo/glamo_cmdq.c | 56 |
1 files changed, 35 insertions, 21 deletions
diff --git a/src/mesa/drivers/dri/glamo/glamo_cmdq.c b/src/mesa/drivers/dri/glamo/glamo_cmdq.c index b35a8b4f74..a8b788ad67 100644 --- a/src/mesa/drivers/dri/glamo/glamo_cmdq.c +++ b/src/mesa/drivers/dri/glamo/glamo_cmdq.c @@ -32,19 +32,20 @@ /* Submit the prepared command sequence to the kernel */ void glamoDRMDispatch(glamoContext *gCtx) { - drm_glamo_cmd_buffer_t cmdbuf; + drm_glamo_cmd_burst_t burst; int r; - cmdbuf.buf = (char *)gCtx->cmdq_drm; - cmdbuf.bufsz = gCtx->cmdq_drm_used * 2; /* -> bytes */ - cmdbuf.nobjs = gCtx->cmdq_obj_used; - cmdbuf.objs = gCtx->cmdq_objs; - cmdbuf.obj_pos = gCtx->cmdq_obj_pos; + burst.base = gCtx->cmd_burst_base; + burst.data = gCtx->cmdq_drm; + burst.bufsz = gCtx->cmdq_drm_used * 2; /* -> bytes */ + burst.nobjs = gCtx->cmdq_obj_used; + burst.objs = gCtx->cmdq_objs; + burst.obj_pos = gCtx->cmdq_obj_pos; - r = drmCommandWrite(gCtx->drm_fd, DRM_GLAMO_CMDBUF, - &cmdbuf, sizeof(cmdbuf)); + r = drmCommandWrite(gCtx->drm_fd, DRM_GLAMO_CMDBURST, + &burst, sizeof(burst)); if ( r != 0 ) { - fprintf(stderr, "DRM_GLAMO_CMDBUF failed\n"); + fprintf(stderr, "DRM_GLAMO_CMDBURST failed\n"); } /* Reset counts to zero for the next sequence */ @@ -53,24 +54,33 @@ void glamoDRMDispatch(glamoContext *gCtx) } -void glamoDRMAddCommand(glamoContext *gCtx, uint16_t reg, - uint16_t val) +void glamoDRMAddData(glamoContext *gCtx, uint32_t val, int len) { - if ( gCtx->cmdq_drm_used == gCtx->cmdq_drm_size ) { - glamoDRMDispatch(gCtx); + if ( gCtx->cmdq_drm_used+4 > gCtx->cmdq_drm_size ) { + fprintf(stderr, "Burst command too large\n"); + return; + } + + if ( (len != 2) && (len != 4) ) { + fprintf(stderr, "Wrong command length!\n"); + return; } /* Record command */ - gCtx->cmdq_drm[gCtx->cmdq_drm_used++] = reg; - gCtx->cmdq_drm[gCtx->cmdq_drm_used++] = val; + if ( len == 2 ) { + gCtx->cmdq_drm[gCtx->cmdq_drm_used++] = val & 0xffff; + } else if ( len == 4 ) { + gCtx->cmdq_drm[gCtx->cmdq_drm_used++] = val & 0x0000ffff; + gCtx->cmdq_drm[gCtx->cmdq_drm_used++] = val & 0xffff0000; + } } -void glamoDRMAddCommandBO(glamoContext *gCtx, uint16_t reg, - struct glamo_bo *bo) +void glamoDRMAddBO(glamoContext *gCtx, struct glamo_bo *bo) { - if ( gCtx->cmdq_drm_used == gCtx->cmdq_drm_size ) { - glamoDRMDispatch(gCtx); + if ( gCtx->cmdq_drm_used+4 > gCtx->cmdq_drm_size ) { + fprintf(stderr, "Burst command too large\n"); + return; } /* Record object position */ @@ -80,13 +90,17 @@ void glamoDRMAddCommandBO(glamoContext *gCtx, uint16_t reg, gCtx->cmdq_obj_used++; /* Record command */ - gCtx->cmdq_drm[gCtx->cmdq_drm_used++] = reg; gCtx->cmdq_drm[gCtx->cmdq_drm_used++] = 0x0000; - gCtx->cmdq_drm[gCtx->cmdq_drm_used++] = reg+2; gCtx->cmdq_drm[gCtx->cmdq_drm_used++] = 0x0000; } +void glamoDRMStartBurst(glamoContext *gCtx, uint16_t base) +{ + gCtx->cmd_burst_base = base; +} + + void glamoInitCmdqCache(glamoContext *gCtx) { gCtx->cmdq_objs = malloc(1024); |