mirror of
https://review.haiku-os.org/haiku
synced 2025-02-07 14:25:58 +01:00
The SDHCI spec also offers an "advanced DMA" mode where we can use scatter-gather lists. It would allow to remove several of the DMA restrictions, but hardware support for it is optional, so we need this version anyway. The geometry is retrieved on demand in the first read or write or in a call to the get geometry or get device size ioctl. It is not possible to retrieve it from the device initialization because that is called as part of the mmc_bus scanning, which needs a specific sequence of commands and keeps the bus locked to prevent drivers to insert their own commands in the middle of that sequence. TODO: - Move the DMA restrictions definition to sdhci_pci and forward it up to mmc_disk (which is the one creating the IOScheduler) - Decide if we want to keep non-DMA support (probably should, but it makes things more complex, because it uses virtual addresses) Change-Id: Ib1dd14eacf62052d747bfb3ef7820bc5a34d3030 Reviewed-on: https://review.haiku-os.org/c/haiku/+/3471 Reviewed-by: Alex von Gluck IV <kallisti5@unixzen.com>
90 lines
2.1 KiB
C
90 lines
2.1 KiB
C
/*
|
|
* Copyright 2019-2020, Haiku, Inc. All Rights Reserved.
|
|
* Distributed under the terms of the MIT License.
|
|
*
|
|
* Authors:
|
|
* Adrien Destugues, pulkomandy@pulkomandy.tk
|
|
*/
|
|
#ifndef _MMC_H
|
|
#define _MMC_H
|
|
|
|
|
|
#include <device_manager.h>
|
|
|
|
|
|
#define MMC_BUS_MODULE_NAME "bus_managers/mmc/driver_v1"
|
|
|
|
|
|
struct IOOperation;
|
|
|
|
|
|
enum {
|
|
CARD_TYPE_MMC,
|
|
CARD_TYPE_SD,
|
|
CARD_TYPE_SDHC,
|
|
CARD_TYPE_UHS1,
|
|
CARD_TYPE_UHS2,
|
|
CARD_TYPE_SDIO
|
|
};
|
|
|
|
|
|
// Commands for SD cards defined in SD Specifications Part 1:
|
|
// Physical Layer Simplified Specification Version 8.00
|
|
// They are in the common .h file for the mmc stack because the SDHCI driver
|
|
// currently needs to map them to the corresponding expected response types.
|
|
enum SD_COMMANDS {
|
|
// Basic commands, class 0
|
|
SD_GO_IDLE_STATE = 0,
|
|
SD_ALL_SEND_CID = 2,
|
|
SD_SEND_RELATIVE_ADDR = 3,
|
|
SD_SELECT_DESELECT_CARD = 7,
|
|
SD_SEND_IF_COND = 8,
|
|
SD_SEND_CSD = 9,
|
|
SD_STOP_TRANSMISSION = 12,
|
|
|
|
// Block oriented read commands, class 2
|
|
SD_READ_SINGLE_BLOCK = 17,
|
|
SD_READ_MULTIPLE_BLOCKS = 18,
|
|
|
|
// Application specific commands, class 8
|
|
SD_APP_CMD = 55,
|
|
|
|
// I/O mode commands, class 9
|
|
SD_IO_ABORT = 52,
|
|
};
|
|
|
|
|
|
enum SDHCI_APPLICATION_COMMANDS {
|
|
SD_SEND_OP_COND = 41,
|
|
};
|
|
|
|
|
|
// Interface between mmc_bus and underlying implementation (sdhci_pci or any
|
|
// other thing that can execute mmc commands)
|
|
typedef struct mmc_bus_interface {
|
|
driver_module_info info;
|
|
|
|
status_t (*set_clock)(void* controller, uint32_t kilohertz);
|
|
status_t (*execute_command)(void* controller, uint8_t command,
|
|
uint32_t argument, uint32_t* result);
|
|
status_t (*do_io)(void* controller, IOOperation* operation);
|
|
} mmc_bus_interface;
|
|
|
|
|
|
// Interface between mmc device driver (mmc_disk, sdio drivers, ...) and mmc_bus
|
|
typedef struct mmc_device_interface {
|
|
driver_module_info info;
|
|
status_t (*execute_command)(device_node* node, uint8_t command,
|
|
uint32_t argument, uint32_t* result);
|
|
status_t (*do_io)(device_node* controller, uint16_t rca,
|
|
IOOperation* operation);
|
|
} mmc_device_interface;
|
|
|
|
|
|
// Device attribute paths for the MMC device
|
|
static const char* kMmcRcaAttribute = "mmc/rca";
|
|
static const char* kMmcTypeAttribute = "mmc/type";
|
|
|
|
|
|
#endif /* _MMC_H */
|