__osDevMgrMain.c (6859B)
1 #include "libultra_internal.h" 2 #include "macros.h" 3 #include "PR/os.h" 4 5 #if defined(VERSION_EU) || defined(VERSION_SH) || defined(VERSION_CN) 6 #include "new_func.h" 7 #include "PR/rcp.h" 8 #include "PR/ique.h" 9 10 #define ALIGN16(val) (((val) + 0xF) & ~0xF) 11 12 void __osDevMgrMain(void *args) { 13 #ifdef VERSION_CN 14 s32 loadedToTempBuffer = FALSE; 15 #endif 16 OSIoMesg *mb; 17 OSMesg em; 18 OSMesg dummy; 19 s32 ret; 20 OSMgrArgs *sp34; 21 #ifdef VERSION_EU 22 UNUSED u32 sp30; 23 #endif 24 u32 sp2c; 25 __OSBlockInfo *sp28; 26 __OSTranxInfo *sp24; 27 #if defined(VERSION_SH) || defined(VERSION_CN) 28 u32 tmp; 29 #endif 30 #ifdef VERSION_EU 31 sp30 = 0; 32 #endif 33 sp2c = 0; 34 mb = NULL; 35 ret = 0; 36 sp34 = (OSMgrArgs *) args; 37 while (TRUE) { 38 osRecvMesg(sp34->cmdQueue, (OSMesg) &mb, OS_MESG_BLOCK); 39 if (mb->piHandle != NULL && mb->piHandle->type == 2 40 && (mb->piHandle->transferInfo.cmdType == 0 41 || mb->piHandle->transferInfo.cmdType == 1)) { 42 sp24 = &mb->piHandle->transferInfo; 43 sp28 = &sp24->block[sp24->blockNum]; 44 sp24->sectorNum = -1; 45 if (sp24->transferMode != 3) { 46 sp28->dramAddr = (void *) ((u32) sp28->dramAddr - sp28->sectorSize); 47 } 48 if (sp24->transferMode == 2 && mb->piHandle->transferInfo.cmdType == 0) { 49 sp2c = 1; 50 } else { 51 sp2c = 0; 52 } 53 osRecvMesg(sp34->accessQueue, &dummy, OS_MESG_BLOCK); 54 __osResetGlobalIntMask(OS_IM_PI); 55 osEPiRawWriteIo(mb->piHandle, 0x05000510, (sp24->bmCtlShadow | 0x80000000)); 56 l1: 57 osRecvMesg(sp34->eventQueue, &em, OS_MESG_BLOCK); 58 #if defined(VERSION_SH) || defined(VERSION_CN) 59 sp24 = &mb->piHandle->transferInfo; 60 sp28 = &sp24->block[sp24->blockNum]; 61 if (sp28->errStatus == 0x1D) { 62 osEPiRawWriteIo(mb->piHandle, 0x5000510, sp24->bmCtlShadow | 0x10000000); 63 osEPiRawWriteIo(mb->piHandle, 0x5000510, sp24->bmCtlShadow); 64 osEPiRawReadIo(mb->piHandle, 0x5000508, &tmp); 65 if ((tmp & 0x2000000) != 0) { 66 osEPiRawWriteIo(mb->piHandle, 0x5000510, sp24->bmCtlShadow | 0x1000000); 67 } 68 sp28->errStatus = 4; 69 IO_WRITE(PI_STATUS_REG, PI_STATUS_CLR_INTR); 70 __osSetGlobalIntMask(0x100C01); 71 } 72 73 osSendMesg(mb->hdr.retQueue, mb, OS_MESG_NOBLOCK); 74 75 if (sp2c == 1 && mb->piHandle->transferInfo.block[0].errStatus == 0) { 76 sp2c = 0; 77 goto l1; 78 } 79 #else 80 sp30 = osSendMesg(mb->hdr.retQueue, mb, OS_MESG_NOBLOCK); 81 82 if (sp2c == 1 && mb->piHandle->transferInfo.errStatus == 0) { 83 sp2c = 0; 84 goto l1; 85 } 86 #endif 87 osSendMesg(sp34->accessQueue, NULL, OS_MESG_NOBLOCK); 88 89 if (mb->piHandle->transferInfo.blockNum == 1) { 90 osYieldThread(); 91 } 92 } else { 93 switch (mb->hdr.type) { 94 case 11: 95 osRecvMesg(sp34->accessQueue, &dummy, OS_MESG_BLOCK); 96 #ifdef VERSION_CN 97 if (__osBbIsBb == 1 && ((uintptr_t) mb->dramAddr & 0x7f) >= 0x60) { 98 loadedToTempBuffer = TRUE; 99 ret = sp34->dma_func(OS_READ, mb->devAddr, (void *) 0x80600000, mb->size); 100 } else 101 #endif 102 ret = sp34->dma_func(OS_READ, mb->devAddr, mb->dramAddr, mb->size); 103 break; 104 case 12: 105 osRecvMesg(sp34->accessQueue, &dummy, OS_MESG_BLOCK); 106 ret = sp34->dma_func(OS_WRITE, mb->devAddr, mb->dramAddr, mb->size); 107 break; 108 case 15: 109 osRecvMesg(sp34->accessQueue, &dummy, OS_MESG_BLOCK); 110 #ifdef VERSION_CN 111 if (__osBbIsBb == 1 && ((uintptr_t) mb->dramAddr & 0x7f) >= 0x60) { 112 loadedToTempBuffer = TRUE; 113 ret = sp34->edma_func(mb->piHandle, OS_READ, mb->devAddr, (void *) 0x80600000, 114 mb->size); 115 } else 116 #endif 117 ret = sp34->edma_func(mb->piHandle, OS_READ, mb->devAddr, mb->dramAddr, 118 mb->size); 119 break; 120 case 16: 121 osRecvMesg(sp34->accessQueue, &dummy, OS_MESG_BLOCK); 122 ret = sp34->edma_func(mb->piHandle, OS_WRITE, mb->devAddr, mb->dramAddr, 123 mb->size); 124 break; 125 case 10: 126 osSendMesg(mb->hdr.retQueue, mb, OS_MESG_NOBLOCK); 127 ret = -1; 128 break; 129 break; 130 default: 131 ret = -1; 132 break; 133 } 134 if (ret == 0) { 135 osRecvMesg(sp34->eventQueue, &em, OS_MESG_BLOCK); 136 #ifdef VERSION_CN 137 if (__osBbIsBb == 1 && loadedToTempBuffer) { 138 osInvalDCache((void *) 0x80600000, ALIGN16(mb->size)); 139 bcopy((void *) 0x80600000, mb->dramAddr, mb->size); 140 osWritebackDCache(mb->dramAddr, mb->size); 141 loadedToTempBuffer = FALSE; 142 } 143 #endif 144 #ifdef VERSION_EU 145 sp30 = 146 #endif 147 osSendMesg(mb->hdr.retQueue, mb, OS_MESG_NOBLOCK); 148 osSendMesg(sp34->accessQueue, NULL, OS_MESG_NOBLOCK); 149 } 150 } 151 } 152 } 153 #else 154 void __osDevMgrMain(void *args) { 155 OSIoMesg *sp34; 156 OSMesg sp30; 157 OSMesg sp2c; 158 s32 sp28; 159 OSMgrArgs *sp24; 160 sp34 = NULL; 161 sp28 = 0; 162 sp24 = (OSMgrArgs *) args; 163 while (TRUE) { 164 osRecvMesg(sp24->cmdQueue, (OSMesg) &sp34, OS_MESG_BLOCK); 165 switch (sp34->hdr.type) { 166 case 11: 167 osRecvMesg(sp24->accessQueue, &sp2c, OS_MESG_BLOCK); 168 sp28 = sp24->dma_func(OS_READ, sp34->devAddr, sp34->dramAddr, sp34->size); 169 break; 170 case 12: 171 osRecvMesg(sp24->accessQueue, &sp2c, OS_MESG_BLOCK); 172 sp28 = sp24->dma_func(OS_WRITE, sp34->devAddr, sp34->dramAddr, sp34->size); 173 break; 174 case 10: 175 osSendMesg(sp34->hdr.retQueue, sp34, OS_MESG_NOBLOCK); 176 sp28 = -1; 177 break; 178 default: 179 sp28 = -1; 180 break; 181 } 182 if (sp28 == 0) { 183 osRecvMesg(sp24->eventQueue, &sp30, OS_MESG_BLOCK); 184 osSendMesg(sp34->hdr.retQueue, sp34, OS_MESG_NOBLOCK); 185 osSendMesg(sp24->accessQueue, NULL, OS_MESG_NOBLOCK); 186 } 187 } 188 } 189 #endif