rpms/kernel/devel drm-modesetting-i915.patch, NONE, 1.1 config-generic, 1.165, 1.166 drm-modesetting-radeon.patch, 1.23, 1.24 kernel.spec, 1.939, 1.940

Dave Airlie airlied at fedoraproject.org
Tue Sep 9 06:16:50 UTC 2008


Author: airlied

Update of /cvs/pkgs/rpms/kernel/devel
In directory cvs1.fedora.phx.redhat.com:/tmp/cvs-serv6028

Modified Files:
	config-generic drm-modesetting-radeon.patch kernel.spec 
Added Files:
	drm-modesetting-i915.patch 
Log Message:
* Tue Sep 09 2008 Dave Airlie <airlied at redhat.com>
- radeon - update modesetting bits - should fix r400
- add i915 modesetting bits - don't enable these by default yet


drm-modesetting-i915.patch:

--- NEW FILE drm-modesetting-i915.patch ---
diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig
index 649757f..a1ed52b 100644
--- a/drivers/gpu/drm/Kconfig
+++ b/drivers/gpu/drm/Kconfig
@@ -84,6 +84,15 @@ config DRM_I915
 
 endchoice
 
+config DRM_I915_KMS
+	bool "Enable modesetting on intel by default"
+	depends on DRM_I915
+	help
+	Choose this option if you want kernel modesetting enabled by default,
+	and you have a new enough userspace to support this. Running old
+	userspaces with this enabled will cause pain.
+
+
 config DRM_MGA
 	tristate "Matrox g200/g400"
 	depends on DRM
diff --git a/drivers/gpu/drm/drm_mm.c b/drivers/gpu/drm/drm_mm.c
index 217ad7d..367c590 100644
--- a/drivers/gpu/drm/drm_mm.c
+++ b/drivers/gpu/drm/drm_mm.c
@@ -296,3 +296,4 @@ void drm_mm_takedown(struct drm_mm * mm)
 
 	drm_free(entry, sizeof(*entry), DRM_MEM_MM);
 }
+EXPORT_SYMBOL(drm_mm_takedown);
diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile
index 362d419..57aa9da 100644
--- a/drivers/gpu/drm/i915/Makefile
+++ b/drivers/gpu/drm/i915/Makefile
@@ -4,10 +4,15 @@
 
 ccflags-y := -Iinclude/drm
 i915-y := i915_drv.o i915_dma.o i915_irq.o i915_mem.o i915_init.o i915_opregion.o \
+	i915_suspend.o \
 	i915_gem.o \
 	i915_gem_debug.o \
 	i915_gem_proc.o \
-	i915_gem_tiling.o
+	i915_gem_tiling.o \
+	intel_display.o intel_crt.o intel_lvds.o intel_bios.o \
+	intel_sdvo.o intel_modes.o intel_i2c.o i915_init.o intel_fb.o \
+	intel_tv.o intel_dvo.o dvo_ch7xxx.o \
+	dvo_ch7017.o dvo_ivch.o dvo_tfp410.o dvo_sil164.o
 
 i915-$(CONFIG_COMPAT)   += i915_ioc32.o
 
