summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Brace <kevinbrace@bracecomputerlab.com>2024-01-15 18:15:31 -0600
committerKevin Brace <kevinbrace@bracecomputerlab.com>2024-01-15 18:15:31 -0600
commit6ba3573a4a111d1c0b2c6ce8499f07b21da9dcfb (patch)
tree31c2bcecc31f578b2d59898bafa6aa00820fd3e1
parent0fd6d34d55a13656bc4ef9c5e77dfe6c65119cdd (diff)
drm/via: Rename cx700_mem_type() to p4m900_mem_type()
The function will now acquire a pointer to the relevant PCI bridge device within it. Improved its error handling within the function. Signed-off-by: Kevin Brace <kevinbrace@bracecomputerlab.com>
-rw-r--r--drivers/gpu/drm/via/via_init.c66
1 files changed, 43 insertions, 23 deletions
diff --git a/drivers/gpu/drm/via/via_init.c b/drivers/gpu/drm/via/via_init.c
index f242ce7da9a1..3c36a8b4252a 100644
--- a/drivers/gpu/drm/via/via_init.c
+++ b/drivers/gpu/drm/via/via_init.c
@@ -756,63 +756,83 @@ exit:
return ret;
}
-static int cx700_mem_type(struct drm_device *dev,
- struct pci_dev *fn3)
+static int p4m900_mem_type(struct drm_device *dev)
{
+ struct pci_dev *gfx_dev = to_pci_dev(dev->dev);
+ struct pci_dev *bridge_fn3_dev;
struct via_drm_priv *dev_priv = to_via_drm_priv(dev);
u8 type, clock;
int ret;
- ret = pci_read_config_byte(fn3, 0x90, &clock);
- if (ret)
- return ret;
- ret = pci_read_config_byte(fn3, 0x6c, &type);
- if (ret)
- return ret;
+ bridge_fn3_dev =
+ pci_get_domain_bus_and_slot(pci_domain_nr(gfx_dev->bus), 0,
+ PCI_DEVFN(0, 3));
+ if (!bridge_fn3_dev) {
+ ret = -ENODEV;
+ drm_err(dev, "Host Bridge Function 3 not found! errno: %d\n",
+ ret);
+ goto exit;
+ }
+
+ ret = pci_read_config_byte(bridge_fn3_dev, 0x6c, &type);
+ if (ret) {
+ goto error_pci_cfg_read;
+ }
+
+ ret = pci_read_config_byte(bridge_fn3_dev, 0x90, &clock);
+ if (ret) {
+ goto error_pci_cfg_read;
+ }
+
type &= 0x40;
type >>= 6;
-
switch (type) {
- case 0:
+ case 0x00:
switch (clock & 0x07) {
- case 0:
+ case 0x00:
dev_priv->vram_type = VIA_MEM_DDR_200;
break;
- case 1:
+ case 0x01:
dev_priv->vram_type = VIA_MEM_DDR_266;
break;
- case 2:
+ case 0x02:
dev_priv->vram_type = VIA_MEM_DDR_333;
break;
- case 3:
+ case 0x03:
dev_priv->vram_type = VIA_MEM_DDR_400;
break;
default:
break;
}
- break;
- case 1:
+ break;
+ case 0x01:
switch (clock & 0x07) {
- case 3:
+ case 0x03:
dev_priv->vram_type = VIA_MEM_DDR2_400;
break;
- case 4:
+ case 0x04:
dev_priv->vram_type = VIA_MEM_DDR2_533;
break;
- case 5:
+ case 0x05:
dev_priv->vram_type = VIA_MEM_DDR2_667;
break;
- case 6:
+ case 0x06:
dev_priv->vram_type = VIA_MEM_DDR2_800;
break;
default:
break;
}
+
break;
default:
break;
}
+
+ goto exit;
+error_pci_cfg_read:
+ drm_err(dev, "PCI configuration space read error! errno: %d\n", ret);
+exit:
return ret;
}
@@ -1054,8 +1074,6 @@ static int via_vram_init(struct drm_device *dev)
/* P4M800CE / P4M800 Pro / VN800 / CN700 */
case PCI_DEVICE_ID_VIA_P4M800CE:
- /* P4M900 / VN896 / CN896 */
- case PCI_DEVICE_ID_VIA_VT3364:
ret = pci_read_config_byte(hb_fn3, 0xa1, &size);
if (ret)
goto error_hb_fn3;
@@ -1073,6 +1091,8 @@ static int via_vram_init(struct drm_device *dev)
case PCI_DEVICE_ID_VIA_VT3324:
/* P4M890 / VN890 */
case PCI_DEVICE_ID_VIA_P4M890:
+ /* P4M900 / VN896 / CN896 */
+ case PCI_DEVICE_ID_VIA_VT3364:
/* VX800 / VX820 */
case PCI_DEVICE_ID_VIA_VX800_HB:
/* VX855 / VX875 */
@@ -1082,7 +1102,7 @@ static int via_vram_init(struct drm_device *dev)
goto error_hb_fn3;
dev_priv->vram_size = (1 << ((size & 0x70) >> 4)) << 22;
- ret = cx700_mem_type(dev, hb_fn3);
+ ret = p4m900_mem_type(dev);
if (ret)
goto error_hb_fn3;
break;