/* * dev_a, dev_b : device that share a link * link_a, link_b : link output on device a/b (0,1,2) */ #if 1 int print_width(uint8_t width) { switch (max_width) { case 0: print_debug("8bit"); break; case 1: print_debug("16bit"); break; case 3: print_debug("32bit"); break; case 4: print_debug("2bit"); break; case 5: print_debug("4bit"); break; case 7: print_debug("physically not connected"); break; default: print_debug("unknown"); } } #endif void setup_cht_linkwidth(device_t dev_a, device_t dev_b, uint8_t link_a, uint8_t link_b) { uint8_t in_width, out_width, reg_a, reg_b; uint32_t tmp; reg_a = (0x20*link_a)+0x84; reg_b = (0x20*link_b)+0x84; /* get maximum link width in/out */ in_width = ((pci_read_config32(dev_a, reg_a) >> 16) & 0x07) & \ ((pci_read_config32(dev_b, reg_b) >> 20) & 0x07); /* get maximum link width out/in */ out_width = ((pci_read_config32(dev_a, reg_a) >> 20) & 0x07) & \ ((pci_read_config32(dev_b, reg_b) >> 16) & 0x07); #if 1 print_debug("link width ( a->b / b->a ) : "); print_width(in_width); print_debug("/"); print_width(out_width); print_debug("\r\n"); #endif /* write link width on device a */ tmp = pci_read_config32(dev_a, reg_a); tmp &= ~( (7<<24) | (7<<28) ); tmp |= ( (in_width<<24)|(out_width<<28) ); pci_write_config32(dev_a, reg_a, tmp); /* write link width on device b */ tmp = pci_read_config32(dev_b, reg_b); tmp &= ~( (7<<24) | (7<<28) ); tmp |= ( (out_width<<24)|(in_width<<28) ); pci_write_config32(dev_b, reg_b, tmp); }