Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 44040f10 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
* 'drm-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6: (133 commits)
  drm/vgaarb: add VGA arbitration support to the drm and kms.
  drm/radeon: some r420s have a CP race with the DMA engine.
  drm/radeon/r600/kms: rv670 is not DCE3
  drm/radeon/kms: r420 idle after programming GA_ENHANCE
  drm/radeon/kms: more fixes to rv770 suspend/resume path.
  drm/radeon/kms: more alignment for rv770.c with r600.c
  drm/radeon/kms: rv770 blit init called too late.
  drm/radeon/kms: move around new init path code to avoid posting at init
  drm/radeon/r600: fix some issues with suspend/resume.
  drm/radeon/kms: disable VGA rendering engine before taking over VRAM
  drm/radeon/kms: Move radeon_get_clock_info() call out of radeon_clocks_init().
  drm/radeon/kms: add initial connector properties
  drm/radeon/kms: Use surfaces for scanout / cursor byte swapping on big endian.
  drm/radeon/kms: don't fail if we fail to init GPU acceleration
  drm/r600/kms: fixup number of loops per blit calculation.
  drm/radeon/kms: reprogram format in set base.
  drm/radeon: avivo chips have no separate int bit for display
  drm/radeon/r600: don't do interrupts
  drm: fix _DRM_GEM addmap error message
  drm: update crtc x/y when only fb changes
  ...

Fixed up trivial conflicts in firmware/Makefile due to network driver
(cxgb3) and drm (mga/r128/radeon) firmware being listed next to each
other.
parents 388dba30 28d52043
Loading
Loading
Loading
Loading
+14 −4
Original line number Original line Diff line number Diff line
@@ -18,6 +18,14 @@ menuconfig DRM
	  details.  You should also select and configure AGP
	  details.  You should also select and configure AGP
	  (/dev/agpgart) support.
	  (/dev/agpgart) support.


config DRM_KMS_HELPER
	tristate
	depends on DRM
	select FB
	select FRAMEBUFFER_CONSOLE if !EMBEDDED
	help
	  FB and CRTC helpers for KMS drivers.

config DRM_TTM
config DRM_TTM
	tristate
	tristate
	depends on DRM
	depends on DRM
@@ -36,6 +44,7 @@ config DRM_TDFX
config DRM_R128
config DRM_R128
	tristate "ATI Rage 128"
	tristate "ATI Rage 128"
	depends on DRM && PCI
	depends on DRM && PCI
	select FW_LOADER
	help
	help
	  Choose this option if you have an ATI Rage 128 graphics card.  If M
	  Choose this option if you have an ATI Rage 128 graphics card.  If M
	  is selected, the module will be called r128.  AGP support for
	  is selected, the module will be called r128.  AGP support for
@@ -47,8 +56,9 @@ config DRM_RADEON
	select FB_CFB_FILLRECT
	select FB_CFB_FILLRECT
	select FB_CFB_COPYAREA
	select FB_CFB_COPYAREA
	select FB_CFB_IMAGEBLIT
	select FB_CFB_IMAGEBLIT
	select FB
	select FW_LOADER
	select FRAMEBUFFER_CONSOLE if !EMBEDDED
        select DRM_KMS_HELPER
        select DRM_TTM
	help
	help
	  Choose this option if you have an ATI Radeon graphics card.  There
	  Choose this option if you have an ATI Radeon graphics card.  There
	  are both PCI and AGP versions.  You don't need to choose this to
	  are both PCI and AGP versions.  You don't need to choose this to
@@ -82,11 +92,10 @@ config DRM_I830
config DRM_I915
config DRM_I915
	tristate "i915 driver"
	tristate "i915 driver"
	depends on AGP_INTEL
	depends on AGP_INTEL
	select DRM_KMS_HELPER
	select FB_CFB_FILLRECT
	select FB_CFB_FILLRECT
	select FB_CFB_COPYAREA
	select FB_CFB_COPYAREA
	select FB_CFB_IMAGEBLIT
	select FB_CFB_IMAGEBLIT
	select FB
	select FRAMEBUFFER_CONSOLE if !EMBEDDED
	# i915 depends on ACPI_VIDEO when ACPI is enabled
	# i915 depends on ACPI_VIDEO when ACPI is enabled
	# but for select to work, need to select ACPI_VIDEO's dependencies, ick
	# but for select to work, need to select ACPI_VIDEO's dependencies, ick
	select VIDEO_OUTPUT_CONTROL if ACPI
	select VIDEO_OUTPUT_CONTROL if ACPI
