diff options
author | Kevin Brace <kevinbrace@bracecomputerlab.com> | 2024-01-15 18:15:18 -0600 |
---|---|---|
committer | Kevin Brace <kevinbrace@bracecomputerlab.com> | 2024-01-15 18:15:18 -0600 |
commit | 219279a2cb02140203a054c439e751ffeb8c12b2 (patch) | |
tree | b0dccecf45a08a14a29a5e35ec1eb7937a5f2676 | |
parent | 602a11a97064530867d2f9e699e222a0fb3c6c03 (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.c | 81 |
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) |