diff --git a/drivers/gpu/drm/i915/dvo.h b/drivers/gpu/drm/i915/dvo.h
new file mode 100644
index 0000000..b122ea1
--- /dev/null
+++ b/drivers/gpu/drm/i915/dvo.h
@@ -0,0 +1,159 @@
+/*
+ * Copyright © 2006 Eric Anholt
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that copyright
+ * notice and this permission notice appear in supporting documentation, and
+ * that the name of the copyright holders not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  The copyright holders make no representations
+ * about the suitability of this software for any purpose.  It is provided "as
+ * is" without express or implied warranty.
+ *
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#ifndef _INTEL_DVO_H 
+#define _INTEL_DVO_H 
+
+#include <linux/i2c.h>
+#include "drmP.h"
+#include "drm.h"
+#include "drm_crtc.h"
+#include "intel_drv.h"
+
+struct intel_dvo_device {
+	char *name;
+	int type;
+	/* DVOA/B/C output register */
+	u32 dvo_reg;
+	/* GPIO register used for i2c bus to control this device */
+	u32 gpio;
+	int slave_addr;
+	struct intel_i2c_chan *i2c_bus;
+
+	const struct intel_dvo_dev_ops *dev_ops;
+	void *dev_priv;
+
+	struct drm_display_mode *panel_fixed_mode;
+	bool panel_wants_dither;
+};
+
+struct intel_dvo_dev_ops {
+	/*
+	 * Initialize the device at startup time.
+	 * Returns NULL if the device does not exist.
+	 */
+	bool (*init)(struct intel_dvo_device *dvo,
+		     struct intel_i2c_chan *i2cbus);
+
+	/*
+	 * Called to allow the output a chance to create properties after the
+	 * RandR objects have been created.
+	 */
+	void (*create_resources)(struct intel_dvo_device *dvo);
+
+	/*
+	 * Turn on/off output or set intermediate power levels if available.
+	 *
+	 * Unsupported intermediate modes drop to the lower power setting.
+	 * If the  mode is DPMSModeOff, the output must be disabled,
+	 * as the DPLL may be disabled afterwards.
+	 */
+	void (*dpms)(struct intel_dvo_device *dvo, int mode);
+
+	/*
+	 * Saves the output's state for restoration on VT switch.
+	 */
+	void (*save)(struct intel_dvo_device *dvo);
+
+	/*
+	 * Restore's the output's state at VT switch.
+	 */
+	void (*restore)(struct intel_dvo_device *dvo);
+
+	/*
+	 * Callback for testing a video mode for a given output.
+	 *
+	 * This function should only check for cases where a mode can't
+	 * be supported on the output specifically, and not represent
+	 * generic CRTC limitations.
+	 *
+	 * \return MODE_OK if the mode is valid, or another MODE_* otherwise.
+	 */
+	int (*mode_valid)(struct intel_dvo_device *dvo,
+			  struct drm_display_mode *mode);
+
+	/*
+	 * Callback to adjust the mode to be set in the CRTC.
+	 *
+	 * This allows an output to adjust the clock or even the entire set of
+	 * timings, which is used for panels with fixed timings or for
+	 * buses with clock limitations.
+	 */
+	bool (*mode_fixup)(struct intel_dvo_device *dvo,
+			   struct drm_display_mode *mode,
+			   struct drm_display_mode *adjusted_mode);
+
+	/*
+	 * Callback for preparing mode changes on an output
+	 */
+	void (*prepare)(struct intel_dvo_device *dvo);
+
+	/*
+	 * Callback for committing mode changes on an output
+	 */
+	void (*commit)(struct intel_dvo_device *dvo);
+
+	/*
+	 * Callback for setting up a video mode after fixups have been made.
+	 *
+	 * This is only called while the output is disabled.  The dpms callback
+	 * must be all that's necessary for the output, to turn the output on
+	 * after this function is called.
+	 */
+	void (*mode_set)(struct intel_dvo_device *dvo,
+			 struct drm_display_mode *mode,
+			 struct drm_display_mode *adjusted_mode);
+
+	/*
+	 * Probe for a connected output, and return detect_status.
+	 */
+	enum drm_connector_status (*detect)(struct intel_dvo_device *dvo);
+
+	/**
+	 * Query the device for the modes it provides.
+	 *
+	 * This function may also update MonInfo, mm_width, and mm_height.
+	 *
+	 * \return singly-linked list of modes or NULL if no modes found.
+	 */
+	struct drm_display_mode *(*get_modes)(struct intel_dvo_device *dvo);
+
+#ifdef RANDR_12_INTERFACE
+	/**
+	 * Callback when an output's property has changed.
+	 */
[...12227 lines suppressed...]
@@ -406,6 +408,23 @@ struct drm_i915_gem_mmap {
 	uint64_t addr_ptr;
 };
 
+struct drm_i915_gem_mmap_gtt {
+	/** Handle for the object being mapped. */
+	uint32_t handle;
+	uint32_t pad;
+	/** Offset in the object to map. */
+	uint64_t offset;
+	/**
+	 * Length of data to map.
+	 *
+	 * The value will be page-aligned.
+	 */
+	uint64_t size;
+	/** Returned pointer the data was mapped at */
+	uint64_t addr_ptr;	/* void *, but pointers are not 32/64 compatible */
+	uint32_t flags;
+};
+
 struct drm_i915_gem_set_domain {
 	/** Handle for the object */
 	uint32_t handle;
diff --git a/mm/mmap.c b/mm/mmap.c
index 339cf5c..62f54fe 100644
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -1244,6 +1244,171 @@ unacct_error:
 	return error;
 }
 
+/**
+ * mmap_io_region - map an I/O region, creating a new VMA if necessary
+ * @file: file to account mapping against
+ * @addr: user address to map
+ * @len: size of mapping
+ * @flags: mmap flags
+ * @vm_flags: VM protection bits
+ * @pgoff: pfn of backing pages
+ * @accountable: account for these pages?
+ *
+ * Normally drivers can simply override ->mmap and use remap_pfn_range
+ * themselves, but if remapping needs to be done in other functions (say ioctl)
+ * some function has to provide VMA allocation & linking services, thus
+ * this function.
+ */
+unsigned long mmap_io_region(struct file *file, unsigned long addr,
+			     unsigned long len, unsigned long flags,
+			     unsigned int vm_flags, unsigned long pgoff,
+			     int accountable)
+{
+	struct mm_struct *mm = current->mm;
+	struct vm_area_struct *vma, *prev;
+	int correct_wcount = 0;
+	int error;
+	struct rb_node **rb_link, *rb_parent;
+	unsigned long charged = 0;
+	struct inode *inode =  file ? file->f_path.dentry->d_inode : NULL;
+
+	/* Clear old maps */
+	error = -ENOMEM;
+munmap_back:
+	vma = find_vma_prepare(mm, addr, &prev, &rb_link, &rb_parent);
+	if (vma && vma->vm_start < addr + len) {
+		if (do_munmap(mm, addr, len))
+			return -ENOMEM;
+		goto munmap_back;
+	}
+
+	/* Check against address space limit. */
+	if (!may_expand_vm(mm, len >> PAGE_SHIFT))
+		return -ENOMEM;
+
+	if (flags & MAP_NORESERVE)
+		vm_flags |= VM_NORESERVE;
+
+	if (accountable && (!(flags & MAP_NORESERVE) ||
+			    sysctl_overcommit_memory == OVERCOMMIT_NEVER)) {
+		if (vm_flags & VM_SHARED) {
+			/* Check memory availability in shmem_file_setup? */
+			vm_flags |= VM_ACCOUNT;
+		} else if (vm_flags & VM_WRITE) {
+			/*
+			 * Private writable mapping: check memory availability
+			 */
+			charged = len >> PAGE_SHIFT;
+			if (security_vm_enough_memory(charged))
+				return -ENOMEM;
+			vm_flags |= VM_ACCOUNT;
+		}
+	}
+
+	printk(KERN_ERR "%s: using vma %p\n", __FUNCTION__, vma);
+
+	/*
+	 * Determine the object being mapped and call the appropriate
+	 * specific mapper. the address has already been validated, but
+	 * not unmapped, but the maps are removed from the list.
+	 */
+	vma = kmem_cache_zalloc(vm_area_cachep, GFP_KERNEL);
+	if (!vma) {
+		error = -ENOMEM;
+		goto unacct_error;
+	}
+
+	vma->vm_mm = mm;
+	vma->vm_start = addr;
+	vma->vm_end = addr + len;
+	vma->vm_flags = vm_flags;
+	vma->vm_page_prot = vm_get_page_prot(vm_flags);
+	vma->vm_pgoff = pgoff;
+
+	error = -EINVAL;
+	if (vm_flags & (VM_GROWSDOWN|VM_GROWSUP))
+		goto free_vma;
+	if (vm_flags & VM_DENYWRITE) {
+		error = deny_write_access(file);
+		if (error)
+			goto free_vma;
+		correct_wcount = 1;
+	}
+
+	get_file(file);
+	printk(KERN_ERR "remap_pfn_range(%p, 0x%lx, 0x%lx, 0x%lx, 0x%lx)\n",
+	       vma, vma->vm_start, vma->vm_pgoff, len, vma->vm_page_prot);
+	error = remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff, len,
+				vma->vm_page_prot);
+	if (error)
+		goto unmap_and_free_vma;
+	if (vm_flags & VM_EXECUTABLE)
+		added_exe_file_vma(mm);
+
+	/* We set VM_ACCOUNT in a shared mapping's vm_flags, to inform
+	 * shmem_zero_setup (perhaps called through /dev/zero's ->mmap)
+	 * that memory reservation must be checked; but that reservation
+	 * belongs to shared memory object, not to vma: so now clear it.
+	 */
+	if ((vm_flags & (VM_SHARED|VM_ACCOUNT)) == (VM_SHARED|VM_ACCOUNT))
+		vma->vm_flags &= ~VM_ACCOUNT;
+
+	/* Can addr have changed??
+	 *
+	 * Answer: Yes, several device drivers can do it in their
+	 *         f_op->mmap method. -DaveM
+	 */
+	addr = vma->vm_start;
+	pgoff = vma->vm_pgoff;
+	vm_flags = vma->vm_flags;
+
+	if (vma_wants_writenotify(vma))
+		vma->vm_page_prot = vm_get_page_prot(vm_flags & ~VM_SHARED);
+
+	if (file && vma_merge(mm, prev, addr, vma->vm_end,
+			vma->vm_flags, NULL, file, pgoff, vma_policy(vma))) {
+		mpol_put(vma_policy(vma));
+		kmem_cache_free(vm_area_cachep, vma);
+		fput(file);
+		if (vm_flags & VM_EXECUTABLE)
+			removed_exe_file_vma(mm);
+	} else {
+		vma_link(mm, vma, prev, rb_link, rb_parent);
+		file = vma->vm_file;
+	}
+
+	/* Once vma denies write, undo our temporary denial count */
+	if (correct_wcount)
+		atomic_inc(&inode->i_writecount);
+
+	mm->total_vm += len >> PAGE_SHIFT;
+	vm_stat_account(mm, vm_flags, file, len >> PAGE_SHIFT);
+	if (vm_flags & VM_LOCKED) {
+		mm->locked_vm += len >> PAGE_SHIFT;
+		make_pages_present(addr, addr + len);
+	}
+	if ((flags & MAP_POPULATE) && !(flags & MAP_NONBLOCK))
+		make_pages_present(addr, addr + len);
+	return addr;
+
+unmap_and_free_vma:
+	if (correct_wcount)
+		atomic_inc(&inode->i_writecount);
+	vma->vm_file = NULL;
+	fput(file);
+
+	/* Undo any partial mapping done by a device driver. */
+	unmap_region(mm, vma, prev, vma->vm_start, vma->vm_end);
+	charged = 0;
+free_vma:
+	kmem_cache_free(vm_area_cachep, vma);
+unacct_error:
+	if (charged)
+		vm_unacct_memory(charged);
+	return error;
+}
+EXPORT_SYMBOL(mmap_io_region);
+
 /* Get an address range which is currently unmapped.
  * For shmat() with addr=0.
  *


Index: config-generic
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/devel/config-generic,v
retrieving revision 1.165
retrieving revision 1.166
diff -u -r1.165 -r1.166
--- config-generic	5 Sep 2008 04:25:29 -0000	1.165
+++ config-generic	9 Sep 2008 06:16:19 -0000	1.166
@@ -2103,6 +2103,7 @@
 CONFIG_DRM_SIS=m
 CONFIG_DRM_SAVAGE=m
 CONFIG_DRM_I915=m
+CONFIG_DRM_I915_KMS=n
 CONFIG_DRM_VIA=m
 CONFIG_DRM_NOUVEAU=m
 

drm-modesetting-radeon.patch:

Index: drm-modesetting-radeon.patch
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/devel/drm-modesetting-radeon.patch,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -r1.23 -r1.24
--- drm-modesetting-radeon.patch	8 Sep 2008 00:35:14 -0000	1.23
+++ drm-modesetting-radeon.patch	9 Sep 2008 06:16:19 -0000	1.24
@@ -1,3 +1,21 @@
+commit dc35ec837f7a0ff258e6fde4326ccae7fd77650b
+Author: Dave Airlie <airlied at redhat.com>
+Date:   Tue Sep 9 15:55:38 2008 +1000
+
+    radeon: sort out atom vs combios tables for r400 cards
+
+commit 3f4de41530215c5fe6a15b75defa1164615f4878
+Author: Dave Airlie <airlied at redhat.com>
+Date:   Mon Sep 8 11:37:26 2008 +1000
+
+    radeon: remove unneeded debugging
+
+commit 2a5b61e6726691102e075e07e6d9f8b1817b73d4
+Author: Dave Airlie <airlied at redhat.com>
+Date:   Mon Sep 8 11:25:12 2008 +1000
+
+    radeon: don't do full edid for detection purposes
+
 commit 563e90db2ca306fe0dee104703a48b5bc5d7fd93
 Author: Dave Airlie <airlied at redhat.com>
 Date:   Mon Sep 8 10:27:48 2008 +1000
@@ -27952,10 +27970,10 @@
  
 diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c
 new file mode 100644
-index 0000000..10e3a77
+index 0000000..4d98cba
 --- /dev/null
 +++ b/drivers/gpu/drm/radeon/radeon_atombios.c
-@@ -0,0 +1,417 @@
+@@ -0,0 +1,453 @@
 +/*
 + * Copyright 2007-8 Advanced Micro Devices, Inc.
 + * Copyright 2008 Red Hat Inc.
@@ -28263,12 +28281,48 @@
 +	return true;
 +}
 +
++
++void radeon_atombios_get_tmds_info(struct radeon_encoder *encoder)
++{
++	struct drm_device *dev = encoder->base.dev;
++	struct drm_radeon_private *dev_priv = dev->dev_private;
++	struct radeon_mode_info *mode_info = &dev_priv->mode_info;
++	int index = GetIndexIntoMasterTable(DATA, TMDS_Info);
++	uint16_t data_offset;
++	struct _ATOM_TMDS_INFO *tmds_info;
++	uint8_t frev, crev;
++	uint16_t maxfreq;
++	int i;
++
++	atom_parse_data_header(mode_info->atom_context, index, NULL, &frev, &crev, &data_offset);
++
++	tmds_info = (struct _ATOM_TMDS_INFO *)(mode_info->atom_context->bios + data_offset);
++
++	maxfreq = le16_to_cpu(tmds_info->usMaxFrequency);
++	for (i = 0; i < 4; i++) {
++		encoder->tmds_pll[i].freq = le16_to_cpu(tmds_info->asMiscInfo[i].usFrequency);
++		encoder->tmds_pll[i].value = tmds_info->asMiscInfo[i].ucPLL_ChargePump & 0x3f;
++		encoder->tmds_pll[i].value |= (tmds_info->asMiscInfo[i].ucPLL_VCO_Gain & 0x3f << 6);
++		encoder->tmds_pll[i].value |= (tmds_info->asMiscInfo[i].ucPLL_DutyCycle & 0xf << 12);
++		encoder->tmds_pll[i].value |= (tmds_info->asMiscInfo[i].ucPLL_VoltageSwing & 0xf << 16);
++
++		DRM_DEBUG("TMDS PLL From BIOS %u %x\n",
++			  encoder->tmds_pll[i].freq,
++			   encoder->tmds_pll[i].value);
++
++		if (maxfreq == encoder->tmds_pll[i].freq) {
++			encoder->tmds_pll[i].freq = 0xffffffff;
++			break;
++		}
++	}
++}
++
 +union lvds_info {
 +	struct _ATOM_LVDS_INFO info;
 +	struct _ATOM_LVDS_INFO_V12 info_12;
 +};
 +
-+void radeon_get_lvds_info(struct radeon_encoder *encoder)
++void radeon_atombios_get_lvds_info(struct radeon_encoder *encoder)
 +{
 +	struct drm_device *dev = encoder->base.dev;
 +	struct drm_radeon_private *dev_priv = dev->dev_private;
@@ -28821,10 +28875,10 @@
 +}
 diff --git a/drivers/gpu/drm/radeon/radeon_combios.c b/drivers/gpu/drm/radeon/radeon_combios.c
 new file mode 100644
-index 0000000..200761e
+index 0000000..bca9e13
 --- /dev/null
 +++ b/drivers/gpu/drm/radeon/radeon_combios.c
-@@ -0,0 +1,1344 @@
+@@ -0,0 +1,1359 @@
 +/*
 + * Copyright 2004 ATI Technologies Inc., Markham, Ontario
 + * Copyright 2007-8 Advanced Micro Devices, Inc.
@@ -28882,7 +28936,7 @@
 +	COMBIOS_CONNECTOR_INFO_TABLE,
 +	COMBIOS_DYN_CLK_1_TABLE,
 +	COMBIOS_RESERVED_MEM_TABLE,
-+	COMBIOS_EXT_TDMS_INFO_TABLE,
++	COMBIOS_EXT_TMDS_INFO_TABLE,
 +	COMBIOS_MEM_CLK_INFO_TABLE,
 +	COMBIOS_EXT_DAC_INFO_TABLE,
 +	COMBIOS_MISC_INFO_TABLE,
@@ -29044,7 +29098,7 @@
 +		if (check_offset)
 +			offset = check_offset;
 +		break;
-+	case COMBIOS_EXT_TDMS_INFO_TABLE:
++	case COMBIOS_EXT_TMDS_INFO_TABLE:
 +		check_offset = radeon_bios16(dev_priv, dev_priv->bios_header_start + 0x58);
 +		if (check_offset)
 +			offset = check_offset;
@@ -29594,6 +29648,21 @@
 +	return false;
 +}
 +
++bool radeon_combios_get_ext_tmds_info(struct radeon_encoder *encoder)
++{
++	struct drm_device *dev = encoder->base.dev;
++	struct drm_radeon_private *dev_priv = dev->dev_private;
++	uint16_t ext_tmds_info;
++	uint8_t ver;
++
++	ext_tmds_info = combios_get_table_offset(dev, COMBIOS_EXT_TMDS_INFO_TABLE);
++	if (ext_tmds_info) {
++		ver = radeon_bios8(dev_priv, ext_tmds_info);
++		DRM_INFO("External TMDS Table revision: %d\n", ver);
++		// TODO
++	}
++}
++
 +static void radeon_apply_legacy_quirks(struct drm_device *dev, int bios_index)
 +{
 +	struct drm_radeon_private *dev_priv = dev->dev_private;
@@ -30171,10 +30240,10 @@
 +}
 diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c
 new file mode 100644
-index 0000000..5ce66d7
+index 0000000..f217fe7
 --- /dev/null
 +++ b/drivers/gpu/drm/radeon/radeon_connectors.c
-@@ -0,0 +1,377 @@
+@@ -0,0 +1,367 @@
 +/*
 + * Copyright 2007-8 Advanced Micro Devices, Inc.
 + * Copyright 2008 Red Hat Inc.
@@ -30340,18 +30409,16 @@
 +
 +static enum drm_connector_status radeon_vga_detect(struct drm_connector *connector)
 +{
-+	struct edid *edid;
 +	struct radeon_connector *radeon_connector = to_radeon_connector(connector);
 +	struct drm_encoder *encoder;
 +	struct drm_encoder_helper_funcs *encoder_funcs;
++	bool ret;
 +
 +	radeon_i2c_do_lock(radeon_connector, 1);
-+	edid = drm_get_edid(&radeon_connector->base, &radeon_connector->ddc_bus->adapter);
++	ret = radeon_ddc_probe(radeon_connector);
 +	radeon_i2c_do_lock(radeon_connector, 0);
-+	if (edid) {
-+		kfree(edid);
++	if (ret)
 +		return connector_status_connected;
-+	}
 +
 +	/* if EDID fails to a load detect */
 +	encoder = radeon_best_single_encoder(connector);