@@ -116,6 +125,7 @@ endchoice
config DRM_MGA
config DRM_MGA
	tristate "Matrox g200/g400"
	tristate "Matrox g200/g400"
	depends on DRM
	depends on DRM
	select FW_LOADER
	help
	help
	  Choose this option if you have a Matrox G200, G400 or G450 graphics
	  Choose this option if you have a Matrox G200, G400 or G450 graphics
	  card.  If M is selected, the module will be called mga.  AGP
	  card.  If M is selected, the module will be called mga.  AGP
+6 −2
Original line number Original line Diff line number Diff line
@@ -10,11 +10,15 @@ drm-y := drm_auth.o drm_bufs.o drm_cache.o \
		drm_lock.o drm_memory.o drm_proc.o drm_stub.o drm_vm.o \
		drm_lock.o drm_memory.o drm_proc.o drm_stub.o drm_vm.o \
		drm_agpsupport.o drm_scatter.o ati_pcigart.o drm_pci.o \
		drm_agpsupport.o drm_scatter.o ati_pcigart.o drm_pci.o \
		drm_sysfs.o drm_hashtab.o drm_sman.o drm_mm.o \
		drm_sysfs.o drm_hashtab.o drm_sman.o drm_mm.o \
		drm_crtc.o drm_crtc_helper.o drm_modes.o drm_edid.o \
		drm_crtc.o drm_modes.o drm_edid.o \
		drm_info.o drm_debugfs.o
		drm_info.o drm_debugfs.o drm_encoder_slave.o


drm-$(CONFIG_COMPAT) += drm_ioc32.o
drm-$(CONFIG_COMPAT) += drm_ioc32.o


drm_kms_helper-y := drm_fb_helper.o drm_crtc_helper.o

obj-$(CONFIG_DRM_KMS_HELPER) += drm_kms_helper.o

obj-$(CONFIG_DRM)	+= drm.o
obj-$(CONFIG_DRM)	+= drm.o
obj-$(CONFIG_DRM_TTM)	+= ttm/
obj-$(CONFIG_DRM_TTM)	+= ttm/
obj-$(CONFIG_DRM_TDFX)	+= tdfx/
obj-$(CONFIG_DRM_TDFX)	+= tdfx/
+2 −2
Original line number Original line Diff line number Diff line
@@ -310,10 +310,10 @@ static int drm_addmap_core(struct drm_device * dev, resource_size_t offset,
			  (unsigned long long)map->offset, map->size);
			  (unsigned long long)map->offset, map->size);


		break;
		break;
	}
	case _DRM_GEM:
	case _DRM_GEM:
		DRM_ERROR("tried to rmmap GEM object\n");
		DRM_ERROR("tried to addmap GEM object\n");
		break;
		break;
	}
	case _DRM_SCATTER_GATHER:
	case _DRM_SCATTER_GATHER:
		if (!dev->sg) {
		if (!dev->sg) {
			kfree(map);
			kfree(map);
+38 −8
Original line number Original line Diff line number Diff line
@@ -45,6 +45,23 @@ drm_clflush_page(struct page *page)
		clflush(page_virtual + i);
		clflush(page_virtual + i);
	kunmap_atomic(page_virtual, KM_USER0);
	kunmap_atomic(page_virtual, KM_USER0);
}
}

static void drm_cache_flush_clflush(struct page *pages[],
				    unsigned long num_pages)
{
	unsigned long i;

	mb();
	for (i = 0; i < num_pages; i++)
		drm_clflush_page(*pages++);
	mb();
}

static void
drm_clflush_ipi_handler(void *null)
{
	wbinvd();
}
#endif
#endif


