return ret;
}
-#define PUSHBUF_CAL (dev_priv->card_type >= NV_20)
-
int
nouveau_gem_ioctl_pushbuf_call(struct drm_device *dev, void *data,
struct drm_file *file_priv)
/* If presumed return address doesn't match, we need to map the
* push buffer and fix it..
*/
- if (!PUSHBUF_CAL) {
+ if (dev_priv->card_type < NV_20) {
uint32_t retaddy;
if (chan->dma.free < 4 + NOUVEAU_DMA_SKIPS) {
- ret = nouveau_dma_wait(chan, 4 + NOUVEAU_DMA_SKIPS);
+ ret = nouveau_dma_wait(chan, 0, 4 + NOUVEAU_DMA_SKIPS);
if (ret) {
NV_ERROR(dev, "jmp_space: %d\n", ret);
goto out;
req->offset / 4,
pbvirt, is_iomem);
- if (!PUSHBUF_CAL) {
+ if (dev_priv->card_type < NV_20) {
nouveau_bo_wr32(pbbo,
req->offset / 4 + req->nr_dwords - 2,
req->suffix0);
}
}
- if (PUSHBUF_CAL) {
+ if (chan->dma.ib_max) {
+ ret = nouveau_dma_wait(chan, 2, 6);
+ if (ret) {
+ NV_INFO(dev, "nv50cal_space: %d\n", ret);
+ goto out;
+ }
+
+ nv50_dma_push(chan, pbbo, req->offset, req->nr_dwords);
+ } else
+ if (dev_priv->card_type >= NV_20) {
ret = RING_SPACE(chan, 2);
if (ret) {
NV_ERROR(dev, "cal_space: %d\n", ret);
kfree(bo);
out_next:
- if (PUSHBUF_CAL) {
+ if (chan->dma.ib_max) {
+ req->suffix0 = 0x00000000;
+ req->suffix1 = 0x00000000;
+ } else
+ if (dev_priv->card_type >= NV_20) {
req->suffix0 = 0x00020000;
req->suffix1 = 0x00000000;
} else {