List of commits:
Subject Hash Author Date (UTC)
async event infra, then pf async event 9382e56a6568b2199730b47ac5041e081b3d5e81 Sylvain BERTRAND 2013-08-28 00:17:05
memory caches love 43fa6b6df2979e25b1a47435f3181e64e4c8083d Sylvain BERTRAND 2013-08-23 14:47:14
3D userland works then remove kernel patterns 4c321ff140297a07d0ba4e8fdb3a25a6ffb78441 Sylvain BERTRAND 2013-08-23 12:12:35
missing pci ids b4d10f83ff4f1606e6f16092bcfc457b1e189fcd Sylvain BERTRAND 2013-08-21 22:40:36
first version of 3d userland API 3d3f50a321e0867f0da5e2478d710ae756ea1378 Sylvain BERTRAND 2013-08-21 16:57:22
cp0->c0 cp1->c1 074f981d4d7829b260ff9508b61a38b57474b266 Sylvain BERTRAND 2013-08-21 13:26:02
cp0->gfx 468c65f13f7c967e3481f9c75307cfcb398b909b Sylvain BERTRAND 2013-08-21 13:15:02
cpu aperture to gpu aperture ba4c412fd6afed7ef3094eb6fb060ab43e0fb8c2 Sylvain BERTRAND 2013-08-21 13:06:18
a bit more dma generalization 281fcfd54820d7cf7059cdbf8e198e648642d960 Sylvain BERTRAND 2013-08-19 23:04:52
dma for pt update and l2l byte dma cpy b0542ee460a4f92ad2ad0ffa42293f9fe6d57928 Sylvain BERTRAND 2013-08-10 03:03:17
switch from msleep to usleep_range 3c42fa181b3777dd79bbe1dd0f5a98ed656fb4d5 Sylvain BERTRAND 2013-08-07 13:32:23
GPU is little endian, fimware big endian 13ebc6d59b5ba620db1a974f5920ff88f2ca3174 Sylvain BERTRAND 2013-08-07 13:20:10
naive ring free space wait system b196b09a6adbf72a417ef6e5adb34cff92732018 Sylvain BERTRAND 2013-08-07 12:39:39
mini fence system for DMA 5d183e5998d9f7b7b684ecac253c3cde50dad84f Sylvain BERTRAND 2013-08-06 20:54:12
mainly sg_user mapping 990ec94cf03256d6d2ce5375ea336acdd99fbcf1 Sylvain BERTRAND 2013-08-02 14:36:54
added core DMA mapping methods 677ff382bc0fb7bab3e119f4057fd5fcf40481fc Sylvain BERTRAND 2013-07-31 20:49:30
dma engines, and partial user bus mapping 4c82cabbe66ec9a1c940af37d8954ed87cbfb9eb Sylvain BERTRAND 2013-07-30 15:10:29
add some things to the aperture 695d6688db8ea6ce2145636ed0fb7fa5d6aaebcf Sylvain BERTRAND 2013-07-22 20:11:59
stop mapping vram pci bar 9e32ff2c145282e49503bea50391cb82b926780f Sylvain BERTRAND 2013-07-22 18:30:18
cleanup vram access of patterns 98758af7283b56a9782cb6f0bc2440e3dd54952a Sylvain BERTRAND 2013-07-22 15:33:43
Commit 9382e56a6568b2199730b47ac5041e081b3d5e81 - async event infra, then pf async event
Author: Sylvain BERTRAND
Author date (UTC): 2013-08-28 00:17
Committer name: Sylvain BERTRAND
Committer date (UTC): 2013-08-28 00:17
Parent(s): 43fa6b6df2979e25b1a47435f3181e64e4c8083d
Signer:
Signing key:
Signing status: N
Tree: 594755b75a2ed77a7b481ff2f26775de67a6c466
File Lines added Lines deleted
drivers/gpu/alga/amd/dce6/crtc.c 42 10
drivers/gpu/alga/amd/dce6/dce6.h 4 2
drivers/gpu/alga/amd/dce6/mod.c 19 15
drivers/gpu/alga/amd/si/drv.c 5 1
drivers/gpu/alga/amd/si/fops/dce.c 39 4
drivers/gpu/alga/amd/si/fops/dce.h 1 1
drivers/gpu/alga/amd/si/fops/fops.c 97 1
drivers/gpu/alga/amd/si/fops/fops.h 8 0
drivers/gpu/alga/amd/si/fops/private.h 8 4
include/alga/amd/dce6/dce6.h 4 1
include/alga/amd/si/ioctl.h 18 0
File drivers/gpu/alga/amd/dce6/crtc.c changed (mode: 100644) (index c20bf06..2e4f676)
15 15 #include <alga/amd/dce6/dce6_dev.h> #include <alga/amd/dce6/dce6_dev.h>
16 16 #include <alga/amd/atombios/atb.h> #include <alga/amd/atombios/atb.h>
17 17 #include <alga/amd/atombios/dce.h> #include <alga/amd/atombios/dce.h>
18 #include <alga/amd/si/ioctl.h>
18 19
19 20 #include "dce6.h" #include "dce6.h"
20 21 #include "regs.h" #include "regs.h"
 
