summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Brace <kevinbrace@bracecomputerlab.com>2024-01-15 18:15:18 -0600
committerKevin Brace <kevinbrace@bracecomputerlab.com>2024-01-15 18:15:18 -0600
commit219279a2cb02140203a054c439e751ffeb8c12b2 (patch)
treeb0dccecf45a08a14a29a5e35ec1eb7937a5f2676
parent602a11a97064530867d2f9e699e222a0fb3c6c03 (diff)
drm/via: Updates to p4m800_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.c81
1 files changed, 53 insertions, 28 deletions
diff --git a/drivers/gpu/drm/via/via_init.c b/drivers/gpu/drm/via/via_init.c
index 370c74051938..d692e3bcbbe7 100644
--- a/drivers/gpu/drm/via/via_init.c
+++ b/drivers/gpu/drm/via/via_init.c
@@ -353,51 +353,71 @@ exit:
return ret;
}
-static int p4m800_mem_type(struct drm_device *dev,
- struct pci_bus *bus,
- struct pci_dev *fn3)
+static int p4m800_mem_type(struct drm_device *dev)
{
+ struct pci_dev *gfx_dev = to_pci_dev(dev->dev);
+ struct pci_dev *bridge_fn3_dev, *bridge_fn4_dev;
struct via_drm_priv *dev_priv = to_via_drm_priv(dev);
- struct pci_dev *fn4 = pci_get_slot(bus, PCI_DEVFN(0, 4));
- int ret, freq = 0;
- u8 type, fsb;
+ int freq = 0;
+ u8 fsb, type;
+ int 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;
+ }
+
+ bridge_fn4_dev =
+ pci_get_domain_bus_and_slot(pci_domain_nr(gfx_dev->bus), 0,
+ PCI_DEVFN(0, 4));
+ if (!bridge_fn4_dev) {
+ ret = -ENODEV;
+ drm_err(dev, "Host Bridge Function 4 not found! errno: %d\n",
+ ret);
+ goto exit;
+ }
/* VIA Scratch region */
- ret = pci_read_config_byte(fn4, 0xf3, &fsb);
+ ret = pci_read_config_byte(bridge_fn4_dev, 0xf3, &fsb);
if (ret) {
- pci_dev_put(fn4);
- return ret;
+ goto error_pci_cfg_read;
}
- switch (fsb >> 5) {
- case 0:
- freq = 3; /* 100 MHz */
+ fsb >>= 5;
+ switch (fsb) {
+ case 0x00:
+ freq = 0x03; /* 100 MHz */
break;
- case 1:
- freq = 4; /* 133 MHz */
+ case 0x01:
+ freq = 0x04; /* 133 MHz */
break;
- case 3:
- freq = 5; /* 166 MHz */
+ case 0x03:
+ freq = 0x05; /* 166 MHz */
break;
- case 2:
- freq = 6; /* 200 MHz */
+ case 0x02:
+ freq = 0x06; /* 200 MHz */
break;
- case 4:
- freq = 7; /* 233 MHz */
+ case 0x04:
+ freq = 0x07; /* 233 MHz */
break;
default:
break;
}
- pci_dev_put(fn4);
- ret = pci_read_config_byte(fn3, 0x68, &type);
- if (ret)
- return ret;
- type &= 0x0f;
+ ret = pci_read_config_byte(bridge_fn3_dev, 0x68, &type);
+ if (ret) {
+ goto error_pci_cfg_read;
+ }
- if (type & 0x02)
+ type &= 0x0f;
+ if (type & 0x02) {
freq -= type >> 2;
- else {
+ } else {
freq += type >> 2;
if (type & 0x01)
freq++;
@@ -419,6 +439,11 @@ static int p4m800_mem_type(struct drm_device *dev,
default:
break;
}
+
+ goto exit;
+error_pci_cfg_read:
+ drm_err(dev, "PCI configuration space read error! errno: %d\n", ret);
+exit:
return ret;
}
@@ -913,7 +938,7 @@ static int via_vram_init(struct drm_device *dev)
/* P4M800 */
case PCI_DEVICE_ID_VIA_3296_0:
- ret = p4m800_mem_type(dev, bus, hb_fn3);
+ ret = p4m800_mem_type(dev);
ret = pci_read_config_byte(hb_fn3, 0xa1, &size);
if (ret)