added DMA engine initialisation code for NV40 and higher. Still disabled, and needs support from driver (reserve DMA buffer RAM etc)

git-svn-id: file:///srv/svn/repos/haiku/trunk/current@10660 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Rudolf Cornelissen 2005-01-10 18:41:36 +00:00
parent d1f630f624
commit 4610db2600

View File

@ -40,9 +40,500 @@ status_t nv_acc_wait_idle_dma()
* Engine required init. */
status_t nv_acc_init_dma()
{
//fixme: implement.
uint16 cnt;
return B_ERROR;
//chk power-up cycle if probs
/* setup PTIMER: */
//fixme? how about NV28 setup as just after coldstarting? (see nv_info.c)
/* set timer numerator to 8 (in b0-15) */
ACCW(PT_NUMERATOR, 0x00000008);
/* set timer denominator to 3 (in b0-15) */
ACCW(PT_DENOMINATR, 0x00000003);
/* disable timer-alarm INT requests (b0) */
ACCW(PT_INTEN, 0x00000000);
/* reset timer-alarm INT status bit (b0) */
ACCW(PT_INTSTAT, 0xffffffff);
/* enable PRAMIN write access on pre NV10 before programming it! */
if (si->ps.card_arch == NV04A)
{
/* set framebuffer config: type = notiling, PRAMIN write access enabled */
NV_REG32(NV32_PFB_CONFIG_0) = 0x00001114;
}
else
{
/* setup acc engine 'source' tile adressranges */
ACCW(NV10_FBTIL0AD, 0);
ACCW(NV10_FBTIL1AD, 0);
ACCW(NV10_FBTIL2AD, 0);
ACCW(NV10_FBTIL3AD, 0);
ACCW(NV10_FBTIL4AD, 0);
ACCW(NV10_FBTIL5AD, 0);
ACCW(NV10_FBTIL6AD, 0);
ACCW(NV10_FBTIL7AD, 0);
ACCW(NV10_FBTIL0ED, (si->ps.memory_size - 1));
ACCW(NV10_FBTIL1ED, (si->ps.memory_size - 1));
ACCW(NV10_FBTIL2ED, (si->ps.memory_size - 1));
ACCW(NV10_FBTIL3ED, (si->ps.memory_size - 1));
ACCW(NV10_FBTIL4ED, (si->ps.memory_size - 1));
ACCW(NV10_FBTIL5ED, (si->ps.memory_size - 1));
ACCW(NV10_FBTIL6ED, (si->ps.memory_size - 1));
ACCW(NV10_FBTIL7ED, (si->ps.memory_size - 1));
}
/*** PRAMIN ***/
/* RAMHT (hash-table) space SETUP FIFO HANDLES */
/* note:
* 'instance' tells you where the engine command is stored in 'PR_CTXx_x' sets
* below: instance being b4-19 with baseadress NV_PRAMIN_CTX_0 (0x00700000).
* That command is linked to the handle noted here. This handle is then used to
* tell the FIFO to which engine command it is connected!
* (CTX registers are actually a sort of RAM space.) */
if (si->ps.card_arch >= NV40A)
{
/* (first set) */
ACCW(HT_HANDL_00, NV3_SURFACE_1); /* 32bit handle (not used) */
ACCW(HT_VALUE_00, 0x0010114c); /* instance $114c, engine = acc engine, CHID = $00 */
ACCW(HT_HANDL_01, NV_IMAGE_BLIT); /* 32bit handle */
ACCW(HT_VALUE_01, 0x00101148); /* instance $1146, engine = acc engine, CHID = $00 */
ACCW(HT_HANDL_02, NV3_GDI_RECTANGLE_TEXT); /* 32bit handle */
ACCW(HT_VALUE_02, 0x0010114a); /* instance $1147, engine = acc engine, CHID = $00 */
/* (second set) */
ACCW(HT_HANDL_10, NV_ROP5_SOLID); /* 32bit handle */
ACCW(HT_VALUE_10, 0x00101142); /* instance $1142, engine = acc engine, CHID = $00 */
ACCW(HT_HANDL_11, NV_IMAGE_BLACK_RECTANGLE); /* 32bit handle */
ACCW(HT_VALUE_11, 0x00101144); /* instance $1143, engine = acc engine, CHID = $00 */
ACCW(HT_HANDL_12, NV_IMAGE_PATTERN); /* 32bit handle */
ACCW(HT_VALUE_12, 0x00101146); /* instance $1144, engine = acc engine, CHID = $00 */
}
else
{
/* (first set) */
ACCW(HT_HANDL_00, NV3_SURFACE_1); /* 32bit handle (not used) */
ACCW(HT_VALUE_00, 0x8001114c); /* instance $114c, engine = acc engine, CHID = $00 */
ACCW(HT_HANDL_01, NV_IMAGE_BLIT); /* 32bit handle */
ACCW(HT_VALUE_01, 0x80011148); /* instance $1146, engine = acc engine, CHID = $00 */
ACCW(HT_HANDL_02, NV3_GDI_RECTANGLE_TEXT); /* 32bit handle */
ACCW(HT_VALUE_02, 0x8001114a); /* instance $1147, engine = acc engine, CHID = $00 */
/* (second set) */
ACCW(HT_HANDL_10, NV_ROP5_SOLID); /* 32bit handle */
ACCW(HT_VALUE_10, 0x80011142); /* instance $1142, engine = acc engine, CHID = $00 */
ACCW(HT_HANDL_11, NV_IMAGE_BLACK_RECTANGLE); /* 32bit handle */
ACCW(HT_VALUE_11, 0x80011144); /* instance $1143, engine = acc engine, CHID = $00 */
ACCW(HT_HANDL_12, NV_IMAGE_PATTERN); /* 32bit handle */
ACCW(HT_VALUE_12, 0x80011146); /* instance $1144, engine = acc engine, CHID = $00 */
}
/* program CTX registers: CTX1 is mostly done later (colorspace dependant) */
/* note:
* CTX determines which HT handles point to what engine commands.
* (CTX registers are actually a sort of RAM space.) */
if (si->ps.card_arch >= NV40A)
{
/* setup a DMA define for use by command defines below. */
ACCW(PR_CTX0_R, 0x00003000); /* DMA page table present and of linear type;
* DMA target node is NVM (non-volatile memory?)
* (instead of doing PCI or AGP transfers) */
ACCW(PR_CTX1_R, (si->ps.memory_size - 1)); /* DMA limit */
ACCW(PR_CTX2_R, 0x00000002); /* DMA access type is READ_AND_WRITE */
ACCW(PR_CTX3_R, 0x00000002); /* unknown (looks like this is rubbish/not needed?) */
/* setup set '0' for cmd NV_ROP5_SOLID */
ACCW(PR_CTX0_0, 0x02080043); /* NVclass $043, patchcfg ROP_AND, nv10+: little endian */
ACCW(PR_CTX1_0, 0x00000000); /* colorspace not set, notify instance invalid (b16-31) */
ACCW(PR_CTX2_0, 0x00000000); /* DMA0 and DMA1 instance invalid */
ACCW(PR_CTX3_0, 0x00000000); /* method traps disabled */
ACCW(PR_CTX0_1, 0x00000000); /* extra */
ACCW(PR_CTX1_1, 0x00000000); /* extra */
/* setup set '1' for cmd NV_IMAGE_BLACK_RECTANGLE */
ACCW(PR_CTX0_2, 0x02080019); /* NVclass $019, patchcfg ROP_AND, nv10+: little endian */
ACCW(PR_CTX1_2, 0x00000000); /* colorspace not set, notify instance invalid (b16-31) */
ACCW(PR_CTX2_2, 0x00000000); /* DMA0 and DMA1 instance invalid */
ACCW(PR_CTX3_2, 0x00000000); /* method traps disabled */
ACCW(PR_CTX0_3, 0x00000000); /* extra */
ACCW(PR_CTX1_3, 0x00000000); /* extra */
/* setup set '2' for cmd NV_IMAGE_PATTERN */
ACCW(PR_CTX0_4, 0x02080018); /* NVclass $018, patchcfg ROP_AND, nv10+: little endian */
ACCW(PR_CTX1_4, 0x02000000); /* colorspace not set, notify instance is $0200 (b16-31) */
ACCW(PR_CTX2_4, 0x00000000); /* DMA0 and DMA1 instance invalid */
ACCW(PR_CTX3_4, 0x00000000); /* method traps disabled */
ACCW(PR_CTX0_5, 0x00000000); /* extra */
ACCW(PR_CTX1_5, 0x00000000); /* extra */
/* setup set '4' for cmd NV_IMAGE_BLIT */
ACCW(PR_CTX0_6, 0x0208005f); /* NVclass $05f, patchcfg ROP_AND, nv10+: little endian */
ACCW(PR_CTX1_6, 0x00000000); /* colorspace not set, notify instance invalid (b16-31) */
ACCW(PR_CTX2_6, 0x00001140); /* DMA0 instance is $1140, DMA1 instance invalid */
ACCW(PR_CTX3_6, 0x00001140); /* method trap 0 is $1140, trap 1 disabled */
ACCW(PR_CTX0_7, 0x00000000); /* extra */
ACCW(PR_CTX1_7, 0x00000000); /* extra */
/* setup set '5' for cmd NV3_GDI_RECTANGLE_TEXT */
ACCW(PR_CTX0_8, 0x0208004b); /* NVclass $04b, patchcfg ROP_AND, nv10+: little endian */
ACCW(PR_CTX1_8, 0x02000000); /* colorspace not set, notify instance is $0200 (b16-31) */
ACCW(PR_CTX2_8, 0x00000000); /* DMA0 and DMA1 instance invalid */
ACCW(PR_CTX3_8, 0x00000000); /* method traps disabled */
ACCW(PR_CTX0_9, 0x00000000); /* extra */
ACCW(PR_CTX1_9, 0x00000000); /* extra */
/* setup set '6' for cmd NV3_SURFACE_1 (not used) */
ACCW(PR_CTX0_A, 0x02080059); /* NVclass $059, nv10+: little endian */
ACCW(PR_CTX1_A, 0x00000000); /* colorspace not set, notify instance invalid (b16-31) */
ACCW(PR_CTX2_A, 0x00000000); /* DMA0 and DMA1 instance invalid */
ACCW(PR_CTX3_A, 0x00000000); /* method traps disabled */
ACCW(PR_CTX0_B, 0x00000000); /* extra */
ACCW(PR_CTX1_B, 0x00000000); /* extra */
/* setup DMA set pointed at by PF_CACH1_DMAI */
ACCW(PR_CTX0_C, 0x00003002); /* DMA page table present and of linear type;
* DMA class is $002 (b0-11);
* DMA target node is NVM (non-volatile memory?)
* (instead of doing PCI or AGP transfers) */
ACCW(PR_CTX1_C, 0x00007fff); /* DMA limit: tablesize is 32k bytes */
ACCW(PR_CTX2_C, (((si->ps.memory_size - 1) & 0xffff8000) | 0x00000002));
/* DMA access type is READ_AND_WRITE;
* table is located at end of cardRAM (b12-31):
* It's adress needs to be at a 4kb boundary! */
}
else
{
//fixme: setup...
}
if (si->ps.card_arch == NV04A)
{
/*
if((pNv->Chipset & 0x0fff) == 0x0020)
{
pNv->PRAMIN[0x0824] |= 0x00020000;
pNv->PRAMIN[0x0826] += pNv->FbAddress;
}
pNv->PGRAPH[0x0080/4] = 0x000001FF;//acc DEBUG0
pNv->PGRAPH[0x0080/4] = 0x1230C000;
pNv->PGRAPH[0x0084/4] = 0x72111101;
pNv->PGRAPH[0x0088/4] = 0x11D5F071;
pNv->PGRAPH[0x008C/4] = 0x0004FF31;
pNv->PGRAPH[0x008C/4] = 0x4004FF31;
pNv->PGRAPH[0x0140/4] = 0x00000000;
pNv->PGRAPH[0x0100/4] = 0xFFFFFFFF;
pNv->PGRAPH[0x0170/4] = 0x10010100;
pNv->PGRAPH[0x0710/4] = 0xFFFFFFFF;
pNv->PGRAPH[0x0720/4] = 0x00000001;
pNv->PGRAPH[0x0810/4] = 0x00000000;
pNv->PGRAPH[0x0608/4] = 0xFFFFFFFF;
*/
}
else
{
/* do a explicit engine reset */
ACCW(DEBUG0, 0xffffffff);
ACCW(DEBUG0, 0x00000000);
/* disable all acceleration engine INT reguests */
ACCW(ACC_INTE, 0x00000000);
/* reset all acceration engine INT status bits */
ACCW(ACC_INTS, 0xffffffff);
/* context control enabled */
ACCW(NV10_CTX_CTRL, 0x10010100);
/* all acceleration buffers, pitches and colors are valid */
ACCW(NV10_ACC_STAT, 0xffffffff);
/* enable acceleration engine command FIFO */
ACCW(FIFO_EN, 0x00000001);
/* setup surface type */
ACCW(NV10_SURF_TYP, ((ACCR(NV10_SURF_TYP)) & 0x0007ff00));
ACCW(NV10_SURF_TYP, ((ACCR(NV10_SURF_TYP)) | 0x00020100));
}
if (si->ps.card_arch == NV10A)
{
/*
pNv->PGRAPH[0x0084/4] = 0x00118700;//acc DEBUG1
pNv->PGRAPH[0x0088/4] = 0x24E00810;//acc DEBUG2
pNv->PGRAPH[0x008C/4] = 0x55DE0030;//acc DEBUG3
//tile spul NV10:
for(i = 0; i < 32; i++)
pNv->PGRAPH[(0x0B00/4) + i] = pNv->PFB[(0x0240/4) + i];//NV10_TIL0AD etc
pNv->PGRAPH[0x640/4] = 0;//OFFSET0
pNv->PGRAPH[0x644/4] = 0;//OFFSET1
pNv->PGRAPH[0x684/4] = pNv->FbMapSize - 1;//BLIMIT0
pNv->PGRAPH[0x688/4] = pNv->FbMapSize - 1;//BLIMIT1
pNv->PGRAPH[0x0810/4] = 0x00000000;//PAT_SHP
pNv->PGRAPH[0x0608/4] = 0xFFFFFFFF;//<<<<<<<<<<<< nvx: NV_PGRAPH_BETA_AND
*/
}
if (si->ps.card_arch >= NV20A)
{
switch (si->ps.card_arch)
{
case NV40A:
/* init some function blocks */
ACCW(DEBUG1, 0x401287c0);
ACCW(DEBUG3, 0x60de8051);
/* disable specific functions, but enable SETUP_SPARE2 register */
ACCW(NV10_DEBUG4, 0x00008000);
/* set limit_viol_pix_adress(?): more likely something unknown.. */
ACCW(NV25_WHAT0, 0x00be3c5f);
/* unknown.. */
switch (si->ps.card_type)
{
case NV40:
ACCW(NV40_WHAT0, 0x83280fff);
ACCW(NV40_WHAT1, 0x000000a0);
ACCW(NV40_WHAT2, 0x0078e366);
ACCW(NV40_WHAT3, 0x0000014c);
// pNv->PFB[0x033C/4] &= 0xffff7fff;//0x00100000 :<<<< NV_PFB_CLOSE_PAGE2, bits unknown
break;
case NV41:
ACCW(NV40P_WHAT0, 0x83280eff);
ACCW(NV40P_WHAT1, 0x000000a0);
ACCW(NV40P_WHAT2, 0x007596ff);
ACCW(NV40P_WHAT3, 0x00000108);
break;
case NV43:
ACCW(NV40P_WHAT0, 0x83280eff);
ACCW(NV40P_WHAT1, 0x000000a0);
ACCW(NV40P_WHAT2, 0x0072cb77);
ACCW(NV40P_WHAT3, 0x00000108);
break;
case NV45: //fixme, checkout: this is cardID 0x016x at least!
ACCW(NV40P_WHAT0, 0x83280eff);
ACCW(NV40P_WHAT1, 0x000000a0);
NV_REG32(NV32_NV45_WHAT10) = NV_REG32(NV32_NV10STRAPINFO);
NV_REG32(NV32_NV45_WHAT11) = 0x00000000;
NV_REG32(NV32_NV45_WHAT12) = 0x00000000;
NV_REG32(NV32_NV45_WHAT13) = NV_REG32(NV32_NV10STRAPINFO);
ACCW(NV45_WHAT2, 0x00000000);
ACCW(NV45_WHAT3, 0x00000000);
//schakelt screrm signaal uit op NV43, maar timing blijft werken<<<<<<<<
// pNv->PRAMDAC[0x0608/4] |= 0x00100000;//0x00680608==NVDAC_TSTCTRL haiku
//b20=1=DACTM_TEST ON (termination?)
//how about: NVDAC2_TSTCTRL????
break;
default:
ACCW(NV40P_WHAT0, 0x83280eff);
ACCW(NV40P_WHAT1, 0x000000a0);
break;
}
ACCW(NV10_TIL3PT, 0x2ffff800);
ACCW(NV10_TIL3ST, 0x00006000);
ACCW(NV4X_WHAT1, 0x01000000);
ACCW(NV4X_WHAT0, 0x00001200);//1200 DMA instance????(test shutoff in PIO mod)
//test if trouble:
// ACCW(NV4X_WHAT0, 0x00001140);
break;
case NV30A:
/*
pNv->PGRAPH[0x0084/4] = 0x40108700;//acc DEBUG1
pNv->PGRAPH[0x0890/4] = 0x00140000;//0x00400890 nieuw: unknown!!<<<<<<<<(NV25)
pNv->PGRAPH[0x008C/4] = 0xf00e0431;//acc DEBUG3
pNv->PGRAPH[0x0090/4] = 0x00008000;//acc NV10_DEBUG4
pNv->PGRAPH[0x0610/4] = 0xf04b1f36;//NVACC_NV4X_WHAT2 nw, dus ook op NV30!<<<
pNv->PGRAPH[0x0B80/4] = 0x1002d888;//0x00400b80 nieuw: unknown!!<<<<<<<
pNv->PGRAPH[0x0B88/4] = 0x62ff007f;//0x00400b88 nieuw: unknown!!<<<<<<<
*/
break;
case NV20A:
/*
pNv->PGRAPH[0x0084/4] = 0x00118700;//acc DEBUG1
pNv->PGRAPH[0x008C/4] = 0xF20E0431;//acc DEBUG3
pNv->PGRAPH[0x0090/4] = 0x00000000;//acc NV10_DEBUG4
pNv->PGRAPH[0x009C/4] = 0x00000040;//0x0040009c nieuw: unknown!!<<<<<<<<
if((pNv->Chipset & 0x0ff0) >= 0x0250)
{
pNv->PGRAPH[0x0890/4] = 0x00080000;//0x00400890 nieuw: unknown!!<<<<<<<<
pNv->PGRAPH[0x0610/4] = 0x304B1FB6;//NVACC_NV4X_WHAT2 nw,ook op NV25 en+!<<<
pNv->PGRAPH[0x0B80/4] = 0x18B82880;//0x00400b80 nieuw: unknown!!<<<<<<<
pNv->PGRAPH[0x0B84/4] = 0x44000000;//0x00400b84 nieuw: unknown!!<<<<<<<
pNv->PGRAPH[0x0098/4] = 0x40000080;//0x00400098 nieuw: unknown!!<<<<<<<
pNv->PGRAPH[0x0B88/4] = 0x000000ff;//0x00400b88 nieuw: unknown!!<<<<<<<
}
else
{
pNv->PGRAPH[0x0880/4] = 0x00080000;
pNv->PGRAPH[0x0094/4] = 0x00000005;
pNv->PGRAPH[0x0B80/4] = 0x45CAA208;
pNv->PGRAPH[0x0B84/4] = 0x24000000;
pNv->PGRAPH[0x0098/4] = 0x00000040;
pNv->PGRAPH[0x0750/4] = 0x00E00038;
pNv->PGRAPH[0x0754/4] = 0x00000030;
pNv->PGRAPH[0x0750/4] = 0x00E10038;
pNv->PGRAPH[0x0754/4] = 0x00000030;
}
*/
break;
}
/* NV20A, NV30A and NV40A: */
/* copy tile setup stuff from 'source' to acc engine (pattern colorRAM?) */
for (cnt = 0; cnt < 32; cnt++)
{
NV_REG32(NVACC_NV20_WHAT0 + (cnt << 2)) =
NV_REG32(NVACC_NV10_FBTIL0AD + (cnt << 2));
}
if (si->ps.card_arch >= NV40A)
{
if (si->ps.card_type == NV40)
{
/* copy unknown tile setup stuff from 'source' to acc engine(?) */
ACCW(NV20_WHAT_T0, ACCR(NV20_FBWHAT0));
ACCW(NV20_WHAT_T1, ACCR(NV20_FBWHAT1));
ACCW(NV40_WHAT_T2, ACCR(NV20_FBWHAT0));
ACCW(NV40_WHAT_T3, ACCR(NV20_FBWHAT1));
/* setup accesible card memory range for acc engine */
//fixme: should these two be zero after all??!!
ACCW(NV20_OFFSET0, ((uint8*)si->fbc.frame_buffer - (uint8*)si->framebuffer));
ACCW(NV20_OFFSET1, ((uint8*)si->fbc.frame_buffer - (uint8*)si->framebuffer));
//end fixme.
ACCW(NV20_BLIMIT6, (si->ps.memory_size - 1));
ACCW(NV20_BLIMIT7, (si->ps.memory_size - 1));
}
else
{
/* copy unknown tile setup stuff from 'source' to acc engine(?) */
ACCW(NV40P_WHAT_T0, ACCR(NV20_FBWHAT0));
ACCW(NV40P_WHAT_T1, ACCR(NV20_FBWHAT1));
ACCW(NV40P_WHAT_T2, ACCR(NV20_FBWHAT0));
ACCW(NV40P_WHAT_T3, ACCR(NV20_FBWHAT1));
/* setup accesible card memory range for acc engine */
//fixme: should these two be zero after all??!!
ACCW(NV40P_OFFSET0, ((uint8*)si->fbc.frame_buffer - (uint8*)si->framebuffer));
ACCW(NV40P_OFFSET1, ((uint8*)si->fbc.frame_buffer - (uint8*)si->framebuffer));
//end fixme.
ACCW(NV40P_BLIMIT6, (si->ps.memory_size - 1));
ACCW(NV40P_BLIMIT7, (si->ps.memory_size - 1));
}
}
else /* NV20A and NV30A: */
{
/*
//NVACC_NV20_WHAT0 from NV20_FBWHAT0
pNv->PGRAPH[0x09A4/4] = pNv->PFB[0x0200/4];
//NVACC_NV20_WHAT1 from NV20_FBWHAT1
pNv->PGRAPH[0x09A8/4] = pNv->PFB[0x0204/4];
pNv->PGRAPH[0x0750/4] = 0x00EA0000;
pNv->PGRAPH[0x0754/4] = pNv->PFB[0x0200/4];
pNv->PGRAPH[0x0750/4] = 0x00EA0004;
pNv->PGRAPH[0x0754/4] = pNv->PFB[0x0204/4];
pNv->PGRAPH[0x0820/4] = 0;//NV20_OFFSET0
pNv->PGRAPH[0x0824/4] = 0;//NV20_OFFSET1
pNv->PGRAPH[0x0864/4] = pNv->FbMapSize - 1;//NV20_BLIMIT6
pNv->PGRAPH[0x0868/4] = pNv->FbMapSize - 1;//NV20_BLIMIT7
*/
}
/* NV20A, NV30A and NV40A: */
/* setup some acc engine tile stuff */
ACCW(NV10_TIL2AD, 0x00000000);
ACCW(NV10_TIL0ED, 0xffffffff);
}
/* all cards: */
/* setup some clipping: rect size is 32768 x 32768, probably max. setting */
ACCW(ABS_UCLP_XMIN, 0x00000000);
ACCW(ABS_UCLP_YMIN, 0x00000000);
ACCW(ABS_UCLP_XMAX, 0x00007fff);
ACCW(ABS_UCLP_YMAX, 0x00007fff);
/*** PFIFO ***/
/* (setup caches) */
/* disable caches reassign */
ACCW(PF_CACHES, 0x00000000);
/* PFIFO mode: channel 0 is in DMA mode, channels 1 - 32 are in PIO mode */
ACCW(PF_MODE, 0x00000001);
/* cache1 push0 access disabled */
ACCW(PF_CACH1_PSH0, 0x00000000);
/* cache1 pull0 access disabled */
ACCW(PF_CACH1_PUL0, 0x00000000);
/* cache1 push1 mode = DMA */
if (si->ps.card_arch >= NV40A)
ACCW(PF_CACH1_PSH1, 0x00010000);
else
ACCW(PF_CACH1_PSH1, 0x00000100);
/* cache1 DMA Put offset = 0 (b2-28) */
ACCW(PF_CACH1_DMAP, 0x00000000);
/* cache1 DMA Get offset = 0 (b2-28) */
ACCW(PF_CACH1_DMAG, 0x00000000);
/* cache1 DMA instance adress = $114e (b0-15);
* instance being b4-19 with baseadress NV_PRAMIN_CTX_0 (0x00700000). */
/* note:
* should point to a DMA definition in CTX register space (which is sort of RAM).
* This define tells the engine where the DMA cmd buffer is and what it's size is;
* inside that cmd buffer you'll find the engine handles for the FIFO channels,
* followed by actual issued engine commands. */
//fixme: if needed...
ACCW(PF_CACH1_DMAI, 0x0000114e);
/* cache0 push0 access disabled */
ACCW(PF_CACH0_PSH0, 0x00000000);
/* cache0 pull0 access disabled */
ACCW(PF_CACH0_PUL0, 0x00000000);
/* RAM HT (hash table) baseadress = $10000 (b4-8), size = 4k,
* search = 128 (is byte offset between hash 'sets') */
/* note:
* so HT base is $00710000, last is $00710fff.
* In this space you define the engine command handles (HT_HANDL_XX), which
* in turn points to the defines in CTX register space (which is sort of RAM) */
ACCW(PF_RAMHT, 0x03000100);
/* RAM FC baseadress = $11000 (b3-8) (size is fixed to 0.5k(?)) */
/* note:
* so FC base is $00711000, last is $007111ff. (not used?) */
ACCW(PF_RAMFC, 0x00000110);
/* RAM RO baseadress = $11200 (b1-8), size = 0.5k */
/* note:
* so RO base is $00711200, last is $007113ff. (not used?) */
/* note also:
* This means(?) the PRAMIN CTX registers are accessible from base $00711400. */
ACCW(PF_RAMRO, 0x00000112);
/* PFIFO size: ch0-15 = 512 bytes, ch16-31 = 124 bytes */
ACCW(PF_SIZE, 0x0000ffff);
/* cache1 hash instance = $ffff (b0-15) */
ACCW(PF_CACH1_HASH, 0x0000ffff);
/* disable all PFIFO INTs */
ACCW(PF_INTEN, 0x00000000);
/* reset all PFIFO INT status bits */
ACCW(PF_INTSTAT, 0xffffffff);
/* cache0 pull0 engine = acceleration engine (graphics) */
ACCW(PF_CACH0_PUL1, 0x00000001);
/* cache1 DMA control: disable some stuff */
ACCW(PF_CACH1_DMAC, 0x00000000);
/* cache1 engine 0 upto/including 7 is software (could also be graphics or DVD) */
ACCW(PF_CACH1_ENG, 0x00000000);
/* cache1 DMA fetch: trigger at 128 bytes, size is 32 bytes, max requests is 15,
* use little endian */
ACCW(PF_CACH1_DMAF, 0x000f0078);
/* cache1 DMA push: b0 = 1: access is enabled */
ACCW(PF_CACH1_DMAS, 0x00000001);
/* cache1 push0 access enabled */
ACCW(PF_CACH1_PSH0, 0x00000001);
/* cache1 pull0 access enabled */
ACCW(PF_CACH1_PUL0, 0x00000001);
/* cache1 pull1 engine = acceleration engine (graphics) */
ACCW(PF_CACH1_PUL1, 0x00000001);
/* enable PFIFO caches reassign */
ACCW(PF_CACHES, 0x00000001);
return B_OK;
}
/* screen to screen blit - i.e. move windows around and scroll within them. */