/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/*
* Copyright 2014 Garrett D'Amore <garrett@damore.org>
*/
#include <sys/ddi_impldefs.h>
/*
* DDI DMA Engine functions for x86.
* These functions are more naturally generic, but do not apply to SPARC.
*/
int
{
}
int
{
}
int
{
}
int
{
}
int
{
}
int
{
}
int
{
}
int
{
}
int
{
}
int
{
}
int
{
}
/*
* implementation specific access handle and routines:
*/
/*
* access handle allocator
*/
{
/*
* recast to ddi_acc_hdl_t instead of
* casting to ddi_acc_impl_t and then return the ah_platform_private
*
* this optimization based on the ddi_acc_hdl_t is the
* first member of the ddi_acc_impl_t.
*/
return ((ddi_acc_hdl_t *)hdl);
}
{
int sleepflag;
/*
* Allocate and initialize the data access handle and error status.
*/
goto fail;
goto fail;
}
goto fail;
}
return ((ddi_acc_handle_t)hp);
fail:
(waitfp != (int (*)())KM_NOSLEEP))
return (NULL);
}
void
{
/*
* The supplied (ddi_acc_handle_t) is actually a (ddi_acc_impl_t *),
* because that's what we allocated in impl_acc_hdl_alloc() above.
*/
if (hp) {
if (impl_acc_hdl_id)
}
}
/*
* Function used to check if a given access handle owns the failing address.
* Called by ndi_fmc_error, when we detect a PIO error.
*/
/* ARGSUSED */
static int
const void *not_used)
{
return (DDI_FM_NONFATAL);
}
return (DDI_FM_UNKNOWN);
}
void
{
int fmcap;
!DDI_FM_ACC_ERR_CAP(fmcap)) {
} else if (DDI_FM_ACC_ERR_CAP(fmcap)) {
if (handlep->ah_xfermodes)
return;
NULL, DDI_NOSLEEP);
} else {
}
}
}
/* ARGSUSED */
int
const void *not_used)
{
return (DDI_FM_UNKNOWN);
}
void
{
int fmcap;
int devacc_attr_access;
if (!handlep)
return;
else
/*
* Can only do FLAGERR if scan callback is set up. This should
* also guarantee that the peekpoke_mutex and err_mutex are defined.
*/
switch (devacc_attr_access) {
case DDI_CAUTIOUS_ACC:
break;
case DDI_FLAGERR_ACC:
/* temporary set these 64 functions to no-ops */
/*
* check for BIG endian access
*/
hp->ahi_rep_get16 =
hp->ahi_rep_get32 =
hp->ahi_rep_put16 =
hp->ahi_rep_put32 =
} else {
}
/*
* check for BIG endian access
*/
hp->ahi_rep_get16 =
hp->ahi_rep_get32 =
hp->ahi_rep_get64 =
hp->ahi_rep_put16 =
hp->ahi_rep_put32 =
hp->ahi_rep_put64 =
} else {
}
}
break;
case DDI_DEFAULT_ACC:
/* temporary set these 64 functions to no-ops */
/*
* check for BIG endian access
*/
} else {
}
/*
* check for BIG endian access
*/
} else {
}
}
break;
}
}
/*
* The followings are low-level routines for data access.
*
* All of these routines should be implemented in assembly. Those
* that have been rewritten be found in ~ml/ddi_i86_asm.s
*/
/*ARGSUSED*/
{
return (ddi_swap16(*addr));
}
/*ARGSUSED*/
{
}
/*ARGSUSED*/
{
return (ddi_swap32(*addr));
}
/*ARGSUSED*/
{
}
/*ARGSUSED*/
{
return (ddi_swap64(*addr));
}
/*ARGSUSED*/
void
{
}
/*ARGSUSED*/
void
{
}
/*ARGSUSED*/
void
{
}
/*ARGSUSED*/
void
{
}
/*ARGSUSED*/
void
{
}
/*ARGSUSED*/
void
{
uint8_t *h, *d;
h = host_addr;
d = dev_addr;
if (flags == DDI_DEV_AUTOINCR)
*h++ = *d++;
else
*h++ = *d;
}
/*ARGSUSED*/
void
{
uint16_t *h, *d;
h = host_addr;
d = dev_addr;
if (flags == DDI_DEV_AUTOINCR)
*h++ = *d++;
else
*h++ = *d;
}
/*ARGSUSED*/
void
{
uint16_t *h, *d;
h = host_addr;
d = dev_addr;
if (flags == DDI_DEV_AUTOINCR)
*h++ = ddi_swap16(*d++);
else
*h++ = ddi_swap16(*d);
}
/*ARGSUSED*/
void
{
uint16_t *h;
h = host_addr;
if (flags == DDI_DEV_AUTOINCR)
else
}
/*ARGSUSED*/
void
{
uint32_t *h, *d;
h = host_addr;
d = dev_addr;
if (flags == DDI_DEV_AUTOINCR)
*h++ = *d++;
else
*h++ = *d;
}
/*ARGSUSED*/
void
{
uint32_t *h, *d;
h = host_addr;
d = dev_addr;
if (flags == DDI_DEV_AUTOINCR)
*h++ = ddi_swap32(*d++);
else
*h++ = ddi_swap32(*d);
}
/*ARGSUSED*/
void
{
uint32_t *h;
h = host_addr;
if (flags == DDI_DEV_AUTOINCR)
else
}
/*ARGSUSED*/
void
{
uint64_t *h, *d;
h = host_addr;
d = dev_addr;
if (flags == DDI_DEV_AUTOINCR)
*h++ = *d++;
else
*h++ = *d;
}
/*ARGSUSED*/
void
{
uint64_t *h, *d;
h = host_addr;
d = dev_addr;
if (flags == DDI_DEV_AUTOINCR)
*h++ = ddi_swap64(*d++);
else
*h++ = ddi_swap64(*d);
}
/*ARGSUSED*/
void
{
uint8_t *h, *d;
h = host_addr;
d = dev_addr;
if (flags == DDI_DEV_AUTOINCR)
*d++ = *h++;
else
*d = *h++;
}
/*ARGSUSED*/
void
{
uint16_t *h, *d;
h = host_addr;
d = dev_addr;
if (flags == DDI_DEV_AUTOINCR)
*d++ = *h++;
else
*d = *h++;
}
/*ARGSUSED*/
void
{
uint16_t *h, *d;
h = host_addr;
d = dev_addr;
if (flags == DDI_DEV_AUTOINCR)
*d++ = ddi_swap16(*h++);
else
*d = ddi_swap16(*h++);
}
/*ARGSUSED*/
void
{
uint16_t *h;
h = host_addr;
if (flags == DDI_DEV_AUTOINCR)
else
}
/*ARGSUSED*/
void
{
uint32_t *h, *d;
h = host_addr;
d = dev_addr;
if (flags == DDI_DEV_AUTOINCR)
*d++ = *h++;
else
*d = *h++;
}
/*ARGSUSED*/
void
{
uint32_t *h, *d;
h = host_addr;
d = dev_addr;
if (flags == DDI_DEV_AUTOINCR)
*d++ = ddi_swap32(*h++);
else
*d = ddi_swap32(*h++);
}
/*ARGSUSED*/
void
{
uint32_t *h;
h = host_addr;
if (flags == DDI_DEV_AUTOINCR)
else
}
/*ARGSUSED*/
void
{
uint64_t *h, *d;
h = host_addr;
d = dev_addr;
if (flags == DDI_DEV_AUTOINCR)
*d++ = *h++;
else
*d = *h++;
}
/*ARGSUSED*/
void
{
uint64_t *h, *d;
h = host_addr;
d = dev_addr;
if (flags == DDI_DEV_AUTOINCR)
*d++ = ddi_swap64(*h++);
else
*d = ddi_swap64(*h++);
}
/*ARGSUSED*/
{
panic("ddi_get64 from i/o space");
/*NOTREACHED*/
return (0);
}
/*ARGSUSED*/
void
{
panic("ddi_put64 to i/o space");
/*NOTREACHED*/
}
void
{
}
}
/*ARGSUSED*/
{
if (val == 0xff)
return (val);
}
/*ARGSUSED*/
{
if (val == 0xffff)
return (val);
}
/*ARGSUSED*/
{
if (val == 0xffffffff)
return (val);
}
/*ARGSUSED*/
{
if (val == 0xffffffffffffffff)
return (val);
}
/*ARGSUSED*/
{
if (val == 0xff)
return (val);
}
/*ARGSUSED*/
{
if (val == 0xffff)
return (val);
}
/*ARGSUSED*/
{
if (val == 0xffffffff)
return (val);
}
/*ARGSUSED*/
{
if (val == 0xffff)
return (val);
}
/*ARGSUSED*/
{
if (val == 0xffff)
return (val);
}
/*ARGSUSED*/
{
if (val == 0xffffffff)
return (val);
}
/*ARGSUSED*/
{
if (val == 0xffffffff)
return (val);
}
/*ARGSUSED*/
{
if (val == 0xffffffffffffffff)
return (val);
}
/*ARGSUSED*/
void
{
}
/*ARGSUSED*/
void
{
}
/*ARGSUSED*/
void
{
}
/*ARGSUSED*/
void
{
}
/*ARGSUSED*/
void
{
}
/*ARGSUSED*/
void
{
}
/*ARGSUSED*/
void
{
}
/*ARGSUSED*/
void
{
}
/*ARGSUSED*/
void
{
}
/*ARGSUSED*/
void
{
}
/*ARGSUSED*/
void
{
}
/*ARGSUSED*/
void
{
}
/*ARGSUSED*/
void
{
int fail = 0;
uint8_t *h;
h = host_addr;
if (flags == DDI_DEV_AUTOINCR) {
fail = 1;
} else {
fail = 1;
}
if (fail == 1)
}
/*ARGSUSED*/
void
{
int fail = 0;
uint16_t *h;
h = host_addr;
if (flags == DDI_DEV_AUTOINCR) {
fail = 1;
} else {
fail = 1;
}
if (fail == 1)
}
/*ARGSUSED*/
void
{
int fail = 0;
uint32_t *h;
h = host_addr;
if (flags == DDI_DEV_AUTOINCR) {
fail = 1;
} else {
fail = 1;
}
if (fail == 1)
}
/*ARGSUSED*/
void
{
int fail = 0;
uint8_t *h, *d;
h = host_addr;
d = dev_addr;
if (flags == DDI_DEV_AUTOINCR) {
if ((*h++ = *d++) == 0xff)
fail = 1;
} else {
if ((*h++ = *d) == 0xff)
fail = 1;
}
if (fail == 1)
}
/*ARGSUSED*/
void
{
int fail = 0;
uint16_t *h, *d;
h = host_addr;
d = dev_addr;
if (flags == DDI_DEV_AUTOINCR) {
if ((*h++ = *d++) == 0xffff)
fail = 1;
} else {
if ((*h++ = *d) == 0xffff)
fail = 1;
}
if (fail == 1)
}
/*ARGSUSED*/
void
{
int fail = 0;
uint16_t *h, *d;
h = host_addr;
d = dev_addr;
if (flags == DDI_DEV_AUTOINCR) {
if ((*h++ = ddi_swap16(*d++)) == 0xffff)
fail = 1;
} else {
if ((*h++ = ddi_swap16(*d)) == 0xffff)
fail = 1;
}
if (fail == 1)
}
/*ARGSUSED*/
void
{
int fail = 0;
uint16_t *h;
h = host_addr;
if (flags == DDI_DEV_AUTOINCR) {
fail = 1;
} else {
fail = 1;
}
if (fail == 1)
}
/*ARGSUSED*/
void
{
int fail = 0;
uint32_t *h, *d;
h = host_addr;
d = dev_addr;
if (flags == DDI_DEV_AUTOINCR) {
if ((*h++ = *d++) == 0xffffffff)
fail = 1;
} else {
if ((*h++ = *d) == 0xffffffff)
fail = 1;
}
if (fail == 1)
}
/*ARGSUSED*/
void
{
int fail = 0;
uint32_t *h, *d;
h = host_addr;
d = dev_addr;
if (flags == DDI_DEV_AUTOINCR) {
if ((*h++ = ddi_swap32(*d++)) == 0xffffffff)
fail = 1;
} else {
if ((*h++ = ddi_swap32(*d)) == 0xffffffff)
fail = 1;
}
if (fail == 1)
}
/*ARGSUSED*/
void
{
int fail = 0;
uint32_t *h;
h = host_addr;
if (flags == DDI_DEV_AUTOINCR) {
fail = 1;
} else {
fail = 1;
}
if (fail == 1)
}
/*ARGSUSED*/
void
{
int fail = 0;
uint64_t *h, *d;
h = host_addr;
d = dev_addr;
if (flags == DDI_DEV_AUTOINCR) {
if ((*h++ = *d++) == 0xffffffffffffffff)
fail = 1;
} else {
if ((*h++ = *d) == 0xffffffffffffffff)
fail = 1;
}
if (fail == 1)
}
/*ARGSUSED*/
void
{
int fail = 0;
uint64_t *h, *d;
h = host_addr;
d = dev_addr;
if (flags == DDI_DEV_AUTOINCR) {
if ((*h++ = ddi_swap64(*d++)) == 0xffffffffffffffff)
fail = 1;
} else {
if ((*h++ = ddi_swap64(*d)) == 0xffffffffffffffff)
fail = 1;
}
if (fail == 1)
}
/*ARGSUSED*/
void
{
uint8_t *h, *d;
h = host_addr;
d = dev_addr;
if (flags == DDI_DEV_AUTOINCR)
*d++ = *h++;
else
*d = *h++;
}
/*ARGSUSED*/
void
{
uint8_t *h;
h = host_addr;
if (flags == DDI_DEV_AUTOINCR)
else
}
/*ARGSUSED*/
void
{
uint16_t *h, *d;
h = host_addr;
d = dev_addr;
if (flags == DDI_DEV_AUTOINCR)
*d++ = *h++;
else
*d = *h++;
}
/*ARGSUSED*/
void
{
uint16_t *h;
h = host_addr;
if (flags == DDI_DEV_AUTOINCR)
else
}
/*ARGSUSED*/
void
{
uint16_t *h, *d;
h = host_addr;
d = dev_addr;
if (flags == DDI_DEV_AUTOINCR)
*d++ = ddi_swap16(*h++);
else
*d = ddi_swap16(*h++);
}
/*ARGSUSED*/
void
{
uint16_t *h;
h = host_addr;
if (flags == DDI_DEV_AUTOINCR)
else
}
/*ARGSUSED*/
void
{
uint32_t *h, *d;
h = host_addr;
d = dev_addr;
if (flags == DDI_DEV_AUTOINCR)
*d++ = *h++;
else
*d = *h++;
}
/*ARGSUSED*/
void
{
uint32_t *h;
h = host_addr;
if (flags == DDI_DEV_AUTOINCR)
else
}
/*ARGSUSED*/
void
{
uint32_t *h, *d;
h = host_addr;
d = dev_addr;
if (flags == DDI_DEV_AUTOINCR)
*d++ = ddi_swap32(*h++);
else
*d = ddi_swap32(*h++);
}
/*ARGSUSED*/
void
{
uint32_t *h;
h = host_addr;
if (flags == DDI_DEV_AUTOINCR)
else
}
/*ARGSUSED*/
void
{
uint64_t *h, *d;
h = host_addr;
d = dev_addr;
if (flags == DDI_DEV_AUTOINCR)
*d++ = *h++;
else
*d = *h++;
}
/*ARGSUSED*/
void
{
uint64_t *h, *d;
h = host_addr;
d = dev_addr;
if (flags == DDI_DEV_AUTOINCR)
*d++ = ddi_swap64(*h++);
else
*d = ddi_swap64(*h++);
}
void
{
}
void
{
}
void
{
}
/*ARGSUSED*/
void
{
}
void
{
}
void
{
}
void
{
}
/*ARGSUSED*/
void
{
}
/*
* We need to separate the old interfaces from the new ones and leave them
* in here for a while. Previous versions of the OS defined the new interfaces
* to the old interfaces. This way we can fix things up so that we can
* eventually remove these interfaces.
* or earlier will actually have a reference to ddi_io_rep_getb in the binary.
*/
#ifdef _ILP32
void
{
}
void
{
}
void
{
}
void
{
}
void
{
}
void
{
}
#endif /* _ILP32 */
/*
* These next two functions could be translated into assembler someday
*/
int
{
}
int
{
/* Default version, just returns flag value */
}
/*ARGSUSED*/
void
{
/* Default version, does nothing for now */
}
void
{
}
}
void
{
}
}