z3rambd.c revision 1.3
11.3Sphx/* $NetBSD: z3rambd.c,v 1.3 2015/06/01 17:09:46 phx 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.3Sphx__KERNEL_RCSID(0, "$NetBSD: z3rambd.c,v 1.3 2015/06/01 17:09:46 phx 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/malloc.h> 431.1Srkujawa#include <sys/socket.h> 441.1Srkujawa#include <sys/systm.h> 451.1Srkujawa 461.1Srkujawa#include <machine/cpu.h> 471.1Srkujawa 481.1Srkujawa#include <amiga/dev/zbusvar.h> 491.2Srkujawa#include <amiga/dev/z3rambdvar.h> 501.1Srkujawa 511.1Srkujawa#include <dev/altmem/altmemvar.h> 521.1Srkujawa 531.1Srkujawastatic int z3rambd_match(device_t, cfdata_t , void *); 541.1Srkujawastatic void z3rambd_attach(device_t, device_t, void *); 551.1Srkujawa 561.1Srkujawastatic int z3rambd_altmem_print(void *, const char *); 571.1Srkujawa 581.1Srkujawastatic void z3rambd_altmem_strategy(void *, struct buf *); 591.1Srkujawastatic size_t z3rambd_altmem_getsize(void *); 601.1Srkujawa 611.1Srkujawastatic const struct altmem_memops z3rambd_altmem_memops = { 621.1Srkujawa .getsize = z3rambd_altmem_getsize, 631.1Srkujawa .strategy = z3rambd_altmem_strategy 641.1Srkujawa}; 651.1Srkujawa 661.1SrkujawaCFATTACH_DECL_NEW(z3rambd, sizeof(struct z3rambd_softc), 671.1Srkujawa z3rambd_match, z3rambd_attach, NULL, NULL); 681.1Srkujawa 691.1Srkujawaint 701.1Srkujawaz3rambd_match(device_t parent, cfdata_t cf, void *aux) 711.1Srkujawa{ 721.1Srkujawa struct zbus_args *zap; 731.1Srkujawa zap = aux; 741.1Srkujawa 751.2Srkujawa if (z3rambd_match_id(zap->manid, zap->prodid) > 0) 761.2Srkujawa return 100; 771.1Srkujawa 781.1Srkujawa return 0; 791.1Srkujawa} 801.1Srkujawa 811.1Srkujawavoid 821.1Srkujawaz3rambd_attach(device_t parent, device_t self, void *aux) 831.1Srkujawa{ 841.1Srkujawa struct z3rambd_softc *sc; 851.1Srkujawa struct zbus_args *zap; 861.1Srkujawa struct altmem_attach_args aaa; 871.1Srkujawa 881.1Srkujawa sc = device_private(self); 891.1Srkujawa sc->sc_dev = self; 901.1Srkujawa zap = aux; 911.1Srkujawa 921.1Srkujawa sc->sc_bst.base = (bus_addr_t)zap->va; 931.1Srkujawa sc->sc_bst.absm = &amiga_bus_stride_1; 941.1Srkujawa sc->sc_iot = &sc->sc_bst; 951.1Srkujawa 961.1Srkujawa /* XXX: duh, size of the board does not necessarily equal mem size */ 971.1Srkujawa sc->sc_size = zap->size; 981.1Srkujawa 991.2Srkujawa if (zap->prodid == ZORRO_PRODID_ZORRAM) 1001.2Srkujawa aprint_normal(": AmigaKit ZorRAM / Individual Computers BigRamPlus\n"); 1011.2Srkujawa else if (zap->prodid == ZORRO_PRODID_3128) 1021.2Srkujawa aprint_normal(": DKB 3128\n"); 1031.2Srkujawa else if (zap->prodid == ZORRO_PRODID_FLZ3MEM) 1041.2Srkujawa aprint_normal(": FastLane Z3 memory\n"); 1051.2Srkujawa else 1061.2Srkujawa aprint_normal("\n"); 1071.1Srkujawa 1081.1Srkujawa if (bus_space_map(sc->sc_iot, 0, sc->sc_size, 0, 1091.1Srkujawa &sc->sc_ioh)) { 1101.1Srkujawa aprint_error_dev(sc->sc_dev, "can't map the RAM\n"); 1111.1Srkujawa } 1121.1Srkujawa 1131.1Srkujawa sc->sc_va = bus_space_vaddr(sc->sc_iot, sc->sc_ioh); 1141.1Srkujawa 1151.1Srkujawa aaa.cookie = sc; 1161.1Srkujawa aaa.memops = &z3rambd_altmem_memops; 1171.1Srkujawa config_found_ia(self, "altmemdev", &aaa, z3rambd_altmem_print); 1181.1Srkujawa} 1191.1Srkujawa 1201.1Srkujawastatic int 1211.1Srkujawaz3rambd_altmem_print(void *aux, const char *pnp) 1221.1Srkujawa{ 1231.1Srkujawa if (pnp) 1241.1Srkujawa aprint_normal("altmem at %s", pnp); 1251.1Srkujawa 1261.1Srkujawa return UNCONF; 1271.1Srkujawa} 1281.1Srkujawa 1291.1Srkujawa/* XXX: should be rewritten using bus_space_read_region? */ 1301.1Srkujawastatic void 1311.1Srkujawaz3rambd_altmem_strategy(void *aux, struct buf *bp) 1321.1Srkujawa{ 1331.1Srkujawa struct z3rambd_softc *sc = aux; 1341.1Srkujawa void *addr; 1351.3Sphx size_t off; 1361.1Srkujawa int s; 1371.1Srkujawa 1381.1Srkujawa bp->b_resid = bp->b_bcount; 1391.1Srkujawa off = bp->b_blkno << DEV_BSHIFT; 1401.1Srkujawa 1411.1Srkujawa s = splbio(); 1421.1Srkujawa 1431.1Srkujawa addr = (char *)((char*)sc->sc_va + off); 1441.1Srkujawa#ifdef Z3RAMBD_DEBUG 1451.1Srkujawa aprint_normal_dev(sc->sc_dev,"stratetgy at %x %x\n", (bus_addr_t) addr, 1461.1Srkujawa (bus_addr_t) kvtop(addr)); 1471.1Srkujawa#endif /* Z3RAMBD_DEBUG */ 1481.1Srkujawa 1491.1Srkujawa if (bp->b_flags & B_READ) 1501.1Srkujawa memcpy((char *)bp->b_data, addr, bp->b_resid); 1511.1Srkujawa else 1521.1Srkujawa memcpy(addr, (char *)bp->b_data, bp->b_resid); 1531.1Srkujawa 1541.1Srkujawa splx(s); 1551.1Srkujawa} 1561.1Srkujawa 1571.1Srkujawastatic size_t 1581.1Srkujawaz3rambd_altmem_getsize(void *aux) 1591.1Srkujawa{ 1601.1Srkujawa struct z3rambd_softc *sc = aux; 1611.1Srkujawa return sc->sc_size; 1621.1Srkujawa} 163