1/*
2 *	Copyright 2023, Haiku Inc. All Rights Reserved.
3 *	Distributed under the terms of the MIT License.
4 */
5
6#ifndef ISA_H
7#define ISA_H
8
9#include <bus_manager.h>
10
11#ifdef __cplusplus
12extern "C" {
13#endif
14
15/*
16 *	ISA scatter/gather dma support.
17 */
18
19typedef struct {
20	uint32				address;					// memory address in little endian
21	uint16				transfer_count;				// number of transfers -1 in little endian
22	uint8				reserved;					// empty space
23	uint8				flag;						// end of link flag
24} isa_dma_entry;
25
26#define B_LAST_ISA_DMA_ENTRY						0x80				// sets end of link flag
27#define B_MAX_ISA_DMA_COUNT							0x10000
28#define B_ISA_MODULE_NAME							"bus_managers/isa/v1"
29
30enum {
31	B_8_BIT_TRANSFER,
32	B_16_BIT_TRANSFER
33};
34
35typedef struct isa_module_info {
36	bus_manager_info    binfo;
37
38	uint8				(*read_io_8)				(int mapped_io_addr);
39	void				(*write_io_8)				(int mapped_io_addr, uint8 value);
40	uint16				(*read_io_16)				(int mapped_io_addr);
41	void				(*write_io_16)				(int mapped_io_addr, uint16 value);
42	uint32				(*read_io_32)				(int mapped_io_addr);
43	void				(*write_io_32)				(int mapped_io_addr, uint32 value);
44
45	phys_addr_t			(*ram_address)				(phys_addr_t physical_address_in_system_memory);
46
47	long				(*make_isa_dma_table) (
48							const void				*buffer,			// buffer for making table
49							long					buffer_size,		// size of the buffer
50							ulong					num_bits,			// dma transfer size
51							isa_dma_entry			*table,				// -> caller-supplied
52																		// scatter/gather table
53							long					num_entries			// max # of entries in table
54						);
55	status_t			(*start_isa_dma) (
56							long					channel,			// dma channel to use
57							void					*buf,				// buffer to transfer
58							long					transfer_count,		// number of transfers
59							uchar					mode,				// mode flags
60							uchar					e_mode				// extended mode flags
61						);
62	long				(*start_scattered_isa_dma) (
63							long					channel,			// channel number to use
64							const isa_dma_entry		*table,				// physical address of
65																		// scatter/gather table
66							uchar					mode,				// mode flags
67							uchar					emode				// extended mode flags
68						);
69	status_t			(*lock_isa_dma_channel)		(long channel);
70	status_t			(*unlock_isa_dma_channel)	(long channel);
71} isa_module_info;
72
73#ifdef __cplusplus
74}
75#endif
76
77#endif	/* ISA_H */
78