1/*
2 * Copyright 2018-2020 Haiku, Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 *		B Krishnan Iyer, krishnaniyer97@gmail.com
7 *		Adrien Destugues, pulkomandy@pulkomandy.tk
8 */
9#ifndef _MMC_DISK_H
10#define _MMC_DISK_H
11
12
13#include <device_manager.h>
14#include <KernelExport.h>
15
16#include <stdint.h>
17
18#include <mmc.h>
19
20#include "IOSchedulerSimple.h"
21
22
23enum MMCDiskFlags {
24	kIoCommandOffsetAsSectors = 1,
25		// IO commands use sector offsets instead of byte offsets
26};
27
28
29// This is the device info structure, allocated once per device
30typedef struct {
31	device_node* node;
32	device_node* parent;
33	void* parentCookie;
34	mmc_device_interface* mmc;
35	uint16_t rca;
36	uint32_t flags;
37
38	device_geometry geometry;
39
40	DMAResource* dmaResource;
41	IOScheduler* scheduler;
42
43	off_t DeviceSize() const {
44		return (off_t)geometry.bytes_per_sector * geometry.sectors_per_track
45			* geometry.cylinder_count * geometry.head_count;
46	}
47} mmc_disk_driver_info;
48
49
50// This is allocated once per open() call on the device (there can be multiple
51// open file descriptors for the same device)
52typedef struct {
53	mmc_disk_driver_info* info;
54} mmc_disk_handle;
55
56
57#endif /*_MMC_DISK_H*/
58