@@ -30377,27 +30444,19 @@
 +
 +static enum drm_connector_status radeon_dvi_detect(struct drm_connector *connector)
 +{
-+	struct edid *edid;
 +	struct radeon_connector *radeon_connector = to_radeon_connector(connector);
 +	struct drm_encoder *encoder;
 +	struct drm_encoder_helper_funcs *encoder_funcs;
 +	struct drm_mode_object *obj;
 +	int i;
 +	enum drm_connector_status ret;
++	bool dret;
 +
 +	radeon_i2c_do_lock(radeon_connector, 1);
-+	edid = drm_get_edid(&radeon_connector->base, &radeon_connector->ddc_bus->adapter);
++	dret = radeon_ddc_probe(radeon_connector);
 +	radeon_i2c_do_lock(radeon_connector, 0);
-+	if (edid) {
-+		/* if the monitor is digital - set the bits */
-+		if (edid->digital)
-+			radeon_connector->use_digital = 1;
-+		else
-+			radeon_connector->use_digital = 0;
-+
-+		kfree(edid);
++	if (dret)
 +		return connector_status_connected;
-+	}
 +
 +	for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
 +		if (connector->encoder_ids[i] == 0)
@@ -30553,7 +30612,7 @@
 +	return NULL;
 +}
 diff --git a/drivers/gpu/drm/radeon/radeon_cp.c b/drivers/gpu/drm/radeon/radeon_cp.c
