0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015 #undef DEBUG
0016
0017 #include <linux/types.h>
0018 #include <linux/kernel.h>
0019 #include <linux/slab.h>
0020 #include <linux/device.h>
0021 #include <linux/interrupt.h>
0022 #include <linux/module.h>
0023 #include <linux/pci.h>
0024 #include <linux/dma-mapping.h>
0025 #include <linux/kernel_stat.h>
0026 #include <linux/of_address.h>
0027 #include <linux/of_irq.h>
0028
0029 #include <asm/io.h>
0030 #include <asm/machdep.h>
0031 #include <asm/pmac_feature.h>
0032 #include <asm/dbdma.h>
0033 #include <asm/macio.h>
0034 #include <asm/keylargo.h>
0035
0036
0037 #define SAMPLE_COUNT 256
0038
0039
0040 #define CPU_SAMPLING_RATE 250
0041
0042 struct rackmeter_dma {
0043 struct dbdma_cmd cmd[4] ____cacheline_aligned;
0044 u32 mark ____cacheline_aligned;
0045 u32 buf1[SAMPLE_COUNT] ____cacheline_aligned;
0046 u32 buf2[SAMPLE_COUNT] ____cacheline_aligned;
0047 } ____cacheline_aligned;
0048
0049 struct rackmeter_cpu {
0050 struct delayed_work sniffer;
0051 struct rackmeter *rm;
0052 u64 prev_wall;
0053 u64 prev_idle;
0054 int zero;
0055 } ____cacheline_aligned;
0056
0057 struct rackmeter {
0058 struct macio_dev *mdev;
0059 unsigned int irq;
0060 struct device_node *i2s;
0061 u8 *ubuf;
0062 struct dbdma_regs __iomem *dma_regs;
0063 void __iomem *i2s_regs;
0064 dma_addr_t dma_buf_p;
0065 struct rackmeter_dma *dma_buf_v;
0066 int stale_irq;
0067 struct rackmeter_cpu cpu[2];
0068 int paused;
0069 struct mutex sem;
0070 };
0071
0072
0073 static int rackmeter_ignore_nice;
0074
0075
0076 #define RACKMETER_MAGIC_GPIO 0x78
0077
0078
0079
0080
0081 static inline u64 get_cpu_idle_time(unsigned int cpu)
0082 {
0083 struct kernel_cpustat *kcpustat = &kcpustat_cpu(cpu);
0084 u64 retval;
0085
0086 retval = kcpustat->cpustat[CPUTIME_IDLE] +
0087 kcpustat->cpustat[CPUTIME_IOWAIT];
0088
0089 if (rackmeter_ignore_nice)
0090 retval += kcpustat_field(kcpustat, CPUTIME_NICE, cpu);
0091
0092 return retval;
0093 }
0094
0095 static void rackmeter_setup_i2s(struct rackmeter *rm)
0096 {
0097 struct macio_chip *macio = rm->mdev->bus->chip;
0098
0099
0100 pmac_call_feature(PMAC_FTR_WRITE_GPIO, NULL, RACKMETER_MAGIC_GPIO, 5);
0101
0102
0103
0104
0105
0106 pmac_call_feature(PMAC_FTR_SOUND_CHIP_ENABLE, rm->i2s, 0, 1);
0107
0108
0109
0110
0111
0112 MACIO_BIS(KEYLARGO_FCR1, KL1_I2S0_ENABLE);
0113 MACIO_BIC(KEYLARGO_FCR1, KL1_I2S0_CLK_ENABLE_BIT);
0114 (void)MACIO_IN32(KEYLARGO_FCR1);
0115 udelay(10);
0116
0117
0118
0119
0120
0121 out_le32(rm->i2s_regs + 0x10, 0x01fa0000);
0122 (void)in_le32(rm->i2s_regs + 0x10);
0123 udelay(10);
0124
0125
0126 MACIO_BIS(KEYLARGO_FCR1, KL1_I2S0_CELL_ENABLE |
0127 KL1_I2S0_CLK_ENABLE_BIT);
0128 (void)MACIO_IN32(KEYLARGO_FCR1);
0129 udelay(10);
0130 }
0131
0132 static void rackmeter_set_default_pattern(struct rackmeter *rm)
0133 {
0134 int i;
0135
0136 for (i = 0; i < 16; i++) {
0137 if (i < 8)
0138 rm->ubuf[i] = (i & 1) * 255;
0139 else
0140 rm->ubuf[i] = ((~i) & 1) * 255;
0141 }
0142 }
0143
0144 static void rackmeter_do_pause(struct rackmeter *rm, int pause)
0145 {
0146 struct rackmeter_dma *rdma = rm->dma_buf_v;
0147
0148 pr_debug("rackmeter: %s\n", pause ? "paused" : "started");
0149
0150 rm->paused = pause;
0151 if (pause) {
0152 DBDMA_DO_STOP(rm->dma_regs);
0153 return;
0154 }
0155 memset(rdma->buf1, 0, sizeof(rdma->buf1));
0156 memset(rdma->buf2, 0, sizeof(rdma->buf2));
0157
0158 rm->dma_buf_v->mark = 0;
0159
0160 mb();
0161 out_le32(&rm->dma_regs->cmdptr_hi, 0);
0162 out_le32(&rm->dma_regs->cmdptr, rm->dma_buf_p);
0163 out_le32(&rm->dma_regs->control, (RUN << 16) | RUN);
0164 }
0165
0166 static void rackmeter_setup_dbdma(struct rackmeter *rm)
0167 {
0168 struct rackmeter_dma *db = rm->dma_buf_v;
0169 struct dbdma_cmd *cmd = db->cmd;
0170
0171
0172 DBDMA_DO_RESET(rm->dma_regs);
0173
0174 pr_debug("rackmeter: mark offset=0x%zx\n",
0175 offsetof(struct rackmeter_dma, mark));
0176 pr_debug("rackmeter: buf1 offset=0x%zx\n",
0177 offsetof(struct rackmeter_dma, buf1));
0178 pr_debug("rackmeter: buf2 offset=0x%zx\n",
0179 offsetof(struct rackmeter_dma, buf2));
0180
0181
0182 memset(cmd, 0, 4 * sizeof(struct dbdma_cmd));
0183 cmd->req_count = cpu_to_le16(4);
0184 cmd->command = cpu_to_le16(STORE_WORD | INTR_ALWAYS | KEY_SYSTEM);
0185 cmd->phy_addr = cpu_to_le32(rm->dma_buf_p +
0186 offsetof(struct rackmeter_dma, mark));
0187 cmd->cmd_dep = cpu_to_le32(0x02000000);
0188 cmd++;
0189
0190 cmd->req_count = cpu_to_le16(SAMPLE_COUNT * 4);
0191 cmd->command = cpu_to_le16(OUTPUT_MORE);
0192 cmd->phy_addr = cpu_to_le32(rm->dma_buf_p +
0193 offsetof(struct rackmeter_dma, buf1));
0194 cmd++;
0195
0196 cmd->req_count = cpu_to_le16(4);
0197 cmd->command = cpu_to_le16(STORE_WORD | INTR_ALWAYS | KEY_SYSTEM);
0198 cmd->phy_addr = cpu_to_le32(rm->dma_buf_p +
0199 offsetof(struct rackmeter_dma, mark));
0200 cmd->cmd_dep = cpu_to_le32(0x01000000);
0201 cmd++;
0202
0203 cmd->req_count = cpu_to_le16(SAMPLE_COUNT * 4);
0204 cmd->command = cpu_to_le16(OUTPUT_MORE | BR_ALWAYS);
0205 cmd->phy_addr = cpu_to_le32(rm->dma_buf_p +
0206 offsetof(struct rackmeter_dma, buf2));
0207 cmd->cmd_dep = cpu_to_le32(rm->dma_buf_p);
0208
0209 rackmeter_do_pause(rm, 0);
0210 }
0211
0212 static void rackmeter_do_timer(struct work_struct *work)
0213 {
0214 struct rackmeter_cpu *rcpu =
0215 container_of(work, struct rackmeter_cpu, sniffer.work);
0216 struct rackmeter *rm = rcpu->rm;
0217 unsigned int cpu = smp_processor_id();
0218 u64 cur_nsecs, total_idle_nsecs;
0219 u64 total_nsecs, idle_nsecs;
0220 int i, offset, load, cumm, pause;
0221
0222 cur_nsecs = jiffies64_to_nsecs(get_jiffies_64());
0223 total_nsecs = cur_nsecs - rcpu->prev_wall;
0224 rcpu->prev_wall = cur_nsecs;
0225
0226 total_idle_nsecs = get_cpu_idle_time(cpu);
0227 idle_nsecs = total_idle_nsecs - rcpu->prev_idle;
0228 idle_nsecs = min(idle_nsecs, total_nsecs);
0229 rcpu->prev_idle = total_idle_nsecs;
0230
0231
0232
0233
0234 load = div64_u64(9 * (total_nsecs - idle_nsecs), total_nsecs);
0235
0236 offset = cpu << 3;
0237 cumm = 0;
0238 for (i = 0; i < 8; i++) {
0239 u8 ub = (load > i) ? 0xff : 0;
0240 rm->ubuf[i + offset] = ub;
0241 cumm |= ub;
0242 }
0243 rcpu->zero = (cumm == 0);
0244
0245
0246 pause = (rm->cpu[0].zero && rm->cpu[1].zero);
0247 if (pause != rm->paused) {
0248 mutex_lock(&rm->sem);
0249 pause = (rm->cpu[0].zero && rm->cpu[1].zero);
0250 rackmeter_do_pause(rm, pause);
0251 mutex_unlock(&rm->sem);
0252 }
0253 schedule_delayed_work_on(cpu, &rcpu->sniffer,
0254 msecs_to_jiffies(CPU_SAMPLING_RATE));
0255 }
0256
0257 static void rackmeter_init_cpu_sniffer(struct rackmeter *rm)
0258 {
0259 unsigned int cpu;
0260
0261
0262
0263
0264
0265
0266
0267 rm->cpu[0].rm = rm;
0268 INIT_DELAYED_WORK(&rm->cpu[0].sniffer, rackmeter_do_timer);
0269 rm->cpu[1].rm = rm;
0270 INIT_DELAYED_WORK(&rm->cpu[1].sniffer, rackmeter_do_timer);
0271
0272 for_each_online_cpu(cpu) {
0273 struct rackmeter_cpu *rcpu;
0274
0275 if (cpu > 1)
0276 continue;
0277 rcpu = &rm->cpu[cpu];
0278 rcpu->prev_idle = get_cpu_idle_time(cpu);
0279 rcpu->prev_wall = jiffies64_to_nsecs(get_jiffies_64());
0280 schedule_delayed_work_on(cpu, &rm->cpu[cpu].sniffer,
0281 msecs_to_jiffies(CPU_SAMPLING_RATE));
0282 }
0283 }
0284
0285 static void rackmeter_stop_cpu_sniffer(struct rackmeter *rm)
0286 {
0287 cancel_delayed_work_sync(&rm->cpu[0].sniffer);
0288 cancel_delayed_work_sync(&rm->cpu[1].sniffer);
0289 }
0290
0291 static int rackmeter_setup(struct rackmeter *rm)
0292 {
0293 pr_debug("rackmeter: setting up i2s..\n");
0294 rackmeter_setup_i2s(rm);
0295
0296 pr_debug("rackmeter: setting up default pattern..\n");
0297 rackmeter_set_default_pattern(rm);
0298
0299 pr_debug("rackmeter: setting up dbdma..\n");
0300 rackmeter_setup_dbdma(rm);
0301
0302 pr_debug("rackmeter: start CPU measurements..\n");
0303 rackmeter_init_cpu_sniffer(rm);
0304
0305 printk(KERN_INFO "RackMeter initialized\n");
0306
0307 return 0;
0308 }
0309
0310
0311 static u32 rackmeter_calc_sample(struct rackmeter *rm, unsigned int index)
0312 {
0313 int led;
0314 u32 sample = 0;
0315
0316 for (led = 0; led < 16; led++) {
0317 sample >>= 1;
0318 sample |= ((rm->ubuf[led] >= 0x80) << 15);
0319 }
0320 return (sample << 17) | (sample >> 15);
0321 }
0322
0323 static irqreturn_t rackmeter_irq(int irq, void *arg)
0324 {
0325 struct rackmeter *rm = arg;
0326 struct rackmeter_dma *db = rm->dma_buf_v;
0327 unsigned int mark, i;
0328 u32 *buf;
0329
0330
0331
0332
0333
0334 (void)in_le32(&rm->dma_regs->status);
0335
0336
0337 rmb();
0338
0339
0340 mark = db->mark;
0341 if (mark != 1 && mark != 2) {
0342 printk(KERN_WARNING "rackmeter: Incorrect DMA mark 0x%08x\n",
0343 mark);
0344
0345 if (++rm->stale_irq > 3) {
0346 printk(KERN_ERR "rackmeter: Too many errors,"
0347 " stopping DMA\n");
0348 DBDMA_DO_RESET(rm->dma_regs);
0349 }
0350 return IRQ_HANDLED;
0351 }
0352
0353
0354 buf = mark == 1 ? db->buf1 : db->buf2;
0355
0356
0357
0358
0359 for (i = 0; i < SAMPLE_COUNT; i++)
0360 buf[i] = rackmeter_calc_sample(rm, i);
0361
0362
0363 return IRQ_HANDLED;
0364 }
0365
0366 static int rackmeter_probe(struct macio_dev* mdev,
0367 const struct of_device_id *match)
0368 {
0369 struct device_node *i2s = NULL, *np = NULL;
0370 struct rackmeter *rm = NULL;
0371 struct resource ri2s, rdma;
0372 int rc = -ENODEV;
0373
0374 pr_debug("rackmeter_probe()\n");
0375
0376
0377 for_each_child_of_node(mdev->ofdev.dev.of_node, i2s)
0378 if (of_node_name_eq(i2s, "i2s-a"))
0379 break;
0380
0381 if (i2s == NULL) {
0382 pr_debug(" i2s-a child not found\n");
0383 goto bail;
0384 }
0385
0386 for_each_child_of_node(i2s, np) {
0387 if (of_node_name_eq(np, "lightshow"))
0388 break;
0389 if (of_node_name_eq(np, "sound") &&
0390 of_get_property(np, "virtual", NULL) != NULL)
0391 break;
0392 }
0393 if (np == NULL) {
0394 pr_debug(" lightshow or sound+virtual child not found\n");
0395 goto bail;
0396 }
0397
0398
0399 rm = kzalloc(sizeof(*rm), GFP_KERNEL);
0400 if (rm == NULL) {
0401 printk(KERN_ERR "rackmeter: failed to allocate memory !\n");
0402 rc = -ENOMEM;
0403 goto bail_release;
0404 }
0405 rm->mdev = mdev;
0406 rm->i2s = i2s;
0407 mutex_init(&rm->sem);
0408 dev_set_drvdata(&mdev->ofdev.dev, rm);
0409
0410 #if 0
0411 if (macio_resource_count(mdev) < 2 || macio_irq_count(mdev) < 2) {
0412 printk(KERN_ERR
0413 "rackmeter: found match but lacks resources: %pOF"
0414 " (%d resources, %d interrupts)\n",
0415 mdev->ofdev.dev.of_node);
0416 rc = -ENXIO;
0417 goto bail_free;
0418 }
0419 if (macio_request_resources(mdev, "rackmeter")) {
0420 printk(KERN_ERR
0421 "rackmeter: failed to request resources: %pOF\n",
0422 mdev->ofdev.dev.of_node);
0423 rc = -EBUSY;
0424 goto bail_free;
0425 }
0426 rm->irq = macio_irq(mdev, 1);
0427 #else
0428 rm->irq = irq_of_parse_and_map(i2s, 1);
0429 if (!rm->irq ||
0430 of_address_to_resource(i2s, 0, &ri2s) ||
0431 of_address_to_resource(i2s, 1, &rdma)) {
0432 printk(KERN_ERR
0433 "rackmeter: found match but lacks resources: %pOF",
0434 mdev->ofdev.dev.of_node);
0435 rc = -ENXIO;
0436 goto bail_free;
0437 }
0438 #endif
0439
0440 pr_debug(" i2s @0x%08x\n", (unsigned int)ri2s.start);
0441 pr_debug(" dma @0x%08x\n", (unsigned int)rdma.start);
0442 pr_debug(" irq %d\n", rm->irq);
0443
0444 rm->ubuf = (u8 *)__get_free_page(GFP_KERNEL);
0445 if (rm->ubuf == NULL) {
0446 printk(KERN_ERR
0447 "rackmeter: failed to allocate samples page !\n");
0448 rc = -ENOMEM;
0449 goto bail_release;
0450 }
0451
0452 rm->dma_buf_v = dma_alloc_coherent(&macio_get_pci_dev(mdev)->dev,
0453 sizeof(struct rackmeter_dma),
0454 &rm->dma_buf_p, GFP_KERNEL);
0455 if (rm->dma_buf_v == NULL) {
0456 printk(KERN_ERR
0457 "rackmeter: failed to allocate dma buffer !\n");
0458 rc = -ENOMEM;
0459 goto bail_free_samples;
0460 }
0461 #if 0
0462 rm->i2s_regs = ioremap(macio_resource_start(mdev, 0), 0x1000);
0463 #else
0464 rm->i2s_regs = ioremap(ri2s.start, 0x1000);
0465 #endif
0466 if (rm->i2s_regs == NULL) {
0467 printk(KERN_ERR
0468 "rackmeter: failed to map i2s registers !\n");
0469 rc = -ENXIO;
0470 goto bail_free_dma;
0471 }
0472 #if 0
0473 rm->dma_regs = ioremap(macio_resource_start(mdev, 1), 0x100);
0474 #else
0475 rm->dma_regs = ioremap(rdma.start, 0x100);
0476 #endif
0477 if (rm->dma_regs == NULL) {
0478 printk(KERN_ERR
0479 "rackmeter: failed to map dma registers !\n");
0480 rc = -ENXIO;
0481 goto bail_unmap_i2s;
0482 }
0483
0484 rc = rackmeter_setup(rm);
0485 if (rc) {
0486 printk(KERN_ERR
0487 "rackmeter: failed to initialize !\n");
0488 rc = -ENXIO;
0489 goto bail_unmap_dma;
0490 }
0491
0492 rc = request_irq(rm->irq, rackmeter_irq, 0, "rackmeter", rm);
0493 if (rc != 0) {
0494 printk(KERN_ERR
0495 "rackmeter: failed to request interrupt !\n");
0496 goto bail_stop_dma;
0497 }
0498 of_node_put(np);
0499 return 0;
0500
0501 bail_stop_dma:
0502 DBDMA_DO_RESET(rm->dma_regs);
0503 bail_unmap_dma:
0504 iounmap(rm->dma_regs);
0505 bail_unmap_i2s:
0506 iounmap(rm->i2s_regs);
0507 bail_free_dma:
0508 dma_free_coherent(&macio_get_pci_dev(mdev)->dev,
0509 sizeof(struct rackmeter_dma),
0510 rm->dma_buf_v, rm->dma_buf_p);
0511 bail_free_samples:
0512 free_page((unsigned long)rm->ubuf);
0513 bail_release:
0514 #if 0
0515 macio_release_resources(mdev);
0516 #endif
0517 bail_free:
0518 kfree(rm);
0519 bail:
0520 of_node_put(i2s);
0521 of_node_put(np);
0522 dev_set_drvdata(&mdev->ofdev.dev, NULL);
0523 return rc;
0524 }
0525
0526 static int rackmeter_remove(struct macio_dev* mdev)
0527 {
0528 struct rackmeter *rm = dev_get_drvdata(&mdev->ofdev.dev);
0529
0530
0531 rackmeter_stop_cpu_sniffer(rm);
0532
0533
0534 dev_set_drvdata(&mdev->ofdev.dev, NULL);
0535
0536
0537 DBDMA_DO_RESET(rm->dma_regs);
0538
0539
0540 free_irq(rm->irq, rm);
0541
0542
0543 iounmap(rm->dma_regs);
0544 iounmap(rm->i2s_regs);
0545
0546
0547 dma_free_coherent(&macio_get_pci_dev(mdev)->dev,
0548 sizeof(struct rackmeter_dma),
0549 rm->dma_buf_v, rm->dma_buf_p);
0550
0551
0552 free_page((unsigned long)rm->ubuf);
0553
0554 #if 0
0555
0556 macio_release_resources(mdev);
0557 #endif
0558
0559
0560 kfree(rm);
0561
0562 return 0;
0563 }
0564
0565 static int rackmeter_shutdown(struct macio_dev* mdev)
0566 {
0567 struct rackmeter *rm = dev_get_drvdata(&mdev->ofdev.dev);
0568
0569 if (rm == NULL)
0570 return -ENODEV;
0571
0572
0573 rackmeter_stop_cpu_sniffer(rm);
0574
0575
0576 DBDMA_DO_RESET(rm->dma_regs);
0577
0578 return 0;
0579 }
0580
0581 static const struct of_device_id rackmeter_match[] = {
0582 { .name = "i2s" },
0583 { }
0584 };
0585 MODULE_DEVICE_TABLE(of, rackmeter_match);
0586
0587 static struct macio_driver rackmeter_driver = {
0588 .driver = {
0589 .name = "rackmeter",
0590 .owner = THIS_MODULE,
0591 .of_match_table = rackmeter_match,
0592 },
0593 .probe = rackmeter_probe,
0594 .remove = rackmeter_remove,
0595 .shutdown = rackmeter_shutdown,
0596 };
0597
0598
0599 static int __init rackmeter_init(void)
0600 {
0601 pr_debug("rackmeter_init()\n");
0602
0603 return macio_register_driver(&rackmeter_driver);
0604 }
0605
0606 static void __exit rackmeter_exit(void)
0607 {
0608 pr_debug("rackmeter_exit()\n");
0609
0610 macio_unregister_driver(&rackmeter_driver);
0611 }
0612
0613 module_init(rackmeter_init);
0614 module_exit(rackmeter_exit);
0615
0616
0617 MODULE_LICENSE("GPL");
0618 MODULE_AUTHOR("Benjamin Herrenschmidt <benh@kernel.crashing.org>");
0619 MODULE_DESCRIPTION("RackMeter: Support vu-meter on XServe front panel");