void
void
@@ -53,17 +70,30 @@ drm_clflush_pages(struct page *pages[], unsigned long num_pages)


#if defined(CONFIG_X86)
#if defined(CONFIG_X86)
	if (cpu_has_clflush) {
	if (cpu_has_clflush) {
		drm_cache_flush_clflush(pages, num_pages);
		return;
	}

	if (on_each_cpu(drm_clflush_ipi_handler, NULL, 1) != 0)
		printk(KERN_ERR "Timed out waiting for cache flush.\n");

#elif defined(__powerpc__)
	unsigned long i;
	unsigned long i;
	for (i = 0; i < num_pages; i++) {
		struct page *page = pages[i];
		void *page_virtual;


		mb();
		if (unlikely(page == NULL))
		for (i = 0; i < num_pages; ++i)
			continue;
			drm_clflush_page(*pages++);
		mb();


		return;
		page_virtual = kmap_atomic(page, KM_USER0);
		flush_dcache_range((unsigned long)page_virtual,
				   (unsigned long)page_virtual + PAGE_SIZE);
		kunmap_atomic(page_virtual, KM_USER0);
	}
	}

#else
	wbinvd();
	printk(KERN_ERR "Architecture has no drm_cache.c support\n");
	WARN_ON_ONCE(1);
#endif
#endif
}
}
EXPORT_SYMBOL(drm_clflush_pages);
EXPORT_SYMBOL(drm_clflush_pages);
+60 −17
Original line number Original line Diff line number Diff line
@@ -68,10 +68,10 @@ DRM_ENUM_NAME_FN(drm_get_dpms_name, drm_dpms_enum_list)
 */
 */
static struct drm_prop_enum_list drm_scaling_mode_enum_list[] =
static struct drm_prop_enum_list drm_scaling_mode_enum_list[] =
{
{
	{ DRM_MODE_SCALE_NON_GPU, "Non-GPU" },
	{ DRM_MODE_SCALE_NONE, "None" },
	{ DRM_MODE_SCALE_FULLSCREEN, "Fullscreen" },
	{ DRM_MODE_SCALE_FULLSCREEN, "Full" },
	{ DRM_MODE_SCALE_NO_SCALE, "No scale" },
	{ DRM_MODE_SCALE_CENTER, "Center" },
	{ DRM_MODE_SCALE_ASPECT, "Aspect" },
	{ DRM_MODE_SCALE_ASPECT, "Full aspect" },
};
};


static struct drm_prop_enum_list drm_dithering_mode_enum_list[] =
static struct drm_prop_enum_list drm_dithering_mode_enum_list[] =
@@ -108,6 +108,7 @@ static struct drm_prop_enum_list drm_tv_select_enum_list[] =
	{ DRM_MODE_SUBCONNECTOR_Composite, "Composite" }, /* TV-out */
	{ DRM_MODE_SUBCONNECTOR_Composite, "Composite" }, /* TV-out */
	{ DRM_MODE_SUBCONNECTOR_SVIDEO,    "SVIDEO"    }, /* TV-out */
	{ DRM_MODE_SUBCONNECTOR_SVIDEO,    "SVIDEO"    }, /* TV-out */
	{ DRM_MODE_SUBCONNECTOR_Component, "Component" }, /* TV-out */
	{ DRM_MODE_SUBCONNECTOR_Component, "Component" }, /* TV-out */
	{ DRM_MODE_SUBCONNECTOR_SCART,     "SCART"     }, /* TV-out */
};
};


