Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | |
2 | /* | |
3 | * | |
475be4d8 | 4 | Copyright (c) Eicon Networks, 2002. |
1da177e4 | 5 | * |
475be4d8 JP |
6 | This source file is supplied for the use with |
7 | Eicon Networks range of DIVA Server Adapters. | |
1da177e4 | 8 | * |
475be4d8 | 9 | Eicon File Revision : 2.1 |
1da177e4 | 10 | * |
475be4d8 JP |
11 | This program is free software; you can redistribute it and/or modify |
12 | it under the terms of the GNU General Public License as published by | |
13 | the Free Software Foundation; either version 2, or (at your option) | |
14 | any later version. | |
1da177e4 | 15 | * |
475be4d8 JP |
16 | This program is distributed in the hope that it will be useful, |
17 | but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY | |
18 | implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | |
19 | See the GNU General Public License for more details. | |
1da177e4 | 20 | * |
475be4d8 JP |
21 | You should have received a copy of the GNU General Public License |
22 | along with this program; if not, write to the Free Software | |
23 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |
1da177e4 LT |
24 | * |
25 | */ | |
26 | #include "platform.h" | |
27 | #include "diva_dma.h" | |
28 | /* | |
29 | Every entry has length of PAGE_SIZE | |
30 | and represents one single physical page | |
475be4d8 | 31 | */ |
1da177e4 | 32 | struct _diva_dma_map_entry { |
475be4d8 JP |
33 | int busy; |
34 | dword phys_bus_addr; /* 32bit address as seen by the card */ | |
35 | void *local_ram_addr; /* local address as seen by the host */ | |
36 | void *addr_handle; /* handle uset to free allocated memory */ | |
1da177e4 LT |
37 | }; |
38 | /* | |
39 | Create local mapping structure and init it to default state | |
475be4d8 JP |
40 | */ |
41 | struct _diva_dma_map_entry *diva_alloc_dma_map(void *os_context, int nentries) { | |
42 | diva_dma_map_entry_t *pmap = diva_os_malloc(0, sizeof(*pmap) * (nentries + 1)); | |
43 | if (pmap) | |
44 | memset(pmap, 0, sizeof(*pmap) * (nentries + 1)); | |
45 | return pmap; | |
1da177e4 LT |
46 | } |
47 | /* | |
48 | Free local map (context should be freed before) if any | |
475be4d8 JP |
49 | */ |
50 | void diva_free_dma_mapping(struct _diva_dma_map_entry *pmap) { | |
51 | if (pmap) { | |
52 | diva_os_free(0, pmap); | |
53 | } | |
1da177e4 LT |
54 | } |
55 | /* | |
56 | Set information saved on the map entry | |
475be4d8 JP |
57 | */ |
58 | void diva_init_dma_map_entry(struct _diva_dma_map_entry *pmap, | |
59 | int nr, void *virt, dword phys, | |
60 | void *addr_handle) { | |
61 | pmap[nr].phys_bus_addr = phys; | |
62 | pmap[nr].local_ram_addr = virt; | |
63 | pmap[nr].addr_handle = addr_handle; | |
1da177e4 LT |
64 | } |
65 | /* | |
66 | Allocate one single entry in the map | |
475be4d8 JP |
67 | */ |
68 | int diva_alloc_dma_map_entry(struct _diva_dma_map_entry *pmap) { | |
69 | int i; | |
70 | for (i = 0; (pmap && pmap[i].local_ram_addr); i++) { | |
71 | if (!pmap[i].busy) { | |
72 | pmap[i].busy = 1; | |
73 | return (i); | |
74 | } | |
75 | } | |
76 | return (-1); | |
1da177e4 LT |
77 | } |
78 | /* | |
79 | Free one single entry in the map | |
475be4d8 JP |
80 | */ |
81 | void diva_free_dma_map_entry(struct _diva_dma_map_entry *pmap, int nr) { | |
82 | pmap[nr].busy = 0; | |
1da177e4 LT |
83 | } |
84 | /* | |
85 | Get information saved on the map entry | |
475be4d8 JP |
86 | */ |
87 | void diva_get_dma_map_entry(struct _diva_dma_map_entry *pmap, int nr, | |
88 | void **pvirt, dword *pphys) { | |
89 | *pphys = pmap[nr].phys_bus_addr; | |
90 | *pvirt = pmap[nr].local_ram_addr; | |
1da177e4 | 91 | } |
475be4d8 JP |
92 | void *diva_get_entry_handle(struct _diva_dma_map_entry *pmap, int nr) { |
93 | return (pmap[nr].addr_handle); | |
1da177e4 | 94 | } |