-index 248ab4a..8994326 100644
+index 248ab4a..cc96220 100644
 --- a/drivers/gpu/drm/radeon/radeon_cp.c
 +++ b/drivers/gpu/drm/radeon/radeon_cp.c
 @@ -31,6 +31,7 @@
@@ -31303,7 +31362,7 @@
  	LOCK_TEST_WITH_RETURN(dev, file_priv);
  
  	return radeon_do_engine_reset(dev);
-@@ -1688,6 +1866,602 @@ int radeon_cp_buffers(struct drm_device *dev, void *data, struct drm_file *file_
+@@ -1688,6 +1866,600 @@ int radeon_cp_buffers(struct drm_device *dev, void *data, struct drm_file *file_
  	return ret;
  }
  
@@ -31773,11 +31832,9 @@
 +	}
 +	radeon_gart_flush(dev);
 +
-+	DRM_ERROR("microcode loading\n");
 +	radeon_cp_load_microcode(dev_priv);
 +	radeon_cp_init_ring_buffer(dev, dev_priv);
 +
-+	DRM_ERROR("engine init\n");
 +	radeon_do_engine_reset(dev);
 +
 +	radeon_do_cp_start(dev_priv);
@@ -31906,7 +31963,7 @@
  int radeon_driver_load(struct drm_device *dev, unsigned long flags)
  {
  	drm_radeon_private_t *dev_priv;
-@@ -1701,6 +2475,8 @@ int radeon_driver_load(struct drm_device *dev, unsigned long flags)
+@@ -1701,6 +2473,8 @@ int radeon_driver_load(struct drm_device *dev, unsigned long flags)
  	dev->dev_private = (void *)dev_priv;
  	dev_priv->flags = flags;
  
@@ -31915,7 +31972,7 @@
  	switch (flags & RADEON_FAMILY_MASK) {
  	case CHIP_R100:
  	case CHIP_RV200:
-@@ -1720,18 +2496,119 @@ int radeon_driver_load(struct drm_device *dev, unsigned long flags)
+@@ -1720,18 +2494,119 @@ int radeon_driver_load(struct drm_device *dev, unsigned long flags)
  		break;
  	}
  
@@ -32036,7 +32093,7 @@
  /* Create mappings for registers and framebuffer so userland doesn't necessarily
   * have to find them.
   */
-@@ -1743,19 +2620,6 @@ int radeon_driver_firstopen(struct drm_device *dev)
+@@ -1743,19 +2618,6 @@ int radeon_driver_firstopen(struct drm_device *dev)
  
  	dev_priv->gart_info.table_size = RADEON_PCIGART_TABLE_SIZE;
  
@@ -32056,7 +32113,7 @@
  	return 0;
  }
  
