⛏️ index : haiku.git

/*
 *	Copyright 2023, Haiku Inc. All Rights Reserved.
 *	Distributed under the terms of the MIT License.
 */

#ifndef ISA_H
#define ISA_H

#include <bus_manager.h>

#ifdef __cplusplus
extern "C" {
#endif

/*
 *	ISA scatter/gather dma support.
 */

typedef struct {
	uint32				address;					// memory address in little endian
	uint16				transfer_count;				// number of transfers -1 in little endian
	uint8				reserved;					// empty space
	uint8				flag;						// end of link flag
} isa_dma_entry;

#define B_LAST_ISA_DMA_ENTRY						0x80				// sets end of link flag
#define B_MAX_ISA_DMA_COUNT							0x10000
#define B_ISA_MODULE_NAME							"bus_managers/isa/v1"

enum {
	B_8_BIT_TRANSFER,
	B_16_BIT_TRANSFER
};

typedef struct isa_module_info {
	bus_manager_info    binfo;

	uint8				(*read_io_8)				(int mapped_io_addr);
	void				(*write_io_8)				(int mapped_io_addr, uint8 value);
	uint16				(*read_io_16)				(int mapped_io_addr);
	void				(*write_io_16)				(int mapped_io_addr, uint16 value);
	uint32				(*read_io_32)				(int mapped_io_addr);
	void				(*write_io_32)				(int mapped_io_addr, uint32 value);

	phys_addr_t			(*ram_address)				(phys_addr_t physical_address_in_system_memory);

	long				(*make_isa_dma_table) (
							const void				*buffer,			// buffer for making table
							long					buffer_size,		// size of the buffer
							ulong					num_bits,			// dma transfer size
							isa_dma_entry			*table,				// -> caller-supplied
																		// scatter/gather table
							long					num_entries			// max # of entries in table
						);
	status_t			(*start_isa_dma) (
							long					channel,			// dma channel to use
							void					*buf,				// buffer to transfer
							long					transfer_count,		// number of transfers
							uchar					mode,				// mode flags
							uchar					e_mode				// extended mode flags
						);
	long				(*start_scattered_isa_dma) (
							long					channel,			// channel number to use
							const isa_dma_entry		*table,				// physical address of
																		// scatter/gather table
							uchar					mode,				// mode flags
							uchar					emode				// extended mode flags
						);
	status_t			(*lock_isa_dma_channel)		(long channel);
	status_t			(*unlock_isa_dma_channel)	(long channel);
} isa_module_info;

#ifdef __cplusplus
}
#endif

#endif	/* ISA_H */