]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
serial: 8250_pcilib: Replace deprecated PCI functions
authorFlorian Eckert <fe@dev.tdt.de>
Tue, 30 Sep 2025 07:27:43 +0000 (09:27 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 22 Oct 2025 10:06:53 +0000 (12:06 +0200)
When the '8250_exar' module is loaded into the kernel, a kernel trace
with 'WARN_ON(legacy_iomap_table[bar])' is dumped to the console,
because the old pci table mapping is still used in '8250_pcilib'.

The old function have been deprecated in commit e354bb84a4c1 ("PCI:
Deprecate pcim_iomap_table(), pcim_iomap_regions_request_all()").

The remapping already takes or must take place in the driver that calls
the function 'serial8250_pci_setup_port()'. The remapping should only be
called once via 'pcim_iomap()'. Therefore the remapping moved to the
caller of 'serial8250_pci_setup_port()'.

To replace the outdated/legacy iomap_table processing in '8250_pcilib' the
function signature of 'serial8250_pci_setup_port()' has been extended with
an already iomapped address value. So this can be used directly without
io mapping again.

Signed-off-by: Florian Eckert <fe@dev.tdt.de>
Reviewed-by: Jiri Slaby <jirislaby@kernel.org>
Link: https://patch.msgid.link/20250930072743.791580-1-fe@dev.tdt.de
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/8250/8250_exar.c
drivers/tty/serial/8250/8250_pci.c
drivers/tty/serial/8250/8250_pci1xxxx.c
drivers/tty/serial/8250/8250_pcilib.c
drivers/tty/serial/8250/8250_pcilib.h

index 04a0cbab02c253938c0bd392a5630166defa676b..3c16a849b474857f3f0185377dfb8dc41c1c9111 100644 (file)
@@ -503,7 +503,7 @@ static int default_setup(struct exar8250 *priv, struct pci_dev *pcidev,
        unsigned char status;
        int err;
 
-       err = serial8250_pci_setup_port(pcidev, port, 0, offset, board->reg_shift);
+       err = serial8250_pci_setup_port(pcidev, port, 0, offset, board->reg_shift, priv->virt);
        if (err)
                return err;
 
@@ -831,7 +831,7 @@ static int cti_port_setup_common(struct exar8250 *priv,
        port->port.port_id = idx;
        port->port.uartclk = priv->osc_freq;
 
-       ret = serial8250_pci_setup_port(pcidev, port, 0, offset, 0);
+       ret = serial8250_pci_setup_port(pcidev, port, 0, offset, 0, priv->virt);
        if (ret)
                return ret;
 
index 152f914c599dc5debfffeed2b3f35e4a38605e1e..f0f13fdda2dff572134cf088faa75bc3895b7034 100644 (file)
@@ -165,7 +165,15 @@ static int
 setup_port(struct serial_private *priv, struct uart_8250_port *port,
           u8 bar, unsigned int offset, int regshift)
 {
-       return serial8250_pci_setup_port(priv->dev, port, bar, offset, regshift);
+       void __iomem *iomem = NULL;
+
+       if (pci_resource_flags(priv->dev, bar) & IORESOURCE_MEM) {
+               iomem = pcim_iomap(priv->dev, bar, 0);
+               if (!iomem)
+                       return -ENOMEM;
+       }
+
+       return serial8250_pci_setup_port(priv->dev, port, bar, offset, regshift, iomem);
 }
 
 /*
index 4c149db846925f63b2c84ad93695e4e334076961..feeede164886f567fef60382a46e8586eb051e5a 100644 (file)
@@ -671,7 +671,7 @@ static int pci1xxxx_resume(struct device *dev)
 }
 
 static int pci1xxxx_setup(struct pci_dev *pdev,
-                         struct uart_8250_port *port, int port_idx, int rev)
+                         struct uart_8250_port *port, int port_idx, struct pci1xxxx_8250 *priv)
 {
        int ret;
 
@@ -698,12 +698,12 @@ static int pci1xxxx_setup(struct pci_dev *pdev,
         * C0 and later revisions support Burst operation.
         * RTS workaround in mctrl is applicable only to B0.
         */
-       if (rev >= 0xC0)
+       if (priv->dev_rev >= 0xC0)
                port->port.handle_irq = pci1xxxx_handle_irq;
-       else if (rev == 0xB0)
+       else if (priv->dev_rev == 0xB0)
                port->port.set_mctrl = pci1xxxx_set_mctrl;
 
-       ret = serial8250_pci_setup_port(pdev, port, 0, PORT_OFFSET * port_idx, 0);
+       ret = serial8250_pci_setup_port(pdev, port, 0, PORT_OFFSET * port_idx, 0, priv->membase);
        if (ret < 0)
                return ret;
 
@@ -821,7 +821,7 @@ static int pci1xxxx_serial_probe(struct pci_dev *pdev,
                else
                        uart.port.irq = pci_irq_vector(pdev, 0);
 
-               rc = pci1xxxx_setup(pdev, &uart, port_idx, priv->dev_rev);
+               rc = pci1xxxx_setup(pdev, &uart, port_idx, priv);
                if (rc) {
                        dev_warn(dev, "Failed to setup port %u\n", i);
                        continue;
index d8d0ae0d72387c210b1ac80427ddaa20e037e91d..9d5d2531a33bd2cd5bbb1395ba889e87e38cf8ac 100644 (file)
@@ -22,19 +22,16 @@ int serial_8250_warn_need_ioport(struct pci_dev *dev)
 EXPORT_SYMBOL_NS_GPL(serial_8250_warn_need_ioport, "SERIAL_8250_PCI");
 
 int serial8250_pci_setup_port(struct pci_dev *dev, struct uart_8250_port *port,
-                  u8 bar, unsigned int offset, int regshift)
+                  u8 bar, unsigned int offset, int regshift, void __iomem *iomem)
 {
        if (bar >= PCI_STD_NUM_BARS)
                return -EINVAL;
 
        if (pci_resource_flags(dev, bar) & IORESOURCE_MEM) {
-               if (!pcim_iomap(dev, bar, 0) && !pcim_iomap_table(dev))
-                       return -ENOMEM;
-
                port->port.iotype = UPIO_MEM;
                port->port.iobase = 0;
                port->port.mapbase = pci_resource_start(dev, bar) + offset;
-               port->port.membase = pcim_iomap_table(dev)[bar] + offset;
+               port->port.membase = iomem + offset;
                port->port.regshift = regshift;
        } else if (IS_ENABLED(CONFIG_HAS_IOPORT)) {
                port->port.iotype = UPIO_PORT;
index 16a274574cdef938fe7700d30b19e75dbbd9b748..ab18de8d1355ba6864b0dd404e1ac2fe8eb162a1 100644 (file)
@@ -12,6 +12,6 @@ struct pci_dev;
 struct uart_8250_port;
 
 int serial8250_pci_setup_port(struct pci_dev *dev, struct uart_8250_port *port, u8 bar,
-                  unsigned int offset, int regshift);
+                  unsigned int offset, int regshift, void __iomem *iomem);
 
 int serial_8250_warn_need_ioport(struct pci_dev *dev);