-@@ -1763,9 +2627,40 @@ int radeon_driver_unload(struct drm_device *dev)
+@@ -1763,9 +2625,40 @@ int radeon_driver_unload(struct drm_device *dev)
  {
  	drm_radeon_private_t *dev_priv = dev->dev_private;
  
@@ -32765,10 +32822,10 @@
 +
 diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c
 new file mode 100644
-index 0000000..2e516a1
+index 0000000..a2cb66a
 --- /dev/null
 +++ b/drivers/gpu/drm/radeon/radeon_display.c
-@@ -0,0 +1,645 @@
+@@ -0,0 +1,651 @@
 +/*
 + * Copyright 2007-8 Advanced Micro Devices, Inc.
 + * Copyright 2008 Red Hat Inc.
@@ -32802,6 +32859,7 @@
 +#include <asm/div64.h>
 +
 +#include "drm_crtc_helper.h"
++#include "drm_edid.h"
 +
 +int radeon_ddc_dump(struct drm_connector *connector);
 +
@@ -33076,6 +33134,11 @@
 +	edid = drm_get_edid(&radeon_connector->base, &radeon_connector->ddc_bus->adapter);
 +	radeon_i2c_do_lock(radeon_connector, 0);
 +	if (edid) {
++		/* update digital bits here */
++		if (edid->digital)
++			radeon_connector->use_digital = 1;
++		else
++			radeon_connector->use_digital = 0;
 +		drm_mode_connector_update_edid_property(&radeon_connector->base, edid);
 +		ret = drm_add_edid_modes(&radeon_connector->base, edid);
 +		kfree(edid);
@@ -34243,7 +34306,7 @@
  #endif				/* __RADEON_DRV_H__ */
 diff --git a/drivers/gpu/drm/radeon/radeon_encoders.c b/drivers/gpu/drm/radeon/radeon_encoders.c
 new file mode 100644
-index 0000000..e3a58c8
+index 0000000..e791ab7
 --- /dev/null
 +++ b/drivers/gpu/drm/radeon/radeon_encoders.c
 @@ -0,0 +1,1081 @@
@@ -34636,7 +34699,7 @@
 +
 +	/* TODO get the LVDS info from the BIOS for panel size etc. */
 +	/* get the lvds info from the bios */
-+	radeon_get_lvds_info(radeon_encoder);
++	radeon_atombios_get_lvds_info(radeon_encoder);
 +
 +	/* LVDS gets default RMX full scaling */
 +	radeon_encoder->rmx_type = RMX_FULL;
@@ -36364,10 +36427,10 @@
 +
 diff --git a/drivers/gpu/drm/radeon/radeon_gem.c b/drivers/gpu/drm/radeon/radeon_gem.c
 new file mode 100644
-index 0000000..12a0358
+index 0000000..382d348
 --- /dev/null
 +++ b/drivers/gpu/drm/radeon/radeon_gem.c
-@@ -0,0 +1,1382 @@
+@@ -0,0 +1,1381 @@
 +/*
 + * Copyright 2008 Red Hat Inc.
 + *
@@ -36982,7 +37045,6 @@
 +		if (!dev_priv->mm.pcie_table_backup)
 +			return -EINVAL;
 +
-+		DRM_ERROR("pcie table bo created %p, %x\n", dev_priv->mm.pcie_table.bo, dev_priv->mm.pcie_table.bo->offset);
 +		ret = drm_bo_kmap(dev_priv->mm.pcie_table.bo, 0, RADEON_PCIGART_TABLE_SIZE >> PAGE_SHIFT,
 +				  &dev_priv->mm.pcie_table.kmap);
 +		if (ret)
@@ -37752,10 +37814,10 @@
 +
 diff --git a/drivers/gpu/drm/radeon/radeon_i2c.c b/drivers/gpu/drm/radeon/radeon_i2c.c
 new file mode 100644
-index 0000000..00fc7c0
+index 0000000..94a485b
 --- /dev/null
 +++ b/drivers/gpu/drm/radeon/radeon_i2c.c
-@@ -0,0 +1,163 @@
+@@ -0,0 +1,196 @@
 +/*
 + * Copyright 2007-8 Advanced Micro Devices, Inc.
 + * Copyright 2008 Red Hat Inc.
@@ -37785,6 +37847,38 @@
 +#include "radeon_drm.h"
 +#include "radeon_drv.h"
 +
++/**
++ * radeon_ddc_probe
++ *
++ */
++bool radeon_ddc_probe(struct radeon_connector *radeon_connector)
++{
++        u8 out_buf[] = { 0x0, 0x0};
++        u8 buf[2];
++        int ret;
++        struct i2c_msg msgs[] = {
++                {
++                        .addr = 0x50,
++                        .flags = 0,
++                        .len = 1,
++                        .buf = out_buf,
++                },
++                {
++                        .addr = 0x50,
++                        .flags = I2C_M_RD,
++                        .len = 1,
++                        .buf = buf,
++                }
++        };
++
++        ret = i2c_transfer(&radeon_connector->ddc_bus->adapter, msgs, 2);
++        if (ret == 2)
++                return true;
++
++        return false;
++}
++
++
 +void radeon_i2c_do_lock(struct radeon_connector *radeon_connector, int lock_state)
 +{
 +	struct drm_radeon_private *dev_priv = radeon_connector->base.dev->dev_private;
@@ -37919,6 +38013,7 @@
 +{
 +	return NULL;
 +}
++
 diff --git a/drivers/gpu/drm/radeon/radeon_irq.c b/drivers/gpu/drm/radeon/radeon_irq.c
 index ee40d19..4d16f4a 100644
 --- a/drivers/gpu/drm/radeon/radeon_irq.c
@@ -39000,10 +39095,10 @@
 +}
 diff --git a/drivers/gpu/drm/radeon/radeon_legacy_encoders.c b/drivers/gpu/drm/radeon/radeon_legacy_encoders.c
 new file mode 100644
-index 0000000..0d6babb
+index 0000000..c80e0b5
 --- /dev/null
 +++ b/drivers/gpu/drm/radeon/radeon_legacy_encoders.c
-@@ -0,0 +1,1328 @@
+@@ -0,0 +1,1356 @@
 +/*
 + * Copyright 2007-8 Advanced Micro Devices, Inc.
 + * Copyright 2008 Red Hat Inc.
@@ -39275,16 +39370,20 @@
 +
 +static void radeon_legacy_lvds_prepare(struct drm_encoder *encoder)
 +{
++	struct drm_radeon_private *dev_priv = encoder->dev->dev_private;
 +	// fix me: atom/legacy r4xx
-+	radeon_combios_output_lock(encoder, true);
++	if (!dev_priv->is_atom_bios)
++		radeon_combios_output_lock(encoder, true);
 +	radeon_legacy_lvds_dpms(encoder, DRM_MODE_DPMS_OFF);
 +}
 +
 +static void radeon_legacy_lvds_commit(struct drm_encoder *encoder)
 +{
++	struct drm_radeon_private *dev_priv = encoder->dev->dev_private;
 +	radeon_legacy_lvds_dpms(encoder, DRM_MODE_DPMS_ON);
 +	// fix me: atom/legacy r4xx
-+	radeon_combios_output_lock(encoder, false);
++	if (!dev_priv->is_atom_bios)
++		radeon_combios_output_lock(encoder, false);
 +}
 +
 +static void radeon_legacy_lvds_mode_set(struct drm_encoder *encoder,
@@ -39367,6 +39466,7 @@
 +
 +struct drm_encoder *radeon_encoder_legacy_lvds_add(struct drm_device *dev, int bios_index)
 +{
++	struct drm_radeon_private *dev_priv = dev->dev_private;
 +	struct radeon_encoder *radeon_encoder;
 +	struct drm_encoder *encoder;
 +
@@ -39388,7 +39488,10 @@
 +	drm_encoder_helper_add(encoder, &radeon_legacy_lvds_helper_funcs);
 +
 +	/* get the lvds info from the bios */
-+	radeon_combios_get_lvds_info(radeon_encoder);
++	if (dev_priv->is_atom_bios)
++		radeon_atombios_get_lvds_info(radeon_encoder);
++	else
++		radeon_combios_get_lvds_info(radeon_encoder);
 +
 +	/* LVDS gets default RMX full scaling */
 +	radeon_encoder->rmx_type = RMX_FULL;
@@ -39463,16 +39566,20 @@
 +
 +static void radeon_legacy_primary_dac_prepare(struct drm_encoder *encoder)
 +{
++	struct drm_radeon_private *dev_priv = encoder->dev->dev_private;
 +	// fix me: atom/legacy r4xx
-+	radeon_combios_output_lock(encoder, true);
++	if (!dev_priv->is_atom_bios)
++		radeon_combios_output_lock(encoder, true);
 +	radeon_legacy_primary_dac_dpms(encoder, DRM_MODE_DPMS_OFF);
 +}
 +
 +static void radeon_legacy_primary_dac_commit(struct drm_encoder *encoder)
 +{
++	struct drm_radeon_private *dev_priv = encoder->dev->dev_private;
 +	radeon_legacy_primary_dac_dpms(encoder, DRM_MODE_DPMS_ON);
 +	// fix me: atom/legacy r4xx
-+	radeon_combios_output_lock(encoder, false);
++	if (!dev_priv->is_atom_bios)
++		radeon_combios_output_lock(encoder, false);
 +}
 +
 +static void radeon_legacy_primary_dac_mode_set(struct drm_encoder *encoder,
@@ -39609,6 +39716,7 @@
 +
 +struct drm_encoder *radeon_encoder_legacy_primary_dac_add(struct drm_device *dev, int bios_index, int has_tv)
 +{
++	struct drm_radeon_private *dev_priv = dev->dev_private;
 +	struct radeon_encoder *radeon_encoder;
 +	struct drm_encoder *encoder;
 +
@@ -39629,7 +39737,8 @@
 +	drm_encoder_helper_add(encoder, &radeon_legacy_primary_dac_helper_funcs);
 +
 +	/* get the primary dac bg/adj vals from bios tables */
-+	radeon_combios_get_primary_dac_info(radeon_encoder);
++	if (!dev_priv->is_atom_bios)
++		radeon_combios_get_primary_dac_info(radeon_encoder);
 +
 +	return encoder;
 +}
@@ -39687,16 +39796,20 @@
 +
 +static void radeon_legacy_tmds_int_prepare(struct drm_encoder *encoder)
 +{
++	struct drm_radeon_private *dev_priv = encoder->dev->dev_private;
 +	// fix me: atom/legacy r4xx
-+	radeon_combios_output_lock(encoder, true);
++	if (!dev_priv->is_atom_bios)
++		radeon_combios_output_lock(encoder, true);
 +	radeon_legacy_tmds_int_dpms(encoder, DRM_MODE_DPMS_OFF);
 +}
 +
 +static void radeon_legacy_tmds_int_commit(struct drm_encoder *encoder)
 +{
++	struct drm_radeon_private *dev_priv = encoder->dev->dev_private;
 +	radeon_legacy_tmds_int_dpms(encoder, DRM_MODE_DPMS_ON);
 +	// fix me: atom/legacy r4xx
-+	radeon_combios_output_lock(encoder, true);
++	if (!dev_priv->is_atom_bios)
++		radeon_combios_output_lock(encoder, true);
 +}
 +
 +static void radeon_legacy_tmds_int_mode_set(struct drm_encoder *encoder,
@@ -39800,6 +39913,7 @@
 +
 +struct drm_encoder *radeon_encoder_legacy_tmds_int_add(struct drm_device *dev, int bios_index)
 +{
++	struct drm_radeon_private *dev_priv = dev->dev_private;
 +	struct radeon_encoder *radeon_encoder;
 +	struct drm_encoder *encoder;
 +
@@ -39819,7 +39933,10 @@
 +
 +	drm_encoder_helper_add(encoder, &radeon_legacy_tmds_int_helper_funcs);
 +
-+	radeon_combios_get_tmds_info(radeon_encoder);
++	if (dev_priv->is_atom_bios)
++		radeon_atombios_get_tmds_info(radeon_encoder);
++	else
++		radeon_combios_get_tmds_info(radeon_encoder);
 +
 +	return encoder;
 +}
@@ -39878,16 +39995,20 @@
 +
 +static void radeon_legacy_tmds_ext_prepare(struct drm_encoder *encoder)
 +{
++	struct drm_radeon_private *dev_priv = encoder->dev->dev_private;
 +	// fix me: atom/legacy r4xx
-+	radeon_combios_output_lock(encoder, true);
++	if (!dev_priv->is_atom_bios)
++		radeon_combios_output_lock(encoder, true);
 +	radeon_legacy_tmds_ext_dpms(encoder, DRM_MODE_DPMS_OFF);
 +}
 +
 +static void radeon_legacy_tmds_ext_commit(struct drm_encoder *encoder)
 +{
++	struct drm_radeon_private *dev_priv = encoder->dev->dev_private;
 +	radeon_legacy_tmds_ext_dpms(encoder, DRM_MODE_DPMS_ON);
 +	// fix me: atom/legacy r4xx
-+	radeon_combios_output_lock(encoder, false);
++	if (!dev_priv->is_atom_bios)
++		radeon_combios_output_lock(encoder, false);
 +}
 +
 +static void radeon_legacy_tmds_ext_mode_set(struct drm_encoder *encoder,
@@ -39962,6 +40083,7 @@
 +
 +struct drm_encoder *radeon_encoder_legacy_tmds_ext_add(struct drm_device *dev, int bios_index)
 +{
++	struct drm_radeon_private *dev_priv = dev->dev_private;
 +	struct radeon_encoder *radeon_encoder;
 +	struct drm_encoder *encoder;
 +
@@ -39981,7 +40103,8 @@
 +
 +	drm_encoder_helper_add(encoder, &radeon_legacy_tmds_ext_helper_funcs);
 +
-+	//radeon_combios_get_tmds_info(radeon_encoder);
++	if (!dev_priv->is_atom_bios)
++		radeon_combios_get_ext_tmds_info(radeon_encoder);
 +	return encoder;
 +}
 +
@@ -40334,10 +40457,10 @@
 +}
 diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h
 new file mode 100644
-index 0000000..8236d1c
+index 0000000..ef268a2
 --- /dev/null
 +++ b/drivers/gpu/drm/radeon/radeon_mode.h
-@@ -0,0 +1,333 @@
+@@ -0,0 +1,337 @@
 +/*
 + * Copyright 2000 ATI Technologies Inc., Markham, Ontario, and
 + *                VA Linux Systems Inc., Fremont, California.
@@ -40587,6 +40710,7 @@
 +						 struct radeon_i2c_bus_rec *rec,
 +						 const char *name);
 +extern void radeon_i2c_destroy(struct radeon_i2c_chan *i2c);
++extern bool radeon_ddc_probe(struct radeon_connector *radeon_connector);
 +extern int radeon_ddc_get_modes(struct radeon_connector *radeon_connector);
 +extern struct drm_connector *radeon_connector_add(struct drm_device *dev, int bios_index);
 +
@@ -40627,9 +40751,11 @@
 +
 +extern bool radeon_atom_get_clock_info(struct drm_device *dev);
 +extern bool radeon_combios_get_clock_info(struct drm_device *dev);
-+extern void radeon_get_lvds_info(struct radeon_encoder *encoder);
++extern void radeon_atombios_get_lvds_info(struct radeon_encoder *encoder);
++extern void radeon_atombios_get_tmds_info(struct radeon_encoder *encoder);
 +extern bool radeon_combios_get_lvds_info(struct radeon_encoder *encoder);
 +extern bool radeon_combios_get_tmds_info(struct radeon_encoder *encoder);
++extern bool radeon_combios_get_ext_tmds_info(struct radeon_encoder *encoder);
 +extern bool radeon_combios_get_tv_info(struct radeon_encoder *encoder);
 +extern bool radeon_combios_get_tv_dac_info(struct radeon_encoder *encoder);
 +extern bool radeon_combios_get_primary_dac_info(struct radeon_encoder *encoder);
@@ -40670,6 +40796,7 @@
 +void radeon_copy_fb(struct drm_device *dev, struct drm_gem_object *dst_obj);
 +void radeon_combios_asic_init(struct drm_device *dev);
 +extern int radeon_static_clocks_init(struct drm_device *dev);
++
 +#endif
 diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c
 new file mode 100644


Index: kernel.spec
===================================================================
RCS file: /cvs/pkgs/rpms/kernel/devel/kernel.spec,v
retrieving revision 1.939
retrieving revision 1.940
diff -u -r1.939 -r1.940
--- kernel.spec	9 Sep 2008 01:47:35 -0000	1.939
+++ kernel.spec	9 Sep 2008 06:16:19 -0000	1.940
@@ -607,6 +607,7 @@
 
 # nouveau + drm fixes
 Patch1811: drm-modesetting-radeon.patch
+Patch1812: drm-modesetting-i915.patch
 Patch1813: drm-nouveau.patch
 
 # kludge to make ich9 e1000 work
@@ -1152,6 +1153,7 @@
 
 # Nouveau DRM + drm fixes
 ApplyPatch drm-modesetting-radeon.patch
+ApplyPatch drm-modesetting-i915.patch
 ApplyPatch drm-nouveau.patch
 
 # linux1394 git patches
@@ -1744,6 +1746,10 @@
 %kernel_variant_files -k vmlinux %{with_kdump} kdump
 
 %changelog
+* Tue Sep 09 2008 Dave Airlie <airlied at redhat.com>
+- radeon - update modesetting bits - should fix r400
+- add i915 modesetting bits - don't enable these by default yet
+
 * Mon Sep 08 2008 Dave Jones <davej at redhat.com>
 - 2.6.27-rc5-git10
 




More information about the fedora-extras-commits mailing list