drm/i915: Recognise non-VGA display devices
Starting with SandyBridge (though possible with earlier hacked BIOSes), the BIOS may initialise the IGFX as secondary to a discrete GPU. Prior, it would simply disable the integrated GPU. So we adjust our PCI class mask to match any DISPLAY_CLASS device. In such a configuration, the IGFX is not a primary VGA controller and so should not take part in VGA arbitration, and the error return from vga_client_register() is expected. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: stable@kernel.org
This commit is contained in:
		
					parent
					
						
							
								076e2c0eb8
							
						
					
				
			
			
				commit
				
					
						934f992c76
					
				
			
		
					 3 changed files with 10 additions and 4 deletions
				
			
		| 
						 | 
				
			
			@ -1215,9 +1215,15 @@ static int i915_load_modeset_init(struct drm_device *dev)
 | 
			
		|||
	if (ret)
 | 
			
		||||
		DRM_INFO("failed to find VBIOS tables\n");
 | 
			
		||||
 | 
			
		||||
	/* if we have > 1 VGA cards, then disable the radeon VGA resources */
 | 
			
		||||
	/* If we have > 1 VGA cards, then we need to arbitrate access
 | 
			
		||||
	 * to the common VGA resources.
 | 
			
		||||
	 *
 | 
			
		||||
	 * If we are a secondary display controller (!PCI_DISPLAY_CLASS_VGA),
 | 
			
		||||
	 * then we do not take part in VGA arbitration and the
 | 
			
		||||
	 * vga_client_register() fails with -ENODEV.
 | 
			
		||||
	 */
 | 
			
		||||
	ret = vga_client_register(dev->pdev, dev, NULL, i915_vga_set_decode);
 | 
			
		||||
	if (ret)
 | 
			
		||||
	if (ret && ret != -ENODEV)
 | 
			
		||||
		goto cleanup_ringbuffer;
 | 
			
		||||
 | 
			
		||||
	intel_register_dsm_handler();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -60,7 +60,7 @@ extern int intel_agp_enabled;
 | 
			
		|||
 | 
			
		||||
#define INTEL_VGA_DEVICE(id, info) {		\
 | 
			
		||||
	.class = PCI_CLASS_DISPLAY_VGA << 8,	\
 | 
			
		||||
	.class_mask = 0xffff00,			\
 | 
			
		||||
	.class_mask = 0xff0000,			\
 | 
			
		||||
	.vendor = 0x8086,			\
 | 
			
		||||
	.device = id,				\
 | 
			
		||||
	.subvendor = PCI_ANY_ID,		\
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -636,7 +636,7 @@ int vga_client_register(struct pci_dev *pdev, void *cookie,
 | 
			
		|||
			void (*irq_set_state)(void *cookie, bool state),
 | 
			
		||||
			unsigned int (*set_vga_decode)(void *cookie, bool decode))
 | 
			
		||||
{
 | 
			
		||||
	int ret = -1;
 | 
			
		||||
	int ret = -ENODEV;
 | 
			
		||||
	struct vga_device *vgadev;
 | 
			
		||||
	unsigned long flags;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue