| 4252 | UINT8 VenIDE[] = {0x86,0x80,0x00,0x00}; |
| 4253 | |
| 4254 | UINT32 FIXIDE (UINT8 *dsdt, UINT32 len) |
| 4255 | { |
| 4256 | UINT32 i, k; |
| 4257 | UINT32 j; |
| 4258 | UINT32 IDEADR = 0, BridgeSize = 0, Size; |
| 4259 | INT32 sizeoffset; |
| 4260 | AML_CHUNK *root; |
| 4261 | AML_CHUNK *device; |
| 4262 | CHAR8 *ide; |
| 4263 | BOOLEAN PATAFIX=TRUE; |
| 4264 | AML_CHUNK *met, *met2; |
| 4265 | AML_CHUNK *pack; |
| 4266 | AML_CHUNK *device1; |
| 4267 | AML_CHUNK *device2; |
| 4268 | |
| 4269 | |
| 4270 | if (!IDEADR1) return len; |
| 4271 | |
| 4272 | for (i=0x20; len >= 10 && i < len - 10; i++) { |
| 4273 | if (CmpAdr(dsdt, i, IDEADR1)) { |
| 4274 | DBG("Found IDEADR1=%X at %X\n", IDEADR1, i); |
| 4275 | IDEADR = devFind(dsdt, i); |
| 4276 | if (!IDEADR) { |
| 4277 | continue; |
| 4278 | } |
| 4279 | |
| 4280 | BridgeSize = get_size(dsdt, IDEADR); |
| 4281 | if (BridgeSize) break; |
| 4282 | } // End IDE |
| 4283 | } |
| 4284 | if (!BridgeSize) return len; |
| 4285 | DBG("Start IDE Fix\n"); |
| 4286 | // find Name(_ADR, Zero) if yes, don't need to inject PATA name |
| 4287 | for (j=IDEADR+9; j<IDEADR+BridgeSize; j++) |
| 4288 | { |
| 4289 | if (CmpAdr(dsdt, j, 0)) |
| 4290 | { |
| 4291 | PATAFIX = FALSE; |
| 4292 | break; |
| 4293 | } |
| 4294 | } |
| 4295 | |
| 4296 | if (IDEADR) { // bridge or device |
| 4297 | i = IDEADR; |
| 4298 | Size = get_size(dsdt, i); |
| 4299 | k = FindMethod(dsdt + i, Size, "_DSM"); |
| 4300 | if (k != 0) { |
| 4301 | k += i; |
| 4302 | Size = get_size(dsdt, k); |
| 4303 | sizeoffset = - 1 - Size; |
| 4304 | len = move_data(k - 1, dsdt, len, sizeoffset); |
| 4305 | len = CorrectOuters(dsdt, len, k - 2, sizeoffset); |
| 4306 | DBG("_DSM in IDE already exists, dropped\n"); |
| 4307 | } |
| 4308 | } |
| 4309 | |
| 4310 | |
| 4311 | root = aml_create_node(NULL); |
no test coverage detected