1 /* $OpenBSD: cortex.c,v 1.2 2013/08/06 14:21:13 patrick Exp $ */ 2 /* $NetBSD: mainbus.c,v 1.3 2001/06/13 17:52:43 nathanw Exp $ */ 3 4 /* 5 * Copyright (c) 1994,1995 Mark Brinicombe. 6 * Copyright (c) 1994 Brini. 7 * All rights reserved. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in the 16 * documentation and/or other materials provided with the distribution. 17 * 3. All advertising materials mentioning features or use of this software 18 * must display the following acknowledgement: 19 * This product includes software developed by Brini. 20 * 4. The name of the company nor the name of the author may be used to 21 * endorse or promote products derived from this software without specific 22 * prior written permission. 23 * 24 * THIS SOFTWARE IS PROVIDED BY BRINI ``AS IS'' AND ANY EXPRESS OR IMPLIED 25 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 26 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 27 * IN NO EVENT SHALL BRINI OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 28 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 29 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 30 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34 * SUCH DAMAGE. 35 * 36 * RiscBSD kernel project 37 * 38 * mainbus.c 39 * 40 * mainbus configuration 41 * 42 * Created : 15/12/94 43 */ 44 45 #include <sys/param.h> 46 #include <sys/systm.h> 47 #include <sys/kernel.h> 48 #include <sys/device.h> 49 #define _ARM32_BUS_DMA_PRIVATE 50 #include <machine/bus.h> 51 #include <arm/cpufunc.h> 52 #include <arm/armv7/armv7var.h> 53 #include <arm/cortex/cortex.h> 54 55 struct arm32_bus_dma_tag cortex_bus_dma_tag = { 56 0, 57 0, 58 NULL, 59 _bus_dmamap_create, 60 _bus_dmamap_destroy, 61 _bus_dmamap_load, 62 _bus_dmamap_load_mbuf, 63 _bus_dmamap_load_uio, 64 _bus_dmamap_load_raw, 65 _bus_dmamap_unload, 66 _bus_dmamap_sync, 67 _bus_dmamem_alloc, 68 _bus_dmamem_free, 69 _bus_dmamem_map, 70 _bus_dmamem_unmap, 71 _bus_dmamem_mmap, 72 }; 73 74 /* Prototypes for functions provided */ 75 76 int cortexmatch(struct device *, void *, void *); 77 void cortexattach(struct device *, struct device *, void *); 78 int cortexprint(void *aux, const char *cortex); 79 int cortexsearch(struct device *, void *, void *); 80 81 /* attach and device structures for the device */ 82 83 struct cfattach cortex_ca = { 84 sizeof(struct device), cortexmatch, cortexattach, NULL, 85 config_activate_children 86 }; 87 88 struct cfdriver cortex_cd = { 89 NULL, "cortex", DV_DULL 90 }; 91 92 /* 93 * int cortexmatch(struct device *parent, struct cfdata *cf, void *aux) 94 */ 95 96 int 97 cortexmatch(struct device *parent, void *cf, void *aux) 98 { 99 int cputype = cpufunc_id(); 100 101 if ((cputype & CPU_ID_CORTEX_A7_MASK) == CPU_ID_CORTEX_A7 || 102 (cputype & CPU_ID_CORTEX_A9_MASK) == CPU_ID_CORTEX_A9 || 103 (cputype & CPU_ID_CORTEX_A15_MASK) == CPU_ID_CORTEX_A15) { 104 if (armv7_periphbase()) 105 return (1); 106 } 107 108 return (0); 109 } 110 111 /* 112 * void cortexattach(struct device *parent, struct device *self, void *aux) 113 * 114 * probe and attach all children 115 */ 116 117 void 118 cortexattach(struct device *parent, struct device *self, void *aux) 119 { 120 printf("\n"); 121 122 config_search(cortexsearch, self, aux); 123 } 124 125 int 126 cortexsearch(struct device *parent, void *vcf, void *aux) 127 { 128 struct cortex_attach_args ca; 129 struct cfdata *cf = vcf; 130 131 ca.ca_name = cf->cf_driver->cd_name; 132 ca.ca_iot = &armv7_bs_tag; 133 ca.ca_dmat = &cortex_bus_dma_tag; 134 ca.ca_periphbase = armv7_periphbase(); 135 136 /* allow for devices to be disabled in UKC */ 137 if ((*cf->cf_attach->ca_match)(parent, cf, &ca) == 0) 138 return 0; 139 140 config_attach(parent, cf, &ca, cortexprint); 141 return 1; 142 } 143 144 /* 145 * int cortexprint(void *aux, const char *cortex) 146 * 147 * print routine used during config of children 148 */ 149 150 int 151 cortexprint(void *aux, const char *cortex) 152 { 153 struct cortex_attach_args *ca = aux; 154 155 if (cortex != NULL) 156 printf("%s at %s", ca->ca_name, cortex); 157 158 return (UNCONF); 159 } 160