NV_WRITE(ctx_addr,init->put_base);
NV_WRITE(ctx_addr+4,init->put_base);
// that's what is done in nvosdk, but that part of the code is buggy so...
- NV_WRITE(ctx_addr+8, cb_obj->instance >> 4);
+ NV_WRITE(ctx_addr+8, nouveau_chip_instance_get(dev, cb_obj->instance));
#ifdef __BIG_ENDIAN
NV_WRITE(ctx_addr+16,NV_PFIFO_CACH1_DMAF_TRIG_112_BYTES|NV_PFIFO_CACH1_DMAF_SIZE_128_BYTES|NV_PFIFO_CACH1_DMAF_MAX_REQS_4|NV_PFIFO_CACH1_BIG_ENDIAN);
#else
*/
RAMFC_WR(DMA_PUT , init->put_base);
RAMFC_WR(DMA_GET , init->put_base);
- RAMFC_WR(DMA_INSTANCE , cb_obj->instance >> 4);
+ RAMFC_WR(DMA_INSTANCE , nouveau_chip_instance_get(dev,
+ cb_obj->instance));
#ifdef __BIG_ENDIAN
RAMFC_WR(DMA_FETCH, NV_PFIFO_CACH1_DMAF_TRIG_112_BYTES |
NV_PFIFO_CACH1_DMAF_SIZE_128_BYTES |
*/
RAMFC_WR(DMA_PUT , init->put_base);
RAMFC_WR(DMA_GET , init->put_base);
- RAMFC_WR(DMA_INSTANCE , cb_obj->instance >> 4);
+ RAMFC_WR(DMA_INSTANCE , nouveau_chip_instance_get(dev,
+ cb_obj->instance));
RAMFC_WR(DMA_FETCH , 0x30086078);
RAMFC_WR(DMA_SUBROUTINE, init->put_base);
RAMFC_WR(GRCTX_INSTANCE, 0); /* XXX */
NV_WRITE(NV_PFIFO_CACH1_DMAP, init->put_base);
NV_WRITE(NV_PFIFO_CACH1_DMAG, init->put_base);
- NV_WRITE(NV_PFIFO_CACH1_DMAI, cb_obj->instance >> 4);
+ NV_WRITE(NV_PFIFO_CACH1_DMAI,
+ nouveau_chip_instance_get(dev, cb_obj->instance));
NV_WRITE(NV_PFIFO_SIZE , 0x0000FFFF);
NV_WRITE(NV_PFIFO_CACH1_HASH, 0x0000FFFF);
* - Get rid of DMA object creation, this should be wrapped by MM routines.
*/
+/* Translate a RAMIN offset into a value the card understands, will be useful
+ * in the future when we can access more instance ram which isn't mapped into
+ * the PRAMIN aperture
+ */
+uint32_t nouveau_chip_instance_get(drm_device_t *dev, uint32_t instance)
+{
+ return (instance>>4);
+}
+
static void nouveau_object_link(drm_device_t *dev, int fifo_num,
struct nouveau_object *obj)
{
NV_WRITE(NV_RAMHT_CONTEXT_OFFSET + ofs,
(fifo << NV40_RAMHT_CONTEXT_CHANNEL_SHIFT) |
(obj->engine << NV40_RAMHT_CONTEXT_ENGINE_SHIFT) |
- (obj->instance>>4)
+ nouveau_chip_instance_get(dev, obj->instance)
);
else
NV_WRITE(NV_RAMHT_CONTEXT_OFFSET + ofs,
NV_RAMHT_CONTEXT_VALID |
(fifo << NV_RAMHT_CONTEXT_CHANNEL_SHIFT) |
(obj->engine << NV_RAMHT_CONTEXT_ENGINE_SHIFT) |
- (obj->instance>>4)
+ nouveau_chip_instance_get(dev, obj->instance)
);
obj->ht_loc = ofs;
else
count = 4;
+ /* Clean RAMIN entry */
DRM_DEBUG("Instance entry for 0x%08x"
"(engine %d, class 0x%x) before destroy:\n",
obj->handle, obj->engine, obj->class);
- for (i=0;i<count;i++)
+ for (i=0;i<count;i++) {
DRM_DEBUG(" +0x%02x: 0x%08x\n", (i*4),
- NV_READ(NV_RAMIN + obj->instance + (i*4)));
-
- /* Clean RAMIN entry */
- for (i=0;i<count;i++)
- NV_WRITE(NV_RAMIN + obj->instance + (i*4), 0x00000000);
+ INSTANCE_RD(obj->instance, i));
+ INSTANCE_WR(obj->instance, i, 0x00000000);
+ }
/* Mark instance as free */
obj->instance -= objs->first_instance;
obj->engine = 0;
obj->class = 0;
- NV_WRITE(NV_RAMIN + obj->instance + 0, ((1<<12)
- | (1<<13)
- | (adjust<<20)
- | (access<<14)
- | (target<<16)
- | 0x3D /* DMA_IN_MEMORY */)
- );
- NV_WRITE(NV_RAMIN + obj->instance + 4,
- size - 1);
- NV_WRITE(NV_RAMIN + obj->instance + 8,
+ INSTANCE_WR(obj->instance, 0, ((1<<12) | (1<<13) |
+ (adjust << 20) |
+ (access << 14) |
+ (target << 16) |
+ 0x3D /* DMA_IN_MEMORY */));
+ INSTANCE_WR(obj->instance, 1, size-1);
+ INSTANCE_WR(obj->instance, 2,
frame | ((access != NV_DMA_ACCESS_RO) ? (1<<1) : 0));
/* I don't actually know what this is, the DMA objects I see
* in renouveau dumps usually have this as the same as +8
*/
- NV_WRITE(NV_RAMIN + obj->instance + 12,
+ INSTANCE_WR(obj->instance, 3,
frame | ((access != NV_DMA_ACCESS_RO) ? (1<<1) : 0));
return obj;
obj->engine = 1;
obj->class = class;
- d0 = dma0 ? (dma0->instance >> 4) : 0;
- d1 = dma1 ? (dma1->instance >> 4) : 0;
- dn = dma_notifier ? (dma_notifier->instance >> 4) : 0;
+ d0 = dma0 ? nouveau_chip_instance_get(dev, dma0->instance) : 0;
+ d1 = dma1 ? nouveau_chip_instance_get(dev, dma1->instance) : 0;
+ dn = dma_notifier ?
+ nouveau_chip_instance_get(dev, dma_notifier->instance) : 0;
if (dev_priv->card_type >= NV_40) {
- NV_WRITE(NV_RAMIN + obj->instance + 0, class | flags0);
- NV_WRITE(NV_RAMIN + obj->instance + 4, dn | flags1);
- NV_WRITE(NV_RAMIN + obj->instance + 8, d0 | flags2);
- NV_WRITE(NV_RAMIN + obj->instance + 12, d1);
- NV_WRITE(NV_RAMIN + obj->instance + 16, 0x00000000);
- NV_WRITE(NV_RAMIN + obj->instance + 20, 0x00000000);
- NV_WRITE(NV_RAMIN + obj->instance + 24, 0x00000000);
- NV_WRITE(NV_RAMIN + obj->instance + 28, 0x00000000);
+ INSTANCE_WR(obj->instance, 0, class | flags0);
+ INSTANCE_WR(obj->instance, 1, dn | flags1);
+ INSTANCE_WR(obj->instance, 2, d0 | flags2);
+ INSTANCE_WR(obj->instance, 3, d1);
+ INSTANCE_WR(obj->instance, 4, 0x00000000);
+ INSTANCE_WR(obj->instance, 5, 0x00000000);
+ INSTANCE_WR(obj->instance, 6, 0x00000000);
+ INSTANCE_WR(obj->instance, 7, 0x00000000);
} else {
- NV_WRITE(NV_RAMIN + obj->instance + 0, class | flags0);
- NV_WRITE(NV_RAMIN + obj->instance + 4, (dn << 16) | flags1);
- NV_WRITE(NV_RAMIN + obj->instance + 8, d0 | (d1 << 16));
- NV_WRITE(NV_RAMIN + obj->instance + 12, 0);
+ INSTANCE_WR(obj->instance, 0, class | flags0);
+ INSTANCE_WR(obj->instance, 1, (dn << 16) | flags1);
+ INSTANCE_WR(obj->instance, 2, d0 | (d1 << 16));
+ INSTANCE_WR(obj->instance, 3, 0);
}
return obj;