summaryrefslogtreecommitdiff
path: root/shared-core/radeon_drm.h
AgeCommit message (Expand)Author
2008-12-10Revert "Merge branch 'modesetting-gem'"Jesse Barnes
2008-11-03radeon: add wait rendering APIDave Airlie
2008-11-03radeon: remove unused gem indirect ioctlDave Airlie
2008-11-03radeon: make new CS2 command submission interface port older interface to thisDave Airlie
2008-09-07radeon: change interface from headers add pin_domain into paddingDave Airlie
2008-08-26radeon: fixup domains and use them properlyDave Airlie
2008-08-04radeon: add userspace mm enable switchDave Airlie
2008-07-30radeon: add some handles to the sarea + kernel mm available checkDave Airlie
2008-07-28radeon command submission startDave Airlie
2008-07-26radeon: add initial atombios modesetting and GEM -> TTM translation layer.Dave Airlie
2008-05-28Merge branch 'master' of git+ssh://git.freedesktop.org/git/mesa/drm into mode...Alan Hourihane
2008-05-27RADEON: add get_param for number of GB pipesAlex Deucher
2008-04-28Merge branch 'master' into modesetting-101Thomas Hellstrom
2008-03-30drm/r300: fix wait interface mixupDave Airlie
2008-03-21r500: fragment program upload is also used to upload constants.Dave Airlie
2008-03-17initial r500 RS and FP register and upload codeDave Airlie
2007-11-22Merge branch 'origin' into modesetting-101Dave Airlie
2007-11-18radeon: refactor out the fb/agp location read/write.Dave Airlie
2007-11-05Merge branch 'master' into modesetting-101Thomas Hellstrom
2007-11-05drm: remove lots of spurious whitespace.Dave Airlie
2007-10-28Merge branch 'radeon-ttm' of git://people.freedesktop.org/~airlied/drm into m...Jerome Glisse
2007-07-16drm: detypedef drm.h and fixup all problemsDave Airlie
2007-06-05Merge branch 'origin' into radeon-ttmDave Airlie
2007-06-03radeon: add support for vblank on crtc2Dave Airlie
2007-04-01copy over some files and reorg radeon to add ttm fencing not working yetDave Airlie
2007-03-04radeon: make PCI GART aperture size variable, but making table size variableDave Airlie
2006-05-24Add support for r200 vertex programs (R200_EMIT_VAP_PVS_CNTL, and newRoland Scheidegger
2006-03-06Add general-purpose packet for manipulating scratch registers (r300)Aapo Tahkola
2006-02-18add benh's memory management patchDave Airlie
2006-02-18major realigment of DRM CVS with kernel code, makes integration much easierDave Airlie
2005-12-29add radeon card type get param so userspace can avoid walking PCIDave Airlie
2005-09-30fix pci overriding from userspaceDave Airlie
2005-09-11Add GART in FB support for ati pcigart, and PCIE support for r300Dave Airlie
2005-09-09Add support for GL_ATI_fragment_shader, new packets R200_EMIT_PP_AFS_0/1,Roland Scheidegger
2005-08-04Mark some radeon init variables deprecated. These used to be passed in butJon Smirl
2005-07-20Add latest r300 support from r300.sf.net CVS. Patch submitted by volodya,Eric Anholt
2005-03-15add R200_EMIT_PP_TRI_PERF_CNTL packet to support brilinear filtering onRoland Scheidegger
2005-02-10add support for texture micro tiling on radeon/r200. Add support for r100Roland Scheidegger
2005-01-26(Stephane Marchesin,me) Add radeon framebuffer tiling support to radeonRoland Scheidegger
2004-12-08(Stephane Marchesin, me) add hyperz support to radeon drm. Only fast zRoland Scheidegger
2004-10-10Vladimir requested support so we can at least load r300 microcode forDave Airlie
2004-09-30Lindent of core build. Drivers checked for no binary diffs. A few filesJon Smirl
2004-08-17preparation patch for radeon permanent mapping registers/framebuffer makesDave Airlie
2004-07-25sync up with current 2.6 kernel bk tree - mostly __user annotationsDave Airlie
2004-05-18add R200_EMIT_RB3D_BLENDCOLOR state packet to support GL_EXT_blend_color,Roland Scheidegger
2004-04-10white space changes to align with kernelDave Airlie
2004-03-12Fixes need to clean up the mess I made with the mesa merge. This codeJon Smirl
2003-11-04Memory layout transition:Michel Daenzer
2003-08-26Remove artificial PCI GART limitations, rename AGP to GART whereMichel Daenzer
2003-08-08Added some information as to when (which DRM version) various queries wereIan Romanick
set to the requested fence class */ if (bo->mem.proposed_flags & (DRM_BO_FLAG_READ | DRM_BO_FLAG_WRITE)) *type = 3; else *type = 1; return 0; } static int nouveau_bo_invalidate_caches(struct drm_device *dev, uint64_t buffer_flags) { /* We'll do this from user space. */ return 0; } static int nouveau_bo_init_mem_type(struct drm_device *dev, uint32_t type, struct drm_mem_type_manager *man) { struct drm_nouveau_private *dev_priv = dev->dev_private; switch (type) { case DRM_BO_MEM_LOCAL: man->flags = _DRM_FLAG_MEMTYPE_MAPPABLE | _DRM_FLAG_MEMTYPE_CACHED; man->drm_bus_maptype = 0; break; case DRM_BO_MEM_VRAM: man->flags = _DRM_FLAG_MEMTYPE_FIXED | _DRM_FLAG_MEMTYPE_MAPPABLE | _DRM_FLAG_NEEDS_IOREMAP; man->io_addr = NULL; man->drm_bus_maptype = _DRM_FRAME_BUFFER; man->io_offset = drm_get_resource_start(dev, 1); man->io_size = drm_get_resource_len(dev, 1); if (man->io_size > nouveau_mem_fb_amount(dev)) man->io_size = nouveau_mem_fb_amount(dev); break; case DRM_BO_MEM_PRIV0: /* Unmappable VRAM */ man->flags = _DRM_FLAG_MEMTYPE_CMA; man->drm_bus_maptype = 0; break; case DRM_BO_MEM_TT: switch (dev_priv->gart_info.type) { case NOUVEAU_GART_AGP: man->flags = _DRM_FLAG_MEMTYPE_MAPPABLE | _DRM_FLAG_MEMTYPE_CSELECT | _DRM_FLAG_NEEDS_IOREMAP; man->drm_bus_maptype = _DRM_AGP; break; case NOUVEAU_GART_SGDMA: man->flags = _DRM_FLAG_MEMTYPE_MAPPABLE | _DRM_FLAG_MEMTYPE_CSELECT | _DRM_FLAG_MEMTYPE_CMA; man->drm_bus_maptype = _DRM_SCATTER_GATHER; break; default: DRM_ERROR("Unknown GART type: %d\n", dev_priv->gart_info.type); return -EINVAL; } man->io_offset = dev_priv->gart_info.aper_base; man->io_size = dev_priv->gart_info.aper_size; man->io_addr = NULL; break; default: DRM_ERROR("Unsupported memory type %u\n", (unsigned)type); return -EINVAL; } return 0; } static uint64_t nouveau_bo_evict_flags(struct drm_buffer_object *bo) { switch (bo->mem.mem_type) { case DRM_BO_MEM_LOCAL: case DRM_BO_MEM_TT: return DRM_BO_FLAG_MEM_LOCAL; default: return DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_CACHED; } return 0; } /* GPU-assisted copy using NV_MEMORY_TO_MEMORY_FORMAT, can access * DRM_BO_MEM_{VRAM,PRIV0,TT} directly. */ static int nouveau_bo_move_m2mf(struct drm_buffer_object *bo, int evict, int no_wait, struct drm_bo_mem_reg *new_mem) { struct drm_device *dev = bo->dev; struct drm_nouveau_private *dev_priv = dev->dev_private; struct nouveau_drm_channel *dchan = &dev_priv->channel; struct drm_bo_mem_reg *old_mem = &bo->mem; uint32_t srch, dsth, page_count; /* Can happen during init/takedown */ if (!dchan->chan) return -EINVAL; srch = old_mem->mem_type == DRM_BO_MEM_TT ? NvDmaTT : NvDmaFB; dsth = new_mem->mem_type == DRM_BO_MEM_TT ? NvDmaTT : NvDmaFB; if (srch != dchan->m2mf_dma_source || dsth != dchan->m2mf_dma_destin) { dchan->m2mf_dma_source = srch; dchan->m2mf_dma_destin = dsth; BEGIN_RING(NvSubM2MF, NV_MEMORY_TO_MEMORY_FORMAT_SET_DMA_SOURCE, 2); OUT_RING (dchan->m2mf_dma_source); OUT_RING (dchan->m2mf_dma_destin); } page_count = new_mem->num_pages; while (page_count) { int line_count = (page_count > 2047) ? 2047 : page_count; BEGIN_RING(NvSubM2MF, NV_MEMORY_TO_MEMORY_FORMAT_OFFSET_IN, 8); OUT_RING (old_mem->mm_node->start << PAGE_SHIFT); OUT_RING (new_mem->mm_node->start << PAGE_SHIFT); OUT_RING (PAGE_SIZE); /* src_pitch */ OUT_RING (PAGE_SIZE); /* dst_pitch */ OUT_RING (PAGE_SIZE); /* line_length */ OUT_RING (line_count); OUT_RING ((1<<8)|(1<<0)); OUT_RING (0); BEGIN_RING(NvSubM2MF, NV_MEMORY_TO_MEMORY_FORMAT_NOP, 1); OUT_RING (0); page_count -= line_count; } return drm_bo_move_accel_cleanup(bo, evict, no_wait, dchan->chan->id, DRM_FENCE_TYPE_EXE, 0, new_mem); } /* Flip pages into the GART and move if we can. */ static int nouveau_bo_move_flipd(struct drm_buffer_object *bo, int evict, int no_wait, struct drm_bo_mem_reg *new_mem) { struct drm_device *dev = bo->dev; struct drm_bo_mem_reg tmp_mem; int ret; tmp_mem = *new_mem; tmp_mem.mm_node = NULL; tmp_mem.proposed_flags = (DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_CACHED | DRM_BO_FLAG_FORCE_CACHING); ret = drm_bo_mem_space(bo, &tmp_mem, no_wait); if (ret) return ret; ret = drm_ttm_bind(bo->ttm, &tmp_mem); if (ret) goto out_cleanup; ret = nouveau_bo_move_m2mf(bo, 1, no_wait, &tmp_mem); if (ret) goto out_cleanup; ret = drm_bo_move_ttm(bo, evict, no_wait, new_mem); out_cleanup: if (tmp_mem.mm_node) { mutex_lock(&dev->struct_mutex); if (tmp_mem.mm_node != bo->pinned_node) drm_mm_put_block(tmp_mem.mm_node); tmp_mem.mm_node = NULL; mutex_unlock(&dev->struct_mutex); } return ret; } static int nouveau_bo_move(struct drm_buffer_object *bo, int evict, int no_wait, struct drm_bo_mem_reg *new_mem) { struct drm_bo_mem_reg *old_mem = &bo->mem; if (new_mem->mem_type == DRM_BO_MEM_LOCAL) { if (old_mem->mem_type == DRM_BO_MEM_LOCAL) return drm_bo_move_memcpy(bo, evict, no_wait, new_mem); if (nouveau_bo_move_flipd(bo, evict, no_wait, new_mem)) return drm_bo_move_memcpy(bo, evict, no_wait, new_mem); } else if (old_mem->mem_type == DRM_BO_MEM_LOCAL) { if (1 /*nouveau_bo_move_flips(bo, evict, no_wait, new_mem)*/) return drm_bo_move_memcpy(bo, evict, no_wait, new_mem); } else { if (nouveau_bo_move_m2mf(bo, evict, no_wait, new_mem)) return drm_bo_move_memcpy(bo, evict, no_wait, new_mem); } return 0; } static void nouveau_bo_flush_ttm(struct drm_ttm *ttm) { } static uint32_t nouveau_mem_prios[] = { DRM_BO_MEM_PRIV0, DRM_BO_MEM_VRAM, DRM_BO_MEM_TT, DRM_BO_MEM_LOCAL }; static uint32_t nouveau_busy_prios[] = { DRM_BO_MEM_TT, DRM_BO_MEM_PRIV0, DRM_BO_MEM_VRAM, DRM_BO_MEM_LOCAL }; struct drm_bo_driver nouveau_bo_driver = { .mem_type_prio = nouveau_mem_prios, .mem_busy_prio = nouveau_busy_prios, .num_mem_type_prio = sizeof(nouveau_mem_prios)/sizeof(uint32_t), .num_mem_busy_prio = sizeof(nouveau_busy_prios)/sizeof(uint32_t), .create_ttm_backend_entry = nouveau_bo_create_ttm_backend_entry, .fence_type = nouveau_bo_fence_type, .invalidate_caches = nouveau_bo_invalidate_caches, .init_mem_type = nouveau_bo_init_mem_type, .evict_flags = nouveau_bo_evict_flags, .move = nouveau_bo_move, .ttm_cache_flush= nouveau_bo_flush_ttm, .command_stream_barrier = NULL };