DRM_ENUM_NAME_FN(drm_get_tv_select_name, drm_tv_select_enum_list)
DRM_ENUM_NAME_FN(drm_get_tv_select_name, drm_tv_select_enum_list)
@@ -118,6 +119,7 @@ static struct drm_prop_enum_list drm_tv_subconnector_enum_list[] =
	{ DRM_MODE_SUBCONNECTOR_Composite, "Composite" }, /* TV-out */
	{ DRM_MODE_SUBCONNECTOR_Composite, "Composite" }, /* TV-out */
	{ DRM_MODE_SUBCONNECTOR_SVIDEO,    "SVIDEO"    }, /* TV-out */
	{ DRM_MODE_SUBCONNECTOR_SVIDEO,    "SVIDEO"    }, /* TV-out */
	{ DRM_MODE_SUBCONNECTOR_Component, "Component" }, /* TV-out */
	{ DRM_MODE_SUBCONNECTOR_Component, "Component" }, /* TV-out */
	{ DRM_MODE_SUBCONNECTOR_SCART,     "SCART"     }, /* TV-out */
};
};


DRM_ENUM_NAME_FN(drm_get_tv_subconnector_name,
DRM_ENUM_NAME_FN(drm_get_tv_subconnector_name,
@@ -146,6 +148,7 @@ static struct drm_conn_prop_enum_list drm_connector_enum_list[] =
	{ DRM_MODE_CONNECTOR_DisplayPort, "DisplayPort", 0 },
	{ DRM_MODE_CONNECTOR_DisplayPort, "DisplayPort", 0 },
	{ DRM_MODE_CONNECTOR_HDMIA, "HDMI Type A", 0 },
	{ DRM_MODE_CONNECTOR_HDMIA, "HDMI Type A", 0 },
	{ DRM_MODE_CONNECTOR_HDMIB, "HDMI Type B", 0 },
	{ DRM_MODE_CONNECTOR_HDMIB, "HDMI Type B", 0 },
	{ DRM_MODE_CONNECTOR_TV, "TV", 0 },
};
};


static struct drm_prop_enum_list drm_encoder_enum_list[] =
static struct drm_prop_enum_list drm_encoder_enum_list[] =
@@ -165,6 +168,7 @@ char *drm_get_encoder_name(struct drm_encoder *encoder)
		 encoder->base.id);
		 encoder->base.id);
	return buf;
	return buf;
}
}
EXPORT_SYMBOL(drm_get_encoder_name);


