1*130ea1ecSderaadt /* $OpenBSD: cortex.c,v 1.8 2024/08/18 15:50:47 deraadt Exp $ */ 2027018efSpatrick /* $NetBSD: mainbus.c,v 1.3 2001/06/13 17:52:43 nathanw Exp $ */ 3027018efSpatrick 4027018efSpatrick /* 5027018efSpatrick * Copyright (c) 1994,1995 Mark Brinicombe. 6027018efSpatrick * Copyright (c) 1994 Brini. 7027018efSpatrick * All rights reserved. 8027018efSpatrick * 9027018efSpatrick * Redistribution and use in source and binary forms, with or without 10027018efSpatrick * modification, are permitted provided that the following conditions 11027018efSpatrick * are met: 12027018efSpatrick * 1. Redistributions of source code must retain the above copyright 13027018efSpatrick * notice, this list of conditions and the following disclaimer. 14027018efSpatrick * 2. Redistributions in binary form must reproduce the above copyright 15027018efSpatrick * notice, this list of conditions and the following disclaimer in the 16027018efSpatrick * documentation and/or other materials provided with the distribution. 17027018efSpatrick * 3. All advertising materials mentioning features or use of this software 18027018efSpatrick * must display the following acknowledgement: 19027018efSpatrick * This product includes software developed by Brini. 20027018efSpatrick * 4. The name of the company nor the name of the author may be used to 21027018efSpatrick * endorse or promote products derived from this software without specific 22027018efSpatrick * prior written permission. 23027018efSpatrick * 24027018efSpatrick * THIS SOFTWARE IS PROVIDED BY BRINI ``AS IS'' AND ANY EXPRESS OR IMPLIED 25027018efSpatrick * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 26027018efSpatrick * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 27027018efSpatrick * IN NO EVENT SHALL BRINI OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 28027018efSpatrick * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 29027018efSpatrick * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 30027018efSpatrick * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 31027018efSpatrick * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 32027018efSpatrick * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33027018efSpatrick * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34027018efSpatrick * SUCH DAMAGE. 35027018efSpatrick * 36027018efSpatrick * RiscBSD kernel project 37027018efSpatrick * 38027018efSpatrick * mainbus.c 39027018efSpatrick * 40027018efSpatrick * mainbus configuration 41027018efSpatrick * 42027018efSpatrick * Created : 15/12/94 43027018efSpatrick */ 44027018efSpatrick 45027018efSpatrick #include <sys/param.h> 46027018efSpatrick #include <sys/systm.h> 47027018efSpatrick #include <sys/kernel.h> 48027018efSpatrick #include <sys/device.h> 49027018efSpatrick #define _ARM32_BUS_DMA_PRIVATE 50027018efSpatrick #include <machine/bus.h> 51027018efSpatrick #include <arm/cpufunc.h> 52027018efSpatrick #include <arm/armv7/armv7var.h> 53027018efSpatrick #include <arm/cortex/cortex.h> 5472d97272Spatrick #include <arm/mainbus/mainbus.h> 55027018efSpatrick 56027018efSpatrick struct arm32_bus_dma_tag cortex_bus_dma_tag = { 57027018efSpatrick NULL, 58027018efSpatrick _bus_dmamap_create, 59027018efSpatrick _bus_dmamap_destroy, 60027018efSpatrick _bus_dmamap_load, 61027018efSpatrick _bus_dmamap_load_mbuf, 62027018efSpatrick _bus_dmamap_load_uio, 63027018efSpatrick _bus_dmamap_load_raw, 6437084e1eSkettenis _bus_dmamap_load_buffer, 65027018efSpatrick _bus_dmamap_unload, 66027018efSpatrick _bus_dmamap_sync, 67027018efSpatrick _bus_dmamem_alloc, 68027018efSpatrick _bus_dmamem_free, 69027018efSpatrick _bus_dmamem_map, 70027018efSpatrick _bus_dmamem_unmap, 71027018efSpatrick _bus_dmamem_mmap, 72027018efSpatrick }; 73027018efSpatrick 74027018efSpatrick /* Prototypes for functions provided */ 75027018efSpatrick 76027018efSpatrick int cortexmatch(struct device *, void *, void *); 77027018efSpatrick void cortexattach(struct device *, struct device *, void *); 78027018efSpatrick int cortexprint(void *aux, const char *cortex); 79027018efSpatrick int cortexsearch(struct device *, void *, void *); 80027018efSpatrick 81027018efSpatrick /* attach and device structures for the device */ 82027018efSpatrick 83e3ee5e84Smpi const struct cfattach cortex_ca = { 84*130ea1ecSderaadt sizeof(struct device), cortexmatch, cortexattach 85027018efSpatrick }; 86027018efSpatrick 87027018efSpatrick struct cfdriver cortex_cd = { 88027018efSpatrick NULL, "cortex", DV_DULL 89027018efSpatrick }; 90027018efSpatrick 91027018efSpatrick /* 92027018efSpatrick * int cortexmatch(struct device *parent, struct cfdata *cf, void *aux) 93027018efSpatrick */ 94027018efSpatrick 95027018efSpatrick int 9672d97272Spatrick cortexmatch(struct device *parent, void *cfdata, void *aux) 97027018efSpatrick { 9879645871Spatrick union mainbus_attach_args *ma = aux; 9972d97272Spatrick struct cfdata *cf = (struct cfdata *)cfdata; 100027018efSpatrick int cputype = cpufunc_id(); 101027018efSpatrick 10272d97272Spatrick if (strcmp(cf->cf_driver->cd_name, ma->ma_name) != 0) 10372d97272Spatrick return (0); 10472d97272Spatrick 1058ff1d18eSpatrick if ((cputype & CPU_ID_CORTEX_A7_MASK) == CPU_ID_CORTEX_A7 || 1068ff1d18eSpatrick (cputype & CPU_ID_CORTEX_A9_MASK) == CPU_ID_CORTEX_A9 || 1074ccb6786Sjsg (cputype & CPU_ID_CORTEX_A15_MASK) == CPU_ID_CORTEX_A15 || 1084ccb6786Sjsg (cputype & CPU_ID_CORTEX_A17_MASK) == CPU_ID_CORTEX_A17) { 109027018efSpatrick if (armv7_periphbase()) 110027018efSpatrick return (1); 111027018efSpatrick } 112027018efSpatrick 113027018efSpatrick return (0); 114027018efSpatrick } 115027018efSpatrick 116027018efSpatrick /* 117027018efSpatrick * void cortexattach(struct device *parent, struct device *self, void *aux) 118027018efSpatrick * 119027018efSpatrick * probe and attach all children 120027018efSpatrick */ 121027018efSpatrick 122027018efSpatrick void 123027018efSpatrick cortexattach(struct device *parent, struct device *self, void *aux) 124027018efSpatrick { 125027018efSpatrick printf("\n"); 126027018efSpatrick 127027018efSpatrick config_search(cortexsearch, self, aux); 128027018efSpatrick } 129027018efSpatrick 130027018efSpatrick int 131027018efSpatrick cortexsearch(struct device *parent, void *vcf, void *aux) 132027018efSpatrick { 133027018efSpatrick struct cortex_attach_args ca; 134027018efSpatrick struct cfdata *cf = vcf; 135027018efSpatrick 136027018efSpatrick ca.ca_name = cf->cf_driver->cd_name; 137027018efSpatrick ca.ca_iot = &armv7_bs_tag; 138027018efSpatrick ca.ca_dmat = &cortex_bus_dma_tag; 139027018efSpatrick ca.ca_periphbase = armv7_periphbase(); 140027018efSpatrick 141027018efSpatrick /* allow for devices to be disabled in UKC */ 142027018efSpatrick if ((*cf->cf_attach->ca_match)(parent, cf, &ca) == 0) 143027018efSpatrick return 0; 144027018efSpatrick 145027018efSpatrick config_attach(parent, cf, &ca, cortexprint); 146027018efSpatrick return 1; 147027018efSpatrick } 148027018efSpatrick 149027018efSpatrick /* 150027018efSpatrick * int cortexprint(void *aux, const char *cortex) 151027018efSpatrick * 152027018efSpatrick * print routine used during config of children 153027018efSpatrick */ 154027018efSpatrick 155027018efSpatrick int 156027018efSpatrick cortexprint(void *aux, const char *cortex) 157027018efSpatrick { 158027018efSpatrick struct cortex_attach_args *ca = aux; 159027018efSpatrick 160027018efSpatrick if (cortex != NULL) 161027018efSpatrick printf("%s at %s", ca->ca_name, cortex); 162027018efSpatrick 163027018efSpatrick return (UNCONF); 164027018efSpatrick } 165