aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGerd Hoffmann <kraxel@redhat.com>2013-10-11 04:01:10 -0400
committerDave Airlie <airlied@redhat.com>2013-11-05 22:36:20 -0500
commit35541782dcc1e502d1864075eded7b3bb23b7268 (patch)
tree0810d31f2eb7b8dc9dd326fdbeccb38700adceec
parent121a6a17439b000b9699c3fa876636db20fa4107 (diff)
drm/qxl: support 64bit surface bar
qxl devices can have a 64bit surface bar, which is quite handy if you need a bit more surface memory. So try to use it if it is present. Note that this bar might be mapped above 4g. QEMU command line to check that out: qemu-system-x86_64 -m 4g \ -vga qxl -global qxl-vga.vram64_size_mb=512 \ $otheroptions Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
-rw-r--r--drivers/gpu/drm/qxl/qxl_kms.c32
1 files changed, 25 insertions, 7 deletions
diff --git a/drivers/gpu/drm/qxl/qxl_kms.c b/drivers/gpu/drm/qxl/qxl_kms.c
index 9e8da9ee9731..e0ddd5b4e4f3 100644
--- a/drivers/gpu/drm/qxl/qxl_kms.c
+++ b/drivers/gpu/drm/qxl/qxl_kms.c
@@ -120,7 +120,7 @@ int qxl_device_init(struct qxl_device *qdev,
120 struct pci_dev *pdev, 120 struct pci_dev *pdev,
121 unsigned long flags) 121 unsigned long flags)
122{ 122{
123 int r; 123 int r, sb;
124 124
125 qdev->dev = &pdev->dev; 125 qdev->dev = &pdev->dev;
126 qdev->ddev = ddev; 126 qdev->ddev = ddev;
@@ -136,21 +136,39 @@ int qxl_device_init(struct qxl_device *qdev,
136 qdev->rom_base = pci_resource_start(pdev, 2); 136 qdev->rom_base = pci_resource_start(pdev, 2);
137 qdev->rom_size = pci_resource_len(pdev, 2); 137 qdev->rom_size = pci_resource_len(pdev, 2);
138 qdev->vram_base = pci_resource_start(pdev, 0); 138 qdev->vram_base = pci_resource_start(pdev, 0);
139 qdev->surfaceram_base = pci_resource_start(pdev, 1);
140 qdev->surfaceram_size = pci_resource_len(pdev, 1);
141 qdev->io_base = pci_resource_start(pdev, 3); 139 qdev->io_base = pci_resource_start(pdev, 3);
142 140
143 qdev->vram_mapping = io_mapping_create_wc(qdev->vram_base, pci_resource_len(pdev, 0)); 141 qdev->vram_mapping = io_mapping_create_wc(qdev->vram_base, pci_resource_len(pdev, 0));
144 qdev->surface_mapping = io_mapping_create_wc(qdev->surfaceram_base, qdev->surfaceram_size); 142
145 DRM_DEBUG_KMS("qxl: vram %llx-%llx(%dM %dk), surface %llx-%llx(%dM %dk)\n", 143 if (pci_resource_len(pdev, 4) > 0) {
144 /* 64bit surface bar present */
145 sb = 4;
146 qdev->surfaceram_base = pci_resource_start(pdev, sb);
147 qdev->surfaceram_size = pci_resource_len(pdev, sb);
148 qdev->surface_mapping =
149 io_mapping_create_wc(qdev->surfaceram_base,
150 qdev->surfaceram_size);
151 }
152 if (qdev->surface_mapping == NULL) {
153 /* 64bit surface bar not present (or mapping failed) */
154 sb = 1;
155 qdev->surfaceram_base = pci_resource_start(pdev, sb);
156 qdev->surfaceram_size = pci_resource_len(pdev, sb);
157 qdev->surface_mapping =
158 io_mapping_create_wc(qdev->surfaceram_base,
159 qdev->surfaceram_size);
160 }
161
162 DRM_DEBUG_KMS("qxl: vram %llx-%llx(%dM %dk), surface %llx-%llx(%dM %dk, %s)\n",
146 (unsigned long long)qdev->vram_base, 163 (unsigned long long)qdev->vram_base,
147 (unsigned long long)pci_resource_end(pdev, 0), 164 (unsigned long long)pci_resource_end(pdev, 0),
148 (int)pci_resource_len(pdev, 0) / 1024 / 1024, 165 (int)pci_resource_len(pdev, 0) / 1024 / 1024,
149 (int)pci_resource_len(pdev, 0) / 1024, 166 (int)pci_resource_len(pdev, 0) / 1024,
150 (unsigned long long)qdev->surfaceram_base, 167 (unsigned long long)qdev->surfaceram_base,
151 (unsigned long long)pci_resource_end(pdev, 1), 168 (unsigned long long)pci_resource_end(pdev, sb),
152 (int)qdev->surfaceram_size / 1024 / 1024, 169 (int)qdev->surfaceram_size / 1024 / 1024,
153 (int)qdev->surfaceram_size / 1024); 170 (int)qdev->surfaceram_size / 1024,
171 (sb == 4) ? "64bit" : "32bit");
154 172
155 qdev->rom = ioremap(qdev->rom_base, qdev->rom_size); 173 qdev->rom = ioremap(qdev->rom_base, qdev->rom_size);
156 if (!qdev->rom) { 174 if (!qdev->rom) {