1/* $OpenBSD: armv7.c,v 1.19 2021/04/02 03:02:46 tb Exp $ */ 2/* 3 * Copyright (c) 2005,2008 Dale Rahn <drahn@openbsd.org> 4 * Copyright (c) 2012-2013 Patrick Wildt <patrick@blueri.se> 5 * 6 * Permission to use, copy, modify, and distribute this software for any 7 * purpose with or without fee is hereby granted, provided that the above 8 * copyright notice and this permission notice appear in all copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17 */ 18 19#include <sys/param.h> 20#include <sys/systm.h> 21 22#define _ARM32_BUS_DMA_PRIVATE 23#include <machine/bus.h> 24#include <arm/armv7/armv7var.h> 25#include <armv7/armv7/armv7var.h> 26#include <armv7/armv7/armv7_machdep.h> 27 28struct arm32_bus_dma_tag armv7_bus_dma_tag = { 29 NULL, 30 _bus_dmamap_create, 31 _bus_dmamap_destroy, 32 _bus_dmamap_load, 33 _bus_dmamap_load_mbuf, 34 _bus_dmamap_load_uio, 35 _bus_dmamap_load_raw, 36 _bus_dmamap_load_buffer, 37 _bus_dmamap_unload, 38 _bus_dmamap_sync, 39 _bus_dmamem_alloc, 40 _bus_dmamem_free, 41 _bus_dmamem_map, 42 _bus_dmamem_unmap, 43 _bus_dmamem_mmap, 44}; 45 46struct armv7_dev *armv7_devs = NULL; 47 48#define DEVNAME(sc) (sc)->sc_dv.dv_xname 49 50/* 51 * We do direct configuration of devices on this SoC "bus", so we 52 * never call the child device's match function at all (it can be 53 * NULL in the struct cfattach). 54 */ 55int 56armv7_submatch(struct device *parent, void *child, void *aux) 57{ 58 struct cfdata *cf = child; 59 struct armv7_attach_args *aa = aux; 60 61 if (strcmp(cf->cf_driver->cd_name, aa->aa_dev->name) == 0) 62 return (1); 63 64 /* "These are not the droids you are looking for." */ 65 return (0); 66} 67 68void 69armv7_set_devs(struct armv7_dev *devs) 70{ 71 armv7_devs = devs; 72} 73 74struct armv7_dev * 75armv7_find_dev(const char *name, int unit) 76{ 77 struct armv7_dev *ad; 78 79 if (armv7_devs == NULL) 80 panic("%s: armv7_devs == NULL", __func__); 81 82 for (ad = armv7_devs; ad->name != NULL; ad++) { 83 if (ad->unit == unit && strcmp(ad->name, name) == 0) 84 return (ad); 85 } 86 87 return (NULL); 88} 89 90void 91armv7_attach(struct device *parent, struct device *self, void *aux) 92{ 93 struct armv7_softc *sc = (struct armv7_softc *)self; 94 struct board_dev *bd; 95 96 printf("\n"); 97 98 sc->sc_board_devs = platform_board_devs(); 99 100 /* Directly configure on-board devices (dev* in config file). */ 101 for (bd = sc->sc_board_devs; bd->name != NULL; bd++) { 102 struct armv7_dev *ad = armv7_find_dev(bd->name, bd->unit); 103 struct armv7_attach_args aa; 104 105 if (ad == NULL) { 106 printf("%s: device %s unit %d not found\n", 107 DEVNAME(sc), bd->name, bd->unit); 108 continue; 109 } 110 111 memset(&aa, 0, sizeof(aa)); 112 aa.aa_dev = ad; 113 aa.aa_iot = &armv7_bs_tag; 114 aa.aa_dmat = &armv7_bus_dma_tag; 115 116 if (config_found_sm(self, &aa, NULL, armv7_submatch) == NULL) 117 printf("%s: device %s unit %d not configured\n", 118 DEVNAME(sc), bd->name, bd->unit); 119 } 120} 121