7 struct pci_acl pci_acl
[NR_DRIVERS
];
9 static void do_init(message
*mp
);
10 static void do_first_dev(message
*mp
);
11 static void do_next_dev(message
*mp
);
12 static void do_find_dev(message
*mp
);
13 static void do_ids(message
*mp
);
14 static void do_dev_name_s(message
*mp
);
15 static void do_slot_name_s(message
*mp
);
16 static void do_set_acl(message
*mp
);
17 static void do_del_acl(message
*mp
);
18 static void do_reserve(message
*mp
);
19 static void do_attr_r8(message
*mp
);
20 static void do_attr_r16(message
*mp
);
21 static void do_attr_r32(message
*mp
);
22 static void do_attr_w8(message
*mp
);
23 static void do_attr_w16(message
*mp
);
24 static void do_attr_w32(message
*mp
);
25 static void do_get_bar(message
*mp
);
26 static void do_rescan_bus(message
*mp
);
27 static void reply(message
*mp
, int result
);
28 static struct rs_pci
*find_acl(int endpoint
);
32 /* SEF functions and variables. */
33 static 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_RESERVE
: do_reserve(&m
); break;
68 case BUSC_PCI_ATTR_R8
: do_attr_r8(&m
); break;
69 case BUSC_PCI_ATTR_R16
: do_attr_r16(&m
); break;
70 case BUSC_PCI_ATTR_R32
: do_attr_r32(&m
); break;
71 case BUSC_PCI_ATTR_W8
: do_attr_w8(&m
); break;
72 case BUSC_PCI_ATTR_W16
: do_attr_w16(&m
); break;
73 case BUSC_PCI_ATTR_W32
: do_attr_w32(&m
); break;
74 case BUSC_PCI_RESCAN
: do_rescan_bus(&m
); break;
75 case BUSC_PCI_DEV_NAME_S
: do_dev_name_s(&m
); break;
76 case BUSC_PCI_SLOT_NAME_S
: do_slot_name_s(&m
); break;
77 case BUSC_PCI_SET_ACL
: do_set_acl(&m
); break;
78 case BUSC_PCI_DEL_ACL
: do_del_acl(&m
); break;
79 case BUSC_PCI_GET_BAR
: do_get_bar(&m
); break;
81 printf("PCI: got message from %d, type %d\n",
82 m
.m_source
, m
.m_type
);
90 /*===========================================================================*
92 *===========================================================================*/
93 static 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 static void do_init(mp
)
114 printf("PCI: do_init: called by '%d'\n", mp
->m_source
);
118 r
= ipc_send(mp
->m_source
, mp
);
120 printf("PCI: do_init: unable to send to %d: %d\n",
124 static 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
= ipc_send(mp
->m_source
, mp
);
147 printf("PCI: do_first_dev: unable to send to %d: %d\n",
152 static 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
= ipc_send(mp
->m_source
, mp
);
172 printf("PCI: do_next_dev: unable to send to %d: %d\n",
177 static void do_find_dev(mp
)
187 r
= pci_find_dev(bus
, dev
, func
, &devind
);
191 r
= ipc_send(mp
->m_source
, mp
);
194 printf("PCI: do_find_dev: unable to send to %d: %d\n",
199 static 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
= ipc_send(mp
->m_source
, mp
);
220 printf("PCI: do_ids: unable to send to %d: %d\n",
225 static void do_dev_name_s(mp
)
228 int r
, name_len
, len
;
230 cp_grant_id_t name_gid
;
238 name
= pci_dev_name(vid
, did
);
249 r
= sys_safecopyto(mp
->m_source
, name_gid
, 0, (vir_bytes
)name
,
254 r
= ipc_send(mp
->m_source
, mp
);
257 printf("PCI: do_dev_name: unable to send to %d: %d\n",
262 static void do_slot_name_s(mp
)
265 int r
, devind
, name_len
, len
;
273 r
= pci_slot_name_s(devind
, &name
);
276 printf("pci:do_slot_name_s: failed for devind %d: %d\n",
285 r
= sys_safecopyto(mp
->m_source
, gid
, 0,
286 (vir_bytes
)name
, len
);
290 r
= ipc_send(mp
->m_source
, mp
);
293 printf("PCI: do_slot_name: unable to send to %d: %d\n",
298 static void do_set_acl(mp
)
303 if (mp
->m_source
!= RS_PROC_NR
)
305 printf("PCI: do_set_acl: not from RS\n");
310 for (i
= 0; i
<NR_DRIVERS
; i
++)
312 if (!pci_acl
[i
].inuse
)
317 printf("PCI: do_set_acl: table is full\n");
324 r
= sys_safecopyfrom(mp
->m_source
, gid
, 0, (vir_bytes
)&pci_acl
[i
].acl
,
325 sizeof(pci_acl
[i
].acl
));
328 printf("PCI: do_set_acl: safecopyfrom failed\n");
334 printf("PCI: do_acl: setting ACL for %d ('%s') at entry %d\n",
335 pci_acl
[i
].acl
.rsp_endpoint
, pci_acl
[i
].acl
.rsp_label
,
341 static void do_del_acl(message
*mp
)
345 if (mp
->m_source
!= RS_PROC_NR
)
347 printf("do_del_acl: not from RS\n");
354 for (i
= 0; i
<NR_DRIVERS
; i
++)
356 if (!pci_acl
[i
].inuse
)
358 if (pci_acl
[i
].acl
.rsp_endpoint
== proc_nr
)
364 printf("do_del_acl: nothing found for %d\n", proc_nr
);
371 printf("do_acl: deleting ACL for %d ('%s') at entry %d\n",
372 pci_acl
[i
].acl
.rsp_endpoint
, pci_acl
[i
].acl
.rsp_label
, i
);
375 /* Also release all devices held by this process */
376 pci_release(proc_nr
);
381 static void do_reserve(message
*mp
)
388 aclp
= find_acl(mp
->m_source
);
390 mp
->m_type
= pci_reserve_a(devind
, mp
->m_source
, aclp
);
391 r
= ipc_send(mp
->m_source
, mp
);
394 printf("do_reserve: unable to send to %d: %d\n",
399 static void do_attr_r8(mp
)
408 r
= pci_attr_r8_s(devind
, port
, &v
);
412 "pci:do_attr_r8: pci_attr_r8_s(%d, %d, ...) failed: %d\n",
417 r
= ipc_send(mp
->m_source
, mp
);
420 printf("do_attr_r8: unable to send to %d: %d\n",
425 static void do_attr_r16(mp
)
434 v
= pci_attr_r16(devind
, port
);
437 r
= ipc_send(mp
->m_source
, mp
);
440 printf("do_attr_r16: unable to send to %d: %d\n",
445 static void do_attr_r32(mp
)
454 r
= pci_attr_r32_s(devind
, port
, &v
);
458 "pci:do_attr_r32: pci_attr_r32_s(%d, %d, ...) failed: %d\n",
463 r
= ipc_send(mp
->m_source
, mp
);
466 printf("do_attr_r32: unable to send to %d: %d\n",
471 static void do_attr_w8(mp
)
481 pci_attr_w8(devind
, port
, v
);
483 r
= ipc_send(mp
->m_source
, mp
);
486 printf("do_attr_w8: unable to send to %d: %d\n",
491 static void do_attr_w16(mp
)
501 pci_attr_w16(devind
, port
, v
);
503 r
= ipc_send(mp
->m_source
, mp
);
506 printf("do_attr_w16: unable to send to %d: %d\n",
511 static void do_attr_w32(mp
)
521 pci_attr_w32(devind
, port
, v
);
523 r
= ipc_send(mp
->m_source
, mp
);
526 printf("do_attr_w32: unable to send to %d: %d\n",
531 static void do_get_bar(mp
)
534 int r
, devind
, port
, ioflag
;
537 devind
= mp
->m_lsys_pci_busc_get_bar
.devind
;
538 port
= mp
->m_lsys_pci_busc_get_bar
.port
;
540 mp
->m_type
= pci_get_bar_s(devind
, port
, &base
, &size
, &ioflag
);
542 if (mp
->m_type
== OK
)
544 mp
->m_pci_lsys_busc_get_bar
.base
= base
;
545 mp
->m_pci_lsys_busc_get_bar
.size
= size
;
546 mp
->m_pci_lsys_busc_get_bar
.flags
= ioflag
;
549 r
= ipc_send(mp
->m_source
, mp
);
552 printf("do_get_bar: unable to send to %d: %d\n",
557 static void do_rescan_bus(mp
)
564 pci_rescan_bus(busnr
);
566 r
= ipc_send(mp
->m_source
, mp
);
569 printf("do_rescan_bus: unable to send to %d: %d\n",
575 static void reply(mp
, result
)
583 r
= ipc_send(mp
->m_source
, &m
);
585 printf("reply: unable to send to %d: %d\n", mp
->m_source
, r
);
589 static struct rs_pci
*find_acl(endpoint
)
594 /* Find ACL entry for caller */
595 for (i
= 0; i
<NR_DRIVERS
; i
++)
597 if (!pci_acl
[i
].inuse
)
599 if (pci_acl
[i
].acl
.rsp_endpoint
== endpoint
)
600 return &pci_acl
[i
].acl
;