7 PUBLIC
struct pci_acl pci_acl
[NR_DRIVERS
];
9 FORWARD
_PROTOTYPE( void do_init
, (message
*mp
) );
10 FORWARD
_PROTOTYPE( void do_first_dev
, (message
*mp
) );
11 FORWARD
_PROTOTYPE( void do_next_dev
, (message
*mp
) );
12 FORWARD
_PROTOTYPE( void do_find_dev
, (message
*mp
) );
13 FORWARD
_PROTOTYPE( void do_ids
, (message
*mp
) );
14 FORWARD
_PROTOTYPE( void do_dev_name
, (message
*mp
) );
15 FORWARD
_PROTOTYPE( void do_dev_name_s
, (message
*mp
) );
16 FORWARD
_PROTOTYPE( void do_slot_name_s
, (message
*mp
) );
17 FORWARD
_PROTOTYPE( void do_set_acl
, (message
*mp
) );
18 FORWARD
_PROTOTYPE( void do_del_acl
, (message
*mp
) );
19 FORWARD
_PROTOTYPE( void do_reserve
, (message
*mp
) );
20 FORWARD
_PROTOTYPE( void do_attr_r8
, (message
*mp
) );
21 FORWARD
_PROTOTYPE( void do_attr_r16
, (message
*mp
) );
22 FORWARD
_PROTOTYPE( void do_attr_r32
, (message
*mp
) );
23 FORWARD
_PROTOTYPE( void do_attr_w8
, (message
*mp
) );
24 FORWARD
_PROTOTYPE( void do_attr_w16
, (message
*mp
) );
25 FORWARD
_PROTOTYPE( void do_attr_w32
, (message
*mp
) );
26 FORWARD
_PROTOTYPE( void do_rescan_bus
, (message
*mp
) );
27 FORWARD
_PROTOTYPE( void reply
, (message
*mp
, int result
) );
28 FORWARD
_PROTOTYPE( struct rs_pci
*find_acl
, (int endpoint
) );
32 /* SEF functions and variables. */
33 FORWARD
_PROTOTYPE( void sef_local_startup
, (void) );
41 /* SEF local startup. */
46 r
= driver_receive(ANY
, &m
, &ipc_status
);
49 printf("PCI: driver_receive failed: %d\n", r
);
53 if (is_ipc_notify(ipc_status
)) {
54 printf("PCI: got notify from %d\n", m
.m_source
);
56 /* done, get a new message */
62 case BUSC_PCI_INIT
: do_init(&m
); break;
63 case BUSC_PCI_FIRST_DEV
: do_first_dev(&m
); break;
64 case BUSC_PCI_NEXT_DEV
: do_next_dev(&m
); break;
65 case BUSC_PCI_FIND_DEV
: do_find_dev(&m
); break;
66 case BUSC_PCI_IDS
: do_ids(&m
); break;
67 case BUSC_PCI_DEV_NAME
: do_dev_name(&m
); break;
68 case BUSC_PCI_RESERVE
: do_reserve(&m
); break;
69 case BUSC_PCI_ATTR_R8
: do_attr_r8(&m
); break;
70 case BUSC_PCI_ATTR_R16
: do_attr_r16(&m
); break;
71 case BUSC_PCI_ATTR_R32
: do_attr_r32(&m
); break;
72 case BUSC_PCI_ATTR_W8
: do_attr_w8(&m
); break;
73 case BUSC_PCI_ATTR_W16
: do_attr_w16(&m
); break;
74 case BUSC_PCI_ATTR_W32
: do_attr_w32(&m
); break;
75 case BUSC_PCI_RESCAN
: do_rescan_bus(&m
); break;
76 case BUSC_PCI_DEV_NAME_S
: do_dev_name_s(&m
); break;
77 case BUSC_PCI_SLOT_NAME_S
: do_slot_name_s(&m
); break;
78 case BUSC_PCI_SET_ACL
: do_set_acl(&m
); break;
79 case BUSC_PCI_DEL_ACL
: do_del_acl(&m
); break;
81 printf("PCI: got message from %d, type %d\n",
82 m
.m_source
, m
.m_type
);
90 /*===========================================================================*
92 *===========================================================================*/
93 PRIVATE
void sef_local_startup()
95 /* Register init callbacks. */
96 sef_setcb_init_fresh(sef_cb_init_fresh
);
97 sef_setcb_init_lu(sef_cb_init_fresh
);
98 sef_setcb_init_restart(sef_cb_init_fresh
);
100 /* Register live update callbacks. */
101 sef_setcb_lu_prepare(sef_cb_lu_prepare_always_ready
);
102 sef_setcb_lu_state_isvalid(sef_cb_lu_state_isvalid_standard
);
104 /* Let SEF perform startup. */
108 PRIVATE
void do_init(mp
)
114 printf("PCI: do_init: called by '%d'\n", mp
->m_source
);
118 r
= send(mp
->m_source
, mp
);
120 printf("PCI: do_init: unable to send to %d: %d\n",
124 PRIVATE
void do_first_dev(mp
)
131 aclp
= find_acl(mp
->m_source
);
134 printf("PCI: do_first_dev: no acl for caller %d\n",
137 r
= pci_first_dev_a(aclp
, &devind
, &vid
, &did
);
145 r
= send(mp
->m_source
, mp
);
148 printf("PCI: do_first_dev: unable to send to %d: %d\n",
153 PRIVATE
void do_next_dev(mp
)
161 aclp
= find_acl(mp
->m_source
);
163 r
= pci_next_dev_a(aclp
, &devind
, &vid
, &did
);
171 r
= send(mp
->m_source
, mp
);
174 printf("PCI: do_next_dev: unable to send to %d: %d\n",
179 PRIVATE
void do_find_dev(mp
)
189 r
= pci_find_dev(bus
, dev
, func
, &devind
);
193 r
= send(mp
->m_source
, mp
);
196 printf("PCI: do_find_dev: unable to send to %d: %d\n",
201 PRIVATE
void do_ids(mp
)
209 r
= pci_ids_s(devind
, &vid
, &did
);
212 printf("pci:do_ids: failed for devind %d: %d\n",
219 r
= send(mp
->m_source
, mp
);
222 printf("PCI: do_ids: unable to send to %d: %d\n",
227 PRIVATE
void do_dev_name(mp
)
230 int r
, name_len
, len
;
232 char *name_ptr
, *name
;
239 name
= pci_dev_name(vid
, did
);
250 printf("PCI: pci`do_dev_name: calling do_vircopy\n");
251 r
= sys_vircopy(SELF
, D
, (vir_bytes
)name
, mp
->m_source
, D
,
252 (vir_bytes
)name_ptr
, len
);
256 r
= send(mp
->m_source
, mp
);
259 printf("PCI: do_dev_name: unable to send to %d: %d\n",
264 PRIVATE
void do_dev_name_s(mp
)
267 int r
, name_len
, len
;
269 cp_grant_id_t name_gid
;
277 name
= pci_dev_name(vid
, did
);
288 r
= sys_safecopyto(mp
->m_source
, name_gid
, 0, (vir_bytes
)name
,
293 r
= send(mp
->m_source
, mp
);
296 printf("PCI: do_dev_name: unable to send to %d: %d\n",
301 PRIVATE
void do_slot_name_s(mp
)
304 int r
, devind
, name_len
, len
;
312 r
= pci_slot_name_s(devind
, &name
);
315 printf("pci:do_slot_name_s: failed for devind %d: %d\n",
324 r
= sys_safecopyto(mp
->m_source
, gid
, 0,
325 (vir_bytes
)name
, len
, D
);
329 r
= send(mp
->m_source
, mp
);
332 printf("PCI: do_slot_name: unable to send to %d: %d\n",
337 PRIVATE
void do_set_acl(mp
)
342 if (mp
->m_source
!= RS_PROC_NR
)
344 printf("PCI: do_set_acl: not from RS\n");
349 for (i
= 0; i
<NR_DRIVERS
; i
++)
351 if (!pci_acl
[i
].inuse
)
356 printf("PCI: do_set_acl: table is full\n");
363 r
= sys_safecopyfrom(mp
->m_source
, gid
, 0, (vir_bytes
)&pci_acl
[i
].acl
,
364 sizeof(pci_acl
[i
].acl
), D
);
367 printf("PCI: do_set_acl: safecopyfrom failed\n");
373 printf("PCI: do_acl: setting ACL for %d ('%s') at entry %d\n",
374 pci_acl
[i
].acl
.rsp_endpoint
, pci_acl
[i
].acl
.rsp_label
,
380 PRIVATE
void do_del_acl(mp
)
385 if (mp
->m_source
!= RS_PROC_NR
)
387 printf("do_del_acl: not from RS\n");
394 for (i
= 0; i
<NR_DRIVERS
; i
++)
396 if (!pci_acl
[i
].inuse
)
398 if (pci_acl
[i
].acl
.rsp_endpoint
== proc_nr
)
404 printf("do_del_acl: nothing found for %d\n", proc_nr
);
411 printf("do_acl: deleting ACL for %d ('%s') at entry %d\n",
412 pci_acl
[i
].acl
.rsp_endpoint
, pci_acl
[i
].acl
.rsp_label
, i
);
415 /* Also release all devices held by this process */
416 pci_release(proc_nr
);
421 PRIVATE
void do_reserve(mp
)
428 mp
->m_type
= pci_reserve2(devind
, mp
->m_source
);
429 r
= send(mp
->m_source
, mp
);
432 printf("do_reserve: unable to send to %d: %d\n",
437 PRIVATE
void do_attr_r8(mp
)
446 r
= pci_attr_r8_s(devind
, port
, &v
);
450 "pci:do_attr_r8: pci_attr_r8_s(%d, %d, ...) failed: %d\n",
455 r
= send(mp
->m_source
, mp
);
458 printf("do_attr_r8: unable to send to %d: %d\n",
463 PRIVATE
void do_attr_r16(mp
)
472 v
= pci_attr_r16(devind
, port
);
475 r
= send(mp
->m_source
, mp
);
478 printf("do_attr_r16: unable to send to %d: %d\n",
483 PRIVATE
void do_attr_r32(mp
)
492 r
= pci_attr_r32_s(devind
, port
, &v
);
496 "pci:do_attr_r32: pci_attr_r32_s(%d, %d, ...) failed: %d\n",
501 r
= send(mp
->m_source
, mp
);
504 printf("do_attr_r32: unable to send to %d: %d\n",
509 PRIVATE
void do_attr_w8(mp
)
519 pci_attr_w8(devind
, port
, v
);
521 r
= send(mp
->m_source
, mp
);
524 printf("do_attr_w8: unable to send to %d: %d\n",
529 PRIVATE
void do_attr_w16(mp
)
539 pci_attr_w16(devind
, port
, v
);
541 r
= send(mp
->m_source
, mp
);
544 printf("do_attr_w16: unable to send to %d: %d\n",
549 PRIVATE
void do_attr_w32(mp
)
559 pci_attr_w32(devind
, port
, v
);
561 r
= send(mp
->m_source
, mp
);
564 printf("do_attr_w32: unable to send to %d: %d\n",
569 PRIVATE
void do_rescan_bus(mp
)
576 pci_rescan_bus(busnr
);
578 r
= send(mp
->m_source
, mp
);
581 printf("do_rescan_bus: unable to send to %d: %d\n",
587 PRIVATE
void reply(mp
, result
)
595 r
= send(mp
->m_source
, &m
);
597 printf("reply: unable to send to %d: %d\n", mp
->m_source
, r
);
601 PRIVATE
struct rs_pci
*find_acl(endpoint
)
606 /* Find ACL entry for caller */
607 for (i
= 0; i
<NR_DRIVERS
; i
++)
609 if (!pci_acl
[i
].inuse
)
611 if (pci_acl
[i
].acl
.rsp_endpoint
== endpoint
)
612 return &pci_acl
[i
].acl
;