linux-fbdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] nvidiafb: detect the hardware support before removing console.
@ 2023-02-05 21:07 Dave Airlie
  2023-02-06  7:52 ` Zeno Davatz
  2023-02-06  9:05 ` Thomas Zimmermann
  0 siblings, 2 replies; 10+ messages in thread
From: Dave Airlie @ 2023-02-05 21:07 UTC (permalink / raw)
  To: linux-fbdev; +Cc: dri-devel, linux-kernel, Dave Airlie, Zeno Davatz

From: Dave Airlie <airlied@redhat.com>

This driver removed the console, but hasn't yet decided if it could
take over the console yet. Instead of doing that, probe the hw for
support and then remove the console afterwards.

Signed-off-by: Dave Airlie <airlied@redhat.com>
Fixes: https://bugzilla.kernel.org/show_bug.cgi?id=216859
Reported-by: Zeno Davatz <zdavatz@gmail.com>
---
 drivers/video/fbdev/nvidia/nvidia.c | 81 +++++++++++++++--------------
 1 file changed, 42 insertions(+), 39 deletions(-)

diff --git a/drivers/video/fbdev/nvidia/nvidia.c b/drivers/video/fbdev/nvidia/nvidia.c
index 1960916098d4..e60a276b4855 100644
--- a/drivers/video/fbdev/nvidia/nvidia.c
+++ b/drivers/video/fbdev/nvidia/nvidia.c
@@ -1197,17 +1197,17 @@ static int nvidia_set_fbinfo(struct fb_info *info)
 	return nvidiafb_check_var(&info->var, info);
 }
 
