summaryrefslogtreecommitdiff
path: root/usr/src/uts
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/uts')
-rw-r--r--usr/src/uts/common/fs/zfs/dsl_prop.c12
-rw-r--r--usr/src/uts/common/fs/zfs/sys/dsl_prop.h9
-rw-r--r--usr/src/uts/common/fs/zfs/zcp_synctask.c86
-rw-r--r--usr/src/uts/common/io/scsi/impl/scsi_resource.c1
-rw-r--r--usr/src/uts/common/os/sunddi.c98
-rw-r--r--usr/src/uts/common/sys/ddi_impldefs.h4
-rw-r--r--usr/src/uts/common/sys/smbios.h31
-rw-r--r--usr/src/uts/common/sys/sunddi.h14
-rw-r--r--usr/src/uts/i86pc/io/rootnex.c13
-rw-r--r--usr/src/uts/sun4/io/px/px.c12
-rw-r--r--usr/src/uts/sun4/io/px/px_dma.c6
-rw-r--r--usr/src/uts/sun4u/io/pci/pci.c12
-rw-r--r--usr/src/uts/sun4u/io/pci/pci_dma.c6
-rw-r--r--usr/src/uts/sun4v/io/niumx/niumx.c5
14 files changed, 298 insertions, 11 deletions
diff --git a/usr/src/uts/common/fs/zfs/dsl_prop.c b/usr/src/uts/common/fs/zfs/dsl_prop.c
index 8197f0685a..7fc8553493 100644
--- a/usr/src/uts/common/fs/zfs/dsl_prop.c
+++ b/usr/src/uts/common/fs/zfs/dsl_prop.c
@@ -22,7 +22,7 @@
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2012, 2015 by Delphix. All rights reserved.
* Copyright (c) 2013 Martin Matuska. All rights reserved.
- * Copyright 2015, Joyent, Inc.
+ * Copyright 2019 Joyent, Inc.
*/
#include <sys/zfs_context.h>
@@ -802,13 +802,7 @@ dsl_prop_inherit(const char *dsname, const char *propname,
return (error);
}
-typedef struct dsl_props_set_arg {
- const char *dpsa_dsname;
- zprop_source_t dpsa_source;
- nvlist_t *dpsa_props;
-} dsl_props_set_arg_t;
-
-static int
+int
dsl_props_set_check(void *arg, dmu_tx_t *tx)
{
dsl_props_set_arg_t *dpsa = arg;
@@ -886,7 +880,7 @@ dsl_props_set_sync_impl(dsl_dataset_t *ds, zprop_source_t source,
}
}
-static void
+void
dsl_props_set_sync(void *arg, dmu_tx_t *tx)
{
dsl_props_set_arg_t *dpsa = arg;
diff --git a/usr/src/uts/common/fs/zfs/sys/dsl_prop.h b/usr/src/uts/common/fs/zfs/sys/dsl_prop.h
index 21e6f4674b..9afaf6f2b7 100644
--- a/usr/src/uts/common/fs/zfs/sys/dsl_prop.h
+++ b/usr/src/uts/common/fs/zfs/sys/dsl_prop.h
@@ -21,6 +21,7 @@
/*
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2012 by Delphix. All rights reserved.
+ * Copyright 2019 Joyent, Inc.
*/
#ifndef _SYS_DSL_PROP_H
@@ -61,6 +62,12 @@ typedef struct dsl_props_arg {
zprop_source_t pa_source;
} dsl_props_arg_t;
+typedef struct dsl_props_set_arg {
+ const char *dpsa_dsname;
+ zprop_source_t dpsa_source;
+ nvlist_t *dpsa_props;
+} dsl_props_set_arg_t;
+
void dsl_prop_init(dsl_dir_t *dd);
void dsl_prop_fini(dsl_dir_t *dd);
int dsl_prop_register(struct dsl_dataset *ds, const char *propname,
@@ -83,6 +90,8 @@ int dsl_prop_get_dd(struct dsl_dir *dd, const char *propname,
int intsz, int numints, void *buf, char *setpoint,
boolean_t snapshot);
+int dsl_props_set_check(void *arg, dmu_tx_t *tx);
+void dsl_props_set_sync(void *arg, dmu_tx_t *tx);
void dsl_props_set_sync_impl(struct dsl_dataset *ds, zprop_source_t source,
nvlist_t *props, dmu_tx_t *tx);
void dsl_prop_set_sync_impl(struct dsl_dataset *ds, const char *propname,
diff --git a/usr/src/uts/common/fs/zfs/zcp_synctask.c b/usr/src/uts/common/fs/zfs/zcp_synctask.c
index 25d970ec08..f479a50ea3 100644
--- a/usr/src/uts/common/fs/zfs/zcp_synctask.c
+++ b/usr/src/uts/common/fs/zfs/zcp_synctask.c
@@ -15,6 +15,7 @@
/*
* Copyright (c) 2016, 2017 by Delphix. All rights reserved.
+ * Copyright 2020 Joyent, Inc.
*/
#include "lua.h"
@@ -35,6 +36,12 @@
#define DST_AVG_BLKSHIFT 14
+typedef struct zcp_inherit_prop_arg {
+ lua_State *zipa_state;
+ const char *zipa_prop;
+ dsl_props_set_arg_t zipa_dpsa;
+} zcp_inherit_prop_arg_t;
+
typedef int (zcp_synctask_func_t)(lua_State *, boolean_t, nvlist_t *);
typedef struct zcp_synctask_info {
const char *name;
@@ -275,6 +282,84 @@ zcp_synctask_snapshot(lua_State *state, boolean_t sync, nvlist_t *err_details)
return (err);
}
+static int zcp_synctask_inherit_prop(lua_State *, boolean_t,
+ nvlist_t *err_details);
+static zcp_synctask_info_t zcp_synctask_inherit_prop_info = {
+ .name = "inherit",
+ .func = zcp_synctask_inherit_prop,
+ .space_check = ZFS_SPACE_CHECK_RESERVED,
+ .blocks_modified = 2, /* 2 * numprops */
+ .pargs = {
+ { .za_name = "dataset", .za_lua_type = LUA_TSTRING },
+ { .za_name = "property", .za_lua_type = LUA_TSTRING },
+ { NULL, 0 }
+ },
+ .kwargs = {
+ { NULL, 0 }
+ },
+};
+
+static int
+zcp_synctask_inherit_prop_check(void *arg, dmu_tx_t *tx)
+{
+ zcp_inherit_prop_arg_t *args = arg;
+ zfs_prop_t prop = zfs_name_to_prop(args->zipa_prop);
+
+ if (prop == ZPROP_INVAL) {
+ if (zfs_prop_user(args->zipa_prop))
+ return (0);
+
+ return (EINVAL);
+ }
+
+ if (zfs_prop_readonly(prop))
+ return (EINVAL);
+
+ if (!zfs_prop_inheritable(prop))
+ return (EINVAL);
+
+ return (dsl_props_set_check(&args->zipa_dpsa, tx));
+}
+
+static void
+zcp_synctask_inherit_prop_sync(void *arg, dmu_tx_t *tx)
+{
+ zcp_inherit_prop_arg_t *args = arg;
+ dsl_props_set_arg_t *dpsa = &args->zipa_dpsa;
+
+ dsl_props_set_sync(dpsa, tx);
+}
+
+static int
+zcp_synctask_inherit_prop(lua_State *state, boolean_t sync,
+ nvlist_t *err_details)
+{
+ int err;
+ zcp_inherit_prop_arg_t zipa = { 0 };
+ dsl_props_set_arg_t *dpsa = &zipa.zipa_dpsa;
+
+ const char *dsname = lua_tostring(state, 1);
+ const char *prop = lua_tostring(state, 2);
+
+ zipa.zipa_state = state;
+ zipa.zipa_prop = prop;
+ dpsa->dpsa_dsname = dsname;
+ dpsa->dpsa_source = ZPROP_SRC_INHERITED;
+ dpsa->dpsa_props = fnvlist_alloc();
+ fnvlist_add_boolean(dpsa->dpsa_props, prop);
+
+ zcp_cleanup_handler_t *zch = zcp_register_cleanup(state,
+ (zcp_cleanup_t *)&fnvlist_free, dpsa->dpsa_props);
+
+ err = zcp_sync_task(state, zcp_synctask_inherit_prop_check,
+ zcp_synctask_inherit_prop_sync, &zipa, sync, dsname);
+
+ zcp_deregister_cleanup(state, zch);
+ fnvlist_free(dpsa->dpsa_props);
+
+ return (err);
+}
+
static int
zcp_synctask_wrapper(lua_State *state)
{
@@ -342,6 +427,7 @@ zcp_load_synctask_lib(lua_State *state, boolean_t sync)
&zcp_synctask_promote_info,
&zcp_synctask_rollback_info,
&zcp_synctask_snapshot_info,
+ &zcp_synctask_inherit_prop_info,
NULL
};
diff --git a/usr/src/uts/common/io/scsi/impl/scsi_resource.c b/usr/src/uts/common/io/scsi/impl/scsi_resource.c
index cd58cd1981..5477435026 100644
--- a/usr/src/uts/common/io/scsi/impl/scsi_resource.c
+++ b/usr/src/uts/common/io/scsi/impl/scsi_resource.c
@@ -258,6 +258,7 @@ scsi_dmaget_attr(struct scsi_pkt_cache_wrapper *pktw)
pktw->pcw_total_xfer += pktp->pkt_dma_len;
pktp->pkt_cookies = hp->dmai_cookie - 1;
hp->dmai_cookie = cp;
+ hp->dmai_curcookie = num_segs;
return (1);
}
diff --git a/usr/src/uts/common/os/sunddi.c b/usr/src/uts/common/os/sunddi.c
index 7abe676c14..0dde96307b 100644
--- a/usr/src/uts/common/os/sunddi.c
+++ b/usr/src/uts/common/os/sunddi.c
@@ -7086,6 +7086,14 @@ ddi_dma_buf_bind_handle(ddi_dma_handle_t handle, struct buf *bp,
dev_info_t *dip, *rdip;
struct ddi_dma_req dmareq;
int (*funcp)();
+ ddi_dma_cookie_t cookie;
+ uint_t count;
+
+ if (cookiep == NULL)
+ cookiep = &cookie;
+
+ if (ccountp == NULL)
+ ccountp = &count;
dmareq.dmar_flags = flags;
dmareq.dmar_fp = waitfp;
@@ -7142,10 +7150,19 @@ ddi_dma_addr_bind_handle(ddi_dma_handle_t handle, struct as *as,
dev_info_t *dip, *rdip;
struct ddi_dma_req dmareq;
int (*funcp)();
+ ddi_dma_cookie_t cookie;
+ uint_t count;
if (len == (uint_t)0) {
return (DDI_DMA_NOMAPPING);
}
+
+ if (cookiep == NULL)
+ cookiep = &cookie;
+
+ if (ccountp == NULL)
+ ccountp = &count;
+
dmareq.dmar_flags = flags;
dmareq.dmar_fp = waitfp;
dmareq.dmar_arg = arg;
@@ -7168,6 +7185,11 @@ ddi_dma_nextcookie(ddi_dma_handle_t handle, ddi_dma_cookie_t *cookiep)
ddi_dma_impl_t *hp = (ddi_dma_impl_t *)handle;
ddi_dma_cookie_t *cp;
+ if (hp->dmai_curcookie >= hp->dmai_ncookies) {
+ panic("ddi_dma_nextcookie() called too many times on handle %p",
+ hp);
+ }
+
cp = hp->dmai_cookie;
ASSERT(cp);
@@ -7176,6 +7198,74 @@ ddi_dma_nextcookie(ddi_dma_handle_t handle, ddi_dma_cookie_t *cookiep)
cookiep->dmac_address = cp->dmac_address;
cookiep->dmac_size = cp->dmac_size;
hp->dmai_cookie++;
+ hp->dmai_curcookie++;
+}
+
+int
+ddi_dma_ncookies(ddi_dma_handle_t handle)
+{
+ ddi_dma_impl_t *hp = (ddi_dma_impl_t *)handle;
+
+ return (hp->dmai_ncookies);
+}
+
+const ddi_dma_cookie_t *
+ddi_dma_cookie_iter(ddi_dma_handle_t handle, const ddi_dma_cookie_t *iter)
+{
+ ddi_dma_impl_t *hp = (ddi_dma_impl_t *)handle;
+ const ddi_dma_cookie_t *base, *end;
+
+ if (hp->dmai_ncookies == 0) {
+ return (NULL);
+ }
+
+ base = hp->dmai_cookie - hp->dmai_curcookie;
+ end = base + hp->dmai_ncookies;
+ if (iter == NULL) {
+ return (base);
+ }
+
+ if ((uintptr_t)iter < (uintptr_t)base ||
+ (uintptr_t)iter >= (uintptr_t)end) {
+ return (NULL);
+ }
+
+ iter++;
+ if (iter == end) {
+ return (NULL);
+ }
+
+ return (iter);
+}
+
+const ddi_dma_cookie_t *
+ddi_dma_cookie_get(ddi_dma_handle_t handle, uint_t index)
+{
+ ddi_dma_impl_t *hp = (ddi_dma_impl_t *)handle;
+ const ddi_dma_cookie_t *base;
+
+ if (index >= hp->dmai_ncookies) {
+ return (NULL);
+ }
+
+ base = hp->dmai_cookie - hp->dmai_curcookie;
+ return (base + index);
+}
+
+const ddi_dma_cookie_t *
+ddi_dma_cookie_one(ddi_dma_handle_t handle)
+{
+ ddi_dma_impl_t *hp = (ddi_dma_impl_t *)handle;
+ const ddi_dma_cookie_t *base;
+
+ if (hp->dmai_ncookies != 1) {
+ panic("ddi_dma_cookie_one() called with improper handle %p",
+ hp);
+ }
+ ASSERT3P(hp->dmai_cookie, !=, NULL);
+
+ base = hp->dmai_cookie - hp->dmai_curcookie;
+ return (base);
}
int
@@ -7196,11 +7286,19 @@ ddi_dma_getwin(ddi_dma_handle_t h, uint_t win, off_t *offp,
{
int (*funcp)() = ddi_dma_win;
struct bus_ops *bop;
+ ddi_dma_cookie_t cookie;
+ uint_t count;
bop = DEVI(HD)->devi_ops->devo_bus_ops;
if (bop && bop->bus_dma_win)
funcp = bop->bus_dma_win;
+ if (cookiep == NULL)
+ cookiep = &cookie;
+
+ if (ccountp == NULL)
+ ccountp = &count;
+
return ((*funcp)(HD, HD, h, win, offp, lenp, cookiep, ccountp));
}
diff --git a/usr/src/uts/common/sys/ddi_impldefs.h b/usr/src/uts/common/sys/ddi_impldefs.h
index 37329a1c18..1012c904fd 100644
--- a/usr/src/uts/common/sys/ddi_impldefs.h
+++ b/usr/src/uts/common/sys/ddi_impldefs.h
@@ -877,6 +877,8 @@ typedef struct ddi_dma_impl {
uint_t dmai_inuse; /* active handle? */
uint_t dmai_nwin;
uint_t dmai_winsize;
+ uint_t dmai_ncookies;
+ uint_t dmai_curcookie;
caddr_t dmai_nexus_private;
void *dmai_iopte;
uint_t *dmai_sbi;
@@ -901,6 +903,8 @@ typedef struct ddi_dma_impl {
*/
typedef struct ddi_dma_impl {
ddi_dma_cookie_t *dmai_cookie; /* array of DMA cookies */
+ uint_t dmai_ncookies;
+ uint_t dmai_curcookie;
void *dmai_private;
/*
diff --git a/usr/src/uts/common/sys/smbios.h b/usr/src/uts/common/sys/smbios.h
index 82a81b5a28..34281898e0 100644
--- a/usr/src/uts/common/sys/smbios.h
+++ b/usr/src/uts/common/sys/smbios.h
@@ -1379,6 +1379,34 @@ typedef struct smbios_pointdev {
#define SMB_PDI_BUSM_USB 0xA2 /* USB */
/*
+ * SMBIOS Portable Battery. See DSP0134 Section 7.23 for more information.
+ */
+typedef struct smbios_battery {
+ const char *smbb_date; /* Manufacture date */
+ const char *smbb_serial; /* Serial number */
+ uint8_t smbb_chem; /* Device Chemistry */
+ uint32_t smbb_cap; /* Design Capacity */
+ uint16_t smbb_volt; /* Design Voltage */
+ const char *smbb_version; /* Smart Battery version */
+ uint8_t smbb_err; /* Maximum error */
+ uint16_t smbb_ssn; /* SBDS serial number */
+ uint16_t smbb_syear; /* SBDS manufacture year */
+ uint8_t smbb_smonth; /* SBDS manufacture month */
+ uint8_t smbb_sday; /* SBDS manufacture day */
+ const char *smbb_schem; /* SBDS chemistry */
+ uint32_t smbb_oemdata; /* OEM data */
+} smbios_battery_t;
+
+#define SMB_BDC_OTHER 0x01 /* Other */
+#define SMB_BDC_UNKNOWN 0x02 /* Unknown */
+#define SMB_BDC_LEADACID 0x03 /* Lead Acid */
+#define SMB_BDC_NICD 0x04 /* Nickel Cadmium */
+#define SMB_BDC_NIMH 0x05 /* Nickel Metal hydride */
+#define SMB_BDC_LIB 0x06 /* Lithium-ion */
+#define SMB_BDC_ZINCAIR 0x07 /* Zinc air */
+#define SMB_BDC_LIPO 0x08 /* Lithium Polymer */
+
+/*
* SMBIOS Hardware Security Settings. See DSP0134 Section 7.25 for more
* information. Only one such record will be present in the SMBIOS.
*/
@@ -1867,6 +1895,7 @@ extern int smbios_info_extprocessor(smbios_hdl_t *, id_t,
smbios_processor_ext_t *);
extern int smbios_info_cache(smbios_hdl_t *, id_t, smbios_cache_t *);
extern int smbios_info_pointdev(smbios_hdl_t *, id_t, smbios_pointdev_t *);
+extern int smbios_info_battery(smbios_hdl_t *, id_t, smbios_battery_t *);
extern int smbios_info_port(smbios_hdl_t *, id_t, smbios_port_t *);
extern int smbios_info_extport(smbios_hdl_t *, id_t, smbios_port_ext_t *);
extern int smbios_info_slot(smbios_hdl_t *, id_t, smbios_slot_t *);
@@ -1912,6 +1941,8 @@ extern const char *smbios_csn(smbios_hdl_t *);
* functions return the comment string next to the #defines listed above, and
* the _name functions return the appropriate #define identifier itself.
*/
+extern const char *smbios_battery_chem_desc(uint_t);
+
extern const char *smbios_bboard_flag_desc(uint_t);
extern const char *smbios_bboard_flag_name(uint_t);
extern const char *smbios_bboard_type_desc(uint_t);
diff --git a/usr/src/uts/common/sys/sunddi.h b/usr/src/uts/common/sys/sunddi.h
index 4d943b8e89..e19e5e8b29 100644
--- a/usr/src/uts/common/sys/sunddi.h
+++ b/usr/src/uts/common/sys/sunddi.h
@@ -1370,6 +1370,10 @@ ddi_dma_unbind_handle(ddi_dma_handle_t handle);
/*
* get next DMA cookie
+ *
+ * This function has been deprecated because it is unsafe. Please use
+ * ddi_dma_cookie_iter(), ddi_dma_cookie_get(), or ddi_dma_cookie_one() instead.
+ * For more information on the problems, please see the manual page.
*/
void
@@ -1859,6 +1863,16 @@ extern void ddi_dev_report_fault(dev_info_t *, ddi_fault_impact_t,
extern ddi_devstate_t ddi_get_devstate(dev_info_t *);
/*
+ * Replacement DMA cookie functions for ddi_dma_nextcookie().
+ */
+extern int ddi_dma_ncookies(ddi_dma_handle_t);
+extern const ddi_dma_cookie_t *ddi_dma_cookie_iter(ddi_dma_handle_t,
+ const ddi_dma_cookie_t *);
+extern const ddi_dma_cookie_t *ddi_dma_cookie_get(ddi_dma_handle_t, uint_t);
+extern const ddi_dma_cookie_t *ddi_dma_cookie_one(ddi_dma_handle_t);
+
+
+/*
* Miscellaneous redefines
*/
#define uiophysio physio
diff --git a/usr/src/uts/i86pc/io/rootnex.c b/usr/src/uts/i86pc/io/rootnex.c
index 6cbc2132c1..972f726287 100644
--- a/usr/src/uts/i86pc/io/rootnex.c
+++ b/usr/src/uts/i86pc/io/rootnex.c
@@ -2186,6 +2186,8 @@ fast:
*ccountp = sinfo->si_sgl_size;
hp->dmai_cookie++;
hp->dmai_rflags &= ~DDI_DMA_PARTIAL;
+ hp->dmai_ncookies = *ccountp;
+ hp->dmai_curcookie = 1;
ROOTNEX_DPROF_INC(&rootnex_cnt[ROOTNEX_CNT_ACTIVE_BINDS]);
ROOTNEX_DPROBE4(rootnex__bind__fast, dev_info_t *, rdip,
uint64_t, rootnex_cnt[ROOTNEX_CNT_ACTIVE_BINDS],
@@ -2259,6 +2261,8 @@ fast:
}
*cookiep = dma->dp_cookies[0];
hp->dmai_cookie++;
+ hp->dmai_ncookies = *ccountp;
+ hp->dmai_curcookie = 1;
ROOTNEX_DPROF_INC(&rootnex_cnt[ROOTNEX_CNT_ACTIVE_BINDS]);
ROOTNEX_DPROBE4(rootnex__bind__slow, dev_info_t *, rdip, uint64_t,
@@ -2411,6 +2415,7 @@ rootnex_coredma_reset_cookies(dev_info_t *dip, ddi_dma_handle_t handle)
hp->dmai_cookie = dma->dp_cookies;
}
hp->dmai_cookie++;
+ hp->dmai_curcookie = 1;
}
/*ARGSUSED*/
@@ -2671,6 +2676,10 @@ rootnex_clean_dmahdl(ddi_dma_impl_t *hp)
hp->dmai_error.err_status = DDI_FM_OK;
hp->dmai_error.err_expected = DDI_FM_ERR_UNEXPECTED;
hp->dmai_error.err_ontrap = NULL;
+
+ /* Cookie tracking */
+ hp->dmai_ncookies = 0;
+ hp->dmai_curcookie = 0;
}
@@ -4770,6 +4779,8 @@ rootnex_coredma_win(dev_info_t *dip, dev_info_t *rdip, ddi_dma_handle_t handle,
*ccountp = dma->dp_sglinfo.si_sgl_size;
*cookiep = hp->dmai_cookie[0];
hp->dmai_cookie++;
+ hp->dmai_ncookies = *ccountp;
+ hp->dmai_curcookie = 1;
return (DDI_SUCCESS);
}
@@ -4865,6 +4876,8 @@ rootnex_coredma_win(dev_info_t *dip, dev_info_t *rdip, ddi_dma_handle_t handle,
*lenp = window->wd_size;
*ccountp = window->wd_cookie_cnt;
*cookiep = hp->dmai_cookie[0];
+ hp->dmai_ncookies = *ccountp;
+ hp->dmai_curcookie = 1;
hp->dmai_cookie++;
#if !defined(__amd64)
diff --git a/usr/src/uts/sun4/io/px/px.c b/usr/src/uts/sun4/io/px/px.c
index 9f8e18e458..6d9c5797c4 100644
--- a/usr/src/uts/sun4/io/px/px.c
+++ b/usr/src/uts/sun4/io/px/px.c
@@ -999,6 +999,8 @@ px_dma_bindhdl(dev_info_t *dip, dev_info_t *rdip,
mapped:
*ccountp = 1;
MAKE_DMA_COOKIE(cookiep, mp->dmai_mapping, mp->dmai_size);
+ mp->dmai_ncookies = 1;
+ mp->dmai_curcookie = 1;
break;
case PX_DMAI_FLAGS_BYPASS:
case PX_DMAI_FLAGS_PTP:
@@ -1007,6 +1009,10 @@ mapped:
*ccountp = PX_WINLST(mp)->win_ncookies;
*cookiep =
*(ddi_dma_cookie_t *)(PX_WINLST(mp) + 1); /* wholeobj */
+ /*
+ * mp->dmai_ncookies and mp->dmai_curcookie are set by
+ * px_dma_physwin().
+ */
break;
default:
cmn_err(CE_PANIC, "%s%d: px_dma_bindhdl(%p): bad dma type",
@@ -1078,6 +1084,8 @@ px_dma_unbindhdl(dev_info_t *dip, dev_info_t *rdip, ddi_dma_handle_t handle)
ddi_run_callback(&px_kmem_clid);
}
mp->dmai_flags &= PX_DMAI_FLAGS_PRESERVE;
+ mp->dmai_ncookies = 0;
+ mp->dmai_curcookie = 0;
return (DDI_SUCCESS);
}
@@ -1120,6 +1128,8 @@ px_dma_win(dev_info_t *dip, dev_info_t *rdip,
mp->dmai_size);
if (ccountp)
*ccountp = 1;
+ mp->dmai_ncookies = 1;
+ mp->dmai_curcookie = 1;
break;
case PX_DMAI_FLAGS_PTP:
case PX_DMAI_FLAGS_BYPASS: {
@@ -1137,6 +1147,8 @@ px_dma_win(dev_info_t *dip, dev_info_t *rdip,
win_p->win_curseg = 0;
if (ccountp)
*ccountp = win_p->win_ncookies;
+ mp->dmai_ncookies = win_p->win_ncookies;
+ mp->dmai_curcookie = 1;
}
break;
default:
diff --git a/usr/src/uts/sun4/io/px/px_dma.c b/usr/src/uts/sun4/io/px/px_dma.c
index 148699c267..2c88281260 100644
--- a/usr/src/uts/sun4/io/px/px_dma.c
+++ b/usr/src/uts/sun4/io/px/px_dma.c
@@ -76,6 +76,8 @@ px_dma_allocmp(dev_info_t *dip, dev_info_t *rdip, int (*waitfp)(caddr_t),
mp->dmai_flags = 0;
mp->dmai_pfnlst = NULL;
mp->dmai_winlst = NULL;
+ mp->dmai_ncookies = 0;
+ mp->dmai_curcookie = 0;
/*
* kmem_alloc debug: the following fields are not zero-ed
@@ -1229,7 +1231,9 @@ px_dma_physwin(px_t *px_p, ddi_dma_req_t *dmareq, ddi_dma_impl_t *mp)
mp->dmai_rflags &= ~DDI_DMA_REDZONE;
mp->dmai_flags |= PX_DMAI_FLAGS_NOSYNC;
cookie0_p = (ddi_dma_cookie_t *)(PX_WINLST(mp) + 1);
- mp->dmai_cookie = PX_WINLST(mp)->win_ncookies > 1 ? cookie0_p + 1 : 0;
+ mp->dmai_cookie = cookie0_p + 1;
+ mp->dmai_curcookie = 1;
+ mp->dmai_ncookies = PX_WINLST(mp)->win_ncookies;
mp->dmai_mapping = cookie0_p->dmac_laddress;
px_dma_freepfn(mp);
diff --git a/usr/src/uts/sun4u/io/pci/pci.c b/usr/src/uts/sun4u/io/pci/pci.c
index 15cb498378..d52c973b30 100644
--- a/usr/src/uts/sun4u/io/pci/pci.c
+++ b/usr/src/uts/sun4u/io/pci/pci.c
@@ -731,6 +731,8 @@ pci_dma_bindhdl(dev_info_t *dip, dev_info_t *rdip,
mapped:
*ccountp = 1;
MAKE_DMA_COOKIE(cookiep, mp->dmai_mapping, mp->dmai_size);
+ mp->dmai_ncookies = 1;
+ mp->dmai_curcookie = 1;
break;
case DMAI_FLAGS_BYPASS:
case DMAI_FLAGS_PEER_TO_PEER:
@@ -738,6 +740,10 @@ mapped:
goto map_err;
*ccountp = WINLST(mp)->win_ncookies;
*cookiep = *(ddi_dma_cookie_t *)(WINLST(mp) + 1); /* wholeobj */
+ /*
+ * mp->dmai_ncookies and mp->dmai_curcookie are set by
+ * pci_dma_physwin().
+ */
break;
default:
panic("%s%d: pci_dma_bindhdl(%p): bad dma type",
@@ -809,6 +815,8 @@ pci_dma_unbindhdl(dev_info_t *dip, dev_info_t *rdip, ddi_dma_handle_t handle)
SYNC_BUF_PA(mp) = 0;
mp->dmai_error.err_cf = NULL;
+ mp->dmai_ncookies = 0;
+ mp->dmai_curcookie = 0;
return (DDI_SUCCESS);
}
@@ -845,6 +853,8 @@ pci_dma_win(dev_info_t *dip, dev_info_t *rdip,
mp->dmai_size);
if (ccountp)
*ccountp = 1;
+ mp->dmai_ncookies = 1;
+ mp->dmai_curcookie = 1;
break;
case DMAI_FLAGS_PEER_TO_PEER:
case DMAI_FLAGS_BYPASS: {
@@ -863,6 +873,8 @@ pci_dma_win(dev_info_t *dip, dev_info_t *rdip,
win_p->win_curseg = 0;
if (ccountp)
*ccountp = win_p->win_ncookies;
+ mp->dmai_ncookies = win_p->win_ncookies;
+ mp->dmai_curcookie = 1;
}
break;
default:
diff --git a/usr/src/uts/sun4u/io/pci/pci_dma.c b/usr/src/uts/sun4u/io/pci/pci_dma.c
index 9814a69e68..af68d98c98 100644
--- a/usr/src/uts/sun4u/io/pci/pci_dma.c
+++ b/usr/src/uts/sun4u/io/pci/pci_dma.c
@@ -267,6 +267,8 @@ pci_dma_allocmp(dev_info_t *dip, dev_info_t *rdip, int (*waitfp)(caddr_t),
mp->dmai_flags = 0;
mp->dmai_pfnlst = NULL;
mp->dmai_winlst = NULL;
+ mp->dmai_ncookies = 0;
+ mp->dmai_curcookie = 0;
/*
* kmem_alloc debug: the following fields are not zero-ed
@@ -1410,8 +1412,10 @@ pci_dma_physwin(pci_t *pci_p, ddi_dma_req_t *dmareq, ddi_dma_impl_t *mp)
}
mp->dmai_rflags &= ~DDI_DMA_REDZONE;
cookie0_p = (ddi_dma_cookie_t *)(WINLST(mp) + 1);
- mp->dmai_cookie = WINLST(mp)->win_ncookies > 1 ? cookie0_p + 1 : 0;
+ mp->dmai_cookie = cookie0_p + 1;
mp->dmai_mapping = cookie0_p->dmac_laddress;
+ mp->dmai_ncookies = WINLST(mp)->win_ncookies;
+ mp->dmai_curcookie = 1;
pci_dma_freepfn(mp);
return (DDI_DMA_MAPPED);
diff --git a/usr/src/uts/sun4v/io/niumx/niumx.c b/usr/src/uts/sun4v/io/niumx/niumx.c
index d91b9c4872..b455d287e6 100644
--- a/usr/src/uts/sun4v/io/niumx/niumx.c
+++ b/usr/src/uts/sun4v/io/niumx/niumx.c
@@ -665,6 +665,8 @@ niumx_dma_allochdl(dev_info_t *dip, dev_info_t *rdip, ddi_dma_attr_t *attrp,
mp->dmai_rdip = rdip;
mp->dmai_pfnlst = NULL;
mp->dmai_cookie = NULL;
+ mp->dmai_ncookies = 0;
+ mp->dmai_curcookie = 0;
mp->dmai_fault = 0;
mp->dmai_fault_check = NULL;
mp->dmai_fault_notify = NULL;
@@ -775,6 +777,8 @@ niumx_dma_bindhdl(dev_info_t *dip, dev_info_t *rdip,
}
mp->dmai_cookie->dmac_laddress = mp->dmai_mapping;
mp->dmai_cookie->dmac_size = mp->dmai_size;
+ mp->dmai_ncookies = 1;
+ mp->dmai_curcookie = 0;
*ccountp = 1;
*cookiep = *mp->dmai_cookie;
DBG(NIUMX_DBG_DMA_BINDH, dip, "cookie %" PRIx64 "+%x, count=%d\n",
@@ -801,6 +805,7 @@ niumx_dma_unbindhdl(dev_info_t *dip, dev_info_t *rdip, ddi_dma_handle_t handle)
if (mp->dmai_cookie) {
kmem_free(mp->dmai_cookie, sizeof (ddi_dma_cookie_t));
mp->dmai_cookie = NULL;
+ mp->dmai_ncookies = mp->dmai_curcookie = 0;
}
return (DDI_SUCCESS);