The Pedigree Project 0.1
AtaDisk.h
1/*
2 * Copyright (c) 2008-2014, Pedigree Developers
3 *
4 * Please see the CONTRIB file in the root of the source tree for a full
5 * list of contributors.
6 *
7 * Permission to use, copy, modify, and distribute this software for any
8 * purpose with or without fee is hereby granted, provided that the above
9 * copyright notice and this permission notice appear in all copies.
10 *
11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 */
19
20#ifndef ATA_ATA_DISK_H
21#define ATA_ATA_DISK_H
22
23#include "pedigree/kernel/Atomic.h"
24#include "pedigree/kernel/Spinlock.h"
25#include "pedigree/kernel/process/Mutex.h"
26#include "pedigree/kernel/process/Semaphore.h"
27#include "pedigree/kernel/process/Thread.h"
28#include "pedigree/kernel/processor/MemoryRegion.h"
29#include "pedigree/kernel/processor/types.h"
30#include "pedigree/kernel/utilities/String.h"
31
32#include "BusMasterIde.h"
33#include "ata-common.h"
34#include "modules/drivers/common/scsi/ScsiDisk.h"
35
36class IoBase;
38
46class AtaDisk : public ScsiDisk {
47 private:
48 friend class AtaPagingTransport;
49 void preparePagingStorage();
50 void releasePagingStorage();
51 AtaPagingTransport* m_Paging;
52
58 public:
59 explicit IrqCompletion(AtaDisk& disk);
61
62 Semaphore* operator->() {
63 return &m_Completion;
64 }
65
66 private:
67 static void discard(void* context);
68 void withdraw();
69
70 AtaDisk& m_Disk;
71 Semaphore m_Completion;
72 bool m_Published;
73 Thread::StackDiscardScope m_StackDiscardScope;
74 };
75
76 enum AtaDiskType {
77 Block = 0x00,
78 Sequential = 0x01,
79 Printer = 0x02,
80 Processor = 0x03,
81 WriteOnce = 0x04,
82 CdDvd = 0x05,
83 OpticalMemory = 0x07,
84 MediumChanger = 0x08,
85 Raid = 0x0C,
86 Enclosure = 0x0D,
87 None = 0x1F,
88 NotPacket = 0xFF,
89 };
90
91 public:
92 AtaDisk(class AtaController* pDev, bool isMaster, IoBase* commandRegs, IoBase* controlRegs,
93 BusMasterIde* busMaster = 0);
94 virtual ~AtaDisk();
95 void shutdownDeviceCache() override;
96
97 virtual void getName(String& str) {
98 str.assign(m_pName);
99 }
100
105 bool initialise(size_t nUnit = ~0);
106
107 // Do-ers for read/write operations. For PACKET devices, these forward to
108 // the ScsiDisk implementations. For non-PACKET devices, these perform real
109 // disk I/O.
110 virtual uint64_t doRead(uint64_t location);
111 virtual uint64_t doWrite(uint64_t location);
112 virtual uint64_t doSync(uint64_t location);
113 PagingStatus preparePagingTransport(PagingTransport*& transport) override;
114 PagingStatus doPagingTransfer(PagingOperation operation, uint64_t offset, void* page) override;
115
117 virtual void irqReceived();
118
120 void maskInterrupts();
121
123 void stopDma();
124
126 virtual BusMasterIde* getBusMaster() const {
127 return m_BusMaster;
128 }
129
130 virtual size_t getSize() const;
131 virtual size_t getBlockSize() const;
132 virtual size_t getNativeBlockSize() const;
133 virtual size_t getBlockCount() const;
134
135 // SCSI controller interface calls this to send a PACKET command.
136 virtual bool sendCommand(size_t nUnit, uintptr_t pCommand, uint8_t nCommandSize,
137 uintptr_t pRespBuffer, uint16_t nRespBytes, bool bWrite);
138
139 private:
140 virtual size_t getCacheFillSize() const;
141
143 void setupLBA28(uint64_t n, uint32_t nSectors);
145 void setupLBA48(uint64_t n, uint32_t nSectors);
146
148 virtual size_t defaultBlockSize() {
149 if (m_AtaDiskType == CdDvd) {
150 return 2048;
151 } else {
152 return 512;
153 }
154 }
155
156 public:
158 MUST_USE_RESULT virtual uint64_t doWriteDirect(uint64_t location, uintptr_t page);
159
160 private:
162 uint64_t writePageBuffer(uint64_t location, uintptr_t page);
163
165 struct Buffer {
167 uintptr_t buffer;
168
170 size_t offset;
171 };
172
175
179 char m_pName[64];
190
195 Spinlock m_IrqLock;
196
198 AtaDiskType m_AtaDiskType;
199
202
205
207 void setFeatures(uint8_t command, uint8_t countreg, uint8_t lowreg, uint8_t midreg,
208 uint8_t hireg);
209
212 IoBase* m_ControlRegs;
213 BusMasterIde* m_BusMaster;
214
217
219 PhysicalRegionDescriptor* m_PrdTable;
220
224
226 physical_uintptr_t m_PrdTablePhys;
227
230
232 bool m_bDma;
233
236};
237
238#endif
IoBase * m_CommandRegs
Definition AtaDisk.h:211
PagingStatus preparePagingTransport(PagingTransport *&transport) override
IdentifyData m_pIdent
Definition AtaDisk.h:177
AtaDiskType m_AtaDiskType
Definition AtaDisk.h:198
bool m_Removable
Definition AtaDisk.h:204
virtual MUST_USE_RESULT uint64_t doWriteDirect(uint64_t location, uintptr_t page)
Definition AtaDisk.cc:1124
uint8_t m_PacketSize
Definition AtaDisk.h:201
char m_pName[64]
Definition AtaDisk.h:179
void setupLBA28(uint64_t n, uint32_t nSectors)
Definition AtaDisk.cc:1368
void maskInterrupts()
Definition AtaDisk.cc:245
bool m_IsMaster
Definition AtaDisk.h:174
virtual uint64_t doWrite(uint64_t location)
Definition AtaDisk.cc:1089
virtual size_t getNativeBlockSize() const
Definition AtaDisk.cc:1471
Semaphore * m_IrqReceived
Definition AtaDisk.h:194
virtual size_t getCacheFillSize() const
Definition AtaDisk.cc:1464
size_t m_LastPrdTableOffset
Definition AtaDisk.h:223
Mutex m_PrdTableLock
Definition AtaDisk.h:216
virtual BusMasterIde * getBusMaster() const
Definition AtaDisk.h:126
void setFeatures(uint8_t command, uint8_t countreg, uint8_t lowreg, uint8_t midreg, uint8_t hireg)
Definition AtaDisk.cc:1414
bool initialise(size_t nUnit=~0)
Definition AtaDisk.cc:258
char m_pSerialNumber[64]
Definition AtaDisk.h:181
char m_pFirmwareRevision[64]
Definition AtaDisk.h:183
physical_uintptr_t m_PrdTablePhys
Definition AtaDisk.h:226
void setupLBA48(uint64_t n, uint32_t nSectors)
Definition AtaDisk.cc:1391
virtual uint64_t doRead(uint64_t location)
Definition AtaDisk.cc:844
bool m_SupportsLBA28
Definition AtaDisk.h:185
PhysicalRegionDescriptor * m_PrdTable
Definition AtaDisk.h:219
virtual void getName(String &str)
Definition AtaDisk.h:97
virtual void irqReceived()
Definition AtaDisk.cc:1361
virtual size_t defaultBlockSize()
Definition AtaDisk.h:148
size_t m_BlockSize
Definition AtaDisk.h:189
Atomic< size_t > m_IrqCount
Definition AtaDisk.h:235
uint64_t writePageBuffer(uint64_t location, uintptr_t page)
Definition AtaDisk.cc:1197
void stopDma()
Definition AtaDisk.cc:252
MemoryRegion m_PrdTableMemRegion
Definition AtaDisk.h:229
virtual size_t getSize() const
Gets the size of the disk.
Definition AtaDisk.cc:1430
virtual size_t getBlockSize() const
Gets the preferred I/O extent of the disk.
Definition AtaDisk.cc:1457
bool m_SupportsLBA48
Definition AtaDisk.h:187
bool m_bDma
Definition AtaDisk.h:232
Abstrace base class for hardware I/O capabilities.
Definition IoBase.h:32
Special memory entity in the kernel's virtual address space.
Definition Mutex.h:56
size_t offset
Offset into the read.
Definition AtaDisk.h:170
uintptr_t buffer
Virtual address of buffer to read into (page sized).
Definition AtaDisk.h:167