xref: /minix3/minix/lib/libsys/pci_set_acl.c (revision 433d6423c39e34ec4b79c950597bb2d236f886be)
1*433d6423SLionel Sambuc /*
2*433d6423SLionel Sambuc pci_set_acl.c
3*433d6423SLionel Sambuc */
4*433d6423SLionel Sambuc 
5*433d6423SLionel Sambuc #include "pci.h"
6*433d6423SLionel Sambuc #include "syslib.h"
7*433d6423SLionel Sambuc #include <unistd.h>
8*433d6423SLionel Sambuc #include <minix/rs.h>
9*433d6423SLionel Sambuc #include <minix/ds.h>
10*433d6423SLionel Sambuc #include <minix/sysutil.h>
11*433d6423SLionel Sambuc 
12*433d6423SLionel Sambuc /*===========================================================================*
13*433d6423SLionel Sambuc  *				pci_set_acl				     *
14*433d6423SLionel Sambuc  *===========================================================================*/
pci_set_acl(rs_pci)15*433d6423SLionel Sambuc int pci_set_acl(rs_pci)
16*433d6423SLionel Sambuc struct rs_pci *rs_pci;
17*433d6423SLionel Sambuc {
18*433d6423SLionel Sambuc 	int r;
19*433d6423SLionel Sambuc 	cp_grant_id_t gid;
20*433d6423SLionel Sambuc 	message m;
21*433d6423SLionel Sambuc 	endpoint_t endpoint;
22*433d6423SLionel Sambuc 
23*433d6423SLionel Sambuc 	if (pci_procnr == ANY)
24*433d6423SLionel Sambuc 	{
25*433d6423SLionel Sambuc 		r= ds_retrieve_label_endpt("pci", &endpoint);
26*433d6423SLionel Sambuc 		if (r != 0)
27*433d6423SLionel Sambuc 		{
28*433d6423SLionel Sambuc 			panic("pci_set_acl: ds_retrieve_label_endpt failed for 'pci': %d", r);
29*433d6423SLionel Sambuc 		}
30*433d6423SLionel Sambuc 		pci_procnr = endpoint;
31*433d6423SLionel Sambuc 	}
32*433d6423SLionel Sambuc 
33*433d6423SLionel Sambuc 
34*433d6423SLionel Sambuc 	gid= cpf_grant_direct(pci_procnr, (vir_bytes)rs_pci, sizeof(*rs_pci),
35*433d6423SLionel Sambuc 		CPF_READ);
36*433d6423SLionel Sambuc 	if (gid == -1)
37*433d6423SLionel Sambuc 	{
38*433d6423SLionel Sambuc 		printf("pci_set_acl: cpf_grant_direct failed: %d\n",
39*433d6423SLionel Sambuc 			errno);
40*433d6423SLionel Sambuc 		return EINVAL;
41*433d6423SLionel Sambuc 	}
42*433d6423SLionel Sambuc 
43*433d6423SLionel Sambuc 	m.m_type= BUSC_PCI_SET_ACL;
44*433d6423SLionel Sambuc 	m.m1_i1= gid;
45*433d6423SLionel Sambuc 
46*433d6423SLionel Sambuc 	r= ipc_sendrec(pci_procnr, &m);
47*433d6423SLionel Sambuc 	cpf_revoke(gid);
48*433d6423SLionel Sambuc 	if (r != 0)
49*433d6423SLionel Sambuc 		panic("pci_set_acl: can't talk to PCI: %d", r);
50*433d6423SLionel Sambuc 
51*433d6423SLionel Sambuc 	return m.m_type;
52*433d6423SLionel Sambuc }
53*433d6423SLionel Sambuc 
54