1*7688df22SAndroid Build Coastguard Worker /*
2*7688df22SAndroid Build Coastguard Worker * Copyright © 2011 Red Hat
3*7688df22SAndroid Build Coastguard Worker *
4*7688df22SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
5*7688df22SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"),
6*7688df22SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation
7*7688df22SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*7688df22SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the
9*7688df22SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions:
10*7688df22SAndroid Build Coastguard Worker *
11*7688df22SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the next
12*7688df22SAndroid Build Coastguard Worker * paragraph) shall be included in all copies or substantial portions of the
13*7688df22SAndroid Build Coastguard Worker * Software.
14*7688df22SAndroid Build Coastguard Worker *
15*7688df22SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*7688df22SAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*7688df22SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18*7688df22SAndroid Build Coastguard Worker * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*7688df22SAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*7688df22SAndroid Build Coastguard Worker * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21*7688df22SAndroid Build Coastguard Worker * IN THE SOFTWARE.
22*7688df22SAndroid Build Coastguard Worker *
23*7688df22SAndroid Build Coastguard Worker * Authors:
24*7688df22SAndroid Build Coastguard Worker * Jerome Glisse <[email protected]>
25*7688df22SAndroid Build Coastguard Worker */
26*7688df22SAndroid Build Coastguard Worker #include <stdio.h>
27*7688df22SAndroid Build Coastguard Worker #include <stdlib.h>
28*7688df22SAndroid Build Coastguard Worker #include <unistd.h>
29*7688df22SAndroid Build Coastguard Worker #include "rbo.h"
30*7688df22SAndroid Build Coastguard Worker #include "xf86drm.h"
31*7688df22SAndroid Build Coastguard Worker
32*7688df22SAndroid Build Coastguard Worker /* allocate as many single page bo to try to starve the kernel
33*7688df22SAndroid Build Coastguard Worker * memory zone (below highmem)
34*7688df22SAndroid Build Coastguard Worker */
ttm_starve_kernel_private_memory(int fd)35*7688df22SAndroid Build Coastguard Worker static void ttm_starve_kernel_private_memory(int fd)
36*7688df22SAndroid Build Coastguard Worker {
37*7688df22SAndroid Build Coastguard Worker struct list_head list;
38*7688df22SAndroid Build Coastguard Worker struct rbo *bo, *tmp;
39*7688df22SAndroid Build Coastguard Worker unsigned nbo = 0;
40*7688df22SAndroid Build Coastguard Worker
41*7688df22SAndroid Build Coastguard Worker printf("\n[%s]\n", __func__);
42*7688df22SAndroid Build Coastguard Worker list_inithead(&list);
43*7688df22SAndroid Build Coastguard Worker while (1) {
44*7688df22SAndroid Build Coastguard Worker bo = rbo(fd, 0, 4096, 0, NULL);
45*7688df22SAndroid Build Coastguard Worker if (bo == NULL) {
46*7688df22SAndroid Build Coastguard Worker printf("failing after %d bo\n", nbo);
47*7688df22SAndroid Build Coastguard Worker break;
48*7688df22SAndroid Build Coastguard Worker }
49*7688df22SAndroid Build Coastguard Worker nbo++;
50*7688df22SAndroid Build Coastguard Worker list_add(&bo->list, &list);
51*7688df22SAndroid Build Coastguard Worker }
52*7688df22SAndroid Build Coastguard Worker LIST_FOR_EACH_ENTRY_SAFE(bo, tmp, &list, list) {
53*7688df22SAndroid Build Coastguard Worker list_del(&bo->list);
54*7688df22SAndroid Build Coastguard Worker rbo_decref(bo);
55*7688df22SAndroid Build Coastguard Worker }
56*7688df22SAndroid Build Coastguard Worker }
57*7688df22SAndroid Build Coastguard Worker
radeon_open_fd(void)58*7688df22SAndroid Build Coastguard Worker static int radeon_open_fd(void)
59*7688df22SAndroid Build Coastguard Worker {
60*7688df22SAndroid Build Coastguard Worker return drmOpen("radeon", NULL);
61*7688df22SAndroid Build Coastguard Worker }
62*7688df22SAndroid Build Coastguard Worker
main(void)63*7688df22SAndroid Build Coastguard Worker int main(void)
64*7688df22SAndroid Build Coastguard Worker {
65*7688df22SAndroid Build Coastguard Worker int radeonfd;
66*7688df22SAndroid Build Coastguard Worker
67*7688df22SAndroid Build Coastguard Worker radeonfd = radeon_open_fd();
68*7688df22SAndroid Build Coastguard Worker if (radeonfd < 0) {
69*7688df22SAndroid Build Coastguard Worker fprintf(stderr, "failed to open radeon fd\n");
70*7688df22SAndroid Build Coastguard Worker return -1;
71*7688df22SAndroid Build Coastguard Worker }
72*7688df22SAndroid Build Coastguard Worker
73*7688df22SAndroid Build Coastguard Worker ttm_starve_kernel_private_memory(radeonfd);
74*7688df22SAndroid Build Coastguard Worker
75*7688df22SAndroid Build Coastguard Worker close(radeonfd);
76*7688df22SAndroid Build Coastguard Worker return 0;
77*7688df22SAndroid Build Coastguard Worker }
78