From da5d6db6f5bbe2b68288b22dd9b0d4dfa69163db Mon Sep 17 00:00:00 2001 From: aiju Date: Tue, 17 May 2011 16:51:30 +0000 Subject: [PATCH 1/3] added support for 32 bit MSI --- sys/src/9/pc/mp.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/sys/src/9/pc/mp.c b/sys/src/9/pc/mp.c index b74fa1250..f3ca3067f 100644 --- a/sys/src/9/pc/mp.c +++ b/sys/src/9/pc/mp.c @@ -883,13 +883,14 @@ mpintrenablex(Vctl* v, int tbdf) enum { MSICtrl = 0x02, /* message control register (16 bit) */ MSIAddr = 0x04, /* message address register (64 bit) */ - MSIData = 0x0C, /* message data register (16 bit) */ + MSIData32 = 0x08, /* message data register for 32 bit MSI (16 bit) */ + MSIData64 = 0x0C, /* message data register for 64 bit MSI (16 bit) */ }; static int msiintrenable(Vctl *v) { - int tbdf, vno, cap, cpu; + int tbdf, vno, cap, cpu, ok64; Pcidev *pci; if(getconf("*msi") == nil) @@ -913,9 +914,10 @@ msiintrenable(Vctl *v) vno = allocvector(); cpu = mpintrcpu(); + ok64 = (pcicfgr16(pci, cap + MSICtrl) & (1<<7)) != 0; pcicfgw32(pci, cap + MSIAddr, (0xFEE << 20) | (cpu << 12)); - pcicfgw32(pci, cap + MSIAddr + 4, 0); - pcicfgw16(pci, cap + MSIData, vno | (1<<14)); + if(ok64) pcicfgw32(pci, cap + MSIAddr + 4, 0); + pcicfgw16(pci, cap + ok64 ? MSIData64 : MSIData32, vno | (1<<14)); pcicfgw16(pci, cap + MSICtrl, 1); print("msiintrenable: success with tbdf %.8x, vector %d, cpu %d\n", tbdf, vno, cpu); v->isr = lapicisr; From 9c9710c8dd7277bb0df1b8f0ba023d1f2163cb26 Mon Sep 17 00:00:00 2001 From: aiju Date: Tue, 17 May 2011 16:52:25 +0000 Subject: [PATCH 2/3] added tput(1) --- sys/src/cmd/tput.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 sys/src/cmd/tput.c diff --git a/sys/src/cmd/tput.c b/sys/src/cmd/tput.c new file mode 100644 index 000000000..47ef99b89 --- /dev/null +++ b/sys/src/cmd/tput.c @@ -0,0 +1,42 @@ +#include +#include + +enum {buflen = 4096}; + +void +main(int argc, char **argv) +{ + int rc, cpid, fd, dopipe; + static char buf[buflen]; + static uvlong bc, sec; + double speed; + + dopipe = 0; + ARGBEGIN { + case 'p': dopipe = 1; + } ARGEND + + bc = 0; + sec = 0; + cpid = rfork(RFPROC | RFMEM); + if(cpid == 0) { + while(1) { + sleep(1000); + speed = bc / ++sec; + if(speed >= 1073741824) fprint(2, "%.2f GB/s\n", speed / 1073741824); + else if(speed >= 1048576) fprint(2, "%.2f MB/s\n", speed / 1048576); + else if(speed >= 1024) fprint(2, "%.2f KB/s\n", speed / 1024); + else fprint(2, "%.2f B/s\n", speed); + } + } + while(1) { + rc = read(0, buf, buflen); + if(rc <= 0) break; + if(dopipe) write(1, buf, rc); + bc += rc; + } + sprint(buf, "/proc/%d/note", cpid); + fd = open(buf, OWRITE); + write(fd, "kill", 4); + if(rc < 0) sysfatal("%r"); +} From 61660acf68c41098fda04f8f761e038148c4115e Mon Sep 17 00:00:00 2001 From: aiju Date: Thu, 19 May 2011 04:56:01 +0000 Subject: [PATCH 3/3] fixed stupid bug in msi code --- sys/src/9/pc/mp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/src/9/pc/mp.c b/sys/src/9/pc/mp.c index f3ca3067f..e8316ac74 100644 --- a/sys/src/9/pc/mp.c +++ b/sys/src/9/pc/mp.c @@ -917,7 +917,7 @@ msiintrenable(Vctl *v) ok64 = (pcicfgr16(pci, cap + MSICtrl) & (1<<7)) != 0; pcicfgw32(pci, cap + MSIAddr, (0xFEE << 20) | (cpu << 12)); if(ok64) pcicfgw32(pci, cap + MSIAddr + 4, 0); - pcicfgw16(pci, cap + ok64 ? MSIData64 : MSIData32, vno | (1<<14)); + pcicfgw16(pci, cap + (ok64 ? MSIData64 : MSIData32), vno | (1<<14)); pcicfgw16(pci, cap + MSICtrl, 1); print("msiintrenable: success with tbdf %.8x, vector %d, cpu %d\n", tbdf, vno, cpu); v->isr = lapicisr;