PERFORCE change 111362 for review
Matt Jacob
mjacob at FreeBSD.org
Sat Dec 9 20:27:18 PST 2006
http://perforce.freebsd.org/chv.cgi?CH=111362
Change 111362 by mjacob at newisp on 2006/12/10 04:26:34
IFC1.
Affected files ...
.. //depot/projects/newisp/dev/isp/isp_freebsd.c#34 integrate
.. //depot/projects/newisp/dev/isp/isp_pci.c#21 integrate
.. //depot/projects/newisp/dev/isp/isp_sbus.c#9 integrate
.. //depot/projects/newisp/dev/isp/ispmbox.h#16 integrate
.. //depot/projects/newisp/dev/ispfw/ispfw.c#3 integrate
.. //depot/projects/newisp/dev/mpt/mpt_cam.c#22 integrate
.. //depot/projects/newisp/dev/mpt/mpt_pci.c#7 integrate
.. //depot/projects/newisp/dev/sound/pci/hda/hdac.c#6 integrate
.. //depot/projects/newisp/fs/msdosfs/msdosfs_vfsops.c#4 integrate
.. //depot/projects/newisp/fs/unionfs/union_subr.c#3 integrate
.. //depot/projects/newisp/fs/unionfs/union_vfsops.c#4 integrate
.. //depot/projects/newisp/fs/unionfs/union_vnops.c#3 integrate
.. //depot/projects/newisp/sparc64/sparc64/elf_machdep.c#2 integrate
.. //depot/projects/newisp/sun4v/sun4v/pmap.c#7 integrate
Differences ...
==== //depot/projects/newisp/dev/isp/isp_freebsd.c#34 (text+ko) ====
@@ -29,7 +29,7 @@
* Platform (FreeBSD) dependent common attachment code for Qlogic adapters.
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/isp/isp_freebsd.c,v 1.129 2006/12/05 07:50:23 mjacob Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/isp/isp_freebsd.c,v 1.130 2006/12/09 01:30:05 mjacob Exp $");
#include <dev/isp/isp_freebsd.h>
#include <sys/unistd.h>
#include <sys/kthread.h>
==== //depot/projects/newisp/dev/isp/isp_pci.c#21 (text+ko) ====
@@ -30,7 +30,7 @@
* FreeBSD Version.
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/isp/isp_pci.c,v 1.127 2006/11/18 03:53:16 mjacob Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/isp/isp_pci.c,v 1.128 2006/12/10 03:41:48 mjacob Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -352,10 +352,7 @@
};
static devclass_t isp_devclass;
DRIVER_MODULE(isp, pci, isp_pci_driver, isp_devclass, 0, 0);
-#if __FreeBSD_version >= 700000
-MODULE_DEPEND(isp, ispfw, 1, 1, 1);
-MODULE_DEPEND(isp, firmware, 1, 1, 1);
-#else
+#if __FreeBSD_version < 700000
extern ispfwfunc *isp_get_firmware_p;
#endif
==== //depot/projects/newisp/dev/isp/isp_sbus.c#9 (text+ko) ====
@@ -29,7 +29,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/isp/isp_sbus.c,v 1.23 2006/11/02 03:21:31 mjacob Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/isp/isp_sbus.c,v 1.24 2006/12/10 03:41:48 mjacob Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -113,9 +113,7 @@
};
static devclass_t isp_devclass;
DRIVER_MODULE(isp, sbus, isp_sbus_driver, isp_devclass, 0, 0);
-#if __FreeBSD_version >= 700000
-MODULE_DEPEND(isp, firmware, 1, 1, 1);
-#else
+#if __FreeBSD_version < 700000
extern ispfwfunc *isp_get_firmware_p;
#endif
==== //depot/projects/newisp/dev/isp/ispmbox.h#16 (text+ko) ====
@@ -1,4 +1,4 @@
-/* $FreeBSD: src/sys/dev/isp/ispmbox.h,v 1.55 2006/11/18 03:53:16 mjacob Exp $ */
+/* $FreeBSD: src/sys/dev/isp/ispmbox.h,v 1.56 2006/12/09 01:33:55 mjacob Exp $ */
/*-
* Mailbox and Queue Entry Definitions for for Qlogic ISP SCSI adapters.
*
@@ -638,7 +638,7 @@
typedef struct {
isphdr_t ms_header;
uint32_t ms_handle;
- uint16_t ms_nphdl; /* XXX: Note, this is for 2K Logins only */
+ uint16_t ms_nphdl; /* handle in high byte for !2k f/w */
uint16_t ms_status;
uint16_t ms_flags;
uint16_t ms_reserved1; /* low 8 bits */
==== //depot/projects/newisp/dev/ispfw/ispfw.c#3 (text+ko) ====
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/ispfw/ispfw.c,v 1.18 2006/08/26 18:39:18 mjacob Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/ispfw/ispfw.c,v 1.19 2006/12/10 03:42:57 mjacob Exp $");
#include <sys/param.h>
#include <sys/kernel.h>
@@ -52,7 +52,7 @@
#ifdef __sparc64__
#define ISP_1000 1
#endif
-#define MODULE_NAME "isp"
+#define MODULE_NAME "ispfw"
#endif
#if defined(ISP_1040) || defined(ISP_1040_IT)
==== //depot/projects/newisp/dev/mpt/mpt_cam.c#22 (text+ko) ====
@@ -94,7 +94,7 @@
* OWNER OR CONTRIBUTOR IS ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/mpt/mpt_cam.c,v 1.45 2006/12/07 22:02:28 mjacob Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/mpt/mpt_cam.c,v 1.46 2006/12/10 01:13:56 mjacob Exp $");
#include <dev/mpt/mpt.h>
#include <dev/mpt/mpt_cam.h>
@@ -179,6 +179,7 @@
};
DECLARE_MPT_PERSONALITY(mpt_cam, SI_ORDER_SECOND);
+MODULE_DEPEND(mpt_cam, cam, 1, 1, 1);
int
mpt_cam_probe(struct mpt_softc *mpt)
==== //depot/projects/newisp/dev/mpt/mpt_pci.c#7 (text+ko) ====
@@ -99,7 +99,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/mpt/mpt_pci.c,v 1.44 2006/11/19 23:24:52 mjacob Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/mpt/mpt_pci.c,v 1.45 2006/12/10 01:13:56 mjacob Exp $");
#include <dev/mpt/mpt.h>
#include <dev/mpt/mpt_cam.h>
@@ -210,6 +210,7 @@
};
static devclass_t mpt_devclass;
DRIVER_MODULE(mpt, pci, mpt_driver, mpt_devclass, 0, 0);
+MODULE_DEPEND(mpt, pci, 1, 1, 1);
MODULE_VERSION(mpt, 1);
static int
==== //depot/projects/newisp/dev/sound/pci/hda/hdac.c#6 (text+ko) ====
@@ -80,10 +80,10 @@
#include "mixer_if.h"
-#define HDA_DRV_TEST_REV "20061203_0035"
+#define HDA_DRV_TEST_REV "20061210_0036"
#define HDA_WIDGET_PARSER_REV 1
-SND_DECLARE_FILE("$FreeBSD: src/sys/dev/sound/pci/hda/hdac.c,v 1.12 2006/12/02 17:12:24 ariff Exp $");
+SND_DECLARE_FILE("$FreeBSD: src/sys/dev/sound/pci/hda/hdac.c,v 1.13 2006/12/09 17:52:54 ariff Exp $");
#undef HDA_DEBUG_ENABLED
#define HDA_DEBUG_ENABLED 1
@@ -242,10 +242,11 @@
#define HDA_QUIRK_GPIO0 (1 << 0)
#define HDA_QUIRK_GPIO1 (1 << 1)
#define HDA_QUIRK_GPIO2 (1 << 2)
-#define HDA_QUIRK_SOFTPCMVOL (1 << 15)
-#define HDA_QUIRK_FIXEDRATE (1 << 16)
-#define HDA_QUIRK_FORCESTEREO (1 << 17)
-#define HDA_QUIRK_EAPDINV (1 << 18)
+#define HDA_QUIRK_GPIOFLUSH (1 << 15)
+#define HDA_QUIRK_SOFTPCMVOL (1 << 16)
+#define HDA_QUIRK_FIXEDRATE (1 << 17)
+#define HDA_QUIRK_FORCESTEREO (1 << 18)
+#define HDA_QUIRK_EAPDINV (1 << 19)
static const struct {
char *key;
@@ -254,6 +255,7 @@
{ "gpio0", HDA_QUIRK_GPIO0 },
{ "gpio1", HDA_QUIRK_GPIO1 },
{ "gpio2", HDA_QUIRK_GPIO2 },
+ { "gpioflush", HDA_QUIRK_GPIOFLUSH },
{ "softpcmvol", HDA_QUIRK_SOFTPCMVOL },
{ "fixedrate", HDA_QUIRK_FIXEDRATE },
{ "forcestereo", HDA_QUIRK_FORCESTEREO },
@@ -448,33 +450,38 @@
uint32_t model;
uint32_t id;
int type;
+ int inverted;
nid_t hpnid;
nid_t spkrnid[8];
nid_t eapdnid;
} hdac_hp_switch[] = {
/* Specific OEM models */
- { HP_V3000_SUBVENDOR, HDA_CODEC_CXVENICE, HDAC_HP_SWITCH_CTL,
+ { HP_V3000_SUBVENDOR, HDA_CODEC_CXVENICE, HDAC_HP_SWITCH_CTL, 0,
17, { 16, -1 }, 16 },
- { HP_NX7400_SUBVENDOR, HDA_CODEC_AD1981HD, HDAC_HP_SWITCH_CTL,
+ { HP_NX7400_SUBVENDOR, HDA_CODEC_AD1981HD, HDAC_HP_SWITCH_CTL, 0,
6, { 5, -1 }, 5 },
- { HP_NX6310_SUBVENDOR, HDA_CODEC_AD1981HD, HDAC_HP_SWITCH_CTL,
+ { HP_NX6310_SUBVENDOR, HDA_CODEC_AD1981HD, HDAC_HP_SWITCH_CTL, 0,
6, { 5, -1 }, 5 },
- { DELL_D820_SUBVENDOR, HDA_CODEC_STAC9220, HDAC_HP_SWITCH_CTRL,
+ { DELL_D820_SUBVENDOR, HDA_CODEC_STAC9220, HDAC_HP_SWITCH_CTRL, 0,
13, { 14, -1 }, -1 },
- { DELL_I1300_SUBVENDOR, HDA_CODEC_STAC9220, HDAC_HP_SWITCH_CTRL,
+ { DELL_I1300_SUBVENDOR, HDA_CODEC_STAC9220, HDAC_HP_SWITCH_CTRL, 0,
13, { 14, -1 }, -1 },
- { APPLE_INTEL_MAC, HDA_CODEC_STAC9221, HDAC_HP_SWITCH_CTRL,
+ { APPLE_INTEL_MAC, HDA_CODEC_STAC9221, HDAC_HP_SWITCH_CTRL, 0,
10, { 13, -1 }, -1 },
+ { LENOVO_3KN100_SUBVENDOR, HDA_CODEC_AD1986A, HDAC_HP_SWITCH_CTL, 1,
+ 26, { 27, -1 }, -1 },
/*
* All models that at least come from the same vendor with
* simmilar codec.
*/
- { HP_ALL_SUBVENDOR, HDA_CODEC_CXVENICE, HDAC_HP_SWITCH_CTL,
+ { HP_ALL_SUBVENDOR, HDA_CODEC_CXVENICE, HDAC_HP_SWITCH_CTL, 0,
17, { 16, -1 }, 16 },
- { HP_ALL_SUBVENDOR, HDA_CODEC_AD1981HD, HDAC_HP_SWITCH_CTL,
+ { HP_ALL_SUBVENDOR, HDA_CODEC_AD1981HD, HDAC_HP_SWITCH_CTL, 0,
6, { 5, -1 }, 5 },
- { DELL_ALL_SUBVENDOR, HDA_CODEC_STAC9220, HDAC_HP_SWITCH_CTRL,
+ { DELL_ALL_SUBVENDOR, HDA_CODEC_STAC9220, HDAC_HP_SWITCH_CTRL, 0,
13, { 14, -1 }, -1 },
+ { LENOVO_ALL_SUBVENDOR, HDA_CODEC_AD1986A, HDAC_HP_SWITCH_CTL, 1,
+ 26, { 27, -1 }, -1 },
};
#define HDAC_HP_SWITCH_LEN \
(sizeof(hdac_hp_switch) / sizeof(hdac_hp_switch[0]))
@@ -683,6 +690,7 @@
hdac_hp_switch[i].hpnid, res);
);
res >>= 31;
+ res ^= hdac_hp_switch[i].inverted;
switch (hdac_hp_switch[i].type) {
case HDAC_HP_SWITCH_CTL:
@@ -3457,11 +3465,11 @@
{ HDA_MATCH_ALL, HDA_MATCH_ALL,
HDA_QUIRK_FORCESTEREO, 0 },
{ ACER_ALL_SUBVENDOR, HDA_MATCH_ALL,
- HDA_QUIRK_GPIO1, 0 },
+ HDA_QUIRK_GPIO0, 0 },
{ ASUS_M5200_SUBVENDOR, HDA_CODEC_ALC880,
+ HDA_QUIRK_GPIO0, 0 },
+ { MEDION_MD95257_SUBVENDOR, HDA_CODEC_ALC880,
HDA_QUIRK_GPIO1, 0 },
- { MEDION_MD95257_SUBVENDOR, HDA_CODEC_ALC880,
- HDA_QUIRK_GPIO2, 0 },
{ ASUS_U5F_SUBVENDOR, HDA_CODEC_AD1986A,
HDA_QUIRK_EAPDINV, 0 },
{ ASUS_A8JC_SUBVENDOR, HDA_CODEC_AD1986A,
@@ -3470,6 +3478,8 @@
HDA_QUIRK_EAPDINV, 0 },
{ SAMSUNG_Q1_SUBVENDOR, HDA_CODEC_AD1986A,
HDA_QUIRK_EAPDINV, 0 },
+ { APPLE_INTEL_MAC, HDA_CODEC_STAC9221,
+ HDA_QUIRK_GPIO0 | HDA_QUIRK_GPIO1, 0 },
{ HDA_MATCH_ALL, HDA_CODEC_CXVENICE,
0, HDA_QUIRK_FORCESTEREO },
{ HDA_MATCH_ALL, HDA_CODEC_STACXXXX,
@@ -4096,23 +4106,55 @@
cad = devinfo->codec->cad;
if (cfl & HDA_COMMIT_GPIO) {
- if (sc->pci_subvendor == APPLE_INTEL_MAC) {
- uint32_t gdata, gmask, gdir;
+ uint32_t gdata, gmask, gdir;
+ int commitgpio = 0;
- gdata = hdac_command(sc,
- HDA_CMD_GET_GPIO_DATA(cad, devinfo->nid),
- cad);
- gmask = hdac_command(sc,
- HDA_CMD_GET_GPIO_ENABLE_MASK(cad, devinfo->nid),
- cad);
- gdir = hdac_command(sc,
- HDA_CMD_GET_GPIO_DIRECTION(cad, devinfo->nid),
- cad);
- gdata |= 0x03;
- gmask |= 0x03;
- gdir |= 0x03;
+ gdata = 0;
+ gmask = 0;
+ gdir = 0;
+
+ if (sc->pci_subvendor == APPLE_INTEL_MAC)
hdac_command(sc, HDA_CMD_12BIT(cad, devinfo->nid,
0x7e7, 0), cad);
+
+ if (devinfo->function.audio.quirks & HDA_QUIRK_GPIOFLUSH)
+ commitgpio = 1;
+ else {
+ for (i = 0; i < HDA_GPIO_MAX; i++) {
+ if (!(devinfo->function.audio.quirks &
+ (1 << i)))
+ continue;
+ if (commitgpio == 0) {
+ commitgpio = 1;
+ gdata = hdac_command(sc,
+ HDA_CMD_GET_GPIO_DATA(cad,
+ devinfo->nid), cad);
+ gmask = hdac_command(sc,
+ HDA_CMD_GET_GPIO_ENABLE_MASK(cad,
+ devinfo->nid), cad);
+ gdir = hdac_command(sc,
+ HDA_CMD_GET_GPIO_DIRECTION(cad,
+ devinfo->nid), cad);
+ HDA_BOOTVERBOSE(
+ device_printf(sc->dev,
+ "GPIO init: data=0x%08x "
+ "mask=0x%08x dir=0x%08x\n",
+ gdata, gmask, gdir);
+ );
+ }
+ gdata |= 1 << i;
+ gmask |= 1 << i;
+ gdir |= 1 << i;
+ }
+ }
+
+ if (commitgpio != 0) {
+ HDA_BOOTVERBOSE(
+ device_printf(sc->dev,
+ "GPIO commit: data=0x%08x mask=0x%08x "
+ "dir=0x%08x\n",
+ gdata, gmask, gdir);
+ );
hdac_command(sc,
HDA_CMD_SET_GPIO_ENABLE_MASK(cad, devinfo->nid,
gmask), cad);
@@ -4122,21 +4164,6 @@
hdac_command(sc,
HDA_CMD_SET_GPIO_DATA(cad, devinfo->nid,
gdata), cad);
- } else {
- for (i = 0; i < HDA_GPIO_MAX; i++) {
- if (!(devinfo->function.audio.quirks &
- (1 << i)))
- continue;
- hdac_command(sc,
- HDA_CMD_SET_GPIO_ENABLE_MASK(cad,
- devinfo->nid, i), cad);
- hdac_command(sc,
- HDA_CMD_SET_GPIO_DIRECTION(cad,
- devinfo->nid, i), cad);
- hdac_command(sc,
- HDA_CMD_SET_GPIO_DATA(cad, devinfo->nid,
- i), cad);
- }
}
}
==== //depot/projects/newisp/fs/msdosfs/msdosfs_vfsops.c#4 (text+ko) ====
@@ -1,4 +1,4 @@
-/* $FreeBSD: src/sys/fs/msdosfs/msdosfs_vfsops.c,v 1.154 2006/11/06 13:41:57 rwatson Exp $ */
+/* $FreeBSD: src/sys/fs/msdosfs/msdosfs_vfsops.c,v 1.155 2006/12/09 01:49:19 rodrigc Exp $ */
/* $NetBSD: msdosfs_vfsops.c,v 1.51 1997/11/17 15:36:58 ws Exp $ */
/*-
@@ -262,11 +262,15 @@
pmp = VFSTOMSDOSFS(mp);
if (vfs_flagopt(mp->mnt_optnew, "export", NULL, 0)) {
- /* Process export requests. */
- if ((pmp->pm_flags & MSDOSFS_LARGEFS) != 0)
+ /*
+ * Forbid export requests if filesystem has
+ * MSDOSFS_LARGEFS flag set.
+ */
+ if ((pmp->pm_flags & MSDOSFS_LARGEFS) != 0) {
+ vfs_mount_error(mp,
+ "MSDOSFS_LARGEFS flag set, cannot export");
return (EOPNOTSUPP);
- else
- return (0);
+ }
}
if (!(pmp->pm_flags & MSDOSFSMNT_RONLY) &&
vfs_flagopt(mp->mnt_optnew, "ro", NULL, 0)) {
==== //depot/projects/newisp/fs/unionfs/union_subr.c#3 (text+ko) ====
@@ -33,7 +33,7 @@
* SUCH DAMAGE.
*
* @(#)union_subr.c 8.20 (Berkeley) 5/20/95
- * $FreeBSD: src/sys/fs/unionfs/union_subr.c,v 1.87 2006/12/02 19:35:56 rodrigc Exp $
+ * $FreeBSD: src/sys/fs/unionfs/union_subr.c,v 1.88 2006/12/09 16:27:50 rodrigc Exp $
*/
#include <sys/param.h>
@@ -317,7 +317,7 @@
{
int vfslocked;
struct unionfs_node *unp;
- struct unionfs_node_status *unsp;
+ struct unionfs_node_status *unsp, *unsp_tmp;
struct vnode *lvp;
struct vnode *uvp;
@@ -367,7 +367,8 @@
free(unp->un_path, M_UNIONFSPATH);
unp->un_path = NULL;
}
- while ((unsp = LIST_FIRST(&(unp->un_unshead))), NULL != unsp) {
+
+ LIST_FOREACH_SAFE(unsp, &(unp->un_unshead), uns_list, unsp_tmp) {
LIST_REMOVE(unsp, uns_list);
free(unsp, M_TEMP);
}
==== //depot/projects/newisp/fs/unionfs/union_vfsops.c#4 (text+ko) ====
@@ -33,7 +33,7 @@
* SUCH DAMAGE.
*
* @(#)union_vfsops.c 8.20 (Berkeley) 5/20/95
- * $FreeBSD: src/sys/fs/unionfs/union_vfsops.c,v 1.79 2006/12/02 19:35:56 rodrigc Exp $
+ * $FreeBSD: src/sys/fs/unionfs/union_vfsops.c,v 1.81 2006/12/09 17:24:18 rodrigc Exp $
*/
#include <sys/param.h>
@@ -139,14 +139,18 @@
copymode = UNIONFS_TRADITIONAL; /* default */
ndp = &nd;
- if (mp->mnt_flag & MNT_ROOTFS)
+ if (mp->mnt_flag & MNT_ROOTFS) {
+ vfs_mount_error(mp, "Cannot union mount root filesystem");
return (EOPNOTSUPP);
+ }
/*
* Update is a no operation.
*/
- if (mp->mnt_flag & MNT_UPDATE)
+ if (mp->mnt_flag & MNT_UPDATE) {
+ vfs_mount_error(mp, "unionfs does not support mount update");
return (EOPNOTSUPP);
+ }
/*
* Get argument
@@ -394,12 +398,10 @@
unionfs_root(struct mount *mp, int flags, struct vnode **vpp, struct thread *td)
{
struct unionfs_mount *ump;
- struct unionfs_node *unp;
struct vnode *vp;
ump = MOUNTTOUNIONFSMOUNT(mp);
vp = ump->um_rootvp;
- unp = VTOUNIONFS(vp);
UNIONFSDEBUG("unionfs_root: rootvp=%p locked=%x\n",
vp, VOP_ISLOCKED(vp, td));
==== //depot/projects/newisp/fs/unionfs/union_vnops.c#3 (text+ko) ====
@@ -34,7 +34,7 @@
* SUCH DAMAGE.
*
* @(#)union_vnops.c 8.32 (Berkeley) 6/23/95
- * $FreeBSD: src/sys/fs/unionfs/union_vnops.c,v 1.136 2006/12/02 22:30:30 rodrigc Exp $
+ * $FreeBSD: src/sys/fs/unionfs/union_vnops.c,v 1.138 2006/12/09 16:51:09 rodrigc Exp $
*
*/
@@ -872,9 +872,11 @@
UNIONFS_INTERNAL_DEBUG("unionfs_ioctl: enter\n");
+ vn_lock(ap->a_vp, LK_EXCLUSIVE | LK_RETRY, ap->a_td);
unp = VTOUNIONFS(ap->a_vp);
unionfs_get_node_status(unp, ap->a_td, &unsp);
ovp = (unsp->uns_upper_opencnt ? unp->un_uppervp : unp->un_lowervp);
+ VOP_UNLOCK(ap->a_vp, 0, ap->a_td);
if (ovp == NULLVP)
return (EBADF);
@@ -894,9 +896,11 @@
struct unionfs_node_status *unsp;
struct vnode *ovp;
+ vn_lock(ap->a_vp, LK_EXCLUSIVE | LK_RETRY, ap->a_td);
unp = VTOUNIONFS(ap->a_vp);
unionfs_get_node_status(unp, ap->a_td, &unsp);
ovp = (unsp->uns_upper_opencnt ? unp->un_uppervp : unp->un_lowervp);
+ VOP_UNLOCK(ap->a_vp, 0, ap->a_td);
if (ovp == NULLVP)
return (EBADF);
@@ -1462,6 +1466,10 @@
uio->uio_offset = 0;
}
+ if (lvp == NULLVP) {
+ error = EBADF;
+ goto unionfs_readdir_exit;
+ }
/* read lower */
error = VOP_READDIR(lvp, uio, ap->a_cred, ap->a_eofflag,
ap->a_ncookies, ap->a_cookies);
==== //depot/projects/newisp/sparc64/sparc64/elf_machdep.c#2 (text+ko) ====
@@ -36,7 +36,7 @@
* POSSIBILITY OF SUCH DAMAGE.
*
* from: NetBSD: mdreloc.c,v 1.5 2001/04/25 12:24:51 kleink Exp
- * $FreeBSD: src/sys/sparc64/sparc64/elf_machdep.c,v 1.21 2005/12/26 21:23:55 sobomax Exp $
+ * $FreeBSD: src/sys/sparc64/sparc64/elf_machdep.c,v 1.22 2006/12/10 04:18:03 kmacy Exp $
*/
#include <sys/param.h>
@@ -310,7 +310,7 @@
return (0);
if (rtype == R_SPARC_JMP_SLOT || rtype == R_SPARC_COPY ||
- rtype > R_SPARC_UA16)
+ rtype >= (sizeof(reloc_target_bitmask)/sizeof(long)))
return (-1);
if (RELOC_UNALIGNED(rtype))
==== //depot/projects/newisp/sun4v/sun4v/pmap.c#7 (text+ko) ====
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/sun4v/sun4v/pmap.c,v 1.18 2006/12/04 19:35:40 kmacy Exp $");
+__FBSDID("$FreeBSD: src/sys/sun4v/sun4v/pmap.c,v 1.22 2006/12/10 04:14:29 kmacy Exp $");
#include "opt_kstack_pages.h"
#include "opt_msgbuf.h"
@@ -134,7 +134,8 @@
static struct vm_object pvzone_obj;
static int pv_entry_count = 0, pv_entry_max = 0, pv_entry_high_water = 0;
int pmap_debug = 0;
-int pmap_debug_range = 0;
+static int pmap_debug_range = 1;
+static int use_256M_pages = 1;
static struct mtx pmap_ctx_lock;
static uint16_t ctx_stack[PMAP_CONTEXT_MAX];
@@ -443,12 +444,12 @@
{
struct pmap *pm;
vm_offset_t off, va;
- vm_paddr_t pa, kernel_hash_pa, nucleus_memory_start;
+ vm_paddr_t pa, tsb_8k_pa, tsb_4m_pa, kernel_hash_pa, nucleus_memory_start;
vm_size_t physsz, virtsz, kernel_hash_shift;
ihandle_t pmem, vmem;
- int i, sz, j;
- uint64_t tsb_8k_size, tsb_4m_size, error, physmem_tunable;
- vm_paddr_t real_phys_avail[128];
+ int i, j, k, sz;
+ uint64_t tsb_8k_size, tsb_4m_size, error, physmem_tunable, physmemstart_tunable;
+ vm_paddr_t real_phys_avail[128], tmp_phys_avail[128];
if ((vmem = OF_finddevice("/virtual-memory")) == -1)
panic("pmap_bootstrap: finddevice /virtual-memory");
@@ -469,24 +470,26 @@
KDPRINTF("om_size=%ld om_start=%lx om_tte=%lx\n",
translations[i].om_size, translations[i].om_start,
translations[i].om_tte);
- if (translations[i].om_size == PAGE_SIZE_4M &&
- (translations[i].om_start >= KERNBASE &&
- translations[i].om_start <= KERNBASE + 3*PAGE_SIZE_4M)) {
- KDPRINTF("mapping permanent translation\n");
- pa = TTE_GET_PA(translations[i].om_tte);
- error = hv_mmu_map_perm_addr(translations[i].om_start,
- KCONTEXT, pa | TTE_KERNEL | VTD_4M, MAP_ITLB | MAP_DTLB);
- if (error != H_EOK)
- panic("map_perm_addr returned error=%ld", error);
-
- if ((nucleus_memory_start == 0) || (pa < nucleus_memory_start))
- nucleus_memory_start = pa;
- nucleus_mappings[permanent_mappings++] = pa;
- nucleus_memory += PAGE_SIZE_4M;
+ if ((translations[i].om_start >= KERNBASE) &&
+ (translations[i].om_start <= KERNBASE + 3*PAGE_SIZE_4M)) {
+ for (j = 0; j < translations[i].om_size; j += PAGE_SIZE_4M) {
+ KDPRINTF("mapping permanent translation\n");
+ pa = TTE_GET_PA(translations[i].om_tte) + j;
+ va = translations[i].om_start + j;
+ error = hv_mmu_map_perm_addr(va, KCONTEXT,
+ pa | TTE_KERNEL | VTD_4M, MAP_ITLB | MAP_DTLB);
+ if (error != H_EOK)
+ panic("map_perm_addr returned error=%ld", error);
+
+ if ((nucleus_memory_start == 0) || (pa < nucleus_memory_start))
+ nucleus_memory_start = pa;
+ printf("nucleus_mappings[%d] = 0x%lx\n", permanent_mappings, pa);
+ nucleus_mappings[permanent_mappings++] = pa;
+ nucleus_memory += PAGE_SIZE_4M;
#ifdef SMP
- mp_add_nucleus_mapping(translations[i].om_start,
- pa | TTE_KERNEL | VTD_4M);
+ mp_add_nucleus_mapping(va, pa|TTE_KERNEL|VTD_4M);
#endif
+ }
}
}
@@ -511,15 +514,20 @@
CTR0(KTR_PMAP, "pmap_bootstrap: physical memory");
qsort(mra, sz, sizeof (*mra), mr_cmp);
- physmem_tunable = physmem = physsz = 0;
+ physmemstart_tunable = physmem_tunable = physmem = physsz = 0;
+ if (TUNABLE_ULONG_FETCH("hw.physmemstart", &physmemstart_tunable)) {
+ KDPRINTF("desired physmemstart=0x%lx\n", physmemstart_tunable);
+ }
if (TUNABLE_ULONG_FETCH("hw.physmem", &physmem_tunable)) {
physmem = atop(physmem_tunable);
KDPRINTF("desired physmem=0x%lx\n", physmem_tunable);
}
-
- for (i = 0; i < 128; i++)
- real_phys_avail[i] = 0;
+ if ((physmem_tunable != 0) && (physmemstart_tunable != 0))
+ physmem_tunable += physmemstart_tunable;
+
+ bzero(real_phys_avail, sizeof(real_phys_avail));
+ bzero(tmp_phys_avail, sizeof(tmp_phys_avail));
for (i = 0, j = 0; i < sz; i++) {
uint64_t size;
@@ -531,12 +539,11 @@
uint64_t newstart, roundup;
newstart = ((mra[i].mr_start + (PAGE_SIZE_4M-1)) & ~PAGE_MASK_4M);
roundup = newstart - mra[i].mr_start;
- size = mra[i].mr_size - roundup;
+ size = (mra[i].mr_size - roundup) & ~PAGE_MASK_4M;
+ mra[i].mr_start = newstart;
if (size < PAGE_SIZE_4M)
continue;
- size = (size & ~PAGE_MASK_4M);
mra[i].mr_size = size;
- mra[i].mr_start = newstart;
}
real_phys_avail[j] = mra[i].mr_start;
if (physmem_tunable != 0 && ((physsz + mra[i].mr_size) >= physmem_tunable)) {
@@ -549,67 +556,96 @@
real_phys_avail[j + 1] = mra[i].mr_start + mra[i].mr_size;
j += 2;
}
- physmem = btoc(physsz);
- for (i = 0; real_phys_avail[i] != 0; i += 2) {
- if (real_phys_avail[i] == (nucleus_memory_start + nucleus_memory))
- real_phys_avail[i] -= nucleus_memory;
- if (real_phys_avail[i + 1] == nucleus_memory_start)
- real_phys_avail[i + 1] += nucleus_memory;
-
- if (real_phys_avail[i + 1] == real_phys_avail[i + 2]) {
- real_phys_avail[i + 1] = real_phys_avail[i + 3];
- for (j = i + 2; real_phys_avail[j] != 0; j += 2) {
- real_phys_avail[j] = real_phys_avail[j + 2];
- real_phys_avail[j + 1] = real_phys_avail[j + 3];
- }
- }
- }
-
-
+ physmem = btoc(physsz - physmemstart_tunable);
/*
- * This is for versions of OFW that would allocate us memory
+ * This is needed for versions of OFW that would allocate us memory
* and then forget to remove it from the available ranges ...
+ * as well as for compensating for the above move of nucleus pages
*/
-
- for (i = 0, j = 0; i < sz; i++) {
- vm_paddr_t start = mra[i].mr_start;
- uint64_t size = mra[i].mr_size;
- CTR2(KTR_PMAP, "start=%#lx size=%#lx\n", mra[i].mr_start, mra[i].mr_size);
- KDPRINTF("start=%#lx size=%#lx\n", mra[i].mr_start, mra[i].mr_size);
-
- if (mra[i].mr_size < PAGE_SIZE_4M)
- continue;
+ for (i = 0, j = 0; real_phys_avail[i] != 0; i += 2) {
+ vm_paddr_t start = real_phys_avail[i];
+ uint64_t size = real_phys_avail[i + 1] - real_phys_avail[i];
+ CTR2(KTR_PMAP, "start=%#lx size=%#lx\n", start,size);
+ KDPRINTF("real_phys start=%#lx size=%#lx\n", start, size);
/*
* Is kernel memory at the beginning of range?
*/
- if (nucleus_memory_start == mra[i].mr_start) {
- mra[i].mr_start += nucleus_memory;
- mra[i].mr_size -= nucleus_memory;
+ if (nucleus_memory_start == start) {
+ start = start + nucleus_memory;
}
/*
* Is kernel memory at the end of range?
*/
if (nucleus_memory_start == (start + size - nucleus_memory))
- mra[i].mr_size -= nucleus_memory;
+ size -= nucleus_memory;
+
+ if (physmemstart_tunable != 0 &&
+ ((mra[i].mr_start + mra[i].mr_size) < physmemstart_tunable))
+ continue;
+ if (physmemstart_tunable != 0 &&
+ ((start < physmemstart_tunable))) {
+ size -= (physmemstart_tunable - start);
+ start = physmemstart_tunable;
+ }
/*
* Is kernel memory in the middle somewhere?
*/
- if ((nucleus_memory_start > start) && (nucleus_memory_start < (start + size))) {
+ if ((nucleus_memory_start > start) &&
+ (nucleus_memory_start < (start + size))) {
uint64_t firstsize = (nucleus_memory_start - start);
phys_avail[j] = start;
phys_avail[j+1] = nucleus_memory_start;
+ start = nucleus_memory_start + nucleus_memory;
size = size - firstsize - nucleus_memory;
- mra[i].mr_start = nucleus_memory_start + nucleus_memory;
- mra[i].mr_size = size;
j += 2;
}
- phys_avail[j] = mra[i].mr_start;
- phys_avail[j + 1] = mra[i].mr_start + mra[i].mr_size;
+ phys_avail[j] = start;
+ phys_avail[j + 1] = start + size;
j += 2;
}
+
+ /*
+ * Merge nucleus memory in to real_phys_avail
+ *
+ */
+ for (i = 0; real_phys_avail[i] != 0; i += 2) {
+ if (real_phys_avail[i] == nucleus_memory_start + nucleus_memory)
+ real_phys_avail[i] -= nucleus_memory;
+
+ if (real_phys_avail[i + 1] == nucleus_memory_start)
+ real_phys_avail[i + 1] += nucleus_memory;
+
+ if (real_phys_avail[i + 1] == real_phys_avail[i + 2]) {
+ real_phys_avail[i + 1] = real_phys_avail[i + 3];
+ for (k = i + 2; real_phys_avail[k] != 0; k += 2) {
+ real_phys_avail[k] = real_phys_avail[k + 2];
+ real_phys_avail[k + 1] = real_phys_avail[k + 3];
+ }
+ }
+ }
+ for (i = 0; phys_avail[i] != 0; i += 2)
+ if (pmap_debug_range || pmap_debug)
+ printf("phys_avail[%d]=0x%lx phys_avail[%d]=0x%lx\n",
+ i, phys_avail[i], i+1, phys_avail[i+1]);
+ /*
+ * Shuffle the memory range containing the 256MB page with
+ * nucleus_memory to the beginning of the phys_avail array
+ * so that physical memory from that page is preferentially
+ * allocated first
+ */
+ for (j = 0; phys_avail[j] != 0; j += 2)
+ if (nucleus_memory_start < phys_avail[j])
+ break;
+ for (i = j, k = 0; phys_avail[i] != 0; k++, i++)
+ tmp_phys_avail[k] = phys_avail[i];
+ for (i = 0; i < j; i++)
+ tmp_phys_avail[k + i] = phys_avail[i];
+ for (i = 0; i < 128; i++)
+ phys_avail[i] = tmp_phys_avail[i];
+
for (i = 0; real_phys_avail[i] != 0; i += 2)
if (pmap_debug_range || pmap_debug)
printf("real_phys_avail[%d]=0x%lx real_phys_avail[%d]=0x%lx\n",
@@ -658,17 +694,21 @@
tsb_8k_size = PAGE_SIZE_4M;
#endif
- pa = pmap_bootstrap_alloc(tsb_8k_size);
- if (pa & PAGE_MASK_4M)
+ tsb_8k_pa = pmap_bootstrap_alloc(tsb_8k_size);
+ if (tsb_8k_pa & PAGE_MASK_4M)
panic("pmap_bootstrap: tsb unaligned\n");
- KDPRINTF("tsb_8k_size is 0x%lx, tsb_8k_pa is 0x%lx\n", tsb_8k_size, pa);
+ KDPRINTF("tsb_8k_size is 0x%lx, tsb_8k_pa is 0x%lx\n", tsb_8k_size, tsb_8k_pa);
+
+ tsb_4m_size = (virtsz >> (PAGE_SHIFT_4M - TTE_SHIFT)) << 3;
+ tsb_4m_pa = pmap_bootstrap_alloc(tsb_4m_size);
+
kernel_td[TSB8K_INDEX].hti_idxpgsz = TTE8K;
kernel_td[TSB8K_INDEX].hti_assoc = 1;
kernel_td[TSB8K_INDEX].hti_ntte = (tsb_8k_size >> TTE_SHIFT);
kernel_td[TSB8K_INDEX].hti_ctx_index = 0;
kernel_td[TSB8K_INDEX].hti_pgszs = TSB8K;
kernel_td[TSB8K_INDEX].hti_rsvd = 0;
- kernel_td[TSB8K_INDEX].hti_ra = pa;
+ kernel_td[TSB8K_INDEX].hti_ra = tsb_8k_pa;
/*
* Initialize kernel's private TSB from 8K page TSB
@@ -680,7 +720,7 @@
kernel_pmap->pm_tsb.hti_ctx_index = 0;
kernel_pmap->pm_tsb.hti_pgszs = TSB8K;
kernel_pmap->pm_tsb.hti_rsvd = 0;
- kernel_pmap->pm_tsb.hti_ra = pa;
+ kernel_pmap->pm_tsb.hti_ra = tsb_8k_pa;
kernel_pmap->pm_tsb_ra = vtophys((vm_offset_t)&kernel_pmap->pm_tsb);
tsb_set_scratchpad_kernel(&kernel_pmap->pm_tsb);
@@ -690,18 +730,15 @@
* currently (not by design) used for permanent mappings
*/
- tsb_4m_size = (virtsz >> (PAGE_SHIFT_4M - TTE_SHIFT)) << 3;
- pa = pmap_bootstrap_alloc(tsb_4m_size);
- KDPRINTF("tsb_4m_pa is 0x%lx tsb_4m_size is 0x%lx\n", pa, tsb_4m_size);
+ KDPRINTF("tsb_4m_pa is 0x%lx tsb_4m_size is 0x%lx\n", tsb_4m_pa, tsb_4m_size);
kernel_td[TSB4M_INDEX].hti_idxpgsz = TTE4M;
kernel_td[TSB4M_INDEX].hti_assoc = 1;
kernel_td[TSB4M_INDEX].hti_ntte = (tsb_4m_size >> TTE_SHIFT);
kernel_td[TSB4M_INDEX].hti_ctx_index = 0;
- kernel_td[TSB4M_INDEX].hti_pgszs = TSB4M;
+ kernel_td[TSB4M_INDEX].hti_pgszs = TSB4M|TSB256M;
kernel_td[TSB4M_INDEX].hti_rsvd = 0;
- kernel_td[TSB4M_INDEX].hti_ra = pa;
-
+ kernel_td[TSB4M_INDEX].hti_ra = tsb_4m_pa;
/*
* allocate MMU fault status areas for all CPUS
*/
@@ -765,8 +802,8 @@
}
}
- error = hv_mmu_tsb_ctx0(MAX_TSB_INFO, vtophys((vm_offset_t)&kernel_td));
- if (error != H_EOK)
+ if ((error = hv_mmu_tsb_ctx0(MAX_TSB_INFO,
+ vtophys((vm_offset_t)kernel_td))) != H_EOK)
panic("failed to set ctx0 TSBs error: %ld", error);
#ifdef SMP
@@ -777,10 +814,23 @@
*
*/
for (i = 0, pa = real_phys_avail[i]; pa != 0; i += 2, pa = real_phys_avail[i]) {
+ vm_paddr_t tag_pa = 0, next_pa = 0;
+ uint64_t size_bits = VTD_4M;
while (pa < real_phys_avail[i + 1]) {
+ if (use_256M_pages &&
+ (pa & PAGE_MASK_256M) == 0 &&
+ ((pa + PAGE_SIZE_256M) <= real_phys_avail[i + 1])) {
+ tag_pa = pa;
+ size_bits = VTD_256M;
+ next_pa = pa + PAGE_SIZE_256M;
+ } else if (next_pa <= pa) {
+ tag_pa = pa;
+ size_bits = VTD_4M;
+ }
tsb_assert_invalid(&kernel_td[TSB4M_INDEX], TLB_PHYS_TO_DIRECT(pa));
tsb_set_tte_real(&kernel_td[TSB4M_INDEX], TLB_PHYS_TO_DIRECT(pa),
- TLB_PHYS_TO_DIRECT(pa), pa | TTE_KERNEL | VTD_4M, 0);
+ TLB_PHYS_TO_DIRECT(pa),
+ tag_pa | TTE_KERNEL | size_bits, 0);
pa += PAGE_SIZE_4M;
}
}
@@ -848,11 +898,6 @@
tte_hash_insert(pm->pm_hash, TLB_PHYS_TO_DIRECT(pa),
pa | TTE_KERNEL | VTD_4M);
#endif
- /* XXX relies on the fact that memory ranges only get smaller */
- for (i = 0; phys_avail[i + 2] != 0; i += 2)
- if (phys_avail[i + 1] - phys_avail[i] < PAGE_SIZE_4M)
- phys_avail[i] = phys_avail[i+1] = 0;
-
}
@@ -1231,14 +1276,19 @@
void *ptr;
m = NULL;
- while (m == NULL) {
- m = vm_page_alloc_contig(npages, phys_avail[0],
- phys_avail[1], alignment, (1UL<<34));
+ while (m == NULL) {
+ for (i = 0; phys_avail[i + 1] != 0; i += 2) {
+ m = vm_page_alloc_contig(npages, phys_avail[i],
+ phys_avail[i + 1], alignment, (1UL<<34));
+ if (m)
+ goto found;
+ }
if (m == NULL) {
printf("vm_page_alloc_contig failed - waiting to retry\n");
VM_WAIT;
}
}
+found:
for (i = 0, tm = m; i < npages; i++, tm++) {
tm->wire_count++;
if ((tm->flags & PG_ZERO) == 0)
More information about the p4-projects
mailing list