ReactOS  0.4.14-dev-838-g99f979d
xboxdisk.c
Go to the documentation of this file.
1 /*
2  * PROJECT: FreeLoader
3  * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
4  * PURPOSE: Xbox specific disk access routines
5  * COPYRIGHT: Copyright 2004 Gé van Geldorp (gvg@reactos.com)
6  * Copyright 2019 Dmitry Borisov (di.sean@protonmail.com)
7  */
8 
9 /* INCLUDES *******************************************************************/
10 
11 #include <freeldr.h>
12 #include <hwide.h>
13 
14 #include <debug.h>
16 
17 /* GLOBALS ********************************************************************/
18 
22 
23 /* FUNCTIONS ******************************************************************/
24 
25 VOID
27 {
28  UCHAR DetectedCount;
29  UCHAR UnitNumber;
30  PDEVICE_UNIT DeviceUnit = NULL;
31 
32  if (Init & !AtaInitialized)
33  {
34  /* Find first HDD and CD */
35  AtaInit(&DetectedCount);
36  for (UnitNumber = 0; UnitNumber <= DetectedCount; UnitNumber++)
37  {
38  DeviceUnit = AtaGetDevice(UnitNumber);
39  if (DeviceUnit)
40  {
41  if (DeviceUnit->Flags & ATA_DEVICE_ATAPI)
42  {
43  if (!CdDrive)
44  CdDrive = DeviceUnit;
45  }
46  else
47  {
48  if (!HardDrive)
49  HardDrive = DeviceUnit;
50  }
51  }
52  }
54  }
55  else
56  {
57  AtaFree();
58  }
59 }
60 
61 static inline
64 {
65  /* Xbox has only 1 IDE controller and no floppy */
66  if (DriveNumber < 0x80 || (DriveNumber & 0x0F) >= 2)
67  return NULL;
68 
69  if (!AtaInitialized)
71 
72  /* HDD */
73  if ((DriveNumber == 0x80) && HardDrive)
74  return HardDrive;
75 
76  /* CD */
77  if (((DriveNumber & 0xF0) > 0x80) && CdDrive)
78  return CdDrive;
79 
80  return NULL;
81 }
82 
83 BOOLEAN
85  IN UCHAR DriveNumber,
86  IN ULONGLONG SectorNumber,
89 {
90  PDEVICE_UNIT DeviceUnit;
91 
92  TRACE("XboxDiskReadLogicalSectors() DriveNumber: 0x%x SectorNumber: %I64d SectorCount: %d Buffer: 0x%x\n",
93  DriveNumber, SectorNumber, SectorCount, Buffer);
94 
95  DeviceUnit = XboxDiskDriveNumberToDeviceUnit(DriveNumber);
96  if (!DeviceUnit)
97  return FALSE;
98 
99  return AtaAtapiReadLogicalSectorsLBA(DeviceUnit, SectorNumber, SectorCount, Buffer);
100 }
101 
102 BOOLEAN
104 {
105  PDEVICE_UNIT DeviceUnit;
106 
107  TRACE("XboxDiskGetDriveGeometry(0x%x)\n", DriveNumber);
108 
109  DeviceUnit = XboxDiskDriveNumberToDeviceUnit(DriveNumber);
110  if (!DeviceUnit)
111  return FALSE;
112 
113  Geometry->Cylinders = DeviceUnit->Cylinders;
114  Geometry->Heads = DeviceUnit->Heads;
115  Geometry->Sectors = DeviceUnit->Sectors;
116  Geometry->BytesPerSector = DeviceUnit->SectorSize;
117 
118  return TRUE;
119 }
120 
121 ULONG
123 {
124  PDEVICE_UNIT DeviceUnit;
125 
126  DeviceUnit = XboxDiskDriveNumberToDeviceUnit(DriveNumber);
127  if (!DeviceUnit)
128  return 1; // Unknown count.
129 
130  /*
131  * If LBA is supported then the block size will be 64 sectors (32k).
132  * If not then the block size is the size of one track.
133  */
134  if (DeviceUnit->Flags & ATA_DEVICE_LBA)
135  return 64;
136  else
137  return DeviceUnit->Sectors;
138 }
139 
140 /* EOF */
ULONG Cylinders
Definition: hwide.h:296
#define IN
Definition: typedefs.h:38
#define TRUE
Definition: types.h:120
VOID AtaFree(VOID)
Definition: hwide.c:140
ULONG Cylinders
Definition: disk.h:26
BOOLEAN AtaInit(OUT PUCHAR DetectedCount)
Definition: hwide.c:113
#define ATA_DEVICE_LBA
Definition: hwide.h:309
ULONG SectorSize
Definition: hwide.h:299
ULONG Heads
Definition: hwide.h:297
static BOOLEAN AtaInitialized
Definition: xboxdisk.c:21
static PDEVICE_UNIT CdDrive
Definition: xboxdisk.c:20
ULONG Sectors
Definition: hwide.h:298
BOOLEAN XboxDiskReadLogicalSectors(IN UCHAR DriveNumber, IN ULONGLONG SectorNumber, IN ULONG SectorCount, OUT PVOID Buffer)
Definition: xboxdisk.c:84
static PDEVICE_UNIT XboxDiskDriveNumberToDeviceUnit(UCHAR DriveNumber)
Definition: xboxdisk.c:63
unsigned char BOOLEAN
smooth NULL
Definition: ftsmooth.c:416
BOOLEAN AtaAtapiReadLogicalSectorsLBA(IN OUT PDEVICE_UNIT DeviceUnit, IN ULONGLONG SectorNumber, IN ULONG SectorCount, OUT PVOID Buffer)
Definition: hwide.c:161
Definition: bufpool.h:45
ULONG Sectors
Definition: disk.h:28
#define TRACE(s)
Definition: solgame.cpp:4
uint64_t ULONGLONG
Definition: typedefs.h:65
USHORT Flags
Definition: hwide.h:301
DBG_DEFAULT_CHANNEL(DISK)
unsigned char UCHAR
Definition: xmlstorage.h:181
ULONG SectorCount
Definition: part_xbox.c:31
BOOLEAN XboxDiskGetDriveGeometry(UCHAR DriveNumber, PGEOMETRY Geometry)
Definition: xboxdisk.c:103
#define ATA_DEVICE_ATAPI
Definition: hwide.h:305
ULONG BytesPerSector
Definition: disk.h:29
Definition: disk.h:24
PDEVICE_UNIT AtaGetDevice(IN UCHAR UnitNumber)
Definition: hwide.c:152
#define OUT
Definition: typedefs.h:39
unsigned int ULONG
Definition: retypes.h:1
static PDEVICE_UNIT HardDrive
Definition: xboxdisk.c:19
VOID XboxDiskInit(BOOLEAN Init)
Definition: xboxdisk.c:26
ULONG XboxDiskGetCacheableBlockCount(UCHAR DriveNumber)
Definition: xboxdisk.c:122
ULONG Heads
Definition: disk.h:27