z3rambd.c revision 1.1
11.1Srkujawa/* $NetBSD: z3rambd.c,v 1.1 2012/11/25 23:33:56 rkujawa 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.1Srkujawa__KERNEL_RCSID(0, "$NetBSD: z3rambd.c,v 1.1 2012/11/25 23:33:56 rkujawa Exp $"); 341.1Srkujawa 351.1Srkujawa/* 361.1Srkujawa * Z3 RAM virtual block device. Supports ZorRAM so far. 371.1Srkujawa */ 381.1Srkujawa 391.1Srkujawa#include <sys/param.h> 401.1Srkujawa#include <sys/device.h> 411.1Srkujawa#include <sys/malloc.h> 421.1Srkujawa#include <sys/socket.h> 431.1Srkujawa#include <sys/systm.h> 441.1Srkujawa#include <sys/bus.h> 451.1Srkujawa 461.1Srkujawa#include <machine/cpu.h> 471.1Srkujawa 481.1Srkujawa#include <amiga/dev/zbusvar.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.1Srkujawastruct z3rambd_softc { 661.1Srkujawa device_t sc_dev; 671.1Srkujawa 681.1Srkujawa size_t sc_size; 691.1Srkujawa 701.1Srkujawa struct bus_space_tag sc_bst; 711.1Srkujawa 721.1Srkujawa bus_space_tag_t sc_iot; 731.1Srkujawa bus_space_handle_t sc_ioh; 741.1Srkujawa 751.1Srkujawa void *sc_va; 761.1Srkujawa}; 771.1Srkujawa 781.1SrkujawaCFATTACH_DECL_NEW(z3rambd, sizeof(struct z3rambd_softc), 791.1Srkujawa z3rambd_match, z3rambd_attach, NULL, NULL); 801.1Srkujawa 811.1Srkujawa#define ZORRO_MANID_E3B 3643 821.1Srkujawa#define ZORRO_PRODID_ZORRAM 32 831.1Srkujawa 841.1Srkujawaint 851.1Srkujawaz3rambd_match(device_t parent, cfdata_t cf, void *aux) 861.1Srkujawa{ 871.1Srkujawa struct zbus_args *zap; 881.1Srkujawa zap = aux; 891.1Srkujawa 901.1Srkujawa if (zap->manid == ZORRO_MANID_E3B) 911.1Srkujawa if (zap->prodid == ZORRO_PRODID_ZORRAM) 921.1Srkujawa return 100; 931.1Srkujawa 941.1Srkujawa return 0; 951.1Srkujawa} 961.1Srkujawa 971.1Srkujawavoid 981.1Srkujawaz3rambd_attach(device_t parent, device_t self, void *aux) 991.1Srkujawa{ 1001.1Srkujawa struct z3rambd_softc *sc; 1011.1Srkujawa struct zbus_args *zap; 1021.1Srkujawa struct altmem_attach_args aaa; 1031.1Srkujawa 1041.1Srkujawa sc = device_private(self); 1051.1Srkujawa sc->sc_dev = self; 1061.1Srkujawa zap = aux; 1071.1Srkujawa 1081.1Srkujawa sc->sc_bst.base = (bus_addr_t)zap->va; 1091.1Srkujawa sc->sc_bst.absm = &amiga_bus_stride_1; 1101.1Srkujawa sc->sc_iot = &sc->sc_bst; 1111.1Srkujawa 1121.1Srkujawa /* XXX: duh, size of the board does not necessarily equal mem size */ 1131.1Srkujawa sc->sc_size = zap->size; 1141.1Srkujawa 1151.1Srkujawa aprint_normal(": AmigaKit ZorRAM\n"); 1161.1Srkujawa 1171.1Srkujawa if (bus_space_map(sc->sc_iot, 0, sc->sc_size, 0, 1181.1Srkujawa &sc->sc_ioh)) { 1191.1Srkujawa aprint_error_dev(sc->sc_dev, "can't map the RAM\n"); 1201.1Srkujawa } 1211.1Srkujawa 1221.1Srkujawa sc->sc_va = bus_space_vaddr(sc->sc_iot, sc->sc_ioh); 1231.1Srkujawa 1241.1Srkujawa aaa.cookie = sc; 1251.1Srkujawa aaa.memops = &z3rambd_altmem_memops; 1261.1Srkujawa config_found_ia(self, "altmemdev", &aaa, z3rambd_altmem_print); 1271.1Srkujawa} 1281.1Srkujawa 1291.1Srkujawastatic int 1301.1Srkujawaz3rambd_altmem_print(void *aux, const char *pnp) 1311.1Srkujawa{ 1321.1Srkujawa if (pnp) 1331.1Srkujawa aprint_normal("altmem at %s", pnp); 1341.1Srkujawa 1351.1Srkujawa return UNCONF; 1361.1Srkujawa} 1371.1Srkujawa 1381.1Srkujawa/* XXX: should be rewritten using bus_space_read_region? */ 1391.1Srkujawastatic void 1401.1Srkujawaz3rambd_altmem_strategy(void *aux, struct buf *bp) 1411.1Srkujawa{ 1421.1Srkujawa struct z3rambd_softc *sc = aux; 1431.1Srkujawa void *addr; 1441.1Srkujawa size_t off, bpos; 1451.1Srkujawa int s; 1461.1Srkujawa 1471.1Srkujawa bpos = 0; 1481.1Srkujawa 1491.1Srkujawa bp->b_resid = bp->b_bcount; 1501.1Srkujawa off = bp->b_blkno << DEV_BSHIFT; 1511.1Srkujawa 1521.1Srkujawa s = splbio(); 1531.1Srkujawa 1541.1Srkujawa addr = (char *)((char*)sc->sc_va + off); 1551.1Srkujawa#ifdef Z3RAMBD_DEBUG 1561.1Srkujawa aprint_normal_dev(sc->sc_dev,"stratetgy at %x %x\n", (bus_addr_t) addr, 1571.1Srkujawa (bus_addr_t) kvtop(addr)); 1581.1Srkujawa#endif /* Z3RAMBD_DEBUG */ 1591.1Srkujawa 1601.1Srkujawa if (bp->b_flags & B_READ) 1611.1Srkujawa memcpy((char *)bp->b_data, addr, bp->b_resid); 1621.1Srkujawa else 1631.1Srkujawa memcpy(addr, (char *)bp->b_data, bp->b_resid); 1641.1Srkujawa 1651.1Srkujawa splx(s); 1661.1Srkujawa} 1671.1Srkujawa 1681.1Srkujawastatic size_t 1691.1Srkujawaz3rambd_altmem_getsize(void *aux) 1701.1Srkujawa{ 1711.1Srkujawa struct z3rambd_softc *sc = aux; 1721.1Srkujawa return sc->sc_size; 1731.1Srkujawa} 1741.1Srkujawa 175