1 /* $OpenBSD: cortex.c,v 1.5 2016/05/02 08:15:55 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 #include <arm/mainbus/mainbus.h> 55 56 struct arm32_bus_dma_tag cortex_bus_dma_tag = { 57 0, 58 0, 59 NULL, 60 _bus_dmamap_create, 61 _bus_dmamap_destroy, 62 _bus_dmamap_load, 63 _bus_dmamap_load_mbuf, 64 _bus_dmamap_load_uio, 65 _bus_dmamap_load_raw, 66 _bus_dmamap_unload, 67 _bus_dmamap_sync, 68 _bus_dmamem_alloc, 69 _bus_dmamem_free, 70 _bus_dmamem_map, 71 _bus_dmamem_unmap, 72 _bus_dmamem_mmap, 73 }; 74 75 /* Prototypes for functions provided */ 76 77 int cortexmatch(struct device *, void *, void *); 78 void cortexattach(struct device *, struct device *, void *); 79 int cortexprint(void *aux, const char *cortex); 80 int cortexsearch(struct device *, void *, void *); 81 82 /* attach and device structures for the device */ 83 84 struct cfattach cortex_ca = { 85 sizeof(struct device), cortexmatch, cortexattach, NULL, 86 config_activate_children 87 }; 88 89 struct cfdriver cortex_cd = { 90 NULL, "cortex", DV_DULL 91 }; 92 93 /* 94 * int cortexmatch(struct device *parent, struct cfdata *cf, void *aux) 95 */ 96 97 int 98 cortexmatch(struct device *parent, void *cfdata, void *aux) 99 { 100 union mainbus_attach_args *ma = aux; 101 struct cfdata *cf = (struct cfdata *)cfdata; 102 int cputype = cpufunc_id(); 103 104 if (strcmp(cf->cf_driver->cd_name, ma->ma_name) != 0) 105 return (0); 106 107 if ((cputype & CPU_ID_CORTEX_A7_MASK) == CPU_ID_CORTEX_A7 || 108 (cputype & CPU_ID_CORTEX_A9_MASK) == CPU_ID_CORTEX_A9 || 109 (cputype & CPU_ID_CORTEX_A15_MASK) == CPU_ID_CORTEX_A15 || 110 (cputype & CPU_ID_CORTEX_A17_MASK) == CPU_ID_CORTEX_A17) { 111 if (armv7_periphbase()) 112 return (1); 113 } 114 115 return (0); 116 } 117 118 /* 119 * void cortexattach(struct device *parent, struct device *self, void *aux) 120 * 121 * probe and attach all children 122 */ 123 124 void 125 cortexattach(struct device *parent, struct device *self, void *aux) 126 { 127 printf("\n"); 128 129 config_search(cortexsearch, self, aux); 130 } 131 132 int 133 cortexsearch(struct device *parent, void *vcf, void *aux) 134 { 135 struct cortex_attach_args ca; 136 struct cfdata *cf = vcf; 137 138 ca.ca_name = cf->cf_driver->cd_name; 139 ca.ca_iot = &armv7_bs_tag; 140 ca.ca_dmat = &cortex_bus_dma_tag; 141 ca.ca_periphbase = armv7_periphbase(); 142 143 /* allow for devices to be disabled in UKC */ 144 if ((*cf->cf_attach->ca_match)(parent, cf, &ca) == 0) 145 return 0; 146 147 config_attach(parent, cf, &ca, cortexprint); 148 return 1; 149 } 150 151 /* 152 * int cortexprint(void *aux, const char *cortex) 153 * 154 * print routine used during config of children 155 */ 156 157 int 158 cortexprint(void *aux, const char *cortex) 159 { 160 struct cortex_attach_args *ca = aux; 161 162 if (cortex != NULL) 163 printf("%s at %s", ca->ca_name, cortex); 164 165 return (UNCONF); 166 } 167