* [PATCH 2.6.12 1/1] pcdp: add PCDP pci interface support
@ 2005-04-21 20:26 Mark Maule
2005-04-21 21:41 ` Bjorn Helgaas
` (6 more replies)
0 siblings, 7 replies; 8+ messages in thread
From: Mark Maule @ 2005-04-21 20:26 UTC (permalink / raw)
To: linux-ia64
Patch to extend the PCDP vga setup code to support PCI io/mem translations
for the legacy vga ioport and ram spaces on architectures (e.g. altix) which
need them. Diffs were generated against the last available ia64 bk test tree.
Summary of the changes:
drivers/firmware/pcdp.c
-----------------------
+ add declaration for the spec-defined PCI interface struct (pcdp_if_pci)
as well as support macros.
+ extend setup_vga_console() to know about pcdp_if_pci and add a couple of
globals to hold the io and mem translation offsets if present.
arch/ia64/kernel/setup.c
------------------------
+ tweek early_console_setup() to allow multiple early console setup routines
to be called.
drivers/firmware/pcdp.h
-----------------------
+ new struct pcdp_if_pci and associated macros
include/asm-ia64/vga.h
----------------------
+ make VGA_MAP_MEM pcdp_vga_mem_base asware if we're in a PCDP environment
Signed-off-by: Mark Maule <maule@sgi.com>
diff -Nru a/arch/ia64/kernel/setup.c b/arch/ia64/kernel/setup.c
--- a/arch/ia64/kernel/setup.c 2005-04-21 14:39:56 -05:00
+++ b/arch/ia64/kernel/setup.c 2005-04-21 14:39:56 -05:00
@@ -273,23 +273,25 @@
static inline int __init
early_console_setup (char *cmdline)
{
+ int earlycons = 0;
+
#ifdef CONFIG_SERIAL_SGI_L1_CONSOLE
{
extern int sn_serial_console_early_setup(void);
if (!sn_serial_console_early_setup())
- return 0;
+ earlycons++;
}
#endif
#ifdef CONFIG_EFI_PCDP
if (!efi_setup_pcdp_console(cmdline))
- return 0;
+ earlycons++;
#endif
#ifdef CONFIG_SERIAL_8250_CONSOLE
if (!early_serial_console_init(cmdline))
- return 0;
+ earlycons++;
#endif
- return -1;
+ return (earlycons) ? 0 : -1;
}
static inline void
diff -Nru a/drivers/firmware/pcdp.c b/drivers/firmware/pcdp.c
--- a/drivers/firmware/pcdp.c 2005-04-21 14:39:56 -05:00
+++ b/drivers/firmware/pcdp.c 2005-04-21 14:39:56 -05:00
@@ -35,11 +35,32 @@
#endif
}
+unsigned long pcdp_vga_io_base;
+unsigned long pcdp_vga_mem_base;
+
static int __init
-setup_vga_console(struct pcdp_vga *vga)
+setup_vga_console(struct pcdp_device *dev)
{
+
#if defined(CONFIG_VT) && defined(CONFIG_VGA_CONSOLE)
- if (efi_mem_type(0xA0000) = EFI_CONVENTIONAL_MEMORY) {
+ u8 *if_ptr;
+
+ if_ptr = ((u8 *)dev + sizeof(struct pcdp_device));
+ if (if_ptr[0] = PCDP_IF_PCI) {
+ struct pcdp_if_pci if_pci;
+
+ /* struct copy since ifptr might not be correctly aligned */
+
+ memcpy(&if_pci, if_ptr, sizeof(struct pcdp_if_pci));
+
+ if (if_pci.trans & PCDP_PCI_TRANS_IOPORT)
+ pcdp_vga_io_base = if_pci.ioport_tra;
+
+ if (if_pci.trans & PCDP_PCI_TRANS_MMIO)
+ pcdp_vga_mem_base = if_pci.mmio_tra;
+ }
+
+ if (efi_mem_type(pcdp_vga_mem_base + 0xA0000) = EFI_CONVENTIONAL_MEMORY) {
printk(KERN_ERR "PCDP: VGA selected, but frame buffer is not MMIO!\n");
return -ENODEV;
}
@@ -91,7 +112,7 @@
dev = (struct pcdp_device *) ((u8 *) dev + dev->length)) {
if (dev->flags & PCDP_PRIMARY_CONSOLE) {
if (dev->type = PCDP_CONSOLE_VGA) {
- return setup_vga_console((struct pcdp_vga *) dev);
+ return setup_vga_console(dev);
}
}
}
diff -Nru a/drivers/firmware/pcdp.h b/drivers/firmware/pcdp.h
--- a/drivers/firmware/pcdp.h 2005-04-21 14:39:56 -05:00
+++ b/drivers/firmware/pcdp.h 2005-04-21 14:39:56 -05:00
@@ -52,11 +52,34 @@
u32 clock_rate;
u8 pci_prog_intfc;
u8 flags;
-};
+} __attribute__((packed));
+
+#define PCDP_IF_PCI 1
+
+/* pcdp_if_pci.trans */
+#define PCDP_PCI_TRANS_IOPORT 0x02
+#define PCDP_PCI_TRANS_MMIO 0x01
+
+struct pcdp_if_pci {
+ u8 interconnect;
+ u8 reserved;
+ u16 length;
+ u8 segment;
+ u8 bus;
+ u8 dev;
+ u8 fun;
+ u16 dev_id;
+ u16 vendor_id;
+ u32 acpi_interrupt;
+ u64 mmio_tra;
+ u64 ioport_tra;
+ u8 flags;
+ u8 trans;
+} __attribute__((packed));
struct pcdp_vga {
u8 count; /* address space descriptors */
-};
+} __attribute__((packed));
/* pcdp_device.flags */
#define PCDP_PRIMARY_CONSOLE 1
@@ -66,7 +89,9 @@
u8 flags;
u16 length;
u16 efi_index;
-};
+ /* next data is pcdp_if_pci or pcdp_if_acpi (not yet supported) */
+ /* next data is device specific type (currently only pcdp_vga) */
+} __attribute__((packed));
struct pcdp {
u8 signature[4];
@@ -81,4 +106,4 @@
u32 num_uarts;
struct pcdp_uart uart[0]; /* actual size is num_uarts */
/* remainder of table is pcdp_device structures */
-};
+} __attribute__((packed));
diff -Nru a/include/asm-ia64/vga.h b/include/asm-ia64/vga.h
--- a/include/asm-ia64/vga.h 2005-04-21 14:39:56 -05:00
+++ b/include/asm-ia64/vga.h 2005-04-21 14:39:56 -05:00
@@ -11,10 +11,18 @@
/*
* On the PC, we can just recalculate addresses and then access the
- * videoram directly without any black magic.
+ * videoram directly without any black magic. If we're in a PCDP
+ * environment, add in the vga mmio offset supplied by the table.
*/
+#if defined(CONFIG_EFI_PCDP)
+extern unsigned long pcdp_vga_io_base;
+extern unsigned long pcdp_vga_mem_base;
+
+#define VGA_MAP_MEM(x) ((unsigned long) ioremap(pcdp_vga_mem_base + (x), 0))
+#else
#define VGA_MAP_MEM(x) ((unsigned long) ioremap((x), 0))
+#endif
#define vga_readb(x) (*(x))
#define vga_writeb(x,y) (*(y) = (x))
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 2.6.12 1/1] pcdp: add PCDP pci interface support
2005-04-21 20:26 [PATCH 2.6.12 1/1] pcdp: add PCDP pci interface support Mark Maule
@ 2005-04-21 21:41 ` Bjorn Helgaas
2005-04-21 22:05 ` Mark Maule
` (5 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Bjorn Helgaas @ 2005-04-21 21:41 UTC (permalink / raw)
To: linux-ia64
On Thu, 2005-04-21 at 15:26 -0500, Mark Maule wrote:
> #ifdef CONFIG_SERIAL_SGI_L1_CONSOLE
> {
> extern int sn_serial_console_early_setup(void);
> if (!sn_serial_console_early_setup())
> - return 0;
> + earlycons++;
> }
If SGI is going to support the PCDP, why don't you add a new
PCDP device type for the L1 console? It feels like a nuisance
to have two places to look for console device info. How do
you say "use VGA but not the L1 console"?
> +unsigned long pcdp_vga_io_base;
> +unsigned long pcdp_vga_mem_base;
Apart from the extra space that snuck into the definitions, I
don't really like these being associated with the PCDP. Isn't
this the sort of thing that Ben H's VGA arbitrator[1] would
also change?
So I vote for something with a more neutral name, possibly in
arch/ia64/kernel/setup.c.
And pcdp_vga_io_base isn't used anywhere, so I'd remove it.
> +setup_vga_console(struct pcdp_device *dev)
> {
> +
> #if defined(CONFIG_VT) && defined(CONFIG_VGA_CONSOLE)
> - if (efi_mem_type(0xA0000) = EFI_CONVENTIONAL_MEMORY) {
> + u8 *if_ptr;
This isn't ACPI, so we don't need extra tabs in the middle
of variable declarations (or blank lines after the beginning
of the function). :-)
> + memcpy(&if_pci, if_ptr, sizeof(struct pcdp_if_pci));
The above is correct, but it's easier to verify this:
memcpy(&if_pci, if_ptr, sizeof(if_pci));
[1] http://lkml.org/lkml/2005/3/9/42
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 2.6.12 1/1] pcdp: add PCDP pci interface support
2005-04-21 20:26 [PATCH 2.6.12 1/1] pcdp: add PCDP pci interface support Mark Maule
2005-04-21 21:41 ` Bjorn Helgaas
@ 2005-04-21 22:05 ` Mark Maule
2005-04-23 18:00 ` Mark Maule
` (4 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Mark Maule @ 2005-04-21 22:05 UTC (permalink / raw)
To: linux-ia64
On Thu, 21 Apr 2005, Bjorn Helgaas wrote:
> On Thu, 2005-04-21 at 15:26 -0500, Mark Maule wrote:
> > #ifdef CONFIG_SERIAL_SGI_L1_CONSOLE
> > {
> > extern int sn_serial_console_early_setup(void);
> > if (!sn_serial_console_early_setup())
> > - return 0;
> > + earlycons++;
> > }
>
> If SGI is going to support the PCDP, why don't you add a new
> PCDP device type for the L1 console? It feels like a nuisance
> to have two places to look for console device info. How do
> you say "use VGA but not the L1 console"?
Our prom today only knows how to generate PCDP for vga consoles, and even then,
older proms don't know anything about PCDP. So for now the above would need
to stay. I'd be willing to look into this in a future prom.
As for VGA vs. L1, my current plan is to use add_preferred_console() in
sn_setup() to identify tty0 as the preferred default console if usable vga
exists in the system (as advertised through PCDP).
Note that there will be a follown altix-specific patch to take advantage of
this, but I figured it made more sense to iron out the generic PCDP approach
first.
>
> > +unsigned long pcdp_vga_io_base;
> > +unsigned long pcdp_vga_mem_base;
>
> Apart from the extra space that snuck into the definitions, I
> don't really like these being associated with the PCDP. Isn't
> this the sort of thing that Ben H's VGA arbitrator[1] would
> also change?
>
> So I vote for something with a more neutral name, possibly in
> arch/ia64/kernel/setup.c.
I don't have any problem creating non-pcdp globals. It seemed to make more
sense to me to tie them to pcdp since that's the code that set's them up.
>
> And pcdp_vga_io_base isn't used anywhere, so I'd remove it.
This would be used in the above-mentioned altix patch for vga ioport access.
I added it in this patch for consistency with the mmio base.
>
> > +setup_vga_console(struct pcdp_device *dev)
> > {
> > +
> > #if defined(CONFIG_VT) && defined(CONFIG_VGA_CONSOLE)
> > - if (efi_mem_type(0xA0000) = EFI_CONVENTIONAL_MEMORY) {
> > + u8 *if_ptr;
>
> This isn't ACPI, so we don't need extra tabs in the middle
> of variable declarations (or blank lines after the beginning
> of the function). :-)
>
> > + memcpy(&if_pci, if_ptr, sizeof(struct pcdp_if_pci));
>
> The above is correct, but it's easier to verify this:
>
> memcpy(&if_pci, if_ptr, sizeof(if_pci));
Ok, will clean up the style issues.
thanks
Mark
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 2.6.12 1/1] pcdp: add PCDP pci interface support
2005-04-21 20:26 [PATCH 2.6.12 1/1] pcdp: add PCDP pci interface support Mark Maule
2005-04-21 21:41 ` Bjorn Helgaas
2005-04-21 22:05 ` Mark Maule
@ 2005-04-23 18:00 ` Mark Maule
2005-04-25 15:26 ` Bjorn Helgaas
` (3 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Mark Maule @ 2005-04-23 18:00 UTC (permalink / raw)
To: linux-ia64
Resend with changes per Bjorn Helgaas comments. Changes from original:
+ Change globals to vga_console_iobase/vga_console_membase.
+ Address style-related comments.
Patch to extend the PCDP vga setup code to support PCI io/mem translations
for the legacy vga ioport and ram spaces on architectures (e.g. altix) which
need them. Diffs were generated against the last available ia64 bk test tree.
Summary of the changes:
drivers/firmware/pcdp.c
drivers/firmware/pcdp.h
-----------------------
+ add declaration for the spec-defined PCI interface struct (pcdp_if_pci)
as well as support macros.
+ extend setup_vga_console() to know about pcdp_if_pci and add a couple of
globals to hold the io and mem translation offsets if present.
arch/ia64/kernel/setup.c
------------------------
+ tweek early_console_setup() to allow multiple early console setup routines
to be called.
include/asm-ia64/vga.h
----------------------
+ make VGA_MAP_MEM vga_console_membase asware if we're in a PCDP environment
Signed-off-by: Mark Maule <maule@sgi.com>
diff -Nru a/arch/ia64/kernel/setup.c b/arch/ia64/kernel/setup.c
--- a/arch/ia64/kernel/setup.c 2005-04-22 11:06:27 -05:00
+++ b/arch/ia64/kernel/setup.c 2005-04-22 11:06:27 -05:00
@@ -73,6 +73,11 @@
struct ia64_boot_param *ia64_boot_param;
struct screen_info screen_info;
+#ifdef CONFIG_EFI_PCDP
+unsigned long vga_console_iobase;
+unsigned long vga_console_membase;
+#endif
+
unsigned long ia64_max_cacheline_size;
unsigned long ia64_iobase; /* virtual address for I/O accesses */
EXPORT_SYMBOL(ia64_iobase);
@@ -273,23 +278,25 @@
static inline int __init
early_console_setup (char *cmdline)
{
+ int earlycons = 0;
+
#ifdef CONFIG_SERIAL_SGI_L1_CONSOLE
{
extern int sn_serial_console_early_setup(void);
if (!sn_serial_console_early_setup())
- return 0;
+ earlycons++;
}
#endif
#ifdef CONFIG_EFI_PCDP
if (!efi_setup_pcdp_console(cmdline))
- return 0;
+ earlycons++;
#endif
#ifdef CONFIG_SERIAL_8250_CONSOLE
if (!early_serial_console_init(cmdline))
- return 0;
+ earlycons++;
#endif
- return -1;
+ return (earlycons) ? 0 : -1;
}
static inline void
diff -Nru a/drivers/firmware/pcdp.c b/drivers/firmware/pcdp.c
--- a/drivers/firmware/pcdp.c 2005-04-22 11:06:27 -05:00
+++ b/drivers/firmware/pcdp.c 2005-04-22 11:06:27 -05:00
@@ -15,6 +15,7 @@
#include <linux/console.h>
#include <linux/efi.h>
#include <linux/serial.h>
+#include <asm/vga.h>
#include "pcdp.h"
static int __init
@@ -36,10 +37,27 @@
}
static int __init
-setup_vga_console(struct pcdp_vga *vga)
+setup_vga_console(struct pcdp_device *dev)
{
#if defined(CONFIG_VT) && defined(CONFIG_VGA_CONSOLE)
- if (efi_mem_type(0xA0000) = EFI_CONVENTIONAL_MEMORY) {
+ u8 *if_ptr;
+
+ if_ptr = ((u8 *)dev + sizeof(struct pcdp_device));
+ if (if_ptr[0] = PCDP_IF_PCI) {
+ struct pcdp_if_pci if_pci;
+
+ /* struct copy since ifptr might not be correctly aligned */
+
+ memcpy(&if_pci, if_ptr, sizeof(if_pci));
+
+ if (if_pci.trans & PCDP_PCI_TRANS_IOPORT)
+ vga_console_iobase = if_pci.ioport_tra;
+
+ if (if_pci.trans & PCDP_PCI_TRANS_MMIO)
+ vga_console_membase = if_pci.mmio_tra;
+ }
+
+ if (efi_mem_type(vga_console_membase + 0xA0000) = EFI_CONVENTIONAL_MEMORY) {
printk(KERN_ERR "PCDP: VGA selected, but frame buffer is not MMIO!\n");
return -ENODEV;
}
@@ -91,7 +109,7 @@
dev = (struct pcdp_device *) ((u8 *) dev + dev->length)) {
if (dev->flags & PCDP_PRIMARY_CONSOLE) {
if (dev->type = PCDP_CONSOLE_VGA) {
- return setup_vga_console((struct pcdp_vga *) dev);
+ return setup_vga_console(dev);
}
}
}
diff -Nru a/drivers/firmware/pcdp.h b/drivers/firmware/pcdp.h
--- a/drivers/firmware/pcdp.h 2005-04-22 11:06:27 -05:00
+++ b/drivers/firmware/pcdp.h 2005-04-22 11:06:27 -05:00
@@ -52,11 +52,34 @@
u32 clock_rate;
u8 pci_prog_intfc;
u8 flags;
-};
+} __attribute__((packed));
+
+#define PCDP_IF_PCI 1
+
+/* pcdp_if_pci.trans */
+#define PCDP_PCI_TRANS_IOPORT 0x02
+#define PCDP_PCI_TRANS_MMIO 0x01
+
+struct pcdp_if_pci {
+ u8 interconnect;
+ u8 reserved;
+ u16 length;
+ u8 segment;
+ u8 bus;
+ u8 dev;
+ u8 fun;
+ u16 dev_id;
+ u16 vendor_id;
+ u32 acpi_interrupt;
+ u64 mmio_tra;
+ u64 ioport_tra;
+ u8 flags;
+ u8 trans;
+} __attribute__((packed));
struct pcdp_vga {
u8 count; /* address space descriptors */
-};
+} __attribute__((packed));
/* pcdp_device.flags */
#define PCDP_PRIMARY_CONSOLE 1
@@ -66,7 +89,9 @@
u8 flags;
u16 length;
u16 efi_index;
-};
+ /* next data is pcdp_if_pci or pcdp_if_acpi (not yet supported) */
+ /* next data is device specific type (currently only pcdp_vga) */
+} __attribute__((packed));
struct pcdp {
u8 signature[4];
@@ -81,4 +106,4 @@
u32 num_uarts;
struct pcdp_uart uart[0]; /* actual size is num_uarts */
/* remainder of table is pcdp_device structures */
-};
+} __attribute__((packed));
diff -Nru a/include/asm-ia64/vga.h b/include/asm-ia64/vga.h
--- a/include/asm-ia64/vga.h 2005-04-22 11:06:27 -05:00
+++ b/include/asm-ia64/vga.h 2005-04-22 11:06:27 -05:00
@@ -11,10 +11,18 @@
/*
* On the PC, we can just recalculate addresses and then access the
- * videoram directly without any black magic.
+ * videoram directly without any black magic. If we're in a PCDP
+ * environment, add in the vga mmio offset supplied by the table.
*/
+#if defined(CONFIG_EFI_PCDP)
+extern unsigned long vga_console_iobase;
+extern unsigned long vga_console_membase;
+
+#define VGA_MAP_MEM(x) ((unsigned long) ioremap(vga_console_membase + (x), 0))
+#else
#define VGA_MAP_MEM(x) ((unsigned long) ioremap((x), 0))
+#endif
#define vga_readb(x) (*(x))
#define vga_writeb(x,y) (*(y) = (x))
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 2.6.12 1/1] pcdp: add PCDP pci interface support
2005-04-21 20:26 [PATCH 2.6.12 1/1] pcdp: add PCDP pci interface support Mark Maule
` (2 preceding siblings ...)
2005-04-23 18:00 ` Mark Maule
@ 2005-04-25 15:26 ` Bjorn Helgaas
2005-04-25 15:34 ` Mark Maule
` (2 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Bjorn Helgaas @ 2005-04-25 15:26 UTC (permalink / raw)
To: linux-ia64
On Saturday 23 April 2005 12:00 pm, Mark Maule wrote:
> Resend with changes per Bjorn Helgaas comments. Changes from original:
>
> + Change globals to vga_console_iobase/vga_console_membase.
> + Address style-related comments.
This looks good to me, except that I think we should remove the
EFI_PCDP references below. The idea of supporting multiple VGA
devices is completely orthogonal to the PCDP.
> +#ifdef CONFIG_EFI_PCDP
> +unsigned long vga_console_iobase;
> +unsigned long vga_console_membase;
> +#endif
> - * videoram directly without any black magic.
> + * videoram directly without any black magic. If we're in a PCDP
> + * environment, add in the vga mmio offset supplied by the table.
> */
>
> +#if defined(CONFIG_EFI_PCDP)
> +extern unsigned long vga_console_iobase;
> +extern unsigned long vga_console_membase;
> +
> +#define VGA_MAP_MEM(x) ((unsigned long) ioremap(vga_console_membase + (x), 0))
> +#else
> #define VGA_MAP_MEM(x) ((unsigned long) ioremap((x), 0))
> +#endif
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 2.6.12 1/1] pcdp: add PCDP pci interface support
2005-04-21 20:26 [PATCH 2.6.12 1/1] pcdp: add PCDP pci interface support Mark Maule
` (3 preceding siblings ...)
2005-04-25 15:26 ` Bjorn Helgaas
@ 2005-04-25 15:34 ` Mark Maule
2005-04-25 16:01 ` Bjorn Helgaas
2005-04-25 20:51 ` Mark Maule
6 siblings, 0 replies; 8+ messages in thread
From: Mark Maule @ 2005-04-25 15:34 UTC (permalink / raw)
To: linux-ia64
On Mon, 25 Apr 2005, Bjorn Helgaas wrote:
> On Saturday 23 April 2005 12:00 pm, Mark Maule wrote:
> > Resend with changes per Bjorn Helgaas comments. Changes from original:
> >
> > + Change globals to vga_console_iobase/vga_console_membase.
> > + Address style-related comments.
>
> This looks good to me, except that I think we should remove the
> EFI_PCDP references below. The idea of supporting multiple VGA
> devices is completely orthogonal to the PCDP.
Ok, so you suggest just making vga_console_membase/vga_console_iobase
unconditionally declared and used, and then optionally modified if
CONFIG_EFI_PCDP is defined?
thanks
Mark
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 2.6.12 1/1] pcdp: add PCDP pci interface support
2005-04-21 20:26 [PATCH 2.6.12 1/1] pcdp: add PCDP pci interface support Mark Maule
` (4 preceding siblings ...)
2005-04-25 15:34 ` Mark Maule
@ 2005-04-25 16:01 ` Bjorn Helgaas
2005-04-25 20:51 ` Mark Maule
6 siblings, 0 replies; 8+ messages in thread
From: Bjorn Helgaas @ 2005-04-25 16:01 UTC (permalink / raw)
To: linux-ia64
On Monday 25 April 2005 9:34 am, Mark Maule wrote:
> > This looks good to me, except that I think we should remove the
> > EFI_PCDP references below. The idea of supporting multiple VGA
> > devices is completely orthogonal to the PCDP.
>
> Ok, so you suggest just making vga_console_membase/vga_console_iobase
> unconditionally declared and used, and then optionally modified if
> CONFIG_EFI_PCDP is defined?
Yes.
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 2.6.12 1/1] pcdp: add PCDP pci interface support
2005-04-21 20:26 [PATCH 2.6.12 1/1] pcdp: add PCDP pci interface support Mark Maule
` (5 preceding siblings ...)
2005-04-25 16:01 ` Bjorn Helgaas
@ 2005-04-25 20:51 ` Mark Maule
6 siblings, 0 replies; 8+ messages in thread
From: Mark Maule @ 2005-04-25 20:51 UTC (permalink / raw)
To: linux-ia64
Resend 2 with changes per Bjorn Helgaas comments. Changes from original:
+ Change globals to vga_console_iobase/vga_console_membase and make them
unconditional.
+ Address style-related comments.
Patch to extend the PCDP vga setup code to support PCI io/mem translations
for the legacy vga ioport and ram spaces on architectures (e.g. altix) which
need them. Diffs were generated against the last available ia64 bk test tree.
Summary of the changes:
drivers/firmware/pcdp.c
drivers/firmware/pcdp.h
-----------------------
+ add declaration for the spec-defined PCI interface struct (pcdp_if_pci)
as well as support macros.
+ extend setup_vga_console() to know about pcdp_if_pci and add a couple of
globals to hold the io and mem translation offsets if present.
arch/ia64/kernel/setup.c
------------------------
+ tweek early_console_setup() to allow multiple early console setup routines
to be called.
include/asm-ia64/vga.h
----------------------
+ make VGA_MAP_MEM vga_console_membase asware
Signed-off-by: Mark Maule <maule@sgi.com>
diff -Nru a/arch/ia64/kernel/setup.c b/arch/ia64/kernel/setup.c
--- a/arch/ia64/kernel/setup.c 2005-04-25 15:47:41 -05:00
+++ b/arch/ia64/kernel/setup.c 2005-04-25 15:47:41 -05:00
@@ -72,6 +72,8 @@
unsigned long ia64_cycles_per_usec;
struct ia64_boot_param *ia64_boot_param;
struct screen_info screen_info;
+unsigned long vga_console_iobase;
+unsigned long vga_console_membase;
unsigned long ia64_max_cacheline_size;
unsigned long ia64_iobase; /* virtual address for I/O accesses */
@@ -273,23 +275,25 @@
static inline int __init
early_console_setup (char *cmdline)
{
+ int earlycons = 0;
+
#ifdef CONFIG_SERIAL_SGI_L1_CONSOLE
{
extern int sn_serial_console_early_setup(void);
if (!sn_serial_console_early_setup())
- return 0;
+ earlycons++;
}
#endif
#ifdef CONFIG_EFI_PCDP
if (!efi_setup_pcdp_console(cmdline))
- return 0;
+ earlycons++;
#endif
#ifdef CONFIG_SERIAL_8250_CONSOLE
if (!early_serial_console_init(cmdline))
- return 0;
+ earlycons++;
#endif
- return -1;
+ return (earlycons) ? 0 : -1;
}
static inline void
diff -Nru a/drivers/firmware/pcdp.c b/drivers/firmware/pcdp.c
--- a/drivers/firmware/pcdp.c 2005-04-25 15:47:41 -05:00
+++ b/drivers/firmware/pcdp.c 2005-04-25 15:47:41 -05:00
@@ -15,6 +15,7 @@
#include <linux/console.h>
#include <linux/efi.h>
#include <linux/serial.h>
+#include <asm/vga.h>
#include "pcdp.h"
static int __init
@@ -36,10 +37,27 @@
}
static int __init
-setup_vga_console(struct pcdp_vga *vga)
+setup_vga_console(struct pcdp_device *dev)
{
#if defined(CONFIG_VT) && defined(CONFIG_VGA_CONSOLE)
- if (efi_mem_type(0xA0000) = EFI_CONVENTIONAL_MEMORY) {
+ u8 *if_ptr;
+
+ if_ptr = ((u8 *)dev + sizeof(struct pcdp_device));
+ if (if_ptr[0] = PCDP_IF_PCI) {
+ struct pcdp_if_pci if_pci;
+
+ /* struct copy since ifptr might not be correctly aligned */
+
+ memcpy(&if_pci, if_ptr, sizeof(if_pci));
+
+ if (if_pci.trans & PCDP_PCI_TRANS_IOPORT)
+ vga_console_iobase = if_pci.ioport_tra;
+
+ if (if_pci.trans & PCDP_PCI_TRANS_MMIO)
+ vga_console_membase = if_pci.mmio_tra;
+ }
+
+ if (efi_mem_type(vga_console_membase + 0xA0000) = EFI_CONVENTIONAL_MEMORY) {
printk(KERN_ERR "PCDP: VGA selected, but frame buffer is not MMIO!\n");
return -ENODEV;
}
@@ -91,7 +109,7 @@
dev = (struct pcdp_device *) ((u8 *) dev + dev->length)) {
if (dev->flags & PCDP_PRIMARY_CONSOLE) {
if (dev->type = PCDP_CONSOLE_VGA) {
- return setup_vga_console((struct pcdp_vga *) dev);
+ return setup_vga_console(dev);
}
}
}
diff -Nru a/drivers/firmware/pcdp.h b/drivers/firmware/pcdp.h
--- a/drivers/firmware/pcdp.h 2005-04-25 15:47:41 -05:00
+++ b/drivers/firmware/pcdp.h 2005-04-25 15:47:41 -05:00
@@ -52,11 +52,34 @@
u32 clock_rate;
u8 pci_prog_intfc;
u8 flags;
-};
+} __attribute__((packed));
+
+#define PCDP_IF_PCI 1
+
+/* pcdp_if_pci.trans */
+#define PCDP_PCI_TRANS_IOPORT 0x02
+#define PCDP_PCI_TRANS_MMIO 0x01
+
+struct pcdp_if_pci {
+ u8 interconnect;
+ u8 reserved;
+ u16 length;
+ u8 segment;
+ u8 bus;
+ u8 dev;
+ u8 fun;
+ u16 dev_id;
+ u16 vendor_id;
+ u32 acpi_interrupt;
+ u64 mmio_tra;
+ u64 ioport_tra;
+ u8 flags;
+ u8 trans;
+} __attribute__((packed));
struct pcdp_vga {
u8 count; /* address space descriptors */
-};
+} __attribute__((packed));
/* pcdp_device.flags */
#define PCDP_PRIMARY_CONSOLE 1
@@ -66,7 +89,9 @@
u8 flags;
u16 length;
u16 efi_index;
-};
+ /* next data is pcdp_if_pci or pcdp_if_acpi (not yet supported) */
+ /* next data is device specific type (currently only pcdp_vga) */
+} __attribute__((packed));
struct pcdp {
u8 signature[4];
@@ -81,4 +106,4 @@
u32 num_uarts;
struct pcdp_uart uart[0]; /* actual size is num_uarts */
/* remainder of table is pcdp_device structures */
-};
+} __attribute__((packed));
diff -Nru a/include/asm-ia64/vga.h b/include/asm-ia64/vga.h
--- a/include/asm-ia64/vga.h 2005-04-25 15:47:41 -05:00
+++ b/include/asm-ia64/vga.h 2005-04-25 15:47:41 -05:00
@@ -14,7 +14,10 @@
* videoram directly without any black magic.
*/
-#define VGA_MAP_MEM(x) ((unsigned long) ioremap((x), 0))
+extern unsigned long vga_console_iobase;
+extern unsigned long vga_console_membase;
+
+#define VGA_MAP_MEM(x) ((unsigned long) ioremap(vga_console_membase + (x), 0))
#define vga_readb(x) (*(x))
#define vga_writeb(x,y) (*(y) = (x))
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2005-04-25 20:51 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-04-21 20:26 [PATCH 2.6.12 1/1] pcdp: add PCDP pci interface support Mark Maule
2005-04-21 21:41 ` Bjorn Helgaas
2005-04-21 22:05 ` Mark Maule
2005-04-23 18:00 ` Mark Maule
2005-04-25 15:26 ` Bjorn Helgaas
2005-04-25 15:34 ` Mark Maule
2005-04-25 16:01 ` Bjorn Helgaas
2005-04-25 20:51 ` Mark Maule
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox