summaryrefslogtreecommitdiff
path: root/src/mesa/drivers/dri/glamo/glamo_cmdq.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa/drivers/dri/glamo/glamo_cmdq.c')
-rw-r--r--src/mesa/drivers/dri/glamo/glamo_cmdq.c56
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);