3 * Copyright (C) 1998-2003 Brian Palmer <brianp@sginet.com>
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
23 #define TAG_CACHE_DATA 'DcaC'
24 #define TAG_CACHE_BLOCK 'BcaC'
26 ///////////////////////////////////////////////////////////////////////////////////////
28 // This structure describes a cached block element. The disk is divided up into
29 // cache blocks. For disks which LBA is not supported each block is the size of
30 // one track. This will force the cache manager to make track sized reads, and
31 // therefore maximizes throughput. For disks which support LBA the block size
32 // is 64k because they have no cylinder, head, or sector boundaries.
34 ///////////////////////////////////////////////////////////////////////////////////////
37 LIST_ENTRY ListEntry
; // Doubly linked list synchronization member
39 ULONG BlockNumber
; // Track index for CHS, 64k block index for LBA
40 BOOLEAN LockedInCache
; // Indicates that this block is locked in cache memory
41 ULONG AccessCount
; // Access count for this block
43 PVOID BlockData
; // Pointer to block data
45 } CACHE_BLOCK
, *PCACHE_BLOCK
;
47 ///////////////////////////////////////////////////////////////////////////////////////
49 // This structure describes a cached drive. It contains the BIOS drive number
50 // and indicates whether or not LBA is supported. If LBA is not supported then
51 // the drive's geometry is described here.
53 ///////////////////////////////////////////////////////////////////////////////////////
59 ULONG BlockSize
; // Block size (in sectors)
60 LIST_ENTRY CacheBlockHead
; // Contains CACHE_BLOCK structures
62 } CACHE_DRIVE
, *PCACHE_DRIVE
;
65 ///////////////////////////////////////////////////////////////////////////////////////
69 ///////////////////////////////////////////////////////////////////////////////////////
70 extern CACHE_DRIVE CacheManagerDrive
;
71 extern BOOLEAN CacheManagerInitialized
;
72 extern ULONG CacheBlockCount
;
73 extern SIZE_T CacheSizeLimit
;
74 extern SIZE_T CacheSizeCurrent
;
76 ///////////////////////////////////////////////////////////////////////////////////////
80 ///////////////////////////////////////////////////////////////////////////////////////
81 PCACHE_BLOCK
CacheInternalGetBlockPointer(PCACHE_DRIVE CacheDrive
, ULONG BlockNumber
); // Returns a pointer to a CACHE_BLOCK structure given a block number
82 PCACHE_BLOCK
CacheInternalFindBlock(PCACHE_DRIVE CacheDrive
, ULONG BlockNumber
); // Searches the block list for a particular block
83 PCACHE_BLOCK
CacheInternalAddBlockToCache(PCACHE_DRIVE CacheDrive
, ULONG BlockNumber
); // Adds a block to the cache's block list
84 BOOLEAN
CacheInternalFreeBlock(PCACHE_DRIVE CacheDrive
); // Removes a block from the cache's block list & frees the memory
85 VOID
CacheInternalCheckCacheSizeLimits(PCACHE_DRIVE CacheDrive
); // Checks the cache size limits to see if we can add a new block, if not calls CacheInternalFreeBlock()
86 VOID
CacheInternalDumpBlockList(PCACHE_DRIVE CacheDrive
); // Dumps the list of cached blocks to the debug output port
87 VOID
CacheInternalOptimizeBlockList(PCACHE_DRIVE CacheDrive
, PCACHE_BLOCK CacheBlock
); // Moves the specified block to the head of the list
90 BOOLEAN
CacheInitializeDrive(UCHAR DriveNumber
);
91 VOID
CacheInvalidateCacheData(VOID
);
92 BOOLEAN
CacheReadDiskSectors(UCHAR DiskNumber
, ULONGLONG StartSector
, ULONG SectorCount
, PVOID Buffer
);
93 BOOLEAN
CacheForceDiskSectorsIntoCache(UCHAR DiskNumber
, ULONGLONG StartSector
, ULONG SectorCount
);
94 BOOLEAN
CacheReleaseMemory(ULONG MinimumAmountToRelease
);