int kgsl_ringbuffer_init(struct kgsl_device *device) { int status; struct kgsl_yamato_device *yamato_device = KGSL_YAMATO_DEVICE(device); struct kgsl_ringbuffer *rb = &yamato_device->ringbuffer; rb->device = device; rb->sizedwords = (2 << kgsl_cfg_rb_sizelog2quadwords); rb->blksizequadwords = kgsl_cfg_rb_blksizequadwords; /* allocate memory for ringbuffer */ status = kgsl_sharedmem_alloc_coherent(&rb->buffer_desc, (rb->sizedwords << 2)); if (status != 0) { kgsl_ringbuffer_close(rb); return status; } /* allocate memory for polling and timestamps */ /* This really can be at 4 byte alignment boundry but for using MMU * we need to make it at page boundary */ status = kgsl_sharedmem_alloc_coherent(&rb->memptrs_desc, sizeof(struct kgsl_rbmemptrs)); if (status != 0) { kgsl_ringbuffer_close(rb); return status; } /* overlay structure on memptrs memory */ rb->memptrs = (struct kgsl_rbmemptrs *) rb->memptrs_desc.hostptr; return 0; }
int kgsl_g12_cmdstream_init(struct kgsl_device *device) { struct kgsl_g12_device *g12_device = (struct kgsl_g12_device *) device; memset(&g12_device->ringbuffer, 0, sizeof(struct kgsl_g12_ringbuffer)); g12_device->ringbuffer.prevctx = KGSL_G12_INVALID_CONTEXT; return kgsl_sharedmem_alloc_coherent(&g12_device->ringbuffer.cmdbufdesc, KGSL_G12_RB_SIZE); }
int kgsl_ringbuffer_init(struct kgsl_device *device) { int status; //uint32_t flags; struct kgsl_ringbuffer *rb = &device->ringbuffer; KGSL_CMD_VDBG("enter (device=%p)\n", device); rb->device = device; rb->sizedwords = (2 << kgsl_cfg_rb_sizelog2quadwords); rb->blksizequadwords = kgsl_cfg_rb_blksizequadwords; /* allocate memory for ringbuffer */ status = kgsl_sharedmem_alloc_coherent(&rb->buffer_desc, (rb->sizedwords << 2)); if (status != 0) { kgsl_ringbuffer_close(rb); KGSL_CMD_VDBG("return %d\n", status); return status; } /* allocate memory for polling and timestamps */ /* This really can be at 4 byte alignment boundry but for using MMU * we need to make it at page boundary */ status = kgsl_sharedmem_alloc_coherent(&rb->memptrs_desc, sizeof(struct kgsl_rbmemptrs)); if (status != 0) { kgsl_ringbuffer_close(rb); KGSL_CMD_VDBG("return %d\n", status); return status; } /* overlay structure on memptrs memory */ rb->memptrs = (struct kgsl_rbmemptrs *) rb->memptrs_desc.hostptr; rb->flags |= KGSL_FLAGS_INITIALIZED; KGSL_CMD_VDBG("return %d\n", 0); return 0; }
int kgsl_g12_drawctxt_create(struct kgsl_device_private *dev_priv, uint32_t unused, unsigned int *drawctxt_id) { int cmd; int result; unsigned int ctx_id; struct kgsl_device *device = dev_priv->device; if (g_z1xx.numcontext == 0) { if (kgsl_sharedmem_alloc_coherent(&g_z1xx.cmdbufdesc, KGSL_G12_RB_SIZE) != 0) return -ENOMEM; cmd = (int)(((VGV3_NEXTCMD_JUMP) & VGV3_NEXTCMD_NEXTCMD_FMASK) << VGV3_NEXTCMD_NEXTCMD_FSHIFT); result = kgsl_g12_cmdwindow_write(device, KGSL_CMDWINDOW_2D, ADDR_VGV3_MODE, 4); if (result != 0) return result; result = kgsl_g12_cmdwindow_write(device, KGSL_CMDWINDOW_2D, ADDR_VGV3_NEXTADDR, g_z1xx.cmdbufdesc.physaddr); if (result != 0) return result; result = kgsl_g12_cmdwindow_write(device, KGSL_CMDWINDOW_2D, ADDR_VGV3_NEXTCMD, cmd | 5); if (result != 0) return result; result = kgsl_g12_cmdwindow_write(device, KGSL_CMDWINDOW_2D, ADDR_VGV3_CONTROL, 0); if (result != 0) return result; } ctx_id = ffz(dev_priv->ctxt_id_mask); g_z1xx.numcontext++; if (g_z1xx.numcontext > KGSL_G12_CONTEXT_MAX) { *drawctxt_id = 0; return KGSL_FAILURE; } *drawctxt_id = ctx_id; return KGSL_SUCCESS; }