提交 1aecb393 编写于 作者: E Eric Hustvedt 提交者: Dave Airlie

Adds support for 256MB aperture on 945 chipsets to the intelfb driver

and corrects calculation of stolen memory overhead.
Signed-off-by: NEric Hustvedt <ehustvedt@cecropia.com>
Signed-off-by: NDennis Munsie <dmunsie@cecropia.com>
Signed-off-by: NDave Airlie <airlied@linux.ie>
上级 df7df8ab
...@@ -156,6 +156,7 @@ intelfbhw_get_memory(struct pci_dev *pdev, int *aperture_size, ...@@ -156,6 +156,7 @@ intelfbhw_get_memory(struct pci_dev *pdev, int *aperture_size,
{ {
struct pci_dev *bridge_dev; struct pci_dev *bridge_dev;
u16 tmp; u16 tmp;
int stolen_overhead;
if (!pdev || !aperture_size || !stolen_size) if (!pdev || !aperture_size || !stolen_size)
return 1; return 1;
...@@ -170,21 +171,41 @@ intelfbhw_get_memory(struct pci_dev *pdev, int *aperture_size, ...@@ -170,21 +171,41 @@ intelfbhw_get_memory(struct pci_dev *pdev, int *aperture_size,
tmp = 0; tmp = 0;
pci_read_config_word(bridge_dev, INTEL_GMCH_CTRL, &tmp); pci_read_config_word(bridge_dev, INTEL_GMCH_CTRL, &tmp);
switch (pdev->device) { switch (pdev->device) {
case PCI_DEVICE_ID_INTEL_830M: case PCI_DEVICE_ID_INTEL_915G:
case PCI_DEVICE_ID_INTEL_845G: case PCI_DEVICE_ID_INTEL_915GM:
case PCI_DEVICE_ID_INTEL_945G:
case PCI_DEVICE_ID_INTEL_945GM:
/* 915 and 945 chipsets support a 256MB aperture.
Aperture size is determined by inspected the
base address of the aperture. */
if (pci_resource_start(pdev, 2) & 0x08000000)
*aperture_size = MB(128);
else
*aperture_size = MB(256);
break;
default:
if ((tmp & INTEL_GMCH_MEM_MASK) == INTEL_GMCH_MEM_64M) if ((tmp & INTEL_GMCH_MEM_MASK) == INTEL_GMCH_MEM_64M)
*aperture_size = MB(64); *aperture_size = MB(64);
else else
*aperture_size = MB(128); *aperture_size = MB(128);
break;
}
/* Stolen memory size is reduced by the GTT and the popup.
GTT is 1K per MB of aperture size, and popup is 4K. */
stolen_overhead = (*aperture_size / MB(1)) + 4;
switch(pdev->device) {
case PCI_DEVICE_ID_INTEL_830M:
case PCI_DEVICE_ID_INTEL_845G:
switch (tmp & INTEL_830_GMCH_GMS_MASK) { switch (tmp & INTEL_830_GMCH_GMS_MASK) {
case INTEL_830_GMCH_GMS_STOLEN_512: case INTEL_830_GMCH_GMS_STOLEN_512:
*stolen_size = KB(512) - KB(132); *stolen_size = KB(512) - KB(stolen_overhead);
return 0; return 0;
case INTEL_830_GMCH_GMS_STOLEN_1024: case INTEL_830_GMCH_GMS_STOLEN_1024:
*stolen_size = MB(1) - KB(132); *stolen_size = MB(1) - KB(stolen_overhead);
return 0; return 0;
case INTEL_830_GMCH_GMS_STOLEN_8192: case INTEL_830_GMCH_GMS_STOLEN_8192:
*stolen_size = MB(8) - KB(132); *stolen_size = MB(8) - KB(stolen_overhead);
return 0; return 0;
case INTEL_830_GMCH_GMS_LOCAL: case INTEL_830_GMCH_GMS_LOCAL:
ERR_MSG("only local memory found\n"); ERR_MSG("only local memory found\n");
...@@ -199,28 +220,27 @@ intelfbhw_get_memory(struct pci_dev *pdev, int *aperture_size, ...@@ -199,28 +220,27 @@ intelfbhw_get_memory(struct pci_dev *pdev, int *aperture_size,
} }
break; break;
default: default:
*aperture_size = MB(128);
switch (tmp & INTEL_855_GMCH_GMS_MASK) { switch (tmp & INTEL_855_GMCH_GMS_MASK) {
case INTEL_855_GMCH_GMS_STOLEN_1M: case INTEL_855_GMCH_GMS_STOLEN_1M:
*stolen_size = MB(1) - KB(132); *stolen_size = MB(1) - KB(stolen_overhead);
return 0; return 0;
case INTEL_855_GMCH_GMS_STOLEN_4M: case INTEL_855_GMCH_GMS_STOLEN_4M:
*stolen_size = MB(4) - KB(132); *stolen_size = MB(4) - KB(stolen_overhead);
return 0; return 0;
case INTEL_855_GMCH_GMS_STOLEN_8M: case INTEL_855_GMCH_GMS_STOLEN_8M:
*stolen_size = MB(8) - KB(132); *stolen_size = MB(8) - KB(stolen_overhead);
return 0; return 0;
case INTEL_855_GMCH_GMS_STOLEN_16M: case INTEL_855_GMCH_GMS_STOLEN_16M:
*stolen_size = MB(16) - KB(132); *stolen_size = MB(16) - KB(stolen_overhead);
return 0; return 0;
case INTEL_855_GMCH_GMS_STOLEN_32M: case INTEL_855_GMCH_GMS_STOLEN_32M:
*stolen_size = MB(32) - KB(132); *stolen_size = MB(32) - KB(stolen_overhead);
return 0; return 0;
case INTEL_915G_GMCH_GMS_STOLEN_48M: case INTEL_915G_GMCH_GMS_STOLEN_48M:
*stolen_size = MB(48) - KB(132); *stolen_size = MB(48) - KB(stolen_overhead);
return 0; return 0;
case INTEL_915G_GMCH_GMS_STOLEN_64M: case INTEL_915G_GMCH_GMS_STOLEN_64M:
*stolen_size = MB(64) - KB(132); *stolen_size = MB(64) - KB(stolen_overhead);
return 0; return 0;
case INTEL_855_GMCH_GMS_DISABLED: case INTEL_855_GMCH_GMS_DISABLED:
ERR_MSG("video memory is disabled\n"); ERR_MSG("video memory is disabled\n");
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册