1/*
2 * BeOS kernel compatibility layer
3 *
4 * The contents of this file are subject to the Mozilla Public License
5 * Version 1.0 (the "License"); you may not use this file except in
6 * compliance with the License. You may obtain a copy of the License
7 * at http://www.mozilla.org/MPL/
8 *
9 * Software distributed under the License is distributed on an "AS IS"
10 * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
11 * the License for the specific language governing rights and
12 * limitations under the License.
13 *
14 * The initial developer of the original code is David A. Hinds
15 * <dhinds@hyper.stanford.edu>.  Portions created by David A. Hinds
16 *  are Copyright (C) 1998 David A. Hinds.  All Rights Reserved.
17 */
18
19#ifndef _BE_K_COMPAT_H
20#define _BE_K_COMPAT_H
21
22#include <KernelExport.h>
23#include <ISA.h>
24#include <PCI.h>
25#include <Drivers.h>
26#include <ByteOrder.h>
27#include <SupportDefs.h>
28#include <stdio.h>
29#include <string.h>
30
31#define u32 uint32
32#define u16 uint16
33#define u8 uint8
34
35#define __KERNEL__
36#define __init
37#define __exit
38
39/* IO port access */
40#define inb(p)			(isa->read_io_8)(p)
41#define inw(p)			(isa->read_io_16)(p)
42#define inl(p)			(isa->read_io_32)(p)
43#define outb(d,p)		(isa->write_io_8)(p,d)
44#define outw(d,p)		(isa->write_io_16)(p,d)
45#define outl(d,p)		(isa->write_io_32)(p,d)
46
47/* Memory-mapped IO access: unlike Linux, BeOS allows dereferencing
48   pointers to mapped devices */
49#define readb(p)		(*(volatile u_char *)(p))
50#define readw(p)		(*(volatile u_short *)(p))
51#define readl(p)		(*(volatile u_int *)(p))
52#define writeb(b, p)		(*(volatile u_char *)(p) = (b))
53#define writew(w, p)		(*(volatile u_short *)(p) = (w))
54#define writel(l, p)		(*(volatile u_int *)(p) = (l))
55#define memcpy_fromio(a, b, c)	memcpy((a), (void *)(b), (c))
56#define memcpy_toio(a, b, c)	memcpy((void *)(a), (b), (c))
57
58/* Byte swapping */
59#define le16_to_cpu		B_LENDIAN_TO_HOST_INT16
60#define le32_to_cpu		B_LENDIAN_TO_HOST_INT32
61#define cpu_to_le16		B_HOST_TO_LENDIAN_INT16
62#define cpu_to_le32		B_HOST_TO_LENDIAN_INT32
63#define writew_ns		writew
64#define readw_ns		readw
65
66/* Copying data between kernel and user space: BeOS can directly
67   dereference user pointers in kernel mode */
68#define get_user(x, p)		((x) = *(p))
69#define put_user(x, p)		(*(p) = (x))
70#define copy_from_user		memcpy
71#define copy_to_user		memcpy
72
73/* Virtual memory mapping: this is somewhat inelegant, but lets us
74   use drop-in replacements for the Linux equivalents */
75// #define PAGE_SIZE		(0x1000)
76static inline void *ioremap(u_long base, u_long size)
77{
78    char tag[B_OS_NAME_LENGTH];
79    area_id id;
80    void *virt;
81    sprintf(tag, "pccard %08lx", base);
82    id = map_physical_memory(tag, (phys_addr_t)base,
83			     size, B_ANY_KERNEL_ADDRESS,
84			     B_READ_AREA | B_WRITE_AREA, &virt);
85    return (id < 0) ? NULL : virt;
86}
87static inline void iounmap(void *virt)
88{
89    area_id id = area_for(virt);
90    if (id >= 0) delete_area(id);
91}
92
93/* Resource management: use helper functions from the PCMCIA resource
94   manager module.  RSRC_MGR needs to be defined appropriately if the
95   calls are via a module_info structure. */
96#define request_region(base, num, name) \
97	(RSRC_MGR register_resource(B_IO_PORT_RESOURCE, (base), (num)))
98#define vacate_region release_region
99#define vacate_mem_region release_mem_region
100#define release_region(base, num) \
101	(RSRC_MGR release_resource(B_IO_PORT_RESOURCE, (base), (num)))
102#define check_region(base, num) \
103	(RSRC_MGR check_resource(B_IO_PORT_RESOURCE, (base), (num)))
104#define request_mem_region(base, num, name) \
105	(RSRC_MGR register_resource(B_MEMORY_RESOURCE, (base), (num)))
106#define release_mem_region(base, num) \
107	(RSRC_MGR release_resource(B_MEMORY_RESOURCE, (base), (num)))
108#define check_mem_region(base, num) \
109	(RSRC_MGR check_resource(B_MEMORY_RESOURCE, (base), (num)))
110#define register_irq(irq) \
111	(RSRC_MGR register_resource(B_IRQ_RESOURCE, (irq), 0))
112#define release_irq(irq) \
113	(RSRC_MGR release_resource(B_IRQ_RESOURCE, (irq), 0))
114#define check_irq(irq) \
115	(RSRC_MGR check_resource(B_IRQ_RESOURCE, (irq), 0))
116#define ACQUIRE_RESOURCE_LOCK \
117    do { module_info *m; \
118    get_module(B_CONFIG_MANAGER_FOR_DRIVER_MODULE_NAME, &m); } while (0)
119#define RELEASE_RESOURCE_LOCK \
120    put_module(B_CONFIG_MANAGER_FOR_DRIVER_MODULE_NAME)
121
122/* Memory allocation.  BeOS doesn't have an atomic malloc. */
123#define kmalloc(s,f)		malloc(s)
124#define kfree(p)		free(p)
125#define kfree_s(p,s)		free(p)
126void *malloc();
127void free(void *);
128
129/* PCI configuration register access */
130#define pcibios_present() (1)
131#define pcibios_read_config_byte(b,df,o,v) \
132	((*(v) = pci->read_pci_config(b,(df)>>3,((df)&7),o,1)),0)
133#define pcibios_read_config_word(b,df,o,v) \
134	((*(v) = pci->read_pci_config(b,(df)>>3,((df)&7),o,2)),0)
135#define pcibios_read_config_dword(b,df,o,v) \
136	((*(v) = pci->read_pci_config(b,(df)>>3,((df)&7),o,4)),0)
137#define pcibios_write_config_byte(b,df,o,v) \
138	(pci->write_pci_config(b,(df)>>3,((df)&7),o,1,v),0)
139#define pcibios_write_config_word(b,df,o,v) \
140	(pci->write_pci_config(b,(df)>>3,((df)&7),o,2,v),0)
141#define pcibios_write_config_dword(b,df,o,v) \
142	(pci->write_pci_config(b,(df)>>3,((df)&7),o,4,v),0)
143#define PCI_VENDOR_ID		PCI_vendor_id
144#define PCI_DEVICE_ID		PCI_device_id
145#define PCI_COMMAND		PCI_command
146#define  PCI_COMMAND_IO		PCI_command_io
147#define  PCI_COMMAND_MEMORY	PCI_command_memory
148#define  PCI_COMMAND_MASTER	PCI_command_master
149#define  PCI_COMMAND_WAIT	PCI_command_address_step
150#define PCI_STATUS		PCI_status
151#define PCI_CLASS_REVISION  PCI_revision
152#define PCI_CACHE_LINE_SIZE	PCI_line_size
153#define PCI_LATENCY_TIMER	PCI_latency
154#define PCI_INTERRUPT_LINE	PCI_interrupt_line
155#define PCI_INTERRUPT_PIN	PCI_interrupt_pin
156#define PCI_HEADER_TYPE		PCI_header_type
157#define PCI_BASE_ADDRESS_0	PCI_base_registers
158#define  PCI_BASE_ADDRESS_SPACE	PCI_address_space
159#define  PCI_BASE_ADDRESS_MEM_MASK	PCI_address_memory_32_mask
160#define  PCI_BASE_ADDRESS_IO_MASK	PCI_address_io_mask
161#define  PCI_BASE_ADDRESS_MEM_PREFETCH	PCI_address_prefetchable
162#define PCI_FUNC(devfn)		((devfn)&7)
163#define PCI_SLOT(devfn)		((devfn)>>3)
164#define PCI_DEVFN(dev,fn)	(((dev)<<3)|((fn)&7))
165#define PCI_CLASS_BRIDGE_PCMCIA	0x0605
166#define PCI_CLASS_BRIDGE_CARDBUS 0x0607
167
168/* Atomic test-and-set */
169#define test_and_set_bit(b,p)	(((atomic_or(p,(1<<(b))))>>(b))&1)
170
171/* Spin locks */
172#define __SMP__
173#define spinlock_t		spinlock
174#define USE_SPIN_LOCKS
175#define SPIN_LOCK_UNLOCKED	0
176#define spin_lock_irqsave(l,f) \
177    do { f = disable_interrupts(); acquire_spinlock(l); } while (0)
178#define spin_unlock_irqrestore(l,f) \
179    do { release_spinlock(l); restore_interrupts(f); } while (0)
180
181/* Interrupt handling */
182#define request_irq(i,h,f,n,d)	install_io_interrupt_handler(i,h,d,0)
183#define free_irq(i,h)	remove_io_interrupt(i,h)
184//#define REQUEST_IRQ(i,h,f,n,d)	install_io_interrupt_handler(i,h,d,0)
185//#define FREE_IRQ(i,h,d)		remove_io_interrupt(i,h)
186//#define IRQ(i,d,r)		(d)
187#define IRQ(i,d,r)
188#define DEV_ID			dev_id
189#define NR_IRQS			16
190#define SA_SHIRQ		1
191
192#define init_waitqueue(w)	memset((w), 0, sizeof(*w))
193#define init_waitqueue_head(w) memset((w), 0, sizeof(*w))
194#define signal_pending(a)	has_signals_pending(NULL)
195
196/* Miscellaneous services */
197typedef long long k_time_t;
198#define schedule_timeout(x) snooze(x)
199#define udelay(d)		spin(d)
200#define mdelay(d) \
201    do { int i; for (i=0;i<d;i++) spin(1000); } while (0)
202#define printk			dprintf
203#define KERN_ERR		""
204#define KERN_NOTICE		""
205#define KERN_INFO		""
206#define KERN_WARNING		""
207#define KERN_DEBUG		""
208
209#ifndef ENODATA
210#define ENODATA ENOSPC
211#endif
212
213#include <pcmcia/cs_timer.h>
214#define add_timer my_add_timer
215#define del_timer my_del_timer
216
217/* Module handling stuff */
218#define MODULE_AUTHOR(x)
219#define MODULE_DESCRIPTION(x)
220#define MODULE_LICENSE(x)
221#define MODULE_PARM(a,b)	extern int __dummy_decl
222#define MOD_INC_USE_COUNT
223#define MOD_DEC_USE_COUNT
224
225#endif /* _BE_K_COMPAT_H */
226