diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2022-07-03 11:36:50 +0000 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2022-07-03 11:36:50 +0000 |
commit | 548a48d1561dd77dbc082dddf0f9a2776ee91914 (patch) | |
tree | 5d8df94bd49aa1d186b2a2e2cf97f79f757e148f /sys/src/9/port | |
parent | e39d9249076e9a95e97b33313be1ab2e23095f1d (diff) |
imx8: pcie and nvme support
Diffstat (limited to 'sys/src/9/port')
-rw-r--r-- | sys/src/9/port/pci.c | 22 | ||||
-rw-r--r-- | sys/src/9/port/pci.h | 1 |
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); |