1 /* $OpenBSD: cortex.c,v 1.6 2020/04/29 15:25:07 kettenis 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 NULL, 58 _bus_dmamap_create, 59 _bus_dmamap_destroy, 60 _bus_dmamap_load, 61 _bus_dmamap_load_mbuf, 62 _bus_dmamap_load_uio, 63 _bus_dmamap_load_raw, 64 _bus_dmamap_load_buffer, 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 *cfdata, void *aux) 98 { 99 union mainbus_attach_args *ma = aux; 100 struct cfdata *cf = (struct cfdata *)cfdata; 101 int cputype = cpufunc_id(); 102 103 if (strcmp(cf->cf_driver->cd_name, ma->ma_name) != 0) 104 return (0); 105 106 if ((cputype & CPU_ID_CORTEX_A7_MASK) == CPU_ID_CORTEX_A7 || 107 (cputype & CPU_ID_CORTEX_A9_MASK) == CPU_ID_CORTEX_A9 || 108 (cputype & CPU_ID_CORTEX_A15_MASK) == CPU_ID_CORTEX_A15 || 109 (cputype & CPU_ID_CORTEX_A17_MASK) == CPU_ID_CORTEX_A17) { 110 if (armv7_periphbase()) 111 return (1); 112 } 113 114 return (0); 115 } 116 117 /* 118 * void cortexattach(struct device *parent, struct device *self, void *aux) 119 * 120 * probe and attach all children 121 */ 122 123 void 124 cortexattach(struct device *parent, struct device *self, void *aux) 125 { 126 printf("\n"); 127 128 config_search(cortexsearch, self, aux); 129 } 130 131 int 132 cortexsearch(struct device *parent, void *vcf, void *aux) 133 { 134 struct cortex_attach_args ca; 135 struct cfdata *cf = vcf; 136 137 ca.ca_name = cf->cf_driver->cd_name; 138 ca.ca_iot = &armv7_bs_tag; 139 ca.ca_dmat = &cortex_bus_dma_tag; 140 ca.ca_periphbase = armv7_periphbase(); 141 142 /* allow for devices to be disabled in UKC */ 143 if ((*cf->cf_attach->ca_match)(parent, cf, &ca) == 0) 144 return 0; 145 146 config_attach(parent, cf, &ca, cortexprint); 147 return 1; 148 } 149 150 /* 151 * int cortexprint(void *aux, const char *cortex) 152 * 153 * print routine used during config of children 154 */ 155 156 int 157 cortexprint(void *aux, const char *cortex) 158 { 159 struct cortex_attach_args *ca = aux; 160 161 if (cortex != NULL) 162 printf("%s at %s", ca->ca_name, cortex); 163 164 return (UNCONF); 165 } 166