From owner-svn-src-user@FreeBSD.ORG Fri Jan 20 12:51:59 2012 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 6CF22106566B; Fri, 20 Jan 2012 12:51:59 +0000 (UTC) (envelope-from luigi@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 3D3568FC0C; Fri, 20 Jan 2012 12:51:59 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q0KCpx5m042260; Fri, 20 Jan 2012 12:51:59 GMT (envelope-from luigi@svn.freebsd.org) Received: (from luigi@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q0KCpxe3042259; Fri, 20 Jan 2012 12:51:59 GMT (envelope-from luigi@svn.freebsd.org) Message-Id: <201201201251.q0KCpxe3042259@svn.freebsd.org> From: Luigi Rizzo Date: Fri, 20 Jan 2012 12:51:59 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230375 - user/luigi/netmap X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 20 Jan 2012 12:51:59 -0000 Author: luigi Date: Fri Jan 20 12:51:58 2012 New Revision: 230375 URL: http://svn.freebsd.org/changeset/base/230375 Log: stale. lets rebuild a new one Deleted: user/luigi/netmap/ From owner-svn-src-user@FreeBSD.ORG Fri Jan 20 12:52:39 2012 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 2AE3F10656D2; Fri, 20 Jan 2012 12:52:39 +0000 (UTC) (envelope-from luigi@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id F099B8FC13; Fri, 20 Jan 2012 12:52:38 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q0KCqcN6042330; Fri, 20 Jan 2012 12:52:38 GMT (envelope-from luigi@svn.freebsd.org) Received: (from luigi@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q0KCqcLr042329; Fri, 20 Jan 2012 12:52:38 GMT (envelope-from luigi@svn.freebsd.org) Message-Id: <201201201252.q0KCqcLr042329@svn.freebsd.org> From: Luigi Rizzo Date: Fri, 20 Jan 2012 12:52:38 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230376 - user/luigi/netmap X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 20 Jan 2012 12:52:39 -0000 Author: luigi Date: Fri Jan 20 12:52:38 2012 New Revision: 230376 URL: http://svn.freebsd.org/changeset/base/230376 Log: and this is the new one... Added: - copied from r230375, head/ Directory Properties: user/luigi/netmap/ (props changed) From owner-svn-src-user@FreeBSD.ORG Fri Jan 20 13:10:41 2012 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 5CB1B106564A; Fri, 20 Jan 2012 13:10:41 +0000 (UTC) (envelope-from luigi@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 465DD8FC08; Fri, 20 Jan 2012 13:10:41 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q0KDAfwc042968; Fri, 20 Jan 2012 13:10:41 GMT (envelope-from luigi@svn.freebsd.org) Received: (from luigi@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q0KDAfEb042963; Fri, 20 Jan 2012 13:10:41 GMT (envelope-from luigi@svn.freebsd.org) Message-Id: <201201201310.q0KDAfEb042963@svn.freebsd.org> From: Luigi Rizzo Date: Fri, 20 Jan 2012 13:10:41 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230378 - in user/luigi/netmap/sys/dev: ixgbe netmap X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 20 Jan 2012 13:10:41 -0000 Author: luigi Date: Fri Jan 20 13:10:40 2012 New Revision: 230378 URL: http://svn.freebsd.org/changeset/base/230378 Log: snapshot of current code: - implement more aggressive interrupt throttling on the tx queues - pass rx interrupt mitigation up to the reading process - make interrupt_rate a writable sysctl parameter - correct the value used for computations of interrupt rate (it was off by a factor of 2) Modified: user/luigi/netmap/sys/dev/ixgbe/ixgbe.c user/luigi/netmap/sys/dev/netmap/ixgbe_netmap.h user/luigi/netmap/sys/dev/netmap/netmap.c user/luigi/netmap/sys/dev/netmap/netmap_kern.h Modified: user/luigi/netmap/sys/dev/ixgbe/ixgbe.c ============================================================================== --- user/luigi/netmap/sys/dev/ixgbe/ixgbe.c Fri Jan 20 12:59:12 2012 (r230377) +++ user/luigi/netmap/sys/dev/ixgbe/ixgbe.c Fri Jan 20 13:10:40 2012 (r230378) @@ -229,10 +229,10 @@ MODULE_DEPEND(ixgbe, ether, 1, 1, 1); ** is varied over time based on the ** traffic for that interrupt vector */ -static int ixgbe_enable_aim = TRUE; +static int ixgbe_enable_aim = 0; // TRUE; TUNABLE_INT("hw.ixgbe.enable_aim", &ixgbe_enable_aim); -static int ixgbe_max_interrupt_rate = (8000000 / IXGBE_LOW_LATENCY); +static int ixgbe_max_interrupt_rate = (8000000 / 250); // IXGBE_LOW_LATENCY); TUNABLE_INT("hw.ixgbe.max_interrupt_rate", &ixgbe_max_interrupt_rate); /* How many packets rxeof tries to clean at a time */ @@ -3385,7 +3385,11 @@ ixgbe_txeof(struct tx_ring *txr) #ifdef DEV_NETMAP if (ifp->if_capenable & IFCAP_NETMAP) { struct netmap_adapter *na = NA(ifp); + struct netmap_kring *kring = &na->tx_rings[txr->me]; + tx_desc = (struct ixgbe_legacy_tx_desc *)txr->tx_base; + bus_dmamap_sync(txr->txdma.dma_tag, txr->txdma.dma_map, + BUS_DMASYNC_POSTREAD); /* * In netmap mode, all the work is done in the context * of the client thread. Interrupt handlers only wake up @@ -3395,12 +3399,17 @@ ixgbe_txeof(struct tx_ring *txr) * release and re-acquire txlock to avoid deadlocks. * XXX see if we can find a better way. */ - selwakeuppri(&na->tx_rings[txr->me].si, PI_NET); - IXGBE_TX_UNLOCK(txr); - IXGBE_CORE_LOCK(adapter); - selwakeuppri(&na->tx_rings[na->num_queues + 1].si, PI_NET); - IXGBE_CORE_UNLOCK(adapter); - IXGBE_TX_LOCK(txr); + if (!netmap_mitigate || + (kring->nr_kflags < kring->nkr_num_slots && + tx_desc[kring->nr_kflags].upper.fields.status & IXGBE_TXD_STAT_DD)) { + kring->nr_kflags = kring->nkr_num_slots; // invalidate + selwakeuppri(&na->tx_rings[txr->me].si, PI_NET); + IXGBE_TX_UNLOCK(txr); + IXGBE_CORE_LOCK(adapter); + selwakeuppri(&na->tx_rings[na->num_queues + 1].si, PI_NET); + IXGBE_CORE_UNLOCK(adapter); + IXGBE_TX_LOCK(txr); + } return FALSE; } #endif /* DEV_NETMAP */ @@ -4302,6 +4311,7 @@ ixgbe_rxeof(struct ix_queue *que, int co */ struct netmap_adapter *na = NA(ifp); + na->rx_rings[rxr->me].nr_kflags |= NKR_PENDINTR; selwakeuppri(&na->rx_rings[rxr->me].si, PI_NET); IXGBE_RX_UNLOCK(rxr); IXGBE_CORE_LOCK(adapter); @@ -4830,7 +4840,7 @@ ixgbe_configure_ivars(struct adapter *ad u32 newitr; if (ixgbe_max_interrupt_rate > 0) - newitr = (8000000 / ixgbe_max_interrupt_rate) & 0x0FF8; + newitr = (4000000 / ixgbe_max_interrupt_rate) & 0x0FF8; else newitr = 0; @@ -5193,12 +5203,21 @@ ixgbe_sysctl_interrupt_rate_handler(SYSC reg = IXGBE_READ_REG(&que->adapter->hw, IXGBE_EITR(que->msix)); usec = ((reg & 0x0FF8) >> 3); if (usec > 0) - rate = 1000000 / usec; + rate = 500000 / usec; else rate = 0; error = sysctl_handle_int(oidp, &rate, 0, req); if (error || !req->newptr) return error; + reg &= ~0xfff; /* default, no limitation */ + ixgbe_max_interrupt_rate = 0; + if (rate > 0 && rate < 500000) { + if (rate < 1000) + rate = 1000; + ixgbe_max_interrupt_rate = rate; + reg |= ((4000000/rate) & 0xff8 ); + } + IXGBE_WRITE_REG(&que->adapter->hw, IXGBE_EITR(que->msix), reg); return 0; } @@ -5252,10 +5271,13 @@ ixgbe_add_hw_stats(struct adapter *adapt queue_list = SYSCTL_CHILDREN(queue_node); SYSCTL_ADD_PROC(ctx, queue_list, OID_AUTO, "interrupt_rate", - CTLTYPE_UINT | CTLFLAG_RD, &adapter->queues[i], + CTLTYPE_UINT | CTLFLAG_RW, &adapter->queues[i], sizeof(&adapter->queues[i]), ixgbe_sysctl_interrupt_rate_handler, "IU", "Interrupt Rate"); + SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "irqs", + CTLFLAG_RD, &(adapter->queues[i].irqs), + "irqs on this queue"); SYSCTL_ADD_PROC(ctx, queue_list, OID_AUTO, "txd_head", CTLTYPE_UINT | CTLFLAG_RD, txr, sizeof(txr), ixgbe_sysctl_tdh_handler, "IU", Modified: user/luigi/netmap/sys/dev/netmap/ixgbe_netmap.h ============================================================================== --- user/luigi/netmap/sys/dev/netmap/ixgbe_netmap.h Fri Jan 20 12:59:12 2012 (r230377) +++ user/luigi/netmap/sys/dev/netmap/ixgbe_netmap.h Fri Jan 20 13:10:40 2012 (r230378) @@ -191,6 +191,10 @@ fail: * (this is also true for every use of ring in the kernel). * * ring->avail is never used, only checked for bogus values. + * + * If do_lock is set, it means the function has been called from the ioctl + * handler: in this particular case, do_lock has also the special meaning of + * force the update of NIC registers */ static int ixgbe_netmap_txsync(void *a, u_int ring_nr, int do_lock) @@ -292,10 +296,11 @@ ring_reset: * need this. */ curr->read.buffer_addr = htole64(paddr); - curr->read.olinfo_status = 0; + curr->read.olinfo_status = htole32(len << IXGBE_ADVTXD_PAYLEN_SHIFT); curr->read.cmd_type_len = htole32(txr->txd_cmd | len | (IXGBE_ADVTXD_DTYP_DATA | + IXGBE_ADVTXD_DCMD_DEXT | // XXX IXGBE_ADVTXD_DCMD_IFCS | IXGBE_TXD_CMD_EOP | flags) ); /* If the buffer has changed, unload and reload map @@ -336,7 +341,29 @@ ring_reset: * (meaning that probably the caller really wanted to check * for completed transmissions). */ - if (n == 0 || kring->nr_hwavail < 1) { + if (do_lock) { + kring->nr_kflags = kring->nkr_num_slots; // filter interrupts + j = 1; // force read + } else if (kring->nr_hwavail > 0) { // no need to block + kring->nr_kflags = kring->nkr_num_slots; // filter interrupts + j = 0; + } else { + struct ixgbe_legacy_tx_desc *txd = (struct ixgbe_legacy_tx_desc *)txr->tx_base; + + // wake me up every half ring (more or less) + j = txr->next_to_clean + kring->nkr_num_slots/2; + if (j >= kring->nkr_num_slots) + j -= kring->nkr_num_slots; + // round to the closest with dd set + j= (j < kring->nkr_num_slots / 4 || j >= kring->nkr_num_slots*3/4) ? + 0 : report_frequency; + kring->nr_kflags = j; // remember where to look at in the interrupt + // now check if we have data ready + j = txd[j].upper.fields.status & IXGBE_TXD_STAT_DD; + } + if (!j) { + netmap_skip_txsync++; + } else { int delta; /* @@ -362,6 +389,7 @@ ring_reset: /* some tx completed, increment avail */ if (delta < 0) delta += kring->nkr_num_slots; + netmap_delta[ring_nr] = (netmap_delta[ring_nr] * 15 + delta)/16; txr->next_to_clean = l; kring->nr_hwavail += delta; if (kring->nr_hwavail > lim) @@ -391,6 +419,8 @@ ring_reset: * We must subtract the newly consumed slots (cur - nr_hwcur) * from nr_hwavail, make the descriptors available for the next reads, * and set kring->nr_hwcur = ring->cur and ring->avail = kring->nr_hwavail. + * + * do_lock has a special meaning: please refer to txsync. */ static int ixgbe_netmap_rxsync(void *a, u_int ring_nr, int do_lock) @@ -401,6 +431,7 @@ ixgbe_netmap_rxsync(void *a, u_int ring_ struct netmap_kring *kring = &na->rx_rings[ring_nr]; struct netmap_ring *ring = kring->ring; int j, k, l, n, lim = kring->nkr_num_slots - 1; + int force_update = do_lock || kring->nr_kflags & NKR_PENDINTR; k = ring->cur; /* cache and check value, same as in txsync */ n = k - kring->nr_hwcur; @@ -437,12 +468,14 @@ ixgbe_netmap_rxsync(void *a, u_int ring_ if (j > lim) j -= lim + 1; + if (force_update) { for (n = 0; ; n++) { union ixgbe_adv_rx_desc *curr = &rxr->rx_base[l]; uint32_t staterr = le32toh(curr->wb.upper.status_error); if ((staterr & IXGBE_RXD_STAT_DD) == 0) break; + // XXX add -4 if crcstrip ring->slot[j].len = le16toh(curr->wb.upper.length); bus_dmamap_sync(rxr->ptag, rxr->rx_buffers[l].pmap, BUS_DMASYNC_POSTREAD); @@ -453,6 +486,8 @@ ixgbe_netmap_rxsync(void *a, u_int ring_ rxr->next_to_check = l; kring->nr_hwavail += n; } + kring->nr_kflags &= ~NKR_PENDINTR; + } /* * Skip past packets that userspace has already processed Modified: user/luigi/netmap/sys/dev/netmap/netmap.c ============================================================================== --- user/luigi/netmap/sys/dev/netmap/netmap.c Fri Jan 20 12:59:12 2012 (r230377) +++ user/luigi/netmap/sys/dev/netmap/netmap.c Fri Jan 20 13:10:40 2012 (r230378) @@ -146,6 +146,17 @@ SYSCTL_INT(_dev_netmap, OID_AUTO, total_ CTLFLAG_RD, &nm_buf_pool.total_buffers, 0, "total_buffers"); SYSCTL_INT(_dev_netmap, OID_AUTO, free_buffers, CTLFLAG_RD, &nm_buf_pool.free, 0, "free_buffers"); +int netmap_mitigate = 1; +SYSCTL_INT(_dev_netmap, OID_AUTO, mitigate, CTLFLAG_RW, &netmap_mitigate, 0, ""); +int netmap_skip_txsync; +SYSCTL_INT(_dev_netmap, OID_AUTO, skip_txsync, CTLFLAG_RW, &netmap_skip_txsync, 0, ""); +int netmap_skip_rxsync; +SYSCTL_INT(_dev_netmap, OID_AUTO, skip_rxsync, CTLFLAG_RW, &netmap_skip_rxsync, 0, ""); +int netmap_delta[8]; +SYSCTL_INT(_dev_netmap, OID_AUTO, delta0, CTLFLAG_RW, &netmap_delta[0], 0, ""); +SYSCTL_INT(_dev_netmap, OID_AUTO, delta1, CTLFLAG_RW, &netmap_delta[1], 0, ""); +SYSCTL_INT(_dev_netmap, OID_AUTO, delta2, CTLFLAG_RW, &netmap_delta[2], 0, ""); +SYSCTL_INT(_dev_netmap, OID_AUTO, delta3, CTLFLAG_RW, &netmap_delta[3], 0, ""); /* * Allocate n buffers from the ring, and fill the slot. Modified: user/luigi/netmap/sys/dev/netmap/netmap_kern.h ============================================================================== --- user/luigi/netmap/sys/dev/netmap/netmap_kern.h Fri Jan 20 12:59:12 2012 (r230377) +++ user/luigi/netmap/sys/dev/netmap/netmap_kern.h Fri Jan 20 13:10:40 2012 (r230378) @@ -65,7 +65,8 @@ struct netmap_kring { struct netmap_ring *ring; u_int nr_hwcur; int nr_hwavail; - u_int nr_kflags; + u_int nr_kflags; /* private driver flags */ +#define NKR_PENDINTR 0x1 // Pending interrupt. u_int nkr_num_slots; int nkr_hwofs; /* offset between NIC and netmap ring */ @@ -171,6 +172,9 @@ struct netmap_slot *netmap_reset(struct enum txrx tx, int n, u_int new_cur); int netmap_ring_reinit(struct netmap_kring *); +extern int netmap_mitigate; +extern int netmap_skip_txsync, netmap_skip_rxsync; +extern int netmap_delta[8]; extern u_int netmap_total_buffers; extern char *netmap_buffer_base; extern int netmap_verbose; // XXX debugging From owner-svn-src-user@FreeBSD.ORG Sat Jan 21 17:59:50 2012 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id EA938106566C; Sat, 21 Jan 2012 17:59:50 +0000 (UTC) (envelope-from nwhitehorn@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id D41798FC0A; Sat, 21 Jan 2012 17:59:50 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q0LHxo9J002998; Sat, 21 Jan 2012 17:59:50 GMT (envelope-from nwhitehorn@svn.freebsd.org) Received: (from nwhitehorn@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q0LHxocs002995; Sat, 21 Jan 2012 17:59:50 GMT (envelope-from nwhitehorn@svn.freebsd.org) Message-Id: <201201211759.q0LHxocs002995@svn.freebsd.org> From: Nathan Whitehorn Date: Sat, 21 Jan 2012 17:59:50 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230428 - in user/ed/newcons/sys: conf dev/vt/hw/ofwfb X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 21 Jan 2012 17:59:51 -0000 Author: nwhitehorn Date: Sat Jan 21 17:59:50 2012 New Revision: 230428 URL: http://svn.freebsd.org/changeset/base/230428 Log: Add a vt(4) framebuffer for Open Firmware linear framebuffer devices (i.e. all graphics on PowerPC Apple systems). This will also work on some sparc64 graphics hardware with a small amount of modification. Added: user/ed/newcons/sys/dev/vt/hw/ofwfb/ user/ed/newcons/sys/dev/vt/hw/ofwfb/ofwfb.c Modified: user/ed/newcons/sys/conf/files.powerpc Modified: user/ed/newcons/sys/conf/files.powerpc ============================================================================== --- user/ed/newcons/sys/conf/files.powerpc Sat Jan 21 17:50:14 2012 (r230427) +++ user/ed/newcons/sys/conf/files.powerpc Sat Jan 21 17:59:50 2012 (r230428) @@ -30,7 +30,7 @@ dev/hwpmc/hwpmc_powerpc.c optional hwpmc dev/iicbus/ad7417.c optional ad7417 powermac dev/iicbus/ds1775.c optional ds1775 powermac dev/iicbus/max6690.c optional max6690 powermac -dev/kbd/kbd.c optional sc +dev/kbd/kbd.c optional sc | vt dev/ofw/openfirm.c optional aim | fdt dev/ofw/openfirmio.c optional aim | fdt dev/ofw/ofw_bus_if.m optional aim | fdt @@ -56,6 +56,7 @@ dev/syscons/scvtb.c optional sc dev/tsec/if_tsec.c optional tsec dev/tsec/if_tsec_fdt.c optional tsec fdt dev/uart/uart_cpu_powerpc.c optional uart aim +dev/vt/hw/ofwfb/ofwfb.c optional vt aim kern/kern_clocksource.c standard kern/syscalls.c optional ktr libkern/ashldi3.c optional powerpc Added: user/ed/newcons/sys/dev/vt/hw/ofwfb/ofwfb.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ user/ed/newcons/sys/dev/vt/hw/ofwfb/ofwfb.c Sat Jan 21 17:59:50 2012 (r230428) @@ -0,0 +1,238 @@ +/*- + * Copyright (c) 2011 Nathan Whitehorn + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD: user/ed/newcons/sys/dev/vt/hw/ofwfb/ofwfb.c 219888 2011-03-22 21:31:31Z ed $"); + +#include +#include +#include + +#include + +#include +#include + +#include + +#include +#include +#include + +struct ofwfb_softc { + phandle_t sc_node; + + intptr_t sc_addr; + int sc_depth; + int sc_stride; +}; + +static vd_init_t ofwfb_init; +static vd_blank_t ofwfb_blank; +static vd_bitblt_t ofwfb_bitblt; + +static const struct vt_driver vt_ofwfb_driver = { + .vd_init = ofwfb_init, + .vd_blank = ofwfb_blank, + .vd_bitblt = ofwfb_bitblt, +}; + +static struct ofwfb_softc ofwfb_conssoftc; +VT_CONSDEV_DECLARE(vt_ofwfb_driver, 1600, 1200, &ofwfb_conssoftc); + +static const uint32_t colormap[] = { + 0x00000000, /* Black */ + 0x00ff0000, /* Red */ + 0x0000ff00, /* Green */ + 0x00c0c000, /* Brown */ + 0x000000ff, /* Blue */ + 0x00c000c0, /* Magenta */ + 0x0000c0c0, /* Cyan */ + 0x00c0c0c0, /* Light grey */ + 0x00808080, /* Dark grey */ + 0x00ff8080, /* Light red */ + 0x0080ff80, /* Light green */ + 0x00ffff80, /* Yellow */ + 0x008080ff, /* Light blue */ + 0x00ff80ff, /* Light magenta */ + 0x0080ffff, /* Light cyan */ + 0x00ffffff, /* White */ +}; + +static void +ofwfb_blank(struct vt_device *vd, term_color_t color) +{ + struct ofwfb_softc *sc = vd->vd_softc; + u_int ofs; + uint32_t c; + + switch (sc->sc_depth) { + case 8: + for (ofs = 0; ofs < sc->sc_stride*vd->vd_height; ofs++) + *(uint8_t *)(sc->sc_addr + ofs) = color; + break; + case 32: + c = colormap[color]; + for (ofs = 0; ofs < sc->sc_stride*vd->vd_height; ofs++) + memcpy((void *)(sc->sc_addr + 4*ofs), &c, 4); + break; + default: + /* panic? */ + break; + } +} + +static void +ofwfb_bitblt(struct vt_device *vd, const uint8_t *src, + vt_axis_t top, vt_axis_t left, unsigned int width, unsigned int height, + term_color_t fg, term_color_t bg) +{ + struct ofwfb_softc *sc = vd->vd_softc; + u_long line; + uint32_t fgc, bgc; + int c; + uint8_t b = 0; + + fgc = colormap[fg]; + bgc = colormap[bg]; + + line = (sc->sc_stride * top) + left * sc->sc_depth/8; + for (; height > 0; height--) { + line += sc->sc_stride; + for (c = 0; c < width; c++) { + if (c % 8 == 0) + b = *src++; + else + b <<= 1; + switch(sc->sc_depth) { + case 8: + *(uint8_t *)(sc->sc_addr + line + c) = + b & 0x80 ? fg : bg; + break; + case 32: + memcpy((void *)(sc->sc_addr + line + c*4), + b & 0x80 ? &fgc : &bgc, 4); + break; + default: + /* panic? */ + break; + } + } + } +} + +static void +ofwfb_initialize(struct vt_device *vd) +{ + struct ofwfb_softc *sc = vd->vd_softc; + char name[64]; + ihandle_t ih; + cell_t depth = 8; + int i, retval; + + /* Open display device, thereby initializing it */ + memset(name, 0, sizeof(name)); + OF_package_to_path(sc->sc_node, name, sizeof(name)); + ih = OF_open(name); + + OF_getprop(sc->sc_node, "depth", &depth, sizeof(depth)); + sc->sc_depth = depth; + + if (sc->sc_depth == 8) { + /* + * Install the ISO6429 colormap - older OFW systems + * don't do this by default + */ + for (i = 0; i < 16; i++) { + OF_call_method("color!", ih, 4, 1, + (colormap[i] >> 16) & 0xff, + (colormap[i] >> 8) & 0xff, + (colormap[i] >> 0) & 0xff, + i, + &retval); + } + } + + /* Clear the screen. */ + ofwfb_blank(vd, TC_BLACK); +} + +static int +ofwfb_init(struct vt_device *vd) +{ + struct ofwfb_softc *sc = vd->vd_softc; + char type[64]; + phandle_t chosen; + ihandle_t stdout; + phandle_t node; + cell_t depth, height, width; + uint32_t fb_phys; + + chosen = OF_finddevice("/chosen"); + OF_getprop(chosen, "stdout", &stdout, sizeof(stdout)); + node = OF_instance_to_package(stdout); + if (node == -1) { + /* + * The "/chosen/stdout" does not exist try + * using "screen" directly. + */ + node = OF_finddevice("screen"); + } + OF_getprop(node, "device_type", type, sizeof(type)); + if (strcmp(type, "display") != 0) + return (CN_DEAD); + + /* Keep track of the OF node */ + sc->sc_node = node; + + /* Only support 8 and 32-bit framebuffers */ + OF_getprop(node, "depth", &depth, sizeof(depth)); + sc->sc_depth = depth; + + OF_getprop(node, "height", &height, sizeof(height)); + OF_getprop(node, "width", &width, sizeof(width)); + OF_getprop(node, "linebytes", &sc->sc_stride, sizeof(sc->sc_stride)); + + vd->vd_height = height; + vd->vd_width = width; + + /* + * Grab the physical address of the framebuffer, and then map it + * into our memory space. If the MMU is not yet up, it will be + * remapped for us when relocation turns on. + * + * XXX We assume #address-cells is 1 at this point. + */ + OF_getprop(node, "address", &fb_phys, sizeof(fb_phys)); + + bus_space_map(&bs_be_tag, fb_phys, height * sc->sc_stride, + BUS_SPACE_MAP_PREFETCHABLE, &sc->sc_addr); + + ofwfb_initialize(vd); + + return (CN_INTERNAL); +} + From owner-svn-src-user@FreeBSD.ORG Sat Jan 21 18:54:20 2012 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 32AB21065702; Sat, 21 Jan 2012 18:54:20 +0000 (UTC) (envelope-from nwhitehorn@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 1DB338FC12; Sat, 21 Jan 2012 18:54:20 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q0LIsKS9005269; Sat, 21 Jan 2012 18:54:20 GMT (envelope-from nwhitehorn@svn.freebsd.org) Received: (from nwhitehorn@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q0LIsJwk005267; Sat, 21 Jan 2012 18:54:19 GMT (envelope-from nwhitehorn@svn.freebsd.org) Message-Id: <201201211854.q0LIsJwk005267@svn.freebsd.org> From: Nathan Whitehorn Date: Sat, 21 Jan 2012 18:54:19 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230434 - user/ed/newcons/sys/dev/vt/hw/ofwfb X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 21 Jan 2012 18:54:20 -0000 Author: nwhitehorn Date: Sat Jan 21 18:54:19 2012 New Revision: 230434 URL: http://svn.freebsd.org/changeset/base/230434 Log: Make ofwfb static framebuffer much smaller by actually reading how you are supposed to do this kind of thing. Modified: user/ed/newcons/sys/dev/vt/hw/ofwfb/ofwfb.c Modified: user/ed/newcons/sys/dev/vt/hw/ofwfb/ofwfb.c ============================================================================== --- user/ed/newcons/sys/dev/vt/hw/ofwfb/ofwfb.c Sat Jan 21 18:38:57 2012 (r230433) +++ user/ed/newcons/sys/dev/vt/hw/ofwfb/ofwfb.c Sat Jan 21 18:54:19 2012 (r230434) @@ -61,7 +61,9 @@ static const struct vt_driver vt_ofwfb_d }; static struct ofwfb_softc ofwfb_conssoftc; -VT_CONSDEV_DECLARE(vt_ofwfb_driver, 1600, 1200, &ofwfb_conssoftc); +VT_CONSDEV_DECLARE(vt_ofwfb_driver, PIXEL_WIDTH(1600), PIXEL_HEIGHT(1200), + &ofwfb_conssoftc); +/* XXX: hardcoded max size */ static const uint32_t colormap[] = { 0x00000000, /* Black */ From owner-svn-src-user@FreeBSD.ORG Sat Jan 21 22:18:34 2012 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 6FE6C1065672; Sat, 21 Jan 2012 22:18:34 +0000 (UTC) (envelope-from nwhitehorn@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 5AD188FC08; Sat, 21 Jan 2012 22:18:34 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q0LMIYNC011917; Sat, 21 Jan 2012 22:18:34 GMT (envelope-from nwhitehorn@svn.freebsd.org) Received: (from nwhitehorn@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q0LMIYQY011914; Sat, 21 Jan 2012 22:18:34 GMT (envelope-from nwhitehorn@svn.freebsd.org) Message-Id: <201201212218.q0LMIYQY011914@svn.freebsd.org> From: Nathan Whitehorn Date: Sat, 21 Jan 2012 22:18:34 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230440 - in user/ed/newcons/sys: conf dev/vt/hw/ofwfb X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 21 Jan 2012 22:18:34 -0000 Author: nwhitehorn Date: Sat Jan 21 22:18:33 2012 New Revision: 230440 URL: http://svn.freebsd.org/changeset/base/230440 Log: Checkpoint SPARC support. This seems to inexplicably crash fairly early on somewhere outside of ofwfb.c. It is in no way clear why. Modified: user/ed/newcons/sys/conf/files.sparc64 user/ed/newcons/sys/dev/vt/hw/ofwfb/ofwfb.c Modified: user/ed/newcons/sys/conf/files.sparc64 ============================================================================== --- user/ed/newcons/sys/conf/files.sparc64 Sat Jan 21 21:54:31 2012 (r230439) +++ user/ed/newcons/sys/conf/files.sparc64 Sat Jan 21 22:18:33 2012 (r230440) @@ -38,7 +38,7 @@ dev/fb/fb.c optional sc dev/fb/gallant12x22.c optional sc dev/fb/machfb.c optional machfb sc dev/hwpmc/hwpmc_sparc64.c optional hwpmc -dev/kbd/kbd.c optional atkbd | sc | ukbd +dev/kbd/kbd.c optional atkbd | sc | ukbd | vt dev/le/if_le_lebuffer.c optional le sbus dev/le/if_le_ledma.c optional le sbus dev/le/lebuffer_sbus.c optional le sbus @@ -58,7 +58,8 @@ dev/syscons/scgfbrndr.c optional sc dev/syscons/scterm-teken.c optional sc dev/syscons/scvtb.c optional sc dev/uart/uart_cpu_sparc64.c optional uart -dev/uart/uart_kbd_sun.c optional uart sc +dev/uart/uart_kbd_sun.c optional uart sc | vt +dev/vt/hw/ofwfb/ofwfb.c optional vt kern/kern_clocksource.c standard kern/syscalls.c optional ktr libkern/ffs.c standard Modified: user/ed/newcons/sys/dev/vt/hw/ofwfb/ofwfb.c ============================================================================== --- user/ed/newcons/sys/dev/vt/hw/ofwfb/ofwfb.c Sat Jan 21 21:54:31 2012 (r230439) +++ user/ed/newcons/sys/dev/vt/hw/ofwfb/ofwfb.c Sat Jan 21 22:18:33 2012 (r230440) @@ -37,6 +37,9 @@ __FBSDID("$FreeBSD: user/ed/newcons/sys/ #include #include +#ifdef __sparc64__ +#include +#endif #include #include @@ -48,6 +51,10 @@ struct ofwfb_softc { intptr_t sc_addr; int sc_depth; int sc_stride; + +#ifdef __sparc64__ + bus_space_tag_t sc_memt; +#endif }; static vd_init_t ofwfb_init; @@ -61,7 +68,7 @@ static const struct vt_driver vt_ofwfb_d }; static struct ofwfb_softc ofwfb_conssoftc; -VT_CONSDEV_DECLARE(vt_ofwfb_driver, PIXEL_WIDTH(1600), PIXEL_HEIGHT(1200), +VT_CONSDEV_DECLARE(vt_ofwfb_driver, PIXEL_WIDTH(1920), PIXEL_HEIGHT(1200), &ofwfb_conssoftc); /* XXX: hardcoded max size */ @@ -99,7 +106,7 @@ ofwfb_blank(struct vt_device *vd, term_c case 32: c = colormap[color]; for (ofs = 0; ofs < sc->sc_stride*vd->vd_height; ofs++) - memcpy((void *)(sc->sc_addr + 4*ofs), &c, 4); + *(uint32_t *)(sc->sc_addr + 4*ofs) = c; break; default: /* panic? */ @@ -135,8 +142,8 @@ ofwfb_bitblt(struct vt_device *vd, const b & 0x80 ? fg : bg; break; case 32: - memcpy((void *)(sc->sc_addr + line + c*4), - b & 0x80 ? &fgc : &bgc, 4); + *(uint32_t *)(sc->sc_addr + line + 4*c) = + (b & 0x80) ? fgc : bgc; break; default: /* panic? */ @@ -152,30 +159,25 @@ ofwfb_initialize(struct vt_device *vd) struct ofwfb_softc *sc = vd->vd_softc; char name[64]; ihandle_t ih; - cell_t depth = 8; - int i, retval; + int i; + cell_t retval; /* Open display device, thereby initializing it */ memset(name, 0, sizeof(name)); OF_package_to_path(sc->sc_node, name, sizeof(name)); ih = OF_open(name); - OF_getprop(sc->sc_node, "depth", &depth, sizeof(depth)); - sc->sc_depth = depth; - if (sc->sc_depth == 8) { /* - * Install the ISO6429 colormap - older OFW systems - * don't do this by default - */ - for (i = 0; i < 16; i++) { - OF_call_method("color!", ih, 4, 1, - (colormap[i] >> 16) & 0xff, - (colormap[i] >> 8) & 0xff, - (colormap[i] >> 0) & 0xff, - i, - &retval); - } + * Install the color map + */ + for (i = 0; i < 16; i++) { + OF_call_method("color!", ih, 4, 1, + (cell_t)((colormap[i] >> 16) & 0xff), + (cell_t)((colormap[i] >> 8) & 0xff), + (cell_t)((colormap[i] >> 0) & 0xff), + (cell_t)i, &retval); + } } /* Clear the screen. */ @@ -190,8 +192,13 @@ ofwfb_init(struct vt_device *vd) phandle_t chosen; ihandle_t stdout; phandle_t node; - cell_t depth, height, width; + uint32_t depth, height, width; uint32_t fb_phys; +#ifdef __sparc64__ + static struct bus_space_tag ofwfb_memt[1]; + bus_addr_t phys; + int space; +#endif chosen = OF_finddevice("/chosen"); OF_getprop(chosen, "stdout", &stdout, sizeof(stdout)); @@ -225,13 +232,21 @@ ofwfb_init(struct vt_device *vd) * Grab the physical address of the framebuffer, and then map it * into our memory space. If the MMU is not yet up, it will be * remapped for us when relocation turns on. - * - * XXX We assume #address-cells is 1 at this point. */ + + /* XXX We assume #address-cells is 1 at this point. */ OF_getprop(node, "address", &fb_phys, sizeof(fb_phys)); +#if defined(__powerpc__) bus_space_map(&bs_be_tag, fb_phys, height * sc->sc_stride, BUS_SPACE_MAP_PREFETCHABLE, &sc->sc_addr); +#elif defined(__sparc64__) + OF_decode_addr(node, 0, &space, &phys); + sc->sc_memt = &ofwfb_memt[0]; + sc->sc_addr = sparc64_fake_bustag(space, fb_phys, sc->sc_memt); +#else + #error Unsupported platform! +#endif ofwfb_initialize(vd);