diff options
author | Gerd Hoffmann <kraxel@redhat.com> | 2013-10-11 04:01:10 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2013-11-05 22:36:20 -0500 |
commit | 35541782dcc1e502d1864075eded7b3bb23b7268 (patch) | |
tree | 0810d31f2eb7b8dc9dd326fdbeccb38700adceec | |
parent | 121a6a17439b000b9699c3fa876636db20fa4107 (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.c | 32 |
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) { |