On 22/08/12(Wed) 21:18, Mark Kettenis wrote:
> > On 21/08/12(Tue) 20:58, Mark Kettenis wrote:
> > > > Date: Tue, 21 Aug 2012 19:17:08 +0200
> > > > From: Martin Pieuchot <[email protected]>
> > > >
> > > > Diff below is mostly a rewrite of vgafb_pci_probe() to determine the
> > > > memory and mmio regions based on previously initialized BAR structures.
> > > > But it also includes the glue to attach drm(4) to vgafb(4).
> > > >
> > > > It reuses the following functions from vga(4), the last three are
> > > > required by any drm(4) driver:
> > > > - vga_pci_bar_init()
> > > > - vga_pci_bar_info()
> > > > - vga_pci_bar_map()
> > > > - vga_pci_bar_unmap()
> > >
> > > Looks like by "reuses" you mean "copies". That tends to be a bad idea
> > > since results in diverging code. WOuldn't it be better to split out
> > > these functions into their own file (vga_pci_common.c) and share them
> > > between vga(4) and vgafb(4)?
> >
> > Sure, here's a diff that does only this, tested on i386 and macppc.
> > I used Owain's copyright because he is the one who commited this code.
> >
> > Ok?
>
> Go for it.
>
> (If it wasn't obvious yet, I intend to use this code on sparc64 as well)
And now the vgafb(4) part which includes two renames to keep the MD
structures:
vgafb_pci_softc -> vga_pci_softc
vgafb_config -> vga_config
I kept your suggestion for the agp cdev declaration.
Ok?
Martin
Index: dev/pci/files.pci
===================================================================
RCS file: /cvs/src/sys/dev/pci/files.pci,v
retrieving revision 1.286
diff -u -p -r1.286 files.pci
--- dev/pci/files.pci 22 Aug 2012 20:58:30 -0000 1.286
+++ dev/pci/files.pci 22 Aug 2012 22:03:02 -0000
@@ -15,7 +15,7 @@ file dev/pci/pci_subr.c pci
# Generic VGA
attach vga at pci with vga_pci
file dev/pci/vga_pci.c vga_pci
-file dev/pci/vga_pci_common.c vga_pci
+file dev/pci/vga_pci_common.c vga_pci | vgafb
device tga: wsemuldisplaydev, rasops8, rasops32
attach tga at pci
Index: arch/macppc/macppc/conf.c
===================================================================
RCS file: /cvs/src/sys/arch/macppc/macppc/conf.c,v
retrieving revision 1.47
diff -u -p -r1.47 conf.c
--- arch/macppc/macppc/conf.c 6 Apr 2012 15:10:40 -0000 1.47
+++ arch/macppc/macppc/conf.c 22 Aug 2012 22:04:39 -0000
@@ -119,6 +119,8 @@ cdev_decl(nnpfs_dev);
#include "apm.h"
#include "bthub.h"
+#include "drm.h"
+cdev_decl(drm);
#include "wsmux.h"
@@ -243,6 +245,8 @@ struct cdevsw cdevsw[] = {
cdev_vscsi_init(NVSCSI,vscsi), /* 83: vscsi */
cdev_disk_init(1,diskmap), /* 84: disk mapper */
cdev_pppx_init(NPPPX,pppx), /* 85: pppx */
+ cdev_notdef(), /* 86: agp */
+ cdev_drm_init(NDRM,drm), /* 87: drm */
};
int nchrdev = nitems(cdevsw);
Index: arch/macppc/pci/vgafb.c
===================================================================
RCS file: /cvs/src/sys/arch/macppc/pci/vgafb.c,v
retrieving revision 1.40
diff -u -p -r1.40 vgafb.c
--- arch/macppc/pci/vgafb.c 21 Jun 2012 10:08:16 -0000 1.40
+++ arch/macppc/pci/vgafb.c 22 Aug 2012 11:29:56 -0000
@@ -53,16 +53,16 @@ struct cfdriver vgafb_cd = {
NULL, "vgafb", DV_DULL,
};
-void vgafb_setcolor(struct vgafb_config *vc, unsigned int index,
+void vgafb_setcolor(struct vga_config *vc, unsigned int index,
u_int8_t r, u_int8_t g, u_int8_t b);
-void vgafb_restore_default_colors(struct vgafb_config *vc);
+void vgafb_restore_default_colors(struct vga_config *vc);
struct vgafb_devconfig {
struct rasops_info dc_rinfo; /* raster display data */
int dc_blanked; /* currently had video disabled */
};
-extern struct vgafb_config vgafb_pci_console_vc;
+extern struct vga_config vgafb_pci_console_vc;
struct vgafb_devconfig vgafb_console_dc;
struct wsscreen_descr vgafb_stdscreen = {
@@ -94,8 +94,8 @@ struct wsdisplay_accessops vgafb_accesso
vgafb_burn, /* burner */
};
-int vgafb_getcmap(struct vgafb_config *vc, struct wsdisplay_cmap *cm);
-int vgafb_putcmap(struct vgafb_config *vc, struct wsdisplay_cmap *cm);
+int vgafb_getcmap(struct vga_config *vc, struct wsdisplay_cmap *cm);
+int vgafb_putcmap(struct vga_config *vc, struct wsdisplay_cmap *cm);
#define FONT_WIDTH 8
#define FONT_HEIGHT 16
@@ -106,7 +106,7 @@ extern int allowaperture;
void
-vgafb_init(bus_space_tag_t iot, bus_space_tag_t memt, struct vgafb_config *vc,
+vgafb_init(bus_space_tag_t iot, bus_space_tag_t memt, struct vga_config *vc,
u_int32_t membase, size_t memsize, u_int32_t mmiobase, size_t mmiosize)
{
vc->vc_iot = iot;
@@ -140,7 +140,7 @@ vgafb_init(bus_space_tag_t iot, bus_spac
}
void
-vgafb_restore_default_colors(struct vgafb_config *vc)
+vgafb_restore_default_colors(struct vga_config *vc)
{
int i;
@@ -153,7 +153,7 @@ vgafb_restore_default_colors(struct vgaf
}
void
-vgafb_wsdisplay_attach(struct device *parent, struct vgafb_config *vc,
+vgafb_wsdisplay_attach(struct device *parent, struct vga_config *vc,
int console)
{
struct wsemuldisplaydev_attach_args aa;
@@ -178,7 +178,7 @@ vgafb_wsdisplay_attach(struct device *pa
int
vgafb_ioctl(void *v, u_long cmd, caddr_t data, int flag, struct proc *p)
{
- struct vgafb_config *vc = v;
+ struct vga_config *vc = v;
struct wsdisplay_fbinfo *wdf;
switch (cmd) {
@@ -282,7 +282,7 @@ vgafb_ioctl(void *v, u_long cmd, caddr_t
paddr_t
vgafb_mmap(void *v, off_t off, int prot)
{
- struct vgafb_config *vc = v;
+ struct vga_config *vc = v;
if (off & PGOFSET)
return (-1);
@@ -317,7 +317,7 @@ vgafb_mmap(void *v, off_t off, int prot)
int
vgafb_cnattach(bus_space_tag_t iot, bus_space_tag_t memt, int type, int check)
{
- struct vgafb_config *vc = &vgafb_pci_console_vc;
+ struct vga_config *vc = &vgafb_pci_console_vc;
struct vgafb_devconfig *dc = &vgafb_console_dc;
struct rasops_info *ri = &dc->dc_rinfo;
long defattr;
@@ -358,7 +358,7 @@ struct {
} vgafb_color[256];
void
-vgafb_setcolor(struct vgafb_config *vc, unsigned int index, u_int8_t r,
+vgafb_setcolor(struct vga_config *vc, unsigned int index, u_int8_t r,
u_int8_t g, u_int8_t b)
{
vc->vc_cmap_red[index] = r;
@@ -373,7 +373,7 @@ vgafb_setcolor(struct vgafb_config *vc,
}
int
-vgafb_getcmap(struct vgafb_config *vc, struct wsdisplay_cmap *cm)
+vgafb_getcmap(struct vga_config *vc, struct wsdisplay_cmap *cm)
{
u_int index = cm->index;
u_int count = cm->count;
@@ -396,7 +396,7 @@ vgafb_getcmap(struct vgafb_config *vc, s
}
int
-vgafb_putcmap(struct vgafb_config *vc, struct wsdisplay_cmap *cm)
+vgafb_putcmap(struct vga_config *vc, struct wsdisplay_cmap *cm)
{
u_int index = cm->index;
u_int count = cm->count;
@@ -432,7 +432,7 @@ vgafb_putcmap(struct vgafb_config *vc, s
void
vgafb_burn(void *v, u_int on, u_int flags)
{
- struct vgafb_config *vc = v;
+ struct vga_config *vc = v;
if (cons_backlight_available == 1 &&
vc->vc_backlight_on != on) {
@@ -449,7 +449,7 @@ int
vgafb_alloc_screen(void *v, const struct wsscreen_descr *type, void **cookiep,
int *curxp, int *curyp, long *attrp)
{
- struct vgafb_config *vc = v;
+ struct vga_config *vc = v;
long defattr;
if (vc->nscreens > 0)
@@ -469,7 +469,7 @@ vgafb_alloc_screen(void *v, const struct
void
vgafb_free_screen(void *v, void *cookie)
{
- struct vgafb_config *vc = v;
+ struct vga_config *vc = v;
if (vc == &vgafb_pci_console_vc)
panic("vgafb_free_screen: console");
Index: arch/macppc/pci/vgafb_pci.c
===================================================================
RCS file: /cvs/src/sys/arch/macppc/pci/vgafb_pci.c,v
retrieving revision 1.25
diff -u -p -r1.25 vgafb_pci.c
--- arch/macppc/pci/vgafb_pci.c 21 Jun 2012 10:08:16 -0000 1.25
+++ arch/macppc/pci/vgafb_pci.c 22 Aug 2012 12:21:20 -0000
@@ -47,175 +47,101 @@
#include <dev/rasops/rasops.h>
#include <dev/wsfont/wsfont.h>
+#include "drm.h"
+
#include <arch/macppc/pci/vgafbvar.h>
-#include <arch/macppc/pci/vgafb_pcivar.h>
+#include <dev/pci/vga_pcivar.h>
-#define PCI_VENDORID(x) ((x) & 0xFFFF)
-#define PCI_CHIPID(x) (((x) >> 16) & 0xFFFF)
+#define DEBUG_VGAFB
-struct vgafb_pci_softc {
- struct device sc_dev;
-
- pcitag_t sc_pcitag; /* PCI tag, in case we need it. */
- struct vgafb_config *sc_vc; /* VGA configuration */
-};
+#ifdef DEBUG_VGAFB
+#define DPRINTF(x...) do { printf(x); } while (0);
+#else
+#define DPRINTF(x...)
+#endif
-int vgafb_pci_probe(struct pci_attach_args *pa, int id, u_int32_t *ioaddr,
- u_int32_t *iosize, u_int32_t *memaddr, u_int32_t *memsize,
- u_int32_t *cacheable, u_int32_t *mmioaddr, u_int32_t *mmiosize);
int vgafb_pci_match(struct device *, void *, void *);
void vgafb_pci_attach(struct device *, struct device *, void *);
+void vgafb_pci_mem_init(struct vga_pci_softc *, uint32_t *, uint32_t *,
+ uint32_t *, uint32_t *);
+
struct cfattach vgafb_pci_ca = {
- sizeof(struct vgafb_pci_softc), (cfmatch_t)vgafb_pci_match,
vgafb_pci_attach,
+ sizeof(struct vga_pci_softc), (cfmatch_t)vgafb_pci_match,
vgafb_pci_attach,
};
pcitag_t vgafb_pci_console_tag;
-struct vgafb_config vgafb_pci_console_vc;
+struct vga_config vgafb_pci_console_vc;
-#if 0
-#define DEBUG_VGAFB
-#endif
-
-int
-vgafb_pci_probe(struct pci_attach_args *pa, int id, u_int32_t *ioaddr,
- u_int32_t *iosize, u_int32_t *memaddr, u_int32_t *memsize,
- u_int32_t *cacheable, u_int32_t *mmioaddr, u_int32_t *mmiosize)
+void
+vgafb_pci_mem_init(struct vga_pci_softc *dev, uint32_t *memaddr,
+ uint32_t *memsize, uint32_t *mmioaddr, uint32_t *mmiosize)
{
- bus_addr_t addr;
- bus_size_t size;
- int tcacheable;
- pci_chipset_tag_t pc = pa->pa_pc;
- int retval;
+ struct vga_pci_bar *bar;
int i;
- *iosize = 0x0;
*memsize = 0x0;
*mmiosize = 0x0;
- for (i = PCI_MAPREG_START; i <= PCI_MAPREG_PPB_END; i += 4) {
-#ifdef DEBUG_VGAFB
- printf("vgafb confread %x %x\n",
- i, pci_conf_read(pc, pa->pa_tag, i));
-#endif
- /* need to check more than just two base addresses? */
- if (PCI_MAPREG_TYPE(pci_conf_read(pc, pa->pa_tag, i)) ==
- PCI_MAPREG_TYPE_IO) {
- retval = pci_io_find(pc, pa->pa_tag, i,
- &addr, &size);
- if (retval != 0) {
- continue;
- }
-#ifdef DEBUG_VGAFB
- printf("vgafb_pci_probe: io %x addr %x size %x\n", i, addr, size);
-#endif
- if (*iosize == 0) {
- *ioaddr = addr;
- *iosize = size;
- }
- } else {
- retval = pci_mem_find(pc, pa->pa_tag, i,
- &addr, &size, &tcacheable);
- if (retval != 0) {
- continue;
- }
-#ifdef DEBUG_VGAFB
- printf("vgafb_pci_probe: mem %x addr %x size %x\n", i, addr, size);
-#endif
- if (size == 0 || addr == 0) {
+ for (i = 0; i < VGA_PCI_MAX_BARS; i++) {
+ bar = dev->bars[i];
+ if (bar == NULL)
+ continue;
+
+ DPRINTF("\nvgafb: 0x%04x: BAR ", bar->addr);
+
+ switch (PCI_MAPREG_TYPE(bar->maptype)) {
+ case PCI_MAPREG_TYPE_IO:
+ DPRINTF("io ");
+ break;
+ case PCI_MAPREG_TYPE_MEM:
+ if (bar->base == 0 || bar->maxsize == 0) {
/* ignore this entry */
} else if (*memsize == 0) {
/*
* first memory slot found goes into memory,
* this is for the case of no mmio
*/
- *memaddr = addr;
- *memsize = size;
- *cacheable = tcacheable;
+ *memaddr = bar->base;
+ *memsize = bar->maxsize;
} else {
/*
- * Oh, we have a second 'memory'
+ * Oh, we have a second 'memory'
* region, is this region the vga memory
* or mmio, we guess that memory is
* the larger of the two.
- */
- if (*memaddr >= size) {
+ */
+ if (*memsize >= bar->maxsize) {
/* this is the mmio */
- *mmioaddr = addr;
- /* ATI driver maps 0x80000 mmio, grr */
- if (size < 0x80000) {
- size = 0x80000;
- }
- *mmiosize = size;
+ *mmioaddr = bar->base;
+ *mmiosize = bar->maxsize;
} else {
/* this is the memory */
*mmioaddr = *memaddr;
- *memaddr = addr;
*mmiosize = *memsize;
- *memsize = size;
- *cacheable = tcacheable;
- /* ATI driver maps 0x80000 mmio, grr */
- if (*mmiosize < 0x80000) {
- *mmiosize = 0x80000;
- }
+ *memaddr = bar->base;
+ *memsize = bar->maxsize;
}
}
+ DPRINTF("mem ");
+ break;
}
- }
-#ifdef DEBUG_VGAFB
- printf("vgafb_pci_probe: id %x ioaddr %x, iosize %x, memaddr %x,\n
memsize %x, mmioaddr %x, mmiosize %x\n",
- id, *ioaddr, *iosize, *memaddr, *memsize, *mmioaddr, *mmiosize);
-#endif
- if (*iosize == 0) {
- if (id == 0) {
-#ifdef powerpc
- /* this is only used if on openfirmware system and
- * the device does not have a iobase config register,
- * eg CirrusLogic 5434 VGA. (they hardcode iobase to 0
- * thus giving standard PC addresses for the registers)
- */
- int s;
- u_int32_t sizedata;
-
- /*
- * Open Firmware (yuck) shuts down devices before
- * entering a program so we need to bring them back
- * 'online' to respond to bus accesses... so far
- * this is true on the power.4e.
- */
- s = splhigh();
- sizedata = pci_conf_read(pc, pa->pa_tag,
- PCI_COMMAND_STATUS_REG);
- sizedata |= (PCI_COMMAND_MASTER_ENABLE |
- PCI_COMMAND_IO_ENABLE |
- PCI_COMMAND_PARITY_ENABLE |
- PCI_COMMAND_SERR_ENABLE);
- pci_conf_write(pc, pa->pa_tag, PCI_COMMAND_STATUS_REG,
- sizedata);
- splx(s);
-#endif
- /* if this is the first card, allow it
- * to be accessed in vga iospace
- */
- *ioaddr = 0;
- *iosize = 0x10000; /* 64k, good as any */
+ if (bar->maptype == PCI_MAPREG_MEM_TYPE_64BIT) {
+ DPRINTF("64bit");
+ i++;
} else {
- /* iospace not available, assume 640x480, pray */
- *ioaddr = 0;
- *iosize = 0;
+ DPRINTF("addr: 0x%08x/0x%08x", bar->base, bar->maxsize);
}
}
-#ifdef DEBUG_VGAFB
- printf("vgafb_pci_probe: id %x ioaddr %x, iosize %x, memaddr %x,\n
memsize %x, mmioaddr %x, mmiosize %x\n",
- id, *ioaddr, *iosize, *memaddr, *memsize, *mmioaddr, *mmiosize);
-#endif
-
- /* io and mmio spaces are not required to attach */
- if (/* *iosize == 0 || */ *memsize == 0 /* || *mmiosize == 0 */)
- return (0);
- return (1);
+ /* ATI driver maps 0x80000 mmio, grr */
+ if (*mmiosize > 0 && *mmiosize < 0x80000) {
+ *mmiosize = 0x80000;
+ }
+
+ DPRINTF("\nvgafb: memaddr %x, memsize %x, mmioaddr %x, mmiosize %x",
+ *memaddr, *memsize, *mmioaddr, *mmiosize);
}
int
@@ -249,32 +175,37 @@ void
vgafb_pci_attach(struct device *parent, struct device *self, void *aux)
{
struct pci_attach_args *pa = aux;
- struct vgafb_pci_softc *sc = (struct vgafb_pci_softc *)self;
- struct vgafb_config *vc;
- u_int32_t memaddr, memsize, cacheable;
- u_int32_t ioaddr, iosize;
+ struct vga_pci_softc *sc = (struct vga_pci_softc *)self;
+ struct vga_config *vc;
+ u_int32_t memaddr, memsize;
u_int32_t mmioaddr, mmiosize;
int console;
- static int id = 0;
- int myid;
+ pcireg_t reg;
- myid = id;
- vgafb_pci_probe(pa, myid, &ioaddr, &iosize,
- &memaddr, &memsize, &cacheable, &mmioaddr, &mmiosize);
+ vga_pci_bar_init(sc, pa);
+ vgafb_pci_mem_init(sc, &memaddr, &memsize, &mmioaddr, &mmiosize);
console = (!bcmp(&pa->pa_tag, &vgafb_pci_console_tag,
sizeof(pa->pa_tag)));
if (console)
vc = sc->sc_vc = &vgafb_pci_console_vc;
else {
- vc = sc->sc_vc = (struct vgafb_config *)
- malloc(sizeof(struct vgafb_config), M_DEVBUF, M_WAITOK);
+ vc = sc->sc_vc = (struct vga_config *)
+ malloc(sizeof(struct vga_config), M_DEVBUF, M_WAITOK);
/* set up bus-independent VGA configuration */
vgafb_init(pa->pa_iot, pa->pa_memt, vc,
memaddr, memsize, mmioaddr, mmiosize);
}
+
+ /*
+ * Enable bus master; X might need this for accelerated graphics.
+ */
+ reg = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG);
+ reg |= PCI_COMMAND_MASTER_ENABLE;
+ pci_conf_write(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG, reg);
+
vc->vc_mmap = vgafb_mmap;
vc->vc_ioctl = vgafb_ioctl;
vc->membase = memaddr;
@@ -282,16 +213,14 @@ vgafb_pci_attach(struct device *parent,
vc->mmiobase = mmioaddr;
vc->mmiosize = mmiosize;
- sc->sc_pcitag = pa->pa_tag;
-
- if (iosize == 0)
- printf (", no io");
-
if (mmiosize != 0)
printf (", mmio");
printf("\n");
vgafb_wsdisplay_attach(self, vc, console);
- id++;
+
+#if NDRM > 0
+ config_found_sm(self, aux, NULL, drmsubmatch);
+#endif
}
Index: arch/macppc/pci/vgafbvar.h
===================================================================
RCS file: /cvs/src/sys/arch/macppc/pci/vgafbvar.h,v
retrieving revision 1.14
diff -u -p -r1.14 vgafbvar.h
--- arch/macppc/pci/vgafbvar.h 21 Jun 2012 10:08:16 -0000 1.14
+++ arch/macppc/pci/vgafbvar.h 22 Aug 2012 11:39:04 -0000
@@ -28,7 +28,7 @@
* rights to redistribute these changes.
*/
-struct vgafb_config {
+struct vga_config {
/*
* Filled in by front-ends.
*/
@@ -68,12 +68,11 @@ struct vgafb_config {
};
void vgafb_init(bus_space_tag_t, bus_space_tag_t,
- struct vgafb_config *, u_int32_t, size_t, u_int32_t, size_t);
-void vgafb_wscons_attach(struct device *, struct vgafb_config *, int);
-void vgafb_wscons_console(struct vgafb_config *);
+ struct vga_config *, u_int32_t, size_t, u_int32_t, size_t);
+void vgafb_wscons_attach(struct device *, struct vga_config *, int);
+void vgafb_wscons_console(struct vga_config *);
int vgafb_cnattach(bus_space_tag_t, bus_space_tag_t, int, int);
-void vgafb_wsdisplay_attach(struct device *parent,
- struct vgafb_config *vc, int console);
+void vgafb_wsdisplay_attach(struct device *, struct vga_config *, int);
int vgafbioctl(void *, u_long, caddr_t, int, struct proc *);
paddr_t vgafbmmap(void *, off_t, int);
int vgafb_ioctl(void *, u_long, caddr_t, int, struct proc *);