-static u32 nvidia_get_chipset(struct fb_info *info)
+static u32 nvidia_get_chipset(struct pci_dev *pci_dev,
+			      volatile u32 __iomem *REGS)
 {
-	struct nvidia_par *par = info->par;
-	u32 id = (par->pci_dev->vendor << 16) | par->pci_dev->device;
+	u32 id = (pci_dev->vendor << 16) | pci_dev->device;
 
 	printk(KERN_INFO PFX "Device ID: %x \n", id);
 
 	if ((id & 0xfff0) == 0x00f0 ||
 	    (id & 0xfff0) == 0x02e0) {
 		/* pci-e */
-		id = NV_RD32(par->REGS, 0x1800);
+		id = NV_RD32(REGS, 0x1800);
 
 		if ((id & 0x0000ffff) == 0x000010DE)
 			id = 0x10DE0000 | (id >> 16);
@@ -1220,12 +1220,11 @@ static u32 nvidia_get_chipset(struct fb_info *info)
 	return id;
 }
 
-static u32 nvidia_get_arch(struct fb_info *info)
+static u32 nvidia_get_arch(u32 Chipset)
 {
-	struct nvidia_par *par = info->par;
 	u32 arch = 0;
 
-	switch (par->Chipset & 0x0ff0) {
+	switch (Chipset & 0x0ff0) {
 	case 0x0100:		/* GeForce 256 */
 	case 0x0110:		/* GeForce2 MX */
 	case 0x0150:		/* GeForce2 */
@@ -1278,16 +1277,44 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
 	struct fb_info *info;
 	unsigned short cmd;
 	int ret;
+	volatile u32 __iomem *REGS;
+	int Chipset;
+	u32 Architecture;
 
 	NVTRACE_ENTER();
 	assert(pd != NULL);
 
+	if (pci_enable_device(pd)) {
+		printk(KERN_ERR PFX "cannot enable PCI device\n");
+		return -ENODEV;
+	}
+
+	/* enable IO and mem if not already done */
+	pci_read_config_word(pd, PCI_COMMAND, &cmd);
+	cmd |= (PCI_COMMAND_IO | PCI_COMMAND_MEMORY);
+	pci_write_config_word(pd, PCI_COMMAND, cmd);
+
+	nvidiafb_fix.mmio_start = pci_resource_start(pd, 0);
+	nvidiafb_fix.mmio_len = pci_resource_len(pd, 0);
+
+	REGS = ioremap(nvidiafb_fix.mmio_start, nvidiafb_fix.mmio_len);
+	if (!REGS) {
+		printk(KERN_ERR PFX "cannot ioremap MMIO base\n");
+		return -ENODEV;
+	}
+
+	Chipset = nvidia_get_chipset(pd, REGS);
+	Architecture = nvidia_get_arch(Chipset);
+	if (Architecture == 0) {
+		printk(KERN_ERR PFX "unknown NV_ARCH\n");
+		goto err_out;
+	}
+
 	ret = aperture_remove_conflicting_pci_devices(pd, "nvidiafb");
 	if (ret)
-		return ret;
+		goto err_out;
 
 	info = framebuffer_alloc(sizeof(struct nvidia_par), &pd->dev);
-
 	if (!info)
 		goto err_out;
 
@@ -1298,11 +1325,6 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
 	if (info->pixmap.addr == NULL)
 		goto err_out_kfree;
 
-	if (pci_enable_device(pd)) {
-		printk(KERN_ERR PFX "cannot enable PCI device\n");
-		goto err_out_enable;
-	}
-
 	if (pci_request_regions(pd, "nvidiafb")) {
 		printk(KERN_ERR PFX "cannot request PCI regions\n");
 		goto err_out_enable;
@@ -1318,34 +1340,17 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
 	par->paneltweak = paneltweak;
 	par->reverse_i2c = reverse_i2c;
 
-	/* enable IO and mem if not already done */
-	pci_read_config_word(pd, PCI_COMMAND, &cmd);
-	cmd |= (PCI_COMMAND_IO | PCI_COMMAND_MEMORY);
-	pci_write_config_word(pd, PCI_COMMAND, cmd);
-
-	nvidiafb_fix.mmio_start = pci_resource_start(pd, 0);
 	nvidiafb_fix.smem_start = pci_resource_start(pd, 1);
-	nvidiafb_fix.mmio_len = pci_resource_len(pd, 0);
-
-	par->REGS = ioremap(nvidiafb_fix.mmio_start, nvidiafb_fix.mmio_len);
 
-	if (!par->REGS) {
-		printk(KERN_ERR PFX "cannot ioremap MMIO base\n");
-		goto err_out_free_base0;
-	}
+	par->REGS = REGS;
 
-	par->Chipset = nvidia_get_chipset(info);
-	par->Architecture = nvidia_get_arch(info);
-
-	if (par->Architecture == 0) {
-		printk(KERN_ERR PFX "unknown NV_ARCH\n");
-		goto err_out_arch;
-	}
+	par->Chipset = Chipset;
+	par->Architecture = Architecture;
 
 	sprintf(nvidiafb_fix.id, "NV%x", (pd->device & 0x0ff0) >> 4);
 
 	if (NVCommonSetup(info))
-		goto err_out_arch;
+		goto err_out_free_base0;
 
 	par->FbAddress = nvidiafb_fix.smem_start;
 	par->FbMapSize = par->RamAmountKBytes * 1024;
@@ -1401,7 +1406,6 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
 		goto err_out_iounmap_fb;
 	}
 
-
 	printk(KERN_INFO PFX
 	       "PCI nVidia %s framebuffer (%dMB @ 0x%lX)\n",
 	       info->fix.id,
@@ -1415,15 +1419,14 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
 err_out_free_base1:
 	fb_destroy_modedb(info->monspecs.modedb);
 	nvidia_delete_i2c_busses(par);
-err_out_arch:
-	iounmap(par->REGS);
- err_out_free_base0:
+err_out_free_base0:
 	pci_release_regions(pd);
 err_out_enable:
 	kfree(info->pixmap.addr);
 err_out_kfree:
 	framebuffer_release(info);
 err_out:
+	iounmap(REGS);
 	return -ENODEV;
 }
 
-- 
2.38.1


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [PATCH] nvidiafb: detect the hardware support before removing console.
  2023-02-05 21:07 [PATCH] nvidiafb: detect the hardware support before removing console Dave Airlie
@ 2023-02-06  7:52 ` Zeno Davatz
  2023-02-06  7:54   ` Dave Airlie
  2023-02-06  9:05 ` Thomas Zimmermann
  1 sibling, 1 reply; 10+ messages in thread
From: Zeno Davatz @ 2023-02-06  7:52 UTC (permalink / raw)
  To: Dave Airlie, Bjorn Helgaas, Bjorn Helgaas
  Cc: linux-fbdev, dri-devel, linux-kernel, Dave Airlie

[-- Attachment #1: Type: text/plain, Size: 7086 bytes --]

Dear Dave

Thank you for your patch.

On Sun, Feb 5, 2023 at 10:07 PM Dave Airlie <airlied@gmail.com> wrote:
>
> From: Dave Airlie <airlied@redhat.com>
>
> This driver removed the console, but hasn't yet decided if it could
> take over the console yet. Instead of doing that, probe the hw for
> support and then remove the console afterwards.
>
> Signed-off-by: Dave Airlie <airlied@redhat.com>
> Fixes: https://bugzilla.kernel.org/show_bug.cgi?id=216859
> Reported-by: Zeno Davatz <zdavatz@gmail.com>
> ---
>  drivers/video/fbdev/nvidia/nvidia.c | 81 +++++++++++++++--------------
>  1 file changed, 42 insertions(+), 39 deletions(-)
>
> diff --git a/drivers/video/fbdev/nvidia/nvidia.c b/drivers/video/fbdev/nvidia/nvidia.c
> index 1960916098d4..e60a276b4855 100644
> --- a/drivers/video/fbdev/nvidia/nvidia.c
> +++ b/drivers/video/fbdev/nvidia/nvidia.c
> @@ -1197,17 +1197,17 @@ static int nvidia_set_fbinfo(struct fb_info *info)
>         return nvidiafb_check_var(&info->var, info);
>  }
>
> -static u32 nvidia_get_chipset(struct fb_info *info)
> +static u32 nvidia_get_chipset(struct pci_dev *pci_dev,
> +                             volatile u32 __iomem *REGS)
>  {
> -       struct nvidia_par *par = info->par;
> -       u32 id = (par->pci_dev->vendor << 16) | par->pci_dev->device;
> +       u32 id = (pci_dev->vendor << 16) | pci_dev->device;
>
>         printk(KERN_INFO PFX "Device ID: %x \n", id);
>
>         if ((id & 0xfff0) == 0x00f0 ||
>             (id & 0xfff0) == 0x02e0) {
>                 /* pci-e */
> -               id = NV_RD32(par->REGS, 0x1800);
> +               id = NV_RD32(REGS, 0x1800);
>
>                 if ((id & 0x0000ffff) == 0x000010DE)
>                         id = 0x10DE0000 | (id >> 16);
> @@ -1220,12 +1220,11 @@ static u32 nvidia_get_chipset(struct fb_info *info)
>         return id;
>  }
>
> -static u32 nvidia_get_arch(struct fb_info *info)
> +static u32 nvidia_get_arch(u32 Chipset)
>  {
> -       struct nvidia_par *par = info->par;
>         u32 arch = 0;
>
> -       switch (par->Chipset & 0x0ff0) {
> +       switch (Chipset & 0x0ff0) {
>         case 0x0100:            /* GeForce 256 */
>         case 0x0110:            /* GeForce2 MX */
>         case 0x0150:            /* GeForce2 */
> @@ -1278,16 +1277,44 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
>         struct fb_info *info;
>         unsigned short cmd;
>         int ret;
> +       volatile u32 __iomem *REGS;
> +       int Chipset;
> +       u32 Architecture;
>
>         NVTRACE_ENTER();
>         assert(pd != NULL);
>
> +       if (pci_enable_device(pd)) {
> +               printk(KERN_ERR PFX "cannot enable PCI device\n");
> +               return -ENODEV;
> +       }
> +
> +       /* enable IO and mem if not already done */
> +       pci_read_config_word(pd, PCI_COMMAND, &cmd);
> +       cmd |= (PCI_COMMAND_IO | PCI_COMMAND_MEMORY);
> +       pci_write_config_word(pd, PCI_COMMAND, cmd);
> +
> +       nvidiafb_fix.mmio_start = pci_resource_start(pd, 0);
> +       nvidiafb_fix.mmio_len = pci_resource_len(pd, 0);
> +
> +       REGS = ioremap(nvidiafb_fix.mmio_start, nvidiafb_fix.mmio_len);
> +       if (!REGS) {
> +               printk(KERN_ERR PFX "cannot ioremap MMIO base\n");
> +               return -ENODEV;
> +       }
> +
> +       Chipset = nvidia_get_chipset(pd, REGS);
> +       Architecture = nvidia_get_arch(Chipset);
> +       if (Architecture == 0) {
> +               printk(KERN_ERR PFX "unknown NV_ARCH\n");
> +               goto err_out;
> +       }
> +
>         ret = aperture_remove_conflicting_pci_devices(pd, "nvidiafb");
>         if (ret)
> -               return ret;
> +               goto err_out;
>
>         info = framebuffer_alloc(sizeof(struct nvidia_par), &pd->dev);
> -
>         if (!info)
>                 goto err_out;
>
> @@ -1298,11 +1325,6 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
>         if (info->pixmap.addr == NULL)
>                 goto err_out_kfree;
>
> -       if (pci_enable_device(pd)) {
> -               printk(KERN_ERR PFX "cannot enable PCI device\n");
> -               goto err_out_enable;
> -       }
> -
>         if (pci_request_regions(pd, "nvidiafb")) {
>                 printk(KERN_ERR PFX "cannot request PCI regions\n");
>                 goto err_out_enable;
> @@ -1318,34 +1340,17 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
>         par->paneltweak = paneltweak;
>         par->reverse_i2c = reverse_i2c;
>
> -       /* enable IO and mem if not already done */
> -       pci_read_config_word(pd, PCI_COMMAND, &cmd);
> -       cmd |= (PCI_COMMAND_IO | PCI_COMMAND_MEMORY);
> -       pci_write_config_word(pd, PCI_COMMAND, cmd);
> -
> -       nvidiafb_fix.mmio_start = pci_resource_start(pd, 0);
>         nvidiafb_fix.smem_start = pci_resource_start(pd, 1);
> -       nvidiafb_fix.mmio_len = pci_resource_len(pd, 0);
> -
> -       par->REGS = ioremap(nvidiafb_fix.mmio_start, nvidiafb_fix.mmio_len);
>
> -       if (!par->REGS) {
> -               printk(KERN_ERR PFX "cannot ioremap MMIO base\n");
> -               goto err_out_free_base0;
> -       }
> +       par->REGS = REGS;
>
> -       par->Chipset = nvidia_get_chipset(info);
> -       par->Architecture = nvidia_get_arch(info);
> -
> -       if (par->Architecture == 0) {
> -               printk(KERN_ERR PFX "unknown NV_ARCH\n");
> -               goto err_out_arch;
> -       }
> +       par->Chipset = Chipset;
> +       par->Architecture = Architecture;
>
>         sprintf(nvidiafb_fix.id, "NV%x", (pd->device & 0x0ff0) >> 4);
>
>         if (NVCommonSetup(info))
> -               goto err_out_arch;
> +               goto err_out_free_base0;
>
>         par->FbAddress = nvidiafb_fix.smem_start;
>         par->FbMapSize = par->RamAmountKBytes * 1024;
> @@ -1401,7 +1406,6 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
>                 goto err_out_iounmap_fb;
>         }
>
> -
>         printk(KERN_INFO PFX
>                "PCI nVidia %s framebuffer (%dMB @ 0x%lX)\n",
>                info->fix.id,
> @@ -1415,15 +1419,14 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
>  err_out_free_base1:
>         fb_destroy_modedb(info->monspecs.modedb);
>         nvidia_delete_i2c_busses(par);
> -err_out_arch:
> -       iounmap(par->REGS);
> - err_out_free_base0:
> +err_out_free_base0:
>         pci_release_regions(pd);
>  err_out_enable:
>         kfree(info->pixmap.addr);
>  err_out_kfree:
>         framebuffer_release(info);
>  err_out:
> +       iounmap(REGS);
>         return -ENODEV;
>  }
>
> --
> 2.38.1

This patch fails for me.

sudo patch -p1 < /tmp/patch
Passwort:
patching file drivers/video/fbdev/nvidia/nvidia.c
Hunk #1 FAILED at 1197.
Hunk #2 FAILED at 1220.
Hunk #3 FAILED at 1278.
Hunk #4 FAILED at 1298.
Hunk #5 FAILED at 1318.
Hunk #6 FAILED at 1401.
Hunk #7 FAILED at 1415.
7 out of 7 hunks FAILED -- saving rejects to file
drivers/video/fbdev/nvidia/nvidia.c.rej

See attachments.

Best
Zeno

[-- Attachment #2: patch --]
[-- Type: application/octet-stream, Size: 5860 bytes --]

---
 drivers/video/fbdev/nvidia/nvidia.c | 81 +++++++++++++++--------------
 1 file changed, 42 insertions(+), 39 deletions(-)

diff --git a/drivers/video/fbdev/nvidia/nvidia.c b/drivers/video/fbdev/nvidia/nvidia.c
index 1960916098d4..e60a276b4855 100644
--- a/drivers/video/fbdev/nvidia/nvidia.c
+++ b/drivers/video/fbdev/nvidia/nvidia.c
@@ -1197,17 +1197,17 @@ static int nvidia_set_fbinfo(struct fb_info *info)
        return nvidiafb_check_var(&info->var, info);
 }

-static u32 nvidia_get_chipset(struct fb_info *info)
+static u32 nvidia_get_chipset(struct pci_dev *pci_dev,
+                             volatile u32 __iomem *REGS)
 {
-       struct nvidia_par *par = info->par;
-       u32 id = (par->pci_dev->vendor << 16) | par->pci_dev->device;
+       u32 id = (pci_dev->vendor << 16) | pci_dev->device;

        printk(KERN_INFO PFX "Device ID: %x \n", id);

        if ((id & 0xfff0) == 0x00f0 ||
            (id & 0xfff0) == 0x02e0) {
                /* pci-e */
-               id = NV_RD32(par->REGS, 0x1800);
+               id = NV_RD32(REGS, 0x1800);

                if ((id & 0x0000ffff) == 0x000010DE)
                        id = 0x10DE0000 | (id >> 16);
@@ -1220,12 +1220,11 @@ static u32 nvidia_get_chipset(struct fb_info *info)
        return id;
 }

-static u32 nvidia_get_arch(struct fb_info *info)
+static u32 nvidia_get_arch(u32 Chipset)
 {
-       struct nvidia_par *par = info->par;
        u32 arch = 0;

-       switch (par->Chipset & 0x0ff0) {
+       switch (Chipset & 0x0ff0) {
        case 0x0100:            /* GeForce 256 */
        case 0x0110:            /* GeForce2 MX */
        case 0x0150:            /* GeForce2 */
@@ -1278,16 +1277,44 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
        struct fb_info *info;
        unsigned short cmd;
        int ret;
+       volatile u32 __iomem *REGS;
+       int Chipset;
+       u32 Architecture;

        NVTRACE_ENTER();
        assert(pd != NULL);

+       if (pci_enable_device(pd)) {
+               printk(KERN_ERR PFX "cannot enable PCI device\n");
+               return -ENODEV;
+       }
+
+       /* enable IO and mem if not already done */
+       pci_read_config_word(pd, PCI_COMMAND, &cmd);
+       cmd |= (PCI_COMMAND_IO | PCI_COMMAND_MEMORY);
+       pci_write_config_word(pd, PCI_COMMAND, cmd);
+
+       nvidiafb_fix.mmio_start = pci_resource_start(pd, 0);
+       nvidiafb_fix.mmio_len = pci_resource_len(pd, 0);
+
+       REGS = ioremap(nvidiafb_fix.mmio_start, nvidiafb_fix.mmio_len);
+       if (!REGS) {
+               printk(KERN_ERR PFX "cannot ioremap MMIO base\n");
+               return -ENODEV;
+       }
+
+       Chipset = nvidia_get_chipset(pd, REGS);
+       Architecture = nvidia_get_arch(Chipset);
+       if (Architecture == 0) {
+               printk(KERN_ERR PFX "unknown NV_ARCH\n");
+               goto err_out;
+       }
+
        ret = aperture_remove_conflicting_pci_devices(pd, "nvidiafb");
        if (ret)
-               return ret;
+               goto err_out;

        info = framebuffer_alloc(sizeof(struct nvidia_par), &pd->dev);
-
        if (!info)
                goto err_out;

@@ -1298,11 +1325,6 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
        if (info->pixmap.addr == NULL)
                goto err_out_kfree;

-       if (pci_enable_device(pd)) {
-               printk(KERN_ERR PFX "cannot enable PCI device\n");
-               goto err_out_enable;
-       }
-
        if (pci_request_regions(pd, "nvidiafb")) {
                printk(KERN_ERR PFX "cannot request PCI regions\n");
                goto err_out_enable;
@@ -1318,34 +1340,17 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
        par->paneltweak = paneltweak;
        par->reverse_i2c = reverse_i2c;

-       /* enable IO and mem if not already done */
-       pci_read_config_word(pd, PCI_COMMAND, &cmd);
-       cmd |= (PCI_COMMAND_IO | PCI_COMMAND_MEMORY);
-       pci_write_config_word(pd, PCI_COMMAND, cmd);
-
-       nvidiafb_fix.mmio_start = pci_resource_start(pd, 0);
        nvidiafb_fix.smem_start = pci_resource_start(pd, 1);
-       nvidiafb_fix.mmio_len = pci_resource_len(pd, 0);
-
-       par->REGS = ioremap(nvidiafb_fix.mmio_start, nvidiafb_fix.mmio_len);

-       if (!par->REGS) {
-               printk(KERN_ERR PFX "cannot ioremap MMIO base\n");
-               goto err_out_free_base0;
-       }
+       par->REGS = REGS;

-       par->Chipset = nvidia_get_chipset(info);
-       par->Architecture = nvidia_get_arch(info);
-
-       if (par->Architecture == 0) {
-               printk(KERN_ERR PFX "unknown NV_ARCH\n");
-               goto err_out_arch;
-       }
+       par->Chipset = Chipset;
+       par->Architecture = Architecture;

        sprintf(nvidiafb_fix.id, "NV%x", (pd->device & 0x0ff0) >> 4);

        if (NVCommonSetup(info))
-               goto err_out_arch;
+               goto err_out_free_base0;

        par->FbAddress = nvidiafb_fix.smem_start;
        par->FbMapSize = par->RamAmountKBytes * 1024;
@@ -1401,7 +1406,6 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
                goto err_out_iounmap_fb;
        }

-
        printk(KERN_INFO PFX
               "PCI nVidia %s framebuffer (%dMB @ 0x%lX)\n",
               info->fix.id,
@@ -1415,15 +1419,14 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
 err_out_free_base1:
        fb_destroy_modedb(info->monspecs.modedb);
        nvidia_delete_i2c_busses(par);
-err_out_arch:
-       iounmap(par->REGS);
- err_out_free_base0:
+err_out_free_base0:
        pci_release_regions(pd);
 err_out_enable:
        kfree(info->pixmap.addr);
 err_out_kfree:
        framebuffer_release(info);
 err_out:
+       iounmap(REGS);
        return -ENODEV;
 }

--
2.38.1

[-- Attachment #3: nvidia.c.rej --]
[-- Type: text/x-reject, Size: 5610 bytes --]

--- drivers/video/fbdev/nvidia/nvidia.c
+++ drivers/video/fbdev/nvidia/nvidia.c
@@ -1197,17 +1197,17 @@ static int nvidia_set_fbinfo(struct fb_info *info)
        return nvidiafb_check_var(&info->var, info);
 }
 
-static u32 nvidia_get_chipset(struct fb_info *info)
+static u32 nvidia_get_chipset(struct pci_dev *pci_dev,
+                             volatile u32 __iomem *REGS)
 {
-       struct nvidia_par *par = info->par;
-       u32 id = (par->pci_dev->vendor << 16) | par->pci_dev->device;
+       u32 id = (pci_dev->vendor << 16) | pci_dev->device;
 
        printk(KERN_INFO PFX "Device ID: %x \n", id);
 
        if ((id & 0xfff0) == 0x00f0 ||
            (id & 0xfff0) == 0x02e0) {
                /* pci-e */
-               id = NV_RD32(par->REGS, 0x1800);
+               id = NV_RD32(REGS, 0x1800);
 
                if ((id & 0x0000ffff) == 0x000010DE)
                        id = 0x10DE0000 | (id >> 16);
@@ -1220,12 +1220,11 @@ static u32 nvidia_get_chipset(struct fb_info *info)
        return id;
 }
 
-static u32 nvidia_get_arch(struct fb_info *info)
+static u32 nvidia_get_arch(u32 Chipset)
 {
-       struct nvidia_par *par = info->par;
        u32 arch = 0;
 
-       switch (par->Chipset & 0x0ff0) {
+       switch (Chipset & 0x0ff0) {
        case 0x0100:            /* GeForce 256 */
        case 0x0110:            /* GeForce2 MX */
        case 0x0150:            /* GeForce2 */
@@ -1278,16 +1277,44 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
        struct fb_info *info;
        unsigned short cmd;
        int ret;
+       volatile u32 __iomem *REGS;
+       int Chipset;
+       u32 Architecture;
 
        NVTRACE_ENTER();
        assert(pd != NULL);
 
+       if (pci_enable_device(pd)) {
+               printk(KERN_ERR PFX "cannot enable PCI device\n");
+               return -ENODEV;
+       }
+
+       /* enable IO and mem if not already done */
+       pci_read_config_word(pd, PCI_COMMAND, &cmd);
+       cmd |= (PCI_COMMAND_IO | PCI_COMMAND_MEMORY);
+       pci_write_config_word(pd, PCI_COMMAND, cmd);
+
+       nvidiafb_fix.mmio_start = pci_resource_start(pd, 0);
+       nvidiafb_fix.mmio_len = pci_resource_len(pd, 0);
+
+       REGS = ioremap(nvidiafb_fix.mmio_start, nvidiafb_fix.mmio_len);
+       if (!REGS) {
+               printk(KERN_ERR PFX "cannot ioremap MMIO base\n");
+               return -ENODEV;
+       }
+
+       Chipset = nvidia_get_chipset(pd, REGS);
+       Architecture = nvidia_get_arch(Chipset);
+       if (Architecture == 0) {
+               printk(KERN_ERR PFX "unknown NV_ARCH\n");
+               goto err_out;
+       }
+
        ret = aperture_remove_conflicting_pci_devices(pd, "nvidiafb");
        if (ret)
-               return ret;
+               goto err_out;
 
        info = framebuffer_alloc(sizeof(struct nvidia_par), &pd->dev);
-
        if (!info)
                goto err_out;
 
@@ -1298,11 +1325,6 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
        if (info->pixmap.addr == NULL)
                goto err_out_kfree;
 
-       if (pci_enable_device(pd)) {
-               printk(KERN_ERR PFX "cannot enable PCI device\n");
-               goto err_out_enable;
-       }
-
        if (pci_request_regions(pd, "nvidiafb")) {
                printk(KERN_ERR PFX "cannot request PCI regions\n");
                goto err_out_enable;
@@ -1318,34 +1340,17 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
        par->paneltweak = paneltweak;
        par->reverse_i2c = reverse_i2c;
 
-       /* enable IO and mem if not already done */
-       pci_read_config_word(pd, PCI_COMMAND, &cmd);
-       cmd |= (PCI_COMMAND_IO | PCI_COMMAND_MEMORY);
-       pci_write_config_word(pd, PCI_COMMAND, cmd);
-
-       nvidiafb_fix.mmio_start = pci_resource_start(pd, 0);
        nvidiafb_fix.smem_start = pci_resource_start(pd, 1);
-       nvidiafb_fix.mmio_len = pci_resource_len(pd, 0);
-
-       par->REGS = ioremap(nvidiafb_fix.mmio_start, nvidiafb_fix.mmio_len);
 
-       if (!par->REGS) {
-               printk(KERN_ERR PFX "cannot ioremap MMIO base\n");
-               goto err_out_free_base0;
-       }
+       par->REGS = REGS;
 
-       par->Chipset = nvidia_get_chipset(info);
-       par->Architecture = nvidia_get_arch(info);
-
-       if (par->Architecture == 0) {
-               printk(KERN_ERR PFX "unknown NV_ARCH\n");
-               goto err_out_arch;
-       }
+       par->Chipset = Chipset;
+       par->Architecture = Architecture;
 
        sprintf(nvidiafb_fix.id, "NV%x", (pd->device & 0x0ff0) >> 4);
 
        if (NVCommonSetup(info))
-               goto err_out_arch;
+               goto err_out_free_base0;
 
        par->FbAddress = nvidiafb_fix.smem_start;
        par->FbMapSize = par->RamAmountKBytes * 1024;
@@ -1401,7 +1406,6 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
                goto err_out_iounmap_fb;
        }
 
-
        printk(KERN_INFO PFX
               "PCI nVidia %s framebuffer (%dMB @ 0x%lX)\n",
               info->fix.id,
@@ -1415,15 +1419,14 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
 err_out_free_base1:
        fb_destroy_modedb(info->monspecs.modedb);
        nvidia_delete_i2c_busses(par);
-err_out_arch:
-       iounmap(par->REGS);
- err_out_free_base0:
+err_out_free_base0:
        pci_release_regions(pd);
 err_out_enable:
        kfree(info->pixmap.addr);
 err_out_kfree:
        framebuffer_release(info);
 err_out:
+       iounmap(REGS);
        return -ENODEV;
 }
 

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [PATCH] nvidiafb: detect the hardware support before removing console.
  2023-02-06  7:52 ` Zeno Davatz
@ 2023-02-06  7:54   ` Dave Airlie
  2023-02-06  8:01     ` Zeno Davatz
  0 siblings, 1 reply; 10+ messages in thread
From: Dave Airlie @ 2023-02-06  7:54 UTC (permalink / raw)
  To: Zeno Davatz
  Cc: Bjorn Helgaas, Bjorn Helgaas, linux-fbdev, dri-devel,
	linux-kernel, Dave Airlie

On Mon, 6 Feb 2023 at 17:52, Zeno Davatz <zdavatz@gmail.com> wrote:
>
> Dear Dave
>
> Thank you for your patch.
>
> On Sun, Feb 5, 2023 at 10:07 PM Dave Airlie <airlied@gmail.com> wrote:
> >
> > From: Dave Airlie <airlied@redhat.com>
> >
> > This driver removed the console, but hasn't yet decided if it could
> > take over the console yet. Instead of doing that, probe the hw for
> > support and then remove the console afterwards.
> >
> > Signed-off-by: Dave Airlie <airlied@redhat.com>
> > Fixes: https://bugzilla.kernel.org/show_bug.cgi?id=216859
> > Reported-by: Zeno Davatz <zdavatz@gmail.com>
> > ---
> >  drivers/video/fbdev/nvidia/nvidia.c | 81 +++++++++++++++--------------
> >  1 file changed, 42 insertions(+), 39 deletions(-)
> >
> > diff --git a/drivers/video/fbdev/nvidia/nvidia.c b/drivers/video/fbdev/nvidia/nvidia.c
> > index 1960916098d4..e60a276b4855 100644
> > --- a/drivers/video/fbdev/nvidia/nvidia.c
> > +++ b/drivers/video/fbdev/nvidia/nvidia.c
> > @@ -1197,17 +1197,17 @@ static int nvidia_set_fbinfo(struct fb_info *info)
> >         return nvidiafb_check_var(&info->var, info);
> >  }
> >
> > -static u32 nvidia_get_chipset(struct fb_info *info)
> > +static u32 nvidia_get_chipset(struct pci_dev *pci_dev,
> > +                             volatile u32 __iomem *REGS)
> >  {
> > -       struct nvidia_par *par = info->par;
> > -       u32 id = (par->pci_dev->vendor << 16) | par->pci_dev->device;
> > +       u32 id = (pci_dev->vendor << 16) | pci_dev->device;
> >
> >         printk(KERN_INFO PFX "Device ID: %x \n", id);
> >
> >         if ((id & 0xfff0) == 0x00f0 ||
> >             (id & 0xfff0) == 0x02e0) {
> >                 /* pci-e */
> > -               id = NV_RD32(par->REGS, 0x1800);
> > +               id = NV_RD32(REGS, 0x1800);
> >
> >                 if ((id & 0x0000ffff) == 0x000010DE)
> >                         id = 0x10DE0000 | (id >> 16);
> > @@ -1220,12 +1220,11 @@ static u32 nvidia_get_chipset(struct fb_info *info)
> >         return id;
> >  }
> >
> > -static u32 nvidia_get_arch(struct fb_info *info)
> > +static u32 nvidia_get_arch(u32 Chipset)
> >  {
> > -       struct nvidia_par *par = info->par;
> >         u32 arch = 0;
> >
> > -       switch (par->Chipset & 0x0ff0) {
> > +       switch (Chipset & 0x0ff0) {
> >         case 0x0100:            /* GeForce 256 */
> >         case 0x0110:            /* GeForce2 MX */
> >         case 0x0150:            /* GeForce2 */
> > @@ -1278,16 +1277,44 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
> >         struct fb_info *info;
> >         unsigned short cmd;
> >         int ret;
> > +       volatile u32 __iomem *REGS;
> > +       int Chipset;
> > +       u32 Architecture;
> >
> >         NVTRACE_ENTER();
> >         assert(pd != NULL);
> >
> > +       if (pci_enable_device(pd)) {
> > +               printk(KERN_ERR PFX "cannot enable PCI device\n");
> > +               return -ENODEV;
> > +       }
> > +
> > +       /* enable IO and mem if not already done */
> > +       pci_read_config_word(pd, PCI_COMMAND, &cmd);
> > +       cmd |= (PCI_COMMAND_IO | PCI_COMMAND_MEMORY);
> > +       pci_write_config_word(pd, PCI_COMMAND, cmd);
> > +
> > +       nvidiafb_fix.mmio_start = pci_resource_start(pd, 0);
> > +       nvidiafb_fix.mmio_len = pci_resource_len(pd, 0);
> > +
> > +       REGS = ioremap(nvidiafb_fix.mmio_start, nvidiafb_fix.mmio_len);
> > +       if (!REGS) {
> > +               printk(KERN_ERR PFX "cannot ioremap MMIO base\n");
> > +               return -ENODEV;
> > +       }
> > +
> > +       Chipset = nvidia_get_chipset(pd, REGS);
> > +       Architecture = nvidia_get_arch(Chipset);
> > +       if (Architecture == 0) {
> > +               printk(KERN_ERR PFX "unknown NV_ARCH\n");
> > +               goto err_out;
> > +       }
> > +
> >         ret = aperture_remove_conflicting_pci_devices(pd, "nvidiafb");
> >         if (ret)
> > -               return ret;
> > +               goto err_out;
> >
> >         info = framebuffer_alloc(sizeof(struct nvidia_par), &pd->dev);
> > -
> >         if (!info)
> >                 goto err_out;
> >
> > @@ -1298,11 +1325,6 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
> >         if (info->pixmap.addr == NULL)
> >                 goto err_out_kfree;
> >
> > -       if (pci_enable_device(pd)) {
> > -               printk(KERN_ERR PFX "cannot enable PCI device\n");
> > -               goto err_out_enable;
> > -       }
> > -
> >         if (pci_request_regions(pd, "nvidiafb")) {
> >                 printk(KERN_ERR PFX "cannot request PCI regions\n");
> >                 goto err_out_enable;
> > @@ -1318,34 +1340,17 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
> >         par->paneltweak = paneltweak;
> >         par->reverse_i2c = reverse_i2c;
> >
> > -       /* enable IO and mem if not already done */
> > -       pci_read_config_word(pd, PCI_COMMAND, &cmd);
> > -       cmd |= (PCI_COMMAND_IO | PCI_COMMAND_MEMORY);
> > -       pci_write_config_word(pd, PCI_COMMAND, cmd);
> > -
> > -       nvidiafb_fix.mmio_start = pci_resource_start(pd, 0);
> >         nvidiafb_fix.smem_start = pci_resource_start(pd, 1);
> > -       nvidiafb_fix.mmio_len = pci_resource_len(pd, 0);
> > -
> > -       par->REGS = ioremap(nvidiafb_fix.mmio_start, nvidiafb_fix.mmio_len);
> >
> > -       if (!par->REGS) {
> > -               printk(KERN_ERR PFX "cannot ioremap MMIO base\n");
> > -               goto err_out_free_base0;
> > -       }
> > +       par->REGS = REGS;
> >
> > -       par->Chipset = nvidia_get_chipset(info);
> > -       par->Architecture = nvidia_get_arch(info);
> > -
> > -       if (par->Architecture == 0) {
> > -               printk(KERN_ERR PFX "unknown NV_ARCH\n");
> > -               goto err_out_arch;
> > -       }
> > +       par->Chipset = Chipset;
> > +       par->Architecture = Architecture;
> >
> >         sprintf(nvidiafb_fix.id, "NV%x", (pd->device & 0x0ff0) >> 4);
> >
> >         if (NVCommonSetup(info))
> > -               goto err_out_arch;
> > +               goto err_out_free_base0;
> >
> >         par->FbAddress = nvidiafb_fix.smem_start;
> >         par->FbMapSize = par->RamAmountKBytes * 1024;
> > @@ -1401,7 +1406,6 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
> >                 goto err_out_iounmap_fb;
> >         }
> >
> > -
> >         printk(KERN_INFO PFX
> >                "PCI nVidia %s framebuffer (%dMB @ 0x%lX)\n",
> >                info->fix.id,
> > @@ -1415,15 +1419,14 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
> >  err_out_free_base1:
> >         fb_destroy_modedb(info->monspecs.modedb);
> >         nvidia_delete_i2c_busses(par);
> > -err_out_arch:
> > -       iounmap(par->REGS);
> > - err_out_free_base0:
> > +err_out_free_base0:
> >         pci_release_regions(pd);
> >  err_out_enable:
> >         kfree(info->pixmap.addr);
> >  err_out_kfree:
> >         framebuffer_release(info);
> >  err_out:
> > +       iounmap(REGS);
> >         return -ENODEV;
> >  }
> >
> > --
> > 2.38.1
>
> This patch fails for me.

I've based the patch on 6.2-rc7, please make sure to not have the
previous revert committed, this is to replace that patch.

Dave.
>
> sudo patch -p1 < /tmp/patch
> Passwort:
> patching file drivers/video/fbdev/nvidia/nvidia.c
> Hunk #1 FAILED at 1197.
> Hunk #2 FAILED at 1220.
> Hunk #3 FAILED at 1278.
> Hunk #4 FAILED at 1298.
> Hunk #5 FAILED at 1318.
> Hunk #6 FAILED at 1401.
> Hunk #7 FAILED at 1415.
> 7 out of 7 hunks FAILED -- saving rejects to file
> drivers/video/fbdev/nvidia/nvidia.c.rej
>
> See attachments.
>
> Best
> Zeno

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] nvidiafb: detect the hardware support before removing console.
  2023-02-06  7:54   ` Dave Airlie
@ 2023-02-06  8:01     ` Zeno Davatz
  2023-02-06  8:09       ` Dave Airlie
  0 siblings, 1 reply; 10+ messages in thread
From: Zeno Davatz @ 2023-02-06  8:01 UTC (permalink / raw)
  To: Dave Airlie
  Cc: Bjorn Helgaas, Bjorn Helgaas, linux-fbdev, dri-devel,
	linux-kernel, Dave Airlie

Dear Dave

On Mon, Feb 6, 2023 at 8:54 AM Dave Airlie <airlied@gmail.com> wrote:
>
> On Mon, 6 Feb 2023 at 17:52, Zeno Davatz <zdavatz@gmail.com> wrote:
> >
> > Dear Dave
> >
> > Thank you for your patch.
> >
> > On Sun, Feb 5, 2023 at 10:07 PM Dave Airlie <airlied@gmail.com> wrote:
> > >
> > > From: Dave Airlie <airlied@redhat.com>
> > >
> > > This driver removed the console, but hasn't yet decided if it could
> > > take over the console yet. Instead of doing that, probe the hw for
> > > support and then remove the console afterwards.
> > >
> > > Signed-off-by: Dave Airlie <airlied@redhat.com>
> > > Fixes: https://bugzilla.kernel.org/show_bug.cgi?id=216859
> > > Reported-by: Zeno Davatz <zdavatz@gmail.com>
> > > ---
> > >  drivers/video/fbdev/nvidia/nvidia.c | 81 +++++++++++++++--------------
> > >  1 file changed, 42 insertions(+), 39 deletions(-)
> > >
> > > diff --git a/drivers/video/fbdev/nvidia/nvidia.c b/drivers/video/fbdev/nvidia/nvidia.c
> > > index 1960916098d4..e60a276b4855 100644
> > > --- a/drivers/video/fbdev/nvidia/nvidia.c
> > > +++ b/drivers/video/fbdev/nvidia/nvidia.c
> > > @@ -1197,17 +1197,17 @@ static int nvidia_set_fbinfo(struct fb_info *info)
> > >         return nvidiafb_check_var(&info->var, info);
> > >  }
> > >
> > > -static u32 nvidia_get_chipset(struct fb_info *info)
> > > +static u32 nvidia_get_chipset(struct pci_dev *pci_dev,
> > > +                             volatile u32 __iomem *REGS)
> > >  {
> > > -       struct nvidia_par *par = info->par;
> > > -       u32 id = (par->pci_dev->vendor << 16) | par->pci_dev->device;
> > > +       u32 id = (pci_dev->vendor << 16) | pci_dev->device;
> > >
> > >         printk(KERN_INFO PFX "Device ID: %x \n", id);
> > >
> > >         if ((id & 0xfff0) == 0x00f0 ||
> > >             (id & 0xfff0) == 0x02e0) {
> > >                 /* pci-e */
> > > -               id = NV_RD32(par->REGS, 0x1800);
> > > +               id = NV_RD32(REGS, 0x1800);
> > >
> > >                 if ((id & 0x0000ffff) == 0x000010DE)
> > >                         id = 0x10DE0000 | (id >> 16);
> > > @@ -1220,12 +1220,11 @@ static u32 nvidia_get_chipset(struct fb_info *info)
> > >         return id;
> > >  }
> > >
> > > -static u32 nvidia_get_arch(struct fb_info *info)
> > > +static u32 nvidia_get_arch(u32 Chipset)
> > >  {
> > > -       struct nvidia_par *par = info->par;
> > >         u32 arch = 0;
> > >
> > > -       switch (par->Chipset & 0x0ff0) {
> > > +       switch (Chipset & 0x0ff0) {
> > >         case 0x0100:            /* GeForce 256 */
> > >         case 0x0110:            /* GeForce2 MX */
> > >         case 0x0150:            /* GeForce2 */
> > > @@ -1278,16 +1277,44 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
> > >         struct fb_info *info;
> > >         unsigned short cmd;
> > >         int ret;
> > > +       volatile u32 __iomem *REGS;
> > > +       int Chipset;
> > > +       u32 Architecture;
> > >
> > >         NVTRACE_ENTER();
> > >         assert(pd != NULL);
> > >
> > > +       if (pci_enable_device(pd)) {
> > > +               printk(KERN_ERR PFX "cannot enable PCI device\n");
> > > +               return -ENODEV;
> > > +       }
> > > +
> > > +       /* enable IO and mem if not already done */
> > > +       pci_read_config_word(pd, PCI_COMMAND, &cmd);
> > > +       cmd |= (PCI_COMMAND_IO | PCI_COMMAND_MEMORY);
> > > +       pci_write_config_word(pd, PCI_COMMAND, cmd);
> > > +
> > > +       nvidiafb_fix.mmio_start = pci_resource_start(pd, 0);
> > > +       nvidiafb_fix.mmio_len = pci_resource_len(pd, 0);
> > > +
> > > +       REGS = ioremap(nvidiafb_fix.mmio_start, nvidiafb_fix.mmio_len);
> > > +       if (!REGS) {
> > > +               printk(KERN_ERR PFX "cannot ioremap MMIO base\n");
> > > +               return -ENODEV;
> > > +       }
> > > +
> > > +       Chipset = nvidia_get_chipset(pd, REGS);
> > > +       Architecture = nvidia_get_arch(Chipset);
> > > +       if (Architecture == 0) {
> > > +               printk(KERN_ERR PFX "unknown NV_ARCH\n");
> > > +               goto err_out;
> > > +       }
> > > +
> > >         ret = aperture_remove_conflicting_pci_devices(pd, "nvidiafb");
> > >         if (ret)
> > > -               return ret;
> > > +               goto err_out;
> > >
> > >         info = framebuffer_alloc(sizeof(struct nvidia_par), &pd->dev);
> > > -
> > >         if (!info)
> > >                 goto err_out;
> > >
> > > @@ -1298,11 +1325,6 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
> > >         if (info->pixmap.addr == NULL)
> > >                 goto err_out_kfree;
> > >
> > > -       if (pci_enable_device(pd)) {
> > > -               printk(KERN_ERR PFX "cannot enable PCI device\n");
> > > -               goto err_out_enable;
> > > -       }
> > > -
> > >         if (pci_request_regions(pd, "nvidiafb")) {
> > >                 printk(KERN_ERR PFX "cannot request PCI regions\n");
> > >                 goto err_out_enable;
> > > @@ -1318,34 +1340,17 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
> > >         par->paneltweak = paneltweak;
> > >         par->reverse_i2c = reverse_i2c;
> > >
> > > -       /* enable IO and mem if not already done */
> > > -       pci_read_config_word(pd, PCI_COMMAND, &cmd);
> > > -       cmd |= (PCI_COMMAND_IO | PCI_COMMAND_MEMORY);
> > > -       pci_write_config_word(pd, PCI_COMMAND, cmd);
> > > -
> > > -       nvidiafb_fix.mmio_start = pci_resource_start(pd, 0);
> > >         nvidiafb_fix.smem_start = pci_resource_start(pd, 1);
> > > -       nvidiafb_fix.mmio_len = pci_resource_len(pd, 0);
> > > -
> > > -       par->REGS = ioremap(nvidiafb_fix.mmio_start, nvidiafb_fix.mmio_len);
> > >
> > > -       if (!par->REGS) {
> > > -               printk(KERN_ERR PFX "cannot ioremap MMIO base\n");
> > > -               goto err_out_free_base0;
> > > -       }
> > > +       par->REGS = REGS;
> > >
> > > -       par->Chipset = nvidia_get_chipset(info);
> > > -       par->Architecture = nvidia_get_arch(info);
> > > -
> > > -       if (par->Architecture == 0) {
> > > -               printk(KERN_ERR PFX "unknown NV_ARCH\n");
> > > -               goto err_out_arch;
> > > -       }
> > > +       par->Chipset = Chipset;
> > > +       par->Architecture = Architecture;
> > >
> > >         sprintf(nvidiafb_fix.id, "NV%x", (pd->device & 0x0ff0) >> 4);
> > >
> > >         if (NVCommonSetup(info))
> > > -               goto err_out_arch;
> > > +               goto err_out_free_base0;
> > >
> > >         par->FbAddress = nvidiafb_fix.smem_start;
> > >         par->FbMapSize = par->RamAmountKBytes * 1024;
> > > @@ -1401,7 +1406,6 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
> > >                 goto err_out_iounmap_fb;
> > >         }
> > >
> > > -
> > >         printk(KERN_INFO PFX
> > >                "PCI nVidia %s framebuffer (%dMB @ 0x%lX)\n",
> > >                info->fix.id,
> > > @@ -1415,15 +1419,14 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
> > >  err_out_free_base1:
> > >         fb_destroy_modedb(info->monspecs.modedb);
> > >         nvidia_delete_i2c_busses(par);
> > > -err_out_arch:
> > > -       iounmap(par->REGS);
> > > - err_out_free_base0:
> > > +err_out_free_base0:
> > >         pci_release_regions(pd);
> > >  err_out_enable:
> > >         kfree(info->pixmap.addr);
> > >  err_out_kfree:
> > >         framebuffer_release(info);
> > >  err_out:
> > > +       iounmap(REGS);
> > >         return -ENODEV;
> > >  }
> > >
> > > --
> > > 2.38.1
> >
> > This patch fails for me.
>
> I've based the patch on 6.2-rc7, please make sure to not have the
> previous revert committed, this is to replace that patch.

Can you guide me through the steps please?

I done:

1. cd /usr/src/linux
2. sudo git pull
3. then I applied your patch.

Am I doing something wrong?

/usr/src/linux> cat .git/config
[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
[remote "origin"]
        fetch = +refs/heads/*:refs/remotes/origin/*
        url = git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
[branch "master"]
        remote = origin
        merge = refs/heads/master
[remote "stable"]
        url = https://kernel.googlesource.com/pub/scm/linux/kernel/git/stable/linux-stable
        fetch = +refs/heads/*:refs/remotes/stable/*

I am pulling from the "master" branch.

Best
Zeno

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] nvidiafb: detect the hardware support before removing console.
  2023-02-06  8:01     ` Zeno Davatz
@ 2023-02-06  8:09       ` Dave Airlie
  2023-02-06  8:37         ` Zeno Davatz
  0 siblings, 1 reply; 10+ messages in thread
From: Dave Airlie @ 2023-02-06  8:09 UTC (permalink / raw)
  To: Zeno Davatz
  Cc: Bjorn Helgaas, Bjorn Helgaas, linux-fbdev, dri-devel,
	linux-kernel, Dave Airlie

On Mon, 6 Feb 2023 at 18:01, Zeno Davatz <zdavatz@gmail.com> wrote:
>
> Dear Dave
>
> On Mon, Feb 6, 2023 at 8:54 AM Dave Airlie <airlied@gmail.com> wrote:
> >
> > On Mon, 6 Feb 2023 at 17:52, Zeno Davatz <zdavatz@gmail.com> wrote:
> > >
> > > Dear Dave
> > >
> > > Thank you for your patch.
> > >
> > > On Sun, Feb 5, 2023 at 10:07 PM Dave Airlie <airlied@gmail.com> wrote:
> > > >
> > > > From: Dave Airlie <airlied@redhat.com>
> > > >
> > > > This driver removed the console, but hasn't yet decided if it could
> > > > take over the console yet. Instead of doing that, probe the hw for
> > > > support and then remove the console afterwards.
> > > >
> > > > Signed-off-by: Dave Airlie <airlied@redhat.com>
> > > > Fixes: https://bugzilla.kernel.org/show_bug.cgi?id=216859
> > > > Reported-by: Zeno Davatz <zdavatz@gmail.com>
> > > > ---
> > > >  drivers/video/fbdev/nvidia/nvidia.c | 81 +++++++++++++++--------------
> > > >  1 file changed, 42 insertions(+), 39 deletions(-)
> > > >
> > > > diff --git a/drivers/video/fbdev/nvidia/nvidia.c b/drivers/video/fbdev/nvidia/nvidia.c
> > > > index 1960916098d4..e60a276b4855 100644
> > > > --- a/drivers/video/fbdev/nvidia/nvidia.c
> > > > +++ b/drivers/video/fbdev/nvidia/nvidia.c
> > > > @@ -1197,17 +1197,17 @@ static int nvidia_set_fbinfo(struct fb_info *info)
> > > >         return nvidiafb_check_var(&info->var, info);
> > > >  }
> > > >
> > > > -static u32 nvidia_get_chipset(struct fb_info *info)
> > > > +static u32 nvidia_get_chipset(struct pci_dev *pci_dev,
> > > > +                             volatile u32 __iomem *REGS)
> > > >  {
> > > > -       struct nvidia_par *par = info->par;
> > > > -       u32 id = (par->pci_dev->vendor << 16) | par->pci_dev->device;
> > > > +       u32 id = (pci_dev->vendor << 16) | pci_dev->device;
> > > >
> > > >         printk(KERN_INFO PFX "Device ID: %x \n", id);
> > > >
> > > >         if ((id & 0xfff0) == 0x00f0 ||
> > > >             (id & 0xfff0) == 0x02e0) {
> > > >                 /* pci-e */
> > > > -               id = NV_RD32(par->REGS, 0x1800);
> > > > +               id = NV_RD32(REGS, 0x1800);
> > > >
> > > >                 if ((id & 0x0000ffff) == 0x000010DE)
> > > >                         id = 0x10DE0000 | (id >> 16);
> > > > @@ -1220,12 +1220,11 @@ static u32 nvidia_get_chipset(struct fb_info *info)
> > > >         return id;
> > > >  }
> > > >
> > > > -static u32 nvidia_get_arch(struct fb_info *info)
> > > > +static u32 nvidia_get_arch(u32 Chipset)
> > > >  {
> > > > -       struct nvidia_par *par = info->par;
> > > >         u32 arch = 0;
> > > >
> > > > -       switch (par->Chipset & 0x0ff0) {
> > > > +       switch (Chipset & 0x0ff0) {
> > > >         case 0x0100:            /* GeForce 256 */
> > > >         case 0x0110:            /* GeForce2 MX */
> > > >         case 0x0150:            /* GeForce2 */
> > > > @@ -1278,16 +1277,44 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
> > > >         struct fb_info *info;
> > > >         unsigned short cmd;
> > > >         int ret;
> > > > +       volatile u32 __iomem *REGS;
> > > > +       int Chipset;
> > > > +       u32 Architecture;
> > > >
> > > >         NVTRACE_ENTER();
> > > >         assert(pd != NULL);
> > > >
> > > > +       if (pci_enable_device(pd)) {
> > > > +               printk(KERN_ERR PFX "cannot enable PCI device\n");
> > > > +               return -ENODEV;
> > > > +       }
> > > > +
> > > > +       /* enable IO and mem if not already done */
> > > > +       pci_read_config_word(pd, PCI_COMMAND, &cmd);
> > > > +       cmd |= (PCI_COMMAND_IO | PCI_COMMAND_MEMORY);
> > > > +       pci_write_config_word(pd, PCI_COMMAND, cmd);
> > > > +
> > > > +       nvidiafb_fix.mmio_start = pci_resource_start(pd, 0);
> > > > +       nvidiafb_fix.mmio_len = pci_resource_len(pd, 0);
> > > > +
> > > > +       REGS = ioremap(nvidiafb_fix.mmio_start, nvidiafb_fix.mmio_len);
> > > > +       if (!REGS) {
> > > > +               printk(KERN_ERR PFX "cannot ioremap MMIO base\n");
> > > > +               return -ENODEV;
> > > > +       }
> > > > +
> > > > +       Chipset = nvidia_get_chipset(pd, REGS);
> > > > +       Architecture = nvidia_get_arch(Chipset);
> > > > +       if (Architecture == 0) {
> > > > +               printk(KERN_ERR PFX "unknown NV_ARCH\n");
> > > > +               goto err_out;
> > > > +       }
> > > > +
> > > >         ret = aperture_remove_conflicting_pci_devices(pd, "nvidiafb");
> > > >         if (ret)
> > > > -               return ret;
> > > > +               goto err_out;
> > > >
> > > >         info = framebuffer_alloc(sizeof(struct nvidia_par), &pd->dev);
> > > > -
> > > >         if (!info)
> > > >                 goto err_out;
> > > >
> > > > @@ -1298,11 +1325,6 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
> > > >         if (info->pixmap.addr == NULL)
> > > >                 goto err_out_kfree;
> > > >
> > > > -       if (pci_enable_device(pd)) {
> > > > -               printk(KERN_ERR PFX "cannot enable PCI device\n");
> > > > -               goto err_out_enable;
> > > > -       }
> > > > -
> > > >         if (pci_request_regions(pd, "nvidiafb")) {
> > > >                 printk(KERN_ERR PFX "cannot request PCI regions\n");
> > > >                 goto err_out_enable;
> > > > @@ -1318,34 +1340,17 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
> > > >         par->paneltweak = paneltweak;
> > > >         par->reverse_i2c = reverse_i2c;
> > > >
> > > > -       /* enable IO and mem if not already done */
> > > > -       pci_read_config_word(pd, PCI_COMMAND, &cmd);
> > > > -       cmd |= (PCI_COMMAND_IO | PCI_COMMAND_MEMORY);
> > > > -       pci_write_config_word(pd, PCI_COMMAND, cmd);
> > > > -
> > > > -       nvidiafb_fix.mmio_start = pci_resource_start(pd, 0);
> > > >         nvidiafb_fix.smem_start = pci_resource_start(pd, 1);
> > > > -       nvidiafb_fix.mmio_len = pci_resource_len(pd, 0);
> > > > -
> > > > -       par->REGS = ioremap(nvidiafb_fix.mmio_start, nvidiafb_fix.mmio_len);
> > > >
> > > > -       if (!par->REGS) {
> > > > -               printk(KERN_ERR PFX "cannot ioremap MMIO base\n");
> > > > -               goto err_out_free_base0;
> > > > -       }
> > > > +       par->REGS = REGS;
> > > >
> > > > -       par->Chipset = nvidia_get_chipset(info);
> > > > -       par->Architecture = nvidia_get_arch(info);
> > > > -
> > > > -       if (par->Architecture == 0) {
> > > > -               printk(KERN_ERR PFX "unknown NV_ARCH\n");
> > > > -               goto err_out_arch;
> > > > -       }
> > > > +       par->Chipset = Chipset;
> > > > +       par->Architecture = Architecture;
> > > >
> > > >         sprintf(nvidiafb_fix.id, "NV%x", (pd->device & 0x0ff0) >> 4);
> > > >
> > > >         if (NVCommonSetup(info))
> > > > -               goto err_out_arch;
> > > > +               goto err_out_free_base0;
> > > >
> > > >         par->FbAddress = nvidiafb_fix.smem_start;
> > > >         par->FbMapSize = par->RamAmountKBytes * 1024;
> > > > @@ -1401,7 +1406,6 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
> > > >                 goto err_out_iounmap_fb;
> > > >         }
> > > >
> > > > -
> > > >         printk(KERN_INFO PFX
> > > >                "PCI nVidia %s framebuffer (%dMB @ 0x%lX)\n",
> > > >                info->fix.id,
> > > > @@ -1415,15 +1419,14 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
> > > >  err_out_free_base1:
> > > >         fb_destroy_modedb(info->monspecs.modedb);
> > > >         nvidia_delete_i2c_busses(par);
> > > > -err_out_arch:
> > > > -       iounmap(par->REGS);
> > > > - err_out_free_base0:
> > > > +err_out_free_base0:
> > > >         pci_release_regions(pd);
> > > >  err_out_enable:
> > > >         kfree(info->pixmap.addr);
> > > >  err_out_kfree:
> > > >         framebuffer_release(info);
> > > >  err_out:
> > > > +       iounmap(REGS);
> > > >         return -ENODEV;
> > > >  }
> > > >
> > > > --
> > > > 2.38.1
> > >
> > > This patch fails for me.
> >
> > I've based the patch on 6.2-rc7, please make sure to not have the
> > previous revert committed, this is to replace that patch.
>
> Can you guide me through the steps please?
>
> I done:
>
> 1. cd /usr/src/linux
> 2. sudo git pull
> 3. then I applied your patch.
>
> Am I doing something wrong?

What is your top of tree commit? (git log)

have you got any commits on top?

git reset --hard origin/master should reset your tree to Linus top.

Dave.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] nvidiafb: detect the hardware support before removing console.
  2023-02-06  8:09       ` Dave Airlie
@ 2023-02-06  8:37         ` Zeno Davatz
  2023-02-06  8:40           ` David Airlie
  0 siblings, 1 reply; 10+ messages in thread
From: Zeno Davatz @ 2023-02-06  8:37 UTC (permalink / raw)
  To: Dave Airlie
  Cc: Bjorn Helgaas, Bjorn Helgaas, linux-fbdev, dri-devel,
	linux-kernel, Dave Airlie

Dear Dave

On Mon, Feb 6, 2023 at 9:10 AM Dave Airlie <airlied@gmail.com> wrote:
>
> On Mon, 6 Feb 2023 at 18:01, Zeno Davatz <zdavatz@gmail.com> wrote:
> >
> > Dear Dave
> >
> > On Mon, Feb 6, 2023 at 8:54 AM Dave Airlie <airlied@gmail.com> wrote:
> > >
> > > On Mon, 6 Feb 2023 at 17:52, Zeno Davatz <zdavatz@gmail.com> wrote:
> > > >
> > > > Dear Dave
> > > >
> > > > Thank you for your patch.
> > > >
> > > > On Sun, Feb 5, 2023 at 10:07 PM Dave Airlie <airlied@gmail.com> wrote:
> > > > >
> > > > > From: Dave Airlie <airlied@redhat.com>
> > > > >
> > > > > This driver removed the console, but hasn't yet decided if it could
> > > > > take over the console yet. Instead of doing that, probe the hw for
> > > > > support and then remove the console afterwards.
> > > > >
> > > > > Signed-off-by: Dave Airlie <airlied@redhat.com>
> > > > > Fixes: https://bugzilla.kernel.org/show_bug.cgi?id=216859
> > > > > Reported-by: Zeno Davatz <zdavatz@gmail.com>
> > > > > ---
> > > > >  drivers/video/fbdev/nvidia/nvidia.c | 81 +++++++++++++++--------------
> > > > >  1 file changed, 42 insertions(+), 39 deletions(-)
> > > > >
> > > > > diff --git a/drivers/video/fbdev/nvidia/nvidia.c b/drivers/video/fbdev/nvidia/nvidia.c
> > > > > index 1960916098d4..e60a276b4855 100644
> > > > > --- a/drivers/video/fbdev/nvidia/nvidia.c
> > > > > +++ b/drivers/video/fbdev/nvidia/nvidia.c
> > > > > @@ -1197,17 +1197,17 @@ static int nvidia_set_fbinfo(struct fb_info *info)
> > > > >         return nvidiafb_check_var(&info->var, info);
> > > > >  }
> > > > >
> > > > > -static u32 nvidia_get_chipset(struct fb_info *info)
> > > > > +static u32 nvidia_get_chipset(struct pci_dev *pci_dev,
> > > > > +                             volatile u32 __iomem *REGS)
> > > > >  {
> > > > > -       struct nvidia_par *par = info->par;
> > > > > -       u32 id = (par->pci_dev->vendor << 16) | par->pci_dev->device;
> > > > > +       u32 id = (pci_dev->vendor << 16) | pci_dev->device;
> > > > >
> > > > >         printk(KERN_INFO PFX "Device ID: %x \n", id);
> > > > >
> > > > >         if ((id & 0xfff0) == 0x00f0 ||
> > > > >             (id & 0xfff0) == 0x02e0) {
> > > > >                 /* pci-e */
> > > > > -               id = NV_RD32(par->REGS, 0x1800);
> > > > > +               id = NV_RD32(REGS, 0x1800);
> > > > >
> > > > >                 if ((id & 0x0000ffff) == 0x000010DE)
> > > > >                         id = 0x10DE0000 | (id >> 16);
> > > > > @@ -1220,12 +1220,11 @@ static u32 nvidia_get_chipset(struct fb_info *info)
> > > > >         return id;
> > > > >  }
> > > > >
> > > > > -static u32 nvidia_get_arch(struct fb_info *info)
> > > > > +static u32 nvidia_get_arch(u32 Chipset)
> > > > >  {
> > > > > -       struct nvidia_par *par = info->par;
> > > > >         u32 arch = 0;
> > > > >
> > > > > -       switch (par->Chipset & 0x0ff0) {
> > > > > +       switch (Chipset & 0x0ff0) {
> > > > >         case 0x0100:            /* GeForce 256 */
> > > > >         case 0x0110:            /* GeForce2 MX */
> > > > >         case 0x0150:            /* GeForce2 */
> > > > > @@ -1278,16 +1277,44 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
> > > > >         struct fb_info *info;
> > > > >         unsigned short cmd;
> > > > >         int ret;
> > > > > +       volatile u32 __iomem *REGS;
> > > > > +       int Chipset;
> > > > > +       u32 Architecture;
> > > > >
> > > > >         NVTRACE_ENTER();
> > > > >         assert(pd != NULL);
> > > > >
> > > > > +       if (pci_enable_device(pd)) {
> > > > > +               printk(KERN_ERR PFX "cannot enable PCI device\n");
> > > > > +               return -ENODEV;
> > > > > +       }
> > > > > +
> > > > > +       /* enable IO and mem if not already done */
> > > > > +       pci_read_config_word(pd, PCI_COMMAND, &cmd);
> > > > > +       cmd |= (PCI_COMMAND_IO | PCI_COMMAND_MEMORY);
> > > > > +       pci_write_config_word(pd, PCI_COMMAND, cmd);
> > > > > +
> > > > > +       nvidiafb_fix.mmio_start = pci_resource_start(pd, 0);
> > > > > +       nvidiafb_fix.mmio_len = pci_resource_len(pd, 0);
> > > > > +
> > > > > +       REGS = ioremap(nvidiafb_fix.mmio_start, nvidiafb_fix.mmio_len);
> > > > > +       if (!REGS) {
> > > > > +               printk(KERN_ERR PFX "cannot ioremap MMIO base\n");
> > > > > +               return -ENODEV;
> > > > > +       }
> > > > > +
> > > > > +       Chipset = nvidia_get_chipset(pd, REGS);
> > > > > +       Architecture = nvidia_get_arch(Chipset);
> > > > > +       if (Architecture == 0) {
> > > > > +               printk(KERN_ERR PFX "unknown NV_ARCH\n");
> > > > > +               goto err_out;
> > > > > +       }
> > > > > +
> > > > >         ret = aperture_remove_conflicting_pci_devices(pd, "nvidiafb");
> > > > >         if (ret)
> > > > > -               return ret;
> > > > > +               goto err_out;
> > > > >
> > > > >         info = framebuffer_alloc(sizeof(struct nvidia_par), &pd->dev);
> > > > > -
> > > > >         if (!info)
> > > > >                 goto err_out;
> > > > >
> > > > > @@ -1298,11 +1325,6 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
> > > > >         if (info->pixmap.addr == NULL)
> > > > >                 goto err_out_kfree;
> > > > >
> > > > > -       if (pci_enable_device(pd)) {
> > > > > -               printk(KERN_ERR PFX "cannot enable PCI device\n");
> > > > > -               goto err_out_enable;
> > > > > -       }
> > > > > -
> > > > >         if (pci_request_regions(pd, "nvidiafb")) {
> > > > >                 printk(KERN_ERR PFX "cannot request PCI regions\n");
> > > > >                 goto err_out_enable;
> > > > > @@ -1318,34 +1340,17 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
> > > > >         par->paneltweak = paneltweak;
> > > > >         par->reverse_i2c = reverse_i2c;
> > > > >
> > > > > -       /* enable IO and mem if not already done */
> > > > > -       pci_read_config_word(pd, PCI_COMMAND, &cmd);
> > > > > -       cmd |= (PCI_COMMAND_IO | PCI_COMMAND_MEMORY);
> > > > > -       pci_write_config_word(pd, PCI_COMMAND, cmd);
> > > > > -
> > > > > -       nvidiafb_fix.mmio_start = pci_resource_start(pd, 0);
> > > > >         nvidiafb_fix.smem_start = pci_resource_start(pd, 1);
> > > > > -       nvidiafb_fix.mmio_len = pci_resource_len(pd, 0);
> > > > > -
> > > > > -       par->REGS = ioremap(nvidiafb_fix.mmio_start, nvidiafb_fix.mmio_len);
> > > > >
> > > > > -       if (!par->REGS) {
> > > > > -               printk(KERN_ERR PFX "cannot ioremap MMIO base\n");
> > > > > -               goto err_out_free_base0;
> > > > > -       }
> > > > > +       par->REGS = REGS;
> > > > >
> > > > > -       par->Chipset = nvidia_get_chipset(info);
> > > > > -       par->Architecture = nvidia_get_arch(info);
> > > > > -
> > > > > -       if (par->Architecture == 0) {
> > > > > -               printk(KERN_ERR PFX "unknown NV_ARCH\n");
> > > > > -               goto err_out_arch;
> > > > > -       }
> > > > > +       par->Chipset = Chipset;
> > > > > +       par->Architecture = Architecture;
> > > > >
> > > > >         sprintf(nvidiafb_fix.id, "NV%x", (pd->device & 0x0ff0) >> 4);
> > > > >
> > > > >         if (NVCommonSetup(info))
> > > > > -               goto err_out_arch;
> > > > > +               goto err_out_free_base0;
> > > > >
> > > > >         par->FbAddress = nvidiafb_fix.smem_start;
> > > > >         par->FbMapSize = par->RamAmountKBytes * 1024;
> > > > > @@ -1401,7 +1406,6 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
> > > > >                 goto err_out_iounmap_fb;
> > > > >         }
> > > > >
> > > > > -
> > > > >         printk(KERN_INFO PFX
> > > > >                "PCI nVidia %s framebuffer (%dMB @ 0x%lX)\n",
> > > > >                info->fix.id,
> > > > > @@ -1415,15 +1419,14 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
> > > > >  err_out_free_base1:
> > > > >         fb_destroy_modedb(info->monspecs.modedb);
> > > > >         nvidia_delete_i2c_busses(par);
> > > > > -err_out_arch:
> > > > > -       iounmap(par->REGS);
> > > > > - err_out_free_base0:
> > > > > +err_out_free_base0:
> > > > >         pci_release_regions(pd);
> > > > >  err_out_enable:
> > > > >         kfree(info->pixmap.addr);
> > > > >  err_out_kfree:
> > > > >         framebuffer_release(info);
> > > > >  err_out:
> > > > > +       iounmap(REGS);
> > > > >         return -ENODEV;
> > > > >  }
> > > > >
> > > > > --
> > > > > 2.38.1
> > > >
> > > > This patch fails for me.
> > >
> > > I've based the patch on 6.2-rc7, please make sure to not have the
> > > previous revert committed, this is to replace that patch.
> >
> > Can you guide me through the steps please?
> >
> > I done:
> >
> > 1. cd /usr/src/linux
> > 2. sudo git pull
> > 3. then I applied your patch.
> >
> > Am I doing something wrong?
>
> What is your top of tree commit? (git log)
>
> have you got any commits on top?
>
> git reset --hard origin/master should reset your tree to Linus top.

1. git log shows "d2d11f342b179f1894a901f143ec7c008caba43e"
2. No, no patches on top.
3. I am doing the following steps:
/usr/src/linux> sudo git reset --hard origin/master
Passwort:
HEAD ist jetzt bei d2d11f342b17 Merge branch 'fixes' of
git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
/usr/src/linux> sudo patch -p1 < /tmp/patch
patching file drivers/video/fbdev/nvidia/nvidia.c
Hunk #1 FAILED at 1197.
Hunk #2 FAILED at 1220.
Hunk #3 FAILED at 1278.
Hunk #4 FAILED at 1298.
Hunk #5 FAILED at 1318.
Hunk #6 FAILED at 1401.
Hunk #7 FAILED at 1415.
7 out of 7 hunks FAILED -- saving rejects to file
drivers/video/fbdev/nvidia/nvidia.c.rej

Best
Zeno

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] nvidiafb: detect the hardware support before removing console.
  2023-02-06  8:37         ` Zeno Davatz
@ 2023-02-06  8:40           ` David Airlie
  2023-02-06  8:54             ` Zeno Davatz
  0 siblings, 1 reply; 10+ messages in thread
From: David Airlie @ 2023-02-06  8:40 UTC (permalink / raw)
  To: Zeno Davatz
  Cc: Dave Airlie, Bjorn Helgaas, Bjorn Helgaas, linux-fbdev,
	dri-devel, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 10369 bytes --]

On Mon, Feb 6, 2023 at 6:38 PM Zeno Davatz <zdavatz@gmail.com> wrote:
>
> Dear Dave
>
> On Mon, Feb 6, 2023 at 9:10 AM Dave Airlie <airlied@gmail.com> wrote:
> >
> > On Mon, 6 Feb 2023 at 18:01, Zeno Davatz <zdavatz@gmail.com> wrote:
> > >
> > > Dear Dave
> > >
> > > On Mon, Feb 6, 2023 at 8:54 AM Dave Airlie <airlied@gmail.com> wrote:
> > > >
> > > > On Mon, 6 Feb 2023 at 17:52, Zeno Davatz <zdavatz@gmail.com> wrote:
> > > > >
> > > > > Dear Dave
> > > > >
> > > > > Thank you for your patch.
> > > > >
> > > > > On Sun, Feb 5, 2023 at 10:07 PM Dave Airlie <airlied@gmail.com> wrote:
> > > > > >
> > > > > > From: Dave Airlie <airlied@redhat.com>
> > > > > >
> > > > > > This driver removed the console, but hasn't yet decided if it could
> > > > > > take over the console yet. Instead of doing that, probe the hw for
> > > > > > support and then remove the console afterwards.
> > > > > >
> > > > > > Signed-off-by: Dave Airlie <airlied@redhat.com>
> > > > > > Fixes: https://bugzilla.kernel.org/show_bug.cgi?id=216859
> > > > > > Reported-by: Zeno Davatz <zdavatz@gmail.com>
> > > > > > ---
> > > > > >  drivers/video/fbdev/nvidia/nvidia.c | 81 +++++++++++++++--------------
> > > > > >  1 file changed, 42 insertions(+), 39 deletions(-)
> > > > > >
> > > > > > diff --git a/drivers/video/fbdev/nvidia/nvidia.c b/drivers/video/fbdev/nvidia/nvidia.c
> > > > > > index 1960916098d4..e60a276b4855 100644
> > > > > > --- a/drivers/video/fbdev/nvidia/nvidia.c
> > > > > > +++ b/drivers/video/fbdev/nvidia/nvidia.c
> > > > > > @@ -1197,17 +1197,17 @@ static int nvidia_set_fbinfo(struct fb_info *info)
> > > > > >         return nvidiafb_check_var(&info->var, info);
> > > > > >  }
> > > > > >
> > > > > > -static u32 nvidia_get_chipset(struct fb_info *info)
> > > > > > +static u32 nvidia_get_chipset(struct pci_dev *pci_dev,
> > > > > > +                             volatile u32 __iomem *REGS)
> > > > > >  {
> > > > > > -       struct nvidia_par *par = info->par;
> > > > > > -       u32 id = (par->pci_dev->vendor << 16) | par->pci_dev->device;
> > > > > > +       u32 id = (pci_dev->vendor << 16) | pci_dev->device;
> > > > > >
> > > > > >         printk(KERN_INFO PFX "Device ID: %x \n", id);
> > > > > >
> > > > > >         if ((id & 0xfff0) == 0x00f0 ||
> > > > > >             (id & 0xfff0) == 0x02e0) {
> > > > > >                 /* pci-e */
> > > > > > -               id = NV_RD32(par->REGS, 0x1800);
> > > > > > +               id = NV_RD32(REGS, 0x1800);
> > > > > >
> > > > > >                 if ((id & 0x0000ffff) == 0x000010DE)
> > > > > >                         id = 0x10DE0000 | (id >> 16);
> > > > > > @@ -1220,12 +1220,11 @@ static u32 nvidia_get_chipset(struct fb_info *info)
> > > > > >         return id;
> > > > > >  }
> > > > > >
> > > > > > -static u32 nvidia_get_arch(struct fb_info *info)
> > > > > > +static u32 nvidia_get_arch(u32 Chipset)
> > > > > >  {
> > > > > > -       struct nvidia_par *par = info->par;
> > > > > >         u32 arch = 0;
> > > > > >
> > > > > > -       switch (par->Chipset & 0x0ff0) {
> > > > > > +       switch (Chipset & 0x0ff0) {
> > > > > >         case 0x0100:            /* GeForce 256 */
> > > > > >         case 0x0110:            /* GeForce2 MX */
> > > > > >         case 0x0150:            /* GeForce2 */
> > > > > > @@ -1278,16 +1277,44 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
> > > > > >         struct fb_info *info;
> > > > > >         unsigned short cmd;
> > > > > >         int ret;
> > > > > > +       volatile u32 __iomem *REGS;
> > > > > > +       int Chipset;
> > > > > > +       u32 Architecture;
> > > > > >
> > > > > >         NVTRACE_ENTER();
> > > > > >         assert(pd != NULL);
> > > > > >
> > > > > > +       if (pci_enable_device(pd)) {
> > > > > > +               printk(KERN_ERR PFX "cannot enable PCI device\n");
> > > > > > +               return -ENODEV;
> > > > > > +       }
> > > > > > +
> > > > > > +       /* enable IO and mem if not already done */
> > > > > > +       pci_read_config_word(pd, PCI_COMMAND, &cmd);
> > > > > > +       cmd |= (PCI_COMMAND_IO | PCI_COMMAND_MEMORY);
> > > > > > +       pci_write_config_word(pd, PCI_COMMAND, cmd);
> > > > > > +
> > > > > > +       nvidiafb_fix.mmio_start = pci_resource_start(pd, 0);
> > > > > > +       nvidiafb_fix.mmio_len = pci_resource_len(pd, 0);
> > > > > > +
> > > > > > +       REGS = ioremap(nvidiafb_fix.mmio_start, nvidiafb_fix.mmio_len);
> > > > > > +       if (!REGS) {
> > > > > > +               printk(KERN_ERR PFX "cannot ioremap MMIO base\n");
> > > > > > +               return -ENODEV;
> > > > > > +       }
> > > > > > +
> > > > > > +       Chipset = nvidia_get_chipset(pd, REGS);
> > > > > > +       Architecture = nvidia_get_arch(Chipset);
> > > > > > +       if (Architecture == 0) {
> > > > > > +               printk(KERN_ERR PFX "unknown NV_ARCH\n");
> > > > > > +               goto err_out;
> > > > > > +       }
> > > > > > +
> > > > > >         ret = aperture_remove_conflicting_pci_devices(pd, "nvidiafb");
> > > > > >         if (ret)
> > > > > > -               return ret;
> > > > > > +               goto err_out;
> > > > > >
> > > > > >         info = framebuffer_alloc(sizeof(struct nvidia_par), &pd->dev);
> > > > > > -
> > > > > >         if (!info)
> > > > > >                 goto err_out;
> > > > > >
> > > > > > @@ -1298,11 +1325,6 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
> > > > > >         if (info->pixmap.addr == NULL)
> > > > > >                 goto err_out_kfree;
> > > > > >
> > > > > > -       if (pci_enable_device(pd)) {
> > > > > > -               printk(KERN_ERR PFX "cannot enable PCI device\n");
> > > > > > -               goto err_out_enable;
> > > > > > -       }
> > > > > > -
> > > > > >         if (pci_request_regions(pd, "nvidiafb")) {
> > > > > >                 printk(KERN_ERR PFX "cannot request PCI regions\n");
> > > > > >                 goto err_out_enable;
> > > > > > @@ -1318,34 +1340,17 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
> > > > > >         par->paneltweak = paneltweak;
> > > > > >         par->reverse_i2c = reverse_i2c;
> > > > > >
> > > > > > -       /* enable IO and mem if not already done */
> > > > > > -       pci_read_config_word(pd, PCI_COMMAND, &cmd);
> > > > > > -       cmd |= (PCI_COMMAND_IO | PCI_COMMAND_MEMORY);
> > > > > > -       pci_write_config_word(pd, PCI_COMMAND, cmd);
> > > > > > -
> > > > > > -       nvidiafb_fix.mmio_start = pci_resource_start(pd, 0);
> > > > > >         nvidiafb_fix.smem_start = pci_resource_start(pd, 1);
> > > > > > -       nvidiafb_fix.mmio_len = pci_resource_len(pd, 0);
> > > > > > -
> > > > > > -       par->REGS = ioremap(nvidiafb_fix.mmio_start, nvidiafb_fix.mmio_len);
> > > > > >
> > > > > > -       if (!par->REGS) {
> > > > > > -               printk(KERN_ERR PFX "cannot ioremap MMIO base\n");
> > > > > > -               goto err_out_free_base0;
> > > > > > -       }
> > > > > > +       par->REGS = REGS;
> > > > > >
> > > > > > -       par->Chipset = nvidia_get_chipset(info);
> > > > > > -       par->Architecture = nvidia_get_arch(info);
> > > > > > -
> > > > > > -       if (par->Architecture == 0) {
> > > > > > -               printk(KERN_ERR PFX "unknown NV_ARCH\n");
> > > > > > -               goto err_out_arch;
> > > > > > -       }
> > > > > > +       par->Chipset = Chipset;
> > > > > > +       par->Architecture = Architecture;
> > > > > >
> > > > > >         sprintf(nvidiafb_fix.id, "NV%x", (pd->device & 0x0ff0) >> 4);
> > > > > >
> > > > > >         if (NVCommonSetup(info))
> > > > > > -               goto err_out_arch;
> > > > > > +               goto err_out_free_base0;
> > > > > >
> > > > > >         par->FbAddress = nvidiafb_fix.smem_start;
> > > > > >         par->FbMapSize = par->RamAmountKBytes * 1024;
> > > > > > @@ -1401,7 +1406,6 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
> > > > > >                 goto err_out_iounmap_fb;
> > > > > >         }
> > > > > >
> > > > > > -
> > > > > >         printk(KERN_INFO PFX
> > > > > >                "PCI nVidia %s framebuffer (%dMB @ 0x%lX)\n",
> > > > > >                info->fix.id,
> > > > > > @@ -1415,15 +1419,14 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
> > > > > >  err_out_free_base1:
> > > > > >         fb_destroy_modedb(info->monspecs.modedb);
> > > > > >         nvidia_delete_i2c_busses(par);
> > > > > > -err_out_arch:
> > > > > > -       iounmap(par->REGS);
> > > > > > - err_out_free_base0:
> > > > > > +err_out_free_base0:
> > > > > >         pci_release_regions(pd);
> > > > > >  err_out_enable:
> > > > > >         kfree(info->pixmap.addr);
> > > > > >  err_out_kfree:
> > > > > >         framebuffer_release(info);
> > > > > >  err_out:
> > > > > > +       iounmap(REGS);
> > > > > >         return -ENODEV;
> > > > > >  }
> > > > > >
> > > > > > --
> > > > > > 2.38.1
> > > > >
> > > > > This patch fails for me.
> > > >
> > > > I've based the patch on 6.2-rc7, please make sure to not have the
> > > > previous revert committed, this is to replace that patch.
> > >
> > > Can you guide me through the steps please?
> > >
> > > I done:
> > >
> > > 1. cd /usr/src/linux
> > > 2. sudo git pull
> > > 3. then I applied your patch.
> > >
> > > Am I doing something wrong?
> >
> > What is your top of tree commit? (git log)
> >
> > have you got any commits on top?
> >
> > git reset --hard origin/master should reset your tree to Linus top.
>
> 1. git log shows "d2d11f342b179f1894a901f143ec7c008caba43e"
> 2. No, no patches on top.
> 3. I am doing the following steps:
> /usr/src/linux> sudo git reset --hard origin/master
> Passwort:
> HEAD ist jetzt bei d2d11f342b17 Merge branch 'fixes' of
> git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
> /usr/src/linux> sudo patch -p1 < /tmp/patch
> patching file drivers/video/fbdev/nvidia/nvidia.c
> Hunk #1 FAILED at 1197.
> Hunk #2 FAILED at 1220.
> Hunk #3 FAILED at 1278.
> Hunk #4 FAILED at 1298.
> Hunk #5 FAILED at 1318.
> Hunk #6 FAILED at 1401.
> Hunk #7 FAILED at 1415.
> 7 out of 7 hunks FAILED -- saving rejects to file
> drivers/video/fbdev/nvidia/nvidia.c.rej
>
Are you pulling the patch from email? I guess your email service or
something is mangling it.

I've attached it to see if that helps.

Dave.

[-- Attachment #2: 0001-nvidiafb-detect-the-hardware-support-before-removing.patch --]
[-- Type: text/x-patch, Size: 5564 bytes --]

From 58d8c4e59179c76fe7fb10cacfacdc95edc43c63 Mon Sep 17 00:00:00 2001
From: Dave Airlie <airlied@redhat.com>
Date: Mon, 6 Feb 2023 07:05:28 +1000
Subject: [PATCH] nvidiafb: detect the hardware support before removing
 console.

This driver removed the console, but hasn't yet decided if it could
take over the console yet. Instead of doing that, probe the hw for
support and then remove the console afterwards.

Signed-off-by: Dave Airlie <airlied@redhat.com>
Fixes: https://bugzilla.kernel.org/show_bug.cgi?id=216859
Reported-by: Zeno Davatz <zdavatz@gmail.com>
---
 drivers/video/fbdev/nvidia/nvidia.c | 81 +++++++++++++++--------------
 1 file changed, 42 insertions(+), 39 deletions(-)

diff --git a/drivers/video/fbdev/nvidia/nvidia.c b/drivers/video/fbdev/nvidia/nvidia.c
index 1960916098d4..e60a276b4855 100644
--- a/drivers/video/fbdev/nvidia/nvidia.c
+++ b/drivers/video/fbdev/nvidia/nvidia.c
@@ -1197,17 +1197,17 @@ static int nvidia_set_fbinfo(struct fb_info *info)
 	return nvidiafb_check_var(&info->var, info);
 }
 
-static u32 nvidia_get_chipset(struct fb_info *info)
+static u32 nvidia_get_chipset(struct pci_dev *pci_dev,
+			      volatile u32 __iomem *REGS)
 {
-	struct nvidia_par *par = info->par;
-	u32 id = (par->pci_dev->vendor << 16) | par->pci_dev->device;
+	u32 id = (pci_dev->vendor << 16) | pci_dev->device;
 
 	printk(KERN_INFO PFX "Device ID: %x \n", id);
 
 	if ((id & 0xfff0) == 0x00f0 ||
 	    (id & 0xfff0) == 0x02e0) {
 		/* pci-e */
-		id = NV_RD32(par->REGS, 0x1800);
+		id = NV_RD32(REGS, 0x1800);
 
 		if ((id & 0x0000ffff) == 0x000010DE)
 			id = 0x10DE0000 | (id >> 16);
@@ -1220,12 +1220,11 @@ static u32 nvidia_get_chipset(struct fb_info *info)
 	return id;
 }
 
-static u32 nvidia_get_arch(struct fb_info *info)
+static u32 nvidia_get_arch(u32 Chipset)
 {
-	struct nvidia_par *par = info->par;
 	u32 arch = 0;
 
-	switch (par->Chipset & 0x0ff0) {
+	switch (Chipset & 0x0ff0) {
 	case 0x0100:		/* GeForce 256 */
 	case 0x0110:		/* GeForce2 MX */
 	case 0x0150:		/* GeForce2 */
@@ -1278,16 +1277,44 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
 	struct fb_info *info;
 	unsigned short cmd;
 	int ret;
+	volatile u32 __iomem *REGS;
+	int Chipset;
+	u32 Architecture;
 
 	NVTRACE_ENTER();
 	assert(pd != NULL);
 
+	if (pci_enable_device(pd)) {
+		printk(KERN_ERR PFX "cannot enable PCI device\n");
+		return -ENODEV;
+	}
+
+	/* enable IO and mem if not already done */
+	pci_read_config_word(pd, PCI_COMMAND, &cmd);
+	cmd |= (PCI_COMMAND_IO | PCI_COMMAND_MEMORY);
+	pci_write_config_word(pd, PCI_COMMAND, cmd);
+
+	nvidiafb_fix.mmio_start = pci_resource_start(pd, 0);
+	nvidiafb_fix.mmio_len = pci_resource_len(pd, 0);
+
+	REGS = ioremap(nvidiafb_fix.mmio_start, nvidiafb_fix.mmio_len);
+	if (!REGS) {
+		printk(KERN_ERR PFX "cannot ioremap MMIO base\n");
+		return -ENODEV;
+	}
+
+	Chipset = nvidia_get_chipset(pd, REGS);
+	Architecture = nvidia_get_arch(Chipset);
+	if (Architecture == 0) {
+		printk(KERN_ERR PFX "unknown NV_ARCH\n");
+		goto err_out;
+	}
+
 	ret = aperture_remove_conflicting_pci_devices(pd, "nvidiafb");
 	if (ret)
-		return ret;
+		goto err_out;
 
 	info = framebuffer_alloc(sizeof(struct nvidia_par), &pd->dev);
-
 	if (!info)
 		goto err_out;
 
@@ -1298,11 +1325,6 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
 	if (info->pixmap.addr == NULL)
 		goto err_out_kfree;
 
-	if (pci_enable_device(pd)) {
-		printk(KERN_ERR PFX "cannot enable PCI device\n");
-		goto err_out_enable;
-	}
-
 	if (pci_request_regions(pd, "nvidiafb")) {
 		printk(KERN_ERR PFX "cannot request PCI regions\n");
 		goto err_out_enable;
@@ -1318,34 +1340,17 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
 	par->paneltweak = paneltweak;
 	par->reverse_i2c = reverse_i2c;
 
-	/* enable IO and mem if not already done */
-	pci_read_config_word(pd, PCI_COMMAND, &cmd);
-	cmd |= (PCI_COMMAND_IO | PCI_COMMAND_MEMORY);
-	pci_write_config_word(pd, PCI_COMMAND, cmd);
-
-	nvidiafb_fix.mmio_start = pci_resource_start(pd, 0);
 	nvidiafb_fix.smem_start = pci_resource_start(pd, 1);
-	nvidiafb_fix.mmio_len = pci_resource_len(pd, 0);
-
-	par->REGS = ioremap(nvidiafb_fix.mmio_start, nvidiafb_fix.mmio_len);
 
-	if (!par->REGS) {
-		printk(KERN_ERR PFX "cannot ioremap MMIO base\n");
-		goto err_out_free_base0;
-	}
+	par->REGS = REGS;
 
-	par->Chipset = nvidia_get_chipset(info);
-	par->Architecture = nvidia_get_arch(info);
-
-	if (par->Architecture == 0) {
-		printk(KERN_ERR PFX "unknown NV_ARCH\n");
-		goto err_out_arch;
-	}
+	par->Chipset = Chipset;
+	par->Architecture = Architecture;
 
 	sprintf(nvidiafb_fix.id, "NV%x", (pd->device & 0x0ff0) >> 4);
 
 	if (NVCommonSetup(info))
-		goto err_out_arch;
+		goto err_out_free_base0;
 
 	par->FbAddress = nvidiafb_fix.smem_start;
 	par->FbMapSize = par->RamAmountKBytes * 1024;
@@ -1401,7 +1406,6 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
 		goto err_out_iounmap_fb;
 	}
 
-
 	printk(KERN_INFO PFX
 	       "PCI nVidia %s framebuffer (%dMB @ 0x%lX)\n",
 	       info->fix.id,
@@ -1415,15 +1419,14 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
 err_out_free_base1:
 	fb_destroy_modedb(info->monspecs.modedb);
 	nvidia_delete_i2c_busses(par);
-err_out_arch:
-	iounmap(par->REGS);
- err_out_free_base0:
+err_out_free_base0:
 	pci_release_regions(pd);
 err_out_enable:
 	kfree(info->pixmap.addr);
 err_out_kfree:
 	framebuffer_release(info);
 err_out:
+	iounmap(REGS);
 	return -ENODEV;
 }
 
-- 
2.38.1


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [PATCH] nvidiafb: detect the hardware support before removing console.
  2023-02-06  8:40           ` David Airlie
@ 2023-02-06  8:54             ` Zeno Davatz
  2023-02-09  9:07               ` Thomas Zimmermann
  0 siblings, 1 reply; 10+ messages in thread
From: Zeno Davatz @ 2023-02-06  8:54 UTC (permalink / raw)
  To: David Airlie
  Cc: Dave Airlie, Bjorn Helgaas, Bjorn Helgaas, linux-fbdev,
	dri-devel, linux-kernel

Dear Dave

On Mon, Feb 6, 2023 at 9:40 AM David Airlie <airlied@redhat.com> wrote:
>
> On Mon, Feb 6, 2023 at 6:38 PM Zeno Davatz <zdavatz@gmail.com> wrote:
> >
> > Dear Dave
> >
> > On Mon, Feb 6, 2023 at 9:10 AM Dave Airlie <airlied@gmail.com> wrote:
> > >
> > > On Mon, 6 Feb 2023 at 18:01, Zeno Davatz <zdavatz@gmail.com> wrote:
> > > >
> > > > Dear Dave
> > > >
> > > > On Mon, Feb 6, 2023 at 8:54 AM Dave Airlie <airlied@gmail.com> wrote:
> > > > >
> > > > > On Mon, 6 Feb 2023 at 17:52, Zeno Davatz <zdavatz@gmail.com> wrote:
> > > > > >
> > > > > > Dear Dave
> > > > > >
> > > > > > Thank you for your patch.
> > > > > >
> > > > > > On Sun, Feb 5, 2023 at 10:07 PM Dave Airlie <airlied@gmail.com> wrote:
> > > > > > >
> > > > > > > From: Dave Airlie <airlied@redhat.com>
> > > > > > >
> > > > > > > This driver removed the console, but hasn't yet decided if it could
> > > > > > > take over the console yet. Instead of doing that, probe the hw for
> > > > > > > support and then remove the console afterwards.
> > > > > > >
> > > > > > > Signed-off-by: Dave Airlie <airlied@redhat.com>
> > > > > > > Fixes: https://bugzilla.kernel.org/show_bug.cgi?id=216859
> > > > > > > Reported-by: Zeno Davatz <zdavatz@gmail.com>
> > > > > > > ---
> > > > > > >  drivers/video/fbdev/nvidia/nvidia.c | 81 +++++++++++++++--------------
> > > > > > >  1 file changed, 42 insertions(+), 39 deletions(-)
> > > > > > >
> > > > > > > diff --git a/drivers/video/fbdev/nvidia/nvidia.c b/drivers/video/fbdev/nvidia/nvidia.c
> > > > > > > index 1960916098d4..e60a276b4855 100644
> > > > > > > --- a/drivers/video/fbdev/nvidia/nvidia.c
> > > > > > > +++ b/drivers/video/fbdev/nvidia/nvidia.c
> > > > > > > @@ -1197,17 +1197,17 @@ static int nvidia_set_fbinfo(struct fb_info *info)
> > > > > > >         return nvidiafb_check_var(&info->var, info);
> > > > > > >  }
> > > > > > >
> > > > > > > -static u32 nvidia_get_chipset(struct fb_info *info)
> > > > > > > +static u32 nvidia_get_chipset(struct pci_dev *pci_dev,
> > > > > > > +                             volatile u32 __iomem *REGS)
> > > > > > >  {
> > > > > > > -       struct nvidia_par *par = info->par;
> > > > > > > -       u32 id = (par->pci_dev->vendor << 16) | par->pci_dev->device;
> > > > > > > +       u32 id = (pci_dev->vendor << 16) | pci_dev->device;
> > > > > > >
> > > > > > >         printk(KERN_INFO PFX "Device ID: %x \n", id);
> > > > > > >
> > > > > > >         if ((id & 0xfff0) == 0x00f0 ||
> > > > > > >             (id & 0xfff0) == 0x02e0) {
> > > > > > >                 /* pci-e */
> > > > > > > -               id = NV_RD32(par->REGS, 0x1800);
> > > > > > > +               id = NV_RD32(REGS, 0x1800);
> > > > > > >
> > > > > > >                 if ((id & 0x0000ffff) == 0x000010DE)
> > > > > > >                         id = 0x10DE0000 | (id >> 16);
> > > > > > > @@ -1220,12 +1220,11 @@ static u32 nvidia_get_chipset(struct fb_info *info)
> > > > > > >         return id;
> > > > > > >  }
> > > > > > >
> > > > > > > -static u32 nvidia_get_arch(struct fb_info *info)
> > > > > > > +static u32 nvidia_get_arch(u32 Chipset)
> > > > > > >  {
> > > > > > > -       struct nvidia_par *par = info->par;
> > > > > > >         u32 arch = 0;
> > > > > > >
> > > > > > > -       switch (par->Chipset & 0x0ff0) {
> > > > > > > +       switch (Chipset & 0x0ff0) {
> > > > > > >         case 0x0100:            /* GeForce 256 */
> > > > > > >         case 0x0110:            /* GeForce2 MX */
> > > > > > >         case 0x0150:            /* GeForce2 */
> > > > > > > @@ -1278,16 +1277,44 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
> > > > > > >         struct fb_info *info;
> > > > > > >         unsigned short cmd;
> > > > > > >         int ret;
> > > > > > > +       volatile u32 __iomem *REGS;
> > > > > > > +       int Chipset;
> > > > > > > +       u32 Architecture;
> > > > > > >
> > > > > > >         NVTRACE_ENTER();
> > > > > > >         assert(pd != NULL);
> > > > > > >
> > > > > > > +       if (pci_enable_device(pd)) {
> > > > > > > +               printk(KERN_ERR PFX "cannot enable PCI device\n");
> > > > > > > +               return -ENODEV;
> > > > > > > +       }
> > > > > > > +
> > > > > > > +       /* enable IO and mem if not already done */
> > > > > > > +       pci_read_config_word(pd, PCI_COMMAND, &cmd);
> > > > > > > +       cmd |= (PCI_COMMAND_IO | PCI_COMMAND_MEMORY);
> > > > > > > +       pci_write_config_word(pd, PCI_COMMAND, cmd);
> > > > > > > +
> > > > > > > +       nvidiafb_fix.mmio_start = pci_resource_start(pd, 0);
> > > > > > > +       nvidiafb_fix.mmio_len = pci_resource_len(pd, 0);
> > > > > > > +
> > > > > > > +       REGS = ioremap(nvidiafb_fix.mmio_start, nvidiafb_fix.mmio_len);
> > > > > > > +       if (!REGS) {
> > > > > > > +               printk(KERN_ERR PFX "cannot ioremap MMIO base\n");
> > > > > > > +               return -ENODEV;
> > > > > > > +       }
> > > > > > > +
> > > > > > > +       Chipset = nvidia_get_chipset(pd, REGS);
> > > > > > > +       Architecture = nvidia_get_arch(Chipset);
> > > > > > > +       if (Architecture == 0) {
> > > > > > > +               printk(KERN_ERR PFX "unknown NV_ARCH\n");
> > > > > > > +               goto err_out;
> > > > > > > +       }
> > > > > > > +
> > > > > > >         ret = aperture_remove_conflicting_pci_devices(pd, "nvidiafb");
> > > > > > >         if (ret)
> > > > > > > -               return ret;
> > > > > > > +               goto err_out;
> > > > > > >
> > > > > > >         info = framebuffer_alloc(sizeof(struct nvidia_par), &pd->dev);
> > > > > > > -
> > > > > > >         if (!info)
> > > > > > >                 goto err_out;
> > > > > > >
> > > > > > > @@ -1298,11 +1325,6 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
> > > > > > >         if (info->pixmap.addr == NULL)
> > > > > > >                 goto err_out_kfree;
> > > > > > >
> > > > > > > -       if (pci_enable_device(pd)) {
> > > > > > > -               printk(KERN_ERR PFX "cannot enable PCI device\n");
> > > > > > > -               goto err_out_enable;
> > > > > > > -       }
> > > > > > > -
> > > > > > >         if (pci_request_regions(pd, "nvidiafb")) {
> > > > > > >                 printk(KERN_ERR PFX "cannot request PCI regions\n");
> > > > > > >                 goto err_out_enable;
> > > > > > > @@ -1318,34 +1340,17 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
> > > > > > >         par->paneltweak = paneltweak;
> > > > > > >         par->reverse_i2c = reverse_i2c;
> > > > > > >
> > > > > > > -       /* enable IO and mem if not already done */
> > > > > > > -       pci_read_config_word(pd, PCI_COMMAND, &cmd);
> > > > > > > -       cmd |= (PCI_COMMAND_IO | PCI_COMMAND_MEMORY);
> > > > > > > -       pci_write_config_word(pd, PCI_COMMAND, cmd);
> > > > > > > -
> > > > > > > -       nvidiafb_fix.mmio_start = pci_resource_start(pd, 0);
> > > > > > >         nvidiafb_fix.smem_start = pci_resource_start(pd, 1);
> > > > > > > -       nvidiafb_fix.mmio_len = pci_resource_len(pd, 0);
> > > > > > > -
> > > > > > > -       par->REGS = ioremap(nvidiafb_fix.mmio_start, nvidiafb_fix.mmio_len);
> > > > > > >
> > > > > > > -       if (!par->REGS) {
> > > > > > > -               printk(KERN_ERR PFX "cannot ioremap MMIO base\n");
> > > > > > > -               goto err_out_free_base0;
> > > > > > > -       }
> > > > > > > +       par->REGS = REGS;
> > > > > > >
> > > > > > > -       par->Chipset = nvidia_get_chipset(info);
> > > > > > > -       par->Architecture = nvidia_get_arch(info);
> > > > > > > -
> > > > > > > -       if (par->Architecture == 0) {
> > > > > > > -               printk(KERN_ERR PFX "unknown NV_ARCH\n");
> > > > > > > -               goto err_out_arch;
> > > > > > > -       }
> > > > > > > +       par->Chipset = Chipset;
> > > > > > > +       par->Architecture = Architecture;
> > > > > > >
> > > > > > >         sprintf(nvidiafb_fix.id, "NV%x", (pd->device & 0x0ff0) >> 4);
> > > > > > >
> > > > > > >         if (NVCommonSetup(info))
> > > > > > > -               goto err_out_arch;
> > > > > > > +               goto err_out_free_base0;
> > > > > > >
> > > > > > >         par->FbAddress = nvidiafb_fix.smem_start;
> > > > > > >         par->FbMapSize = par->RamAmountKBytes * 1024;
> > > > > > > @@ -1401,7 +1406,6 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
> > > > > > >                 goto err_out_iounmap_fb;
> > > > > > >         }
> > > > > > >
> > > > > > > -
> > > > > > >         printk(KERN_INFO PFX
> > > > > > >                "PCI nVidia %s framebuffer (%dMB @ 0x%lX)\n",
> > > > > > >                info->fix.id,
> > > > > > > @@ -1415,15 +1419,14 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
> > > > > > >  err_out_free_base1:
> > > > > > >         fb_destroy_modedb(info->monspecs.modedb);
> > > > > > >         nvidia_delete_i2c_busses(par);
> > > > > > > -err_out_arch:
> > > > > > > -       iounmap(par->REGS);
> > > > > > > - err_out_free_base0:
> > > > > > > +err_out_free_base0:
> > > > > > >         pci_release_regions(pd);
> > > > > > >  err_out_enable:
> > > > > > >         kfree(info->pixmap.addr);
> > > > > > >  err_out_kfree:
> > > > > > >         framebuffer_release(info);
> > > > > > >  err_out:
> > > > > > > +       iounmap(REGS);
> > > > > > >         return -ENODEV;
> > > > > > >  }
> > > > > > >
> > > > > > > --
> > > > > > > 2.38.1
> > > > > >
> > > > > > This patch fails for me.
> > > > >
> > > > > I've based the patch on 6.2-rc7, please make sure to not have the
> > > > > previous revert committed, this is to replace that patch.
> > > >
> > > > Can you guide me through the steps please?
> > > >
> > > > I done:
> > > >
> > > > 1. cd /usr/src/linux
> > > > 2. sudo git pull
> > > > 3. then I applied your patch.
> > > >
> > > > Am I doing something wrong?
> > >
> > > What is your top of tree commit? (git log)
> > >
> > > have you got any commits on top?
> > >
> > > git reset --hard origin/master should reset your tree to Linus top.
> >
> > 1. git log shows "d2d11f342b179f1894a901f143ec7c008caba43e"
> > 2. No, no patches on top.
> > 3. I am doing the following steps:
> > /usr/src/linux> sudo git reset --hard origin/master
> > Passwort:
> > HEAD ist jetzt bei d2d11f342b17 Merge branch 'fixes' of
> > git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
> > /usr/src/linux> sudo patch -p1 < /tmp/patch
> > patching file drivers/video/fbdev/nvidia/nvidia.c
> > Hunk #1 FAILED at 1197.
> > Hunk #2 FAILED at 1220.
> > Hunk #3 FAILED at 1278.
> > Hunk #4 FAILED at 1298.
> > Hunk #5 FAILED at 1318.
> > Hunk #6 FAILED at 1401.
> > Hunk #7 FAILED at 1415.
> > 7 out of 7 hunks FAILED -- saving rejects to file
> > drivers/video/fbdev/nvidia/nvidia.c.rej
> >
> Are you pulling the patch from email? I guess your email service or
> something is mangling it.
>
> I've attached it to see if that helps.

Thank you! This patch works and I am booting perfectly well now!

~/.backup> uname -a
Linux zenogentoo 6.2.0-rc7-00002-gd2d11f342b17-dirty #144 SMP
PREEMPT_DYNAMIC Mon Feb  6 09:42:58 CET 2023 x86_64 Intel(R) Core(TM)
i7 CPU 960 @ 3.20GHz GenuineIntel GNU/Linux

Please let me know if the patch makes it into mainline for the 6.2 release ;).

Best
Zeno

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] nvidiafb: detect the hardware support before removing console.
  2023-02-05 21:07 [PATCH] nvidiafb: detect the hardware support before removing console Dave Airlie
  2023-02-06  7:52 ` Zeno Davatz
@ 2023-02-06  9:05 ` Thomas Zimmermann
  1 sibling, 0 replies; 10+ messages in thread
From: Thomas Zimmermann @ 2023-02-06  9:05 UTC (permalink / raw)
  To: Dave Airlie, linux-fbdev
  Cc: Dave Airlie, Zeno Davatz, linux-kernel, dri-devel


[-- Attachment #1.1: Type: text/plain, Size: 6626 bytes --]

Hi Dave,

thanks a lot. I was able to reproduce the problem and get it fixed by 
the patch. As expected, there's still the warning about 'unknown 
NV_ARCH', but the firmware display remains active.  Applies cleanly to 
drm-tip BTW.

Am 05.02.23 um 22:07 schrieb Dave Airlie:
> From: Dave Airlie <airlied@redhat.com>
> 
> This driver removed the console, but hasn't yet decided if it could
> take over the console yet. Instead of doing that, probe the hw for
> support and then remove the console afterwards.
> 
> Signed-off-by: Dave Airlie <airlied@redhat.com>
> Fixes: https://bugzilla.kernel.org/show_bug.cgi?id=216859
> Reported-by: Zeno Davatz <zdavatz@gmail.com>

Tested-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
Fixes: 145eed48de27 ("fbdev: Remove conflicting devices on PCI bus")


> ---
>   drivers/video/fbdev/nvidia/nvidia.c | 81 +++++++++++++++--------------
>   1 file changed, 42 insertions(+), 39 deletions(-)
> 
> diff --git a/drivers/video/fbdev/nvidia/nvidia.c b/drivers/video/fbdev/nvidia/nvidia.c
> index 1960916098d4..e60a276b4855 100644
> --- a/drivers/video/fbdev/nvidia/nvidia.c
> +++ b/drivers/video/fbdev/nvidia/nvidia.c
> @@ -1197,17 +1197,17 @@ static int nvidia_set_fbinfo(struct fb_info *info)
>   	return nvidiafb_check_var(&info->var, info);
>   }
>   
> -static u32 nvidia_get_chipset(struct fb_info *info)
> +static u32 nvidia_get_chipset(struct pci_dev *pci_dev,
> +			      volatile u32 __iomem *REGS)
>   {
> -	struct nvidia_par *par = info->par;
> -	u32 id = (par->pci_dev->vendor << 16) | par->pci_dev->device;
> +	u32 id = (pci_dev->vendor << 16) | pci_dev->device;
>   
>   	printk(KERN_INFO PFX "Device ID: %x \n", id);
>   
>   	if ((id & 0xfff0) == 0x00f0 ||
>   	    (id & 0xfff0) == 0x02e0) {
>   		/* pci-e */
> -		id = NV_RD32(par->REGS, 0x1800);
> +		id = NV_RD32(REGS, 0x1800);
>   
>   		if ((id & 0x0000ffff) == 0x000010DE)
>   			id = 0x10DE0000 | (id >> 16);
> @@ -1220,12 +1220,11 @@ static u32 nvidia_get_chipset(struct fb_info *info)
>   	return id;
>   }
>   
> -static u32 nvidia_get_arch(struct fb_info *info)
> +static u32 nvidia_get_arch(u32 Chipset)
>   {
> -	struct nvidia_par *par = info->par;
>   	u32 arch = 0;
>   
> -	switch (par->Chipset & 0x0ff0) {
> +	switch (Chipset & 0x0ff0) {
>   	case 0x0100:		/* GeForce 256 */
>   	case 0x0110:		/* GeForce2 MX */
>   	case 0x0150:		/* GeForce2 */
> @@ -1278,16 +1277,44 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
>   	struct fb_info *info;
>   	unsigned short cmd;
>   	int ret;
> +	volatile u32 __iomem *REGS;
> +	int Chipset;
> +	u32 Architecture;
>   
>   	NVTRACE_ENTER();
>   	assert(pd != NULL);
>   
> +	if (pci_enable_device(pd)) {
> +		printk(KERN_ERR PFX "cannot enable PCI device\n");
> +		return -ENODEV;
> +	}
> +
> +	/* enable IO and mem if not already done */
> +	pci_read_config_word(pd, PCI_COMMAND, &cmd);
> +	cmd |= (PCI_COMMAND_IO | PCI_COMMAND_MEMORY);
> +	pci_write_config_word(pd, PCI_COMMAND, cmd);
> +
> +	nvidiafb_fix.mmio_start = pci_resource_start(pd, 0);
> +	nvidiafb_fix.mmio_len = pci_resource_len(pd, 0);
> +
> +	REGS = ioremap(nvidiafb_fix.mmio_start, nvidiafb_fix.mmio_len);
> +	if (!REGS) {
> +		printk(KERN_ERR PFX "cannot ioremap MMIO base\n");
> +		return -ENODEV;
> +	}
> +
> +	Chipset = nvidia_get_chipset(pd, REGS);
> +	Architecture = nvidia_get_arch(Chipset);
> +	if (Architecture == 0) {
> +		printk(KERN_ERR PFX "unknown NV_ARCH\n");
> +		goto err_out;
> +	}
> +
>   	ret = aperture_remove_conflicting_pci_devices(pd, "nvidiafb");
>   	if (ret)
> -		return ret;
> +		goto err_out;
>   
>   	info = framebuffer_alloc(sizeof(struct nvidia_par), &pd->dev);
> -
>   	if (!info)
>   		goto err_out;
>   
> @@ -1298,11 +1325,6 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
>   	if (info->pixmap.addr == NULL)
>   		goto err_out_kfree;
>   
> -	if (pci_enable_device(pd)) {
> -		printk(KERN_ERR PFX "cannot enable PCI device\n");
> -		goto err_out_enable;
> -	}
> -
>   	if (pci_request_regions(pd, "nvidiafb")) {
>   		printk(KERN_ERR PFX "cannot request PCI regions\n");
>   		goto err_out_enable;
> @@ -1318,34 +1340,17 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
>   	par->paneltweak = paneltweak;
>   	par->reverse_i2c = reverse_i2c;
>   
> -	/* enable IO and mem if not already done */
> -	pci_read_config_word(pd, PCI_COMMAND, &cmd);
> -	cmd |= (PCI_COMMAND_IO | PCI_COMMAND_MEMORY);
> -	pci_write_config_word(pd, PCI_COMMAND, cmd);
> -
> -	nvidiafb_fix.mmio_start = pci_resource_start(pd, 0);
>   	nvidiafb_fix.smem_start = pci_resource_start(pd, 1);
> -	nvidiafb_fix.mmio_len = pci_resource_len(pd, 0);
> -
> -	par->REGS = ioremap(nvidiafb_fix.mmio_start, nvidiafb_fix.mmio_len);
>   
> -	if (!par->REGS) {
> -		printk(KERN_ERR PFX "cannot ioremap MMIO base\n");
> -		goto err_out_free_base0;
> -	}
> +	par->REGS = REGS;
>   
> -	par->Chipset = nvidia_get_chipset(info);
> -	par->Architecture = nvidia_get_arch(info);
> -
> -	if (par->Architecture == 0) {
> -		printk(KERN_ERR PFX "unknown NV_ARCH\n");
> -		goto err_out_arch;
> -	}
> +	par->Chipset = Chipset;
> +	par->Architecture = Architecture;
>   
>   	sprintf(nvidiafb_fix.id, "NV%x", (pd->device & 0x0ff0) >> 4);
>   
>   	if (NVCommonSetup(info))
> -		goto err_out_arch;
> +		goto err_out_free_base0;
>   
>   	par->FbAddress = nvidiafb_fix.smem_start;
>   	par->FbMapSize = par->RamAmountKBytes * 1024;
> @@ -1401,7 +1406,6 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
>   		goto err_out_iounmap_fb;
>   	}
>   
> -
>   	printk(KERN_INFO PFX
>   	       "PCI nVidia %s framebuffer (%dMB @ 0x%lX)\n",
>   	       info->fix.id,
> @@ -1415,15 +1419,14 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
>   err_out_free_base1:
>   	fb_destroy_modedb(info->monspecs.modedb);
>   	nvidia_delete_i2c_busses(par);
> -err_out_arch:
> -	iounmap(par->REGS);
> - err_out_free_base0:
> +err_out_free_base0:
>   	pci_release_regions(pd);
>   err_out_enable:
>   	kfree(info->pixmap.addr);
>   err_out_kfree:
>   	framebuffer_release(info);
>   err_out:
> +	iounmap(REGS);
>   	return -ENODEV;
>   }
>   

-- 
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Maxfeldstr. 5, 90409 Nürnberg, Germany
(HRB 36809, AG Nürnberg)
Geschäftsführer: Ivo Totev

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 840 bytes --]

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] nvidiafb: detect the hardware support before removing console.
  2023-02-06  8:54             ` Zeno Davatz
@ 2023-02-09  9:07               ` Thomas Zimmermann
  0 siblings, 0 replies; 10+ messages in thread
From: Thomas Zimmermann @ 2023-02-09  9:07 UTC (permalink / raw)
  To: Zeno Davatz, David Airlie
  Cc: linux-fbdev, linux-kernel, dri-devel, Bjorn Helgaas, Bjorn Helgaas


[-- Attachment #1.1: Type: text/plain, Size: 10992 bytes --]

Hi

Am 06.02.23 um 09:54 schrieb Zeno Davatz:
> Dear Dave
> 
> On Mon, Feb 6, 2023 at 9:40 AM David Airlie <airlied@redhat.com> wrote:
>>
>> On Mon, Feb 6, 2023 at 6:38 PM Zeno Davatz <zdavatz@gmail.com> wrote:
>>>
>>> Dear Dave
>>>
>>> On Mon, Feb 6, 2023 at 9:10 AM Dave Airlie <airlied@gmail.com> wrote:
>>>>
>>>> On Mon, 6 Feb 2023 at 18:01, Zeno Davatz <zdavatz@gmail.com> wrote:
>>>>>
>>>>> Dear Dave
>>>>>
>>>>> On Mon, Feb 6, 2023 at 8:54 AM Dave Airlie <airlied@gmail.com> wrote:
>>>>>>
>>>>>> On Mon, 6 Feb 2023 at 17:52, Zeno Davatz <zdavatz@gmail.com> wrote:
>>>>>>>
>>>>>>> Dear Dave
>>>>>>>
>>>>>>> Thank you for your patch.
>>>>>>>
>>>>>>> On Sun, Feb 5, 2023 at 10:07 PM Dave Airlie <airlied@gmail.com> wrote:
>>>>>>>>
>>>>>>>> From: Dave Airlie <airlied@redhat.com>
>>>>>>>>
>>>>>>>> This driver removed the console, but hasn't yet decided if it could
>>>>>>>> take over the console yet. Instead of doing that, probe the hw for
>>>>>>>> support and then remove the console afterwards.
>>>>>>>>
>>>>>>>> Signed-off-by: Dave Airlie <airlied@redhat.com>
>>>>>>>> Fixes: https://bugzilla.kernel.org/show_bug.cgi?id=216859
>>>>>>>> Reported-by: Zeno Davatz <zdavatz@gmail.com>
>>>>>>>> ---
>>>>>>>>   drivers/video/fbdev/nvidia/nvidia.c | 81 +++++++++++++++--------------
>>>>>>>>   1 file changed, 42 insertions(+), 39 deletions(-)
>>>>>>>>
>>>>>>>> diff --git a/drivers/video/fbdev/nvidia/nvidia.c b/drivers/video/fbdev/nvidia/nvidia.c
>>>>>>>> index 1960916098d4..e60a276b4855 100644
>>>>>>>> --- a/drivers/video/fbdev/nvidia/nvidia.c
>>>>>>>> +++ b/drivers/video/fbdev/nvidia/nvidia.c
>>>>>>>> @@ -1197,17 +1197,17 @@ static int nvidia_set_fbinfo(struct fb_info *info)
>>>>>>>>          return nvidiafb_check_var(&info->var, info);
>>>>>>>>   }
>>>>>>>>
>>>>>>>> -static u32 nvidia_get_chipset(struct fb_info *info)
>>>>>>>> +static u32 nvidia_get_chipset(struct pci_dev *pci_dev,
>>>>>>>> +                             volatile u32 __iomem *REGS)
>>>>>>>>   {
>>>>>>>> -       struct nvidia_par *par = info->par;
>>>>>>>> -       u32 id = (par->pci_dev->vendor << 16) | par->pci_dev->device;
>>>>>>>> +       u32 id = (pci_dev->vendor << 16) | pci_dev->device;
>>>>>>>>
>>>>>>>>          printk(KERN_INFO PFX "Device ID: %x \n", id);
>>>>>>>>
>>>>>>>>          if ((id & 0xfff0) == 0x00f0 ||
>>>>>>>>              (id & 0xfff0) == 0x02e0) {
>>>>>>>>                  /* pci-e */
>>>>>>>> -               id = NV_RD32(par->REGS, 0x1800);
>>>>>>>> +               id = NV_RD32(REGS, 0x1800);
>>>>>>>>
>>>>>>>>                  if ((id & 0x0000ffff) == 0x000010DE)
>>>>>>>>                          id = 0x10DE0000 | (id >> 16);
>>>>>>>> @@ -1220,12 +1220,11 @@ static u32 nvidia_get_chipset(struct fb_info *info)
>>>>>>>>          return id;
>>>>>>>>   }
>>>>>>>>
>>>>>>>> -static u32 nvidia_get_arch(struct fb_info *info)
>>>>>>>> +static u32 nvidia_get_arch(u32 Chipset)
>>>>>>>>   {
>>>>>>>> -       struct nvidia_par *par = info->par;
>>>>>>>>          u32 arch = 0;
>>>>>>>>
>>>>>>>> -       switch (par->Chipset & 0x0ff0) {
>>>>>>>> +       switch (Chipset & 0x0ff0) {
>>>>>>>>          case 0x0100:            /* GeForce 256 */
>>>>>>>>          case 0x0110:            /* GeForce2 MX */
>>>>>>>>          case 0x0150:            /* GeForce2 */
>>>>>>>> @@ -1278,16 +1277,44 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
>>>>>>>>          struct fb_info *info;
>>>>>>>>          unsigned short cmd;
>>>>>>>>          int ret;
>>>>>>>> +       volatile u32 __iomem *REGS;
>>>>>>>> +       int Chipset;
>>>>>>>> +       u32 Architecture;
>>>>>>>>
>>>>>>>>          NVTRACE_ENTER();
>>>>>>>>          assert(pd != NULL);
>>>>>>>>
>>>>>>>> +       if (pci_enable_device(pd)) {
>>>>>>>> +               printk(KERN_ERR PFX "cannot enable PCI device\n");
>>>>>>>> +               return -ENODEV;
>>>>>>>> +       }
>>>>>>>> +
>>>>>>>> +       /* enable IO and mem if not already done */
>>>>>>>> +       pci_read_config_word(pd, PCI_COMMAND, &cmd);
>>>>>>>> +       cmd |= (PCI_COMMAND_IO | PCI_COMMAND_MEMORY);
>>>>>>>> +       pci_write_config_word(pd, PCI_COMMAND, cmd);
>>>>>>>> +
>>>>>>>> +       nvidiafb_fix.mmio_start = pci_resource_start(pd, 0);
>>>>>>>> +       nvidiafb_fix.mmio_len = pci_resource_len(pd, 0);
>>>>>>>> +
>>>>>>>> +       REGS = ioremap(nvidiafb_fix.mmio_start, nvidiafb_fix.mmio_len);
>>>>>>>> +       if (!REGS) {
>>>>>>>> +               printk(KERN_ERR PFX "cannot ioremap MMIO base\n");
>>>>>>>> +               return -ENODEV;
>>>>>>>> +       }
>>>>>>>> +
>>>>>>>> +       Chipset = nvidia_get_chipset(pd, REGS);
>>>>>>>> +       Architecture = nvidia_get_arch(Chipset);
>>>>>>>> +       if (Architecture == 0) {
>>>>>>>> +               printk(KERN_ERR PFX "unknown NV_ARCH\n");
>>>>>>>> +               goto err_out;
>>>>>>>> +       }
>>>>>>>> +
>>>>>>>>          ret = aperture_remove_conflicting_pci_devices(pd, "nvidiafb");
>>>>>>>>          if (ret)
>>>>>>>> -               return ret;
>>>>>>>> +               goto err_out;
>>>>>>>>
>>>>>>>>          info = framebuffer_alloc(sizeof(struct nvidia_par), &pd->dev);
>>>>>>>> -
>>>>>>>>          if (!info)
>>>>>>>>                  goto err_out;
>>>>>>>>
>>>>>>>> @@ -1298,11 +1325,6 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
>>>>>>>>          if (info->pixmap.addr == NULL)
>>>>>>>>                  goto err_out_kfree;
>>>>>>>>
>>>>>>>> -       if (pci_enable_device(pd)) {
>>>>>>>> -               printk(KERN_ERR PFX "cannot enable PCI device\n");
>>>>>>>> -               goto err_out_enable;
>>>>>>>> -       }
>>>>>>>> -
>>>>>>>>          if (pci_request_regions(pd, "nvidiafb")) {
>>>>>>>>                  printk(KERN_ERR PFX "cannot request PCI regions\n");
>>>>>>>>                  goto err_out_enable;
>>>>>>>> @@ -1318,34 +1340,17 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
>>>>>>>>          par->paneltweak = paneltweak;
>>>>>>>>          par->reverse_i2c = reverse_i2c;
>>>>>>>>
>>>>>>>> -       /* enable IO and mem if not already done */
>>>>>>>> -       pci_read_config_word(pd, PCI_COMMAND, &cmd);
>>>>>>>> -       cmd |= (PCI_COMMAND_IO | PCI_COMMAND_MEMORY);
>>>>>>>> -       pci_write_config_word(pd, PCI_COMMAND, cmd);
>>>>>>>> -
>>>>>>>> -       nvidiafb_fix.mmio_start = pci_resource_start(pd, 0);
>>>>>>>>          nvidiafb_fix.smem_start = pci_resource_start(pd, 1);
>>>>>>>> -       nvidiafb_fix.mmio_len = pci_resource_len(pd, 0);
>>>>>>>> -
>>>>>>>> -       par->REGS = ioremap(nvidiafb_fix.mmio_start, nvidiafb_fix.mmio_len);
>>>>>>>>
>>>>>>>> -       if (!par->REGS) {
>>>>>>>> -               printk(KERN_ERR PFX "cannot ioremap MMIO base\n");
>>>>>>>> -               goto err_out_free_base0;
>>>>>>>> -       }
>>>>>>>> +       par->REGS = REGS;
>>>>>>>>
>>>>>>>> -       par->Chipset = nvidia_get_chipset(info);
>>>>>>>> -       par->Architecture = nvidia_get_arch(info);
>>>>>>>> -
>>>>>>>> -       if (par->Architecture == 0) {
>>>>>>>> -               printk(KERN_ERR PFX "unknown NV_ARCH\n");
>>>>>>>> -               goto err_out_arch;
>>>>>>>> -       }
>>>>>>>> +       par->Chipset = Chipset;
>>>>>>>> +       par->Architecture = Architecture;
>>>>>>>>
>>>>>>>>          sprintf(nvidiafb_fix.id, "NV%x", (pd->device & 0x0ff0) >> 4);
>>>>>>>>
>>>>>>>>          if (NVCommonSetup(info))
>>>>>>>> -               goto err_out_arch;
>>>>>>>> +               goto err_out_free_base0;
>>>>>>>>
>>>>>>>>          par->FbAddress = nvidiafb_fix.smem_start;
>>>>>>>>          par->FbMapSize = par->RamAmountKBytes * 1024;
>>>>>>>> @@ -1401,7 +1406,6 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
>>>>>>>>                  goto err_out_iounmap_fb;
>>>>>>>>          }
>>>>>>>>
>>>>>>>> -
>>>>>>>>          printk(KERN_INFO PFX
>>>>>>>>                 "PCI nVidia %s framebuffer (%dMB @ 0x%lX)\n",
>>>>>>>>                 info->fix.id,
>>>>>>>> @@ -1415,15 +1419,14 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
>>>>>>>>   err_out_free_base1:
>>>>>>>>          fb_destroy_modedb(info->monspecs.modedb);
>>>>>>>>          nvidia_delete_i2c_busses(par);
>>>>>>>> -err_out_arch:
>>>>>>>> -       iounmap(par->REGS);
>>>>>>>> - err_out_free_base0:
>>>>>>>> +err_out_free_base0:
>>>>>>>>          pci_release_regions(pd);
>>>>>>>>   err_out_enable:
>>>>>>>>          kfree(info->pixmap.addr);
>>>>>>>>   err_out_kfree:
>>>>>>>>          framebuffer_release(info);
>>>>>>>>   err_out:
>>>>>>>> +       iounmap(REGS);
>>>>>>>>          return -ENODEV;
>>>>>>>>   }
>>>>>>>>
>>>>>>>> --
>>>>>>>> 2.38.1
>>>>>>>
>>>>>>> This patch fails for me.
>>>>>>
>>>>>> I've based the patch on 6.2-rc7, please make sure to not have the
>>>>>> previous revert committed, this is to replace that patch.
>>>>>
>>>>> Can you guide me through the steps please?
>>>>>
>>>>> I done:
>>>>>
>>>>> 1. cd /usr/src/linux
>>>>> 2. sudo git pull
>>>>> 3. then I applied your patch.
>>>>>
>>>>> Am I doing something wrong?
>>>>
>>>> What is your top of tree commit? (git log)
>>>>
>>>> have you got any commits on top?
>>>>
>>>> git reset --hard origin/master should reset your tree to Linus top.
>>>
>>> 1. git log shows "d2d11f342b179f1894a901f143ec7c008caba43e"
>>> 2. No, no patches on top.
>>> 3. I am doing the following steps:
>>> /usr/src/linux> sudo git reset --hard origin/master
>>> Passwort:
>>> HEAD ist jetzt bei d2d11f342b17 Merge branch 'fixes' of
>>> git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
>>> /usr/src/linux> sudo patch -p1 < /tmp/patch
>>> patching file drivers/video/fbdev/nvidia/nvidia.c
>>> Hunk #1 FAILED at 1197.
>>> Hunk #2 FAILED at 1220.
>>> Hunk #3 FAILED at 1278.
>>> Hunk #4 FAILED at 1298.
>>> Hunk #5 FAILED at 1318.
>>> Hunk #6 FAILED at 1401.
>>> Hunk #7 FAILED at 1415.
>>> 7 out of 7 hunks FAILED -- saving rejects to file
>>> drivers/video/fbdev/nvidia/nvidia.c.rej
>>>
>> Are you pulling the patch from email? I guess your email service or
>> something is mangling it.
>>
>> I've attached it to see if that helps.
> 
> Thank you! This patch works and I am booting perfectly well now!
> 
> ~/.backup> uname -a
> Linux zenogentoo 6.2.0-rc7-00002-gd2d11f342b17-dirty #144 SMP
> PREEMPT_DYNAMIC Mon Feb  6 09:42:58 CET 2023 x86_64 Intel(R) Core(TM)
> i7 CPU 960 @ 3.20GHz GenuineIntel GNU/Linux
> 
> Please let me know if the patch makes it into mainline for the 6.2 release ;).

Queued up in drm-misc-fixes. The patch should be in 6.1 and 6.2 soon.

Best regards
Thomas

> 
> Best
> Zeno

-- 
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Maxfeldstr. 5, 90409 Nürnberg, Germany
(HRB 36809, AG Nürnberg)
Geschäftsführer: Ivo Totev

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 840 bytes --]

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2023-02-09  9:07 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-02-05 21:07 [PATCH] nvidiafb: detect the hardware support before removing console Dave Airlie
2023-02-06  7:52 ` Zeno Davatz
2023-02-06  7:54   ` Dave Airlie
2023-02-06  8:01     ` Zeno Davatz
2023-02-06  8:09       ` Dave Airlie
2023-02-06  8:37         ` Zeno Davatz
2023-02-06  8:40           ` David Airlie
2023-02-06  8:54             ` Zeno Davatz
2023-02-09  9:07               ` Thomas Zimmermann
2023-02-06  9:05 ` Thomas Zimmermann

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).