... ... static void page_flip(struct dce6 *dce, u8 i)
225 226 void dce6_pf_irq(struct dce6 *dce, u8 i) void dce6_pf_irq(struct dce6 *dce, u8 i)
226 227 { {
227 228 u32 tmp; u32 tmp;
229 u32 vblanks_n;
228 230
229 231 /* disabling page flip is disabling the vblank interrupt */ /* disabling page flip is disabling the vblank interrupt */
230 232 tmp = RR32(regs_crtc_int_mask[i]); tmp = RR32(regs_crtc_int_mask[i]);
 
... ... void dce6_pf_irq(struct dce6 *dce, u8 i)
233 235
234 236 page_flip(dce, i); page_flip(dce, i);
235 237
236 atomic_set(&dce->dps[i].pf.occurred, 1);
237
238 wake_up(&dce->dps[i].pf.event);
238 vblanks_n = RR32(regs_crtc_status_frame_cnt[i]);
239
240 spin_lock(&dce->dps[i].pf.lock);
241 if (dce->dps[i].pf.notify)
242 dce->dps[i].pf.notify(i, vblanks_n, dce->dps[i].pf.data);
243 dce->dps[i].pf.notify = NULL;
244 dce->dps[i].pf.data = NULL;
245 spin_unlock(&dce->dps[i].pf.lock);
239 246 } }
240 247 EXPORT_SYMBOL_GPL(dce6_pf_irq); EXPORT_SYMBOL_GPL(dce6_pf_irq);
241 248
242 long dce6_pf(struct dce6 *dce, u8 i, u32 *vblanks_n)
249 /* XXX: the notify function will be run in hard irq context */
250 long dce6_pf(struct dce6 *dce, u8 i,
251 void (*notify)(u8 i, u32 vblanks_n,void *data), void *data)
243 252 { {
244 253 u32 tmp; u32 tmp;
245 254
246 /* enabling page flip is enabling vblank interrupt */
255 lock(dce);
256 /* scheduling a page flip is enabling vblank interrupt */
247 257 tmp = RR32(regs_crtc_int_mask[i]); tmp = RR32(regs_crtc_int_mask[i]);
248 258 tmp |= IM_VBLANK_INT_MASK; tmp |= IM_VBLANK_INT_MASK;
249 259 WR32(tmp, regs_crtc_int_mask[i]); WR32(tmp, regs_crtc_int_mask[i]);
250 260
251 wait_event(dce->dps[i].pf.event,
252 atomic_read(&dce->dps[i].pf.occurred) != 0);
261 spin_lock_irq(&dce->dps[i].pf.lock);
262 dce->dps[i].pf.notify = notify;
263 dce->dps[i].pf.data = data;
264 spin_unlock_irq(&dce->dps[i].pf.lock);
253 265
254 atomic_set(&dce->dps[i].pf.occurred, 0);
255
256 *vblanks_n = RR32(regs_crtc_status_frame_cnt[i]);
266 unlock(dce);
257 267 return 0; return 0;
258 268 } }
259 269 EXPORT_SYMBOL_GPL(dce6_pf); EXPORT_SYMBOL_GPL(dce6_pf);
260 270
271 /*
272 * The mutex protects against client concurrent accesses, the spinlock against
273 * irq handlers concurrent accesses.
274 */
275 void dce6_pf_cancel_all(struct dce6 *dce)
276 {
277 u8 i;
278
279 lock(dce);
280 for (i = 0; i < dce->ddev.crtcs_n; ++i) {
281 if ((dce->dps_used & BIT(i)) == 0)
282 continue;
283
284 spin_lock_irq(&dce->dps[i].pf.lock);
285 dce->dps[i].pf.notify = NULL;
286 dce->dps[i].pf.data = NULL;
287 spin_unlock_irq(&dce->dps[i].pf.lock);
288 }
289 unlock(dce);
290 }
291 EXPORT_SYMBOL_GPL(dce6_pf_cancel_all);
292
261 293 void crtcs_atb_states_init(struct dce6 *dce) void crtcs_atb_states_init(struct dce6 *dce)
262 294 { {
263 295 u8 i; u8 i;
File drivers/gpu/alga/amd/dce6/dce6.h changed (mode: 100644) (index d68bb18..7948d0a)
... ... struct crtc_surfs {
28 28
29 29 struct pf { struct pf {
30 30 struct crtc_surfs crtc_surfs; struct crtc_surfs crtc_surfs;
31 wait_queue_head_t event;
32 atomic_t occurred; /* to avoid race */
31 /* this function will run in irq hard context */
32 spinlock_t lock;
33 void (*notify)(u8 i, u32 v_blanks_n, void *data);
34 void *data;
33 35 }; };
34 36
35 37 struct dp { struct dp {
File drivers/gpu/alga/amd/dce6/mod.c changed (mode: 100644) (index c4ae0ef..2b863f4)
9 9 #include <linux/i2c.h> #include <linux/i2c.h>
10 10 #include <linux/atomic.h> #include <linux/atomic.h>
11 11 #include <linux/idr.h> #include <linux/idr.h>
12 #include <linux/spinlock.h>
12 13
13 14 #include <alga/alga.h> #include <alga/alga.h>
14 15 #include <alga/pixel_fmts.h> #include <alga/pixel_fmts.h>
 
... ... void dce6_vga_off(struct dce6 *dce)
510 511 } }
511 512 EXPORT_SYMBOL_GPL(dce6_vga_off); EXPORT_SYMBOL_GPL(dce6_vga_off);
512 513
513 static void dps_used_pf_init_once(struct dce6 *dce)
514 {
515 u8 i;
516
517 for (i = 0; i < dce->ddev.crtcs_n; ++i) {
518 if ((dce->dps_used & BIT(i)) == 0)
519 continue;
520
521 init_waitqueue_head(&dce->dps[i].pf.event);
522 atomic_set(&dce->dps[i].pf.occurred, 0);
523 }
524 }
525
526 514 static long dps_connected_sysfs(struct dce6 *dce) static long dps_connected_sysfs(struct dce6 *dce)
527 515 { {
528 516 long r; long r;
 
... ... static void dps_connected_sysfs_shutdown(struct dce6 *dce)
558 546 } }
559 547 } }
560 548
549 static void dps_pf_init_once(struct dce6 *dce)
550 {
551 u8 i;
552 for (i = 0; i < dce->ddev.crtcs_n; ++i) {
553 if ((dce->dps_used & BIT(i)) == 0)
554 continue;
555 spin_lock_init(&dce->dps[i].pf.lock);
556 }
557 }
558
561 559 long dce6_init_once(struct dce6 *dce) long dce6_init_once(struct dce6 *dce)
562 560 { {
563 561 long r; long r;
 
... ... long dce6_init_once(struct dce6 *dce)
569 567 if (r == -DCE6_ERR) if (r == -DCE6_ERR)
570 568 return -DCE6_ERR; return -DCE6_ERR;
571 569
570 dps_pf_init_once(dce);
571
572 572 dce_dump(dce); dce_dump(dce);
573
574 dps_used_pf_init_once(dce);
575 573 return 0; return 0;
576 574 } }
577 575 EXPORT_SYMBOL_GPL(dce6_init_once); EXPORT_SYMBOL_GPL(dce6_init_once);
 
... ... long dce6_sysfs_cold_register(struct dce6 *dce, struct device *parent_char_dev)
719 717 } }
720 718 EXPORT_SYMBOL_GPL(dce6_sysfs_cold_register); EXPORT_SYMBOL_GPL(dce6_sysfs_cold_register);
721 719
720 u32 dce6_vblanks_n(struct dce6 *dce, u8 idx)
721 {
722 return RR32(regs_crtc_status_frame_cnt[idx]);
723 }
724 EXPORT_SYMBOL_GPL(dce6_vblanks_n);
725
722 726 static int init(void) static int init(void)
723 727 { {
724 728 ida_init(&ida); ida_init(&ida);
File drivers/gpu/alga/amd/si/drv.c changed (mode: 100644) (index 267d844..e2d37ee)
... ... static int si_suspend_noirq(struct device *dev)
798 798 /* vram content lost during suspend */ /* vram content lost during suspend */
799 799 rng_mng_destroy(&dd->vram.mng); rng_mng_destroy(&dd->vram.mng);
800 800
801 /* unmap all aperture maps without pt update since it's useless */
801 /*
802 * TODO: wrong, the mapping must still have ram after coming back
803 * from susptend.
804 * old:unmap all aperture maps without pt update since it's useless
805 */
802 806 ba_all_unmap(pdev, BA_NO_PT_UPDATE); ba_all_unmap(pdev, BA_NO_PT_UPDATE);
803 807
804 808 /* "context is lost to userspace", no concurrent access to list */ /* "context is lost to userspace", no concurrent access to list */
File drivers/gpu/alga/amd/si/fops/dce.c changed (mode: 100644) (index 5ea1d32..24029e9)
35 35 #include "gpu/gpu.h" #include "gpu/gpu.h"
36 36 #include "drv.h" #include "drv.h"
37 37
38 #include "fops/fops.h"
39 #include "fops/private.h"
40
38 41 long fops_dce_dps_info(struct pci_dev *dev, void __user *user) long fops_dce_dps_info(struct pci_dev *dev, void __user *user)
39 42 { {
40 43 struct dev_drv_data *dd; struct dev_drv_data *dd;
 
... ... long fops_dce_dp_dpm(struct pci_dev *dev, u8 __user *user_i)
102 105 return 0; return 0;
103 106 } }
104 107
105 long fops_dce_pf(struct pci_dev *dev, u8 __user *user_i)
108 /* XXX: run in hard irq context */
109 static void pf_notify(u8 idx, u32 vblanks_n, void *data)
110 {
111 struct file_private_data *fdata;
112 struct fops_evt *fops_evt;
113 struct si_evt *si_evt;
114 struct si_evt_pf *si_evt_pf;
115 struct dev_drv_data *dd;
116
117 fdata = data;
118
119 spin_lock(&fdata->evts_lock);
120 fops_evt = kzalloc(sizeof(*fops_evt), GFP_ATOMIC);
121 if (!fops_evt) {
122 dev_err(&fdata->d->dev, "fops:pf:unable to allocate an event\n");
123 goto exit;
124 }
125
126 si_evt = &fops_evt->base;
127 si_evt_pf = &si_evt->params.pf;
128
129 si_evt->type = SI_EVT_PF;
130
131 si_evt_pf->idx = idx;
132
133 dd = pci_get_drvdata(fdata->d);
134 si_evt_pf->vblanks_n = dce6_vblanks_n(dd->dce, idx);
135
136 list_add_tail(&fops_evt->n, &fdata->evts);
137 exit:
138 spin_unlock(&fdata->evts_lock);
139 wake_up(&fdata->evts_wq);
140 }
141
142 long fops_dce_pf(struct pci_dev *dev, u8 __user *user_i, void *data)
106 143 { {
107 144 struct dev_drv_data *dd; struct dev_drv_data *dd;
108 145 u8 i; u8 i;
109 u32 vblanks_n;
110 146 long r; long r;
111 147
112 148 get_user(i, user_i); get_user(i, user_i);
113 149
114 150 dd = pci_get_drvdata(dev); dd = pci_get_drvdata(dev);
115 151
116 r = dce6_pf(dd->dce, i, &vblanks_n);
152 r = dce6_pf(dd->dce, i, pf_notify, data);
117 153 if (r != 0) if (r != 0)
118 154 return -ENODEV; return -ENODEV;
119 put_user(vblanks_n, user_i);
120 155 return 0; return 0;
121 156 } }
122 157
File drivers/gpu/alga/amd/si/fops/dce.h changed (mode: 100644) (index 6a5b3d5..408a32b)
8 8 long fops_dce_dps_info(struct pci_dev *dev, void __user *user); long fops_dce_dps_info(struct pci_dev *dev, void __user *user);
9 9 long fops_dce_dp_set(struct pci_dev *dev, void __user *user); long fops_dce_dp_set(struct pci_dev *dev, void __user *user);
10 10 long fops_dce_dp_dpm(struct pci_dev *dev, u8 __user *user_i); long fops_dce_dp_dpm(struct pci_dev *dev, u8 __user *user_i);
11 long fops_dce_pf(struct pci_dev *dev, u8 __user *user_i);
11 long fops_dce_pf(struct pci_dev *dev, u8 __user *user_i, void *data);
12 12 long fops_dce_edid(struct pci_dev *dev, long fops_dce_edid(struct pci_dev *dev,
13 13 struct si_dce_edid __user *user_ioctl_edid); struct si_dce_edid __user *user_ioctl_edid);
14 14 #endif #endif
File drivers/gpu/alga/amd/si/fops/fops.c changed (mode: 100644) (index ba2a2bf..22378ca)
17 17 #include <linux/atomic.h> #include <linux/atomic.h>
18 18 #include <linux/sched.h> #include <linux/sched.h>
19 19 #include <linux/mm.h> #include <linux/mm.h>
20 #include <linux/poll.h>
20 21
21 22 #include <alga/rng_mng.h> #include <alga/rng_mng.h>
22 23 #include <alga/pixel_fmts.h> #include <alga/pixel_fmts.h>
 
46 47
47 48 #include "regs.h" #include "regs.h"
48 49
50 #include "fops/private.h"
51
49 52 dev_t devt_region; dev_t devt_region;
50 53
51 54 LIST_HEAD(files_private_data); LIST_HEAD(files_private_data);
 
... ... static int open(struct inode *i, struct file *f)
74 77 spin_unlock(&files_private_data_lock); spin_unlock(&files_private_data_lock);
75 78
76 79 data->d = dd->dev; data->d = dd->dev;
80 init_waitqueue_head(&data->evts_wq);
81 INIT_LIST_HEAD(&data->evts);
82 spin_lock_init(&data->evts_lock);
77 83 f->private_data = (void*)data; f->private_data = (void*)data;
78 84 return 0; return 0;
79 85 } }
 
