34 #include <linux/types.h>
35 #include <linux/kernel.h>
38 #include <linux/pci.h>
40 #include <linux/slab.h>
42 #include <asm/byteorder.h>
61 #define DBG(x...) printk(x)
67 #define DBG_PORT(x...) printk(x)
69 #define DBG_PORT(x...)
73 #define DBG_CFG(x...) printk(x)
79 #define DBG_PAT(x...) printk(x)
99 #define MODULE_NAME "LBA"
102 #define LBA_PORT_BASE (PCI_F_EXTEND | 0xfee00000UL)
108 #define LBA_FLAG_SKIP_PROBE 0x10
110 #define LBA_SKIP_PROBE(d) ((d)->flags & LBA_FLAG_SKIP_PROBE)
114 #define LBA_DEV(d) ((struct lba_device *) (d))
121 #define LBA_MAX_NUM_BUSES 8
129 #define READ_U8(addr) __raw_readb(addr)
130 #define READ_U16(addr) __raw_readw(addr)
131 #define READ_U32(addr) __raw_readl(addr)
132 #define WRITE_U8(value, addr) __raw_writeb(value, addr)
133 #define WRITE_U16(value, addr) __raw_writew(value, addr)
134 #define WRITE_U32(value, addr) __raw_writel(value, addr)
136 #define READ_REG8(addr) readb(addr)
137 #define READ_REG16(addr) readw(addr)
138 #define READ_REG32(addr) readl(addr)
139 #define READ_REG64(addr) readq(addr)
140 #define WRITE_REG8(value, addr) writeb(value, addr)
141 #define WRITE_REG16(value, addr) writew(value, addr)
142 #define WRITE_REG32(value, addr) writel(value, addr)
145 #define LBA_CFG_TOK(bus,dfn) ((u32) ((bus)<<16 | (dfn)<<8))
146 #define LBA_CFG_BUS(tok) ((u8) ((tok)>>16))
147 #define LBA_CFG_DEV(tok) ((u8) ((tok)>>11) & 0x1f)
148 #define LBA_CFG_FUNC(tok) ((u8) ((tok)>>8 ) & 0x7)
155 #define ROPES_PER_IOC 8
156 #define LBA_NUM(x) ((((unsigned long) x) >> 13) & (ROPES_PER_IOC-1))
171 lba_dump_res(r->
child, d+2);
192 u8 first_bus = d->
hba.hba_bus->busn_res.start;
193 u8 last_sub_bus = d->
hba.hba_bus->busn_res.end;
195 if ((bus < first_bus) ||
196 (bus > last_sub_bus) ||
206 #define LBA_CFG_SETUP(d, tok) { \
208 error_config = READ_REG32(d->hba.base_addr + LBA_ERROR_CONFIG); \
211 status_control = READ_REG32(d->hba.base_addr + LBA_STAT_CTL); \
217 arb_mask = READ_REG32(d->hba.base_addr + LBA_ARB_MASK); \
223 WRITE_REG32(0x1, d->hba.base_addr + LBA_ARB_MASK); \
229 WRITE_REG32(error_config | LBA_SMART_MODE, d->hba.base_addr + LBA_ERROR_CONFIG); \
233 #define LBA_CFG_PROBE(d, tok) { \
238 WRITE_REG32(tok | PCI_VENDOR_ID, (d)->hba.base_addr + LBA_PCI_CFG_ADDR);\
243 lba_t32 = READ_REG32((d)->hba.base_addr + LBA_PCI_CFG_ADDR); \
248 WRITE_REG32(~0, (d)->hba.base_addr + LBA_PCI_CFG_DATA); \
253 lba_t32 = READ_REG32((d)->hba.base_addr + LBA_PCI_CFG_ADDR); \
281 #define LBA_MASTER_ABORT_ERROR 0xc
282 #define LBA_FATAL_ERROR 0x10
284 #define LBA_CFG_MASTER_ABORT_CHECK(d, base, tok, error) { \
285 u32 error_status = 0; \
290 WRITE_REG32(status_control | CLEAR_ERRLOG_ENABLE, base + LBA_STAT_CTL); \
291 error_status = READ_REG32(base + LBA_ERROR_STATUS); \
292 if ((error_status & 0x1f) != 0) { \
297 if ((error_status & LBA_FATAL_ERROR) == 0) { \
302 WRITE_REG32(status_control | CLEAR_ERRLOG, base + LBA_STAT_CTL); \
307 #define LBA_CFG_TR4_ADDR_SETUP(d, addr) \
308 WRITE_REG32(((addr) & ~3), (d)->hba.base_addr + LBA_PCI_CFG_ADDR);
310 #define LBA_CFG_ADDR_SETUP(d, addr) { \
311 WRITE_REG32(((addr) & ~3), (d)->hba.base_addr + LBA_PCI_CFG_ADDR); \
316 lba_t32 = READ_REG32((d)->hba.base_addr + LBA_PCI_CFG_ADDR); \
320 #define LBA_CFG_RESTORE(d, base) { \
324 WRITE_REG32(status_control, base + LBA_STAT_CTL); \
328 WRITE_REG32(error_config, base + LBA_ERROR_CONFIG); \
332 WRITE_REG32(arb_mask, base + LBA_ARB_MASK); \
343 u32 error_config = 0;
344 u32 status_control = 0;
354 case 1: data = (
u32)
READ_REG8(data_reg + (reg & 3));
break;
371 if ((pos > 255) || (devfn > 255))
378 *data = lba_rd_cfg(d, tok, pos, size);
379 DBG_CFG(
"%s(%x+%2x) -> 0x%x (a)\n", __func__, tok, pos, *data);
384 DBG_CFG(
"%s(%x+%2x) -> -1 (b)\n", __func__, tok, pos);
396 case 1: *data =
READ_REG8 (data_reg + (pos & 3));
break;
397 case 2: *data =
READ_REG16(data_reg + (pos & 2));
break;
400 DBG_CFG(
"%s(%x+%2x) -> 0x%x (c)\n", __func__, tok, pos, *data);
410 u32 error_config = 0;
411 u32 status_control = 0;
417 case 1:
WRITE_REG8 (data, data_reg + (reg & 3));
break;
418 case 2:
WRITE_REG16(data, data_reg + (reg & 2));
break;
431 static int elroy_cfg_write(
struct pci_bus *bus,
unsigned int devfn,
int pos,
int size,
u32 data)
437 if ((pos > 255) || (devfn > 255))
442 lba_wr_cfg(d, tok, pos, (
u32) data, size);
443 DBG_CFG(
"%s(%x+%2x) = 0x%x (a)\n", __func__, tok, pos,data);
448 DBG_CFG(
"%s(%x+%2x) = 0x%x (b)\n", __func__, tok, pos,data);
452 DBG_CFG(
"%s(%x+%2x) = 0x%x (c)\n", __func__, tok, pos, data);
470 static struct pci_ops elroy_cfg_ops = {
471 .read = elroy_cfg_read,
472 .write = elroy_cfg_write,
481 static int mercury_cfg_read(
struct pci_bus *bus,
unsigned int devfn,
int pos,
int size,
u32 *data)
488 if ((pos > 255) || (devfn > 255))
504 DBG_CFG(
"mercury_cfg_read(%x+%2x) -> 0x%x\n", tok, pos, *data);
513 static int mercury_cfg_write(
struct pci_bus *bus,
unsigned int devfn,
int pos,
int size,
u32 data)
520 if ((pos > 255) || (devfn > 255))
523 DBG_CFG(
"%s(%x+%2x) <- 0x%x (c)\n", __func__, tok, pos, data);
543 static struct pci_ops mercury_cfg_ops = {
544 .read = mercury_cfg_read,
545 .write = mercury_cfg_write,
574 unsigned long start =
new->start;
575 unsigned long end =
new->end;
578 if (end <= start || start < root->start || !tmp)
582 while (tmp && tmp->
end < start)
591 if (tmp->
start >= end)
return 0;
593 if (tmp->
start <= start) {
595 new->start = tmp->
end + 1;
597 if (tmp->
end >= end) {
603 if (tmp->
end < end ) {
605 new->end = tmp->
start - 1;
611 (
long)new->start, (
long)new->end );
617 #define truncate_pat_collision(r,n) (0)
630 lba_fixup_bus(
struct pci_bus *bus)
638 DBG(
"lba_fixup_bus(0x%p) bus %d platform_data 0x%p\n",
656 DBG(
"lba_fixup_bus() %s [%lx/%lx]/%lx\n",
657 ldev->
hba.io_space.name,
658 ldev->
hba.io_space.start, ldev->
hba.io_space.end,
659 ldev->
hba.io_space.flags);
660 DBG(
"lba_fixup_bus() %s [%lx/%lx]/%lx\n",
661 ldev->
hba.lmmio_space.name,
662 ldev->
hba.lmmio_space.start, ldev->
hba.lmmio_space.end,
663 ldev->
hba.lmmio_space.flags);
671 if (ldev->
hba.elmmio_space.start) {
673 &(ldev->
hba.elmmio_space));
676 printk(
"FAILED: lba_fixup_bus() request for "
677 "elmmio_space [%lx/%lx]\n",
678 (
long)ldev->
hba.elmmio_space.start,
679 (
long)ldev->
hba.elmmio_space.end);
686 if (ldev->
hba.lmmio_space.flags) {
690 "lmmio_space [%lx/%lx]\n",
691 (
long)ldev->
hba.lmmio_space.start,
692 (
long)ldev->
hba.lmmio_space.end);
698 if (ldev->
hba.gmmio_space.flags) {
701 printk(
"FAILED: lba_fixup_bus() request for "
702 "gmmio_space [%lx/%lx]\n",
703 (
long)ldev->
hba.gmmio_space.start,
704 (
long)ldev->
hba.gmmio_space.end);
716 DBG(
"lba_fixup_bus() %s\n", pci_name(dev));
782 .init = lba_bios_init,
783 .fixup_bus = lba_fixup_bus,
803 #define LBA_PORT_IN(size, mask) \
804 static u##size lba_astro_in##size (struct pci_hba_data *d, u16 addr) \
807 t = READ_REG##size(astro_iop_base + addr); \
808 DBG_PORT(" 0x%x\n", t); \
844 #define LBA_PORT_OUT(size, mask) \
845 static void lba_astro_out##size (struct pci_hba_data *d, u16 addr, u##size val) \
847 DBG_PORT("%s(0x%p, 0x%x, 0x%x)\n", __func__, d, addr, val); \
848 WRITE_REG##size(val, astro_iop_base + addr); \
849 if (LBA_DEV(d)->hw_rev < 3) \
850 lba_t32 = READ_U32(d->base_addr + LBA_FUNC_ID); \
859 .
inb = lba_astro_in8,
860 .inw = lba_astro_in16,
861 .inl = lba_astro_in32,
862 .outb = lba_astro_out8,
863 .outw = lba_astro_out16,
864 .outl = lba_astro_out32
869 #define PIOP_TO_GMMIO(lba, addr) \
870 ((lba)->iop_base + (((addr)&0xFFFC)<<10) + ((addr)&3))
885 #define LBA_PORT_IN(size, mask) \
886 static u##size lba_pat_in##size (struct pci_hba_data *l, u16 addr) \
889 DBG_PORT("%s(0x%p, 0x%x) ->", __func__, l, addr); \
890 t = READ_REG##size(PIOP_TO_GMMIO(LBA_DEV(l), addr)); \
891 DBG_PORT(" 0x%x\n", t); \
901 #define LBA_PORT_OUT(size, mask) \
902 static void lba_pat_out##size (struct pci_hba_data *l, u16 addr, u##size val) \
904 void __iomem *where = PIOP_TO_GMMIO(LBA_DEV(l), addr); \
905 DBG_PORT("%s(0x%p, 0x%x, 0x%x)\n", __func__, l, addr, val); \
906 WRITE_REG##size(val, where); \
908 lba_t32 = READ_U32(l->base_addr + LBA_FUNC_ID); \
920 .outb = lba_pat_out8,
921 .outw = lba_pat_out16,
922 .outl = lba_pat_out32
957 pa_count = pa_pdc_cell->
mod[1];
961 io_count = io_pdc_cell->
mod[1];
965 panic(
"pdc_pat_cell_module() call failed for LBA!\n");
969 panic(
"pdc_pat_cell_module() entity returned != PAT_ENTITY_LBA!\n");
975 for (i = 0; i < pa_count; i++) {
983 p = (
void *) &(pa_pdc_cell->
mod[2+i*3]);
984 io = (
void *) &(io_pdc_cell->
mod[2+i*3]);
987 switch(
p->type & 0xff) {
989 lba_dev->
hba.bus_num.start =
p->start;
990 lba_dev->
hba.bus_num.end =
p->end;
996 if (!lba_dev->
hba.lmmio_space.start) {
999 (
int)lba_dev->
hba.bus_num.start);
1000 lba_dev->
hba.lmmio_space_offset =
p->start -
1002 r = &lba_dev->
hba.lmmio_space;
1003 r->
name = lba_dev->
hba.lmmio_name;
1004 }
else if (!lba_dev->
hba.elmmio_space.start) {
1007 (
int)lba_dev->
hba.bus_num.start);
1008 r = &lba_dev->
hba.elmmio_space;
1009 r->
name = lba_dev->
hba.elmmio_name;
1012 " only supports 2 LMMIO resources!\n");
1024 sprintf(lba_dev->
hba.gmmio_name,
"PCI%02x GMMIO",
1025 (
int)lba_dev->
hba.bus_num.start);
1026 r = &lba_dev->
hba.gmmio_space;
1027 r->
name = lba_dev->
hba.gmmio_name;
1036 " range[%d] : ignoring NPIOP (0x%lx)\n",
1047 sprintf(lba_dev->
hba.io_name,
"PCI%02x Ports",
1048 (
int)lba_dev->
hba.bus_num.start);
1049 r = &lba_dev->
hba.io_space;
1050 r->
name = lba_dev->
hba.io_name;
1059 " range[%d] : unknown pat range type (0x%lx)\n",
1070 #define lba_pat_port_ops lba_astro_port_ops
1071 #define lba_pat_resources(pa_dev, lba_dev)
1095 r = &(lba_dev->
hba.bus_num);
1096 r->
name =
"LBA PCI Busses";
1097 r->
start = lba_num & 0xff;
1098 r->
end = (lba_num>>8) & 0xff;
1103 r = &(lba_dev->
hba.lmmio_space);
1104 sprintf(lba_dev->
hba.lmmio_name,
"PCI%02x LMMIO",
1105 (
int)lba_dev->
hba.bus_num.start);
1106 r->
name = lba_dev->
hba.lmmio_name;
1177 unsigned long rsize;
1181 r->
start &= mmio_mask;
1212 r = &(lba_dev->
hba.elmmio_space);
1213 sprintf(lba_dev->
hba.elmmio_name,
"PCI%02x ELMMIO",
1214 (
int)lba_dev->
hba.bus_num.start);
1215 r->
name = lba_dev->
hba.elmmio_name;
1224 unsigned long rsize;
1227 r->
start &= mmio_mask;
1234 r = &(lba_dev->
hba.io_space);
1235 sprintf(lba_dev->
hba.io_name,
"PCI%02x Ports",
1236 (
int)lba_dev->
hba.bus_num.start);
1237 r->
name = lba_dev->
hba.io_name;
1244 r->
start |= lba_num;
1268 printk(
KERN_DEBUG "LBA %lx STAT_CTL %Lx ERROR_CFG %Lx STATUS %Lx DMA_CTL %Lx\n",
1306 stat &= ~LBA_SMART_MODE;
1351 static unsigned int lba_next_bus = 0;
1374 if (IS_ELROY(dev)) {
1376 switch (func_class) {
1377 case 0: version =
"TR1.0";
break;
1378 case 1: version =
"TR2.0";
break;
1379 case 2: version =
"TR2.1";
break;
1380 case 3: version =
"TR2.2";
break;
1381 case 4: version =
"TR3.0";
break;
1382 case 5: version =
"TR4.0";
break;
1383 default: version =
"TR4+";
1387 version, func_class & 0xf, (
long)dev->
hpa.start);
1389 if (func_class < 2) {
1391 "TR2.1 - continuing under adversity.\n");
1398 if (func_class > 4) {
1399 cfg_ops = &mercury_cfg_ops;
1403 cfg_ops = &elroy_cfg_ops;
1406 }
else if (IS_MERCURY(dev) || IS_QUICKSILVER(dev)) {
1410 major = func_class >> 4, minor = func_class & 0xf;
1416 IS_MERCURY(dev) ?
"Mercury" :
"Quicksilver", major,
1417 minor, func_class, (
long)dev->
hpa.start);
1419 cfg_ops = &mercury_cfg_ops;
1422 (
long)dev->
hpa.start);
1442 lba_dev->
hw_rev = func_class;
1443 lba_dev->
hba.base_addr =
addr;
1447 parisc_set_drvdata(dev, lba_dev);
1454 if (lba_hw_init(lba_dev))
1465 if (!astro_iop_base) {
1472 lba_legacy_resources(dev, lba_dev);
1475 if (lba_dev->
hba.bus_num.start < lba_next_bus)
1476 lba_dev->
hba.bus_num.start = lba_next_bus;
1488 &(lba_dev->
hba.lmmio_space))) {
1490 (
long)lba_dev->
hba.lmmio_space.start,
1491 (
long)lba_dev->
hba.lmmio_space.end);
1492 lba_dev->
hba.lmmio_space.flags = 0;
1497 if (lba_dev->
hba.elmmio_space.start)
1499 lba_dev->
hba.lmmio_space_offset);
1500 if (lba_dev->
hba.lmmio_space.flags)
1502 lba_dev->
hba.lmmio_space_offset);
1503 if (lba_dev->
hba.gmmio_space.flags)
1508 dev->
dev.platform_data = lba_dev;
1509 lba_bus = lba_dev->
hba.hba_bus =
1523 DBG_PAT(
"LBA pci_bus_size_bridges()\n");
1526 DBG_PAT(
"LBA pci_bus_assign_resources()\n");
1529 #ifdef DEBUG_LBA_PAT
1530 DBG_PAT(
"\nLBA PIOP resource tree\n");
1531 lba_dump_res(&lba_dev->
hba.io_space, 2);
1532 DBG_PAT(
"\nLBA LMMIO resource tree\n");
1533 lba_dump_res(&lba_dev->
hba.lmmio_space, 2);
1543 if (cfg_ops == &elroy_cfg_ops) {
1547 lba_next_bus = max + 1;
1563 .id_table = lba_tbl,
1564 .probe = lba_driver_probe,
1588 WARN_ON((ibase & 0x001fffff) != 0);
1589 WARN_ON((imask & 0x001fffff) != 0);
1591 DBG(
"%s() ibase 0x%x imask 0x%x\n", __func__, ibase, imask);