Home | History | Annotate | Line # | Download | only in dev
      1 /*	$NetBSD: sti_pci_machdep.c,v 1.1 2014/02/24 07:23:43 skrll Exp $	*/
      2 
      3 /*	$OpenBSD: sti_pci_machdep.c,v 1.2 2009/04/10 17:11:27 miod Exp $	*/
      4 
      5 /*
      6  * Copyright (c) 2007, 2009 Miodrag Vallat.
      7  *
      8  * Permission to use, copy, modify, and distribute this software for any
      9  * purpose with or without fee is hereby granted, provided that the above
     10  * copyright notice, this permission notice, and the disclaimer below
     11  * appear in all copies.
     12  *
     13  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
     14  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
     15  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
     16  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
     17  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
     18  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
     19  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
     20  */
     21 
     22 #include <sys/param.h>
     23 #include <sys/systm.h>
     24 #include <sys/device.h>
     25 
     26 #include <machine/iomod.h>
     27 #include <machine/autoconf.h>
     28 
     29 #include <dev/pci/pcivar.h>
     30 
     31 #include <hppa/hppa/machdep.h>
     32 
     33 int	sti_pci_is_console(struct pci_attach_args *, bus_addr_t *);
     34 
     35 int
     36 sti_pci_is_console(struct pci_attach_args *paa, bus_addr_t *bases)
     37 {
     38 	hppa_hpa_t consaddr;
     39 	uint32_t cf;
     40 	int pagezero_cookie;
     41 	int bar;
     42 	int rc;
     43 
     44 	KASSERT(paa != NULL);
     45 
     46 	pagezero_cookie = hppa_pagezero_map();
     47 	consaddr = (hppa_hpa_t)PAGE0->mem_cons.pz_hpa;
     48 	hppa_pagezero_unmap(pagezero_cookie);
     49 	/*
     50 	 * PAGE0 console information will point to one of our BARs,
     51 	 * but depending on the particular sti model, this might not
     52 	 * be the BAR mapping the rom (region #0).
     53 	 *
     54 	 * For example, on Visualize FXe, regions #0, #2 and #3 are
     55 	 * mapped by BAR 0x18, while region #1 is mapped by BAR 0x10,
     56 	 * which matches PAGE0 console address.
     57 	 *
     58 	 * Rather than trying to be smart, reread the region->BAR array
     59 	 * again, and compare the BAR mapping region #1 against PAGE0
     60 	 * values, we simply try all the valid BARs; if any of them
     61 	 * matches what PAGE0 says, then we are the console, and it
     62 	 * doesn't matter which BAR matched.
     63 	 */
     64 	for (bar = PCI_MAPREG_START; bar <= PCI_MAPREG_PPB_END; ) {
     65 		bus_addr_t addr;
     66 		bus_size_t size;
     67 
     68 		cf = pci_conf_read(paa->pa_pc, paa->pa_tag, bar);
     69 
     70 		rc = pci_mapreg_info(paa->pa_pc, paa->pa_tag, bar,
     71 		    PCI_MAPREG_TYPE(cf), &addr, &size, NULL);
     72 
     73 		if (PCI_MAPREG_TYPE(cf) == PCI_MAPREG_TYPE_IO) {
     74 			bar += 4;
     75 		} else {
     76 			if (PCI_MAPREG_MEM_TYPE(cf) ==
     77 			    PCI_MAPREG_MEM_TYPE_64BIT)
     78 				bar += 8;
     79 			else
     80 				bar += 4;
     81 		}
     82 
     83 		if (rc == 0 && (hppa_hpa_t)addr == consaddr)
     84 			return 1;
     85 	}
     86 
     87 	return 0;
     88 }
     89