Commit 689d7c2a authored by Dave Airlie's avatar Dave Airlie

drm/radeon: cleanup mkregtable.c

This cleans up the code in mkregtable.c to be more kernel style.
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent a1a2d1d3
...@@ -25,10 +25,8 @@ ...@@ -25,10 +25,8 @@
* *
*/ */
#define container_of(ptr, type, member) ({ \ #define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \ const typeof(((type *)0)->member)*__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );}) (type *)((char *)__mptr - offsetof(type, member)); })
/* /*
* Simple doubly linked list implementation. * Simple doubly linked list implementation.
...@@ -63,8 +61,7 @@ static inline void INIT_LIST_HEAD(struct list_head *list) ...@@ -63,8 +61,7 @@ static inline void INIT_LIST_HEAD(struct list_head *list)
*/ */
#ifndef CONFIG_DEBUG_LIST #ifndef CONFIG_DEBUG_LIST
static inline void __list_add(struct list_head *new, static inline void __list_add(struct list_head *new,
struct list_head *prev, struct list_head *prev, struct list_head *next)
struct list_head *next)
{ {
next->prev = new; next->prev = new;
new->next = next; new->next = next;
...@@ -73,8 +70,7 @@ static inline void __list_add(struct list_head *new, ...@@ -73,8 +70,7 @@ static inline void __list_add(struct list_head *new,
} }
#else #else
extern void __list_add(struct list_head *new, extern void __list_add(struct list_head *new,
struct list_head *prev, struct list_head *prev, struct list_head *next);
struct list_head *next);
#endif #endif
/** /**
...@@ -90,7 +86,6 @@ static inline void list_add(struct list_head *new, struct list_head *head) ...@@ -90,7 +86,6 @@ static inline void list_add(struct list_head *new, struct list_head *head)
__list_add(new, head, head->next); __list_add(new, head, head->next);
} }
/** /**
* list_add_tail - add a new entry * list_add_tail - add a new entry
* @new: new entry to be added * @new: new entry to be added
...@@ -111,7 +106,7 @@ static inline void list_add_tail(struct list_head *new, struct list_head *head) ...@@ -111,7 +106,7 @@ static inline void list_add_tail(struct list_head *new, struct list_head *head)
* This is only for internal list manipulation where we know * This is only for internal list manipulation where we know
* the prev/next entries already! * the prev/next entries already!
*/ */
static inline void __list_del(struct list_head * prev, struct list_head * next) static inline void __list_del(struct list_head *prev, struct list_head *next)
{ {
next->prev = prev; next->prev = prev;
prev->next = next; prev->next = next;
...@@ -127,8 +122,8 @@ static inline void __list_del(struct list_head * prev, struct list_head * next) ...@@ -127,8 +122,8 @@ static inline void __list_del(struct list_head * prev, struct list_head * next)
static inline void list_del(struct list_head *entry) static inline void list_del(struct list_head *entry)
{ {
__list_del(entry->prev, entry->next); __list_del(entry->prev, entry->next);
entry->next = (void*)0xDEADBEEF; entry->next = (void *)0xDEADBEEF;
entry->prev = (void*)0xBEEFDEAD; entry->prev = (void *)0xBEEFDEAD;
} }
#else #else
extern void list_del(struct list_head *entry); extern void list_del(struct list_head *entry);
...@@ -141,8 +136,7 @@ extern void list_del(struct list_head *entry); ...@@ -141,8 +136,7 @@ extern void list_del(struct list_head *entry);
* *
* If @old was empty, it will be overwritten. * If @old was empty, it will be overwritten.
*/ */
static inline void list_replace(struct list_head *old, static inline void list_replace(struct list_head *old, struct list_head *new)
struct list_head *new)
{ {
new->next = old->next; new->next = old->next;
new->next->prev = new; new->next->prev = new;
...@@ -151,7 +145,7 @@ static inline void list_replace(struct list_head *old, ...@@ -151,7 +145,7 @@ static inline void list_replace(struct list_head *old,
} }
static inline void list_replace_init(struct list_head *old, static inline void list_replace_init(struct list_head *old,
struct list_head *new) struct list_head *new)
{ {
list_replace(old, new); list_replace(old, new);
INIT_LIST_HEAD(old); INIT_LIST_HEAD(old);
...@@ -196,7 +190,7 @@ static inline void list_move_tail(struct list_head *list, ...@@ -196,7 +190,7 @@ static inline void list_move_tail(struct list_head *list,
* @head: the head of the list * @head: the head of the list
*/ */
static inline int list_is_last(const struct list_head *list, static inline int list_is_last(const struct list_head *list,
const struct list_head *head) const struct list_head *head)
{ {
return list->next == head; return list->next == head;
} }
...@@ -239,7 +233,8 @@ static inline int list_is_singular(const struct list_head *head) ...@@ -239,7 +233,8 @@ static inline int list_is_singular(const struct list_head *head)
} }
static inline void __list_cut_position(struct list_head *list, static inline void __list_cut_position(struct list_head *list,
struct list_head *head, struct list_head *entry) struct list_head *head,
struct list_head *entry)
{ {
struct list_head *new_first = entry->next; struct list_head *new_first = entry->next;
list->next = head->next; list->next = head->next;
...@@ -265,12 +260,12 @@ static inline void __list_cut_position(struct list_head *list, ...@@ -265,12 +260,12 @@ static inline void __list_cut_position(struct list_head *list,
* *
*/ */
static inline void list_cut_position(struct list_head *list, static inline void list_cut_position(struct list_head *list,
struct list_head *head, struct list_head *entry) struct list_head *head,
struct list_head *entry)
{ {
if (list_empty(head)) if (list_empty(head))
return; return;
if (list_is_singular(head) && if (list_is_singular(head) && (head->next != entry && head != entry))
(head->next != entry && head != entry))
return; return;
if (entry == head) if (entry == head)
INIT_LIST_HEAD(list); INIT_LIST_HEAD(list);
...@@ -279,8 +274,7 @@ static inline void list_cut_position(struct list_head *list, ...@@ -279,8 +274,7 @@ static inline void list_cut_position(struct list_head *list,
} }
static inline void __list_splice(const struct list_head *list, static inline void __list_splice(const struct list_head *list,
struct list_head *prev, struct list_head *prev, struct list_head *next)
struct list_head *next)
{ {
struct list_head *first = list->next; struct list_head *first = list->next;
struct list_head *last = list->prev; struct list_head *last = list->prev;
...@@ -298,7 +292,7 @@ static inline void __list_splice(const struct list_head *list, ...@@ -298,7 +292,7 @@ static inline void __list_splice(const struct list_head *list,
* @head: the place to add it in the first list. * @head: the place to add it in the first list.
*/ */
static inline void list_splice(const struct list_head *list, static inline void list_splice(const struct list_head *list,
struct list_head *head) struct list_head *head)
{ {
if (!list_empty(list)) if (!list_empty(list))
__list_splice(list, head, head->next); __list_splice(list, head, head->next);
...@@ -310,7 +304,7 @@ static inline void list_splice(const struct list_head *list, ...@@ -310,7 +304,7 @@ static inline void list_splice(const struct list_head *list,
* @head: the place to add it in the first list. * @head: the place to add it in the first list.
*/ */
static inline void list_splice_tail(struct list_head *list, static inline void list_splice_tail(struct list_head *list,
struct list_head *head) struct list_head *head)
{ {
if (!list_empty(list)) if (!list_empty(list))
__list_splice(list, head->prev, head); __list_splice(list, head->prev, head);
...@@ -376,7 +370,7 @@ static inline void list_splice_tail_init(struct list_head *list, ...@@ -376,7 +370,7 @@ static inline void list_splice_tail_init(struct list_head *list,
*/ */
#define list_for_each(pos, head) \ #define list_for_each(pos, head) \
for (pos = (head)->next; prefetch(pos->next), pos != (head); \ for (pos = (head)->next; prefetch(pos->next), pos != (head); \
pos = pos->next) pos = pos->next)
/** /**
* __list_for_each - iterate over a list * __list_for_each - iterate over a list
...@@ -398,7 +392,7 @@ static inline void list_splice_tail_init(struct list_head *list, ...@@ -398,7 +392,7 @@ static inline void list_splice_tail_init(struct list_head *list,
*/ */
#define list_for_each_prev(pos, head) \ #define list_for_each_prev(pos, head) \
for (pos = (head)->prev; prefetch(pos->prev), pos != (head); \ for (pos = (head)->prev; prefetch(pos->prev), pos != (head); \
pos = pos->prev) pos = pos->prev)
/** /**
* list_for_each_safe - iterate over a list safe against removal of list entry * list_for_each_safe - iterate over a list safe against removal of list entry
...@@ -555,172 +549,172 @@ static inline void list_splice_tail_init(struct list_head *list, ...@@ -555,172 +549,172 @@ static inline void list_splice_tail_init(struct list_head *list,
pos = n, n = list_entry(n->member.prev, typeof(*n), member)) pos = n, n = list_entry(n->member.prev, typeof(*n), member))
struct offset { struct offset {
struct list_head list; struct list_head list;
unsigned offset; unsigned offset;
}; };
struct table { struct table {
struct list_head offsets; struct list_head offsets;
unsigned offset_max; unsigned offset_max;
unsigned nentry; unsigned nentry;
unsigned *table; unsigned *table;
char *gpu_prefix; char *gpu_prefix;
}; };
struct offset* offset_new(unsigned o) struct offset *offset_new(unsigned o)
{ {
struct offset *offset; struct offset *offset;
offset = (struct offset*)malloc(sizeof(struct offset)); offset = (struct offset *)malloc(sizeof(struct offset));
if (offset) { if (offset) {
INIT_LIST_HEAD(&offset->list); INIT_LIST_HEAD(&offset->list);
offset->offset = o; offset->offset = o;
} }
return offset; return offset;
} }
void table_offset_add(struct table *t, struct offset *offset) void table_offset_add(struct table *t, struct offset *offset)
{ {
list_add_tail(&offset->list, &t->offsets); list_add_tail(&offset->list, &t->offsets);
} }
void table_init(struct table *t) void table_init(struct table *t)
{ {
INIT_LIST_HEAD(&t->offsets); INIT_LIST_HEAD(&t->offsets);
t->offset_max = 0; t->offset_max = 0;
t->nentry = 0; t->nentry = 0;
t->table = NULL; t->table = NULL;
} }
void table_print(struct table *t) void table_print(struct table *t)
{ {
unsigned nlloop, i, j, n, c, id; unsigned nlloop, i, j, n, c, id;
nlloop = (t->nentry + 3) / 4; nlloop = (t->nentry + 3) / 4;
c = t->nentry; c = t->nentry;
printf("static const unsigned %s_reg_safe_bm[%d] = {\n", t->gpu_prefix, t->nentry); printf("static const unsigned %s_reg_safe_bm[%d] = {\n", t->gpu_prefix,
for(i = 0, id = 0; i < nlloop; i++) { t->nentry);
n = 4; for (i = 0, id = 0; i < nlloop; i++) {
if (n > c) { n = 4;
n = c; if (n > c)
} n = c;
c -= n; c -= n;
for(j = 0; j < n; j++) { for (j = 0; j < n; j++) {
if (j == 0) printf("\t"); if (j == 0)
else printf(" "); printf("\t");
printf("0x%08X,", t->table[id++]); else
} printf(" ");
printf("\n"); printf("0x%08X,", t->table[id++]);
} }
printf("};\n"); printf("\n");
}
printf("};\n");
} }
int table_build(struct table *t) int table_build(struct table *t)
{ {
struct offset *offset; struct offset *offset;
unsigned i, m; unsigned i, m;
t->nentry = ((t->offset_max >> 2) + 31) / 32; t->nentry = ((t->offset_max >> 2) + 31) / 32;
t->table = (unsigned*)malloc(sizeof(unsigned) * t->nentry); t->table = (unsigned *)malloc(sizeof(unsigned) * t->nentry);
if (t->table == NULL) { if (t->table == NULL)
return -1; return -1;
} memset(t->table, 0xff, sizeof(unsigned) * t->nentry);
memset(t->table, 0xff, sizeof(unsigned) * t->nentry); list_for_each_entry(offset, &t->offsets, list) {
list_for_each_entry(offset, &t->offsets, list) { i = (offset->offset >> 2) / 32;
i = (offset->offset >> 2) / 32; m = (offset->offset >> 2) & 31;
m = (offset->offset >> 2) & 31; m = 1 << m;
m = 1 << m; t->table[i] ^= m;
t->table[i] ^= m; }
} return 0;
return 0;
} }
static char gpu_name[10]; static char gpu_name[10];
int parser_auth(struct table *t, const char *filename) int parser_auth(struct table *t, const char *filename)
{ {
FILE *file; FILE *file;
regex_t mask_rex; regex_t mask_rex;
regmatch_t match[4]; regmatch_t match[4];
char buf[1024]; char buf[1024];
size_t end; size_t end;
int len; int len;
int done = 0; int done = 0;
int r; int r;
unsigned o; unsigned o;
struct offset *offset; struct offset *offset;
char last_reg_s[10]; char last_reg_s[10];
int last_reg; int last_reg;
if (regcomp(&mask_rex, "(0x[0-9a-fA-F]*) *([_a-zA-Z0-9]*)", REG_EXTENDED)) { if (regcomp
fprintf(stderr, "Failed to compile regular expression\n"); (&mask_rex, "(0x[0-9a-fA-F]*) *([_a-zA-Z0-9]*)", REG_EXTENDED)) {
return -1; fprintf(stderr, "Failed to compile regular expression\n");
} return -1;
file = fopen(filename, "r"); }
if (file == NULL) { file = fopen(filename, "r");
fprintf(stderr, "Failed to open: %s\n", filename); if (file == NULL) {
return -1; fprintf(stderr, "Failed to open: %s\n", filename);
} return -1;
fseek(file, 0, SEEK_END); }
end = ftell(file); fseek(file, 0, SEEK_END);
fseek(file, 0, SEEK_SET); end = ftell(file);
fseek(file, 0, SEEK_SET);
/* get header */
if (fgets(buf, 1024, file) == NULL) /* get header */
return -1; if (fgets(buf, 1024, file) == NULL)
return -1;
/* first line will contain the last register
* and gpu name */ /* first line will contain the last register
sscanf(buf, "%s %s", gpu_name, last_reg_s); * and gpu name */
t->gpu_prefix = gpu_name; sscanf(buf, "%s %s", gpu_name, last_reg_s);
last_reg = strtol(last_reg_s, NULL, 16); t->gpu_prefix = gpu_name;
last_reg = strtol(last_reg_s, NULL, 16);
do {
if (fgets(buf, 1024, file) == NULL) do {
return -1; if (fgets(buf, 1024, file) == NULL)
len = strlen(buf); return -1;
if (ftell(file) == end) { len = strlen(buf);
done = 1; if (ftell(file) == end)
} done = 1;
if (len) { if (len) {
r = regexec(&mask_rex, buf, 4, match, 0); r = regexec(&mask_rex, buf, 4, match, 0);
if (r == REG_NOMATCH) { if (r == REG_NOMATCH) {
} else if (r) { } else if (r) {
fprintf(stderr, "Error matching regular expression %d in %s\n", fprintf(stderr,
r, filename); "Error matching regular expression %d in %s\n",
return -1; r, filename);
} else { return -1;
buf[match[0].rm_eo] = 0; } else {
buf[match[1].rm_eo] = 0; buf[match[0].rm_eo] = 0;
buf[match[2].rm_eo] = 0; buf[match[1].rm_eo] = 0;
o = strtol(&buf[match[1].rm_so], NULL, 16); buf[match[2].rm_eo] = 0;
offset = offset_new(o); o = strtol(&buf[match[1].rm_so], NULL, 16);
table_offset_add(t, offset); offset = offset_new(o);
if (o > t->offset_max) { table_offset_add(t, offset);
t->offset_max = o; if (o > t->offset_max)
} t->offset_max = o;
} }
} }
} while (!done); } while (!done);
fclose(file); fclose(file);
if (t->offset_max < last_reg) if (t->offset_max < last_reg)
t->offset_max = last_reg; t->offset_max = last_reg;
return table_build(t); return table_build(t);
} }
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
struct table t; struct table t;
if (argc != 2) { if (argc != 2) {
fprintf(stderr, "Usage: %s <authfile>\n", fprintf(stderr, "Usage: %s <authfile>\n", argv[0]);
argv[0]); exit(1);
exit(1); }
} table_init(&t);
table_init(&t); if (parser_auth(&t, argv[1])) {
if (parser_auth(&t, argv[1])) { fprintf(stderr, "Failed to parse file %s\n", argv[1]);
fprintf(stderr, "Failed to parse file %s\n", argv[1]); return -1;
return -1; }
} table_print(&t);
table_print(&t); return 0;
return 0;
} }
...@@ -153,7 +153,7 @@ r300 0x4f60 ...@@ -153,7 +153,7 @@ r300 0x4f60
0x42A4 SU_POLY_OFFSET_FRONT_SCALE 0x42A4 SU_POLY_OFFSET_FRONT_SCALE
0x42A8 SU_POLY_OFFSET_FRONT_OFFSET 0x42A8 SU_POLY_OFFSET_FRONT_OFFSET
0x42AC SU_POLY_OFFSET_BACK_SCALE 0x42AC SU_POLY_OFFSET_BACK_SCALE
0x42B0 SU_POLY_OFFSET_BACK_OFFSET 0x42B0 SU_POLY_OFFSET_BACK_OFFSET
0x42B4 SU_POLY_OFFSET_ENABLE 0x42B4 SU_POLY_OFFSET_ENABLE
0x42B8 SU_CULL_MODE 0x42B8 SU_CULL_MODE
0x42C0 SU_DEPTH_SCALE 0x42C0 SU_DEPTH_SCALE
......
...@@ -186,7 +186,7 @@ rv515 0x6d40 ...@@ -186,7 +186,7 @@ rv515 0x6d40
0x42A4 SU_POLY_OFFSET_FRONT_SCALE 0x42A4 SU_POLY_OFFSET_FRONT_SCALE
0x42A8 SU_POLY_OFFSET_FRONT_OFFSET 0x42A8 SU_POLY_OFFSET_FRONT_OFFSET
0x42AC SU_POLY_OFFSET_BACK_SCALE 0x42AC SU_POLY_OFFSET_BACK_SCALE
0x42B0 SU_POLY_OFFSET_BACK_OFFSET 0x42B0 SU_POLY_OFFSET_BACK_OFFSET
0x42B4 SU_POLY_OFFSET_ENABLE 0x42B4 SU_POLY_OFFSET_ENABLE
0x42B8 SU_CULL_MODE 0x42B8 SU_CULL_MODE
0x42C0 SU_DEPTH_SCALE 0x42C0 SU_DEPTH_SCALE
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment