diff options
Diffstat (limited to 'usr/src/uts')
-rw-r--r-- | usr/src/uts/common/fs/zfs/dsl_prop.c | 12 | ||||
-rw-r--r-- | usr/src/uts/common/fs/zfs/sys/dsl_prop.h | 9 | ||||
-rw-r--r-- | usr/src/uts/common/fs/zfs/zcp_synctask.c | 86 | ||||
-rw-r--r-- | usr/src/uts/common/io/scsi/impl/scsi_resource.c | 1 | ||||
-rw-r--r-- | usr/src/uts/common/os/sunddi.c | 98 | ||||
-rw-r--r-- | usr/src/uts/common/sys/ddi_impldefs.h | 4 | ||||
-rw-r--r-- | usr/src/uts/common/sys/smbios.h | 31 | ||||
-rw-r--r-- | usr/src/uts/common/sys/sunddi.h | 14 | ||||
-rw-r--r-- | usr/src/uts/i86pc/io/rootnex.c | 13 | ||||
-rw-r--r-- | usr/src/uts/sun4/io/px/px.c | 12 | ||||
-rw-r--r-- | usr/src/uts/sun4/io/px/px_dma.c | 6 | ||||
-rw-r--r-- | usr/src/uts/sun4u/io/pci/pci.c | 12 | ||||
-rw-r--r-- | usr/src/uts/sun4u/io/pci/pci_dma.c | 6 | ||||
-rw-r--r-- | usr/src/uts/sun4v/io/niumx/niumx.c | 5 |
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); |