diff options
Diffstat (limited to 'drivers/gpu/drm/qxl/qxl_kms.c')
| -rw-r--r-- | drivers/gpu/drm/qxl/qxl_kms.c | 44 | 
1 files changed, 33 insertions, 11 deletions
diff --git a/drivers/gpu/drm/qxl/qxl_kms.c b/drivers/gpu/drm/qxl/qxl_kms.c index 9e8da9ee973..fd88eb4a3f7 100644 --- a/drivers/gpu/drm/qxl/qxl_kms.c +++ b/drivers/gpu/drm/qxl/qxl_kms.c @@ -115,12 +115,12 @@ static void qxl_gc_work(struct work_struct *work)  	qxl_garbage_collect(qdev);  } -int qxl_device_init(struct qxl_device *qdev, +static int qxl_device_init(struct qxl_device *qdev,  		    struct drm_device *ddev,  		    struct pci_dev *pdev,  		    unsigned long flags)  { -	int r; +	int r, sb;  	qdev->dev = &pdev->dev;  	qdev->ddev = ddev; @@ -136,21 +136,39 @@ int qxl_device_init(struct qxl_device *qdev,  	qdev->rom_base = pci_resource_start(pdev, 2);  	qdev->rom_size = pci_resource_len(pdev, 2);  	qdev->vram_base = pci_resource_start(pdev, 0); -	qdev->surfaceram_base = pci_resource_start(pdev, 1); -	qdev->surfaceram_size = pci_resource_len(pdev, 1);  	qdev->io_base = pci_resource_start(pdev, 3);  	qdev->vram_mapping = io_mapping_create_wc(qdev->vram_base, pci_resource_len(pdev, 0)); -	qdev->surface_mapping = io_mapping_create_wc(qdev->surfaceram_base, qdev->surfaceram_size); -	DRM_DEBUG_KMS("qxl: vram %llx-%llx(%dM %dk), surface %llx-%llx(%dM %dk)\n", + +	if (pci_resource_len(pdev, 4) > 0) { +		/* 64bit surface bar present */ +		sb = 4; +		qdev->surfaceram_base = pci_resource_start(pdev, sb); +		qdev->surfaceram_size = pci_resource_len(pdev, sb); +		qdev->surface_mapping = +			io_mapping_create_wc(qdev->surfaceram_base, +					     qdev->surfaceram_size); +	} +	if (qdev->surface_mapping == NULL) { +		/* 64bit surface bar not present (or mapping failed) */ +		sb = 1; +		qdev->surfaceram_base = pci_resource_start(pdev, sb); +		qdev->surfaceram_size = pci_resource_len(pdev, sb); +		qdev->surface_mapping = +			io_mapping_create_wc(qdev->surfaceram_base, +					     qdev->surfaceram_size); +	} + +	DRM_DEBUG_KMS("qxl: vram %llx-%llx(%dM %dk), surface %llx-%llx(%dM %dk, %s)\n",  		 (unsigned long long)qdev->vram_base,  		 (unsigned long long)pci_resource_end(pdev, 0),  		 (int)pci_resource_len(pdev, 0) / 1024 / 1024,  		 (int)pci_resource_len(pdev, 0) / 1024,  		 (unsigned long long)qdev->surfaceram_base, -		 (unsigned long long)pci_resource_end(pdev, 1), +		 (unsigned long long)pci_resource_end(pdev, sb),  		 (int)qdev->surfaceram_size / 1024 / 1024, -		 (int)qdev->surfaceram_size / 1024); +		 (int)qdev->surfaceram_size / 1024, +		 (sb == 4) ? "64bit" : "32bit");  	qdev->rom = ioremap(qdev->rom_base, qdev->rom_size);  	if (!qdev->rom) { @@ -230,9 +248,13 @@ int qxl_device_init(struct qxl_device *qdev,  	qdev->surfaces_mem_slot = setup_slot(qdev, 1,  		(unsigned long)qdev->surfaceram_base,  		(unsigned long)qdev->surfaceram_base + qdev->surfaceram_size); -	DRM_INFO("main mem slot %d [%lx,%x)\n", -		qdev->main_mem_slot, -		(unsigned long)qdev->vram_base, qdev->rom->ram_header_offset); +	DRM_INFO("main mem slot %d [%lx,%x]\n", +		 qdev->main_mem_slot, +		 (unsigned long)qdev->vram_base, qdev->rom->ram_header_offset); +	DRM_INFO("surface mem slot %d [%lx,%lx]\n", +		 qdev->surfaces_mem_slot, +		 (unsigned long)qdev->surfaceram_base, +		 (unsigned long)qdev->surfaceram_size);  	qdev->gc_queue = create_singlethread_workqueue("qxl_gc");  | 
