[ES40-developers] Patch: USB BAR support
Status: Alpha
Brought to you by:
iamcamiel
From: Brian W. <bdw...@in...> - 2008-02-18 14:48:03
|
Beats me if it actually does what its supposed to, but linux and tru64 boot past the USB check point without crashing es40 :) Brian Index: AliM1543C_usb.cpp =================================================================== RCS file: /cvsroot/es40/es40/src/AliM1543C_usb.cpp,v retrieving revision 1.3 diff -u -r1.3 AliM1543C_usb.cpp --- AliM1543C_usb.cpp 30 Dec 2007 15:10:22 -0000 1.3 +++ AliM1543C_usb.cpp 18 Feb 2008 14:34:45 -0000 @@ -97,6 +97,12 @@ ResetPCI(); + state.usb_data[0x34/4] = 0x2edf; + state.usb_data[0x48/4] = 0x01000003; + + + + printf("%s: $Id: AliM1543C_usb.cpp,v 1.3 2007/12/30 15:10:22 iamcamiel Exp $\n",devid_string); } @@ -188,3 +194,111 @@ printf("%s: %d bytes restored.\n",devid_string,ss); return 0; } + +u32 CAliM1543C_usb::ReadMem_Bar(int func,int bar, u32 address, int dsize) { + u32 data = 0; + switch(bar) { + case 0: + data = usb_hci_read(address,dsize); + break; + default: + printf("%%USB-W-READBAR: Bad BAR %d selected.\n",bar); + } + return data; +} + + +void CAliM1543C_usb::WriteMem_Bar(int func,int bar, u32 address, int dsize, u32 data) { + switch(bar) { + case 0: + usb_hci_write(address,dsize,data); + break; + default: + printf("%%USB-W-WRITEBAR: Bad BAR %d selected.\n",bar); + } + return; +} + + +u64 CAliM1543C_usb::usb_hci_read(u64 address, int dsize) { + u64 data = 0; + if(dsize != 32) + printf("%%USB-W-HCIREAD: Non dword read, returning 32 bits anyway.\n"); + switch(address) { + case 0: // HcRevision + data = 0x00000110; + break; + case 4: // HcControl + case 8: // HcCommandStatus + case 0x0c: // HcInterruptStatus + case 0x10: // HcInterrupt Enable + case 0x14: // HcInterruptDisable + case 0x18: // HcHCCA (datasheet says 0x17, but that's wrong) + case 0x1c: // HcPeriodCurrentED + case 0x20: // HcControlHeadED + case 0x24: // HcControlCurrentED + case 0x28: // HcBulkHeadED + case 0x2c: // HcBulkCurrentED + case 0x30: // HcDoneHead + case 0x34: // HcFmInterval + case 0x38: // HcFrameRemaining + case 0x3c: // HcFmNumber + case 0x40: // HcPeriodicStart + case 0x44: // HcLSThreshold + case 0x48: // HcRhDescriptorA + case 0x4c: // HcRhDescriptorB + case 0x50: // HcRhStatus + case 0x54: // HcRhPortStatus1 + case 0x58: // HcRhPortStatus1 + case 0x5c: // HcRhPortStatus1 + case 0x100: // HceControlRegister + case 0x104: // HceInputRegister + case 0x108: // HceOutputRegister + case 0x10c: // HceStatusRegister + data=state.usb_data[address/4]; + break; + + default: + printf("%%USB-W-HCIREAD: Reading from unknown address %x. Ignoring.\n",address); + } + return data; +} + + +void CAliM1543C_usb::usb_hci_write(u64 address, int dsize, u64 data) { + if(dsize != 32) + printf("%%USB-W-HCIWRITE: Non dword write, writing 32 bits anyway.\n"); + switch(address) { + case 4: // HcControl + case 8: // HcCommandStatus + case 0x0c: // HcInterruptStatus + case 0x10: // HcInterrupt Enable + case 0x14: // HcInterruptDisable + case 0x18: // HcHCCA (datasheet says 0x17, but that's wrong) + case 0x1c: // HcPeriodCurrentED + case 0x20: // HcControlHeadED + case 0x24: // HcControlCurrentED + case 0x28: // HcBulkHeadED + case 0x2c: // HcBulkCurrentED + case 0x30: // HcDoneHead + case 0x34: // HcFmInterval + case 0x38: // HcFrameRemaining + case 0x3c: // HcFmNumber + case 0x40: // HcPeriodicStart + case 0x44: // HcLSThreshold + case 0x48: // HcRhDescriptorA + case 0x4c: // HcRhDescriptorB + case 0x50: // HcRhStatus + case 0x54: // HcRhPortStatus1 + case 0x58: // HcRhPortStatus1 + case 0x5c: // HcRhPortStatus1 + case 0x100: // HceControlRegister + case 0x104: // HceInputRegister + case 0x108: // HceOutputRegister + case 0x10c: // HceStatusRegister + state.usb_data[address/4]=data; + break; + default: + printf("%%USB-W-HCIWRITE: Writing to unknown address %x. Ignoring.\n",address); + } +} cvs diff: I know nothing about AliM1543C_usb.cpp.~1.3.~ Index: AliM1543C_usb.h =================================================================== RCS file: /cvsroot/es40/es40/src/AliM1543C_usb.h,v retrieving revision 1.4 diff -u -r1.4 AliM1543C_usb.h --- AliM1543C_usb.h 8 Jan 2008 16:38:09 -0000 1.4 +++ AliM1543C_usb.h 18 Feb 2008 14:34:45 -0000 @@ -68,13 +68,21 @@ CAliM1543C_usb(CConfigurator * cfg, class CSystem * c, int pcibus, int pcidev); virtual ~CAliM1543C_usb(); + virtual void WriteMem_Bar(int func,int bar, u32 address, int dsize, u32 data); + virtual u32 ReadMem_Bar(int func,int bar, u32 address, int dsize); + private: u64 usb_config_read(u64 address, int dsize); void usb_config_write(u64 address, int dsize, u64 data); + u64 usb_hci_read(u64 address, int dsize); + void usb_hci_write(u64 address, int dsize, u64 data); + + /// The state structure contains all elements that need to be saved to the statefile. struct SUSB_state { + u32 usb_data[0x110/4]; } state; }; |