static unsigned int *kgsl_ringbuffer_allocspace(struct kgsl_ringbuffer *rb, unsigned int numcmds) { unsigned int *ptr = NULL; int status = 0; BUG_ON(numcmds >= rb->sizedwords); GSL_RB_GET_READPTR(rb, &rb->rptr); /* check for available space */ if (rb->wptr >= rb->rptr) { /* wptr ahead or equal to rptr */ /* reserve dwords for nop packet */ if ((rb->wptr + numcmds) > (rb->sizedwords - GSL_RB_NOP_SIZEDWORDS)) status = kgsl_ringbuffer_waitspace(rb, numcmds, 1); } else { /* wptr behind rptr */ if ((rb->wptr + numcmds) >= rb->rptr) status = kgsl_ringbuffer_waitspace(rb, numcmds, 0); /* check for remaining space */ /* reserve dwords for nop packet */ if ((rb->wptr + numcmds) > (rb->sizedwords - GSL_RB_NOP_SIZEDWORDS)) status = kgsl_ringbuffer_waitspace(rb, numcmds, 1); } if (status == 0) { ptr = (unsigned int *)rb->buffer_desc.hostptr + rb->wptr; rb->wptr += numcmds; } return ptr; }
static unsigned int *kgsl_ringbuffer_allocspace(struct kgsl_ringbuffer *rb, unsigned int numcmds) { unsigned int *ptr = NULL; int status = 0; BUG_ON(numcmds >= rb->sizedwords); if (rb->wptr >= rb->rptr) { if ((rb->wptr + numcmds) > (rb->sizedwords - GSL_RB_NOP_SIZEDWORDS)) status = kgsl_ringbuffer_waitspace(rb, numcmds, 1); } else { if ((rb->wptr + numcmds) >= rb->rptr) status = kgsl_ringbuffer_waitspace(rb, numcmds, 0); if ((rb->wptr + numcmds) > (rb->sizedwords - GSL_RB_NOP_SIZEDWORDS)) status = kgsl_ringbuffer_waitspace(rb, numcmds, 1); } if (status == 0) { ptr = (unsigned int *)rb->buffer_desc.hostptr + rb->wptr; rb->wptr += numcmds; } return ptr; }