11.6Sthorpej/* $NetBSD: z3rambd.c,v 1.6 2023/12/20 00:40:42 thorpej Exp $ */ 21.1Srkujawa 31.1Srkujawa/*- 41.1Srkujawa * Copyright (c) 2012 The NetBSD Foundation, Inc. 51.1Srkujawa * All rights reserved. 61.1Srkujawa * 71.1Srkujawa * This code is derived from software contributed to The NetBSD Foundation 81.1Srkujawa * by Radoslaw Kujawa. 91.1Srkujawa * 101.1Srkujawa * Redistribution and use in source and binary forms, with or without 111.1Srkujawa * modification, are permitted provided that the following conditions 121.1Srkujawa * are met: 131.1Srkujawa * 1. Redistributions of source code must retain the above copyright 141.1Srkujawa * notice, this list of conditions and the following disclaimer. 151.1Srkujawa * 2. Redistributions in binary form must reproduce the above copyright 161.1Srkujawa * notice, this list of conditions and the following disclaimer in the 171.1Srkujawa * documentation and/or other materials provided with the distribution. 181.1Srkujawa * 191.1Srkujawa * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 201.1Srkujawa * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 211.1Srkujawa * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 221.1Srkujawa * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 231.1Srkujawa * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 241.1Srkujawa * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 251.1Srkujawa * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 261.1Srkujawa * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 271.1Srkujawa * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 281.1Srkujawa * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 291.1Srkujawa * POSSIBILITY OF SUCH DAMAGE. 301.1Srkujawa */ 311.1Srkujawa 321.1Srkujawa#include <sys/cdefs.h> 331.6Sthorpej__KERNEL_RCSID(0, "$NetBSD: z3rambd.c,v 1.6 2023/12/20 00:40:42 thorpej Exp $"); 341.1Srkujawa 351.1Srkujawa/* 361.2Srkujawa * Z3 RAM virtual block device. Supports ZorRAM, BigRamPlus and FastLane Z3 so 371.2Srkujawa * far. 381.1Srkujawa */ 391.1Srkujawa 401.1Srkujawa#include <sys/param.h> 411.1Srkujawa#include <sys/device.h> 421.1Srkujawa#include <sys/socket.h> 431.1Srkujawa#include <sys/systm.h> 441.1Srkujawa 451.1Srkujawa#include <machine/cpu.h> 461.1Srkujawa 471.1Srkujawa#include <amiga/dev/zbusvar.h> 481.2Srkujawa#include <amiga/dev/z3rambdvar.h> 491.1Srkujawa 501.1Srkujawa#include <dev/altmem/altmemvar.h> 511.1Srkujawa 521.1Srkujawastatic int z3rambd_match(device_t, cfdata_t , void *); 531.1Srkujawastatic void z3rambd_attach(device_t, device_t, void *); 541.1Srkujawa 551.1Srkujawastatic int z3rambd_altmem_print(void *, const char *); 561.1Srkujawa 571.1Srkujawastatic void z3rambd_altmem_strategy(void *, struct buf *); 581.1Srkujawastatic size_t z3rambd_altmem_getsize(void *); 591.1Srkujawa 601.1Srkujawastatic const struct altmem_memops z3rambd_altmem_memops = { 611.1Srkujawa .getsize = z3rambd_altmem_getsize, 621.1Srkujawa .strategy = z3rambd_altmem_strategy 631.1Srkujawa}; 641.1Srkujawa 651.1SrkujawaCFATTACH_DECL_NEW(z3rambd, sizeof(struct z3rambd_softc), 661.1Srkujawa z3rambd_match, z3rambd_attach, NULL, NULL); 671.1Srkujawa 681.1Srkujawaint 691.1Srkujawaz3rambd_match(device_t parent, cfdata_t cf, void *aux) 701.1Srkujawa{ 711.1Srkujawa struct zbus_args *zap; 721.1Srkujawa zap = aux; 731.1Srkujawa 741.2Srkujawa if (z3rambd_match_id(zap->manid, zap->prodid) > 0) 751.2Srkujawa return 100; 761.1Srkujawa 771.1Srkujawa return 0; 781.1Srkujawa} 791.1Srkujawa 801.1Srkujawavoid 811.1Srkujawaz3rambd_attach(device_t parent, device_t self, void *aux) 821.1Srkujawa{ 831.1Srkujawa struct z3rambd_softc *sc; 841.1Srkujawa struct zbus_args *zap; 851.1Srkujawa struct altmem_attach_args aaa; 861.1Srkujawa 871.1Srkujawa sc = device_private(self); 881.1Srkujawa sc->sc_dev = self; 891.1Srkujawa zap = aux; 901.1Srkujawa 911.1Srkujawa sc->sc_bst.base = (bus_addr_t)zap->va; 921.1Srkujawa sc->sc_bst.absm = &amiga_bus_stride_1; 931.1Srkujawa sc->sc_iot = &sc->sc_bst; 941.1Srkujawa 951.1Srkujawa /* XXX: duh, size of the board does not necessarily equal mem size */ 961.1Srkujawa sc->sc_size = zap->size; 971.1Srkujawa 981.2Srkujawa if (zap->prodid == ZORRO_PRODID_ZORRAM) 991.2Srkujawa aprint_normal(": AmigaKit ZorRAM / Individual Computers BigRamPlus\n"); 1001.2Srkujawa else if (zap->prodid == ZORRO_PRODID_3128) 1011.2Srkujawa aprint_normal(": DKB 3128\n"); 1021.2Srkujawa else if (zap->prodid == ZORRO_PRODID_FLZ3MEM) 1031.2Srkujawa aprint_normal(": FastLane Z3 memory\n"); 1041.2Srkujawa else 1051.2Srkujawa aprint_normal("\n"); 1061.1Srkujawa 1071.1Srkujawa if (bus_space_map(sc->sc_iot, 0, sc->sc_size, 0, 1081.1Srkujawa &sc->sc_ioh)) { 1091.1Srkujawa aprint_error_dev(sc->sc_dev, "can't map the RAM\n"); 1101.1Srkujawa } 1111.1Srkujawa 1121.1Srkujawa sc->sc_va = bus_space_vaddr(sc->sc_iot, sc->sc_ioh); 1131.1Srkujawa 1141.1Srkujawa aaa.cookie = sc; 1151.1Srkujawa aaa.memops = &z3rambd_altmem_memops; 1161.5Sthorpej config_found(self, &aaa, z3rambd_altmem_print, CFARGS_NONE); 1171.1Srkujawa} 1181.1Srkujawa 1191.1Srkujawastatic int 1201.1Srkujawaz3rambd_altmem_print(void *aux, const char *pnp) 1211.1Srkujawa{ 1221.1Srkujawa if (pnp) 1231.1Srkujawa aprint_normal("altmem at %s", pnp); 1241.1Srkujawa 1251.1Srkujawa return UNCONF; 1261.1Srkujawa} 1271.1Srkujawa 1281.1Srkujawa/* XXX: should be rewritten using bus_space_read_region? */ 1291.1Srkujawastatic void 1301.1Srkujawaz3rambd_altmem_strategy(void *aux, struct buf *bp) 1311.1Srkujawa{ 1321.1Srkujawa struct z3rambd_softc *sc = aux; 1331.1Srkujawa void *addr; 1341.3Sphx size_t off; 1351.1Srkujawa int s; 1361.1Srkujawa 1371.1Srkujawa bp->b_resid = bp->b_bcount; 1381.1Srkujawa off = bp->b_blkno << DEV_BSHIFT; 1391.1Srkujawa 1401.1Srkujawa s = splbio(); 1411.1Srkujawa 1421.1Srkujawa addr = (char *)((char*)sc->sc_va + off); 1431.1Srkujawa#ifdef Z3RAMBD_DEBUG 1441.1Srkujawa aprint_normal_dev(sc->sc_dev,"stratetgy at %x %x\n", (bus_addr_t) addr, 1451.1Srkujawa (bus_addr_t) kvtop(addr)); 1461.1Srkujawa#endif /* Z3RAMBD_DEBUG */ 1471.1Srkujawa 1481.1Srkujawa if (bp->b_flags & B_READ) 1491.1Srkujawa memcpy((char *)bp->b_data, addr, bp->b_resid); 1501.1Srkujawa else 1511.1Srkujawa memcpy(addr, (char *)bp->b_data, bp->b_resid); 1521.1Srkujawa 1531.1Srkujawa splx(s); 1541.1Srkujawa} 1551.1Srkujawa 1561.1Srkujawastatic size_t 1571.1Srkujawaz3rambd_altmem_getsize(void *aux) 1581.1Srkujawa{ 1591.1Srkujawa struct z3rambd_softc *sc = aux; 1601.1Srkujawa return sc->sc_size; 1611.1Srkujawa} 162