... ... static long unlocked_ioctl(struct file *f, unsigned int cmd, unsigned long arg)
294 300 r = fops_dce_dp_dpm(dev, (u8 __user *)arg); r = fops_dce_dp_dpm(dev, (u8 __user *)arg);
295 301 break; break;
296 302 case SI_DCE_PF: case SI_DCE_PF:
297 r = fops_dce_pf(dev, (u8 __user *)arg);
303 r = fops_dce_pf(dev, (u8 __user *)arg, data);
298 304 break; break;
299 305 case SI_DCE_EDID: case SI_DCE_EDID:
300 306 r = fops_dce_edid(dev, (struct si_dce_edid __user *)arg); r = fops_dce_edid(dev, (struct si_dce_edid __user *)arg);
 
... ... static long unlocked_ioctl(struct file *f, unsigned int cmd, unsigned long arg)
327 333 return r; return r;
328 334 } }
329 335
336 static void evts_cleanup(struct file_private_data *data)
337 {
338 struct dev_drv_data *dd;
339 struct fops_evt *fops_evt;
340 struct fops_evt *tmp;
341
342 dd = pci_get_drvdata(data->d);
343
344 dce6_pf_cancel_all(dd->dce);
345
346 list_for_each_entry_safe(fops_evt, tmp, &data->evts, n) {
347 list_del(&fops_evt->n);
348 kfree(fops_evt);
349 }
350 }
351
330 352 static int release(struct inode *i, struct file *f) static int release(struct inode *i, struct file *f)
331 353 { {
332 354 struct file_private_data *data; struct file_private_data *data;
355
333 356
334 357 data = f->private_data; data = f->private_data;
335 358 spin_lock(&files_private_data_lock); spin_lock(&files_private_data_lock);
336 359 list_del(&data->n); list_del(&data->n);
337 360 spin_unlock(&files_private_data_lock); spin_unlock(&files_private_data_lock);
338 361
362 evts_cleanup(data);
363
339 364 f->private_data = NULL; f->private_data = NULL;
340 365 kfree(data); kfree(data);
341 366 return 0; return 0;
342 367 } }
343 368
369 static ssize_t fops_read(struct file *f, char __user *buf, size_t buf_sz,
370 loff_t *of)
371 {
372 struct file_private_data *data;
373 int r;
374 size_t si_evts_sz;
375
376 data = f->private_data;
377
378 spin_lock_irq(&data->evts_lock);
379 r = wait_event_interruptible_lock_irq(data->evts_wq,
380 !list_empty(&data->evts), data->evts_lock);
381 spin_unlock_irq(&data->evts_lock);
382 if (r == -ERESTARTSYS)
383 return (ssize_t)r;
384
385 si_evts_sz = 0;
386 while ((si_evts_sz + sizeof(struct si_evt)) <= buf_sz) {
387 struct fops_evt *fops_evt;
388 struct si_evt *si_evt;
389 struct si_evt si_evt_storage;
390
391 /*------------------------------------------------------------*/
392 /*
393 * critical section: one event at a time, dequeue only
394 * happens here, then read will block above in
395 * wait_event_interruptible_lock_irq if no events are
396 * available.
397 */
398 spin_lock_irq(&data->evts_lock);
399 if (list_empty(&data->evts)) {
400 spin_unlock_irq(&data->evts_lock);
401 return 0;
402 }
403
404 fops_evt = list_first_entry(&data->evts, struct fops_evt, n);
405 si_evt = &fops_evt->base;
406 memcpy(&si_evt_storage, si_evt, sizeof(*si_evt));
407 list_del(&fops_evt->n);
408 kfree(fops_evt);
409 spin_unlock_irq(&data->evts_lock);
410 /*------------------------------------------------------------*/
411
412 /* don't forget that copy_to_user might sleep */
413 if (copy_to_user(buf + si_evts_sz, &si_evt_storage,
414 sizeof(si_evt_storage)))
415 return -EFAULT;
416 si_evts_sz += sizeof(si_evt_storage);
417 }
418 return (ssize_t)si_evts_sz;
419 }
420
421 static unsigned int fops_poll(struct file *f, struct poll_table_struct *wait)
422 {
423 struct file_private_data *data;
424 unsigned int mask;
425
426 data = f->private_data;
427 mask = 0;
428
429 poll_wait(f, &data->evts_wq, wait);
430
431 spin_lock_irq(&data->evts_lock);
432 if (!list_empty(&data->evts))
433 mask |= POLLIN | POLLRDNORM;
434 spin_unlock_irq(&data->evts_lock);
435 return mask;
436 }
437
344 438 struct file_operations fops = { struct file_operations fops = {
345 439 .owner = THIS_MODULE, .owner = THIS_MODULE,
346 440 .unlocked_ioctl = unlocked_ioctl, .unlocked_ioctl = unlocked_ioctl,
347 441 .open = open, .open = open,
348 442 .release = release, .release = release,
349 443 .mmap = fops_mmap, .mmap = fops_mmap,
444 .poll = fops_poll,
445 .read = fops_read
350 446 }; };
File drivers/gpu/alga/amd/si/fops/fops.h changed (mode: 100644) (index 8a5e60a..864fe4d)
... ... struct file_private_data {
9 9 struct list_head n; struct list_head n;
10 10 u8 context_lost; u8 context_lost;
11 11 struct pci_dev *d; struct pci_dev *d;
12
13 /*
14 * the evts like the pf evts are added from a irq handler, then protect
15 * the related data with a spinlock
16 */
17 spinlock_t evts_lock;
18 struct list_head evts;
19 wait_queue_head_t evts_wq;
12 20 }; };
13 21
14 22 #ifndef FOPS_C #ifndef FOPS_C
File drivers/gpu/alga/amd/si/fops/private.h copied from file drivers/gpu/alga/amd/si/ucode.h (similarity 51%) (mode: 100644) (index 189564d..d79489d)
1 #ifndef _UCODE_H
2 #define _UCODE_H
1 #ifndef FOPS_PRIVATE_H
2 #define FOPS_PRIVATE_H
3 3 /* /*
4 4 author Sylvain Bertrand <digital.ragnarok@gmail.com> author Sylvain Bertrand <digital.ragnarok@gmail.com>
5 5 Protected by GNU Affero GPL v3 with some exceptions. Protected by GNU Affero GPL v3 with some exceptions.
6 6 See README at root of alga tree. See README at root of alga tree.
7 7 */ */
8 long ucode_load(struct pci_dev *dev, const struct firmware **fw,
9 const char *fw_str, u32 fw_dws);
8
9 /* we derive the si_evt from the ioctls */
10 struct fops_evt {
11 struct si_evt base;
12 struct list_head n;
13 };
10 14 #endif #endif
File include/alga/amd/dce6/dce6.h changed (mode: 100644) (index aedde19..d4aed7a)
... ... long dce6_dps_info(struct dce6 *dce, u8 *used, u8 *connected,
40 40 (*ts)[CRTCS_N_MAX][ALGA_TIMINGS_MAX]); (*ts)[CRTCS_N_MAX][ALGA_TIMINGS_MAX]);
41 41 long dce6_dp_dpm(struct dce6 *dce, u8 i); long dce6_dp_dpm(struct dce6 *dce, u8 i);
42 42 long dce6_edid(struct dce6 *dce, u8 i, void *edid, u16 edid_sz); long dce6_edid(struct dce6 *dce, u8 i, void *edid, u16 edid_sz);
43 long dce6_pf(struct dce6 *dce, u8 i,
44 void (*notify)(u8 i, u32 vblanks_n,void *data), void *data);
45 void dce6_pf_cancel_all(struct dce6 *dce);
43 46 /* irq thread */ /* irq thread */
44 47 long dce6_irqs_thd(struct dce6 *dce); long dce6_irqs_thd(struct dce6 *dce);
45 48
 
