drivers/gpu/drm/via/via_drv.h  |    4 
 drivers/gpu/drm/via/via_init.c |  788 +++++++++++++++++++++++------------------
 2 files changed, 457 insertions(+), 335 deletions(-)

New commits:
commit dc291cb344c2267b6415b830ec426f8e4dd49124
Author: Kevin Brace <kevinbr...@bracecomputerlab.com>
Date:   Mon Jan 15 18:15:58 2024 -0600

    drm/via: Version bumped to 3.6.13
    
    Made improvements to via_vram_init().  P4M900 family will now properly
    recognize DDR2-667.
    
    Signed-off-by: Kevin Brace <kevinbr...@bracecomputerlab.com>

diff --git a/drivers/gpu/drm/via/via_drv.h b/drivers/gpu/drm/via/via_drv.h
index 0c035b907bf3..64ff475c1305 100644
--- a/drivers/gpu/drm/via/via_drv.h
+++ b/drivers/gpu/drm/via/via_drv.h
@@ -44,10 +44,10 @@
 
 #define DRIVER_MAJOR           3
 #define DRIVER_MINOR           6
-#define DRIVER_PATCHLEVEL      12
+#define DRIVER_PATCHLEVEL      13
 #define DRIVER_NAME            "via"
 #define DRIVER_DESC            "OpenChrome DRM for VIA Technologies Chrome"
-#define DRIVER_DATE            "20230929"
+#define DRIVER_DATE            "20240115"
 #define DRIVER_AUTHOR          "OpenChrome Project"
 
 
commit 0e19d2e209bb9edb1f10772d2bf22cee602ec128
Author: Kevin Brace <kevinbr...@bracecomputerlab.com>
Date:   Mon Jan 15 18:15:58 2024 -0600

    drm/via: Detect VRAM size before detecting speed and memory type
    
    This reduces some redundant error checking code.
    
    Signed-off-by: Kevin Brace <kevinbr...@bracecomputerlab.com>

diff --git a/drivers/gpu/drm/via/via_init.c b/drivers/gpu/drm/via/via_init.c
index 39dda8bf81d5..be1c2783703b 100644
--- a/drivers/gpu/drm/via/via_init.c
+++ b/drivers/gpu/drm/via/via_init.c
@@ -952,58 +952,44 @@ static int via_vram_init(struct drm_device *dev)
 
                /* CLE266 */
                case PCI_DEVICE_ID_VIA_862X_0:
-                       ret = cle266_mem_type(dev);
-                       if (ret) {
-                               goto exit;
-                       }
-
                        ret = pci_read_config_byte(bridge_fn0_dev, 0xe1, &size);
                        if (ret) {
                                goto error_pci_cfg_read;
                        }
 
                        dev_priv->vram_size = (1 << ((size & 0x70) >> 4)) << 20;
+
+                       ret = cle266_mem_type(dev);
                        break;
 
                /* KM400(A) / KN400(A) */
                case PCI_DEVICE_ID_VIA_8378_0:
-                       ret = km400_mem_type(dev);
-                       if (ret) {
-                               goto exit;
-                       }
-
                        ret = pci_read_config_byte(bridge_fn0_dev, 0xe1, &size);
                        if (ret) {
                                goto error_pci_cfg_read;
                        }
 
                        dev_priv->vram_size = (1 << ((size & 0x70) >> 4)) << 20;
+
+                       ret = km400_mem_type(dev);
                        break;
 
                /* P4M800 */
                case PCI_DEVICE_ID_VIA_3296_0:
-                       ret = p4m800_mem_type(dev);
-                       if (ret) {
-                               goto exit;
-                       }
-
                        ret = pci_read_config_byte(bridge_fn3_dev, 0xa1, &size);
                        if (ret) {
                                goto error_pci_cfg_read;
                        }
 
                        dev_priv->vram_size = (1 << ((size & 0x70) >> 4)) << 20;
+
+                       ret = p4m800_mem_type(dev);
                        break;
 
                /* K8M800(A) / K8N800(A) */
                case PCI_DEVICE_ID_VIA_8380_0:
                /* K8M890 / K8N890 */
                case PCI_DEVICE_ID_VIA_VT3336:
-                       ret = km8xx_mem_type(dev);
-                       if (ret) {
-                               goto exit;
-                       }
-
                        ret = pci_read_config_byte(bridge_fn3_dev, 0xa1, &size);
                        if (ret) {
                                goto error_pci_cfg_read;
@@ -1015,21 +1001,19 @@ static int via_vram_init(struct drm_device *dev)
                                dev_priv->vram_size <<= 2;
                        }
 
+                       ret = km8xx_mem_type(dev);
                        break;
 
                /* CN400 / PM800 / PN800 / PM880 / PN880 */
                case PCI_DEVICE_ID_VIA_PX8X0_0:
-                       ret = cn400_mem_type(dev);
-                       if (ret) {
-                               goto exit;
-                       }
-
                        ret = pci_read_config_byte(bridge_fn3_dev, 0xa1, &size);
                        if (ret) {
                                goto error_pci_cfg_read;
                        }
 
                        dev_priv->vram_size = (1 << ((size & 0x70) >> 4)) << 20;
+
+                       ret = cn400_mem_type(dev);
                        break;
 
                /* P4M800CE / P4M800 Pro / VN800 / CN700 */
@@ -1044,11 +1028,6 @@ static int via_vram_init(struct drm_device *dev)
                case PCI_DEVICE_ID_VIA_VX800_HB:
                /* VX855 / VX875 */
                case PCI_DEVICE_ID_VIA_VX855_HB:
-                       ret = cn700_mem_type(dev);
-                       if (ret) {
-                               goto exit;
-                       }
-
                        ret = pci_read_config_byte(bridge_fn3_dev, 0xa1, &size);
                        if (ret) {
                                goto error_pci_cfg_read;
@@ -1060,21 +1039,19 @@ static int via_vram_init(struct drm_device *dev)
                                dev_priv->vram_size <<= 2;
                        }
 
+                       ret = cn700_mem_type(dev);
                        break;
 
                /* VX900(H) */
                case PCI_DEVICE_ID_VIA_VX900_HB:
-                       ret = vx900_mem_type(dev);
-                       if (ret) {
-                               goto exit;
-                       }
-
                        ret = pci_read_config_byte(bridge_fn3_dev, 0xa1, &size);
                        if (ret) {
                                goto error_pci_cfg_read;
                        }
 
                        dev_priv->vram_size = (1 << ((size & 0x70) >> 4)) << 22;
+
+                       ret = vx900_mem_type(dev);
                        break;
 
                default:
commit 8bcd1fcfb12a7ff8c21807630674a9b2a171bfd9
Author: Kevin Brace <kevinbr...@bracecomputerlab.com>
Date:   Mon Jan 15 18:15:58 2024 -0600

    drm/via: Tweak VRAM size determination for K8M890 chipset family
    
    Signed-off-by: Kevin Brace <kevinbr...@bracecomputerlab.com>

diff --git a/drivers/gpu/drm/via/via_init.c b/drivers/gpu/drm/via/via_init.c
index c700c4b2ea59..39dda8bf81d5 100644
--- a/drivers/gpu/drm/via/via_init.c
+++ b/drivers/gpu/drm/via/via_init.c
@@ -1010,8 +1010,8 @@ static int via_vram_init(struct drm_device *dev)
                        }
 
                        dev_priv->vram_size = (1 << ((size & 0x70) >> 4)) << 20;
-                       if (bridge_fn0_dev->device ==
-                                               PCI_DEVICE_ID_VIA_VT3336) {
+                       if (bridge_fn0_dev->device !=
+                                               PCI_DEVICE_ID_VIA_8380_0) {
                                dev_priv->vram_size <<= 2;
                        }
 
commit fcf4b8dee10968878b5416708c3c3de091b7ecbc
Author: Kevin Brace <kevinbr...@bracecomputerlab.com>
Date:   Mon Jan 15 18:15:57 2024 -0600

    drm/via: Tweaking the major switch statement inside via_vram_init()
    
    Signed-off-by: Kevin Brace <kevinbr...@bracecomputerlab.com>

diff --git a/drivers/gpu/drm/via/via_init.c b/drivers/gpu/drm/via/via_init.c
index 41b71cd6053a..c700c4b2ea59 100644
--- a/drivers/gpu/drm/via/via_init.c
+++ b/drivers/gpu/drm/via/via_init.c
@@ -953,36 +953,45 @@ static int via_vram_init(struct drm_device *dev)
                /* CLE266 */
                case PCI_DEVICE_ID_VIA_862X_0:
                        ret = cle266_mem_type(dev);
-                       if (ret)
+                       if (ret) {
                                goto exit;
+                       }
 
                        ret = pci_read_config_byte(bridge_fn0_dev, 0xe1, &size);
-                       if (ret)
+                       if (ret) {
                                goto error_pci_cfg_read;
+                       }
+
                        dev_priv->vram_size = (1 << ((size & 0x70) >> 4)) << 20;
                        break;
 
                /* KM400(A) / KN400(A) */
                case PCI_DEVICE_ID_VIA_8378_0:
                        ret = km400_mem_type(dev);
-                       if (ret)
+                       if (ret) {
                                goto exit;
+                       }
 
                        ret = pci_read_config_byte(bridge_fn0_dev, 0xe1, &size);
-                       if (ret)
+                       if (ret) {
                                goto error_pci_cfg_read;
+                       }
+
                        dev_priv->vram_size = (1 << ((size & 0x70) >> 4)) << 20;
                        break;
 
                /* P4M800 */
                case PCI_DEVICE_ID_VIA_3296_0:
                        ret = p4m800_mem_type(dev);
-                       if (ret)
+                       if (ret) {
                                goto exit;
+                       }
 
                        ret = pci_read_config_byte(bridge_fn3_dev, 0xa1, &size);
-                       if (ret)
+                       if (ret) {
                                goto error_pci_cfg_read;
+                       }
+
                        dev_priv->vram_size = (1 << ((size & 0x70) >> 4)) << 20;
                        break;
 
@@ -991,27 +1000,35 @@ static int via_vram_init(struct drm_device *dev)
                /* K8M890 / K8N890 */
                case PCI_DEVICE_ID_VIA_VT3336:
                        ret = km8xx_mem_type(dev);
-                       if (ret)
+                       if (ret) {
                                goto exit;
+                       }
 
                        ret = pci_read_config_byte(bridge_fn3_dev, 0xa1, &size);
-                       if (ret)
+                       if (ret) {
                                goto error_pci_cfg_read;
-                       dev_priv->vram_size = (1 << ((size & 0x70) >> 4)) << 20;
+                       }
 
-                       if (bridge_fn0_dev->device == PCI_DEVICE_ID_VIA_VT3336)
+                       dev_priv->vram_size = (1 << ((size & 0x70) >> 4)) << 20;
+                       if (bridge_fn0_dev->device ==
+                                               PCI_DEVICE_ID_VIA_VT3336) {
                                dev_priv->vram_size <<= 2;
+                       }
+
                        break;
 
                /* CN400 / PM800 / PN800 / PM880 / PN880 */
                case PCI_DEVICE_ID_VIA_PX8X0_0:
                        ret = cn400_mem_type(dev);
-                       if (ret)
+                       if (ret) {
                                goto exit;
+                       }
 
                        ret = pci_read_config_byte(bridge_fn3_dev, 0xa1, &size);
-                       if (ret)
+                       if (ret) {
                                goto error_pci_cfg_read;
+                       }
+
                        dev_priv->vram_size = (1 << ((size & 0x70) >> 4)) << 20;
                        break;
 
@@ -1028,28 +1045,35 @@ static int via_vram_init(struct drm_device *dev)
                /* VX855 / VX875 */
                case PCI_DEVICE_ID_VIA_VX855_HB:
                        ret = cn700_mem_type(dev);
-                       if (ret)
+                       if (ret) {
                                goto exit;
+                       }
 
                        ret = pci_read_config_byte(bridge_fn3_dev, 0xa1, &size);
-                       if (ret)
+                       if (ret) {
                                goto error_pci_cfg_read;
-                       dev_priv->vram_size = (1 << ((size & 0x70) >> 4)) << 20;
+                       }
 
+                       dev_priv->vram_size = (1 << ((size & 0x70) >> 4)) << 20;
                        if (bridge_fn0_dev->device !=
-                                               PCI_DEVICE_ID_VIA_P4M800CE)
+                                               PCI_DEVICE_ID_VIA_P4M800CE) {
                                dev_priv->vram_size <<= 2;
+                       }
+
                        break;
 
                /* VX900(H) */
                case PCI_DEVICE_ID_VIA_VX900_HB:
                        ret = vx900_mem_type(dev);
