ReactOS 0.4.16-dev-2633-g8dc9e50
ati.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS ATA Bus Driver
3 * LICENSE: BSD-2-Clause (https://spdx.org/licenses/BSD-2-Clause)
4 * PURPOSE: ATI ATA controller minidriver
5 * COPYRIGHT: Copyright 2026 Dmitry Borisov <di.sean@protonmail.com>
6 */
7
8/*
9 * Adapted from the FreeBSD ata-ati driver
10 * Copyright (c) 1998-2008 Søren Schmidt <sos@FreeBSD.org>
11 */
12
13/* INCLUDES *******************************************************************/
14
15#include "pciidex.h"
16
17/* GLOBALS ********************************************************************/
18
19#define PCI_DEV_IXP200_IDE 0x4349
20#define PCI_DEV_IXP300_IDE 0x4369
21#define PCI_DEV_IXP400_IDE 0x4376
22#define PCI_DEV_IXP600_IDE 0x438C
23#define PCI_DEV_IXP700_IDE 0x439C
24
27{
28 { 0x48, 0x01, 0x00 },
29 { 0x48, 0x08, 0x00 },
30};
31
32/* FUNCTIONS ******************************************************************/
33
34CODE_SEG("PAGE")
37 _Inout_ PATA_CONTROLLER Controller)
38{
40 ULONG i;
41
42 PAGED_CODE();
43 ASSERT(Controller->Pci.VendorID == PCI_VEN_ATI);
44
45 if (Controller->Pci.DeviceID != PCI_DEV_IXP200_IDE &&
46 Controller->Pci.DeviceID != PCI_DEV_IXP300_IDE &&
47 Controller->Pci.DeviceID != PCI_DEV_IXP400_IDE &&
48 Controller->Pci.DeviceID != PCI_DEV_IXP600_IDE &&
49 Controller->Pci.DeviceID != PCI_DEV_IXP700_IDE)
50 {
51 return STATUS_NO_MATCH;
52 }
53
54 Controller->ChannelEnableBits = AtiEnableBits;
55
56 if (Controller->Pci.DeviceID == PCI_DEV_IXP600_IDE)
57 Controller->MaxChannels = 1;
58
59 Status = PciIdeCreateChannelData(Controller, 0);
60 if (!NT_SUCCESS(Status))
61 return Status;
62
63 for (i = 0; i < Controller->MaxChannels; ++i)
64 {
65 PCHANNEL_DATA_PATA ChanData = Controller->Channels[i];
66
67 ChanData->SetTransferMode = SvwSetTransferMode;
68 ChanData->TransferModeSupported = PIO_ALL | MWDMA_ALL | UDMA_MODES(0, 5);
69
70 if (Controller->Pci.DeviceID == PCI_DEV_IXP200_IDE)
71 ChanData->TransferModeSupported &= ~UDMA_MODE5;
72
73 if (!SvwHasUdmaCable(Controller, i))
74 {
75 INFO("CH %lu: BIOS hasn't selected mode faster than UDMA 2, "
76 "assume 40-conductor cable\n",
77 ChanData->Channel);
78 ChanData->TransferModeSupported &= ~UDMA_80C_ALL;
79 }
80 }
81
82 return STATUS_SUCCESS;
83}
#define PAGED_CODE()
#define CODE_SEG(...)
#define MWDMA_ALL
Definition: ata_user.h:27
#define PIO_ALL
Definition: ata_user.h:19
static PCIIDEX_PAGED_DATA const ATA_PCI_ENABLE_BITS AtiEnableBits[MAX_IDE_CHANNEL]
Definition: ati.c:26
#define PCI_DEV_IXP200_IDE
Definition: ati.c:19
#define PCI_DEV_IXP700_IDE
Definition: ati.c:23
#define PCI_DEV_IXP600_IDE
Definition: ati.c:22
#define PCI_DEV_IXP400_IDE
Definition: ati.c:21
#define PCI_DEV_IXP300_IDE
Definition: ati.c:20
NTSTATUS AtiGetControllerProperties(_Inout_ PATA_CONTROLLER Controller)
Definition: ati.c:36
LONG NTSTATUS
Definition: precomp.h:26
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define INFO
Definition: debug.h:89
Status
Definition: gdiplustypes.h:25
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define MAX_IDE_CHANNEL
Definition: ide.h:30
#define ASSERT(a)
Definition: mode.c:44
#define _Inout_
Definition: no_sal2.h:162
#define STATUS_NO_MATCH
Definition: ntstatus.h:873
#define PCI_VEN_ATI
Definition: pata.h:10
#define UDMA_MODES(MinMode, MaxMode)
Definition: pata.h:49
NTSTATUS PciIdeCreateChannelData(_In_ PATA_CONTROLLER Controller, _In_ ULONG HwExtensionSize)
#define PCIIDEX_PAGED_DATA
Definition: pciidex.h:50
CHANNEL_SET_MODE_EX SvwSetTransferMode
Definition: pciidex.h:813
#define STATUS_SUCCESS
Definition: shellext.h:65
BOOLEAN SvwHasUdmaCable(_In_ PATA_CONTROLLER Controller, _In_ ULONG Channel)
Definition: svw_pata.c:213
uint32_t ULONG
Definition: typedefs.h:59