mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 18:21:39 +01:00
The users of these (qemu) check for a negative value so we are safe in regards to that. However they also use the return value to inform the user of the error. Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> Acked-by: Ian Campbell <ian.campbell@citrix.com>
115 lines
3.0 KiB
C
115 lines
3.0 KiB
C
/******************************************************************************
|
|
* xc_physdev.c
|
|
*
|
|
* API for manipulating physical-device access permissions.
|
|
*
|
|
* Copyright (c) 2004, Rolf Neugebauer (Intel Research Cambridge)
|
|
* Copyright (c) 2004, K A Fraser (University of Cambridge)
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation;
|
|
* version 2.1 of the License.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
|
|
#include "xc_private.h"
|
|
|
|
int xc_physdev_pci_access_modify(xc_interface *xch,
|
|
uint32_t domid,
|
|
int bus,
|
|
int dev,
|
|
int func,
|
|
int enable)
|
|
{
|
|
errno = ENOSYS;
|
|
return -1;
|
|
}
|
|
|
|
int xc_physdev_map_pirq(xc_interface *xch,
|
|
int domid,
|
|
int index,
|
|
int *pirq)
|
|
{
|
|
int rc;
|
|
struct physdev_map_pirq map;
|
|
|
|
if ( !pirq )
|
|
{
|
|
errno = EINVAL;
|
|
return -1;
|
|
}
|
|
memset(&map, 0, sizeof(struct physdev_map_pirq));
|
|
map.domid = domid;
|
|
map.type = MAP_PIRQ_TYPE_GSI;
|
|
map.index = index;
|
|
map.pirq = *pirq < 0 ? index : *pirq;
|
|
|
|
rc = do_physdev_op(xch, PHYSDEVOP_map_pirq, &map, sizeof(map));
|
|
|
|
if ( !rc )
|
|
*pirq = map.pirq;
|
|
|
|
return rc;
|
|
}
|
|
|
|
int xc_physdev_map_pirq_msi(xc_interface *xch,
|
|
int domid,
|
|
int index,
|
|
int *pirq,
|
|
int devfn,
|
|
int bus,
|
|
int entry_nr,
|
|
uint64_t table_base)
|
|
{
|
|
int rc;
|
|
struct physdev_map_pirq map;
|
|
|
|
if ( !pirq )
|
|
{
|
|
errno = EINVAL;
|
|
return -1;
|
|
}
|
|
memset(&map, 0, sizeof(struct physdev_map_pirq));
|
|
map.domid = domid;
|
|
map.type = MAP_PIRQ_TYPE_MSI;
|
|
map.index = index;
|
|
map.pirq = *pirq;
|
|
map.bus = bus;
|
|
map.devfn = devfn;
|
|
map.entry_nr = entry_nr;
|
|
map.table_base = table_base;
|
|
|
|
rc = do_physdev_op(xch, PHYSDEVOP_map_pirq, &map, sizeof(map));
|
|
|
|
if ( !rc )
|
|
*pirq = map.pirq;
|
|
|
|
return rc;
|
|
}
|
|
|
|
int xc_physdev_unmap_pirq(xc_interface *xch,
|
|
int domid,
|
|
int pirq)
|
|
{
|
|
int rc;
|
|
struct physdev_unmap_pirq unmap;
|
|
|
|
memset(&unmap, 0, sizeof(struct physdev_unmap_pirq));
|
|
unmap.domid = domid;
|
|
unmap.pirq = pirq;
|
|
|
|
rc = do_physdev_op(xch, PHYSDEVOP_unmap_pirq, &unmap, sizeof(unmap));
|
|
|
|
return rc;
|
|
}
|
|
|