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(message
*mp
)
130 aclp
= find_acl(mp
->m_source
);
133 printf("PCI: do_first_dev: no acl for caller %d\n",
136 r
= pci_first_dev_a(aclp
, &devind
, &vid
, &did
);
144 r
= send(mp
->m_source
, mp
);
147 printf("PCI: do_first_dev: unable to send to %d: %d\n",
152 PRIVATE
void do_next_dev(message
*mp
)
159 aclp
= find_acl(mp
->m_source
);
161 r
= pci_next_dev_a(aclp
, &devind
, &vid
, &did
);
169 r
= send(mp
->m_source
, mp
);
172 printf("PCI: do_next_dev: unable to send to %d: %d\n",
177 PRIVATE
void do_find_dev(mp
)
187 r
= pci_find_dev(bus
, dev
, func
, &devind
);
191 r
= send(mp
->m_source
, mp
);
194 printf("PCI: do_find_dev: unable to send to %d: %d\n",
199 PRIVATE
void do_ids(mp
)
207 r
= pci_ids_s(devind
, &vid
, &did
);
210 printf("pci:do_ids: failed for devind %d: %d\n",
217 r
= send(mp
->m_source
, mp
);
220 printf("PCI: do_ids: unable to send to %d: %d\n",
225 PRIVATE
void do_dev_name(mp
)
228 int r
, name_len
, len
;
230 char *name_ptr
, *name
;
237 name
= pci_dev_name(vid
, did
);
248 printf("PCI: pci`do_dev_name: calling do_vircopy\n");
249 r
= sys_vircopy(SELF
, D
, (vir_bytes
)name
, mp
->m_source
, D
,
250 (vir_bytes
)name_ptr
, len
);
254 r
= send(mp
->m_source
, mp
);
257 printf("PCI: do_dev_name: unable to send to %d: %d\n",
262 PRIVATE
void do_dev_name_s(mp
)
265 int r
, name_len
, len
;
267 cp_grant_id_t name_gid
;
275 name
= pci_dev_name(vid
, did
);
286 r
= sys_safecopyto(mp
->m_source
, name_gid
, 0, (vir_bytes
)name
,
291 r
= send(mp
->m_source
, mp
);
294 printf("PCI: do_dev_name: unable to send to %d: %d\n",
299 PRIVATE
void do_slot_name_s(mp
)
302 int r
, devind
, name_len
, len
;
310 r
= pci_slot_name_s(devind
, &name
);
313 printf("pci:do_slot_name_s: failed for devind %d: %d\n",
322 r
= sys_safecopyto(mp
->m_source
, gid
, 0,
323 (vir_bytes
)name
, len
, D
);
327 r
= send(mp
->m_source
, mp
);
330 printf("PCI: do_slot_name: unable to send to %d: %d\n",
335 PRIVATE
void do_set_acl(mp
)
340 if (mp
->m_source
!= RS_PROC_NR
)
342 printf("PCI: do_set_acl: not from RS\n");
347 for (i
= 0; i
<NR_DRIVERS
; i
++)
349 if (!pci_acl
[i
].inuse
)
354 printf("PCI: do_set_acl: table is full\n");
361 r
= sys_safecopyfrom(mp
->m_source
, gid
, 0, (vir_bytes
)&pci_acl
[i
].acl
,
362 sizeof(pci_acl
[i
].acl
), D
);
365 printf("PCI: do_set_acl: safecopyfrom failed\n");
371 printf("PCI: do_acl: setting ACL for %d ('%s') at entry %d\n",
372 pci_acl
[i
].acl
.rsp_endpoint
, pci_acl
[i
].acl
.rsp_label
,
378 PRIVATE
void do_del_acl(message
*mp
)
382 if (mp
->m_source
!= RS_PROC_NR
)
384 printf("do_del_acl: not from RS\n");
391 for (i
= 0; i
<NR_DRIVERS
; i
++)
393 if (!pci_acl
[i
].inuse
)
395 if (pci_acl
[i
].acl
.rsp_endpoint
== proc_nr
)
401 printf("do_del_acl: nothing found for %d\n", proc_nr
);
408 printf("do_acl: deleting ACL for %d ('%s') at entry %d\n",
409 pci_acl
[i
].acl
.rsp_endpoint
, pci_acl
[i
].acl
.rsp_label
, i
);
412 /* Also release all devices held by this process */
413 pci_release(proc_nr
);
418 PRIVATE
void do_reserve(message
*mp
)
424 mp
->m_type
= pci_reserve2(devind
, mp
->m_source
);
425 r
= send(mp
->m_source
, mp
);
428 printf("do_reserve: unable to send to %d: %d\n",
433 PRIVATE
void do_attr_r8(mp
)
442 r
= pci_attr_r8_s(devind
, port
, &v
);
446 "pci:do_attr_r8: pci_attr_r8_s(%d, %d, ...) failed: %d\n",
451 r
= send(mp
->m_source
, mp
);
454 printf("do_attr_r8: unable to send to %d: %d\n",
459 PRIVATE
void do_attr_r16(mp
)
468 v
= pci_attr_r16(devind
, port
);
471 r
= send(mp
->m_source
, mp
);
474 printf("do_attr_r16: unable to send to %d: %d\n",
479 PRIVATE
void do_attr_r32(mp
)
488 r
= pci_attr_r32_s(devind
, port
, &v
);
492 "pci:do_attr_r32: pci_attr_r32_s(%d, %d, ...) failed: %d\n",
497 r
= send(mp
->m_source
, mp
);
500 printf("do_attr_r32: unable to send to %d: %d\n",
505 PRIVATE
void do_attr_w8(mp
)
515 pci_attr_w8(devind
, port
, v
);
517 r
= send(mp
->m_source
, mp
);
520 printf("do_attr_w8: unable to send to %d: %d\n",
525 PRIVATE
void do_attr_w16(mp
)
535 pci_attr_w16(devind
, port
, v
);
537 r
= send(mp
->m_source
, mp
);
540 printf("do_attr_w16: unable to send to %d: %d\n",
545 PRIVATE
void do_attr_w32(mp
)
555 pci_attr_w32(devind
, port
, v
);
557 r
= send(mp
->m_source
, mp
);
560 printf("do_attr_w32: unable to send to %d: %d\n",
565 PRIVATE
void do_rescan_bus(mp
)
572 pci_rescan_bus(busnr
);
574 r
= send(mp
->m_source
, mp
);
577 printf("do_rescan_bus: unable to send to %d: %d\n",
583 PRIVATE
void reply(mp
, result
)
591 r
= send(mp
->m_source
, &m
);
593 printf("reply: unable to send to %d: %d\n", mp
->m_source
, r
);
597 PRIVATE
struct rs_pci
*find_acl(endpoint
)
602 /* Find ACL entry for caller */
603 for (i
= 0; i
<NR_DRIVERS
; i
++)
605 if (!pci_acl
[i
].inuse
)
607 if (pci_acl
[i
].acl
.rsp_endpoint
== endpoint
)
608 return &pci_acl
[i
].acl
;