-                       if (ret)
+                       if (ret) {
                                goto exit;
+                       }
 
                        ret = pci_read_config_byte(bridge_fn3_dev, 0xa1, &size);
-                       if (ret)
+                       if (ret) {
                                goto error_pci_cfg_read;
+                       }
+
                        dev_priv->vram_size = (1 << ((size & 0x70) >> 4)) << 22;
                        break;
 
@@ -1057,7 +1081,7 @@ static int via_vram_init(struct drm_device *dev)
                        ret = -ENODEV;
                        drm_err(dev, "Unknown Host Bridge device: 0x%04x\n",
                                bridge_fn0_dev->device);
-                       goto exit;
+                       break;
                }
 
                break;
commit 4a3cf24681f6dcbf8317fd4de89b461e44d945ea
Author: Kevin Brace <kevinbr...@bracecomputerlab.com>
Date:   Mon Jan 15 18:15:54 2024 -0600

    drm/via: Stop the use of pci_get_slot() to find relevant PCI devices
    
    pci_get_domain_bus_and_slot() is easier to use and there is no need
    to call pci_dev_put() before exit.  This simplifies via_vram_init().
    
    Signed-off-by: Kevin Brace <kevinbr...@bracecomputerlab.com>

diff --git a/drivers/gpu/drm/via/via_init.c b/drivers/gpu/drm/via/via_init.c
index 09bdd1e25fc1..41b71cd6053a 100644
--- a/drivers/gpu/drm/via/via_init.c
+++ b/drivers/gpu/drm/via/via_init.c
@@ -915,54 +915,50 @@ static void via_quirks_init(struct drm_device *dev)
 
 static int via_vram_init(struct drm_device *dev)
 {
-       struct pci_dev *pdev = to_pci_dev(dev->dev);
-       struct pci_bus *bus;
-       struct pci_dev *hb_fn0 = NULL;
-       struct pci_dev *hb_fn3 = NULL;
+       struct pci_dev *gfx_dev = to_pci_dev(dev->dev);
+       struct pci_dev *bridge_fn0_dev = NULL;
+       struct pci_dev *bridge_fn3_dev = NULL;
        char *name = "unknown";
        struct via_drm_priv *dev_priv = to_via_drm_priv(dev);
        u8 size;
        int ret = 0;
 
-       drm_dbg_driver(dev, "Entered %s.\n", __func__);
-
-       bus = pci_find_bus(0, 0);
-       if (!bus) {
-               ret = -ENODEV;
-               drm_err(dev, "PCI bus not found!\n");
-               goto exit;
-       }
-
-       hb_fn0 = pci_get_slot(bus, PCI_DEVFN(0, 0));
-       if (!hb_fn0) {
+       bridge_fn0_dev =
+               pci_get_domain_bus_and_slot(pci_domain_nr(gfx_dev->bus), 0,
+                                               PCI_DEVFN(0, 0));
+       if (!bridge_fn0_dev) {
                ret = -ENODEV;
-               drm_err(dev, "Host Bridge Function 0 not found!\n");
+               drm_err(dev, "Host Bridge Function 0 not found! "
+                               "errno: %d\n", ret);
                goto exit;
        }
 
-       if ((pdev->device != PCI_DEVICE_ID_VIA_CLE266_GFX) ||
-               (pdev->device != PCI_DEVICE_ID_VIA_KM400_GFX)) {
-               hb_fn3 = pci_get_slot(bus, PCI_DEVFN(0, 3));
-               if (!hb_fn3) {
+       if ((gfx_dev->device != PCI_DEVICE_ID_VIA_CLE266_GFX) ||
+               (gfx_dev->device != PCI_DEVICE_ID_VIA_KM400_GFX)) {
+               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!\n");
-                       goto error_hb_fn0;
+                       drm_err(dev, "Host Bridge Function 3 not found! "
+                                       "errno: %d\n", ret);
+                       goto exit;
                }
        }
 
-       switch (hb_fn0->vendor) {
+       switch (bridge_fn0_dev->vendor) {
        case PCI_VENDOR_ID_VIA:
-               switch (hb_fn0->device) {
+               switch (bridge_fn0_dev->device) {
 
                /* CLE266 */
                case PCI_DEVICE_ID_VIA_862X_0:
                        ret = cle266_mem_type(dev);
                        if (ret)
-                               goto error_hb_fn0;
+                               goto exit;
 
-                       ret = pci_read_config_byte(hb_fn0, 0xe1, &size);
+                       ret = pci_read_config_byte(bridge_fn0_dev, 0xe1, &size);
                        if (ret)
-                               goto error_hb_fn0;
+                               goto error_pci_cfg_read;
                        dev_priv->vram_size = (1 << ((size & 0x70) >> 4)) << 20;
                        break;
 
@@ -970,11 +966,11 @@ static int via_vram_init(struct drm_device *dev)
                case PCI_DEVICE_ID_VIA_8378_0:
                        ret = km400_mem_type(dev);
                        if (ret)
-                               goto error_hb_fn0;
+                               goto exit;
 
-                       ret = pci_read_config_byte(hb_fn0, 0xe1, &size);
+                       ret = pci_read_config_byte(bridge_fn0_dev, 0xe1, &size);
                        if (ret)
-                               goto error_hb_fn0;
+                               goto error_pci_cfg_read;
                        dev_priv->vram_size = (1 << ((size & 0x70) >> 4)) << 20;
                        break;
 
@@ -982,11 +978,11 @@ static int via_vram_init(struct drm_device *dev)
                case PCI_DEVICE_ID_VIA_3296_0:
                        ret = p4m800_mem_type(dev);
                        if (ret)
-                               goto error_hb_fn3;
+                               goto exit;
 
-                       ret = pci_read_config_byte(hb_fn3, 0xa1, &size);
+                       ret = pci_read_config_byte(bridge_fn3_dev, 0xa1, &size);
                        if (ret)
-                               goto error_hb_fn3;
+                               goto error_pci_cfg_read;
                        dev_priv->vram_size = (1 << ((size & 0x70) >> 4)) << 20;
                        break;
 
@@ -996,14 +992,14 @@ static int via_vram_init(struct drm_device *dev)
                case PCI_DEVICE_ID_VIA_VT3336:
                        ret = km8xx_mem_type(dev);
                        if (ret)
-                               goto error_hb_fn3;
+                               goto exit;
 
-                       ret = pci_read_config_byte(hb_fn3, 0xa1, &size);
+                       ret = pci_read_config_byte(bridge_fn3_dev, 0xa1, &size);
                        if (ret)
-                               goto error_hb_fn3;
+                               goto error_pci_cfg_read;
                        dev_priv->vram_size = (1 << ((size & 0x70) >> 4)) << 20;
 
-                       if (hb_fn0->device == PCI_DEVICE_ID_VIA_VT3336)
+                       if (bridge_fn0_dev->device == PCI_DEVICE_ID_VIA_VT3336)
                                dev_priv->vram_size <<= 2;
                        break;
 
@@ -1011,11 +1007,11 @@ static int via_vram_init(struct drm_device *dev)
                case PCI_DEVICE_ID_VIA_PX8X0_0:
                        ret = cn400_mem_type(dev);
                        if (ret)
-                               goto error_hb_fn3;
+                               goto exit;
 
-                       ret = pci_read_config_byte(hb_fn3, 0xa1, &size);
+                       ret = pci_read_config_byte(bridge_fn3_dev, 0xa1, &size);
                        if (ret)
-                               goto error_hb_fn3;
+                               goto error_pci_cfg_read;
                        dev_priv->vram_size = (1 << ((size & 0x70) >> 4)) << 20;
                        break;
 
@@ -1033,14 +1029,15 @@ static int via_vram_init(struct drm_device *dev)
                case PCI_DEVICE_ID_VIA_VX855_HB:
                        ret = cn700_mem_type(dev);
                        if (ret)
-                               goto error_hb_fn3;
+                               goto exit;
 
-                       ret = pci_read_config_byte(hb_fn3, 0xa1, &size);
+                       ret = pci_read_config_byte(bridge_fn3_dev, 0xa1, &size);
                        if (ret)
-                               goto error_hb_fn3;
+                               goto error_pci_cfg_read;
                        dev_priv->vram_size = (1 << ((size & 0x70) >> 4)) << 20;
 
-                       if (hb_fn0->device != PCI_DEVICE_ID_VIA_P4M800CE)
+                       if (bridge_fn0_dev->device !=
+                                               PCI_DEVICE_ID_VIA_P4M800CE)
                                dev_priv->vram_size <<= 2;
                        break;
 
@@ -1048,31 +1045,31 @@ static int via_vram_init(struct drm_device *dev)
                case PCI_DEVICE_ID_VIA_VX900_HB:
                        ret = vx900_mem_type(dev);
                        if (ret)
-                               goto error_hb_fn3;
+                               goto exit;
 
-                       ret = pci_read_config_byte(hb_fn3, 0xa1, &size);
+                       ret = pci_read_config_byte(bridge_fn3_dev, 0xa1, &size);
                        if (ret)
-                               goto error_hb_fn3;
+                               goto error_pci_cfg_read;
                        dev_priv->vram_size = (1 << ((size & 0x70) >> 4)) << 22;
                        break;
 
                default:
                        ret = -ENODEV;
                        drm_err(dev, "Unknown Host Bridge device: 0x%04x\n",
-                               hb_fn0->device);
-                       goto error_hb_fn3;
+                               bridge_fn0_dev->device);
+                       goto exit;
                }
 
                break;
        default:
                ret = -ENODEV;
                drm_err(dev, "Unknown Host Bridge vendor: 0x%04x\n",
-                       hb_fn0->vendor);
+                       bridge_fn0_dev->vendor);
                break;
        }
 
        if (ret) {
-               goto error_hb_fn3;
+               goto exit;
        }
 
        switch (dev_priv->vram_type) {
@@ -1136,22 +1133,18 @@ static int via_vram_init(struct drm_device *dev)
 
        drm_dbg_driver(dev, "Found %s video RAM.\n", name);
 
-       if (pdev->device == PCI_DEVICE_ID_VIA_CHROME9_HD) {
-               dev_priv->vram_start = pci_resource_start(pdev, 2);
+       if (gfx_dev->device == PCI_DEVICE_ID_VIA_CHROME9_HD) {
+               dev_priv->vram_start = pci_resource_start(gfx_dev, 2);
        } else {
-               dev_priv->vram_start = pci_resource_start(pdev, 0);
+               dev_priv->vram_start = pci_resource_start(gfx_dev, 0);
        }
 
        /* Add an MTRR for the video RAM. */
        dev_priv->vram_mtrr = arch_phys_wc_add(dev_priv->vram_start,
                                                dev_priv->vram_size);
        goto exit;
-error_hb_fn3:
-       if (hb_fn3)
-               pci_dev_put(hb_fn3);
-error_hb_fn0:
-       if (hb_fn0)
-               pci_dev_put(hb_fn0);
+error_pci_cfg_read:
+       drm_err(dev, "PCI configuration space read error! errno: %d\n", ret);
 exit:
        drm_dbg_driver(dev, "Exiting %s.\n", __func__);
        return ret;
commit fb44aeb17b0879cfe47535c434f39e8208de3feb
Author: Kevin Brace <kevinbr...@bracecomputerlab.com>
Date:   Mon Jan 15 18:15:47 2024 -0600

    drm/via: Set vram_start member of via_drm_priv{} after it is safe to do so
    
    Signed-off-by: Kevin Brace <kevinbr...@bracecomputerlab.com>

diff --git a/drivers/gpu/drm/via/via_init.c b/drivers/gpu/drm/via/via_init.c
index 68308f463d07..09bdd1e25fc1 100644
--- a/drivers/gpu/drm/via/via_init.c
+++ b/drivers/gpu/drm/via/via_init.c
@@ -950,12 +950,6 @@ static int via_vram_init(struct drm_device *dev)
                }
        }
 
-       if (pdev->device == PCI_DEVICE_ID_VIA_CHROME9_HD) {
-               dev_priv->vram_start = pci_resource_start(pdev, 2);
-       } else {
-               dev_priv->vram_start = pci_resource_start(pdev, 0);
-       }
-
        switch (hb_fn0->vendor) {
        case PCI_VENDOR_ID_VIA:
                switch (hb_fn0->device) {
@@ -1142,6 +1136,12 @@ static int via_vram_init(struct drm_device *dev)
 
        drm_dbg_driver(dev, "Found %s video RAM.\n", name);
 
+       if (pdev->device == PCI_DEVICE_ID_VIA_CHROME9_HD) {
+               dev_priv->vram_start = pci_resource_start(pdev, 2);
+       } else {
+               dev_priv->vram_start = pci_resource_start(pdev, 0);
+       }
+
        /* Add an MTRR for the video RAM. */
        dev_priv->vram_mtrr = arch_phys_wc_add(dev_priv->vram_start,
                                                dev_priv->vram_size);
commit 5192b008c6473eca75d55bda18633d33503db7b2
Author: Kevin Brace <kevinbr...@bracecomputerlab.com>
Date:   Mon Jan 15 18:15:38 2024 -0600

    drm/via: Check for VIA Technologies PCI Vendor ID before device detection
    
    Both Vendor ID and Device ID will be checked before memory size and
    type detection.
    
    Signed-off-by: Kevin Brace <kevinbr...@bracecomputerlab.com>

diff --git a/drivers/gpu/drm/via/via_init.c b/drivers/gpu/drm/via/via_init.c
index ff8d2d3a5732..68308f463d07 100644
--- a/drivers/gpu/drm/via/via_init.c
+++ b/drivers/gpu/drm/via/via_init.c
@@ -956,114 +956,128 @@ static int via_vram_init(struct drm_device *dev)
                dev_priv->vram_start = pci_resource_start(pdev, 0);
        }
 
-       switch (hb_fn0->device) {
-
-       /* CLE266 */
-       case PCI_DEVICE_ID_VIA_862X_0:
-               ret = cle266_mem_type(dev);
-               if (ret)
-                       goto error_hb_fn0;
-
-               ret = pci_read_config_byte(hb_fn0, 0xe1, &size);
-               if (ret)
-                       goto error_hb_fn0;
-               dev_priv->vram_size = (1 << ((size & 0x70) >> 4)) << 20;
-               break;
-
-       /* KM400(A) / KN400(A) */
-       case PCI_DEVICE_ID_VIA_8378_0:
-               ret = km400_mem_type(dev);
-               if (ret)
-                       goto error_hb_fn0;
-
-               ret = pci_read_config_byte(hb_fn0, 0xe1, &size);
-               if (ret)
-                       goto error_hb_fn0;
-               dev_priv->vram_size = (1 << ((size & 0x70) >> 4)) << 20;
-               break;
+       switch (hb_fn0->vendor) {
+       case PCI_VENDOR_ID_VIA:
+               switch (hb_fn0->device) {
+
+               /* CLE266 */
+               case PCI_DEVICE_ID_VIA_862X_0:
+                       ret = cle266_mem_type(dev);
+                       if (ret)
+                               goto error_hb_fn0;
+
+                       ret = pci_read_config_byte(hb_fn0, 0xe1, &size);
+                       if (ret)
+                               goto error_hb_fn0;
+                       dev_priv->vram_size = (1 << ((size & 0x70) >> 4)) << 20;
+                       break;
 
-       /* P4M800 */
-       case PCI_DEVICE_ID_VIA_3296_0:
-               ret = p4m800_mem_type(dev);
-               if (ret)
-                       goto error_hb_fn3;
+               /* KM400(A) / KN400(A) */
+               case PCI_DEVICE_ID_VIA_8378_0:
+                       ret = km400_mem_type(dev);
+                       if (ret)
+                               goto error_hb_fn0;
 
-               ret = pci_read_config_byte(hb_fn3, 0xa1, &size);
-               if (ret)
-                       goto error_hb_fn3;
-               dev_priv->vram_size = (1 << ((size & 0x70) >> 4)) << 20;
-               break;
+                       ret = pci_read_config_byte(hb_fn0, 0xe1, &size);
+                       if (ret)
+                               goto error_hb_fn0;
+                       dev_priv->vram_size = (1 << ((size & 0x70) >> 4)) << 20;
+                       break;
 
-       /* K8M800(A) / K8N800(A) */
-       case PCI_DEVICE_ID_VIA_8380_0:
-       /* K8M890 / K8N890 */
-       case PCI_DEVICE_ID_VIA_VT3336:
-               ret = km8xx_mem_type(dev);
-               if (ret)
-                       goto error_hb_fn3;
+               /* P4M800 */
+               case PCI_DEVICE_ID_VIA_3296_0:
+                       ret = p4m800_mem_type(dev);
+                       if (ret)
+                               goto error_hb_fn3;
 
-               ret = pci_read_config_byte(hb_fn3, 0xa1, &size);
-               if (ret)
-                       goto error_hb_fn3;
-               dev_priv->vram_size = (1 << ((size & 0x70) >> 4)) << 20;
+                       ret = pci_read_config_byte(hb_fn3, 0xa1, &size);
+                       if (ret)
+                               goto error_hb_fn3;
+                       dev_priv->vram_size = (1 << ((size & 0x70) >> 4)) << 20;
+                       break;
 
-               if (hb_fn0->device == PCI_DEVICE_ID_VIA_VT3336)
-                       dev_priv->vram_size <<= 2;
-               break;
+               /* K8M800(A) / K8N800(A) */
+               case PCI_DEVICE_ID_VIA_8380_0:
+               /* K8M890 / K8N890 */
+               case PCI_DEVICE_ID_VIA_VT3336:
+                       ret = km8xx_mem_type(dev);
+                       if (ret)
+                               goto error_hb_fn3;
+
+                       ret = pci_read_config_byte(hb_fn3, 0xa1, &size);
+                       if (ret)
+                               goto error_hb_fn3;
+                       dev_priv->vram_size = (1 << ((size & 0x70) >> 4)) << 20;
+
+                       if (hb_fn0->device == PCI_DEVICE_ID_VIA_VT3336)
+                               dev_priv->vram_size <<= 2;
+                       break;
 
-       /* CN400 / PM800 / PN800 / PM880 / PN880 */
-       case PCI_DEVICE_ID_VIA_PX8X0_0:
-               ret = cn400_mem_type(dev);
-               if (ret)
-                       goto error_hb_fn3;
+               /* CN400 / PM800 / PN800 / PM880 / PN880 */
+               case PCI_DEVICE_ID_VIA_PX8X0_0:
+                       ret = cn400_mem_type(dev);
+                       if (ret)
+                               goto error_hb_fn3;
 
-               ret = pci_read_config_byte(hb_fn3, 0xa1, &size);
-               if (ret)
-                       goto error_hb_fn3;
-               dev_priv->vram_size = (1 << ((size & 0x70) >> 4)) << 20;
-               break;
+                       ret = pci_read_config_byte(hb_fn3, 0xa1, &size);
+                       if (ret)
+                               goto error_hb_fn3;
+                       dev_priv->vram_size = (1 << ((size & 0x70) >> 4)) << 20;
+                       break;
 
-       /* P4M800CE / P4M800 Pro / VN800 / CN700 */
-       case PCI_DEVICE_ID_VIA_P4M800CE:
-       /* P4M890 / VN890 / CN800 */
-       case PCI_DEVICE_ID_VIA_P4M890:
-       /* CX700(M / M2) / VX700(M / M2) */
-       case PCI_DEVICE_ID_VIA_VT3324:
-       /* P4M900 / VN896 / CN896 */
-       case PCI_DEVICE_ID_VIA_VT3364:
-       /* VX800 / VX820 */
-       case PCI_DEVICE_ID_VIA_VX800_HB:
-       /* VX855 / VX875 */
-       case PCI_DEVICE_ID_VIA_VX855_HB:
-               ret = cn700_mem_type(dev);
-               if (ret)
-                       goto error_hb_fn3;
+               /* P4M800CE / P4M800 Pro / VN800 / CN700 */
+               case PCI_DEVICE_ID_VIA_P4M800CE:
+               /* P4M890 / VN890 / CN800 */
+               case PCI_DEVICE_ID_VIA_P4M890:
+               /* CX700(M / M2) / VX700(M / M2) */
+               case PCI_DEVICE_ID_VIA_VT3324:
+               /* P4M900 / VN896 / CN896 */
+               case PCI_DEVICE_ID_VIA_VT3364:
+               /* VX800 / VX820 */
+               case PCI_DEVICE_ID_VIA_VX800_HB:
+               /* VX855 / VX875 */
+               case PCI_DEVICE_ID_VIA_VX855_HB:
+                       ret = cn700_mem_type(dev);
+                       if (ret)
+                               goto error_hb_fn3;
+
+                       ret = pci_read_config_byte(hb_fn3, 0xa1, &size);
+                       if (ret)
+                               goto error_hb_fn3;
+                       dev_priv->vram_size = (1 << ((size & 0x70) >> 4)) << 20;
+
+                       if (hb_fn0->device != PCI_DEVICE_ID_VIA_P4M800CE)
+                               dev_priv->vram_size <<= 2;
+                       break;
 
-               ret = pci_read_config_byte(hb_fn3, 0xa1, &size);
-               if (ret)
-                       goto error_hb_fn3;
-               dev_priv->vram_size = (1 << ((size & 0x70) >> 4)) << 20;
+               /* VX900(H) */
+               case PCI_DEVICE_ID_VIA_VX900_HB:
+                       ret = vx900_mem_type(dev);
+                       if (ret)
+                               goto error_hb_fn3;
 
-               if (hb_fn0->device != PCI_DEVICE_ID_VIA_P4M800CE)
-                       dev_priv->vram_size <<= 2;
-               break;
+                       ret = pci_read_config_byte(hb_fn3, 0xa1, &size);
+                       if (ret)
+                               goto error_hb_fn3;
+                       dev_priv->vram_size = (1 << ((size & 0x70) >> 4)) << 22;
+                       break;
 
-       /* VX900(H) */
-       case PCI_DEVICE_ID_VIA_VX900_HB:
-               ret = vx900_mem_type(dev);
-               if (ret)
+               default:
+                       ret = -ENODEV;
+                       drm_err(dev, "Unknown Host Bridge device: 0x%04x\n",
+                               hb_fn0->device);
                        goto error_hb_fn3;
+               }
 
-               ret = pci_read_config_byte(hb_fn3, 0xa1, &size);
-               if (ret)
-                       goto error_hb_fn3;
-               dev_priv->vram_size = (1 << ((size & 0x70) >> 4)) << 22;
                break;
-
        default:
                ret = -ENODEV;
-               drm_err(dev, "Unknown Host Bridge device: 0x%04x\n",
-                               hb_fn0->device);
+               drm_err(dev, "Unknown Host Bridge vendor: 0x%04x\n",
+                       hb_fn0->vendor);
+               break;
+       }
+
+       if (ret) {
                goto error_hb_fn3;
        }
 
commit ca54e20c8ce4cdb37e65be267dae55c05486dde3
Author: Kevin Brace <kevinbr...@bracecomputerlab.com>
Date:   Mon Jan 15 18:15:35 2024 -0600

    drm/via: Call *_mem_type() before figuring out the VRAM size
    
    Signed-off-by: Kevin Brace <kevinbr...@bracecomputerlab.com>

diff --git a/drivers/gpu/drm/via/via_init.c b/drivers/gpu/drm/via/via_init.c
index acea4e610609..ff8d2d3a5732 100644
--- a/drivers/gpu/drm/via/via_init.c
+++ b/drivers/gpu/drm/via/via_init.c
@@ -998,6 +998,10 @@ static int via_vram_init(struct drm_device *dev)
        case PCI_DEVICE_ID_VIA_8380_0:
        /* K8M890 / K8N890 */
        case PCI_DEVICE_ID_VIA_VT3336:
+               ret = km8xx_mem_type(dev);
+               if (ret)
+                       goto error_hb_fn3;
+
                ret = pci_read_config_byte(hb_fn3, 0xa1, &size);
                if (ret)
                        goto error_hb_fn3;
@@ -1005,22 +1009,18 @@ static int via_vram_init(struct drm_device *dev)
 
                if (hb_fn0->device == PCI_DEVICE_ID_VIA_VT3336)
                        dev_priv->vram_size <<= 2;
-
-               ret = km8xx_mem_type(dev);
-               if (ret)
-                       goto error_hb_fn3;
                break;
 
        /* CN400 / PM800 / PN800 / PM880 / PN880 */
        case PCI_DEVICE_ID_VIA_PX8X0_0:
-               ret = pci_read_config_byte(hb_fn3, 0xa1, &size);
+               ret = cn400_mem_type(dev);
                if (ret)
                        goto error_hb_fn3;
-               dev_priv->vram_size = (1 << ((size & 0x70) >> 4)) << 20;
 
-               ret = cn400_mem_type(dev);
+               ret = pci_read_config_byte(hb_fn3, 0xa1, &size);
                if (ret)
                        goto error_hb_fn3;
+               dev_priv->vram_size = (1 << ((size & 0x70) >> 4)) << 20;
                break;
 
        /* P4M800CE / P4M800 Pro / VN800 / CN700 */
@@ -1035,6 +1035,10 @@ static int via_vram_init(struct drm_device *dev)
        case PCI_DEVICE_ID_VIA_VX800_HB:
        /* VX855 / VX875 */
        case PCI_DEVICE_ID_VIA_VX855_HB:
+               ret = cn700_mem_type(dev);
+               if (ret)
+                       goto error_hb_fn3;
+
                ret = pci_read_config_byte(hb_fn3, 0xa1, &size);
                if (ret)
                        goto error_hb_fn3;
@@ -1042,22 +1046,18 @@ static int via_vram_init(struct drm_device *dev)
 
                if (hb_fn0->device != PCI_DEVICE_ID_VIA_P4M800CE)
                        dev_priv->vram_size <<= 2;
-
-               ret = cn700_mem_type(dev);
-               if (ret)
-                       goto error_hb_fn3;
                break;
 
        /* VX900(H) */
        case PCI_DEVICE_ID_VIA_VX900_HB:
-               ret = pci_read_config_byte(hb_fn3, 0xa1, &size);
+               ret = vx900_mem_type(dev);
                if (ret)
                        goto error_hb_fn3;
-               dev_priv->vram_size = (1 << ((size & 0x70) >> 4)) << 22;
 
-               ret = vx900_mem_type(dev);
+               ret = pci_read_config_byte(hb_fn3, 0xa1, &size);
                if (ret)
                        goto error_hb_fn3;
+               dev_priv->vram_size = (1 << ((size & 0x70) >> 4)) << 22;
                break;
 
        default:
commit 3a04a5d77489b7f34953ddb8aa28ea367885e99a
Author: Kevin Brace <kevinbr...@bracecomputerlab.com>
Date:   Mon Jan 15 18:15:35 2024 -0600

    drm/via: Updates to vx900_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 <kevinbr...@bracecomputerlab.com>

diff --git a/drivers/gpu/drm/via/via_init.c b/drivers/gpu/drm/via/via_init.c
index ba713df8c7ad..acea4e610609 100644
--- a/drivers/gpu/drm/via/via_init.c
+++ b/drivers/gpu/drm/via/via_init.c
@@ -762,75 +762,100 @@ exit:
        return ret;
 }
 
-static int vx900_mem_type(struct drm_device *dev,
-                               struct pci_dev *fn3)
+static int vx900_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, volt;
        int ret;
-       u8 clock, type, volt;
-
-       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;
+       }
+
        volt = type;
        type &= 0xc0;
        type >>= 6;
        volt &= 0x20;
        volt >>= 5;
-
        switch (type) {
-       case 1:
+       case 0x01:
                switch (clock & 0x0f) {
-               case 0:
-                       if (volt)
+               case 0x00:
+                       if (volt) {
                                dev_priv->vram_type = VIA_MEM_DDR2_800;
-                       else
+                       } else {
                                dev_priv->vram_type = VIA_MEM_DDR2_533;
+                       }
+
                        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;
-               case 7:
+               case 0x07:
                        dev_priv->vram_type = VIA_MEM_DDR2_1066;
                        break;
                default:
                        break;
                }
+
                break;
-       case 2:
+       case 0x02:
                switch (clock & 0x0f) {
-               case 0:
-                       if (volt)
+               case 0x00:
+                       if (volt) {
                                dev_priv->vram_type = VIA_MEM_DDR3_800;
-                       else
+                       } else {
                                dev_priv->vram_type = VIA_MEM_DDR3_533;
+                       }
+
                        break;
-               case 4:
+               case 0x04:
                        dev_priv->vram_type = VIA_MEM_DDR3_533;
                        break;
-               case 5:
+               case 0x05:
                        dev_priv->vram_type = VIA_MEM_DDR3_667;
                        break;
-               case 6:
+               case 0x06:
                        dev_priv->vram_type = VIA_MEM_DDR3_800;
                        break;
-               case 7:
+               case 0x07:
                        dev_priv->vram_type = VIA_MEM_DDR3_1066;
                        break;
                default:
                        break;
                }
+
                break;
        }
+
+       goto exit;
+error_pci_cfg_read:
+       drm_err(dev, "PCI configuration space read error! errno: %d\n", ret);
+exit:
        return ret;
 }
 
@@ -1023,14 +1048,14 @@ static int via_vram_init(struct drm_device *dev)
                        goto error_hb_fn3;
                break;
 
-       /* VX900 */
+       /* VX900(H) */
        case PCI_DEVICE_ID_VIA_VX900_HB:
                ret = pci_read_config_byte(hb_fn3, 0xa1, &size);
                if (ret)
                        goto error_hb_fn3;
                dev_priv->vram_size = (1 << ((size & 0x70) >> 4)) << 22;
 
-               ret = vx900_mem_type(dev, hb_fn3);
+               ret = vx900_mem_type(dev);
                if (ret)
                        goto error_hb_fn3;
                break;
commit 4b7c1dc483916ef9b78e56dd9868bd9991809567
Author: Kevin Brace <kevinbr...@bracecomputerlab.com>
Date:   Mon Jan 15 18:15:31 2024 -0600

    drm/via: Merge cn700_mem_type() and p4m900_mem_type()
    
    p4m900_mem_type() code will be retained with cn700_mem_type() name.
    This should allow P4M900 chipset family to properly recognize DDR2-667.
    
    Signed-off-by: Kevin Brace <kevinbr...@bracecomputerlab.com>

diff --git a/drivers/gpu/drm/via/via_init.c b/drivers/gpu/drm/via/via_init.c
index a434f9f94e3d..ba713df8c7ad 100644
--- a/drivers/gpu/drm/via/via_init.c
+++ b/drivers/gpu/drm/via/via_init.c
@@ -710,80 +710,6 @@ static int cn700_mem_type(struct drm_device *dev)
                goto error_pci_cfg_read;
        }
 
-       type &= 0x40;
-       type >>= 6;
-       switch (type) {
-       case 0x00:
-               switch (clock & 0x07) {
-               case 0x00:
-                       dev_priv->vram_type = VIA_MEM_DDR_200;
-                       break;
-               case 0x01:
-                       dev_priv->vram_type = VIA_MEM_DDR_266;
-                       break;
-               case 0x02:
-                       dev_priv->vram_type = VIA_MEM_DDR_333;
-                       break;
-               case 0x03:
-                       dev_priv->vram_type = VIA_MEM_DDR_400;
-                       break;
-               default:
-                       break;
-               }
-
-               break;
-       case 0x01:
-               switch (clock & 0x07) {
-               case 0x03:
-                       dev_priv->vram_type = VIA_MEM_DDR2_400;
-                       break;
-               case 0x04:
-                       dev_priv->vram_type = VIA_MEM_DDR2_533;
-                       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;
-}
-
-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;
-
-       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) {
@@ -1078,19 +1004,6 @@ static int via_vram_init(struct drm_device *dev)
        case PCI_DEVICE_ID_VIA_P4M890:
        /* CX700(M / M2) / VX700(M / M2) */
        case PCI_DEVICE_ID_VIA_VT3324:
-               ret = pci_read_config_byte(hb_fn3, 0xa1, &size);
-               if (ret)
-                       goto error_hb_fn3;
-               dev_priv->vram_size = (1 << ((size & 0x70) >> 4)) << 20;
-
-               if (hb_fn0->device != PCI_DEVICE_ID_VIA_P4M800CE)
-                       dev_priv->vram_size <<= 2;
-
-               ret = cn700_mem_type(dev);
-               if (ret)
-                       goto error_hb_fn3;
-               break;
-
        /* P4M900 / VN896 / CN896 */
        case PCI_DEVICE_ID_VIA_VT3364:
        /* VX800 / VX820 */
@@ -1100,9 +1013,12 @@ static int via_vram_init(struct drm_device *dev)
                ret = pci_read_config_byte(hb_fn3, 0xa1, &size);
                if (ret)
                        goto error_hb_fn3;
-               dev_priv->vram_size = (1 << ((size & 0x70) >> 4)) << 22;
+               dev_priv->vram_size = (1 << ((size & 0x70) >> 4)) << 20;
 
-               ret = p4m900_mem_type(dev);
+               if (hb_fn0->device != PCI_DEVICE_ID_VIA_P4M800CE)
+                       dev_priv->vram_size <<= 2;
+
+               ret = cn700_mem_type(dev);
                if (ret)
                        goto error_hb_fn3;
                break;
commit 512c2ce3540acf63f200bd3a4bc5a7e97373fbe5
Author: Kevin Brace <kevinbr...@bracecomputerlab.com>
Date:   Mon Jan 15 18:15:31 2024 -0600

    drm/via: Use cn700_mem_type() for P4M890 and CX700 chipset families
    
    Signed-off-by: Kevin Brace <kevinbr...@bracecomputerlab.com>

diff --git a/drivers/gpu/drm/via/via_init.c b/drivers/gpu/drm/via/via_init.c
index 3c36a8b4252a..a434f9f94e3d 100644
--- a/drivers/gpu/drm/via/via_init.c
+++ b/drivers/gpu/drm/via/via_init.c
@@ -1074,6 +1074,10 @@ static int via_vram_init(struct drm_device *dev)
 
        /* P4M800CE / P4M800 Pro / VN800 / CN700 */
        case PCI_DEVICE_ID_VIA_P4M800CE:
+       /* P4M890 / VN890 / CN800 */
+       case PCI_DEVICE_ID_VIA_P4M890:
+       /* CX700(M / M2) / VX700(M / M2) */
+       case PCI_DEVICE_ID_VIA_VT3324:
                ret = pci_read_config_byte(hb_fn3, 0xa1, &size);
                if (ret)
                        goto error_hb_fn3;
@@ -1087,10 +1091,6 @@ static int via_vram_init(struct drm_device *dev)
                        goto error_hb_fn3;
                break;
 
-       /* CX700 / VX700 */
-       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 */
commit 6ba3573a4a111d1c0b2c6ce8499f07b21da9dcfb
Author: Kevin Brace <kevinbr...@bracecomputerlab.com>
Date:   Mon Jan 15 18:15:31 2024 -0600

    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 <kevinbr...@bracecomputerlab.com>

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;
commit 0fd6d34d55a13656bc4ef9c5e77dfe6c65119cdd
Author: Kevin Brace <kevinbr...@bracecomputerlab.com>
Date:   Mon Jan 15 18:15:30 2024 -0600

    drm/via: Updates to cn700_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 <kevinbr...@bracecomputerlab.com>

diff --git a/drivers/gpu/drm/via/via_init.c b/drivers/gpu/drm/via/via_init.c
index 40b130a921cf..f242ce7da9a1 100644
--- a/drivers/gpu/drm/via/via_init.c
+++ b/drivers/gpu/drm/via/via_init.c
@@ -682,16 +682,39 @@ exit:
        return ret;
 }
 
-static int cn700_mem_type(struct drm_device *dev,
-                               struct pci_dev *fn3)
+static int cn700_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;
-       u8 tmp;
 
-       ret = pci_read_config_byte(fn3, 0x90, &tmp);
-       if (!ret) {
-               switch (tmp & 0x07) {
+       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 0x00:
+               switch (clock & 0x07) {
                case 0x00:
                        dev_priv->vram_type = VIA_MEM_DDR_200;
                        break;
@@ -704,16 +727,32 @@ static int cn700_mem_type(struct drm_device *dev,
                case 0x03:
                        dev_priv->vram_type = VIA_MEM_DDR_400;
                        break;
-               case 0x04:
+               default:
+                       break;
+               }
+
+               break;
+       case 0x01:
+               switch (clock & 0x07) {
+               case 0x03:
                        dev_priv->vram_type = VIA_MEM_DDR2_400;
                        break;
-               case 0x05:
+               case 0x04:
                        dev_priv->vram_type = VIA_MEM_DDR2_533;
                        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;
 }
 
@@ -1025,7 +1064,7 @@ static int via_vram_init(struct drm_device *dev)
                if (hb_fn0->device != PCI_DEVICE_ID_VIA_P4M800CE)
                        dev_priv->vram_size <<= 2;
 
-               ret = cn700_mem_type(dev, hb_fn3);
+               ret = cn700_mem_type(dev);
                if (ret)
                        goto error_hb_fn3;
                break;
commit a2ead3a908c4db754939c669ec9436eef7ef4667
Author: Kevin Brace <kevinbr...@bracecomputerlab.com>
Date:   Mon Jan 15 18:15:29 2024 -0600

    drm/via: Drop recognizing 166 MHz FSB base clock inside cn400_mem_type()
    
    This frequency was never officially supported by this chipset, so
    stop recognizing it.
    
    Signed-off-by: Kevin Brace <kevinbr...@bracecomputerlab.com>

diff --git a/drivers/gpu/drm/via/via_init.c b/drivers/gpu/drm/via/via_init.c
index 97a89bbe7412..40b130a921cf 100644
--- a/drivers/gpu/drm/via/via_init.c
+++ b/drivers/gpu/drm/via/via_init.c
@@ -636,9 +636,6 @@ static int cn400_mem_type(struct drm_device *dev)
        case 0x01:
                freq = 0x04; /* 133 MHz */
                break;
-       case 0x03:
-               freq = 0x05; /* 166 MHz */
-               break;
        case 0x02:
                freq = 0x06; /* 200 MHz */
                break;
commit bbd499fc9da0d695e22695ff4d892f387b4c3ee3
Author: Kevin Brace <kevinbr...@bracecomputerlab.com>
Date:   Mon Jan 15 18:15:28 2024 -0600

    drm/via: Updates to cn400_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 <kevinbr...@bracecomputerlab.com>

diff --git a/drivers/gpu/drm/via/via_init.c b/drivers/gpu/drm/via/via_init.c
index 6ff53508c50e..97a89bbe7412 100644
--- a/drivers/gpu/drm/via/via_init.c
+++ b/drivers/gpu/drm/via/via_init.c
@@ -594,51 +594,72 @@ exit:
        return ret;
 }
 
-static int cn400_mem_type(struct drm_device *dev,
-                               struct pci_bus *bus,
-                               struct pci_dev *fn3)
+static int cn400_mem_type(struct drm_device *dev)
 {
+       struct pci_dev *gfx_dev = to_pci_dev(dev->dev);
+       struct pci_dev *bridge_fn2_dev, *bridge_fn3_dev;
        struct via_drm_priv *dev_priv = to_via_drm_priv(dev);
-       struct pci_dev *fn2 = pci_get_slot(bus, PCI_DEVFN(0, 2));
-       int ret, freq = 0;
-       u8 type, fsb;
+       int freq = 0;
+       u8 fsb, type;
+       int ret;
+
+       bridge_fn2_dev =
+               pci_get_domain_bus_and_slot(pci_domain_nr(gfx_dev->bus), 0,
+                                               PCI_DEVFN(0, 2));
+       if (!bridge_fn2_dev) {
+               ret = -ENODEV;
+               drm_err(dev, "Host Bridge Function 2 not found! errno: %d\n",
+                       ret);
+               goto exit;
+       }
+
+       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(fn2, 0x54, &fsb);
+       ret = pci_read_config_byte(bridge_fn2_dev, 0x54, &fsb);
        if (ret) {
-               pci_dev_put(fn2);
-               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(fn2);
 
-       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 & 0x01)
+       type &= 0x0f;
+       if (type & 0x01) {
                freq += 1 + (type >> 2);
-       else
+       } else {
                freq -= 1 + (type >> 2);
+       }
 
        switch (freq) {
        case 0x03:
@@ -656,6 +677,11 @@ static int cn400_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;
 }
 
@@ -978,14 +1004,14 @@ static int via_vram_init(struct drm_device *dev)
                        goto error_hb_fn3;
                break;
 
-       /* CN400 / PM800 / PM880 */
+       /* CN400 / PM800 / PN800 / PM880 / PN880 */
        case PCI_DEVICE_ID_VIA_PX8X0_0:
                ret = pci_read_config_byte(hb_fn3, 0xa1, &size);
                if (ret)
                        goto error_hb_fn3;
                dev_priv->vram_size = (1 << ((size & 0x70) >> 4)) << 20;
 
-               ret = cn400_mem_type(dev, bus, hb_fn3);
+               ret = cn400_mem_type(dev);
                if (ret)
                        goto error_hb_fn3;
                break;
commit 0365615533920e4a90bb796692a22a687cde3065
Author: Kevin Brace <kevinbr...@bracecomputerlab.com>
Date:   Mon Jan 15 18:15:25 2024 -0600

    drm/via: Updates to km8xx_mem_type()
    
    Minor updates to the function.  Improved its error handling
    within the function.
    
    Signed-off-by: Kevin Brace <kevinbr...@bracecomputerlab.com>

diff --git a/drivers/gpu/drm/via/via_init.c b/drivers/gpu/drm/via/via_init.c
index d25d21af0c4c..6ff53508c50e 100644
--- a/drivers/gpu/drm/via/via_init.c
+++ b/drivers/gpu/drm/via/via_init.c
@@ -443,20 +443,28 @@ exit:
 
 static int km8xx_mem_type(struct drm_device *dev)
 {
-       struct via_drm_priv *dev_priv = to_via_drm_priv(dev);
        struct pci_dev *dram, *misc = NULL;
-       int ret = -ENXIO;
+       struct via_drm_priv *dev_priv = to_via_drm_priv(dev);
        u8 type, tmp;
+       int ret = -ENXIO;
 
        dram = pci_get_device(PCI_VENDOR_ID_AMD,
-                       PCI_DEVICE_ID_AMD_K8_NB_MEMCTL, NULL);
+                               PCI_DEVICE_ID_AMD_K8_NB_MEMCTL, NULL);
        if (dram) {
                misc = pci_get_device(PCI_VENDOR_ID_AMD,
-                               PCI_DEVICE_ID_AMD_K8_NB_MISC, NULL);
+                                       PCI_DEVICE_ID_AMD_K8_NB_MISC, NULL);
 
                ret = pci_read_config_byte(misc, 0xfd, &type);
+               if (ret) {
+                       goto error_pci_cfg_read;
+               }
+
                if (type) {
                        pci_read_config_byte(dram, 0x94, &type);
+                       if (ret) {
+                               goto error_pci_cfg_read;
+                       }
+
                        switch (type & 0x03) {
                        case 0x00:
                                dev_priv->vram_type = VIA_MEM_DDR2_400;
@@ -475,8 +483,10 @@ static int km8xx_mem_type(struct drm_device *dev)
                        }
                } else {
                        ret = pci_read_config_byte(dram, 0x96, &type);
-                       if (ret)
-                               return ret;
+                       if (ret) {
+                               goto error_pci_cfg_read;
+                       }
+
                        type >>= 4;
                        type &= 0x07;
 
@@ -501,14 +511,17 @@ static int km8xx_mem_type(struct drm_device *dev)
 
        /* AMD 10h DRAM Controller */
        dram = pci_get_device(PCI_VENDOR_ID_AMD,
-                       PCI_DEVICE_ID_AMD_10H_NB_DRAM, NULL);
+                               PCI_DEVICE_ID_AMD_10H_NB_DRAM, NULL);
        if (dram) {
                ret = pci_read_config_byte(misc, 0x94, &tmp);
-               if (ret)
-                       return ret;
+               if (ret) {
+                       goto error_pci_cfg_read;
+               }
+
                ret = pci_read_config_byte(misc, 0x95, &type);
-               if (ret)
-                       return ret;
+               if (ret) {
+                       goto error_pci_cfg_read;
+               }
 
                if (type & 0x01) {      /* DDR3 */
                        switch (tmp & 0x07) {
@@ -555,8 +568,9 @@ static int km8xx_mem_type(struct drm_device *dev)
                                PCI_DEVICE_ID_AMD_11H_NB_DRAM, NULL);
        if (dram) {
                ret = pci_read_config_byte(misc, 0x94, &type);
-               if (ret)
-                       return ret;
+               if (ret) {
+                       goto error_pci_cfg_read;
+               }
 
                switch (tmp & 0x07) {
                case 0x01:
@@ -572,6 +586,11 @@ static int km8xx_mem_type(struct drm_device *dev)
                        break;
                }
        }
+
+       goto exit;
+error_pci_cfg_read:
+       drm_err(dev, "PCI configuration space read error! errno: %d\n", ret);
+exit:
        return ret;
 }
 
@@ -942,9 +961,9 @@ static int via_vram_init(struct drm_device *dev)
                dev_priv->vram_size = (1 << ((size & 0x70) >> 4)) << 20;
                break;
 
-       /* K8M800 / K8N800 */
+       /* K8M800(A) / K8N800(A) */
        case PCI_DEVICE_ID_VIA_8380_0:
-       /* K8M890 */
+       /* K8M890 / K8N890 */
        case PCI_DEVICE_ID_VIA_VT3336:
                ret = pci_read_config_byte(hb_fn3, 0xa1, &size);
                if (ret)
commit 729126f721e55d6204c34a3bafbe1435d8e95949
Author: Kevin Brace <kevinbr...@bracecomputerlab.com>
Date:   Mon Jan 15 18:15:25 2024 -0600

    drm/via: Check for error after calling p4m800_mem_type()
    
    This was never added by the original developer.
    
    Signed-off-by: Kevin Brace <kevinbr...@bracecomputerlab.com>

diff --git a/drivers/gpu/drm/via/via_init.c b/drivers/gpu/drm/via/via_init.c
index d1ee2668addc..d25d21af0c4c 100644
--- a/drivers/gpu/drm/via/via_init.c
+++ b/drivers/gpu/drm/via/via_init.c
@@ -933,6 +933,8 @@ static int via_vram_init(struct drm_device *dev)
        /* P4M800 */
        case PCI_DEVICE_ID_VIA_3296_0:
                ret = p4m800_mem_type(dev);
+               if (ret)
+                       goto error_hb_fn3;
 
                ret = pci_read_config_byte(hb_fn3, 0xa1, &size);
                if (ret)
commit ea6e426716afe9cfc88da9a64ae69786ab555a37
Author: Kevin Brace <kevinbr...@bracecomputerlab.com>
Date:   Mon Jan 15 18:15:25 2024 -0600

    drm/via: Drop recognizing 233 MHz FSB base clock inside p4m800_mem_type()
    
    This frequency was never officially supported by this chipset, so
    stop recognizing it.
    
    Signed-off-by: Kevin Brace <kevinbr...@bracecomputerlab.com>

diff --git a/drivers/gpu/drm/via/via_init.c b/drivers/gpu/drm/via/via_init.c
index 82942aa7052e..d1ee2668addc 100644
--- a/drivers/gpu/drm/via/via_init.c
+++ b/drivers/gpu/drm/via/via_init.c
@@ -399,9 +399,6 @@ static int p4m800_mem_type(struct drm_device *dev)
        case 0x02:
                freq = 0x06; /* 200 MHz */
                break;
-       case 0x04:
-               freq = 0x07; /* 233 MHz */
-               break;
        default:
                break;
        }
commit 5feb0841ddf832778e59b9f90e68c20d4de81588
Author: Kevin Brace <kevinbr...@bracecomputerlab.com>
Date:   Mon Jan 15 18:15:20 2024 -0600

    drm/via: Drop recognizing 166 MHz FSB base clock inside p4m800_mem_type()
    
    This frequency was never officially supported by this chipset, so
    stop recognizing it.
    
    Signed-off-by: Kevin Brace <kevinbr...@bracecomputerlab.com>

diff --git a/drivers/gpu/drm/via/via_init.c b/drivers/gpu/drm/via/via_init.c
index d692e3bcbbe7..82942aa7052e 100644
--- a/drivers/gpu/drm/via/via_init.c
+++ b/drivers/gpu/drm/via/via_init.c
@@ -396,9 +396,6 @@ static int p4m800_mem_type(struct drm_device *dev)
        case 0x01:
                freq = 0x04; /* 133 MHz */
                break;
-       case 0x03:
-               freq = 0x05; /* 166 MHz */
-               break;
        case 0x02:
                freq = 0x06; /* 200 MHz */
                break;
commit 219279a2cb02140203a054c439e751ffeb8c12b2
Author: Kevin Brace <kevinbr...@bracecomputerlab.com>
Date:   Mon Jan 15 18:15:18 2024 -0600

    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 <kevinbr...@bracecomputerlab.com>

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)
commit 602a11a97064530867d2f9e699e222a0fb3c6c03
Author: Kevin Brace <kevinbr...@bracecomputerlab.com>
Date:   Mon Jan 15 18:15:18 2024 -0600

    drm/via: Check for error after calling km400_mem_type()
    
    This was never added by the original developer.
    
    Signed-off-by: Kevin Brace <kevinbr...@bracecomputerlab.com>

diff --git a/drivers/gpu/drm/via/via_init.c b/drivers/gpu/drm/via/via_init.c
index 39a59d7787ed..370c74051938 100644
--- a/drivers/gpu/drm/via/via_init.c
+++ b/drivers/gpu/drm/via/via_init.c
@@ -902,6 +902,8 @@ static int via_vram_init(struct drm_device *dev)
        /* KM400(A) / KN400(A) */
        case PCI_DEVICE_ID_VIA_8378_0:
                ret = km400_mem_type(dev);
+               if (ret)
+                       goto error_hb_fn0;
 
                ret = pci_read_config_byte(hb_fn0, 0xe1, &size);
                if (ret)
commit c291677fdc9fdcbafdfb3a7cb1d8738312ae675d
Author: Kevin Brace <kevinbr...@bracecomputerlab.com>
Date:   Mon Jan 15 18:15:16 2024 -0600

    drm/via: Updates to km400_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 <kevinbr...@bracecomputerlab.com>

diff --git a/drivers/gpu/drm/via/via_init.c b/drivers/gpu/drm/via/via_init.c
index d3a52035a202..39a59d7787ed 100644
--- a/drivers/gpu/drm/via/via_init.c
+++ b/drivers/gpu/drm/via/via_init.c
@@ -168,25 +168,41 @@ exit:
        return ret;
 }
 
-static int km400_mem_type(struct drm_device *dev,
-                               struct pci_dev *bridge)
+static int km400_mem_type(struct drm_device *dev)
 {
+       struct pci_dev *gfx_dev = to_pci_dev(dev->dev);
+       struct pci_dev *bridge_fn0_dev;
        struct via_drm_priv *dev_priv = to_via_drm_priv(dev);
        u8 fsb, freq, rev;
        int ret;
 
-       ret = pci_read_config_byte(bridge, 0xf6, &rev);
-       if (ret)
-               return ret;
-       ret = pci_read_config_byte(bridge, 0x54, &fsb);
-       if (ret)
-               return ret;
-       ret = pci_read_config_byte(bridge, 0x69, &freq);
-       if (ret)
-               return ret;
+       bridge_fn0_dev =
+               pci_get_domain_bus_and_slot(pci_domain_nr(gfx_dev->bus), 0,
+                                               PCI_DEVFN(0, 0));
+       if (!bridge_fn0_dev) {
+               ret = -ENODEV;
+               drm_err(dev, "Host Bridge Function 0 not found! errno: %d\n",
+                       ret);
+               goto exit;
+       }
+
+       ret = pci_read_config_byte(bridge_fn0_dev, 0x54, &fsb);
+       if (ret) {
+               goto error_pci_cfg_read;
+       }
+
+       ret = pci_read_config_byte(bridge_fn0_dev, 0x69, &freq);
+       if (ret) {
+               goto error_pci_cfg_read;
+       }
 
-       freq >>= 6;
        fsb >>= 6;
+       freq >>= 6;
+
+       ret = pci_read_config_byte(bridge_fn0_dev, 0xf6, &rev);
+       if (ret) {
+               goto error_pci_cfg_read;
+       }
 
        /* KM400 */
        if (rev < 0x80) {
@@ -209,8 +225,8 @@ static int km400_mem_type(struct drm_device *dev,
                        default:
                                break;
                        }
-                       break;
 
+                       break;
                case 0x01:
                        switch (freq) {
                        case 0x00:
@@ -225,8 +241,8 @@ static int km400_mem_type(struct drm_device *dev,
                        default:
                                break;
                        }
-                       break;
 
+                       break;
                case 0x02:
                case 0x03:
                        switch (freq) {
@@ -242,15 +258,18 @@ static int km400_mem_type(struct drm_device *dev,
                        default:
                                break;
                        }
+
                        break;
                default:
                        break;
                }
        } else {
                /* KM400A */
-               ret = pci_read_config_byte(bridge, 0x67, &rev);
-               if (ret)
-                       return ret;
+               ret = pci_read_config_byte(bridge_fn0_dev, 0x67, &rev);
+               if (ret) {
+                       goto error_pci_cfg_read;
+               }
+
                if (rev & 0x80)
                        freq |= 0x04;
 
@@ -270,11 +289,10 @@ static int km400_mem_type(struct drm_device *dev,
                                dev_priv->vram_type = VIA_MEM_DDR_400;
                                break;
                        default:
-                               dev_priv->vram_type = VIA_MEM_NONE;
                                break;
                        }
-                       break;
 
+                       break;
                case 0x01:
                        switch (freq) {
                        case 0x00:
@@ -289,8 +307,8 @@ static int km400_mem_type(struct drm_device *dev,
                        default:
                                break;
                        }
-                       break;
 
+                       break;
                case 0x02:
                        switch (freq) {
                        case 0x00:
@@ -305,8 +323,8 @@ static int km400_mem_type(struct drm_device *dev,
                        default:
                                break;
                        }
-                       break;
 
+                       break;
                case 0x03:
                        switch (freq) {
                        case 0x00:
@@ -321,11 +339,17 @@ static int km400_mem_type(struct drm_device *dev,
                        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;
 }
 
@@ -875,9 +899,9 @@ static int via_vram_init(struct drm_device *dev)
                dev_priv->vram_size = (1 << ((size & 0x70) >> 4)) << 20;
                break;
 
-       /* KM400 / KN400 / KM400A / KN400A */
+       /* KM400(A) / KN400(A) */
        case PCI_DEVICE_ID_VIA_8378_0:
-               ret = km400_mem_type(dev, hb_fn0);
+               ret = km400_mem_type(dev);
 
                ret = pci_read_config_byte(hb_fn0, 0xe1, &size);
                if (ret)
commit a564b40eb70a734b099ff2012d3aeb0e254dee8b
Author: Kevin Brace <kevinbr...@bracecomputerlab.com>
Date:   Mon Jan 15 18:15:03 2024 -0600

    drm/via: Updates to cle266_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 <kevinbr...@bracecomputerlab.com>

diff --git a/drivers/gpu/drm/via/via_init.c b/drivers/gpu/drm/via/via_init.c
index 79bbc05a98df..d3a52035a202 100644
--- a/drivers/gpu/drm/via/via_init.c
+++ b/drivers/gpu/drm/via/via_init.c
@@ -41,22 +41,36 @@
 #include "via_drv.h"
 
 
-static int cle266_mem_type(struct drm_device *dev,
-                               struct pci_dev *bridge)
+static int cle266_mem_type(struct drm_device *dev)
 {
+       struct pci_dev *gfx_dev = to_pci_dev(dev->dev);
+       struct pci_dev *bridge_fn0_dev;
        struct via_drm_priv *dev_priv = to_via_drm_priv(dev);
-       u8 type, fsb, freq;
+       u8 fsb, freq, type;
        int ret;
 
-       ret = pci_read_config_byte(bridge, 0x54, &fsb);
-       if (ret)
-               return ret;
-       ret = pci_read_config_byte(bridge, 0x69, &freq);
-       if (ret)
-               return ret;
+       bridge_fn0_dev =
+               pci_get_domain_bus_and_slot(pci_domain_nr(gfx_dev->bus), 0,
+                                               PCI_DEVFN(0, 0));
+       if (!bridge_fn0_dev) {
+               ret = -ENODEV;
+               drm_err(dev, "Host Bridge Function 0 not found! errno: %d\n",
+                       ret);
+               goto exit;
+       }
+
+       ret = pci_read_config_byte(bridge_fn0_dev, 0x54, &fsb);
+       if (ret) {
+               goto error_pci_cfg_read;
+       }
+
+       ret = pci_read_config_byte(bridge_fn0_dev, 0x69, &freq);
+       if (ret) {
+               goto error_pci_cfg_read;
+       }
 
-       freq >>= 6;
        fsb >>= 6;
+       freq >>= 6;
 
        /* FSB frequency */
        switch (fsb) {
@@ -75,8 +89,8 @@ static int cle266_mem_type(struct drm_device *dev,
                        freq = 0;
                        break;
                }
-               break;
 
+               break;
        case 0x02: /* 133 MHz */
        case 0x03:
                switch (freq) {
@@ -90,22 +104,27 @@ static int cle266_mem_type(struct drm_device *dev,
                        freq = 0;
                        break;
                }
+
                break;
        default:
                freq = 0;
                break;
        }
 
-       ret = pci_read_config_byte(bridge, 0x60, &fsb);
-       if (ret)
-               return ret;
-       ret = pci_read_config_byte(bridge, 0xe3, &type);
-       if (ret)
-               return ret;
+       ret = pci_read_config_byte(bridge_fn0_dev, 0x60, &fsb);
+       if (ret) {
+               goto error_pci_cfg_read;
+       }
+
+       ret = pci_read_config_byte(bridge_fn0_dev, 0xe3, &type);
+       if (ret) {
+               goto error_pci_cfg_read;
+       }
 
        /* On bank 2/3 */
-       if (type & 0x02)
+       if (type & 0x02) {
                fsb >>= 2;
+       }
 
        /* Memory type */
        switch (fsb & 0x03) {
@@ -123,8 +142,8 @@ static int cle266_mem_type(struct drm_device *dev,
                default:
                        break;
                }
-               break;
 
+               break;
        case 0x02: /* DDR */
                switch (freq) {
                case 100:
@@ -136,10 +155,16 @@ static int cle266_mem_type(struct drm_device *dev,
                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;
 }
 
@@ -840,7 +865,7 @@ static int via_vram_init(struct drm_device *dev)
 
        /* CLE266 */
        case PCI_DEVICE_ID_VIA_862X_0:
-               ret = cle266_mem_type(dev, hb_fn0);
+               ret = cle266_mem_type(dev);
                if (ret)
                        goto error_hb_fn0;
 
commit dfaf1d5016105d03f66d2f6137be1fa3e3151589
Author: Kevin Brace <kevinbr...@bracecomputerlab.com>
Date:   Mon Jan 15 18:14:55 2024 -0600

    drm/via: Convert uppercase hexadecimals to lowercase inside via_init.c
    
    Signed-off-by: Kevin Brace <kevinbr...@bracecomputerlab.com>

diff --git a/drivers/gpu/drm/via/via_init.c b/drivers/gpu/drm/via/via_init.c
index 48ad32ed56cf..79bbc05a98df 100644
--- a/drivers/gpu/drm/via/via_init.c
+++ b/drivers/gpu/drm/via/via_init.c
@@ -99,7 +99,7 @@ static int cle266_mem_type(struct drm_device *dev,
        ret = pci_read_config_byte(bridge, 0x60, &fsb);
        if (ret)
                return ret;
-       ret = pci_read_config_byte(bridge, 0xE3, &type);
+       ret = pci_read_config_byte(bridge, 0xe3, &type);
        if (ret)
                return ret;
 
@@ -150,7 +150,7 @@ static int km400_mem_type(struct drm_device *dev,
        u8 fsb, freq, rev;
        int ret;
 
-       ret = pci_read_config_byte(bridge, 0xF6, &rev);
+       ret = pci_read_config_byte(bridge, 0xf6, &rev);
        if (ret)
                return ret;
        ret = pci_read_config_byte(bridge, 0x54, &fsb);
@@ -314,7 +314,7 @@ static int p4m800_mem_type(struct drm_device *dev,
        u8 type, fsb;
 
        /* VIA Scratch region */
-       ret = pci_read_config_byte(fn4, 0xF3, &fsb);
+       ret = pci_read_config_byte(fn4, 0xf3, &fsb);
        if (ret) {
                pci_dev_put(fn4);
                return ret;
@@ -386,7 +386,7 @@ static int km8xx_mem_type(struct drm_device *dev)
                misc = pci_get_device(PCI_VENDOR_ID_AMD,
                                PCI_DEVICE_ID_AMD_K8_NB_MISC, NULL);
 
-               ret = pci_read_config_byte(misc, 0xFD, &type);
+               ret = pci_read_config_byte(misc, 0xfd, &type);
                if (type) {
                        pci_read_config_byte(dram, 0x94, &type);
                        switch (type & 0x03) {
@@ -617,7 +617,7 @@ static int cx700_mem_type(struct drm_device *dev,
        ret = pci_read_config_byte(fn3, 0x90, &clock);
        if (ret)
                return ret;
-       ret = pci_read_config_byte(fn3, 0x6C, &type);
+       ret = pci_read_config_byte(fn3, 0x6c, &type);
        if (ret)
                return ret;
        type &= 0x40;
@@ -677,18 +677,18 @@ static int vx900_mem_type(struct drm_device *dev,
        ret = pci_read_config_byte(fn3, 0x90, &clock);
        if (ret)
                return ret;
-       ret = pci_read_config_byte(fn3, 0x6C, &type);
+       ret = pci_read_config_byte(fn3, 0x6c, &type);
        if (ret)
                return ret;
        volt = type;
-       type &= 0xC0;
+       type &= 0xc0;
        type >>= 6;
        volt &= 0x20;
        volt >>= 5;
 
        switch (type) {
        case 1:
-               switch (clock & 0x0F) {
+               switch (clock & 0x0f) {
                case 0:
                        if (volt)
                                dev_priv->vram_type = VIA_MEM_DDR2_800;
@@ -712,7 +712,7 @@ static int vx900_mem_type(struct drm_device *dev,
                }
                break;
        case 2:
-               switch (clock & 0x0F) {
+               switch (clock & 0x0f) {
                case 0:
                        if (volt)
                                dev_priv->vram_type = VIA_MEM_DDR3_800;
@@ -844,7 +844,7 @@ static int via_vram_init(struct drm_device *dev)
                if (ret)
                        goto error_hb_fn0;
 
-               ret = pci_read_config_byte(hb_fn0, 0xE1, &size);
+               ret = pci_read_config_byte(hb_fn0, 0xe1, &size);
                if (ret)
                        goto error_hb_fn0;
                dev_priv->vram_size = (1 << ((size & 0x70) >> 4)) << 20;
@@ -854,7 +854,7 @@ static int via_vram_init(struct drm_device *dev)
        case PCI_DEVICE_ID_VIA_8378_0:
                ret = km400_mem_type(dev, hb_fn0);
 
-               ret = pci_read_config_byte(hb_fn0, 0xE1, &size);
+               ret = pci_read_config_byte(hb_fn0, 0xe1, &size);
                if (ret)
                        goto error_hb_fn0;
                dev_priv->vram_size = (1 << ((size & 0x70) >> 4)) << 20;
@@ -864,7 +864,7 @@ static int via_vram_init(struct drm_device *dev)
        case PCI_DEVICE_ID_VIA_3296_0:
                ret = p4m800_mem_type(dev, bus, hb_fn3);
 
-               ret = pci_read_config_byte(hb_fn3, 0xA1, &size);
+               ret = pci_read_config_byte(hb_fn3, 0xa1, &size);
                if (ret)
                        goto error_hb_fn3;
                dev_priv->vram_size = (1 << ((size & 0x70) >> 4)) << 20;
@@ -874,7 +874,7 @@ static int via_vram_init(struct drm_device *dev)
        case PCI_DEVICE_ID_VIA_8380_0:
        /* K8M890 */
        case PCI_DEVICE_ID_VIA_VT3336:
-               ret = pci_read_config_byte(hb_fn3, 0xA1, &size);
+               ret = pci_read_config_byte(hb_fn3, 0xa1, &size);
                if (ret)
                        goto error_hb_fn3;
                dev_priv->vram_size = (1 << ((size & 0x70) >> 4)) << 20;
@@ -889,7 +889,7 @@ static int via_vram_init(struct drm_device *dev)
 
        /* CN400 / PM800 / PM880 */
        case PCI_DEVICE_ID_VIA_PX8X0_0:
-               ret = pci_read_config_byte(hb_fn3, 0xA1, &size);
+               ret = pci_read_config_byte(hb_fn3, 0xa1, &size);
                if (ret)
                        goto error_hb_fn3;
                dev_priv->vram_size = (1 << ((size & 0x70) >> 4)) << 20;
@@ -903,7 +903,7 @@ static int via_vram_init(struct drm_device *dev)
        case PCI_DEVICE_ID_VIA_P4M800CE:
        /* P4M900 / VN896 / CN896 */
        case PCI_DEVICE_ID_VIA_VT3364:
-               ret = pci_read_config_byte(hb_fn3, 0xA1, &size);
+               ret = pci_read_config_byte(hb_fn3, 0xa1, &size);
                if (ret)
                        goto error_hb_fn3;
                dev_priv->vram_size = (1 << ((size & 0x70) >> 4)) << 20;
@@ -924,7 +924,7 @@ static int via_vram_init(struct drm_device *dev)
        case PCI_DEVICE_ID_VIA_VX800_HB:
        /* VX855 / VX875 */
        case PCI_DEVICE_ID_VIA_VX855_HB:
-               ret = pci_read_config_byte(hb_fn3, 0xA1, &size);
+               ret = pci_read_config_byte(hb_fn3, 0xa1, &size);
                if (ret)
                        goto error_hb_fn3;
                dev_priv->vram_size = (1 << ((size & 0x70) >> 4)) << 22;
@@ -936,7 +936,7 @@ static int via_vram_init(struct drm_device *dev)
 
        /* VX900 */
        case PCI_DEVICE_ID_VIA_VX900_HB:
-               ret = pci_read_config_byte(hb_fn3, 0xA1, &size);
+               ret = pci_read_config_byte(hb_fn3, 0xa1, &size);
                if (ret)
                        goto error_hb_fn3;
                dev_priv->vram_size = (1 << ((size & 0x70) >> 4)) << 22;
@@ -1097,8 +1097,8 @@ static void via_graphics_unlock(struct drm_device *dev)
        /*
         * Enable VGA subsystem.
         */
-       temp = vga_io_r(0x03C3);
-       vga_io_w(0x03C3, temp | 0x01);
+       temp = vga_io_r(0x03c3);
+       vga_io_w(0x03c3, temp | 0x01);
        svga_wmisc_mask(VGABASE, BIT(0), BIT(0));
 
        /*
@@ -1128,16 +1128,16 @@ static void via_chip_revision_info(struct drm_device 
*dev)
        /* CLE266 Chipset */
        case PCI_DEVICE_ID_VIA_CLE266_GFX:
                /* CR4F only defined in CLE266.CX chipset. */
-               tmp = vga_rcrt(VGABASE, 0x4F);
-               vga_wcrt(VGABASE, 0x4F, 0x55);
-               if (vga_rcrt(VGABASE, 0x4F) != 0x55) {
+               tmp = vga_rcrt(VGABASE, 0x4f);
+               vga_wcrt(VGABASE, 0x4f, 0x55);
+               if (vga_rcrt(VGABASE, 0x4f) != 0x55) {
                        dev_priv->revision = CLE266_REVISION_AX;
                } else {
                        dev_priv->revision = CLE266_REVISION_CX;
                }
 
                /* Restore original CR4F value. */
-               vga_wcrt(VGABASE, 0x4F, tmp);
+               vga_wcrt(VGABASE, 0x4f, tmp);
                break;
        /* CX700 / VX700 Chipset */
        case PCI_DEVICE_ID_VIA_UNICHROME_PRO_II:
@@ -1158,7 +1158,7 @@ static void via_chip_revision_info(struct drm_device *dev)
        case PCI_DEVICE_ID_VIA_CHROME9_HCM:
        /* VX900 Chipset */
        case PCI_DEVICE_ID_VIA_CHROME9_HD:
-               dev_priv->revision = vga_rseq(VGABASE, 0x3B);
+               dev_priv->revision = vga_rseq(VGABASE, 0x3b);
                break;
        default:
                break;
commit 9562dde1367b8d4840ccfd60f1e014267cb3e287
Author: Kevin Brace <kevinbr...@bracecomputerlab.com>
Date:   Mon Jan 15 18:14:44 2024 -0600

    drm/via: Unknown Host Bidge typo
    
    It should be Unknown Host Bridge.
    
    Signed-off-by: Kevin Brace <kevinbr...@bracecomputerlab.com>

diff --git a/drivers/gpu/drm/via/via_init.c b/drivers/gpu/drm/via/via_init.c
index 661bf6e199fc..48ad32ed56cf 100644
--- a/drivers/gpu/drm/via/via_init.c
+++ b/drivers/gpu/drm/via/via_init.c
@@ -948,7 +948,7 @@ static int via_vram_init(struct drm_device *dev)
 
        default:
                ret = -ENODEV;
-               drm_err(dev, "Unknown Host Bidge device: 0x%04x\n",
+               drm_err(dev, "Unknown Host Bridge device: 0x%04x\n",
                                hb_fn0->device);
                goto error_hb_fn3;
        }

Reply via email to