svn commit: r237516 - in user/attilio/vmcontention: share/man/man4
sys/amd64/amd64 sys/conf sys/dev/acpi_support sys/dev/agp
sys/dev/cxgbe
Attilio Rao
attilio at FreeBSD.org
Sun Jun 24 01:32:43 UTC 2012
Author: attilio
Date: Sun Jun 24 01:32:42 2012
New Revision: 237516
URL: http://svn.freebsd.org/changeset/base/237516
Log:
MFC
Modified:
user/attilio/vmcontention/share/man/man4/acpi_ibm.4
user/attilio/vmcontention/sys/amd64/amd64/pmap.c
user/attilio/vmcontention/sys/conf/files
user/attilio/vmcontention/sys/dev/acpi_support/acpi_ibm.c
user/attilio/vmcontention/sys/dev/agp/agp_i810.c
user/attilio/vmcontention/sys/dev/cxgbe/t4_sge.c
Directory Properties:
user/attilio/vmcontention/ (props changed)
user/attilio/vmcontention/share/man/man4/ (props changed)
user/attilio/vmcontention/sys/ (props changed)
user/attilio/vmcontention/sys/conf/ (props changed)
Modified: user/attilio/vmcontention/share/man/man4/acpi_ibm.4
==============================================================================
--- user/attilio/vmcontention/share/man/man4/acpi_ibm.4 Sun Jun 24 01:28:36 2012 (r237515)
+++ user/attilio/vmcontention/share/man/man4/acpi_ibm.4 Sun Jun 24 01:32:42 2012 (r237516)
@@ -25,7 +25,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd February 8, 2010
+.Dd June 24, 2012
.Dt ACPI_IBM 4
.Os
.Sh NAME
@@ -335,6 +335,17 @@ Built-in battery
.It
UltraBay battery
.El
+.It Va dev.acpi_ibm.0.handlerevents
+.Xr devd 8
+events handled by
+.Nm
+when
+.Va events
+is set to 1.
+Events are specified as a whitespace-separated list of event code in
+hexadecimal or decimal form.
+Note that the event maybe handled twice (eg. Brightness up/down) if ACPI BIOS
+already handled the event.
.El
.Pp
Defaults for these sysctls can be set in
@@ -436,6 +447,19 @@ then
fi
exit 0
.Ed
+.Pp
+The following example specify that event code 0x04 (Suspend to RAM),
+0x10 (Brightness up) and 0x11 (Brightness down) are handled by
+.Nm .
+.Bd -literal -offset indent
+sysctl dev.acpi_ibm.0.handlerevents='0x04 0x10 0x11'
+.Ed
+.Pp
+in
+.Xr sysctl.conf 5 :
+.Bd -literal -offset indent
+dev.acpi_ibm.0.handlerevents=0x04\\ 0x10\\ 0x11
+.Ed
.Sh SEE ALSO
.Xr acpi 4 ,
.Xr led 4 ,
Modified: user/attilio/vmcontention/sys/amd64/amd64/pmap.c
==============================================================================
--- user/attilio/vmcontention/sys/amd64/amd64/pmap.c Sun Jun 24 01:28:36 2012 (r237515)
+++ user/attilio/vmcontention/sys/amd64/amd64/pmap.c Sun Jun 24 01:32:42 2012 (r237516)
@@ -256,6 +256,8 @@ static caddr_t crashdumpmap;
static void free_pv_chunk(struct pv_chunk *pc);
static void free_pv_entry(pmap_t pmap, pv_entry_t pv);
static pv_entry_t get_pv_entry(pmap_t pmap, boolean_t try);
+static int popcnt_pc_map_elem(uint64_t elem);
+static void reserve_pv_entry(pmap_t pmap, int needed);
static void pmap_pv_demote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa);
static boolean_t pmap_pv_insert_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa,
struct rwlock **lockp);
@@ -2394,6 +2396,85 @@ retry:
}
/*
+ * Returns the number of one bits within the given PV chunk map element.
+ */
+static int
+popcnt_pc_map_elem(uint64_t elem)
+{
+ int count;
+
+ /*
+ * This simple method of counting the one bits performs well because
+ * the given element typically contains more zero bits than one bits.
+ */
+ count = 0;
+ for (; elem != 0; elem &= elem - 1)
+ count++;
+ return (count);
+}
+
+/*
+ * Ensure that the number of spare PV entries in the specified pmap meets or
+ * exceeds the given count, "needed".
+ */
+static void
+reserve_pv_entry(pmap_t pmap, int needed)
+{
+ struct pch new_tail;
+ struct pv_chunk *pc;
+ int avail, free;
+ vm_page_t m;
+
+ rw_assert(&pvh_global_lock, RA_LOCKED);
+ PMAP_LOCK_ASSERT(pmap, MA_OWNED);
+
+ /*
+ * Newly allocated PV chunks must be stored in a private list until
+ * the required number of PV chunks have been allocated. Otherwise,
+ * pmap_pv_reclaim() could recycle one of these chunks. In contrast,
+ * these chunks must be added to the pmap upon allocation.
+ */
+ TAILQ_INIT(&new_tail);
+retry:
+ avail = 0;
+ TAILQ_FOREACH(pc, &pmap->pm_pvchunk, pc_list) {
+ free = popcnt_pc_map_elem(pc->pc_map[0]);
+ free += popcnt_pc_map_elem(pc->pc_map[1]);
+ free += popcnt_pc_map_elem(pc->pc_map[2]);
+ if (free == 0)
+ break;
+ avail += free;
+ if (avail >= needed)
+ break;
+ }
+ for (; avail < needed; avail += _NPCPV) {
+ m = vm_page_alloc(NULL, 0, VM_ALLOC_NORMAL | VM_ALLOC_NOOBJ |
+ VM_ALLOC_WIRED);
+ if (m == NULL) {
+ m = pmap_pv_reclaim(pmap);
+ if (m == NULL)
+ goto retry;
+ }
+ PV_STAT(atomic_add_int(&pc_chunk_count, 1));
+ PV_STAT(atomic_add_int(&pc_chunk_allocs, 1));
+ dump_add_page(m->phys_addr);
+ pc = (void *)PHYS_TO_DMAP(m->phys_addr);
+ pc->pc_pmap = pmap;
+ pc->pc_map[0] = PC_FREE0;
+ pc->pc_map[1] = PC_FREE1;
+ pc->pc_map[2] = PC_FREE2;
+ TAILQ_INSERT_HEAD(&pmap->pm_pvchunk, pc, pc_list);
+ TAILQ_INSERT_TAIL(&new_tail, pc, pc_lru);
+ PV_STAT(atomic_add_int(&pv_entry_spare, _NPCPV));
+ }
+ if (!TAILQ_EMPTY(&new_tail)) {
+ mtx_lock(&pv_chunks_mutex);
+ TAILQ_CONCAT(&pv_chunks, &new_tail, pc_lru);
+ mtx_unlock(&pv_chunks_mutex);
+ }
+}
+
+/*
* First find and then remove the pv entry for the specified pmap and virtual
* address from the specified pv list. Returns the pv entry if found and NULL
* otherwise. This operation can be performed on pv lists for either 4KB or
@@ -2430,6 +2511,7 @@ pmap_pv_demote_pde(pmap_t pmap, vm_offse
rw_assert(&pvh_global_lock, RA_WLOCKED);
KASSERT((pa & PDRMASK) == 0,
("pmap_pv_demote_pde: pa is not 2mpage aligned"));
+ reserve_pv_entry(pmap, NPTEPG - 1);
/*
* Transfer the 2mpage's pv entry for this mapping to the first
@@ -2448,7 +2530,7 @@ pmap_pv_demote_pde(pmap_t pmap, vm_offse
KASSERT((m->oflags & VPO_UNMANAGED) == 0,
("pmap_pv_demote_pde: page %p is not managed", m));
va += PAGE_SIZE;
- pv = get_pv_entry(pmap, FALSE);
+ pv = get_pv_entry(pmap, TRUE);
pv->pv_va = va;
TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_next);
} while (va < va_last);
Modified: user/attilio/vmcontention/sys/conf/files
==============================================================================
--- user/attilio/vmcontention/sys/conf/files Sun Jun 24 01:28:36 2012 (r237515)
+++ user/attilio/vmcontention/sys/conf/files Sun Jun 24 01:32:42 2012 (r237516)
@@ -161,9 +161,11 @@ cddl/compat/opensolaris/kern/opensolaris
cddl/compat/opensolaris/kern/opensolaris_zone.c optional zfs compile-with "${ZFS_C}"
cddl/contrib/opensolaris/common/acl/acl_common.c optional zfs compile-with "${ZFS_C}"
cddl/contrib/opensolaris/common/avl/avl.c optional zfs compile-with "${ZFS_C}"
+cddl/contrib/opensolaris/common/nvpair/fnvpair.c optional zfs compile-with "${ZFS_C}"
cddl/contrib/opensolaris/common/nvpair/nvpair.c optional zfs compile-with "${ZFS_C}"
cddl/contrib/opensolaris/common/nvpair/nvpair_alloc_fixed.c optional zfs compile-with "${ZFS_C}"
cddl/contrib/opensolaris/common/unicode/u8_textprep.c optional zfs compile-with "${ZFS_C}"
+cddl/contrib/opensolaris/common/zfs/zfeature_common.c optional zfs compile-with "${ZFS_C}"
cddl/contrib/opensolaris/common/zfs/zfs_comutil.c optional zfs compile-with "${ZFS_C}"
cddl/contrib/opensolaris/common/zfs/zfs_deleg.c optional zfs compile-with "${ZFS_C}"
cddl/contrib/opensolaris/common/zfs/zfs_fletcher.c optional zfs compile-with "${ZFS_C}"
@@ -177,6 +179,7 @@ cddl/contrib/opensolaris/uts/common/fs/v
cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c optional zfs compile-with "${ZFS_C}"
cddl/contrib/opensolaris/uts/common/fs/zfs/bplist.c optional zfs compile-with "${ZFS_C}"
cddl/contrib/opensolaris/uts/common/fs/zfs/bpobj.c optional zfs compile-with "${ZFS_C}"
+cddl/contrib/opensolaris/uts/common/fs/zfs/bptree.c optional zfs compile-with "${ZFS_C}"
cddl/contrib/opensolaris/uts/common/fs/zfs/dbuf.c optional zfs compile-with "${ZFS_C}"
cddl/contrib/opensolaris/uts/common/fs/zfs/ddt.c optional zfs compile-with "${ZFS_C}"
cddl/contrib/opensolaris/uts/common/fs/zfs/ddt_zap.c optional zfs compile-with "${ZFS_C}"
@@ -228,6 +231,7 @@ cddl/contrib/opensolaris/uts/common/fs/z
cddl/contrib/opensolaris/uts/common/fs/zfs/zap.c optional zfs compile-with "${ZFS_C}"
cddl/contrib/opensolaris/uts/common/fs/zfs/zap_leaf.c optional zfs compile-with "${ZFS_C}"
cddl/contrib/opensolaris/uts/common/fs/zfs/zap_micro.c optional zfs compile-with "${ZFS_C}"
+cddl/contrib/opensolaris/uts/common/fs/zfs/zfeature.c optional zfs compile-with "${ZFS_C}"
cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_acl.c optional zfs compile-with "${ZFS_C}"
cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_byteswap.c optional zfs compile-with "${ZFS_C}"
cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ctldir.c optional zfs compile-with "${ZFS_C}"
Modified: user/attilio/vmcontention/sys/dev/acpi_support/acpi_ibm.c
==============================================================================
--- user/attilio/vmcontention/sys/dev/acpi_support/acpi_ibm.c Sun Jun 24 01:28:36 2012 (r237515)
+++ user/attilio/vmcontention/sys/dev/acpi_support/acpi_ibm.c Sun Jun 24 01:32:42 2012 (r237516)
@@ -50,6 +50,8 @@ __FBSDID("$FreeBSD$");
#include <sys/module.h>
#include <dev/acpica/acpivar.h>
#include <dev/led/led.h>
+#include <sys/power.h>
+#include <sys/sbuf.h>
#include <sys/sysctl.h>
#include <isa/rtc.h>
@@ -70,6 +72,7 @@ ACPI_MODULE_NAME("IBM")
#define ACPI_IBM_METHOD_FANLEVEL 11
#define ACPI_IBM_METHOD_FANSTATUS 12
#define ACPI_IBM_METHOD_THERMAL 13
+#define ACPI_IBM_METHOD_HANDLEREVENTS 14
/* Hotkeys/Buttons */
#define IBM_RTC_HOTKEY1 0x64
@@ -126,6 +129,21 @@ ACPI_MODULE_NAME("IBM")
#define IBM_NAME_EVENTS_GET "MHKP"
#define IBM_NAME_EVENTS_AVAILMASK "MHKA"
+/* Event Code */
+#define IBM_EVENT_LCD_BACKLIGHT 0x03
+#define IBM_EVENT_SUSPEND_TO_RAM 0x04
+#define IBM_EVENT_BLUETOOTH 0x05
+#define IBM_EVENT_SCREEN_EXPAND 0x07
+#define IBM_EVENT_SUSPEND_TO_DISK 0x0c
+#define IBM_EVENT_BRIGHTNESS_UP 0x10
+#define IBM_EVENT_BRIGHTNESS_DOWN 0x11
+#define IBM_EVENT_THINKLIGHT 0x12
+#define IBM_EVENT_ZOOM 0x14
+#define IBM_EVENT_VOLUME_UP 0x15
+#define IBM_EVENT_VOLUME_DOWN 0x16
+#define IBM_EVENT_MUTE 0x17
+#define IBM_EVENT_ACCESS_IBM_BUTTON 0x18
+
#define ABS(x) (((x) < 0)? -(x) : (x))
struct acpi_ibm_softc {
@@ -164,6 +182,8 @@ struct acpi_ibm_softc {
int events_mask_supported;
int events_enable;
+ unsigned int handler_events;
+
struct sysctl_ctx_list *sysctl_ctx;
struct sysctl_oid *sysctl_tree;
};
@@ -267,8 +287,15 @@ static int acpi_ibm_sysctl_set(struct ac
static int acpi_ibm_eventmask_set(struct acpi_ibm_softc *sc, int val);
static int acpi_ibm_thermal_sysctl(SYSCTL_HANDLER_ARGS);
+static int acpi_ibm_handlerevents_sysctl(SYSCTL_HANDLER_ARGS);
static void acpi_ibm_notify(ACPI_HANDLE h, UINT32 notify, void *context);
+static int acpi_ibm_brightness_set(struct acpi_ibm_softc *sc, int arg);
+static int acpi_ibm_bluetooth_set(struct acpi_ibm_softc *sc, int arg);
+static int acpi_ibm_thinklight_set(struct acpi_ibm_softc *sc, int arg);
+static int acpi_ibm_volume_set(struct acpi_ibm_softc *sc, int arg);
+static int acpi_ibm_mute_set(struct acpi_ibm_softc *sc, int arg);
+
static device_method_t acpi_ibm_methods[] = {
/* Device interface */
DEVMETHOD(device_probe, acpi_ibm_probe),
@@ -404,6 +431,15 @@ acpi_ibm_attach(device_t dev)
"Thermal zones");
}
+ /* Hook up handlerevents node */
+ if (acpi_ibm_sysctl_init(sc, ACPI_IBM_METHOD_HANDLEREVENTS)) {
+ SYSCTL_ADD_PROC(sc->sysctl_ctx,
+ SYSCTL_CHILDREN(sc->sysctl_tree), OID_AUTO,
+ "handlerevents", CTLTYPE_STRING | CTLFLAG_RW,
+ sc, 0, acpi_ibm_handlerevents_sysctl, "I",
+ "devd(8) events handled by acpi_ibm");
+ }
+
/* Handle notifies */
AcpiInstallNotifyHandler(sc->handle, ACPI_DEVICE_NOTIFY,
acpi_ibm_notify, dev);
@@ -656,10 +692,8 @@ acpi_ibm_sysctl_get(struct acpi_ibm_soft
static int
acpi_ibm_sysctl_set(struct acpi_ibm_softc *sc, int method, int arg)
{
- int val, step;
+ int val;
UINT64 val_ec;
- ACPI_OBJECT Arg;
- ACPI_OBJECT_LIST Args;
ACPI_STATUS status;
ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
@@ -683,101 +717,23 @@ acpi_ibm_sysctl_set(struct acpi_ibm_soft
break;
case ACPI_IBM_METHOD_BRIGHTNESS:
- if (arg < 0 || arg > 7)
- return (EINVAL);
-
- if (sc->cmos_handle) {
- /* Read the current brightness */
- status = ACPI_EC_READ(sc->ec_dev, IBM_EC_BRIGHTNESS, &val_ec, 1);
- if (ACPI_FAILURE(status))
- return (status);
- val = val_ec & IBM_EC_MASK_BRI;
-
- Args.Count = 1;
- Args.Pointer = &Arg;
- Arg.Type = ACPI_TYPE_INTEGER;
- Arg.Integer.Value = (arg > val) ? IBM_CMOS_BRIGHTNESS_UP : IBM_CMOS_BRIGHTNESS_DOWN;
-
- step = (arg > val) ? 1 : -1;
- for (int i = val; i != arg; i += step) {
- status = AcpiEvaluateObject(sc->cmos_handle, NULL, &Args, NULL);
- if (ACPI_FAILURE(status))
- break;
- }
- }
- return ACPI_EC_WRITE(sc->ec_dev, IBM_EC_BRIGHTNESS, arg, 1);
+ return acpi_ibm_brightness_set(sc, arg);
break;
case ACPI_IBM_METHOD_VOLUME:
- if (arg < 0 || arg > 14)
- return (EINVAL);
-
- status = ACPI_EC_READ(sc->ec_dev, IBM_EC_VOLUME, &val_ec, 1);
- if (ACPI_FAILURE(status))
- return (status);
-
- if (sc->cmos_handle) {
- val = val_ec & IBM_EC_MASK_VOL;
-
- Args.Count = 1;
- Args.Pointer = &Arg;
- Arg.Type = ACPI_TYPE_INTEGER;
- Arg.Integer.Value = (arg > val) ? IBM_CMOS_VOLUME_UP : IBM_CMOS_VOLUME_DOWN;
-
- step = (arg > val) ? 1 : -1;
- for (int i = val; i != arg; i += step) {
- status = AcpiEvaluateObject(sc->cmos_handle, NULL, &Args, NULL);
- if (ACPI_FAILURE(status))
- break;
- }
- }
- return ACPI_EC_WRITE(sc->ec_dev, IBM_EC_VOLUME, arg + (val_ec & (~IBM_EC_MASK_VOL)), 1);
+ return acpi_ibm_volume_set(sc, arg);
break;
case ACPI_IBM_METHOD_MUTE:
- if (arg < 0 || arg > 1)
- return (EINVAL);
-
- status = ACPI_EC_READ(sc->ec_dev, IBM_EC_VOLUME, &val_ec, 1);
- if (ACPI_FAILURE(status))
- return (status);
-
- if (sc->cmos_handle) {
- Args.Count = 1;
- Args.Pointer = &Arg;
- Arg.Type = ACPI_TYPE_INTEGER;
- Arg.Integer.Value = IBM_CMOS_VOLUME_MUTE;
-
- status = AcpiEvaluateObject(sc->cmos_handle, NULL, &Args, NULL);
- if (ACPI_FAILURE(status))
- break;
- }
- return ACPI_EC_WRITE(sc->ec_dev, IBM_EC_VOLUME, (arg==1) ? val_ec | IBM_EC_MASK_MUTE : val_ec & (~IBM_EC_MASK_MUTE), 1);
+ return acpi_ibm_mute_set(sc, arg);
break;
case ACPI_IBM_METHOD_THINKLIGHT:
- if (arg < 0 || arg > 1)
- return (EINVAL);
-
- if (sc->light_set_supported) {
- Args.Count = 1;
- Args.Pointer = &Arg;
- Arg.Type = ACPI_TYPE_INTEGER;
- Arg.Integer.Value = arg ? sc->light_cmd_on : sc->light_cmd_off;
-
- status = AcpiEvaluateObject(sc->light_handle, NULL, &Args, NULL);
- if (ACPI_SUCCESS(status))
- sc->light_val = arg;
- return (status);
- }
+ return acpi_ibm_thinklight_set(sc, arg);
break;
case ACPI_IBM_METHOD_BLUETOOTH:
- if (arg < 0 || arg > 1)
- return (EINVAL);
-
- val = (arg == 1) ? sc->wlan_bt_flags | IBM_NAME_MASK_BT : sc->wlan_bt_flags & (~IBM_NAME_MASK_BT);
- return acpi_SetInteger(sc->handle, IBM_NAME_WLAN_BT_SET, val);
+ return acpi_ibm_bluetooth_set(sc, arg);
break;
case ACPI_IBM_METHOD_FANLEVEL:
@@ -898,6 +854,9 @@ acpi_ibm_sysctl_init(struct acpi_ibm_sof
return (TRUE);
}
return (FALSE);
+
+ case ACPI_IBM_METHOD_HANDLEREVENTS:
+ return (TRUE);
}
return (FALSE);
}
@@ -937,6 +896,328 @@ acpi_ibm_thermal_sysctl(SYSCTL_HANDLER_A
return (error);
}
+static int
+acpi_ibm_handlerevents_sysctl(SYSCTL_HANDLER_ARGS)
+{
+ struct acpi_ibm_softc *sc;
+ int error = 0;
+ struct sbuf sb;
+ char *cp, *ep;
+ int l, val;
+ unsigned int handler_events;
+
+ ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
+
+ sc = (struct acpi_ibm_softc *)oidp->oid_arg1;
+
+ if (sbuf_new(&sb, NULL, 128, SBUF_AUTOEXTEND) == NULL)
+ return (ENOMEM);
+
+ ACPI_SERIAL_BEGIN(ibm);
+
+ /* Get old values if this is a get request. */
+ if (req->newptr == NULL) {
+ for (int i = 0; i < 8 * sizeof(sc->handler_events); i++)
+ if (sc->handler_events & (1 << i))
+ sbuf_printf(&sb, "0x%02x ", i + 1);
+ if (sbuf_len(&sb) == 0)
+ sbuf_printf(&sb, "NONE");
+ }
+
+ sbuf_trim(&sb);
+ sbuf_finish(&sb);
+
+ /* Copy out the old values to the user. */
+ error = SYSCTL_OUT(req, sbuf_data(&sb), sbuf_len(&sb));
+ sbuf_delete(&sb);
+
+ if (error != 0 || req->newptr == NULL)
+ goto out;
+
+ /* If the user is setting a string, parse it. */
+ handler_events = 0;
+ cp = (char *)req->newptr;
+ while (*cp) {
+ if (isspace(*cp)) {
+ cp++;
+ continue;
+ }
+
+ ep = cp;
+
+ while (*ep && !isspace(*ep))
+ ep++;
+
+ l = ep - cp;
+ if (l == 0)
+ break;
+
+ if (strncmp(cp, "NONE", 4) == 0) {
+ cp = ep;
+ continue;
+ }
+
+ if (l >= 3 && cp[0] == '0' && (cp[1] == 'X' || cp[1] == 'x'))
+ val = strtoul(cp, &ep, 16);
+ else
+ val = strtoul(cp, &ep, 10);
+
+ if (val == 0 || ep == cp || val >= 8 * sizeof(handler_events)) {
+ cp[l] = '\0';
+ device_printf(sc->dev, "invalid event code: %s\n", cp);
+ error = EINVAL;
+ goto out;
+ }
+
+ handler_events |= 1 << (val - 1);
+
+ cp = ep;
+ }
+
+ sc->handler_events = handler_events;
+out:
+ ACPI_SERIAL_END(ibm);
+ return (error);
+}
+
+static int
+acpi_ibm_brightness_set(struct acpi_ibm_softc *sc, int arg)
+{
+ int val, step;
+ UINT64 val_ec;
+ ACPI_OBJECT Arg;
+ ACPI_OBJECT_LIST Args;
+ ACPI_STATUS status;
+
+ ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
+ ACPI_SERIAL_ASSERT(ibm);
+
+ if (arg < 0 || arg > 7)
+ return (EINVAL);
+
+ /* Read the current brightness */
+ status = ACPI_EC_READ(sc->ec_dev, IBM_EC_BRIGHTNESS, &val_ec, 1);
+ if (ACPI_FAILURE(status))
+ return (status);
+
+ if (sc->cmos_handle) {
+ val = val_ec & IBM_EC_MASK_BRI;
+
+ Args.Count = 1;
+ Args.Pointer = &Arg;
+ Arg.Type = ACPI_TYPE_INTEGER;
+ Arg.Integer.Value = (arg > val) ? IBM_CMOS_BRIGHTNESS_UP :
+ IBM_CMOS_BRIGHTNESS_DOWN;
+
+ step = (arg > val) ? 1 : -1;
+ for (int i = val; i != arg; i += step) {
+ status = AcpiEvaluateObject(sc->cmos_handle, NULL,
+ &Args, NULL);
+ if (ACPI_FAILURE(status)) {
+ /* Record the last value */
+ if (i != val) {
+ ACPI_EC_WRITE(sc->ec_dev,
+ IBM_EC_BRIGHTNESS, i - step, 1);
+ }
+ return (status);
+ }
+ }
+ }
+
+ return ACPI_EC_WRITE(sc->ec_dev, IBM_EC_BRIGHTNESS, arg, 1);
+}
+
+static int
+acpi_ibm_bluetooth_set(struct acpi_ibm_softc *sc, int arg)
+{
+ int val;
+
+ ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
+ ACPI_SERIAL_ASSERT(ibm);
+
+ if (arg < 0 || arg > 1)
+ return (EINVAL);
+
+ val = (arg == 1) ? sc->wlan_bt_flags | IBM_NAME_MASK_BT :
+ sc->wlan_bt_flags & (~IBM_NAME_MASK_BT);
+ return acpi_SetInteger(sc->handle, IBM_NAME_WLAN_BT_SET, val);
+}
+
+static int
+acpi_ibm_thinklight_set(struct acpi_ibm_softc *sc, int arg)
+{
+ ACPI_OBJECT Arg;
+ ACPI_OBJECT_LIST Args;
+ ACPI_STATUS status;
+
+ ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
+ ACPI_SERIAL_ASSERT(ibm);
+
+ if (arg < 0 || arg > 1)
+ return (EINVAL);
+
+ if (sc->light_set_supported) {
+ Args.Count = 1;
+ Args.Pointer = &Arg;
+ Arg.Type = ACPI_TYPE_INTEGER;
+ Arg.Integer.Value = arg ? sc->light_cmd_on : sc->light_cmd_off;
+
+ status = AcpiEvaluateObject(sc->light_handle, NULL,
+ &Args, NULL);
+ if (ACPI_SUCCESS(status))
+ sc->light_val = arg;
+ return (status);
+ }
+
+ return (0);
+}
+
+static int
+acpi_ibm_volume_set(struct acpi_ibm_softc *sc, int arg)
+{
+ int val, step;
+ UINT64 val_ec;
+ ACPI_OBJECT Arg;
+ ACPI_OBJECT_LIST Args;
+ ACPI_STATUS status;
+
+ ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
+ ACPI_SERIAL_ASSERT(ibm);
+
+ if (arg < 0 || arg > 14)
+ return (EINVAL);
+
+ /* Read the current volume */
+ status = ACPI_EC_READ(sc->ec_dev, IBM_EC_VOLUME, &val_ec, 1);
+ if (ACPI_FAILURE(status))
+ return (status);
+
+ if (sc->cmos_handle) {
+ val = val_ec & IBM_EC_MASK_VOL;
+
+ Args.Count = 1;
+ Args.Pointer = &Arg;
+ Arg.Type = ACPI_TYPE_INTEGER;
+ Arg.Integer.Value = (arg > val) ? IBM_CMOS_VOLUME_UP :
+ IBM_CMOS_VOLUME_DOWN;
+
+ step = (arg > val) ? 1 : -1;
+ for (int i = val; i != arg; i += step) {
+ status = AcpiEvaluateObject(sc->cmos_handle, NULL,
+ &Args, NULL);
+ if (ACPI_FAILURE(status)) {
+ /* Record the last value */
+ if (i != val) {
+ val_ec = i - step +
+ (val_ec & (~IBM_EC_MASK_VOL));
+ ACPI_EC_WRITE(sc->ec_dev, IBM_EC_VOLUME,
+ val_ec, 1);
+ }
+ return (status);
+ }
+ }
+ }
+
+ val_ec = arg + (val_ec & (~IBM_EC_MASK_VOL));
+ return ACPI_EC_WRITE(sc->ec_dev, IBM_EC_VOLUME, val_ec, 1);
+}
+
+static int
+acpi_ibm_mute_set(struct acpi_ibm_softc *sc, int arg)
+{
+ UINT64 val_ec;
+ ACPI_OBJECT Arg;
+ ACPI_OBJECT_LIST Args;
+ ACPI_STATUS status;
+
+ ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
+ ACPI_SERIAL_ASSERT(ibm);
+
+ if (arg < 0 || arg > 1)
+ return (EINVAL);
+
+ status = ACPI_EC_READ(sc->ec_dev, IBM_EC_VOLUME, &val_ec, 1);
+ if (ACPI_FAILURE(status))
+ return (status);
+
+ if (sc->cmos_handle) {
+ Args.Count = 1;
+ Args.Pointer = &Arg;
+ Arg.Type = ACPI_TYPE_INTEGER;
+ Arg.Integer.Value = IBM_CMOS_VOLUME_MUTE;
+
+ status = AcpiEvaluateObject(sc->cmos_handle, NULL, &Args, NULL);
+ if (ACPI_FAILURE(status))
+ return (status);
+ }
+
+ val_ec = (arg == 1) ? val_ec | IBM_EC_MASK_MUTE :
+ val_ec & (~IBM_EC_MASK_MUTE);
+ return ACPI_EC_WRITE(sc->ec_dev, IBM_EC_VOLUME, val_ec, 1);
+}
+
+static void
+acpi_ibm_eventhandler(struct acpi_ibm_softc *sc, int arg)
+{
+ int val;
+ UINT64 val_ec;
+ ACPI_STATUS status;
+
+ ACPI_SERIAL_BEGIN(ibm);
+ switch (arg) {
+ case IBM_EVENT_SUSPEND_TO_RAM:
+ power_pm_suspend(POWER_SLEEP_STATE_SUSPEND);
+ break;
+
+ case IBM_EVENT_BLUETOOTH:
+ acpi_ibm_bluetooth_set(sc, (sc->wlan_bt_flags == 0));
+ break;
+
+ case IBM_EVENT_BRIGHTNESS_UP:
+ case IBM_EVENT_BRIGHTNESS_DOWN:
+ /* Read the current brightness */
+ status = ACPI_EC_READ(sc->ec_dev, IBM_EC_BRIGHTNESS,
+ &val_ec, 1);
+ if (ACPI_FAILURE(status))
+ return;
+
+ val = val_ec & IBM_EC_MASK_BRI;
+ val = (arg == IBM_EVENT_BRIGHTNESS_UP) ? val + 1 : val - 1;
+ acpi_ibm_brightness_set(sc, val);
+ break;
+
+ case IBM_EVENT_THINKLIGHT:
+ acpi_ibm_thinklight_set(sc, (sc->light_val == 0));
+ break;
+
+ case IBM_EVENT_VOLUME_UP:
+ case IBM_EVENT_VOLUME_DOWN:
+ /* Read the current volume */
+ status = ACPI_EC_READ(sc->ec_dev, IBM_EC_VOLUME, &val_ec, 1);
+ if (ACPI_FAILURE(status))
+ return;
+
+ val = val_ec & IBM_EC_MASK_VOL;
+ val = (arg == IBM_EVENT_VOLUME_UP) ? val + 1 : val - 1;
+ acpi_ibm_volume_set(sc, val);
+ break;
+
+ case IBM_EVENT_MUTE:
+ /* Read the current value */
+ status = ACPI_EC_READ(sc->ec_dev, IBM_EC_VOLUME, &val_ec, 1);
+ if (ACPI_FAILURE(status))
+ return;
+
+ val = ((val_ec & IBM_EC_MASK_MUTE) == IBM_EC_MASK_MUTE);
+ acpi_ibm_mute_set(sc, (val == 0));
+ break;
+
+ default:
+ break;
+ }
+ ACPI_SERIAL_END(ibm);
+}
+
static void
acpi_ibm_notify(ACPI_HANDLE h, UINT32 notify, void *context)
{
@@ -965,6 +1246,10 @@ acpi_ibm_notify(ACPI_HANDLE h, UINT32 no
break;
}
+ /* Execute event handler */
+ if (sc->handler_events & (1 << (arg - 1)))
+ acpi_ibm_eventhandler(sc, (arg & 0xff));
+
/* Notify devd(8) */
acpi_UserNotify("IBM", h, (arg & 0xff));
break;
Modified: user/attilio/vmcontention/sys/dev/agp/agp_i810.c
==============================================================================
--- user/attilio/vmcontention/sys/dev/agp/agp_i810.c Sun Jun 24 01:28:36 2012 (r237515)
+++ user/attilio/vmcontention/sys/dev/agp/agp_i810.c Sun Jun 24 01:32:42 2012 (r237516)
@@ -700,7 +700,7 @@ static const struct agp_i810_match {
.driver = &agp_i810_sb_driver
},
{
- .devid = 0x01088086,
+ .devid = 0x010a8086,
.name = "SandyBridge server IG",
.driver = &agp_i810_sb_driver
},
Modified: user/attilio/vmcontention/sys/dev/cxgbe/t4_sge.c
==============================================================================
--- user/attilio/vmcontention/sys/dev/cxgbe/t4_sge.c Sun Jun 24 01:28:36 2012 (r237515)
+++ user/attilio/vmcontention/sys/dev/cxgbe/t4_sge.c Sun Jun 24 01:32:42 2012 (r237516)
@@ -70,12 +70,8 @@ enum {
FL_PKTSHIFT = 2
};
-#define FL_ALIGN min(CACHE_LINE_SIZE, 32)
-#if CACHE_LINE_SIZE > 64
-#define SPG_LEN 128
-#else
-#define SPG_LEN 64
-#endif
+static int fl_pad = CACHE_LINE_SIZE;
+static int spg_len = 64;
/* Used to track coalesced tx work request */
struct txpkts {
@@ -167,6 +163,10 @@ static int handle_fw_rpl(struct sge_iq *
static int sysctl_uint16(SYSCTL_HANDLER_ARGS);
+#if defined(__i386__) || defined(__amd64__)
+extern u_int cpu_clflush_line_size;
+#endif
+
/*
* Called on MOD_LOAD and fills up fl_buf_info[].
*/
@@ -188,6 +188,11 @@ t4_sge_modload(void)
FL_BUF_TYPE(i) = m_gettype(bufsize[i]);
FL_BUF_ZONE(i) = m_getzone(bufsize[i]);
}
+
+#if defined(__i386__) || defined(__amd64__)
+ fl_pad = max(cpu_clflush_line_size, 32);
+ spg_len = cpu_clflush_line_size > 64 ? 128 : 64;
+#endif
}
/**
@@ -209,8 +214,8 @@ t4_sge_init(struct adapter *sc)
V_INGPADBOUNDARY(M_INGPADBOUNDARY) |
F_EGRSTATUSPAGESIZE;
ctrl_val = V_PKTSHIFT(FL_PKTSHIFT) | F_RXPKTCPLMODE |
- V_INGPADBOUNDARY(ilog2(FL_ALIGN) - 5) |
- V_EGRSTATUSPAGESIZE(SPG_LEN == 128);
+ V_INGPADBOUNDARY(ilog2(fl_pad) - 5) |
+ V_EGRSTATUSPAGESIZE(spg_len == 128);
hpsize = V_HOSTPAGESIZEPF0(PAGE_SHIFT - 10) |
V_HOSTPAGESIZEPF1(PAGE_SHIFT - 10) |
@@ -1372,8 +1377,8 @@ t4_update_fl_bufsize(struct ifnet *ifp)
int i, bufsize;
/* large enough for a frame even when VLAN extraction is disabled */
- bufsize = FL_PKTSHIFT + ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN +
- ifp->if_mtu;
+ bufsize = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN + ifp->if_mtu;
+ bufsize = roundup(bufsize + FL_PKTSHIFT, fl_pad);
for_each_rxq(pi, i, rxq) {
fl = &rxq->fl;
@@ -1570,7 +1575,7 @@ alloc_iq_fl(struct port_info *pi, struct
return (rc);
/* Allocate space for one software descriptor per buffer. */
- fl->cap = (fl->qsize - SPG_LEN / RX_FL_ESIZE) * 8;
+ fl->cap = (fl->qsize - spg_len / RX_FL_ESIZE) * 8;
FL_LOCK(fl);
rc = alloc_fl_sdesc(fl);
FL_UNLOCK(fl);
@@ -2070,7 +2075,7 @@ alloc_eq(struct adapter *sc, struct port
if (rc)
return (rc);
- eq->cap = eq->qsize - SPG_LEN / EQ_ESIZE;
+ eq->cap = eq->qsize - spg_len / EQ_ESIZE;
eq->spg = (void *)&eq->desc[eq->cap];
eq->avail = eq->cap - 1; /* one less to avoid cidx = pidx */
eq->pidx = eq->cidx = 0;
More information about the svn-src-user
mailing list