1 1.4 rkujawa /* $NetBSD: autoconf.c,v 1.4 2026/06/22 12:34:19 rkujawa Exp $ */ 2 1.1 rkujawa 3 1.1 rkujawa /* 4 1.1 rkujawa * Copyright (c) 2012, 2014, 2024, 2026 The NetBSD Foundation, Inc. 5 1.1 rkujawa * All rights reserved. 6 1.1 rkujawa * 7 1.1 rkujawa * This code is derived from software contributed to The NetBSD Foundation 8 1.1 rkujawa * by Radoslaw Kujawa. 9 1.1 rkujawa * 10 1.1 rkujawa * Redistribution and use in source and binary forms, with or without 11 1.1 rkujawa * modification, are permitted provided that the following conditions 12 1.1 rkujawa * are met: 13 1.1 rkujawa * 1. Redistributions of source code must retain the above copyright 14 1.1 rkujawa * notice, this list of conditions and the following disclaimer. 15 1.1 rkujawa * 2. Redistributions in binary form must reproduce the above copyright 16 1.1 rkujawa * notice, this list of conditions and the following disclaimer in the 17 1.1 rkujawa * documentation and/or other materials provided with the distribution. 18 1.1 rkujawa * 19 1.1 rkujawa * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 20 1.1 rkujawa * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 21 1.1 rkujawa * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 22 1.1 rkujawa * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 23 1.1 rkujawa * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 24 1.1 rkujawa * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 1.1 rkujawa * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 1.1 rkujawa * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 1.1 rkujawa * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 28 1.1 rkujawa * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 1.1 rkujawa */ 30 1.1 rkujawa 31 1.1 rkujawa /* 32 1.1 rkujawa * Copyright 2004 Shigeyuki Fukushima. 33 1.1 rkujawa * All rights reserved. 34 1.1 rkujawa * 35 1.1 rkujawa * Written by Shigeyuki Fukushima for The NetBSD Project. 36 1.1 rkujawa * 37 1.1 rkujawa * Redistribution and use in source and binary forms, with or without 38 1.1 rkujawa * modification, are permitted provided that the following conditions 39 1.1 rkujawa * are met: 40 1.1 rkujawa * 1. Redistributions of source code must retain the above copyright 41 1.1 rkujawa * notice, this list of conditions and the following disclaimer. 42 1.1 rkujawa * 2. Redistributions in binary form must reproduce the above 43 1.1 rkujawa * copyright notice, this list of conditions and the following 44 1.1 rkujawa * disclaimer in the documentation and/or other materials provided 45 1.1 rkujawa * with the distribution. 46 1.1 rkujawa * 3. The name of the author may not be used to endorse or promote 47 1.1 rkujawa * products derived from this software without specific prior 48 1.1 rkujawa * written permission. 49 1.1 rkujawa * 50 1.1 rkujawa * THIS SOFTWARE IS PROVIDED THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 51 1.1 rkujawa * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 52 1.1 rkujawa * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 53 1.1 rkujawa * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE 54 1.1 rkujawa * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 55 1.1 rkujawa * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT 56 1.1 rkujawa * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 57 1.1 rkujawa * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 58 1.1 rkujawa * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 59 1.1 rkujawa * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE 60 1.1 rkujawa * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH 61 1.1 rkujawa * DAMAGE. 62 1.1 rkujawa */ 63 1.1 rkujawa 64 1.1 rkujawa /* 65 1.1 rkujawa * Autoconfiguration for the ACube Sam460ex (AMCC 460EX). 66 1.1 rkujawa * Modeled on evbppc/obs405/obs600_autoconf.c. 67 1.1 rkujawa */ 68 1.1 rkujawa 69 1.1 rkujawa #include <sys/cdefs.h> 70 1.4 rkujawa __KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.4 2026/06/22 12:34:19 rkujawa Exp $"); 71 1.1 rkujawa 72 1.1 rkujawa #include <sys/param.h> 73 1.1 rkujawa #include <sys/device.h> 74 1.1 rkujawa #include <sys/disklabel.h> 75 1.1 rkujawa #include <sys/intr.h> 76 1.1 rkujawa #include <sys/systm.h> 77 1.1 rkujawa 78 1.1 rkujawa #include <machine/sam460ex.h> 79 1.1 rkujawa 80 1.1 rkujawa #include <powerpc/ibm4xx/amcc460ex.h> 81 1.1 rkujawa #include <powerpc/ibm4xx/cpu.h> 82 1.1 rkujawa #include <powerpc/ibm4xx/dcr4xx.h> 83 1.4 rkujawa #include <powerpc/ibm4xx/pci_machdep.h> 84 1.1 rkujawa 85 1.3 rkujawa #include <dev/pci/pcivar.h> 86 1.3 rkujawa #include <dev/pci/pcireg.h> 87 1.3 rkujawa #include <dev/pci/pcidevs.h> 88 1.3 rkujawa 89 1.4 rkujawa /* 90 1.4 rkujawa * PCIe INTx routing 91 1.4 rkujawa */ 92 1.4 rkujawa int 93 1.4 rkujawa pciex_inta_irq(int port) 94 1.4 rkujawa { 95 1.4 rkujawa 96 1.4 rkujawa return 0x60 + port * 0x6; 97 1.4 rkujawa } 98 1.4 rkujawa 99 1.3 rkujawa /* Set once console=pci has made a PCI display the console (see below). */ 100 1.3 rkujawa static bool sam460ex_pci_console_found; 101 1.3 rkujawa 102 1.1 rkujawa /* 103 1.1 rkujawa * Determine device configuration for a machine. 104 1.1 rkujawa */ 105 1.1 rkujawa void 106 1.1 rkujawa cpu_configure(void) 107 1.1 rkujawa { 108 1.1 rkujawa 109 1.1 rkujawa /* UIC */ 110 1.1 rkujawa mtdcr(DCR_UIC1_BASE + DCR_UIC_PR, 111 1.1 rkujawa mfdcr(DCR_UIC1_BASE + DCR_UIC_PR) & ~0x80000000); 112 1.1 rkujawa mtdcr(DCR_UIC1_BASE + DCR_UIC_TR, 113 1.1 rkujawa mfdcr(DCR_UIC1_BASE + DCR_UIC_TR) & ~0x80000000); 114 1.1 rkujawa mtdcr(DCR_UIC1_BASE + DCR_UIC_SR, 0x80000000); 115 1.1 rkujawa mtdcr(DCR_UIC3_BASE + DCR_UIC_PR, 116 1.1 rkujawa mfdcr(DCR_UIC3_BASE + DCR_UIC_PR) & ~0x000ff000); 117 1.1 rkujawa mtdcr(DCR_UIC3_BASE + DCR_UIC_TR, 118 1.1 rkujawa mfdcr(DCR_UIC3_BASE + DCR_UIC_TR) & ~0x000ff000); 119 1.1 rkujawa mtdcr(DCR_UIC3_BASE + DCR_UIC_SR, 0x000ff000); 120 1.1 rkujawa 121 1.1 rkujawa /* 122 1.1 rkujawa * Initialize intr and add the cascaded UICs. 123 1.1 rkujawa * UIC0 = 0, UIC1 = +32, UIC2 = +64, UIC3 = +96. 124 1.1 rkujawa */ 125 1.1 rkujawa intr_init(); 126 1.1 rkujawa pic_add(&pic_uic1); 127 1.1 rkujawa pic_add(&pic_uic2); 128 1.1 rkujawa pic_add(&pic_uic3); 129 1.1 rkujawa 130 1.1 rkujawa if (config_rootfound("plb", NULL) == NULL) 131 1.1 rkujawa panic("configure: mainbus not configured"); 132 1.1 rkujawa 133 1.3 rkujawa if (sam460ex_console == SAM460EX_CONS_PCI && !sam460ex_pci_console_found) 134 1.3 rkujawa printf("sam460ex: console=pci: no suitable PCI display found, " 135 1.3 rkujawa "using serial\n"); 136 1.3 rkujawa 137 1.1 rkujawa pic_finish_setup(); 138 1.1 rkujawa 139 1.1 rkujawa genppc_cpu_configure(); 140 1.1 rkujawa } 141 1.1 rkujawa 142 1.1 rkujawa void 143 1.1 rkujawa device_register(device_t dev, void *aux) 144 1.1 rkujawa { 145 1.1 rkujawa 146 1.2 rkujawa ibm4xx_device_register(dev, aux, sam460ex_com_freq()); 147 1.1 rkujawa 148 1.3 rkujawa /* console=sm502: the on-board SM502 voyagerfb becomes the console */ 149 1.3 rkujawa if (sam460ex_console == SAM460EX_CONS_SM502 && 150 1.3 rkujawa device_is_a(dev, "voyagerfb")) 151 1.1 rkujawa prop_dictionary_set_bool(device_properties(dev), 152 1.1 rkujawa "is_console", true); 153 1.1 rkujawa 154 1.1 rkujawa /* 155 1.3 rkujawa * console=pci: when first non-SM502 PCI display device attaches, make 156 1.3 rkujawa * a console 157 1.3 rkujawa */ 158 1.3 rkujawa if (sam460ex_console == SAM460EX_CONS_PCI && !sam460ex_pci_console_found && 159 1.3 rkujawa device_parent(dev) != NULL && device_is_a(device_parent(dev), "pci")) { 160 1.3 rkujawa struct pci_attach_args *pa = aux; 161 1.3 rkujawa const int *bdf = sam460ex_console_pci_bdf; 162 1.3 rkujawa 163 1.3 rkujawa if (PCI_CLASS(pa->pa_class) == PCI_CLASS_DISPLAY && 164 1.3 rkujawa !(PCI_VENDOR(pa->pa_id) == PCI_VENDOR_SILMOTION && 165 1.3 rkujawa PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_SILMOTION_SM502) && 166 1.3 rkujawa (bdf[0] == -1 || bdf[0] == pa->pa_bus) && 167 1.3 rkujawa (bdf[1] == -1 || bdf[1] == pa->pa_device) && 168 1.3 rkujawa (bdf[2] == -1 || bdf[2] == pa->pa_function)) { 169 1.3 rkujawa aprint_normal("sam460ex: console=pci: selected PCI display " 170 1.3 rkujawa "at %d:%d:%d (vendor 0x%04x product 0x%04x)\n", 171 1.3 rkujawa pa->pa_bus, pa->pa_device, pa->pa_function, 172 1.3 rkujawa PCI_VENDOR(pa->pa_id), PCI_PRODUCT(pa->pa_id)); 173 1.3 rkujawa prop_dictionary_set_bool(device_properties(dev), 174 1.3 rkujawa "is_console", true); 175 1.3 rkujawa sam460ex_pci_console_found = true; 176 1.3 rkujawa } 177 1.3 rkujawa } 178 1.3 rkujawa 179 1.3 rkujawa /* 180 1.1 rkujawa * Match a "root=" from the bootargs. 181 1.1 rkujawa */ 182 1.1 rkujawa if (bootspec != NULL) { 183 1.1 rkujawa size_t len = strlen(bootspec); 184 1.1 rkujawa int part = 0; 185 1.1 rkujawa 186 1.1 rkujawa if (len > 1 && bootspec[len - 1] >= 'a' && 187 1.1 rkujawa bootspec[len - 1] < 'a' + MAXPARTITIONS && 188 1.1 rkujawa bootspec[len - 2] >= '0' && bootspec[len - 2] <= '9') { 189 1.1 rkujawa part = bootspec[len - 1] - 'a'; 190 1.1 rkujawa len--; 191 1.1 rkujawa } 192 1.1 rkujawa if (strncmp(device_xname(dev), bootspec, len) == 0 && 193 1.1 rkujawa device_xname(dev)[len] == '\0') { 194 1.1 rkujawa booted_device = dev; 195 1.1 rkujawa booted_partition = part; 196 1.1 rkujawa } 197 1.1 rkujawa } 198 1.1 rkujawa } 199 1.1 rkujawa 200