ReactOS 0.4.16-dev-2633-g8dc9e50
toshiba.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: Toshiba PCI IDE controller minidriver
5 * COPYRIGHT: Copyright 2026 Dmitry Borisov <di.sean@protonmail.com>
6 */
7
8/*
9 * Adapted from the NetBSD toshide driver
10 * Copyright (c) 2009 The NetBSD Foundation, Inc
11 */
12
13/* INCLUDES *******************************************************************/
14
15#include "pciidex.h"
16
17/* GLOBALS ********************************************************************/
18
19#define PCI_DEV_PICCOLO_1 0x0101
20#define PCI_DEV_PICCOLO_2 0x0102
21#define PCI_DEV_PICCOLO_3 0x0103
22#define PCI_DEV_PICCOLO_5 0x0105
23
24#define PICCOLO_REG_PIO_TIMING 0x50
25#define PICCOLO_REG_DMA_TIMING 0x5C
26
27#define PICCOLO_PIO_MASK 0xFFFFE088
28#define PICCOLO_DMA_MASK 0xFFFFE088
29#define PICCOLO_UDMA_MASK 0x78FFE088
30
31static const ULONG PiccoloPioTimings[] =
32{
33 0x0566, // Mode 0
34 0x0433, // Mode 1
35 0x0311, // Mode 2
36 0x0201, // Mode 3
37 0x0200 // Mode 4
38};
39
40static const ULONG PiccoloMwDmaTimings[] =
41{
42 0x0655, // Mode 0
43 0x0200, // Mode 1
44 0x0200, // Mode 2
45};
46
47static const ULONG PiccoloUdmaTimings[] =
48{
49 0x84000222, // Mode 0
50 0x83000111, // Mode 1
51 0x82000000, // Mode 2
52};
53
54/* FUNCTIONS ******************************************************************/
55
56static
57VOID
59 _In_ PATA_CONTROLLER Controller,
62{
63 ULONG i;
64
66
67 for (i = 0; i < MAX_IDE_DEVICE; ++i)
68 {
70 ULONG TimingReg;
71
72 if (!Device)
73 continue;
74
75 TimingReg = PciRead32(Controller, PICCOLO_REG_PIO_TIMING);
76 TimingReg &= PICCOLO_PIO_MASK;
77 TimingReg |= PiccoloPioTimings[Device->PioMode];
78 PciWrite32(Controller, PICCOLO_REG_PIO_TIMING, TimingReg);
79
80 if (Device->DmaMode != PIO_MODE(0))
81 {
82 TimingReg = PciRead32(Controller, PICCOLO_REG_DMA_TIMING);
83
84 if (Device->DmaMode >= UDMA_MODE(0))
85 {
86 TimingReg &= PICCOLO_UDMA_MASK;
87 TimingReg |= PiccoloUdmaTimings[Device->DmaMode - UDMA_MODE(0)];
88 }
89 else
90 {
91 TimingReg &= PICCOLO_DMA_MASK;
92 TimingReg |= PiccoloMwDmaTimings[Device->DmaMode - MWDMA_MODE(0)];
93 }
94
95 PciWrite32(Controller, PICCOLO_REG_DMA_TIMING, TimingReg);
96 }
97 }
98}
99
100CODE_SEG("PAGE")
103 _Inout_ PATA_CONTROLLER Controller)
104{
106 ULONG i;
107
108 PAGED_CODE();
109 ASSERT(Controller->Pci.VendorID == PCI_VEN_TOSHIBA);
110
111 if (Controller->Pci.DeviceID != PCI_DEV_PICCOLO_1 &&
112 Controller->Pci.DeviceID != PCI_DEV_PICCOLO_2 &&
113 Controller->Pci.DeviceID != PCI_DEV_PICCOLO_3 &&
114 Controller->Pci.DeviceID != PCI_DEV_PICCOLO_5)
115 {
116 return STATUS_NO_MATCH;
117 }
118
119 Controller->MaxChannels = 1;
120
121 Status = PciIdeCreateChannelData(Controller, 0);
122 if (!NT_SUCCESS(Status))
123 return Status;
124
125 for (i = 0; i < Controller->MaxChannels; ++i)
126 {
127 PCHANNEL_DATA_PATA ChanData = Controller->Channels[i];
128
129 ChanData->TransferModeSupported = PIO_ALL | MWDMA_ALL | UDMA_MODES(0, 2);
130 ChanData->SetTransferMode = ToshibaSetTransferMode;
131 }
132
133 return STATUS_SUCCESS;
134}
#define PAGED_CODE()
#define CODE_SEG(...)
#define MWDMA_ALL
Definition: ata_user.h:27
#define PIO_MODE(n)
Definition: ata_user.h:36
#define MWDMA_MODE(n)
Definition: ata_user.h:38
#define PIO_ALL
Definition: ata_user.h:19
#define UDMA_MODE(n)
Definition: ata_user.h:39
LONG NTSTATUS
Definition: precomp.h:26
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
PDEVICE_LIST DeviceList
Definition: utils.c:27
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_DEVICE
Definition: ide.h:32
#define ASSERT(a)
Definition: mode.c:44
#define _In_reads_(s)
Definition: no_sal2.h:168
#define _Inout_
Definition: no_sal2.h:162
#define _In_
Definition: no_sal2.h:158
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
#define STATUS_NO_MATCH
Definition: ntstatus.h:873
#define PCI_VEN_TOSHIBA
Definition: pata.h:17
#define UDMA_MODES(MinMode, MaxMode)
Definition: pata.h:49
NTSTATUS PciIdeCreateChannelData(_In_ PATA_CONTROLLER Controller, _In_ ULONG HwExtensionSize)
_In_ ULONG Channel
Definition: pciidex.h:74
FORCEINLINE VOID PciWrite32(_In_ PATA_CONTROLLER Controller, _In_ ULONG ConfigDataOffset, _In_ ULONG Value)
Definition: pciidex.h:903
FORCEINLINE ULONG PciRead32(_In_ PATA_CONTROLLER Controller, _In_ ULONG ConfigDataOffset)
Definition: pciidex.h:871
#define STATUS_SUCCESS
Definition: shellext.h:65
static const ULONG PiccoloMwDmaTimings[]
Definition: toshiba.c:40
#define PICCOLO_REG_DMA_TIMING
Definition: toshiba.c:25
#define PICCOLO_DMA_MASK
Definition: toshiba.c:28
static const ULONG PiccoloPioTimings[]
Definition: toshiba.c:31
#define PICCOLO_PIO_MASK
Definition: toshiba.c:27
#define PCI_DEV_PICCOLO_3
Definition: toshiba.c:21
#define PCI_DEV_PICCOLO_5
Definition: toshiba.c:22
#define PCI_DEV_PICCOLO_1
Definition: toshiba.c:19
#define PICCOLO_REG_PIO_TIMING
Definition: toshiba.c:24
#define PICCOLO_UDMA_MASK
Definition: toshiba.c:29
NTSTATUS ToshibaGetControllerProperties(_Inout_ PATA_CONTROLLER Controller)
Definition: toshiba.c:102
static VOID ToshibaSetTransferMode(_In_ PATA_CONTROLLER Controller, _In_ ULONG Channel, _In_reads_(MAX_IDE_DEVICE) PCHANNEL_DEVICE_CONFIG *DeviceList)
Definition: toshiba.c:58
static const ULONG PiccoloUdmaTimings[]
Definition: toshiba.c:47
#define PCI_DEV_PICCOLO_2
Definition: toshiba.c:20
uint32_t ULONG
Definition: typedefs.h:59
_Must_inspect_result_ _In_ WDFDEVICE Device
Definition: wdfchildlist.h:474