commit - 926b74e13774d63362001d959107557f48d3b217
commit + 5baff2808906de6d7d3ed0b3b370e5e15d3b00c7
blob - b05e33ba0744374aa3a5113154b4b8ca18435939
blob + 6238c527e6e771011eec122e97fe03490b8d52d7
--- alpha/main.c
+++ alpha/main.c
sysc.type = SYSC_NEW_THREAD;
sysc.new_thread.entry = entry;
- sysc.new_thread.memsize = PAGE_SIZE;
+ sysc.new_thread.memsize = PAGE_SIZE * 4;
sysc.new_thread.nseats = 1;
for (int i = 0; i < MAX_TASKS; i++) {
blob - b89597ddddc296a72309b7725c2e1e4c0e65861d
blob + 9f7cca2cfb0beb306bec088eec4730a5351ef79c
--- servers/xhci/main.c
+++ servers/xhci/main.c
// it can handle. The slot maximum can be changed at compile
// time by the end user.
+// There is 1 command ring per xhci controller
+
#include "types.h"
#include "libc.h"
#include "xhci.h"
+struct xhci_ctl {
+ u8 CAPLENGTH;
+ u16 HCIVERSION;
+ struct _HCSPARAMS1 {
+ u8 MaxSlots;
+ u16 MaxIntrs;
+ u8 MaxPorts;
+ } HCSPARAMS1;
+ struct _HCSPARAMS2 {
+ u8 IST;
+ u8 ERST_Max;
+ u8 Max_Scratchpad_Bufs_Hi;
+ u8 SPR;
+ u8 Max_Scratchpad_Bufs_Lo;
+ } HCSPARAMS2;
+ struct _HCSPARAMS3 {
+ u8 U1_Device_Exit_Latency;
+ u16 U2_Device_Exit_Latency;
+ } HCSPARAMS3;
+ struct _HCCPARAMS1 {
+ u8 AC64;
+ u8 BNC;
+ u8 CSZ;
+ u8 PPC;
+ u8 PIND;
+ u8 LHRC;
+ u8 LTC;
+ u8 NSS;
+ u8 PAE;
+ u8 SPC;
+ u8 SEC;
+ u8 CFC;
+ u8 MaxPSASize;
+ u16 xECP;
+ } HCCPARAMS1;
+ u32 DBOFF;
+ u32 RTSOFF;
+ struct _HCCPARAMS2 {
+ u8 U3C;
+ u8 CMC;
+ u8 FSC;
+ u8 CTC;
+ u8 LEC;
+ u8 CIC;
+ u8 ETC;
+ u8 ETC_TSC;
+ u8 GSC;
+ u8 VTC;
+ } HCCPARAMS2;
+};
+
+void setup_ctl(struct xhci_ctl *, u64);
+
void
xhci_main(struct contract *con)
{
struct shared_buffer *sbuf;
+ struct xhci_ctl ctl;
struct xhcip *xhcip;
u64 xhcibar;
output("xhci: running\n");
output("xhci: listening\n");
listen(con->sharedBlocks[0]);
- yield();
-
sbuf = (struct shared_buffer *)con->sharedBlocks[0];
+
+ // Waiting for a write
+ while (sbuf->busy == 0)
+ yield();
+
xhcip = (struct xhcip *)sbuf->data;
output("xhci: bar address is "); outputh(xhcip->address); output("\n");
+ setup_ctl(&ctl, xhcip->address);
- volatile u32 *xhci_base = (volatile u32 *)xhcip->address;
- u32 cap_reg = xhci_base[0];
- u8 cap_len = cap_reg & 0xff;
- u16 hci_version = (cap_reg >> 16) & 0xffff;
- output("xhci version: "); outputh(hci_version); output("\n");
-
for (;;);
}
+
+void
+setup_ctl(struct xhci_ctl *ctl, u64 bar)
+{
+ u32 *base = (u32 *)bar;
+
+ ctl->CAPLENGTH = base[0] & 0xff;
+ ctl->HCIVERSION = base[0] >> 16;
+
+ ctl->HCSPARAMS1.MaxSlots = base[1] & 0xff;
+ ctl->HCSPARAMS1.MaxIntrs = (base[1] >> 8) & 0x7ff;
+ ctl->HCSPARAMS1.MaxPorts = (base[1] >> 24);
+
+ ctl->HCSPARAMS2.IST = (base[2] & 0xf);
+ ctl->HCSPARAMS2.ERST_Max = (base[2] >> 0x4) & 0xf;
+ ctl->HCSPARAMS2.Max_Scratchpad_Bufs_Hi = (base[2] >> 27) & 0x1f;
+ ctl->HCSPARAMS2.SPR = (base[2] >> 26) & 0x1;
+ ctl->HCSPARAMS2.Max_Scratchpad_Bufs_Lo = (base[2] >> 21) & 0x1f;
+
+ ctl->HCSPARAMS3.U1_Device_Exit_Latency = base[3] & 0xff;
+ ctl->HCSPARAMS3.U2_Device_Exit_Latency = (base[3] >> 16) & 0xffff;
+
+ ctl->HCCPARAMS1.AC64 = base[4] & 0x1;
+ ctl->HCCPARAMS1.BNC = (base[4] >> 1) & 0x1;
+ ctl->HCCPARAMS1.CSZ = (base[4] >> 2) & 0x1;
+ ctl->HCCPARAMS1.PPC = (base[4] >> 3) & 0x1;
+ ctl->HCCPARAMS1.PIND = (base[4] >> 4) & 0x1;
+ ctl->HCCPARAMS1.LHRC = (base[4] >> 5) & 0x1;
+ ctl->HCCPARAMS1.LTC = (base[4] >> 6) & 0x1;
+ ctl->HCCPARAMS1.NSS = (base[4] >> 7) & 0x1;
+ ctl->HCCPARAMS1.PAE = (base[4] >> 8) & 0x1;
+ ctl->HCCPARAMS1.SPC = (base[4] >> 9) & 0x1;
+ ctl->HCCPARAMS1.SEC = (base[4] >> 10) & 0x1;
+ ctl->HCCPARAMS1.CFC = (base[4] >> 11) & 0x1;
+ ctl->HCCPARAMS1.MaxPSASize = (base[4] >> 12) & 0xf;
+ ctl->HCCPARAMS1.xECP = (base[4] >> 16) & 0xffff;
+
+ ctl->DBOFF = base[5];
+ ctl->RTSOFF = base[6];
+
+ ctl->HCCPARAMS2.U3C = base[7] & 0x1;
+ ctl->HCCPARAMS2.CMC = (base[7] >> 1) & 0x1;
+ ctl->HCCPARAMS2.FSC = (base[7] >> 2) & 0x1;
+ ctl->HCCPARAMS2.CTC = (base[7] >> 3) & 0x1;
+ ctl->HCCPARAMS2.LEC = (base[7] >> 4) & 0x1;
+ ctl->HCCPARAMS2.CIC = (base[7] >> 5) & 0x1;
+ ctl->HCCPARAMS2.ETC = (base[7] >> 6) & 0x1;
+ ctl->HCCPARAMS2.ETC_TSC = (base[7] >> 7) & 0x1;
+ ctl->HCCPARAMS2.GSC = (base[7] >> 8) & 0x1;
+ ctl->HCCPARAMS2.VTC = (base[7] >> 9) & 0x1;
+
+ output("xhci setup: version ");
+ outputh(ctl->HCIVERSION);
+ output("\n");
+}