char *drm_get_connector_name(struct drm_connector *connector)
char *drm_get_connector_name(struct drm_connector *connector)
{
{
@@ -699,6 +703,42 @@ int drm_mode_create_tv_properties(struct drm_device *dev, int num_modes,
		drm_property_add_enum(dev->mode_config.tv_mode_property, i,
		drm_property_add_enum(dev->mode_config.tv_mode_property, i,
				      i, modes[i]);
				      i, modes[i]);


	dev->mode_config.tv_brightness_property =
		drm_property_create(dev, DRM_MODE_PROP_RANGE,
				    "brightness", 2);
	dev->mode_config.tv_brightness_property->values[0] = 0;
	dev->mode_config.tv_brightness_property->values[1] = 100;

	dev->mode_config.tv_contrast_property =
		drm_property_create(dev, DRM_MODE_PROP_RANGE,
				    "contrast", 2);
	dev->mode_config.tv_contrast_property->values[0] = 0;
	dev->mode_config.tv_contrast_property->values[1] = 100;

	dev->mode_config.tv_flicker_reduction_property =
		drm_property_create(dev, DRM_MODE_PROP_RANGE,
				    "flicker reduction", 2);
	dev->mode_config.tv_flicker_reduction_property->values[0] = 0;
	dev->mode_config.tv_flicker_reduction_property->values[1] = 100;

	dev->mode_config.tv_overscan_property =
		drm_property_create(dev, DRM_MODE_PROP_RANGE,
				    "overscan", 2);
	dev->mode_config.tv_overscan_property->values[0] = 0;
	dev->mode_config.tv_overscan_property->values[1] = 100;

	dev->mode_config.tv_saturation_property =
		drm_property_create(dev, DRM_MODE_PROP_RANGE,
				    "saturation", 2);
	dev->mode_config.tv_saturation_property->values[0] = 0;
	dev->mode_config.tv_saturation_property->values[1] = 100;

	dev->mode_config.tv_hue_property =
		drm_property_create(dev, DRM_MODE_PROP_RANGE,
				    "hue", 2);
	dev->mode_config.tv_hue_property->values[0] = 0;
	dev->mode_config.tv_hue_property->values[1] = 100;

	return 0;
	return 0;
}
}
EXPORT_SYMBOL(drm_mode_create_tv_properties);
EXPORT_SYMBOL(drm_mode_create_tv_properties);
@@ -1044,7 +1084,7 @@ int drm_mode_getresources(struct drm_device *dev, void *data,
		if (file_priv->master->minor->type == DRM_MINOR_CONTROL) {
		if (file_priv->master->minor->type == DRM_MINOR_CONTROL) {
			list_for_each_entry(crtc, &dev->mode_config.crtc_list,
			list_for_each_entry(crtc, &dev->mode_config.crtc_list,
					    head) {
					    head) {
				DRM_DEBUG("CRTC ID is %d\n", crtc->base.id);
				DRM_DEBUG_KMS("CRTC ID is %d\n", crtc->base.id);
				if (put_user(crtc->base.id, crtc_id + copied)) {
				if (put_user(crtc->base.id, crtc_id + copied)) {
					ret = -EFAULT;
					ret = -EFAULT;
					goto out;
					goto out;
@@ -1072,7 +1112,7 @@ int drm_mode_getresources(struct drm_device *dev, void *data,
			list_for_each_entry(encoder,
			list_for_each_entry(encoder,
					    &dev->mode_config.encoder_list,
					    &dev->mode_config.encoder_list,
					    head) {
					    head) {
				DRM_DEBUG("ENCODER ID is %d\n",
				DRM_DEBUG_KMS("ENCODER ID is %d\n",
					  encoder->base.id);
					  encoder->base.id);
				if (put_user(encoder->base.id, encoder_id +
				if (put_user(encoder->base.id, encoder_id +
					     copied)) {
					     copied)) {
@@ -1103,7 +1143,7 @@ int drm_mode_getresources(struct drm_device *dev, void *data,
			list_for_each_entry(connector,
			list_for_each_entry(connector,
					    &dev->mode_config.connector_list,
					    &dev->mode_config.connector_list,
					    head) {
					    head) {
				DRM_DEBUG("CONNECTOR ID is %d\n",
				DRM_DEBUG_KMS("CONNECTOR ID is %d\n",
					  connector->base.id);
					  connector->base.id);
				if (put_user(connector->base.id,
				if (put_user(connector->base.id,
					     connector_id + copied)) {
					     connector_id + copied)) {
@@ -1127,7 +1167,7 @@ int drm_mode_getresources(struct drm_device *dev, void *data,
	}
	}
	card_res->count_connectors = connector_count;
	card_res->count_connectors = connector_count;


	DRM_DEBUG("Counted %d %d %d\n", card_res->count_crtcs,
	DRM_DEBUG_KMS("Counted %d %d %d\n", card_res->count_crtcs,
		  card_res->count_connectors, card_res->count_encoders);
		  card_res->count_connectors, card_res->count_encoders);


out:
out:
@@ -1230,7 +1270,7 @@ int drm_mode_getconnector(struct drm_device *dev, void *data,


	memset(&u_mode, 0, sizeof(struct drm_mode_modeinfo));
	memset(&u_mode, 0, sizeof(struct drm_mode_modeinfo));


	DRM_DEBUG("connector id %d:\n", out_resp->connector_id);
	DRM_DEBUG_KMS("connector id %d:\n", out_resp->connector_id);


	mutex_lock(&dev->mode_config.mutex);
	mutex_lock(&dev->mode_config.mutex);


@@ -1406,7 +1446,7 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data,
	obj = drm_mode_object_find(dev, crtc_req->crtc_id,
	obj = drm_mode_object_find(dev, crtc_req->crtc_id,
				   DRM_MODE_OBJECT_CRTC);
				   DRM_MODE_OBJECT_CRTC);
	if (!obj) {
	if (!obj) {
		DRM_DEBUG("Unknown CRTC ID %d\n", crtc_req->crtc_id);
		DRM_DEBUG_KMS("Unknown CRTC ID %d\n", crtc_req->crtc_id);
		ret = -EINVAL;
		ret = -EINVAL;
		goto out;
		goto out;
	}
	}
@@ -1419,7 +1459,8 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data,
			list_for_each_entry(crtcfb,
			list_for_each_entry(crtcfb,
					    &dev->mode_config.crtc_list, head) {
					    &dev->mode_config.crtc_list, head) {
				if (crtcfb == crtc) {
				if (crtcfb == crtc) {
					DRM_DEBUG("Using current fb for setmode\n");
					DRM_DEBUG_KMS("Using current fb for "
							"setmode\n");
					fb = crtc->fb;
					fb = crtc->fb;
				}
				}
			}
			}
@@ -1427,7 +1468,8 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data,
			obj = drm_mode_object_find(dev, crtc_req->fb_id,
			obj = drm_mode_object_find(dev, crtc_req->fb_id,
						   DRM_MODE_OBJECT_FB);
						   DRM_MODE_OBJECT_FB);
			if (!obj) {
			if (!obj) {
				DRM_DEBUG("Unknown FB ID%d\n", crtc_req->fb_id);
				DRM_DEBUG_KMS("Unknown FB ID%d\n",
						crtc_req->fb_id);
				ret = -EINVAL;
				ret = -EINVAL;
				goto out;
				goto out;
			}
			}
@@ -1440,13 +1482,13 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data,
	}
	}


	if (crtc_req->count_connectors == 0 && mode) {
	if (crtc_req->count_connectors == 0 && mode) {
		DRM_DEBUG("Count connectors is 0 but mode set\n");
		DRM_DEBUG_KMS("Count connectors is 0 but mode set\n");
		ret = -EINVAL;
		ret = -EINVAL;
		goto out;
		goto out;
	}
	}


	if (crtc_req->count_connectors > 0 && (!mode || !fb)) {
	if (crtc_req->count_connectors > 0 && (!mode || !fb)) {
		DRM_DEBUG("Count connectors is %d but no mode or fb set\n",
		DRM_DEBUG_KMS("Count connectors is %d but no mode or fb set\n",
			  crtc_req->count_connectors);
			  crtc_req->count_connectors);
		ret = -EINVAL;
		ret = -EINVAL;
		goto out;
		goto out;
@@ -1479,7 +1521,8 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data,
			obj = drm_mode_object_find(dev, out_id,
			obj = drm_mode_object_find(dev, out_id,
						   DRM_MODE_OBJECT_CONNECTOR);
						   DRM_MODE_OBJECT_CONNECTOR);
			if (!obj) {
			if (!obj) {
				DRM_DEBUG("Connector id %d unknown\n", out_id);
				DRM_DEBUG_KMS("Connector id %d unknown\n",
						out_id);
				ret = -EINVAL;
				ret = -EINVAL;
				goto out;
				goto out;
			}
			}
@@ -1512,7 +1555,7 @@ int drm_mode_cursor_ioctl(struct drm_device *dev,
	struct drm_crtc *crtc;
	struct drm_crtc *crtc;
	int ret = 0;
	int ret = 0;


	DRM_DEBUG("\n");
	DRM_DEBUG_KMS("\n");


	if (!req->flags) {
	if (!req->flags) {
		DRM_ERROR("no operation set\n");
		DRM_ERROR("no operation set\n");
@@ -1522,7 +1565,7 @@ int drm_mode_cursor_ioctl(struct drm_device *dev,
	mutex_lock(&dev->mode_config.mutex);
	mutex_lock(&dev->mode_config.mutex);
	obj = drm_mode_object_find(dev, req->crtc_id, DRM_MODE_OBJECT_CRTC);
	obj = drm_mode_object_find(dev, req->crtc_id, DRM_MODE_OBJECT_CRTC);
	if (!obj) {
	if (!obj) {
		DRM_DEBUG("Unknown CRTC ID %d\n", req->crtc_id);
		DRM_DEBUG_KMS("Unknown CRTC ID %d\n", req->crtc_id);
		ret = -EINVAL;
		ret = -EINVAL;
		goto out;
		goto out;
	}
	}
Loading