#include #include #include "reg.h" #include "ring.h" int ringinit(Ring *r, u32int *mmio, void *va, uintptr gtta) { int i; u32int *rp; r->mmio = mmio; r->va = va; r->gtta = gtta; rp = r->va; for(i = 0; i < 128; i++) *rp++ = MI_NOOP_ID(i); rp = r->va; /* 2d processor - XY_COLOR_BLT - rgb channel - 4 dwords */ *rp++ = (2<<29) | (0x50<<22) | (1<<20) | 4; /* 32bpp - copy - pitch */ *rp++ = (3<<24) | (0xF0<<16) | 1440*4; /* Y1 - X1 */ *rp++ = (10 << 16) | 10; /* Y2 - X2 */ *rp++ = (100 << 16) | 100; /* base address */ *rp++ = 0; /* pattern - red */ *rp++ = 0x00FF0000; return 0; } /* c.f. init_ring_common */ int ringstart(Ring *r) { int i; werrstr(""); if(!ringstop(r)){ fprint(2, "ring: first stop failed: %r\n"); if(!ringstop(r)){ fprint(2, "ring: second stop failed: %r\n"); return -1; } } USED(r->mmio[RING_BUFFER_HEAD/4]); /* XXX: ordering seems to matter here */ r->mmio[RING_BUFFER_START/4] = r->gtta; if(r->mmio[RING_BUFFER_HEAD/4]) fprint(2, "ring: head nonzero %08ux\n", r->mmio[RING_BUFFER_HEAD/4]); r->mmio[RING_BUFFER_HEAD/4] = 0; r->mmio[RING_BUFFER_TAIL/4] = 128*4; USED(r->mmio[RING_BUFFER_TAIL/4]); /* 20:12 contain # of pages, 0 meaning 1 4k page */ r->mmio[RING_BUFFER_CTL/4] = 1; for(i = 0; i < 50; i++){ if(r->mmio[RING_BUFFER_CTL/4] & 1) break; sleep(1); } if(i == 50){ fprint(2, "ring: timed out waiting for ring to be valid\n"); return -1; } /* enable parser/ring arbitration */ r->mmio[MI_MODE/4] = (MI_MODE_STOP << 16) | 0; return 0; } int ringstop(Ring *r) { int i; u32int reg; /* force ring/cp idle */ r->mmio[MI_MODE/4] = (MI_MODE_STOP << 16) | MI_MODE_STOP; for(i = 0; i < 1000; i++){ reg = r->mmio[MI_MODE/4]; if(reg & MI_MODE_IDLE) break; sleep(1); } if(i == 1000){ werrstr("ring: timed out trying to stop ring"); return -1; } r->mmio[RING_BUFFER_HEAD/4] = r->mmio[RING_BUFFER_TAIL/4]; r->mmio[RING_BUFFER_HEAD/4] = 0; r->mmio[RING_BUFFER_TAIL/4] = 0; r->mmio[RING_BUFFER_CTL/4] = 0; return (r->mmio[RING_BUFFER_HEAD/4] & 0x1FFFFC) == 0; } int ringbusy(Ring *r) { return r->mmio[RING_BUFFER_HEAD/4] != r->mmio[RING_BUFFER_TAIL/4]; }