Home | History | Annotate | Line # | Download | only in pci
pci_milan.c revision 1.9
      1  1.9      ad /*	$NetBSD: pci_milan.c,v 1.9 2008/05/30 19:26:35 ad Exp $	*/
      2  1.1     leo 
      3  1.1     leo /*-
      4  1.1     leo  * Copyright (c) 2001 The NetBSD Foundation, Inc.
      5  1.1     leo  * All rights reserved.
      6  1.1     leo  *
      7  1.1     leo  * This code is derived from software contributed to The NetBSD Foundation
      8  1.1     leo  * by Leo Weppelman.
      9  1.1     leo  *
     10  1.1     leo  * Redistribution and use in source and binary forms, with or without
     11  1.1     leo  * modification, are permitted provided that the following conditions
     12  1.1     leo  * are met:
     13  1.1     leo  * 1. Redistributions of source code must retain the above copyright
     14  1.1     leo  *    notice, this list of conditions and the following disclaimer.
     15  1.1     leo  * 2. Redistributions in binary form must reproduce the above copyright
     16  1.1     leo  *    notice, this list of conditions and the following disclaimer in the
     17  1.1     leo  *    documentation and/or other materials provided with the distribution.
     18  1.1     leo  *
     19  1.1     leo  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     20  1.1     leo  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     21  1.1     leo  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     22  1.1     leo  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     23  1.1     leo  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     24  1.1     leo  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     25  1.1     leo  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     26  1.1     leo  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     27  1.1     leo  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     28  1.1     leo  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     29  1.1     leo  * POSSIBILITY OF SUCH DAMAGE.
     30  1.1     leo  */
     31  1.5   lukem 
     32  1.5   lukem #include <sys/cdefs.h>
     33  1.9      ad __KERNEL_RCSID(0, "$NetBSD: pci_milan.c,v 1.9 2008/05/30 19:26:35 ad Exp $");
     34  1.1     leo 
     35  1.1     leo #include <sys/types.h>
     36  1.1     leo #include <sys/param.h>
     37  1.1     leo #include <sys/systm.h>
     38  1.1     leo #include <sys/device.h>
     39  1.1     leo 
     40  1.1     leo #include <dev/pci/pcivar.h>
     41  1.1     leo #include <dev/pci/pcireg.h>
     42  1.1     leo 
     43  1.3     leo #include <dev/isa/isavar.h>		/* isa_intr_{dis}establish */
     44  1.3     leo #include <dev/isa/isareg.h>		/* isa_intr_{dis}establish */
     45  1.3     leo 
     46  1.7     dsl #include <sys/bswap.h>
     47  1.3     leo #include <machine/isa_machdep.h>	/* isa_intr_{dis}establish */
     48  1.1     leo 
     49  1.2     leo #include <atari/pci/pci_vga.h>
     50  1.2     leo #include <atari/dev/grf_etreg.h>
     51  1.2     leo 
     52  1.1     leo int
     53  1.1     leo pci_bus_maxdevs(pc, busno)
     54  1.1     leo 	pci_chipset_tag_t pc;
     55  1.1     leo 	int busno;
     56  1.1     leo {
     57  1.1     leo 	return (6);
     58  1.1     leo }
     59  1.1     leo 
     60  1.1     leo /*
     61  1.1     leo  * These are defined in locore.s:
     62  1.1     leo  */
     63  1.1     leo pcireg_t	milan_pci_confread(pcitag_t);
     64  1.1     leo void		milan_pci_confwrite(u_long, pcireg_t);
     65  1.1     leo u_long		plx_status;
     66  1.1     leo 
     67  1.1     leo pcireg_t
     68  1.1     leo pci_conf_read(pc, tag, reg)
     69  1.1     leo 	pci_chipset_tag_t pc;
     70  1.1     leo 	pcitag_t tag;
     71  1.1     leo 	int reg;
     72  1.1     leo {
     73  1.1     leo 	u_long		data;
     74  1.1     leo 
     75  1.1     leo 	data = bswap32(milan_pci_confread(tag | reg));
     76  1.1     leo 	if ((plx_status) & 0xf9000000) {
     77  1.1     leo 		/*
     78  1.1     leo 		 * Access error, assume nothing there...
     79  1.1     leo 		 */
     80  1.1     leo 		data = 0xffffffff;
     81  1.1     leo 	}
     82  1.1     leo 	return(data);
     83  1.1     leo }
     84  1.1     leo 
     85  1.1     leo 
     86  1.1     leo void
     87  1.1     leo pci_conf_write(pc, tag, reg, data)
     88  1.1     leo 	pci_chipset_tag_t pc;
     89  1.1     leo 	pcitag_t tag;
     90  1.1     leo 	int reg;
     91  1.1     leo 	pcireg_t data;
     92  1.1     leo {
     93  1.1     leo 	milan_pci_confwrite(tag | reg, bswap32(data));
     94  1.1     leo }
     95  1.1     leo 
     96  1.9      ad int
     97  1.9      ad pci_intr_setattr(pci_chipset_tag_t pc, pci_intr_handle_t *ih,
     98  1.9      ad 		 int attr, uint64_t data)
     99  1.9      ad {
    100  1.9      ad 
    101  1.9      ad 	switch (attr) {
    102  1.9      ad 	case PCI_INTR_MPSAFE:
    103  1.9      ad 		return 0;
    104  1.9      ad 	default:
    105  1.9      ad 		return ENODEV;
    106  1.9      ad 	}
    107  1.9      ad }
    108  1.9      ad 
    109  1.1     leo void *
    110  1.1     leo pci_intr_establish(pc, ih, level, ih_fun, ih_arg)
    111  1.1     leo 	pci_chipset_tag_t	pc;
    112  1.1     leo 	pci_intr_handle_t	ih;
    113  1.1     leo 	int			level;
    114  1.1     leo 	int			(*ih_fun) __P((void *));
    115  1.1     leo 	void			*ih_arg;
    116  1.1     leo {
    117  1.3     leo 	if (ih == 0 || ih >= 16 || ih == 2)
    118  1.4  provos 		panic("pci_intr_establish: bogus handle 0x%x", ih);
    119  1.3     leo 	return isa_intr_establish(NULL, ih, IST_LEVEL, level, ih_fun, ih_arg);
    120  1.1     leo }
    121  1.1     leo 
    122  1.1     leo void
    123  1.1     leo pci_intr_disestablish(pc, cookie)
    124  1.1     leo 	pci_chipset_tag_t pc;
    125  1.1     leo 	void *cookie;
    126  1.1     leo {
    127  1.3     leo 	isa_intr_disestablish(NULL, cookie);
    128  1.2     leo }
    129  1.2     leo 
    130  1.2     leo /*
    131  1.2     leo  * VGA related stuff...
    132  1.2     leo  * XXX: Currently, you can only boot the Milan through loadbsd.ttp, hence the
    133  1.2     leo  *      text mode ;-)
    134  1.2     leo  * It looks like the Milan BIOS is initializing the VGA card in a reasonably
    135  1.2     leo  * standard text mode. However, the screen mode is 640*480 instead of 640*400.
    136  1.2     leo  * Since wscons does not handle the right by default, the card is reprogrammed
    137  1.2     leo  * to 640*400 using only 'standard' VGA registers (I hope!). So this ought to
    138  1.2     leo  * work on cards other than the S3Trio card I have tested it on.
    139  1.2     leo  */
    140  1.2     leo static u_char crt_tab[] = {
    141  1.2     leo 	0x60, 0x53, 0x4f, 0x14, 0x56, 0x05, 0xc1, 0x1f,
    142  1.2     leo 	0x00, 0x4f, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00,
    143  1.2     leo 	0x98, 0x3d, 0x8f, 0x28, 0x0f, 0x8f, 0xc1, 0xc3,
    144  1.2     leo 	0xff };
    145  1.2     leo 
    146  1.2     leo /*
    147  1.2     leo  * XXX: Why are we repeating this everywhere! (Leo)
    148  1.2     leo  */
    149  1.2     leo #define PCI_LINMEMBASE  0x0e000000
    150  1.2     leo 
    151  1.2     leo void
    152  1.2     leo milan_vga_init(pc, tag, id, ba, fb)
    153  1.2     leo 	pci_chipset_tag_t	pc;
    154  1.2     leo 	pcitag_t		tag;
    155  1.2     leo 	int			id;
    156  1.2     leo 	volatile u_char		*ba;
    157  1.2     leo 	u_char			*fb;
    158  1.2     leo {
    159  1.2     leo 	int			i, csr;
    160  1.2     leo 
    161  1.2     leo 	/* Turn on the card */
    162  1.2     leo 	pci_conf_write(pc, tag, PCI_MAPREG_START, PCI_LINMEMBASE);
    163  1.2     leo 	csr = pci_conf_read(pc, tag, PCI_COMMAND_STATUS_REG);
    164  1.2     leo 	csr |= (PCI_COMMAND_MEM_ENABLE|PCI_COMMAND_IO_ENABLE);
    165  1.2     leo 	csr |= PCI_COMMAND_MASTER_ENABLE;
    166  1.2     leo 	pci_conf_write(pc, tag, PCI_COMMAND_STATUS_REG, csr);
    167  1.2     leo 
    168  1.2     leo 	/*
    169  1.2     leo 	 * Make sure we're allowed to write all crt-registers and reload them.
    170  1.2     leo 	 */
    171  1.2     leo 	WCrt(ba, CRT_ID_END_VER_RETR, (RCrt(ba, CRT_ID_END_VER_RETR) & 0x7f));
    172  1.2     leo 
    173  1.2     leo 	for (i = 0; i < 0x18; i++)
    174  1.2     leo 		WCrt(ba, i, crt_tab[i]);
    175  1.2     leo 
    176  1.2     leo 	/*
    177  1.2     leo 	 * The Milan has a white border... make it black
    178  1.2     leo 	 */
    179  1.2     leo 	WAttr(ba, 0x11, 0|0x20);
    180  1.1     leo }
    181