summaryrefslogtreecommitdiff
path: root/sys/src/9/port
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2022-07-03 11:36:50 +0000
committercinap_lenrek <cinap_lenrek@felloff.net>2022-07-03 11:36:50 +0000
commit548a48d1561dd77dbc082dddf0f9a2776ee91914 (patch)
tree5d8df94bd49aa1d186b2a2e2cf97f79f757e148f /sys/src/9/port
parente39d9249076e9a95e97b33313be1ab2e23095f1d (diff)
imx8: pcie and nvme support
Diffstat (limited to 'sys/src/9/port')
-rw-r--r--sys/src/9/port/pci.c22
-rw-r--r--sys/src/9/port/pci.h1
2 files changed, 22 insertions, 1 deletions
diff --git a/sys/src/9/port/pci.c b/sys/src/9/port/pci.c
index 5ca42d5ac..da1541bce 100644
--- a/sys/src/9/port/pci.c
+++ b/sys/src/9/port/pci.c
@@ -16,6 +16,7 @@ struct Pcisiz
};
int pcimaxdno;
+Pcidev *pciparentdev;
static Lock pcicfglock;
static Pcidev *pcilist, **pcitail;
@@ -113,6 +114,8 @@ pcicfgr8(Pcidev* p, int rno)
int data;
ilock(&pcicfglock);
+ pciparentdev = p->parent;
+
data = pcicfgrw8(p->tbdf, rno, 0, 1);
iunlock(&pcicfglock);
@@ -122,6 +125,8 @@ void
pcicfgw8(Pcidev* p, int rno, int data)
{
ilock(&pcicfglock);
+ pciparentdev = p->parent;
+
pcicfgrw8(p->tbdf, rno, data, 0);
iunlock(&pcicfglock);
}
@@ -131,6 +136,8 @@ pcicfgr16(Pcidev* p, int rno)
int data;
ilock(&pcicfglock);
+ pciparentdev = p->parent;
+
data = pcicfgrw16(p->tbdf, rno, 0, 1);
iunlock(&pcicfglock);
@@ -140,6 +147,8 @@ void
pcicfgw16(Pcidev* p, int rno, int data)
{
ilock(&pcicfglock);
+ pciparentdev = p->parent;
+
pcicfgrw16(p->tbdf, rno, data, 0);
iunlock(&pcicfglock);
}
@@ -149,6 +158,8 @@ pcicfgr32(Pcidev* p, int rno)
int data;
ilock(&pcicfglock);
+ pciparentdev = p->parent;
+
data = pcicfgrw32(p->tbdf, rno, 0, 1);
iunlock(&pcicfglock);
@@ -158,6 +169,8 @@ void
pcicfgw32(Pcidev* p, int rno, int data)
{
ilock(&pcicfglock);
+ pciparentdev = p->parent;
+
pcicfgrw32(p->tbdf, rno, data, 0);
iunlock(&pcicfglock);
}
@@ -169,6 +182,7 @@ pcibarsize(Pcidev *p, int rno)
int v;
ilock(&pcicfglock);
+ pciparentdev = p->parent;
v = pcicfgrw32(p->tbdf, rno, 0, 1);
pcicfgrw32(p->tbdf, rno, -1, 0);
@@ -206,6 +220,8 @@ void
pcisetbar(Pcidev *p, int rno, uvlong bar)
{
ilock(&pcicfglock);
+ pciparentdev = p->parent;
+
pcicfgrw32(p->tbdf, rno, bar, 0);
if((bar&7) == 4 && rno >= PciBAR0 && rno < PciBAR0+4*(nelem(p->mem)-1))
pcicfgrw32(p->tbdf, rno+4, bar>>32, 0);
@@ -216,6 +232,8 @@ void
pcisetwin(Pcidev *p, uvlong base, uvlong limit)
{
ilock(&pcicfglock);
+ pciparentdev = p->parent;
+
if(base & 1){
pcicfgrw16(p->tbdf, PciIBR, (limit & 0xF000)|((base & 0xF000)>>8), 0);
pcicfgrw32(p->tbdf, PciIUBR, (limit & 0xFFFF0000)|(base>>16), 0);
@@ -534,12 +552,15 @@ pciscan(int bno, Pcidev** list, Pcidev *parent)
tbdf = MKBUS(BusPCI, bno, dno, fno);
lock(&pcicfglock);
+ pciparentdev = parent;
+
l = pcicfgrw32(tbdf, PciVID, 0, 1);
unlock(&pcicfglock);
if(l == 0xFFFFFFFF || l == 0)
continue;
p = pcidevalloc();
+ p->parent = parent;
p->tbdf = tbdf;
p->vid = l;
p->did = l>>16;
@@ -622,7 +643,6 @@ pciscan(int bno, Pcidev** list, Pcidev *parent)
break;
}
- p->parent = parent;
if(head != nil)
*tail = p;
else
diff --git a/sys/src/9/port/pci.h b/sys/src/9/port/pci.h
index 6119966b5..204f53c9a 100644
--- a/sys/src/9/port/pci.h
+++ b/sys/src/9/port/pci.h
@@ -223,6 +223,7 @@ enum
};
extern int pcimaxdno;
+extern Pcidev *pciparentdev;
extern void pcidevfree(Pcidev* pcidev);