From: David Miller <davem@davemloft.net>
To: linux-fbdev@vger.kernel.org
Subject: Re: [PATCH 0/22] Make SVGA oriented FBs work on multi-domain PCI
Date: Wed, 12 Jan 2011 04:51:03 +0000 [thread overview]
Message-ID: <20110111.205103.266092678.davem@davemloft.net> (raw)
In-Reply-To: <20110111.154846.233419170.davem@davemloft.net>
From: David Miller <davem@davemloft.net>
Date: Tue, 11 Jan 2011 20:27:19 -0800 (PST)
> From: David Miller <davem@davemloft.net>
> Date: Tue, 11 Jan 2011 18:29:45 -0800 (PST)
>
>> Oh... I see what is happening. save_vga() sets this value using it's
>> own heuristics, when VGA_SAVE_FONTS is set, but in a way that won't
>> work in multi-domain PCI situations.
>>
>> So we need to set this up in the drivers just like we do for the
>> 'vgabase' member.
>>
>> I'll work on some patches to fix this.
>
> Alex, give this a try.
Sorry, forgot the patch, here it is :-)
diff --git a/drivers/video/arkfb.c b/drivers/video/arkfb.c
index f63fdf7..3b2f6f5 100644
--- a/drivers/video/arkfb.c
+++ b/drivers/video/arkfb.c
@@ -535,13 +535,13 @@ static int arkfb_open(struct fb_info *info, int user)
mutex_lock(&(par->open_lock));
if (par->ref_count = 0) {
- void __iomem *vgabase = par->state.vgabase;
-
- memset(&(par->state), 0, sizeof(struct vgastate));
- par->state.vgabase = vgabase;
par->state.flags = VGA_SAVE_MODE | VGA_SAVE_FONTS | VGA_SAVE_CMAP;
+ par->state.depth = 0;
+ par->state.num_attr = 0;
par->state.num_crtc = 0x60;
+ par->state.num_gfx = 0;
par->state.num_seq = 0x30;
+ par->state.vidstate = NULL;
save_vga(&(par->state));
}
@@ -947,12 +947,36 @@ static struct fb_ops arkfb_ops = {
/* ------------------------------------------------------------------------- */
+static void __devinit ark_init_vgastate(struct pci_dev *dev, struct vgastate *state)
+{
+ struct pci_bus_region bus_reg;
+ struct resource vga_res;
+
+ bus_reg.start = 0;
+ bus_reg.end = 64 * 1024;
+
+ memset(&vga_res, 0, sizeof(vga_res));
+ vga_res.flags = IORESOURCE_IO;
+
+ pcibios_bus_to_resource(dev, &vga_res, &bus_reg);
+
+ state->vgabase = (void __iomem *) vga_res.start;
+
+ bus_reg.start = 0xa0000;
+ bus_reg.end = bus_reg.start + (8 * 8192);
+
+ memset(&vga_res, 0, sizeof(vga_res));
+ vga_res.flags = IORESOURCE_MEM;
+
+ pcibios_bus_to_resource(dev, &vga_res, &bus_reg);
+
+ state->membase = vga_res.start;
+ state->memsize = 8 * 8192;
+}
/* PCI probe */
static int __devinit ark_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
{
- struct pci_bus_region bus_reg;
- struct resource vga_res;
struct fb_info *info;
struct arkfb_info *par;
int rc;
@@ -1008,14 +1032,7 @@ static int __devinit ark_pci_probe(struct pci_dev *dev, const struct pci_device_
goto err_iomap;
}
- bus_reg.start = 0;
- bus_reg.end = 64 * 1024;
-
- vga_res.flags = IORESOURCE_IO;
-
- pcibios_bus_to_resource(dev, &vga_res, &bus_reg);
-
- par->state.vgabase = (void __iomem *) vga_res.start;
+ ark_init_vgastate(dev, &par->state);
/* FIXME get memsize */
regval = vga_rseq(par->state.vgabase, 0x10);
diff --git a/drivers/video/s3fb.c b/drivers/video/s3fb.c
index 64ef7b3..4b8f215 100644
--- a/drivers/video/s3fb.c
+++ b/drivers/video/s3fb.c
@@ -379,13 +379,13 @@ static int s3fb_open(struct fb_info *info, int user)
mutex_lock(&(par->open_lock));
if (par->ref_count = 0) {
- void __iomem *vgabase = par->state.vgabase;
-
- memset(&(par->state), 0, sizeof(struct vgastate));
- par->state.vgabase = vgabase;
par->state.flags = VGA_SAVE_MODE | VGA_SAVE_FONTS | VGA_SAVE_CMAP;
+ par->state.depth = 0;
+ par->state.num_attr = 0;
par->state.num_crtc = 0x70;
+ par->state.num_gfx = 0;
par->state.num_seq = 0x20;
+ par->state.vidstate = NULL;
save_vga(&(par->state));
}
@@ -929,13 +929,37 @@ static int __devinit s3_identification(struct s3fb_info *par)
return CHIP_UNKNOWN;
}
+static void __devinit s3fb_init_vgastate(struct pci_dev *dev, struct vgastate *state)
+{
+ struct pci_bus_region bus_reg;
+ struct resource vga_res;
+
+ bus_reg.start = 0;
+ bus_reg.end = 64 * 1024;
+
+ memset(&vga_res, 0, sizeof(vga_res));
+ vga_res.flags = IORESOURCE_IO;
+
+ pcibios_bus_to_resource(dev, &vga_res, &bus_reg);
+
+ state->vgabase = (void __iomem *) vga_res.start;
+
+ bus_reg.start = 0xa0000;
+ bus_reg.end = bus_reg.start + (8 * 8192);
+
+ memset(&vga_res, 0, sizeof(vga_res));
+ vga_res.flags = IORESOURCE_MEM;
+
+ pcibios_bus_to_resource(dev, &vga_res, &bus_reg);
+
+ state->membase = vga_res.start;
+ state->memsize = 8 * 8192;
+}
/* PCI probe */
static int __devinit s3_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
{
- struct pci_bus_region bus_reg;
- struct resource vga_res;
struct fb_info *info;
struct s3fb_info *par;
int rc;
@@ -985,14 +1009,7 @@ static int __devinit s3_pci_probe(struct pci_dev *dev, const struct pci_device_i
goto err_iomap;
}
- bus_reg.start = 0;
- bus_reg.end = 64 * 1024;
-
- vga_res.flags = IORESOURCE_IO;
-
- pcibios_bus_to_resource(dev, &vga_res, &bus_reg);
-
- par->state.vgabase = (void __iomem *) vga_res.start;
+ s3fb_init_vgastate(dev, &par->state);
/* Unlock regs */
cr38 = vga_rcrt(par->state.vgabase, 0x38);
diff --git a/drivers/video/vt8623fb.c b/drivers/video/vt8623fb.c
index 74df7a8..be70c14 100644
--- a/drivers/video/vt8623fb.c
+++ b/drivers/video/vt8623fb.c
@@ -292,13 +292,13 @@ static int vt8623fb_open(struct fb_info *info, int user)
mutex_lock(&(par->open_lock));
if (par->ref_count = 0) {
- void __iomem *vgabase = par->state.vgabase;
-
- memset(&(par->state), 0, sizeof(struct vgastate));
- par->state.vgabase = vgabase;
par->state.flags = VGA_SAVE_MODE | VGA_SAVE_FONTS | VGA_SAVE_CMAP;
+ par->state.depth = 0;
+ par->state.num_attr = 0;
par->state.num_crtc = 0xA2;
+ par->state.num_gfx = 0;
par->state.num_seq = 0x50;
+ par->state.vidstate = NULL;
save_vga(&(par->state));
}
@@ -656,13 +656,37 @@ static struct fb_ops vt8623fb_ops = {
.fb_get_caps = svga_get_caps,
};
+static void __devinit vt8623_init_vgastate(struct pci_dev *dev, struct vgastate *state)
+{
+ struct pci_bus_region bus_reg;
+ struct resource vga_res;
+
+ bus_reg.start = 0;
+ bus_reg.end = 64 * 1024;
+
+ memset(&vga_res, 0, sizeof(vga_res));
+ vga_res.flags = IORESOURCE_IO;
+
+ pcibios_bus_to_resource(dev, &vga_res, &bus_reg);
+
+ state->vgabase = (void __iomem *) vga_res.start;
+
+ bus_reg.start = 0xa0000;
+ bus_reg.end = bus_reg.start + (8 * 8192);
+
+ memset(&vga_res, 0, sizeof(vga_res));
+ vga_res.flags = IORESOURCE_MEM;
+
+ pcibios_bus_to_resource(dev, &vga_res, &bus_reg);
+
+ state->membase = vga_res.start;
+ state->memsize = 8 * 8192;
+}
/* PCI probe */
static int __devinit vt8623_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
{
- struct pci_bus_region bus_reg;
- struct resource vga_res;
struct fb_info *info;
struct vt8623fb_info *par;
unsigned int memsize1, memsize2;
@@ -721,14 +745,7 @@ static int __devinit vt8623_pci_probe(struct pci_dev *dev, const struct pci_devi
goto err_iomap_2;
}
- bus_reg.start = 0;
- bus_reg.end = 64 * 1024;
-
- vga_res.flags = IORESOURCE_IO;
-
- pcibios_bus_to_resource(dev, &vga_res, &bus_reg);
-
- par->state.vgabase = (void __iomem *) vga_res.start;
+ vt8623_init_vgastate(dev, &par->state);
/* Find how many physical memory there is on card */
memsize1 = (vga_rseq(par->state.vgabase, 0x34) + 1) >> 1;
next prev parent reply other threads:[~2011-01-12 4:51 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-01-11 23:48 [PATCH 0/22] Make SVGA oriented FBs work on multi-domain PCI David Miller
2011-01-12 0:20 ` Alex Buell
2011-01-12 0:22 ` David Miller
2011-01-12 1:30 ` Alex Buell
2011-01-12 2:14 ` Alex Buell
2011-01-12 2:29 ` David Miller
2011-01-12 4:27 ` David Miller
2011-01-12 4:51 ` David Miller [this message]
2011-01-12 7:17 ` Ondrej Zary
2011-01-12 23:43 ` Alex Buell
2011-01-17 4:30 ` David Miller
2011-01-22 4:11 ` David Miller
2011-01-22 10:55 ` Alex Buell
2011-02-16 23:01 ` Ondrej Zary
2011-02-16 23:21 ` Alex Buell
2011-02-16 23:24 ` David Miller
2011-02-16 23:37 ` Alex Buell
2011-02-17 8:20 ` Ondrej Zary
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20110111.205103.266092678.davem@davemloft.net \
--to=davem@davemloft.net \
--cc=linux-fbdev@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.