Module Name: src Committed By: jmcneill Date: Sun Sep 27 12:39:05 UTC 2009
Modified Files: src/sys/external/bsd/drm/dist/bsd-core: via_drv.c src/sys/external/bsd/drm/dist/shared-core: via_dma.c via_drv.c via_drv.h via_ds.c via_irq.c via_map.c via_mm.c via_verifier.c Log Message: Port viadrm to NetBSD and fix a bunch of compile issues: viadrm0 at vga1: VIA P4M900 / VN896 viadrm0: AGP at 0xf0000000 128MB viadrm0: Initialized via 2.11.1 20070202 xf86-video-openchrome seems happy with it, although 3d acceleration isn't supported on the P4M900 so I can't test that part. To generate a diff of this commit: cvs rdiff -u -r1.3 -r1.4 src/sys/external/bsd/drm/dist/bsd-core/via_drv.c cvs rdiff -u -r1.1.1.1 -r1.2 \ src/sys/external/bsd/drm/dist/shared-core/via_dma.c \ src/sys/external/bsd/drm/dist/shared-core/via_drv.c \ src/sys/external/bsd/drm/dist/shared-core/via_drv.h \ src/sys/external/bsd/drm/dist/shared-core/via_ds.c \ src/sys/external/bsd/drm/dist/shared-core/via_mm.c \ src/sys/external/bsd/drm/dist/shared-core/via_verifier.c cvs rdiff -u -r1.1.1.2 -r1.2 \ src/sys/external/bsd/drm/dist/shared-core/via_irq.c \ src/sys/external/bsd/drm/dist/shared-core/via_map.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/external/bsd/drm/dist/bsd-core/via_drv.c diff -u src/sys/external/bsd/drm/dist/bsd-core/via_drv.c:1.3 src/sys/external/bsd/drm/dist/bsd-core/via_drv.c:1.4 --- src/sys/external/bsd/drm/dist/bsd-core/via_drv.c:1.3 Fri Jun 19 03:50:03 2009 +++ src/sys/external/bsd/drm/dist/bsd-core/via_drv.c Sun Sep 27 12:39:04 2009 @@ -63,12 +63,13 @@ dev->driver->name = DRIVER_NAME; dev->driver->desc = DRIVER_DESC; - dev->driver->date = DRIVER_DATE; - dev->driver->major = DRIVER_MAJOR; - dev->driver->minor = DRIVER_MINOR; - dev->driver->patchlevel = DRIVER_PATCHLEVEL; + dev->driver->date = VIA_DRM_DRIVER_DATE; + dev->driver->major = VIA_DRM_DRIVER_MAJOR; + dev->driver->minor = VIA_DRM_DRIVER_MINOR; + dev->driver->patchlevel = VIA_DRM_DRIVER_PATCHLEVEL; } +#if defined(__FreeBSD__) static int via_probe(device_t kdev) { @@ -119,3 +120,89 @@ extern devclass_t drm_devclass; DRIVER_MODULE(via, pci, via_driver, drm_devclass, 0, 0); MODULE_DEPEND(via, drm, 1, 1, 1); + +#elif defined(__NetBSD__) + +static int +viadrm_probe(device_t parent, cfdata_t match, void *aux) +{ + struct pci_attach_args *pa = aux; + return drm_probe(pa, via_pciidlist); +} + +static void +viadrm_attach(device_t parent, device_t self, void *aux) +{ + struct pci_attach_args *pa = aux; + struct drm_device *dev = device_private(self); + + dev->driver = malloc(sizeof(struct drm_driver_info), DRM_MEM_DRIVER, + M_WAITOK | M_ZERO); + + via_configure(dev); + + drm_attach(self, pa, via_pciidlist); +} + +CFATTACH_DECL_NEW(viadrm, sizeof(struct drm_device), + viadrm_probe, viadrm_attach, drm_detach, drm_activate); + +#ifdef _MODULE + +MODULE(MODULE_CLASS_DRIVER, viadrm, NULL); + +CFDRIVER_DECL(viadrm, DV_DULL, NULL); +extern struct cfattach viadrm_ca; +static int drmloc[] = { -1 }; +static struct cfparent drmparent = { + "drm", "vga", DVUNIT_ANY +}; +static struct cfdata viadrm_cfdata[] = { + { + .cf_name = "viadrm", + .cf_atname = "viadrm", + .cf_unit = 0, + .cf_fstate = FSTATE_STAR, + .cf_loc = drmloc, + .cf_flags = 0, + .cf_pspec = &drmparent, + }, + { NULL } +}; + +static int +viadrm_modcmd(modcmd_t cmd, void *arg) +{ + int err; + + switch (cmd) { + case MODULE_CMD_INIT: + err = config_cfdriver_attach(&viadrm_cd); + if (err) + return err; + err = config_cfattach_attach("viadrm", &viadrm_ca); + if (err) { + config_cfdriver_detach(&viadrm_cd); + return err; + } + err = config_cfdata_attach(viadrm_cfdata, 1); + if (err) { + config_cfattach_detach("viadrm", &viadrm_ca); + config_cfdriver_detach(&viadrm_cd); + return err; + } + return 0; + case MODULE_CMD_FINI: + err = config_cfdata_detach(viadrm_cfdata); + if (err) + return err; + config_cfattach_detach("viadrm", &viadrm_ca); + config_cfdriver_detach(&viadrm_cd); + return 0; + default: + return ENOTTY; + } +} +#endif /* _MODULE */ + +#endif Index: src/sys/external/bsd/drm/dist/shared-core/via_dma.c diff -u src/sys/external/bsd/drm/dist/shared-core/via_dma.c:1.1.1.1 src/sys/external/bsd/drm/dist/shared-core/via_dma.c:1.2 --- src/sys/external/bsd/drm/dist/shared-core/via_dma.c:1.1.1.1 Sat Jul 19 05:30:50 2008 +++ src/sys/external/bsd/drm/dist/shared-core/via_dma.c Sun Sep 27 12:39:05 2009 @@ -114,7 +114,7 @@ return -1; } if ((cur_addr < hw_addr) && (next_addr >= hw_addr)) - msleep(1); + delay(1000); } while ((cur_addr < hw_addr) && (next_addr >= hw_addr)); return 0; } Index: src/sys/external/bsd/drm/dist/shared-core/via_drv.c diff -u src/sys/external/bsd/drm/dist/shared-core/via_drv.c:1.1.1.1 src/sys/external/bsd/drm/dist/shared-core/via_drv.c:1.2 --- src/sys/external/bsd/drm/dist/shared-core/via_drv.c:1.1.1.1 Sat Jul 19 05:30:50 2008 +++ src/sys/external/bsd/drm/dist/shared-core/via_drv.c Sun Sep 27 12:39:05 2009 @@ -60,8 +60,8 @@ static struct drm_bo_driver via_bo_driver = { .mem_type_prio = via_mem_prios, .mem_busy_prio = via_busy_prios, - .num_mem_type_prio = ARRAY_SIZE(via_mem_prios), - .num_mem_busy_prio = ARRAY_SIZE(via_busy_prios), + .num_mem_type_prio = DRM_ARRAY_SIZE(via_mem_prios), + .num_mem_busy_prio = DRM_ARRAY_SIZE(via_busy_prios), .create_ttm_backend_entry = via_create_ttm_backend_entry, .fence_type = via_fence_types, .invalidate_caches = via_invalidate_caches, Index: src/sys/external/bsd/drm/dist/shared-core/via_drv.h diff -u src/sys/external/bsd/drm/dist/shared-core/via_drv.h:1.1.1.1 src/sys/external/bsd/drm/dist/shared-core/via_drv.h:1.2 --- src/sys/external/bsd/drm/dist/shared-core/via_drv.h:1.1.1.1 Sat Jul 19 05:30:50 2008 +++ src/sys/external/bsd/drm/dist/shared-core/via_drv.h Sun Sep 27 12:39:05 2009 @@ -24,7 +24,9 @@ #ifndef _VIA_DRV_H_ #define _VIA_DRV_H_ +#ifdef VIA_HAVE_CORE_MM #include "drm_sman.h" +#endif #define DRIVER_AUTHOR "Various" #define DRIVER_NAME "via" @@ -51,7 +53,63 @@ #define VIA_3D_ENG_BUSY 0x00000002 /* 3D Engine is busy */ #define VIA_VR_QUEUE_BUSY 0x00020000 /* Virtual Queue is busy */ +#if defined(__NetBSD__) +/* + * PCI DMA Registers + * Channels 2 & 3 don't seem to be implemented in hardware. + */ +#define VIA_PCI_DMA_MAR0 0xE40 /* Memory Address Register of Channel 0 */ +#define VIA_PCI_DMA_DAR0 0xE44 /* Device Address Register of Channel 0 */ +#define VIA_PCI_DMA_BCR0 0xE48 /* Byte Count Register of Channel 0 */ +#define VIA_PCI_DMA_DPR0 0xE4C /* Descriptor Pointer Register of Channel 0 */ + +#define VIA_PCI_DMA_MAR1 0xE50 /* Memory Address Register of Channel 1 */ +#define VIA_PCI_DMA_DAR1 0xE54 /* Device Address Register of Channel 1 */ +#define VIA_PCI_DMA_BCR1 0xE58 /* Byte Count Register of Channel 1 */ +#define VIA_PCI_DMA_DPR1 0xE5C /* Descriptor Pointer Register of Channel 1 */ + +#define VIA_PCI_DMA_MAR2 0xE60 /* Memory Address Register of Channel 2 */ +#define VIA_PCI_DMA_DAR2 0xE64 /* Device Address Register of Channel 2 */ +#define VIA_PCI_DMA_BCR2 0xE68 /* Byte Count Register of Channel 2 */ +#define VIA_PCI_DMA_DPR2 0xE6C /* Descriptor Pointer Register of Channel 2 */ + +#define VIA_PCI_DMA_MAR3 0xE70 /* Memory Address Register of Channel 3 */ +#define VIA_PCI_DMA_DAR3 0xE74 /* Device Address Register of Channel 3 */ +#define VIA_PCI_DMA_BCR3 0xE78 /* Byte Count Register of Channel 3 */ +#define VIA_PCI_DMA_DPR3 0xE7C /* Descriptor Pointer Register of Channel 3 */ + +#define VIA_PCI_DMA_MR0 0xE80 /* Mode Register of Channel 0 */ +#define VIA_PCI_DMA_MR1 0xE84 /* Mode Register of Channel 1 */ +#define VIA_PCI_DMA_MR2 0xE88 /* Mode Register of Channel 2 */ +#define VIA_PCI_DMA_MR3 0xE8C /* Mode Register of Channel 3 */ + +#define VIA_PCI_DMA_CSR0 0xE90 /* Command/Status Register of Channel 0 */ +#define VIA_PCI_DMA_CSR1 0xE94 /* Command/Status Register of Channel 1 */ +#define VIA_PCI_DMA_CSR2 0xE98 /* Command/Status Register of Channel 2 */ +#define VIA_PCI_DMA_CSR3 0xE9C /* Command/Status Register of Channel 3 */ + +#define VIA_PCI_DMA_PTR 0xEA0 /* Priority Type Register */ + +/* Define for DMA engine */ +/* DPR */ +#define VIA_DMA_DPR_EC (1<<1) /* end of chain */ +#define VIA_DMA_DPR_DDIE (1<<2) /* descriptor done interrupt enable */ +#define VIA_DMA_DPR_DT (1<<3) /* direction of transfer (RO) */ + +/* MR */ +#define VIA_DMA_MR_CM (1<<0) /* chaining mode */ +#define VIA_DMA_MR_TDIE (1<<1) /* transfer done interrupt enable */ +#define VIA_DMA_MR_HENDMACMD (1<<7) /* ? */ + +/* CSR */ +#define VIA_DMA_CSR_DE (1<<0) /* DMA enable */ +#define VIA_DMA_CSR_TS (1<<1) /* transfer start */ +#define VIA_DMA_CSR_TA (1<<2) /* transfer abort */ +#define VIA_DMA_CSR_TD (1<<3) /* transfer done */ +#define VIA_DMA_CSR_DD (1<<4) /* descriptor done */ +#define VIA_DMA_DPR_EC (1<<1) /* end of chain */ +#endif #if defined(__linux__) #include "via_dmablit.h" Index: src/sys/external/bsd/drm/dist/shared-core/via_ds.c diff -u src/sys/external/bsd/drm/dist/shared-core/via_ds.c:1.1.1.1 src/sys/external/bsd/drm/dist/shared-core/via_ds.c:1.2 --- src/sys/external/bsd/drm/dist/shared-core/via_ds.c:1.1.1.1 Sat Jul 19 05:30:50 2008 +++ src/sys/external/bsd/drm/dist/shared-core/via_ds.c Sun Sep 27 12:39:05 2009 @@ -46,16 +46,16 @@ int via_setAdd(set_t * set, ITEM_TYPE item) { - int free = set->free; - if (free != -1) { - set->list[free].val = item; - set->free = set->list[free].free_next; + int sfree = set->free; + if (sfree != -1) { + set->list[sfree].val = item; + set->free = set->list[sfree].free_next; } else { return 0; } - set->list[free].alloc_next = set->alloc; - set->alloc = free; - set->list[free].free_next = -1; + set->list[sfree].alloc_next = set->alloc; + set->alloc = sfree; + set->list[sfree].free_next = -1; return 1; } Index: src/sys/external/bsd/drm/dist/shared-core/via_mm.c diff -u src/sys/external/bsd/drm/dist/shared-core/via_mm.c:1.1.1.1 src/sys/external/bsd/drm/dist/shared-core/via_mm.c:1.2 --- src/sys/external/bsd/drm/dist/shared-core/via_mm.c:1.1.1.1 Sat Jul 19 05:30:51 2008 +++ src/sys/external/bsd/drm/dist/shared-core/via_mm.c Sun Sep 27 12:39:05 2009 @@ -91,10 +91,10 @@ { drm_via_fb_t *fb = data; - FBHeap = via_mmInit(fb.offset, fb.size); + FBHeap = via_mmInit(fb->offset, fb->size); - DRM_DEBUG("offset = %lu, size = %lu", (unsigned long)fb.offset, - (unsigned long)fb.size); + DRM_DEBUG("offset = %lu, size = %lu", (unsigned long)fb->offset, + (unsigned long)fb->size); return 0; } @@ -190,7 +190,7 @@ { drm_via_mem_t *mem = data; - switch (mem.type) { + switch (mem->type) { case VIA_MEM_VIDEO: if (via_fb_alloc(mem) < 0) return -EFAULT; @@ -341,7 +341,7 @@ retval = -1; } - DRM_DEBUG("free agp, free = %ld\n", agp.nfree); + DRM_DEBUG("free agp, free = %ld\n", agp.free); return retval; } Index: src/sys/external/bsd/drm/dist/shared-core/via_verifier.c diff -u src/sys/external/bsd/drm/dist/shared-core/via_verifier.c:1.1.1.1 src/sys/external/bsd/drm/dist/shared-core/via_verifier.c:1.2 --- src/sys/external/bsd/drm/dist/shared-core/via_verifier.c:1.1.1.1 Sat Jul 19 05:30:51 2008 +++ src/sys/external/bsd/drm/dist/shared-core/via_verifier.c Sun Sep 27 12:39:05 2009 @@ -349,17 +349,17 @@ } static __inline__ int -investigate_hazard(uint32_t cmd, hazard_t hz, drm_via_state_t * cur_seq) +investigate_hazard(uint32_t cmd, hazard_t haz, drm_via_state_t * cur_seq) { register uint32_t tmp, *tmp_addr; - if (cur_seq->unfinished && (cur_seq->unfinished != seqs[hz])) { + if (cur_seq->unfinished && (cur_seq->unfinished != seqs[haz])) { int ret; if ((ret = finish_current_sequence(cur_seq))) return ret; } - switch (hz) { + switch (haz) { case check_for_header2: if (cmd == HALCYON_HEADER2) return 1; @@ -631,7 +631,7 @@ { uint32_t cmd; int hz_mode; - hazard_t hz; + hazard_t haz; const uint32_t *buf = *buffer; const hazard_t *hz_table; @@ -698,8 +698,8 @@ while (buf < buf_end) { cmd = *buf++; - if ((hz = hz_table[cmd >> 24])) { - if ((hz_mode = investigate_hazard(cmd, hz, hc_state))) { + if ((haz = hz_table[cmd >> 24])) { + if ((hz_mode = investigate_hazard(cmd, haz, hc_state))) { if (hz_mode == 1) { buf--; break; Index: src/sys/external/bsd/drm/dist/shared-core/via_irq.c diff -u src/sys/external/bsd/drm/dist/shared-core/via_irq.c:1.1.1.2 src/sys/external/bsd/drm/dist/shared-core/via_irq.c:1.2 --- src/sys/external/bsd/drm/dist/shared-core/via_irq.c:1.1.1.2 Fri Jun 19 03:22:25 2009 +++ src/sys/external/bsd/drm/dist/shared-core/via_irq.c Sun Sep 27 12:39:05 2009 @@ -76,7 +76,7 @@ {VIA_IRQ_DMA1_TD_ENABLE, VIA_IRQ_DMA1_TD_PENDING, VIA_PCI_DMA_CSR1, VIA_DMA_CSR_TA | VIA_DMA_CSR_TD, 0x00000008}, }; -static int via_num_pro_group_a = ARRAY_SIZE(via_pro_group_a_irqs); +static int via_num_pro_group_a = DRM_ARRAY_SIZE(via_pro_group_a_irqs); static int via_irqmap_pro_group_a[] = {0, 1, -1, 2, -1, 3}; static maskarray_t via_unichrome_irqs[] = { @@ -85,7 +85,7 @@ {VIA_IRQ_DMA1_TD_ENABLE, VIA_IRQ_DMA1_TD_PENDING, VIA_PCI_DMA_CSR1, VIA_DMA_CSR_TA | VIA_DMA_CSR_TD, 0x00000008} }; -static int via_num_unichrome = ARRAY_SIZE(via_unichrome_irqs); +static int via_num_unichrome = DRM_ARRAY_SIZE(via_unichrome_irqs); static int via_irqmap_unichrome[] = {-1, -1, -1, 0, -1, 1}; Index: src/sys/external/bsd/drm/dist/shared-core/via_map.c diff -u src/sys/external/bsd/drm/dist/shared-core/via_map.c:1.1.1.2 src/sys/external/bsd/drm/dist/shared-core/via_map.c:1.2 --- src/sys/external/bsd/drm/dist/shared-core/via_map.c:1.1.1.2 Fri Jun 19 03:22:25 2009 +++ src/sys/external/bsd/drm/dist/shared-core/via_map.c Sun Sep 27 12:39:05 2009 @@ -127,7 +127,9 @@ ret = drm_vblank_init(dev, 1); if (ret) { +#ifdef VIA_HAVE_CORE_MM drm_sman_takedown(&dev_priv->sman); +#endif drm_free(dev_priv, sizeof(drm_via_private_t), DRM_MEM_DRIVER); return ret; }