Lines Matching +full:4 +full:- +full:ch
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
4 * Copyright (c) 1998 - 2008 Søren Schmidt <sos@FreeBSD.org>
48 #include <dev/ata/ata-all.h>
49 #include <dev/ata/ata-pci.h>
66 struct resource *bars[4];
78 { ATA_ALI_5288, 0x00, 4, ALI_SATA, ATA_SA300, "M5288" }, in ata_ali_probe()
79 { ATA_ALI_5287, 0x00, 4, ALI_SATA, ATA_SA150, "M5287" }, in ata_ali_probe()
92 if (!(ctlr->chip = ata_match_chip(dev, ids))) in ata_ali_probe()
96 ctlr->chipinit = ata_ali_chipinit; in ata_ali_probe()
97 ctlr->chipdeinit = ata_ali_chipdeinit; in ata_ali_probe()
111 switch (ctlr->chip->cfg2) { in ata_ali_chipinit()
113 ctlr->channels = ctlr->chip->cfg1; in ata_ali_chipinit()
114 ctlr->ch_attach = ata_ali_sata_ch_attach; in ata_ali_chipinit()
115 ctlr->ch_detach = ata_pci_ch_detach; in ata_ali_chipinit()
116 ctlr->setmode = ata_sata_setmode; in ata_ali_chipinit()
117 ctlr->getrev = ata_sata_getrev; in ata_ali_chipinit()
121 for (i = 0; i < 4; i++) { in ata_ali_chipinit()
123 res->bars[i] = bus_alloc_resource_any(dev, SYS_RES_IOPORT, &rid, in ata_ali_chipinit()
125 if (res->bars[i] == NULL) { in ata_ali_chipinit()
127 for (i--; i >=0; i--) in ata_ali_chipinit()
129 PCIR_BAR(i), res->bars[i]); in ata_ali_chipinit()
134 ctlr->chipset_data = res; in ata_ali_chipinit()
142 if (ctlr->chip->chiprev < 0xc7) in ata_ali_chipinit()
148 (ctlr->chip->chiprev >= 0xc7 ? 0x03 : 0x01), 1); in ata_ali_chipinit()
151 if (ctlr->chip->chiprev <= 0xc4) in ata_ali_chipinit()
155 ctlr->ch_attach = ata_ali_ch_attach; in ata_ali_chipinit()
156 ctlr->ch_detach = ata_pci_ch_detach; in ata_ali_chipinit()
157 ctlr->reset = ata_ali_reset; in ata_ali_chipinit()
158 ctlr->setmode = ata_ali_setmode; in ata_ali_chipinit()
164 ctlr->setmode = ata_ali_setmode; in ata_ali_chipinit()
177 if (ctlr->chip->cfg2 == ALI_SATA) { in ata_ali_chipdeinit()
178 res = ctlr->chipset_data; in ata_ali_chipdeinit()
179 for (i = 0; i < 4; i++) { in ata_ali_chipdeinit()
180 if (res->bars[i] != NULL) { in ata_ali_chipdeinit()
182 PCIR_BAR(i), res->bars[i]); in ata_ali_chipdeinit()
186 ctlr->chipset_data = NULL; in ata_ali_chipdeinit()
195 struct ata_channel *ch = device_get_softc(dev); in ata_ali_ch_attach() local
201 if (ctlr->chip->cfg2 & ALI_NEW && ctlr->chip->chiprev < 0xc7) in ata_ali_ch_attach()
202 ch->flags |= ATA_CHECKS_CABLE; in ata_ali_ch_attach()
204 if (ctlr->chip->chiprev <= 0xc4) { in ata_ali_ch_attach()
205 ch->flags |= ATA_NO_48BIT_DMA; in ata_ali_ch_attach()
206 if (ch->dma.max_iosize > 256 * 512) in ata_ali_ch_attach()
207 ch->dma.max_iosize = 256 * 512; in ata_ali_ch_attach()
209 if (ctlr->chip->cfg2 & ALI_NEW) in ata_ali_ch_attach()
210 ch->flags |= ATA_NO_ATAPI_DMA; in ata_ali_ch_attach()
220 struct ata_channel *ch = device_get_softc(dev); in ata_ali_sata_ch_attach() local
223 int unit01 = (ch->unit & 1), unit10 = (ch->unit & 2); in ata_ali_sata_ch_attach()
226 res = ctlr->chipset_data; in ata_ali_sata_ch_attach()
228 io = res->bars[2]; in ata_ali_sata_ch_attach()
229 ctlio = res->bars[3]; in ata_ali_sata_ch_attach()
231 io = res->bars[0]; in ata_ali_sata_ch_attach()
232 ctlio = res->bars[1]; in ata_ali_sata_ch_attach()
236 ch->r_io[i].res = io; in ata_ali_sata_ch_attach()
237 ch->r_io[i].offset = i + (unit10 ? 8 : 0); in ata_ali_sata_ch_attach()
239 ch->r_io[ATA_CONTROL].res = ctlio; in ata_ali_sata_ch_attach()
240 ch->r_io[ATA_CONTROL].offset = 2 + (unit10 ? 4 : 0); in ata_ali_sata_ch_attach()
241 ch->r_io[ATA_IDX_ADDR].res = io; in ata_ali_sata_ch_attach()
243 if (ctlr->r_res1) { in ata_ali_sata_ch_attach()
245 ch->r_io[i].res = ctlr->r_res1; in ata_ali_sata_ch_attach()
246 ch->r_io[i].offset = (i - ATA_BMCMD_PORT)+(ch->unit * ATA_BMIOSIZE); in ata_ali_sata_ch_attach()
249 ch->flags |= ATA_NO_SLAVE; in ata_ali_sata_ch_attach()
250 ch->flags |= ATA_SATA; in ata_ali_sata_ch_attach()
261 struct ata_channel *ch = device_get_softc(dev); in ata_ali_reset() local
268 * workaround for datacorruption bug found on at least SUN Blade-100 in ata_ali_reset()
272 if (ctlr->chip->chiprev == 0xc3 || ctlr->chip->chiprev == 0xc2) { in ata_ali_reset()
278 ~(0x04 << ch->unit), 1); in ata_ali_reset()
281 (0x04 << ch->unit), 1); in ata_ali_reset()
295 struct ata_channel *ch = device_get_softc(dev); in ata_ali_setmode() local
296 int devno = (ch->unit << 1) + target; in ata_ali_setmode()
305 mode = min(mode, ctlr->chip->max_dma); in ata_ali_setmode()
307 if (ctlr->chip->cfg2 & ALI_NEW && ctlr->chip->chiprev < 0xc7) { in ata_ali_setmode()
309 pci_read_config(parent, 0x4a, 1) & (1 << ch->unit)) { in ata_ali_setmode()
314 if (ctlr->chip->cfg2 & ALI_OLD) { in ata_ali_setmode()
316 ch->flags |= ATA_ATAPI_DMA_RO; in ata_ali_setmode()
317 if (ch->devices & ATA_ATAPI_MASTER && in ata_ali_setmode()
318 ch->devices & ATA_ATAPI_SLAVE) { in ata_ali_setmode()
326 word54 = pci_read_config(parent, 0x54, 4); in ata_ali_setmode()
336 pci_write_config(parent, 0x54, word54, 4); in ata_ali_setmode()
338 pci_write_config(parent, 0x58 + (ch->unit << 2), in ata_ali_setmode()
339 piotimings[ata_mode2idx(piomode)], 4); in ata_ali_setmode()