1/* $NetBSD: hb.c,v 1.21 2021/08/07 16:19:00 thorpej Exp $ */ 2 3/*- 4 * Copyright (c) 1999 Izumi Tsutsui. All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 */ 26 27#include <sys/cdefs.h> 28__KERNEL_RCSID(0, "$NetBSD: hb.c,v 1.21 2021/08/07 16:19:00 thorpej Exp $"); 29 30#include <sys/param.h> 31#include <sys/systm.h> 32#include <sys/device.h> 33 34#include <machine/autoconf.h> 35#include <machine/bus.h> 36#include <machine/cpu.h> 37 38#include <news68k/news68k/isr.h> 39#include <news68k/dev/hbvar.h> 40 41#include "ioconf.h" 42 43static int hb_match(device_t, cfdata_t, void *); 44static void hb_attach(device_t, device_t, void *); 45static int hb_search(device_t, cfdata_t, const int *, void *); 46static int hb_print(void *, const char *); 47 48CFATTACH_DECL_NEW(hb, 0, 49 hb_match, hb_attach, NULL, NULL); 50 51static int 52hb_match(device_t parent, cfdata_t cf, void *aux) 53{ 54 struct mainbus_attach_args *ma = aux; 55 56 if (strcmp(ma->ma_name, hb_cd.cd_name) != 0) 57 return 0; 58 59 if (ma->ma_systype != -1 && ma->ma_systype != systype) 60 return 0; 61 62 return 1; 63} 64 65static void 66hb_attach(device_t parent, device_t self, void *aux) 67{ 68 struct hb_attach_args ha; 69 70 aprint_normal("\n"); 71 memset(&ha, 0, sizeof(ha)); 72 73 config_search(self, &ha, 74 CFARGS(.search = hb_search)); 75} 76 77static int 78hb_search(device_t parent, cfdata_t cf, const int *ldesc, void *aux) 79{ 80 struct hb_attach_args *ha = aux; 81 82 ha->ha_name = cf->cf_name; 83 ha->ha_address = cf->cf_addr; 84 ha->ha_ipl = cf->cf_ipl; 85 ha->ha_vect = cf->cf_vect; 86 87 /* XXX news68k Hyper-bus is not a real bus... */ 88 ha->ha_bust = ISIIOPA(ha->ha_address) ? 89 NEWS68K_BUS_SPACE_INTIO : NEWS68K_BUS_SPACE_EIO; 90 91 if (config_probe(parent, cf, ha)) 92 config_attach(parent, cf, ha, hb_print, CFARGS_NONE); 93 94 return 0; 95} 96 97/* 98 * Print out the confargs. The (parent) name is non-NULL 99 * when there was no match found by config_found(). 100 */ 101static int 102hb_print(void *args, const char *name) 103{ 104 struct hb_attach_args *ha = args; 105 106#if 0 107 if (ha->ha_addr > 0) 108#endif 109 aprint_normal(" addr 0x%08lx", ha->ha_address); 110 if (ha->ha_ipl > 0) 111 aprint_normal(" ipl %d", ha->ha_ipl); 112 if (ha->ha_vect > 0) { 113 aprint_normal(" vect %d", ha->ha_vect); 114 } 115 116 return QUIET; 117} 118 119/* 120 * hb_intr_establish: establish hb interrupt 121 */ 122void 123hb_intr_establish(int hbvect, int (*hand)(void *), int ipl, void *arg) 124{ 125 126 if ((ipl < 1) || (ipl > 7)) { 127 printf("hb: illegal interrupt level: %d\n", ipl); 128 panic("hb_intr_establish"); 129 } 130 131 if ((hbvect < 0) || (hbvect > 255)) { 132 printf("hb: illegal vector offset: 0x%x\n", hbvect); 133 panic("hb_intr_establish"); 134 } 135 136 isrlink_vectored(hand, arg, ipl, hbvect); 137} 138 139void 140hb_intr_disestablish(int hbvect) 141{ 142 143 if ((hbvect < 0) || (hbvect > 255)) { 144 printf("hb: illegal vector offset: 0x%x\n", hbvect); 145 panic("hb_intr_disestablish"); 146 } 147 148 isrunlink_vectored(hbvect); 149} 150