2 * csr1212.c -- IEEE 1212 Control and Status Register support for Linux
4 * Copyright (C) 2003 Francois Retief <fgretief@sun.ac.za>
5 * Steve Kinneberg <kinnebergsteve@acmsystems.com>
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions are met:
10 * 1. Redistributions of source code must retain the above copyright notice,
11 * this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. The name of the author may not be used to endorse or promote products
16 * derived from this software without specific prior written permission.
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
19 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
20 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
21 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
23 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
24 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
26 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
27 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 * - Verify interface consistency: i.e., public functions that take a size
33 * parameter expect size to be in bytes.
36 #include <linux/errno.h>
37 #include <linux/string.h>
38 #include <asm/byteorder.h>
43 /* Permitted key type for each key id */
44 #define __I (1 << CSR1212_KV_TYPE_IMMEDIATE)
45 #define __C (1 << CSR1212_KV_TYPE_CSR_OFFSET)
46 #define __D (1 << CSR1212_KV_TYPE_DIRECTORY)
47 #define __L (1 << CSR1212_KV_TYPE_LEAF)
48 static const u8 csr1212_key_id_type_map[0x30] = {
49 __C, /* used by Apple iSight */
50 __D | __L, /* Descriptor */
51 __I | __D | __L, /* Bus_Dependent_Info */
52 __I | __D | __L, /* Vendor */
53 __I, /* Hardware_Version */
55 __D | __L | __I, /* Module */
56 __I, 0, 0, 0, /* used by Apple iSight, Reserved */
57 __I, /* Node_Capabilities */
59 0, 0, 0, /* Reserved */
61 __I, /* Specifier_ID */
63 __I | __C | __D | __L, /* Dependent_Info */
64 __L, /* Unit_Location */
70 __L, /* Extended_ROM */
71 __I, /* Extended_Key_Specifier_ID */
72 __I, /* Extended_Key */
73 __I | __C | __D | __L, /* Extended_Data */
74 __L, /* Modifiable_Descriptor */
75 __I, /* Directory_ID */
84 #define quads_to_bytes(_q) ((_q) * sizeof(u32))
85 #define bytes_to_quads(_b) (((_b) + sizeof(u32) - 1) / sizeof(u32))
87 static void free_keyval(struct csr1212_keyval *kv)
89 if ((kv->key.type == CSR1212_KV_TYPE_LEAF) &&
90 (kv->key.id != CSR1212_KV_ID_EXTENDED_ROM))
91 CSR1212_FREE(kv->value.leaf.data);
96 static u16 csr1212_crc16(const u32 *buffer, size_t length)
102 for (; length; length--) {
103 data = be32_to_cpu(*buffer);
105 for (shift = 28; shift >= 0; shift -= 4 ) {
106 sum = ((crc >> 12) ^ (data >> shift)) & 0xf;
107 crc = (crc << 4) ^ (sum << 12) ^ (sum << 5) ^ (sum);
112 return cpu_to_be16(crc);
116 /* Microsoft computes the CRC with the bytes in reverse order. Therefore we
117 * have a special version of the CRC algorithm to account for their buggy
119 static u16 csr1212_msft_crc16(const u32 *buffer, size_t length)
125 for (; length; length--) {
126 data = le32_to_cpu(*buffer);
128 for (shift = 28; shift >= 0; shift -= 4 ) {
129 sum = ((crc >> 12) ^ (data >> shift)) & 0xf;
130 crc = (crc << 4) ^ (sum << 12) ^ (sum << 5) ^ (sum);
135 return cpu_to_be16(crc);
139 static struct csr1212_dentry *
140 csr1212_find_keyval(struct csr1212_keyval *dir, struct csr1212_keyval *kv)
142 struct csr1212_dentry *pos;
144 for (pos = dir->value.directory.dentries_head;
145 pos != NULL; pos = pos->next) {
152 static struct csr1212_keyval *
153 csr1212_find_keyval_offset(struct csr1212_keyval *kv_list, u32 offset)
155 struct csr1212_keyval *kv;
157 for (kv = kv_list->next; kv && (kv != kv_list); kv = kv->next) {
158 if (kv->offset == offset)
165 /* Creation Routines */
167 struct csr1212_csr *csr1212_create_csr(struct csr1212_bus_ops *ops,
168 size_t bus_info_size, void *private)
170 struct csr1212_csr *csr;
172 csr = CSR1212_MALLOC(sizeof(*csr));
177 csr1212_rom_cache_malloc(CSR1212_CONFIG_ROM_SPACE_OFFSET,
178 CSR1212_CONFIG_ROM_SPACE_SIZE);
179 if (!csr->cache_head) {
184 /* The keyval key id is not used for the root node, but a valid key id
185 * that can be used for a directory needs to be passed to
186 * csr1212_new_directory(). */
187 csr->root_kv = csr1212_new_directory(CSR1212_KV_ID_VENDOR);
189 CSR1212_FREE(csr->cache_head);
194 csr->bus_info_data = csr->cache_head->data;
195 csr->bus_info_len = bus_info_size;
196 csr->crc_len = bus_info_size;
198 csr->private = private;
199 csr->cache_tail = csr->cache_head;
204 void csr1212_init_local_csr(struct csr1212_csr *csr,
205 const u32 *bus_info_data, int max_rom)
207 static const int mr_map[] = { 4, 64, 1024, 0 };
209 BUG_ON(max_rom & ~0x3);
210 csr->max_rom = mr_map[max_rom];
211 memcpy(csr->bus_info_data, bus_info_data, csr->bus_info_len);
214 static struct csr1212_keyval *csr1212_new_keyval(u8 type, u8 key)
216 struct csr1212_keyval *kv;
218 if (key < 0x30 && ((csr1212_key_id_type_map[key] & (1 << type)) == 0))
221 kv = CSR1212_MALLOC(sizeof(*kv));
228 kv->associate = NULL;
238 struct csr1212_keyval *csr1212_new_immediate(u8 key, u32 value)
240 struct csr1212_keyval *kv = csr1212_new_keyval(CSR1212_KV_TYPE_IMMEDIATE, key);
245 kv->value.immediate = value;
250 static struct csr1212_keyval *
251 csr1212_new_leaf(u8 key, const void *data, size_t data_len)
253 struct csr1212_keyval *kv = csr1212_new_keyval(CSR1212_KV_TYPE_LEAF, key);
259 kv->value.leaf.data = CSR1212_MALLOC(data_len);
260 if (!kv->value.leaf.data) {
266 memcpy(kv->value.leaf.data, data, data_len);
268 kv->value.leaf.data = NULL;
271 kv->value.leaf.len = bytes_to_quads(data_len);
278 static struct csr1212_keyval *
279 csr1212_new_csr_offset(u8 key, u32 csr_offset)
281 struct csr1212_keyval *kv = csr1212_new_keyval(CSR1212_KV_TYPE_CSR_OFFSET, key);
286 kv->value.csr_offset = csr_offset;
293 struct csr1212_keyval *csr1212_new_directory(u8 key)
295 struct csr1212_keyval *kv = csr1212_new_keyval(CSR1212_KV_TYPE_DIRECTORY, key);
300 kv->value.directory.len = 0;
302 kv->value.directory.dentries_head = NULL;
303 kv->value.directory.dentries_tail = NULL;
308 int csr1212_associate_keyval(struct csr1212_keyval *kv,
309 struct csr1212_keyval *associate)
311 if (!kv || !associate)
314 if (kv->key.id == CSR1212_KV_ID_DESCRIPTOR ||
315 (associate->key.id != CSR1212_KV_ID_DESCRIPTOR &&
316 associate->key.id != CSR1212_KV_ID_DEPENDENT_INFO &&
317 associate->key.id != CSR1212_KV_ID_EXTENDED_KEY &&
318 associate->key.id != CSR1212_KV_ID_EXTENDED_DATA &&
319 associate->key.id < 0x30))
322 if (kv->key.id == CSR1212_KV_ID_EXTENDED_KEY_SPECIFIER_ID &&
323 associate->key.id != CSR1212_KV_ID_EXTENDED_KEY)
326 if (kv->key.id == CSR1212_KV_ID_EXTENDED_KEY &&
327 associate->key.id != CSR1212_KV_ID_EXTENDED_DATA)
330 if (associate->key.id == CSR1212_KV_ID_EXTENDED_KEY &&
331 kv->key.id != CSR1212_KV_ID_EXTENDED_KEY_SPECIFIER_ID)
334 if (associate->key.id == CSR1212_KV_ID_EXTENDED_DATA &&
335 kv->key.id != CSR1212_KV_ID_EXTENDED_KEY)
339 csr1212_release_keyval(kv->associate);
342 kv->associate = associate;
344 return CSR1212_SUCCESS;
347 int csr1212_attach_keyval_to_directory(struct csr1212_keyval *dir,
348 struct csr1212_keyval *kv)
350 struct csr1212_dentry *dentry;
352 if (!kv || !dir || dir->key.type != CSR1212_KV_TYPE_DIRECTORY)
355 dentry = CSR1212_MALLOC(sizeof(*dentry));
364 dentry->prev = dir->value.directory.dentries_tail;
366 if (!dir->value.directory.dentries_head)
367 dir->value.directory.dentries_head = dentry;
369 if (dir->value.directory.dentries_tail)
370 dir->value.directory.dentries_tail->next = dentry;
371 dir->value.directory.dentries_tail = dentry;
373 return CSR1212_SUCCESS;
376 #define CSR1212_DESCRIPTOR_LEAF_DATA(kv) \
377 (&((kv)->value.leaf.data[1]))
379 #define CSR1212_DESCRIPTOR_LEAF_SET_TYPE(kv, type) \
380 ((kv)->value.leaf.data[0] = \
381 cpu_to_be32(CSR1212_DESCRIPTOR_LEAF_SPECIFIER_ID(kv) | \
382 ((type) << CSR1212_DESCRIPTOR_LEAF_TYPE_SHIFT)))
383 #define CSR1212_DESCRIPTOR_LEAF_SET_SPECIFIER_ID(kv, spec_id) \
384 ((kv)->value.leaf.data[0] = \
385 cpu_to_be32((CSR1212_DESCRIPTOR_LEAF_TYPE(kv) << \
386 CSR1212_DESCRIPTOR_LEAF_TYPE_SHIFT) | \
387 ((spec_id) & CSR1212_DESCRIPTOR_LEAF_SPECIFIER_ID_MASK)))
389 static struct csr1212_keyval *
390 csr1212_new_descriptor_leaf(u8 dtype, u32 specifier_id,
391 const void *data, size_t data_len)
393 struct csr1212_keyval *kv;
395 kv = csr1212_new_leaf(CSR1212_KV_ID_DESCRIPTOR, NULL,
396 data_len + CSR1212_DESCRIPTOR_LEAF_OVERHEAD);
400 CSR1212_DESCRIPTOR_LEAF_SET_TYPE(kv, dtype);
401 CSR1212_DESCRIPTOR_LEAF_SET_SPECIFIER_ID(kv, specifier_id);
404 memcpy(CSR1212_DESCRIPTOR_LEAF_DATA(kv), data, data_len);
410 #define CSR1212_TEXTUAL_DESCRIPTOR_LEAF_SET_WIDTH(kv, width) \
411 ((kv)->value.leaf.data[1] = \
412 ((kv)->value.leaf.data[1] & \
413 cpu_to_be32(~(CSR1212_TEXTUAL_DESCRIPTOR_LEAF_WIDTH_MASK << \
414 CSR1212_TEXTUAL_DESCRIPTOR_LEAF_WIDTH_SHIFT))) | \
415 cpu_to_be32(((width) & CSR1212_TEXTUAL_DESCRIPTOR_LEAF_WIDTH_MASK) << \
416 CSR1212_TEXTUAL_DESCRIPTOR_LEAF_WIDTH_SHIFT))
418 #define CSR1212_TEXTUAL_DESCRIPTOR_LEAF_SET_CHAR_SET(kv, char_set) \
419 ((kv)->value.leaf.data[1] = \
420 ((kv)->value.leaf.data[1] & \
421 cpu_to_be32(~(CSR1212_TEXTUAL_DESCRIPTOR_LEAF_CHAR_SET_MASK << \
422 CSR1212_TEXTUAL_DESCRIPTOR_LEAF_CHAR_SET_SHIFT))) | \
423 cpu_to_be32(((char_set) & \
424 CSR1212_TEXTUAL_DESCRIPTOR_LEAF_CHAR_SET_MASK) << \
425 CSR1212_TEXTUAL_DESCRIPTOR_LEAF_CHAR_SET_SHIFT))
427 #define CSR1212_TEXTUAL_DESCRIPTOR_LEAF_SET_LANGUAGE(kv, language) \
428 ((kv)->value.leaf.data[1] = \
429 ((kv)->value.leaf.data[1] & \
430 cpu_to_be32(~(CSR1212_TEXTUAL_DESCRIPTOR_LEAF_LANGUAGE_MASK))) | \
431 cpu_to_be32(((language) & \
432 CSR1212_TEXTUAL_DESCRIPTOR_LEAF_LANGUAGE_MASK)))
434 static struct csr1212_keyval *
435 csr1212_new_textual_descriptor_leaf(u8 cwidth, u16 cset, u16 language,
436 const void *data, size_t data_len)
438 struct csr1212_keyval *kv;
441 kv = csr1212_new_descriptor_leaf(0, 0, NULL, data_len +
442 CSR1212_TEXTUAL_DESCRIPTOR_LEAF_OVERHEAD);
446 CSR1212_TEXTUAL_DESCRIPTOR_LEAF_SET_WIDTH(kv, cwidth);
447 CSR1212_TEXTUAL_DESCRIPTOR_LEAF_SET_CHAR_SET(kv, cset);
448 CSR1212_TEXTUAL_DESCRIPTOR_LEAF_SET_LANGUAGE(kv, language);
450 lstr = (char*)CSR1212_TEXTUAL_DESCRIPTOR_LEAF_DATA(kv);
452 /* make sure last quadlet is zeroed out */
453 *((u32*)&(lstr[(data_len - 1) & ~0x3])) = 0;
455 /* don't copy the NUL terminator */
456 memcpy(lstr, data, data_len);
461 static int csr1212_check_minimal_ascii(const char *s)
463 static const char minimal_ascii_table[] = {
464 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07,
465 0x00, 0x00, 0x0a, 0x00, 0x0C, 0x0D, 0x00, 0x00,
466 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
467 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
468 0x20, 0x21, 0x22, 0x00, 0x00, 0x25, 0x26, 0x27,
469 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
470 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
471 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
472 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
473 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
474 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
475 0x58, 0x59, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x5f,
476 0x00, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
477 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
478 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
479 0x78, 0x79, 0x7a, 0x00, 0x00, 0x00, 0x00, 0x00,
482 if (minimal_ascii_table[*s & 0x7F] != *s)
483 return -1; /* failed */
485 /* String conforms to minimal-ascii, as specified by IEEE 1212,
490 struct csr1212_keyval *csr1212_new_string_descriptor_leaf(const char *s)
492 /* Check if string conform to minimal_ascii format */
493 if (csr1212_check_minimal_ascii(s))
496 /* IEEE 1212, par. 7.5.4.1 Textual descriptors (minimal ASCII) */
497 return csr1212_new_textual_descriptor_leaf(0, 0, 0, s, strlen(s));
501 /* Destruction Routines */
503 void csr1212_detach_keyval_from_directory(struct csr1212_keyval *dir,
504 struct csr1212_keyval *kv)
506 struct csr1212_dentry *dentry;
508 if (!kv || !dir || dir->key.type != CSR1212_KV_TYPE_DIRECTORY)
511 dentry = csr1212_find_keyval(dir, kv);
517 dentry->prev->next = dentry->next;
519 dentry->next->prev = dentry->prev;
520 if (dir->value.directory.dentries_head == dentry)
521 dir->value.directory.dentries_head = dentry->next;
522 if (dir->value.directory.dentries_tail == dentry)
523 dir->value.directory.dentries_tail = dentry->prev;
525 CSR1212_FREE(dentry);
527 csr1212_release_keyval(kv);
530 /* This function is used to free the memory taken by a keyval. If the given
531 * keyval is a directory type, then any keyvals contained in that directory
532 * will be destroyed as well if their respective refcnts are 0. By means of
533 * list manipulation, this routine will descend a directory structure in a
534 * non-recursive manner. */
535 void _csr1212_destroy_keyval(struct csr1212_keyval *kv)
537 struct csr1212_keyval *k, *a;
538 struct csr1212_dentry dentry;
539 struct csr1212_dentry *head, *tail;
559 if (k->key.type == CSR1212_KV_TYPE_DIRECTORY) {
560 /* If the current entry is a directory, then move all
561 * the entries to the destruction list. */
562 if (k->value.directory.dentries_head) {
563 tail->next = k->value.directory.dentries_head;
564 k->value.directory.dentries_head->prev = tail;
565 tail = k->value.directory.dentries_tail;
574 if (head->prev && head->prev != &dentry) {
575 CSR1212_FREE(head->prev);
578 } else if (tail != &dentry)
583 void csr1212_destroy_csr(struct csr1212_csr *csr)
585 struct csr1212_csr_rom_cache *c, *oc;
586 struct csr1212_cache_region *cr, *ocr;
588 csr1212_release_keyval(csr->root_kv);
607 /* CSR Image Creation */
609 static int csr1212_append_new_cache(struct csr1212_csr *csr, size_t romsize)
611 struct csr1212_csr_rom_cache *cache;
614 if (!csr || !csr->ops || !csr->ops->allocate_addr_range ||
615 !csr->ops->release_addr || csr->max_rom < 1)
618 /* ROM size must be a multiple of csr->max_rom */
619 romsize = (romsize + (csr->max_rom - 1)) & ~(csr->max_rom - 1);
621 csr_addr = csr->ops->allocate_addr_range(romsize, csr->max_rom, csr->private);
622 if (csr_addr == CSR1212_INVALID_ADDR_SPACE) {
625 if (csr_addr < CSR1212_REGISTER_SPACE_BASE) {
626 /* Invalid address returned from allocate_addr_range(). */
627 csr->ops->release_addr(csr_addr, csr->private);
631 cache = csr1212_rom_cache_malloc(csr_addr - CSR1212_REGISTER_SPACE_BASE, romsize);
633 csr->ops->release_addr(csr_addr, csr->private);
637 cache->ext_rom = csr1212_new_keyval(CSR1212_KV_TYPE_LEAF, CSR1212_KV_ID_EXTENDED_ROM);
638 if (!cache->ext_rom) {
639 csr->ops->release_addr(csr_addr, csr->private);
644 if (csr1212_attach_keyval_to_directory(csr->root_kv, cache->ext_rom) != CSR1212_SUCCESS) {
645 csr1212_release_keyval(cache->ext_rom);
646 csr->ops->release_addr(csr_addr, csr->private);
650 cache->ext_rom->offset = csr_addr - CSR1212_REGISTER_SPACE_BASE;
651 cache->ext_rom->value.leaf.len = -1;
652 cache->ext_rom->value.leaf.data = cache->data;
654 /* Add cache to tail of cache list */
655 cache->prev = csr->cache_tail;
656 csr->cache_tail->next = cache;
657 csr->cache_tail = cache;
658 return CSR1212_SUCCESS;
661 static void csr1212_remove_cache(struct csr1212_csr *csr,
662 struct csr1212_csr_rom_cache *cache)
664 if (csr->cache_head == cache)
665 csr->cache_head = cache->next;
666 if (csr->cache_tail == cache)
667 csr->cache_tail = cache->prev;
670 cache->prev->next = cache->next;
672 cache->next->prev = cache->prev;
674 if (cache->ext_rom) {
675 csr1212_detach_keyval_from_directory(csr->root_kv, cache->ext_rom);
676 csr1212_release_keyval(cache->ext_rom);
682 static int csr1212_generate_layout_subdir(struct csr1212_keyval *dir,
683 struct csr1212_keyval **layout_tail)
685 struct csr1212_dentry *dentry;
686 struct csr1212_keyval *dkv;
687 struct csr1212_keyval *last_extkey_spec = NULL;
688 struct csr1212_keyval *last_extkey = NULL;
691 for (dentry = dir->value.directory.dentries_head; dentry;
692 dentry = dentry->next) {
693 for (dkv = dentry->kv; dkv; dkv = dkv->associate) {
694 /* Special Case: Extended Key Specifier_ID */
695 if (dkv->key.id == CSR1212_KV_ID_EXTENDED_KEY_SPECIFIER_ID) {
696 if (last_extkey_spec == NULL) {
697 last_extkey_spec = dkv;
698 } else if (dkv->value.immediate != last_extkey_spec->value.immediate) {
699 last_extkey_spec = dkv;
703 /* Special Case: Extended Key */
704 } else if (dkv->key.id == CSR1212_KV_ID_EXTENDED_KEY) {
705 if (last_extkey == NULL) {
707 } else if (dkv->value.immediate != last_extkey->value.immediate) {
716 switch(dkv->key.type) {
718 case CSR1212_KV_TYPE_IMMEDIATE:
719 case CSR1212_KV_TYPE_CSR_OFFSET:
721 case CSR1212_KV_TYPE_LEAF:
722 case CSR1212_KV_TYPE_DIRECTORY:
723 /* Remove from list */
724 if (dkv->prev && (dkv->prev->next == dkv))
725 dkv->prev->next = dkv->next;
726 if (dkv->next && (dkv->next->prev == dkv))
727 dkv->next->prev = dkv->prev;
728 //if (dkv == *layout_tail)
729 // *layout_tail = dkv->prev;
731 /* Special case: Extended ROM leafs */
732 if (dkv->key.id == CSR1212_KV_ID_EXTENDED_ROM) {
733 dkv->value.leaf.len = -1;
734 /* Don't add Extended ROM leafs in the layout list,
735 * they are handled differently. */
739 /* Add to tail of list */
741 dkv->prev = *layout_tail;
742 (*layout_tail)->next = dkv;
751 static size_t csr1212_generate_layout_order(struct csr1212_keyval *kv)
753 struct csr1212_keyval *ltail = kv;
757 switch(kv->key.type) {
758 case CSR1212_KV_TYPE_LEAF:
759 /* Add 1 quadlet for crc/len field */
760 agg_size += kv->value.leaf.len + 1;
763 case CSR1212_KV_TYPE_DIRECTORY:
764 kv->value.directory.len = csr1212_generate_layout_subdir(kv, <ail);
765 /* Add 1 quadlet for crc/len field */
766 agg_size += kv->value.directory.len + 1;
771 return quads_to_bytes(agg_size);
774 static struct csr1212_keyval *
775 csr1212_generate_positions(struct csr1212_csr_rom_cache *cache,
776 struct csr1212_keyval *start_kv, int start_pos)
778 struct csr1212_keyval *kv = start_kv;
779 struct csr1212_keyval *okv = start_kv;
781 int kv_len = 0, okv_len = 0;
783 cache->layout_head = kv;
785 while(kv && pos < cache->size) {
786 /* Special case: Extended ROM leafs */
787 if (kv->key.id != CSR1212_KV_ID_EXTENDED_ROM) {
788 kv->offset = cache->offset + pos;
791 switch(kv->key.type) {
792 case CSR1212_KV_TYPE_LEAF:
793 kv_len = kv->value.leaf.len;
796 case CSR1212_KV_TYPE_DIRECTORY:
797 kv_len = kv->value.directory.len;
801 /* Should never get here */
805 pos += quads_to_bytes(kv_len + 1);
807 if (pos <= cache->size) {
814 cache->layout_tail = okv;
815 cache->len = (okv->offset - cache->offset) + quads_to_bytes(okv_len + 1);
820 #define CSR1212_KV_KEY_SHIFT 24
821 #define CSR1212_KV_KEY_TYPE_SHIFT 6
822 #define CSR1212_KV_KEY_ID_MASK 0x3f
823 #define CSR1212_KV_KEY_TYPE_MASK 0x3 /* after shift */
826 csr1212_generate_tree_subdir(struct csr1212_keyval *dir, u32 *data_buffer)
828 struct csr1212_dentry *dentry;
829 struct csr1212_keyval *last_extkey_spec = NULL;
830 struct csr1212_keyval *last_extkey = NULL;
833 for (dentry = dir->value.directory.dentries_head; dentry; dentry = dentry->next) {
834 struct csr1212_keyval *a;
836 for (a = dentry->kv; a; a = a->associate) {
839 /* Special Case: Extended Key Specifier_ID */
840 if (a->key.id == CSR1212_KV_ID_EXTENDED_KEY_SPECIFIER_ID) {
841 if (last_extkey_spec == NULL) {
842 last_extkey_spec = a;
843 } else if (a->value.immediate != last_extkey_spec->value.immediate) {
844 last_extkey_spec = a;
848 /* Special Case: Extended Key */
849 } else if (a->key.id == CSR1212_KV_ID_EXTENDED_KEY) {
850 if (last_extkey == NULL) {
852 } else if (a->value.immediate != last_extkey->value.immediate) {
859 switch(a->key.type) {
860 case CSR1212_KV_TYPE_IMMEDIATE:
861 value = a->value.immediate;
863 case CSR1212_KV_TYPE_CSR_OFFSET:
864 value = a->value.csr_offset;
866 case CSR1212_KV_TYPE_LEAF:
868 value -= dir->offset + quads_to_bytes(1+index);
869 value = bytes_to_quads(value);
871 case CSR1212_KV_TYPE_DIRECTORY:
873 value -= dir->offset + quads_to_bytes(1+index);
874 value = bytes_to_quads(value);
877 /* Should never get here */
878 break; /* GDB breakpoint */
881 value |= (a->key.id & CSR1212_KV_KEY_ID_MASK) << CSR1212_KV_KEY_SHIFT;
882 value |= (a->key.type & CSR1212_KV_KEY_TYPE_MASK) <<
883 (CSR1212_KV_KEY_SHIFT + CSR1212_KV_KEY_TYPE_SHIFT);
884 data_buffer[index] = cpu_to_be32(value);
890 struct csr1212_keyval_img {
895 u32 data[0]; /* older gcc can't handle [] which is standard */
898 static void csr1212_fill_cache(struct csr1212_csr_rom_cache *cache)
900 struct csr1212_keyval *kv, *nkv;
901 struct csr1212_keyval_img *kvi;
903 for (kv = cache->layout_head; kv != cache->layout_tail->next; kv = nkv) {
904 kvi = (struct csr1212_keyval_img *)
905 (cache->data + bytes_to_quads(kv->offset - cache->offset));
906 switch(kv->key.type) {
908 case CSR1212_KV_TYPE_IMMEDIATE:
909 case CSR1212_KV_TYPE_CSR_OFFSET:
910 /* Should never get here */
911 break; /* GDB breakpoint */
913 case CSR1212_KV_TYPE_LEAF:
914 /* Don't copy over Extended ROM areas, they are
915 * already filled out! */
916 if (kv->key.id != CSR1212_KV_ID_EXTENDED_ROM)
917 memcpy(kvi->data, kv->value.leaf.data,
918 quads_to_bytes(kv->value.leaf.len));
920 kvi->length = cpu_to_be16(kv->value.leaf.len);
921 kvi->crc = csr1212_crc16(kvi->data, kv->value.leaf.len);
924 case CSR1212_KV_TYPE_DIRECTORY:
925 csr1212_generate_tree_subdir(kv, kvi->data);
927 kvi->length = cpu_to_be16(kv->value.directory.len);
928 kvi->crc = csr1212_crc16(kvi->data, kv->value.directory.len);
934 kv->prev->next = NULL;
936 kv->next->prev = NULL;
942 #define CSR1212_EXTENDED_ROM_SIZE (0x10000 * sizeof(u32))
944 int csr1212_generate_csr_image(struct csr1212_csr *csr)
946 struct csr1212_bus_info_block_img *bi;
947 struct csr1212_csr_rom_cache *cache;
948 struct csr1212_keyval *kv;
956 cache = csr->cache_head;
958 bi = (struct csr1212_bus_info_block_img*)cache->data;
960 bi->length = bytes_to_quads(csr->bus_info_len) - 1;
961 bi->crc_length = bi->length;
962 bi->crc = csr1212_crc16(bi->data, bi->crc_length);
964 csr->root_kv->next = NULL;
965 csr->root_kv->prev = NULL;
967 agg_size = csr1212_generate_layout_order(csr->root_kv);
969 init_offset = csr->bus_info_len;
971 for (kv = csr->root_kv, cache = csr->cache_head; kv; cache = cache->next) {
973 /* Estimate approximate number of additional cache
974 * regions needed (it assumes that the cache holding
975 * the first 1K Config ROM space always exists). */
976 int est_c = agg_size / (CSR1212_EXTENDED_ROM_SIZE -
977 (2 * sizeof(u32))) + 1;
979 /* Add additional cache regions, extras will be
981 for (; est_c; est_c--) {
982 ret = csr1212_append_new_cache(csr, CSR1212_EXTENDED_ROM_SIZE);
983 if (ret != CSR1212_SUCCESS)
986 /* Need to re-layout for additional cache regions */
987 agg_size = csr1212_generate_layout_order(csr->root_kv);
989 cache = csr->cache_head;
990 init_offset = csr->bus_info_len;
992 kv = csr1212_generate_positions(cache, kv, init_offset);
993 agg_size -= cache->len;
994 init_offset = sizeof(u32);
997 /* Remove unused, excess cache regions */
999 struct csr1212_csr_rom_cache *oc = cache;
1001 cache = cache->next;
1002 csr1212_remove_cache(csr, oc);
1005 /* Go through the list backward so that when done, the correct CRC
1006 * will be calculated for the Extended ROM areas. */
1007 for(cache = csr->cache_tail; cache; cache = cache->prev) {
1008 /* Only Extended ROM caches should have this set. */
1009 if (cache->ext_rom) {
1012 /* Make sure the Extended ROM leaf is a multiple of
1013 * max_rom in size. */
1014 if (csr->max_rom < 1)
1016 leaf_size = (cache->len + (csr->max_rom - 1)) &
1017 ~(csr->max_rom - 1);
1019 /* Zero out the unused ROM region */
1020 memset(cache->data + bytes_to_quads(cache->len), 0x00,
1021 leaf_size - cache->len);
1023 /* Subtract leaf header */
1024 leaf_size -= sizeof(u32);
1026 /* Update the Extended ROM leaf length */
1027 cache->ext_rom->value.leaf.len =
1028 bytes_to_quads(leaf_size);
1030 /* Zero out the unused ROM region */
1031 memset(cache->data + bytes_to_quads(cache->len), 0x00,
1032 cache->size - cache->len);
1035 /* Copy the data into the cache buffer */
1036 csr1212_fill_cache(cache);
1038 if (cache != csr->cache_head) {
1039 /* Set the length and CRC of the extended ROM. */
1040 struct csr1212_keyval_img *kvi =
1041 (struct csr1212_keyval_img*)cache->data;
1042 u16 len = bytes_to_quads(cache->len) - 1;
1044 kvi->length = cpu_to_be16(len);
1045 kvi->crc = csr1212_crc16(kvi->data, len);
1049 return CSR1212_SUCCESS;
1052 int csr1212_read(struct csr1212_csr *csr, u32 offset, void *buffer, u32 len)
1054 struct csr1212_csr_rom_cache *cache;
1056 for (cache = csr->cache_head; cache; cache = cache->next) {
1057 if (offset >= cache->offset &&
1058 (offset + len) <= (cache->offset + cache->size)) {
1060 &cache->data[bytes_to_quads(offset - cache->offset)],
1062 return CSR1212_SUCCESS;
1069 /* Parse a chunk of data as a Config ROM */
1071 static int csr1212_parse_bus_info_block(struct csr1212_csr *csr)
1073 struct csr1212_bus_info_block_img *bi;
1074 struct csr1212_cache_region *cr;
1078 /* IEEE 1212 says that the entire bus info block should be readable in
1079 * a single transaction regardless of the max_rom value.
1080 * Unfortunately, many IEEE 1394 devices do not abide by that, so the
1081 * bus info block will be read 1 quadlet at a time. The rest of the
1082 * ConfigROM will be read according to the max_rom field. */
1083 for (i = 0; i < csr->bus_info_len; i += sizeof(u32)) {
1084 ret = csr->ops->bus_read(csr, CSR1212_CONFIG_ROM_SPACE_BASE + i,
1086 &csr->cache_head->data[bytes_to_quads(i)],
1088 if (ret != CSR1212_SUCCESS)
1091 /* check ROM header's info_length */
1093 be32_to_cpu(csr->cache_head->data[0]) >> 24 !=
1094 bytes_to_quads(csr->bus_info_len) - 1)
1098 bi = (struct csr1212_bus_info_block_img*)csr->cache_head->data;
1099 csr->crc_len = quads_to_bytes(bi->crc_length);
1101 /* IEEE 1212 recommends that crc_len be equal to bus_info_len, but that is not
1102 * always the case, so read the rest of the crc area 1 quadlet at a time. */
1103 for (i = csr->bus_info_len; i <= csr->crc_len; i += sizeof(u32)) {
1104 ret = csr->ops->bus_read(csr, CSR1212_CONFIG_ROM_SPACE_BASE + i,
1106 &csr->cache_head->data[bytes_to_quads(i)],
1108 if (ret != CSR1212_SUCCESS)
1113 /* Apparently there are too many differnt wrong implementations of the
1114 * CRC algorithm that verifying them is moot. */
1115 if ((csr1212_crc16(bi->data, bi->crc_length) != bi->crc) &&
1116 (csr1212_msft_crc16(bi->data, bi->crc_length) != bi->crc))
1120 cr = CSR1212_MALLOC(sizeof(*cr));
1126 cr->offset_start = 0;
1127 cr->offset_end = csr->crc_len + 4;
1129 csr->cache_head->filled_head = cr;
1130 csr->cache_head->filled_tail = cr;
1132 return CSR1212_SUCCESS;
1135 #define CSR1212_KV_KEY(q) (be32_to_cpu(q) >> CSR1212_KV_KEY_SHIFT)
1136 #define CSR1212_KV_KEY_TYPE(q) (CSR1212_KV_KEY(q) >> CSR1212_KV_KEY_TYPE_SHIFT)
1137 #define CSR1212_KV_KEY_ID(q) (CSR1212_KV_KEY(q) & CSR1212_KV_KEY_ID_MASK)
1138 #define CSR1212_KV_VAL_MASK 0xffffff
1139 #define CSR1212_KV_VAL(q) (be32_to_cpu(q) & CSR1212_KV_VAL_MASK)
1141 static int csr1212_parse_dir_entry(struct csr1212_keyval *dir,
1144 int ret = CSR1212_SUCCESS;
1145 struct csr1212_keyval *k = NULL;
1148 switch(CSR1212_KV_KEY_TYPE(ki)) {
1149 case CSR1212_KV_TYPE_IMMEDIATE:
1150 k = csr1212_new_immediate(CSR1212_KV_KEY_ID(ki),
1151 CSR1212_KV_VAL(ki));
1157 k->refcnt = 0; /* Don't keep local reference when parsing. */
1160 case CSR1212_KV_TYPE_CSR_OFFSET:
1161 k = csr1212_new_csr_offset(CSR1212_KV_KEY_ID(ki),
1162 CSR1212_KV_VAL(ki));
1167 k->refcnt = 0; /* Don't keep local reference when parsing. */
1171 /* Compute the offset from 0xffff f000 0000. */
1172 offset = quads_to_bytes(CSR1212_KV_VAL(ki)) + kv_pos;
1173 if (offset == kv_pos) {
1174 /* Uh-oh. Can't have a relative offset of 0 for Leaves
1175 * or Directories. The Config ROM image is most likely
1176 * messed up, so we'll just abort here. */
1181 k = csr1212_find_keyval_offset(dir, offset);
1184 break; /* Found it. */
1186 if (CSR1212_KV_KEY_TYPE(ki) == CSR1212_KV_TYPE_DIRECTORY) {
1187 k = csr1212_new_directory(CSR1212_KV_KEY_ID(ki));
1189 k = csr1212_new_leaf(CSR1212_KV_KEY_ID(ki), NULL, 0);
1195 k->refcnt = 0; /* Don't keep local reference when parsing. */
1196 k->valid = 0; /* Contents not read yet so it's not valid. */
1200 k->next = dir->next;
1201 dir->next->prev = k;
1204 ret = csr1212_attach_keyval_to_directory(dir, k);
1207 if (ret != CSR1212_SUCCESS && k != NULL)
1212 int csr1212_parse_keyval(struct csr1212_keyval *kv,
1213 struct csr1212_csr_rom_cache *cache)
1215 struct csr1212_keyval_img *kvi;
1217 int ret = CSR1212_SUCCESS;
1220 kvi = (struct csr1212_keyval_img*)&cache->data[bytes_to_quads(kv->offset -
1222 kvi_len = be16_to_cpu(kvi->length);
1225 /* Apparently there are too many differnt wrong implementations of the
1226 * CRC algorithm that verifying them is moot. */
1227 if ((csr1212_crc16(kvi->data, kvi_len) != kvi->crc) &&
1228 (csr1212_msft_crc16(kvi->data, kvi_len) != kvi->crc)) {
1234 switch(kv->key.type) {
1235 case CSR1212_KV_TYPE_DIRECTORY:
1236 for (i = 0; i < kvi_len; i++) {
1237 u32 ki = kvi->data[i];
1239 /* Some devices put null entries in their unit
1240 * directories. If we come across such an entry,
1244 ret = csr1212_parse_dir_entry(kv, ki,
1246 quads_to_bytes(i + 1)));
1248 kv->value.directory.len = kvi_len;
1251 case CSR1212_KV_TYPE_LEAF:
1252 if (kv->key.id != CSR1212_KV_ID_EXTENDED_ROM) {
1253 kv->value.leaf.data = CSR1212_MALLOC(quads_to_bytes(kvi_len));
1254 if (!kv->value.leaf.data) {
1259 kv->value.leaf.len = kvi_len;
1260 memcpy(kv->value.leaf.data, kvi->data, quads_to_bytes(kvi_len));
1271 int _csr1212_read_keyval(struct csr1212_csr *csr, struct csr1212_keyval *kv)
1273 struct csr1212_cache_region *cr, *ncr, *newcr = NULL;
1274 struct csr1212_keyval_img *kvi = NULL;
1275 struct csr1212_csr_rom_cache *cache;
1281 if (!csr || !kv || csr->max_rom < 1)
1284 /* First find which cache the data should be in (or go in if not read
1286 for (cache = csr->cache_head; cache; cache = cache->next) {
1287 if (kv->offset >= cache->offset &&
1288 kv->offset < (cache->offset + cache->size))
1295 /* Only create a new cache for Extended ROM leaves. */
1296 if (kv->key.id != CSR1212_KV_ID_EXTENDED_ROM)
1299 if (csr->ops->bus_read(csr,
1300 CSR1212_REGISTER_SPACE_BASE + kv->offset,
1301 sizeof(u32), &q, csr->private)) {
1305 kv->value.leaf.len = be32_to_cpu(q) >> 16;
1307 cache_size = (quads_to_bytes(kv->value.leaf.len + 1) +
1308 (csr->max_rom - 1)) & ~(csr->max_rom - 1);
1310 cache = csr1212_rom_cache_malloc(kv->offset, cache_size);
1314 kv->value.leaf.data = &cache->data[1];
1315 csr->cache_tail->next = cache;
1316 cache->prev = csr->cache_tail;
1318 csr->cache_tail = cache;
1319 cache->filled_head =
1320 CSR1212_MALLOC(sizeof(*cache->filled_head));
1321 if (!cache->filled_head) {
1325 cache->filled_head->offset_start = 0;
1326 cache->filled_head->offset_end = sizeof(u32);
1327 cache->filled_tail = cache->filled_head;
1328 cache->filled_head->next = NULL;
1329 cache->filled_head->prev = NULL;
1332 /* Don't read the entire extended ROM now. Pieces of it will
1333 * be read when entries inside it are read. */
1334 return csr1212_parse_keyval(kv, cache);
1337 cache_index = kv->offset - cache->offset;
1339 /* Now seach read portions of the cache to see if it is there. */
1340 for (cr = cache->filled_head; cr; cr = cr->next) {
1341 if (cache_index < cr->offset_start) {
1342 newcr = CSR1212_MALLOC(sizeof(*newcr));
1346 newcr->offset_start = cache_index & ~(csr->max_rom - 1);
1347 newcr->offset_end = newcr->offset_start;
1349 newcr->prev = cr->prev;
1353 } else if ((cache_index >= cr->offset_start) &&
1354 (cache_index < cr->offset_end)) {
1355 kvi = (struct csr1212_keyval_img*)
1356 (&cache->data[bytes_to_quads(cache_index)]);
1357 kv_len = quads_to_bytes(be16_to_cpu(kvi->length) + 1);
1359 } else if (cache_index == cr->offset_end)
1364 cr = cache->filled_tail;
1365 newcr = CSR1212_MALLOC(sizeof(*newcr));
1369 newcr->offset_start = cache_index & ~(csr->max_rom - 1);
1370 newcr->offset_end = newcr->offset_start;
1372 newcr->next = cr->next;
1375 cache->filled_tail = newcr;
1378 while(!kvi || cr->offset_end < cache_index + kv_len) {
1379 cache_ptr = &cache->data[bytes_to_quads(cr->offset_end &
1380 ~(csr->max_rom - 1))];
1382 addr = (CSR1212_CSR_ARCH_REG_SPACE_BASE + cache->offset +
1383 cr->offset_end) & ~(csr->max_rom - 1);
1385 if (csr->ops->bus_read(csr, addr, csr->max_rom, cache_ptr,
1387 if (csr->max_rom == 4)
1388 /* We've got problems! */
1391 /* Apperently the max_rom value was a lie, set it to
1392 * do quadlet reads and try again. */
1397 cr->offset_end += csr->max_rom - (cr->offset_end &
1398 (csr->max_rom - 1));
1400 if (!kvi && (cr->offset_end > cache_index)) {
1401 kvi = (struct csr1212_keyval_img*)
1402 (&cache->data[bytes_to_quads(cache_index)]);
1403 kv_len = quads_to_bytes(be16_to_cpu(kvi->length) + 1);
1406 if ((kv_len + (kv->offset - cache->offset)) > cache->size) {
1407 /* The Leaf or Directory claims its length extends
1408 * beyond the ConfigROM image region and thus beyond the
1409 * end of our cache region. Therefore, we abort now
1410 * rather than seg faulting later. */
1416 if (ncr && (cr->offset_end >= ncr->offset_start)) {
1417 /* consolidate region entries */
1418 ncr->offset_start = cr->offset_start;
1421 cr->prev->next = cr->next;
1422 ncr->prev = cr->prev;
1423 if (cache->filled_head == cr)
1424 cache->filled_head = ncr;
1430 return csr1212_parse_keyval(kv, cache);
1433 int csr1212_parse_csr(struct csr1212_csr *csr)
1435 static const int mr_map[] = { 4, 64, 1024, 0 };
1436 struct csr1212_dentry *dentry;
1439 if (!csr || !csr->ops || !csr->ops->bus_read)
1442 ret = csr1212_parse_bus_info_block(csr);
1443 if (ret != CSR1212_SUCCESS)
1446 if (!csr->ops->get_max_rom)
1447 csr->max_rom = mr_map[0]; /* default value */
1449 int i = csr->ops->get_max_rom(csr->bus_info_data,
1453 csr->max_rom = mr_map[i];
1456 csr->cache_head->layout_head = csr->root_kv;
1457 csr->cache_head->layout_tail = csr->root_kv;
1459 csr->root_kv->offset = (CSR1212_CONFIG_ROM_SPACE_BASE & 0xffff) +
1462 csr->root_kv->valid = 0;
1463 csr->root_kv->next = csr->root_kv;
1464 csr->root_kv->prev = csr->root_kv;
1465 ret = _csr1212_read_keyval(csr, csr->root_kv);
1466 if (ret != CSR1212_SUCCESS)
1469 /* Scan through the Root directory finding all extended ROM regions
1470 * and make cache regions for them */
1471 for (dentry = csr->root_kv->value.directory.dentries_head;
1472 dentry; dentry = dentry->next) {
1473 if (dentry->kv->key.id == CSR1212_KV_ID_EXTENDED_ROM &&
1474 !dentry->kv->valid) {
1475 ret = _csr1212_read_keyval(csr, dentry->kv);
1476 if (ret != CSR1212_SUCCESS)
1481 return CSR1212_SUCCESS;