diff options
author | Kevin Brace <kevinbrace@bracecomputerlab.com> | 2024-01-15 18:15:31 -0600 |
---|---|---|
committer | Kevin Brace <kevinbrace@bracecomputerlab.com> | 2024-01-15 18:15:31 -0600 |
commit | 6ba3573a4a111d1c0b2c6ce8499f07b21da9dcfb (patch) | |
tree | 31c2bcecc31f578b2d59898bafa6aa00820fd3e1 | |
parent | 0fd6d34d55a13656bc4ef9c5e77dfe6c65119cdd (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.c | 66 |
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; |