diff options
Diffstat (limited to 'linux-core')
| -rw-r--r-- | linux-core/Makefile.kernel | 2 | ||||
| -rw-r--r-- | linux-core/ati_pcigart.c | 10 | ||||
| -rw-r--r-- | linux-core/atombios_crtc.c | 2 | ||||
| -rw-r--r-- | linux-core/drm_bufs.c | 1 | ||||
| -rw-r--r-- | linux-core/drm_crtc.h | 1 | ||||
| -rw-r--r-- | linux-core/drm_crtc_helper.c | 4 | ||||
| -rw-r--r-- | linux-core/drm_crtc_helper.h | 3 | ||||
| -rw-r--r-- | linux-core/radeon_buffer.c | 15 | ||||
| -rw-r--r-- | linux-core/radeon_connectors.c | 14 | ||||
| -rw-r--r-- | linux-core/radeon_display.c | 31 | ||||
| -rw-r--r-- | linux-core/radeon_drv.c | 12 | ||||
| -rw-r--r-- | linux-core/radeon_fb.c | 3 | ||||
| -rw-r--r-- | linux-core/radeon_fence.c | 1 | ||||
| -rw-r--r-- | linux-core/radeon_gem.c | 168 | ||||
| -rw-r--r-- | linux-core/radeon_gem_proc.c | 146 | ||||
| -rw-r--r-- | linux-core/radeon_legacy_crtc.c | 4 | ||||
| -rw-r--r-- | linux-core/radeon_legacy_encoders.c | 3 | ||||
| -rw-r--r-- | linux-core/radeon_mode.h | 3 | ||||
| -rw-r--r-- | linux-core/radeon_pm.c | 14 | 
19 files changed, 296 insertions, 141 deletions
diff --git a/linux-core/Makefile.kernel b/linux-core/Makefile.kernel index 392abaf9..98616e4b 100644 --- a/linux-core/Makefile.kernel +++ b/linux-core/Makefile.kernel @@ -44,7 +44,7 @@ nouveau-objs := nouveau_drv.o nouveau_state.o nouveau_fifo.o nouveau_mem.o \  radeon-objs := radeon_drv.o radeon_cp.o radeon_state.o radeon_mem.o radeon_irq.o r300_cmdbuf.o radeon_gem.o \  	 radeon_buffer.o radeon_fence.o atom.o radeon_display.o radeon_atombios.o radeon_i2c.o radeon_connectors.o radeon_cs.o \  	atombios_crtc.o radeon_encoders.o radeon_fb.o radeon_combios.o radeon_legacy_crtc.o radeon_legacy_encoders.o \ -	radeon_cursor.o radeon_pm.o +	radeon_cursor.o radeon_pm.o radeon_gem_proc.o  sis-objs    := sis_drv.o sis_mm.o  ffb-objs    := ffb_drv.o ffb_context.o  savage-objs := savage_drv.o savage_bci.o savage_state.o diff --git a/linux-core/ati_pcigart.c b/linux-core/ati_pcigart.c index 50e990f1..6b0d8947 100644 --- a/linux-core/ati_pcigart.c +++ b/linux-core/ati_pcigart.c @@ -39,7 +39,7 @@  #define ATI_PCIE_WRITE 0x4  #define ATI_PCIE_READ 0x8 -static __inline__ void gart_insert_page_into_table(struct drm_ati_pcigart_info *gart_info, dma_addr_t addr, u32 *pci_gart) +static __inline__ void gart_insert_page_into_table(struct drm_ati_pcigart_info *gart_info, dma_addr_t addr, volatile u32 *pci_gart)  {  	u32 page_base; @@ -61,7 +61,7 @@ static __inline__ void gart_insert_page_into_table(struct drm_ati_pcigart_info *  	*pci_gart = cpu_to_le32(page_base);  } -static __inline__ dma_addr_t gart_get_page_from_table(struct drm_ati_pcigart_info *gart_info, u32 *pci_gart) +static __inline__ dma_addr_t gart_get_page_from_table(struct drm_ati_pcigart_info *gart_info, volatile u32 *pci_gart)  {  	dma_addr_t retval;  	switch(gart_info->gart_reg_if) { @@ -93,7 +93,7 @@ int drm_ati_alloc_pcigart_table(struct drm_device *dev,  #ifdef CONFIG_X86  	/* IGPs only exist on x86 in any case */  	if (gart_info->gart_reg_if == DRM_ATI_GART_IGP) -		set_memory_uc(gart_info->table_handle->vaddr, gart_info->table_size >> PAGE_SHIFT); +		set_memory_uc((unsigned long)gart_info->table_handle->vaddr, gart_info->table_size >> PAGE_SHIFT);  #endif  	memset(gart_info->table_handle->vaddr, 0, gart_info->table_size); @@ -107,7 +107,7 @@ static void drm_ati_free_pcigart_table(struct drm_device *dev,  #ifdef CONFIG_X86  	/* IGPs only exist on x86 in any case */  	if (gart_info->gart_reg_if == DRM_ATI_GART_IGP) -		set_memory_wb(gart_info->table_handle->vaddr, gart_info->table_size >> PAGE_SHIFT); +		set_memory_wb((unsigned long)gart_info->table_handle->vaddr, gart_info->table_size >> PAGE_SHIFT);  #endif  	drm_pci_free(dev, gart_info->table_handle);  	gart_info->table_handle = NULL; @@ -260,7 +260,7 @@ static int ati_pcigart_bind_ttm(struct drm_ttm_backend *backend,          j = offset;          while (j < (offset + atipci_be->num_pages)) { -		if (gart_get_page_from_table(info, pci_gart+j)) +		if (gart_get_page_from_table(info, pci_gart + j))  			return -EBUSY;                  j++;          } diff --git a/linux-core/atombios_crtc.c b/linux-core/atombios_crtc.c index 3856f8ca..2e144c90 100644 --- a/linux-core/atombios_crtc.c +++ b/linux-core/atombios_crtc.c @@ -276,7 +276,7 @@ void atombios_crtc_set_base(struct drm_crtc *crtc, int x, int y)  	radeon_fb = to_radeon_framebuffer(crtc->fb); -	obj = radeon_fb->base.mm_private; +	obj = radeon_fb->obj;  	obj_priv = obj->driver_private;  	fb_location = obj_priv->bo->offset + dev_priv->fb_location; diff --git a/linux-core/drm_bufs.c b/linux-core/drm_bufs.c index c966badc..15c426cb 100644 --- a/linux-core/drm_bufs.c +++ b/linux-core/drm_bufs.c @@ -1544,7 +1544,6 @@ int drm_mapbufs(struct drm_device *dev, void *data,  				goto done;  			}  			down_write(¤t->mm->mmap_sem); -			DRM_DEBUG("%x %d\n", token, map->size);  			virtual = do_mmap(file_priv->filp, 0, map->size,  					  PROT_READ | PROT_WRITE,  					  MAP_SHARED, diff --git a/linux-core/drm_crtc.h b/linux-core/drm_crtc.h index 6a73a71b..13fba4f2 100644 --- a/linux-core/drm_crtc.h +++ b/linux-core/drm_crtc.h @@ -240,7 +240,6 @@ struct drm_framebuffer {  	void *fbdev;  	u32 pseudo_palette[17];  	struct list_head filp_head; -	void *mm_private;  };  struct drm_property_blob { diff --git a/linux-core/drm_crtc_helper.c b/linux-core/drm_crtc_helper.c index b334f5b5..776a98e1 100644 --- a/linux-core/drm_crtc_helper.c +++ b/linux-core/drm_crtc_helper.c @@ -771,15 +771,13 @@ int drm_helper_hotplug_stage_two(struct drm_device *dev)  EXPORT_SYMBOL(drm_helper_hotplug_stage_two);  int drm_helper_mode_fill_fb_struct(struct drm_framebuffer *fb, -				   struct drm_mode_fb_cmd *mode_cmd, -				   void *mm_private) +				   struct drm_mode_fb_cmd *mode_cmd)  {  	fb->width = mode_cmd->width;  	fb->height = mode_cmd->height;  	fb->pitch = mode_cmd->pitch;  	fb->bits_per_pixel = mode_cmd->bpp;  	fb->depth = mode_cmd->depth; -	fb->mm_private = mm_private;  	return 0;  } diff --git a/linux-core/drm_crtc_helper.h b/linux-core/drm_crtc_helper.h index 01b14239..c0719157 100644 --- a/linux-core/drm_crtc_helper.h +++ b/linux-core/drm_crtc_helper.h @@ -75,8 +75,7 @@ extern bool drm_crtc_helper_set_mode(struct drm_crtc *crtc, struct drm_display_m  extern bool drm_helper_crtc_in_use(struct drm_crtc *crtc);  extern int drm_helper_mode_fill_fb_struct(struct drm_framebuffer *fb, -					  struct drm_mode_fb_cmd *mode_cmd, -					  void *mm_private); +					  struct drm_mode_fb_cmd *mode_cmd);  static inline void drm_crtc_helper_add(struct drm_crtc *crtc, const struct drm_crtc_helper_funcs *funcs)  { diff --git a/linux-core/radeon_buffer.c b/linux-core/radeon_buffer.c index e5a90892..f047b1ac 100644 --- a/linux-core/radeon_buffer.c +++ b/linux-core/radeon_buffer.c @@ -170,10 +170,12 @@ void radeon_emit_copy_blit(struct drm_device * dev,  		ADVANCE_RING();  	} -	BEGIN_RING(4); +	BEGIN_RING(6);  	OUT_RING(CP_PACKET0(RADEON_RB2D_DSTCACHE_CTLSTAT, 0));  	OUT_RING(RADEON_RB2D_DC_FLUSH_ALL);  	RADEON_WAIT_UNTIL_2D_IDLE(); +	OUT_RING(CP_PACKET2()); +	OUT_RING(CP_PACKET2());  	ADVANCE_RING();  	COMMIT_RING(); @@ -252,7 +254,8 @@ void radeon_emit_solid_fill(struct drm_device * dev,  			 RADEON_GMC_DST_CLIPPING |  			 RADEON_GMC_BRUSH_SOLID_COLOR |  			 (format << 8) | -			 RADEON_ROP3_S | +			 RADEON_ROP3_P | +			 RADEON_CLR_CMP_SRC_SOURCE |  			 RADEON_GMC_CLR_CMP_CNTL_DIS | RADEON_GMC_WR_MSK_DIS);  		OUT_RING((pitch << 22) | (dst_offset >> 10)); // PITCH  		OUT_RING(0);   // SC_TOP_LEFT // DST CLIPPING @@ -265,10 +268,14 @@ void radeon_emit_solid_fill(struct drm_device * dev,  		ADVANCE_RING();  	} -	BEGIN_RING(4); +	BEGIN_RING(8);  	OUT_RING(CP_PACKET0(RADEON_RB2D_DSTCACHE_CTLSTAT, 0));  	OUT_RING(RADEON_RB2D_DC_FLUSH_ALL);  	RADEON_WAIT_UNTIL_2D_IDLE(); +	OUT_RING(CP_PACKET2()); +	OUT_RING(CP_PACKET2()); +	OUT_RING(CP_PACKET2()); +	OUT_RING(CP_PACKET2());  	ADVANCE_RING();  	COMMIT_RING(); @@ -350,7 +357,6 @@ static int radeon_move_vram(struct drm_buffer_object * bo,  	struct drm_bo_mem_reg tmp_mem;  	struct drm_bo_mem_reg *old_mem = &bo->mem;  	int ret;  -	bool was_local = false;  	/* old - LOCAL memory node bo->mem  	   tmp - TT type memory node @@ -398,7 +404,6 @@ int radeon_move(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 *old_mem = &bo->mem;  	drm_radeon_private_t *dev_priv = dev->dev_private;      	if (!dev_priv->cp_running) diff --git a/linux-core/radeon_connectors.c b/linux-core/radeon_connectors.c index f217fe77..18873f0f 100644 --- a/linux-core/radeon_connectors.c +++ b/linux-core/radeon_connectors.c @@ -87,19 +87,23 @@ static int radeon_lvds_get_modes(struct drm_connector *connector)  	if (radeon_connector->ddc_bus) {  		radeon_i2c_do_lock(radeon_connector, 1); -		edid = drm_get_edid(&radeon_connector->base, &radeon_connector->ddc_bus->adapter); +		edid = drm_get_edid(connector, &radeon_connector->ddc_bus->adapter);  		radeon_i2c_do_lock(radeon_connector, 0);  		if (edid) {  			drm_mode_connector_update_edid_property(&radeon_connector->base, edid);  			ret = drm_add_edid_modes(&radeon_connector->base, edid);  			kfree(edid); +			if (ret == 0) +				goto native;  			return ret;  		}  	} +native:  	encoder = radeon_best_single_encoder(connector);  	if (!encoder) -		return connector_status_disconnected; +		return 0; +  	/* we have no EDID modes */  	mode = radeon_fp_native_mode(encoder);  	if (mode) { @@ -301,8 +305,11 @@ static struct connector_funcs {  	{ CONNECTOR_LVDS, &radeon_lvds_connector_funcs, &radeon_lvds_connector_helper_funcs, DRM_MODE_CONNECTOR_LVDS, "LVDS" },  	{ CONNECTOR_DVI_A, &radeon_vga_connector_funcs, &radeon_vga_connector_helper_funcs, DRM_MODE_CONNECTOR_DVIA, "DVI" },  	{ CONNECTOR_DVI_I, &radeon_dvi_connector_funcs, &radeon_dvi_connector_helper_funcs, DRM_MODE_CONNECTOR_DVII, "DVI" }, - +	{ CONNECTOR_DVI_D, &radeon_dvi_connector_funcs, &radeon_dvi_connector_helper_funcs, DRM_MODE_CONNECTOR_DVID, "DVI" }, +	{ CONNECTOR_HDMI_TYPE_A, &radeon_dvi_connector_funcs, &radeon_vga_connector_helper_funcs, DRM_MODE_CONNECTOR_HDMIA, "HDMI" }, +	{ CONNECTOR_HDMI_TYPE_B, &radeon_dvi_connector_funcs, &radeon_vga_connector_helper_funcs, DRM_MODE_CONNECTOR_HDMIB, "HDMI" },  #if 0 +	{ CONNECTOR_HDMI_TYPE_A, radeon_vga_connector_funcs, radeon_vga_connector_helper_funcs, DRM_MODE_CONNECTOR_VGA },  	{ CONNECTOR_DVI_D, radeon_vga_connector_funcs, radeon_vga_connector_helper_funcs, DRM_MODE_CONNECTOR_VGA },  	{ CONNECTOR_STV, radeon_vga_connector_funcs, radeon_vga_connector_helper_funcs, DRM_MODE_CONNECTOR_VGA }, @@ -310,7 +317,6 @@ static struct connector_funcs {  	{ CONNECTOR_DIGITAL, radeon_vga_connector_funcs, radeon_vga_connector_helper_funcs, DRM_MODE_CONNECTOR_VGA },  	{ CONNECTOR_SCART, radeon_vga_connector_funcs, radeon_vga_connector_helper_funcs, DRM_MODE_CONNECTOR_VGA }, -	{ CONNECTOR_HDMI_TYPE_A, radeon_vga_connector_funcs, radeon_vga_connector_helper_funcs, DRM_MODE_CONNECTOR_VGA },  	{ CONNECTOR_HDMI_TYPE_B, radeon_vga_connector_funcs, radeon_vga_connector_helper_funcs, DRM_MODE_CONNECTOR_VGA },  	{ CONNECTOR_HDMI_TYPE_B, radeon_vga_connector_funcs, radeon_vga_connector_helper_funcs, DRM_MODE_CONNECTOR_VGA },  	{ CONNECTOR_HDMI_TYPE_B, radeon_vga_connector_funcs, radeon_vga_connector_helper_funcs, DRM_MODE_CONNECTOR_VGA }, diff --git a/linux-core/radeon_display.c b/linux-core/radeon_display.c index ddc933cc..0b9467fd 100644 --- a/linux-core/radeon_display.c +++ b/linux-core/radeon_display.c @@ -263,7 +263,9 @@ bool radeon_setup_enc_conn(struct drm_device *dev)  		/* TMDS on DVI */  		if ((mode_info->bios_connector[i].connector_type == CONNECTOR_DVI_I) || -		    (mode_info->bios_connector[i].connector_type == CONNECTOR_DVI_D)) { +		    (mode_info->bios_connector[i].connector_type == CONNECTOR_DVI_D) || +		    (mode_info->bios_connector[i].connector_type == CONNECTOR_HDMI_TYPE_A) || +		    (mode_info->bios_connector[i].connector_type == CONNECTOR_HDMI_TYPE_B)) {  			if (radeon_is_avivo(dev_priv) || radeon_r4xx_atom)  				encoder = radeon_encoder_atom_tmds_add(dev, i, mode_info->bios_connector[i].tmds_type);  			else { @@ -601,17 +603,22 @@ static void radeon_user_framebuffer_destroy(struct drm_framebuffer *fb)  	if (fb->fbdev)  		radeonfb_remove(dev, fb); +	if (radeon_fb->obj) { +		mutex_lock(&dev->struct_mutex); +		drm_gem_object_unreference(radeon_fb->obj); +		mutex_unlock(&dev->struct_mutex); +	}  	drm_framebuffer_cleanup(fb);  	kfree(radeon_fb);  }  static int radeon_user_framebuffer_create_handle(struct drm_framebuffer *fb, -						  struct drm_file *file_priv, -						  unsigned int *handle) +						 struct drm_file *file_priv, +						 unsigned int *handle)  { -	struct drm_gem_object *object = fb->mm_private; +	struct radeon_framebuffer *radeon_fb = to_radeon_framebuffer(fb); -	return drm_gem_handle_create(file_priv, object, handle); +	return drm_gem_handle_create(file_priv, radeon_fb->obj, handle);  }  static const struct drm_framebuffer_funcs radeon_fb_funcs = { @@ -622,7 +629,7 @@ static const struct drm_framebuffer_funcs radeon_fb_funcs = {  struct drm_framebuffer *  radeon_framebuffer_create(struct drm_device *dev,  			  struct drm_mode_fb_cmd *mode_cmd, -			  void *mm_private) +			  struct drm_gem_object *obj)  {  	struct radeon_framebuffer *radeon_fb; @@ -631,7 +638,10 @@ radeon_framebuffer_create(struct drm_device *dev,  		return NULL;  	drm_framebuffer_init(dev, &radeon_fb->base, &radeon_fb_funcs); -	drm_helper_mode_fill_fb_struct(&radeon_fb->base, mode_cmd, mm_private); + 	drm_helper_mode_fill_fb_struct(&radeon_fb->base, mode_cmd); + + 	radeon_fb->obj = obj; +  	return &radeon_fb->base;  } @@ -641,10 +651,11 @@ radeon_user_framebuffer_create(struct drm_device *dev,  			       struct drm_mode_fb_cmd *mode_cmd)  {  	struct radeon_framebuffer *radeon_fb; -	void *mm_private; + 	struct drm_gem_object *obj; + + 	obj = drm_gem_object_lookup(dev, file_priv, mode_cmd->handle); -	mm_private = drm_gem_object_lookup(dev, file_priv, mode_cmd->handle); -	return radeon_framebuffer_create(dev, mode_cmd, mm_private); +	return radeon_framebuffer_create(dev, mode_cmd, obj);  }  static const struct drm_mode_config_funcs radeon_mode_funcs = { diff --git a/linux-core/radeon_drv.c b/linux-core/radeon_drv.c index f1fe3012..f4194688 100644 --- a/linux-core/radeon_drv.c +++ b/linux-core/radeon_drv.c @@ -37,14 +37,14 @@  #include "drm_pciids.h"  int radeon_no_wb; -int radeon_dynclks = 1; +int radeon_dynclks = -1;  int radeon_r4xx_atom = 0;  int radeon_agpmode = 0;  MODULE_PARM_DESC(no_wb, "Disable AGP writeback for scratch registers\n");  module_param_named(no_wb, radeon_no_wb, int, 0444); -unsigned int radeon_modeset = 0; +int radeon_modeset = 0;  module_param_named(modeset, radeon_modeset, int, 0400);  MODULE_PARM_DESC(dynclks, "Disable/Enable dynamic clocks"); @@ -60,8 +60,12 @@ module_param_named(agpmode, radeon_agpmode, int, 0444);  static int dri_library_name(struct drm_device * dev, char * buf)  {  	drm_radeon_private_t *dev_priv = dev->dev_private; -	int family = dev_priv->flags & RADEON_FAMILY_MASK; +	int family; +	if (!dev_priv) +		return 0; + +	family = dev_priv->flags & RADEON_FAMILY_MASK;  	return snprintf(buf, PAGE_SIZE, "%s\n",  		(family < CHIP_R200) ? "radeon" :  		((family < CHIP_R300) ? "r200" : @@ -122,6 +126,8 @@ static struct drm_driver driver = {  	.dma_ioctl = radeon_cp_buffers,  	.master_create = radeon_master_create,  	.master_destroy = radeon_master_destroy, +	.proc_init = radeon_gem_proc_init, +	.proc_cleanup = radeon_gem_proc_cleanup,  	.fops = {  		.owner = THIS_MODULE,  		.open = drm_open, diff --git a/linux-core/radeon_fb.c b/linux-core/radeon_fb.c index 8d4181e8..d3722c37 100644 --- a/linux-core/radeon_fb.c +++ b/linux-core/radeon_fb.c @@ -1148,7 +1148,8 @@ int radeonfb_remove(struct drm_device *dev, struct drm_framebuffer *fb)  		unregister_framebuffer(info);  		drm_bo_kunmap(&radeon_fb->kmap_obj);  		mutex_lock(&dev->struct_mutex); -		drm_gem_object_unreference(fb->mm_private); +		drm_gem_object_unreference(radeon_fb->obj); +		radeon_fb->obj = NULL;  		mutex_unlock(&dev->struct_mutex);  		framebuffer_release(info);  	} diff --git a/linux-core/radeon_fence.c b/linux-core/radeon_fence.c index 591ad53b..b662da21 100644 --- a/linux-core/radeon_fence.c +++ b/linux-core/radeon_fence.c @@ -39,7 +39,6 @@ int radeon_fence_emit_sequence(struct drm_device *dev, uint32_t class,  			       uint32_t *native_type)  {  	struct drm_radeon_private *dev_priv = (struct drm_radeon_private *) dev->dev_private; -	RING_LOCALS;  	if (!dev_priv)  		return -EINVAL; diff --git a/linux-core/radeon_gem.c b/linux-core/radeon_gem.c index 5e2ad98b..2e20de3c 100644 --- a/linux-core/radeon_gem.c +++ b/linux-core/radeon_gem.c @@ -126,7 +126,6 @@ int radeon_gem_create_ioctl(struct drm_device *dev, void *data,  	struct drm_radeon_gem_object *obj_priv;  	struct drm_gem_object *obj;  	int ret = 0; -	uint32_t flags;  	int handle;  	/* create a gem object to contain this object in */ @@ -157,8 +156,6 @@ fail:  int radeon_gem_set_domain(struct drm_gem_object *obj, uint32_t read_domains, uint32_t write_domain, uint32_t *flags_p, bool unfenced)  { -	struct drm_device *dev = obj->dev; -	drm_radeon_private_t *dev_priv = dev->dev_private;  	struct drm_radeon_gem_object *obj_priv;  	uint32_t flags = 0;  	int ret; @@ -419,24 +416,14 @@ int radeon_gem_busy(struct drm_device *dev, void *data,  	return 0;  } -int radeon_gem_execbuffer(struct drm_device *dev, void *data, -			  struct drm_file *file_priv) -{ -	return -ENOSYS; - - -} - -int radeon_gem_indirect_ioctl(struct drm_device *dev, void *data, +int radeon_gem_wait_rendering(struct drm_device *dev, void *data,  			      struct drm_file *file_priv)  { -	struct drm_radeon_gem_indirect *args = data; -	struct drm_radeon_private *dev_priv = dev->dev_private; +	struct drm_radeon_gem_wait_rendering *args = data;  	struct drm_gem_object *obj;  	struct drm_radeon_gem_object *obj_priv; -	uint32_t start, end;  	int ret; -	RING_LOCALS; +  	obj = drm_gem_object_lookup(dev, file_priv, args->handle);  	if (obj == NULL) @@ -444,64 +431,18 @@ int radeon_gem_indirect_ioctl(struct drm_device *dev, void *data,  	obj_priv = obj->driver_private; -	DRM_DEBUG("got here %p %d\n", obj, args->used); -	//RING_SPACE_TEST_WITH_RETURN(dev_priv); -	//VB_AGE_TEST_WITH_RETURN(dev_priv); - -	ret = drm_bo_do_validate(obj_priv->bo, 0, DRM_BO_FLAG_NO_EVICT, -				 0 , 0); -	if (ret) -		return ret; - -	/* Wait for the 3D stream to idle before the indirect buffer -	 * containing 2D acceleration commands is processed. -	 */ -	BEGIN_RING(2); - -	RADEON_WAIT_UNTIL_3D_IDLE(); - -	ADVANCE_RING(); +	mutex_lock(&obj_priv->bo->mutex); +	ret = drm_bo_wait(obj_priv->bo, 0, 1, 1, 0); +	mutex_unlock(&obj_priv->bo->mutex); -	start = 0; -	end = args->used; - -	if (start != end) { -		int offset = (dev_priv->gart_vm_start +  -			      + obj_priv->bo->offset + start); -		int dwords = (end - start + 3) / sizeof(u32); - -		/* Fire off the indirect buffer */ -		BEGIN_RING(3); - -		OUT_RING(CP_PACKET0(RADEON_CP_IB_BASE, 1)); -		OUT_RING(offset); -		OUT_RING(dwords); - -		ADVANCE_RING(); -	} - -	COMMIT_RING(); - -	/* we need to fence the buffer */ -	ret = drm_fence_buffer_objects(dev, NULL, 0, NULL, &obj_priv->fence); -	if (ret) { -	   -		drm_putback_buffer_objects(dev); -		ret = 0; -		goto fail; -	} - -	/* dereference he fence object */ -	drm_fence_usage_deref_unlocked(&obj_priv->fence); -  	mutex_lock(&dev->struct_mutex);  	drm_gem_object_unreference(obj);  	mutex_unlock(&dev->struct_mutex); -	ret = 0; - fail:  	return ret;  } + +  /*   * Depending on card genertation, chipset bugs, etc... the amount of vram   * accessible to the CPU can vary. This function is our best shot at figuring @@ -525,6 +466,7 @@ static uint32_t radeon_get_accessible_vram(struct drm_device *dev)  	    dev_priv->chip_family == CHIP_RV350 ||  	    dev_priv->chip_family == CHIP_RV380 ||  	    dev_priv->chip_family == CHIP_R420 || +	    dev_priv->chip_family == CHIP_R423 ||  	    dev_priv->chip_family == CHIP_RV410 ||  	    radeon_is_avivo(dev_priv)) {  		uint32_t temp = RADEON_READ(RADEON_HOST_PATH_CNTL); @@ -585,6 +527,9 @@ void radeon_vram_setup(struct drm_device *dev)  	if (accessible > bar_size)  		accessible = bar_size; +	if (accessible > vram) +		accessible = vram; +  	DRM_INFO("Detected VRAM RAM=%dK, accessible=%uK, BAR=%uK\n",  		 vram, accessible, bar_size); @@ -612,7 +557,7 @@ static int radeon_gart_init(struct drm_device *dev)  		base = dev->agp->base;  		if ((base + dev_priv->gart_size - 1) >= dev_priv->fb_location &&  		    base < (dev_priv->fb_location + dev_priv->fb_size - 1)) { -			DRM_INFO("Can't use agp base @0x%08xlx, won't fit\n", +			DRM_INFO("Can't use agp base @0x%08lx, won't fit\n",  				 dev->agp->base);  			base = 0;  		} @@ -728,7 +673,7 @@ int radeon_alloc_gart_objects(struct drm_device *dev)  		return -EINVAL;  	} -	DRM_DEBUG("Ring ptr %p mapped at %d %p, read ptr %p maped at %d %p\n", +	DRM_DEBUG("Ring ptr %p mapped at %ld %p, read ptr %p maped at %ld %p\n",  		  dev_priv->mm.ring.bo, dev_priv->mm.ring.bo->offset, dev_priv->mm.ring.kmap.virtual,  		  dev_priv->mm.ring_read.bo, dev_priv->mm.ring_read.bo->offset, dev_priv->mm.ring_read.kmap.virtual); @@ -825,7 +770,6 @@ static void radeon_wait_for_vsync(struct drm_device *dev)  {  	drm_radeon_private_t *dev_priv = dev->dev_private;  	uint32_t       crtc_gen_cntl; -	int ret;  	crtc_gen_cntl = RADEON_READ(RADEON_CRTC_GEN_CNTL);  	if ((crtc_gen_cntl & RADEON_CRTC_DISP_REQ_EN_B) || @@ -844,7 +788,6 @@ static void radeon_wait_for_vsync2(struct drm_device *dev)  {  	drm_radeon_private_t *dev_priv = dev->dev_private;  	uint32_t       crtc2_gen_cntl; -	struct timeval timeout;  	crtc2_gen_cntl = RADEON_READ(RADEON_CRTC2_GEN_CNTL);  	if ((crtc2_gen_cntl & RADEON_CRTC2_DISP_REQ_EN_B) || @@ -913,7 +856,6 @@ void radeon_init_memory_map(struct drm_device *dev)  {  	drm_radeon_private_t *dev_priv = dev->dev_private;  	u32 mem_size, aper_size; -	u32 tmp;  	dev_priv->mc_fb_location = radeon_read_fb_location(dev_priv);  	radeon_read_agp_location(dev_priv, &dev_priv->mc_agp_loc_lo, &dev_priv->mc_agp_loc_hi); @@ -960,6 +902,7 @@ void radeon_init_memory_map(struct drm_device *dev)  			    dev_priv->chip_family == CHIP_RV350 ||  			    dev_priv->chip_family == CHIP_RV380 ||  			    dev_priv->chip_family == CHIP_R420 || +			    dev_priv->chip_family == CHIP_R423 ||  			    dev_priv->chip_family == CHIP_RV410)  				aper0_base &= ~(mem_size - 1); @@ -1004,6 +947,10 @@ void radeon_init_memory_map(struct drm_device *dev)  			- dev_priv->fb_location;  	} +	/* add an MTRR for the VRAM */ +	dev_priv->aper_size = aper_size; +	dev_priv->vram_mtrr = mtrr_add(dev_priv->fb_aper_offset, dev_priv->aper_size, MTRR_TYPE_WRCOMB, 1); +  }  /* init memory manager - start with all of VRAM and a 32MB GART aperture for now */ @@ -1094,6 +1041,8 @@ void radeon_gem_mm_fini(struct drm_device *dev)  		DRM_DEBUG("delaying takedown of VRAM memory\n");  	} +	if (dev_priv->vram_mtrr) +		mtrr_del(dev_priv->vram_mtrr, dev_priv->fb_aper_offset, dev_priv->aper_size);  	mutex_unlock(&dev->struct_mutex);  	drm_bo_driver_finish(dev); @@ -1143,11 +1092,11 @@ int radeon_gem_object_unpin(struct drm_gem_object *obj)  #define RADEON_NUM_IB (RADEON_IB_MEMORY / RADEON_IB_SIZE) -int radeon_gem_ib_get(struct drm_device *dev, void **ib, uint32_t dwords, uint32_t *card_offset) +int radeon_gem_ib_get(struct drm_radeon_cs_parser *parser)  {  	int i, index = -1;  	int ret; -	drm_radeon_private_t *dev_priv = dev->dev_private; +	drm_radeon_private_t *dev_priv = parser->dev->dev_private;  	for (i = 0; i < RADEON_NUM_IB; i++) {  		if (!(dev_priv->ib_alloc_bitmap & (1 << i))){ @@ -1173,12 +1122,12 @@ int radeon_gem_ib_get(struct drm_device *dev, void **ib, uint32_t dwords, uint32  	}  	if (index == -1) { -		DRM_ERROR("Major case fail to allocate IB from freelist %x\n", dev_priv->ib_alloc_bitmap); +		DRM_ERROR("Major case fail to allocate IB from freelist %llx\n", dev_priv->ib_alloc_bitmap);  		return -EINVAL;  	} -	if (dwords > RADEON_IB_SIZE / sizeof(uint32_t)) +	if (parser->chunks[parser->ib_index].length_dw > RADEON_IB_SIZE / sizeof(uint32_t))  		return -EINVAL;  	ret = drm_bo_do_validate(dev_priv->ib_objs[index]->bo, 0, @@ -1189,26 +1138,26 @@ int radeon_gem_ib_get(struct drm_device *dev, void **ib, uint32_t dwords, uint32  		return -EINVAL;  	} -	*card_offset = dev_priv->gart_vm_start + dev_priv->ib_objs[index]->bo->offset; -	*ib = dev_priv->ib_objs[index]->kmap.virtual; +	parser->ib = dev_priv->ib_objs[index]->kmap.virtual; +	parser->card_offset = dev_priv->gart_vm_start + dev_priv->ib_objs[index]->bo->offset;  	dev_priv->ib_alloc_bitmap |= (1 << i);  	return 0;  } -static void radeon_gem_ib_free(struct drm_device *dev, void *ib, uint32_t dwords) +static void radeon_gem_ib_free(struct drm_radeon_cs_parser *parser)  { +	struct drm_device *dev = parser->dev;  	drm_radeon_private_t *dev_priv = dev->dev_private;  	struct drm_fence_object *fence;  	int ret;  	int i;  	for (i = 0; i < RADEON_NUM_IB; i++) { - -		if (dev_priv->ib_objs[i]->kmap.virtual == ib) { +		if (dev_priv->ib_objs[i]->kmap.virtual == parser->ib) {  			/* emit a fence object */  			ret = drm_fence_buffer_objects(dev, NULL, 0, NULL, &fence); +			dev_priv->irq_emitted = 0;  			if (ret) { -				  				drm_putback_buffer_objects(dev);  			}  			/* dereference the fence object */ @@ -1238,21 +1187,58 @@ static int radeon_gem_ib_destroy(struct drm_device *dev)  	return 0;  } -static int radeon_gem_relocate(struct drm_device *dev, struct drm_file *file_priv, -				uint32_t *reloc, uint32_t *offset) +static int radeon_gem_find_reloc(struct drm_radeon_cs_parser *parser, +				 uint32_t offset, uint32_t *handle, +				 uint32_t *read_domains, uint32_t *write_domain) +{ +	struct drm_device *dev = parser->dev; +	drm_radeon_private_t *dev_priv = dev->dev_private; +	struct drm_radeon_kernel_chunk *reloc_chunk = &parser->chunks[parser->reloc_index]; + +	if (!reloc_chunk->kdata) +		return -EINVAL; + +	if (offset > reloc_chunk->length_dw){ +		DRM_ERROR("Offset larger than chunk %d %d\n", offset, reloc_chunk->length_dw); +		return -EINVAL; +	} + +	*handle = reloc_chunk->kdata[offset]; +	*read_domains = reloc_chunk->kdata[offset + 1]; +	*write_domain = reloc_chunk->kdata[offset + 2]; +	return 0; +} + +static int radeon_gem_relocate(struct drm_radeon_cs_parser *parser, +			       uint32_t *reloc, uint32_t *offset)  { +	struct drm_device *dev = parser->dev;  	drm_radeon_private_t *dev_priv = dev->dev_private;  	/* relocate the handle */ -	uint32_t read_domains = reloc[2]; -	uint32_t write_domain = reloc[3]; +	uint32_t read_domains, write_domain;  	struct drm_gem_object *obj;  	int flags = 0;  	int ret;  	struct drm_radeon_gem_object *obj_priv; -	obj = drm_gem_object_lookup(dev, file_priv, reloc[1]); -	if (!obj) -		return -EINVAL; +	if (parser->reloc_index == -1) { +		obj = drm_gem_object_lookup(dev, parser->file_priv, reloc[1]); +		if (!obj) +			return -EINVAL; +		read_domains = reloc[2]; +		write_domain = reloc[3]; +	} else { +		uint32_t handle; + +		/* have to lookup handle in other chunk */ +		ret = radeon_gem_find_reloc(parser, reloc[1], &handle, &read_domains, &write_domain); +		if (ret < 0) +			return ret; + +		obj = drm_gem_object_lookup(dev, parser->file_priv, handle); +		if (!obj) +			return -EINVAL; +	}  	obj_priv = obj->driver_private;  	radeon_gem_set_domain(obj, read_domains, write_domain, &flags, false); @@ -1522,7 +1508,7 @@ static int radeon_gem_dma_bufs_init(struct drm_device *dev)  	if (ret < 0)  		return ret; -	ret = drm_buffer_object_create(dev, size, drm_bo_type_device, +	ret = drm_buffer_object_create(dev, size, drm_bo_type_kernel,  				       DRM_BO_FLAG_READ | DRM_BO_FLAG_WRITE | DRM_BO_FLAG_NO_EVICT |  				       DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_MAPPABLE, 0,  				       0, 0, &dev_priv->mm.dma_bufs.bo); @@ -1540,7 +1526,7 @@ static int radeon_gem_dma_bufs_init(struct drm_device *dev)  	DRM_DEBUG("\n");  	radeon_gem_addbufs(dev); -	DRM_DEBUG("%x %d\n", dev_priv->mm.dma_bufs.bo->map_list.hash.key, size); +	DRM_DEBUG("%lx %d\n", dev_priv->mm.dma_bufs.bo->map_list.hash.key, size);  	dev->agp_buffer_token = dev_priv->mm.dma_bufs.bo->map_list.hash.key << PAGE_SHIFT;  	dev_priv->mm.fake_agp_map.handle = dev_priv->mm.dma_bufs.kmap.virtual;  	dev_priv->mm.fake_agp_map.size = size; diff --git a/linux-core/radeon_gem_proc.c b/linux-core/radeon_gem_proc.c new file mode 100644 index 00000000..04f5a5fc --- /dev/null +++ b/linux-core/radeon_gem_proc.c @@ -0,0 +1,146 @@ +/* + * Copyright © 2008 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * Authors: + *    Eric Anholt <eric@anholt.net> + *    Keith Packard <keithp@keithp.com> + * + */ + +#include "drmP.h" +#include "drm.h" +#include "radeon_drm.h" +#include "radeon_drv.h" + + +static int radeon_ring_info(char *buf, char **start, off_t offset, +			       int request, int *eof, void *data) +{ +	struct drm_minor *minor = (struct drm_minor *) data; +	struct drm_device *dev = minor->dev; +	drm_radeon_private_t *dev_priv = dev->dev_private; +	int len = 0; + +	if (offset > DRM_PROC_LIMIT) { +		*eof = 1; +		return 0; +	} + +	*start = &buf[offset]; +	*eof = 0; +	DRM_PROC_PRINT("RADEON_CP_RB_WPTR %08x\n", +		       RADEON_READ(RADEON_CP_RB_WPTR)); + +	DRM_PROC_PRINT("RADEON_CP_RB_RPTR %08x\n", +		       RADEON_READ(RADEON_CP_RB_RPTR)); + +	 +	if (len > request + offset) +		return request; +	*eof = 1; +	return len - offset; +} + +static int radeon_interrupt_info(char *buf, char **start, off_t offset, +			       int request, int *eof, void *data) +{ +	struct drm_minor *minor = (struct drm_minor *) data; +	struct drm_device *dev = minor->dev; +	drm_radeon_private_t *dev_priv = dev->dev_private; +	int len = 0; + +	if (offset > DRM_PROC_LIMIT) { +		*eof = 1; +		return 0; +	} + +	*start = &buf[offset]; +	*eof = 0; +	DRM_PROC_PRINT("Interrupt enable:    %08x\n", +		       RADEON_READ(RADEON_GEN_INT_CNTL)); + +	if (dev_priv->chip_family >= CHIP_RS690) { +	  DRM_PROC_PRINT("DxMODE_INT_MASK:         %08x\n", +			 RADEON_READ(R500_DxMODE_INT_MASK)); +	} +	DRM_PROC_PRINT("Interrupts received: %d\n", +		       atomic_read(&dev_priv->irq_received)); +	DRM_PROC_PRINT("Current sequence:    %d %d\n", +		       READ_BREADCRUMB(dev_priv), RADEON_READ(RADEON_SCRATCH_REG3)); +	DRM_PROC_PRINT("Counter sequence:     %d\n", +		       dev_priv->counter); +	if (dev_priv->chip_family >= CHIP_R300)  +		DRM_PROC_PRINT("CS:    %d\n", +			       GET_SCRATCH(6)); + +	 +	if (len > request + offset) +		return request; +	*eof = 1; +	return len - offset; +} + +static struct drm_proc_list { +	/** file name */ +	const char *name; +	/** proc callback*/ +	int (*f) (char *, char **, off_t, int, int *, void *); +} radeon_gem_proc_list[] = { +	{"radeon_gem_interrupt", radeon_interrupt_info}, +	{"radeon_gem_ring", radeon_ring_info}, +}; + + +#define RADEON_GEM_PROC_ENTRIES ARRAY_SIZE(radeon_gem_proc_list) + +int radeon_gem_proc_init(struct drm_minor *minor) +{ +	struct proc_dir_entry *ent; +	int i, j; + +	for (i = 0; i < RADEON_GEM_PROC_ENTRIES; i++) { +		ent = create_proc_entry(radeon_gem_proc_list[i].name, +					S_IFREG | S_IRUGO, minor->dev_root); +		if (!ent) { +			DRM_ERROR("Cannot create /proc/dri/.../%s\n", +				  radeon_gem_proc_list[i].name); +			for (j = 0; j < i; j++) +				remove_proc_entry(radeon_gem_proc_list[i].name, +						  minor->dev_root); +			return -1; +		} +		ent->read_proc = radeon_gem_proc_list[i].f; +		ent->data = minor; +	} +	return 0; +} + +void radeon_gem_proc_cleanup(struct drm_minor *minor) +{ +	int i; + +	if (!minor->dev_root) +		return; + +	for (i = 0; i < RADEON_GEM_PROC_ENTRIES; i++) +		remove_proc_entry(radeon_gem_proc_list[i].name, minor->dev_root); +} diff --git a/linux-core/radeon_legacy_crtc.c b/linux-core/radeon_legacy_crtc.c index 820bd548..c0a3c0fa 100644 --- a/linux-core/radeon_legacy_crtc.c +++ b/linux-core/radeon_legacy_crtc.c @@ -231,7 +231,7 @@ static bool radeon_set_crtc1_base(struct drm_crtc *crtc, int x, int y)  	radeon_fb = to_radeon_framebuffer(crtc->fb); -	obj = radeon_fb->base.mm_private; +	obj = radeon_fb->obj;  	obj_priv = obj->driver_private;  	crtc_offset = obj_priv->bo->offset; @@ -654,7 +654,7 @@ static bool radeon_set_crtc2_base(struct drm_crtc *crtc, int x, int y)  	radeon_fb = to_radeon_framebuffer(crtc->fb); -	obj = radeon_fb->base.mm_private; +	obj = radeon_fb->obj;  	obj_priv = obj->driver_private;  	crtc2_offset = obj_priv->bo->offset; diff --git a/linux-core/radeon_legacy_encoders.c b/linux-core/radeon_legacy_encoders.c index 261501d1..3df89d30 100644 --- a/linux-core/radeon_legacy_encoders.c +++ b/linux-core/radeon_legacy_encoders.c @@ -1070,6 +1070,7 @@ static void radeon_legacy_tv_dac_dpms(struct drm_encoder *encoder, int mode)  			crtc2_gen_cntl |= RADEON_CRTC2_CRT2_ON;  			//tv_master_cntl |= RADEON_TV_ON;  			if (dev_priv->chip_family == CHIP_R420 || +			    dev_priv->chip_family == CHIP_R423 ||  			    dev_priv->chip_family == CHIP_RV410)  				tv_dac_cntl &= ~(R420_TV_DAC_RDACPD |  						 R420_TV_DAC_GDACPD | @@ -1095,6 +1096,7 @@ static void radeon_legacy_tv_dac_dpms(struct drm_encoder *encoder, int mode)                          crtc2_gen_cntl &= ~RADEON_CRTC2_CRT2_ON;  			//tv_master_cntl &= ~RADEON_TV_ON;  			if (dev_priv->chip_family == CHIP_R420 || +			    dev_priv->chip_family == CHIP_R423 ||  			    dev_priv->chip_family == CHIP_RV410)  				tv_dac_cntl |= (R420_TV_DAC_RDACPD |  						R420_TV_DAC_GDACPD | @@ -1158,6 +1160,7 @@ static void radeon_legacy_tv_dac_mode_set(struct drm_encoder *encoder,  	if (dev_priv->chip_family != CHIP_R200) {  		tv_dac_cntl = RADEON_READ(RADEON_TV_DAC_CNTL);  		if (dev_priv->chip_family == CHIP_R420 || +		    dev_priv->chip_family == CHIP_R423 ||  		    dev_priv->chip_family == CHIP_RV410) {  			tv_dac_cntl &= ~(RADEON_TV_DAC_STD_MASK |  					 RADEON_TV_DAC_BGADJ_MASK | diff --git a/linux-core/radeon_mode.h b/linux-core/radeon_mode.h index 64608e35..23de1088 100644 --- a/linux-core/radeon_mode.h +++ b/linux-core/radeon_mode.h @@ -255,6 +255,7 @@ struct radeon_connector {  struct radeon_framebuffer {  	struct drm_framebuffer base;  	struct drm_bo_kmap_obj kmap_obj; +	struct drm_gem_object *obj;  };  extern struct radeon_i2c_chan *radeon_i2c_create(struct drm_device *dev, @@ -323,7 +324,7 @@ extern void radeon_crtc_fb_gamma_set(struct drm_crtc *crtc, u16 red, u16 green,  				     u16 blue, int regno);  struct drm_framebuffer *radeon_framebuffer_create(struct drm_device *dev,  						  struct drm_mode_fb_cmd *mode_cmd, -						  void *mm_private); +						  struct drm_gem_object *obj);  int radeonfb_probe(struct drm_device *dev); diff --git a/linux-core/radeon_pm.c b/linux-core/radeon_pm.c index 6b1e6f84..259d42da 100644 --- a/linux-core/radeon_pm.c +++ b/linux-core/radeon_pm.c @@ -54,10 +54,10 @@ int radeon_suspend(struct drm_device *dev, pm_message_t state)  		if (!radeon_fb)  			continue; -		if (!radeon_fb->base.mm_private) +		if (!radeon_fb->obj)  			continue; -		radeon_gem_object_unpin(radeon_fb->base.mm_private); +		radeon_gem_object_unpin(radeon_fb->obj);  	}  	if (!(dev_priv->flags & RADEON_IS_IGP)) @@ -93,7 +93,6 @@ int radeon_resume(struct drm_device *dev)  	struct drm_radeon_private *dev_priv = dev->dev_private;  	struct drm_framebuffer *fb;  	int i; -	u32 tmp;  	if (!drm_core_check_feature(dev, DRIVER_MODESET))  		return 0; @@ -104,10 +103,7 @@ int radeon_resume(struct drm_device *dev)  		return -1;  	/* Turn on bus mastering -todo fix properly */ -	if (dev_priv->chip_family < CHIP_RV380) { -		tmp = RADEON_READ(RADEON_BUS_CNTL) & ~RADEON_BUS_MASTER_DIS; -		RADEON_WRITE(RADEON_BUS_CNTL, tmp); -	} +	radeon_enable_bm(dev_priv);  	DRM_ERROR("\n");  	/* on atom cards re init the whole card  @@ -179,10 +175,10 @@ int radeon_resume(struct drm_device *dev)  		if (!radeon_fb)  			continue; -		if (!radeon_fb->base.mm_private) +		if (!radeon_fb->obj)  			continue; -		radeon_gem_object_pin(radeon_fb->base.mm_private, +		radeon_gem_object_pin(radeon_fb->obj,  				      PAGE_SIZE, RADEON_GEM_DOMAIN_VRAM);  	}  	/* blat the mode back in */  | 