... ... void dce6_vga_off(struct dce6 *dce);
56 59 void dce6_irqs_ack(struct dce6 *dce); void dce6_irqs_ack(struct dce6 *dce);
57 60 void dce6_intrs_reset(struct dce6 *dce); void dce6_intrs_reset(struct dce6 *dce);
58 61 void dce6_hpds_intr_ena(struct dce6 *dce); void dce6_hpds_intr_ena(struct dce6 *dce);
59 long dce6_pf(struct dce6 *dce, u8 i, u32 *vblanks_n);
62 u32 dce6_vblanks_n(struct dce6 *dce, u8 idx);
60 63
61 64 /* direct atombios access */ /* direct atombios access */
62 65 long dce6_crtcs_shutdown(struct dce6 *dce); long dce6_crtcs_shutdown(struct dce6 *dce);
File include/alga/amd/si/ioctl.h changed (mode: 100644) (index 39df302..589cb9b)
... ... struct si_gfx_ib {
97 97 uint64_t dws_n; uint64_t dws_n;
98 98 }; };
99 99
100 /*----------------------------------------------------------------------------*/
101 /* events */
102 #define SI_EVT_PF 1
103 struct si_evt_pf {
104 uint8_t idx;
105 uint32_t vblanks_n;
106 };
107
108 union si_evt_params {
109 struct si_evt_pf pf;
110 };
111
112 struct si_evt {
113 uint8_t type;
114 union si_evt_params params;
115 };
116 /*----------------------------------------------------------------------------*/
117
100 118 #ifndef __KERNEL__ #ifndef __KERNEL__
101 119 #define SI_GPU_PAGE_SZ 4096 #define SI_GPU_PAGE_SZ 4096
102 120 #endif #endif
Hints:
Before first commit, do not forget to setup your git environment:
git config --global user.name "your_name_here"
git config --global user.email "your@email_here"

Clone this repository using HTTP(S):
git clone https://rocketgit.com/user/sylware/linux-gpu-amd-si

Clone this repository using ssh (do not forget to upload a key first):
git clone ssh://rocketgit@ssh.rocketgit.com/user/sylware/linux-gpu-amd-si

Clone this repository using git:
git clone git://git.rocketgit.com/user/sylware/linux-gpu-amd-si

You are allowed to anonymously push to this repository.
This means that your pushed commits will automatically be transformed into a merge request:
... clone the repository ...
... make some changes and some commits ...
git push origin main