This source file includes following definitions.
- parse_core_table_entry_v0
- dbg_cte
- parse_core_table_entry
- probe_core_basic
- offset_show
- size_show
- type_show
- s2c_dma_show
- c2s_dma_show
- irq_count_show
- irq_base_num_show
- core_num_show
- kp2000_check_uio_irq
- kuio_handler
- kuio_irqcontrol
- probe_core_uio
- create_dma_engine_core
- kp2000_setup_dma_controller
- kp2000_probe_cores
- kp2000_remove_cores
1
2 #include <linux/module.h>
3 #include <linux/pci.h>
4 #include <linux/types.h>
5 #include <linux/export.h>
6 #include <linux/slab.h>
7 #include <linux/io.h>
8 #include <linux/io-64-nonatomic-lo-hi.h>
9 #include <linux/mfd/core.h>
10 #include <linux/platform_device.h>
11 #include <linux/ioport.h>
12 #include <linux/uio_driver.h>
13 #include "pcie.h"
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 #define KPC_OLD_DMA_CH_NUM(present, channel) ((present) ? (0x8 | ((channel) & 0x7)) : 0)
34 #define KPC_OLD_S2C_DMA_CH_NUM(cte) KPC_OLD_DMA_CH_NUM(cte.s2c_dma_present, cte.s2c_dma_channel_num)
35 #define KPC_OLD_C2S_DMA_CH_NUM(cte) KPC_OLD_DMA_CH_NUM(cte.c2s_dma_present, cte.c2s_dma_channel_num)
36
37 #define KP_CORE_ID_INVALID 0
38 #define KP_CORE_ID_I2C 3
39 #define KP_CORE_ID_SPI 5
40
41 struct core_table_entry {
42 u16 type;
43 u32 offset;
44 u32 length;
45 bool s2c_dma_present;
46 u8 s2c_dma_channel_num;
47 bool c2s_dma_present;
48 u8 c2s_dma_channel_num;
49 u8 irq_count;
50 u8 irq_base_num;
51 };
52
53 static
54 void parse_core_table_entry_v0(struct core_table_entry *cte, const u64 read_val)
55 {
56 cte->type = ((read_val & 0xFFF0000000000000UL) >> 52);
57 cte->offset = ((read_val & 0x00000000FFFF0000UL) >> 16) * 4096;
58 cte->length = ((read_val & 0x0000FFFF00000000UL) >> 32) * 8;
59 cte->s2c_dma_present = ((read_val & 0x0008000000000000UL) >> 51);
60 cte->s2c_dma_channel_num = ((read_val & 0x0007000000000000UL) >> 48);
61 cte->c2s_dma_present = ((read_val & 0x0000000000008000UL) >> 15);
62 cte->c2s_dma_channel_num = ((read_val & 0x0000000000007000UL) >> 12);
63 cte->irq_count = ((read_val & 0x0000000000000C00UL) >> 10);
64 cte->irq_base_num = ((read_val & 0x00000000000003F8UL) >> 3);
65 }
66
67 static
68 void dbg_cte(struct kp2000_device *pcard, struct core_table_entry *cte)
69 {
70 dev_dbg(&pcard->pdev->dev, "CTE: type:%3d offset:%3d (%3d) length:%3d (%3d) s2c:%d c2s:%d irq_count:%d base_irq:%d\n",
71 cte->type,
72 cte->offset,
73 cte->offset / 4096,
74 cte->length,
75 cte->length / 8,
76 (cte->s2c_dma_present ? cte->s2c_dma_channel_num : -1),
77 (cte->c2s_dma_present ? cte->c2s_dma_channel_num : -1),
78 cte->irq_count,
79 cte->irq_base_num
80 );
81 }
82
83 static
84 void parse_core_table_entry(struct core_table_entry *cte, const u64 read_val, const u8 entry_rev)
85 {
86 switch (entry_rev) {
87 case 0:
88 parse_core_table_entry_v0(cte, read_val);
89 break;
90 default:
91 cte->type = 0;
92 break;
93 }
94 }
95
96 static int probe_core_basic(unsigned int core_num, struct kp2000_device *pcard,
97 char *name, const struct core_table_entry cte)
98 {
99 struct mfd_cell cell = { .id = core_num, .name = name };
100 struct resource resources[2];
101
102 struct kpc_core_device_platdata core_pdata = {
103 .card_id = pcard->card_id,
104 .build_version = pcard->build_version,
105 .hardware_revision = pcard->hardware_revision,
106 .ssid = pcard->ssid,
107 .ddna = pcard->ddna,
108 };
109
110 dev_dbg(&pcard->pdev->dev, "Found Basic core: type = %02d dma = %02x / %02x offset = 0x%x length = 0x%x (%d regs)\n", cte.type, KPC_OLD_S2C_DMA_CH_NUM(cte), KPC_OLD_C2S_DMA_CH_NUM(cte), cte.offset, cte.length, cte.length / 8);
111
112 cell.platform_data = &core_pdata;
113 cell.pdata_size = sizeof(struct kpc_core_device_platdata);
114 cell.num_resources = 2;
115
116 memset(&resources, 0, sizeof(resources));
117
118 resources[0].start = cte.offset;
119 resources[0].end = cte.offset + (cte.length - 1);
120 resources[0].flags = IORESOURCE_MEM;
121
122 resources[1].start = pcard->pdev->irq;
123 resources[1].end = pcard->pdev->irq;
124 resources[1].flags = IORESOURCE_IRQ;
125
126 cell.resources = resources;
127
128 return mfd_add_devices(PCARD_TO_DEV(pcard),
129 pcard->card_num * 100,
130 &cell,
131 1,
132 &pcard->regs_base_resource,
133 0,
134 NULL);
135 }
136
137 struct kpc_uio_device {
138 struct list_head list;
139 struct kp2000_device *pcard;
140 struct device *dev;
141 struct uio_info uioinfo;
142 struct core_table_entry cte;
143 u16 core_num;
144 };
145
146 static ssize_t offset_show(struct device *dev, struct device_attribute *attr,
147 char *buf)
148 {
149 struct kpc_uio_device *kudev = dev_get_drvdata(dev);
150
151 return sprintf(buf, "%u\n", kudev->cte.offset);
152 }
153 static DEVICE_ATTR_RO(offset);
154
155 static ssize_t size_show(struct device *dev, struct device_attribute *attr,
156 char *buf)
157 {
158 struct kpc_uio_device *kudev = dev_get_drvdata(dev);
159
160 return sprintf(buf, "%u\n", kudev->cte.length);
161 }
162 static DEVICE_ATTR_RO(size);
163
164 static ssize_t type_show(struct device *dev, struct device_attribute *attr,
165 char *buf)
166 {
167 struct kpc_uio_device *kudev = dev_get_drvdata(dev);
168
169 return sprintf(buf, "%u\n", kudev->cte.type);
170 }
171 static DEVICE_ATTR_RO(type);
172
173 static ssize_t s2c_dma_show(struct device *dev, struct device_attribute *attr,
174 char *buf)
175 {
176 struct kpc_uio_device *kudev = dev_get_drvdata(dev);
177
178 if (!kudev->cte.s2c_dma_present)
179 return sprintf(buf, "%s", "not present\n");
180
181 return sprintf(buf, "%u\n", kudev->cte.s2c_dma_channel_num);
182 }
183 static DEVICE_ATTR_RO(s2c_dma);
184
185 static ssize_t c2s_dma_show(struct device *dev, struct device_attribute *attr,
186 char *buf)
187 {
188 struct kpc_uio_device *kudev = dev_get_drvdata(dev);
189
190 if (!kudev->cte.c2s_dma_present)
191 return sprintf(buf, "%s", "not present\n");
192
193 return sprintf(buf, "%u\n", kudev->cte.c2s_dma_channel_num);
194 }
195 static DEVICE_ATTR_RO(c2s_dma);
196
197 static ssize_t irq_count_show(struct device *dev, struct device_attribute *attr,
198 char *buf)
199 {
200 struct kpc_uio_device *kudev = dev_get_drvdata(dev);
201
202 return sprintf(buf, "%u\n", kudev->cte.irq_count);
203 }
204 static DEVICE_ATTR_RO(irq_count);
205
206 static ssize_t irq_base_num_show(struct device *dev,
207 struct device_attribute *attr, char *buf)
208 {
209 struct kpc_uio_device *kudev = dev_get_drvdata(dev);
210
211 return sprintf(buf, "%u\n", kudev->cte.irq_base_num);
212 }
213 static DEVICE_ATTR_RO(irq_base_num);
214
215 static ssize_t core_num_show(struct device *dev, struct device_attribute *attr,
216 char *buf)
217 {
218 struct kpc_uio_device *kudev = dev_get_drvdata(dev);
219
220 return sprintf(buf, "%u\n", kudev->core_num);
221 }
222 static DEVICE_ATTR_RO(core_num);
223
224 struct attribute *kpc_uio_class_attrs[] = {
225 &dev_attr_offset.attr,
226 &dev_attr_size.attr,
227 &dev_attr_type.attr,
228 &dev_attr_s2c_dma.attr,
229 &dev_attr_c2s_dma.attr,
230 &dev_attr_irq_count.attr,
231 &dev_attr_irq_base_num.attr,
232 &dev_attr_core_num.attr,
233 NULL,
234 };
235
236 static
237 int kp2000_check_uio_irq(struct kp2000_device *pcard, u32 irq_num)
238 {
239 u64 interrupt_active = readq(pcard->sysinfo_regs_base + REG_INTERRUPT_ACTIVE);
240 u64 interrupt_mask_inv = ~readq(pcard->sysinfo_regs_base + REG_INTERRUPT_MASK);
241 u64 irq_check_mask = BIT_ULL(irq_num);
242
243 if (interrupt_active & irq_check_mask) {
244 if (interrupt_mask_inv & irq_check_mask) {
245 return 1;
246 }
247 }
248 return 0;
249 }
250
251 static
252 irqreturn_t kuio_handler(int irq, struct uio_info *uioinfo)
253 {
254 struct kpc_uio_device *kudev = uioinfo->priv;
255
256 if (irq != kudev->pcard->pdev->irq)
257 return IRQ_NONE;
258
259 if (kp2000_check_uio_irq(kudev->pcard, kudev->cte.irq_base_num)) {
260
261 writeq(BIT_ULL(kudev->cte.irq_base_num),
262 kudev->pcard->sysinfo_regs_base + REG_INTERRUPT_ACTIVE);
263 return IRQ_HANDLED;
264 }
265 return IRQ_NONE;
266 }
267
268 static
269 int kuio_irqcontrol(struct uio_info *uioinfo, s32 irq_on)
270 {
271 struct kpc_uio_device *kudev = uioinfo->priv;
272 struct kp2000_device *pcard = kudev->pcard;
273 u64 mask;
274
275 mutex_lock(&pcard->sem);
276 mask = readq(pcard->sysinfo_regs_base + REG_INTERRUPT_MASK);
277 if (irq_on)
278 mask &= ~(BIT_ULL(kudev->cte.irq_base_num));
279 else
280 mask |= BIT_ULL(kudev->cte.irq_base_num);
281 writeq(mask, pcard->sysinfo_regs_base + REG_INTERRUPT_MASK);
282 mutex_unlock(&pcard->sem);
283
284 return 0;
285 }
286
287 static int probe_core_uio(unsigned int core_num, struct kp2000_device *pcard,
288 char *name, const struct core_table_entry cte)
289 {
290 struct kpc_uio_device *kudev;
291 int rv;
292
293 dev_dbg(&pcard->pdev->dev, "Found UIO core: type = %02d dma = %02x / %02x offset = 0x%x length = 0x%x (%d regs)\n", cte.type, KPC_OLD_S2C_DMA_CH_NUM(cte), KPC_OLD_C2S_DMA_CH_NUM(cte), cte.offset, cte.length, cte.length / 8);
294
295 kudev = kzalloc(sizeof(*kudev), GFP_KERNEL);
296 if (!kudev)
297 return -ENOMEM;
298
299 INIT_LIST_HEAD(&kudev->list);
300 kudev->pcard = pcard;
301 kudev->cte = cte;
302 kudev->core_num = core_num;
303
304 kudev->uioinfo.priv = kudev;
305 kudev->uioinfo.name = name;
306 kudev->uioinfo.version = "0.0";
307 if (cte.irq_count > 0) {
308 kudev->uioinfo.irq_flags = IRQF_SHARED;
309 kudev->uioinfo.irq = pcard->pdev->irq;
310 kudev->uioinfo.handler = kuio_handler;
311 kudev->uioinfo.irqcontrol = kuio_irqcontrol;
312 } else {
313 kudev->uioinfo.irq = 0;
314 }
315
316 kudev->uioinfo.mem[0].name = "uiomap";
317 kudev->uioinfo.mem[0].addr = pci_resource_start(pcard->pdev, REG_BAR) + cte.offset;
318 kudev->uioinfo.mem[0].size = (cte.length + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1);
319 kudev->uioinfo.mem[0].memtype = UIO_MEM_PHYS;
320
321 kudev->dev = device_create(kpc_uio_class, &pcard->pdev->dev, MKDEV(0, 0), kudev, "%s.%d.%d.%d", kudev->uioinfo.name, pcard->card_num, cte.type, kudev->core_num);
322 if (IS_ERR(kudev->dev)) {
323 dev_err(&pcard->pdev->dev, "%s: device_create failed!\n",
324 __func__);
325 kfree(kudev);
326 return -ENODEV;
327 }
328 dev_set_drvdata(kudev->dev, kudev);
329
330 rv = uio_register_device(kudev->dev, &kudev->uioinfo);
331 if (rv) {
332 dev_err(&pcard->pdev->dev, "%s: failed uio_register_device: %d\n",
333 __func__, rv);
334 put_device(kudev->dev);
335 kfree(kudev);
336 return rv;
337 }
338
339 list_add_tail(&kudev->list, &pcard->uio_devices_list);
340
341 return 0;
342 }
343
344 static int create_dma_engine_core(struct kp2000_device *pcard, size_t engine_regs_offset, int engine_num, int irq_num)
345 {
346 struct mfd_cell cell = { .id = engine_num };
347 struct resource resources[2];
348
349 cell.platform_data = NULL;
350 cell.pdata_size = 0;
351 cell.name = KP_DRIVER_NAME_DMA_CONTROLLER;
352 cell.num_resources = 2;
353
354 memset(&resources, 0, sizeof(resources));
355
356 resources[0].start = engine_regs_offset;
357 resources[0].end = engine_regs_offset + (KPC_DMA_ENGINE_SIZE - 1);
358 resources[0].flags = IORESOURCE_MEM;
359
360 resources[1].start = irq_num;
361 resources[1].end = irq_num;
362 resources[1].flags = IORESOURCE_IRQ;
363
364 cell.resources = resources;
365
366 return mfd_add_devices(PCARD_TO_DEV(pcard),
367 pcard->card_num * 100,
368 &cell,
369 1,
370 &pcard->dma_base_resource,
371 0,
372 NULL);
373 }
374
375 static int kp2000_setup_dma_controller(struct kp2000_device *pcard)
376 {
377 int err;
378 unsigned int i;
379 u64 capabilities_reg;
380
381
382 for (i = 0 ; i < 32 ; i++) {
383 capabilities_reg = readq(pcard->dma_bar_base + KPC_DMA_S2C_BASE_OFFSET + (KPC_DMA_ENGINE_SIZE * i));
384 if (capabilities_reg & ENGINE_CAP_PRESENT_MASK) {
385 err = create_dma_engine_core(pcard, (KPC_DMA_S2C_BASE_OFFSET + (KPC_DMA_ENGINE_SIZE * i)), i, pcard->pdev->irq);
386 if (err)
387 goto err_out;
388 }
389 }
390
391 for (i = 0 ; i < 32 ; i++) {
392 capabilities_reg = readq(pcard->dma_bar_base + KPC_DMA_C2S_BASE_OFFSET + (KPC_DMA_ENGINE_SIZE * i));
393 if (capabilities_reg & ENGINE_CAP_PRESENT_MASK) {
394 err = create_dma_engine_core(pcard, (KPC_DMA_C2S_BASE_OFFSET + (KPC_DMA_ENGINE_SIZE * i)), 32 + i, pcard->pdev->irq);
395 if (err)
396 goto err_out;
397 }
398 }
399
400 return 0;
401
402 err_out:
403 dev_err(&pcard->pdev->dev, "%s: failed to add a DMA Engine: %d\n",
404 __func__, err);
405 return err;
406 }
407
408 int kp2000_probe_cores(struct kp2000_device *pcard)
409 {
410 int err = 0;
411 int i;
412 int current_type_id;
413 u64 read_val;
414 unsigned int highest_core_id = 0;
415 struct core_table_entry cte;
416
417 err = kp2000_setup_dma_controller(pcard);
418 if (err)
419 return err;
420
421 INIT_LIST_HEAD(&pcard->uio_devices_list);
422
423
424 for (i = 0 ; i < pcard->core_table_length ; i++) {
425 read_val = readq(pcard->sysinfo_regs_base + ((pcard->core_table_offset + i) * 8));
426 parse_core_table_entry(&cte, read_val, pcard->core_table_rev);
427 dbg_cte(pcard, &cte);
428 if (cte.type > highest_core_id)
429 highest_core_id = cte.type;
430 if (cte.type == KP_CORE_ID_INVALID)
431 dev_info(&pcard->pdev->dev, "Found Invalid core: %016llx\n", read_val);
432 }
433
434 for (current_type_id = 1 ; current_type_id <= highest_core_id ; current_type_id++) {
435 unsigned int core_num = 0;
436
437
438 for (i = 0 ; i < pcard->core_table_length ; i++) {
439 read_val = readq(pcard->sysinfo_regs_base + ((pcard->core_table_offset + i) * 8));
440 parse_core_table_entry(&cte, read_val, pcard->core_table_rev);
441
442 if (cte.type != current_type_id)
443 continue;
444
445 switch (cte.type) {
446 case KP_CORE_ID_I2C:
447 err = probe_core_basic(core_num, pcard,
448 KP_DRIVER_NAME_I2C, cte);
449 break;
450
451 case KP_CORE_ID_SPI:
452 err = probe_core_basic(core_num, pcard,
453 KP_DRIVER_NAME_SPI, cte);
454 break;
455
456 default:
457 err = probe_core_uio(core_num, pcard, "kpc_uio", cte);
458 break;
459 }
460 if (err) {
461 dev_err(&pcard->pdev->dev,
462 "%s: failed to add core %d: %d\n",
463 __func__, i, err);
464 goto error;
465 }
466 core_num++;
467 }
468 }
469
470
471 cte.type = 0;
472 cte.offset = 0;
473 cte.length = 512 * 8;
474 cte.s2c_dma_present = false;
475 cte.s2c_dma_channel_num = 0;
476 cte.c2s_dma_present = false;
477 cte.c2s_dma_channel_num = 0;
478 cte.irq_count = 0;
479 cte.irq_base_num = 0;
480 err = probe_core_uio(0, pcard, "kpc_uio", cte);
481 if (err) {
482 dev_err(&pcard->pdev->dev, "%s: failed to add board_info core: %d\n",
483 __func__, err);
484 goto error;
485 }
486
487 return 0;
488
489 error:
490 kp2000_remove_cores(pcard);
491 mfd_remove_devices(PCARD_TO_DEV(pcard));
492 return err;
493 }
494
495 void kp2000_remove_cores(struct kp2000_device *pcard)
496 {
497 struct list_head *ptr;
498 struct list_head *next;
499
500 list_for_each_safe(ptr, next, &pcard->uio_devices_list) {
501 struct kpc_uio_device *kudev = list_entry(ptr, struct kpc_uio_device, list);
502
503 uio_unregister_device(&kudev->uioinfo);
504 device_unregister(kudev->dev);
505 list_del(&kudev->list);
506 kfree(kudev);
507 }
508 }
509