/* * inserts a wait for vline in the command stream */ void wait_vline_range(ScrnInfoPtr pScrn, drmBufPtr ib, int crtc, int start, int stop) { RHDPtr rhdPtr = RHDPTR(pScrn); struct rhdCrtc *rhdCrtc; if ((crtc < 0) || (crtc > 1)) return; rhdCrtc = rhdPtr->Crtc[crtc]; if(!rhdCrtc || !rhdCrtc->CurrentMode) return; start = max(start, 0); stop = min(stop, rhdCrtc->CurrentMode->VDisplay-1); #if 0 LOG("wait_vline_range: start %d stop %d\n", start, stop); #endif if (stop <= start) return; /* set the VLINE range */ if(crtc == 0) EREG(ib, D1MODE_VLINE_START_END, start | (stop << 16)); else EREG(ib, D2MODE_VLINE_START_END, start | (stop << 16)); /* tell the CP to poll the VLINE state register */ PACK3(ib, IT_WAIT_REG_MEM, 6); E32(ib, WAIT_REG | WAIT_EQ); if(crtc == 0) E32(ib, D1MODE_VLINE_STATUS >> 2); else
void wait_3d_idle_clean(ScrnInfoPtr pScrn, drmBufPtr ib) { /* flush caches, don't generate timestamp */ PACK3(ib, IT_EVENT_WRITE, 1); E32(ib, CACHE_FLUSH_AND_INV_EVENT); /* wait for 3D idle clean */ EREG(ib, WAIT_UNTIL, (WAIT_3D_IDLE_bit | WAIT_3D_IDLECLEAN_bit)); }
/* Flush the indirect buffer to the kernel for submission to the card */ void R600CPFlushIndirect(ScrnInfoPtr pScrn, drmBufPtr ib) { drmBufPtr buffer = ib; int start = 0; drm_radeon_indirect_t indirect; int drmFD = RHDDRMFDGet(pScrn->scrnIndex); if (!buffer) return; while (buffer->used & 0x3c){ E32(buffer, CP_PACKET2()); /* fill up to multiple of 16 dwords */ } indirect.idx = buffer->idx; indirect.start = start; indirect.end = buffer->used; indirect.discard = 1; drmCommandWriteRead(drmFD, DRM_RADEON_INDIRECT, &indirect, sizeof(drm_radeon_indirect_t)); }
static void externalize_ehdr(Elf_Byte bo, Elf_Ehdr *ehdr) { #if ELFSIZE == 32 E16(ehdr->e_type); E16(ehdr->e_machine); E32(ehdr->e_version); E32(ehdr->e_entry); E32(ehdr->e_phoff); E32(ehdr->e_shoff); E32(ehdr->e_flags); E16(ehdr->e_ehsize); E16(ehdr->e_phentsize); E16(ehdr->e_phnum); E16(ehdr->e_shentsize); E16(ehdr->e_shnum); E16(ehdr->e_shstrndx); #elif ELFSIZE == 64 E16(ehdr->e_type); E16(ehdr->e_machine); E32(ehdr->e_version); E64(ehdr->e_entry); E64(ehdr->e_phoff); E64(ehdr->e_shoff); E32(ehdr->e_flags); E16(ehdr->e_ehsize); E16(ehdr->e_phentsize); E16(ehdr->e_phnum); E16(ehdr->e_shentsize); E16(ehdr->e_shnum); E16(ehdr->e_shstrndx); #else #error ELFSIZE is not 32 or 64 #endif }
static void externalize_shdr(Elf_Byte bo, Elf_Shdr *shdr) { #if ELFSIZE == 32 E32(shdr->sh_name); E32(shdr->sh_type); E32(shdr->sh_flags); E32(shdr->sh_addr); E32(shdr->sh_offset); E32(shdr->sh_size); E32(shdr->sh_link); E32(shdr->sh_info); E32(shdr->sh_addralign); E32(shdr->sh_entsize); #elif ELFSIZE == 64 E32(shdr->sh_name); E32(shdr->sh_type); E64(shdr->sh_flags); E64(shdr->sh_addr); E64(shdr->sh_offset); E64(shdr->sh_size); E32(shdr->sh_link); E32(shdr->sh_info); E64(shdr->sh_addralign); E64(shdr->sh_entsize); #else #error ELFSIZE is not 32 or 64 #endif }