PCI driver cleanup
- Moved to KNF - Whitespace cleanup - Removed useless static functions prototypes - Renamed some file private functions by prepending '__' - Renamed some server-specific function by prepending '_' - Fixed compilation warning for WARNS= 3 Change-Id: Ie44d35839177d5ee0630cdf576660c852452ab80
This commit is contained in:
parent
3d3105466a
commit
6e7bb62853
5 changed files with 1889 additions and 2011 deletions
|
@ -5,4 +5,6 @@ SRCS= main.c pci.c pci_table.c
|
||||||
DPADD+= ${LIBSYS} ${LIBTIMERS}
|
DPADD+= ${LIBSYS} ${LIBTIMERS}
|
||||||
LDADD+= -lsys -ltimers
|
LDADD+= -lsys -ltimers
|
||||||
|
|
||||||
|
WARNS?= 3
|
||||||
|
|
||||||
.include <minix.service.mk>
|
.include <minix.service.mk>
|
||||||
|
|
|
@ -1,96 +1,13 @@
|
||||||
/*
|
#include <minix/driver.h>
|
||||||
main.c
|
#include <minix/rs.h>
|
||||||
*/
|
|
||||||
|
|
||||||
#include "pci.h"
|
#include "pci.h"
|
||||||
|
|
||||||
|
int debug = 0;
|
||||||
struct pci_acl pci_acl[NR_DRIVERS];
|
struct pci_acl pci_acl[NR_DRIVERS];
|
||||||
|
|
||||||
static void do_init(message *mp);
|
static void
|
||||||
static void do_first_dev(message *mp);
|
sef_local_startup()
|
||||||
static void do_next_dev(message *mp);
|
|
||||||
static void do_find_dev(message *mp);
|
|
||||||
static void do_ids(message *mp);
|
|
||||||
static void do_dev_name_s(message *mp);
|
|
||||||
static void do_slot_name_s(message *mp);
|
|
||||||
static void do_set_acl(message *mp);
|
|
||||||
static void do_del_acl(message *mp);
|
|
||||||
static void do_reserve(message *mp);
|
|
||||||
static void do_attr_r8(message *mp);
|
|
||||||
static void do_attr_r16(message *mp);
|
|
||||||
static void do_attr_r32(message *mp);
|
|
||||||
static void do_attr_w8(message *mp);
|
|
||||||
static void do_attr_w16(message *mp);
|
|
||||||
static void do_attr_w32(message *mp);
|
|
||||||
static void do_get_bar(message *mp);
|
|
||||||
static void do_rescan_bus(message *mp);
|
|
||||||
static void reply(message *mp, int result);
|
|
||||||
static struct rs_pci *find_acl(int endpoint);
|
|
||||||
|
|
||||||
extern int debug;
|
|
||||||
|
|
||||||
/* SEF functions and variables. */
|
|
||||||
static void sef_local_startup(void);
|
|
||||||
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
int r;
|
|
||||||
message m;
|
|
||||||
int ipc_status;
|
|
||||||
|
|
||||||
/* SEF local startup. */
|
|
||||||
sef_local_startup();
|
|
||||||
|
|
||||||
for(;;)
|
|
||||||
{
|
|
||||||
r= driver_receive(ANY, &m, &ipc_status);
|
|
||||||
if (r < 0)
|
|
||||||
{
|
|
||||||
printf("PCI: driver_receive failed: %d\n", r);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (is_ipc_notify(ipc_status)) {
|
|
||||||
printf("PCI: got notify from %d\n", m.m_source);
|
|
||||||
|
|
||||||
/* done, get a new message */
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch(m.m_type)
|
|
||||||
{
|
|
||||||
case BUSC_PCI_INIT: do_init(&m); break;
|
|
||||||
case BUSC_PCI_FIRST_DEV: do_first_dev(&m); break;
|
|
||||||
case BUSC_PCI_NEXT_DEV: do_next_dev(&m); break;
|
|
||||||
case BUSC_PCI_FIND_DEV: do_find_dev(&m); break;
|
|
||||||
case BUSC_PCI_IDS: do_ids(&m); break;
|
|
||||||
case BUSC_PCI_RESERVE: do_reserve(&m); break;
|
|
||||||
case BUSC_PCI_ATTR_R8: do_attr_r8(&m); break;
|
|
||||||
case BUSC_PCI_ATTR_R16: do_attr_r16(&m); break;
|
|
||||||
case BUSC_PCI_ATTR_R32: do_attr_r32(&m); break;
|
|
||||||
case BUSC_PCI_ATTR_W8: do_attr_w8(&m); break;
|
|
||||||
case BUSC_PCI_ATTR_W16: do_attr_w16(&m); break;
|
|
||||||
case BUSC_PCI_ATTR_W32: do_attr_w32(&m); break;
|
|
||||||
case BUSC_PCI_RESCAN: do_rescan_bus(&m); break;
|
|
||||||
case BUSC_PCI_DEV_NAME_S: do_dev_name_s(&m); break;
|
|
||||||
case BUSC_PCI_SLOT_NAME_S: do_slot_name_s(&m); break;
|
|
||||||
case BUSC_PCI_SET_ACL: do_set_acl(&m); break;
|
|
||||||
case BUSC_PCI_DEL_ACL: do_del_acl(&m); break;
|
|
||||||
case BUSC_PCI_GET_BAR: do_get_bar(&m); break;
|
|
||||||
default:
|
|
||||||
printf("PCI: got message from %d, type %d\n",
|
|
||||||
m.m_source, m.m_type);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*===========================================================================*
|
|
||||||
* sef_local_startup *
|
|
||||||
*===========================================================================*/
|
|
||||||
static void sef_local_startup()
|
|
||||||
{
|
{
|
||||||
/* Register init callbacks. */
|
/* Register init callbacks. */
|
||||||
sef_setcb_init_fresh(sef_cb_init_fresh);
|
sef_setcb_init_fresh(sef_cb_init_fresh);
|
||||||
|
@ -105,8 +22,37 @@ static void sef_local_startup()
|
||||||
sef_startup();
|
sef_startup();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void do_init(mp)
|
static struct rs_pci *
|
||||||
message *mp;
|
find_acl(int endpoint)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* Find ACL entry for caller */
|
||||||
|
for (i= 0; i<NR_DRIVERS; i++)
|
||||||
|
{
|
||||||
|
if (!pci_acl[i].inuse)
|
||||||
|
continue;
|
||||||
|
if (pci_acl[i].acl.rsp_endpoint == endpoint)
|
||||||
|
return &pci_acl[i].acl;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
reply(message *mp, int result)
|
||||||
|
{
|
||||||
|
int r;
|
||||||
|
message m;
|
||||||
|
|
||||||
|
m.m_type= result;
|
||||||
|
r= ipc_send(mp->m_source, &m);
|
||||||
|
if (r != 0)
|
||||||
|
printf("reply: unable to send to %d: %d\n", mp->m_source, r);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
do_init(message *mp)
|
||||||
{
|
{
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
|
@ -121,7 +67,8 @@ message *mp;
|
||||||
mp->m_source, r);
|
mp->m_source, r);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void do_first_dev(message *mp)
|
static void
|
||||||
|
do_first_dev(message *mp)
|
||||||
{
|
{
|
||||||
int r, devind;
|
int r, devind;
|
||||||
u16_t vid, did;
|
u16_t vid, did;
|
||||||
|
@ -133,7 +80,7 @@ static void do_first_dev(message *mp)
|
||||||
printf("PCI: do_first_dev: no acl for caller %d\n",
|
printf("PCI: do_first_dev: no acl for caller %d\n",
|
||||||
mp->m_source);
|
mp->m_source);
|
||||||
|
|
||||||
r= pci_first_dev_a(aclp, &devind, &vid, &did);
|
r= _pci_first_dev(aclp, &devind, &vid, &did);
|
||||||
if (r == 1)
|
if (r == 1)
|
||||||
{
|
{
|
||||||
mp->m1_i1= devind;
|
mp->m1_i1= devind;
|
||||||
|
@ -149,7 +96,8 @@ static void do_first_dev(message *mp)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void do_next_dev(message *mp)
|
static void
|
||||||
|
do_next_dev(message *mp)
|
||||||
{
|
{
|
||||||
int r, devind;
|
int r, devind;
|
||||||
u16_t vid, did;
|
u16_t vid, did;
|
||||||
|
@ -158,7 +106,7 @@ static void do_next_dev(message *mp)
|
||||||
devind= mp->m1_i1;
|
devind= mp->m1_i1;
|
||||||
aclp= find_acl(mp->m_source);
|
aclp= find_acl(mp->m_source);
|
||||||
|
|
||||||
r= pci_next_dev_a(aclp, &devind, &vid, &did);
|
r= _pci_next_dev(aclp, &devind, &vid, &did);
|
||||||
if (r == 1)
|
if (r == 1)
|
||||||
{
|
{
|
||||||
mp->m1_i1= devind;
|
mp->m1_i1= devind;
|
||||||
|
@ -174,8 +122,8 @@ static void do_next_dev(message *mp)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void do_find_dev(mp)
|
static void
|
||||||
message *mp;
|
do_find_dev(message *mp)
|
||||||
{
|
{
|
||||||
int r, devind;
|
int r, devind;
|
||||||
u8_t bus, dev, func;
|
u8_t bus, dev, func;
|
||||||
|
@ -184,7 +132,7 @@ message *mp;
|
||||||
dev= mp->m1_i2;
|
dev= mp->m1_i2;
|
||||||
func= mp->m1_i3;
|
func= mp->m1_i3;
|
||||||
|
|
||||||
r= pci_find_dev(bus, dev, func, &devind);
|
r= _pci_find_dev(bus, dev, func, &devind);
|
||||||
if (r == 1)
|
if (r == 1)
|
||||||
mp->m1_i1= devind;
|
mp->m1_i1= devind;
|
||||||
mp->m_type= r;
|
mp->m_type= r;
|
||||||
|
@ -196,15 +144,15 @@ message *mp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void do_ids(mp)
|
static void
|
||||||
message *mp;
|
do_ids(message *mp)
|
||||||
{
|
{
|
||||||
int r, devind;
|
int r, devind;
|
||||||
u16_t vid, did;
|
u16_t vid, did;
|
||||||
|
|
||||||
devind= mp->m1_i1;
|
devind= mp->m1_i1;
|
||||||
|
|
||||||
r= pci_ids_s(devind, &vid, &did);
|
r= _pci_ids(devind, &vid, &did);
|
||||||
if (r != OK)
|
if (r != OK)
|
||||||
{
|
{
|
||||||
printf("pci:do_ids: failed for devind %d: %d\n",
|
printf("pci:do_ids: failed for devind %d: %d\n",
|
||||||
|
@ -222,20 +170,20 @@ message *mp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void do_dev_name_s(mp)
|
static void
|
||||||
message *mp;
|
do_dev_name(message *mp)
|
||||||
{
|
{
|
||||||
int r, name_len, len;
|
int r, name_len, len;
|
||||||
u16_t vid, did;
|
u16_t vid, did;
|
||||||
cp_grant_id_t name_gid;
|
cp_grant_id_t name_gid;
|
||||||
char *name;
|
const char *name;
|
||||||
|
|
||||||
vid= mp->m7_i1;
|
vid= mp->m7_i1;
|
||||||
did= mp->m7_i2;
|
did= mp->m7_i2;
|
||||||
name_len= mp->m7_i3;
|
name_len= mp->m7_i3;
|
||||||
name_gid= mp->m7_i4;
|
name_gid= mp->m7_i4;
|
||||||
|
|
||||||
name= pci_dev_name(vid, did);
|
name= _pci_dev_name(vid, did);
|
||||||
if (name == NULL)
|
if (name == NULL)
|
||||||
{
|
{
|
||||||
/* No name */
|
/* No name */
|
||||||
|
@ -259,8 +207,8 @@ message *mp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void do_slot_name_s(mp)
|
static void
|
||||||
message *mp;
|
do_slot_name(message *mp)
|
||||||
{
|
{
|
||||||
int r, devind, name_len, len;
|
int r, devind, name_len, len;
|
||||||
cp_grant_id_t gid;
|
cp_grant_id_t gid;
|
||||||
|
@ -270,7 +218,7 @@ message *mp;
|
||||||
name_len= mp->m1_i2;
|
name_len= mp->m1_i2;
|
||||||
gid= mp->m1_i3;
|
gid= mp->m1_i3;
|
||||||
|
|
||||||
r= pci_slot_name_s(devind, &name);
|
r= _pci_slot_name(devind, &name);
|
||||||
if (r != OK)
|
if (r != OK)
|
||||||
{
|
{
|
||||||
printf("pci:do_slot_name_s: failed for devind %d: %d\n",
|
printf("pci:do_slot_name_s: failed for devind %d: %d\n",
|
||||||
|
@ -295,8 +243,8 @@ message *mp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void do_set_acl(mp)
|
static void
|
||||||
message *mp;
|
do_set_acl(message *mp)
|
||||||
{
|
{
|
||||||
int i, r, gid;
|
int i, r, gid;
|
||||||
|
|
||||||
|
@ -338,7 +286,8 @@ message *mp;
|
||||||
reply(mp, OK);
|
reply(mp, OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void do_del_acl(message *mp)
|
static void
|
||||||
|
do_del_acl(message *mp)
|
||||||
{
|
{
|
||||||
int i, proc_nr;
|
int i, proc_nr;
|
||||||
|
|
||||||
|
@ -373,12 +322,13 @@ static void do_del_acl(message *mp)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Also release all devices held by this process */
|
/* Also release all devices held by this process */
|
||||||
pci_release(proc_nr);
|
_pci_release(proc_nr);
|
||||||
|
|
||||||
reply(mp, OK);
|
reply(mp, OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void do_reserve(message *mp)
|
static void
|
||||||
|
do_reserve(message *mp)
|
||||||
{
|
{
|
||||||
struct rs_pci *aclp;
|
struct rs_pci *aclp;
|
||||||
int r, devind;
|
int r, devind;
|
||||||
|
@ -387,7 +337,7 @@ static void do_reserve(message *mp)
|
||||||
|
|
||||||
aclp= find_acl(mp->m_source);
|
aclp= find_acl(mp->m_source);
|
||||||
|
|
||||||
mp->m_type= pci_reserve_a(devind, mp->m_source, aclp);
|
mp->m_type= _pci_reserve(devind, mp->m_source, aclp);
|
||||||
r= ipc_send(mp->m_source, mp);
|
r= ipc_send(mp->m_source, mp);
|
||||||
if (r != 0)
|
if (r != 0)
|
||||||
{
|
{
|
||||||
|
@ -396,8 +346,8 @@ static void do_reserve(message *mp)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void do_attr_r8(mp)
|
static void
|
||||||
message *mp;
|
do_attr_r8(message *mp)
|
||||||
{
|
{
|
||||||
int r, devind, port;
|
int r, devind, port;
|
||||||
u8_t v;
|
u8_t v;
|
||||||
|
@ -405,11 +355,11 @@ message *mp;
|
||||||
devind= mp->m2_i1;
|
devind= mp->m2_i1;
|
||||||
port= mp->m2_i2;
|
port= mp->m2_i2;
|
||||||
|
|
||||||
r= pci_attr_r8_s(devind, port, &v);
|
r= _pci_attr_r8(devind, port, &v);
|
||||||
if (r != OK)
|
if (r != OK)
|
||||||
{
|
{
|
||||||
printf(
|
printf(
|
||||||
"pci:do_attr_r8: pci_attr_r8_s(%d, %d, ...) failed: %d\n",
|
"pci:do_attr_r8: pci_attr_r8(%d, %d, ...) failed: %d\n",
|
||||||
devind, port, r);
|
devind, port, r);
|
||||||
}
|
}
|
||||||
mp->m2_l1= v;
|
mp->m2_l1= v;
|
||||||
|
@ -422,16 +372,22 @@ message *mp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void do_attr_r16(mp)
|
static void
|
||||||
message *mp;
|
do_attr_r16(message *mp)
|
||||||
{
|
{
|
||||||
int r, devind, port;
|
int r, devind, port;
|
||||||
u32_t v;
|
u16_t v;
|
||||||
|
|
||||||
devind= mp->m2_i1;
|
devind= mp->m2_i1;
|
||||||
port= mp->m2_i2;
|
port= mp->m2_i2;
|
||||||
|
|
||||||
v= pci_attr_r16(devind, port);
|
r= _pci_attr_r16(devind, port, &v);
|
||||||
|
if (r != OK)
|
||||||
|
{
|
||||||
|
printf(
|
||||||
|
"pci:do_attr_r16: pci_attr_r16(%d, %d, ...) failed: %d\n",
|
||||||
|
devind, port, r);
|
||||||
|
}
|
||||||
mp->m2_l1= v;
|
mp->m2_l1= v;
|
||||||
mp->m_type= OK;
|
mp->m_type= OK;
|
||||||
r= ipc_send(mp->m_source, mp);
|
r= ipc_send(mp->m_source, mp);
|
||||||
|
@ -442,8 +398,8 @@ message *mp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void do_attr_r32(mp)
|
static void
|
||||||
message *mp;
|
do_attr_r32(message *mp)
|
||||||
{
|
{
|
||||||
int r, devind, port;
|
int r, devind, port;
|
||||||
u32_t v;
|
u32_t v;
|
||||||
|
@ -451,11 +407,11 @@ message *mp;
|
||||||
devind= mp->m2_i1;
|
devind= mp->m2_i1;
|
||||||
port= mp->m2_i2;
|
port= mp->m2_i2;
|
||||||
|
|
||||||
r= pci_attr_r32_s(devind, port, &v);
|
r= _pci_attr_r32(devind, port, &v);
|
||||||
if (r != OK)
|
if (r != OK)
|
||||||
{
|
{
|
||||||
printf(
|
printf(
|
||||||
"pci:do_attr_r32: pci_attr_r32_s(%d, %d, ...) failed: %d\n",
|
"pci:do_attr_r32: pci_attr_r32(%d, %d, ...) failed: %d\n",
|
||||||
devind, port, r);
|
devind, port, r);
|
||||||
}
|
}
|
||||||
mp->m2_l1= v;
|
mp->m2_l1= v;
|
||||||
|
@ -468,8 +424,8 @@ message *mp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void do_attr_w8(mp)
|
static void
|
||||||
message *mp;
|
do_attr_w8(message *mp)
|
||||||
{
|
{
|
||||||
int r, devind, port;
|
int r, devind, port;
|
||||||
u8_t v;
|
u8_t v;
|
||||||
|
@ -478,7 +434,7 @@ message *mp;
|
||||||
port= mp->m2_i2;
|
port= mp->m2_i2;
|
||||||
v= mp->m2_l1;
|
v= mp->m2_l1;
|
||||||
|
|
||||||
pci_attr_w8(devind, port, v);
|
_pci_attr_w8(devind, port, v);
|
||||||
mp->m_type= OK;
|
mp->m_type= OK;
|
||||||
r= ipc_send(mp->m_source, mp);
|
r= ipc_send(mp->m_source, mp);
|
||||||
if (r != 0)
|
if (r != 0)
|
||||||
|
@ -488,8 +444,8 @@ message *mp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void do_attr_w16(mp)
|
static void
|
||||||
message *mp;
|
do_attr_w16(message *mp)
|
||||||
{
|
{
|
||||||
int r, devind, port;
|
int r, devind, port;
|
||||||
u16_t v;
|
u16_t v;
|
||||||
|
@ -498,7 +454,7 @@ message *mp;
|
||||||
port= mp->m2_i2;
|
port= mp->m2_i2;
|
||||||
v= mp->m2_l1;
|
v= mp->m2_l1;
|
||||||
|
|
||||||
pci_attr_w16(devind, port, v);
|
_pci_attr_w16(devind, port, v);
|
||||||
mp->m_type= OK;
|
mp->m_type= OK;
|
||||||
r= ipc_send(mp->m_source, mp);
|
r= ipc_send(mp->m_source, mp);
|
||||||
if (r != 0)
|
if (r != 0)
|
||||||
|
@ -508,8 +464,8 @@ message *mp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void do_attr_w32(mp)
|
static void
|
||||||
message *mp;
|
do_attr_w32(message *mp)
|
||||||
{
|
{
|
||||||
int r, devind, port;
|
int r, devind, port;
|
||||||
u32_t v;
|
u32_t v;
|
||||||
|
@ -518,7 +474,7 @@ message *mp;
|
||||||
port= mp->m2_i2;
|
port= mp->m2_i2;
|
||||||
v= mp->m2_l1;
|
v= mp->m2_l1;
|
||||||
|
|
||||||
pci_attr_w32(devind, port, v);
|
_pci_attr_w32(devind, port, v);
|
||||||
mp->m_type= OK;
|
mp->m_type= OK;
|
||||||
r= ipc_send(mp->m_source, mp);
|
r= ipc_send(mp->m_source, mp);
|
||||||
if (r != 0)
|
if (r != 0)
|
||||||
|
@ -528,8 +484,8 @@ message *mp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void do_get_bar(mp)
|
static void
|
||||||
message *mp;
|
do_get_bar(message *mp)
|
||||||
{
|
{
|
||||||
int r, devind, port, ioflag;
|
int r, devind, port, ioflag;
|
||||||
u32_t base, size;
|
u32_t base, size;
|
||||||
|
@ -537,7 +493,7 @@ message *mp;
|
||||||
devind= mp->m_lsys_pci_busc_get_bar.devind;
|
devind= mp->m_lsys_pci_busc_get_bar.devind;
|
||||||
port= mp->m_lsys_pci_busc_get_bar.port;
|
port= mp->m_lsys_pci_busc_get_bar.port;
|
||||||
|
|
||||||
mp->m_type= pci_get_bar_s(devind, port, &base, &size, &ioflag);
|
mp->m_type= _pci_get_bar(devind, port, &base, &size, &ioflag);
|
||||||
|
|
||||||
if (mp->m_type == OK)
|
if (mp->m_type == OK)
|
||||||
{
|
{
|
||||||
|
@ -554,14 +510,14 @@ message *mp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void do_rescan_bus(mp)
|
static void
|
||||||
message *mp;
|
do_rescan_bus(message *mp)
|
||||||
{
|
{
|
||||||
int r, busnr;
|
int r, busnr;
|
||||||
|
|
||||||
busnr= mp->m2_i1;
|
busnr= mp->m2_i1;
|
||||||
|
|
||||||
pci_rescan_bus(busnr);
|
_pci_rescan_bus(busnr);
|
||||||
mp->m_type= OK;
|
mp->m_type= OK;
|
||||||
r= ipc_send(mp->m_source, mp);
|
r= ipc_send(mp->m_source, mp);
|
||||||
if (r != 0)
|
if (r != 0)
|
||||||
|
@ -571,33 +527,58 @@ message *mp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
static void reply(mp, result)
|
main(void)
|
||||||
message *mp;
|
|
||||||
int result;
|
|
||||||
{
|
{
|
||||||
int r;
|
int r;
|
||||||
message m;
|
message m;
|
||||||
|
int ipc_status;
|
||||||
|
|
||||||
m.m_type= result;
|
/* SEF local startup. */
|
||||||
r= ipc_send(mp->m_source, &m);
|
sef_local_startup();
|
||||||
if (r != 0)
|
|
||||||
printf("reply: unable to send to %d: %d\n", mp->m_source, r);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
for(;;)
|
||||||
static struct rs_pci *find_acl(endpoint)
|
|
||||||
int endpoint;
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
/* Find ACL entry for caller */
|
|
||||||
for (i= 0; i<NR_DRIVERS; i++)
|
|
||||||
{
|
{
|
||||||
if (!pci_acl[i].inuse)
|
r= driver_receive(ANY, &m, &ipc_status);
|
||||||
|
if (r < 0)
|
||||||
|
{
|
||||||
|
printf("PCI: driver_receive failed: %d\n", r);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_ipc_notify(ipc_status)) {
|
||||||
|
printf("PCI: got notify from %d\n", m.m_source);
|
||||||
|
|
||||||
|
/* done, get a new message */
|
||||||
continue;
|
continue;
|
||||||
if (pci_acl[i].acl.rsp_endpoint == endpoint)
|
}
|
||||||
return &pci_acl[i].acl;
|
|
||||||
|
switch(m.m_type)
|
||||||
|
{
|
||||||
|
case BUSC_PCI_INIT: do_init(&m); break;
|
||||||
|
case BUSC_PCI_FIRST_DEV: do_first_dev(&m); break;
|
||||||
|
case BUSC_PCI_NEXT_DEV: do_next_dev(&m); break;
|
||||||
|
case BUSC_PCI_FIND_DEV: do_find_dev(&m); break;
|
||||||
|
case BUSC_PCI_IDS: do_ids(&m); break;
|
||||||
|
case BUSC_PCI_RESERVE: do_reserve(&m); break;
|
||||||
|
case BUSC_PCI_ATTR_R8: do_attr_r8(&m); break;
|
||||||
|
case BUSC_PCI_ATTR_R16: do_attr_r16(&m); break;
|
||||||
|
case BUSC_PCI_ATTR_R32: do_attr_r32(&m); break;
|
||||||
|
case BUSC_PCI_ATTR_W8: do_attr_w8(&m); break;
|
||||||
|
case BUSC_PCI_ATTR_W16: do_attr_w16(&m); break;
|
||||||
|
case BUSC_PCI_ATTR_W32: do_attr_w32(&m); break;
|
||||||
|
case BUSC_PCI_RESCAN: do_rescan_bus(&m); break;
|
||||||
|
case BUSC_PCI_DEV_NAME_S: do_dev_name(&m); break;
|
||||||
|
case BUSC_PCI_SLOT_NAME_S: do_slot_name(&m); break;
|
||||||
|
case BUSC_PCI_SET_ACL: do_set_acl(&m); break;
|
||||||
|
case BUSC_PCI_DEL_ACL: do_del_acl(&m); break;
|
||||||
|
case BUSC_PCI_GET_BAR: do_get_bar(&m); break;
|
||||||
|
default:
|
||||||
|
printf("PCI: got message from %d, type %d\n",
|
||||||
|
m.m_source, m.m_type);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return NULL;
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -4,36 +4,23 @@ pci.h
|
||||||
Created: Jan 2000 by Philip Homburg <philip@cs.vu.nl>
|
Created: Jan 2000 by Philip Homburg <philip@cs.vu.nl>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <minix/drivers.h>
|
|
||||||
#include <minix/driver.h>
|
|
||||||
#include <minix/rs.h>
|
|
||||||
|
|
||||||
/* tempory functions: to be replaced later (see pci_intel.h) */
|
|
||||||
unsigned pci_inb(u16_t port);
|
|
||||||
unsigned pci_inw(u16_t port);
|
|
||||||
unsigned pci_inl(u16_t port);
|
|
||||||
|
|
||||||
void pci_outb(u16_t port, u8_t value);
|
|
||||||
void pci_outw(u16_t port, u16_t value);
|
|
||||||
void pci_outl(u16_t port, u32_t value);
|
|
||||||
|
|
||||||
struct pci_vendor
|
struct pci_vendor
|
||||||
{
|
{
|
||||||
u16_t vid;
|
u16_t vid;
|
||||||
char *name;
|
const char *name;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct pci_device
|
struct pci_device
|
||||||
{
|
{
|
||||||
u16_t vid;
|
u16_t vid;
|
||||||
u16_t did;
|
u16_t did;
|
||||||
char *name;
|
const char *name;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct pci_baseclass
|
struct pci_baseclass
|
||||||
{
|
{
|
||||||
u8_t baseclass;
|
u8_t baseclass;
|
||||||
char *name;
|
const char *name;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct pci_subclass
|
struct pci_subclass
|
||||||
|
@ -41,7 +28,7 @@ struct pci_subclass
|
||||||
u8_t baseclass;
|
u8_t baseclass;
|
||||||
u8_t subclass;
|
u8_t subclass;
|
||||||
u16_t infclass;
|
u16_t infclass;
|
||||||
char *name;
|
const char *name;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct pci_intel_ctrl
|
struct pci_intel_ctrl
|
||||||
|
@ -83,6 +70,8 @@ struct pci_acl
|
||||||
/* Still needed? */
|
/* Still needed? */
|
||||||
#define PCI_AGPB_VIA 3 /* VIA compatible AGP bridge */
|
#define PCI_AGPB_VIA 3 /* VIA compatible AGP bridge */
|
||||||
|
|
||||||
|
extern int debug;
|
||||||
|
|
||||||
extern struct pci_vendor pci_vendor_table[];
|
extern struct pci_vendor pci_vendor_table[];
|
||||||
extern struct pci_device pci_device_table[];
|
extern struct pci_device pci_device_table[];
|
||||||
extern struct pci_baseclass pci_baseclass_table[];
|
extern struct pci_baseclass pci_baseclass_table[];
|
||||||
|
@ -92,24 +81,36 @@ extern struct pci_intel_ctrl pci_intel_ctrl[];
|
||||||
#endif
|
#endif
|
||||||
extern struct pci_isabridge pci_isabridge[];
|
extern struct pci_isabridge pci_isabridge[];
|
||||||
extern struct pci_pcibridge pci_pcibridge[];
|
extern struct pci_pcibridge pci_pcibridge[];
|
||||||
|
extern struct pci_acl pci_acl[NR_DRIVERS];
|
||||||
|
|
||||||
/* Function prototypes. */
|
/* Function prototypes. */
|
||||||
int sef_cb_init_fresh(int type, sef_init_info_t *info);
|
int sef_cb_init_fresh(int type, sef_init_info_t *info);
|
||||||
int map_service(struct rprocpub *rpub);
|
int map_service(struct rprocpub *rpub);
|
||||||
int pci_reserve_a(int devind, endpoint_t proc, struct rs_pci *aclp);
|
|
||||||
void pci_release(endpoint_t proc);
|
int _pci_reserve(int devind, endpoint_t proc, struct rs_pci *aclp);
|
||||||
int pci_first_dev_a(struct rs_pci *aclp, int *devindp, u16_t *vidp,
|
void _pci_release(endpoint_t proc);
|
||||||
|
|
||||||
|
int _pci_first_dev(struct rs_pci *aclp, int *devindp, u16_t *vidp,
|
||||||
u16_t *didp);
|
u16_t *didp);
|
||||||
int pci_next_dev_a(struct rs_pci *aclp, int *devindp, u16_t *vidp, u16_t
|
int _pci_next_dev(struct rs_pci *aclp, int *devindp, u16_t *vidp, u16_t
|
||||||
*didp);
|
*didp);
|
||||||
|
int _pci_find_dev(u8_t bus, u8_t dev, u8_t func, int *devindp);
|
||||||
|
|
||||||
int pci_attr_r8_s(int devind, int port, u8_t *vp);
|
void _pci_rescan_bus(u8_t busnr);
|
||||||
int pci_attr_r32_s(int devind, int port, u32_t *vp);
|
const char *_pci_dev_name(u16_t vid, u16_t did);
|
||||||
int pci_get_bar_s(int devind, int port, u32_t *base, u32_t *size, int
|
|
||||||
|
|
||||||
|
int _pci_get_bar(int devind, int port, u32_t *base, u32_t *size, int
|
||||||
*ioflag);
|
*ioflag);
|
||||||
int pci_slot_name_s(int devind, char **cpp);
|
int _pci_slot_name(int devind, char **cpp);
|
||||||
int pci_ids_s(int devind, u16_t *vidp, u16_t *didp);
|
int _pci_ids(int devind, u16_t *vidp, u16_t *didp);
|
||||||
|
|
||||||
/*
|
/* PCI Config Read functions */
|
||||||
* $PchId: pci.h,v 1.4 2001/12/06 20:21:22 philip Exp $
|
int _pci_attr_r8(int devind, int port, u8_t *vp);
|
||||||
*/
|
int _pci_attr_r16(int devind, int port, u16_t *vp);
|
||||||
|
int _pci_attr_r32(int devind, int port, u32_t *vp);
|
||||||
|
|
||||||
|
/* PCI Config Write functions */
|
||||||
|
int _pci_attr_w8(int devind, int port, u8_t value);
|
||||||
|
int _pci_attr_w16(int devind, int port, u16_t value);
|
||||||
|
int _pci_attr_w32(int devind, int port, u32_t value);
|
||||||
|
|
|
@ -14,10 +14,9 @@ See the Linux PCI ID Repository <http://pciids.sourceforge.net/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <minix/drivers.h>
|
#include <minix/drivers.h>
|
||||||
|
#include <minix/rs.h>
|
||||||
|
|
||||||
#include "pci.h"
|
#include "pci.h"
|
||||||
#if __minix_vmd
|
|
||||||
#include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct pci_vendor pci_vendor_table[]=
|
struct pci_vendor pci_vendor_table[]=
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue