build_archspecific m68k-amiga card.resource. Some fixes.
[AROS.git] / arch / m68k-amiga / card / card_init.c
blob8b6ce2df184fa93ba4f7b8fa7c8cd74f29af1b37
1 /*
2 Copyright © 1995-2011, The AROS Development Team. All rights reserved.
3 $Id: card_init.c $
5 Desc:
6 Lang: English
7 */
9 #include <aros/debug.h>
10 #include <exec/types.h>
11 #include <exec/interrupts.h>
12 #include <hardware/intbits.h>
13 #include <proto/exec.h>
14 #include <aros/symbolsets.h>
15 #include "card_intern.h"
17 AROS_UFP4 (APTR, card_level2,
18 AROS_UFPA(ULONG, dummy, A0),
19 AROS_UFPA(void *, data, A1),
20 AROS_UFPA(ULONG, dummy2, A5),
21 AROS_UFPA(struct ExecBase *, mySysBase, A6));
23 AROS_UFP4 (APTR, card_level6,
24 AROS_UFPA(ULONG, dummy, A0),
25 AROS_UFPA(void *, data, A1),
26 AROS_UFPA(ULONG, dummy2, A5),
27 AROS_UFPA(struct ExecBase *, mySysBase, A6));
29 void CardTask(struct Task *parent, struct CardResource *CardResource);
31 static BOOL addpcmciaram(struct CardResource *CardResource, struct CardHandle *ch, struct DeviceTData *dtd)
33 ULONG size = dtd->dtd_DTsize;
34 APTR addr =(APTR)GAYLE_RAM;
36 if (size < 262144)
37 return FALSE;
38 size -= 512;
39 addr += 512;
40 AddMemList(size, MEMF_FAST | MEMF_PUBLIC, -5, addr, CardResource->crb_LibNode.lib_Node.ln_Name);
41 return TRUE;
44 static BOOL checkcard(struct CardResource *CardResource)
46 struct CardHandle *ch;
47 BOOL sysram = FALSE;
49 ch = AllocVec(sizeof(struct CardHandle), MEMF_CLEAR);
50 if (ch) {
51 ch->cah_CardFlags = CARDF_IFAVAILABLE;
52 if (!OwnCard(ch)) {
53 struct Resident *res;
54 struct DeviceTData dtd;
55 UBYTE device[6];
57 BeginCardAccess(ch);
59 if (!CopyTuple(ch, NULL, 0, 0)) { /* debug log all tuples, check if tuple chain is valid */
60 CARDDEBUG(bug("Invalid tuple chain detected\n"));
61 } else {
62 res = IfAmigaXIP(ch);
63 if (res) {
64 CARDDEBUG(bug("CISTPL_AMIGAXIP found\n"));
65 } else if (CopyTuple(ch, device, CISTPL_DEVICE, sizeof(device) - 2)) {
66 if (DeviceTuple(device, &dtd)) {
67 if (dtd.dtd_DTtype == DTYPE_SRAM || dtd.dtd_DTtype == DTYPE_DRAM) {
68 CARDDEBUG(bug("RAM card found, size %d bytes, speed %d\n", dtd.dtd_DTsize, dtd.dtd_DTspeed));
69 if (!CopyTuple(ch, device, CISTPL_FORMAT, 0) && !CopyTuple(ch, device, CISTPL_GEOMETRY, 0) && dtd.dtd_DTspeed <= 250) {
70 if (addpcmciaram(CardResource, ch, &dtd)) {
71 CardAccessSpeed(ch, dtd.dtd_DTspeed);
72 CARDDEBUG(bug("Mapped as System RAM.\n"));
73 sysram = TRUE;
75 } else {
76 CARDDEBUG(bug("Not usable as System RAM.\n"));
83 EndCardAccess(ch);
85 ReleaseCard(ch, 0);
87 FreeVec(ch);
89 return sysram;
92 static int Cardres_Init(struct CardResource *CardResource)
94 UBYTE gayle;
95 struct CardMemoryMap *cmm;
96 struct Interrupt *intr;
97 volatile struct GayleIO *gio = (struct GayleIO*)GAYLE_BASE;
99 Disable();
100 gayle = ReadGayle();
101 Enable();
103 /* No Gayle = No PCMCIA slot */
104 if (!gayle)
105 return FALSE;
107 /* Address space conflict? */
108 if (TypeOfMem((UBYTE*)GAYLE_RAM + 0x1000) != 0)
109 return FALSE;
111 NEWLIST(&CardResource->handles);
112 cmm = &CardResource->cmm;
113 cmm->cmm_CommonMemory = (UBYTE*)GAYLE_RAM;
114 cmm->cmm_AttributeMemory = (UBYTE*)GAYLE_ATTRIBUTE;
115 cmm->cmm_IOMemory = (UBYTE*)GAYLE_IO;
116 cmm->cmm_CommonMemSize = GAYLE_RAMSIZE;
117 cmm->cmm_AttributeMemSize = GAYLE_ATTRIBYTESIZE;
118 cmm->cmm_IOMemSize = GAYLE_IOSIZE;
120 CARDDEBUG(bug("PCMCIA slot enabled\n"));
122 pcmcia_reset(CardResource);
123 pcmcia_enable();
125 CardResource->removed = TRUE;
126 if (gio->status & GAYLE_CS_CCDET) {
127 /* Card inserted */
128 CARDDEBUG(bug("Inserted PCMCIA card detected\n"));
129 pcmcia_cardreset(CardResource);
130 CardResource->removed = FALSE;
131 if (checkcard(CardResource)) {
132 CardResource->resetberr = GAYLE_IRQ_RESET;
133 pcmcia_clear_requests(CardResource);
134 /* Installed as Fast RAM. Do not initialize resource */
135 return 0;
139 CardResource->task = NewCreateTask(
140 TASKTAG_PC, CardTask,
141 TASKTAG_NAME, CardResource->crb_LibNode.lib_Node.ln_Name,
142 TASKTAG_PRI, 15,
143 TASKTAG_ARG1, FindTask(0),
144 TASKTAG_ARG2, CardResource,
145 TAG_DONE);
146 if (!CardResource->task)
147 return FALSE;
148 Wait(SIGBREAKF_CTRL_F);
150 Disable();
152 intr = &CardResource->level2;
153 intr->is_Node.ln_Pri = 127;
154 intr->is_Node.ln_Type = NT_INTERRUPT;
155 intr->is_Node.ln_Name = CardResource->crb_LibNode.lib_Node.ln_Name;
156 intr->is_Code = (APTR)card_level2;
157 intr->is_Data = CardResource;
158 AddIntServer(INTB_PORTS, intr);
160 intr = &CardResource->level6;
161 intr->is_Node.ln_Pri = -127;
162 intr->is_Node.ln_Type = NT_INTERRUPT;
163 intr->is_Node.ln_Name = CardResource->crb_LibNode.lib_Node.ln_Name;
164 intr->is_Code = (APTR)card_level6;
165 intr->is_Data = CardResource;
166 AddIntServer(INTB_EXTER, intr);
168 pcmcia_clear_requests(CardResource);
169 pcmcia_enable_interrupts();
171 Enable();
173 return TRUE;
176 ADD2INITLIB(Cardres_Init, 0)